From 2dafdcabefa076c33e4a74d508b10170fc535c76 Mon Sep 17 00:00:00 2001 From: Sergio Maria Matone Date: Fri, 27 Sep 2024 14:51:50 +0200 Subject: [PATCH 01/10] export script --- portal-loop/export.sh | 63 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100755 portal-loop/export.sh diff --git a/portal-loop/export.sh b/portal-loop/export.sh new file mode 100755 index 00000000..f077e27e --- /dev/null +++ b/portal-loop/export.sh @@ -0,0 +1,63 @@ +#!/bin/bash + +# Define the constants +TMP_DIR=temp-gno +TIMESTAMP=$(date +%s) +POTENTIAL_BACKUP_NAME=backup.portal.loop.${TIMESTAMP}.jsonl +GENESIS_NAME=genesis.json + +# Create the temporary working dir +mkdir $TMP_DIR +cd $TMP_DIR + +output_diff=diff.jsonl +backup_name=backup.tmp.jsonl + +# Grab the latest genesis.json +wget -O $GENESIS_NAME https://rpc.gno.land/genesis + +# Install the gnoland binary +git clone https://github.com/gnolang/gno.git +cd gno/gno.land +make build.gnoland +cd ../.. + +jq ".result.genesis" $GENESIS_NAME > temp_$GENESIS_NAME +./gno/gno.land/build/gnoland genesis txs export -genesis-path temp_$GENESIS_NAME $backup_name + +rm temp_$GENESIS_NAME $GENESIS_NAME + +# Find the latest backup file based on the Unix timestamp in the filename +latest_backup_file=$(ls ../backup.*.jsonl 2>/dev/null | sort -t'-' -k2,2n | tail -n 1) + +# Check if a file was found +if [[ -z "$latest_backup_file" ]]; then + # just save file + echo "Saving first time" + cp $backup_name ../$POTENTIAL_BACKUP_NAME + exit 0 +else + echo "Latest backup file: $latest_backup_file" + sort $latest_backup_file > ./latest.jsonl + sort $backup_name > temp_$backup_name + + rm $backup_name + + # Use comm to find lines only in file2 (additions) and write to output file + comm -13 ./latest.jsonl temp_$backup_name > $output_diff + + # Cleanup temporary sorted files + # rm sorted_file1.jsonl sorted_file2.jsonl +fi + +# Notify if differences were found +if [[ -z $(grep '[^[:space:]]' $output_diff) ]]; then + echo "No differences found." +else + echo "Differences found." + cp $output_diff ../$POTENTIAL_BACKUP_NAME +fi + +cd .. + +rm -rf $TMP_DIR From b05a631f9357337bcff82635fc7261d9267694a6 Mon Sep 17 00:00:00 2001 From: Sergio Maria Matone Date: Fri, 27 Sep 2024 18:17:47 +0200 Subject: [PATCH 02/10] portal loop workload draft --- .../workflows/portal-loop-txs-exporter.yml | 44 + portal-loop/Makefile | 6 + portal-loop/README.md | 19 + .../backup.portal.loop.1727441951.jsonl | 5542 +++++++++++++++++ portal-loop/export.sh | 2 + 5 files changed, 5613 insertions(+) create mode 100644 .github/workflows/portal-loop-txs-exporter.yml create mode 100644 portal-loop/Makefile create mode 100644 portal-loop/README.md create mode 100755 portal-loop/backup.portal.loop.1727441951.jsonl diff --git a/.github/workflows/portal-loop-txs-exporter.yml b/.github/workflows/portal-loop-txs-exporter.yml new file mode 100644 index 00000000..c4bc7e57 --- /dev/null +++ b/.github/workflows/portal-loop-txs-exporter.yml @@ -0,0 +1,44 @@ +name: Backup PortalLoop + +on: + # allow to run workflow manually + workflow_dispatch: {} + + # Triggers the workflow every day at 1am + schedule: + - cron: "0 * * * *" + +jobs: + backup: + name: "backup ${{ matrix.testnet }}" + runs-on: ubuntu-latest + timeout-minutes: 360 # very high; but it can take a while. + + permissions: + contents: write + + strategy: + fail-fast: false + max-parallel: 1 + matrix: + testnet: + - portal-loop + + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-go@v5 + with: + go-version: "^1.22.4" + + - name: Run backup script + run: bash portal-loop/export.sh + + - name: Run stats script + run: make -C ${{ matrix.testnet }} stats + + - name: Run extractor + run: make -C ${{ matrix.testnet }} extractor + + - uses: stefanzweifel/git-auto-commit-action@v5 + with: + commit_message: "chore: update ${{ matrix.testnet }} backup" diff --git a/portal-loop/Makefile b/portal-loop/Makefile new file mode 100644 index 00000000..22a8e14c --- /dev/null +++ b/portal-loop/Makefile @@ -0,0 +1,6 @@ +EXTRACTOR_DIR = extractor-0.1.1 +REMOTE = "https://rpc.gno.land" +SHORTNAME = portal-loop +LOOP_DURATION = 50000 + +-include ../rules.mk diff --git a/portal-loop/README.md b/portal-loop/README.md new file mode 100644 index 00000000..1cc5488a --- /dev/null +++ b/portal-loop/README.md @@ -0,0 +1,19 @@ +# https://rpc.gno.land + +## TXs +``` + 0 +``` + +## addpkgs +``` +``` + +## top realm calls +``` +``` + +## top faucet requesters +``` +``` + diff --git a/portal-loop/backup.portal.loop.1727441951.jsonl b/portal-loop/backup.portal.loop.1727441951.jsonl new file mode 100755 index 00000000..1b3bc76e --- /dev/null +++ b/portal-loop/backup.portal.loop.1727441951.jsonl @@ -0,0 +1,5542 @@ +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"bank","path":"gno.land/p/demo/bank","files":[{"name":"types.gno","body":"// TODO: this is an example, and needs to be fixed up and tested.\n\npackage bank\n\n// NOTE: unexposed struct for security.\ntype order struct {\n\tfrom Address\n\tto Address\n\tamount Coins\n\tprocessed bool\n}\n\n// NOTE: unexposed methods for security.\nfunc (ch *order) string() string {\n\treturn \"TODO\"\n}\n\n// Wraps the internal *order for external use.\ntype Order struct {\n\t*order\n}\n\n// XXX only exposed for demonstration. TODO unexpose, make full demo.\nfunc NewOrder(from Address, to Address, amount Coins) Order {\n\treturn Order{\n\t\torder: \u0026order{\n\t\t\tfrom: from,\n\t\t\tto: to,\n\t\t\tamount: amount,\n\t\t},\n\t}\n}\n\n// Panics if error, or already processed.\nfunc (o Order) Execute() {\n\tif o.order.processed {\n\t\tpanic(\"order already processed\")\n\t}\n\to.order.processed = true\n\t// TODO implemement.\n}\n\nfunc (o Order) IsZero() bool {\n\treturn o.order == nil\n}\n\nfunc (o Order) From() Address {\n\treturn o.order.from\n}\n\nfunc (o Order) To() Address {\n\treturn o.order.to\n}\n\nfunc (o Order) Amount() Coins {\n\treturn o.order.amount\n}\n\nfunc (o Order) Processed() bool {\n\treturn o.order.processed\n}\n\n//----------------------------------------\n// Escrow\n\ntype EscrowTerms struct {\n\tPartyA Address\n\tPartyB Address\n\tAmountA Coins\n\tAmountB Coins\n}\n\ntype EscrowContract struct {\n\tEscrowTerms\n\tOrderA Order\n\tOrderB Order\n}\n\nfunc CreateEscrow(terms EscrowTerms) *EscrowContract {\n\treturn \u0026EscrowContract{\n\t\tEscrowTerms: terms,\n\t}\n}\n\nfunc (esc *EscrowContract) SetOrderA(order Order) {\n\tif !esc.OrderA.IsZero() {\n\t\tpanic(\"order-a already set\")\n\t}\n\tif esc.EscrowTerms.PartyA != order.From() {\n\t\tpanic(\"invalid order-a:from mismatch\")\n\t}\n\tif esc.EscrowTerms.PartyB != order.To() {\n\t\tpanic(\"invalid order-a:to mismatch\")\n\t}\n\tif !esc.EscrowTerms.AmountA.Equal(order.Amount()) {\n\t\tpanic(\"invalid order-a amount\")\n\t}\n\tesc.OrderA = order\n}\n\nfunc (esc *EscrowContract) SetOrderB(order Order) {\n\tif !esc.OrderB.IsZero() {\n\t\tpanic(\"order-b already set\")\n\t}\n\tif esc.EscrowTerms.PartyB != order.From() {\n\t\tpanic(\"invalid order-b:from mismatch\")\n\t}\n\tif esc.EscrowTerms.PartyA != order.To() {\n\t\tpanic(\"invalid order-b:to mismatch\")\n\t}\n\tif !esc.EscrowTerms.AmountB.Equal(order.Amount()) {\n\t\tpanic(\"invalid order-b amount\")\n\t}\n\tesc.OrderA = order\n}\n\nfunc (esc *EscrowContract) Execute() {\n\tif esc.OrderA.IsZero() {\n\t\tpanic(\"order-a not yet set\")\n\t}\n\tif esc.OrderB.IsZero() {\n\t\tpanic(\"order-b not yet set\")\n\t}\n\t// NOTE: succeeds atomically.\n\tesc.OrderA.Execute()\n\tesc.OrderB.Execute()\n}\n\n//----------------------------------------\n// TODO: actually implement these in std package.\n\ntype (\n\tAddress string\n\tCoins []Coin\n\tCoin struct {\n\t\tDenom bool\n\t\tAmount int64\n\t}\n)\n\nfunc (a Coins) Equal(b Coins) bool {\n\tif len(a) != len(b) {\n\t\treturn false\n\t}\n\tfor i, v := range a {\n\t\tif v != b[i] {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"avl","path":"gno.land/p/demo/avl","files":[{"name":"node.gno","body":"package avl\n\n//----------------------------------------\n// Node\n\n// Node represents a node in an AVL tree.\ntype Node struct {\n\tkey string // key is the unique identifier for the node.\n\tvalue interface{} // value is the data stored in the node.\n\theight int8 // height is the height of the node in the tree.\n\tsize int // size is the number of nodes in the subtree rooted at this node.\n\tleftNode *Node // leftNode is the left child of the node.\n\trightNode *Node // rightNode is the right child of the node.\n}\n\n// NewNode creates a new node with the given key and value.\nfunc NewNode(key string, value interface{}) *Node {\n\treturn \u0026Node{\n\t\tkey: key,\n\t\tvalue: value,\n\t\theight: 0,\n\t\tsize: 1,\n\t}\n}\n\n// Size returns the size of the subtree rooted at the node.\nfunc (node *Node) Size() int {\n\tif node == nil {\n\t\treturn 0\n\t}\n\treturn node.size\n}\n\n// IsLeaf checks if the node is a leaf node (has no children).\nfunc (node *Node) IsLeaf() bool {\n\treturn node.height == 0\n}\n\n// Key returns the key of the node.\nfunc (node *Node) Key() string {\n\treturn node.key\n}\n\n// Value returns the value of the node.\nfunc (node *Node) Value() interface{} {\n\treturn node.value\n}\n\n// _copy creates a copy of the node (excluding value).\nfunc (node *Node) _copy() *Node {\n\tif node.height == 0 {\n\t\tpanic(\"Why are you copying a value node?\")\n\t}\n\treturn \u0026Node{\n\t\tkey: node.key,\n\t\theight: node.height,\n\t\tsize: node.size,\n\t\tleftNode: node.leftNode,\n\t\trightNode: node.rightNode,\n\t}\n}\n\n// Has checks if a node with the given key exists in the subtree rooted at the node.\nfunc (node *Node) Has(key string) (has bool) {\n\tif node == nil {\n\t\treturn false\n\t}\n\tif node.key == key {\n\t\treturn true\n\t}\n\tif node.height == 0 {\n\t\treturn false\n\t}\n\tif key \u003c node.key {\n\t\treturn node.getLeftNode().Has(key)\n\t}\n\treturn node.getRightNode().Has(key)\n}\n\n// Get searches for a node with the given key in the subtree rooted at the node\n// and returns its index, value, and whether it exists.\nfunc (node *Node) Get(key string) (index int, value interface{}, exists bool) {\n\tif node == nil {\n\t\treturn 0, nil, false\n\t}\n\n\tif node.height == 0 {\n\t\tif node.key == key {\n\t\t\treturn 0, node.value, true\n\t\t}\n\t\tif node.key \u003c key {\n\t\t\treturn 1, nil, false\n\t\t}\n\t\treturn 0, nil, false\n\t}\n\n\tif key \u003c node.key {\n\t\treturn node.getLeftNode().Get(key)\n\t}\n\n\trightNode := node.getRightNode()\n\tindex, value, exists = rightNode.Get(key)\n\tindex += node.size - rightNode.size\n\treturn index, value, exists\n}\n\n// GetByIndex retrieves the key-value pair of the node at the given index\n// in the subtree rooted at the node.\nfunc (node *Node) GetByIndex(index int) (key string, value interface{}) {\n\tif node.height == 0 {\n\t\tif index == 0 {\n\t\t\treturn node.key, node.value\n\t\t}\n\t\tpanic(\"GetByIndex asked for invalid index\")\n\t}\n\t// TODO: could improve this by storing the sizes\n\tleftNode := node.getLeftNode()\n\tif index \u003c leftNode.size {\n\t\treturn leftNode.GetByIndex(index)\n\t}\n\treturn node.getRightNode().GetByIndex(index - leftNode.size)\n}\n\n// Set inserts a new node with the given key-value pair into the subtree rooted at the node,\n// and returns the new root of the subtree and whether an existing node was updated.\n//\n// XXX consider a better way to do this... perhaps split Node from Node.\nfunc (node *Node) Set(key string, value interface{}) (newSelf *Node, updated bool) {\n\tif node == nil {\n\t\treturn NewNode(key, value), false\n\t}\n\n\tif node.height == 0 {\n\t\treturn node.setLeaf(key, value)\n\t}\n\n\tnode = node._copy()\n\tif key \u003c node.key {\n\t\tnode.leftNode, updated = node.getLeftNode().Set(key, value)\n\t} else {\n\t\tnode.rightNode, updated = node.getRightNode().Set(key, value)\n\t}\n\n\tif updated {\n\t\treturn node, updated\n\t}\n\n\tnode.calcHeightAndSize()\n\treturn node.balance(), updated\n}\n\n// setLeaf inserts a new leaf node with the given key-value pair into the subtree rooted at the node,\n// and returns the new root of the subtree and whether an existing node was updated.\nfunc (node *Node) setLeaf(key string, value interface{}) (newSelf *Node, updated bool) {\n\tif key == node.key {\n\t\treturn NewNode(key, value), true\n\t}\n\n\tif key \u003c node.key {\n\t\treturn \u0026Node{\n\t\t\tkey: node.key,\n\t\t\theight: 1,\n\t\t\tsize: 2,\n\t\t\tleftNode: NewNode(key, value),\n\t\t\trightNode: node,\n\t\t}, false\n\t}\n\n\treturn \u0026Node{\n\t\tkey: key,\n\t\theight: 1,\n\t\tsize: 2,\n\t\tleftNode: node,\n\t\trightNode: NewNode(key, value),\n\t}, false\n}\n\n// Remove deletes the node with the given key from the subtree rooted at the node.\n// returns the new root of the subtree, the new leftmost leaf key (if changed),\n// the removed value and the removal was successful.\nfunc (node *Node) Remove(key string) (\n\tnewNode *Node, newKey string, value interface{}, removed bool,\n) {\n\tif node == nil {\n\t\treturn nil, \"\", nil, false\n\t}\n\tif node.height == 0 {\n\t\tif key == node.key {\n\t\t\treturn nil, \"\", node.value, true\n\t\t}\n\t\treturn node, \"\", nil, false\n\t}\n\tif key \u003c node.key {\n\t\tvar newLeftNode *Node\n\t\tnewLeftNode, newKey, value, removed = node.getLeftNode().Remove(key)\n\t\tif !removed {\n\t\t\treturn node, \"\", value, false\n\t\t}\n\t\tif newLeftNode == nil { // left node held value, was removed\n\t\t\treturn node.rightNode, node.key, value, true\n\t\t}\n\t\tnode = node._copy()\n\t\tnode.leftNode = newLeftNode\n\t\tnode.calcHeightAndSize()\n\t\tnode = node.balance()\n\t\treturn node, newKey, value, true\n\t}\n\n\tvar newRightNode *Node\n\tnewRightNode, newKey, value, removed = node.getRightNode().Remove(key)\n\tif !removed {\n\t\treturn node, \"\", value, false\n\t}\n\tif newRightNode == nil { // right node held value, was removed\n\t\treturn node.leftNode, \"\", value, true\n\t}\n\tnode = node._copy()\n\tnode.rightNode = newRightNode\n\tif newKey != \"\" {\n\t\tnode.key = newKey\n\t}\n\tnode.calcHeightAndSize()\n\tnode = node.balance()\n\treturn node, \"\", value, true\n}\n\n// getLeftNode returns the left child of the node.\nfunc (node *Node) getLeftNode() *Node {\n\treturn node.leftNode\n}\n\n// getRightNode returns the right child of the node.\nfunc (node *Node) getRightNode() *Node {\n\treturn node.rightNode\n}\n\n// rotateRight performs a right rotation on the node and returns the new root.\n// NOTE: overwrites node\n// TODO: optimize balance \u0026 rotate\nfunc (node *Node) rotateRight() *Node {\n\tnode = node._copy()\n\tl := node.getLeftNode()\n\t_l := l._copy()\n\n\t_lrCached := _l.rightNode\n\t_l.rightNode = node\n\tnode.leftNode = _lrCached\n\n\tnode.calcHeightAndSize()\n\t_l.calcHeightAndSize()\n\n\treturn _l\n}\n\n// rotateLeft performs a left rotation on the node and returns the new root.\n// NOTE: overwrites node\n// TODO: optimize balance \u0026 rotate\nfunc (node *Node) rotateLeft() *Node {\n\tnode = node._copy()\n\tr := node.getRightNode()\n\t_r := r._copy()\n\n\t_rlCached := _r.leftNode\n\t_r.leftNode = node\n\tnode.rightNode = _rlCached\n\n\tnode.calcHeightAndSize()\n\t_r.calcHeightAndSize()\n\n\treturn _r\n}\n\n// calcHeightAndSize updates the height and size of the node based on its children.\n// NOTE: mutates height and size\nfunc (node *Node) calcHeightAndSize() {\n\tnode.height = maxInt8(node.getLeftNode().height, node.getRightNode().height) + 1\n\tnode.size = node.getLeftNode().size + node.getRightNode().size\n}\n\n// calcBalance calculates the balance factor of the node.\nfunc (node *Node) calcBalance() int {\n\treturn int(node.getLeftNode().height) - int(node.getRightNode().height)\n}\n\n// balance balances the subtree rooted at the node and returns the new root.\n// NOTE: assumes that node can be modified\n// TODO: optimize balance \u0026 rotate\nfunc (node *Node) balance() (newSelf *Node) {\n\tbalance := node.calcBalance()\n\tif balance \u003e= -1 {\n\t\treturn node\n\t}\n\tif balance \u003e 1 {\n\t\tif node.getLeftNode().calcBalance() \u003e= 0 {\n\t\t\t// Left Left Case\n\t\t\treturn node.rotateRight()\n\t\t}\n\t\t// Left Right Case\n\t\tleft := node.getLeftNode()\n\t\tnode.leftNode = left.rotateLeft()\n\t\treturn node.rotateRight()\n\t}\n\n\tif node.getRightNode().calcBalance() \u003c= 0 {\n\t\t// Right Right Case\n\t\treturn node.rotateLeft()\n\t}\n\n\t// Right Left Case\n\tright := node.getRightNode()\n\tnode.rightNode = right.rotateRight()\n\treturn node.rotateLeft()\n}\n\n// Shortcut for TraverseInRange.\nfunc (node *Node) Iterate(start, end string, cb func(*Node) bool) bool {\n\treturn node.TraverseInRange(start, end, true, true, cb)\n}\n\n// Shortcut for TraverseInRange.\nfunc (node *Node) ReverseIterate(start, end string, cb func(*Node) bool) bool {\n\treturn node.TraverseInRange(start, end, false, true, cb)\n}\n\n// TraverseInRange traverses all nodes, including inner nodes.\n// Start is inclusive and end is exclusive when ascending,\n// Start and end are inclusive when descending.\n// Empty start and empty end denote no start and no end.\n// If leavesOnly is true, only visit leaf nodes.\n// NOTE: To simulate an exclusive reverse traversal,\n// just append 0x00 to start.\nfunc (node *Node) TraverseInRange(start, end string, ascending bool, leavesOnly bool, cb func(*Node) bool) bool {\n\tif node == nil {\n\t\treturn false\n\t}\n\tafterStart := (start == \"\" || start \u003c node.key)\n\tstartOrAfter := (start == \"\" || start \u003c= node.key)\n\tbeforeEnd := false\n\tif ascending {\n\t\tbeforeEnd = (end == \"\" || node.key \u003c end)\n\t} else {\n\t\tbeforeEnd = (end == \"\" || node.key \u003c= end)\n\t}\n\n\t// Run callback per inner/leaf node.\n\tstop := false\n\tif (!node.IsLeaf() \u0026\u0026 !leavesOnly) ||\n\t\t(node.IsLeaf() \u0026\u0026 startOrAfter \u0026\u0026 beforeEnd) {\n\t\tstop = cb(node)\n\t\tif stop {\n\t\t\treturn stop\n\t\t}\n\t}\n\tif node.IsLeaf() {\n\t\treturn stop\n\t}\n\n\tif ascending {\n\t\t// check lower nodes, then higher\n\t\tif afterStart {\n\t\t\tstop = node.getLeftNode().TraverseInRange(start, end, ascending, leavesOnly, cb)\n\t\t}\n\t\tif stop {\n\t\t\treturn stop\n\t\t}\n\t\tif beforeEnd {\n\t\t\tstop = node.getRightNode().TraverseInRange(start, end, ascending, leavesOnly, cb)\n\t\t}\n\t} else {\n\t\t// check the higher nodes first\n\t\tif beforeEnd {\n\t\t\tstop = node.getRightNode().TraverseInRange(start, end, ascending, leavesOnly, cb)\n\t\t}\n\t\tif stop {\n\t\t\treturn stop\n\t\t}\n\t\tif afterStart {\n\t\t\tstop = node.getLeftNode().TraverseInRange(start, end, ascending, leavesOnly, cb)\n\t\t}\n\t}\n\n\treturn stop\n}\n\n// TraverseByOffset traverses all nodes, including inner nodes.\n// A limit of math.MaxInt means no limit.\nfunc (node *Node) TraverseByOffset(offset, limit int, descending bool, leavesOnly bool, cb func(*Node) bool) bool {\n\tif node == nil {\n\t\treturn false\n\t}\n\n\t// fast paths. these happen only if TraverseByOffset is called directly on a leaf.\n\tif limit \u003c= 0 || offset \u003e= node.size {\n\t\treturn false\n\t}\n\tif node.IsLeaf() {\n\t\tif offset \u003e 0 {\n\t\t\treturn false\n\t\t}\n\t\treturn cb(node)\n\t}\n\n\t// go to the actual recursive function.\n\treturn node.traverseByOffset(offset, limit, descending, leavesOnly, cb)\n}\n\n// TraverseByOffset traverses the subtree rooted at the node by offset and limit,\n// in either ascending or descending order, and applies the callback function to each traversed node.\n// If leavesOnly is true, only leaf nodes are visited.\nfunc (node *Node) traverseByOffset(offset, limit int, descending bool, leavesOnly bool, cb func(*Node) bool) bool {\n\t// caller guarantees: offset \u003c node.size; limit \u003e 0.\n\tif !leavesOnly {\n\t\tif cb(node) {\n\t\t\treturn true\n\t\t}\n\t}\n\tfirst, second := node.getLeftNode(), node.getRightNode()\n\tif descending {\n\t\tfirst, second = second, first\n\t}\n\tif first.IsLeaf() {\n\t\t// either run or skip, based on offset\n\t\tif offset \u003e 0 {\n\t\t\toffset--\n\t\t} else {\n\t\t\tcb(first)\n\t\t\tlimit--\n\t\t\tif limit \u003c= 0 {\n\t\t\t\treturn false\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// possible cases:\n\t\t// 1 the offset given skips the first node entirely\n\t\t// 2 the offset skips none or part of the first node, but the limit requires some of the second node.\n\t\t// 3 the offset skips none or part of the first node, and the limit stops our search on the first node.\n\t\tif offset \u003e= first.size {\n\t\t\toffset -= first.size // 1\n\t\t} else {\n\t\t\tif first.traverseByOffset(offset, limit, descending, leavesOnly, cb) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t\t// number of leaves which could actually be called from inside\n\t\t\tdelta := first.size - offset\n\t\t\toffset = 0\n\t\t\tif delta \u003e= limit {\n\t\t\t\treturn true // 3\n\t\t\t}\n\t\t\tlimit -= delta // 2\n\t\t}\n\t}\n\n\t// because of the caller guarantees and the way we handle the first node,\n\t// at this point we know that limit \u003e 0 and there must be some values in\n\t// this second node that we include.\n\n\t// =\u003e if the second node is a leaf, it has to be included.\n\tif second.IsLeaf() {\n\t\treturn cb(second)\n\t}\n\t// =\u003e if it is not a leaf, it will still be enough to recursively call this\n\t// function with the updated offset and limit\n\treturn second.traverseByOffset(offset, limit, descending, leavesOnly, cb)\n}\n\n// Only used in testing...\nfunc (node *Node) lmd() *Node {\n\tif node.height == 0 {\n\t\treturn node\n\t}\n\treturn node.getLeftNode().lmd()\n}\n\n// Only used in testing...\nfunc (node *Node) rmd() *Node {\n\tif node.height == 0 {\n\t\treturn node\n\t}\n\treturn node.getRightNode().rmd()\n}\n\nfunc maxInt8(a, b int8) int8 {\n\tif a \u003e b {\n\t\treturn a\n\t}\n\treturn b\n}\n"},{"name":"node_test.gno","body":"package avl\n\nimport (\n\t\"sort\"\n\t\"strings\"\n\t\"testing\"\n)\n\nfunc TestTraverseByOffset(t *testing.T) {\n\tconst testStrings = `Alfa\nAlfred\nAlpha\nAlphabet\nBeta\nBeth\nBook\nBrowser`\n\ttt := []struct {\n\t\tname string\n\t\tdesc bool\n\t}{\n\t\t{\"ascending\", false},\n\t\t{\"descending\", true},\n\t}\n\n\tfor _, tt := range tt {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tsl := strings.Split(testStrings, \"\\n\")\n\n\t\t\t// sort a first time in the order opposite to how we'll be traversing\n\t\t\t// the tree, to ensure that we are not just iterating through with\n\t\t\t// insertion order.\n\t\t\tsort.Strings(sl)\n\t\t\tif !tt.desc {\n\t\t\t\treverseSlice(sl)\n\t\t\t}\n\n\t\t\tr := NewNode(sl[0], nil)\n\t\t\tfor _, v := range sl[1:] {\n\t\t\t\tr, _ = r.Set(v, nil)\n\t\t\t}\n\n\t\t\t// then sort sl in the order we'll be traversing it, so that we can\n\t\t\t// compare the result with sl.\n\t\t\treverseSlice(sl)\n\n\t\t\tvar result []string\n\t\t\tfor i := 0; i \u003c len(sl); i++ {\n\t\t\t\tr.TraverseByOffset(i, 1, tt.desc, true, func(n *Node) bool {\n\t\t\t\t\tresult = append(result, n.Key())\n\t\t\t\t\treturn false\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tif !slicesEqual(sl, result) {\n\t\t\t\tt.Errorf(\"want %v got %v\", sl, result)\n\t\t\t}\n\n\t\t\tfor l := 2; l \u003c= len(sl); l++ {\n\t\t\t\t// \"slices\"\n\t\t\t\tfor i := 0; i \u003c= len(sl); i++ {\n\t\t\t\t\tmax := i + l\n\t\t\t\t\tif max \u003e len(sl) {\n\t\t\t\t\t\tmax = len(sl)\n\t\t\t\t\t}\n\t\t\t\t\texp := sl[i:max]\n\t\t\t\t\tactual := []string{}\n\n\t\t\t\t\tr.TraverseByOffset(i, l, tt.desc, true, func(tr *Node) bool {\n\t\t\t\t\t\tactual = append(actual, tr.Key())\n\t\t\t\t\t\treturn false\n\t\t\t\t\t})\n\t\t\t\t\tif !slicesEqual(exp, actual) {\n\t\t\t\t\t\tt.Errorf(\"want %v got %v\", exp, actual)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestHas(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tinput []string\n\t\thasKey string\n\t\texpected bool\n\t}{\n\t\t{\n\t\t\t\"has key in non-empty tree\",\n\t\t\t[]string{\"C\", \"A\", \"B\", \"E\", \"D\"},\n\t\t\t\"B\",\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t\"does not have key in non-empty tree\",\n\t\t\t[]string{\"C\", \"A\", \"B\", \"E\", \"D\"},\n\t\t\t\"F\",\n\t\t\tfalse,\n\t\t},\n\t\t{\n\t\t\t\"has key in single-node tree\",\n\t\t\t[]string{\"A\"},\n\t\t\t\"A\",\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t\"does not have key in single-node tree\",\n\t\t\t[]string{\"A\"},\n\t\t\t\"B\",\n\t\t\tfalse,\n\t\t},\n\t\t{\n\t\t\t\"does not have key in empty tree\",\n\t\t\t[]string{},\n\t\t\t\"A\",\n\t\t\tfalse,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tvar tree *Node\n\t\t\tfor _, key := range tt.input {\n\t\t\t\ttree, _ = tree.Set(key, nil)\n\t\t\t}\n\n\t\t\tresult := tree.Has(tt.hasKey)\n\n\t\t\tif result != tt.expected {\n\t\t\t\tt.Errorf(\"Expected %v, got %v\", tt.expected, result)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestGet(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tinput []string\n\t\tgetKey string\n\t\texpectIdx int\n\t\texpectVal interface{}\n\t\texpectExists bool\n\t}{\n\t\t{\n\t\t\t\"get existing key\",\n\t\t\t[]string{\"C\", \"A\", \"B\", \"E\", \"D\"},\n\t\t\t\"B\",\n\t\t\t1,\n\t\t\tnil,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t\"get non-existent key (smaller)\",\n\t\t\t[]string{\"C\", \"A\", \"B\", \"E\", \"D\"},\n\t\t\t\"@\",\n\t\t\t0,\n\t\t\tnil,\n\t\t\tfalse,\n\t\t},\n\t\t{\n\t\t\t\"get non-existent key (larger)\",\n\t\t\t[]string{\"C\", \"A\", \"B\", \"E\", \"D\"},\n\t\t\t\"F\",\n\t\t\t5,\n\t\t\tnil,\n\t\t\tfalse,\n\t\t},\n\t\t{\n\t\t\t\"get from empty tree\",\n\t\t\t[]string{},\n\t\t\t\"A\",\n\t\t\t0,\n\t\t\tnil,\n\t\t\tfalse,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tvar tree *Node\n\t\t\tfor _, key := range tt.input {\n\t\t\t\ttree, _ = tree.Set(key, nil)\n\t\t\t}\n\n\t\t\tidx, val, exists := tree.Get(tt.getKey)\n\n\t\t\tif idx != tt.expectIdx {\n\t\t\t\tt.Errorf(\"Expected index %d, got %d\", tt.expectIdx, idx)\n\t\t\t}\n\n\t\t\tif val != tt.expectVal {\n\t\t\t\tt.Errorf(\"Expected value %v, got %v\", tt.expectVal, val)\n\t\t\t}\n\n\t\t\tif exists != tt.expectExists {\n\t\t\t\tt.Errorf(\"Expected exists %t, got %t\", tt.expectExists, exists)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestGetByIndex(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tinput []string\n\t\tidx int\n\t\texpectKey string\n\t\texpectVal interface{}\n\t\texpectPanic bool\n\t}{\n\t\t{\n\t\t\t\"get by valid index\",\n\t\t\t[]string{\"C\", \"A\", \"B\", \"E\", \"D\"},\n\t\t\t2,\n\t\t\t\"C\",\n\t\t\tnil,\n\t\t\tfalse,\n\t\t},\n\t\t{\n\t\t\t\"get by valid index (smallest)\",\n\t\t\t[]string{\"C\", \"A\", \"B\", \"E\", \"D\"},\n\t\t\t0,\n\t\t\t\"A\",\n\t\t\tnil,\n\t\t\tfalse,\n\t\t},\n\t\t{\n\t\t\t\"get by valid index (largest)\",\n\t\t\t[]string{\"C\", \"A\", \"B\", \"E\", \"D\"},\n\t\t\t4,\n\t\t\t\"E\",\n\t\t\tnil,\n\t\t\tfalse,\n\t\t},\n\t\t{\n\t\t\t\"get by invalid index (negative)\",\n\t\t\t[]string{\"C\", \"A\", \"B\", \"E\", \"D\"},\n\t\t\t-1,\n\t\t\t\"\",\n\t\t\tnil,\n\t\t\ttrue,\n\t\t},\n\t\t{\n\t\t\t\"get by invalid index (out of range)\",\n\t\t\t[]string{\"C\", \"A\", \"B\", \"E\", \"D\"},\n\t\t\t5,\n\t\t\t\"\",\n\t\t\tnil,\n\t\t\ttrue,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tvar tree *Node\n\t\t\tfor _, key := range tt.input {\n\t\t\t\ttree, _ = tree.Set(key, nil)\n\t\t\t}\n\n\t\t\tif tt.expectPanic {\n\t\t\t\tdefer func() {\n\t\t\t\t\tif r := recover(); r == nil {\n\t\t\t\t\t\tt.Errorf(\"Expected a panic but didn't get one\")\n\t\t\t\t\t}\n\t\t\t\t}()\n\t\t\t}\n\n\t\t\tkey, val := tree.GetByIndex(tt.idx)\n\n\t\t\tif !tt.expectPanic {\n\t\t\t\tif key != tt.expectKey {\n\t\t\t\t\tt.Errorf(\"Expected key %s, got %s\", tt.expectKey, key)\n\t\t\t\t}\n\n\t\t\t\tif val != tt.expectVal {\n\t\t\t\t\tt.Errorf(\"Expected value %v, got %v\", tt.expectVal, val)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestRemove(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tinput []string\n\t\tremoveKey string\n\t\texpected []string\n\t}{\n\t\t{\n\t\t\t\"remove leaf node\",\n\t\t\t[]string{\"C\", \"A\", \"B\", \"D\"},\n\t\t\t\"B\",\n\t\t\t[]string{\"A\", \"C\", \"D\"},\n\t\t},\n\t\t{\n\t\t\t\"remove node with one child\",\n\t\t\t[]string{\"C\", \"A\", \"B\", \"D\"},\n\t\t\t\"A\",\n\t\t\t[]string{\"B\", \"C\", \"D\"},\n\t\t},\n\t\t{\n\t\t\t\"remove node with two children\",\n\t\t\t[]string{\"C\", \"A\", \"B\", \"E\", \"D\"},\n\t\t\t\"C\",\n\t\t\t[]string{\"A\", \"B\", \"D\", \"E\"},\n\t\t},\n\t\t{\n\t\t\t\"remove root node\",\n\t\t\t[]string{\"C\", \"A\", \"B\", \"E\", \"D\"},\n\t\t\t\"C\",\n\t\t\t[]string{\"A\", \"B\", \"D\", \"E\"},\n\t\t},\n\t\t{\n\t\t\t\"remove non-existent key\",\n\t\t\t[]string{\"C\", \"A\", \"B\", \"E\", \"D\"},\n\t\t\t\"F\",\n\t\t\t[]string{\"A\", \"B\", \"C\", \"D\", \"E\"},\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tvar tree *Node\n\t\t\tfor _, key := range tt.input {\n\t\t\t\ttree, _ = tree.Set(key, nil)\n\t\t\t}\n\n\t\t\ttree, _, _, _ = tree.Remove(tt.removeKey)\n\n\t\t\tresult := make([]string, 0)\n\t\t\ttree.Iterate(\"\", \"\", func(n *Node) bool {\n\t\t\t\tresult = append(result, n.Key())\n\t\t\t\treturn false\n\t\t\t})\n\n\t\t\tif !slicesEqual(tt.expected, result) {\n\t\t\t\tt.Errorf(\"want %v got %v\", tt.expected, result)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestTraverse(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tinput []string\n\t\texpected []string\n\t}{\n\t\t{\n\t\t\t\"empty tree\",\n\t\t\t[]string{},\n\t\t\t[]string{},\n\t\t},\n\t\t{\n\t\t\t\"single node tree\",\n\t\t\t[]string{\"A\"},\n\t\t\t[]string{\"A\"},\n\t\t},\n\t\t{\n\t\t\t\"small tree\",\n\t\t\t[]string{\"C\", \"A\", \"B\", \"E\", \"D\"},\n\t\t\t[]string{\"A\", \"B\", \"C\", \"D\", \"E\"},\n\t\t},\n\t\t{\n\t\t\t\"large tree\",\n\t\t\t[]string{\"H\", \"D\", \"L\", \"B\", \"F\", \"J\", \"N\", \"A\", \"C\", \"E\", \"G\", \"I\", \"K\", \"M\", \"O\"},\n\t\t\t[]string{\"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"I\", \"J\", \"K\", \"L\", \"M\", \"N\", \"O\"},\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tvar tree *Node\n\t\t\tfor _, key := range tt.input {\n\t\t\t\ttree, _ = tree.Set(key, nil)\n\t\t\t}\n\n\t\t\tt.Run(\"iterate\", func(t *testing.T) {\n\t\t\t\tvar result []string\n\t\t\t\ttree.Iterate(\"\", \"\", func(n *Node) bool {\n\t\t\t\t\tresult = append(result, n.Key())\n\t\t\t\t\treturn false\n\t\t\t\t})\n\t\t\t\tif !slicesEqual(tt.expected, result) {\n\t\t\t\t\tt.Errorf(\"want %v got %v\", tt.expected, result)\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tt.Run(\"ReverseIterate\", func(t *testing.T) {\n\t\t\t\tvar result []string\n\t\t\t\ttree.ReverseIterate(\"\", \"\", func(n *Node) bool {\n\t\t\t\t\tresult = append(result, n.Key())\n\t\t\t\t\treturn false\n\t\t\t\t})\n\t\t\t\texpected := make([]string, len(tt.expected))\n\t\t\t\tcopy(expected, tt.expected)\n\t\t\t\tfor i, j := 0, len(expected)-1; i \u003c j; i, j = i+1, j-1 {\n\t\t\t\t\texpected[i], expected[j] = expected[j], expected[i]\n\t\t\t\t}\n\t\t\t\tif !slicesEqual(expected, result) {\n\t\t\t\t\tt.Errorf(\"want %v got %v\", expected, result)\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tt.Run(\"TraverseInRange\", func(t *testing.T) {\n\t\t\t\tvar result []string\n\t\t\t\tstart, end := \"C\", \"M\"\n\t\t\t\ttree.TraverseInRange(start, end, true, true, func(n *Node) bool {\n\t\t\t\t\tresult = append(result, n.Key())\n\t\t\t\t\treturn false\n\t\t\t\t})\n\t\t\t\texpected := make([]string, 0)\n\t\t\t\tfor _, key := range tt.expected {\n\t\t\t\t\tif key \u003e= start \u0026\u0026 key \u003c end {\n\t\t\t\t\t\texpected = append(expected, key)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif !slicesEqual(expected, result) {\n\t\t\t\t\tt.Errorf(\"want %v got %v\", expected, result)\n\t\t\t\t}\n\t\t\t})\n\t\t})\n\t}\n}\n\nfunc TestRotateWhenHeightDiffers(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tinput []string\n\t\texpected []string\n\t}{\n\t\t{\n\t\t\t\"right rotation when left subtree is higher\",\n\t\t\t[]string{\"E\", \"C\", \"A\", \"B\", \"D\"},\n\t\t\t[]string{\"A\", \"B\", \"C\", \"E\", \"D\"},\n\t\t},\n\t\t{\n\t\t\t\"left rotation when right subtree is higher\",\n\t\t\t[]string{\"A\", \"C\", \"E\", \"D\", \"F\"},\n\t\t\t[]string{\"A\", \"C\", \"D\", \"E\", \"F\"},\n\t\t},\n\t\t{\n\t\t\t\"left-right rotation\",\n\t\t\t[]string{\"E\", \"A\", \"C\", \"B\", \"D\"},\n\t\t\t[]string{\"A\", \"B\", \"C\", \"E\", \"D\"},\n\t\t},\n\t\t{\n\t\t\t\"right-left rotation\",\n\t\t\t[]string{\"A\", \"E\", \"C\", \"B\", \"D\"},\n\t\t\t[]string{\"A\", \"B\", \"C\", \"E\", \"D\"},\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tvar tree *Node\n\t\t\tfor _, key := range tt.input {\n\t\t\t\ttree, _ = tree.Set(key, nil)\n\t\t\t}\n\n\t\t\t// perform rotation or balance\n\t\t\ttree = tree.balance()\n\n\t\t\t// check tree structure\n\t\t\tvar result []string\n\t\t\ttree.Iterate(\"\", \"\", func(n *Node) bool {\n\t\t\t\tresult = append(result, n.Key())\n\t\t\t\treturn false\n\t\t\t})\n\n\t\t\tif !slicesEqual(tt.expected, result) {\n\t\t\t\tt.Errorf(\"want %v got %v\", tt.expected, result)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestRotateAndBalance(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tinput []string\n\t\texpected []string\n\t}{\n\t\t{\n\t\t\t\"right rotation\",\n\t\t\t[]string{\"A\", \"B\", \"C\", \"D\", \"E\"},\n\t\t\t[]string{\"A\", \"B\", \"C\", \"D\", \"E\"},\n\t\t},\n\t\t{\n\t\t\t\"left rotation\",\n\t\t\t[]string{\"E\", \"D\", \"C\", \"B\", \"A\"},\n\t\t\t[]string{\"A\", \"B\", \"C\", \"D\", \"E\"},\n\t\t},\n\t\t{\n\t\t\t\"left-right rotation\",\n\t\t\t[]string{\"C\", \"A\", \"E\", \"B\", \"D\"},\n\t\t\t[]string{\"A\", \"B\", \"C\", \"D\", \"E\"},\n\t\t},\n\t\t{\n\t\t\t\"right-left rotation\",\n\t\t\t[]string{\"C\", \"E\", \"A\", \"D\", \"B\"},\n\t\t\t[]string{\"A\", \"B\", \"C\", \"D\", \"E\"},\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tvar tree *Node\n\t\t\tfor _, key := range tt.input {\n\t\t\t\ttree, _ = tree.Set(key, nil)\n\t\t\t}\n\n\t\t\ttree = tree.balance()\n\n\t\t\tvar result []string\n\t\t\ttree.Iterate(\"\", \"\", func(n *Node) bool {\n\t\t\t\tresult = append(result, n.Key())\n\t\t\t\treturn false\n\t\t\t})\n\n\t\t\tif !slicesEqual(tt.expected, result) {\n\t\t\t\tt.Errorf(\"want %v got %v\", tt.expected, result)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc slicesEqual(w1, w2 []string) bool {\n\tif len(w1) != len(w2) {\n\t\treturn false\n\t}\n\tfor i := 0; i \u003c len(w1); i++ {\n\t\tif w1[0] != w2[0] {\n\t\t\treturn false\n\t\t}\n\t}\n\treturn true\n}\n\nfunc maxint8(a, b int8) int8 {\n\tif a \u003e b {\n\t\treturn a\n\t}\n\treturn b\n}\n\nfunc reverseSlice(ss []string) {\n\tfor i := 0; i \u003c len(ss)/2; i++ {\n\t\tj := len(ss) - 1 - i\n\t\tss[i], ss[j] = ss[j], ss[i]\n\t}\n}\n"},{"name":"tree.gno","body":"package avl\n\ntype IterCbFn func(key string, value interface{}) bool\n\n//----------------------------------------\n// Tree\n\n// The zero struct can be used as an empty tree.\ntype Tree struct {\n\tnode *Node\n}\n\n// NewTree creates a new empty AVL tree.\nfunc NewTree() *Tree {\n\treturn \u0026Tree{\n\t\tnode: nil,\n\t}\n}\n\n// Size returns the number of key-value pair in the tree.\nfunc (tree *Tree) Size() int {\n\treturn tree.node.Size()\n}\n\n// Has checks whether a key exists in the tree.\n// It returns true if the key exists, otherwise false.\nfunc (tree *Tree) Has(key string) (has bool) {\n\treturn tree.node.Has(key)\n}\n\n// Get retrieves the value associated with the given key.\n// It returns the value and a boolean indicating whether the key exists.\nfunc (tree *Tree) Get(key string) (value interface{}, exists bool) {\n\t_, value, exists = tree.node.Get(key)\n\treturn\n}\n\n// GetByIndex retrieves the key-value pair at the specified index in the tree.\n// It returns the key and value at the given index.\nfunc (tree *Tree) GetByIndex(index int) (key string, value interface{}) {\n\treturn tree.node.GetByIndex(index)\n}\n\n// Set inserts a key-value pair into the tree.\n// If the key already exists, the value will be updated.\n// It returns a boolean indicating whether the key was newly inserted or updated.\nfunc (tree *Tree) Set(key string, value interface{}) (updated bool) {\n\tnewnode, updated := tree.node.Set(key, value)\n\ttree.node = newnode\n\treturn updated\n}\n\n// Remove removes a key-value pair from the tree.\n// It returns the removed value and a boolean indicating whether the key was found and removed.\nfunc (tree *Tree) Remove(key string) (value interface{}, removed bool) {\n\tnewnode, _, value, removed := tree.node.Remove(key)\n\ttree.node = newnode\n\treturn value, removed\n}\n\n// Iterate performs an in-order traversal of the tree within the specified key range.\n// It calls the provided callback function for each key-value pair encountered.\n// If the callback returns true, the iteration is stopped.\nfunc (tree *Tree) Iterate(start, end string, cb IterCbFn) bool {\n\treturn tree.node.TraverseInRange(start, end, true, true,\n\t\tfunc(node *Node) bool {\n\t\t\treturn cb(node.Key(), node.Value())\n\t\t},\n\t)\n}\n\n// ReverseIterate performs a reverse in-order traversal of the tree within the specified key range.\n// It calls the provided callback function for each key-value pair encountered.\n// If the callback returns true, the iteration is stopped.\nfunc (tree *Tree) ReverseIterate(start, end string, cb IterCbFn) bool {\n\treturn tree.node.TraverseInRange(start, end, false, true,\n\t\tfunc(node *Node) bool {\n\t\t\treturn cb(node.Key(), node.Value())\n\t\t},\n\t)\n}\n\n// IterateByOffset performs an in-order traversal of the tree starting from the specified offset.\n// It calls the provided callback function for each key-value pair encountered, up to the specified count.\n// If the callback returns true, the iteration is stopped.\nfunc (tree *Tree) IterateByOffset(offset int, count int, cb IterCbFn) bool {\n\treturn tree.node.TraverseByOffset(offset, count, true, true,\n\t\tfunc(node *Node) bool {\n\t\t\treturn cb(node.Key(), node.Value())\n\t\t},\n\t)\n}\n\n// ReverseIterateByOffset performs a reverse in-order traversal of the tree starting from the specified offset.\n// It calls the provided callback function for each key-value pair encountered, up to the specified count.\n// If the callback returns true, the iteration is stopped.\nfunc (tree *Tree) ReverseIterateByOffset(offset int, count int, cb IterCbFn) bool {\n\treturn tree.node.TraverseByOffset(offset, count, false, true,\n\t\tfunc(node *Node) bool {\n\t\t\treturn cb(node.Key(), node.Value())\n\t\t},\n\t)\n}\n"},{"name":"tree_test.gno","body":"package avl\n\nimport \"testing\"\n\nfunc TestNewTree(t *testing.T) {\n\ttree := NewTree()\n\tif tree.node != nil {\n\t\tt.Error(\"Expected tree.node to be nil\")\n\t}\n}\n\nfunc TestTreeSize(t *testing.T) {\n\ttree := NewTree()\n\tif tree.Size() != 0 {\n\t\tt.Error(\"Expected empty tree size to be 0\")\n\t}\n\n\ttree.Set(\"key1\", \"value1\")\n\ttree.Set(\"key2\", \"value2\")\n\tif tree.Size() != 2 {\n\t\tt.Error(\"Expected tree size to be 2\")\n\t}\n}\n\nfunc TestTreeHas(t *testing.T) {\n\ttree := NewTree()\n\ttree.Set(\"key1\", \"value1\")\n\n\tif !tree.Has(\"key1\") {\n\t\tt.Error(\"Expected tree to have key1\")\n\t}\n\n\tif tree.Has(\"key2\") {\n\t\tt.Error(\"Expected tree to not have key2\")\n\t}\n}\n\nfunc TestTreeGet(t *testing.T) {\n\ttree := NewTree()\n\ttree.Set(\"key1\", \"value1\")\n\n\tvalue, exists := tree.Get(\"key1\")\n\tif !exists || value != \"value1\" {\n\t\tt.Error(\"Expected Get to return value1 and true\")\n\t}\n\n\t_, exists = tree.Get(\"key2\")\n\tif exists {\n\t\tt.Error(\"Expected Get to return false for non-existent key\")\n\t}\n}\n\nfunc TestTreeGetByIndex(t *testing.T) {\n\ttree := NewTree()\n\ttree.Set(\"key1\", \"value1\")\n\ttree.Set(\"key2\", \"value2\")\n\n\tkey, value := tree.GetByIndex(0)\n\tif key != \"key1\" || value != \"value1\" {\n\t\tt.Error(\"Expected GetByIndex(0) to return key1 and value1\")\n\t}\n\n\tkey, value = tree.GetByIndex(1)\n\tif key != \"key2\" || value != \"value2\" {\n\t\tt.Error(\"Expected GetByIndex(1) to return key2 and value2\")\n\t}\n\n\tdefer func() {\n\t\tif r := recover(); r == nil {\n\t\t\tt.Error(\"Expected GetByIndex to panic for out-of-range index\")\n\t\t}\n\t}()\n\ttree.GetByIndex(2)\n}\n\nfunc TestTreeRemove(t *testing.T) {\n\ttree := NewTree()\n\ttree.Set(\"key1\", \"value1\")\n\n\tvalue, removed := tree.Remove(\"key1\")\n\tif !removed || value != \"value1\" || tree.Size() != 0 {\n\t\tt.Error(\"Expected Remove to remove key-value pair\")\n\t}\n\n\t_, removed = tree.Remove(\"key2\")\n\tif removed {\n\t\tt.Error(\"Expected Remove to return false for non-existent key\")\n\t}\n}\n\nfunc TestTreeIterate(t *testing.T) {\n\ttree := NewTree()\n\ttree.Set(\"key1\", \"value1\")\n\ttree.Set(\"key2\", \"value2\")\n\ttree.Set(\"key3\", \"value3\")\n\n\tvar keys []string\n\ttree.Iterate(\"\", \"\", func(key string, value interface{}) bool {\n\t\tkeys = append(keys, key)\n\t\treturn false\n\t})\n\n\texpectedKeys := []string{\"key1\", \"key2\", \"key3\"}\n\tif !slicesEqual(keys, expectedKeys) {\n\t\tt.Errorf(\"Expected keys %v, got %v\", expectedKeys, keys)\n\t}\n}\n\nfunc TestTreeReverseIterate(t *testing.T) {\n\ttree := NewTree()\n\ttree.Set(\"key1\", \"value1\")\n\ttree.Set(\"key2\", \"value2\")\n\ttree.Set(\"key3\", \"value3\")\n\n\tvar keys []string\n\ttree.ReverseIterate(\"\", \"\", func(key string, value interface{}) bool {\n\t\tkeys = append(keys, key)\n\t\treturn false\n\t})\n\n\texpectedKeys := []string{\"key3\", \"key2\", \"key1\"}\n\tif !slicesEqual(keys, expectedKeys) {\n\t\tt.Errorf(\"Expected keys %v, got %v\", expectedKeys, keys)\n\t}\n}\n\nfunc TestTreeIterateByOffset(t *testing.T) {\n\ttree := NewTree()\n\ttree.Set(\"key1\", \"value1\")\n\ttree.Set(\"key2\", \"value2\")\n\ttree.Set(\"key3\", \"value3\")\n\n\tvar keys []string\n\ttree.IterateByOffset(1, 2, func(key string, value interface{}) bool {\n\t\tkeys = append(keys, key)\n\t\treturn false\n\t})\n\n\texpectedKeys := []string{\"key2\", \"key3\"}\n\tif !slicesEqual(keys, expectedKeys) {\n\t\tt.Errorf(\"Expected keys %v, got %v\", expectedKeys, keys)\n\t}\n}\n\nfunc TestTreeReverseIterateByOffset(t *testing.T) {\n\ttree := NewTree()\n\ttree.Set(\"key1\", \"value1\")\n\ttree.Set(\"key2\", \"value2\")\n\ttree.Set(\"key3\", \"value3\")\n\n\tvar keys []string\n\ttree.ReverseIterateByOffset(1, 2, func(key string, value interface{}) bool {\n\t\tkeys = append(keys, key)\n\t\treturn false\n\t})\n\n\texpectedKeys := []string{\"key2\", \"key1\"}\n\tif !slicesEqual(keys, expectedKeys) {\n\t\tt.Errorf(\"Expected keys %v, got %v\", expectedKeys, keys)\n\t}\n}\n"},{"name":"z_0_filetest.gno","body":"// PKGPATH: gno.land/r/test\npackage test\n\nimport (\n\t\"gno.land/p/demo/avl\"\n)\n\nvar node *avl.Node\n\nfunc init() {\n\tnode = avl.NewNode(\"key0\", \"value0\")\n\t// node, _ = node.Set(\"key0\", \"value0\")\n}\n\nfunc main() {\n\tvar updated bool\n\tnode, updated = node.Set(\"key1\", \"value1\")\n\t// println(node, updated)\n\tprintln(updated, node.Size())\n}\n\n// Output:\n// false 2\n\n// Realm:\n// switchrealm[\"gno.land/r/test\"]\n// u[a8ada09dee16d791fd406d629fe29bb0ed084a30:4]={\n// \"ObjectInfo\": {\n// \"ID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:4\",\n// \"ModTime\": \"7\",\n// \"OwnerID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:7\",\n// \"RefCount\": \"1\"\n// },\n// \"Value\": {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"627e8e517e7ae5db0f3b753e2a32b607989198b6\",\n// \"ObjectID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:5\"\n// }\n// }\n// }\n// c[a8ada09dee16d791fd406d629fe29bb0ed084a30:9]={\n// \"Fields\": [\n// {\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"16\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.StringValue\",\n// \"value\": \"key1\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"16\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.StringValue\",\n// \"value\": \"value1\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"64\"\n// }\n// },\n// {\n// \"N\": \"AQAAAAAAAAA=\",\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"32\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// }\n// }\n// ],\n// \"ObjectInfo\": {\n// \"ID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:9\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:8\",\n// \"RefCount\": \"1\"\n// }\n// }\n// c[a8ada09dee16d791fd406d629fe29bb0ed084a30:8]={\n// \"ObjectInfo\": {\n// \"ID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:8\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:7\",\n// \"RefCount\": \"1\"\n// },\n// \"Value\": {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"b28057ab7be6383785c0a5503e8a531bdbc21851\",\n// \"ObjectID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:9\"\n// }\n// }\n// }\n// c[a8ada09dee16d791fd406d629fe29bb0ed084a30:7]={\n// \"Fields\": [\n// {\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"16\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.StringValue\",\n// \"value\": \"key1\"\n// }\n// },\n// {},\n// {\n// \"N\": \"AQAAAAAAAAA=\",\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"64\"\n// }\n// },\n// {\n// \"N\": \"AgAAAAAAAAA=\",\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"32\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// },\n// \"V\": {\n// \"@type\": \"/gno.PointerValue\",\n// \"Base\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"6da365f0d6cacbcdf53cd5a4b125803cddce08c2\",\n// \"ObjectID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:4\"\n// },\n// \"Index\": \"0\",\n// \"TV\": null\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// },\n// \"V\": {\n// \"@type\": \"/gno.PointerValue\",\n// \"Base\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"f216afe7b5a17f4ebdbb98dceccedbc22e237596\",\n// \"ObjectID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:8\"\n// },\n// \"Index\": \"0\",\n// \"TV\": null\n// }\n// }\n// ],\n// \"ObjectInfo\": {\n// \"ID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:7\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:6\",\n// \"RefCount\": \"1\"\n// }\n// }\n// c[a8ada09dee16d791fd406d629fe29bb0ed084a30:6]={\n// \"ObjectInfo\": {\n// \"ID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:6\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:2\",\n// \"RefCount\": \"1\"\n// },\n// \"Value\": {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"ff1a50d8489090af37a2c7766d659f0d717939b5\",\n// \"ObjectID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:7\"\n// }\n// }\n// }\n// u[a8ada09dee16d791fd406d629fe29bb0ed084a30:2]={\n// \"Blank\": {},\n// \"ObjectInfo\": {\n// \"ID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:2\",\n// \"IsEscaped\": true,\n// \"ModTime\": \"5\",\n// \"RefCount\": \"2\"\n// },\n// \"Parent\": null,\n// \"Source\": {\n// \"@type\": \"/gno.RefNode\",\n// \"BlockNode\": null,\n// \"Location\": {\n// \"Column\": \"0\",\n// \"File\": \"\",\n// \"Line\": \"0\",\n// \"PkgPath\": \"gno.land/r/test\"\n// }\n// },\n// \"Values\": [\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// },\n// \"V\": {\n// \"@type\": \"/gno.PointerValue\",\n// \"Base\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"ae86874f9b47fa5e64c30b3e92e9d07f2ec967a4\",\n// \"ObjectID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:6\"\n// },\n// \"Index\": \"0\",\n// \"TV\": null\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.FuncType\",\n// \"Params\": [],\n// \"Results\": []\n// },\n// \"V\": {\n// \"@type\": \"/gno.FuncValue\",\n// \"Closure\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Escaped\": true,\n// \"ObjectID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:3\"\n// },\n// \"FileName\": \"main.gno\",\n// \"IsMethod\": false,\n// \"Name\": \"init.1\",\n// \"NativeName\": \"\",\n// \"NativePkg\": \"\",\n// \"PkgPath\": \"gno.land/r/test\",\n// \"Source\": {\n// \"@type\": \"/gno.RefNode\",\n// \"BlockNode\": null,\n// \"Location\": {\n// \"Column\": \"1\",\n// \"File\": \"main.gno\",\n// \"Line\": \"10\",\n// \"PkgPath\": \"gno.land/r/test\"\n// }\n// },\n// \"Type\": {\n// \"@type\": \"/gno.FuncType\",\n// \"Params\": [],\n// \"Results\": []\n// }\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.FuncType\",\n// \"Params\": [],\n// \"Results\": []\n// },\n// \"V\": {\n// \"@type\": \"/gno.FuncValue\",\n// \"Closure\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Escaped\": true,\n// \"ObjectID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:3\"\n// },\n// \"FileName\": \"main.gno\",\n// \"IsMethod\": false,\n// \"Name\": \"main\",\n// \"NativeName\": \"\",\n// \"NativePkg\": \"\",\n// \"PkgPath\": \"gno.land/r/test\",\n// \"Source\": {\n// \"@type\": \"/gno.RefNode\",\n// \"BlockNode\": null,\n// \"Location\": {\n// \"Column\": \"1\",\n// \"File\": \"main.gno\",\n// \"Line\": \"15\",\n// \"PkgPath\": \"gno.land/r/test\"\n// }\n// },\n// \"Type\": {\n// \"@type\": \"/gno.FuncType\",\n// \"Params\": [],\n// \"Results\": []\n// }\n// }\n// }\n// ]\n// }\n"},{"name":"z_1_filetest.gno","body":"// PKGPATH: gno.land/r/test\npackage test\n\nimport (\n\t\"gno.land/p/demo/avl\"\n)\n\nvar node *avl.Node\n\nfunc init() {\n\tnode = avl.NewNode(\"key0\", \"value0\")\n\tnode, _ = node.Set(\"key1\", \"value1\")\n}\n\nfunc main() {\n\tvar updated bool\n\tnode, updated = node.Set(\"key2\", \"value2\")\n\t// println(node, updated)\n\tprintln(updated, node.Size())\n}\n\n// Output:\n// false 3\n\n// Realm:\n// switchrealm[\"gno.land/r/test\"]\n// c[a8ada09dee16d791fd406d629fe29bb0ed084a30:15]={\n// \"Fields\": [\n// {\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"16\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.StringValue\",\n// \"value\": \"key2\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"16\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.StringValue\",\n// \"value\": \"value2\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"64\"\n// }\n// },\n// {\n// \"N\": \"AQAAAAAAAAA=\",\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"32\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// }\n// }\n// ],\n// \"ObjectInfo\": {\n// \"ID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:15\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:14\",\n// \"RefCount\": \"1\"\n// }\n// }\n// c[a8ada09dee16d791fd406d629fe29bb0ed084a30:14]={\n// \"ObjectInfo\": {\n// \"ID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:14\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:13\",\n// \"RefCount\": \"1\"\n// },\n// \"Value\": {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"143aebc820da33550f7338723fb1e2eec575b196\",\n// \"ObjectID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:15\"\n// }\n// }\n// }\n// c[a8ada09dee16d791fd406d629fe29bb0ed084a30:13]={\n// \"Fields\": [\n// {\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"16\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.StringValue\",\n// \"value\": \"key2\"\n// }\n// },\n// {},\n// {\n// \"N\": \"AQAAAAAAAAA=\",\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"64\"\n// }\n// },\n// {\n// \"N\": \"AgAAAAAAAAA=\",\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"32\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// },\n// \"V\": {\n// \"@type\": \"/gno.PointerValue\",\n// \"Base\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"2f3adc5d0f2a3fe0331cfa93572a7abdde14c9aa\",\n// \"ObjectID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:8\"\n// },\n// \"Index\": \"0\",\n// \"TV\": null\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// },\n// \"V\": {\n// \"@type\": \"/gno.PointerValue\",\n// \"Base\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"2e733a8e9e74fe14f0a5d10fb0f6728fa53d052d\",\n// \"ObjectID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:14\"\n// },\n// \"Index\": \"0\",\n// \"TV\": null\n// }\n// }\n// ],\n// \"ObjectInfo\": {\n// \"ID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:13\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:12\",\n// \"RefCount\": \"1\"\n// }\n// }\n// c[a8ada09dee16d791fd406d629fe29bb0ed084a30:12]={\n// \"ObjectInfo\": {\n// \"ID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:12\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:11\",\n// \"RefCount\": \"1\"\n// },\n// \"Value\": {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"fe20a19f956511f274dc77854e9e5468387260f4\",\n// \"ObjectID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:13\"\n// }\n// }\n// }\n// c[a8ada09dee16d791fd406d629fe29bb0ed084a30:11]={\n// \"Fields\": [\n// {\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"16\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.StringValue\",\n// \"value\": \"key1\"\n// }\n// },\n// {},\n// {\n// \"N\": \"AgAAAAAAAAA=\",\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"64\"\n// }\n// },\n// {\n// \"N\": \"AwAAAAAAAAA=\",\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"32\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// },\n// \"V\": {\n// \"@type\": \"/gno.PointerValue\",\n// \"Base\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"c89a71bdf045e8bde2059dc9d33839f916e02e5d\",\n// \"ObjectID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:6\"\n// },\n// \"Index\": \"0\",\n// \"TV\": null\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// },\n// \"V\": {\n// \"@type\": \"/gno.PointerValue\",\n// \"Base\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"90fa67f8c47db4b9b2a60425dff08d5a3385100f\",\n// \"ObjectID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:12\"\n// },\n// \"Index\": \"0\",\n// \"TV\": null\n// }\n// }\n// ],\n// \"ObjectInfo\": {\n// \"ID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:11\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:10\",\n// \"RefCount\": \"1\"\n// }\n// }\n// c[a8ada09dee16d791fd406d629fe29bb0ed084a30:10]={\n// \"ObjectInfo\": {\n// \"ID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:10\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:2\",\n// \"RefCount\": \"1\"\n// },\n// \"Value\": {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"83e42caaf53070dd95b5f859053eb51ed900bbda\",\n// \"ObjectID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:11\"\n// }\n// }\n// }\n// u[a8ada09dee16d791fd406d629fe29bb0ed084a30:2]={\n// \"Blank\": {},\n// \"ObjectInfo\": {\n// \"ID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:2\",\n// \"IsEscaped\": true,\n// \"ModTime\": \"9\",\n// \"RefCount\": \"2\"\n// },\n// \"Parent\": null,\n// \"Source\": {\n// \"@type\": \"/gno.RefNode\",\n// \"BlockNode\": null,\n// \"Location\": {\n// \"Column\": \"0\",\n// \"File\": \"\",\n// \"Line\": \"0\",\n// \"PkgPath\": \"gno.land/r/test\"\n// }\n// },\n// \"Values\": [\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// },\n// \"V\": {\n// \"@type\": \"/gno.PointerValue\",\n// \"Base\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"1faa9fa4ba1935121a6d3f0a623772e9d4499b0a\",\n// \"ObjectID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:10\"\n// },\n// \"Index\": \"0\",\n// \"TV\": null\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.FuncType\",\n// \"Params\": [],\n// \"Results\": []\n// },\n// \"V\": {\n// \"@type\": \"/gno.FuncValue\",\n// \"Closure\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Escaped\": true,\n// \"ObjectID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:3\"\n// },\n// \"FileName\": \"main.gno\",\n// \"IsMethod\": false,\n// \"Name\": \"init.1\",\n// \"NativeName\": \"\",\n// \"NativePkg\": \"\",\n// \"PkgPath\": \"gno.land/r/test\",\n// \"Source\": {\n// \"@type\": \"/gno.RefNode\",\n// \"BlockNode\": null,\n// \"Location\": {\n// \"Column\": \"1\",\n// \"File\": \"main.gno\",\n// \"Line\": \"10\",\n// \"PkgPath\": \"gno.land/r/test\"\n// }\n// },\n// \"Type\": {\n// \"@type\": \"/gno.FuncType\",\n// \"Params\": [],\n// \"Results\": []\n// }\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.FuncType\",\n// \"Params\": [],\n// \"Results\": []\n// },\n// \"V\": {\n// \"@type\": \"/gno.FuncValue\",\n// \"Closure\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Escaped\": true,\n// \"ObjectID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:3\"\n// },\n// \"FileName\": \"main.gno\",\n// \"IsMethod\": false,\n// \"Name\": \"main\",\n// \"NativeName\": \"\",\n// \"NativePkg\": \"\",\n// \"PkgPath\": \"gno.land/r/test\",\n// \"Source\": {\n// \"@type\": \"/gno.RefNode\",\n// \"BlockNode\": null,\n// \"Location\": {\n// \"Column\": \"1\",\n// \"File\": \"main.gno\",\n// \"Line\": \"15\",\n// \"PkgPath\": \"gno.land/r/test\"\n// }\n// },\n// \"Type\": {\n// \"@type\": \"/gno.FuncType\",\n// \"Params\": [],\n// \"Results\": []\n// }\n// }\n// }\n// ]\n// }\n// d[a8ada09dee16d791fd406d629fe29bb0ed084a30:4]\n// d[a8ada09dee16d791fd406d629fe29bb0ed084a30:5]\n"},{"name":"z_2_filetest.gno","body":"// PKGPATH: gno.land/r/test\npackage test\n\nimport (\n\t\"gno.land/p/demo/avl\"\n)\n\nvar tree avl.Tree\n\nfunc init() {\n\ttree.Set(\"key0\", \"value0\")\n\ttree.Set(\"key1\", \"value1\")\n}\n\nfunc main() {\n\tvar updated bool\n\tupdated = tree.Set(\"key2\", \"value2\")\n\tprintln(updated, tree.Size())\n}\n\n// Output:\n// false 3\n\n// Realm:\n// switchrealm[\"gno.land/r/test\"]\n// c[a8ada09dee16d791fd406d629fe29bb0ed084a30:16]={\n// \"Fields\": [\n// {\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"16\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.StringValue\",\n// \"value\": \"key2\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"16\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.StringValue\",\n// \"value\": \"value2\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"64\"\n// }\n// },\n// {\n// \"N\": \"AQAAAAAAAAA=\",\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"32\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// }\n// }\n// ],\n// \"ObjectInfo\": {\n// \"ID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:16\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:15\",\n// \"RefCount\": \"1\"\n// }\n// }\n// c[a8ada09dee16d791fd406d629fe29bb0ed084a30:15]={\n// \"ObjectInfo\": {\n// \"ID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:15\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:14\",\n// \"RefCount\": \"1\"\n// },\n// \"Value\": {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"db333c89cd6773709e031f1f4e4ed4d3fed66c11\",\n// \"ObjectID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:16\"\n// }\n// }\n// }\n// c[a8ada09dee16d791fd406d629fe29bb0ed084a30:14]={\n// \"Fields\": [\n// {\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"16\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.StringValue\",\n// \"value\": \"key2\"\n// }\n// },\n// {},\n// {\n// \"N\": \"AQAAAAAAAAA=\",\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"64\"\n// }\n// },\n// {\n// \"N\": \"AgAAAAAAAAA=\",\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"32\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// },\n// \"V\": {\n// \"@type\": \"/gno.PointerValue\",\n// \"Base\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"849a50d6c78d65742752e3c89ad8dd556e2e63cb\",\n// \"ObjectID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:9\"\n// },\n// \"Index\": \"0\",\n// \"TV\": null\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// },\n// \"V\": {\n// \"@type\": \"/gno.PointerValue\",\n// \"Base\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"b4fc2fdd2d0fe936c87ed2ace97136cffeed207f\",\n// \"ObjectID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:15\"\n// },\n// \"Index\": \"0\",\n// \"TV\": null\n// }\n// }\n// ],\n// \"ObjectInfo\": {\n// \"ID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:14\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:13\",\n// \"RefCount\": \"1\"\n// }\n// }\n// c[a8ada09dee16d791fd406d629fe29bb0ed084a30:13]={\n// \"ObjectInfo\": {\n// \"ID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:13\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:12\",\n// \"RefCount\": \"1\"\n// },\n// \"Value\": {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"a1160b0060ad752dbfe5fe436f7734bb19136150\",\n// \"ObjectID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:14\"\n// }\n// }\n// }\n// c[a8ada09dee16d791fd406d629fe29bb0ed084a30:12]={\n// \"Fields\": [\n// {\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"16\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.StringValue\",\n// \"value\": \"key1\"\n// }\n// },\n// {},\n// {\n// \"N\": \"AgAAAAAAAAA=\",\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"64\"\n// }\n// },\n// {\n// \"N\": \"AwAAAAAAAAA=\",\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"32\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// },\n// \"V\": {\n// \"@type\": \"/gno.PointerValue\",\n// \"Base\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"fd95e08763159ac529e26986d652e752e78b6325\",\n// \"ObjectID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:7\"\n// },\n// \"Index\": \"0\",\n// \"TV\": null\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// },\n// \"V\": {\n// \"@type\": \"/gno.PointerValue\",\n// \"Base\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"3ecdcf148fe2f9e97b72a3bedf303b2ba56d4f4b\",\n// \"ObjectID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:13\"\n// },\n// \"Index\": \"0\",\n// \"TV\": null\n// }\n// }\n// ],\n// \"ObjectInfo\": {\n// \"ID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:12\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:11\",\n// \"RefCount\": \"1\"\n// }\n// }\n// c[a8ada09dee16d791fd406d629fe29bb0ed084a30:11]={\n// \"ObjectInfo\": {\n// \"ID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:11\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:3\",\n// \"RefCount\": \"1\"\n// },\n// \"Value\": {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"63126557dba88f8556f7a0ccbbfc1d218ae7a302\",\n// \"ObjectID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:12\"\n// }\n// }\n// }\n// u[a8ada09dee16d791fd406d629fe29bb0ed084a30:3]={\n// \"Fields\": [\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// },\n// \"V\": {\n// \"@type\": \"/gno.PointerValue\",\n// \"Base\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"d31c7e797793e03ffe0bbcb72f963264f8300d22\",\n// \"ObjectID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:11\"\n// },\n// \"Index\": \"0\",\n// \"TV\": null\n// }\n// }\n// ],\n// \"ObjectInfo\": {\n// \"ID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:3\",\n// \"ModTime\": \"10\",\n// \"OwnerID\": \"a8ada09dee16d791fd406d629fe29bb0ed084a30:2\",\n// \"RefCount\": \"1\"\n// }\n// }\n// d[a8ada09dee16d791fd406d629fe29bb0ed084a30:5]\n// d[a8ada09dee16d791fd406d629fe29bb0ed084a30:6]\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"testutils","path":"gno.land/p/demo/testutils","files":[{"name":"access.gno","body":"package testutils\n\n// for testing access. see tests/files/access*.go\n\n// NOTE: non-package variables cannot be overridden, except during init().\nvar (\n\tTestVar1 int\n\ttestVar2 int\n)\n\nfunc init() {\n\tTestVar1 = 123\n\ttestVar2 = 456\n}\n\ntype TestAccessStruct struct {\n\tPublicField string\n\tprivateField string\n}\n\nfunc (tas TestAccessStruct) PublicMethod() string {\n\treturn tas.PublicField + \"/\" + tas.privateField\n}\n\nfunc (tas TestAccessStruct) privateMethod() string {\n\treturn tas.PublicField + \"/\" + tas.privateField\n}\n\nfunc NewTestAccessStruct(pub, priv string) TestAccessStruct {\n\treturn TestAccessStruct{\n\t\tPublicField: pub,\n\t\tprivateField: priv,\n\t}\n}\n\n// see access6.g0 etc.\ntype PrivateInterface interface {\n\tprivateMethod() string\n}\n\nfunc PrintPrivateInterface(pi PrivateInterface) {\n\tprintln(\"testutils.PrintPrivateInterface\", pi.privateMethod())\n}\n"},{"name":"crypto.gno","body":"package testutils\n\nimport \"std\"\n\nfunc TestAddress(name string) std.Address {\n\tif len(name) \u003e std.RawAddressSize {\n\t\tpanic(\"address name cannot be greater than std.AddressSize bytes\")\n\t}\n\taddr := std.RawAddress{}\n\t// TODO: use strings.RepeatString or similar.\n\t// NOTE: I miss python's \"\".Join().\n\tblanks := \"____________________\"\n\tcopy(addr[:], []byte(blanks))\n\tcopy(addr[:], []byte(name))\n\treturn std.Address(std.EncodeBech32(\"g\", addr))\n}\n"},{"name":"misc.gno","body":"package testutils\n\n// For testing std.GetCallerAt().\nfunc WrapCall(fn func()) {\n\tfn()\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"diff","path":"gno.land/p/demo/diff","files":[{"name":"diff.gno","body":"// The diff package implements the Myers diff algorithm to compute the edit distance\n// and generate a minimal edit script between two strings.\n//\n// Edit distance, also known as Levenshtein distance, is a measure of the similarity\n// between two strings. It is defined as the minimum number of single-character edits (insertions,\n// deletions, or substitutions) required to change one string into the other.\npackage diff\n\nimport (\n\t\"strings\"\n)\n\n// EditType represents the type of edit operation in a diff.\ntype EditType uint8\n\nconst (\n\t// EditKeep indicates that a character is unchanged in both strings.\n\tEditKeep EditType = iota\n\n\t// EditInsert indicates that a character was inserted in the new string.\n\tEditInsert\n\n\t// EditDelete indicates that a character was deleted from the old string.\n\tEditDelete\n)\n\n// Edit represent a single edit operation in a diff.\ntype Edit struct {\n\t// Type is the kind of edit operation.\n\tType EditType\n\n\t// Char is the character involved in the edit operation.\n\tChar rune\n}\n\n// MyersDiff computes the difference between two strings using Myers' diff algorithm.\n// It returns a slice of Edit operations that transform the old string into the new string.\n// This implementation finds the shortest edit script (SES) that represents the minimal\n// set of operations to transform one string into the other.\n//\n// The function handles both ASCII and non-ASCII characters correctly.\n//\n// Time complexity: O((N+M)D), where N and M are the lengths of the input strings,\n// and D is the size of the minimum edit script.\n//\n// Space complexity: O((N+M)D)\n//\n// In the worst case, where the strings are completely different, D can be as large as N+M,\n// leading to a time and space complexity of O((N+M)^2). However, for strings with many\n// common substrings, the performance is much better, often closer to O(N+M).\n//\n// Parameters:\n// - old: the original string.\n// - new: the modified string.\n//\n// Returns:\n// - A slice of Edit operations representing the minimum difference between the two strings.\nfunc MyersDiff(old, new string) []Edit {\n\toldRunes, newRunes := []rune(old), []rune(new)\n\tn, m := len(oldRunes), len(newRunes)\n\n\tif n == 0 \u0026\u0026 m == 0 {\n\t\treturn []Edit{}\n\t}\n\n\t// old is empty\n\tif n == 0 {\n\t\tedits := make([]Edit, m)\n\t\tfor i, r := range newRunes {\n\t\t\tedits[i] = Edit{Type: EditInsert, Char: r}\n\t\t}\n\t\treturn edits\n\t}\n\n\tif m == 0 {\n\t\tedits := make([]Edit, n)\n\t\tfor i, r := range oldRunes {\n\t\t\tedits[i] = Edit{Type: EditDelete, Char: r}\n\t\t}\n\t\treturn edits\n\t}\n\n\tmax := n + m\n\tv := make([]int, 2*max+1)\n\tvar trace [][]int\nsearch:\n\tfor d := 0; d \u003c= max; d++ {\n\t\t// iterate through diagonals\n\t\tfor k := -d; k \u003c= d; k += 2 {\n\t\t\tvar x int\n\t\t\tif k == -d || (k != d \u0026\u0026 v[max+k-1] \u003c v[max+k+1]) {\n\t\t\t\tx = v[max+k+1] // move down\n\t\t\t} else {\n\t\t\t\tx = v[max+k-1] + 1 // move right\n\t\t\t}\n\t\t\ty := x - k\n\n\t\t\t// extend the path as far as possible with matching characters\n\t\t\tfor x \u003c n \u0026\u0026 y \u003c m \u0026\u0026 oldRunes[x] == newRunes[y] {\n\t\t\t\tx++\n\t\t\t\ty++\n\t\t\t}\n\n\t\t\tv[max+k] = x\n\n\t\t\t// check if we've reached the end of both strings\n\t\t\tif x == n \u0026\u0026 y == m {\n\t\t\t\ttrace = append(trace, append([]int(nil), v...))\n\t\t\t\tbreak search\n\t\t\t}\n\t\t}\n\t\ttrace = append(trace, append([]int(nil), v...))\n\t}\n\n\t// backtrack to construct the edit script\n\tedits := make([]Edit, 0, n+m)\n\tx, y := n, m\n\tfor d := len(trace) - 1; d \u003e= 0; d-- {\n\t\tvPrev := trace[d]\n\t\tk := x - y\n\t\tvar prevK int\n\t\tif k == -d || (k != d \u0026\u0026 vPrev[max+k-1] \u003c vPrev[max+k+1]) {\n\t\t\tprevK = k + 1\n\t\t} else {\n\t\t\tprevK = k - 1\n\t\t}\n\t\tprevX := vPrev[max+prevK]\n\t\tprevY := prevX - prevK\n\n\t\t// add keep edits for matching characters\n\t\tfor x \u003e prevX \u0026\u0026 y \u003e prevY {\n\t\t\tif x \u003e 0 \u0026\u0026 y \u003e 0 {\n\t\t\t\tedits = append([]Edit{{Type: EditKeep, Char: oldRunes[x-1]}}, edits...)\n\t\t\t}\n\t\t\tx--\n\t\t\ty--\n\t\t}\n\t\tif y \u003e prevY {\n\t\t\tif y \u003e 0 {\n\t\t\t\tedits = append([]Edit{{Type: EditInsert, Char: newRunes[y-1]}}, edits...)\n\t\t\t}\n\t\t\ty--\n\t\t} else if x \u003e prevX {\n\t\t\tif x \u003e 0 {\n\t\t\t\tedits = append([]Edit{{Type: EditDelete, Char: oldRunes[x-1]}}, edits...)\n\t\t\t}\n\t\t\tx--\n\t\t}\n\t}\n\n\treturn edits\n}\n\n// Format converts a slice of Edit operations into a human-readable string representation.\n// It groups consecutive edits of the same type and formats them as follows:\n// - Unchanged characters are left as-is\n// - Inserted characters are wrapped in [+...]\n// - Deleted characters are wrapped in [-...]\n//\n// This function is useful for visualizing the differences between two strings\n// in a compact and intuitive format.\n//\n// Parameters:\n// - edits: A slice of Edit operations, typically produced by MyersDiff\n//\n// Returns:\n// - A formatted string representing the diff\n//\n// Example output:\n//\n//\tFor the diff between \"abcd\" and \"acbd\", the output might be:\n//\t\"a[-b]c[+b]d\"\n//\n// Note:\n//\n//\tThe function assumes that the input slice of edits is in the correct order.\n//\tAn empty input slice will result in an empty string.\nfunc Format(edits []Edit) string {\n\tif len(edits) == 0 {\n\t\treturn \"\"\n\t}\n\n\tvar (\n\t\tresult strings.Builder\n\t\tcurrentType EditType\n\t\tcurrentChars strings.Builder\n\t)\n\n\tflushCurrent := func() {\n\t\tif currentChars.Len() \u003e 0 {\n\t\t\tswitch currentType {\n\t\t\tcase EditKeep:\n\t\t\t\tresult.WriteString(currentChars.String())\n\t\t\tcase EditInsert:\n\t\t\t\tresult.WriteString(\"[+\")\n\t\t\t\tresult.WriteString(currentChars.String())\n\t\t\t\tresult.WriteByte(']')\n\t\t\tcase EditDelete:\n\t\t\t\tresult.WriteString(\"[-\")\n\t\t\t\tresult.WriteString(currentChars.String())\n\t\t\t\tresult.WriteByte(']')\n\t\t\t}\n\t\t\tcurrentChars.Reset()\n\t\t}\n\t}\n\n\tfor _, edit := range edits {\n\t\tif edit.Type != currentType {\n\t\t\tflushCurrent()\n\t\t\tcurrentType = edit.Type\n\t\t}\n\t\tcurrentChars.WriteRune(edit.Char)\n\t}\n\tflushCurrent()\n\n\treturn result.String()\n}\n"},{"name":"diff_test.gno","body":"package diff\n\nimport (\n\t\"strings\"\n\t\"testing\"\n)\n\nfunc TestMyersDiff(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\told string\n\t\tnew string\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tname: \"No difference\",\n\t\t\told: \"abc\",\n\t\t\tnew: \"abc\",\n\t\t\texpected: \"abc\",\n\t\t},\n\t\t{\n\t\t\tname: \"Simple insertion\",\n\t\t\told: \"ac\",\n\t\t\tnew: \"abc\",\n\t\t\texpected: \"a[+b]c\",\n\t\t},\n\t\t{\n\t\t\tname: \"Simple deletion\",\n\t\t\told: \"abc\",\n\t\t\tnew: \"ac\",\n\t\t\texpected: \"a[-b]c\",\n\t\t},\n\t\t{\n\t\t\tname: \"Simple substitution\",\n\t\t\told: \"abc\",\n\t\t\tnew: \"abd\",\n\t\t\texpected: \"ab[-c][+d]\",\n\t\t},\n\t\t{\n\t\t\tname: \"Multiple changes\",\n\t\t\told: \"The quick brown fox jumps over the lazy dog\",\n\t\t\tnew: \"The quick brown cat jumps over the lazy dog\",\n\t\t\texpected: \"The quick brown [-fox][+cat] jumps over the lazy dog\",\n\t\t},\n\t\t{\n\t\t\tname: \"Prefix and suffix\",\n\t\t\told: \"Hello, world!\",\n\t\t\tnew: \"Hello, beautiful world!\",\n\t\t\texpected: \"Hello, [+beautiful ]world!\",\n\t\t},\n\t\t{\n\t\t\tname: \"Complete change\",\n\t\t\told: \"abcdef\",\n\t\t\tnew: \"ghijkl\",\n\t\t\texpected: \"[-abcdef][+ghijkl]\",\n\t\t},\n\t\t{\n\t\t\tname: \"Empty strings\",\n\t\t\told: \"\",\n\t\t\tnew: \"\",\n\t\t\texpected: \"\",\n\t\t},\n\t\t{\n\t\t\tname: \"Old empty\",\n\t\t\told: \"\",\n\t\t\tnew: \"abc\",\n\t\t\texpected: \"[+abc]\",\n\t\t},\n\t\t{\n\t\t\tname: \"New empty\",\n\t\t\told: \"abc\",\n\t\t\tnew: \"\",\n\t\t\texpected: \"[-abc]\",\n\t\t},\n\t\t{\n\t\t\tname: \"non-ascii (Korean characters)\",\n\t\t\told: \"ASCII 문자가 아닌 것도 되나?\",\n\t\t\tnew: \"ASCII 문자가 아닌 것도 됨.\",\n\t\t\texpected: \"ASCII 문자가 아닌 것도 [-되나?][+됨.]\",\n\t\t},\n\t\t{\n\t\t\tname: \"Emoji diff\",\n\t\t\told: \"Hello 👋 World 🌍\",\n\t\t\tnew: \"Hello 👋 Beautiful 🌸 World 🌍\",\n\t\t\texpected: \"Hello 👋 [+Beautiful 🌸 ]World 🌍\",\n\t\t},\n\t\t{\n\t\t\tname: \"Mixed multibyte and ASCII\",\n\t\t\told: \"こんにちは World\",\n\t\t\tnew: \"こんばんは World\",\n\t\t\texpected: \"こん[-にち][+ばん]は World\",\n\t\t},\n\t\t{\n\t\t\tname: \"Chinese characters\",\n\t\t\told: \"我喜欢编程\",\n\t\t\tnew: \"我喜欢看书和编程\",\n\t\t\texpected: \"我喜欢[+看书和]编程\",\n\t\t},\n\t\t{\n\t\t\tname: \"Combining characters\",\n\t\t\told: \"e\\u0301\", // é (e + ´)\n\t\t\tnew: \"e\\u0300\", // è (e + `)\n\t\t\texpected: \"e[-\\u0301][+\\u0300]\",\n\t\t},\n\t\t{\n\t\t\tname: \"Right-to-Left languages\",\n\t\t\told: \"שלום\",\n\t\t\tnew: \"שלום עולם\",\n\t\t\texpected: \"שלום[+ עולם]\",\n\t\t},\n\t\t{\n\t\t\tname: \"Normalization NFC and NFD\",\n\t\t\told: \"e\\u0301\", // NFD (decomposed)\n\t\t\tnew: \"\\u00e9\", // NFC (precomposed)\n\t\t\texpected: \"[-e\\u0301][+\\u00e9]\",\n\t\t},\n\t\t{\n\t\t\tname: \"Case sensitivity\",\n\t\t\told: \"abc\",\n\t\t\tnew: \"Abc\",\n\t\t\texpected: \"[-a][+A]bc\",\n\t\t},\n\t\t{\n\t\t\tname: \"Surrogate pairs\",\n\t\t\told: \"Hello 🌍\",\n\t\t\tnew: \"Hello 🌎\",\n\t\t\texpected: \"Hello [-🌍][+🌎]\",\n\t\t},\n\t\t{\n\t\t\tname: \"Control characters\",\n\t\t\told: \"Line1\\nLine2\",\n\t\t\tnew: \"Line1\\r\\nLine2\",\n\t\t\texpected: \"Line1[+\\r]\\nLine2\",\n\t\t},\n\t\t{\n\t\t\tname: \"Mixed scripts\",\n\t\t\told: \"Hello नमस्ते こんにちは\",\n\t\t\tnew: \"Hello สวัสดี こんにちは\",\n\t\t\texpected: \"Hello [-नमस्ते][+สวัสดี] こんにちは\",\n\t\t},\n\t\t{\n\t\t\tname: \"Unicode normalization\",\n\t\t\told: \"é\", // U+00E9 (precomposed)\n\t\t\tnew: \"e\\u0301\", // U+0065 U+0301 (decomposed)\n\t\t\texpected: \"[-é][+e\\u0301]\",\n\t\t},\n\t\t{\n\t\t\tname: \"Directional marks\",\n\t\t\told: \"Hello\\u200Eworld\", // LTR mark\n\t\t\tnew: \"Hello\\u200Fworld\", // RTL mark\n\t\t\texpected: \"Hello[-\\u200E][+\\u200F]world\",\n\t\t},\n\t\t{\n\t\t\tname: \"Zero-width characters\",\n\t\t\told: \"ab\\u200Bc\", // Zero-width space\n\t\t\tnew: \"abc\",\n\t\t\texpected: \"ab[-\\u200B]c\",\n\t\t},\n\t\t{\n\t\t\tname: \"Worst-case scenario (completely different strings)\",\n\t\t\told: strings.Repeat(\"a\", 1000),\n\t\t\tnew: strings.Repeat(\"b\", 1000),\n\t\t\texpected: \"[-\" + strings.Repeat(\"a\", 1000) + \"][+\" + strings.Repeat(\"b\", 1000) + \"]\",\n\t\t},\n\t\t{\n\t\t\tname: \"Very long strings\",\n\t\t\told: strings.Repeat(\"a\", 10000) + \"b\" + strings.Repeat(\"a\", 10000),\n\t\t\tnew: strings.Repeat(\"a\", 10000) + \"c\" + strings.Repeat(\"a\", 10000),\n\t\t\texpected: strings.Repeat(\"a\", 10000) + \"[-b][+c]\" + strings.Repeat(\"a\", 10000),\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tdiff := MyersDiff(tc.old, tc.new)\n\t\t\tresult := Format(diff)\n\t\t\tif result != tc.expected {\n\t\t\t\tt.Errorf(\"Expected: %s, got: %s\", tc.expected, result)\n\t\t\t}\n\t\t})\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"uassert","path":"gno.land/p/demo/uassert","files":[{"name":"doc.gno","body":"package uassert // import \"gno.land/p/demo/uassert\"\n"},{"name":"helpers.gno","body":"package uassert\n\nimport \"strings\"\n\nfunc fail(t TestingT, customMsgs []string, failureMessage string, args ...interface{}) bool {\n\tcustomMsg := \"\"\n\tif len(customMsgs) \u003e 0 {\n\t\tcustomMsg = strings.Join(customMsgs, \" \")\n\t}\n\tif customMsg != \"\" {\n\t\tfailureMessage += \" - \" + customMsg\n\t}\n\tt.Errorf(failureMessage, args...)\n\treturn false\n}\n\nfunc autofail(t TestingT, success bool, customMsgs []string, failureMessage string, args ...interface{}) bool {\n\tif success {\n\t\treturn true\n\t}\n\treturn fail(t, customMsgs, failureMessage, args...)\n}\n\nfunc checkDidPanic(f func()) (didPanic bool, message string) {\n\tdidPanic = true\n\tdefer func() {\n\t\tr := recover()\n\n\t\tif r == nil {\n\t\t\tmessage = \"nil\"\n\t\t\treturn\n\t\t}\n\n\t\terr, ok := r.(error)\n\t\tif ok {\n\t\t\tmessage = err.Error()\n\t\t\treturn\n\t\t}\n\n\t\terrStr, ok := r.(string)\n\t\tif ok {\n\t\t\tmessage = errStr\n\t\t\treturn\n\t\t}\n\n\t\tmessage = \"recover: unsupported type\"\n\t}()\n\tf()\n\tdidPanic = false\n\treturn\n}\n"},{"name":"mock_test.gno","body":"package uassert\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n)\n\ntype mockTestingT struct {\n\tfmt string\n\targs []interface{}\n}\n\n// --- interface mock\n\nvar _ TestingT = (*mockTestingT)(nil)\n\nfunc (mockT *mockTestingT) Helper() { /* noop */ }\nfunc (mockT *mockTestingT) Skip(args ...interface{}) { /* not implmented */ }\nfunc (mockT *mockTestingT) Fail() { /* not implmented */ }\nfunc (mockT *mockTestingT) FailNow() { /* not implmented */ }\nfunc (mockT *mockTestingT) Logf(fmt string, args ...interface{}) { /* noop */ }\n\nfunc (mockT *mockTestingT) Fatalf(fmt string, args ...interface{}) {\n\tmockT.fmt = \"fatal: \" + fmt\n\tmockT.args = args\n}\n\nfunc (mockT *mockTestingT) Errorf(fmt string, args ...interface{}) {\n\tmockT.fmt = \"error: \" + fmt\n\tmockT.args = args\n}\n\n// --- helpers\n\nfunc (mockT *mockTestingT) actualString() string {\n\tres := fmt.Sprintf(mockT.fmt, mockT.args...)\n\tmockT.reset()\n\treturn res\n}\n\nfunc (mockT *mockTestingT) reset() {\n\tmockT.fmt = \"\"\n\tmockT.args = nil\n}\n\nfunc (mockT *mockTestingT) equals(t *testing.T, expected string) {\n\tactual := mockT.actualString()\n\n\tif expected != actual {\n\t\tt.Errorf(\"mockT differs:\\n- expected: %s\\n- actual: %s\\n\", expected, actual)\n\t}\n}\n\nfunc (mockT *mockTestingT) empty(t *testing.T) {\n\tif mockT.fmt != \"\" || mockT.args != nil {\n\t\tactual := mockT.actualString()\n\t\tt.Errorf(\"mockT should be empty, got %s\", actual)\n\t}\n}\n"},{"name":"types.gno","body":"package uassert\n\ntype TestingT interface {\n\tHelper()\n\tSkip(args ...interface{})\n\tFatalf(fmt string, args ...interface{})\n\tErrorf(fmt string, args ...interface{})\n\tLogf(fmt string, args ...interface{})\n\tFail()\n\tFailNow()\n}\n"},{"name":"uassert.gno","body":"// uassert is an adapted lighter version of https://github.com/stretchr/testify/assert.\npackage uassert\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/diff\"\n)\n\n// NoError asserts that a function returned no error (i.e. `nil`).\nfunc NoError(t TestingT, err error, msgs ...string) bool {\n\tt.Helper()\n\tif err != nil {\n\t\treturn fail(t, msgs, \"unexpected error: %s\", err.Error())\n\t}\n\treturn true\n}\n\n// Error asserts that a function returned an error (i.e. not `nil`).\nfunc Error(t TestingT, err error, msgs ...string) bool {\n\tt.Helper()\n\tif err == nil {\n\t\treturn fail(t, msgs, \"an error is expected but got nil\")\n\t}\n\treturn true\n}\n\n// ErrorContains asserts that a function returned an error (i.e. not `nil`)\n// and that the error contains the specified substring.\nfunc ErrorContains(t TestingT, err error, contains string, msgs ...string) bool {\n\tt.Helper()\n\n\tif !Error(t, err, msgs...) {\n\t\treturn false\n\t}\n\n\tactual := err.Error()\n\tif !strings.Contains(actual, contains) {\n\t\treturn fail(t, msgs, \"error %q does not contain %q\", actual, contains)\n\t}\n\n\treturn true\n}\n\n// True asserts that the specified value is true.\nfunc True(t TestingT, value bool, msgs ...string) bool {\n\tt.Helper()\n\tif !value {\n\t\treturn fail(t, msgs, \"should be true\")\n\t}\n\treturn true\n}\n\n// False asserts that the specified value is false.\nfunc False(t TestingT, value bool, msgs ...string) bool {\n\tt.Helper()\n\tif value {\n\t\treturn fail(t, msgs, \"should be false\")\n\t}\n\treturn true\n}\n\n// ErrorIs asserts the given error matches the target error\nfunc ErrorIs(t TestingT, err, target error, msgs ...string) bool {\n\tt.Helper()\n\n\tif err == nil || target == nil {\n\t\treturn err == target\n\t}\n\n\t// XXX: if errors.Is(err, target) return true\n\n\tif err.Error() != target.Error() {\n\t\treturn fail(t, msgs, \"error mismatch, expected %s, got %s\", target.Error(), err.Error())\n\t}\n\n\treturn true\n}\n\n// PanicsWithMessage asserts that the code inside the specified func panics,\n// and that the recovered panic value satisfies the given message\nfunc PanicsWithMessage(t TestingT, msg string, f func(), msgs ...string) bool {\n\tt.Helper()\n\n\tdidPanic, panicValue := checkDidPanic(f)\n\tif !didPanic {\n\t\treturn fail(t, msgs, \"func should panic\\n\\tPanic value:\\t%v\", panicValue)\n\t}\n\n\tif panicValue != msg {\n\t\treturn fail(t, msgs, \"func should panic with message:\\t%s\\n\\tPanic value:\\t%s\", msg, panicValue)\n\t}\n\treturn true\n}\n\n// NotPanics asserts that the code inside the specified func does NOT panic.\nfunc NotPanics(t TestingT, f func(), msgs ...string) bool {\n\tt.Helper()\n\n\tdidPanic, panicValue := checkDidPanic(f)\n\n\tif didPanic {\n\t\treturn fail(t, msgs, \"func should not panic\\n\\tPanic value:\\t%s\", panicValue)\n\t}\n\treturn true\n}\n\n// Equal asserts that two objects are equal.\nfunc Equal(t TestingT, expected, actual interface{}, msgs ...string) bool {\n\tt.Helper()\n\n\tif expected == nil || actual == nil {\n\t\treturn expected == actual\n\t}\n\n\t// XXX: errors\n\t// XXX: slices\n\t// XXX: pointers\n\n\tequal := false\n\tok_ := false\n\tes, as := \"unsupported type\", \"unsupported type\"\n\n\tswitch ev := expected.(type) {\n\tcase string:\n\t\tif av, ok := actual.(string); ok {\n\t\t\tequal = ev == av\n\t\t\tok_ = true\n\t\t\tes, as = ev, av\n\t\t\tif !equal {\n\t\t\t\tdif := diff.MyersDiff(ev, av)\n\t\t\t\treturn fail(t, msgs, \"uassert.Equal: strings are different\\n\\tDiff: %s\", diff.Format(dif))\n\t\t\t}\n\t\t}\n\tcase std.Address:\n\t\tif av, ok := actual.(std.Address); ok {\n\t\t\tequal = ev == av\n\t\t\tok_ = true\n\t\t\tes, as = string(ev), string(av)\n\t\t}\n\tcase int:\n\t\tif av, ok := actual.(int); ok {\n\t\t\tequal = ev == av\n\t\t\tok_ = true\n\t\t\tes, as = strconv.Itoa(ev), strconv.Itoa(av)\n\t\t}\n\tcase int8:\n\t\tif av, ok := actual.(int8); ok {\n\t\t\tequal = ev == av\n\t\t\tok_ = true\n\t\t\tes, as = strconv.Itoa(int(ev)), strconv.Itoa(int(av))\n\t\t}\n\tcase int16:\n\t\tif av, ok := actual.(int16); ok {\n\t\t\tequal = ev == av\n\t\t\tok_ = true\n\t\t\tes, as = strconv.Itoa(int(ev)), strconv.Itoa(int(av))\n\t\t}\n\tcase int32:\n\t\tif av, ok := actual.(int32); ok {\n\t\t\tequal = ev == av\n\t\t\tok_ = true\n\t\t\tes, as = strconv.Itoa(int(ev)), strconv.Itoa(int(av))\n\t\t}\n\tcase int64:\n\t\tif av, ok := actual.(int64); ok {\n\t\t\tequal = ev == av\n\t\t\tok_ = true\n\t\t\tes, as = strconv.Itoa(int(ev)), strconv.Itoa(int(av))\n\t\t}\n\tcase uint:\n\t\tif av, ok := actual.(uint); ok {\n\t\t\tequal = ev == av\n\t\t\tok_ = true\n\t\t\tes, as = strconv.FormatUint(uint64(ev), 10), strconv.FormatUint(uint64(av), 10)\n\t\t}\n\tcase uint8:\n\t\tif av, ok := actual.(uint8); ok {\n\t\t\tequal = ev == av\n\t\t\tok_ = true\n\t\t\tes, as = strconv.FormatUint(uint64(ev), 10), strconv.FormatUint(uint64(av), 10)\n\t\t}\n\tcase uint16:\n\t\tif av, ok := actual.(uint16); ok {\n\t\t\tequal = ev == av\n\t\t\tok_ = true\n\t\t\tes, as = strconv.FormatUint(uint64(ev), 10), strconv.FormatUint(uint64(av), 10)\n\t\t}\n\tcase uint32:\n\t\tif av, ok := actual.(uint32); ok {\n\t\t\tequal = ev == av\n\t\t\tok_ = true\n\t\t\tes, as = strconv.FormatUint(uint64(ev), 10), strconv.FormatUint(uint64(av), 10)\n\t\t}\n\tcase uint64:\n\t\tif av, ok := actual.(uint64); ok {\n\t\t\tequal = ev == av\n\t\t\tok_ = true\n\t\t\tes, as = strconv.FormatUint(ev, 10), strconv.FormatUint(av, 10)\n\t\t}\n\tcase bool:\n\t\tif av, ok := actual.(bool); ok {\n\t\t\tequal = ev == av\n\t\t\tok_ = true\n\t\t\tif ev {\n\t\t\t\tes, as = \"true\", \"false\"\n\t\t\t} else {\n\t\t\t\tes, as = \"false\", \"true\"\n\t\t\t}\n\t\t}\n\tcase float32:\n\t\tif av, ok := actual.(float32); ok {\n\t\t\tequal = ev == av\n\t\t\tok_ = true\n\t\t}\n\tcase float64:\n\t\tif av, ok := actual.(float64); ok {\n\t\t\tequal = ev == av\n\t\t\tok_ = true\n\t\t}\n\tdefault:\n\t\treturn fail(t, msgs, \"uassert.Equal: unsupported type\")\n\t}\n\n\t/*\n\t\t// XXX: implement stringer and other well known similar interfaces\n\t\ttype stringer interface{ String() string }\n\t\tif ev, ok := expected.(stringer); ok {\n\t\t\tif av, ok := actual.(stringer); ok {\n\t\t\t\tequal = ev.String() == av.String()\n\t\t\t\tok_ = true\n\t\t\t}\n\t\t}\n\t*/\n\n\tif !ok_ {\n\t\treturn fail(t, msgs, \"uassert.Equal: different types\") // XXX: display the types\n\t}\n\tif !equal {\n\t\treturn fail(t, msgs, \"uassert.Equal: same type but different value\\n\\texpected: %s\\n\\tactual: %s\", es, as)\n\t}\n\n\treturn true\n}\n\n// NotEqual asserts that two objects are not equal.\nfunc NotEqual(t TestingT, expected, actual interface{}, msgs ...string) bool {\n\tt.Helper()\n\n\tif expected == nil || actual == nil {\n\t\treturn expected != actual\n\t}\n\n\t// XXX: errors\n\t// XXX: slices\n\t// XXX: pointers\n\n\tnotEqual := false\n\tok_ := false\n\tes, as := \"unsupported type\", \"unsupported type\"\n\n\tswitch ev := expected.(type) {\n\tcase string:\n\t\tif av, ok := actual.(string); ok {\n\t\t\tnotEqual = ev != av\n\t\t\tok_ = true\n\t\t\tes, as = ev, as\n\t\t}\n\tcase std.Address:\n\t\tif av, ok := actual.(std.Address); ok {\n\t\t\tnotEqual = ev != av\n\t\t\tok_ = true\n\t\t\tes, as = string(ev), string(av)\n\t\t}\n\tcase int:\n\t\tif av, ok := actual.(int); ok {\n\t\t\tnotEqual = ev != av\n\t\t\tok_ = true\n\t\t\tes, as = strconv.Itoa(ev), strconv.Itoa(av)\n\t\t}\n\tcase int8:\n\t\tif av, ok := actual.(int8); ok {\n\t\t\tnotEqual = ev != av\n\t\t\tok_ = true\n\t\t\tes, as = strconv.Itoa(int(ev)), strconv.Itoa(int(av))\n\t\t}\n\tcase int16:\n\t\tif av, ok := actual.(int16); ok {\n\t\t\tnotEqual = ev != av\n\t\t\tok_ = true\n\t\t\tes, as = strconv.Itoa(int(ev)), strconv.Itoa(int(av))\n\t\t}\n\tcase int32:\n\t\tif av, ok := actual.(int32); ok {\n\t\t\tnotEqual = ev != av\n\t\t\tok_ = true\n\t\t\tes, as = strconv.Itoa(int(ev)), strconv.Itoa(int(av))\n\t\t}\n\tcase int64:\n\t\tif av, ok := actual.(int64); ok {\n\t\t\tnotEqual = ev != av\n\t\t\tok_ = true\n\t\t\tes, as = strconv.Itoa(int(ev)), strconv.Itoa(int(av))\n\t\t}\n\tcase uint:\n\t\tif av, ok := actual.(uint); ok {\n\t\t\tnotEqual = ev != av\n\t\t\tok_ = true\n\t\t\tes, as = strconv.FormatUint(uint64(ev), 10), strconv.FormatUint(uint64(av), 10)\n\t\t}\n\tcase uint8:\n\t\tif av, ok := actual.(uint8); ok {\n\t\t\tnotEqual = ev != av\n\t\t\tok_ = true\n\t\t\tes, as = strconv.FormatUint(uint64(ev), 10), strconv.FormatUint(uint64(av), 10)\n\t\t}\n\tcase uint16:\n\t\tif av, ok := actual.(uint16); ok {\n\t\t\tnotEqual = ev != av\n\t\t\tok_ = true\n\t\t\tes, as = strconv.FormatUint(uint64(ev), 10), strconv.FormatUint(uint64(av), 10)\n\t\t}\n\tcase uint32:\n\t\tif av, ok := actual.(uint32); ok {\n\t\t\tnotEqual = ev != av\n\t\t\tok_ = true\n\t\t\tes, as = strconv.FormatUint(uint64(ev), 10), strconv.FormatUint(uint64(av), 10)\n\t\t}\n\tcase uint64:\n\t\tif av, ok := actual.(uint64); ok {\n\t\t\tnotEqual = ev != av\n\t\t\tok_ = true\n\t\t\tes, as = strconv.FormatUint(ev, 10), strconv.FormatUint(av, 10)\n\t\t}\n\tcase bool:\n\t\tif av, ok := actual.(bool); ok {\n\t\t\tnotEqual = ev != av\n\t\t\tok_ = true\n\t\t\tif ev {\n\t\t\t\tes, as = \"true\", \"false\"\n\t\t\t} else {\n\t\t\t\tes, as = \"false\", \"true\"\n\t\t\t}\n\t\t}\n\tcase float32:\n\t\tif av, ok := actual.(float32); ok {\n\t\t\tnotEqual = ev != av\n\t\t\tok_ = true\n\t\t}\n\tcase float64:\n\t\tif av, ok := actual.(float64); ok {\n\t\t\tnotEqual = ev != av\n\t\t\tok_ = true\n\t\t}\n\tdefault:\n\t\treturn fail(t, msgs, \"uassert.NotEqual: unsupported type\")\n\t}\n\n\t/*\n\t\t// XXX: implement stringer and other well known similar interfaces\n\t\ttype stringer interface{ String() string }\n\t\tif ev, ok := expected.(stringer); ok {\n\t\t\tif av, ok := actual.(stringer); ok {\n\t\t\t\tnotEqual = ev.String() != av.String()\n\t\t\t\tok_ = true\n\t\t\t}\n\t\t}\n\t*/\n\n\tif !ok_ {\n\t\treturn fail(t, msgs, \"uassert.NotEqual: different types\") // XXX: display the types\n\t}\n\tif !notEqual {\n\t\treturn fail(t, msgs, \"uassert.NotEqual: same type and same value\\n\\texpected: %s\\n\\tactual: %s\", es, as)\n\t}\n\n\treturn true\n}\n\nfunc isNumberEmpty(n interface{}) (isNumber, isEmpty bool) {\n\tswitch n := n.(type) {\n\t// NOTE: the cases are split individually, so that n becomes of the\n\t// asserted type; the type of '0' was correctly inferred and converted\n\t// to the corresponding type, int, int8, etc.\n\tcase int:\n\t\treturn true, n == 0\n\tcase int8:\n\t\treturn true, n == 0\n\tcase int16:\n\t\treturn true, n == 0\n\tcase int32:\n\t\treturn true, n == 0\n\tcase int64:\n\t\treturn true, n == 0\n\tcase uint:\n\t\treturn true, n == 0\n\tcase uint8:\n\t\treturn true, n == 0\n\tcase uint16:\n\t\treturn true, n == 0\n\tcase uint32:\n\t\treturn true, n == 0\n\tcase uint64:\n\t\treturn true, n == 0\n\tcase float32:\n\t\treturn true, n == 0\n\tcase float64:\n\t\treturn true, n == 0\n\t}\n\treturn false, false\n}\nfunc Empty(t TestingT, obj interface{}, msgs ...string) bool {\n\tt.Helper()\n\n\tisNumber, isEmpty := isNumberEmpty(obj)\n\tif isNumber {\n\t\tif !isEmpty {\n\t\t\treturn fail(t, msgs, \"uassert.Empty: not empty number: %d\", obj)\n\t\t}\n\t} else {\n\t\tswitch val := obj.(type) {\n\t\tcase string:\n\t\t\tif val != \"\" {\n\t\t\t\treturn fail(t, msgs, \"uassert.Empty: not empty string: %s\", val)\n\t\t\t}\n\t\tcase std.Address:\n\t\t\tvar zeroAddr std.Address\n\t\t\tif val != zeroAddr {\n\t\t\t\treturn fail(t, msgs, \"uassert.Empty: not empty std.Address: %s\", string(val))\n\t\t\t}\n\t\tdefault:\n\t\t\treturn fail(t, msgs, \"uassert.Empty: unsupported type\")\n\t\t}\n\t}\n\treturn true\n}\n\nfunc NotEmpty(t TestingT, obj interface{}, msgs ...string) bool {\n\tt.Helper()\n\tisNumber, isEmpty := isNumberEmpty(obj)\n\tif isNumber {\n\t\tif isEmpty {\n\t\t\treturn fail(t, msgs, \"uassert.NotEmpty: empty number: %d\", obj)\n\t\t}\n\t} else {\n\t\tswitch val := obj.(type) {\n\t\tcase string:\n\t\t\tif val == \"\" {\n\t\t\t\treturn fail(t, msgs, \"uassert.NotEmpty: empty string: %s\", val)\n\t\t\t}\n\t\tcase std.Address:\n\t\t\tvar zeroAddr std.Address\n\t\t\tif val == zeroAddr {\n\t\t\t\treturn fail(t, msgs, \"uassert.NotEmpty: empty std.Address: %s\", string(val))\n\t\t\t}\n\t\tdefault:\n\t\t\treturn fail(t, msgs, \"uassert.NotEmpty: unsupported type\")\n\t\t}\n\t}\n\treturn true\n}\n"},{"name":"uassert_test.gno","body":"package uassert\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"std\"\n\t\"testing\"\n)\n\nvar _ TestingT = (*testing.T)(nil)\n\nfunc TestMock(t *testing.T) {\n\tmockT := new(mockTestingT)\n\tmockT.empty(t)\n\tNoError(mockT, errors.New(\"foo\"))\n\tmockT.equals(t, \"error: unexpected error: foo\")\n\tNoError(mockT, errors.New(\"foo\"), \"custom message\")\n\tmockT.equals(t, \"error: unexpected error: foo - custom message\")\n\tNoError(mockT, errors.New(\"foo\"), \"custom\", \"message\")\n\tmockT.equals(t, \"error: unexpected error: foo - custom message\")\n}\n\nfunc TestNoError(t *testing.T) {\n\tmockT := new(mockTestingT)\n\tTrue(t, NoError(mockT, nil))\n\tmockT.empty(t)\n\tFalse(t, NoError(mockT, errors.New(\"foo bar\")))\n\tmockT.equals(t, \"error: unexpected error: foo bar\")\n}\n\nfunc TestError(t *testing.T) {\n\tmockT := new(mockTestingT)\n\tTrue(t, Error(mockT, errors.New(\"foo bar\")))\n\tmockT.empty(t)\n\tFalse(t, Error(mockT, nil))\n\tmockT.equals(t, \"error: an error is expected but got nil\")\n}\n\nfunc TestErrorContains(t *testing.T) {\n\tmockT := new(mockTestingT)\n\n\t// nil error\n\tvar err error\n\tFalse(t, ErrorContains(mockT, err, \"\"), \"ErrorContains should return false for nil arg\")\n}\n\nfunc TestTrue(t *testing.T) {\n\tmockT := new(mockTestingT)\n\tif !True(mockT, true) {\n\t\tt.Error(\"True should return true\")\n\t}\n\tmockT.empty(t)\n\tif True(mockT, false) {\n\t\tt.Error(\"True should return false\")\n\t}\n\tmockT.equals(t, \"error: should be true\")\n}\n\nfunc TestFalse(t *testing.T) {\n\tmockT := new(mockTestingT)\n\tif !False(mockT, false) {\n\t\tt.Error(\"False should return true\")\n\t}\n\tmockT.empty(t)\n\tif False(mockT, true) {\n\t\tt.Error(\"False should return false\")\n\t}\n\tmockT.equals(t, \"error: should be false\")\n}\n\nfunc TestPanicsWithMessage(t *testing.T) {\n\tmockT := new(mockTestingT)\n\tif !PanicsWithMessage(mockT, \"panic\", func() {\n\t\tpanic(errors.New(\"panic\"))\n\t}) {\n\t\tt.Error(\"PanicsWithMessage should return true\")\n\t}\n\tmockT.empty(t)\n\n\tif PanicsWithMessage(mockT, \"Panic!\", func() {\n\t\t// noop\n\t}) {\n\t\tt.Error(\"PanicsWithMessage should return false\")\n\t}\n\tmockT.equals(t, \"error: func should panic\\n\\tPanic value:\\tnil\")\n\n\tif PanicsWithMessage(mockT, \"at the disco\", func() {\n\t\tpanic(errors.New(\"panic\"))\n\t}) {\n\t\tt.Error(\"PanicsWithMessage should return false\")\n\t}\n\tmockT.equals(t, \"error: func should panic with message:\\tat the disco\\n\\tPanic value:\\tpanic\")\n\n\tif PanicsWithMessage(mockT, \"Panic!\", func() {\n\t\tpanic(\"panic\")\n\t}) {\n\t\tt.Error(\"PanicsWithMessage should return false\")\n\t}\n\tmockT.equals(t, \"error: func should panic with message:\\tPanic!\\n\\tPanic value:\\tpanic\")\n}\n\nfunc TestNotPanics(t *testing.T) {\n\tmockT := new(mockTestingT)\n\n\tif !NotPanics(mockT, func() {\n\t\t// noop\n\t}) {\n\t\tt.Error(\"NotPanics should return true\")\n\t}\n\tmockT.empty(t)\n\n\tif NotPanics(mockT, func() {\n\t\tpanic(\"Panic!\")\n\t}) {\n\t\tt.Error(\"NotPanics should return false\")\n\t}\n}\n\nfunc TestEqual(t *testing.T) {\n\tmockT := new(mockTestingT)\n\n\tcases := []struct {\n\t\texpected interface{}\n\t\tactual interface{}\n\t\tresult bool\n\t\tremark string\n\t}{\n\t\t// expected to be equal\n\t\t{\"Hello World\", \"Hello World\", true, \"\"},\n\t\t{123, 123, true, \"\"},\n\t\t{123.5, 123.5, true, \"\"},\n\t\t{nil, nil, true, \"\"},\n\t\t{int32(123), int32(123), true, \"\"},\n\t\t{uint64(123), uint64(123), true, \"\"},\n\t\t{std.Address(\"g12345\"), std.Address(\"g12345\"), true, \"\"},\n\t\t// XXX: continue\n\n\t\t// not expected to be equal\n\t\t{\"Hello World\", 42, false, \"\"},\n\t\t{41, 42, false, \"\"},\n\t\t{10, uint(10), false, \"\"},\n\t\t// XXX: continue\n\n\t\t// expected to raise errors\n\t\t// XXX: todo\n\t}\n\n\tfor _, c := range cases {\n\t\tname := fmt.Sprintf(\"Equal(%v, %v)\", c.expected, c.actual)\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\tres := Equal(mockT, c.expected, c.actual)\n\n\t\t\tif res != c.result {\n\t\t\t\tt.Errorf(\"%s should return %v: %s - %s\", name, c.result, c.remark, mockT.actualString())\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestNotEqual(t *testing.T) {\n\tmockT := new(mockTestingT)\n\n\tcases := []struct {\n\t\texpected interface{}\n\t\tactual interface{}\n\t\tresult bool\n\t\tremark string\n\t}{\n\t\t// expected to be not equal\n\t\t{\"Hello World\", \"Hello\", true, \"\"},\n\t\t{123, 124, true, \"\"},\n\t\t{123.5, 123.6, true, \"\"},\n\t\t{nil, 123, true, \"\"},\n\t\t{int32(123), int32(124), true, \"\"},\n\t\t{uint64(123), uint64(124), true, \"\"},\n\t\t{std.Address(\"g12345\"), std.Address(\"g67890\"), true, \"\"},\n\t\t// XXX: continue\n\n\t\t// not expected to be not equal\n\t\t{\"Hello World\", \"Hello World\", false, \"\"},\n\t\t{123, 123, false, \"\"},\n\t\t{123.5, 123.5, false, \"\"},\n\t\t{nil, nil, false, \"\"},\n\t\t{int32(123), int32(123), false, \"\"},\n\t\t{uint64(123), uint64(123), false, \"\"},\n\t\t{std.Address(\"g12345\"), std.Address(\"g12345\"), false, \"\"},\n\t\t// XXX: continue\n\n\t\t// expected to raise errors\n\t\t// XXX: todo\n\t}\n\n\tfor _, c := range cases {\n\t\tname := fmt.Sprintf(\"NotEqual(%v, %v)\", c.expected, c.actual)\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\tres := NotEqual(mockT, c.expected, c.actual)\n\n\t\t\tif res != c.result {\n\t\t\t\tt.Errorf(\"%s should return %v: %s - %s\", name, c.result, c.remark, mockT.actualString())\n\t\t\t}\n\t\t})\n\t}\n}\n\ntype myStruct struct {\n\tS string\n\tI int\n}\n\nfunc TestEmpty(t *testing.T) {\n\tmockT := new(mockTestingT)\n\n\tcases := []struct {\n\t\tobj interface{}\n\t\texpectedEmpty bool\n\t}{\n\t\t// expected to be empty\n\t\t{\"\", true},\n\t\t{0, true},\n\t\t{int(0), true},\n\t\t{int32(0), true},\n\t\t{int64(0), true},\n\t\t{uint(0), true},\n\t\t// XXX: continue\n\n\t\t// not expected to be empty\n\t\t{\"Hello World\", false},\n\t\t{1, false},\n\t\t{int32(1), false},\n\t\t{uint64(1), false},\n\t\t{std.Address(\"g12345\"), false},\n\n\t\t// unsupported\n\t\t{nil, false},\n\t\t{myStruct{}, false},\n\t\t{\u0026myStruct{}, false},\n\t}\n\n\tfor _, c := range cases {\n\t\tname := fmt.Sprintf(\"Empty(%v)\", c.obj)\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\tres := Empty(mockT, c.obj)\n\n\t\t\tif res != c.expectedEmpty {\n\t\t\t\tt.Errorf(\"%s should return %v: %s\", name, c.expectedEmpty, mockT.actualString())\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestEqualWithStringDiff(t *testing.T) {\n\tcases := []struct {\n\t\tname string\n\t\texpected string\n\t\tactual string\n\t\tshouldPass bool\n\t\texpectedMsg string\n\t}{\n\t\t{\n\t\t\tname: \"Identical strings\",\n\t\t\texpected: \"Hello, world!\",\n\t\t\tactual: \"Hello, world!\",\n\t\t\tshouldPass: true,\n\t\t\texpectedMsg: \"\",\n\t\t},\n\t\t{\n\t\t\tname: \"Different strings - simple\",\n\t\t\texpected: \"Hello, world!\",\n\t\t\tactual: \"Hello, World!\",\n\t\t\tshouldPass: false,\n\t\t\texpectedMsg: \"error: uassert.Equal: strings are different\\n\\tDiff: Hello, [-w][+W]orld!\",\n\t\t},\n\t\t{\n\t\t\tname: \"Different strings - complex\",\n\t\t\texpected: \"The quick brown fox jumps over the lazy dog\",\n\t\t\tactual: \"The quick brown cat jumps over the lazy dog\",\n\t\t\tshouldPass: false,\n\t\t\texpectedMsg: \"error: uassert.Equal: strings are different\\n\\tDiff: The quick brown [-fox][+cat] jumps over the lazy dog\",\n\t\t},\n\t\t{\n\t\t\tname: \"Different strings - prefix\",\n\t\t\texpected: \"prefix_string\",\n\t\t\tactual: \"string\",\n\t\t\tshouldPass: false,\n\t\t\texpectedMsg: \"error: uassert.Equal: strings are different\\n\\tDiff: [-prefix_]string\",\n\t\t},\n\t\t{\n\t\t\tname: \"Different strings - suffix\",\n\t\t\texpected: \"string\",\n\t\t\tactual: \"string_suffix\",\n\t\t\tshouldPass: false,\n\t\t\texpectedMsg: \"error: uassert.Equal: strings are different\\n\\tDiff: string[+_suffix]\",\n\t\t},\n\t\t{\n\t\t\tname: \"Empty string vs non-empty string\",\n\t\t\texpected: \"\",\n\t\t\tactual: \"non-empty\",\n\t\t\tshouldPass: false,\n\t\t\texpectedMsg: \"error: uassert.Equal: strings are different\\n\\tDiff: [+non-empty]\",\n\t\t},\n\t\t{\n\t\t\tname: \"Non-empty string vs empty string\",\n\t\t\texpected: \"non-empty\",\n\t\t\tactual: \"\",\n\t\t\tshouldPass: false,\n\t\t\texpectedMsg: \"error: uassert.Equal: strings are different\\n\\tDiff: [-non-empty]\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tmockT := \u0026mockTestingT{}\n\t\t\tresult := Equal(mockT, tc.expected, tc.actual)\n\n\t\t\tif result != tc.shouldPass {\n\t\t\t\tt.Errorf(\"Expected Equal to return %v, but got %v\", tc.shouldPass, result)\n\t\t\t}\n\n\t\t\tif tc.shouldPass {\n\t\t\t\tmockT.empty(t)\n\t\t\t} else {\n\t\t\t\tmockT.equals(t, tc.expectedMsg)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestNotEmpty(t *testing.T) {\n\tmockT := new(mockTestingT)\n\n\tcases := []struct {\n\t\tobj interface{}\n\t\texpectedNotEmpty bool\n\t}{\n\t\t// expected to be empty\n\t\t{\"\", false},\n\t\t{0, false},\n\t\t{int(0), false},\n\t\t{int32(0), false},\n\t\t{int64(0), false},\n\t\t{uint(0), false},\n\t\t{std.Address(\"\"), false},\n\n\t\t// not expected to be empty\n\t\t{\"Hello World\", true},\n\t\t{1, true},\n\t\t{int32(1), true},\n\t\t{uint64(1), true},\n\t\t{std.Address(\"g12345\"), true},\n\n\t\t// unsupported\n\t\t{nil, false},\n\t\t{myStruct{}, false},\n\t\t{\u0026myStruct{}, false},\n\t}\n\n\tfor _, c := range cases {\n\t\tname := fmt.Sprintf(\"NotEmpty(%v)\", c.obj)\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\tres := NotEmpty(mockT, c.obj)\n\n\t\t\tif res != c.expectedNotEmpty {\n\t\t\t\tt.Errorf(\"%s should return %v: %s\", name, c.expectedNotEmpty, mockT.actualString())\n\t\t\t}\n\t\t})\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"ufmt","path":"gno.land/p/demo/ufmt","files":[{"name":"ufmt.gno","body":"// Package ufmt provides utility functions for formatting strings, similarly\n// to the Go package \"fmt\", of which only a subset is currently supported\n// (hence the name µfmt - micro fmt).\npackage ufmt\n\nimport (\n\t\"errors\"\n\t\"strconv\"\n\t\"strings\"\n)\n\n// Println formats using the default formats for its operands and writes to standard output.\n// Println writes the given arguments to standard output with spaces between arguments\n// and a newline at the end.\nfunc Println(args ...interface{}) {\n\tvar strs []string\n\tfor _, arg := range args {\n\t\tswitch v := arg.(type) {\n\t\tcase string:\n\t\t\tstrs = append(strs, v)\n\t\tcase (interface{ String() string }):\n\t\t\tstrs = append(strs, v.String())\n\t\tcase error:\n\t\t\tstrs = append(strs, v.Error())\n\t\tcase int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64:\n\t\t\tstrs = append(strs, Sprintf(\"%d\", v))\n\t\tcase bool:\n\t\t\tif v {\n\t\t\t\tstrs = append(strs, \"true\")\n\t\t\t} else {\n\t\t\t\tstrs = append(strs, \"false\")\n\t\t\t}\n\t\tcase nil:\n\t\t\tstrs = append(strs, \"\u003cnil\u003e\")\n\t\tdefault:\n\t\t\tstrs = append(strs, \"(unhandled)\")\n\t\t}\n\t}\n\n\t// TODO: remove println after gno supports os.Stdout\n\tprintln(strings.Join(strs, \" \"))\n}\n\n// Sprintf offers similar functionality to Go's fmt.Sprintf, or the sprintf\n// equivalent available in many languages, including C/C++.\n// The number of args passed must exactly match the arguments consumed by the format.\n// A limited number of formatting verbs and features are currently supported,\n// hence the name ufmt (µfmt, micro-fmt).\n//\n// The currently formatted verbs are the following:\n//\n//\t%s: places a string value directly.\n//\t If the value implements the interface interface{ String() string },\n//\t the String() method is called to retrieve the value. Same about Error()\n//\t string.\n//\t%c: formats the character represented by Unicode code point\n//\t%d: formats an integer value using package \"strconv\".\n//\t Currently supports only uint, uint64, int, int64.\n//\t%t: formats a boolean value to \"true\" or \"false\".\n//\t%%: outputs a literal %. Does not consume an argument.\nfunc Sprintf(format string, args ...interface{}) string {\n\t// we use runes to handle multi-byte characters\n\tsTor := []rune(format)\n\tend := len(sTor)\n\targNum := 0\n\targLen := len(args)\n\tbuf := \"\"\n\n\tfor i := 0; i \u003c end; {\n\t\tisLast := i == end-1\n\t\tc := string(sTor[i])\n\n\t\tif isLast || c != \"%\" {\n\t\t\t// we don't check for invalid format like a one ending with \"%\"\n\t\t\tbuf += string(c)\n\t\t\ti++\n\t\t\tcontinue\n\t\t}\n\n\t\tverb := string(sTor[i+1])\n\t\tif verb == \"%\" {\n\t\t\tbuf += \"%\"\n\t\t\ti += 2\n\t\t\tcontinue\n\t\t}\n\n\t\tif argNum \u003e argLen {\n\t\t\tpanic(\"invalid number of arguments to ufmt.Sprintf\")\n\t\t}\n\t\targ := args[argNum]\n\t\targNum++\n\n\t\tswitch verb {\n\t\tcase \"s\":\n\t\t\tswitch v := arg.(type) {\n\t\t\tcase interface{ String() string }:\n\t\t\t\tbuf += v.String()\n\t\t\tcase error:\n\t\t\t\tbuf += v.Error()\n\t\t\tcase string:\n\t\t\t\tbuf += v\n\t\t\tdefault:\n\t\t\t\tbuf += fallback(verb, v)\n\t\t\t}\n\t\tcase \"c\":\n\t\t\tswitch v := arg.(type) {\n\t\t\t// rune is int32. Exclude overflowing numeric types and dups (byte, int32):\n\t\t\tcase rune:\n\t\t\t\tbuf += string(v)\n\t\t\tcase int:\n\t\t\t\tbuf += string(v)\n\t\t\tcase int8:\n\t\t\t\tbuf += string(v)\n\t\t\tcase int16:\n\t\t\t\tbuf += string(v)\n\t\t\tcase uint:\n\t\t\t\tbuf += string(v)\n\t\t\tcase uint8:\n\t\t\t\tbuf += string(v)\n\t\t\tcase uint16:\n\t\t\t\tbuf += string(v)\n\t\t\tdefault:\n\t\t\t\tbuf += fallback(verb, v)\n\t\t\t}\n\t\tcase \"d\":\n\t\t\tswitch v := arg.(type) {\n\t\t\tcase int:\n\t\t\t\tbuf += strconv.Itoa(v)\n\t\t\tcase int8:\n\t\t\t\tbuf += strconv.Itoa(int(v))\n\t\t\tcase int16:\n\t\t\t\tbuf += strconv.Itoa(int(v))\n\t\t\tcase int32:\n\t\t\t\tbuf += strconv.Itoa(int(v))\n\t\t\tcase int64:\n\t\t\t\tbuf += strconv.Itoa(int(v))\n\t\t\tcase uint:\n\t\t\t\tbuf += strconv.FormatUint(uint64(v), 10)\n\t\t\tcase uint8:\n\t\t\t\tbuf += strconv.FormatUint(uint64(v), 10)\n\t\t\tcase uint16:\n\t\t\t\tbuf += strconv.FormatUint(uint64(v), 10)\n\t\t\tcase uint32:\n\t\t\t\tbuf += strconv.FormatUint(uint64(v), 10)\n\t\t\tcase uint64:\n\t\t\t\tbuf += strconv.FormatUint(v, 10)\n\t\t\tdefault:\n\t\t\t\tbuf += fallback(verb, v)\n\t\t\t}\n\t\tcase \"t\":\n\t\t\tswitch v := arg.(type) {\n\t\t\tcase bool:\n\t\t\t\tif v {\n\t\t\t\t\tbuf += \"true\"\n\t\t\t\t} else {\n\t\t\t\t\tbuf += \"false\"\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tbuf += fallback(verb, v)\n\t\t\t}\n\t\t// % handled before, as it does not consume an argument\n\t\tdefault:\n\t\t\tbuf += \"(unhandled verb: %\" + verb + \")\"\n\t\t}\n\n\t\ti += 2\n\t}\n\tif argNum \u003c argLen {\n\t\tpanic(\"too many arguments to ufmt.Sprintf\")\n\t}\n\treturn buf\n}\n\n// This function is used to mimic Go's fmt.Sprintf\n// specific behaviour of showing verb/type mismatches,\n// where for example:\n//\n//\tfmt.Sprintf(\"%d\", \"foo\") gives \"%!d(string=foo)\"\n//\n// Here:\n//\n//\tfallback(\"s\", 8) -\u003e \"%!s(int=8)\"\n//\tfallback(\"d\", nil) -\u003e \"%!d(\u003cnil\u003e)\", and so on.\nfunc fallback(verb string, arg interface{}) string {\n\tvar s string\n\tswitch v := arg.(type) {\n\tcase string:\n\t\ts = \"string=\" + v\n\tcase (interface{ String() string }):\n\t\ts = \"string=\" + v.String()\n\tcase error:\n\t\t// note: also \"string=\" in Go fmt\n\t\ts = \"string=\" + v.Error()\n\tcase int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64:\n\t\t// note: rune, byte would be dups, being aliases\n\t\tif typename, e := typeToString(v); e != nil {\n\t\t\tpanic(\"should not happen\")\n\t\t} else {\n\t\t\ts = typename + \"=\" + Sprintf(\"%d\", v)\n\t\t}\n\tcase bool:\n\t\tif v {\n\t\t\ts = \"bool=true\"\n\t\t} else {\n\t\t\ts = \"bool=false\"\n\t\t}\n\tcase nil:\n\t\ts = \"\u003cnil\u003e\"\n\tdefault:\n\t\ts = \"(unhandled)\"\n\t}\n\treturn \"%!\" + verb + \"(\" + s + \")\"\n}\n\n// Get the name of the type of `v` as a string.\n// The recognized type of v is currently limited to native non-composite types.\n// An error is returned otherwise.\nfunc typeToString(v interface{}) (string, error) {\n\tswitch v.(type) {\n\tcase string:\n\t\treturn \"string\", nil\n\tcase int:\n\t\treturn \"int\", nil\n\tcase int8:\n\t\treturn \"int8\", nil\n\tcase int16:\n\t\treturn \"int16\", nil\n\tcase int32:\n\t\treturn \"int32\", nil\n\tcase int64:\n\t\treturn \"int64\", nil\n\tcase uint:\n\t\treturn \"uint\", nil\n\tcase uint8:\n\t\treturn \"uint8\", nil\n\tcase uint16:\n\t\treturn \"uint16\", nil\n\tcase uint32:\n\t\treturn \"uint32\", nil\n\tcase uint64:\n\t\treturn \"uint64\", nil\n\tcase float32:\n\t\treturn \"float32\", nil\n\tcase float64:\n\t\treturn \"float64\", nil\n\tcase bool:\n\t\treturn \"bool\", nil\n\tdefault:\n\t\treturn \"\", errors.New(\"(unsupported type)\")\n\t}\n}\n\n// errMsg implements the error interface.\ntype errMsg struct {\n\tmsg string\n}\n\n// Error defines the requirements of the error interface.\n// It functions similarly to Go's errors.New()\nfunc (e *errMsg) Error() string {\n\treturn e.msg\n}\n\n// Errorf is a function that mirrors the functionality of fmt.Errorf.\n//\n// It takes a format string and arguments to create a formatted string,\n// then sets this string as the 'msg' field of an errMsg struct and returns a pointer to this struct.\n//\n// This function operates in a similar manner to Go's fmt.Errorf,\n// providing a way to create formatted error messages.\n//\n// The currently formatted verbs are the following:\n//\n//\t%s: places a string value directly.\n//\t If the value implements the interface interface{ String() string },\n//\t the String() method is called to retrieve the value. Same for error.\n//\t%c: formats the character represented by Unicode code point\n//\t%d: formats an integer value using package \"strconv\".\n//\t Currently supports only uint, uint64, int, int64.\n//\t%t: formats a boolean value to \"true\" or \"false\".\n//\t%%: outputs a literal %. Does not consume an argument.\nfunc Errorf(format string, args ...interface{}) error {\n\treturn \u0026errMsg{Sprintf(format, args...)}\n}\n"},{"name":"ufmt_test.gno","body":"package ufmt\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"testing\"\n)\n\ntype stringer struct{}\n\nfunc (stringer) String() string {\n\treturn \"I'm a stringer\"\n}\n\nfunc TestSprintf(t *testing.T) {\n\ttru := true\n\tcases := []struct {\n\t\tformat string\n\t\tvalues []interface{}\n\t\texpectedOutput string\n\t}{\n\t\t{\"hello %s!\", []interface{}{\"planet\"}, \"hello planet!\"},\n\t\t{\"hi %%%s!\", []interface{}{\"worl%d\"}, \"hi %worl%d!\"},\n\t\t{\"%s %c %d %t\", []interface{}{\"foo\", 'α', 421, true}, \"foo α 421 true\"},\n\t\t{\"string [%s]\", []interface{}{\"foo\"}, \"string [foo]\"},\n\t\t{\"int [%d]\", []interface{}{int(42)}, \"int [42]\"},\n\t\t{\"int8 [%d]\", []interface{}{int8(8)}, \"int8 [8]\"},\n\t\t{\"int16 [%d]\", []interface{}{int16(16)}, \"int16 [16]\"},\n\t\t{\"int32 [%d]\", []interface{}{int32(32)}, \"int32 [32]\"},\n\t\t{\"int64 [%d]\", []interface{}{int64(64)}, \"int64 [64]\"},\n\t\t{\"uint [%d]\", []interface{}{uint(42)}, \"uint [42]\"},\n\t\t{\"uint8 [%d]\", []interface{}{uint8(8)}, \"uint8 [8]\"},\n\t\t{\"uint16 [%d]\", []interface{}{uint16(16)}, \"uint16 [16]\"},\n\t\t{\"uint32 [%d]\", []interface{}{uint32(32)}, \"uint32 [32]\"},\n\t\t{\"uint64 [%d]\", []interface{}{uint64(64)}, \"uint64 [64]\"},\n\t\t{\"bool [%t]\", []interface{}{true}, \"bool [true]\"},\n\t\t{\"bool [%t]\", []interface{}{false}, \"bool [false]\"},\n\t\t{\"no args\", nil, \"no args\"},\n\t\t{\"finish with %\", nil, \"finish with %\"},\n\t\t{\"stringer [%s]\", []interface{}{stringer{}}, \"stringer [I'm a stringer]\"},\n\t\t{\"â\", nil, \"â\"},\n\t\t{\"Hello, World! 😊\", nil, \"Hello, World! 😊\"},\n\t\t{\"unicode formatting: %s\", []interface{}{\"😊\"}, \"unicode formatting: 😊\"},\n\t\t// mismatch printing\n\t\t{\"%s\", []interface{}{nil}, \"%!s(\u003cnil\u003e)\"},\n\t\t{\"%s\", []interface{}{421}, \"%!s(int=421)\"},\n\t\t{\"%s\", []interface{}{\"z\"}, \"z\"},\n\t\t{\"%s\", []interface{}{tru}, \"%!s(bool=true)\"},\n\t\t{\"%s\", []interface{}{'z'}, \"%!s(int32=122)\"},\n\n\t\t{\"%c\", []interface{}{nil}, \"%!c(\u003cnil\u003e)\"},\n\t\t{\"%c\", []interface{}{421}, \"ƥ\"},\n\t\t{\"%c\", []interface{}{\"z\"}, \"%!c(string=z)\"},\n\t\t{\"%c\", []interface{}{tru}, \"%!c(bool=true)\"},\n\t\t{\"%c\", []interface{}{'z'}, \"z\"},\n\n\t\t{\"%d\", []interface{}{nil}, \"%!d(\u003cnil\u003e)\"},\n\t\t{\"%d\", []interface{}{421}, \"421\"},\n\t\t{\"%d\", []interface{}{\"z\"}, \"%!d(string=z)\"},\n\t\t{\"%d\", []interface{}{tru}, \"%!d(bool=true)\"},\n\t\t{\"%d\", []interface{}{'z'}, \"122\"},\n\n\t\t{\"%t\", []interface{}{nil}, \"%!t(\u003cnil\u003e)\"},\n\t\t{\"%t\", []interface{}{421}, \"%!t(int=421)\"},\n\t\t{\"%t\", []interface{}{\"z\"}, \"%!t(string=z)\"},\n\t\t{\"%t\", []interface{}{tru}, \"true\"},\n\t\t{\"%t\", []interface{}{'z'}, \"%!t(int32=122)\"},\n\t}\n\n\tfor _, tc := range cases {\n\t\tname := fmt.Sprintf(tc.format, tc.values...)\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\tgot := Sprintf(tc.format, tc.values...)\n\t\t\tif got != tc.expectedOutput {\n\t\t\t\tt.Errorf(\"got %q, want %q.\", got, tc.expectedOutput)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestErrorf(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tformat string\n\t\targs []interface{}\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tname: \"simple string\",\n\t\t\tformat: \"error: %s\",\n\t\t\targs: []interface{}{\"something went wrong\"},\n\t\t\texpected: \"error: something went wrong\",\n\t\t},\n\t\t{\n\t\t\tname: \"integer value\",\n\t\t\tformat: \"value: %d\",\n\t\t\targs: []interface{}{42},\n\t\t\texpected: \"value: 42\",\n\t\t},\n\t\t{\n\t\t\tname: \"boolean value\",\n\t\t\tformat: \"success: %t\",\n\t\t\targs: []interface{}{true},\n\t\t\texpected: \"success: true\",\n\t\t},\n\t\t{\n\t\t\tname: \"multiple values\",\n\t\t\tformat: \"error %d: %s (success=%t)\",\n\t\t\targs: []interface{}{123, \"failure occurred\", false},\n\t\t\texpected: \"error 123: failure occurred (success=false)\",\n\t\t},\n\t\t{\n\t\t\tname: \"literal percent\",\n\t\t\tformat: \"literal %%\",\n\t\t\targs: []interface{}{},\n\t\t\texpected: \"literal %\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\terr := Errorf(tt.format, tt.args...)\n\t\t\tif err.Error() != tt.expected {\n\t\t\t\tt.Errorf(\"Errorf(%q, %v) = %q, expected %q\", tt.format, tt.args, err.Error(), tt.expected)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestPrintErrors(t *testing.T) {\n\tgot := Sprintf(\"error: %s\", errors.New(\"can I be printed?\"))\n\texpectedOutput := \"error: can I be printed?\"\n\tif got != expectedOutput {\n\t\tt.Errorf(\"got %q, want %q.\", got, expectedOutput)\n\t}\n}\n\n// NOTE: Currently, there is no way to get the output of Println without using os.Stdout,\n// so we can only test that it doesn't panic and print arguments well.\nfunc TestPrintln(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\targs []interface{}\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tname: \"Empty args\",\n\t\t\targs: []interface{}{},\n\t\t\texpected: \"\",\n\t\t},\n\t\t{\n\t\t\tname: \"String args\",\n\t\t\targs: []interface{}{\"Hello\", \"World\"},\n\t\t\texpected: \"Hello World\",\n\t\t},\n\t\t{\n\t\t\tname: \"Integer args\",\n\t\t\targs: []interface{}{1, 2, 3},\n\t\t\texpected: \"1 2 3\",\n\t\t},\n\t\t{\n\t\t\tname: \"Mixed args\",\n\t\t\targs: []interface{}{\"Hello\", 42, true, false, \"World\"},\n\t\t\texpected: \"Hello 42 true false World\",\n\t\t},\n\t\t{\n\t\t\tname: \"Unhandled type\",\n\t\t\targs: []interface{}{\"Hello\", 3.14, []int{1, 2, 3}},\n\t\t\texpected: \"Hello (unhandled) (unhandled)\",\n\t\t},\n\t}\n\n\t// TODO: replace os.Stdout with a buffer to capture the output and test it.\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tPrintln(tt.args...)\n\t\t})\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"acl","path":"gno.land/p/demo/acl","files":[{"name":"acl.gno","body":"package acl\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/avl\"\n)\n\nfunc New() *Directory {\n\treturn \u0026Directory{\n\t\tuserGroups: avl.Tree{},\n\t\tpermBuckets: avl.Tree{},\n\t}\n}\n\ntype Directory struct {\n\tpermBuckets avl.Tree // identifier -\u003e perms\n\tuserGroups avl.Tree // std.Address -\u003e []string\n}\n\nfunc (d *Directory) HasPerm(addr std.Address, verb, resource string) bool {\n\t// FIXME: consider memoize.\n\n\t// user perms\n\tif d.getBucketPerms(\"u:\"+addr.String()).hasPerm(verb, resource) {\n\t\treturn true\n\t}\n\n\t// everyone's perms.\n\tif d.getBucketPerms(\"g:\"+Everyone).hasPerm(verb, resource) {\n\t\treturn true\n\t}\n\n\t// user groups' perms.\n\tgroups, ok := d.userGroups.Get(addr.String())\n\tif ok {\n\t\tfor _, group := range groups.([]string) {\n\t\t\tif d.getBucketPerms(\"g:\"+group).hasPerm(verb, resource) {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t}\n\n\treturn false\n}\n\nfunc (d *Directory) getBucketPerms(bucket string) perms {\n\tres, ok := d.permBuckets.Get(bucket)\n\tif ok {\n\t\treturn res.(perms)\n\t}\n\treturn perms{}\n}\n\nfunc (d *Directory) HasRole(addr std.Address, role string) bool {\n\treturn d.HasPerm(addr, \"role\", role)\n}\n\nfunc (d *Directory) AddUserPerm(addr std.Address, verb, resource string) {\n\tbucket := \"u:\" + addr.String()\n\tp := perm{\n\t\tverbs: []string{verb},\n\t\tresources: []string{resource},\n\t}\n\td.addPermToBucket(bucket, p)\n}\n\nfunc (d *Directory) AddGroupPerm(name string, verb, resource string) {\n\tbucket := \"g:\" + name\n\tp := perm{\n\t\tverbs: []string{verb},\n\t\tresources: []string{resource},\n\t}\n\td.addPermToBucket(bucket, p)\n}\n\nfunc (d *Directory) addPermToBucket(bucket string, p perm) {\n\tvar ps perms\n\n\texisting, ok := d.permBuckets.Get(bucket)\n\tif ok {\n\t\tps = existing.(perms)\n\t}\n\tps = append(ps, p)\n\n\td.permBuckets.Set(bucket, ps)\n}\n\nfunc (d *Directory) AddUserToGroup(user std.Address, group string) {\n\texisting, ok := d.userGroups.Get(user.String())\n\tvar groups []string\n\tif ok {\n\t\tgroups = existing.([]string)\n\t}\n\tgroups = append(groups, group)\n\td.userGroups.Set(user.String(), groups)\n}\n\n// TODO: helpers to remove permissions.\n// TODO: helpers to adds multiple permissions at once -\u003e {verbs: []string{\"read\",\"write\"}}.\n// TODO: helpers to delete users from gorups.\n// TODO: helpers to quickly reset states.\n"},{"name":"acl_test.gno","body":"package acl\n\nimport (\n\t\"std\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/p/demo/uassert\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nfunc Test(t *testing.T) {\n\tadm := testutils.TestAddress(\"admin\")\n\tmod := testutils.TestAddress(\"mod\")\n\tusr := testutils.TestAddress(\"user\")\n\tcst := testutils.TestAddress(\"custom\")\n\n\tdir := New()\n\n\t// by default, no one has perm.\n\tshouldNotHasRole(t, dir, adm, \"foo\")\n\tshouldNotHasRole(t, dir, mod, \"foo\")\n\tshouldNotHasRole(t, dir, usr, \"foo\")\n\tshouldNotHasRole(t, dir, cst, \"foo\")\n\tshouldNotHasPerm(t, dir, adm, \"write\", \"r/demo/boards:gnolang/1\")\n\tshouldNotHasPerm(t, dir, mod, \"write\", \"r/demo/boards:gnolang/1\")\n\tshouldNotHasPerm(t, dir, usr, \"write\", \"r/demo/boards:gnolang/1\")\n\tshouldNotHasPerm(t, dir, cst, \"write\", \"r/demo/boards:gnolang/1\")\n\tshouldNotHasPerm(t, dir, adm, \"read\", \"r/demo/boards:gnolang/1\")\n\tshouldNotHasPerm(t, dir, mod, \"read\", \"r/demo/boards:gnolang/1\")\n\tshouldNotHasPerm(t, dir, usr, \"read\", \"r/demo/boards:gnolang/1\")\n\tshouldNotHasPerm(t, dir, cst, \"read\", \"r/demo/boards:gnolang/1\")\n\n\t// adding all the rights to admin.\n\tdir.AddUserPerm(adm, \".*\", \".*\")\n\tshouldHasRole(t, dir, adm, \"foo\")\n\tshouldNotHasRole(t, dir, mod, \"foo\")\n\tshouldNotHasRole(t, dir, usr, \"foo\")\n\tshouldNotHasRole(t, dir, cst, \"foo\")\n\tshouldHasPerm(t, dir, adm, \"write\", \"r/demo/boards:gnolang/1\") // new\n\tshouldNotHasPerm(t, dir, mod, \"write\", \"r/demo/boards:gnolang/1\")\n\tshouldNotHasPerm(t, dir, usr, \"write\", \"r/demo/boards:gnolang/1\")\n\tshouldNotHasPerm(t, dir, cst, \"write\", \"r/demo/boards:gnolang/1\")\n\tshouldHasPerm(t, dir, adm, \"read\", \"r/demo/boards:gnolang/1\") // new\n\tshouldNotHasPerm(t, dir, mod, \"read\", \"r/demo/boards:gnolang/1\")\n\tshouldNotHasPerm(t, dir, usr, \"read\", \"r/demo/boards:gnolang/1\")\n\tshouldNotHasPerm(t, dir, cst, \"read\", \"r/demo/boards:gnolang/1\")\n\n\t// adding custom regexp rule for user \"cst\".\n\tdir.AddUserPerm(cst, \"write\", \"r/demo/boards:gnolang/.*\")\n\tshouldHasRole(t, dir, adm, \"foo\")\n\tshouldNotHasRole(t, dir, mod, \"foo\")\n\tshouldNotHasRole(t, dir, usr, \"foo\")\n\tshouldNotHasRole(t, dir, cst, \"foo\")\n\tshouldHasPerm(t, dir, adm, \"write\", \"r/demo/boards:gnolang/1\")\n\tshouldNotHasPerm(t, dir, mod, \"write\", \"r/demo/boards:gnolang/1\")\n\tshouldNotHasPerm(t, dir, usr, \"write\", \"r/demo/boards:gnolang/1\")\n\tshouldHasPerm(t, dir, cst, \"write\", \"r/demo/boards:gnolang/1\") // new\n\tshouldHasPerm(t, dir, adm, \"read\", \"r/demo/boards:gnolang/1\")\n\tshouldNotHasPerm(t, dir, mod, \"read\", \"r/demo/boards:gnolang/1\")\n\tshouldNotHasPerm(t, dir, usr, \"read\", \"r/demo/boards:gnolang/1\")\n\tshouldNotHasPerm(t, dir, cst, \"read\", \"r/demo/boards:gnolang/1\")\n\n\t// adding a group perm for a new group.\n\t// no changes expected.\n\tdir.AddGroupPerm(\"mods\", \"role\", \"moderator\")\n\tdir.AddGroupPerm(\"mods\", \"write\", \".*\")\n\tshouldHasRole(t, dir, adm, \"foo\")\n\tshouldNotHasRole(t, dir, mod, \"foo\")\n\tshouldNotHasRole(t, dir, usr, \"foo\")\n\tshouldNotHasRole(t, dir, cst, \"foo\")\n\tshouldHasPerm(t, dir, adm, \"write\", \"r/demo/boards:gnolang/1\")\n\tshouldNotHasPerm(t, dir, mod, \"write\", \"r/demo/boards:gnolang/1\")\n\tshouldNotHasPerm(t, dir, usr, \"write\", \"r/demo/boards:gnolang/1\")\n\tshouldHasPerm(t, dir, cst, \"write\", \"r/demo/boards:gnolang/1\")\n\tshouldHasPerm(t, dir, adm, \"read\", \"r/demo/boards:gnolang/1\")\n\tshouldNotHasPerm(t, dir, mod, \"read\", \"r/demo/boards:gnolang/1\")\n\tshouldNotHasPerm(t, dir, usr, \"read\", \"r/demo/boards:gnolang/1\")\n\tshouldNotHasPerm(t, dir, cst, \"read\", \"r/demo/boards:gnolang/1\")\n\n\t// assigning the user \"mod\" to the \"mods\" group.\n\tdir.AddUserToGroup(mod, \"mods\")\n\tshouldHasRole(t, dir, adm, \"foo\")\n\tshouldNotHasRole(t, dir, mod, \"foo\")\n\tshouldNotHasRole(t, dir, usr, \"foo\")\n\tshouldNotHasRole(t, dir, cst, \"foo\")\n\tshouldHasPerm(t, dir, adm, \"write\", \"r/demo/boards:gnolang/1\")\n\tshouldHasPerm(t, dir, mod, \"write\", \"r/demo/boards:gnolang/1\") // new\n\tshouldNotHasPerm(t, dir, usr, \"write\", \"r/demo/boards:gnolang/1\")\n\tshouldHasPerm(t, dir, cst, \"write\", \"r/demo/boards:gnolang/1\")\n\tshouldHasPerm(t, dir, adm, \"read\", \"r/demo/boards:gnolang/1\")\n\tshouldNotHasPerm(t, dir, mod, \"read\", \"r/demo/boards:gnolang/1\")\n\tshouldNotHasPerm(t, dir, usr, \"read\", \"r/demo/boards:gnolang/1\")\n\tshouldNotHasPerm(t, dir, cst, \"read\", \"r/demo/boards:gnolang/1\")\n\n\t// adding \"read\" permission for everyone.\n\tdir.AddGroupPerm(Everyone, \"read\", \".*\")\n\tshouldHasRole(t, dir, adm, \"foo\")\n\tshouldNotHasRole(t, dir, mod, \"foo\")\n\tshouldNotHasRole(t, dir, usr, \"foo\")\n\tshouldNotHasRole(t, dir, cst, \"foo\")\n\tshouldHasPerm(t, dir, adm, \"write\", \"r/demo/boards:gnolang/1\")\n\tshouldHasPerm(t, dir, mod, \"write\", \"r/demo/boards:gnolang/1\")\n\tshouldNotHasPerm(t, dir, usr, \"write\", \"r/demo/boards:gnolang/1\")\n\tshouldHasPerm(t, dir, cst, \"write\", \"r/demo/boards:gnolang/1\")\n\tshouldHasPerm(t, dir, adm, \"read\", \"r/demo/boards:gnolang/1\")\n\tshouldHasPerm(t, dir, mod, \"read\", \"r/demo/boards:gnolang/1\") // new\n\tshouldHasPerm(t, dir, usr, \"read\", \"r/demo/boards:gnolang/1\") // new\n\tshouldHasPerm(t, dir, cst, \"read\", \"r/demo/boards:gnolang/1\") // new\n}\n\nfunc shouldHasRole(t *testing.T, dir *Directory, addr std.Address, role string) {\n\tt.Helper()\n\tcheck := dir.HasRole(addr, role)\n\tuassert.Equal(t, true, check, ufmt.Sprintf(\"%s should has role %s\", addr.String(), role))\n}\n\nfunc shouldNotHasRole(t *testing.T, dir *Directory, addr std.Address, role string) {\n\tt.Helper()\n\tcheck := dir.HasRole(addr, role)\n\tuassert.Equal(t, false, check, ufmt.Sprintf(\"%s should not has role %s\", addr.String(), role))\n}\n\nfunc shouldHasPerm(t *testing.T, dir *Directory, addr std.Address, verb string, resource string) {\n\tt.Helper()\n\tcheck := dir.HasPerm(addr, verb, resource)\n\tuassert.Equal(t, true, check, ufmt.Sprintf(\"%s should has perm for %s - %s\", addr.String(), verb, resource))\n}\n\nfunc shouldNotHasPerm(t *testing.T, dir *Directory, addr std.Address, verb string, resource string) {\n\tt.Helper()\n\tcheck := dir.HasPerm(addr, verb, resource)\n\tuassert.Equal(t, false, check, ufmt.Sprintf(\"%s should not has perm for %s - %s\", addr.String(), verb, resource))\n}\n"},{"name":"const.gno","body":"package acl\n\nconst Everyone string = \"everyone\"\n"},{"name":"perm.gno","body":"package acl\n\nimport \"regexp\"\n\ntype perm struct {\n\tverbs []string\n\tresources []string\n}\n\nfunc (perm perm) hasPerm(verb, resource string) bool {\n\t// check verb\n\tverbOK := false\n\tfor _, pattern := range perm.verbs {\n\t\tif match(pattern, verb) {\n\t\t\tverbOK = true\n\t\t\tbreak\n\t\t}\n\t}\n\tif !verbOK {\n\t\treturn false\n\t}\n\n\t// check resource\n\tfor _, pattern := range perm.resources {\n\t\tif match(pattern, resource) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc match(pattern, target string) bool {\n\tif pattern == \".*\" {\n\t\treturn true\n\t}\n\n\tif pattern == target {\n\t\treturn true\n\t}\n\n\t// regexp handling\n\tmatch, _ := regexp.MatchString(pattern, target)\n\treturn match\n}\n"},{"name":"perms.gno","body":"package acl\n\ntype perms []perm\n\nfunc (perms perms) hasPerm(verb, resource string) bool {\n\tfor _, perm := range perms {\n\t\tif perm.hasPerm(verb, resource) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"avlhelpers","path":"gno.land/p/demo/avlhelpers","files":[{"name":"avlhelpers.gno","body":"package avlhelpers\n\nimport (\n\t\"gno.land/p/demo/avl\"\n)\n\n// Iterate the keys in-order starting from the given prefix.\n// It calls the provided callback function for each key-value pair encountered.\n// If the callback returns true, the iteration is stopped.\n// The prefix and keys are treated as byte strings, ignoring possible multi-byte Unicode runes.\nfunc IterateByteStringKeysByPrefix(tree avl.Tree, prefix string, cb avl.IterCbFn) {\n\tend := \"\"\n\tn := len(prefix)\n\t// To make the end of the search, increment the final character ASCII by one.\n\tfor n \u003e 0 {\n\t\tif ascii := int(prefix[n-1]); ascii \u003c 0xff {\n\t\t\tend = prefix[0:n-1] + string(ascii+1)\n\t\t\tbreak\n\t\t}\n\n\t\t// The last character is 0xff. Try the previous character.\n\t\tn--\n\t}\n\n\ttree.Iterate(prefix, end, cb)\n}\n\n// Get a list of keys starting from the given prefix. Limit the\n// number of results to maxResults.\n// The prefix and keys are treated as byte strings, ignoring possible multi-byte Unicode runes.\nfunc ListByteStringKeysByPrefix(tree avl.Tree, prefix string, maxResults int) []string {\n\tresult := []string{}\n\tIterateByteStringKeysByPrefix(tree, prefix, func(key string, value interface{}) bool {\n\t\tresult = append(result, key)\n\t\tif len(result) \u003e= maxResults {\n\t\t\treturn true\n\t\t}\n\t\treturn false\n\t})\n\treturn result\n}\n"},{"name":"z_0_filetest.gno","body":"// PKGPATH: gno.land/r/test\npackage test\n\nimport (\n\t\"encoding/hex\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/avlhelpers\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nfunc main() {\n\ttree := avl.Tree{}\n\n\t{\n\t\t// Empty tree.\n\t\tmatches := avlhelpers.ListByteStringKeysByPrefix(tree, \"\", 10)\n\t\tprintln(ufmt.Sprintf(\"# matches: %d\", len(matches)))\n\t}\n\n\ttree.Set(\"alice\", \"\")\n\ttree.Set(\"andy\", \"\")\n\ttree.Set(\"bob\", \"\")\n\n\t{\n\t\t// Match only alice.\n\t\tmatches := avlhelpers.ListByteStringKeysByPrefix(tree, \"al\", 10)\n\t\tprintln(ufmt.Sprintf(\"# matches: %d\", len(matches)))\n\t\tprintln(\"match: \" + matches[0])\n\t}\n\n\t{\n\t\t// Match alice and andy.\n\t\tmatches := avlhelpers.ListByteStringKeysByPrefix(tree, \"a\", 10)\n\t\tprintln(ufmt.Sprintf(\"# matches: %d\", len(matches)))\n\t\tprintln(\"match: \" + matches[0])\n\t\tprintln(\"match: \" + matches[1])\n\t}\n\n\t{\n\t\t// Match alice and andy limited to 1.\n\t\tmatches := avlhelpers.ListByteStringKeysByPrefix(tree, \"a\", 1)\n\t\tprintln(ufmt.Sprintf(\"# matches: %d\", len(matches)))\n\t\tprintln(\"match: \" + matches[0])\n\t}\n\n\ttree = avl.Tree{}\n\ttree.Set(\"a\\xff\", \"\")\n\ttree.Set(\"a\\xff\\xff\", \"\")\n\ttree.Set(\"b\", \"\")\n\ttree.Set(\"\\xff\\xff\\x00\", \"\")\n\n\t{\n\t\t// Match only \"a\\xff\\xff\".\n\t\tmatches := avlhelpers.ListByteStringKeysByPrefix(tree, \"a\\xff\\xff\", 10)\n\t\tprintln(ufmt.Sprintf(\"# matches: %d\", len(matches)))\n\t\tprintln(ufmt.Sprintf(\"match: %s\", hex.EncodeToString([]byte(matches[0]))))\n\t}\n\n\t{\n\t\t// Match \"a\\xff\" and \"a\\xff\\xff\".\n\t\tmatches := avlhelpers.ListByteStringKeysByPrefix(tree, \"a\\xff\", 10)\n\t\tprintln(ufmt.Sprintf(\"# matches: %d\", len(matches)))\n\t\tprintln(ufmt.Sprintf(\"match: %s\", hex.EncodeToString([]byte(matches[0]))))\n\t\tprintln(ufmt.Sprintf(\"match: %s\", hex.EncodeToString([]byte(matches[1]))))\n\t}\n\n\t{\n\t\t// Edge case: Match only \"\\xff\\xff\\x00\".\n\t\tmatches := avlhelpers.ListByteStringKeysByPrefix(tree, \"\\xff\\xff\", 10)\n\t\tprintln(ufmt.Sprintf(\"# matches: %d\", len(matches)))\n\t\tprintln(ufmt.Sprintf(\"match: %s\", hex.EncodeToString([]byte(matches[0]))))\n\t}\n}\n\n// Output:\n// # matches: 0\n// # matches: 1\n// match: alice\n// # matches: 2\n// match: alice\n// match: andy\n// # matches: 1\n// match: alice\n// # matches: 1\n// match: 61ffff\n// # matches: 2\n// match: 61ff\n// match: 61ffff\n// # matches: 1\n// match: ffff00\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"bf","path":"gno.land/p/demo/bf","files":[{"name":"bf.gno","body":"package bf\n\nimport (\n\t\"strings\"\n)\n\nconst maxlen = 30000\n\nfunc Execute(code string) string {\n\tvar (\n\t\tmemory = make([]byte, maxlen) // memory tape\n\t\tpointer = 0 // initial memory pointer\n\t\tbuf strings.Builder\n\t)\n\n\t// Loop through each character in the code\n\tfor i := 0; i \u003c len(code); i++ {\n\t\tswitch code[i] {\n\t\tcase '\u003e':\n\t\t\t// Increment memory pointer\n\t\t\tpointer++\n\t\t\tif pointer \u003e= maxlen {\n\t\t\t\tpointer = 0\n\t\t\t}\n\t\tcase '\u003c':\n\t\t\t// Decrement memory pointer\n\t\t\tpointer--\n\t\t\tif pointer \u003c 0 {\n\t\t\t\tpointer = maxlen - 1\n\t\t\t}\n\t\tcase '+':\n\t\t\t// Increment the byte at the memory pointer\n\t\t\tmemory[pointer]++\n\t\tcase '-':\n\t\t\t// Decrement the byte at the memory pointer\n\t\t\tmemory[pointer]--\n\t\tcase '.':\n\t\t\t// Output the byte at the memory pointer\n\t\t\tbuf.WriteByte(memory[pointer])\n\t\tcase ',':\n\t\t\t// Input a byte and store it in the memory\n\t\t\tpanic(\"unsupported\")\n\t\t\t// fmt.Scan(\u0026memory[pointer])\n\t\tcase '[':\n\t\t\t// Jump forward past the matching ']' if the byte at the memory pointer is zero\n\t\t\tif memory[pointer] == 0 {\n\t\t\t\tbraceCount := 1\n\t\t\t\tfor braceCount \u003e 0 {\n\t\t\t\t\ti++\n\t\t\t\t\tif code[i] == '[' {\n\t\t\t\t\t\tbraceCount++\n\t\t\t\t\t} else if code[i] == ']' {\n\t\t\t\t\t\tbraceCount--\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\tcase ']':\n\t\t\t// Jump backward to the matching '[' if the byte at the memory pointer is nonzero\n\t\t\tif memory[pointer] != 0 {\n\t\t\t\tbraceCount := 1\n\t\t\t\tfor braceCount \u003e 0 {\n\t\t\t\t\ti--\n\t\t\t\t\tif code[i] == ']' {\n\t\t\t\t\t\tbraceCount++\n\t\t\t\t\t} else if code[i] == '[' {\n\t\t\t\t\t\tbraceCount--\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ti-- // Move back one more to compensate for the upcoming increment in the loop\n\t\t\t}\n\t\t}\n\t}\n\treturn buf.String()\n}\n"},{"name":"bf_test.gno","body":"package bf\n\nimport \"testing\"\n\nfunc TestExecuteBrainfuck(t *testing.T) {\n\ttestCases := []struct {\n\t\tname string\n\t\tcode string\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tname: \"hello\",\n\t\t\tcode: \"++++++++++[\u003e+++++++\u003e++++++++++\u003e+++\u003e+\u003c\u003c\u003c\u003c-]\u003e++.\u003e+.+++++++..+++.\u003e++.\u003c\u003c+++++++++++++++.\u003e.+++.------.--------.\",\n\t\t\texpected: \"Hello World\",\n\t\t},\n\t\t{\n\t\t\tname: \"increment\",\n\t\t\tcode: \"+++++ +++++ [ \u003e +++++ ++ \u003c - ] \u003e +++++ .\",\n\t\t\texpected: \"K\",\n\t\t},\n\t\t// Add more test cases as needed\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tresult := Execute(tc.code)\n\t\t\tif result != tc.expected {\n\t\t\t\tt.Errorf(\"Expected output: %s, but got: %s\", tc.expected, result)\n\t\t\t}\n\t\t})\n\t}\n}\n"},{"name":"doc.gno","body":"// Package bf implements a minimalist Brainfuck virtual machine in Gno.\n//\n// Brainfuck is an esoteric programming language known for its simplicity and minimalistic design.\n// It operates on an array of memory cells, with a memory pointer that can move left or right.\n// The language consists of eight commands: \u003e \u003c + - . , [ ].\n//\n// Usage:\n// To execute Brainfuck code, use the Execute function and provide the code as a string.\n//\n//\tcode := \"++++++++++[\u003e+++++++\u003e++++++++++\u003e+++\u003e+\u003c\u003c\u003c\u003c-]\u003e++.\u003e+.+++++++..+++.\u003e++.\u003c\u003c+++++++++++++++.\u003e.+++.------.--------.\"\n//\toutput := bf.Execute(code)\n//\n// Note:\n// This implementation is a minimalist version and may not handle all edge cases or advanced features of the Brainfuck language.\n//\n// Reference:\n// For more information on Brainfuck, refer to the Wikipedia page: https://en.wikipedia.org/wiki/Brainfuck\npackage bf // import \"gno.land/p/demo/bf\"\n"},{"name":"run.gno","body":"package bf\n\n// for `gno run`\nfunc main() {\n\tcode := \"++++++++++[\u003e+++++++\u003e++++++++++\u003e+++\u003e+\u003c\u003c\u003c\u003c-]\u003e++.\u003e+.+++++++..+++.\u003e++.\u003c\u003c+++++++++++++++.\u003e.+++.------.--------.\"\n\t// TODO: code = os.Args...\n\tExecute(code)\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"mux","path":"gno.land/p/demo/mux","files":[{"name":"doc.gno","body":"// Package mux provides a simple routing and rendering library for handling dynamic path-based requests in Gno contracts.\n//\n// The `mux` package aims to offer similar functionality to `http.ServeMux` in Go, but for Gno's Render() requests.\n// It allows you to define routes with dynamic parts and associate them with corresponding handler functions for rendering outputs.\n//\n// Usage:\n// 1. Create a new Router instance using `NewRouter()` to handle routing and rendering logic.\n// 2. Register routes and their associated handler functions using the `Handle(route, handler)` method.\n// 3. Implement the rendering logic within the handler functions, utilizing the `Request` and `ResponseWriter` types.\n// 4. Use the `Render(path)` method to process a given path and execute the corresponding handler function to obtain the rendered output.\n//\n// Route Patterns:\n// Routes can include dynamic parts enclosed in braces, such as \"users/{id}\" or \"hello/{name}\". The `Request` object's `GetVar(key)`\n// method allows you to extract the value of a specific variable from the path based on routing rules.\n//\n// Example:\n//\n//\trouter := mux.NewRouter()\n//\n//\t// Define a route with a variable and associated handler function\n//\trouter.HandleFunc(\"hello/{name}\", func(res *mux.ResponseWriter, req *mux.Request) {\n//\t\tname := req.GetVar(\"name\")\n//\t\tif name != \"\" {\n//\t\t\tres.Write(\"Hello, \" + name + \"!\")\n//\t\t} else {\n//\t\t\tres.Write(\"Hello, world!\")\n//\t\t}\n//\t})\n//\n//\t// Render the output for the \"/hello/Alice\" path\n//\toutput := router.Render(\"hello/Alice\")\n//\t// Output: \"Hello, Alice!\"\n//\n// Note: The `mux` package provides a basic routing and rendering mechanism for simple use cases. For more advanced routing features,\n// consider using more specialized libraries or frameworks.\npackage mux\n"},{"name":"handler.gno","body":"package mux\n\ntype Handler struct {\n\tPattern string\n\tFn HandlerFunc\n}\n\ntype HandlerFunc func(*ResponseWriter, *Request)\n\n// TODO: type ErrHandlerFunc func(*ResponseWriter, *Request) error\n// TODO: NotFoundHandler\n// TODO: AutomaticIndex\n"},{"name":"helpers.gno","body":"package mux\n\nfunc defaultNotFoundHandler(res *ResponseWriter, req *Request) {\n\tres.Write(\"404\")\n}\n"},{"name":"request.gno","body":"package mux\n\nimport \"strings\"\n\n// Request represents an incoming request.\ntype Request struct {\n\tPath string\n\tHandlerPath string\n}\n\n// GetVar retrieves a variable from the path based on routing rules.\nfunc (r *Request) GetVar(key string) string {\n\tvar (\n\t\thandlerParts = strings.Split(r.HandlerPath, \"/\")\n\t\treqParts = strings.Split(r.Path, \"/\")\n\t)\n\n\tfor i := 0; i \u003c len(handlerParts); i++ {\n\t\thandlerPart := handlerParts[i]\n\t\tswitch {\n\t\tcase handlerPart == \"*\":\n\t\t\t// XXX: implement a/b/*/d/e\n\t\t\tpanic(\"not implemented\")\n\t\tcase strings.HasPrefix(handlerPart, \"{\") \u0026\u0026 strings.HasSuffix(handlerPart, \"}\"):\n\t\t\tparameter := handlerPart[1 : len(handlerPart)-1]\n\t\t\tif parameter == key {\n\t\t\t\treturn reqParts[i]\n\t\t\t}\n\t\tdefault:\n\t\t\t// continue\n\t\t}\n\t}\n\n\treturn \"\"\n}\n"},{"name":"request_test.gno","body":"package mux\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n)\n\nfunc TestRequest_GetVar(t *testing.T) {\n\tcases := []struct {\n\t\thandlerPath string\n\t\treqPath string\n\t\tgetVarKey string\n\t\texpectedOutput string\n\t}{\n\t\t{\"users/{id}\", \"users/123\", \"id\", \"123\"},\n\t\t{\"users/123\", \"users/123\", \"id\", \"\"},\n\t\t{\"users/{id}\", \"users/123\", \"nonexistent\", \"\"},\n\t\t{\"a/{b}/c/{d}\", \"a/42/c/1337\", \"b\", \"42\"},\n\t\t{\"a/{b}/c/{d}\", \"a/42/c/1337\", \"d\", \"1337\"},\n\t\t{\"{a}\", \"foo\", \"a\", \"foo\"},\n\t\t// TODO: wildcards: a/*/c\n\t\t// TODO: multiple patterns per slashes: a/{b}-{c}/d\n\t}\n\n\tfor _, tt := range cases {\n\t\tname := fmt.Sprintf(\"%s-%s\", tt.handlerPath, tt.reqPath)\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\treq := \u0026Request{\n\t\t\t\tHandlerPath: tt.handlerPath,\n\t\t\t\tPath: tt.reqPath,\n\t\t\t}\n\n\t\t\toutput := req.GetVar(tt.getVarKey)\n\t\t\tif output != tt.expectedOutput {\n\t\t\t\tt.Errorf(\"Expected '%q, but got %q\", tt.expectedOutput, output)\n\t\t\t}\n\t\t})\n\t}\n}\n"},{"name":"response.gno","body":"package mux\n\nimport \"strings\"\n\n// ResponseWriter represents the response writer.\ntype ResponseWriter struct {\n\toutput strings.Builder\n}\n\n// Write appends data to the response output.\nfunc (rw *ResponseWriter) Write(data string) {\n\trw.output.WriteString(data)\n}\n\n// Output returns the final response output.\nfunc (rw *ResponseWriter) Output() string {\n\treturn rw.output.String()\n}\n\n// TODO: func (rw *ResponseWriter) Header()...\n"},{"name":"router.gno","body":"package mux\n\nimport \"strings\"\n\n// Router handles the routing and rendering logic.\ntype Router struct {\n\troutes []Handler\n\tNotFoundHandler HandlerFunc\n}\n\n// NewRouter creates a new Router instance.\nfunc NewRouter() *Router {\n\treturn \u0026Router{\n\t\troutes: make([]Handler, 0),\n\t\tNotFoundHandler: defaultNotFoundHandler,\n\t}\n}\n\n// Render renders the output for the given path using the registered route handler.\nfunc (r *Router) Render(reqPath string) string {\n\treqParts := strings.Split(reqPath, \"/\")\n\n\tfor _, route := range r.routes {\n\t\tpatParts := strings.Split(route.Pattern, \"/\")\n\n\t\tif len(patParts) != len(reqParts) {\n\t\t\tcontinue\n\t\t}\n\n\t\tmatch := true\n\t\tfor i := 0; i \u003c len(patParts); i++ {\n\t\t\tpatPart := patParts[i]\n\t\t\treqPart := reqParts[i]\n\n\t\t\tif patPart == \"*\" {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif strings.HasPrefix(patPart, \"{\") \u0026\u0026 strings.HasSuffix(patPart, \"}\") {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif patPart != reqPart {\n\t\t\t\tmatch = false\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif match {\n\t\t\treq := \u0026Request{\n\t\t\t\tPath: reqPath,\n\t\t\t\tHandlerPath: route.Pattern,\n\t\t\t}\n\t\t\tres := \u0026ResponseWriter{}\n\t\t\troute.Fn(res, req)\n\t\t\treturn res.Output()\n\t\t}\n\t}\n\n\t// not found\n\treq := \u0026Request{Path: reqPath}\n\tres := \u0026ResponseWriter{}\n\tr.NotFoundHandler(res, req)\n\treturn res.Output()\n}\n\n// Handle registers a route and its handler function.\nfunc (r *Router) HandleFunc(pattern string, fn HandlerFunc) {\n\troute := Handler{Pattern: pattern, Fn: fn}\n\tr.routes = append(r.routes, route)\n}\n"},{"name":"router_test.gno","body":"package mux\n\nimport \"testing\"\n\nfunc TestRouter_Render(t *testing.T) {\n\t// Define handlers and route configuration\n\trouter := NewRouter()\n\trouter.HandleFunc(\"hello/{name}\", func(res *ResponseWriter, req *Request) {\n\t\tname := req.GetVar(\"name\")\n\t\tif name != \"\" {\n\t\t\tres.Write(\"Hello, \" + name + \"!\")\n\t\t} else {\n\t\t\tres.Write(\"Hello, world!\")\n\t\t}\n\t})\n\trouter.HandleFunc(\"hi\", func(res *ResponseWriter, req *Request) {\n\t\tres.Write(\"Hi, earth!\")\n\t})\n\n\tcases := []struct {\n\t\tpath string\n\t\texpectedOutput string\n\t}{\n\t\t{\"hello/Alice\", \"Hello, Alice!\"},\n\t\t{\"hi\", \"Hi, earth!\"},\n\t\t{\"hello/Bob\", \"Hello, Bob!\"},\n\t\t// TODO: {\"hello\", \"Hello, world!\"},\n\t\t// TODO: hello/, /hello, hello//Alice, hello/Alice/, hello/Alice/Bob, etc\n\t}\n\tfor _, tt := range cases {\n\t\tt.Run(tt.path, func(t *testing.T) {\n\t\t\toutput := router.Render(tt.path)\n\t\t\tif output != tt.expectedOutput {\n\t\t\t\tt.Errorf(\"Expected output %q, but got %q\", tt.expectedOutput, output)\n\t\t\t}\n\t\t})\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"blog","path":"gno.land/p/demo/blog","files":[{"name":"blog.gno","body":"package blog\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/mux\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\ntype Blog struct {\n\tTitle string\n\tPrefix string // i.e. r/gnoland/blog:\n\tPosts avl.Tree // slug -\u003e *Post\n\tPostsPublished avl.Tree // published-date -\u003e *Post\n\tPostsAlphabetical avl.Tree // title -\u003e *Post\n\tNoBreadcrumb bool\n}\n\nfunc (b Blog) RenderLastPostsWidget(limit int) string {\n\tif b.PostsPublished.Size() == 0 {\n\t\treturn \"No posts.\"\n\t}\n\n\toutput := \"\"\n\ti := 0\n\tb.PostsPublished.ReverseIterate(\"\", \"\", func(key string, value interface{}) bool {\n\t\tp := value.(*Post)\n\t\toutput += ufmt.Sprintf(\"- [%s](%s)\\n\", p.Title, p.URL())\n\t\ti++\n\t\treturn i \u003e= limit\n\t})\n\treturn output\n}\n\nfunc (b Blog) RenderHome(res *mux.ResponseWriter, req *mux.Request) {\n\tif !b.NoBreadcrumb {\n\t\tres.Write(breadcrumb([]string{b.Title}))\n\t}\n\n\tif b.Posts.Size() == 0 {\n\t\tres.Write(\"No posts.\")\n\t\treturn\n\t}\n\n\tres.Write(\"\u003cdiv class='columns-3'\u003e\")\n\tb.PostsPublished.ReverseIterate(\"\", \"\", func(key string, value interface{}) bool {\n\t\tpost := value.(*Post)\n\t\tres.Write(post.RenderListItem())\n\t\treturn false\n\t})\n\tres.Write(\"\u003c/div\u003e\")\n\n\t// FIXME: tag list/cloud.\n}\n\nfunc (b Blog) RenderPost(res *mux.ResponseWriter, req *mux.Request) {\n\tslug := req.GetVar(\"slug\")\n\n\tpost, found := b.Posts.Get(slug)\n\tif !found {\n\t\tres.Write(\"404\")\n\t\treturn\n\t}\n\tp := post.(*Post)\n\n\tres.Write(\"\u003cmain class='gno-tmpl-page'\u003e\" + \"\\n\\n\")\n\n\tres.Write(\"# \" + p.Title + \"\\n\\n\")\n\tres.Write(p.Body + \"\\n\\n\")\n\tres.Write(\"---\\n\\n\")\n\n\tres.Write(p.RenderTagList() + \"\\n\\n\")\n\tres.Write(p.RenderAuthorList() + \"\\n\\n\")\n\tres.Write(p.RenderPublishData() + \"\\n\\n\")\n\n\tres.Write(\"---\\n\")\n\tres.Write(\"\u003cdetails\u003e\u003csummary\u003eComment section\u003c/summary\u003e\\n\\n\")\n\n\t// comments\n\tp.Comments.ReverseIterate(\"\", \"\", func(key string, value interface{}) bool {\n\t\tcomment := value.(*Comment)\n\t\tres.Write(comment.RenderListItem())\n\t\treturn false\n\t})\n\n\tres.Write(\"\u003c/details\u003e\\n\")\n\tres.Write(\"\u003c/main\u003e\")\n}\n\nfunc (b Blog) RenderTag(res *mux.ResponseWriter, req *mux.Request) {\n\tslug := req.GetVar(\"slug\")\n\n\tif slug == \"\" {\n\t\tres.Write(\"404\")\n\t\treturn\n\t}\n\n\tif !b.NoBreadcrumb {\n\t\tbreadStr := breadcrumb([]string{\n\t\t\tufmt.Sprintf(\"[%s](%s)\", b.Title, b.Prefix),\n\t\t\t\"t\",\n\t\t\tslug,\n\t\t})\n\t\tres.Write(breadStr)\n\t}\n\n\tnb := 0\n\tb.Posts.Iterate(\"\", \"\", func(key string, value interface{}) bool {\n\t\tpost := value.(*Post)\n\t\tif !post.HasTag(slug) {\n\t\t\treturn false\n\t\t}\n\t\tres.Write(post.RenderListItem())\n\t\tnb++\n\t\treturn false\n\t})\n\tif nb == 0 {\n\t\tres.Write(\"No posts.\")\n\t}\n}\n\nfunc (b Blog) Render(path string) string {\n\trouter := mux.NewRouter()\n\trouter.HandleFunc(\"\", b.RenderHome)\n\trouter.HandleFunc(\"p/{slug}\", b.RenderPost)\n\trouter.HandleFunc(\"t/{slug}\", b.RenderTag)\n\treturn router.Render(path)\n}\n\nfunc (b *Blog) NewPost(publisher std.Address, slug, title, body, pubDate string, authors, tags []string) error {\n\tif _, found := b.Posts.Get(slug); found {\n\t\treturn ErrPostSlugExists\n\t}\n\n\tvar parsedTime time.Time\n\tvar err error\n\tif pubDate != \"\" {\n\t\tparsedTime, err = time.Parse(time.RFC3339, pubDate)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t} else {\n\t\t// If no publication date was passed in by caller, take current block time\n\t\tparsedTime = time.Now()\n\t}\n\n\tpost := \u0026Post{\n\t\tPublisher: publisher,\n\t\tAuthors: authors,\n\t\tSlug: slug,\n\t\tTitle: title,\n\t\tBody: body,\n\t\tTags: tags,\n\t\tCreatedAt: parsedTime,\n\t}\n\n\treturn b.prepareAndSetPost(post, false)\n}\n\nfunc (b *Blog) prepareAndSetPost(post *Post, edit bool) error {\n\tpost.Title = strings.TrimSpace(post.Title)\n\tpost.Body = strings.TrimSpace(post.Body)\n\n\tif post.Title == \"\" {\n\t\treturn ErrPostTitleMissing\n\t}\n\tif post.Body == \"\" {\n\t\treturn ErrPostBodyMissing\n\t}\n\tif post.Slug == \"\" {\n\t\treturn ErrPostSlugMissing\n\t}\n\n\tpost.Blog = b\n\tpost.UpdatedAt = time.Now()\n\n\ttrimmedTitleKey := getTitleKey(post.Title)\n\tpubDateKey := getPublishedKey(post.CreatedAt)\n\n\tif !edit {\n\t\t// Cannot have two posts with same title key\n\t\tif _, found := b.PostsAlphabetical.Get(trimmedTitleKey); found {\n\t\t\treturn ErrPostTitleExists\n\t\t}\n\t\t// Cannot have two posts with *exact* same timestamp\n\t\tif _, found := b.PostsPublished.Get(pubDateKey); found {\n\t\t\treturn ErrPostPubDateExists\n\t\t}\n\t}\n\n\t// Store post under keys\n\tb.PostsAlphabetical.Set(trimmedTitleKey, post)\n\tb.PostsPublished.Set(pubDateKey, post)\n\tb.Posts.Set(post.Slug, post)\n\n\treturn nil\n}\n\nfunc (b *Blog) RemovePost(slug string) {\n\tp, exists := b.Posts.Get(slug)\n\tif !exists {\n\t\tpanic(\"post with specified slug doesn't exist\")\n\t}\n\n\tpost := p.(*Post)\n\n\ttitleKey := getTitleKey(post.Title)\n\tpublishedKey := getPublishedKey(post.CreatedAt)\n\n\t_, _ = b.Posts.Remove(slug)\n\t_, _ = b.PostsAlphabetical.Remove(titleKey)\n\t_, _ = b.PostsPublished.Remove(publishedKey)\n}\n\nfunc (b *Blog) GetPost(slug string) *Post {\n\tpost, found := b.Posts.Get(slug)\n\tif !found {\n\t\treturn nil\n\t}\n\treturn post.(*Post)\n}\n\ntype Post struct {\n\tBlog *Blog\n\tSlug string // FIXME: save space?\n\tTitle string\n\tBody string\n\tCreatedAt time.Time\n\tUpdatedAt time.Time\n\tComments avl.Tree\n\tAuthors []string\n\tPublisher std.Address\n\tTags []string\n\tCommentIndex int\n}\n\nfunc (p *Post) Update(title, body, publicationDate string, authors, tags []string) error {\n\tp.Title = title\n\tp.Body = body\n\tp.Tags = tags\n\tp.Authors = authors\n\n\tparsedTime, err := time.Parse(time.RFC3339, publicationDate)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tp.CreatedAt = parsedTime\n\treturn p.Blog.prepareAndSetPost(p, true)\n}\n\nfunc (p *Post) AddComment(author std.Address, comment string) error {\n\tif p == nil {\n\t\treturn ErrNoSuchPost\n\t}\n\tp.CommentIndex++\n\tcommentKey := strconv.Itoa(p.CommentIndex)\n\tcomment = strings.TrimSpace(comment)\n\tp.Comments.Set(commentKey, \u0026Comment{\n\t\tPost: p,\n\t\tCreatedAt: time.Now(),\n\t\tAuthor: author,\n\t\tComment: comment,\n\t})\n\n\treturn nil\n}\n\nfunc (p *Post) DeleteComment(index int) error {\n\tif p == nil {\n\t\treturn ErrNoSuchPost\n\t}\n\tcommentKey := strconv.Itoa(index)\n\tp.Comments.Remove(commentKey)\n\treturn nil\n}\n\nfunc (p *Post) HasTag(tag string) bool {\n\tif p == nil {\n\t\treturn false\n\t}\n\tfor _, t := range p.Tags {\n\t\tif t == tag {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc (p *Post) RenderListItem() string {\n\tif p == nil {\n\t\treturn \"error: no such post\\n\"\n\t}\n\toutput := \"\u003cdiv\u003e\\n\\n\"\n\toutput += ufmt.Sprintf(\"### [%s](%s)\\n\", p.Title, p.URL())\n\t// output += ufmt.Sprintf(\"**[Learn More](%s)**\\n\\n\", p.URL())\n\n\toutput += \" \" + p.CreatedAt.Format(\"02 Jan 2006\")\n\t// output += p.Summary() + \"\\n\\n\"\n\t// output += p.RenderTagList() + \"\\n\\n\"\n\toutput += \"\\n\"\n\toutput += \"\u003c/div\u003e\"\n\treturn output\n}\n\n// Render post tags\nfunc (p *Post) RenderTagList() string {\n\tif p == nil {\n\t\treturn \"error: no such post\\n\"\n\t}\n\tif len(p.Tags) == 0 {\n\t\treturn \"\"\n\t}\n\n\toutput := \"Tags: \"\n\tfor idx, tag := range p.Tags {\n\t\tif idx \u003e 0 {\n\t\t\toutput += \" \"\n\t\t}\n\t\ttagURL := p.Blog.Prefix + \"t/\" + tag\n\t\toutput += ufmt.Sprintf(\"[#%s](%s)\", tag, tagURL)\n\n\t}\n\treturn output\n}\n\n// Render authors if there are any\nfunc (p *Post) RenderAuthorList() string {\n\tout := \"Written\"\n\tif len(p.Authors) != 0 {\n\t\tout += \" by \"\n\n\t\tfor idx, author := range p.Authors {\n\t\t\tout += author\n\t\t\tif idx \u003c len(p.Authors)-1 {\n\t\t\t\tout += \", \"\n\t\t\t}\n\t\t}\n\t}\n\tout += \" on \" + p.CreatedAt.Format(\"02 Jan 2006\")\n\n\treturn out\n}\n\nfunc (p *Post) RenderPublishData() string {\n\tout := \"Published \"\n\tif p.Publisher != \"\" {\n\t\tout += \"by \" + p.Publisher.String() + \" \"\n\t}\n\tout += \"to \" + p.Blog.Title\n\n\treturn out\n}\n\nfunc (p *Post) URL() string {\n\tif p == nil {\n\t\treturn p.Blog.Prefix + \"404\"\n\t}\n\treturn p.Blog.Prefix + \"p/\" + p.Slug\n}\n\nfunc (p *Post) Summary() string {\n\tif p == nil {\n\t\treturn \"error: no such post\\n\"\n\t}\n\n\t// FIXME: better summary.\n\tlines := strings.Split(p.Body, \"\\n\")\n\tif len(lines) \u003c= 3 {\n\t\treturn p.Body\n\t}\n\treturn strings.Join(lines[0:3], \"\\n\") + \"...\"\n}\n\ntype Comment struct {\n\tPost *Post\n\tCreatedAt time.Time\n\tAuthor std.Address\n\tComment string\n}\n\nfunc (c Comment) RenderListItem() string {\n\toutput := \"\u003ch5\u003e\"\n\toutput += c.Comment + \"\\n\\n\"\n\toutput += \"\u003c/h5\u003e\"\n\n\toutput += \"\u003ch6\u003e\"\n\toutput += ufmt.Sprintf(\"by %s on %s\", c.Author, c.CreatedAt.Format(time.RFC822))\n\toutput += \"\u003c/h6\u003e\\n\\n\"\n\n\toutput += \"---\\n\\n\"\n\n\treturn output\n}\n"},{"name":"blog_test.gno","body":"package blog\n\n// TODO: add generic tests here.\n// right now, you can checkout r/gnoland/blog/*_test.gno.\n"},{"name":"errors.gno","body":"package blog\n\nimport \"errors\"\n\nvar (\n\tErrPostTitleMissing = errors.New(\"post title is missing\")\n\tErrPostSlugMissing = errors.New(\"post slug is missing\")\n\tErrPostBodyMissing = errors.New(\"post body is missing\")\n\tErrPostSlugExists = errors.New(\"post with specified slug already exists\")\n\tErrPostPubDateExists = errors.New(\"post with specified publication date exists\")\n\tErrPostTitleExists = errors.New(\"post with specified title already exists\")\n\tErrNoSuchPost = errors.New(\"no such post\")\n)\n"},{"name":"util.gno","body":"package blog\n\nimport (\n\t\"strings\"\n\t\"time\"\n)\n\nfunc breadcrumb(parts []string) string {\n\treturn \"# \" + strings.Join(parts, \" / \") + \"\\n\\n\"\n}\n\nfunc getTitleKey(title string) string {\n\treturn strings.Replace(title, \" \", \"\", -1)\n}\n\nfunc getPublishedKey(t time.Time) string {\n\treturn t.Format(time.RFC3339)\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"cford32","path":"gno.land/p/demo/cford32","files":[{"name":"LICENSE","body":"Copyright (c) 2009 The Go Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\nnotice, this list of conditions and the following disclaimer.\n * Redistributions in binary form must reproduce the above\ncopyright notice, this list of conditions and the following disclaimer\nin the documentation and/or other materials provided with the\ndistribution.\n * Neither the name of Google Inc. nor the names of its\ncontributors may be used to endorse or promote products derived from\nthis software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"name":"README.md","body":"# cford32\n\n```\npackage cford32 // import \"gno.land/p/demo/cford32\"\n\nPackage cford32 implements a base32-like encoding/decoding package, with the\nencoding scheme specified by Douglas Crockford.\n\nFrom the website, the requirements of said encoding scheme are to:\n\n - Be human readable and machine readable.\n - Be compact. Humans have difficulty in manipulating long strings of arbitrary\n symbols.\n - Be error resistant. Entering the symbols must not require keyboarding\n gymnastics.\n - Be pronounceable. Humans should be able to accurately transmit the symbols\n to other humans using a telephone.\n\nThis is slightly different from a simple difference in encoding table from\nthe Go's stdlib `encoding/base32`, as when decoding the characters i I l L are\nparsed as 1, and o O is parsed as 0.\n\nThis package additionally provides ways to encode uint64's efficiently, as well\nas efficient encoding to a lowercase variation of the encoding. The encodings\nnever use paddings.\n\n# Uint64 Encoding\n\nAside from lower/uppercase encoding, there is a compact encoding, allowing to\nencode all values in [0,2^34), and the full encoding, allowing all values in\n[0,2^64). The compact encoding uses 7 characters, and the full encoding uses 13\ncharacters. Both are parsed unambiguously by the Uint64 decoder.\n\nThe compact encodings have the first character between ['0','f'], while the\nfull encoding's first character ranges between ['g','z']. Practically, in your\nusage of the package, you should consider which one to use and stick with it,\nwhile considering that the compact encoding, once it reaches 2^34, automatically\nswitches to the full encoding. The properties of the generated strings are still\nmaintained: for instance, any two encoded uint64s x,y consistently generated\nwith the compact encoding, if the numeric value is x \u003c y, will also be x \u003c y in\nlexical ordering. However, values [0,2^34) have a \"double encoding\", which if\nmixed together lose the lexical ordering property.\n\nThe Uint64 encoding is most useful for generating string versions of Uint64 IDs.\nPractically, it allows you to retain sleek and compact IDs for your application\nfor the first 2^34 (\u003e17 billion) entities, while seamlessly rolling over to the\nfull encoding should you exceed that. You are encouraged to use it unless you\nhave a requirement or preferences for IDs consistently being always the same\nsize.\n\nTo use the cford32 encoding for IDs, you may want to consider using package\ngno.land/p/demo/seqid.\n\n[specified by Douglas Crockford]: https://www.crockford.com/base32.html\n\nfunc AppendCompact(id uint64, b []byte) []byte\nfunc AppendDecode(dst, src []byte) ([]byte, error)\nfunc AppendEncode(dst, src []byte) []byte\nfunc AppendEncodeLower(dst, src []byte) []byte\nfunc Decode(dst, src []byte) (n int, err error)\nfunc DecodeString(s string) ([]byte, error)\nfunc DecodedLen(n int) int\nfunc Encode(dst, src []byte)\nfunc EncodeLower(dst, src []byte)\nfunc EncodeToString(src []byte) string\nfunc EncodeToStringLower(src []byte) string\nfunc EncodedLen(n int) int\nfunc NewDecoder(r io.Reader) io.Reader\nfunc NewEncoder(w io.Writer) io.WriteCloser\nfunc NewEncoderLower(w io.Writer) io.WriteCloser\nfunc PutCompact(id uint64) []byte\nfunc PutUint64(id uint64) [13]byte\nfunc PutUint64Lower(id uint64) [13]byte\nfunc Uint64(b []byte) (uint64, error)\ntype CorruptInputError int64\n```\n"},{"name":"cford32.gno","body":"// Modified from the Go Source code for encoding/base32.\n// Copyright 2009 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Package cford32 implements a base32-like encoding/decoding package, with the\n// encoding scheme [specified by Douglas Crockford].\n//\n// From the website, the requirements of said encoding scheme are to:\n//\n// - Be human readable and machine readable.\n// - Be compact. Humans have difficulty in manipulating long strings of arbitrary symbols.\n// - Be error resistant. Entering the symbols must not require keyboarding gymnastics.\n// - Be pronounceable. Humans should be able to accurately transmit the symbols to other humans using a telephone.\n//\n// This is slightly different from a simple difference in encoding table from\n// the Go's stdlib `encoding/base32`, as when decoding the characters i I l L are\n// parsed as 1, and o O is parsed as 0.\n//\n// This package additionally provides ways to encode uint64's efficiently,\n// as well as efficient encoding to a lowercase variation of the encoding.\n// The encodings never use paddings.\n//\n// # Uint64 Encoding\n//\n// Aside from lower/uppercase encoding, there is a compact encoding, allowing\n// to encode all values in [0,2^34), and the full encoding, allowing all\n// values in [0,2^64). The compact encoding uses 7 characters, and the full\n// encoding uses 13 characters. Both are parsed unambiguously by the Uint64\n// decoder.\n//\n// The compact encodings have the first character between ['0','f'], while the\n// full encoding's first character ranges between ['g','z']. Practically, in\n// your usage of the package, you should consider which one to use and stick\n// with it, while considering that the compact encoding, once it reaches 2^34,\n// automatically switches to the full encoding. The properties of the generated\n// strings are still maintained: for instance, any two encoded uint64s x,y\n// consistently generated with the compact encoding, if the numeric value is\n// x \u003c y, will also be x \u003c y in lexical ordering. However, values [0,2^34) have a\n// \"double encoding\", which if mixed together lose the lexical ordering property.\n//\n// The Uint64 encoding is most useful for generating string versions of Uint64\n// IDs. Practically, it allows you to retain sleek and compact IDs for your\n// application for the first 2^34 (\u003e17 billion) entities, while seamlessly\n// rolling over to the full encoding should you exceed that. You are encouraged\n// to use it unless you have a requirement or preferences for IDs consistently\n// being always the same size.\n//\n// To use the cford32 encoding for IDs, you may want to consider using package\n// [gno.land/p/demo/seqid].\n//\n// [specified by Douglas Crockford]: https://www.crockford.com/base32.html\npackage cford32\n\nimport (\n\t\"io\"\n\t\"strconv\"\n)\n\nconst (\n\tencTable = \"0123456789ABCDEFGHJKMNPQRSTVWXYZ\"\n\tencTableLower = \"0123456789abcdefghjkmnpqrstvwxyz\"\n\n\t// each line is 16 bytes\n\tdecTable = \"\" +\n\t\t\"\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\" + // 00-0f\n\t\t\"\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\" + // 10-1f\n\t\t\"\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\" + // 20-2f\n\t\t\"\\x00\\x01\\x02\\x03\\x04\\x05\\x06\\x07\\x08\\x09\\xff\\xff\\xff\\xff\\xff\\xff\" + // 30-3f\n\t\t\"\\xff\\x0a\\x0b\\x0c\\x0d\\x0e\\x0f\\x10\\x11\\x01\\x12\\x13\\x01\\x14\\x15\\x00\" + // 40-4f\n\t\t\"\\x16\\x17\\x18\\x19\\x1a\\xff\\x1b\\x1c\\x1d\\x1e\\x1f\\xff\\xff\\xff\\xff\\xff\" + // 50-5f\n\t\t\"\\xff\\x0a\\x0b\\x0c\\x0d\\x0e\\x0f\\x10\\x11\\x01\\x12\\x13\\x01\\x14\\x15\\x00\" + // 60-6f\n\t\t\"\\x16\\x17\\x18\\x19\\x1a\\xff\\x1b\\x1c\\x1d\\x1e\\x1f\\xff\\xff\\xff\\xff\\xff\" + // 70-7f\n\t\t\"\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\" + // 80-ff (not ASCII)\n\t\t\"\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\" +\n\t\t\"\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\" +\n\t\t\"\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\" +\n\t\t\"\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\" +\n\t\t\"\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\" +\n\t\t\"\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\" +\n\t\t\"\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\"\n)\n\n// CorruptInputError is returned by parsing functions when an invalid character\n// in the input is found. The integer value represents the byte index where\n// the error occurred.\n//\n// This is typically because the given character does not exist in the encoding.\ntype CorruptInputError int64\n\nfunc (e CorruptInputError) Error() string {\n\treturn \"illegal cford32 data at input byte \" + strconv.FormatInt(int64(e), 10)\n}\n\n// Uint64 parses a cford32-encoded byte slice into a uint64.\n//\n// - The parser requires all provided character to be valid cford32 characters.\n// - The parser disregards case.\n// - If the first character is '0' \u003c= c \u003c= 'f', then the passed value is assumed\n// encoded in the compact encoding, and must be 7 characters long.\n// - If the first character is 'g' \u003c= c \u003c= 'z', then the passed value is\n// assumed encoded in the full encoding, and must be 13 characters long.\n//\n// If any of these requirements fail, a CorruptInputError will be returned.\nfunc Uint64(b []byte) (uint64, error) {\n\tswitch {\n\tdefault:\n\t\treturn 0, CorruptInputError(0)\n\tcase len(b) == 7 \u0026\u0026 b[0] \u003e= '0' \u0026\u0026 b[0] \u003c= 'f':\n\t\tdecVals := [7]byte{\n\t\t\tdecTable[b[0]],\n\t\t\tdecTable[b[1]],\n\t\t\tdecTable[b[2]],\n\t\t\tdecTable[b[3]],\n\t\t\tdecTable[b[4]],\n\t\t\tdecTable[b[5]],\n\t\t\tdecTable[b[6]],\n\t\t}\n\t\tfor idx, v := range decVals {\n\t\t\tif v \u003e= 32 {\n\t\t\t\treturn 0, CorruptInputError(idx)\n\t\t\t}\n\t\t}\n\n\t\treturn 0 +\n\t\t\tuint64(decVals[0])\u003c\u003c30 |\n\t\t\tuint64(decVals[1])\u003c\u003c25 |\n\t\t\tuint64(decVals[2])\u003c\u003c20 |\n\t\t\tuint64(decVals[3])\u003c\u003c15 |\n\t\t\tuint64(decVals[4])\u003c\u003c10 |\n\t\t\tuint64(decVals[5])\u003c\u003c5 |\n\t\t\tuint64(decVals[6]), nil\n\tcase len(b) == 13 \u0026\u0026 b[0] \u003e= 'g' \u0026\u0026 b[0] \u003c= 'z':\n\t\tdecVals := [13]byte{\n\t\t\tdecTable[b[0]] \u0026 0x0F, // disregard high bit\n\t\t\tdecTable[b[1]],\n\t\t\tdecTable[b[2]],\n\t\t\tdecTable[b[3]],\n\t\t\tdecTable[b[4]],\n\t\t\tdecTable[b[5]],\n\t\t\tdecTable[b[6]],\n\t\t\tdecTable[b[7]],\n\t\t\tdecTable[b[8]],\n\t\t\tdecTable[b[9]],\n\t\t\tdecTable[b[10]],\n\t\t\tdecTable[b[11]],\n\t\t\tdecTable[b[12]],\n\t\t}\n\t\tfor idx, v := range decVals {\n\t\t\tif v \u003e= 32 {\n\t\t\t\treturn 0, CorruptInputError(idx)\n\t\t\t}\n\t\t}\n\n\t\treturn 0 +\n\t\t\tuint64(decVals[0])\u003c\u003c60 |\n\t\t\tuint64(decVals[1])\u003c\u003c55 |\n\t\t\tuint64(decVals[2])\u003c\u003c50 |\n\t\t\tuint64(decVals[3])\u003c\u003c45 |\n\t\t\tuint64(decVals[4])\u003c\u003c40 |\n\t\t\tuint64(decVals[5])\u003c\u003c35 |\n\t\t\tuint64(decVals[6])\u003c\u003c30 |\n\t\t\tuint64(decVals[7])\u003c\u003c25 |\n\t\t\tuint64(decVals[8])\u003c\u003c20 |\n\t\t\tuint64(decVals[9])\u003c\u003c15 |\n\t\t\tuint64(decVals[10])\u003c\u003c10 |\n\t\t\tuint64(decVals[11])\u003c\u003c5 |\n\t\t\tuint64(decVals[12]), nil\n\t}\n}\n\nconst mask = 31\n\n// PutUint64 returns a cford32-encoded byte slice.\nfunc PutUint64(id uint64) [13]byte {\n\treturn [13]byte{\n\t\tencTable[id\u003e\u003e60\u0026mask|0x10], // specify full encoding\n\t\tencTable[id\u003e\u003e55\u0026mask],\n\t\tencTable[id\u003e\u003e50\u0026mask],\n\t\tencTable[id\u003e\u003e45\u0026mask],\n\t\tencTable[id\u003e\u003e40\u0026mask],\n\t\tencTable[id\u003e\u003e35\u0026mask],\n\t\tencTable[id\u003e\u003e30\u0026mask],\n\t\tencTable[id\u003e\u003e25\u0026mask],\n\t\tencTable[id\u003e\u003e20\u0026mask],\n\t\tencTable[id\u003e\u003e15\u0026mask],\n\t\tencTable[id\u003e\u003e10\u0026mask],\n\t\tencTable[id\u003e\u003e5\u0026mask],\n\t\tencTable[id\u0026mask],\n\t}\n}\n\n// PutUint64Lower returns a cford32-encoded byte array, swapping uppercase\n// letters with lowercase.\n//\n// For more information on how the value is encoded, see [Uint64].\nfunc PutUint64Lower(id uint64) [13]byte {\n\treturn [13]byte{\n\t\tencTableLower[id\u003e\u003e60\u0026mask|0x10],\n\t\tencTableLower[id\u003e\u003e55\u0026mask],\n\t\tencTableLower[id\u003e\u003e50\u0026mask],\n\t\tencTableLower[id\u003e\u003e45\u0026mask],\n\t\tencTableLower[id\u003e\u003e40\u0026mask],\n\t\tencTableLower[id\u003e\u003e35\u0026mask],\n\t\tencTableLower[id\u003e\u003e30\u0026mask],\n\t\tencTableLower[id\u003e\u003e25\u0026mask],\n\t\tencTableLower[id\u003e\u003e20\u0026mask],\n\t\tencTableLower[id\u003e\u003e15\u0026mask],\n\t\tencTableLower[id\u003e\u003e10\u0026mask],\n\t\tencTableLower[id\u003e\u003e5\u0026mask],\n\t\tencTableLower[id\u0026mask],\n\t}\n}\n\n// PutCompact returns a cford32-encoded byte slice, using the compact\n// representation of cford32 described in the package documentation where\n// possible (all values of id \u003c 1\u003c\u003c34). The lowercase encoding is used.\n//\n// The resulting byte slice will be 7 bytes long for all compact values,\n// and 13 bytes long for\nfunc PutCompact(id uint64) []byte {\n\treturn AppendCompact(id, nil)\n}\n\n// AppendCompact works like [PutCompact] but appends to the given byte slice\n// instead of allocating one anew.\nfunc AppendCompact(id uint64, b []byte) []byte {\n\tconst maxCompact = 1 \u003c\u003c 34\n\tif id \u003c maxCompact {\n\t\treturn append(b,\n\t\t\tencTableLower[id\u003e\u003e30\u0026mask],\n\t\t\tencTableLower[id\u003e\u003e25\u0026mask],\n\t\t\tencTableLower[id\u003e\u003e20\u0026mask],\n\t\t\tencTableLower[id\u003e\u003e15\u0026mask],\n\t\t\tencTableLower[id\u003e\u003e10\u0026mask],\n\t\t\tencTableLower[id\u003e\u003e5\u0026mask],\n\t\t\tencTableLower[id\u0026mask],\n\t\t)\n\t}\n\treturn append(b,\n\t\tencTableLower[id\u003e\u003e60\u0026mask|0x10],\n\t\tencTableLower[id\u003e\u003e55\u0026mask],\n\t\tencTableLower[id\u003e\u003e50\u0026mask],\n\t\tencTableLower[id\u003e\u003e45\u0026mask],\n\t\tencTableLower[id\u003e\u003e40\u0026mask],\n\t\tencTableLower[id\u003e\u003e35\u0026mask],\n\t\tencTableLower[id\u003e\u003e30\u0026mask],\n\t\tencTableLower[id\u003e\u003e25\u0026mask],\n\t\tencTableLower[id\u003e\u003e20\u0026mask],\n\t\tencTableLower[id\u003e\u003e15\u0026mask],\n\t\tencTableLower[id\u003e\u003e10\u0026mask],\n\t\tencTableLower[id\u003e\u003e5\u0026mask],\n\t\tencTableLower[id\u0026mask],\n\t)\n}\n\nfunc DecodedLen(n int) int {\n\treturn n/8*5 + n%8*5/8\n}\n\nfunc EncodedLen(n int) int {\n\treturn n/5*8 + (n%5*8+4)/5\n}\n\n// Encode encodes src using the encoding enc,\n// writing [EncodedLen](len(src)) bytes to dst.\n//\n// The encoding does not contain any padding, unlike Go's base32.\nfunc Encode(dst, src []byte) {\n\t// Copied from encoding/base32/base32.go (go1.22)\n\tif len(src) == 0 {\n\t\treturn\n\t}\n\n\tdi, si := 0, 0\n\tn := (len(src) / 5) * 5\n\tfor si \u003c n {\n\t\t// Combining two 32 bit loads allows the same code to be used\n\t\t// for 32 and 64 bit platforms.\n\t\thi := uint32(src[si+0])\u003c\u003c24 | uint32(src[si+1])\u003c\u003c16 | uint32(src[si+2])\u003c\u003c8 | uint32(src[si+3])\n\t\tlo := hi\u003c\u003c8 | uint32(src[si+4])\n\n\t\tdst[di+0] = encTable[(hi\u003e\u003e27)\u00260x1F]\n\t\tdst[di+1] = encTable[(hi\u003e\u003e22)\u00260x1F]\n\t\tdst[di+2] = encTable[(hi\u003e\u003e17)\u00260x1F]\n\t\tdst[di+3] = encTable[(hi\u003e\u003e12)\u00260x1F]\n\t\tdst[di+4] = encTable[(hi\u003e\u003e7)\u00260x1F]\n\t\tdst[di+5] = encTable[(hi\u003e\u003e2)\u00260x1F]\n\t\tdst[di+6] = encTable[(lo\u003e\u003e5)\u00260x1F]\n\t\tdst[di+7] = encTable[(lo)\u00260x1F]\n\n\t\tsi += 5\n\t\tdi += 8\n\t}\n\n\t// Add the remaining small block\n\tremain := len(src) - si\n\tif remain == 0 {\n\t\treturn\n\t}\n\n\t// Encode the remaining bytes in reverse order.\n\tval := uint32(0)\n\tswitch remain {\n\tcase 4:\n\t\tval |= uint32(src[si+3])\n\t\tdst[di+6] = encTable[val\u003c\u003c3\u00260x1F]\n\t\tdst[di+5] = encTable[val\u003e\u003e2\u00260x1F]\n\t\tfallthrough\n\tcase 3:\n\t\tval |= uint32(src[si+2]) \u003c\u003c 8\n\t\tdst[di+4] = encTable[val\u003e\u003e7\u00260x1F]\n\t\tfallthrough\n\tcase 2:\n\t\tval |= uint32(src[si+1]) \u003c\u003c 16\n\t\tdst[di+3] = encTable[val\u003e\u003e12\u00260x1F]\n\t\tdst[di+2] = encTable[val\u003e\u003e17\u00260x1F]\n\t\tfallthrough\n\tcase 1:\n\t\tval |= uint32(src[si+0]) \u003c\u003c 24\n\t\tdst[di+1] = encTable[val\u003e\u003e22\u00260x1F]\n\t\tdst[di+0] = encTable[val\u003e\u003e27\u00260x1F]\n\t}\n}\n\n// EncodeLower is like [Encode], but uses the lowercase\nfunc EncodeLower(dst, src []byte) {\n\t// Copied from encoding/base32/base32.go (go1.22)\n\tif len(src) == 0 {\n\t\treturn\n\t}\n\n\tdi, si := 0, 0\n\tn := (len(src) / 5) * 5\n\tfor si \u003c n {\n\t\t// Combining two 32 bit loads allows the same code to be used\n\t\t// for 32 and 64 bit platforms.\n\t\thi := uint32(src[si+0])\u003c\u003c24 | uint32(src[si+1])\u003c\u003c16 | uint32(src[si+2])\u003c\u003c8 | uint32(src[si+3])\n\t\tlo := hi\u003c\u003c8 | uint32(src[si+4])\n\n\t\tdst[di+0] = encTableLower[(hi\u003e\u003e27)\u00260x1F]\n\t\tdst[di+1] = encTableLower[(hi\u003e\u003e22)\u00260x1F]\n\t\tdst[di+2] = encTableLower[(hi\u003e\u003e17)\u00260x1F]\n\t\tdst[di+3] = encTableLower[(hi\u003e\u003e12)\u00260x1F]\n\t\tdst[di+4] = encTableLower[(hi\u003e\u003e7)\u00260x1F]\n\t\tdst[di+5] = encTableLower[(hi\u003e\u003e2)\u00260x1F]\n\t\tdst[di+6] = encTableLower[(lo\u003e\u003e5)\u00260x1F]\n\t\tdst[di+7] = encTableLower[(lo)\u00260x1F]\n\n\t\tsi += 5\n\t\tdi += 8\n\t}\n\n\t// Add the remaining small block\n\tremain := len(src) - si\n\tif remain == 0 {\n\t\treturn\n\t}\n\n\t// Encode the remaining bytes in reverse order.\n\tval := uint32(0)\n\tswitch remain {\n\tcase 4:\n\t\tval |= uint32(src[si+3])\n\t\tdst[di+6] = encTableLower[val\u003c\u003c3\u00260x1F]\n\t\tdst[di+5] = encTableLower[val\u003e\u003e2\u00260x1F]\n\t\tfallthrough\n\tcase 3:\n\t\tval |= uint32(src[si+2]) \u003c\u003c 8\n\t\tdst[di+4] = encTableLower[val\u003e\u003e7\u00260x1F]\n\t\tfallthrough\n\tcase 2:\n\t\tval |= uint32(src[si+1]) \u003c\u003c 16\n\t\tdst[di+3] = encTableLower[val\u003e\u003e12\u00260x1F]\n\t\tdst[di+2] = encTableLower[val\u003e\u003e17\u00260x1F]\n\t\tfallthrough\n\tcase 1:\n\t\tval |= uint32(src[si+0]) \u003c\u003c 24\n\t\tdst[di+1] = encTableLower[val\u003e\u003e22\u00260x1F]\n\t\tdst[di+0] = encTableLower[val\u003e\u003e27\u00260x1F]\n\t}\n}\n\n// AppendEncode appends the cford32 encoded src to dst\n// and returns the extended buffer.\nfunc AppendEncode(dst, src []byte) []byte {\n\tn := EncodedLen(len(src))\n\tdst = grow(dst, n)\n\tEncode(dst[len(dst):][:n], src)\n\treturn dst[:len(dst)+n]\n}\n\n// AppendEncodeLower appends the lowercase cford32 encoded src to dst\n// and returns the extended buffer.\nfunc AppendEncodeLower(dst, src []byte) []byte {\n\tn := EncodedLen(len(src))\n\tdst = grow(dst, n)\n\tEncodeLower(dst[len(dst):][:n], src)\n\treturn dst[:len(dst)+n]\n}\n\nfunc grow(s []byte, n int) []byte {\n\t// slices.Grow\n\tif n -= cap(s) - len(s); n \u003e 0 {\n\t\tnews := make([]byte, cap(s)+n)\n\t\tcopy(news[:cap(s)], s[:cap(s)])\n\t\treturn news[:len(s)]\n\t}\n\treturn s\n}\n\n// EncodeToString returns the cford32 encoding of src.\nfunc EncodeToString(src []byte) string {\n\tbuf := make([]byte, EncodedLen(len(src)))\n\tEncode(buf, src)\n\treturn string(buf)\n}\n\n// EncodeToStringLower returns the cford32 lowercase encoding of src.\nfunc EncodeToStringLower(src []byte) string {\n\tbuf := make([]byte, EncodedLen(len(src)))\n\tEncodeLower(buf, src)\n\treturn string(buf)\n}\n\nfunc decode(dst, src []byte) (n int, err error) {\n\tdsti := 0\n\tolen := len(src)\n\n\tfor len(src) \u003e 0 {\n\t\t// Decode quantum using the base32 alphabet\n\t\tvar dbuf [8]byte\n\t\tdlen := 8\n\n\t\tfor j := 0; j \u003c 8; {\n\t\t\tif len(src) == 0 {\n\t\t\t\t// We have reached the end and are not expecting any padding\n\t\t\t\tdlen = j\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tin := src[0]\n\t\t\tsrc = src[1:]\n\t\t\tdbuf[j] = decTable[in]\n\t\t\tif dbuf[j] == 0xFF {\n\t\t\t\treturn n, CorruptInputError(olen - len(src) - 1)\n\t\t\t}\n\t\t\tj++\n\t\t}\n\n\t\t// Pack 8x 5-bit source blocks into 5 byte destination\n\t\t// quantum\n\t\tswitch dlen {\n\t\tcase 8:\n\t\t\tdst[dsti+4] = dbuf[6]\u003c\u003c5 | dbuf[7]\n\t\t\tn++\n\t\t\tfallthrough\n\t\tcase 7:\n\t\t\tdst[dsti+3] = dbuf[4]\u003c\u003c7 | dbuf[5]\u003c\u003c2 | dbuf[6]\u003e\u003e3\n\t\t\tn++\n\t\t\tfallthrough\n\t\tcase 5:\n\t\t\tdst[dsti+2] = dbuf[3]\u003c\u003c4 | dbuf[4]\u003e\u003e1\n\t\t\tn++\n\t\t\tfallthrough\n\t\tcase 4:\n\t\t\tdst[dsti+1] = dbuf[1]\u003c\u003c6 | dbuf[2]\u003c\u003c1 | dbuf[3]\u003e\u003e4\n\t\t\tn++\n\t\t\tfallthrough\n\t\tcase 2:\n\t\t\tdst[dsti+0] = dbuf[0]\u003c\u003c3 | dbuf[1]\u003e\u003e2\n\t\t\tn++\n\t\t}\n\t\tdsti += 5\n\t}\n\treturn n, nil\n}\n\ntype encoder struct {\n\terr error\n\tw io.Writer\n\tenc func(dst, src []byte)\n\tbuf [5]byte // buffered data waiting to be encoded\n\tnbuf int // number of bytes in buf\n\tout [1024]byte // output buffer\n}\n\nfunc NewEncoder(w io.Writer) io.WriteCloser {\n\treturn \u0026encoder{w: w, enc: Encode}\n}\n\nfunc NewEncoderLower(w io.Writer) io.WriteCloser {\n\treturn \u0026encoder{w: w, enc: EncodeLower}\n}\n\nfunc (e *encoder) Write(p []byte) (n int, err error) {\n\tif e.err != nil {\n\t\treturn 0, e.err\n\t}\n\n\t// Leading fringe.\n\tif e.nbuf \u003e 0 {\n\t\tvar i int\n\t\tfor i = 0; i \u003c len(p) \u0026\u0026 e.nbuf \u003c 5; i++ {\n\t\t\te.buf[e.nbuf] = p[i]\n\t\t\te.nbuf++\n\t\t}\n\t\tn += i\n\t\tp = p[i:]\n\t\tif e.nbuf \u003c 5 {\n\t\t\treturn\n\t\t}\n\t\te.enc(e.out[0:], e.buf[0:])\n\t\tif _, e.err = e.w.Write(e.out[0:8]); e.err != nil {\n\t\t\treturn n, e.err\n\t\t}\n\t\te.nbuf = 0\n\t}\n\n\t// Large interior chunks.\n\tfor len(p) \u003e= 5 {\n\t\tnn := len(e.out) / 8 * 5\n\t\tif nn \u003e len(p) {\n\t\t\tnn = len(p)\n\t\t\tnn -= nn % 5\n\t\t}\n\t\te.enc(e.out[0:], p[0:nn])\n\t\tif _, e.err = e.w.Write(e.out[0 : nn/5*8]); e.err != nil {\n\t\t\treturn n, e.err\n\t\t}\n\t\tn += nn\n\t\tp = p[nn:]\n\t}\n\n\t// Trailing fringe.\n\tcopy(e.buf[:], p)\n\te.nbuf = len(p)\n\tn += len(p)\n\treturn\n}\n\n// Close flushes any pending output from the encoder.\n// It is an error to call Write after calling Close.\nfunc (e *encoder) Close() error {\n\t// If there's anything left in the buffer, flush it out\n\tif e.err == nil \u0026\u0026 e.nbuf \u003e 0 {\n\t\te.enc(e.out[0:], e.buf[0:e.nbuf])\n\t\tencodedLen := EncodedLen(e.nbuf)\n\t\te.nbuf = 0\n\t\t_, e.err = e.w.Write(e.out[0:encodedLen])\n\t}\n\treturn e.err\n}\n\n// Decode decodes src using cford32. It writes at most\n// [DecodedLen](len(src)) bytes to dst and returns the number of bytes\n// written. If src contains invalid cford32 data, it will return the\n// number of bytes successfully written and [CorruptInputError].\n// Newline characters (\\r and \\n) are ignored.\nfunc Decode(dst, src []byte) (n int, err error) {\n\tbuf := make([]byte, len(src))\n\tl := stripNewlines(buf, src)\n\treturn decode(dst, buf[:l])\n}\n\n// AppendDecode appends the cford32 decoded src to dst\n// and returns the extended buffer.\n// If the input is malformed, it returns the partially decoded src and an error.\nfunc AppendDecode(dst, src []byte) ([]byte, error) {\n\tn := DecodedLen(len(src))\n\n\tdst = grow(dst, n)\n\tdstsl := dst[len(dst) : len(dst)+n]\n\tn, err := Decode(dstsl, src)\n\treturn dst[:len(dst)+n], err\n}\n\n// DecodeString returns the bytes represented by the cford32 string s.\nfunc DecodeString(s string) ([]byte, error) {\n\tbuf := []byte(s)\n\tl := stripNewlines(buf, buf)\n\tn, err := decode(buf, buf[:l])\n\treturn buf[:n], err\n}\n\n// stripNewlines removes newline characters and returns the number\n// of non-newline characters copied to dst.\nfunc stripNewlines(dst, src []byte) int {\n\toffset := 0\n\tfor _, b := range src {\n\t\tif b == '\\r' || b == '\\n' {\n\t\t\tcontinue\n\t\t}\n\t\tdst[offset] = b\n\t\toffset++\n\t}\n\treturn offset\n}\n\ntype decoder struct {\n\terr error\n\tr io.Reader\n\tbuf [1024]byte // leftover input\n\tnbuf int\n\tout []byte // leftover decoded output\n\toutbuf [1024 / 8 * 5]byte\n}\n\n// NewDecoder constructs a new base32 stream decoder.\nfunc NewDecoder(r io.Reader) io.Reader {\n\treturn \u0026decoder{r: \u0026newlineFilteringReader{r}}\n}\n\nfunc readEncodedData(r io.Reader, buf []byte) (n int, err error) {\n\tfor n \u003c 1 \u0026\u0026 err == nil {\n\t\tvar nn int\n\t\tnn, err = r.Read(buf[n:])\n\t\tn += nn\n\t}\n\treturn\n}\n\nfunc (d *decoder) Read(p []byte) (n int, err error) {\n\t// Use leftover decoded output from last read.\n\tif len(d.out) \u003e 0 {\n\t\tn = copy(p, d.out)\n\t\td.out = d.out[n:]\n\t\tif len(d.out) == 0 {\n\t\t\treturn n, d.err\n\t\t}\n\t\treturn n, nil\n\t}\n\n\tif d.err != nil {\n\t\treturn 0, d.err\n\t}\n\n\t// Read nn bytes from input, bounded [8,len(d.buf)]\n\tnn := (len(p)/5 + 1) * 8\n\tif nn \u003e len(d.buf) {\n\t\tnn = len(d.buf)\n\t}\n\n\tnn, d.err = readEncodedData(d.r, d.buf[d.nbuf:nn])\n\td.nbuf += nn\n\tif d.nbuf \u003c 1 {\n\t\treturn 0, d.err\n\t}\n\n\t// Decode chunk into p, or d.out and then p if p is too small.\n\tnr := d.nbuf\n\tif d.err != io.EOF \u0026\u0026 nr%8 != 0 {\n\t\tnr -= nr % 8\n\t}\n\tnw := DecodedLen(d.nbuf)\n\n\tif nw \u003e len(p) {\n\t\tnw, err = decode(d.outbuf[0:], d.buf[0:nr])\n\t\td.out = d.outbuf[0:nw]\n\t\tn = copy(p, d.out)\n\t\td.out = d.out[n:]\n\t} else {\n\t\tn, err = decode(p, d.buf[0:nr])\n\t}\n\td.nbuf -= nr\n\tfor i := 0; i \u003c d.nbuf; i++ {\n\t\td.buf[i] = d.buf[i+nr]\n\t}\n\n\tif err != nil \u0026\u0026 (d.err == nil || d.err == io.EOF) {\n\t\td.err = err\n\t}\n\n\tif len(d.out) \u003e 0 {\n\t\t// We cannot return all the decoded bytes to the caller in this\n\t\t// invocation of Read, so we return a nil error to ensure that Read\n\t\t// will be called again. The error stored in d.err, if any, will be\n\t\t// returned with the last set of decoded bytes.\n\t\treturn n, nil\n\t}\n\n\treturn n, d.err\n}\n\ntype newlineFilteringReader struct {\n\twrapped io.Reader\n}\n\nfunc (r *newlineFilteringReader) Read(p []byte) (int, error) {\n\tn, err := r.wrapped.Read(p)\n\tfor n \u003e 0 {\n\t\ts := p[0:n]\n\t\toffset := stripNewlines(s, s)\n\t\tif err != nil || offset \u003e 0 {\n\t\t\treturn offset, err\n\t\t}\n\t\t// Previous buffer entirely whitespace, read again\n\t\tn, err = r.wrapped.Read(p)\n\t}\n\treturn n, err\n}\n"},{"name":"cford32_test.gno","body":"package cford32\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"math\"\n\t\"strings\"\n\t\"testing\"\n)\n\nfunc TestCompactRoundtrip(t *testing.T) {\n\tbuf := make([]byte, 13)\n\tprev := make([]byte, 13)\n\tfor i := uint64(0); i \u003c (1 \u003c\u003c 12); i++ {\n\t\tres := AppendCompact(i, buf[:0])\n\t\tback, err := Uint64(res)\n\t\ttestEqual(t, \"Uint64(%q) = (%d, %v), want %v\", string(res), back, err, nil)\n\t\ttestEqual(t, \"Uint64(%q) = %d, want %v\", string(res), back, i)\n\n\t\ttestEqual(t, \"bytes.Compare(prev, res) = %d, want %d\", bytes.Compare(prev, res), -1)\n\t\tprev, buf = res, prev\n\t}\n\tfor i := uint64(1\u003c\u003c34 - 1024); i \u003c (1\u003c\u003c34 + 1024); i++ {\n\t\tres := AppendCompact(i, buf[:0])\n\t\tback, err := Uint64(res)\n\t\t// println(string(res))\n\t\ttestEqual(t, \"Uint64(%q) = (%d, %v), want %v\", string(res), back, err, nil)\n\t\ttestEqual(t, \"Uint64(%q) = %d, want %v\", string(res), back, i)\n\n\t\ttestEqual(t, \"bytes.Compare(prev, res) = %d, want %d\", bytes.Compare(prev, res), -1)\n\t\tprev, buf = res, prev\n\t}\n\tfor i := uint64(1\u003c\u003c64 - 5000); i != 0; i++ {\n\t\tres := AppendCompact(i, buf[:0])\n\t\tback, err := Uint64(res)\n\t\ttestEqual(t, \"Uint64(%q) = (%d, %v), want %v\", string(res), back, err, nil)\n\t\ttestEqual(t, \"Uint64(%q) = %d, want %v\", string(res), back, i)\n\n\t\ttestEqual(t, \"bytes.Compare(prev, res) = %d, want %d\", bytes.Compare(prev, res), -1)\n\t\tprev, buf = res, prev\n\t}\n}\n\nfunc BenchmarkCompact(b *testing.B) {\n\tbuf := make([]byte, 13)\n\tfor i := 0; i \u003c b.N; i++ {\n\t\t_ = AppendCompact(uint64(i), buf[:0])\n\t}\n}\n\ntype testpair struct {\n\tdecoded, encoded string\n}\n\nvar pairs = []testpair{\n\t{\"\", \"\"},\n\t{\"f\", \"CR\"},\n\t{\"fo\", \"CSQG\"},\n\t{\"foo\", \"CSQPY\"},\n\t{\"foob\", \"CSQPYRG\"},\n\t{\"fooba\", \"CSQPYRK1\"},\n\t{\"foobar\", \"CSQPYRK1E8\"},\n\n\t{\"sure.\", \"EDTQ4S9E\"},\n\t{\"sure\", \"EDTQ4S8\"},\n\t{\"sur\", \"EDTQ4\"},\n\t{\"su\", \"EDTG\"},\n\t{\"leasure.\", \"DHJP2WVNE9JJW\"},\n\t{\"easure.\", \"CNGQ6XBJCMQ0\"},\n\t{\"asure.\", \"C5SQAWK55R\"},\n}\n\nvar bigtest = testpair{\n\t\"Twas brillig, and the slithy toves\",\n\t\"AHVP2WS0C9S6JV3CD5KJR831DSJ20X38CMG76V39EHM7J83MDXV6AWR\",\n}\n\nfunc testEqual(t *testing.T, msg string, args ...interface{}) bool {\n\tt.Helper()\n\tif args[len(args)-2] != args[len(args)-1] {\n\t\tt.Errorf(msg, args...)\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc TestEncode(t *testing.T) {\n\tfor _, p := range pairs {\n\t\tgot := EncodeToString([]byte(p.decoded))\n\t\ttestEqual(t, \"Encode(%q) = %q, want %q\", p.decoded, got, p.encoded)\n\t\tdst := AppendEncode([]byte(\"lead\"), []byte(p.decoded))\n\t\ttestEqual(t, `AppendEncode(\"lead\", %q) = %q, want %q`, p.decoded, string(dst), \"lead\"+p.encoded)\n\t}\n}\n\nfunc TestEncoder(t *testing.T) {\n\tfor _, p := range pairs {\n\t\tbb := \u0026strings.Builder{}\n\t\tencoder := NewEncoder(bb)\n\t\tencoder.Write([]byte(p.decoded))\n\t\tencoder.Close()\n\t\ttestEqual(t, \"Encode(%q) = %q, want %q\", p.decoded, bb.String(), p.encoded)\n\t}\n}\n\nfunc TestEncoderBuffering(t *testing.T) {\n\tinput := []byte(bigtest.decoded)\n\tfor bs := 1; bs \u003c= 12; bs++ {\n\t\tbb := \u0026strings.Builder{}\n\t\tencoder := NewEncoder(bb)\n\t\tfor pos := 0; pos \u003c len(input); pos += bs {\n\t\t\tend := pos + bs\n\t\t\tif end \u003e len(input) {\n\t\t\t\tend = len(input)\n\t\t\t}\n\t\t\tn, err := encoder.Write(input[pos:end])\n\t\t\ttestEqual(t, \"Write(%q) gave error %v, want %v\", input[pos:end], err, error(nil))\n\t\t\ttestEqual(t, \"Write(%q) gave length %v, want %v\", input[pos:end], n, end-pos)\n\t\t}\n\t\terr := encoder.Close()\n\t\ttestEqual(t, \"Close gave error %v, want %v\", err, error(nil))\n\t\ttestEqual(t, \"Encoding/%d of %q = %q, want %q\", bs, bigtest.decoded, bb.String(), bigtest.encoded)\n\t}\n}\n\nfunc TestDecode(t *testing.T) {\n\tfor _, p := range pairs {\n\t\tdbuf := make([]byte, DecodedLen(len(p.encoded)))\n\t\tcount, err := decode(dbuf, []byte(p.encoded))\n\t\ttestEqual(t, \"Decode(%q) = error %v, want %v\", p.encoded, err, error(nil))\n\t\ttestEqual(t, \"Decode(%q) = length %v, want %v\", p.encoded, count, len(p.decoded))\n\t\ttestEqual(t, \"Decode(%q) = %q, want %q\", p.encoded, string(dbuf[0:count]), p.decoded)\n\n\t\tdbuf, err = DecodeString(p.encoded)\n\t\ttestEqual(t, \"DecodeString(%q) = error %v, want %v\", p.encoded, err, error(nil))\n\t\ttestEqual(t, \"DecodeString(%q) = %q, want %q\", p.encoded, string(dbuf), p.decoded)\n\n\t\t// XXX: https://github.com/gnolang/gno/issues/1570\n\t\tdst, err := AppendDecode(append([]byte(nil), []byte(\"lead\")...), []byte(p.encoded))\n\t\ttestEqual(t, \"AppendDecode(%q) = error %v, want %v\", p.encoded, err, error(nil))\n\t\ttestEqual(t, `AppendDecode(\"lead\", %q) = %q, want %q`, p.encoded, string(dst), \"lead\"+p.decoded)\n\n\t\tdst2, err := AppendDecode(dst[:0:len(p.decoded)], []byte(p.encoded))\n\t\ttestEqual(t, \"AppendDecode(%q) = error %v, want %v\", p.encoded, err, error(nil))\n\t\ttestEqual(t, `AppendDecode(\"\", %q) = %q, want %q`, p.encoded, string(dst2), p.decoded)\n\t\t// XXX: https://github.com/gnolang/gno/issues/1569\n\t\t// old used \u0026dst2[0] != \u0026dst[0] as a check.\n\t\tif len(dst) \u003e 0 \u0026\u0026 len(dst2) \u003e 0 \u0026\u0026 cap(dst2) != len(p.decoded) {\n\t\t\tt.Errorf(\"unexpected capacity growth: got %d, want %d\", cap(dst2), len(p.decoded))\n\t\t}\n\t}\n}\n\n// A minimal variation on strings.Reader.\n// Here, we return a io.EOF immediately on Read if the read has reached the end\n// of the reader. It's used to simplify TestDecoder.\ntype stringReader struct {\n\ts string\n\ti int64\n}\n\nfunc (r *stringReader) Read(b []byte) (n int, err error) {\n\tif r.i \u003e= int64(len(r.s)) {\n\t\treturn 0, io.EOF\n\t}\n\tn = copy(b, r.s[r.i:])\n\tr.i += int64(n)\n\tif r.i \u003e= int64(len(r.s)) {\n\t\treturn n, io.EOF\n\t}\n\treturn\n}\n\nfunc TestDecoder(t *testing.T) {\n\tfor _, p := range pairs {\n\t\tdecoder := NewDecoder(\u0026stringReader{p.encoded, 0})\n\t\tdbuf := make([]byte, DecodedLen(len(p.encoded)))\n\t\tcount, err := decoder.Read(dbuf)\n\t\tif err != nil \u0026\u0026 err != io.EOF {\n\t\t\tt.Fatal(\"Read failed\", err)\n\t\t}\n\t\ttestEqual(t, \"Read from %q = length %v, want %v\", p.encoded, count, len(p.decoded))\n\t\ttestEqual(t, \"Decoding of %q = %q, want %q\", p.encoded, string(dbuf[0:count]), p.decoded)\n\t\tif err != io.EOF {\n\t\t\t_, err = decoder.Read(dbuf)\n\t\t}\n\t\ttestEqual(t, \"Read from %q = %v, want %v\", p.encoded, err, io.EOF)\n\t}\n}\n\ntype badReader struct {\n\tdata []byte\n\terrs []error\n\tcalled int\n\tlimit int\n}\n\n// Populates p with data, returns a count of the bytes written and an\n// error. The error returned is taken from badReader.errs, with each\n// invocation of Read returning the next error in this slice, or io.EOF,\n// if all errors from the slice have already been returned. The\n// number of bytes returned is determined by the size of the input buffer\n// the test passes to decoder.Read and will be a multiple of 8, unless\n// badReader.limit is non zero.\nfunc (b *badReader) Read(p []byte) (int, error) {\n\tlim := len(p)\n\tif b.limit != 0 \u0026\u0026 b.limit \u003c lim {\n\t\tlim = b.limit\n\t}\n\tif len(b.data) \u003c lim {\n\t\tlim = len(b.data)\n\t}\n\tfor i := range p[:lim] {\n\t\tp[i] = b.data[i]\n\t}\n\tb.data = b.data[lim:]\n\terr := io.EOF\n\tif b.called \u003c len(b.errs) {\n\t\terr = b.errs[b.called]\n\t}\n\tb.called++\n\treturn lim, err\n}\n\n// TestIssue20044 tests that decoder.Read behaves correctly when the caller\n// supplied reader returns an error.\nfunc TestIssue20044(t *testing.T) {\n\tbadErr := errors.New(\"bad reader error\")\n\ttestCases := []struct {\n\t\tr badReader\n\t\tres string\n\t\terr error\n\t\tdbuflen int\n\t}{\n\t\t// Check valid input data accompanied by an error is processed and the error is propagated.\n\t\t{\n\t\t\tr: badReader{data: []byte(\"d1jprv3fexqq4v34\"), errs: []error{badErr}},\n\t\t\tres: \"helloworld\", err: badErr,\n\t\t},\n\t\t// Check a read error accompanied by input data consisting of newlines only is propagated.\n\t\t{\n\t\t\tr: badReader{data: []byte(\"\\n\\n\\n\\n\\n\\n\\n\\n\"), errs: []error{badErr, nil}},\n\t\t\tres: \"\", err: badErr,\n\t\t},\n\t\t// Reader will be called twice. The first time it will return 8 newline characters. The\n\t\t// second time valid base32 encoded data and an error. The data should be decoded\n\t\t// correctly and the error should be propagated.\n\t\t{\n\t\t\tr: badReader{data: []byte(\"\\n\\n\\n\\n\\n\\n\\n\\nd1jprv3fexqq4v34\"), errs: []error{nil, badErr}},\n\t\t\tres: \"helloworld\", err: badErr, dbuflen: 8,\n\t\t},\n\t\t// Reader returns invalid input data (too short) and an error. Verify the reader\n\t\t// error is returned.\n\t\t{\n\t\t\tr: badReader{data: []byte(\"c\"), errs: []error{badErr}},\n\t\t\tres: \"\", err: badErr,\n\t\t},\n\t\t// Reader returns invalid input data (too short) but no error. Verify io.ErrUnexpectedEOF\n\t\t// is returned.\n\t\t// NOTE(thehowl): I don't think this should applyto us?\n\t\t/* {\n\t\t\tr: badReader{data: []byte(\"c\"), errs: []error{nil}},\n\t\t\tres: \"\", err: io.ErrUnexpectedEOF,\n\t\t},*/\n\t\t// Reader returns invalid input data and an error. Verify the reader and not the\n\t\t// decoder error is returned.\n\t\t{\n\t\t\tr: badReader{data: []byte(\"cu\"), errs: []error{badErr}},\n\t\t\tres: \"\", err: badErr,\n\t\t},\n\t\t// Reader returns valid data and io.EOF. Check data is decoded and io.EOF is propagated.\n\t\t{\n\t\t\tr: badReader{data: []byte(\"csqpyrk1\"), errs: []error{io.EOF}},\n\t\t\tres: \"fooba\", err: io.EOF,\n\t\t},\n\t\t// Check errors are properly reported when decoder.Read is called multiple times.\n\t\t// decoder.Read will be called 8 times, badReader.Read will be called twice, returning\n\t\t// valid data both times but an error on the second call.\n\t\t{\n\t\t\tr: badReader{data: []byte(\"dhjp2wvne9jjwc9g\"), errs: []error{nil, badErr}},\n\t\t\tres: \"leasure.10\", err: badErr, dbuflen: 1,\n\t\t},\n\t\t// Check io.EOF is properly reported when decoder.Read is called multiple times.\n\t\t// decoder.Read will be called 8 times, badReader.Read will be called twice, returning\n\t\t// valid data both times but io.EOF on the second call.\n\t\t{\n\t\t\tr: badReader{data: []byte(\"dhjp2wvne9jjw\"), errs: []error{nil, io.EOF}},\n\t\t\tres: \"leasure.\", err: io.EOF, dbuflen: 1,\n\t\t},\n\t\t// The following two test cases check that errors are propagated correctly when more than\n\t\t// 8 bytes are read at a time.\n\t\t{\n\t\t\tr: badReader{data: []byte(\"dhjp2wvne9jjw\"), errs: []error{io.EOF}},\n\t\t\tres: \"leasure.\", err: io.EOF, dbuflen: 11,\n\t\t},\n\t\t{\n\t\t\tr: badReader{data: []byte(\"dhjp2wvne9jjwc9g\"), errs: []error{badErr}},\n\t\t\tres: \"leasure.10\", err: badErr, dbuflen: 11,\n\t\t},\n\t\t// Check that errors are correctly propagated when the reader returns valid bytes in\n\t\t// groups that are not divisible by 8. The first read will return 11 bytes and no\n\t\t// error. The second will return 7 and an error. The data should be decoded correctly\n\t\t// and the error should be propagated.\n\t\t// NOTE(thehowl): again, this is on the assumption that this is padded, and it's not.\n\t\t/* {\n\t\t\tr: badReader{data: []byte(\"dhjp2wvne9jjw\"), errs: []error{nil, badErr}, limit: 11},\n\t\t\tres: \"leasure.\", err: badErr,\n\t\t}, */\n\t}\n\n\tfor idx, tc := range testCases {\n\t\tt.Run(fmt.Sprintf(\"%d-%s\", idx, string(tc.res)), func(t *testing.T) {\n\t\t\tinput := tc.r.data\n\t\t\tdecoder := NewDecoder(\u0026tc.r)\n\t\t\tvar dbuflen int\n\t\t\tif tc.dbuflen \u003e 0 {\n\t\t\t\tdbuflen = tc.dbuflen\n\t\t\t} else {\n\t\t\t\tdbuflen = DecodedLen(len(input))\n\t\t\t}\n\t\t\tdbuf := make([]byte, dbuflen)\n\t\t\tvar err error\n\t\t\tvar res []byte\n\t\t\tfor err == nil {\n\t\t\t\tvar n int\n\t\t\t\tn, err = decoder.Read(dbuf)\n\t\t\t\tif n \u003e 0 {\n\t\t\t\t\tres = append(res, dbuf[:n]...)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttestEqual(t, \"Decoding of %q = %q, want %q\", string(input), string(res), tc.res)\n\t\t\ttestEqual(t, \"Decoding of %q err = %v, expected %v\", string(input), err, tc.err)\n\t\t})\n\t}\n}\n\n// TestDecoderError verifies decode errors are propagated when there are no read\n// errors.\nfunc TestDecoderError(t *testing.T) {\n\tfor _, readErr := range []error{io.EOF, nil} {\n\t\tinput := \"ucsqpyrk1u\"\n\t\tdbuf := make([]byte, DecodedLen(len(input)))\n\t\tbr := badReader{data: []byte(input), errs: []error{readErr}}\n\t\tdecoder := NewDecoder(\u0026br)\n\t\tn, err := decoder.Read(dbuf)\n\t\ttestEqual(t, \"Read after EOF, n = %d, expected %d\", n, 0)\n\t\tif _, ok := err.(CorruptInputError); !ok {\n\t\t\tt.Errorf(\"Corrupt input error expected. Found %T\", err)\n\t\t}\n\t}\n}\n\n// TestReaderEOF ensures decoder.Read behaves correctly when input data is\n// exhausted.\nfunc TestReaderEOF(t *testing.T) {\n\tfor _, readErr := range []error{io.EOF, nil} {\n\t\tinput := \"MZXW6YTB\"\n\t\tbr := badReader{data: []byte(input), errs: []error{nil, readErr}}\n\t\tdecoder := NewDecoder(\u0026br)\n\t\tdbuf := make([]byte, DecodedLen(len(input)))\n\t\tn, err := decoder.Read(dbuf)\n\t\ttestEqual(t, \"Decoding of %q err = %v, expected %v\", input, err, error(nil))\n\t\tn, err = decoder.Read(dbuf)\n\t\ttestEqual(t, \"Read after EOF, n = %d, expected %d\", n, 0)\n\t\ttestEqual(t, \"Read after EOF, err = %v, expected %v\", err, io.EOF)\n\t\tn, err = decoder.Read(dbuf)\n\t\ttestEqual(t, \"Read after EOF, n = %d, expected %d\", n, 0)\n\t\ttestEqual(t, \"Read after EOF, err = %v, expected %v\", err, io.EOF)\n\t}\n}\n\nfunc TestDecoderBuffering(t *testing.T) {\n\tfor bs := 1; bs \u003c= 12; bs++ {\n\t\tdecoder := NewDecoder(strings.NewReader(bigtest.encoded))\n\t\tbuf := make([]byte, len(bigtest.decoded)+12)\n\t\tvar total int\n\t\tvar n int\n\t\tvar err error\n\t\tfor total = 0; total \u003c len(bigtest.decoded) \u0026\u0026 err == nil; {\n\t\t\tn, err = decoder.Read(buf[total : total+bs])\n\t\t\ttotal += n\n\t\t}\n\t\tif err != nil \u0026\u0026 err != io.EOF {\n\t\t\tt.Errorf(\"Read from %q at pos %d = %d, unexpected error %v\", bigtest.encoded, total, n, err)\n\t\t}\n\t\ttestEqual(t, \"Decoding/%d of %q = %q, want %q\", bs, bigtest.encoded, string(buf[0:total]), bigtest.decoded)\n\t}\n}\n\nfunc TestDecodeCorrupt(t *testing.T) {\n\ttestCases := []struct {\n\t\tinput string\n\t\toffset int // -1 means no corruption.\n\t}{\n\t\t{\"\", -1},\n\t\t{\"iIoOlL\", -1},\n\t\t{\"!!!!\", 0},\n\t\t{\"uxp10\", 0},\n\t\t{\"x===\", 1},\n\t\t{\"AA=A====\", 2},\n\t\t{\"AAA=AAAA\", 3},\n\t\t// Much fewer cases compared to Go as there are much fewer cases where input\n\t\t// can be \"corrupted\".\n\t}\n\tfor _, tc := range testCases {\n\t\tdbuf := make([]byte, DecodedLen(len(tc.input)))\n\t\t_, err := Decode(dbuf, []byte(tc.input))\n\t\tif tc.offset == -1 {\n\t\t\tif err != nil {\n\t\t\t\tt.Error(\"Decoder wrongly detected corruption in\", tc.input)\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\tswitch err := err.(type) {\n\t\tcase CorruptInputError:\n\t\t\ttestEqual(t, \"Corruption in %q at offset %v, want %v\", tc.input, int(err), tc.offset)\n\t\tdefault:\n\t\t\tt.Error(\"Decoder failed to detect corruption in\", tc)\n\t\t}\n\t}\n}\n\nfunc TestBig(t *testing.T) {\n\tn := 3*1000 + 1\n\traw := make([]byte, n)\n\tconst alpha = \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\"\n\tfor i := 0; i \u003c n; i++ {\n\t\traw[i] = alpha[i%len(alpha)]\n\t}\n\tencoded := new(bytes.Buffer)\n\tw := NewEncoder(encoded)\n\tnn, err := w.Write(raw)\n\tif nn != n || err != nil {\n\t\tt.Fatalf(\"Encoder.Write(raw) = %d, %v want %d, nil\", nn, err, n)\n\t}\n\terr = w.Close()\n\tif err != nil {\n\t\tt.Fatalf(\"Encoder.Close() = %v want nil\", err)\n\t}\n\tdecoded, err := io.ReadAll(NewDecoder(encoded))\n\tif err != nil {\n\t\tt.Fatalf(\"io.ReadAll(NewDecoder(...)): %v\", err)\n\t}\n\n\tif !bytes.Equal(raw, decoded) {\n\t\tvar i int\n\t\tfor i = 0; i \u003c len(decoded) \u0026\u0026 i \u003c len(raw); i++ {\n\t\t\tif decoded[i] != raw[i] {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tt.Errorf(\"Decode(Encode(%d-byte string)) failed at offset %d\", n, i)\n\t}\n}\n\nfunc testStringEncoding(t *testing.T, expected string, examples []string) {\n\tfor _, e := range examples {\n\t\tbuf, err := DecodeString(e)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Decode(%q) failed: %v\", e, err)\n\t\t\tcontinue\n\t\t}\n\t\tif s := string(buf); s != expected {\n\t\t\tt.Errorf(\"Decode(%q) = %q, want %q\", e, s, expected)\n\t\t}\n\t}\n}\n\nfunc TestNewLineCharacters(t *testing.T) {\n\t// Each of these should decode to the string \"sure\", without errors.\n\texamples := []string{\n\t\t\"EDTQ4S8\",\n\t\t\"EDTQ4S8\\r\",\n\t\t\"EDTQ4S8\\n\",\n\t\t\"EDTQ4S8\\r\\n\",\n\t\t\"EDTQ4S\\r\\n8\",\n\t\t\"EDT\\rQ4S\\n8\",\n\t\t\"edt\\nq4s\\r8\",\n\t\t\"edt\\nq4s8\",\n\t\t\"EDTQ4S\\n8\",\n\t}\n\ttestStringEncoding(t, \"sure\", examples)\n}\n\nfunc BenchmarkEncode(b *testing.B) {\n\tdata := make([]byte, 8192)\n\tbuf := make([]byte, EncodedLen(len(data)))\n\tb.SetBytes(int64(len(data)))\n\tfor i := 0; i \u003c b.N; i++ {\n\t\tEncode(buf, data)\n\t}\n}\n\nfunc BenchmarkEncodeToString(b *testing.B) {\n\tdata := make([]byte, 8192)\n\tb.SetBytes(int64(len(data)))\n\tfor i := 0; i \u003c b.N; i++ {\n\t\tEncodeToString(data)\n\t}\n}\n\nfunc BenchmarkDecode(b *testing.B) {\n\tdata := make([]byte, EncodedLen(8192))\n\tEncode(data, make([]byte, 8192))\n\tbuf := make([]byte, 8192)\n\tb.SetBytes(int64(len(data)))\n\tfor i := 0; i \u003c b.N; i++ {\n\t\tDecode(buf, data)\n\t}\n}\n\nfunc BenchmarkDecodeString(b *testing.B) {\n\tdata := EncodeToString(make([]byte, 8192))\n\tb.SetBytes(int64(len(data)))\n\tfor i := 0; i \u003c b.N; i++ {\n\t\tDecodeString(data)\n\t}\n}\n\n/* TODO: rewrite without using goroutines\nfunc TestBufferedDecodingSameError(t *testing.T) {\n\ttestcases := []struct {\n\t\tprefix string\n\t\tchunkCombinations [][]string\n\t\texpected error\n\t}{\n\t\t// Normal case, this is valid input\n\t\t{\"helloworld\", [][]string{\n\t\t\t{\"D1JP\", \"RV3F\", \"EXQQ\", \"4V34\"},\n\t\t\t{\"D1JPRV3FEXQQ4V34\"},\n\t\t\t{\"D1J\", \"PRV\", \"3FE\", \"XQQ\", \"4V3\", \"4\"},\n\t\t\t{\"D1JPRV3FEXQQ4V\", \"34\"},\n\t\t}, nil},\n\n\t\t// Normal case, this is valid input\n\t\t{\"fooba\", [][]string{\n\t\t\t{\"CSQPYRK1\"},\n\t\t\t{\"CSQPYRK\", \"1\"},\n\t\t\t{\"CSQPYR\", \"K1\"},\n\t\t\t{\"CSQPY\", \"RK1\"},\n\t\t\t{\"CSQPY\", \"RK\", \"1\"},\n\t\t\t{\"CSQPY\", \"RK1\"},\n\t\t\t{\"CSQP\", \"YR\", \"K1\"},\n\t\t}, nil},\n\n\t\t// NOTE: many test cases have been removed as we don't return ErrUnexpectedEOF.\n\t}\n\n\tfor _, testcase := range testcases {\n\t\tfor _, chunks := range testcase.chunkCombinations {\n\t\t\tpr, pw := io.Pipe()\n\n\t\t\t// Write the encoded chunks into the pipe\n\t\t\tgo func() {\n\t\t\t\tfor _, chunk := range chunks {\n\t\t\t\t\tpw.Write([]byte(chunk))\n\t\t\t\t}\n\t\t\t\tpw.Close()\n\t\t\t}()\n\n\t\t\tdecoder := NewDecoder(pr)\n\t\t\tback, err := io.ReadAll(decoder)\n\n\t\t\tif err != testcase.expected {\n\t\t\t\tt.Errorf(\"Expected %v, got %v; case %s %+v\", testcase.expected, err, testcase.prefix, chunks)\n\t\t\t}\n\t\t\tif testcase.expected == nil {\n\t\t\t\ttestEqual(t, \"Decode from NewDecoder(chunkReader(%v)) = %q, want %q\", chunks, string(back), testcase.prefix)\n\t\t\t}\n\t\t}\n\t}\n}\n*/\n\nfunc TestEncodedLen(t *testing.T) {\n\ttype test struct {\n\t\tn int\n\t\twant int64\n\t}\n\ttests := []test{\n\t\t{0, 0},\n\t\t{1, 2},\n\t\t{2, 4},\n\t\t{3, 5},\n\t\t{4, 7},\n\t\t{5, 8},\n\t\t{6, 10},\n\t\t{7, 12},\n\t\t{10, 16},\n\t\t{11, 18},\n\t}\n\t// check overflow\n\ttests = append(tests, test{(math.MaxInt-4)/8 + 1, 1844674407370955162})\n\ttests = append(tests, test{math.MaxInt/8*5 + 4, math.MaxInt})\n\tfor _, tt := range tests {\n\t\tif got := EncodedLen(tt.n); int64(got) != tt.want {\n\t\t\tt.Errorf(\"EncodedLen(%d): got %d, want %d\", tt.n, got, tt.want)\n\t\t}\n\t}\n}\n\nfunc TestDecodedLen(t *testing.T) {\n\ttype test struct {\n\t\tn int\n\t\twant int64\n\t}\n\ttests := []test{\n\t\t{0, 0},\n\t\t{2, 1},\n\t\t{4, 2},\n\t\t{5, 3},\n\t\t{7, 4},\n\t\t{8, 5},\n\t\t{10, 6},\n\t\t{12, 7},\n\t\t{16, 10},\n\t\t{18, 11},\n\t}\n\t// check overflow\n\ttests = append(tests, test{math.MaxInt/5 + 1, 1152921504606846976})\n\ttests = append(tests, test{math.MaxInt, 5764607523034234879})\n\tfor _, tt := range tests {\n\t\tif got := DecodedLen(tt.n); int64(got) != tt.want {\n\t\t\tt.Errorf(\"DecodedLen(%d): got %d, want %d\", tt.n, got, tt.want)\n\t\t}\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"context","path":"gno.land/p/demo/context","files":[{"name":"context.gno","body":"// Package context provides a minimal implementation of Go context with support\n// for Value and WithValue.\n//\n// Adapted from https://github.com/golang/go/tree/master/src/context/.\n// Copyright 2016 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\npackage context\n\ntype Context interface {\n\t// Value returns the value associated with this context for key, or nil\n\t// if no value is associated with key.\n\tValue(key interface{}) interface{}\n}\n\n// Empty returns a non-nil, empty context, similar with context.Background and\n// context.TODO in Go.\nfunc Empty() Context {\n\treturn \u0026emptyCtx{}\n}\n\ntype emptyCtx struct{}\n\nfunc (ctx emptyCtx) Value(key interface{}) interface{} {\n\treturn nil\n}\n\nfunc (ctx emptyCtx) String() string {\n\treturn \"context.Empty\"\n}\n\ntype valueCtx struct {\n\tparent Context\n\tkey, val interface{}\n}\n\nfunc (ctx *valueCtx) Value(key interface{}) interface{} {\n\tif ctx.key == key {\n\t\treturn ctx.val\n\t}\n\treturn ctx.parent.Value(key)\n}\n\nfunc stringify(v interface{}) string {\n\tswitch s := v.(type) {\n\tcase stringer:\n\t\treturn s.String()\n\tcase string:\n\t\treturn s\n\t}\n\treturn \"non-stringer\"\n}\n\ntype stringer interface {\n\tString() string\n}\n\nfunc (c *valueCtx) String() string {\n\treturn stringify(c.parent) + \".WithValue(\" +\n\t\tstringify(c.key) + \", \" +\n\t\tstringify(c.val) + \")\"\n}\n\n// WithValue returns a copy of parent in which the value associated with key is\n// val.\nfunc WithValue(parent Context, key, val interface{}) Context {\n\tif key == nil {\n\t\tpanic(\"nil key\")\n\t}\n\t// XXX: if !reflect.TypeOf(key).Comparable() { panic(\"key is not comparable\") }\n\treturn \u0026valueCtx{parent, key, val}\n}\n"},{"name":"context_test.gno","body":"package context\n\nimport \"testing\"\n\nfunc TestContextExample(t *testing.T) {\n\ttype favContextKey string\n\n\tk := favContextKey(\"language\")\n\tctx := WithValue(Empty(), k, \"Gno\")\n\n\tif v := ctx.Value(k); v != nil {\n\t\tif string(v) != \"Gno\" {\n\t\t\tt.Errorf(\"language value should be Gno, but is %s\", v)\n\t\t}\n\t} else {\n\t\tt.Errorf(\"language key value was not found\")\n\t}\n\n\tif v := ctx.Value(favContextKey(\"color\")); v != nil {\n\t\tt.Errorf(\"color key was found\")\n\t}\n}\n\n// otherContext is a Context that's not one of the types defined in context.go.\n// This lets us test code paths that differ based on the underlying type of the\n// Context.\ntype otherContext struct {\n\tContext\n}\n\ntype (\n\tkey1 int\n\tkey2 int\n)\n\n// func (k key2) String() string { return fmt.Sprintf(\"%[1]T(%[1]d)\", k) }\n\nvar (\n\tk1 = key1(1)\n\tk2 = key2(1) // same int as k1, different type\n\tk3 = key2(3) // same type as k2, different int\n)\n\nfunc TestValues(t *testing.T) {\n\tcheck := func(c Context, nm, v1, v2, v3 string) {\n\t\tif v, ok := c.Value(k1).(string); ok == (len(v1) == 0) || v != v1 {\n\t\t\tt.Errorf(`%s.Value(k1).(string) = %q, %t want %q, %t`, nm, v, ok, v1, len(v1) != 0)\n\t\t}\n\t\tif v, ok := c.Value(k2).(string); ok == (len(v2) == 0) || v != v2 {\n\t\t\tt.Errorf(`%s.Value(k2).(string) = %q, %t want %q, %t`, nm, v, ok, v2, len(v2) != 0)\n\t\t}\n\t\tif v, ok := c.Value(k3).(string); ok == (len(v3) == 0) || v != v3 {\n\t\t\tt.Errorf(`%s.Value(k3).(string) = %q, %t want %q, %t`, nm, v, ok, v3, len(v3) != 0)\n\t\t}\n\t}\n\n\tc0 := Empty()\n\tcheck(c0, \"c0\", \"\", \"\", \"\")\n\n\tt.Skip() // XXX: depends on https://github.com/gnolang/gno/issues/2386\n\n\tc1 := WithValue(Empty(), k1, \"c1k1\")\n\tcheck(c1, \"c1\", \"c1k1\", \"\", \"\")\n\n\t/*if got, want := c1.String(), `context.Empty.WithValue(context_test.key1, c1k1)`; got != want {\n\t\tt.Errorf(\"c.String() = %q want %q\", got, want)\n\t}*/\n\n\tc2 := WithValue(c1, k2, \"c2k2\")\n\tcheck(c2, \"c2\", \"c1k1\", \"c2k2\", \"\")\n\n\t/*if got, want := fmt.Sprint(c2), `context.Empty.WithValue(context_test.key1, c1k1).WithValue(context_test.key2(1), c2k2)`; got != want {\n\t\tt.Errorf(\"c.String() = %q want %q\", got, want)\n\t}*/\n\n\tc3 := WithValue(c2, k3, \"c3k3\")\n\tcheck(c3, \"c2\", \"c1k1\", \"c2k2\", \"c3k3\")\n\n\tc4 := WithValue(c3, k1, nil)\n\tcheck(c4, \"c4\", \"\", \"c2k2\", \"c3k3\")\n\n\to0 := otherContext{Empty()}\n\tcheck(o0, \"o0\", \"\", \"\", \"\")\n\n\to1 := otherContext{WithValue(Empty(), k1, \"c1k1\")}\n\tcheck(o1, \"o1\", \"c1k1\", \"\", \"\")\n\n\to2 := WithValue(o1, k2, \"o2k2\")\n\tcheck(o2, \"o2\", \"c1k1\", \"o2k2\", \"\")\n\n\to3 := otherContext{c4}\n\tcheck(o3, \"o3\", \"\", \"c2k2\", \"c3k3\")\n\n\to4 := WithValue(o3, k3, nil)\n\tcheck(o4, \"o4\", \"\", \"c2k2\", \"\")\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"dom","path":"gno.land/p/demo/dom","files":[{"name":"dom.gno","body":"// XXX This is only used for testing in ./tests.\n// Otherwise this package is deprecated.\n// TODO: replace with a package that is supported, and delete this.\n\npackage dom\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/p/demo/avl\"\n)\n\ntype Plot struct {\n\tName string\n\tPosts avl.Tree // postsCtr -\u003e *Post\n\tPostsCtr int\n}\n\nfunc (plot *Plot) AddPost(title string, body string) {\n\tctr := plot.PostsCtr\n\tplot.PostsCtr++\n\tkey := strconv.Itoa(ctr)\n\tpost := \u0026Post{\n\t\tTitle: title,\n\t\tBody: body,\n\t}\n\tplot.Posts.Set(key, post)\n}\n\nfunc (plot *Plot) String() string {\n\tstr := \"# [plot] \" + plot.Name + \"\\n\"\n\tif plot.Posts.Size() \u003e 0 {\n\t\tplot.Posts.Iterate(\"\", \"\", func(key string, value interface{}) bool {\n\t\t\tstr += \"\\n\"\n\t\t\tstr += value.(*Post).String()\n\t\t\treturn false\n\t\t})\n\t}\n\treturn str\n}\n\ntype Post struct {\n\tTitle string\n\tBody string\n\tComments avl.Tree\n}\n\nfunc (post *Post) String() string {\n\tstr := \"## \" + post.Title + \"\\n\"\n\tstr += \"\"\n\tstr += post.Body\n\tif post.Comments.Size() \u003e 0 {\n\t\tpost.Comments.Iterate(\"\", \"\", func(key string, value interface{}) bool {\n\t\t\tstr += \"\\n\"\n\t\t\tstr += value.(*Comment).String()\n\t\t\treturn false\n\t\t})\n\t}\n\treturn str\n}\n\ntype Comment struct {\n\tCreator string\n\tBody string\n}\n\nfunc (cmm Comment) String() string {\n\treturn cmm.Body + \" - @\" + cmm.Creator + \"\\n\"\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"entropy","path":"gno.land/p/demo/entropy","files":[{"name":"entropy.gno","body":"// Entropy generates fully deterministic, cost-effective, and hard to guess\n// numbers.\n//\n// It is designed both for single-usage, like seeding math/rand or for being\n// reused which increases the entropy and its cost effectiveness.\n//\n// Disclaimer: this package is unsafe and won't prevent others to guess values\n// in advance.\n//\n// It uses the Bernstein's hash djb2 to be CPU-cycle efficient.\npackage entropy\n\nimport (\n\t\"math\"\n\t\"std\"\n\t\"time\"\n)\n\ntype Instance struct {\n\tvalue uint32\n}\n\nfunc New() *Instance {\n\tr := Instance{value: 5381}\n\tr.addEntropy()\n\treturn \u0026r\n}\n\nfunc FromSeed(seed uint32) *Instance {\n\tr := Instance{value: seed}\n\tr.addEntropy()\n\treturn \u0026r\n}\n\nfunc (i *Instance) Seed() uint32 {\n\treturn i.value\n}\n\nfunc (i *Instance) djb2String(input string) {\n\tfor _, c := range input {\n\t\ti.djb2Uint32(uint32(c))\n\t}\n}\n\n// super fast random algorithm.\n// http://www.cse.yorku.ca/~oz/hash.html\nfunc (i *Instance) djb2Uint32(input uint32) {\n\ti.value = (i.value \u003c\u003c 5) + i.value + input\n}\n\n// AddEntropy uses various runtime variables to add entropy to the existing seed.\nfunc (i *Instance) addEntropy() {\n\t// FIXME: reapply the 5381 initial value?\n\n\t// inherit previous entropy\n\t// nothing to do\n\n\t// handle callers\n\t{\n\t\tcaller1 := std.GetCallerAt(1).String()\n\t\ti.djb2String(caller1)\n\t\tcaller2 := std.GetCallerAt(2).String()\n\t\ti.djb2String(caller2)\n\t}\n\n\t// height\n\t{\n\t\theight := std.GetHeight()\n\t\tif height \u003e= math.MaxUint32 {\n\t\t\theight -= math.MaxUint32\n\t\t}\n\t\ti.djb2Uint32(uint32(height))\n\t}\n\n\t// time\n\t{\n\t\tsecs := time.Now().Second()\n\t\ti.djb2Uint32(uint32(secs))\n\t\tnsecs := time.Now().Nanosecond()\n\t\ti.djb2Uint32(uint32(nsecs))\n\t}\n\n\t// FIXME: compute other hard-to-guess but deterministic variables, like real gas?\n}\n\nfunc (i *Instance) Value() uint32 {\n\ti.addEntropy()\n\treturn i.value\n}\n"},{"name":"entropy_test.gno","body":"package entropy\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\t\"testing\"\n)\n\nfunc TestInstance(t *testing.T) {\n\tinstance := New()\n\tif instance == nil {\n\t\tt.Errorf(\"instance should not be nil\")\n\t}\n}\n\nfunc TestInstanceValue(t *testing.T) {\n\tbaseEntropy := New()\n\tbaseResult := computeValue(t, baseEntropy)\n\n\tsameHeightEntropy := New()\n\tsameHeightResult := computeValue(t, sameHeightEntropy)\n\n\tif baseResult != sameHeightResult {\n\t\tt.Errorf(\"should have the same result: new=%s, base=%s\", sameHeightResult, baseResult)\n\t}\n\n\tstd.TestSkipHeights(1)\n\tdifferentHeightEntropy := New()\n\tdifferentHeightResult := computeValue(t, differentHeightEntropy)\n\n\tif baseResult == differentHeightResult {\n\t\tt.Errorf(\"should have different result: new=%s, base=%s\", differentHeightResult, baseResult)\n\t}\n}\n\nfunc computeValue(t *testing.T, r *Instance) string {\n\tt.Helper()\n\n\tout := \"\"\n\tfor i := 0; i \u003c 10; i++ {\n\t\tval := int(r.Value())\n\t\tout += strconv.Itoa(val) + \" \"\n\t}\n\n\treturn out\n}\n"},{"name":"z_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/entropy\"\n)\n\nfunc main() {\n\t// initial\n\tprintln(\"---\")\n\tr := entropy.New()\n\tprintln(r.Value())\n\tprintln(r.Value())\n\tprintln(r.Value())\n\tprintln(r.Value())\n\tprintln(r.Value())\n\n\t// should be the same\n\tprintln(\"---\")\n\tr = entropy.New()\n\tprintln(r.Value())\n\tprintln(r.Value())\n\tprintln(r.Value())\n\tprintln(r.Value())\n\tprintln(r.Value())\n\n\tstd.TestSkipHeights(1)\n\tprintln(\"---\")\n\tr = entropy.New()\n\tprintln(r.Value())\n\tprintln(r.Value())\n\tprintln(r.Value())\n\tprintln(r.Value())\n\tprintln(r.Value())\n}\n\n// Output:\n// ---\n// 4129293727\n// 2141104956\n// 1950222777\n// 3348280598\n// 438354259\n// ---\n// 4129293727\n// 2141104956\n// 1950222777\n// 3348280598\n// 438354259\n// ---\n// 49506731\n// 1539580078\n// 2695928529\n// 1895482388\n// 3462727799\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"flow","path":"gno.land/p/demo/flow","files":[{"name":"LICENSE","body":"https://github.com/mxk/go-flowrate/blob/master/LICENSE\nBSD 3-Clause \"New\" or \"Revised\" License\n\nCopyright (c) 2014 The Go-FlowRate Authors. All rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n * Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n\n * Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in the\n documentation and/or other materials provided with the\n distribution.\n\n * Neither the name of the go-flowrate project nor the names of its\n contributors may be used to endorse or promote products derived\n from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\nOWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"name":"README.md","body":"Data Flow Rate Control\n======================\n\nTo download and install this package run:\n\ngo get github.com/mxk/go-flowrate/flowrate\n\nThe documentation is available at:\n\nhttp://godoc.org/github.com/mxk/go-flowrate/flowrate\n"},{"name":"flow.gno","body":"//\n// Written by Maxim Khitrov (November 2012)\n//\n// XXX modified to disable blocking, time.Sleep().\n\n// Package flow provides the tools for monitoring and limiting the flow rate\n// of an arbitrary data stream.\npackage flow\n\nimport (\n\t\"math\"\n\t// \"sync\"\n\t\"time\"\n)\n\n// Monitor monitors and limits the transfer rate of a data stream.\ntype Monitor struct {\n\t// mu sync.Mutex // Mutex guarding access to all internal fields\n\tactive bool // Flag indicating an active transfer\n\tstart time.Duration // Transfer start time (clock() value)\n\tbytes int64 // Total number of bytes transferred\n\tsamples int64 // Total number of samples taken\n\n\trSample float64 // Most recent transfer rate sample (bytes per second)\n\trEMA float64 // Exponential moving average of rSample\n\trPeak float64 // Peak transfer rate (max of all rSamples)\n\trWindow float64 // rEMA window (seconds)\n\n\tsBytes int64 // Number of bytes transferred since sLast\n\tsLast time.Duration // Most recent sample time (stop time when inactive)\n\tsRate time.Duration // Sampling rate\n\n\ttBytes int64 // Number of bytes expected in the current transfer\n\ttLast time.Duration // Time of the most recent transfer of at least 1 byte\n}\n\n// New creates a new flow control monitor. Instantaneous transfer rate is\n// measured and updated for each sampleRate interval. windowSize determines the\n// weight of each sample in the exponential moving average (EMA) calculation.\n// The exact formulas are:\n//\n//\tsampleTime = currentTime - prevSampleTime\n//\tsampleRate = byteCount / sampleTime\n//\tweight = 1 - exp(-sampleTime/windowSize)\n//\tnewRate = weight*sampleRate + (1-weight)*oldRate\n//\n// The default values for sampleRate and windowSize (if \u003c= 0) are 100ms and 1s,\n// respectively.\nfunc New(sampleRate, windowSize time.Duration) *Monitor {\n\tif sampleRate = clockRound(sampleRate); sampleRate \u003c= 0 {\n\t\tsampleRate = 5 * clockRate\n\t}\n\tif windowSize \u003c= 0 {\n\t\twindowSize = 1 * time.Second\n\t}\n\tnow := clock()\n\treturn \u0026Monitor{\n\t\tactive: true,\n\t\tstart: now,\n\t\trWindow: windowSize.Seconds(),\n\t\tsLast: now,\n\t\tsRate: sampleRate,\n\t\ttLast: now,\n\t}\n}\n\n// Update records the transfer of n bytes and returns n. It should be called\n// after each Read/Write operation, even if n is 0.\nfunc (m *Monitor) Update(n int) int {\n\t// m.mu.Lock()\n\tm.update(n)\n\t// m.mu.Unlock()\n\treturn n\n}\n\n// Hack to set the current rEMA.\nfunc (m *Monitor) SetREMA(rEMA float64) {\n\t// m.mu.Lock()\n\tm.rEMA = rEMA\n\tm.samples++\n\t// m.mu.Unlock()\n}\n\n// IO is a convenience method intended to wrap io.Reader and io.Writer method\n// execution. It calls m.Update(n) and then returns (n, err) unmodified.\nfunc (m *Monitor) IO(n int, err error) (int, error) {\n\treturn m.Update(n), err\n}\n\n// Done marks the transfer as finished and prevents any further updates or\n// limiting. Instantaneous and current transfer rates drop to 0. Update, IO, and\n// Limit methods become NOOPs. It returns the total number of bytes transferred.\nfunc (m *Monitor) Done() int64 {\n\t// m.mu.Lock()\n\tif now := m.update(0); m.sBytes \u003e 0 {\n\t\tm.reset(now)\n\t}\n\tm.active = false\n\tm.tLast = 0\n\tn := m.bytes\n\t// m.mu.Unlock()\n\treturn n\n}\n\n// timeRemLimit is the maximum Status.TimeRem value.\nconst timeRemLimit = 999*time.Hour + 59*time.Minute + 59*time.Second\n\n// Status represents the current Monitor status. All transfer rates are in bytes\n// per second rounded to the nearest byte.\ntype Status struct {\n\tActive bool // Flag indicating an active transfer\n\tStart time.Time // Transfer start time\n\tDuration time.Duration // Time period covered by the statistics\n\tIdle time.Duration // Time since the last transfer of at least 1 byte\n\tBytes int64 // Total number of bytes transferred\n\tSamples int64 // Total number of samples taken\n\tInstRate int64 // Instantaneous transfer rate\n\tCurRate int64 // Current transfer rate (EMA of InstRate)\n\tAvgRate int64 // Average transfer rate (Bytes / Duration)\n\tPeakRate int64 // Maximum instantaneous transfer rate\n\tBytesRem int64 // Number of bytes remaining in the transfer\n\tTimeRem time.Duration // Estimated time to completion\n\tProgress Percent // Overall transfer progress\n}\n\nfunc (s Status) String() string {\n\treturn \"STATUS{}\"\n}\n\n// Status returns current transfer status information. The returned value\n// becomes static after a call to Done.\nfunc (m *Monitor) Status() Status {\n\t// m.mu.Lock()\n\tnow := m.update(0)\n\ts := Status{\n\t\tActive: m.active,\n\t\tStart: clockToTime(m.start),\n\t\tDuration: m.sLast - m.start,\n\t\tIdle: now - m.tLast,\n\t\tBytes: m.bytes,\n\t\tSamples: m.samples,\n\t\tPeakRate: round(m.rPeak),\n\t\tBytesRem: m.tBytes - m.bytes,\n\t\tProgress: percentOf(float64(m.bytes), float64(m.tBytes)),\n\t}\n\tif s.BytesRem \u003c 0 {\n\t\ts.BytesRem = 0\n\t}\n\tif s.Duration \u003e 0 {\n\t\trAvg := float64(s.Bytes) / s.Duration.Seconds()\n\t\ts.AvgRate = round(rAvg)\n\t\tif s.Active {\n\t\t\ts.InstRate = round(m.rSample)\n\t\t\ts.CurRate = round(m.rEMA)\n\t\t\tif s.BytesRem \u003e 0 {\n\t\t\t\tif tRate := 0.8*m.rEMA + 0.2*rAvg; tRate \u003e 0 {\n\t\t\t\t\tns := float64(s.BytesRem) / tRate * 1e9\n\t\t\t\t\tif ns \u003e float64(timeRemLimit) {\n\t\t\t\t\t\tns = float64(timeRemLimit)\n\t\t\t\t\t}\n\t\t\t\t\ts.TimeRem = clockRound(time.Duration(ns))\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t// m.mu.Unlock()\n\treturn s\n}\n\n// Limit restricts the instantaneous (per-sample) data flow to rate bytes per\n// second. It returns the maximum number of bytes (0 \u003c= n \u003c= want) that may be\n// transferred immediately without exceeding the limit. If block == true, the\n// call blocks until n \u003e 0. want is returned unmodified if want \u003c 1, rate \u003c 1,\n// or the transfer is inactive (after a call to Done).\n//\n// At least one byte is always allowed to be transferred in any given sampling\n// period. Thus, if the sampling rate is 100ms, the lowest achievable flow rate\n// is 10 bytes per second.\n//\n// For usage examples, see the implementation of Reader and Writer in io.go.\nfunc (m *Monitor) Limit(want int, rate int64, block bool) (n int) {\n\tif block {\n\t\tpanic(\"blocking not yet supported\")\n\t}\n\tif want \u003c 1 || rate \u003c 1 {\n\t\treturn want\n\t}\n\t// m.mu.Lock()\n\n\t// Determine the maximum number of bytes that can be sent in one sample\n\tlimit := round(float64(rate) * m.sRate.Seconds())\n\tif limit \u003c= 0 {\n\t\tlimit = 1\n\t}\n\n\t_ = m.update(0)\n\t/* XXX\n\t// If block == true, wait until m.sBytes \u003c limit\n\tif now := m.update(0); block {\n\t\tfor m.sBytes \u003e= limit \u0026\u0026 m.active {\n\t\t\tnow = m.waitNextSample(now)\n\t\t}\n\t}\n\t*/\n\n\t// Make limit \u003c= want (unlimited if the transfer is no longer active)\n\tif limit -= m.sBytes; limit \u003e int64(want) || !m.active {\n\t\tlimit = int64(want)\n\t}\n\t// m.mu.Unlock()\n\n\tif limit \u003c 0 {\n\t\tlimit = 0\n\t}\n\treturn int(limit)\n}\n\n// SetTransferSize specifies the total size of the data transfer, which allows\n// the Monitor to calculate the overall progress and time to completion.\nfunc (m *Monitor) SetTransferSize(bytes int64) {\n\tif bytes \u003c 0 {\n\t\tbytes = 0\n\t}\n\t// m.mu.Lock()\n\tm.tBytes = bytes\n\t// m.mu.Unlock()\n}\n\n// update accumulates the transferred byte count for the current sample until\n// clock() - m.sLast \u003e= m.sRate. The monitor status is updated once the current\n// sample is done.\nfunc (m *Monitor) update(n int) (now time.Duration) {\n\tif !m.active {\n\t\treturn\n\t}\n\tif now = clock(); n \u003e 0 {\n\t\tm.tLast = now\n\t}\n\tm.sBytes += int64(n)\n\tif sTime := now - m.sLast; sTime \u003e= m.sRate {\n\t\tt := sTime.Seconds()\n\t\tif m.rSample = float64(m.sBytes) / t; m.rSample \u003e m.rPeak {\n\t\t\tm.rPeak = m.rSample\n\t\t}\n\n\t\t// Exponential moving average using a method similar to *nix load\n\t\t// average calculation. Longer sampling periods carry greater weight.\n\t\tif m.samples \u003e 0 {\n\t\t\tw := math.Exp(-t / m.rWindow)\n\t\t\tm.rEMA = m.rSample + w*(m.rEMA-m.rSample)\n\t\t} else {\n\t\t\tm.rEMA = m.rSample\n\t\t}\n\t\tm.reset(now)\n\t}\n\treturn\n}\n\n// reset clears the current sample state in preparation for the next sample.\nfunc (m *Monitor) reset(sampleTime time.Duration) {\n\tm.bytes += m.sBytes\n\tm.samples++\n\tm.sBytes = 0\n\tm.sLast = sampleTime\n}\n\n/*\n// waitNextSample sleeps for the remainder of the current sample. The lock is\n// released and reacquired during the actual sleep period, so it's possible for\n// the transfer to be inactive when this method returns.\nfunc (m *Monitor) waitNextSample(now time.Duration) time.Duration {\n\tconst minWait = 5 * time.Millisecond\n\tcurrent := m.sLast\n\n\t// sleep until the last sample time changes (ideally, just one iteration)\n\tfor m.sLast == current \u0026\u0026 m.active {\n\t\td := current + m.sRate - now\n\t\t// m.mu.Unlock()\n\t\tif d \u003c minWait {\n\t\t\td = minWait\n\t\t}\n\t\ttime.Sleep(d)\n\t\t// m.mu.Lock()\n\t\tnow = m.update(0)\n\t}\n\treturn now\n}\n*/\n"},{"name":"io.gno","body":"//\n// Written by Maxim Khitrov (November 2012)\n//\n\npackage flow\n\nimport (\n\t\"errors\"\n\t\"io\"\n)\n\n// ErrLimit is returned by the Writer when a non-blocking write is short due to\n// the transfer rate limit.\nvar ErrLimit = errors.New(\"flowrate: flow rate limit exceeded\")\n\n// Limiter is implemented by the Reader and Writer to provide a consistent\n// interface for monitoring and controlling data transfer.\ntype Limiter interface {\n\tDone() int64\n\tStatus() Status\n\tSetTransferSize(bytes int64)\n\tSetLimit(new int64) (old int64)\n\tSetBlocking(new bool) (old bool)\n}\n\n// Reader implements io.ReadCloser with a restriction on the rate of data\n// transfer.\ntype Reader struct {\n\tio.Reader // Data source\n\t*Monitor // Flow control monitor\n\n\tlimit int64 // Rate limit in bytes per second (unlimited when \u003c= 0)\n\tblock bool // What to do when no new bytes can be read due to the limit\n}\n\n// NewReader restricts all Read operations on r to limit bytes per second.\nfunc NewReader(r io.Reader, limit int64) *Reader {\n\treturn \u0026Reader{r, New(0, 0), limit, false} // XXX default false\n}\n\n// Read reads up to len(p) bytes into p without exceeding the current transfer\n// rate limit. It returns (0, nil) immediately if r is non-blocking and no new\n// bytes can be read at this time.\nfunc (r *Reader) Read(p []byte) (n int, err error) {\n\tp = p[:r.Limit(len(p), r.limit, r.block)]\n\tif len(p) \u003e 0 {\n\t\tn, err = r.IO(r.Reader.Read(p))\n\t}\n\treturn\n}\n\n// SetLimit changes the transfer rate limit to new bytes per second and returns\n// the previous setting.\nfunc (r *Reader) SetLimit(new int64) (old int64) {\n\told, r.limit = r.limit, new\n\treturn\n}\n\n// SetBlocking changes the blocking behavior and returns the previous setting. A\n// Read call on a non-blocking reader returns immediately if no additional bytes\n// may be read at this time due to the rate limit.\nfunc (r *Reader) SetBlocking(new bool) (old bool) {\n\tif new == true {\n\t\tpanic(\"blocking not yet supported\")\n\t}\n\told, r.block = r.block, new\n\treturn\n}\n\n// Close closes the underlying reader if it implements the io.Closer interface.\nfunc (r *Reader) Close() error {\n\tdefer r.Done()\n\tif c, ok := r.Reader.(io.Closer); ok {\n\t\treturn c.Close()\n\t}\n\treturn nil\n}\n\n// Writer implements io.WriteCloser with a restriction on the rate of data\n// transfer.\ntype Writer struct {\n\tio.Writer // Data destination\n\t*Monitor // Flow control monitor\n\n\tlimit int64 // Rate limit in bytes per second (unlimited when \u003c= 0)\n\tblock bool // What to do when no new bytes can be written due to the limit\n}\n\n// NewWriter restricts all Write operations on w to limit bytes per second. The\n// transfer rate and the default blocking behavior (true) can be changed\n// directly on the returned *Writer.\nfunc NewWriter(w io.Writer, limit int64) *Writer {\n\treturn \u0026Writer{w, New(0, 0), limit, false} // XXX default false\n}\n\n// Write writes len(p) bytes from p to the underlying data stream without\n// exceeding the current transfer rate limit. It returns (n, ErrLimit) if w is\n// non-blocking and no additional bytes can be written at this time.\nfunc (w *Writer) Write(p []byte) (n int, err error) {\n\tvar c int\n\tfor len(p) \u003e 0 \u0026\u0026 err == nil {\n\t\ts := p[:w.Limit(len(p), w.limit, w.block)]\n\t\tif len(s) \u003e 0 {\n\t\t\tc, err = w.IO(w.Writer.Write(s))\n\t\t} else {\n\t\t\treturn n, ErrLimit\n\t\t}\n\t\tp = p[c:]\n\t\tn += c\n\t}\n\treturn\n}\n\n// SetLimit changes the transfer rate limit to new bytes per second and returns\n// the previous setting.\nfunc (w *Writer) SetLimit(new int64) (old int64) {\n\told, w.limit = w.limit, new\n\treturn\n}\n\n// SetBlocking changes the blocking behavior and returns the previous setting. A\n// Write call on a non-blocking writer returns as soon as no additional bytes\n// may be written at this time due to the rate limit.\nfunc (w *Writer) SetBlocking(new bool) (old bool) {\n\told, w.block = w.block, new\n\treturn\n}\n\n// Close closes the underlying writer if it implements the io.Closer interface.\nfunc (w *Writer) Close() error {\n\tdefer w.Done()\n\tif c, ok := w.Writer.(io.Closer); ok {\n\t\treturn c.Close()\n\t}\n\treturn nil\n}\n"},{"name":"io_test.gno","body":"//\n// Written by Maxim Khitrov (November 2012)\n//\n\npackage flow\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\t\"time\"\n\n\tios_test \"internal/os_test\"\n)\n\n// XXX ugh, I can't even sleep milliseconds.\n// XXX\n\nconst (\n\t_50ms = 50 * time.Millisecond\n\t_100ms = 100 * time.Millisecond\n\t_200ms = 200 * time.Millisecond\n\t_300ms = 300 * time.Millisecond\n\t_400ms = 400 * time.Millisecond\n\t_500ms = 500 * time.Millisecond\n)\n\nfunc nextStatus(m *Monitor) Status {\n\tsamples := m.samples\n\tfor i := 0; i \u003c 30; i++ {\n\t\tif s := m.Status(); s.Samples != samples {\n\t\t\treturn s\n\t\t}\n\t\tios_test.Sleep(5 * time.Millisecond)\n\t}\n\treturn m.Status()\n}\n\nfunc TestReader(t *testing.T) {\n\tin := make([]byte, 100)\n\tfor i := range in {\n\t\tin[i] = byte(i)\n\t}\n\tb := make([]byte, 100)\n\tr := NewReader(bytes.NewReader(in), 100)\n\tstart := time.Now()\n\n\t// Make sure r implements Limiter\n\t_ = Limiter(r)\n\n\t// 1st read of 10 bytes is performed immediately\n\tif n, err := r.Read(b); n != 10 {\n\t\tt.Fatalf(\"r.Read(b) expected 10 (\u003cnil\u003e); got %v\", n)\n\t} else if err != nil {\n\t\tt.Fatalf(\"r.Read(b) expected 10 (\u003cnil\u003e); got %v (%v)\", n, err.Error())\n\t} else if rt := time.Since(start); rt \u003e _50ms {\n\t\tt.Fatalf(\"r.Read(b) took too long (%v)\", rt.String())\n\t}\n\n\t// No new Reads allowed in the current sample\n\tr.SetBlocking(false)\n\tif n, err := r.Read(b); n != 0 {\n\t\tt.Fatalf(\"r.Read(b) expected 0 (\u003cnil\u003e); got %v\", n)\n\t} else if err != nil {\n\t\tt.Fatalf(\"r.Read(b) expected 0 (\u003cnil\u003e); got %v (%v)\", n, err.Error())\n\t} else if rt := time.Since(start); rt \u003e _50ms {\n\t\tt.Fatalf(\"r.Read(b) took too long (%v)\", rt.String())\n\t}\n\n\tstatus := [6]Status{0: r.Status()} // No samples in the first status\n\n\t// 2nd read of 10 bytes blocks until the next sample\n\t// r.SetBlocking(true)\n\tios_test.Sleep(100 * time.Millisecond)\n\tif n, err := r.Read(b[10:]); n != 10 {\n\t\tt.Fatalf(\"r.Read(b[10:]) expected 10 (\u003cnil\u003e); got %v\", n)\n\t} else if err != nil {\n\t\tt.Fatalf(\"r.Read(b[10:]) expected 10 (\u003cnil\u003e); got %v (%v)\", n, err.Error())\n\t} else if rt := time.Since(start); rt \u003c _100ms {\n\t\tt.Fatalf(\"r.Read(b[10:]) returned ahead of time (%v)\", rt.String())\n\t}\n\n\tstatus[1] = r.Status() // 1st sample\n\tstatus[2] = nextStatus(r.Monitor) // 2nd sample\n\tstatus[3] = nextStatus(r.Monitor) // No activity for the 3rd sample\n\n\tif n := r.Done(); n != 20 {\n\t\tt.Fatalf(\"r.Done() expected 20; got %v\", n)\n\t}\n\n\tstatus[4] = r.Status()\n\tstatus[5] = nextStatus(r.Monitor) // Timeout\n\tstart = status[0].Start\n\n\t// Active, Start, Duration, Idle, Bytes, Samples, InstRate, CurRate, AvgRate, PeakRate, BytesRem, TimeRem, Progress\n\twant := []Status{\n\t\t{true, start, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},\n\t\t{true, start, _100ms, 0, 10, 1, 100, 100, 100, 100, 0, 0, 0},\n\t\t{true, start, _200ms, _100ms, 20, 2, 100, 100, 100, 100, 0, 0, 0},\n\t\t{true, start, _300ms, _200ms, 20, 3, 0, 90, 67, 100, 0, 0, 0},\n\t\t{false, start, _300ms, 0, 20, 3, 0, 0, 67, 100, 0, 0, 0},\n\t\t{false, start, _300ms, 0, 20, 3, 0, 0, 67, 100, 0, 0, 0},\n\t}\n\tfor i, s := range status {\n\t\t// XXX s := s\n\t\tif !statusesAreEqual(\u0026s, \u0026want[i]) {\n\t\t\tt.Errorf(\"r.Status(%v)\\nexpected: %v\\ngot : %v\", i, want[i].String(), s.String())\n\t\t}\n\t}\n\tif !bytes.Equal(b[:20], in[:20]) {\n\t\tt.Errorf(\"r.Read() input doesn't match output\")\n\t}\n}\n\n// XXX blocking writer test doesn't work.\nfunc _TestWriter(t *testing.T) {\n\tb := make([]byte, 100)\n\tfor i := range b {\n\t\tb[i] = byte(i)\n\t}\n\tw := NewWriter(\u0026bytes.Buffer{}, 200)\n\tstart := time.Now()\n\n\t// Make sure w implements Limiter\n\t_ = Limiter(w)\n\n\t// Non-blocking 20-byte write for the first sample returns ErrLimit\n\tw.SetBlocking(false)\n\tif n, err := w.Write(b); n != 20 || err != ErrLimit {\n\t\tt.Fatalf(\"w.Write(b) expected 20 (ErrLimit); got %v (%v)\", n, err.Error())\n\t} else if rt := time.Since(start); rt \u003e _50ms {\n\t\tt.Fatalf(\"w.Write(b) took too long (%v)\", rt)\n\t}\n\n\t// Blocking 80-byte write\n\t// w.SetBlocking(true)\n\t// XXX This test doesn't work, because w.Write calls w.Limit(block=false),\n\t// XXX and it returns ErrLimit after 20. What we want is to keep waiting until 80 is returned,\n\t// XXX but blocking isn't supported. Sleeping 800 shouldn't be sufficient either (its a burst).\n\t// XXX This limits the usage of Limiter and m.Limit().\n\tios_test.Sleep(800 * time.Millisecond)\n\tif n, err := w.Write(b[20:]); n \u003c 80 {\n\t} else if n != 80 || err != nil {\n\t\tt.Fatalf(\"w.Write(b[20:]) expected 80 (\u003cnil\u003e); got %v (%v)\", n, err.Error())\n\t} else if rt := time.Since(start); rt \u003c _300ms {\n\t\t// Explanation for `rt \u003c _300ms` (as opposed to `\u003c _400ms`)\n\t\t//\n\t\t// |\u003c-- start | |\n\t\t// epochs: -----0ms|---100ms|---200ms|---300ms|---400ms\n\t\t// sends: 20|20 |20 |20 |20#\n\t\t//\n\t\t// NOTE: The '#' symbol can thus happen before 400ms is up.\n\t\t// Thus, we can only panic if rt \u003c _300ms.\n\t\tt.Fatalf(\"w.Write(b[20:]) returned ahead of time (%v)\", rt.String())\n\t}\n\n\tw.SetTransferSize(100)\n\tstatus := []Status{w.Status(), nextStatus(w.Monitor)}\n\tstart = status[0].Start\n\n\t// Active, Start, Duration, Idle, Bytes, Samples, InstRate, CurRate, AvgRate, PeakRate, BytesRem, TimeRem, Progress\n\twant := []Status{\n\t\t{true, start, _400ms, 0, 80, 4, 200, 200, 200, 200, 20, _100ms, 80000},\n\t\t{true, start, _500ms, _100ms, 100, 5, 200, 200, 200, 200, 0, 0, 100000},\n\t}\n\tfor i, s := range status {\n\t\t// XXX s := s\n\t\tif !statusesAreEqual(\u0026s, \u0026want[i]) {\n\t\t\tt.Errorf(\"w.Status(%v)\\nexpected: %v\\ngot : %v\\n\", i, want[i].String(), s.String())\n\t\t}\n\t}\n\tif !bytes.Equal(b, w.Writer.(*bytes.Buffer).Bytes()) {\n\t\tt.Errorf(\"w.Write() input doesn't match output\")\n\t}\n}\n\nconst (\n\tmaxDeviationForDuration = 50 * time.Millisecond\n\tmaxDeviationForRate int64 = 50\n)\n\n// statusesAreEqual returns true if s1 is equal to s2. Equality here means\n// general equality of fields except for the duration and rates, which can\n// drift due to unpredictable delays (e.g. thread wakes up 25ms after\n// `time.Sleep` has ended).\nfunc statusesAreEqual(s1 *Status, s2 *Status) bool {\n\tif s1.Active == s2.Active \u0026\u0026\n\t\ts1.Start == s2.Start \u0026\u0026\n\t\tdurationsAreEqual(s1.Duration, s2.Duration, maxDeviationForDuration) \u0026\u0026\n\t\ts1.Idle == s2.Idle \u0026\u0026\n\t\ts1.Bytes == s2.Bytes \u0026\u0026\n\t\ts1.Samples == s2.Samples \u0026\u0026\n\t\tratesAreEqual(s1.InstRate, s2.InstRate, maxDeviationForRate) \u0026\u0026\n\t\tratesAreEqual(s1.CurRate, s2.CurRate, maxDeviationForRate) \u0026\u0026\n\t\tratesAreEqual(s1.AvgRate, s2.AvgRate, maxDeviationForRate) \u0026\u0026\n\t\tratesAreEqual(s1.PeakRate, s2.PeakRate, maxDeviationForRate) \u0026\u0026\n\t\ts1.BytesRem == s2.BytesRem \u0026\u0026\n\t\tdurationsAreEqual(s1.TimeRem, s2.TimeRem, maxDeviationForDuration) \u0026\u0026\n\t\ts1.Progress == s2.Progress {\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc durationsAreEqual(d1 time.Duration, d2 time.Duration, maxDeviation time.Duration) bool {\n\treturn d2-d1 \u003c= maxDeviation\n}\n\nfunc ratesAreEqual(r1 int64, r2 int64, maxDeviation int64) bool {\n\tsub := r1 - r2\n\tif sub \u003c 0 {\n\t\tsub = -sub\n\t}\n\tif sub \u003c= maxDeviation {\n\t\treturn true\n\t}\n\treturn false\n}\n"},{"name":"util.gno","body":"//\n// Written by Maxim Khitrov (November 2012)\n//\n\npackage flow\n\nimport (\n\t\"math\"\n\t\"strconv\"\n\t\"time\"\n)\n\n// clockRate is the resolution and precision of clock().\nconst clockRate = 20 * time.Millisecond\n\n// czero is the process start time rounded down to the nearest clockRate\n// increment.\nvar czero = time.Now().Round(clockRate)\n\n// clock returns a low resolution timestamp relative to the process start time.\nfunc clock() time.Duration {\n\treturn time.Now().Round(clockRate).Sub(czero)\n}\n\n// clockToTime converts a clock() timestamp to an absolute time.Time value.\nfunc clockToTime(c time.Duration) time.Time {\n\treturn czero.Add(c)\n}\n\n// clockRound returns d rounded to the nearest clockRate increment.\nfunc clockRound(d time.Duration) time.Duration {\n\treturn (d + clockRate\u003e\u003e1) / clockRate * clockRate\n}\n\n// round returns x rounded to the nearest int64 (non-negative values only).\nfunc round(x float64) int64 {\n\tif _, frac := math.Modf(x); frac \u003e= 0.5 {\n\t\treturn int64(math.Ceil(x))\n\t}\n\treturn int64(math.Floor(x))\n}\n\n// Percent represents a percentage in increments of 1/1000th of a percent.\ntype Percent uint32\n\n// percentOf calculates what percent of the total is x.\nfunc percentOf(x, total float64) Percent {\n\tif x \u003c 0 || total \u003c= 0 {\n\t\treturn 0\n\t} else if p := round(x / total * 1e5); p \u003c= math.MaxUint32 {\n\t\treturn Percent(p)\n\t}\n\treturn Percent(math.MaxUint32)\n}\n\nfunc (p Percent) Float() float64 {\n\treturn float64(p) * 1e-3\n}\n\nfunc (p Percent) String() string {\n\tvar buf [12]byte\n\tb := strconv.AppendUint(buf[:0], uint64(p)/1000, 10)\n\tn := len(b)\n\tb = strconv.AppendUint(b, 1000+uint64(p)%1000, 10)\n\tb[n] = '.'\n\treturn string(append(b, '%'))\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"fqname","path":"gno.land/p/demo/fqname","files":[{"name":"fqname.gno","body":"// Package fqname provides utilities for handling fully qualified identifiers in\n// Gno. A fully qualified identifier typically includes a package path followed\n// by a dot (.) and then the name of a variable, function, type, or other\n// package-level declaration.\npackage fqname\n\nimport \"strings\"\n\n// Parse splits a fully qualified identifier into its package path and name\n// components. It handles cases with and without slashes in the package path.\n//\n//\tpkgpath, name := fqname.Parse(\"gno.land/p/demo/avl.Tree\")\n//\tufmt.Sprintf(\"Package: %s, Name: %s\\n\", id.Package, id.Name)\n//\t// Output: Package: gno.land/p/demo/avl, Name: Tree\nfunc Parse(fqname string) (pkgpath, name string) {\n\t// Find the index of the last slash.\n\tlastSlashIndex := strings.LastIndex(fqname, \"/\")\n\tif lastSlashIndex == -1 {\n\t\t// No slash found, handle it as a simple package name with dot notation.\n\t\tdotIndex := strings.LastIndex(fqname, \".\")\n\t\tif dotIndex == -1 {\n\t\t\treturn fqname, \"\"\n\t\t}\n\t\treturn fqname[:dotIndex], fqname[dotIndex+1:]\n\t}\n\n\t// Get the part after the last slash.\n\tafterSlash := fqname[lastSlashIndex+1:]\n\n\t// Check for a dot in the substring after the last slash.\n\tdotIndex := strings.Index(afterSlash, \".\")\n\tif dotIndex == -1 {\n\t\t// No dot found after the last slash\n\t\treturn fqname, \"\"\n\t}\n\n\t// Split at the dot to separate the base and the suffix.\n\tbase := fqname[:lastSlashIndex+1+dotIndex]\n\tsuffix := afterSlash[dotIndex+1:]\n\n\treturn base, suffix\n}\n\n// Construct a qualified identifier.\n//\n//\tfqName := fqname.Construct(\"gno.land/r/demo/foo20\", \"GRC20\")\n//\tfmt.Println(\"Fully Qualified Name:\", fqName)\n//\t// Output: gno.land/r/demo/foo20.GRC20\nfunc Construct(pkgpath, name string) string {\n\t// TODO: ensure pkgpath is valid - and as such last part does not contain a dot.\n\tif name == \"\" {\n\t\treturn pkgpath\n\t}\n\treturn pkgpath + \".\" + name\n}\n\n// RenderLink creates a formatted link for a fully qualified identifier.\n// If the package path starts with \"gno.land\", it converts it to a markdown link.\n// If the domain is different or missing, it returns the input as is.\nfunc RenderLink(pkgPath, slug string) string {\n\tif strings.HasPrefix(pkgPath, \"gno.land\") {\n\t\tpkgLink := strings.TrimPrefix(pkgPath, \"gno.land\")\n\t\tif slug != \"\" {\n\t\t\treturn \"[\" + pkgPath + \"](\" + pkgLink + \").\" + slug\n\t\t}\n\t\treturn \"[\" + pkgPath + \"](\" + pkgLink + \")\"\n\t}\n\tif slug != \"\" {\n\t\treturn pkgPath + \".\" + slug\n\t}\n\treturn pkgPath\n}\n"},{"name":"fqname_test.gno","body":"package fqname\n\nimport (\n\t\"testing\"\n\n\t\"gno.land/p/demo/uassert\"\n)\n\nfunc TestParse(t *testing.T) {\n\ttests := []struct {\n\t\tinput string\n\t\texpectedPkgPath string\n\t\texpectedName string\n\t}{\n\t\t{\"gno.land/p/demo/avl.Tree\", \"gno.land/p/demo/avl\", \"Tree\"},\n\t\t{\"gno.land/p/demo/avl\", \"gno.land/p/demo/avl\", \"\"},\n\t\t{\"gno.land/p/demo/avl.Tree.Node\", \"gno.land/p/demo/avl\", \"Tree.Node\"},\n\t\t{\"gno.land/p/demo/avl/nested.Package.Func\", \"gno.land/p/demo/avl/nested\", \"Package.Func\"},\n\t\t{\"path/filepath.Split\", \"path/filepath\", \"Split\"},\n\t\t{\"path.Split\", \"path\", \"Split\"},\n\t\t{\"path/filepath\", \"path/filepath\", \"\"},\n\t\t{\"path\", \"path\", \"\"},\n\t\t{\"\", \"\", \"\"},\n\t}\n\n\tfor _, tt := range tests {\n\t\tpkgpath, name := Parse(tt.input)\n\t\tuassert.Equal(t, tt.expectedPkgPath, pkgpath, \"Package path did not match\")\n\t\tuassert.Equal(t, tt.expectedName, name, \"Name did not match\")\n\t}\n}\n\nfunc TestConstruct(t *testing.T) {\n\ttests := []struct {\n\t\tpkgpath string\n\t\tname string\n\t\texpected string\n\t}{\n\t\t{\"gno.land/r/demo/foo20\", \"GRC20\", \"gno.land/r/demo/foo20.GRC20\"},\n\t\t{\"gno.land/r/demo/foo20\", \"\", \"gno.land/r/demo/foo20\"},\n\t\t{\"path\", \"\", \"path\"},\n\t\t{\"path\", \"Split\", \"path.Split\"},\n\t\t{\"path/filepath\", \"\", \"path/filepath\"},\n\t\t{\"path/filepath\", \"Split\", \"path/filepath.Split\"},\n\t\t{\"\", \"JustName\", \".JustName\"},\n\t\t{\"\", \"\", \"\"},\n\t}\n\n\tfor _, tt := range tests {\n\t\tresult := Construct(tt.pkgpath, tt.name)\n\t\tuassert.Equal(t, tt.expected, result, \"Constructed FQName did not match expected\")\n\t}\n}\n\nfunc TestRenderLink(t *testing.T) {\n\ttests := []struct {\n\t\tpkgPath string\n\t\tslug string\n\t\texpected string\n\t}{\n\t\t{\"gno.land/p/demo/avl\", \"Tree\", \"[gno.land/p/demo/avl](/p/demo/avl).Tree\"},\n\t\t{\"gno.land/p/demo/avl\", \"\", \"[gno.land/p/demo/avl](/p/demo/avl)\"},\n\t\t{\"github.com/a/b\", \"C\", \"github.com/a/b.C\"},\n\t\t{\"example.com/pkg\", \"Func\", \"example.com/pkg.Func\"},\n\t\t{\"gno.land/r/demo/foo20\", \"GRC20\", \"[gno.land/r/demo/foo20](/r/demo/foo20).GRC20\"},\n\t\t{\"gno.land/r/demo/foo20\", \"\", \"[gno.land/r/demo/foo20](/r/demo/foo20)\"},\n\t\t{\"\", \"\", \"\"},\n\t}\n\n\tfor _, tt := range tests {\n\t\tresult := RenderLink(tt.pkgPath, tt.slug)\n\t\tuassert.Equal(t, tt.expected, result, \"Rendered link did not match expected\")\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"gnode","path":"gno.land/p/demo/gnode","files":[{"name":"gnode.gno","body":"package gnode\n\n// XXX what about Gnodes signing on behalf of others?\n// XXX like a multi-sig of Gnodes?\n\ntype Name string\n\ntype Gnode interface {\n\t//----------------------------------------\n\t// Basic properties\n\tGetName() Name\n\n\t//----------------------------------------\n\t// Affiliate Gnodes\n\tNumAffiliates() int\n\tGetAffiliates(Name) Affiliate\n\tAddAffiliate(Affiliate) error // must be affiliated\n\tRemAffiliate(Name) error // must have become unaffiliated\n\n\t//----------------------------------------\n\t// Signing\n\tNumSignedDocuments() int\n\tGetSignedDocument(idx int) Document\n\tSignDocument(doc Document) (int, error) // index relative to signer\n\n\t//----------------------------------------\n\t// Rendering\n\tRenderLines() []string\n}\n\ntype Affiliate struct {\n\tType string\n\tGnode Gnode\n\tTags []string\n}\n\ntype MyGnode struct {\n\tName\n\t// Owners // voting set, something that gives authority of action.\n\t// Treasury //\n\t// Affiliates //\n\t// Board // discussions\n\t// Data // XXX ?\n}\n\ntype Affiliates []*Affiliate\n\n// Documents are equal if they compare equal.\n// NOTE: requires all fields to be comparable.\ntype Document struct {\n\tAuthors string\n\t// Timestamp\n\t// Body\n\t// Attachments\n}\n\n// ACTIONS\n\n// * Lend tokens\n// * Pay tokens\n// * Administrate transferrable and non-transferrable tokens\n// * Sum tokens\n// * Passthrough dependencies\n// * Code\n// * ...\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"agent","path":"gno.land/p/demo/gnorkle/agent","files":[{"name":"whitelist.gno","body":"package agent\n\nimport \"gno.land/p/demo/avl\"\n\n// Whitelist manages whitelisted agent addresses.\ntype Whitelist struct {\n\tstore *avl.Tree\n}\n\n// ClearAddresses removes all addresses from the whitelist and puts into a state\n// that indicates it is moot and has no whitelist defined.\nfunc (m *Whitelist) ClearAddresses() {\n\tm.store = nil\n}\n\n// AddAddresses adds the given addresses to the whitelist.\nfunc (m *Whitelist) AddAddresses(addresses []string) {\n\tif m.store == nil {\n\t\tm.store = avl.NewTree()\n\t}\n\n\tfor _, address := range addresses {\n\t\tm.store.Set(address, struct{}{})\n\t}\n}\n\n// RemoveAddress removes the given address from the whitelist if it exists.\nfunc (m *Whitelist) RemoveAddress(address string) {\n\tif m.store == nil {\n\t\treturn\n\t}\n\n\tm.store.Remove(address)\n}\n\n// HasDefinition returns true if the whitelist has a definition. It retuns false if\n// `ClearAddresses` has been called without any subsequent `AddAddresses` calls, or\n// if `AddAddresses` has never been called.\nfunc (m Whitelist) HasDefinition() bool {\n\treturn m.store != nil\n}\n\n// HasAddress returns true if the given address is in the whitelist.\nfunc (m Whitelist) HasAddress(address string) bool {\n\tif m.store == nil {\n\t\treturn false\n\t}\n\n\treturn m.store.Has(address)\n}\n"},{"name":"whitelist_test.gno","body":"package agent_test\n\nimport (\n\t\"testing\"\n\n\t\"gno.land/p/demo/gnorkle/agent\"\n\t\"gno.land/p/demo/uassert\"\n)\n\nfunc TestWhitelist(t *testing.T) {\n\tvar whitelist agent.Whitelist\n\n\tuassert.False(t, whitelist.HasDefinition(), \"whitelist should not be defined initially\")\n\n\twhitelist.AddAddresses([]string{\"a\", \"b\"})\n\tuassert.True(t, whitelist.HasAddress(\"a\"), `whitelist should have address \"a\"`)\n\tuassert.True(t, whitelist.HasAddress(\"b\"), `whitelist should have address \"b\"`)\n\tuassert.True(t, whitelist.HasDefinition(), \"whitelist should be defined after adding addresses\")\n\n\twhitelist.RemoveAddress(\"a\")\n\tuassert.False(t, whitelist.HasAddress(\"a\"), `whitelist should not have address \"a\"`)\n\tuassert.True(t, whitelist.HasAddress(\"b\"), `whitelist should still have address \"b\"`)\n\n\twhitelist.ClearAddresses()\n\tuassert.False(t, whitelist.HasAddress(\"a\"), `whitelist cleared; should not have address \"a\"`)\n\tuassert.False(t, whitelist.HasAddress(\"b\"), `whitelist cleared; should still have address \"b\"`)\n\tuassert.False(t, whitelist.HasDefinition(), \"whitelist cleared; should not be defined\")\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"feed","path":"gno.land/p/demo/gnorkle/feed","files":[{"name":"errors.gno","body":"package feed\n\nimport \"errors\"\n\nvar ErrUndefined = errors.New(\"undefined feed\")\n"},{"name":"task.gno","body":"package feed\n\n// Task is a unit of work that can be part of a `Feed` definition. Tasks\n// are executed by agents.\ntype Task interface {\n\tMarshalJSON() ([]byte, error)\n}\n"},{"name":"type.gno","body":"package feed\n\n// Type indicates the type of a feed.\ntype Type int\n\nconst (\n\t// TypeStatic indicates a feed cannot be changed once the first value is committed.\n\tTypeStatic Type = iota\n\t// TypeContinuous indicates a feed can continuously ingest values and will publish\n\t// a new value on request using the values it has ingested.\n\tTypeContinuous\n\t// TypePeriodic indicates a feed can accept one or more values within a certain period\n\t// and will proceed to commit these values at the end up each period to produce an\n\t// aggregate value before starting a new period.\n\tTypePeriodic\n)\n"},{"name":"value.gno","body":"package feed\n\nimport \"time\"\n\n// Value represents a value published by a feed. The `Time` is when the value was published.\ntype Value struct {\n\tString string\n\tTime time.Time\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"ingester","path":"gno.land/p/demo/gnorkle/ingester","files":[{"name":"errors.gno","body":"package ingester\n\nimport \"errors\"\n\nvar ErrUndefined = errors.New(\"ingester undefined\")\n"},{"name":"type.gno","body":"package ingester\n\n// Type indicates an ingester type.\ntype Type int\n\nconst (\n\t// TypeSingle indicates an ingester that can only ingest a single within a given period or no period.\n\tTypeSingle Type = iota\n\t// TypeMulti indicates an ingester that can ingest multiple within a given period or no period\n\tTypeMulti\n)\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"message","path":"gno.land/p/demo/gnorkle/message","files":[{"name":"parse.gno","body":"package message\n\nimport \"strings\"\n\n// ParseFunc parses a raw message and returns the message function\n// type extracted from the remainder of the message.\nfunc ParseFunc(rawMsg string) (FuncType, string) {\n\tfuncType, remainder := parseFirstToken(rawMsg)\n\treturn FuncType(funcType), remainder\n}\n\n// ParseID parses a raw message and returns the ID extracted from\n// the remainder of the message.\nfunc ParseID(rawMsg string) (string, string) {\n\treturn parseFirstToken(rawMsg)\n}\n\nfunc parseFirstToken(rawMsg string) (string, string) {\n\tmsgParts := strings.SplitN(rawMsg, \",\", 2)\n\tif len(msgParts) \u003c 2 {\n\t\treturn msgParts[0], \"\"\n\t}\n\n\treturn msgParts[0], msgParts[1]\n}\n"},{"name":"parse_test.gno","body":"package message_test\n\nimport (\n\t\"testing\"\n\n\t\"gno.land/p/demo/gnorkle/message\"\n\t\"gno.land/p/demo/uassert\"\n)\n\nfunc TestParseFunc(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tinput string\n\t\texpFuncType message.FuncType\n\t\texpRemainder string\n\t}{\n\t\t{\n\t\t\tname: \"empty\",\n\t\t},\n\t\t{\n\t\t\tname: \"func only\",\n\t\t\tinput: \"ingest\",\n\t\t\texpFuncType: message.FuncTypeIngest,\n\t\t},\n\t\t{\n\t\t\tname: \"func with short remainder\",\n\t\t\tinput: \"commit,asdf\",\n\t\t\texpFuncType: message.FuncTypeCommit,\n\t\t\texpRemainder: \"asdf\",\n\t\t},\n\t\t{\n\t\t\tname: \"func with long remainder\",\n\t\t\tinput: \"request,hello,world,goodbye\",\n\t\t\texpFuncType: message.FuncTypeRequest,\n\t\t\texpRemainder: \"hello,world,goodbye\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tfuncType, remainder := message.ParseFunc(tt.input)\n\n\t\t\tuassert.Equal(t, string(tt.expFuncType), string(funcType))\n\t\t\tuassert.Equal(t, tt.expRemainder, remainder)\n\t\t})\n\t}\n}\n"},{"name":"type.gno","body":"package message\n\n// FuncType is the type of function that is being called by the agent.\ntype FuncType string\n\nconst (\n\t// FuncTypeIngest means the agent is sending data for ingestion.\n\tFuncTypeIngest FuncType = \"ingest\"\n\t// FuncTypeCommit means the agent is requesting a feed commit the transitive data\n\t// being held by its ingester.\n\tFuncTypeCommit FuncType = \"commit\"\n\t// FuncTypeRequest means the agent is requesting feed definitions for all those\n\t// that it is whitelisted to provide data for.\n\tFuncTypeRequest FuncType = \"request\"\n)\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"gnorkle","path":"gno.land/p/demo/gnorkle/gnorkle","files":[{"name":"feed.gno","body":"package gnorkle\n\nimport (\n\t\"gno.land/p/demo/gnorkle/feed\"\n\t\"gno.land/p/demo/gnorkle/message\"\n)\n\n// Feed is an abstraction used by a gnorkle `Instance` to ingest data from\n// agents and provide data feeds to consumers.\ntype Feed interface {\n\tID() string\n\tType() feed.Type\n\tValue() (value feed.Value, dataType string, consumable bool)\n\tIngest(funcType message.FuncType, rawMessage, providerAddress string) error\n\tMarshalJSON() ([]byte, error)\n\tTasks() []feed.Task\n\tIsActive() bool\n}\n\n// FeedWithWhitelist associates a `Whitelist` with a `Feed`.\ntype FeedWithWhitelist struct {\n\tFeed\n\tWhitelist\n}\n"},{"name":"ingester.gno","body":"package gnorkle\n\nimport \"gno.land/p/demo/gnorkle/ingester\"\n\n// Ingester is the abstraction that allows a `Feed` to ingest data from agents\n// and commit it to storage using zero or more intermediate aggregation steps.\ntype Ingester interface {\n\tType() ingester.Type\n\tIngest(value, providerAddress string) (canAutoCommit bool, err error)\n\tCommitValue(storage Storage, providerAddress string) error\n}\n"},{"name":"instance.gno","body":"package gnorkle\n\nimport (\n\t\"errors\"\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/gnorkle/agent\"\n\t\"gno.land/p/demo/gnorkle/feed\"\n\t\"gno.land/p/demo/gnorkle/message\"\n)\n\n// Instance is a single instance of an oracle.\ntype Instance struct {\n\tfeeds *avl.Tree\n\twhitelist agent.Whitelist\n}\n\n// NewInstance creates a new instance of an oracle.\nfunc NewInstance() *Instance {\n\treturn \u0026Instance{\n\t\tfeeds: avl.NewTree(),\n\t}\n}\n\nfunc assertValidID(id string) error {\n\tif len(id) == 0 {\n\t\treturn errors.New(\"feed ids cannot be empty\")\n\t}\n\n\tif strings.Contains(id, \",\") {\n\t\treturn errors.New(\"feed ids cannot contain commas\")\n\t}\n\n\treturn nil\n}\n\nfunc (i *Instance) assertFeedDoesNotExist(id string) error {\n\tif i.feeds.Has(id) {\n\t\treturn errors.New(\"feed already exists\")\n\t}\n\n\treturn nil\n}\n\n// AddFeeds adds feeds to the instance with empty whitelists.\nfunc (i *Instance) AddFeeds(feeds ...Feed) error {\n\tfor _, feed := range feeds {\n\t\tif err := assertValidID(feed.ID()); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tif err := i.assertFeedDoesNotExist(feed.ID()); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\ti.feeds.Set(\n\t\t\tfeed.ID(),\n\t\t\tFeedWithWhitelist{\n\t\t\t\tWhitelist: new(agent.Whitelist),\n\t\t\t\tFeed: feed,\n\t\t\t},\n\t\t)\n\t}\n\n\treturn nil\n}\n\n// AddFeedsWithWhitelists adds feeds to the instance with the given whitelists.\nfunc (i *Instance) AddFeedsWithWhitelists(feeds ...FeedWithWhitelist) error {\n\tfor _, feed := range feeds {\n\t\tif err := i.assertFeedDoesNotExist(feed.ID()); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := assertValidID(feed.ID()); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\ti.feeds.Set(\n\t\t\tfeed.ID(),\n\t\t\tFeedWithWhitelist{\n\t\t\t\tWhitelist: feed.Whitelist,\n\t\t\t\tFeed: feed,\n\t\t\t},\n\t\t)\n\t}\n\n\treturn nil\n}\n\n// RemoveFeed removes a feed from the instance.\nfunc (i *Instance) RemoveFeed(id string) {\n\ti.feeds.Remove(id)\n}\n\n// PostMessageHandler is a type that allows for post-processing of feed state after a feed\n// ingests a message from an agent.\ntype PostMessageHandler interface {\n\tHandle(i *Instance, funcType message.FuncType, feed Feed) error\n}\n\n// HandleMessage handles a message from an agent and routes to either the logic that returns\n// feed definitions or the logic that allows a feed to ingest a message.\n//\n// TODO: Consider further message types that could allow administrative action such as modifying\n// a feed's whitelist without the owner of this oracle having to maintain a reference to it.\nfunc (i *Instance) HandleMessage(msg string, postHandler PostMessageHandler) (string, error) {\n\tcaller := string(std.GetOrigCaller())\n\n\tfuncType, msg := message.ParseFunc(msg)\n\n\tswitch funcType {\n\tcase message.FuncTypeRequest:\n\t\treturn i.GetFeedDefinitions(caller)\n\n\tdefault:\n\t\tid, msg := message.ParseID(msg)\n\t\tif err := assertValidID(id); err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\n\t\tfeedWithWhitelist, err := i.getFeedWithWhitelist(id)\n\t\tif err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\n\t\tif !addressIsWhitelisted(\u0026i.whitelist, feedWithWhitelist, caller, nil) {\n\t\t\treturn \"\", errors.New(\"caller not whitelisted\")\n\t\t}\n\n\t\tif err := feedWithWhitelist.Ingest(funcType, msg, caller); err != nil {\n\t\t\treturn \"\", err\n\t\t}\n\n\t\tif postHandler != nil {\n\t\t\tpostHandler.Handle(i, funcType, feedWithWhitelist)\n\t\t}\n\t}\n\n\treturn \"\", nil\n}\n\nfunc (i *Instance) getFeed(id string) (Feed, error) {\n\tuntypedFeed, ok := i.feeds.Get(id)\n\tif !ok {\n\t\treturn nil, errors.New(\"invalid ingest id: \" + id)\n\t}\n\n\tfeed, ok := untypedFeed.(Feed)\n\tif !ok {\n\t\treturn nil, errors.New(\"invalid feed type\")\n\t}\n\n\treturn feed, nil\n}\n\nfunc (i *Instance) getFeedWithWhitelist(id string) (FeedWithWhitelist, error) {\n\tuntypedFeedWithWhitelist, ok := i.feeds.Get(id)\n\tif !ok {\n\t\treturn FeedWithWhitelist{}, errors.New(\"invalid ingest id: \" + id)\n\t}\n\n\tfeedWithWhitelist, ok := untypedFeedWithWhitelist.(FeedWithWhitelist)\n\tif !ok {\n\t\treturn FeedWithWhitelist{}, errors.New(\"invalid feed with whitelist type\")\n\t}\n\n\treturn feedWithWhitelist, nil\n}\n\n// GetFeedValue returns the most recently published value of a feed along with a string\n// representation of the value's type and boolean indicating whether the value is\n// okay for consumption.\nfunc (i *Instance) GetFeedValue(id string) (feed.Value, string, bool, error) {\n\tfoundFeed, err := i.getFeed(id)\n\tif err != nil {\n\t\treturn feed.Value{}, \"\", false, err\n\t}\n\n\tvalue, valueType, consumable := foundFeed.Value()\n\treturn value, valueType, consumable, nil\n}\n\n// GetFeedDefinitions returns a JSON string representing the feed definitions for which the given\n// agent address is whitelisted to provide values for ingestion.\nfunc (i *Instance) GetFeedDefinitions(forAddress string) (string, error) {\n\tinstanceHasAddressWhitelisted := !i.whitelist.HasDefinition() || i.whitelist.HasAddress(forAddress)\n\n\tbuf := new(strings.Builder)\n\tbuf.WriteString(\"[\")\n\tfirst := true\n\tvar err error\n\n\t// The boolean value returned by this callback function indicates whether to stop iterating.\n\ti.feeds.Iterate(\"\", \"\", func(_ string, value interface{}) bool {\n\t\tfeedWithWhitelist, ok := value.(FeedWithWhitelist)\n\t\tif !ok {\n\t\t\terr = errors.New(\"invalid feed type\")\n\t\t\treturn true\n\t\t}\n\n\t\t// Don't give agents the ability to try to publish to inactive feeds.\n\t\tif !feedWithWhitelist.IsActive() {\n\t\t\treturn false\n\t\t}\n\n\t\t// Skip feeds the address is not whitelisted for.\n\t\tif !addressIsWhitelisted(\u0026i.whitelist, feedWithWhitelist, forAddress, \u0026instanceHasAddressWhitelisted) {\n\t\t\treturn false\n\t\t}\n\n\t\tvar taskBytes []byte\n\t\tif taskBytes, err = feedWithWhitelist.Feed.MarshalJSON(); err != nil {\n\t\t\treturn true\n\t\t}\n\n\t\t// Guard against any tasks that shouldn't be returned; maybe they are not active because they have\n\t\t// already been completed.\n\t\tif len(taskBytes) == 0 {\n\t\t\treturn false\n\t\t}\n\n\t\tif !first {\n\t\t\tbuf.WriteString(\",\")\n\t\t}\n\n\t\tfirst = false\n\t\tbuf.Write(taskBytes)\n\t\treturn true\n\t})\n\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tbuf.WriteString(\"]\")\n\treturn buf.String(), nil\n}\n"},{"name":"storage.gno","body":"package gnorkle\n\nimport \"gno.land/p/demo/gnorkle/feed\"\n\n// Storage defines how published feed values should be read\n// and written.\ntype Storage interface {\n\tPut(value string) error\n\tGetLatest() feed.Value\n\tGetHistory() []feed.Value\n}\n"},{"name":"whitelist.gno","body":"package gnorkle\n\n// Whitelist is used to manage which agents are allowed to interact.\ntype Whitelist interface {\n\tClearAddresses()\n\tAddAddresses(addresses []string)\n\tRemoveAddress(address string)\n\tHasDefinition() bool\n\tHasAddress(address string) bool\n}\n\n// ClearWhitelist clears the whitelist of the instance or feed depending on the feed ID.\nfunc (i *Instance) ClearWhitelist(feedID string) error {\n\tif feedID == \"\" {\n\t\ti.whitelist.ClearAddresses()\n\t\treturn nil\n\t}\n\n\tfeedWithWhitelist, err := i.getFeedWithWhitelist(feedID)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tfeedWithWhitelist.ClearAddresses()\n\treturn nil\n}\n\n// AddToWhitelist adds the given addresses to the whitelist of the instance or feed depending on the feed ID.\nfunc (i *Instance) AddToWhitelist(feedID string, addresses []string) error {\n\tif feedID == \"\" {\n\t\ti.whitelist.AddAddresses(addresses)\n\t\treturn nil\n\t}\n\n\tfeedWithWhitelist, err := i.getFeedWithWhitelist(feedID)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tfeedWithWhitelist.AddAddresses(addresses)\n\treturn nil\n}\n\n// RemoveFromWhitelist removes the given address from the whitelist of the instance or feed depending on the feed ID.\nfunc (i *Instance) RemoveFromWhitelist(feedID string, address string) error {\n\tif feedID == \"\" {\n\t\ti.whitelist.RemoveAddress(address)\n\t\treturn nil\n\t}\n\n\tfeedWithWhitelist, err := i.getFeedWithWhitelist(feedID)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tfeedWithWhitelist.RemoveAddress(address)\n\treturn nil\n}\n\n// addressWhiteListed returns true if:\n// - the feed has a white list and the address is whitelisted, or\n// - the feed has no white list and the instance has a white list and the address is whitelisted, or\n// - the feed has no white list and the instance has no white list.\nfunc addressIsWhitelisted(instanceWhitelist, feedWhitelist Whitelist, address string, instanceWhitelistedOverride *bool) bool {\n\t// A feed whitelist takes priority, so it will return false if the feed has a whitelist and the caller is\n\t// not a part of it. An empty whitelist defers to the instance whitelist.\n\tif feedWhitelist != nil {\n\t\tif feedWhitelist.HasDefinition() \u0026\u0026 !feedWhitelist.HasAddress(address) {\n\t\t\treturn false\n\t\t}\n\n\t\t// Getting to this point means that one of the following is true:\n\t\t// - the feed has no defined whitelist (so it can't possibly have the address whitelisted)\n\t\t// - the feed has a defined whitelist and the caller is a part of it\n\t\t//\n\t\t// In this case, we can be sure that the boolean indicating whether the feed has this address whitelisted\n\t\t// is equivalent to the boolean indicating whether the feed has a defined whitelist.\n\t\tif feedWhitelist.HasDefinition() {\n\t\t\treturn true\n\t\t}\n\t}\n\n\tif instanceWhitelistedOverride != nil {\n\t\treturn *instanceWhitelistedOverride\n\t}\n\n\t// We were unable able to determine whether this address is allowed after looking at the feed whitelist,\n\t// so fall back to the instance whitelist. A complete absence of values in the instance whitelist means\n\t// that the instance has no whitelist so we can return true because everything is allowed by default.\n\tif instanceWhitelist == nil || !instanceWhitelist.HasDefinition() {\n\t\treturn true\n\t}\n\n\t// The instance whitelist is defined so if the address is present then it is allowed.\n\treturn instanceWhitelist.HasAddress(address)\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"storage","path":"gno.land/p/demo/gnorkle/storage","files":[{"name":"errors.gno","body":"package storage\n\nimport \"errors\"\n\nvar ErrUndefined = errors.New(\"undefined storage\")\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"urequire","path":"gno.land/p/demo/urequire","files":[{"name":"urequire.gno","body":"// urequire is a sister package for uassert.\n// XXX: codegen the package.\npackage urequire\n\nimport \"gno.land/p/demo/uassert\"\n\n// type TestingT = uassert.TestingT // XXX: bug, should work\n\nfunc NoError(t uassert.TestingT, err error, msgs ...string) {\n\tt.Helper()\n\tif uassert.NoError(t, err, msgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\nfunc Error(t uassert.TestingT, err error, msgs ...string) {\n\tt.Helper()\n\tif uassert.Error(t, err, msgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\nfunc ErrorContains(t uassert.TestingT, err error, contains string, msgs ...string) {\n\tt.Helper()\n\tif uassert.ErrorContains(t, err, contains, msgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\nfunc True(t uassert.TestingT, value bool, msgs ...string) {\n\tt.Helper()\n\tif uassert.True(t, value, msgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\nfunc False(t uassert.TestingT, value bool, msgs ...string) {\n\tt.Helper()\n\tif uassert.False(t, value, msgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\nfunc ErrorIs(t uassert.TestingT, err, target error, msgs ...string) {\n\tt.Helper()\n\tif uassert.ErrorIs(t, err, target, msgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\nfunc PanicsWithMessage(t uassert.TestingT, msg string, f func(), msgs ...string) {\n\tt.Helper()\n\tif uassert.PanicsWithMessage(t, msg, f, msgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\nfunc NotPanics(t uassert.TestingT, f func(), msgs ...string) {\n\tt.Helper()\n\tif uassert.NotPanics(t, f, msgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\nfunc Equal(t uassert.TestingT, expected, actual interface{}, msgs ...string) {\n\tt.Helper()\n\tif uassert.Equal(t, expected, actual, msgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\nfunc NotEqual(t uassert.TestingT, expected, actual interface{}, msgs ...string) {\n\tt.Helper()\n\tif uassert.NotEqual(t, expected, actual, msgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\nfunc Empty(t uassert.TestingT, obj interface{}, msgs ...string) {\n\tt.Helper()\n\tif uassert.Empty(t, obj, msgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n\nfunc NotEmpty(t uassert.TestingT, obj interface{}, msgs ...string) {\n\tt.Helper()\n\tif uassert.NotEmpty(t, obj, msgs...) {\n\t\treturn\n\t}\n\tt.FailNow()\n}\n"},{"name":"urequire_test.gno","body":"package urequire\n\nimport \"testing\"\n\nfunc TestPackage(t *testing.T) {\n\tEqual(t, 42, 42)\n\t// XXX: find a way to unit test this package\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"simple","path":"gno.land/p/demo/gnorkle/storage/simple","files":[{"name":"storage.gno","body":"package simple\n\nimport (\n\t\"time\"\n\n\t\"gno.land/p/demo/gnorkle/feed\"\n\t\"gno.land/p/demo/gnorkle/storage\"\n)\n\n// Storage is simple, bounded storage for published feed values.\ntype Storage struct {\n\tvalues []feed.Value\n\tmaxValues uint\n}\n\n// NewStorage creates a new Storage with the given maximum number of values.\n// If maxValues is 0, the storage is bounded to a size of one. If this is not desirable,\n// then don't provide a value of 0.\nfunc NewStorage(maxValues uint) *Storage {\n\tif maxValues == 0 {\n\t\tmaxValues = 1\n\t}\n\n\treturn \u0026Storage{\n\t\tmaxValues: maxValues,\n\t}\n}\n\n// Put adds a new value to the storage. If the storage is full, the oldest value\n// is removed. If maxValues is 0, the storage is bounded to a size of one.\nfunc (s *Storage) Put(value string) error {\n\tif s == nil {\n\t\treturn storage.ErrUndefined\n\t}\n\n\ts.values = append(s.values, feed.Value{String: value, Time: time.Now()})\n\tif uint(len(s.values)) \u003e s.maxValues {\n\t\ts.values = s.values[1:]\n\t}\n\n\treturn nil\n}\n\n// GetLatest returns the most recently added value, or an empty value if none exist.\nfunc (s Storage) GetLatest() feed.Value {\n\tif len(s.values) == 0 {\n\t\treturn feed.Value{}\n\t}\n\n\treturn s.values[len(s.values)-1]\n}\n\n// GetHistory returns all values in the storage, from oldest to newest.\nfunc (s Storage) GetHistory() []feed.Value {\n\treturn s.values\n}\n"},{"name":"storage_test.gno","body":"package simple_test\n\nimport (\n\t\"testing\"\n\n\t\"gno.land/p/demo/gnorkle/storage\"\n\t\"gno.land/p/demo/gnorkle/storage/simple\"\n\t\"gno.land/p/demo/uassert\"\n\t\"gno.land/p/demo/ufmt\"\n\t\"gno.land/p/demo/urequire\"\n)\n\nfunc TestStorage(t *testing.T) {\n\tvar undefinedStorage *simple.Storage\n\terr := undefinedStorage.Put(\"\")\n\tuassert.ErrorIs(t, err, storage.ErrUndefined, \"expected storage.ErrUndefined on undefined storage\")\n\n\ttests := []struct {\n\t\tname string\n\t\tvaluesToPut []string\n\t\texpLatestValueString string\n\t\texpLatestValueTimeIsZero bool\n\t\texpHistoricalValueStrings []string\n\t}{\n\t\t{\n\t\t\tname: \"empty\",\n\t\t\texpLatestValueTimeIsZero: true,\n\t\t},\n\t\t{\n\t\t\tname: \"one value\",\n\t\t\tvaluesToPut: []string{\"one\"},\n\t\t\texpLatestValueString: \"one\",\n\t\t\texpHistoricalValueStrings: []string{\"one\"},\n\t\t},\n\t\t{\n\t\t\tname: \"two values\",\n\t\t\tvaluesToPut: []string{\"one\", \"two\"},\n\t\t\texpLatestValueString: \"two\",\n\t\t\texpHistoricalValueStrings: []string{\"one\", \"two\"},\n\t\t},\n\t\t{\n\t\t\tname: \"three values\",\n\t\t\tvaluesToPut: []string{\"one\", \"two\", \"three\"},\n\t\t\texpLatestValueString: \"three\",\n\t\t\texpHistoricalValueStrings: []string{\"two\", \"three\"},\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tsimpleStorage := simple.NewStorage(2)\n\t\t\tfor _, value := range tt.valuesToPut {\n\t\t\t\terr := simpleStorage.Put(value)\n\t\t\t\turequire.NoError(t, err, \"unexpected error putting value in storage\")\n\t\t\t}\n\n\t\t\tlatestValue := simpleStorage.GetLatest()\n\t\t\tuassert.Equal(t, tt.expLatestValueString, latestValue.String)\n\t\t\tuassert.Equal(t, tt.expLatestValueTimeIsZero, latestValue.Time.IsZero())\n\n\t\t\thistoricalValues := simpleStorage.GetHistory()\n\t\t\turequire.Equal(t, len(tt.expHistoricalValueStrings), len(historicalValues), \"historical values length does not match\")\n\n\t\t\tfor i, expValue := range tt.expHistoricalValueStrings {\n\t\t\t\tuassert.Equal(t, historicalValues[i].String, expValue)\n\t\t\t\turequire.False(t, historicalValues[i].Time.IsZero(), ufmt.Sprintf(\"unexpeced zero time for historical value at index %d\", i))\n\t\t\t}\n\t\t})\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"single","path":"gno.land/p/demo/gnorkle/ingesters/single","files":[{"name":"ingester.gno","body":"package single\n\nimport (\n\t\"gno.land/p/demo/gnorkle/gnorkle\"\n\t\"gno.land/p/demo/gnorkle/ingester\"\n)\n\n// ValueIngester is an ingester that ingests a single value.\ntype ValueIngester struct {\n\tvalue string\n}\n\n// Type returns the type of the ingester.\nfunc (i *ValueIngester) Type() ingester.Type {\n\treturn ingester.TypeSingle\n}\n\n// Ingest ingests a value provided by the given agent address.\nfunc (i *ValueIngester) Ingest(value, providerAddress string) (bool, error) {\n\tif i == nil {\n\t\treturn false, ingester.ErrUndefined\n\t}\n\n\ti.value = value\n\treturn true, nil\n}\n\n// CommitValue commits the ingested value to the given storage instance.\nfunc (i *ValueIngester) CommitValue(valueStorer gnorkle.Storage, providerAddress string) error {\n\tif i == nil {\n\t\treturn ingester.ErrUndefined\n\t}\n\n\treturn valueStorer.Put(i.value)\n}\n"},{"name":"ingester_test.gno","body":"package single_test\n\nimport (\n\t\"testing\"\n\n\t\"gno.land/p/demo/gnorkle/ingester\"\n\t\"gno.land/p/demo/gnorkle/ingesters/single\"\n\t\"gno.land/p/demo/gnorkle/storage/simple\"\n\t\"gno.land/p/demo/uassert\"\n)\n\nfunc TestValueIngester(t *testing.T) {\n\tstorage := simple.NewStorage(1)\n\n\tvar undefinedIngester *single.ValueIngester\n\t_, err := undefinedIngester.Ingest(\"asdf\", \"gno11111\")\n\tuassert.ErrorIs(t, err, ingester.ErrUndefined, \"undefined ingester call to Ingest should return ingester.ErrUndefined\")\n\n\terr = undefinedIngester.CommitValue(storage, \"gno11111\")\n\tuassert.ErrorIs(t, err, ingester.ErrUndefined, \"undefined ingester call to CommitValue should return ingester.ErrUndefined\")\n\n\tvar valueIngester single.ValueIngester\n\ttyp := valueIngester.Type()\n\tuassert.Equal(t, int(ingester.TypeSingle), int(typ), \"single value ingester should return type ingester.TypeSingle\")\n\n\tingestValue := \"value\"\n\tautocommit, err := valueIngester.Ingest(ingestValue, \"gno11111\")\n\tuassert.True(t, autocommit, \"single value ingester should return autocommit true\")\n\tuassert.NoError(t, err)\n\n\terr = valueIngester.CommitValue(storage, \"gno11111\")\n\tuassert.NoError(t, err)\n\n\tlatestValue := storage.GetLatest()\n\tuassert.Equal(t, ingestValue, latestValue.String)\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"static","path":"gno.land/p/demo/gnorkle/feeds/static","files":[{"name":"feed.gno","body":"package static\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"errors\"\n\n\t\"gno.land/p/demo/gnorkle/feed\"\n\t\"gno.land/p/demo/gnorkle/gnorkle\"\n\t\"gno.land/p/demo/gnorkle/ingesters/single\"\n\t\"gno.land/p/demo/gnorkle/message\"\n\t\"gno.land/p/demo/gnorkle/storage/simple\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\n// Feed is a static feed.\ntype Feed struct {\n\tid string\n\tisLocked bool\n\tvalueDataType string\n\tingester gnorkle.Ingester\n\tstorage gnorkle.Storage\n\ttasks []feed.Task\n}\n\n// NewFeed creates a new static feed.\nfunc NewFeed(\n\tid string,\n\tvalueDataType string,\n\tingester gnorkle.Ingester,\n\tstorage gnorkle.Storage,\n\ttasks ...feed.Task,\n) *Feed {\n\treturn \u0026Feed{\n\t\tid: id,\n\t\tvalueDataType: valueDataType,\n\t\tingester: ingester,\n\t\tstorage: storage,\n\t\ttasks: tasks,\n\t}\n}\n\n// NewSingleValueFeed is a convenience function for creating a static feed\n// that autocommits a value after a single ingestion.\nfunc NewSingleValueFeed(\n\tid string,\n\tvalueDataType string,\n\ttasks ...feed.Task,\n) *Feed {\n\treturn NewFeed(\n\t\tid,\n\t\tvalueDataType,\n\t\t\u0026single.ValueIngester{},\n\t\tsimple.NewStorage(1),\n\t\ttasks...,\n\t)\n}\n\n// ID returns the feed's ID.\nfunc (f Feed) ID() string {\n\treturn f.id\n}\n\n// Type returns the feed's type.\nfunc (f Feed) Type() feed.Type {\n\treturn feed.TypeStatic\n}\n\n// Ingest ingests a message into the feed. It either adds the value to the ingester's\n// pending values or commits the value to the storage.\nfunc (f *Feed) Ingest(funcType message.FuncType, msg, providerAddress string) error {\n\tif f == nil {\n\t\treturn feed.ErrUndefined\n\t}\n\n\tif f.isLocked {\n\t\treturn errors.New(\"feed locked\")\n\t}\n\n\tswitch funcType {\n\tcase message.FuncTypeIngest:\n\t\t// Autocommit the ingester's value if it's a single value ingester\n\t\t// because this is a static feed and this is the only value it will ever have.\n\t\tif canAutoCommit, err := f.ingester.Ingest(msg, providerAddress); canAutoCommit \u0026\u0026 err == nil {\n\t\t\tif err := f.ingester.CommitValue(f.storage, providerAddress); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\n\t\t\tf.isLocked = true\n\t\t} else if err != nil {\n\t\t\treturn err\n\t\t}\n\n\tcase message.FuncTypeCommit:\n\t\tif err := f.ingester.CommitValue(f.storage, providerAddress); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tf.isLocked = true\n\n\tdefault:\n\t\treturn errors.New(\"invalid message function \" + string(funcType))\n\t}\n\n\treturn nil\n}\n\n// Value returns the feed's latest value, it's data type, and whether or not it can\n// be safely consumed. In this case it uses `f.isLocked` because, this being a static\n// feed, it will only ever have one value; once that value is committed the feed is locked\n// and there is a valid, non-empty value to consume.\nfunc (f Feed) Value() (feed.Value, string, bool) {\n\treturn f.storage.GetLatest(), f.valueDataType, f.isLocked\n}\n\n// MarshalJSON marshals the components of the feed that are needed for\n// an agent to execute tasks and send values for ingestion.\nfunc (f Feed) MarshalJSON() ([]byte, error) {\n\tbuf := new(bytes.Buffer)\n\tw := bufio.NewWriter(buf)\n\n\tw.Write([]byte(\n\t\t`{\"id\":\"` + f.id +\n\t\t\t`\",\"type\":\"` + ufmt.Sprintf(\"%d\", int(f.Type())) +\n\t\t\t`\",\"value_type\":\"` + f.valueDataType +\n\t\t\t`\",\"tasks\":[`),\n\t)\n\n\tfirst := true\n\tfor _, task := range f.tasks {\n\t\tif !first {\n\t\t\tw.WriteString(\",\")\n\t\t}\n\n\t\ttaskJSON, err := task.MarshalJSON()\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tw.Write(taskJSON)\n\t\tfirst = false\n\t}\n\n\tw.Write([]byte(\"]}\"))\n\tw.Flush()\n\n\treturn buf.Bytes(), nil\n}\n\n// Tasks returns the feed's tasks. This allows task consumers to extract task\n// contents without having to marshal the entire feed.\nfunc (f Feed) Tasks() []feed.Task {\n\treturn f.tasks\n}\n\n// IsActive returns true if the feed is accepting ingestion requests from agents.\nfunc (f Feed) IsActive() bool {\n\treturn !f.isLocked\n}\n"},{"name":"feed_test.gno","body":"package static_test\n\nimport (\n\t\"errors\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/gnorkle/feed\"\n\t\"gno.land/p/demo/gnorkle/feeds/static\"\n\t\"gno.land/p/demo/gnorkle/gnorkle\"\n\t\"gno.land/p/demo/gnorkle/ingester\"\n\t\"gno.land/p/demo/gnorkle/message\"\n\t\"gno.land/p/demo/gnorkle/storage/simple\"\n\t\"gno.land/p/demo/uassert\"\n\t\"gno.land/p/demo/urequire\"\n)\n\ntype mockIngester struct {\n\tcanAutoCommit bool\n\tingestErr error\n\tcommitErr error\n\tvalue string\n\tproviderAddress string\n}\n\nfunc (i mockIngester) Type() ingester.Type {\n\treturn ingester.Type(0)\n}\n\nfunc (i *mockIngester) Ingest(value, providerAddress string) (bool, error) {\n\tif i.ingestErr != nil {\n\t\treturn false, i.ingestErr\n\t}\n\n\ti.value = value\n\ti.providerAddress = providerAddress\n\treturn i.canAutoCommit, nil\n}\n\nfunc (i *mockIngester) CommitValue(storage gnorkle.Storage, providerAddress string) error {\n\tif i.commitErr != nil {\n\t\treturn i.commitErr\n\t}\n\n\treturn storage.Put(i.value)\n}\n\nfunc TestNewSingleValueFeed(t *testing.T) {\n\tstaticFeed := static.NewSingleValueFeed(\"1\", \"\")\n\n\tuassert.Equal(t, \"1\", staticFeed.ID())\n\tuassert.Equal(t, int(feed.TypeStatic), int(staticFeed.Type()))\n}\n\nfunc TestFeed_Ingest(t *testing.T) {\n\tvar undefinedFeed *static.Feed\n\terr := undefinedFeed.Ingest(\"\", \"\", \"\")\n\tuassert.ErrorIs(t, err, feed.ErrUndefined)\n\n\ttests := []struct {\n\t\tname string\n\t\tingester *mockIngester\n\t\tverifyIsLocked bool\n\t\tdoCommit bool\n\t\tfuncType message.FuncType\n\t\tmsg string\n\t\tproviderAddress string\n\t\texpFeedValueString string\n\t\texpErrText string\n\t\texpIsActive bool\n\t}{\n\t\t{\n\t\t\tname: \"func invalid error\",\n\t\t\tingester: \u0026mockIngester{},\n\t\t\tfuncType: message.FuncType(\"derp\"),\n\t\t\texpErrText: \"invalid message function derp\",\n\t\t\texpIsActive: true,\n\t\t},\n\t\t{\n\t\t\tname: \"func ingest ingest error\",\n\t\t\tingester: \u0026mockIngester{\n\t\t\t\tingestErr: errors.New(\"ingest error\"),\n\t\t\t},\n\t\t\tfuncType: message.FuncTypeIngest,\n\t\t\texpErrText: \"ingest error\",\n\t\t\texpIsActive: true,\n\t\t},\n\t\t{\n\t\t\tname: \"func ingest commit error\",\n\t\t\tingester: \u0026mockIngester{\n\t\t\t\tcommitErr: errors.New(\"commit error\"),\n\t\t\t\tcanAutoCommit: true,\n\t\t\t},\n\t\t\tfuncType: message.FuncTypeIngest,\n\t\t\texpErrText: \"commit error\",\n\t\t\texpIsActive: true,\n\t\t},\n\t\t{\n\t\t\tname: \"func commit commit error\",\n\t\t\tingester: \u0026mockIngester{\n\t\t\t\tcommitErr: errors.New(\"commit error\"),\n\t\t\t\tcanAutoCommit: true,\n\t\t\t},\n\t\t\tfuncType: message.FuncTypeCommit,\n\t\t\texpErrText: \"commit error\",\n\t\t\texpIsActive: true,\n\t\t},\n\t\t{\n\t\t\tname: \"only ingest\",\n\t\t\tingester: \u0026mockIngester{},\n\t\t\tfuncType: message.FuncTypeIngest,\n\t\t\tmsg: \"still active feed\",\n\t\t\tproviderAddress: \"gno1234\",\n\t\t\texpIsActive: true,\n\t\t},\n\t\t{\n\t\t\tname: \"ingest autocommit\",\n\t\t\tingester: \u0026mockIngester{canAutoCommit: true},\n\t\t\tfuncType: message.FuncTypeIngest,\n\t\t\tmsg: \"still active feed\",\n\t\t\tproviderAddress: \"gno1234\",\n\t\t\texpFeedValueString: \"still active feed\",\n\t\t\tverifyIsLocked: true,\n\t\t},\n\t\t{\n\t\t\tname: \"commit no value\",\n\t\t\tingester: \u0026mockIngester{},\n\t\t\tfuncType: message.FuncTypeCommit,\n\t\t\tmsg: \"shouldn't be stored\",\n\t\t\tverifyIsLocked: true,\n\t\t},\n\t\t{\n\t\t\tname: \"ingest then commmit\",\n\t\t\tingester: \u0026mockIngester{},\n\t\t\tfuncType: message.FuncTypeIngest,\n\t\t\tmsg: \"blahblah\",\n\t\t\tdoCommit: true,\n\t\t\texpFeedValueString: \"blahblah\",\n\t\t\tverifyIsLocked: true,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tstaticFeed := static.NewFeed(\n\t\t\t\t\"1\",\n\t\t\t\t\"string\",\n\t\t\t\ttt.ingester,\n\t\t\t\tsimple.NewStorage(1),\n\t\t\t\tnil,\n\t\t\t)\n\n\t\t\tvar errText string\n\t\t\tif err := staticFeed.Ingest(tt.funcType, tt.msg, tt.providerAddress); err != nil {\n\t\t\t\terrText = err.Error()\n\t\t\t}\n\n\t\t\turequire.Equal(t, tt.expErrText, errText)\n\n\t\t\tif tt.doCommit {\n\t\t\t\terr := staticFeed.Ingest(message.FuncTypeCommit, \"\", \"\")\n\t\t\t\turequire.NoError(t, err, \"follow up commit failed\")\n\t\t\t}\n\n\t\t\tif tt.verifyIsLocked {\n\t\t\t\terrText = \"\"\n\t\t\t\tif err := staticFeed.Ingest(tt.funcType, tt.msg, tt.providerAddress); err != nil {\n\t\t\t\t\terrText = err.Error()\n\t\t\t\t}\n\n\t\t\t\turequire.Equal(t, \"feed locked\", errText)\n\t\t\t}\n\n\t\t\tuassert.Equal(t, tt.providerAddress, tt.ingester.providerAddress)\n\n\t\t\tfeedValue, dataType, isLocked := staticFeed.Value()\n\t\t\tuassert.Equal(t, tt.expFeedValueString, feedValue.String)\n\t\t\tuassert.Equal(t, \"string\", dataType)\n\t\t\tuassert.Equal(t, tt.verifyIsLocked, isLocked)\n\t\t\tuassert.Equal(t, tt.expIsActive, staticFeed.IsActive())\n\t\t})\n\t}\n}\n\ntype mockTask struct {\n\terr error\n\tvalue string\n}\n\nfunc (t mockTask) MarshalJSON() ([]byte, error) {\n\tif t.err != nil {\n\t\treturn nil, t.err\n\t}\n\n\treturn []byte(`{\"value\":\"` + t.value + `\"}`), nil\n}\n\nfunc TestFeed_Tasks(t *testing.T) {\n\tid := \"99\"\n\tvalueDataType := \"int\"\n\n\ttests := []struct {\n\t\tname string\n\t\ttasks []feed.Task\n\t\texpErrText string\n\t\texpJSON string\n\t}{\n\t\t{\n\t\t\tname: \"no tasks\",\n\t\t\texpJSON: `{\"id\":\"99\",\"type\":\"0\",\"value_type\":\"int\",\"tasks\":[]}`,\n\t\t},\n\t\t{\n\t\t\tname: \"marshal error\",\n\t\t\ttasks: []feed.Task{\n\t\t\t\tmockTask{err: errors.New(\"marshal error\")},\n\t\t\t},\n\t\t\texpErrText: \"marshal error\",\n\t\t},\n\t\t{\n\t\t\tname: \"one task\",\n\t\t\ttasks: []feed.Task{\n\t\t\t\tmockTask{value: \"single\"},\n\t\t\t},\n\t\t\texpJSON: `{\"id\":\"99\",\"type\":\"0\",\"value_type\":\"int\",\"tasks\":[{\"value\":\"single\"}]}`,\n\t\t},\n\t\t{\n\t\t\tname: \"two tasks\",\n\t\t\ttasks: []feed.Task{\n\t\t\t\tmockTask{value: \"first\"},\n\t\t\t\tmockTask{value: \"second\"},\n\t\t\t},\n\t\t\texpJSON: `{\"id\":\"99\",\"type\":\"0\",\"value_type\":\"int\",\"tasks\":[{\"value\":\"first\"},{\"value\":\"second\"}]}`,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tstaticFeed := static.NewSingleValueFeed(\n\t\t\t\tid,\n\t\t\t\tvalueDataType,\n\t\t\t\ttt.tasks...,\n\t\t\t)\n\n\t\t\turequire.Equal(t, len(tt.tasks), len(staticFeed.Tasks()))\n\n\t\t\tvar errText string\n\t\t\tjson, err := staticFeed.MarshalJSON()\n\t\t\tif err != nil {\n\t\t\t\terrText = err.Error()\n\t\t\t}\n\n\t\t\turequire.Equal(t, tt.expErrText, errText)\n\t\t\turequire.Equal(t, tt.expJSON, string(json))\n\t\t})\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"exts","path":"gno.land/p/demo/grc/exts","files":[{"name":"token_metadata.gno","body":"package exts\n\ntype TokenMetadata interface {\n\t// Returns the name of the token.\n\tGetName() string\n\n\t// Returns the symbol of the token, usually a shorter version of the\n\t// name.\n\tGetSymbol() string\n\n\t// Returns the decimals places of the token.\n\tGetDecimals() uint\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"grc1155","path":"gno.land/p/demo/grc/grc1155","files":[{"name":"README.md","body":"# GRC-1155 Spec: Multi Token Standard\n\nGRC1155 is a specification for managing multiple tokens based on Gnoland. The name and design is based on Ethereum's ERC1155 standard.\n\n## See also:\n\n[ERC-1155 Spec][erc-1155]\n\n[erc-1155]: https://eips.ethereum.org/EIPS/eip-1155"},{"name":"basic_grc1155_token.gno","body":"package grc1155\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\ntype basicGRC1155Token struct {\n\turi string\n\tbalances avl.Tree // \"TokenId:Address\" -\u003e uint64\n\toperatorApprovals avl.Tree // \"OwnerAddress:OperatorAddress\" -\u003e bool\n}\n\nvar _ IGRC1155 = (*basicGRC1155Token)(nil)\n\n// Returns new basic GRC1155 token\nfunc NewBasicGRC1155Token(uri string) *basicGRC1155Token {\n\treturn \u0026basicGRC1155Token{\n\t\turi: uri,\n\t\tbalances: avl.Tree{},\n\t\toperatorApprovals: avl.Tree{},\n\t}\n}\n\nfunc (s *basicGRC1155Token) Uri() string { return s.uri }\n\n// BalanceOf returns the input address's balance of the token type requested\nfunc (s *basicGRC1155Token) BalanceOf(addr std.Address, tid TokenID) (uint64, error) {\n\tif !isValidAddress(addr) {\n\t\treturn 0, ErrInvalidAddress\n\t}\n\n\tkey := string(tid) + \":\" + addr.String()\n\tbalance, found := s.balances.Get(key)\n\tif !found {\n\t\treturn 0, nil\n\t}\n\n\treturn balance.(uint64), nil\n}\n\n// BalanceOfBatch returns the balance of multiple account/token pairs\nfunc (s *basicGRC1155Token) BalanceOfBatch(owners []std.Address, batch []TokenID) ([]uint64, error) {\n\tif len(owners) != len(batch) {\n\t\treturn nil, ErrMismatchLength\n\t}\n\n\tbalanceOfBatch := make([]uint64, len(owners))\n\n\tfor i := 0; i \u003c len(owners); i++ {\n\t\tbalanceOfBatch[i], _ = s.BalanceOf(owners[i], batch[i])\n\t}\n\n\treturn balanceOfBatch, nil\n}\n\n// SetApprovalForAll can approve the operator to operate on all tokens\nfunc (s *basicGRC1155Token) SetApprovalForAll(operator std.Address, approved bool) error {\n\tif !isValidAddress(operator) {\n\t\treturn ErrInvalidAddress\n\t}\n\n\tcaller := std.GetOrigCaller()\n\treturn s.setApprovalForAll(caller, operator, approved)\n}\n\n// IsApprovedForAll returns true if operator is the owner or is approved for all by the owner.\n// Otherwise, returns false\nfunc (s *basicGRC1155Token) IsApprovedForAll(owner, operator std.Address) bool {\n\tif operator == owner {\n\t\treturn true\n\t}\n\tkey := owner.String() + \":\" + operator.String()\n\t_, found := s.operatorApprovals.Get(key)\n\tif !found {\n\t\treturn false\n\t}\n\n\treturn true\n}\n\n// Safely transfers `tokenId` token from `from` to `to`, checking that\n// contract recipients are aware of the GRC1155 protocol to prevent\n// tokens from being forever locked.\nfunc (s *basicGRC1155Token) SafeTransferFrom(from, to std.Address, tid TokenID, amount uint64) error {\n\tcaller := std.GetOrigCaller()\n\tif !s.IsApprovedForAll(caller, from) {\n\t\treturn ErrCallerIsNotOwnerOrApproved\n\t}\n\n\terr := s.safeBatchTransferFrom(from, to, []TokenID{tid}, []uint64{amount})\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif !s.doSafeTransferAcceptanceCheck(caller, from, to, tid, amount) {\n\t\treturn ErrTransferToRejectedOrNonGRC1155Receiver\n\t}\n\n\temit(\u0026TransferSingleEvent{caller, from, to, tid, amount})\n\n\treturn nil\n}\n\n// Safely transfers a `batch` of tokens from `from` to `to`, checking that\n// contract recipients are aware of the GRC1155 protocol to prevent\n// tokens from being forever locked.\nfunc (s *basicGRC1155Token) SafeBatchTransferFrom(from, to std.Address, batch []TokenID, amounts []uint64) error {\n\tcaller := std.GetOrigCaller()\n\tif !s.IsApprovedForAll(caller, from) {\n\t\treturn ErrCallerIsNotOwnerOrApproved\n\t}\n\n\terr := s.safeBatchTransferFrom(from, to, batch, amounts)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif !s.doSafeBatchTransferAcceptanceCheck(caller, from, to, batch, amounts) {\n\t\treturn ErrTransferToRejectedOrNonGRC1155Receiver\n\t}\n\n\temit(\u0026TransferBatchEvent{caller, from, to, batch, amounts})\n\n\treturn nil\n}\n\n// Creates `amount` tokens of token type `id`, and assigns them to `to`. Also checks that\n// contract recipients are using GRC1155 protocol.\nfunc (s *basicGRC1155Token) SafeMint(to std.Address, tid TokenID, amount uint64) error {\n\tcaller := std.GetOrigCaller()\n\n\terr := s.mintBatch(to, []TokenID{tid}, []uint64{amount})\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif !s.doSafeTransferAcceptanceCheck(caller, zeroAddress, to, tid, amount) {\n\t\treturn ErrTransferToRejectedOrNonGRC1155Receiver\n\t}\n\n\temit(\u0026TransferSingleEvent{caller, zeroAddress, to, tid, amount})\n\n\treturn nil\n}\n\n// Batch version of `SafeMint()`. Also checks that\n// contract recipients are using GRC1155 protocol.\nfunc (s *basicGRC1155Token) SafeBatchMint(to std.Address, batch []TokenID, amounts []uint64) error {\n\tcaller := std.GetOrigCaller()\n\n\terr := s.mintBatch(to, batch, amounts)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif !s.doSafeBatchTransferAcceptanceCheck(caller, zeroAddress, to, batch, amounts) {\n\t\treturn ErrTransferToRejectedOrNonGRC1155Receiver\n\t}\n\n\temit(\u0026TransferBatchEvent{caller, zeroAddress, to, batch, amounts})\n\n\treturn nil\n}\n\n// Destroys `amount` tokens of token type `id` from `from`.\nfunc (s *basicGRC1155Token) Burn(from std.Address, tid TokenID, amount uint64) error {\n\tcaller := std.GetOrigCaller()\n\n\terr := s.burnBatch(from, []TokenID{tid}, []uint64{amount})\n\tif err != nil {\n\t\treturn err\n\t}\n\n\temit(\u0026TransferSingleEvent{caller, from, zeroAddress, tid, amount})\n\n\treturn nil\n}\n\n// Batch version of `Burn()`\nfunc (s *basicGRC1155Token) BatchBurn(from std.Address, batch []TokenID, amounts []uint64) error {\n\tcaller := std.GetOrigCaller()\n\n\terr := s.burnBatch(from, batch, amounts)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\temit(\u0026TransferBatchEvent{caller, from, zeroAddress, batch, amounts})\n\n\treturn nil\n}\n\n/* Helper methods */\n\n// Helper for SetApprovalForAll(): approve `operator` to operate on all of `owner` tokens\nfunc (s *basicGRC1155Token) setApprovalForAll(owner, operator std.Address, approved bool) error {\n\tif owner == operator {\n\t\treturn nil\n\t}\n\n\tkey := owner.String() + \":\" + operator.String()\n\tif approved {\n\t\ts.operatorApprovals.Set(key, approved)\n\t} else {\n\t\ts.operatorApprovals.Remove(key)\n\t}\n\n\temit(\u0026ApprovalForAllEvent{owner, operator, approved})\n\n\treturn nil\n}\n\n// Helper for SafeTransferFrom() and SafeBatchTransferFrom()\nfunc (s *basicGRC1155Token) safeBatchTransferFrom(from, to std.Address, batch []TokenID, amounts []uint64) error {\n\tif len(batch) != len(amounts) {\n\t\treturn ErrMismatchLength\n\t}\n\tif !isValidAddress(from) || !isValidAddress(to) {\n\t\treturn ErrInvalidAddress\n\t}\n\tif from == to {\n\t\treturn ErrCannotTransferToSelf\n\t}\n\n\tcaller := std.GetOrigCaller()\n\ts.beforeTokenTransfer(caller, from, to, batch, amounts)\n\n\tfor i := 0; i \u003c len(batch); i++ {\n\t\ttid := batch[i]\n\t\tamount := amounts[i]\n\t\tfromBalance, err := s.BalanceOf(from, tid)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif fromBalance \u003c amount {\n\t\t\treturn ErrInsufficientBalance\n\t\t}\n\t\ttoBalance, err := s.BalanceOf(to, tid)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tfromBalance -= amount\n\t\ttoBalance += amount\n\t\tfromBalanceKey := string(tid) + \":\" + from.String()\n\t\ttoBalanceKey := string(tid) + \":\" + to.String()\n\t\ts.balances.Set(fromBalanceKey, fromBalance)\n\t\ts.balances.Set(toBalanceKey, toBalance)\n\t}\n\n\ts.afterTokenTransfer(caller, from, to, batch, amounts)\n\n\treturn nil\n}\n\n// Helper for SafeMint() and SafeBatchMint()\nfunc (s *basicGRC1155Token) mintBatch(to std.Address, batch []TokenID, amounts []uint64) error {\n\tif len(batch) != len(amounts) {\n\t\treturn ErrMismatchLength\n\t}\n\tif !isValidAddress(to) {\n\t\treturn ErrInvalidAddress\n\t}\n\n\tcaller := std.GetOrigCaller()\n\ts.beforeTokenTransfer(caller, zeroAddress, to, batch, amounts)\n\n\tfor i := 0; i \u003c len(batch); i++ {\n\t\ttid := batch[i]\n\t\tamount := amounts[i]\n\t\ttoBalance, err := s.BalanceOf(to, tid)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\ttoBalance += amount\n\t\ttoBalanceKey := string(tid) + \":\" + to.String()\n\t\ts.balances.Set(toBalanceKey, toBalance)\n\t}\n\n\ts.afterTokenTransfer(caller, zeroAddress, to, batch, amounts)\n\n\treturn nil\n}\n\n// Helper for Burn() and BurnBatch()\nfunc (s *basicGRC1155Token) burnBatch(from std.Address, batch []TokenID, amounts []uint64) error {\n\tif len(batch) != len(amounts) {\n\t\treturn ErrMismatchLength\n\t}\n\tif !isValidAddress(from) {\n\t\treturn ErrInvalidAddress\n\t}\n\n\tcaller := std.GetOrigCaller()\n\ts.beforeTokenTransfer(caller, from, zeroAddress, batch, amounts)\n\n\tfor i := 0; i \u003c len(batch); i++ {\n\t\ttid := batch[i]\n\t\tamount := amounts[i]\n\t\tfromBalance, err := s.BalanceOf(from, tid)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif fromBalance \u003c amount {\n\t\t\treturn ErrBurnAmountExceedsBalance\n\t\t}\n\t\tfromBalance -= amount\n\t\tfromBalanceKey := string(tid) + \":\" + from.String()\n\t\ts.balances.Set(fromBalanceKey, fromBalance)\n\t}\n\n\ts.afterTokenTransfer(caller, from, zeroAddress, batch, amounts)\n\n\treturn nil\n}\n\nfunc (s *basicGRC1155Token) setUri(newUri string) {\n\ts.uri = newUri\n\temit(\u0026UpdateURIEvent{newUri})\n}\n\nfunc (s *basicGRC1155Token) beforeTokenTransfer(operator, from, to std.Address, batch []TokenID, amounts []uint64) {\n\t// TODO: Implementation\n}\n\nfunc (s *basicGRC1155Token) afterTokenTransfer(operator, from, to std.Address, batch []TokenID, amounts []uint64) {\n\t// TODO: Implementation\n}\n\nfunc (s *basicGRC1155Token) doSafeTransferAcceptanceCheck(operator, from, to std.Address, tid TokenID, amount uint64) bool {\n\t// TODO: Implementation\n\treturn true\n}\n\nfunc (s *basicGRC1155Token) doSafeBatchTransferAcceptanceCheck(operator, from, to std.Address, batch []TokenID, amounts []uint64) bool {\n\t// TODO: Implementation\n\treturn true\n}\n\nfunc (s *basicGRC1155Token) RenderHome() (str string) {\n\tstr += ufmt.Sprintf(\"# URI:%s\\n\", s.uri)\n\n\treturn\n}\n"},{"name":"basic_grc1155_token_test.gno","body":"package grc1155\n\nimport (\n\t\"std\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/uassert\"\n)\n\nconst dummyURI = \"ipfs://xyz\"\n\nfunc TestNewBasicGRC1155Token(t *testing.T) {\n\tdummy := NewBasicGRC1155Token(dummyURI)\n\tuassert.True(t, dummy != nil, \"should not be nil\")\n}\n\nfunc TestUri(t *testing.T) {\n\tdummy := NewBasicGRC1155Token(dummyURI)\n\tuassert.True(t, dummy != nil, \"should not be nil\")\n\tuassert.Equal(t, dummyURI, dummy.Uri())\n}\n\nfunc TestBalanceOf(t *testing.T) {\n\tdummy := NewBasicGRC1155Token(dummyURI)\n\tuassert.True(t, dummy != nil, \"should not be nil\")\n\n\taddr1 := std.Address(\"g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm\")\n\taddr2 := std.Address(\"g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj\")\n\n\ttid1 := TokenID(\"1\")\n\ttid2 := TokenID(\"2\")\n\n\tbalanceZeroAddressOfToken1, err := dummy.BalanceOf(zeroAddress, tid1)\n\tuassert.Error(t, err, \"should result in error\")\n\n\tbalanceAddr1OfToken1, err := dummy.BalanceOf(addr1, tid1)\n\tuassert.NoError(t, err, \"should not result in error\")\n\tuassert.Equal(t, uint64(0), balanceAddr1OfToken1)\n\n\tdummy.mintBatch(addr1, []TokenID{tid1, tid2}, []uint64{10, 100})\n\tdummy.mintBatch(addr2, []TokenID{tid1}, []uint64{20})\n\n\tbalanceAddr1OfToken1, err = dummy.BalanceOf(addr1, tid1)\n\tuassert.NoError(t, err, \"should not result in error\")\n\tbalanceAddr1OfToken2, err := dummy.BalanceOf(addr1, tid2)\n\tuassert.NoError(t, err, \"should not result in error\")\n\tbalanceAddr2OfToken1, err := dummy.BalanceOf(addr2, tid1)\n\tuassert.NoError(t, err, \"should not result in error\")\n\n\tuassert.Equal(t, uint64(10), balanceAddr1OfToken1)\n\tuassert.Equal(t, uint64(100), balanceAddr1OfToken2)\n\tuassert.Equal(t, uint64(20), balanceAddr2OfToken1)\n}\n\nfunc TestBalanceOfBatch(t *testing.T) {\n\tdummy := NewBasicGRC1155Token(dummyURI)\n\tuassert.True(t, dummy != nil, \"should not be nil\")\n\n\taddr1 := std.Address(\"g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm\")\n\taddr2 := std.Address(\"g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj\")\n\n\ttid1 := TokenID(\"1\")\n\ttid2 := TokenID(\"2\")\n\n\tbalanceBatch, err := dummy.BalanceOfBatch([]std.Address{addr1, addr2}, []TokenID{tid1, tid2})\n\tuassert.NoError(t, err, \"should not result in error\")\n\tuassert.Equal(t, uint64(0), balanceBatch[0])\n\tuassert.Equal(t, uint64(0), balanceBatch[1])\n\n\tdummy.mintBatch(addr1, []TokenID{tid1}, []uint64{10})\n\tdummy.mintBatch(addr2, []TokenID{tid2}, []uint64{20})\n\n\tbalanceBatch, err = dummy.BalanceOfBatch([]std.Address{addr1, addr2}, []TokenID{tid1, tid2})\n\tuassert.NoError(t, err, \"should not result in error\")\n\tuassert.Equal(t, uint64(10), balanceBatch[0])\n\tuassert.Equal(t, uint64(20), balanceBatch[1])\n}\n\nfunc TestIsApprovedForAll(t *testing.T) {\n\tdummy := NewBasicGRC1155Token(dummyURI)\n\tuassert.True(t, dummy != nil, \"should not be nil\")\n\n\taddr1 := std.Address(\"g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm\")\n\taddr2 := std.Address(\"g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj\")\n\n\tisApprovedForAll := dummy.IsApprovedForAll(addr1, addr2)\n\tuassert.False(t, isApprovedForAll)\n}\n\nfunc TestSetApprovalForAll(t *testing.T) {\n\tdummy := NewBasicGRC1155Token(dummyURI)\n\tuassert.True(t, dummy != nil, \"should not be nil\")\n\n\tcaller := std.GetOrigCaller()\n\taddr := std.Address(\"g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm\")\n\n\tisApprovedForAll := dummy.IsApprovedForAll(caller, addr)\n\tuassert.False(t, isApprovedForAll)\n\n\terr := dummy.SetApprovalForAll(addr, true)\n\tuassert.NoError(t, err, \"should not result in error\")\n\n\tisApprovedForAll = dummy.IsApprovedForAll(caller, addr)\n\tuassert.True(t, isApprovedForAll)\n\n\terr = dummy.SetApprovalForAll(addr, false)\n\tuassert.NoError(t, err, \"should not result in error\")\n\n\tisApprovedForAll = dummy.IsApprovedForAll(caller, addr)\n\tuassert.False(t, isApprovedForAll)\n}\n\nfunc TestSafeTransferFrom(t *testing.T) {\n\tdummy := NewBasicGRC1155Token(dummyURI)\n\tuassert.True(t, dummy != nil, \"should not be nil\")\n\n\tcaller := std.GetOrigCaller()\n\taddr := std.Address(\"g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm\")\n\n\ttid := TokenID(\"1\")\n\n\tdummy.mintBatch(caller, []TokenID{tid}, []uint64{100})\n\n\terr := dummy.SafeTransferFrom(caller, zeroAddress, tid, 10)\n\tuassert.Error(t, err, \"should result in error\")\n\n\terr = dummy.SafeTransferFrom(caller, addr, tid, 160)\n\tuassert.Error(t, err, \"should result in error\")\n\n\terr = dummy.SafeTransferFrom(caller, addr, tid, 60)\n\tuassert.NoError(t, err, \"should not result in error\")\n\n\t// Check balance of caller after transfer\n\tbalanceOfCaller, err := dummy.BalanceOf(caller, tid)\n\tuassert.NoError(t, err, \"should not result in error\")\n\tuassert.Equal(t, uint64(40), balanceOfCaller)\n\n\t// Check balance of addr after transfer\n\tbalanceOfAddr, err := dummy.BalanceOf(addr, tid)\n\tuassert.NoError(t, err, \"should not result in error\")\n\tuassert.Equal(t, uint64(60), balanceOfAddr)\n}\n\nfunc TestSafeBatchTransferFrom(t *testing.T) {\n\tdummy := NewBasicGRC1155Token(dummyURI)\n\tuassert.True(t, dummy != nil, \"should not be nil\")\n\n\tcaller := std.GetOrigCaller()\n\taddr := std.Address(\"g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm\")\n\n\ttid1 := TokenID(\"1\")\n\ttid2 := TokenID(\"2\")\n\n\tdummy.mintBatch(caller, []TokenID{tid1, tid2}, []uint64{10, 100})\n\n\terr := dummy.SafeBatchTransferFrom(caller, zeroAddress, []TokenID{tid1, tid2}, []uint64{4, 60})\n\tuassert.Error(t, err, \"should result in error\")\n\terr = dummy.SafeBatchTransferFrom(caller, addr, []TokenID{tid1, tid2}, []uint64{40, 60})\n\tuassert.Error(t, err, \"should result in error\")\n\terr = dummy.SafeBatchTransferFrom(caller, addr, []TokenID{tid1}, []uint64{40, 60})\n\tuassert.Error(t, err, \"should result in error\")\n\terr = dummy.SafeBatchTransferFrom(caller, addr, []TokenID{tid1, tid2}, []uint64{4, 60})\n\tuassert.NoError(t, err, \"should not result in error\")\n\n\tbalanceBatch, err := dummy.BalanceOfBatch([]std.Address{caller, addr, caller, addr}, []TokenID{tid1, tid1, tid2, tid2})\n\tuassert.NoError(t, err, \"should not result in error\")\n\n\t// Check token1's balance of caller after batch transfer\n\tuassert.Equal(t, uint64(6), balanceBatch[0])\n\n\t// Check token1's balance of addr after batch transfer\n\tuassert.Equal(t, uint64(4), balanceBatch[1])\n\n\t// Check token2's balance of caller after batch transfer\n\tuassert.Equal(t, uint64(40), balanceBatch[2])\n\n\t// Check token2's balance of addr after batch transfer\n\tuassert.Equal(t, uint64(60), balanceBatch[3])\n}\n\nfunc TestSafeMint(t *testing.T) {\n\tdummy := NewBasicGRC1155Token(dummyURI)\n\tuassert.True(t, dummy != nil, \"should not be nil\")\n\n\taddr1 := std.Address(\"g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm\")\n\taddr2 := std.Address(\"g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj\")\n\n\ttid1 := TokenID(\"1\")\n\ttid2 := TokenID(\"2\")\n\n\terr := dummy.SafeMint(zeroAddress, tid1, 100)\n\tuassert.Error(t, err, \"should result in error\")\n\terr = dummy.SafeMint(addr1, tid1, 100)\n\tuassert.NoError(t, err, \"should not result in error\")\n\terr = dummy.SafeMint(addr1, tid2, 200)\n\tuassert.NoError(t, err, \"should not result in error\")\n\terr = dummy.SafeMint(addr2, tid1, 50)\n\tuassert.NoError(t, err, \"should not result in error\")\n\n\tbalanceBatch, err := dummy.BalanceOfBatch([]std.Address{addr1, addr2, addr1}, []TokenID{tid1, tid1, tid2})\n\tuassert.NoError(t, err, \"should not result in error\")\n\t// Check token1's balance of addr1 after mint\n\tuassert.Equal(t, uint64(100), balanceBatch[0])\n\t// Check token1's balance of addr2 after mint\n\tuassert.Equal(t, uint64(50), balanceBatch[1])\n\t// Check token2's balance of addr1 after mint\n\tuassert.Equal(t, uint64(200), balanceBatch[2])\n}\n\nfunc TestSafeBatchMint(t *testing.T) {\n\tdummy := NewBasicGRC1155Token(dummyURI)\n\tuassert.True(t, dummy != nil, \"should not be nil\")\n\n\taddr1 := std.Address(\"g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm\")\n\taddr2 := std.Address(\"g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj\")\n\n\ttid1 := TokenID(\"1\")\n\ttid2 := TokenID(\"2\")\n\n\terr := dummy.SafeBatchMint(zeroAddress, []TokenID{tid1, tid2}, []uint64{100, 200})\n\tuassert.Error(t, err, \"should result in error\")\n\terr = dummy.SafeBatchMint(addr1, []TokenID{tid1, tid2}, []uint64{100, 200})\n\tuassert.NoError(t, err, \"should not result in error\")\n\terr = dummy.SafeBatchMint(addr2, []TokenID{tid1, tid2}, []uint64{300, 400})\n\tuassert.NoError(t, err, \"should not result in error\")\n\n\tbalanceBatch, err := dummy.BalanceOfBatch([]std.Address{addr1, addr2, addr1, addr2}, []TokenID{tid1, tid1, tid2, tid2})\n\tuassert.NoError(t, err, \"should not result in error\")\n\t// Check token1's balance of addr1 after batch mint\n\tuassert.Equal(t, uint64(100), balanceBatch[0])\n\t// Check token1's balance of addr2 after batch mint\n\tuassert.Equal(t, uint64(300), balanceBatch[1])\n\t// Check token2's balance of addr1 after batch mint\n\tuassert.Equal(t, uint64(200), balanceBatch[2])\n\t// Check token2's balance of addr2 after batch mint\n\tuassert.Equal(t, uint64(400), balanceBatch[3])\n}\n\nfunc TestBurn(t *testing.T) {\n\tdummy := NewBasicGRC1155Token(dummyURI)\n\tuassert.True(t, dummy != nil, \"should not be nil\")\n\n\taddr := std.Address(\"g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm\")\n\n\ttid1 := TokenID(\"1\")\n\ttid2 := TokenID(\"2\")\n\n\tdummy.mintBatch(addr, []TokenID{tid1, tid2}, []uint64{100, 200})\n\terr := dummy.Burn(zeroAddress, tid1, uint64(60))\n\tuassert.Error(t, err, \"should result in error\")\n\terr = dummy.Burn(addr, tid1, uint64(160))\n\tuassert.Error(t, err, \"should result in error\")\n\terr = dummy.Burn(addr, tid1, uint64(60))\n\tuassert.NoError(t, err, \"should not result in error\")\n\terr = dummy.Burn(addr, tid2, uint64(60))\n\tuassert.NoError(t, err, \"should not result in error\")\n\tbalanceBatch, err := dummy.BalanceOfBatch([]std.Address{addr, addr}, []TokenID{tid1, tid2})\n\tuassert.NoError(t, err, \"should not result in error\")\n\n\t// Check token1's balance of addr after burn\n\tuassert.Equal(t, uint64(40), balanceBatch[0])\n\t// Check token2's balance of addr after burn\n\tuassert.Equal(t, uint64(140), balanceBatch[1])\n}\n\nfunc TestBatchBurn(t *testing.T) {\n\tdummy := NewBasicGRC1155Token(dummyURI)\n\tuassert.True(t, dummy != nil, \"should not be nil\")\n\n\taddr := std.Address(\"g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm\")\n\n\ttid1 := TokenID(\"1\")\n\ttid2 := TokenID(\"2\")\n\n\tdummy.mintBatch(addr, []TokenID{tid1, tid2}, []uint64{100, 200})\n\terr := dummy.BatchBurn(zeroAddress, []TokenID{tid1, tid2}, []uint64{60, 60})\n\tuassert.Error(t, err, \"should result in error\")\n\terr = dummy.BatchBurn(addr, []TokenID{tid1, tid2}, []uint64{160, 60})\n\tuassert.Error(t, err, \"should result in error\")\n\terr = dummy.BatchBurn(addr, []TokenID{tid1, tid2}, []uint64{60, 60})\n\tuassert.NoError(t, err, \"should not result in error\")\n\tbalanceBatch, err := dummy.BalanceOfBatch([]std.Address{addr, addr}, []TokenID{tid1, tid2})\n\tuassert.NoError(t, err, \"should not result in error\")\n\n\t// Check token1's balance of addr after batch burn\n\tuassert.Equal(t, uint64(40), balanceBatch[0])\n\t// Check token2's balance of addr after batch burn\n\tuassert.Equal(t, uint64(140), balanceBatch[1])\n}\n"},{"name":"errors.gno","body":"package grc1155\n\nimport \"errors\"\n\nvar (\n\tErrInvalidAddress = errors.New(\"invalid address\")\n\tErrMismatchLength = errors.New(\"accounts and ids length mismatch\")\n\tErrCannotTransferToSelf = errors.New(\"cannot send transfer to self\")\n\tErrTransferToRejectedOrNonGRC1155Receiver = errors.New(\"transfer to rejected or non GRC1155Receiver implementer\")\n\tErrCallerIsNotOwnerOrApproved = errors.New(\"caller is not token owner or approved\")\n\tErrInsufficientBalance = errors.New(\"insufficient balance for transfer\")\n\tErrBurnAmountExceedsBalance = errors.New(\"burn amount exceeds balance\")\n)\n"},{"name":"igrc1155.gno","body":"package grc1155\n\nimport \"std\"\n\ntype IGRC1155 interface {\n\tSafeTransferFrom(from, to std.Address, tid TokenID, amount uint64) error\n\tSafeBatchTransferFrom(from, to std.Address, batch []TokenID, amounts []uint64) error\n\tBalanceOf(owner std.Address, tid TokenID) (uint64, error)\n\tBalanceOfBatch(owners []std.Address, batch []TokenID) ([]uint64, error)\n\tSetApprovalForAll(operator std.Address, approved bool) error\n\tIsApprovedForAll(owner, operator std.Address) bool\n}\n\ntype TokenID string\n\ntype TransferSingleEvent struct {\n\tOperator std.Address\n\tFrom std.Address\n\tTo std.Address\n\tTokenID TokenID\n\tAmount uint64\n}\n\ntype TransferBatchEvent struct {\n\tOperator std.Address\n\tFrom std.Address\n\tTo std.Address\n\tBatch []TokenID\n\tAmounts []uint64\n}\n\ntype ApprovalForAllEvent struct {\n\tOwner std.Address\n\tOperator std.Address\n\tApproved bool\n}\n\ntype UpdateURIEvent struct {\n\tURI string\n}\n"},{"name":"util.gno","body":"package grc1155\n\nimport (\n\t\"std\"\n)\n\nconst zeroAddress std.Address = \"\"\n\nfunc isValidAddress(addr std.Address) bool {\n\tif !addr.IsValid() {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc emit(event interface{}) {\n\t// TODO: setup a pubsub system here?\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"grc20","path":"gno.land/p/demo/grc/grc20","files":[{"name":"banker.gno","body":"package grc20\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\n// Banker implements a token banker with admin privileges.\n//\n// The Banker is intended to be used in two main ways:\n// 1. as a temporary object used to make the initial minting, then deleted.\n// 2. preserved in an unexported variable to support conditional administrative\n// tasks protected by the contract.\ntype Banker struct {\n\tname string\n\tsymbol string\n\tdecimals uint\n\ttotalSupply uint64\n\tbalances avl.Tree // std.Address(owner) -\u003e uint64\n\tallowances avl.Tree // string(owner+\":\"+spender) -\u003e uint64\n\ttoken *token // to share the same pointer\n}\n\nfunc NewBanker(name, symbol string, decimals uint) *Banker {\n\tif name == \"\" {\n\t\tpanic(\"name should not be empty\")\n\t}\n\tif symbol == \"\" {\n\t\tpanic(\"symbol should not be empty\")\n\t}\n\t// XXX additional checks (length, characters, limits, etc)\n\n\tb := Banker{\n\t\tname: name,\n\t\tsymbol: symbol,\n\t\tdecimals: decimals,\n\t}\n\tt := \u0026token{banker: \u0026b}\n\tb.token = t\n\treturn \u0026b\n}\n\nfunc (b Banker) Token() Token { return b.token } // Token returns a grc20 safe-object implementation.\nfunc (b Banker) GetName() string { return b.name }\nfunc (b Banker) GetSymbol() string { return b.symbol }\nfunc (b Banker) GetDecimals() uint { return b.decimals }\nfunc (b Banker) TotalSupply() uint64 { return b.totalSupply }\nfunc (b Banker) KnownAccounts() int { return b.balances.Size() }\n\nfunc (b *Banker) Mint(address std.Address, amount uint64) error {\n\tif !address.IsValid() {\n\t\treturn ErrInvalidAddress\n\t}\n\n\t// TODO: check for overflow\n\n\tb.totalSupply += amount\n\tcurrentBalance := b.BalanceOf(address)\n\tnewBalance := currentBalance + amount\n\n\tb.balances.Set(string(address), newBalance)\n\n\tstd.Emit(\n\t\tTransferEvent,\n\t\t\"from\", \"\",\n\t\t\"to\", string(address),\n\t\t\"value\", strconv.Itoa(int(amount)),\n\t)\n\n\treturn nil\n}\n\nfunc (b *Banker) Burn(address std.Address, amount uint64) error {\n\tif !address.IsValid() {\n\t\treturn ErrInvalidAddress\n\t}\n\t// TODO: check for overflow\n\n\tcurrentBalance := b.BalanceOf(address)\n\tif currentBalance \u003c amount {\n\t\treturn ErrInsufficientBalance\n\t}\n\n\tb.totalSupply -= amount\n\tnewBalance := currentBalance - amount\n\n\tb.balances.Set(string(address), newBalance)\n\n\tstd.Emit(\n\t\tTransferEvent,\n\t\t\"from\", string(address),\n\t\t\"to\", \"\",\n\t\t\"value\", strconv.Itoa(int(amount)),\n\t)\n\n\treturn nil\n}\n\nfunc (b Banker) BalanceOf(address std.Address) uint64 {\n\tbalance, found := b.balances.Get(address.String())\n\tif !found {\n\t\treturn 0\n\t}\n\treturn balance.(uint64)\n}\n\nfunc (b *Banker) SpendAllowance(owner, spender std.Address, amount uint64) error {\n\tif !owner.IsValid() {\n\t\treturn ErrInvalidAddress\n\t}\n\tif !spender.IsValid() {\n\t\treturn ErrInvalidAddress\n\t}\n\n\tcurrentAllowance := b.Allowance(owner, spender)\n\tif currentAllowance \u003c amount {\n\t\treturn ErrInsufficientAllowance\n\t}\n\n\tkey := allowanceKey(owner, spender)\n\tnewAllowance := currentAllowance - amount\n\n\tif newAllowance == 0 {\n\t\tb.allowances.Remove(key)\n\t} else {\n\t\tb.allowances.Set(key, newAllowance)\n\t}\n\n\treturn nil\n}\n\nfunc (b *Banker) Transfer(from, to std.Address, amount uint64) error {\n\tif !from.IsValid() {\n\t\treturn ErrInvalidAddress\n\t}\n\tif !to.IsValid() {\n\t\treturn ErrInvalidAddress\n\t}\n\tif from == to {\n\t\treturn ErrCannotTransferToSelf\n\t}\n\n\ttoBalance := b.BalanceOf(to)\n\tfromBalance := b.BalanceOf(from)\n\n\t// debug.\n\t// println(\"from\", from, \"to\", to, \"amount\", amount, \"fromBalance\", fromBalance, \"toBalance\", toBalance)\n\n\tif fromBalance \u003c amount {\n\t\treturn ErrInsufficientBalance\n\t}\n\n\tnewToBalance := toBalance + amount\n\tnewFromBalance := fromBalance - amount\n\n\tb.balances.Set(string(to), newToBalance)\n\tb.balances.Set(string(from), newFromBalance)\n\n\tstd.Emit(\n\t\tTransferEvent,\n\t\t\"from\", from.String(),\n\t\t\"to\", to.String(),\n\t\t\"value\", strconv.Itoa(int(amount)),\n\t)\n\treturn nil\n}\n\nfunc (b *Banker) TransferFrom(spender, from, to std.Address, amount uint64) error {\n\tif err := b.SpendAllowance(from, spender, amount); err != nil {\n\t\treturn err\n\t}\n\treturn b.Transfer(from, to, amount)\n}\n\nfunc (b *Banker) Allowance(owner, spender std.Address) uint64 {\n\tallowance, found := b.allowances.Get(allowanceKey(owner, spender))\n\tif !found {\n\t\treturn 0\n\t}\n\treturn allowance.(uint64)\n}\n\nfunc (b *Banker) Approve(owner, spender std.Address, amount uint64) error {\n\tif !owner.IsValid() {\n\t\treturn ErrInvalidAddress\n\t}\n\tif !spender.IsValid() {\n\t\treturn ErrInvalidAddress\n\t}\n\n\tb.allowances.Set(allowanceKey(owner, spender), amount)\n\n\tstd.Emit(\n\t\tApprovalEvent,\n\t\t\"owner\", string(owner),\n\t\t\"spender\", string(spender),\n\t\t\"value\", strconv.Itoa(int(amount)),\n\t)\n\n\treturn nil\n}\n\nfunc (b *Banker) RenderHome() string {\n\tstr := \"\"\n\tstr += ufmt.Sprintf(\"# %s ($%s)\\n\\n\", b.name, b.symbol)\n\tstr += ufmt.Sprintf(\"* **Decimals**: %d\\n\", b.decimals)\n\tstr += ufmt.Sprintf(\"* **Total supply**: %d\\n\", b.totalSupply)\n\tstr += ufmt.Sprintf(\"* **Known accounts**: %d\\n\", b.KnownAccounts())\n\treturn str\n}\n\nfunc allowanceKey(owner, spender std.Address) string {\n\treturn owner.String() + \":\" + spender.String()\n}\n"},{"name":"banker_test.gno","body":"package grc20\n\nimport (\n\t\"testing\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/p/demo/ufmt\"\n\t\"gno.land/p/demo/urequire\"\n)\n\nfunc TestBankerImpl(t *testing.T) {\n\tdummy := NewBanker(\"Dummy\", \"DUMMY\", 4)\n\turequire.False(t, dummy == nil, \"dummy should not be nil\")\n}\n\nfunc TestAllowance(t *testing.T) {\n\tvar (\n\t\towner = testutils.TestAddress(\"owner\")\n\t\tspender = testutils.TestAddress(\"spender\")\n\t\tdest = testutils.TestAddress(\"dest\")\n\t)\n\n\tb := NewBanker(\"Dummy\", \"DUMMY\", 6)\n\turequire.NoError(t, b.Mint(owner, 100000000))\n\turequire.NoError(t, b.Approve(owner, spender, 5000000))\n\turequire.Error(t, b.TransferFrom(spender, owner, dest, 10000000), ErrInsufficientAllowance.Error(), \"should not be able to transfer more than approved\")\n\n\ttests := []struct {\n\t\tspend uint64\n\t\texp uint64\n\t}{\n\t\t{3, 4999997},\n\t\t{999997, 4000000},\n\t\t{4000000, 0},\n\t}\n\n\tfor _, tt := range tests {\n\t\tb0 := b.BalanceOf(dest)\n\t\turequire.NoError(t, b.TransferFrom(spender, owner, dest, tt.spend))\n\t\ta := b.Allowance(owner, spender)\n\t\turequire.Equal(t, a, tt.exp, ufmt.Sprintf(\"allowance exp: %d, got %d\", tt.exp, a))\n\t\tb := b.BalanceOf(dest)\n\t\texpB := b0 + tt.spend\n\t\turequire.Equal(t, b, expB, ufmt.Sprintf(\"balance exp: %d, got %d\", expB, b))\n\t}\n\n\turequire.Error(t, b.TransferFrom(spender, owner, dest, 1), \"no allowance\")\n\tkey := allowanceKey(owner, spender)\n\turequire.False(t, b.allowances.Has(key), \"allowance should be removed\")\n\turequire.Equal(t, b.Allowance(owner, spender), uint64(0), \"allowance should be 0\")\n}\n"},{"name":"token.gno","body":"package grc20\n\nimport (\n\t\"std\"\n)\n\n// token implements the Token interface.\n//\n// It is generated with Banker.Token().\n// It can safely be exposed publicly.\ntype token struct {\n\tbanker *Banker\n}\n\n// var _ Token = (*token)(nil)\nfunc (t *token) GetName() string { return t.banker.name }\nfunc (t *token) GetSymbol() string { return t.banker.symbol }\nfunc (t *token) GetDecimals() uint { return t.banker.decimals }\nfunc (t *token) TotalSupply() uint64 { return t.banker.totalSupply }\n\nfunc (t *token) BalanceOf(owner std.Address) uint64 {\n\treturn t.banker.BalanceOf(owner)\n}\n\nfunc (t *token) Transfer(to std.Address, amount uint64) error {\n\tcaller := std.PrevRealm().Addr()\n\treturn t.banker.Transfer(caller, to, amount)\n}\n\nfunc (t *token) Allowance(owner, spender std.Address) uint64 {\n\treturn t.banker.Allowance(owner, spender)\n}\n\nfunc (t *token) Approve(spender std.Address, amount uint64) error {\n\tcaller := std.PrevRealm().Addr()\n\treturn t.banker.Approve(caller, spender, amount)\n}\n\nfunc (t *token) TransferFrom(from, to std.Address, amount uint64) error {\n\tspender := std.PrevRealm().Addr()\n\tif err := t.banker.SpendAllowance(from, spender, amount); err != nil {\n\t\treturn err\n\t}\n\treturn t.banker.Transfer(from, to, amount)\n}\n"},{"name":"token_test.gno","body":"package grc20\n\nimport (\n\t\"std\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/p/demo/ufmt\"\n\t\"gno.land/p/demo/urequire\"\n)\n\nfunc TestUserTokenImpl(t *testing.T) {\n\tbank := NewBanker(\"Dummy\", \"DUMMY\", 4)\n\ttok := bank.Token()\n\t_ = tok\n}\n\nfunc TestUserApprove(t *testing.T) {\n\towner := testutils.TestAddress(\"owner\")\n\tspender := testutils.TestAddress(\"spender\")\n\tdest := testutils.TestAddress(\"dest\")\n\n\tbank := NewBanker(\"Dummy\", \"DUMMY\", 6)\n\ttok := bank.Token()\n\n\t// Set owner as the original caller\n\tstd.TestSetOrigCaller(owner)\n\t// Mint 100000000 tokens for owner\n\turequire.NoError(t, bank.Mint(owner, 100000000))\n\n\t// Approve spender to spend 5000000 tokens\n\turequire.NoError(t, tok.Approve(spender, 5000000))\n\n\t// Set spender as the original caller\n\tstd.TestSetOrigCaller(spender)\n\t// Try to transfer 10000000 tokens from owner to dest, should fail because it exceeds allowance\n\turequire.Error(t,\n\t\ttok.TransferFrom(owner, dest, 10000000),\n\t\tErrInsufficientAllowance.Error(),\n\t\t\"should not be able to transfer more than approved\",\n\t)\n\n\t// Define a set of test data with spend amount and expected remaining allowance\n\ttests := []struct {\n\t\tspend uint64 // Spend amount\n\t\texp uint64 // Remaining allowance\n\t}{\n\t\t{3, 4999997},\n\t\t{999997, 4000000},\n\t\t{4000000, 0},\n\t}\n\n\t// perform transfer operation,and check if allowance and balance are correct\n\tfor _, tt := range tests {\n\t\tb0 := tok.BalanceOf(dest)\n\t\t// Perform transfer from owner to dest\n\t\turequire.NoError(t, tok.TransferFrom(owner, dest, tt.spend))\n\t\ta := tok.Allowance(owner, spender)\n\t\t// Check if allowance equals expected value\n\t\turequire.True(t, a == tt.exp, ufmt.Sprintf(\"allowance exp: %d,got %d\", tt.exp, a))\n\n\t\t// Get dest current balance\n\t\tb := tok.BalanceOf(dest)\n\t\t// Calculate expected balance ,should be initial balance plus transfer amount\n\t\texpB := b0 + tt.spend\n\t\t// Check if balance equals expected value\n\t\turequire.True(t, b == expB, ufmt.Sprintf(\"balance exp: %d,got %d\", expB, b))\n\t}\n\n\t// Try to transfer one token from owner to dest ,should fail because no allowance left\n\turequire.Error(t, tok.TransferFrom(owner, dest, 1), ErrInsufficientAllowance.Error(), \"no allowance\")\n}\n"},{"name":"types.gno","body":"package grc20\n\nimport (\n\t\"errors\"\n\t\"std\"\n\n\t\"gno.land/p/demo/grc/exts\"\n)\n\nvar (\n\tErrInsufficientBalance = errors.New(\"insufficient balance\")\n\tErrInsufficientAllowance = errors.New(\"insufficient allowance\")\n\tErrInvalidAddress = errors.New(\"invalid address\")\n\tErrCannotTransferToSelf = errors.New(\"cannot send transfer to self\")\n)\n\ntype Token interface {\n\texts.TokenMetadata\n\n\t// Returns the amount of tokens in existence.\n\tTotalSupply() uint64\n\n\t// Returns the amount of tokens owned by `account`.\n\tBalanceOf(account std.Address) uint64\n\n\t// Moves `amount` tokens from the caller's account to `to`.\n\t//\n\t// Returns an error if the operation failed.\n\tTransfer(to std.Address, amount uint64) error\n\n\t// Returns the remaining number of tokens that `spender` will be\n\t// allowed to spend on behalf of `owner` through {transferFrom}. This is\n\t// zero by default.\n\t//\n\t// This value changes when {approve} or {transferFrom} are called.\n\tAllowance(owner, spender std.Address) uint64\n\n\t// Sets `amount` as the allowance of `spender` over the caller's tokens.\n\t//\n\t// Returns an error if the operation failed.\n\t//\n\t// IMPORTANT: Beware that changing an allowance with this method brings the risk\n\t// that someone may use both the old and the new allowance by unfortunate\n\t// transaction ordering. One possible solution to mitigate this race\n\t// condition is to first reduce the spender's allowance to 0 and set the\n\t// desired value afterwards:\n\t// https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n\tApprove(spender std.Address, amount uint64) error\n\n\t// Moves `amount` tokens from `from` to `to` using the\n\t// allowance mechanism. `amount` is then deducted from the caller's\n\t// allowance.\n\t//\n\t// Returns an error if the operation failed.\n\tTransferFrom(from, to std.Address, amount uint64) error\n}\n\nconst (\n\tTransferEvent = \"Transfer\"\n\tApprovalEvent = \"Approval\"\n)\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"grc721","path":"gno.land/p/demo/grc/grc721","files":[{"name":"basic_nft.gno","body":"package grc721\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\ntype basicNFT struct {\n\tname string\n\tsymbol string\n\towners avl.Tree // tokenId -\u003e OwnerAddress\n\tbalances avl.Tree // OwnerAddress -\u003e TokenCount\n\ttokenApprovals avl.Tree // TokenId -\u003e ApprovedAddress\n\ttokenURIs avl.Tree // TokenId -\u003e URIs\n\toperatorApprovals avl.Tree // \"OwnerAddress:OperatorAddress\" -\u003e bool\n}\n\n// Returns new basic NFT\nfunc NewBasicNFT(name string, symbol string) *basicNFT {\n\treturn \u0026basicNFT{\n\t\tname: name,\n\t\tsymbol: symbol,\n\n\t\towners: avl.Tree{},\n\t\tbalances: avl.Tree{},\n\t\ttokenApprovals: avl.Tree{},\n\t\ttokenURIs: avl.Tree{},\n\t\toperatorApprovals: avl.Tree{},\n\t}\n}\n\nfunc (s *basicNFT) Name() string { return s.name }\nfunc (s *basicNFT) Symbol() string { return s.symbol }\nfunc (s *basicNFT) TokenCount() uint64 { return uint64(s.owners.Size()) }\n\n// BalanceOf returns balance of input address\nfunc (s *basicNFT) BalanceOf(addr std.Address) (uint64, error) {\n\tif err := isValidAddress(addr); err != nil {\n\t\treturn 0, err\n\t}\n\n\tbalance, found := s.balances.Get(addr.String())\n\tif !found {\n\t\treturn 0, nil\n\t}\n\n\treturn balance.(uint64), nil\n}\n\n// OwnerOf returns owner of input token id\nfunc (s *basicNFT) OwnerOf(tid TokenID) (std.Address, error) {\n\towner, found := s.owners.Get(string(tid))\n\tif !found {\n\t\treturn \"\", ErrInvalidTokenId\n\t}\n\n\treturn owner.(std.Address), nil\n}\n\n// TokenURI returns the URI of input token id\nfunc (s *basicNFT) TokenURI(tid TokenID) (string, error) {\n\turi, found := s.tokenURIs.Get(string(tid))\n\tif !found {\n\t\treturn \"\", ErrInvalidTokenId\n\t}\n\n\treturn uri.(string), nil\n}\n\nfunc (s *basicNFT) SetTokenURI(tid TokenID, tURI TokenURI) (bool, error) {\n\t// check for invalid TokenID\n\tif !s.exists(tid) {\n\t\treturn false, ErrInvalidTokenId\n\t}\n\n\t// check for the right owner\n\towner, err := s.OwnerOf(tid)\n\tif err != nil {\n\t\treturn false, err\n\t}\n\tcaller := std.PrevRealm().Addr()\n\tif caller != owner {\n\t\treturn false, ErrCallerIsNotOwner\n\t}\n\ts.tokenURIs.Set(string(tid), string(tURI))\n\treturn true, nil\n}\n\n// IsApprovedForAll returns true if operator is approved for all by the owner.\n// Otherwise, returns false\nfunc (s *basicNFT) IsApprovedForAll(owner, operator std.Address) bool {\n\tkey := owner.String() + \":\" + operator.String()\n\t_, found := s.operatorApprovals.Get(key)\n\tif !found {\n\t\treturn false\n\t}\n\n\treturn true\n}\n\n// Approve approves the input address for particular token\nfunc (s *basicNFT) Approve(to std.Address, tid TokenID) error {\n\tif err := isValidAddress(to); err != nil {\n\t\treturn err\n\t}\n\n\towner, err := s.OwnerOf(tid)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif owner == to {\n\t\treturn ErrApprovalToCurrentOwner\n\t}\n\n\tcaller := std.PrevRealm().Addr()\n\tif caller != owner \u0026\u0026 !s.IsApprovedForAll(owner, caller) {\n\t\treturn ErrCallerIsNotOwnerOrApproved\n\t}\n\n\ts.tokenApprovals.Set(string(tid), to.String())\n\tevent := ApprovalEvent{owner, to, tid}\n\temit(\u0026event)\n\n\treturn nil\n}\n\n// GetApproved return the approved address for token\nfunc (s *basicNFT) GetApproved(tid TokenID) (std.Address, error) {\n\taddr, found := s.tokenApprovals.Get(string(tid))\n\tif !found {\n\t\treturn zeroAddress, ErrTokenIdNotHasApproved\n\t}\n\n\treturn std.Address(addr.(string)), nil\n}\n\n// SetApprovalForAll can approve the operator to operate on all tokens\nfunc (s *basicNFT) SetApprovalForAll(operator std.Address, approved bool) error {\n\tif err := isValidAddress(operator); err != nil {\n\t\treturn ErrInvalidAddress\n\t}\n\n\tcaller := std.PrevRealm().Addr()\n\treturn s.setApprovalForAll(caller, operator, approved)\n}\n\n// Safely transfers `tokenId` token from `from` to `to`, checking that\n// contract recipients are aware of the GRC721 protocol to prevent\n// tokens from being forever locked.\nfunc (s *basicNFT) SafeTransferFrom(from, to std.Address, tid TokenID) error {\n\tcaller := std.PrevRealm().Addr()\n\tif !s.isApprovedOrOwner(caller, tid) {\n\t\treturn ErrCallerIsNotOwnerOrApproved\n\t}\n\n\terr := s.transfer(from, to, tid)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif !s.checkOnGRC721Received(from, to, tid) {\n\t\treturn ErrTransferToNonGRC721Receiver\n\t}\n\n\treturn nil\n}\n\n// Transfers `tokenId` token from `from` to `to`.\nfunc (s *basicNFT) TransferFrom(from, to std.Address, tid TokenID) error {\n\tcaller := std.PrevRealm().Addr()\n\tif !s.isApprovedOrOwner(caller, tid) {\n\t\treturn ErrCallerIsNotOwnerOrApproved\n\t}\n\n\terr := s.transfer(from, to, tid)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// Mints `tokenId` and transfers it to `to`.\nfunc (s *basicNFT) Mint(to std.Address, tid TokenID) error {\n\treturn s.mint(to, tid)\n}\n\n// Mints `tokenId` and transfers it to `to`. Also checks that\n// contract recipients are using GRC721 protocol\nfunc (s *basicNFT) SafeMint(to std.Address, tid TokenID) error {\n\terr := s.mint(to, tid)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif !s.checkOnGRC721Received(zeroAddress, to, tid) {\n\t\treturn ErrTransferToNonGRC721Receiver\n\t}\n\n\treturn nil\n}\n\nfunc (s *basicNFT) Burn(tid TokenID) error {\n\towner, err := s.OwnerOf(tid)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\ts.beforeTokenTransfer(owner, zeroAddress, tid, 1)\n\n\ts.tokenApprovals.Remove(string(tid))\n\tbalance, err := s.BalanceOf(owner)\n\tif err != nil {\n\t\treturn err\n\t}\n\tbalance -= 1\n\ts.balances.Set(owner.String(), balance)\n\ts.owners.Remove(string(tid))\n\n\tevent := TransferEvent{owner, zeroAddress, tid}\n\temit(\u0026event)\n\n\ts.afterTokenTransfer(owner, zeroAddress, tid, 1)\n\n\treturn nil\n}\n\n/* Helper methods */\n\n// Helper for SetApprovalForAll()\nfunc (s *basicNFT) setApprovalForAll(owner, operator std.Address, approved bool) error {\n\tif owner == operator {\n\t\treturn ErrApprovalToCurrentOwner\n\t}\n\n\tkey := owner.String() + \":\" + operator.String()\n\ts.operatorApprovals.Set(key, approved)\n\n\tevent := ApprovalForAllEvent{owner, operator, approved}\n\temit(\u0026event)\n\n\treturn nil\n}\n\n// Helper for TransferFrom() and SafeTransferFrom()\nfunc (s *basicNFT) transfer(from, to std.Address, tid TokenID) error {\n\tif err := isValidAddress(from); err != nil {\n\t\treturn ErrInvalidAddress\n\t}\n\tif err := isValidAddress(to); err != nil {\n\t\treturn ErrInvalidAddress\n\t}\n\n\tif from == to {\n\t\treturn ErrCannotTransferToSelf\n\t}\n\n\towner, err := s.OwnerOf(tid)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif owner != from {\n\t\treturn ErrTransferFromIncorrectOwner\n\t}\n\n\ts.beforeTokenTransfer(from, to, tid, 1)\n\n\t// Check that tokenId was not transferred by `beforeTokenTransfer`\n\towner, err = s.OwnerOf(tid)\n\tif err != nil {\n\t\treturn err\n\t}\n\tif owner != from {\n\t\treturn ErrTransferFromIncorrectOwner\n\t}\n\n\ts.tokenApprovals.Remove(string(tid))\n\tfromBalance, err := s.BalanceOf(from)\n\tif err != nil {\n\t\treturn err\n\t}\n\ttoBalance, err := s.BalanceOf(to)\n\tif err != nil {\n\t\treturn err\n\t}\n\tfromBalance -= 1\n\ttoBalance += 1\n\ts.balances.Set(from.String(), fromBalance)\n\ts.balances.Set(to.String(), toBalance)\n\ts.owners.Set(string(tid), to)\n\n\tevent := TransferEvent{from, to, tid}\n\temit(\u0026event)\n\n\ts.afterTokenTransfer(from, to, tid, 1)\n\n\treturn nil\n}\n\n// Helper for Mint() and SafeMint()\nfunc (s *basicNFT) mint(to std.Address, tid TokenID) error {\n\tif err := isValidAddress(to); err != nil {\n\t\treturn err\n\t}\n\n\tif s.exists(tid) {\n\t\treturn ErrTokenIdAlreadyExists\n\t}\n\n\ts.beforeTokenTransfer(zeroAddress, to, tid, 1)\n\n\t// Check that tokenId was not minted by `beforeTokenTransfer`\n\tif s.exists(tid) {\n\t\treturn ErrTokenIdAlreadyExists\n\t}\n\n\ttoBalance, err := s.BalanceOf(to)\n\tif err != nil {\n\t\treturn err\n\t}\n\ttoBalance += 1\n\ts.balances.Set(to.String(), toBalance)\n\ts.owners.Set(string(tid), to)\n\n\tevent := TransferEvent{zeroAddress, to, tid}\n\temit(\u0026event)\n\n\ts.afterTokenTransfer(zeroAddress, to, tid, 1)\n\n\treturn nil\n}\n\nfunc (s *basicNFT) isApprovedOrOwner(addr std.Address, tid TokenID) bool {\n\towner, found := s.owners.Get(string(tid))\n\tif !found {\n\t\treturn false\n\t}\n\n\tif addr == owner.(std.Address) || s.IsApprovedForAll(owner.(std.Address), addr) {\n\t\treturn true\n\t}\n\n\t_, err := s.GetApproved(tid)\n\tif err != nil {\n\t\treturn false\n\t}\n\n\treturn true\n}\n\n// Checks if token id already exists\nfunc (s *basicNFT) exists(tid TokenID) bool {\n\t_, found := s.owners.Get(string(tid))\n\treturn found\n}\n\nfunc (s *basicNFT) beforeTokenTransfer(from, to std.Address, firstTokenId TokenID, batchSize uint64) {\n\t// TODO: Implementation\n}\n\nfunc (s *basicNFT) afterTokenTransfer(from, to std.Address, firstTokenId TokenID, batchSize uint64) {\n\t// TODO: Implementation\n}\n\nfunc (s *basicNFT) checkOnGRC721Received(from, to std.Address, tid TokenID) bool {\n\t// TODO: Implementation\n\treturn true\n}\n\nfunc (s *basicNFT) RenderHome() (str string) {\n\tstr += ufmt.Sprintf(\"# %s ($%s)\\n\\n\", s.name, s.symbol)\n\tstr += ufmt.Sprintf(\"* **Total supply**: %d\\n\", s.TokenCount())\n\tstr += ufmt.Sprintf(\"* **Known accounts**: %d\\n\", s.balances.Size())\n\n\treturn\n}\n"},{"name":"basic_nft_test.gno","body":"package grc721\n\nimport (\n\t\"std\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/uassert\"\n)\n\nvar (\n\tdummyNFTName = \"DummyNFT\"\n\tdummyNFTSymbol = \"DNFT\"\n)\n\nfunc TestNewBasicNFT(t *testing.T) {\n\tdummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol)\n\tuassert.True(t, dummy != nil, \"should not be nil\")\n}\n\nfunc TestName(t *testing.T) {\n\tdummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol)\n\tuassert.True(t, dummy != nil, \"should not be nil\")\n\n\tname := dummy.Name()\n\tuassert.Equal(t, dummyNFTName, name)\n}\n\nfunc TestSymbol(t *testing.T) {\n\tdummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol)\n\tuassert.True(t, dummy != nil, \"should not be nil\")\n\n\tsymbol := dummy.Symbol()\n\tuassert.Equal(t, dummyNFTSymbol, symbol)\n}\n\nfunc TestTokenCount(t *testing.T) {\n\tdummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol)\n\tuassert.True(t, dummy != nil, \"should not be nil\")\n\n\tcount := dummy.TokenCount()\n\tuassert.Equal(t, uint64(0), count)\n\n\tdummy.mint(\"g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm\", TokenID(\"1\"))\n\tdummy.mint(\"g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm\", TokenID(\"2\"))\n\n\tcount = dummy.TokenCount()\n\tuassert.Equal(t, uint64(2), count)\n}\n\nfunc TestBalanceOf(t *testing.T) {\n\tdummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol)\n\tuassert.True(t, dummy != nil, \"should not be nil\")\n\n\taddr1 := std.Address(\"g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm\")\n\taddr2 := std.Address(\"g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj\")\n\n\tbalanceAddr1, err := dummy.BalanceOf(addr1)\n\tuassert.NoError(t, err, \"should not result in error\")\n\tuassert.Equal(t, uint64(0), balanceAddr1)\n\n\tdummy.mint(addr1, TokenID(\"1\"))\n\tdummy.mint(addr1, TokenID(\"2\"))\n\tdummy.mint(addr2, TokenID(\"3\"))\n\n\tbalanceAddr1, err = dummy.BalanceOf(addr1)\n\tuassert.NoError(t, err, \"should not result in error\")\n\n\tbalanceAddr2, err := dummy.BalanceOf(addr2)\n\tuassert.NoError(t, err, \"should not result in error\")\n\n\tuassert.Equal(t, uint64(2), balanceAddr1)\n\tuassert.Equal(t, uint64(1), balanceAddr2)\n}\n\nfunc TestOwnerOf(t *testing.T) {\n\tdummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol)\n\tuassert.True(t, dummy != nil, \"should not be nil\")\n\n\taddr1 := std.Address(\"g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm\")\n\taddr2 := std.Address(\"g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj\")\n\n\towner, err := dummy.OwnerOf(TokenID(\"invalid\"))\n\tuassert.Error(t, err, \"should not result in error\")\n\n\tdummy.mint(addr1, TokenID(\"1\"))\n\tdummy.mint(addr2, TokenID(\"2\"))\n\n\t// Checking for token id \"1\"\n\towner, err = dummy.OwnerOf(TokenID(\"1\"))\n\tuassert.NoError(t, err, \"should not result in error\")\n\tuassert.Equal(t, addr1.String(), owner.String())\n\n\t// Checking for token id \"2\"\n\towner, err = dummy.OwnerOf(TokenID(\"2\"))\n\tuassert.NoError(t, err, \"should not result in error\")\n\tuassert.Equal(t, addr2.String(), owner.String())\n}\n\nfunc TestIsApprovedForAll(t *testing.T) {\n\tdummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol)\n\tuassert.True(t, dummy != nil, \"should not be nil\")\n\n\taddr1 := std.Address(\"g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm\")\n\taddr2 := std.Address(\"g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj\")\n\n\tisApprovedForAll := dummy.IsApprovedForAll(addr1, addr2)\n\tuassert.False(t, isApprovedForAll)\n}\n\nfunc TestSetApprovalForAll(t *testing.T) {\n\tdummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol)\n\tuassert.True(t, dummy != nil, \"should not be nil\")\n\n\tcaller := std.PrevRealm().Addr()\n\taddr := std.Address(\"g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm\")\n\n\tisApprovedForAll := dummy.IsApprovedForAll(caller, addr)\n\tuassert.False(t, isApprovedForAll)\n\n\terr := dummy.SetApprovalForAll(addr, true)\n\tuassert.NoError(t, err, \"should not result in error\")\n\n\tisApprovedForAll = dummy.IsApprovedForAll(caller, addr)\n\tuassert.True(t, isApprovedForAll)\n}\n\nfunc TestGetApproved(t *testing.T) {\n\tdummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol)\n\tuassert.True(t, dummy != nil, \"should not be nil\")\n\n\tapprovedAddr, err := dummy.GetApproved(TokenID(\"invalid\"))\n\tuassert.Error(t, err, \"should result in error\")\n}\n\nfunc TestApprove(t *testing.T) {\n\tdummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol)\n\tuassert.True(t, dummy != nil, \"should not be nil\")\n\n\tcaller := std.PrevRealm().Addr()\n\taddr := std.Address(\"g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm\")\n\n\tdummy.mint(caller, TokenID(\"1\"))\n\n\t_, err := dummy.GetApproved(TokenID(\"1\"))\n\tuassert.Error(t, err, \"should result in error\")\n\n\terr = dummy.Approve(addr, TokenID(\"1\"))\n\tuassert.NoError(t, err, \"should not result in error\")\n\n\tapprovedAddr, err := dummy.GetApproved(TokenID(\"1\"))\n\tuassert.NoError(t, err, \"should result in error\")\n\tuassert.Equal(t, addr.String(), approvedAddr.String())\n}\n\nfunc TestTransferFrom(t *testing.T) {\n\tdummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol)\n\tuassert.True(t, dummy != nil, \"should not be nil\")\n\n\tcaller := std.PrevRealm().Addr()\n\taddr := std.Address(\"g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm\")\n\n\tdummy.mint(caller, TokenID(\"1\"))\n\tdummy.mint(caller, TokenID(\"2\"))\n\n\terr := dummy.TransferFrom(caller, addr, TokenID(\"1\"))\n\tuassert.NoError(t, err, \"should result in error\")\n\n\t// Check balance of caller after transfer\n\tbalanceOfCaller, err := dummy.BalanceOf(caller)\n\tuassert.NoError(t, err, \"should result in error\")\n\tuassert.Equal(t, uint64(1), balanceOfCaller)\n\n\t// Check balance of addr after transfer\n\tbalanceOfAddr, err := dummy.BalanceOf(addr)\n\tuassert.NoError(t, err, \"should not result in error\")\n\tuassert.Equal(t, uint64(1), balanceOfAddr)\n\n\t// Check Owner of transferred Token id\n\towner, err := dummy.OwnerOf(TokenID(\"1\"))\n\tuassert.NoError(t, err, \"should result in error\")\n\tuassert.Equal(t, addr.String(), owner.String())\n}\n\nfunc TestSafeTransferFrom(t *testing.T) {\n\tdummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol)\n\tuassert.True(t, dummy != nil, \"should not be nil\")\n\n\tcaller := std.PrevRealm().Addr()\n\taddr := std.Address(\"g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm\")\n\n\tdummy.mint(caller, TokenID(\"1\"))\n\tdummy.mint(caller, TokenID(\"2\"))\n\n\terr := dummy.SafeTransferFrom(caller, addr, TokenID(\"1\"))\n\tuassert.NoError(t, err, \"should not result in error\")\n\n\t// Check balance of caller after transfer\n\tbalanceOfCaller, err := dummy.BalanceOf(caller)\n\tuassert.NoError(t, err, \"should not result in error\")\n\tuassert.Equal(t, uint64(1), balanceOfCaller)\n\n\t// Check balance of addr after transfer\n\tbalanceOfAddr, err := dummy.BalanceOf(addr)\n\tuassert.NoError(t, err, \"should not result in error\")\n\tuassert.Equal(t, uint64(1), balanceOfAddr)\n\n\t// Check Owner of transferred Token id\n\towner, err := dummy.OwnerOf(TokenID(\"1\"))\n\tuassert.NoError(t, err, \"should not result in error\")\n\tuassert.Equal(t, addr.String(), owner.String())\n}\n\nfunc TestMint(t *testing.T) {\n\tdummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol)\n\tuassert.True(t, dummy != nil, \"should not be nil\")\n\n\taddr1 := std.Address(\"g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm\")\n\taddr2 := std.Address(\"g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj\")\n\n\terr := dummy.Mint(addr1, TokenID(\"1\"))\n\tuassert.NoError(t, err, \"should not result in error\")\n\terr = dummy.Mint(addr1, TokenID(\"2\"))\n\tuassert.NoError(t, err, \"should not result in error\")\n\terr = dummy.Mint(addr2, TokenID(\"3\"))\n\tuassert.NoError(t, err, \"should not result in error\")\n\n\t// Try minting duplicate token id\n\terr = dummy.Mint(addr2, TokenID(\"1\"))\n\tuassert.Error(t, err, \"should not result in error\")\n\n\t// Check Owner of Token id\n\towner, err := dummy.OwnerOf(TokenID(\"1\"))\n\tuassert.NoError(t, err, \"should not result in error\")\n\tuassert.Equal(t, addr1.String(), owner.String())\n}\n\nfunc TestBurn(t *testing.T) {\n\tdummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol)\n\tuassert.True(t, dummy != nil, \"should not be nil\")\n\n\taddr := std.Address(\"g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm\")\n\n\tdummy.mint(addr, TokenID(\"1\"))\n\tdummy.mint(addr, TokenID(\"2\"))\n\n\terr := dummy.Burn(TokenID(\"1\"))\n\tuassert.NoError(t, err, \"should not result in error\")\n\n\t// Check Owner of Token id\n\towner, err := dummy.OwnerOf(TokenID(\"1\"))\n\tuassert.Error(t, err, \"should result in error\")\n}\n\nfunc TestSetTokenURI(t *testing.T) {\n\tdummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol)\n\tuassert.True(t, dummy != nil, \"should not be nil\")\n\n\taddr1 := std.Address(\"g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm\")\n\taddr2 := std.Address(\"g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj\")\n\ttokenURI := \"http://example.com/token\"\n\n\tstd.TestSetOrigCaller(std.Address(addr1)) // addr1\n\n\tdummy.mint(addr1, TokenID(\"1\"))\n\t_, derr := dummy.SetTokenURI(TokenID(\"1\"), TokenURI(tokenURI))\n\tuassert.NoError(t, derr, \"should not result in error\")\n\n\t// Test case: Invalid token ID\n\t_, err := dummy.SetTokenURI(TokenID(\"3\"), TokenURI(tokenURI))\n\tuassert.ErrorIs(t, err, ErrInvalidTokenId)\n\n\tstd.TestSetOrigCaller(std.Address(addr2)) // addr2\n\n\t_, cerr := dummy.SetTokenURI(TokenID(\"1\"), TokenURI(tokenURI)) // addr2 trying to set URI for token 1\n\tuassert.ErrorIs(t, cerr, ErrCallerIsNotOwner)\n\n\t// Test case: Retrieving TokenURI\n\tstd.TestSetOrigCaller(std.Address(addr1)) // addr1\n\n\tdummyTokenURI, err := dummy.TokenURI(TokenID(\"1\"))\n\tuassert.NoError(t, err, \"TokenURI error\")\n\tuassert.Equal(t, string(tokenURI), string(dummyTokenURI))\n}\n"},{"name":"errors.gno","body":"package grc721\n\nimport \"errors\"\n\nvar (\n\tErrInvalidTokenId = errors.New(\"invalid token id\")\n\tErrInvalidAddress = errors.New(\"invalid address\")\n\tErrTokenIdNotHasApproved = errors.New(\"token id not approved for anyone\")\n\tErrApprovalToCurrentOwner = errors.New(\"approval to current owner\")\n\tErrCallerIsNotOwner = errors.New(\"caller is not token owner\")\n\tErrCallerNotApprovedForAll = errors.New(\"caller is not approved for all\")\n\tErrCannotTransferToSelf = errors.New(\"cannot send transfer to self\")\n\tErrTransferFromIncorrectOwner = errors.New(\"transfer from incorrect owner\")\n\tErrTransferToNonGRC721Receiver = errors.New(\"transfer to non GRC721Receiver implementer\")\n\tErrCallerIsNotOwnerOrApproved = errors.New(\"caller is not token owner or approved\")\n\tErrTokenIdAlreadyExists = errors.New(\"token id already exists\")\n\n\t// ERC721Royalty\n\tErrInvalidRoyaltyPercentage = errors.New(\"invalid royalty percentage\")\n\tErrInvalidRoyaltyPaymentAddress = errors.New(\"invalid royalty paymentAddress\")\n\tErrCannotCalculateRoyaltyAmount = errors.New(\"cannot calculate royalty amount\")\n)\n"},{"name":"grc721_metadata.gno","body":"package grc721\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/avl\"\n)\n\n// metadataNFT represents an NFT with metadata extensions.\ntype metadataNFT struct {\n\t*basicNFT // Embedded basicNFT struct for basic NFT functionality\n\textensions *avl.Tree // AVL tree for storing metadata extensions\n}\n\n// Ensure that metadataNFT implements the IGRC721MetadataOnchain interface.\nvar _ IGRC721MetadataOnchain = (*metadataNFT)(nil)\n\n// NewNFTWithMetadata creates a new basic NFT with metadata extensions.\nfunc NewNFTWithMetadata(name string, symbol string) *metadataNFT {\n\t// Create a new basic NFT\n\tnft := NewBasicNFT(name, symbol)\n\n\t// Return a metadataNFT with basicNFT embedded and an empty AVL tree for extensions\n\treturn \u0026metadataNFT{\n\t\tbasicNFT: nft,\n\t\textensions: avl.NewTree(),\n\t}\n}\n\n// SetTokenMetadata sets metadata for a given token ID.\nfunc (s *metadataNFT) SetTokenMetadata(tid TokenID, metadata Metadata) error {\n\t// Check if the caller is the owner of the token\n\towner, err := s.basicNFT.OwnerOf(tid)\n\tif err != nil {\n\t\treturn err\n\t}\n\tcaller := std.PrevRealm().Addr()\n\tif caller != owner {\n\t\treturn ErrCallerIsNotOwner\n\t}\n\n\t// Set the metadata for the token ID in the extensions AVL tree\n\ts.extensions.Set(string(tid), metadata)\n\treturn nil\n}\n\n// TokenMetadata retrieves metadata for a given token ID.\nfunc (s *metadataNFT) TokenMetadata(tid TokenID) (Metadata, error) {\n\t// Retrieve metadata from the extensions AVL tree\n\tmetadata, found := s.extensions.Get(string(tid))\n\tif !found {\n\t\treturn Metadata{}, ErrInvalidTokenId\n\t}\n\n\treturn metadata.(Metadata), nil\n}\n\n// mint mints a new token and assigns it to the specified address.\nfunc (s *metadataNFT) mint(to std.Address, tid TokenID) error {\n\t// Check if the address is valid\n\tif err := isValidAddress(to); err != nil {\n\t\treturn err\n\t}\n\n\t// Check if the token ID already exists\n\tif s.basicNFT.exists(tid) {\n\t\treturn ErrTokenIdAlreadyExists\n\t}\n\n\ts.basicNFT.beforeTokenTransfer(zeroAddress, to, tid, 1)\n\n\t// Check if the token ID was minted by beforeTokenTransfer\n\tif s.basicNFT.exists(tid) {\n\t\treturn ErrTokenIdAlreadyExists\n\t}\n\n\t// Increment balance of the recipient address\n\ttoBalance, err := s.basicNFT.BalanceOf(to)\n\tif err != nil {\n\t\treturn err\n\t}\n\ttoBalance += 1\n\ts.basicNFT.balances.Set(to.String(), toBalance)\n\n\t// Set owner of the token ID to the recipient address\n\ts.basicNFT.owners.Set(string(tid), to)\n\n\t// Emit transfer event\n\tevent := TransferEvent{zeroAddress, to, tid}\n\temit(\u0026event)\n\n\ts.basicNFT.afterTokenTransfer(zeroAddress, to, tid, 1)\n\n\treturn nil\n}\n"},{"name":"grc721_metadata_test.gno","body":"package grc721\n\nimport (\n\t\"std\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/p/demo/uassert\"\n)\n\nfunc TestSetMetadata(t *testing.T) {\n\t// Create a new dummy NFT with metadata\n\tdummy := NewNFTWithMetadata(dummyNFTName, dummyNFTSymbol)\n\tif dummy == nil {\n\t\tt.Errorf(\"should not be nil\")\n\t}\n\n\t// Define addresses for testing purposes\n\taddr1 := testutils.TestAddress(\"alice\")\n\taddr2 := testutils.TestAddress(\"bob\")\n\n\t// Define metadata attributes\n\tname := \"test\"\n\tdescription := \"test\"\n\timage := \"test\"\n\timageData := \"test\"\n\texternalURL := \"test\"\n\tattributes := []Trait{}\n\tbackgroundColor := \"test\"\n\tanimationURL := \"test\"\n\tyoutubeURL := \"test\"\n\n\t// Set the original caller to addr1\n\tstd.TestSetOrigCaller(addr1) // addr1\n\n\t// Mint a new token for addr1\n\tdummy.mint(addr1, TokenID(\"1\"))\n\n\t// Set metadata for token 1\n\tderr := dummy.SetTokenMetadata(TokenID(\"1\"), Metadata{\n\t\tName: name,\n\t\tDescription: description,\n\t\tImage: image,\n\t\tImageData: imageData,\n\t\tExternalURL: externalURL,\n\t\tAttributes: attributes,\n\t\tBackgroundColor: backgroundColor,\n\t\tAnimationURL: animationURL,\n\t\tYoutubeURL: youtubeURL,\n\t})\n\n\t// Check if there was an error setting metadata\n\tuassert.NoError(t, derr, \"Should not result in error\")\n\n\t// Test case: Invalid token ID\n\terr := dummy.SetTokenMetadata(TokenID(\"3\"), Metadata{\n\t\tName: name,\n\t\tDescription: description,\n\t\tImage: image,\n\t\tImageData: imageData,\n\t\tExternalURL: externalURL,\n\t\tAttributes: attributes,\n\t\tBackgroundColor: backgroundColor,\n\t\tAnimationURL: animationURL,\n\t\tYoutubeURL: youtubeURL,\n\t})\n\n\t// Check if the error returned matches the expected error\n\tuassert.ErrorIs(t, err, ErrInvalidTokenId)\n\n\t// Set the original caller to addr2\n\tstd.TestSetOrigCaller(addr2) // addr2\n\n\t// Try to set metadata for token 1 from addr2 (should fail)\n\tcerr := dummy.SetTokenMetadata(TokenID(\"1\"), Metadata{\n\t\tName: name,\n\t\tDescription: description,\n\t\tImage: image,\n\t\tImageData: imageData,\n\t\tExternalURL: externalURL,\n\t\tAttributes: attributes,\n\t\tBackgroundColor: backgroundColor,\n\t\tAnimationURL: animationURL,\n\t\tYoutubeURL: youtubeURL,\n\t})\n\n\t// Check if the error returned matches the expected error\n\tuassert.ErrorIs(t, cerr, ErrCallerIsNotOwner)\n\n\t// Set the original caller back to addr1\n\tstd.TestSetOrigCaller(addr1) // addr1\n\n\t// Retrieve metadata for token 1\n\tdummyMetadata, err := dummy.TokenMetadata(TokenID(\"1\"))\n\tuassert.NoError(t, err, \"Metadata error\")\n\n\t// Check if metadata attributes match expected values\n\tuassert.Equal(t, image, dummyMetadata.Image)\n\tuassert.Equal(t, imageData, dummyMetadata.ImageData)\n\tuassert.Equal(t, externalURL, dummyMetadata.ExternalURL)\n\tuassert.Equal(t, description, dummyMetadata.Description)\n\tuassert.Equal(t, name, dummyMetadata.Name)\n\tuassert.Equal(t, len(attributes), len(dummyMetadata.Attributes))\n\tuassert.Equal(t, backgroundColor, dummyMetadata.BackgroundColor)\n\tuassert.Equal(t, animationURL, dummyMetadata.AnimationURL)\n\tuassert.Equal(t, youtubeURL, dummyMetadata.YoutubeURL)\n}\n"},{"name":"grc721_royalty.gno","body":"package grc721\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/avl\"\n)\n\n// royaltyNFT represents a non-fungible token (NFT) with royalty functionality.\ntype royaltyNFT struct {\n\t*metadataNFT // Embedding metadataNFT for NFT functionality\n\ttokenRoyaltyInfo *avl.Tree // AVL tree to store royalty information for each token\n\tmaxRoyaltyPercentage uint64 // maxRoyaltyPercentage represents the maximum royalty percentage that can be charged every sale\n}\n\n// Ensure that royaltyNFT implements the IGRC2981 interface.\nvar _ IGRC2981 = (*royaltyNFT)(nil)\n\n// NewNFTWithRoyalty creates a new royalty NFT with the specified name, symbol, and royalty calculator.\nfunc NewNFTWithRoyalty(name string, symbol string) *royaltyNFT {\n\t// Create a new NFT with metadata\n\tnft := NewNFTWithMetadata(name, symbol)\n\n\treturn \u0026royaltyNFT{\n\t\tmetadataNFT: nft,\n\t\ttokenRoyaltyInfo: avl.NewTree(),\n\t\tmaxRoyaltyPercentage: 100,\n\t}\n}\n\n// SetTokenRoyalty sets the royalty information for a specific token ID.\nfunc (r *royaltyNFT) SetTokenRoyalty(tid TokenID, royaltyInfo RoyaltyInfo) error {\n\t// Validate the payment address\n\tif err := isValidAddress(royaltyInfo.PaymentAddress); err != nil {\n\t\treturn ErrInvalidRoyaltyPaymentAddress\n\t}\n\n\t// Check if royalty percentage exceeds maxRoyaltyPercentage\n\tif royaltyInfo.Percentage \u003e r.maxRoyaltyPercentage {\n\t\treturn ErrInvalidRoyaltyPercentage\n\t}\n\n\t// Check if the caller is the owner of the token\n\towner, err := r.metadataNFT.OwnerOf(tid)\n\tif err != nil {\n\t\treturn err\n\t}\n\tcaller := std.PrevRealm().Addr()\n\tif caller != owner {\n\t\treturn ErrCallerIsNotOwner\n\t}\n\n\t// Set royalty information for the token\n\tr.tokenRoyaltyInfo.Set(string(tid), royaltyInfo)\n\n\treturn nil\n}\n\n// RoyaltyInfo returns the royalty information for the given token ID and sale price.\nfunc (r *royaltyNFT) RoyaltyInfo(tid TokenID, salePrice uint64) (std.Address, uint64, error) {\n\t// Retrieve royalty information for the token\n\tval, found := r.tokenRoyaltyInfo.Get(string(tid))\n\tif !found {\n\t\treturn \"\", 0, ErrInvalidTokenId\n\t}\n\n\troyaltyInfo := val.(RoyaltyInfo)\n\n\t// Calculate royalty amount\n\troyaltyAmount, _ := r.calculateRoyaltyAmount(salePrice, royaltyInfo.Percentage)\n\n\treturn royaltyInfo.PaymentAddress, royaltyAmount, nil\n}\n\nfunc (r *royaltyNFT) calculateRoyaltyAmount(salePrice, percentage uint64) (uint64, error) {\n\troyaltyAmount := (salePrice * percentage) / 100\n\treturn royaltyAmount, nil\n}\n"},{"name":"grc721_royalty_test.gno","body":"package grc721\n\nimport (\n\t\"std\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/p/demo/uassert\"\n)\n\nfunc TestSetTokenRoyalty(t *testing.T) {\n\tdummy := NewNFTWithRoyalty(dummyNFTName, dummyNFTSymbol)\n\tuassert.True(t, dummy != nil, \"should not be nil\")\n\n\taddr1 := testutils.TestAddress(\"alice\")\n\taddr2 := testutils.TestAddress(\"bob\")\n\n\tpaymentAddress := testutils.TestAddress(\"john\")\n\tpercentage := uint64(10) // 10%\n\n\tsalePrice := uint64(1000)\n\texpectRoyaltyAmount := uint64(100)\n\n\tstd.TestSetOrigCaller(addr1) // addr1\n\n\tdummy.mint(addr1, TokenID(\"1\"))\n\n\tderr := dummy.SetTokenRoyalty(TokenID(\"1\"), RoyaltyInfo{\n\t\tPaymentAddress: paymentAddress,\n\t\tPercentage: percentage,\n\t})\n\tuassert.NoError(t, derr, \"Should not result in error\")\n\n\t// Test case: Invalid token ID\n\terr := dummy.SetTokenRoyalty(TokenID(\"3\"), RoyaltyInfo{\n\t\tPaymentAddress: paymentAddress,\n\t\tPercentage: percentage,\n\t})\n\tuassert.ErrorIs(t, derr, ErrInvalidTokenId)\n\n\tstd.TestSetOrigCaller(addr2) // addr2\n\n\tcerr := dummy.SetTokenRoyalty(TokenID(\"1\"), RoyaltyInfo{\n\t\tPaymentAddress: paymentAddress,\n\t\tPercentage: percentage,\n\t})\n\tuassert.ErrorIs(t, cerr, ErrCallerIsNotOwner)\n\n\t// Test case: Invalid payment address\n\taerr := dummy.SetTokenRoyalty(TokenID(\"4\"), RoyaltyInfo{\n\t\tPaymentAddress: std.Address(\"###\"), // invalid address\n\t\tPercentage: percentage,\n\t})\n\tuassert.ErrorIs(t, aerr, ErrInvalidRoyaltyPaymentAddress)\n\n\t// Test case: Invalid percentage\n\tperr := dummy.SetTokenRoyalty(TokenID(\"5\"), RoyaltyInfo{\n\t\tPaymentAddress: paymentAddress,\n\t\tPercentage: uint64(200), // over maxRoyaltyPercentage\n\t})\n\tuassert.ErrorIs(t, perr, ErrInvalidRoyaltyPercentage)\n\n\t// Test case: Retrieving Royalty Info\n\tstd.TestSetOrigCaller(addr1) // addr1\n\n\tdummyPaymentAddress, dummyRoyaltyAmount, rerr := dummy.RoyaltyInfo(TokenID(\"1\"), salePrice)\n\tuassert.NoError(t, rerr, \"RoyaltyInfo error\")\n\tuassert.Equal(t, paymentAddress, dummyPaymentAddress)\n\tuassert.Equal(t, expectRoyaltyAmount, dummyRoyaltyAmount)\n}\n"},{"name":"igrc721.gno","body":"package grc721\n\nimport \"std\"\n\ntype IGRC721 interface {\n\tBalanceOf(owner std.Address) (uint64, error)\n\tOwnerOf(tid TokenID) (std.Address, error)\n\tSetTokenURI(tid TokenID, tURI TokenURI) (bool, error)\n\tSafeTransferFrom(from, to std.Address, tid TokenID) error\n\tTransferFrom(from, to std.Address, tid TokenID) error\n\tApprove(approved std.Address, tid TokenID) error\n\tSetApprovalForAll(operator std.Address, approved bool) error\n\tGetApproved(tid TokenID) (std.Address, error)\n\tIsApprovedForAll(owner, operator std.Address) bool\n}\n\ntype (\n\tTokenID string\n\tTokenURI string\n)\n\ntype TransferEvent struct {\n\tFrom std.Address\n\tTo std.Address\n\tTokenID TokenID\n}\n\ntype ApprovalEvent struct {\n\tOwner std.Address\n\tApproved std.Address\n\tTokenID TokenID\n}\n\ntype ApprovalForAllEvent struct {\n\tOwner std.Address\n\tOperator std.Address\n\tApproved bool\n}\n"},{"name":"igrc721_metadata.gno","body":"package grc721\n\n// IGRC721CollectionMetadata describes basic information about an NFT collection.\ntype IGRC721CollectionMetadata interface {\n\tName() string // Name returns the name of the collection.\n\tSymbol() string // Symbol returns the symbol of the collection.\n}\n\n// IGRC721Metadata follows the Ethereum standard\ntype IGRC721Metadata interface {\n\tIGRC721CollectionMetadata\n\tTokenURI(tid TokenID) (string, error) // TokenURI returns the URI of a specific token.\n}\n\n// IGRC721Metadata follows the OpenSea metadata standard\ntype IGRC721MetadataOnchain interface {\n\tIGRC721CollectionMetadata\n\tTokenMetadata(tid TokenID) (Metadata, error)\n}\n\ntype Trait struct {\n\tDisplayType string\n\tTraitType string\n\tValue string\n}\n\n// see: https://docs.opensea.io/docs/metadata-standards\ntype Metadata struct {\n\tImage 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.\n\tImageData 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.\n\tExternalURL 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.\n\tDescription string // Human-readable description of the item. Markdown is supported.\n\tName string // Name of the item.\n\tAttributes []Trait // Attributes for the item, which will show up on the OpenSea page for the item.\n\tBackgroundColor string // Background color of the item on OpenSea. Must be a six-character hexadecimal without a pre-pended #\n\tAnimationURL 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.\n\tYoutubeURL string // URL to a YouTube video (only used if animation_url is not provided).\n}\n"},{"name":"igrc721_royalty.gno","body":"package grc721\n\nimport \"std\"\n\n// IGRC2981 follows the Ethereum standard\ntype IGRC2981 interface {\n\t// RoyaltyInfo retrieves royalty information for a tokenID and salePrice.\n\t// It returns the payment address, royalty amount, and an error if any.\n\tRoyaltyInfo(tokenID TokenID, salePrice uint64) (std.Address, uint64, error)\n}\n\n// RoyaltyInfo represents royalty information for a token.\ntype RoyaltyInfo struct {\n\tPaymentAddress std.Address // PaymentAddress is the address where royalty payment should be sent.\n\tPercentage uint64 // Percentage is the royalty percentage. It indicates the percentage of royalty to be paid for each sale. For example : Percentage = 10 =\u003e 10%\n}\n"},{"name":"util.gno","body":"package grc721\n\nimport (\n\t\"std\"\n)\n\nvar zeroAddress = std.Address(\"\")\n\nfunc isValidAddress(addr std.Address) error {\n\tif !addr.IsValid() {\n\t\treturn ErrInvalidAddress\n\t}\n\treturn nil\n}\n\nfunc emit(event interface{}) {\n\t// TODO: setup a pubsub system here?\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"grc777","path":"gno.land/p/demo/grc/grc777","files":[{"name":"dummy_test.gno","body":"package grc777\n\nimport (\n\t\"std\"\n\t\"testing\"\n)\n\ntype dummyImpl struct{}\n\n// FIXME: this should fail.\nvar _ IGRC777 = (*dummyImpl)(nil)\n\nfunc TestInterface(t *testing.T) {\n\tvar dummy IGRC777 = \u0026dummyImpl{}\n}\n\nfunc (impl *dummyImpl) GetName() string { panic(\"not implemented\") }\nfunc (impl *dummyImpl) GetSymbol() string { panic(\"not implemented\") }\nfunc (impl *dummyImpl) GetDecimals() uint { panic(\"not implemented\") }\nfunc (impl *dummyImpl) Granularity() (granularity uint64) { panic(\"not implemented\") }\nfunc (impl *dummyImpl) TotalSupply() (supply uint64) { panic(\"not implemented\") }\nfunc (impl *dummyImpl) BalanceOf(address std.Address) uint64 { panic(\"not implemented\") }\nfunc (impl *dummyImpl) Burn(amount uint64, data []byte) { panic(\"not implemented\") }\nfunc (impl *dummyImpl) AuthorizeOperator(operator std.Address) { panic(\"not implemented\") }\nfunc (impl *dummyImpl) RevokeOperator(operators std.Address) { panic(\"not implemented\") }\nfunc (impl *dummyImpl) DefaultOperators() []std.Address { panic(\"not implemented\") }\nfunc (impl *dummyImpl) Send(recipient std.Address, amount uint64, data []byte) {\n\tpanic(\"not implemented\")\n}\n\nfunc (impl *dummyImpl) IsOperatorFor(operator, tokenHolder std.Address) bool {\n\tpanic(\"not implemented\")\n}\n\nfunc (impl *dummyImpl) OperatorSend(sender, recipient std.Address, amount uint64, data, operatorData []byte) {\n\tpanic(\"not implemented\")\n}\n\nfunc (impl *dummyImpl) OperatorBurn(account std.Address, amount uint64, data, operatorData []byte) {\n\tpanic(\"not implemented\")\n}\n"},{"name":"igrc777.gno","body":"package grc777\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/grc/exts\"\n)\n\n// TODO: use big.Int or a custom uint64 instead of uint64\n\ntype IGRC777 interface {\n\texts.TokenMetadata\n\n\t// Returns the smallest part of the token that is not divisible. This\n\t// means all token operations (creation, movement and destruction) must\n\t// have amounts that are a multiple of this number.\n\t//\n\t// For most token contracts, this value will equal 1.\n\tGranularity() (granularity uint64)\n\n\t// Returns the amount of tokens in existence.\n\tTotalSupply() (supply uint64)\n\n\t// Returns the amount of tokens owned by an account (`owner`).\n\tBalanceOf(address std.Address) uint64\n\n\t// Moves `amount` tokens from the caller's account to `recipient`.\n\t//\n\t// If send or receive hooks are registered for the caller and `recipient`,\n\t// the corresponding functions will be called with `data` and empty\n\t// `operatorData`. See {IERC777Sender} and {IERC777Recipient}.\n\t//\n\t// Emits a {Sent} event.\n\t//\n\t// Requirements\n\t//\n\t// - the caller must have at least `amount` tokens.\n\t// - `recipient` cannot be the zero address.\n\t// - if `recipient` is a contract, it must implement the {IERC777Recipient}\n\t// interface.\n\tSend(recipient std.Address, amount uint64, data []byte)\n\n\t// Destroys `amount` tokens from the caller's account, reducing the\n\t// total supply.\n\t//\n\t// If a send hook is registered for the caller, the corresponding function\n\t// will be called with `data` and empty `operatorData`. See {IERC777Sender}.\n\t//\n\t// Emits a {Burned} event.\n\t//\n\t// Requirements\n\t//\n\t// - the caller must have at least `amount` tokens.\n\tBurn(amount uint64, data []byte)\n\n\t// Returns true if an account is an operator of `tokenHolder`.\n\t// Operators can send and burn tokens on behalf of their owners. All\n\t// accounts are their own operator.\n\t//\n\t// See {operatorSend} and {operatorBurn}.\n\tIsOperatorFor(operator, tokenHolder std.Address) bool\n\n\t// Make an account an operator of the caller.\n\t//\n\t// See {isOperatorFor}.\n\t//\n\t// Emits an {AuthorizedOperator} event.\n\t//\n\t// Requirements\n\t//\n\t// - `operator` cannot be calling address.\n\tAuthorizeOperator(operator std.Address)\n\n\t// Revoke an account's operator status for the caller.\n\t//\n\t// See {isOperatorFor} and {defaultOperators}.\n\t//\n\t// Emits a {RevokedOperator} event.\n\t//\n\t// Requirements\n\t//\n\t// - `operator` cannot be calling address.\n\tRevokeOperator(operators std.Address)\n\n\t// Returns the list of default operators. These accounts are operators\n\t// for all token holders, even if {authorizeOperator} was never called on\n\t// them.\n\t//\n\t// This list is immutable, but individual holders may revoke these via\n\t// {revokeOperator}, in which case {isOperatorFor} will return false.\n\tDefaultOperators() []std.Address\n\n\t// Moves `amount` tokens from `sender` to `recipient`. The caller must\n\t// be an operator of `sender`.\n\t//\n\t// If send or receive hooks are registered for `sender` and `recipient`,\n\t// the corresponding functions will be called with `data` and\n\t// `operatorData`. See {IERC777Sender} and {IERC777Recipient}.\n\t//\n\t// Emits a {Sent} event.\n\t//\n\t// Requirements\n\t//\n\t// - `sender` cannot be the zero address.\n\t// - `sender` must have at least `amount` tokens.\n\t// - the caller must be an operator for `sender`.\n\t// - `recipient` cannot be the zero address.\n\t// - if `recipient` is a contract, it must implement the {IERC777Recipient}\n\t// interface.\n\tOperatorSend(sender, recipient std.Address, amount uint64, data, operatorData []byte)\n\n\t// Destroys `amount` tokens from `account`, reducing the total supply.\n\t// The caller must be an operator of `account`.\n\t//\n\t// If a send hook is registered for `account`, the corresponding function\n\t// will be called with `data` and `operatorData`. See {IERC777Sender}.\n\t//\n\t// Emits a {Burned} event.\n\t//\n\t// Requirements\n\t//\n\t// - `account` cannot be the zero address.\n\t// - `account` must have at least `amount` tokens.\n\t// - the caller must be an operator for `account`.\n\tOperatorBurn(account std.Address, amount uint64, data, operatorData []byte)\n}\n\n// Emitted when `amount` tokens are created by `operator` and assigned to `to`.\n//\n// Note that some additional user `data` and `operatorData` can be logged in the event.\ntype MintedEvent struct {\n\tOperator std.Address\n\tTo std.Address\n\tAmount uint64\n\tData []byte\n\tOperatorData []byte\n}\n\n// Emitted when `operator` destroys `amount` tokens from `account`.\n//\n// Note that some additional user `data` and `operatorData` can be logged in the event.\ntype BurnedEvent struct {\n\tOperator std.Address\n\tFrom std.Address\n\tAmount uint64\n\tData []byte\n\tOperatorData []byte\n}\n\n// Emitted when `operator` is made operator for `tokenHolder`\ntype AuthorizedOperatorEvent struct {\n\tOperator std.Address\n\tTokenHolder std.Address\n}\n\n// Emitted when `operator` is revoked its operator status for `tokenHolder`.\ntype RevokedOperatorEvent struct {\n\tOperator std.Address\n\tTokenHolder std.Address\n}\n\ntype SentEvent struct {\n\tOperator std.Address\n\tFrom std.Address\n\tTo std.Address\n\tAmount uint64\n\tData []byte\n\tOperatorData []byte\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"rat","path":"gno.land/p/demo/rat","files":[{"name":"maths.gno","body":"package rat\n\nconst (\n\tintSize = 32 \u003c\u003c (^uint(0) \u003e\u003e 63) // 32 or 64\n\n\tMaxInt = 1\u003c\u003c(intSize-1) - 1\n\tMinInt = -1 \u003c\u003c (intSize - 1)\n\tMaxInt8 = 1\u003c\u003c7 - 1\n\tMinInt8 = -1 \u003c\u003c 7\n\tMaxInt16 = 1\u003c\u003c15 - 1\n\tMinInt16 = -1 \u003c\u003c 15\n\tMaxInt32 = 1\u003c\u003c31 - 1\n\tMinInt32 = -1 \u003c\u003c 31\n\tMaxInt64 = 1\u003c\u003c63 - 1\n\tMinInt64 = -1 \u003c\u003c 63\n\tMaxUint = 1\u003c\u003cintSize - 1\n\tMaxUint8 = 1\u003c\u003c8 - 1\n\tMaxUint16 = 1\u003c\u003c16 - 1\n\tMaxUint32 = 1\u003c\u003c32 - 1\n\tMaxUint64 = 1\u003c\u003c64 - 1\n)\n"},{"name":"rat.gno","body":"package rat\n\n//----------------------------------------\n// Rat fractions\n\n// represents a fraction.\ntype Rat struct {\n\tX int32\n\tY int32 // must be positive\n}\n\nfunc NewRat(x, y int32) Rat {\n\tif y \u003c= 0 {\n\t\tpanic(\"invalid std.Rat denominator\")\n\t}\n\treturn Rat{X: x, Y: y}\n}\n\nfunc (r1 Rat) IsValid() bool {\n\tif r1.Y \u003c= 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (r1 Rat) Cmp(r2 Rat) int {\n\tif !r1.IsValid() {\n\t\tpanic(\"invalid std.Rat left operand\")\n\t}\n\tif !r2.IsValid() {\n\t\tpanic(\"invalid std.Rat right operand\")\n\t}\n\tvar p1, p2 int64\n\tp1 = int64(r1.X) * int64(r2.Y)\n\tp2 = int64(r1.Y) * int64(r2.X)\n\tif p1 \u003c p2 {\n\t\treturn -1\n\t} else if p1 == p2 {\n\t\treturn 0\n\t} else {\n\t\treturn 1\n\t}\n}\n\n//func (r1 Rat) Plus(r2 Rat) Rat {\n// XXX\n//}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"users","path":"gno.land/p/demo/users","files":[{"name":"types.gno","body":"package users\n\ntype AddressOrName string\n\nfunc (aon AddressOrName) IsName() bool {\n\treturn aon != \"\" \u0026\u0026 aon[0] == '@'\n}\n\nfunc (aon AddressOrName) GetName() (string, bool) {\n\tif len(aon) \u003e= 2 \u0026\u0026 aon[0] == '@' {\n\t\treturn string(aon[1:]), true\n\t}\n\treturn \"\", false\n}\n"},{"name":"users.gno","body":"package users\n\nimport (\n\t\"std\"\n\t\"strconv\"\n)\n\n//----------------------------------------\n// Types\n\ntype User struct {\n\tAddress std.Address\n\tName string\n\tProfile string\n\tNumber int\n\tInvites int\n\tInviter std.Address\n}\n\nfunc (u *User) Render() string {\n\tstr := \"## user \" + u.Name + \"\\n\" +\n\t\t\"\\n\" +\n\t\t\" * address = \" + string(u.Address) + \"\\n\" +\n\t\t\" * \" + strconv.Itoa(u.Invites) + \" invites\\n\"\n\tif u.Inviter != \"\" {\n\t\tstr = str + \" * invited by \" + string(u.Inviter) + \"\\n\"\n\t}\n\tstr = str + \"\\n\" +\n\t\tu.Profile + \"\\n\"\n\treturn str\n}\n"},{"name":"users_test.gno","body":"package users\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"users","path":"gno.land/r/demo/users","files":[{"name":"preregister.gno","body":"package users\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/users\"\n)\n\n// pre-restricted names\nvar preRestrictedNames = []string{\n\t\"bitcoin\", \"cosmos\", \"newtendermint\", \"ethereum\",\n}\n\n// pre-registered users\nvar preRegisteredUsers = []struct {\n\tName string\n\tAddress std.Address\n}{\n\t// system name\n\t{\"archives\", \"g1xlnyjrnf03ju82v0f98ruhpgnquk28knmjfe5k\"}, // -\u003e @r_archives\n\t{\"demo\", \"g13ek2zz9qurzynzvssyc4sthwppnruhnp0gdz8n\"}, // -\u003e @r_demo\n\t{\"gno\", \"g19602kd9tfxrfd60sgreadt9zvdyyuudcyxsz8a\"}, // -\u003e @r_gno\n\t{\"gnoland\", \"g1g3lsfxhvaqgdv4ccemwpnms4fv6t3aq3p5z6u7\"}, // -\u003e @r_gnoland\n\t{\"gnolang\", \"g1yjlnm3z2630gg5mryjd79907e0zx658wxs9hnd\"}, // -\u003e @r_gnolang\n\t{\"gov\", \"g1g73v2anukg4ej7axwqpthsatzrxjsh0wk797da\"}, // -\u003e @r_gov\n\t{\"nt\", \"g15ge0ae9077eh40erwrn2eq0xw6wupwqthpv34l\"}, // -\u003e @r_nt\n\t{\"sys\", \"g1r929wt2qplfawe4lvqv9zuwfdcz4vxdun7qh8l\"}, // -\u003e @r_sys\n\t{\"x\", \"g164sdpew3c2t3rvxj3kmfv7c7ujlvcw2punzzuz\"}, // -\u003e @r_x\n\n\t// test1 user\n\t{\"test1\", \"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\"}, // -\u003e @test1\n}\n\nfunc init() {\n\t// add pre-registered users\n\tfor _, res := range preRegisteredUsers {\n\t\t// assert not already registered.\n\t\t_, ok := name2User.Get(res.Name)\n\t\tif ok {\n\t\t\tpanic(\"name already registered\")\n\t\t}\n\n\t\t_, ok = addr2User.Get(res.Address.String())\n\t\tif ok {\n\t\t\tpanic(\"address already registered\")\n\t\t}\n\n\t\tcounter++\n\t\tuser := \u0026users.User{\n\t\t\tAddress: res.Address,\n\t\t\tName: res.Name,\n\t\t\tProfile: \"\",\n\t\t\tNumber: counter,\n\t\t\tInvites: int(0),\n\t\t\tInviter: admin,\n\t\t}\n\t\tname2User.Set(res.Name, user)\n\t\taddr2User.Set(res.Address.String(), user)\n\t}\n\n\t// add pre-restricted names\n\tfor _, name := range preRestrictedNames {\n\t\tif _, ok := name2User.Get(name); ok {\n\t\t\tpanic(\"name already registered\")\n\t\t}\n\n\t\trestricted.Set(name, true)\n\t}\n}\n"},{"name":"users.gno","body":"package users\n\nimport (\n\t\"regexp\"\n\t\"std\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/avlhelpers\"\n\t\"gno.land/p/demo/users\"\n)\n\n//----------------------------------------\n// State\n\nvar (\n\tadmin std.Address = \"g1manfred47kzduec920z88wfr64ylksmdcedlf5\" // @moul\n\n\trestricted avl.Tree // Name -\u003e true - restricted name\n\tname2User avl.Tree // Name -\u003e *users.User\n\taddr2User avl.Tree // std.Address -\u003e *users.User\n\tinvites avl.Tree // string(inviter+\":\"+invited) -\u003e true\n\tcounter int // user id counter\n\tminFee int64 = 20 * 1_000_000 // minimum gnot must be paid to register.\n\tmaxFeeMult int64 = 10 // maximum multiples of minFee accepted.\n)\n\n//----------------------------------------\n// Top-level functions\n\nfunc Register(inviter std.Address, name string, profile string) {\n\t// assert CallTx call.\n\tstd.AssertOriginCall()\n\t// assert invited or paid.\n\tcaller := std.GetCallerAt(2)\n\tif caller != std.GetOrigCaller() {\n\t\tpanic(\"should not happen\") // because std.AssertOrigCall().\n\t}\n\n\tsentCoins := std.GetOrigSend()\n\tminCoin := std.NewCoin(\"ugnot\", minFee)\n\n\tif inviter == \"\" {\n\t\t// banker := std.GetBanker(std.BankerTypeOrigSend)\n\t\tif len(sentCoins) == 1 \u0026\u0026 sentCoins[0].IsGTE(minCoin) {\n\t\t\tif sentCoins[0].Amount \u003e minFee*maxFeeMult {\n\t\t\t\tpanic(\"payment must not be greater than \" + strconv.Itoa(int(minFee*maxFeeMult)))\n\t\t\t} else {\n\t\t\t\t// ok\n\t\t\t}\n\t\t} else {\n\t\t\tpanic(\"payment must not be less than \" + strconv.Itoa(int(minFee)))\n\t\t}\n\t} else {\n\t\tinvitekey := inviter.String() + \":\" + caller.String()\n\t\t_, ok := invites.Get(invitekey)\n\t\tif !ok {\n\t\t\tpanic(\"invalid invitation\")\n\t\t}\n\t\tinvites.Remove(invitekey)\n\t}\n\n\t// assert not already registered.\n\t_, ok := name2User.Get(name)\n\tif ok {\n\t\tpanic(\"name already registered: \" + name)\n\t}\n\t_, ok = addr2User.Get(caller.String())\n\tif ok {\n\t\tpanic(\"address already registered: \" + caller.String())\n\t}\n\n\tisInviterAdmin := inviter == admin\n\n\t// check for restricted name\n\tif _, isRestricted := restricted.Get(name); isRestricted {\n\t\t// only address invite by the admin can register restricted name\n\t\tif !isInviterAdmin {\n\t\t\tpanic(\"restricted name: \" + name)\n\t\t}\n\n\t\trestricted.Remove(name)\n\t}\n\n\t// assert name is valid.\n\t// admin inviter can bypass name restriction\n\tif !isInviterAdmin \u0026\u0026 !reName.MatchString(name) {\n\t\tpanic(\"invalid name: \" + name + \" (must be at least 6 characters, lowercase alphanumeric with underscore)\")\n\t}\n\n\t// remainder of fees go toward invites.\n\tinvites := int(0)\n\tif len(sentCoins) == 1 {\n\t\tif sentCoins[0].Denom == \"ugnot\" \u0026\u0026 sentCoins[0].Amount \u003e= minFee {\n\t\t\tinvites = int(sentCoins[0].Amount / minFee)\n\t\t\tif inviter == \"\" \u0026\u0026 invites \u003e 0 {\n\t\t\t\tinvites -= 1\n\t\t\t}\n\t\t}\n\t}\n\t// register.\n\tcounter++\n\tuser := \u0026users.User{\n\t\tAddress: caller,\n\t\tName: name,\n\t\tProfile: profile,\n\t\tNumber: counter,\n\t\tInvites: invites,\n\t\tInviter: inviter,\n\t}\n\tname2User.Set(name, user)\n\taddr2User.Set(caller.String(), user)\n}\n\nfunc Invite(invitee string) {\n\t// assert CallTx call.\n\tstd.AssertOriginCall()\n\t// get caller/inviter.\n\tcaller := std.GetCallerAt(2)\n\tif caller != std.GetOrigCaller() {\n\t\tpanic(\"should not happen\") // because std.AssertOrigCall().\n\t}\n\tlines := strings.Split(invitee, \"\\n\")\n\tif caller == admin {\n\t\t// nothing to do, all good\n\t} else {\n\t\t// ensure has invites.\n\t\tuserI, ok := addr2User.Get(caller.String())\n\t\tif !ok {\n\t\t\tpanic(\"user unknown\")\n\t\t}\n\t\tuser := userI.(*users.User)\n\t\tif user.Invites \u003c= 0 {\n\t\t\tpanic(\"user has no invite tokens\")\n\t\t}\n\t\tuser.Invites -= len(lines)\n\t\tif user.Invites \u003c 0 {\n\t\t\tpanic(\"user has insufficient invite tokens\")\n\t\t}\n\t}\n\t// for each line...\n\tfor _, line := range lines {\n\t\tif line == \"\" {\n\t\t\tcontinue // file bodies have a trailing newline.\n\t\t} else if strings.HasPrefix(line, `//`) {\n\t\t\tcontinue // comment\n\t\t}\n\t\t// record invite.\n\t\tinvitekey := string(caller) + \":\" + string(line)\n\t\tinvites.Set(invitekey, true)\n\t}\n}\n\nfunc GrantInvites(invites string) {\n\t// assert CallTx call.\n\tstd.AssertOriginCall()\n\t// assert admin.\n\tcaller := std.GetCallerAt(2)\n\tif caller != std.GetOrigCaller() {\n\t\tpanic(\"should not happen\") // because std.AssertOrigCall().\n\t}\n\tif caller != admin {\n\t\tpanic(\"unauthorized\")\n\t}\n\t// for each line...\n\tlines := strings.Split(invites, \"\\n\")\n\tfor _, line := range lines {\n\t\tif line == \"\" {\n\t\t\tcontinue // file bodies have a trailing newline.\n\t\t} else if strings.HasPrefix(line, `//`) {\n\t\t\tcontinue // comment\n\t\t}\n\t\t// parse name and invites.\n\t\tvar name string\n\t\tvar invites int\n\t\tparts := strings.Split(line, \":\")\n\t\tif len(parts) == 1 { // short for :1.\n\t\t\tname = parts[0]\n\t\t\tinvites = 1\n\t\t} else if len(parts) == 2 {\n\t\t\tname = parts[0]\n\t\t\tinvites_, err := strconv.Atoi(parts[1])\n\t\t\tif err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t\tinvites = int(invites_)\n\t\t} else {\n\t\t\tpanic(\"should not happen\")\n\t\t}\n\t\t// give invites.\n\t\tuserI, ok := name2User.Get(name)\n\t\tif !ok {\n\t\t\t// maybe address.\n\t\t\tuserI, ok = addr2User.Get(name)\n\t\t\tif !ok {\n\t\t\t\tpanic(\"invalid user \" + name)\n\t\t\t}\n\t\t}\n\t\tuser := userI.(*users.User)\n\t\tuser.Invites += invites\n\t}\n}\n\n// Any leftover fees go toward invitations.\nfunc SetMinFee(newMinFee int64) {\n\t// assert CallTx call.\n\tstd.AssertOriginCall()\n\t// assert admin caller.\n\tcaller := std.GetCallerAt(2)\n\tif caller != admin {\n\t\tpanic(\"unauthorized\")\n\t}\n\t// update global variables.\n\tminFee = newMinFee\n}\n\n// This helps prevent fat finger accidents.\nfunc SetMaxFeeMultiple(newMaxFeeMult int64) {\n\t// assert CallTx call.\n\tstd.AssertOriginCall()\n\t// assert admin caller.\n\tcaller := std.GetCallerAt(2)\n\tif caller != admin {\n\t\tpanic(\"unauthorized\")\n\t}\n\t// update global variables.\n\tmaxFeeMult = newMaxFeeMult\n}\n\n//----------------------------------------\n// Exposed public functions\n\nfunc GetUserByName(name string) *users.User {\n\tuserI, ok := name2User.Get(name)\n\tif !ok {\n\t\treturn nil\n\t}\n\treturn userI.(*users.User)\n}\n\nfunc GetUserByAddress(addr std.Address) *users.User {\n\tuserI, ok := addr2User.Get(addr.String())\n\tif !ok {\n\t\treturn nil\n\t}\n\treturn userI.(*users.User)\n}\n\n// unlike GetUserByName, input must be \"@\" prefixed for names.\nfunc GetUserByAddressOrName(input users.AddressOrName) *users.User {\n\tname, isName := input.GetName()\n\tif isName {\n\t\treturn GetUserByName(name)\n\t}\n\treturn GetUserByAddress(std.Address(input))\n}\n\n// Get a list of user names starting from the given prefix. Limit the\n// number of results to maxResults. (This can be used for a name search tool.)\nfunc ListUsersByPrefix(prefix string, maxResults int) []string {\n\treturn avlhelpers.ListByteStringKeysByPrefix(name2User, prefix, maxResults)\n}\n\nfunc Resolve(input users.AddressOrName) std.Address {\n\tname, isName := input.GetName()\n\tif !isName {\n\t\treturn std.Address(input) // TODO check validity\n\t}\n\n\tuser := GetUserByName(name)\n\treturn user.Address\n}\n\n// Add restricted name to the list\nfunc AdminAddRestrictedName(name string) {\n\t// assert CallTx call.\n\tstd.AssertOriginCall()\n\t// get caller\n\tcaller := std.GetOrigCaller()\n\t// assert admin\n\tif caller != admin {\n\t\tpanic(\"unauthorized\")\n\t}\n\n\tif user := GetUserByName(name); user != nil {\n\t\tpanic(\"already registered name\")\n\t}\n\n\t// register restricted name\n\n\trestricted.Set(name, true)\n}\n\n//----------------------------------------\n// Constants\n\n// NOTE: name length must be clearly distinguishable from a bech32 address.\nvar reName = regexp.MustCompile(`^[a-z]+[_a-z0-9]{5,16}$`)\n\n//----------------------------------------\n// Render main page\n\nfunc Render(path string) string {\n\tif path == \"\" {\n\t\treturn renderHome()\n\t} else if len(path) \u003e= 38 { // 39? 40?\n\t\tif path[:2] != \"g1\" {\n\t\t\treturn \"invalid address \" + path\n\t\t}\n\t\tuser := GetUserByAddress(std.Address(path))\n\t\tif user == nil {\n\t\t\t// TODO: display basic information about account.\n\t\t\treturn \"unknown address \" + path\n\t\t}\n\t\treturn user.Render()\n\t} else {\n\t\tuser := GetUserByName(path)\n\t\tif user == nil {\n\t\t\treturn \"unknown username \" + path\n\t\t}\n\t\treturn user.Render()\n\t}\n}\n\nfunc renderHome() string {\n\tdoc := \"\"\n\tname2User.Iterate(\"\", \"\", func(key string, value interface{}) bool {\n\t\tuser := value.(*users.User)\n\t\tdoc += \" * [\" + user.Name + \"](/r/demo/users:\" + user.Name + \")\\n\"\n\t\treturn false\n\t})\n\treturn doc\n}\n"},{"name":"users_test.gno","body":"package users\n\nimport (\n\t\"testing\"\n\n\t\"gno.land/p/demo/uassert\"\n)\n\nfunc TestPreRegisteredTest1(t *testing.T) {\n\tnames := ListUsersByPrefix(\"test1\", 1)\n\tuassert.Equal(t, len(names), 1)\n\tuassert.Equal(t, names[0], \"test1\")\n}\n"},{"name":"z_0_b_filetest.gno","body":"package main\n\n// SEND: 19900000ugnot\n\nimport (\n\t\"gno.land/r/demo/users\"\n)\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tprintln(\"done\")\n}\n\n// Error:\n// payment must not be less than 20000000\n"},{"name":"z_0_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\t\"gno.land/r/demo/users\"\n)\n\nfunc main() {\n\tstd.TestSetOrigSend(std.Coins{std.NewCoin(\"dontcare\", 1)}, nil)\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tprintln(\"done\")\n}\n\n// Error:\n// incompatible coin denominations: dontcare, ugnot\n"},{"name":"z_10_filetest.gno","body":"// PKGPATH: gno.land/r/demo/users_test\npackage users_test\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\")\n\nfunc init() {\n\tcaller := std.GetOrigCaller() // main\n\ttest2 := testutils.TestAddress(\"test2\")\n\t// as admin, invite gnouser and test2\n\tstd.TestSetOrigCaller(admin)\n\tusers.Invite(caller.String() + \"\\n\" + test2.String())\n\t// register as caller\n\tstd.TestSetOrigCaller(caller)\n\tusers.Register(admin, \"gnouser\", \"my profile\")\n}\n\nfunc main() {\n\t// register as test2\n\ttest2 := testutils.TestAddress(\"test2\")\n\tstd.TestSetOrigCaller(test2)\n\tusers.Register(admin, \"test222\", \"my profile 2\")\n\tprintln(\"done\")\n}\n\n// Output:\n// done\n"},{"name":"z_11_filetest.gno","body":"package main\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\")\n\nfunc main() {\n\tcaller := std.GetOrigCaller() // main\n\tstd.TestSetOrigCaller(admin)\n\tusers.AdminAddRestrictedName(\"superrestricted\")\n\n\t// test restricted name\n\tstd.TestSetOrigCaller(caller)\n\tusers.Register(\"\", \"superrestricted\", \"my profile\")\n\tprintln(\"done\")\n}\n\n// Error:\n// restricted name: superrestricted\n"},{"name":"z_11b_filetest.gno","body":"package main\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\")\n\nfunc main() {\n\tcaller := std.GetOrigCaller() // main\n\tstd.TestSetOrigCaller(admin)\n\t// add restricted name\n\tusers.AdminAddRestrictedName(\"superrestricted\")\n\t// grant invite to caller\n\tusers.Invite(caller.String())\n\t// set back caller\n\tstd.TestSetOrigCaller(caller)\n\t// register restricted name with admin invite\n\tusers.Register(admin, \"superrestricted\", \"my profile\")\n\tprintln(\"done\")\n}\n\n// Output:\n// done\n"},{"name":"z_12_filetest.gno","body":"package main\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/r/demo/users\"\n)\n\nfunc main() {\n\tusers.Register(\"\", \"alicia\", \"my profile\")\n\n\t{\n\t\t// Normal usage\n\t\tnames := users.ListUsersByPrefix(\"a\", 1)\n\t\tprintln(\"# names: \" + strconv.Itoa(len(names)))\n\t\tprintln(\"name: \" + names[0])\n\t}\n\n\t{\n\t\t// Empty prefix: match all\n\t\tnames := users.ListUsersByPrefix(\"\", 1)\n\t\tprintln(\"# names: \" + strconv.Itoa(len(names)))\n\t\tprintln(\"name: \" + names[0])\n\t}\n\n\t{\n\t\t// The prefix is before \"alicia\"\n\t\tnames := users.ListUsersByPrefix(\"alich\", 1)\n\t\tprintln(\"# names: \" + strconv.Itoa(len(names)))\n\t}\n\n\t{\n\t\t// The prefix is after the last name\n\t\tnames := users.ListUsersByPrefix(\"y\", 10)\n\t\tprintln(\"# names: \" + strconv.Itoa(len(names)))\n\t}\n\n\t// More tests are in p/demo/avlhelpers\n}\n\n// Output:\n// # names: 1\n// name: alicia\n// # names: 1\n// name: alicia\n// # names: 0\n// # names: 0\n"},{"name":"z_1_filetest.gno","body":"package main\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"gno.land/r/demo/users\"\n)\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tprintln(\"done\")\n}\n\n// Output:\n// done\n"},{"name":"z_2_filetest.gno","body":"package main\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\")\n\nfunc main() {\n\tcaller := std.GetOrigCaller() // main\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\t// as admin, grant invites to gnouser\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\")\n\t// switch back to caller\n\tstd.TestSetOrigCaller(caller)\n\t// invite another addr\n\ttest1 := testutils.TestAddress(\"test1\")\n\tusers.Invite(test1.String())\n\t// switch to test1\n\tstd.TestSetOrigCaller(test1)\n\tusers.Register(caller, \"satoshi\", \"my other profile\")\n\tprintln(\"done\")\n}\n\n// Output:\n// done\n"},{"name":"z_3_filetest.gno","body":"package main\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\")\n\nfunc main() {\n\tcaller := std.GetOrigCaller() // main\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\t// as admin, grant invites to gnouser\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\")\n\t// switch back to caller\n\tstd.TestSetOrigCaller(caller)\n\t// invite another addr\n\ttest1 := testutils.TestAddress(\"test1\")\n\tusers.Invite(test1.String())\n\t// switch to test1\n\tstd.TestSetOrigCaller(test1)\n\tstd.TestSetOrigSend(std.Coins{{\"dontcare\", 1}}, nil)\n\tusers.Register(caller, \"satoshi\", \"my other profile\")\n\tprintln(\"done\")\n}\n\n// Output:\n// done\n"},{"name":"z_4_filetest.gno","body":"package main\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\")\n\nfunc main() {\n\tcaller := std.GetOrigCaller() // main\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\t// as admin, grant invites to gnouser\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\")\n\t// switch back to caller\n\tstd.TestSetOrigCaller(caller)\n\t// invite another addr\n\ttest1 := testutils.TestAddress(\"test1\")\n\ttest2 := testutils.TestAddress(\"test2\")\n\tusers.Invite(test1.String())\n\t// switch to test2 (not test1)\n\tstd.TestSetOrigCaller(test2)\n\tstd.TestSetOrigSend(std.Coins{{\"dontcare\", 1}}, nil)\n\tusers.Register(caller, \"satoshi\", \"my other profile\")\n\tprintln(\"done\")\n}\n\n// Error:\n// invalid invitation\n"},{"name":"z_5_filetest.gno","body":"package main\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\")\n\nfunc main() {\n\tcaller := std.GetOrigCaller() // main\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\t// as admin, grant invites to gnouser\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\")\n\t// switch back to caller\n\tstd.TestSetOrigCaller(caller)\n\t// invite another addr\n\ttest1 := testutils.TestAddress(\"test1\")\n\tusers.Invite(test1.String())\n\t// switch to test1\n\tstd.TestSetOrigCaller(test1)\n\tstd.TestSetOrigSend(std.Coins{{\"dontcare\", 1}}, nil)\n\tusers.Register(caller, \"satoshi\", \"my other profile\")\n\tprintln(users.Render(\"\"))\n\tprintln(\"========================================\")\n\tprintln(users.Render(\"gnouser\"))\n\tprintln(\"========================================\")\n\tprintln(users.Render(\"satoshi\"))\n\tprintln(\"========================================\")\n\tprintln(users.Render(\"badname\"))\n}\n\n// Output:\n// * [archives](/r/demo/users:archives)\n// * [demo](/r/demo/users:demo)\n// * [gno](/r/demo/users:gno)\n// * [gnoland](/r/demo/users:gnoland)\n// * [gnolang](/r/demo/users:gnolang)\n// * [gnouser](/r/demo/users:gnouser)\n// * [gov](/r/demo/users:gov)\n// * [nt](/r/demo/users:nt)\n// * [satoshi](/r/demo/users:satoshi)\n// * [sys](/r/demo/users:sys)\n// * [test1](/r/demo/users:test1)\n// * [x](/r/demo/users:x)\n//\n// ========================================\n// ## user gnouser\n//\n// * address = g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm\n// * 9 invites\n//\n// my profile\n//\n// ========================================\n// ## user satoshi\n//\n// * address = g1w3jhxap3ta047h6lta047h6lta047h6l4mfnm7\n// * 0 invites\n// * invited by g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm\n//\n// my other profile\n//\n// ========================================\n// unknown username badname\n"},{"name":"z_6_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\")\n\nfunc main() {\n\tcaller := std.GetOrigCaller()\n\t// as admin, grant invites to unregistered user.\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\")\n\tprintln(\"done\")\n}\n\n// Error:\n// invalid user g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm\n"},{"name":"z_7_filetest.gno","body":"package main\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\")\n\nfunc main() {\n\tcaller := std.GetOrigCaller() // main\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\t// as admin, grant invites to gnouser\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\")\n\t// switch back to caller\n\tstd.TestSetOrigCaller(caller)\n\t// invite another addr\n\ttest1 := testutils.TestAddress(\"test1\")\n\tusers.Invite(test1.String())\n\t// switch to test1\n\tstd.TestSetOrigCaller(test1)\n\tstd.TestSetOrigSend(std.Coins{{\"dontcare\", 1}}, nil)\n\tusers.Register(caller, \"satoshi\", \"my other profile\")\n\t// as admin, grant invites to gnouser(again) and satoshi.\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\\n\" + test1.String() + \":1\")\n\tprintln(\"done\")\n}\n\n// Output:\n// done\n"},{"name":"z_7b_filetest.gno","body":"package main\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\")\n\nfunc main() {\n\tcaller := std.GetOrigCaller() // main\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\t// as admin, grant invites to gnouser\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\\n\")\n\t// switch back to caller\n\tstd.TestSetOrigCaller(caller)\n\t// invite another addr\n\ttest1 := testutils.TestAddress(\"test1\")\n\tusers.Invite(test1.String())\n\t// switch to test1\n\tstd.TestSetOrigCaller(test1)\n\tstd.TestSetOrigSend(std.Coins{{\"dontcare\", 1}}, nil)\n\tusers.Register(caller, \"satoshi\", \"my other profile\")\n\t// as admin, grant invites to gnouser(again) and satoshi.\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\\n\" + test1.String() + \":1\")\n\tprintln(\"done\")\n}\n\n// Output:\n// done\n"},{"name":"z_8_filetest.gno","body":"package main\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\")\n\nfunc main() {\n\tcaller := std.GetOrigCaller() // main\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\t// as admin, grant invites to gnouser\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\")\n\t// switch back to caller\n\tstd.TestSetOrigCaller(caller)\n\t// invite another addr\n\ttest1 := testutils.TestAddress(\"test1\")\n\tusers.Invite(test1.String())\n\t// switch to test1\n\tstd.TestSetOrigCaller(test1)\n\tstd.TestSetOrigSend(std.Coins{{\"dontcare\", 1}}, nil)\n\tusers.Register(caller, \"satoshi\", \"my other profile\")\n\t// as admin, grant invites to gnouser(again) and nonexistent user.\n\tstd.TestSetOrigCaller(admin)\n\ttest2 := testutils.TestAddress(\"test2\")\n\tusers.GrantInvites(caller.String() + \":1\\n\" + test2.String() + \":1\")\n\tprintln(\"done\")\n}\n\n// Error:\n// invalid user g1w3jhxapjta047h6lta047h6lta047h6laqcyu4\n"},{"name":"z_9_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\")\n\nfunc main() {\n\tcaller := std.GetOrigCaller() // main\n\ttest2 := testutils.TestAddress(\"test2\")\n\t// as admin, invite gnouser and test2\n\tstd.TestSetOrigCaller(admin)\n\tusers.Invite(caller.String() + \"\\n\" + test2.String())\n\t// register as caller\n\tstd.TestSetOrigCaller(caller)\n\tusers.Register(admin, \"gnouser\", \"my profile\")\n\t// register as test2\n\tstd.TestSetOrigCaller(test2)\n\tusers.Register(admin, \"test222\", \"my profile 2\")\n\tprintln(\"done\")\n}\n\n// Output:\n// done\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"boards","path":"gno.land/r/demo/boards","files":[{"name":"README.md","body":"This is a demo of Gno smart contract programming. This document was\nconstructed by Gno onto a smart contract hosted on the data Realm\nname [\"gno.land/r/demo/boards\"](https://gno.land/r/demo/boards/)\n([github](https://github.com/gnolang/gno/tree/master/examples/gno.land/r/demo/boards)).\n\n\n\n## Build `gnokey`, create your account, and interact with Gno.\n\nNOTE: Where you see `-remote localhost:26657` here, that flag can be replaced\nwith `-remote test3.gno.land:26657` if you have $GNOT on the testnet.\n(To use the testnet, also replace `-chainid dev` with `-chainid test3` .)\n\n### Build `gnokey` (and other tools).\n\n```bash\ngit clone git@github.com:gnolang/gno.git\ncd gno/gno.land\nmake build\n```\n\n### Generate a seed/mnemonic code.\n\n```bash\n./build/gnokey generate\n```\n\nNOTE: You can generate 24 words with any good bip39 generator.\n\n### Create a new account using your mnemonic.\n\n```bash\n./build/gnokey add -recover KEYNAME\n```\n\nNOTE: `KEYNAME` is your key identifier, and should be changed.\n\n### Verify that you can see your account locally.\n\n```bash\n./build/gnokey list\n```\n\nTake note of your `addr` which looks something like `g17sphqax3kasjptdkmuqvn740u8dhtx4kxl6ljf` .\nYou will use this as your `ACCOUNT_ADDR`.\n\n## Interact with the blockchain.\n\n### Add $GNOT for your account.\n\nBefore starting the `gnoland` node for the first time, your new account can be given $GNOT in the node genesis.\nEdit the file `gno.land/genesis/genesis_balances.txt` and add the following line (simlar to the others), using\nyour `ACCOUNT_ADDR` and `KEYNAME`\n\n`ACCOUNT_ADDR=10000000000ugnot # @KEYNAME`\n\n### Alternative: Run a faucet to add $GNOT.\n\nInstead of editing `gno.land/genesis/genesis_balances.txt`, a more general solution (with more steps)\nis to run a local \"faucet\" and use the web browser to add $GNOT. (This can be done at any time.)\nSee this page: https://github.com/gnolang/gno/blob/master/contribs/gnofaucet/README.md\n\n\n### Start the `gnoland` node.\n\n```bash\n./build/gnoland start\n```\n\nNOTE: The node already has the \"boards\" realm.\n\nLeave this running in the terminal. In a new terminal, cd to the same folder `gno/gno.land` .\n\n### Get your current balance, account number, and sequence number.\n\n```bash\n./build/gnokey query auth/accounts/ACCOUNT_ADDR -remote localhost:26657\n```\n\n### Register a board username with a smart contract call.\n\nThe `USERNAME` for posting can different than your `KEYNAME`. It is internally linked to your `ACCOUNT_ADDR`. It must be at least 6 characters, lowercase alphanumeric with underscore.\n\n```bash\n./build/gnokey maketx call -pkgpath \"gno.land/r/demo/users\" -func \"Register\" -args \"\" -args \"USERNAME\" -args \"Profile description\" -gas-fee \"10000000ugnot\" -gas-wanted \"2000000\" -send \"200000000ugnot\" -broadcast -chainid dev -remote 127.0.0.1:26657 KEYNAME\n```\n\nInteractive documentation: https://test3.gno.land/r/demo/users?help\u0026__func=Register\n\n### Create a board with a smart contract call.\n\n```bash\n./build/gnokey maketx call -pkgpath \"gno.land/r/demo/boards\" -func \"CreateBoard\" -args \"BOARDNAME\" -gas-fee \"1000000ugnot\" -gas-wanted \"10000000\" -broadcast -chainid dev -remote localhost:26657 KEYNAME\n```\n\nInteractive documentation: https://test3.gno.land/r/demo/boards?help\u0026__func=CreateBoard\n\nNext, query for the permanent board ID by querying (you need this to create a new post):\n\n```bash\n./build/gnokey query \"vm/qeval\" -data 'gno.land/r/demo/boards.GetBoardIDFromName(\"BOARDNAME\")' -remote localhost:26657\n```\n\n### Create a post of a board with a smart contract call.\n\nNOTE: If a board was created successfully, your SEQUENCE_NUMBER would have increased.\n\n```bash\n./build/gnokey maketx call -pkgpath \"gno.land/r/demo/boards\" -func \"CreateThread\" -args BOARD_ID -args \"Hello gno.land\" -args \"Text of the post\" -gas-fee 1000000ugnot -gas-wanted 2000000 -broadcast -chainid dev -remote localhost:26657 KEYNAME\n```\n\nInteractive documentation: https://test3.gno.land/r/demo/boards?help\u0026__func=CreateThread\n\n### Create a comment to a post.\n\n```bash\n./build/gnokey maketx call -pkgpath \"gno.land/r/demo/boards\" -func \"CreateReply\" -args BOARD_ID -args \"1\" -args \"1\" -args \"Nice to meet you too.\" -gas-fee 1000000ugnot -gas-wanted 2000000 -broadcast -chainid dev -remote localhost:26657 KEYNAME\n```\n\nInteractive documentation: https://test3.gno.land/r/demo/boards?help\u0026__func=CreateReply\n\n```bash\n./build/gnokey query \"vm/qrender\" -data \"gno.land/r/demo/boards:BOARDNAME/1\" -remote localhost:26657\n```\n\n### Render page with optional path expression.\n\nThe contents of `https://gno.land/r/demo/boards:` and `https://gno.land/r/demo/boards:gnolang` are rendered by calling\nthe `Render(path string)` function like so:\n\n```bash\n./build/gnokey query \"vm/qrender\" -data \"gno.land/r/demo/boards:gnolang\"\n```\n## View the board in the browser.\n\n### Start the web server.\n\n```bash\n./build/gnoweb\n```\n\nThis should print something like `Running on http://127.0.0.1:8888` . Leave this running in the terminal.\n\n### View in the browser\n\nIn your browser, navigate to the printed address http://127.0.0.1:8888 .\nTo see you post, click on the package `/r/demo/boards` .\n"},{"name":"board.gno","body":"package boards\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"gno.land/p/demo/avl\"\n)\n\n//----------------------------------------\n// Board\n\ntype BoardID uint64\n\nfunc (bid BoardID) String() string {\n\treturn strconv.Itoa(int(bid))\n}\n\ntype Board struct {\n\tid BoardID // only set for public boards.\n\turl string\n\tname string\n\tcreator std.Address\n\tthreads avl.Tree // Post.id -\u003e *Post\n\tpostsCtr uint64 // increments Post.id\n\tcreatedAt time.Time\n\tdeleted avl.Tree // TODO reserved for fast-delete.\n}\n\nfunc newBoard(id BoardID, url string, name string, creator std.Address) *Board {\n\tif !reName.MatchString(name) {\n\t\tpanic(\"invalid name: \" + name)\n\t}\n\texists := gBoardsByName.Has(name)\n\tif exists {\n\t\tpanic(\"board already exists\")\n\t}\n\treturn \u0026Board{\n\t\tid: id,\n\t\turl: url,\n\t\tname: name,\n\t\tcreator: creator,\n\t\tthreads: avl.Tree{},\n\t\tcreatedAt: time.Now(),\n\t\tdeleted: avl.Tree{},\n\t}\n}\n\n/* TODO support this once we figure out how to ensure URL correctness.\n// A private board is not tracked by gBoards*,\n// but must be persisted by the caller's realm.\n// Private boards have 0 id and does not ping\n// back the remote board on reposts.\nfunc NewPrivateBoard(url string, name string, creator std.Address) *Board {\n\treturn newBoard(0, url, name, creator)\n}\n*/\n\nfunc (board *Board) IsPrivate() bool {\n\treturn board.id == 0\n}\n\nfunc (board *Board) GetThread(pid PostID) *Post {\n\tpidkey := postIDKey(pid)\n\tpostI, exists := board.threads.Get(pidkey)\n\tif !exists {\n\t\treturn nil\n\t}\n\treturn postI.(*Post)\n}\n\nfunc (board *Board) AddThread(creator std.Address, title string, body string) *Post {\n\tpid := board.incGetPostID()\n\tpidkey := postIDKey(pid)\n\tthread := newPost(board, pid, creator, title, body, pid, 0, 0)\n\tboard.threads.Set(pidkey, thread)\n\treturn thread\n}\n\n// NOTE: this can be potentially very expensive for threads with many replies.\n// TODO: implement optional fast-delete where thread is simply moved.\nfunc (board *Board) DeleteThread(pid PostID) {\n\tpidkey := postIDKey(pid)\n\t_, removed := board.threads.Remove(pidkey)\n\tif !removed {\n\t\tpanic(\"thread does not exist with id \" + pid.String())\n\t}\n}\n\nfunc (board *Board) HasPermission(addr std.Address, perm Permission) bool {\n\tif board.creator == addr {\n\t\tswitch perm {\n\t\tcase EditPermission:\n\t\t\treturn true\n\t\tcase DeletePermission:\n\t\t\treturn true\n\t\tdefault:\n\t\t\treturn false\n\t\t}\n\t}\n\treturn false\n}\n\n// Renders the board for display suitable as plaintext in\n// console. This is suitable for demonstration or tests,\n// but not for prod.\nfunc (board *Board) RenderBoard() string {\n\tstr := \"\"\n\tstr += \"\\\\[[post](\" + board.GetPostFormURL() + \")]\\n\\n\"\n\tif board.threads.Size() \u003e 0 {\n\t\tboard.threads.Iterate(\"\", \"\", func(key string, value interface{}) bool {\n\t\t\tif str != \"\" {\n\t\t\t\tstr += \"----------------------------------------\\n\"\n\t\t\t}\n\t\t\tstr += value.(*Post).RenderSummary() + \"\\n\"\n\t\t\treturn false\n\t\t})\n\t}\n\treturn str\n}\n\nfunc (board *Board) incGetPostID() PostID {\n\tboard.postsCtr++\n\treturn PostID(board.postsCtr)\n}\n\nfunc (board *Board) GetURLFromThreadAndReplyID(threadID, replyID PostID) string {\n\tif replyID == 0 {\n\t\treturn board.url + \"/\" + threadID.String()\n\t} else {\n\t\treturn board.url + \"/\" + threadID.String() + \"/\" + replyID.String()\n\t}\n}\n\nfunc (board *Board) GetPostFormURL() string {\n\treturn \"/r/demo/boards?help\u0026__func=CreateThread\" +\n\t\t\"\u0026bid=\" + board.id.String() +\n\t\t\"\u0026body.type=textarea\"\n}\n"},{"name":"boards.gno","body":"package boards\n\nimport (\n\t\"regexp\"\n\n\t\"gno.land/p/demo/avl\"\n)\n\n//----------------------------------------\n// Realm (package) state\n\nvar (\n\tgBoards avl.Tree // id -\u003e *Board\n\tgBoardsCtr int // increments Board.id\n\tgBoardsByName avl.Tree // name -\u003e *Board\n\tgDefaultAnonFee = 100000000 // minimum fee required if anonymous\n)\n\n//----------------------------------------\n// Constants\n\nvar reName = regexp.MustCompile(`^[a-z]+[_a-z0-9]{2,29}$`)\n"},{"name":"misc.gno","body":"package boards\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"gno.land/r/demo/users\"\n)\n\n//----------------------------------------\n// private utility methods\n// XXX ensure these cannot be called from public.\n\nfunc getBoard(bid BoardID) *Board {\n\tbidkey := boardIDKey(bid)\n\tboard_, exists := gBoards.Get(bidkey)\n\tif !exists {\n\t\treturn nil\n\t}\n\tboard := board_.(*Board)\n\treturn board\n}\n\nfunc incGetBoardID() BoardID {\n\tgBoardsCtr++\n\treturn BoardID(gBoardsCtr)\n}\n\nfunc padLeft(str string, length int) string {\n\tif len(str) \u003e= length {\n\t\treturn str\n\t} else {\n\t\treturn strings.Repeat(\" \", length-len(str)) + str\n\t}\n}\n\nfunc padZero(u64 uint64, length int) string {\n\tstr := strconv.Itoa(int(u64))\n\tif len(str) \u003e= length {\n\t\treturn str\n\t} else {\n\t\treturn strings.Repeat(\"0\", length-len(str)) + str\n\t}\n}\n\nfunc boardIDKey(bid BoardID) string {\n\treturn padZero(uint64(bid), 10)\n}\n\nfunc postIDKey(pid PostID) string {\n\treturn padZero(uint64(pid), 10)\n}\n\nfunc indentBody(indent string, body string) string {\n\tlines := strings.Split(body, \"\\n\")\n\tres := \"\"\n\tfor i, line := range lines {\n\t\tif i \u003e 0 {\n\t\t\tres += \"\\n\"\n\t\t}\n\t\tres += indent + line\n\t}\n\treturn res\n}\n\n// NOTE: length must be greater than 3.\nfunc summaryOf(str string, length int) string {\n\tlines := strings.SplitN(str, \"\\n\", 2)\n\tline := lines[0]\n\tif len(line) \u003e length {\n\t\tline = line[:(length-3)] + \"...\"\n\t} else if len(lines) \u003e 1 {\n\t\t// len(line) \u003c= 80\n\t\tline = line + \"...\"\n\t}\n\treturn line\n}\n\nfunc displayAddressMD(addr std.Address) string {\n\tuser := users.GetUserByAddress(addr)\n\tif user == nil {\n\t\treturn \"[\" + addr.String() + \"](/r/demo/users:\" + addr.String() + \")\"\n\t} else {\n\t\treturn \"[@\" + user.Name + \"](/r/demo/users:\" + user.Name + \")\"\n\t}\n}\n\nfunc usernameOf(addr std.Address) string {\n\tuser := users.GetUserByAddress(addr)\n\tif user == nil {\n\t\treturn \"\"\n\t}\n\treturn user.Name\n}\n"},{"name":"post.gno","body":"package boards\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"gno.land/p/demo/avl\"\n)\n\n//----------------------------------------\n// Post\n\n// NOTE: a PostID is relative to the board.\ntype PostID uint64\n\nfunc (pid PostID) String() string {\n\treturn strconv.Itoa(int(pid))\n}\n\n// A Post is a \"thread\" or a \"reply\" depending on context.\n// A thread is a Post of a Board that holds other replies.\ntype Post struct {\n\tboard *Board\n\tid PostID\n\tcreator std.Address\n\ttitle string // optional\n\tbody string\n\treplies avl.Tree // Post.id -\u003e *Post\n\trepliesAll avl.Tree // Post.id -\u003e *Post (all replies, for top-level posts)\n\treposts avl.Tree // Board.id -\u003e Post.id\n\tthreadID PostID // original Post.id\n\tparentID PostID // parent Post.id (if reply or repost)\n\trepostBoard BoardID // original Board.id (if repost)\n\tcreatedAt time.Time\n\tupdatedAt time.Time\n}\n\nfunc newPost(board *Board, id PostID, creator std.Address, title, body string, threadID, parentID PostID, repostBoard BoardID) *Post {\n\treturn \u0026Post{\n\t\tboard: board,\n\t\tid: id,\n\t\tcreator: creator,\n\t\ttitle: title,\n\t\tbody: body,\n\t\treplies: avl.Tree{},\n\t\trepliesAll: avl.Tree{},\n\t\treposts: avl.Tree{},\n\t\tthreadID: threadID,\n\t\tparentID: parentID,\n\t\trepostBoard: repostBoard,\n\t\tcreatedAt: time.Now(),\n\t}\n}\n\nfunc (post *Post) IsThread() bool {\n\treturn post.parentID == 0\n}\n\nfunc (post *Post) GetPostID() PostID {\n\treturn post.id\n}\n\nfunc (post *Post) AddReply(creator std.Address, body string) *Post {\n\tboard := post.board\n\tpid := board.incGetPostID()\n\tpidkey := postIDKey(pid)\n\treply := newPost(board, pid, creator, \"\", body, post.threadID, post.id, 0)\n\tpost.replies.Set(pidkey, reply)\n\tif post.threadID == post.id {\n\t\tpost.repliesAll.Set(pidkey, reply)\n\t} else {\n\t\tthread := board.GetThread(post.threadID)\n\t\tthread.repliesAll.Set(pidkey, reply)\n\t}\n\treturn reply\n}\n\nfunc (post *Post) Update(title string, body string) {\n\tpost.title = title\n\tpost.body = body\n\tpost.updatedAt = time.Now()\n}\n\nfunc (thread *Post) GetReply(pid PostID) *Post {\n\tpidkey := postIDKey(pid)\n\treplyI, ok := thread.repliesAll.Get(pidkey)\n\tif !ok {\n\t\treturn nil\n\t} else {\n\t\treturn replyI.(*Post)\n\t}\n}\n\nfunc (post *Post) AddRepostTo(creator std.Address, title, body string, dst *Board) *Post {\n\tif !post.IsThread() {\n\t\tpanic(\"cannot repost non-thread post\")\n\t}\n\tpid := dst.incGetPostID()\n\tpidkey := postIDKey(pid)\n\trepost := newPost(dst, pid, creator, title, body, pid, post.id, post.board.id)\n\tdst.threads.Set(pidkey, repost)\n\tif !dst.IsPrivate() {\n\t\tbidkey := boardIDKey(dst.id)\n\t\tpost.reposts.Set(bidkey, pid)\n\t}\n\treturn repost\n}\n\nfunc (thread *Post) DeletePost(pid PostID) {\n\tif thread.id == pid {\n\t\tpanic(\"should not happen\")\n\t}\n\tpidkey := postIDKey(pid)\n\tpostI, removed := thread.repliesAll.Remove(pidkey)\n\tif !removed {\n\t\tpanic(\"post not found in thread\")\n\t}\n\tpost := postI.(*Post)\n\tif post.parentID != thread.id {\n\t\tparent := thread.GetReply(post.parentID)\n\t\tparent.replies.Remove(pidkey)\n\t} else {\n\t\tthread.replies.Remove(pidkey)\n\t}\n}\n\nfunc (post *Post) HasPermission(addr std.Address, perm Permission) bool {\n\tif post.creator == addr {\n\t\tswitch perm {\n\t\tcase EditPermission:\n\t\t\treturn true\n\t\tcase DeletePermission:\n\t\t\treturn true\n\t\tdefault:\n\t\t\treturn false\n\t\t}\n\t}\n\t// post notes inherit permissions of the board.\n\treturn post.board.HasPermission(addr, perm)\n}\n\nfunc (post *Post) GetSummary() string {\n\treturn summaryOf(post.body, 80)\n}\n\nfunc (post *Post) GetURL() string {\n\tif post.IsThread() {\n\t\treturn post.board.GetURLFromThreadAndReplyID(\n\t\t\tpost.id, 0)\n\t} else {\n\t\treturn post.board.GetURLFromThreadAndReplyID(\n\t\t\tpost.threadID, post.id)\n\t}\n}\n\nfunc (post *Post) GetReplyFormURL() string {\n\treturn \"/r/demo/boards?help\u0026__func=CreateReply\" +\n\t\t\"\u0026bid=\" + post.board.id.String() +\n\t\t\"\u0026threadid=\" + post.threadID.String() +\n\t\t\"\u0026postid=\" + post.id.String() +\n\t\t\"\u0026body.type=textarea\"\n}\n\nfunc (post *Post) GetRepostFormURL() string {\n\treturn \"/r/demo/boards?help\u0026__func=CreateRepost\" +\n\t\t\"\u0026bid=\" + post.board.id.String() +\n\t\t\"\u0026postid=\" + post.id.String() +\n\t\t\"\u0026title.type=textarea\" +\n\t\t\"\u0026body.type=textarea\" +\n\t\t\"\u0026dstBoardID.type=textarea\"\n}\n\nfunc (post *Post) GetDeleteFormURL() string {\n\treturn \"/r/demo/boards?help\u0026__func=DeletePost\" +\n\t\t\"\u0026bid=\" + post.board.id.String() +\n\t\t\"\u0026threadid=\" + post.threadID.String() +\n\t\t\"\u0026postid=\" + post.id.String()\n}\n\nfunc (post *Post) RenderSummary() string {\n\tif post.repostBoard != 0 {\n\t\tdstBoard := getBoard(post.repostBoard)\n\t\tif dstBoard == nil {\n\t\t\tpanic(\"repostBoard does not exist\")\n\t\t}\n\t\tthread := dstBoard.GetThread(PostID(post.parentID))\n\t\tif thread == nil {\n\t\t\treturn \"reposted post does not exist\"\n\t\t}\n\t\treturn \"Repost: \" + post.GetSummary() + \"\\n\" + thread.RenderSummary()\n\t}\n\tstr := \"\"\n\tif post.title != \"\" {\n\t\tstr += \"## [\" + summaryOf(post.title, 80) + \"](\" + post.GetURL() + \")\\n\"\n\t\tstr += \"\\n\"\n\t}\n\tstr += post.GetSummary() + \"\\n\"\n\tstr += \"\\\\- \" + displayAddressMD(post.creator) + \",\"\n\tstr += \" [\" + post.createdAt.Format(\"2006-01-02 3:04pm MST\") + \"](\" + post.GetURL() + \")\"\n\tstr += \" \\\\[[x](\" + post.GetDeleteFormURL() + \")]\"\n\tstr += \" (\" + strconv.Itoa(post.replies.Size()) + \" replies)\"\n\tstr += \" (\" + strconv.Itoa(post.reposts.Size()) + \" reposts)\" + \"\\n\"\n\treturn str\n}\n\nfunc (post *Post) RenderPost(indent string, levels int) string {\n\tif post == nil {\n\t\treturn \"nil post\"\n\t}\n\tstr := \"\"\n\tif post.title != \"\" {\n\t\tstr += indent + \"# \" + post.title + \"\\n\"\n\t\tstr += indent + \"\\n\"\n\t}\n\tstr += indentBody(indent, post.body) + \"\\n\" // TODO: indent body lines.\n\tstr += indent + \"\\\\- \" + displayAddressMD(post.creator) + \", \"\n\tstr += \"[\" + post.createdAt.Format(\"2006-01-02 3:04pm (MST)\") + \"](\" + post.GetURL() + \")\"\n\tstr += \" \\\\[[reply](\" + post.GetReplyFormURL() + \")]\"\n\tif post.IsThread() {\n\t\tstr += \" \\\\[[repost](\" + post.GetRepostFormURL() + \")]\"\n\t}\n\tstr += \" \\\\[[x](\" + post.GetDeleteFormURL() + \")]\\n\"\n\tif levels \u003e 0 {\n\t\tif post.replies.Size() \u003e 0 {\n\t\t\tpost.replies.Iterate(\"\", \"\", func(key string, value interface{}) bool {\n\t\t\t\tstr += indent + \"\\n\"\n\t\t\t\tstr += value.(*Post).RenderPost(indent+\"\u003e \", levels-1)\n\t\t\t\treturn false\n\t\t\t})\n\t\t}\n\t} else {\n\t\tif post.replies.Size() \u003e 0 {\n\t\t\tstr += indent + \"\\n\"\n\t\t\tstr += indent + \"_[see all \" + strconv.Itoa(post.replies.Size()) + \" replies](\" + post.GetURL() + \")_\\n\"\n\t\t}\n\t}\n\treturn str\n}\n\n// render reply and link to context thread\nfunc (post *Post) RenderInner() string {\n\tif post.IsThread() {\n\t\tpanic(\"unexpected thread\")\n\t}\n\tthreadID := post.threadID\n\t// replyID := post.id\n\tparentID := post.parentID\n\tstr := \"\"\n\tstr += \"_[see thread](\" + post.board.GetURLFromThreadAndReplyID(\n\t\tthreadID, 0) + \")_\\n\\n\"\n\tthread := post.board.GetThread(post.threadID)\n\tvar parent *Post\n\tif thread.id == parentID {\n\t\tparent = thread\n\t} else {\n\t\tparent = thread.GetReply(parentID)\n\t}\n\tstr += parent.RenderPost(\"\", 0)\n\tstr += \"\\n\"\n\tstr += post.RenderPost(\"\u003e \", 5)\n\treturn str\n}\n"},{"name":"public.gno","body":"package boards\n\nimport (\n\t\"std\"\n\t\"strconv\"\n)\n\n//----------------------------------------\n// Public facing functions\n\nfunc GetBoardIDFromName(name string) (BoardID, bool) {\n\tboardI, exists := gBoardsByName.Get(name)\n\tif !exists {\n\t\treturn 0, false\n\t}\n\treturn boardI.(*Board).id, true\n}\n\nfunc CreateBoard(name string) BoardID {\n\tif !(std.IsOriginCall() || std.PrevRealm().IsUser()) {\n\t\tpanic(\"invalid non-user call\")\n\t}\n\tbid := incGetBoardID()\n\tcaller := std.GetOrigCaller()\n\tif usernameOf(caller) == \"\" {\n\t\tpanic(\"unauthorized\")\n\t}\n\turl := \"/r/demo/boards:\" + name\n\tboard := newBoard(bid, url, name, caller)\n\tbidkey := boardIDKey(bid)\n\tgBoards.Set(bidkey, board)\n\tgBoardsByName.Set(name, board)\n\treturn board.id\n}\n\nfunc checkAnonFee() bool {\n\tsent := std.GetOrigSend()\n\tanonFeeCoin := std.NewCoin(\"ugnot\", int64(gDefaultAnonFee))\n\tif len(sent) == 1 \u0026\u0026 sent[0].IsGTE(anonFeeCoin) {\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc CreateThread(bid BoardID, title string, body string) PostID {\n\tif !(std.IsOriginCall() || std.PrevRealm().IsUser()) {\n\t\tpanic(\"invalid non-user call\")\n\t}\n\tcaller := std.GetOrigCaller()\n\tif usernameOf(caller) == \"\" {\n\t\tif !checkAnonFee() {\n\t\t\tpanic(\"please register, otherwise minimum fee \" + strconv.Itoa(gDefaultAnonFee) + \" is required if anonymous\")\n\t\t}\n\t}\n\tboard := getBoard(bid)\n\tif board == nil {\n\t\tpanic(\"board not exist\")\n\t}\n\tthread := board.AddThread(caller, title, body)\n\treturn thread.id\n}\n\nfunc CreateReply(bid BoardID, threadid, postid PostID, body string) PostID {\n\tif !(std.IsOriginCall() || std.PrevRealm().IsUser()) {\n\t\tpanic(\"invalid non-user call\")\n\t}\n\tcaller := std.GetOrigCaller()\n\tif usernameOf(caller) == \"\" {\n\t\tif !checkAnonFee() {\n\t\t\tpanic(\"please register, otherwise minimum fee \" + strconv.Itoa(gDefaultAnonFee) + \" is required if anonymous\")\n\t\t}\n\t}\n\tboard := getBoard(bid)\n\tif board == nil {\n\t\tpanic(\"board not exist\")\n\t}\n\tthread := board.GetThread(threadid)\n\tif thread == nil {\n\t\tpanic(\"thread not exist\")\n\t}\n\tif postid == threadid {\n\t\treply := thread.AddReply(caller, body)\n\t\treturn reply.id\n\t} else {\n\t\tpost := thread.GetReply(postid)\n\t\treply := post.AddReply(caller, body)\n\t\treturn reply.id\n\t}\n}\n\n// If dstBoard is private, does not ping back.\n// If board specified by bid is private, panics.\nfunc CreateRepost(bid BoardID, postid PostID, title string, body string, dstBoardID BoardID) PostID {\n\tif !(std.IsOriginCall() || std.PrevRealm().IsUser()) {\n\t\tpanic(\"invalid non-user call\")\n\t}\n\tcaller := std.GetOrigCaller()\n\tif usernameOf(caller) == \"\" {\n\t\t// TODO: allow with gDefaultAnonFee payment.\n\t\tif !checkAnonFee() {\n\t\t\tpanic(\"please register, otherwise minimum fee \" + strconv.Itoa(gDefaultAnonFee) + \" is required if anonymous\")\n\t\t}\n\t}\n\tboard := getBoard(bid)\n\tif board == nil {\n\t\tpanic(\"src board not exist\")\n\t}\n\tif board.IsPrivate() {\n\t\tpanic(\"cannot repost from a private board\")\n\t}\n\tdst := getBoard(dstBoardID)\n\tif dst == nil {\n\t\tpanic(\"dst board not exist\")\n\t}\n\tthread := board.GetThread(postid)\n\tif thread == nil {\n\t\tpanic(\"thread not exist\")\n\t}\n\trepost := thread.AddRepostTo(caller, title, body, dst)\n\treturn repost.id\n}\n\nfunc DeletePost(bid BoardID, threadid, postid PostID, reason string) {\n\tif !(std.IsOriginCall() || std.PrevRealm().IsUser()) {\n\t\tpanic(\"invalid non-user call\")\n\t}\n\tcaller := std.GetOrigCaller()\n\tboard := getBoard(bid)\n\tif board == nil {\n\t\tpanic(\"board not exist\")\n\t}\n\tthread := board.GetThread(threadid)\n\tif thread == nil {\n\t\tpanic(\"thread not exist\")\n\t}\n\tif postid == threadid {\n\t\t// delete thread\n\t\tif !thread.HasPermission(caller, DeletePermission) {\n\t\t\tpanic(\"unauthorized\")\n\t\t}\n\t\tboard.DeleteThread(threadid)\n\t} else {\n\t\t// delete thread's post\n\t\tpost := thread.GetReply(postid)\n\t\tif post == nil {\n\t\t\tpanic(\"post not exist\")\n\t\t}\n\t\tif !post.HasPermission(caller, DeletePermission) {\n\t\t\tpanic(\"unauthorized\")\n\t\t}\n\t\tthread.DeletePost(postid)\n\t}\n}\n\nfunc EditPost(bid BoardID, threadid, postid PostID, title, body string) {\n\tif !(std.IsOriginCall() || std.PrevRealm().IsUser()) {\n\t\tpanic(\"invalid non-user call\")\n\t}\n\tcaller := std.GetOrigCaller()\n\tboard := getBoard(bid)\n\tif board == nil {\n\t\tpanic(\"board not exist\")\n\t}\n\tthread := board.GetThread(threadid)\n\tif thread == nil {\n\t\tpanic(\"thread not exist\")\n\t}\n\tif postid == threadid {\n\t\t// edit thread\n\t\tif !thread.HasPermission(caller, EditPermission) {\n\t\t\tpanic(\"unauthorized\")\n\t\t}\n\t\tthread.Update(title, body)\n\t} else {\n\t\t// edit thread's post\n\t\tpost := thread.GetReply(postid)\n\t\tif post == nil {\n\t\t\tpanic(\"post not exist\")\n\t\t}\n\t\tif !post.HasPermission(caller, EditPermission) {\n\t\t\tpanic(\"unauthorized\")\n\t\t}\n\t\tpost.Update(title, body)\n\t}\n}\n"},{"name":"render.gno","body":"package boards\n\nimport (\n\t\"strconv\"\n\t\"strings\"\n)\n\n//----------------------------------------\n// Render functions\n\nfunc RenderBoard(bid BoardID) string {\n\tboard := getBoard(bid)\n\tif board == nil {\n\t\treturn \"missing board\"\n\t}\n\treturn board.RenderBoard()\n}\n\nfunc Render(path string) string {\n\tif path == \"\" {\n\t\tstr := \"These are all the boards of this realm:\\n\\n\"\n\t\tgBoards.Iterate(\"\", \"\", func(key string, value interface{}) bool {\n\t\t\tboard := value.(*Board)\n\t\t\tstr += \" * [\" + board.url + \"](\" + board.url + \")\\n\"\n\t\t\treturn false\n\t\t})\n\t\treturn str\n\t}\n\tparts := strings.Split(path, \"/\")\n\tif len(parts) == 1 {\n\t\t// /r/demo/boards:BOARD_NAME\n\t\tname := parts[0]\n\t\tboardI, exists := gBoardsByName.Get(name)\n\t\tif !exists {\n\t\t\treturn \"board does not exist: \" + name\n\t\t}\n\t\treturn boardI.(*Board).RenderBoard()\n\t} else if len(parts) == 2 {\n\t\t// /r/demo/boards:BOARD_NAME/THREAD_ID\n\t\tname := parts[0]\n\t\tboardI, exists := gBoardsByName.Get(name)\n\t\tif !exists {\n\t\t\treturn \"board does not exist: \" + name\n\t\t}\n\t\tpid, err := strconv.Atoi(parts[1])\n\t\tif err != nil {\n\t\t\treturn \"invalid thread id: \" + parts[1]\n\t\t}\n\t\tboard := boardI.(*Board)\n\t\tthread := board.GetThread(PostID(pid))\n\t\tif thread == nil {\n\t\t\treturn \"thread does not exist with id: \" + parts[1]\n\t\t}\n\t\treturn thread.RenderPost(\"\", 5)\n\t} else if len(parts) == 3 {\n\t\t// /r/demo/boards:BOARD_NAME/THREAD_ID/REPLY_ID\n\t\tname := parts[0]\n\t\tboardI, exists := gBoardsByName.Get(name)\n\t\tif !exists {\n\t\t\treturn \"board does not exist: \" + name\n\t\t}\n\t\tpid, err := strconv.Atoi(parts[1])\n\t\tif err != nil {\n\t\t\treturn \"invalid thread id: \" + parts[1]\n\t\t}\n\t\tboard := boardI.(*Board)\n\t\tthread := board.GetThread(PostID(pid))\n\t\tif thread == nil {\n\t\t\treturn \"thread does not exist with id: \" + parts[1]\n\t\t}\n\t\trid, err := strconv.Atoi(parts[2])\n\t\tif err != nil {\n\t\t\treturn \"invalid reply id: \" + parts[2]\n\t\t}\n\t\treply := thread.GetReply(PostID(rid))\n\t\tif reply == nil {\n\t\t\treturn \"reply does not exist with id: \" + parts[2]\n\t\t}\n\t\treturn reply.RenderInner()\n\t} else {\n\t\treturn \"unrecognized path \" + path\n\t}\n}\n"},{"name":"role.gno","body":"package boards\n\ntype Permission string\n\nconst (\n\tDeletePermission Permission = \"role:delete\"\n\tEditPermission Permission = \"role:edit\"\n)\n"},{"name":"z_0_a_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\nimport (\n\t\"gno.land/r/demo/boards\"\n)\n\nvar bid boards.BoardID\n\nfunc init() {\n\tbid = boards.CreateBoard(\"test_board\")\n\tboards.CreateThread(bid, \"First Post (title)\", \"Body of the first post. (body)\")\n\tpid := boards.CreateThread(bid, \"Second Post (title)\", \"Body of the second post. (body)\")\n\tboards.CreateReply(bid, pid, pid, \"Reply of the second post\")\n}\n\nfunc main() {\n\tprintln(boards.Render(\"test_board\"))\n}\n\n// Error:\n// unauthorized\n"},{"name":"z_0_b_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 19900000ugnot\n\nimport (\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar bid boards.BoardID\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tbid = boards.CreateBoard(\"test_board\")\n}\n\nfunc main() {\n\tprintln(boards.Render(\"test_board\"))\n}\n\n// Error:\n// payment must not be less than 20000000\n"},{"name":"z_0_c_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar bid boards.BoardID\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tboards.CreateThread(1, \"First Post (title)\", \"Body of the first post. (body)\")\n}\n\nfunc main() {\n\tprintln(boards.Render(\"test_board\"))\n}\n\n// Error:\n// board not exist\n"},{"name":"z_0_d_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar bid boards.BoardID\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tbid = boards.CreateBoard(\"test_board\")\n\tboards.CreateReply(bid, 0, 0, \"Reply of the second post\")\n}\n\nfunc main() {\n\tprintln(boards.Render(\"test_board\"))\n}\n\n// Error:\n// thread not exist\n"},{"name":"z_0_e_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar bid boards.BoardID\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tboards.CreateReply(bid, 0, 0, \"Reply of the second post\")\n}\n\nfunc main() {\n\tprintln(boards.Render(\"test_board\"))\n}\n\n// Error:\n// board not exist\n"},{"name":"z_0_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 20000000ugnot\n\nimport (\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar bid boards.BoardID\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\tbid = boards.CreateBoard(\"test_board\")\n\tboards.CreateThread(bid, \"First Post (title)\", \"Body of the first post. (body)\")\n\tpid := boards.CreateThread(bid, \"Second Post (title)\", \"Body of the second post. (body)\")\n\tboards.CreateReply(bid, pid, pid, \"Reply of the second post\")\n}\n\nfunc main() {\n\tprintln(boards.Render(\"test_board\"))\n}\n\n// Output:\n// \\[[post](/r/demo/boards?help\u0026__func=CreateThread\u0026bid=1\u0026body.type=textarea)]\n//\n// ----------------------------------------\n// ## [First Post (title)](/r/demo/boards:test_board/1)\n//\n// Body of the first post. (body)\n// \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm UTC](/r/demo/boards:test_board/1) \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=1\u0026postid=1)] (0 replies) (0 reposts)\n//\n// ----------------------------------------\n// ## [Second Post (title)](/r/demo/boards:test_board/2)\n//\n// Body of the second post. (body)\n// \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm UTC](/r/demo/boards:test_board/2) \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=2\u0026postid=2)] (1 replies) (0 reposts)\n"},{"name":"z_10_a_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tbid boards.BoardID\n\tpid boards.PostID\n)\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\tbid = boards.CreateBoard(\"test_board\")\n\tpid = boards.CreateThread(bid, \"First Post in (title)\", \"Body of the first post. (body)\")\n}\n\nfunc main() {\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n\t// boardId 2 not exist\n\tboards.DeletePost(2, pid, pid, \"\")\n\tprintln(\"----------------------------------------------------\")\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n}\n\n// Error:\n// board not exist\n"},{"name":"z_10_b_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tbid boards.BoardID\n\tpid boards.PostID\n)\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\tbid = boards.CreateBoard(\"test_board\")\n\tpid = boards.CreateThread(bid, \"First Post in (title)\", \"Body of the first post. (body)\")\n}\n\nfunc main() {\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n\t// pid of 2 not exist\n\tboards.DeletePost(bid, 2, 2, \"\")\n\tprintln(\"----------------------------------------------------\")\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n}\n\n// Error:\n// thread not exist\n"},{"name":"z_10_c_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tbid boards.BoardID\n\tpid boards.PostID\n\trid boards.PostID\n)\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\tbid = boards.CreateBoard(\"test_board\")\n\tpid = boards.CreateThread(bid, \"First Post in (title)\", \"Body of the first post. (body)\")\n\trid = boards.CreateReply(bid, pid, pid, \"First reply of the First post\\n\")\n}\n\nfunc main() {\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n\tboards.DeletePost(bid, pid, rid, \"\")\n\tprintln(\"----------------------------------------------------\")\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n}\n\n// Output:\n// # First Post in (title)\n//\n// Body of the first post. (body)\n// \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/1) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=1\u0026postid=1\u0026body.type=textarea)] \\[[repost](/r/demo/boards?help\u0026__func=CreateRepost\u0026bid=1\u0026postid=1\u0026title.type=textarea\u0026body.type=textarea\u0026dstBoardID.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=1\u0026postid=1)]\n//\n// \u003e First reply of the First post\n// \u003e\n// \u003e \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/1/2) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=1\u0026postid=2\u0026body.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=1\u0026postid=2)]\n//\n// ----------------------------------------------------\n// # First Post in (title)\n//\n// Body of the first post. (body)\n// \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/1) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=1\u0026postid=1\u0026body.type=textarea)] \\[[repost](/r/demo/boards?help\u0026__func=CreateRepost\u0026bid=1\u0026postid=1\u0026title.type=textarea\u0026body.type=textarea\u0026dstBoardID.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=1\u0026postid=1)]\n"},{"name":"z_10_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tbid boards.BoardID\n\tpid boards.PostID\n)\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\tbid = boards.CreateBoard(\"test_board\")\n\tpid = boards.CreateThread(bid, \"First Post in (title)\", \"Body of the first post. (body)\")\n}\n\nfunc main() {\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n\tboards.DeletePost(bid, pid, pid, \"\")\n\tprintln(\"----------------------------------------------------\")\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n}\n\n// Output:\n// # First Post in (title)\n//\n// Body of the first post. (body)\n// \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/1) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=1\u0026postid=1\u0026body.type=textarea)] \\[[repost](/r/demo/boards?help\u0026__func=CreateRepost\u0026bid=1\u0026postid=1\u0026title.type=textarea\u0026body.type=textarea\u0026dstBoardID.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=1\u0026postid=1)]\n//\n// ----------------------------------------------------\n// thread does not exist with id: 1\n"},{"name":"z_11_a_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tbid boards.BoardID\n\tpid boards.PostID\n)\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\tbid = boards.CreateBoard(\"test_board\")\n\tpid = boards.CreateThread(bid, \"First Post in (title)\", \"Body of the first post. (body)\")\n}\n\nfunc main() {\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n\t// board 2 not exist\n\tboards.EditPost(2, pid, pid, \"Edited: First Post in (title)\", \"Edited: Body of the first post. (body)\")\n\tprintln(\"----------------------------------------------------\")\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n}\n\n// Error:\n// board not exist\n"},{"name":"z_11_b_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tbid boards.BoardID\n\tpid boards.PostID\n)\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\tbid = boards.CreateBoard(\"test_board\")\n\tpid = boards.CreateThread(bid, \"First Post in (title)\", \"Body of the first post. (body)\")\n}\n\nfunc main() {\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n\t// thread 2 not exist\n\tboards.EditPost(bid, 2, pid, \"Edited: First Post in (title)\", \"Edited: Body of the first post. (body)\")\n\tprintln(\"----------------------------------------------------\")\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n}\n\n// Error:\n// thread not exist\n"},{"name":"z_11_c_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tbid boards.BoardID\n\tpid boards.PostID\n)\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\tbid = boards.CreateBoard(\"test_board\")\n\tpid = boards.CreateThread(bid, \"First Post in (title)\", \"Body of the first post. (body)\")\n}\n\nfunc main() {\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n\t// post 2 not exist\n\tboards.EditPost(bid, pid, 2, \"Edited: First Post in (title)\", \"Edited: Body of the first post. (body)\")\n\tprintln(\"----------------------------------------------------\")\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n}\n\n// Error:\n// post not exist\n"},{"name":"z_11_d_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tbid boards.BoardID\n\tpid boards.PostID\n\trid boards.PostID\n)\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\tbid = boards.CreateBoard(\"test_board\")\n\tpid = boards.CreateThread(bid, \"First Post in (title)\", \"Body of the first post. (body)\")\n\trid = boards.CreateReply(bid, pid, pid, \"First reply of the First post\\n\")\n}\n\nfunc main() {\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n\tboards.EditPost(bid, pid, rid, \"\", \"Edited: First reply of the First post\\n\")\n\tprintln(\"----------------------------------------------------\")\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n}\n\n// Output:\n// # First Post in (title)\n//\n// Body of the first post. (body)\n// \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/1) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=1\u0026postid=1\u0026body.type=textarea)] \\[[repost](/r/demo/boards?help\u0026__func=CreateRepost\u0026bid=1\u0026postid=1\u0026title.type=textarea\u0026body.type=textarea\u0026dstBoardID.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=1\u0026postid=1)]\n//\n// \u003e First reply of the First post\n// \u003e\n// \u003e \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/1/2) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=1\u0026postid=2\u0026body.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=1\u0026postid=2)]\n//\n// ----------------------------------------------------\n// # First Post in (title)\n//\n// Body of the first post. (body)\n// \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/1) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=1\u0026postid=1\u0026body.type=textarea)] \\[[repost](/r/demo/boards?help\u0026__func=CreateRepost\u0026bid=1\u0026postid=1\u0026title.type=textarea\u0026body.type=textarea\u0026dstBoardID.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=1\u0026postid=1)]\n//\n// \u003e Edited: First reply of the First post\n// \u003e\n// \u003e \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/1/2) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=1\u0026postid=2\u0026body.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=1\u0026postid=2)]\n"},{"name":"z_11_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tbid boards.BoardID\n\tpid boards.PostID\n)\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\tbid = boards.CreateBoard(\"test_board\")\n\tpid = boards.CreateThread(bid, \"First Post in (title)\", \"Body of the first post. (body)\")\n}\n\nfunc main() {\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n\tboards.EditPost(bid, pid, pid, \"Edited: First Post in (title)\", \"Edited: Body of the first post. (body)\")\n\tprintln(\"----------------------------------------------------\")\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n}\n\n// Output:\n// # First Post in (title)\n//\n// Body of the first post. (body)\n// \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/1) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=1\u0026postid=1\u0026body.type=textarea)] \\[[repost](/r/demo/boards?help\u0026__func=CreateRepost\u0026bid=1\u0026postid=1\u0026title.type=textarea\u0026body.type=textarea\u0026dstBoardID.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=1\u0026postid=1)]\n//\n// ----------------------------------------------------\n// # Edited: First Post in (title)\n//\n// Edited: Body of the first post. (body)\n// \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/1) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=1\u0026postid=1\u0026body.type=textarea)] \\[[repost](/r/demo/boards?help\u0026__func=CreateRepost\u0026bid=1\u0026postid=1\u0026title.type=textarea\u0026body.type=textarea\u0026dstBoardID.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=1\u0026postid=1)]\n"},{"name":"z_12_a_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\t// create a post via registered user\n\tbid1 := boards.CreateBoard(\"test_board1\")\n\tpid := boards.CreateThread(bid1, \"First Post (title)\", \"Body of the first post. (body)\")\n\tbid2 := boards.CreateBoard(\"test_board2\")\n\n\t// create a repost via anon user\n\ttest2 := testutils.TestAddress(\"test2\")\n\tstd.TestSetOrigCaller(test2)\n\tstd.TestSetOrigSend(std.Coins{{\"ugnot\", 9000000}}, nil)\n\n\trid := boards.CreateRepost(bid1, pid, \"\", \"Check this out\", bid2)\n\tprintln(rid)\n\tprintln(boards.Render(\"test_board1\"))\n}\n\n// Error:\n// please register, otherwise minimum fee 100000000 is required if anonymous\n"},{"name":"z_12_b_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tbid1 := boards.CreateBoard(\"test_board1\")\n\tpid := boards.CreateThread(bid1, \"First Post (title)\", \"Body of the first post. (body)\")\n\tbid2 := boards.CreateBoard(\"test_board2\")\n\n\t// create a repost to a non-existing board\n\trid := boards.CreateRepost(5, pid, \"\", \"Check this out\", bid2)\n\tprintln(rid)\n\tprintln(boards.Render(\"test_board1\"))\n}\n\n// Error:\n// src board not exist\n"},{"name":"z_12_c_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tbid1 := boards.CreateBoard(\"test_board1\")\n\tboards.CreateThread(bid1, \"First Post (title)\", \"Body of the first post. (body)\")\n\tbid2 := boards.CreateBoard(\"test_board2\")\n\n\t// create a repost to a non-existing thread\n\trid := boards.CreateRepost(bid1, 5, \"\", \"Check this out\", bid2)\n\tprintln(rid)\n\tprintln(boards.Render(\"test_board1\"))\n}\n\n// Error:\n// thread not exist\n"},{"name":"z_12_d_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tbid1 := boards.CreateBoard(\"test_board1\")\n\tpid := boards.CreateThread(bid1, \"First Post (title)\", \"Body of the first post. (body)\")\n\tboards.CreateBoard(\"test_board2\")\n\n\t// create a repost to a non-existing destination board\n\trid := boards.CreateRepost(bid1, pid, \"\", \"Check this out\", 5)\n\tprintln(rid)\n\tprintln(boards.Render(\"test_board1\"))\n}\n\n// Error:\n// dst board not exist\n"},{"name":"z_12_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tbid1 boards.BoardID\n\tbid2 boards.BoardID\n\tpid boards.PostID\n)\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\tbid1 = boards.CreateBoard(\"test_board1\")\n\tpid = boards.CreateThread(bid1, \"First Post (title)\", \"Body of the first post. (body)\")\n\tbid2 = boards.CreateBoard(\"test_board2\")\n}\n\nfunc main() {\n\trid := boards.CreateRepost(bid1, pid, \"\", \"Check this out\", bid2)\n\tprintln(rid)\n\tprintln(boards.Render(\"test_board2\"))\n}\n\n// Output:\n// 1\n// \\[[post](/r/demo/boards?help\u0026__func=CreateThread\u0026bid=2\u0026body.type=textarea)]\n//\n// ----------------------------------------\n// Repost: Check this out\n// ## [First Post (title)](/r/demo/boards:test_board1/1)\n//\n// Body of the first post. (body)\n// \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm UTC](/r/demo/boards:test_board1/1) \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=1\u0026postid=1)] (0 replies) (1 reposts)\n"},{"name":"z_1_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar board *boards.Board\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\t_ = boards.CreateBoard(\"test_board_1\")\n\t_ = boards.CreateBoard(\"test_board_2\")\n}\n\nfunc main() {\n\tprintln(boards.Render(\"\"))\n}\n\n// Output:\n// These are all the boards of this realm:\n//\n// * [/r/demo/boards:test_board_1](/r/demo/boards:test_board_1)\n// * [/r/demo/boards:test_board_2](/r/demo/boards:test_board_2)\n"},{"name":"z_2_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tbid boards.BoardID\n\tpid boards.PostID\n)\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\tbid = boards.CreateBoard(\"test_board\")\n\tboards.CreateThread(bid, \"First Post (title)\", \"Body of the first post. (body)\")\n\tpid = boards.CreateThread(bid, \"Second Post (title)\", \"Body of the second post. (body)\")\n\tboards.CreateReply(bid, pid, pid, \"Reply of the second post\")\n}\n\nfunc main() {\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n}\n\n// Output:\n// # Second Post (title)\n//\n// Body of the second post. (body)\n// \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=2\u0026postid=2\u0026body.type=textarea)] \\[[repost](/r/demo/boards?help\u0026__func=CreateRepost\u0026bid=1\u0026postid=2\u0026title.type=textarea\u0026body.type=textarea\u0026dstBoardID.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=2\u0026postid=2)]\n//\n// \u003e Reply of the second post\n// \u003e \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2/3) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=2\u0026postid=3\u0026body.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=2\u0026postid=3)]\n"},{"name":"z_3_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tbid boards.BoardID\n\tpid boards.PostID\n)\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\tbid = boards.CreateBoard(\"test_board\")\n\tboards.CreateThread(bid, \"First Post (title)\", \"Body of the first post. (body)\")\n\tpid = boards.CreateThread(bid, \"Second Post (title)\", \"Body of the second post. (body)\")\n}\n\nfunc main() {\n\trid := boards.CreateReply(bid, pid, pid, \"Reply of the second post\")\n\tprintln(rid)\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n}\n\n// Output:\n// 3\n// # Second Post (title)\n//\n// Body of the second post. (body)\n// \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=2\u0026postid=2\u0026body.type=textarea)] \\[[repost](/r/demo/boards?help\u0026__func=CreateRepost\u0026bid=1\u0026postid=2\u0026title.type=textarea\u0026body.type=textarea\u0026dstBoardID.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=2\u0026postid=2)]\n//\n// \u003e Reply of the second post\n// \u003e \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2/3) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=2\u0026postid=3\u0026body.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=2\u0026postid=3)]\n"},{"name":"z_4_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tbid boards.BoardID\n\tpid boards.PostID\n)\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\tbid = boards.CreateBoard(\"test_board\")\n\tboards.CreateThread(bid, \"First Post (title)\", \"Body of the first post. (body)\")\n\tpid = boards.CreateThread(bid, \"Second Post (title)\", \"Body of the second post. (body)\")\n\trid := boards.CreateReply(bid, pid, pid, \"Reply of the second post\")\n\tprintln(rid)\n}\n\nfunc main() {\n\trid2 := boards.CreateReply(bid, pid, pid, \"Second reply of the second post\")\n\tprintln(rid2)\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n}\n\n// Output:\n// 3\n// 4\n// # Second Post (title)\n//\n// Body of the second post. (body)\n// \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=2\u0026postid=2\u0026body.type=textarea)] \\[[repost](/r/demo/boards?help\u0026__func=CreateRepost\u0026bid=1\u0026postid=2\u0026title.type=textarea\u0026body.type=textarea\u0026dstBoardID.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=2\u0026postid=2)]\n//\n// \u003e Reply of the second post\n// \u003e \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2/3) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=2\u0026postid=3\u0026body.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=2\u0026postid=3)]\n//\n// \u003e Second reply of the second post\n// \u003e \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2/4) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=2\u0026postid=4\u0026body.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=2\u0026postid=4)]\n\n// Realm:\n// switchrealm[\"gno.land/r/demo/users\"]\n// switchrealm[\"gno.land/r/demo/boards\"]\n// u[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:111]={\n// \"ObjectInfo\": {\n// \"ID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:111\",\n// \"ModTime\": \"123\",\n// \"OwnerID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:123\",\n// \"RefCount\": \"1\"\n// },\n// \"Value\": {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"68663c8895d37d479e417c11e21badfe21345c61\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:112\"\n// }\n// }\n// }\n// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:125]={\n// \"Fields\": [\n// {\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"16\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.StringValue\",\n// \"value\": \"0000000004\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/r/demo/boards.Post\"\n// }\n// },\n// \"V\": {\n// \"@type\": \"/gno.PointerValue\",\n// \"Base\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Escaped\": true,\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:126\"\n// },\n// \"Index\": \"0\",\n// \"TV\": null\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"64\"\n// }\n// },\n// {\n// \"N\": \"AQAAAAAAAAA=\",\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"32\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// }\n// }\n// ],\n// \"ObjectInfo\": {\n// \"ID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:125\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:124\",\n// \"RefCount\": \"1\"\n// }\n// }\n// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:124]={\n// \"ObjectInfo\": {\n// \"ID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:124\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:123\",\n// \"RefCount\": \"1\"\n// },\n// \"Value\": {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"3f34ac77289aa1d5f9a2f8b6d083138325816fb0\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:125\"\n// }\n// }\n// }\n// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:123]={\n// \"Fields\": [\n// {\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"16\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.StringValue\",\n// \"value\": \"0000000004\"\n// }\n// },\n// {},\n// {\n// \"N\": \"AQAAAAAAAAA=\",\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"64\"\n// }\n// },\n// {\n// \"N\": \"AgAAAAAAAAA=\",\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"32\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// },\n// \"V\": {\n// \"@type\": \"/gno.PointerValue\",\n// \"Base\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"94a6665a44bac6ede7f3e3b87173e537b12f9532\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:111\"\n// },\n// \"Index\": \"0\",\n// \"TV\": null\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// },\n// \"V\": {\n// \"@type\": \"/gno.PointerValue\",\n// \"Base\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"bc8e5b4e782a0bbc4ac9689681f119beb7b34d59\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:124\"\n// },\n// \"Index\": \"0\",\n// \"TV\": null\n// }\n// }\n// ],\n// \"ObjectInfo\": {\n// \"ID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:123\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:122\",\n// \"RefCount\": \"1\"\n// }\n// }\n// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:122]={\n// \"ObjectInfo\": {\n// \"ID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:122\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:106\",\n// \"RefCount\": \"1\"\n// },\n// \"Value\": {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"9957eadbc91dd32f33b0d815e041a32dbdea0671\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:123\"\n// }\n// }\n// }\n// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:128]={\n// \"Fields\": [\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// }\n// }\n// ],\n// \"ObjectInfo\": {\n// \"ID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:128\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:127\",\n// \"RefCount\": \"1\"\n// }\n// }\n// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:129]={\n// \"Fields\": [\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// }\n// }\n// ],\n// \"ObjectInfo\": {\n// \"ID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:129\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:127\",\n// \"RefCount\": \"1\"\n// }\n// }\n// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:130]={\n// \"Fields\": [\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// }\n// }\n// ],\n// \"ObjectInfo\": {\n// \"ID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:130\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:127\",\n// \"RefCount\": \"1\"\n// }\n// }\n// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:131]={\n// \"Fields\": [\n// {\n// \"N\": \"AAAAgJSeXbo=\",\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"65536\"\n// }\n// },\n// {\n// \"N\": \"AbSNdvQQIhE=\",\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"1024\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"time.Location\"\n// }\n// },\n// \"V\": {\n// \"@type\": \"/gno.PointerValue\",\n// \"Base\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Escaped\": true,\n// \"ObjectID\": \"336074805fc853987abe6f7fe3ad97a6a6f3077a:2\"\n// },\n// \"Index\": \"182\",\n// \"TV\": null\n// }\n// }\n// ],\n// \"ObjectInfo\": {\n// \"ID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:131\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:127\",\n// \"RefCount\": \"1\"\n// }\n// }\n// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:132]={\n// \"Fields\": [\n// {\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"65536\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"1024\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"time.Location\"\n// }\n// }\n// }\n// ],\n// \"ObjectInfo\": {\n// \"ID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:132\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:127\",\n// \"RefCount\": \"1\"\n// }\n// }\n// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:127]={\n// \"Fields\": [\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/r/demo/boards.Board\"\n// }\n// },\n// \"V\": {\n// \"@type\": \"/gno.PointerValue\",\n// \"Base\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Escaped\": true,\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:84\"\n// },\n// \"Index\": \"0\",\n// \"TV\": null\n// }\n// },\n// {\n// \"N\": \"BAAAAAAAAAA=\",\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/r/demo/boards.PostID\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"std.Address\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.StringValue\",\n// \"value\": \"g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"16\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.StringValue\",\n// \"value\": \"\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"16\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.StringValue\",\n// \"value\": \"Second reply of the second post\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Tree\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"f91e355bd19240f0f3350a7fa0e6a82b72225916\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:128\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Tree\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"9ee9c4117be283fc51ffcc5ecd65b75ecef5a9dd\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:129\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Tree\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"eb768b0140a5fe95f9c58747f0960d647dacfd42\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:130\"\n// }\n// },\n// {\n// \"N\": \"AgAAAAAAAAA=\",\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/r/demo/boards.PostID\"\n// }\n// },\n// {\n// \"N\": \"AgAAAAAAAAA=\",\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/r/demo/boards.PostID\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/r/demo/boards.BoardID\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"time.Time\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"0fd3352422af0a56a77ef2c9e88f479054e3d51f\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:131\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"time.Time\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"bed4afa8ffdbbf775451c947fc68b27a345ce32a\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:132\"\n// }\n// }\n// ],\n// \"ObjectInfo\": {\n// \"ID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:127\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:126\",\n// \"RefCount\": \"1\"\n// }\n// }\n// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:126]={\n// \"ObjectInfo\": {\n// \"ID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:126\",\n// \"IsEscaped\": true,\n// \"ModTime\": \"0\",\n// \"RefCount\": \"2\"\n// },\n// \"Value\": {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/r/demo/boards.Post\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"c45bbd47a46681a63af973db0ec2180922e4a8ae\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:127\"\n// }\n// }\n// }\n// u[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:120]={\n// \"ObjectInfo\": {\n// \"ID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:120\",\n// \"ModTime\": \"134\",\n// \"OwnerID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:134\",\n// \"RefCount\": \"1\"\n// },\n// \"Value\": {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"dc1f011553dc53e7a846049e08cc77fa35ea6a51\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:121\"\n// }\n// }\n// }\n// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:136]={\n// \"Fields\": [\n// {\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"16\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.StringValue\",\n// \"value\": \"0000000004\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/r/demo/boards.Post\"\n// }\n// },\n// \"V\": {\n// \"@type\": \"/gno.PointerValue\",\n// \"Base\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Escaped\": true,\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:126\"\n// },\n// \"Index\": \"0\",\n// \"TV\": null\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"64\"\n// }\n// },\n// {\n// \"N\": \"AQAAAAAAAAA=\",\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"32\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// }\n// }\n// ],\n// \"ObjectInfo\": {\n// \"ID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:136\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:135\",\n// \"RefCount\": \"1\"\n// }\n// }\n// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:135]={\n// \"ObjectInfo\": {\n// \"ID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:135\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:134\",\n// \"RefCount\": \"1\"\n// },\n// \"Value\": {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"96b86b4585c7f1075d7794180a5581f72733a7ab\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:136\"\n// }\n// }\n// }\n// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:134]={\n// \"Fields\": [\n// {\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"16\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.StringValue\",\n// \"value\": \"0000000004\"\n// }\n// },\n// {},\n// {\n// \"N\": \"AQAAAAAAAAA=\",\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"64\"\n// }\n// },\n// {\n// \"N\": \"AgAAAAAAAAA=\",\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"32\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// },\n// \"V\": {\n// \"@type\": \"/gno.PointerValue\",\n// \"Base\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"32274e1f28fb2b97d67a1262afd362d370de7faa\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:120\"\n// },\n// \"Index\": \"0\",\n// \"TV\": null\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// },\n// \"V\": {\n// \"@type\": \"/gno.PointerValue\",\n// \"Base\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"c2cfd6aec36a462f35bf02e5bf4a127aa1bb7ac2\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:135\"\n// },\n// \"Index\": \"0\",\n// \"TV\": null\n// }\n// }\n// ],\n// \"ObjectInfo\": {\n// \"ID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:134\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:133\",\n// \"RefCount\": \"1\"\n// }\n// }\n// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:133]={\n// \"ObjectInfo\": {\n// \"ID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:133\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:107\",\n// \"RefCount\": \"1\"\n// },\n// \"Value\": {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"5cb875179e86d32c517322af7a323b2a5f3e6cc5\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:134\"\n// }\n// }\n// }\n// u[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:85]={\n// \"Fields\": [\n// {\n// \"N\": \"AQAAAAAAAAA=\",\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/r/demo/boards.BoardID\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"16\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.StringValue\",\n// \"value\": \"/r/demo/boards:test_board\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"16\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.StringValue\",\n// \"value\": \"test_board\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"std.Address\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.StringValue\",\n// \"value\": \"g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Tree\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"a416a751c3a45a1e5cba11e737c51340b081e372\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:86\"\n// }\n// },\n// {\n// \"N\": \"BAAAAAAAAAA=\",\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"65536\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"time.Time\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"36299fccbc13f2a84c4629fad4cb940f0bd4b1c6\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:87\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Tree\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"af6ed0268f99b7f369329094eb6dfaea7812708b\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:88\"\n// }\n// }\n// ],\n// \"ObjectInfo\": {\n// \"ID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:85\",\n// \"ModTime\": \"121\",\n// \"OwnerID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:84\",\n// \"RefCount\": \"1\"\n// }\n// }\n// u[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:106]={\n// \"Fields\": [\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// },\n// \"V\": {\n// \"@type\": \"/gno.PointerValue\",\n// \"Base\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"9809329dc1ddc5d3556f7a8fa3c2cebcbf65560b\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:122\"\n// },\n// \"Index\": \"0\",\n// \"TV\": null\n// }\n// }\n// ],\n// \"ObjectInfo\": {\n// \"ID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:106\",\n// \"ModTime\": \"121\",\n// \"OwnerID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:105\",\n// \"RefCount\": \"1\"\n// }\n// }\n// u[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:107]={\n// \"Fields\": [\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// },\n// \"V\": {\n// \"@type\": \"/gno.PointerValue\",\n// \"Base\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"ceae9a1c4ed28bb51062e6ccdccfad0caafd1c4f\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:133\"\n// },\n// \"Index\": \"0\",\n// \"TV\": null\n// }\n// }\n// ],\n// \"ObjectInfo\": {\n// \"ID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:107\",\n// \"ModTime\": \"121\",\n// \"OwnerID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:105\",\n// \"RefCount\": \"1\"\n// }\n// }\n// switchrealm[\"gno.land/r/demo/boards\"]\n// switchrealm[\"gno.land/r/demo/users\"]\n// switchrealm[\"gno.land/r/demo/users\"]\n// switchrealm[\"gno.land/r/demo/users\"]\n// switchrealm[\"gno.land/r/demo/boards\"]\n// switchrealm[\"gno.land/r/demo/boards_test\"]\n"},{"name":"z_5_b_filetest.gno","body":"package main\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj\")\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\t// create board via registered user\n\tbid := boards.CreateBoard(\"test_board\")\n\n\t// create post via anon user\n\ttest2 := testutils.TestAddress(\"test2\")\n\tstd.TestSetOrigCaller(test2)\n\tstd.TestSetOrigSend(std.Coins{{\"ugnot\", 9000000}}, nil)\n\n\tpid := boards.CreateThread(bid, \"First Post (title)\", \"Body of the first post. (body)\")\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n}\n\n// Error:\n// please register, otherwise minimum fee 100000000 is required if anonymous\n"},{"name":"z_5_c_filetest.gno","body":"package main\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj\")\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\t// create board via registered user\n\tbid := boards.CreateBoard(\"test_board\")\n\n\t// create post via anon user\n\ttest2 := testutils.TestAddress(\"test2\")\n\tstd.TestSetOrigCaller(test2)\n\tstd.TestSetOrigSend(std.Coins{{\"ugnot\", 101000000}}, nil)\n\n\tpid := boards.CreateThread(bid, \"First Post (title)\", \"Body of the first post. (body)\")\n\tboards.CreateReply(bid, pid, pid, \"Reply of the first post\")\n\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n}\n\n// Output:\n// # First Post (title)\n//\n// Body of the first post. (body)\n// \\- [g1w3jhxapjta047h6lta047h6lta047h6laqcyu4](/r/demo/users:g1w3jhxapjta047h6lta047h6lta047h6laqcyu4), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/1) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=1\u0026postid=1\u0026body.type=textarea)] \\[[repost](/r/demo/boards?help\u0026__func=CreateRepost\u0026bid=1\u0026postid=1\u0026title.type=textarea\u0026body.type=textarea\u0026dstBoardID.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=1\u0026postid=1)]\n//\n// \u003e Reply of the first post\n// \u003e \\- [g1w3jhxapjta047h6lta047h6lta047h6laqcyu4](/r/demo/users:g1w3jhxapjta047h6lta047h6lta047h6laqcyu4), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/1/2) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=1\u0026postid=2\u0026body.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=1\u0026postid=2)]\n"},{"name":"z_5_d_filetest.gno","body":"package main\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj\")\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\t// create board via registered user\n\tbid := boards.CreateBoard(\"test_board\")\n\tpid := boards.CreateThread(bid, \"First Post (title)\", \"Body of the first post. (body)\")\n\n\t// create reply via anon user\n\ttest2 := testutils.TestAddress(\"test2\")\n\tstd.TestSetOrigCaller(test2)\n\tstd.TestSetOrigSend(std.Coins{{\"ugnot\", 9000000}}, nil)\n\tboards.CreateReply(bid, pid, pid, \"Reply of the first post\")\n\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n}\n\n// Error:\n// please register, otherwise minimum fee 100000000 is required if anonymous\n"},{"name":"z_5_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tbid boards.BoardID\n\tpid boards.PostID\n)\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\tbid = boards.CreateBoard(\"test_board\")\n\tboards.CreateThread(bid, \"First Post (title)\", \"Body of the first post. (body)\")\n\tpid = boards.CreateThread(bid, \"Second Post (title)\", \"Body of the second post. (body)\")\n\trid := boards.CreateReply(bid, pid, pid, \"Reply of the second post\")\n}\n\nfunc main() {\n\trid2 := boards.CreateReply(bid, pid, pid, \"Second reply of the second post\\n\")\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n}\n\n// Output:\n// # Second Post (title)\n//\n// Body of the second post. (body)\n// \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=2\u0026postid=2\u0026body.type=textarea)] \\[[repost](/r/demo/boards?help\u0026__func=CreateRepost\u0026bid=1\u0026postid=2\u0026title.type=textarea\u0026body.type=textarea\u0026dstBoardID.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=2\u0026postid=2)]\n//\n// \u003e Reply of the second post\n// \u003e \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2/3) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=2\u0026postid=3\u0026body.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=2\u0026postid=3)]\n//\n// \u003e Second reply of the second post\n// \u003e\n// \u003e \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2/4) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=2\u0026postid=4\u0026body.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=2\u0026postid=4)]\n"},{"name":"z_6_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tbid boards.BoardID\n\tpid boards.PostID\n\trid boards.PostID\n)\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\tbid = boards.CreateBoard(\"test_board\")\n\tboards.CreateThread(bid, \"First Post (title)\", \"Body of the first post. (body)\")\n\tpid = boards.CreateThread(bid, \"Second Post (title)\", \"Body of the second post. (body)\")\n\trid = boards.CreateReply(bid, pid, pid, \"Reply of the second post\")\n}\n\nfunc main() {\n\tboards.CreateReply(bid, pid, pid, \"Second reply of the second post\\n\")\n\tboards.CreateReply(bid, pid, rid, \"First reply of the first reply\\n\")\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n}\n\n// Output:\n// # Second Post (title)\n//\n// Body of the second post. (body)\n// \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=2\u0026postid=2\u0026body.type=textarea)] \\[[repost](/r/demo/boards?help\u0026__func=CreateRepost\u0026bid=1\u0026postid=2\u0026title.type=textarea\u0026body.type=textarea\u0026dstBoardID.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=2\u0026postid=2)]\n//\n// \u003e Reply of the second post\n// \u003e \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2/3) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=2\u0026postid=3\u0026body.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=2\u0026postid=3)]\n// \u003e\n// \u003e \u003e First reply of the first reply\n// \u003e \u003e\n// \u003e \u003e \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2/5) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=2\u0026postid=5\u0026body.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=2\u0026postid=5)]\n//\n// \u003e Second reply of the second post\n// \u003e\n// \u003e \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2/4) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=2\u0026postid=4\u0026body.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=2\u0026postid=4)]\n"},{"name":"z_7_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nfunc init() {\n\t// register\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\t// create board and post\n\tbid := boards.CreateBoard(\"test_board\")\n\tboards.CreateThread(bid, \"First Post (title)\", \"Body of the first post. (body)\")\n}\n\nfunc main() {\n\tprintln(boards.Render(\"test_board\"))\n}\n\n// Output:\n// \\[[post](/r/demo/boards?help\u0026__func=CreateThread\u0026bid=1\u0026body.type=textarea)]\n//\n// ----------------------------------------\n// ## [First Post (title)](/r/demo/boards:test_board/1)\n//\n// Body of the first post. (body)\n// \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm UTC](/r/demo/boards:test_board/1) \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=1\u0026postid=1)] (0 replies) (0 reposts)\n"},{"name":"z_8_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tbid boards.BoardID\n\tpid boards.PostID\n\trid boards.PostID\n)\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\tbid = boards.CreateBoard(\"test_board\")\n\tboards.CreateThread(bid, \"First Post (title)\", \"Body of the first post. (body)\")\n\tpid = boards.CreateThread(bid, \"Second Post (title)\", \"Body of the second post. (body)\")\n\trid = boards.CreateReply(bid, pid, pid, \"Reply of the second post\")\n}\n\nfunc main() {\n\tboards.CreateReply(bid, pid, pid, \"Second reply of the second post\\n\")\n\trid2 := boards.CreateReply(bid, pid, rid, \"First reply of the first reply\\n\")\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid)) + \"/\" + strconv.Itoa(int(rid2))))\n}\n\n// Output:\n// _[see thread](/r/demo/boards:test_board/2)_\n//\n// Reply of the second post\n// \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2/3) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=2\u0026postid=3\u0026body.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=2\u0026postid=3)]\n//\n// _[see all 1 replies](/r/demo/boards:test_board/2/3)_\n//\n// \u003e First reply of the first reply\n// \u003e\n// \u003e \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2/5) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=2\u0026postid=5\u0026body.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=2\u0026postid=5)]\n"},{"name":"z_9_a_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar dstBoard boards.BoardID\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\tdstBoard = boards.CreateBoard(\"dst_board\")\n\n\tboards.CreateRepost(0, 0, \"First Post in (title)\", \"Body of the first post. (body)\", dstBoard)\n}\n\nfunc main() {\n}\n\n// Error:\n// src board not exist\n"},{"name":"z_9_b_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tsrcBoard boards.BoardID\n\tpid boards.PostID\n)\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\tsrcBoard = boards.CreateBoard(\"first_board\")\n\tpid = boards.CreateThread(srcBoard, \"First Post in (title)\", \"Body of the first post. (body)\")\n\n\tboards.CreateRepost(srcBoard, pid, \"First Post in (title)\", \"Body of the first post. (body)\", 0)\n}\n\nfunc main() {\n}\n\n// Error:\n// dst board not exist\n"},{"name":"z_9_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tfirstBoard boards.BoardID\n\tsecondBoard boards.BoardID\n\tpid boards.PostID\n)\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\tfirstBoard = boards.CreateBoard(\"first_board\")\n\tsecondBoard = boards.CreateBoard(\"second_board\")\n\tpid = boards.CreateThread(firstBoard, \"First Post in (title)\", \"Body of the first post. (body)\")\n\n\tboards.CreateRepost(firstBoard, pid, \"First Post in (title)\", \"Body of the first post. (body)\", secondBoard)\n}\n\nfunc main() {\n\tprintln(boards.Render(\"second_board/\" + strconv.Itoa(int(pid))))\n}\n\n// Output:\n// # First Post in (title)\n//\n// Body of the first post. (body)\n// \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:second_board/1/1) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=2\u0026threadid=1\u0026postid=1\u0026body.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=2\u0026threadid=1\u0026postid=1)]\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"groups","path":"gno.land/p/demo/groups","files":[{"name":"groups.gno","body":"package groups\n\nimport \"gno.land/r/demo/boards\"\n\n// TODO implement something and test.\ntype Group struct {\n\tBoard *boards.Board\n}\n"},{"name":"vote_set.gno","body":"package groups\n\nimport (\n\t\"std\"\n\t\"time\"\n\n\t\"gno.land/p/demo/rat\"\n)\n\n//----------------------------------------\n// VoteSet\n\ntype VoteSet interface {\n\t// number of present votes in set.\n\tSize() int\n\t// add or update vote for voter.\n\tSetVote(voter std.Address, value string) error\n\t// count the number of votes for value.\n\tCountVotes(value string) int\n}\n\n//----------------------------------------\n// VoteList\n\ntype Vote struct {\n\tVoter std.Address\n\tValue string\n}\n\ntype VoteList []Vote\n\nfunc NewVoteList() *VoteList {\n\treturn \u0026VoteList{}\n}\n\nfunc (vlist *VoteList) Size() int {\n\treturn len(*vlist)\n}\n\nfunc (vlist *VoteList) SetVote(voter std.Address, value string) error {\n\t// TODO optimize with binary algorithm\n\tfor i, vote := range *vlist {\n\t\tif vote.Voter == voter {\n\t\t\t// update vote\n\t\t\t(*vlist)[i] = Vote{\n\t\t\t\tVoter: voter,\n\t\t\t\tValue: value,\n\t\t\t}\n\t\t\treturn nil\n\t\t}\n\t}\n\t*vlist = append(*vlist, Vote{\n\t\tVoter: voter,\n\t\tValue: value,\n\t})\n\treturn nil\n}\n\nfunc (vlist *VoteList) CountVotes(target string) int {\n\t// TODO optimize with binary algorithm\n\tvar count int\n\tfor _, vote := range *vlist {\n\t\tif vote.Value == target {\n\t\t\tcount++\n\t\t}\n\t}\n\treturn count\n}\n\n//----------------------------------------\n// Committee\n\ntype Committee struct {\n\tQuorum rat.Rat\n\tThreshold rat.Rat\n\tAddresses std.AddressSet\n}\n\n//----------------------------------------\n// VoteSession\n// NOTE: this seems a bit too formal and\n// complicated vs what might be possible;\n// something simpler, more informal.\n\ntype SessionStatus int\n\nconst (\n\tSessionNew SessionStatus = iota\n\tSessionStarted\n\tSessionCompleted\n\tSessionCanceled\n)\n\ntype VoteSession struct {\n\tName string\n\tCreator std.Address\n\tBody string\n\tStart time.Time\n\tDeadline time.Time\n\tStatus SessionStatus\n\tCommittee *Committee\n\tVotes VoteSet\n\tChoices []string\n\tResult string\n}\n"},{"name":"z_1_filetest.gno","body":"// PKGPATH: gno.land/r/demo/groups_test\npackage groups_test\n\nimport (\n\t\"gno.land/p/demo/groups\"\n\t\"gno.land/p/demo/testutils\"\n)\n\nvar vset groups.VoteSet\n\nfunc init() {\n\taddr1 := testutils.TestAddress(\"test1\")\n\taddr2 := testutils.TestAddress(\"test2\")\n\tvset = groups.NewVoteList()\n\tvset.SetVote(addr1, \"yes\")\n\tvset.SetVote(addr2, \"yes\")\n}\n\nfunc main() {\n\tprintln(vset.Size())\n\tprintln(\"yes:\", vset.CountVotes(\"yes\"))\n\tprintln(\"no:\", vset.CountVotes(\"no\"))\n}\n\n// Output:\n// 2\n// yes: 2\n// no: 0\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"uint256","path":"gno.land/p/demo/uint256","files":[{"name":"LICENSE","body":"BSD 3-Clause License\n\nCopyright 2020 uint256 Authors\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its\n contributors may be used to endorse or promote products derived from\n this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"name":"README.md","body":"# Fixed size 256-bit math library\n\nThis is a library specialized at replacing the `big.Int` library for math based on 256-bit types.\n\noriginal repository: [uint256](\u003chttps://github.com/holiman/uint256/tree/master\u003e)\n"},{"name":"arithmetic.gno","body":"// arithmetic provides arithmetic operations for Uint objects.\n// This includes basic binary operations such as addition, subtraction, multiplication, division, and modulo operations\n// as well as overflow checks, and negation. These functions are essential for numeric\n// calculations using 256-bit unsigned integers.\npackage uint256\n\nimport (\n\t\"math/bits\"\n)\n\n// Add sets z to the sum x+y\nfunc (z *Uint) Add(x, y *Uint) *Uint {\n\tvar carry uint64\n\tz.arr[0], carry = bits.Add64(x.arr[0], y.arr[0], 0)\n\tz.arr[1], carry = bits.Add64(x.arr[1], y.arr[1], carry)\n\tz.arr[2], carry = bits.Add64(x.arr[2], y.arr[2], carry)\n\tz.arr[3], _ = bits.Add64(x.arr[3], y.arr[3], carry)\n\treturn z\n}\n\n// AddOverflow sets z to the sum x+y, and returns z and whether overflow occurred\nfunc (z *Uint) AddOverflow(x, y *Uint) (*Uint, bool) {\n\tvar carry uint64\n\tz.arr[0], carry = bits.Add64(x.arr[0], y.arr[0], 0)\n\tz.arr[1], carry = bits.Add64(x.arr[1], y.arr[1], carry)\n\tz.arr[2], carry = bits.Add64(x.arr[2], y.arr[2], carry)\n\tz.arr[3], carry = bits.Add64(x.arr[3], y.arr[3], carry)\n\treturn z, carry != 0\n}\n\n// Sub sets z to the difference x-y\nfunc (z *Uint) Sub(x, y *Uint) *Uint {\n\tvar carry uint64\n\tz.arr[0], carry = bits.Sub64(x.arr[0], y.arr[0], 0)\n\tz.arr[1], carry = bits.Sub64(x.arr[1], y.arr[1], carry)\n\tz.arr[2], carry = bits.Sub64(x.arr[2], y.arr[2], carry)\n\tz.arr[3], _ = bits.Sub64(x.arr[3], y.arr[3], carry)\n\treturn z\n}\n\n// SubOverflow sets z to the difference x-y and returns z and true if the operation underflowed\nfunc (z *Uint) SubOverflow(x, y *Uint) (*Uint, bool) {\n\tvar carry uint64\n\tz.arr[0], carry = bits.Sub64(x.arr[0], y.arr[0], 0)\n\tz.arr[1], carry = bits.Sub64(x.arr[1], y.arr[1], carry)\n\tz.arr[2], carry = bits.Sub64(x.arr[2], y.arr[2], carry)\n\tz.arr[3], carry = bits.Sub64(x.arr[3], y.arr[3], carry)\n\treturn z, carry != 0\n}\n\n// Neg returns -x mod 2^256.\nfunc (z *Uint) Neg(x *Uint) *Uint {\n\treturn z.Sub(new(Uint), x)\n}\n\n// commented out for possible overflow\n// Mul sets z to the product x*y\nfunc (z *Uint) Mul(x, y *Uint) *Uint {\n\tvar (\n\t\tres Uint\n\t\tcarry uint64\n\t\tres1, res2, res3 uint64\n\t)\n\n\tcarry, res.arr[0] = bits.Mul64(x.arr[0], y.arr[0])\n\tcarry, res1 = umulHop(carry, x.arr[1], y.arr[0])\n\tcarry, res2 = umulHop(carry, x.arr[2], y.arr[0])\n\tres3 = x.arr[3]*y.arr[0] + carry\n\n\tcarry, res.arr[1] = umulHop(res1, x.arr[0], y.arr[1])\n\tcarry, res2 = umulStep(res2, x.arr[1], y.arr[1], carry)\n\tres3 = res3 + x.arr[2]*y.arr[1] + carry\n\n\tcarry, res.arr[2] = umulHop(res2, x.arr[0], y.arr[2])\n\tres3 = res3 + x.arr[1]*y.arr[2] + carry\n\n\tres.arr[3] = res3 + x.arr[0]*y.arr[3]\n\n\treturn z.Set(\u0026res)\n}\n\n// MulOverflow sets z to the product x*y, and returns z and whether overflow occurred\nfunc (z *Uint) MulOverflow(x, y *Uint) (*Uint, bool) {\n\tp := umul(x, y)\n\tcopy(z.arr[:], p[:4])\n\treturn z, (p[4] | p[5] | p[6] | p[7]) != 0\n}\n\n// commented out for possible overflow\n// Div sets z to the quotient x/y for returns z.\n// If y == 0, z is set to 0\nfunc (z *Uint) Div(x, y *Uint) *Uint {\n\tif y.IsZero() || y.Gt(x) {\n\t\treturn z.Clear()\n\t}\n\tif x.Eq(y) {\n\t\treturn z.SetOne()\n\t}\n\t// Shortcut some cases\n\tif x.IsUint64() {\n\t\treturn z.SetUint64(x.Uint64() / y.Uint64())\n\t}\n\n\t// At this point, we know\n\t// x/y ; x \u003e y \u003e 0\n\n\tvar quot Uint\n\tudivrem(quot.arr[:], x.arr[:], y)\n\treturn z.Set(\u0026quot)\n}\n\n// MulMod calculates the modulo-m multiplication of x and y and\n// returns z.\n// If m == 0, z is set to 0 (OBS: differs from the big.Int)\nfunc (z *Uint) MulMod(x, y, m *Uint) *Uint {\n\tif x.IsZero() || y.IsZero() || m.IsZero() {\n\t\treturn z.Clear()\n\t}\n\tp := umul(x, y)\n\n\tif m.arr[3] != 0 {\n\t\tmu := Reciprocal(m)\n\t\tr := reduce4(p, m, mu)\n\t\treturn z.Set(\u0026r)\n\t}\n\n\tvar (\n\t\tpl Uint\n\t\tph Uint\n\t)\n\n\tpl = Uint{arr: [4]uint64{p[0], p[1], p[2], p[3]}}\n\tph = Uint{arr: [4]uint64{p[4], p[5], p[6], p[7]}}\n\n\t// If the multiplication is within 256 bits use Mod().\n\tif ph.IsZero() {\n\t\treturn z.Mod(\u0026pl, m)\n\t}\n\n\tvar quot [8]uint64\n\trem := udivrem(quot[:], p[:], m)\n\treturn z.Set(\u0026rem)\n}\n\n// Mod sets z to the modulus x%y for y != 0 and returns z.\n// If y == 0, z is set to 0 (OBS: differs from the big.Uint)\nfunc (z *Uint) Mod(x, y *Uint) *Uint {\n\tif x.IsZero() || y.IsZero() {\n\t\treturn z.Clear()\n\t}\n\tswitch x.Cmp(y) {\n\tcase -1:\n\t\t// x \u003c y\n\t\tcopy(z.arr[:], x.arr[:])\n\t\treturn z\n\tcase 0:\n\t\t// x == y\n\t\treturn z.Clear() // They are equal\n\t}\n\n\t// At this point:\n\t// x != 0\n\t// y != 0\n\t// x \u003e y\n\n\t// Shortcut trivial case\n\tif x.IsUint64() {\n\t\treturn z.SetUint64(x.Uint64() % y.Uint64())\n\t}\n\n\tvar quot Uint\n\t*z = udivrem(quot.arr[:], x.arr[:], y)\n\treturn z\n}\n\n// DivMod sets z to the quotient x div y and m to the modulus x mod y and returns the pair (z, m) for y != 0.\n// If y == 0, both z and m are set to 0 (OBS: differs from the big.Int)\nfunc (z *Uint) DivMod(x, y, m *Uint) (*Uint, *Uint) {\n\tif y.IsZero() {\n\t\treturn z.Clear(), m.Clear()\n\t}\n\tvar quot Uint\n\t*m = udivrem(quot.arr[:], x.arr[:], y)\n\t*z = quot\n\treturn z, m\n}\n\n// Exp sets z = base**exponent mod 2**256, and returns z.\nfunc (z *Uint) Exp(base, exponent *Uint) *Uint {\n\tres := Uint{arr: [4]uint64{1, 0, 0, 0}}\n\tmultiplier := *base\n\texpBitLen := exponent.BitLen()\n\n\tcurBit := 0\n\tword := exponent.arr[0]\n\tfor ; curBit \u003c expBitLen \u0026\u0026 curBit \u003c 64; curBit++ {\n\t\tif word\u00261 == 1 {\n\t\t\tres.Mul(\u0026res, \u0026multiplier)\n\t\t}\n\t\tmultiplier.squared()\n\t\tword \u003e\u003e= 1\n\t}\n\n\tword = exponent.arr[1]\n\tfor ; curBit \u003c expBitLen \u0026\u0026 curBit \u003c 128; curBit++ {\n\t\tif word\u00261 == 1 {\n\t\t\tres.Mul(\u0026res, \u0026multiplier)\n\t\t}\n\t\tmultiplier.squared()\n\t\tword \u003e\u003e= 1\n\t}\n\n\tword = exponent.arr[2]\n\tfor ; curBit \u003c expBitLen \u0026\u0026 curBit \u003c 192; curBit++ {\n\t\tif word\u00261 == 1 {\n\t\t\tres.Mul(\u0026res, \u0026multiplier)\n\t\t}\n\t\tmultiplier.squared()\n\t\tword \u003e\u003e= 1\n\t}\n\n\tword = exponent.arr[3]\n\tfor ; curBit \u003c expBitLen \u0026\u0026 curBit \u003c 256; curBit++ {\n\t\tif word\u00261 == 1 {\n\t\t\tres.Mul(\u0026res, \u0026multiplier)\n\t\t}\n\t\tmultiplier.squared()\n\t\tword \u003e\u003e= 1\n\t}\n\treturn z.Set(\u0026res)\n}\n\nfunc (z *Uint) squared() {\n\tvar (\n\t\tres Uint\n\t\tcarry0, carry1, carry2 uint64\n\t\tres1, res2 uint64\n\t)\n\n\tcarry0, res.arr[0] = bits.Mul64(z.arr[0], z.arr[0])\n\tcarry0, res1 = umulHop(carry0, z.arr[0], z.arr[1])\n\tcarry0, res2 = umulHop(carry0, z.arr[0], z.arr[2])\n\n\tcarry1, res.arr[1] = umulHop(res1, z.arr[0], z.arr[1])\n\tcarry1, res2 = umulStep(res2, z.arr[1], z.arr[1], carry1)\n\n\tcarry2, res.arr[2] = umulHop(res2, z.arr[0], z.arr[2])\n\n\tres.arr[3] = 2*(z.arr[0]*z.arr[3]+z.arr[1]*z.arr[2]) + carry0 + carry1 + carry2\n\n\tz.Set(\u0026res)\n}\n\n// udivrem divides u by d and produces both quotient and remainder.\n// The quotient is stored in provided quot - len(u)-len(d)+1 words.\n// It loosely follows the Knuth's division algorithm (sometimes referenced as \"schoolbook\" division) using 64-bit words.\n// See Knuth, Volume 2, section 4.3.1, Algorithm D.\nfunc udivrem(quot, u []uint64, d *Uint) (rem Uint) {\n\tvar dLen int\n\tfor i := len(d.arr) - 1; i \u003e= 0; i-- {\n\t\tif d.arr[i] != 0 {\n\t\t\tdLen = i + 1\n\t\t\tbreak\n\t\t}\n\t}\n\n\tshift := uint(bits.LeadingZeros64(d.arr[dLen-1]))\n\n\tvar dnStorage Uint\n\tdn := dnStorage.arr[:dLen]\n\tfor i := dLen - 1; i \u003e 0; i-- {\n\t\tdn[i] = (d.arr[i] \u003c\u003c shift) | (d.arr[i-1] \u003e\u003e (64 - shift))\n\t}\n\tdn[0] = d.arr[0] \u003c\u003c shift\n\n\tvar uLen int\n\tfor i := len(u) - 1; i \u003e= 0; i-- {\n\t\tif u[i] != 0 {\n\t\t\tuLen = i + 1\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif uLen \u003c dLen {\n\t\tcopy(rem.arr[:], u)\n\t\treturn rem\n\t}\n\n\tvar unStorage [9]uint64\n\tun := unStorage[:uLen+1]\n\tun[uLen] = u[uLen-1] \u003e\u003e (64 - shift)\n\tfor i := uLen - 1; i \u003e 0; i-- {\n\t\tun[i] = (u[i] \u003c\u003c shift) | (u[i-1] \u003e\u003e (64 - shift))\n\t}\n\tun[0] = u[0] \u003c\u003c shift\n\n\t// TODO: Skip the highest word of numerator if not significant.\n\n\tif dLen == 1 {\n\t\tr := udivremBy1(quot, un, dn[0])\n\t\trem.SetUint64(r \u003e\u003e shift)\n\t\treturn rem\n\t}\n\n\tudivremKnuth(quot, un, dn)\n\n\tfor i := 0; i \u003c dLen-1; i++ {\n\t\trem.arr[i] = (un[i] \u003e\u003e shift) | (un[i+1] \u003c\u003c (64 - shift))\n\t}\n\trem.arr[dLen-1] = un[dLen-1] \u003e\u003e shift\n\n\treturn rem\n}\n\n// umul computes full 256 x 256 -\u003e 512 multiplication.\nfunc umul(x, y *Uint) [8]uint64 {\n\tvar (\n\t\tres [8]uint64\n\t\tcarry, carry4, carry5, carry6 uint64\n\t\tres1, res2, res3, res4, res5 uint64\n\t)\n\n\tcarry, res[0] = bits.Mul64(x.arr[0], y.arr[0])\n\tcarry, res1 = umulHop(carry, x.arr[1], y.arr[0])\n\tcarry, res2 = umulHop(carry, x.arr[2], y.arr[0])\n\tcarry4, res3 = umulHop(carry, x.arr[3], y.arr[0])\n\n\tcarry, res[1] = umulHop(res1, x.arr[0], y.arr[1])\n\tcarry, res2 = umulStep(res2, x.arr[1], y.arr[1], carry)\n\tcarry, res3 = umulStep(res3, x.arr[2], y.arr[1], carry)\n\tcarry5, res4 = umulStep(carry4, x.arr[3], y.arr[1], carry)\n\n\tcarry, res[2] = umulHop(res2, x.arr[0], y.arr[2])\n\tcarry, res3 = umulStep(res3, x.arr[1], y.arr[2], carry)\n\tcarry, res4 = umulStep(res4, x.arr[2], y.arr[2], carry)\n\tcarry6, res5 = umulStep(carry5, x.arr[3], y.arr[2], carry)\n\n\tcarry, res[3] = umulHop(res3, x.arr[0], y.arr[3])\n\tcarry, res[4] = umulStep(res4, x.arr[1], y.arr[3], carry)\n\tcarry, res[5] = umulStep(res5, x.arr[2], y.arr[3], carry)\n\tres[7], res[6] = umulStep(carry6, x.arr[3], y.arr[3], carry)\n\n\treturn res\n}\n\n// umulStep computes (hi * 2^64 + lo) = z + (x * y) + carry.\nfunc umulStep(z, x, y, carry uint64) (hi, lo uint64) {\n\thi, lo = bits.Mul64(x, y)\n\tlo, carry = bits.Add64(lo, carry, 0)\n\thi, _ = bits.Add64(hi, 0, carry)\n\tlo, carry = bits.Add64(lo, z, 0)\n\thi, _ = bits.Add64(hi, 0, carry)\n\treturn hi, lo\n}\n\n// umulHop computes (hi * 2^64 + lo) = z + (x * y)\nfunc umulHop(z, x, y uint64) (hi, lo uint64) {\n\thi, lo = bits.Mul64(x, y)\n\tlo, carry := bits.Add64(lo, z, 0)\n\thi, _ = bits.Add64(hi, 0, carry)\n\treturn hi, lo\n}\n\n// udivremBy1 divides u by single normalized word d and produces both quotient and remainder.\n// The quotient is stored in provided quot.\nfunc udivremBy1(quot, u []uint64, d uint64) (rem uint64) {\n\treciprocal := reciprocal2by1(d)\n\trem = u[len(u)-1] // Set the top word as remainder.\n\tfor j := len(u) - 2; j \u003e= 0; j-- {\n\t\tquot[j], rem = udivrem2by1(rem, u[j], d, reciprocal)\n\t}\n\treturn rem\n}\n\n// udivremKnuth implements the division of u by normalized multiple word d from the Knuth's division algorithm.\n// The quotient is stored in provided quot - len(u)-len(d) words.\n// Updates u to contain the remainder - len(d) words.\nfunc udivremKnuth(quot, u, d []uint64) {\n\tdh := d[len(d)-1]\n\tdl := d[len(d)-2]\n\treciprocal := reciprocal2by1(dh)\n\n\tfor j := len(u) - len(d) - 1; j \u003e= 0; j-- {\n\t\tu2 := u[j+len(d)]\n\t\tu1 := u[j+len(d)-1]\n\t\tu0 := u[j+len(d)-2]\n\n\t\tvar qhat, rhat uint64\n\t\tif u2 \u003e= dh { // Division overflows.\n\t\t\tqhat = ^uint64(0)\n\t\t\t// TODO: Add \"qhat one to big\" adjustment (not needed for correctness, but helps avoiding \"add back\" case).\n\t\t} else {\n\t\t\tqhat, rhat = udivrem2by1(u2, u1, dh, reciprocal)\n\t\t\tph, pl := bits.Mul64(qhat, dl)\n\t\t\tif ph \u003e rhat || (ph == rhat \u0026\u0026 pl \u003e u0) {\n\t\t\t\tqhat--\n\t\t\t\t// TODO: Add \"qhat one to big\" adjustment (not needed for correctness, but helps avoiding \"add back\" case).\n\t\t\t}\n\t\t}\n\n\t\t// Multiply and subtract.\n\t\tborrow := subMulTo(u[j:], d, qhat)\n\t\tu[j+len(d)] = u2 - borrow\n\t\tif u2 \u003c borrow { // Too much subtracted, add back.\n\t\t\tqhat--\n\t\t\tu[j+len(d)] += addTo(u[j:], d)\n\t\t}\n\n\t\tquot[j] = qhat // Store quotient digit.\n\t}\n}\n\n// isBitSet returns true if bit n-th is set, where n = 0 is LSB.\n// The n must be \u003c= 255.\nfunc (z *Uint) isBitSet(n uint) bool {\n\treturn (z.arr[n/64] \u0026 (1 \u003c\u003c (n % 64))) != 0\n}\n\n// addTo computes x += y.\n// Requires len(x) \u003e= len(y).\nfunc addTo(x, y []uint64) uint64 {\n\tvar carry uint64\n\tfor i := 0; i \u003c len(y); i++ {\n\t\tx[i], carry = bits.Add64(x[i], y[i], carry)\n\t}\n\treturn carry\n}\n\n// subMulTo computes x -= y * multiplier.\n// Requires len(x) \u003e= len(y).\nfunc subMulTo(x, y []uint64, multiplier uint64) uint64 {\n\tvar borrow uint64\n\tfor i := 0; i \u003c len(y); i++ {\n\t\ts, carry1 := bits.Sub64(x[i], borrow, 0)\n\t\tph, pl := bits.Mul64(y[i], multiplier)\n\t\tt, carry2 := bits.Sub64(s, pl, 0)\n\t\tx[i] = t\n\t\tborrow = ph + carry1 + carry2\n\t}\n\treturn borrow\n}\n\n// reciprocal2by1 computes \u003c^d, ^0\u003e / d.\nfunc reciprocal2by1(d uint64) uint64 {\n\treciprocal, _ := bits.Div64(^d, ^uint64(0), d)\n\treturn reciprocal\n}\n\n// udivrem2by1 divides \u003cuh, ul\u003e / d and produces both quotient and remainder.\n// It uses the provided d's reciprocal.\n// Implementation ported from https://github.com/chfast/intx and is based on\n// \"Improved division by invariant integers\", Algorithm 4.\nfunc udivrem2by1(uh, ul, d, reciprocal uint64) (quot, rem uint64) {\n\tqh, ql := bits.Mul64(reciprocal, uh)\n\tql, carry := bits.Add64(ql, ul, 0)\n\tqh, _ = bits.Add64(qh, uh, carry)\n\tqh++\n\n\tr := ul - qh*d\n\n\tif r \u003e ql {\n\t\tqh--\n\t\tr += d\n\t}\n\n\tif r \u003e= d {\n\t\tqh++\n\t\tr -= d\n\t}\n\n\treturn qh, r\n}\n"},{"name":"arithmetic_test.gno","body":"package uint256\n\nimport \"testing\"\n\ntype binOp2Test struct {\n\tx, y, want string\n}\n\nfunc TestAdd(t *testing.T) {\n\ttests := []binOp2Test{\n\t\t{\"0\", \"1\", \"1\"},\n\t\t{\"1\", \"0\", \"1\"},\n\t\t{\"1\", \"1\", \"2\"},\n\t\t{\"1\", \"3\", \"4\"},\n\t\t{\"10\", \"10\", \"20\"},\n\t\t{\"18446744073709551615\", \"18446744073709551615\", \"36893488147419103230\"}, // uint64 overflow\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\ty, err := FromDecimal(tc.y)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\twant, err := FromDecimal(tc.want)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := \u0026Uint{}\n\t\tgot.Add(x, y)\n\n\t\tif got.Neq(want) {\n\t\t\tt.Errorf(\"Add(%s, %s) = %v, want %v\", tc.x, tc.y, got.ToString(), want.ToString())\n\t\t}\n\t}\n}\n\nfunc TestSub(t *testing.T) {\n\ttests := []binOp2Test{\n\t\t{\"1\", \"0\", \"1\"},\n\t\t{\"1\", \"1\", \"0\"},\n\t\t{\"10\", \"10\", \"0\"},\n\t\t{\"31337\", \"1337\", \"30000\"},\n\t\t{\"2\", \"3\", \"115792089237316195423570985008687907853269984665640564039457584007913129639935\"}, // underflow\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\ty, err := FromDecimal(tc.y)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\twant, err := FromDecimal(tc.want)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := \u0026Uint{}\n\t\tgot.Sub(x, y)\n\n\t\tif got.Neq(want) {\n\t\t\tt.Errorf(\"Sub(%s, %s) = %v, want %v\", tc.x, tc.y, got.ToString(), want.ToString())\n\t\t}\n\t}\n}\n\nfunc TestMul(t *testing.T) {\n\ttests := []binOp2Test{\n\t\t{\"1\", \"0\", \"0\"},\n\t\t{\"1\", \"1\", \"1\"},\n\t\t{\"10\", \"10\", \"100\"},\n\t\t{\"18446744073709551615\", \"2\", \"36893488147419103230\"}, // uint64 overflow\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\ty, err := FromDecimal(tc.y)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\twant, err := FromDecimal(tc.want)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := \u0026Uint{}\n\t\tgot.Mul(x, y)\n\n\t\tif got.Neq(want) {\n\t\t\tt.Errorf(\"Mul(%s, %s) = %v, want %v\", tc.x, tc.y, got.ToString(), want.ToString())\n\t\t}\n\t}\n}\n\nfunc TestDiv(t *testing.T) {\n\ttests := []binOp2Test{\n\t\t{\"31337\", \"3\", \"10445\"},\n\t\t{\"31337\", \"0\", \"0\"},\n\t\t{\"0\", \"31337\", \"0\"},\n\t\t{\"1\", \"1\", \"1\"},\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\ty, err := FromDecimal(tc.y)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\twant, err := FromDecimal(tc.want)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := \u0026Uint{}\n\t\tgot.Div(x, y)\n\n\t\tif got.Neq(want) {\n\t\t\tt.Errorf(\"Div(%s, %s) = %v, want %v\", tc.x, tc.y, got.ToString(), want.ToString())\n\t\t}\n\t}\n}\n\nfunc TestMod(t *testing.T) {\n\ttests := []binOp2Test{\n\t\t{\"31337\", \"3\", \"2\"},\n\t\t{\"31337\", \"0\", \"0\"},\n\t\t{\"0\", \"31337\", \"0\"},\n\t\t{\"2\", \"31337\", \"2\"},\n\t\t{\"1\", \"1\", \"0\"},\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\ty, err := FromDecimal(tc.y)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\twant, err := FromDecimal(tc.want)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := \u0026Uint{}\n\t\tgot.Mod(x, y)\n\n\t\tif got.Neq(want) {\n\t\t\tt.Errorf(\"Mod(%s, %s) = %v, want %v\", tc.x, tc.y, got.ToString(), want.ToString())\n\t\t}\n\t}\n}\n\nfunc TestDivMod(t *testing.T) {\n\ttests := []struct {\n\t\tx string\n\t\ty string\n\t\twantDiv string\n\t\twantMod string\n\t}{\n\t\t{\"1\", \"1\", \"1\", \"0\"},\n\t\t{\"10\", \"10\", \"1\", \"0\"},\n\t\t{\"100\", \"10\", \"10\", \"0\"},\n\t\t{\"31337\", \"3\", \"10445\", \"2\"},\n\t\t{\"31337\", \"0\", \"0\", \"0\"},\n\t\t{\"0\", \"31337\", \"0\", \"0\"},\n\t\t{\"2\", \"31337\", \"0\", \"2\"},\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\ty, err := FromDecimal(tc.y)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\twantDiv, err := FromDecimal(tc.wantDiv)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\twantMod, err := FromDecimal(tc.wantMod)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgotDiv := new(Uint)\n\t\tgotMod := new(Uint)\n\t\tgotDiv.DivMod(x, y, gotMod)\n\n\t\tfor i := range gotDiv.arr {\n\t\t\tif gotDiv.arr[i] != wantDiv.arr[i] {\n\t\t\t\tt.Errorf(\"DivMod(%s, %s) got Div %v, want Div %v\", tc.x, tc.y, gotDiv, wantDiv)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tfor i := range gotMod.arr {\n\t\t\tif gotMod.arr[i] != wantMod.arr[i] {\n\t\t\t\tt.Errorf(\"DivMod(%s, %s) got Mod %v, want Mod %v\", tc.x, tc.y, gotMod, wantMod)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestNeg(t *testing.T) {\n\ttests := []struct {\n\t\tx string\n\t\twant string\n\t}{\n\t\t{\"31337\", \"115792089237316195423570985008687907853269984665640564039457584007913129608599\"},\n\t\t{\"115792089237316195423570985008687907853269984665640564039457584007913129608599\", \"31337\"},\n\t\t{\"0\", \"0\"},\n\t\t{\"2\", \"115792089237316195423570985008687907853269984665640564039457584007913129639934\"},\n\t\t{\"1\", \"115792089237316195423570985008687907853269984665640564039457584007913129639935\"},\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\twant, err := FromDecimal(tc.want)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := \u0026Uint{}\n\t\tgot.Neg(x)\n\n\t\tif got.Neq(want) {\n\t\t\tt.Errorf(\"Neg(%s) = %v, want %v\", tc.x, got.ToString(), want.ToString())\n\t\t}\n\t}\n}\n\nfunc TestExp(t *testing.T) {\n\ttests := []binOp2Test{\n\t\t{\"31337\", \"3\", \"30773171189753\"},\n\t\t{\"31337\", \"0\", \"1\"},\n\t\t{\"0\", \"31337\", \"0\"},\n\t\t{\"1\", \"1\", \"1\"},\n\t\t{\"2\", \"3\", \"8\"},\n\t\t{\"2\", \"64\", \"18446744073709551616\"},\n\t\t{\"2\", \"128\", \"340282366920938463463374607431768211456\"},\n\t\t{\"2\", \"255\", \"57896044618658097711785492504343953926634992332820282019728792003956564819968\"},\n\t\t{\"2\", \"256\", \"0\"}, // overflow\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\ty, err := FromDecimal(tc.y)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\twant, err := FromDecimal(tc.want)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := \u0026Uint{}\n\t\tgot.Exp(x, y)\n\n\t\tif got.Neq(want) {\n\t\t\tt.Errorf(\"Exp(%s, %s) = %v, want %v\", tc.x, tc.y, got.ToString(), want.ToString())\n\t\t}\n\t}\n}\n"},{"name":"bits_table.gno","body":"// Copyright 2017 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Code generated by go run make_tables.go. DO NOT EDIT.\n\npackage uint256\n\nconst ntz8tab = \"\" +\n\t\"\\x08\\x00\\x01\\x00\\x02\\x00\\x01\\x00\\x03\\x00\\x01\\x00\\x02\\x00\\x01\\x00\" +\n\t\"\\x04\\x00\\x01\\x00\\x02\\x00\\x01\\x00\\x03\\x00\\x01\\x00\\x02\\x00\\x01\\x00\" +\n\t\"\\x05\\x00\\x01\\x00\\x02\\x00\\x01\\x00\\x03\\x00\\x01\\x00\\x02\\x00\\x01\\x00\" +\n\t\"\\x04\\x00\\x01\\x00\\x02\\x00\\x01\\x00\\x03\\x00\\x01\\x00\\x02\\x00\\x01\\x00\" +\n\t\"\\x06\\x00\\x01\\x00\\x02\\x00\\x01\\x00\\x03\\x00\\x01\\x00\\x02\\x00\\x01\\x00\" +\n\t\"\\x04\\x00\\x01\\x00\\x02\\x00\\x01\\x00\\x03\\x00\\x01\\x00\\x02\\x00\\x01\\x00\" +\n\t\"\\x05\\x00\\x01\\x00\\x02\\x00\\x01\\x00\\x03\\x00\\x01\\x00\\x02\\x00\\x01\\x00\" +\n\t\"\\x04\\x00\\x01\\x00\\x02\\x00\\x01\\x00\\x03\\x00\\x01\\x00\\x02\\x00\\x01\\x00\" +\n\t\"\\x07\\x00\\x01\\x00\\x02\\x00\\x01\\x00\\x03\\x00\\x01\\x00\\x02\\x00\\x01\\x00\" +\n\t\"\\x04\\x00\\x01\\x00\\x02\\x00\\x01\\x00\\x03\\x00\\x01\\x00\\x02\\x00\\x01\\x00\" +\n\t\"\\x05\\x00\\x01\\x00\\x02\\x00\\x01\\x00\\x03\\x00\\x01\\x00\\x02\\x00\\x01\\x00\" +\n\t\"\\x04\\x00\\x01\\x00\\x02\\x00\\x01\\x00\\x03\\x00\\x01\\x00\\x02\\x00\\x01\\x00\" +\n\t\"\\x06\\x00\\x01\\x00\\x02\\x00\\x01\\x00\\x03\\x00\\x01\\x00\\x02\\x00\\x01\\x00\" +\n\t\"\\x04\\x00\\x01\\x00\\x02\\x00\\x01\\x00\\x03\\x00\\x01\\x00\\x02\\x00\\x01\\x00\" +\n\t\"\\x05\\x00\\x01\\x00\\x02\\x00\\x01\\x00\\x03\\x00\\x01\\x00\\x02\\x00\\x01\\x00\" +\n\t\"\\x04\\x00\\x01\\x00\\x02\\x00\\x01\\x00\\x03\\x00\\x01\\x00\\x02\\x00\\x01\\x00\"\n\nconst pop8tab = \"\" +\n\t\"\\x00\\x01\\x01\\x02\\x01\\x02\\x02\\x03\\x01\\x02\\x02\\x03\\x02\\x03\\x03\\x04\" +\n\t\"\\x01\\x02\\x02\\x03\\x02\\x03\\x03\\x04\\x02\\x03\\x03\\x04\\x03\\x04\\x04\\x05\" +\n\t\"\\x01\\x02\\x02\\x03\\x02\\x03\\x03\\x04\\x02\\x03\\x03\\x04\\x03\\x04\\x04\\x05\" +\n\t\"\\x02\\x03\\x03\\x04\\x03\\x04\\x04\\x05\\x03\\x04\\x04\\x05\\x04\\x05\\x05\\x06\" +\n\t\"\\x01\\x02\\x02\\x03\\x02\\x03\\x03\\x04\\x02\\x03\\x03\\x04\\x03\\x04\\x04\\x05\" +\n\t\"\\x02\\x03\\x03\\x04\\x03\\x04\\x04\\x05\\x03\\x04\\x04\\x05\\x04\\x05\\x05\\x06\" +\n\t\"\\x02\\x03\\x03\\x04\\x03\\x04\\x04\\x05\\x03\\x04\\x04\\x05\\x04\\x05\\x05\\x06\" +\n\t\"\\x03\\x04\\x04\\x05\\x04\\x05\\x05\\x06\\x04\\x05\\x05\\x06\\x05\\x06\\x06\\x07\" +\n\t\"\\x01\\x02\\x02\\x03\\x02\\x03\\x03\\x04\\x02\\x03\\x03\\x04\\x03\\x04\\x04\\x05\" +\n\t\"\\x02\\x03\\x03\\x04\\x03\\x04\\x04\\x05\\x03\\x04\\x04\\x05\\x04\\x05\\x05\\x06\" +\n\t\"\\x02\\x03\\x03\\x04\\x03\\x04\\x04\\x05\\x03\\x04\\x04\\x05\\x04\\x05\\x05\\x06\" +\n\t\"\\x03\\x04\\x04\\x05\\x04\\x05\\x05\\x06\\x04\\x05\\x05\\x06\\x05\\x06\\x06\\x07\" +\n\t\"\\x02\\x03\\x03\\x04\\x03\\x04\\x04\\x05\\x03\\x04\\x04\\x05\\x04\\x05\\x05\\x06\" +\n\t\"\\x03\\x04\\x04\\x05\\x04\\x05\\x05\\x06\\x04\\x05\\x05\\x06\\x05\\x06\\x06\\x07\" +\n\t\"\\x03\\x04\\x04\\x05\\x04\\x05\\x05\\x06\\x04\\x05\\x05\\x06\\x05\\x06\\x06\\x07\" +\n\t\"\\x04\\x05\\x05\\x06\\x05\\x06\\x06\\x07\\x05\\x06\\x06\\x07\\x06\\x07\\x07\\x08\"\n\nconst rev8tab = \"\" +\n\t\"\\x00\\x80\\x40\\xc0\\x20\\xa0\\x60\\xe0\\x10\\x90\\x50\\xd0\\x30\\xb0\\x70\\xf0\" +\n\t\"\\x08\\x88\\x48\\xc8\\x28\\xa8\\x68\\xe8\\x18\\x98\\x58\\xd8\\x38\\xb8\\x78\\xf8\" +\n\t\"\\x04\\x84\\x44\\xc4\\x24\\xa4\\x64\\xe4\\x14\\x94\\x54\\xd4\\x34\\xb4\\x74\\xf4\" +\n\t\"\\x0c\\x8c\\x4c\\xcc\\x2c\\xac\\x6c\\xec\\x1c\\x9c\\x5c\\xdc\\x3c\\xbc\\x7c\\xfc\" +\n\t\"\\x02\\x82\\x42\\xc2\\x22\\xa2\\x62\\xe2\\x12\\x92\\x52\\xd2\\x32\\xb2\\x72\\xf2\" +\n\t\"\\x0a\\x8a\\x4a\\xca\\x2a\\xaa\\x6a\\xea\\x1a\\x9a\\x5a\\xda\\x3a\\xba\\x7a\\xfa\" +\n\t\"\\x06\\x86\\x46\\xc6\\x26\\xa6\\x66\\xe6\\x16\\x96\\x56\\xd6\\x36\\xb6\\x76\\xf6\" +\n\t\"\\x0e\\x8e\\x4e\\xce\\x2e\\xae\\x6e\\xee\\x1e\\x9e\\x5e\\xde\\x3e\\xbe\\x7e\\xfe\" +\n\t\"\\x01\\x81\\x41\\xc1\\x21\\xa1\\x61\\xe1\\x11\\x91\\x51\\xd1\\x31\\xb1\\x71\\xf1\" +\n\t\"\\x09\\x89\\x49\\xc9\\x29\\xa9\\x69\\xe9\\x19\\x99\\x59\\xd9\\x39\\xb9\\x79\\xf9\" +\n\t\"\\x05\\x85\\x45\\xc5\\x25\\xa5\\x65\\xe5\\x15\\x95\\x55\\xd5\\x35\\xb5\\x75\\xf5\" +\n\t\"\\x0d\\x8d\\x4d\\xcd\\x2d\\xad\\x6d\\xed\\x1d\\x9d\\x5d\\xdd\\x3d\\xbd\\x7d\\xfd\" +\n\t\"\\x03\\x83\\x43\\xc3\\x23\\xa3\\x63\\xe3\\x13\\x93\\x53\\xd3\\x33\\xb3\\x73\\xf3\" +\n\t\"\\x0b\\x8b\\x4b\\xcb\\x2b\\xab\\x6b\\xeb\\x1b\\x9b\\x5b\\xdb\\x3b\\xbb\\x7b\\xfb\" +\n\t\"\\x07\\x87\\x47\\xc7\\x27\\xa7\\x67\\xe7\\x17\\x97\\x57\\xd7\\x37\\xb7\\x77\\xf7\" +\n\t\"\\x0f\\x8f\\x4f\\xcf\\x2f\\xaf\\x6f\\xef\\x1f\\x9f\\x5f\\xdf\\x3f\\xbf\\x7f\\xff\"\n\nconst len8tab = \"\" +\n\t\"\\x00\\x01\\x02\\x02\\x03\\x03\\x03\\x03\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04\" +\n\t\"\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\" +\n\t\"\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\" +\n\t\"\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\" +\n\t\"\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\" +\n\t\"\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\" +\n\t\"\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\" +\n\t\"\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\" +\n\t\"\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\" +\n\t\"\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\" +\n\t\"\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\" +\n\t\"\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\" +\n\t\"\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\" +\n\t\"\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\" +\n\t\"\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\" +\n\t\"\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\"\n"},{"name":"bitwise.gno","body":"// bitwise contains bitwise operations for Uint instances.\n// This file includes functions to perform bitwise AND, OR, XOR, and NOT operations, as well as bit shifting.\n// These operations are crucial for manipulating individual bits within a 256-bit unsigned integer.\npackage uint256\n\n// Or sets z = x | y and returns z.\nfunc (z *Uint) Or(x, y *Uint) *Uint {\n\tz.arr[0] = x.arr[0] | y.arr[0]\n\tz.arr[1] = x.arr[1] | y.arr[1]\n\tz.arr[2] = x.arr[2] | y.arr[2]\n\tz.arr[3] = x.arr[3] | y.arr[3]\n\treturn z\n}\n\n// And sets z = x \u0026 y and returns z.\nfunc (z *Uint) And(x, y *Uint) *Uint {\n\tz.arr[0] = x.arr[0] \u0026 y.arr[0]\n\tz.arr[1] = x.arr[1] \u0026 y.arr[1]\n\tz.arr[2] = x.arr[2] \u0026 y.arr[2]\n\tz.arr[3] = x.arr[3] \u0026 y.arr[3]\n\treturn z\n}\n\n// Not sets z = ^x and returns z.\nfunc (z *Uint) Not(x *Uint) *Uint {\n\tz.arr[3], z.arr[2], z.arr[1], z.arr[0] = ^x.arr[3], ^x.arr[2], ^x.arr[1], ^x.arr[0]\n\treturn z\n}\n\n// AndNot sets z = x \u0026^ y and returns z.\nfunc (z *Uint) AndNot(x, y *Uint) *Uint {\n\tz.arr[0] = x.arr[0] \u0026^ y.arr[0]\n\tz.arr[1] = x.arr[1] \u0026^ y.arr[1]\n\tz.arr[2] = x.arr[2] \u0026^ y.arr[2]\n\tz.arr[3] = x.arr[3] \u0026^ y.arr[3]\n\treturn z\n}\n\n// Xor sets z = x ^ y and returns z.\nfunc (z *Uint) Xor(x, y *Uint) *Uint {\n\tz.arr[0] = x.arr[0] ^ y.arr[0]\n\tz.arr[1] = x.arr[1] ^ y.arr[1]\n\tz.arr[2] = x.arr[2] ^ y.arr[2]\n\tz.arr[3] = x.arr[3] ^ y.arr[3]\n\treturn z\n}\n\n// Lsh sets z = x \u003c\u003c n and returns z.\nfunc (z *Uint) Lsh(x *Uint, n uint) *Uint {\n\t// n % 64 == 0\n\tif n\u00260x3f == 0 {\n\t\tswitch n {\n\t\tcase 0:\n\t\t\treturn z.Set(x)\n\t\tcase 64:\n\t\t\treturn z.lsh64(x)\n\t\tcase 128:\n\t\t\treturn z.lsh128(x)\n\t\tcase 192:\n\t\t\treturn z.lsh192(x)\n\t\tdefault:\n\t\t\treturn z.Clear()\n\t\t}\n\t}\n\tvar a, b uint64\n\t// Big swaps first\n\tswitch {\n\tcase n \u003e 192:\n\t\tif n \u003e 256 {\n\t\t\treturn z.Clear()\n\t\t}\n\t\tz.lsh192(x)\n\t\tn -= 192\n\t\tgoto sh192\n\tcase n \u003e 128:\n\t\tz.lsh128(x)\n\t\tn -= 128\n\t\tgoto sh128\n\tcase n \u003e 64:\n\t\tz.lsh64(x)\n\t\tn -= 64\n\t\tgoto sh64\n\tdefault:\n\t\tz.Set(x)\n\t}\n\n\t// remaining shifts\n\ta = z.arr[0] \u003e\u003e (64 - n)\n\tz.arr[0] = z.arr[0] \u003c\u003c n\n\nsh64:\n\tb = z.arr[1] \u003e\u003e (64 - n)\n\tz.arr[1] = (z.arr[1] \u003c\u003c n) | a\n\nsh128:\n\ta = z.arr[2] \u003e\u003e (64 - n)\n\tz.arr[2] = (z.arr[2] \u003c\u003c n) | b\n\nsh192:\n\tz.arr[3] = (z.arr[3] \u003c\u003c n) | a\n\n\treturn z\n}\n\n// Rsh sets z = x \u003e\u003e n and returns z.\nfunc (z *Uint) Rsh(x *Uint, n uint) *Uint {\n\t// n % 64 == 0\n\tif n\u00260x3f == 0 {\n\t\tswitch n {\n\t\tcase 0:\n\t\t\treturn z.Set(x)\n\t\tcase 64:\n\t\t\treturn z.rsh64(x)\n\t\tcase 128:\n\t\t\treturn z.rsh128(x)\n\t\tcase 192:\n\t\t\treturn z.rsh192(x)\n\t\tdefault:\n\t\t\treturn z.Clear()\n\t\t}\n\t}\n\tvar a, b uint64\n\t// Big swaps first\n\tswitch {\n\tcase n \u003e 192:\n\t\tif n \u003e 256 {\n\t\t\treturn z.Clear()\n\t\t}\n\t\tz.rsh192(x)\n\t\tn -= 192\n\t\tgoto sh192\n\tcase n \u003e 128:\n\t\tz.rsh128(x)\n\t\tn -= 128\n\t\tgoto sh128\n\tcase n \u003e 64:\n\t\tz.rsh64(x)\n\t\tn -= 64\n\t\tgoto sh64\n\tdefault:\n\t\tz.Set(x)\n\t}\n\n\t// remaining shifts\n\ta = z.arr[3] \u003c\u003c (64 - n)\n\tz.arr[3] = z.arr[3] \u003e\u003e n\n\nsh64:\n\tb = z.arr[2] \u003c\u003c (64 - n)\n\tz.arr[2] = (z.arr[2] \u003e\u003e n) | a\n\nsh128:\n\ta = z.arr[1] \u003c\u003c (64 - n)\n\tz.arr[1] = (z.arr[1] \u003e\u003e n) | b\n\nsh192:\n\tz.arr[0] = (z.arr[0] \u003e\u003e n) | a\n\n\treturn z\n}\n\n// SRsh (Signed/Arithmetic right shift)\n// considers z to be a signed integer, during right-shift\n// and sets z = x \u003e\u003e n and returns z.\nfunc (z *Uint) SRsh(x *Uint, n uint) *Uint {\n\t// If the MSB is 0, SRsh is same as Rsh.\n\tif !x.isBitSet(255) {\n\t\treturn z.Rsh(x, n)\n\t}\n\tif n%64 == 0 {\n\t\tswitch n {\n\t\tcase 0:\n\t\t\treturn z.Set(x)\n\t\tcase 64:\n\t\t\treturn z.srsh64(x)\n\t\tcase 128:\n\t\t\treturn z.srsh128(x)\n\t\tcase 192:\n\t\t\treturn z.srsh192(x)\n\t\tdefault:\n\t\t\treturn z.SetAllOne()\n\t\t}\n\t}\n\tvar a uint64 = MaxUint64 \u003c\u003c (64 - n%64)\n\t// Big swaps first\n\tswitch {\n\tcase n \u003e 192:\n\t\tif n \u003e 256 {\n\t\t\treturn z.SetAllOne()\n\t\t}\n\t\tz.srsh192(x)\n\t\tn -= 192\n\t\tgoto sh192\n\tcase n \u003e 128:\n\t\tz.srsh128(x)\n\t\tn -= 128\n\t\tgoto sh128\n\tcase n \u003e 64:\n\t\tz.srsh64(x)\n\t\tn -= 64\n\t\tgoto sh64\n\tdefault:\n\t\tz.Set(x)\n\t}\n\n\t// remaining shifts\n\tz.arr[3], a = (z.arr[3]\u003e\u003en)|a, z.arr[3]\u003c\u003c(64-n)\n\nsh64:\n\tz.arr[2], a = (z.arr[2]\u003e\u003en)|a, z.arr[2]\u003c\u003c(64-n)\n\nsh128:\n\tz.arr[1], a = (z.arr[1]\u003e\u003en)|a, z.arr[1]\u003c\u003c(64-n)\n\nsh192:\n\tz.arr[0] = (z.arr[0] \u003e\u003e n) | a\n\n\treturn z\n}\n\nfunc (z *Uint) lsh64(x *Uint) *Uint {\n\tz.arr[3], z.arr[2], z.arr[1], z.arr[0] = x.arr[2], x.arr[1], x.arr[0], 0\n\treturn z\n}\n\nfunc (z *Uint) lsh128(x *Uint) *Uint {\n\tz.arr[3], z.arr[2], z.arr[1], z.arr[0] = x.arr[1], x.arr[0], 0, 0\n\treturn z\n}\n\nfunc (z *Uint) lsh192(x *Uint) *Uint {\n\tz.arr[3], z.arr[2], z.arr[1], z.arr[0] = x.arr[0], 0, 0, 0\n\treturn z\n}\n\nfunc (z *Uint) rsh64(x *Uint) *Uint {\n\tz.arr[3], z.arr[2], z.arr[1], z.arr[0] = 0, x.arr[3], x.arr[2], x.arr[1]\n\treturn z\n}\n\nfunc (z *Uint) rsh128(x *Uint) *Uint {\n\tz.arr[3], z.arr[2], z.arr[1], z.arr[0] = 0, 0, x.arr[3], x.arr[2]\n\treturn z\n}\n\nfunc (z *Uint) rsh192(x *Uint) *Uint {\n\tz.arr[3], z.arr[2], z.arr[1], z.arr[0] = 0, 0, 0, x.arr[3]\n\treturn z\n}\n\nfunc (z *Uint) srsh64(x *Uint) *Uint {\n\tz.arr[3], z.arr[2], z.arr[1], z.arr[0] = MaxUint64, x.arr[3], x.arr[2], x.arr[1]\n\treturn z\n}\n\nfunc (z *Uint) srsh128(x *Uint) *Uint {\n\tz.arr[3], z.arr[2], z.arr[1], z.arr[0] = MaxUint64, MaxUint64, x.arr[3], x.arr[2]\n\treturn z\n}\n\nfunc (z *Uint) srsh192(x *Uint) *Uint {\n\tz.arr[3], z.arr[2], z.arr[1], z.arr[0] = MaxUint64, MaxUint64, MaxUint64, x.arr[3]\n\treturn z\n}\n"},{"name":"bitwise_test.gno","body":"package uint256\n\nimport \"testing\"\n\ntype logicOpTest struct {\n\tname string\n\tx Uint\n\ty Uint\n\twant Uint\n}\n\nfunc TestOr(t *testing.T) {\n\ttests := []logicOpTest{\n\t\t{\n\t\t\tname: \"all zeros\",\n\t\t\tx: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t\ty: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t\twant: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t},\n\t\t{\n\t\t\tname: \"all ones\",\n\t\t\tx: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t\ty: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t\twant: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t},\n\t\t{\n\t\t\tname: \"mixed\",\n\t\t\tx: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), 0, 0}},\n\t\t\ty: Uint{arr: [4]uint64{0, 0, ^uint64(0), ^uint64(0)}},\n\t\t\twant: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t},\n\t\t{\n\t\t\tname: \"one operand all ones\",\n\t\t\tx: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t\ty: Uint{arr: [4]uint64{0x5555555555555555, 0xAAAAAAAAAAAAAAAA, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000}},\n\t\t\twant: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tres := new(Uint).Or(\u0026tc.x, \u0026tc.y)\n\t\t\tif *res != tc.want {\n\t\t\t\tt.Errorf(\"Or(%s, %s) = %s, want %s\", tc.x.ToString(), tc.y.ToString(), res.ToString(), (tc.want).ToString())\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestAnd(t *testing.T) {\n\ttests := []logicOpTest{\n\t\t{\n\t\t\tname: \"all zeros\",\n\t\t\tx: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t\ty: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t\twant: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t},\n\t\t{\n\t\t\tname: \"all ones\",\n\t\t\tx: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t\ty: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t\twant: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t},\n\t\t{\n\t\t\tname: \"mixed\",\n\t\t\tx: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t\ty: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t\twant: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t},\n\t\t{\n\t\t\tname: \"mixed 2\",\n\t\t\tx: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t\ty: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t\twant: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t},\n\t\t{\n\t\t\tname: \"mixed 3\",\n\t\t\tx: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), 0, 0}},\n\t\t\ty: Uint{arr: [4]uint64{0, 0, ^uint64(0), ^uint64(0)}},\n\t\t\twant: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t},\n\t\t{\n\t\t\tname: \"one operand zero\",\n\t\t\tx: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t\ty: Uint{arr: [4]uint64{0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF}},\n\t\t\twant: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t},\n\t\t{\n\t\t\tname: \"one operand all ones\",\n\t\t\tx: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t\ty: Uint{arr: [4]uint64{0x5555555555555555, 0xAAAAAAAAAAAAAAAA, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000}},\n\t\t\twant: Uint{arr: [4]uint64{0x5555555555555555, 0xAAAAAAAAAAAAAAAA, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000}},\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tres := new(Uint).And(\u0026tc.x, \u0026tc.y)\n\t\t\tif *res != tc.want {\n\t\t\t\tt.Errorf(\"And(%s, %s) = %s, want %s\", tc.x.ToString(), tc.y.ToString(), res.ToString(), (tc.want).ToString())\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestNot(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tx Uint\n\t\twant Uint\n\t}{\n\t\t{\n\t\t\tname: \"all zeros\",\n\t\t\tx: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t\twant: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t},\n\t\t{\n\t\t\tname: \"all ones\",\n\t\t\tx: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t\twant: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t},\n\t\t{\n\t\t\tname: \"mixed\",\n\t\t\tx: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), 0, 0}},\n\t\t\twant: Uint{arr: [4]uint64{0, 0, ^uint64(0), ^uint64(0)}},\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tres := new(Uint).Not(\u0026tc.x)\n\t\t\tif *res != tc.want {\n\t\t\t\tt.Errorf(\"Not(%s) = %s, want %s\", tc.x.ToString(), res.ToString(), (tc.want).ToString())\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestAndNot(t *testing.T) {\n\ttests := []logicOpTest{\n\t\t{\n\t\t\tname: \"all zeros\",\n\t\t\tx: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t\ty: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t\twant: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t},\n\t\t{\n\t\t\tname: \"all ones\",\n\t\t\tx: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t\ty: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t\twant: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t},\n\t\t{\n\t\t\tname: \"mixed\",\n\t\t\tx: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t\ty: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t\twant: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t},\n\t\t{\n\t\t\tname: \"mixed 2\",\n\t\t\tx: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t\ty: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t\twant: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t},\n\t\t{\n\t\t\tname: \"mixed 3\",\n\t\t\tx: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), 0, 0}},\n\t\t\ty: Uint{arr: [4]uint64{0, 0, ^uint64(0), ^uint64(0)}},\n\t\t\twant: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), 0, 0}},\n\t\t},\n\t\t{\n\t\t\tname: \"one operand zero\",\n\t\t\tx: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t\ty: Uint{arr: [4]uint64{0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF}},\n\t\t\twant: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t},\n\t\t{\n\t\t\tname: \"one operand all ones\",\n\t\t\tx: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t\ty: Uint{arr: [4]uint64{0x5555555555555555, 0xAAAAAAAAAAAAAAAA, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000}},\n\t\t\twant: Uint{arr: [4]uint64{0xAAAAAAAAAAAAAAAA, 0x5555555555555555, 0x0000000000000000, ^uint64(0)}},\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tres := new(Uint).AndNot(\u0026tc.x, \u0026tc.y)\n\t\t\tif *res != tc.want {\n\t\t\t\tt.Errorf(\"AndNot(%s, %s) = %s, want %s\", tc.x.ToString(), tc.y.ToString(), res.ToString(), (tc.want).ToString())\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestXor(t *testing.T) {\n\ttests := []logicOpTest{\n\t\t{\n\t\t\tname: \"all zeros\",\n\t\t\tx: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t\ty: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t\twant: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t},\n\t\t{\n\t\t\tname: \"all ones\",\n\t\t\tx: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t\ty: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t\twant: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t},\n\t\t{\n\t\t\tname: \"mixed\",\n\t\t\tx: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t\ty: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t\twant: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t},\n\t\t{\n\t\t\tname: \"mixed 2\",\n\t\t\tx: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t\ty: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t\twant: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t},\n\t\t{\n\t\t\tname: \"mixed 3\",\n\t\t\tx: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), 0, 0}},\n\t\t\ty: Uint{arr: [4]uint64{0, 0, ^uint64(0), ^uint64(0)}},\n\t\t\twant: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t},\n\t\t{\n\t\t\tname: \"one operand zero\",\n\t\t\tx: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t\ty: Uint{arr: [4]uint64{0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF}},\n\t\t\twant: Uint{arr: [4]uint64{0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF}},\n\t\t},\n\t\t{\n\t\t\tname: \"one operand all ones\",\n\t\t\tx: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t\ty: Uint{arr: [4]uint64{0x5555555555555555, 0xAAAAAAAAAAAAAAAA, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000}},\n\t\t\twant: Uint{arr: [4]uint64{0xAAAAAAAAAAAAAAAA, 0x5555555555555555, 0x0000000000000000, ^uint64(0)}},\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tres := new(Uint).Xor(\u0026tc.x, \u0026tc.y)\n\t\t\tif *res != tc.want {\n\t\t\t\tt.Errorf(\"Xor(%s, %s) = %s, want %s\", tc.x.ToString(), tc.y.ToString(), res.ToString(), (tc.want).ToString())\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestLsh(t *testing.T) {\n\ttests := []struct {\n\t\tx string\n\t\ty uint\n\t\twant string\n\t}{\n\t\t{\"0\", 0, \"0\"},\n\t\t{\"0\", 1, \"0\"},\n\t\t{\"0\", 64, \"0\"},\n\t\t{\"1\", 0, \"1\"},\n\t\t{\"1\", 1, \"2\"},\n\t\t{\"1\", 64, \"18446744073709551616\"},\n\t\t{\"1\", 128, \"340282366920938463463374607431768211456\"},\n\t\t{\"1\", 192, \"6277101735386680763835789423207666416102355444464034512896\"},\n\t\t{\"1\", 255, \"57896044618658097711785492504343953926634992332820282019728792003956564819968\"},\n\t\t{\"1\", 256, \"0\"},\n\t\t{\"31337\", 0, \"31337\"},\n\t\t{\"31337\", 1, \"62674\"},\n\t\t{\"31337\", 64, \"578065619037836218990592\"},\n\t\t{\"31337\", 128, \"10663428532201448629551770073089320442396672\"},\n\t\t{\"31337\", 192, \"196705537081812415096322133155058642481399512563169449530621952\"},\n\t\t{\"31337\", 193, \"393411074163624830192644266310117284962799025126338899061243904\"},\n\t\t{\"31337\", 255, \"57896044618658097711785492504343953926634992332820282019728792003956564819968\"},\n\t\t{\"31337\", 256, \"0\"},\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\twant, err := FromDecimal(tc.want)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := \u0026Uint{}\n\t\tgot.Lsh(x, tc.y)\n\n\t\tif got.Neq(want) {\n\t\t\tt.Errorf(\"Lsh(%s, %d) = %s, want %s\", tc.x, tc.y, got.ToString(), want.ToString())\n\t\t}\n\t}\n}\n\nfunc TestRsh(t *testing.T) {\n\ttests := []struct {\n\t\tx string\n\t\ty uint\n\t\twant string\n\t}{\n\t\t{\"0\", 0, \"0\"},\n\t\t{\"0\", 1, \"0\"},\n\t\t{\"0\", 64, \"0\"},\n\t\t{\"1\", 0, \"1\"},\n\t\t{\"1\", 1, \"0\"},\n\t\t{\"1\", 64, \"0\"},\n\t\t{\"1\", 128, \"0\"},\n\t\t{\"1\", 192, \"0\"},\n\t\t{\"1\", 255, \"0\"},\n\t\t{\"57896044618658097711785492504343953926634992332820282019728792003956564819968\", 255, \"1\"},\n\t\t{\"6277101735386680763835789423207666416102355444464034512896\", 192, \"1\"},\n\t\t{\"340282366920938463463374607431768211456\", 128, \"1\"},\n\t\t{\"18446744073709551616\", 64, \"1\"},\n\t\t{\"393411074163624830192644266310117284962799025126338899061243904\", 193, \"31337\"},\n\t\t{\"196705537081812415096322133155058642481399512563169449530621952\", 192, \"31337\"},\n\t\t{\"10663428532201448629551770073089320442396672\", 128, \"31337\"},\n\t\t{\"578065619037836218990592\", 64, \"31337\"},\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\twant, err := FromDecimal(tc.want)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := \u0026Uint{}\n\t\tgot.Rsh(x, tc.y)\n\n\t\tif got.Neq(want) {\n\t\t\tt.Errorf(\"Rsh(%s, %d) = %s, want %s\", tc.x, tc.y, got.ToString(), want.ToString())\n\t\t}\n\t}\n}\n"},{"name":"cmp.gno","body":"// cmp (or, comparisons) includes methods for comparing Uint instances.\n// These comparison functions cover a range of operations including equality checks, less than/greater than\n// evaluations, and specialized comparisons such as signed greater than. These are fundamental for logical\n// decision making based on Uint values.\npackage uint256\n\nimport (\n\t\"math/bits\"\n)\n\n// Cmp compares z and x and returns:\n//\n//\t-1 if z \u003c x\n//\t 0 if z == x\n//\t+1 if z \u003e x\nfunc (z *Uint) Cmp(x *Uint) (r int) {\n\t// z \u003c x \u003c=\u003e z - x \u003c 0 i.e. when subtraction overflows.\n\td0, carry := bits.Sub64(z.arr[0], x.arr[0], 0)\n\td1, carry := bits.Sub64(z.arr[1], x.arr[1], carry)\n\td2, carry := bits.Sub64(z.arr[2], x.arr[2], carry)\n\td3, carry := bits.Sub64(z.arr[3], x.arr[3], carry)\n\tif carry == 1 {\n\t\treturn -1\n\t}\n\tif d0|d1|d2|d3 == 0 {\n\t\treturn 0\n\t}\n\treturn 1\n}\n\n// IsZero returns true if z == 0\nfunc (z *Uint) IsZero() bool {\n\treturn (z.arr[0] | z.arr[1] | z.arr[2] | z.arr[3]) == 0\n}\n\n// Sign returns:\n//\n//\t-1 if z \u003c 0\n//\t 0 if z == 0\n//\t+1 if z \u003e 0\n//\n// Where z is interpreted as a two's complement signed number\nfunc (z *Uint) Sign() int {\n\tif z.IsZero() {\n\t\treturn 0\n\t}\n\tif z.arr[3] \u003c 0x8000000000000000 {\n\t\treturn 1\n\t}\n\treturn -1\n}\n\n// LtUint64 returns true if z is smaller than n\nfunc (z *Uint) LtUint64(n uint64) bool {\n\treturn z.arr[0] \u003c n \u0026\u0026 (z.arr[1]|z.arr[2]|z.arr[3]) == 0\n}\n\n// GtUint64 returns true if z is larger than n\nfunc (z *Uint) GtUint64(n uint64) bool {\n\treturn z.arr[0] \u003e n || (z.arr[1]|z.arr[2]|z.arr[3]) != 0\n}\n\n// Lt returns true if z \u003c x\nfunc (z *Uint) Lt(x *Uint) bool {\n\t// z \u003c x \u003c=\u003e z - x \u003c 0 i.e. when subtraction overflows.\n\t_, carry := bits.Sub64(z.arr[0], x.arr[0], 0)\n\t_, carry = bits.Sub64(z.arr[1], x.arr[1], carry)\n\t_, carry = bits.Sub64(z.arr[2], x.arr[2], carry)\n\t_, carry = bits.Sub64(z.arr[3], x.arr[3], carry)\n\n\treturn carry != 0\n}\n\n// Gt returns true if z \u003e x\nfunc (z *Uint) Gt(x *Uint) bool {\n\treturn x.Lt(z)\n}\n\n// Lte returns true if z \u003c= x\nfunc (z *Uint) Lte(x *Uint) bool {\n\tcond1 := z.Lt(x)\n\tcond2 := z.Eq(x)\n\n\tif cond1 || cond2 {\n\t\treturn true\n\t}\n\treturn false\n}\n\n// Gte returns true if z \u003e= x\nfunc (z *Uint) Gte(x *Uint) bool {\n\tcond1 := z.Gt(x)\n\tcond2 := z.Eq(x)\n\n\tif cond1 || cond2 {\n\t\treturn true\n\t}\n\treturn false\n}\n\n// Eq returns true if z == x\nfunc (z *Uint) Eq(x *Uint) bool {\n\treturn (z.arr[0] == x.arr[0]) \u0026\u0026 (z.arr[1] == x.arr[1]) \u0026\u0026 (z.arr[2] == x.arr[2]) \u0026\u0026 (z.arr[3] == x.arr[3])\n}\n\n// Neq returns true if z != x\nfunc (z *Uint) Neq(x *Uint) bool {\n\treturn !z.Eq(x)\n}\n\n// Sgt interprets z and x as signed integers, and returns\n// true if z \u003e x\nfunc (z *Uint) Sgt(x *Uint) bool {\n\tzSign := z.Sign()\n\txSign := x.Sign()\n\n\tswitch {\n\tcase zSign \u003e= 0 \u0026\u0026 xSign \u003c 0:\n\t\treturn true\n\tcase zSign \u003c 0 \u0026\u0026 xSign \u003e= 0:\n\t\treturn false\n\tdefault:\n\t\treturn z.Gt(x)\n\t}\n}\n"},{"name":"cmp_test.gno","body":"package uint256\n\nimport (\n\t\"strings\"\n\t\"testing\"\n)\n\nfunc TestCmp(t *testing.T) {\n\ttests := []struct {\n\t\tx, y string\n\t\twant int\n\t}{\n\t\t{\"0\", \"0\", 0},\n\t\t{\"0\", \"1\", -1},\n\t\t{\"1\", \"0\", 1},\n\t\t{\"1\", \"1\", 0},\n\t\t{\"10\", \"10\", 0},\n\t\t{\"10\", \"11\", -1},\n\t\t{\"11\", \"10\", 1},\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\ty, err := FromDecimal(tc.y)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := x.Cmp(y)\n\t\tif got != tc.want {\n\t\t\tt.Errorf(\"Cmp(%s, %s) = %v, want %v\", tc.x, tc.y, got, tc.want)\n\t\t}\n\t}\n}\n\nfunc TestIsZero(t *testing.T) {\n\ttests := []struct {\n\t\tx string\n\t\twant bool\n\t}{\n\t\t{\"0\", true},\n\t\t{\"1\", false},\n\t\t{\"10\", false},\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := x.IsZero()\n\t\tif got != tc.want {\n\t\t\tt.Errorf(\"IsZero(%s) = %v, want %v\", tc.x, got, tc.want)\n\t\t}\n\t}\n}\n\nfunc TestLtUint64(t *testing.T) {\n\ttests := []struct {\n\t\tx string\n\t\ty uint64\n\t\twant bool\n\t}{\n\t\t{\"0\", 1, true},\n\t\t{\"1\", 0, false},\n\t\t{\"10\", 10, false},\n\t\t{\"0xffffffffffffffff\", 0, false},\n\t\t{\"0x10000000000000000\", 10000000000000000, false},\n\t}\n\n\tfor _, tc := range tests {\n\t\tvar x *Uint\n\t\tvar err error\n\n\t\tif strings.HasPrefix(tc.x, \"0x\") {\n\t\t\tx, err = FromHex(tc.x)\n\t\t\tif err != nil {\n\t\t\t\tt.Error(err)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t} else {\n\t\t\tx, err = FromDecimal(tc.x)\n\t\t\tif err != nil {\n\t\t\t\tt.Error(err)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\tgot := x.LtUint64(tc.y)\n\n\t\tif got != tc.want {\n\t\t\tt.Errorf(\"LtUint64(%s, %d) = %v, want %v\", tc.x, tc.y, got, tc.want)\n\t\t}\n\t}\n}\n\nfunc TestSGT(t *testing.T) {\n\tx := MustFromHex(\"0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe\")\n\ty := MustFromHex(\"0x0\")\n\tactual := x.Sgt(y)\n\tif actual {\n\t\tt.Fatalf(\"Expected %v false\", actual)\n\t}\n\n\tx = MustFromHex(\"0x0\")\n\ty = MustFromHex(\"0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe\")\n\tactual = x.Sgt(y)\n\tif !actual {\n\t\tt.Fatalf(\"Expected %v true\", actual)\n\t}\n}\n\nfunc TestEq(t *testing.T) {\n\ttests := []struct {\n\t\tx string\n\t\ty string\n\t\twant bool\n\t}{\n\t\t{\"0xffffffffffffffff\", \"18446744073709551615\", true},\n\t\t{\"0x10000000000000000\", \"18446744073709551616\", true},\n\t\t{\"0\", \"0\", true},\n\t\t{\"115792089237316195423570985008687907853269984665640564039457584007913129639935\", \"115792089237316195423570985008687907853269984665640564039457584007913129639935\", true},\n\t}\n\n\tfor i, tc := range tests {\n\t\tvar x *Uint\n\t\tvar err error\n\n\t\tif strings.HasPrefix(tc.x, \"0x\") {\n\t\t\tx, err = FromHex(tc.x)\n\t\t\tif err != nil {\n\t\t\t\tt.Error(err)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t} else {\n\t\t\tx, err = FromDecimal(tc.x)\n\t\t\tif err != nil {\n\t\t\t\tt.Error(err)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\ty, err := FromDecimal(tc.y)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := x.Eq(y)\n\n\t\tif got != tc.want {\n\t\t\tt.Errorf(\"Eq(%s, %s) = %v, want %v\", tc.x, tc.y, got, tc.want)\n\t\t}\n\t}\n}\n"},{"name":"conversion.gno","body":"// conversions contains methods for converting Uint instances to other types and vice versa.\n// This includes conversions to and from basic types such as uint64 and int32, as well as string representations\n// and byte slices. Additionally, it covers marshaling and unmarshaling for JSON and other text formats.\npackage uint256\n\nimport (\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"strconv\"\n\t\"strings\"\n)\n\n// Uint64 returns the lower 64-bits of z\nfunc (z *Uint) Uint64() uint64 {\n\treturn z.arr[0]\n}\n\n// Uint64WithOverflow returns the lower 64-bits of z and bool whether overflow occurred\nfunc (z *Uint) Uint64WithOverflow() (uint64, bool) {\n\treturn z.arr[0], (z.arr[1] | z.arr[2] | z.arr[3]) != 0\n}\n\n// SetUint64 sets z to the value x\nfunc (z *Uint) SetUint64(x uint64) *Uint {\n\tz.arr[3], z.arr[2], z.arr[1], z.arr[0] = 0, 0, 0, x\n\treturn z\n}\n\n// IsUint64 reports whether z can be represented as a uint64.\nfunc (z *Uint) IsUint64() bool {\n\treturn (z.arr[1] | z.arr[2] | z.arr[3]) == 0\n}\n\n// Dec returns the decimal representation of z.\nfunc (z *Uint) Dec() string {\n\tif z.IsZero() {\n\t\treturn \"0\"\n\t}\n\tif z.IsUint64() {\n\t\treturn strconv.FormatUint(z.Uint64(), 10)\n\t}\n\n\t// The max uint64 value being 18446744073709551615, the largest\n\t// power-of-ten below that is 10000000000000000000.\n\t// When we do a DivMod using that number, the remainder that we\n\t// get back is the lower part of the output.\n\t//\n\t// The ascii-output of remainder will never exceed 19 bytes (since it will be\n\t// below 10000000000000000000).\n\t//\n\t// Algorithm example using 100 as divisor\n\t//\n\t// 12345 % 100 = 45 (rem)\n\t// 12345 / 100 = 123 (quo)\n\t// -\u003e output '45', continue iterate on 123\n\tvar (\n\t\t// out is 98 bytes long: 78 (max size of a string without leading zeroes,\n\t\t// plus slack so we can copy 19 bytes every iteration).\n\t\t// We init it with zeroes, because when strconv appends the ascii representations,\n\t\t// it will omit leading zeroes.\n\t\tout = []byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n\t\tdivisor = NewUint(10000000000000000000) // 20 digits\n\t\ty = new(Uint).Set(z) // copy to avoid modifying z\n\t\tpos = len(out) // position to write to\n\t\tbuf = make([]byte, 0, 19) // buffer to write uint64:s to\n\t)\n\tfor {\n\t\t// Obtain Q and R for divisor\n\t\tvar quot Uint\n\t\trem := udivrem(quot.arr[:], y.arr[:], divisor)\n\t\ty.Set(\u0026quot) // Set Q for next loop\n\t\t// Convert the R to ascii representation\n\t\tbuf = strconv.AppendUint(buf[:0], rem.Uint64(), 10)\n\t\t// Copy in the ascii digits\n\t\tcopy(out[pos-len(buf):], buf)\n\t\tif y.IsZero() {\n\t\t\tbreak\n\t\t}\n\t\t// Move 19 digits left\n\t\tpos -= 19\n\t}\n\t// skip leading zeroes by only using the 'used size' of buf\n\treturn string(out[pos-len(buf):])\n}\n\nfunc (z *Uint) Scan(src interface{}) error {\n\tif src == nil {\n\t\tz.Clear()\n\t\treturn nil\n\t}\n\n\tswitch src := src.(type) {\n\tcase string:\n\t\treturn z.scanScientificFromString(src)\n\tcase []byte:\n\t\treturn z.scanScientificFromString(string(src))\n\t}\n\treturn errors.New(\"default // unsupported type: can't convert to uint256.Uint\")\n}\n\nfunc (z *Uint) scanScientificFromString(src string) error {\n\tif len(src) == 0 {\n\t\tz.Clear()\n\t\treturn nil\n\t}\n\n\tidx := strings.IndexByte(src, 'e')\n\tif idx == -1 {\n\t\treturn z.SetFromDecimal(src)\n\t}\n\tif err := z.SetFromDecimal(src[:idx]); err != nil {\n\t\treturn err\n\t}\n\tif src[(idx+1):] == \"0\" {\n\t\treturn nil\n\t}\n\texp := new(Uint)\n\tif err := exp.SetFromDecimal(src[(idx + 1):]); err != nil {\n\t\treturn err\n\t}\n\tif exp.GtUint64(77) { // 10**78 is larger than 2**256\n\t\treturn ErrBig256Range\n\t}\n\texp.Exp(NewUint(10), exp)\n\tif _, overflow := z.MulOverflow(z, exp); overflow {\n\t\treturn ErrBig256Range\n\t}\n\treturn nil\n}\n\n// ToString returns the decimal string representation of z. It returns an empty string if z is nil.\n// OBS: doesn't exist from holiman's uint256\nfunc (z *Uint) ToString() string {\n\tif z == nil {\n\t\treturn \"\"\n\t}\n\n\treturn z.Dec()\n}\n\n// MarshalJSON implements json.Marshaler.\n// MarshalJSON marshals using the 'decimal string' representation. This is _not_ compatible\n// with big.Uint: big.Uint marshals into JSON 'native' numeric format.\n//\n// The JSON native format is, on some platforms, (e.g. javascript), limited to 53-bit large\n// integer space. Thus, U256 uses string-format, which is not compatible with\n// big.int (big.Uint refuses to unmarshal a string representation).\nfunc (z *Uint) MarshalJSON() ([]byte, error) {\n\treturn []byte(`\"` + z.Dec() + `\"`), nil\n}\n\n// UnmarshalJSON implements json.Unmarshaler. UnmarshalJSON accepts either\n// - Quoted string: either hexadecimal OR decimal\n// - Not quoted string: only decimal\nfunc (z *Uint) UnmarshalJSON(input []byte) error {\n\tif len(input) \u003c 2 || input[0] != '\"' || input[len(input)-1] != '\"' {\n\t\t// if not quoted, it must be decimal\n\t\treturn z.fromDecimal(string(input))\n\t}\n\treturn z.UnmarshalText(input[1 : len(input)-1])\n}\n\n// MarshalText implements encoding.TextMarshaler\n// MarshalText marshals using the decimal representation (compatible with big.Uint)\nfunc (z *Uint) MarshalText() ([]byte, error) {\n\treturn []byte(z.Dec()), nil\n}\n\n// UnmarshalText implements encoding.TextUnmarshaler. This method\n// can unmarshal either hexadecimal or decimal.\n// - For hexadecimal, the input _must_ be prefixed with 0x or 0X\nfunc (z *Uint) UnmarshalText(input []byte) error {\n\tif len(input) \u003e= 2 \u0026\u0026 input[0] == '0' \u0026\u0026 (input[1] == 'x' || input[1] == 'X') {\n\t\treturn z.fromHex(string(input))\n\t}\n\treturn z.fromDecimal(string(input))\n}\n\n// SetBytes interprets buf as the bytes of a big-endian unsigned\n// integer, sets z to that value, and returns z.\n// If buf is larger than 32 bytes, the last 32 bytes is used.\nfunc (z *Uint) SetBytes(buf []byte) *Uint {\n\tswitch l := len(buf); l {\n\tcase 0:\n\t\tz.Clear()\n\tcase 1:\n\t\tz.SetBytes1(buf)\n\tcase 2:\n\t\tz.SetBytes2(buf)\n\tcase 3:\n\t\tz.SetBytes3(buf)\n\tcase 4:\n\t\tz.SetBytes4(buf)\n\tcase 5:\n\t\tz.SetBytes5(buf)\n\tcase 6:\n\t\tz.SetBytes6(buf)\n\tcase 7:\n\t\tz.SetBytes7(buf)\n\tcase 8:\n\t\tz.SetBytes8(buf)\n\tcase 9:\n\t\tz.SetBytes9(buf)\n\tcase 10:\n\t\tz.SetBytes10(buf)\n\tcase 11:\n\t\tz.SetBytes11(buf)\n\tcase 12:\n\t\tz.SetBytes12(buf)\n\tcase 13:\n\t\tz.SetBytes13(buf)\n\tcase 14:\n\t\tz.SetBytes14(buf)\n\tcase 15:\n\t\tz.SetBytes15(buf)\n\tcase 16:\n\t\tz.SetBytes16(buf)\n\tcase 17:\n\t\tz.SetBytes17(buf)\n\tcase 18:\n\t\tz.SetBytes18(buf)\n\tcase 19:\n\t\tz.SetBytes19(buf)\n\tcase 20:\n\t\tz.SetBytes20(buf)\n\tcase 21:\n\t\tz.SetBytes21(buf)\n\tcase 22:\n\t\tz.SetBytes22(buf)\n\tcase 23:\n\t\tz.SetBytes23(buf)\n\tcase 24:\n\t\tz.SetBytes24(buf)\n\tcase 25:\n\t\tz.SetBytes25(buf)\n\tcase 26:\n\t\tz.SetBytes26(buf)\n\tcase 27:\n\t\tz.SetBytes27(buf)\n\tcase 28:\n\t\tz.SetBytes28(buf)\n\tcase 29:\n\t\tz.SetBytes29(buf)\n\tcase 30:\n\t\tz.SetBytes30(buf)\n\tcase 31:\n\t\tz.SetBytes31(buf)\n\tdefault:\n\t\tz.SetBytes32(buf[l-32:])\n\t}\n\treturn z\n}\n\n// SetBytes1 is identical to SetBytes(in[:1]), but panics is input is too short\nfunc (z *Uint) SetBytes1(in []byte) *Uint {\n\tz.arr[3], z.arr[2], z.arr[1] = 0, 0, 0\n\tz.arr[0] = uint64(in[0])\n\treturn z\n}\n\n// SetBytes2 is identical to SetBytes(in[:2]), but panics is input is too short\nfunc (z *Uint) SetBytes2(in []byte) *Uint {\n\t_ = in[1] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3], z.arr[2], z.arr[1] = 0, 0, 0\n\tz.arr[0] = uint64(binary.BigEndian.Uint16(in[0:2]))\n\treturn z\n}\n\n// SetBytes3 is identical to SetBytes(in[:3]), but panics is input is too short\nfunc (z *Uint) SetBytes3(in []byte) *Uint {\n\t_ = in[2] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3], z.arr[2], z.arr[1] = 0, 0, 0\n\tz.arr[0] = uint64(binary.BigEndian.Uint16(in[1:3])) | uint64(in[0])\u003c\u003c16\n\treturn z\n}\n\n// SetBytes4 is identical to SetBytes(in[:4]), but panics is input is too short\nfunc (z *Uint) SetBytes4(in []byte) *Uint {\n\t_ = in[3] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3], z.arr[2], z.arr[1] = 0, 0, 0\n\tz.arr[0] = uint64(binary.BigEndian.Uint32(in[0:4]))\n\treturn z\n}\n\n// SetBytes5 is identical to SetBytes(in[:5]), but panics is input is too short\nfunc (z *Uint) SetBytes5(in []byte) *Uint {\n\t_ = in[4] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3], z.arr[2], z.arr[1] = 0, 0, 0\n\tz.arr[0] = bigEndianUint40(in[0:5])\n\treturn z\n}\n\n// SetBytes6 is identical to SetBytes(in[:6]), but panics is input is too short\nfunc (z *Uint) SetBytes6(in []byte) *Uint {\n\t_ = in[5] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3], z.arr[2], z.arr[1] = 0, 0, 0\n\tz.arr[0] = bigEndianUint48(in[0:6])\n\treturn z\n}\n\n// SetBytes7 is identical to SetBytes(in[:7]), but panics is input is too short\nfunc (z *Uint) SetBytes7(in []byte) *Uint {\n\t_ = in[6] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3], z.arr[2], z.arr[1] = 0, 0, 0\n\tz.arr[0] = bigEndianUint56(in[0:7])\n\treturn z\n}\n\n// SetBytes8 is identical to SetBytes(in[:8]), but panics is input is too short\nfunc (z *Uint) SetBytes8(in []byte) *Uint {\n\t_ = in[7] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3], z.arr[2], z.arr[1] = 0, 0, 0\n\tz.arr[0] = binary.BigEndian.Uint64(in[0:8])\n\treturn z\n}\n\n// SetBytes9 is identical to SetBytes(in[:9]), but panics is input is too short\nfunc (z *Uint) SetBytes9(in []byte) *Uint {\n\t_ = in[8] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3], z.arr[2] = 0, 0\n\tz.arr[1] = uint64(in[0])\n\tz.arr[0] = binary.BigEndian.Uint64(in[1:9])\n\treturn z\n}\n\n// SetBytes10 is identical to SetBytes(in[:10]), but panics is input is too short\nfunc (z *Uint) SetBytes10(in []byte) *Uint {\n\t_ = in[9] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3], z.arr[2] = 0, 0\n\tz.arr[1] = uint64(binary.BigEndian.Uint16(in[0:2]))\n\tz.arr[0] = binary.BigEndian.Uint64(in[2:10])\n\treturn z\n}\n\n// SetBytes11 is identical to SetBytes(in[:11]), but panics is input is too short\nfunc (z *Uint) SetBytes11(in []byte) *Uint {\n\t_ = in[10] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3], z.arr[2] = 0, 0\n\tz.arr[1] = uint64(binary.BigEndian.Uint16(in[1:3])) | uint64(in[0])\u003c\u003c16\n\tz.arr[0] = binary.BigEndian.Uint64(in[3:11])\n\treturn z\n}\n\n// SetBytes12 is identical to SetBytes(in[:12]), but panics is input is too short\nfunc (z *Uint) SetBytes12(in []byte) *Uint {\n\t_ = in[11] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3], z.arr[2] = 0, 0\n\tz.arr[1] = uint64(binary.BigEndian.Uint32(in[0:4]))\n\tz.arr[0] = binary.BigEndian.Uint64(in[4:12])\n\treturn z\n}\n\n// SetBytes13 is identical to SetBytes(in[:13]), but panics is input is too short\nfunc (z *Uint) SetBytes13(in []byte) *Uint {\n\t_ = in[12] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3], z.arr[2] = 0, 0\n\tz.arr[1] = bigEndianUint40(in[0:5])\n\tz.arr[0] = binary.BigEndian.Uint64(in[5:13])\n\treturn z\n}\n\n// SetBytes14 is identical to SetBytes(in[:14]), but panics is input is too short\nfunc (z *Uint) SetBytes14(in []byte) *Uint {\n\t_ = in[13] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3], z.arr[2] = 0, 0\n\tz.arr[1] = bigEndianUint48(in[0:6])\n\tz.arr[0] = binary.BigEndian.Uint64(in[6:14])\n\treturn z\n}\n\n// SetBytes15 is identical to SetBytes(in[:15]), but panics is input is too short\nfunc (z *Uint) SetBytes15(in []byte) *Uint {\n\t_ = in[14] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3], z.arr[2] = 0, 0\n\tz.arr[1] = bigEndianUint56(in[0:7])\n\tz.arr[0] = binary.BigEndian.Uint64(in[7:15])\n\treturn z\n}\n\n// SetBytes16 is identical to SetBytes(in[:16]), but panics is input is too short\nfunc (z *Uint) SetBytes16(in []byte) *Uint {\n\t_ = in[15] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3], z.arr[2] = 0, 0\n\tz.arr[1] = binary.BigEndian.Uint64(in[0:8])\n\tz.arr[0] = binary.BigEndian.Uint64(in[8:16])\n\treturn z\n}\n\n// SetBytes17 is identical to SetBytes(in[:17]), but panics is input is too short\nfunc (z *Uint) SetBytes17(in []byte) *Uint {\n\t_ = in[16] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3] = 0\n\tz.arr[2] = uint64(in[0])\n\tz.arr[1] = binary.BigEndian.Uint64(in[1:9])\n\tz.arr[0] = binary.BigEndian.Uint64(in[9:17])\n\treturn z\n}\n\n// SetBytes18 is identical to SetBytes(in[:18]), but panics is input is too short\nfunc (z *Uint) SetBytes18(in []byte) *Uint {\n\t_ = in[17] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3] = 0\n\tz.arr[2] = uint64(binary.BigEndian.Uint16(in[0:2]))\n\tz.arr[1] = binary.BigEndian.Uint64(in[2:10])\n\tz.arr[0] = binary.BigEndian.Uint64(in[10:18])\n\treturn z\n}\n\n// SetBytes19 is identical to SetBytes(in[:19]), but panics is input is too short\nfunc (z *Uint) SetBytes19(in []byte) *Uint {\n\t_ = in[18] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3] = 0\n\tz.arr[2] = uint64(binary.BigEndian.Uint16(in[1:3])) | uint64(in[0])\u003c\u003c16\n\tz.arr[1] = binary.BigEndian.Uint64(in[3:11])\n\tz.arr[0] = binary.BigEndian.Uint64(in[11:19])\n\treturn z\n}\n\n// SetBytes20 is identical to SetBytes(in[:20]), but panics is input is too short\nfunc (z *Uint) SetBytes20(in []byte) *Uint {\n\t_ = in[19] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3] = 0\n\tz.arr[2] = uint64(binary.BigEndian.Uint32(in[0:4]))\n\tz.arr[1] = binary.BigEndian.Uint64(in[4:12])\n\tz.arr[0] = binary.BigEndian.Uint64(in[12:20])\n\treturn z\n}\n\n// SetBytes21 is identical to SetBytes(in[:21]), but panics is input is too short\nfunc (z *Uint) SetBytes21(in []byte) *Uint {\n\t_ = in[20] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3] = 0\n\tz.arr[2] = bigEndianUint40(in[0:5])\n\tz.arr[1] = binary.BigEndian.Uint64(in[5:13])\n\tz.arr[0] = binary.BigEndian.Uint64(in[13:21])\n\treturn z\n}\n\n// SetBytes22 is identical to SetBytes(in[:22]), but panics is input is too short\nfunc (z *Uint) SetBytes22(in []byte) *Uint {\n\t_ = in[21] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3] = 0\n\tz.arr[2] = bigEndianUint48(in[0:6])\n\tz.arr[1] = binary.BigEndian.Uint64(in[6:14])\n\tz.arr[0] = binary.BigEndian.Uint64(in[14:22])\n\treturn z\n}\n\n// SetBytes23 is identical to SetBytes(in[:23]), but panics is input is too short\nfunc (z *Uint) SetBytes23(in []byte) *Uint {\n\t_ = in[22] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3] = 0\n\tz.arr[2] = bigEndianUint56(in[0:7])\n\tz.arr[1] = binary.BigEndian.Uint64(in[7:15])\n\tz.arr[0] = binary.BigEndian.Uint64(in[15:23])\n\treturn z\n}\n\n// SetBytes24 is identical to SetBytes(in[:24]), but panics is input is too short\nfunc (z *Uint) SetBytes24(in []byte) *Uint {\n\t_ = in[23] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3] = 0\n\tz.arr[2] = binary.BigEndian.Uint64(in[0:8])\n\tz.arr[1] = binary.BigEndian.Uint64(in[8:16])\n\tz.arr[0] = binary.BigEndian.Uint64(in[16:24])\n\treturn z\n}\n\n// SetBytes25 is identical to SetBytes(in[:25]), but panics is input is too short\nfunc (z *Uint) SetBytes25(in []byte) *Uint {\n\t_ = in[24] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3] = uint64(in[0])\n\tz.arr[2] = binary.BigEndian.Uint64(in[1:9])\n\tz.arr[1] = binary.BigEndian.Uint64(in[9:17])\n\tz.arr[0] = binary.BigEndian.Uint64(in[17:25])\n\treturn z\n}\n\n// SetBytes26 is identical to SetBytes(in[:26]), but panics is input is too short\nfunc (z *Uint) SetBytes26(in []byte) *Uint {\n\t_ = in[25] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3] = uint64(binary.BigEndian.Uint16(in[0:2]))\n\tz.arr[2] = binary.BigEndian.Uint64(in[2:10])\n\tz.arr[1] = binary.BigEndian.Uint64(in[10:18])\n\tz.arr[0] = binary.BigEndian.Uint64(in[18:26])\n\treturn z\n}\n\n// SetBytes27 is identical to SetBytes(in[:27]), but panics is input is too short\nfunc (z *Uint) SetBytes27(in []byte) *Uint {\n\t_ = in[26] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3] = uint64(binary.BigEndian.Uint16(in[1:3])) | uint64(in[0])\u003c\u003c16\n\tz.arr[2] = binary.BigEndian.Uint64(in[3:11])\n\tz.arr[1] = binary.BigEndian.Uint64(in[11:19])\n\tz.arr[0] = binary.BigEndian.Uint64(in[19:27])\n\treturn z\n}\n\n// SetBytes28 is identical to SetBytes(in[:28]), but panics is input is too short\nfunc (z *Uint) SetBytes28(in []byte) *Uint {\n\t_ = in[27] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3] = uint64(binary.BigEndian.Uint32(in[0:4]))\n\tz.arr[2] = binary.BigEndian.Uint64(in[4:12])\n\tz.arr[1] = binary.BigEndian.Uint64(in[12:20])\n\tz.arr[0] = binary.BigEndian.Uint64(in[20:28])\n\treturn z\n}\n\n// SetBytes29 is identical to SetBytes(in[:29]), but panics is input is too short\nfunc (z *Uint) SetBytes29(in []byte) *Uint {\n\t_ = in[23] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3] = bigEndianUint40(in[0:5])\n\tz.arr[2] = binary.BigEndian.Uint64(in[5:13])\n\tz.arr[1] = binary.BigEndian.Uint64(in[13:21])\n\tz.arr[0] = binary.BigEndian.Uint64(in[21:29])\n\treturn z\n}\n\n// SetBytes30 is identical to SetBytes(in[:30]), but panics is input is too short\nfunc (z *Uint) SetBytes30(in []byte) *Uint {\n\t_ = in[29] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3] = bigEndianUint48(in[0:6])\n\tz.arr[2] = binary.BigEndian.Uint64(in[6:14])\n\tz.arr[1] = binary.BigEndian.Uint64(in[14:22])\n\tz.arr[0] = binary.BigEndian.Uint64(in[22:30])\n\treturn z\n}\n\n// SetBytes31 is identical to SetBytes(in[:31]), but panics is input is too short\nfunc (z *Uint) SetBytes31(in []byte) *Uint {\n\t_ = in[30] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3] = bigEndianUint56(in[0:7])\n\tz.arr[2] = binary.BigEndian.Uint64(in[7:15])\n\tz.arr[1] = binary.BigEndian.Uint64(in[15:23])\n\tz.arr[0] = binary.BigEndian.Uint64(in[23:31])\n\treturn z\n}\n\n// SetBytes32 sets z to the value of the big-endian 256-bit unsigned integer in.\nfunc (z *Uint) SetBytes32(in []byte) *Uint {\n\t_ = in[31] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3] = binary.BigEndian.Uint64(in[0:8])\n\tz.arr[2] = binary.BigEndian.Uint64(in[8:16])\n\tz.arr[1] = binary.BigEndian.Uint64(in[16:24])\n\tz.arr[0] = binary.BigEndian.Uint64(in[24:32])\n\treturn z\n}\n\n// Utility methods that are \"missing\" among the bigEndian.UintXX methods.\n\n// bigEndianUint40 returns the uint64 value represented by the 5 bytes in big-endian order.\nfunc bigEndianUint40(b []byte) uint64 {\n\t_ = b[4] // bounds check hint to compiler; see golang.org/issue/14808\n\treturn uint64(b[4]) | uint64(b[3])\u003c\u003c8 | uint64(b[2])\u003c\u003c16 | uint64(b[1])\u003c\u003c24 |\n\t\tuint64(b[0])\u003c\u003c32\n}\n\n// bigEndianUint56 returns the uint64 value represented by the 7 bytes in big-endian order.\nfunc bigEndianUint56(b []byte) uint64 {\n\t_ = b[6] // bounds check hint to compiler; see golang.org/issue/14808\n\treturn uint64(b[6]) | uint64(b[5])\u003c\u003c8 | uint64(b[4])\u003c\u003c16 | uint64(b[3])\u003c\u003c24 |\n\t\tuint64(b[2])\u003c\u003c32 | uint64(b[1])\u003c\u003c40 | uint64(b[0])\u003c\u003c48\n}\n\n// bigEndianUint48 returns the uint64 value represented by the 6 bytes in big-endian order.\nfunc bigEndianUint48(b []byte) uint64 {\n\t_ = b[5] // bounds check hint to compiler; see golang.org/issue/14808\n\treturn uint64(b[5]) | uint64(b[4])\u003c\u003c8 | uint64(b[3])\u003c\u003c16 | uint64(b[2])\u003c\u003c24 |\n\t\tuint64(b[1])\u003c\u003c32 | uint64(b[0])\u003c\u003c40\n}\n"},{"name":"conversion_test.gno","body":"package uint256\n\nimport \"testing\"\n\nfunc TestIsUint64(t *testing.T) {\n\ttests := []struct {\n\t\tx string\n\t\twant bool\n\t}{\n\t\t{\"0x0\", true},\n\t\t{\"0x1\", true},\n\t\t{\"0x10\", true},\n\t\t{\"0xffffffffffffffff\", true},\n\t\t{\"0x10000000000000000\", false},\n\t}\n\n\tfor _, tc := range tests {\n\t\tx := MustFromHex(tc.x)\n\t\tgot := x.IsUint64()\n\n\t\tif got != tc.want {\n\t\t\tt.Errorf(\"IsUint64(%s) = %v, want %v\", tc.x, got, tc.want)\n\t\t}\n\t}\n}\n\nfunc TestDec(t *testing.T) {\n\ttestCases := []struct {\n\t\tname string\n\t\tz Uint\n\t\twant string\n\t}{\n\t\t{\n\t\t\tname: \"zero\",\n\t\t\tz: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t\twant: \"0\",\n\t\t},\n\t\t{\n\t\t\tname: \"less than 20 digits\",\n\t\t\tz: Uint{arr: [4]uint64{1234567890, 0, 0, 0}},\n\t\t\twant: \"1234567890\",\n\t\t},\n\t\t{\n\t\t\tname: \"max possible value\",\n\t\t\tz: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t\twant: \"115792089237316195423570985008687907853269984665640564039457584007913129639935\",\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tresult := tc.z.Dec()\n\t\t\tif result != tc.want {\n\t\t\t\tt.Errorf(\"Dec(%v) = %s, want %s\", tc.z, result, tc.want)\n\t\t\t}\n\t\t})\n\t}\n}\n"},{"name":"error.gno","body":"package uint256\n\nimport (\n\t\"errors\"\n)\n\nvar (\n\tErrEmptyString = errors.New(\"empty hex string\")\n\tErrSyntax = errors.New(\"invalid hex string\")\n\tErrRange = errors.New(\"number out of range\")\n\tErrMissingPrefix = errors.New(\"hex string without 0x prefix\")\n\tErrEmptyNumber = errors.New(\"hex string \\\"0x\\\"\")\n\tErrLeadingZero = errors.New(\"hex number with leading zero digits\")\n\tErrBig256Range = errors.New(\"hex number \u003e 256 bits\")\n\tErrBadBufferLength = errors.New(\"bad ssz buffer length\")\n\tErrBadEncodedLength = errors.New(\"bad ssz encoded length\")\n\tErrInvalidBase = errors.New(\"invalid base\")\n\tErrInvalidBitSize = errors.New(\"invalid bit size\")\n)\n\ntype u256Error struct {\n\tfn string // function name\n\tinput string\n\terr error\n}\n\nfunc (e *u256Error) Error() string {\n\treturn e.fn + \": \" + e.input + \": \" + e.err.Error()\n}\n\nfunc (e *u256Error) Unwrap() error {\n\treturn e.err\n}\n\nfunc errEmptyString(fn, input string) error {\n\treturn \u0026u256Error{fn: fn, input: input, err: ErrEmptyString}\n}\n\nfunc errSyntax(fn, input string) error {\n\treturn \u0026u256Error{fn: fn, input: input, err: ErrSyntax}\n}\n\nfunc errMissingPrefix(fn, input string) error {\n\treturn \u0026u256Error{fn: fn, input: input, err: ErrMissingPrefix}\n}\n\nfunc errEmptyNumber(fn, input string) error {\n\treturn \u0026u256Error{fn: fn, input: input, err: ErrEmptyNumber}\n}\n\nfunc errLeadingZero(fn, input string) error {\n\treturn \u0026u256Error{fn: fn, input: input, err: ErrLeadingZero}\n}\n\nfunc errRange(fn, input string) error {\n\treturn \u0026u256Error{fn: fn, input: input, err: ErrRange}\n}\n\nfunc errBig256Range(fn, input string) error {\n\treturn \u0026u256Error{fn: fn, input: input, err: ErrBig256Range}\n}\n\nfunc errBadBufferLength(fn, input string) error {\n\treturn \u0026u256Error{fn: fn, input: input, err: ErrBadBufferLength}\n}\n\nfunc errInvalidBase(fn string, base int) error {\n\treturn \u0026u256Error{fn: fn, input: string(base), err: ErrInvalidBase}\n}\n\nfunc errInvalidBitSize(fn string, bitSize int) error {\n\treturn \u0026u256Error{fn: fn, input: string(bitSize), err: ErrInvalidBitSize}\n}\n"},{"name":"mod.gno","body":"package uint256\n\nimport (\n\t\"math/bits\"\n)\n\n// Some utility functions\n\n// Reciprocal computes a 320-bit value representing 1/m\n//\n// Notes:\n// - specialized for m.arr[3] != 0, hence limited to 2^192 \u003c= m \u003c 2^256\n// - returns zero if m.arr[3] == 0\n// - starts with a 32-bit division, refines with newton-raphson iterations\nfunc Reciprocal(m *Uint) (mu [5]uint64) {\n\tif m.arr[3] == 0 {\n\t\treturn mu\n\t}\n\n\ts := bits.LeadingZeros64(m.arr[3]) // Replace with leadingZeros(m) for general case\n\tp := 255 - s // floor(log_2(m)), m\u003e0\n\n\t// 0 or a power of 2?\n\n\t// Check if at least one bit is set in m.arr[2], m.arr[1] or m.arr[0],\n\t// or at least two bits in m.arr[3]\n\n\tif m.arr[0]|m.arr[1]|m.arr[2]|(m.arr[3]\u0026(m.arr[3]-1)) == 0 {\n\n\t\tmu[4] = ^uint64(0) \u003e\u003e uint(p\u002663)\n\t\tmu[3] = ^uint64(0)\n\t\tmu[2] = ^uint64(0)\n\t\tmu[1] = ^uint64(0)\n\t\tmu[0] = ^uint64(0)\n\n\t\treturn mu\n\t}\n\n\t// Maximise division precision by left-aligning divisor\n\n\tvar (\n\t\ty Uint // left-aligned copy of m\n\t\tr0 uint32 // estimate of 2^31/y\n\t)\n\n\ty.Lsh(m, uint(s)) // 1/2 \u003c y \u003c 1\n\n\t// Extract most significant 32 bits\n\n\tyh := uint32(y.arr[3] \u003e\u003e 32)\n\n\tif yh == 0x80000000 { // Avoid overflow in division\n\t\tr0 = 0xffffffff\n\t} else {\n\t\tr0, _ = bits.Div32(0x80000000, 0, yh)\n\t}\n\n\t// First iteration: 32 -\u003e 64\n\n\tt1 := uint64(r0) // 2^31/y\n\tt1 *= t1 // 2^62/y^2\n\tt1, _ = bits.Mul64(t1, y.arr[3]) // 2^62/y^2 * 2^64/y / 2^64 = 2^62/y\n\n\tr1 := uint64(r0) \u003c\u003c 32 // 2^63/y\n\tr1 -= t1 // 2^63/y - 2^62/y = 2^62/y\n\tr1 *= 2 // 2^63/y\n\n\tif (r1 | (y.arr[3] \u003c\u003c 1)) == 0 {\n\t\tr1 = ^uint64(0)\n\t}\n\n\t// Second iteration: 64 -\u003e 128\n\n\t// square: 2^126/y^2\n\ta2h, a2l := bits.Mul64(r1, r1)\n\n\t// multiply by y: e2h:e2l:b2h = 2^126/y^2 * 2^128/y / 2^128 = 2^126/y\n\tb2h, _ := bits.Mul64(a2l, y.arr[2])\n\tc2h, c2l := bits.Mul64(a2l, y.arr[3])\n\td2h, d2l := bits.Mul64(a2h, y.arr[2])\n\te2h, e2l := bits.Mul64(a2h, y.arr[3])\n\n\tb2h, c := bits.Add64(b2h, c2l, 0)\n\te2l, c = bits.Add64(e2l, c2h, c)\n\te2h, _ = bits.Add64(e2h, 0, c)\n\n\t_, c = bits.Add64(b2h, d2l, 0)\n\te2l, c = bits.Add64(e2l, d2h, c)\n\te2h, _ = bits.Add64(e2h, 0, c)\n\n\t// subtract: t2h:t2l = 2^127/y - 2^126/y = 2^126/y\n\tt2l, b := bits.Sub64(0, e2l, 0)\n\tt2h, _ := bits.Sub64(r1, e2h, b)\n\n\t// double: r2h:r2l = 2^127/y\n\tr2l, c := bits.Add64(t2l, t2l, 0)\n\tr2h, _ := bits.Add64(t2h, t2h, c)\n\n\tif (r2h | r2l | (y.arr[3] \u003c\u003c 1)) == 0 {\n\t\tr2h = ^uint64(0)\n\t\tr2l = ^uint64(0)\n\t}\n\n\t// Third iteration: 128 -\u003e 192\n\n\t// square r2 (keep 256 bits): 2^190/y^2\n\ta3h, a3l := bits.Mul64(r2l, r2l)\n\tb3h, b3l := bits.Mul64(r2l, r2h)\n\tc3h, c3l := bits.Mul64(r2h, r2h)\n\n\ta3h, c = bits.Add64(a3h, b3l, 0)\n\tc3l, c = bits.Add64(c3l, b3h, c)\n\tc3h, _ = bits.Add64(c3h, 0, c)\n\n\ta3h, c = bits.Add64(a3h, b3l, 0)\n\tc3l, c = bits.Add64(c3l, b3h, c)\n\tc3h, _ = bits.Add64(c3h, 0, c)\n\n\t// multiply by y: q = 2^190/y^2 * 2^192/y / 2^192 = 2^190/y\n\n\tx0 := a3l\n\tx1 := a3h\n\tx2 := c3l\n\tx3 := c3h\n\n\tvar q0, q1, q2, q3, q4, t0 uint64\n\n\tq0, _ = bits.Mul64(x2, y.arr[0])\n\tq1, t0 = bits.Mul64(x3, y.arr[0])\n\tq0, c = bits.Add64(q0, t0, 0)\n\tq1, _ = bits.Add64(q1, 0, c)\n\n\tt1, _ = bits.Mul64(x1, y.arr[1])\n\tq0, c = bits.Add64(q0, t1, 0)\n\tq2, t0 = bits.Mul64(x3, y.arr[1])\n\tq1, c = bits.Add64(q1, t0, c)\n\tq2, _ = bits.Add64(q2, 0, c)\n\n\tt1, t0 = bits.Mul64(x2, y.arr[1])\n\tq0, c = bits.Add64(q0, t0, 0)\n\tq1, c = bits.Add64(q1, t1, c)\n\tq2, _ = bits.Add64(q2, 0, c)\n\n\tt1, t0 = bits.Mul64(x1, y.arr[2])\n\tq0, c = bits.Add64(q0, t0, 0)\n\tq1, c = bits.Add64(q1, t1, c)\n\tq3, t0 = bits.Mul64(x3, y.arr[2])\n\tq2, c = bits.Add64(q2, t0, c)\n\tq3, _ = bits.Add64(q3, 0, c)\n\n\tt1, _ = bits.Mul64(x0, y.arr[2])\n\tq0, c = bits.Add64(q0, t1, 0)\n\tt1, t0 = bits.Mul64(x2, y.arr[2])\n\tq1, c = bits.Add64(q1, t0, c)\n\tq2, c = bits.Add64(q2, t1, c)\n\tq3, _ = bits.Add64(q3, 0, c)\n\n\tt1, t0 = bits.Mul64(x1, y.arr[3])\n\tq1, c = bits.Add64(q1, t0, 0)\n\tq2, c = bits.Add64(q2, t1, c)\n\tq4, t0 = bits.Mul64(x3, y.arr[3])\n\tq3, c = bits.Add64(q3, t0, c)\n\tq4, _ = bits.Add64(q4, 0, c)\n\n\tt1, t0 = bits.Mul64(x0, y.arr[3])\n\tq0, c = bits.Add64(q0, t0, 0)\n\tq1, c = bits.Add64(q1, t1, c)\n\tt1, t0 = bits.Mul64(x2, y.arr[3])\n\tq2, c = bits.Add64(q2, t0, c)\n\tq3, c = bits.Add64(q3, t1, c)\n\tq4, _ = bits.Add64(q4, 0, c)\n\n\t// subtract: t3 = 2^191/y - 2^190/y = 2^190/y\n\t_, b = bits.Sub64(0, q0, 0)\n\t_, b = bits.Sub64(0, q1, b)\n\tt3l, b := bits.Sub64(0, q2, b)\n\tt3m, b := bits.Sub64(r2l, q3, b)\n\tt3h, _ := bits.Sub64(r2h, q4, b)\n\n\t// double: r3 = 2^191/y\n\tr3l, c := bits.Add64(t3l, t3l, 0)\n\tr3m, c := bits.Add64(t3m, t3m, c)\n\tr3h, _ := bits.Add64(t3h, t3h, c)\n\n\t// Fourth iteration: 192 -\u003e 320\n\n\t// square r3\n\n\ta4h, a4l := bits.Mul64(r3l, r3l)\n\tb4h, b4l := bits.Mul64(r3l, r3m)\n\tc4h, c4l := bits.Mul64(r3l, r3h)\n\td4h, d4l := bits.Mul64(r3m, r3m)\n\te4h, e4l := bits.Mul64(r3m, r3h)\n\tf4h, f4l := bits.Mul64(r3h, r3h)\n\n\tb4h, c = bits.Add64(b4h, c4l, 0)\n\te4l, c = bits.Add64(e4l, c4h, c)\n\te4h, _ = bits.Add64(e4h, 0, c)\n\n\ta4h, c = bits.Add64(a4h, b4l, 0)\n\td4l, c = bits.Add64(d4l, b4h, c)\n\td4h, c = bits.Add64(d4h, e4l, c)\n\tf4l, c = bits.Add64(f4l, e4h, c)\n\tf4h, _ = bits.Add64(f4h, 0, c)\n\n\ta4h, c = bits.Add64(a4h, b4l, 0)\n\td4l, c = bits.Add64(d4l, b4h, c)\n\td4h, c = bits.Add64(d4h, e4l, c)\n\tf4l, c = bits.Add64(f4l, e4h, c)\n\tf4h, _ = bits.Add64(f4h, 0, c)\n\n\t// multiply by y\n\n\tx1, x0 = bits.Mul64(d4h, y.arr[0])\n\tx3, x2 = bits.Mul64(f4h, y.arr[0])\n\tt1, t0 = bits.Mul64(f4l, y.arr[0])\n\tx1, c = bits.Add64(x1, t0, 0)\n\tx2, c = bits.Add64(x2, t1, c)\n\tx3, _ = bits.Add64(x3, 0, c)\n\n\tt1, t0 = bits.Mul64(d4h, y.arr[1])\n\tx1, c = bits.Add64(x1, t0, 0)\n\tx2, c = bits.Add64(x2, t1, c)\n\tx4, t0 := bits.Mul64(f4h, y.arr[1])\n\tx3, c = bits.Add64(x3, t0, c)\n\tx4, _ = bits.Add64(x4, 0, c)\n\tt1, t0 = bits.Mul64(d4l, y.arr[1])\n\tx0, c = bits.Add64(x0, t0, 0)\n\tx1, c = bits.Add64(x1, t1, c)\n\tt1, t0 = bits.Mul64(f4l, y.arr[1])\n\tx2, c = bits.Add64(x2, t0, c)\n\tx3, c = bits.Add64(x3, t1, c)\n\tx4, _ = bits.Add64(x4, 0, c)\n\n\tt1, t0 = bits.Mul64(a4h, y.arr[2])\n\tx0, c = bits.Add64(x0, t0, 0)\n\tx1, c = bits.Add64(x1, t1, c)\n\tt1, t0 = bits.Mul64(d4h, y.arr[2])\n\tx2, c = bits.Add64(x2, t0, c)\n\tx3, c = bits.Add64(x3, t1, c)\n\tx5, t0 := bits.Mul64(f4h, y.arr[2])\n\tx4, c = bits.Add64(x4, t0, c)\n\tx5, _ = bits.Add64(x5, 0, c)\n\tt1, t0 = bits.Mul64(d4l, y.arr[2])\n\tx1, c = bits.Add64(x1, t0, 0)\n\tx2, c = bits.Add64(x2, t1, c)\n\tt1, t0 = bits.Mul64(f4l, y.arr[2])\n\tx3, c = bits.Add64(x3, t0, c)\n\tx4, c = bits.Add64(x4, t1, c)\n\tx5, _ = bits.Add64(x5, 0, c)\n\n\tt1, t0 = bits.Mul64(a4h, y.arr[3])\n\tx1, c = bits.Add64(x1, t0, 0)\n\tx2, c = bits.Add64(x2, t1, c)\n\tt1, t0 = bits.Mul64(d4h, y.arr[3])\n\tx3, c = bits.Add64(x3, t0, c)\n\tx4, c = bits.Add64(x4, t1, c)\n\tx6, t0 := bits.Mul64(f4h, y.arr[3])\n\tx5, c = bits.Add64(x5, t0, c)\n\tx6, _ = bits.Add64(x6, 0, c)\n\tt1, t0 = bits.Mul64(a4l, y.arr[3])\n\tx0, c = bits.Add64(x0, t0, 0)\n\tx1, c = bits.Add64(x1, t1, c)\n\tt1, t0 = bits.Mul64(d4l, y.arr[3])\n\tx2, c = bits.Add64(x2, t0, c)\n\tx3, c = bits.Add64(x3, t1, c)\n\tt1, t0 = bits.Mul64(f4l, y.arr[3])\n\tx4, c = bits.Add64(x4, t0, c)\n\tx5, c = bits.Add64(x5, t1, c)\n\tx6, _ = bits.Add64(x6, 0, c)\n\n\t// subtract\n\t_, b = bits.Sub64(0, x0, 0)\n\t_, b = bits.Sub64(0, x1, b)\n\tr4l, b := bits.Sub64(0, x2, b)\n\tr4k, b := bits.Sub64(0, x3, b)\n\tr4j, b := bits.Sub64(r3l, x4, b)\n\tr4i, b := bits.Sub64(r3m, x5, b)\n\tr4h, _ := bits.Sub64(r3h, x6, b)\n\n\t// Multiply candidate for 1/4y by y, with full precision\n\n\tx0 = r4l\n\tx1 = r4k\n\tx2 = r4j\n\tx3 = r4i\n\tx4 = r4h\n\n\tq1, q0 = bits.Mul64(x0, y.arr[0])\n\tq3, q2 = bits.Mul64(x2, y.arr[0])\n\tq5, q4 := bits.Mul64(x4, y.arr[0])\n\n\tt1, t0 = bits.Mul64(x1, y.arr[0])\n\tq1, c = bits.Add64(q1, t0, 0)\n\tq2, c = bits.Add64(q2, t1, c)\n\tt1, t0 = bits.Mul64(x3, y.arr[0])\n\tq3, c = bits.Add64(q3, t0, c)\n\tq4, c = bits.Add64(q4, t1, c)\n\tq5, _ = bits.Add64(q5, 0, c)\n\n\tt1, t0 = bits.Mul64(x0, y.arr[1])\n\tq1, c = bits.Add64(q1, t0, 0)\n\tq2, c = bits.Add64(q2, t1, c)\n\tt1, t0 = bits.Mul64(x2, y.arr[1])\n\tq3, c = bits.Add64(q3, t0, c)\n\tq4, c = bits.Add64(q4, t1, c)\n\tq6, t0 := bits.Mul64(x4, y.arr[1])\n\tq5, c = bits.Add64(q5, t0, c)\n\tq6, _ = bits.Add64(q6, 0, c)\n\n\tt1, t0 = bits.Mul64(x1, y.arr[1])\n\tq2, c = bits.Add64(q2, t0, 0)\n\tq3, c = bits.Add64(q3, t1, c)\n\tt1, t0 = bits.Mul64(x3, y.arr[1])\n\tq4, c = bits.Add64(q4, t0, c)\n\tq5, c = bits.Add64(q5, t1, c)\n\tq6, _ = bits.Add64(q6, 0, c)\n\n\tt1, t0 = bits.Mul64(x0, y.arr[2])\n\tq2, c = bits.Add64(q2, t0, 0)\n\tq3, c = bits.Add64(q3, t1, c)\n\tt1, t0 = bits.Mul64(x2, y.arr[2])\n\tq4, c = bits.Add64(q4, t0, c)\n\tq5, c = bits.Add64(q5, t1, c)\n\tq7, t0 := bits.Mul64(x4, y.arr[2])\n\tq6, c = bits.Add64(q6, t0, c)\n\tq7, _ = bits.Add64(q7, 0, c)\n\n\tt1, t0 = bits.Mul64(x1, y.arr[2])\n\tq3, c = bits.Add64(q3, t0, 0)\n\tq4, c = bits.Add64(q4, t1, c)\n\tt1, t0 = bits.Mul64(x3, y.arr[2])\n\tq5, c = bits.Add64(q5, t0, c)\n\tq6, c = bits.Add64(q6, t1, c)\n\tq7, _ = bits.Add64(q7, 0, c)\n\n\tt1, t0 = bits.Mul64(x0, y.arr[3])\n\tq3, c = bits.Add64(q3, t0, 0)\n\tq4, c = bits.Add64(q4, t1, c)\n\tt1, t0 = bits.Mul64(x2, y.arr[3])\n\tq5, c = bits.Add64(q5, t0, c)\n\tq6, c = bits.Add64(q6, t1, c)\n\tq8, t0 := bits.Mul64(x4, y.arr[3])\n\tq7, c = bits.Add64(q7, t0, c)\n\tq8, _ = bits.Add64(q8, 0, c)\n\n\tt1, t0 = bits.Mul64(x1, y.arr[3])\n\tq4, c = bits.Add64(q4, t0, 0)\n\tq5, c = bits.Add64(q5, t1, c)\n\tt1, t0 = bits.Mul64(x3, y.arr[3])\n\tq6, c = bits.Add64(q6, t0, c)\n\tq7, c = bits.Add64(q7, t1, c)\n\tq8, _ = bits.Add64(q8, 0, c)\n\n\t// Final adjustment\n\n\t// subtract q from 1/4\n\t_, b = bits.Sub64(0, q0, 0)\n\t_, b = bits.Sub64(0, q1, b)\n\t_, b = bits.Sub64(0, q2, b)\n\t_, b = bits.Sub64(0, q3, b)\n\t_, b = bits.Sub64(0, q4, b)\n\t_, b = bits.Sub64(0, q5, b)\n\t_, b = bits.Sub64(0, q6, b)\n\t_, b = bits.Sub64(0, q7, b)\n\t_, b = bits.Sub64(uint64(1)\u003c\u003c62, q8, b)\n\n\t// decrement the result\n\tx0, t := bits.Sub64(r4l, 1, 0)\n\tx1, t = bits.Sub64(r4k, 0, t)\n\tx2, t = bits.Sub64(r4j, 0, t)\n\tx3, t = bits.Sub64(r4i, 0, t)\n\tx4, _ = bits.Sub64(r4h, 0, t)\n\n\t// commit the decrement if the subtraction underflowed (reciprocal was too large)\n\tif b != 0 {\n\t\tr4h, r4i, r4j, r4k, r4l = x4, x3, x2, x1, x0\n\t}\n\n\t// Shift to correct bit alignment, truncating excess bits\n\n\tp = (p \u0026 63) - 1\n\n\tx0, c = bits.Add64(r4l, r4l, 0)\n\tx1, c = bits.Add64(r4k, r4k, c)\n\tx2, c = bits.Add64(r4j, r4j, c)\n\tx3, c = bits.Add64(r4i, r4i, c)\n\tx4, _ = bits.Add64(r4h, r4h, c)\n\n\tif p \u003c 0 {\n\t\tr4h, r4i, r4j, r4k, r4l = x4, x3, x2, x1, x0\n\t\tp = 0 // avoid negative shift below\n\t}\n\n\t{\n\t\tr := uint(p) // right shift\n\t\tl := uint(64 - r) // left shift\n\n\t\tx0 = (r4l \u003e\u003e r) | (r4k \u003c\u003c l)\n\t\tx1 = (r4k \u003e\u003e r) | (r4j \u003c\u003c l)\n\t\tx2 = (r4j \u003e\u003e r) | (r4i \u003c\u003c l)\n\t\tx3 = (r4i \u003e\u003e r) | (r4h \u003c\u003c l)\n\t\tx4 = (r4h \u003e\u003e r)\n\t}\n\n\tif p \u003e 0 {\n\t\tr4h, r4i, r4j, r4k, r4l = x4, x3, x2, x1, x0\n\t}\n\n\tmu[0] = r4l\n\tmu[1] = r4k\n\tmu[2] = r4j\n\tmu[3] = r4i\n\tmu[4] = r4h\n\n\treturn mu\n}\n\n// reduce4 computes the least non-negative residue of x modulo m\n//\n// requires a four-word modulus (m.arr[3] \u003e 1) and its inverse (mu)\nfunc reduce4(x [8]uint64, m *Uint, mu [5]uint64) (z Uint) {\n\t// NB: Most variable names in the comments match the pseudocode for\n\t// \tBarrett reduction in the Handbook of Applied Cryptography.\n\n\t// q1 = x/2^192\n\n\tx0 := x[3]\n\tx1 := x[4]\n\tx2 := x[5]\n\tx3 := x[6]\n\tx4 := x[7]\n\n\t// q2 = q1 * mu; q3 = q2 / 2^320\n\n\tvar q0, q1, q2, q3, q4, q5, t0, t1, c uint64\n\n\tq0, _ = bits.Mul64(x3, mu[0])\n\tq1, t0 = bits.Mul64(x4, mu[0])\n\tq0, c = bits.Add64(q0, t0, 0)\n\tq1, _ = bits.Add64(q1, 0, c)\n\n\tt1, _ = bits.Mul64(x2, mu[1])\n\tq0, c = bits.Add64(q0, t1, 0)\n\tq2, t0 = bits.Mul64(x4, mu[1])\n\tq1, c = bits.Add64(q1, t0, c)\n\tq2, _ = bits.Add64(q2, 0, c)\n\n\tt1, t0 = bits.Mul64(x3, mu[1])\n\tq0, c = bits.Add64(q0, t0, 0)\n\tq1, c = bits.Add64(q1, t1, c)\n\tq2, _ = bits.Add64(q2, 0, c)\n\n\tt1, t0 = bits.Mul64(x2, mu[2])\n\tq0, c = bits.Add64(q0, t0, 0)\n\tq1, c = bits.Add64(q1, t1, c)\n\tq3, t0 = bits.Mul64(x4, mu[2])\n\tq2, c = bits.Add64(q2, t0, c)\n\tq3, _ = bits.Add64(q3, 0, c)\n\n\tt1, _ = bits.Mul64(x1, mu[2])\n\tq0, c = bits.Add64(q0, t1, 0)\n\tt1, t0 = bits.Mul64(x3, mu[2])\n\tq1, c = bits.Add64(q1, t0, c)\n\tq2, c = bits.Add64(q2, t1, c)\n\tq3, _ = bits.Add64(q3, 0, c)\n\n\tt1, _ = bits.Mul64(x0, mu[3])\n\tq0, c = bits.Add64(q0, t1, 0)\n\tt1, t0 = bits.Mul64(x2, mu[3])\n\tq1, c = bits.Add64(q1, t0, c)\n\tq2, c = bits.Add64(q2, t1, c)\n\tq4, t0 = bits.Mul64(x4, mu[3])\n\tq3, c = bits.Add64(q3, t0, c)\n\tq4, _ = bits.Add64(q4, 0, c)\n\n\tt1, t0 = bits.Mul64(x1, mu[3])\n\tq0, c = bits.Add64(q0, t0, 0)\n\tq1, c = bits.Add64(q1, t1, c)\n\tt1, t0 = bits.Mul64(x3, mu[3])\n\tq2, c = bits.Add64(q2, t0, c)\n\tq3, c = bits.Add64(q3, t1, c)\n\tq4, _ = bits.Add64(q4, 0, c)\n\n\tt1, t0 = bits.Mul64(x0, mu[4])\n\t_, c = bits.Add64(q0, t0, 0)\n\tq1, c = bits.Add64(q1, t1, c)\n\tt1, t0 = bits.Mul64(x2, mu[4])\n\tq2, c = bits.Add64(q2, t0, c)\n\tq3, c = bits.Add64(q3, t1, c)\n\tq5, t0 = bits.Mul64(x4, mu[4])\n\tq4, c = bits.Add64(q4, t0, c)\n\tq5, _ = bits.Add64(q5, 0, c)\n\n\tt1, t0 = bits.Mul64(x1, mu[4])\n\tq1, c = bits.Add64(q1, t0, 0)\n\tq2, c = bits.Add64(q2, t1, c)\n\tt1, t0 = bits.Mul64(x3, mu[4])\n\tq3, c = bits.Add64(q3, t0, c)\n\tq4, c = bits.Add64(q4, t1, c)\n\tq5, _ = bits.Add64(q5, 0, c)\n\n\t// Drop the fractional part of q3\n\n\tq0 = q1\n\tq1 = q2\n\tq2 = q3\n\tq3 = q4\n\tq4 = q5\n\n\t// r1 = x mod 2^320\n\n\tx0 = x[0]\n\tx1 = x[1]\n\tx2 = x[2]\n\tx3 = x[3]\n\tx4 = x[4]\n\n\t// r2 = q3 * m mod 2^320\n\n\tvar r0, r1, r2, r3, r4 uint64\n\n\tr4, r3 = bits.Mul64(q0, m.arr[3])\n\t_, t0 = bits.Mul64(q1, m.arr[3])\n\tr4, _ = bits.Add64(r4, t0, 0)\n\n\tt1, r2 = bits.Mul64(q0, m.arr[2])\n\tr3, c = bits.Add64(r3, t1, 0)\n\t_, t0 = bits.Mul64(q2, m.arr[2])\n\tr4, _ = bits.Add64(r4, t0, c)\n\n\tt1, t0 = bits.Mul64(q1, m.arr[2])\n\tr3, c = bits.Add64(r3, t0, 0)\n\tr4, _ = bits.Add64(r4, t1, c)\n\n\tt1, r1 = bits.Mul64(q0, m.arr[1])\n\tr2, c = bits.Add64(r2, t1, 0)\n\tt1, t0 = bits.Mul64(q2, m.arr[1])\n\tr3, c = bits.Add64(r3, t0, c)\n\tr4, _ = bits.Add64(r4, t1, c)\n\n\tt1, t0 = bits.Mul64(q1, m.arr[1])\n\tr2, c = bits.Add64(r2, t0, 0)\n\tr3, c = bits.Add64(r3, t1, c)\n\t_, t0 = bits.Mul64(q3, m.arr[1])\n\tr4, _ = bits.Add64(r4, t0, c)\n\n\tt1, r0 = bits.Mul64(q0, m.arr[0])\n\tr1, c = bits.Add64(r1, t1, 0)\n\tt1, t0 = bits.Mul64(q2, m.arr[0])\n\tr2, c = bits.Add64(r2, t0, c)\n\tr3, c = bits.Add64(r3, t1, c)\n\t_, t0 = bits.Mul64(q4, m.arr[0])\n\tr4, _ = bits.Add64(r4, t0, c)\n\n\tt1, t0 = bits.Mul64(q1, m.arr[0])\n\tr1, c = bits.Add64(r1, t0, 0)\n\tr2, c = bits.Add64(r2, t1, c)\n\tt1, t0 = bits.Mul64(q3, m.arr[0])\n\tr3, c = bits.Add64(r3, t0, c)\n\tr4, _ = bits.Add64(r4, t1, c)\n\n\t// r = r1 - r2\n\n\tvar b uint64\n\n\tr0, b = bits.Sub64(x0, r0, 0)\n\tr1, b = bits.Sub64(x1, r1, b)\n\tr2, b = bits.Sub64(x2, r2, b)\n\tr3, b = bits.Sub64(x3, r3, b)\n\tr4, b = bits.Sub64(x4, r4, b)\n\n\t// if r\u003c0 then r+=m\n\n\tif b != 0 {\n\t\tr0, c = bits.Add64(r0, m.arr[0], 0)\n\t\tr1, c = bits.Add64(r1, m.arr[1], c)\n\t\tr2, c = bits.Add64(r2, m.arr[2], c)\n\t\tr3, c = bits.Add64(r3, m.arr[3], c)\n\t\tr4, _ = bits.Add64(r4, 0, c)\n\t}\n\n\t// while (r\u003e=m) r-=m\n\n\tfor {\n\t\t// q = r - m\n\t\tq0, b = bits.Sub64(r0, m.arr[0], 0)\n\t\tq1, b = bits.Sub64(r1, m.arr[1], b)\n\t\tq2, b = bits.Sub64(r2, m.arr[2], b)\n\t\tq3, b = bits.Sub64(r3, m.arr[3], b)\n\t\tq4, b = bits.Sub64(r4, 0, b)\n\n\t\t// if borrow break\n\t\tif b != 0 {\n\t\t\tbreak\n\t\t}\n\n\t\t// r = q\n\t\tr4, r3, r2, r1, r0 = q4, q3, q2, q1, q0\n\t}\n\n\tz.arr[3], z.arr[2], z.arr[1], z.arr[0] = r3, r2, r1, r0\n\n\treturn z\n}\n"},{"name":"uint256.gno","body":"// Ported from https://github.com/holiman/uint256\n// This package provides a 256-bit unsigned integer type, Uint256, and associated functions.\npackage uint256\n\nimport (\n\t\"errors\"\n\t\"math/bits\"\n)\n\nconst (\n\tMaxUint64 = 1\u003c\u003c64 - 1\n\tuintSize = 32 \u003c\u003c (^uint(0) \u003e\u003e 63)\n)\n\n// Uint is represented as an array of 4 uint64, in little-endian order,\n// so that Uint[3] is the most significant, and Uint[0] is the least significant\ntype Uint struct {\n\tarr [4]uint64\n}\n\n// NewUint returns a new initialized Uint.\nfunc NewUint(val uint64) *Uint {\n\tz := \u0026Uint{arr: [4]uint64{val, 0, 0, 0}}\n\treturn z\n}\n\n// Zero returns a new Uint initialized to zero.\nfunc Zero() *Uint {\n\treturn NewUint(0)\n}\n\n// One returns a new Uint initialized to one.\nfunc One() *Uint {\n\treturn NewUint(1)\n}\n\n// SetAllOne sets all the bits of z to 1\nfunc (z *Uint) SetAllOne() *Uint {\n\tz.arr[3], z.arr[2], z.arr[1], z.arr[0] = MaxUint64, MaxUint64, MaxUint64, MaxUint64\n\treturn z\n}\n\n// Set sets z to x and returns z.\nfunc (z *Uint) Set(x *Uint) *Uint {\n\t*z = *x\n\n\treturn z\n}\n\n// SetOne sets z to 1\nfunc (z *Uint) SetOne() *Uint {\n\tz.arr[3], z.arr[2], z.arr[1], z.arr[0] = 0, 0, 0, 1\n\treturn z\n}\n\nconst twoPow256Sub1 = \"115792089237316195423570985008687907853269984665640564039457584007913129639935\"\n\n// SetFromDecimal sets z from the given string, interpreted as a decimal number.\n// OBS! This method is _not_ strictly identical to the (*big.Uint).SetString(..., 10) method.\n// Notable differences:\n// - This method does not accept underscore input, e.g. \"100_000\",\n// - This method does not accept negative zero as valid, e.g \"-0\",\n// - (this method does not accept any negative input as valid))\nfunc (z *Uint) SetFromDecimal(s string) (err error) {\n\t// Remove max one leading +\n\tif len(s) \u003e 0 \u0026\u0026 s[0] == '+' {\n\t\ts = s[1:]\n\t}\n\t// Remove any number of leading zeroes\n\tif len(s) \u003e 0 \u0026\u0026 s[0] == '0' {\n\t\tvar i int\n\t\tvar c rune\n\t\tfor i, c = range s {\n\t\t\tif c != '0' {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\ts = s[i:]\n\t}\n\tif len(s) \u003c len(twoPow256Sub1) {\n\t\treturn z.fromDecimal(s)\n\t}\n\tif len(s) == len(twoPow256Sub1) {\n\t\tif s \u003e twoPow256Sub1 {\n\t\t\treturn ErrBig256Range\n\t\t}\n\t\treturn z.fromDecimal(s)\n\t}\n\treturn ErrBig256Range\n}\n\n// FromDecimal is a convenience-constructor to create an Uint from a\n// decimal (base 10) string. Numbers larger than 256 bits are not accepted.\nfunc FromDecimal(decimal string) (*Uint, error) {\n\tvar z Uint\n\tif err := z.SetFromDecimal(decimal); err != nil {\n\t\treturn nil, err\n\t}\n\treturn \u0026z, nil\n}\n\n// MustFromDecimal is a convenience-constructor to create an Uint from a\n// decimal (base 10) string.\n// Returns a new Uint and panics if any error occurred.\nfunc MustFromDecimal(decimal string) *Uint {\n\tvar z Uint\n\tif err := z.SetFromDecimal(decimal); err != nil {\n\t\tpanic(err)\n\t}\n\treturn \u0026z\n}\n\n// multipliers holds the values that are needed for fromDecimal\nvar multipliers = [5]*Uint{\n\tnil, // represents first round, no multiplication needed\n\t{[4]uint64{10000000000000000000, 0, 0, 0}}, // 10 ^ 19\n\t{[4]uint64{687399551400673280, 5421010862427522170, 0, 0}}, // 10 ^ 38\n\t{[4]uint64{5332261958806667264, 17004971331911604867, 2938735877055718769, 0}}, // 10 ^ 57\n\t{[4]uint64{0, 8607968719199866880, 532749306367912313, 1593091911132452277}}, // 10 ^ 76\n}\n\n// fromDecimal is a helper function to only ever be called via SetFromDecimal\n// this function takes a string and chunks it up, calling ParseUint on it up to 5 times\n// these chunks are then multiplied by the proper power of 10, then added together.\nfunc (z *Uint) fromDecimal(bs string) error {\n\t// first clear the input\n\tz.Clear()\n\t// the maximum value of uint64 is 18446744073709551615, which is 20 characters\n\t// one less means that a string of 19 9's is always within the uint64 limit\n\tvar (\n\t\tnum uint64\n\t\terr error\n\t\tremaining = len(bs)\n\t)\n\tif remaining == 0 {\n\t\treturn errors.New(\"EOF\")\n\t}\n\t// We proceed in steps of 19 characters (nibbles), from least significant to most significant.\n\t// This means that the first (up to) 19 characters do not need to be multiplied.\n\t// In the second iteration, our slice of 19 characters needs to be multipleied\n\t// by a factor of 10^19. Et cetera.\n\tfor i, mult := range multipliers {\n\t\tif remaining \u003c= 0 {\n\t\t\treturn nil // Done\n\t\t} else if remaining \u003e 19 {\n\t\t\tnum, err = parseUint(bs[remaining-19:remaining], 10, 64)\n\t\t} else {\n\t\t\t// Final round\n\t\t\tnum, err = parseUint(bs, 10, 64)\n\t\t}\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t// add that number to our running total\n\t\tif i == 0 {\n\t\t\tz.SetUint64(num)\n\t\t} else {\n\t\t\tbase := NewUint(num)\n\t\t\tz.Add(z, base.Mul(base, mult))\n\t\t}\n\t\t// Chop off another 19 characters\n\t\tif remaining \u003e 19 {\n\t\t\tbs = bs[0 : remaining-19]\n\t\t}\n\t\tremaining -= 19\n\t}\n\treturn nil\n}\n\n// Byte sets z to the value of the byte at position n,\n// with 'z' considered as a big-endian 32-byte integer\n// if 'n' \u003e 32, f is set to 0\n// Example: f = '5', n=31 =\u003e 5\nfunc (z *Uint) Byte(n *Uint) *Uint {\n\t// in z, z.arr[0] is the least significant\n\tif number, overflow := n.Uint64WithOverflow(); !overflow {\n\t\tif number \u003c 32 {\n\t\t\tnumber := z.arr[4-1-number/8]\n\t\t\toffset := (n.arr[0] \u0026 0x7) \u003c\u003c 3 // 8*(n.d % 8)\n\t\t\tz.arr[0] = (number \u0026 (0xff00000000000000 \u003e\u003e offset)) \u003e\u003e (56 - offset)\n\t\t\tz.arr[3], z.arr[2], z.arr[1] = 0, 0, 0\n\t\t\treturn z\n\t\t}\n\t}\n\n\treturn z.Clear()\n}\n\n// BitLen returns the number of bits required to represent z\nfunc (z *Uint) BitLen() int {\n\tswitch {\n\tcase z.arr[3] != 0:\n\t\treturn 192 + bits.Len64(z.arr[3])\n\tcase z.arr[2] != 0:\n\t\treturn 128 + bits.Len64(z.arr[2])\n\tcase z.arr[1] != 0:\n\t\treturn 64 + bits.Len64(z.arr[1])\n\tdefault:\n\t\treturn bits.Len64(z.arr[0])\n\t}\n}\n\n// ByteLen returns the number of bytes required to represent z\nfunc (z *Uint) ByteLen() int {\n\treturn (z.BitLen() + 7) / 8\n}\n\n// Clear sets z to 0\nfunc (z *Uint) Clear() *Uint {\n\tz.arr[3], z.arr[2], z.arr[1], z.arr[0] = 0, 0, 0, 0\n\treturn z\n}\n\nconst (\n\t// hextable = \"0123456789abcdef\"\n\tbintable = \"\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\x00\\x01\\x02\\x03\\x04\\x05\\x06\\a\\b\\t\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\n\\v\\f\\r\\x0e\\x0f\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\n\\v\\f\\r\\x0e\\x0f\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\"\n\tbadNibble = 0xff\n)\n\n// SetFromHex sets z from the given string, interpreted as a hexadecimal number.\n// OBS! This method is _not_ strictly identical to the (*big.Int).SetString(..., 16) method.\n// Notable differences:\n// - This method _require_ \"0x\" or \"0X\" prefix.\n// - This method does not accept zero-prefixed hex, e.g. \"0x0001\"\n// - This method does not accept underscore input, e.g. \"100_000\",\n// - This method does not accept negative zero as valid, e.g \"-0x0\",\n// - (this method does not accept any negative input as valid)\nfunc (z *Uint) SetFromHex(hex string) error {\n\treturn z.fromHex(hex)\n}\n\n// fromHex is the internal implementation of parsing a hex-string.\nfunc (z *Uint) fromHex(hex string) error {\n\tif err := checkNumberS(hex); err != nil {\n\t\treturn err\n\t}\n\tif len(hex) \u003e 66 {\n\t\treturn ErrBig256Range\n\t}\n\tz.Clear()\n\tend := len(hex)\n\tfor i := 0; i \u003c 4; i++ {\n\t\tstart := end - 16\n\t\tif start \u003c 2 {\n\t\t\tstart = 2\n\t\t}\n\t\tfor ri := start; ri \u003c end; ri++ {\n\t\t\tnib := bintable[hex[ri]]\n\t\t\tif nib == badNibble {\n\t\t\t\treturn ErrSyntax\n\t\t\t}\n\t\t\tz.arr[i] = z.arr[i] \u003c\u003c 4\n\t\t\tz.arr[i] += uint64(nib)\n\t\t}\n\t\tend = start\n\t}\n\treturn nil\n}\n\n// FromHex is a convenience-constructor to create an Uint from\n// a hexadecimal string. The string is required to be '0x'-prefixed\n// Numbers larger than 256 bits are not accepted.\nfunc FromHex(hex string) (*Uint, error) {\n\tvar z Uint\n\tif err := z.fromHex(hex); err != nil {\n\t\treturn nil, err\n\t}\n\treturn \u0026z, nil\n}\n\n// MustFromHex is a convenience-constructor to create an Uint from\n// a hexadecimal string.\n// Returns a new Uint and panics if any error occurred.\nfunc MustFromHex(hex string) *Uint {\n\tvar z Uint\n\tif err := z.fromHex(hex); err != nil {\n\t\tpanic(err)\n\t}\n\treturn \u0026z\n}\n\n// Clone creates a new Uint identical to z\nfunc (z *Uint) Clone() *Uint {\n\tvar x Uint\n\tx.arr[0] = z.arr[0]\n\tx.arr[1] = z.arr[1]\n\tx.arr[2] = z.arr[2]\n\tx.arr[3] = z.arr[3]\n\n\treturn \u0026x\n}\n"},{"name":"utils.gno","body":"package uint256\n\n// lower(c) is a lower-case letter if and only if\n// c is either that lower-case letter or the equivalent upper-case letter.\n// Instead of writing c == 'x' || c == 'X' one can write lower(c) == 'x'.\n// Note that lower of non-letters can produce other non-letters.\nfunc lower(c byte) byte {\n\treturn c | ('x' - 'X')\n}\n\n// underscoreOK reports whether the underscores in s are allowed.\n// Checking them in this one function lets all the parsers skip over them simply.\n// Underscore must appear only between digits or between a base prefix and a digit.\nfunc underscoreOK(s string) bool {\n\t// saw tracks the last character (class) we saw:\n\t// ^ for beginning of number,\n\t// 0 for a digit or base prefix,\n\t// _ for an underscore,\n\t// ! for none of the above.\n\tsaw := '^'\n\ti := 0\n\n\t// Optional sign.\n\tif len(s) \u003e= 1 \u0026\u0026 (s[0] == '-' || s[0] == '+') {\n\t\ts = s[1:]\n\t}\n\n\t// Optional base prefix.\n\thex := false\n\tif len(s) \u003e= 2 \u0026\u0026 s[0] == '0' \u0026\u0026 (lower(s[1]) == 'b' || lower(s[1]) == 'o' || lower(s[1]) == 'x') {\n\t\ti = 2\n\t\tsaw = '0' // base prefix counts as a digit for \"underscore as digit separator\"\n\t\thex = lower(s[1]) == 'x'\n\t}\n\n\t// Number proper.\n\tfor ; i \u003c len(s); i++ {\n\t\t// Digits are always okay.\n\t\tif '0' \u003c= s[i] \u0026\u0026 s[i] \u003c= '9' || hex \u0026\u0026 'a' \u003c= lower(s[i]) \u0026\u0026 lower(s[i]) \u003c= 'f' {\n\t\t\tsaw = '0'\n\t\t\tcontinue\n\t\t}\n\t\t// Underscore must follow digit.\n\t\tif s[i] == '_' {\n\t\t\tif saw != '0' {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tsaw = '_'\n\t\t\tcontinue\n\t\t}\n\t\t// Underscore must also be followed by digit.\n\t\tif saw == '_' {\n\t\t\treturn false\n\t\t}\n\t\t// Saw non-digit, non-underscore.\n\t\tsaw = '!'\n\t}\n\treturn saw != '_'\n}\n\nfunc checkNumberS(input string) error {\n\tconst fn = \"UnmarshalText\"\n\tl := len(input)\n\tif l == 0 {\n\t\treturn errEmptyString(fn, input)\n\t}\n\tif l \u003c 2 || input[0] != '0' ||\n\t\t(input[1] != 'x' \u0026\u0026 input[1] != 'X') {\n\t\treturn errMissingPrefix(fn, input)\n\t}\n\tif l == 2 {\n\t\treturn errEmptyNumber(fn, input)\n\t}\n\tif len(input) \u003e 3 \u0026\u0026 input[2] == '0' {\n\t\treturn errLeadingZero(fn, input)\n\t}\n\treturn nil\n}\n\n// ParseUint is like ParseUint but for unsigned numbers.\n//\n// A sign prefix is not permitted.\nfunc parseUint(s string, base int, bitSize int) (uint64, error) {\n\tconst fnParseUint = \"ParseUint\"\n\n\tif s == \"\" {\n\t\treturn 0, errSyntax(fnParseUint, s)\n\t}\n\n\tbase0 := base == 0\n\n\ts0 := s\n\tswitch {\n\tcase 2 \u003c= base \u0026\u0026 base \u003c= 36:\n\t\t// valid base; nothing to do\n\n\tcase base == 0:\n\t\t// Look for octal, hex prefix.\n\t\tbase = 10\n\t\tif s[0] == '0' {\n\t\t\tswitch {\n\t\t\tcase len(s) \u003e= 3 \u0026\u0026 lower(s[1]) == 'b':\n\t\t\t\tbase = 2\n\t\t\t\ts = s[2:]\n\t\t\tcase len(s) \u003e= 3 \u0026\u0026 lower(s[1]) == 'o':\n\t\t\t\tbase = 8\n\t\t\t\ts = s[2:]\n\t\t\tcase len(s) \u003e= 3 \u0026\u0026 lower(s[1]) == 'x':\n\t\t\t\tbase = 16\n\t\t\t\ts = s[2:]\n\t\t\tdefault:\n\t\t\t\tbase = 8\n\t\t\t\ts = s[1:]\n\t\t\t}\n\t\t}\n\n\tdefault:\n\t\treturn 0, errInvalidBase(fnParseUint, base)\n\t}\n\n\tif bitSize == 0 {\n\t\tbitSize = uintSize\n\t} else if bitSize \u003c 0 || bitSize \u003e 64 {\n\t\treturn 0, errInvalidBitSize(fnParseUint, bitSize)\n\t}\n\n\t// Cutoff is the smallest number such that cutoff*base \u003e maxUint64.\n\t// Use compile-time constants for common cases.\n\tvar cutoff uint64\n\tswitch base {\n\tcase 10:\n\t\tcutoff = MaxUint64/10 + 1\n\tcase 16:\n\t\tcutoff = MaxUint64/16 + 1\n\tdefault:\n\t\tcutoff = MaxUint64/uint64(base) + 1\n\t}\n\n\tmaxVal := uint64(1)\u003c\u003cuint(bitSize) - 1\n\n\tunderscores := false\n\tvar n uint64\n\tfor _, c := range []byte(s) {\n\t\tvar d byte\n\t\tswitch {\n\t\tcase c == '_' \u0026\u0026 base0:\n\t\t\tunderscores = true\n\t\t\tcontinue\n\t\tcase '0' \u003c= c \u0026\u0026 c \u003c= '9':\n\t\t\td = c - '0'\n\t\tcase 'a' \u003c= lower(c) \u0026\u0026 lower(c) \u003c= 'z':\n\t\t\td = lower(c) - 'a' + 10\n\t\tdefault:\n\t\t\treturn 0, errSyntax(fnParseUint, s0)\n\t\t}\n\n\t\tif d \u003e= byte(base) {\n\t\t\treturn 0, errSyntax(fnParseUint, s0)\n\t\t}\n\n\t\tif n \u003e= cutoff {\n\t\t\t// n*base overflows\n\t\t\treturn maxVal, errRange(fnParseUint, s0)\n\t\t}\n\t\tn *= uint64(base)\n\n\t\tn1 := n + uint64(d)\n\t\tif n1 \u003c n || n1 \u003e maxVal {\n\t\t\t// n+d overflows\n\t\t\treturn maxVal, errRange(fnParseUint, s0)\n\t\t}\n\t\tn = n1\n\t}\n\n\tif underscores \u0026\u0026 !underscoreOK(s0) {\n\t\treturn 0, errSyntax(fnParseUint, s0)\n\t}\n\n\treturn n, nil\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"int256","path":"gno.land/p/demo/int256","files":[{"name":"LICENSE","body":"MIT License\n\nCopyright (c) 2023 Trịnh Đức Bảo Linh(Kevin)\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."},{"name":"README.md","body":"# Fixed size signed 256-bit math library\n\n1. This is a library specialized at replacing the big.Int library for math based on signed 256-bit types.\n2. It uses [uint256](https://github.com/gnolang/gno/tree/master/examples/gno.land/p/demo/uint256) as the underlying type.\n\nported from [mempooler/int256](https://github.com/mempooler/int256)\n"},{"name":"absolute.gno","body":"package int256\n\nimport \"gno.land/p/demo/uint256\"\n\n// Abs returns |z|\nfunc (z *Int) Abs() *uint256.Uint {\n\treturn z.abs.Clone()\n}\n\n// AbsGt returns true if |z| \u003e x, where x is a uint256\nfunc (z *Int) AbsGt(x *uint256.Uint) bool {\n\treturn z.abs.Gt(x)\n}\n\n// AbsLt returns true if |z| \u003c x, where x is a uint256\nfunc (z *Int) AbsLt(x *uint256.Uint) bool {\n\treturn z.abs.Lt(x)\n}\n"},{"name":"absolute_test.gno","body":"package int256\n\nimport (\n\t\"testing\"\n\n\t\"gno.land/p/demo/uint256\"\n)\n\nfunc TestAbs(t *testing.T) {\n\ttests := []struct {\n\t\tx, want string\n\t}{\n\t\t{\"0\", \"0\"},\n\t\t{\"1\", \"1\"},\n\t\t{\"-1\", \"1\"},\n\t\t{\"-2\", \"2\"},\n\t\t{\"-115792089237316195423570985008687907853269984665640564039457584007913129639935\", \"115792089237316195423570985008687907853269984665640564039457584007913129639935\"},\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := x.Abs()\n\n\t\tif got.ToString() != tc.want {\n\t\t\tt.Errorf(\"Abs(%s) = %v, want %v\", tc.x, got.ToString(), tc.want)\n\t\t}\n\t}\n}\n\nfunc TestAbsGt(t *testing.T) {\n\ttests := []struct {\n\t\tx, y, want string\n\t}{\n\t\t{\"0\", \"0\", \"false\"},\n\t\t{\"1\", \"0\", \"true\"},\n\t\t{\"-1\", \"0\", \"true\"},\n\t\t{\"-1\", \"1\", \"false\"},\n\t\t{\"-2\", \"1\", \"true\"},\n\t\t{\"-115792089237316195423570985008687907853269984665640564039457584007913129639935\", \"0\", \"true\"},\n\t\t{\"-115792089237316195423570985008687907853269984665640564039457584007913129639935\", \"1\", \"true\"},\n\t\t{\"-115792089237316195423570985008687907853269984665640564039457584007913129639935\", \"115792089237316195423570985008687907853269984665640564039457584007913129639935\", \"false\"},\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\ty, err := uint256.FromDecimal(tc.y)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := x.AbsGt(y)\n\n\t\tif got != (tc.want == \"true\") {\n\t\t\tt.Errorf(\"AbsGt(%s, %s) = %v, want %v\", tc.x, tc.y, got, tc.want)\n\t\t}\n\t}\n}\n\nfunc TestAbsLt(t *testing.T) {\n\ttests := []struct {\n\t\tx, y, want string\n\t}{\n\t\t{\"0\", \"0\", \"false\"},\n\t\t{\"1\", \"0\", \"false\"},\n\t\t{\"-1\", \"0\", \"false\"},\n\t\t{\"-1\", \"1\", \"false\"},\n\t\t{\"-2\", \"1\", \"false\"},\n\t\t{\"-5\", \"10\", \"true\"},\n\t\t{\"31330\", \"31337\", \"true\"},\n\t\t{\"-115792089237316195423570985008687907853269984665640564039457584007913129639935\", \"0\", \"false\"},\n\t\t{\"-115792089237316195423570985008687907853269984665640564039457584007913129639935\", \"1\", \"false\"},\n\t\t{\"-115792089237316195423570985008687907853269984665640564039457584007913129639935\", \"115792089237316195423570985008687907853269984665640564039457584007913129639935\", \"false\"},\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\ty, err := uint256.FromDecimal(tc.y)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := x.AbsLt(y)\n\n\t\tif got != (tc.want == \"true\") {\n\t\t\tt.Errorf(\"AbsLt(%s, %s) = %v, want %v\", tc.x, tc.y, got, tc.want)\n\t\t}\n\t}\n}\n"},{"name":"arithmetic.gno","body":"package int256\n\nimport \"gno.land/p/demo/uint256\"\n\nfunc (z *Int) Add(x, y *Int) *Int {\n\tz.initiateAbs()\n\n\tif x.neg == y.neg {\n\t\t// If both numbers have the same sign, add their absolute values\n\t\tz.abs.Add(x.abs, y.abs)\n\t\tz.neg = x.neg\n\t} else {\n\t\tswitch x.abs.Cmp(y.abs) {\n\t\tcase 1: // x \u003e y\n\t\t\tz.abs.Sub(x.abs, y.abs)\n\t\t\tz.neg = x.neg\n\t\tcase -1: // x \u003c y\n\t\t\tz.abs.Sub(y.abs, x.abs)\n\t\t\tz.neg = y.neg\n\t\tcase 0: // x == y\n\t\t\tz.abs = uint256.NewUint(0)\n\t\t}\n\t}\n\n\treturn z\n}\n\n// AddUint256 set z to the sum x + y, where y is a uint256, and returns z\nfunc (z *Int) AddUint256(x *Int, y *uint256.Uint) *Int {\n\tif x.neg {\n\t\tif x.abs.Gt(y) {\n\t\t\tz.abs.Sub(x.abs, y)\n\t\t\tz.neg = true\n\t\t} else {\n\t\t\tz.abs.Sub(y, x.abs)\n\t\t\tz.neg = false\n\t\t}\n\t} else {\n\t\tz.abs.Add(x.abs, y)\n\t\tz.neg = false\n\t}\n\treturn z\n}\n\n// Sets z to the sum x + y, where z and x are uint256s and y is an int256.\nfunc AddDelta(z, x *uint256.Uint, y *Int) {\n\tif y.neg {\n\t\tz.Sub(x, y.abs)\n\t} else {\n\t\tz.Add(x, y.abs)\n\t}\n}\n\n// Sets z to the sum x + y, where z and x are uint256s and y is an int256.\nfunc AddDeltaOverflow(z, x *uint256.Uint, y *Int) bool {\n\tvar overflow bool\n\tif y.neg {\n\t\t_, overflow = z.SubOverflow(x, y.abs)\n\t} else {\n\t\t_, overflow = z.AddOverflow(x, y.abs)\n\t}\n\treturn overflow\n}\n\n// Sub sets z to the difference x-y and returns z.\nfunc (z *Int) Sub(x, y *Int) *Int {\n\tz.initiateAbs()\n\n\tif x.neg != y.neg {\n\t\t// If sign are different, add the absolute values\n\t\tz.abs.Add(x.abs, y.abs)\n\t\tz.neg = x.neg\n\t} else {\n\t\tswitch x.abs.Cmp(y.abs) {\n\t\tcase 1: // x \u003e y\n\t\t\tz.abs.Sub(x.abs, y.abs)\n\t\t\tz.neg = x.neg\n\t\tcase -1: // x \u003c y\n\t\t\tz.abs.Sub(y.abs, x.abs)\n\t\t\tz.neg = !x.neg\n\t\tcase 0: // x == y\n\t\t\tz.abs = uint256.NewUint(0)\n\t\t}\n\t}\n\n\t// Ensure zero is always positive\n\tif z.abs.IsZero() {\n\t\tz.neg = false\n\t}\n\treturn z\n}\n\n// SubUint256 set z to the difference x - y, where y is a uint256, and returns z\nfunc (z *Int) SubUint256(x *Int, y *uint256.Uint) *Int {\n\tif x.neg {\n\t\tz.abs.Add(x.abs, y)\n\t\tz.neg = true\n\t} else {\n\t\tif x.abs.Lt(y) {\n\t\t\tz.abs.Sub(y, x.abs)\n\t\t\tz.neg = true\n\t\t} else {\n\t\t\tz.abs.Sub(x.abs, y)\n\t\t\tz.neg = false\n\t\t}\n\t}\n\treturn z\n}\n\n// Mul sets z to the product x*y and returns z.\nfunc (z *Int) Mul(x, y *Int) *Int {\n\tz.initiateAbs()\n\n\tz.abs = z.abs.Mul(x.abs, y.abs)\n\tz.neg = x.neg != y.neg \u0026\u0026 !z.abs.IsZero() // 0 has no sign\n\treturn z\n}\n\n// MulUint256 sets z to the product x*y, where y is a uint256, and returns z\nfunc (z *Int) MulUint256(x *Int, y *uint256.Uint) *Int {\n\tz.abs.Mul(x.abs, y)\n\tif z.abs.IsZero() {\n\t\tz.neg = false\n\t} else {\n\t\tz.neg = x.neg\n\t}\n\treturn z\n}\n\n// Div sets z to the quotient x/y for y != 0 and returns z.\nfunc (z *Int) Div(x, y *Int) *Int {\n\tz.initiateAbs()\n\n\tif y.abs.IsZero() {\n\t\tpanic(\"division by zero\")\n\t}\n\n\tz.abs.Div(x.abs, y.abs)\n\tz.neg = (x.neg != y.neg) \u0026\u0026 !z.abs.IsZero() // 0 has no sign\n\n\treturn z\n}\n\n// DivUint256 sets z to the quotient x/y, where y is a uint256, and returns z\n// If y == 0, z is set to 0\nfunc (z *Int) DivUint256(x *Int, y *uint256.Uint) *Int {\n\tz.abs.Div(x.abs, y)\n\tif z.abs.IsZero() {\n\t\tz.neg = false\n\t} else {\n\t\tz.neg = x.neg\n\t}\n\treturn z\n}\n\n// Quo sets z to the quotient x/y for y != 0 and returns z.\n// If y == 0, a division-by-zero run-time panic occurs.\n// OBS: differs from mempooler int256, we need to panic manually if y == 0\n// Quo implements truncated division (like Go); see QuoRem for more details.\nfunc (z *Int) Quo(x, y *Int) *Int {\n\tif y.IsZero() {\n\t\tpanic(\"division by zero\")\n\t}\n\n\tz.initiateAbs()\n\n\tz.abs = z.abs.Div(x.abs, y.abs)\n\tz.neg = !(z.abs.IsZero()) \u0026\u0026 x.neg != y.neg // 0 has no sign\n\treturn z\n}\n\n// Rem sets z to the remainder x%y for y != 0 and returns z.\n// If y == 0, a division-by-zero run-time panic occurs.\n// OBS: differs from mempooler int256, we need to panic manually if y == 0\n// Rem implements truncated modulus (like Go); see QuoRem for more details.\nfunc (z *Int) Rem(x, y *Int) *Int {\n\tif y.IsZero() {\n\t\tpanic(\"division by zero\")\n\t}\n\n\tz.initiateAbs()\n\n\tz.abs.Mod(x.abs, y.abs)\n\tz.neg = z.abs.Sign() \u003e 0 \u0026\u0026 x.neg // 0 has no sign\n\treturn z\n}\n\n// Mod sets z to the modulus x%y for y != 0 and returns z.\n// If y == 0, z is set to 0 (OBS: differs from the big.Int)\nfunc (z *Int) Mod(x, y *Int) *Int {\n\tif x.neg {\n\t\tz.abs.Div(x.abs, y.abs)\n\t\tz.abs.Add(z.abs, one)\n\t\tz.abs.Mul(z.abs, y.abs)\n\t\tz.abs.Sub(z.abs, x.abs)\n\t\tz.abs.Mod(z.abs, y.abs)\n\t} else {\n\t\tz.abs.Mod(x.abs, y.abs)\n\t}\n\tz.neg = false\n\treturn z\n}\n"},{"name":"arithmetic_test.gno","body":"package int256\n\nimport (\n\t\"testing\"\n\n\t\"gno.land/p/demo/uint256\"\n)\n\nfunc TestAdd(t *testing.T) {\n\ttests := []struct {\n\t\tx, y, want string\n\t}{\n\t\t{\"0\", \"1\", \"1\"},\n\t\t{\"1\", \"0\", \"1\"},\n\t\t{\"1\", \"1\", \"2\"},\n\t\t{\"1\", \"2\", \"3\"},\n\t\t// NEGATIVE\n\t\t{\"-1\", \"1\", \"0\"},\n\t\t{\"1\", \"-1\", \"0\"},\n\t\t{\"3\", \"-3\", \"0\"},\n\t\t{\"-1\", \"-1\", \"-2\"},\n\t\t{\"-1\", \"-2\", \"-3\"},\n\t\t{\"-1\", \"3\", \"2\"},\n\t\t{\"3\", \"-1\", \"2\"},\n\t\t// OVERFLOW\n\t\t{\"115792089237316195423570985008687907853269984665640564039457584007913129639935\", \"1\", \"0\"},\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\ty, err := FromDecimal(tc.y)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\twant, err := FromDecimal(tc.want)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := New()\n\t\tgot.Add(x, y)\n\n\t\tif got.Neq(want) {\n\t\t\tt.Errorf(\"Add(%s, %s) = %v, want %v\", tc.x, tc.y, got.ToString(), want.ToString())\n\t\t}\n\t}\n}\n\nfunc TestAddUint256(t *testing.T) {\n\ttests := []struct {\n\t\tx, y, want string\n\t}{\n\t\t{\"0\", \"1\", \"1\"},\n\t\t{\"1\", \"0\", \"1\"},\n\t\t{\"1\", \"1\", \"2\"},\n\t\t{\"1\", \"2\", \"3\"},\n\t\t{\"-1\", \"1\", \"0\"},\n\t\t{\"-1\", \"3\", \"2\"},\n\t\t{\"-115792089237316195423570985008687907853269984665640564039457584007913129639934\", \"115792089237316195423570985008687907853269984665640564039457584007913129639935\", \"1\"},\n\t\t{\"-115792089237316195423570985008687907853269984665640564039457584007913129639935\", \"115792089237316195423570985008687907853269984665640564039457584007913129639934\", \"-1\"},\n\t\t// OVERFLOW\n\t\t{\"-115792089237316195423570985008687907853269984665640564039457584007913129639935\", \"115792089237316195423570985008687907853269984665640564039457584007913129639935\", \"0\"},\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\ty, err := uint256.FromDecimal(tc.y)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\twant, err := FromDecimal(tc.want)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := New()\n\t\tgot.AddUint256(x, y)\n\n\t\tif got.Neq(want) {\n\t\t\tt.Errorf(\"AddUint256(%s, %s) = %v, want %v\", tc.x, tc.y, got.ToString(), want.ToString())\n\t\t}\n\t}\n}\n\nfunc TestAddDelta(t *testing.T) {\n\ttests := []struct {\n\t\tz, x, y, want string\n\t}{\n\t\t{\"0\", \"0\", \"0\", \"0\"},\n\t\t{\"0\", \"0\", \"1\", \"1\"},\n\t\t{\"0\", \"1\", \"0\", \"1\"},\n\t\t{\"0\", \"1\", \"1\", \"2\"},\n\t\t{\"1\", \"2\", \"3\", \"5\"},\n\t\t{\"5\", \"10\", \"-3\", \"7\"},\n\t\t// underflow\n\t\t{\"1\", \"2\", \"-3\", \"115792089237316195423570985008687907853269984665640564039457584007913129639935\"},\n\t}\n\n\tfor _, tc := range tests {\n\t\tz, err := uint256.FromDecimal(tc.z)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tx, err := uint256.FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\ty, err := FromDecimal(tc.y)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\twant, err := uint256.FromDecimal(tc.want)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tAddDelta(z, x, y)\n\n\t\tif z.Neq(want) {\n\t\t\tt.Errorf(\"AddDelta(%s, %s, %s) = %v, want %v\", tc.z, tc.x, tc.y, z.ToString(), want.ToString())\n\t\t}\n\t}\n}\n\nfunc TestAddDeltaOverflow(t *testing.T) {\n\ttests := []struct {\n\t\tz, x, y string\n\t\twant bool\n\t}{\n\t\t{\"0\", \"0\", \"0\", false},\n\t\t// underflow\n\t\t{\"1\", \"2\", \"-3\", true},\n\t}\n\n\tfor _, tc := range tests {\n\t\tz, err := uint256.FromDecimal(tc.z)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tx, err := uint256.FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\ty, err := FromDecimal(tc.y)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tresult := AddDeltaOverflow(z, x, y)\n\t\tif result != tc.want {\n\t\t\tt.Errorf(\"AddDeltaOverflow(%s, %s, %s) = %v, want %v\", tc.z, tc.x, tc.y, result, tc.want)\n\t\t}\n\t}\n}\n\nfunc TestSub(t *testing.T) {\n\ttests := []struct {\n\t\tx, y, want string\n\t}{\n\t\t{\"1\", \"0\", \"1\"},\n\t\t{\"1\", \"1\", \"0\"},\n\t\t{\"-1\", \"1\", \"-2\"},\n\t\t{\"1\", \"-1\", \"2\"},\n\t\t{\"-1\", \"-1\", \"0\"},\n\t\t{\"-115792089237316195423570985008687907853269984665640564039457584007913129639935\", \"-115792089237316195423570985008687907853269984665640564039457584007913129639935\", \"0\"},\n\t\t{\"-115792089237316195423570985008687907853269984665640564039457584007913129639935\", \"0\", \"-115792089237316195423570985008687907853269984665640564039457584007913129639935\"},\n\t\t{x: \"-115792089237316195423570985008687907853269984665640564039457584007913129639935\", y: \"1\", want: \"0\"},\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\ty, err := FromDecimal(tc.y)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\twant, err := FromDecimal(tc.want)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := New()\n\t\tgot.Sub(x, y)\n\n\t\tif got.Neq(want) {\n\t\t\tt.Errorf(\"Sub(%s, %s) = %v, want %v\", tc.x, tc.y, got.ToString(), want.ToString())\n\t\t}\n\t}\n}\n\nfunc TestSubUint256(t *testing.T) {\n\ttests := []struct {\n\t\tx, y, want string\n\t}{\n\t\t{\"0\", \"1\", \"-1\"},\n\t\t{\"1\", \"0\", \"1\"},\n\t\t{\"1\", \"1\", \"0\"},\n\t\t{\"1\", \"2\", \"-1\"},\n\t\t{\"-1\", \"1\", \"-2\"},\n\t\t{\"-1\", \"3\", \"-4\"},\n\t\t// underflow\n\t\t{\"-115792089237316195423570985008687907853269984665640564039457584007913129639935\", \"1\", \"-0\"},\n\t\t{\"-115792089237316195423570985008687907853269984665640564039457584007913129639935\", \"2\", \"-1\"},\n\t\t{\"-115792089237316195423570985008687907853269984665640564039457584007913129639935\", \"3\", \"-2\"},\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\ty, err := uint256.FromDecimal(tc.y)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\twant, err := FromDecimal(tc.want)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := New()\n\t\tgot.SubUint256(x, y)\n\n\t\tif got.Neq(want) {\n\t\t\tt.Errorf(\"SubUint256(%s, %s) = %v, want %v\", tc.x, tc.y, got.ToString(), want.ToString())\n\t\t}\n\t}\n}\n\nfunc TestMul(t *testing.T) {\n\ttests := []struct {\n\t\tx, y, want string\n\t}{\n\t\t{\"5\", \"3\", \"15\"},\n\t\t{\"-5\", \"3\", \"-15\"},\n\t\t{\"5\", \"-3\", \"-15\"},\n\t\t{\"0\", \"3\", \"0\"},\n\t\t{\"3\", \"0\", \"0\"},\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\ty, err := FromDecimal(tc.y)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\twant, err := FromDecimal(tc.want)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := New()\n\t\tgot.Mul(x, y)\n\n\t\tif got.Neq(want) {\n\t\t\tt.Errorf(\"Mul(%s, %s) = %v, want %v\", tc.x, tc.y, got.ToString(), want.ToString())\n\t\t}\n\t}\n}\n\nfunc TestMulUint256(t *testing.T) {\n\ttests := []struct {\n\t\tx, y, want string\n\t}{\n\t\t{\"0\", \"1\", \"0\"},\n\t\t{\"1\", \"0\", \"0\"},\n\t\t{\"1\", \"1\", \"1\"},\n\t\t{\"1\", \"2\", \"2\"},\n\t\t{\"-1\", \"1\", \"-1\"},\n\t\t{\"-1\", \"3\", \"-3\"},\n\t\t{\"3\", \"4\", \"12\"},\n\t\t{\"-3\", \"4\", \"-12\"},\n\t\t{\"-115792089237316195423570985008687907853269984665640564039457584007913129639934\", \"2\", \"-115792089237316195423570985008687907853269984665640564039457584007913129639932\"},\n\t\t{\"115792089237316195423570985008687907853269984665640564039457584007913129639934\", \"2\", \"115792089237316195423570985008687907853269984665640564039457584007913129639932\"},\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\ty, err := uint256.FromDecimal(tc.y)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\twant, err := FromDecimal(tc.want)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := New()\n\t\tgot.MulUint256(x, y)\n\n\t\tif got.Neq(want) {\n\t\t\tt.Errorf(\"MulUint256(%s, %s) = %v, want %v\", tc.x, tc.y, got.ToString(), want.ToString())\n\t\t}\n\t}\n}\n\nfunc TestDiv(t *testing.T) {\n\ttests := []struct {\n\t\tx, y, expected string\n\t}{\n\t\t{\"1\", \"1\", \"1\"},\n\t\t{\"0\", \"1\", \"0\"},\n\t\t{\"-1\", \"1\", \"-1\"},\n\t\t{\"1\", \"-1\", \"-1\"},\n\t\t{\"-1\", \"-1\", \"1\"},\n\t\t{\"-6\", \"3\", \"-2\"},\n\t\t{\"10\", \"-2\", \"-5\"},\n\t\t{\"-10\", \"3\", \"-3\"},\n\t\t{\"7\", \"3\", \"2\"},\n\t\t{\"-7\", \"3\", \"-2\"},\n\t\t{\"115792089237316195423570985008687907853269984665640564039457584007913129639935\", \"2\", \"57896044618658097711785492504343953926634992332820282019728792003956564819967\"}, // Max uint256 / 2\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.x+\"/\"+tt.y, func(t *testing.T) {\n\t\t\tx := MustFromDecimal(tt.x)\n\t\t\ty := MustFromDecimal(tt.y)\n\t\t\tresult := Zero().Div(x, y)\n\t\t\tif result.ToString() != tt.expected {\n\t\t\t\tt.Errorf(\"Div(%s, %s) = %s, want %s\", tt.x, tt.y, result.ToString(), tt.expected)\n\t\t\t}\n\t\t\tif result.abs.IsZero() \u0026\u0026 result.neg {\n\t\t\t\tt.Errorf(\"Div(%s, %s) resulted in negative zero\", tt.x, tt.y)\n\t\t\t}\n\t\t})\n\t}\n\n\tt.Run(\"Division by zero\", func(t *testing.T) {\n\t\tdefer func() {\n\t\t\tif r := recover(); r == nil {\n\t\t\t\tt.Errorf(\"Div(1, 0) did not panic\")\n\t\t\t}\n\t\t}()\n\t\tx := MustFromDecimal(\"1\")\n\t\ty := MustFromDecimal(\"0\")\n\t\tZero().Div(x, y)\n\t})\n}\n\nfunc TestDivUint256(t *testing.T) {\n\ttests := []struct {\n\t\tx, y, want string\n\t}{\n\t\t{\"0\", \"1\", \"0\"},\n\t\t{\"1\", \"0\", \"0\"},\n\t\t{\"1\", \"1\", \"1\"},\n\t\t{\"1\", \"2\", \"0\"},\n\t\t{\"-1\", \"1\", \"-1\"},\n\t\t{\"-1\", \"3\", \"0\"},\n\t\t{\"4\", \"3\", \"1\"},\n\t\t{\"25\", \"5\", \"5\"},\n\t\t{\"25\", \"4\", \"6\"},\n\t\t{\"-115792089237316195423570985008687907853269984665640564039457584007913129639934\", \"2\", \"-57896044618658097711785492504343953926634992332820282019728792003956564819967\"},\n\t\t{\"115792089237316195423570985008687907853269984665640564039457584007913129639934\", \"2\", \"57896044618658097711785492504343953926634992332820282019728792003956564819967\"},\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\ty, err := uint256.FromDecimal(tc.y)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\twant, err := FromDecimal(tc.want)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := New()\n\t\tgot.DivUint256(x, y)\n\n\t\tif got.Neq(want) {\n\t\t\tt.Errorf(\"DivUint256(%s, %s) = %v, want %v\", tc.x, tc.y, got.ToString(), want.ToString())\n\t\t}\n\t}\n}\n\nfunc TestQuo(t *testing.T) {\n\ttests := []struct {\n\t\tx, y, want string\n\t}{\n\t\t{\"0\", \"1\", \"0\"},\n\t\t{\"0\", \"-1\", \"0\"},\n\t\t{\"10\", \"1\", \"10\"},\n\t\t{\"10\", \"-1\", \"-10\"},\n\t\t{\"-10\", \"1\", \"-10\"},\n\t\t{\"-10\", \"-1\", \"10\"},\n\t\t{\"10\", \"-3\", \"-3\"},\n\t\t{\"10\", \"3\", \"3\"},\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\ty, err := FromDecimal(tc.y)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\twant, err := FromDecimal(tc.want)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := New()\n\t\tgot.Quo(x, y)\n\n\t\tif got.Neq(want) {\n\t\t\tt.Errorf(\"Quo(%s, %s) = %v, want %v\", tc.x, tc.y, got.ToString(), want.ToString())\n\t\t}\n\t}\n}\n\nfunc TestRem(t *testing.T) {\n\ttests := []struct {\n\t\tx, y, want string\n\t}{\n\t\t{\"0\", \"1\", \"0\"},\n\t\t{\"0\", \"-1\", \"0\"},\n\t\t{\"10\", \"1\", \"0\"},\n\t\t{\"10\", \"-1\", \"0\"},\n\t\t{\"-10\", \"1\", \"0\"},\n\t\t{\"-10\", \"-1\", \"0\"},\n\t\t{\"10\", \"3\", \"1\"},\n\t\t{\"10\", \"-3\", \"1\"},\n\t\t{\"-10\", \"3\", \"-1\"},\n\t\t{\"-10\", \"-3\", \"-1\"},\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\ty, err := FromDecimal(tc.y)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\twant, err := FromDecimal(tc.want)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := New()\n\t\tgot.Rem(x, y)\n\n\t\tif got.Neq(want) {\n\t\t\tt.Errorf(\"Rem(%s, %s) = %v, want %v\", tc.x, tc.y, got.ToString(), want.ToString())\n\t\t}\n\t}\n}\n\nfunc TestMod(t *testing.T) {\n\ttests := []struct {\n\t\tx, y, want string\n\t}{\n\t\t{\"0\", \"1\", \"0\"},\n\t\t{\"0\", \"-1\", \"0\"},\n\t\t{\"10\", \"0\", \"0\"},\n\t\t{\"10\", \"1\", \"0\"},\n\t\t{\"10\", \"-1\", \"0\"},\n\t\t{\"-10\", \"0\", \"0\"},\n\t\t{\"-10\", \"1\", \"0\"},\n\t\t{\"-10\", \"-1\", \"0\"},\n\t\t{\"10\", \"3\", \"1\"},\n\t\t{\"10\", \"-3\", \"1\"},\n\t\t{\"-10\", \"3\", \"2\"},\n\t\t{\"-10\", \"-3\", \"2\"},\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\ty, err := FromDecimal(tc.y)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\twant, err := FromDecimal(tc.want)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := New()\n\t\tgot.Mod(x, y)\n\n\t\tif got.Neq(want) {\n\t\t\tt.Errorf(\"Mod(%s, %s) = %v, want %v\", tc.x, tc.y, got.ToString(), want.ToString())\n\t\t}\n\t}\n}\n"},{"name":"bitwise.gno","body":"package int256\n\nimport (\n\t\"gno.land/p/demo/uint256\"\n)\n\n// Or sets z = x | y and returns z.\nfunc (z *Int) Or(x, y *Int) *Int {\n\tif x.neg == y.neg {\n\t\tif x.neg {\n\t\t\t// (-x) | (-y) == ^(x-1) | ^(y-1) == ^((x-1) \u0026 (y-1)) == -(((x-1) \u0026 (y-1)) + 1)\n\t\t\tx1 := new(uint256.Uint).Sub(x.abs, one)\n\t\t\ty1 := new(uint256.Uint).Sub(y.abs, one)\n\t\t\tz.abs = z.abs.Add(z.abs.And(x1, y1), one)\n\t\t\tz.neg = true // z cannot be zero if x and y are negative\n\t\t\treturn z\n\t\t}\n\n\t\t// x | y == x | y\n\t\tz.abs = z.abs.Or(x.abs, y.abs)\n\t\tz.neg = false\n\t\treturn z\n\t}\n\n\t// x.neg != y.neg\n\tif x.neg {\n\t\tx, y = y, x // | is symmetric\n\t}\n\n\t// x | (-y) == x | ^(y-1) == ^((y-1) \u0026^ x) == -(^((y-1) \u0026^ x) + 1)\n\ty1 := new(uint256.Uint).Sub(y.abs, one)\n\tz.abs = z.abs.Add(z.abs.AndNot(y1, x.abs), one)\n\tz.neg = true // z cannot be zero if one of x or y is negative\n\n\treturn z\n}\n\n// And sets z = x \u0026 y and returns z.\nfunc (z *Int) And(x, y *Int) *Int {\n\tif x.neg == y.neg {\n\t\tif x.neg {\n\t\t\t// (-x) \u0026 (-y) == ^(x-1) \u0026 ^(y-1) == ^((x-1) | (y-1)) == -(((x-1) | (y-1)) + 1)\n\t\t\tx1 := new(uint256.Uint).Sub(x.abs, one)\n\t\t\ty1 := new(uint256.Uint).Sub(y.abs, one)\n\t\t\tz.abs = z.abs.Add(z.abs.Or(x1, y1), one)\n\t\t\tz.neg = true // z cannot be zero if x and y are negative\n\t\t\treturn z\n\t\t}\n\n\t\t// x \u0026 y == x \u0026 y\n\t\tz.abs = z.abs.And(x.abs, y.abs)\n\t\tz.neg = false\n\t\treturn z\n\t}\n\n\t// x.neg != y.neg\n\t// REF: https://cs.opensource.google/go/go/+/refs/tags/go1.22.1:src/math/big/int.go;l=1192-1202;drc=d57303e65f00b84b528ee682747dbe1fd3316d30\n\tif x.neg {\n\t\tx, y = y, x // \u0026 is symmetric\n\t}\n\n\t// x \u0026 (-y) == x \u0026 ^(y-1) == x \u0026^ (y-1)\n\ty1 := new(uint256.Uint).Sub(y.abs, uint256.One())\n\tz.abs = z.abs.AndNot(x.abs, y1)\n\tz.neg = false\n\treturn z\n}\n\n// Rsh sets z = x \u003e\u003e n and returns z.\n// OBS: Different from original implementation it was using math.Big\nfunc (z *Int) Rsh(x *Int, n uint) *Int {\n\tif !x.neg {\n\t\tz.abs.Rsh(x.abs, n)\n\t\tz.neg = x.neg\n\t\treturn z\n\t}\n\n\t// REF: https://cs.opensource.google/go/go/+/refs/tags/go1.22.1:src/math/big/int.go;l=1118-1126;drc=d57303e65f00b84b528ee682747dbe1fd3316d30\n\tt := NewInt(0).Sub(FromUint256(x.abs), NewInt(1))\n\tt = t.Rsh(t, n)\n\n\t_tmp := t.Add(t, NewInt(1))\n\tz.abs = _tmp.Abs()\n\tz.neg = true\n\n\treturn z\n}\n\n// Lsh sets z = x \u003c\u003c n and returns z.\nfunc (z *Int) Lsh(x *Int, n uint) *Int {\n\tz.abs.Lsh(x.abs, n)\n\tz.neg = x.neg\n\treturn z\n}\n"},{"name":"bitwise_test.gno","body":"package int256\n\nimport (\n\t\"testing\"\n\n\t\"gno.land/p/demo/uint256\"\n)\n\nfunc TestOr(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tx, y, want Int\n\t}{\n\t\t{\n\t\t\tname: \"all zeroes\",\n\t\t\tx: Int{abs: \u0026uint256.Uint{arr: [4]uint64{0, 0, 0, 0}}, neg: false},\n\t\t\ty: Int{abs: \u0026uint256.Uint{arr: [4]uint64{0, 0, 0, 0}}, neg: false},\n\t\t\twant: Int{abs: \u0026uint256.Uint{arr: [4]uint64{0, 0, 0, 0}}, neg: false},\n\t\t},\n\t\t{\n\t\t\tname: \"all ones\",\n\t\t\tx: Int{abs: \u0026uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, neg: false},\n\t\t\ty: Int{abs: \u0026uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, neg: false},\n\t\t\twant: Int{abs: \u0026uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, neg: false},\n\t\t},\n\t\t{\n\t\t\tname: \"mixed\",\n\t\t\tx: Int{abs: \u0026uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), 0, 0}}, neg: false},\n\t\t\ty: Int{abs: \u0026uint256.Uint{arr: [4]uint64{0, 0, ^uint64(0), ^uint64(0)}}, neg: false},\n\t\t\twant: Int{abs: \u0026uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, neg: false},\n\t\t},\n\t\t{\n\t\t\tname: \"one operand all ones\",\n\t\t\tx: Int{abs: \u0026uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, neg: false},\n\t\t\ty: Int{abs: \u0026uint256.Uint{arr: [4]uint64{0x5555555555555555, 0xAAAAAAAAAAAAAAAA, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000}}, neg: false},\n\t\t\twant: Int{abs: \u0026uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, neg: false},\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tgot := New()\n\t\t\tgot.Or(\u0026tc.x, \u0026tc.y)\n\n\t\t\tif got.Neq(\u0026tc.want) {\n\t\t\t\tt.Errorf(\"Or(%v, %v) = %v, want %v\", tc.x, tc.y, got, tc.want)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestAnd(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tx, y, want Int\n\t}{\n\t\t{\n\t\t\tname: \"all zeroes\",\n\t\t\tx: Int{abs: \u0026uint256.Uint{arr: [4]uint64{0, 0, 0, 0}}, neg: false},\n\t\t\ty: Int{abs: \u0026uint256.Uint{arr: [4]uint64{0, 0, 0, 0}}, neg: false},\n\t\t\twant: Int{abs: \u0026uint256.Uint{arr: [4]uint64{0, 0, 0, 0}}, neg: false},\n\t\t},\n\t\t{\n\t\t\tname: \"all ones\",\n\t\t\tx: Int{abs: \u0026uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, neg: false},\n\t\t\ty: Int{abs: \u0026uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, neg: false},\n\t\t\twant: Int{abs: \u0026uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, neg: false},\n\t\t},\n\t\t{\n\t\t\tname: \"mixed\",\n\t\t\tx: Int{abs: \u0026uint256.Uint{arr: [4]uint64{0, 0, 0, 0}}, neg: false},\n\t\t\ty: Int{abs: \u0026uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, neg: false},\n\t\t\twant: Int{abs: \u0026uint256.Uint{arr: [4]uint64{0, 0, 0, 0}}, neg: false},\n\t\t},\n\t\t{\n\t\t\tname: \"mixed 2\",\n\t\t\tx: Int{abs: \u0026uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, neg: false},\n\t\t\ty: Int{abs: \u0026uint256.Uint{arr: [4]uint64{0, 0, 0, 0}}, neg: false},\n\t\t\twant: Int{abs: \u0026uint256.Uint{arr: [4]uint64{0, 0, 0, 0}}, neg: false},\n\t\t},\n\t\t{\n\t\t\tname: \"mixed 3\",\n\t\t\tx: Int{abs: \u0026uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), 0, 0}}, neg: false},\n\t\t\ty: Int{abs: \u0026uint256.Uint{arr: [4]uint64{0, 0, ^uint64(0), ^uint64(0)}}, neg: false},\n\t\t\twant: Int{abs: \u0026uint256.Uint{arr: [4]uint64{0, 0, 0, 0}}, neg: false},\n\t\t},\n\t\t{\n\t\t\tname: \"one operand zero\",\n\t\t\tx: Int{abs: \u0026uint256.Uint{arr: [4]uint64{0, 0, 0, 0}}, neg: false},\n\t\t\ty: Int{abs: \u0026uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, neg: false},\n\t\t\twant: Int{abs: \u0026uint256.Uint{arr: [4]uint64{0, 0, 0, 0}}, neg: false},\n\t\t},\n\t\t{\n\t\t\tname: \"one operand all ones\",\n\t\t\tx: Int{abs: \u0026uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, neg: false},\n\t\t\ty: Int{abs: \u0026uint256.Uint{arr: [4]uint64{0x5555555555555555, 0xAAAAAAAAAAAAAAAA, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000}}, neg: false},\n\t\t\twant: Int{abs: \u0026uint256.Uint{arr: [4]uint64{0x5555555555555555, 0xAAAAAAAAAAAAAAAA, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000}}, neg: false},\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tgot := New()\n\t\t\tgot.And(\u0026tc.x, \u0026tc.y)\n\n\t\t\tif got.Neq(\u0026tc.want) {\n\t\t\t\tt.Errorf(\"And(%v, %v) = %v, want %v\", tc.x, tc.y, got, tc.want)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestRsh(t *testing.T) {\n\ttests := []struct {\n\t\tx string\n\t\tn uint\n\t\twant string\n\t}{\n\t\t{\"1024\", 0, \"1024\"},\n\t\t{\"1024\", 1, \"512\"},\n\t\t{\"1024\", 2, \"256\"},\n\t\t{\"1024\", 10, \"1\"},\n\t\t{\"1024\", 11, \"0\"},\n\t\t{\"18446744073709551615\", 0, \"18446744073709551615\"},\n\t\t{\"18446744073709551615\", 1, \"9223372036854775807\"},\n\t\t{\"18446744073709551615\", 62, \"3\"},\n\t\t{\"18446744073709551615\", 63, \"1\"},\n\t\t{\"18446744073709551615\", 64, \"0\"},\n\t\t{\"115792089237316195423570985008687907853269984665640564039457584007913129639935\", 0, \"115792089237316195423570985008687907853269984665640564039457584007913129639935\"},\n\t\t{\"115792089237316195423570985008687907853269984665640564039457584007913129639935\", 1, \"57896044618658097711785492504343953926634992332820282019728792003956564819967\"},\n\t\t{\"115792089237316195423570985008687907853269984665640564039457584007913129639935\", 128, \"340282366920938463463374607431768211455\"},\n\t\t{\"115792089237316195423570985008687907853269984665640564039457584007913129639935\", 255, \"1\"},\n\t\t{\"115792089237316195423570985008687907853269984665640564039457584007913129639935\", 256, \"0\"},\n\t\t{\"-1024\", 0, \"-1024\"},\n\t\t{\"-1024\", 1, \"-512\"},\n\t\t{\"-1024\", 2, \"-256\"},\n\t\t{\"-1024\", 10, \"-1\"},\n\t\t{\"-1024\", 10, \"-1\"},\n\t\t{\"-9223372036854775808\", 0, \"-9223372036854775808\"},\n\t\t{\"-9223372036854775808\", 1, \"-4611686018427387904\"},\n\t\t{\"-9223372036854775808\", 62, \"-2\"},\n\t\t{\"-9223372036854775808\", 63, \"-1\"},\n\t\t{\"-9223372036854775808\", 64, \"-1\"},\n\t\t{\"-57896044618658097711785492504343953926634992332820282019728792003956564819968\", 0, \"-57896044618658097711785492504343953926634992332820282019728792003956564819968\"},\n\t\t{\"-57896044618658097711785492504343953926634992332820282019728792003956564819968\", 1, \"-28948022309329048855892746252171976963317496166410141009864396001978282409984\"},\n\t\t{\"-57896044618658097711785492504343953926634992332820282019728792003956564819968\", 253, \"-4\"},\n\t\t{\"-57896044618658097711785492504343953926634992332820282019728792003956564819968\", 254, \"-2\"},\n\t\t{\"-57896044618658097711785492504343953926634992332820282019728792003956564819968\", 255, \"-1\"},\n\t\t{\"-57896044618658097711785492504343953926634992332820282019728792003956564819968\", 256, \"-1\"},\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := New()\n\t\tgot.Rsh(x, tc.n)\n\n\t\tif got.ToString() != tc.want {\n\t\t\tt.Errorf(\"Rsh(%s, %d) = %v, want %v\", tc.x, tc.n, got.ToString(), tc.want)\n\t\t}\n\t}\n}\n\nfunc TestLsh(t *testing.T) {\n\ttests := []struct {\n\t\tx string\n\t\tn uint\n\t\twant string\n\t}{\n\t\t{\"1\", 0, \"1\"},\n\t\t{\"1\", 1, \"2\"},\n\t\t{\"1\", 2, \"4\"},\n\t\t{\"2\", 0, \"2\"},\n\t\t{\"2\", 1, \"4\"},\n\t\t{\"2\", 2, \"8\"},\n\t\t{\"-2\", 0, \"-2\"},\n\t\t{\"-4\", 0, \"-4\"},\n\t\t{\"-8\", 0, \"-8\"},\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := New()\n\t\tgot.Lsh(x, tc.n)\n\n\t\tif got.ToString() != tc.want {\n\t\t\tt.Errorf(\"Lsh(%s, %d) = %v, want %v\", tc.x, tc.n, got.ToString(), tc.want)\n\t\t}\n\t}\n}\n"},{"name":"cmp.gno","body":"package int256\n\n// Eq returns true if z == x\nfunc (z *Int) Eq(x *Int) bool {\n\treturn (z.neg == x.neg) \u0026\u0026 z.abs.Eq(x.abs)\n}\n\n// Neq returns true if z != x\nfunc (z *Int) Neq(x *Int) bool {\n\treturn !z.Eq(x)\n}\n\n// Cmp compares x and y and returns:\n//\n//\t-1 if x \u003c y\n//\t 0 if x == y\n//\t+1 if x \u003e y\nfunc (z *Int) Cmp(x *Int) (r int) {\n\t// x cmp y == x cmp y\n\t// x cmp (-y) == x\n\t// (-x) cmp y == y\n\t// (-x) cmp (-y) == -(x cmp y)\n\tswitch {\n\tcase z == x:\n\t\t// nothing to do\n\tcase z.neg == x.neg:\n\t\tr = z.abs.Cmp(x.abs)\n\t\tif z.neg {\n\t\t\tr = -r\n\t\t}\n\tcase z.neg:\n\t\tr = -1\n\tdefault:\n\t\tr = 1\n\t}\n\treturn\n}\n\n// IsZero returns true if z == 0\nfunc (z *Int) IsZero() bool {\n\treturn z.abs.IsZero()\n}\n\n// IsNeg returns true if z \u003c 0\nfunc (z *Int) IsNeg() bool {\n\treturn z.neg\n}\n\n// Lt returns true if z \u003c x\nfunc (z *Int) Lt(x *Int) bool {\n\tif z.neg {\n\t\tif x.neg {\n\t\t\treturn z.abs.Gt(x.abs)\n\t\t} else {\n\t\t\treturn true\n\t\t}\n\t} else {\n\t\tif x.neg {\n\t\t\treturn false\n\t\t} else {\n\t\t\treturn z.abs.Lt(x.abs)\n\t\t}\n\t}\n}\n\n// Gt returns true if z \u003e x\nfunc (z *Int) Gt(x *Int) bool {\n\tif z.neg {\n\t\tif x.neg {\n\t\t\treturn z.abs.Lt(x.abs)\n\t\t} else {\n\t\t\treturn false\n\t\t}\n\t} else {\n\t\tif x.neg {\n\t\t\treturn true\n\t\t} else {\n\t\t\treturn z.abs.Gt(x.abs)\n\t\t}\n\t}\n}\n\n// Clone creates a new Int identical to z\nfunc (z *Int) Clone() *Int {\n\treturn \u0026Int{z.abs.Clone(), z.neg}\n}\n"},{"name":"cmp_test.gno","body":"package int256\n\nimport \"testing\"\n\nfunc TestEq(t *testing.T) {\n\ttests := []struct {\n\t\tx, y string\n\t\twant bool\n\t}{\n\t\t{\"0\", \"0\", true},\n\t\t{\"0\", \"1\", false},\n\t\t{\"1\", \"0\", false},\n\t\t{\"-1\", \"0\", false},\n\t\t{\"0\", \"-1\", false},\n\t\t{\"1\", \"1\", true},\n\t\t{\"-1\", \"-1\", true},\n\t\t{\"115792089237316195423570985008687907853269984665640564039457584007913129639935\", \"-115792089237316195423570985008687907853269984665640564039457584007913129639935\", false},\n\t\t{\"-115792089237316195423570985008687907853269984665640564039457584007913129639935\", \"-115792089237316195423570985008687907853269984665640564039457584007913129639935\", true},\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\ty, err := FromDecimal(tc.y)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := x.Eq(y)\n\t\tif got != tc.want {\n\t\t\tt.Errorf(\"Eq(%s, %s) = %v, want %v\", tc.x, tc.y, got, tc.want)\n\t\t}\n\t}\n}\n\nfunc TestNeq(t *testing.T) {\n\ttests := []struct {\n\t\tx, y string\n\t\twant bool\n\t}{\n\t\t{\"0\", \"0\", false},\n\t\t{\"0\", \"1\", true},\n\t\t{\"1\", \"0\", true},\n\t\t{\"-1\", \"0\", true},\n\t\t{\"0\", \"-1\", true},\n\t\t{\"1\", \"1\", false},\n\t\t{\"-1\", \"-1\", false},\n\t\t{\"115792089237316195423570985008687907853269984665640564039457584007913129639935\", \"-115792089237316195423570985008687907853269984665640564039457584007913129639935\", true},\n\t\t{\"-115792089237316195423570985008687907853269984665640564039457584007913129639935\", \"-115792089237316195423570985008687907853269984665640564039457584007913129639935\", false},\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\ty, err := FromDecimal(tc.y)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := x.Neq(y)\n\t\tif got != tc.want {\n\t\t\tt.Errorf(\"Neq(%s, %s) = %v, want %v\", tc.x, tc.y, got, tc.want)\n\t\t}\n\t}\n}\n\nfunc TestCmp(t *testing.T) {\n\ttests := []struct {\n\t\tx, y string\n\t\twant int\n\t}{\n\t\t{\"0\", \"0\", 0},\n\t\t{\"0\", \"1\", -1},\n\t\t{\"1\", \"0\", 1},\n\t\t{\"-1\", \"0\", -1},\n\t\t{\"0\", \"-1\", 1},\n\t\t{\"1\", \"1\", 0},\n\t\t{\"115792089237316195423570985008687907853269984665640564039457584007913129639935\", \"-115792089237316195423570985008687907853269984665640564039457584007913129639935\", 1},\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\ty, err := FromDecimal(tc.y)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := x.Cmp(y)\n\t\tif got != tc.want {\n\t\t\tt.Errorf(\"Cmp(%s, %s) = %v, want %v\", tc.x, tc.y, got, tc.want)\n\t\t}\n\t}\n}\n\nfunc TestIsZero(t *testing.T) {\n\ttests := []struct {\n\t\tx string\n\t\twant bool\n\t}{\n\t\t{\"0\", true},\n\t\t{\"-0\", true},\n\t\t{\"1\", false},\n\t\t{\"-1\", false},\n\t\t{\"10\", false},\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := x.IsZero()\n\t\tif got != tc.want {\n\t\t\tt.Errorf(\"IsZero(%s) = %v, want %v\", tc.x, got, tc.want)\n\t\t}\n\t}\n}\n\nfunc TestIsNeg(t *testing.T) {\n\ttests := []struct {\n\t\tx string\n\t\twant bool\n\t}{\n\t\t{\"0\", false},\n\t\t{\"-0\", true}, // TODO: should this be false?\n\t\t{\"1\", false},\n\t\t{\"-1\", true},\n\t\t{\"10\", false},\n\t\t{\"-10\", true},\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := x.IsNeg()\n\t\tif got != tc.want {\n\t\t\tt.Errorf(\"IsNeg(%s) = %v, want %v\", tc.x, got, tc.want)\n\t\t}\n\t}\n}\n\nfunc TestLt(t *testing.T) {\n\ttests := []struct {\n\t\tx, y string\n\t\twant bool\n\t}{\n\t\t{\"0\", \"0\", false},\n\t\t{\"0\", \"1\", true},\n\t\t{\"1\", \"0\", false},\n\t\t{\"-1\", \"0\", true},\n\t\t{\"0\", \"-1\", false},\n\t\t{\"1\", \"1\", false},\n\t\t{\"-1\", \"-1\", false},\n\t\t{\"115792089237316195423570985008687907853269984665640564039457584007913129639935\", \"-115792089237316195423570985008687907853269984665640564039457584007913129639935\", false},\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\ty, err := FromDecimal(tc.y)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := x.Lt(y)\n\t\tif got != tc.want {\n\t\t\tt.Errorf(\"Lt(%s, %s) = %v, want %v\", tc.x, tc.y, got, tc.want)\n\t\t}\n\t}\n}\n\nfunc TestGt(t *testing.T) {\n\ttests := []struct {\n\t\tx, y string\n\t\twant bool\n\t}{\n\t\t{\"0\", \"0\", false},\n\t\t{\"0\", \"1\", false},\n\t\t{\"1\", \"0\", true},\n\t\t{\"-1\", \"0\", false},\n\t\t{\"0\", \"-1\", true},\n\t\t{\"1\", \"1\", false},\n\t\t{\"-1\", \"-1\", false},\n\t\t{\"115792089237316195423570985008687907853269984665640564039457584007913129639935\", \"-115792089237316195423570985008687907853269984665640564039457584007913129639935\", true},\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\ty, err := FromDecimal(tc.y)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := x.Gt(y)\n\t\tif got != tc.want {\n\t\t\tt.Errorf(\"Gt(%s, %s) = %v, want %v\", tc.x, tc.y, got, tc.want)\n\t\t}\n\t}\n}\n\nfunc TestClone(t *testing.T) {\n\ttests := []struct {\n\t\tx string\n\t}{\n\t\t{\"0\"},\n\t\t{\"-0\"},\n\t\t{\"1\"},\n\t\t{\"-1\"},\n\t\t{\"10\"},\n\t\t{\"-10\"},\n\t\t{\"115792089237316195423570985008687907853269984665640564039457584007913129639935\"},\n\t\t{\"-115792089237316195423570985008687907853269984665640564039457584007913129639935\"},\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\ty := x.Clone()\n\n\t\tif x.Cmp(y) != 0 {\n\t\t\tt.Errorf(\"Clone(%s) = %v, want %v\", tc.x, y, x)\n\t\t}\n\t}\n}\n"},{"name":"conversion.gno","body":"package int256\n\nimport \"gno.land/p/demo/uint256\"\n\n// SetInt64 sets z to x and returns z.\nfunc (z *Int) SetInt64(x int64) *Int {\n\tz.initiateAbs()\n\n\tneg := false\n\tif x \u003c 0 {\n\t\tneg = true\n\t\tx = -x\n\t}\n\tif z.abs == nil {\n\t\tpanic(\"abs is nil\")\n\t}\n\tz.abs = z.abs.SetUint64(uint64(x))\n\tz.neg = neg\n\treturn z\n}\n\n// SetUint64 sets z to x and returns z.\nfunc (z *Int) SetUint64(x uint64) *Int {\n\tz.initiateAbs()\n\n\tif z.abs == nil {\n\t\tpanic(\"abs is nil\")\n\t}\n\tz.abs = z.abs.SetUint64(x)\n\tz.neg = false\n\treturn z\n}\n\n// Uint64 returns the lower 64-bits of z\nfunc (z *Int) Uint64() uint64 {\n\treturn z.abs.Uint64()\n}\n\n// Int64 returns the lower 64-bits of z\nfunc (z *Int) Int64() int64 {\n\t_abs := z.abs.Clone()\n\n\tif z.neg {\n\t\treturn -int64(_abs.Uint64())\n\t}\n\treturn int64(_abs.Uint64())\n}\n\n// Neg sets z to -x and returns z.)\nfunc (z *Int) Neg(x *Int) *Int {\n\tz.abs.Set(x.abs)\n\tif z.abs.IsZero() {\n\t\tz.neg = false\n\t} else {\n\t\tz.neg = !x.neg\n\t}\n\treturn z\n}\n\n// Set sets z to x and returns z.\nfunc (z *Int) Set(x *Int) *Int {\n\tz.abs.Set(x.abs)\n\tz.neg = x.neg\n\treturn z\n}\n\n// SetFromUint256 converts a uint256.Uint to Int and sets the value to z.\nfunc (z *Int) SetUint256(x *uint256.Uint) *Int {\n\tz.abs.Set(x)\n\tz.neg = false\n\treturn z\n}\n\n// OBS, differs from original mempooler int256\n// ToString returns the decimal representation of z.\nfunc (z *Int) ToString() string {\n\tif z == nil {\n\t\tpanic(\"int256: nil pointer to ToString()\")\n\t}\n\n\tt := z.abs.Dec()\n\tif z.neg {\n\t\treturn \"-\" + t\n\t}\n\n\treturn t\n}\n"},{"name":"conversion_test.gno","body":"package int256\n\nimport (\n\t\"testing\"\n\n\t\"gno.land/p/demo/uint256\"\n)\n\nfunc TestSetInt64(t *testing.T) {\n\ttests := []struct {\n\t\tx int64\n\t\twant string\n\t}{\n\t\t{0, \"0\"},\n\t\t{1, \"1\"},\n\t\t{-1, \"-1\"},\n\t\t{9223372036854775807, \"9223372036854775807\"},\n\t\t{-9223372036854775808, \"-9223372036854775808\"},\n\t}\n\n\tfor _, tc := range tests {\n\t\tvar z Int\n\t\tz.SetInt64(tc.x)\n\n\t\tgot := z.ToString()\n\t\tif got != tc.want {\n\t\t\tt.Errorf(\"SetInt64(%d) = %s, want %s\", tc.x, got, tc.want)\n\t\t}\n\t}\n}\n\nfunc TestSetUint64(t *testing.T) {\n\ttests := []struct {\n\t\tx uint64\n\t\twant string\n\t}{\n\t\t{0, \"0\"},\n\t\t{1, \"1\"},\n\t}\n\n\tfor _, tc := range tests {\n\t\tvar z Int\n\t\tz.SetUint64(tc.x)\n\n\t\tgot := z.ToString()\n\t\tif got != tc.want {\n\t\t\tt.Errorf(\"SetUint64(%d) = %s, want %s\", tc.x, got, tc.want)\n\t\t}\n\t}\n}\n\nfunc TestUint64(t *testing.T) {\n\ttests := []struct {\n\t\tx string\n\t\twant uint64\n\t}{\n\t\t{\"0\", 0},\n\t\t{\"1\", 1},\n\t\t{\"9223372036854775807\", 9223372036854775807},\n\t\t{\"9223372036854775808\", 9223372036854775808},\n\t\t{\"18446744073709551615\", 18446744073709551615},\n\t\t{\"18446744073709551616\", 0},\n\t\t{\"18446744073709551617\", 1},\n\t\t{\"-1\", 1},\n\t\t{\"-18446744073709551615\", 18446744073709551615},\n\t\t{\"-18446744073709551616\", 0},\n\t\t{\"-18446744073709551617\", 1},\n\t}\n\n\tfor _, tc := range tests {\n\t\tz := MustFromDecimal(tc.x)\n\n\t\tgot := z.Uint64()\n\t\tif got != tc.want {\n\t\t\tt.Errorf(\"Uint64(%s) = %d, want %d\", tc.x, got, tc.want)\n\t\t}\n\t}\n}\n\nfunc TestInt64(t *testing.T) {\n\ttests := []struct {\n\t\tx string\n\t\twant int64\n\t}{\n\t\t{\"0\", 0},\n\t\t{\"1\", 1},\n\t\t{\"9223372036854775807\", 9223372036854775807},\n\t\t{\"18446744073709551616\", 0},\n\t\t{\"18446744073709551617\", 1},\n\t\t{\"-1\", -1},\n\t\t{\"-9223372036854775808\", -9223372036854775808},\n\t}\n\n\tfor _, tc := range tests {\n\t\tz := MustFromDecimal(tc.x)\n\n\t\tgot := z.Int64()\n\t\tif got != tc.want {\n\t\t\tt.Errorf(\"Uint64(%s) = %d, want %d\", tc.x, got, tc.want)\n\t\t}\n\t}\n}\n\nfunc TestNeg(t *testing.T) {\n\ttests := []struct {\n\t\tx string\n\t\twant string\n\t}{\n\t\t{\"0\", \"0\"},\n\t\t{\"1\", \"-1\"},\n\t\t{\"-1\", \"1\"},\n\t\t{\"9223372036854775807\", \"-9223372036854775807\"},\n\t\t{\"-18446744073709551615\", \"18446744073709551615\"},\n\t}\n\n\tfor _, tc := range tests {\n\t\tz := MustFromDecimal(tc.x)\n\t\tz.Neg(z)\n\n\t\tgot := z.ToString()\n\t\tif got != tc.want {\n\t\t\tt.Errorf(\"Neg(%s) = %s, want %s\", tc.x, got, tc.want)\n\t\t}\n\t}\n}\n\nfunc TestSet(t *testing.T) {\n\ttests := []struct {\n\t\tx string\n\t\twant string\n\t}{\n\t\t{\"0\", \"0\"},\n\t\t{\"1\", \"1\"},\n\t\t{\"-1\", \"-1\"},\n\t\t{\"9223372036854775807\", \"9223372036854775807\"},\n\t\t{\"-18446744073709551615\", \"-18446744073709551615\"},\n\t}\n\n\tfor _, tc := range tests {\n\t\tz := MustFromDecimal(tc.x)\n\t\tz.Set(z)\n\n\t\tgot := z.ToString()\n\t\tif got != tc.want {\n\t\t\tt.Errorf(\"Set(%s) = %s, want %s\", tc.x, got, tc.want)\n\t\t}\n\t}\n}\n\nfunc TestSetUint256(t *testing.T) {\n\ttests := []struct {\n\t\tx string\n\t\twant string\n\t}{\n\t\t{\"0\", \"0\"},\n\t\t{\"1\", \"1\"},\n\t\t{\"9223372036854775807\", \"9223372036854775807\"},\n\t\t{\"18446744073709551615\", \"18446744073709551615\"},\n\t}\n\n\tfor _, tc := range tests {\n\t\tgot := New()\n\n\t\tz := uint256.MustFromDecimal(tc.x)\n\t\tgot.SetUint256(z)\n\n\t\tif got.ToString() != tc.want {\n\t\t\tt.Errorf(\"SetUint256(%s) = %s, want %s\", tc.x, got.ToString(), tc.want)\n\t\t}\n\t}\n}\n\nfunc TestToString(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tsetup func() *Int\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tname: \"Zero from subtraction\",\n\t\t\tsetup: func() *Int {\n\t\t\t\tminusThree := MustFromDecimal(\"-3\")\n\t\t\t\tthree := MustFromDecimal(\"3\")\n\t\t\t\treturn Zero().Add(minusThree, three)\n\t\t\t},\n\t\t\texpected: \"0\",\n\t\t},\n\t\t{\n\t\t\tname: \"Zero from right shift\",\n\t\t\tsetup: func() *Int {\n\t\t\t\treturn Zero().Rsh(One(), 1234)\n\t\t\t},\n\t\t\texpected: \"0\",\n\t\t},\n\t\t{\n\t\t\tname: \"Positive number\",\n\t\t\tsetup: func() *Int {\n\t\t\t\treturn MustFromDecimal(\"42\")\n\t\t\t},\n\t\t\texpected: \"42\",\n\t\t},\n\t\t{\n\t\t\tname: \"Negative number\",\n\t\t\tsetup: func() *Int {\n\t\t\t\treturn MustFromDecimal(\"-42\")\n\t\t\t},\n\t\t\texpected: \"-42\",\n\t\t},\n\t\t{\n\t\t\tname: \"Large positive number\",\n\t\t\tsetup: func() *Int {\n\t\t\t\treturn MustFromDecimal(\"115792089237316195423570985008687907853269984665640564039457584007913129639935\")\n\t\t\t},\n\t\t\texpected: \"115792089237316195423570985008687907853269984665640564039457584007913129639935\",\n\t\t},\n\t\t{\n\t\t\tname: \"Large negative number\",\n\t\t\tsetup: func() *Int {\n\t\t\t\treturn MustFromDecimal(\"-115792089237316195423570985008687907853269984665640564039457584007913129639935\")\n\t\t\t},\n\t\t\texpected: \"-115792089237316195423570985008687907853269984665640564039457584007913129639935\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tz := tt.setup()\n\t\t\tresult := z.ToString()\n\t\t\tif result != tt.expected {\n\t\t\t\tt.Errorf(\"ToString() = %s, want %s\", result, tt.expected)\n\t\t\t}\n\t\t})\n\t}\n}\n"},{"name":"int256.gno","body":"// This package provides a 256-bit signed integer type, Int, and associated functions.\npackage int256\n\nimport (\n\t\"gno.land/p/demo/uint256\"\n)\n\nvar one = uint256.NewUint(1)\n\ntype Int struct {\n\tabs *uint256.Uint\n\tneg bool\n}\n\n// Zero returns a new Int set to 0.\nfunc Zero() *Int {\n\treturn NewInt(0)\n}\n\n// One returns a new Int set to 1.\nfunc One() *Int {\n\treturn NewInt(1)\n}\n\n// Sign returns:\n//\n//\t-1 if x \u003c 0\n//\t 0 if x == 0\n//\t+1 if x \u003e 0\nfunc (z *Int) Sign() int {\n\tz.initiateAbs()\n\n\tif z.abs.IsZero() {\n\t\treturn 0\n\t}\n\tif z.neg {\n\t\treturn -1\n\t}\n\treturn 1\n}\n\n// New returns a new Int set to 0.\nfunc New() *Int {\n\treturn \u0026Int{\n\t\tabs: new(uint256.Uint),\n\t}\n}\n\n// NewInt allocates and returns a new Int set to x.\nfunc NewInt(x int64) *Int {\n\treturn New().SetInt64(x)\n}\n\n// FromDecimal returns a new Int from a decimal string.\n// Returns a new Int and an error if the string is not a valid decimal.\nfunc FromDecimal(s string) (*Int, error) {\n\treturn new(Int).SetString(s)\n}\n\n// MustFromDecimal returns a new Int from a decimal string.\n// Panics if the string is not a valid decimal.\nfunc MustFromDecimal(s string) *Int {\n\tz, err := FromDecimal(s)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn z\n}\n\n// SetString sets s to the value of z and returns z and a boolean indicating success.\nfunc (z *Int) SetString(s string) (*Int, error) {\n\tneg := false\n\t// Remove max one leading +\n\tif len(s) \u003e 0 \u0026\u0026 s[0] == '+' {\n\t\tneg = false\n\t\ts = s[1:]\n\t}\n\n\tif len(s) \u003e 0 \u0026\u0026 s[0] == '-' {\n\t\tneg = true\n\t\ts = s[1:]\n\t}\n\tvar (\n\t\tabs *uint256.Uint\n\t\terr error\n\t)\n\tabs, err = uint256.FromDecimal(s)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn \u0026Int{\n\t\tabs,\n\t\tneg,\n\t}, nil\n}\n\n// FromUint256 is a convenience-constructor from uint256.Uint.\n// Returns a new Int and whether overflow occurred.\n// OBS: If u is `nil`, this method returns `nil, false`\nfunc FromUint256(x *uint256.Uint) *Int {\n\tif x == nil {\n\t\treturn nil\n\t}\n\tz := Zero()\n\n\tz.SetUint256(x)\n\treturn z\n}\n\n// OBS, differs from original mempooler int256\n// NilToZero sets z to 0 and return it if it's nil, otherwise it returns z\nfunc (z *Int) NilToZero() *Int {\n\tif z == nil {\n\t\treturn NewInt(0)\n\t}\n\treturn z\n}\n\n// initiateAbs sets default value for `z` or `z.abs` value if is nil\n// OBS: differs from mempooler int256. It checks not only `z.abs` but also `z`\nfunc (z *Int) initiateAbs() {\n\tif z == nil || z.abs == nil {\n\t\tz.abs = new(uint256.Uint)\n\t}\n}\n"},{"name":"int256_test.gno","body":"// ported from github.com/mempooler/int256\npackage int256\n\nimport \"testing\"\n\nfunc TestSign(t *testing.T) {\n\ttests := []struct {\n\t\tx string\n\t\twant int\n\t}{\n\t\t{\"0\", 0},\n\t\t{\"1\", 1},\n\t\t{\"-1\", -1},\n\t}\n\n\tfor _, tc := range tests {\n\t\tz := MustFromDecimal(tc.x)\n\t\tgot := z.Sign()\n\t\tif got != tc.want {\n\t\t\tt.Errorf(\"Sign(%s) = %d, want %d\", tc.x, got, tc.want)\n\t\t}\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"eisel_lemire","path":"gno.land/p/demo/json/eisel_lemire","files":[{"name":"eisel_lemire.gno","body":"// Copyright 2020 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\npackage eisel_lemire\n\n// This file implements the Eisel-Lemire ParseFloat algorithm, published in\n// 2020 and discussed extensively at\n// https://nigeltao.github.io/blog/2020/eisel-lemire.html\n//\n// The original C++ implementation is at\n// https://github.com/lemire/fast_double_parser/blob/644bef4306059d3be01a04e77d3cc84b379c596f/include/fast_double_parser.h#L840\n//\n// This Go re-implementation closely follows the C re-implementation at\n// https://github.com/google/wuffs/blob/ba3818cb6b473a2ed0b38ecfc07dbbd3a97e8ae7/internal/cgen/base/floatconv-submodule-code.c#L990\n//\n// Additional testing (on over several million test strings) is done by\n// https://github.com/nigeltao/parse-number-fxx-test-data/blob/5280dcfccf6d0b02a65ae282dad0b6d9de50e039/script/test-go-strconv.go\n\nimport (\n\t\"math\"\n\t\"math/bits\"\n)\n\nconst (\n\tfloat32ExponentBias = 127\n\tfloat64ExponentBias = 1023\n)\n\n// eiselLemire64 parses a floating-point number from its mantissa and exponent representation.\n// This implementation is based on the Eisel-Lemire ParseFloat algorithm, which is efficient\n// and precise for converting strings to floating-point numbers.\n//\n// Arguments:\n// man (uint64): The mantissa part of the floating-point number.\n// exp10 (int): The exponent part, representing the power of 10.\n// neg (bool): Indicates if the number is negative.\n//\n// Returns:\n// f (float64): The parsed floating-point number.\n// ok (bool): Indicates whether the parsing was successful.\n//\n// The function starts by handling special cases, such as zero mantissa.\n// It then checks if the exponent is within the allowed range.\n// After that, it normalizes the mantissa by left-shifting it to fill\n// the leading zeros. This is followed by the main algorithm logic that\n// converts the normalized mantissa and exponent into a 64-bit floating-point number.\n// The function returns this number along with a boolean indicating the success of the operation.\nfunc EiselLemire64(man uint64, exp10 int, neg bool) (f float64, ok bool) {\n\t// The terse comments in this function body refer to sections of the\n\t// https://nigeltao.github.io/blog/2020/eisel-lemire.html blog post.\n\n\t// Exp10 Range.\n\tif man == 0 {\n\t\tif neg {\n\t\t\tf = math.Float64frombits(0x80000000_00000000) // Negative zero.\n\t\t}\n\n\t\treturn f, true\n\t}\n\n\tif exp10 \u003c detailedPowersOfTenMinExp10 || detailedPowersOfTenMaxExp10 \u003c exp10 {\n\t\treturn 0, false\n\t}\n\n\t// Normalization.\n\tclz := bits.LeadingZeros64(man)\n\tman \u003c\u003c= uint(clz)\n\tretExp2 := uint64(217706*exp10\u003e\u003e16+64+float64ExponentBias) - uint64(clz)\n\n\t// Multiplication.\n\txHi, xLo := bits.Mul64(man, detailedPowersOfTen[exp10-detailedPowersOfTenMinExp10][1])\n\n\t// Wider Approximation.\n\tif xHi\u00260x1FF == 0x1FF \u0026\u0026 xLo+man \u003c man {\n\t\tyHi, yLo := bits.Mul64(man, detailedPowersOfTen[exp10-detailedPowersOfTenMinExp10][0])\n\t\tmergedHi, mergedLo := xHi, xLo+yHi\n\t\tif mergedLo \u003c xLo {\n\t\t\tmergedHi++\n\t\t}\n\n\t\tif mergedHi\u00260x1FF == 0x1FF \u0026\u0026 mergedLo+1 == 0 \u0026\u0026 yLo+man \u003c man {\n\t\t\treturn 0, false\n\t\t}\n\n\t\txHi, xLo = mergedHi, mergedLo\n\t}\n\n\t// Shifting to 54 Bits.\n\tmsb := xHi \u003e\u003e 63\n\tretMantissa := xHi \u003e\u003e (msb + 9)\n\tretExp2 -= 1 ^ msb\n\n\t// Half-way Ambiguity.\n\tif xLo == 0 \u0026\u0026 xHi\u00260x1FF == 0 \u0026\u0026 retMantissa\u00263 == 1 {\n\t\treturn 0, false\n\t}\n\n\t// From 54 to 53 Bits.\n\tretMantissa += retMantissa \u0026 1\n\tretMantissa \u003e\u003e= 1\n\tif retMantissa\u003e\u003e53 \u003e 0 {\n\t\tretMantissa \u003e\u003e= 1\n\t\tretExp2 += 1\n\t}\n\n\t// retExp2 is a uint64. Zero or underflow means that we're in subnormal\n\t// float64 space. 0x7FF or above means that we're in Inf/NaN float64 space.\n\t//\n\t// The if block is equivalent to (but has fewer branches than):\n\t// if retExp2 \u003c= 0 || retExp2 \u003e= 0x7FF { etc }\n\tif retExp2-1 \u003e= 0x7FF-1 {\n\t\treturn 0, false\n\t}\n\n\tretBits := retExp2\u003c\u003c52 | retMantissa\u00260x000FFFFF_FFFFFFFF\n\tif neg {\n\t\tretBits |= 0x80000000_00000000\n\t}\n\n\treturn math.Float64frombits(retBits), true\n}\n\n// detailedPowersOfTen{Min,Max}Exp10 is the power of 10 represented by the\n// first and last rows of detailedPowersOfTen. Both bounds are inclusive.\nconst (\n\tdetailedPowersOfTenMinExp10 = -348\n\tdetailedPowersOfTenMaxExp10 = +347\n)\n\n// detailedPowersOfTen contains 128-bit mantissa approximations (rounded down)\n// to the powers of 10. For example:\n//\n// - 1e43 ≈ (0xE596B7B0_C643C719 * (2 ** 79))\n// - 1e43 = (0xE596B7B0_C643C719_6D9CCD05_D0000000 * (2 ** 15))\n//\n// The mantissas are explicitly listed. The exponents are implied by a linear\n// expression with slope 217706.0/65536.0 ≈ log(10)/log(2).\n//\n// The table was generated by\n// https://github.com/google/wuffs/blob/ba3818cb6b473a2ed0b38ecfc07dbbd3a97e8ae7/script/print-mpb-powers-of-10.go\nvar detailedPowersOfTen = [...][2]uint64{\n\t{0x1732C869CD60E453, 0xFA8FD5A0081C0288}, // 1e-348\n\t{0x0E7FBD42205C8EB4, 0x9C99E58405118195}, // 1e-347\n\t{0x521FAC92A873B261, 0xC3C05EE50655E1FA}, // 1e-346\n\t{0xE6A797B752909EF9, 0xF4B0769E47EB5A78}, // 1e-345\n\t{0x9028BED2939A635C, 0x98EE4A22ECF3188B}, // 1e-344\n\t{0x7432EE873880FC33, 0xBF29DCABA82FDEAE}, // 1e-343\n\t{0x113FAA2906A13B3F, 0xEEF453D6923BD65A}, // 1e-342\n\t{0x4AC7CA59A424C507, 0x9558B4661B6565F8}, // 1e-341\n\t{0x5D79BCF00D2DF649, 0xBAAEE17FA23EBF76}, // 1e-340\n\t{0xF4D82C2C107973DC, 0xE95A99DF8ACE6F53}, // 1e-339\n\t{0x79071B9B8A4BE869, 0x91D8A02BB6C10594}, // 1e-338\n\t{0x9748E2826CDEE284, 0xB64EC836A47146F9}, // 1e-337\n\t{0xFD1B1B2308169B25, 0xE3E27A444D8D98B7}, // 1e-336\n\t{0xFE30F0F5E50E20F7, 0x8E6D8C6AB0787F72}, // 1e-335\n\t{0xBDBD2D335E51A935, 0xB208EF855C969F4F}, // 1e-334\n\t{0xAD2C788035E61382, 0xDE8B2B66B3BC4723}, // 1e-333\n\t{0x4C3BCB5021AFCC31, 0x8B16FB203055AC76}, // 1e-332\n\t{0xDF4ABE242A1BBF3D, 0xADDCB9E83C6B1793}, // 1e-331\n\t{0xD71D6DAD34A2AF0D, 0xD953E8624B85DD78}, // 1e-330\n\t{0x8672648C40E5AD68, 0x87D4713D6F33AA6B}, // 1e-329\n\t{0x680EFDAF511F18C2, 0xA9C98D8CCB009506}, // 1e-328\n\t{0x0212BD1B2566DEF2, 0xD43BF0EFFDC0BA48}, // 1e-327\n\t{0x014BB630F7604B57, 0x84A57695FE98746D}, // 1e-326\n\t{0x419EA3BD35385E2D, 0xA5CED43B7E3E9188}, // 1e-325\n\t{0x52064CAC828675B9, 0xCF42894A5DCE35EA}, // 1e-324\n\t{0x7343EFEBD1940993, 0x818995CE7AA0E1B2}, // 1e-323\n\t{0x1014EBE6C5F90BF8, 0xA1EBFB4219491A1F}, // 1e-322\n\t{0xD41A26E077774EF6, 0xCA66FA129F9B60A6}, // 1e-321\n\t{0x8920B098955522B4, 0xFD00B897478238D0}, // 1e-320\n\t{0x55B46E5F5D5535B0, 0x9E20735E8CB16382}, // 1e-319\n\t{0xEB2189F734AA831D, 0xC5A890362FDDBC62}, // 1e-318\n\t{0xA5E9EC7501D523E4, 0xF712B443BBD52B7B}, // 1e-317\n\t{0x47B233C92125366E, 0x9A6BB0AA55653B2D}, // 1e-316\n\t{0x999EC0BB696E840A, 0xC1069CD4EABE89F8}, // 1e-315\n\t{0xC00670EA43CA250D, 0xF148440A256E2C76}, // 1e-314\n\t{0x380406926A5E5728, 0x96CD2A865764DBCA}, // 1e-313\n\t{0xC605083704F5ECF2, 0xBC807527ED3E12BC}, // 1e-312\n\t{0xF7864A44C633682E, 0xEBA09271E88D976B}, // 1e-311\n\t{0x7AB3EE6AFBE0211D, 0x93445B8731587EA3}, // 1e-310\n\t{0x5960EA05BAD82964, 0xB8157268FDAE9E4C}, // 1e-309\n\t{0x6FB92487298E33BD, 0xE61ACF033D1A45DF}, // 1e-308\n\t{0xA5D3B6D479F8E056, 0x8FD0C16206306BAB}, // 1e-307\n\t{0x8F48A4899877186C, 0xB3C4F1BA87BC8696}, // 1e-306\n\t{0x331ACDABFE94DE87, 0xE0B62E2929ABA83C}, // 1e-305\n\t{0x9FF0C08B7F1D0B14, 0x8C71DCD9BA0B4925}, // 1e-304\n\t{0x07ECF0AE5EE44DD9, 0xAF8E5410288E1B6F}, // 1e-303\n\t{0xC9E82CD9F69D6150, 0xDB71E91432B1A24A}, // 1e-302\n\t{0xBE311C083A225CD2, 0x892731AC9FAF056E}, // 1e-301\n\t{0x6DBD630A48AAF406, 0xAB70FE17C79AC6CA}, // 1e-300\n\t{0x092CBBCCDAD5B108, 0xD64D3D9DB981787D}, // 1e-299\n\t{0x25BBF56008C58EA5, 0x85F0468293F0EB4E}, // 1e-298\n\t{0xAF2AF2B80AF6F24E, 0xA76C582338ED2621}, // 1e-297\n\t{0x1AF5AF660DB4AEE1, 0xD1476E2C07286FAA}, // 1e-296\n\t{0x50D98D9FC890ED4D, 0x82CCA4DB847945CA}, // 1e-295\n\t{0xE50FF107BAB528A0, 0xA37FCE126597973C}, // 1e-294\n\t{0x1E53ED49A96272C8, 0xCC5FC196FEFD7D0C}, // 1e-293\n\t{0x25E8E89C13BB0F7A, 0xFF77B1FCBEBCDC4F}, // 1e-292\n\t{0x77B191618C54E9AC, 0x9FAACF3DF73609B1}, // 1e-291\n\t{0xD59DF5B9EF6A2417, 0xC795830D75038C1D}, // 1e-290\n\t{0x4B0573286B44AD1D, 0xF97AE3D0D2446F25}, // 1e-289\n\t{0x4EE367F9430AEC32, 0x9BECCE62836AC577}, // 1e-288\n\t{0x229C41F793CDA73F, 0xC2E801FB244576D5}, // 1e-287\n\t{0x6B43527578C1110F, 0xF3A20279ED56D48A}, // 1e-286\n\t{0x830A13896B78AAA9, 0x9845418C345644D6}, // 1e-285\n\t{0x23CC986BC656D553, 0xBE5691EF416BD60C}, // 1e-284\n\t{0x2CBFBE86B7EC8AA8, 0xEDEC366B11C6CB8F}, // 1e-283\n\t{0x7BF7D71432F3D6A9, 0x94B3A202EB1C3F39}, // 1e-282\n\t{0xDAF5CCD93FB0CC53, 0xB9E08A83A5E34F07}, // 1e-281\n\t{0xD1B3400F8F9CFF68, 0xE858AD248F5C22C9}, // 1e-280\n\t{0x23100809B9C21FA1, 0x91376C36D99995BE}, // 1e-279\n\t{0xABD40A0C2832A78A, 0xB58547448FFFFB2D}, // 1e-278\n\t{0x16C90C8F323F516C, 0xE2E69915B3FFF9F9}, // 1e-277\n\t{0xAE3DA7D97F6792E3, 0x8DD01FAD907FFC3B}, // 1e-276\n\t{0x99CD11CFDF41779C, 0xB1442798F49FFB4A}, // 1e-275\n\t{0x40405643D711D583, 0xDD95317F31C7FA1D}, // 1e-274\n\t{0x482835EA666B2572, 0x8A7D3EEF7F1CFC52}, // 1e-273\n\t{0xDA3243650005EECF, 0xAD1C8EAB5EE43B66}, // 1e-272\n\t{0x90BED43E40076A82, 0xD863B256369D4A40}, // 1e-271\n\t{0x5A7744A6E804A291, 0x873E4F75E2224E68}, // 1e-270\n\t{0x711515D0A205CB36, 0xA90DE3535AAAE202}, // 1e-269\n\t{0x0D5A5B44CA873E03, 0xD3515C2831559A83}, // 1e-268\n\t{0xE858790AFE9486C2, 0x8412D9991ED58091}, // 1e-267\n\t{0x626E974DBE39A872, 0xA5178FFF668AE0B6}, // 1e-266\n\t{0xFB0A3D212DC8128F, 0xCE5D73FF402D98E3}, // 1e-265\n\t{0x7CE66634BC9D0B99, 0x80FA687F881C7F8E}, // 1e-264\n\t{0x1C1FFFC1EBC44E80, 0xA139029F6A239F72}, // 1e-263\n\t{0xA327FFB266B56220, 0xC987434744AC874E}, // 1e-262\n\t{0x4BF1FF9F0062BAA8, 0xFBE9141915D7A922}, // 1e-261\n\t{0x6F773FC3603DB4A9, 0x9D71AC8FADA6C9B5}, // 1e-260\n\t{0xCB550FB4384D21D3, 0xC4CE17B399107C22}, // 1e-259\n\t{0x7E2A53A146606A48, 0xF6019DA07F549B2B}, // 1e-258\n\t{0x2EDA7444CBFC426D, 0x99C102844F94E0FB}, // 1e-257\n\t{0xFA911155FEFB5308, 0xC0314325637A1939}, // 1e-256\n\t{0x793555AB7EBA27CA, 0xF03D93EEBC589F88}, // 1e-255\n\t{0x4BC1558B2F3458DE, 0x96267C7535B763B5}, // 1e-254\n\t{0x9EB1AAEDFB016F16, 0xBBB01B9283253CA2}, // 1e-253\n\t{0x465E15A979C1CADC, 0xEA9C227723EE8BCB}, // 1e-252\n\t{0x0BFACD89EC191EC9, 0x92A1958A7675175F}, // 1e-251\n\t{0xCEF980EC671F667B, 0xB749FAED14125D36}, // 1e-250\n\t{0x82B7E12780E7401A, 0xE51C79A85916F484}, // 1e-249\n\t{0xD1B2ECB8B0908810, 0x8F31CC0937AE58D2}, // 1e-248\n\t{0x861FA7E6DCB4AA15, 0xB2FE3F0B8599EF07}, // 1e-247\n\t{0x67A791E093E1D49A, 0xDFBDCECE67006AC9}, // 1e-246\n\t{0xE0C8BB2C5C6D24E0, 0x8BD6A141006042BD}, // 1e-245\n\t{0x58FAE9F773886E18, 0xAECC49914078536D}, // 1e-244\n\t{0xAF39A475506A899E, 0xDA7F5BF590966848}, // 1e-243\n\t{0x6D8406C952429603, 0x888F99797A5E012D}, // 1e-242\n\t{0xC8E5087BA6D33B83, 0xAAB37FD7D8F58178}, // 1e-241\n\t{0xFB1E4A9A90880A64, 0xD5605FCDCF32E1D6}, // 1e-240\n\t{0x5CF2EEA09A55067F, 0x855C3BE0A17FCD26}, // 1e-239\n\t{0xF42FAA48C0EA481E, 0xA6B34AD8C9DFC06F}, // 1e-238\n\t{0xF13B94DAF124DA26, 0xD0601D8EFC57B08B}, // 1e-237\n\t{0x76C53D08D6B70858, 0x823C12795DB6CE57}, // 1e-236\n\t{0x54768C4B0C64CA6E, 0xA2CB1717B52481ED}, // 1e-235\n\t{0xA9942F5DCF7DFD09, 0xCB7DDCDDA26DA268}, // 1e-234\n\t{0xD3F93B35435D7C4C, 0xFE5D54150B090B02}, // 1e-233\n\t{0xC47BC5014A1A6DAF, 0x9EFA548D26E5A6E1}, // 1e-232\n\t{0x359AB6419CA1091B, 0xC6B8E9B0709F109A}, // 1e-231\n\t{0xC30163D203C94B62, 0xF867241C8CC6D4C0}, // 1e-230\n\t{0x79E0DE63425DCF1D, 0x9B407691D7FC44F8}, // 1e-229\n\t{0x985915FC12F542E4, 0xC21094364DFB5636}, // 1e-228\n\t{0x3E6F5B7B17B2939D, 0xF294B943E17A2BC4}, // 1e-227\n\t{0xA705992CEECF9C42, 0x979CF3CA6CEC5B5A}, // 1e-226\n\t{0x50C6FF782A838353, 0xBD8430BD08277231}, // 1e-225\n\t{0xA4F8BF5635246428, 0xECE53CEC4A314EBD}, // 1e-224\n\t{0x871B7795E136BE99, 0x940F4613AE5ED136}, // 1e-223\n\t{0x28E2557B59846E3F, 0xB913179899F68584}, // 1e-222\n\t{0x331AEADA2FE589CF, 0xE757DD7EC07426E5}, // 1e-221\n\t{0x3FF0D2C85DEF7621, 0x9096EA6F3848984F}, // 1e-220\n\t{0x0FED077A756B53A9, 0xB4BCA50B065ABE63}, // 1e-219\n\t{0xD3E8495912C62894, 0xE1EBCE4DC7F16DFB}, // 1e-218\n\t{0x64712DD7ABBBD95C, 0x8D3360F09CF6E4BD}, // 1e-217\n\t{0xBD8D794D96AACFB3, 0xB080392CC4349DEC}, // 1e-216\n\t{0xECF0D7A0FC5583A0, 0xDCA04777F541C567}, // 1e-215\n\t{0xF41686C49DB57244, 0x89E42CAAF9491B60}, // 1e-214\n\t{0x311C2875C522CED5, 0xAC5D37D5B79B6239}, // 1e-213\n\t{0x7D633293366B828B, 0xD77485CB25823AC7}, // 1e-212\n\t{0xAE5DFF9C02033197, 0x86A8D39EF77164BC}, // 1e-211\n\t{0xD9F57F830283FDFC, 0xA8530886B54DBDEB}, // 1e-210\n\t{0xD072DF63C324FD7B, 0xD267CAA862A12D66}, // 1e-209\n\t{0x4247CB9E59F71E6D, 0x8380DEA93DA4BC60}, // 1e-208\n\t{0x52D9BE85F074E608, 0xA46116538D0DEB78}, // 1e-207\n\t{0x67902E276C921F8B, 0xCD795BE870516656}, // 1e-206\n\t{0x00BA1CD8A3DB53B6, 0x806BD9714632DFF6}, // 1e-205\n\t{0x80E8A40ECCD228A4, 0xA086CFCD97BF97F3}, // 1e-204\n\t{0x6122CD128006B2CD, 0xC8A883C0FDAF7DF0}, // 1e-203\n\t{0x796B805720085F81, 0xFAD2A4B13D1B5D6C}, // 1e-202\n\t{0xCBE3303674053BB0, 0x9CC3A6EEC6311A63}, // 1e-201\n\t{0xBEDBFC4411068A9C, 0xC3F490AA77BD60FC}, // 1e-200\n\t{0xEE92FB5515482D44, 0xF4F1B4D515ACB93B}, // 1e-199\n\t{0x751BDD152D4D1C4A, 0x991711052D8BF3C5}, // 1e-198\n\t{0xD262D45A78A0635D, 0xBF5CD54678EEF0B6}, // 1e-197\n\t{0x86FB897116C87C34, 0xEF340A98172AACE4}, // 1e-196\n\t{0xD45D35E6AE3D4DA0, 0x9580869F0E7AAC0E}, // 1e-195\n\t{0x8974836059CCA109, 0xBAE0A846D2195712}, // 1e-194\n\t{0x2BD1A438703FC94B, 0xE998D258869FACD7}, // 1e-193\n\t{0x7B6306A34627DDCF, 0x91FF83775423CC06}, // 1e-192\n\t{0x1A3BC84C17B1D542, 0xB67F6455292CBF08}, // 1e-191\n\t{0x20CABA5F1D9E4A93, 0xE41F3D6A7377EECA}, // 1e-190\n\t{0x547EB47B7282EE9C, 0x8E938662882AF53E}, // 1e-189\n\t{0xE99E619A4F23AA43, 0xB23867FB2A35B28D}, // 1e-188\n\t{0x6405FA00E2EC94D4, 0xDEC681F9F4C31F31}, // 1e-187\n\t{0xDE83BC408DD3DD04, 0x8B3C113C38F9F37E}, // 1e-186\n\t{0x9624AB50B148D445, 0xAE0B158B4738705E}, // 1e-185\n\t{0x3BADD624DD9B0957, 0xD98DDAEE19068C76}, // 1e-184\n\t{0xE54CA5D70A80E5D6, 0x87F8A8D4CFA417C9}, // 1e-183\n\t{0x5E9FCF4CCD211F4C, 0xA9F6D30A038D1DBC}, // 1e-182\n\t{0x7647C3200069671F, 0xD47487CC8470652B}, // 1e-181\n\t{0x29ECD9F40041E073, 0x84C8D4DFD2C63F3B}, // 1e-180\n\t{0xF468107100525890, 0xA5FB0A17C777CF09}, // 1e-179\n\t{0x7182148D4066EEB4, 0xCF79CC9DB955C2CC}, // 1e-178\n\t{0xC6F14CD848405530, 0x81AC1FE293D599BF}, // 1e-177\n\t{0xB8ADA00E5A506A7C, 0xA21727DB38CB002F}, // 1e-176\n\t{0xA6D90811F0E4851C, 0xCA9CF1D206FDC03B}, // 1e-175\n\t{0x908F4A166D1DA663, 0xFD442E4688BD304A}, // 1e-174\n\t{0x9A598E4E043287FE, 0x9E4A9CEC15763E2E}, // 1e-173\n\t{0x40EFF1E1853F29FD, 0xC5DD44271AD3CDBA}, // 1e-172\n\t{0xD12BEE59E68EF47C, 0xF7549530E188C128}, // 1e-171\n\t{0x82BB74F8301958CE, 0x9A94DD3E8CF578B9}, // 1e-170\n\t{0xE36A52363C1FAF01, 0xC13A148E3032D6E7}, // 1e-169\n\t{0xDC44E6C3CB279AC1, 0xF18899B1BC3F8CA1}, // 1e-168\n\t{0x29AB103A5EF8C0B9, 0x96F5600F15A7B7E5}, // 1e-167\n\t{0x7415D448F6B6F0E7, 0xBCB2B812DB11A5DE}, // 1e-166\n\t{0x111B495B3464AD21, 0xEBDF661791D60F56}, // 1e-165\n\t{0xCAB10DD900BEEC34, 0x936B9FCEBB25C995}, // 1e-164\n\t{0x3D5D514F40EEA742, 0xB84687C269EF3BFB}, // 1e-163\n\t{0x0CB4A5A3112A5112, 0xE65829B3046B0AFA}, // 1e-162\n\t{0x47F0E785EABA72AB, 0x8FF71A0FE2C2E6DC}, // 1e-161\n\t{0x59ED216765690F56, 0xB3F4E093DB73A093}, // 1e-160\n\t{0x306869C13EC3532C, 0xE0F218B8D25088B8}, // 1e-159\n\t{0x1E414218C73A13FB, 0x8C974F7383725573}, // 1e-158\n\t{0xE5D1929EF90898FA, 0xAFBD2350644EEACF}, // 1e-157\n\t{0xDF45F746B74ABF39, 0xDBAC6C247D62A583}, // 1e-156\n\t{0x6B8BBA8C328EB783, 0x894BC396CE5DA772}, // 1e-155\n\t{0x066EA92F3F326564, 0xAB9EB47C81F5114F}, // 1e-154\n\t{0xC80A537B0EFEFEBD, 0xD686619BA27255A2}, // 1e-153\n\t{0xBD06742CE95F5F36, 0x8613FD0145877585}, // 1e-152\n\t{0x2C48113823B73704, 0xA798FC4196E952E7}, // 1e-151\n\t{0xF75A15862CA504C5, 0xD17F3B51FCA3A7A0}, // 1e-150\n\t{0x9A984D73DBE722FB, 0x82EF85133DE648C4}, // 1e-149\n\t{0xC13E60D0D2E0EBBA, 0xA3AB66580D5FDAF5}, // 1e-148\n\t{0x318DF905079926A8, 0xCC963FEE10B7D1B3}, // 1e-147\n\t{0xFDF17746497F7052, 0xFFBBCFE994E5C61F}, // 1e-146\n\t{0xFEB6EA8BEDEFA633, 0x9FD561F1FD0F9BD3}, // 1e-145\n\t{0xFE64A52EE96B8FC0, 0xC7CABA6E7C5382C8}, // 1e-144\n\t{0x3DFDCE7AA3C673B0, 0xF9BD690A1B68637B}, // 1e-143\n\t{0x06BEA10CA65C084E, 0x9C1661A651213E2D}, // 1e-142\n\t{0x486E494FCFF30A62, 0xC31BFA0FE5698DB8}, // 1e-141\n\t{0x5A89DBA3C3EFCCFA, 0xF3E2F893DEC3F126}, // 1e-140\n\t{0xF89629465A75E01C, 0x986DDB5C6B3A76B7}, // 1e-139\n\t{0xF6BBB397F1135823, 0xBE89523386091465}, // 1e-138\n\t{0x746AA07DED582E2C, 0xEE2BA6C0678B597F}, // 1e-137\n\t{0xA8C2A44EB4571CDC, 0x94DB483840B717EF}, // 1e-136\n\t{0x92F34D62616CE413, 0xBA121A4650E4DDEB}, // 1e-135\n\t{0x77B020BAF9C81D17, 0xE896A0D7E51E1566}, // 1e-134\n\t{0x0ACE1474DC1D122E, 0x915E2486EF32CD60}, // 1e-133\n\t{0x0D819992132456BA, 0xB5B5ADA8AAFF80B8}, // 1e-132\n\t{0x10E1FFF697ED6C69, 0xE3231912D5BF60E6}, // 1e-131\n\t{0xCA8D3FFA1EF463C1, 0x8DF5EFABC5979C8F}, // 1e-130\n\t{0xBD308FF8A6B17CB2, 0xB1736B96B6FD83B3}, // 1e-129\n\t{0xAC7CB3F6D05DDBDE, 0xDDD0467C64BCE4A0}, // 1e-128\n\t{0x6BCDF07A423AA96B, 0x8AA22C0DBEF60EE4}, // 1e-127\n\t{0x86C16C98D2C953C6, 0xAD4AB7112EB3929D}, // 1e-126\n\t{0xE871C7BF077BA8B7, 0xD89D64D57A607744}, // 1e-125\n\t{0x11471CD764AD4972, 0x87625F056C7C4A8B}, // 1e-124\n\t{0xD598E40D3DD89BCF, 0xA93AF6C6C79B5D2D}, // 1e-123\n\t{0x4AFF1D108D4EC2C3, 0xD389B47879823479}, // 1e-122\n\t{0xCEDF722A585139BA, 0x843610CB4BF160CB}, // 1e-121\n\t{0xC2974EB4EE658828, 0xA54394FE1EEDB8FE}, // 1e-120\n\t{0x733D226229FEEA32, 0xCE947A3DA6A9273E}, // 1e-119\n\t{0x0806357D5A3F525F, 0x811CCC668829B887}, // 1e-118\n\t{0xCA07C2DCB0CF26F7, 0xA163FF802A3426A8}, // 1e-117\n\t{0xFC89B393DD02F0B5, 0xC9BCFF6034C13052}, // 1e-116\n\t{0xBBAC2078D443ACE2, 0xFC2C3F3841F17C67}, // 1e-115\n\t{0xD54B944B84AA4C0D, 0x9D9BA7832936EDC0}, // 1e-114\n\t{0x0A9E795E65D4DF11, 0xC5029163F384A931}, // 1e-113\n\t{0x4D4617B5FF4A16D5, 0xF64335BCF065D37D}, // 1e-112\n\t{0x504BCED1BF8E4E45, 0x99EA0196163FA42E}, // 1e-111\n\t{0xE45EC2862F71E1D6, 0xC06481FB9BCF8D39}, // 1e-110\n\t{0x5D767327BB4E5A4C, 0xF07DA27A82C37088}, // 1e-109\n\t{0x3A6A07F8D510F86F, 0x964E858C91BA2655}, // 1e-108\n\t{0x890489F70A55368B, 0xBBE226EFB628AFEA}, // 1e-107\n\t{0x2B45AC74CCEA842E, 0xEADAB0ABA3B2DBE5}, // 1e-106\n\t{0x3B0B8BC90012929D, 0x92C8AE6B464FC96F}, // 1e-105\n\t{0x09CE6EBB40173744, 0xB77ADA0617E3BBCB}, // 1e-104\n\t{0xCC420A6A101D0515, 0xE55990879DDCAABD}, // 1e-103\n\t{0x9FA946824A12232D, 0x8F57FA54C2A9EAB6}, // 1e-102\n\t{0x47939822DC96ABF9, 0xB32DF8E9F3546564}, // 1e-101\n\t{0x59787E2B93BC56F7, 0xDFF9772470297EBD}, // 1e-100\n\t{0x57EB4EDB3C55B65A, 0x8BFBEA76C619EF36}, // 1e-99\n\t{0xEDE622920B6B23F1, 0xAEFAE51477A06B03}, // 1e-98\n\t{0xE95FAB368E45ECED, 0xDAB99E59958885C4}, // 1e-97\n\t{0x11DBCB0218EBB414, 0x88B402F7FD75539B}, // 1e-96\n\t{0xD652BDC29F26A119, 0xAAE103B5FCD2A881}, // 1e-95\n\t{0x4BE76D3346F0495F, 0xD59944A37C0752A2}, // 1e-94\n\t{0x6F70A4400C562DDB, 0x857FCAE62D8493A5}, // 1e-93\n\t{0xCB4CCD500F6BB952, 0xA6DFBD9FB8E5B88E}, // 1e-92\n\t{0x7E2000A41346A7A7, 0xD097AD07A71F26B2}, // 1e-91\n\t{0x8ED400668C0C28C8, 0x825ECC24C873782F}, // 1e-90\n\t{0x728900802F0F32FA, 0xA2F67F2DFA90563B}, // 1e-89\n\t{0x4F2B40A03AD2FFB9, 0xCBB41EF979346BCA}, // 1e-88\n\t{0xE2F610C84987BFA8, 0xFEA126B7D78186BC}, // 1e-87\n\t{0x0DD9CA7D2DF4D7C9, 0x9F24B832E6B0F436}, // 1e-86\n\t{0x91503D1C79720DBB, 0xC6EDE63FA05D3143}, // 1e-85\n\t{0x75A44C6397CE912A, 0xF8A95FCF88747D94}, // 1e-84\n\t{0xC986AFBE3EE11ABA, 0x9B69DBE1B548CE7C}, // 1e-83\n\t{0xFBE85BADCE996168, 0xC24452DA229B021B}, // 1e-82\n\t{0xFAE27299423FB9C3, 0xF2D56790AB41C2A2}, // 1e-81\n\t{0xDCCD879FC967D41A, 0x97C560BA6B0919A5}, // 1e-80\n\t{0x5400E987BBC1C920, 0xBDB6B8E905CB600F}, // 1e-79\n\t{0x290123E9AAB23B68, 0xED246723473E3813}, // 1e-78\n\t{0xF9A0B6720AAF6521, 0x9436C0760C86E30B}, // 1e-77\n\t{0xF808E40E8D5B3E69, 0xB94470938FA89BCE}, // 1e-76\n\t{0xB60B1D1230B20E04, 0xE7958CB87392C2C2}, // 1e-75\n\t{0xB1C6F22B5E6F48C2, 0x90BD77F3483BB9B9}, // 1e-74\n\t{0x1E38AEB6360B1AF3, 0xB4ECD5F01A4AA828}, // 1e-73\n\t{0x25C6DA63C38DE1B0, 0xE2280B6C20DD5232}, // 1e-72\n\t{0x579C487E5A38AD0E, 0x8D590723948A535F}, // 1e-71\n\t{0x2D835A9DF0C6D851, 0xB0AF48EC79ACE837}, // 1e-70\n\t{0xF8E431456CF88E65, 0xDCDB1B2798182244}, // 1e-69\n\t{0x1B8E9ECB641B58FF, 0x8A08F0F8BF0F156B}, // 1e-68\n\t{0xE272467E3D222F3F, 0xAC8B2D36EED2DAC5}, // 1e-67\n\t{0x5B0ED81DCC6ABB0F, 0xD7ADF884AA879177}, // 1e-66\n\t{0x98E947129FC2B4E9, 0x86CCBB52EA94BAEA}, // 1e-65\n\t{0x3F2398D747B36224, 0xA87FEA27A539E9A5}, // 1e-64\n\t{0x8EEC7F0D19A03AAD, 0xD29FE4B18E88640E}, // 1e-63\n\t{0x1953CF68300424AC, 0x83A3EEEEF9153E89}, // 1e-62\n\t{0x5FA8C3423C052DD7, 0xA48CEAAAB75A8E2B}, // 1e-61\n\t{0x3792F412CB06794D, 0xCDB02555653131B6}, // 1e-60\n\t{0xE2BBD88BBEE40BD0, 0x808E17555F3EBF11}, // 1e-59\n\t{0x5B6ACEAEAE9D0EC4, 0xA0B19D2AB70E6ED6}, // 1e-58\n\t{0xF245825A5A445275, 0xC8DE047564D20A8B}, // 1e-57\n\t{0xEED6E2F0F0D56712, 0xFB158592BE068D2E}, // 1e-56\n\t{0x55464DD69685606B, 0x9CED737BB6C4183D}, // 1e-55\n\t{0xAA97E14C3C26B886, 0xC428D05AA4751E4C}, // 1e-54\n\t{0xD53DD99F4B3066A8, 0xF53304714D9265DF}, // 1e-53\n\t{0xE546A8038EFE4029, 0x993FE2C6D07B7FAB}, // 1e-52\n\t{0xDE98520472BDD033, 0xBF8FDB78849A5F96}, // 1e-51\n\t{0x963E66858F6D4440, 0xEF73D256A5C0F77C}, // 1e-50\n\t{0xDDE7001379A44AA8, 0x95A8637627989AAD}, // 1e-49\n\t{0x5560C018580D5D52, 0xBB127C53B17EC159}, // 1e-48\n\t{0xAAB8F01E6E10B4A6, 0xE9D71B689DDE71AF}, // 1e-47\n\t{0xCAB3961304CA70E8, 0x9226712162AB070D}, // 1e-46\n\t{0x3D607B97C5FD0D22, 0xB6B00D69BB55C8D1}, // 1e-45\n\t{0x8CB89A7DB77C506A, 0xE45C10C42A2B3B05}, // 1e-44\n\t{0x77F3608E92ADB242, 0x8EB98A7A9A5B04E3}, // 1e-43\n\t{0x55F038B237591ED3, 0xB267ED1940F1C61C}, // 1e-42\n\t{0x6B6C46DEC52F6688, 0xDF01E85F912E37A3}, // 1e-41\n\t{0x2323AC4B3B3DA015, 0x8B61313BBABCE2C6}, // 1e-40\n\t{0xABEC975E0A0D081A, 0xAE397D8AA96C1B77}, // 1e-39\n\t{0x96E7BD358C904A21, 0xD9C7DCED53C72255}, // 1e-38\n\t{0x7E50D64177DA2E54, 0x881CEA14545C7575}, // 1e-37\n\t{0xDDE50BD1D5D0B9E9, 0xAA242499697392D2}, // 1e-36\n\t{0x955E4EC64B44E864, 0xD4AD2DBFC3D07787}, // 1e-35\n\t{0xBD5AF13BEF0B113E, 0x84EC3C97DA624AB4}, // 1e-34\n\t{0xECB1AD8AEACDD58E, 0xA6274BBDD0FADD61}, // 1e-33\n\t{0x67DE18EDA5814AF2, 0xCFB11EAD453994BA}, // 1e-32\n\t{0x80EACF948770CED7, 0x81CEB32C4B43FCF4}, // 1e-31\n\t{0xA1258379A94D028D, 0xA2425FF75E14FC31}, // 1e-30\n\t{0x096EE45813A04330, 0xCAD2F7F5359A3B3E}, // 1e-29\n\t{0x8BCA9D6E188853FC, 0xFD87B5F28300CA0D}, // 1e-28\n\t{0x775EA264CF55347D, 0x9E74D1B791E07E48}, // 1e-27\n\t{0x95364AFE032A819D, 0xC612062576589DDA}, // 1e-26\n\t{0x3A83DDBD83F52204, 0xF79687AED3EEC551}, // 1e-25\n\t{0xC4926A9672793542, 0x9ABE14CD44753B52}, // 1e-24\n\t{0x75B7053C0F178293, 0xC16D9A0095928A27}, // 1e-23\n\t{0x5324C68B12DD6338, 0xF1C90080BAF72CB1}, // 1e-22\n\t{0xD3F6FC16EBCA5E03, 0x971DA05074DA7BEE}, // 1e-21\n\t{0x88F4BB1CA6BCF584, 0xBCE5086492111AEA}, // 1e-20\n\t{0x2B31E9E3D06C32E5, 0xEC1E4A7DB69561A5}, // 1e-19\n\t{0x3AFF322E62439FCF, 0x9392EE8E921D5D07}, // 1e-18\n\t{0x09BEFEB9FAD487C2, 0xB877AA3236A4B449}, // 1e-17\n\t{0x4C2EBE687989A9B3, 0xE69594BEC44DE15B}, // 1e-16\n\t{0x0F9D37014BF60A10, 0x901D7CF73AB0ACD9}, // 1e-15\n\t{0x538484C19EF38C94, 0xB424DC35095CD80F}, // 1e-14\n\t{0x2865A5F206B06FB9, 0xE12E13424BB40E13}, // 1e-13\n\t{0xF93F87B7442E45D3, 0x8CBCCC096F5088CB}, // 1e-12\n\t{0xF78F69A51539D748, 0xAFEBFF0BCB24AAFE}, // 1e-11\n\t{0xB573440E5A884D1B, 0xDBE6FECEBDEDD5BE}, // 1e-10\n\t{0x31680A88F8953030, 0x89705F4136B4A597}, // 1e-9\n\t{0xFDC20D2B36BA7C3D, 0xABCC77118461CEFC}, // 1e-8\n\t{0x3D32907604691B4C, 0xD6BF94D5E57A42BC}, // 1e-7\n\t{0xA63F9A49C2C1B10F, 0x8637BD05AF6C69B5}, // 1e-6\n\t{0x0FCF80DC33721D53, 0xA7C5AC471B478423}, // 1e-5\n\t{0xD3C36113404EA4A8, 0xD1B71758E219652B}, // 1e-4\n\t{0x645A1CAC083126E9, 0x83126E978D4FDF3B}, // 1e-3\n\t{0x3D70A3D70A3D70A3, 0xA3D70A3D70A3D70A}, // 1e-2\n\t{0xCCCCCCCCCCCCCCCC, 0xCCCCCCCCCCCCCCCC}, // 1e-1\n\t{0x0000000000000000, 0x8000000000000000}, // 1e0\n\t{0x0000000000000000, 0xA000000000000000}, // 1e1\n\t{0x0000000000000000, 0xC800000000000000}, // 1e2\n\t{0x0000000000000000, 0xFA00000000000000}, // 1e3\n\t{0x0000000000000000, 0x9C40000000000000}, // 1e4\n\t{0x0000000000000000, 0xC350000000000000}, // 1e5\n\t{0x0000000000000000, 0xF424000000000000}, // 1e6\n\t{0x0000000000000000, 0x9896800000000000}, // 1e7\n\t{0x0000000000000000, 0xBEBC200000000000}, // 1e8\n\t{0x0000000000000000, 0xEE6B280000000000}, // 1e9\n\t{0x0000000000000000, 0x9502F90000000000}, // 1e10\n\t{0x0000000000000000, 0xBA43B74000000000}, // 1e11\n\t{0x0000000000000000, 0xE8D4A51000000000}, // 1e12\n\t{0x0000000000000000, 0x9184E72A00000000}, // 1e13\n\t{0x0000000000000000, 0xB5E620F480000000}, // 1e14\n\t{0x0000000000000000, 0xE35FA931A0000000}, // 1e15\n\t{0x0000000000000000, 0x8E1BC9BF04000000}, // 1e16\n\t{0x0000000000000000, 0xB1A2BC2EC5000000}, // 1e17\n\t{0x0000000000000000, 0xDE0B6B3A76400000}, // 1e18\n\t{0x0000000000000000, 0x8AC7230489E80000}, // 1e19\n\t{0x0000000000000000, 0xAD78EBC5AC620000}, // 1e20\n\t{0x0000000000000000, 0xD8D726B7177A8000}, // 1e21\n\t{0x0000000000000000, 0x878678326EAC9000}, // 1e22\n\t{0x0000000000000000, 0xA968163F0A57B400}, // 1e23\n\t{0x0000000000000000, 0xD3C21BCECCEDA100}, // 1e24\n\t{0x0000000000000000, 0x84595161401484A0}, // 1e25\n\t{0x0000000000000000, 0xA56FA5B99019A5C8}, // 1e26\n\t{0x0000000000000000, 0xCECB8F27F4200F3A}, // 1e27\n\t{0x4000000000000000, 0x813F3978F8940984}, // 1e28\n\t{0x5000000000000000, 0xA18F07D736B90BE5}, // 1e29\n\t{0xA400000000000000, 0xC9F2C9CD04674EDE}, // 1e30\n\t{0x4D00000000000000, 0xFC6F7C4045812296}, // 1e31\n\t{0xF020000000000000, 0x9DC5ADA82B70B59D}, // 1e32\n\t{0x6C28000000000000, 0xC5371912364CE305}, // 1e33\n\t{0xC732000000000000, 0xF684DF56C3E01BC6}, // 1e34\n\t{0x3C7F400000000000, 0x9A130B963A6C115C}, // 1e35\n\t{0x4B9F100000000000, 0xC097CE7BC90715B3}, // 1e36\n\t{0x1E86D40000000000, 0xF0BDC21ABB48DB20}, // 1e37\n\t{0x1314448000000000, 0x96769950B50D88F4}, // 1e38\n\t{0x17D955A000000000, 0xBC143FA4E250EB31}, // 1e39\n\t{0x5DCFAB0800000000, 0xEB194F8E1AE525FD}, // 1e40\n\t{0x5AA1CAE500000000, 0x92EFD1B8D0CF37BE}, // 1e41\n\t{0xF14A3D9E40000000, 0xB7ABC627050305AD}, // 1e42\n\t{0x6D9CCD05D0000000, 0xE596B7B0C643C719}, // 1e43\n\t{0xE4820023A2000000, 0x8F7E32CE7BEA5C6F}, // 1e44\n\t{0xDDA2802C8A800000, 0xB35DBF821AE4F38B}, // 1e45\n\t{0xD50B2037AD200000, 0xE0352F62A19E306E}, // 1e46\n\t{0x4526F422CC340000, 0x8C213D9DA502DE45}, // 1e47\n\t{0x9670B12B7F410000, 0xAF298D050E4395D6}, // 1e48\n\t{0x3C0CDD765F114000, 0xDAF3F04651D47B4C}, // 1e49\n\t{0xA5880A69FB6AC800, 0x88D8762BF324CD0F}, // 1e50\n\t{0x8EEA0D047A457A00, 0xAB0E93B6EFEE0053}, // 1e51\n\t{0x72A4904598D6D880, 0xD5D238A4ABE98068}, // 1e52\n\t{0x47A6DA2B7F864750, 0x85A36366EB71F041}, // 1e53\n\t{0x999090B65F67D924, 0xA70C3C40A64E6C51}, // 1e54\n\t{0xFFF4B4E3F741CF6D, 0xD0CF4B50CFE20765}, // 1e55\n\t{0xBFF8F10E7A8921A4, 0x82818F1281ED449F}, // 1e56\n\t{0xAFF72D52192B6A0D, 0xA321F2D7226895C7}, // 1e57\n\t{0x9BF4F8A69F764490, 0xCBEA6F8CEB02BB39}, // 1e58\n\t{0x02F236D04753D5B4, 0xFEE50B7025C36A08}, // 1e59\n\t{0x01D762422C946590, 0x9F4F2726179A2245}, // 1e60\n\t{0x424D3AD2B7B97EF5, 0xC722F0EF9D80AAD6}, // 1e61\n\t{0xD2E0898765A7DEB2, 0xF8EBAD2B84E0D58B}, // 1e62\n\t{0x63CC55F49F88EB2F, 0x9B934C3B330C8577}, // 1e63\n\t{0x3CBF6B71C76B25FB, 0xC2781F49FFCFA6D5}, // 1e64\n\t{0x8BEF464E3945EF7A, 0xF316271C7FC3908A}, // 1e65\n\t{0x97758BF0E3CBB5AC, 0x97EDD871CFDA3A56}, // 1e66\n\t{0x3D52EEED1CBEA317, 0xBDE94E8E43D0C8EC}, // 1e67\n\t{0x4CA7AAA863EE4BDD, 0xED63A231D4C4FB27}, // 1e68\n\t{0x8FE8CAA93E74EF6A, 0x945E455F24FB1CF8}, // 1e69\n\t{0xB3E2FD538E122B44, 0xB975D6B6EE39E436}, // 1e70\n\t{0x60DBBCA87196B616, 0xE7D34C64A9C85D44}, // 1e71\n\t{0xBC8955E946FE31CD, 0x90E40FBEEA1D3A4A}, // 1e72\n\t{0x6BABAB6398BDBE41, 0xB51D13AEA4A488DD}, // 1e73\n\t{0xC696963C7EED2DD1, 0xE264589A4DCDAB14}, // 1e74\n\t{0xFC1E1DE5CF543CA2, 0x8D7EB76070A08AEC}, // 1e75\n\t{0x3B25A55F43294BCB, 0xB0DE65388CC8ADA8}, // 1e76\n\t{0x49EF0EB713F39EBE, 0xDD15FE86AFFAD912}, // 1e77\n\t{0x6E3569326C784337, 0x8A2DBF142DFCC7AB}, // 1e78\n\t{0x49C2C37F07965404, 0xACB92ED9397BF996}, // 1e79\n\t{0xDC33745EC97BE906, 0xD7E77A8F87DAF7FB}, // 1e80\n\t{0x69A028BB3DED71A3, 0x86F0AC99B4E8DAFD}, // 1e81\n\t{0xC40832EA0D68CE0C, 0xA8ACD7C0222311BC}, // 1e82\n\t{0xF50A3FA490C30190, 0xD2D80DB02AABD62B}, // 1e83\n\t{0x792667C6DA79E0FA, 0x83C7088E1AAB65DB}, // 1e84\n\t{0x577001B891185938, 0xA4B8CAB1A1563F52}, // 1e85\n\t{0xED4C0226B55E6F86, 0xCDE6FD5E09ABCF26}, // 1e86\n\t{0x544F8158315B05B4, 0x80B05E5AC60B6178}, // 1e87\n\t{0x696361AE3DB1C721, 0xA0DC75F1778E39D6}, // 1e88\n\t{0x03BC3A19CD1E38E9, 0xC913936DD571C84C}, // 1e89\n\t{0x04AB48A04065C723, 0xFB5878494ACE3A5F}, // 1e90\n\t{0x62EB0D64283F9C76, 0x9D174B2DCEC0E47B}, // 1e91\n\t{0x3BA5D0BD324F8394, 0xC45D1DF942711D9A}, // 1e92\n\t{0xCA8F44EC7EE36479, 0xF5746577930D6500}, // 1e93\n\t{0x7E998B13CF4E1ECB, 0x9968BF6ABBE85F20}, // 1e94\n\t{0x9E3FEDD8C321A67E, 0xBFC2EF456AE276E8}, // 1e95\n\t{0xC5CFE94EF3EA101E, 0xEFB3AB16C59B14A2}, // 1e96\n\t{0xBBA1F1D158724A12, 0x95D04AEE3B80ECE5}, // 1e97\n\t{0x2A8A6E45AE8EDC97, 0xBB445DA9CA61281F}, // 1e98\n\t{0xF52D09D71A3293BD, 0xEA1575143CF97226}, // 1e99\n\t{0x593C2626705F9C56, 0x924D692CA61BE758}, // 1e100\n\t{0x6F8B2FB00C77836C, 0xB6E0C377CFA2E12E}, // 1e101\n\t{0x0B6DFB9C0F956447, 0xE498F455C38B997A}, // 1e102\n\t{0x4724BD4189BD5EAC, 0x8EDF98B59A373FEC}, // 1e103\n\t{0x58EDEC91EC2CB657, 0xB2977EE300C50FE7}, // 1e104\n\t{0x2F2967B66737E3ED, 0xDF3D5E9BC0F653E1}, // 1e105\n\t{0xBD79E0D20082EE74, 0x8B865B215899F46C}, // 1e106\n\t{0xECD8590680A3AA11, 0xAE67F1E9AEC07187}, // 1e107\n\t{0xE80E6F4820CC9495, 0xDA01EE641A708DE9}, // 1e108\n\t{0x3109058D147FDCDD, 0x884134FE908658B2}, // 1e109\n\t{0xBD4B46F0599FD415, 0xAA51823E34A7EEDE}, // 1e110\n\t{0x6C9E18AC7007C91A, 0xD4E5E2CDC1D1EA96}, // 1e111\n\t{0x03E2CF6BC604DDB0, 0x850FADC09923329E}, // 1e112\n\t{0x84DB8346B786151C, 0xA6539930BF6BFF45}, // 1e113\n\t{0xE612641865679A63, 0xCFE87F7CEF46FF16}, // 1e114\n\t{0x4FCB7E8F3F60C07E, 0x81F14FAE158C5F6E}, // 1e115\n\t{0xE3BE5E330F38F09D, 0xA26DA3999AEF7749}, // 1e116\n\t{0x5CADF5BFD3072CC5, 0xCB090C8001AB551C}, // 1e117\n\t{0x73D9732FC7C8F7F6, 0xFDCB4FA002162A63}, // 1e118\n\t{0x2867E7FDDCDD9AFA, 0x9E9F11C4014DDA7E}, // 1e119\n\t{0xB281E1FD541501B8, 0xC646D63501A1511D}, // 1e120\n\t{0x1F225A7CA91A4226, 0xF7D88BC24209A565}, // 1e121\n\t{0x3375788DE9B06958, 0x9AE757596946075F}, // 1e122\n\t{0x0052D6B1641C83AE, 0xC1A12D2FC3978937}, // 1e123\n\t{0xC0678C5DBD23A49A, 0xF209787BB47D6B84}, // 1e124\n\t{0xF840B7BA963646E0, 0x9745EB4D50CE6332}, // 1e125\n\t{0xB650E5A93BC3D898, 0xBD176620A501FBFF}, // 1e126\n\t{0xA3E51F138AB4CEBE, 0xEC5D3FA8CE427AFF}, // 1e127\n\t{0xC66F336C36B10137, 0x93BA47C980E98CDF}, // 1e128\n\t{0xB80B0047445D4184, 0xB8A8D9BBE123F017}, // 1e129\n\t{0xA60DC059157491E5, 0xE6D3102AD96CEC1D}, // 1e130\n\t{0x87C89837AD68DB2F, 0x9043EA1AC7E41392}, // 1e131\n\t{0x29BABE4598C311FB, 0xB454E4A179DD1877}, // 1e132\n\t{0xF4296DD6FEF3D67A, 0xE16A1DC9D8545E94}, // 1e133\n\t{0x1899E4A65F58660C, 0x8CE2529E2734BB1D}, // 1e134\n\t{0x5EC05DCFF72E7F8F, 0xB01AE745B101E9E4}, // 1e135\n\t{0x76707543F4FA1F73, 0xDC21A1171D42645D}, // 1e136\n\t{0x6A06494A791C53A8, 0x899504AE72497EBA}, // 1e137\n\t{0x0487DB9D17636892, 0xABFA45DA0EDBDE69}, // 1e138\n\t{0x45A9D2845D3C42B6, 0xD6F8D7509292D603}, // 1e139\n\t{0x0B8A2392BA45A9B2, 0x865B86925B9BC5C2}, // 1e140\n\t{0x8E6CAC7768D7141E, 0xA7F26836F282B732}, // 1e141\n\t{0x3207D795430CD926, 0xD1EF0244AF2364FF}, // 1e142\n\t{0x7F44E6BD49E807B8, 0x8335616AED761F1F}, // 1e143\n\t{0x5F16206C9C6209A6, 0xA402B9C5A8D3A6E7}, // 1e144\n\t{0x36DBA887C37A8C0F, 0xCD036837130890A1}, // 1e145\n\t{0xC2494954DA2C9789, 0x802221226BE55A64}, // 1e146\n\t{0xF2DB9BAA10B7BD6C, 0xA02AA96B06DEB0FD}, // 1e147\n\t{0x6F92829494E5ACC7, 0xC83553C5C8965D3D}, // 1e148\n\t{0xCB772339BA1F17F9, 0xFA42A8B73ABBF48C}, // 1e149\n\t{0xFF2A760414536EFB, 0x9C69A97284B578D7}, // 1e150\n\t{0xFEF5138519684ABA, 0xC38413CF25E2D70D}, // 1e151\n\t{0x7EB258665FC25D69, 0xF46518C2EF5B8CD1}, // 1e152\n\t{0xEF2F773FFBD97A61, 0x98BF2F79D5993802}, // 1e153\n\t{0xAAFB550FFACFD8FA, 0xBEEEFB584AFF8603}, // 1e154\n\t{0x95BA2A53F983CF38, 0xEEAABA2E5DBF6784}, // 1e155\n\t{0xDD945A747BF26183, 0x952AB45CFA97A0B2}, // 1e156\n\t{0x94F971119AEEF9E4, 0xBA756174393D88DF}, // 1e157\n\t{0x7A37CD5601AAB85D, 0xE912B9D1478CEB17}, // 1e158\n\t{0xAC62E055C10AB33A, 0x91ABB422CCB812EE}, // 1e159\n\t{0x577B986B314D6009, 0xB616A12B7FE617AA}, // 1e160\n\t{0xED5A7E85FDA0B80B, 0xE39C49765FDF9D94}, // 1e161\n\t{0x14588F13BE847307, 0x8E41ADE9FBEBC27D}, // 1e162\n\t{0x596EB2D8AE258FC8, 0xB1D219647AE6B31C}, // 1e163\n\t{0x6FCA5F8ED9AEF3BB, 0xDE469FBD99A05FE3}, // 1e164\n\t{0x25DE7BB9480D5854, 0x8AEC23D680043BEE}, // 1e165\n\t{0xAF561AA79A10AE6A, 0xADA72CCC20054AE9}, // 1e166\n\t{0x1B2BA1518094DA04, 0xD910F7FF28069DA4}, // 1e167\n\t{0x90FB44D2F05D0842, 0x87AA9AFF79042286}, // 1e168\n\t{0x353A1607AC744A53, 0xA99541BF57452B28}, // 1e169\n\t{0x42889B8997915CE8, 0xD3FA922F2D1675F2}, // 1e170\n\t{0x69956135FEBADA11, 0x847C9B5D7C2E09B7}, // 1e171\n\t{0x43FAB9837E699095, 0xA59BC234DB398C25}, // 1e172\n\t{0x94F967E45E03F4BB, 0xCF02B2C21207EF2E}, // 1e173\n\t{0x1D1BE0EEBAC278F5, 0x8161AFB94B44F57D}, // 1e174\n\t{0x6462D92A69731732, 0xA1BA1BA79E1632DC}, // 1e175\n\t{0x7D7B8F7503CFDCFE, 0xCA28A291859BBF93}, // 1e176\n\t{0x5CDA735244C3D43E, 0xFCB2CB35E702AF78}, // 1e177\n\t{0x3A0888136AFA64A7, 0x9DEFBF01B061ADAB}, // 1e178\n\t{0x088AAA1845B8FDD0, 0xC56BAEC21C7A1916}, // 1e179\n\t{0x8AAD549E57273D45, 0xF6C69A72A3989F5B}, // 1e180\n\t{0x36AC54E2F678864B, 0x9A3C2087A63F6399}, // 1e181\n\t{0x84576A1BB416A7DD, 0xC0CB28A98FCF3C7F}, // 1e182\n\t{0x656D44A2A11C51D5, 0xF0FDF2D3F3C30B9F}, // 1e183\n\t{0x9F644AE5A4B1B325, 0x969EB7C47859E743}, // 1e184\n\t{0x873D5D9F0DDE1FEE, 0xBC4665B596706114}, // 1e185\n\t{0xA90CB506D155A7EA, 0xEB57FF22FC0C7959}, // 1e186\n\t{0x09A7F12442D588F2, 0x9316FF75DD87CBD8}, // 1e187\n\t{0x0C11ED6D538AEB2F, 0xB7DCBF5354E9BECE}, // 1e188\n\t{0x8F1668C8A86DA5FA, 0xE5D3EF282A242E81}, // 1e189\n\t{0xF96E017D694487BC, 0x8FA475791A569D10}, // 1e190\n\t{0x37C981DCC395A9AC, 0xB38D92D760EC4455}, // 1e191\n\t{0x85BBE253F47B1417, 0xE070F78D3927556A}, // 1e192\n\t{0x93956D7478CCEC8E, 0x8C469AB843B89562}, // 1e193\n\t{0x387AC8D1970027B2, 0xAF58416654A6BABB}, // 1e194\n\t{0x06997B05FCC0319E, 0xDB2E51BFE9D0696A}, // 1e195\n\t{0x441FECE3BDF81F03, 0x88FCF317F22241E2}, // 1e196\n\t{0xD527E81CAD7626C3, 0xAB3C2FDDEEAAD25A}, // 1e197\n\t{0x8A71E223D8D3B074, 0xD60B3BD56A5586F1}, // 1e198\n\t{0xF6872D5667844E49, 0x85C7056562757456}, // 1e199\n\t{0xB428F8AC016561DB, 0xA738C6BEBB12D16C}, // 1e200\n\t{0xE13336D701BEBA52, 0xD106F86E69D785C7}, // 1e201\n\t{0xECC0024661173473, 0x82A45B450226B39C}, // 1e202\n\t{0x27F002D7F95D0190, 0xA34D721642B06084}, // 1e203\n\t{0x31EC038DF7B441F4, 0xCC20CE9BD35C78A5}, // 1e204\n\t{0x7E67047175A15271, 0xFF290242C83396CE}, // 1e205\n\t{0x0F0062C6E984D386, 0x9F79A169BD203E41}, // 1e206\n\t{0x52C07B78A3E60868, 0xC75809C42C684DD1}, // 1e207\n\t{0xA7709A56CCDF8A82, 0xF92E0C3537826145}, // 1e208\n\t{0x88A66076400BB691, 0x9BBCC7A142B17CCB}, // 1e209\n\t{0x6ACFF893D00EA435, 0xC2ABF989935DDBFE}, // 1e210\n\t{0x0583F6B8C4124D43, 0xF356F7EBF83552FE}, // 1e211\n\t{0xC3727A337A8B704A, 0x98165AF37B2153DE}, // 1e212\n\t{0x744F18C0592E4C5C, 0xBE1BF1B059E9A8D6}, // 1e213\n\t{0x1162DEF06F79DF73, 0xEDA2EE1C7064130C}, // 1e214\n\t{0x8ADDCB5645AC2BA8, 0x9485D4D1C63E8BE7}, // 1e215\n\t{0x6D953E2BD7173692, 0xB9A74A0637CE2EE1}, // 1e216\n\t{0xC8FA8DB6CCDD0437, 0xE8111C87C5C1BA99}, // 1e217\n\t{0x1D9C9892400A22A2, 0x910AB1D4DB9914A0}, // 1e218\n\t{0x2503BEB6D00CAB4B, 0xB54D5E4A127F59C8}, // 1e219\n\t{0x2E44AE64840FD61D, 0xE2A0B5DC971F303A}, // 1e220\n\t{0x5CEAECFED289E5D2, 0x8DA471A9DE737E24}, // 1e221\n\t{0x7425A83E872C5F47, 0xB10D8E1456105DAD}, // 1e222\n\t{0xD12F124E28F77719, 0xDD50F1996B947518}, // 1e223\n\t{0x82BD6B70D99AAA6F, 0x8A5296FFE33CC92F}, // 1e224\n\t{0x636CC64D1001550B, 0xACE73CBFDC0BFB7B}, // 1e225\n\t{0x3C47F7E05401AA4E, 0xD8210BEFD30EFA5A}, // 1e226\n\t{0x65ACFAEC34810A71, 0x8714A775E3E95C78}, // 1e227\n\t{0x7F1839A741A14D0D, 0xA8D9D1535CE3B396}, // 1e228\n\t{0x1EDE48111209A050, 0xD31045A8341CA07C}, // 1e229\n\t{0x934AED0AAB460432, 0x83EA2B892091E44D}, // 1e230\n\t{0xF81DA84D5617853F, 0xA4E4B66B68B65D60}, // 1e231\n\t{0x36251260AB9D668E, 0xCE1DE40642E3F4B9}, // 1e232\n\t{0xC1D72B7C6B426019, 0x80D2AE83E9CE78F3}, // 1e233\n\t{0xB24CF65B8612F81F, 0xA1075A24E4421730}, // 1e234\n\t{0xDEE033F26797B627, 0xC94930AE1D529CFC}, // 1e235\n\t{0x169840EF017DA3B1, 0xFB9B7CD9A4A7443C}, // 1e236\n\t{0x8E1F289560EE864E, 0x9D412E0806E88AA5}, // 1e237\n\t{0xF1A6F2BAB92A27E2, 0xC491798A08A2AD4E}, // 1e238\n\t{0xAE10AF696774B1DB, 0xF5B5D7EC8ACB58A2}, // 1e239\n\t{0xACCA6DA1E0A8EF29, 0x9991A6F3D6BF1765}, // 1e240\n\t{0x17FD090A58D32AF3, 0xBFF610B0CC6EDD3F}, // 1e241\n\t{0xDDFC4B4CEF07F5B0, 0xEFF394DCFF8A948E}, // 1e242\n\t{0x4ABDAF101564F98E, 0x95F83D0A1FB69CD9}, // 1e243\n\t{0x9D6D1AD41ABE37F1, 0xBB764C4CA7A4440F}, // 1e244\n\t{0x84C86189216DC5ED, 0xEA53DF5FD18D5513}, // 1e245\n\t{0x32FD3CF5B4E49BB4, 0x92746B9BE2F8552C}, // 1e246\n\t{0x3FBC8C33221DC2A1, 0xB7118682DBB66A77}, // 1e247\n\t{0x0FABAF3FEAA5334A, 0xE4D5E82392A40515}, // 1e248\n\t{0x29CB4D87F2A7400E, 0x8F05B1163BA6832D}, // 1e249\n\t{0x743E20E9EF511012, 0xB2C71D5BCA9023F8}, // 1e250\n\t{0x914DA9246B255416, 0xDF78E4B2BD342CF6}, // 1e251\n\t{0x1AD089B6C2F7548E, 0x8BAB8EEFB6409C1A}, // 1e252\n\t{0xA184AC2473B529B1, 0xAE9672ABA3D0C320}, // 1e253\n\t{0xC9E5D72D90A2741E, 0xDA3C0F568CC4F3E8}, // 1e254\n\t{0x7E2FA67C7A658892, 0x8865899617FB1871}, // 1e255\n\t{0xDDBB901B98FEEAB7, 0xAA7EEBFB9DF9DE8D}, // 1e256\n\t{0x552A74227F3EA565, 0xD51EA6FA85785631}, // 1e257\n\t{0xD53A88958F87275F, 0x8533285C936B35DE}, // 1e258\n\t{0x8A892ABAF368F137, 0xA67FF273B8460356}, // 1e259\n\t{0x2D2B7569B0432D85, 0xD01FEF10A657842C}, // 1e260\n\t{0x9C3B29620E29FC73, 0x8213F56A67F6B29B}, // 1e261\n\t{0x8349F3BA91B47B8F, 0xA298F2C501F45F42}, // 1e262\n\t{0x241C70A936219A73, 0xCB3F2F7642717713}, // 1e263\n\t{0xED238CD383AA0110, 0xFE0EFB53D30DD4D7}, // 1e264\n\t{0xF4363804324A40AA, 0x9EC95D1463E8A506}, // 1e265\n\t{0xB143C6053EDCD0D5, 0xC67BB4597CE2CE48}, // 1e266\n\t{0xDD94B7868E94050A, 0xF81AA16FDC1B81DA}, // 1e267\n\t{0xCA7CF2B4191C8326, 0x9B10A4E5E9913128}, // 1e268\n\t{0xFD1C2F611F63A3F0, 0xC1D4CE1F63F57D72}, // 1e269\n\t{0xBC633B39673C8CEC, 0xF24A01A73CF2DCCF}, // 1e270\n\t{0xD5BE0503E085D813, 0x976E41088617CA01}, // 1e271\n\t{0x4B2D8644D8A74E18, 0xBD49D14AA79DBC82}, // 1e272\n\t{0xDDF8E7D60ED1219E, 0xEC9C459D51852BA2}, // 1e273\n\t{0xCABB90E5C942B503, 0x93E1AB8252F33B45}, // 1e274\n\t{0x3D6A751F3B936243, 0xB8DA1662E7B00A17}, // 1e275\n\t{0x0CC512670A783AD4, 0xE7109BFBA19C0C9D}, // 1e276\n\t{0x27FB2B80668B24C5, 0x906A617D450187E2}, // 1e277\n\t{0xB1F9F660802DEDF6, 0xB484F9DC9641E9DA}, // 1e278\n\t{0x5E7873F8A0396973, 0xE1A63853BBD26451}, // 1e279\n\t{0xDB0B487B6423E1E8, 0x8D07E33455637EB2}, // 1e280\n\t{0x91CE1A9A3D2CDA62, 0xB049DC016ABC5E5F}, // 1e281\n\t{0x7641A140CC7810FB, 0xDC5C5301C56B75F7}, // 1e282\n\t{0xA9E904C87FCB0A9D, 0x89B9B3E11B6329BA}, // 1e283\n\t{0x546345FA9FBDCD44, 0xAC2820D9623BF429}, // 1e284\n\t{0xA97C177947AD4095, 0xD732290FBACAF133}, // 1e285\n\t{0x49ED8EABCCCC485D, 0x867F59A9D4BED6C0}, // 1e286\n\t{0x5C68F256BFFF5A74, 0xA81F301449EE8C70}, // 1e287\n\t{0x73832EEC6FFF3111, 0xD226FC195C6A2F8C}, // 1e288\n\t{0xC831FD53C5FF7EAB, 0x83585D8FD9C25DB7}, // 1e289\n\t{0xBA3E7CA8B77F5E55, 0xA42E74F3D032F525}, // 1e290\n\t{0x28CE1BD2E55F35EB, 0xCD3A1230C43FB26F}, // 1e291\n\t{0x7980D163CF5B81B3, 0x80444B5E7AA7CF85}, // 1e292\n\t{0xD7E105BCC332621F, 0xA0555E361951C366}, // 1e293\n\t{0x8DD9472BF3FEFAA7, 0xC86AB5C39FA63440}, // 1e294\n\t{0xB14F98F6F0FEB951, 0xFA856334878FC150}, // 1e295\n\t{0x6ED1BF9A569F33D3, 0x9C935E00D4B9D8D2}, // 1e296\n\t{0x0A862F80EC4700C8, 0xC3B8358109E84F07}, // 1e297\n\t{0xCD27BB612758C0FA, 0xF4A642E14C6262C8}, // 1e298\n\t{0x8038D51CB897789C, 0x98E7E9CCCFBD7DBD}, // 1e299\n\t{0xE0470A63E6BD56C3, 0xBF21E44003ACDD2C}, // 1e300\n\t{0x1858CCFCE06CAC74, 0xEEEA5D5004981478}, // 1e301\n\t{0x0F37801E0C43EBC8, 0x95527A5202DF0CCB}, // 1e302\n\t{0xD30560258F54E6BA, 0xBAA718E68396CFFD}, // 1e303\n\t{0x47C6B82EF32A2069, 0xE950DF20247C83FD}, // 1e304\n\t{0x4CDC331D57FA5441, 0x91D28B7416CDD27E}, // 1e305\n\t{0xE0133FE4ADF8E952, 0xB6472E511C81471D}, // 1e306\n\t{0x58180FDDD97723A6, 0xE3D8F9E563A198E5}, // 1e307\n\t{0x570F09EAA7EA7648, 0x8E679C2F5E44FF8F}, // 1e308\n\t{0x2CD2CC6551E513DA, 0xB201833B35D63F73}, // 1e309\n\t{0xF8077F7EA65E58D1, 0xDE81E40A034BCF4F}, // 1e310\n\t{0xFB04AFAF27FAF782, 0x8B112E86420F6191}, // 1e311\n\t{0x79C5DB9AF1F9B563, 0xADD57A27D29339F6}, // 1e312\n\t{0x18375281AE7822BC, 0xD94AD8B1C7380874}, // 1e313\n\t{0x8F2293910D0B15B5, 0x87CEC76F1C830548}, // 1e314\n\t{0xB2EB3875504DDB22, 0xA9C2794AE3A3C69A}, // 1e315\n\t{0x5FA60692A46151EB, 0xD433179D9C8CB841}, // 1e316\n\t{0xDBC7C41BA6BCD333, 0x849FEEC281D7F328}, // 1e317\n\t{0x12B9B522906C0800, 0xA5C7EA73224DEFF3}, // 1e318\n\t{0xD768226B34870A00, 0xCF39E50FEAE16BEF}, // 1e319\n\t{0xE6A1158300D46640, 0x81842F29F2CCE375}, // 1e320\n\t{0x60495AE3C1097FD0, 0xA1E53AF46F801C53}, // 1e321\n\t{0x385BB19CB14BDFC4, 0xCA5E89B18B602368}, // 1e322\n\t{0x46729E03DD9ED7B5, 0xFCF62C1DEE382C42}, // 1e323\n\t{0x6C07A2C26A8346D1, 0x9E19DB92B4E31BA9}, // 1e324\n\t{0xC7098B7305241885, 0xC5A05277621BE293}, // 1e325\n\t{0xB8CBEE4FC66D1EA7, 0xF70867153AA2DB38}, // 1e326\n\t{0x737F74F1DC043328, 0x9A65406D44A5C903}, // 1e327\n\t{0x505F522E53053FF2, 0xC0FE908895CF3B44}, // 1e328\n\t{0x647726B9E7C68FEF, 0xF13E34AABB430A15}, // 1e329\n\t{0x5ECA783430DC19F5, 0x96C6E0EAB509E64D}, // 1e330\n\t{0xB67D16413D132072, 0xBC789925624C5FE0}, // 1e331\n\t{0xE41C5BD18C57E88F, 0xEB96BF6EBADF77D8}, // 1e332\n\t{0x8E91B962F7B6F159, 0x933E37A534CBAAE7}, // 1e333\n\t{0x723627BBB5A4ADB0, 0xB80DC58E81FE95A1}, // 1e334\n\t{0xCEC3B1AAA30DD91C, 0xE61136F2227E3B09}, // 1e335\n\t{0x213A4F0AA5E8A7B1, 0x8FCAC257558EE4E6}, // 1e336\n\t{0xA988E2CD4F62D19D, 0xB3BD72ED2AF29E1F}, // 1e337\n\t{0x93EB1B80A33B8605, 0xE0ACCFA875AF45A7}, // 1e338\n\t{0xBC72F130660533C3, 0x8C6C01C9498D8B88}, // 1e339\n\t{0xEB8FAD7C7F8680B4, 0xAF87023B9BF0EE6A}, // 1e340\n\t{0xA67398DB9F6820E1, 0xDB68C2CA82ED2A05}, // 1e341\n\t{0x88083F8943A1148C, 0x892179BE91D43A43}, // 1e342\n\t{0x6A0A4F6B948959B0, 0xAB69D82E364948D4}, // 1e343\n\t{0x848CE34679ABB01C, 0xD6444E39C3DB9B09}, // 1e344\n\t{0xF2D80E0C0C0B4E11, 0x85EAB0E41A6940E5}, // 1e345\n\t{0x6F8E118F0F0E2195, 0xA7655D1D2103911F}, // 1e346\n\t{0x4B7195F2D2D1A9FB, 0xD13EB46469447567}, // 1e347\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"ryu","path":"gno.land/p/demo/json/ryu","files":[{"name":"floatconv.gno","body":"// Copyright 2018 Ulf Adams\n// Modifications copyright 2019 Caleb Spare\n//\n// The contents of this file may be used under the terms of the Apache License,\n// Version 2.0.\n//\n// (See accompanying file LICENSE or copy at\n// http://www.apache.org/licenses/LICENSE-2.0)\n//\n// Unless required by applicable law or agreed to in writing, this software\n// is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n// KIND, either express or implied.\n//\n// The code in this file is part of a Go translation of the C code originally written by\n// Ulf Adams, which can be found at https://github.com/ulfjack/ryu. The original source\n// code is licensed under the Apache License 2.0. This code is a derivative work thereof,\n// adapted and modified to meet the specifications of the Gno language project.\n//\n// original Go implementation can be found at https://github.com/cespare/ryu.\n//\n// Please note that the modifications are also under the Apache License 2.0 unless\n// otherwise specified.\n\n// Package ryu implements the Ryu algorithm for quickly converting floating\n// point numbers into strings.\npackage ryu\n\nimport (\n\t\"math\"\n)\n\nconst (\n\tmantBits32 = 23\n\texpBits32 = 8\n\tbias32 = 127\n\n\tmantBits64 = 52\n\texpBits64 = 11\n\tbias64 = 1023\n)\n\n// FormatFloat64 converts a 64-bit floating point number f to a string.\n// It behaves like strconv.FormatFloat(f, 'e', -1, 64).\nfunc FormatFloat64(f float64) string {\n\tb := make([]byte, 0, 24)\n\tb = AppendFloat64(b, f)\n\treturn string(b)\n}\n\n// AppendFloat64 appends the string form of the 64-bit floating point number f,\n// as generated by FormatFloat64, to b and returns the extended buffer.\nfunc AppendFloat64(b []byte, f float64) []byte {\n\t// Step 1: Decode the floating-point number.\n\t// Unify normalized and subnormal cases.\n\tu := math.Float64bits(f)\n\tneg := u\u003e\u003e(mantBits64+expBits64) != 0\n\tmant := u \u0026 (uint64(1)\u003c\u003cmantBits64 - 1)\n\texp := (u \u003e\u003e mantBits64) \u0026 (uint64(1)\u003c\u003cexpBits64 - 1)\n\n\t// Exit early for easy cases.\n\tif exp == uint64(1)\u003c\u003cexpBits64-1 || (exp == 0 \u0026\u0026 mant == 0) {\n\t\treturn appendSpecial(b, neg, exp == 0, mant == 0)\n\t}\n\n\td, ok := float64ToDecimalExactInt(mant, exp)\n\tif !ok {\n\t\td = float64ToDecimal(mant, exp)\n\t}\n\treturn d.append(b, neg)\n}\n\nfunc appendSpecial(b []byte, neg, expZero, mantZero bool) []byte {\n\tif !mantZero {\n\t\treturn append(b, \"NaN\"...)\n\t}\n\tif !expZero {\n\t\tif neg {\n\t\t\treturn append(b, \"-Inf\"...)\n\t\t}\n\n\t\treturn append(b, \"+Inf\"...)\n\t}\n\n\tif neg {\n\t\tb = append(b, '-')\n\t}\n\treturn append(b, \"0e+00\"...)\n}\n\nfunc boolToInt(b bool) int {\n\tif b {\n\t\treturn 1\n\t}\n\treturn 0\n}\n\nfunc boolToUint32(b bool) uint32 {\n\tif b {\n\t\treturn 1\n\t}\n\treturn 0\n}\n\nfunc boolToUint64(b bool) uint64 {\n\tif b {\n\t\treturn 1\n\t}\n\treturn 0\n}\n\nfunc assert(t bool, msg string) {\n\tif !t {\n\t\tpanic(msg)\n\t}\n}\n\n// log10Pow2 returns floor(log_10(2^e)).\nfunc log10Pow2(e int32) uint32 {\n\t// The first value this approximation fails for is 2^1651\n\t// which is just greater than 10^297.\n\tassert(e \u003e= 0, \"e \u003e= 0\")\n\tassert(e \u003c= 1650, \"e \u003c= 1650\")\n\treturn (uint32(e) * 78913) \u003e\u003e 18\n}\n\n// log10Pow5 returns floor(log_10(5^e)).\nfunc log10Pow5(e int32) uint32 {\n\t// The first value this approximation fails for is 5^2621\n\t// which is just greater than 10^1832.\n\tassert(e \u003e= 0, \"e \u003e= 0\")\n\tassert(e \u003c= 2620, \"e \u003c= 2620\")\n\treturn (uint32(e) * 732923) \u003e\u003e 20\n}\n\n// pow5Bits returns ceil(log_2(5^e)), or else 1 if e==0.\nfunc pow5Bits(e int32) int32 {\n\t// This approximation works up to the point that the multiplication\n\t// overflows at e = 3529. If the multiplication were done in 64 bits,\n\t// it would fail at 5^4004 which is just greater than 2^9297.\n\tassert(e \u003e= 0, \"e \u003e= 0\")\n\tassert(e \u003c= 3528, \"e \u003c= 3528\")\n\treturn int32((uint32(e)*1217359)\u003e\u003e19 + 1)\n}\n"},{"name":"floatconv_test.gno","body":"package ryu\n\nimport (\n\t\"math\"\n\t\"testing\"\n)\n\nfunc TestFormatFloat64(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tvalue float64\n\t\texpected string\n\t}{\n\t\t{\"positive infinity\", math.Inf(1), \"+Inf\"},\n\t\t{\"negative infinity\", math.Inf(-1), \"-Inf\"},\n\t\t{\"NaN\", math.NaN(), \"NaN\"},\n\t\t{\"zero\", 0.0, \"0e+00\"},\n\t\t{\"negative zero\", -0.0, \"0e+00\"},\n\t\t{\"positive number\", 3.14159, \"3.14159e+00\"},\n\t\t{\"negative number\", -2.71828, \"-2.71828e+00\"},\n\t\t{\"very small number\", 1.23e-20, \"1.23e-20\"},\n\t\t{\"very large number\", 1.23e+20, \"1.23e+20\"},\n\t}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tresult := FormatFloat64(test.value)\n\t\t\tif result != test.expected {\n\t\t\t\tt.Errorf(\"FormatFloat64(%v) = %q, expected %q\", test.value, result, test.expected)\n\t\t\t}\n\t\t})\n\t}\n}\n"},{"name":"ryu64.gno","body":"package ryu\n\nimport (\n\t\"math/bits\"\n)\n\ntype uint128 struct {\n\tlo uint64\n\thi uint64\n}\n\n// dec64 is a floating decimal type representing m * 10^e.\ntype dec64 struct {\n\tm uint64\n\te int32\n}\n\nfunc (d dec64) append(b []byte, neg bool) []byte {\n\t// Step 5: Print the decimal representation.\n\tif neg {\n\t\tb = append(b, '-')\n\t}\n\n\tout := d.m\n\toutLen := decimalLen64(out)\n\tbufLen := outLen\n\tif bufLen \u003e 1 {\n\t\tbufLen++ // extra space for '.'\n\t}\n\n\t// Print the decimal digits.\n\tn := len(b)\n\tif cap(b)-len(b) \u003e= bufLen {\n\t\t// Avoid function call in the common case.\n\t\tb = b[:len(b)+bufLen]\n\t} else {\n\t\tb = append(b, make([]byte, bufLen)...)\n\t}\n\n\t// Avoid expensive 64-bit divisions.\n\t// We have at most 17 digits, and uint32 can store 9 digits.\n\t// If the output doesn't fit into a uint32, cut off 8 digits\n\t// so the rest will fit into a uint32.\n\tvar i int\n\tif out\u003e\u003e32 \u003e 0 {\n\t\tvar out32 uint32\n\t\tout, out32 = out/1e8, uint32(out%1e8)\n\t\tfor ; i \u003c 8; i++ {\n\t\t\tb[n+outLen-i] = '0' + byte(out32%10)\n\t\t\tout32 /= 10\n\t\t}\n\t}\n\tout32 := uint32(out)\n\tfor ; i \u003c outLen-1; i++ {\n\t\tb[n+outLen-i] = '0' + byte(out32%10)\n\t\tout32 /= 10\n\t}\n\tb[n] = '0' + byte(out32%10)\n\n\t// Print the '.' if needed.\n\tif outLen \u003e 1 {\n\t\tb[n+1] = '.'\n\t}\n\n\t// Print the exponent.\n\tb = append(b, 'e')\n\texp := d.e + int32(outLen) - 1\n\tif exp \u003c 0 {\n\t\tb = append(b, '-')\n\t\texp = -exp\n\t} else {\n\t\t// Unconditionally print a + here to match strconv's formatting.\n\t\tb = append(b, '+')\n\t}\n\t// Always print at least two digits to match strconv's formatting.\n\td2 := exp % 10\n\texp /= 10\n\td1 := exp % 10\n\td0 := exp / 10\n\tif d0 \u003e 0 {\n\t\tb = append(b, '0'+byte(d0))\n\t}\n\tb = append(b, '0'+byte(d1), '0'+byte(d2))\n\n\treturn b\n}\n\nfunc float64ToDecimalExactInt(mant, exp uint64) (d dec64, ok bool) {\n\te := exp - bias64\n\tif e \u003e mantBits64 {\n\t\treturn d, false\n\t}\n\tshift := mantBits64 - e\n\tmant |= 1 \u003c\u003c mantBits64 // implicit 1\n\td.m = mant \u003e\u003e shift\n\tif d.m\u003c\u003cshift != mant {\n\t\treturn d, false\n\t}\n\n\tfor d.m%10 == 0 {\n\t\td.m /= 10\n\t\td.e++\n\t}\n\treturn d, true\n}\n\nfunc float64ToDecimal(mant, exp uint64) dec64 {\n\tvar e2 int32\n\tvar m2 uint64\n\tif exp == 0 {\n\t\t// We subtract 2 so that the bounds computation has\n\t\t// 2 additional bits.\n\t\te2 = 1 - bias64 - mantBits64 - 2\n\t\tm2 = mant\n\t} else {\n\t\te2 = int32(exp) - bias64 - mantBits64 - 2\n\t\tm2 = uint64(1)\u003c\u003cmantBits64 | mant\n\t}\n\teven := m2\u00261 == 0\n\tacceptBounds := even\n\n\t// Step 2: Determine the interval of valid decimal representations.\n\tmv := 4 * m2\n\tmmShift := boolToUint64(mant != 0 || exp \u003c= 1)\n\t// We would compute mp and mm like this:\n\t// mp := 4 * m2 + 2;\n\t// mm := mv - 1 - mmShift;\n\n\t// Step 3: Convert to a decimal power base uing 128-bit arithmetic.\n\tvar (\n\t\tvr, vp, vm uint64\n\t\te10 int32\n\t\tvmIsTrailingZeros bool\n\t\tvrIsTrailingZeros bool\n\t)\n\tif e2 \u003e= 0 {\n\t\t// This expression is slightly faster than max(0, log10Pow2(e2) - 1).\n\t\tq := log10Pow2(e2) - boolToUint32(e2 \u003e 3)\n\t\te10 = int32(q)\n\t\tk := pow5InvNumBits64 + pow5Bits(int32(q)) - 1\n\t\ti := -e2 + int32(q) + k\n\t\tmul := pow5InvSplit64[q]\n\t\tvr = mulShift64(4*m2, mul, i)\n\t\tvp = mulShift64(4*m2+2, mul, i)\n\t\tvm = mulShift64(4*m2-1-mmShift, mul, i)\n\t\tif q \u003c= 21 {\n\t\t\t// This should use q \u003c= 22, but I think 21 is also safe.\n\t\t\t// Smaller values may still be safe, but it's more\n\t\t\t// difficult to reason about them. Only one of mp, mv,\n\t\t\t// and mm can be a multiple of 5, if any.\n\t\t\tif mv%5 == 0 {\n\t\t\t\tvrIsTrailingZeros = multipleOfPowerOfFive64(mv, q)\n\t\t\t} else if acceptBounds {\n\t\t\t\t// Same as min(e2 + (^mm \u0026 1), pow5Factor64(mm)) \u003e= q\n\t\t\t\t// \u003c=\u003e e2 + (^mm \u0026 1) \u003e= q \u0026\u0026 pow5Factor64(mm) \u003e= q\n\t\t\t\t// \u003c=\u003e true \u0026\u0026 pow5Factor64(mm) \u003e= q, since e2 \u003e= q.\n\t\t\t\tvmIsTrailingZeros = multipleOfPowerOfFive64(mv-1-mmShift, q)\n\t\t\t} else if multipleOfPowerOfFive64(mv+2, q) {\n\t\t\t\tvp--\n\t\t\t}\n\t\t}\n\t} else {\n\t\t// This expression is slightly faster than max(0, log10Pow5(-e2) - 1).\n\t\tq := log10Pow5(-e2) - boolToUint32(-e2 \u003e 1)\n\t\te10 = int32(q) + e2\n\t\ti := -e2 - int32(q)\n\t\tk := pow5Bits(i) - pow5NumBits64\n\t\tj := int32(q) - k\n\t\tmul := pow5Split64[i]\n\t\tvr = mulShift64(4*m2, mul, j)\n\t\tvp = mulShift64(4*m2+2, mul, j)\n\t\tvm = mulShift64(4*m2-1-mmShift, mul, j)\n\t\tif q \u003c= 1 {\n\t\t\t// {vr,vp,vm} is trailing zeros if {mv,mp,mm} has at least q trailing 0 bits.\n\t\t\t// mv = 4 * m2, so it always has at least two trailing 0 bits.\n\t\t\tvrIsTrailingZeros = true\n\t\t\tif acceptBounds {\n\t\t\t\t// mm = mv - 1 - mmShift, so it has 1 trailing 0 bit iff mmShift == 1.\n\t\t\t\tvmIsTrailingZeros = mmShift == 1\n\t\t\t} else {\n\t\t\t\t// mp = mv + 2, so it always has at least one trailing 0 bit.\n\t\t\t\tvp--\n\t\t\t}\n\t\t} else if q \u003c 63 { // TODO(ulfjack/cespare): Use a tighter bound here.\n\t\t\t// We need to compute min(ntz(mv), pow5Factor64(mv) - e2) \u003e= q - 1\n\t\t\t// \u003c=\u003e ntz(mv) \u003e= q - 1 \u0026\u0026 pow5Factor64(mv) - e2 \u003e= q - 1\n\t\t\t// \u003c=\u003e ntz(mv) \u003e= q - 1 (e2 is negative and -e2 \u003e= q)\n\t\t\t// \u003c=\u003e (mv \u0026 ((1 \u003c\u003c (q - 1)) - 1)) == 0\n\t\t\t// We also need to make sure that the left shift does not overflow.\n\t\t\tvrIsTrailingZeros = multipleOfPowerOfTwo64(mv, q-1)\n\t\t}\n\t}\n\n\t// Step 4: Find the shortest decimal representation\n\t// in the interval of valid representations.\n\tvar removed int32\n\tvar lastRemovedDigit uint8\n\tvar out uint64\n\t// On average, we remove ~2 digits.\n\tif vmIsTrailingZeros || vrIsTrailingZeros {\n\t\t// General case, which happens rarely (~0.7%).\n\t\tfor {\n\t\t\tvpDiv10 := vp / 10\n\t\t\tvmDiv10 := vm / 10\n\t\t\tif vpDiv10 \u003c= vmDiv10 {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tvmMod10 := vm % 10\n\t\t\tvrDiv10 := vr / 10\n\t\t\tvrMod10 := vr % 10\n\t\t\tvmIsTrailingZeros = vmIsTrailingZeros \u0026\u0026 vmMod10 == 0\n\t\t\tvrIsTrailingZeros = vrIsTrailingZeros \u0026\u0026 lastRemovedDigit == 0\n\t\t\tlastRemovedDigit = uint8(vrMod10)\n\t\t\tvr = vrDiv10\n\t\t\tvp = vpDiv10\n\t\t\tvm = vmDiv10\n\t\t\tremoved++\n\t\t}\n\t\tif vmIsTrailingZeros {\n\t\t\tfor {\n\t\t\t\tvmDiv10 := vm / 10\n\t\t\t\tvmMod10 := vm % 10\n\t\t\t\tif vmMod10 != 0 {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t\tvpDiv10 := vp / 10\n\t\t\t\tvrDiv10 := vr / 10\n\t\t\t\tvrMod10 := vr % 10\n\t\t\t\tvrIsTrailingZeros = vrIsTrailingZeros \u0026\u0026 lastRemovedDigit == 0\n\t\t\t\tlastRemovedDigit = uint8(vrMod10)\n\t\t\t\tvr = vrDiv10\n\t\t\t\tvp = vpDiv10\n\t\t\t\tvm = vmDiv10\n\t\t\t\tremoved++\n\t\t\t}\n\t\t}\n\t\tif vrIsTrailingZeros \u0026\u0026 lastRemovedDigit == 5 \u0026\u0026 vr%2 == 0 {\n\t\t\t// Round even if the exact number is .....50..0.\n\t\t\tlastRemovedDigit = 4\n\t\t}\n\t\tout = vr\n\t\t// We need to take vr + 1 if vr is outside bounds\n\t\t// or we need to round up.\n\t\tif (vr == vm \u0026\u0026 (!acceptBounds || !vmIsTrailingZeros)) || lastRemovedDigit \u003e= 5 {\n\t\t\tout++\n\t\t}\n\t} else {\n\t\t// Specialized for the common case (~99.3%).\n\t\t// Percentages below are relative to this.\n\t\troundUp := false\n\t\tfor vp/100 \u003e vm/100 {\n\t\t\t// Optimization: remove two digits at a time (~86.2%).\n\t\t\troundUp = vr%100 \u003e= 50\n\t\t\tvr /= 100\n\t\t\tvp /= 100\n\t\t\tvm /= 100\n\t\t\tremoved += 2\n\t\t}\n\t\t// Loop iterations below (approximately), without optimization above:\n\t\t// 0: 0.03%, 1: 13.8%, 2: 70.6%, 3: 14.0%, 4: 1.40%, 5: 0.14%, 6+: 0.02%\n\t\t// Loop iterations below (approximately), with optimization above:\n\t\t// 0: 70.6%, 1: 27.8%, 2: 1.40%, 3: 0.14%, 4+: 0.02%\n\t\tfor vp/10 \u003e vm/10 {\n\t\t\troundUp = vr%10 \u003e= 5\n\t\t\tvr /= 10\n\t\t\tvp /= 10\n\t\t\tvm /= 10\n\t\t\tremoved++\n\t\t}\n\t\t// We need to take vr + 1 if vr is outside bounds\n\t\t// or we need to round up.\n\t\tout = vr + boolToUint64(vr == vm || roundUp)\n\t}\n\n\treturn dec64{m: out, e: e10 + removed}\n}\n\nvar powersOf10 = [...]uint64{\n\t1e0,\n\t1e1,\n\t1e2,\n\t1e3,\n\t1e4,\n\t1e5,\n\t1e6,\n\t1e7,\n\t1e8,\n\t1e9,\n\t1e10,\n\t1e11,\n\t1e12,\n\t1e13,\n\t1e14,\n\t1e15,\n\t1e16,\n\t1e17,\n\t// We only need to find the length of at most 17 digit numbers.\n}\n\nfunc decimalLen64(u uint64) int {\n\t// http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog10\n\tlog2 := 64 - bits.LeadingZeros64(u) - 1\n\tt := (log2 + 1) * 1233 \u003e\u003e 12\n\treturn t - boolToInt(u \u003c powersOf10[t]) + 1\n}\n\nfunc mulShift64(m uint64, mul uint128, shift int32) uint64 {\n\thihi, hilo := bits.Mul64(m, mul.hi)\n\tlohi, _ := bits.Mul64(m, mul.lo)\n\tsum := uint128{hi: hihi, lo: lohi + hilo}\n\tif sum.lo \u003c lohi {\n\t\tsum.hi++ // overflow\n\t}\n\treturn shiftRight128(sum, shift-64)\n}\n\nfunc shiftRight128(v uint128, shift int32) uint64 {\n\t// The shift value is always modulo 64.\n\t// In the current implementation of the 64-bit version\n\t// of Ryu, the shift value is always \u003c 64.\n\t// (It is in the range [2, 59].)\n\t// Check this here in case a future change requires larger shift\n\t// values. In this case this function needs to be adjusted.\n\tassert(shift \u003c 64, \"shift \u003c 64\")\n\treturn (v.hi \u003c\u003c uint64(64-shift)) | (v.lo \u003e\u003e uint(shift))\n}\n\nfunc pow5Factor64(v uint64) uint32 {\n\tfor n := uint32(0); ; n++ {\n\t\tq, r := v/5, v%5\n\t\tif r != 0 {\n\t\t\treturn n\n\t\t}\n\t\tv = q\n\t}\n}\n\nfunc multipleOfPowerOfFive64(v uint64, p uint32) bool {\n\treturn pow5Factor64(v) \u003e= p\n}\n\nfunc multipleOfPowerOfTwo64(v uint64, p uint32) bool {\n\treturn uint32(bits.TrailingZeros64(v)) \u003e= p\n}\n"},{"name":"table.gno","body":"// Code generated by running \"go generate\". DO NOT EDIT.\n\n// Copyright 2018 Ulf Adams\n// Modifications copyright 2019 Caleb Spare\n//\n// The contents of this file may be used under the terms of the Apache License,\n// Version 2.0.\n//\n// (See accompanying file LICENSE or copy at\n// http://www.apache.org/licenses/LICENSE-2.0)\n//\n// Unless required by applicable law or agreed to in writing, this software\n// is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\n// KIND, either express or implied.\n//\n// The code in this file is part of a Go translation of the C code written by\n// Ulf Adams which may be found at https://github.com/ulfjack/ryu. That source\n// code is licensed under Apache 2.0 and this code is derivative work thereof.\n\npackage ryu\n\nconst pow5NumBits32 = 61\n\nvar pow5Split32 = [...]uint64{\n\t1152921504606846976, 1441151880758558720, 1801439850948198400, 2251799813685248000,\n\t1407374883553280000, 1759218604441600000, 2199023255552000000, 1374389534720000000,\n\t1717986918400000000, 2147483648000000000, 1342177280000000000, 1677721600000000000,\n\t2097152000000000000, 1310720000000000000, 1638400000000000000, 2048000000000000000,\n\t1280000000000000000, 1600000000000000000, 2000000000000000000, 1250000000000000000,\n\t1562500000000000000, 1953125000000000000, 1220703125000000000, 1525878906250000000,\n\t1907348632812500000, 1192092895507812500, 1490116119384765625, 1862645149230957031,\n\t1164153218269348144, 1455191522836685180, 1818989403545856475, 2273736754432320594,\n\t1421085471520200371, 1776356839400250464, 2220446049250313080, 1387778780781445675,\n\t1734723475976807094, 2168404344971008868, 1355252715606880542, 1694065894508600678,\n\t2117582368135750847, 1323488980084844279, 1654361225106055349, 2067951531382569187,\n\t1292469707114105741, 1615587133892632177, 2019483917365790221,\n}\n\nconst pow5InvNumBits32 = 59\n\nvar pow5InvSplit32 = [...]uint64{\n\t576460752303423489, 461168601842738791, 368934881474191033, 295147905179352826,\n\t472236648286964522, 377789318629571618, 302231454903657294, 483570327845851670,\n\t386856262276681336, 309485009821345069, 495176015714152110, 396140812571321688,\n\t316912650057057351, 507060240091291761, 405648192073033409, 324518553658426727,\n\t519229685853482763, 415383748682786211, 332306998946228969, 531691198313966350,\n\t425352958651173080, 340282366920938464, 544451787073501542, 435561429658801234,\n\t348449143727040987, 557518629963265579, 446014903970612463, 356811923176489971,\n\t570899077082383953, 456719261665907162, 365375409332725730,\n}\n\nconst pow5NumBits64 = 121\n\nvar pow5Split64 = [...]uint128{\n\t{0, 72057594037927936},\n\t{0, 90071992547409920},\n\t{0, 112589990684262400},\n\t{0, 140737488355328000},\n\t{0, 87960930222080000},\n\t{0, 109951162777600000},\n\t{0, 137438953472000000},\n\t{0, 85899345920000000},\n\t{0, 107374182400000000},\n\t{0, 134217728000000000},\n\t{0, 83886080000000000},\n\t{0, 104857600000000000},\n\t{0, 131072000000000000},\n\t{0, 81920000000000000},\n\t{0, 102400000000000000},\n\t{0, 128000000000000000},\n\t{0, 80000000000000000},\n\t{0, 100000000000000000},\n\t{0, 125000000000000000},\n\t{0, 78125000000000000},\n\t{0, 97656250000000000},\n\t{0, 122070312500000000},\n\t{0, 76293945312500000},\n\t{0, 95367431640625000},\n\t{0, 119209289550781250},\n\t{4611686018427387904, 74505805969238281},\n\t{10376293541461622784, 93132257461547851},\n\t{8358680908399640576, 116415321826934814},\n\t{612489549322387456, 72759576141834259},\n\t{14600669991935148032, 90949470177292823},\n\t{13639151471491547136, 113686837721616029},\n\t{3213881284082270208, 142108547152020037},\n\t{4314518811765112832, 88817841970012523},\n\t{781462496279003136, 111022302462515654},\n\t{10200200157203529728, 138777878078144567},\n\t{13292654125893287936, 86736173798840354},\n\t{7392445620511834112, 108420217248550443},\n\t{4628871007212404736, 135525271560688054},\n\t{16728102434789916672, 84703294725430033},\n\t{7075069988205232128, 105879118406787542},\n\t{18067209522111315968, 132348898008484427},\n\t{8986162942105878528, 82718061255302767},\n\t{6621017659204960256, 103397576569128459},\n\t{3664586055578812416, 129246970711410574},\n\t{16125424340018921472, 80779356694631608},\n\t{1710036351314100224, 100974195868289511},\n\t{15972603494424788992, 126217744835361888},\n\t{9982877184015493120, 78886090522101180},\n\t{12478596480019366400, 98607613152626475},\n\t{10986559581596820096, 123259516440783094},\n\t{2254913720070624656, 77037197775489434},\n\t{12042014186943056628, 96296497219361792},\n\t{15052517733678820785, 120370621524202240},\n\t{9407823583549262990, 75231638452626400},\n\t{11759779479436578738, 94039548065783000},\n\t{14699724349295723422, 117549435082228750},\n\t{4575641699882439235, 73468396926392969},\n\t{10331238143280436948, 91835496157991211},\n\t{8302361660673158281, 114794370197489014},\n\t{1154580038986672043, 143492962746861268},\n\t{9944984561221445835, 89683101716788292},\n\t{12431230701526807293, 112103877145985365},\n\t{1703980321626345405, 140129846432481707},\n\t{17205888765512323542, 87581154020301066},\n\t{12283988920035628619, 109476442525376333},\n\t{1519928094762372062, 136845553156720417},\n\t{12479170105294952299, 85528470722950260},\n\t{15598962631618690374, 106910588403687825},\n\t{5663645234241199255, 133638235504609782},\n\t{17374836326682913246, 83523897190381113},\n\t{7883487353071477846, 104404871487976392},\n\t{9854359191339347308, 130506089359970490},\n\t{10770660513014479971, 81566305849981556},\n\t{13463325641268099964, 101957882312476945},\n\t{2994098996302961243, 127447352890596182},\n\t{15706369927971514489, 79654595556622613},\n\t{5797904354682229399, 99568244445778267},\n\t{2635694424925398845, 124460305557222834},\n\t{6258995034005762182, 77787690973264271},\n\t{3212057774079814824, 97234613716580339},\n\t{17850130272881932242, 121543267145725423},\n\t{18073860448192289507, 75964541966078389},\n\t{8757267504958198172, 94955677457597987},\n\t{6334898362770359811, 118694596821997484},\n\t{13182683513586250689, 74184123013748427},\n\t{11866668373555425458, 92730153767185534},\n\t{5609963430089506015, 115912692208981918},\n\t{17341285199088104971, 72445432630613698},\n\t{12453234462005355406, 90556790788267123},\n\t{10954857059079306353, 113195988485333904},\n\t{13693571323849132942, 141494985606667380},\n\t{17781854114260483896, 88434366004167112},\n\t{3780573569116053255, 110542957505208891},\n\t{114030942967678664, 138178696881511114},\n\t{4682955357782187069, 86361685550944446},\n\t{15077066234082509644, 107952106938680557},\n\t{5011274737320973344, 134940133673350697},\n\t{14661261756894078100, 84337583545844185},\n\t{4491519140835433913, 105421979432305232},\n\t{5614398926044292391, 131777474290381540},\n\t{12732371365632458552, 82360921431488462},\n\t{6692092170185797382, 102951151789360578},\n\t{17588487249587022536, 128688939736700722},\n\t{15604490549419276989, 80430587335437951},\n\t{14893927168346708332, 100538234169297439},\n\t{14005722942005997511, 125672792711621799},\n\t{15671105866394830300, 78545495444763624},\n\t{1142138259283986260, 98181869305954531},\n\t{15262730879387146537, 122727336632443163},\n\t{7233363790403272633, 76704585395276977},\n\t{13653390756431478696, 95880731744096221},\n\t{3231680390257184658, 119850914680120277},\n\t{4325643253124434363, 74906821675075173},\n\t{10018740084832930858, 93633527093843966},\n\t{3300053069186387764, 117041908867304958},\n\t{15897591223523656064, 73151193042065598},\n\t{10648616992549794273, 91438991302581998},\n\t{4087399203832467033, 114298739128227498},\n\t{14332621041645359599, 142873423910284372},\n\t{18181260187883125557, 89295889943927732},\n\t{4279831161144355331, 111619862429909666},\n\t{14573160988285219972, 139524828037387082},\n\t{13719911636105650386, 87203017523366926},\n\t{7926517508277287175, 109003771904208658},\n\t{684774848491833161, 136254714880260823},\n\t{7345513307948477581, 85159196800163014},\n\t{18405263671790372785, 106448996000203767},\n\t{18394893571310578077, 133061245000254709},\n\t{13802651491282805250, 83163278125159193},\n\t{3418256308821342851, 103954097656448992},\n\t{4272820386026678563, 129942622070561240},\n\t{2670512741266674102, 81214138794100775},\n\t{17173198981865506339, 101517673492625968},\n\t{3019754653622331308, 126897091865782461},\n\t{4193189667727651020, 79310682416114038},\n\t{14464859121514339583, 99138353020142547},\n\t{13469387883465536574, 123922941275178184},\n\t{8418367427165960359, 77451838296986365},\n\t{15134645302384838353, 96814797871232956},\n\t{471562554271496325, 121018497339041196},\n\t{9518098633274461011, 75636560836900747},\n\t{7285937273165688360, 94545701046125934},\n\t{18330793628311886258, 118182126307657417},\n\t{4539216990053847055, 73863828942285886},\n\t{14897393274422084627, 92329786177857357},\n\t{4786683537745442072, 115412232722321697},\n\t{14520892257159371055, 72132645451451060},\n\t{18151115321449213818, 90165806814313825},\n\t{8853836096529353561, 112707258517892282},\n\t{1843923083806916143, 140884073147365353},\n\t{12681666973447792349, 88052545717103345},\n\t{2017025661527576725, 110065682146379182},\n\t{11744654113764246714, 137582102682973977},\n\t{422879793461572340, 85988814176858736},\n\t{528599741826965425, 107486017721073420},\n\t{660749677283706782, 134357522151341775},\n\t{7330497575943398595, 83973451344588609},\n\t{13774807988356636147, 104966814180735761},\n\t{3383451930163631472, 131208517725919702},\n\t{15949715511634433382, 82005323578699813},\n\t{6102086334260878016, 102506654473374767},\n\t{3015921899398709616, 128133318091718459},\n\t{18025852251620051174, 80083323807324036},\n\t{4085571240815512351, 100104154759155046},\n\t{14330336087874166247, 125130193448943807},\n\t{15873989082562435760, 78206370905589879},\n\t{15230800334775656796, 97757963631987349},\n\t{5203442363187407284, 122197454539984187},\n\t{946308467778435600, 76373409087490117},\n\t{5794571603150432404, 95466761359362646},\n\t{16466586540792816313, 119333451699203307},\n\t{7985773578781816244, 74583407312002067},\n\t{5370530955049882401, 93229259140002584},\n\t{6713163693812353001, 116536573925003230},\n\t{18030785363914884337, 72835358703127018},\n\t{13315109668038829614, 91044198378908773},\n\t{2808829029766373305, 113805247973635967},\n\t{17346094342490130344, 142256559967044958},\n\t{6229622945628943561, 88910349979403099},\n\t{3175342663608791547, 111137937474253874},\n\t{13192550366365765242, 138922421842817342},\n\t{3633657960551215372, 86826513651760839},\n\t{18377130505971182927, 108533142064701048},\n\t{4524669058754427043, 135666427580876311},\n\t{9745447189362598758, 84791517238047694},\n\t{2958436949848472639, 105989396547559618},\n\t{12921418224165366607, 132486745684449522},\n\t{12687572408530742033, 82804216052780951},\n\t{11247779492236039638, 103505270065976189},\n\t{224666310012885835, 129381587582470237},\n\t{2446259452971747599, 80863492239043898},\n\t{12281196353069460307, 101079365298804872},\n\t{15351495441336825384, 126349206623506090},\n\t{14206370669262903769, 78968254139691306},\n\t{8534591299723853903, 98710317674614133},\n\t{15279925143082205283, 123387897093267666},\n\t{14161639232853766206, 77117435683292291},\n\t{13090363022639819853, 96396794604115364},\n\t{16362953778299774816, 120495993255144205},\n\t{12532689120651053212, 75309995784465128},\n\t{15665861400813816515, 94137494730581410},\n\t{10358954714162494836, 117671868413226763},\n\t{4168503687137865320, 73544917758266727},\n\t{598943590494943747, 91931147197833409},\n\t{5360365506546067587, 114913933997291761},\n\t{11312142901609972388, 143642417496614701},\n\t{9375932322719926695, 89776510935384188},\n\t{11719915403399908368, 112220638669230235},\n\t{10038208235822497557, 140275798336537794},\n\t{10885566165816448877, 87672373960336121},\n\t{18218643725697949000, 109590467450420151},\n\t{18161618638695048346, 136988084313025189},\n\t{13656854658398099168, 85617552695640743},\n\t{12459382304570236056, 107021940869550929},\n\t{1739169825430631358, 133777426086938662},\n\t{14922039196176308311, 83610891304336663},\n\t{14040862976792997485, 104513614130420829},\n\t{3716020665709083144, 130642017663026037},\n\t{4628355925281870917, 81651261039391273},\n\t{10397130925029726550, 102064076299239091},\n\t{8384727637859770284, 127580095374048864},\n\t{5240454773662356427, 79737559608780540},\n\t{6550568467077945534, 99671949510975675},\n\t{3576524565420044014, 124589936888719594},\n\t{6847013871814915412, 77868710555449746},\n\t{17782139376623420074, 97335888194312182},\n\t{13004302183924499284, 121669860242890228},\n\t{17351060901807587860, 76043662651806392},\n\t{3242082053549933210, 95054578314757991},\n\t{17887660622219580224, 118818222893447488},\n\t{11179787888887237640, 74261389308404680},\n\t{13974734861109047050, 92826736635505850},\n\t{8245046539531533005, 116033420794382313},\n\t{16682369133275677888, 72520887996488945},\n\t{7017903361312433648, 90651109995611182},\n\t{17995751238495317868, 113313887494513977},\n\t{8659630992836983623, 141642359368142472},\n\t{5412269370523114764, 88526474605089045},\n\t{11377022731581281359, 110658093256361306},\n\t{4997906377621825891, 138322616570451633},\n\t{14652906532082110942, 86451635356532270},\n\t{9092761128247862869, 108064544195665338},\n\t{2142579373455052779, 135080680244581673},\n\t{12868327154477877747, 84425425152863545},\n\t{2250350887815183471, 105531781441079432},\n\t{2812938609768979339, 131914726801349290},\n\t{6369772649532999991, 82446704250843306},\n\t{17185587848771025797, 103058380313554132},\n\t{3035240737254230630, 128822975391942666},\n\t{6508711479211282048, 80514359619964166},\n\t{17359261385868878368, 100642949524955207},\n\t{17087390713908710056, 125803686906194009},\n\t{3762090168551861929, 78627304316371256},\n\t{4702612710689827411, 98284130395464070},\n\t{15101637925217060072, 122855162994330087},\n\t{16356052730901744401, 76784476871456304},\n\t{1998321839917628885, 95980596089320381},\n\t{7109588318324424010, 119975745111650476},\n\t{13666864735807540814, 74984840694781547},\n\t{12471894901332038114, 93731050868476934},\n\t{6366496589810271835, 117163813585596168},\n\t{3979060368631419896, 73227383490997605},\n\t{9585511479216662775, 91534229363747006},\n\t{2758517312166052660, 114417786704683758},\n\t{12671518677062341634, 143022233380854697},\n\t{1002170145522881665, 89388895863034186},\n\t{10476084718758377889, 111736119828792732},\n\t{13095105898447972362, 139670149785990915},\n\t{5878598177316288774, 87293843616244322},\n\t{16571619758500136775, 109117304520305402},\n\t{11491152661270395161, 136396630650381753},\n\t{264441385652915120, 85247894156488596},\n\t{330551732066143900, 106559867695610745},\n\t{5024875683510067779, 133199834619513431},\n\t{10058076329834874218, 83249896637195894},\n\t{3349223375438816964, 104062370796494868},\n\t{4186529219298521205, 130077963495618585},\n\t{14145795808130045513, 81298727184761615},\n\t{13070558741735168987, 101623408980952019},\n\t{11726512408741573330, 127029261226190024},\n\t{7329070255463483331, 79393288266368765},\n\t{13773023837756742068, 99241610332960956},\n\t{17216279797195927585, 124052012916201195},\n\t{8454331864033760789, 77532508072625747},\n\t{5956228811614813082, 96915635090782184},\n\t{7445286014518516353, 121144543863477730},\n\t{9264989777501460624, 75715339914673581},\n\t{16192923240304213684, 94644174893341976},\n\t{1794409976670715490, 118305218616677471},\n\t{8039035263060279037, 73940761635423419},\n\t{5437108060397960892, 92425952044279274},\n\t{16019757112352226923, 115532440055349092},\n\t{788976158365366019, 72207775034593183},\n\t{14821278253238871236, 90259718793241478},\n\t{9303225779693813237, 112824648491551848},\n\t{11629032224617266546, 141030810614439810},\n\t{11879831158813179495, 88144256634024881},\n\t{1014730893234310657, 110180320792531102},\n\t{10491785653397664129, 137725400990663877},\n\t{8863209042587234033, 86078375619164923},\n\t{6467325284806654637, 107597969523956154},\n\t{17307528642863094104, 134497461904945192},\n\t{10817205401789433815, 84060913690590745},\n\t{18133192770664180173, 105076142113238431},\n\t{18054804944902837312, 131345177641548039},\n\t{18201782118205355176, 82090736025967524},\n\t{4305483574047142354, 102613420032459406},\n\t{14605226504413703751, 128266775040574257},\n\t{2210737537617482988, 80166734400358911},\n\t{16598479977304017447, 100208418000448638},\n\t{11524727934775246001, 125260522500560798},\n\t{2591268940807140847, 78287826562850499},\n\t{17074144231291089770, 97859783203563123},\n\t{16730994270686474309, 122324729004453904},\n\t{10456871419179046443, 76452955627783690},\n\t{3847717237119032246, 95566194534729613},\n\t{9421332564826178211, 119457743168412016},\n\t{5888332853016361382, 74661089480257510},\n\t{16583788103125227536, 93326361850321887},\n\t{16118049110479146516, 116657952312902359},\n\t{16991309721690548428, 72911220195563974},\n\t{12015765115258409727, 91139025244454968},\n\t{15019706394073012159, 113923781555568710},\n\t{9551260955736489391, 142404726944460888},\n\t{5969538097335305869, 89002954340288055},\n\t{2850236603241744433, 111253692925360069},\n}\n\nconst pow5InvNumBits64 = 122\n\nvar pow5InvSplit64 = [...]uint128{\n\t{1, 288230376151711744},\n\t{3689348814741910324, 230584300921369395},\n\t{2951479051793528259, 184467440737095516},\n\t{17118578500402463900, 147573952589676412},\n\t{12632330341676300947, 236118324143482260},\n\t{10105864273341040758, 188894659314785808},\n\t{15463389048156653253, 151115727451828646},\n\t{17362724847566824558, 241785163922925834},\n\t{17579528692795369969, 193428131138340667},\n\t{6684925324752475329, 154742504910672534},\n\t{18074578149087781173, 247588007857076054},\n\t{18149011334012135262, 198070406285660843},\n\t{3451162622983977240, 158456325028528675},\n\t{5521860196774363583, 253530120045645880},\n\t{4417488157419490867, 202824096036516704},\n\t{7223339340677503017, 162259276829213363},\n\t{7867994130342094503, 259614842926741381},\n\t{2605046489531765280, 207691874341393105},\n\t{2084037191625412224, 166153499473114484},\n\t{10713157136084480204, 265845599156983174},\n\t{12259874523609494487, 212676479325586539},\n\t{13497248433629505913, 170141183460469231},\n\t{14216899864323388813, 272225893536750770},\n\t{11373519891458711051, 217780714829400616},\n\t{5409467098425058518, 174224571863520493},\n\t{4965798542738183305, 278759314981632789},\n\t{7661987648932456967, 223007451985306231},\n\t{2440241304404055250, 178405961588244985},\n\t{3904386087046488400, 285449538541191976},\n\t{17880904128604832013, 228359630832953580},\n\t{14304723302883865611, 182687704666362864},\n\t{15133127457049002812, 146150163733090291},\n\t{16834306301794583852, 233840261972944466},\n\t{9778096226693756759, 187072209578355573},\n\t{15201174610838826053, 149657767662684458},\n\t{2185786488890659746, 239452428260295134},\n\t{5437978005854438120, 191561942608236107},\n\t{15418428848909281466, 153249554086588885},\n\t{6222742084545298729, 245199286538542217},\n\t{16046240111861969953, 196159429230833773},\n\t{1768945645263844993, 156927543384667019},\n\t{10209010661905972635, 251084069415467230},\n\t{8167208529524778108, 200867255532373784},\n\t{10223115638361732810, 160693804425899027},\n\t{1599589762411131202, 257110087081438444},\n\t{4969020624670815285, 205688069665150755},\n\t{3975216499736652228, 164550455732120604},\n\t{13739044029062464211, 263280729171392966},\n\t{7301886408508061046, 210624583337114373},\n\t{13220206756290269483, 168499666669691498},\n\t{17462981995322520850, 269599466671506397},\n\t{6591687966774196033, 215679573337205118},\n\t{12652048002903177473, 172543658669764094},\n\t{9175230360419352987, 276069853871622551},\n\t{3650835473593572067, 220855883097298041},\n\t{17678063637842498946, 176684706477838432},\n\t{13527506561580357021, 282695530364541492},\n\t{3443307619780464970, 226156424291633194},\n\t{6443994910566282300, 180925139433306555},\n\t{5155195928453025840, 144740111546645244},\n\t{15627011115008661990, 231584178474632390},\n\t{12501608892006929592, 185267342779705912},\n\t{2622589484121723027, 148213874223764730},\n\t{4196143174594756843, 237142198758023568},\n\t{10735612169159626121, 189713759006418854},\n\t{12277838550069611220, 151771007205135083},\n\t{15955192865369467629, 242833611528216133},\n\t{1696107848069843133, 194266889222572907},\n\t{12424932722681605476, 155413511378058325},\n\t{1433148282581017146, 248661618204893321},\n\t{15903913885032455010, 198929294563914656},\n\t{9033782293284053685, 159143435651131725},\n\t{14454051669254485895, 254629497041810760},\n\t{11563241335403588716, 203703597633448608},\n\t{16629290697806691620, 162962878106758886},\n\t{781423413297334329, 260740604970814219},\n\t{4314487545379777786, 208592483976651375},\n\t{3451590036303822229, 166873987181321100},\n\t{5522544058086115566, 266998379490113760},\n\t{4418035246468892453, 213598703592091008},\n\t{10913125826658934609, 170878962873672806},\n\t{10082303693170474728, 273406340597876490},\n\t{8065842954536379782, 218725072478301192},\n\t{17520720807854834795, 174980057982640953},\n\t{5897060404116273733, 279968092772225526},\n\t{1028299508551108663, 223974474217780421},\n\t{15580034865808528224, 179179579374224336},\n\t{17549358155809824511, 286687326998758938},\n\t{2971440080422128639, 229349861599007151},\n\t{17134547323305344204, 183479889279205720},\n\t{13707637858644275364, 146783911423364576},\n\t{14553522944347019935, 234854258277383322},\n\t{4264120725993795302, 187883406621906658},\n\t{10789994210278856888, 150306725297525326},\n\t{9885293106962350374, 240490760476040522},\n\t{529536856086059653, 192392608380832418},\n\t{7802327114352668369, 153914086704665934},\n\t{1415676938738538420, 246262538727465495},\n\t{1132541550990830736, 197010030981972396},\n\t{15663428499760305882, 157608024785577916},\n\t{17682787970132668764, 252172839656924666},\n\t{10456881561364224688, 201738271725539733},\n\t{15744202878575200397, 161390617380431786},\n\t{17812026976236499989, 258224987808690858},\n\t{3181575136763469022, 206579990246952687},\n\t{13613306553636506187, 165263992197562149},\n\t{10713244041592678929, 264422387516099439},\n\t{12259944048016053467, 211537910012879551},\n\t{6118606423670932450, 169230328010303641},\n\t{2411072648389671274, 270768524816485826},\n\t{16686253377679378312, 216614819853188660},\n\t{13349002702143502650, 173291855882550928},\n\t{17669055508687693916, 277266969412081485},\n\t{14135244406950155133, 221813575529665188},\n\t{240149081334393137, 177450860423732151},\n\t{11452284974360759988, 283921376677971441},\n\t{5472479164746697667, 227137101342377153},\n\t{11756680961281178780, 181709681073901722},\n\t{2026647139541122378, 145367744859121378},\n\t{18000030682233437097, 232588391774594204},\n\t{18089373360528660001, 186070713419675363},\n\t{3403452244197197031, 148856570735740291},\n\t{16513570034941246220, 238170513177184465},\n\t{13210856027952996976, 190536410541747572},\n\t{3189987192878576934, 152429128433398058},\n\t{1414630693863812771, 243886605493436893},\n\t{8510402184574870864, 195109284394749514},\n\t{10497670562401807014, 156087427515799611},\n\t{9417575270359070576, 249739884025279378},\n\t{14912757845771077107, 199791907220223502},\n\t{4551508647133041040, 159833525776178802},\n\t{10971762650154775986, 255733641241886083},\n\t{16156107749607641435, 204586912993508866},\n\t{9235537384944202825, 163669530394807093},\n\t{11087511001168814197, 261871248631691349},\n\t{12559357615676961681, 209496998905353079},\n\t{13736834907283479668, 167597599124282463},\n\t{18289587036911657145, 268156158598851941},\n\t{10942320814787415393, 214524926879081553},\n\t{16132554281313752961, 171619941503265242},\n\t{11054691591134363444, 274591906405224388},\n\t{16222450902391311402, 219673525124179510},\n\t{12977960721913049122, 175738820099343608},\n\t{17075388340318968271, 281182112158949773},\n\t{2592264228029443648, 224945689727159819},\n\t{5763160197165465241, 179956551781727855},\n\t{9221056315464744386, 287930482850764568},\n\t{14755542681855616155, 230344386280611654},\n\t{15493782960226403247, 184275509024489323},\n\t{1326979923955391628, 147420407219591459},\n\t{9501865507812447252, 235872651551346334},\n\t{11290841220991868125, 188698121241077067},\n\t{1653975347309673853, 150958496992861654},\n\t{10025058185179298811, 241533595188578646},\n\t{4330697733401528726, 193226876150862917},\n\t{14532604630946953951, 154581500920690333},\n\t{1116074521063664381, 247330401473104534},\n\t{4582208431592841828, 197864321178483627},\n\t{14733813189500004432, 158291456942786901},\n\t{16195403473716186445, 253266331108459042},\n\t{5577625149489128510, 202613064886767234},\n\t{8151448934333213131, 162090451909413787},\n\t{16731667109675051333, 259344723055062059},\n\t{17074682502481951390, 207475778444049647},\n\t{6281048372501740465, 165980622755239718},\n\t{6360328581260874421, 265568996408383549},\n\t{8777611679750609860, 212455197126706839},\n\t{10711438158542398211, 169964157701365471},\n\t{9759603424184016492, 271942652322184754},\n\t{11497031554089123517, 217554121857747803},\n\t{16576322872755119460, 174043297486198242},\n\t{11764721337440549842, 278469275977917188},\n\t{16790474699436260520, 222775420782333750},\n\t{13432379759549008416, 178220336625867000},\n\t{3045063541568861850, 285152538601387201},\n\t{17193446092222730773, 228122030881109760},\n\t{13754756873778184618, 182497624704887808},\n\t{18382503128506368341, 145998099763910246},\n\t{3586563302416817083, 233596959622256395},\n\t{2869250641933453667, 186877567697805116},\n\t{17052795772514404226, 149502054158244092},\n\t{12527077977055405469, 239203286653190548},\n\t{17400360011128145022, 191362629322552438},\n\t{2852241564676785048, 153090103458041951},\n\t{15631632947708587046, 244944165532867121},\n\t{8815957543424959314, 195955332426293697},\n\t{18120812478965698421, 156764265941034957},\n\t{14235904707377476180, 250822825505655932},\n\t{4010026136418160298, 200658260404524746},\n\t{17965416168102169531, 160526608323619796},\n\t{2919224165770098987, 256842573317791675},\n\t{2335379332616079190, 205474058654233340},\n\t{1868303466092863352, 164379246923386672},\n\t{6678634360490491686, 263006795077418675},\n\t{5342907488392393349, 210405436061934940},\n\t{4274325990713914679, 168324348849547952},\n\t{10528270399884173809, 269318958159276723},\n\t{15801313949391159694, 215455166527421378},\n\t{1573004715287196786, 172364133221937103},\n\t{17274202803427156150, 275782613155099364},\n\t{17508711057483635243, 220626090524079491},\n\t{10317620031244997871, 176500872419263593},\n\t{12818843235250086271, 282401395870821749},\n\t{13944423402941979340, 225921116696657399},\n\t{14844887537095493795, 180736893357325919},\n\t{15565258844418305359, 144589514685860735},\n\t{6457670077359736959, 231343223497377177},\n\t{16234182506113520537, 185074578797901741},\n\t{9297997190148906106, 148059663038321393},\n\t{11187446689496339446, 236895460861314229},\n\t{12639306166338981880, 189516368689051383},\n\t{17490142562555006151, 151613094951241106},\n\t{2158786396894637579, 242580951921985771},\n\t{16484424376483351356, 194064761537588616},\n\t{9498190686444770762, 155251809230070893},\n\t{11507756283569722895, 248402894768113429},\n\t{12895553841597688639, 198722315814490743},\n\t{17695140702761971558, 158977852651592594},\n\t{17244178680193423523, 254364564242548151},\n\t{10105994129412828495, 203491651394038521},\n\t{4395446488788352473, 162793321115230817},\n\t{10722063196803274280, 260469313784369307},\n\t{1198952927958798777, 208375451027495446},\n\t{15716557601334680315, 166700360821996356},\n\t{17767794532651667857, 266720577315194170},\n\t{14214235626121334286, 213376461852155336},\n\t{7682039686155157106, 170701169481724269},\n\t{1223217053622520399, 273121871170758831},\n\t{15735968901865657612, 218497496936607064},\n\t{16278123936234436413, 174797997549285651},\n\t{219556594781725998, 279676796078857043},\n\t{7554342905309201445, 223741436863085634},\n\t{9732823138989271479, 178993149490468507},\n\t{815121763415193074, 286389039184749612},\n\t{11720143854957885429, 229111231347799689},\n\t{13065463898708218666, 183288985078239751},\n\t{6763022304224664610, 146631188062591801},\n\t{3442138057275642729, 234609900900146882},\n\t{13821756890046245153, 187687920720117505},\n\t{11057405512036996122, 150150336576094004},\n\t{6623802375033462826, 240240538521750407},\n\t{16367088344252501231, 192192430817400325},\n\t{13093670675402000985, 153753944653920260},\n\t{2503129006933649959, 246006311446272417},\n\t{13070549649772650937, 196805049157017933},\n\t{17835137349301941396, 157444039325614346},\n\t{2710778055689733971, 251910462920982955},\n\t{2168622444551787177, 201528370336786364},\n\t{5424246770383340065, 161222696269429091},\n\t{1300097203129523457, 257956314031086546},\n\t{15797473021471260058, 206365051224869236},\n\t{8948629602435097724, 165092040979895389},\n\t{3249760919670425388, 264147265567832623},\n\t{9978506365220160957, 211317812454266098},\n\t{15361502721659949412, 169054249963412878},\n\t{2442311466204457120, 270486799941460606},\n\t{16711244431931206989, 216389439953168484},\n\t{17058344360286875914, 173111551962534787},\n\t{12535955717491360170, 276978483140055660},\n\t{10028764573993088136, 221582786512044528},\n\t{15401709288678291155, 177266229209635622},\n\t{9885339602917624555, 283625966735416996},\n\t{4218922867592189321, 226900773388333597},\n\t{14443184738299482427, 181520618710666877},\n\t{4175850161155765295, 145216494968533502},\n\t{10370709072591134795, 232346391949653603},\n\t{15675264887556728482, 185877113559722882},\n\t{5161514280561562140, 148701690847778306},\n\t{879725219414678777, 237922705356445290},\n\t{703780175531743021, 190338164285156232},\n\t{11631070584651125387, 152270531428124985},\n\t{162968861732249003, 243632850284999977},\n\t{11198421533611530172, 194906280227999981},\n\t{5269388412147313814, 155925024182399985},\n\t{8431021459435702103, 249480038691839976},\n\t{3055468352806651359, 199584030953471981},\n\t{17201769941212962380, 159667224762777584},\n\t{16454785461715008838, 255467559620444135},\n\t{13163828369372007071, 204374047696355308},\n\t{17909760324981426303, 163499238157084246},\n\t{2830174816776909822, 261598781051334795},\n\t{2264139853421527858, 209279024841067836},\n\t{16568707141704863579, 167423219872854268},\n\t{4373838538276319787, 267877151796566830},\n\t{3499070830621055830, 214301721437253464},\n\t{6488605479238754987, 171441377149802771},\n\t{3003071137298187333, 274306203439684434},\n\t{6091805724580460189, 219444962751747547},\n\t{15941491023890099121, 175555970201398037},\n\t{10748990379256517301, 280889552322236860},\n\t{8599192303405213841, 224711641857789488},\n\t{14258051472207991719, 179769313486231590},\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"json","path":"gno.land/p/demo/json","files":[{"name":"LICENSE","body":"# MIT License\n\nCopyright (c) 2019 Pyzhov Stepan\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"},{"name":"README.md","body":"# JSON Parser\n\nThe JSON parser is a package that provides functionality for parsing and processing JSON strings. This package accepts JSON strings as byte slices.\n\nCurrently, gno does not [support the `reflect` package](https://docs.gno.land/concepts/effective-gno#reflection-is-never-clear), so it cannot retrieve type information at runtime. Therefore, it is designed to infer and handle type information when parsing JSON strings using a state machine approach.\n\nAfter passing through the state machine, JSON strings are represented as the `Node` type. The `Node` type represents nodes for JSON data, including various types such as `ObjectNode`, `ArrayNode`, `StringNode`, `NumberNode`, `BoolNode`, and `NullNode`.\n\nThis package provides methods for manipulating, searching, and extracting the Node type.\n\n## State Machine\n\nTo parse JSON strings, a [finite state machine](https://en.wikipedia.org/wiki/Finite-state_machine) approach is used. The state machine transitions to the next state based on the current state and the input character while parsing the JSON string. Through this method, type information can be inferred and processed without reflect, and the amount of parser code can be significantly reduced.\n\nThe image below shows the state transitions of the state machine according to the states and input characters.\n\n```mermaid\nstateDiagram-v2\n [*] --\u003e __: Start\n __ --\u003e ST: String\n __ --\u003e MI: Number\n __ --\u003e ZE: Zero\n __ --\u003e IN: Integer\n __ --\u003e T1: Boolean (true)\n __ --\u003e F1: Boolean (false)\n __ --\u003e N1: Null\n __ --\u003e ec: Empty Object End\n __ --\u003e cc: Object End\n __ --\u003e bc: Array End\n __ --\u003e co: Object Begin\n __ --\u003e bo: Array Begin\n __ --\u003e cm: Comma\n __ --\u003e cl: Colon\n __ --\u003e OK: Success/End\n ST --\u003e OK: String Complete\n MI --\u003e OK: Number Complete\n ZE --\u003e OK: Zero Complete\n IN --\u003e OK: Integer Complete\n T1 --\u003e OK: True Complete\n F1 --\u003e OK: False Complete\n N1 --\u003e OK: Null Complete\n ec --\u003e OK: Empty Object Complete\n cc --\u003e OK: Object Complete\n bc --\u003e OK: Array Complete\n co --\u003e OB: Inside Object\n bo --\u003e AR: Inside Array\n cm --\u003e KE: Expecting New Key\n cm --\u003e VA: Expecting New Value\n cl --\u003e VA: Expecting Value\n OB --\u003e ST: String in Object (Key)\n OB --\u003e ec: Empty Object\n OB --\u003e cc: End Object\n AR --\u003e ST: String in Array\n AR --\u003e bc: End Array\n KE --\u003e ST: String as Key\n VA --\u003e ST: String as Value\n VA --\u003e MI: Number as Value\n VA --\u003e T1: True as Value\n VA --\u003e F1: False as Value\n VA --\u003e N1: Null as Value\n OK --\u003e [*]: End\n```\n\n## Examples\n\nThis package provides parsing functionality along with encoding and decoding functionality. The following examples demonstrate how to use this package.\n\n### Decoding\n\nDecoding (or Unmarshaling) is the functionality that converts an input byte slice JSON string into a `Node` type.\n\nThe converted `Node` type allows you to modify the JSON data or search and extract data that meets specific conditions.\n\n```go\npackage main\n\nimport (\n \"fmt\"\n \"gno.land/p/demo/json\"\n \"gno.land/p/demo/ufmt\"\n)\n\nfunc main() {\n node, err := json.Unmarshal([]byte(`{\"foo\": \"var\"}`))\n if err != nil {\n ufmt.Errorf(\"error: %v\", err)\n }\n\n ufmt.Sprintf(\"node: %v\", node)\n}\n```\n\n### Encoding\n\nEncoding (or Marshaling) is the functionality that converts JSON data represented as a Node type into a byte slice JSON string.\n\n\u003e ⚠️ Caution: Converting a large `Node` type into a JSON string may _impact performance_. or might be cause _unexpected behavior_.\n\n```go\npackage main\n\nimport (\n \"fmt\"\n \"gno.land/p/demo/json\"\n \"gno.land/p/demo/ufmt\"\n)\n\nfunc main() {\n node := ObjectNode(\"\", map[string]*Node{\n \"foo\": StringNode(\"foo\", \"bar\"),\n \"baz\": NumberNode(\"baz\", 100500),\n \"qux\": NullNode(\"qux\"),\n })\n\n b, err := json.Marshal(node)\n if err != nil {\n ufmt.Errorf(\"error: %v\", err)\n }\n\n ufmt.Sprintf(\"json: %s\", string(b))\n}\n```\n\n### Searching\n\nOnce the JSON data converted into a `Node` type, you can **search** and **extract** data that satisfy specific conditions. For example, you can find data with a specific type or data with a specific key.\n\nTo use this functionality, you can use methods in the `GetXXX` prefixed methods. The `MustXXX` methods also provide the same functionality as the former methods, but they will **panic** if data doesn't satisfies the condition.\n\nHere is an example of finding data with a specific key. For more examples, please refer to the [node.gno](node.gno) file.\n\n```go\npackage main\n\nimport (\n \"fmt\"\n \"gno.land/p/demo/json\"\n \"gno.land/p/demo/ufmt\"\n)\n\nfunc main() {\n root, err := Unmarshal([]byte(`{\"foo\": true, \"bar\": null}`))\n if err != nil {\n ufmt.Errorf(\"error: %v\", err)\n }\n\n value, err := root.GetKey(\"foo\")\n if err != nil {\n ufmt.Errorf(\"error occurred while getting key, %s\", err)\n }\n\n if value.MustBool() != true {\n ufmt.Errorf(\"value is not true\")\n }\n\n value, err = root.GetKey(\"bar\")\n if err != nil {\n t.Errorf(\"error occurred while getting key, %s\", err)\n }\n\n _, err = root.GetKey(\"baz\")\n if err == nil {\n t.Errorf(\"key baz is not exist. must be failed\")\n }\n}\n```\n\n## Contributing\n\nPlease submit any issues or pull requests for this package through the GitHub repository at [gnolang/gno](\u003chttps://github.com/gnolang/gno\u003e).\n"},{"name":"buffer.gno","body":"package json\n\nimport (\n\t\"errors\"\n\t\"io\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/ufmt\"\n)\n\ntype buffer struct {\n\tdata []byte\n\tlength int\n\tindex int\n\n\tlast States\n\tstate States\n\tclass Classes\n}\n\n// newBuffer creates a new buffer with the given data\nfunc newBuffer(data []byte) *buffer {\n\treturn \u0026buffer{\n\t\tdata: data,\n\t\tlength: len(data),\n\t\tlast: GO,\n\t\tstate: GO,\n\t}\n}\n\n// first retrieves the first non-whitespace (or other escaped) character in the buffer.\nfunc (b *buffer) first() (byte, error) {\n\tfor ; b.index \u003c b.length; b.index++ {\n\t\tc := b.data[b.index]\n\n\t\tif !(c == whiteSpace || c == carriageReturn || c == newLine || c == tab) {\n\t\t\treturn c, nil\n\t\t}\n\t}\n\n\treturn 0, io.EOF\n}\n\n// current returns the byte of the current index.\nfunc (b *buffer) current() (byte, error) {\n\tif b.index \u003e= b.length {\n\t\treturn 0, io.EOF\n\t}\n\n\treturn b.data[b.index], nil\n}\n\n// next moves to the next byte and returns it.\nfunc (b *buffer) next() (byte, error) {\n\tb.index++\n\treturn b.current()\n}\n\n// step just moves to the next position.\nfunc (b *buffer) step() error {\n\t_, err := b.next()\n\treturn err\n}\n\n// move moves the index by the given position.\nfunc (b *buffer) move(pos int) error {\n\tnewIndex := b.index + pos\n\n\tif newIndex \u003e b.length {\n\t\treturn io.EOF\n\t}\n\n\tb.index = newIndex\n\n\treturn nil\n}\n\n// slice returns the slice from the current index to the given position.\nfunc (b *buffer) slice(pos int) ([]byte, error) {\n\tend := b.index + pos\n\n\tif end \u003e b.length {\n\t\treturn nil, io.EOF\n\t}\n\n\treturn b.data[b.index:end], nil\n}\n\n// sliceFromIndices returns a slice of the buffer's data starting from 'start' up to (but not including) 'stop'.\nfunc (b *buffer) sliceFromIndices(start, stop int) []byte {\n\tif start \u003e b.length {\n\t\tstart = b.length\n\t}\n\n\tif stop \u003e b.length {\n\t\tstop = b.length\n\t}\n\n\treturn b.data[start:stop]\n}\n\n// skip moves the index to skip the given byte.\nfunc (b *buffer) skip(bs byte) error {\n\tfor b.index \u003c b.length {\n\t\tif b.data[b.index] == bs \u0026\u0026 !b.backslash() {\n\t\t\treturn nil\n\t\t}\n\n\t\tb.index++\n\t}\n\n\treturn io.EOF\n}\n\n// skipAny moves the index until it encounters one of the given set of bytes.\nfunc (b *buffer) skipAny(endTokens map[byte]bool) error {\n\tfor b.index \u003c b.length {\n\t\tif _, exists := endTokens[b.data[b.index]]; exists {\n\t\t\treturn nil\n\t\t}\n\n\t\tb.index++\n\t}\n\n\t// build error message\n\tvar tokens []string\n\tfor token := range endTokens {\n\t\ttokens = append(tokens, string(token))\n\t}\n\n\treturn ufmt.Errorf(\n\t\t\"EOF reached before encountering one of the expected tokens: %s\",\n\t\tstrings.Join(tokens, \", \"),\n\t)\n}\n\n// skipAndReturnIndex moves the buffer index forward by one and returns the new index.\nfunc (b *buffer) skipAndReturnIndex() (int, error) {\n\terr := b.step()\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\treturn b.index, nil\n}\n\n// skipUntil moves the buffer index forward until it encounters a byte contained in the endTokens set.\nfunc (b *buffer) skipUntil(endTokens map[byte]bool) (int, error) {\n\tfor b.index \u003c b.length {\n\t\tcurrentByte, err := b.current()\n\t\tif err != nil {\n\t\t\treturn b.index, err\n\t\t}\n\n\t\t// Check if the current byte is in the set of end tokens.\n\t\tif _, exists := endTokens[currentByte]; exists {\n\t\t\treturn b.index, nil\n\t\t}\n\n\t\tb.index++\n\t}\n\n\treturn b.index, io.EOF\n}\n\n// significantTokens is a map where the keys are the significant characters in a JSON path.\n// The values in the map are all true, which allows us to use the map as a set for quick lookups.\nvar significantTokens = map[byte]bool{\n\tdot: true, // access properties of an object\n\tdollarSign: true, // root object\n\tatSign: true, // current object\n\tbracketOpen: true, // start of an array index or filter expression\n\tbracketClose: true, // end of an array index or filter expression\n}\n\n// filterTokens stores the filter expression tokens.\nvar filterTokens = map[byte]bool{\n\taesterisk: true, // wildcard\n\tandSign: true,\n\torSign: true,\n}\n\n// skipToNextSignificantToken advances the buffer index to the next significant character.\n// Significant characters are defined based on the JSON path syntax.\nfunc (b *buffer) skipToNextSignificantToken() {\n\tfor b.index \u003c b.length {\n\t\tcurrent := b.data[b.index]\n\n\t\tif _, ok := significantTokens[current]; ok {\n\t\t\tbreak\n\t\t}\n\n\t\tb.index++\n\t}\n}\n\n// backslash checks to see if the number of backslashes before the current index is odd.\n//\n// This is used to check if the current character is escaped. However, unlike the \"unescape\" function,\n// \"backslash\" only serves to check the number of backslashes.\nfunc (b *buffer) backslash() bool {\n\tif b.index == 0 {\n\t\treturn false\n\t}\n\n\tcount := 0\n\tfor i := b.index - 1; ; i-- {\n\t\tif i \u003e= b.length || b.data[i] != backSlash {\n\t\t\tbreak\n\t\t}\n\n\t\tcount++\n\n\t\tif i == 0 {\n\t\t\tbreak\n\t\t}\n\t}\n\n\treturn count%2 != 0\n}\n\n// numIndex holds a map of valid numeric characters\nvar numIndex = map[byte]bool{\n\t'0': true,\n\t'1': true,\n\t'2': true,\n\t'3': true,\n\t'4': true,\n\t'5': true,\n\t'6': true,\n\t'7': true,\n\t'8': true,\n\t'9': true,\n\t'.': true,\n\t'e': true,\n\t'E': true,\n}\n\n// pathToken checks if the current token is a valid JSON path token.\nfunc (b *buffer) pathToken() error {\n\tvar stack []byte\n\n\tinToken := false\n\tinNumber := false\n\tfirst := b.index\n\n\tfor b.index \u003c b.length {\n\t\tc := b.data[b.index]\n\n\t\tswitch {\n\t\tcase c == doubleQuote || c == singleQuote:\n\t\t\tinToken = true\n\t\t\tif err := b.step(); err != nil {\n\t\t\t\treturn errors.New(\"error stepping through buffer\")\n\t\t\t}\n\n\t\t\tif err := b.skip(c); err != nil {\n\t\t\t\treturn errors.New(\"unmatched quote in path\")\n\t\t\t}\n\n\t\t\tif b.index \u003e= b.length {\n\t\t\t\treturn errors.New(\"unmatched quote in path\")\n\t\t\t}\n\n\t\tcase c == bracketOpen || c == parenOpen:\n\t\t\tinToken = true\n\t\t\tstack = append(stack, c)\n\n\t\tcase c == bracketClose || c == parenClose:\n\t\t\tinToken = true\n\t\t\tif len(stack) == 0 || (c == bracketClose \u0026\u0026 stack[len(stack)-1] != bracketOpen) || (c == parenClose \u0026\u0026 stack[len(stack)-1] != parenOpen) {\n\t\t\t\treturn errors.New(\"mismatched bracket or parenthesis\")\n\t\t\t}\n\n\t\t\tstack = stack[:len(stack)-1]\n\n\t\tcase pathStateContainsValidPathToken(c):\n\t\t\tinToken = true\n\n\t\tcase c == plus || c == minus:\n\t\t\tif inNumber || (b.index \u003e 0 \u0026\u0026 numIndex[b.data[b.index-1]]) {\n\t\t\t\tinToken = true\n\t\t\t} else if !inToken \u0026\u0026 (b.index+1 \u003c b.length \u0026\u0026 numIndex[b.data[b.index+1]]) {\n\t\t\t\tinToken = true\n\t\t\t\tinNumber = true\n\t\t\t} else if !inToken {\n\t\t\t\treturn errors.New(\"unexpected operator at start of token\")\n\t\t\t}\n\n\t\tdefault:\n\t\t\tif len(stack) != 0 || inToken {\n\t\t\t\tinToken = true\n\t\t\t} else {\n\t\t\t\tgoto end\n\t\t\t}\n\t\t}\n\n\t\tb.index++\n\t}\n\nend:\n\tif len(stack) != 0 {\n\t\treturn errors.New(\"unclosed bracket or parenthesis at end of path\")\n\t}\n\n\tif first == b.index {\n\t\treturn errors.New(\"no token found\")\n\t}\n\n\tif inNumber \u0026\u0026 !numIndex[b.data[b.index-1]] {\n\t\tinNumber = false\n\t}\n\n\treturn nil\n}\n\nfunc pathStateContainsValidPathToken(c byte) bool {\n\tif _, ok := significantTokens[c]; ok {\n\t\treturn true\n\t}\n\n\tif _, ok := filterTokens[c]; ok {\n\t\treturn true\n\t}\n\n\tif _, ok := numIndex[c]; ok {\n\t\treturn true\n\t}\n\n\tif 'A' \u003c= c \u0026\u0026 c \u003c= 'Z' || 'a' \u003c= c \u0026\u0026 c \u003c= 'z' {\n\t\treturn true\n\t}\n\n\treturn false\n}\n\nfunc (b *buffer) numeric(token bool) error {\n\tif token {\n\t\tb.last = GO\n\t}\n\n\tfor ; b.index \u003c b.length; b.index++ {\n\t\tb.class = b.getClasses(doubleQuote)\n\t\tif b.class == __ {\n\t\t\treturn errors.New(\"invalid token found while parsing path\")\n\t\t}\n\n\t\tb.state = StateTransitionTable[b.last][b.class]\n\t\tif b.state == __ {\n\t\t\tif token {\n\t\t\t\tbreak\n\t\t\t}\n\n\t\t\treturn errors.New(\"invalid token found while parsing path\")\n\t\t}\n\n\t\tif b.state \u003c __ {\n\t\t\treturn nil\n\t\t}\n\n\t\tif b.state \u003c MI || b.state \u003e E3 {\n\t\t\treturn nil\n\t\t}\n\n\t\tb.last = b.state\n\t}\n\n\tif b.last != ZE \u0026\u0026 b.last != IN \u0026\u0026 b.last != FR \u0026\u0026 b.last != E3 {\n\t\treturn errors.New(\"invalid token found while parsing path\")\n\t}\n\n\treturn nil\n}\n\nfunc (b *buffer) getClasses(c byte) Classes {\n\tif b.data[b.index] \u003e= 128 {\n\t\treturn C_ETC\n\t}\n\n\tif c == singleQuote {\n\t\treturn QuoteAsciiClasses[b.data[b.index]]\n\t}\n\n\treturn AsciiClasses[b.data[b.index]]\n}\n\nfunc (b *buffer) getState() States {\n\tb.last = b.state\n\n\tb.class = b.getClasses(doubleQuote)\n\tif b.class == __ {\n\t\treturn __\n\t}\n\n\tb.state = StateTransitionTable[b.last][b.class]\n\n\treturn b.state\n}\n\n// string parses a string token from the buffer.\nfunc (b *buffer) string(search byte, token bool) error {\n\tif token {\n\t\tb.last = GO\n\t}\n\n\tfor ; b.index \u003c b.length; b.index++ {\n\t\tb.class = b.getClasses(search)\n\n\t\tif b.class == __ {\n\t\t\treturn errors.New(\"invalid token found while parsing path\")\n\t\t}\n\n\t\tb.state = StateTransitionTable[b.last][b.class]\n\t\tif b.state == __ {\n\t\t\treturn errors.New(\"invalid token found while parsing path\")\n\t\t}\n\n\t\tif b.state \u003c __ {\n\t\t\tbreak\n\t\t}\n\n\t\tb.last = b.state\n\t}\n\n\treturn nil\n}\n\nfunc (b *buffer) word(bs []byte) error {\n\tvar c byte\n\n\tmax := len(bs)\n\tindex := 0\n\n\tfor ; b.index \u003c b.length; b.index++ {\n\t\tc = b.data[b.index]\n\n\t\tif c != bs[index] {\n\t\t\treturn errors.New(\"invalid token found while parsing path\")\n\t\t}\n\n\t\tindex++\n\t\tif index \u003e= max {\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif index != max {\n\t\treturn errors.New(\"invalid token found while parsing path\")\n\t}\n\n\treturn nil\n}\n\nfunc numberKind2f64(value interface{}) (result float64, err error) {\n\tswitch typed := value.(type) {\n\tcase float64:\n\t\tresult = typed\n\tcase float32:\n\t\tresult = float64(typed)\n\tcase int:\n\t\tresult = float64(typed)\n\tcase int8:\n\t\tresult = float64(typed)\n\tcase int16:\n\t\tresult = float64(typed)\n\tcase int32:\n\t\tresult = float64(typed)\n\tcase int64:\n\t\tresult = float64(typed)\n\tcase uint:\n\t\tresult = float64(typed)\n\tcase uint8:\n\t\tresult = float64(typed)\n\tcase uint16:\n\t\tresult = float64(typed)\n\tcase uint32:\n\t\tresult = float64(typed)\n\tcase uint64:\n\t\tresult = float64(typed)\n\tdefault:\n\t\terr = ufmt.Errorf(\"invalid number type: %T\", value)\n\t}\n\n\treturn\n}\n"},{"name":"buffer_test.gno","body":"package json\n\nimport \"testing\"\n\nfunc TestBufferCurrent(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tbuffer *buffer\n\t\texpected byte\n\t\twantErr bool\n\t}{\n\t\t{\n\t\t\tname: \"Valid current byte\",\n\t\t\tbuffer: \u0026buffer{\n\t\t\t\tdata: []byte(\"test\"),\n\t\t\t\tlength: 4,\n\t\t\t\tindex: 1,\n\t\t\t},\n\t\t\texpected: 'e',\n\t\t\twantErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"EOF\",\n\t\t\tbuffer: \u0026buffer{\n\t\t\t\tdata: []byte(\"test\"),\n\t\t\t\tlength: 4,\n\t\t\t\tindex: 4,\n\t\t\t},\n\t\t\texpected: 0,\n\t\t\twantErr: true,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tgot, err := tt.buffer.current()\n\t\t\tif (err != nil) != tt.wantErr {\n\t\t\t\tt.Errorf(\"buffer.current() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif got != tt.expected {\n\t\t\t\tt.Errorf(\"buffer.current() = %v, want %v\", got, tt.expected)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestBufferStep(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tbuffer *buffer\n\t\twantErr bool\n\t}{\n\t\t{\n\t\t\tname: \"Valid step\",\n\t\t\tbuffer: \u0026buffer{data: []byte(\"test\"), length: 4, index: 0},\n\t\t\twantErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"EOF error\",\n\t\t\tbuffer: \u0026buffer{data: []byte(\"test\"), length: 4, index: 3},\n\t\t\twantErr: true,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\terr := tt.buffer.step()\n\t\t\tif (err != nil) != tt.wantErr {\n\t\t\t\tt.Errorf(\"buffer.step() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestBufferNext(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tbuffer *buffer\n\t\twant byte\n\t\twantErr bool\n\t}{\n\t\t{\n\t\t\tname: \"Valid next byte\",\n\t\t\tbuffer: \u0026buffer{data: []byte(\"test\"), length: 4, index: 0},\n\t\t\twant: 'e',\n\t\t\twantErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"EOF error\",\n\t\t\tbuffer: \u0026buffer{data: []byte(\"test\"), length: 4, index: 3},\n\t\t\twant: 0,\n\t\t\twantErr: true,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tgot, err := tt.buffer.next()\n\t\t\tif (err != nil) != tt.wantErr {\n\t\t\t\tt.Errorf(\"buffer.next() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif got != tt.want {\n\t\t\t\tt.Errorf(\"buffer.next() = %v, want %v\", got, tt.want)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestBufferSlice(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tbuffer *buffer\n\t\tpos int\n\t\twant []byte\n\t\twantErr bool\n\t}{\n\t\t{\n\t\t\tname: \"Valid slice -- 0 characters\",\n\t\t\tbuffer: \u0026buffer{data: []byte(\"test\"), length: 4, index: 0},\n\t\t\tpos: 0,\n\t\t\twant: nil,\n\t\t\twantErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"Valid slice -- 1 character\",\n\t\t\tbuffer: \u0026buffer{data: []byte(\"test\"), length: 4, index: 0},\n\t\t\tpos: 1,\n\t\t\twant: []byte(\"t\"),\n\t\t\twantErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"Valid slice -- 2 characters\",\n\t\t\tbuffer: \u0026buffer{data: []byte(\"test\"), length: 4, index: 1},\n\t\t\tpos: 2,\n\t\t\twant: []byte(\"es\"),\n\t\t\twantErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"Valid slice -- 3 characters\",\n\t\t\tbuffer: \u0026buffer{data: []byte(\"test\"), length: 4, index: 0},\n\t\t\tpos: 3,\n\t\t\twant: []byte(\"tes\"),\n\t\t\twantErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"Valid slice -- 4 characters\",\n\t\t\tbuffer: \u0026buffer{data: []byte(\"test\"), length: 4, index: 0},\n\t\t\tpos: 4,\n\t\t\twant: []byte(\"test\"),\n\t\t\twantErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"EOF error\",\n\t\t\tbuffer: \u0026buffer{data: []byte(\"test\"), length: 4, index: 3},\n\t\t\tpos: 2,\n\t\t\twant: nil,\n\t\t\twantErr: true,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tgot, err := tt.buffer.slice(tt.pos)\n\t\t\tif (err != nil) != tt.wantErr {\n\t\t\t\tt.Errorf(\"buffer.slice() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif string(got) != string(tt.want) {\n\t\t\t\tt.Errorf(\"buffer.slice() = %v, want %v\", got, tt.want)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestBufferMove(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tbuffer *buffer\n\t\tpos int\n\t\twantErr bool\n\t\twantIdx int\n\t}{\n\t\t{\n\t\t\tname: \"Valid move\",\n\t\t\tbuffer: \u0026buffer{data: []byte(\"test\"), length: 4, index: 1},\n\t\t\tpos: 2,\n\t\t\twantErr: false,\n\t\t\twantIdx: 3,\n\t\t},\n\t\t{\n\t\t\tname: \"Move beyond length\",\n\t\t\tbuffer: \u0026buffer{data: []byte(\"test\"), length: 4, index: 1},\n\t\t\tpos: 4,\n\t\t\twantErr: true,\n\t\t\twantIdx: 1,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\terr := tt.buffer.move(tt.pos)\n\t\t\tif (err != nil) != tt.wantErr {\n\t\t\t\tt.Errorf(\"buffer.move() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t}\n\t\t\tif tt.buffer.index != tt.wantIdx {\n\t\t\t\tt.Errorf(\"buffer.move() index = %v, want %v\", tt.buffer.index, tt.wantIdx)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestBufferSkip(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tbuffer *buffer\n\t\tb byte\n\t\twantErr bool\n\t}{\n\t\t{\n\t\t\tname: \"Skip byte\",\n\t\t\tbuffer: \u0026buffer{data: []byte(\"test\"), length: 4, index: 0},\n\t\t\tb: 'e',\n\t\t\twantErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"Skip to EOF\",\n\t\t\tbuffer: \u0026buffer{data: []byte(\"test\"), length: 4, index: 0},\n\t\t\tb: 'x',\n\t\t\twantErr: true,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\terr := tt.buffer.skip(tt.b)\n\t\t\tif (err != nil) != tt.wantErr {\n\t\t\t\tt.Errorf(\"buffer.skip() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestBufferSkipAny(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tbuffer *buffer\n\t\ts map[byte]bool\n\t\twantErr bool\n\t}{\n\t\t{\n\t\t\tname: \"Skip any valid byte\",\n\t\t\tbuffer: \u0026buffer{data: []byte(\"test\"), length: 4, index: 0},\n\t\t\ts: map[byte]bool{'e': true, 'o': true},\n\t\t\twantErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"Skip any to EOF\",\n\t\t\tbuffer: \u0026buffer{data: []byte(\"test\"), length: 4, index: 0},\n\t\t\ts: map[byte]bool{'x': true, 'y': true},\n\t\t\twantErr: true,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\terr := tt.buffer.skipAny(tt.s)\n\t\t\tif (err != nil) != tt.wantErr {\n\t\t\t\tt.Errorf(\"buffer.skipAny() error = %v, wantErr %v\", err, tt.wantErr)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestSkipToNextSignificantToken(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tinput []byte\n\t\texpected int\n\t}{\n\t\t{\"No significant chars\", []byte(\"abc\"), 3},\n\t\t{\"One significant char at start\", []byte(\".abc\"), 0},\n\t\t{\"Significant char in middle\", []byte(\"ab.c\"), 2},\n\t\t{\"Multiple significant chars\", []byte(\"a$.c\"), 1},\n\t\t{\"Significant char at end\", []byte(\"abc$\"), 3},\n\t\t{\"Only significant chars\", []byte(\"$.\"), 0},\n\t\t{\"Empty string\", []byte(\"\"), 0},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tb := newBuffer(tt.input)\n\t\t\tb.skipToNextSignificantToken()\n\t\t\tif b.index != tt.expected {\n\t\t\t\tt.Errorf(\"after skipToNextSignificantToken(), got index = %v, want %v\", b.index, tt.expected)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc mockBuffer(s string) *buffer {\n\treturn newBuffer([]byte(s))\n}\n\nfunc TestSkipAndReturnIndex(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tinput string\n\t\texpected int\n\t}{\n\t\t{\"StartOfString\", \"\", 0},\n\t\t{\"MiddleOfString\", \"abcdef\", 1},\n\t\t{\"EndOfString\", \"abc\", 1},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tbuf := mockBuffer(tt.input)\n\t\t\tgot, err := buf.skipAndReturnIndex()\n\t\t\tif err != nil \u0026\u0026 tt.input != \"\" { // Expect no error unless input is empty\n\t\t\t\tt.Errorf(\"skipAndReturnIndex() error = %v\", err)\n\t\t\t}\n\t\t\tif got != tt.expected {\n\t\t\t\tt.Errorf(\"skipAndReturnIndex() = %v, want %v\", got, tt.expected)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestSkipUntil(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tinput string\n\t\ttokens map[byte]bool\n\t\texpected int\n\t}{\n\t\t{\"SkipToToken\", \"abcdefg\", map[byte]bool{'c': true}, 2},\n\t\t{\"SkipToEnd\", \"abcdefg\", map[byte]bool{'h': true}, 7},\n\t\t{\"SkipNone\", \"abcdefg\", map[byte]bool{'a': true}, 0},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tbuf := mockBuffer(tt.input)\n\t\t\tgot, err := buf.skipUntil(tt.tokens)\n\t\t\tif err != nil \u0026\u0026 got != len(tt.input) { // Expect error only if reached end without finding token\n\t\t\t\tt.Errorf(\"skipUntil() error = %v\", err)\n\t\t\t}\n\t\t\tif got != tt.expected {\n\t\t\t\tt.Errorf(\"skipUntil() = %v, want %v\", got, tt.expected)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestSliceFromIndices(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tinput string\n\t\tstart int\n\t\tend int\n\t\texpected string\n\t}{\n\t\t{\"FullString\", \"abcdefg\", 0, 7, \"abcdefg\"},\n\t\t{\"Substring\", \"abcdefg\", 2, 5, \"cde\"},\n\t\t{\"OutOfBounds\", \"abcdefg\", 5, 10, \"fg\"},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tbuf := mockBuffer(tt.input)\n\t\t\tgot := buf.sliceFromIndices(tt.start, tt.end)\n\t\t\tif string(got) != tt.expected {\n\t\t\t\tt.Errorf(\"sliceFromIndices() = %v, want %v\", string(got), tt.expected)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestBufferToken(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tpath string\n\t\tindex int\n\t\tisErr bool\n\t}{\n\t\t{\n\t\t\tname: \"Simple valid path\",\n\t\t\tpath: \"@.length\",\n\t\t\tindex: 8,\n\t\t\tisErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"Path with array expr\",\n\t\t\tpath: \"@['foo'].0.bar\",\n\t\t\tindex: 14,\n\t\t\tisErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"Path with array expr and simple fomula\",\n\t\t\tpath: \"@['foo'].[(@.length - 1)].*\",\n\t\t\tindex: 27,\n\t\t\tisErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"Path with filter expr\",\n\t\t\tpath: \"@['foo'].[?(@.bar == 1 \u0026 @.baz \u003c @.length)].*\",\n\t\t\tindex: 45,\n\t\t\tisErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"addition of foo and bar\",\n\t\t\tpath: \"@.foo+@.bar\",\n\t\t\tindex: 11,\n\t\t\tisErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"logical AND of foo and bar\",\n\t\t\tpath: \"@.foo \u0026\u0026 @.bar\",\n\t\t\tindex: 14,\n\t\t\tisErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"logical OR of foo and bar\",\n\t\t\tpath: \"@.foo || @.bar\",\n\t\t\tindex: 14,\n\t\t\tisErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"accessing third element of foo\",\n\t\t\tpath: \"@.foo,3\",\n\t\t\tindex: 7,\n\t\t\tisErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"accessing last element of array\",\n\t\t\tpath: \"@.length-1\",\n\t\t\tindex: 10,\n\t\t\tisErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"number 1\",\n\t\t\tpath: \"1\",\n\t\t\tindex: 1,\n\t\t\tisErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"float\",\n\t\t\tpath: \"3.1e4\",\n\t\t\tindex: 5,\n\t\t\tisErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"float with minus\",\n\t\t\tpath: \"3.1e-4\",\n\t\t\tindex: 6,\n\t\t\tisErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"float with plus\",\n\t\t\tpath: \"3.1e+4\",\n\t\t\tindex: 6,\n\t\t\tisErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"negative number\",\n\t\t\tpath: \"-12345\",\n\t\t\tindex: 6,\n\t\t\tisErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"negative float\",\n\t\t\tpath: \"-3.1e4\",\n\t\t\tindex: 6,\n\t\t\tisErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"negative float with minus\",\n\t\t\tpath: \"-3.1e-4\",\n\t\t\tindex: 7,\n\t\t\tisErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"negative float with plus\",\n\t\t\tpath: \"-3.1e+4\",\n\t\t\tindex: 7,\n\t\t\tisErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"string number\",\n\t\t\tpath: \"'12345'\",\n\t\t\tindex: 7,\n\t\t\tisErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"string with backslash\",\n\t\t\tpath: \"'foo \\\\'bar '\",\n\t\t\tindex: 12,\n\t\t\tisErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"string with inner double quotes\",\n\t\t\tpath: \"'foo \\\"bar \\\"'\",\n\t\t\tindex: 12,\n\t\t\tisErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"parenthesis 1\",\n\t\t\tpath: \"(@abc)\",\n\t\t\tindex: 6,\n\t\t\tisErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"parenthesis 2\",\n\t\t\tpath: \"[()]\",\n\t\t\tindex: 4,\n\t\t\tisErr: false,\n\t\t},\n\t\t{\n\t\t\tname: \"parenthesis mismatch\",\n\t\t\tpath: \"[(])\",\n\t\t\tindex: 2,\n\t\t\tisErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"parenthesis mismatch 2\",\n\t\t\tpath: \"(\",\n\t\t\tindex: 1,\n\t\t\tisErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"parenthesis mismatch 3\",\n\t\t\tpath: \"())]\",\n\t\t\tindex: 2,\n\t\t\tisErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"bracket mismatch\",\n\t\t\tpath: \"[()\",\n\t\t\tindex: 3,\n\t\t\tisErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"bracket mismatch 2\",\n\t\t\tpath: \"()]\",\n\t\t\tindex: 2,\n\t\t\tisErr: true,\n\t\t},\n\t\t{\n\t\t\tname: \"path does not close bracket\",\n\t\t\tpath: \"@.foo[)\",\n\t\t\tindex: 6,\n\t\t\tisErr: false,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tbuf := newBuffer([]byte(tt.path))\n\n\t\t\terr := buf.pathToken()\n\t\t\tif tt.isErr {\n\t\t\t\tif err == nil {\n\t\t\t\t\tt.Errorf(\"Expected an error for path `%s`, but got none\", tt.path)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif err == nil \u0026\u0026 tt.isErr {\n\t\t\t\tt.Errorf(\"Expected an error for path `%s`, but got none\", tt.path)\n\t\t\t}\n\n\t\t\tif buf.index != tt.index {\n\t\t\t\tt.Errorf(\"Expected final index %d, got %d (token: `%s`) for path `%s`\", tt.index, buf.index, string(buf.data[buf.index]), tt.path)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestBufferFirst(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tdata []byte\n\t\texpected byte\n\t}{\n\t\t{\n\t\t\tname: \"Valid first byte\",\n\t\t\tdata: []byte(\"test\"),\n\t\t\texpected: 't',\n\t\t},\n\t\t{\n\t\t\tname: \"Empty buffer\",\n\t\t\tdata: []byte(\"\"),\n\t\t\texpected: 0,\n\t\t},\n\t\t{\n\t\t\tname: \"Whitespace buffer\",\n\t\t\tdata: []byte(\" \"),\n\t\t\texpected: 0,\n\t\t},\n\t\t{\n\t\t\tname: \"whitespace in middle\",\n\t\t\tdata: []byte(\"hello world\"),\n\t\t\texpected: 'h',\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tb := newBuffer(tt.data)\n\n\t\t\tgot, err := b.first()\n\t\t\tif err != nil \u0026\u0026 tt.expected != 0 {\n\t\t\t\tt.Errorf(\"Unexpected error: %v\", err)\n\t\t\t}\n\n\t\t\tif got != tt.expected {\n\t\t\t\tt.Errorf(\"Expected first byte to be %q, got %q\", tt.expected, got)\n\t\t\t}\n\t\t})\n\t}\n}\n"},{"name":"decode.gno","body":"// ref: https://github.com/spyzhov/ajson/blob/master/decode.go\n\npackage json\n\nimport (\n\t\"errors\"\n\t\"io\"\n\n\t\"gno.land/p/demo/ufmt\"\n)\n\n// This limits the max nesting depth to prevent stack overflow.\n// This is permitted by https://tools.ietf.org/html/rfc7159#section-9\nconst maxNestingDepth = 10000\n\n// Unmarshal parses the JSON-encoded data and returns a Node.\n// The data must be a valid JSON-encoded value.\n//\n// Usage:\n//\n//\tnode, err := json.Unmarshal([]byte(`{\"key\": \"value\"}`))\n//\tif err != nil {\n//\t\tufmt.Println(err)\n//\t}\n//\tprintln(node) // {\"key\": \"value\"}\nfunc Unmarshal(data []byte) (*Node, error) {\n\tbuf := newBuffer(data)\n\n\tvar (\n\t\tstate States\n\t\tkey *string\n\t\tcurrent *Node\n\t\tnesting int\n\t\tuseKey = func() **string {\n\t\t\ttmp := cptrs(key)\n\t\t\tkey = nil\n\t\t\treturn \u0026tmp\n\t\t}\n\t\terr error\n\t)\n\n\tif _, err = buf.first(); err != nil {\n\t\treturn nil, io.EOF\n\t}\n\n\tfor {\n\t\tstate = buf.getState()\n\t\tif state == __ {\n\t\t\treturn nil, unexpectedTokenError(buf.data, buf.index)\n\t\t}\n\n\t\t// region state machine\n\t\tif state \u003e= GO {\n\t\t\tswitch buf.state {\n\t\t\tcase ST: // string\n\t\t\t\tif current != nil \u0026\u0026 current.IsObject() \u0026\u0026 key == nil {\n\t\t\t\t\t// key detected\n\t\t\t\t\tif key, err = getString(buf); err != nil {\n\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t}\n\n\t\t\t\t\tbuf.state = CO\n\t\t\t\t} else {\n\t\t\t\t\tcurrent, nesting, err = createNestedNode(current, buf, String, nesting, useKey())\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t}\n\n\t\t\t\t\terr = buf.string(doubleQuote, false)\n\t\t\t\t\tif err != nil {\n\t\t\t\t\t\treturn nil, err\n\t\t\t\t\t}\n\n\t\t\t\t\tcurrent, nesting = updateNode(current, buf, nesting, true)\n\t\t\t\t\tbuf.state = OK\n\t\t\t\t}\n\n\t\t\tcase MI, ZE, IN: // number\n\t\t\t\tcurrent, err = processNumericNode(current, buf, useKey())\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\n\t\t\tcase T1, F1: // boolean\n\t\t\t\tliteral := falseLiteral\n\t\t\t\tif buf.state == T1 {\n\t\t\t\t\tliteral = trueLiteral\n\t\t\t\t}\n\n\t\t\t\tcurrent, nesting, err = processLiteralNode(current, buf, Boolean, literal, useKey(), nesting)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\n\t\t\tcase N1: // null\n\t\t\t\tcurrent, nesting, err = processLiteralNode(current, buf, Null, nullLiteral, useKey(), nesting)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\t// region action\n\t\t\tswitch state {\n\t\t\tcase ec, cc: // \u003cempty\u003e }\n\t\t\t\tif key != nil {\n\t\t\t\t\treturn nil, unexpectedTokenError(buf.data, buf.index)\n\t\t\t\t}\n\n\t\t\t\tcurrent, nesting, err = updateNodeAndSetBufferState(current, buf, nesting, Object)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\n\t\t\tcase bc: // ]\n\t\t\t\tcurrent, nesting, err = updateNodeAndSetBufferState(current, buf, nesting, Array)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\n\t\t\tcase co, bo: // { [\n\t\t\t\tvalTyp, bState := Object, OB\n\t\t\t\tif state == bo {\n\t\t\t\t\tvalTyp, bState = Array, AR\n\t\t\t\t}\n\n\t\t\t\tcurrent, nesting, err = createNestedNode(current, buf, valTyp, nesting, useKey())\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\n\t\t\t\tbuf.state = bState\n\n\t\t\tcase cm: // ,\n\t\t\t\tif current == nil {\n\t\t\t\t\treturn nil, unexpectedTokenError(buf.data, buf.index)\n\t\t\t\t}\n\n\t\t\t\tif !current.isContainer() {\n\t\t\t\t\treturn nil, unexpectedTokenError(buf.data, buf.index)\n\t\t\t\t}\n\n\t\t\t\tif current.IsObject() {\n\t\t\t\t\tbuf.state = KE // key expected\n\t\t\t\t} else {\n\t\t\t\t\tbuf.state = VA // value expected\n\t\t\t\t}\n\n\t\t\tcase cl: // :\n\t\t\t\tif current == nil || !current.IsObject() || key == nil {\n\t\t\t\t\treturn nil, unexpectedTokenError(buf.data, buf.index)\n\t\t\t\t}\n\n\t\t\t\tbuf.state = VA\n\n\t\t\tdefault:\n\t\t\t\treturn nil, unexpectedTokenError(buf.data, buf.index)\n\t\t\t}\n\t\t}\n\n\t\tif buf.step() != nil {\n\t\t\tbreak\n\t\t}\n\n\t\tif _, err = buf.first(); err != nil {\n\t\t\terr = nil\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif current == nil || buf.state != OK {\n\t\treturn nil, io.EOF\n\t}\n\n\troot := current.root()\n\tif !root.ready() {\n\t\treturn nil, io.EOF\n\t}\n\n\treturn root, err\n}\n\n// UnmarshalSafe parses the JSON-encoded data and returns a Node.\nfunc UnmarshalSafe(data []byte) (*Node, error) {\n\tvar safe []byte\n\tsafe = append(safe, data...)\n\treturn Unmarshal(safe)\n}\n\n// processNumericNode creates a new node, processes a numeric value,\n// sets the node's borders, and moves to the previous node.\nfunc processNumericNode(current *Node, buf *buffer, key **string) (*Node, error) {\n\tvar err error\n\tcurrent, err = createNode(current, buf, Number, key)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tif err = buf.numeric(false); err != nil {\n\t\treturn nil, err\n\t}\n\n\tcurrent.borders[1] = buf.index\n\tif current.prev != nil {\n\t\tcurrent = current.prev\n\t}\n\n\tbuf.index -= 1\n\tbuf.state = OK\n\n\treturn current, nil\n}\n\n// processLiteralNode creates a new node, processes a literal value,\n// sets the node's borders, and moves to the previous node.\nfunc processLiteralNode(\n\tcurrent *Node,\n\tbuf *buffer,\n\tliteralType ValueType,\n\tliteralValue []byte,\n\tuseKey **string,\n\tnesting int,\n) (*Node, int, error) {\n\tvar err error\n\tcurrent, nesting, err = createLiteralNode(current, buf, literalType, literalValue, useKey, nesting)\n\tif err != nil {\n\t\treturn nil, nesting, err\n\t}\n\treturn current, nesting, nil\n}\n\n// isValidContainerType checks if the current node is a valid container (object or array).\n// The container must satisfy the following conditions:\n// 1. The current node must not be nil.\n// 2. The current node must be an object or array.\n// 3. The current node must not be ready.\nfunc isValidContainerType(current *Node, nodeType ValueType) bool {\n\tswitch nodeType {\n\tcase Object:\n\t\treturn current != nil \u0026\u0026 current.IsObject() \u0026\u0026 !current.ready()\n\tcase Array:\n\t\treturn current != nil \u0026\u0026 current.IsArray() \u0026\u0026 !current.ready()\n\tdefault:\n\t\treturn false\n\t}\n}\n\n// getString extracts a string from the buffer and advances the buffer index past the string.\nfunc getString(b *buffer) (*string, error) {\n\tstart := b.index\n\tif err := b.string(doubleQuote, false); err != nil {\n\t\treturn nil, err\n\t}\n\n\tvalue, ok := Unquote(b.data[start:b.index+1], doubleQuote)\n\tif !ok {\n\t\treturn nil, unexpectedTokenError(b.data, start)\n\t}\n\n\treturn \u0026value, nil\n}\n\n// createNode creates a new node and sets the key if it is not nil.\nfunc createNode(\n\tcurrent *Node,\n\tbuf *buffer,\n\tnodeType ValueType,\n\tkey **string,\n) (*Node, error) {\n\tvar err error\n\tcurrent, err = NewNode(current, buf, nodeType, key)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\treturn current, nil\n}\n\n// createNestedNode creates a new nested node (array or object) and sets the key if it is not nil.\nfunc createNestedNode(\n\tcurrent *Node,\n\tbuf *buffer,\n\tnodeType ValueType,\n\tnesting int,\n\tkey **string,\n) (*Node, int, error) {\n\tvar err error\n\tif nesting, err = checkNestingDepth(nesting); err != nil {\n\t\treturn nil, nesting, err\n\t}\n\n\tif current, err = createNode(current, buf, nodeType, key); err != nil {\n\t\treturn nil, nesting, err\n\t}\n\n\treturn current, nesting, nil\n}\n\n// createLiteralNode creates a new literal node and sets the key if it is not nil.\n// The literal is a byte slice that represents a boolean or null value.\nfunc createLiteralNode(\n\tcurrent *Node,\n\tbuf *buffer,\n\tliteralType ValueType,\n\tliteral []byte,\n\tuseKey **string,\n\tnesting int,\n) (*Node, int, error) {\n\tvar err error\n\tif current, err = createNode(current, buf, literalType, useKey); err != nil {\n\t\treturn nil, 0, err\n\t}\n\n\tif err = buf.word(literal); err != nil {\n\t\treturn nil, 0, err\n\t}\n\n\tcurrent, nesting = updateNode(current, buf, nesting, false)\n\tbuf.state = OK\n\n\treturn current, nesting, nil\n}\n\n// updateNode updates the current node and returns the previous node.\nfunc updateNode(\n\tcurrent *Node, buf *buffer, nesting int, decreaseLevel bool,\n) (*Node, int) {\n\tcurrent.borders[1] = buf.index + 1\n\n\tprev := current.prev\n\tif prev == nil {\n\t\treturn current, nesting\n\t}\n\n\tcurrent = prev\n\tif decreaseLevel {\n\t\tnesting--\n\t}\n\n\treturn current, nesting\n}\n\n// updateNodeAndSetBufferState updates the current node and sets the buffer state to OK.\nfunc updateNodeAndSetBufferState(\n\tcurrent *Node,\n\tbuf *buffer,\n\tnesting int,\n\ttyp ValueType,\n) (*Node, int, error) {\n\tif !isValidContainerType(current, typ) {\n\t\treturn nil, nesting, unexpectedTokenError(buf.data, buf.index)\n\t}\n\n\tcurrent, nesting = updateNode(current, buf, nesting, true)\n\tbuf.state = OK\n\n\treturn current, nesting, nil\n}\n\n// checkNestingDepth checks if the nesting depth is within the maximum allowed depth.\nfunc checkNestingDepth(nesting int) (int, error) {\n\tif nesting \u003e= maxNestingDepth {\n\t\treturn nesting, errors.New(\"maximum nesting depth exceeded\")\n\t}\n\n\treturn nesting + 1, nil\n}\n\nfunc unexpectedTokenError(data []byte, index int) error {\n\treturn ufmt.Errorf(\"unexpected token at index %d. data %b\", index, data)\n}\n"},{"name":"decode_test.gno","body":"package json\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n)\n\ntype testNode struct {\n\tname string\n\tinput []byte\n\t_type ValueType\n\tvalue []byte\n}\n\nfunc simpleValid(test *testNode, t *testing.T) {\n\troot, err := Unmarshal(test.input)\n\tif err != nil {\n\t\tt.Errorf(\"Error on Unmarshal(%s): %s\", test.input, err.Error())\n\t} else if root == nil {\n\t\tt.Errorf(\"Error on Unmarshal(%s): root is nil\", test.name)\n\t} else if root.nodeType != test._type {\n\t\tt.Errorf(\"Error on Unmarshal(%s): wrong type\", test.name)\n\t} else if !bytes.Equal(root.source(), test.value) {\n\t\tt.Errorf(\"Error on Unmarshal(%s): %s != %s\", test.name, root.source(), test.value)\n\t}\n}\n\nfunc simpleInvalid(test *testNode, t *testing.T) {\n\troot, err := Unmarshal(test.input)\n\tif err == nil {\n\t\tt.Errorf(\"Error on Unmarshal(%s): error expected, got '%s'\", test.name, root.source())\n\t} else if root != nil {\n\t\tt.Errorf(\"Error on Unmarshal(%s): root is not nil\", test.name)\n\t}\n}\n\nfunc simpleCorrupted(name string) *testNode {\n\treturn \u0026testNode{name: name, input: []byte(name)}\n}\n\nfunc TestUnmarshal_StringSimpleSuccess(t *testing.T) {\n\ttests := []*testNode{\n\t\t{name: \"blank\", input: []byte(\"\\\"\\\"\"), _type: String, value: []byte(\"\\\"\\\"\")},\n\t\t{name: \"char\", input: []byte(\"\\\"c\\\"\"), _type: String, value: []byte(\"\\\"c\\\"\")},\n\t\t{name: \"word\", input: []byte(\"\\\"cat\\\"\"), _type: String, value: []byte(\"\\\"cat\\\"\")},\n\t\t{name: \"spaces\", input: []byte(\" \\\"good cat or dog\\\"\\r\\n \"), _type: String, value: []byte(\"\\\"good cat or dog\\\"\")},\n\t\t{name: \"backslash\", input: []byte(\"\\\"good \\\\\\\"cat\\\\\\\"\\\"\"), _type: String, value: []byte(\"\\\"good \\\\\\\"cat\\\\\\\"\\\"\")},\n\t\t{name: \"backslash 2\", input: []byte(\"\\\"good \\\\\\\\\\\\\\\"cat\\\\\\\"\\\"\"), _type: String, value: []byte(\"\\\"good \\\\\\\\\\\\\\\"cat\\\\\\\"\\\"\")},\n\t}\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tsimpleValid(test, t)\n\t\t})\n\t}\n}\n\nfunc TestUnmarshal_NumericSimpleSuccess(t *testing.T) {\n\ttests := []*testNode{\n\t\t{name: \"1\", input: []byte(\"1\"), _type: Number, value: []byte(\"1\")},\n\t\t{name: \"-1\", input: []byte(\"-1\"), _type: Number, value: []byte(\"-1\")},\n\n\t\t{name: \"1234567890\", input: []byte(\"1234567890\"), _type: Number, value: []byte(\"1234567890\")},\n\t\t{name: \"-123\", input: []byte(\"-123\"), _type: Number, value: []byte(\"-123\")},\n\n\t\t{name: \"123.456\", input: []byte(\"123.456\"), _type: Number, value: []byte(\"123.456\")},\n\t\t{name: \"-123.456\", input: []byte(\"-123.456\"), _type: Number, value: []byte(\"-123.456\")},\n\n\t\t{name: \"1e3\", input: []byte(\"1e3\"), _type: Number, value: []byte(\"1e3\")},\n\t\t{name: \"1e+3\", input: []byte(\"1e+3\"), _type: Number, value: []byte(\"1e+3\")},\n\t\t{name: \"1e-3\", input: []byte(\"1e-3\"), _type: Number, value: []byte(\"1e-3\")},\n\t\t{name: \"-1e3\", input: []byte(\"-1e3\"), _type: Number, value: []byte(\"-1e3\")},\n\t\t{name: \"-1e-3\", input: []byte(\"-1e-3\"), _type: Number, value: []byte(\"-1e-3\")},\n\n\t\t{name: \"1.123e3456\", input: []byte(\"1.123e3456\"), _type: Number, value: []byte(\"1.123e3456\")},\n\t\t{name: \"1.123e-3456\", input: []byte(\"1.123e-3456\"), _type: Number, value: []byte(\"1.123e-3456\")},\n\t\t{name: \"-1.123e3456\", input: []byte(\"-1.123e3456\"), _type: Number, value: []byte(\"-1.123e3456\")},\n\t\t{name: \"-1.123e-3456\", input: []byte(\"-1.123e-3456\"), _type: Number, value: []byte(\"-1.123e-3456\")},\n\n\t\t{name: \"1E3\", input: []byte(\"1E3\"), _type: Number, value: []byte(\"1E3\")},\n\t\t{name: \"1E-3\", input: []byte(\"1E-3\"), _type: Number, value: []byte(\"1E-3\")},\n\t\t{name: \"-1E3\", input: []byte(\"-1E3\"), _type: Number, value: []byte(\"-1E3\")},\n\t\t{name: \"-1E-3\", input: []byte(\"-1E-3\"), _type: Number, value: []byte(\"-1E-3\")},\n\n\t\t{name: \"1.123E3456\", input: []byte(\"1.123E3456\"), _type: Number, value: []byte(\"1.123E3456\")},\n\t\t{name: \"1.123E-3456\", input: []byte(\"1.123E-3456\"), _type: Number, value: []byte(\"1.123E-3456\")},\n\t\t{name: \"-1.123E3456\", input: []byte(\"-1.123E3456\"), _type: Number, value: []byte(\"-1.123E3456\")},\n\t\t{name: \"-1.123E-3456\", input: []byte(\"-1.123E-3456\"), _type: Number, value: []byte(\"-1.123E-3456\")},\n\n\t\t{name: \"-1.123E-3456 with spaces\", input: []byte(\" \\r -1.123E-3456 \\t\\n\"), _type: Number, value: []byte(\"-1.123E-3456\")},\n\t}\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\troot, err := Unmarshal(test.input)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"Error on Unmarshal(%s): %s\", test.name, err.Error())\n\t\t\t} else if root == nil {\n\t\t\t\tt.Errorf(\"Error on Unmarshal(%s): root is nil\", test.name)\n\t\t\t} else if root.nodeType != test._type {\n\t\t\t\tt.Errorf(\"Error on Unmarshal(%s): wrong type\", test.name)\n\t\t\t} else if !bytes.Equal(root.source(), test.value) {\n\t\t\t\tt.Errorf(\"Error on Unmarshal(%s): %s != %s\", test.name, root.source(), test.value)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestUnmarshal_StringSimpleCorrupted(t *testing.T) {\n\ttests := []*testNode{\n\t\t{name: \"white NL\", input: []byte(\"\\\"foo\\nbar\\\"\")},\n\t\t{name: \"white R\", input: []byte(\"\\\"foo\\rbar\\\"\")},\n\t\t{name: \"white Tab\", input: []byte(\"\\\"foo\\tbar\\\"\")},\n\t\t{name: \"wrong quotes\", input: []byte(\"'cat'\")},\n\t\t{name: \"double string\", input: []byte(\"\\\"Hello\\\" \\\"World\\\"\")},\n\t\t{name: \"quotes in quotes\", input: []byte(\"\\\"good \\\"cat\\\"\\\"\")},\n\t}\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tsimpleInvalid(test, t)\n\t\t})\n\t}\n}\n\nfunc TestUnmarshal_ObjectSimpleSuccess(t *testing.T) {\n\ttests := []*testNode{\n\t\t{name: \"{}\", input: []byte(\"{}\"), _type: Object, value: []byte(\"{}\")},\n\t\t{name: `{ \\r\\n }`, input: []byte(\"{ \\r\\n }\"), _type: Object, value: []byte(\"{ \\r\\n }\")},\n\t\t{name: `{\"key\":1}`, input: []byte(`{\"key\":1}`), _type: Object, value: []byte(`{\"key\":1}`)},\n\t\t{name: `{\"key\":true}`, input: []byte(`{\"key\":true}`), _type: Object, value: []byte(`{\"key\":true}`)},\n\t\t{name: `{\"key\":\"value\"}`, input: []byte(`{\"key\":\"value\"}`), _type: Object, value: []byte(`{\"key\":\"value\"}`)},\n\t\t{name: `{\"foo\":\"bar\",\"baz\":\"foo\"}`, input: []byte(`{\"foo\":\"bar\", \"baz\":\"foo\"}`), _type: Object, value: []byte(`{\"foo\":\"bar\", \"baz\":\"foo\"}`)},\n\t\t{name: \"spaces\", input: []byte(` { \"foo\" : \"bar\" , \"baz\" : \"foo\" } `), _type: Object, value: []byte(`{ \"foo\" : \"bar\" , \"baz\" : \"foo\" }`)},\n\t\t{name: \"nested\", input: []byte(`{\"foo\":{\"bar\":{\"baz\":{}}}}`), _type: Object, value: []byte(`{\"foo\":{\"bar\":{\"baz\":{}}}}`)},\n\t\t{name: \"array\", input: []byte(`{\"array\":[{},{},{\"foo\":[{\"bar\":[\"baz\"]}]}]}`), _type: Object, value: []byte(`{\"array\":[{},{},{\"foo\":[{\"bar\":[\"baz\"]}]}]}`)},\n\t}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tsimpleValid(test, t)\n\t\t})\n\t}\n}\n\nfunc TestUnmarshal_ObjectSimpleCorrupted(t *testing.T) {\n\ttests := []*testNode{\n\t\tsimpleCorrupted(\"{{{\\\"key\\\": \\\"foo\\\"{{{{\"),\n\t\tsimpleCorrupted(\"}\"),\n\t\tsimpleCorrupted(\"{ }}}}}}}\"),\n\t\tsimpleCorrupted(\" }\"),\n\t\tsimpleCorrupted(\"{,}\"),\n\t\tsimpleCorrupted(\"{:}\"),\n\t\tsimpleCorrupted(\"{100000}\"),\n\t\tsimpleCorrupted(\"{1:1}\"),\n\t\tsimpleCorrupted(\"{'1:2,3:4'}\"),\n\t\tsimpleCorrupted(`{\"d\"}`),\n\t\tsimpleCorrupted(`{\"foo\"}`),\n\t\tsimpleCorrupted(`{\"foo\":}`),\n\t\tsimpleCorrupted(`{:\"foo\"}`),\n\t\tsimpleCorrupted(`{\"foo\":bar}`),\n\t\tsimpleCorrupted(`{\"foo\":\"bar\",}`),\n\t\tsimpleCorrupted(`{}{}`),\n\t\tsimpleCorrupted(`{},{}`),\n\t\tsimpleCorrupted(`{[},{]}`),\n\t\tsimpleCorrupted(`{[,]}`),\n\t\tsimpleCorrupted(`{[]}`),\n\t\tsimpleCorrupted(`{}1`),\n\t\tsimpleCorrupted(`1{}`),\n\t\tsimpleCorrupted(`{\"x\"::1}`),\n\t\tsimpleCorrupted(`{null:null}`),\n\t\tsimpleCorrupted(`{\"foo:\"bar\"}`),\n\t}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tsimpleInvalid(test, t)\n\t\t})\n\t}\n}\n\nfunc TestUnmarshal_NullSimpleCorrupted(t *testing.T) {\n\ttests := []*testNode{\n\t\t{name: \"nul\", input: []byte(\"nul\")},\n\t\t{name: \"nil\", input: []byte(\"nil\")},\n\t\t{name: \"nill\", input: []byte(\"nill\")},\n\t\t{name: \"NILL\", input: []byte(\"NILL\")},\n\t\t{name: \"Null\", input: []byte(\"Null\")},\n\t\t{name: \"NULL\", input: []byte(\"NULL\")},\n\t\t{name: \"spaces\", input: []byte(\"Nu ll\")},\n\t\t{name: \"null1\", input: []byte(\"null1\")},\n\t\t{name: \"double\", input: []byte(\"null null\")},\n\t}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tsimpleInvalid(test, t)\n\t\t})\n\t}\n}\n\nfunc TestUnmarshal_BoolSimpleSuccess(t *testing.T) {\n\ttests := []*testNode{\n\t\t{name: \"lower true\", input: []byte(\"true\"), _type: Boolean, value: []byte(\"true\")},\n\t\t{name: \"lower false\", input: []byte(\"false\"), _type: Boolean, value: []byte(\"false\")},\n\t\t{name: \"spaces true\", input: []byte(\" true\\r\\n \"), _type: Boolean, value: []byte(\"true\")},\n\t\t{name: \"spaces false\", input: []byte(\" false\\r\\n \"), _type: Boolean, value: []byte(\"false\")},\n\t}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tsimpleValid(test, t)\n\t\t})\n\t}\n}\n\nfunc TestUnmarshal_BoolSimpleCorrupted(t *testing.T) {\n\ttests := []*testNode{\n\t\tsimpleCorrupted(\"tru\"),\n\t\tsimpleCorrupted(\"fals\"),\n\t\tsimpleCorrupted(\"tre\"),\n\t\tsimpleCorrupted(\"fal se\"),\n\t\tsimpleCorrupted(\"true false\"),\n\t\tsimpleCorrupted(\"True\"),\n\t\tsimpleCorrupted(\"TRUE\"),\n\t\tsimpleCorrupted(\"False\"),\n\t\tsimpleCorrupted(\"FALSE\"),\n\t}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tsimpleInvalid(test, t)\n\t\t})\n\t}\n}\n\nfunc TestUnmarshal_ArraySimpleSuccess(t *testing.T) {\n\ttests := []*testNode{\n\t\t{name: \"[]\", input: []byte(\"[]\"), _type: Array, value: []byte(\"[]\")},\n\t\t{name: \"[1]\", input: []byte(\"[1]\"), _type: Array, value: []byte(\"[1]\")},\n\t\t{name: \"[1,2,3]\", input: []byte(\"[1,2,3]\"), _type: Array, value: []byte(\"[1,2,3]\")},\n\t\t{name: \"[1, 2, 3]\", input: []byte(\"[1, 2, 3]\"), _type: Array, value: []byte(\"[1, 2, 3]\")},\n\t\t{name: \"[1,[2],3]\", input: []byte(\"[1,[2],3]\"), _type: Array, value: []byte(\"[1,[2],3]\")},\n\t\t{name: \"[[],[],[]]\", input: []byte(\"[[],[],[]]\"), _type: Array, value: []byte(\"[[],[],[]]\")},\n\t\t{name: \"[[[[[]]]]]\", input: []byte(\"[[[[[]]]]]\"), _type: Array, value: []byte(\"[[[[[]]]]]\")},\n\t\t{name: \"[true,null,1,\\\"foo\\\",[]]\", input: []byte(\"[true,null,1,\\\"foo\\\",[]]\"), _type: Array, value: []byte(\"[true,null,1,\\\"foo\\\",[]]\")},\n\t\t{name: \"spaces\", input: []byte(\"\\n\\r [\\n1\\n ]\\r\\n\"), _type: Array, value: []byte(\"[\\n1\\n ]\")},\n\t}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tsimpleValid(test, t)\n\t\t})\n\t}\n}\n\nfunc TestUnmarshal_ArraySimpleCorrupted(t *testing.T) {\n\ttests := []*testNode{\n\t\tsimpleCorrupted(\"[,]\"),\n\t\tsimpleCorrupted(\"[]\\\\\"),\n\t\tsimpleCorrupted(\"[1,]\"),\n\t\tsimpleCorrupted(\"[[]\"),\n\t\tsimpleCorrupted(\"[]]\"),\n\t\tsimpleCorrupted(\"1[]\"),\n\t\tsimpleCorrupted(\"[]1\"),\n\t\tsimpleCorrupted(\"[[]1]\"),\n\t}\n\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tsimpleInvalid(test, t)\n\t\t})\n\t}\n}\n\n// Examples from https://json.org/example.html\nfunc TestUnmarshal(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tvalue string\n\t}{\n\t\t{\n\t\t\tname: \"glossary\",\n\t\t\tvalue: `{\n\t\t\t\t\"glossary\": {\n\t\t\t\t\t\"title\": \"example glossary\",\n\t\t\t\t\t\"GlossDiv\": {\n\t\t\t\t\t\t\"title\": \"S\",\n\t\t\t\t\t\t\"GlossList\": {\n\t\t\t\t\t\t\t\"GlossEntry\": {\n\t\t\t\t\t\t\t\t\"ID\": \"SGML\",\n\t\t\t\t\t\t\t\t\"SortAs\": \"SGML\",\n\t\t\t\t\t\t\t\t\"GlossTerm\": \"Standard Generalized Markup Language\",\n\t\t\t\t\t\t\t\t\"Acronym\": \"SGML\",\n\t\t\t\t\t\t\t\t\"Abbrev\": \"ISO 8879:1986\",\n\t\t\t\t\t\t\t\t\"GlossDef\": {\n\t\t\t\t\t\t\t\t\t\"para\": \"A meta-markup language, used to create markup languages such as DocBook.\",\n\t\t\t\t\t\t\t\t\t\"GlossSeeAlso\": [\"GML\", \"XML\"]\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\"GlossSee\": \"markup\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}`,\n\t\t},\n\t\t{\n\t\t\tname: \"menu\",\n\t\t\tvalue: `{\"menu\": {\n\t\t\t\t\"id\": \"file\",\n\t\t\t\t\"value\": \"File\",\n\t\t\t\t\"popup\": {\n\t\t\t\t \"menuitem\": [\n\t\t\t\t\t{\"value\": \"New\", \"onclick\": \"CreateNewDoc()\"},\n\t\t\t\t\t{\"value\": \"Open\", \"onclick\": \"OpenDoc()\"},\n\t\t\t\t\t{\"value\": \"Close\", \"onclick\": \"CloseDoc()\"}\n\t\t\t\t ]\n\t\t\t\t}\n\t\t\t}}`,\n\t\t},\n\t\t{\n\t\t\tname: \"widget\",\n\t\t\tvalue: `{\"widget\": {\n\t\t\t\t\"debug\": \"on\",\n\t\t\t\t\"window\": {\n\t\t\t\t\t\"title\": \"Sample Konfabulator Widget\",\n\t\t\t\t\t\"name\": \"main_window\",\n\t\t\t\t\t\"width\": 500,\n\t\t\t\t\t\"height\": 500\n\t\t\t\t},\n\t\t\t\t\"image\": { \n\t\t\t\t\t\"src\": \"Images/Sun.png\",\n\t\t\t\t\t\"name\": \"sun1\",\n\t\t\t\t\t\"hOffset\": 250,\n\t\t\t\t\t\"vOffset\": 250,\n\t\t\t\t\t\"alignment\": \"center\"\n\t\t\t\t},\n\t\t\t\t\"text\": {\n\t\t\t\t\t\"data\": \"Click Here\",\n\t\t\t\t\t\"size\": 36,\n\t\t\t\t\t\"style\": \"bold\",\n\t\t\t\t\t\"name\": \"text1\",\n\t\t\t\t\t\"hOffset\": 250,\n\t\t\t\t\t\"vOffset\": 100,\n\t\t\t\t\t\"alignment\": \"center\",\n\t\t\t\t\t\"onMouseUp\": \"sun1.opacity = (sun1.opacity / 100) * 90;\"\n\t\t\t\t}\n\t\t\t}} `,\n\t\t},\n\t\t{\n\t\t\tname: \"web-app\",\n\t\t\tvalue: `{\"web-app\": {\n\t\t\t\t\"servlet\": [ \n\t\t\t\t {\n\t\t\t\t\t\"servlet-name\": \"cofaxCDS\",\n\t\t\t\t\t\"servlet-class\": \"org.cofax.cds.CDSServlet\",\n\t\t\t\t\t\"init-param\": {\n\t\t\t\t\t \"configGlossary:installationAt\": \"Philadelphia, PA\",\n\t\t\t\t\t \"configGlossary:adminEmail\": \"ksm@pobox.com\",\n\t\t\t\t\t \"configGlossary:poweredBy\": \"Cofax\",\n\t\t\t\t\t \"configGlossary:poweredByIcon\": \"/images/cofax.gif\",\n\t\t\t\t\t \"configGlossary:staticPath\": \"/content/static\",\n\t\t\t\t\t \"templateProcessorClass\": \"org.cofax.WysiwygTemplate\",\n\t\t\t\t\t \"templateLoaderClass\": \"org.cofax.FilesTemplateLoader\",\n\t\t\t\t\t \"templatePath\": \"templates\",\n\t\t\t\t\t \"templateOverridePath\": \"\",\n\t\t\t\t\t \"defaultListTemplate\": \"listTemplate.htm\",\n\t\t\t\t\t \"defaultFileTemplate\": \"articleTemplate.htm\",\n\t\t\t\t\t \"useJSP\": false,\n\t\t\t\t\t \"jspListTemplate\": \"listTemplate.jsp\",\n\t\t\t\t\t \"jspFileTemplate\": \"articleTemplate.jsp\",\n\t\t\t\t\t \"cachePackageTagsTrack\": 200,\n\t\t\t\t\t \"cachePackageTagsStore\": 200,\n\t\t\t\t\t \"cachePackageTagsRefresh\": 60,\n\t\t\t\t\t \"cacheTemplatesTrack\": 100,\n\t\t\t\t\t \"cacheTemplatesStore\": 50,\n\t\t\t\t\t \"cacheTemplatesRefresh\": 15,\n\t\t\t\t\t \"cachePagesTrack\": 200,\n\t\t\t\t\t \"cachePagesStore\": 100,\n\t\t\t\t\t \"cachePagesRefresh\": 10,\n\t\t\t\t\t \"cachePagesDirtyRead\": 10,\n\t\t\t\t\t \"searchEngineListTemplate\": \"forSearchEnginesList.htm\",\n\t\t\t\t\t \"searchEngineFileTemplate\": \"forSearchEngines.htm\",\n\t\t\t\t\t \"searchEngineRobotsDb\": \"WEB-INF/robots.db\",\n\t\t\t\t\t \"useDataStore\": true,\n\t\t\t\t\t \"dataStoreClass\": \"org.cofax.SqlDataStore\",\n\t\t\t\t\t \"redirectionClass\": \"org.cofax.SqlRedirection\",\n\t\t\t\t\t \"dataStoreName\": \"cofax\",\n\t\t\t\t\t \"dataStoreDriver\": \"com.microsoft.jdbc.sqlserver.SQLServerDriver\",\n\t\t\t\t\t \"dataStoreUrl\": \"jdbc:microsoft:sqlserver://LOCALHOST:1433;DatabaseName=goon\",\n\t\t\t\t\t \"dataStoreUser\": \"sa\",\n\t\t\t\t\t \"dataStorePassword\": \"dataStoreTestQuery\",\n\t\t\t\t\t \"dataStoreTestQuery\": \"SET NOCOUNT ON;select test='test';\",\n\t\t\t\t\t \"dataStoreLogFile\": \"/usr/local/tomcat/logs/datastore.log\",\n\t\t\t\t\t \"dataStoreInitConns\": 10,\n\t\t\t\t\t \"dataStoreMaxConns\": 100,\n\t\t\t\t\t \"dataStoreConnUsageLimit\": 100,\n\t\t\t\t\t \"dataStoreLogLevel\": \"debug\",\n\t\t\t\t\t \"maxUrlLength\": 500}},\n\t\t\t\t {\n\t\t\t\t\t\"servlet-name\": \"cofaxEmail\",\n\t\t\t\t\t\"servlet-class\": \"org.cofax.cds.EmailServlet\",\n\t\t\t\t\t\"init-param\": {\n\t\t\t\t\t\"mailHost\": \"mail1\",\n\t\t\t\t\t\"mailHostOverride\": \"mail2\"}},\n\t\t\t\t {\n\t\t\t\t\t\"servlet-name\": \"cofaxAdmin\",\n\t\t\t\t\t\"servlet-class\": \"org.cofax.cds.AdminServlet\"},\n\t\t\t \n\t\t\t\t {\n\t\t\t\t\t\"servlet-name\": \"fileServlet\",\n\t\t\t\t\t\"servlet-class\": \"org.cofax.cds.FileServlet\"},\n\t\t\t\t {\n\t\t\t\t\t\"servlet-name\": \"cofaxTools\",\n\t\t\t\t\t\"servlet-class\": \"org.cofax.cms.CofaxToolsServlet\",\n\t\t\t\t\t\"init-param\": {\n\t\t\t\t\t \"templatePath\": \"toolstemplates/\",\n\t\t\t\t\t \"log\": 1,\n\t\t\t\t\t \"logLocation\": \"/usr/local/tomcat/logs/CofaxTools.log\",\n\t\t\t\t\t \"logMaxSize\": \"\",\n\t\t\t\t\t \"dataLog\": 1,\n\t\t\t\t\t \"dataLogLocation\": \"/usr/local/tomcat/logs/dataLog.log\",\n\t\t\t\t\t \"dataLogMaxSize\": \"\",\n\t\t\t\t\t \"removePageCache\": \"/content/admin/remove?cache=pages\u0026id=\",\n\t\t\t\t\t \"removeTemplateCache\": \"/content/admin/remove?cache=templates\u0026id=\",\n\t\t\t\t\t \"fileTransferFolder\": \"/usr/local/tomcat/webapps/content/fileTransferFolder\",\n\t\t\t\t\t \"lookInContext\": 1,\n\t\t\t\t\t \"adminGroupID\": 4,\n\t\t\t\t\t \"betaServer\": true}}],\n\t\t\t\t\"servlet-mapping\": {\n\t\t\t\t \"cofaxCDS\": \"/\",\n\t\t\t\t \"cofaxEmail\": \"/cofaxutil/aemail/*\",\n\t\t\t\t \"cofaxAdmin\": \"/admin/*\",\n\t\t\t\t \"fileServlet\": \"/static/*\",\n\t\t\t\t \"cofaxTools\": \"/tools/*\"},\n\t\t\t \n\t\t\t\t\"taglib\": {\n\t\t\t\t \"taglib-uri\": \"cofax.tld\",\n\t\t\t\t \"taglib-location\": \"/WEB-INF/tlds/cofax.tld\"}}}`,\n\t\t},\n\t\t{\n\t\t\tname: \"SVG Viewer\",\n\t\t\tvalue: `{\"menu\": {\n\t\t\t\t\"header\": \"SVG Viewer\",\n\t\t\t\t\"items\": [\n\t\t\t\t\t{\"id\": \"Open\"},\n\t\t\t\t\t{\"id\": \"OpenNew\", \"label\": \"Open New\"},\n\t\t\t\t\tnull,\n\t\t\t\t\t{\"id\": \"ZoomIn\", \"label\": \"Zoom In\"},\n\t\t\t\t\t{\"id\": \"ZoomOut\", \"label\": \"Zoom Out\"},\n\t\t\t\t\t{\"id\": \"OriginalView\", \"label\": \"Original View\"},\n\t\t\t\t\tnull,\n\t\t\t\t\t{\"id\": \"Quality\"},\n\t\t\t\t\t{\"id\": \"Pause\"},\n\t\t\t\t\t{\"id\": \"Mute\"},\n\t\t\t\t\tnull,\n\t\t\t\t\t{\"id\": \"Find\", \"label\": \"Find...\"},\n\t\t\t\t\t{\"id\": \"FindAgain\", \"label\": \"Find Again\"},\n\t\t\t\t\t{\"id\": \"Copy\"},\n\t\t\t\t\t{\"id\": \"CopyAgain\", \"label\": \"Copy Again\"},\n\t\t\t\t\t{\"id\": \"CopySVG\", \"label\": \"Copy SVG\"},\n\t\t\t\t\t{\"id\": \"ViewSVG\", \"label\": \"View SVG\"},\n\t\t\t\t\t{\"id\": \"ViewSource\", \"label\": \"View Source\"},\n\t\t\t\t\t{\"id\": \"SaveAs\", \"label\": \"Save As\"},\n\t\t\t\t\tnull,\n\t\t\t\t\t{\"id\": \"Help\"},\n\t\t\t\t\t{\"id\": \"About\", \"label\": \"About Adobe CVG Viewer...\"}\n\t\t\t\t]\n\t\t\t}}`,\n\t\t},\n\t}\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\t_, err := Unmarshal([]byte(test.value))\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"Error on Unmarshal: %s\", err.Error())\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestUnmarshalSafe(t *testing.T) {\n\tjson := []byte(`{ \"store\": {\n\t\t\"book\": [ \n\t\t { \"category\": \"reference\",\n\t\t\t\"author\": \"Nigel Rees\",\n\t\t\t\"title\": \"Sayings of the Century\",\n\t\t\t\"price\": 8.95\n\t\t },\n\t\t { \"category\": \"fiction\",\n\t\t\t\"author\": \"Evelyn Waugh\",\n\t\t\t\"title\": \"Sword of Honour\",\n\t\t\t\"price\": 12.99\n\t\t },\n\t\t { \"category\": \"fiction\",\n\t\t\t\"author\": \"Herman Melville\",\n\t\t\t\"title\": \"Moby Dick\",\n\t\t\t\"isbn\": \"0-553-21311-3\",\n\t\t\t\"price\": 8.99\n\t\t },\n\t\t { \"category\": \"fiction\",\n\t\t\t\"author\": \"J. R. R. Tolkien\",\n\t\t\t\"title\": \"The Lord of the Rings\",\n\t\t\t\"isbn\": \"0-395-19395-8\",\n\t\t\t\"price\": 22.99\n\t\t }\n\t\t],\n\t\t\"bicycle\": {\n\t\t \"color\": \"red\",\n\t\t \"price\": 19.95\n\t\t}\n\t }\n\t}`)\n\tsafe, err := UnmarshalSafe(json)\n\tif err != nil {\n\t\tt.Errorf(\"Error on Unmarshal: %s\", err.Error())\n\t} else if safe == nil {\n\t\tt.Errorf(\"Error on Unmarshal: safe is nil\")\n\t} else {\n\t\troot, err := Unmarshal(json)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"Error on Unmarshal: %s\", err.Error())\n\t\t} else if root == nil {\n\t\t\tt.Errorf(\"Error on Unmarshal: root is nil\")\n\t\t} else if !bytes.Equal(root.source(), safe.source()) {\n\t\t\tt.Errorf(\"Error on UnmarshalSafe: values not same\")\n\t\t}\n\t}\n}\n\n// BenchmarkGoStdUnmarshal-8 \t 61698\t 19350 ns/op\t 288 B/op\t 6 allocs/op\n// BenchmarkUnmarshal-8 \t 45620\t 26165 ns/op\t 21889 B/op\t 367 allocs/op\n//\n// type bench struct {\n// \tName string `json:\"name\"`\n// \tValue int `json:\"value\"`\n// }\n\n// func BenchmarkGoStdUnmarshal(b *testing.B) {\n// \tdata := []byte(webApp)\n// \tfor i := 0; i \u003c b.N; i++ {\n// \t\terr := json.Unmarshal(data, \u0026bench{})\n// \t\tif err != nil {\n// \t\t\tb.Fatal(err)\n// \t\t}\n// \t}\n// }\n\n// func BenchmarkUnmarshal(b *testing.B) {\n// \tdata := []byte(webApp)\n// \tfor i := 0; i \u003c b.N; i++ {\n// \t\t_, err := Unmarshal(data)\n// \t\tif err != nil {\n// \t\t\tb.Fatal(err)\n// \t\t}\n// \t}\n// }\n"},{"name":"encode.gno","body":"package json\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"math\"\n\t\"strconv\"\n\n\t\"gno.land/p/demo/json/ryu\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\n// Marshal returns the JSON encoding of a Node.\nfunc Marshal(node *Node) ([]byte, error) {\n\tvar (\n\t\tbuf bytes.Buffer\n\t\tsVal string\n\t\tbVal bool\n\t\tnVal float64\n\t\toVal []byte\n\t\terr error\n\t)\n\n\tif node == nil {\n\t\treturn nil, errors.New(\"node is nil\")\n\t}\n\n\tif !node.modified \u0026\u0026 !node.ready() {\n\t\treturn nil, errors.New(\"node is not ready\")\n\t}\n\n\tif !node.modified \u0026\u0026 node.ready() {\n\t\tbuf.Write(node.source())\n\t}\n\n\tif node.modified {\n\t\tswitch node.nodeType {\n\t\tcase Null:\n\t\t\tbuf.Write(nullLiteral)\n\n\t\tcase Number:\n\t\t\tnVal, err = node.GetNumeric()\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\n\t\t\t// ufmt does not support %g. by doing so, we need to check if the number is an integer\n\t\t\t// after then, apply the correct format for each float and integer numbers.\n\t\t\tif math.Mod(nVal, 1.0) == 0 {\n\t\t\t\t// must convert float to integer. otherwise it will be overflowed.\n\t\t\t\tnum := ufmt.Sprintf(\"%d\", int(nVal))\n\t\t\t\tbuf.WriteString(num)\n\t\t\t} else {\n\t\t\t\t// use ryu algorithm to convert float to string\n\t\t\t\tnum := ryu.FormatFloat64(nVal)\n\t\t\t\tbuf.WriteString(num)\n\t\t\t}\n\n\t\tcase String:\n\t\t\tsVal, err = node.GetString()\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\n\t\t\tquoted := ufmt.Sprintf(\"%s\", strconv.Quote(sVal))\n\t\t\tbuf.WriteString(quoted)\n\n\t\tcase Boolean:\n\t\t\tbVal, err = node.GetBool()\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\n\t\t\tbStr := ufmt.Sprintf(\"%t\", bVal)\n\t\t\tbuf.WriteString(bStr)\n\n\t\tcase Array:\n\t\t\tbuf.WriteByte(bracketOpen)\n\n\t\t\tfor i := 0; i \u003c len(node.next); i++ {\n\t\t\t\tif i != 0 {\n\t\t\t\t\tbuf.WriteByte(comma)\n\t\t\t\t}\n\n\t\t\t\telem, ok := node.next[strconv.Itoa(i)]\n\t\t\t\tif !ok {\n\t\t\t\t\treturn nil, ufmt.Errorf(\"array element %d is not found\", i)\n\t\t\t\t}\n\n\t\t\t\toVal, err = Marshal(elem)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\n\t\t\t\tbuf.Write(oVal)\n\t\t\t}\n\n\t\t\tbuf.WriteByte(bracketClose)\n\n\t\tcase Object:\n\t\t\tbuf.WriteByte(curlyOpen)\n\n\t\t\tbVal = false\n\t\t\tfor k, v := range node.next {\n\t\t\t\tif bVal {\n\t\t\t\t\tbuf.WriteByte(comma)\n\t\t\t\t} else {\n\t\t\t\t\tbVal = true\n\t\t\t\t}\n\n\t\t\t\tkey := ufmt.Sprintf(\"%s\", strconv.Quote(k))\n\t\t\t\tbuf.WriteString(key)\n\t\t\t\tbuf.WriteByte(colon)\n\n\t\t\t\toVal, err = Marshal(v)\n\t\t\t\tif err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\n\t\t\t\tbuf.Write(oVal)\n\t\t\t}\n\n\t\t\tbuf.WriteByte(curlyClose)\n\t\t}\n\t}\n\n\treturn buf.Bytes(), nil\n}\n"},{"name":"encode_test.gno","body":"package json\n\nimport \"testing\"\n\nfunc TestMarshal_Primitive(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tnode *Node\n\t}{\n\t\t{\n\t\t\tname: \"null\",\n\t\t\tnode: NullNode(\"\"),\n\t\t},\n\t\t{\n\t\t\tname: \"true\",\n\t\t\tnode: BoolNode(\"\", true),\n\t\t},\n\t\t{\n\t\t\tname: \"false\",\n\t\t\tnode: BoolNode(\"\", false),\n\t\t},\n\t\t{\n\t\t\tname: `\"string\"`,\n\t\t\tnode: StringNode(\"\", \"string\"),\n\t\t},\n\t\t{\n\t\t\tname: `\"one \\\"encoded\\\" string\"`,\n\t\t\tnode: StringNode(\"\", `one \"encoded\" string`),\n\t\t},\n\t\t{\n\t\t\tname: `{\"foo\":\"bar\"}`,\n\t\t\tnode: ObjectNode(\"\", map[string]*Node{\n\t\t\t\t\"foo\": StringNode(\"foo\", \"bar\"),\n\t\t\t}),\n\t\t},\n\t\t{\n\t\t\tname: \"42\",\n\t\t\tnode: NumberNode(\"\", 42),\n\t\t},\n\t\t// TODO: fix output for not to use scientific notation\n\t\t{\n\t\t\tname: \"1.005e+02\",\n\t\t\tnode: NumberNode(\"\", 100.5),\n\t\t},\n\t\t{\n\t\t\tname: `[1,2,3]`,\n\t\t\tnode: ArrayNode(\"\", []*Node{\n\t\t\t\tNumberNode(\"0\", 1),\n\t\t\t\tNumberNode(\"2\", 2),\n\t\t\t\tNumberNode(\"3\", 3),\n\t\t\t}),\n\t\t},\n\t}\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tvalue, err := Marshal(test.node)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"unexpected error: %s\", err)\n\t\t\t} else if string(value) != test.name {\n\t\t\t\tt.Errorf(\"wrong result: '%s', expected '%s'\", value, test.name)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestMarshal_Object(t *testing.T) {\n\tnode := ObjectNode(\"\", map[string]*Node{\n\t\t\"foo\": StringNode(\"foo\", \"bar\"),\n\t\t\"baz\": NumberNode(\"baz\", 100500),\n\t\t\"qux\": NullNode(\"qux\"),\n\t})\n\n\tmustKey := []string{\"foo\", \"baz\", \"qux\"}\n\n\tvalue, err := Marshal(node)\n\tif err != nil {\n\t\tt.Errorf(\"unexpected error: %s\", err)\n\t}\n\n\t// the order of keys in the map is not guaranteed\n\t// so we need to unmarshal the result and check the keys\n\tdecoded, err := Unmarshal(value)\n\tif err != nil {\n\t\tt.Errorf(\"unexpected error: %s\", err)\n\t}\n\n\tfor _, key := range mustKey {\n\t\tif node, err := decoded.GetKey(key); err != nil {\n\t\t\tt.Errorf(\"unexpected error: %s\", err)\n\t\t} else {\n\t\t\tif node == nil {\n\t\t\t\tt.Errorf(\"node is nil\")\n\t\t\t} else if node.key == nil {\n\t\t\t\tt.Errorf(\"key is nil\")\n\t\t\t} else if *node.key != key {\n\t\t\t\tt.Errorf(\"wrong key: '%s', expected '%s'\", *node.key, key)\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc valueNode(prev *Node, key string, typ ValueType, val interface{}) *Node {\n\tcurr := \u0026Node{\n\t\tprev: prev,\n\t\tdata: nil,\n\t\tkey: \u0026key,\n\t\tborders: [2]int{0, 0},\n\t\tvalue: val,\n\t\tmodified: true,\n\t}\n\n\tif val != nil {\n\t\tcurr.nodeType = typ\n\t}\n\n\treturn curr\n}\n\nfunc TestMarshal_Errors(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tnode func() (node *Node)\n\t}{\n\t\t{\n\t\t\tname: \"nil\",\n\t\t\tnode: func() (node *Node) {\n\t\t\t\treturn\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"broken\",\n\t\t\tnode: func() (node *Node) {\n\t\t\t\tnode = Must(Unmarshal([]byte(`{}`)))\n\t\t\t\tnode.borders[1] = 0\n\t\t\t\treturn\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"Numeric\",\n\t\t\tnode: func() (node *Node) {\n\t\t\t\treturn valueNode(nil, \"\", Number, false)\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"String\",\n\t\t\tnode: func() (node *Node) {\n\t\t\t\treturn valueNode(nil, \"\", String, false)\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"Bool\",\n\t\t\tnode: func() (node *Node) {\n\t\t\t\treturn valueNode(nil, \"\", Boolean, 1)\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"Array_1\",\n\t\t\tnode: func() (node *Node) {\n\t\t\t\tnode = ArrayNode(\"\", nil)\n\t\t\t\tnode.next[\"1\"] = NullNode(\"1\")\n\t\t\t\treturn\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"Array_2\",\n\t\t\tnode: func() (node *Node) {\n\t\t\t\treturn ArrayNode(\"\", []*Node{valueNode(nil, \"\", Boolean, 1)})\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"Object\",\n\t\t\tnode: func() (node *Node) {\n\t\t\t\treturn ObjectNode(\"\", map[string]*Node{\"key\": valueNode(nil, \"key\", Boolean, 1)})\n\t\t\t},\n\t\t},\n\t}\n\tfor _, test := range tests {\n\t\tt.Run(test.name, func(t *testing.T) {\n\t\t\tvalue, err := Marshal(test.node())\n\t\t\tif err == nil {\n\t\t\t\tt.Errorf(\"expected error\")\n\t\t\t} else if len(value) != 0 {\n\t\t\t\tt.Errorf(\"wrong result\")\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestMarshal_Nil(t *testing.T) {\n\t_, err := Marshal(nil)\n\tif err == nil {\n\t\tt.Error(\"Expected error for nil node, but got nil\")\n\t}\n}\n\nfunc TestMarshal_NotModified(t *testing.T) {\n\tnode := \u0026Node{}\n\t_, err := Marshal(node)\n\tif err == nil {\n\t\tt.Error(\"Expected error for not modified node, but got nil\")\n\t}\n}\n\nfunc TestMarshalCycleReference(t *testing.T) {\n\tnode1 := \u0026Node{\n\t\tkey: stringPtr(\"node1\"),\n\t\tnodeType: String,\n\t\tnext: map[string]*Node{\n\t\t\t\"next\": nil,\n\t\t},\n\t}\n\n\tnode2 := \u0026Node{\n\t\tkey: stringPtr(\"node2\"),\n\t\tnodeType: String,\n\t\tprev: node1,\n\t}\n\n\tnode1.next[\"next\"] = node2\n\n\t_, err := Marshal(node1)\n\tif err == nil {\n\t\tt.Error(\"Expected error for cycle reference, but got nil\")\n\t}\n}\n\nfunc TestMarshalNoCycleReference(t *testing.T) {\n\tnode1 := \u0026Node{\n\t\tkey: stringPtr(\"node1\"),\n\t\tnodeType: String,\n\t\tvalue: \"value1\",\n\t\tmodified: true,\n\t}\n\n\tnode2 := \u0026Node{\n\t\tkey: stringPtr(\"node2\"),\n\t\tnodeType: String,\n\t\tvalue: \"value2\",\n\t\tmodified: true,\n\t}\n\n\t_, err := Marshal(node1)\n\tif err != nil {\n\t\tt.Errorf(\"Unexpected error: %v\", err)\n\t}\n\n\t_, err = Marshal(node2)\n\tif err != nil {\n\t\tt.Errorf(\"Unexpected error: %v\", err)\n\t}\n}\n\nfunc stringPtr(s string) *string {\n\treturn \u0026s\n}\n"},{"name":"escape.gno","body":"package json\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"unicode/utf8\"\n)\n\nconst (\n\tsupplementalPlanesOffset = 0x10000\n\thighSurrogateOffset = 0xD800\n\tlowSurrogateOffset = 0xDC00\n\tsurrogateEnd = 0xDFFF\n\tbasicMultilingualPlaneOffset = 0xFFFF\n\tbadHex = -1\n)\n\nvar hexLookupTable = [256]int{\n\t'0': 0x0, '1': 0x1, '2': 0x2, '3': 0x3, '4': 0x4,\n\t'5': 0x5, '6': 0x6, '7': 0x7, '8': 0x8, '9': 0x9,\n\t'A': 0xA, 'B': 0xB, 'C': 0xC, 'D': 0xD, 'E': 0xE, 'F': 0xF,\n\t'a': 0xA, 'b': 0xB, 'c': 0xC, 'd': 0xD, 'e': 0xE, 'f': 0xF,\n\t// Fill unspecified index-value pairs with key and value of -1\n\t'G': -1, 'H': -1, 'I': -1, 'J': -1,\n\t'K': -1, 'L': -1, 'M': -1, 'N': -1,\n\t'O': -1, 'P': -1, 'Q': -1, 'R': -1,\n\t'S': -1, 'T': -1, 'U': -1, 'V': -1,\n\t'W': -1, 'X': -1, 'Y': -1, 'Z': -1,\n\t'g': -1, 'h': -1, 'i': -1, 'j': -1,\n\t'k': -1, 'l': -1, 'm': -1, 'n': -1,\n\t'o': -1, 'p': -1, 'q': -1, 'r': -1,\n\t's': -1, 't': -1, 'u': -1, 'v': -1,\n\t'w': -1, 'x': -1, 'y': -1, 'z': -1,\n}\n\nfunc h2i(c byte) int {\n\treturn hexLookupTable[c]\n}\n\n// Unescape takes an input byte slice, processes it to Unescape certain characters,\n// and writes the result into an output byte slice.\n//\n// it returns the processed slice and any error encountered during the Unescape operation.\nfunc Unescape(input, output []byte) ([]byte, error) {\n\t// find the index of the first backslash in the input slice.\n\tfirstBackslash := bytes.IndexByte(input, backSlash)\n\tif firstBackslash == -1 {\n\t\treturn input, nil\n\t}\n\n\t// ensure the output slice has enough capacity to hold the result.\n\tinputLen := len(input)\n\tif cap(output) \u003c inputLen {\n\t\toutput = make([]byte, inputLen)\n\t}\n\n\toutput = output[:inputLen]\n\tcopy(output, input[:firstBackslash])\n\n\tinput = input[firstBackslash:]\n\tbuf := output[firstBackslash:]\n\n\tfor len(input) \u003e 0 {\n\t\tinLen, bufLen, err := processEscapedUTF8(input, buf)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\tinput = input[inLen:] // the number of bytes consumed in the input\n\t\tbuf = buf[bufLen:] // the number of bytes written to buf\n\n\t\t// find the next backslash in the remaining input\n\t\tnextBackslash := bytes.IndexByte(input, backSlash)\n\t\tif nextBackslash == -1 {\n\t\t\tcopy(buf, input)\n\t\t\tbuf = buf[len(input):]\n\t\t\tbreak\n\t\t}\n\n\t\tcopy(buf, input[:nextBackslash])\n\n\t\tinput = input[nextBackslash:]\n\t\tbuf = buf[nextBackslash:]\n\t}\n\n\treturn output[:len(output)-len(buf)], nil\n}\n\n// isSurrogatePair returns true if the rune is a surrogate pair.\n//\n// A surrogate pairs are used in UTF-16 encoding to encode characters\n// outside the Basic Multilingual Plane (BMP).\nfunc isSurrogatePair(r rune) bool {\n\treturn highSurrogateOffset \u003c= r \u0026\u0026 r \u003c= surrogateEnd\n}\n\n// combineSurrogates reconstruct the original unicode code points in the\n// supplemental plane by combinin the high and low surrogate.\n//\n// The hight surrogate in the range from U+D800 to U+DBFF,\n// and the low surrogate in the range from U+DC00 to U+DFFF.\n//\n// The formula to combine the surrogates is:\n// (high - 0xD800) * 0x400 + (low - 0xDC00) + 0x10000\nfunc combineSurrogates(high, low rune) rune {\n\treturn ((high - highSurrogateOffset) \u003c\u003c 10) + (low - lowSurrogateOffset) + supplementalPlanesOffset\n}\n\n// deocdeSingleUnicodeEscape decodes a unicode escape sequence (e.g., \\uXXXX) into a rune.\nfunc decodeSingleUnicodeEscape(b []byte) (rune, bool) {\n\tif len(b) \u003c 6 {\n\t\treturn utf8.RuneError, false\n\t}\n\n\t// convert hex to decimal\n\th1, h2, h3, h4 := h2i(b[2]), h2i(b[3]), h2i(b[4]), h2i(b[5])\n\tif h1 == badHex || h2 == badHex || h3 == badHex || h4 == badHex {\n\t\treturn utf8.RuneError, false\n\t}\n\n\treturn rune(h1\u003c\u003c12 + h2\u003c\u003c8 + h3\u003c\u003c4 + h4), true\n}\n\n// decodeUnicodeEscape decodes a Unicode escape sequence from a byte slice.\nfunc decodeUnicodeEscape(b []byte) (rune, int) {\n\tr, ok := decodeSingleUnicodeEscape(b)\n\tif !ok {\n\t\treturn utf8.RuneError, -1\n\t}\n\n\t// determine valid unicode escapes within the BMP\n\tif r \u003c= basicMultilingualPlaneOffset \u0026\u0026 !isSurrogatePair(r) {\n\t\treturn r, 6\n\t}\n\n\t// Decode the following escape sequence to verify a UTF-16 susergate pair.\n\tr2, ok := decodeSingleUnicodeEscape(b[6:])\n\tif !ok {\n\t\treturn utf8.RuneError, -1\n\t}\n\n\tif r2 \u003c lowSurrogateOffset {\n\t\treturn utf8.RuneError, -1\n\t}\n\n\treturn combineSurrogates(r, r2), 12\n}\n\nvar escapeByteSet = [256]byte{\n\t'\"': doubleQuote,\n\t'\\\\': backSlash,\n\t'/': slash,\n\t'b': backSpace,\n\t'f': formFeed,\n\t'n': newLine,\n\t'r': carriageReturn,\n\t't': tab,\n}\n\n// Unquote takes a byte slice and unquotes it by removing\n// the surrounding quotes and unescaping the contents.\nfunc Unquote(s []byte, border byte) (string, bool) {\n\ts, ok := unquoteBytes(s, border)\n\treturn string(s), ok\n}\n\n// unquoteBytes takes a byte slice and unquotes it by removing\n// TODO: consider to move this function to the strconv package.\nfunc unquoteBytes(s []byte, border byte) ([]byte, bool) {\n\tif len(s) \u003c 2 || s[0] != border || s[len(s)-1] != border {\n\t\treturn nil, false\n\t}\n\n\ts = s[1 : len(s)-1]\n\n\tr := 0\n\tfor r \u003c len(s) {\n\t\tc := s[r]\n\n\t\tif c == backSlash || c == border || c \u003c 0x20 {\n\t\t\tbreak\n\t\t}\n\n\t\tif c \u003c utf8.RuneSelf {\n\t\t\tr++\n\t\t\tcontinue\n\t\t}\n\n\t\trr, size := utf8.DecodeRune(s[r:])\n\t\tif rr == utf8.RuneError \u0026\u0026 size == 1 {\n\t\t\tbreak\n\t\t}\n\n\t\tr += size\n\t}\n\n\tif r == len(s) {\n\t\treturn s, true\n\t}\n\n\tutfDoubleMax := utf8.UTFMax * 2\n\tb := make([]byte, len(s)+utfDoubleMax)\n\tw := copy(b, s[0:r])\n\n\tfor r \u003c len(s) {\n\t\tif w \u003e= len(b)-utf8.UTFMax {\n\t\t\tnb := make([]byte, utfDoubleMax+(2*len(b)))\n\t\t\tcopy(nb, b)\n\t\t\tb = nb\n\t\t}\n\n\t\tc := s[r]\n\t\tif c == backSlash {\n\t\t\tr++\n\t\t\tif r \u003e= len(s) {\n\t\t\t\treturn nil, false\n\t\t\t}\n\n\t\t\tif s[r] == 'u' {\n\t\t\t\trr, res := decodeUnicodeEscape(s[r-1:])\n\t\t\t\tif res \u003c 0 {\n\t\t\t\t\treturn nil, false\n\t\t\t\t}\n\n\t\t\t\tw += utf8.EncodeRune(b[w:], rr)\n\t\t\t\tr += 5\n\t\t\t} else {\n\t\t\t\tdecode := escapeByteSet[s[r]]\n\t\t\t\tif decode == 0 {\n\t\t\t\t\treturn nil, false\n\t\t\t\t}\n\n\t\t\t\tif decode == doubleQuote || decode == backSlash || decode == slash {\n\t\t\t\t\tdecode = s[r]\n\t\t\t\t}\n\n\t\t\t\tb[w] = decode\n\t\t\t\tr++\n\t\t\t\tw++\n\t\t\t}\n\t\t} else if c == border || c \u003c 0x20 {\n\t\t\treturn nil, false\n\t\t} else if c \u003c utf8.RuneSelf {\n\t\t\tb[w] = c\n\t\t\tr++\n\t\t\tw++\n\t\t} else {\n\t\t\trr, size := utf8.DecodeRune(s[r:])\n\n\t\t\tif rr == utf8.RuneError \u0026\u0026 size == 1 {\n\t\t\t\treturn nil, false\n\t\t\t}\n\n\t\t\tr += size\n\t\t\tw += utf8.EncodeRune(b[w:], rr)\n\t\t}\n\t}\n\n\treturn b[:w], true\n}\n\n// processEscapedUTF8 processes the escape sequence in the given byte slice and\n// and converts them to UTF-8 characters. The function returns the length of the processed input and output.\n//\n// The input 'in' must contain the escape sequence to be processed,\n// and 'out' provides a space to store the converted characters.\n//\n// The function returns (input length, output length) if the escape sequence is correct.\n// Unicode escape sequences (e.g. \\uXXXX) are decoded to UTF-8, other default escape sequences are\n// converted to their corresponding special characters (e.g. \\n -\u003e newline).\n//\n// If the escape sequence is invalid, or if 'in' does not completely enclose the escape sequence,\n// function returns (-1, -1) to indicate an error.\nfunc processEscapedUTF8(in, out []byte) (int, int, error) {\n\tif len(in) \u003c 2 || in[0] != backSlash {\n\t\treturn -1, -1, errors.New(\"invalid escape sequence\")\n\t}\n\n\tescapeSeqLen := 2\n\tescapeChar := in[1]\n\n\tif escapeChar != 'u' {\n\t\tval := escapeByteSet[escapeChar]\n\t\tif val == 0 {\n\t\t\treturn -1, -1, errors.New(\"invalid escape sequence\")\n\t\t}\n\n\t\tout[0] = val\n\t\treturn escapeSeqLen, 1, nil\n\t}\n\n\tr, size := decodeUnicodeEscape(in)\n\tif size == -1 {\n\t\treturn -1, -1, errors.New(\"invalid escape sequence\")\n\t}\n\n\toutLen := utf8.EncodeRune(out, r)\n\n\treturn size, outLen, nil\n}\n"},{"name":"escape_test.gno","body":"package json\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n\t\"unicode/utf8\"\n)\n\nfunc TestHexToInt(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tc byte\n\t\twant int\n\t}{\n\t\t{\"Digit 0\", '0', 0},\n\t\t{\"Digit 9\", '9', 9},\n\t\t{\"Uppercase A\", 'A', 10},\n\t\t{\"Uppercase F\", 'F', 15},\n\t\t{\"Lowercase a\", 'a', 10},\n\t\t{\"Lowercase f\", 'f', 15},\n\t\t{\"Invalid character1\", 'g', badHex},\n\t\t{\"Invalid character2\", 'G', badHex},\n\t\t{\"Invalid character3\", 'z', badHex},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tif got := h2i(tt.c); got != tt.want {\n\t\t\t\tt.Errorf(\"h2i() = %v, want %v\", got, tt.want)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestIsSurrogatePair(t *testing.T) {\n\ttestCases := []struct {\n\t\tname string\n\t\tr rune\n\t\texpected bool\n\t}{\n\t\t{\"high surrogate start\", 0xD800, true},\n\t\t{\"high surrogate end\", 0xDBFF, true},\n\t\t{\"low surrogate start\", 0xDC00, true},\n\t\t{\"low surrogate end\", 0xDFFF, true},\n\t\t{\"Non-surrogate\", 0x0000, false},\n\t\t{\"Non-surrogate 2\", 0xE000, false},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tif got := isSurrogatePair(tc.r); got != tc.expected {\n\t\t\t\tt.Errorf(\"isSurrogate() = %v, want %v\", got, tc.expected)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestCombineSurrogates(t *testing.T) {\n\ttestCases := []struct {\n\t\thigh, low rune\n\t\texpected rune\n\t}{\n\t\t{0xD83D, 0xDC36, 0x1F436}, // 🐶 U+1F436 DOG FACE\n\t\t{0xD83D, 0xDE00, 0x1F600}, // 😀 U+1F600 GRINNING FACE\n\t\t{0xD83C, 0xDF03, 0x1F303}, // 🌃 U+1F303 NIGHT WITH STARS\n\t}\n\n\tfor _, tc := range testCases {\n\t\tresult := combineSurrogates(tc.high, tc.low)\n\t\tif result != tc.expected {\n\t\t\tt.Errorf(\"combineSurrogates(%U, %U) = %U; want %U\", tc.high, tc.low, result, tc.expected)\n\t\t}\n\t}\n}\n\nfunc TestDecodeSingleUnicodeEscape(t *testing.T) {\n\ttestCases := []struct {\n\t\tinput []byte\n\t\texpected rune\n\t\tisValid bool\n\t}{\n\t\t// valid unicode escape sequences\n\t\t{[]byte(`\\u0041`), 'A', true},\n\t\t{[]byte(`\\u03B1`), 'α', true},\n\t\t{[]byte(`\\u00E9`), 'é', true}, // valid non-English character\n\t\t{[]byte(`\\u0021`), '!', true}, // valid special character\n\t\t{[]byte(`\\uFF11`), '1', true},\n\t\t{[]byte(`\\uD83D`), 0xD83D, true},\n\t\t{[]byte(`\\uDE03`), 0xDE03, true},\n\n\t\t// invalid unicode escape sequences\n\t\t{[]byte(`\\u004`), utf8.RuneError, false}, // too short\n\t\t{[]byte(`\\uXYZW`), utf8.RuneError, false}, // invalid hex\n\t\t{[]byte(`\\u00G1`), utf8.RuneError, false}, // non-hex character\n\t}\n\n\tfor _, tc := range testCases {\n\t\tresult, isValid := decodeSingleUnicodeEscape(tc.input)\n\t\tif result != tc.expected || isValid != tc.isValid {\n\t\t\tt.Errorf(\"decodeSingleUnicodeEscape(%s) = (%U, %v); want (%U, %v)\", tc.input, result, isValid, tc.expected, tc.isValid)\n\t\t}\n\t}\n}\n\nfunc TestDecodeUnicodeEscape(t *testing.T) {\n\ttestCases := []struct {\n\t\tinput string\n\t\texpected rune\n\t\tsize int\n\t}{\n\t\t{\"\\\\u0041\", 'A', 6},\n\t\t{\"\\\\u03B1\", 'α', 6},\n\t\t{\"\\\\u1F600\", 0x1F60, 6},\n\t\t{\"\\\\uD830\\\\uDE03\", 0x1C203, 12},\n\t\t{\"\\\\uD800\\\\uDC00\", 0x00010000, 12},\n\n\t\t{\"\\\\u004\", utf8.RuneError, -1},\n\t\t{\"\\\\uXYZW\", utf8.RuneError, -1},\n\t\t{\"\\\\uD83D\\\\u0041\", utf8.RuneError, -1},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tr, size := decodeUnicodeEscape([]byte(tc.input))\n\t\tif r != tc.expected || size != tc.size {\n\t\t\tt.Errorf(\"decodeUnicodeEscape(%q) = (%U, %d); want (%U, %d)\", tc.input, r, size, tc.expected, tc.size)\n\t\t}\n\t}\n}\n\nfunc TestUnescapeToUTF8(t *testing.T) {\n\ttestCases := []struct {\n\t\tinput []byte\n\t\texpectedIn int\n\t\texpectedOut int\n\t\tisError bool\n\t}{\n\t\t// valid escape sequences\n\t\t{[]byte(`\\n`), 2, 1, false},\n\t\t{[]byte(`\\t`), 2, 1, false},\n\t\t{[]byte(`\\u0041`), 6, 1, false},\n\t\t{[]byte(`\\u03B1`), 6, 2, false},\n\t\t{[]byte(`\\uD830\\uDE03`), 12, 4, false},\n\n\t\t// invalid escape sequences\n\t\t{[]byte(`\\`), -1, -1, true}, // incomplete escape sequence\n\t\t{[]byte(`\\x`), -1, -1, true}, // invalid escape character\n\t\t{[]byte(`\\u`), -1, -1, true}, // incomplete unicode escape sequence\n\t\t{[]byte(`\\u004`), -1, -1, true}, // invalid unicode escape sequence\n\t\t{[]byte(`\\uXYZW`), -1, -1, true}, // invalid unicode escape sequence\n\t\t{[]byte(`\\uD83D\\u0041`), -1, -1, true}, // invalid unicode escape sequence\n\t}\n\n\tfor _, tc := range testCases {\n\t\tinput := make([]byte, len(tc.input))\n\t\tcopy(input, tc.input)\n\t\toutput := make([]byte, utf8.UTFMax)\n\t\tinLen, outLen, err := processEscapedUTF8(input, output)\n\t\tif (err != nil) != tc.isError {\n\t\t\tt.Errorf(\"processEscapedUTF8(%q) = %v; want %v\", tc.input, err, tc.isError)\n\t\t}\n\n\t\tif inLen != tc.expectedIn || outLen != tc.expectedOut {\n\t\t\tt.Errorf(\"processEscapedUTF8(%q) = (%d, %d); want (%d, %d)\", tc.input, inLen, outLen, tc.expectedIn, tc.expectedOut)\n\t\t}\n\t}\n}\n\nfunc TestUnescape(t *testing.T) {\n\ttestCases := []struct {\n\t\tname string\n\t\tinput []byte\n\t\texpected []byte\n\t}{\n\t\t{\"NoEscape\", []byte(\"hello world\"), []byte(\"hello world\")},\n\t\t{\"SingleEscape\", []byte(\"hello\\\\nworld\"), []byte(\"hello\\nworld\")},\n\t\t{\"MultipleEscapes\", []byte(\"line1\\\\nline2\\\\r\\\\nline3\"), []byte(\"line1\\nline2\\r\\nline3\")},\n\t\t{\"UnicodeEscape\", []byte(\"snowman:\\\\u2603\"), []byte(\"snowman:\\u2603\")},\n\t\t{\"Complex\", []byte(\"tc\\\\n\\\\u2603\\\\r\\\\nend\"), []byte(\"tc\\n\\u2603\\r\\nend\")},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\toutput, _ := Unescape(tc.input, make([]byte, len(tc.input)+10))\n\t\t\tif !bytes.Equal(output, tc.expected) {\n\t\t\t\tt.Errorf(\"unescape(%q) = %q; want %q\", tc.input, output, tc.expected)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestUnquoteBytes(t *testing.T) {\n\ttests := []struct {\n\t\tinput []byte\n\t\tborder byte\n\t\texpected []byte\n\t\tok bool\n\t}{\n\t\t{[]byte(\"\\\"hello\\\"\"), '\"', []byte(\"hello\"), true},\n\t\t{[]byte(\"'hello'\"), '\\'', []byte(\"hello\"), true},\n\t\t{[]byte(\"\\\"hello\"), '\"', nil, false},\n\t\t{[]byte(\"hello\\\"\"), '\"', nil, false},\n\t\t{[]byte(\"\\\"he\\\\\\\"llo\\\"\"), '\"', []byte(\"he\\\"llo\"), true},\n\t\t{[]byte(\"\\\"he\\\\nllo\\\"\"), '\"', []byte(\"he\\nllo\"), true},\n\t\t{[]byte(\"\\\"\\\"\"), '\"', []byte(\"\"), true},\n\t\t{[]byte(\"''\"), '\\'', []byte(\"\"), true},\n\t\t{[]byte(\"\\\"\\\\u0041\\\"\"), '\"', []byte(\"A\"), true},\n\t\t{[]byte(`\"Hello, 世界\"`), '\"', []byte(\"Hello, 世界\"), true},\n\t\t{[]byte(`\"Hello, \\x80\"`), '\"', nil, false},\n\t}\n\n\tfor _, tc := range tests {\n\t\tresult, pass := unquoteBytes(tc.input, tc.border)\n\n\t\tif pass != tc.ok {\n\t\t\tt.Errorf(\"unquoteBytes(%q) = %v; want %v\", tc.input, pass, tc.ok)\n\t\t}\n\n\t\tif !bytes.Equal(result, tc.expected) {\n\t\t\tt.Errorf(\"unquoteBytes(%q) = %q; want %q\", tc.input, result, tc.expected)\n\t\t}\n\t}\n}\n"},{"name":"indent.gno","body":"package json\n\nimport (\n\t\"bytes\"\n\t\"strings\"\n)\n\n// indentGrowthFactor specifies the growth factor of indenting JSON input.\n// A factor no higher than 2 ensures that wasted space never exceeds 50%.\nconst indentGrowthFactor = 2\n\n// IndentJSON takes a JSON byte slice and a string for indentation,\n// then formats the JSON according to the specified indent string.\n// This function applies indentation rules as follows:\n//\n// 1. For top-level arrays and objects, no additional indentation is applied.\n//\n// 2. For nested structures like arrays within arrays or objects, indentation increases.\n//\n// 3. Indentation is applied after opening brackets ('[' or '{') and before closing brackets (']' or '}').\n//\n// 4. Commas and colons are handled appropriately to maintain valid JSON format.\n//\n// 5. Nested arrays within objects or arrays receive new lines and indentation based on their depth level.\n//\n// The function returns the formatted JSON as a byte slice and an error if any issues occurred during formatting.\nfunc Indent(data []byte, indent string) ([]byte, error) {\n\tvar (\n\t\tout bytes.Buffer\n\t\tlevel int\n\t\tinArray bool\n\t\tarrayDepth int\n\t)\n\n\tfor i := 0; i \u003c len(data); i++ {\n\t\tc := data[i] // current character\n\n\t\tswitch c {\n\t\tcase bracketOpen:\n\t\t\tarrayDepth++\n\t\t\tif arrayDepth \u003e 1 {\n\t\t\t\tlevel++ // increase the level if it's nested array\n\t\t\t\tinArray = true\n\n\t\t\t\tif err := out.WriteByte(c); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\n\t\t\t\tif err := writeNewlineAndIndent(\u0026out, level, indent); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// case of the top-level array\n\t\t\t\tinArray = true\n\t\t\t\tif err := out.WriteByte(c); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t}\n\n\t\tcase bracketClose:\n\t\t\tif inArray \u0026\u0026 arrayDepth \u003e 1 { // nested array\n\t\t\t\tlevel--\n\t\t\t\tif err := writeNewlineAndIndent(\u0026out, level, indent); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tarrayDepth--\n\t\t\tif arrayDepth == 0 {\n\t\t\t\tinArray = false\n\t\t\t}\n\n\t\t\tif err := out.WriteByte(c); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\n\t\tcase curlyOpen:\n\t\t\t// check if the empty object or array\n\t\t\t// we don't need to apply the indent when it's empty containers.\n\t\t\tif i+1 \u003c len(data) \u0026\u0026 data[i+1] == curlyClose {\n\t\t\t\tif err := out.WriteByte(c); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\n\t\t\t\ti++ // skip next character\n\t\t\t\tif err := out.WriteByte(data[i]); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif err := out.WriteByte(c); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\n\t\t\t\tlevel++\n\t\t\t\tif err := writeNewlineAndIndent(\u0026out, level, indent); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t}\n\n\t\tcase curlyClose:\n\t\t\tlevel--\n\t\t\tif err := writeNewlineAndIndent(\u0026out, level, indent); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif err := out.WriteByte(c); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\n\t\tcase comma, colon:\n\t\t\tif err := out.WriteByte(c); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t\tif inArray \u0026\u0026 arrayDepth \u003e 1 { // nested array\n\t\t\t\tif err := writeNewlineAndIndent(\u0026out, level, indent); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t} else if c == colon {\n\t\t\t\tif err := out.WriteByte(' '); err != nil {\n\t\t\t\t\treturn nil, err\n\t\t\t\t}\n\t\t\t}\n\n\t\tdefault:\n\t\t\tif err := out.WriteByte(c); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\t\t}\n\t}\n\n\treturn out.Bytes(), nil\n}\n\nfunc writeNewlineAndIndent(out *bytes.Buffer, level int, indent string) error {\n\tif err := out.WriteByte('\\n'); err != nil {\n\t\treturn err\n\t}\n\n\tidt := strings.Repeat(indent, level*indentGrowthFactor)\n\tif _, err := out.WriteString(idt); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n"},{"name":"indent_test.gno","body":"package json\n\nimport (\n\t\"bytes\"\n\t\"testing\"\n)\n\nfunc TestIndentJSON(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tinput []byte\n\t\tindent string\n\t\texpected []byte\n\t}{\n\t\t{\n\t\t\tname: \"empty object\",\n\t\t\tinput: []byte(`{}`),\n\t\t\tindent: \" \",\n\t\t\texpected: []byte(`{}`),\n\t\t},\n\t\t{\n\t\t\tname: \"empty array\",\n\t\t\tinput: []byte(`[]`),\n\t\t\tindent: \" \",\n\t\t\texpected: []byte(`[]`),\n\t\t},\n\t\t{\n\t\t\tname: \"nested object\",\n\t\t\tinput: []byte(`{{}}`),\n\t\t\tindent: \"\\t\",\n\t\t\texpected: []byte(\"{\\n\\t\\t{}\\n}\"),\n\t\t},\n\t\t{\n\t\t\tname: \"nested array\",\n\t\t\tinput: []byte(`[[[]]]`),\n\t\t\tindent: \"\\t\",\n\t\t\texpected: []byte(\"[[\\n\\t\\t[\\n\\t\\t\\t\\t\\n\\t\\t]\\n]]\"),\n\t\t},\n\t\t{\n\t\t\tname: \"top-level array\",\n\t\t\tinput: []byte(`[\"apple\",\"banana\",\"cherry\"]`),\n\t\t\tindent: \"\\t\",\n\t\t\texpected: []byte(`[\"apple\",\"banana\",\"cherry\"]`),\n\t\t},\n\t\t{\n\t\t\tname: \"array of arrays\",\n\t\t\tinput: []byte(`[\"apple\",[\"banana\",\"cherry\"],\"date\"]`),\n\t\t\tindent: \" \",\n\t\t\texpected: []byte(\"[\\\"apple\\\",[\\n \\\"banana\\\",\\n \\\"cherry\\\"\\n],\\\"date\\\"]\"),\n\t\t},\n\n\t\t{\n\t\t\tname: \"nested array in object\",\n\t\t\tinput: []byte(`{\"fruits\":[\"apple\",[\"banana\",\"cherry\"],\"date\"]}`),\n\t\t\tindent: \" \",\n\t\t\texpected: []byte(\"{\\n \\\"fruits\\\": [\\\"apple\\\",[\\n \\\"banana\\\",\\n \\\"cherry\\\"\\n ],\\\"date\\\"]\\n}\"),\n\t\t},\n\t\t{\n\t\t\tname: \"complex nested structure\",\n\t\t\tinput: []byte(`{\"data\":{\"array\":[1,2,3],\"bool\":true,\"nestedArray\":[[\"a\",\"b\"],\"c\"]}}`),\n\t\t\tindent: \" \",\n\t\t\texpected: []byte(\"{\\n \\\"data\\\": {\\n \\\"array\\\": [1,2,3],\\\"bool\\\": true,\\\"nestedArray\\\": [[\\n \\\"a\\\",\\n \\\"b\\\"\\n ],\\\"c\\\"]\\n }\\n}\"),\n\t\t},\n\t\t{\n\t\t\tname: \"custom ident character\",\n\t\t\tinput: []byte(`{\"fruits\":[\"apple\",[\"banana\",\"cherry\"],\"date\"]}`),\n\t\t\tindent: \"*\",\n\t\t\texpected: []byte(\"{\\n**\\\"fruits\\\": [\\\"apple\\\",[\\n****\\\"banana\\\",\\n****\\\"cherry\\\"\\n**],\\\"date\\\"]\\n}\"),\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tactual, err := Indent(tt.input, tt.indent)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"IndentJSON() error = %v\", err)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif !bytes.Equal(actual, tt.expected) {\n\t\t\t\tt.Errorf(\"IndentJSON() = %q, want %q\", actual, tt.expected)\n\t\t\t}\n\t\t})\n\t}\n}\n"},{"name":"internal.gno","body":"package json\n\n// Reference: https://github.com/freddierice/php_source/blob/467ed5d6edff72219afd3e644516f131118ef48e/ext/json/JSON_parser.c\n// Copyright (c) 2005 JSON.org\n\n// Go implementation is taken from: https://github.com/spyzhov/ajson/blob/master/internal/state.go\n\ntype (\n\tStates int8 // possible states of the parser\n\tClasses int8 // JSON string character types\n)\n\nconst __ = -1\n\n// enum classes\nconst (\n\tC_SPACE Classes = iota /* space */\n\tC_WHITE /* other whitespace */\n\tC_LCURB /* { */\n\tC_RCURB /* } */\n\tC_LSQRB /* [ */\n\tC_RSQRB /* ] */\n\tC_COLON /* : */\n\tC_COMMA /* , */\n\tC_QUOTE /* \" */\n\tC_BACKS /* \\ */\n\tC_SLASH /* / */\n\tC_PLUS /* + */\n\tC_MINUS /* - */\n\tC_POINT /* . */\n\tC_ZERO /* 0 */\n\tC_DIGIT /* 123456789 */\n\tC_LOW_A /* a */\n\tC_LOW_B /* b */\n\tC_LOW_C /* c */\n\tC_LOW_D /* d */\n\tC_LOW_E /* e */\n\tC_LOW_F /* f */\n\tC_LOW_L /* l */\n\tC_LOW_N /* n */\n\tC_LOW_R /* r */\n\tC_LOW_S /* s */\n\tC_LOW_T /* t */\n\tC_LOW_U /* u */\n\tC_ABCDF /* ABCDF */\n\tC_E /* E */\n\tC_ETC /* everything else */\n)\n\n// AsciiClasses array maps the 128 ASCII characters into character classes.\nvar AsciiClasses = [128]Classes{\n\t/*\n\t This array maps the 128 ASCII characters into character classes.\n\t The remaining Unicode characters should be mapped to C_ETC.\n\t Non-whitespace control characters are errors.\n\t*/\n\t__, __, __, __, __, __, __, __,\n\t__, C_WHITE, C_WHITE, __, __, C_WHITE, __, __,\n\t__, __, __, __, __, __, __, __,\n\t__, __, __, __, __, __, __, __,\n\n\tC_SPACE, C_ETC, C_QUOTE, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC,\n\tC_ETC, C_ETC, C_ETC, C_PLUS, C_COMMA, C_MINUS, C_POINT, C_SLASH,\n\tC_ZERO, C_DIGIT, C_DIGIT, C_DIGIT, C_DIGIT, C_DIGIT, C_DIGIT, C_DIGIT,\n\tC_DIGIT, C_DIGIT, C_COLON, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC,\n\n\tC_ETC, C_ABCDF, C_ABCDF, C_ABCDF, C_ABCDF, C_E, C_ABCDF, C_ETC,\n\tC_ETC, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC,\n\tC_ETC, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC,\n\tC_ETC, C_ETC, C_ETC, C_LSQRB, C_BACKS, C_RSQRB, C_ETC, C_ETC,\n\n\tC_ETC, C_LOW_A, C_LOW_B, C_LOW_C, C_LOW_D, C_LOW_E, C_LOW_F, C_ETC,\n\tC_ETC, C_ETC, C_ETC, C_ETC, C_LOW_L, C_ETC, C_LOW_N, C_ETC,\n\tC_ETC, C_ETC, C_LOW_R, C_LOW_S, C_LOW_T, C_LOW_U, C_ETC, C_ETC,\n\tC_ETC, C_ETC, C_ETC, C_LCURB, C_ETC, C_RCURB, C_ETC, C_ETC,\n}\n\n// QuoteAsciiClasses is a HACK for single quote from AsciiClasses\nvar QuoteAsciiClasses = [128]Classes{\n\t/*\n\t This array maps the 128 ASCII characters into character classes.\n\t The remaining Unicode characters should be mapped to C_ETC.\n\t Non-whitespace control characters are errors.\n\t*/\n\t__, __, __, __, __, __, __, __,\n\t__, C_WHITE, C_WHITE, __, __, C_WHITE, __, __,\n\t__, __, __, __, __, __, __, __,\n\t__, __, __, __, __, __, __, __,\n\n\tC_SPACE, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC, C_QUOTE,\n\tC_ETC, C_ETC, C_ETC, C_PLUS, C_COMMA, C_MINUS, C_POINT, C_SLASH,\n\tC_ZERO, C_DIGIT, C_DIGIT, C_DIGIT, C_DIGIT, C_DIGIT, C_DIGIT, C_DIGIT,\n\tC_DIGIT, C_DIGIT, C_COLON, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC,\n\n\tC_ETC, C_ABCDF, C_ABCDF, C_ABCDF, C_ABCDF, C_E, C_ABCDF, C_ETC,\n\tC_ETC, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC,\n\tC_ETC, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC,\n\tC_ETC, C_ETC, C_ETC, C_LSQRB, C_BACKS, C_RSQRB, C_ETC, C_ETC,\n\n\tC_ETC, C_LOW_A, C_LOW_B, C_LOW_C, C_LOW_D, C_LOW_E, C_LOW_F, C_ETC,\n\tC_ETC, C_ETC, C_ETC, C_ETC, C_LOW_L, C_ETC, C_LOW_N, C_ETC,\n\tC_ETC, C_ETC, C_LOW_R, C_LOW_S, C_LOW_T, C_LOW_U, C_ETC, C_ETC,\n\tC_ETC, C_ETC, C_ETC, C_LCURB, C_ETC, C_RCURB, C_ETC, C_ETC,\n}\n\n/*\nThe state codes.\n*/\nconst (\n\tGO States = iota /* start */\n\tOK /* ok */\n\tOB /* object */\n\tKE /* key */\n\tCO /* colon */\n\tVA /* value */\n\tAR /* array */\n\tST /* string */\n\tES /* escape */\n\tU1 /* u1 */\n\tU2 /* u2 */\n\tU3 /* u3 */\n\tU4 /* u4 */\n\tMI /* minus */\n\tZE /* zero */\n\tIN /* integer */\n\tDT /* dot */\n\tFR /* fraction */\n\tE1 /* e */\n\tE2 /* ex */\n\tE3 /* exp */\n\tT1 /* tr */\n\tT2 /* tru */\n\tT3 /* true */\n\tF1 /* fa */\n\tF2 /* fal */\n\tF3 /* fals */\n\tF4 /* false */\n\tN1 /* nu */\n\tN2 /* nul */\n\tN3 /* null */\n)\n\n// List of action codes.\n// these constants are defining an action that should be performed under certain conditions.\nconst (\n\tcl States = -2 /* colon */\n\tcm States = -3 /* comma */\n\tqt States = -4 /* quote */\n\tbo States = -5 /* bracket open */\n\tco States = -6 /* curly bracket open */\n\tbc States = -7 /* bracket close */\n\tcc States = -8 /* curly bracket close */\n\tec States = -9 /* curly bracket empty */\n)\n\n// StateTransitionTable is the state transition table takes the current state and the current symbol, and returns either\n// a new state or an action. An action is represented as a negative number. A JSON text is accepted if at the end of the\n// text the state is OK and if the mode is DONE.\nvar StateTransitionTable = [31][31]States{\n\t/*\n\t The state transition table takes the current state and the current symbol,\n\t and returns either a new state or an action. An action is represented as a\n\t negative number. A JSON text is accepted if at the end of the text the\n\t state is OK and if the mode is DONE.\n\t white 1-9 ABCDF etc\n\t space | { } [ ] : , \" \\ / + - . 0 | a b c d e f l n r s t u | E |*/\n\t/*start GO*/ {GO, GO, co, __, bo, __, __, __, ST, __, __, __, MI, __, ZE, IN, __, __, __, __, __, F1, __, N1, __, __, T1, __, __, __, __},\n\t/*ok OK*/ {OK, OK, __, cc, __, bc, __, cm, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __},\n\t/*object OB*/ {OB, OB, __, ec, __, __, __, __, ST, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __},\n\t/*key KE*/ {KE, KE, __, __, __, __, __, __, ST, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __},\n\t/*colon CO*/ {CO, CO, __, __, __, __, cl, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __},\n\t/*value VA*/ {VA, VA, co, __, bo, __, __, __, ST, __, __, __, MI, __, ZE, IN, __, __, __, __, __, F1, __, N1, __, __, T1, __, __, __, __},\n\t/*array AR*/ {AR, AR, co, __, bo, bc, __, __, ST, __, __, __, MI, __, ZE, IN, __, __, __, __, __, F1, __, N1, __, __, T1, __, __, __, __},\n\t/*string ST*/ {ST, __, ST, ST, ST, ST, ST, ST, qt, ES, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST},\n\t/*escape ES*/ {__, __, __, __, __, __, __, __, ST, ST, ST, __, __, __, __, __, __, ST, __, __, __, ST, __, ST, ST, __, ST, U1, __, __, __},\n\t/*u1 U1*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, U2, U2, U2, U2, U2, U2, U2, U2, __, __, __, __, __, __, U2, U2, __},\n\t/*u2 U2*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, U3, U3, U3, U3, U3, U3, U3, U3, __, __, __, __, __, __, U3, U3, __},\n\t/*u3 U3*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, U4, U4, U4, U4, U4, U4, U4, U4, __, __, __, __, __, __, U4, U4, __},\n\t/*u4 U4*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, ST, ST, ST, ST, ST, ST, ST, ST, __, __, __, __, __, __, ST, ST, __},\n\t/*minus MI*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, ZE, IN, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __},\n\t/*zero ZE*/ {OK, OK, __, cc, __, bc, __, cm, __, __, __, __, __, DT, __, __, __, __, __, __, E1, __, __, __, __, __, __, __, __, E1, __},\n\t/*int IN*/ {OK, OK, __, cc, __, bc, __, cm, __, __, __, __, __, DT, IN, IN, __, __, __, __, E1, __, __, __, __, __, __, __, __, E1, __},\n\t/*dot DT*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, FR, FR, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __},\n\t/*frac FR*/ {OK, OK, __, cc, __, bc, __, cm, __, __, __, __, __, __, FR, FR, __, __, __, __, E1, __, __, __, __, __, __, __, __, E1, __},\n\t/*e E1*/ {__, __, __, __, __, __, __, __, __, __, __, E2, E2, __, E3, E3, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __},\n\t/*ex E2*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, E3, E3, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __},\n\t/*exp E3*/ {OK, OK, __, cc, __, bc, __, cm, __, __, __, __, __, __, E3, E3, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __},\n\t/*tr T1*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, T2, __, __, __, __, __, __},\n\t/*tru T2*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, T3, __, __, __},\n\t/*true T3*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, OK, __, __, __, __, __, __, __, __, __, __},\n\t/*fa F1*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, F2, __, __, __, __, __, __, __, __, __, __, __, __, __, __},\n\t/*fal F2*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, F3, __, __, __, __, __, __, __, __},\n\t/*fals F3*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, F4, __, __, __, __, __},\n\t/*false F4*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, OK, __, __, __, __, __, __, __, __, __, __},\n\t/*nu N1*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, N2, __, __, __},\n\t/*nul N2*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, N3, __, __, __, __, __, __, __, __},\n\t/*null N3*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, OK, __, __, __, __, __, __, __, __},\n}\n"},{"name":"node.gno","body":"package json\n\nimport (\n\t\"errors\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/ufmt\"\n)\n\n// Node represents a JSON node.\ntype Node struct {\n\tprev *Node // prev is the parent node of the current node.\n\tnext map[string]*Node // next is the child nodes of the current node.\n\tkey *string // key holds the key of the current node in the parent node.\n\tdata []byte // byte slice of JSON data\n\tvalue interface{} // value holds the value of the current node.\n\tnodeType ValueType // NodeType holds the type of the current node. (Object, Array, String, Number, Boolean, Null)\n\tindex *int // index holds the index of the current node in the parent array node.\n\tborders [2]int // borders stores the start and end index of the current node in the data.\n\tmodified bool // modified indicates the current node is changed or not.\n}\n\n// NewNode creates a new node instance with the given parent node, buffer, type, and key.\nfunc NewNode(prev *Node, b *buffer, typ ValueType, key **string) (*Node, error) {\n\tcurr := \u0026Node{\n\t\tprev: prev,\n\t\tdata: b.data,\n\t\tborders: [2]int{b.index, 0},\n\t\tkey: *key,\n\t\tnodeType: typ,\n\t\tmodified: false,\n\t}\n\n\tif typ == Object || typ == Array {\n\t\tcurr.next = make(map[string]*Node)\n\t}\n\n\tif prev != nil {\n\t\tif prev.IsArray() {\n\t\t\tsize := len(prev.next)\n\t\t\tcurr.index = \u0026size\n\n\t\t\tprev.next[strconv.Itoa(size)] = curr\n\t\t} else if prev.IsObject() {\n\t\t\tif key == nil {\n\t\t\t\treturn nil, errors.New(\"key is required for object\")\n\t\t\t}\n\n\t\t\tprev.next[**key] = curr\n\t\t} else {\n\t\t\treturn nil, errors.New(\"invalid parent type\")\n\t\t}\n\t}\n\n\treturn curr, nil\n}\n\n// load retrieves the value of the current node.\nfunc (n *Node) load() interface{} {\n\treturn n.value\n}\n\n// Changed checks the current node is changed or not.\nfunc (n *Node) Changed() bool {\n\treturn n.modified\n}\n\n// Key returns the key of the current node.\nfunc (n *Node) Key() string {\n\tif n == nil || n.key == nil {\n\t\treturn \"\"\n\t}\n\n\treturn *n.key\n}\n\n// HasKey checks the current node has the given key or not.\nfunc (n *Node) HasKey(key string) bool {\n\tif n == nil {\n\t\treturn false\n\t}\n\n\t_, ok := n.next[key]\n\treturn ok\n}\n\n// GetKey returns the value of the given key from the current object node.\nfunc (n *Node) GetKey(key string) (*Node, error) {\n\tif n == nil {\n\t\treturn nil, errors.New(\"node is nil\")\n\t}\n\n\tif n.Type() != Object {\n\t\treturn nil, ufmt.Errorf(\"target node is not object type. got: %s\", n.Type().String())\n\t}\n\n\tvalue, ok := n.next[key]\n\tif !ok {\n\t\treturn nil, ufmt.Errorf(\"key not found: %s\", key)\n\t}\n\n\treturn value, nil\n}\n\n// MustKey returns the value of the given key from the current object node.\nfunc (n *Node) MustKey(key string) *Node {\n\tval, err := n.GetKey(key)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\treturn val\n}\n\n// UniqueKeyLists traverses the current JSON nodes and collects all the unique keys.\nfunc (n *Node) UniqueKeyLists() []string {\n\tvar collectKeys func(*Node) []string\n\tcollectKeys = func(node *Node) []string {\n\t\tif node == nil || !node.IsObject() {\n\t\t\treturn nil\n\t\t}\n\n\t\tresult := make(map[string]bool)\n\t\tfor key, childNode := range node.next {\n\t\t\tresult[key] = true\n\t\t\tchildKeys := collectKeys(childNode)\n\t\t\tfor _, childKey := range childKeys {\n\t\t\t\tresult[childKey] = true\n\t\t\t}\n\t\t}\n\n\t\tkeys := make([]string, 0, len(result))\n\t\tfor key := range result {\n\t\t\tkeys = append(keys, key)\n\t\t}\n\t\treturn keys\n\t}\n\n\treturn collectKeys(n)\n}\n\n// Empty returns true if the current node is empty.\nfunc (n *Node) Empty() bool {\n\tif n == nil {\n\t\treturn false\n\t}\n\n\treturn len(n.next) == 0\n}\n\n// Type returns the type (ValueType) of the current node.\nfunc (n *Node) Type() ValueType {\n\treturn n.nodeType\n}\n\n// Value returns the value of the current node.\n//\n// Usage:\n//\n//\troot := Unmarshal([]byte(`{\"key\": \"value\"}`))\n//\tval, err := root.MustKey(\"key\").Value()\n//\tif err != nil {\n//\t\tt.Errorf(\"Value returns error: %v\", err)\n//\t}\n//\n//\tresult: \"value\"\nfunc (n *Node) Value() (value interface{}, err error) {\n\tvalue = n.load()\n\n\tif value == nil {\n\t\tswitch n.nodeType {\n\t\tcase Null:\n\t\t\treturn nil, nil\n\n\t\tcase Number:\n\t\t\tvalue, err = ParseFloatLiteral(n.source())\n\t\t\tif err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\n\t\t\tn.value = value\n\n\t\tcase String:\n\t\t\tvar ok bool\n\t\t\tvalue, ok = Unquote(n.source(), doubleQuote)\n\t\t\tif !ok {\n\t\t\t\treturn \"\", errors.New(\"invalid string value\")\n\t\t\t}\n\n\t\t\tn.value = value\n\n\t\tcase Boolean:\n\t\t\tif len(n.source()) == 0 {\n\t\t\t\treturn nil, errors.New(\"empty boolean value\")\n\t\t\t}\n\n\t\t\tb := n.source()[0]\n\t\t\tvalue = b == 't' || b == 'T'\n\t\t\tn.value = value\n\n\t\tcase Array:\n\t\t\telems := make([]*Node, len(n.next))\n\n\t\t\tfor _, e := range n.next {\n\t\t\t\telems[*e.index] = e\n\t\t\t}\n\n\t\t\tvalue = elems\n\t\t\tn.value = value\n\n\t\tcase Object:\n\t\t\tobj := make(map[string]*Node, len(n.next))\n\n\t\t\tfor k, v := range n.next {\n\t\t\t\tobj[k] = v\n\t\t\t}\n\n\t\t\tvalue = obj\n\t\t\tn.value = value\n\t\t}\n\t}\n\n\treturn value, nil\n}\n\n// Delete removes the current node from the parent node.\n//\n// Usage:\n//\n//\troot := Unmarshal([]byte(`{\"key\": \"value\"}`))\n//\tif err := root.MustKey(\"key\").Delete(); err != nil {\n//\t\tt.Errorf(\"Delete returns error: %v\", err)\n//\t}\n//\n//\tresult: {} (empty object)\nfunc (n *Node) Delete() error {\n\tif n == nil {\n\t\treturn errors.New(\"can't delete nil node\")\n\t}\n\n\tif n.prev == nil {\n\t\treturn nil\n\t}\n\n\treturn n.prev.remove(n)\n}\n\n// Size returns the size (length) of the current array node.\n//\n// Usage:\n//\n//\troot := ArrayNode(\"\", []*Node{StringNode(\"\", \"foo\"), NumberNode(\"\", 1)})\n//\tif root == nil {\n//\t\tt.Errorf(\"ArrayNode returns nil\")\n//\t}\n//\n//\tif root.Size() != 2 {\n//\t\tt.Errorf(\"ArrayNode returns wrong size: %d\", root.Size())\n//\t}\nfunc (n *Node) Size() int {\n\tif n == nil {\n\t\treturn 0\n\t}\n\n\treturn len(n.next)\n}\n\n// Index returns the index of the current node in the parent array node.\n//\n// Usage:\n//\n//\troot := ArrayNode(\"\", []*Node{StringNode(\"\", \"foo\"), NumberNode(\"\", 1)})\n//\tif root == nil {\n//\t\tt.Errorf(\"ArrayNode returns nil\")\n//\t}\n//\n//\tif root.MustIndex(1).Index() != 1 {\n//\t\tt.Errorf(\"Index returns wrong index: %d\", root.MustIndex(1).Index())\n//\t}\n//\n// We can also use the index to the byte slice of the JSON data directly.\n//\n// Example:\n//\n//\troot := Unmarshal([]byte(`[\"foo\", 1]`))\n//\tif root == nil {\n//\t\tt.Errorf(\"Unmarshal returns nil\")\n//\t}\n//\n//\tif string(root.MustIndex(1).source()) != \"1\" {\n//\t\tt.Errorf(\"source returns wrong result: %s\", root.MustIndex(1).source())\n//\t}\nfunc (n *Node) Index() int {\n\tif n == nil || n.index == nil {\n\t\treturn -1\n\t}\n\n\treturn *n.index\n}\n\n// MustIndex returns the array element at the given index.\n//\n// If the index is negative, it returns the index is from the end of the array.\n// Also, it panics if the index is not found.\n//\n// check the Index method for detailed usage.\nfunc (n *Node) MustIndex(expectIdx int) *Node {\n\tval, err := n.GetIndex(expectIdx)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\treturn val\n}\n\n// GetIndex returns the array element at the given index.\n//\n// if the index is negative, it returns the index is from the end of the array.\nfunc (n *Node) GetIndex(idx int) (*Node, error) {\n\tif n == nil {\n\t\treturn nil, errors.New(\"node is nil\")\n\t}\n\n\tif !n.IsArray() {\n\t\treturn nil, errors.New(\"node is not array\")\n\t}\n\n\tif idx \u003e n.Size() {\n\t\treturn nil, errors.New(\"input index exceeds the array size\")\n\t}\n\n\tif idx \u003c 0 {\n\t\tidx += len(n.next)\n\t}\n\n\tchild, ok := n.next[strconv.Itoa(idx)]\n\tif !ok {\n\t\treturn nil, errors.New(\"index not found\")\n\t}\n\n\treturn child, nil\n}\n\n// DeleteIndex removes the array element at the given index.\nfunc (n *Node) DeleteIndex(idx int) error {\n\tnode, err := n.GetIndex(idx)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn n.remove(node)\n}\n\n// NullNode creates a new null type node.\n//\n// Usage:\n//\n//\t_ := NullNode(\"\")\nfunc NullNode(key string) *Node {\n\treturn \u0026Node{\n\t\tkey: \u0026key,\n\t\tvalue: nil,\n\t\tnodeType: Null,\n\t\tmodified: true,\n\t}\n}\n\n// NumberNode creates a new number type node.\n//\n// Usage:\n//\n//\troot := NumberNode(\"\", 1)\n//\tif root == nil {\n//\t\tt.Errorf(\"NumberNode returns nil\")\n//\t}\nfunc NumberNode(key string, value float64) *Node {\n\treturn \u0026Node{\n\t\tkey: \u0026key,\n\t\tvalue: value,\n\t\tnodeType: Number,\n\t\tmodified: true,\n\t}\n}\n\n// StringNode creates a new string type node.\n//\n// Usage:\n//\n//\troot := StringNode(\"\", \"foo\")\n//\tif root == nil {\n//\t\tt.Errorf(\"StringNode returns nil\")\n//\t}\nfunc StringNode(key string, value string) *Node {\n\treturn \u0026Node{\n\t\tkey: \u0026key,\n\t\tvalue: value,\n\t\tnodeType: String,\n\t\tmodified: true,\n\t}\n}\n\n// BoolNode creates a new given boolean value node.\n//\n// Usage:\n//\n//\troot := BoolNode(\"\", true)\n//\tif root == nil {\n//\t\tt.Errorf(\"BoolNode returns nil\")\n//\t}\nfunc BoolNode(key string, value bool) *Node {\n\treturn \u0026Node{\n\t\tkey: \u0026key,\n\t\tvalue: value,\n\t\tnodeType: Boolean,\n\t\tmodified: true,\n\t}\n}\n\n// ArrayNode creates a new array type node.\n//\n// If the given value is nil, it creates an empty array node.\n//\n// Usage:\n//\n//\troot := ArrayNode(\"\", []*Node{StringNode(\"\", \"foo\"), NumberNode(\"\", 1)})\n//\tif root == nil {\n//\t\tt.Errorf(\"ArrayNode returns nil\")\n//\t}\nfunc ArrayNode(key string, value []*Node) *Node {\n\tcurr := \u0026Node{\n\t\tkey: \u0026key,\n\t\tnodeType: Array,\n\t\tmodified: true,\n\t}\n\n\tcurr.next = make(map[string]*Node, len(value))\n\tif value != nil {\n\t\tcurr.value = value\n\n\t\tfor i, v := range value {\n\t\t\tidx := i\n\t\t\tcurr.next[strconv.Itoa(i)] = v\n\n\t\t\tv.prev = curr\n\t\t\tv.index = \u0026idx\n\t\t}\n\t}\n\n\treturn curr\n}\n\n// ObjectNode creates a new object type node.\n//\n// If the given value is nil, it creates an empty object node.\n//\n// next is a map of key and value pairs of the object.\nfunc ObjectNode(key string, value map[string]*Node) *Node {\n\tcurr := \u0026Node{\n\t\tnodeType: Object,\n\t\tkey: \u0026key,\n\t\tnext: value,\n\t\tmodified: true,\n\t}\n\n\tif value != nil {\n\t\tcurr.value = value\n\n\t\tfor key, val := range value {\n\t\t\tvkey := key\n\t\t\tval.prev = curr\n\t\t\tval.key = \u0026vkey\n\t\t}\n\t} else {\n\t\tcurr.next = make(map[string]*Node)\n\t}\n\n\treturn curr\n}\n\n// IsArray returns true if the current node is array type.\nfunc (n *Node) IsArray() bool {\n\treturn n.nodeType == Array\n}\n\n// IsObject returns true if the current node is object type.\nfunc (n *Node) IsObject() bool {\n\treturn n.nodeType == Object\n}\n\n// IsNull returns true if the current node is null type.\nfunc (n *Node) IsNull() bool {\n\treturn n.nodeType == Null\n}\n\n// IsBool returns true if the current node is boolean type.\nfunc (n *Node) IsBool() bool {\n\treturn n.nodeType == Boolean\n}\n\n// IsString returns true if the current node is string type.\nfunc (n *Node) IsString() bool {\n\treturn n.nodeType == String\n}\n\n// IsNumber returns true if the current node is number type.\nfunc (n *Node) IsNumber() bool {\n\treturn n.nodeType == Number\n}\n\n// ready checks the current node is ready or not.\n//\n// the meaning of ready is the current node is parsed and has a valid value.\nfunc (n *Node) ready() bool {\n\treturn n.borders[1] != 0\n}\n\n// source returns the source of the current node.\nfunc (n *Node) source() []byte {\n\tif n == nil {\n\t\treturn nil\n\t}\n\n\tif n.ready() \u0026\u0026 !n.modified \u0026\u0026 n.data != nil {\n\t\treturn (n.data)[n.borders[0]:n.borders[1]]\n\t}\n\n\treturn nil\n}\n\n// root returns the root node of the current node.\nfunc (n *Node) root() *Node {\n\tif n == nil {\n\t\treturn nil\n\t}\n\n\tcurr := n\n\tfor curr.prev != nil {\n\t\tcurr = curr.prev\n\t}\n\n\treturn curr\n}\n\n// GetNull returns the null value if current node is null type.\n//\n// Usage:\n//\n//\troot := Unmarshal([]byte(\"null\"))\n//\tval, err := root.GetNull()\n//\tif err != nil {\n//\t\tt.Errorf(\"GetNull returns error: %v\", err)\n//\t}\n//\tif val != nil {\n//\t\tt.Errorf(\"GetNull returns wrong result: %v\", val)\n//\t}\nfunc (n *Node) GetNull() (interface{}, error) {\n\tif n == nil {\n\t\treturn nil, errors.New(\"node is nil\")\n\t}\n\n\tif !n.IsNull() {\n\t\treturn nil, errors.New(\"node is not null\")\n\t}\n\n\treturn nil, nil\n}\n\n// MustNull returns the null value if current node is null type.\n//\n// It panics if the current node is not null type.\nfunc (n *Node) MustNull() interface{} {\n\tv, err := n.GetNull()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\treturn v\n}\n\n// GetNumeric returns the numeric (int/float) value if current node is number type.\n//\n// Usage:\n//\n//\troot := Unmarshal([]byte(\"10.5\"))\n//\tval, err := root.GetNumeric()\n//\tif err != nil {\n//\t\tt.Errorf(\"GetNumeric returns error: %v\", err)\n//\t}\n//\tprintln(val) // 10.5\nfunc (n *Node) GetNumeric() (float64, error) {\n\tif n == nil {\n\t\treturn 0, errors.New(\"node is nil\")\n\t}\n\n\tif n.nodeType != Number {\n\t\treturn 0, errors.New(\"node is not number\")\n\t}\n\n\tval, err := n.Value()\n\tif err != nil {\n\t\treturn 0, err\n\t}\n\n\tv, ok := val.(float64)\n\tif !ok {\n\t\treturn 0, errors.New(\"node is not number\")\n\t}\n\n\treturn v, nil\n}\n\n// MustNumeric returns the numeric (int/float) value if current node is number type.\n//\n// It panics if the current node is not number type.\nfunc (n *Node) MustNumeric() float64 {\n\tv, err := n.GetNumeric()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\treturn v\n}\n\n// GetString returns the string value if current node is string type.\n//\n// Usage:\n//\n//\troot, err := Unmarshal([]byte(\"foo\"))\n//\tif err != nil {\n//\t\tt.Errorf(\"Error on Unmarshal(): %s\", err)\n//\t}\n//\n//\tstr, err := root.GetString()\n//\tif err != nil {\n//\t\tt.Errorf(\"should retrieve string value: %s\", err)\n//\t}\n//\n//\tprintln(str) // \"foo\"\nfunc (n *Node) GetString() (string, error) {\n\tif n == nil {\n\t\treturn \"\", errors.New(\"string node is empty\")\n\t}\n\n\tif !n.IsString() {\n\t\treturn \"\", errors.New(\"node type is not string\")\n\t}\n\n\tval, err := n.Value()\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tv, ok := val.(string)\n\tif !ok {\n\t\treturn \"\", errors.New(\"node is not string\")\n\t}\n\n\treturn v, nil\n}\n\n// MustString returns the string value if current node is string type.\n//\n// It panics if the current node is not string type.\nfunc (n *Node) MustString() string {\n\tv, err := n.GetString()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\treturn v\n}\n\n// GetBool returns the boolean value if current node is boolean type.\n//\n// Usage:\n//\n//\troot := Unmarshal([]byte(\"true\"))\n//\tval, err := root.GetBool()\n//\tif err != nil {\n//\t\tt.Errorf(\"GetBool returns error: %v\", err)\n//\t}\n//\tprintln(val) // true\nfunc (n *Node) GetBool() (bool, error) {\n\tif n == nil {\n\t\treturn false, errors.New(\"node is nil\")\n\t}\n\n\tif n.nodeType != Boolean {\n\t\treturn false, errors.New(\"node is not boolean\")\n\t}\n\n\tval, err := n.Value()\n\tif err != nil {\n\t\treturn false, err\n\t}\n\n\tv, ok := val.(bool)\n\tif !ok {\n\t\treturn false, errors.New(\"node is not boolean\")\n\t}\n\n\treturn v, nil\n}\n\n// MustBool returns the boolean value if current node is boolean type.\n//\n// It panics if the current node is not boolean type.\nfunc (n *Node) MustBool() bool {\n\tv, err := n.GetBool()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\treturn v\n}\n\n// GetArray returns the array value if current node is array type.\n//\n// Usage:\n//\n//\t\troot := Must(Unmarshal([]byte(`[\"foo\", 1]`)))\n//\t\tarr, err := root.GetArray()\n//\t\tif err != nil {\n//\t\t\tt.Errorf(\"GetArray returns error: %v\", err)\n//\t\t}\n//\n//\t\tfor _, val := range arr {\n//\t\t\tprintln(val)\n//\t\t}\n//\n//\t result: \"foo\", 1\nfunc (n *Node) GetArray() ([]*Node, error) {\n\tif n == nil {\n\t\treturn nil, errors.New(\"node is nil\")\n\t}\n\n\tif n.nodeType != Array {\n\t\treturn nil, errors.New(\"node is not array\")\n\t}\n\n\tval, err := n.Value()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tv, ok := val.([]*Node)\n\tif !ok {\n\t\treturn nil, errors.New(\"node is not array\")\n\t}\n\n\treturn v, nil\n}\n\n// MustArray returns the array value if current node is array type.\n//\n// It panics if the current node is not array type.\nfunc (n *Node) MustArray() []*Node {\n\tv, err := n.GetArray()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\treturn v\n}\n\n// AppendArray appends the given values to the current array node.\n//\n// If the current node is not array type, it returns an error.\n//\n// Example 1:\n//\n//\troot := Must(Unmarshal([]byte(`[{\"foo\":\"bar\"}]`)))\n//\tif err := root.AppendArray(NullNode(\"\")); err != nil {\n//\t\tt.Errorf(\"should not return error: %s\", err)\n//\t}\n//\n//\tresult: [{\"foo\":\"bar\"}, null]\n//\n// Example 2:\n//\n//\troot := Must(Unmarshal([]byte(`[\"bar\", \"baz\"]`)))\n//\terr := root.AppendArray(NumberNode(\"\", 1), StringNode(\"\", \"foo\"))\n//\tif err != nil {\n//\t\tt.Errorf(\"AppendArray returns error: %v\", err)\n//\t }\n//\n//\tresult: [\"bar\", \"baz\", 1, \"foo\"]\nfunc (n *Node) AppendArray(value ...*Node) error {\n\tif !n.IsArray() {\n\t\treturn errors.New(\"can't append value to non-array node\")\n\t}\n\n\tfor _, val := range value {\n\t\tif err := n.append(nil, val); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tn.mark()\n\treturn nil\n}\n\n// ArrayEach executes the callback for each element in the JSON array.\n//\n// Usage:\n//\n//\tjsonArrayNode.ArrayEach(func(i int, valueNode *Node) {\n//\t ufmt.Println(i, valueNode)\n//\t})\nfunc (n *Node) ArrayEach(callback func(i int, target *Node)) {\n\tif n == nil || !n.IsArray() {\n\t\treturn\n\t}\n\n\tfor idx := 0; idx \u003c len(n.next); idx++ {\n\t\telement, err := n.GetIndex(idx)\n\t\tif err != nil {\n\t\t\tcontinue\n\t\t}\n\n\t\tcallback(idx, element)\n\t}\n}\n\n// GetObject returns the object value if current node is object type.\n//\n// Usage:\n//\n//\troot := Must(Unmarshal([]byte(`{\"key\": \"value\"}`)))\n//\tobj, err := root.GetObject()\n//\tif err != nil {\n//\t\tt.Errorf(\"GetObject returns error: %v\", err)\n//\t}\n//\n//\tresult: map[string]*Node{\"key\": StringNode(\"key\", \"value\")}\nfunc (n *Node) GetObject() (map[string]*Node, error) {\n\tif n == nil {\n\t\treturn nil, errors.New(\"node is nil\")\n\t}\n\n\tif !n.IsObject() {\n\t\treturn nil, errors.New(\"node is not object\")\n\t}\n\n\tval, err := n.Value()\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tv, ok := val.(map[string]*Node)\n\tif !ok {\n\t\treturn nil, errors.New(\"node is not object\")\n\t}\n\n\treturn v, nil\n}\n\n// MustObject returns the object value if current node is object type.\n//\n// It panics if the current node is not object type.\nfunc (n *Node) MustObject() map[string]*Node {\n\tv, err := n.GetObject()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\treturn v\n}\n\n// AppendObject appends the given key and value to the current object node.\n//\n// If the current node is not object type, it returns an error.\nfunc (n *Node) AppendObject(key string, value *Node) error {\n\tif !n.IsObject() {\n\t\treturn errors.New(\"can't append value to non-object node\")\n\t}\n\n\tif err := n.append(\u0026key, value); err != nil {\n\t\treturn err\n\t}\n\n\tn.mark()\n\treturn nil\n}\n\n// ObjectEach executes the callback for each key-value pair in the JSON object.\n//\n// Usage:\n//\n//\tjsonObjectNode.ObjectEach(func(key string, valueNode *Node) {\n//\t ufmt.Println(key, valueNode)\n//\t})\nfunc (n *Node) ObjectEach(callback func(key string, value *Node)) {\n\tif n == nil || !n.IsObject() {\n\t\treturn\n\t}\n\n\tfor key, child := range n.next {\n\t\tcallback(key, child)\n\t}\n}\n\n// String converts the node to a string representation.\nfunc (n *Node) String() string {\n\tif n == nil {\n\t\treturn \"\"\n\t}\n\n\tif n.ready() \u0026\u0026 !n.modified {\n\t\treturn string(n.source())\n\t}\n\n\tval, err := Marshal(n)\n\tif err != nil {\n\t\treturn \"error: \" + err.Error()\n\t}\n\n\treturn string(val)\n}\n\n// Path builds the path of the current node.\n//\n// For example:\n//\n//\t{ \"key\": { \"sub\": [ \"val1\", \"val2\" ] }}\n//\n// The path of \"val2\" is: $.key.sub[1]\nfunc (n *Node) Path() string {\n\tif n == nil {\n\t\treturn \"\"\n\t}\n\n\tvar sb strings.Builder\n\n\tif n.prev == nil {\n\t\tsb.WriteString(\"$\")\n\t} else {\n\t\tsb.WriteString(n.prev.Path())\n\n\t\tif n.key != nil {\n\t\t\tsb.WriteString(\"['\" + n.Key() + \"']\")\n\t\t} else {\n\t\t\tsb.WriteString(\"[\" + strconv.Itoa(n.Index()) + \"]\")\n\t\t}\n\t}\n\n\treturn sb.String()\n}\n\n// mark marks the current node as modified.\nfunc (n *Node) mark() {\n\tnode := n\n\tfor node != nil \u0026\u0026 !node.modified {\n\t\tnode.modified = true\n\t\tnode = node.prev\n\t}\n}\n\n// isContainer checks the current node type is array or object.\nfunc (n *Node) isContainer() bool {\n\treturn n.IsArray() || n.IsObject()\n}\n\n// remove removes the value from the current container type node.\nfunc (n *Node) remove(v *Node) error {\n\tif !n.isContainer() {\n\t\treturn ufmt.Errorf(\n\t\t\t\"can't remove value from non-array or non-object node. got=%s\",\n\t\t\tn.Type().String(),\n\t\t)\n\t}\n\n\tif v.prev != n {\n\t\treturn errors.New(\"invalid parent node\")\n\t}\n\n\tn.mark()\n\tif n.IsArray() {\n\t\tdelete(n.next, strconv.Itoa(*v.index))\n\t\tn.dropIndex(*v.index)\n\t} else {\n\t\tdelete(n.next, *v.key)\n\t}\n\n\tv.prev = nil\n\treturn nil\n}\n\n// dropIndex rebase the index of current array node values.\nfunc (n *Node) dropIndex(idx int) {\n\tfor i := idx + 1; i \u003c= len(n.next); i++ {\n\t\tprv := i - 1\n\t\tif curr, ok := n.next[strconv.Itoa(i)]; ok {\n\t\t\tcurr.index = \u0026prv\n\t\t\tn.next[strconv.Itoa(prv)] = curr\n\t\t}\n\n\t\tdelete(n.next, strconv.Itoa(i))\n\t}\n}\n\n// append is a helper function to append the given value to the current container type node.\nfunc (n *Node) append(key *string, val *Node) error {\n\tif n.isSameOrParentNode(val) {\n\t\treturn errors.New(\"can't append same or parent node\")\n\t}\n\n\tif val.prev != nil {\n\t\tif err := val.prev.remove(val); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\tval.prev = n\n\tval.key = key\n\n\tif key == nil {\n\t\tsize := len(n.next)\n\t\tval.index = \u0026size\n\t\tn.next[strconv.Itoa(size)] = val\n\t} else {\n\t\tif old, ok := n.next[*key]; ok {\n\t\t\tif err := n.remove(old); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\tn.next[*key] = val\n\t}\n\n\treturn nil\n}\n\nfunc (n *Node) isSameOrParentNode(nd *Node) bool {\n\treturn n == nd || n.isParentNode(nd)\n}\n\nfunc (n *Node) isParentNode(nd *Node) bool {\n\tif n == nil {\n\t\treturn false\n\t}\n\n\tfor curr := nd.prev; curr != nil; curr = curr.prev {\n\t\tif curr == n {\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n\n// cptrs returns the pointer of the given string value.\nfunc cptrs(cpy *string) *string {\n\tif cpy == nil {\n\t\treturn nil\n\t}\n\n\tval := *cpy\n\n\treturn \u0026val\n}\n\n// cptri returns the pointer of the given integer value.\nfunc cptri(i *int) *int {\n\tif i == nil {\n\t\treturn nil\n\t}\n\n\tval := *i\n\treturn \u0026val\n}\n\n// Must panics if the given node is not fulfilled the expectation.\n// Usage:\n//\n//\tnode := Must(Unmarshal([]byte(`{\"key\": \"value\"}`))\nfunc Must(root *Node, expect error) *Node {\n\tif expect != nil {\n\t\tpanic(expect)\n\t}\n\n\treturn root\n}\n"},{"name":"node_test.gno","body":"package json\n\nimport (\n\t\"bytes\"\n\t\"sort\"\n\t\"strconv\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar (\n\tnilKey *string\n\tdummyKey = \"key\"\n)\n\ntype _args struct {\n\tprev *Node\n\tbuf *buffer\n\ttyp ValueType\n\tkey **string\n}\n\ntype simpleNode struct {\n\tname string\n\tnode *Node\n}\n\nfunc TestNode_CreateNewNode(t *testing.T) {\n\trel := \u0026dummyKey\n\n\ttests := []struct {\n\t\tname string\n\t\targs _args\n\t\texpectCurr *Node\n\t\texpectErr bool\n\t\texpectPanic bool\n\t}{\n\t\t{\n\t\t\tname: \"child for non container type\",\n\t\t\targs: _args{\n\t\t\t\tprev: BoolNode(\"\", true),\n\t\t\t\tbuf: newBuffer(make([]byte, 10)),\n\t\t\t\ttyp: Boolean,\n\t\t\t\tkey: \u0026rel,\n\t\t\t},\n\t\t\texpectCurr: nil,\n\t\t\texpectErr: true,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tdefer func() {\n\t\t\t\tif r := recover(); r != nil {\n\t\t\t\t\tif tt.expectPanic {\n\t\t\t\t\t\treturn\n\t\t\t\t\t}\n\t\t\t\t\tt.Errorf(\"%s panic occurred when not expected: %v\", tt.name, r)\n\t\t\t\t} else if tt.expectPanic {\n\t\t\t\t\tt.Errorf(\"%s expected panic but didn't occur\", tt.name)\n\t\t\t\t}\n\t\t\t}()\n\n\t\t\tgot, err := NewNode(tt.args.prev, tt.args.buf, tt.args.typ, tt.args.key)\n\t\t\tif (err != nil) != tt.expectErr {\n\t\t\t\tt.Errorf(\"%s error = %v, expect error %v\", tt.name, err, tt.expectErr)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif tt.expectErr {\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif !compareNodes(got, tt.expectCurr) {\n\t\t\t\tt.Errorf(\"%s got = %v, want %v\", tt.name, got, tt.expectCurr)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestNode_Value(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tdata []byte\n\t\t_type ValueType\n\t\texpected interface{}\n\t\terrExpected bool\n\t}{\n\t\t{name: \"null\", data: []byte(\"null\"), _type: Null, expected: nil},\n\t\t{name: \"1\", data: []byte(\"1\"), _type: Number, expected: float64(1)},\n\t\t{name: \".1\", data: []byte(\".1\"), _type: Number, expected: float64(.1)},\n\t\t{name: \"-.1e1\", data: []byte(\"-.1e1\"), _type: Number, expected: float64(-1)},\n\t\t{name: \"string\", data: []byte(\"\\\"foo\\\"\"), _type: String, expected: \"foo\"},\n\t\t{name: \"space\", data: []byte(\"\\\"foo bar\\\"\"), _type: String, expected: \"foo bar\"},\n\t\t{name: \"true\", data: []byte(\"true\"), _type: Boolean, expected: true},\n\t\t{name: \"invalid true\", data: []byte(\"tru\"), _type: Unknown, errExpected: true},\n\t\t{name: \"invalid false\", data: []byte(\"fals\"), _type: Unknown, errExpected: true},\n\t\t{name: \"false\", data: []byte(\"false\"), _type: Boolean, expected: false},\n\t\t{name: \"e1\", data: []byte(\"e1\"), _type: Unknown, errExpected: true},\n\t\t{name: \"1a\", data: []byte(\"1a\"), _type: Unknown, errExpected: true},\n\t\t{name: \"string error\", data: []byte(\"\\\"foo\\nbar\\\"\"), _type: String, errExpected: true},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tcurr := \u0026Node{\n\t\t\t\tdata: tt.data,\n\t\t\t\tnodeType: tt._type,\n\t\t\t\tborders: [2]int{0, len(tt.data)},\n\t\t\t}\n\n\t\t\tgot, err := curr.Value()\n\t\t\tif err != nil {\n\t\t\t\tif !tt.errExpected {\n\t\t\t\t\tt.Errorf(\"%s error = %v, expect error %v\", tt.name, err, tt.errExpected)\n\t\t\t\t}\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tif got != tt.expected {\n\t\t\t\tt.Errorf(\"%s got = %v, want %v\", tt.name, got, tt.expected)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestNode_Delete(t *testing.T) {\n\troot := Must(Unmarshal([]byte(`{\"foo\":\"bar\"}`)))\n\tif err := root.Delete(); err != nil {\n\t\tt.Errorf(\"Delete returns error: %v\", err)\n\t}\n\n\tif value, err := Marshal(root); err != nil {\n\t\tt.Errorf(\"Marshal returns error: %v\", err)\n\t} else if string(value) != `{\"foo\":\"bar\"}` {\n\t\tt.Errorf(\"Marshal returns wrong value: %s\", string(value))\n\t}\n\n\tfoo := root.MustKey(\"foo\")\n\tif err := foo.Delete(); err != nil {\n\t\tt.Errorf(\"Delete returns error while handling foo: %v\", err)\n\t}\n\n\tif value, err := Marshal(root); err != nil {\n\t\tt.Errorf(\"Marshal returns error: %v\", err)\n\t} else if string(value) != `{}` {\n\t\tt.Errorf(\"Marshal returns wrong value: %s\", string(value))\n\t}\n\n\tif value, err := Marshal(foo); err != nil {\n\t\tt.Errorf(\"Marshal returns error: %v\", err)\n\t} else if string(value) != `\"bar\"` {\n\t\tt.Errorf(\"Marshal returns wrong value: %s\", string(value))\n\t}\n\n\tif foo.prev != nil {\n\t\tt.Errorf(\"foo.prev should be nil\")\n\t}\n}\n\nfunc TestNode_ObjectNode(t *testing.T) {\n\tobjs := map[string]*Node{\n\t\t\"key1\": NullNode(\"null\"),\n\t\t\"key2\": NumberNode(\"answer\", 42),\n\t\t\"key3\": StringNode(\"string\", \"foobar\"),\n\t\t\"key4\": BoolNode(\"bool\", true),\n\t}\n\n\tnode := ObjectNode(\"test\", objs)\n\n\tif len(node.next) != len(objs) {\n\t\tt.Errorf(\"ObjectNode: want %v got %v\", len(objs), len(node.next))\n\t}\n\n\tfor k, v := range objs {\n\t\tif node.next[k] == nil {\n\t\t\tt.Errorf(\"ObjectNode: want %v got %v\", v, node.next[k])\n\t\t}\n\t}\n}\n\nfunc TestNode_AppendObject(t *testing.T) {\n\tif err := Must(Unmarshal([]byte(`{\"foo\":\"bar\",\"baz\":null}`))).AppendObject(\"biz\", NullNode(\"\")); err != nil {\n\t\tt.Errorf(\"AppendArray should return error\")\n\t}\n\n\troot := Must(Unmarshal([]byte(`{\"foo\":\"bar\"}`)))\n\tif err := root.AppendObject(\"baz\", NullNode(\"\")); err != nil {\n\t\tt.Errorf(\"AppendObject should not return error: %s\", err)\n\t}\n\n\tif value, err := Marshal(root); err != nil {\n\t\tt.Errorf(\"Marshal returns error: %v\", err)\n\t} else if isSameObject(string(value), `\"{\"foo\":\"bar\",\"baz\":null}\"`) {\n\t\tt.Errorf(\"Marshal returns wrong value: %s\", string(value))\n\t}\n\n\t// FIXME: this may fail if execute test in more than 3 times in a row.\n\tif err := root.AppendObject(\"biz\", NumberNode(\"\", 42)); err != nil {\n\t\tt.Errorf(\"AppendObject returns error: %v\", err)\n\t}\n\n\tval, err := Marshal(root)\n\tif err != nil {\n\t\tt.Errorf(\"Marshal returns error: %v\", err)\n\t}\n\n\t// FIXME: this may fail if execute test in more than 3 times in a row.\n\tif isSameObject(string(val), `\"{\"foo\":\"bar\",\"baz\":null,\"biz\":42}\"`) {\n\t\tt.Errorf(\"Marshal returns wrong value: %s\", string(val))\n\t}\n}\n\nfunc TestNode_ArrayNode(t *testing.T) {\n\tarr := []*Node{\n\t\tNullNode(\"nil\"),\n\t\tNumberNode(\"num\", 42),\n\t\tStringNode(\"str\", \"foobar\"),\n\t\tBoolNode(\"bool\", true),\n\t}\n\n\tnode := ArrayNode(\"test\", arr)\n\n\tif len(node.next) != len(arr) {\n\t\tt.Errorf(\"ArrayNode: want %v got %v\", len(arr), len(node.next))\n\t}\n\n\tfor i, v := range arr {\n\t\tif node.next[strconv.Itoa(i)] == nil {\n\t\t\tt.Errorf(\"ArrayNode: want %v got %v\", v, node.next[strconv.Itoa(i)])\n\t\t}\n\t}\n}\n\nfunc TestNode_AppendArray(t *testing.T) {\n\tif err := Must(Unmarshal([]byte(`[{\"foo\":\"bar\"}]`))).AppendArray(NullNode(\"\")); err != nil {\n\t\tt.Errorf(\"should return error\")\n\t}\n\n\troot := Must(Unmarshal([]byte(`[{\"foo\":\"bar\"}]`)))\n\tif err := root.AppendArray(NullNode(\"\")); err != nil {\n\t\tt.Errorf(\"should not return error: %s\", err)\n\t}\n\n\tif value, err := Marshal(root); err != nil {\n\t\tt.Errorf(\"Marshal returns error: %v\", err)\n\t} else if string(value) != `[{\"foo\":\"bar\"},null]` {\n\t\tt.Errorf(\"Marshal returns wrong value: %s\", string(value))\n\t}\n\n\tif err := root.AppendArray(\n\t\tNumberNode(\"\", 1),\n\t\tStringNode(\"\", \"foo\"),\n\t\tMust(Unmarshal([]byte(`[0,1,null,true,\"example\"]`))),\n\t\tMust(Unmarshal([]byte(`{\"foo\": true, \"bar\": null, \"baz\": 123}`))),\n\t); err != nil {\n\t\tt.Errorf(\"AppendArray returns error: %v\", err)\n\t}\n\n\tif value, err := Marshal(root); err != nil {\n\t\tt.Errorf(\"Marshal returns error: %v\", err)\n\t} else if string(value) != `[{\"foo\":\"bar\"},null,1,\"foo\",[0,1,null,true,\"example\"],{\"foo\": true, \"bar\": null, \"baz\": 123}]` {\n\t\tt.Errorf(\"Marshal returns wrong value: %s\", string(value))\n\t}\n}\n\n/******** value getter ********/\n\nfunc TestNode_GetBool(t *testing.T) {\n\troot, err := Unmarshal([]byte(`true`))\n\tif err != nil {\n\t\tt.Errorf(\"Error on Unmarshal(): %s\", err.Error())\n\t\treturn\n\t}\n\n\tvalue, err := root.GetBool()\n\tif err != nil {\n\t\tt.Errorf(\"Error on root.GetBool(): %s\", err.Error())\n\t}\n\n\tif !value {\n\t\tt.Errorf(\"root.GetBool() is corrupted\")\n\t}\n}\n\nfunc TestNode_GetBool_Fail(t *testing.T) {\n\ttests := []simpleNode{\n\t\t{\"nil node\", (*Node)(nil)},\n\t\t{\"literally null node\", NullNode(\"\")},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tif _, err := tt.node.GetBool(); err == nil {\n\t\t\t\tt.Errorf(\"%s should be an error\", tt.name)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestNode_IsBool(t *testing.T) {\n\ttests := []simpleNode{\n\t\t{\"true\", BoolNode(\"\", true)},\n\t\t{\"false\", BoolNode(\"\", false)},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tif !tt.node.IsBool() {\n\t\t\t\tt.Errorf(\"%s should be a bool\", tt.name)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestNode_IsBool_With_Unmarshal(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tjson []byte\n\t\twant bool\n\t}{\n\t\t{\"true\", []byte(\"true\"), true},\n\t\t{\"false\", []byte(\"false\"), true},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\troot, err := Unmarshal(tt.json)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"Error on Unmarshal(): %s\", err.Error())\n\t\t\t}\n\n\t\t\tif root.IsBool() != tt.want {\n\t\t\t\tt.Errorf(\"%s should be a bool\", tt.name)\n\t\t\t}\n\t\t})\n\t}\n}\n\nvar nullJson = []byte(`null`)\n\nfunc TestNode_GetNull(t *testing.T) {\n\troot, err := Unmarshal(nullJson)\n\tif err != nil {\n\t\tt.Errorf(\"Error on Unmarshal(): %s\", err.Error())\n\t}\n\n\tvalue, err := root.GetNull()\n\tif err != nil {\n\t\tt.Errorf(\"error occurred while getting null, %s\", err)\n\t}\n\n\tif value != nil {\n\t\tt.Errorf(\"value is not matched. expected: nil, got: %v\", value)\n\t}\n}\n\nfunc TestNode_GetNull_Fail(t *testing.T) {\n\ttests := []simpleNode{\n\t\t{\"nil node\", (*Node)(nil)},\n\t\t{\"number node is null\", NumberNode(\"\", 42)},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tif _, err := tt.node.GetNull(); err == nil {\n\t\t\t\tt.Errorf(\"%s should be an error\", tt.name)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestNode_MustNull(t *testing.T) {\n\troot, err := Unmarshal(nullJson)\n\tif err != nil {\n\t\tt.Errorf(\"Error on Unmarshal(): %s\", err.Error())\n\t}\n\n\tvalue := root.MustNull()\n\tif value != nil {\n\t\tt.Errorf(\"value is not matched. expected: nil, got: %v\", value)\n\t}\n}\n\nfunc TestNode_GetNumeric_Float(t *testing.T) {\n\troot, err := Unmarshal([]byte(`123.456`))\n\tif err != nil {\n\t\tt.Errorf(\"Error on Unmarshal(): %s\", err)\n\t\treturn\n\t}\n\n\tvalue, err := root.GetNumeric()\n\tif err != nil {\n\t\tt.Errorf(\"Error on root.GetNumeric(): %s\", err)\n\t}\n\n\tif value != float64(123.456) {\n\t\tt.Errorf(ufmt.Sprintf(\"value is not matched. expected: 123.456, got: %v\", value))\n\t}\n}\n\nfunc TestNode_GetNumeric_Scientific_Notation(t *testing.T) {\n\troot, err := Unmarshal([]byte(`1e3`))\n\tif err != nil {\n\t\tt.Errorf(\"Error on Unmarshal(): %s\", err)\n\t\treturn\n\t}\n\n\tvalue, err := root.GetNumeric()\n\tif err != nil {\n\t\tt.Errorf(\"Error on root.GetNumeric(): %s\", err)\n\t}\n\n\tif value != float64(1000) {\n\t\tt.Errorf(ufmt.Sprintf(\"value is not matched. expected: 1000, got: %v\", value))\n\t}\n}\n\nfunc TestNode_GetNumeric_With_Unmarshal(t *testing.T) {\n\troot, err := Unmarshal([]byte(`123`))\n\tif err != nil {\n\t\tt.Errorf(\"Error on Unmarshal(): %s\", err)\n\t\treturn\n\t}\n\n\tvalue, err := root.GetNumeric()\n\tif err != nil {\n\t\tt.Errorf(\"Error on root.GetNumeric(): %s\", err)\n\t}\n\n\tif value != float64(123) {\n\t\tt.Errorf(ufmt.Sprintf(\"value is not matched. expected: 123, got: %v\", value))\n\t}\n}\n\nfunc TestNode_GetNumeric_Fail(t *testing.T) {\n\ttests := []simpleNode{\n\t\t{\"nil node\", (*Node)(nil)},\n\t\t{\"null node\", NullNode(\"\")},\n\t\t{\"string node\", StringNode(\"\", \"123\")},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tif _, err := tt.node.GetNumeric(); err == nil {\n\t\t\t\tt.Errorf(\"%s should be an error\", tt.name)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestNode_GetString(t *testing.T) {\n\troot, err := Unmarshal([]byte(`\"123foobar 3456\"`))\n\tif err != nil {\n\t\tt.Errorf(\"Error on Unmarshal(): %s\", err)\n\t}\n\n\tvalue, err := root.GetString()\n\tif err != nil {\n\t\tt.Errorf(\"Error on root.GetString(): %s\", err)\n\t}\n\n\tif value != \"123foobar 3456\" {\n\t\tt.Errorf(ufmt.Sprintf(\"value is not matched. expected: 123, got: %s\", value))\n\t}\n}\n\nfunc TestNode_GetString_Fail(t *testing.T) {\n\ttests := []simpleNode{\n\t\t{\"nil node\", (*Node)(nil)},\n\t\t{\"null node\", NullNode(\"\")},\n\t\t{\"number node\", NumberNode(\"\", 123)},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tif _, err := tt.node.GetString(); err == nil {\n\t\t\t\tt.Errorf(\"%s should be an error\", tt.name)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestNode_MustString(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tdata []byte\n\t}{\n\t\t{\"foo\", []byte(`\"foo\"`)},\n\t\t{\"foo bar\", []byte(`\"foo bar\"`)},\n\t\t{\"\", []byte(`\"\"`)},\n\t\t{\"안녕하세요\", []byte(`\"안녕하세요\"`)},\n\t\t{\"こんにちは\", []byte(`\"こんにちは\"`)},\n\t\t{\"你好\", []byte(`\"你好\"`)},\n\t\t{\"one \\\"encoded\\\" string\", []byte(`\"one \\\"encoded\\\" string\"`)},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\troot, err := Unmarshal(tt.data)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"Error on Unmarshal(): %s\", err)\n\t\t\t}\n\n\t\t\tvalue := root.MustString()\n\t\t\tif value != tt.name {\n\t\t\t\tt.Errorf(\"value is not matched. expected: %s, got: %s\", tt.name, value)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestUnmarshal_Array(t *testing.T) {\n\troot, err := Unmarshal([]byte(\" [1,[\\\"1\\\",[1,[1,2,3]]]]\\r\\n\"))\n\tif err != nil {\n\t\tt.Errorf(\"Error on Unmarshal: %s\", err.Error())\n\t}\n\n\tif root == nil {\n\t\tt.Errorf(\"Error on Unmarshal: root is nil\")\n\t}\n\n\tif root.Type() != Array {\n\t\tt.Errorf(\"Error on Unmarshal: wrong type\")\n\t}\n\n\tarray, err := root.GetArray()\n\tif err != nil {\n\t\tt.Errorf(\"error occurred while getting array, %s\", err)\n\t} else if len(array) != 2 {\n\t\tt.Errorf(\"expected 2 elements, got %d\", len(array))\n\t} else if val, err := array[0].GetNumeric(); err != nil {\n\t\tt.Errorf(\"value of array[0] is not numeric. got: %v\", array[0].value)\n\t} else if val != 1 {\n\t\tt.Errorf(\"Error on array[0].GetNumeric(): expected to be '1', got: %v\", val)\n\t} else if val, err := array[1].GetArray(); err != nil {\n\t\tt.Errorf(\"error occurred while getting array, %s\", err.Error())\n\t} else if len(val) != 2 {\n\t\tt.Errorf(\"Error on array[1].GetArray(): expected 2 elements, got %d\", len(val))\n\t} else if el, err := val[0].GetString(); err != nil {\n\t\tt.Errorf(\"error occurred while getting string, %s\", err.Error())\n\t} else if el != \"1\" {\n\t\tt.Errorf(\"Error on val[0].GetString(): expected to be '1', got: %s\", el)\n\t}\n}\n\nvar sampleArr = []byte(`[-1, 2, 3, 4, 5, 6]`)\n\nfunc TestNode_GetArray(t *testing.T) {\n\troot, err := Unmarshal(sampleArr)\n\tif err != nil {\n\t\tt.Errorf(\"Error on Unmarshal(): %s\", err)\n\t\treturn\n\t}\n\n\tarray, err := root.GetArray()\n\tif err != nil {\n\t\tt.Errorf(\"Error on root.GetArray(): %s\", err)\n\t}\n\n\tif len(array) != 6 {\n\t\tt.Errorf(ufmt.Sprintf(\"length is not matched. expected: 3, got: %d\", len(array)))\n\t}\n\n\tfor i, node := range array {\n\t\tfor j, val := range []int{-1, 2, 3, 4, 5, 6} {\n\t\t\tif i == j {\n\t\t\t\tif v, err := node.GetNumeric(); err != nil {\n\t\t\t\t\tt.Errorf(ufmt.Sprintf(\"Error on node.GetNumeric(): %s\", err))\n\t\t\t\t} else if v != float64(val) {\n\t\t\t\t\tt.Errorf(ufmt.Sprintf(\"value is not matched. expected: %d, got: %v\", val, v))\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestNode_GetArray_Fail(t *testing.T) {\n\ttests := []simpleNode{\n\t\t{\"nil node\", (*Node)(nil)},\n\t\t{\"null node\", NullNode(\"\")},\n\t\t{\"number node\", NumberNode(\"\", 123)},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tif _, err := tt.node.GetArray(); err == nil {\n\t\t\t\tt.Errorf(\"%s should be an error\", tt.name)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestNode_IsArray(t *testing.T) {\n\troot, err := Unmarshal(sampleArr)\n\tif err != nil {\n\t\tt.Errorf(\"Error on Unmarshal(): %s\", err)\n\t\treturn\n\t}\n\n\tif root.Type() != Array {\n\t\tt.Errorf(ufmt.Sprintf(\"Must be an array. got: %s\", root.Type().String()))\n\t}\n}\n\nfunc TestNode_ArrayEach(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tjson string\n\t\texpected []int\n\t}{\n\t\t{\n\t\t\tname: \"empty array\",\n\t\t\tjson: `[]`,\n\t\t\texpected: []int{},\n\t\t},\n\t\t{\n\t\t\tname: \"single element\",\n\t\t\tjson: `[42]`,\n\t\t\texpected: []int{42},\n\t\t},\n\t\t{\n\t\t\tname: \"multiple elements\",\n\t\t\tjson: `[1, 2, 3, 4, 5]`,\n\t\t\texpected: []int{1, 2, 3, 4, 5},\n\t\t},\n\t\t{\n\t\t\tname: \"multiple elements but all values are same\",\n\t\t\tjson: `[1, 1, 1, 1, 1]`,\n\t\t\texpected: []int{1, 1, 1, 1, 1},\n\t\t},\n\t\t{\n\t\t\tname: \"multiple elements with non-numeric values\",\n\t\t\tjson: `[\"a\", \"b\", \"c\", \"d\", \"e\"]`,\n\t\t\texpected: []int{},\n\t\t},\n\t\t{\n\t\t\tname: \"non-array node\",\n\t\t\tjson: `{\"not\": \"an array\"}`,\n\t\t\texpected: []int{},\n\t\t},\n\t\t{\n\t\t\tname: \"array containing numeric and non-numeric elements\",\n\t\t\tjson: `[\"1\", 2, 3, \"4\", 5, \"6\"]`,\n\t\t\texpected: []int{2, 3, 5},\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\troot, err := Unmarshal([]byte(tc.json))\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Unmarshal failed: %v\", err)\n\t\t\t}\n\n\t\t\tvar result []int // callback result\n\t\t\troot.ArrayEach(func(index int, element *Node) {\n\t\t\t\tif val, err := strconv.Atoi(element.String()); err == nil {\n\t\t\t\t\tresult = append(result, val)\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tif len(result) != len(tc.expected) {\n\t\t\t\tt.Errorf(\"%s: expected %d elements, got %d\", tc.name, len(tc.expected), len(result))\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tfor i, val := range result {\n\t\t\t\tif val != tc.expected[i] {\n\t\t\t\t\tt.Errorf(\"%s: expected value at index %d to be %d, got %d\", tc.name, i, tc.expected[i], val)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestNode_Key(t *testing.T) {\n\troot, err := Unmarshal([]byte(`{\"foo\": true, \"bar\": null, \"baz\": 123, \"biz\": [1,2,3]}`))\n\tif err != nil {\n\t\tt.Errorf(\"Error on Unmarshal(): %s\", err.Error())\n\t}\n\n\tobj := root.MustObject()\n\tfor key, node := range obj {\n\t\tif key != node.Key() {\n\t\t\tt.Errorf(\"Key() = %v, want %v\", node.Key(), key)\n\t\t}\n\t}\n\n\tkeys := []string{\"foo\", \"bar\", \"baz\", \"biz\"}\n\tfor _, key := range keys {\n\t\tif obj[key].Key() != key {\n\t\t\tt.Errorf(\"Key() = %v, want %v\", obj[key].Key(), key)\n\t\t}\n\t}\n\n\t// TODO: resolve stack overflow\n\t// if root.MustKey(\"foo\").Clone().Key() != \"\" {\n\t// \tt.Errorf(\"wrong key found for cloned key\")\n\t// }\n\n\tif (*Node)(nil).Key() != \"\" {\n\t\tt.Errorf(\"wrong key found for nil node\")\n\t}\n}\n\nfunc TestNode_Size(t *testing.T) {\n\troot, err := Unmarshal(sampleArr)\n\tif err != nil {\n\t\tt.Errorf(\"error occurred while unmarshal\")\n\t}\n\n\tsize := root.Size()\n\tif size != 6 {\n\t\tt.Errorf(ufmt.Sprintf(\"Size() must be 6. got: %v\", size))\n\t}\n\n\tif (*Node)(nil).Size() != 0 {\n\t\tt.Errorf(ufmt.Sprintf(\"Size() must be 0. got: %v\", (*Node)(nil).Size()))\n\t}\n}\n\nfunc TestNode_Index(t *testing.T) {\n\troot, err := Unmarshal([]byte(`[1, 2, 3, 4, 5, 6]`))\n\tif err != nil {\n\t\tt.Error(\"error occurred while unmarshal\")\n\t}\n\n\tarr := root.MustArray()\n\tfor i, node := range arr {\n\t\tif i != node.Index() {\n\t\t\tt.Errorf(ufmt.Sprintf(\"Index() must be nil. got: %v\", i))\n\t\t}\n\t}\n}\n\nfunc TestNode_Index_Fail(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tnode *Node\n\t\twant int\n\t}{\n\t\t{\"nil node\", (*Node)(nil), -1},\n\t\t{\"null node\", NullNode(\"\"), -1},\n\t\t{\"object node\", ObjectNode(\"\", nil), -1},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tif got := tt.node.Index(); got != tt.want {\n\t\t\t\tt.Errorf(\"Index() = %v, want %v\", got, tt.want)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestNode_GetIndex(t *testing.T) {\n\troot := Must(Unmarshal([]byte(`[1, 2, 3, 4, 5, 6]`)))\n\texpected := []int{1, 2, 3, 4, 5, 6}\n\n\tif len(expected) != root.Size() {\n\t\tt.Errorf(\"length is not matched. expected: %d, got: %d\", len(expected), root.Size())\n\t}\n\n\t// TODO: if length exceeds, stack overflow occurs. need to fix\n\tfor i, v := range expected {\n\t\tval, err := root.GetIndex(i)\n\t\tif err != nil {\n\t\t\tt.Errorf(\"error occurred while getting index %d, %s\", i, err)\n\t\t}\n\n\t\tif val.MustNumeric() != float64(v) {\n\t\t\tt.Errorf(\"value is not matched. expected: %d, got: %v\", v, val.MustNumeric())\n\t\t}\n\t}\n}\n\nfunc TestNode_GetIndex_InputIndex_Exceed_Original_Node_Index(t *testing.T) {\n\troot, err := Unmarshal([]byte(`[1, 2, 3, 4, 5, 6]`))\n\tif err != nil {\n\t\tt.Errorf(\"error occurred while unmarshal\")\n\t}\n\n\t_, err = root.GetIndex(10)\n\tif err == nil {\n\t\tt.Errorf(\"GetIndex should return error\")\n\t}\n}\n\nfunc TestNode_DeleteIndex(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\texpected string\n\t\tindex int\n\t\tok bool\n\t}{\n\t\t{`null`, ``, 0, false},\n\t\t{`1`, ``, 0, false},\n\t\t{`{}`, ``, 0, false},\n\t\t{`{\"foo\":\"bar\"}`, ``, 0, false},\n\t\t{`true`, ``, 0, false},\n\t\t{`[]`, ``, 0, false},\n\t\t{`[]`, ``, -1, false},\n\t\t{`[1]`, `[]`, 0, true},\n\t\t{`[{}]`, `[]`, 0, true},\n\t\t{`[{}, [], 42]`, `[{}, []]`, -1, true},\n\t\t{`[{}, [], 42]`, `[[], 42]`, 0, true},\n\t\t{`[{}, [], 42]`, `[{}, 42]`, 1, true},\n\t\t{`[{}, [], 42]`, `[{}, []]`, 2, true},\n\t\t{`[{}, [], 42]`, ``, 10, false},\n\t\t{`[{}, [], 42]`, ``, -10, false},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\troot := Must(Unmarshal([]byte(tt.name)))\n\t\t\terr := root.DeleteIndex(tt.index)\n\t\t\tif err != nil \u0026\u0026 tt.ok {\n\t\t\t\tt.Errorf(\"DeleteIndex returns error: %v\", err)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestNode_GetKey(t *testing.T) {\n\troot, err := Unmarshal([]byte(`{\"foo\": true, \"bar\": null}`))\n\tif err != nil {\n\t\tt.Error(\"error occurred while unmarshal\")\n\t}\n\n\tvalue, err := root.GetKey(\"foo\")\n\tif err != nil {\n\t\tt.Errorf(\"error occurred while getting key, %s\", err)\n\t}\n\n\tif value.MustBool() != true {\n\t\tt.Errorf(\"value is not matched. expected: true, got: %v\", value.MustBool())\n\t}\n\n\tvalue, err = root.GetKey(\"bar\")\n\tif err != nil {\n\t\tt.Errorf(\"error occurred while getting key, %s\", err)\n\t}\n\n\t_, err = root.GetKey(\"baz\")\n\tif err == nil {\n\t\tt.Errorf(\"key baz is not exist. must be failed\")\n\t}\n\n\tif value.MustNull() != nil {\n\t\tt.Errorf(\"value is not matched. expected: nil, got: %v\", value.MustNull())\n\t}\n}\n\nfunc TestNode_GetKey_Fail(t *testing.T) {\n\ttests := []simpleNode{\n\t\t{\"nil node\", (*Node)(nil)},\n\t\t{\"null node\", NullNode(\"\")},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tif _, err := tt.node.GetKey(\"\"); err == nil {\n\t\t\t\tt.Errorf(\"%s should be an error\", tt.name)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestNode_GetUniqueKeyList(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tjson string\n\t\texpected []string\n\t}{\n\t\t{\n\t\t\tname: \"simple foo/bar\",\n\t\t\tjson: `{\"foo\": true, \"bar\": null}`,\n\t\t\texpected: []string{\"foo\", \"bar\"},\n\t\t},\n\t\t{\n\t\t\tname: \"empty object\",\n\t\t\tjson: `{}`,\n\t\t\texpected: []string{},\n\t\t},\n\t\t{\n\t\t\tname: \"nested object\",\n\t\t\tjson: `{\n\t\t\t\t\"outer\": {\n\t\t\t\t\t\"inner\": {\n\t\t\t\t\t\t\"key\": \"value\"\n\t\t\t\t\t},\n\t\t\t\t\t\"array\": [1, 2, 3]\n\t\t\t\t},\n\t\t\t\t\"another\": \"item\"\n\t\t\t}`,\n\t\t\texpected: []string{\"outer\", \"inner\", \"key\", \"array\", \"another\"},\n\t\t},\n\t\t{\n\t\t\tname: \"complex object\",\n\t\t\tjson: `{\n\t\t\t\t\"Image\": {\n\t\t\t\t\t\"Width\": 800,\n\t\t\t\t\t\"Height\": 600,\n\t\t\t\t\t\"Title\": \"View from 15th Floor\",\n\t\t\t\t\t\"Thumbnail\": {\n\t\t\t\t\t\t\"Url\": \"http://www.example.com/image/481989943\",\n\t\t\t\t\t\t\"Height\": 125,\n\t\t\t\t\t\t\"Width\": 100\n\t\t\t\t\t},\n\t\t\t\t\t\"Animated\": false,\n\t\t\t\t\t\"IDs\": [116, 943, 234, 38793]\n\t\t\t\t}\n\t\t\t}`,\n\t\t\texpected: []string{\"Image\", \"Width\", \"Height\", \"Title\", \"Thumbnail\", \"Url\", \"Animated\", \"IDs\"},\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\troot, err := Unmarshal([]byte(tt.json))\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"error occurred while unmarshal\")\n\t\t\t}\n\n\t\t\tvalue := root.UniqueKeyLists()\n\t\t\tif len(value) != len(tt.expected) {\n\t\t\t\tt.Errorf(\"%s length must be %v. got: %v. retrieved keys: %s\", tt.name, len(tt.expected), len(value), value)\n\t\t\t}\n\n\t\t\tfor _, key := range value {\n\t\t\t\tif !contains(tt.expected, key) {\n\t\t\t\t\tt.Errorf(\"EachKey() must be in %v. got: %v\", tt.expected, key)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\n// TODO: resolve stack overflow\nfunc TestNode_IsEmpty(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tnode *Node\n\t\texpected bool\n\t}{\n\t\t{\"nil node\", (*Node)(nil), false}, // nil node is not empty.\n\t\t// {\"null node\", NullNode(\"\"), true},\n\t\t{\"empty object\", ObjectNode(\"\", nil), true},\n\t\t{\"empty array\", ArrayNode(\"\", nil), true},\n\t\t{\"non-empty object\", ObjectNode(\"\", map[string]*Node{\"foo\": BoolNode(\"foo\", true)}), false},\n\t\t{\"non-empty array\", ArrayNode(\"\", []*Node{BoolNode(\"0\", true)}), false},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tif got := tt.node.Empty(); got != tt.expected {\n\t\t\t\tt.Errorf(\"%s = %v, want %v\", tt.name, got, tt.expected)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestNode_Index_EmptyList(t *testing.T) {\n\troot, err := Unmarshal([]byte(`[]`))\n\tif err != nil {\n\t\tt.Errorf(\"error occurred while unmarshal\")\n\t}\n\n\tarray := root.MustArray()\n\tfor i, node := range array {\n\t\tif i != node.Index() {\n\t\t\tt.Errorf(ufmt.Sprintf(\"Index() must be nil. got: %v\", i))\n\t\t}\n\t}\n}\n\nfunc TestNode_GetObject(t *testing.T) {\n\troot, err := Unmarshal([]byte(`{\"foo\": true,\"bar\": null}`))\n\tif err != nil {\n\t\tt.Errorf(\"Error on Unmarshal(): %s\", err.Error())\n\t\treturn\n\t}\n\n\tvalue, err := root.GetObject()\n\tif err != nil {\n\t\tt.Errorf(\"Error on root.GetObject(): %s\", err.Error())\n\t}\n\n\tif _, ok := value[\"foo\"]; !ok {\n\t\tt.Errorf(\"root.GetObject() is corrupted: foo\")\n\t}\n\n\tif _, ok := value[\"bar\"]; !ok {\n\t\tt.Errorf(\"root.GetObject() is corrupted: bar\")\n\t}\n}\n\nfunc TestNode_GetObject_Fail(t *testing.T) {\n\ttests := []simpleNode{\n\t\t{\"nil node\", (*Node)(nil)},\n\t\t{\"get object from null node\", NullNode(\"\")},\n\t\t{\"not object node\", NumberNode(\"\", 123)},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tif _, err := tt.node.GetObject(); err == nil {\n\t\t\t\tt.Errorf(\"%s should be an error\", tt.name)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestNode_ObjectEach(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tjson string\n\t\texpected map[string]int\n\t}{\n\t\t{\n\t\t\tname: \"empty object\",\n\t\t\tjson: `{}`,\n\t\t\texpected: make(map[string]int),\n\t\t},\n\t\t{\n\t\t\tname: \"single key-value pair\",\n\t\t\tjson: `{\"key\": 42}`,\n\t\t\texpected: map[string]int{\"key\": 42},\n\t\t},\n\t\t{\n\t\t\tname: \"multiple key-value pairs\",\n\t\t\tjson: `{\"one\": 1, \"two\": 2, \"three\": 3}`,\n\t\t\texpected: map[string]int{\"one\": 1, \"two\": 2, \"three\": 3},\n\t\t},\n\t\t{\n\t\t\tname: \"multiple key-value pairs with some non-numeric values\",\n\t\t\tjson: `{\"one\": 1, \"two\": \"2\", \"three\": 3, \"four\": \"4\"}`,\n\t\t\texpected: map[string]int{\"one\": 1, \"three\": 3},\n\t\t},\n\t\t{\n\t\t\tname: \"non-object node\",\n\t\t\tjson: `[\"not\", \"an\", \"object\"]`,\n\t\t\texpected: make(map[string]int),\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\troot, err := Unmarshal([]byte(tc.json))\n\t\t\tif err != nil {\n\t\t\t\tt.Fatalf(\"Unmarshal failed: %v\", err)\n\t\t\t}\n\n\t\t\tresult := make(map[string]int)\n\t\t\troot.ObjectEach(func(key string, value *Node) {\n\t\t\t\t// extract integer values from the object\n\t\t\t\tif val, err := strconv.Atoi(value.String()); err == nil {\n\t\t\t\t\tresult[key] = val\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tif len(result) != len(tc.expected) {\n\t\t\t\tt.Errorf(\"%s: expected %d key-value pairs, got %d\", tc.name, len(tc.expected), len(result))\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tfor key, val := range tc.expected {\n\t\t\t\tif result[key] != val {\n\t\t\t\t\tt.Errorf(\"%s: expected value for key %s to be %d, got %d\", tc.name, key, val, result[key])\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestNode_ExampleMust(t *testing.T) {\n\tdata := []byte(`{\n \"Image\": {\n \"Width\": 800,\n \"Height\": 600,\n \"Title\": \"View from 15th Floor\",\n \"Thumbnail\": {\n \"Url\": \"http://www.example.com/image/481989943\",\n \"Height\": 125,\n \"Width\": 100\n },\n \"Animated\" : false,\n \"IDs\": [116, 943, 234, 38793]\n }\n }`)\n\n\troot := Must(Unmarshal(data))\n\tif root.Size() != 1 {\n\t\tt.Errorf(\"root.Size() must be 1. got: %v\", root.Size())\n\t}\n\n\tufmt.Sprintf(\"Object has %d inheritors inside\", root.Size())\n\t// Output:\n\t// Object has 1 inheritors inside\n}\n\n// Calculate AVG price from different types of objects, JSON from: https://goessner.net/articles/JsonPath/index.html#e3\nfunc TestExampleUnmarshal(t *testing.T) {\n\tdata := []byte(`{ \"store\": {\n \"book\": [ \n { \"category\": \"reference\",\n \"author\": \"Nigel Rees\",\n \"title\": \"Sayings of the Century\",\n \"price\": 8.95\n },\n { \"category\": \"fiction\",\n \"author\": \"Evelyn Waugh\",\n \"title\": \"Sword of Honour\",\n \"price\": 12.99\n },\n { \"category\": \"fiction\",\n \"author\": \"Herman Melville\",\n \"title\": \"Moby Dick\",\n \"isbn\": \"0-553-21311-3\",\n \"price\": 8.99\n },\n { \"category\": \"fiction\",\n \"author\": \"J. R. R. Tolkien\",\n \"title\": \"The Lord of the Rings\",\n \"isbn\": \"0-395-19395-8\",\n \"price\": 22.99\n }\n ],\n \"bicycle\": { \"color\": \"red\",\n \"price\": 19.95\n },\n \"tools\": null\n }\n}`)\n\n\troot, err := Unmarshal(data)\n\tif err != nil {\n\t\tt.Errorf(\"error occurred when unmarshal\")\n\t}\n\n\tstore := root.MustKey(\"store\").MustObject()\n\n\tvar prices float64\n\tsize := 0\n\tfor _, objects := range store {\n\t\tif objects.IsArray() \u0026\u0026 objects.Size() \u003e 0 {\n\t\t\tsize += objects.Size()\n\t\t\tfor _, object := range objects.MustArray() {\n\t\t\t\tprices += object.MustKey(\"price\").MustNumeric()\n\t\t\t}\n\t\t} else if objects.IsObject() \u0026\u0026 objects.HasKey(\"price\") {\n\t\t\tsize++\n\t\t\tprices += objects.MustKey(\"price\").MustNumeric()\n\t\t}\n\t}\n\n\tresult := int(prices / float64(size))\n\tufmt.Sprintf(\"AVG price: %d\", result)\n}\n\nfunc TestNode_ExampleMust_panic(t *testing.T) {\n\tdefer func() {\n\t\tif r := recover(); r == nil {\n\t\t\tt.Errorf(\"The code did not panic\")\n\t\t}\n\t}()\n\tdata := []byte(`{]`)\n\troot := Must(Unmarshal(data))\n\tufmt.Sprintf(\"Object has %d inheritors inside\", root.Size())\n}\n\nfunc TestNode_Path(t *testing.T) {\n\tdata := []byte(`{\n \"Image\": {\n \"Width\": 800,\n \"Height\": 600,\n \"Title\": \"View from 15th Floor\",\n \"Thumbnail\": {\n \"Url\": \"http://www.example.com/image/481989943\",\n \"Height\": 125,\n \"Width\": 100\n },\n \"Animated\" : false,\n \"IDs\": [116, 943, 234, 38793]\n }\n }`)\n\n\troot, err := Unmarshal(data)\n\tif err != nil {\n\t\tt.Errorf(\"Error on Unmarshal(): %s\", err.Error())\n\t\treturn\n\t}\n\n\tif root.Path() != \"$\" {\n\t\tt.Errorf(\"Wrong root.Path()\")\n\t}\n\n\telement := root.MustKey(\"Image\").MustKey(\"Thumbnail\").MustKey(\"Url\")\n\tif element.Path() != \"$['Image']['Thumbnail']['Url']\" {\n\t\tt.Errorf(\"Wrong path found: %s\", element.Path())\n\t}\n\n\tif (*Node)(nil).Path() != \"\" {\n\t\tt.Errorf(\"Wrong (nil).Path()\")\n\t}\n}\n\nfunc TestNode_Path2(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tnode *Node\n\t\twant string\n\t}{\n\t\t{\n\t\t\tname: \"Node with key\",\n\t\t\tnode: \u0026Node{\n\t\t\t\tprev: \u0026Node{},\n\t\t\t\tkey: func() *string { s := \"key\"; return \u0026s }(),\n\t\t\t},\n\t\t\twant: \"$['key']\",\n\t\t},\n\t\t{\n\t\t\tname: \"Node with index\",\n\t\t\tnode: \u0026Node{\n\t\t\t\tprev: \u0026Node{},\n\t\t\t\tindex: func() *int { i := 1; return \u0026i }(),\n\t\t\t},\n\t\t\twant: \"$[1]\",\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tif got := tt.node.Path(); got != tt.want {\n\t\t\t\tt.Errorf(\"Path() = %v, want %v\", got, tt.want)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestNode_Root(t *testing.T) {\n\troot := \u0026Node{}\n\tchild := \u0026Node{prev: root}\n\tgrandChild := \u0026Node{prev: child}\n\n\ttests := []struct {\n\t\tname string\n\t\tnode *Node\n\t\twant *Node\n\t}{\n\t\t{\n\t\t\tname: \"Root node\",\n\t\t\tnode: root,\n\t\t\twant: root,\n\t\t},\n\t\t{\n\t\t\tname: \"Child node\",\n\t\t\tnode: child,\n\t\t\twant: root,\n\t\t},\n\t\t{\n\t\t\tname: \"Grandchild node\",\n\t\t\tnode: grandChild,\n\t\t\twant: root,\n\t\t},\n\t\t{\n\t\t\tname: \"Node is nil\",\n\t\t\tnode: nil,\n\t\t\twant: nil,\n\t\t},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\tif got := tt.node.root(); got != tt.want {\n\t\t\t\tt.Errorf(\"root() = %v, want %v\", got, tt.want)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc contains(slice []string, item string) bool {\n\tfor _, a := range slice {\n\t\tif a == item {\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n\n// ignore the sequence of keys by ordering them.\n// need to avoid import encoding/json and reflect package.\n// because gno does not support them for now.\n// TODO: use encoding/json to compare the result after if possible in gno.\nfunc isSameObject(a, b string) bool {\n\taPairs := strings.Split(strings.Trim(a, \"{}\"), \",\")\n\tbPairs := strings.Split(strings.Trim(b, \"{}\"), \",\")\n\n\taMap := make(map[string]string)\n\tbMap := make(map[string]string)\n\tfor _, pair := range aPairs {\n\t\tkv := strings.Split(pair, \":\")\n\t\tkey := strings.Trim(kv[0], `\"`)\n\t\tvalue := strings.Trim(kv[1], `\"`)\n\t\taMap[key] = value\n\t}\n\tfor _, pair := range bPairs {\n\t\tkv := strings.Split(pair, \":\")\n\t\tkey := strings.Trim(kv[0], `\"`)\n\t\tvalue := strings.Trim(kv[1], `\"`)\n\t\tbMap[key] = value\n\t}\n\n\taKeys := make([]string, 0, len(aMap))\n\tbKeys := make([]string, 0, len(bMap))\n\tfor k := range aMap {\n\t\taKeys = append(aKeys, k)\n\t}\n\n\tfor k := range bMap {\n\t\tbKeys = append(bKeys, k)\n\t}\n\n\tsort.Strings(aKeys)\n\tsort.Strings(bKeys)\n\n\tif len(aKeys) != len(bKeys) {\n\t\treturn false\n\t}\n\n\tfor i := range aKeys {\n\t\tif aKeys[i] != bKeys[i] {\n\t\t\treturn false\n\t\t}\n\n\t\tif aMap[aKeys[i]] != bMap[bKeys[i]] {\n\t\t\treturn false\n\t\t}\n\t}\n\n\treturn true\n}\n\nfunc compareNodes(n1, n2 *Node) bool {\n\tif n1 == nil || n2 == nil {\n\t\treturn n1 == n2\n\t}\n\n\tif n1.key != n2.key {\n\t\treturn false\n\t}\n\n\tif !bytes.Equal(n1.data, n2.data) {\n\t\treturn false\n\t}\n\n\tif n1.index != n2.index {\n\t\treturn false\n\t}\n\n\tif n1.borders != n2.borders {\n\t\treturn false\n\t}\n\n\tif n1.modified != n2.modified {\n\t\treturn false\n\t}\n\n\tif n1.nodeType != n2.nodeType {\n\t\treturn false\n\t}\n\n\tif !compareNodes(n1.prev, n2.prev) {\n\t\treturn false\n\t}\n\n\tif len(n1.next) != len(n2.next) {\n\t\treturn false\n\t}\n\n\tfor k, v := range n1.next {\n\t\tif !compareNodes(v, n2.next[k]) {\n\t\t\treturn false\n\t\t}\n\t}\n\n\treturn true\n}\n"},{"name":"parser.gno","body":"package json\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"strconv\"\n\n\tel \"gno.land/p/demo/json/eisel_lemire\"\n)\n\nconst (\n\tabsMinInt64 = 1 \u003c\u003c 63\n\tmaxInt64 = absMinInt64 - 1\n\tmaxUint64 = 1\u003c\u003c64 - 1\n)\n\nconst unescapeStackBufSize = 64\n\n// PaseStringLiteral parses a string from the given byte slice.\nfunc ParseStringLiteral(data []byte) (string, error) {\n\tvar buf [unescapeStackBufSize]byte\n\n\tbf, err := Unescape(data, buf[:])\n\tif err != nil {\n\t\treturn \"\", errors.New(\"invalid string input found while parsing string value\")\n\t}\n\n\treturn string(bf), nil\n}\n\n// ParseBoolLiteral parses a boolean value from the given byte slice.\nfunc ParseBoolLiteral(data []byte) (bool, error) {\n\tswitch {\n\tcase bytes.Equal(data, trueLiteral):\n\t\treturn true, nil\n\tcase bytes.Equal(data, falseLiteral):\n\t\treturn false, nil\n\tdefault:\n\t\treturn false, errors.New(\"JSON Error: malformed boolean value found while parsing boolean value\")\n\t}\n}\n\n// PaseFloatLiteral parses a float64 from the given byte slice.\n//\n// It utilizes double-precision (64-bit) floating-point format as defined\n// by the IEEE 754 standard, providing a decimal precision of approximately 15 digits.\nfunc ParseFloatLiteral(bytes []byte) (float64, error) {\n\tif len(bytes) == 0 {\n\t\treturn -1, errors.New(\"JSON Error: empty byte slice found while parsing float value\")\n\t}\n\n\tneg, bytes := trimNegativeSign(bytes)\n\n\tvar exponentPart []byte\n\tfor i, c := range bytes {\n\t\tif lower(c) == 'e' {\n\t\t\texponentPart = bytes[i+1:]\n\t\t\tbytes = bytes[:i]\n\t\t\tbreak\n\t\t}\n\t}\n\n\tman, exp10, err := extractMantissaAndExp10(bytes)\n\tif err != nil {\n\t\treturn -1, err\n\t}\n\n\tif len(exponentPart) \u003e 0 {\n\t\texp, err := strconv.Atoi(string(exponentPart))\n\t\tif err != nil {\n\t\t\treturn -1, errors.New(\"JSON Error: invalid exponent value found while parsing float value\")\n\t\t}\n\t\texp10 += exp\n\t}\n\n\t// for fast float64 conversion\n\tf, success := el.EiselLemire64(man, exp10, neg)\n\tif !success {\n\t\treturn 0, nil\n\t}\n\n\treturn f, nil\n}\n\nfunc ParseIntLiteral(bytes []byte) (int64, error) {\n\tif len(bytes) == 0 {\n\t\treturn 0, errors.New(\"JSON Error: empty byte slice found while parsing integer value\")\n\t}\n\n\tneg, bytes := trimNegativeSign(bytes)\n\n\tvar n uint64 = 0\n\tfor _, c := range bytes {\n\t\tif notDigit(c) {\n\t\t\treturn 0, errors.New(\"JSON Error: non-digit characters found while parsing integer value\")\n\t\t}\n\n\t\tif n \u003e maxUint64/10 {\n\t\t\treturn 0, errors.New(\"JSON Error: numeric value exceeds the range limit\")\n\t\t}\n\n\t\tn *= 10\n\n\t\tn1 := n + uint64(c-'0')\n\t\tif n1 \u003c n {\n\t\t\treturn 0, errors.New(\"JSON Error: numeric value exceeds the range limit\")\n\t\t}\n\n\t\tn = n1\n\t}\n\n\tif n \u003e maxInt64 {\n\t\tif neg \u0026\u0026 n == absMinInt64 {\n\t\t\treturn -absMinInt64, nil\n\t\t}\n\n\t\treturn 0, errors.New(\"JSON Error: numeric value exceeds the range limit\")\n\t}\n\n\tif neg {\n\t\treturn -int64(n), nil\n\t}\n\n\treturn int64(n), nil\n}\n\n// extractMantissaAndExp10 parses a byte slice representing a decimal number and extracts the mantissa and the exponent of its base-10 representation.\n// It iterates through the bytes, constructing the mantissa by treating each byte as a digit.\n// If a decimal point is encountered, the function keeps track of the position of the decimal point to calculate the exponent.\n// The function ensures that:\n// - The number contains at most one decimal point.\n// - All characters in the byte slice are digits or a single decimal point.\n// - The resulting mantissa does not overflow a uint64.\nfunc extractMantissaAndExp10(bytes []byte) (uint64, int, error) {\n\tvar (\n\t\tman uint64\n\t\texp10 int\n\t\tdecimalFound bool\n\t)\n\n\tfor _, c := range bytes {\n\t\tif c == dot {\n\t\t\tif decimalFound {\n\t\t\t\treturn 0, 0, errors.New(\"JSON Error: multiple decimal points found while parsing float value\")\n\t\t\t}\n\t\t\tdecimalFound = true\n\t\t\tcontinue\n\t\t}\n\n\t\tif notDigit(c) {\n\t\t\treturn 0, 0, errors.New(\"JSON Error: non-digit characters found while parsing integer value\")\n\t\t}\n\n\t\tdigit := uint64(c - '0')\n\n\t\tif man \u003e (maxUint64-digit)/10 {\n\t\t\treturn 0, 0, errors.New(\"JSON Error: numeric value exceeds the range limit\")\n\t\t}\n\n\t\tman = man*10 + digit\n\n\t\tif decimalFound {\n\t\t\texp10--\n\t\t}\n\t}\n\n\treturn man, exp10, nil\n}\n\nfunc trimNegativeSign(bytes []byte) (bool, []byte) {\n\tif bytes[0] == minus {\n\t\treturn true, bytes[1:]\n\t}\n\n\treturn false, bytes\n}\n\nfunc notDigit(c byte) bool {\n\treturn (c \u0026 0xF0) != 0x30\n}\n\n// lower converts a byte to lower case if it is an uppercase letter.\nfunc lower(c byte) byte {\n\treturn c | 0x20\n}\n"},{"name":"parser_test.gno","body":"package json\n\nimport \"testing\"\n\nfunc TestParseStringLiteral(t *testing.T) {\n\ttests := []struct {\n\t\tinput string\n\t\texpected string\n\t\tisError bool\n\t}{\n\t\t{`\"Hello, World!\"`, \"\\\"Hello, World!\\\"\", false},\n\t\t{`\\uFF11`, \"\\uFF11\", false},\n\t\t{`\\uFFFF`, \"\\uFFFF\", false},\n\t\t{`true`, \"true\", false},\n\t\t{`false`, \"false\", false},\n\t\t{`\\uDF00`, \"\", true},\n\t}\n\n\tfor i, tt := range tests {\n\t\ts, err := ParseStringLiteral([]byte(tt.input))\n\n\t\tif !tt.isError \u0026\u0026 err != nil {\n\t\t\tt.Errorf(\"%d. unexpected error: %s\", i, err)\n\t\t}\n\n\t\tif tt.isError \u0026\u0026 err == nil {\n\t\t\tt.Errorf(\"%d. expected error, but not error\", i)\n\t\t}\n\n\t\tif s != tt.expected {\n\t\t\tt.Errorf(\"%d. expected=%s, but actual=%s\", i, tt.expected, s)\n\t\t}\n\t}\n}\n\nfunc TestParseBoolLiteral(t *testing.T) {\n\ttests := []struct {\n\t\tinput string\n\t\texpected bool\n\t\tisError bool\n\t}{\n\t\t{`true`, true, false},\n\t\t{`false`, false, false},\n\t\t{`TRUE`, false, true},\n\t\t{`FALSE`, false, true},\n\t\t{`foo`, false, true},\n\t\t{`\"true\"`, false, true},\n\t\t{`\"false\"`, false, true},\n\t}\n\n\tfor i, tt := range tests {\n\t\tb, err := ParseBoolLiteral([]byte(tt.input))\n\n\t\tif !tt.isError \u0026\u0026 err != nil {\n\t\t\tt.Errorf(\"%d. unexpected error: %s\", i, err)\n\t\t}\n\n\t\tif tt.isError \u0026\u0026 err == nil {\n\t\t\tt.Errorf(\"%d. expected error, but not error\", i)\n\t\t}\n\n\t\tif b != tt.expected {\n\t\t\tt.Errorf(\"%d. expected=%t, but actual=%t\", i, tt.expected, b)\n\t\t}\n\t}\n}\n\nfunc TestParseFloatLiteral(t *testing.T) {\n\ttests := []struct {\n\t\tinput string\n\t\texpected float64\n\t}{\n\t\t{\"123\", 123},\n\t\t{\"-123\", -123},\n\t\t{\"123.456\", 123.456},\n\t\t{\"-123.456\", -123.456},\n\t\t{\"12345678.1234567890\", 12345678.1234567890},\n\t\t{\"-12345678.09123456789\", -12345678.09123456789},\n\t\t{\"0.123\", 0.123},\n\t\t{\"-0.123\", -0.123},\n\t\t{\"\", -1},\n\t\t{\"abc\", -1},\n\t\t{\"123.45.6\", -1},\n\t\t{\"999999999999999999999\", -1},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.input, func(t *testing.T) {\n\t\t\tgot, _ := ParseFloatLiteral([]byte(tt.input))\n\t\t\tif got != tt.expected {\n\t\t\t\tt.Errorf(\"ParseFloatLiteral(%s): got %v, want %v\", tt.input, got, tt.expected)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestParseFloatWithScientificNotation(t *testing.T) {\n\ttests := []struct {\n\t\tinput string\n\t\texpected float64\n\t}{\n\t\t{\"1e6\", 1000000},\n\t\t{\"1E6\", 1000000},\n\t\t{\"1.23e10\", 1.23e10},\n\t\t{\"1.23E10\", 1.23e10},\n\t\t{\"-1.23e10\", -1.23e10},\n\t\t{\"-1.23E10\", -1.23e10},\n\t\t{\"2.45e-8\", 2.45e-8},\n\t\t{\"2.45E-8\", 2.45e-8},\n\t\t{\"-2.45e-8\", -2.45e-8},\n\t\t{\"-2.45E-8\", -2.45e-8},\n\t\t{\"5e0\", 5},\n\t\t{\"-5e0\", -5},\n\t\t{\"5E+0\", 5},\n\t\t{\"5e+1\", 50},\n\t\t{\"1e-1\", 0.1},\n\t\t{\"1E-1\", 0.1},\n\t\t{\"-1e-1\", -0.1},\n\t\t{\"-1E-1\", -0.1},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.input, func(t *testing.T) {\n\t\t\tgot, err := ParseFloatLiteral([]byte(tt.input))\n\t\t\tif got != tt.expected {\n\t\t\t\tt.Errorf(\"ParseFloatLiteral(%s): got %v, want %v\", tt.input, got, tt.expected)\n\t\t\t}\n\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"ParseFloatLiteral(%s): got error %v\", tt.input, err)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestParseFloat_May_Interoperability_Problem(t *testing.T) {\n\ttests := []struct {\n\t\tinput string\n\t\tshouldErr bool\n\t}{\n\t\t{\"3.141592653589793238462643383279\", true},\n\t\t{\"1E400\", false}, // TODO: should error\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.input, func(t *testing.T) {\n\t\t\t_, err := ParseFloatLiteral([]byte(tt.input))\n\t\t\tif tt.shouldErr \u0026\u0026 err == nil {\n\t\t\t\tt.Errorf(\"ParseFloatLiteral(%s): expected error, but not error\", tt.input)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestParseIntLiteral(t *testing.T) {\n\ttests := []struct {\n\t\tinput string\n\t\texpected int64\n\t}{\n\t\t{\"0\", 0},\n\t\t{\"1\", 1},\n\t\t{\"-1\", -1},\n\t\t{\"12345\", 12345},\n\t\t{\"-12345\", -12345},\n\t\t{\"9223372036854775807\", 9223372036854775807},\n\t\t{\"-9223372036854775808\", -9223372036854775808},\n\t\t{\"-92233720368547758081\", 0},\n\t\t{\"18446744073709551616\", 0},\n\t\t{\"9223372036854775808\", 0},\n\t\t{\"-9223372036854775809\", 0},\n\t\t{\"\", 0},\n\t\t{\"abc\", 0},\n\t\t{\"12345x\", 0},\n\t\t{\"123e5\", 0},\n\t\t{\"9223372036854775807x\", 0},\n\t\t{\"27670116110564327410\", 0},\n\t\t{\"-27670116110564327410\", 0},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.input, func(t *testing.T) {\n\t\t\tgot, _ := ParseIntLiteral([]byte(tt.input))\n\t\t\tif got != tt.expected {\n\t\t\t\tt.Errorf(\"ParseIntLiteral(%s): got %v, want %v\", tt.input, got, tt.expected)\n\t\t\t}\n\t\t})\n\t}\n}\n"},{"name":"path.gno","body":"package json\n\nimport (\n\t\"errors\"\n)\n\n// ParsePath takes a JSONPath string and returns a slice of strings representing the path segments.\nfunc ParsePath(path string) ([]string, error) {\n\tbuf := newBuffer([]byte(path))\n\tresult := make([]string, 0)\n\n\tfor {\n\t\tb, err := buf.current()\n\t\tif err != nil {\n\t\t\tbreak\n\t\t}\n\n\t\tswitch {\n\t\tcase b == dollarSign || b == atSign:\n\t\t\tresult = append(result, string(b))\n\t\t\tbuf.step()\n\n\t\tcase b == dot:\n\t\t\tbuf.step()\n\n\t\t\tif next, _ := buf.current(); next == dot {\n\t\t\t\tbuf.step()\n\t\t\t\tresult = append(result, \"..\")\n\n\t\t\t\textractNextSegment(buf, \u0026result)\n\t\t\t} else {\n\t\t\t\textractNextSegment(buf, \u0026result)\n\t\t\t}\n\n\t\tcase b == bracketOpen:\n\t\t\tstart := buf.index\n\t\t\tbuf.step()\n\n\t\t\tfor {\n\t\t\t\tif buf.index \u003e= buf.length || buf.data[buf.index] == bracketClose {\n\t\t\t\t\tbreak\n\t\t\t\t}\n\n\t\t\t\tbuf.step()\n\t\t\t}\n\n\t\t\tif buf.index \u003e= buf.length {\n\t\t\t\treturn nil, errors.New(\"unexpected end of path\")\n\t\t\t}\n\n\t\t\tsegment := string(buf.sliceFromIndices(start+1, buf.index))\n\t\t\tresult = append(result, segment)\n\n\t\t\tbuf.step()\n\n\t\tdefault:\n\t\t\tbuf.step()\n\t\t}\n\t}\n\n\treturn result, nil\n}\n\n// extractNextSegment extracts the segment from the current index\n// to the next significant character and adds it to the resulting slice.\nfunc extractNextSegment(buf *buffer, result *[]string) {\n\tstart := buf.index\n\tbuf.skipToNextSignificantToken()\n\n\tif buf.index \u003c= start {\n\t\treturn\n\t}\n\n\tsegment := string(buf.sliceFromIndices(start, buf.index))\n\tif segment != \"\" {\n\t\t*result = append(*result, segment)\n\t}\n}\n"},{"name":"path_test.gno","body":"package json\n\nimport \"testing\"\n\nfunc TestParseJSONPath(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tpath string\n\t\texpected []string\n\t}{\n\t\t{name: \"Empty string path\", path: \"\", expected: []string{}},\n\t\t{name: \"Root only path\", path: \"$\", expected: []string{\"$\"}},\n\t\t{name: \"Root with dot path\", path: \"$.\", expected: []string{\"$\"}},\n\t\t{name: \"All objects in path\", path: \"$..\", expected: []string{\"$\", \"..\"}},\n\t\t{name: \"Only children in path\", path: \"$.*\", expected: []string{\"$\", \"*\"}},\n\t\t{name: \"All objects' children in path\", path: \"$..*\", expected: []string{\"$\", \"..\", \"*\"}},\n\t\t{name: \"Simple dot notation path\", path: \"$.root.element\", expected: []string{\"$\", \"root\", \"element\"}},\n\t\t{name: \"Complex dot notation path with wildcard\", path: \"$.root.*.element\", expected: []string{\"$\", \"root\", \"*\", \"element\"}},\n\t\t{name: \"Path with array wildcard\", path: \"$.phoneNumbers[*].type\", expected: []string{\"$\", \"phoneNumbers\", \"*\", \"type\"}},\n\t\t{name: \"Path with filter expression\", path: \"$.store.book[?(@.price \u003c 10)].title\", expected: []string{\"$\", \"store\", \"book\", \"?(@.price \u003c 10)\", \"title\"}},\n\t\t{name: \"Path with formula\", path: \"$..phoneNumbers..('ty' + 'pe')\", expected: []string{\"$\", \"..\", \"phoneNumbers\", \"..\", \"('ty' + 'pe')\"}},\n\t\t{name: \"Simple bracket notation path\", path: \"$['root']['element']\", expected: []string{\"$\", \"'root'\", \"'element'\"}},\n\t\t{name: \"Complex bracket notation path with wildcard\", path: \"$['root'][*]['element']\", expected: []string{\"$\", \"'root'\", \"*\", \"'element'\"}},\n\t\t{name: \"Bracket notation path with integer index\", path: \"$['store']['book'][0]['title']\", expected: []string{\"$\", \"'store'\", \"'book'\", \"0\", \"'title'\"}},\n\t\t{name: \"Complex path with wildcard in bracket notation\", path: \"$['root'].*['element']\", expected: []string{\"$\", \"'root'\", \"*\", \"'element'\"}},\n\t\t{name: \"Mixed notation path with dot after bracket\", path: \"$.['root'].*.['element']\", expected: []string{\"$\", \"'root'\", \"*\", \"'element'\"}},\n\t\t{name: \"Mixed notation path with dot before bracket\", path: \"$['root'].*.['element']\", expected: []string{\"$\", \"'root'\", \"*\", \"'element'\"}},\n\t\t{name: \"Single character path with root\", path: \"$.a\", expected: []string{\"$\", \"a\"}},\n\t\t{name: \"Multiple characters path with root\", path: \"$.abc\", expected: []string{\"$\", \"abc\"}},\n\t\t{name: \"Multiple segments path with root\", path: \"$.a.b.c\", expected: []string{\"$\", \"a\", \"b\", \"c\"}},\n\t\t{name: \"Multiple segments path with wildcard and root\", path: \"$.a.*.c\", expected: []string{\"$\", \"a\", \"*\", \"c\"}},\n\t\t{name: \"Multiple segments path with filter and root\", path: \"$.a[?(@.b == 'c')].d\", expected: []string{\"$\", \"a\", \"?(@.b == 'c')\", \"d\"}},\n\t\t{name: \"Complex path with multiple filters\", path: \"$.a[?(@.b == 'c')].d[?(@.e == 'f')].g\", expected: []string{\"$\", \"a\", \"?(@.b == 'c')\", \"d\", \"?(@.e == 'f')\", \"g\"}},\n\t\t{name: \"Complex path with multiple filters and wildcards\", path: \"$.a[?(@.b == 'c')].*.d[?(@.e == 'f')].g\", expected: []string{\"$\", \"a\", \"?(@.b == 'c')\", \"*\", \"d\", \"?(@.e == 'f')\", \"g\"}},\n\t\t{name: \"Path with array index and root\", path: \"$.a[0].b\", expected: []string{\"$\", \"a\", \"0\", \"b\"}},\n\t\t{name: \"Path with multiple array indices and root\", path: \"$.a[0].b[1].c\", expected: []string{\"$\", \"a\", \"0\", \"b\", \"1\", \"c\"}},\n\t\t{name: \"Path with array index, wildcard and root\", path: \"$.a[0].*.c\", expected: []string{\"$\", \"a\", \"0\", \"*\", \"c\"}},\n\t}\n\n\tfor _, tt := range tests {\n\t\tt.Run(tt.name, func(t *testing.T) {\n\t\t\treult, _ := ParsePath(tt.path)\n\t\t\tif !isEqualSlice(reult, tt.expected) {\n\t\t\t\tt.Errorf(\"ParsePath(%s) expected: %v, got: %v\", tt.path, tt.expected, reult)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc isEqualSlice(a, b []string) bool {\n\tif len(a) != len(b) {\n\t\treturn false\n\t}\n\n\tfor i, v := range a {\n\t\tif v != b[i] {\n\t\t\treturn false\n\t\t}\n\t}\n\n\treturn true\n}\n"},{"name":"token.gno","body":"package json\n\nconst (\n\tbracketOpen = '['\n\tbracketClose = ']'\n\tparenOpen = '('\n\tparenClose = ')'\n\tcurlyOpen = '{'\n\tcurlyClose = '}'\n\tcomma = ','\n\tdot = '.'\n\tcolon = ':'\n\tbackTick = '`'\n\tsingleQuote = '\\''\n\tdoubleQuote = '\"'\n\temptyString = \"\"\n\twhiteSpace = ' '\n\tplus = '+'\n\tminus = '-'\n\taesterisk = '*'\n\tbang = '!'\n\tquestion = '?'\n\tnewLine = '\\n'\n\ttab = '\\t'\n\tcarriageReturn = '\\r'\n\tformFeed = '\\f'\n\tbackSpace = '\\b'\n\tslash = '/'\n\tbackSlash = '\\\\'\n\tunderScore = '_'\n\tdollarSign = '$'\n\tatSign = '@'\n\tandSign = '\u0026'\n\torSign = '|'\n)\n\nvar (\n\ttrueLiteral = []byte(\"true\")\n\tfalseLiteral = []byte(\"false\")\n\tnullLiteral = []byte(\"null\")\n)\n\ntype ValueType int\n\nconst (\n\tNotExist ValueType = iota\n\tString\n\tNumber\n\tFloat\n\tObject\n\tArray\n\tBoolean\n\tNull\n\tUnknown\n)\n\nfunc (v ValueType) String() string {\n\tswitch v {\n\tcase NotExist:\n\t\treturn \"not-exist\"\n\tcase String:\n\t\treturn \"string\"\n\tcase Number:\n\t\treturn \"number\"\n\tcase Object:\n\t\treturn \"object\"\n\tcase Array:\n\t\treturn \"array\"\n\tcase Boolean:\n\t\treturn \"boolean\"\n\tcase Null:\n\t\treturn \"null\"\n\tdefault:\n\t\treturn \"unknown\"\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"int32","path":"gno.land/p/demo/math_eval/int32","files":[{"name":"int32.gno","body":"// eval/int32 is a evaluator for int32 expressions.\n// This code is heavily forked from https://github.com/dengsgo/math-engine\n// which is licensed under Apache 2.0:\n// https://raw.githubusercontent.com/dengsgo/math-engine/298e2b57b7e7350d0f67bd036916efd5709abe25/LICENSE\npackage int32\n\nimport (\n\t\"errors\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/ufmt\"\n)\n\nconst (\n\tIdentifier = iota\n\tNumber // numbers\n\tOperator // +, -, *, /, etc.\n\tVariable // x, y, z, etc. (one-letter only)\n)\n\ntype expression interface {\n\tString() string\n}\n\ntype expressionRaw struct {\n\texpression string\n\tType int\n\tFlag int\n\tOffset int\n}\n\ntype parser struct {\n\tInput string\n\tch byte\n\toffset int\n\terr error\n}\n\ntype expressionNumber struct {\n\tVal int\n\tStr string\n}\n\ntype expressionVariable struct {\n\tVal int\n\tStr string\n}\n\ntype expressionOperation struct {\n\tOp string\n\tLhs,\n\tRhs expression\n}\n\ntype ast struct {\n\trawexpressions []*expressionRaw\n\tsource string\n\tcurrentexpression *expressionRaw\n\tcurrentIndex int\n\tdepth int\n\terr error\n}\n\n// Parse takes an expression string, e.g. \"1+2\" and returns\n// a parsed expression. If there is an error it will return.\nfunc Parse(s string) (ar expression, err error) {\n\ttoks, err := lexer(s)\n\tif err != nil {\n\t\treturn\n\t}\n\tast, err := newAST(toks, s)\n\tif err != nil {\n\t\treturn\n\t}\n\tar, err = ast.parseExpression()\n\treturn\n}\n\n// Eval takes a parsed expression and a map of variables (or nil). The parsed\n// expression is evaluated using any variables and returns the\n// resulting int and/or error.\nfunc Eval(expr expression, variables map[string]int) (res int, err error) {\n\tif err != nil {\n\t\treturn\n\t}\n\tvar l, r int\n\tswitch expr.(type) {\n\tcase expressionVariable:\n\t\tast := expr.(expressionVariable)\n\t\tok := false\n\t\tif variables != nil {\n\t\t\tres, ok = variables[ast.Str]\n\t\t}\n\t\tif !ok {\n\t\t\terr = ufmt.Errorf(\"variable '%s' not found\", ast.Str)\n\t\t}\n\t\treturn\n\tcase expressionOperation:\n\t\tast := expr.(expressionOperation)\n\t\tl, err = Eval(ast.Lhs, variables)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tr, err = Eval(ast.Rhs, variables)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tswitch ast.Op {\n\t\tcase \"+\":\n\t\t\tres = l + r\n\t\tcase \"-\":\n\t\t\tres = l - r\n\t\tcase \"*\":\n\t\t\tres = l * r\n\t\tcase \"/\":\n\t\t\tif r == 0 {\n\t\t\t\terr = ufmt.Errorf(\"violation of arithmetic specification: a division by zero in Eval: [%d/%d]\", l, r)\n\t\t\t\treturn\n\t\t\t}\n\t\t\tres = l / r\n\t\tcase \"%\":\n\t\t\tif r == 0 {\n\t\t\t\tres = 0\n\t\t\t} else {\n\t\t\t\tres = l % r\n\t\t\t}\n\t\tcase \"^\":\n\t\t\tres = l ^ r\n\t\tcase \"\u003e\u003e\":\n\t\t\tres = l \u003e\u003e r\n\t\tcase \"\u003c\u003c\":\n\t\t\tres = l \u003c\u003c r\n\t\tcase \"\u003e\":\n\t\t\tif l \u003e r {\n\t\t\t\tres = 1\n\t\t\t} else {\n\t\t\t\tres = 0\n\t\t\t}\n\t\tcase \"\u003c\":\n\t\t\tif l \u003c r {\n\t\t\t\tres = 1\n\t\t\t} else {\n\t\t\t\tres = 0\n\t\t\t}\n\t\tcase \"\u0026\":\n\t\t\tres = l \u0026 r\n\t\tcase \"|\":\n\t\t\tres = l | r\n\t\tdefault:\n\n\t\t}\n\tcase expressionNumber:\n\t\tres = expr.(expressionNumber).Val\n\t}\n\n\treturn\n}\n\nfunc expressionError(s string, pos int) string {\n\tr := strings.Repeat(\"-\", len(s)) + \"\\n\"\n\ts += \"\\n\"\n\tfor i := 0; i \u003c pos; i++ {\n\t\ts += \" \"\n\t}\n\ts += \"^\\n\"\n\treturn r + s + r\n}\n\nfunc (n expressionVariable) String() string {\n\treturn ufmt.Sprintf(\n\t\t\"expressionVariable: %s\",\n\t\tn.Str,\n\t)\n}\n\nfunc (n expressionNumber) String() string {\n\treturn ufmt.Sprintf(\n\t\t\"expressionNumber: %s\",\n\t\tn.Str,\n\t)\n}\n\nfunc (b expressionOperation) String() string {\n\treturn ufmt.Sprintf(\n\t\t\"expressionOperation: (%s %s %s)\",\n\t\tb.Op,\n\t\tb.Lhs.String(),\n\t\tb.Rhs.String(),\n\t)\n}\n\nfunc newAST(toks []*expressionRaw, s string) (*ast, error) {\n\ta := \u0026ast{\n\t\trawexpressions: toks,\n\t\tsource: s,\n\t}\n\tif a.rawexpressions == nil || len(a.rawexpressions) == 0 {\n\t\treturn a, errors.New(\"empty token\")\n\t} else {\n\t\ta.currentIndex = 0\n\t\ta.currentexpression = a.rawexpressions[0]\n\t}\n\treturn a, nil\n}\n\nfunc (a *ast) parseExpression() (expression, error) {\n\ta.depth++ // called depth\n\tlhs := a.parsePrimary()\n\tr := a.parseBinOpRHS(0, lhs)\n\ta.depth--\n\tif a.depth == 0 \u0026\u0026 a.currentIndex != len(a.rawexpressions) \u0026\u0026 a.err == nil {\n\t\treturn r, ufmt.Errorf(\"bad expression, reaching the end or missing the operator\\n%s\",\n\t\t\texpressionError(a.source, a.currentexpression.Offset))\n\t}\n\treturn r, nil\n}\n\nfunc (a *ast) getNextexpressionRaw() *expressionRaw {\n\ta.currentIndex++\n\tif a.currentIndex \u003c len(a.rawexpressions) {\n\t\ta.currentexpression = a.rawexpressions[a.currentIndex]\n\t\treturn a.currentexpression\n\t}\n\treturn nil\n}\n\nfunc (a *ast) getTokPrecedence() int {\n\tswitch a.currentexpression.expression {\n\tcase \"/\", \"%\", \"*\":\n\t\treturn 100\n\tcase \"\u003c\u003c\", \"\u003e\u003e\":\n\t\treturn 80\n\tcase \"+\", \"-\":\n\t\treturn 75\n\tcase \"\u003c\", \"\u003e\":\n\t\treturn 70\n\tcase \"\u0026\":\n\t\treturn 60\n\tcase \"^\":\n\t\treturn 50\n\tcase \"|\":\n\t\treturn 40\n\t}\n\treturn -1\n}\n\nfunc (a *ast) parseNumber() expressionNumber {\n\tf64, err := strconv.Atoi(a.currentexpression.expression)\n\tif err != nil {\n\t\ta.err = ufmt.Errorf(\"%v\\nwant '(' or '0-9' but get '%s'\\n%s\",\n\t\t\terr.Error(),\n\t\t\ta.currentexpression.expression,\n\t\t\texpressionError(a.source, a.currentexpression.Offset))\n\t\treturn expressionNumber{}\n\t}\n\tn := expressionNumber{\n\t\tVal: f64,\n\t\tStr: a.currentexpression.expression,\n\t}\n\ta.getNextexpressionRaw()\n\treturn n\n}\n\nfunc (a *ast) parseVariable() expressionVariable {\n\tn := expressionVariable{\n\t\tVal: 0,\n\t\tStr: a.currentexpression.expression,\n\t}\n\ta.getNextexpressionRaw()\n\treturn n\n}\n\nfunc (a *ast) parsePrimary() expression {\n\tswitch a.currentexpression.Type {\n\tcase Variable:\n\t\treturn a.parseVariable()\n\tcase Number:\n\t\treturn a.parseNumber()\n\tcase Operator:\n\t\tif a.currentexpression.expression == \"(\" {\n\t\t\tt := a.getNextexpressionRaw()\n\t\t\tif t == nil {\n\t\t\t\ta.err = ufmt.Errorf(\"want '(' or '0-9' but get EOF\\n%s\",\n\t\t\t\t\texpressionError(a.source, a.currentexpression.Offset))\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\te, _ := a.parseExpression()\n\t\t\tif e == nil {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tif a.currentexpression.expression != \")\" {\n\t\t\t\ta.err = ufmt.Errorf(\"want ')' but get %s\\n%s\",\n\t\t\t\t\ta.currentexpression.expression,\n\t\t\t\t\texpressionError(a.source, a.currentexpression.Offset))\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\ta.getNextexpressionRaw()\n\t\t\treturn e\n\t\t} else if a.currentexpression.expression == \"-\" {\n\t\t\tif a.getNextexpressionRaw() == nil {\n\t\t\t\ta.err = ufmt.Errorf(\"want '0-9' but get '-'\\n%s\",\n\t\t\t\t\texpressionError(a.source, a.currentexpression.Offset))\n\t\t\t\treturn nil\n\t\t\t}\n\t\t\tbin := expressionOperation{\n\t\t\t\tOp: \"-\",\n\t\t\t\tLhs: expressionNumber{},\n\t\t\t\tRhs: a.parsePrimary(),\n\t\t\t}\n\t\t\treturn bin\n\t\t} else {\n\t\t\treturn a.parseNumber()\n\t\t}\n\tdefault:\n\t\treturn nil\n\t}\n}\n\nfunc (a *ast) parseBinOpRHS(execPrec int, lhs expression) expression {\n\tfor {\n\t\ttokPrec := a.getTokPrecedence()\n\t\tif tokPrec \u003c execPrec {\n\t\t\treturn lhs\n\t\t}\n\t\tbinOp := a.currentexpression.expression\n\t\tif a.getNextexpressionRaw() == nil {\n\t\t\ta.err = ufmt.Errorf(\"want '(' or '0-9' but get EOF\\n%s\",\n\t\t\t\texpressionError(a.source, a.currentexpression.Offset))\n\t\t\treturn nil\n\t\t}\n\t\trhs := a.parsePrimary()\n\t\tif rhs == nil {\n\t\t\treturn nil\n\t\t}\n\t\tnextPrec := a.getTokPrecedence()\n\t\tif tokPrec \u003c nextPrec {\n\t\t\trhs = a.parseBinOpRHS(tokPrec+1, rhs)\n\t\t\tif rhs == nil {\n\t\t\t\treturn nil\n\t\t\t}\n\t\t}\n\t\tlhs = expressionOperation{\n\t\t\tOp: binOp,\n\t\t\tLhs: lhs,\n\t\t\tRhs: rhs,\n\t\t}\n\t}\n}\n\nfunc lexer(s string) ([]*expressionRaw, error) {\n\tp := \u0026parser{\n\t\tInput: s,\n\t\terr: nil,\n\t\tch: s[0],\n\t}\n\ttoks := p.parse()\n\tif p.err != nil {\n\t\treturn nil, p.err\n\t}\n\treturn toks, nil\n}\n\nfunc (p *parser) parse() []*expressionRaw {\n\ttoks := make([]*expressionRaw, 0)\n\tfor {\n\t\ttok := p.nextTok()\n\t\tif tok == nil {\n\t\t\tbreak\n\t\t}\n\t\ttoks = append(toks, tok)\n\t}\n\treturn toks\n}\n\nfunc (p *parser) nextTok() *expressionRaw {\n\tif p.offset \u003e= len(p.Input) || p.err != nil {\n\t\treturn nil\n\t}\n\tvar err error\n\tfor p.isWhitespace(p.ch) \u0026\u0026 err == nil {\n\t\terr = p.nextCh()\n\t}\n\tstart := p.offset\n\tvar tok *expressionRaw\n\tswitch p.ch {\n\tcase\n\t\t'(',\n\t\t')',\n\t\t'+',\n\t\t'-',\n\t\t'*',\n\t\t'/',\n\t\t'^',\n\t\t'\u0026',\n\t\t'|',\n\t\t'%':\n\t\ttok = \u0026expressionRaw{\n\t\t\texpression: string(p.ch),\n\t\t\tType: Operator,\n\t\t}\n\t\ttok.Offset = start\n\t\terr = p.nextCh()\n\tcase '\u003e', '\u003c':\n\t\ttokS := string(p.ch)\n\t\tbb, be := p.nextChPeek()\n\t\tif be == nil \u0026\u0026 string(bb) == tokS {\n\t\t\ttokS += string(p.ch)\n\t\t}\n\t\ttok = \u0026expressionRaw{\n\t\t\texpression: tokS,\n\t\t\tType: Operator,\n\t\t}\n\t\ttok.Offset = start\n\t\tif len(tokS) \u003e 1 {\n\t\t\tp.nextCh()\n\t\t}\n\t\terr = p.nextCh()\n\tcase\n\t\t'0',\n\t\t'1',\n\t\t'2',\n\t\t'3',\n\t\t'4',\n\t\t'5',\n\t\t'6',\n\t\t'7',\n\t\t'8',\n\t\t'9':\n\t\tfor p.isDigitNum(p.ch) \u0026\u0026 p.nextCh() == nil {\n\t\t\tif (p.ch == '-' || p.ch == '+') \u0026\u0026 p.Input[p.offset-1] != 'e' {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\ttok = \u0026expressionRaw{\n\t\t\texpression: strings.ReplaceAll(p.Input[start:p.offset], \"_\", \"\"),\n\t\t\tType: Number,\n\t\t}\n\t\ttok.Offset = start\n\tdefault:\n\t\tif p.isChar(p.ch) {\n\t\t\ttok = \u0026expressionRaw{\n\t\t\t\texpression: string(p.ch),\n\t\t\t\tType: Variable,\n\t\t\t}\n\t\t\ttok.Offset = start\n\t\t\terr = p.nextCh()\n\t\t} else if p.ch != ' ' {\n\t\t\tp.err = ufmt.Errorf(\"symbol error: unknown '%v', pos [%v:]\\n%s\",\n\t\t\t\tstring(p.ch),\n\t\t\t\tstart,\n\t\t\t\texpressionError(p.Input, start))\n\t\t}\n\t}\n\treturn tok\n}\n\nfunc (p *parser) nextChPeek() (byte, error) {\n\toffset := p.offset + 1\n\tif offset \u003c len(p.Input) {\n\t\treturn p.Input[offset], nil\n\t}\n\treturn byte(0), errors.New(\"no byte\")\n}\n\nfunc (p *parser) nextCh() error {\n\tp.offset++\n\tif p.offset \u003c len(p.Input) {\n\t\tp.ch = p.Input[p.offset]\n\t\treturn nil\n\t}\n\treturn errors.New(\"EOF\")\n}\n\nfunc (p *parser) isWhitespace(c byte) bool {\n\treturn c == ' ' ||\n\t\tc == '\\t' ||\n\t\tc == '\\n' ||\n\t\tc == '\\v' ||\n\t\tc == '\\f' ||\n\t\tc == '\\r'\n}\n\nfunc (p *parser) isDigitNum(c byte) bool {\n\treturn '0' \u003c= c \u0026\u0026 c \u003c= '9' || c == '.' || c == '_' || c == 'e' || c == '-' || c == '+'\n}\n\nfunc (p *parser) isChar(c byte) bool {\n\treturn 'a' \u003c= c \u0026\u0026 c \u003c= 'z' || 'A' \u003c= c \u0026\u0026 c \u003c= 'Z'\n}\n\nfunc (p *parser) isWordChar(c byte) bool {\n\treturn p.isChar(c) || '0' \u003c= c \u0026\u0026 c \u003c= '9'\n}\n"},{"name":"int32_test.gno","body":"package int32\n\nimport \"testing\"\n\nfunc TestOne(t *testing.T) {\n\tttt := []struct {\n\t\texp string\n\t\tres int\n\t}{\n\t\t{\"1\", 1},\n\t\t{\"--1\", 1},\n\t\t{\"1+2\", 3},\n\t\t{\"-1+2\", 1},\n\t\t{\"-(1+2)\", -3},\n\t\t{\"-(1+2)*5\", -15},\n\t\t{\"-(1+2)*5/3\", -5},\n\t\t{\"1+(-(1+2)*5/3)\", -4},\n\t\t{\"3^4\", 3 ^ 4},\n\t\t{\"8%2\", 8 % 2},\n\t\t{\"8%3\", 8 % 3},\n\t\t{\"8|3\", 8 | 3},\n\t\t{\"10%2\", 0},\n\t\t{\"(4 + 3)/2-1+11*15\", (4+3)/2 - 1 + 11*15},\n\t\t{\n\t\t\t\"(30099\u003e\u003e10^30099\u003e\u003e11)%5*((30099\u003e\u003e14\u00263^30099\u003e\u003e15\u00261)+1)*30099%99 + ((3 + (30099 \u003e\u003e 14 \u0026 3) - (30099 \u003e\u003e 16 \u0026 1)) / 3 * 30099 % 99 \u0026 64)\",\n\t\t\t(30099\u003e\u003e10^30099\u003e\u003e11)%5*((30099\u003e\u003e14\u00263^30099\u003e\u003e15\u00261)+1)*30099%99 + ((3 + (30099 \u003e\u003e 14 \u0026 3) - (30099 \u003e\u003e 16 \u0026 1)) / 3 * 30099 % 99 \u0026 64),\n\t\t},\n\t\t{\n\t\t\t\"(1023850\u003e\u003e10^1023850\u003e\u003e11)%5*((1023850\u003e\u003e14\u00263^1023850\u003e\u003e15\u00261)+1)*1023850%99 + ((3 + (1023850 \u003e\u003e 14 \u0026 3) - (1023850 \u003e\u003e 16 \u0026 1)) / 3 * 1023850 % 99 \u0026 64)\",\n\t\t\t(1023850\u003e\u003e10^1023850\u003e\u003e11)%5*((1023850\u003e\u003e14\u00263^1023850\u003e\u003e15\u00261)+1)*1023850%99 + ((3 + (1023850 \u003e\u003e 14 \u0026 3) - (1023850 \u003e\u003e 16 \u0026 1)) / 3 * 1023850 % 99 \u0026 64),\n\t\t},\n\t\t{\"((0000+1)*0000)\", 0},\n\t}\n\tfor _, tc := range ttt {\n\t\tt.Run(tc.exp, func(t *testing.T) {\n\t\t\texp, err := Parse(tc.exp)\n\t\t\tif err != nil {\n\t\t\t\tt.Errorf(\"%s:\\n%s\", tc.exp, err.Error())\n\t\t\t} else {\n\t\t\t\tres, errEval := Eval(exp, nil)\n\t\t\t\tif errEval != nil {\n\t\t\t\t\tt.Errorf(\"eval error: %s\", errEval.Error())\n\t\t\t\t} else if res != tc.res {\n\t\t\t\t\tt.Errorf(\"%s:\\nexpected %d, got %d\", tc.exp, tc.res, res)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestVariables(t *testing.T) {\n\tfn := func(x, y int) int {\n\t\treturn 1 + ((x*3+1)*(x*2))\u003e\u003ey + 1\n\t}\n\texpr := \"1 + ((x*3+1)*(x*2))\u003e\u003ey + 1\"\n\texp, err := Parse(expr)\n\tif err != nil {\n\t\tt.Errorf(\"could not parse: %s\", err.Error())\n\t}\n\tvariables := make(map[string]int)\n\tfor i := 0; i \u003c 10; i++ {\n\t\tvariables[\"x\"] = i\n\t\tvariables[\"y\"] = 2\n\t\tres, errEval := Eval(exp, variables)\n\t\tif errEval != nil {\n\t\t\tt.Errorf(\"could not evaluate: %s\", err.Error())\n\t\t}\n\t\texpected := fn(variables[\"x\"], variables[\"y\"])\n\t\tif res != expected {\n\t\t\tt.Errorf(\"expected: %d, actual: %d\", expected, res)\n\t\t}\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"ownable","path":"gno.land/p/demo/ownable","files":[{"name":"errors.gno","body":"package ownable\n\nimport \"errors\"\n\nvar (\n\tErrUnauthorized = errors.New(\"ownable: caller is not owner\")\n\tErrInvalidAddress = errors.New(\"ownable: new owner address is invalid\")\n)\n"},{"name":"ownable.gno","body":"package ownable\n\nimport \"std\"\n\nconst OwnershipTransferEvent = \"OwnershipTransfer\"\n\n// Ownable is meant to be used as a top-level object to make your contract ownable OR\n// being embedded in a Gno object to manage per-object ownership.\ntype Ownable struct {\n\towner std.Address\n}\n\nfunc New() *Ownable {\n\treturn \u0026Ownable{\n\t\towner: std.PrevRealm().Addr(),\n\t}\n}\n\nfunc NewWithAddress(addr std.Address) *Ownable {\n\treturn \u0026Ownable{\n\t\towner: addr,\n\t}\n}\n\n// TransferOwnership transfers ownership of the Ownable struct to a new address\nfunc (o *Ownable) TransferOwnership(newOwner std.Address) error {\n\terr := o.CallerIsOwner()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif !newOwner.IsValid() {\n\t\treturn ErrInvalidAddress\n\t}\n\n\tprevOwner := o.owner\n\to.owner = newOwner\n\tstd.Emit(\n\t\tOwnershipTransferEvent,\n\t\t\"from\", string(prevOwner),\n\t\t\"to\", string(newOwner),\n\t)\n\n\treturn nil\n}\n\n// DropOwnership removes the owner, effectively disabling any owner-related actions\n// Top-level usage: disables all only-owner actions/functions,\n// Embedded usage: behaves like a burn functionality, removing the owner from the struct\nfunc (o *Ownable) DropOwnership() error {\n\terr := o.CallerIsOwner()\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tprevOwner := o.owner\n\to.owner = \"\"\n\n\tstd.Emit(\n\t\tOwnershipTransferEvent,\n\t\t\"from\", string(prevOwner),\n\t\t\"to\", \"\",\n\t)\n\n\treturn nil\n}\n\n// Owner returns the owner address from Ownable\nfunc (o Ownable) Owner() std.Address {\n\treturn o.owner\n}\n\n// CallerIsOwner checks if the caller of the function is the Realm's owner\nfunc (o Ownable) CallerIsOwner() error {\n\tif std.PrevRealm().Addr() == o.owner {\n\t\treturn nil\n\t}\n\n\treturn ErrUnauthorized\n}\n\n// AssertCallerIsOwner panics if the caller is not the owner\nfunc (o Ownable) AssertCallerIsOwner() {\n\tif std.PrevRealm().Addr() != o.owner {\n\t\tpanic(ErrUnauthorized)\n\t}\n}\n"},{"name":"ownable_test.gno","body":"package ownable\n\nimport (\n\t\"std\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/p/demo/uassert\"\n)\n\nvar (\n\talice = testutils.TestAddress(\"alice\")\n\tbob = testutils.TestAddress(\"bob\")\n)\n\nfunc TestNew(t *testing.T) {\n\tstd.TestSetRealm(std.NewUserRealm(alice))\n\tstd.TestSetOrigCaller(alice) // TODO(bug): should not be needed\n\n\to := New()\n\tgot := o.Owner()\n\tif alice != got {\n\t\tt.Fatalf(\"Expected %s, got: %s\", alice, got)\n\t}\n}\n\nfunc TestNewWithAddress(t *testing.T) {\n\to := NewWithAddress(alice)\n\n\tgot := o.Owner()\n\tif alice != got {\n\t\tt.Fatalf(\"Expected %s, got: %s\", alice, got)\n\t}\n}\n\nfunc TestOwner(t *testing.T) {\n\tstd.TestSetRealm(std.NewUserRealm(alice))\n\n\to := New()\n\texpected := alice\n\tgot := o.Owner()\n\tuassert.Equal(t, expected, got)\n}\n\nfunc TestTransferOwnership(t *testing.T) {\n\tstd.TestSetRealm(std.NewUserRealm(alice))\n\n\to := New()\n\n\terr := o.TransferOwnership(bob)\n\tif err != nil {\n\t\tt.Fatalf(\"TransferOwnership failed, %v\", err)\n\t}\n\n\tgot := o.Owner()\n\tif bob != got {\n\t\tt.Fatalf(\"Expected: %s, got: %s\", bob, got)\n\t}\n}\n\nfunc TestCallerIsOwner(t *testing.T) {\n\tstd.TestSetRealm(std.NewUserRealm(alice))\n\n\to := New()\n\tunauthorizedCaller := bob\n\n\tstd.TestSetRealm(std.NewUserRealm(unauthorizedCaller))\n\tstd.TestSetOrigCaller(unauthorizedCaller) // TODO(bug): should not be needed\n\n\terr := o.CallerIsOwner()\n\tuassert.Error(t, err) // XXX: IsError(..., unauthorizedCaller)\n}\n\nfunc TestDropOwnership(t *testing.T) {\n\tstd.TestSetRealm(std.NewUserRealm(alice))\n\n\to := New()\n\n\terr := o.DropOwnership()\n\tuassert.NoError(t, err, \"DropOwnership failed\")\n\n\towner := o.Owner()\n\tuassert.Empty(t, owner, \"owner should be empty\")\n}\n\n// Errors\n\nfunc TestErrUnauthorized(t *testing.T) {\n\tstd.TestSetRealm(std.NewUserRealm(alice))\n\tstd.TestSetOrigCaller(alice) // TODO(bug): should not be needed\n\n\to := New()\n\n\tstd.TestSetRealm(std.NewUserRealm(bob))\n\tstd.TestSetOrigCaller(bob) // TODO(bug): should not be needed\n\n\terr := o.TransferOwnership(alice)\n\tif err != ErrUnauthorized {\n\t\tt.Fatalf(\"Should've been ErrUnauthorized, was %v\", err)\n\t}\n\n\terr = o.DropOwnership()\n\tuassert.ErrorContains(t, err, ErrUnauthorized.Error())\n}\n\nfunc TestErrInvalidAddress(t *testing.T) {\n\tstd.TestSetRealm(std.NewUserRealm(alice))\n\n\to := New()\n\n\terr := o.TransferOwnership(\"\")\n\tuassert.ErrorContains(t, err, ErrInvalidAddress.Error())\n\n\terr = o.TransferOwnership(\"10000000001000000000100000000010000000001000000000\")\n\tuassert.ErrorContains(t, err, ErrInvalidAddress.Error())\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"seqid","path":"gno.land/p/demo/seqid","files":[{"name":"README.md","body":"# seqid\n\n```\npackage seqid // import \"gno.land/p/demo/seqid\"\n\nPackage seqid provides a simple way to have sequential IDs which will be ordered\ncorrectly when inserted in an AVL tree.\n\nSample usage:\n\n var id seqid.ID\n var users avl.Tree\n\n func NewUser() {\n \tusers.Set(id.Next().Binary(), \u0026User{ ... })\n }\n\nTYPES\n\ntype ID uint64\n An ID is a simple sequential ID generator.\n\nfunc FromBinary(b string) (ID, bool)\n FromBinary creates a new ID from the given string.\n\nfunc (i ID) Binary() string\n Binary returns a big-endian binary representation of the ID, suitable to be\n used as an AVL key.\n\nfunc (i *ID) Next() ID\n Next advances the ID i. It will panic if increasing ID would overflow.\n\nfunc (i *ID) TryNext() (ID, bool)\n TryNext increases i by 1 and returns its value. It returns true if\n successful, or false if the increment would result in an overflow.\n```\n"},{"name":"seqid.gno","body":"// Package seqid provides a simple way to have sequential IDs which will be\n// ordered correctly when inserted in an AVL tree.\n//\n// Sample usage:\n//\n//\tvar id seqid.ID\n//\tvar users avl.Tree\n//\n//\tfunc NewUser() {\n//\t\tusers.Set(id.Next().String(), \u0026User{ ... })\n//\t}\npackage seqid\n\nimport (\n\t\"encoding/binary\"\n\n\t\"gno.land/p/demo/cford32\"\n)\n\n// An ID is a simple sequential ID generator.\ntype ID uint64\n\n// Next advances the ID i.\n// It will panic if increasing ID would overflow.\nfunc (i *ID) Next() ID {\n\tnext, ok := i.TryNext()\n\tif !ok {\n\t\tpanic(\"seqid: next ID overflows uint64\")\n\t}\n\treturn next\n}\n\nconst maxID ID = 1\u003c\u003c64 - 1\n\n// TryNext increases i by 1 and returns its value.\n// It returns true if successful, or false if the increment would result in\n// an overflow.\nfunc (i *ID) TryNext() (ID, bool) {\n\tif *i == maxID {\n\t\t// Addition will overflow.\n\t\treturn 0, false\n\t}\n\t*i++\n\treturn *i, true\n}\n\n// Binary returns a big-endian binary representation of the ID,\n// suitable to be used as an AVL key.\nfunc (i ID) Binary() string {\n\tbuf := make([]byte, 8)\n\tbinary.BigEndian.PutUint64(buf, uint64(i))\n\treturn string(buf)\n}\n\n// String encodes i using cford32's compact encoding. For more information,\n// see the documentation for package [gno.land/p/demo/cford32].\n//\n// The result of String will be a 7-byte string for IDs [0,2^34), and a\n// 13-byte string for all values following that. All generated string IDs\n// follow the same lexicographic order as their number values; that is, for any\n// two IDs (x, y) such that x \u003c y, x.String() \u003c y.String().\n// As such, this string representation is suitable to be used as an AVL key.\nfunc (i ID) String() string {\n\treturn string(cford32.PutCompact(uint64(i)))\n}\n\n// FromBinary creates a new ID from the given string, expected to be a binary\n// big-endian encoding of an ID (such as that of [ID.Binary]).\n// The second return value is true if the conversion was successful.\nfunc FromBinary(b string) (ID, bool) {\n\tif len(b) != 8 {\n\t\treturn 0, false\n\t}\n\treturn ID(binary.BigEndian.Uint64([]byte(b))), true\n}\n\n// FromString creates a new ID from the given string, expected to be a string\n// representation using cford32, such as that returned by [ID.String].\n//\n// The encoding scheme used by cford32 allows the same ID to have many\n// different representations (though the one returned by [ID.String] is only\n// one, deterministic and safe to be used in AVL). The encoding scheme is\n// \"human-centric\" and is thus case insensitive, and maps some ambiguous\n// characters to be the same, ie. L = I = 1, O = 0. For this reason, when\n// parsing user input to retrieve a key (encoded as a string), always sanitize\n// it first using FromString, then run String(), instead of using the user's\n// input directly.\nfunc FromString(b string) (ID, error) {\n\tn, err := cford32.Uint64([]byte(b))\n\treturn ID(n), err\n}\n"},{"name":"seqid_test.gno","body":"package seqid\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n\t\"testing\"\n)\n\nfunc TestID(t *testing.T) {\n\tvar i ID\n\n\tfor j := 0; j \u003c 100; j++ {\n\t\ti.Next()\n\t}\n\tif i != 100 {\n\t\tt.Fatalf(\"invalid: wanted %d got %d\", 100, i)\n\t}\n}\n\nfunc TestID_Overflow(t *testing.T) {\n\ti := ID(maxID)\n\n\tdefer func() {\n\t\terr := recover()\n\t\tif !strings.Contains(fmt.Sprint(err), \"next ID overflows\") {\n\t\t\tt.Errorf(\"did not overflow\")\n\t\t}\n\t}()\n\n\ti.Next()\n}\n\nfunc TestID_Binary(t *testing.T) {\n\tvar i ID\n\tprev := i.Binary()\n\n\tfor j := 0; j \u003c 1000; j++ {\n\t\tcur := i.Next().Binary()\n\t\tif cur \u003c= prev {\n\t\t\tt.Fatalf(\"cur %x \u003e prev %x\", cur, prev)\n\t\t}\n\t\tprev = cur\n\t}\n}\n\nfunc TestID_String(t *testing.T) {\n\tvar i ID\n\tprev := i.String()\n\n\tfor j := 0; j \u003c 1000; j++ {\n\t\tcur := i.Next().String()\n\t\tif cur \u003c= prev {\n\t\t\tt.Fatalf(\"cur %s \u003e prev %s\", cur, prev)\n\t\t}\n\t\tprev = cur\n\t}\n\n\t// Test for when cford32 switches over to the long encoding.\n\ti = 1\u003c\u003c34 - 512\n\tfor j := 0; j \u003c 1024; j++ {\n\t\tcur := i.Next().String()\n\t\t// println(cur)\n\t\tif cur \u003c= prev {\n\t\t\tt.Fatalf(\"cur %s \u003e prev %s\", cur, prev)\n\t\t}\n\t\tprev = cur\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"memeland","path":"gno.land/p/demo/memeland","files":[{"name":"memeland.gno","body":"package memeland\n\nimport (\n\t\"sort\"\n\t\"std\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/ownable\"\n\t\"gno.land/p/demo/seqid\"\n)\n\nconst (\n\tDATE_CREATED = \"DATE_CREATED\"\n\tUPVOTES = \"UPVOTES\"\n)\n\ntype Post struct {\n\tID string\n\tData string\n\tAuthor std.Address\n\tTimestamp time.Time\n\tUpvoteTracker *avl.Tree // address \u003e struct{}{}\n}\n\ntype Memeland struct {\n\t*ownable.Ownable\n\tPosts []*Post\n\tMemeCounter seqid.ID\n}\n\nfunc NewMemeland() *Memeland {\n\treturn \u0026Memeland{\n\t\tOwnable: ownable.New(),\n\t\tPosts: make([]*Post, 0),\n\t}\n}\n\n// PostMeme - Adds a new post\nfunc (m *Memeland) PostMeme(data string, timestamp int64) string {\n\tif data == \"\" || timestamp \u003c= 0 {\n\t\tpanic(\"timestamp or data cannot be empty\")\n\t}\n\n\t// Generate ID\n\tid := m.MemeCounter.Next().String()\n\n\tnewPost := \u0026Post{\n\t\tID: id,\n\t\tData: data,\n\t\tAuthor: std.PrevRealm().Addr(),\n\t\tTimestamp: time.Unix(timestamp, 0),\n\t\tUpvoteTracker: avl.NewTree(),\n\t}\n\n\tm.Posts = append(m.Posts, newPost)\n\treturn id\n}\n\nfunc (m *Memeland) Upvote(id string) string {\n\tpost := m.getPost(id)\n\tif post == nil {\n\t\tpanic(\"post with specified ID does not exist\")\n\t}\n\n\tcaller := std.PrevRealm().Addr().String()\n\n\tif _, exists := post.UpvoteTracker.Get(caller); exists {\n\t\tpanic(\"user has already upvoted this post\")\n\t}\n\n\tpost.UpvoteTracker.Set(caller, struct{}{})\n\n\treturn \"upvote successful\"\n}\n\n// GetPostsInRange returns a JSON string of posts within the given timestamp range, supporting pagination\nfunc (m *Memeland) GetPostsInRange(startTimestamp, endTimestamp int64, page, pageSize int, sortBy string) string {\n\tif len(m.Posts) == 0 {\n\t\treturn \"[]\"\n\t}\n\n\tif page \u003c 1 {\n\t\tpanic(\"page number cannot be less than 1\")\n\t}\n\n\t// No empty pages\n\tif pageSize \u003c 1 {\n\t\tpanic(\"page size cannot be less than 1\")\n\t}\n\n\t// No pages larger than 10\n\tif pageSize \u003e 10 {\n\t\tpanic(\"page size cannot be larger than 10\")\n\t}\n\n\t// Need to pass in a sort parameter\n\tif sortBy == \"\" {\n\t\tpanic(\"sort order cannot be empty\")\n\t}\n\n\tvar filteredPosts []*Post\n\n\tstart := time.Unix(startTimestamp, 0)\n\tend := time.Unix(endTimestamp, 0)\n\n\t// Filtering posts\n\tfor _, p := range m.Posts {\n\t\tif !p.Timestamp.Before(start) \u0026\u0026 !p.Timestamp.After(end) {\n\t\t\tfilteredPosts = append(filteredPosts, p)\n\t\t}\n\t}\n\n\tswitch sortBy {\n\t// Sort by upvote descending\n\tcase UPVOTES:\n\t\tdateSorter := PostSorter{\n\t\t\tPosts: filteredPosts,\n\t\t\tLessF: func(i, j int) bool {\n\t\t\t\treturn filteredPosts[i].UpvoteTracker.Size() \u003e filteredPosts[j].UpvoteTracker.Size()\n\t\t\t},\n\t\t}\n\t\tsort.Sort(dateSorter)\n\tcase DATE_CREATED:\n\t\t// Sort by timestamp, beginning with newest\n\t\tdateSorter := PostSorter{\n\t\t\tPosts: filteredPosts,\n\t\t\tLessF: func(i, j int) bool {\n\t\t\t\treturn filteredPosts[i].Timestamp.After(filteredPosts[j].Timestamp)\n\t\t\t},\n\t\t}\n\t\tsort.Sort(dateSorter)\n\tdefault:\n\t\tpanic(\"sort order can only be \\\"UPVOTES\\\" or \\\"DATE_CREATED\\\"\")\n\t}\n\n\t// Pagination\n\tstartIndex := (page - 1) * pageSize\n\tendIndex := startIndex + pageSize\n\n\t// If page does not contain any posts\n\tif startIndex \u003e= len(filteredPosts) {\n\t\treturn \"[]\"\n\t}\n\n\t// If page contains fewer posts than the page size\n\tif endIndex \u003e len(filteredPosts) {\n\t\tendIndex = len(filteredPosts)\n\t}\n\n\t// Return JSON representation of paginated and sorted posts\n\treturn PostsToJSONString(filteredPosts[startIndex:endIndex])\n}\n\n// RemovePost allows the owner to remove a post with a specific ID\nfunc (m *Memeland) RemovePost(id string) string {\n\tif id == \"\" {\n\t\tpanic(\"id cannot be empty\")\n\t}\n\n\tif err := m.CallerIsOwner(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tfor i, post := range m.Posts {\n\t\tif post.ID == id {\n\t\t\tm.Posts = append(m.Posts[:i], m.Posts[i+1:]...)\n\t\t\treturn id\n\t\t}\n\t}\n\n\tpanic(\"post with specified id does not exist\")\n}\n\n// PostsToJSONString converts a slice of Post structs into a JSON string\nfunc PostsToJSONString(posts []*Post) string {\n\tvar sb strings.Builder\n\tsb.WriteString(\"[\")\n\n\tfor i, post := range posts {\n\t\tif i \u003e 0 {\n\t\t\tsb.WriteString(\",\")\n\t\t}\n\n\t\tsb.WriteString(PostToJSONString(post))\n\t}\n\tsb.WriteString(\"]\")\n\n\treturn sb.String()\n}\n\n// PostToJSONString returns a Post formatted as a JSON string\nfunc PostToJSONString(post *Post) string {\n\tvar sb strings.Builder\n\n\tsb.WriteString(\"{\")\n\tsb.WriteString(`\"id\":\"` + post.ID + `\",`)\n\tsb.WriteString(`\"data\":\"` + escapeString(post.Data) + `\",`)\n\tsb.WriteString(`\"author\":\"` + escapeString(post.Author.String()) + `\",`)\n\tsb.WriteString(`\"timestamp\":\"` + strconv.Itoa(int(post.Timestamp.Unix())) + `\",`)\n\tsb.WriteString(`\"upvotes\":` + strconv.Itoa(post.UpvoteTracker.Size()))\n\tsb.WriteString(\"}\")\n\n\treturn sb.String()\n}\n\n// escapeString escapes quotes in a string for JSON compatibility.\nfunc escapeString(s string) string {\n\treturn strings.ReplaceAll(s, `\"`, `\\\"`)\n}\n\nfunc (m *Memeland) getPost(id string) *Post {\n\tfor _, p := range m.Posts {\n\t\tif p.ID == id {\n\t\t\treturn p\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// PostSorter is a flexible sorter for the *Post slice\ntype PostSorter struct {\n\tPosts []*Post\n\tLessF func(i, j int) bool\n}\n\nfunc (p PostSorter) Len() int {\n\treturn len(p.Posts)\n}\n\nfunc (p PostSorter) Swap(i, j int) {\n\tp.Posts[i], p.Posts[j] = p.Posts[j], p.Posts[i]\n}\n\nfunc (p PostSorter) Less(i, j int) bool {\n\treturn p.LessF(i, j)\n}\n"},{"name":"memeland_test.gno","body":"package memeland\n\nimport (\n\t\"std\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/p/demo/uassert\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nfunc TestPostMeme(t *testing.T) {\n\tm := NewMemeland()\n\tid := m.PostMeme(\"Test meme data\", time.Now().Unix())\n\tuassert.NotEqual(t, \"\", string(id), \"Expected valid ID, got empty string\")\n}\n\nfunc TestGetPostsInRangePagination(t *testing.T) {\n\tm := NewMemeland()\n\tnow := time.Now()\n\n\tnumOfPosts := 5\n\tvar memeData []string\n\tfor i := 1; i \u003c= numOfPosts; i++ {\n\t\t// Prepare meme data\n\t\tnextTime := now.Add(time.Duration(i) * time.Minute)\n\t\tdata := ufmt.Sprintf(\"Meme #%d\", i)\n\t\tmemeData = append(memeData, data)\n\n\t\tm.PostMeme(data, nextTime.Unix())\n\t}\n\n\t// Get timestamps\n\tbeforeEarliest := now.Add(-1 * time.Minute)\n\tafterLatest := now.Add(time.Duration(numOfPosts)*time.Minute + time.Minute)\n\n\ttestCases := []struct {\n\t\tpage int\n\t\tpageSize int\n\t\texpectedNumOfPosts int\n\t}{\n\t\t{page: 1, pageSize: 1, expectedNumOfPosts: 1}, // one per page\n\t\t{page: 2, pageSize: 1, expectedNumOfPosts: 1}, // one on second page\n\t\t{page: 1, pageSize: numOfPosts, expectedNumOfPosts: numOfPosts}, // all posts on single page\n\t\t{page: 12, pageSize: 1, expectedNumOfPosts: 0}, // empty page\n\t\t{page: 1, pageSize: numOfPosts + 1, expectedNumOfPosts: numOfPosts}, // page with fewer posts than its size\n\t\t{page: 5, pageSize: numOfPosts / 5, expectedNumOfPosts: 1}, // evenly distribute posts per page\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(ufmt.Sprintf(\"Page%d_Size%d\", tc.page, tc.pageSize), func(t *testing.T) {\n\t\t\tresult := m.GetPostsInRange(beforeEarliest.Unix(), afterLatest.Unix(), tc.page, tc.pageSize, \"DATE_CREATED\")\n\n\t\t\t// Count posts by how many times id: shows up in JSON string\n\t\t\tpostCount := strings.Count(result, `\"id\":\"`)\n\t\t\tuassert.Equal(t, tc.expectedNumOfPosts, postCount)\n\t\t})\n\t}\n}\n\nfunc TestGetPostsInRangeByTimestamp(t *testing.T) {\n\tm := NewMemeland()\n\tnow := time.Now()\n\n\tnumOfPosts := 5\n\tvar memeData []string\n\tfor i := 1; i \u003c= numOfPosts; i++ {\n\t\t// Prepare meme data\n\t\tnextTime := now.Add(time.Duration(i) * time.Minute)\n\t\tdata := ufmt.Sprintf(\"Meme #%d\", i)\n\t\tmemeData = append(memeData, data)\n\n\t\tm.PostMeme(data, nextTime.Unix())\n\t}\n\n\t// Get timestamps\n\tbeforeEarliest := now.Add(-1 * time.Minute)\n\tafterLatest := now.Add(time.Duration(numOfPosts)*time.Minute + time.Minute)\n\n\t// Default sort is by addition order/timestamp\n\tjsonStr := m.GetPostsInRange(\n\t\tbeforeEarliest.Unix(), // start at earliest post\n\t\tafterLatest.Unix(), // end at latest post\n\t\t1, // first page\n\t\tnumOfPosts, // all memes on the page\n\t\t\"DATE_CREATED\", // sort by newest first\n\t)\n\n\tuassert.NotEmpty(t, jsonStr, \"Expected non-empty JSON string, got empty string\")\n\n\t// Count the number of posts returned in the JSON string as a rudimentary check for correct pagination/filtering\n\tpostCount := strings.Count(jsonStr, `\"id\":\"`)\n\tuassert.Equal(t, uint64(m.MemeCounter), uint64(postCount))\n\n\t// Check if data is there\n\tfor _, expData := range memeData {\n\t\tcheck := strings.Contains(jsonStr, expData)\n\t\tuassert.True(t, check, ufmt.Sprintf(\"Expected %s in the JSON string, but counld't find it\", expData))\n\t}\n\n\t// Check if ordering is correct, sort by created date\n\tfor i := 0; i \u003c len(memeData)-2; i++ {\n\t\tcheck := strings.Index(jsonStr, memeData[i]) \u003e= strings.Index(jsonStr, memeData[i+1])\n\t\tuassert.True(t, check, ufmt.Sprintf(\"Expected %s to be before %s, but was at %d, and %d\", memeData[i], memeData[i+1], i, i+1))\n\t}\n}\n\nfunc TestGetPostsInRangeByUpvote(t *testing.T) {\n\tm := NewMemeland()\n\tnow := time.Now()\n\n\tmemeData1 := \"Meme #1\"\n\tmemeData2 := \"Meme #2\"\n\n\t// Create posts at specific times for testing\n\tid1 := m.PostMeme(memeData1, now.Unix())\n\tid2 := m.PostMeme(memeData2, now.Add(time.Minute).Unix())\n\n\tm.Upvote(id1)\n\tm.Upvote(id2)\n\n\t// Change caller so avoid double upvote panic\n\tstd.TestSetOrigCaller(testutils.TestAddress(\"alice\"))\n\tm.Upvote(id1)\n\n\t// Final upvote count:\n\t// Meme #1 - 2 upvote\n\t// Meme #2 - 1 upvotes\n\n\t// Get timestamps\n\tbeforeEarliest := now.Add(-time.Minute)\n\tafterLatest := now.Add(time.Hour)\n\n\t// Default sort is by addition order/timestamp\n\tjsonStr := m.GetPostsInRange(\n\t\tbeforeEarliest.Unix(), // start at earliest post\n\t\tafterLatest.Unix(), // end at latest post\n\t\t1, // first page\n\t\t2, // all memes on the page\n\t\t\"UPVOTES\", // sort by upvote\n\t)\n\n\tuassert.NotEmpty(t, jsonStr, \"Expected non-empty JSON string, got empty string\")\n\n\t// Count the number of posts returned in the JSON string as a rudimentary check for correct pagination/filtering\n\tpostCount := strings.Count(jsonStr, `\"id\":\"`)\n\tuassert.Equal(t, uint64(m.MemeCounter), uint64(postCount))\n\n\t// Check if ordering is correct\n\tcheck := strings.Index(jsonStr, \"Meme #1\") \u003c= strings.Index(jsonStr, \"Meme #2\")\n\tuassert.True(t, check, ufmt.Sprintf(\"Expected %s to be before %s\", memeData1, memeData2))\n}\n\nfunc TestBadSortBy(t *testing.T) {\n\tm := NewMemeland()\n\tnow := time.Now()\n\n\tnumOfPosts := 5\n\tvar memeData []string\n\tfor i := 1; i \u003c= numOfPosts; i++ {\n\t\t// Prepare meme data\n\t\tnextTime := now.Add(time.Duration(i) * time.Minute)\n\t\tdata := ufmt.Sprintf(\"Meme #%d\", i)\n\t\tmemeData = append(memeData, data)\n\n\t\tm.PostMeme(data, nextTime.Unix())\n\t}\n\n\t// Get timestamps\n\tbeforeEarliest := now.Add(-1 * time.Minute)\n\tafterLatest := now.Add(time.Duration(numOfPosts)*time.Minute + time.Minute)\n\n\ttests := []struct {\n\t\tname string\n\t\tsortBy string\n\t\twantPanic string\n\t}{\n\t\t{\n\t\t\tname: \"Empty sortBy\",\n\t\t\tsortBy: \"\",\n\t\t\twantPanic: \"runtime error: index out of range\",\n\t\t},\n\t\t{\n\t\t\tname: \"Wrong sortBy\",\n\t\t\tsortBy: \"random string\",\n\t\t\twantPanic: \"\",\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tdefer func() {\n\t\t\t\tif r := recover(); r == nil {\n\t\t\t\t\tt.Errorf(\"code did not panic when it should have\")\n\t\t\t\t}\n\t\t\t}()\n\n\t\t\t// Panics should be caught\n\t\t\t_ = m.GetPostsInRange(beforeEarliest.Unix(), afterLatest.Unix(), 1, 1, tc.sortBy)\n\t\t})\n\t}\n}\n\nfunc TestNoPosts(t *testing.T) {\n\tm := NewMemeland()\n\n\t// Add a post to Memeland\n\tnow := time.Now().Unix()\n\n\tjsonStr := m.GetPostsInRange(0, now, 1, 1, \"DATE_CREATED\")\n\n\tuassert.Equal(t, jsonStr, \"[]\")\n}\n\nfunc TestUpvote(t *testing.T) {\n\tm := NewMemeland()\n\n\t// Add a post to Memeland\n\tnow := time.Now().Unix()\n\tpostID := m.PostMeme(\"Test meme data\", now)\n\n\t// Initial upvote count should be 0\n\tpost := m.getPost(postID)\n\tuassert.Equal(t, 0, post.UpvoteTracker.Size())\n\n\t// Upvote the post\n\tupvoteResult := m.Upvote(postID)\n\tuassert.Equal(t, \"upvote successful\", upvoteResult)\n\n\t// Retrieve the post again and check the upvote count\n\tpost = m.getPost(postID)\n\tuassert.Equal(t, 1, post.UpvoteTracker.Size())\n}\n\nfunc TestDelete(t *testing.T) {\n\talice := testutils.TestAddress(\"alice\")\n\tstd.TestSetOrigCaller(alice)\n\n\t// Alice is admin\n\tm := NewMemeland()\n\n\t// Set caller to Bob\n\tbob := testutils.TestAddress(\"bob\")\n\tstd.TestSetOrigCaller(bob)\n\n\t// Bob adds post to Memeland\n\tnow := time.Now()\n\tpostID := m.PostMeme(\"Meme #1\", now.Unix())\n\n\t// Alice removes Bob's post\n\tstd.TestSetOrigCaller(alice)\n\n\tid := m.RemovePost(postID)\n\tuassert.Equal(t, postID, id, \"post IDs not matching\")\n\tuassert.Equal(t, 0, len(m.Posts), \"there should be 0 posts after removing\")\n}\n\nfunc TestDeleteByNonAdmin(t *testing.T) {\n\talice := testutils.TestAddress(\"alice\")\n\tstd.TestSetOrigCaller(alice)\n\n\tm := NewMemeland()\n\n\t// Add a post to Memeland\n\tnow := time.Now()\n\tpostID := m.PostMeme(\"Meme #1\", now.Unix())\n\n\t// Bob will try to delete meme posted by Alice, which should fail\n\tbob := testutils.TestAddress(\"bob\")\n\tstd.TestSetOrigCaller(bob)\n\n\tdefer func() {\n\t\tif r := recover(); r == nil {\n\t\t\tt.Errorf(\"code did not panic when it should have\")\n\t\t}\n\t}()\n\n\t// Should panic - caught by defer\n\tm.RemovePost(postID)\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"merkle","path":"gno.land/p/demo/merkle","files":[{"name":"README.md","body":"# p/demo/merkle\n\nThis package implement a merkle tree that is complient with [merkletreejs](https://github.com/merkletreejs/merkletreejs)\n\n## [merkletreejs](https://github.com/merkletreejs/merkletreejs)\n\n```javascript\nconst { MerkleTree } = require(\"merkletreejs\");\nconst SHA256 = require(\"crypto-js/sha256\");\n\nlet leaves = [];\nfor (let i = 0; i \u003c 10; i++) {\n leaves.push(SHA256(`node_${i}`));\n}\n\nconst tree = new MerkleTree(leaves, SHA256);\nconst root = tree.getRoot().toString(\"hex\");\n\nconsole.log(root); // cd8a40502b0b92bf58e7432a5abb2d8b60121cf2b7966d6ebaf103f907a1bc21\n```\n"},{"name":"merkle.gno","body":"package merkle\n\nimport (\n\t\"bytes\"\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"errors\"\n)\n\ntype Hashable interface {\n\tBytes() []byte\n}\n\ntype nodes []Node\n\ntype Node struct {\n\thash []byte\n\n\tposition uint8\n}\n\nfunc NewNode(hash []byte, position uint8) Node {\n\treturn Node{\n\t\thash: hash,\n\t\tposition: position,\n\t}\n}\n\nfunc (n Node) Position() uint8 {\n\treturn n.position\n}\n\nfunc (n Node) Hash() string {\n\treturn hex.EncodeToString(n.hash[:])\n}\n\ntype Tree struct {\n\tlayers []nodes\n}\n\n// Root return the merkle root of the tree\nfunc (t *Tree) Root() string {\n\tfor _, l := range t.layers {\n\t\tif len(l) == 1 {\n\t\t\treturn l[0].Hash()\n\t\t}\n\t}\n\treturn \"\"\n}\n\n// NewTree create a new Merkle Tree\nfunc NewTree(data []Hashable) *Tree {\n\ttree := \u0026Tree{}\n\n\tleaves := make([]Node, len(data))\n\n\tfor i, d := range data {\n\t\thash := sha256.Sum256(d.Bytes())\n\t\tleaves[i] = Node{hash: hash[:]}\n\t}\n\n\ttree.layers = []nodes{nodes(leaves)}\n\n\tvar buff bytes.Buffer\n\tfor len(leaves) \u003e 1 {\n\t\tlevel := make([]Node, 0, len(leaves)/2+1)\n\t\tfor i := 0; i \u003c len(leaves); i += 2 {\n\t\t\tbuff.Reset()\n\n\t\t\tif i \u003c len(leaves)-1 {\n\t\t\t\tbuff.Write(leaves[i].hash)\n\t\t\t\tbuff.Write(leaves[i+1].hash)\n\t\t\t\thash := sha256.Sum256(buff.Bytes())\n\t\t\t\tlevel = append(level, Node{\n\t\t\t\t\thash: hash[:],\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tlevel = append(level, leaves[i])\n\t\t\t}\n\t\t}\n\t\tleaves = level\n\t\ttree.layers = append(tree.layers, level)\n\t}\n\treturn tree\n}\n\n// Proof return a MerkleProof\nfunc (t *Tree) Proof(data Hashable) ([]Node, error) {\n\ttargetHash := sha256.Sum256(data.Bytes())\n\ttargetIndex := -1\n\n\tfor i, layer := range t.layers[0] {\n\t\tif bytes.Equal(targetHash[:], layer.hash) {\n\t\t\ttargetIndex = i\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif targetIndex == -1 {\n\t\treturn nil, errors.New(\"target not found\")\n\t}\n\n\tproofs := make([]Node, 0, len(t.layers))\n\n\tfor _, layer := range t.layers {\n\t\tvar pairIndex int\n\n\t\tif targetIndex%2 == 0 {\n\t\t\tpairIndex = targetIndex + 1\n\t\t} else {\n\t\t\tpairIndex = targetIndex - 1\n\t\t}\n\t\tif pairIndex \u003c len(layer) {\n\t\t\tproofs = append(proofs, Node{\n\t\t\t\thash: layer[pairIndex].hash,\n\t\t\t\tposition: uint8(targetIndex) % 2,\n\t\t\t})\n\t\t}\n\t\ttargetIndex /= 2\n\t}\n\treturn proofs, nil\n}\n\n// Verify if a merkle proof is valid\nfunc (t *Tree) Verify(leaf Hashable, proofs []Node) bool {\n\treturn Verify(t.Root(), leaf, proofs)\n}\n\n// Verify if a merkle proof is valid\nfunc Verify(root string, leaf Hashable, proofs []Node) bool {\n\thash := sha256.Sum256(leaf.Bytes())\n\n\tfor i := 0; i \u003c len(proofs); i += 1 {\n\t\tvar h []byte\n\t\tif proofs[i].position == 0 {\n\t\t\th = append(hash[:], proofs[i].hash...)\n\t\t} else {\n\t\t\th = append(proofs[i].hash, hash[:]...)\n\t\t}\n\t\thash = sha256.Sum256(h)\n\t}\n\treturn hex.EncodeToString(hash[:]) == root\n}\n"},{"name":"merkle_test.gno","body":"package merkle\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n)\n\ntype testData struct {\n\tcontent string\n}\n\nfunc (d testData) Bytes() []byte {\n\treturn []byte(d.content)\n}\n\nfunc TestMerkleTree(t *testing.T) {\n\ttests := []struct {\n\t\tsize int\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tsize: 1,\n\t\t\texpected: \"cf9f824bce7f5bc63d557b23591f58577f53fe29f974a615bdddbd0140f912f4\",\n\t\t},\n\t\t{\n\t\t\tsize: 3,\n\t\t\texpected: \"1a4a5f0fa267244bf9f74a63fdf2a87eed5e97e4bd104a9e94728c8fb5442177\",\n\t\t},\n\t\t{\n\t\t\tsize: 10,\n\t\t\texpected: \"cd8a40502b0b92bf58e7432a5abb2d8b60121cf2b7966d6ebaf103f907a1bc21\",\n\t\t},\n\t\t{\n\t\t\tsize: 1000,\n\t\t\texpected: \"fa533d2efdf12be26bc410dfa42936ac63361324e35e9b1ff54d422a1dd2388b\",\n\t\t},\n\t}\n\n\tfor _, test := range tests {\n\t\tvar leaves []Hashable\n\t\tfor i := 0; i \u003c test.size; i++ {\n\t\t\tleaves = append(leaves, testData{fmt.Sprintf(\"node_%d\", i)})\n\t\t}\n\n\t\ttree := NewTree(leaves)\n\n\t\tif tree == nil {\n\t\t\tt.Error(\"Merkle tree creation failed\")\n\t\t}\n\n\t\troot := tree.Root()\n\n\t\tif root != test.expected {\n\t\t\tt.Fatalf(\"merkle.Tree.Root(), expected: %s; got: %s\", test.expected, root)\n\t\t}\n\n\t\tfor _, leaf := range leaves {\n\t\t\tproofs, err := tree.Proof(leaf)\n\t\t\tif err != nil {\n\t\t\t\tt.Fatal(\"failed to proof leaf: %v, on tree: %v\", leaf, test)\n\t\t\t}\n\n\t\t\tok := Verify(root, leaf, proofs)\n\t\t\tif !ok {\n\t\t\t\tt.Fatal(\"failed to verify leaf: %v, on tree: %v\", leaf, tree)\n\t\t\t}\n\t\t}\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"microblog","path":"gno.land/p/demo/microblog","files":[{"name":"microblog.gno","body":"package microblog\n\nimport (\n\t\"errors\"\n\t\"sort\"\n\t\"std\"\n\t\"strings\"\n\t\"time\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar (\n\tErrNotFound = errors.New(\"not found\")\n\tStatusNotFound = \"404\"\n)\n\ntype Microblog struct {\n\tTitle string\n\tPrefix string // i.e. r/gnoland/blog:\n\tPages avl.Tree // author (string) -\u003e Page\n}\n\nfunc NewMicroblog(title string, prefix string) (m *Microblog) {\n\treturn \u0026Microblog{\n\t\tTitle: title,\n\t\tPrefix: prefix,\n\t\tPages: avl.Tree{},\n\t}\n}\n\nfunc (m *Microblog) GetPages() []*Page {\n\tvar (\n\t\tpages = make([]*Page, m.Pages.Size())\n\t\tindex = 0\n\t)\n\n\tm.Pages.Iterate(\"\", \"\", func(key string, value interface{}) bool {\n\t\tpages[index] = value.(*Page)\n\t\tindex++\n\t\treturn false\n\t})\n\n\tsort.Sort(byLastPosted(pages))\n\n\treturn pages\n}\n\nfunc (m *Microblog) NewPost(text string) error {\n\tauthor := std.GetOrigCaller()\n\t_, found := m.Pages.Get(author.String())\n\tif !found {\n\t\t// make a new page for the new author\n\t\tm.Pages.Set(author.String(), \u0026Page{\n\t\t\tAuthor: author,\n\t\t\tCreatedAt: time.Now(),\n\t\t})\n\t}\n\n\tpage, err := m.GetPage(author.String())\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn page.NewPost(text)\n}\n\nfunc (m *Microblog) GetPage(author string) (*Page, error) {\n\tsilo, found := m.Pages.Get(author)\n\tif !found {\n\t\treturn nil, ErrNotFound\n\t}\n\treturn silo.(*Page), nil\n}\n\ntype Page struct {\n\tID int\n\tAuthor std.Address\n\tCreatedAt time.Time\n\tLastPosted time.Time\n\tPosts avl.Tree // time -\u003e Post\n}\n\n// byLastPosted implements sort.Interface for []Page based on\n// the LastPosted field.\ntype byLastPosted []*Page\n\nfunc (a byLastPosted) Len() int { return len(a) }\nfunc (a byLastPosted) Swap(i, j int) { a[i], a[j] = a[j], a[i] }\nfunc (a byLastPosted) Less(i, j int) bool { return a[i].LastPosted.After(a[j].LastPosted) }\n\nfunc (p *Page) NewPost(text string) error {\n\tnow := time.Now()\n\tp.LastPosted = now\n\tp.Posts.Set(ufmt.Sprintf(\"%s%d\", now.Format(time.RFC3339), p.Posts.Size()), \u0026Post{\n\t\tID: p.Posts.Size(),\n\t\tText: text,\n\t\tCreatedAt: now,\n\t})\n\treturn nil\n}\n\nfunc (p *Page) GetPosts() []*Post {\n\tposts := make([]*Post, p.Posts.Size())\n\ti := 0\n\tp.Posts.ReverseIterate(\"\", \"\", func(key string, value interface{}) bool {\n\t\tpostParsed := value.(*Post)\n\t\tposts[i] = postParsed\n\t\ti++\n\t\treturn false\n\t})\n\treturn posts\n}\n\n// Post lists the specific update\ntype Post struct {\n\tID int\n\tCreatedAt time.Time\n\tText string\n}\n\nfunc (p *Post) String() string {\n\treturn \"\u003e \" + strings.ReplaceAll(p.Text, \"\\n\", \"\\n\u003e\\n\u003e\") + \"\\n\u003e\\n\u003e *\" + p.CreatedAt.Format(time.RFC1123) + \"*\"\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"nestedpkg","path":"gno.land/p/demo/nestedpkg","files":[{"name":"nestedpkg.gno","body":"// Package nestedpkg provides helpers for package-path based access control.\n// It is useful for upgrade patterns relying on namespaces.\npackage nestedpkg\n\n// To test this from a realm and have std.CurrentRealm/PrevRealm work correctly,\n// this file is tested from gno.land/r/demo/tests/nestedpkg_test.gno\n// XXX: move test to ths directory once we support testing a package and\n// specifying values for both PrevRealm and CurrentRealm.\n\nimport (\n\t\"std\"\n\t\"strings\"\n)\n\n// IsCallerSubPath checks if the caller realm is located in a subfolder of the current realm.\nfunc IsCallerSubPath() bool {\n\tvar (\n\t\tcur = std.CurrentRealm().PkgPath() + \"/\"\n\t\tprev = std.PrevRealm().PkgPath() + \"/\"\n\t)\n\treturn strings.HasPrefix(prev, cur)\n}\n\n// AssertCallerIsSubPath panics if IsCallerSubPath returns false.\nfunc AssertCallerIsSubPath() {\n\tvar (\n\t\tcur = std.CurrentRealm().PkgPath() + \"/\"\n\t\tprev = std.PrevRealm().PkgPath() + \"/\"\n\t)\n\tif !strings.HasPrefix(prev, cur) {\n\t\tpanic(\"call restricted to nested packages. current realm is \" + cur + \", previous realm is \" + prev)\n\t}\n}\n\n// IsCallerParentPath checks if the caller realm is located in a parent location of the current realm.\nfunc IsCallerParentPath() bool {\n\tvar (\n\t\tcur = std.CurrentRealm().PkgPath() + \"/\"\n\t\tprev = std.PrevRealm().PkgPath() + \"/\"\n\t)\n\treturn strings.HasPrefix(cur, prev)\n}\n\n// AssertCallerIsParentPath panics if IsCallerParentPath returns false.\nfunc AssertCallerIsParentPath() {\n\tvar (\n\t\tcur = std.CurrentRealm().PkgPath() + \"/\"\n\t\tprev = std.PrevRealm().PkgPath() + \"/\"\n\t)\n\tif !strings.HasPrefix(cur, prev) {\n\t\tpanic(\"call restricted to parent packages. current realm is \" + cur + \", previous realm is \" + prev)\n\t}\n}\n\n// IsSameNamespace checks if the caller realm and the current realm are in the same namespace.\nfunc IsSameNamespace() bool {\n\tvar (\n\t\tcur = nsFromPath(std.CurrentRealm().PkgPath()) + \"/\"\n\t\tprev = nsFromPath(std.PrevRealm().PkgPath()) + \"/\"\n\t)\n\treturn cur == prev\n}\n\n// AssertIsSameNamespace panics if IsSameNamespace returns false.\nfunc AssertIsSameNamespace() {\n\tvar (\n\t\tcur = nsFromPath(std.CurrentRealm().PkgPath()) + \"/\"\n\t\tprev = nsFromPath(std.PrevRealm().PkgPath()) + \"/\"\n\t)\n\tif cur != prev {\n\t\tpanic(\"call restricted to packages from the same namespace. current realm is \" + cur + \", previous realm is \" + prev)\n\t}\n}\n\n// nsFromPath extracts the namespace from a package path.\nfunc nsFromPath(pkgpath string) string {\n\tparts := strings.Split(pkgpath, \"/\")\n\n\t// Specifically for gno.land, potential paths are in the form of DOMAIN/r/NAMESPACE/...\n\t// XXX: Consider extra checks.\n\t// XXX: Support non gno.land domains, where p/ and r/ won't be enforced.\n\tif len(parts) \u003e= 3 {\n\t\treturn parts[2]\n\t}\n\treturn \"\"\n}\n\n// XXX: Consider adding IsCallerDirectlySubPath\n// XXX: Consider adding IsCallerDirectlyParentPath\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"authorizable","path":"gno.land/p/demo/ownable/exts/authorizable","files":[{"name":"authorizable.gno","body":"// Package authorizable is an extension of p/demo/ownable;\n// It allows the user to instantiate an Authorizable struct, which extends\n// p/demo/ownable with a list of users that are authorized for something.\n// By using authorizable, you have a superuser (ownable), as well as another\n// authorization level, which can be used for adding moderators or similar to your realm.\npackage authorizable\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/ownable\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\ntype Authorizable struct {\n\t*ownable.Ownable // owner in ownable is superuser\n\tauthorized *avl.Tree // std.Addr \u003e struct{}{}\n}\n\nfunc NewAuthorizable() *Authorizable {\n\ta := \u0026Authorizable{\n\t\townable.New(),\n\t\tavl.NewTree(),\n\t}\n\n\t// Add owner to auth list\n\ta.authorized.Set(a.Owner().String(), struct{}{})\n\treturn a\n}\n\nfunc NewAuthorizableWithAddress(addr std.Address) *Authorizable {\n\ta := \u0026Authorizable{\n\t\townable.NewWithAddress(addr),\n\t\tavl.NewTree(),\n\t}\n\n\t// Add owner to auth list\n\ta.authorized.Set(a.Owner().String(), struct{}{})\n\treturn a\n}\n\nfunc (a *Authorizable) AddToAuthList(addr std.Address) error {\n\tif err := a.CallerIsOwner(); err != nil {\n\t\treturn ErrNotSuperuser\n\t}\n\n\tif _, exists := a.authorized.Get(addr.String()); exists {\n\t\treturn ErrAlreadyInList\n\t}\n\n\ta.authorized.Set(addr.String(), struct{}{})\n\n\treturn nil\n}\n\nfunc (a *Authorizable) DeleteFromAuthList(addr std.Address) error {\n\tif err := a.CallerIsOwner(); err != nil {\n\t\treturn ErrNotSuperuser\n\t}\n\n\tif !a.authorized.Has(addr.String()) {\n\t\treturn ErrNotInAuthList\n\t}\n\n\tif _, removed := a.authorized.Remove(addr.String()); !removed {\n\t\tstr := ufmt.Sprintf(\"authorizable: could not remove %s from auth list\", addr.String())\n\t\tpanic(str)\n\t}\n\n\treturn nil\n}\n\nfunc (a Authorizable) CallerOnAuthList() error {\n\tcaller := std.PrevRealm().Addr()\n\n\tif !a.authorized.Has(caller.String()) {\n\t\treturn ErrNotInAuthList\n\t}\n\n\treturn nil\n}\n\nfunc (a Authorizable) AssertOnAuthList() {\n\tcaller := std.PrevRealm().Addr()\n\n\tif !a.authorized.Has(caller.String()) {\n\t\tpanic(ErrNotInAuthList)\n\t}\n}\n"},{"name":"authorizable_test.gno","body":"package authorizable\n\nimport (\n\t\"std\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/p/demo/uassert\"\n)\n\nvar (\n\talice = testutils.TestAddress(\"alice\")\n\tbob = testutils.TestAddress(\"bob\")\n\tcharlie = testutils.TestAddress(\"charlie\")\n)\n\nfunc TestNewAuthorizable(t *testing.T) {\n\tstd.TestSetRealm(std.NewUserRealm(alice))\n\tstd.TestSetOrigCaller(alice) // TODO(bug, issue #2371): should not be needed\n\n\ta := NewAuthorizable()\n\tgot := a.Owner()\n\n\tif alice != got {\n\t\tt.Fatalf(\"Expected %s, got: %s\", alice, got)\n\t}\n}\n\nfunc TestNewAuthorizableWithAddress(t *testing.T) {\n\ta := NewAuthorizableWithAddress(alice)\n\n\tgot := a.Owner()\n\n\tif alice != got {\n\t\tt.Fatalf(\"Expected %s, got: %s\", alice, got)\n\t}\n}\n\nfunc TestCallerOnAuthList(t *testing.T) {\n\ta := NewAuthorizableWithAddress(alice)\n\tstd.TestSetRealm(std.NewUserRealm(alice))\n\tstd.TestSetOrigCaller(alice)\n\n\tif err := a.CallerOnAuthList(); err == ErrNotInAuthList {\n\t\tt.Fatalf(\"expected alice to be on the list\")\n\t}\n}\n\nfunc TestNotCallerOnAuthList(t *testing.T) {\n\ta := NewAuthorizableWithAddress(alice)\n\tstd.TestSetRealm(std.NewUserRealm(bob))\n\tstd.TestSetOrigCaller(bob)\n\n\tif err := a.CallerOnAuthList(); err == nil {\n\t\tt.Fatalf(\"expected bob to not be on the list\")\n\t}\n}\n\nfunc TestAddToAuthList(t *testing.T) {\n\ta := NewAuthorizableWithAddress(alice)\n\tstd.TestSetRealm(std.NewUserRealm(alice))\n\tstd.TestSetOrigCaller(alice)\n\n\tif err := a.AddToAuthList(bob); err != nil {\n\t\tt.Fatalf(\"Expected no error, got %v\", err)\n\t}\n\n\tstd.TestSetRealm(std.NewUserRealm(bob))\n\tstd.TestSetOrigCaller(bob)\n\n\tif err := a.AddToAuthList(bob); err == nil {\n\t\tt.Fatalf(\"Expected AddToAuth to error while bob called it, but it didn't\")\n\t}\n}\n\nfunc TestDeleteFromList(t *testing.T) {\n\ta := NewAuthorizableWithAddress(alice)\n\tstd.TestSetRealm(std.NewUserRealm(alice))\n\tstd.TestSetOrigCaller(alice)\n\n\tif err := a.AddToAuthList(bob); err != nil {\n\t\tt.Fatalf(\"Expected no error, got %v\", err)\n\t}\n\n\tif err := a.AddToAuthList(charlie); err != nil {\n\t\tt.Fatalf(\"Expected no error, got %v\", err)\n\t}\n\n\tstd.TestSetRealm(std.NewUserRealm(bob))\n\tstd.TestSetOrigCaller(bob)\n\n\t// Try an unauthorized deletion\n\tif err := a.DeleteFromAuthList(alice); err == nil {\n\t\tt.Fatalf(\"Expected DelFromAuth to error with %v\", err)\n\t}\n\n\tstd.TestSetRealm(std.NewUserRealm(alice))\n\tstd.TestSetOrigCaller(alice)\n\n\tif err := a.DeleteFromAuthList(charlie); err != nil {\n\t\tt.Fatalf(\"Expected no error, got %v\", err)\n\t}\n}\n\nfunc TestAssertOnList(t *testing.T) {\n\tstd.TestSetRealm(std.NewUserRealm(alice))\n\tstd.TestSetOrigCaller(alice)\n\ta := NewAuthorizableWithAddress(alice)\n\n\tstd.TestSetRealm(std.NewUserRealm(bob))\n\tstd.TestSetOrigCaller(bob)\n\n\tuassert.PanicsWithMessage(t, ErrNotInAuthList.Error(), func() {\n\t\ta.AssertOnAuthList()\n\t})\n}\n"},{"name":"errors.gno","body":"package authorizable\n\nimport \"errors\"\n\nvar (\n\tErrNotInAuthList = errors.New(\"authorizable: caller is not in authorized list\")\n\tErrNotSuperuser = errors.New(\"authorizable: caller is not superuser\")\n\tErrAlreadyInList = errors.New(\"authorizable: address is already in authorized list\")\n)\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"pausable","path":"gno.land/p/demo/pausable","files":[{"name":"pausable.gno","body":"package pausable\n\nimport \"gno.land/p/demo/ownable\"\n\ntype Pausable struct {\n\t*ownable.Ownable\n\tpaused bool\n}\n\n// New returns a new Pausable struct with non-paused state as default\nfunc New() *Pausable {\n\treturn \u0026Pausable{\n\t\tOwnable: ownable.New(),\n\t\tpaused: false,\n\t}\n}\n\n// NewFromOwnable is the same as New, but with a pre-existing top-level ownable\nfunc NewFromOwnable(ownable *ownable.Ownable) *Pausable {\n\treturn \u0026Pausable{\n\t\tOwnable: ownable,\n\t\tpaused: false,\n\t}\n}\n\n// IsPaused checks if Pausable is paused\nfunc (p Pausable) IsPaused() bool {\n\treturn p.paused\n}\n\n// Pause sets the state of Pausable to true, meaning all pausable functions are paused\nfunc (p *Pausable) Pause() error {\n\tif err := p.CallerIsOwner(); err != nil {\n\t\treturn err\n\t}\n\n\tp.paused = true\n\treturn nil\n}\n\n// Unpause sets the state of Pausable to false, meaning all pausable functions are resumed\nfunc (p *Pausable) Unpause() error {\n\tif err := p.CallerIsOwner(); err != nil {\n\t\treturn err\n\t}\n\n\tp.paused = false\n\treturn nil\n}\n"},{"name":"pausable_test.gno","body":"package pausable\n\nimport (\n\t\"std\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/ownable\"\n\t\"gno.land/p/demo/urequire\"\n)\n\nvar (\n\tfirstCaller = std.Address(\"g1l9aypkr8xfvs82zeux486ddzec88ty69lue9de\")\n\tsecondCaller = std.Address(\"g127jydsh6cms3lrtdenydxsckh23a8d6emqcvfa\")\n)\n\nfunc TestNew(t *testing.T) {\n\tstd.TestSetOrigCaller(firstCaller)\n\n\tresult := New()\n\n\turequire.False(t, result.paused, \"Expected result to be unpaused\")\n\turequire.Equal(t, firstCaller.String(), result.Owner().String())\n}\n\nfunc TestNewFromOwnable(t *testing.T) {\n\tstd.TestSetOrigCaller(firstCaller)\n\to := ownable.New()\n\n\tstd.TestSetOrigCaller(secondCaller)\n\tresult := NewFromOwnable(o)\n\n\turequire.Equal(t, firstCaller.String(), result.Owner().String())\n}\n\nfunc TestSetUnpaused(t *testing.T) {\n\tstd.TestSetOrigCaller(firstCaller)\n\n\tresult := New()\n\tresult.Unpause()\n\n\turequire.False(t, result.IsPaused(), \"Expected result to be unpaused\")\n}\n\nfunc TestSetPaused(t *testing.T) {\n\tstd.TestSetOrigCaller(firstCaller)\n\n\tresult := New()\n\tresult.Pause()\n\n\turequire.True(t, result.IsPaused(), \"Expected result to be paused\")\n}\n\nfunc TestIsPaused(t *testing.T) {\n\tstd.TestSetOrigCaller(firstCaller)\n\n\tresult := New()\n\turequire.False(t, result.IsPaused(), \"Expected result to be unpaused\")\n\n\tresult.Pause()\n\turequire.True(t, result.IsPaused(), \"Expected result to be paused\")\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"releases","path":"gno.land/p/demo/releases","files":[{"name":"changelog.gno","body":"package releases\n\ntype changelog struct {\n\tname string\n\treleases []release\n}\n\nfunc NewChangelog(name string) *changelog {\n\treturn \u0026changelog{\n\t\tname: name,\n\t\treleases: make([]release, 0),\n\t}\n}\n\nfunc (c *changelog) NewRelease(version, url, notes string) {\n\tif latest := c.Latest(); latest != nil {\n\t\tlatest.isLatest = false\n\t}\n\n\trelease := release{\n\t\t// manual\n\t\tversion: version,\n\t\turl: url,\n\t\tnotes: notes,\n\n\t\t// internal\n\t\tchangelog: c,\n\t\tisLatest: true,\n\t}\n\n\tc.releases = append(c.releases, release)\n}\n\nfunc (c *changelog) Render(path string) string {\n\tif path == \"\" {\n\t\toutput := \"# \" + c.name + \"\\n\\n\"\n\t\tmax := len(c.releases) - 1\n\t\tmin := 0\n\t\tif max-min \u003e 10 {\n\t\t\tmin = max - 10\n\t\t}\n\t\tfor i := max; i \u003e= min; i-- {\n\t\t\trelease := c.releases[i]\n\t\t\toutput += release.Render()\n\t\t}\n\t\treturn output\n\t}\n\n\trelease := c.ByVersion(path)\n\tif release != nil {\n\t\treturn release.Render()\n\t}\n\n\treturn \"no such release\"\n}\n\nfunc (c *changelog) Latest() *release {\n\tif len(c.releases) \u003e 0 {\n\t\tpos := len(c.releases) - 1\n\t\treturn \u0026c.releases[pos]\n\t}\n\treturn nil\n}\n\nfunc (c *changelog) ByVersion(version string) *release {\n\tfor _, release := range c.releases {\n\t\tif release.version == version {\n\t\t\treturn \u0026release\n\t\t}\n\t}\n\treturn nil\n}\n"},{"name":"release.gno","body":"package releases\n\ntype release struct {\n\t// manual\n\tversion string\n\turl string\n\tnotes string\n\n\t// internal\n\tisLatest bool\n\tchangelog *changelog\n}\n\nfunc (r *release) URL() string { return r.url }\nfunc (r *release) Version() string { return r.version }\nfunc (r *release) Notes() string { return r.notes }\nfunc (r *release) IsLatest() bool { return r.isLatest }\n\nfunc (r *release) Title() string {\n\toutput := r.changelog.name + \" \" + r.version\n\tif r.isLatest {\n\t\toutput += \" (latest)\"\n\t}\n\treturn output\n}\n\nfunc (r *release) Link() string {\n\treturn \"[\" + r.Title() + \"](\" + r.url + \")\"\n}\n\nfunc (r *release) Render() string {\n\toutput := \"\"\n\toutput += \"## \" + r.Link() + \"\\n\\n\"\n\tif r.notes != \"\" {\n\t\toutput += r.notes + \"\\n\\n\"\n\t}\n\treturn output\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"stack","path":"gno.land/p/demo/stack","files":[{"name":"stack.gno","body":"package stack\n\ntype Stack struct {\n\ttop *node\n\tlength int\n}\n\ntype node struct {\n\tvalue interface{}\n\tprev *node\n}\n\nfunc New() *Stack {\n\treturn \u0026Stack{nil, 0}\n}\n\nfunc (s *Stack) Len() int {\n\treturn s.length\n}\n\nfunc (s *Stack) Top() interface{} {\n\tif s.length == 0 {\n\t\treturn nil\n\t}\n\treturn s.top.value\n}\n\nfunc (s *Stack) Pop() interface{} {\n\tif s.length == 0 {\n\t\treturn nil\n\t}\n\n\tnode := s.top\n\ts.top = node.prev\n\ts.length -= 1\n\treturn node.value\n}\n\nfunc (s *Stack) Push(value interface{}) {\n\tnode := \u0026node{value, s.top}\n\ts.top = node\n\ts.length += 1\n}\n"},{"name":"stack_test.gno","body":"package stack\n\nimport \"testing\"\n\nfunc TestStack(t *testing.T) {\n\ts := New() // Empty stack\n\n\tif s.Len() != 0 {\n\t\tt.Errorf(\"s.Len(): expected 0; got %d\", s.Len())\n\t}\n\n\ts.Push(1)\n\n\tif s.Len() != 1 {\n\t\tt.Errorf(\"s.Len(): expected 1; got %d\", s.Len())\n\t}\n\n\tif top := s.Top(); top.(int) != 1 {\n\t\tt.Errorf(\"s.Top(): expected 1; got %v\", top.(int))\n\t}\n\n\tif elem := s.Pop(); elem.(int) != 1 {\n\t\tt.Errorf(\"s.Pop(): expected 1; got %v\", elem.(int))\n\t}\n\tif s.Len() != 0 {\n\t\tt.Errorf(\"s.Len(): expected 0; got %d\", s.Len())\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"subscription","path":"gno.land/p/demo/subscription","files":[{"name":"doc.gno","body":"// Package subscription provides a flexible system for managing both recurring and\n// lifetime subscriptions in Gno applications. It enables developers to handle\n// payment-based access control for services or products. The library supports\n// both subscriptions requiring periodic payments (recurring) and one-time payments\n// (lifetime). Subscriptions are tracked using an AVL tree for efficient management\n// of subscription statuses.\n//\n// Usage:\n//\n// Import the required sub-packages (`recurring` and/or `lifetime`) to manage specific\n// subscription types. The methods provided allow users to subscribe, check subscription\n// status, and manage payments.\n//\n// Recurring Subscription:\n//\n// Recurring subscriptions require periodic payments to maintain access.\n// Users pay to extend their access for a specific duration.\n//\n// Example:\n//\n//\t// Create a recurring subscription requiring 100 ugnot every 30 days\n//\trecSub := recurring.NewRecurringSubscription(time.Hour * 24 * 30, 100)\n//\n//\t// Process payment for the recurring subscription\n//\trecSub.Subscribe()\n//\n//\t// Gift a recurring subscription to another user\n//\trecSub.GiftSubscription(recipientAddress)\n//\n//\t// Check if a user has a valid subscription\n//\trecSub.HasValidSubscription(addr)\n//\n//\t// Get the expiration date of the subscription\n//\trecSub.GetExpiration(caller)\n//\n//\t// Update the subscription amount to 200 ugnot\n//\trecSub.UpdateAmount(200)\n//\n//\t// Get the current subscription amount\n//\trecSub.GetAmount()\n//\n// Lifetime Subscription:\n//\n// Lifetime subscriptions require a one-time payment for permanent access.\n// Once paid, users have indefinite access without further payments.\n//\n// Example:\n//\n//\t// Create a lifetime subscription costing 500 ugnot\n//\tlifeSub := lifetime.NewLifetimeSubscription(500)\n//\n//\t// Process payment for lifetime access\n//\tlifeSub.Subscribe()\n//\n//\t// Gift a lifetime subscription to another user\n//\tlifeSub.GiftSubscription(recipientAddress)\n//\n//\t// Check if a user has a valid subscription\n//\tlifeSub.HasValidSubscription(addr)\n//\n//\t// Update the lifetime subscription amount to 1000 ugnot\n//\tlifeSub.UpdateAmount(1000)\n//\n//\t// Get the current lifetime subscription amount\n//\tlifeSub.GetAmount()\npackage subscription\n"},{"name":"subscription.gno","body":"package subscription\n\nimport (\n\t\"std\"\n)\n\n// Subscription interface defines standard methods that all subscription types must implement.\ntype Subscription interface {\n\tHasValidSubscription(std.Address) error\n\tSubscribe() error\n\tUpdateAmount(newAmount int64) error\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"lifetime","path":"gno.land/p/demo/subscription/lifetime","files":[{"name":"errors.gno","body":"package lifetime\n\nimport \"errors\"\n\nvar (\n\tErrNoSub = errors.New(\"lifetime subscription: no active subscription found\")\n\tErrAmt = errors.New(\"lifetime subscription: payment amount does not match the required subscription amount\")\n\tErrAlreadySub = errors.New(\"lifetime subscription: this address already has an active lifetime subscription\")\n\tErrNotAuthorized = errors.New(\"lifetime subscription: action not authorized\")\n)\n"},{"name":"lifetime.gno","body":"package lifetime\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/ownable\"\n)\n\n// LifetimeSubscription represents a subscription that requires only a one-time payment.\n// It grants permanent access to a service or product.\ntype LifetimeSubscription struct {\n\townable.Ownable\n\tamount int64\n\tsubs *avl.Tree // std.Address -\u003e bool\n}\n\n// NewLifetimeSubscription creates and returns a new lifetime subscription.\nfunc NewLifetimeSubscription(amount int64) *LifetimeSubscription {\n\treturn \u0026LifetimeSubscription{\n\t\tOwnable: *ownable.New(),\n\t\tamount: amount,\n\t\tsubs: avl.NewTree(),\n\t}\n}\n\n// processSubscription handles the subscription process for a given receiver.\nfunc (ls *LifetimeSubscription) processSubscription(receiver std.Address) error {\n\tamount := std.GetOrigSend()\n\n\tif amount.AmountOf(\"ugnot\") != ls.amount {\n\t\treturn ErrAmt\n\t}\n\n\t_, exists := ls.subs.Get(receiver.String())\n\n\tif exists {\n\t\treturn ErrAlreadySub\n\t}\n\n\tls.subs.Set(receiver.String(), true)\n\n\treturn nil\n}\n\n// Subscribe processes the payment for a lifetime subscription.\nfunc (ls *LifetimeSubscription) Subscribe() error {\n\tcaller := std.PrevRealm().Addr()\n\treturn ls.processSubscription(caller)\n}\n\n// GiftSubscription allows the caller to pay for a lifetime subscription for another user.\nfunc (ls *LifetimeSubscription) GiftSubscription(receiver std.Address) error {\n\treturn ls.processSubscription(receiver)\n}\n\n// HasValidSubscription checks if the given address has an active lifetime subscription.\nfunc (ls *LifetimeSubscription) HasValidSubscription(addr std.Address) error {\n\t_, exists := ls.subs.Get(addr.String())\n\n\tif !exists {\n\t\treturn ErrNoSub\n\t}\n\n\treturn nil\n}\n\n// UpdateAmount allows the owner of the LifetimeSubscription contract to update the subscription price.\nfunc (ls *LifetimeSubscription) UpdateAmount(newAmount int64) error {\n\tif err := ls.CallerIsOwner(); err != nil {\n\t\treturn ErrNotAuthorized\n\t}\n\n\tls.amount = newAmount\n\treturn nil\n}\n\n// GetAmount returns the current subscription price.\nfunc (ls *LifetimeSubscription) GetAmount() int64 {\n\treturn ls.amount\n}\n"},{"name":"lifetime_test.gno","body":"package lifetime\n\nimport (\n\t\"std\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/p/demo/uassert\"\n)\n\nvar (\n\talice = testutils.TestAddress(\"alice\")\n\tbob = testutils.TestAddress(\"bob\")\n\tcharlie = testutils.TestAddress(\"charlie\")\n)\n\nfunc TestLifetimeSubscription(t *testing.T) {\n\tstd.TestSetRealm(std.NewUserRealm(alice))\n\tls := NewLifetimeSubscription(1000)\n\n\tstd.TestSetOrigSend([]std.Coin{{Denom: \"ugnot\", Amount: 1000}}, nil)\n\terr := ls.Subscribe()\n\tuassert.NoError(t, err, \"Expected ProcessPayment to succeed\")\n\n\terr = ls.HasValidSubscription(std.PrevRealm().Addr())\n\tuassert.NoError(t, err, \"Expected Alice to have access\")\n}\n\nfunc TestLifetimeSubscriptionGift(t *testing.T) {\n\tstd.TestSetRealm(std.NewUserRealm(alice))\n\tls := NewLifetimeSubscription(1000)\n\n\tstd.TestSetOrigSend([]std.Coin{{Denom: \"ugnot\", Amount: 1000}}, nil)\n\terr := ls.GiftSubscription(bob)\n\tuassert.NoError(t, err, \"Expected ProcessPaymentGift to succeed for Bob\")\n\n\terr = ls.HasValidSubscription(bob)\n\tuassert.NoError(t, err, \"Expected Bob to have access\")\n\n\terr = ls.HasValidSubscription(charlie)\n\tuassert.Error(t, err, \"Expected Charlie to fail access check\")\n}\n\nfunc TestUpdateAmountAuthorization(t *testing.T) {\n\tstd.TestSetRealm(std.NewUserRealm(alice))\n\tls := NewLifetimeSubscription(1000)\n\n\terr := ls.UpdateAmount(2000)\n\tuassert.NoError(t, err, \"Expected Alice to succeed in updating amount\")\n\n\tstd.TestSetOrigCaller(bob)\n\n\terr = ls.UpdateAmount(3000)\n\tuassert.Error(t, err, \"Expected Bob to fail when updating amount\")\n}\n\nfunc TestIncorrectPaymentAmount(t *testing.T) {\n\tstd.TestSetRealm(std.NewUserRealm(alice))\n\tls := NewLifetimeSubscription(1000)\n\n\tstd.TestSetOrigSend([]std.Coin{{Denom: \"ugnot\", Amount: 500}}, nil)\n\terr := ls.Subscribe()\n\tuassert.Error(t, err, \"Expected payment to fail with incorrect amount\")\n}\n\nfunc TestMultipleSubscriptionAttempts(t *testing.T) {\n\tstd.TestSetRealm(std.NewUserRealm(alice))\n\tls := NewLifetimeSubscription(1000)\n\n\tstd.TestSetOrigSend([]std.Coin{{Denom: \"ugnot\", Amount: 1000}}, nil)\n\terr := ls.Subscribe()\n\tuassert.NoError(t, err, \"Expected first subscription to succeed\")\n\n\tstd.TestSetOrigSend([]std.Coin{{Denom: \"ugnot\", Amount: 1000}}, nil)\n\terr = ls.Subscribe()\n\tuassert.Error(t, err, \"Expected second subscription to fail as Alice is already subscribed\")\n}\n\nfunc TestGiftSubscriptionWithIncorrectAmount(t *testing.T) {\n\tstd.TestSetRealm(std.NewUserRealm(alice))\n\tls := NewLifetimeSubscription(1000)\n\n\tstd.TestSetOrigSend([]std.Coin{{Denom: \"ugnot\", Amount: 500}}, nil)\n\terr := ls.GiftSubscription(bob)\n\tuassert.Error(t, err, \"Expected gift subscription to fail with incorrect amount\")\n\n\terr = ls.HasValidSubscription(bob)\n\tuassert.Error(t, err, \"Expected Bob to not have access after incorrect gift subscription\")\n}\n\nfunc TestUpdateAmountEffectiveness(t *testing.T) {\n\tstd.TestSetRealm(std.NewUserRealm(alice))\n\tls := NewLifetimeSubscription(1000)\n\n\terr := ls.UpdateAmount(2000)\n\tuassert.NoError(t, err, \"Expected Alice to succeed in updating amount\")\n\n\tstd.TestSetOrigSend([]std.Coin{{Denom: \"ugnot\", Amount: 1000}}, nil)\n\terr = ls.Subscribe()\n\tuassert.Error(t, err, \"Expected subscription to fail with old amount after update\")\n\n\tstd.TestSetOrigSend([]std.Coin{{Denom: \"ugnot\", Amount: 2000}}, nil)\n\terr = ls.Subscribe()\n\tuassert.NoError(t, err, \"Expected subscription to succeed with new amount\")\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"recurring","path":"gno.land/p/demo/subscription/recurring","files":[{"name":"errors.gno","body":"package recurring\n\nimport \"errors\"\n\nvar (\n\tErrNoSub = errors.New(\"recurring subscription: no active subscription found\")\n\tErrSubExpired = errors.New(\"recurring subscription: your subscription has expired\")\n\tErrAmt = errors.New(\"recurring subscription: payment amount does not match the required subscription amount\")\n\tErrAlreadySub = errors.New(\"recurring subscription: this address already has an active subscription\")\n\tErrNotAuthorized = errors.New(\"recurring subscription: action not authorized\")\n)\n"},{"name":"recurring.gno","body":"package recurring\n\nimport (\n\t\"std\"\n\t\"time\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/ownable\"\n)\n\n// RecurringSubscription represents a subscription that requires periodic payments.\n// It includes the duration of the subscription and the amount required per period.\ntype RecurringSubscription struct {\n\townable.Ownable\n\tduration time.Duration\n\tamount int64\n\tsubs *avl.Tree // std.Address -\u003e time.Time\n}\n\n// NewRecurringSubscription creates and returns a new recurring subscription.\nfunc NewRecurringSubscription(duration time.Duration, amount int64) *RecurringSubscription {\n\treturn \u0026RecurringSubscription{\n\t\tOwnable: *ownable.New(),\n\t\tduration: duration,\n\t\tamount: amount,\n\t\tsubs: avl.NewTree(),\n\t}\n}\n\n// HasValidSubscription verifies if the caller has an active recurring subscription.\nfunc (rs *RecurringSubscription) HasValidSubscription(addr std.Address) error {\n\texpTime, exists := rs.subs.Get(addr.String())\n\tif !exists {\n\t\treturn ErrNoSub\n\t}\n\n\tif time.Now().After(expTime.(time.Time)) {\n\t\treturn ErrSubExpired\n\t}\n\n\treturn nil\n}\n\n// processSubscription processes the payment for a given receiver and renews or adds their subscription.\nfunc (rs *RecurringSubscription) processSubscription(receiver std.Address) error {\n\tamount := std.GetOrigSend()\n\n\tif amount.AmountOf(\"ugnot\") != rs.amount {\n\t\treturn ErrAmt\n\t}\n\n\texpTime, exists := rs.subs.Get(receiver.String())\n\n\t// If the user is already a subscriber but his subscription has expired, authorize renewal\n\tif exists {\n\t\texpiration := expTime.(time.Time)\n\t\tif time.Now().Before(expiration) {\n\t\t\treturn ErrAlreadySub\n\t\t}\n\t}\n\n\t// Renew or add subscription\n\tnewExpiration := time.Now().Add(rs.duration)\n\trs.subs.Set(receiver.String(), newExpiration)\n\n\treturn nil\n}\n\n// Subscribe handles the payment for the caller's subscription.\nfunc (rs *RecurringSubscription) Subscribe() error {\n\tcaller := std.PrevRealm().Addr()\n\n\treturn rs.processSubscription(caller)\n}\n\n// GiftSubscription allows the user to pay for a subscription for another user (receiver).\nfunc (rs *RecurringSubscription) GiftSubscription(receiver std.Address) error {\n\treturn rs.processSubscription(receiver)\n}\n\n// GetExpiration returns the expiration date of the recurring subscription for a given caller.\nfunc (rs *RecurringSubscription) GetExpiration(addr std.Address) (time.Time, error) {\n\texpTime, exists := rs.subs.Get(addr.String())\n\tif !exists {\n\t\treturn time.Time{}, ErrNoSub\n\t}\n\n\treturn expTime.(time.Time), nil\n}\n\n// UpdateAmount allows the owner of the subscription contract to change the required subscription amount.\nfunc (rs *RecurringSubscription) UpdateAmount(newAmount int64) error {\n\tif err := rs.CallerIsOwner(); err != nil {\n\t\treturn ErrNotAuthorized\n\t}\n\n\trs.amount = newAmount\n\treturn nil\n}\n\n// GetAmount returns the current amount required for each subscription period.\nfunc (rs *RecurringSubscription) GetAmount() int64 {\n\treturn rs.amount\n}\n"},{"name":"recurring_test.gno","body":"package recurring\n\nimport (\n\t\"std\"\n\t\"testing\"\n\t\"time\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/p/demo/uassert\"\n)\n\nvar (\n\talice = testutils.TestAddress(\"alice\")\n\tbob = testutils.TestAddress(\"bob\")\n\tcharlie = testutils.TestAddress(\"charlie\")\n)\n\nfunc TestRecurringSubscription(t *testing.T) {\n\tstd.TestSetRealm(std.NewUserRealm(alice))\n\trs := NewRecurringSubscription(time.Hour*24, 1000)\n\n\tstd.TestSetOrigSend([]std.Coin{{Denom: \"ugnot\", Amount: 1000}}, nil)\n\terr := rs.Subscribe()\n\tuassert.NoError(t, err, \"Expected ProcessPayment to succeed for Alice\")\n\n\terr = rs.HasValidSubscription(std.PrevRealm().Addr())\n\tuassert.NoError(t, err, \"Expected Alice to have access\")\n\n\texpiration, err := rs.GetExpiration(std.PrevRealm().Addr())\n\tuassert.NoError(t, err, \"Expected to get expiration for Alice\")\n}\n\nfunc TestRecurringSubscriptionGift(t *testing.T) {\n\tstd.TestSetRealm(std.NewUserRealm(alice))\n\trs := NewRecurringSubscription(time.Hour*24, 1000)\n\n\tstd.TestSetOrigSend([]std.Coin{{Denom: \"ugnot\", Amount: 1000}}, nil)\n\terr := rs.GiftSubscription(bob)\n\tuassert.NoError(t, err, \"Expected ProcessPaymentGift to succeed for Bob\")\n\n\terr = rs.HasValidSubscription(bob)\n\tuassert.NoError(t, err, \"Expected Bob to have access\")\n\n\terr = rs.HasValidSubscription(charlie)\n\tuassert.Error(t, err, \"Expected Charlie to fail access check\")\n}\n\nfunc TestRecurringSubscriptionExpiration(t *testing.T) {\n\tstd.TestSetRealm(std.NewUserRealm(alice))\n\trs := NewRecurringSubscription(time.Hour, 1000)\n\n\tstd.TestSetOrigSend([]std.Coin{{Denom: \"ugnot\", Amount: 1000}}, nil)\n\terr := rs.Subscribe()\n\tuassert.NoError(t, err, \"Expected ProcessPayment to succeed for Alice\")\n\n\terr = rs.HasValidSubscription(std.PrevRealm().Addr())\n\tuassert.NoError(t, err, \"Expected Alice to have access\")\n\n\texpiration := time.Now().Add(-time.Hour * 2)\n\trs.subs.Set(std.PrevRealm().Addr().String(), expiration)\n\n\terr = rs.HasValidSubscription(std.PrevRealm().Addr())\n\tuassert.Error(t, err, \"Expected Alice's subscription to be expired\")\n}\n\nfunc TestUpdateAmountAuthorization(t *testing.T) {\n\tstd.TestSetRealm(std.NewUserRealm(alice))\n\trs := NewRecurringSubscription(time.Hour*24, 1000)\n\n\terr := rs.UpdateAmount(2000)\n\tuassert.NoError(t, err, \"Expected Alice to succeed in updating amount\")\n\n\tstd.TestSetOrigCaller(bob)\n\terr = rs.UpdateAmount(3000)\n\tuassert.Error(t, err, \"Expected Bob to fail when updating amount\")\n}\n\nfunc TestGetAmount(t *testing.T) {\n\tstd.TestSetRealm(std.NewUserRealm(alice))\n\trs := NewRecurringSubscription(time.Hour*24, 1000)\n\n\tamount := rs.GetAmount()\n\tuassert.Equal(t, amount, int64(1000), \"Expected the initial amount to be 1000 ugnot\")\n\n\terr := rs.UpdateAmount(2000)\n\tuassert.NoError(t, err, \"Expected Alice to succeed in updating amount\")\n\n\tamount = rs.GetAmount()\n\tuassert.Equal(t, amount, int64(2000), \"Expected the updated amount to be 2000 ugnot\")\n}\n\nfunc TestIncorrectPaymentAmount(t *testing.T) {\n\tstd.TestSetRealm(std.NewUserRealm(alice))\n\trs := NewRecurringSubscription(time.Hour*24, 1000)\n\n\tstd.TestSetOrigSend([]std.Coin{{Denom: \"ugnot\", Amount: 500}}, nil)\n\terr := rs.Subscribe()\n\tuassert.Error(t, err, \"Expected payment with incorrect amount to fail\")\n}\n\nfunc TestMultiplePaymentsForSameUser(t *testing.T) {\n\tstd.TestSetRealm(std.NewUserRealm(alice))\n\trs := NewRecurringSubscription(time.Hour*24, 1000)\n\n\tstd.TestSetOrigSend([]std.Coin{{Denom: \"ugnot\", Amount: 1000}}, nil)\n\terr := rs.Subscribe()\n\tuassert.NoError(t, err, \"Expected first ProcessPayment to succeed for Alice\")\n\n\tstd.TestSetOrigSend([]std.Coin{{Denom: \"ugnot\", Amount: 1000}}, nil)\n\terr = rs.Subscribe()\n\tuassert.Error(t, err, \"Expected second ProcessPayment to fail for Alice due to existing subscription\")\n}\n\nfunc TestRecurringSubscriptionWithMultiplePayments(t *testing.T) {\n\tstd.TestSetRealm(std.NewUserRealm(alice))\n\trs := NewRecurringSubscription(time.Hour, 1000)\n\n\tstd.TestSetOrigSend([]std.Coin{{Denom: \"ugnot\", Amount: 1000}}, nil)\n\terr := rs.Subscribe()\n\tuassert.NoError(t, err, \"Expected first ProcessPayment to succeed for Alice\")\n\n\terr = rs.HasValidSubscription(std.PrevRealm().Addr())\n\tuassert.NoError(t, err, \"Expected Alice to have access after first payment\")\n\n\texpiration := time.Now().Add(-time.Hour * 2)\n\trs.subs.Set(std.PrevRealm().Addr().String(), expiration)\n\n\tstd.TestSetOrigSend([]std.Coin{{Denom: \"ugnot\", Amount: 1000}}, nil)\n\terr = rs.Subscribe()\n\tuassert.NoError(t, err, \"Expected second ProcessPayment to succeed for Alice\")\n\n\terr = rs.HasValidSubscription(std.PrevRealm().Addr())\n\tuassert.NoError(t, err, \"Expected Alice to have access after second payment\")\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"svg","path":"gno.land/p/demo/svg","files":[{"name":"doc.gno","body":"/*\nPackage svg is a minimalist SVG generation library for Gno.\n\nThe svg package provides a simple and lightweight solution for programmatically generating SVG (Scalable Vector Graphics) markup in Gno. It allows you to create basic shapes like rectangles and circles, and output the generated SVG to a\n\nExample:\n\n\timport \"gno.land/p/demo/svg\"\"\n\n\tfunc Foo() string {\n\t canvas := svg.Canvas{Width: 200, Height: 200}\n\t canvas.DrawRectangle(50, 50, 100, 100, \"red\")\n\t canvas.DrawCircle(100, 100, 50, \"blue\")\n\t return canvas.String()\n\t}\n*/\npackage svg // import \"gno.land/p/demo/svg\"\n"},{"name":"svg.gno","body":"package svg\n\nimport \"gno.land/p/demo/ufmt\"\n\ntype Canvas struct {\n\tWidth int\n\tHeight int\n\tElems []Elem\n}\n\ntype Elem interface{ String() string }\n\nfunc (c Canvas) String() string {\n\toutput := \"\"\n\toutput += ufmt.Sprintf(`\u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"%d\" height=\"%d\"\u003e`, c.Width, c.Height)\n\tfor _, elem := range c.Elems {\n\t\toutput += elem.String()\n\t}\n\toutput += \"\u003c/svg\u003e\"\n\treturn output\n}\n\nfunc (c *Canvas) Append(elem Elem) {\n\tc.Elems = append(c.Elems, elem)\n}\n\ntype Circle struct {\n\tCX int // center X\n\tCY int // center Y\n\tR int // radius\n\tFill string\n}\n\nfunc (c Circle) String() string {\n\treturn ufmt.Sprintf(`\u003ccircle cx=\"%d\" cy=\"%d\" r=\"%d\" fill=\"%s\" /\u003e`, c.CX, c.CY, c.R, c.Fill)\n}\n\nfunc (c *Canvas) DrawCircle(cx, cy, r int, fill string) {\n\tc.Append(Circle{\n\t\tCX: cx,\n\t\tCY: cy,\n\t\tR: r,\n\t\tFill: fill,\n\t})\n}\n\ntype Rectangle struct {\n\tX, Y, Width, Height int\n\tFill string\n}\n\nfunc (c Rectangle) String() string {\n\treturn ufmt.Sprintf(`\u003crect x=\"%d\" y=\"%d\" width=\"%d\" height=\"%d\" fill=\"%s\" /\u003e`, c.X, c.Y, c.Width, c.Height, c.Fill)\n}\n\nfunc (c *Canvas) DrawRectangle(x, y, width, height int, fill string) {\n\tc.Append(Rectangle{\n\t\tX: x,\n\t\tY: y,\n\t\tWidth: width,\n\t\tHeight: height,\n\t\tFill: fill,\n\t})\n}\n\ntype Text struct {\n\tX, Y int\n\tText, Fill string\n}\n\nfunc (c Text) String() string {\n\treturn ufmt.Sprintf(`\u003ctext x=\"%d\" y=\"%d\" fill=\"%s\"\u003e%s\u003c/text\u003e`, c.X, c.Y, c.Fill, c.Text)\n}\n\nfunc (c *Canvas) DrawText(x, y int, text, fill string) {\n\tc.Append(Text{\n\t\tX: x,\n\t\tY: y,\n\t\tText: text,\n\t\tFill: fill,\n\t})\n}\n"},{"name":"z0_filetest.gno","body":"// PKGPATH: gno.land/p/demo/svg_test\npackage svg_test\n\nimport \"gno.land/p/demo/svg\"\n\nfunc main() {\n\tcanvas := svg.Canvas{Width: 500, Height: 500}\n\tcanvas.DrawRectangle(50, 50, 100, 100, \"red\")\n\tcanvas.DrawCircle(100, 100, 50, \"blue\")\n\tcanvas.DrawText(100, 100, \"hello world!\", \"magenta\")\n\tprintln(canvas)\n}\n\n// Output:\n// \u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"500\" height=\"500\"\u003e\u003crect x=\"50\" y=\"50\" width=\"100\" height=\"100\" fill=\"red\" /\u003e\u003ccircle cx=\"100\" cy=\"100\" r=\"50\" fill=\"blue\" /\u003e\u003ctext x=\"100\" y=\"100\" fill=\"magenta\"\u003ehello world!\u003c/text\u003e\u003c/svg\u003e\n"},{"name":"z1_filetest.gno","body":"// PKGPATH: gno.land/p/demo/svg_test\npackage svg_test\n\nimport \"gno.land/p/demo/svg\"\n\nfunc main() {\n\tcanvas := svg.Canvas{\n\t\tWidth: 500, Height: 500,\n\t\tElems: []svg.Elem{\n\t\t\tsvg.Rectangle{50, 50, 100, 100, \"red\"},\n\t\t\tsvg.Circle{50, 50, 100, \"red\"},\n\t\t\tsvg.Text{100, 100, \"hello world!\", \"magenta\"},\n\t\t},\n\t}\n\tprintln(canvas)\n}\n\n// Output:\n// \u003csvg xmlns=\"http://www.w3.org/2000/svg\" width=\"500\" height=\"500\"\u003e\u003crect x=\"50\" y=\"50\" width=\"100\" height=\"100\" fill=\"red\" /\u003e\u003ccircle cx=\"50\" cy=\"50\" r=\"100\" fill=\"red\" /\u003e\u003ctext x=\"100\" y=\"100\" fill=\"magenta\"\u003ehello world!\u003c/text\u003e\u003c/svg\u003e\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"tamagotchi","path":"gno.land/p/demo/tamagotchi","files":[{"name":"tamagotchi.gno","body":"package tamagotchi\n\nimport (\n\t\"time\"\n\n\t\"gno.land/p/demo/ufmt\"\n)\n\n// Tamagotchi structure\ntype Tamagotchi struct {\n\tname string\n\thunger int\n\thappiness int\n\thealth int\n\tage int\n\tmaxAge int\n\tsleepy int\n\tcreated time.Time\n\tlastUpdated time.Time\n}\n\nfunc New(name string) *Tamagotchi {\n\tnow := time.Now()\n\treturn \u0026Tamagotchi{\n\t\tname: name,\n\t\thunger: 50,\n\t\thappiness: 50,\n\t\thealth: 50,\n\t\tmaxAge: 100,\n\t\tlastUpdated: now,\n\t\tcreated: now,\n\t}\n}\n\nfunc (t *Tamagotchi) Name() string {\n\tt.update()\n\treturn t.name\n}\n\nfunc (t *Tamagotchi) Hunger() int {\n\tt.update()\n\treturn t.hunger\n}\n\nfunc (t *Tamagotchi) Happiness() int {\n\tt.update()\n\treturn t.happiness\n}\n\nfunc (t *Tamagotchi) Health() int {\n\tt.update()\n\treturn t.health\n}\n\nfunc (t *Tamagotchi) Age() int {\n\tt.update()\n\treturn t.age\n}\n\nfunc (t *Tamagotchi) Sleepy() int {\n\tt.update()\n\treturn t.sleepy\n}\n\n// Feed method for Tamagotchi\nfunc (t *Tamagotchi) Feed() {\n\tt.update()\n\tif t.dead() {\n\t\treturn\n\t}\n\tt.hunger = bound(t.hunger-10, 0, 100)\n}\n\n// Play method for Tamagotchi\nfunc (t *Tamagotchi) Play() {\n\tt.update()\n\tif t.dead() {\n\t\treturn\n\t}\n\tt.happiness = bound(t.happiness+10, 0, 100)\n}\n\n// Heal method for Tamagotchi\nfunc (t *Tamagotchi) Heal() {\n\tt.update()\n\n\tif t.dead() {\n\t\treturn\n\t}\n\tt.health = bound(t.health+10, 0, 100)\n}\n\nfunc (t Tamagotchi) dead() bool { return t.health == 0 }\n\n// Update applies changes based on the duration since the last update\nfunc (t *Tamagotchi) update() {\n\tif t.dead() {\n\t\treturn\n\t}\n\n\tnow := time.Now()\n\tif t.lastUpdated == now {\n\t\treturn\n\t}\n\n\tduration := now.Sub(t.lastUpdated)\n\telapsedMins := int(duration.Minutes())\n\n\tt.hunger = bound(t.hunger+elapsedMins, 0, 100)\n\tt.happiness = bound(t.happiness-elapsedMins, 0, 100)\n\tt.health = bound(t.health-elapsedMins, 0, 100)\n\tt.sleepy = bound(t.sleepy+elapsedMins, 0, 100)\n\n\t// age is hours since created\n\tt.age = int(now.Sub(t.created).Hours())\n\tif t.age \u003e t.maxAge {\n\t\tt.age = t.maxAge\n\t\tt.health = 0\n\t}\n\tif t.health == 0 {\n\t\tt.sleepy = 0\n\t\tt.happiness = 0\n\t\tt.hunger = 0\n\t}\n\n\tt.lastUpdated = now\n}\n\n// Face returns an ASCII art representation of the Tamagotchi's current state\nfunc (t *Tamagotchi) Face() string {\n\tt.update()\n\treturn t.face()\n}\n\nfunc (t *Tamagotchi) face() string {\n\tswitch {\n\tcase t.health == 0:\n\t\treturn \"😵\" // dead face\n\tcase t.health \u003c 30:\n\t\treturn \"😷\" // sick face\n\tcase t.happiness \u003c 30:\n\t\treturn \"😢\" // sad face\n\tcase t.hunger \u003e 70:\n\t\treturn \"😫\" // hungry face\n\tcase t.sleepy \u003e 70:\n\t\treturn \"😴\" // sleepy face\n\tdefault:\n\t\treturn \"😃\" // happy face\n\t}\n}\n\n// Markdown method for Tamagotchi\nfunc (t *Tamagotchi) Markdown() string {\n\tt.update()\n\treturn ufmt.Sprintf(`# %s %s\n\n* age: %d\n* hunger: %d\n* happiness: %d\n* health: %d\n* sleepy: %d`,\n\t\tt.name, t.Face(),\n\t\tt.age, t.hunger, t.happiness, t.health, t.sleepy,\n\t)\n}\n\nfunc bound(n, min, max int) int {\n\tif n \u003c min {\n\t\treturn min\n\t}\n\tif n \u003e max {\n\t\treturn max\n\t}\n\treturn n\n}\n"},{"name":"z0_filetest.gno","body":"package main\n\nimport (\n\t\"time\"\n\n\t\"internal/os_test\"\n\n\t\"gno.land/p/demo/tamagotchi\"\n)\n\nfunc main() {\n\tt := tamagotchi.New(\"Gnome\")\n\n\tprintln(\"\\n-- INITIAL\\n\")\n\tprintln(t.Markdown())\n\n\tprintln(\"\\n-- WAIT 20 minutes\\n\")\n\tos_test.Sleep(20 * time.Minute)\n\tprintln(t.Markdown())\n\n\tprintln(\"\\n-- FEEDx3, PLAYx2, HEALx4\\n\")\n\tt.Feed()\n\tt.Feed()\n\tt.Feed()\n\tt.Play()\n\tt.Play()\n\tt.Heal()\n\tt.Heal()\n\tt.Heal()\n\tt.Heal()\n\tprintln(t.Markdown())\n\n\tprintln(\"\\n-- WAIT 20 minutes\\n\")\n\tos_test.Sleep(20 * time.Minute)\n\tprintln(t.Markdown())\n\n\tprintln(\"\\n-- WAIT 20 hours\\n\")\n\tos_test.Sleep(20 * time.Hour)\n\tprintln(t.Markdown())\n\n\tprintln(\"\\n-- WAIT 20 hours\\n\")\n\tos_test.Sleep(20 * time.Hour)\n\tprintln(t.Markdown())\n}\n\n// Output:\n// -- INITIAL\n//\n// # Gnome 😃\n//\n// * age: 0\n// * hunger: 50\n// * happiness: 50\n// * health: 50\n// * sleepy: 0\n//\n// -- WAIT 20 minutes\n//\n// # Gnome 😃\n//\n// * age: 0\n// * hunger: 70\n// * happiness: 30\n// * health: 30\n// * sleepy: 20\n//\n// -- FEEDx3, PLAYx2, HEALx4\n//\n// # Gnome 😃\n//\n// * age: 0\n// * hunger: 40\n// * happiness: 50\n// * health: 70\n// * sleepy: 20\n//\n// -- WAIT 20 minutes\n//\n// # Gnome 😃\n//\n// * age: 0\n// * hunger: 60\n// * happiness: 30\n// * health: 50\n// * sleepy: 40\n//\n// -- WAIT 20 hours\n//\n// # Gnome 😵\n//\n// * age: 20\n// * hunger: 0\n// * happiness: 0\n// * health: 0\n// * sleepy: 0\n//\n// -- WAIT 20 hours\n//\n// # Gnome 😵\n//\n// * age: 20\n// * hunger: 0\n// * happiness: 0\n// * health: 0\n// * sleepy: 0\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"subtests","path":"gno.land/p/demo/tests/subtests","files":[{"name":"subtests.gno","body":"package subtests\n\nimport (\n\t\"std\"\n)\n\nfunc GetCurrentRealm() std.Realm {\n\treturn std.CurrentRealm()\n}\n\nfunc GetPrevRealm() std.Realm {\n\treturn std.PrevRealm()\n}\n\nfunc Exec(fn func()) {\n\tfn()\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"subtests","path":"gno.land/r/demo/tests/subtests","files":[{"name":"subtests.gno","body":"package subtests\n\nimport (\n\t\"std\"\n)\n\nfunc GetCurrentRealm() std.Realm {\n\treturn std.CurrentRealm()\n}\n\nfunc GetPrevRealm() std.Realm {\n\treturn std.PrevRealm()\n}\n\nfunc Exec(fn func()) {\n\tfn()\n}\n\nfunc CallAssertOriginCall() {\n\tstd.AssertOriginCall()\n}\n\nfunc CallIsOriginCall() bool {\n\treturn std.IsOriginCall()\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"tests","path":"gno.land/r/demo/tests","files":[{"name":"README.md","body":"Modules here are only useful for file realm tests.\nThey can be safely ignored for other purposes.\n"},{"name":"interfaces.gno","body":"package tests\n\nimport (\n\t\"strconv\"\n)\n\ntype Stringer interface {\n\tString() string\n}\n\nvar stringers []Stringer\n\nfunc AddStringer(str Stringer) {\n\t// NOTE: this is ridiculous, a slice that will become too long\n\t// eventually. Don't do this in production programs; use\n\t// gno.land/p/demo/avl or similar structures.\n\tstringers = append(stringers, str)\n}\n\nfunc Render(path string) string {\n\tres := \"\"\n\t// NOTE: like the function above, this function too will eventually\n\t// become too expensive to call.\n\tfor i, stringer := range stringers {\n\t\tres += strconv.Itoa(i) + \": \" + stringer.String() + \"\\n\"\n\t}\n\treturn res\n}\n"},{"name":"nestedpkg_test.gno","body":"package tests\n\nimport (\n\t\"std\"\n\t\"testing\"\n)\n\nfunc TestNestedPkg(t *testing.T) {\n\t// direct child\n\tcur := \"gno.land/r/demo/tests/foo\"\n\tstd.TestSetRealm(std.NewCodeRealm(cur))\n\tif !IsCallerSubPath() {\n\t\tt.Errorf(cur + \" should be a sub path\")\n\t}\n\tif IsCallerParentPath() {\n\t\tt.Errorf(cur + \" should not be a parent path\")\n\t}\n\tif !HasCallerSameNamespace() {\n\t\tt.Errorf(cur + \" should be from the same namespace\")\n\t}\n\n\t// grand-grand-child\n\tcur = \"gno.land/r/demo/tests/foo/bar/baz\"\n\tstd.TestSetRealm(std.NewCodeRealm(cur))\n\tif !IsCallerSubPath() {\n\t\tt.Errorf(cur + \" should be a sub path\")\n\t}\n\tif IsCallerParentPath() {\n\t\tt.Errorf(cur + \" should not be a parent path\")\n\t}\n\tif !HasCallerSameNamespace() {\n\t\tt.Errorf(cur + \" should be from the same namespace\")\n\t}\n\n\t// direct parent\n\tcur = \"gno.land/r/demo\"\n\tstd.TestSetRealm(std.NewCodeRealm(cur))\n\tif IsCallerSubPath() {\n\t\tt.Errorf(cur + \" should not be a sub path\")\n\t}\n\tif !IsCallerParentPath() {\n\t\tt.Errorf(cur + \" should be a parent path\")\n\t}\n\tif !HasCallerSameNamespace() {\n\t\tt.Errorf(cur + \" should be from the same namespace\")\n\t}\n\n\t// fake parent (prefix)\n\tcur = \"gno.land/r/dem\"\n\tstd.TestSetRealm(std.NewCodeRealm(cur))\n\tif IsCallerSubPath() {\n\t\tt.Errorf(cur + \" should not be a sub path\")\n\t}\n\tif IsCallerParentPath() {\n\t\tt.Errorf(cur + \" should not be a parent path\")\n\t}\n\tif HasCallerSameNamespace() {\n\t\tt.Errorf(cur + \" should not be from the same namespace\")\n\t}\n\n\t// different namespace\n\tcur = \"gno.land/r/foo\"\n\tstd.TestSetRealm(std.NewCodeRealm(cur))\n\tif IsCallerSubPath() {\n\t\tt.Errorf(cur + \" should not be a sub path\")\n\t}\n\tif IsCallerParentPath() {\n\t\tt.Errorf(cur + \" should not be a parent path\")\n\t}\n\tif HasCallerSameNamespace() {\n\t\tt.Errorf(cur + \" should not be from the same namespace\")\n\t}\n}\n"},{"name":"realm_compositelit.gno","body":"package tests\n\ntype (\n\tWord uint\n\tnat []Word\n)\n\nvar zero = \u0026Int{\n\tneg: true,\n\tabs: []Word{0},\n}\n\n// structLit\ntype Int struct {\n\tneg bool\n\tabs nat\n}\n\nfunc GetZeroType() nat {\n\ta := zero.abs\n\treturn a\n}\n"},{"name":"realm_method38d.gno","body":"package tests\n\nvar abs nat\n\nfunc (n nat) Add() nat {\n\treturn []Word{0}\n}\n\nfunc GetAbs() nat {\n\tabs = []Word{0}\n\n\treturn abs\n}\n\nfunc AbsAdd() nat {\n\trt := GetAbs().Add()\n\n\treturn rt\n}\n"},{"name":"tests.gno","body":"package tests\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/nestedpkg\"\n\trsubtests \"gno.land/r/demo/tests/subtests\"\n)\n\nvar counter int\n\nfunc IncCounter() {\n\tcounter++\n}\n\nfunc Counter() int {\n\treturn counter\n}\n\nfunc CurrentRealmPath() string {\n\treturn std.CurrentRealm().PkgPath()\n}\n\nvar initOrigCaller = std.GetOrigCaller()\n\nfunc InitOrigCaller() std.Address {\n\treturn initOrigCaller\n}\n\nfunc CallAssertOriginCall() {\n\tstd.AssertOriginCall()\n}\n\nfunc CallIsOriginCall() bool {\n\treturn std.IsOriginCall()\n}\n\nfunc CallSubtestsAssertOriginCall() {\n\trsubtests.CallAssertOriginCall()\n}\n\nfunc CallSubtestsIsOriginCall() bool {\n\treturn rsubtests.CallIsOriginCall()\n}\n\n//----------------------------------------\n// Test structure to ensure cross-realm modification is prevented.\n\ntype TestRealmObject struct {\n\tField string\n}\n\nfunc ModifyTestRealmObject(t *TestRealmObject) {\n\tt.Field += \"_modified\"\n}\n\nfunc (t *TestRealmObject) Modify() {\n\tt.Field += \"_modified\"\n}\n\n//----------------------------------------\n// Test helpers to test a particular realm bug.\n\ntype TestNode struct {\n\tName string\n\tChild *TestNode\n}\n\nvar (\n\tgTestNode1 *TestNode\n\tgTestNode2 *TestNode\n\tgTestNode3 *TestNode\n)\n\nfunc InitTestNodes() {\n\tgTestNode1 = \u0026TestNode{Name: \"first\"}\n\tgTestNode2 = \u0026TestNode{Name: \"second\", Child: \u0026TestNode{Name: \"second's child\"}}\n}\n\nfunc ModTestNodes() {\n\ttmp := \u0026TestNode{}\n\ttmp.Child = gTestNode2.Child\n\tgTestNode3 = tmp // set to new-real\n\t// gTestNode1 = tmp.Child // set back to original is-real\n\tgTestNode3 = nil // delete.\n}\n\nfunc PrintTestNodes() {\n\tprintln(gTestNode2.Child.Name)\n}\n\nfunc GetPrevRealm() std.Realm {\n\treturn std.PrevRealm()\n}\n\nfunc GetRSubtestsPrevRealm() std.Realm {\n\treturn rsubtests.GetPrevRealm()\n}\n\nfunc Exec(fn func()) {\n\tfn()\n}\n\nfunc IsCallerSubPath() bool {\n\treturn nestedpkg.IsCallerSubPath()\n}\n\nfunc IsCallerParentPath() bool {\n\treturn nestedpkg.IsCallerParentPath()\n}\n\nfunc HasCallerSameNamespace() bool {\n\treturn nestedpkg.IsSameNamespace()\n}\n"},{"name":"tests_test.gno","body":"package tests\n\nimport (\n\t\"std\"\n\t\"testing\"\n)\n\nfunc TestAssertOriginCall(t *testing.T) {\n\t// CallAssertOriginCall(): no panic\n\tCallAssertOriginCall()\n\tif !CallIsOriginCall() {\n\t\tt.Errorf(\"expected IsOriginCall=true but got false\")\n\t}\n\n\t// CallAssertOriginCall() from a block: panic\n\texpectedReason := \"invalid non-origin call\"\n\tfunc() {\n\t\tdefer func() {\n\t\t\tr := recover()\n\t\t\tif r == nil || r.(string) != expectedReason {\n\t\t\t\tt.Errorf(\"expected panic with '%v', got '%v'\", expectedReason, r)\n\t\t\t}\n\t\t}()\n\t\t// if called inside a function literal, this is no longer an origin call\n\t\t// because there's one additional frame (the function literal block).\n\t\tif CallIsOriginCall() {\n\t\t\tt.Errorf(\"expected IsOriginCall=false but got true\")\n\t\t}\n\t\tCallAssertOriginCall()\n\t}()\n\n\t// CallSubtestsAssertOriginCall(): panic\n\tdefer func() {\n\t\tr := recover()\n\t\tif r == nil || r.(string) != expectedReason {\n\t\t\tt.Errorf(\"expected panic with '%v', got '%v'\", expectedReason, r)\n\t\t}\n\t}()\n\tif CallSubtestsIsOriginCall() {\n\t\tt.Errorf(\"expected IsOriginCall=false but got true\")\n\t}\n\tCallSubtestsAssertOriginCall()\n}\n\nfunc TestPrevRealm(t *testing.T) {\n\tvar (\n\t\tuser1Addr = std.DerivePkgAddr(\"user1.gno\")\n\t\trTestsAddr = std.DerivePkgAddr(\"gno.land/r/demo/tests\")\n\t)\n\t// When a single realm in the frames, PrevRealm returns the user\n\tif addr := GetPrevRealm().Addr(); addr != user1Addr {\n\t\tt.Errorf(\"want GetPrevRealm().Addr==%s, got %s\", user1Addr, addr)\n\t}\n\t// When 2 or more realms in the frames, PrevRealm returns the second to last\n\tif addr := GetRSubtestsPrevRealm().Addr(); addr != rTestsAddr {\n\t\tt.Errorf(\"want GetRSubtestsPrevRealm().Addr==%s, got %s\", rTestsAddr, addr)\n\t}\n}\n"},{"name":"z0_filetest.gno","body":"package main\n\nimport (\n\t\"gno.land/r/demo/tests\"\n)\n\nfunc main() {\n\tprintln(\"tests.CallIsOriginCall:\", tests.CallIsOriginCall())\n\ttests.CallAssertOriginCall()\n\tprintln(\"tests.CallAssertOriginCall doesn't panic when called directly\")\n\n\t{\n\t\t// if called inside a block, this is no longer an origin call because\n\t\t// there's one additional frame (the block).\n\t\tprintln(\"tests.CallIsOriginCall:\", tests.CallIsOriginCall())\n\t\tdefer func() {\n\t\t\tr := recover()\n\t\t\tprintln(\"tests.AssertOriginCall panics if when called inside a function literal:\", r)\n\t\t}()\n\t\ttests.CallAssertOriginCall()\n\t}\n}\n\n// Output:\n// tests.CallIsOriginCall: true\n// tests.CallAssertOriginCall doesn't panic when called directly\n// tests.CallIsOriginCall: true\n// tests.AssertOriginCall panics if when called inside a function literal: undefined\n"},{"name":"z1_filetest.gno","body":"package main\n\nimport (\n\t\"gno.land/r/demo/tests\"\n)\n\nfunc main() {\n\tprintln(tests.Counter())\n\ttests.IncCounter()\n\tprintln(tests.Counter())\n}\n\n// Output:\n// 0\n// 1\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"tests","path":"gno.land/p/demo/tests","files":[{"name":"README.md","body":"Modules here are only useful for file realm tests.\nThey can be safely ignored for other purposes.\n"},{"name":"tests.gno","body":"package tests\n\nimport (\n\t\"std\"\n\n\tpsubtests \"gno.land/p/demo/tests/subtests\"\n\t\"gno.land/r/demo/tests\"\n\trtests \"gno.land/r/demo/tests\"\n)\n\nconst World = \"world\"\n\n// IncCounter demonstrates that it's possible to call a realm function from\n// a package. So a package can potentially write into the store, by calling\n// an other realm.\nfunc IncCounter() {\n\ttests.IncCounter()\n}\n\nfunc CurrentRealmPath() string {\n\treturn std.CurrentRealm().PkgPath()\n}\n\n//----------------------------------------\n// cross realm test vars\n\ntype TestRealmObject2 struct {\n\tField string\n}\n\nfunc (o2 *TestRealmObject2) Modify() {\n\to2.Field = \"modified\"\n}\n\nvar (\n\tsomevalue1 TestRealmObject2\n\tSomeValue2 TestRealmObject2\n\tSomeValue3 *TestRealmObject2\n)\n\nfunc init() {\n\tsomevalue1 = TestRealmObject2{Field: \"init\"}\n\tSomeValue2 = TestRealmObject2{Field: \"init\"}\n\tSomeValue3 = \u0026TestRealmObject2{Field: \"init\"}\n}\n\nfunc ModifyTestRealmObject2a() {\n\tsomevalue1.Field = \"modified\"\n}\n\nfunc ModifyTestRealmObject2b() {\n\tSomeValue2.Field = \"modified\"\n}\n\nfunc ModifyTestRealmObject2c() {\n\tSomeValue3.Field = \"modified\"\n}\n\nfunc GetPrevRealm() std.Realm {\n\treturn std.PrevRealm()\n}\n\nfunc GetPSubtestsPrevRealm() std.Realm {\n\treturn psubtests.GetPrevRealm()\n}\n\nfunc GetRTestsGetPrevRealm() std.Realm {\n\treturn rtests.GetPrevRealm()\n}\n\n// Warning: unsafe pattern.\nfunc Exec(fn func()) {\n\tfn()\n}\n"},{"name":"tests_test.gno","body":"package tests_test\n\nimport (\n\t\"testing\"\n\n\t\"gno.land/p/demo/tests\"\n\n\t\"gno.land/p/demo/uassert\"\n)\n\nvar World = \"WORLD\"\n\nfunc TestGetHelloWorld(t *testing.T) {\n\t// tests.World is 'world'\n\ts := \"hello \" + tests.World + World\n\tconst want = \"hello worldWORLD\"\n\n\tuassert.Equal(t, want, s)\n}\n"},{"name":"z0_filetest.gno","body":"package main\n\nimport (\n\tptests \"gno.land/p/demo/tests\"\n\trtests \"gno.land/r/demo/tests\"\n)\n\nfunc main() {\n\tprintln(rtests.Counter())\n\tptests.IncCounter()\n\tprintln(rtests.Counter())\n}\n\n// Output:\n// 0\n// 1\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"p_crossrealm","path":"gno.land/p/demo/tests/p_crossrealm","files":[{"name":"p_crossrealm.gno","body":"package p_crossrealm\n\ntype Stringer interface {\n\tString() string\n}\n\ntype Container struct {\n\tA int\n\tB Stringer\n}\n\nfunc (c *Container) Touch() *Container {\n\tc.A += 1\n\treturn c\n}\n\nfunc (c *Container) Print() {\n\tprintln(\"A:\", c.A)\n\tif c.B == nil {\n\t\tprintln(\"B: undefined\")\n\t} else {\n\t\tprintln(\"B:\", c.B.String())\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"todolist","path":"gno.land/p/demo/todolist","files":[{"name":"todolist.gno","body":"package todolist\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\n\t\"gno.land/p/demo/avl\"\n)\n\ntype TodoList struct {\n\tTitle string\n\tTasks *avl.Tree\n\tOwner std.Address\n}\n\ntype Task struct {\n\tTitle string\n\tDone bool\n}\n\nfunc NewTodoList(title string) *TodoList {\n\treturn \u0026TodoList{\n\t\tTitle: title,\n\t\tTasks: avl.NewTree(),\n\t\tOwner: std.GetOrigCaller(),\n\t}\n}\n\nfunc NewTask(title string) *Task {\n\treturn \u0026Task{\n\t\tTitle: title,\n\t\tDone: false,\n\t}\n}\n\nfunc (tl *TodoList) AddTask(id int, task *Task) {\n\ttl.Tasks.Set(strconv.Itoa(id), task)\n}\n\nfunc ToggleTaskStatus(task *Task) {\n\ttask.Done = !task.Done\n}\n\nfunc (tl *TodoList) RemoveTask(taskId string) {\n\ttl.Tasks.Remove(taskId)\n}\n\nfunc (tl *TodoList) GetTasks() []*Task {\n\ttasks := make([]*Task, 0, tl.Tasks.Size())\n\ttl.Tasks.Iterate(\"\", \"\", func(key string, value interface{}) bool {\n\t\ttasks = append(tasks, value.(*Task))\n\t\treturn false\n\t})\n\treturn tasks\n}\n\nfunc (tl *TodoList) GetTodolistOwner() std.Address {\n\treturn tl.Owner\n}\n\nfunc (tl *TodoList) GetTodolistTitle() string {\n\treturn tl.Title\n}\n"},{"name":"todolist_test.gno","body":"package todolist\n\nimport (\n\t\"std\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/uassert\"\n)\n\nfunc TestNewTodoList(t *testing.T) {\n\ttitle := \"My Todo List\"\n\ttodoList := NewTodoList(title)\n\n\tuassert.Equal(t, title, todoList.GetTodolistTitle())\n\tuassert.Equal(t, 0, len(todoList.GetTasks()))\n\tuassert.Equal(t, std.GetOrigCaller().String(), todoList.GetTodolistOwner().String())\n}\n\nfunc TestNewTask(t *testing.T) {\n\ttitle := \"My Task\"\n\ttask := NewTask(title)\n\n\tuassert.Equal(t, title, task.Title)\n\tuassert.False(t, task.Done, \"Expected task to be not done, but it is done\")\n}\n\nfunc TestAddTask(t *testing.T) {\n\ttodoList := NewTodoList(\"My Todo List\")\n\ttask := NewTask(\"My Task\")\n\n\ttodoList.AddTask(1, task)\n\n\ttasks := todoList.GetTasks()\n\n\tuassert.Equal(t, 1, len(tasks))\n\tuassert.True(t, tasks[0] == task, \"Task does not match\")\n}\n\nfunc TestToggleTaskStatus(t *testing.T) {\n\ttask := NewTask(\"My Task\")\n\n\tToggleTaskStatus(task)\n\tuassert.True(t, task.Done, \"Expected task to be done, but it is not done\")\n\n\tToggleTaskStatus(task)\n\tuassert.False(t, task.Done, \"Expected task to be done, but it is not done\")\n}\n\nfunc TestRemoveTask(t *testing.T) {\n\ttodoList := NewTodoList(\"My Todo List\")\n\ttask := NewTask(\"My Task\")\n\ttodoList.AddTask(1, task)\n\n\ttodoList.RemoveTask(\"1\")\n\n\ttasks := todoList.GetTasks()\n\tuassert.Equal(t, 0, len(tasks))\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"ui","path":"gno.land/p/demo/ui","files":[{"name":"ui.gno","body":"package ui\n\nimport (\n\t\"strconv\"\n\t\"strings\"\n)\n\ntype DOM struct {\n\t// metadata\n\tPrefix string\n\tTitle string\n\tWithComments bool\n\tClasses []string\n\n\t// elements\n\tHeader Element\n\tBody Element\n\tFooter Element\n}\n\nfunc (dom DOM) String() string {\n\tclasses := strings.Join(dom.Classes, \" \")\n\n\toutput := \"\"\n\n\tif classes != \"\" {\n\t\toutput += \"\u003cmain class='\" + classes + \"'\u003e\" + \"\\n\\n\"\n\t}\n\n\tif dom.Title != \"\" {\n\t\toutput += H1(dom.Title).String(dom) + \"\\n\"\n\t}\n\n\tif header := dom.Header.String(dom); header != \"\" {\n\t\tif dom.WithComments {\n\t\t\toutput += \"\u003c!-- header --\u003e\"\n\t\t}\n\t\toutput += header + \"\\n\"\n\t\tif dom.WithComments {\n\t\t\toutput += \"\u003c!-- /header --\u003e\"\n\t\t}\n\t}\n\n\tif body := dom.Body.String(dom); body != \"\" {\n\t\tif dom.WithComments {\n\t\t\toutput += \"\u003c!-- body --\u003e\"\n\t\t}\n\t\toutput += body + \"\\n\"\n\t\tif dom.WithComments {\n\t\t\toutput += \"\u003c!-- /body --\u003e\"\n\t\t}\n\t}\n\n\tif footer := dom.Footer.String(dom); footer != \"\" {\n\t\tif dom.WithComments {\n\t\t\toutput += \"\u003c!-- footer --\u003e\"\n\t\t}\n\t\toutput += footer + \"\\n\"\n\t\tif dom.WithComments {\n\t\t\toutput += \"\u003c!-- /footer --\u003e\"\n\t\t}\n\t}\n\n\tif classes != \"\" {\n\t\toutput += \"\u003c/main\u003e\"\n\t}\n\n\t// TODO: cleanup double new-lines.\n\n\treturn output\n}\n\ntype Jumbotron []DomStringer\n\nfunc (j Jumbotron) String(dom DOM) string {\n\toutput := `\u003cdiv class=\"jumbotron\"\u003e` + \"\\n\\n\"\n\tfor _, elem := range j {\n\t\toutput += elem.String(dom) + \"\\n\"\n\t}\n\toutput += `\u003c/div\u003e\u003c!-- /jumbotron --\u003e` + \"\\n\"\n\treturn output\n}\n\n// XXX: rename Element to Div?\ntype Element []DomStringer\n\nfunc (e *Element) Append(elems ...DomStringer) {\n\t*e = append(*e, elems...)\n}\n\nfunc (e *Element) String(dom DOM) string {\n\toutput := \"\"\n\tfor _, elem := range *e {\n\t\toutput += elem.String(dom) + \"\\n\"\n\t}\n\treturn output\n}\n\ntype Breadcrumb []DomStringer\n\nfunc (b *Breadcrumb) Append(elems ...DomStringer) {\n\t*b = append(*b, elems...)\n}\n\nfunc (b Breadcrumb) String(dom DOM) string {\n\toutput := \"\"\n\tfor idx, entry := range b {\n\t\tif idx \u003e 0 {\n\t\t\toutput += \" / \"\n\t\t}\n\t\toutput += entry.String(dom)\n\t}\n\treturn output\n}\n\ntype Columns struct {\n\tMaxWidth int\n\tColumns []Element\n}\n\nfunc (c *Columns) Append(elems ...Element) {\n\tc.Columns = append(c.Columns, elems...)\n}\n\nfunc (c Columns) String(dom DOM) string {\n\toutput := `\u003cdiv class=\"columns-` + strconv.Itoa(c.MaxWidth) + `\"\u003e` + \"\\n\"\n\tfor _, entry := range c.Columns {\n\t\toutput += `\u003cdiv class=\"column\"\u003e` + \"\\n\\n\"\n\t\toutput += entry.String(dom)\n\t\toutput += \"\u003c/div\u003e\u003c!-- /column--\u003e\\n\"\n\t}\n\toutput += \"\u003c/div\u003e\u003c!-- /columns-\" + strconv.Itoa(c.MaxWidth) + \" --\u003e\\n\"\n\treturn output\n}\n\ntype Link struct {\n\tText string\n\tPath string\n\tURL string\n}\n\n// TODO: image\n\n// TODO: pager\n\nfunc (l Link) String(dom DOM) string {\n\turl := \"\"\n\tswitch {\n\tcase l.Path != \"\" \u0026\u0026 l.URL != \"\":\n\t\tpanic(\"a link should have a path or a URL, not both.\")\n\tcase l.Path != \"\":\n\t\tif l.Text == \"\" {\n\t\t\tl.Text = l.Path\n\t\t}\n\t\turl = dom.Prefix + l.Path\n\tcase l.URL != \"\":\n\t\tif l.Text == \"\" {\n\t\t\tl.Text = l.URL\n\t\t}\n\t\turl = l.URL\n\t}\n\n\treturn \"[\" + l.Text + \"](\" + url + \")\"\n}\n\ntype BulletList []DomStringer\n\nfunc (bl BulletList) String(dom DOM) string {\n\toutput := \"\"\n\n\tfor _, entry := range bl {\n\t\toutput += \"- \" + entry.String(dom) + \"\\n\"\n\t}\n\n\treturn output\n}\n\nfunc Text(s string) DomStringer {\n\treturn Raw{Content: s}\n}\n\ntype DomStringer interface {\n\tString(dom DOM) string\n}\n\ntype Raw struct {\n\tContent string\n}\n\nfunc (r Raw) String(_ DOM) string {\n\treturn r.Content\n}\n\ntype (\n\tH1 string\n\tH2 string\n\tH3 string\n\tH4 string\n\tH5 string\n\tH6 string\n\tBold string\n\tItalic string\n\tCode string\n\tParagraph string\n\tQuote string\n\tHR struct{}\n)\n\nfunc (text H1) String(_ DOM) string { return \"# \" + string(text) + \"\\n\" }\nfunc (text H2) String(_ DOM) string { return \"## \" + string(text) + \"\\n\" }\nfunc (text H3) String(_ DOM) string { return \"### \" + string(text) + \"\\n\" }\nfunc (text H4) String(_ DOM) string { return \"#### \" + string(text) + \"\\n\" }\nfunc (text H5) String(_ DOM) string { return \"##### \" + string(text) + \"\\n\" }\nfunc (text H6) String(_ DOM) string { return \"###### \" + string(text) + \"\\n\" }\nfunc (text Quote) String(_ DOM) string { return \"\u003e \" + string(text) + \"\\n\" }\nfunc (text Bold) String(_ DOM) string { return \"**\" + string(text) + \"**\" }\nfunc (text Italic) String(_ DOM) string { return \"_\" + string(text) + \"_\" }\nfunc (text Paragraph) String(_ DOM) string { return \"\\n\" + string(text) + \"\\n\" }\nfunc (_ HR) String(_ DOM) string { return \"\\n---\\n\" }\n\nfunc (text Code) String(_ DOM) string {\n\t// multiline\n\tif strings.Contains(string(text), \"\\n\") {\n\t\treturn \"\\n```\\n\" + string(text) + \"\\n```\\n\"\n\t}\n\n\t// single line\n\treturn \"`\" + string(text) + \"`\"\n}\n"},{"name":"ui_test.gno","body":"package ui\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"watchdog","path":"gno.land/p/demo/watchdog","files":[{"name":"watchdog.gno","body":"package watchdog\n\nimport \"time\"\n\ntype Watchdog struct {\n\tDuration time.Duration\n\tlastUpdate time.Time\n\tlastDown time.Time\n}\n\nfunc (w *Watchdog) Alive() {\n\tnow := time.Now()\n\tif !w.IsAlive() {\n\t\tw.lastDown = now\n\t}\n\tw.lastUpdate = now\n}\n\nfunc (w Watchdog) Status() string {\n\tif w.IsAlive() {\n\t\treturn \"OK\"\n\t}\n\treturn \"KO\"\n}\n\nfunc (w Watchdog) IsAlive() bool {\n\treturn time.Since(w.lastUpdate) \u003c w.Duration\n}\n\nfunc (w Watchdog) UpSince() time.Time {\n\treturn w.lastDown\n}\n\nfunc (w Watchdog) DownSince() time.Time {\n\tif !w.IsAlive() {\n\t\treturn w.lastUpdate\n\t}\n\treturn time.Time{}\n}\n"},{"name":"watchdog_test.gno","body":"package watchdog\n\nimport (\n\t\"testing\"\n\t\"time\"\n\n\t\"gno.land/p/demo/uassert\"\n)\n\nfunc TestPackage(t *testing.T) {\n\tw := Watchdog{Duration: 5 * time.Minute}\n\tuassert.False(t, w.IsAlive())\n\tw.Alive()\n\tuassert.True(t, w.IsAlive())\n\t// XXX: add more tests when we'll be able to \"skip time\".\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"proposal","path":"gno.land/p/gov/proposal","files":[{"name":"proposal.gno","body":"// Package proposal provides a structure for executing proposals.\npackage proposal\n\nimport (\n\t\"errors\"\n\t\"std\"\n\n\t\"gno.land/p/demo/context\"\n)\n\nvar errNotGovDAO = errors.New(\"only r/gov/dao can be the caller\")\n\n// NewExecutor creates a new executor with the provided callback function.\nfunc NewExecutor(callback func() error) Executor {\n\treturn \u0026executorImpl{\n\t\tcallback: callback,\n\t\tdone: false,\n\t}\n}\n\n// NewCtxExecutor creates a new executor with the provided callback function.\nfunc NewCtxExecutor(callback func(ctx context.Context) error) Executor {\n\treturn \u0026executorImpl{\n\t\tcallbackCtx: callback,\n\t\tdone: false,\n\t}\n}\n\n// executorImpl is an implementation of the Executor interface.\ntype executorImpl struct {\n\tcallback func() error\n\tcallbackCtx func(ctx context.Context) error\n\tdone bool\n\tsuccess bool\n}\n\n// Execute runs the executor's callback function.\nfunc (exec *executorImpl) Execute() error {\n\tif exec.done {\n\t\treturn ErrAlreadyDone\n\t}\n\n\t// Verify the executor is r/gov/dao\n\tassertCalledByGovdao()\n\n\tvar err error\n\tif exec.callback != nil {\n\t\terr = exec.callback()\n\t} else if exec.callbackCtx != nil {\n\t\tctx := context.WithValue(context.Empty(), statusContextKey, approvedStatus)\n\t\terr = exec.callbackCtx(ctx)\n\t}\n\texec.done = true\n\texec.success = err == nil\n\n\treturn err\n}\n\n// IsDone returns whether the executor has been executed.\nfunc (exec *executorImpl) IsDone() bool {\n\treturn exec.done\n}\n\n// IsSuccessful returns whether the execution was successful.\nfunc (exec *executorImpl) IsSuccessful() bool {\n\treturn exec.success\n}\n\n// IsExpired returns whether the execution had expired or not.\n// This implementation never expires.\nfunc (exec *executorImpl) IsExpired() bool {\n\treturn false\n}\n\nfunc IsApprovedByGovdaoContext(ctx context.Context) bool {\n\tv := ctx.Value(statusContextKey)\n\tif v == nil {\n\t\treturn false\n\t}\n\tvs, ok := v.(string)\n\treturn ok \u0026\u0026 vs == approvedStatus\n}\n\nfunc AssertContextApprovedByGovDAO(ctx context.Context) {\n\tif !IsApprovedByGovdaoContext(ctx) {\n\t\tpanic(\"not approved by govdao\")\n\t}\n}\n\n// assertCalledByGovdao asserts that the calling Realm is /r/gov/dao\nfunc assertCalledByGovdao() {\n\tcaller := std.CurrentRealm().PkgPath()\n\n\tif caller != daoPkgPath {\n\t\tpanic(errNotGovDAO)\n\t}\n}\n\ntype propContextKey string\n\nfunc (k propContextKey) String() string { return string(k) }\n\nconst (\n\tstatusContextKey = propContextKey(\"govdao-prop-status\")\n\tapprovedStatus = \"approved\"\n)\n"},{"name":"proposal_test.gno","body":"package proposal\n\nimport (\n\t\"errors\"\n\t\"std\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/uassert\"\n\t\"gno.land/p/demo/urequire\"\n)\n\nfunc TestExecutor(t *testing.T) {\n\tt.Parallel()\n\n\tverifyProposalFailed := func(e Executor) {\n\t\tuassert.True(t, e.IsDone(), \"expected proposal to be done\")\n\t\tuassert.False(t, e.IsSuccessful(), \"expected proposal to fail\")\n\t}\n\n\tverifyProposalSucceeded := func(e Executor) {\n\t\tuassert.True(t, e.IsDone(), \"expected proposal to be done\")\n\t\tuassert.True(t, e.IsSuccessful(), \"expected proposal to be successful\")\n\t}\n\n\tt.Run(\"govdao not caller\", func(t *testing.T) {\n\t\tt.Parallel()\n\n\t\tvar (\n\t\t\tcalled = false\n\n\t\t\tcb = func() error {\n\t\t\t\tcalled = true\n\n\t\t\t\treturn nil\n\t\t\t}\n\t\t)\n\n\t\t// Create the executor\n\t\te := NewExecutor(cb)\n\n\t\turequire.False(t, e.IsDone(), \"expected status to be NotExecuted\")\n\n\t\t// Execute as not the /r/gov/dao caller\n\t\tuassert.PanicsWithMessage(t, errNotGovDAO.Error(), func() {\n\t\t\t_ = e.Execute()\n\t\t})\n\n\t\tuassert.False(t, called, \"expected proposal to not execute\")\n\t})\n\n\tt.Run(\"execution successful\", func(t *testing.T) {\n\t\tt.Parallel()\n\n\t\tvar (\n\t\t\tcalled = false\n\n\t\t\tcb = func() error {\n\t\t\t\tcalled = true\n\n\t\t\t\treturn nil\n\t\t\t}\n\t\t)\n\n\t\t// Create the executor\n\t\te := NewExecutor(cb)\n\n\t\turequire.False(t, e.IsDone(), \"expected status to be NotExecuted\")\n\n\t\t// Execute as the /r/gov/dao caller\n\t\tr := std.NewCodeRealm(daoPkgPath)\n\t\tstd.TestSetRealm(r)\n\n\t\tuassert.NotPanics(t, func() {\n\t\t\terr := e.Execute()\n\n\t\t\tuassert.NoError(t, err)\n\t\t})\n\n\t\tuassert.True(t, called, \"expected proposal to execute\")\n\n\t\t// Make sure the execution params are correct\n\t\tverifyProposalSucceeded(e)\n\t})\n\n\tt.Run(\"execution unsuccessful\", func(t *testing.T) {\n\t\tt.Parallel()\n\n\t\tvar (\n\t\t\tcalled = false\n\t\t\texpectedErr = errors.New(\"unexpected\")\n\n\t\t\tcb = func() error {\n\t\t\t\tcalled = true\n\n\t\t\t\treturn expectedErr\n\t\t\t}\n\t\t)\n\n\t\t// Create the executor\n\t\te := NewExecutor(cb)\n\n\t\t// Execute as the /r/gov/dao caller\n\t\tr := std.NewCodeRealm(daoPkgPath)\n\t\tstd.TestSetRealm(r)\n\n\t\tuassert.NotPanics(t, func() {\n\t\t\terr := e.Execute()\n\n\t\t\tuassert.ErrorIs(t, err, expectedErr)\n\t\t})\n\n\t\tuassert.True(t, called, \"expected proposal to execute\")\n\n\t\t// Make sure the execution params are correct\n\t\tverifyProposalFailed(e)\n\t})\n\n\tt.Run(\"proposal already executed\", func(t *testing.T) {\n\t\tt.Parallel()\n\n\t\tvar (\n\t\t\tcalled = false\n\n\t\t\tcb = func() error {\n\t\t\t\tcalled = true\n\n\t\t\t\treturn nil\n\t\t\t}\n\t\t)\n\n\t\t// Create the executor\n\t\te := NewExecutor(cb)\n\n\t\turequire.False(t, e.IsDone(), \"expected status to be NotExecuted\")\n\n\t\t// Execute as the /r/gov/dao caller\n\t\tr := std.NewCodeRealm(daoPkgPath)\n\t\tstd.TestSetRealm(r)\n\n\t\tuassert.NotPanics(t, func() {\n\t\t\tuassert.NoError(t, e.Execute())\n\t\t})\n\n\t\tuassert.True(t, called, \"expected proposal to execute\")\n\n\t\t// Make sure the execution params are correct\n\t\tverifyProposalSucceeded(e)\n\n\t\t// Attempt to execute the proposal again\n\t\tuassert.NotPanics(t, func() {\n\t\t\terr := e.Execute()\n\n\t\t\tuassert.ErrorIs(t, err, ErrAlreadyDone)\n\t\t})\n\t})\n}\n"},{"name":"types.gno","body":"// Package proposal defines types for proposal execution.\npackage proposal\n\nimport \"errors\"\n\n// Executor represents a minimal closure-oriented proposal design.\n// It is intended to be used by a govdao governance proposal (v1, v2, etc).\ntype Executor interface {\n\t// Execute executes the given proposal, and returns any error encountered\n\t// during the execution\n\tExecute() error\n\n\t// IsDone returns a flag indicating if the proposal was executed\n\tIsDone() bool\n\n\t// IsSuccessful returns a flag indicating if the proposal was executed\n\t// and is successful\n\tIsSuccessful() bool // IsDone() \u0026\u0026 !err\n\n\t// IsExpired returns whether the execution had expired or not.\n\tIsExpired() bool\n}\n\n// ErrAlreadyDone is the error returned when trying to execute an already\n// executed proposal.\nvar ErrAlreadyDone = errors.New(\"already executed\")\n\n// Status enum.\ntype Status string\n\nconst (\n\tNotExecuted Status = \"not_executed\"\n\tSucceeded Status = \"succeeded\"\n\tFailed Status = \"failed\"\n)\n\nconst daoPkgPath = \"gno.land/r/gov/dao\" // TODO: make sure this is configurable through r/sys/vars\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"printfdebugging","path":"gno.land/p/demo/printfdebugging","files":[{"name":"color.gno","body":"package printfdebugging\n\n// consts copied from https://github.com/fatih/color/blob/main/color.go\n\n// Attribute defines a single SGR Code\ntype Attribute int\n\nconst Escape = \"\\x1b\"\n\n// Base attributes\nconst (\n\tReset Attribute = iota\n\tBold\n\tFaint\n\tItalic\n\tUnderline\n\tBlinkSlow\n\tBlinkRapid\n\tReverseVideo\n\tConcealed\n\tCrossedOut\n)\n\nconst (\n\tResetBold Attribute = iota + 22\n\tResetItalic\n\tResetUnderline\n\tResetBlinking\n\t_\n\tResetReversed\n\tResetConcealed\n\tResetCrossedOut\n)\n\n// Foreground text colors\nconst (\n\tFgBlack Attribute = iota + 30\n\tFgRed\n\tFgGreen\n\tFgYellow\n\tFgBlue\n\tFgMagenta\n\tFgCyan\n\tFgWhite\n)\n\n// Foreground Hi-Intensity text colors\nconst (\n\tFgHiBlack Attribute = iota + 90\n\tFgHiRed\n\tFgHiGreen\n\tFgHiYellow\n\tFgHiBlue\n\tFgHiMagenta\n\tFgHiCyan\n\tFgHiWhite\n)\n\n// Background text colors\nconst (\n\tBgBlack Attribute = iota + 40\n\tBgRed\n\tBgGreen\n\tBgYellow\n\tBgBlue\n\tBgMagenta\n\tBgCyan\n\tBgWhite\n)\n\n// Background Hi-Intensity text colors\nconst (\n\tBgHiBlack Attribute = iota + 100\n\tBgHiRed\n\tBgHiGreen\n\tBgHiYellow\n\tBgHiBlue\n\tBgHiMagenta\n\tBgHiCyan\n\tBgHiWhite\n)\n"},{"name":"printfdebugging.gno","body":"// this package is a joke... or not.\npackage printfdebugging\n\nimport (\n\t\"strings\"\n\n\t\"gno.land/p/demo/ufmt\"\n)\n\nfunc BigRedLine(args ...string) {\n\tprintln(ufmt.Sprintf(\"%s[%dm####################################%s[%dm %s\",\n\t\tEscape, int(BgRed), Escape, int(Reset),\n\t\tstrings.Join(args, \" \"),\n\t))\n}\n\nfunc Success() {\n\tprintln(\" \\033[31mS\\033[33mU\\033[32mC\\033[36mC\\033[34mE\\033[35mS\\033[31mS\\033[0m \")\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"validators","path":"gno.land/p/sys/validators","files":[{"name":"types.gno","body":"package validators\n\nimport (\n\t\"errors\"\n\t\"std\"\n)\n\n// ValsetProtocol defines the validator set protocol (PoA / PoS / PoC / ?)\ntype ValsetProtocol interface {\n\t// AddValidator adds a new validator to the validator set.\n\t// If the validator is already present, the method should error out\n\t//\n\t// TODO: This API is not ideal -- the address should be derived from\n\t// the public key, and not be passed in as such, but currently Gno\n\t// does not support crypto address derivation\n\tAddValidator(address std.Address, pubKey string, power uint64) (Validator, error)\n\n\t// RemoveValidator removes the given validator from the set.\n\t// If the validator is not present in the set, the method should error out\n\tRemoveValidator(address std.Address) (Validator, error)\n\n\t// IsValidator returns a flag indicating if the given\n\t// bech32 address is part of the validator set\n\tIsValidator(address std.Address) bool\n\n\t// GetValidator returns the validator using the given address\n\tGetValidator(address std.Address) (Validator, error)\n\n\t// GetValidators returns the currently active validator set\n\tGetValidators() []Validator\n}\n\n// Validator represents a single chain validator\ntype Validator struct {\n\tAddress std.Address // bech32 address\n\tPubKey string // bech32 representation of the public key\n\tVotingPower uint64\n}\n\nconst (\n\tValidatorAddedEvent = \"ValidatorAdded\" // emitted when a validator was added to the set\n\tValidatorRemovedEvent = \"ValidatorRemoved\" // emitted when a validator was removed from the set\n)\n\nvar (\n\t// ErrValidatorExists is returned when the validator is already in the set\n\tErrValidatorExists = errors.New(\"validator already exists\")\n\n\t// ErrValidatorMissing is returned when the validator is not in the set\n\tErrValidatorMissing = errors.New(\"validator doesn't exist\")\n)\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"poa","path":"gno.land/p/nt/poa","files":[{"name":"option.gno","body":"package poa\n\nimport \"gno.land/p/sys/validators\"\n\ntype Option func(*PoA)\n\n// WithInitialSet sets the initial PoA validator set\nfunc WithInitialSet(validators []validators.Validator) Option {\n\treturn func(p *PoA) {\n\t\tfor _, validator := range validators {\n\t\t\tp.validators.Set(validator.Address.String(), validator)\n\t\t}\n\t}\n}\n"},{"name":"poa.gno","body":"package poa\n\nimport (\n\t\"errors\"\n\t\"std\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/sys/validators\"\n)\n\nvar ErrInvalidVotingPower = errors.New(\"invalid voting power\")\n\n// PoA specifies the Proof of Authority validator set, with simple add / remove constraints.\n//\n// To add:\n// - proposed validator must not be part of the set already\n// - proposed validator voting power must be \u003e 0\n//\n// To remove:\n// - proposed validator must be part of the set already\ntype PoA struct {\n\tvalidators *avl.Tree // std.Address -\u003e validators.Validator\n}\n\n// NewPoA creates a new empty Proof of Authority validator set\nfunc NewPoA(opts ...Option) *PoA {\n\t// Create the empty set\n\tp := \u0026PoA{\n\t\tvalidators: avl.NewTree(),\n\t}\n\n\t// Apply the options\n\tfor _, opt := range opts {\n\t\topt(p)\n\t}\n\n\treturn p\n}\n\nfunc (p *PoA) AddValidator(address std.Address, pubKey string, power uint64) (validators.Validator, error) {\n\t// Validate that the operation is a valid call.\n\t// Check if the validator is already in the set\n\tif p.IsValidator(address) {\n\t\treturn validators.Validator{}, validators.ErrValidatorExists\n\t}\n\n\t// Make sure the voting power \u003e 0\n\tif power == 0 {\n\t\treturn validators.Validator{}, ErrInvalidVotingPower\n\t}\n\n\tv := validators.Validator{\n\t\tAddress: address,\n\t\tPubKey: pubKey, // TODO: in the future, verify the public key\n\t\tVotingPower: power,\n\t}\n\n\t// Add the validator to the set\n\tp.validators.Set(address.String(), v)\n\n\treturn v, nil\n}\n\nfunc (p *PoA) RemoveValidator(address std.Address) (validators.Validator, error) {\n\t// Validate that the operation is a valid call\n\t// Fetch the validator\n\tvalidator, err := p.GetValidator(address)\n\tif err != nil {\n\t\treturn validators.Validator{}, err\n\t}\n\n\t// Remove the validator from the set\n\tp.validators.Remove(address.String())\n\n\treturn validator, nil\n}\n\nfunc (p *PoA) IsValidator(address std.Address) bool {\n\t_, exists := p.validators.Get(address.String())\n\n\treturn exists\n}\n\nfunc (p *PoA) GetValidator(address std.Address) (validators.Validator, error) {\n\tvalidatorRaw, exists := p.validators.Get(address.String())\n\tif !exists {\n\t\treturn validators.Validator{}, validators.ErrValidatorMissing\n\t}\n\n\tvalidator := validatorRaw.(validators.Validator)\n\n\treturn validator, nil\n}\n\nfunc (p *PoA) GetValidators() []validators.Validator {\n\tvals := make([]validators.Validator, 0, p.validators.Size())\n\n\tp.validators.Iterate(\"\", \"\", func(_ string, value interface{}) bool {\n\t\tvalidator := value.(validators.Validator)\n\t\tvals = append(vals, validator)\n\n\t\treturn false\n\t})\n\n\treturn vals\n}\n"},{"name":"poa_test.gno","body":"package poa\n\nimport (\n\t\"testing\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/p/demo/uassert\"\n\t\"gno.land/p/demo/urequire\"\n\t\"gno.land/p/sys/validators\"\n\n\t\"gno.land/p/demo/ufmt\"\n)\n\n// generateTestValidators generates a dummy validator set\nfunc generateTestValidators(count int) []validators.Validator {\n\tvals := make([]validators.Validator, 0, count)\n\n\tfor i := 0; i \u003c count; i++ {\n\t\tval := validators.Validator{\n\t\t\tAddress: testutils.TestAddress(ufmt.Sprintf(\"%d\", i)),\n\t\t\tPubKey: \"public-key\",\n\t\t\tVotingPower: 1,\n\t\t}\n\n\t\tvals = append(vals, val)\n\t}\n\n\treturn vals\n}\n\nfunc TestPoA_AddValidator_Invalid(t *testing.T) {\n\tt.Parallel()\n\n\tt.Run(\"validator already in set\", func(t *testing.T) {\n\t\tt.Parallel()\n\n\t\tvar (\n\t\t\tproposalAddress = testutils.TestAddress(\"caller\")\n\t\t\tproposalKey = \"public-key\"\n\n\t\t\tinitialSet = generateTestValidators(1)\n\t\t)\n\n\t\tinitialSet[0].Address = proposalAddress\n\t\tinitialSet[0].PubKey = proposalKey\n\n\t\t// Create the protocol with an initial set\n\t\tp := NewPoA(WithInitialSet(initialSet))\n\n\t\t// Attempt to add the validator\n\t\t_, err := p.AddValidator(proposalAddress, proposalKey, 1)\n\t\tuassert.ErrorIs(t, err, validators.ErrValidatorExists)\n\t})\n\n\tt.Run(\"invalid voting power\", func(t *testing.T) {\n\t\tt.Parallel()\n\n\t\tvar (\n\t\t\tproposalAddress = testutils.TestAddress(\"caller\")\n\t\t\tproposalKey = \"public-key\"\n\t\t)\n\n\t\t// Create the protocol with no initial set\n\t\tp := NewPoA()\n\n\t\t// Attempt to add the validator\n\t\t_, err := p.AddValidator(proposalAddress, proposalKey, 0)\n\t\tuassert.ErrorIs(t, err, ErrInvalidVotingPower)\n\t})\n}\n\nfunc TestPoA_AddValidator(t *testing.T) {\n\tt.Parallel()\n\n\tvar (\n\t\tproposalAddress = testutils.TestAddress(\"caller\")\n\t\tproposalKey = \"public-key\"\n\t)\n\n\t// Create the protocol with no initial set\n\tp := NewPoA()\n\n\t// Attempt to add the validator\n\t_, err := p.AddValidator(proposalAddress, proposalKey, 1)\n\tuassert.NoError(t, err)\n\n\t// Make sure the validator is added\n\tif !p.IsValidator(proposalAddress) || p.validators.Size() != 1 {\n\t\tt.Fatal(\"address is not validator\")\n\t}\n}\n\nfunc TestPoA_RemoveValidator_Invalid(t *testing.T) {\n\tt.Parallel()\n\n\tt.Run(\"proposed removal not in set\", func(t *testing.T) {\n\t\tt.Parallel()\n\n\t\tvar (\n\t\t\tproposalAddress = testutils.TestAddress(\"caller\")\n\t\t\tinitialSet = generateTestValidators(1)\n\t\t)\n\n\t\tinitialSet[0].Address = proposalAddress\n\n\t\t// Create the protocol with an initial set\n\t\tp := NewPoA(WithInitialSet(initialSet))\n\n\t\t// Attempt to remove the validator\n\t\t_, err := p.RemoveValidator(testutils.TestAddress(\"totally random\"))\n\t\tuassert.ErrorIs(t, err, validators.ErrValidatorMissing)\n\t})\n}\n\nfunc TestPoA_RemoveValidator(t *testing.T) {\n\tt.Parallel()\n\n\tvar (\n\t\tproposalAddress = testutils.TestAddress(\"caller\")\n\t\tinitialSet = generateTestValidators(1)\n\t)\n\n\tinitialSet[0].Address = proposalAddress\n\n\t// Create the protocol with an initial set\n\tp := NewPoA(WithInitialSet(initialSet))\n\n\t// Attempt to remove the validator\n\t_, err := p.RemoveValidator(proposalAddress)\n\turequire.NoError(t, err)\n\n\t// Make sure the validator is removed\n\tif p.IsValidator(proposalAddress) || p.validators.Size() != 0 {\n\t\tt.Fatal(\"address is validator\")\n\t}\n}\n\nfunc TestPoA_GetValidator(t *testing.T) {\n\tt.Parallel()\n\n\tt.Run(\"validator not in set\", func(t *testing.T) {\n\t\tt.Parallel()\n\n\t\t// Create the protocol with no initial set\n\t\tp := NewPoA()\n\n\t\t// Attempt to get the voting power\n\t\t_, err := p.GetValidator(testutils.TestAddress(\"caller\"))\n\t\tuassert.ErrorIs(t, err, validators.ErrValidatorMissing)\n\t})\n\n\tt.Run(\"validator fetched\", func(t *testing.T) {\n\t\tt.Parallel()\n\n\t\tvar (\n\t\t\taddress = testutils.TestAddress(\"caller\")\n\t\t\tpubKey = \"public-key\"\n\t\t\tvotingPower = uint64(10)\n\n\t\t\tinitialSet = generateTestValidators(1)\n\t\t)\n\n\t\tinitialSet[0].Address = address\n\t\tinitialSet[0].PubKey = pubKey\n\t\tinitialSet[0].VotingPower = votingPower\n\n\t\t// Create the protocol with an initial set\n\t\tp := NewPoA(WithInitialSet(initialSet))\n\n\t\t// Get the validator\n\t\tval, err := p.GetValidator(address)\n\t\turequire.NoError(t, err)\n\n\t\t// Validate the address\n\t\tif val.Address != address {\n\t\t\tt.Fatal(\"invalid address\")\n\t\t}\n\n\t\t// Validate the voting power\n\t\tif val.VotingPower != votingPower {\n\t\t\tt.Fatal(\"invalid voting power\")\n\t\t}\n\n\t\t// Validate the public key\n\t\tif val.PubKey != pubKey {\n\t\t\tt.Fatal(\"invalid public key\")\n\t\t}\n\t})\n}\n\nfunc TestPoA_GetValidators(t *testing.T) {\n\tt.Parallel()\n\n\tt.Run(\"empty set\", func(t *testing.T) {\n\t\tt.Parallel()\n\n\t\t// Create the protocol with no initial set\n\t\tp := NewPoA()\n\n\t\t// Attempt to get the voting power\n\t\tvals := p.GetValidators()\n\n\t\tif len(vals) != 0 {\n\t\t\tt.Fatal(\"validator set is not empty\")\n\t\t}\n\t})\n\n\tt.Run(\"validator set fetched\", func(t *testing.T) {\n\t\tt.Parallel()\n\n\t\tinitialSet := generateTestValidators(10)\n\n\t\t// Create the protocol with an initial set\n\t\tp := NewPoA(WithInitialSet(initialSet))\n\n\t\t// Get the validator set\n\t\tvals := p.GetValidators()\n\n\t\tif len(vals) != len(initialSet) {\n\t\t\tt.Fatal(\"returned validator set mismatch\")\n\t\t}\n\n\t\tfor _, val := range vals {\n\t\t\tfor _, initialVal := range initialSet {\n\t\t\t\tif val.Address != initialVal.Address {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\t// Validate the voting power\n\t\t\t\tuassert.Equal(t, val.VotingPower, initialVal.VotingPower)\n\n\t\t\t\t// Validate the public key\n\t\t\t\tuassert.Equal(t, val.PubKey, initialVal.PubKey)\n\t\t\t}\n\t\t}\n\t})\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"gnoface","path":"gno.land/r/demo/art/gnoface","files":[{"name":"gnoface.gno","body":"package gnoface\n\nimport (\n\t\"math/rand\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/entropy\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nfunc Render(path string) string {\n\tseed := uint64(entropy.New().Value())\n\n\tpath = strings.TrimSpace(path)\n\tif path != \"\" {\n\t\ts, err := strconv.Atoi(path)\n\t\tif err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t\tseed = uint64(s)\n\t}\n\n\toutput := ufmt.Sprintf(\"Gnoface #%d\\n\", seed)\n\toutput += \"```\\n\" + Draw(seed) + \"```\\n\"\n\treturn output\n}\n\nfunc Draw(seed uint64) string {\n\tvar (\n\t\thairs = []string{\n\t\t\t\" s\",\n\t\t\t\" .......\",\n\t\t\t\" s s s\",\n\t\t\t\" /\\\\ /\\\\\",\n\t\t\t\" |||||||\",\n\t\t}\n\t\theadtop = []string{\n\t\t\t\" /-------\\\\\",\n\t\t\t\" /~~~~~~~\\\\\",\n\t\t\t\" /|||||||\\\\\",\n\t\t\t\" ////////\\\\\",\n\t\t\t\" |||||||||\",\n\t\t\t\" /\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\",\n\t\t}\n\t\theadspace = []string{\n\t\t\t\" | |\",\n\t\t}\n\t\teyebrow = []string{\n\t\t\t\"~\",\n\t\t\t\"*\",\n\t\t\t\"_\",\n\t\t\t\".\",\n\t\t}\n\t\tear = []string{\n\t\t\t\"o\",\n\t\t\t\" \",\n\t\t\t\"D\",\n\t\t\t\"O\",\n\t\t\t\"\u003c\",\n\t\t\t\"\u003e\",\n\t\t\t\".\",\n\t\t\t\"|\",\n\t\t\t\")\",\n\t\t\t\"(\",\n\t\t}\n\t\teyesmiddle = []string{\n\t\t\t\"| o o |\",\n\t\t\t\"| o _ |\",\n\t\t\t\"| _ o |\",\n\t\t\t\"| . . |\",\n\t\t\t\"| O O |\",\n\t\t\t\"| v v |\",\n\t\t\t\"| X X |\",\n\t\t\t\"| x X |\",\n\t\t\t\"| X D |\",\n\t\t\t\"| ~ ~ |\",\n\t\t}\n\t\tnose = []string{\n\t\t\t\" | o |\",\n\t\t\t\" | O |\",\n\t\t\t\" | V |\",\n\t\t\t\" | L |\",\n\t\t\t\" | C |\",\n\t\t\t\" | ~ |\",\n\t\t\t\" | . . |\",\n\t\t\t\" | . |\",\n\t\t}\n\t\tmouth = []string{\n\t\t\t\" | __/ |\",\n\t\t\t\" | \\\\_/ |\",\n\t\t\t\" | . |\",\n\t\t\t\" | ___ |\",\n\t\t\t\" | ~~~ |\",\n\t\t\t\" | === |\",\n\t\t\t\" | \u003c=\u003e |\",\n\t\t}\n\t\theadbottom = []string{\n\t\t\t\" \\\\-------/\",\n\t\t\t\" \\\\~~~~~~~/\",\n\t\t\t\" \\\\_______/\",\n\t\t}\n\t)\n\n\tr := rand.New(rand.NewPCG(seed, 0xdeadbeef))\n\n\treturn pick(r, hairs) + \"\\n\" +\n\t\tpick(r, headtop) + \"\\n\" +\n\t\tpick(r, headspace) + \"\\n\" +\n\t\t\" | \" + pick(r, eyebrow) + \" \" + pick(r, eyebrow) + \" |\\n\" +\n\t\tpick(r, ear) + pick(r, eyesmiddle) + pick(r, ear) + \"\\n\" +\n\t\tpick(r, headspace) + \"\\n\" +\n\t\tpick(r, nose) + \"\\n\" +\n\t\tpick(r, headspace) + \"\\n\" +\n\t\tpick(r, mouth) + \"\\n\" +\n\t\tpick(r, headspace) + \"\\n\" +\n\t\tpick(r, headbottom) + \"\\n\"\n}\n\nfunc pick(r *rand.Rand, slice []string) string {\n\treturn slice[r.IntN(len(slice))]\n}\n\n// based on https://github.com/moul/pipotron/blob/master/dict/ascii-face.yml\n"},{"name":"gnoface_test.gno","body":"package gnoface\n\nimport (\n\t\"testing\"\n\n\t\"gno.land/p/demo/uassert\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nfunc TestDraw(t *testing.T) {\n\tcases := []struct {\n\t\tseed uint64\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tseed: 42,\n\t\t\texpected: `\n |||||||\n |||||||||\n | |\n | . ~ |\n)| v v |O\n | |\n | L |\n | |\n | ___ |\n | |\n \\~~~~~~~/\n`[1:],\n\t\t},\n\t\t{\n\t\t\tseed: 1337,\n\t\t\texpected: `\n .......\n |||||||||\n | |\n | . _ |\nD| x X |O\n | |\n | ~ |\n | |\n | ~~~ |\n | |\n \\~~~~~~~/\n`[1:],\n\t\t},\n\t\t{\n\t\t\tseed: 123456789,\n\t\t\texpected: `\n .......\n ////////\\\n | |\n | ~ * |\n|| x X |o\n | |\n | V |\n | |\n | . |\n | |\n \\-------/\n`[1:],\n\t\t},\n\t}\n\tfor _, tc := range cases {\n\t\tname := ufmt.Sprintf(\"%d\", tc.seed)\n\t\tt.Run(name, func(t *testing.T) {\n\t\t\tgot := Draw(tc.seed)\n\t\t\tuassert.Equal(t, string(tc.expected), got)\n\t\t})\n\t}\n}\n\nfunc TestRender(t *testing.T) {\n\tcases := []struct {\n\t\tpath string\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tpath: \"42\",\n\t\t\texpected: \"Gnoface #42\\n```\" + `\n |||||||\n |||||||||\n | |\n | . ~ |\n)| v v |O\n | |\n | L |\n | |\n | ___ |\n | |\n \\~~~~~~~/\n` + \"```\\n\",\n\t\t},\n\t\t{\n\t\t\tpath: \"1337\",\n\t\t\texpected: \"Gnoface #1337\\n```\" + `\n .......\n |||||||||\n | |\n | . _ |\nD| x X |O\n | |\n | ~ |\n | |\n | ~~~ |\n | |\n \\~~~~~~~/\n` + \"```\\n\",\n\t\t},\n\t\t{\n\t\t\tpath: \"123456789\",\n\t\t\texpected: \"Gnoface #123456789\\n```\" + `\n .......\n ////////\\\n | |\n | ~ * |\n|| x X |o\n | |\n | V |\n | |\n | . |\n | |\n \\-------/\n` + \"```\\n\",\n\t\t},\n\t}\n\tfor _, tc := range cases {\n\t\tt.Run(tc.path, func(t *testing.T) {\n\t\t\tgot := Render(tc.path)\n\t\t\tuassert.Equal(t, tc.expected, got)\n\t\t})\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"millipede","path":"gno.land/r/demo/art/millipede","files":[{"name":"millipede.gno","body":"package millipede\n\nimport (\n\t\"strconv\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/ufmt\"\n)\n\nconst (\n\tminSize = 1\n\tdefaultSize = 20\n\tmaxSize = 100\n)\n\nfunc Draw(size int) string {\n\tif size \u003c minSize || size \u003e maxSize {\n\t\tpanic(\"invalid millipede size\")\n\t}\n\tpaddings := []string{\" \", \" \", \"\", \" \", \" \", \" \", \" \", \" \", \" \"}\n\tvar b strings.Builder\n\tb.WriteString(\" ╚⊙ ⊙╝\\n\")\n\tfor i := 0; i \u003c size; i++ {\n\t\tb.WriteString(paddings[i%9] + \"╚═(███)═╝\\n\")\n\t}\n\treturn b.String()\n}\n\nfunc Render(path string) string {\n\tsize := defaultSize\n\n\tpath = strings.TrimSpace(path)\n\tif path != \"\" {\n\t\tvar err error\n\t\tsize, err = strconv.Atoi(path)\n\t\tif err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t}\n\n\toutput := \"```\\n\" + Draw(size) + \"```\\n\"\n\tif size \u003e minSize {\n\t\toutput += ufmt.Sprintf(\"[%d](/r/demo/art/millipede:%d)\u003c \", size-1, size-1)\n\t}\n\tif size \u003c maxSize {\n\t\toutput += ufmt.Sprintf(\" \u003e[%d](/r/demo/art/millipede:%d)\", size+1, size+1)\n\t}\n\treturn output\n}\n\n// based on https://github.com/getmillipede/millipede-go/blob/977f046c39c35a650eac0fd30245e96b22c7803c/main.go\n"},{"name":"millipede_test.gno","body":"package millipede\n\nimport (\n\t\"testing\"\n\n\t\"gno.land/p/demo/uassert\"\n)\n\nfunc TestRender(t *testing.T) {\n\tcases := []struct {\n\t\tpath string\n\t\texpected string\n\t}{\n\t\t{\n\t\t\tpath: \"\",\n\t\t\texpected: \"```\" + `\n ╚⊙ ⊙╝\n ╚═(███)═╝\n ╚═(███)═╝\n╚═(███)═╝\n ╚═(███)═╝\n ╚═(███)═╝\n ╚═(███)═╝\n ╚═(███)═╝\n ╚═(███)═╝\n ╚═(███)═╝\n ╚═(███)═╝\n ╚═(███)═╝\n╚═(███)═╝\n ╚═(███)═╝\n ╚═(███)═╝\n ╚═(███)═╝\n ╚═(███)═╝\n ╚═(███)═╝\n ╚═(███)═╝\n ╚═(███)═╝\n ╚═(███)═╝\n` + \"```\\n[19](/r/demo/art/millipede:19)\u003c \u003e[21](/r/demo/art/millipede:21)\",\n\t\t},\n\t\t{\n\t\t\tpath: \"4\",\n\t\t\texpected: \"```\" + `\n ╚⊙ ⊙╝\n ╚═(███)═╝\n ╚═(███)═╝\n╚═(███)═╝\n ╚═(███)═╝\n` + \"```\\n[3](/r/demo/art/millipede:3)\u003c \u003e[5](/r/demo/art/millipede:5)\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.path, func(t *testing.T) {\n\t\t\tgot := Render(tc.path)\n\t\t\tuassert.Equal(t, tc.expected, got)\n\t\t})\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"banktest","path":"gno.land/r/demo/banktest","files":[{"name":"README.md","body":"This is a simple test realm contract that demonstrates how to use the banker.\n\nSee [gno.land/r/demo/banktest/banktest.go](/r/demo/banktest/banktest.go) to see the original contract code.\n\nThis article will go through each line to explain how it works.\n\n```go\npackage banktest\n```\n\nThis package is locally named \"banktest\" (could be anything).\n\n```go\nimport (\n \"std\"\n)\n```\n\nThe \"std\" package is defined by the gno code in stdlibs/std/. \u003c/br\u003e Self explanatory; and you'll see more usage from std later.\n\n```go\ntype activity struct {\n caller std.Address\n sent std.Coins\n returned std.Coins\n time time.Time\n}\n\nfunc (act *activity) String() string {\n return act.caller.String() + \" \" +\n act.sent.String() + \" sent, \" +\n act.returned.String() + \" returned, at \" +\n act.time.Format(\"2006-01-02 3:04pm MST\")\n}\n\nvar latest [10]*activity\n```\n\nThis is just maintaining a list of recent activity to this contract. Notice that the \"latest\" variable is defined \"globally\" within the context of the realm with path \"gno.land/r/demo/banktest\".\n\nThis means that calls to functions defined within this package are encapsulated within this \"data realm\", where the data is mutated based on transactions that can potentially cross many realm and non-realm package boundaries (in the call stack).\n\n```go\n// Deposit will take the coins (to the realm's pkgaddr) or return them to user.\nfunc Deposit(returnDenom string, returnAmount int64) string {\n std.AssertOriginCall()\n caller := std.GetOrigCaller()\n send := std.Coins{{returnDenom, returnAmount}}\n```\n\nThis is the beginning of the definition of the contract function named \"Deposit\". `std.AssertOriginCall() asserts that this function was called by a gno transactional Message. The caller is the user who signed off on this transactional message. Send is the amount of deposit sent along with this message.\n\n```go\n // record activity\n act := \u0026activity{\n caller: caller,\n sent: std.GetOrigSend(),\n returned: send,\n time: time.Now(),\n }\n for i := len(latest) - 2; i \u003e= 0; i-- {\n latest[i+1] = latest[i] // shift by +1.\n }\n latest[0] = act\n```\n\nUpdating the \"latest\" array for viewing at gno.land/r/demo/banktest: (w/ trailing colon).\n\n```go\n // return if any.\n if returnAmount \u003e 0 {\n```\n\nIf the user requested the return of coins...\n\n```go\n banker := std.GetBanker(std.BankerTypeOrigSend)\n```\n\nuse a std.Banker instance to return any deposited coins to the original sender.\n\n```go\n pkgaddr := std.GetOrigPkgAddr()\n // TODO: use std.Coins constructors, this isn't generally safe.\n banker.SendCoins(pkgaddr, caller, send)\n return \"returned!\"\n```\n\nNotice that each realm package has an associated Cosmos address.\n\nFinally, the results are rendered via an ABCI query call when you visit [/r/demo/banktest:](/r/demo/banktest:).\n\n```go\nfunc Render(path string) string {\n // get realm coins.\n banker := std.GetBanker(std.BankerTypeReadonly)\n coins := banker.GetCoins(std.GetOrigPkgAddr())\n\n // render\n res := \"\"\n res += \"## recent activity\\n\"\n res += \"\\n\"\n for _, act := range latest {\n if act == nil {\n break\n }\n res += \" * \" + act.String() + \"\\n\"\n }\n res += \"\\n\"\n res += \"## total deposits\\n\"\n res += coins.String()\n return res\n}\n```\n\nYou can call this contract yourself, by vistiing [/r/demo/banktest](/r/demo/banktest) and the [quickstart guide](/r/demo/boards:gnolang/4).\n"},{"name":"banktest.gno","body":"package banktest\n\nimport (\n\t\"std\"\n\t\"time\"\n)\n\ntype activity struct {\n\tcaller std.Address\n\tsent std.Coins\n\treturned std.Coins\n\ttime time.Time\n}\n\nfunc (act *activity) String() string {\n\treturn act.caller.String() + \" \" +\n\t\tact.sent.String() + \" sent, \" +\n\t\tact.returned.String() + \" returned, at \" +\n\t\tact.time.Format(\"2006-01-02 3:04pm MST\")\n}\n\nvar latest [10]*activity\n\n// Deposit will take the coins (to the realm's pkgaddr) or return them to user.\nfunc Deposit(returnDenom string, returnAmount int64) string {\n\tstd.AssertOriginCall()\n\tcaller := std.GetOrigCaller()\n\tsend := std.Coins{{returnDenom, returnAmount}}\n\t// record activity\n\tact := \u0026activity{\n\t\tcaller: caller,\n\t\tsent: std.GetOrigSend(),\n\t\treturned: send,\n\t\ttime: time.Now(),\n\t}\n\tfor i := len(latest) - 2; i \u003e= 0; i-- {\n\t\tlatest[i+1] = latest[i] // shift by +1.\n\t}\n\tlatest[0] = act\n\t// return if any.\n\tif returnAmount \u003e 0 {\n\t\tbanker := std.GetBanker(std.BankerTypeOrigSend)\n\t\tpkgaddr := std.GetOrigPkgAddr()\n\t\t// TODO: use std.Coins constructors, this isn't generally safe.\n\t\tbanker.SendCoins(pkgaddr, caller, send)\n\t\treturn \"returned!\"\n\t} else {\n\t\treturn \"thank you!\"\n\t}\n}\n\nfunc Render(path string) string {\n\t// get realm coins.\n\tbanker := std.GetBanker(std.BankerTypeReadonly)\n\tcoins := banker.GetCoins(std.GetOrigPkgAddr())\n\n\t// render\n\tres := \"\"\n\tres += \"## recent activity\\n\"\n\tres += \"\\n\"\n\tfor _, act := range latest {\n\t\tif act == nil {\n\t\t\tbreak\n\t\t}\n\t\tres += \" * \" + act.String() + \"\\n\"\n\t}\n\tres += \"\\n\"\n\tres += \"## total deposits\\n\"\n\tres += coins.String()\n\treturn res\n}\n"},{"name":"z_0_filetest.gno","body":"// SEND: 100000000ugnot\n\npackage main\n\nimport (\n\t\"std\"\n\n\t\"gno.land/r/demo/banktest\"\n)\n\nfunc main() {\n\t// set up main address and banktest addr.\n\tbanktestAddr := std.DerivePkgAddr(\"gno.land/r/demo/banktest\")\n\tmainaddr := std.DerivePkgAddr(\"main\")\n\tstd.TestSetOrigCaller(mainaddr)\n\tstd.TestSetOrigPkgAddr(banktestAddr)\n\n\t// get and print balance of mainaddr.\n\t// with the SEND, + 200 gnot given by the TestContext, main should have 300gnot.\n\tbanker := std.GetBanker(std.BankerTypeRealmSend)\n\tmainbal := banker.GetCoins(mainaddr)\n\tprintln(\"main before:\", mainbal)\n\n\t// simulate a Deposit call. use Send + OrigSend to simulate -send.\n\tbanker.SendCoins(mainaddr, banktestAddr, std.Coins{{\"ugnot\", 100_000_000}})\n\tstd.TestSetOrigSend(std.Coins{{\"ugnot\", 100_000_000}}, nil)\n\tres := banktest.Deposit(\"ugnot\", 50_000_000)\n\tprintln(\"Deposit():\", res)\n\n\t// print main balance after.\n\tmainbal = banker.GetCoins(mainaddr)\n\tprintln(\"main after:\", mainbal)\n\n\t// simulate a Render(). banker should have given back all coins.\n\tres = banktest.Render(\"\")\n\tprintln(res)\n}\n\n// Output:\n// main before: 300000000ugnot\n// Deposit(): returned!\n// main after: 250000000ugnot\n// ## recent activity\n//\n// * g17rgsdnfxzza0sdfsdma37sdwxagsz378833ca4 100000000ugnot sent, 50000000ugnot returned, at 2009-02-13 11:31pm UTC\n//\n// ## total deposits\n// 50000000ugnot\n"},{"name":"z_1_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\t\"gno.land/r/demo/banktest\"\n)\n\nfunc main() {\n\tbanktestAddr := std.DerivePkgAddr(\"gno.land/r/demo/banktest\")\n\n\t// simulate a Deposit call.\n\tstd.TestSetOrigPkgAddr(banktestAddr)\n\tstd.TestIssueCoins(banktestAddr, std.Coins{{\"ugnot\", 100000000}})\n\tstd.TestSetOrigSend(std.Coins{{\"ugnot\", 100000000}}, nil)\n\tres := banktest.Deposit(\"ugnot\", 101000000)\n\tprintln(res)\n}\n\n// Error:\n// cannot send \"101000000ugnot\", limit \"100000000ugnot\" exceeded with \"\" already spent\n"},{"name":"z_2_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\t\"gno.land/r/demo/banktest\"\n)\n\nfunc main() {\n\tbanktestAddr := std.DerivePkgAddr(\"gno.land/r/demo/banktest\")\n\n\t// print main balance before.\n\tmainaddr := std.DerivePkgAddr(\"main\")\n\tstd.TestSetOrigCaller(mainaddr)\n\n\tbanker := std.GetBanker(std.BankerTypeReadonly)\n\tmainbal := banker.GetCoins(mainaddr)\n\tprintln(\"main before:\", mainbal) // plus OrigSend equals 300.\n\n\t// simulate a Deposit call.\n\tstd.TestSetOrigPkgAddr(banktestAddr)\n\tstd.TestIssueCoins(banktestAddr, std.Coins{{\"ugnot\", 100000000}})\n\tstd.TestSetOrigSend(std.Coins{{\"ugnot\", 100000000}}, nil)\n\tres := banktest.Deposit(\"ugnot\", 55000000)\n\tprintln(\"Deposit():\", res)\n\n\t// print main balance after.\n\tmainbal = banker.GetCoins(mainaddr)\n\tprintln(\"main after:\", mainbal) // now 255.\n\n\t// simulate a Render().\n\tres = banktest.Render(\"\")\n\tprintln(res)\n}\n\n// Output:\n// main before: 200000000ugnot\n// Deposit(): returned!\n// main after: 255000000ugnot\n// ## recent activity\n//\n// * g17rgsdnfxzza0sdfsdma37sdwxagsz378833ca4 100000000ugnot sent, 55000000ugnot returned, at 2009-02-13 11:31pm UTC\n//\n// ## total deposits\n// 45000000ugnot\n"},{"name":"z_3_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n)\n\nfunc main() {\n\tbanktestAddr := std.DerivePkgAddr(\"gno.land/r/demo/banktest\")\n\n\tmainaddr := std.DerivePkgAddr(\"main\")\n\tstd.TestSetOrigCaller(mainaddr)\n\n\tbanker := std.GetBanker(std.BankerTypeRealmSend)\n\tsend := std.Coins{{\"ugnot\", 123}}\n\tbanker.SendCoins(banktestAddr, mainaddr, send)\n\n}\n\n// Error:\n// can only send coins from realm that created banker \"g17rgsdnfxzza0sdfsdma37sdwxagsz378833ca4\", not \"g1dv3435088tlrgggf745kaud0ptrkc9v42k8llz\"\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"bar20","path":"gno.land/r/demo/bar20","files":[{"name":"bar20.gno","body":"// Package bar20 is similar to gno.land/r/demo/foo20 but exposes a safe-object\n// that can be used by `maketx run`, another contract importing foo20, and in\n// the future when we'll support `maketx call Token.XXX`.\npackage bar20\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar (\n\tbanker *grc20.Banker // private banker.\n\tToken grc20.Token // public safe-object.\n)\n\nfunc init() {\n\tbanker = grc20.NewBanker(\"Bar\", \"BAR\", 4)\n\tToken = banker.Token()\n}\n\nfunc Faucet() string {\n\tcaller := std.PrevRealm().Addr()\n\tif err := banker.Mint(caller, 1_000_000); err != nil {\n\t\treturn \"error: \" + err.Error()\n\t}\n\treturn \"OK\"\n}\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tc := len(parts)\n\n\tswitch {\n\tcase path == \"\":\n\t\treturn banker.RenderHome() // XXX: should be Token.RenderHome()\n\tcase c == 2 \u0026\u0026 parts[0] == \"balance\":\n\t\towner := std.Address(parts[1])\n\t\tbalance := Token.BalanceOf(owner)\n\t\treturn ufmt.Sprintf(\"%d\\n\", balance)\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}\n"},{"name":"bar20_test.gno","body":"package bar20\n\nimport (\n\t\"std\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/p/demo/urequire\"\n)\n\nfunc TestPackage(t *testing.T) {\n\talice := testutils.TestAddress(\"alice\")\n\tstd.TestSetRealm(std.NewUserRealm(alice))\n\tstd.TestSetOrigCaller(alice) // XXX: should not need this\n\n\turequire.Equal(t, Token.BalanceOf(alice), uint64(0))\n\turequire.Equal(t, Faucet(), \"OK\")\n\turequire.Equal(t, Token.BalanceOf(alice), uint64(1_000_000))\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"counter","path":"gno.land/r/demo/counter","files":[{"name":"counter.gno","body":"package counter\n\nimport \"strconv\"\n\nvar counter int\n\nfunc Increment() int {\n\tcounter++\n\treturn counter\n}\n\nfunc Render(_ string) string {\n\treturn strconv.Itoa(counter)\n}\n"},{"name":"counter_test.gno","body":"package counter\n\nimport \"testing\"\n\nfunc TestIncrement(t *testing.T) {\n\tcounter = 0\n\tval := Increment()\n\tif val != 1 {\n\t\tt.Fatalf(\"result from Increment(): %d != 1\", val)\n\t}\n\tif counter != val {\n\t\tt.Fatalf(\"counter (%d) != val (%d)\", counter, val)\n\t}\n}\n\nfunc TestRender(t *testing.T) {\n\tcounter = 1337\n\tres := Render(\"\")\n\tif res != \"1337\" {\n\t\tt.Fatalf(\"render result %q != %q\", res, \"1337\")\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"deep","path":"gno.land/r/demo/deep/very/deep","files":[{"name":"render.gno","body":"package deep\n\nfunc Render(path string) string {\n\tif path == \"\" {\n\t\treturn \"it works!\"\n\t} else {\n\t\treturn \"hi \" + path\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"foo20","path":"gno.land/r/demo/grc20factory","files":[{"name":"grc20factory.gno","body":"package foo20\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ownable\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar instances avl.Tree // symbol -\u003e instance\n\nfunc New(name, symbol string, decimals uint, initialMint, faucet uint64) {\n\tcaller := std.PrevRealm().Addr()\n\tNewWithAdmin(name, symbol, decimals, initialMint, faucet, caller)\n}\n\nfunc NewWithAdmin(name, symbol string, decimals uint, initialMint, faucet uint64, admin std.Address) {\n\texists := instances.Has(symbol)\n\tif exists {\n\t\tpanic(\"token already exists\")\n\t}\n\n\tbanker := grc20.NewBanker(name, symbol, decimals)\n\tif initialMint \u003e 0 {\n\t\tbanker.Mint(admin, initialMint)\n\t}\n\n\tinst := instance{\n\t\tbanker: banker,\n\t\tadmin: ownable.NewWithAddress(admin),\n\t\tfaucet: faucet,\n\t}\n\n\tinstances.Set(symbol, \u0026inst)\n}\n\ntype instance struct {\n\tbanker *grc20.Banker\n\tadmin *ownable.Ownable\n\tfaucet uint64 // per-request amount. disabled if 0.\n}\n\nfunc (inst instance) Token() grc20.Token { return inst.banker.Token() }\n\nfunc TotalSupply(symbol string) uint64 {\n\tinst := mustGetInstance(symbol)\n\treturn inst.Token().TotalSupply()\n}\n\nfunc BalanceOf(symbol string, owner std.Address) uint64 {\n\tinst := mustGetInstance(symbol)\n\treturn inst.Token().BalanceOf(owner)\n}\n\nfunc Allowance(symbol string, owner, spender std.Address) uint64 {\n\tinst := mustGetInstance(symbol)\n\treturn inst.Token().Allowance(owner, spender)\n}\n\nfunc Transfer(symbol string, to std.Address, amount uint64) {\n\tinst := mustGetInstance(symbol)\n\tcheckErr(inst.Token().Transfer(to, amount))\n}\n\nfunc Approve(symbol string, spender std.Address, amount uint64) {\n\tinst := mustGetInstance(symbol)\n\tcheckErr(inst.Token().Approve(spender, amount))\n}\n\nfunc TransferFrom(symbol string, from, to std.Address, amount uint64) {\n\tinst := mustGetInstance(symbol)\n\tcheckErr(inst.Token().TransferFrom(from, to, amount))\n}\n\n// faucet.\nfunc Faucet(symbol string) {\n\tinst := mustGetInstance(symbol)\n\tif inst.faucet == 0 {\n\t\tpanic(\"faucet disabled for this token\")\n\t}\n\t// FIXME: add limits?\n\t// FIXME: add payment in gnot?\n\tcaller := std.PrevRealm().Addr()\n\tcheckErr(inst.banker.Mint(caller, inst.faucet))\n}\n\nfunc Mint(symbol string, to std.Address, amount uint64) {\n\tinst := mustGetInstance(symbol)\n\tinst.admin.AssertCallerIsOwner()\n\tcheckErr(inst.banker.Mint(to, amount))\n}\n\nfunc Burn(symbol string, from std.Address, amount uint64) {\n\tinst := mustGetInstance(symbol)\n\tinst.admin.AssertCallerIsOwner()\n\tcheckErr(inst.banker.Burn(from, amount))\n}\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tc := len(parts)\n\n\tswitch {\n\tcase path == \"\":\n\t\treturn \"TODO: list existing tokens and admins\"\n\tcase c == 1:\n\t\tsymbol := parts[0]\n\t\tinst := mustGetInstance(symbol)\n\t\treturn inst.banker.RenderHome()\n\tcase c == 3 \u0026\u0026 parts[1] == \"balance\":\n\t\tsymbol := parts[0]\n\t\tinst := mustGetInstance(symbol)\n\t\towner := std.Address(parts[2])\n\t\tbalance := inst.Token().BalanceOf(owner)\n\t\treturn ufmt.Sprintf(\"%d\", balance)\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}\n\nfunc mustGetInstance(symbol string) *instance {\n\tt, exists := instances.Get(symbol)\n\tif !exists {\n\t\tpanic(\"token instance does not exist\")\n\t}\n\treturn t.(*instance)\n}\n\nfunc checkErr(err error) {\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"},{"name":"grc20factory_test.gno","body":"package foo20\n\nimport (\n\t\"std\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/uassert\"\n)\n\nfunc TestReadOnlyPublicMethods(t *testing.T) {\n\tadmin := std.Address(\"g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj\")\n\tmanfred := std.Address(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\")\n\tunknown := std.Address(\"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\") // valid but never used.\n\tNewWithAdmin(\"Foo\", \"FOO\", 4, 10_000*1_000_000, 0, admin)\n\tNewWithAdmin(\"Bar\", \"BAR\", 4, 10_000*1_000, 0, admin)\n\tmustGetInstance(\"FOO\").banker.Mint(manfred, 100_000_000)\n\n\ttype test struct {\n\t\tname string\n\t\tbalance uint64\n\t\tfn func() uint64\n\t}\n\n\t// check balances #1.\n\t{\n\t\ttests := []test{\n\t\t\t{\"TotalSupply\", 10_100_000_000, func() uint64 { return TotalSupply(\"FOO\") }},\n\t\t\t{\"BalanceOf(admin)\", 10_000_000_000, func() uint64 { return BalanceOf(\"FOO\", admin) }},\n\t\t\t{\"BalanceOf(manfred)\", 100_000_000, func() uint64 { return BalanceOf(\"FOO\", manfred) }},\n\t\t\t{\"Allowance(admin, manfred)\", 0, func() uint64 { return Allowance(\"FOO\", admin, manfred) }},\n\t\t\t{\"BalanceOf(unknown)\", 0, func() uint64 { return BalanceOf(\"FOO\", unknown) }},\n\t\t}\n\t\tfor _, tc := range tests {\n\t\t\tuassert.Equal(t, tc.balance, tc.fn(), \"balance does not match\")\n\t\t}\n\t}\n\treturn\n\n\t// unknown uses the faucet.\n\tstd.TestSetOrigCaller(unknown)\n\tFaucet(\"FOO\")\n\n\t// check balances #2.\n\t{\n\t\ttests := []test{\n\t\t\t{\"TotalSupply\", 10_110_000_000, func() uint64 { return TotalSupply(\"FOO\") }},\n\t\t\t{\"BalanceOf(admin)\", 10_000_000_000, func() uint64 { return BalanceOf(\"FOO\", admin) }},\n\t\t\t{\"BalanceOf(manfred)\", 100_000_000, func() uint64 { return BalanceOf(\"FOO\", manfred) }},\n\t\t\t{\"Allowance(admin, manfred)\", 0, func() uint64 { return Allowance(\"FOO\", admin, manfred) }},\n\t\t\t{\"BalanceOf(unknown)\", 10_000_000, func() uint64 { return BalanceOf(\"FOO\", unknown) }},\n\t\t}\n\t\tfor _, tc := range tests {\n\t\t\tuassert.Equal(t, tc.balance, tc.fn(), \"balance does not match\")\n\t\t}\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"disperse","path":"gno.land/r/demo/disperse","files":[{"name":"disperse.gno","body":"package disperse\n\nimport (\n\t\"std\"\n\n\ttokens \"gno.land/r/demo/grc20factory\"\n)\n\n// Get address of Disperse realm\nvar realmAddr = std.CurrentRealm().Addr()\n\n// DisperseUgnot parses receivers and amounts and sends out ugnot\n// The function will send out the coins to the addresses and return the leftover coins to the caller\n// if there are any to return\nfunc DisperseUgnot(addresses []std.Address, coins std.Coins) {\n\tcoinSent := std.GetOrigSend()\n\tcaller := std.PrevRealm().Addr()\n\tbanker := std.GetBanker(std.BankerTypeOrigSend)\n\n\tif len(addresses) != len(coins) {\n\t\tpanic(ErrNumAddrValMismatch)\n\t}\n\n\tfor _, coin := range coins {\n\t\tif coin.Amount \u003c= 0 {\n\t\t\tpanic(ErrNegativeCoinAmount)\n\t\t}\n\n\t\tif banker.GetCoins(realmAddr).AmountOf(coin.Denom) \u003c coin.Amount {\n\t\t\tpanic(ErrMismatchBetweenSentAndParams)\n\t\t}\n\t}\n\n\t// Send coins\n\tfor i, _ := range addresses {\n\t\tbanker.SendCoins(realmAddr, addresses[i], std.NewCoins(coins[i]))\n\t}\n\n\t// Return possible leftover coins\n\tfor _, coin := range coinSent {\n\t\tleftoverAmt := banker.GetCoins(realmAddr).AmountOf(coin.Denom)\n\t\tif leftoverAmt \u003e 0 {\n\t\t\tsend := std.Coins{std.NewCoin(coin.Denom, leftoverAmt)}\n\t\t\tbanker.SendCoins(realmAddr, caller, send)\n\t\t}\n\t}\n}\n\n// DisperseGRC20 disperses tokens to multiple addresses\n// Note that it is necessary to approve the realm to spend the tokens before calling this function\n// see the corresponding filetests for examples\nfunc DisperseGRC20(addresses []std.Address, amounts []uint64, symbols []string) {\n\tcaller := std.PrevRealm().Addr()\n\n\tif (len(addresses) != len(amounts)) || (len(amounts) != len(symbols)) {\n\t\tpanic(ErrArgLenAndSentLenMismatch)\n\t}\n\n\tfor i := 0; i \u003c len(addresses); i++ {\n\t\ttokens.TransferFrom(symbols[i], caller, addresses[i], amounts[i])\n\t}\n}\n\n// DisperseGRC20String receives a string of addresses and a string of tokens\n// and parses them to be used in DisperseGRC20\nfunc DisperseGRC20String(addresses string, tokens string) {\n\tparsedAddresses, err := parseAddresses(addresses)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tparsedAmounts, parsedSymbols, err := parseTokens(tokens)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tDisperseGRC20(parsedAddresses, parsedAmounts, parsedSymbols)\n}\n\n// DisperseUgnotString receives a string of addresses and a string of amounts\n// and parses them to be used in DisperseUgnot\nfunc DisperseUgnotString(addresses string, amounts string) {\n\tparsedAddresses, err := parseAddresses(addresses)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tparsedAmounts, err := parseAmounts(amounts)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tcoins := make(std.Coins, len(parsedAmounts))\n\tfor i, amount := range parsedAmounts {\n\t\tcoins[i] = std.NewCoin(\"ugnot\", amount)\n\t}\n\n\tDisperseUgnot(parsedAddresses, coins)\n}\n"},{"name":"doc.gno","body":"// Package disperse provides methods to disperse coins or GRC20 tokens among multiple addresses.\n//\n// The disperse package is an implementation of an existing service that allows users to send coins or GRC20 tokens to multiple addresses\n// on the Ethereum blockchain.\n//\n// Usage:\n// To use disperse, you can either use `DisperseUgnot` to send coins or `DisperseGRC20` to send GRC20 tokens to multiple addresses.\n//\n// Example:\n// Dispersing 200 coins to two addresses:\n// - DisperseUgnotString(\"g1dmt3sa5ucvecxuhf3j6ne5r0e3z4x7h6c03xc0,g1akeqsvhucjt8gf5yupyzjxsjd29wv8fayng37c\", \"150,50\")\n// Dispersing 200 worth of a GRC20 token \"TEST\" to two addresses:\n// - DisperseGRC20String(\"g1dmt3sa5ucvecxuhf3j6ne5r0e3z4x7h6c03xc0,g1akeqsvhucjt8gf5yupyzjxsjd29wv8fayng37c\", \"150TEST,50TEST\")\n//\n// Reference:\n// - [the original dispere app](https://disperse.app/)\n// - [the original disperse app on etherscan](https://etherscan.io/address/0xd152f549545093347a162dce210e7293f1452150#code)\n// - [the gno disperse web app](https://gno-disperse.netlify.app/)\npackage disperse // import \"gno.land/r/demo/disperse\"\n"},{"name":"errors.gno","body":"package disperse\n\nimport \"errors\"\n\nvar (\n\tErrNotEnoughCoin = errors.New(\"disperse: not enough coin sent in\")\n\tErrNumAddrValMismatch = errors.New(\"disperse: number of addresses and values to send doesn't match\")\n\tErrInvalidAddress = errors.New(\"disperse: invalid address\")\n\tErrNegativeCoinAmount = errors.New(\"disperse: coin amount cannot be negative\")\n\tErrMismatchBetweenSentAndParams = errors.New(\"disperse: mismatch between coins sent and params called\")\n\tErrArgLenAndSentLenMismatch = errors.New(\"disperse: mismatch between coins sent and args called\")\n)\n"},{"name":"util.gno","body":"package disperse\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\t\"strings\"\n\t\"unicode\"\n)\n\nfunc parseAddresses(addresses string) ([]std.Address, error) {\n\tvar ret []std.Address\n\n\tfor _, str := range strings.Split(addresses, \",\") {\n\t\taddr := std.Address(str)\n\t\tif !addr.IsValid() {\n\t\t\treturn nil, ErrInvalidAddress\n\t\t}\n\n\t\tret = append(ret, addr)\n\t}\n\n\treturn ret, nil\n}\n\nfunc splitString(input string) (string, string) {\n\tvar pos int\n\tfor i, char := range input {\n\t\tif !unicode.IsDigit(char) {\n\t\t\tpos = i\n\t\t\tbreak\n\t\t}\n\t}\n\treturn input[:pos], input[pos:]\n}\n\nfunc parseTokens(tokens string) ([]uint64, []string, error) {\n\tvar amounts []uint64\n\tvar symbols []string\n\n\tfor _, token := range strings.Split(tokens, \",\") {\n\t\tamountStr, symbol := splitString(token)\n\t\tamount, _ := strconv.Atoi(amountStr)\n\t\tif amount \u003c 0 {\n\t\t\treturn nil, nil, ErrNegativeCoinAmount\n\t\t}\n\n\t\tamounts = append(amounts, uint64(amount))\n\t\tsymbols = append(symbols, symbol)\n\t}\n\n\treturn amounts, symbols, nil\n}\n\nfunc parseAmounts(amounts string) ([]int64, error) {\n\tvar ret []int64\n\n\tfor _, amt := range strings.Split(amounts, \",\") {\n\t\tamount, _ := strconv.Atoi(amt)\n\t\tif amount \u003c 0 {\n\t\t\treturn nil, ErrNegativeCoinAmount\n\t\t}\n\n\t\tret = append(ret, int64(amount))\n\t}\n\n\treturn ret, nil\n}\n"},{"name":"z_0_filetest.gno","body":"// SEND: 200ugnot\n\npackage main\n\nimport (\n\t\"std\"\n\n\t\"gno.land/r/demo/disperse\"\n)\n\nfunc main() {\n\tdisperseAddr := std.DerivePkgAddr(\"gno.land/r/demo/disperse\")\n\tmainaddr := std.DerivePkgAddr(\"main\")\n\n\tstd.TestSetOrigPkgAddr(disperseAddr)\n\tstd.TestSetOrigCaller(mainaddr)\n\n\tbanker := std.GetBanker(std.BankerTypeRealmSend)\n\n\tmainbal := banker.GetCoins(mainaddr)\n\tprintln(\"main before:\", mainbal)\n\n\tbanker.SendCoins(mainaddr, disperseAddr, std.Coins{{\"ugnot\", 200}})\n\tdisperse.DisperseUgnotString(\"g1dmt3sa5ucvecxuhf3j6ne5r0e3z4x7h6c03xc0,g1akeqsvhucjt8gf5yupyzjxsjd29wv8fayng37c\", \"150,50\")\n\n\tmainbal = banker.GetCoins(mainaddr)\n\tprintln(\"main after:\", mainbal)\n}\n\n// Output:\n// main before: 200000200ugnot\n// main after: 200000000ugnot\n"},{"name":"z_1_filetest.gno","body":"// SEND: 300ugnot\n\npackage main\n\nimport (\n\t\"std\"\n\n\t\"gno.land/r/demo/disperse\"\n)\n\nfunc main() {\n\tdisperseAddr := std.DerivePkgAddr(\"gno.land/r/demo/disperse\")\n\tmainaddr := std.DerivePkgAddr(\"main\")\n\n\tstd.TestSetOrigPkgAddr(disperseAddr)\n\tstd.TestSetOrigCaller(mainaddr)\n\n\tbanker := std.GetBanker(std.BankerTypeRealmSend)\n\n\tmainbal := banker.GetCoins(mainaddr)\n\tprintln(\"main before:\", mainbal)\n\n\tbanker.SendCoins(mainaddr, disperseAddr, std.Coins{{\"ugnot\", 300}})\n\tdisperse.DisperseUgnotString(\"g1dmt3sa5ucvecxuhf3j6ne5r0e3z4x7h6c03xc0,g1akeqsvhucjt8gf5yupyzjxsjd29wv8fayng37c\", \"150,50\")\n\n\tmainbal = banker.GetCoins(mainaddr)\n\tprintln(\"main after:\", mainbal)\n}\n\n// Output:\n// main before: 200000300ugnot\n// main after: 200000100ugnot\n"},{"name":"z_2_filetest.gno","body":"// SEND: 300ugnot\n\npackage main\n\nimport (\n\t\"std\"\n\n\t\"gno.land/r/demo/disperse\"\n)\n\nfunc main() {\n\tdisperseAddr := std.DerivePkgAddr(\"gno.land/r/demo/disperse\")\n\tmainaddr := std.DerivePkgAddr(\"main\")\n\n\tstd.TestSetOrigPkgAddr(disperseAddr)\n\tstd.TestSetOrigCaller(mainaddr)\n\n\tbanker := std.GetBanker(std.BankerTypeRealmSend)\n\n\tbanker.SendCoins(mainaddr, disperseAddr, std.Coins{{\"ugnot\", 100}})\n\tdisperse.DisperseUgnotString(\"g1dmt3sa5ucvecxuhf3j6ne5r0e3z4x7h6c03xc0,g1akeqsvhucjt8gf5yupyzjxsjd29wv8fayng37c\", \"150,50\")\n}\n\n// Error:\n// disperse: mismatch between coins sent and params called\n"},{"name":"z_3_filetest.gno","body":"// SEND: 300ugnot\n\npackage main\n\nimport (\n\t\"std\"\n\n\t\"gno.land/r/demo/disperse\"\n\ttokens \"gno.land/r/demo/grc20factory\"\n)\n\nfunc main() {\n\tdisperseAddr := std.DerivePkgAddr(\"gno.land/r/demo/disperse\")\n\tmainaddr := std.DerivePkgAddr(\"main\")\n\tbeneficiary1 := std.Address(\"g1dmt3sa5ucvecxuhf3j6ne5r0e3z4x7h6c03xc0\")\n\tbeneficiary2 := std.Address(\"g1akeqsvhucjt8gf5yupyzjxsjd29wv8fayng37c\")\n\n\tstd.TestSetOrigPkgAddr(disperseAddr)\n\tstd.TestSetOrigCaller(mainaddr)\n\n\tbanker := std.GetBanker(std.BankerTypeRealmSend)\n\n\ttokens.New(\"test\", \"TEST\", 4, 0, 0)\n\ttokens.Mint(\"TEST\", mainaddr, 200)\n\n\tmainbal := tokens.BalanceOf(\"TEST\", mainaddr)\n\tprintln(\"main before:\", mainbal)\n\n\ttokens.Approve(\"TEST\", disperseAddr, 200)\n\n\tdisperse.DisperseGRC20String(\"g1dmt3sa5ucvecxuhf3j6ne5r0e3z4x7h6c03xc0,g1akeqsvhucjt8gf5yupyzjxsjd29wv8fayng37c\", \"150TEST,50TEST\")\n\n\tmainbal = tokens.BalanceOf(\"TEST\", mainaddr)\n\tprintln(\"main after:\", mainbal)\n\tben1bal := tokens.BalanceOf(\"TEST\", beneficiary1)\n\tprintln(\"beneficiary1:\", ben1bal)\n\tben2bal := tokens.BalanceOf(\"TEST\", beneficiary2)\n\tprintln(\"beneficiary2:\", ben2bal)\n}\n\n// Output:\n// main before: 200\n// main after: 0\n// beneficiary1: 150\n// beneficiary2: 50\n"},{"name":"z_4_filetest.gno","body":"// SEND: 300ugnot\n\npackage main\n\nimport (\n\t\"std\"\n\n\t\"gno.land/r/demo/disperse\"\n\ttokens \"gno.land/r/demo/grc20factory\"\n)\n\nfunc main() {\n\tdisperseAddr := std.DerivePkgAddr(\"gno.land/r/demo/disperse\")\n\tmainaddr := std.DerivePkgAddr(\"main\")\n\tbeneficiary1 := std.Address(\"g1dmt3sa5ucvecxuhf3j6ne5r0e3z4x7h6c03xc0\")\n\tbeneficiary2 := std.Address(\"g1akeqsvhucjt8gf5yupyzjxsjd29wv8fayng37c\")\n\n\tstd.TestSetOrigPkgAddr(disperseAddr)\n\tstd.TestSetOrigCaller(mainaddr)\n\n\tbanker := std.GetBanker(std.BankerTypeRealmSend)\n\n\ttokens.New(\"test1\", \"TEST1\", 4, 0, 0)\n\ttokens.Mint(\"TEST1\", mainaddr, 200)\n\ttokens.New(\"test2\", \"TEST2\", 4, 0, 0)\n\ttokens.Mint(\"TEST2\", mainaddr, 200)\n\n\tmainbal := tokens.BalanceOf(\"TEST1\", mainaddr) + tokens.BalanceOf(\"TEST2\", mainaddr)\n\tprintln(\"main before:\", mainbal)\n\n\ttokens.Approve(\"TEST1\", disperseAddr, 200)\n\ttokens.Approve(\"TEST2\", disperseAddr, 200)\n\n\tdisperse.DisperseGRC20String(\"g1dmt3sa5ucvecxuhf3j6ne5r0e3z4x7h6c03xc0,g1akeqsvhucjt8gf5yupyzjxsjd29wv8fayng37c\", \"200TEST1,200TEST2\")\n\n\tmainbal = tokens.BalanceOf(\"TEST1\", mainaddr) + tokens.BalanceOf(\"TEST2\", mainaddr)\n\tprintln(\"main after:\", mainbal)\n\tben1bal := tokens.BalanceOf(\"TEST1\", beneficiary1) + tokens.BalanceOf(\"TEST2\", beneficiary1)\n\tprintln(\"beneficiary1:\", ben1bal)\n\tben2bal := tokens.BalanceOf(\"TEST1\", beneficiary2) + tokens.BalanceOf(\"TEST2\", beneficiary2)\n\tprintln(\"beneficiary2:\", ben2bal)\n}\n\n// Output:\n// main before: 400\n// main after: 0\n// beneficiary1: 200\n// beneficiary2: 200\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"echo","path":"gno.land/r/demo/echo","files":[{"name":"echo.gno","body":"package echo\n\n/*\n * This realm echoes the `path` argument it received.\n * Can be used by developers as a simple endpoint to test\n * forbidden characters, for pentesting or simply to\n * test it works.\n *\n * See also r/demo/print (to print various thing like user address)\n */\nfunc Render(path string) string {\n\treturn path\n}\n"},{"name":"echo_test.gno","body":"package echo\n\nimport (\n\t\"testing\"\n\n\t\"gno.land/p/demo/urequire\"\n)\n\nfunc Test(t *testing.T) {\n\turequire.Equal(t, \"aa\", Render(\"aa\"))\n\turequire.Equal(t, \"\", Render(\"\"))\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"event","path":"gno.land/r/demo/event","files":[{"name":"event.gno","body":"package event\n\nimport (\n\t\"std\"\n)\n\nfunc Emit(value string) {\n\tstd.Emit(\"TAG\", \"key\", value)\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"foo1155","path":"gno.land/r/demo/foo1155","files":[{"name":"foo1155.gno","body":"package foo1155\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/grc/grc1155\"\n\t\"gno.land/p/demo/ufmt\"\n\t\"gno.land/r/demo/users\"\n\n\tpusers \"gno.land/p/demo/users\"\n)\n\nvar (\n\tdummyURI = \"ipfs://xyz\"\n\tadmin std.Address = \"g10x5phu0k6p64cwrhfpsc8tk43st9kug6wft530\"\n\tfoo = grc1155.NewBasicGRC1155Token(dummyURI)\n)\n\nfunc init() {\n\tmintGRC1155Token(admin) // @administrator (10)\n}\n\nfunc mintGRC1155Token(owner std.Address) {\n\tfor i := 1; i \u003c= 10; i++ {\n\t\ttid := grc1155.TokenID(ufmt.Sprintf(\"%d\", i))\n\t\tfoo.SafeMint(owner, tid, 100)\n\t}\n}\n\n// Getters\n\nfunc BalanceOf(user pusers.AddressOrName, tid grc1155.TokenID) uint64 {\n\tbalance, err := foo.BalanceOf(users.Resolve(user), tid)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\treturn balance\n}\n\nfunc BalanceOfBatch(ul []pusers.AddressOrName, batch []grc1155.TokenID) []uint64 {\n\tvar usersResolved []std.Address\n\n\tfor i := 0; i \u003c len(ul); i++ {\n\t\tusersResolved[i] = users.Resolve(ul[i])\n\t}\n\tbalanceBatch, err := foo.BalanceOfBatch(usersResolved, batch)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\treturn balanceBatch\n}\n\nfunc IsApprovedForAll(owner, user pusers.AddressOrName) bool {\n\treturn foo.IsApprovedForAll(users.Resolve(owner), users.Resolve(user))\n}\n\n// Setters\n\nfunc SetApprovalForAll(user pusers.AddressOrName, approved bool) {\n\terr := foo.SetApprovalForAll(users.Resolve(user), approved)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc TransferFrom(from, to pusers.AddressOrName, tid grc1155.TokenID, amount uint64) {\n\terr := foo.SafeTransferFrom(users.Resolve(from), users.Resolve(to), tid, amount)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc BatchTransferFrom(from, to pusers.AddressOrName, batch []grc1155.TokenID, amounts []uint64) {\n\terr := foo.SafeBatchTransferFrom(users.Resolve(from), users.Resolve(to), batch, amounts)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// Admin\n\nfunc Mint(to pusers.AddressOrName, tid grc1155.TokenID, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tassertIsAdmin(caller)\n\terr := foo.SafeMint(users.Resolve(to), tid, amount)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc MintBatch(to pusers.AddressOrName, batch []grc1155.TokenID, amounts []uint64) {\n\tcaller := std.GetOrigCaller()\n\tassertIsAdmin(caller)\n\terr := foo.SafeBatchMint(users.Resolve(to), batch, amounts)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc Burn(from pusers.AddressOrName, tid grc1155.TokenID, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tassertIsAdmin(caller)\n\terr := foo.Burn(users.Resolve(from), tid, amount)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc BurnBatch(from pusers.AddressOrName, batch []grc1155.TokenID, amounts []uint64) {\n\tcaller := std.GetOrigCaller()\n\tassertIsAdmin(caller)\n\terr := foo.BatchBurn(users.Resolve(from), batch, amounts)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// Render\n\nfunc Render(path string) string {\n\tswitch {\n\tcase path == \"\":\n\t\treturn foo.RenderHome()\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}\n\n// Util\n\nfunc assertIsAdmin(address std.Address) {\n\tif address != admin {\n\t\tpanic(\"restricted access\")\n\t}\n}\n"},{"name":"foo1155_test.gno","body":"package foo1155\n\nimport (\n\t\"testing\"\n\n\t\"gno.land/p/demo/grc/grc1155\"\n\t\"gno.land/p/demo/users\"\n)\n\nfunc TestFoo721(t *testing.T) {\n\tadmin := users.AddressOrName(\"g10x5phu0k6p64cwrhfpsc8tk43st9kug6wft530\")\n\tbob := users.AddressOrName(\"g1ze6et22ces5atv79y4xh38s4kuraey4y2fr6tw\")\n\ttid1 := grc1155.TokenID(\"1\")\n\ttid2 := grc1155.TokenID(\"2\")\n\n\tfor i, tc := range []struct {\n\t\tname string\n\t\texpected interface{}\n\t\tfn func() interface{}\n\t}{\n\t\t{\"BalanceOf(admin, tid1)\", uint64(100), func() interface{} { return BalanceOf(admin, tid1) }},\n\t\t{\"BalanceOf(bob, tid1)\", uint64(0), func() interface{} { return BalanceOf(bob, tid1) }},\n\t\t{\"IsApprovedForAll(admin, bob)\", false, func() interface{} { return IsApprovedForAll(admin, bob) }},\n\t} {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tgot := tc.fn()\n\t\t\tif tc.expected != got {\n\t\t\t\tt.Errorf(\"expected: %v got: %v\", tc.expected, got)\n\t\t\t}\n\t\t})\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"foo20","path":"gno.land/r/demo/foo20","files":[{"name":"foo20.gno","body":"// foo20 is a GRC20 token contract where all the GRC20 methods are proxified\n// with top-level functions. see also gno.land/r/demo/bar20.\npackage foo20\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ownable\"\n\t\"gno.land/p/demo/ufmt\"\n\tpusers \"gno.land/p/demo/users\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tbanker *grc20.Banker\n\tadmin *ownable.Ownable\n\ttoken grc20.Token\n)\n\nfunc init() {\n\tadmin = ownable.NewWithAddress(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\") // @moul\n\tbanker = grc20.NewBanker(\"Foo\", \"FOO\", 4)\n\tbanker.Mint(admin.Owner(), 1000000*10000) // @administrator (1M)\n\ttoken = banker.Token()\n}\n\nfunc TotalSupply() uint64 { return token.TotalSupply() }\n\nfunc BalanceOf(owner pusers.AddressOrName) uint64 {\n\townerAddr := users.Resolve(owner)\n\treturn token.BalanceOf(ownerAddr)\n}\n\nfunc Allowance(owner, spender pusers.AddressOrName) uint64 {\n\townerAddr := users.Resolve(owner)\n\tspenderAddr := users.Resolve(spender)\n\treturn token.Allowance(ownerAddr, spenderAddr)\n}\n\nfunc Transfer(to pusers.AddressOrName, amount uint64) {\n\ttoAddr := users.Resolve(to)\n\tcheckErr(token.Transfer(toAddr, amount))\n}\n\nfunc Approve(spender pusers.AddressOrName, amount uint64) {\n\tspenderAddr := users.Resolve(spender)\n\tcheckErr(token.Approve(spenderAddr, amount))\n}\n\nfunc TransferFrom(from, to pusers.AddressOrName, amount uint64) {\n\tfromAddr := users.Resolve(from)\n\ttoAddr := users.Resolve(to)\n\tcheckErr(token.TransferFrom(fromAddr, toAddr, amount))\n}\n\n// Faucet is distributing foo20 tokens without restriction (unsafe).\n// For a real token faucet, you should take care of setting limits are asking payment.\nfunc Faucet() {\n\tcaller := std.PrevRealm().Addr()\n\tamount := uint64(1_000 * 10_000) // 1k\n\tcheckErr(banker.Mint(caller, amount))\n}\n\nfunc Mint(to pusers.AddressOrName, amount uint64) {\n\tadmin.AssertCallerIsOwner()\n\ttoAddr := users.Resolve(to)\n\tcheckErr(banker.Mint(toAddr, amount))\n}\n\nfunc Burn(from pusers.AddressOrName, amount uint64) {\n\tadmin.AssertCallerIsOwner()\n\tfromAddr := users.Resolve(from)\n\tcheckErr(banker.Burn(fromAddr, amount))\n}\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tc := len(parts)\n\n\tswitch {\n\tcase path == \"\":\n\t\treturn banker.RenderHome()\n\tcase c == 2 \u0026\u0026 parts[0] == \"balance\":\n\t\towner := pusers.AddressOrName(parts[1])\n\t\townerAddr := users.Resolve(owner)\n\t\tbalance := banker.BalanceOf(ownerAddr)\n\t\treturn ufmt.Sprintf(\"%d\\n\", balance)\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}\n\nfunc checkErr(err error) {\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"},{"name":"foo20_test.gno","body":"package foo20\n\nimport (\n\t\"std\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/p/demo/uassert\"\n\tpusers \"gno.land/p/demo/users\"\n\t\"gno.land/r/demo/users\"\n)\n\nfunc TestReadOnlyPublicMethods(t *testing.T) {\n\tvar (\n\t\tadmin = pusers.AddressOrName(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\")\n\t\talice = pusers.AddressOrName(testutils.TestAddress(\"alice\"))\n\t\tbob = pusers.AddressOrName(testutils.TestAddress(\"bob\"))\n\t)\n\n\ttype test struct {\n\t\tname string\n\t\tbalance uint64\n\t\tfn func() uint64\n\t}\n\n\t// check balances #1.\n\t{\n\t\ttests := []test{\n\t\t\t{\"TotalSupply\", 10_000_000_000, func() uint64 { return TotalSupply() }},\n\t\t\t{\"BalanceOf(admin)\", 10_000_000_000, func() uint64 { return BalanceOf(admin) }},\n\t\t\t{\"BalanceOf(alice)\", 0, func() uint64 { return BalanceOf(alice) }},\n\t\t\t{\"Allowance(admin, alice)\", 0, func() uint64 { return Allowance(admin, alice) }},\n\t\t\t{\"BalanceOf(bob)\", 0, func() uint64 { return BalanceOf(bob) }},\n\t\t}\n\t\tfor _, tc := range tests {\n\t\t\tgot := tc.fn()\n\t\t\tuassert.Equal(t, got, tc.balance)\n\t\t}\n\t}\n\n\t// bob uses the faucet.\n\tstd.TestSetOrigCaller(users.Resolve(bob))\n\tFaucet()\n\n\t// check balances #2.\n\t{\n\t\ttests := []test{\n\t\t\t{\"TotalSupply\", 10_010_000_000, func() uint64 { return TotalSupply() }},\n\t\t\t{\"BalanceOf(admin)\", 10_000_000_000, func() uint64 { return BalanceOf(admin) }},\n\t\t\t{\"BalanceOf(alice)\", 0, func() uint64 { return BalanceOf(alice) }},\n\t\t\t{\"Allowance(admin, alice)\", 0, func() uint64 { return Allowance(admin, alice) }},\n\t\t\t{\"BalanceOf(bob)\", 10_000_000, func() uint64 { return BalanceOf(bob) }},\n\t\t}\n\t\tfor _, tc := range tests {\n\t\t\tgot := tc.fn()\n\t\t\tuassert.Equal(t, got, tc.balance)\n\t\t}\n\t}\n}\n\nfunc TestErrConditions(t *testing.T) {\n\tvar (\n\t\tadmin = pusers.AddressOrName(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\")\n\t\talice = pusers.AddressOrName(testutils.TestAddress(\"alice\"))\n\t\tempty = pusers.AddressOrName(\"\")\n\t)\n\n\ttype test struct {\n\t\tname string\n\t\tmsg string\n\t\tfn func()\n\t}\n\n\tstd.TestSetOrigCaller(users.Resolve(admin))\n\t{\n\t\ttests := []test{\n\t\t\t{\"Transfer(admin, 1)\", \"cannot send transfer to self\", func() { Transfer(admin, 1) }},\n\t\t\t{\"Approve(empty, 1))\", \"invalid address\", func() { Approve(empty, 1) }},\n\t\t}\n\t\tfor _, tc := range tests {\n\t\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t\tuassert.PanicsWithMessage(t, tc.msg, tc.fn)\n\t\t\t})\n\t\t}\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"foo721","path":"gno.land/r/demo/foo721","files":[{"name":"foo721.gno","body":"package foo721\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/grc/grc721\"\n\t\"gno.land/p/demo/ufmt\"\n\t\"gno.land/r/demo/users\"\n\n\tpusers \"gno.land/p/demo/users\"\n)\n\nvar (\n\tadmin std.Address = \"g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj\"\n\tfoo = grc721.NewBasicNFT(\"FooNFT\", \"FNFT\")\n)\n\nfunc init() {\n\tmintNNFT(admin, 10) // @administrator (10)\n\tmintNNFT(\"g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm\", 5) // @hariom (5)\n}\n\nfunc mintNNFT(owner std.Address, n uint64) {\n\tcount := foo.TokenCount()\n\tfor i := count; i \u003c count+n; i++ {\n\t\ttid := grc721.TokenID(ufmt.Sprintf(\"%d\", i))\n\t\tfoo.Mint(owner, tid)\n\t}\n}\n\n// Getters\n\nfunc BalanceOf(user pusers.AddressOrName) uint64 {\n\tbalance, err := foo.BalanceOf(users.Resolve(user))\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\treturn balance\n}\n\nfunc OwnerOf(tid grc721.TokenID) std.Address {\n\towner, err := foo.OwnerOf(tid)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\treturn owner\n}\n\nfunc IsApprovedForAll(owner, user pusers.AddressOrName) bool {\n\treturn foo.IsApprovedForAll(users.Resolve(owner), users.Resolve(user))\n}\n\nfunc GetApproved(tid grc721.TokenID) std.Address {\n\taddr, err := foo.GetApproved(tid)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\treturn addr\n}\n\n// Setters\n\nfunc Approve(user pusers.AddressOrName, tid grc721.TokenID) {\n\terr := foo.Approve(users.Resolve(user), tid)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc SetApprovalForAll(user pusers.AddressOrName, approved bool) {\n\terr := foo.SetApprovalForAll(users.Resolve(user), approved)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc TransferFrom(from, to pusers.AddressOrName, tid grc721.TokenID) {\n\terr := foo.TransferFrom(users.Resolve(from), users.Resolve(to), tid)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// Admin\n\nfunc Mint(to pusers.AddressOrName, tid grc721.TokenID) {\n\tcaller := std.PrevRealm().Addr()\n\tassertIsAdmin(caller)\n\terr := foo.Mint(users.Resolve(to), tid)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc Burn(tid grc721.TokenID) {\n\tcaller := std.PrevRealm().Addr()\n\tassertIsAdmin(caller)\n\terr := foo.Burn(tid)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// Render\n\nfunc Render(path string) string {\n\tswitch {\n\tcase path == \"\":\n\t\treturn foo.RenderHome()\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}\n\n// Util\n\nfunc assertIsAdmin(address std.Address) {\n\tif address != admin {\n\t\tpanic(\"restricted access\")\n\t}\n}\n"},{"name":"foo721_test.gno","body":"package foo721\n\nimport (\n\t\"testing\"\n\n\t\"gno.land/p/demo/grc/grc721\"\n\t\"gno.land/r/demo/users\"\n\n\tpusers \"gno.land/p/demo/users\"\n)\n\nfunc TestFoo721(t *testing.T) {\n\tadmin := pusers.AddressOrName(\"g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj\")\n\thariom := pusers.AddressOrName(\"g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm\")\n\n\tfor i, tc := range []struct {\n\t\tname string\n\t\texpected interface{}\n\t\tfn func() interface{}\n\t}{\n\t\t{\"BalanceOf(admin)\", uint64(10), func() interface{} { return BalanceOf(admin) }},\n\t\t{\"BalanceOf(hariom)\", uint64(5), func() interface{} { return BalanceOf(hariom) }},\n\t\t{\"OwnerOf(0)\", users.Resolve(admin), func() interface{} { return OwnerOf(grc721.TokenID(\"0\")) }},\n\t\t{\"IsApprovedForAll(admin, hariom)\", false, func() interface{} { return IsApprovedForAll(admin, hariom) }},\n\t} {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tgot := tc.fn()\n\t\t\tif tc.expected != got {\n\t\t\t\tt.Errorf(\"expected: %v got: %v\", tc.expected, got)\n\t\t\t}\n\t\t})\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"shifumi","path":"gno.land/r/demo/games/shifumi","files":[{"name":"shifumi.gno","body":"package shifumi\n\nimport (\n\t\"errors\"\n\t\"std\"\n\t\"strconv\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/seqid\"\n\n\t\"gno.land/r/demo/users\"\n)\n\nconst (\n\tempty = iota\n\trock\n\tpaper\n\tscissors\n\tlast\n)\n\ntype game struct {\n\tplayer1, player2 std.Address // shifumi is a 2 players game\n\tmove1, move2 int // can be empty, rock, paper, or scissors\n}\n\nvar games avl.Tree\nvar id seqid.ID\n\nfunc (g *game) play(player std.Address, move int) error {\n\tif !(move \u003e empty \u0026\u0026 move \u003c last) {\n\t\treturn errors.New(\"invalid move\")\n\t}\n\tif player != g.player1 \u0026\u0026 player != g.player2 {\n\t\treturn errors.New(\"invalid player\")\n\t}\n\tif player == g.player1 \u0026\u0026 g.move1 == empty {\n\t\tg.move1 = move\n\t\treturn nil\n\t}\n\tif player == g.player2 \u0026\u0026 g.move2 == empty {\n\t\tg.move2 = move\n\t\treturn nil\n\t}\n\treturn errors.New(\"already played\")\n}\n\nfunc (g *game) winner() int {\n\tif g.move1 == empty || g.move2 == empty {\n\t\treturn -1\n\t}\n\tif g.move1 == g.move2 {\n\t\treturn 0\n\t}\n\tif g.move1 == rock \u0026\u0026 g.move2 == scissors ||\n\t\tg.move1 == paper \u0026\u0026 g.move2 == rock ||\n\t\tg.move1 == scissors \u0026\u0026 g.move2 == paper {\n\t\treturn 1\n\t}\n\treturn 2\n}\n\n// NewGame creates a new game where player1 is the caller and player2 the argument.\n// A new game index is returned.\nfunc NewGame(player std.Address) int {\n\tgames.Set(id.Next().String(), \u0026game{player1: std.PrevRealm().Addr(), player2: player})\n\treturn int(id)\n}\n\n// Play executes a move for the game at index idx, where move can be:\n// 1 (rock), 2 (paper), 3 (scissors).\nfunc Play(idx, move int) {\n\tv, ok := games.Get(seqid.ID(idx).String())\n\tif !ok {\n\t\tpanic(\"game not found\")\n\t}\n\tif err := v.(*game).play(std.PrevRealm().Addr(), move); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc Render(path string) string {\n\tmov1 := []string{\"\", \" 🤜 \", \" 🫱 \", \" 👉 \"}\n\tmov2 := []string{\"\", \" 🤛 \", \" 🫲 \", \" 👈 \"}\n\twin := []string{\"pending\", \"draw\", \"player1\", \"player2\"}\n\n\toutput := `# 👊 ✋ ✌️ Shifumi\nActions:\n* [NewGame](shifumi?help\u0026__func=NewGame) opponentAddress\n* [Play](shifumi?help\u0026__func=Play) gameIndex move (1=rock, 2=paper, 3=scissors)\n\n game | player1 | | player2 | | win \n --- | --- | --- | --- | --- | ---\n`\n\t// Output the 100 most recent games.\n\tmaxGames := 100\n\tfor n := int(id); n \u003e 0 \u0026\u0026 int(id)-n \u003c maxGames; n-- {\n\t\tv, ok := games.Get(seqid.ID(n).String())\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tg := v.(*game)\n\t\toutput += strconv.Itoa(n) + \" | \" +\n\t\t\tshortName(g.player1) + \" | \" + mov1[g.move1] + \" | \" +\n\t\t\tshortName(g.player2) + \" | \" + mov2[g.move2] + \" | \" +\n\t\t\twin[g.winner()+1] + \"\\n\"\n\t}\n\treturn output\n}\n\nfunc shortName(addr std.Address) string {\n\tuser := users.GetUserByAddress(addr)\n\tif user != nil {\n\t\treturn user.Name\n\t}\n\tif len(addr) \u003c 10 {\n\t\treturn string(addr)\n\t}\n\treturn string(addr)[:10] + \"...\"\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"groups","path":"gno.land/r/demo/groups","files":[{"name":"README.md","body":"### - test package\n\n ./build/gno test examples/gno.land/r/demo/groups/\n\n### - add pkg\n\n ./build/gnokey maketx addpkg -pkgdir \"examples/gno.land/r/demo/groups\" -deposit 100000000ugnot -gas-fee 1000000ugnot -gas-wanted 10000000 -broadcast -chainid dev -remote 0.0.0.0:26657 -pkgpath \"gno.land/r/demo/groups\" test1 \n\n### - create group\n\n ./build/gnokey maketx call -func \"CreateGroup\" -args \"dao_trinity_ngo\" -gas-fee \"1000000ugnot\" -gas-wanted 4000000 -broadcast -chainid dev -remote 0.0.0.0:26657 -pkgpath \"gno.land/r/demo/groups\" test1 \n\n### - add member\n\n ./build/gnokey maketx call -func \"AddMember\" -args \"1\" -args \"g1hd3gwzevxlqmd3jsf64mpfczag8a8e5j2wdn3c\" -args 12 -args \"i am new user\" -gas-fee \"1000000ugnot\" -gas-wanted \"4000000\" -broadcast -chainid dev -remote 0.0.0.0:26657 -pkgpath \"gno.land/r/demo/groups\" test1\n\n### - delete member\n\n ./build/gnokey maketx call -func \"DeleteMember\" -args \"1\" -args \"0\" -gas-fee \"1000000ugnot\" -gas-wanted \"4000000\" -broadcast -chainid dev -remote 0.0.0.0:26657 -pkgpath \"gno.land/r/demo/groups\" test1\n\n### - delete group\n\n ./build/gnokey maketx call -func \"DeleteGroup\" -args \"1\" -gas-fee \"1000000ugnot\" -gas-wanted \"4000000\" -broadcast -chainid dev -remote 0.0.0.0:26657 -pkgpath \"gno.land/r/demo/groups\" test1\n\n"},{"name":"group.gno","body":"package groups\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"gno.land/p/demo/avl\"\n)\n\ntype GroupID uint64\n\nfunc (gid GroupID) String() string {\n\treturn strconv.Itoa(int(gid))\n}\n\ntype Group struct {\n\tid GroupID\n\turl string\n\tname string\n\tlastMemberID MemberID\n\tmembers avl.Tree\n\tcreator std.Address\n\tcreatedAt time.Time\n}\n\nfunc newGroup(url string, name string, creator std.Address) *Group {\n\tif !reName.MatchString(name) {\n\t\tpanic(\"invalid name: \" + name)\n\t}\n\tif gGroupsByName.Has(name) {\n\t\tpanic(\"Group with such name already exists\")\n\t}\n\treturn \u0026Group{\n\t\tid: incGetGroupID(),\n\t\turl: url,\n\t\tname: name,\n\t\tcreator: creator,\n\t\tmembers: avl.Tree{},\n\t\tcreatedAt: time.Now(),\n\t}\n}\n\nfunc (group *Group) newMember(id MemberID, address std.Address, weight int, metadata string) *Member {\n\tif group.members.Has(address.String()) {\n\t\tpanic(\"this member for this group already exists\")\n\t}\n\treturn \u0026Member{\n\t\tid: id,\n\t\taddress: address,\n\t\tweight: weight,\n\t\tmetadata: metadata,\n\t\tcreatedAt: time.Now(),\n\t}\n}\n\nfunc (group *Group) HasPermission(addr std.Address, perm Permission) bool {\n\tif group.creator != addr {\n\t\treturn false\n\t}\n\treturn isValidPermission(perm)\n}\n\nfunc (group *Group) RenderGroup() string {\n\tstr := \"Group ID: \" + groupIDKey(group.id) + \"\\n\\n\" +\n\t\t\"Group Name: \" + group.name + \"\\n\\n\" +\n\t\t\"Group Creator: \" + usernameOf(group.creator) + \"\\n\\n\" +\n\t\t\"Group createdAt: \" + group.createdAt.String() + \"\\n\\n\" +\n\t\t\"Group Last MemberID: \" + memberIDKey(group.lastMemberID) + \"\\n\\n\"\n\n\tstr += \"Group Members: \\n\\n\"\n\tgroup.members.Iterate(\"\", \"\", func(key string, value interface{}) bool {\n\t\tmember := value.(*Member)\n\t\tstr += member.getMemberStr()\n\t\treturn false\n\t})\n\treturn str\n}\n\nfunc (group *Group) deleteGroup() {\n\tgidkey := groupIDKey(group.id)\n\t_, gGroupsRemoved := gGroups.Remove(gidkey)\n\tif !gGroupsRemoved {\n\t\tpanic(\"group does not exist with id \" + group.id.String())\n\t}\n\tgGroupsByName.Remove(group.name)\n}\n\nfunc (group *Group) deleteMember(mid MemberID) {\n\tgidkey := groupIDKey(group.id)\n\tif !gGroups.Has(gidkey) {\n\t\tpanic(\"group does not exist with id \" + group.id.String())\n\t}\n\n\tg := getGroup(group.id)\n\tmidkey := memberIDKey(mid)\n\tg.members.Remove(midkey)\n}\n"},{"name":"groups.gno","body":"package groups\n\nimport (\n\t\"regexp\"\n\n\t\"gno.land/p/demo/avl\"\n)\n\n//----------------------------------------\n// Realm (package) state\n\nvar (\n\tgGroups avl.Tree // id -\u003e *Group\n\tgGroupsCtr int // increments Group.id\n\tgGroupsByName avl.Tree // name -\u003e *Group\n)\n\n//----------------------------------------\n// Constants\n\nvar reName = regexp.MustCompile(`^[a-z]+[_a-z0-9]{2,29}$`)\n"},{"name":"member.gno","body":"package groups\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\t\"time\"\n)\n\ntype MemberID uint64\n\ntype Member struct {\n\tid MemberID\n\taddress std.Address\n\tweight int\n\tmetadata string\n\tcreatedAt time.Time\n}\n\nfunc (mid MemberID) String() string {\n\treturn strconv.Itoa(int(mid))\n}\n\nfunc (member *Member) getMemberStr() string {\n\tmemberDataStr := \"\"\n\tmemberDataStr += \"\\t\\t\\t[\" + memberIDKey(member.id) + \", \" + member.address.String() + \", \" + strconv.Itoa(member.weight) + \", \" + member.metadata + \", \" + member.createdAt.String() + \"],\\n\\n\"\n\treturn memberDataStr\n}\n"},{"name":"misc.gno","body":"package groups\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"gno.land/r/demo/users\"\n)\n\n//----------------------------------------\n// private utility methods\n// XXX ensure these cannot be called from public.\n\nfunc getGroup(gid GroupID) *Group {\n\tgidkey := groupIDKey(gid)\n\tgroup_, exists := gGroups.Get(gidkey)\n\tif !exists {\n\t\tpanic(\"group id (\" + gid.String() + \") does not exists\")\n\t}\n\tgroup := group_.(*Group)\n\treturn group\n}\n\nfunc incGetGroupID() GroupID {\n\tgGroupsCtr++\n\treturn GroupID(gGroupsCtr)\n}\n\nfunc padLeft(str string, length int) string {\n\tif len(str) \u003e= length {\n\t\treturn str\n\t}\n\treturn strings.Repeat(\" \", length-len(str)) + str\n}\n\nfunc padZero(u64 uint64, length int) string {\n\tstr := strconv.Itoa(int(u64))\n\tif len(str) \u003e= length {\n\t\treturn str\n\t}\n\treturn strings.Repeat(\"0\", length-len(str)) + str\n}\n\nfunc groupIDKey(gid GroupID) string {\n\treturn padZero(uint64(gid), 10)\n}\n\nfunc memberIDKey(mid MemberID) string {\n\treturn padZero(uint64(mid), 10)\n}\n\nfunc indentBody(indent string, body string) string {\n\tlines := strings.Split(body, \"\\n\")\n\tres := \"\"\n\tfor i, line := range lines {\n\t\tif i \u003e 0 {\n\t\t\tres += \"\\n\"\n\t\t}\n\t\tres += indent + line\n\t}\n\treturn res\n}\n\n// NOTE: length must be greater than 3.\nfunc summaryOf(str string, length int) string {\n\tlines := strings.SplitN(str, \"\\n\", 2)\n\tline := lines[0]\n\tif len(line) \u003e length {\n\t\tline = line[:(length-3)] + \"...\"\n\t} else if len(lines) \u003e 1 {\n\t\t// len(line) \u003c= 80\n\t\tline = line + \"...\"\n\t}\n\treturn line\n}\n\nfunc displayAddressMD(addr std.Address) string {\n\tuser := users.GetUserByAddress(addr)\n\tif user == nil {\n\t\treturn \"[\" + addr.String() + \"](/r/demo/users:\" + addr.String() + \")\"\n\t}\n\treturn \"[@\" + user.Name + \"](/r/demo/users:\" + user.Name + \")\"\n}\n\nfunc usernameOf(addr std.Address) string {\n\tuser := users.GetUserByAddress(addr)\n\tif user == nil {\n\t\tpanic(\"user not found\")\n\t}\n\treturn user.Name\n}\n\nfunc isValidPermission(perm Permission) bool {\n\treturn perm == EditPermission || perm == DeletePermission\n}\n"},{"name":"public.gno","body":"package groups\n\nimport (\n\t\"std\"\n\n\t\"gno.land/r/demo/users\"\n)\n\n//----------------------------------------\n// Public facing functions\n\nfunc GetGroupIDFromName(name string) (GroupID, bool) {\n\tgroupI, exists := gGroupsByName.Get(name)\n\tif !exists {\n\t\treturn 0, false\n\t}\n\treturn groupI.(*Group).id, true\n}\n\nfunc CreateGroup(name string) GroupID {\n\tstd.AssertOriginCall()\n\tcaller := std.GetOrigCaller()\n\tusernameOf(caller)\n\turl := \"/r/demo/groups:\" + name\n\tgroup := newGroup(url, name, caller)\n\tgidkey := groupIDKey(group.id)\n\tgGroups.Set(gidkey, group)\n\tgGroupsByName.Set(name, group)\n\treturn group.id\n}\n\nfunc AddMember(gid GroupID, address string, weight int, metadata string) MemberID {\n\tstd.AssertOriginCall()\n\tcaller := std.GetOrigCaller()\n\tusernameOf(caller)\n\tgroup := getGroup(gid)\n\tif !group.HasPermission(caller, EditPermission) {\n\t\tpanic(\"unauthorized to edit group\")\n\t}\n\tuser := users.GetUserByAddress(std.Address(address))\n\tif user == nil {\n\t\tpanic(\"unknown address \" + address)\n\t}\n\tmid := group.lastMemberID\n\tmember := group.newMember(mid, std.Address(address), weight, metadata)\n\tmidkey := memberIDKey(mid)\n\tgroup.members.Set(midkey, member)\n\tmid++\n\tgroup.lastMemberID = mid\n\treturn member.id\n}\n\nfunc DeleteGroup(gid GroupID) {\n\tstd.AssertOriginCall()\n\tcaller := std.GetOrigCaller()\n\tgroup := getGroup(gid)\n\tif !group.HasPermission(caller, DeletePermission) {\n\t\tpanic(\"unauthorized to delete group\")\n\t}\n\tgroup.deleteGroup()\n}\n\nfunc DeleteMember(gid GroupID, mid MemberID) {\n\tstd.AssertOriginCall()\n\tcaller := std.GetOrigCaller()\n\tgroup := getGroup(gid)\n\tif !group.HasPermission(caller, DeletePermission) {\n\t\tpanic(\"unauthorized to delete member\")\n\t}\n\tgroup.deleteMember(mid)\n}\n"},{"name":"render.gno","body":"package groups\n\nimport (\n\t\"strings\"\n)\n\n//----------------------------------------\n// Render functions\n\nfunc RenderGroup(gid GroupID) string {\n\tgroup := getGroup(gid)\n\tif group == nil {\n\t\treturn \"missing Group\"\n\t}\n\treturn group.RenderGroup()\n}\n\nfunc Render(path string) string {\n\tif path == \"\" {\n\t\tstr := \"List of all Groups:\\n\\n\"\n\t\tgGroups.Iterate(\"\", \"\", func(key string, value interface{}) bool {\n\t\t\tgroup := value.(*Group)\n\t\t\tstr += \" * [\" + group.name + \"](\" + group.url + \")\\n\"\n\t\t\treturn false\n\t\t})\n\t\treturn str\n\t}\n\tparts := strings.Split(path, \"/\")\n\tif len(parts) == 1 {\n\t\t// /r/demo/groups:Group_NAME\n\t\tname := parts[0]\n\t\tgroupI, exists := gGroupsByName.Get(name)\n\t\tif !exists {\n\t\t\treturn \"Group does not exist: \" + name\n\t\t}\n\t\treturn groupI.(*Group).RenderGroup()\n\t} else {\n\t\treturn \"unrecognized path \" + path\n\t}\n}\n"},{"name":"role.gno","body":"package groups\n\ntype Permission string\n\nconst (\n\tDeletePermission Permission = \"role:delete\"\n\tEditPermission Permission = \"role:edit\"\n)\n"},{"name":"z_0_a_filetest.gno","body":"// PKGPATH: gno.land/r/demo/groups_test\npackage groups_test\n\nimport (\n\t\"gno.land/r/demo/groups\"\n)\n\nvar gid groups.GroupID\n\nfunc main() {\n\tgid = groups.CreateGroup(\"test_group\")\n\tprintln(gid)\n\tprintln(groups.Render(\"\"))\n}\n\n// Error:\n// user not found\n"},{"name":"z_0_b_filetest.gno","body":"// PKGPATH: gno.land/r/demo/groups_test\npackage groups_test\n\nimport (\n\t\"gno.land/r/demo/groups\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar gid groups.GroupID\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tgid = groups.CreateGroup(\"test_group\")\n\tprintln(gid)\n\tprintln(groups.Render(\"\"))\n}\n\n// Error:\n// payment must not be less than 20000000\n"},{"name":"z_0_c_filetest.gno","body":"// PKGPATH: gno.land/r/demo/groups_test\npackage groups_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"gno.land/r/demo/groups\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar gid groups.GroupID\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tgid = groups.CreateGroup(\"test_group\")\n\tprintln(gid)\n\tprintln(groups.Render(\"\"))\n}\n\n// Output:\n// 1\n// List of all Groups:\n//\n// * [test_group](/r/demo/groups:test_group)\n"},{"name":"z_1_a_filetest.gno","body":"// PKGPATH: gno.land/r/demo/groups_test\npackage groups_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/groups\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar gid groups.GroupID\n\nconst admin = std.Address(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\")\n\nfunc main() {\n\tcaller := std.GetOrigCaller() // main\n\tusers.Register(\"\", \"gnouser0\", \"my profile 1\")\n\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\")\n\t// switch back to caller\n\tstd.TestSetOrigCaller(caller)\n\t// invite another addr\n\ttest1 := testutils.TestAddress(\"gnouser1\")\n\tusers.Invite(test1.String())\n\t// switch to test1\n\tstd.TestSetOrigCaller(test1)\n\tusers.Register(caller, \"gnouser1\", \"my other profile 1\")\n\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\")\n\t// switch back to caller\n\tstd.TestSetOrigCaller(caller)\n\t// invite another addr\n\ttest2 := testutils.TestAddress(\"gnouser2\")\n\tusers.Invite(test2.String())\n\t// switch to test1\n\tstd.TestSetOrigCaller(test2)\n\tusers.Register(caller, \"gnouser2\", \"my other profile 2\")\n\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\")\n\t// switch back to caller\n\tstd.TestSetOrigCaller(caller)\n\t// invite another addr\n\ttest3 := testutils.TestAddress(\"gnouser3\")\n\tusers.Invite(test3.String())\n\t// switch to test1\n\tstd.TestSetOrigCaller(test3)\n\tusers.Register(caller, \"gnouser3\", \"my other profile 3\")\n\n\tstd.TestSetOrigCaller(caller)\n\n\tgid = groups.CreateGroup(\"test_group\")\n\tprintln(gid)\n\n\tgroups.AddMember(gid, test3.String(), 32, \"i am from UAE\")\n\tprintln(groups.Render(\"test_group\"))\n}\n\n// Output:\n// 1\n// Group ID: 0000000001\n//\n// Group Name: test_group\n//\n// Group Creator: gnouser0\n//\n// Group createdAt: 2009-02-13 23:31:30 +0000 UTC m=+1234567890.000000001\n//\n// Group Last MemberID: 0000000001\n//\n// Group Members:\n//\n// \t\t\t[0000000000, g1vahx7atnv4erxh6lta047h6lta047h6ll85gpy, 32, i am from UAE, 2009-02-13 23:31:30 +0000 UTC m=+1234567890.000000001],\n"},{"name":"z_1_b_filetest.gno","body":"// PKGPATH: gno.land/r/demo/groups_test\npackage groups_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"gno.land/r/demo/groups\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar gid groups.GroupID\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tgid = groups.CreateGroup(\"test_group\")\n\tprintln(gid)\n\tgroups.AddMember(2, \"g1vahx7atnv4erxh6lta047h6lta047h6ll85gpy\", 55, \"metadata3\")\n\tprintln(groups.Render(\"\"))\n}\n\n// Error:\n// group id (2) does not exists\n"},{"name":"z_1_c_filetest.gno","body":"// PKGPATH: gno.land/r/demo/groups_test\npackage groups_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/groups\"\n)\n\nvar gid groups.GroupID\n\nfunc main() {\n\tgid = groups.CreateGroup(\"test_group\")\n\tprintln(gid)\n\n\t// add member via anon user\n\ttest2 := testutils.TestAddress(\"test2\")\n\tstd.TestSetOrigCaller(test2)\n\tstd.TestSetOrigSend(std.Coins{{\"ugnot\", 9000000}}, nil)\n\n\tgroups.AddMember(gid, test2.String(), 42, \"metadata3\")\n}\n\n// Error:\n// user not found\n"},{"name":"z_2_a_filetest.gno","body":"// PKGPATH: gno.land/r/demo/groups_test\npackage groups_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/groups\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar gid groups.GroupID\n\nconst admin = std.Address(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\")\n\nfunc main() {\n\tcaller := std.GetOrigCaller() // main\n\tusers.Register(\"\", \"gnouser0\", \"my profile 1\")\n\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\")\n\t// switch back to caller\n\tstd.TestSetOrigCaller(caller)\n\t// invite another addr\n\ttest1 := testutils.TestAddress(\"gnouser1\")\n\tusers.Invite(test1.String())\n\t// switch to test1\n\tstd.TestSetOrigCaller(test1)\n\tusers.Register(caller, \"gnouser1\", \"my other profile 1\")\n\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\")\n\t// switch back to caller\n\tstd.TestSetOrigCaller(caller)\n\t// invite another addr\n\ttest2 := testutils.TestAddress(\"gnouser2\")\n\tusers.Invite(test2.String())\n\t// switch to test1\n\tstd.TestSetOrigCaller(test2)\n\tusers.Register(caller, \"gnouser2\", \"my other profile 2\")\n\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\")\n\t// switch back to caller\n\tstd.TestSetOrigCaller(caller)\n\t// invite another addr\n\ttest3 := testutils.TestAddress(\"gnouser3\")\n\tusers.Invite(test3.String())\n\t// switch to test1\n\tstd.TestSetOrigCaller(test3)\n\tusers.Register(caller, \"gnouser3\", \"my other profile 3\")\n\n\tstd.TestSetOrigCaller(caller)\n\n\tgid = groups.CreateGroup(\"test_group\")\n\tprintln(gid)\n\n\tgroups.AddMember(gid, test2.String(), 42, \"metadata3\")\n\n\tgroups.DeleteMember(gid, 0)\n\tprintln(groups.RenderGroup(gid))\n}\n\n// Output:\n// 1\n// Group ID: 0000000001\n//\n// Group Name: test_group\n//\n// Group Creator: gnouser0\n//\n// Group createdAt: 2009-02-13 23:31:30 +0000 UTC m=+1234567890.000000001\n//\n// Group Last MemberID: 0000000001\n//\n// Group Members:\n"},{"name":"z_2_b_filetest.gno","body":"// PKGPATH: gno.land/r/demo/groups_test\npackage groups_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"gno.land/r/demo/groups\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar gid groups.GroupID\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tgid = groups.CreateGroup(\"test_group\")\n\tprintln(gid)\n\tgroups.DeleteMember(2, 0)\n\tprintln(groups.Render(\"\"))\n}\n\n// Error:\n// group id (2) does not exists\n"},{"name":"z_2_d_filetest.gno","body":"// PKGPATH: gno.land/r/demo/groups_test\npackage groups_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/groups\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar gid groups.GroupID\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tgid = groups.CreateGroup(\"test_group\")\n\tprintln(gid)\n\n\t// delete member via anon user\n\ttest2 := testutils.TestAddress(\"test2\")\n\tstd.TestSetOrigCaller(test2)\n\tstd.TestSetOrigSend(std.Coins{{\"ugnot\", 9000000}}, nil)\n\n\tgroups.DeleteMember(gid, 0)\n\tprintln(groups.Render(\"\"))\n}\n\n// Error:\n// unauthorized to delete member\n"},{"name":"z_2_e_filetest.gno","body":"// PKGPATH: gno.land/r/demo/groups_test\npackage groups_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"gno.land/r/demo/groups\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar gid groups.GroupID\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tgid = groups.CreateGroup(\"test_group\")\n\tprintln(gid)\n\tgroups.DeleteGroup(gid)\n\tprintln(groups.Render(\"\"))\n}\n\n// Output:\n// 1\n// List of all Groups:\n"},{"name":"z_2_f_filetest.gno","body":"// PKGPATH: gno.land/r/demo/groups_test\npackage groups_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"gno.land/r/demo/groups\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar gid groups.GroupID\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tgid = groups.CreateGroup(\"test_group\")\n\tprintln(gid)\n\tgroups.DeleteGroup(20)\n\tprintln(groups.Render(\"\"))\n}\n\n// Error:\n// group id (20) does not exists\n"},{"name":"z_2_g_filetest.gno","body":"// PKGPATH: gno.land/r/demo/groups_test\npackage groups_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/groups\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar gid groups.GroupID\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tgid = groups.CreateGroup(\"test_group\")\n\tprintln(gid)\n\n\t// delete group via anon user\n\ttest2 := testutils.TestAddress(\"test2\")\n\tstd.TestSetOrigCaller(test2)\n\tstd.TestSetOrigSend(std.Coins{{\"ugnot\", 9000000}}, nil)\n\n\tgroups.DeleteGroup(gid)\n\tprintln(groups.Render(\"\"))\n}\n\n// Error:\n// unauthorized to delete group\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"keystore","path":"gno.land/r/demo/keystore","files":[{"name":"keystore.gno","body":"package keystore\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar data avl.Tree\n\nconst (\n\tBaseURL = \"/r/demo/keystore\"\n\tStatusOK = \"ok\"\n\tStatusNoUser = \"user not found\"\n\tStatusNotFound = \"key not found\"\n\tStatusNoWriteAccess = \"no write access\"\n\tStatusCouldNotExecute = \"could not execute\"\n\tStatusNoDatabases = \"no databases\"\n)\n\nfunc init() {\n\tdata = avl.Tree{} // user -\u003e avl.Tree\n}\n\n// KeyStore stores the owner-specific avl.Tree\ntype KeyStore struct {\n\tOwner std.Address\n\tData avl.Tree\n}\n\n// Set will set a value to a key\n// requires write-access (original caller must be caller)\nfunc Set(k, v string) string {\n\torigOwner := std.GetOrigCaller()\n\treturn set(origOwner.String(), k, v)\n}\n\n// set (private) will set a key to value\n// requires write-access (original caller must be caller)\nfunc set(owner, k, v string) string {\n\torigOwner := std.GetOrigCaller()\n\tif origOwner.String() != owner {\n\t\treturn StatusNoWriteAccess\n\t}\n\tvar keystore *KeyStore\n\tkeystoreInterface, exists := data.Get(owner)\n\tif !exists {\n\t\tkeystore = \u0026KeyStore{\n\t\t\tOwner: origOwner,\n\t\t\tData: avl.Tree{},\n\t\t}\n\t\tdata.Set(owner, keystore)\n\t} else {\n\t\tkeystore = keystoreInterface.(*KeyStore)\n\t}\n\tkeystore.Data.Set(k, v)\n\treturn StatusOK\n}\n\n// Remove removes a key\n// requires write-access (original owner must be caller)\nfunc Remove(k string) string {\n\torigOwner := std.GetOrigCaller()\n\treturn remove(origOwner.String(), k)\n}\n\n// remove (private) removes a key\n// requires write-access (original owner must be caller)\nfunc remove(owner, k string) string {\n\torigOwner := std.GetOrigCaller()\n\tif origOwner.String() != owner {\n\t\treturn StatusNoWriteAccess\n\t}\n\tvar keystore *KeyStore\n\tkeystoreInterface, exists := data.Get(owner)\n\tif !exists {\n\t\tkeystore = \u0026KeyStore{\n\t\t\tOwner: origOwner,\n\t\t\tData: avl.Tree{},\n\t\t}\n\t\tdata.Set(owner, keystore)\n\t} else {\n\t\tkeystore = keystoreInterface.(*KeyStore)\n\t}\n\t_, removed := keystore.Data.Remove(k)\n\tif !removed {\n\t\treturn StatusCouldNotExecute\n\t}\n\treturn StatusOK\n}\n\n// Get returns a value for a key\n// read-only\nfunc Get(k string) string {\n\torigOwner := std.GetOrigCaller()\n\treturn remove(origOwner.String(), k)\n}\n\n// get (private) returns a value for a key\n// read-only\nfunc get(owner, k string) string {\n\tkeystoreInterface, exists := data.Get(owner)\n\tif !exists {\n\t\treturn StatusNoUser\n\t}\n\tkeystore := keystoreInterface.(*KeyStore)\n\tval, found := keystore.Data.Get(k)\n\tif !found {\n\t\treturn StatusNotFound\n\t}\n\treturn val.(string)\n}\n\n// Size returns size of database\n// read-only\nfunc Size() string {\n\torigOwner := std.GetOrigCaller()\n\treturn size(origOwner.String())\n}\n\nfunc size(owner string) string {\n\tkeystoreInterface, exists := data.Get(owner)\n\tif !exists {\n\t\treturn StatusNoUser\n\t}\n\tkeystore := keystoreInterface.(*KeyStore)\n\treturn ufmt.Sprintf(\"%d\", keystore.Data.Size())\n}\n\n// Render provides read-only url access to the functions of the keystore\n// \"\" -\u003e show all keystores listed by owner\n// \"owner\" -\u003e show all keys for that owner's keystore\n// \"owner:size\" -\u003e returns size of owner's keystore\n// \"owner:get:key\" -\u003e show value for that key in owner's keystore\nfunc Render(p string) string {\n\tvar response string\n\targs := strings.Split(p, \":\")\n\tnumArgs := len(args)\n\tif p == \"\" {\n\t\tnumArgs = 0\n\t}\n\tswitch numArgs {\n\tcase 0:\n\t\tif data.Size() == 0 {\n\t\t\treturn StatusNoDatabases\n\t\t}\n\t\tdata.Iterate(\"\", \"\", func(key string, value interface{}) bool {\n\t\t\tks := value.(*KeyStore)\n\t\t\tresponse += ufmt.Sprintf(\"- [%s](%s:%s) (%d keys)\\n\", ks.Owner, BaseURL, ks.Owner, ks.Data.Size())\n\t\t\treturn false\n\t\t})\n\tcase 1:\n\t\towner := args[0]\n\t\tkeystoreInterface, exists := data.Get(owner)\n\t\tif !exists {\n\t\t\treturn StatusNoUser\n\t\t}\n\t\tks := keystoreInterface.(*KeyStore)\n\t\ti := 0\n\t\tresponse += ufmt.Sprintf(\"# %s database\\n\\n\", ks.Owner)\n\t\tks.Data.Iterate(\"\", \"\", func(key string, value interface{}) bool {\n\t\t\tresponse += ufmt.Sprintf(\"- %d [%s](%s:%s:get:%s)\\n\", i, key, BaseURL, ks.Owner, key)\n\t\t\ti++\n\t\t\treturn false\n\t\t})\n\tcase 2:\n\t\towner := args[0]\n\t\tcmd := args[1]\n\t\tif cmd == \"size\" {\n\t\t\treturn size(owner)\n\t\t}\n\tcase 3:\n\t\towner := args[0]\n\t\tcmd := args[1]\n\t\tkey := args[2]\n\t\tif cmd == \"get\" {\n\t\t\treturn get(owner, key)\n\t\t}\n\t}\n\n\treturn response\n}\n"},{"name":"keystore_test.gno","body":"package keystore\n\nimport (\n\t\"std\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/p/demo/uassert\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nfunc TestRender(t *testing.T) {\n\tconst (\n\t\tauthor1 std.Address = testutils.TestAddress(\"author1\")\n\t\tauthor2 std.Address = testutils.TestAddress(\"author2\")\n\t)\n\n\ttt := []struct {\n\t\tcaller std.Address\n\t\towner std.Address\n\t\tps []string\n\t\texp string\n\t}{\n\t\t// can set database if the owner is the caller\n\t\t{author1, author1, []string{\"set\", \"hello\", \"gno\"}, StatusOK},\n\t\t{author1, author1, []string{\"size\"}, \"1\"},\n\t\t{author1, author1, []string{\"set\", \"hello\", \"world\"}, StatusOK},\n\t\t{author1, author1, []string{\"size\"}, \"1\"},\n\t\t{author1, author1, []string{\"set\", \"hi\", \"gno\"}, StatusOK},\n\t\t{author1, author1, []string{\"size\"}, \"2\"},\n\t\t// only owner can remove\n\t\t{author1, author1, []string{\"remove\", \"hi\"}, StatusOK},\n\t\t{author1, author1, []string{\"get\", \"hi\"}, StatusNotFound},\n\t\t{author1, author1, []string{\"size\"}, \"1\"},\n\t\t// add back\n\t\t{author1, author1, []string{\"set\", \"hi\", \"gno\"}, StatusOK},\n\t\t{author1, author1, []string{\"size\"}, \"2\"},\n\n\t\t// different owner has different database\n\t\t{author2, author2, []string{\"set\", \"hello\", \"universe\"}, StatusOK},\n\t\t// either author can get the other info\n\t\t{author1, author2, []string{\"get\", \"hello\"}, \"universe\"},\n\t\t// either author can get the other info\n\t\t{author2, author1, []string{\"get\", \"hello\"}, \"world\"},\n\t\t{author1, author2, []string{\"get\", \"hello\"}, \"universe\"},\n\t\t// anyone can view the databases\n\t\t{author1, author2, []string{}, `- [g1v96hg6r0wgc47h6lta047h6lta047h6lm33tq6](/r/demo/keystore:g1v96hg6r0wgc47h6lta047h6lta047h6lm33tq6) (2 keys)\n- [g1v96hg6r0wge97h6lta047h6lta047h6lyz7c00](/r/demo/keystore:g1v96hg6r0wge97h6lta047h6lta047h6lyz7c00) (1 keys)`},\n\t\t// anyone can view the keys in a database\n\t\t{author1, author2, []string{\"\"}, `# g1v96hg6r0wge97h6lta047h6lta047h6lyz7c00 database\n\n- 0 [hello](/r/demo/keystore:g1v96hg6r0wge97h6lta047h6lta047h6lyz7c00:get:hello)`},\n\t}\n\tfor _, tc := range tt {\n\t\tp := \"\"\n\t\tif len(tc.ps) \u003e 0 {\n\t\t\tp = tc.owner.String()\n\t\t\tfor i, psv := range tc.ps {\n\t\t\t\tp += \":\" + psv\n\t\t\t}\n\t\t}\n\t\tp = strings.TrimSuffix(p, \":\")\n\t\tt.Run(p, func(t *testing.T) {\n\t\t\tstd.TestSetOrigCaller(tc.caller)\n\t\t\tvar act string\n\t\t\tif len(tc.ps) \u003e 0 \u0026\u0026 tc.ps[0] == \"set\" {\n\t\t\t\tact = strings.TrimSpace(Set(tc.ps[1], tc.ps[2]))\n\t\t\t} else if len(tc.ps) \u003e 0 \u0026\u0026 tc.ps[0] == \"remove\" {\n\t\t\t\tact = strings.TrimSpace(Remove(tc.ps[1]))\n\t\t\t} else {\n\t\t\t\tact = strings.TrimSpace(Render(p))\n\t\t\t}\n\n\t\t\tuassert.Equal(t, tc.exp, act, ufmt.Sprintf(\"%v -\u003e '%s'\", tc.ps, p))\n\t\t})\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"markdown","path":"gno.land/r/demo/markdown_test","files":[{"name":"markdown.gno","body":"package markdown\n\n// this package can be used to test markdown rendering engines.\n\nfunc Render(path string) string {\n\toutput := `_imported from https://github.com/markedjs/marked/blob/master/docs/demo/quickref.md_\n\nMarkdown Quick Reference\n========================\n\nThis guide is a very brief overview, with examples, of the syntax that [Markdown] supports. It is itself written in Markdown and you can copy the samples over to the left-hand pane for experimentation. It's shown as *text* and not *rendered HTML*.\n\n[Markdown]: http://daringfireball.net/projects/markdown/\n\n\nSimple Text Formatting\n======================\n\nFirst thing is first. You can use *stars* or _underscores_ for italics. **Double stars** and __double underscores__ for bold. ***Three together*** for ___both___.\n\nParagraphs are pretty easy too. Just have a blank line between chunks of text.\n\n\u003e This chunk of text is in a block quote. Its multiple lines will all be\n\u003e indented a bit from the rest of the text.\n\u003e\n\u003e \u003e Multiple levels of block quotes also work.\n\nSometimes you want to include code, such as when you are explaining how ` + \"`\u003ch1\u003e`\" + ` HTML tags work, or maybe you are a programmer and you are discussing ` + \"`someMethod()`\" + `.\n\nIf you want to include code and have new\nlines preserved, indent the line with a tab\nor at least four spaces:\n\n Extra spaces work here too.\n This is also called preformatted text and it is useful for showing examples.\n The text will stay as text, so any *markdown* or \u003cu\u003eHTML\u003c/u\u003e you add will\n not show up formatted. This way you can show markdown examples in a\n markdown document.\n\n\u003e You can also use preformatted text with your blockquotes\n\u003e as long as you add at least five spaces.\n\n\nHeadings\n========\n\nThere are a couple of ways to make headings. Using three or more equals signs on a line under a heading makes it into an \"h1\" style. Three or more hyphens under a line makes it \"h2\" (slightly smaller). You can also use multiple pound symbols (` + \"`#`\" + `) before and after a heading. Pounds after the title are ignored. Here are some examples:\n\nThis is H1\n==========\n\nThis is H2\n----------\n\n# This is H1\n## This is H2\n### This is H3 with some extra pounds ###\n#### You get the idea ####\n##### I don't need extra pounds at the end\n###### H6 is the max\n\n\nLinks\n=====\n\nLet's link to a few sites. First, let's use the bare URL, like \u003chttps://www.github.com\u003e. Great for text, but ugly for HTML.\nNext is an inline link to [Google](https://www.google.com). A little nicer.\nThis is a reference-style link to [Wikipedia] [1].\nLastly, here's a pretty link to [Yahoo]. The reference-style and pretty links both automatically use the links defined below, but they could be defined *anywhere* in the markdown and are removed from the HTML. The names are also case insensitive, so you can use [YaHoO] and have it link properly.\n\n[1]: https://www.wikipedia.org\n[Yahoo]: https://www.yahoo.com\n\nTitle attributes may be added to links by adding text after a link.\nThis is the [inline link](https://www.bing.com \"Bing\") with a \"Bing\" title.\nYou can also go to [W3C] [2] and maybe visit a [friend].\n\n[2]: https://w3c.org (The W3C puts out specs for web-based things)\n[Friend]: https://facebook.com \"Facebook!\"\n\nEmail addresses in plain text are not linked: test@example.com.\nEmail addresses wrapped in angle brackets are linked: \u003ctest@example.com\u003e.\nThey are also obfuscated so that email harvesting spam robots hopefully won't get them.\n\n\nLists\n=====\n\n* This is a bulleted list\n* Great for shopping lists\n- You can also use hyphens\n+ Or plus symbols\n\nThe above is an \"unordered\" list. Now, on for a bit of order.\n\n1. Numbered lists are also easy\n2. Just start with a number\n3738762. However, the actual number doesn't matter when converted to HTML.\n1. This will still show up as 4.\n\nYou might want a few advanced lists:\n\n- This top-level list is wrapped in paragraph tags\n- This generates an extra space between each top-level item.\n\n- You do it by adding a blank line\n\n- This nested list also has blank lines between the list items.\n\n- How to create nested lists\n 1. Start your regular list\n 2. Indent nested lists with two spaces\n 3. Further nesting means you should indent with two more spaces\n * This line is indented with four spaces.\n\n- List items can be quite lengthy. You can keep typing and either continue\nthem on the next line with no indentation.\n\n- Alternately, if that looks ugly, you can also\n indent the next line a bit for a prettier look.\n\n- You can put large blocks of text in your list by just indenting with two spaces.\n\n This is formatted the same as code, but you can inspect the HTML\n and find that it's just wrapped in a ` + \"`\u003cp\u003e`\" + ` tag and *won't* be shown\n as preformatted text.\n\n You can keep adding more and more paragraphs to a single\n list item by adding the traditional blank line and then keep\n on indenting the paragraphs with two spaces.\n\n You really only need to indent the first line,\nbut that looks ugly.\n\n- Lists support blockquotes\n\n \u003e Just like this example here. By the way, you can\n \u003e nest lists inside blockquotes!\n \u003e - Fantastic!\n\n- Lists support preformatted text\n\n You just need to indent an additional four spaces.\n\n\nEven More\n=========\n\nHorizontal Rule\n---------------\n\nIf you need a horizontal rule you just need to put at least three hyphens, asterisks, or underscores on a line by themselves. You can also even put spaces between the characters.\n\n---\n****************************\n_ _ _ _ _ _ _\n\nThose three all produced horizontal lines. Keep in mind that three hyphens under any text turns that text into a heading, so add a blank like if you use hyphens.\n\nImages\n------\n\nImages work exactly like links, but they have exclamation points in front. They work with references and titles too.\n\n![Google Logo](https://www.google.com/images/errors/logo_sm.gif) and ![Happy].\n\n[Happy]: https://wpclipart.com/smiley/happy/simple_colors/smiley_face_simple_green_small.png (\"Smiley face\")\n\n\nInline HTML\n-----------\n\nIf markdown is too limiting, you can just insert your own \u003cstrike\u003ecrazy\u003c/strike\u003e HTML. Span-level HTML \u003cu\u003ecan *still* use markdown\u003c/u\u003e. Block level elements must be separated from text by a blank line and must not have any spaces before the opening and closing HTML.\n\n\u003cdiv style='font-family: \"Comic Sans MS\", \"Comic Sans\", cursive;'\u003e\nIt is a pity, but markdown does **not** work in here for most markdown parsers.\n[Marked] handles it pretty well.\n\u003c/div\u003e`\n\treturn output\n}\n"},{"name":"markdown_test.gno","body":"package markdown\n\nimport (\n\t\"strings\"\n\t\"testing\"\n)\n\nfunc TestRender(t *testing.T) {\n\toutput := Render(\"\")\n\tif !strings.Contains(output, \"\\nMarkdown Quick Reference\\n\") {\n\t\tt.Errorf(\"invalid output\")\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"eval","path":"gno.land/r/demo/math_eval","files":[{"name":"math_eval.gno","body":"// eval realm is capable of evaluating 32-bit integer\n// expressions as they would appear in Go. For example:\n// /r/demo/math_eval:(4+12)/2-1+11*15\npackage eval\n\nimport (\n\tevalint32 \"gno.land/p/demo/math_eval/int32\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nfunc Render(p string) string {\n\tif len(p) == 0 {\n\t\treturn `\nevaluates 32-bit integer expressions. for example:\n\t\t\n[(4+12)/2-1+11*15](/r/demo/math_eval:(4+12)/2-1+11*15)\n\n`\n\t}\n\texpr, err := evalint32.Parse(p)\n\tif err != nil {\n\t\treturn err.Error()\n\t}\n\tres, err := evalint32.Eval(expr, nil)\n\tif err != nil {\n\t\treturn err.Error()\n\t}\n\n\treturn ufmt.Sprintf(\"%s = %d\", p, res)\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"memeland","path":"gno.land/r/demo/memeland","files":[{"name":"memeland.gno","body":"package memeland\n\nimport (\n\t\"std\"\n\t\"time\"\n\n\t\"gno.land/p/demo/memeland\"\n)\n\nvar m *memeland.Memeland\n\nfunc init() {\n\tm = memeland.NewMemeland()\n\tm.TransferOwnership(\"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5\")\n}\n\nfunc PostMeme(data string, timestamp int64) string {\n\treturn m.PostMeme(data, timestamp)\n}\n\nfunc Upvote(id string) string {\n\treturn m.Upvote(id)\n}\n\nfunc GetPostsInRange(startTimestamp, endTimestamp int64, page, pageSize int, sortBy string) string {\n\treturn m.GetPostsInRange(startTimestamp, endTimestamp, page, pageSize, sortBy)\n}\n\nfunc RemovePost(id string) string {\n\treturn m.RemovePost(id)\n}\n\nfunc GetOwner() std.Address {\n\treturn m.Owner()\n}\n\nfunc TransferOwnership(newOwner std.Address) {\n\tif err := m.TransferOwnership(newOwner); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc Render(path string) string {\n\tnumOfMemes := int(m.MemeCounter)\n\tif numOfMemes == 0 {\n\t\treturn \"No memes posted yet! :/\"\n\t}\n\n\t// Default render is get Posts since year 2000 to now\n\treturn m.GetPostsInRange(0, time.Now().Unix(), 1, 10, \"DATE_CREATED\")\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"microblog","path":"gno.land/r/demo/microblog","files":[{"name":"README.md","body":"# microblog realm\n\n## Getting started:\n\n(One-time) Add the microblog package:\n\n```\ngnokey maketx addpkg --pkgpath \"gno.land/p/demo/microblog\" --pkgdir \"examples/gno.land/p/demo/microblog\" \\\n --deposit 100000000ugnot --gas-fee 1000000ugnot --gas-wanted 2000000 --broadcast --chainid dev --remote localhost:26657 \u003cYOURKEY\u003e\n```\n\n(One-time) Add the microblog realm:\n\n```\ngnokey maketx addpkg --pkgpath \"gno.land/r/demo/microblog\" --pkgdir \"examples/gno.land/r/demo/microblog\" \\\n --deposit 100000000ugnot --gas-fee 1000000ugnot --gas-wanted 2000000 --broadcast --chainid dev --remote localhost:26657 \u003cYOURKEY\u003e\n```\n\nAdd a microblog post:\n\n```\ngnokey maketx call --pkgpath \"gno.land/r/demo/microblog\" --func \"NewPost\" --args \"hello, world\" \\\n --gas-fee \"1000000ugnot\" --gas-wanted \"2000000\" --broadcast --chainid dev --remote localhost:26657 \u003cYOURKEY\u003e\n```"},{"name":"microblog.gno","body":"// Microblog is a website with shortform posts from users.\n// The API is simple - \"AddPost\" takes markdown and\n// adds it to the users site.\n// The microblog location is determined by the user address\n// /r/demo/microblog:\u003cYOUR-ADDRESS\u003e\npackage microblog\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/microblog\"\n\t\"gno.land/p/demo/ufmt\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\ttitle = \"gno-based microblog\"\n\tprefix = \"/r/demo/microblog:\"\n\tm *microblog.Microblog\n)\n\nfunc init() {\n\tm = microblog.NewMicroblog(title, prefix)\n}\n\nfunc renderHome() string {\n\toutput := ufmt.Sprintf(\"# %s\\n\\n\", m.Title)\n\toutput += \"# pages\\n\\n\"\n\n\tfor _, page := range m.GetPages() {\n\t\tif u := users.GetUserByAddress(page.Author); u != nil {\n\t\t\toutput += ufmt.Sprintf(\"- [%s (%s)](%s%s)\\n\", u.Name, page.Author.String(), m.Prefix, page.Author.String())\n\t\t} else {\n\t\t\toutput += ufmt.Sprintf(\"- [%s](%s%s)\\n\", page.Author.String(), m.Prefix, page.Author.String())\n\t\t}\n\t}\n\n\treturn output\n}\n\nfunc renderUser(user string) string {\n\tsilo, found := m.Pages.Get(user)\n\tif !found {\n\t\treturn \"404\" // StatusNotFound\n\t}\n\n\treturn PageToString((silo.(*microblog.Page)))\n}\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\n\tisHome := path == \"\"\n\tisUser := len(parts) == 1\n\n\tswitch {\n\tcase isHome:\n\t\treturn renderHome()\n\n\tcase isUser:\n\t\treturn renderUser(parts[0])\n\t}\n\n\treturn \"404\" // StatusNotFound\n}\n\nfunc PageToString(p *microblog.Page) string {\n\to := \"\"\n\tif u := users.GetUserByAddress(p.Author); u != nil {\n\t\to += ufmt.Sprintf(\"# [%s](/r/demo/users:%s)\\n\\n\", u, u)\n\t\to += ufmt.Sprintf(\"%s\\n\\n\", u.Profile)\n\t}\n\to += ufmt.Sprintf(\"## [%s](/r/demo/microblog:%s)\\n\\n\", p.Author, p.Author)\n\n\to += ufmt.Sprintf(\"joined %s, last updated %s\\n\\n\", p.CreatedAt.Format(\"2006-02-01\"), p.LastPosted.Format(\"2006-02-01\"))\n\to += \"## feed\\n\\n\"\n\tfor _, u := range p.GetPosts() {\n\t\to += u.String() + \"\\n\\n\"\n\t}\n\treturn o\n}\n\n// NewPost takes a single argument (post markdown) and\n// adds a post to the address of the caller.\nfunc NewPost(text string) string {\n\tif err := m.NewPost(text); err != nil {\n\t\treturn \"unable to add new post\"\n\t}\n\treturn \"added new post\"\n}\n\nfunc Register(name, profile string) string {\n\tcaller := std.GetOrigCaller() // main\n\tusers.Register(caller, name, profile)\n\treturn \"OK\"\n}\n"},{"name":"microblog_test.gno","body":"package microblog\n\nimport (\n\t\"std\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/p/demo/urequire\"\n)\n\nfunc TestMicroblog(t *testing.T) {\n\tconst (\n\t\tauthor1 std.Address = testutils.TestAddress(\"author1\")\n\t\tauthor2 std.Address = testutils.TestAddress(\"author2\")\n\t)\n\n\tstd.TestSetOrigCaller(author1)\n\n\turequire.Equal(t, \"404\", Render(\"/wrongpath\"), \"rendering not giving 404\")\n\turequire.NotEqual(t, \"404\", Render(\"\"), \"rendering / should not give 404\")\n\turequire.NoError(t, m.NewPost(\"goodbyte, web2\"), \"could not create post\")\n\n\t_, err := m.GetPage(author1.String())\n\turequire.NoError(t, err, \"silo should exist\")\n\n\t_, err = m.GetPage(\"no such author\")\n\turequire.Error(t, err, \"silo should not exist\")\n\n\tstd.TestSetOrigCaller(author2)\n\n\turequire.NoError(t, m.NewPost(\"hello, web3\"), \"could not create post\")\n\turequire.NoError(t, m.NewPost(\"hello again, web3\"), \"could not create post\")\n\turequire.NoError(t, m.NewPost(\"hi again,\\n web4?\"), \"could not create post\")\n\n\tprintln(\"--- MICROBLOG ---\\n\\n\")\n\n\texpected := `# gno-based microblog\n\n# pages\n\n- [g1v96hg6r0wgc47h6lta047h6lta047h6lm33tq6](/r/demo/microblog:g1v96hg6r0wgc47h6lta047h6lta047h6lm33tq6)\n- [g1v96hg6r0wge97h6lta047h6lta047h6lyz7c00](/r/demo/microblog:g1v96hg6r0wge97h6lta047h6lta047h6lyz7c00)\n`\n\turequire.Equal(t, expected, Render(\"\"), \"incorrect rendering\")\n\n\texpected = `## [g1v96hg6r0wgc47h6lta047h6lta047h6lm33tq6](/r/demo/microblog:g1v96hg6r0wgc47h6lta047h6lta047h6lm33tq6)\n\njoined 2009-13-02, last updated 2009-13-02\n\n## feed\n\n\u003e goodbyte, web2\n\u003e\n\u003e *Fri, 13 Feb 2009 23:31:30 UTC*`\n\n\turequire.Equal(t, expected, strings.TrimSpace(Render(author1.String())), \"incorrect rendering\")\n\n\texpected = `## [g1v96hg6r0wge97h6lta047h6lta047h6lyz7c00](/r/demo/microblog:g1v96hg6r0wge97h6lta047h6lta047h6lyz7c00)\n\njoined 2009-13-02, last updated 2009-13-02\n\n## feed\n\n\u003e hi again,\n\u003e\n\u003e web4?\n\u003e\n\u003e *Fri, 13 Feb 2009 23:31:30 UTC*\n\n\u003e hello again, web3\n\u003e\n\u003e *Fri, 13 Feb 2009 23:31:30 UTC*\n\n\u003e hello, web3\n\u003e\n\u003e *Fri, 13 Feb 2009 23:31:30 UTC*`\n\n\turequire.Equal(t, expected, strings.TrimSpace(Render(author2.String())), \"incorrect rendering\")\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"nft","path":"gno.land/r/demo/nft","files":[{"name":"README.md","body":"NFT's are all the rage these days, for various reasons.\n\nI read over EIP-721 which appears to be the de-facto NFT standard on Ethereum. Then, made a sample implementation of EIP-721 (let's here called GRC-721). The implementation isn't complete, but it demonstrates the main functionality.\n\n- [EIP-721](https://eips.ethereum.org/EIPS/eip-721)\n- [gno.land/r/demo/nft/nft.go](https://gno.land/r/demo/nft/nft.go)\n- [zrealm_nft3.go test](https://github.com/gnolang/gno/blob/master/tests/files2/zrealm_nft3.gno)\n\nIn short, this demonstrates how to implement Ethereum contract interfaces in gno.land; by using only standard Go language features.\n\nPlease leave a comment ([guide](https://gno.land/r/demo/boards:gnolang/1)).\n"},{"name":"nft.gno","body":"package nft\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/grc/grc721\"\n)\n\ntype token struct {\n\tgrc721.IGRC721 // implements the GRC721 interface\n\n\ttokenCounter int\n\ttokens avl.Tree // grc721.TokenID -\u003e *NFToken{}\n\toperators avl.Tree // owner std.Address -\u003e operator std.Address\n}\n\ntype NFToken struct {\n\towner std.Address\n\tapproved std.Address\n\ttokenID grc721.TokenID\n\tdata string\n}\n\nvar gToken = \u0026token{}\n\nfunc GetToken() *token { return gToken }\n\nfunc (grc *token) nextTokenID() grc721.TokenID {\n\tgrc.tokenCounter++\n\ts := strconv.Itoa(grc.tokenCounter)\n\treturn grc721.TokenID(s)\n}\n\nfunc (grc *token) getToken(tid grc721.TokenID) (*NFToken, bool) {\n\ttoken, ok := grc.tokens.Get(string(tid))\n\tif !ok {\n\t\treturn nil, false\n\t}\n\treturn token.(*NFToken), true\n}\n\nfunc (grc *token) Mint(to std.Address, data string) grc721.TokenID {\n\ttid := grc.nextTokenID()\n\tgrc.tokens.Set(string(tid), \u0026NFToken{\n\t\towner: to,\n\t\ttokenID: tid,\n\t\tdata: data,\n\t})\n\treturn tid\n}\n\nfunc (grc *token) BalanceOf(owner std.Address) (count int64) {\n\tpanic(\"not yet implemented\")\n}\n\nfunc (grc *token) OwnerOf(tid grc721.TokenID) std.Address {\n\ttoken, ok := grc.getToken(tid)\n\tif !ok {\n\t\tpanic(\"token does not exist\")\n\t}\n\treturn token.owner\n}\n\n// XXX not fully implemented yet.\nfunc (grc *token) SafeTransferFrom(from, to std.Address, tid grc721.TokenID) {\n\tgrc.TransferFrom(from, to, tid)\n\t// When transfer is complete, this function checks if `_to` is a smart\n\t// contract (code size \u003e 0). If so, it calls `onERC721Received` on\n\t// `_to` and throws if the return value is not\n\t// `bytes4(keccak256(\"onERC721Received(address,address,uint256,bytes)\"))`.\n\t// XXX ensure \"to\" is a realm with onERC721Received() signature.\n}\n\nfunc (grc *token) TransferFrom(from, to std.Address, tid grc721.TokenID) {\n\tcaller := std.GetCallerAt(2)\n\ttoken, ok := grc.getToken(tid)\n\t// Throws if `_tokenId` is not a valid NFT.\n\tif !ok {\n\t\tpanic(\"token does not exist\")\n\t}\n\t// Throws unless `msg.sender` is the current owner, an authorized\n\t// operator, or the approved address for this NFT.\n\tif caller != token.owner \u0026\u0026 caller != token.approved {\n\t\toperator, ok := grc.operators.Get(token.owner.String())\n\t\tif !ok || caller != operator.(std.Address) {\n\t\t\tpanic(\"unauthorized\")\n\t\t}\n\t}\n\t// Throws if `_from` is not the current owner.\n\tif from != token.owner {\n\t\tpanic(\"from is not the current owner\")\n\t}\n\t// Throws if `_to` is the zero address.\n\tif to == \"\" {\n\t\tpanic(\"to cannot be empty\")\n\t}\n\t// Good.\n\ttoken.owner = to\n}\n\nfunc (grc *token) Approve(approved std.Address, tid grc721.TokenID) {\n\tcaller := std.GetCallerAt(2)\n\ttoken, ok := grc.getToken(tid)\n\t// Throws if `_tokenId` is not a valid NFT.\n\tif !ok {\n\t\tpanic(\"token does not exist\")\n\t}\n\t// Throws unless `msg.sender` is the current owner,\n\t// or an authorized operator.\n\tif caller != token.owner {\n\t\toperator, ok := grc.operators.Get(token.owner.String())\n\t\tif !ok || caller != operator.(std.Address) {\n\t\t\tpanic(\"unauthorized\")\n\t\t}\n\t}\n\t// Good.\n\ttoken.approved = approved\n}\n\n// XXX make it work for set of operators.\nfunc (grc *token) SetApprovalForAll(operator std.Address, approved bool) {\n\tcaller := std.GetCallerAt(2)\n\tgrc.operators.Set(caller.String(), operator)\n}\n\nfunc (grc *token) GetApproved(tid grc721.TokenID) std.Address {\n\ttoken, ok := grc.getToken(tid)\n\t// Throws if `_tokenId` is not a valid NFT.\n\tif !ok {\n\t\tpanic(\"token does not exist\")\n\t}\n\treturn token.approved\n}\n\n// XXX make it work for set of operators\nfunc (grc *token) IsApprovedForAll(owner, operator std.Address) bool {\n\toperator2, ok := grc.operators.Get(owner.String())\n\tif !ok {\n\t\treturn false\n\t}\n\treturn operator == operator2.(std.Address)\n}\n"},{"name":"z_0_filetest.gno","body":"// PKGPATH: gno.land/r/demo/nft_test\npackage nft_test\n\nimport (\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/nft\"\n)\n\nfunc main() {\n\taddr1 := testutils.TestAddress(\"addr1\")\n\t// addr2 := testutils.TestAddress(\"addr2\")\n\tgrc721 := nft.GetToken()\n\ttid := grc721.Mint(addr1, \"NFT#1\")\n\tprintln(grc721.OwnerOf(tid))\n\tprintln(addr1)\n}\n\n// Output:\n// g1v9jxgu33ta047h6lta047h6lta047h6l43dqc5\n// g1v9jxgu33ta047h6lta047h6lta047h6l43dqc5\n\n// Realm:\n// switchrealm[\"gno.land/r/demo/nft\"]\n// switchrealm[\"gno.land/r/demo/nft\"]\n// c[67c479d3d51d4056b2f4111d5352912a00be311e:11]={\n// \"Fields\": [\n// {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"std.Address\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.StringValue\",\n// \"value\": \"g1v9jxgu33ta047h6lta047h6lta047h6l43dqc5\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"std.Address\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/grc/grc721.TokenID\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.StringValue\",\n// \"value\": \"1\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"16\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.StringValue\",\n// \"value\": \"NFT#1\"\n// }\n// }\n// ],\n// \"ObjectInfo\": {\n// \"ID\": \"67c479d3d51d4056b2f4111d5352912a00be311e:11\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"67c479d3d51d4056b2f4111d5352912a00be311e:10\",\n// \"RefCount\": \"1\"\n// }\n// }\n// c[67c479d3d51d4056b2f4111d5352912a00be311e:10]={\n// \"ObjectInfo\": {\n// \"ID\": \"67c479d3d51d4056b2f4111d5352912a00be311e:10\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"67c479d3d51d4056b2f4111d5352912a00be311e:9\",\n// \"RefCount\": \"1\"\n// },\n// \"Value\": {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/r/demo/nft.NFToken\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"564a9e78be869bd258fc3c9ad56f5a75ed68818f\",\n// \"ObjectID\": \"67c479d3d51d4056b2f4111d5352912a00be311e:11\"\n// }\n// }\n// }\n// c[67c479d3d51d4056b2f4111d5352912a00be311e:9]={\n// \"Fields\": [\n// {\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"16\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.StringValue\",\n// \"value\": \"1\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/r/demo/nft.NFToken\"\n// }\n// },\n// \"V\": {\n// \"@type\": \"/gno.PointerValue\",\n// \"Base\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"b53ffc464e1b5655d19b9d5277f3491717c24aca\",\n// \"ObjectID\": \"67c479d3d51d4056b2f4111d5352912a00be311e:10\"\n// },\n// \"Index\": \"0\",\n// \"TV\": null\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"64\"\n// }\n// },\n// {\n// \"N\": \"AQAAAAAAAAA=\",\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"32\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// }\n// }\n// ],\n// \"ObjectInfo\": {\n// \"ID\": \"67c479d3d51d4056b2f4111d5352912a00be311e:9\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"67c479d3d51d4056b2f4111d5352912a00be311e:8\",\n// \"RefCount\": \"1\"\n// }\n// }\n// c[67c479d3d51d4056b2f4111d5352912a00be311e:8]={\n// \"ObjectInfo\": {\n// \"ID\": \"67c479d3d51d4056b2f4111d5352912a00be311e:8\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"67c479d3d51d4056b2f4111d5352912a00be311e:5\",\n// \"RefCount\": \"1\"\n// },\n// \"Value\": {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"b1d928b3716b147c92730e8d234162bec2f0f2fc\",\n// \"ObjectID\": \"67c479d3d51d4056b2f4111d5352912a00be311e:9\"\n// }\n// }\n// }\n// u[67c479d3d51d4056b2f4111d5352912a00be311e:5]={\n// \"Fields\": [\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// },\n// \"V\": {\n// \"@type\": \"/gno.PointerValue\",\n// \"Base\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"b229b824842ec3e7f2341e33d0fa0ca77af2f480\",\n// \"ObjectID\": \"67c479d3d51d4056b2f4111d5352912a00be311e:8\"\n// },\n// \"Index\": \"0\",\n// \"TV\": null\n// }\n// }\n// ],\n// \"ObjectInfo\": {\n// \"ID\": \"67c479d3d51d4056b2f4111d5352912a00be311e:5\",\n// \"ModTime\": \"7\",\n// \"OwnerID\": \"67c479d3d51d4056b2f4111d5352912a00be311e:4\",\n// \"RefCount\": \"1\"\n// }\n// }\n// u[67c479d3d51d4056b2f4111d5352912a00be311e:4]={\n// \"Fields\": [\n// {},\n// {\n// \"N\": \"AQAAAAAAAAA=\",\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"32\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Tree\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"1e0b9dddb406b4f50500a022266a4cb8a4ea38c6\",\n// \"ObjectID\": \"67c479d3d51d4056b2f4111d5352912a00be311e:5\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Tree\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"05ab6746ea84b55ca133806af215d99a1c4b045e\",\n// \"ObjectID\": \"67c479d3d51d4056b2f4111d5352912a00be311e:6\"\n// }\n// }\n// ],\n// \"ObjectInfo\": {\n// \"ID\": \"67c479d3d51d4056b2f4111d5352912a00be311e:4\",\n// \"ModTime\": \"7\",\n// \"OwnerID\": \"67c479d3d51d4056b2f4111d5352912a00be311e:3\",\n// \"RefCount\": \"1\"\n// }\n// }\n// switchrealm[\"gno.land/r/demo/nft\"]\n// switchrealm[\"gno.land/r/demo/nft_test\"]\n"},{"name":"z_1_filetest.gno","body":"// PKGPATH: gno.land/r/demo/nft_test\npackage nft_test\n\nimport (\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/nft\"\n)\n\nfunc main() {\n\taddr1 := testutils.TestAddress(\"addr1\")\n\taddr2 := testutils.TestAddress(\"addr2\")\n\tgrc721 := nft.GetToken()\n\ttid := grc721.Mint(addr1, \"NFT#1\")\n\tprintln(grc721.OwnerOf(tid))\n\tprintln(addr1)\n\tgrc721.TransferFrom(addr1, addr2, tid)\n}\n\n// Error:\n// unauthorized\n"},{"name":"z_2_filetest.gno","body":"// PKGPATH: gno.land/r/demo/nft_test\npackage nft_test\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/nft\"\n)\n\nfunc main() {\n\tcaller := std.GetCallerAt(1)\n\taddr1 := testutils.TestAddress(\"addr1\")\n\t// addr2 := testutils.TestAddress(\"addr2\")\n\tgrc721 := nft.GetToken()\n\ttid := grc721.Mint(caller, \"NFT#1\")\n\tprintln(grc721.OwnerOf(tid))\n\tprintln(addr1)\n\tgrc721.TransferFrom(caller, addr1, tid)\n}\n\n// Output:\n// g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm\n// g1v9jxgu33ta047h6lta047h6lta047h6l43dqc5\n"},{"name":"z_3_filetest.gno","body":"// PKGPATH: gno.land/r/demo/nft_test\npackage nft_test\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/nft\"\n)\n\nfunc main() {\n\tcaller := std.GetCallerAt(1)\n\taddr1 := testutils.TestAddress(\"addr1\")\n\taddr2 := testutils.TestAddress(\"addr2\")\n\tgrc721 := nft.GetToken()\n\ttid := grc721.Mint(caller, \"NFT#1\")\n\tprintln(grc721.OwnerOf(tid))\n\tprintln(addr1)\n\tgrc721.Approve(caller, tid) // approve self.\n\tgrc721.TransferFrom(caller, addr1, tid)\n\tgrc721.TransferFrom(addr1, addr2, tid)\n}\n\n// Output:\n// g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm\n// g1v9jxgu33ta047h6lta047h6lta047h6l43dqc5\n"},{"name":"z_4_filetest.gno","body":"// PKGPATH: gno.land/r/demo/nft_test\npackage nft_test\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/nft\"\n)\n\nfunc main() {\n\tcaller := std.GetCallerAt(1)\n\taddr1 := testutils.TestAddress(\"addr1\")\n\taddr2 := testutils.TestAddress(\"addr2\")\n\tgrc721 := nft.GetToken()\n\ttid := grc721.Mint(caller, \"NFT#1\")\n\tprintln(grc721.OwnerOf(tid))\n\tprintln(addr1)\n\tgrc721.Approve(caller, tid) // approve self.\n\tgrc721.TransferFrom(caller, addr1, tid)\n\tgrc721.Approve(\"\", tid) // approve addr1.\n\tgrc721.TransferFrom(addr1, addr2, tid)\n}\n\n// Error:\n// unauthorized\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"profile","path":"gno.land/r/demo/profile","files":[{"name":"profile.gno","body":"package profile\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/mux\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar (\n\tfields = avl.NewTree()\n\trouter = mux.NewRouter()\n)\n\n// Standard fields\nconst (\n\tDisplayName = \"DisplayName\"\n\tHomepage = \"Homepage\"\n\tBio = \"Bio\"\n\tAge = \"Age\"\n\tLocation = \"Location\"\n\tAvatar = \"Avatar\"\n\tGravatarEmail = \"GravatarEmail\"\n\tAvailableForHiring = \"AvailableForHiring\"\n\tInvalidField = \"InvalidField\"\n)\n\n// Events\nconst (\n\tProfileFieldCreated = \"ProfileFieldCreated\"\n\tProfileFieldUpdated = \"ProfileFieldUpdated\"\n)\n\n// Field types used when emitting event\nconst FieldType = \"FieldType\"\n\nconst (\n\tBoolField = \"BoolField\"\n\tStringField = \"StringField\"\n\tIntField = \"IntField\"\n)\n\nfunc init() {\n\trouter.HandleFunc(\"\", homeHandler)\n\trouter.HandleFunc(\"u/{addr}\", profileHandler)\n\trouter.HandleFunc(\"f/{addr}/{field}\", fieldHandler)\n}\n\n// List of supported string fields\nvar stringFields = map[string]bool{\n\tDisplayName: true,\n\tHomepage: true,\n\tBio: true,\n\tLocation: true,\n\tAvatar: true,\n\tGravatarEmail: true,\n}\n\n// List of support int fields\nvar intFields = map[string]bool{\n\tAge: true,\n}\n\n// List of support bool fields\nvar boolFields = map[string]bool{\n\tAvailableForHiring: true,\n}\n\n// Setters\n\nfunc SetStringField(field, value string) bool {\n\taddr := std.PrevRealm().Addr()\n\tkey := addr.String() + \":\" + field\n\tupdated := fields.Set(key, value)\n\n\tevent := ProfileFieldCreated\n\tif updated {\n\t\tevent = ProfileFieldUpdated\n\t}\n\n\tstd.Emit(event, FieldType, StringField, field, value)\n\n\treturn updated\n}\n\nfunc SetIntField(field string, value int) bool {\n\taddr := std.PrevRealm().Addr()\n\tkey := addr.String() + \":\" + field\n\tupdated := fields.Set(key, value)\n\n\tevent := ProfileFieldCreated\n\tif updated {\n\t\tevent = ProfileFieldUpdated\n\t}\n\n\tstd.Emit(event, FieldType, IntField, field, string(value))\n\n\treturn updated\n}\n\nfunc SetBoolField(field string, value bool) bool {\n\taddr := std.PrevRealm().Addr()\n\tkey := addr.String() + \":\" + field\n\tupdated := fields.Set(key, value)\n\n\tevent := ProfileFieldCreated\n\tif updated {\n\t\tevent = ProfileFieldUpdated\n\t}\n\n\tstd.Emit(event, FieldType, BoolField, field, ufmt.Sprintf(\"%t\", value))\n\n\treturn updated\n}\n\n// Getters\n\nfunc GetStringField(addr std.Address, field, def string) string {\n\tkey := addr.String() + \":\" + field\n\tif value, ok := fields.Get(key); ok {\n\t\treturn value.(string)\n\t}\n\n\treturn def\n}\n\nfunc GetBoolField(addr std.Address, field string, def bool) bool {\n\tkey := addr.String() + \":\" + field\n\tif value, ok := fields.Get(key); ok {\n\t\treturn value.(bool)\n\t}\n\n\treturn def\n}\n\nfunc GetIntField(addr std.Address, field string, def int) int {\n\tkey := addr.String() + \":\" + field\n\tif value, ok := fields.Get(key); ok {\n\t\treturn value.(int)\n\t}\n\n\treturn def\n}\n"},{"name":"profile_test.gno","body":"package profile\n\nimport (\n\t\"std\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/p/demo/uassert\"\n)\n\n// Global addresses for test users\nvar (\n\talice = testutils.TestAddress(\"alice\")\n\tbob = testutils.TestAddress(\"bob\")\n\tcharlie = testutils.TestAddress(\"charlie\")\n\tdave = testutils.TestAddress(\"dave\")\n\teve = testutils.TestAddress(\"eve\")\n\tfrank = testutils.TestAddress(\"frank\")\n\tuser1 = testutils.TestAddress(\"user1\")\n\tuser2 = testutils.TestAddress(\"user2\")\n)\n\nfunc TestStringFields(t *testing.T) {\n\tstd.TestSetRealm(std.NewUserRealm(alice))\n\n\t// Get before setting\n\tname := GetStringField(alice, DisplayName, \"anon\")\n\tuassert.Equal(t, \"anon\", name)\n\n\t// Set new key\n\tupdated := SetStringField(DisplayName, \"Alice foo\")\n\tuassert.Equal(t, updated, false)\n\tupdated = SetStringField(Homepage, \"https://example.com\")\n\tuassert.Equal(t, updated, false)\n\n\t// Update the key\n\tupdated = SetStringField(DisplayName, \"Alice foo\")\n\tuassert.Equal(t, updated, true)\n\n\t// Get after setting\n\tname = GetStringField(alice, DisplayName, \"anon\")\n\thomepage := GetStringField(alice, Homepage, \"\")\n\tbio := GetStringField(alice, Bio, \"42\")\n\n\tuassert.Equal(t, \"Alice foo\", name)\n\tuassert.Equal(t, \"https://example.com\", homepage)\n\tuassert.Equal(t, \"42\", bio)\n}\n\nfunc TestIntFields(t *testing.T) {\n\tstd.TestSetRealm(std.NewUserRealm(bob))\n\n\t// Get before setting\n\tage := GetIntField(bob, Age, 25)\n\tuassert.Equal(t, 25, age)\n\n\t// Set new key\n\tupdated := SetIntField(Age, 30)\n\tuassert.Equal(t, updated, false)\n\n\t// Update the key\n\tupdated = SetIntField(Age, 30)\n\tuassert.Equal(t, updated, true)\n\n\t// Get after setting\n\tage = GetIntField(bob, Age, 25)\n\tuassert.Equal(t, 30, age)\n}\n\nfunc TestBoolFields(t *testing.T) {\n\tstd.TestSetRealm(std.NewUserRealm(charlie))\n\n\t// Get before setting\n\thiring := GetBoolField(charlie, AvailableForHiring, false)\n\tuassert.Equal(t, false, hiring)\n\n\t// Set\n\tupdated := SetBoolField(AvailableForHiring, true)\n\tuassert.Equal(t, updated, false)\n\n\t// Update the key\n\tupdated = SetBoolField(AvailableForHiring, true)\n\tuassert.Equal(t, updated, true)\n\n\t// Get after setting\n\thiring = GetBoolField(charlie, AvailableForHiring, false)\n\tuassert.Equal(t, true, hiring)\n}\n\nfunc TestMultipleProfiles(t *testing.T) {\n\t// Set profile for user1\n\tstd.TestSetRealm(std.NewUserRealm(user1))\n\tupdated := SetStringField(DisplayName, \"User One\")\n\tuassert.Equal(t, updated, false)\n\n\t// Set profile for user2\n\tstd.TestSetRealm(std.NewUserRealm(user2))\n\tupdated = SetStringField(DisplayName, \"User Two\")\n\tuassert.Equal(t, updated, false)\n\n\t// Get profiles\n\tstd.TestSetRealm(std.NewUserRealm(user1)) // Switch back to user1\n\tname1 := GetStringField(user1, DisplayName, \"anon\")\n\tstd.TestSetRealm(std.NewUserRealm(user2)) // Switch back to user2\n\tname2 := GetStringField(user2, DisplayName, \"anon\")\n\n\tuassert.Equal(t, \"User One\", name1)\n\tuassert.Equal(t, \"User Two\", name2)\n}\n\nfunc TestArbitraryStringField(t *testing.T) {\n\tstd.TestSetRealm(std.NewUserRealm(user1))\n\n\t// Set arbitrary string field\n\tupdated := SetStringField(\"MyEmail\", \"my@email.com\")\n\tuassert.Equal(t, updated, false)\n\n\tval := GetStringField(user1, \"MyEmail\", \"\")\n\tuassert.Equal(t, val, \"my@email.com\")\n}\n\nfunc TestArbitraryIntField(t *testing.T) {\n\tstd.TestSetRealm(std.NewUserRealm(user1))\n\n\t// Set arbitrary int field\n\tupdated := SetIntField(\"MyIncome\", 100_000)\n\tuassert.Equal(t, updated, false)\n\n\tval := GetIntField(user1, \"MyIncome\", 0)\n\tuassert.Equal(t, val, 100_000)\n}\n\nfunc TestArbitraryBoolField(t *testing.T) {\n\tstd.TestSetRealm(std.NewUserRealm(user1))\n\n\t// Set arbitrary int field\n\tupdated := SetBoolField(\"IsWinner\", true)\n\tuassert.Equal(t, updated, false)\n\n\tval := GetBoolField(user1, \"IsWinner\", false)\n\tuassert.Equal(t, val, true)\n}\n"},{"name":"render.gno","body":"package profile\n\nimport (\n\t\"bytes\"\n\t\"net/url\"\n\t\"std\"\n\n\t\"gno.land/p/demo/mux\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nconst (\n\tBaseURL = \"/r/demo/profile\"\n\tSetStringFieldURL = BaseURL + \"?help\u0026__func=SetStringField\u0026field=%s\"\n\tSetIntFieldURL = BaseURL + \"?help\u0026__func=SetIntField\u0026field=%s\"\n\tSetBoolFieldURL = BaseURL + \"?help\u0026__func=SetBoolField\u0026field=%s\"\n\tViewAllFieldsURL = BaseURL + \":u/%s\"\n\tViewFieldURL = BaseURL + \":f/%s/%s\"\n)\n\nfunc homeHandler(res *mux.ResponseWriter, req *mux.Request) {\n\tvar b bytes.Buffer\n\n\tb.WriteString(\"## Setters\\n\")\n\tfor field := range stringFields {\n\t\tlink := ufmt.Sprintf(SetStringFieldURL, field)\n\t\tb.WriteString(ufmt.Sprintf(\"- [Set %s](%s)\\n\", field, link))\n\t}\n\n\tfor field := range intFields {\n\t\tlink := ufmt.Sprintf(SetIntFieldURL, field)\n\t\tb.WriteString(ufmt.Sprintf(\"- [Set %s](%s)\\n\", field, link))\n\t}\n\n\tfor field := range boolFields {\n\t\tlink := ufmt.Sprintf(SetBoolFieldURL, field)\n\t\tb.WriteString(ufmt.Sprintf(\"- [Set %s Field](%s)\\n\", field, link))\n\t}\n\n\tb.WriteString(\"\\n---\\n\\n\")\n\n\tres.Write(b.String())\n}\n\nfunc profileHandler(res *mux.ResponseWriter, req *mux.Request) {\n\tvar b bytes.Buffer\n\taddr := req.GetVar(\"addr\")\n\n\tb.WriteString(ufmt.Sprintf(\"# Profile %s\\n\", addr))\n\n\taddress := std.Address(addr)\n\n\tfor field := range stringFields {\n\t\tvalue := GetStringField(address, field, \"n/a\")\n\t\tlink := ufmt.Sprintf(SetStringFieldURL, field)\n\t\tb.WriteString(ufmt.Sprintf(\"- %s: %s [Edit](%s)\\n\", field, value, link))\n\t}\n\n\tfor field := range intFields {\n\t\tvalue := GetIntField(address, field, 0)\n\t\tlink := ufmt.Sprintf(SetIntFieldURL, field)\n\t\tb.WriteString(ufmt.Sprintf(\"- %s: %d [Edit](%s)\\n\", field, value, link))\n\t}\n\n\tfor field := range boolFields {\n\t\tvalue := GetBoolField(address, field, false)\n\t\tlink := ufmt.Sprintf(SetBoolFieldURL, field)\n\t\tb.WriteString(ufmt.Sprintf(\"- %s: %t [Edit](%s)\\n\", field, value, link))\n\t}\n\n\tres.Write(b.String())\n}\n\nfunc fieldHandler(res *mux.ResponseWriter, req *mux.Request) {\n\tvar b bytes.Buffer\n\taddr := req.GetVar(\"addr\")\n\tfield := req.GetVar(\"field\")\n\n\tb.WriteString(ufmt.Sprintf(\"# Field %s for %s\\n\", field, addr))\n\n\taddress := std.Address(addr)\n\tvalue := \"n/a\"\n\tvar editLink string\n\n\tif _, ok := stringFields[field]; ok {\n\t\tvalue = ufmt.Sprintf(\"%s\", GetStringField(address, field, \"n/a\"))\n\t\teditLink = ufmt.Sprintf(SetStringFieldURL+\"\u0026addr=%s\u0026value=%s\", field, addr, url.QueryEscape(value))\n\t} else if _, ok := intFields[field]; ok {\n\t\tvalue = ufmt.Sprintf(\"%d\", GetIntField(address, field, 0))\n\t\teditLink = ufmt.Sprintf(SetIntFieldURL+\"\u0026addr=%s\u0026value=%s\", field, addr, value)\n\t} else if _, ok := boolFields[field]; ok {\n\t\tvalue = ufmt.Sprintf(\"%t\", GetBoolField(address, field, false))\n\t\teditLink = ufmt.Sprintf(SetBoolFieldURL+\"\u0026addr=%s\u0026value=%s\", field, addr, value)\n\t}\n\n\tb.WriteString(ufmt.Sprintf(\"- %s: %s [Edit](%s)\\n\", field, value, editLink))\n\n\tres.Write(b.String())\n}\n\nfunc Render(path string) string {\n\treturn router.Render(path)\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"releases_example","path":"gno.land/r/demo/releases_example","files":[{"name":"dummy.gno","body":"package releases_example\n\nfunc init() {\n\t// dummy example data\n\tchangelog.NewRelease(\n\t\t\"v1\",\n\t\t\"r/demo/examples_example_v1\",\n\t\t\"initial release\",\n\t)\n\tchangelog.NewRelease(\n\t\t\"v2\",\n\t\t\"r/demo/examples_example_v2\",\n\t\t\"various improvements\",\n\t)\n}\n"},{"name":"example.gno","body":"// this package demonstrates a way to manage contract releases.\npackage releases_example\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/releases\"\n)\n\nvar (\n\tchangelog = releases.NewChangelog(\"example_app\")\n\tadmin = std.Address(\"g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj\") // @administrator\n)\n\nfunc init() {\n\t// FIXME: admin = std.GetCreator()\n}\n\nfunc NewRelease(name, url, notes string) {\n\tcaller := std.GetOrigCaller()\n\tif caller != admin {\n\t\tpanic(\"restricted area\")\n\t}\n\tchangelog.NewRelease(name, url, notes)\n}\n\nfunc UpdateAdmin(address std.Address) {\n\tcaller := std.GetOrigCaller()\n\tif caller != admin {\n\t\tpanic(\"restricted area\")\n\t}\n\tadmin = address\n}\n\nfunc Render(path string) string {\n\treturn changelog.Render(path)\n}\n"},{"name":"releases0_filetest.gno","body":"package main\n\nimport (\n\t\"gno.land/p/demo/releases\"\n)\n\nfunc main() {\n\tprintln(\"-----------\")\n\tchangelog := releases.NewChangelog(\"example\")\n\tprint(changelog.Render(\"\"))\n\n\tprintln(\"-----------\")\n\tchangelog.NewRelease(\"v1\", \"r/blahblah\", \"* initial version\")\n\tprint(changelog.Render(\"\"))\n\n\tprintln(\"-----------\")\n\tchangelog.NewRelease(\"v2\", \"r/blahblah2\", \"* various improvements\\n* new shiny logo\")\n\tprint(changelog.Render(\"\"))\n\n\tprintln(\"-----------\")\n\tprint(changelog.Latest().Render())\n}\n\n// Output:\n// -----------\n// # example\n//\n// -----------\n// # example\n//\n// ## [example v1 (latest)](r/blahblah)\n//\n// * initial version\n//\n// -----------\n// # example\n//\n// ## [example v2 (latest)](r/blahblah2)\n//\n// * various improvements\n// * new shiny logo\n//\n// ## [example v1](r/blahblah)\n//\n// * initial version\n//\n// -----------\n// ## [example v2 (latest)](r/blahblah2)\n//\n// * various improvements\n// * new shiny logo\n"},{"name":"releases1_filetest.gno","body":"package main\n\nimport (\n\t\"gno.land/r/demo/releases_example\"\n)\n\nfunc main() {\n\tprintln(\"-----------\")\n\tprint(releases_example.Render(\"\"))\n\n\tprintln(\"-----------\")\n\tprint(releases_example.Render(\"v1\"))\n\n\tprintln(\"-----------\")\n\tprint(releases_example.Render(\"v42\"))\n}\n\n// Output:\n// -----------\n// # example_app\n//\n// ## [example_app v2 (latest)](r/demo/examples_example_v2)\n//\n// various improvements\n//\n// ## [example_app v1](r/demo/examples_example_v1)\n//\n// initial release\n//\n// -----------\n// ## [example_app v1](r/demo/examples_example_v1)\n//\n// initial release\n//\n// -----------\n// no such release\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"tamagotchi","path":"gno.land/r/demo/tamagotchi","files":[{"name":"realm.gno","body":"package tamagotchi\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/tamagotchi\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar t *tamagotchi.Tamagotchi\n\nfunc init() {\n\tReset(\"gnome#0\")\n}\n\nfunc Reset(optionalName string) string {\n\tname := optionalName\n\tif name == \"\" {\n\t\theight := std.GetHeight()\n\t\tname = ufmt.Sprintf(\"gnome#%d\", height)\n\t}\n\n\tt = tamagotchi.New(name)\n\n\treturn ufmt.Sprintf(\"A new tamagotchi is born. Their name is %s %s.\", t.Name(), t.Face())\n}\n\nfunc Feed() string {\n\tt.Feed()\n\treturn t.Markdown()\n}\n\nfunc Play() string {\n\tt.Play()\n\treturn t.Markdown()\n}\n\nfunc Heal() string {\n\tt.Heal()\n\treturn t.Markdown()\n}\n\nfunc Render(path string) string {\n\ttama := t.Markdown()\n\tlinks := `Actions:\n* [Feed](/r/demo/tamagotchi?help\u0026__func=Feed)\n* [Play](/r/demo/tamagotchi?help\u0026__func=Play)\n* [Heal](/r/demo/tamagotchi?help\u0026__func=Heal)\n* [Reset](/r/demo/tamagotchi?help\u0026__func=Reset)\n`\n\n\treturn tama + \"\\n\\n\" + links\n}\n"},{"name":"z0_filetest.gno","body":"package main\n\nimport (\n\t\"gno.land/r/demo/tamagotchi\"\n)\n\nfunc main() {\n\ttamagotchi.Reset(\"tamagnotchi\")\n\tprintln(tamagotchi.Render(\"\"))\n}\n\n// Output:\n// # tamagnotchi 😃\n//\n// * age: 0\n// * hunger: 50\n// * happiness: 50\n// * health: 50\n// * sleepy: 0\n//\n// Actions:\n// * [Feed](/r/demo/tamagotchi?help\u0026__func=Feed)\n// * [Play](/r/demo/tamagotchi?help\u0026__func=Play)\n// * [Heal](/r/demo/tamagotchi?help\u0026__func=Heal)\n// * [Reset](/r/demo/tamagotchi?help\u0026__func=Reset)\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"crossrealm","path":"gno.land/r/demo/tests/crossrealm","files":[{"name":"crossrealm.gno","body":"package crossrealm\n\nimport (\n\t\"gno.land/p/demo/tests/p_crossrealm\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\ntype LocalStruct struct {\n\tA int\n}\n\nfunc (ls *LocalStruct) String() string {\n\treturn ufmt.Sprintf(\"LocalStruct{%d}\", ls.A)\n}\n\n// local is saved locally in this realm\nvar local *LocalStruct\n\nfunc init() {\n\tlocal = \u0026LocalStruct{A: 123}\n}\n\n// Make1 returns a local object wrapped by a p struct\nfunc Make1() *p_crossrealm.Container {\n\treturn \u0026p_crossrealm.Container{\n\t\tA: 1,\n\t\tB: local,\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"tests_foo","path":"gno.land/r/demo/tests_foo","files":[{"name":"foo.gno","body":"package tests_foo\n\nimport (\n\t\"gno.land/r/demo/tests\"\n)\n\n// for testing gno.land/r/demo/tests/interfaces.go\n\ntype FooStringer struct {\n\tFieldA string\n}\n\nfunc (fs *FooStringer) String() string {\n\treturn \"\u0026FooStringer{\" + fs.FieldA + \"}\"\n}\n\nfunc AddFooStringer(fa string) {\n\ttests.AddStringer(\u0026FooStringer{fa})\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"todolistrealm","path":"gno.land/r/demo/todolist","files":[{"name":"todolist.gno","body":"package todolistrealm\n\nimport (\n\t\"bytes\"\n\t\"strconv\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/seqid\"\n\t\"gno.land/p/demo/todolist\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\n// State variables\nvar (\n\ttodolistTree *avl.Tree\n\ttlid seqid.ID\n)\n\n// Constructor\nfunc init() {\n\ttodolistTree = avl.NewTree()\n}\n\nfunc NewTodoList(title string) (int, string) {\n\t// Create new Todolist\n\ttl := todolist.NewTodoList(title)\n\t// Update AVL tree with new state\n\ttlid.Next()\n\ttodolistTree.Set(strconv.Itoa(int(tlid)), tl)\n\treturn int(tlid), \"created successfully\"\n}\n\nfunc AddTask(todolistID int, title string) string {\n\t// Get Todolist from AVL tree\n\ttl, ok := todolistTree.Get(strconv.Itoa(todolistID))\n\tif !ok {\n\t\tpanic(\"Todolist not found\")\n\t}\n\n\t// get the number of tasks in the todolist\n\tid := tl.(*todolist.TodoList).Tasks.Size()\n\n\t// create the task\n\ttask := todolist.NewTask(title)\n\n\t// Cast raw data from tree into Todolist struct\n\ttl.(*todolist.TodoList).AddTask(id, task)\n\n\treturn \"task added successfully\"\n}\n\nfunc ToggleTaskStatus(todolistID int, taskID int) string {\n\t// Get Todolist from AVL tree\n\ttl, ok := todolistTree.Get(strconv.Itoa(todolistID))\n\tif !ok {\n\t\tpanic(\"Todolist not found\")\n\t}\n\n\t// Get the task from the todolist\n\ttask, found := tl.(*todolist.TodoList).Tasks.Get(strconv.Itoa(taskID))\n\tif !found {\n\t\tpanic(\"Task not found\")\n\t}\n\n\t// Change the status of the task\n\ttodolist.ToggleTaskStatus(task.(*todolist.Task))\n\n\treturn \"task status changed successfully\"\n}\n\nfunc RemoveTask(todolistID int, taskID int) string {\n\t// Get Todolist from AVL tree\n\ttl, ok := todolistTree.Get(strconv.Itoa(todolistID))\n\tif !ok {\n\t\tpanic(\"Todolist not found\")\n\t}\n\n\t// Get the task from the todolist\n\t_, ok = tl.(*todolist.TodoList).Tasks.Get(strconv.Itoa(taskID))\n\tif !ok {\n\t\tpanic(\"Task not found\")\n\t}\n\n\t// Change the status of the task\n\ttl.(*todolist.TodoList).RemoveTask(strconv.Itoa(taskID))\n\n\treturn \"task status changed successfully\"\n}\n\nfunc RemoveTodoList(todolistID int) string {\n\t// Get Todolist from AVL tree\n\t_, ok := todolistTree.Get(strconv.Itoa(todolistID))\n\tif !ok {\n\t\tpanic(\"Todolist not found\")\n\t}\n\n\t// Remove the todolist\n\ttodolistTree.Remove(strconv.Itoa(todolistID))\n\n\treturn \"Todolist removed successfully\"\n}\n\nfunc Render(path string) string {\n\tif path == \"\" {\n\t\treturn renderHomepage()\n\t}\n\n\treturn \"unknown page\"\n}\n\nfunc renderHomepage() string {\n\t// Define empty buffer\n\tvar b bytes.Buffer\n\n\tb.WriteString(\"# Welcome to ToDolist\\n\\n\")\n\n\t// If no todolists have been created\n\tif todolistTree.Size() == 0 {\n\t\tb.WriteString(\"### No todolists available currently!\")\n\t\treturn b.String()\n\t}\n\n\t// Iterate through AVL tree\n\ttodolistTree.Iterate(\"\", \"\", func(key string, value interface{}) bool {\n\t\t// cast raw data from tree into Todolist struct\n\t\ttl := value.(*todolist.TodoList)\n\n\t\t// Add Todolist name\n\t\tb.WriteString(\n\t\t\tufmt.Sprintf(\n\t\t\t\t\"## Todolist #%s: %s\\n\",\n\t\t\t\tkey, // Todolist ID\n\t\t\t\ttl.GetTodolistTitle(),\n\t\t\t),\n\t\t)\n\n\t\t// Add Todolist owner\n\t\tb.WriteString(\n\t\t\tufmt.Sprintf(\n\t\t\t\t\"#### Todolist owner : %s\\n\",\n\t\t\t\ttl.GetTodolistOwner(),\n\t\t\t),\n\t\t)\n\n\t\t// List all todos that are currently Todolisted\n\t\tif todos := tl.GetTasks(); len(todos) \u003e 0 {\n\t\t\tb.WriteString(\n\t\t\t\tufmt.Sprintf(\"Currently Todo tasks: %d\\n\\n\", len(todos)),\n\t\t\t)\n\n\t\t\tfor index, todo := range todos {\n\t\t\t\tb.WriteString(\n\t\t\t\t\tufmt.Sprintf(\"#%d - %s \", index, todo.Title),\n\t\t\t\t)\n\t\t\t\t// displays a checked box if task is marked as done, an empty box if not\n\t\t\t\tif todo.Done {\n\t\t\t\t\tb.WriteString(\n\t\t\t\t\t\t\"☑\\n\\n\",\n\t\t\t\t\t)\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\n\t\t\t\tb.WriteString(\n\t\t\t\t\t\"☐\\n\\n\",\n\t\t\t\t)\n\t\t\t}\n\t\t} else {\n\t\t\tb.WriteString(\"No tasks in this list currently\\n\")\n\t\t}\n\n\t\tb.WriteString(\"\\n\")\n\t\treturn false\n\t})\n\n\treturn b.String()\n}\n"},{"name":"todolist_test.gno","body":"package todolistrealm\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/todolist\"\n\t\"gno.land/p/demo/uassert\"\n)\n\nvar (\n\tnode interface{}\n\ttdl *todolist.TodoList\n)\n\nfunc TestNewTodoList(t *testing.T) {\n\ttitle := \"My Todo List\"\n\ttlid, _ := NewTodoList(title)\n\tuassert.Equal(t, 1, tlid, \"tlid does not match\")\n\n\t// get the todolist node from the tree\n\tnode, _ = todolistTree.Get(strconv.Itoa(tlid))\n\t// convert the node to a TodoList struct\n\ttdl = node.(*todolist.TodoList)\n\n\tuassert.Equal(t, title, tdl.Title, \"title does not match\")\n\tuassert.Equal(t, 1, tlid, \"tlid does not match\")\n\tuassert.Equal(t, tdl.Owner.String(), std.GetOrigCaller().String(), \"owner does not match\")\n\tuassert.Equal(t, 0, len(tdl.GetTasks()), \"Expected no tasks in the todo list\")\n}\n\nfunc TestAddTask(t *testing.T) {\n\tAddTask(1, \"Task 1\")\n\n\ttasks := tdl.GetTasks()\n\tuassert.Equal(t, 1, len(tasks), \"total task does not match\")\n\tuassert.Equal(t, \"Task 1\", tasks[0].Title, \"task title does not match\")\n\tuassert.False(t, tasks[0].Done, \"Expected task to be not done\")\n}\n\nfunc TestToggleTaskStatus(t *testing.T) {\n\tToggleTaskStatus(1, 0)\n\ttask := tdl.GetTasks()[0]\n\tuassert.True(t, task.Done, \"Expected task to be done, but it is not marked as done\")\n\n\tToggleTaskStatus(1, 0)\n\tuassert.False(t, task.Done, \"Expected task to be not done, but it is marked as done\")\n}\n\nfunc TestRemoveTask(t *testing.T) {\n\tRemoveTask(1, 0)\n\ttasks := tdl.GetTasks()\n\tuassert.Equal(t, 0, len(tasks), \"Expected no tasks in the todo list\")\n}\n\nfunc TestRemoveTodoList(t *testing.T) {\n\tRemoveTodoList(1)\n\tuassert.Equal(t, 0, todolistTree.Size(), \"Expected no tasks in the todo list\")\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"types","path":"gno.land/r/demo/types","files":[{"name":"types.gno","body":"// package to test types behavior in various conditions (TXs, imports).\npackage types\n\nimport (\n\t\"errors\"\n\t\"time\"\n\n\t\"gno.land/p/demo/avl\"\n)\n\nvar (\n\tgInt int = -42\n\tgUint uint = 42\n\tgString string = \"a string\"\n\tgStringSlice []string = []string{\"a\", \"string\", \"slice\"}\n\tgError error = errors.New(\"an error\")\n\tgIntSlice []int = []int{-42, 0, 42}\n\tgUintSlice []uint = []uint{0, 42, 84}\n\tgTree avl.Tree\n\t// gInterface = interface{}{-42, \"a string\", uint(42)}\n)\n\nfunc init() {\n\tgTree.Set(\"a\", \"content of A\")\n\tgTree.Set(\"b\", \"content of B\")\n}\n\nfunc Noop() {}\nfunc RetTimeNow() time.Time { return time.Now() }\nfunc RetString() string { return gString }\nfunc RetStringPointer() *string { return \u0026gString }\nfunc RetUint() uint { return gUint }\nfunc RetInt() int { return gInt }\nfunc RetUintPointer() *uint { return \u0026gUint }\nfunc RetIntPointer() *int { return \u0026gInt }\nfunc RetTree() avl.Tree { return gTree }\nfunc RetIntSlice() []int { return gIntSlice }\nfunc RetUintSlice() []uint { return gUintSlice }\nfunc RetStringSlice() []string { return gStringSlice }\nfunc RetError() error { return gError }\nfunc Panic() { panic(\"PANIC!\") }\n\n// TODO: floats\n// TODO: typed errors\n// TODO: ret interface\n// TODO: recover\n// TODO: take types as input\n\nfunc Render(path string) string {\n\treturn \"package to test data types.\"\n}\n"},{"name":"types_test.gno","body":"package types\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"ui","path":"gno.land/r/demo/ui","files":[{"name":"ui.gno","body":"package ui\n\nimport \"gno.land/p/demo/ui\"\n\nfunc Render(path string) string {\n\t// TODO: build this realm as a demo one with one page per feature.\n\n\t// TODO: pagination\n\t// TODO: non-standard markdown\n\t// TODO: error, warn\n\t// TODO: header\n\t// TODO: HTML\n\t// TODO: toc\n\t// TODO: forms\n\t// TODO: comments\n\n\tdom := ui.DOM{\n\t\tPrefix: \"r/demo/ui:\",\n\t}\n\n\tdom.Title = \"UI Demo\"\n\n\tdom.Header.Append(ui.Breadcrumb{\n\t\tui.Link{Text: \"foo\", Path: \"foo\"},\n\t\tui.Link{Text: \"bar\", Path: \"foo/bar\"},\n\t})\n\n\tdom.Body.Append(\n\t\tui.Paragraph(\"Simple UI demonstration.\"),\n\t\tui.BulletList{\n\t\t\tui.Text(\"a text\"),\n\t\t\tui.Link{Text: \"a relative link\", Path: \"foobar\"},\n\t\t\tui.Text(\"another text\"),\n\t\t\t// ui.H1(\"a H1 text\"),\n\t\t\tui.Bold(\"a bold text\"),\n\t\t\tui.Italic(\"italic text\"),\n\t\t\tui.Text(\"raw markdown with **bold** text in the middle.\"),\n\t\t\tui.Code(\"some inline code\"),\n\t\t\tui.Link{Text: \"a remote link\", URL: \"https://gno.land\"},\n\t\t},\n\t)\n\n\tdom.Footer.Append(ui.Text(\"I'm the footer.\"))\n\tdom.Body.Append(ui.Text(\"another string.\"))\n\tdom.Body.Append(ui.Paragraph(\"a paragraph.\"), ui.HR{})\n\n\treturn dom.String()\n}\n"},{"name":"ui_test.gno","body":"package ui\n\nimport (\n\t\"testing\"\n\n\t\"gno.land/p/demo/uassert\"\n)\n\nfunc TestRender(t *testing.T) {\n\tgot := Render(\"\")\n\texpected := \"# UI Demo\\n\\n[foo](r/demo/ui:foo) / [bar](r/demo/ui:foo/bar)\\n\\n\\nSimple UI demonstration.\\n\\n- a text\\n- [a relative link](r/demo/ui:foobar)\\n- another text\\n- **a bold text**\\n- _italic text_\\n- raw markdown with **bold** text in the middle.\\n- `some inline code`\\n- [a remote link](https://gno.land)\\n\\nanother string.\\n\\na paragraph.\\n\\n\\n---\\n\\n\\nI'm the footer.\\n\\n\"\n\tuassert.Equal(t, expected, got)\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"userbook","path":"gno.land/r/demo/userbook","files":[{"name":"userbook.gno","body":"// This realm demonstrates a small userbook system working with gnoweb\npackage userbook\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/mux\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\ntype Signup struct {\n\taccount string\n\theight int64\n}\n\n// signups - keep a slice of signed up addresses efficient pagination\nvar signups []Signup\n\n// tracker - keep track of who signed up\nvar (\n\ttracker *avl.Tree\n\trouter *mux.Router\n)\n\nconst (\n\tdefaultPageSize = 20\n\tpathArgument = \"number\"\n\tsubPath = \"page/{\" + pathArgument + \"}\"\n\tsignUpEvent = \"SignUp\"\n)\n\nfunc init() {\n\t// Set up tracker tree\n\ttracker = avl.NewTree()\n\n\t// Set up route handling\n\trouter = mux.NewRouter()\n\trouter.HandleFunc(\"\", renderHelper)\n\trouter.HandleFunc(subPath, renderHelper)\n\n\t// Sign up the deployer\n\tSignUp()\n}\n\nfunc SignUp() string {\n\t// Get transaction caller\n\tcaller := std.PrevRealm().Addr().String()\n\theight := std.GetHeight()\n\n\t// Check if the user is already signed up\n\tif _, exists := tracker.Get(caller); exists {\n\t\tpanic(caller + \" is already signed up!\")\n\t}\n\n\t// Sign up the user\n\ttracker.Set(caller, struct{}{})\n\tsignup := Signup{\n\t\tcaller,\n\t\theight,\n\t}\n\n\tsignups = append(signups, signup)\n\tstd.Emit(signUpEvent, \"SignedUpAccount\", signup.account)\n\n\treturn ufmt.Sprintf(\"%s added to userbook up at block #%d!\", signup.account, signup.height)\n}\n\nfunc GetSignupsInRange(page, pageSize int) ([]Signup, int) {\n\tif page \u003c 1 {\n\t\tpanic(\"page number cannot be less than 1\")\n\t}\n\n\tif pageSize \u003c 1 || pageSize \u003e 50 {\n\t\tpanic(\"page size must be from 1 to 50\")\n\t}\n\n\t// Pagination\n\t// Calculate indexes\n\tstartIndex := (page - 1) * pageSize\n\tendIndex := startIndex + pageSize\n\n\t// If page does not contain any users\n\tif startIndex \u003e= len(signups) {\n\t\treturn nil, -1\n\t}\n\n\t// If page contains fewer users than the page size\n\tif endIndex \u003e len(signups) {\n\t\tendIndex = len(signups)\n\t}\n\n\treturn signups[startIndex:endIndex], endIndex\n}\n\nfunc renderHelper(res *mux.ResponseWriter, req *mux.Request) {\n\ttotalSignups := len(signups)\n\tres.Write(\"# Welcome to UserBook!\\n\\n\")\n\n\t// Get URL parameter\n\tpage, err := strconv.Atoi(req.GetVar(\"number\"))\n\tif err != nil {\n\t\tpage = 1 // render first page on bad input\n\t}\n\n\t// Fetch paginated signups\n\tfetchedSignups, endIndex := GetSignupsInRange(page, defaultPageSize)\n\t// Handle empty page case\n\tif len(fetchedSignups) == 0 {\n\t\tres.Write(\"No users on this page!\\n\\n\")\n\t\tres.Write(\"---\\n\\n\")\n\t\tres.Write(\"[Back to Page #1](/r/demo/userbook:page/1)\\n\\n\")\n\t\treturn\n\t}\n\n\t// Write page title\n\tres.Write(ufmt.Sprintf(\"## UserBook - Page #%d:\\n\\n\", page))\n\n\t// Write signups\n\tpageStartIndex := defaultPageSize * (page - 1)\n\tfor i, signup := range fetchedSignups {\n\t\tout := ufmt.Sprintf(\"#### User #%d - %s - signed up at Block #%d\\n\", pageStartIndex+i, signup.account, signup.height)\n\t\tres.Write(out)\n\t}\n\n\tres.Write(\"---\\n\\n\")\n\n\t// Write UserBook info\n\tlatestSignupIndex := totalSignups - 1\n\tres.Write(ufmt.Sprintf(\"#### Total users: %d\\n\", totalSignups))\n\tres.Write(ufmt.Sprintf(\"#### Latest signup: User #%d at Block #%d\\n\", latestSignupIndex, signups[latestSignupIndex].height))\n\n\tres.Write(\"---\\n\\n\")\n\n\t// Write page number\n\tres.Write(ufmt.Sprintf(\"You're viewing page #%d\", page))\n\n\t// Write navigation buttons\n\tvar prevPage string\n\tvar nextPage string\n\t// If we are on any page that is not the first page\n\tif page \u003e 1 {\n\t\tprevPage = ufmt.Sprintf(\" - [Previous page](/r/demo/userbook:page/%d)\", page-1)\n\t}\n\n\t// If there are more pages after the current one\n\tif endIndex \u003c totalSignups {\n\t\tnextPage = ufmt.Sprintf(\" - [Next page](/r/demo/userbook:page/%d)\\n\\n\", page+1)\n\t}\n\n\tres.Write(prevPage)\n\tres.Write(nextPage)\n}\n\nfunc Render(path string) string {\n\treturn router.Render(path)\n}\n"},{"name":"userbook_test.gno","body":"package userbook\n\nimport (\n\t\"std\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nfunc TestRender(t *testing.T) {\n\t// Sign up 20 users + deployer\n\tfor i := 0; i \u003c 20; i++ {\n\t\taddrName := ufmt.Sprintf(\"test%d\", i)\n\t\tcaller := testutils.TestAddress(addrName)\n\t\tstd.TestSetOrigCaller(caller)\n\t\tSignUp()\n\t}\n\n\ttestCases := []struct {\n\t\tname string\n\t\tnextPage bool\n\t\tprevPage bool\n\t\tpath string\n\t\texpectedNumberOfUsers int\n\t}{\n\t\t{\n\t\t\tname: \"1st page render\",\n\t\t\tnextPage: true,\n\t\t\tprevPage: false,\n\t\t\tpath: \"page/1\",\n\t\t\texpectedNumberOfUsers: 20,\n\t\t},\n\t\t{\n\t\t\tname: \"2nd page render\",\n\t\t\tnextPage: false,\n\t\t\tprevPage: true,\n\t\t\tpath: \"page/2\",\n\t\t\texpectedNumberOfUsers: 1,\n\t\t},\n\t\t{\n\t\t\tname: \"Invalid path render\",\n\t\t\tnextPage: true,\n\t\t\tprevPage: false,\n\t\t\tpath: \"page/invalidtext\",\n\t\t\texpectedNumberOfUsers: 20,\n\t\t},\n\t\t{\n\t\t\tname: \"Empty Page\",\n\t\t\tnextPage: false,\n\t\t\tprevPage: false,\n\t\t\tpath: \"page/1000\",\n\t\t\texpectedNumberOfUsers: 0,\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tgot := Render(tc.path)\n\t\t\tnumUsers := countUsers(got)\n\n\t\t\tif tc.prevPage \u0026\u0026 !strings.Contains(got, \"Previous page\") {\n\t\t\t\tt.Fatalf(\"expected to find Previous page, didn't find it\")\n\t\t\t}\n\t\t\tif tc.nextPage \u0026\u0026 !strings.Contains(got, \"Next page\") {\n\t\t\t\tt.Fatalf(\"expected to find Next page, didn't find it\")\n\t\t\t}\n\n\t\t\tif tc.expectedNumberOfUsers != numUsers {\n\t\t\t\tt.Fatalf(\"expected %d, got %d users\", tc.expectedNumberOfUsers, numUsers)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc countUsers(input string) int {\n\treturn strings.Count(input, \"#### User #\")\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"wugnot","path":"gno.land/r/demo/wugnot","files":[{"name":"wugnot.gno","body":"package wugnot\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ufmt\"\n\tpusers \"gno.land/p/demo/users\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tbanker *grc20.Banker = grc20.NewBanker(\"wrapped GNOT\", \"wugnot\", 0)\n\tToken = banker.Token()\n)\n\nconst (\n\tugnotMinDeposit uint64 = 1000\n\twugnotMinDeposit uint64 = 1\n)\n\nfunc Deposit() {\n\tcaller := std.PrevRealm().Addr()\n\tsent := std.GetOrigSend()\n\tamount := sent.AmountOf(\"ugnot\")\n\n\trequire(uint64(amount) \u003e= ugnotMinDeposit, ufmt.Sprintf(\"Deposit below minimum: %d/%d ugnot.\", amount, ugnotMinDeposit))\n\tcheckErr(banker.Mint(caller, uint64(amount)))\n}\n\nfunc Withdraw(amount uint64) {\n\trequire(amount \u003e= wugnotMinDeposit, ufmt.Sprintf(\"Deposit below minimum: %d/%d wugnot.\", amount, wugnotMinDeposit))\n\n\tcaller := std.PrevRealm().Addr()\n\tpkgaddr := std.CurrentRealm().Addr()\n\tcallerBal := Token.BalanceOf(caller)\n\trequire(amount \u003c= callerBal, ufmt.Sprintf(\"Insufficient balance: %d available, %d needed.\", callerBal, amount))\n\n\t// send swapped ugnots to qcaller\n\tstdBanker := std.GetBanker(std.BankerTypeRealmSend)\n\tsend := std.Coins{{\"ugnot\", int64(amount)}}\n\tstdBanker.SendCoins(pkgaddr, caller, send)\n\tcheckErr(banker.Burn(caller, amount))\n}\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tc := len(parts)\n\n\tswitch {\n\tcase path == \"\":\n\t\treturn banker.RenderHome()\n\tcase c == 2 \u0026\u0026 parts[0] == \"balance\":\n\t\towner := std.Address(parts[1])\n\t\tbalance := Token.BalanceOf(owner)\n\t\treturn ufmt.Sprintf(\"%d\", balance)\n\tdefault:\n\t\treturn \"404\"\n\t}\n}\n\nfunc TotalSupply() uint64 { return Token.TotalSupply() }\n\nfunc BalanceOf(owner pusers.AddressOrName) uint64 {\n\townerAddr := users.Resolve(owner)\n\treturn Token.BalanceOf(ownerAddr)\n}\n\nfunc Allowance(owner, spender pusers.AddressOrName) uint64 {\n\townerAddr := users.Resolve(owner)\n\tspenderAddr := users.Resolve(spender)\n\treturn Token.Allowance(ownerAddr, spenderAddr)\n}\n\nfunc Transfer(to pusers.AddressOrName, amount uint64) {\n\ttoAddr := users.Resolve(to)\n\tcheckErr(Token.Transfer(toAddr, amount))\n}\n\nfunc Approve(spender pusers.AddressOrName, amount uint64) {\n\tspenderAddr := users.Resolve(spender)\n\tcheckErr(Token.Approve(spenderAddr, amount))\n}\n\nfunc TransferFrom(from, to pusers.AddressOrName, amount uint64) {\n\tfromAddr := users.Resolve(from)\n\ttoAddr := users.Resolve(to)\n\tcheckErr(Token.TransferFrom(fromAddr, toAddr, amount))\n}\n\nfunc require(condition bool, msg string) {\n\tif !condition {\n\t\tpanic(msg)\n\t}\n}\n\nfunc checkErr(err error) {\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"},{"name":"z0_filetest.gno","body":"// PKGPATH: gno.land/r/demo/wugnot_test\npackage wugnot_test\n\nimport (\n\t\"fmt\"\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/wugnot\"\n\n\tpusers \"gno.land/p/demo/users\"\n)\n\nvar (\n\taddr1 = testutils.TestAddress(\"test1\")\n\taddrc = std.DerivePkgAddr(\"gno.land/r/demo/wugnot\")\n\taddrt = std.DerivePkgAddr(\"gno.land/r/demo/wugnot_test\")\n)\n\nfunc main() {\n\tstd.TestSetOrigPkgAddr(addrc)\n\tstd.TestIssueCoins(addrc, std.Coins{{\"ugnot\", 100000001}}) // TODO: remove this\n\n\t// issue ugnots\n\tstd.TestIssueCoins(addr1, std.Coins{{\"ugnot\", 100000001}})\n\n\t// print initial state\n\tprintBalances()\n\t// println(wugnot.Render(\"queues\"))\n\t// println(\"A -\", wugnot.Render(\"\"))\n\n\tstd.TestSetOrigCaller(addr1)\n\tstd.TestSetOrigSend(std.Coins{{\"ugnot\", 123_400}}, nil)\n\twugnot.Deposit()\n\tprintBalances()\n\twugnot.Withdraw(4242)\n\tprintBalances()\n}\n\nfunc printBalances() {\n\tprintSingleBalance := func(name string, addr std.Address) {\n\t\twugnotBal := wugnot.BalanceOf(pusers.AddressOrName(addr))\n\t\tstd.TestSetOrigCaller(addr)\n\t\trobanker := std.GetBanker(std.BankerTypeReadonly)\n\t\tcoins := robanker.GetCoins(addr).AmountOf(\"ugnot\")\n\t\tfmt.Printf(\"| %-13s | addr=%s | wugnot=%-5d | ugnot=%-9d |\\n\",\n\t\t\tname, addr, wugnotBal, coins)\n\t}\n\tprintln(\"-----------\")\n\tprintSingleBalance(\"wugnot_test\", addrt)\n\tprintSingleBalance(\"wugnot\", addrc)\n\tprintSingleBalance(\"addr1\", addr1)\n\tprintln(\"-----------\")\n}\n\n// Output:\n// -----------\n// | wugnot_test | addr=g19rmydykafrqyyegc8uuaxxpzqwzcnxraj2dev9 | wugnot=0 | ugnot=200000000 |\n// | wugnot | addr=g1pf6dv9fjk3rn0m4jjcne306ga4he3mzmupfjl6 | wugnot=0 | ugnot=100000001 |\n// | addr1 | addr=g1w3jhxap3ta047h6lta047h6lta047h6l4mfnm7 | wugnot=0 | ugnot=100000001 |\n// -----------\n// -----------\n// | wugnot_test | addr=g19rmydykafrqyyegc8uuaxxpzqwzcnxraj2dev9 | wugnot=123400 | ugnot=200000000 |\n// | wugnot | addr=g1pf6dv9fjk3rn0m4jjcne306ga4he3mzmupfjl6 | wugnot=0 | ugnot=100000001 |\n// | addr1 | addr=g1w3jhxap3ta047h6lta047h6lta047h6l4mfnm7 | wugnot=0 | ugnot=100000001 |\n// -----------\n// -----------\n// | wugnot_test | addr=g19rmydykafrqyyegc8uuaxxpzqwzcnxraj2dev9 | wugnot=119158 | ugnot=200004242 |\n// | wugnot | addr=g1pf6dv9fjk3rn0m4jjcne306ga4he3mzmupfjl6 | wugnot=0 | ugnot=99995759 |\n// | addr1 | addr=g1w3jhxap3ta047h6lta047h6lta047h6l4mfnm7 | wugnot=0 | ugnot=100000001 |\n// -----------\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"gnoblog","path":"gno.land/r/gnoland/blog","files":[{"name":"admin.gno","body":"package gnoblog\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/context\"\n\t\"gno.land/p/gov/proposal\"\n)\n\nvar (\n\tadminAddr std.Address\n\tmoderatorList avl.Tree\n\tcommenterList avl.Tree\n\tinPause bool\n)\n\nfunc init() {\n\t// adminAddr = std.GetOrigCaller() // FIXME: find a way to use this from the main's genesis.\n\tadminAddr = \"g1manfred47kzduec920z88wfr64ylksmdcedlf5\" // @moul\n}\n\nfunc AdminSetAdminAddr(addr std.Address) {\n\tassertIsAdmin()\n\tadminAddr = addr\n}\n\nfunc AdminSetInPause(state bool) {\n\tassertIsAdmin()\n\tinPause = state\n}\n\nfunc AdminAddModerator(addr std.Address) {\n\tassertIsAdmin()\n\tmoderatorList.Set(addr.String(), true)\n}\n\nfunc AdminRemoveModerator(addr std.Address) {\n\tassertIsAdmin()\n\tmoderatorList.Set(addr.String(), false) // FIXME: delete instead?\n}\n\nfunc DaoAddPost(ctx context.Context, slug, title, body, publicationDate, authors, tags string) {\n\tproposal.AssertContextApprovedByGovDAO(ctx)\n\tcaller := std.DerivePkgAddr(\"gno.land/r/gov/dao\")\n\taddPost(caller, slug, title, body, publicationDate, authors, tags)\n}\n\nfunc ModAddPost(slug, title, body, publicationDate, authors, tags string) {\n\tassertIsModerator()\n\tcaller := std.GetOrigCaller()\n\taddPost(caller, slug, title, body, publicationDate, authors, tags)\n}\n\nfunc addPost(caller std.Address, slug, title, body, publicationDate, authors, tags string) {\n\tvar tagList []string\n\tif tags != \"\" {\n\t\ttagList = strings.Split(tags, \",\")\n\t}\n\tvar authorList []string\n\tif authors != \"\" {\n\t\tauthorList = strings.Split(authors, \",\")\n\t}\n\n\terr := b.NewPost(caller, slug, title, body, publicationDate, authorList, tagList)\n\n\tcheckErr(err)\n}\n\nfunc ModEditPost(slug, title, body, publicationDate, authors, tags string) {\n\tassertIsModerator()\n\n\ttagList := strings.Split(tags, \",\")\n\tauthorList := strings.Split(authors, \",\")\n\n\terr := b.GetPost(slug).Update(title, body, publicationDate, authorList, tagList)\n\tcheckErr(err)\n}\n\nfunc ModRemovePost(slug string) {\n\tassertIsModerator()\n\n\tb.RemovePost(slug)\n}\n\nfunc ModAddCommenter(addr std.Address) {\n\tassertIsModerator()\n\tcommenterList.Set(addr.String(), true)\n}\n\nfunc ModDelCommenter(addr std.Address) {\n\tassertIsModerator()\n\tcommenterList.Set(addr.String(), false) // FIXME: delete instead?\n}\n\nfunc ModDelComment(slug string, index int) {\n\tassertIsModerator()\n\n\terr := b.GetPost(slug).DeleteComment(index)\n\tcheckErr(err)\n}\n\nfunc isAdmin(addr std.Address) bool {\n\treturn addr == adminAddr\n}\n\nfunc isModerator(addr std.Address) bool {\n\t_, found := moderatorList.Get(addr.String())\n\treturn found\n}\n\nfunc isCommenter(addr std.Address) bool {\n\t_, found := commenterList.Get(addr.String())\n\treturn found\n}\n\nfunc assertIsAdmin() {\n\tcaller := std.GetOrigCaller()\n\tif !isAdmin(caller) {\n\t\tpanic(\"access restricted.\")\n\t}\n}\n\nfunc assertIsModerator() {\n\tcaller := std.GetOrigCaller()\n\tif isAdmin(caller) || isModerator(caller) {\n\t\treturn\n\t}\n\tpanic(\"access restricted\")\n}\n\nfunc assertIsCommenter() {\n\tcaller := std.GetOrigCaller()\n\tif isAdmin(caller) || isModerator(caller) || isCommenter(caller) {\n\t\treturn\n\t}\n\tpanic(\"access restricted\")\n}\n\nfunc assertNotInPause() {\n\tif inPause {\n\t\tpanic(\"access restricted (pause)\")\n\t}\n}\n"},{"name":"gnoblog.gno","body":"package gnoblog\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/blog\"\n)\n\nvar b = \u0026blog.Blog{\n\tTitle: \"Gnoland's Blog\",\n\tPrefix: \"/r/gnoland/blog:\",\n}\n\nfunc AddComment(postSlug, comment string) {\n\tassertIsCommenter()\n\tassertNotInPause()\n\n\tcaller := std.GetOrigCaller()\n\terr := b.GetPost(postSlug).AddComment(caller, comment)\n\tcheckErr(err)\n}\n\nfunc Render(path string) string {\n\treturn b.Render(path)\n}\n\nfunc RenderLastPostsWidget(limit int) string {\n\treturn b.RenderLastPostsWidget(limit)\n}\n\nfunc PostExists(slug string) bool {\n\tif b.GetPost(slug) == nil {\n\t\treturn false\n\t}\n\treturn true\n}\n"},{"name":"gnoblog_test.gno","body":"package gnoblog\n\nimport (\n\t\"std\"\n\t\"strings\"\n\t\"testing\"\n)\n\nfunc TestPackage(t *testing.T) {\n\tstd.TestSetOrigCaller(std.Address(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\"))\n\n\tauthor := std.GetOrigCaller()\n\n\t// by default, no posts.\n\t{\n\t\tgot := Render(\"\")\n\t\texpected := `\n# Gnoland's Blog\n\nNo posts.\n`\n\t\tassertMDEquals(t, got, expected)\n\t}\n\n\t// create two posts, list post.\n\t{\n\t\tModAddPost(\"slug1\", \"title1\", \"body1\", \"2022-05-20T13:17:22Z\", \"moul\", \"tag1,tag2\")\n\t\tModAddPost(\"slug2\", \"title2\", \"body2\", \"2022-05-20T13:17:23Z\", \"moul\", \"tag1,tag3\")\n\t\tgot := Render(\"\")\n\t\texpected := `\n\t# Gnoland's Blog\n\n\u003cdiv class='columns-3'\u003e\u003cdiv\u003e\n\n### [title2](/r/gnoland/blog:p/slug2)\n 20 May 2022\n\u003c/div\u003e\u003cdiv\u003e\n\n### [title1](/r/gnoland/blog:p/slug1)\n 20 May 2022\n\u003c/div\u003e\u003c/div\u003e\n\t`\n\t\tassertMDEquals(t, got, expected)\n\t}\n\n\t// view post.\n\t{\n\t\tgot := Render(\"p/slug2\")\n\t\texpected := `\n\u003cmain class='gno-tmpl-page'\u003e\n\n# title2\n\nbody2\n\n---\n\nTags: [#tag1](/r/gnoland/blog:t/tag1) [#tag3](/r/gnoland/blog:t/tag3)\n\nWritten by moul on 20 May 2022\n\nPublished by g1manfred47kzduec920z88wfr64ylksmdcedlf5 to Gnoland's Blog\n\n---\n\u003cdetails\u003e\u003csummary\u003eComment section\u003c/summary\u003e\n\n\u003c/details\u003e\n\u003c/main\u003e\n\n\t`\n\t\tassertMDEquals(t, got, expected)\n\t}\n\n\t// list by tags.\n\t{\n\t\tgot := Render(\"t/invalid\")\n\t\texpected := \"# [Gnoland's Blog](/r/gnoland/blog:) / t / invalid\\n\\nNo posts.\"\n\t\tassertMDEquals(t, got, expected)\n\n\t\tgot = Render(\"t/tag2\")\n\t\texpected = `\n# [Gnoland's Blog](/r/gnoland/blog:) / t / tag2\n\n\u003cdiv\u003e\n\n### [title1](/r/gnoland/blog:p/slug1)\n 20 May 2022\n\u003c/div\u003e\n\t`\n\t\tassertMDEquals(t, got, expected)\n\t}\n\n\t// add comments.\n\t{\n\t\tAddComment(\"slug1\", \"comment1\")\n\t\tAddComment(\"slug2\", \"comment2\")\n\t\tAddComment(\"slug1\", \"comment3\")\n\t\tAddComment(\"slug2\", \"comment4\")\n\t\tAddComment(\"slug1\", \"comment5\")\n\t\tgot := Render(\"p/slug2\")\n\t\texpected := `\u003cmain class='gno-tmpl-page'\u003e\n\n# title2\n\nbody2\n\n---\n\nTags: [#tag1](/r/gnoland/blog:t/tag1) [#tag3](/r/gnoland/blog:t/tag3)\n\nWritten by moul on 20 May 2022\n\nPublished by g1manfred47kzduec920z88wfr64ylksmdcedlf5 to Gnoland's Blog\n\n---\n\u003cdetails\u003e\u003csummary\u003eComment section\u003c/summary\u003e\n\n\u003ch5\u003ecomment4\n\n\u003c/h5\u003e\u003ch6\u003eby g1manfred47kzduec920z88wfr64ylksmdcedlf5 on 13 Feb 09 23:31 UTC\u003c/h6\u003e\n\n---\n\n\u003ch5\u003ecomment2\n\n\u003c/h5\u003e\u003ch6\u003eby g1manfred47kzduec920z88wfr64ylksmdcedlf5 on 13 Feb 09 23:31 UTC\u003c/h6\u003e\n\n---\n\n\u003c/details\u003e\n\u003c/main\u003e\n\t`\n\t\tassertMDEquals(t, got, expected)\n\t}\n\n\t// edit post.\n\t{\n\t\toldTitle := \"title2\"\n\t\toldDate := \"2022-05-20T13:17:23Z\"\n\n\t\tModEditPost(\"slug2\", oldTitle, \"body2++\", oldDate, \"manfred\", \"tag1,tag4\")\n\t\tgot := Render(\"p/slug2\")\n\t\texpected := `\u003cmain class='gno-tmpl-page'\u003e\n\n# title2\n\nbody2++\n\n---\n\nTags: [#tag1](/r/gnoland/blog:t/tag1) [#tag4](/r/gnoland/blog:t/tag4)\n\nWritten by manfred on 20 May 2022\n\nPublished by g1manfred47kzduec920z88wfr64ylksmdcedlf5 to Gnoland's Blog\n\n---\n\u003cdetails\u003e\u003csummary\u003eComment section\u003c/summary\u003e\n\n\u003ch5\u003ecomment4\n\n\u003c/h5\u003e\u003ch6\u003eby g1manfred47kzduec920z88wfr64ylksmdcedlf5 on 13 Feb 09 23:31 UTC\u003c/h6\u003e\n\n---\n\n\u003ch5\u003ecomment2\n\n\u003c/h5\u003e\u003ch6\u003eby g1manfred47kzduec920z88wfr64ylksmdcedlf5 on 13 Feb 09 23:31 UTC\u003c/h6\u003e\n\n---\n\n\u003c/details\u003e\n\u003c/main\u003e\n\t`\n\t\tassertMDEquals(t, got, expected)\n\n\t\thome := Render(\"\")\n\n\t\tif strings.Count(home, oldTitle) != 1 {\n\t\t\tt.Errorf(\"post not edited properly\")\n\t\t}\n\t\t// Edits work everything except title, slug, and publicationDate\n\t\t// Edits to the above will cause duplication on the blog home page\n\t}\n\n\t{ // Test remove functionality\n\t\ttitle := \"example title\"\n\t\tslug := \"testSlug1\"\n\t\tModAddPost(slug, title, \"body1\", \"2022-05-25T13:17:22Z\", \"moul\", \"tag1,tag2\")\n\n\t\tgot := Render(\"\")\n\n\t\tif !strings.Contains(got, title) {\n\t\t\tt.Errorf(\"post was not added properly\")\n\t\t}\n\n\t\tpostRender := Render(\"p/\" + slug)\n\n\t\tif !strings.Contains(postRender, title) {\n\t\t\tt.Errorf(\"post not rendered properly\")\n\t\t}\n\n\t\tModRemovePost(slug)\n\t\tgot = Render(\"\")\n\n\t\tif strings.Contains(got, title) {\n\t\t\tt.Errorf(\"post was not removed\")\n\t\t}\n\n\t\tpostRender = Render(\"p/\" + slug)\n\n\t\tassertMDEquals(t, postRender, \"404\")\n\t}\n\n\t// TODO: pagination.\n\t// TODO: ?format=...\n\n\t// all 404s\n\t{\n\t\tnotFoundPaths := []string{\n\t\t\t\"p/slug3\",\n\t\t\t\"p\",\n\t\t\t\"p/\",\n\t\t\t\"x/x\",\n\t\t\t\"t\",\n\t\t\t\"t/\",\n\t\t\t\"/\",\n\t\t\t\"p/slug1/\",\n\t\t}\n\t\tfor _, notFoundPath := range notFoundPaths {\n\t\t\tgot := Render(notFoundPath)\n\t\t\texpected := \"404\"\n\t\t\tif got != expected {\n\t\t\t\tt.Errorf(\"path %q: expected %q, got %q.\", notFoundPath, expected, got)\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc assertMDEquals(t *testing.T, got, expected string) {\n\tt.Helper()\n\texpected = strings.TrimSpace(expected)\n\tgot = strings.TrimSpace(got)\n\tif expected != got {\n\t\tt.Errorf(\"invalid render output.\\nexpected %q.\\ngot %q.\", expected, got)\n\t}\n}\n"},{"name":"util.gno","body":"package gnoblog\n\nfunc checkErr(err error) {\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"events","path":"gno.land/r/gnoland/events","files":[{"name":"administration.gno","body":"package events\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/ownable/exts/authorizable\"\n)\n\nvar (\n\tsu = std.Address(\"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5\") // @leohhhn\n\tauth = authorizable.NewAuthorizableWithAddress(su)\n)\n\n// GetOwner gets the owner of the events realm\nfunc GetOwner() std.Address {\n\treturn auth.Owner()\n}\n\n// AddModerator adds a moderator to the events realm\nfunc AddModerator(mod std.Address) {\n\tauth.AssertCallerIsOwner()\n\n\tif err := auth.AddToAuthList(mod); err != nil {\n\t\tpanic(err)\n\t}\n}\n"},{"name":"errors.gno","body":"package events\n\nimport (\n\t\"errors\"\n\t\"strconv\"\n)\n\nvar (\n\tErrEmptyName = errors.New(\"event name cannot be empty\")\n\tErrNoSuchID = errors.New(\"event with specified ID does not exist\")\n\tErrMinWidgetSize = errors.New(\"you need to request at least 1 event to render\")\n\tErrMaxWidgetSize = errors.New(\"maximum number of events in widget is\" + strconv.Itoa(MaxWidgetSize))\n\tErrDescriptionTooLong = errors.New(\"event description is too long\")\n\tErrInvalidStartTime = errors.New(\"invalid start time format\")\n\tErrInvalidEndTime = errors.New(\"invalid end time format\")\n\tErrEndBeforeStart = errors.New(\"end time cannot be before start time\")\n\tErrStartEndTimezonemMismatch = errors.New(\"start and end timezones are not the same\")\n)\n"},{"name":"events.gno","body":"// Package events allows you to upload data about specific IRL/online events\n// It includes dynamic support for updating rendering events based on their\n// status, ie if they are upcoming, in progress, or in the past.\npackage events\n\nimport (\n\t\"sort\"\n\t\"std\"\n\t\"strings\"\n\t\"time\"\n\n\t\"gno.land/p/demo/seqid\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\ntype (\n\tEvent struct {\n\t\tid string\n\t\tname string // name of event\n\t\tdescription string // short description of event\n\t\tlink string // link to auth corresponding web2 page, ie eventbrite/luma or conference page\n\t\tlocation string // location of the event\n\t\tstartTime time.Time // given in RFC3339\n\t\tendTime time.Time // end time of the event, given in RFC3339\n\t}\n\n\teventsSlice []*Event\n)\n\nvar (\n\tevents = make(eventsSlice, 0) // sorted\n\tidCounter seqid.ID\n)\n\nconst (\n\tmaxDescLength = 100\n\tEventAdded = \"EventAdded\"\n\tEventDeleted = \"EventDeleted\"\n\tEventEdited = \"EventEdited\"\n)\n\n// AddEvent adds auth new event\n// Start time \u0026 end time need to be specified in RFC3339, ie 2024-08-08T12:00:00+02:00\nfunc AddEvent(name, description, link, location, startTime, endTime string) (string, error) {\n\tauth.AssertOnAuthList()\n\n\tif strings.TrimSpace(name) == \"\" {\n\t\treturn \"\", ErrEmptyName\n\t}\n\n\tif len(description) \u003e maxDescLength {\n\t\treturn \"\", ufmt.Errorf(\"%s: provided length is %d, maximum is %d\", ErrDescriptionTooLong, len(description), maxDescLength)\n\t}\n\n\t// Parse times\n\tst, et, err := parseTimes(startTime, endTime)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tid := idCounter.Next().String()\n\te := \u0026Event{\n\t\tid: id,\n\t\tname: name,\n\t\tdescription: description,\n\t\tlink: link,\n\t\tlocation: location,\n\t\tstartTime: st,\n\t\tendTime: et,\n\t}\n\n\tevents = append(events, e)\n\tsort.Sort(events)\n\n\tstd.Emit(EventAdded,\n\t\t\"id\",\n\t\te.id,\n\t)\n\n\treturn id, nil\n}\n\n// DeleteEvent deletes an event with auth given ID\nfunc DeleteEvent(id string) {\n\tauth.AssertOnAuthList()\n\n\te, idx, err := GetEventByID(id)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tevents = append(events[:idx], events[idx+1:]...)\n\n\tstd.Emit(EventDeleted,\n\t\t\"id\",\n\t\te.id,\n\t)\n}\n\n// EditEvent edits an event with auth given ID\n// It only updates values corresponding to non-empty arguments sent with the call\n// Note: if you need to update the start time or end time, you need to provide both every time\nfunc EditEvent(id string, name, description, link, location, startTime, endTime string) {\n\tauth.AssertOnAuthList()\n\n\te, _, err := GetEventByID(id)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\t// Set only valid values\n\tif strings.TrimSpace(name) != \"\" {\n\t\te.name = name\n\t}\n\n\tif strings.TrimSpace(description) != \"\" {\n\t\te.description = description\n\t}\n\n\tif strings.TrimSpace(link) != \"\" {\n\t\te.link = link\n\t}\n\n\tif strings.TrimSpace(location) != \"\" {\n\t\te.location = location\n\t}\n\n\tif strings.TrimSpace(startTime) != \"\" || strings.TrimSpace(endTime) != \"\" {\n\t\tst, et, err := parseTimes(startTime, endTime)\n\t\tif err != nil {\n\t\t\tpanic(err) // need to also revert other state changes\n\t\t}\n\n\t\toldStartTime := e.startTime\n\t\te.startTime = st\n\t\te.endTime = et\n\n\t\t// If sort order was disrupted, sort again\n\t\tif oldStartTime != e.startTime {\n\t\t\tsort.Sort(events)\n\t\t}\n\t}\n\n\tstd.Emit(EventEdited,\n\t\t\"id\",\n\t\te.id,\n\t)\n}\n\nfunc GetEventByID(id string) (*Event, int, error) {\n\tfor i, event := range events {\n\t\tif event.id == id {\n\t\t\treturn event, i, nil\n\t\t}\n\t}\n\n\treturn nil, -1, ErrNoSuchID\n}\n\n// Len returns the length of the slice\nfunc (m eventsSlice) Len() int {\n\treturn len(m)\n}\n\n// Less compares the startTime fields of two elements\n// In this case, events will be sorted by largest startTime first (upcoming \u003e past)\nfunc (m eventsSlice) Less(i, j int) bool {\n\treturn m[i].startTime.After(m[j].startTime)\n}\n\n// Swap swaps two elements in the slice\nfunc (m eventsSlice) Swap(i, j int) {\n\tm[i], m[j] = m[j], m[i]\n}\n\n// parseTimes parses the start and end time for an event and checks for possible errors\nfunc parseTimes(startTime, endTime string) (time.Time, time.Time, error) {\n\tst, err := time.Parse(time.RFC3339, startTime)\n\tif err != nil {\n\t\treturn time.Time{}, time.Time{}, ufmt.Errorf(\"%s: %s\", ErrInvalidStartTime, err.Error())\n\t}\n\n\tet, err := time.Parse(time.RFC3339, endTime)\n\tif err != nil {\n\t\treturn time.Time{}, time.Time{}, ufmt.Errorf(\"%s: %s\", ErrInvalidEndTime, err.Error())\n\t}\n\n\tif et.Before(st) {\n\t\treturn time.Time{}, time.Time{}, ErrEndBeforeStart\n\t}\n\n\t_, stOffset := st.Zone()\n\t_, etOffset := et.Zone()\n\tif stOffset != etOffset {\n\t\treturn time.Time{}, time.Time{}, ErrStartEndTimezonemMismatch\n\t}\n\n\treturn st, et, nil\n}\n"},{"name":"events_test.gno","body":"package events\n\nimport (\n\t\"std\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"gno.land/p/demo/uassert\"\n\t\"gno.land/p/demo/urequire\"\n)\n\nvar (\n\tsuRealm = std.NewUserRealm(su)\n\n\tnow = \"2009-02-13T23:31:30Z\" // time.Now() is hardcoded to this value in the gno test machine currently\n\tparsedTimeNow, _ = time.Parse(time.RFC3339, now)\n)\n\nfunc TestAddEvent(t *testing.T) {\n\tstd.TestSetOrigCaller(su)\n\tstd.TestSetRealm(suRealm)\n\n\te1Start := parsedTimeNow.Add(time.Hour * 24 * 5)\n\te1End := e1Start.Add(time.Hour * 4)\n\n\tAddEvent(\"Event 1\", \"this event is upcoming\", \"gno.land\", \"gnome land\", e1Start.Format(time.RFC3339), e1End.Format(time.RFC3339))\n\n\tgot := renderHome(false)\n\n\tif !strings.Contains(got, \"Event 1\") {\n\t\tt.Fatalf(\"Expected to find Event 1 in render\")\n\t}\n\n\te2Start := parsedTimeNow.Add(-time.Hour * 24 * 5)\n\te2End := e2Start.Add(time.Hour * 4)\n\n\tAddEvent(\"Event 2\", \"this event is in the past\", \"gno.land\", \"gnome land\", e2Start.Format(time.RFC3339), e2End.Format(time.RFC3339))\n\n\tgot = renderHome(false)\n\n\tupcomingPos := strings.Index(got, \"## Upcoming events\")\n\tpastPos := strings.Index(got, \"## Past events\")\n\n\te1Pos := strings.Index(got, \"Event 1\")\n\te2Pos := strings.Index(got, \"Event 2\")\n\n\t// expected index ordering: upcoming \u003c e1 \u003c past \u003c e2\n\tif e1Pos \u003c upcomingPos || e1Pos \u003e pastPos {\n\t\tt.Fatalf(\"Expected to find Event 1 in Upcoming events\")\n\t}\n\n\tif e2Pos \u003c upcomingPos || e2Pos \u003c pastPos || e2Pos \u003c e1Pos {\n\t\tt.Fatalf(\"Expected to find Event 2 on auth different pos\")\n\t}\n\n\t// larger index =\u003e smaller startTime (future =\u003e past)\n\tif events[0].startTime.Unix() \u003c events[1].startTime.Unix() {\n\t\tt.Fatalf(\"expected ordering to be different\")\n\t}\n}\n\nfunc TestAddEventErrors(t *testing.T) {\n\tstd.TestSetOrigCaller(su)\n\tstd.TestSetRealm(suRealm)\n\n\t_, err := AddEvent(\"\", \"sample desc\", \"gno.land\", \"gnome land\", \"2009-02-13T23:31:31Z\", \"2009-02-13T23:33:31Z\")\n\tuassert.ErrorIs(t, err, ErrEmptyName)\n\n\t_, err = AddEvent(\"sample name\", \"sample desc\", \"gno.land\", \"gnome land\", \"\", \"2009-02-13T23:33:31Z\")\n\tuassert.ErrorContains(t, err, ErrInvalidStartTime.Error())\n\n\t_, err = AddEvent(\"sample name\", \"sample desc\", \"gno.land\", \"gnome land\", \"2009-02-13T23:31:31Z\", \"\")\n\tuassert.ErrorContains(t, err, ErrInvalidEndTime.Error())\n\n\t_, err = AddEvent(\"sample name\", \"sample desc\", \"gno.land\", \"gnome land\", \"2009-02-13T23:31:31Z\", \"2009-02-13T23:30:31Z\")\n\tuassert.ErrorIs(t, err, ErrEndBeforeStart)\n\n\t_, err = AddEvent(\"sample name\", \"sample desc\", \"gno.land\", \"gnome land\", \"2009-02-13T23:31:31+06:00\", \"2009-02-13T23:33:31+02:00\")\n\tuassert.ErrorIs(t, err, ErrStartEndTimezonemMismatch)\n\n\ttooLongDesc := `Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean ma`\n\t_, err = AddEvent(\"sample name\", tooLongDesc, \"gno.land\", \"gnome land\", \"2009-02-13T23:31:31Z\", \"2009-02-13T23:33:31Z\")\n\tuassert.ErrorContains(t, err, ErrDescriptionTooLong.Error())\n}\n\nfunc TestDeleteEvent(t *testing.T) {\n\tevents = nil // remove elements from previous tests - see issue #1982\n\n\te1Start := parsedTimeNow.Add(time.Hour * 24 * 5)\n\te1End := e1Start.Add(time.Hour * 4)\n\n\tid, _ := AddEvent(\"ToDelete\", \"description\", \"gno.land\", \"gnome land\", e1Start.Format(time.RFC3339), e1End.Format(time.RFC3339))\n\n\tgot := renderHome(false)\n\n\tif !strings.Contains(got, \"ToDelete\") {\n\t\tt.Fatalf(\"Expected to find ToDelete event in render\")\n\t}\n\n\tDeleteEvent(id)\n\tgot = renderHome(false)\n\n\tif strings.Contains(got, \"ToDelete\") {\n\t\tt.Fatalf(\"Did not expect to find ToDelete event in render\")\n\t}\n}\n\nfunc TestEditEvent(t *testing.T) {\n\tevents = nil // remove elements from previous tests - see issue #1982\n\n\te1Start := parsedTimeNow.Add(time.Hour * 24 * 5)\n\te1End := e1Start.Add(time.Hour * 4)\n\tloc := \"gnome land\"\n\n\tid, _ := AddEvent(\"ToDelete\", \"description\", \"gno.land\", loc, e1Start.Format(time.RFC3339), e1End.Format(time.RFC3339))\n\n\tnewName := \"New Name\"\n\tnewDesc := \"Normal description\"\n\tnewLink := \"new Link\"\n\tnewST := e1Start.Add(time.Hour)\n\tnewET := newST.Add(time.Hour)\n\n\tEditEvent(id, newName, newDesc, newLink, \"\", newST.Format(time.RFC3339), newET.Format(time.RFC3339))\n\tedited, _, _ := GetEventByID(id)\n\n\t// Check updated values\n\tuassert.Equal(t, edited.name, newName)\n\tuassert.Equal(t, edited.description, newDesc)\n\tuassert.Equal(t, edited.link, newLink)\n\tuassert.True(t, edited.startTime.Equal(newST))\n\tuassert.True(t, edited.endTime.Equal(newET))\n\n\t// Check if the old values are the same\n\tuassert.Equal(t, edited.location, loc)\n}\n\nfunc TestInvalidEdit(t *testing.T) {\n\tevents = nil // remove elements from previous tests - see issue #1982\n\n\tuassert.PanicsWithMessage(t, ErrNoSuchID.Error(), func() {\n\t\tEditEvent(\"123123\", \"\", \"\", \"\", \"\", \"\", \"\")\n\t})\n}\n\nfunc TestParseTimes(t *testing.T) {\n\t// times not provided\n\t// end time before start time\n\t// timezone Missmatch\n\n\t_, _, err := parseTimes(\"\", \"\")\n\tuassert.ErrorContains(t, err, ErrInvalidStartTime.Error())\n\n\t_, _, err = parseTimes(now, \"\")\n\tuassert.ErrorContains(t, err, ErrInvalidEndTime.Error())\n\n\t_, _, err = parseTimes(\"2009-02-13T23:30:30Z\", \"2009-02-13T21:30:30Z\")\n\tuassert.ErrorContains(t, err, ErrEndBeforeStart.Error())\n\n\t_, _, err = parseTimes(\"2009-02-10T23:30:30+02:00\", \"2009-02-13T21:30:33+05:00\")\n\tuassert.ErrorContains(t, err, ErrStartEndTimezonemMismatch.Error())\n}\n\nfunc TestRenderEventWidget(t *testing.T) {\n\tevents = nil // remove elements from previous tests - see issue #1982\n\n\t// No events yet\n\tout, err := RenderEventWidget(1)\n\tuassert.NoError(t, err)\n\tuassert.Equal(t, out, \"No events.\")\n\n\t// Too many events\n\tout, err = RenderEventWidget(MaxWidgetSize + 1)\n\tuassert.ErrorIs(t, err, ErrMaxWidgetSize)\n\n\t// Too little events\n\tout, err = RenderEventWidget(0)\n\tuassert.ErrorIs(t, err, ErrMinWidgetSize)\n\n\t// Ordering \u0026 if requested amt is larger than the num of events that exist\n\te1Start := parsedTimeNow.Add(time.Hour * 24 * 5)\n\te1End := e1Start.Add(time.Hour * 4)\n\n\te2Start := parsedTimeNow.Add(time.Hour * 24 * 10) // event 2 is after event 1\n\te2End := e2Start.Add(time.Hour * 4)\n\n\t_, err = AddEvent(\"Event 1\", \"description\", \"gno.land\", \"loc\", e1Start.Format(time.RFC3339), e1End.Format(time.RFC3339))\n\turequire.NoError(t, err)\n\n\t_, err = AddEvent(\"Event 2\", \"description\", \"gno.land\", \"loc\", e2Start.Format(time.RFC3339), e2End.Format(time.RFC3339))\n\turequire.NoError(t, err)\n\n\tout, err = RenderEventWidget(MaxWidgetSize)\n\turequire.NoError(t, err)\n\n\tuniqueSequence := \"- [\" // sequence that is displayed once per each event as per the RenderEventWidget function\n\tuassert.Equal(t, 2, strings.Count(out, uniqueSequence))\n\n\tuassert.True(t, strings.Index(out, \"Event 1\") \u003e strings.Index(out, \"Event 2\"))\n}\n"},{"name":"rendering.gno","body":"package events\n\nimport (\n\t\"bytes\"\n\t\"time\"\n\n\t\"gno.land/p/demo/ufmt\"\n)\n\nconst (\n\tMaxWidgetSize = 5\n)\n\n// RenderEventWidget shows up to eventsToRender of the latest events to a caller\nfunc RenderEventWidget(eventsToRender int) (string, error) {\n\tnumOfEvents := len(events)\n\tif numOfEvents == 0 {\n\t\treturn \"No events.\", nil\n\t}\n\n\tif eventsToRender \u003e MaxWidgetSize {\n\t\treturn \"\", ErrMaxWidgetSize\n\t}\n\n\tif eventsToRender \u003c 1 {\n\t\treturn \"\", ErrMinWidgetSize\n\t}\n\n\tif eventsToRender \u003e numOfEvents {\n\t\teventsToRender = numOfEvents\n\t}\n\n\toutput := \"\"\n\n\tfor _, event := range events[:eventsToRender] {\n\t\toutput += ufmt.Sprintf(\"- [%s](%s)\\n\", event.name, event.link)\n\t}\n\n\treturn output, nil\n}\n\n// renderHome renders the home page of the events realm\nfunc renderHome(admin bool) string {\n\toutput := \"# gno.land events\\n\\n\"\n\n\tif len(events) == 0 {\n\t\toutput += \"No upcoming or past events.\"\n\t\treturn output\n\t}\n\n\toutput += \"Below is a list of all gno.land events, including in progress, upcoming, and past ones.\\n\\n\"\n\toutput += \"---\\n\\n\"\n\n\tvar (\n\t\tinProgress = \"\"\n\t\tupcoming = \"\"\n\t\tpast = \"\"\n\t\tnow = time.Now()\n\t)\n\n\tfor _, e := range events {\n\t\tif now.Before(e.startTime) {\n\t\t\tupcoming += e.Render(admin)\n\t\t} else if now.After(e.endTime) {\n\t\t\tpast += e.Render(admin)\n\t\t} else {\n\t\t\tinProgress += e.Render(admin)\n\t\t}\n\t}\n\n\tif upcoming != \"\" {\n\t\t// Add upcoming events\n\t\toutput += \"## Upcoming events\\n\\n\"\n\t\toutput += \"\u003cdiv class='columns-3'\u003e\"\n\n\t\toutput += upcoming\n\n\t\toutput += \"\u003c/div\u003e\\n\\n\"\n\t\toutput += \"---\\n\\n\"\n\t}\n\n\tif inProgress != \"\" {\n\t\toutput += \"## Currently in progress\\n\\n\"\n\t\toutput += \"\u003cdiv class='columns-3'\u003e\"\n\n\t\toutput += inProgress\n\n\t\toutput += \"\u003c/div\u003e\\n\\n\"\n\t\toutput += \"---\\n\\n\"\n\t}\n\n\tif past != \"\" {\n\t\t// Add past events\n\t\toutput += \"## Past events\\n\\n\"\n\t\toutput += \"\u003cdiv class='columns-3'\u003e\"\n\n\t\toutput += past\n\n\t\toutput += \"\u003c/div\u003e\\n\\n\"\n\t}\n\n\treturn output\n}\n\n// Render returns the markdown representation of a single event instance\nfunc (e Event) Render(admin bool) string {\n\tvar buf bytes.Buffer\n\n\tbuf.WriteString(\"\u003cdiv\u003e\\n\\n\")\n\tbuf.WriteString(ufmt.Sprintf(\"### %s\\n\\n\", e.name))\n\tbuf.WriteString(ufmt.Sprintf(\"%s\\n\\n\", e.description))\n\tbuf.WriteString(ufmt.Sprintf(\"**Location:** %s\\n\\n\", e.location))\n\n\t_, offset := e.startTime.Zone() // offset is in seconds\n\thoursOffset := offset / (60 * 60)\n\tsign := \"\"\n\tif offset \u003e= 0 {\n\t\tsign = \"+\"\n\t}\n\n\tbuf.WriteString(ufmt.Sprintf(\"**Starts:** %s UTC%s%d\\n\\n\", e.startTime.Format(\"02 Jan 2006, 03:04 PM\"), sign, hoursOffset))\n\tbuf.WriteString(ufmt.Sprintf(\"**Ends:** %s UTC%s%d\\n\\n\", e.endTime.Format(\"02 Jan 2006, 03:04 PM\"), sign, hoursOffset))\n\n\tif admin {\n\t\tbuf.WriteString(ufmt.Sprintf(\"[EDIT](/r/gnoland/events?help\u0026__func=EditEvent\u0026id=%s)\\n\\n\", e.id))\n\t\tbuf.WriteString(ufmt.Sprintf(\"[DELETE](/r/gnoland/events?help\u0026__func=DeleteEvent\u0026id=%s)\\n\\n\", e.id))\n\t}\n\n\tif e.link != \"\" {\n\t\tbuf.WriteString(ufmt.Sprintf(\"[See more](%s)\\n\\n\", e.link))\n\t}\n\n\tbuf.WriteString(\"\u003c/div\u003e\")\n\n\treturn buf.String()\n}\n\n// Render is the main rendering entry point\nfunc Render(path string) string {\n\tif path == \"admin\" {\n\t\treturn renderHome(true)\n\t}\n\n\treturn renderHome(false)\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"faucet","path":"gno.land/r/gnoland/faucet","files":[{"name":"admin.gno","body":"package faucet\n\nimport (\n\t\"errors\"\n\t\"std\"\n)\n\nfunc AdminSetInPause(inPause bool) string {\n\tif err := assertIsAdmin(); err != nil {\n\t\treturn err.Error()\n\t}\n\tgInPause = inPause\n\treturn \"\"\n}\n\nfunc AdminSetMessage(message string) string {\n\tif err := assertIsAdmin(); err != nil {\n\t\treturn err.Error()\n\t}\n\tgMessage = message\n\treturn \"\"\n}\n\nfunc AdminSetTransferLimit(amount int64) string {\n\tif err := assertIsAdmin(); err != nil {\n\t\treturn err.Error()\n\t}\n\tgLimit = std.NewCoin(\"ugnot\", amount)\n\treturn \"\"\n}\n\nfunc AdminSetAdminAddr(addr std.Address) string {\n\tif err := assertIsAdmin(); err != nil {\n\t\treturn err.Error()\n\t}\n\tgAdminAddr = addr\n\treturn \"\"\n}\n\nfunc AdminAddController(addr std.Address) string {\n\tif err := assertIsAdmin(); err != nil {\n\t\treturn err.Error()\n\t}\n\n\tsize := gControllers.Size()\n\n\tif size \u003e= gControllersMaxSize {\n\t\treturn \"can not add more controllers than allowed\"\n\t}\n\n\tif gControllers.Has(addr.String()) {\n\t\treturn addr.String() + \" exists, no need to add.\"\n\t}\n\n\tgControllers.Set(addr.String(), addr)\n\n\treturn \"\"\n}\n\nfunc AdminRemoveController(addr std.Address) string {\n\tif err := assertIsAdmin(); err != nil {\n\t\treturn err.Error()\n\t}\n\n\tif !gControllers.Has(addr.String()) {\n\t\treturn addr.String() + \" is not on the controller list\"\n\t}\n\n\t_, ok := gControllers.Remove(addr.String())\n\n\t// it not should happen.\n\t// we will check anyway to prevent issues in the underline implementation.\n\n\tif !ok {\n\t\treturn addr.String() + \" is not on the controller list\"\n\t}\n\n\treturn \"\"\n}\n\nfunc assertIsAdmin() error {\n\tcaller := std.GetOrigCaller()\n\tif caller != gAdminAddr {\n\t\treturn errors.New(\"restricted for admin\")\n\t}\n\treturn nil\n}\n"},{"name":"faucet.gno","body":"package faucet\n\nimport (\n\t\"errors\"\n\t\"std\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar (\n\t// configurable by admin.\n\tgAdminAddr std.Address = std.Address(\"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\")\n\tgControllers = avl.NewTree()\n\tgControllersMaxSize = 10 // limit it to 10\n\tgInPause = false\n\tgMessage = \"# Community Faucet.\\n\\n\"\n\n\t// internal vars, for stats.\n\tgTotalTransferred std.Coins\n\tgTotalTransfers = uint(0)\n\n\t// per request limit, 350 gnot\n\tgLimit std.Coin = std.NewCoin(\"ugnot\", 350000000)\n)\n\nfunc Transfer(to std.Address, send int64) string {\n\tif err := assertIsController(); err != nil {\n\t\treturn err.Error()\n\t}\n\n\tif gInPause {\n\t\treturn errors.New(\"faucet in pause\").Error()\n\t}\n\n\t// limit the per request\n\tif send \u003e gLimit.Amount {\n\t\treturn errors.New(\"Per request limit \" + gLimit.String() + \" exceed\").Error()\n\t}\n\tsendCoins := std.Coins{std.NewCoin(\"ugnot\", send)}\n\n\tgTotalTransferred = gTotalTransferred.Add(sendCoins)\n\tgTotalTransfers++\n\n\tbanker := std.GetBanker(std.BankerTypeRealmSend)\n\tpkgaddr := std.CurrentRealm().Addr()\n\tbanker.SendCoins(pkgaddr, to, sendCoins)\n\treturn \"\"\n}\n\nfunc GetPerTransferLimit() int64 {\n\treturn gLimit.Amount\n}\n\nfunc Render(_ string) string {\n\tbanker := std.GetBanker(std.BankerTypeRealmSend)\n\tbalance := banker.GetCoins(std.CurrentRealm().Addr())\n\n\toutput := gMessage\n\tif gInPause {\n\t\toutput += \"Status: inactive.\\n\"\n\t} else {\n\t\toutput += \"Status: active.\\n\"\n\t}\n\toutput += ufmt.Sprintf(\"Balance: %s.\\n\", balance.String())\n\toutput += ufmt.Sprintf(\"Total transfers: %s (in %d times).\\n\\n\", gTotalTransferred.String(), gTotalTransfers)\n\n\toutput += \"Package address: \" + std.CurrentRealm().Addr().String() + \"\\n\\n\"\n\toutput += ufmt.Sprintf(\"Admin: %s\\n\\n \", gAdminAddr.String())\n\toutput += ufmt.Sprintf(\"Controllers:\\n\\n \")\n\n\tfor i := 0; i \u003c gControllers.Size(); i++ {\n\t\t_, v := gControllers.GetByIndex(i)\n\t\toutput += ufmt.Sprintf(\"%s \", v.(std.Address))\n\t}\n\n\toutput += \"\\n\\n\"\n\toutput += ufmt.Sprintf(\"Per request limit: %s\\n\\n\", gLimit.String())\n\n\treturn output\n}\n\nfunc assertIsController() error {\n\tcaller := std.GetOrigCaller()\n\n\tok := gControllers.Has(caller.String())\n\tif !ok {\n\t\treturn errors.New(caller.String() + \" is not on the controller list\")\n\t}\n\treturn nil\n}\n"},{"name":"faucet_test.gno","body":"package faucet\n\nimport (\n\t\"std\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/gnoland/faucet\"\n)\n\nfunc TestPackage(t *testing.T) {\n\tvar (\n\t\tadminaddr = std.Address(\"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\")\n\t\tfaucetaddr = std.DerivePkgAddr(\"gno.land/r/gnoland/faucet\")\n\t\tcontrolleraddr1 = testutils.TestAddress(\"controller1\")\n\t\tcontrolleraddr2 = testutils.TestAddress(\"controller2\")\n\t\tcontrolleraddr3 = testutils.TestAddress(\"controller3\")\n\t\tcontrolleraddr4 = testutils.TestAddress(\"controller4\")\n\t\tcontrolleraddr5 = testutils.TestAddress(\"controller5\")\n\t\tcontrolleraddr6 = testutils.TestAddress(\"controller6\")\n\t\tcontrolleraddr7 = testutils.TestAddress(\"controller7\")\n\t\tcontrolleraddr8 = testutils.TestAddress(\"controller8\")\n\t\tcontrolleraddr9 = testutils.TestAddress(\"controller9\")\n\t\tcontrolleraddr10 = testutils.TestAddress(\"controller10\")\n\t\tcontrolleraddr11 = testutils.TestAddress(\"controller11\")\n\n\t\ttest1addr = testutils.TestAddress(\"test1\")\n\t)\n\t// deposit 1000gnot to faucet contract\n\tstd.TestIssueCoins(faucetaddr, std.Coins{{\"ugnot\", 1000000000}})\n\tassertBalance(t, faucetaddr, 1200000000)\n\n\t// by default, balance is empty, and as a user I cannot call Transfer, or Admin commands.\n\n\tassertBalance(t, test1addr, 0)\n\tstd.TestSetOrigCaller(test1addr)\n\tassertErr(t, faucet.Transfer(test1addr, 1000000))\n\n\tassertErr(t, faucet.AdminAddController(controlleraddr1))\n\tstd.TestSetOrigCaller(controlleraddr1)\n\tassertErr(t, faucet.Transfer(test1addr, 1000000))\n\n\t// as an admin, add the controller to contract and deposit more 2000gnot to contract\n\tstd.TestSetOrigCaller(adminaddr)\n\tassertNoErr(t, faucet.AdminAddController(controlleraddr1))\n\tassertBalance(t, faucetaddr, 1200000000)\n\n\t// now, send some tokens as controller.\n\tstd.TestSetOrigCaller(controlleraddr1)\n\tassertNoErr(t, faucet.Transfer(test1addr, 1000000))\n\tassertBalance(t, test1addr, 1000000)\n\tassertNoErr(t, faucet.Transfer(test1addr, 1000000))\n\tassertBalance(t, test1addr, 2000000)\n\tassertBalance(t, faucetaddr, 1198000000)\n\n\t// remove controller\n\t// as an admin, remove controller\n\tstd.TestSetOrigCaller(adminaddr)\n\tassertNoErr(t, faucet.AdminRemoveController(controlleraddr1))\n\tstd.TestSetOrigCaller(controlleraddr1)\n\tassertErr(t, faucet.Transfer(test1addr, 1000000))\n\n\t// duplicate controller\n\tstd.TestSetOrigCaller(adminaddr)\n\tassertNoErr(t, faucet.AdminAddController(controlleraddr1))\n\tassertErr(t, faucet.AdminAddController(controlleraddr1))\n\t// add more than more than allowed controllers\n\tassertNoErr(t, faucet.AdminAddController(controlleraddr2))\n\tassertNoErr(t, faucet.AdminAddController(controlleraddr3))\n\tassertNoErr(t, faucet.AdminAddController(controlleraddr4))\n\tassertNoErr(t, faucet.AdminAddController(controlleraddr5))\n\tassertNoErr(t, faucet.AdminAddController(controlleraddr6))\n\tassertNoErr(t, faucet.AdminAddController(controlleraddr7))\n\tassertNoErr(t, faucet.AdminAddController(controlleraddr8))\n\tassertNoErr(t, faucet.AdminAddController(controlleraddr9))\n\tassertNoErr(t, faucet.AdminAddController(controlleraddr10))\n\tassertErr(t, faucet.AdminAddController(controlleraddr11))\n\n\t// send more than per transfer limit\n\tstd.TestSetOrigCaller(adminaddr)\n\tfaucet.AdminSetTransferLimit(300000000)\n\tstd.TestSetOrigCaller(controlleraddr1)\n\tassertErr(t, faucet.Transfer(test1addr, 301000000))\n\n\t// block transefer from the address not on the controllers list.\n\tstd.TestSetOrigCaller(controlleraddr11)\n\tassertErr(t, faucet.Transfer(test1addr, 1000000))\n}\n\nfunc assertErr(t *testing.T, err string) {\n\tt.Helper()\n\n\tif err == \"\" {\n\t\tt.Logf(\"info: got err: %v\", err)\n\t\tt.Errorf(\"expected an error, got nil.\")\n\t}\n}\n\nfunc assertNoErr(t *testing.T, err string) {\n\tt.Helper()\n\tif err != \"\" {\n\t\tt.Errorf(\"got err: %v.\", err)\n\t}\n}\n\nfunc assertBalance(t *testing.T, addr std.Address, expectedBal int64) {\n\tt.Helper()\n\tbanker := std.GetBanker(std.BankerTypeReadonly)\n\tcoins := banker.GetCoins(addr)\n\tgot := coins.AmountOf(\"ugnot\")\n\n\tif expectedBal != got {\n\t\tt.Errorf(\"invalid balance: expected %d, got %d.\", expectedBal, got)\n\t}\n}\n"},{"name":"z0_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\t\"gno.land/r/gnoland/faucet\"\n)\n\n// mints ugnot to current realm\nfunc init() {\n\tfacuetaddr := std.DerivePkgAddr(\"gno.land/r/gnoland/faucet\")\n\tstd.TestIssueCoins(facuetaddr, std.Coins{{\"ugnot\", 200000000}})\n}\n\n// assert render with empty path and no controllers\nfunc main() {\n\tprintln(faucet.Render(\"\"))\n}\n\n// Output:\n// # Community Faucet.\n//\n// Status: active.\n// Balance: 200000000ugnot.\n// Total transfers: (in 0 times).\n//\n// Package address: g1ttrq7mp4zy6dssnmgyyktnn4hcj3ys8xhju0n7\n//\n// Admin: g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\n//\n// Controllers:\n//\n//\n//\n// Per request limit: 350000000ugnot\n"},{"name":"z1_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\t\"gno.land/r/gnoland/faucet\"\n)\n\n// mints ugnot to current realm\nfunc init() {\n\tfacuetaddr := std.DerivePkgAddr(\"gno.land/r/gnoland/faucet\")\n\tstd.TestIssueCoins(facuetaddr, std.Coins{{\"ugnot\", 200000000}})\n}\n\n// assert render with a path and no controllers\nfunc main() {\n\tprintln(faucet.Render(\"path\"))\n}\n\n// Output:\n// # Community Faucet.\n//\n// Status: active.\n// Balance: 200000000ugnot.\n// Total transfers: (in 0 times).\n//\n// Package address: g1ttrq7mp4zy6dssnmgyyktnn4hcj3ys8xhju0n7\n//\n// Admin: g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\n//\n// Controllers:\n//\n//\n//\n// Per request limit: 350000000ugnot\n"},{"name":"z2_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/gnoland/faucet\"\n)\n\n// mints ugnot to current realm\nfunc init() {\n\tfacuetaddr := std.DerivePkgAddr(\"gno.land/r/gnoland/faucet\")\n\tstd.TestIssueCoins(facuetaddr, std.Coins{{\"ugnot\", 200000000}})\n}\n\n// assert render with empty path and 2 controllers\nfunc main() {\n\tvar (\n\t\tadminaddr = std.Address(\"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\")\n\t\tcontrolleraddr1 = testutils.TestAddress(\"controller1\")\n\t\tcontrolleraddr2 = testutils.TestAddress(\"controller2\")\n\t)\n\tstd.TestSetOrigCaller(adminaddr)\n\terr := faucet.AdminAddController(controlleraddr1)\n\tif err != \"\" {\n\t\tpanic(err)\n\t}\n\terr = faucet.AdminAddController(controlleraddr2)\n\tif err != \"\" {\n\t\tpanic(err)\n\t}\n\tprintln(faucet.Render(\"\"))\n}\n\n// Output:\n// # Community Faucet.\n//\n// Status: active.\n// Balance: 200000000ugnot.\n// Total transfers: (in 0 times).\n//\n// Package address: g1ttrq7mp4zy6dssnmgyyktnn4hcj3ys8xhju0n7\n//\n// Admin: g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\n//\n// Controllers:\n//\n// g1vdhkuarjdakxcetjx9047h6lta047h6lsdacav g1vdhkuarjdakxcetjxf047h6lta047h6lnrev3v\n//\n// Per request limit: 350000000ugnot\n"},{"name":"z3_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/gnoland/faucet\"\n)\n\n// mints coints to current realm\nfunc init() {\n\tfacuetaddr := std.DerivePkgAddr(\"gno.land/r/gnoland/faucet\")\n\tstd.TestIssueCoins(facuetaddr, std.Coins{{\"ugnot\", 200000000}})\n}\n\n// assert render with 2 controllers and 2 transfers\nfunc main() {\n\tvar (\n\t\tadminaddr = std.Address(\"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\")\n\t\tcontrolleraddr1 = testutils.TestAddress(\"controller1\")\n\t\tcontrolleraddr2 = testutils.TestAddress(\"controller2\")\n\t\ttestaddr1 = testutils.TestAddress(\"test1\")\n\t\ttestaddr2 = testutils.TestAddress(\"test2\")\n\t)\n\tstd.TestSetOrigCaller(adminaddr)\n\terr := faucet.AdminAddController(controlleraddr1)\n\tif err != \"\" {\n\t\tpanic(err)\n\t}\n\terr = faucet.AdminAddController(controlleraddr2)\n\tif err != \"\" {\n\t\tpanic(err)\n\t}\n\tstd.TestSetOrigCaller(controlleraddr1)\n\terr = faucet.Transfer(testaddr1, 1000000)\n\tif err != \"\" {\n\t\tpanic(err)\n\t}\n\tstd.TestSetOrigCaller(controlleraddr2)\n\terr = faucet.Transfer(testaddr1, 2000000)\n\tif err != \"\" {\n\t\tpanic(err)\n\t}\n\tprintln(faucet.Render(\"\"))\n}\n\n// Output:\n// # Community Faucet.\n//\n// Status: active.\n// Balance: 197000000ugnot.\n// Total transfers: 3000000ugnot (in 2 times).\n//\n// Package address: g1ttrq7mp4zy6dssnmgyyktnn4hcj3ys8xhju0n7\n//\n// Admin: g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\n//\n// Controllers:\n//\n// g1vdhkuarjdakxcetjx9047h6lta047h6lsdacav g1vdhkuarjdakxcetjxf047h6lta047h6lnrev3v\n//\n// Per request limit: 350000000ugnot\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"ghverify","path":"gno.land/r/gnoland/ghverify","files":[{"name":"README.md","body":"# ghverify\n\nThis realm is intended to enable off chain gno address to github handle verification.\nThe steps are as follows:\n- A user calls `RequestVerification` and provides a github handle. This creates a new static oracle feed.\n- An off-chain agent controlled by the owner of this realm requests current feeds using the `GnorkleEntrypoint` function and provides a message of `\"request\"`\n- The agent receives the task information that includes the github handle and the gno address. It performs the verification step by checking whether this github user has the address in a github repository it controls.\n- The agent publishes the result of the verification by calling `GnorkleEntrypoint` with a message structured like: `\"ingest,\u003ctask id\u003e,\u003cverification status\u003e\"`. The verification status is `OK` if verification succeeded and any other value if it failed.\n- The oracle feed's ingester processes the verification and the handle to address mapping is written to the avl trees that exist as ghverify realm variables."},{"name":"contract.gno","body":"package ghverify\n\nimport (\n\t\"errors\"\n\t\"std\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/gnorkle/feeds/static\"\n\t\"gno.land/p/demo/gnorkle/gnorkle\"\n\t\"gno.land/p/demo/gnorkle/message\"\n)\n\nconst (\n\t// The agent should send this value if it has verified the github handle.\n\tverifiedResult = \"OK\"\n)\n\nvar (\n\townerAddress = std.GetOrigCaller()\n\toracle *gnorkle.Instance\n\tpostHandler postGnorkleMessageHandler\n\n\thandleToAddressMap = avl.NewTree()\n\taddressToHandleMap = avl.NewTree()\n)\n\nfunc init() {\n\toracle = gnorkle.NewInstance()\n\toracle.AddToWhitelist(\"\", []string{string(ownerAddress)})\n}\n\ntype postGnorkleMessageHandler struct{}\n\n// Handle does post processing after a message is ingested by the oracle feed. It extracts the value to realm\n// storage and removes the feed from the oracle.\nfunc (h postGnorkleMessageHandler) Handle(i *gnorkle.Instance, funcType message.FuncType, feed gnorkle.Feed) error {\n\tif funcType != message.FuncTypeIngest {\n\t\treturn nil\n\t}\n\n\tresult, _, consumable := feed.Value()\n\tif !consumable {\n\t\treturn nil\n\t}\n\n\t// The value is consumable, meaning the ingestion occurred, so we can remove the feed from the oracle\n\t// after saving it to realm storage.\n\tdefer oracle.RemoveFeed(feed.ID())\n\n\t// Couldn't verify; nothing to do.\n\tif result.String != verifiedResult {\n\t\treturn nil\n\t}\n\n\tfeedTasks := feed.Tasks()\n\tif len(feedTasks) != 1 {\n\t\treturn errors.New(\"expected feed to have exactly one task\")\n\t}\n\n\ttask, ok := feedTasks[0].(*verificationTask)\n\tif !ok {\n\t\treturn errors.New(\"expected ghverify task\")\n\t}\n\n\thandleToAddressMap.Set(task.githubHandle, task.gnoAddress)\n\taddressToHandleMap.Set(task.gnoAddress, task.githubHandle)\n\treturn nil\n}\n\n// RequestVerification creates a new static feed with a single task that will\n// instruct an agent to verify the github handle / gno address pair.\nfunc RequestVerification(githubHandle string) {\n\tgnoAddress := string(std.GetOrigCaller())\n\tif err := oracle.AddFeeds(\n\t\tstatic.NewSingleValueFeed(\n\t\t\tgnoAddress,\n\t\t\t\"string\",\n\t\t\t\u0026verificationTask{\n\t\t\t\tgnoAddress: gnoAddress,\n\t\t\t\tgithubHandle: githubHandle,\n\t\t\t},\n\t\t),\n\t); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// GnorkleEntrypoint is the entrypoint to the gnorkle oracle handler.\nfunc GnorkleEntrypoint(message string) string {\n\tresult, err := oracle.HandleMessage(message, postHandler)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\treturn result\n}\n\n// SetOwner transfers ownership of the contract to the given address.\nfunc SetOwner(owner std.Address) {\n\tif ownerAddress != std.GetOrigCaller() {\n\t\tpanic(\"only the owner can set a new owner\")\n\t}\n\n\townerAddress = owner\n\n\t// In the context of this contract, the owner is the only one that can\n\t// add new feeds to the oracle.\n\toracle.ClearWhitelist(\"\")\n\toracle.AddToWhitelist(\"\", []string{string(ownerAddress)})\n}\n\n// GetHandleByAddress returns the github handle associated with the given gno address.\nfunc GetHandleByAddress(address string) string {\n\tif value, ok := addressToHandleMap.Get(address); ok {\n\t\treturn value.(string)\n\t}\n\n\treturn \"\"\n}\n\n// GetAddressByHandle returns the gno address associated with the given github handle.\nfunc GetAddressByHandle(handle string) string {\n\tif value, ok := handleToAddressMap.Get(handle); ok {\n\t\treturn value.(string)\n\t}\n\n\treturn \"\"\n}\n\n// Render returns a json object string will all verified handle -\u003e address mappings.\nfunc Render(_ string) string {\n\tresult := \"{\"\n\tvar appendComma bool\n\thandleToAddressMap.Iterate(\"\", \"\", func(handle string, address interface{}) bool {\n\t\tif appendComma {\n\t\t\tresult += \",\"\n\t\t}\n\n\t\tresult += `\"` + handle + `\": \"` + address.(string) + `\"`\n\t\tappendComma = true\n\n\t\treturn true\n\t})\n\n\treturn result + \"}\"\n}\n"},{"name":"contract_test.gno","body":"package ghverify\n\nimport (\n\t\"std\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/testutils\"\n)\n\nfunc TestVerificationLifecycle(t *testing.T) {\n\tdefaultAddress := std.GetOrigCaller()\n\tuserAddress := std.Address(testutils.TestAddress(\"user\"))\n\n\t// Verify request returns no feeds.\n\tresult := GnorkleEntrypoint(\"request\")\n\tif result != \"[]\" {\n\t\tt.Fatalf(\"expected empty request result, got %s\", result)\n\t}\n\n\t// Make a verification request with the created user.\n\tstd.TestSetOrigCaller(userAddress)\n\tRequestVerification(\"deelawn\")\n\n\t// A subsequent request from the same address should panic because there is\n\t// already a feed with an ID of this user's address.\n\tvar errMsg string\n\tfunc() {\n\t\tdefer func() {\n\t\t\tif r := recover(); r != nil {\n\t\t\t\terrMsg = r.(error).Error()\n\t\t\t}\n\t\t}()\n\t\tRequestVerification(\"deelawn\")\n\t}()\n\tif errMsg != \"feed already exists\" {\n\t\tt.Fatalf(\"expected feed already exists, got %s\", errMsg)\n\t}\n\n\t// Verify the request returns no feeds for this non-whitelisted user.\n\tresult = GnorkleEntrypoint(\"request\")\n\tif result != \"[]\" {\n\t\tt.Fatalf(\"expected empty request result, got %s\", result)\n\t}\n\n\t// Set the caller back to the whitelisted user and verify that the feed data\n\t// returned matches what should have been created by the `RequestVerification`\n\t// invocation.\n\tstd.TestSetOrigCaller(defaultAddress)\n\tresult = GnorkleEntrypoint(\"request\")\n\texpResult := `[{\"id\":\"` + string(userAddress) + `\",\"type\":\"0\",\"value_type\":\"string\",\"tasks\":[{\"gno_address\":\"` +\n\t\tstring(userAddress) + `\",\"github_handle\":\"deelawn\"}]}]`\n\tif result != expResult {\n\t\tt.Fatalf(\"expected request result %s, got %s\", expResult, result)\n\t}\n\n\t// Try to trigger feed ingestion from the non-authorized user.\n\tstd.TestSetOrigCaller(userAddress)\n\tfunc() {\n\t\tdefer func() {\n\t\t\tif r := recover(); r != nil {\n\t\t\t\terrMsg = r.(error).Error()\n\t\t\t}\n\t\t}()\n\t\tGnorkleEntrypoint(\"ingest,\" + string(userAddress) + \",OK\")\n\t}()\n\tif errMsg != \"caller not whitelisted\" {\n\t\tt.Fatalf(\"expected caller not whitelisted, got %s\", errMsg)\n\t}\n\n\t// Set the caller back to the whitelisted user and transfer contract ownership.\n\tstd.TestSetOrigCaller(defaultAddress)\n\tSetOwner(userAddress)\n\n\t// Now trigger the feed ingestion from the user and new owner and only whitelisted address.\n\tstd.TestSetOrigCaller(userAddress)\n\tGnorkleEntrypoint(\"ingest,\" + string(userAddress) + \",OK\")\n\n\t// Verify the ingestion autocommitted the value and triggered the post handler.\n\tdata := Render(\"\")\n\texpResult = `{\"deelawn\": \"` + string(userAddress) + `\"}`\n\tif data != expResult {\n\t\tt.Fatalf(\"expected render data %s, got %s\", expResult, data)\n\t}\n\n\t// Finally make sure the feed was cleaned up after the data was committed.\n\tresult = GnorkleEntrypoint(\"request\")\n\tif result != \"[]\" {\n\t\tt.Fatalf(\"expected empty request result, got %s\", result)\n\t}\n\n\t// Check that the accessor functions are working as expected.\n\tif handle := GetHandleByAddress(string(userAddress)); handle != \"deelawn\" {\n\t\tt.Fatalf(\"expected deelawn, got %s\", handle)\n\t}\n\tif address := GetAddressByHandle(\"deelawn\"); address != string(userAddress) {\n\t\tt.Fatalf(\"expected %s, got %s\", string(userAddress), address)\n\t}\n}\n"},{"name":"task.gno","body":"package ghverify\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n)\n\ntype verificationTask struct {\n\tgnoAddress string\n\tgithubHandle string\n}\n\n// MarshalJSON marshals the task contents to JSON.\nfunc (t *verificationTask) MarshalJSON() ([]byte, error) {\n\tbuf := new(bytes.Buffer)\n\tw := bufio.NewWriter(buf)\n\n\tw.Write(\n\t\t[]byte(`{\"gno_address\":\"` + t.gnoAddress + `\",\"github_handle\":\"` + t.githubHandle + `\"}`),\n\t)\n\n\tw.Flush()\n\treturn buf.Bytes(), nil\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"home","path":"gno.land/r/gnoland/home","files":[{"name":"home.gno","body":"package home\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/ownable\"\n\t\"gno.land/p/demo/ufmt\"\n\t\"gno.land/p/demo/ui\"\n\tblog \"gno.land/r/gnoland/blog\"\n\tevents \"gno.land/r/gnoland/events\"\n)\n\n// XXX: p/demo/ui API is crappy, we need to make it more idiomatic\n// XXX: use an updatable block system to update content from a DAO\n// XXX: var blocks avl.Tree\n\nvar (\n\toverride string\n\tadmin = ownable.NewWithAddress(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\") // @moul\n)\n\nfunc Render(_ string) string {\n\tif override != \"\" {\n\t\treturn override\n\t}\n\n\tdom := ui.DOM{Prefix: \"r/gnoland/home:\"}\n\tdom.Title = \"Welcome to gno.land\"\n\tdom.Classes = []string{\"gno-tmpl-section\"}\n\n\t// body\n\tdom.Body.Append(introSection()...)\n\n\tdom.Body.Append(ui.Jumbotron(discoverLinks()))\n\n\tdom.Body.Append(\n\t\tui.Columns{3, []ui.Element{\n\t\t\tlastBlogposts(4),\n\t\t\tupcomingEvents(),\n\t\t\tlastContributions(4),\n\t\t}},\n\t)\n\n\tdom.Body.Append(ui.HR{})\n\tdom.Body.Append(playgroundSection()...)\n\tdom.Body.Append(ui.HR{})\n\tdom.Body.Append(packageStaffPicks()...)\n\tdom.Body.Append(ui.HR{})\n\tdom.Body.Append(worxDAO()...)\n\tdom.Body.Append(ui.HR{})\n\t// footer\n\tdom.Footer.Append(\n\t\tui.Columns{2, []ui.Element{\n\t\t\tsocialLinks(),\n\t\t\tquoteOfTheBlock(),\n\t\t}},\n\t)\n\n\t// Testnet disclaimer\n\tdom.Footer.Append(\n\t\tui.HR{},\n\t\tui.Bold(\"This is a testnet.\"),\n\t\tui.Text(\"Package names are not guaranteed to be available for production.\"),\n\t)\n\n\treturn dom.String()\n}\n\nfunc lastBlogposts(limit int) ui.Element {\n\tposts := blog.RenderLastPostsWidget(limit)\n\treturn ui.Element{\n\t\tui.H3(\"[Latest Blogposts](/r/gnoland/blog)\"),\n\t\tui.Text(posts),\n\t}\n}\n\nfunc lastContributions(limit int) ui.Element {\n\treturn ui.Element{\n\t\tui.H3(\"Latest Contributions\"),\n\t\t// TODO: import r/gh to\n\t\tui.Link{Text: \"View latest contributions\", URL: \"https://github.com/gnolang/gno/pulls\"},\n\t}\n}\n\nfunc upcomingEvents() ui.Element {\n\tout, _ := events.RenderEventWidget(events.MaxWidgetSize)\n\treturn ui.Element{\n\t\tui.H3(\"[Latest Events](/r/gnoland/events)\"),\n\t\tui.Text(out),\n\t}\n}\n\nfunc introSection() ui.Element {\n\treturn ui.Element{\n\t\tui.H3(\"We’re building gno.land, set to become the leading open-source smart contract platform, using Gno, an interpreted and fully deterministic variation of the Go programming language for succinct and composable smart contracts.\"),\n\t\tui.Paragraph(\"With transparent and timeless code, gno.land is the next generation of smart contract platforms, serving as the “GitHub” of the ecosystem, with realms built using fully transparent, auditable code that anyone can inspect and reuse.\"),\n\t\tui.Paragraph(\"Intuitive and easy to use, gno.land lowers the barrier to web3 and makes censorship-resistant platforms accessible to everyone. If you want to help lay the foundations of a fairer and freer world, join us today.\"),\n\t}\n}\n\nfunc worxDAO() ui.Element {\n\t// WorxDAO\n\t// XXX(manfred): please, let me finish a v0, then we can iterate\n\t// highest level == highest responsibility\n\t// teams are responsible for components they don't owne\n\t// flag : realm maintainers VS facilitators\n\t// teams\n\t// committee of trustees to create the directory\n\t// each directory is a name, has a parent and have groups\n\t// homepage team - blocks aggregating events\n\t// XXX: TODO\n\t/*`\n\t# Directory\n\n\t* gno.land (owned by group)\n\t *\n\t* gnovm\n\t * gnolang (language)\n\t * gnovm\n\t - current challenges / concerns / issues\n\t* tm2\n\t * amino\n\t *\n\n\t## Contributors\n\t``*/\n\treturn ui.Element{\n\t\tui.H3(\"Contributions (WorxDAO \u0026 GoR)\"),\n\t\t// TODO: GoR dashboard + WorxDAO topics\n\t\tui.Text(`coming soon`),\n\t}\n}\n\nfunc quoteOfTheBlock() ui.Element {\n\tquotes := []string{\n\t\t\"Gno is for Truth.\",\n\t\t\"Gno is for Social Coordination.\",\n\t\t\"Gno is _not only_ for DeFi.\",\n\t\t\"Now, you Gno.\",\n\t\t\"Come for the Go, Stay for the Gno.\",\n\t}\n\theight := std.GetHeight()\n\tidx := int(height) % len(quotes)\n\tqotb := quotes[idx]\n\n\treturn ui.Element{\n\t\tui.H3(ufmt.Sprintf(\"Quote of the ~Day~ Block#%d\", height)),\n\t\tui.Quote(qotb),\n\t}\n}\n\nfunc socialLinks() ui.Element {\n\treturn ui.Element{\n\t\tui.H3(\"Socials\"),\n\t\tui.BulletList{\n\t\t\t// XXX: improve UI to support a nice GO api for such links\n\t\t\tui.Text(\"Check out our [community projects](https://github.com/gnolang/awesome-gno)\"),\n\t\t\tui.Text(\"![Discord](static/img/ico-discord.svg) [Discord](https://discord.gg/S8nKUqwkPn)\"),\n\t\t\tui.Text(\"![Twitter](static/img/ico-twitter.svg) [Twitter](https://twitter.com/_gnoland)\"),\n\t\t\tui.Text(\"![Youtube](static/img/ico-youtube.svg) [Youtube](https://www.youtube.com/@_gnoland)\"),\n\t\t\tui.Text(\"![Telegram](static/img/ico-telegram.svg) [Telegram](https://t.me/gnoland)\"),\n\t\t},\n\t}\n}\n\nfunc playgroundSection() ui.Element {\n\treturn ui.Element{\n\t\tui.H3(\"[Gno Playground](https://play.gno.land)\"),\n\t\tui.Paragraph(`Gno Playground is a web application designed for building, running, testing, and interacting\nwith your Gno code, enhancing your understanding of the Gno language. With Gno Playground, you can share your code,\nexecute tests, deploy your realms and packages to gno.land, and explore a multitude of other features.`),\n\t\tui.Paragraph(\"Experience the convenience of code sharing and rapid experimentation with [Gno Playground](https://play.gno.land).\"),\n\t}\n}\n\nfunc packageStaffPicks() ui.Element {\n\t// XXX: make it modifiable from a DAO\n\treturn ui.Element{\n\t\tui.H3(\"Explore New Packages and Realms\"),\n\t\tui.Columns{\n\t\t\t3,\n\t\t\t[]ui.Element{\n\t\t\t\t{\n\t\t\t\t\tui.H4(\"[r/gnoland](https://github.com/gnolang/gno/tree/master/examples/gno.land/r/gnoland)\"),\n\t\t\t\t\tui.BulletList{\n\t\t\t\t\t\tui.Link{URL: \"r/gnoland/blog\"},\n\t\t\t\t\t\tui.Link{URL: \"r/gnoland/dao\"},\n\t\t\t\t\t\tui.Link{URL: \"r/gnoland/faucet\"},\n\t\t\t\t\t\tui.Link{URL: \"r/gnoland/home\"},\n\t\t\t\t\t\tui.Link{URL: \"r/gnoland/pages\"},\n\t\t\t\t\t},\n\t\t\t\t\tui.H4(\"[r/sys](https://github.com/gnolang/gno/tree/master/examples/gno.land/r/sys)\"),\n\t\t\t\t\tui.BulletList{\n\t\t\t\t\t\tui.Link{URL: \"r/sys/names\"},\n\t\t\t\t\t\tui.Link{URL: \"r/sys/rewards\"},\n\t\t\t\t\t\tui.Link{URL: \"r/sys/validators\"},\n\t\t\t\t\t},\n\t\t\t\t}, {\n\t\t\t\t\tui.H4(\"[r/demo](https://github.com/gnolang/gno/tree/master/examples/gno.land/r/demo)\"),\n\t\t\t\t\tui.BulletList{\n\t\t\t\t\t\tui.Link{URL: \"r/demo/boards\"},\n\t\t\t\t\t\tui.Link{URL: \"r/demo/users\"},\n\t\t\t\t\t\tui.Link{URL: \"r/demo/banktest\"},\n\t\t\t\t\t\tui.Link{URL: \"r/demo/foo20\"},\n\t\t\t\t\t\tui.Link{URL: \"r/demo/foo721\"},\n\t\t\t\t\t\tui.Link{URL: \"r/demo/microblog\"},\n\t\t\t\t\t\tui.Link{URL: \"r/demo/nft\"},\n\t\t\t\t\t\tui.Link{URL: \"r/demo/types\"},\n\t\t\t\t\t\tui.Link{URL: \"r/demo/art/gnoface\"},\n\t\t\t\t\t\tui.Link{URL: \"r/demo/art/millipede\"},\n\t\t\t\t\t\tui.Link{URL: \"r/demo/groups\"},\n\t\t\t\t\t\tui.Text(\"...\"),\n\t\t\t\t\t},\n\t\t\t\t}, {\n\t\t\t\t\tui.H4(\"[p/demo](https://github.com/gnolang/gno/tree/master/examples/gno.land/p/demo)\"),\n\t\t\t\t\tui.BulletList{\n\t\t\t\t\t\tui.Link{URL: \"p/demo/avl\"},\n\t\t\t\t\t\tui.Link{URL: \"p/demo/blog\"},\n\t\t\t\t\t\tui.Link{URL: \"p/demo/ui\"},\n\t\t\t\t\t\tui.Link{URL: \"p/demo/ufmt\"},\n\t\t\t\t\t\tui.Link{URL: \"p/demo/merkle\"},\n\t\t\t\t\t\tui.Link{URL: \"p/demo/bf\"},\n\t\t\t\t\t\tui.Link{URL: \"p/demo/flow\"},\n\t\t\t\t\t\tui.Link{URL: \"p/demo/gnode\"},\n\t\t\t\t\t\tui.Link{URL: \"p/demo/grc/grc20\"},\n\t\t\t\t\t\tui.Link{URL: \"p/demo/grc/grc721\"},\n\t\t\t\t\t\tui.Text(\"...\"),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n}\n\nfunc discoverLinks() ui.Element {\n\treturn ui.Element{\n\t\tui.Text(`\u003cdiv class=\"columns-3\"\u003e\n\u003cdiv class=\"column\"\u003e\n\n### Learn about gno.land\n\n- [About](/about)\n- [GitHub](https://github.com/gnolang)\n- [Blog](/blog)\n- [Events](/events)\n- Tokenomics (soon)\n- [Partners, Fund, Grants](/partners)\n- [Explore the Ecosystem](/ecosystem)\n- [Careers](https://jobs.lever.co/allinbits?department=Gno.land)\n\n\u003c/div\u003e\u003c!-- end column--\u003e\n\n\u003cdiv class=\"column\"\u003e\n\n### Build with Gno\n\n- [Write Gno in the browser](https://play.gno.land)\n- [Read about the Gno Language](/gnolang)\n- [Visit the official documentation](https://docs.gno.land)\n- [Gno by Example](https://gno-by-example.com/)\n- [Efficient local development for Gno](https://docs.gno.land/gno-tooling/cli/gno-tooling-gnodev)\n- [Get testnet GNOTs](https://faucet.gno.land)\n\n\u003c/div\u003e\u003c!-- end column--\u003e\n\u003cdiv class=\"column\"\u003e\n\n### Explore the universe\n\n- [Discover demo packages](https://github.com/gnolang/gno/tree/master/examples)\n- [Gnoscan](https://gnoscan.io)\n- [Portal Loop](https://docs.gno.land/concepts/portal-loop)\n- [Testnet 4](https://test4.gno.land/) (Launched July 2024!)\n- [Testnet 3](https://test3.gno.land/) (archive)\n- [Testnet 2](https://test2.gno.land/) (archive)\n- Testnet Faucet Hub (soon)\n\n\u003c/div\u003e\u003c!-- end column--\u003e\n\u003c/div\u003e\u003c!-- end columns-3--\u003e`),\n\t}\n}\n\nfunc AdminSetOverride(content string) {\n\tadmin.AssertCallerIsOwner()\n\toverride = content\n}\n\nfunc AdminTransferOwnership(newAdmin std.Address) {\n\tadmin.AssertCallerIsOwner()\n\tadmin.TransferOwnership(newAdmin)\n}\n"},{"name":"home_filetest.gno","body":"package main\n\nimport \"gno.land/r/gnoland/home\"\n\nfunc main() {\n\tprintln(home.Render(\"\"))\n}\n\n// Output:\n// \u003cmain class='gno-tmpl-section'\u003e\n//\n// # Welcome to gno.land\n//\n// ### We’re building gno.land, set to become the leading open-source smart contract platform, using Gno, an interpreted and fully deterministic variation of the Go programming language for succinct and composable smart contracts.\n//\n//\n// With transparent and timeless code, gno.land is the next generation of smart contract platforms, serving as the “GitHub” of the ecosystem, with realms built using fully transparent, auditable code that anyone can inspect and reuse.\n//\n//\n// Intuitive and easy to use, gno.land lowers the barrier to web3 and makes censorship-resistant platforms accessible to everyone. If you want to help lay the foundations of a fairer and freer world, join us today.\n//\n// \u003cdiv class=\"jumbotron\"\u003e\n//\n// \u003cdiv class=\"columns-3\"\u003e\n// \u003cdiv class=\"column\"\u003e\n//\n// ### Learn about gno.land\n//\n// - [About](/about)\n// - [GitHub](https://github.com/gnolang)\n// - [Blog](/blog)\n// - [Events](/events)\n// - Tokenomics (soon)\n// - [Partners, Fund, Grants](/partners)\n// - [Explore the Ecosystem](/ecosystem)\n// - [Careers](https://jobs.lever.co/allinbits?department=Gno.land)\n//\n// \u003c/div\u003e\u003c!-- end column--\u003e\n//\n// \u003cdiv class=\"column\"\u003e\n//\n// ### Build with Gno\n//\n// - [Write Gno in the browser](https://play.gno.land)\n// - [Read about the Gno Language](/gnolang)\n// - [Visit the official documentation](https://docs.gno.land)\n// - [Gno by Example](https://gno-by-example.com/)\n// - [Efficient local development for Gno](https://docs.gno.land/gno-tooling/cli/gno-tooling-gnodev)\n// - [Get testnet GNOTs](https://faucet.gno.land)\n//\n// \u003c/div\u003e\u003c!-- end column--\u003e\n// \u003cdiv class=\"column\"\u003e\n//\n// ### Explore the universe\n//\n// - [Discover demo packages](https://github.com/gnolang/gno/tree/master/examples)\n// - [Gnoscan](https://gnoscan.io)\n// - [Portal Loop](https://docs.gno.land/concepts/portal-loop)\n// - [Testnet 4](https://test4.gno.land/) (Launched July 2024!)\n// - [Testnet 3](https://test3.gno.land/) (archive)\n// - [Testnet 2](https://test2.gno.land/) (archive)\n// - Testnet Faucet Hub (soon)\n//\n// \u003c/div\u003e\u003c!-- end column--\u003e\n// \u003c/div\u003e\u003c!-- end columns-3--\u003e\n// \u003c/div\u003e\u003c!-- /jumbotron --\u003e\n//\n// \u003cdiv class=\"columns-3\"\u003e\n// \u003cdiv class=\"column\"\u003e\n//\n// ### [Latest Blogposts](/r/gnoland/blog)\n//\n// No posts.\n// \u003c/div\u003e\u003c!-- /column--\u003e\n// \u003cdiv class=\"column\"\u003e\n//\n// ### [Latest Events](/r/gnoland/events)\n//\n// No events.\n// \u003c/div\u003e\u003c!-- /column--\u003e\n// \u003cdiv class=\"column\"\u003e\n//\n// ### Latest Contributions\n//\n// [View latest contributions](https://github.com/gnolang/gno/pulls)\n// \u003c/div\u003e\u003c!-- /column--\u003e\n// \u003c/div\u003e\u003c!-- /columns-3 --\u003e\n//\n//\n// ---\n//\n// ### [Gno Playground](https://play.gno.land)\n//\n//\n// Gno Playground is a web application designed for building, running, testing, and interacting\n// with your Gno code, enhancing your understanding of the Gno language. With Gno Playground, you can share your code,\n// execute tests, deploy your realms and packages to gno.land, and explore a multitude of other features.\n//\n//\n// Experience the convenience of code sharing and rapid experimentation with [Gno Playground](https://play.gno.land).\n//\n//\n// ---\n//\n// ### Explore New Packages and Realms\n//\n// \u003cdiv class=\"columns-3\"\u003e\n// \u003cdiv class=\"column\"\u003e\n//\n// #### [r/gnoland](https://github.com/gnolang/gno/tree/master/examples/gno.land/r/gnoland)\n//\n// - [r/gnoland/blog](r/gnoland/blog)\n// - [r/gnoland/dao](r/gnoland/dao)\n// - [r/gnoland/faucet](r/gnoland/faucet)\n// - [r/gnoland/home](r/gnoland/home)\n// - [r/gnoland/pages](r/gnoland/pages)\n//\n// #### [r/sys](https://github.com/gnolang/gno/tree/master/examples/gno.land/r/sys)\n//\n// - [r/sys/names](r/sys/names)\n// - [r/sys/rewards](r/sys/rewards)\n// - [r/sys/validators](r/sys/validators)\n//\n// \u003c/div\u003e\u003c!-- /column--\u003e\n// \u003cdiv class=\"column\"\u003e\n//\n// #### [r/demo](https://github.com/gnolang/gno/tree/master/examples/gno.land/r/demo)\n//\n// - [r/demo/boards](r/demo/boards)\n// - [r/demo/users](r/demo/users)\n// - [r/demo/banktest](r/demo/banktest)\n// - [r/demo/foo20](r/demo/foo20)\n// - [r/demo/foo721](r/demo/foo721)\n// - [r/demo/microblog](r/demo/microblog)\n// - [r/demo/nft](r/demo/nft)\n// - [r/demo/types](r/demo/types)\n// - [r/demo/art/gnoface](r/demo/art/gnoface)\n// - [r/demo/art/millipede](r/demo/art/millipede)\n// - [r/demo/groups](r/demo/groups)\n// - ...\n//\n// \u003c/div\u003e\u003c!-- /column--\u003e\n// \u003cdiv class=\"column\"\u003e\n//\n// #### [p/demo](https://github.com/gnolang/gno/tree/master/examples/gno.land/p/demo)\n//\n// - [p/demo/avl](p/demo/avl)\n// - [p/demo/blog](p/demo/blog)\n// - [p/demo/ui](p/demo/ui)\n// - [p/demo/ufmt](p/demo/ufmt)\n// - [p/demo/merkle](p/demo/merkle)\n// - [p/demo/bf](p/demo/bf)\n// - [p/demo/flow](p/demo/flow)\n// - [p/demo/gnode](p/demo/gnode)\n// - [p/demo/grc/grc20](p/demo/grc/grc20)\n// - [p/demo/grc/grc721](p/demo/grc/grc721)\n// - ...\n//\n// \u003c/div\u003e\u003c!-- /column--\u003e\n// \u003c/div\u003e\u003c!-- /columns-3 --\u003e\n//\n//\n// ---\n//\n// ### Contributions (WorxDAO \u0026 GoR)\n//\n// coming soon\n//\n// ---\n//\n//\n// \u003cdiv class=\"columns-2\"\u003e\n// \u003cdiv class=\"column\"\u003e\n//\n// ### Socials\n//\n// - Check out our [community projects](https://github.com/gnolang/awesome-gno)\n// - ![Discord](static/img/ico-discord.svg) [Discord](https://discord.gg/S8nKUqwkPn)\n// - ![Twitter](static/img/ico-twitter.svg) [Twitter](https://twitter.com/_gnoland)\n// - ![Youtube](static/img/ico-youtube.svg) [Youtube](https://www.youtube.com/@_gnoland)\n// - ![Telegram](static/img/ico-telegram.svg) [Telegram](https://t.me/gnoland)\n//\n// \u003c/div\u003e\u003c!-- /column--\u003e\n// \u003cdiv class=\"column\"\u003e\n//\n// ### Quote of the ~Day~ Block#123\n//\n// \u003e Now, you Gno.\n//\n// \u003c/div\u003e\u003c!-- /column--\u003e\n// \u003c/div\u003e\u003c!-- /columns-2 --\u003e\n//\n//\n// ---\n//\n// **This is a testnet.**\n// Package names are not guaranteed to be available for production.\n//\n// \u003c/main\u003e\n"},{"name":"overide_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/gnoland/home\"\n)\n\nfunc main() {\n\tstd.TestSetOrigCaller(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\")\n\thome.AdminSetOverride(\"Hello World!\")\n\tprintln(home.Render(\"\"))\n\thome.AdminTransferOwnership(testutils.TestAddress(\"newAdmin\"))\n\tdefer func() {\n\t\tr := recover()\n\t\tprintln(\"r: \", r)\n\t}()\n\thome.AdminSetOverride(\"Not admin anymore\")\n}\n\n// Output:\n// Hello World!\n// r: ownable: caller is not owner\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"monit","path":"gno.land/r/gnoland/monit","files":[{"name":"monit.gno","body":"// Package monit links a monitoring system with the chain in both directions.\n//\n// The agent will periodically call Incr() and verify that the value is always\n// higher than the previously known one. The contract will store the last update\n// time and use it to detect whether or not the monitoring agent is functioning\n// correctly.\npackage monit\n\nimport (\n\t\"std\"\n\t\"time\"\n\n\t\"gno.land/p/demo/ownable\"\n\t\"gno.land/p/demo/ufmt\"\n\t\"gno.land/p/demo/watchdog\"\n)\n\nvar (\n\tcounter int\n\tlastUpdate time.Time\n\tlastCaller std.Address\n\twd = watchdog.Watchdog{Duration: 5 * time.Minute}\n\towner = ownable.New() // TODO: replace with -\u003e ownable.NewWithAddress...\n\twatchdogDuration = 5 * time.Minute\n)\n\n// Incr increments the counter and informs the watchdog that we're alive.\n// This function can be called by anyone.\nfunc Incr() int {\n\tcounter++\n\tlastUpdate = time.Now()\n\tlastCaller = std.PrevRealm().Addr()\n\twd.Alive()\n\treturn counter\n}\n\n// Reset resets the realm state.\n// This function can only be called by the admin.\nfunc Reset() {\n\tif owner.CallerIsOwner() != nil { // TODO: replace with owner.AssertCallerIsOwner\n\t\tpanic(\"unauthorized\")\n\t}\n\tcounter = 0\n\tlastCaller = std.PrevRealm().Addr()\n\tlastUpdate = time.Now()\n\twd = watchdog.Watchdog{Duration: 5 * time.Minute}\n}\n\nfunc Render(_ string) string {\n\tstatus := wd.Status()\n\treturn ufmt.Sprintf(\n\t\t\"counter=%d\\nlast update=%s\\nlast caller=%s\\nstatus=%s\",\n\t\tcounter, lastUpdate, lastCaller, status,\n\t)\n}\n\n// TransferOwnership transfers ownership to a new owner. This is a proxy to\n// ownable.Ownable.TransferOwnership.\nfunc TransferOwnership(newOwner std.Address) { owner.TransferOwnership(newOwner) }\n"},{"name":"monit_test.gno","body":"package monit\n\nimport (\n\t\"testing\"\n\n\t\"gno.land/p/demo/uassert\"\n)\n\nfunc TestPackage(t *testing.T) {\n\t// initial state, watchdog is KO.\n\t{\n\t\texpected := `counter=0\nlast update=0001-01-01 00:00:00 +0000 UTC\nlast caller=\nstatus=KO`\n\t\tgot := Render(\"\")\n\t\tuassert.Equal(t, expected, got)\n\t}\n\n\t// call Incr(), watchdog is OK.\n\tIncr()\n\tIncr()\n\tIncr()\n\t{\n\t\texpected := `counter=3\nlast update=2009-02-13 23:31:30 +0000 UTC m=+1234567890.000000001\nlast caller=g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm\nstatus=OK`\n\t\tgot := Render(\"\")\n\t\tuassert.Equal(t, expected, got)\n\t}\n\n\t/* XXX: improve tests once we've the missing std.TestSkipTime feature\n\t\t// wait 1h, watchdog is KO.\n\t\tuse std.TestSkipTime(time.Hour)\n\t\t{\n\t\t\texpected := `counter=3\n\tlast update=2009-02-13 22:31:30 +0000 UTC m=+1234564290.000000001\n\tlast caller=g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm\n\tstatus=KO`\n\t\t\tgot := Render(\"\")\n\t\t\tuassert.Equal(t, expected, got)\n\t\t}\n\n\t\t// call Incr(), watchdog is OK.\n\t\tIncr()\n\t\t{\n\t\t\texpected := `counter=4\n\tlast update=2009-02-13 23:31:30 +0000 UTC m=+1234567890.000000001\n\tlast caller=g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm\n\tstatus=OK`\n\t\t\tgot := Render(\"\")\n\t\t\tuassert.Equal(t, expected, got)\n\t\t}\n\t*/\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"gnopages","path":"gno.land/r/gnoland/pages","files":[{"name":"admin.gno","body":"package gnopages\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/avl\"\n)\n\nvar (\n\tadminAddr std.Address\n\tmoderatorList avl.Tree\n\tinPause bool\n)\n\nfunc init() {\n\t// adminAddr = std.GetOrigCaller() // FIXME: find a way to use this from the main's genesis.\n\tadminAddr = \"g1manfred47kzduec920z88wfr64ylksmdcedlf5\" // @moul\n}\n\nfunc AdminSetAdminAddr(addr std.Address) {\n\tassertIsAdmin()\n\tadminAddr = addr\n}\n\nfunc AdminSetInPause(state bool) {\n\tassertIsAdmin()\n\tinPause = state\n}\n\nfunc AdminAddModerator(addr std.Address) {\n\tassertIsAdmin()\n\tmoderatorList.Set(addr.String(), true)\n}\n\nfunc AdminRemoveModerator(addr std.Address) {\n\tassertIsAdmin()\n\tmoderatorList.Set(addr.String(), false) // XXX: delete instead?\n}\n\nfunc ModAddPost(slug, title, body, publicationDate, authors, tags string) {\n\tassertIsModerator()\n\n\tcaller := std.GetOrigCaller()\n\ttagList := strings.Split(tags, \",\")\n\tauthorList := strings.Split(authors, \",\")\n\n\terr := b.NewPost(caller, slug, title, body, publicationDate, authorList, tagList)\n\tcheckErr(err)\n}\n\nfunc ModEditPost(slug, title, body, publicationDate, authors, tags string) {\n\tassertIsModerator()\n\n\ttagList := strings.Split(tags, \",\")\n\tauthorList := strings.Split(authors, \",\")\n\n\terr := b.GetPost(slug).Update(title, body, publicationDate, authorList, tagList)\n\tcheckErr(err)\n}\n\nfunc isAdmin(addr std.Address) bool {\n\treturn addr == adminAddr\n}\n\nfunc isModerator(addr std.Address) bool {\n\t_, found := moderatorList.Get(addr.String())\n\treturn found\n}\n\nfunc assertIsAdmin() {\n\tcaller := std.GetOrigCaller()\n\tif !isAdmin(caller) {\n\t\tpanic(\"access restricted.\")\n\t}\n}\n\nfunc assertIsModerator() {\n\tcaller := std.GetOrigCaller()\n\tif isAdmin(caller) || isModerator(caller) {\n\t\treturn\n\t}\n\tpanic(\"access restricted\")\n}\n\nfunc assertNotInPause() {\n\tif inPause {\n\t\tpanic(\"access restricted (pause)\")\n\t}\n}\n"},{"name":"page_about.gno","body":"package gnopages\n\nfunc init() {\n\tpath := \"about\"\n\ttitle := \"Gno.land Is A Platform To Write Smart Contracts In Gno\"\n\t// XXX: description := \"On gno.land, developers write smart contracts and other blockchain apps using Gno without learning a language that’s exclusive to a single ecosystem.\"\n\tbody := `\nGno.land is a next-generation smart contract platform using Gno, an interpreted version of the general-purpose Go\nprogramming language. On gno.land, smart contracts can be uploaded on-chain only by publishing their full source code,\nmaking it trivial to verify the contract or fork it into an improved version. With a system to publish reusable code \nlibraries on-chain, gno.land serves as the “GitHub” of the ecosystem, with realms built using fully transparent, \nauditable code that anyone can inspect and reuse.\n\nGno.land addresses many pressing issues in the blockchain space, starting with the ease of use and intuitiveness of\nsmart contract platforms. Developers can write smart contracts without having to learn a new language that’s exclusive \nto a single ecosystem or limited by design. Go developers can easily port their existing web apps to gno.land or build\nnew ones from scratch, making web3 vastly more accessible.\n\nSecured by Proof of Contribution (PoC), a DAO-managed Proof-of-Authority consensus mechanism, gno.land prioritizes \nfairness and merit, rewarding the people most active on the platform. PoC restructures the financial incentives that \noften corrupt blockchain projects, opting instead to reward contributors for their work based on expertise, commitment, and \nalignment. \n\nOne of our inspirations for gno.land is the gospels, which built a system of moral code that lasted thousands of years.\nBy observing a minimal production implementation, gno.land’s design will endure over time and serve as a reference for \nfuture generations with censorship-resistant tools that improve their understanding of the world. \n`\n\t_ = b.NewPost(\"\", path, title, body, \"2022-05-20T13:17:22Z\", nil, nil)\n}\n"},{"name":"page_contribute.gno","body":"package gnopages\n\nfunc init() {\n\tpath := \"contribute\"\n\ttitle := \"Contributor Ecosystem: Call for Contributions\"\n\tbody := `\n\ngno.land puts at the center of its identity the contributors that help to create and shape the project into what it is; incentivizing those who contribute the most and help advance its vision. Eventually, contributions will be incentivized directly on-chain; in the meantime, this page serves to illustrate our current off-chain initiatives.\n\ngno.land is still in full-steam development. For now, we're looking for the earliest of adopters; curious to explore a new way to build smart contracts and eager to make an impact. Joining gno.land's development now means you can help to shape the base of its development ecosystem, which will pave the way for the next generation of blockchain programming.\n\nAs an open-source project, we welcome all contributions. On this page you can find some pointers on where to get started; as well as some incentives for the most valuable and important contributions.\n\n## Where to get started\n\nIf you are interested in contributing to gno.land, you can jump on in on our [GitHub monorepo](https://github.com/gnolang/gno/blob/master/CONTRIBUTING.md) - where most development happens.\n\nA good place where to start are the issues tagged [\"good first issue\"](https://github.com/gnolang/gno/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22). They should allow you to make some impact on the Gno repository while you're still exploring the details of how everything works.\n\n## Gno Bounties\n\nAdditionally, you can look out to help on specific issues labeled as bounties. All contributions will then concur to form your profile for Game of Realms.\n\nThe Gno bounty program is a good way to find interesting challenges in Gno, and get rewarded for helping us advance the project. We will maintain open and rewardable bounties in the gnolang/gno repository, and you can search all available bounties by using the [\"bounty\" label](https://github.com/gnolang/gno/labels/bounty).\n\nRecommendations on participating in the gno.land Bounty Program:\n\n- Identify the bounty you want to work on, and join in the discussion on the issue for anything that is unclear; or where you want to more clearly define the work to be done. At this stage, you can also start working on an initial implementation in your local enviornment.\n- Once you have spent time on the code related to the bounty, we recommend submitting a 'draft' PR as soon as possible.\n - The draft PR doesn't indicate that the bounty has been assigned to you, others are free to work on other draft PRs for the bounty.\n - Make sure to reference the bounty issue on the PR description you're writing.\n - After submitting the 'draft' PR, continue working until you are ready to mark the PR as \"ready for review\".\n - The core team will review the bounty PR submission after the work on the bounty has been completed, and determine if it qualifies for the bounty reward.\n- Ask for clarification early if an element on the requirements or implementation design is unclear.\n - Aside from publishing the PR early, keeping regular updates with the core team on the bounty issue is key to being on the right track.\n - As part of the requirements, you must adhere to the [contributing guidelines](https://github.com/gnolang/gno/blob/master/CONTRIBUTING.md); additionally, it is expected that any newly added code or functionality is properly documented, tested and covered, at least in 80% of added code.\n - You're welcome to propose additional features and work on an issue should you envision a plausible expansion or change in scope. The core team may assign a bounty to the additional work, or change the bounty with respect to the changed scope.\n\nYou may make your submission at any time; however we invite you to publish your draft PR very early in the development process. This will make your work public, so you can easily get help by the core team and other community members. Additionally, your work can be continued by other people should you get stuck or no longer be willing to work on the bounty. Likewise, you can continue the abandoned or stuck work that someone else worked on.\n\nDon't fear your work being \"stolen\": if a submission is the result of multiple people's efforts, we will look to split the bounty in a way that is fair and recognises each participant in creating the final outcome. Here are some examples of how that can happen:\n\n- If Alice does most of the work and abandons it; then Bob comes around and finishes the job, then Bob's PR will be merged. But the core team will propose a split like 70% for Alice and 30% for Bob (depending, of course, on the relative effort undertaken by both).\n- If Alice makes a PR that does only 50% of the work outlined in the requirements for the original issue, she will get 50%. Someone can still come up and finish the job; and claim the remaining part.\n\t- If you, for instance, cannot complete the entirety of the task or, as a non-developer, can only contribute a part of the specification/implementation, you may still be awarded a bounty for your input in the contribution.\n- If Alice makes a PR that aside from implementing what's required, also undertakes creating useful tools among the way, she may qualify for an \"outstanding contribution\"; and may be awarded up to 25% more of the original bounty's value. Or she may also ask if the team would be willing to offer a different bounty for the implementation of the tools.\n\nParticipants in the gno.land Bounty Program must meet the legal Terms and Conditions referenced [here](https://docs.google.com/document/d/1aXrZ6japdAykB5FLmHCCeBZTo-2tbZQHSQi79ITaTK0).\n\n### Bounty sizes\n\nEach bounty is associated with a size, to which corresponds the maximum compensation for the work involved on the bounty. A bounty size may under rare occasion be revisited to a bigger or smaller size; hence why it's important to talk about your proposed solution with the core team ahead of time.\n\nIn some cases, the work associated with a bounty may be outstanding. When that happens, the core team can decide to award up to 25% of the bounty's value to the recipient.\n\nThe value of the bounty, aside from the material completion of the task, considers the involved time in managing the created pull request and iterating on feedback.\n\n\nt-shirt size | expected compensation\n-------------|-----------------------\n[XS] | $ 500\n[S] | $ 1000\n[M] | $ 2000\n[L] | $ 4000\n[XL] | $ 8000\n_[XXL]_ \\* | $ 16000\n_[3XL]_ \\* | $ 32000\n\n[XS]: https://github.com/gnolang/gno/labels/bounty%2FXS\n[S]: https://github.com/gnolang/gno/labels/bounty%2FS\n[M]: https://github.com/gnolang/gno/labels/bounty%2FM\n[L]: https://github.com/gnolang/gno/labels/bounty%2FL\n[XL]: https://github.com/gnolang/gno/labels/bounty%2FXL\n[XXL]: https://github.com/gnolang/gno/labels/bounty%2FXXL\n[3XL]: https://github.com/gnolang/gno/labels/bounty%2F3XL\n\n\\*: XXL and 3XL bounties are exceptional. Almost no issues will have these sizes; most will be broken down into smaller bounties.\n\n## gno.land Grants\n\nThe gno.land grants program is to encourage and support the growth of the gno.land contributor community, and build out the usability of the platform and smart contract library. The program provides financial resources to contributors to explore the Gno tech stack, and build dApps, tooling, infrastructure, products, and smart contract libraries in gno.land.\n\n\u003c!-- TODO: Add link to new repo --\u003e\n\n## Join Game of Realms\n\nGame of Realms is the overarching contributor network of gnomes, currently running off-chain, and will eventually transition on-chain. At this stage, a Game of Realms contribution is comprised of high-impact contributions identified as ['notable contributions'](https://github.com/gnolang/game-of-realms/tree/main/contributors).\n\nThese contributions are not linked to immediate financial rewards, but are notable in nature, in the sense they are a challenge, make a significant addition to the project, and require persistence, with minimal feedback loops from the core team.\n\nThe selection of a notable contribution or the sum of contributions that equal 'notable' is based on the impact it has on the development of the project. For now, it is focused on code contributions, and will evolve over time. The Gno development teams will initially qualify and evaluate notable contributions, and vote off-chain on adding them to the 'notable contributions' folder on GitHub.\n\nYou can always contribute to the project, and all contributions will be noticed. Contributing now is a way to build your personal contributor profile in gno.land early on in the ecosystem, and signal your commitment to the project, the community, and its future.\n\nThere are a variety of ways to make your contributions count:\n\n- Core code contributions\n- Realm and pure package development\n- Validator tooling\n- Developer tooling\n- Tutorials and documentation\n\nTo start, we recommend you create a PR in the Game of Realms [repository](https://github.com/gnolang/game-of-realms) to create your profile page for all your contributions.`\n\n\t_ = b.NewPost(\"\", path, title, body, \"2024-09-05T00:00:00Z\", nil, nil)\n}\n"},{"name":"page_ecosystem.gno","body":"package gnopages\n\nfunc init() {\n\tvar (\n\t\tpath = \"ecosystem\"\n\t\ttitle = \"Discover Gno.land Ecosystem Projects \u0026 Initiatives\"\n\t\t// XXX: description = \"Dive further into the gno.land ecosystem and discover the core infrastructure, projects, smart contracts, and tooling we’re building.\"\n\t\tbody = `\n### [Gno Playground](https://play.gno.land)\n\nGno Playground is a simple web interface that lets you write, test, and experiment with your Gno code to improve your \nunderstanding of the Gno language. You can share your code, run unit tests, deploy your realms and packages, and execute\nfunctions in your code using the repo. \n\nVisit the playground at [play.gno.land](https://play.gno.land)!\n\n### [Gno Studio Connect](https://gno.studio/connect)\n\nGno Studio Connect provides seamless access to realms, making it simple to explore, interact, and engage \nwith gno.land’s smart contracts through function calls. Connect focuses on function calls, enabling users to interact \nwith any realm’s exposed function(s) on gno.land. \n\nSee your realm interactions in [Gno Studio Connect](https://gno.studio/connect)\n\n### [Gnoscan](https://gnoscan.io)\n\nDeveloped by the Onbloc team, Gnoscan is gno.land’s blockchain explorer. Anyone can use Gnoscan to easily find\ninformation that resides on the gno.land blockchain, such as wallet addresses, TX hashes, blocks, and contracts. \nGnoscan makes our on-chain data easy to read and intuitive to discover.\n\nExplore the gno.land blockchain at [gnoscan.io](https://gnoscan.io)!\n\n### Adena\n\nAdena is a user-friendly non-custodial wallet for gno.land. Open-source and developed by Onbloc, Adena allows gnomes to \ninteract easily with the chain. With an emphasis on UX, Adena is built to handle millions of realms and tokens with a\nhigh-quality interface, support for NFTs and custom tokens, and seamless integration. Install Adena via the [official website](https://www.adena.app/)\n\n### Gnoswap\n\nGnoswap is currently under development and led by the Onbloc team. Gnoswap will be the first DEX on gno.land and is an \nautomated market maker (AMM) protocol written in Gno that allows for permissionless token exchanges on the platform.\n\n### Flippando\n\nFlippando is a simple on-chain memory game, ported from Solidity to Gno, which starts with an empty matrix to flip tiles\non to see what’s underneath. If the tiles match, they remain uncovered; if not, they are briefly shown, and the player \nmust memorize their colors until the entire matrix is uncovered. The end result can be minted as an NFT, which can later\nbe assembled into bigger, more complex NFTs, creating a digital “painting” with the uncovered tiles. Play the game at [Flippando](https://gno.flippando.xyz/flip)\n\n### Gno Native Kit\n\n[Gno Native Kit](https://github.com/gnolang/gnonative) is a framework that allows developers to build and port gno.land (d)apps written in the (d)app's native language.\n\n\n`\n\t)\n\t_ = b.NewPost(\"\", path, title, body, \"2022-05-20T13:17:23Z\", nil, nil)\n}\n"},{"name":"page_gnolang.gno","body":"package gnopages\n\nfunc init() {\n\tvar (\n\t\tpath = \"gnolang\"\n\t\ttitle = \"About the Gno, the Language for Gno.land\"\n\t\t// TODO fix broken images\n\t\tbody = `\n\n[Gno](https://github.com/gnolang/gno) is an interpretation of the widely-used Go (Golang) programming language for blockchain created by Cosmos co-founder Jae Kwon in 2022 to mark a new era in smart contracting. Gno is ~99% identical to Go, so Go programmers can start coding in Gno right away, with a minimal learning curve. For example, Gno comes with blockchain-specific standard libraries, but any code that doesn’t use blockchain-specific logic can run in Go with minimal processing. Libraries that don’t make sense in the blockchain context, such as network or operating-system access, are not available in Gno. Otherwise, Gno loads and uses many standard libraries that power Go, so most of the parsing of the source code is the same.\n\nUnder the hood, the Gno code is parsed into an abstract syntax tree (AST) and the AST itself is used in the interpreter, rather than bytecode as in many virtual machines such as Java, Python, or Wasm. This makes even the GnoVM accessible to any Go programmer. The novel design of the intuitive GnoVM interpreter allows Gno to freeze and resume the program by persisting and loading the entire memory state. Gno is deterministic, auto-persisted, and auto-Merkle-ized, allowing (smart contract) programs to be succinct, as the programmer doesn’t have to serialize and deserialize objects to persist them into a database (unlike programming applications with the Cosmos SDK).\n\n## How Gno Differs from Go\n\n![Gno and Go differences](static/img/gno-language/go-and-gno.jpg)\n\nThe composable nature of Go/Gno allows for type-checked interactions between contracts, making gno.land safer and more powerful, as well as operationally cheaper and faster. Smart contracts on gno.land are light, simple, more focused, and easily interoperable—a network of interconnected contracts rather than siloed monoliths that limit interactions with other contracts.\n\n![Example of Gno code](static/img/gno-language/code-example.jpg)\n\n## Gno Inherits Go’s Built-in Security Features\n\nGo supports secure programming through exported/non-exported fields, enabling a “least-authority” design. It is easy to create objects and APIs that expose only what should be accessible to callers while hiding what should not be simply by the capitalization of letters, thus allowing a succinct representation of secure logic that can be called by multiple users.\n\nAnother major advantage of Go is that the language comes with an ecosystem of great tooling, like the compiler and third-party tools that statically analyze code. Gno inherits these advantages from Go directly to create a smart contract programming language that provides embedding, composability, type-check safety, and garbage collection, helping developers to write secure code relying on the compiler, parser, and interpreter to give warning alerts for common mistakes.\n\n## Gno vs Solidity\n\nThe most widely-adopted smart contract language today is Ethereum’s EVM-compatible Solidity. With bytecode built from the ground up and Turing complete, Solidity opened up a world of possibilities for decentralized applications (dApps) and there are currently more than 10 million contracts deployed on Ethereum. However, Solidity provides limited tooling and its EVM has a stack limit and computational inefficiencies.\n\nSolidity is designed for one purpose only (writing smart contracts) and is bound by the limitations of the EVM. In addition, developers have to learn several languages if they want to understand the whole stack or work across different ecosystems. Gno aspires to exceed Solidity on multiple fronts (and other smart contract languages like CosmWasm or Substrate) as every part of the stack is written in Gno. It’s easy for developers to understand the entire system just by studying a relatively small code base.\n\n## Gno Is Essential for the Wider Adoption of Web3\n\nGno makes imports as easy as they are in web2 with runtime-based imports for seamless dependency flow comprehension, and support for complex structs, beyond primitive types. Gno is ultimately cost-effective as dependencies are loaded once, enabling remote function calls as local, and providing automatic and independent per-realm state persistence.\n\nUsing Gno, developers can rapidly accelerate application development and adopt a modular structure by reusing and reassembling existing modules without building from scratch. They can embed one structure inside another in an intuitive way while preserving localism, and the language specification is simple, successfully balancing practicality and minimalism.\n\nThe Go language is so well designed that the Gno smart contract system will become the new gold standard for smart contract development and other blockchain applications. As a programming language that is universally adopted, secure, composable, and complete, Gno is essential for the broader adoption of web3 and its sustainable growth.`\n\t)\n\t_ = b.NewPost(\"\", path, title, body, \"2022-05-20T13:17:25Z\", nil, nil)\n}\n"},{"name":"page_license.gno","body":"package gnopages\n\nfunc init() {\n\tvar (\n\t\tpath = \"license\"\n\t\ttitle = \"Gno Network General Public License\"\n\t\tbody = `Copyright (C) 2024 NewTendermint, LLC\n\nThis program is free software: you can redistribute it and/or modify it under\nthe terms of the GNO Network General Public License as published by\nNewTendermint, LLC, either version 4 of the License, or (at your option) any\nlater version published by NewTendermint, LLC.\n\nThis program is distributed in the hope that it will be useful, but is provided\nas-is and WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNO Network\nGeneral Public License for more details.\n\nYou should have received a copy of the GNO Network General Public License along\nwith this program. If not, see \u003chttps://gno.land/license\u003e.\n\nAttached below are the terms of the GNO Network General Public License, Version\n4 (a fork of the GNU Affero General Public License 3).\n\n## Additional Terms\n\n### Strong Attribution\n\nIf any of your user interfaces, such as websites and mobile applications, serve\nas the primary point of entry to a platform or blockchain that 1) offers users\nthe ability to upload their own smart contracts to the platform or blockchain,\nand 2) leverages any Covered Work (including the GNO virtual machine) to run\nthose smart contracts on the platform or blockchain (\"Applicable Work\"), then\nthe Applicable Work must prominently link to (1) gno.land or (2) any other URL\ndesignated by NewTendermint, LLC that has not been rejected by the governance of\nthe first chain known as gno.land, provided that the identity of the first chain\nis not ambiguous. In the event the identity of the first chain is ambiguous,\nthen NewTendermint, LLC's designation shall control. Such link must appear\nconspicuously in the header or footer of the Applicable Work, such that all\nusers may learn of gno.land or the URL designated by NewTendermint, LLC.\n\nThis additional attribution requirement shall remain in effect for (1) 7\nyears from the date of publication of the Applicable Work, or (2) 7 years from\nthe date of publication of the Covered Work (including republication of new\nversions), whichever is later, but no later than 12 years after the application\nof this strong attribution requirement to the publication of the Applicable\nWork. For purposes of this Strong Attribution requirement, Covered Work shall\nmean any work that is licensed under the GNO Network General Public License,\nVersion 4 or later, by NewTendermint, LLC.\n\n\n# GNO NETWORK GENERAL PUBLIC LICENSE\n\nVersion 4, 7 May 2024\n\nModified from the GNU AFFERO GENERAL PUBLIC LICENSE.\nGNU is not affiliated with GNO or NewTendermint, LLC.\nCopyright (C) 2022 NewTendermint, LLC.\n\n## Preamble\n\nThe GNO Network General Public License is a free, copyleft license for\nsoftware and other kinds of works, specifically designed to ensure\ncooperation with the community in the case of network server software.\n\nThe licenses for most software and other practical works are designed\nto take away your freedom to share and change the works. By contrast,\nour General Public Licenses are intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.\n\nWhen we speak of free software, we are referring to freedom, not\nprice. Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\nDevelopers that use our General Public Licenses protect your rights\nwith two steps: (1) assert copyright on the software, and (2) offer\nyou this License which gives you legal permission to copy, distribute\nand/or modify the software.\n\nA secondary benefit of defending all users' freedom is that\nimprovements made in alternate versions of the program, if they\nreceive widespread use, become available for other developers to\nincorporate. Many developers of free software are heartened and\nencouraged by the resulting cooperation. However, in the case of\nsoftware used on network servers, this result may fail to come about.\nThe GNU General Public License permits making a modified version and\nletting the public access it on a server without ever releasing its\nsource code to the public.\n\nThe GNO Network General Public License is designed specifically to\nensure that, in such cases, the modified source code becomes available\nto the community. It requires the operator of a network server to\nprovide the source code of the modified version running there to the\nusers of that server. Therefore, public use of a modified version, on\na publicly accessible server, gives the public access to the source\ncode of the modified version.\n\nThe precise terms and conditions for copying, distribution and\nmodification follow.\n\n## TERMS AND CONDITIONS\n\n### 0. Definitions.\n\n\"This License\" refers to version 4 of the GNO Network General Public License.\n\n\"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n\"The Program\" refers to any copyrightable work licensed under this\nLicense. Each licensee is addressed as \"you\". \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\nTo \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy. The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\nA \"covered work\" means either the unmodified Program or a work based\non the Program.\n\nTo \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy. Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\nTo \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies. Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\nAn interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License. If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n### 1. Source Code.\n\nThe \"source code\" for a work means the preferred form of the work\nfor making modifications to it. \"Object code\" means any non-source\nform of a work.\n\nA \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\nThe \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form. A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\nThe \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities. However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work. For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\nThe Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\nThe Corresponding Source for a work in source code form is that\nsame work.\n\n### 2. Basic Permissions.\n\nAll rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met. This License explicitly affirms your unlimited\npermission to run the unmodified Program. The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work. This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\nYou may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force. You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright. Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\nConveying under any other circumstances is permitted solely under\nthe conditions stated below. Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n### 3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\nNo covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\nWhen you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n### 4. Conveying Verbatim Copies.\n\nYou may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\nYou may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n### 5. Conveying Modified Source Versions.\n\nYou may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n- a) The work must carry prominent notices stating that you modified\n it, and giving a relevant date.\n- b) The work must carry prominent notices stating that it is\n released under this License and any conditions added under section\n 7. This requirement modifies the requirement in section 4 to\n \"keep intact all notices\".\n- c) You must license the entire work, as a whole, under this\n License to anyone who comes into possession of a copy. This\n License will therefore apply, along with any applicable section 7\n additional terms, to the whole of the work, and all its parts,\n regardless of how they are packaged. This License gives no\n permission to license the work in any other way, but it does not\n invalidate such permission if you have separately received it.\n- d) If the work has interactive user interfaces, each must display\n Appropriate Legal Notices; however, if the Program has interactive\n interfaces that do not display Appropriate Legal Notices, your\n work need not make them do so.\n\nA compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit. Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n### 6. Conveying Non-Source Forms.\n\n You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n- a) Convey the object code in, or embodied in, a physical product\n (including a physical distribution medium), accompanied by the\n Corresponding Source fixed on a durable physical medium\n customarily used for software interchange.\n- b) Convey the object code in, or embodied in, a physical product\n (including a physical distribution medium), accompanied by a\n written offer, valid for at least three years and valid for as\n long as you offer spare parts or customer support for that product\n model, to give anyone who possesses the object code either (1) a\n copy of the Corresponding Source for all the software in the\n product that is covered by this License, on a durable physical\n medium customarily used for software interchange, for a price no\n more than your reasonable cost of physically performing this\n conveying of source, or (2) access to copy the\n Corresponding Source from a network server at no charge.\n- c) Convey individual copies of the object code with a copy of the\n written offer to provide the Corresponding Source. This\n alternative is allowed only occasionally and noncommercially, and\n only if you received the object code with such an offer, in accord\n with subsection 6b.\n- d) Convey the object code by offering access from a designated\n place (gratis or for a charge), and offer equivalent access to the\n Corresponding Source in the same way through the same place at no\n further charge. You need not require recipients to copy the\n Corresponding Source along with the object code. If the place to\n copy the object code is a network server, the Corresponding Source\n may be on a different server (operated by you or a third party)\n that supports equivalent copying facilities, provided you maintain\n clear directions next to the object code saying where to find the\n Corresponding Source. Regardless of what server hosts the\n Corresponding Source, you remain obligated to ensure that it is\n available for as long as needed to satisfy these requirements.\n- e) Convey the object code using peer-to-peer transmission, provided\n you inform other peers where the object code and Corresponding\n Source of the work are being offered to the general public at no\n charge under subsection 6d.\n\nA separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\nA \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling. In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage. For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product. A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n\"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source. The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\nIf you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information. But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\nThe requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed. Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\nCorresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n### 7. Additional Terms.\n\n\"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law. If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\nWhen you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit. (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.) You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\nNotwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n- a) Disclaiming warranty or limiting liability differently from the\n terms of sections 15 and 16 of this License; or\n- b) Requiring preservation of specified reasonable legal notices or\n author attributions in that material or in the Appropriate Legal\n Notices displayed by works containing it; or\n- c) Prohibiting misrepresentation of the origin of that material, or\n requiring that modified versions of such material be marked in\n reasonable ways as different from the original version; or\n- d) Limiting the use for publicity purposes of names of licensors or\n authors of the material; or\n- e) Declining to grant rights under trademark law for use of some\n trade names, trademarks, or service marks; or\n- f) Requiring indemnification of licensors and authors of that\n material by anyone who conveys the material (or modified versions of\n it) with contractual assumptions of liability to the recipient, for\n any liability that these contractual assumptions directly impose on\n those licensors and authors; or\n- g) Requiring strong attribution such as notices on any user interfaces\n that run or convey any covered work, such as a prominent link to a URL\n on the header of a website, such that all users of the covered work may\n become aware of the notice, for a period no longer than 20 years.\n\nAll other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10. If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term. If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\nIf you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\nAdditional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n### 8. Termination.\n\nYou may not propagate or modify a covered work except as expressly\nprovided under this License. Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\nHowever, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\nMoreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\nTermination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License. If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n### 9. Acceptance Not Required for Having Copies.\n\nYou are not required to accept this License in order to receive or\nrun a copy of the Program. Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance. However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work. These actions infringe copyright if you do\nnot accept this License. Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n### 10. Automatic Licensing of Downstream Recipients.\n\nEach time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License. You are not responsible\nfor enforcing compliance by third parties with this License.\n\nAn \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations. If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\nYou may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License. For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n### 11. Patents.\n\nA \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based. The\nwork thus licensed is called the contributor's \"contributor version\".\n\nA contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version. For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\nEach contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\nIn the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement). To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\nIf you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients. \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\nIf, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\nA patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License. You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\nNothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n### 12. No Surrender of Others' Freedom.\n\nIf conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License. If you cannot convey a\ncovered work so as to simultaneously satisfy your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all. For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n### 13. Remote Network Interaction; Use with the GNU General Public License.\n\nNotwithstanding any other provision of this License, if you modify the\nProgram, your modified version must prominently offer all users\ninteracting with it remotely through a computer network (if your version\nsupports such interaction) an opportunity to receive the Corresponding\nSource of your version by providing access to the Corresponding Source\nfrom a network server at no charge, through some standard or customary\nmeans of facilitating copying of software. This Corresponding Source\nshall include the Corresponding Source for any work covered by version 3\nof the GNU General Public License that is incorporated pursuant to the\nfollowing paragraph.\n\nNotwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU General Public License into a single\ncombined work, and to convey the resulting work. The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the work with which it is combined will remain governed by version\n3 of the GNU General Public License.\n\n### 14. Revised Versions of this License.\n\nNewTendermint LLC may publish revised and/or new versions of\nthe GNO Network General Public License from time to time. Such new versions\nwill be similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\nEach version is given a distinguishing version number. If the\nProgram specifies that a certain numbered version of the GNO Network General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Gno Software\nFoundation. If the Program does not specify a version number of the\nGNO Network General Public License, you may choose any version ever published\nby NewTendermint LLC.\n\nIf the Program specifies that a proxy can decide which future\nversions of the GNO Network General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\nLater license versions may give you additional or different\npermissions. However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n### 15. Disclaimer of Warranty.\n\nTHERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n### 16. Limitation of Liability.\n\nIN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n### 17. Interpretation of Sections 15 and 16.\n\nIf the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\nEND OF TERMS AND CONDITIONS\n\n## How to Apply These Terms to Your New Programs\n\nIf you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\nTo do so, attach the following notices to the program. It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n \u003cone line to give the program's name and a brief idea of what it does.\u003e\n Copyright (C) \u003cyear\u003e \u003cname of author\u003e\n\n This program is free software: you can redistribute it and/or modify\n it under the terms of the GNO Network General Public License as published by\n NewTendermint LLC, either version 4 of the License, or\n (at your option) any later version.\n\n This program is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNO Network General Public License for more details.\n\n You should have received a copy of the GNO Network General Public License\n along with this program. If not, see \u003chttps://gno.land/license\u003e.\n\nAlso add information on how to contact you by electronic and paper mail.\n\nIf your software can interact with users remotely through a computer\nnetwork, you should also make sure that it provides a way for users to\nget its source. For example, if your program is a web application, its\ninterface could display a \"Source\" link that leads users to an archive\nof the code. There are many ways you could offer source, and different\nsolutions will be better for different programs; see section 13 for the\nspecific requirements.\n`\n\t)\n\t_ = b.NewPost(\"\", path, title, body, \"2024-04-22T00:00:00Z\", nil, nil)\n}\n"},{"name":"page_partners.gno","body":"package gnopages\n\nfunc init() {\n\tpath := \"partners\"\n\ttitle := \"Partnerships\"\n\tbody := `### Fund and Grants Program\n\nAre you a builder, tinkerer, or researcher? If you’re looking to create awesome dApps, tooling, infrastructure, \nor smart contract libraries on gno.land, you can apply for a grant. The gno.land Ecosystem Fund and Grants program \nprovides financial contributions for individuals and teams to innovate on the platform.\n\nRead more about our Funds and Grants program [here](https://github.com/gnolang/ecosystem-fund-grants).\n`\n\t_ = b.NewPost(\"\", path, title, body, \"2022-05-20T13:17:27Z\", nil, nil)\n}\n"},{"name":"page_start.gno","body":"package gnopages\n\nfunc init() {\n\tpath := \"start\"\n\ttitle := \"Getting Started with Gno\"\n\t// XXX: description := \"\"\n\n\t// TODO: codegen to use README files here\n\n\t/* TODO: port previous message: This is a demo of Gno smart contract programming. This document was\n\tconstructed by Gno onto a smart contract hosted on the data Realm\n\tname [\"gno.land/r/demo/boards\"](https://gno.land/r/demo/boards/)\n\t([github](https://github.com/gnolang/gno/tree/master/examples/gno.land/r/demo/boards)).\n\t*/\n\tbody := `## Getting Started with Gno\n\n- [Install Gno Key](/r/demo/boards:testboard/5)\n- TODO: add more links\n`\n\t_ = b.NewPost(\"\", path, title, body, \"2022-05-20T13:17:28Z\", nil, nil)\n}\n"},{"name":"page_testnets.gno","body":"package gnopages\n\nfunc init() {\n\tpath := \"testnets\"\n\ttitle := \"Gno.land Testnet List\"\n\tbody := `\n- [Portal Loop](https://docs.gno.land/concepts/portal-loop) - a rolling testnet \n- [staging.gno.land](https://staging.gno.land) - wiped every commit to monorepo master\n- test4.gno.land (upcoming)\n- _[test3.gno.land](https://test3.gno.land) (latest)_\n- _[test2.gno.land](https://test2.gno.land) (archive)_\n- _[test1.gno.land](https://test1.gno.land) (archive)_\n\nFor a list of RPC endpoints, see the [reference documentation](https://docs.gno.land/reference/rpc-endpoints).\n\n## Local development\n\nSee the \"Getting started\" section in the [official documentation](https://docs.gno.land/getting-started/local-setup).\n`\n\t_ = b.NewPost(\"\", path, title, body, \"2022-05-20T13:17:29Z\", nil, nil)\n}\n"},{"name":"page_tokenomics.gno","body":"package gnopages\n\nfunc init() {\n\tvar (\n\t\tpath = \"tokenomics\"\n\t\ttitle = \"Gno.land Tokenomics\"\n\t\t// XXX: description = \"\"\"\n\t\tbody = `Lorem Ipsum`\n\t)\n\t_ = b.NewPost(\"\", path, title, body, \"2022-05-20T13:17:30Z\", nil, nil)\n}\n"},{"name":"pages.gno","body":"package gnopages\n\nimport (\n\t\"gno.land/p/demo/blog\"\n)\n\n// TODO: switch from p/blog to p/pages\n\nvar b = \u0026blog.Blog{\n\tTitle: \"Gnoland's Pages\",\n\tPrefix: \"/r/gnoland/pages:\",\n\tNoBreadcrumb: true,\n}\n\nfunc Render(path string) string {\n\treturn b.Render(path)\n}\n"},{"name":"pages_test.gno","body":"package gnopages\n\nimport (\n\t\"strings\"\n\t\"testing\"\n)\n\nfunc TestHome(t *testing.T) {\n\tprintedOnce := false\n\tgot := Render(\"\")\n\texpectedSubtrings := []string{\n\t\t\"/r/gnoland/pages:p/tokenomics\",\n\t\t\"/r/gnoland/pages:p/start\",\n\t\t\"/r/gnoland/pages:p/contribute\",\n\t\t\"/r/gnoland/pages:p/about\",\n\t\t\"/r/gnoland/pages:p/gnolang\",\n\t}\n\tfor _, substring := range expectedSubtrings {\n\t\tif !strings.Contains(got, substring) {\n\t\t\tif !printedOnce {\n\t\t\t\tprintln(got)\n\t\t\t\tprintedOnce = true\n\t\t\t}\n\t\t\tt.Errorf(\"expected %q, but not found.\", substring)\n\t\t}\n\t}\n}\n\nfunc TestAbout(t *testing.T) {\n\tprintedOnce := false\n\tgot := Render(\"p/about\")\n\texpectedSubtrings := []string{\n\t\t\"Gno.land Is A Platform To Write Smart Contracts In Gno\",\n\t\t\"Gno.land is a next-generation smart contract platform using Gno, an interpreted version of the general-purpose Go\\nprogramming language.\",\n\t}\n\tfor _, substring := range expectedSubtrings {\n\t\tif !strings.Contains(got, substring) {\n\t\t\tif !printedOnce {\n\t\t\t\tprintln(got)\n\t\t\t\tprintedOnce = true\n\t\t\t}\n\t\t\tt.Errorf(\"expected %q, but not found.\", substring)\n\t\t}\n\t}\n}\n"},{"name":"util.gno","body":"package gnopages\n\nfunc checkErr(err error) {\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"govdao","path":"gno.land/r/gov/dao","files":[{"name":"dao.gno","body":"package govdao\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\n\t\"gno.land/p/demo/ufmt\"\n\tpproposal \"gno.land/p/gov/proposal\"\n)\n\nvar (\n\tproposals = make([]*proposal, 0)\n\tmembers = make([]std.Address, 0) // XXX: these should be pointers to avoid data duplication. Not possible due to VM bugs\n)\n\nconst (\n\tmsgMissingExecutor = \"missing proposal executor\"\n\tmsgPropExecuted = \"prop already executed\"\n\tmsgPropExpired = \"prop is expired\"\n\tmsgPropInactive = \"prop is not active anymore\"\n\tmsgPropActive = \"prop is still active\"\n\tmsgPropNotAccepted = \"prop is not accepted\"\n\n\tmsgCallerNotAMember = \"caller is not member of govdao\"\n\tmsgProposalNotFound = \"proposal not found\"\n)\n\ntype proposal struct {\n\tauthor std.Address\n\tcomment string\n\texecutor pproposal.Executor\n\tvoter Voter\n\texecuted bool\n\tvoters []std.Address // XXX: these should be pointers to avoid data duplication. Not possible due to VM bugs.\n}\n\nfunc (p proposal) Status() Status {\n\tif p.executor.IsExpired() {\n\t\treturn Expired\n\t}\n\n\tif p.executor.IsDone() {\n\t\treturn Succeeded\n\t}\n\n\tif !p.voter.IsFinished(members) {\n\t\treturn Active\n\t}\n\n\tif p.voter.IsAccepted(members) {\n\t\treturn Accepted\n\t}\n\n\treturn NotAccepted\n}\n\n// Propose is designed to be called by another contract or with\n// `maketx run`, not by a `maketx call`.\nfunc Propose(comment string, executor pproposal.Executor) int {\n\t// XXX: require payment?\n\tif executor == nil {\n\t\tpanic(msgMissingExecutor)\n\t}\n\tcaller := std.GetOrigCaller() // XXX: CHANGE THIS WHEN MSGRUN PERSIST CODE ESCAPING THE main() SCOPE! IT IS UNSAFE!\n\tAssertIsMember(caller)\n\n\tprop := \u0026proposal{\n\t\tcomment: comment,\n\t\texecutor: executor,\n\t\tauthor: caller,\n\t\tvoter: NewPercentageVoter(66), // at least 2/3 must say yes\n\t}\n\n\tproposals = append(proposals, prop)\n\n\treturn len(proposals) - 1\n}\n\nfunc VoteOnProposal(idx int, option string) {\n\tassertProposalExists(idx)\n\tcaller := std.GetOrigCaller() // XXX: CHANGE THIS WHEN MSGRUN PERSIST CODE ESCAPING THE main() SCOPE! IT IS UNSAFE!\n\tAssertIsMember(caller)\n\n\tprop := getProposal(idx)\n\n\tif prop.executed {\n\t\tpanic(msgPropExecuted)\n\t}\n\n\tif prop.executor.IsExpired() {\n\t\tpanic(msgPropExpired)\n\t}\n\n\tif prop.voter.IsFinished(members) {\n\t\tpanic(msgPropInactive)\n\t}\n\n\tprop.voter.Vote(members, caller, option)\n}\n\nfunc ExecuteProposal(idx int) {\n\tassertProposalExists(idx)\n\tprop := getProposal(idx)\n\n\tif prop.executed {\n\t\tpanic(msgPropExecuted)\n\t}\n\n\tif prop.executor.IsExpired() {\n\t\tpanic(msgPropExpired)\n\t}\n\n\tif !prop.voter.IsFinished(members) {\n\t\tpanic(msgPropActive)\n\t}\n\n\tif !prop.voter.IsAccepted(members) {\n\t\tpanic(msgPropNotAccepted)\n\t}\n\n\tprop.executor.Execute()\n\tprop.voters = members\n\tprop.executed = true\n}\n\nfunc IsMember(addr std.Address) bool {\n\tif len(members) == 0 { // special case for initial execution\n\t\treturn true\n\t}\n\n\tfor _, v := range members {\n\t\tif v == addr {\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n\nfunc AssertIsMember(addr std.Address) {\n\tif !IsMember(addr) {\n\t\tpanic(msgCallerNotAMember)\n\t}\n}\n\nfunc Render(path string) string {\n\tif path == \"\" {\n\t\tif len(proposals) == 0 {\n\t\t\treturn \"No proposals found :(\" // corner case\n\t\t}\n\n\t\toutput := \"\"\n\t\tfor idx, prop := range proposals {\n\t\t\toutput += ufmt.Sprintf(\"- [%d](/r/gov/dao:%d) - %s (**%s**)(by %s)\\n\", idx, idx, prop.comment, string(prop.Status()), prop.author)\n\t\t}\n\n\t\treturn output\n\t}\n\n\t// else display the proposal\n\tidx, err := strconv.Atoi(path)\n\tif err != nil {\n\t\treturn \"404\"\n\t}\n\n\tif !proposalExists(idx) {\n\t\treturn \"404\"\n\t}\n\tprop := getProposal(idx)\n\n\tvs := members\n\tif prop.executed {\n\t\tvs = prop.voters\n\t}\n\n\toutput := \"\"\n\toutput += ufmt.Sprintf(\"# Prop #%d\", idx)\n\toutput += \"\\n\\n\"\n\toutput += prop.comment\n\toutput += \"\\n\\n\"\n\toutput += ufmt.Sprintf(\"Status: %s\", string(prop.Status()))\n\toutput += \"\\n\\n\"\n\toutput += ufmt.Sprintf(\"Voting status: %s\", prop.voter.Status(vs))\n\toutput += \"\\n\\n\"\n\toutput += ufmt.Sprintf(\"Author: %s\", string(prop.author))\n\toutput += \"\\n\\n\"\n\n\treturn output\n}\n\nfunc getProposal(idx int) *proposal {\n\tif idx \u003e len(proposals)-1 {\n\t\tpanic(msgProposalNotFound)\n\t}\n\n\treturn proposals[idx]\n}\n\nfunc proposalExists(idx int) bool {\n\treturn idx \u003e= 0 \u0026\u0026 idx \u003c= len(proposals)\n}\n\nfunc assertProposalExists(idx int) {\n\tif !proposalExists(idx) {\n\t\tpanic(\"invalid proposal id\")\n\t}\n}\n"},{"name":"dao_test.gno","body":"package govdao\n\nimport (\n\t\"std\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/p/demo/urequire\"\n\tpproposal \"gno.land/p/gov/proposal\"\n)\n\nfunc TestPackage(t *testing.T) {\n\tu1 := testutils.TestAddress(\"u1\")\n\tu2 := testutils.TestAddress(\"u2\")\n\tu3 := testutils.TestAddress(\"u3\")\n\n\tmembers = append(members, u1)\n\tmembers = append(members, u2)\n\tmembers = append(members, u3)\n\n\tnu1 := testutils.TestAddress(\"random1\")\n\n\tout := Render(\"\")\n\n\texpected := \"No proposals found :(\"\n\turequire.Equal(t, expected, out)\n\n\tvar called bool\n\tex := pproposal.NewExecutor(func() error {\n\t\tcalled = true\n\t\treturn nil\n\t})\n\n\tstd.TestSetOrigCaller(u1)\n\tpid := Propose(\"dummy proposal\", ex)\n\n\t// try to vote not being a member\n\tstd.TestSetOrigCaller(nu1)\n\n\turequire.PanicsWithMessage(t, msgCallerNotAMember, func() {\n\t\tVoteOnProposal(pid, \"YES\")\n\t})\n\n\t// try to vote several times\n\tstd.TestSetOrigCaller(u1)\n\turequire.NotPanics(t, func() {\n\t\tVoteOnProposal(pid, \"YES\")\n\t})\n\turequire.PanicsWithMessage(t, msgAlreadyVoted, func() {\n\t\tVoteOnProposal(pid, \"YES\")\n\t})\n\n\tout = Render(\"0\")\n\texpected = `# Prop #0\n\ndummy proposal\n\nStatus: active\n\nVoting status: YES: 1, NO: 0, percent: 33, members: 3\n\nAuthor: g1w5c47h6lta047h6lta047h6lta047h6ly5kscr\n\n`\n\n\turequire.Equal(t, expected, out)\n\n\tstd.TestSetOrigCaller(u2)\n\turequire.PanicsWithMessage(t, msgWrongVotingValue, func() {\n\t\tVoteOnProposal(pid, \"INCORRECT\")\n\t})\n\turequire.NotPanics(t, func() {\n\t\tVoteOnProposal(pid, \"NO\")\n\t})\n\n\tout = Render(\"0\")\n\texpected = `# Prop #0\n\ndummy proposal\n\nStatus: active\n\nVoting status: YES: 1, NO: 1, percent: 33, members: 3\n\nAuthor: g1w5c47h6lta047h6lta047h6lta047h6ly5kscr\n\n`\n\n\turequire.Equal(t, expected, out)\n\n\tstd.TestSetOrigCaller(u3)\n\turequire.NotPanics(t, func() {\n\t\tVoteOnProposal(pid, \"YES\")\n\t})\n\n\tout = Render(\"0\")\n\texpected = `# Prop #0\n\ndummy proposal\n\nStatus: accepted\n\nVoting status: YES: 2, NO: 1, percent: 66, members: 3\n\nAuthor: g1w5c47h6lta047h6lta047h6lta047h6ly5kscr\n\n`\n\n\turequire.Equal(t, expected, out)\n\n\t// Add a new member, so non-executed proposals will change the voting status\n\tu4 := testutils.TestAddress(\"u4\")\n\tmembers = append(members, u4)\n\n\tout = Render(\"0\")\n\texpected = `# Prop #0\n\ndummy proposal\n\nStatus: active\n\nVoting status: YES: 2, NO: 1, percent: 50, members: 4\n\nAuthor: g1w5c47h6lta047h6lta047h6lta047h6ly5kscr\n\n`\n\n\turequire.Equal(t, expected, out)\n\n\tstd.TestSetOrigCaller(u4)\n\turequire.NotPanics(t, func() {\n\t\tVoteOnProposal(pid, \"YES\")\n\t})\n\n\tout = Render(\"0\")\n\texpected = `# Prop #0\n\ndummy proposal\n\nStatus: accepted\n\nVoting status: YES: 3, NO: 1, percent: 75, members: 4\n\nAuthor: g1w5c47h6lta047h6lta047h6lta047h6ly5kscr\n\n`\n\n\turequire.Equal(t, expected, out)\n\n\tExecuteProposal(pid)\n\turequire.True(t, called)\n\n\tout = Render(\"0\")\n\texpected = `# Prop #0\n\ndummy proposal\n\nStatus: succeeded\n\nVoting status: YES: 3, NO: 1, percent: 75, members: 4\n\nAuthor: g1w5c47h6lta047h6lta047h6lta047h6ly5kscr\n\n`\n\n\turequire.Equal(t, expected, out)\n\n\t// Add a new member and try to vote an already executed proposal\n\tu5 := testutils.TestAddress(\"u5\")\n\tmembers = append(members, u5)\n\tstd.TestSetOrigCaller(u5)\n\turequire.PanicsWithMessage(t, msgPropExecuted, func() {\n\t\tExecuteProposal(pid)\n\t})\n\n\t// even if we added a new member the executed proposal is showing correctly the members that voted on it\n\tout = Render(\"0\")\n\texpected = `# Prop #0\n\ndummy proposal\n\nStatus: succeeded\n\nVoting status: YES: 3, NO: 1, percent: 75, members: 4\n\nAuthor: g1w5c47h6lta047h6lta047h6lta047h6ly5kscr\n\n`\n\n\turequire.Equal(t, expected, out)\n\n}\n"},{"name":"memberset.gno","body":"package govdao\n\nimport (\n\t\"std\"\n\n\tpproposal \"gno.land/p/gov/proposal\"\n)\n\nconst daoPkgPath = \"gno.land/r/gov/dao\"\n\nconst (\n\terrNoChangesProposed = \"no set changes proposed\"\n\terrNotGovDAO = \"caller not govdao executor\"\n)\n\nfunc NewPropExecutor(changesFn func() []std.Address) pproposal.Executor {\n\tif changesFn == nil {\n\t\tpanic(errNoChangesProposed)\n\t}\n\n\tcallback := func() error {\n\t\t// Make sure the GovDAO executor runs the valset changes\n\t\tassertGovDAOCaller()\n\n\t\tfor _, addr := range changesFn() {\n\t\t\tmembers = append(members, addr)\n\t\t}\n\n\t\treturn nil\n\t}\n\n\treturn pproposal.NewExecutor(callback)\n}\n\n// assertGovDAOCaller verifies the caller is the GovDAO executor\nfunc assertGovDAOCaller() {\n\tif std.CurrentRealm().PkgPath() != daoPkgPath {\n\t\tpanic(errNotGovDAO)\n\t}\n}\n"},{"name":"prop1_filetest.gno","body":"// Please note that this package is intended for demonstration purposes only.\n// You could execute this code (the init part) by running a `maketx run` command\n// or by uploading a similar package to a personal namespace.\n//\n// For the specific case of validators, a `r/gnoland/valopers` will be used to\n// organize the lifecycle of validators (register, etc), and this more complex\n// contract will be responsible to generate proposals.\npackage main\n\nimport (\n\t\"std\"\n\n\tpVals \"gno.land/p/sys/validators\"\n\tgovdao \"gno.land/r/gov/dao\"\n\t\"gno.land/r/sys/validators\"\n)\n\nconst daoPkgPath = \"gno.land/r/gov/dao\"\n\nfunc init() {\n\tmembersFn := func() []std.Address {\n\t\treturn []std.Address{\n\t\t\tstd.Address(\"g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm\"),\n\t\t}\n\t}\n\n\tmExec := govdao.NewPropExecutor(membersFn)\n\n\tcomment := \"adding someone to vote\"\n\tid := govdao.Propose(comment, mExec)\n\tgovdao.ExecuteProposal(id)\n\n\tchangesFn := func() []pVals.Validator {\n\t\treturn []pVals.Validator{\n\t\t\t{\n\t\t\t\tAddress: std.Address(\"g12345678\"),\n\t\t\t\tPubKey: \"pubkey\",\n\t\t\t\tVotingPower: 10, // add a new validator\n\t\t\t},\n\t\t\t{\n\t\t\t\tAddress: std.Address(\"g000000000\"),\n\t\t\t\tPubKey: \"pubkey\",\n\t\t\t\tVotingPower: 10, // add a new validator\n\t\t\t},\n\t\t\t{\n\t\t\t\tAddress: std.Address(\"g000000000\"),\n\t\t\t\tPubKey: \"pubkey\",\n\t\t\t\tVotingPower: 0, // remove an existing validator\n\t\t\t},\n\t\t}\n\t}\n\n\t// Wraps changesFn to emit a certified event only if executed from a\n\t// complete governance proposal process.\n\texecutor := validators.NewPropExecutor(changesFn)\n\n\t// Create a proposal.\n\t// XXX: payment\n\tcomment = \"manual valset changes proposal example\"\n\tgovdao.Propose(comment, executor)\n}\n\nfunc main() {\n\tprintln(\"--\")\n\tprintln(govdao.Render(\"\"))\n\tprintln(\"--\")\n\tprintln(govdao.Render(\"1\"))\n\tprintln(\"--\")\n\tgovdao.VoteOnProposal(1, \"YES\")\n\tprintln(\"--\")\n\tprintln(govdao.Render(\"1\"))\n\tprintln(\"--\")\n\tprintln(validators.Render(\"\"))\n\tprintln(\"--\")\n\tgovdao.ExecuteProposal(1)\n\tprintln(\"--\")\n\tprintln(govdao.Render(\"1\"))\n\tprintln(\"--\")\n\tprintln(validators.Render(\"\"))\n}\n\n// Output:\n// --\n// - [0](/r/gov/dao:0) - adding someone to vote (**succeeded**)(by g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm)\n// - [1](/r/gov/dao:1) - manual valset changes proposal example (**active**)(by g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm)\n//\n// --\n// # Prop #1\n//\n// manual valset changes proposal example\n//\n// Status: active\n//\n// Voting status: YES: 0, NO: 0, percent: 0, members: 1\n//\n// Author: g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm\n//\n//\n// --\n// --\n// # Prop #1\n//\n// manual valset changes proposal example\n//\n// Status: accepted\n//\n// Voting status: YES: 1, NO: 0, percent: 100, members: 1\n//\n// Author: g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm\n//\n//\n// --\n// No valset changes to apply.\n// --\n// --\n// # Prop #1\n//\n// manual valset changes proposal example\n//\n// Status: succeeded\n//\n// Voting status: YES: 1, NO: 0, percent: 100, members: 1\n//\n// Author: g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm\n//\n//\n// --\n// Valset changes:\n// - #123: g12345678 (10)\n// - #123: g000000000 (10)\n// - #123: g000000000 (0)\n"},{"name":"prop2_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\t\"time\"\n\n\t\"gno.land/p/demo/context\"\n\t\"gno.land/p/gov/proposal\"\n\tgnoblog \"gno.land/r/gnoland/blog\"\n\tgovdao \"gno.land/r/gov/dao\"\n)\n\nfunc init() {\n\tmembersFn := func() []std.Address {\n\t\treturn []std.Address{\n\t\t\tstd.Address(\"g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm\"),\n\t\t}\n\t}\n\n\tmExec := govdao.NewPropExecutor(membersFn)\n\n\tcomment := \"adding someone to vote\"\n\n\tid := govdao.Propose(comment, mExec)\n\n\tgovdao.ExecuteProposal(id)\n\n\texecutor := proposal.NewCtxExecutor(func(ctx context.Context) error {\n\t\tgnoblog.DaoAddPost(\n\t\t\tctx,\n\t\t\t\"hello-from-govdao\", // slug\n\t\t\t\"Hello from GovDAO!\", // title\n\t\t\t\"This post was published by a GovDAO proposal.\", // body\n\t\t\ttime.Now().Format(time.RFC3339), // publidation date\n\t\t\t\"moul\", // authors\n\t\t\t\"govdao,example\", // tags\n\t\t)\n\t\treturn nil\n\t})\n\n\t// Create a proposal.\n\t// XXX: payment\n\tcomment = \"post a new blogpost about govdao\"\n\tgovdao.Propose(comment, executor)\n}\n\nfunc main() {\n\tprintln(\"--\")\n\tprintln(govdao.Render(\"\"))\n\tprintln(\"--\")\n\tprintln(govdao.Render(\"1\"))\n\tprintln(\"--\")\n\tgovdao.VoteOnProposal(1, \"YES\")\n\tprintln(\"--\")\n\tprintln(govdao.Render(\"1\"))\n\tprintln(\"--\")\n\tprintln(gnoblog.Render(\"\"))\n\tprintln(\"--\")\n\tgovdao.ExecuteProposal(1)\n\tprintln(\"--\")\n\tprintln(govdao.Render(\"1\"))\n\tprintln(\"--\")\n\tprintln(gnoblog.Render(\"\"))\n}\n\n// Output:\n// --\n// - [0](/r/gov/dao:0) - adding someone to vote (**succeeded**)(by g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm)\n// - [1](/r/gov/dao:1) - post a new blogpost about govdao (**active**)(by g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm)\n//\n// --\n// # Prop #1\n//\n// post a new blogpost about govdao\n//\n// Status: active\n//\n// Voting status: YES: 0, NO: 0, percent: 0, members: 1\n//\n// Author: g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm\n//\n//\n// --\n// --\n// # Prop #1\n//\n// post a new blogpost about govdao\n//\n// Status: accepted\n//\n// Voting status: YES: 1, NO: 0, percent: 100, members: 1\n//\n// Author: g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm\n//\n//\n// --\n// # Gnoland's Blog\n//\n// No posts.\n// --\n// --\n// # Prop #1\n//\n// post a new blogpost about govdao\n//\n// Status: succeeded\n//\n// Voting status: YES: 1, NO: 0, percent: 100, members: 1\n//\n// Author: g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm\n//\n//\n// --\n// # Gnoland's Blog\n//\n// \u003cdiv class='columns-3'\u003e\u003cdiv\u003e\n//\n// ### [Hello from GovDAO!](/r/gnoland/blog:p/hello-from-govdao)\n// 13 Feb 2009\n// \u003c/div\u003e\u003c/div\u003e\n"},{"name":"types.gno","body":"package govdao\n\nimport (\n\t\"std\"\n)\n\n// Status enum.\ntype Status string\n\nvar (\n\tAccepted Status = \"accepted\"\n\tActive Status = \"active\"\n\tNotAccepted Status = \"not accepted\"\n\tExpired Status = \"expired\"\n\tSucceeded Status = \"succeeded\"\n)\n\n// Voter defines the needed methods for a voting system\ntype Voter interface {\n\n\t// IsAccepted indicates if the voting process had been accepted\n\tIsAccepted(voters []std.Address) bool\n\n\t// IsFinished indicates if the voting process is finished\n\tIsFinished(voters []std.Address) bool\n\n\t// Vote adds a new vote to the voting system\n\tVote(voters []std.Address, caller std.Address, flag string)\n\n\t// Status returns a human friendly string describing how the voting process is going\n\tStatus(voters []std.Address) string\n}\n"},{"name":"voter.gno","body":"package govdao\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/ufmt\"\n)\n\nconst (\n\tyay = \"YES\"\n\tnay = \"NO\"\n\n\tmsgNoMoreVotesAllowed = \"no more votes allowed\"\n\tmsgAlreadyVoted = \"caller already voted\"\n\tmsgWrongVotingValue = \"voting values must be YES or NO\"\n)\n\nfunc NewPercentageVoter(percent int) *PercentageVoter {\n\tif percent \u003c 0 || percent \u003e 100 {\n\t\tpanic(\"percent value must be between 0 and 100\")\n\t}\n\n\treturn \u0026PercentageVoter{\n\t\tpercentage: percent,\n\t}\n}\n\n// PercentageVoter is a system based on the amount of received votes.\n// When the specified treshold is reached, the voting process finishes.\ntype PercentageVoter struct {\n\tpercentage int\n\n\tvoters []std.Address\n\tyes int\n\tno int\n}\n\nfunc (pv *PercentageVoter) IsAccepted(voters []std.Address) bool {\n\tif len(voters) == 0 {\n\t\treturn true // special case\n\t}\n\n\treturn pv.percent(voters) \u003e= pv.percentage\n}\n\nfunc (pv *PercentageVoter) IsFinished(voters []std.Address) bool {\n\treturn pv.yes+pv.no \u003e= len(voters)\n}\n\nfunc (pv *PercentageVoter) Status(voters []std.Address) string {\n\treturn ufmt.Sprintf(\"YES: %d, NO: %d, percent: %d, members: %d\", pv.yes, pv.no, pv.percent(voters), len(voters))\n}\n\nfunc (pv *PercentageVoter) Vote(voters []std.Address, caller std.Address, flag string) {\n\tif pv.IsFinished(voters) {\n\t\tpanic(msgNoMoreVotesAllowed)\n\t}\n\n\tif pv.alreadyVoted(caller) {\n\t\tpanic(msgAlreadyVoted)\n\t}\n\n\tswitch flag {\n\tcase yay:\n\t\tpv.yes++\n\t\tpv.voters = append(pv.voters, caller)\n\tcase nay:\n\t\tpv.no++\n\t\tpv.voters = append(pv.voters, caller)\n\tdefault:\n\t\tpanic(msgWrongVotingValue)\n\t}\n}\n\nfunc (pv *PercentageVoter) percent(voters []std.Address) int {\n\tif len(voters) == 0 {\n\t\treturn 0\n\t}\n\n\treturn int((float32(pv.yes) / float32(len(voters))) * 100)\n}\n\nfunc (pv *PercentageVoter) alreadyVoted(addr std.Address) bool {\n\tfor _, v := range pv.voters {\n\t\tif v == addr {\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"validators","path":"gno.land/r/sys/validators","files":[{"name":"doc.gno","body":"// Package validators implements the on-chain validator set management through Proof of Contribution.\n// The Realm exposes only a public executor for govdao proposals, that can suggest validator set changes.\npackage validators\n"},{"name":"gnosdk.gno","body":"package validators\n\nimport (\n\t\"gno.land/p/sys/validators\"\n)\n\n// GetChanges returns the validator changes stored on the realm, since the given block number.\n// This function is intended to be called by gno.land through the GnoSDK\nfunc GetChanges(from int64) []validators.Validator {\n\tvalsetChanges := make([]validators.Validator, 0)\n\n\t// Gather the changes from the specified block\n\tchanges.Iterate(getBlockID(from), \"\", func(_ string, value interface{}) bool {\n\t\tchs := value.([]change)\n\n\t\tfor _, ch := range chs {\n\t\t\tvalsetChanges = append(valsetChanges, ch.validator)\n\t\t}\n\n\t\treturn false\n\t})\n\n\treturn valsetChanges\n}\n"},{"name":"init.gno","body":"package validators\n\nimport (\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/nt/poa\"\n)\n\nfunc init() {\n\t// The default valset protocol is PoA\n\tvp = poa.NewPoA()\n\n\t// No changes to apply initially\n\tchanges = avl.NewTree()\n}\n"},{"name":"poc.gno","body":"package validators\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/gov/proposal\"\n\t\"gno.land/p/sys/validators\"\n)\n\nconst daoPkgPath = \"gno.land/r/gov/dao\"\n\nconst (\n\terrNoChangesProposed = \"no set changes proposed\"\n\terrNotGovDAO = \"caller not govdao executor\"\n)\n\n// NewPropExecutor creates a new executor that wraps a changes closure\n// proposal. This wrapper is required to ensure the GovDAO Realm actually\n// executed the callback.\n//\n// Concept adapted from:\n// https://github.com/gnolang/gno/pull/1945\nfunc NewPropExecutor(changesFn func() []validators.Validator) proposal.Executor {\n\tif changesFn == nil {\n\t\tpanic(errNoChangesProposed)\n\t}\n\n\tcallback := func() error {\n\t\t// Make sure the GovDAO executor runs the valset changes\n\t\tassertGovDAOCaller()\n\n\t\tfor _, change := range changesFn() {\n\t\t\tif change.VotingPower == 0 {\n\t\t\t\t// This change request is to remove the validator\n\t\t\t\tremoveValidator(change.Address)\n\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// This change request is to add the validator\n\t\t\taddValidator(change)\n\t\t}\n\n\t\treturn nil\n\t}\n\n\treturn proposal.NewExecutor(callback)\n}\n\n// assertGovDAOCaller verifies the caller is the GovDAO executor\nfunc assertGovDAOCaller() {\n\tif std.PrevRealm().PkgPath() != daoPkgPath {\n\t\tpanic(errNotGovDAO)\n\t}\n}\n\n// IsValidator returns a flag indicating if the given bech32 address\n// is part of the validator set\nfunc IsValidator(addr std.Address) bool {\n\treturn vp.IsValidator(addr)\n}\n\n// GetValidators returns the typed validator set\nfunc GetValidators() []validators.Validator {\n\treturn vp.GetValidators()\n}\n"},{"name":"validators.gno","body":"package validators\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/seqid\"\n\t\"gno.land/p/demo/ufmt\"\n\t\"gno.land/p/sys/validators\"\n)\n\nvar (\n\tvp validators.ValsetProtocol // p is the underlying validator set protocol\n\tchanges *avl.Tree // changes holds any valset changes; seqid(block number) -\u003e []change\n)\n\n// change represents a single valset change, tied to a specific block number\ntype change struct {\n\tblockNum int64 // the block number associated with the valset change\n\tvalidator validators.Validator // the validator update\n}\n\n// addValidator adds a new validator to the validator set.\n// If the validator is already present, the method errors out\nfunc addValidator(validator validators.Validator) {\n\tval, err := vp.AddValidator(validator.Address, validator.PubKey, validator.VotingPower)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\t// Validator added, note the change\n\tch := change{\n\t\tblockNum: std.GetHeight(),\n\t\tvalidator: val,\n\t}\n\n\tsaveChange(ch)\n\n\t// Emit the validator set change\n\tstd.Emit(validators.ValidatorAddedEvent)\n}\n\n// removeValidator removes the given validator from the set.\n// If the validator is not present in the set, the method errors out\nfunc removeValidator(address std.Address) {\n\tval, err := vp.RemoveValidator(address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\t// Validator removed, note the change\n\tch := change{\n\t\tblockNum: std.GetHeight(),\n\t\tvalidator: validators.Validator{\n\t\t\tAddress: val.Address,\n\t\t\tPubKey: val.PubKey,\n\t\t\tVotingPower: 0, // nullified the voting power indicates removal\n\t\t},\n\t}\n\n\tsaveChange(ch)\n\n\t// Emit the validator set change\n\tstd.Emit(validators.ValidatorRemovedEvent)\n}\n\n// saveChange saves the valset change\nfunc saveChange(ch change) {\n\tid := getBlockID(ch.blockNum)\n\n\tsetRaw, exists := changes.Get(id)\n\tif !exists {\n\t\tchanges.Set(id, []change{ch})\n\n\t\treturn\n\t}\n\n\t// Save the change\n\tset := setRaw.([]change)\n\tset = append(set, ch)\n\n\tchanges.Set(id, set)\n}\n\n// getBlockID converts the block number to a sequential ID\nfunc getBlockID(blockNum int64) string {\n\treturn seqid.ID(uint64(blockNum)).String()\n}\n\nfunc Render(_ string) string {\n\tvar (\n\t\tsize = changes.Size()\n\t\tmaxDisplay = 10\n\t)\n\n\tif size == 0 {\n\t\treturn \"No valset changes to apply.\"\n\t}\n\n\toutput := \"Valset changes:\\n\"\n\tchanges.ReverseIterateByOffset(size-maxDisplay, maxDisplay, func(_ string, value interface{}) bool {\n\t\tchs := value.([]change)\n\n\t\tfor _, ch := range chs {\n\t\t\toutput += ufmt.Sprintf(\n\t\t\t\t\"- #%d: %s (%d)\\n\",\n\t\t\t\tch.blockNum,\n\t\t\t\tch.validator.Address.String(),\n\t\t\t\tch.validator.VotingPower,\n\t\t\t)\n\t\t}\n\n\t\treturn false\n\t})\n\n\treturn output\n}\n"},{"name":"validators_test.gno","body":"package validators\n\nimport (\n\t\"testing\"\n\n\t\"std\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/p/demo/uassert\"\n\t\"gno.land/p/demo/ufmt\"\n\t\"gno.land/p/sys/validators\"\n)\n\n// generateTestValidators generates a dummy validator set\nfunc generateTestValidators(count int) []validators.Validator {\n\tvals := make([]validators.Validator, 0, count)\n\n\tfor i := 0; i \u003c count; i++ {\n\t\tval := validators.Validator{\n\t\t\tAddress: testutils.TestAddress(ufmt.Sprintf(\"%d\", i)),\n\t\t\tPubKey: \"public-key\",\n\t\t\tVotingPower: 10,\n\t\t}\n\n\t\tvals = append(vals, val)\n\t}\n\n\treturn vals\n}\n\nfunc TestValidators_AddRemove(t *testing.T) {\n\t// Clear any changes\n\tchanges = avl.NewTree()\n\n\tvar (\n\t\tvals = generateTestValidators(100)\n\t\tinitialHeight = int64(123)\n\t)\n\n\t// Add in the validators\n\tfor _, val := range vals {\n\t\taddValidator(val)\n\n\t\t// Make sure the validator is added\n\t\tuassert.True(t, vp.IsValidator(val.Address))\n\n\t\tstd.TestSkipHeights(1)\n\t}\n\n\tfor i := initialHeight; i \u003c initialHeight+int64(len(vals)); i++ {\n\t\t// Make sure the changes are saved\n\t\tchs := GetChanges(i)\n\n\t\t// We use the funky index calculation to make sure\n\t\t// changes are properly handled for each block span\n\t\tuassert.Equal(t, initialHeight+int64(len(vals))-i, int64(len(chs)))\n\n\t\tfor index, val := range vals[i-initialHeight:] {\n\t\t\t// Make sure the changes are equal to the additions\n\t\t\tch := chs[index]\n\n\t\t\tuassert.Equal(t, val.Address, ch.Address)\n\t\t\tuassert.Equal(t, val.PubKey, ch.PubKey)\n\t\t\tuassert.Equal(t, val.VotingPower, ch.VotingPower)\n\t\t}\n\t}\n\n\t// Save the beginning height for the removal\n\tinitialRemoveHeight := std.GetHeight()\n\n\t// Clear any changes\n\tchanges = avl.NewTree()\n\n\t// Remove the validators\n\tfor _, val := range vals {\n\t\tremoveValidator(val.Address)\n\n\t\t// Make sure the validator is removed\n\t\tuassert.False(t, vp.IsValidator(val.Address))\n\n\t\tstd.TestSkipHeights(1)\n\t}\n\n\tfor i := initialRemoveHeight; i \u003c initialRemoveHeight+int64(len(vals)); i++ {\n\t\t// Make sure the changes are saved\n\t\tchs := GetChanges(i)\n\n\t\t// We use the funky index calculation to make sure\n\t\t// changes are properly handled for each block span\n\t\tuassert.Equal(t, initialRemoveHeight+int64(len(vals))-i, int64(len(chs)))\n\n\t\tfor index, val := range vals[i-initialRemoveHeight:] {\n\t\t\t// Make sure the changes are equal to the additions\n\t\t\tch := chs[index]\n\n\t\t\tuassert.Equal(t, val.Address, ch.Address)\n\t\t\tuassert.Equal(t, val.PubKey, ch.PubKey)\n\t\t\tuassert.Equal(t, uint64(0), ch.VotingPower)\n\t\t}\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"valopers","path":"gno.land/r/gnoland/valopers","files":[{"name":"init.gno","body":"package valopers\n\nimport \"gno.land/p/demo/avl\"\n\nfunc init() {\n\tvalopers = avl.NewTree()\n}\n"},{"name":"valopers.gno","body":"// Package valopers is designed around the permissionless lifecycle of valoper profiles.\n// It also includes parts designed for govdao to propose valset changes based on registered valopers.\npackage valopers\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/ufmt\"\n\tpVals \"gno.land/p/sys/validators\"\n\tgovdao \"gno.land/r/gov/dao\"\n\t\"gno.land/r/sys/validators\"\n)\n\nconst (\n\terrValoperExists = \"valoper already exists\"\n\terrValoperMissing = \"valoper does not exist\"\n\terrInvalidAddressUpdate = \"valoper updated address exists\"\n\terrValoperNotCaller = \"valoper is not the caller\"\n)\n\n// valopers keeps track of all the active validator operators\nvar valopers *avl.Tree // Address -\u003e Valoper\n\n// Valoper represents a validator operator profile\ntype Valoper struct {\n\tName string // the display name of the valoper\n\tDescription string // the description of the valoper\n\n\tAddress std.Address // The bech32 gno address of the validator\n\tPubKey string // the bech32 public key of the validator\n\tP2PAddresses []string // the publicly reachable P2P addresses of the validator\n\tActive bool // flag indicating if the valoper is active\n}\n\n// Register registers a new valoper\nfunc Register(v Valoper) {\n\t// Check if the valoper is already registered\n\tif isValoper(v.Address) {\n\t\tpanic(errValoperExists)\n\t}\n\n\t// TODO add address derivation from public key\n\t// (when the laws of gno make it possible)\n\n\t// Save the valoper to the set\n\tvalopers.Set(v.Address.String(), v)\n}\n\n// Update updates an existing valoper\nfunc Update(address std.Address, v Valoper) {\n\t// Check if the valoper is present\n\tif !isValoper(address) {\n\t\tpanic(errValoperMissing)\n\t}\n\n\t// Check that the valoper wouldn't be\n\t// overwriting an existing one\n\tisAddressUpdate := address != v.Address\n\tif isAddressUpdate \u0026\u0026 isValoper(v.Address) {\n\t\tpanic(errInvalidAddressUpdate)\n\t}\n\n\t// Remove the old valoper info\n\t// in case the address changed\n\tif address != v.Address {\n\t\tvalopers.Remove(address.String())\n\t}\n\n\t// Save the new valoper info\n\tvalopers.Set(v.Address.String(), v)\n}\n\n// GetByAddr fetches the valoper using the address, if present\nfunc GetByAddr(address std.Address) Valoper {\n\tvaloperRaw, exists := valopers.Get(address.String())\n\tif !exists {\n\t\tpanic(errValoperMissing)\n\t}\n\n\treturn valoperRaw.(Valoper)\n}\n\n// Render renders the current valoper set\nfunc Render(_ string) string {\n\tif valopers.Size() == 0 {\n\t\treturn \"No valopers to display.\"\n\t}\n\n\toutput := \"Valset changes to apply:\\n\"\n\tvalopers.Iterate(\"\", \"\", func(_ string, value interface{}) bool {\n\t\tvaloper := value.(Valoper)\n\n\t\toutput += valoper.Render()\n\n\t\treturn false\n\t})\n\n\treturn output\n}\n\n// Render renders a single valoper with their information\nfunc (v Valoper) Render() string {\n\toutput := ufmt.Sprintf(\"## %s\\n\", v.Name)\n\toutput += ufmt.Sprintf(\"%s\\n\\n\", v.Description)\n\toutput += ufmt.Sprintf(\"- Address: %s\\n\", v.Address.String())\n\toutput += ufmt.Sprintf(\"- PubKey: %s\\n\", v.PubKey)\n\toutput += \"- P2P Addresses: [\\n\"\n\n\tif len(v.P2PAddresses) == 0 {\n\t\toutput += \"]\\n\"\n\n\t\treturn output\n\t}\n\n\tfor index, addr := range v.P2PAddresses {\n\t\toutput += addr\n\n\t\tif index == len(v.P2PAddresses)-1 {\n\t\t\toutput += \"]\\n\"\n\n\t\t\tcontinue\n\t\t}\n\n\t\toutput += \",\\n\"\n\t}\n\n\treturn output\n}\n\n// isValoper checks if the valoper exists\nfunc isValoper(address std.Address) bool {\n\t_, exists := valopers.Get(address.String())\n\n\treturn exists\n}\n\n// GovDAOProposal creates a proposal to the GovDAO\n// for adding the given valoper to the validator set.\n// This function is meant to serve as a helper\n// for generating the govdao proposal\nfunc GovDAOProposal(address std.Address) {\n\tvar (\n\t\tvaloper = GetByAddr(address)\n\t\tvotingPower = uint64(1)\n\t)\n\n\t// Make sure the valoper is the caller\n\tif std.GetOrigCaller() != address {\n\t\tpanic(errValoperNotCaller)\n\t}\n\n\t// Determine the voting power\n\tif !valoper.Active {\n\t\tvotingPower = uint64(0)\n\t}\n\n\tchangesFn := func() []pVals.Validator {\n\t\treturn []pVals.Validator{\n\t\t\t{\n\t\t\t\tAddress: valoper.Address,\n\t\t\t\tPubKey: valoper.PubKey,\n\t\t\t\tVotingPower: votingPower,\n\t\t\t},\n\t\t}\n\t}\n\n\t// Create the executor\n\texecutor := validators.NewPropExecutor(changesFn)\n\n\t// Craft the proposal comment\n\tcomment := ufmt.Sprintf(\n\t\t\"Proposal to add valoper %s (Address: %s; PubKey: %s) to the valset\",\n\t\tvaloper.Name,\n\t\tvaloper.Address.String(),\n\t\tvaloper.PubKey,\n\t)\n\n\t// Create the govdao proposal\n\tgovdao.Propose(comment, executor)\n}\n"},{"name":"valopers_test.gno","body":"package valopers\n\nimport (\n\t\"testing\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/p/demo/uassert\"\n)\n\nfunc TestValopers_Register(t *testing.T) {\n\tt.Parallel()\n\n\tt.Run(\"already a valoper\", func(t *testing.T) {\n\t\tt.Parallel()\n\n\t\t// Clear the set for the test\n\t\tvalopers = avl.NewTree()\n\n\t\tv := Valoper{\n\t\t\tAddress: testutils.TestAddress(\"valoper\"),\n\t\t}\n\n\t\t// Add the valoper\n\t\tvalopers.Set(v.Address.String(), v)\n\n\t\tuassert.PanicsWithMessage(t, errValoperExists, func() {\n\t\t\tRegister(v)\n\t\t})\n\t})\n\n\tt.Run(\"successful registration\", func(t *testing.T) {\n\t\tt.Parallel()\n\n\t\t// Clear the set for the test\n\t\tvalopers = avl.NewTree()\n\n\t\tv := Valoper{\n\t\t\tAddress: testutils.TestAddress(\"valoper\"),\n\t\t\tName: \"new valoper\",\n\t\t\tPubKey: \"pub key\",\n\t\t}\n\n\t\tuassert.NotPanics(t, func() {\n\t\t\tRegister(v)\n\t\t})\n\n\t\tuassert.NotPanics(t, func() {\n\t\t\tvaloper := GetByAddr(v.Address)\n\n\t\t\tuassert.Equal(t, v.Address, valoper.Address)\n\t\t\tuassert.Equal(t, v.Name, valoper.Name)\n\t\t\tuassert.Equal(t, v.PubKey, valoper.PubKey)\n\t\t})\n\t})\n}\n\nfunc TestValopers_Update(t *testing.T) {\n\tt.Parallel()\n\n\tt.Run(\"non-existing valoper\", func(t *testing.T) {\n\t\tt.Parallel()\n\n\t\t// Clear the set for the test\n\t\tvalopers = avl.NewTree()\n\n\t\tv := Valoper{}\n\n\t\t// Update the valoper\n\t\tuassert.PanicsWithMessage(t, errValoperMissing, func() {\n\t\t\tUpdate(v.Address, v)\n\t\t})\n\t})\n\n\tt.Run(\"overwrite valoper\", func(t *testing.T) {\n\t\tt.Parallel()\n\n\t\t// Clear the set for the test\n\t\tvalopers = avl.NewTree()\n\n\t\tone := Valoper{\n\t\t\tAddress: testutils.TestAddress(\"valoper 1\"),\n\t\t}\n\n\t\t// Add the valoper\n\t\tuassert.NotPanics(t, func() {\n\t\t\tRegister(one)\n\t\t})\n\n\t\tinitialAddress := testutils.TestAddress(\"valoper 2\")\n\t\ttwo := Valoper{\n\t\t\tAddress: initialAddress,\n\t\t}\n\n\t\t// Add the valoper\n\t\tuassert.NotPanics(t, func() {\n\t\t\tRegister(two)\n\t\t})\n\n\t\t// Update the valoper address\n\t\t// so it overlaps\n\t\ttwo = Valoper{\n\t\t\tAddress: one.Address,\n\t\t}\n\n\t\t// Update the valoper\n\t\tuassert.PanicsWithMessage(t, errInvalidAddressUpdate, func() {\n\t\t\tUpdate(initialAddress, two)\n\t\t})\n\t})\n\n\tt.Run(\"successful update\", func(t *testing.T) {\n\t\tt.Parallel()\n\n\t\t// Clear the set for the test\n\t\tvalopers = avl.NewTree()\n\n\t\tvar (\n\t\t\tname = \"new valoper\"\n\t\t\tv = Valoper{\n\t\t\t\tAddress: testutils.TestAddress(\"valoper\"),\n\t\t\t\tName: name,\n\t\t\t\tPubKey: \"pub key\",\n\t\t\t}\n\t\t)\n\n\t\t// Add the valoper\n\t\tuassert.NotPanics(t, func() {\n\t\t\tRegister(v)\n\t\t})\n\n\t\t// Update the valoper name\n\t\tv.Name = \"new name\"\n\t\tv.Active = false\n\n\t\t// Update the valoper\n\t\tuassert.NotPanics(t, func() {\n\t\t\tUpdate(v.Address, v)\n\t\t})\n\n\t\t// Make sure the valoper is updated\n\t\tuassert.NotPanics(t, func() {\n\t\t\tvaloper := GetByAddr(v.Address)\n\n\t\t\tuassert.Equal(t, v.Name, valoper.Name)\n\t\t\tuassert.Equal(t, v.Active, valoper.Active)\n\t\t})\n\t})\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"config","path":"gno.land/r/leon/config","files":[{"name":"config.gno","body":"package config\n\nimport (\n\t\"errors\"\n\t\"std\"\n)\n\nvar (\n\tmain std.Address // leon's main address\n\tbackup std.Address // backup address\n)\n\nfunc init() {\n\tmain = \"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5\"\n}\n\nfunc Address() std.Address {\n\treturn main\n}\n\nfunc Backup() std.Address {\n\treturn backup\n}\n\nfunc SetAddress(a std.Address) error {\n\tif !a.IsValid() {\n\t\treturn errors.New(\"config: invalid address\")\n\t}\n\n\tif err := checkAuthorized(); err != nil {\n\t\treturn err\n\t}\n\n\tmain = a\n\treturn nil\n}\n\nfunc SetBackup(a std.Address) error {\n\tif !a.IsValid() {\n\t\treturn errors.New(\"config: invalid address\")\n\t}\n\n\tif err := checkAuthorized(); err != nil {\n\t\treturn err\n\t}\n\n\tbackup = a\n\treturn nil\n}\n\nfunc checkAuthorized() error {\n\tcaller := std.PrevRealm().Addr()\n\tif caller != main || caller != backup {\n\t\treturn errors.New(\"config: unauthorized\")\n\t}\n\n\treturn nil\n}\n\nfunc AssertAuthorized() {\n\tcaller := std.PrevRealm().Addr()\n\tif caller != main || caller != backup {\n\t\tpanic(\"config: unauthorized\")\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"home","path":"gno.land/r/leon/home","files":[{"name":"home.gno","body":"package home\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\n\t\"gno.land/p/demo/ufmt\"\n\n\t\"gno.land/r/demo/art/gnoface\"\n\t\"gno.land/r/demo/art/millipede\"\n\t\"gno.land/r/leon/config\"\n)\n\nvar (\n\tpfp string // link to profile picture\n\tpfpCaption string // profile picture caption\n\tabtMe [2]string\n)\n\nfunc init() {\n\tpfp = \"https://i.imgflip.com/91vskx.jpg\"\n\tpfpCaption = \"[My favourite painting \u0026 pfp](https://en.wikipedia.org/wiki/Wanderer_above_the_Sea_of_Fog)\"\n\tabtMe = [2]string{\n\t\t`### About me\nHi, I'm Leon, a DevRel Engineer at gno.land. I am a tech enthusiast, \nlife-long learner, and sharer of knowledge.`,\n\t\t`### Contributions\nMy contributions to gno.land can mainly be found \n[here](https://github.com/gnolang/gno/issues?q=sort:updated-desc+author:leohhhn).\n\nTODO import r/gh\n`,\n\t}\n}\n\nfunc UpdatePFP(url, caption string) {\n\tconfig.AssertAuthorized()\n\tpfp = url\n\tpfpCaption = caption\n}\n\nfunc UpdateAboutMe(col1, col2 string) {\n\tconfig.AssertAuthorized()\n\tabtMe[0] = col1\n\tabtMe[1] = col2\n}\n\nfunc Render(path string) string {\n\tout := \"# Leon's Homepage\\n\\n\"\n\n\tout += renderAboutMe()\n\tout += renderBlogPosts()\n\tout += \"\\n\\n\"\n\tout += renderArt()\n\n\treturn out\n}\n\nfunc renderBlogPosts() string {\n\tout := \"\"\n\t//out += \"## Leon's Blog Posts\"\n\n\t// todo fetch blog posts authored by @leohhhn\n\t// and render them\n\treturn out\n}\n\nfunc renderAboutMe() string {\n\tout := \"\u003cdiv class='columns-3'\u003e\"\n\n\tout += \"\u003cdiv\u003e\\n\\n\"\n\tout += ufmt.Sprintf(\"![my profile pic](%s)\\n\\n%s\\n\\n\", pfp, pfpCaption)\n\tout += \"\u003c/div\u003e\\n\\n\"\n\n\tout += \"\u003cdiv\u003e\\n\\n\"\n\tout += abtMe[0] + \"\\n\\n\"\n\tout += \"\u003c/div\u003e\\n\\n\"\n\n\tout += \"\u003cdiv\u003e\\n\\n\"\n\tout += abtMe[1] + \"\\n\\n\"\n\tout += \"\u003c/div\u003e\\n\\n\"\n\n\tout += \"\u003c/div\u003e\u003c!-- /columns-3 --\u003e\\n\\n\"\n\n\treturn out\n}\n\nfunc renderArt() string {\n\tout := `\u003cdiv class=\"jumbotron\"\u003e` + \"\\n\\n\"\n\tout += \"# Gno Art\\n\\n\"\n\n\tout += \"\u003cdiv class='columns-3'\u003e\"\n\n\tout += renderGnoFace()\n\tout += renderMillipede()\n\tout += \"Empty spot :/\"\n\n\tout += \"\u003c/div\u003e\u003c!-- /columns-3 --\u003e\\n\\n\"\n\n\tout += \"This art is dynamic; it will change with every new block.\\n\\n\"\n\tout += `\u003c/div\u003e\u003c!-- /jumbotron --\u003e` + \"\\n\"\n\n\treturn out\n}\n\nfunc renderGnoFace() string {\n\tout := \"\u003cdiv\u003e\\n\\n\"\n\tout += gnoface.Render(strconv.Itoa(int(std.GetHeight())))\n\tout += \"\u003c/div\u003e\\n\\n\"\n\n\treturn out\n}\n\nfunc renderMillipede() string {\n\tout := \"\u003cdiv\u003e\\n\\n\"\n\tout += \"Millipede\\n\\n\"\n\tout += \"```\\n\" + millipede.Draw(int(std.GetHeight())%10+1) + \"```\\n\"\n\tout += \"\u003c/div\u003e\\n\\n\"\n\n\treturn out\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"home","path":"gno.land/r/manfred/home","files":[{"name":"home.gno","body":"package home\n\nfunc Render(path string) string {\n\treturn \"Moved to r/moul\"\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"guestbook","path":"gno.land/r/morgan/guestbook","files":[{"name":"admin.gno","body":"package guestbook\n\nimport (\n\t\"gno.land/p/demo/ownable\"\n\t\"gno.land/p/demo/seqid\"\n)\n\nvar owner = ownable.New()\n\n// AdminDelete removes the guestbook message with the given ID.\n// The user will still be marked as having submitted a message, so they\n// won't be able to re-submit a new message.\nfunc AdminDelete(signatureID string) {\n\towner.AssertCallerIsOwner()\n\n\tid, err := seqid.FromString(signatureID)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tidb := id.Binary()\n\tif !guestbook.Has(idb) {\n\t\tpanic(\"signature does not exist\")\n\t}\n\tguestbook.Remove(idb)\n}\n"},{"name":"guestbook.gno","body":"// Realm guestbook contains an implementation of a simple guestbook.\n// Come and sign yourself up!\npackage guestbook\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\t\"unicode\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/seqid\"\n)\n\n// Signature is a single entry in the guestbook.\ntype Signature struct {\n\tMessage string\n\tAuthor std.Address\n\tTime time.Time\n}\n\nconst (\n\tmaxMessageLength = 140\n\tmaxPerPage = 25\n)\n\nvar (\n\tsignatureID seqid.ID\n\tguestbook avl.Tree // id -\u003e Signature\n\thasSigned avl.Tree // address -\u003e struct{}\n)\n\nfunc init() {\n\tSign(\"You reached the end of the guestbook!\")\n}\n\nconst (\n\terrNotAUser = \"this guestbook can only be signed by users\"\n\terrAlreadySigned = \"you already signed the guestbook!\"\n\terrInvalidCharacterInMessage = \"invalid character in message\"\n)\n\n// Sign signs the guestbook, with the specified message.\nfunc Sign(message string) {\n\tprev := std.PrevRealm()\n\tswitch {\n\tcase !prev.IsUser():\n\t\tpanic(errNotAUser)\n\tcase hasSigned.Has(prev.Addr().String()):\n\t\tpanic(errAlreadySigned)\n\t}\n\tmessage = validateMessage(message)\n\n\tguestbook.Set(signatureID.Next().Binary(), Signature{\n\t\tMessage: message,\n\t\tAuthor: prev.Addr(),\n\t\t// NOTE: time.Now() will yield the \"block time\", which is deterministic.\n\t\tTime: time.Now(),\n\t})\n\thasSigned.Set(prev.Addr().String(), struct{}{})\n}\n\nfunc validateMessage(msg string) string {\n\tif len(msg) \u003e maxMessageLength {\n\t\tpanic(\"Keep it brief! (max \" + strconv.Itoa(maxMessageLength) + \" bytes!)\")\n\t}\n\tout := \"\"\n\tfor _, ch := range msg {\n\t\tswitch {\n\t\tcase unicode.IsLetter(ch),\n\t\t\tunicode.IsNumber(ch),\n\t\t\tunicode.IsSpace(ch),\n\t\t\tunicode.IsPunct(ch):\n\t\t\tout += string(ch)\n\t\tdefault:\n\t\t\tpanic(errInvalidCharacterInMessage)\n\t\t}\n\t}\n\treturn out\n}\n\nfunc Render(maxID string) string {\n\tvar bld strings.Builder\n\n\tbld.WriteString(\"# Guestbook 📝\\n\\n[Come sign the guestbook!](./guestbook?help\u0026__func=Sign)\\n\\n---\\n\\n\")\n\n\tvar maxIDBinary string\n\tif maxID != \"\" {\n\t\tmid, err := seqid.FromString(maxID)\n\t\tif err != nil {\n\t\t\tpanic(err)\n\t\t}\n\n\t\t// AVL iteration is exclusive, so we need to decrease the ID value to get the \"true\" maximum.\n\t\tmid--\n\t\tmaxIDBinary = mid.Binary()\n\t}\n\n\tvar lastID seqid.ID\n\tvar printed int\n\tguestbook.ReverseIterate(\"\", maxIDBinary, func(key string, val interface{}) bool {\n\t\tsig := val.(Signature)\n\t\tmessage := strings.ReplaceAll(sig.Message, \"\\n\", \"\\n\u003e \")\n\t\tbld.WriteString(\"\u003e \" + message + \"\\n\u003e\\n\")\n\t\tidValue, ok := seqid.FromBinary(key)\n\t\tif !ok {\n\t\t\tpanic(\"invalid seqid id\")\n\t\t}\n\n\t\tbld.WriteString(\"\u003e _Written by \" + sig.Author.String() + \" at \" + sig.Time.Format(time.DateTime) + \"_ (#\" + idValue.String() + \")\\n\\n---\\n\\n\")\n\t\tlastID = idValue\n\n\t\tprinted++\n\t\t// stop after exceeding limit\n\t\treturn printed \u003e= maxPerPage\n\t})\n\n\tif printed == 0 {\n\t\tbld.WriteString(\"No messages!\")\n\t} else if printed \u003e= maxPerPage {\n\t\tbld.WriteString(\"\u003cp style='text-align:right'\u003e\u003ca href='./guestbook:\" + lastID.String() + \"'\u003eNext page\u003c/a\u003e\u003c/p\u003e\")\n\t}\n\n\treturn bld.String()\n}\n"},{"name":"guestbook_test.gno","body":"package guestbook\n\nimport (\n\t\"std\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/ownable\"\n)\n\nfunc TestSign(t *testing.T) {\n\tguestbook = avl.Tree{}\n\thasSigned = avl.Tree{}\n\n\tstd.TestSetRealm(std.NewUserRealm(\"g1user\"))\n\tSign(\"Hello!\")\n\n\tstd.TestSetRealm(std.NewUserRealm(\"g1user2\"))\n\tSign(\"Hello2!\")\n\n\tres := Render(\"\")\n\tt.Log(res)\n\tif !strings.Contains(res, \"\u003e Hello!\\n\u003e\\n\u003e _Written by g1user \") {\n\t\tt.Error(\"does not contain first user's message\")\n\t}\n\tif !strings.Contains(res, \"\u003e Hello2!\\n\u003e\\n\u003e _Written by g1user2 \") {\n\t\tt.Error(\"does not contain second user's message\")\n\t}\n\tif guestbook.Size() != 2 {\n\t\tt.Error(\"invalid guestbook size\")\n\t}\n}\n\nfunc TestSign_FromRealm(t *testing.T) {\n\tstd.TestSetRealm(std.NewCodeRealm(\"gno.land/r/demo/users\"))\n\n\tdefer func() {\n\t\trec := recover()\n\t\tif rec == nil {\n\t\t\tt.Fatal(\"expected panic\")\n\t\t}\n\t\trecString, ok := rec.(string)\n\t\tif !ok {\n\t\t\tt.Fatal(\"not a string\", rec)\n\t\t} else if recString != errNotAUser {\n\t\t\tt.Fatal(\"invalid error\", recString)\n\t\t}\n\t}()\n\tSign(\"Hey!\")\n}\n\nfunc TestSign_Double(t *testing.T) {\n\t// Should not allow signing twice.\n\tguestbook = avl.Tree{}\n\thasSigned = avl.Tree{}\n\n\tstd.TestSetRealm(std.NewUserRealm(\"g1user\"))\n\tSign(\"Hello!\")\n\n\tdefer func() {\n\t\trec := recover()\n\t\tif rec == nil {\n\t\t\tt.Fatal(\"expected panic\")\n\t\t}\n\t\trecString, ok := rec.(string)\n\t\tif !ok {\n\t\t\tt.Error(\"type assertion failed\", rec)\n\t\t} else if recString != errAlreadySigned {\n\t\t\tt.Error(\"invalid error message\", recString)\n\t\t}\n\t}()\n\n\tSign(\"Hello again!\")\n}\n\nfunc TestSign_InvalidMessage(t *testing.T) {\n\t// Should not allow control characters in message.\n\tguestbook = avl.Tree{}\n\thasSigned = avl.Tree{}\n\n\tstd.TestSetRealm(std.NewUserRealm(\"g1user\"))\n\n\tdefer func() {\n\t\trec := recover()\n\t\tif rec == nil {\n\t\t\tt.Fatal(\"expected panic\")\n\t\t}\n\t\trecString, ok := rec.(string)\n\t\tif !ok {\n\t\t\tt.Error(\"type assertion failed\", rec)\n\t\t} else if recString != errInvalidCharacterInMessage {\n\t\t\tt.Error(\"invalid error message\", recString)\n\t\t}\n\t}()\n\tSign(\"\\x00Hello!\")\n}\n\nfunc TestAdminDelete(t *testing.T) {\n\tconst (\n\t\tuserAddr std.Address = \"g1user\"\n\t\tadminAddr std.Address = \"g1admin\"\n\t)\n\n\tguestbook = avl.Tree{}\n\thasSigned = avl.Tree{}\n\towner = ownable.NewWithAddress(adminAddr)\n\tsignatureID = 0\n\n\tstd.TestSetRealm(std.NewUserRealm(userAddr))\n\n\tconst bad = \"Very Bad Message! Nyeh heh heh!\"\n\tSign(bad)\n\n\tif rnd := Render(\"\"); !strings.Contains(rnd, bad) {\n\t\tt.Fatal(\"render does not contain bad message\", rnd)\n\t}\n\n\tstd.TestSetRealm(std.NewUserRealm(adminAddr))\n\tAdminDelete(signatureID.String())\n\n\tif rnd := Render(\"\"); strings.Contains(rnd, bad) {\n\t\tt.Error(\"render contains bad message\", rnd)\n\t}\n\tif guestbook.Size() != 0 {\n\t\tt.Error(\"invalid guestbook size\")\n\t}\n\tif hasSigned.Size() != 1 {\n\t\tt.Error(\"invalid hasSigned size\")\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"home","path":"gno.land/r/morgan/home","files":[{"name":"home.gno","body":"package home\n\nconst staticHome = `# morgan's (gn)home\n\n- [📝 sign my guestbook](/r/morgan/guestbook)\n`\n\nfunc Render(path string) string {\n\treturn staticHome\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"config","path":"gno.land/r/moul/config","files":[{"name":"config.gno","body":"package config\n\nimport \"std\"\n\nvar addr = std.Address(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\") // @moul\n\nfunc Addr() std.Address {\n\treturn addr\n}\n\nfunc UpdateAddr(newAddr std.Address) {\n\tAssertIsAdmin()\n\taddr = newAddr\n}\n\nfunc AssertIsAdmin() {\n\tif std.GetOrigCaller() != addr {\n\t\tpanic(\"restricted area\")\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"home","path":"gno.land/r/moul/home","files":[{"name":"home.gno","body":"package home\n\nimport \"gno.land/r/moul/config\"\n\nvar (\n\ttodos []string\n\tstatus string\n\tmemeImgURL string\n)\n\nfunc init() {\n\ttodos = append(todos, \"fill this todo list...\")\n\tstatus = \"Online\" // Initial status set to \"Online\"\n\tmemeImgURL = \"https://i.imgflip.com/7ze8dc.jpg\"\n}\n\nfunc Render(path string) string {\n\tcontent := \"# Manfred's (gn)home Dashboard\\n\\n\"\n\n\tcontent += \"## Meme\\n\"\n\tcontent += \"![](\" + memeImgURL + \")\\n\\n\"\n\n\tcontent += \"## Status\\n\"\n\tcontent += status + \"\\n\\n\"\n\n\tcontent += \"## Personal ToDo List\\n\"\n\tfor _, todo := range todos {\n\t\tcontent += \"- [ ] \" + todo + \"\\n\"\n\t}\n\tcontent += \"\\n\"\n\n\t// TODO: Implement a feature to list replies on r/boards on my posts\n\t// TODO: Maybe integrate a calendar feature for upcoming events?\n\n\treturn content\n}\n\nfunc AddNewTodo(todo string) {\n\tconfig.AssertIsAdmin()\n\ttodos = append(todos, todo)\n}\n\nfunc DeleteTodo(todoIndex int) {\n\tconfig.AssertIsAdmin()\n\tif todoIndex \u003e= 0 \u0026\u0026 todoIndex \u003c len(todos) {\n\t\t// Remove the todo from the list by merging slices from before and after the todo\n\t\ttodos = append(todos[:todoIndex], todos[todoIndex+1:]...)\n\t} else {\n\t\tpanic(\"Invalid todo index\")\n\t}\n}\n\nfunc UpdateStatus(newStatus string) {\n\tconfig.AssertIsAdmin()\n\tstatus = newStatus\n}\n"},{"name":"z1_filetest.gno","body":"package main\n\nimport \"gno.land/r/moul/home\"\n\nfunc main() {\n\tprintln(home.Render(\"\"))\n}\n\n// Output:\n// # Manfred's (gn)home Dashboard\n//\n// ## Meme\n// ![](https://i.imgflip.com/7ze8dc.jpg)\n//\n// ## Status\n// Online\n//\n// ## Personal ToDo List\n// - [ ] fill this todo list...\n"},{"name":"z2_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\t\"gno.land/r/moul/home\"\n)\n\nfunc main() {\n\tstd.TestSetOrigCaller(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\")\n\thome.AddNewTodo(\"aaa\")\n\thome.AddNewTodo(\"bbb\")\n\thome.AddNewTodo(\"ccc\")\n\thome.AddNewTodo(\"ddd\")\n\thome.AddNewTodo(\"eee\")\n\thome.UpdateStatus(\"Lorem Ipsum\")\n\thome.DeleteTodo(3)\n\tprintln(home.Render(\"\"))\n}\n\n// Output:\n// # Manfred's (gn)home Dashboard\n//\n// ## Meme\n// ![](https://i.imgflip.com/7ze8dc.jpg)\n//\n// ## Status\n// Lorem Ipsum\n//\n// ## Personal ToDo List\n// - [ ] fill this todo list...\n// - [ ] aaa\n// - [ ] bbb\n// - [ ] ddd\n// - [ ] eee\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"present","path":"gno.land/r/moul/present","files":[{"name":"admin.gno","body":"package present\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/avl\"\n)\n\nvar (\n\tadminAddr std.Address\n\tmoderatorList avl.Tree\n\tinPause bool\n)\n\nfunc init() {\n\t// adminAddr = std.GetOrigCaller() // FIXME: find a way to use this from the main's genesis.\n\tadminAddr = \"g1manfred47kzduec920z88wfr64ylksmdcedlf5\"\n}\n\nfunc AdminSetAdminAddr(addr std.Address) {\n\tassertIsAdmin()\n\tadminAddr = addr\n}\n\nfunc AdminSetInPause(state bool) {\n\tassertIsAdmin()\n\tinPause = state\n}\n\nfunc AdminAddModerator(addr std.Address) {\n\tassertIsAdmin()\n\tmoderatorList.Set(addr.String(), true)\n}\n\nfunc AdminRemoveModerator(addr std.Address) {\n\tassertIsAdmin()\n\tmoderatorList.Set(addr.String(), false) // XXX: delete instead?\n}\n\nfunc ModAddPost(slug, title, body, publicationDate, authors, tags string) {\n\tassertIsModerator()\n\n\tcaller := std.GetOrigCaller()\n\ttagList := strings.Split(tags, \",\")\n\tauthorList := strings.Split(authors, \",\")\n\n\terr := b.NewPost(caller, slug, title, body, publicationDate, authorList, tagList)\n\tcheckErr(err)\n}\n\nfunc ModEditPost(slug, title, body, publicationDate, authors, tags string) {\n\tassertIsModerator()\n\n\ttagList := strings.Split(tags, \",\")\n\tauthorList := strings.Split(authors, \",\")\n\n\terr := b.GetPost(slug).Update(title, body, publicationDate, authorList, tagList)\n\tcheckErr(err)\n}\n\nfunc isAdmin(addr std.Address) bool {\n\treturn addr == adminAddr\n}\n\nfunc isModerator(addr std.Address) bool {\n\t_, found := moderatorList.Get(addr.String())\n\treturn found\n}\n\nfunc assertIsAdmin() {\n\tcaller := std.GetOrigCaller()\n\tif !isAdmin(caller) {\n\t\tpanic(\"access restricted.\")\n\t}\n}\n\nfunc assertIsModerator() {\n\tcaller := std.GetOrigCaller()\n\tif isAdmin(caller) || isModerator(caller) {\n\t\treturn\n\t}\n\tpanic(\"access restricted\")\n}\n\nfunc assertNotInPause() {\n\tif inPause {\n\t\tpanic(\"access restricted (pause)\")\n\t}\n}\n\nfunc checkErr(err error) {\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"},{"name":"present_miami23.gno","body":"package present\n\nfunc init() {\n\tpath := \"miami23\"\n\ttitle := \"Portal Loop Demo (Miami 2023)\"\n\tbody := `\nRendered by Gno.\n\n[Source (WIP)](https://github.com/gnolang/gno/pull/1176)\n\n## Portal Loop\n\n- DONE: Dynamic homepage, key pages, aliases, and redirects.\n- TODO: Deploy with history, complete worxdao v0.\n- Will replace the static gno.land site.\n- Enhances local development.\n\n[GitHub Issue](https://github.com/gnolang/gno/issues/1108)\n\n## Roadmap\n\n- Crafting the roadmap this week, open to collaboration.\n- Combining onchain (portal loop) and offchain (GitHub).\n- Next week: Unveiling the official v0 roadmap.\n\n## Teams, DAOs, Projects\n\n- Developing worxDAO contracts for directories of projects and teams.\n- GitHub teams and projects align with this structure.\n- CODEOWNER file updates coming.\n- Initial teams announced next week.\n\n## Tech Team Retreat Plan\n\n- Continue Portal Loop.\n- Consider dApp development.\n- Explore new topics [here](https://github.com/orgs/gnolang/projects/15/).\n- Engage in workshops.\n- Connect and have fun with colleagues.\n`\n\t_ = b.NewPost(adminAddr, path, title, body, \"2023-10-15T13:17:24Z\", []string{\"moul\"}, []string{\"demo\", \"portal-loop\", \"miami\"})\n}\n"},{"name":"present_miami23_filetest.gno","body":"package main\n\nimport (\n\t\"gno.land/r/moul/present\"\n)\n\nfunc main() {\n\tprintln(present.Render(\"\"))\n\tprintln(\"------------------------------------\")\n\tprintln(present.Render(\"p/miami23\"))\n}\n"},{"name":"presentations.gno","body":"package present\n\nimport (\n\t\"gno.land/p/demo/blog\"\n)\n\n// TODO: switch from p/blog to p/present\n\nvar b = \u0026blog.Blog{\n\tTitle: \"Manfred's Presentations\",\n\tPrefix: \"/r/moul/present:\",\n\tNoBreadcrumb: true,\n}\n\nfunc Render(path string) string {\n\treturn b.Render(path)\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"rewards","path":"gno.land/r/sys/rewards","files":[{"name":"rewards.gno","body":"// This package will be used to manage proof-of-contributions on the exposed smart-contract side.\npackage rewards\n\n// TODO: write specs.\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"users","path":"gno.land/r/sys/users","files":[{"name":"verify.gno","body":"package users\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/ownable\"\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = \"g1manfred47kzduec920z88wfr64ylksmdcedlf5\" // @moul\n\ntype VerifyNameFunc func(enabled bool, address std.Address, name string) bool\n\nvar (\n\towner = ownable.NewWithAddress(admin) // Package owner\n\tcheckFunc = VerifyNameByUser // Checking namespace callback\n\tenabled = false // For now this package is disabled by default\n)\n\nfunc IsEnabled() bool { return enabled }\n\n// This method ensures that the given address has ownership of the given name.\nfunc IsAuthorizedAddressForName(address std.Address, name string) bool {\n\treturn checkFunc(enabled, address, name)\n}\n\n// VerifyNameByUser checks from the `users` package that the user has correctly\n// registered the given name.\n// This function considers as valid an `address` that matches the `name`.\nfunc VerifyNameByUser(enable bool, address std.Address, name string) bool {\n\tif !enable {\n\t\treturn true\n\t}\n\n\t// Allow user with their own address as name\n\tif address.String() == name {\n\t\treturn true\n\t}\n\n\tif user := users.GetUserByName(name); user != nil {\n\t\treturn user.Address == address\n\t}\n\n\treturn false\n}\n\n// Admin calls\n\n// Enable this package.\nfunc AdminEnable() {\n\tif err := owner.CallerIsOwner(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tenabled = true\n}\n\n// Disable this package.\nfunc AdminDisable() {\n\tif err := owner.CallerIsOwner(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tenabled = false\n}\n\n// AdminUpdateVerifyCall updates the method that verifies the namespace.\nfunc AdminUpdateVerifyCall(check VerifyNameFunc) {\n\tif err := owner.CallerIsOwner(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tcheckFunc = check\n}\n\n// AdminTransferOwnership transfers the ownership to a new owner.\nfunc AdminTransferOwnership(newOwner std.Address) error {\n\tif err := owner.CallerIsOwner(); err != nil {\n\t\tpanic(err)\n\t}\n\n\treturn owner.TransferOwnership(newOwner)\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1manfred47kzduec920z88wfr64ylksmdcedlf5","send":"","pkg_path":"gno.land/r/demo/users","func":"Invite","args":["g1manfred47kzduec920z88wfr64ylksmdcedlf5:10\ng1us8428u2a5satrlxzagqqa5m6vmuze025anjlj:10\ng1589c8cekvmjfmy0qrd4f3z52r7fn7rgk02667s:1\ng13sm84nuqed3fuank8huh7x9mupgw22uft3lcl8:1\ng1m6732pkrngu9vrt0g7056lvr9kcqc4mv83xl5q:1\ng1wg88rhzlwxjd2z4j5de5v5xq30dcf6rjq3dhsj:1\ng18pmaskasz7mxj6rmgrl3al58xu45a7w0l5nmc0:1\ng19wwhkmqlns70604ksp6rkuuu42qhtvyh05lffz:1\ng187982000zsc493znqt828s90cmp6hcp2erhu6m:1\ng1ndpsnrspdnauckytvkfv8s823t3gmpqmtky8pl:1\ng16ja66d65emkr0zxd2tu7xjvm7utthyhpej0037:1\ng1ds24jj9kqjcskd0gzu24r9e4n62ggye230zuv5:1\ng1trkzq75ntamsnw9xnrav2v7gy2lt5g6p29yhdr:1\ng1rrf8s5mrmu00sx04fzfsvc399fklpeg2x0a7mz:1\ng19p5ntfvpt4lwq4jqsmnxsnelhf3tff9scy3w8w:1\ng1tue8l73d6rq4vhqdsp2sr3zhuzpure3k2rnwpz:1\ng14hhsss4ngx5kq77je5g0tl4vftg8qp45ceadk3:1\ng1768hvkh7anhd40ch4h7jdh6j3mpcs7hrat4gl0:1\ng15fa8kyjhu88t9dr8zzua8fwdvkngv5n8yqsm0n:1\ng1xhccdjcscuhgmt3quww6qdy3j3czqt3urc2eac:1\ng1z629z04f85k4t5gnkk5egpxw9tqxeec435esap:1\ng1pfldkplz9puq0v82lu9vqcve9nwrxuq9qe5ttv:1\ng152pn0g5qfgxr7yx8zlwjq48hytkafd8x7egsfv:1\ng1cf2ye686ke38vjyqakreprljum4xu6rwf5jskq:1\ng1c5shztyaj4gjrc5zlwmh9xhex5w7l4asffs2w6:1\ng1lhpx2ktk0ha3qw42raxq4m24a4c4xqxyrgv54q:1\ng1026p54q0j902059sm2zsv37krf0ghcl7gmhyv7:1\ng1n4yvwnv77frq2ccuw27dmtjkd7u4p4jg0pgm7k:1\ng13m7f2e6r3lh3ykxupacdt9sem2tlvmaamwjhll:1\ng19uxluuecjlsqvwmwu8sp6pxaaqfhk972q975xd:1\ng1j80fpcsumfkxypvydvtwtz3j4sdwr8c2u0lr64:1\ng1tjdpptuk9eysq6z38nscqyycr998xjyx3w8jvw:1\ng19t3n89slfemgd3mwuat4lajwcp0yxrkadgeg7a:1\ng1yqndt8xx92l9h494jfruz2w79swzjes3n4wqjc:1\ng13278z0a5ufeg80ffqxpda9dlp599t7ekregcy6:1\ng1ht236wjd83x96uqwh9rh3fq6pylyn78mtwq9v6:1\ng1fj9jccm3zjnqspq7lp2g7lj4czyfq0s35600g9:1\ng1wwppuzdns5u6c6jqpkzua24zh6ppsus6399cea:1\ng1k8pjnguyu36pkc8hy0ufzgpzfmj2jl78la7ek3:1\ng1e8umkzumtxgs8399lw0us4rclea3xl5gxy9spp:1\ng14qekdkj2nmmwea4ufg9n002a3pud23y8k7ugs5:1\ng19w2488ntfgpduzqq3sk4j5x387zynwknqdvjqf:1\ng1495y3z7zrej4rendysnw5kaeu4g3d7x7w0734g:1\ng1hygx8ga9qakhkczyrzs9drm8j8tu4qds9y5e3r:1\ng1f977l6wxdh3qu60kzl75vx2wmzswu68l03r8su:1\ng1644qje5rx6jsdqfkzmgnfcegx4dxkjh6rwqd69:1\ng1mzjajymvmtksdwh3wkrndwj6zls2awl9q83dh6:1\ng14da4n9hcynyzz83q607uu8keuh9hwlv42ra6fa:10\ng14vhcdsyf83ngsrrqc92kmw8q9xakqjm0v8448t:5\n"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AmG6kzznyo1uNqWPAYU6wDpsmzQKDaEOrVRaZ08vOyX0"},"signature":"S8iMMzlOMK8dmox78R9Z8+pSsS8YaTCXrIcaHDpiOgkOy7gqoQJ0oftM0zf8zAz4xpezK8Lzg8Q0fCdXJxV76w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1manfred47kzduec920z88wfr64ylksmdcedlf5","send":"","pkg_path":"gno.land/r/demo/users","func":"Invite","args":["g1manfred47kzduec920z88wfr64ylksmdcedlf5\ng1thlf3yct7n7ex70k0p62user0kn6mj6d3s0cg3\ng1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\n"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AmG6kzznyo1uNqWPAYU6wDpsmzQKDaEOrVRaZ08vOyX0"},"signature":"njczE6xYdp01+CaUU/8/v0YC/NuZD06+qLind+ZZEEMNaRe/4Ln+4z7dG6HYlaWUMsyI1KCoB6NIehoE0PZ44Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1manfred47kzduec920z88wfr64ylksmdcedlf5","send":"","pkg_path":"gno.land/r/demo/users","func":"Invite","args":["g1589c8cekvmjfmy0qrd4f3z52r7fn7rgk02667s\ng13sm84nuqed3fuank8huh7x9mupgw22uft3lcl8\ng1m6732pkrngu9vrt0g7056lvr9kcqc4mv83xl5q\ng1wg88rhzlwxjd2z4j5de5v5xq30dcf6rjq3dhsj\ng18pmaskasz7mxj6rmgrl3al58xu45a7w0l5nmc0\ng19wwhkmqlns70604ksp6rkuuu42qhtvyh05lffz\ng187982000zsc493znqt828s90cmp6hcp2erhu6m\ng1ndpsnrspdnauckytvkfv8s823t3gmpqmtky8pl\ng16ja66d65emkr0zxd2tu7xjvm7utthyhpej0037\ng1ds24jj9kqjcskd0gzu24r9e4n62ggye230zuv5\ng1trkzq75ntamsnw9xnrav2v7gy2lt5g6p29yhdr\ng1rrf8s5mrmu00sx04fzfsvc399fklpeg2x0a7mz\ng19p5ntfvpt4lwq4jqsmnxsnelhf3tff9scy3w8w\ng1tue8l73d6rq4vhqdsp2sr3zhuzpure3k2rnwpz\ng14hhsss4ngx5kq77je5g0tl4vftg8qp45ceadk3\ng1768hvkh7anhd40ch4h7jdh6j3mpcs7hrat4gl0\ng15fa8kyjhu88t9dr8zzua8fwdvkngv5n8yqsm0n\ng1xhccdjcscuhgmt3quww6qdy3j3czqt3urc2eac\ng1z629z04f85k4t5gnkk5egpxw9tqxeec435esap\ng1pfldkplz9puq0v82lu9vqcve9nwrxuq9qe5ttv\ng152pn0g5qfgxr7yx8zlwjq48hytkafd8x7egsfv\ng1cf2ye686ke38vjyqakreprljum4xu6rwf5jskq\ng1c5shztyaj4gjrc5zlwmh9xhex5w7l4asffs2w6\ng1lhpx2ktk0ha3qw42raxq4m24a4c4xqxyrgv54q\ng1026p54q0j902059sm2zsv37krf0ghcl7gmhyv7\ng1n4yvwnv77frq2ccuw27dmtjkd7u4p4jg0pgm7k\ng13m7f2e6r3lh3ykxupacdt9sem2tlvmaamwjhll\ng19uxluuecjlsqvwmwu8sp6pxaaqfhk972q975xd\ng1j80fpcsumfkxypvydvtwtz3j4sdwr8c2u0lr64\ng1tjdpptuk9eysq6z38nscqyycr998xjyx3w8jvw\ng19t3n89slfemgd3mwuat4lajwcp0yxrkadgeg7a\ng1yqndt8xx92l9h494jfruz2w79swzjes3n4wqjc\ng13278z0a5ufeg80ffqxpda9dlp599t7ekregcy6\ng1ht236wjd83x96uqwh9rh3fq6pylyn78mtwq9v6\ng1fj9jccm3zjnqspq7lp2g7lj4czyfq0s35600g9\ng1wwppuzdns5u6c6jqpkzua24zh6ppsus6399cea\ng1k8pjnguyu36pkc8hy0ufzgpzfmj2jl78la7ek3\ng1e8umkzumtxgs8399lw0us4rclea3xl5gxy9spp\ng14qekdkj2nmmwea4ufg9n002a3pud23y8k7ugs5\ng19w2488ntfgpduzqq3sk4j5x387zynwknqdvjqf\ng1495y3z7zrej4rendysnw5kaeu4g3d7x7w0734g\ng1hygx8ga9qakhkczyrzs9drm8j8tu4qds9y5e3r\ng1f977l6wxdh3qu60kzl75vx2wmzswu68l03r8su\ng1644qje5rx6jsdqfkzmgnfcegx4dxkjh6rwqd69\ng1mzjajymvmtksdwh3wkrndwj6zls2awl9q83dh6\ng1manfred47kzduec920z88wfr64ylksmdcedlf5\ng14da4n9hcynyzz83q607uu8keuh9hwlv42ra6fa\ng14vhcdsyf83ngsrrqc92kmw8q9xakqjm0v8448t\n"]}],"fee":{"gas_wanted":"4000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AmG6kzznyo1uNqWPAYU6wDpsmzQKDaEOrVRaZ08vOyX0"},"signature":"7AmlhZhsVkxCUl0bbpvpPMnIKihwtG7A5IFR6Tg4xStWLgaUr05XmWRKlO2xjstTtwbVKQT5mFL4h5wyX4SQzw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj","send":"200000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","administrator","g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AmG6kzznyo1uNqWPAYU6wDpsmzQKDaEOrVRaZ08vOyX0"},"signature":"AqCqe0cS55Ym7/BvPDoCDyPP5q8284gecVQ2PMOlq/4lJpO9Q18SOWKI15dMEBY1pT0AYyhCeTirlsM1I3Y4Cg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qpymzwx4l4cy6cerdyajp9ksvjsf20rk5y9rtt","send":"200000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","zo_oma","Love is the encryption key\u003c3"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6yg5/iiktruezVw5vZJwLlGwyrvw8RlqOToTRMWXkE2"},"signature":"GGp+bVL2eEvKecPqgcULSABYOSnSMnJzfIsR8ZIRER1GGX/fOiCReX4WKMrGLVROJVfbLQkDRwvhS4TLHlSoSQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1manfred47kzduec920z88wfr64ylksmdcedlf5","send":"200000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["g1manfred47kzduec920z88wfr64ylksmdcedlf5","moul","https://github.com/moul"]}],"fee":{"gas_wanted":"2000000","gas_fee":"200000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"9CWeNbKx+hEL+RdHplAVAFntcrAVx5mK9tMqoywuHVoreH844n3yOxddQrGfBk6T2tMBmNWakERRqWZfS+bYAQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1fj9jccm3zjnqspq7lp2g7lj4czyfq0s35600g9","send":"200000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","piupiu","@piux2"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ar68lqbU2YC63fbMcYUtJhYO3/66APM/EqF7m0nUjGyz"},"signature":"pTUpP0d/XlfVe3TH1hlaoLhKadzIKG1gtQ/Ueuat72p+659RWRea58Z0mk6GgPE/EeTbhMEY45zufevBdGJVoQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1ds24jj9kqjcskd0gzu24r9e4n62ggye230zuv5","send":"","pkg_path":"gno.land/r/demo/users","func":"Register","args":["g1manfred47kzduec920z88wfr64ylksmdcedlf5","anarcher","https://twitter.com/anarcher"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjpLbKdQeH+yB/1OCB148l5GlRRrXma71hdA8EES3H7f"},"signature":"pf5xm8oWIQIOEwSGw4icPmynLXb1P1HxKfjeh8UStU1mlIBPKa7yppeIMPpAflC0o2zjFR7Axe7CimAebm3BHg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g15gdm49ktawvkrl88jadqpucng37yxutucuwaef","send":"200000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","ideamour","\u003c3"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AhClx4AsDuX3DNCPxhDwWnrfd4MIZmxJE4vt47ClVvT2"},"signature":"IQe64af878k6HjLDqIJeg27GXAVF6xS+96cDe2jMlxNV6+8sOcuUctp0GiWVnYfN4tpthC6d4WhBo+VlpHqkbg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj","send":"","pkg_path":"gno.land/r/demo/boards","func":"CreateBoard","args":["testboard"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"vzlSxEFh5jOkaSdv3rsV91v/OJKEF2qSuoCpri1u5tRWq62T7xr3KHRCF5qFnn4aQX/yE8g8f/Y//WPOCUGhJw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj","send":"","pkg_path":"gno.land/r/demo/boards","func":"CreateThread","args":["1","Hello World","This is a demo of Gno smart contract programming. This document was\nconstructed by Gno onto a smart contract hosted on the data Realm \nname [\"gno.land/r/demo/boards\"](https://gno.land/r/demo/boards/)\n([github](https://github.com/gnolang/gno/tree/master/examples/gno.land/r/demo/boards)).\n\n## Starting the `gnoland` node node/validator.\n\nNOTE: Where you see `--remote localhost:26657` here, that flag can be replaced\nwith `--remote localhost:26657` for local testnets.\n\n### build gnoland.\n\n```bash\ngit clone git@github.com:gnolang/gno.git\ncd ./gno\nmake \n```\n\n### add test account.\n\n```bash\n./build/gnokey add test1 --recover\n```\n\nUse this mnemonic:\n\u003e source bonus chronic canvas draft south burst lottery vacant surface solve popular case indicate oppose farm nothing bullet exhibit title speed wink action roast\n\n### start gnoland validator node.\n\n```bash\n./build/gnoland\n```\n\n(This can be reset with `make reset`).\n\n### start gnoland web server (optional).\n\n```bash\ngo run ./gnoland/website\n```\n\n## Signing and broadcasting transactions.\n\n### publish the \"gno.land/p/demo/avl\" package.\n\n```bash\n./build/gnokey maketx addpkg test1 --pkgpath \"gno.land/p/demo/avl\" --pkgdir \"examples/gno.land/p/demo/avl\" --deposit 100ugnot --gas-fee 1ugnot --gas-wanted 2000000 \u003e addpkg.avl.unsigned.txt\n./build/gnokey query \"auth/accounts/g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\"\n./build/gnokey sign test1 --txpath addpkg.avl.unsigned.txt --chainid \"portal-loop\" --number 0 --sequence 0 \u003e addpkg.avl.signed.txt\n./build/gnokey broadcast addpkg.avl.signed.txt --remote localhost:26657\n```\n\n### publish the \"gno.land/r/demo/boards\" realm package.\n\n```bash\n./build/gnokey maketx addpkg test1 --pkgpath \"gno.land/r/demo/boards\" --pkgdir \"examples/gno.land/r/demo/boards\" --deposit 100ugnot --gas-fee 1ugnot --gas-wanted 300000000 \u003e addpkg.boards.unsigned.txt\n./build/gnokey sign test1 --txpath addpkg.boards.unsigned.txt --chainid \"portal-loop\" --number 0 --sequence 1 \u003e addpkg.boards.signed.txt\n./build/gnokey broadcast addpkg.boards.signed.txt --remote localhost:26657\n```\n\n### create a board with a smart contract call.\n\n```bash\n./build/gnokey maketx call test1 --pkgpath \"gno.land/r/demo/boards\" --func CreateBoard --args \"testboard\" --gas-fee 1ugnot --gas-wanted 2000000 \u003e createboard.unsigned.txt\n./build/gnokey sign test1 --txpath createboard.unsigned.txt --chainid \"portal-loop\" --number 0 --sequence 2 \u003e createboard.signed.txt\n./build/gnokey broadcast createboard.signed.txt --remote localhost:26657\n```\nNext, query for the permanent board ID by querying (you need this to create a new post):\n\n```bash\n./build/gnokey query \"vm/qeval\" --data \"gno.land/r/demo/boards.GetBoardIDFromName(\\\"testboard\\\")\"\n```\n\n### create a post of a board with a smart contract call.\n\n```bash\n./build/gnokey maketx call test1 --pkgpath \"gno.land/r/demo/boards\" --func CreatePost --args 1 --args \"Hello World\" --args#file \"./examples/gno.land/r/demo/boards/README.md\" --gas-fee 1ugnot --gas-wanted 2000000 \u003e createpost.unsigned.txt\n./build/gnokey sign test1 --txpath createpost.unsigned.txt --chainid \"portal-loop\" --number 0 --sequence 3 \u003e createpost.signed.txt\n./build/gnokey broadcast createpost.signed.txt --remote localhost:26657\n```\n\n### create a comment to a post.\n\n```bash\n./build/gnokey maketx call test1 --pkgpath \"gno.land/r/demo/boards\" --func CreateReply --args 1 --args 1 --args \"A comment\" --gas-fee 1ugnot --gas-wanted 2000000 \u003e createcomment.unsigned.txt\n./build/gnokey sign test1 --txpath createcomment.unsigned.txt --chainid \"portal-loop\" --number 0 --sequence 4 \u003e createcomment.signed.txt\n./build/gnokey broadcast createcomment.signed.txt --remote localhost:26657\n```\n\n```bash\n./build/gnokey query \"vm/qrender\" --data \"gno.land/r/demo/boards:testboard/1\"\n```\n\n### render page with optional path expression.\n\nThe contents of `https://gno.land/r/demo/boards:` and `https://gno.land/r/demo/boards:testboard` are rendered by calling\nthe `Render(path string)` function like so:\n\n```bash\n./build/gnokey query \"vm/qrender\" --data \"gno.land/r/demo/boards:testboard\"\n```\n"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"V43B1waFxhzheW9TfmCpjLdrC4dC1yjUGES5y3J6QsNar6hRpNz4G1thzWmWK7xXhg8u1PCIpxLxGczKQYhuPw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj","send":"","pkg_path":"gno.land/r/demo/boards","func":"CreateThread","args":["1","NFT example","NFT's are all the rage these days, for various reasons.\n\nI read over EIP-721 which appears to be the de-facto NFT standard on Ethereum. Then, made a sample implementation of EIP-721 (let's here called GRC-721). The implementation isn't complete, but it demonstrates the main functionality.\n\n - [EIP-721](https://eips.ethereum.org/EIPS/eip-721)\n - [gno.land/r/demo/nft/nft.gno](https://gno.land/r/demo/nft/nft.gno)\n - [zrealm_nft3.gno test](https://github.com/gnolang/gno/blob/master/examples/gno.land/r/demo/nft/z_3_filetest.gno)\n\nIn short, this demonstrates how to implement Ethereum contract interfaces in gno.land; by using only standard Go language features.\n\nPlease leave a comment ([guide](https://gno.land/r/demo/boards:testboard/1)).\n"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"ZXfrTiHxPFQL8uSm+Tv7WXIHPMca9okhm94RAlC6YgNbB1VHQYYpoP4w+cnL3YskVzGrOZxensXa9CAZ+cNNeg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj","send":"","pkg_path":"gno.land/r/demo/boards","func":"CreateThread","args":["1","Simple echo example with coins","This is a simple test realm contract that demonstrates how to use the banker.\n\nSee [gno.land/r/demo/banktest/banktest.gno](/r/demo/banktest/banktest.gno) to see the original contract code.\n\nThis article will go through each line to explain how it works.\n\n```go\npackage banktest\n```\n\nThis package is locally named \"banktest\" (could be anything).\n\n```go\nimport (\n\t\"std\"\n)\n```\n\nThe \"std\" package is defined by the gno code in stdlibs/std/. \u003c/br\u003e\nSelf explanatory; and you'll see more usage from std later.\n\n```go\ntype activity struct {\n\tcaller std.Address\n\tsent std.Coins\n\treturned std.Coins\n\ttime std.Time\n}\n\nfunc (act *activity) String() string {\n\treturn act.caller.String() + \" \" +\n\t\tact.sent.String() + \" sent, \" +\n\t\tact.returned.String() + \" returned, at \" +\n\t\tstd.FormatTimestamp(act.time, \"2006-01-02 3:04pm MST\")\n}\n\nvar latest [10]*activity\n```\n\nThis is just maintaining a list of recent activity to this contract.\nNotice that the \"latest\" variable is defined \"globally\" within\nthe context of the realm with path \"gno.land/r/demo/banktest\".\n\nThis means that calls to functions defined within this package\nare encapsulated within this \"data realm\", where the data is \nmutated based on transactions that can potentially cross many\nrealm and non-realm packge boundaries (in the call stack).\n\n```go\n// Deposit will take the coins (to the realm's pkgaddr) or return them to user.\nfunc Deposit(returnDenom string, returnAmount int64) string {\n\tstd.AssertOriginCall()\n\tcaller := std.GetOrigCaller()\n\tsend := std.Coins{{returnDenom, returnAmount}}\n```\n\nThis is the beginning of the definition of the contract function named\n\"Deposit\". `std.AssertOriginCall() asserts that this function was called by a\ngno transactional Message. The caller is the user who signed off on this\ntransactional message. Send is the amount of deposit sent along with this\nmessage.\n\n```go\n\t// record activity\n\tact := \u0026activity{\n\t\tcaller: caller,\n\t\tsent: std.GetOrigSend(),\n\t\treturned: send,\n\t\ttime: std.GetTimestamp(),\n\t}\n\tfor i := len(latest) - 2; i \u003e= 0; i-- {\n\t\tlatest[i+1] = latest[i] // shift by +1.\n\t}\n\tlatest[0] = act\n```\n\nUpdating the \"latest\" array for viewing at gno.land/r/demo/banktest: (w/ trailing colon).\n\n```go\n\t// return if any.\n\tif returnAmount \u003e 0 {\n```\n\nIf the user requested the return of coins...\n\n```go\n\t\tbanker := std.GetBanker(std.BankerTypeOrigSend)\n```\n\nuse a std.Banker instance to return any deposited coins to the original sender.\n\n```go\n\t\tpkgaddr := std.GetOrigPkgAddr()\n\t\t// TODO: use std.Coins constructors, this isn't generally safe.\n\t\tbanker.SendCoins(pkgaddr, caller, send)\n\t\treturn \"returned!\"\n```\n\nNotice that each realm package has an associated Cosmos address.\n\n\nFinally, the results are rendered via an ABCI query call when you visit [/r/demo/banktest:](/r/demo/banktest:).\n\n```go\nfunc Render(path string) string {\n\t// get realm coins.\n\tbanker := std.GetBanker(std.BankerTypeReadonly)\n\tcoins := banker.GetCoins(std.GetOrigPkgAddr())\n\n\t// render\n\tres := \"\"\n\tres += \"## recent activity\\n\"\n\tres += \"\\n\"\n\tfor _, act := range latest {\n\t\tif act == nil {\n\t\t\tbreak\n\t\t}\n\t\tres += \" * \" + act.String() + \"\\n\"\n\t}\n\tres += \"\\n\"\n\tres += \"## total deposits\\n\"\n\tres += coins.String()\n\treturn res\n}\n```\n\nYou can call this contract yourself, by vistiing [/r/demo/banktest](/r/demo/banktest) and the [quickstart guide](/r/demo/boards:testboard/4).\n"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"iZX/llZlNTdZMLv1goCTgK2bWqzT8enlTq56wMTCpVxJGA0BTvuEM5Nnt9vrnlG6Taqj2GuTrmEnJBkDFTmt9g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj","send":"","pkg_path":"gno.land/r/demo/boards","func":"CreateThread","args":["1","TASK: Describe in your words","Describe in an essay (250+ words), on your favorite medium, why you are interested in gno.land and gnolang.\n\nReply here with a URL link to your written piece as a comment, for rewards.\n"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AmG6kzznyo1uNqWPAYU6wDpsmzQKDaEOrVRaZ08vOyX0"},"signature":"4HBNtrta8HdeHj4JTN56PBTRK8GOe31NMRRXDiyYtjozuyRdWfOGEsGjGgHWcoBUJq6DepBgD4FetdqfhZ6TNQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1manfred47kzduec920z88wfr64ylksmdcedlf5","send":"","pkg_path":"gno.land/r/demo/boards","func":"CreateThread","args":["1","Getting Started","This is a demo of Gno smart contract programming. This document was\nconstructed by Gno onto a smart contract hosted on the data Realm\nname [\"gno.land/r/demo/boards\"](https://gno.land/r/demo/boards/)\n([github](https://github.com/gnolang/gno/tree/master/examples/gno.land/r/demo/boards)).\n\n\n\n## Build `gnokey`, create your account, and interact with Gno.\n\nNOTE: Where you see `--remote localhost:26657` here, that flag can be replaced\nwith `--remote localhost:26657` for local testnets.\n\n### Build `gnokey`.\n\n```bash\ngit clone git@github.com:gnolang/gno.git\ncd ./gno\nmake\n```\n\n### Generate a seed/mnemonic code.\n\n```bash\n./build/gnokey generate\n```\n\nNOTE: You can generate 24 words with any good bip39 generator.\n\n### Create a new account using your mnemonic.\n\n```bash\n./build/gnokey add KEYNAME --recover\n```\n\nNOTE: `KEYNAME` is your key identifier, and should be changed.\n\n### Verify that you can see your account locally.\n\n```bash\n./build/gnokey list\n```\n\n## Interact with the blockchain:\n\n### Get your current balance, account number, and sequence number.\n\n```bash\n./build/gnokey query auth/accounts/ACCOUNT_ADDR --remote localhost:26657\n```\n\nNOTE: you can retrieve your `ACCOUNT_ADDR` with `./build/gnokey list`.\n\n### Acquire testnet tokens using the official faucet.\n\nGo to https://gno.land/faucet\n\n### Create a board with a smart contract call.\n\nNOTE: `BOARDNAME` will be the slug of the board, and should be changed.\n\n```bash\n./build/gnokey maketx call KEYNAME --pkgpath \"gno.land/r/demo/boards\" --func \"CreateBoard\" --args \"BOARDNAME\" --gas-fee \"1000000ugnot\" --gas-wanted \"2000000\" --broadcast=true --chainid portal-loop --remote localhost:26657\n```\n\nInteractive documentation: https://gno.land/r/demo/boards?help\u0026__func=CreateBoard\n\nNext, query for the permanent board ID by querying (you need this to create a new post):\n\n```bash\n./build/gnokey query \"vm/qeval\" --data \"gno.land/r/demo/boards.GetBoardIDFromName(\\\"BOARDNAME\\\")\" --remote localhost:26657\n```\n\n### Create a post of a board with a smart contract call.\n\nNOTE: If a board was created successfully, your SEQUENCE_NUMBER would have increased.\n\n```bash\n./build/gnokey maketx call KEYNAME --pkgpath \"gno.land/r/demo/boards\" --func \"CreateThread\" --args BOARD_ID --args \"Hello gno.land\" --args\\#file \"./examples/gno.land/r/demo/boards/example_post.md\" --gas-fee 1000000ugnot --gas-wanted 2000000 --broadcast=true --chainid portal-loop --remote localhost:26657\n```\n\nInteractive documentation: https://gno.land/r/demo/boards?help\u0026__func=CreateThread\n\n### Create a comment to a post.\n\n```bash\n./build/gnokey maketx call KEYNAME --pkgpath \"gno.land/r/demo/boards\" --func \"CreateReply\" --args \"BOARD_ID\" --args \"1\" --args \"1\" --args \"Nice to meet you too.\" --gas-fee 1000000ugnot --gas-wanted 2000000 --broadcast=true --chainid portal-loop --remote localhost:26657\n```\n\nInteractive documentation: https://gno.land/r/demo/boards?help\u0026__func=CreateReply\n\n```bash\n./build/gnokey query \"vm/qrender\" --data \"gno.land/r/demo/boards:BOARDNAME/1\" --remote localhost:26657\n```\n\n### Render page with optional path expression.\n\nThe contents of `https://gno.land/r/demo/boards:` and `https://gno.land/r/demo/boards:gnolang` are rendered by calling\nthe `Render(path string)` function like so:\n\n```bash\n./build/gnokey query \"vm/qrender\" --data \"gno.land/r/demo/boards:gnolang\"\n```\n\n## Starting a local `gnoland` node:\n\n### Add test account.\n\n```bash\n./build/gnokey add test1 --recover\n```\n\nUse this mneonic:\n\u003e source bonus chronic canvas draft south burst lottery vacant surface solve popular case indicate oppose farm nothing bullet exhibit title speed wink action roast\n\n### Start `gnoland` node.\n\n```bash\n./build/gnoland\n```\n\nNOTE: This can be reset with `make reset`\n\n### Publish the \"gno.land/p/demo/avl\" package.\n\n```bash\n./build/gnokey maketx addpkg test1 --pkgpath \"gno.land/p/demo/avl\" --pkgdir \"examples/gno.land/p/demo/avl\" --deposit 100000000ugnot --gas-fee 1000000ugnot --gas-wanted 2000000 --broadcast=true --chainid portal-loop --remote localhost:26657\n```\n\n### Publish the \"gno.land/r/demo/boards\" realm package.\n\n```bash\n./build/gnokey maketx addpkg test1 --pkgpath \"gno.land/r/demo/boards\" --pkgdir \"examples/gno.land/r/demo/boards\" --deposit 100000000ugnot --gas-fee 1000000ugnot --gas-wanted 300000000 --broadcast=true --chainid portal-loop --remote localhost:26657\n```\n"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"sHjOGXZEi9wt2FSXFHmkDDoVQyepvFHKRDDU0zgedHYnCYPx5/YndyihsDD5Y2Z7/RgNYBh4JlJwDMGFNStzBQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1manfred47kzduec920z88wfr64ylksmdcedlf5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["post1","First post","Lorem Ipsum","2022-05-20T13:17:22Z","","tag1,tag2"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"sHjOGXZEi9wt2FSXFHmkDDoVQyepvFHKRDDU0zgedHYnCYPx5/YndyihsDD5Y2Z7/RgNYBh4JlJwDMGFNStzBQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1manfred47kzduec920z88wfr64ylksmdcedlf5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["post2","Second post","Lorem Ipsum","2022-05-20T13:17:23Z","","tag1,tag3"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"sHjOGXZEi9wt2FSXFHmkDDoVQyepvFHKRDDU0zgedHYnCYPx5/YndyihsDD5Y2Z7/RgNYBh4JlJwDMGFNStzBQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"k2K8oibebL+to1FpokRUGP/CRdrNDR/PjoAH+d9kCSUkAdV4UNPhbbkaiFzXUTTdZZHJgSno3kP3xUYRaq9HQA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"7et5t7tSiG5IZwYxdvnDEv/ym5PAM5ebLLpATNuAv1AhI48QrwGihejbZUdVn6EEA/ywCLDnsIRiWZKzwpI5jw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"r97O5/ZESx5kYStEgY49uyaCy2VcmC3lm+OZjJFN5Vs0ZNQNR34TWpVzT0vwUYNxoEr9AzFFvqPDsWmV3d8k0A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","package":{"name":"","path":"gno.land/r/g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5/run","files":null}}],"fee":{"gas_wanted":"100000","gas_fee":"100000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"2EK2PW1izZJQKteQpiU7IJwuZkqozlKGHGsrmD9oQw8nW8+SQrF9mqEupAZZGkYRUKG2IaHZ4dMh9U/pse1YpA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","package":{"name":"","path":"gno.land/r/g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5/run","files":null}}],"fee":{"gas_wanted":"100000","gas_fee":"100000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"++58gF91Ir3ib021vJGPicoAPfObYEA+iALG2duPj35BZwSD8UEGww9LR7ZUTKJl0mVTAYmbSTHnBIwf57HELg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"100000","gas_fee":"100000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"rTbMOC1dnU/BOQVHf5G9TWrfprdtYjo7cEAUZk0NQPkApCMWz3NF68M1ON1MnSxYPbJ2nqyqWUw04NGun4jsZA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"100000","gas_fee":"100000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"Pa/VKmzUBDlRDqqc7EJdmyYyBtj1eICFFhoLiuCPfS90gici21XUxNeTX+VEpFpGUbAzbr3ChFlsDJlWsmUOuA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"100000","gas_fee":"100000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"nxmslKtxpSS9DR+1AAv7e+J0Z/2/EbmjMwr7B8prXNBRIJSAdMjNek6e01oReQ3y7a27LKV2zODmF66rDUnU3A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"100000","gas_fee":"100000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"BFCes+Bkc8j5zQe9MVlc3NuBbl8mNx0h2HMhH+PYsfhJCRTib8ghK14SyaABQ7WTnhuwjOGY5FTW+IWQMXdBJw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"100000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"tbTC8dIAlVVxLZsLcFq1E8d2OoJDnAn+7cU647ttl4wAJOVtYwgRm5uSCkSOkzr97p5LD7fkUD6tHf5nI25OuA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/morgan/variadic","func":"echo","args":["a","b","c"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"k4SRHCcyyKyoFB6IC5xRYJxXexA5ribWZZQQJZlqi1t0CaUAFOQkbhfS5/Ho6rwR+WmG1mcgOpMD0mUNPfmuWw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/morgan/variadic","func":"Echo","args":["a","b","c"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"B49TkyOb/MCbg5vVaAfApnMgltTv8N3QpD3nLaMJEh1jkEeJSG935jzyEmboJa0G+DtfqhcrtZzYUXm4kZlZfw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","amount":"9671203299998ugnot"}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"s2wKyjgNKe4ntjxUi+QxNqGxuvcKJrKbJyZDyynUujxtm5WEZi48qC3d3Trr2yudaoSCbdMI7HKK/FmVEcPLWw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","amount":"9671003299998ugnot"}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"ibp5z8HsYQaBOoQcHA2Y3vAeX0fI80Hrvv3ay7fJChpNYQo96Oi9ITc5TaHuExhoBbxNbdBaM4LOC0Y0f2i4Ag=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1sw5xklxjjuv0yvuxy5f5s3l3mnj0nqq626a9wr","amount":"154000000ugnot"}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"bjh/TdlSeHwZfNEiIyB1nWZph/4kNvF8EX8Usd7n32RkeKcnUE5GHRrABsZ9NgoJcLXiwnXFFhDDJnwNvJu7SQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1sw5xklxjjuv0yvuxy5f5s3l3mnj0nqq626a9wr","amount":"150000000ugnot"}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"oe0lU8ljF4f6cHU9C3PpD1kmyKc8Ra3ur+7RxZg/IIVNeOrBtv76PboEywHuJawimwWT0Vueq2ZGfUDVLRWbfw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["peace","Peace!","\n\nI've never been put in such a difficult position, of having information that I\ncannot reveal. And if you know me, you know that I like to speak my mind. But\nI cannot say the things that I would rather say, because you get a lot of flack\nfor saying anything bad about a public chain.\n\nSo I have been sitting on this issue, losing sleep about it for years, because\nit leads me to worry about the safety of the hub. From an external person's\npoint of view, the solution is obvious -- reveal the information for the\nbetterment of everyone, no matter the consequences, because that is the right\nthing to do. As a stakeholder, and I agree with the majority of the community\nthat peace and silence is better, with exceptions.\n\nSo without turning this into a war of accusations bringing back past drama,\nlet's just do this: dear core contributors, Ethan Buchman, Zaki Manian, Jack\nZampolin, and everyone, here is my peace plan.\n\n----------------------------------------\n\n## On Prop 69\n\nProp 69 is about adding CosmWASM to the hub. I have repeatedly talked about\nthe dangers of adding CosmWASM to the hub, including a document shared two\nyears ago.\n\nhttps://github.com/jaekwon/cosmos_roadmap/tree/master/shape_of_cosmos#smart-contracts\n\nEven before prop 69, I had declared publicly that stakers voting yes to adding\nWASM on the hub would not receive airdrops. Primarily, because it increases\nthe surface area for attack by an order of magnitude. CosmWASM adds two layers\nof new complexity to the hub. WASM itself, as well as CosmWASM. WASM as a spec\nand its implementations are still maturing, and though available on browsers,\nand some blockchains, it still hasn't gone through the gauntlet of time. All\nnew complex technologies like WASM, like Java, Linux, and even Go, in hindsight\nhave numerous bugs that could have or were used maliciously. The same will be\ntrue of any WASM integration with the hub, and this potential for exploits\ncombined with the massive potential rewards (especially of pegged PoW tokens)\nmakes such exploits an inevitability.\n\nIn Juno recently there was a bug that halted the chain for three days. Worse\ncan happen on the Cosmos Hub. The very identity of the Cosmos Hub (it's most\nvaluable asset is specifically a schelling point brand, of being a \"common IBC\nhub\") is threatened if a bug were to result in the theft or loss of coins. On\nplatforms like Ethereum or Polkadot, perhaps they would have a better time\nrolling back the chain to undo a hack as in the DAO hack. The major difference\nwith an *IBC hub* is that it cannot simply reverse the transactions of other\nchains.\n\nWe have yet to experience such a bug in any of our zones on a major scale, and\nhave yet to learn how to coordinate in the case of such in an interconnected\nweb of zones. Where are the planning documents for disaster scenarios? Between\nPoS chains with good governance, we will learn how to roll back transactions\nacross connections, if need be in exceptional circumstances, but we aren't\nthere yet. This option isn't even available with pegged PoW coins.\n\nYes, the contracts that are approved to run will be governance gated, but this\nis not enough. For one, even with perfect governance, there are two new pieces\nof complexity that will see more zero day bugs in the future for exploitation.\nIn terms of governance, the contracts are probably going to be written in Rust,\nand so suddenly the validators that joined the project by inspecting the Go\ncode is now required to also audit Rust code. But also, we are now truly\nopening the doors to all kinds of contracts to be run, because while governance\ndoes sometimes reject proposals, it is generally accommodating to new features\nespecially endorsed by core contributors.\n\nI know of three alternatives:\n\n(1) we can use IBC to offload features to other zones. For liquid staking\n(which should not be the focus of the hub) the hub could allow validators to\nrestrict the destination of unbonded ATOMs, and smart contracts running on\nother zones can distribute those ATOMs according to the logic of whatever\nliquid staking contract. This ensures separation of concerns, and a minimal\nhub.\n\n(2) we can use Go plugins to extend the functionality of the chain.\n\n(3) we can do nothing. if liquid staking is such a big deal, something is wrong\nabout priorities for a cosmic \"hub\". If the liquid staking market is larger\nthan the base non-liquid staking market, the system is open for manipulation\nand is insecure. The focus should not be on self-limiting use-cases, but the\ninfinite market of running validators with replicated security, perhaps running\na simple dex, and most of all innovating on and offering interchain security,\nthe business of judging validation faults as related to Tendermint, and perhaps\nthe interpretation and enforcement of self-enforced customs (law) of a\nblockchain as defined by its shareholders who defer validation (and perhaps\njudicial services) to the Cosmos Hub because it has a reputation for being the\nlongest ever running proof of stake hub that has never gone down, even as\ncompared to the upcoming Ethereum2.0.\n\nAnd note, I'm not proposing that the ATOM stakers forgo the benefits of\nsupporting contracts with CosmWASM. I support Juno and Tardigrade and Ethan\nFrey’s work, but I also support the Hub running shared security, especially\nsimple replicated shared security where the validators also validate other\nchains. I think this, and interchain staking, are the only profit models needed\nfor the hub (besides being a hub). NOTE: But those \"consumer chains\" ought to\nbe provided with full disclosures that the Cosmos Hub validators do not\nmaintain their respective software (as it would be impossible to audit all\nzones that would benefit from the hub's security) but only offering validation\nservices as-is. This would force the hub validators to solve process isolation\n(and I would much prefer building the protocol to NOT require particular\nsolutions like Docker, but allows validator choice), or else they would quickly\nget slashed from malware (and that would be good to prune those validators from\nthe hub).\n\nSo many options that don't require putting WASM on the Cosmos Hub.\n\n------------------------------------\n\n## On Incentivized Votes\n\nIn corporations, you can buy shares to influence the outcome of governance\nvotes. In democracy, this is not allowed because the vote could be bought to\ninfringe upon the rights of other people.\n\nWhat do you do when the chain's own core contributors proposes a proposal that\nyou judge damages the integrity of the system? I think that's a good time to\ncreate a fork of the hub's ATOM distribution led by a new development team.\nSometimes this option is the only option because of safety concerns, and this\nis the case for me here.\n\n### Why is the snapshot date 5/19/2022?\n\nA snapshot in the past is more vulnerable to insider gaming, because there is\nan imbalance of information--only the coordinator knows, and so can game the\npremine.\n\nIt is good to give many people the advantage of participating in a snapshot.\nExcluding anyone who would have been an ally of a chain, in turn creates\nanimosity that would rather see another project succeed where they are\nincluded.\n\nEven before the proposal I had pre-declared that anyone who votes for WASM on\nthe hub would not receive a gno.land airdrop. The proposer probably knew this\nwhen the proposal was submitted.\n\nThe snapshot date would have been 7/4/2022, because that is Independence Day in\nthe United States. I originally chose Independence Day because of the general\noriginal mission of Tendermint, Cosmos, Bitcoin, and the crypto spirit; and\nbecause the United States (as flawed as it is) is the best historic ideal of\nhuman liberty we've had since before the days of Rome.\n\nThen prop 69 was submitted. I had said previously that we would exclude those\nwho vote in favor of WASM on the hub, but we don't have the tools yet to tally\nthe movement of tainted ATOMs after the unbonding period for the hub. So I\ndecided to move the snapshot date to 5/19/2022.\n\nNow with prop 69, I see that to me, 21 days after the beginning of proposal\n\\#69, 5/20/2022 (but 5/19/2022 PDT) is a chance to create a new community within\nthe Cosmos ecosystem that champions safety with a zero tolerance policy and a\nmission to develop social coordination tools like the GNO smart contract VM, to\ncreate even better governing bodies than the one we have today.\n\n### Gno.land and Cosmos Hub\n\nNow, I feel compelled to exit should prop \\#69 pass. But as it is now, 16.57%\nare voting YES, while NO and NO WITH VETO have 70.73% and 8.38% of the votes\nwith turnout at 30%. If the proposal does not pass, I would feel no need to\nexit. For as long as the Cosmos Hub remains minimal and secure, we will favor\nit as the dominant or only token hub connected to gno.land via the current IBC\nimplementations for the purpose of interchain token transfers. It's a job that\nwe'd rather not solve, as specialization is what will get us to the finish line\nbefore other platforms do, and also I'm quite hooked on gnolang programming and\njust want to make gnolang apps. Not everybody wants to build a DTCC, but many\nwould prefer to use it.\n\n### Airdrop distribution\n\nWhen I was asked on Cryptocito what I would have changed if I were to do it all\nagain, well, I would put the ICF in the hands of the chain. So in gno.land, the\nICF's portion of $GNOT will go to DAOs on gno.land. As for me, I have a\nsignificant amount of ATOMs that voted for NO WITH VETO, but most of my tokens\nby far are with the company that I previously founded, then called All in Bits,\nInc. AIB will not receive any $GNOT except by completing negotiations with me,\nwhich is taking a lot longer than is reasonable--or not.\n\nFor reference, for the genesis of the Cosmos Hub, the total distribution for\nboth entities was 20% of all ATOMs, and today it is still significant. The\ntotal premine that I control directly or indirectly will not exceed 1/3 of the\ntotal $GNOT distribution, but I am considering 20% again.\n\nSome more guidelines, which may change, so don't take anything here as\nfinancial advice:\n\n* NO with VETO is slightly better than NO.\n* NO is better than ABSTAIN.\n* ABSTAIN is better than not voting at all.\n* Delegators inherit the votes of the validators.\n* If you vote YES on \\#69, you will not receive gno.land $GNOTs.\n\nNOTE: If you don't like my airdrop rules, you are free to make your own, and if\nyou're nice you can even run gno.land contracts if you so want there, or you\ncan just run a fork of gaia.\n\nIf you have a better ideal for such an exit-drop by tweaking the governance\nmodule, I'd love to hear your feedback, or generally how you think I could have\ndone this better. Some say that they don't want to see more of this kind of\nforking, but I think we ought to celebrate it instead.\n\n----------------------------------------\n\n## Conclusion\n\nHere's a peace offering.\n\nJust change your vote from YES to NO, and I will not intervene upon the second\nsubmission of the proposal (and I would even fund its deposit if need be). But\nif you instead feel strongly about signaling in favor of CosmWASM, here you can\nexpress it, and I celebrate you, for being different than I, and wish you the\nbest of luck. That is equivalent to a no-confidence vote on gno.land, and is a\nproper way to diss me. Again, I salute you.\n\nIf you can reconsider your vote to be a NO, or even better, a NO WITH VETO, I\nwelcome you to gno.land. Happy 5/19/2022 (5/20/2022 Europe) Gno.land\nIndependence Day!\n","2022-05-02T13:17:22Z","jaekwon","peace,cosmos,gno.land"]}],"fee":{"gas_wanted":"3000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"J2l7N7Q8IQd0AUtiwPUrLtk+OUKGJOXO7xr/n8Uh0SYzWhLR8h+s3TtGPAzSP3f1lkharf+XMFVTpXh/SmW7Kg=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["peace","Peace!","\n\nI've never been put in such a difficult position, of having information that I\ncannot reveal. And if you know me, you know that I like to speak my mind. But\nI cannot say the things that I would rather say, because you get a lot of flack\nfor saying anything bad about a public chain.\n\nSo I have been sitting on this issue, losing sleep about it for years, because\nit leads me to worry about the safety of the hub. From an external person's\npoint of view, the solution is obvious -- reveal the information for the\nbetterment of everyone, no matter the consequences, because that is the right\nthing to do. As a stakeholder, and I agree with the majority of the community\nthat peace and silence is better, with exceptions.\n\nSo without turning this into a war of accusations bringing back past drama,\nlet's just do this: dear core contributors, Ethan Buchman, Zaki Manian, Jack\nZampolin, and everyone, here is my peace plan.\n\n----------------------------------------\n\n## On Prop 69\n\nProp 69 is about adding CosmWASM to the hub. I have repeatedly talked about\nthe dangers of adding CosmWASM to the hub, including a document shared two\nyears ago.\n\nhttps://github.com/jaekwon/cosmos_roadmap/tree/master/shape_of_cosmos#smart-contracts\n\nEven before prop 69, I had declared publicly that stakers voting yes to adding\nWASM on the hub would not receive airdrops. Primarily, because it increases\nthe surface area for attack by an order of magnitude. CosmWASM adds two layers\nof new complexity to the hub. WASM itself, as well as CosmWASM. WASM as a spec\nand its implementations are still maturing, and though available on browsers,\nand some blockchains, it still hasn't gone through the gauntlet of time. All\nnew complex technologies like WASM, like Java, Linux, and even Go, in hindsight\nhave numerous bugs that could have or were used maliciously. The same will be\ntrue of any WASM integration with the hub, and this potential for exploits\ncombined with the massive potential rewards (especially of pegged PoW tokens)\nmakes such exploits an inevitability.\n\nIn Juno recently there was a bug that halted the chain for three days. Worse\ncan happen on the Cosmos Hub. The very identity of the Cosmos Hub (it's most\nvaluable asset is specifically a schelling point brand, of being a \"common IBC\nhub\") is threatened if a bug were to result in the theft or loss of coins. On\nplatforms like Ethereum or Polkadot, perhaps they would have a better time\nrolling back the chain to undo a hack as in the DAO hack. The major difference\nwith an *IBC hub* is that it cannot simply reverse the transactions of other\nchains.\n\nWe have yet to experience such a bug in any of our zones on a major scale, and\nhave yet to learn how to coordinate in the case of such in an interconnected\nweb of zones. Where are the planning documents for disaster scenarios? Between\nPoS chains with good governance, we will learn how to roll back transactions\nacross connections, if need be in exceptional circumstances, but we aren't\nthere yet. This option isn't even available with pegged PoW coins.\n\nYes, the contracts that are approved to run will be governance gated, but this\nis not enough. For one, even with perfect governance, there are two new pieces\nof complexity that will see more zero day bugs in the future for exploitation.\nIn terms of governance, the contracts are probably going to be written in Rust,\nand so suddenly the validators that joined the project by inspecting the Go\ncode is now required to also audit Rust code. But also, we are now truly\nopening the doors to all kinds of contracts to be run, because while governance\ndoes sometimes reject proposals, it is generally accommodating to new features\nespecially endorsed by core contributors.\n\nI know of three alternatives:\n\n(1) we can use IBC to offload features to other zones. For liquid staking\n(which should not be the focus of the hub) the hub could allow validators to\nrestrict the destination of unbonded ATOMs, and smart contracts running on\nother zones can distribute those ATOMs according to the logic of whatever\nliquid staking contract. This ensures separation of concerns, and a minimal\nhub.\n\n(2) we can use Go plugins to extend the functionality of the chain.\n\n(3) we can do nothing. if liquid staking is such a big deal, something is wrong\nabout priorities for a cosmic \"hub\". If the liquid staking market is larger\nthan the base non-liquid staking market, the system is open for manipulation\nand is insecure. The focus should not be on self-limiting use-cases, but the\ninfinite market of running validators with replicated security, perhaps running\na simple dex, and most of all innovating on and offering interchain security,\nthe business of judging validation faults as related to Tendermint, and perhaps\nthe interpretation and enforcement of self-enforced customs (law) of a\nblockchain as defined by its shareholders who defer validation (and perhaps\njudicial services) to the Cosmos Hub because it has a reputation for being the\nlongest ever running proof of stake hub that has never gone down, even as\ncompared to the upcoming Ethereum2.0.\n\nAnd note, I'm not proposing that the ATOM stakers forgo the benefits of\nsupporting contracts with CosmWASM. I support Juno and Tardigrade and Ethan\nFrey’s work, but I also support the Hub running shared security, especially\nsimple replicated shared security where the validators also validate other\nchains. I think this, and interchain staking, are the only profit models needed\nfor the hub (besides being a hub). NOTE: But those \"consumer chains\" ought to\nbe provided with full disclosures that the Cosmos Hub validators do not\nmaintain their respective software (as it would be impossible to audit all\nzones that would benefit from the hub's security) but only offering validation\nservices as-is. This would force the hub validators to solve process isolation\n(and I would much prefer building the protocol to NOT require particular\nsolutions like Docker, but allows validator choice), or else they would quickly\nget slashed from malware (and that would be good to prune those validators from\nthe hub).\n\nSo many options that don't require putting WASM on the Cosmos Hub.\n\n------------------------------------\n\n## On Incentivized Votes\n\nIn corporations, you can buy shares to influence the outcome of governance\nvotes. In democracy, this is not allowed because the vote could be bought to\ninfringe upon the rights of other people.\n\nWhat do you do when the chain's own core contributors proposes a proposal that\nyou judge damages the integrity of the system? I think that's a good time to\ncreate a fork of the hub's ATOM distribution led by a new development team.\nSometimes this option is the only option because of safety concerns, and this\nis the case for me here.\n\n### Why is the snapshot date 5/19/2022?\n\nA snapshot in the past is more vulnerable to insider gaming, because there is\nan imbalance of information--only the coordinator knows, and so can game the\npremine.\n\nIt is good to give many people the advantage of participating in a snapshot.\nExcluding anyone who would have been an ally of a chain, in turn creates\nanimosity that would rather see another project succeed where they are\nincluded.\n\nEven before the proposal I had pre-declared that anyone who votes for WASM on\nthe hub would not receive a gno.land airdrop. The proposer probably knew this\nwhen the proposal was submitted.\n\nThe snapshot date would have been 7/4/2022, because that is Independence Day in\nthe United States. I originally chose Independence Day because of the general\noriginal mission of Tendermint, Cosmos, Bitcoin, and the crypto spirit; and\nbecause the United States (as flawed as it is) is the best historic ideal of\nhuman liberty we've had since before the days of Rome.\n\nThen prop 69 was submitted. I had said previously that we would exclude those\nwho vote in favor of WASM on the hub, but we don't have the tools yet to tally\nthe movement of tainted ATOMs after the unbonding period for the hub. So I\ndecided to move the snapshot date to 5/19/2022.\n\nNow with prop 69, I see that to me, 21 days after the beginning of proposal\n\\#69, 5/20/2022 (but 5/19/2022 PDT) is a chance to create a new community within\nthe Cosmos ecosystem that champions safety with a zero tolerance policy and a\nmission to develop social coordination tools like the GNO smart contract VM, to\ncreate even better governing bodies than the one we have today.\n\n### Gno.land and Cosmos Hub\n\nNow, I feel compelled to exit should prop \\#69 pass. But as it is now, 16.57%\nare voting YES, while NO and NO WITH VETO have 70.73% and 8.38% of the votes\nwith turnout at 30%. If the proposal does not pass, I would feel no need to\nexit. For as long as the Cosmos Hub remains minimal and secure, we will favor\nit as the dominant or only token hub connected to gno.land via the current IBC\nimplementations for the purpose of interchain token transfers. It's a job that\nwe'd rather not solve, as specialization is what will get us to the finish line\nbefore other platforms do, and also I'm quite hooked on gnolang programming and\njust want to make gnolang apps. Not everybody wants to build a DTCC, but many\nwould prefer to use it.\n\n### Airdrop distribution\n\nWhen I was asked on Cryptocito what I would have changed if I were to do it all\nagain, well, I would put the ICF in the hands of the chain. So in gno.land, the\nICF's portion of $GNOT will go to DAOs on gno.land. As for me, I have a\nsignificant amount of ATOMs that voted for NO WITH VETO, but most of my tokens\nby far are with the company that I previously founded, then called All in Bits,\nInc. AIB will not receive any $GNOT except by completing negotiations with me,\nwhich is taking a lot longer than is reasonable--or not.\n\nFor reference, for the genesis of the Cosmos Hub, the total distribution for\nboth entities was 20% of all ATOMs, and today it is still significant. The\ntotal premine that I control directly or indirectly will not exceed 1/3 of the\ntotal $GNOT distribution, but I am considering 20% again.\n\nSome more guidelines, which may change, so don't take anything here as\nfinancial advice:\n\n* NO with VETO is slightly better than NO.\n* NO is better than ABSTAIN.\n* ABSTAIN is better than not voting at all.\n* Delegators inherit the votes of the validators.\n* If you vote YES on \\#69, you will not receive gno.land $GNOTs.\n\nNOTE: If you don't like my airdrop rules, you are free to make your own, and if\nyou're nice you can even run gno.land contracts if you so want there, or you\ncan just run a fork of gaia.\n\nIf you have a better ideal for such an exit-drop by tweaking the governance\nmodule, I'd love to hear your feedback, or generally how you think I could have\ndone this better. Some say that they don't want to see more of this kind of\nforking, but I think we ought to celebrate it instead.\n\n----------------------------------------\n\n## Conclusion\n\nHere's a peace offering.\n\nJust change your vote from YES to NO, and I will not intervene upon the second\nsubmission of the proposal (and I would even fund its deposit if need be). But\nif you instead feel strongly about signaling in favor of CosmWASM, here you can\nexpress it, and I celebrate you, for being different than I, and wish you the\nbest of luck. That is equivalent to a no-confidence vote on gno.land, and is a\nproper way to diss me. Again, I salute you.\n\nIf you can reconsider your vote to be a NO, or even better, a NO WITH VETO, I\nwelcome you to gno.land. Happy 5/19/2022 (5/20/2022 Europe) Gno.land\nIndependence Day!\n","2022-05-02T13:17:22Z","jaekwon","peace,cosmos,gno.land"]}],"fee":{"gas_wanted":"3000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"AIZPqgc9pZsnIMEYRuenmYNvtAF8kCUYx0rwbqz8jJ92eUudjHn1dAJp49U0cX1x1HWvwk2oY5urfglg57jYXA=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["peace","Peace!","\n\nI've never been put in such a difficult position, of having information that I\ncannot reveal. And if you know me, you know that I like to speak my mind. But\nI cannot say the things that I would rather say, because you get a lot of flack\nfor saying anything bad about a public chain.\n\nSo I have been sitting on this issue, losing sleep about it for years, because\nit leads me to worry about the safety of the hub. From an external person's\npoint of view, the solution is obvious -- reveal the information for the\nbetterment of everyone, no matter the consequences, because that is the right\nthing to do. As a stakeholder, and I agree with the majority of the community\nthat peace and silence is better, with exceptions.\n\nSo without turning this into a war of accusations bringing back past drama,\nlet's just do this: dear core contributors, Ethan Buchman, Zaki Manian, Jack\nZampolin, and everyone, here is my peace plan.\n\n----------------------------------------\n\n## On Prop 69\n\nProp 69 is about adding CosmWASM to the hub. I have repeatedly talked about\nthe dangers of adding CosmWASM to the hub, including a document shared two\nyears ago.\n\nhttps://github.com/jaekwon/cosmos_roadmap/tree/master/shape_of_cosmos#smart-contracts\n\nEven before prop 69, I had declared publicly that stakers voting yes to adding\nWASM on the hub would not receive airdrops. Primarily, because it increases\nthe surface area for attack by an order of magnitude. CosmWASM adds two layers\nof new complexity to the hub. WASM itself, as well as CosmWASM. WASM as a spec\nand its implementations are still maturing, and though available on browsers,\nand some blockchains, it still hasn't gone through the gauntlet of time. All\nnew complex technologies like WASM, like Java, Linux, and even Go, in hindsight\nhave numerous bugs that could have or were used maliciously. The same will be\ntrue of any WASM integration with the hub, and this potential for exploits\ncombined with the massive potential rewards (especially of pegged PoW tokens)\nmakes such exploits an inevitability.\n\nIn Juno recently there was a bug that halted the chain for three days. Worse\ncan happen on the Cosmos Hub. The very identity of the Cosmos Hub (it's most\nvaluable asset is specifically a schelling point brand, of being a \"common IBC\nhub\") is threatened if a bug were to result in the theft or loss of coins. On\nplatforms like Ethereum or Polkadot, perhaps they would have a better time\nrolling back the chain to undo a hack as in the DAO hack. The major difference\nwith an *IBC hub* is that it cannot simply reverse the transactions of other\nchains.\n\nWe have yet to experience such a bug in any of our zones on a major scale, and\nhave yet to learn how to coordinate in the case of such in an interconnected\nweb of zones. Where are the planning documents for disaster scenarios? Between\nPoS chains with good governance, we will learn how to roll back transactions\nacross connections, if need be in exceptional circumstances, but we aren't\nthere yet. This option isn't even available with pegged PoW coins.\n\nYes, the contracts that are approved to run will be governance gated, but this\nis not enough. For one, even with perfect governance, there are two new pieces\nof complexity that will see more zero day bugs in the future for exploitation.\nIn terms of governance, the contracts are probably going to be written in Rust,\nand so suddenly the validators that joined the project by inspecting the Go\ncode is now required to also audit Rust code. But also, we are now truly\nopening the doors to all kinds of contracts to be run, because while governance\ndoes sometimes reject proposals, it is generally accommodating to new features\nespecially endorsed by core contributors.\n\nI know of three alternatives:\n\n(1) we can use IBC to offload features to other zones. For liquid staking\n(which should not be the focus of the hub) the hub could allow validators to\nrestrict the destination of unbonded ATOMs, and smart contracts running on\nother zones can distribute those ATOMs according to the logic of whatever\nliquid staking contract. This ensures separation of concerns, and a minimal\nhub.\n\n(2) we can use Go plugins to extend the functionality of the chain.\n\n(3) we can do nothing. if liquid staking is such a big deal, something is wrong\nabout priorities for a cosmic \"hub\". If the liquid staking market is larger\nthan the base non-liquid staking market, the system is open for manipulation\nand is insecure. The focus should not be on self-limiting use-cases, but the\ninfinite market of running validators with replicated security, perhaps running\na simple dex, and most of all innovating on and offering interchain security,\nthe business of judging validation faults as related to Tendermint, and perhaps\nthe interpretation and enforcement of self-enforced customs (law) of a\nblockchain as defined by its shareholders who defer validation (and perhaps\njudicial services) to the Cosmos Hub because it has a reputation for being the\nlongest ever running proof of stake hub that has never gone down, even as\ncompared to the upcoming Ethereum2.0.\n\nAnd note, I'm not proposing that the ATOM stakers forgo the benefits of\nsupporting contracts with CosmWASM. I support Juno and Tardigrade and Ethan\nFrey’s work, but I also support the Hub running shared security, especially\nsimple replicated shared security where the validators also validate other\nchains. I think this, and interchain staking, are the only profit models needed\nfor the hub (besides being a hub). NOTE: But those \"consumer chains\" ought to\nbe provided with full disclosures that the Cosmos Hub validators do not\nmaintain their respective software (as it would be impossible to audit all\nzones that would benefit from the hub's security) but only offering validation\nservices as-is. This would force the hub validators to solve process isolation\n(and I would much prefer building the protocol to NOT require particular\nsolutions like Docker, but allows validator choice), or else they would quickly\nget slashed from malware (and that would be good to prune those validators from\nthe hub).\n\nSo many options that don't require putting WASM on the Cosmos Hub.\n\n------------------------------------\n\n## On Incentivized Votes\n\nIn corporations, you can buy shares to influence the outcome of governance\nvotes. In democracy, this is not allowed because the vote could be bought to\ninfringe upon the rights of other people.\n\nWhat do you do when the chain's own core contributors proposes a proposal that\nyou judge damages the integrity of the system? I think that's a good time to\ncreate a fork of the hub's ATOM distribution led by a new development team.\nSometimes this option is the only option because of safety concerns, and this\nis the case for me here.\n\n### Why is the snapshot date 5/19/2022?\n\nA snapshot in the past is more vulnerable to insider gaming, because there is\nan imbalance of information--only the coordinator knows, and so can game the\npremine.\n\nIt is good to give many people the advantage of participating in a snapshot.\nExcluding anyone who would have been an ally of a chain, in turn creates\nanimosity that would rather see another project succeed where they are\nincluded.\n\nEven before the proposal I had pre-declared that anyone who votes for WASM on\nthe hub would not receive a gno.land airdrop. The proposer probably knew this\nwhen the proposal was submitted.\n\nThe snapshot date would have been 7/4/2022, because that is Independence Day in\nthe United States. I originally chose Independence Day because of the general\noriginal mission of Tendermint, Cosmos, Bitcoin, and the crypto spirit; and\nbecause the United States (as flawed as it is) is the best historic ideal of\nhuman liberty we've had since before the days of Rome.\n\nThen prop 69 was submitted. I had said previously that we would exclude those\nwho vote in favor of WASM on the hub, but we don't have the tools yet to tally\nthe movement of tainted ATOMs after the unbonding period for the hub. So I\ndecided to move the snapshot date to 5/19/2022.\n\nNow with prop 69, I see that to me, 21 days after the beginning of proposal\n\\#69, 5/20/2022 (but 5/19/2022 PDT) is a chance to create a new community within\nthe Cosmos ecosystem that champions safety with a zero tolerance policy and a\nmission to develop social coordination tools like the GNO smart contract VM, to\ncreate even better governing bodies than the one we have today.\n\n### Gno.land and Cosmos Hub\n\nNow, I feel compelled to exit should prop \\#69 pass. But as it is now, 16.57%\nare voting YES, while NO and NO WITH VETO have 70.73% and 8.38% of the votes\nwith turnout at 30%. If the proposal does not pass, I would feel no need to\nexit. For as long as the Cosmos Hub remains minimal and secure, we will favor\nit as the dominant or only token hub connected to gno.land via the current IBC\nimplementations for the purpose of interchain token transfers. It's a job that\nwe'd rather not solve, as specialization is what will get us to the finish line\nbefore other platforms do, and also I'm quite hooked on gnolang programming and\njust want to make gnolang apps. Not everybody wants to build a DTCC, but many\nwould prefer to use it.\n\n### Airdrop distribution\n\nWhen I was asked on Cryptocito what I would have changed if I were to do it all\nagain, well, I would put the ICF in the hands of the chain. So in gno.land, the\nICF's portion of $GNOT will go to DAOs on gno.land. As for me, I have a\nsignificant amount of ATOMs that voted for NO WITH VETO, but most of my tokens\nby far are with the company that I previously founded, then called All in Bits,\nInc. AIB will not receive any $GNOT except by completing negotiations with me,\nwhich is taking a lot longer than is reasonable--or not.\n\nFor reference, for the genesis of the Cosmos Hub, the total distribution for\nboth entities was 20% of all ATOMs, and today it is still significant. The\ntotal premine that I control directly or indirectly will not exceed 1/3 of the\ntotal $GNOT distribution, but I am considering 20% again.\n\nSome more guidelines, which may change, so don't take anything here as\nfinancial advice:\n\n* NO with VETO is slightly better than NO.\n* NO is better than ABSTAIN.\n* ABSTAIN is better than not voting at all.\n* Delegators inherit the votes of the validators.\n* If you vote YES on \\#69, you will not receive gno.land $GNOTs.\n\nNOTE: If you don't like my airdrop rules, you are free to make your own, and if\nyou're nice you can even run gno.land contracts if you so want there, or you\ncan just run a fork of gaia.\n\nIf you have a better ideal for such an exit-drop by tweaking the governance\nmodule, I'd love to hear your feedback, or generally how you think I could have\ndone this better. Some say that they don't want to see more of this kind of\nforking, but I think we ought to celebrate it instead.\n\n----------------------------------------\n\n## Conclusion\n\nHere's a peace offering.\n\nJust change your vote from YES to NO, and I will not intervene upon the second\nsubmission of the proposal (and I would even fund its deposit if need be). But\nif you instead feel strongly about signaling in favor of CosmWASM, here you can\nexpress it, and I celebrate you, for being different than I, and wish you the\nbest of luck. That is equivalent to a no-confidence vote on gno.land, and is a\nproper way to diss me. Again, I salute you.\n\nIf you can reconsider your vote to be a NO, or even better, a NO WITH VETO, I\nwelcome you to gno.land. Happy 5/19/2022 (5/20/2022 Europe) Gno.land\nIndependence Day!\n","2022-05-02T13:17:22Z","jaekwon","peace,cosmos,gno.land"]}],"fee":{"gas_wanted":"3000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"AreS4Yn82WHVHfFfJYcHIhUNQWccXfAmogdMeDFoXHY9TgpAvSI/3ia/tdnFCsNFbc7oUUZDJJKmppi4793CvQ=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["peace","Peace!","\n\nI've never been put in such a difficult position, of having information that I\ncannot reveal. And if you know me, you know that I like to speak my mind. But\nI cannot say the things that I would rather say, because you get a lot of flack\nfor saying anything bad about a public chain.\n\nSo I have been sitting on this issue, losing sleep about it for years, because\nit leads me to worry about the safety of the hub. From an external person's\npoint of view, the solution is obvious -- reveal the information for the\nbetterment of everyone, no matter the consequences, because that is the right\nthing to do. As a stakeholder, and I agree with the majority of the community\nthat peace and silence is better, with exceptions.\n\nSo without turning this into a war of accusations bringing back past drama,\nlet's just do this: dear core contributors, Ethan Buchman, Zaki Manian, Jack\nZampolin, and everyone, here is my peace plan.\n\n----------------------------------------\n\n## On Prop 69\n\nProp 69 is about adding CosmWASM to the hub. I have repeatedly talked about\nthe dangers of adding CosmWASM to the hub, including a document shared two\nyears ago.\n\nhttps://github.com/jaekwon/cosmos_roadmap/tree/master/shape_of_cosmos#smart-contracts\n\nEven before prop 69, I had declared publicly that stakers voting yes to adding\nWASM on the hub would not receive airdrops. Primarily, because it increases\nthe surface area for attack by an order of magnitude. CosmWASM adds two layers\nof new complexity to the hub. WASM itself, as well as CosmWASM. WASM as a spec\nand its implementations are still maturing, and though available on browsers,\nand some blockchains, it still hasn't gone through the gauntlet of time. All\nnew complex technologies like WASM, like Java, Linux, and even Go, in hindsight\nhave numerous bugs that could have or were used maliciously. The same will be\ntrue of any WASM integration with the hub, and this potential for exploits\ncombined with the massive potential rewards (especially of pegged PoW tokens)\nmakes such exploits an inevitability.\n\nIn Juno recently there was a bug that halted the chain for three days. Worse\ncan happen on the Cosmos Hub. The very identity of the Cosmos Hub (it's most\nvaluable asset is specifically a schelling point brand, of being a \"common IBC\nhub\") is threatened if a bug were to result in the theft or loss of coins. On\nplatforms like Ethereum or Polkadot, perhaps they would have a better time\nrolling back the chain to undo a hack as in the DAO hack. The major difference\nwith an *IBC hub* is that it cannot simply reverse the transactions of other\nchains.\n\nWe have yet to experience such a bug in any of our zones on a major scale, and\nhave yet to learn how to coordinate in the case of such in an interconnected\nweb of zones. Where are the planning documents for disaster scenarios? Between\nPoS chains with good governance, we will learn how to roll back transactions\nacross connections, if need be in exceptional circumstances, but we aren't\nthere yet. This option isn't even available with pegged PoW coins.\n\nYes, the contracts that are approved to run will be governance gated, but this\nis not enough. For one, even with perfect governance, there are two new pieces\nof complexity that will see more zero day bugs in the future for exploitation.\nIn terms of governance, the contracts are probably going to be written in Rust,\nand so suddenly the validators that joined the project by inspecting the Go\ncode is now required to also audit Rust code. But also, we are now truly\nopening the doors to all kinds of contracts to be run, because while governance\ndoes sometimes reject proposals, it is generally accommodating to new features\nespecially endorsed by core contributors.\n\nI know of three alternatives:\n\n(1) we can use IBC to offload features to other zones. For liquid staking\n(which should not be the focus of the hub) the hub could allow validators to\nrestrict the destination of unbonded ATOMs, and smart contracts running on\nother zones can distribute those ATOMs according to the logic of whatever\nliquid staking contract. This ensures separation of concerns, and a minimal\nhub.\n\n(2) we can use Go plugins to extend the functionality of the chain.\n\n(3) we can do nothing. if liquid staking is such a big deal, something is wrong\nabout priorities for a cosmic \"hub\". If the liquid staking market is larger\nthan the base non-liquid staking market, the system is open for manipulation\nand is insecure. The focus should not be on self-limiting use-cases, but the\ninfinite market of running validators with replicated security, perhaps running\na simple dex, and most of all innovating on and offering interchain security,\nthe business of judging validation faults as related to Tendermint, and perhaps\nthe interpretation and enforcement of self-enforced customs (law) of a\nblockchain as defined by its shareholders who defer validation (and perhaps\njudicial services) to the Cosmos Hub because it has a reputation for being the\nlongest ever running proof of stake hub that has never gone down, even as\ncompared to the upcoming Ethereum2.0.\n\nAnd note, I'm not proposing that the ATOM stakers forgo the benefits of\nsupporting contracts with CosmWASM. I support Juno and Tardigrade and Ethan\nFrey’s work, but I also support the Hub running shared security, especially\nsimple replicated shared security where the validators also validate other\nchains. I think this, and interchain staking, are the only profit models needed\nfor the hub (besides being a hub). NOTE: But those \"consumer chains\" ought to\nbe provided with full disclosures that the Cosmos Hub validators do not\nmaintain their respective software (as it would be impossible to audit all\nzones that would benefit from the hub's security) but only offering validation\nservices as-is. This would force the hub validators to solve process isolation\n(and I would much prefer building the protocol to NOT require particular\nsolutions like Docker, but allows validator choice), or else they would quickly\nget slashed from malware (and that would be good to prune those validators from\nthe hub).\n\nSo many options that don't require putting WASM on the Cosmos Hub.\n\n------------------------------------\n\n## On Incentivized Votes\n\nIn corporations, you can buy shares to influence the outcome of governance\nvotes. In democracy, this is not allowed because the vote could be bought to\ninfringe upon the rights of other people.\n\nWhat do you do when the chain's own core contributors proposes a proposal that\nyou judge damages the integrity of the system? I think that's a good time to\ncreate a fork of the hub's ATOM distribution led by a new development team.\nSometimes this option is the only option because of safety concerns, and this\nis the case for me here.\n\n### Why is the snapshot date 5/19/2022?\n\nA snapshot in the past is more vulnerable to insider gaming, because there is\nan imbalance of information--only the coordinator knows, and so can game the\npremine.\n\nIt is good to give many people the advantage of participating in a snapshot.\nExcluding anyone who would have been an ally of a chain, in turn creates\nanimosity that would rather see another project succeed where they are\nincluded.\n\nEven before the proposal I had pre-declared that anyone who votes for WASM on\nthe hub would not receive a gno.land airdrop. The proposer probably knew this\nwhen the proposal was submitted.\n\nThe snapshot date would have been 7/4/2022, because that is Independence Day in\nthe United States. I originally chose Independence Day because of the general\noriginal mission of Tendermint, Cosmos, Bitcoin, and the crypto spirit; and\nbecause the United States (as flawed as it is) is the best historic ideal of\nhuman liberty we've had since before the days of Rome.\n\nThen prop 69 was submitted. I had said previously that we would exclude those\nwho vote in favor of WASM on the hub, but we don't have the tools yet to tally\nthe movement of tainted ATOMs after the unbonding period for the hub. So I\ndecided to move the snapshot date to 5/19/2022.\n\nNow with prop 69, I see that to me, 21 days after the beginning of proposal\n\\#69, 5/20/2022 (but 5/19/2022 PDT) is a chance to create a new community within\nthe Cosmos ecosystem that champions safety with a zero tolerance policy and a\nmission to develop social coordination tools like the GNO smart contract VM, to\ncreate even better governing bodies than the one we have today.\n\n### Gno.land and Cosmos Hub\n\nNow, I feel compelled to exit should prop \\#69 pass. But as it is now, 16.57%\nare voting YES, while NO and NO WITH VETO have 70.73% and 8.38% of the votes\nwith turnout at 30%. If the proposal does not pass, I would feel no need to\nexit. For as long as the Cosmos Hub remains minimal and secure, we will favor\nit as the dominant or only token hub connected to gno.land via the current IBC\nimplementations for the purpose of interchain token transfers. It's a job that\nwe'd rather not solve, as specialization is what will get us to the finish line\nbefore other platforms do, and also I'm quite hooked on gnolang programming and\njust want to make gnolang apps. Not everybody wants to build a DTCC, but many\nwould prefer to use it.\n\n### Airdrop distribution\n\nWhen I was asked on Cryptocito what I would have changed if I were to do it all\nagain, well, I would put the ICF in the hands of the chain. So in gno.land, the\nICF's portion of $GNOT will go to DAOs on gno.land. As for me, I have a\nsignificant amount of ATOMs that voted for NO WITH VETO, but most of my tokens\nby far are with the company that I previously founded, then called All in Bits,\nInc. AIB will not receive any $GNOT except by completing negotiations with me,\nwhich is taking a lot longer than is reasonable--or not.\n\nFor reference, for the genesis of the Cosmos Hub, the total distribution for\nboth entities was 20% of all ATOMs, and today it is still significant. The\ntotal premine that I control directly or indirectly will not exceed 1/3 of the\ntotal $GNOT distribution, but I am considering 20% again.\n\nSome more guidelines, which may change, so don't take anything here as\nfinancial advice:\n\n* NO with VETO is slightly better than NO.\n* NO is better than ABSTAIN.\n* ABSTAIN is better than not voting at all.\n* Delegators inherit the votes of the validators.\n* If you vote YES on \\#69, you will not receive gno.land $GNOTs.\n\nNOTE: If you don't like my airdrop rules, you are free to make your own, and if\nyou're nice you can even run gno.land contracts if you so want there, or you\ncan just run a fork of gaia.\n\nIf you have a better ideal for such an exit-drop by tweaking the governance\nmodule, I'd love to hear your feedback, or generally how you think I could have\ndone this better. Some say that they don't want to see more of this kind of\nforking, but I think we ought to celebrate it instead.\n\n----------------------------------------\n\n## Conclusion\n\nHere's a peace offering.\n\nJust change your vote from YES to NO, and I will not intervene upon the second\nsubmission of the proposal (and I would even fund its deposit if need be). But\nif you instead feel strongly about signaling in favor of CosmWASM, here you can\nexpress it, and I celebrate you, for being different than I, and wish you the\nbest of luck. That is equivalent to a no-confidence vote on gno.land, and is a\nproper way to diss me. Again, I salute you.\n\nIf you can reconsider your vote to be a NO, or even better, a NO WITH VETO, I\nwelcome you to gno.land. Happy 5/19/2022 (5/20/2022 Europe) Gno.land\nIndependence Day!\n","2022-05-02T13:17:22Z","jaekwon","peace,cosmos,gno.land"]}],"fee":{"gas_wanted":"3000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"9FHQJpRanZpBW8N2P0DOgbpMfePf3PZSZ6nJq5GNAqQ848PRc2pNBCzTFX7Z7G51zEpSSC0aqhnIzem3UpoPnw=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["intro","Intro to Gnoland - The Smart Contract Platform to Improve Our Understanding of the World","\n_Welcome to Gno.land. This is the official site to learn about the Gnolang (Gno) programming language and the Gno.land smart contract platform, as well as understand the motivations behind Gno and our core values and mission. We’re starting a series of blog posts and holding regular community calls and AMAs so that you can stay up to date with upcoming developments and dive deeper into the Gno World Order. Stay tuned._\n\n## What Is Gno.land?\n\nGno.land (pronounced no-land) is a layer 1 smart contract platform invented by Jae Kwon, co-founder of Cosmos and Tendermint, to address multiple issues in the blockchain space — in particular, the ease of use and intuitiveness of smart contract programming platforms. Beyond offering succinctness, composability, expressivity, and completeness not found in any other smart contract platform, we aim to challenge the regime of information censorship that we find ourselves living in today.\n\nBy using the programming language Gnolang (Gno), an interpreted version of the widely-used Golang (Go) language, using a state-of-the-art VM written in Go, we want to lower the barrier to entry to web3 and make it simple for developers (particularly existing web2 developers) to write smart contracts and other blockchain applications without having to learn a programming language that is limited by design or exclusive to a single blockchain ecosystem.\n\n### Gnolang (Gno) Is Essential to Broader Adoption of Web3\n\nFor web3 to grow in a sustainable way, we need technological solutions that are designed for the blockchain with programming languages that are universally adopted, secure, composable, and complete. The main programming language currently used for creating smart contracts, Solidity, is designed for one purpose only (writing smart contracts) and lacks the completeness of a general-purpose language.\n\nSolidity removes many of the complexities that blockchain programming requires (such as memory management, ensuring that the code is deterministic, and understanding how the entire tech stack is implemented) allowing developers to quickly build succinct smart contracts. However, Solidity is only used for smart contracts on EVM-compatible blockchains (like Ethereum, Polygon, or EVMOS) and its design is limited by the limitations of the EVM. In addition, developers have to learn several languages if they want to understand the whole stack or work across different ecosystems.\n\nGo, on the other hand, is a well-designed complete programming language with its foundation based on composable structures, designed by the creators of Plan 9. This allows developers to rapidly accelerate application development and adopt a modular structure by reusing and reassembling existing modules without building from scratch. They can embed one structure inside another in an intuitive way while preserving localism, and the language specification is simple, successfully balancing practicality and minimalism.\n\nGo is widely used, especially among existing web2 developers. It’s easier to learn and can be used to program almost anything, such as GoEthereum or Tendermint. Every part of the Gno.land stack is written in Go so that one person can understand the entire system just by studying a relatively small code base. The Go language is so well designed that the Gnolang smart contract system will become the new gold standard for smart contract development and other blockchain (and even non-blockchain) applications.\n\n### Security Is a Built-in Feature of Go (Golang)\n\nBeyond object embedding, closures, importing of modules, composability of programs, and interfaces that allow you to implement a specific set of functions, Go supports secure programming through exported/non-exported fields, enabling “least-authority” design. It is easy to create objects and APIs that expose only what should be accessible to callers while hiding what should not be simply by the capitalization of letters, thus allowing a succinct representation of secure logic that can be called by multiple users.\n\nAnother major advantage of Go is that the language comes with an ecosystem of great tooling, like the compiler and third-party tools that statically analyze code. Gno inherits these advantages from Go directly to create a smart contract programming language that is safe and helps developers to write secure code relying on the compiler, parser, and interpreter to give warning alerts for common mistakes.\n\n### How Gnolang (Gno) Differs from Golang (Go)\n\n[![Go and Gno](https://gnolang.github.io/blog/2022-11-21_intro/src/thumbs/go-and-gno.png)](https://gnolang.github.io/blog/2022-11-21_intro/src/go-and-gno.png)\n\n_Image 1: Gnolang - Like Go but specific to the blockchain_\n\nGno is around 99% identical to Go and most people can code in Gno from day one, even minute one. The Gno.land programming environment comes with blockchain-specific standard libraries, but any code that doesn’t use the blockchain-specific logic can run in Go with minimal processing. On the other hand, some libraries that don’t make sense in the blockchain context are not available in the Gno.land programming environment, such as network or operating-system access.\n\nOtherwise, Gno loads and uses many standard libraries that power Go, so most of the parsing of the source code is the same. Under the hood, the Gno code is parsed into an abstract syntax tree (AST) and the AST itself is used in the interpreter, rather than byte code as in many virtual machines such as Java, Python, or WASM. This makes even the Gno VM accessible to any Go programmer. The novel design of the Gno VM interpreter allows Gno to freeze and resume the program by persisting and loading the entire memory state. This allows (smart contract) programs to be succinct, as the programmer doesn’t have to serialize and deserialize objects to persist them into a database (unlike programming applications with the Cosmos SDK).\n\nThe composable nature of Go/Gno allows for type-checked interactions between contracts, making Gno.land safer and more powerful, as well as operationally cheaper and faster. Smart contracts on Gno.land will be light, simple, more focused, and easily interoperable — a network of interconnected contracts rather than siloed monoliths that limit interactions with other contracts.\n\n[![Gnolang code example](https://gnolang.github.io/blog/2022-11-21_intro/src/thumbs/code-example.jpg)](https://gnolang.github.io/blog/2022-11-21_intro/src/code-example.jpg)\n\n_Image 2: Code snippet from the Gno programming language_\n\nToday, Gno.land is the only blockchain instance in the world that supports Gno but tomorrow, there will be many chains with different names such as mydapp.zone, or mydao.xyz. Gno.land is the name of ONE chain and is not a name that will be used by other Gnolang-powered chains. Gno.land will remain a minimal hub with three main utilities:\n\n* Managing cross-Gnolang-chain fees/licenses\n* To be the (or an) official home for the best smart contracts\n* To provide new models of governance (w/ DAO modules)\n\n### Earning Rewards Through Proof-of-Contribution (PoC)\n\nThere are four main ways to earn rewards through PoC on the Gno.land chain:\n\n* Pre-defined tasks (technical or otherwise)\n* Pre-defined bounties\n* Retroactive bounties\n* Vesting-style rewards for core members\n\nBounties rewards (both pre-defined and retroactive) will be decided with “local rules,” through the agreement of the DAO with everything on-chain and transparent. If one human were to abuse the system, it would trigger and the bad actor would be slashed. We’ll go into depth on how you can earn rewards in an upcoming post.\n\n### Durable Solutions to Improve Our Understanding of the World\n\nOne of our inspirations for the Gno.land project is the gospels, which built a system of moral code that lasted for thousands of years. Part of Gno.land’s endurance will be having a minimal production implementation that becomes a reference for other implementations and a basis for education to elevate people's understanding of blockchains.\n\nGno.land aims to appeal to web developers, dApp developers, and blockchain builders to create solutions that help people improve their understanding of the world. With the barrage of misinformation delivered today from various factions, it’s impossible to separate the real from the fake. This causes a state of gridlock. We are living in a regime of information censorship spanning all important topics from climate change to global pandemics — a vast coordinated effort to prevent people from understanding the truth.\n\nBy just browsing Reddit, searching with Google, and scrolling through Facebook, Twitter, or Instagram, people are deliberately being [misled](https://twitter.com/lhfang/status/1587095890983936000) about key global issues that we all deserve clarity on. This is as malevolent as any type of censorship regime in the world — and we need to come together to challenge it and break the wall of censorship to achieve a functional democracy at last.\n\n### Gno.land’s Current Phase of Development\n\nGno.land is currently running in its third testnet and there will be several more testnets before the platform is production ready. Modern civilization wasn’t built in a day, and neither will Gno.land rush into committing to an exact launch date. However, the next development, an incentivized testnet called ‘Game of Realms’, is scheduled for Q1 2023.\n\nGame of Realms will be similar to ‘Game of Stakes’ on the Cosmos Hub and will reward the earliest and best contributors. If you would like to find out more about Game of Realms, Gno.land, Gnolang, or anything else, join us for our first community call with Gno.land Founder, Jae Kwon on November 22nd, at 4pm UTC on our [Discord channel](https://discord.gg/YFtMjWwUN7). We look forward to seeing you.\n","gnoland,gnosh,gnot,permissionless,consensus,proof-of-contribution,dao,governance,ibc,democracy,freedom"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"4k2MO7vrcD2gESgGuatJz9sJMl4qGffltcoZdB46iv51q1mhWABBcSuJ8oDfOHsjhrUQag1cI4suVkcw/HCsFA=="}],"memo":"from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["peace","Peace!","\n# Peace!\n\nI've never been put in such a difficult position, of having information that I\ncannot reveal. And if you know me, you know that I like to speak my mind. But\nI cannot say the things that I would rather say, because you get a lot of flack\nfor saying anything bad about a public chain.\n\nSo I have been sitting on this issue, losing sleep about it for years, because\nit leads me to worry about the safety of the hub. From an external person's\npoint of view, the solution is obvious -- reveal the information for the\nbetterment of everyone, no matter the consequences, because that is the right\nthing to do. As a stakeholder, and I agree with the majority of the community\nthat peace and silence is better, with exceptions.\n\nSo without turning this into a war of accusations bringing back past drama,\nlet's just do this: dear core contributors, Ethan Buchman, Zaki Manian, Jack\nZampolin, and everyone, here is my peace plan.\n\n----------------------------------------\n\n## On Prop 69\n\nProp 69 is about adding CosmWASM to the hub. I have repeatedly talked about\nthe dangers of adding CosmWASM to the hub, including a document shared two\nyears ago.\n\nhttps://github.com/jaekwon/cosmos_roadmap/tree/master/shape_of_cosmos#smart-contracts\n\nEven before prop 69, I had declared publicly that stakers voting yes to adding\nWASM on the hub would not receive airdrops. Primarily, because it increases\nthe surface area for attack by an order of magnitude. CosmWASM adds two layers\nof new complexity to the hub. WASM itself, as well as CosmWASM. WASM as a spec\nand its implementations are still maturing, and though available on browsers,\nand some blockchains, it still hasn't gone through the gauntlet of time. All\nnew complex technologies like WASM, like Java, Linux, and even Go, in hindsight\nhave numerous bugs that could have or were used maliciously. The same will be\ntrue of any WASM integration with the hub, and this potential for exploits\ncombined with the massive potential rewards (especially of pegged PoW tokens)\nmakes such exploits an inevitability.\n\nIn Juno recently there was a bug that halted the chain for three days. Worse\ncan happen on the Cosmos Hub. The very identity of the Cosmos Hub (it's most\nvaluable asset is specifically a schelling point brand, of being a \"common IBC\nhub\") is threatened if a bug were to result in the theft or loss of coins. On\nplatforms like Ethereum or Polkadot, perhaps they would have a better time\nrolling back the chain to undo a hack as in the DAO hack. The major difference\nwith an *IBC hub* is that it cannot simply reverse the transactions of other\nchains.\n\nWe have yet to experience such a bug in any of our zones on a major scale, and\nhave yet to learn how to coordinate in the case of such in an interconnected\nweb of zones. Where are the planning documents for disaster scenarios? Between\nPoS chains with good governance, we will learn how to roll back transactions\nacross connections, if need be in exceptional circumstances, but we aren't\nthere yet. This option isn't even available with pegged PoW coins.\n\nYes, the contracts that are approved to run will be governance gated, but this\nis not enough. For one, even with perfect governance, there are two new pieces\nof complexity that will see more zero day bugs in the future for exploitation.\nIn terms of governance, the contracts are probably going to be written in Rust,\nand so suddenly the validators that joined the project by inspecting the Go\ncode is now required to also audit Rust code. But also, we are now truly\nopening the doors to all kinds of contracts to be run, because while governance\ndoes sometimes reject proposals, it is generally accommodating to new features\nespecially endorsed by core contributors.\n\nI know of three alternatives:\n\n(1) we can use IBC to offload features to other zones. For liquid staking\n(which should not be the focus of the hub) the hub could allow validators to\nrestrict the destination of unbonded ATOMs, and smart contracts running on\nother zones can distribute those ATOMs according to the logic of whatever\nliquid staking contract. This ensures separation of concerns, and a minimal\nhub.\n\n(2) we can use Go plugins to extend the functionality of the chain.\n\n(3) we can do nothing. if liquid staking is such a big deal, something is wrong\nabout priorities for a cosmic \"hub\". If the liquid staking market is larger\nthan the base non-liquid staking market, the system is open for manipulation\nand is insecure. The focus should not be on self-limiting use-cases, but the\ninfinite market of running validators with replicated security, perhaps running\na simple dex, and most of all innovating on and offering interchain security,\nthe business of judging validation faults as related to Tendermint, and perhaps\nthe interpretation and enforcement of self-enforced customs (law) of a\nblockchain as defined by its shareholders who defer validation (and perhaps\njudicial services) to the Cosmos Hub because it has a reputation for being the\nlongest ever running proof of stake hub that has never gone down, even as\ncompared to the upcoming Ethereum2.0.\n\nAnd note, I'm not proposing that the ATOM stakers forgo the benefits of\nsupporting contracts with CosmWASM. I support Juno and Tardigrade and Ethan\nFrey’s work, but I also support the Hub running shared security, especially\nsimple replicated shared security where the validators also validate other\nchains. I think this, and interchain staking, are the only profit models needed\nfor the hub (besides being a hub). NOTE: But those \"consumer chains\" ought to\nbe provided with full disclosures that the Cosmos Hub validators do not\nmaintain their respective software (as it would be impossible to audit all\nzones that would benefit from the hub's security) but only offering validation\nservices as-is. This would force the hub validators to solve process isolation\n(and I would much prefer building the protocol to NOT require particular\nsolutions like Docker, but allows validator choice), or else they would quickly\nget slashed from malware (and that would be good to prune those validators from\nthe hub).\n\nSo many options that don't require putting WASM on the Cosmos Hub.\n\n------------------------------------\n\n## On Incentivized Votes\n\nIn corporations, you can buy shares to influence the outcome of governance\nvotes. In democracy, this is not allowed because the vote could be bought to\ninfringe upon the rights of other people.\n\nWhat do you do when the chain's own core contributors proposes a proposal that\nyou judge damages the integrity of the system? I think that's a good time to\ncreate a fork of the hub's ATOM distribution led by a new development team.\nSometimes this option is the only option because of safety concerns, and this\nis the case for me here.\n\n### Why is the snapshot date 5/19/2022?\n\nA snapshot in the past is more vulnerable to insider gaming, because there is\nan imbalance of information--only the coordinator knows, and so can game the\npremine.\n\nIt is good to give many people the advantage of participating in a snapshot.\nExcluding anyone who would have been an ally of a chain, in turn creates\nanimosity that would rather see another project succeed where they are\nincluded.\n\nEven before the proposal I had pre-declared that anyone who votes for WASM on\nthe hub would not receive a gno.land airdrop. The proposer probably knew this\nwhen the proposal was submitted.\n\nThe snapshot date would have been 7/4/2022, because that is Independence Day in\nthe United States. I originally chose Independence Day because of the general\noriginal mission of Tendermint, Cosmos, Bitcoin, and the crypto spirit; and\nbecause the United States (as flawed as it is) is the best historic ideal of\nhuman liberty we've had since before the days of Rome.\n\nThen prop 69 was submitted. I had said previously that we would exclude those\nwho vote in favor of WASM on the hub, but we don't have the tools yet to tally\nthe movement of tainted ATOMs after the unbonding period for the hub. So I\ndecided to move the snapshot date to 5/19/2022.\n\nNow with prop 69, I see that to me, 21 days after the beginning of proposal\n\\#69, 5/20/2022 (but 5/19/2022 PDT) is a chance to create a new community within\nthe Cosmos ecosystem that champions safety with a zero tolerance policy and a\nmission to develop social coordination tools like the GNO smart contract VM, to\ncreate even better governing bodies than the one we have today.\n\n### Gno.land and Cosmos Hub\n\nNow, I feel compelled to exit should prop \\#69 pass. But as it is now, 16.57%\nare voting YES, while NO and NO WITH VETO have 70.73% and 8.38% of the votes\nwith turnout at 30%. If the proposal does not pass, I would feel no need to\nexit. For as long as the Cosmos Hub remains minimal and secure, we will favor\nit as the dominant or only token hub connected to gno.land via the current IBC\nimplementations for the purpose of interchain token transfers. It's a job that\nwe'd rather not solve, as specialization is what will get us to the finish line\nbefore other platforms do, and also I'm quite hooked on gnolang programming and\njust want to make gnolang apps. Not everybody wants to build a DTCC, but many\nwould prefer to use it.\n\n### Airdrop distribution\n\nWhen I was asked on Cryptocito what I would have changed if I were to do it all\nagain, well, I would put the ICF in the hands of the chain. So in gno.land, the\nICF's portion of $GNOT will go to DAOs on gno.land. As for me, I have a\nsignificant amount of ATOMs that voted for NO WITH VETO, but most of my tokens\nby far are with the company that I previously founded, then called All in Bits,\nInc. AIB will not receive any $GNOT except by completing negotiations with me,\nwhich is taking a lot longer than is reasonable--or not.\n\nFor reference, for the genesis of the Cosmos Hub, the total distribution for\nboth entities was 20% of all ATOMs, and today it is still significant. The\ntotal premine that I control directly or indirectly will not exceed 1/3 of the\ntotal $GNOT distribution, but I am considering 20% again.\n\nSome more guidelines, which may change, so don't take anything here as\nfinancial advice:\n\n* NO with VETO is slightly better than NO.\n* NO is better than ABSTAIN.\n* ABSTAIN is better than not voting at all.\n* Delegators inherit the votes of the validators.\n* If you vote YES on \\#69, you will not receive gno.land $GNOTs.\n\nNOTE: If you don't like my airdrop rules, you are free to make your own, and if\nyou're nice you can even run gno.land contracts if you so want there, or you\ncan just run a fork of gaia.\n\nIf you have a better ideal for such an exit-drop by tweaking the governance\nmodule, I'd love to hear your feedback, or generally how you think I could have\ndone this better. Some say that they don't want to see more of this kind of\nforking, but I think we ought to celebrate it instead.\n\n----------------------------------------\n\n## Conclusion\n\nHere's a peace offering.\n\nJust change your vote from YES to NO, and I will not intervene upon the second\nsubmission of the proposal (and I would even fund its deposit if need be). But\nif you instead feel strongly about signaling in favor of CosmWASM, here you can\nexpress it, and I celebrate you, for being different than I, and wish you the\nbest of luck. That is equivalent to a no-confidence vote on gno.land, and is a\nproper way to diss me. Again, I salute you.\n\nIf you can reconsider your vote to be a NO, or even better, a NO WITH VETO, I\nwelcome you to gno.land. Happy 5/19/2022 (5/20/2022 Europe) Gno.land\nIndependence Day!\n","peace,cosmos,gno.land"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"5QODfgLxp57lxaOyNh3ypEneVDeMaiVSR73sgItbAI0g2Mxpyy8lNR9CAc3q4GZBfxN+GlJnpMoK7VgNOQcAQA=="}],"memo":"from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["intro","Intro to Gnoland - The Smart Contract Platform to Improve Our Understanding of the World","\n_Welcome to Gno.land. This is the official site to learn about the Gnolang (Gno) programming language and the Gno.land smart contract platform, as well as understand the motivations behind Gno and our core values and mission. We’re starting a series of blog posts and holding regular community calls and AMAs so that you can stay up to date with upcoming developments and dive deeper into the Gno World Order. Stay tuned._\n\n## What Is Gno.land?\n\nGno.land (pronounced no-land) is a layer 1 smart contract platform invented by Jae Kwon, co-founder of Cosmos and Tendermint, to address multiple issues in the blockchain space — in particular, the ease of use and intuitiveness of smart contract programming platforms. Beyond offering succinctness, composability, expressivity, and completeness not found in any other smart contract platform, we aim to challenge the regime of information censorship that we find ourselves living in today.\n\nBy using the programming language Gnolang (Gno), an interpreted version of the widely-used Golang (Go) language, using a state-of-the-art VM written in Go, we want to lower the barrier to entry to web3 and make it simple for developers (particularly existing web2 developers) to write smart contracts and other blockchain applications without having to learn a programming language that is limited by design or exclusive to a single blockchain ecosystem.\n\n### Gnolang (Gno) Is Essential to Broader Adoption of Web3\n\nFor web3 to grow in a sustainable way, we need technological solutions that are designed for the blockchain with programming languages that are universally adopted, secure, composable, and complete. The main programming language currently used for creating smart contracts, Solidity, is designed for one purpose only (writing smart contracts) and lacks the completeness of a general-purpose language.\n\nSolidity removes many of the complexities that blockchain programming requires (such as memory management, ensuring that the code is deterministic, and understanding how the entire tech stack is implemented) allowing developers to quickly build succinct smart contracts. However, Solidity is only used for smart contracts on EVM-compatible blockchains (like Ethereum, Polygon, or EVMOS) and its design is limited by the limitations of the EVM. In addition, developers have to learn several languages if they want to understand the whole stack or work across different ecosystems.\n\nGo, on the other hand, is a well-designed complete programming language with its foundation based on composable structures, designed by the creators of Plan 9. This allows developers to rapidly accelerate application development and adopt a modular structure by reusing and reassembling existing modules without building from scratch. They can embed one structure inside another in an intuitive way while preserving localism, and the language specification is simple, successfully balancing practicality and minimalism.\n\nGo is widely used, especially among existing web2 developers. It’s easier to learn and can be used to program almost anything, such as GoEthereum or Tendermint. Every part of the Gno.land stack is written in Go so that one person can understand the entire system just by studying a relatively small code base. The Go language is so well designed that the Gnolang smart contract system will become the new gold standard for smart contract development and other blockchain (and even non-blockchain) applications.\n\n### Security Is a Built-in Feature of Go (Golang)\n\nBeyond object embedding, closures, importing of modules, composability of programs, and interfaces that allow you to implement a specific set of functions, Go supports secure programming through exported/non-exported fields, enabling “least-authority” design. It is easy to create objects and APIs that expose only what should be accessible to callers while hiding what should not be simply by the capitalization of letters, thus allowing a succinct representation of secure logic that can be called by multiple users.\n\nAnother major advantage of Go is that the language comes with an ecosystem of great tooling, like the compiler and third-party tools that statically analyze code. Gno inherits these advantages from Go directly to create a smart contract programming language that is safe and helps developers to write secure code relying on the compiler, parser, and interpreter to give warning alerts for common mistakes.\n\n### How Gnolang (Gno) Differs from Golang (Go)\n\n[![Go and Gno](https://gnolang.github.io/blog/2022-11-21_intro/src/thumbs/go-and-gno.png)](https://gnolang.github.io/blog/2022-11-21_intro/src/go-and-gno.png)\n\n_Image 1: Gnolang - Like Go but specific to the blockchain_\n\nGno is around 99% identical to Go and most people can code in Gno from day one, even minute one. The Gno.land programming environment comes with blockchain-specific standard libraries, but any code that doesn’t use the blockchain-specific logic can run in Go with minimal processing. On the other hand, some libraries that don’t make sense in the blockchain context are not available in the Gno.land programming environment, such as network or operating-system access.\n\nOtherwise, Gno loads and uses many standard libraries that power Go, so most of the parsing of the source code is the same. Under the hood, the Gno code is parsed into an abstract syntax tree (AST) and the AST itself is used in the interpreter, rather than byte code as in many virtual machines such as Java, Python, or WASM. This makes even the Gno VM accessible to any Go programmer. The novel design of the Gno VM interpreter allows Gno to freeze and resume the program by persisting and loading the entire memory state. This allows (smart contract) programs to be succinct, as the programmer doesn’t have to serialize and deserialize objects to persist them into a database (unlike programming applications with the Cosmos SDK).\n\nThe composable nature of Go/Gno allows for type-checked interactions between contracts, making Gno.land safer and more powerful, as well as operationally cheaper and faster. Smart contracts on Gno.land will be light, simple, more focused, and easily interoperable — a network of interconnected contracts rather than siloed monoliths that limit interactions with other contracts.\n\n[![Gnolang code example](https://gnolang.github.io/blog/2022-11-21_intro/src/thumbs/code-example.jpg)](https://gnolang.github.io/blog/2022-11-21_intro/src/code-example.jpg)\n\n_Image 2: Code snippet from the Gno programming language_\n\nToday, Gno.land is the only blockchain instance in the world that supports Gno but tomorrow, there will be many chains with different names such as mydapp.zone, or mydao.xyz. Gno.land is the name of ONE chain and is not a name that will be used by other Gnolang-powered chains. Gno.land will remain a minimal hub with three main utilities:\n\n* Managing cross-Gnolang-chain fees/licenses\n* To be the (or an) official home for the best smart contracts\n* To provide new models of governance (w/ DAO modules)\n\n### Earning Rewards Through Proof-of-Contribution (PoC)\n\nThere are four main ways to earn rewards through PoC on the Gno.land chain:\n\n* Pre-defined tasks (technical or otherwise)\n* Pre-defined bounties\n* Retroactive bounties\n* Vesting-style rewards for core members\n\nBounties rewards (both pre-defined and retroactive) will be decided with “local rules,” through the agreement of the DAO with everything on-chain and transparent. If one human were to abuse the system, it would trigger and the bad actor would be slashed. We’ll go into depth on how you can earn rewards in an upcoming post.\n\n### Durable Solutions to Improve Our Understanding of the World\n\nOne of our inspirations for the Gno.land project is the gospels, which built a system of moral code that lasted for thousands of years. Part of Gno.land’s endurance will be having a minimal production implementation that becomes a reference for other implementations and a basis for education to elevate people's understanding of blockchains.\n\nGno.land aims to appeal to web developers, dApp developers, and blockchain builders to create solutions that help people improve their understanding of the world. With the barrage of misinformation delivered today from various factions, it’s impossible to separate the real from the fake. This causes a state of gridlock. We are living in a regime of information censorship spanning all important topics from climate change to global pandemics — a vast coordinated effort to prevent people from understanding the truth.\n\nBy just browsing Reddit, searching with Google, and scrolling through Facebook, Twitter, or Instagram, people are deliberately being [misled](https://twitter.com/lhfang/status/1587095890983936000) about key global issues that we all deserve clarity on. This is as malevolent as any type of censorship regime in the world — and we need to come together to challenge it and break the wall of censorship to achieve a functional democracy at last.\n\n### Gno.land’s Current Phase of Development\n\nGno.land is currently running in its third testnet and there will be several more testnets before the platform is production ready. Modern civilization wasn’t built in a day, and neither will Gno.land rush into committing to an exact launch date. However, the next development, an incentivized testnet called ‘Game of Realms’, is scheduled for Q1 2023.\n\nGame of Realms will be similar to ‘Game of Stakes’ on the Cosmos Hub and will reward the earliest and best contributors. If you would like to find out more about Game of Realms, Gno.land, Gnolang, or anything else, join us for our first community call with Gno.land Founder, Jae Kwon on November 22nd, at 4pm UTC on our [Discord channel](https://discord.gg/YFtMjWwUN7). We look forward to seeing you.\n","gnoland,gnosh,gnot,permissionless,consensus,proof-of-contribution,dao,governance,ibc,democracy,freedom"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"/bmbZsz+ZNl6ny143ws6y2XbPIlBfxuzWkdcIjOjPHJV+baFWnAciCx+to0JIcCT6x3Hb1qeeF1S1rWBLDqyJw=="}],"memo":"from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["tech-ama1","Gno.land Community Technical AMA #1 - Recap","\nYour questions, observations, and feedback are vital to our core development team. Not only do they give us an understanding of the types of applications and features the community would like to see but they help us formulate better ideas for developing Gno.land as we go. Before we dive into our second **Discord AMA on November 22nd @4pm UTC**, check out the community questions from our first technical AMA below answered by core Gno.land devs Jae Kwon and Manfred Touron.\n\n### Why did you choose Golang over Rust?\n\n**Jae**: “With parallelism offered by ICS1 [Interchain Security 1], the bottleneck becomes speed of innovation with safe code, rather than bare metal performance. So here, garbage collection, concurrency, embeddable structures, and clear spec are good primitives for the next-generation smart contract language.\n\nRust (or components of Rust** may be used to implement faster clients for gno.land in the future, but in terms of mindshare, I don't think Rust can flip Go due to its design choices. That's not to say that Rust is any worse than Go; they are different.”\n\n### Will Gno be its own hub? Will Gno provide ICS-like security to its own community?\n\n**Jae**: “Gno.land can be a \"hub,\" like \"git hub\" is a \"hub,\" but that doesn't mean it will offer ICS. If other chains solve ICS1 better, it makes sense for gno.land to be IBC-connected to zones that are not ICS1 replicated/secured with gno.land validators.\n\nIf we consider that validators of gno.land are better as contributors to the gno.land ecosystem (rather than general validator service providers** we may be more comfortable contributing to an awesome ecosystem but not entering the validator-as-a-service business.\n\nIt makes more sense to me that Cosmos Hub validators should own that business, which will eventually require validators to run their own server stacks and have data center infrastructure.”\n\n### How can one become a validator?\n\n**Jae**: “First, one has to become a member. We have not yet defined the full member system, but we will figure that out along the way. For now, we can say that we want first and foremost members who also validate, rather than impartial validators that only validate.”\n\n### How does Gno validate work? PoS? Proof of Contribution?\n\n**Manfred**: “The contributors DAO will elect validators and validators will have the same amount of power. They'll be focused on validating and will receive rewards for that job.”\n\n### What is Proof of Contribution? What kind of contribution will be credited?\n\n**Manfred**: “Proof-of-Contribution is a way to replace Proof-of-Stake with a metric based on the contributions. It's a variation of Proof-of-Authority where the authority is a DAO of contributors. After the 'Game of Realms** competition, we'll reward the best contributors with a tiered membership in the first version of Proof-of-Contributions DAO. The voting power and everything related to staking will be distributed across the contributors.\n\nLater, we'll add more flexibility to the membership with $GNOSH, allowing more accurate and fair rewards. Validators won't receive voting power with staking. The DAO will elect them, and they will all receive the same amount of power. Validators will receive rewards for their technical work, not for the amount of staked tokens they are bound to.”\n\n### Is there a document or resource that describes the key concepts in a Gno smart contract?\n\n**Manfred**: “We have yet to get a single top-level documentation, sorry. You can find documentation in the code, README files, issues, etc. We need to improve this. The community will be able to work on this during Game of Realms.”\n\n### Is there a big-picture diagram of the ecosystem?\n\n**Jae**: cosmos hub \u003c-- \"ec2+DTCC\"\ngno.land \u003c-- \"github for gno\"\n(cosmos hub etc) ICS zones \u003c-- \"holy grail\" scalable smart contracts\nyour chain \u003c-- \"gno inside\"\nyour app \u003c-- \"import gno.land/...\"\nblockchain-based communications/coordination/discourse platform \u003c-- us\n// DTCC: \"https://www.investopedia.com/terms/d/dtcc.asp\" // my point is, be a good reliable token hub with good governance.”\n\n### I'm a developer (PHP, Python**. How can I become a Gno developer? Please advise me on where to start.\n\n**Manfred**: “Start learning Go! One of the long-term goals of Gno is to make writing contracts as easy as writing web2 apps. The language is already strong in that direction, but we still need to catch tooling, documentation, tutorials, and language improvements. You need to have a good level with Golang and be autonomous to start building on Gno.\n\nOne of the Game of Realms tracks will be to work on everything related to onboarding more people. This will be the best place to write specific tutorials to onboard people from other ecosystems or languages.”\n\nWhat are Realms, and what is r board?\n\n**Jae**: “A realm is a Gno package with state, that represents a smart contract with storage and coins. The other Gno packages don't have state, and so are \"pure\" packages that can be imported from other realm or non-realm packages. Like land-tax, realms must be whitelisted or pay storage upkeep for their state. You can create new realms by uploading a new package with the package directory starting with /r/REALM/NAME.\n\n/r/demo/boards is a Gno package that renders a message board. It is a proof of concept message board written in Gno. Since we need to preserve messages, it is a stateful (realm** package. You can see the files of the demo boards, like:\n\nhttps://test3.gno.land/r/demo/boards/board.gno\n\n### How do external packages get imported?\n\n**Manfred**: “Example: when you call your smart contract from Go during testing, how can/should that smart contract load external packages?\n\nA gnolang can only import other gnolang contracts/libraries that were published on-chain. If you want to import an external Golang library, you need to port it to Gno, and publish it as a library, then you can import it from a top-level contract.\n\ngnodev test is an exception, it basically creates an in-memory Gnolang VM, publishes the dependencies (automatically detected**, and executes the test. The tool can act differently from the real on-chain experience. Note that we'll improve the gnodev so it can automatically download on-chain contracts or use custom local paths, to support advanced development workflows.”\n\n### What is a Gnode?\n\n**Jae**: “I don't like the name \"Gnode\" because it's too generic, but the idea is to build Gno-based building blocks for GnoDAOs, as MyGnode embeds components (of owners, treasury, board, etc.** here:\n\nhttps://github.com/gnolang/gno/commit/b9128b1d69f02dbb49be883e0c70fe9d3fc40dcc\n\n**Manfred**: “We can change the name 🙂. A Gnode is a DAO implementation that implements an interface allowing them to interact. A Gnode can have a parent and have children. Top-down interactions may be funding, grants, and approvals. Bottom-up interactions may be reporting or voting. The implementation is flexible. You can have DAOs managing a Gnode, its treasury, and voting the cross-Gnode interactions. You can have Gnodes with an elected leader or one driven by a bot or another blockchain. One of the goals of Game of Realms will be to propose various implementations of Gnodes.\n\nAt the level of Gnoland, we will probably have a top-level Gnoland Gnode managing a global treasury and vision. Then various technical and non-technical child Gnodes manage subsets of the treasury and their tasks. They may also have children. With IBC2, Gnodes could be distributed across different chains.”\n\n### What is the timeline for IBC2?\n\n**Jae**: “After the launch of gno.land, IBC2 is permissionless innovation anyone can try for, so I imagine not long after that. After initial implementations, I bet we will want to tweak/optimize the Merkle tree further, but this can come after IBC2 demos.”\n\n### Can you tell us more about Game of Realms?\n\n**Manfred**: “Game of Realms is a competition to build the first contracts of Gnoland and experiment with proof of contributions. The first step of the competition will be to build the missing tools for the second step. So people will compete to write the DAO that will review the other contributions and allocate points.\n\nThe rest of the competition will be about competing to write the best contracts for well-known categories or make non-technical contributions. At the end, we'll have strong foundations (libraries, rules, tutorials, dApps** to help upcoming builders to start in better conditions. The best contributors will earn rewards and membership in the future DAO of contributors that will co-own the chain.\n\nWe'll have the first version of a Proof-of-Contributions-based DAO of contributors. Focus on one of the official tracks: build a contract suite to compete with Cosmos' governance module to eventually complete Cosmos Hub governance. Realm boards are basic discussion contracts that can be used for discussions, and be extended for governance, launchpad, or other things mixing discussions and DAO actions.”\n\n### Is it possible to build code with gno.land directly online?\n\n**Jae**: “We will make the sandbox staging.gno.land environment easy to access, and that will be preferable to testing on gno.land directly. The gno codebase tries to remain minimal so it shouldn't be difficult to run it locally.”\n\n**Manfred**: “I've seen people writing contracts from VSCode on an online VSCode instance. Someone could create a VSCode template configured to communicate with staging by default with a dummy wallet containing tokens.”\n\n### Is there a plan to be able to use the Gno VM with a Cosmos SDK-based chain?\n\n**Manfred**: “This is one of the plans, yes. And not only on Cosmos SDK. But we don't have a clear plan about how it will happen yet.”\n\n### How about interoperability?\n\n**Jae**: “Regarding interoperability, will it be between Gno chains, with Cosmos, or with more chains outside of Cosmos? If it is with chains outside of Cosmos, which ones, in the short and long term? I think if the latter were to come to pass, the world of web3 and NFT could be awesome. Short run, Cosmos SDK-based chains with IBC1 for code import and cross-chain smart contract calls; but with IBC2/Gno it's really up to the smart contract logic.”\n\n### Are Gno.land tokenomics deflationary?\n\n**Jae**: “There will be $GNOT, and this token will be used for spam prevention fee payment, and it will be deflationary. Previously, we discussed $GNOSH as a secondary token, but we have moved away from the $GNOT/$GNOSH model and will keep $GNOT while making gno.land more about membership among levels of peers.\n\nI think we need an alternative to the Cosmos Hub that is more people-centric than stake-centric, and where alignment is not bought or sold but depends on contributions and value alignment proven over time. The hope is that by moving away from a pure tokenomics perspective and moving into the realm of politics and ethics along with general economics we can curate a different kind of culture.”\n\n### Are there any collaborations with other projects to build on Gno?\n\n**Jae**: “Yes, why don't we make this truly open, in the style of free software, so that we can build upon a common VM design? The only thing I want to retain control over for a temporary duration of time is the regulation of trademarks, like \"gno\", \"gno**\", \"*gno\" (but you can use the license to fork this project however you want); and we want proper attribution, but the AGPL fork license suggests how we can work together collaboratively.\n\nThe GNO VM can be used on any chain if it follows the AGPL style license, which we are calling the \"Gno GPL\". Blockchains can still be composed of components licensed with compatible open source software. We can collaborate indirectly by working and contributing to the same codebase, and know that the code we are building together will always be available for you to use for your chain, as long as it remains and is offered as GNO free software.\n\nSo anyone can build GNO smart contracts into their chain for free, according to the license we are deriving from the GNU (not GNO** AGPL license. You don't have to pay gno.land or anyone if the license is followed. Example: we will collaborate with the Cosmos Hub and Cosmos/ATOM community to offer gno DAOs to be hosted by ICS1, and help bring collaboration tools for Cosmos. So this is how gno works with Cosmos Hub assuming ICS1 is solved. As for gno.land, we can start off with an independent gno instance for the Cosmos Hub's gno shards, and later allow the IBC importing of vetted code from gno.land/*.”\n\n### Apart from Adena, are there any plans for another wallet?\n\nJae: “I think what we need are a few competing base implementations that best leverage the framework they build upon, rather react or minimal vue; and to create common core libraries along the way if reasonable. But there ought to be more than one approach for such a key component, with special care taken into consideration for security. Like, I don't agree with Keplr asking so easily for a 12/24-word mnemonic, even if the implementation is secure, it is going to become a problem. PSA btw.”\n\n### Wen mainnet?\n\n**Jae**: “Some time by Q2 next year would be good. But as policy, we can't commit to a date, because everything has to be ready first before the official launch. Our thesis is that having the DAO with sub-DAOs will allow us to reach the end result in a faster way via some form of parallelism. First, we need DAOs to assess new code, and better UX for managing something like upgrades to the Cosmos Hub. Once we have the DAO running on testx.gno.land, for some x \u003e 4, and we have checked all vital TODOs, we will know that we are ready for \"mainnet.\"\n\n_Do you have more questions for Manfred or Jae? Would you like to know more about Gno.land, Gnolang, Game of Realms, or ways to contribute to our growing ecosystem? Drop us a question on Discord and be sure to join us for our second **AMA on December 6th @4pm UTC.**_\n","gnoland,gnosh,gnot,permissionless,consensus,proof-of-contribution,dao,governance,ibc,democracy,freedom"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"lDUR1UH3O00j0TeESS2cgwO3Yvz8WM11Tjo1ZUQvq/gK4kr+FSegdXL/AFhjdarGalzhALb7rqHxwn7bnDT/vg=="}],"memo":"from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["gor-launch","Game of Realms Is On: Win Rewards for Contributing to Gno.land","\nPhase one of Game of Realms, a worldwide competition to build the best Gnolang smart contracts, **is now open**. Game of Realms is a high-stakes contest with a total prize pool of **133,700 ATOM** that will see participants compete for tiered membership to co-own the Gno.land blockchain, the next-generation smart contract platform that uses the Gnolang (Gno) programming language. A series of complex technical and non-technical tasks will challenge contributors to create innovative patterns that push the chain to new limits. If you’re interested in helping build the most intuitive smart contract platform in web3—while gaining rewards for your contribution—join today by opening a [PR here](https://github.com/gnolang/gno).\n\nThe Game of Realms contest will allow participants to get a feel for the Gno.land platform while building smart contracts and applications in the ecosystem. It will take place in two stages, phase one and phase two. Phase one is about building the core infrastructure, tools, and tutorials necessary to open the gates to broader participation and will be held off-chain. Phase two, on the other hand, will take place after the successful completion of phase one and be held on-chain, where contributors will build smart contracts on the platform.\n\nIn addition to the ATOM prize pool, the best contributors will also be awarded (mostly) initial-level membership to govern the upcoming mainnet. Membership will be allocated according to the quality and extensiveness of the contribution—the higher the quality, the higher the tier, and the greater the voting rights and rewards. The top equal members will be composed of peers who have contributed the most to the ecosystem and have an understanding of its core components. Top members will also have aligned core moral values. This is essential so that members can maintain the chain together according to its Constitution (TBD** and ultimately create a sustainable ecosystem that rewards all valuable contributions.\n\n## Game of Realms - Phase One (Off-Chain)\n\nWhile we aim to encourage cross-collaboration between devs and non-techs, phase one of the contest is recommended for advanced developers who are more autonomous and can contribute with limited guidelines and support. Accounting for around one-third of the total **133,700 ATOM** prize pool, getting a headstart in phase one will allow seasoned devs to kick the tires on the Gno.land platform, contribute with limited competition, and build the tools needed to open the second phase.\n\nDuring phase one, participants will open PRs against repos from the Gnolang organization. Phase one contributors will be expected to document and share their work efficiently to enable others to use it without conflicts. Your contribution is vital to the success of the contest, the Gno.land platform, and the Cosmos ecosystem at large, especially now, with discussions to move the Cosmos Hub’s core operations on-chain by establishing a DAO system.\n\nThe first DAO to be created will be the [Decentralists DAO](https://github.com/decentralists/DAO), which will provide Cosmonauts with transparency, accountability, and decentralization. The Decentralists DAO will improve discourse, organization management, development, and conflict resolution through smart contracts, and will organize itself into a set of tightly-aligned sub-DAOs dedicated to specific topics, such as engineering and funding.\n\nSo, how does this relate to Game of Realms and what type of contributions are judges looking for? Here are some examples, in order of priority:\n\n* **Define and Implement an Evaluation DAO:** For the Game of Realms contest, a sub-DAO – the Evaluation DAO – is needed to evaluate contributions during phase two and attribute rewards accordingly. Using a DAO will allow community members to vote on the best contributions for the platform. Implementation of the Evaluation DAO is the only step that must be approved by the core team because of its key role in the competition and the future of the platform. Once the DAO is in place, all previous and further contributions will be reviewed collectively by DAO members.\n\n* **Create Tutorials to Onboard More Participants:** We need experienced devs to write or record tutorials to help more people get started during phase two of the competition (and beyond) and to help grow the Gno.land developer community. These tutorials can include topics like interacting with the chain from the CLI, step-by-step guides to creating smart contracts in Gno, tips for running a local dev environment, fast prototyping with gnodev, or they can be tutorials dedicated to certain audiences, such as developers coming from Solidity or web2. All tutorials should be added to the [awesome-gno GitHub repo](https://github.com/gnolang/awesome-gno).\n\n* **Define and Implement a Governance Contract Suite:** In this challenge, developers will be expected to define and implement a governance contract suite capable of competing with existing chains’ governance modules. If you think you can improve the governance system of Cosmos Hub, this is your chance to show us how!\n\nPhase one challenges will stay open during phase two. No competition points will be attributed during this phase as the points will be retro-funded by the DAO and awarded during phase two.\n\n## Game of Realms - Phase Two (On-Chain)\n\nPhase two of Game of Realms will onboard more people to the platform and begin as soon as sufficient materials are completed from phase one. Accounting for around two-thirds of the total 133,700 ATOM prize pool, phase two will be open to both developers and non-technicals who can follow tutorials, create smart contracts, or provide other important contributions to win rewards and scale the platform. As phase two will be held directly on-chain, contributors can submit their contributions to the DAO without publishing them on the main GitHub repo. However, we strongly encourage you to use GitHub as it’s an important resource that helps the community gain a better understanding through specific examples.\n\n_We are currently preparing the challenges for participants of phase two and are looking for your input. Let us know what type of smart contracts you would like to see (minimal or with multiple features) in our upcoming Game of Realms AMA on Tuesday, January 24 at 4 pm UTC. Note that this is a text based AMA so make sure to add your questions before or during the AMA in the #AMA-questions channel on the [Gno.land discord](https://discord.gg/S8nKUqwkPn).\n_Once we have collected your feedback and requests, we will finalize the challenge categories. You can visit the [Game of Realms repo](https://github.com/gnolang/game-of-realms) for more information._\n","gnoland,game-of-realms,launch"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"+PwFe8nbKzZnepmbB3kauCINW59QZrLvmWhqtIG79shcAhQfunNZ2/IUiAp+47a67ZrhYIwSA0VUcOxfJzIdZA=="}],"memo":"from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["gor-ama1","Gno.land Community Game of Realms AMA #1 - Recap","\nWith Game of Realms officially in phase one, core dev Manfred Touron jumped on Discord to answer Gno.land community questions about the ongoing high-stakes competition. From starting and end dates to participation requirements and a description of tasks, look for your answer below. If you have further questions or want to join our community, come and find us on the []Gno.land Discord](https://discord.com/channels/957002220384182312/1065646963825066044). The core team will be hosting regular “office hours” sessions soon so you can discuss your ideas with them directly.\n\n## Q. How are the tasks in the issues assigned?\n\nWe received questions about how the tasks in the Game of Realms issues are assigned. Should submissions contain the whole implementation? Is the following task \"available** when the previous one is completed? How is the “sync” happening?\n\n**A.** TL;DR:\n\nEverything should go smoothly and we will be leaving room for negotiation if any review looks invalid. Once it has been established, the evaluation DAO will enforce how to submit a contribution. In the meantime, there are official communication challenges that we encourage participants to use. People are also free to work in stealth mode, with the risk of finishing too late or losing points for being bad at collaborating.\n\n----\n\nWe expect the current issues to be done by multiple people, in multiple steps. But anyone can try to make everything in stealth mode and open a PR with everything. Let's discuss the cases we believe will happen:\n\n### Case 1\n\nWe're in phase 1, people want to contribute but can't manage to do everything, so they will try to participate as much as they can. They will participate on the issue or in Discord by indicating their desire to participate, by sharing ideas, reviewing others' work, giving feedback, clarifying, or whatever makes sense.\n\nThe only thing is that we're fully remote. We don't know each other, so everyone needs to be good at communication. At the end of a big task, i.e. the Evaluation DAO is finished, the core team will take all the small contributions and identify contributors, and then suggest how to split the task prize. We'll propose the split and allow room for public negotiations.\n\n### Case 2\n\nWe're in phase 2, and a small contribution is done by an individual. We just review it, and that's done.\n\n### Case 3\n\nWe're in phase 2, and a contribution is big and requires small steps. Probably, the Evaluation DAO will ask individual participants to submit their contributions so they can allocate points for the individual contributions. But maybe the Evaluation DAO prefers to review big tasks as a whole, and then split the prize, as we'll do in phase 1. We don’t have clarity on this at this stage, as it will be up to the implementers of the Evaluation DAO to design the best system for that case.\n\n## Q. Will there be a leaderboard and place where we can submit evidence for tasks?\n\n**A.** Not yet. The leaderboard will come in phase 2. One of the critical parts of the Evaluation DAO will be to allow contributors to submit evidence for tasks. Votes and point allocations will also be transparent. This will make sense for future Proof-of-Contributions, too. We'll also develop a leaderboard to make it easier to follow the competition, but this will probably come after the Evaluation DAO is running.\n\n## Q. What will the overall tasks consist of?\n\n**A.** Here is a non-exhaustive list:\n\n* Onboard more contributors ([create tutorials and documentation](https://github.com/gnolang/gno/issues/408)\n* Improve the project and implement more things\n* Bootstrap our genesis of contributors for the future mainnet\n* Experiment with Proof of Contribution by having a simpler system: Evaluation DAO\n* Identify the best participants to propose jobs\n* Identify the best organizations to propose partnerships\n\n## Q. At what point in the Game of Realms timeline/phase are we?\n\n**A.** We are at the beginning of phase 1. We plan to create a website soon so you can keep track of the status and, as I mentioned, a leaderboard will come in phase 2.\n\n## Q. What will be the contributions, how will points be calculated, and are there tasks for non-programmers?\n\n**A.** During phase 1, the tasks are relatively well defined, please read this:\n\nhttps://github.com/gnolang/gno/issues/390\n\nThere are more tasks for programmers, but multiple parts are for non-programmers too.\n\nDuring phase 2, it's hard to be sure about anything yet. Game of Realms is a competition to experiment with Proof-of-Contribution, which will replace Proof-of-Stake on Gno.land. If things go the way we imagine, then consider that the stakeholders (contributors** will allocate points to contributions that make sense for the project. The contributors won't lose points, but by allocating points, they will dilute their own point stack.\n\nWe expect the Evaluation DAO to attribute points to whatever makes sense to make the project better. We'll have some task ideas for phase 2, including for non-programmers. You can likely consider that even if the core team doesn’t control the DAO, its suggestions will be approved by the Evaluation DAO because we deeply want the project to be a success.\n\n## Q. What are the requirements to start participating?\n\n**A.** There is no requirement to start participating. You’ll need to do some KYC at the end of the competition to receive a prize. Feel free to fill out the form linked in the Register section of the following issue:\n\nhttps://github.com/gnolang/gno/issues/390\n\nThis will allow us to contact you about the competition through our newsletter and set up prize payment later. Use the comment section of the issues or discuss them on Discord if you plan to work on specific tasks, so we can see that you’re actively working on a topic. It may be better to work with others and share a prize instead of taking the risk of implementing everything in stealth mode and not being the first.\n\n## Q. Is there a fixed period of time for the end?\n\n**A.** No. Phase 1 will be finished when we consider that enough materials have been implemented to switch to phase 2. This will probably take between 1-3 months. The end date for phase 2 will be announced during phase 2, which will probably last between 2-3 months. This is when we’ll send the prize rewards. After Game of Realms, people will continue to earn contribution points by contributing to the project, which will give them memberships on the future mainnet.\n\n## Q. Is it possible to install a local testnet to get a proper local development environment?\n\n**A.** You can find the answer in this GitHub issue. Subscribe to the issue to get updates:\n\nhttps://github.com/gnolang/gno/issues/478\n\nThere are multiple ways to interact with Gno:\n\n* Using gnodev allows you to use the GnoVM, without a blockchain. This method is super fast and allows you to use development patterns like TDD, where you test your implementation multiple times per minute.\n* Running a localnet, by running the gnoland command and then configuring our tools like gnokey to use localhost:36657\n* Using the staging network hosted on https://staging.gno.land reset regularly and you can use the hardcoded test key or use the faucet\n* Using the official testnets\n\nIf you prefer to run a full blockchain node instead of just playing with GnoVM, you should play with the gnoland binary. This video shows how to do this in practice:\nhttps://www.youtube.com/watch?v=-BlnEXCs0eI\n\nBelow is a further resource that may also help you:\n\nhttps://test2.gno.land/r/boards:testboard/5\n\n## Q. Will there be a list of what needs to be tested? When will the tests start?\n\n**A.** The best place to look is on GitHub here:\n\nhttps://github.com/gnolang/gno/issues/390\n\nDuring phase 1, there are 3 official focuses:\n\n- Evaluation DAO\n- Tutorials\n- Governance Module\n\nThe core team will actively review this and decide what contribution deserves to get prizes.\n\nDuring phase 2, we’ll use the Evaluation DAO developed during phase 1 to review old contributions, even contributions made before the competition, as well as ongoing contributions. Right now, we have an issue gathering interesting topics for phase 2 here, but any contribution can be reviewed by the DAO, including things that are not listed:\n\nhttps://github.com/gnolang/gno/issues/357\n\nThe competition was just announced, but we’ll review contributions made in the past, too, so it starts from the first commit, ~1-2y ago.\n\n_Do you have more questions for Manfred? Would you like to know more about Gno.land, Gnolang, Game of Realms, or ways to contribute to our growing ecosystem? Drop us a question on Discord and watch out for our next AMA on Tuesday 7 Feb at 4 pm UTC._\n","game-of-realms,gnoland,proof-of-contribution,dao,governance"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"BJVGPVBjxVvmqLBlHH2GLKomwhKJtgwelNi1kxXHZmg7YD6G/QgpGusEJ+qvtArldZTL07omG+d7JRaSyzZzrQ=="}],"memo":"from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["gor-phase1","All You Need to Know About Game of Realms: Phase One","\nGame of Realms, the worldwide competition to find the best contributors to Gno.land, is currently underway. Unlike some contests you may have entered, we're doing things a little differently. We want participants to be instrumental in building the Gno.land platform with meaningful contributions that help shape the direction of the project – either by writing the best Gnolang smart contracts or contributing to the core blockchain. It’s not just about winning prizes but becoming a meaningful contributor. We encourage participants to collaborate on the challenges – your contribution will be rewarded on individual merit.\n\n## Phase One: The Basics\n\nPhase one of Game of Realms is about laying the foundations to onboard more people to the platform. You’ll need to be an advanced developer who wants to create core materials that power the platform every day. You should also be willing to document your work and even write tutorials and guides that help us advance to the second phase of the competition.\n\nThere is a total prize pool of 133,700 ATOM available during the Game of Realms competition, one-third of which (44,121 ATOM) will be allocated to contributions from phase one. During phase one, which we expect to last between 1-3 months, participants will open PRs against repos from the Gnolang organization. For additional information on the competition phases and timelines, be sure to check out the following resources:\n\n- [Game of Realms blog post](https://test3.gno.land/r/gnoland/blog:p/gor-launch)\n- [Game of Realms AMA recap](https://test3.gno.land/r/gnoland/blog:p/gor-ama1)\n\n## Phase One: The Challenges\n\n**Evaluation DAO**: To ensure contributions in Game of Realms are rewarded fairly, we need an Evaluation DAO. Allowing community members to vote on the best contributions and decide how much they are worth provides a level playing field for all. We’re therefore seeking your skills in DAO development and implementation. This is one of the most important challenges of phase one and the only challenge that must be approved unilaterally by the core team because of its key role in the competition and the future of the platform. Read more about the [Evaluation DAO challenge on GitHub here](https://github.com/gnolang/gno/issues/407).\n\n**Tutorials \u0026 Documentation**: So that we can progress to phase two and open up the Gno.land platform to a broader audience, we need written and recorded tutorials, guides, and documentation from phase one participants. There are almost no instruction manuals when it comes to this new frontier as the only smart contract platform using the Gnolang programming language. Help us to create materials that will onboard more contributors to Gno.land. Read more about the [Tutorials \u0026 Documentation challenge on GitHub here](https://github.com/gnolang/gno/issues/408).\n\n**Governance Module**: We want Gno.land to adopt the fairest and most effective governance solution possible; one that encourages voter participation and is transparent and accountable. We’re looking for contributors to define and implement a governance contract suite that rivals existing ones, such as the Cosmos Hub, and be implemented by other projects. Can you improve on that? Show us how! Read more about the [Governance Module challenge on GitHub Here](https://github.com/gnolang/gno/issues/409).\n\nAll phase one challenges will stay open during phase two. No competition points will be attributed during this phase as the points will be retro-funded by the Evaluation DAO and awarded during phase two.\n\n## Judging Criteria - What Wins Points?\n\nWhat will the judges be looking for when assessing contributions? You can find individual details on the corresponding GitHub issue regarding each challenge, but to get you started, the Game of Realms contest prioritizes communication and collaboration. We encourage participants to work together to find the best solutions. You will be awarded individually for your contribution but working as part of a team is highly valued. Good documentation that expresses high learning efficiency and shows how the task was completed in an educational way will also win additional points, as will a high standard of quality, great UX, and the ability to follow the contribution guidelines.\n\nAs this is primarily a developer-oriented competition, most of the organization for Game of Realms is happening on GitHub; come by the repo and [visit issue #408](https://github.com/gnolang/gno/issues/408) to contribute to tutorial and documentation writing for Gno.land.\n\n## Rules of Engagement\n\nAll participants must keep in mind a strict code of conduct and specific rules and criteria to ensure fair play. Throughout the Game of Realms competition, no plagiarism will be tolerated at any time. Participants may submit what they wish, however, any project that has already been allocated rewards or received compensation in any other hackathon or similar contest will not receive double pay.\n\nThat’s all for now. If you have more questions about Game of Realms or Gno.land you can join us in our next Office Hours session on Tuesday, March 14, 2023, at 4 pm UTC. You can also connect with other participants in the [Gnoland Discord](https://discord.com/invite/S8nKUqwkPn).\n\n## Game of Realms Phase 1: FAQ\n\nBelow are some frequently asked questions about phase one of the Game of Realms competition. If you can’t find your answer below, jump into our Discord and ask, or join us for a live “Office Hours” session with the core team.\n\n### Q. How are the tasks in the issues assigned?\n\nA. There are official communication challenges that we encourage participants to use.\n\n### Q. Can I work individually or should I work as part of a team?\n\nA. You are free to work in stealth mode, but please keep in mind that you risk finishing too late or losing points for being bad at collaborating. We expect the issues in phase 1 to be done by multiple people, in multiple steps. But anyone can try to make everything in stealth mode and open a PR with everything.\n\n### Q. How can I find collaborators?\n\nA. Participate on the issue or in Discord by indicating your desire to participate, by sharing your ideas, reviewing others' work, giving feedback, clarifying, or whatever makes sense.\n\n### Q. How can I ensure good collaboration?\n\nA. Since we are fully remote, collaborating can be a challenge and the best collaborators will be rewarded. We don't know each other, so having good communication is key.\n\n### Q. How will my collaboration be evaluated?\n\nA. At the end of a big task, i.e. the Evaluation DAO is finished, the core team will take all the small contributions and identify contributors, and then suggest how to split the task prize. We'll propose the split and allow room for public negotiations.\n\n### Q. How much is the prize pool?\n\nA. There is a total prize pool of **133,700 ATOM** available during the Game of Realms competition, one-third of which (**44,121 ATOM**) will be allocated to contributions from phase one.\n\n### Q. When will I receive my rewards for my collaboration?\n\nA. Rewards will be allocated retroactively by the Evaluation DAO during phase 2.\n\n### Q. Will there be a leaderboard and place where we can submit evidence for tasks?\n\nA. Not yet. The leaderboard will come in phase 2.\n\n### Q. What will the overall tasks consist of?\n\nA. Here is a non-exhaustive list:\n\n* Onboard more contributors (create tutorials and documentation)\n* Improve the project and implement more things\n* Bootstrap our genesis of contributors for the future mainnet\n* Experiment with Proof of Contribution by having a simpler system: Evaluation DAO\n* Identify the best participants to propose jobs\n* Identify the best organizations to propose partnerships\n\n### Q. Are there tasks for non-programmers?\n\nA. There are more tasks for programmers, but multiple parts are for non-programmers too. During phase 1, the tasks are relatively well defined, please read this:\n\nhttps://github.com/gnolang/gno/issues/390\nhttps://github.com/gnolang/gno/issues/540\n\n### Q. What are the requirements to start participating?\n\nA. There is no requirement to start participating. You’ll need to do some KYC at the end of the competition to receive a prize. Feel free to fill out the form linked in the Register section of the following issue:\n\nhttps://github.com/gnolang/gno/issues/390\n\nThis will allow us to contact you about the competition through our newsletter and set up prize payment later. Use the comment section of the issues or discuss them on Discord if you plan to work on specific tasks, so we can see that you’re actively working on a topic.\n\n### Q. Is there a fixed period of time for phase 1?\n\nA. No. Phase 1 will be finished when we consider that enough materials have been implemented to switch to phase 2.\n\n### Q. Is it possible to install a local testnet to get a proper local development environment?\n\nA. You can find the answer in this GitHub issue. Subscribe to the issue to get updates:\n\nhttps://github.com/gnolang/gno/issues/478\n\n### Q. Will there be a list of what needs to be tested? When will the tests start?\n\nA. The best place to look is on GitHub here:\n\nhttps://github.com/gnolang/gno/issues/390\n\nDuring phase 1, there are 3 official focuses:\n\n* Evaluation DAO\n* Tutorials\n* Governance Module\n\nThe competition was just announced, but we’ll review contributions made in the past, too, so it starts from the first commit, ~1-2 years ago.\n","gnoland,game-of-realms,faq"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"EFMgSwj6UGemwSPqmbB8S5ZLlRBKzhZKtSlhl8wbHzwRMeYurWirYTkRzFUVPXEOiOWMxqO7rcsT8o/oj2DAAQ=="}],"memo":"from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-1","The More You Gno: Gno.land Monthly Updates","\nWe made progress across the board at Gno.land last month, from onboarding more devs to receiving an influx of contributions to the Game of Realms contest. To encourage development and discourse, we set up a biweekly public developer call in addition to our biweekly Office Hours sessions. Anyone can join, ask questions, and give their suggestions on how to shape the Gno.land platform and become a contributor. Last month, we covered several pressing topics from Gno IDE and Gno.land website language, to GnoVM, IBC, and ICS. Jae also came back to the circuit in March with two IRL workshops for devs at side events during EthDenver and Game Developer Conference (GDC) in San Francisco.\n\n## Developer Updates\n\nYou can find the live streams of the new biweekly public developer calls on [Gno.land YouTube](https://www.youtube.com/@_gnoland/videos) as well as access the agendas on [GitHub](https://github.com/gnolang/meetings/blob/main/notes/2023_03_15_dev_call_notes.md). The main talking points this month were Gno IDE, Gno.land website language and UX, garbage collection, bug fixes, and how to bring IBC and ICS to the platform. We are working on all these issues concurrently but the order of release will be Gno.land mainnet, IBC, and then ICS (this is reflected in the DAG below).\n\n\n\n[![Gno.land mini DAG](https://gnolang.github.io/blog/2023-04-15_myg-1/src/thumbs/mini-dag.png)](https://gnolang.github.io/blog/2023-04-15_myg-1/src/mini-dag.png)\n\n## Gno.land Website Language\n\nWe want to add more features for developers, such as libraries to make writing interfaces better and more consistent. There is an open topic for frontend developers with typography skills and library developers to create a UI framework for markdown or a custom rendering system.\n\nInternally, our core team is working on improvements to Gno.land’s website, making it easier to navigate with shorter columns while ensuring the text is markdown centric and readable in plain text and the GitHub rendering machine. We hope to achieve this using CSS and having classes for vertical columns, without having to make an extension to the markdown parser.\n\n## Gno IDE\n\nGno.land developer experience team is working on a web-based Gno IDE for quickly building Gno realms and packages right on your browser by just visiting a web app. Gno IDE will provide much improved UX for everything around building a realm (including making the testing easier), and additional features like autocompletion in the editor. Gno IDE will contain all the features you would expect from an IDE as well as valuable APIs for devs building tools around Gno.land with the public Gno Infrastructure.\n\n[![Gno IDE](https://gnolang.github.io/blog/2023-04-15_myg-1/src/thumbs/gno-ide.png)](https://gnolang.github.io/blog/2023-04-15_myg-1/src/gno-ide.png)\n\nGno IDE will have multiple modes to support different use cases. The normal mode will be used during everyday developments (as you’re familiar with from other code editors). The presentation mode is for high accessibility and readability. You can use it during video calls or physical workshops while projecting your screen to an audience. The third and perhaps most interesting mode is the embedded mode. Use this mode to embed the IDE into websites and blogs. This feature is especially useful for tutorials to test out sample code, run it on the real testnets, and play with it.\n\n## IBC and ICS\n\nAs depicted in the DAG above, Gno.land mainnet will launch first, followed by IBC and then ICS. We will focus on implementing IBC1, as we strongly believe in the ICS model and want to be a consumer of an existing Cosmos chain. We want a common ICS implementation that works across many hubs because Gno.land is a type of hub that will need its own ICS to scale while providing GnoVM on consumer chains on the Cosmos Hub. Our next step now is to find the best way to configure ICS for Gno.land and make GnoVM available as a consumer chain in the Cosmos Hub system.\n\nRegarding IBC, we will use the current implementation that was written for the Cosmos SDK and port that over to Tendermint2. We anticipate some issues along the way including security patches that need to be applied to our code base. There are multiple ongoing directions and discussions about how to bridge Gno.land’s smart contracts to IBC, which are essentially Interchain smart contract interactions.\n\nOne possibility is to have an API that submits events to a queue of outgoing events, and another queue to receive and consume events asynchronously. This mechanism could work for IBC2 to have rich inter-contract Interchain features, and the same API could work for Interchain plus smart contract interactions that require advanced options. We discussed a proposal to create a standard for Interchain contracts so that IBC2 could eventually be standardized eliminating limitations by applying it with an EVM, other languages, and CosmWasm.\n\nThis protocol could be based on Protobuf or a similar well-known syntax definition protocol so that we can push the Interchain to the next level. IBC2 will be safe and fast and replace vulnerable atomic bridges between multiple technologies. This is a major update that we are committed to developing and we need help identifying all the challenges involved. Working on IBC integration, separate from the Gno.land mainnet launch, will require significant time to understand how the light client system works. If you’re interested in taking on this task, let us know and we’ll set up a group. IBC will likely be the most important challenge of Game of Realms phase 2.\n\n## Garbage Collection\n\nCurrently, our work on garbage collection does not address the problem in the traditional Golang sense of dealing with memory efficiency. Instead, we are progressively optimizing and improving the main state tree by automating the clean-up of orphan nodes. The next phase will be targeting the official garbage collector component to begin work on memory management as we have some common Golang garbage collection challenges, but are identifying some uncommon ones too.\n\nWe need to consider elements like where to hold our objects because this is tied to releasing them in a concurrent lock-free way. We also need a good data structure. This is ongoing research as of now to implement a dedicated routine to synchronously clean stuff in a non-blocking way.\n\n## Game of Realms\n\nThis month, we have seen a massive uptick in contributions to Game of Realms phase one with a tidal wave of issues, general discussions, and PRs. One of the biggest things we worked on was adding support for MOD, which is a version of Go mod with an easier interface to manage your dependencies and version your dependencies. You can track the ongoing issue on GitHub [here](https://github.com/gnolang/gno/issues/390).\n\nThere have been some really strong contributions to the Evaluation DAO and governance module, as well as a big CLI refactor that went into our code base. We've also seen people contribute contracts like GRC 1155 or general improvements to existing realms, with many suggestions for fixing bugs. Finding bugs and reporting what people want is a good indication that the Gno.land platform is being picked up and gaining adoption.\n\nYou can find the Office Hours recordings that cover Game of Realms on YouTube [here](https://www.youtube.com/watch?v=JTmNg-b6Lcs).\n\n## Developer Events Stateside\n\nGno.land hosted a lively meetup during EthDenver last month where Gno.land founder and core dev Jae Kwon gave a talk for Solidity developers called “Gno.land, the Inevitable Next Generation Smart Contract Platform.\" He compared and contrasted Gno.land and Gnolang to Solidity, and showed Ethereum developers how the GnoVM shifts the smart contract paradigm. You can watch the [recording here](https://www.youtube.com/watch?v=IJ0xel8lr4c).\n\nAlso in March, Jae hosted a gaming workshop at a side event during the infamous Gaming Developer Conference (GDC) in San Francisco. “Gno.land for Game Developers, Building Your App in Web3,\" showed participants a sample gaming app built on the Gno.land platform and offered them the chance to try their hand at writing a smart contract for their app with Gno.\n\n## Virtual Events - How to Build a Forum\n\nCore tech lead at Gno.land Miloš Živković held a virtual workshop for Go devs called “How to Build a Forum.” He showed how Gnolang is a fast and simple way to build and launch smart contracts using the Gnolang interpreter virtual machine that interprets Gno and eliminates the need for any servers or ORNs.\n\nThe VM allows for the memory state of your Gno.land application to persist automatically after every transactional function call, which is a completely new way to handle transaction volume and memory recall. You can watch the [full tutorial here](https://github.com/gnolang/workshops).\n\n*We’d like the community to get involved in Gno.land’s monthly updates, so if you’re building on Gno.land and want to highlight your development, project, event, or idea, let us know and we’ll include your contribution.*\n","gnoland,gnovm,tm2"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"oPy1u+U5XfTiCKE4Glzec3e3QIl1G6EyTUsrAMaZ1o4JgS2mrzTQYlNrUG3uOo7lyOJZOgu+cqdeLrzoQvnqWg=="}],"memo":"from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-2","The More You Gno: Gno.land Monthly Updates - 2","\n## The More You Gno 2: Gno.land Developer Updates\n\nOver the past few weeks, our core devs and ecosystem contributors have been making massive strides on Gno.land. There’s a lot to cover in the second edition of *The More You Gno*, from updates on Tendermint2 and GnoVM to stack/frames management, Gno IDE, and plenty more. We’ll also see what some of the external teams contributing to the platform have been up to, including Gno.land’s first decentralized exchange, GnoSwap, and Adena compatibility with GRC20 tokens. Check it out.\n\n## Tendermint2\n\nWe’re making steady development progress on Tendermint2, which focuses on simplicity of design, minimal code, minimal dependencies, modular dependencies, and completeness. For the time being, Tendermint2 will stay in the main repo in a top-level folder named Tendermint2. This is the official location to develop and improve the consensus protocol until it is stable enough to be extracted from the Gno repo and become a standalone project. Currently, Tendermint2 depends on GnoVM, however, we are working to unlink this dependency and build a basic demo Tendermint2 chain and Client.\n\nTendermint2 JS/TS Client is a JavaScript/TypeScript client implementation for Tendermint2-based chains. The client will make it easier for developers to interact with Tendermint2 chains, with a simplified API for account and transaction management, removing a ton of manual work and allowing developers to focus on building their dApps. You can [read more about the client here](https://www.npmjs.com/package/@gnolang/tm2-js-client). In addition to the Tendermint2 JS/TS client, we also created a Gno JS/TS client that just extends the TM2 one to provide Gno-specific functionality. You can read more about this here.\n\n## Game of Realms\n\nThe incentivized competition to find the best contributors to Gno.land continues in phase one, with slow but steady progress being made. Nir1218 initiated an Evaluation DAO Kickoff discussion in [issue 792](https://github.com/gnolang/gno/pull/792) to initiate testing code for the key smart contract infrastructure that will power the Gno.land platform. We are also interviewing architects for the core team with experience in governance modules and creating new economies on-chain, and a new DevRel team member will be joining us soon to create awesome tutorials and documentation to advance Game of Realms further. Gno.land must be built by the community and we will not rush to push Game of Realms to the second phase until we have found quality contributors to complete the challenge tasks and become the platform’s first founding members.\n\n## Gno IDE\n\nOur core development team is working on a web-based IDE for Gno.land that will greatly improve the developer experience, allowing builders to quickly spin up Gno realms and packages right on their browsers just by visiting a web app. Currently named Gno IDE but with a rebranding on the horizon, this intuitive product focuses on ease of use and improved UX, and will include all the features you’d expect from an IDE, such as auto compilation in the editor, debugging, extensive testing capability, and powerful APIs like IntelliJ to supercharge your programming.\n\nGno IDE currently has multiple modes to support different use cases, including a normal mode for everyday programming, similar to a standard code editor, a presentation mode for video calls or screen sharing, and an embedded mode to extend functionality, allowing you to embed the IDE directly into websites and blogs. You can also choose to edit your code in Emacs or Vim and easily switch between steps, from previous to next, making creating your tutorials and blog posts more intuitive. Watch out for more to come on Gno IDE soon, and if you want to contribute by creating a plugin for your favorite editor, open a PR to win contribution points.\n\n## Stack/Frames Management\n\nThe stack/frames is an integral part of the virtual machine (VM) and the language. Stack/frames provide context for smart contract developers, enabling them to access useful information, such as the original caller, or to determine if a contract is being called through another one. The current implementation is limited in scope and relies on fixed positions in the stack which can lead to inconsistencies.\n\nThere is an ongoing [issue 683 open here](https://github.com/gnolang/gno/issues/683) and we have continued to work on enhancing stack/frames development over the last month. We’re adding a new function in the standard library std.PrevRealm (previously GetRealmCaller). Currently, we only have GetOrigCaller, which returns the user calling the first realm. This is not secure and we need a way to call the previous caller. This will allow a realm to handle GRC20 treasuries. See [issue 667](https://github.com/gnolang/gno/pull/667) and [issue 634](https://github.com/gnolang/gno/issues/634) for further details.\n\n## Dealing with Panics in Native Functions\n\nWe have devised a solution for dealing with panics in native functions, [see pull request 732](https://github.com/gnolang/gno/pull/732). Previously, when there was a panic in a native function, we could not recover it in Gno code. An example of this was the assert origin call, which panicked if the call was not a direct call from a transaction. Based on discussions with contributors, we’ve agreed that native functions should never panic, but if they panic, they panic with machined Gno panic. This gives us the choice in a native function to code a Gno panic, or, if it's a very bad panic, use Go panic so that we know the Gno code is unable to recover it.\n\n## Logic Upgrading\n\nMaking it possible to upgrade your logic is definitely out of scope for the first version of Gno.land, however, it’s an important issue that we have begun to discuss so that we can place certain restrictions on it, such as allowing upgrades when we consider them safe enough to be compatible with imports. Another idea is to work on creating workflows where migrations become something official. This way, we could define ways to migrate a contract completely in a single transaction at the chain level. Once everything is working and approved as the previous contract is parsed or archived, the new one gets the data. We will revisit this topic after the first version of Gno.land reaches the mainnet.\n\n## Garbage Collection\n\nIn terms of garbage collection, we don’t have memory leaks as such but we do have defacto memory leaks. By the VM having references to all objects, they won’t be released by Go’s underlying GC. We have some form of reference counting but it is only done at the end of a transaction. We have implemented a mark-and-sweep garbage collector and are working on the VM runtime to manage the objects and signal to the garbage collector to release them when they are no longer needed. This is done by adding the notion of a heap, which is managed by the garbage collector.\n\n## GnoVM\n\nDeveloping GnoVM is an ongoing task and we will likely need to fork the GnoVM to create different competing versions. GnoVM will be complete, limited in features, and serve as the only interpreter, an enduring reference point over time. Future versions of GnoVM will be designed to incorporate CosmWasm so that all Cosmos chains can have CosmWasm enabled and the VM can run directly on the browser and execute tasks on the browser without requiring to make an API call, making it faster. To do this, we can make a Gno compiler in WebAssembly without changing the code because Go supports WASM cross-compilation.\n\nWe plan on making a competing version of the original minimalist GnoVM, such as a Rust version with a JIT compiler using LLVM as a backend.\n\n## Ecosystem Updates\n\nSince our last update, the Gno.land community continues to expand with awesome teams and contributors building cool infrastructure and projects on the platform. Below, we take a look at the largest developments of the past few weeks and extend a special thanks to everyone helping us build Gno.land.\n\n## Teritori\n\nTeritori blockchain and multi-chain hub launched in November 2022, allowing IBC and non-IBC communities to connect, create groups, exchange tokens and NFTs, and launch new projects. Teritori’s idea for building on Gno.land is to create a multi-chain experience for users with a web portal, NFT marketplace, and social feed that will grow the community, and gradually integrate smart contracts and realms. This will promote Gno.land to more developers and showcase all the dApps being built through an easy-to-navigate dApp store. In the coming weeks, Teritori will work with the Onbloc team to integrate the Athena wallet into their portal as well as discuss ideas for promoting Game of Realms to new developers.\n\n## Onbloc\n\nOnbloc is one of the Gno.land ecosystem’s most active contributors, responsible for building the Adena wallet and the block explorer Gnoscan. The team has also been working on creating an official Gno SDK that will allow developers to interact with Gno.land more easily, and remove some of the current friction. Onbloc opened [issue 701](https://github.com/gnolang/gno/issues/701) on GitHub primarily for developers who either have their own web app or are building a JavaScript app and want to work with Gno in some way. Currently, developers need to do a lot of manual work, which Gno SDK will abstract away, improving the workflow and developer experience. If you have any ideas or feedback, please contribute to the aforementioned issue.\n\nIn another cool development, Onbloc has rolled out a new feature in Adena and Gnoscan to provide support for GRC20 tokens. To store and send tokens, you can open your Adena wallet, click on \"Manage Tokens”, navigate to the Custom Token page, and see which GRC20 tokens are available on Gno Testnet 3, searching by the symbol or path. To research on or discover tokens, head over to the Tokens page on Gnoscan for a full list of GRC20 tokens. You can click on any token on the list for detailed information, such as the total supply, owner, or other available functions built into the token. The Account Details page has also been updated to display all tokens owned by each address. You can help by checking out [issue 764](https://github.com/gnolang/gno/pull/764), which discusses adding bigint to support a wide range of numbers and encoding binary, and [issue 816](https://github.com/gnolang/gno/pull/816), which highlights a small bug the team runs into when coding.\n\nOnbloc has also created a new [token resource page on GitHub](http://github.com/onbloc/gnotokenresources) for anyone to share or upload resources associated with their Gno.land project. This will serve as a shared knowledge pool about any dApp on the platform. If you wanted to create a decentralized exchange, for example, you would need all the information about the tokens available on Gno.land, such as their images, symbols, descriptions, links to websites, etc. Now you can find this in one handy GitHub repository. If you’re a developer or builder who wants your logo or any other static data posted, be sure to submit a PR.\n\nAnd speaking of decentralized exchanges, Onbloc is also building Gnoswap, the first DEX to be powered by Gno.land, designed to simplify the concentrated liquidity experience and increase capital efficiency for traders. Its interface is built using TypeScript to be user-friendly, secure, and accessible for streamlining complex mechanisms such as price range configurations and staking as part of its core service. Contribute to its interface [here](https://github.com/gnoswap-labs/gnoswap-interface).\n\nAs for the contract side, Onbloc is actively working on its development with help from the core members of Gno.land. The code will be open-sourced for full transparency once the basic functions are ready.\n\n## New Core Contributors\n\nWe’re excited to welcome two new core team members, Antonio and Zack. Antonio joined us in April in the core team, bringing with him vast experience in IPFS, and writing Git servers in Go. Zack is our first “tinkerer in residence” and will try to bootstrap the ecosystem of small contracts and small libraries. He will also be writing apps and helping us design a system to better share and showcase our work with a super UX for team builders and open-source addicts.\n\nAntonio is already hard at work researching a benchmarking dashboard that will show performance improvements or regressions when we change the code. He’s assessing whether to use GiHub to track actions or run our own machine to execute GitHub actions. Take a peek at his research so far on [issue 783 here](https://github.com/gnolang/gno/pull/783).\n\nZack is working on a microblog project. As an experienced web2 Go programmer, Zack is transitioning to web3. Since he’s interested in incentivized social networks, the microblog project will be his first realm, as a Twitter-style blog without titles, where each user has their own page based on their address. Check out [issue 391](https://github.com/gnolang/gno/pull/391) for more details.\n\n## Developer Events\n\nOver the past few weeks, our core devs have been mainly focused on building but they’re preparing to speak at some exciting events in the coming months. Catch up with Manfred at BUIDL Asia, in Seoul, South Korea, from June 5 - 9. We’re co-hosting a side event with Onbloc, Code States, and Cosmostation on June 5, so be sure to register if you’re in town! We’ll also be at EthBelgrade in Serbia from June 2 - 4, and GopherCon in Berlin from June 26 - 29, so stop by and say hello.\n\n*Do you want to contribute to Gno.land’s monthly updates? If you’re building on Gno.land and want to highlight your development, project, event, or idea, let us know and we’ll include your contribution.*\n","gnoland,gnovm,tm2"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"Ofq33fdFkxVelisQlYFFEuhERtApjmspSuV+tPPFleA8H8IKM1wenWWJyo5opqUPesg88CSSZlHOXyowRYHZ0g=="}],"memo":"from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["funding-program","Announcing the Gno.land Funding and Grants Program","\nIf you’re interested in building in Gno.land and using the Gnolang (Gno) language to make a meaningful contribution, we’ve launched the Gno.land Funding and Grants Program to support you on your journey. If you’re a developer, tinkerer, researcher, or educator and you’re excited by the idea of creating innovative dApps, tooling, infrastructure, products, or smart contract libraries on Gno.land, now you can apply for funding.\n\n**About the Gnoland Funding and Grants Program**\n\nWe’re building Gno.land to endure with timeless code that will serve as a reference point for many years to come. Secured by a novel consensus mechanism, Proof of Contribution, Gno.land rewards contributors fairly, addressing one of the blockchain industry’s biggest problems. The developers that are most active on the platform with the highest quality contributions will secure the most rewards. We already have a growing community of Gnomes innovating and building on Gno.land and we’re looking to add more contributors to extend the usability of the platform and its smart contract library.\n\nOur grants program will encourage further participation by allocating financial awards and contributions to individuals and teams who want to build dApps, core infrastructure, products, or features on Gno.land, incentivizing more like-minded Gnomes to test the Proof of Contribution mechanism and push the chain to new limits. The grant amount and duration will depend on the scope and ambition of the project as well as the work involved.\n\n**Types of Contributors**\n\nThe Gno.land Funding and Grants program is divided into four different categories – tinkerer, builder, researcher, and educator – to ensure that we cater to a diverse range of people and working preferences. Here’s how we define these categories:\n\n- Tinkerer: You want to experiment and invent\n - Build dApps, improve features, and find and develop new ideas\n- Builder: You have an idea and are ready to build it\n - Build dApps, infrastructure, tooling, products, or port your existing apps to Gno\n- Researcher: You want to discover and analyze\n - Deep dive into topics linked to the Gno.land universe\n\n**What We Are Looking For**\n\nTo qualify for a Gno.land grant, we’re looking for motivated and passionate people who can contribute by developing dApps, core infrastructure, useful and innovative products, or features that improve the usability of the Gno.land chain, specifically:\n\n- Decentralized Applications (dApps)\n - What types of dApps do you want to see on Gno.land? Show us.\n - Build, test, and launch a suite of Gno.land dApps for the community, focusing on diverse use cases and industries such as DeFi, gaming, supply chain management, and social media. Ensure that these apps cater to both individual users and businesses\n - These dApps should integrate seamlessly with existing Gno.land infrastructure, encourage user interaction, and promote the adoption of Gno.land services\n- Infrastructure, DevX, Quality\n - Develop comprehensive GitHub and AWS integration for Gno.land, including streamlined deployment processes, continuous integration and delivery pipelines, and monitoring tools\n - Create Helm charts for easy deployment and management of Gno clusters, enabling users to quickly set up and scale their Gno infrastructure\n - Design and implement an event system for Gno.land contracts, allowing for real-time monitoring, analysis, and auditing of contract-related events\n - Enhance Gno.land security by conducting regular vulnerability assessments, penetration testing, and implementing best practices for secure smart contract development\n- Products\n - Develop advanced project management software tailored to the needs of Gno.land developers and teams, with features such as task tracking, collaboration tools, and integrated Gno.land services\n - Create comprehensive documentation, including guides, tutorials, and API references, to help users understand and utilize Gno.land's features and services more effectively\n - Design a censorship-resistant smart contract system, enabling secure and transparent transactions and interactions on the Gno.land platform, free from external interference\n- Interoperability \u0026 Integration\n - Implement cross-chain compatibility and interoperability, allowing Gno.land to connect and interact with other blockchain networks, expanding its potential user base and increasing its overall reach\n - Develop a powerful integrated development environment (IDE) specifically for Gno.land developers, with features like code completion, debugging tools, and seamless integration with Gno.land services\n - Design and launch a user-friendly wallet for Gno tokens, featuring a secure and intuitive interface, support for multiple devices, and easy integration with Gno.land dApps\n\nThe above guidelines are by no means exhaustive and are intended to spark your imagination and give examples of the types of contributions we’re looking for in Gno.land. We’re open-minded and willing to assess all grant proposals, so if you have an idea that’s not on the list or a suggestion that you think will benefit our vibrant community, let us know. If your submission doesn’t qualify for a grant, we’ll do our best to provide you with open and honest feedback and points for improvement, as well as identify any opportunities to get involved in our ongoing incentivized Game of Realms competition.\n\n**Meet Our First Grantees - Onbloc**\n\n**Onbloc**\n\nOnbloc is a blockchain software company building core infrastructure for Gno.land and\n\nhelping other dApp developers onboard to the Gno.land ecosystem seamlessly. The team has developed the Gno.land Developer Portal, which provides comprehensive introductory docs for developers, the Adena web3 wallet for Gno.land, and the Gnoscan block explorer. As Gno.land’s most active contributor, Onbloc is leading many community-driven initiatives and we’re excited to extend a grant to this passionate South Korea-based development team to continue their incredible work developing the wallet further, iterating the Gnoscan block explorer, and building Gno.land’s first DEX, Gnoswap.\n\nIn addition to this, we want to encourage Onbloc to continue their amazing work with the community, contributing to meetings, replying to comments on our social platforms, writing code base, organizing local events and meet-ups in South Korea, and creating products that expand the Gno.land ecosystem.\n\n*“Onbloc is thrilled to be a part of the Gno.land Grants Program. As one of the earliest contributors, our endeavors have involved releasing technical guides and research reports, developing infrastructure tools for dApps, creating DeFi smart contracts, and more. We are excited to leverage this grant to further enhance the quality of our products and strengthen our workforce. The grant will enable us to cover some of the existing expenses and hire additional developers to focus on smart contracts and the core side of GnoVM. We expect these endeavors to push the Gno.land blockchain to new limits and accelerate the achievement of the milestones on our roadmap. With the support from the Gnoland team, we are confident in our ability to make significant strides and further contributions to foster the growth of the Gnoland ecosystem.”*\n\n*Dongwon Shin, CEO, Onbloc*\n\n**Teritori**\n\nTeritori is a super-dApp project allowing individuals and organizations to interact, organize, and communicate in a radically resilient and decentralized way. Based on an interoperable vision, the application is built on a multi-chain experience approach, gradually integrating Gnolang as the fundamental technical brick of the system. Currently in Beta ([available here](https://app.teritori.com/)), the app is making modular tools and dApps available to users, with a single gamified user experience. Teritori's philosophy is to offer users and developers a place that belongs to them, their territory, with an emphasis on interoperability, modularity, and customization.\n\nUsers can interact with a social network, NFT marketplace, DAO launcher, service marketplace, games, etc., and integrate a plethora of dApps thanks to the dApp store, where Teritori will promote all Gno.land dApps to encourage the growth of the ecosystem. Using the Gno.land grant, Teritori will continue this amazing work and develop a moderation DAO to provide content moderation to Gno.land in a healthy and decentralized way, a challenge that faces the entire web3 industry. By 2024, the UX of Teritori v1 will be based on decentralized messaging without blockchain, allowing users to converse in a \"natural\" way while adding modules and web3 features. Creating and managing a GnoDAO could be as easy as managing a WhatsApp group.\n\n*“At Teritori, we want to make decentralized organizations accessible to all and experiment with new governance models for humans, social groups, businesses, and diverse organizations. Gno.land enables us to build this vision in a modular, future-proof, and censorship-resistant way. Thanks to the Grants Program, we'll be able to accelerate our development, continue to contribute proactively and build user experiences that enable as many people as possible to discover the Gnol.and ecosystem. We're starting work developing a DAO launcher, with different standard templates for DAOs, in particular, DAOs enabling moderation within news feeds, forums, or social networks. This will rapidly open many doors, such as those of conflict resolution DAOs, on-service marketplaces, or project management software. Gnol.and is a playground where anything is possible! We'll be documenting [our journey here](https://github.com/gnolang/hackerspace/issues/7#issuecomment-1588197187), and sharing our progress as we stay connected to the needs of the community.”*\n\n*Zooma, Core Lead, Teritori*\n\n**Zack**\n\nZack is the first tinkerer-in-residence at Gno.land. With a deep-rooted passion for innovation, he embraced Go early on in 2013 and ever since, has been harnessing its power to craft peer-to-peer programs and develop web2 applications. While Gno.land marks Zack's initial foray into web3 development and blockchain dApps, the Gnolang language allowed him to effortlessly apply his Golang expertise. This has enabled him to flourish within an ecosystem that revolves around decentralized systems, seamlessly transitioning his skill set to create unique decentralized solutions.\n\n*“I have always been curious about web3 and blockchain technologies but have not developed expertise in smart contract languages and struggled to keep up with the fast-changing ecosystem around blockchain technologies. As an avid Go programmer, Gno and Gno.land created the opportunity for me to develop decentralized applications on blockchains by providing a framework and ecosystem that is consistent with Golang in terms of syntax, sustainability, and stability. The additional web3 features in Gno and Gno.land provide huge potential for interesting applications that I hope to unlock to move beyond web2 and harness blockchain technology for novel use cases. The grant provided for tinkerer-in-residence was the key to giving me the resources to move through this ecosystem as I try to think outside the box for what web3 can be and what blockchain can do for a web2 developer like myself.”*\n\n*Zack Scholl, tinkerer-in-residence*\n\n**How You Can Apply**\n\nActions speak louder than words. Until Gno.land is completely on-chain, the best place to start is by contributing to PRs and issues on the Gno.land repos or participating in the Game of Realms competition. If you want to apply for a grant, you’ll need to fork the Gno.land Ecosystem Fund repo and outline your proposal in your project name’s file. Once we receive your application, our team will review it and get in touch if we believe that you fit the criteria. [See GitHub for full instructions](https://github.com/gnolang/ecosystem-fund-grants). Stay tuned, we’ll be hosting a Funding and Grants Program Q\u0026A in the next few weeks!\n","gnoland,funding,grants"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"GV8AlfUdiX/lU27BRvnqT/MlQZJWBDksHpONkdsD2a1Law6Q8Hkbt6+oKkrbQTI4mPoKMa9Y+lYfx0OQQg0pMw=="}],"memo":"from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-3","The More You Gno: Gno.land Monthly Updates - 3","\n## The More You Gno - Gno.land Monthly Updates 3\n\nWe’ve been busy since the last edition of *The More You Gno,* with the Gno.land core team and ecosystem partners present at various global developer events. We’ve visited many gnomes (and gnomes-in-the-making) around the world from Berlin to Belgrade, spreading the word about Gno.land and growing our expanding community. Aside from all the networking, Gno.land is taking shape with a new iteration of our website, the Gno.land Funding and Grants Program, and a host of developer updates as always. Let’s dive in.\n\n## Gno by Example\n\nWe recently launched [Gno by Example](https://gno-by-example.com/), our equivalent to both [Solidity by Example](https://solidity-by-example.org/) and [Go by Example](https://gobyexample.com/), where you can see tutorials and code snippets to help you learn and get more easily onboarded to Gno.land. Gno by Example is designed to be community-run with a front-end app and tutorials in markdown. There’s also a specific markdown syntax where you can embed certain file fragments to make your tutorials more structured. We’d love to build this into the ultimate resource center for Gno.land, so feel free to [contribute](https://github.com/gnolang/gno-by-example) with new tutorials and sections. Contributions here are eligible for rewards from the Game of Realms competition.\n\n## GnoVM\n\nWe continue developing GnoVM and invite you to provide feedback on what can be improved. This month, there have been a lot of discussions about how to improve native bindings and use the Gno machine in native function calls. Native function calls are well-defined in Go code generation and Go templates but need some modifications for GnoVM. For example, since new native functions already exist in the Gno code, when we try to define a native function, calling the function doesn’t yield the desired result. We’ve created a bunch of panics and tried writing out native functions to see what goes on for them, in an investigation that will go on for the next few weeks. Got any ideas? Please contribute. ([PR 859](https://github.com/gnolang/gno/pull/859)).\n\n## Testnets\n\nTalk about testnets has come up a lot in recent weeks and how to best proceed. Some gnomes are asking for a multi-node testnet to allow for great experimentation, whereas others prefer to keep the testnet single-node. There are advantages and disadvantages to both approaches and we are still listening to feedback and ideas. However, we will likely keep testnet 3 single-node and focus on the language while having a second dedicated multi-node testnet where devs can get creative, think outside of the box, test performance, consensus, and everything they need to push the chain to its limits. We’ve created a new [Hackerspace](https://github.com/gnolang/hackerspace) Repository for the multi-node testnet to prevent spam on the main repo, so please use it to share your scripts, posts, snippets, etc.\n\n## Native Coins and GRC-20 Tokens\n\nWe uncovered some significant issues with the banker module ([PR 393](https://github.com/gnolang/gno/pull/393)) regarding minting and burning tokens with the package minter. It was not scoping, filtering, or minting tokens correctly, making it possible to mint and burn unlimited tokens, including GNOT. We want to allow any realm to create its own token and run multiple tokens on their chains, but we need a prefix for security to resolve the issue and allow anyone to create GRC20 smart-contract-based coins but not native coins. We continue to work with small fixes on this issue and will reopen the PR soon.\n\n## Gno.land Funding and Grants Program\n\nLast month we released our Funding and Grants Program to encourage more developers, researchers, educators, and tinkerers to interact with Gno.land. If you’re interested in experimenting with Gnolang (Gno) and building innovative dApps, tooling, products, or infrastructure, check out our GitHub [Funding and Grants](https://github.com/gnolang/ecosystem-fund-grants) page for further information on how you can apply. Start contributing to Gno.land or Game of Realms as this is a prerequisite of the funding and grant application process.\n\n## Developer Relations\n\nThe Gno core team is growing! We hired a new DevRel last month and are looking to take on another dev for this open position, so if you’re interested, head over to our [careers page](https://jobs.lever.co/allinbits) and apply! You can expect to see a lot more documentation, FAQs, tutorials, and onboarding materials in the coming weeks and months.\n\n## Ecosystem Updates\n\nOur community of gnomes continues to expand, making tons of activity and progress over the past few weeks. Let’s see what they’ve been up to below.\n\n## Onbloc\n\nOnbloc has been super active this month attending and co-hosting IRL events and networking to find new gnomes about town. Among other updates, Onbloc has completed the first integration of Tendermint2 JS with the Adena wallet and will continue to swap out their existing libraries with TM2JS wherever applicable to ensure that they are as tightly integrated as possible. The team has also open-sourced the Gnoscan block explorer, so if you’re interested in contributing, hop on over to [Gnoscan](https://gnoscan.io/) or the [GitHub repo](https://github.com/onbloc/gnoscan).\n\n## Teritori\n\nAnother of our first cohorts from the Grants program, Teritori continues to churn out awesome work and expand its growing team. This month, Teritori has been busy integrating Adena with the Teritori app and working on the DAO contract to build a DAO deployer and various DAO standards and templates for DAO creation. Teritori’s target is to focus on a moderation DAO that can be used for content moderation in social feeds and boards. In the coming weeks, the team plans to integrate the DAO contract into the UI to allow the community to launch a DAO and experiment on the testnet. They have also made an effort to really integrate Gno users by adding .gno at the end of nicknames for people to use. All our grant recipients are documenting their journeys in the hackerspace repo, check out [Teritori’s](https://github.com/gnolang/hackerspace/issues/7) journey.\n\n## Resident Tinkerer, Zack\n\nAnother grant receiver, Zack, has been making significant progress on his microblogging project. You can check out the specs on GitHub ([PR 791](https://github.com/gnolang/gno/pull/791)) or watch the informative tutorial video, [Go to Gno: How to Build a Microblog](https://www.youtube.com/watch?v=F-_dadxcRJM). You’ll find this especially useful if you have a background in Go and need some additional insights to turn your hand to blockchain coding. Zack has also been working on an implementation of a smart contract for creating and transferring text-based NFTs that conform to haiku poetry standards (find out more on GitHub ([PR 860](https://github.com/gnolang/gno/pull/860)). Other than that, Zack continues his Gnolang journey, “learning and having a lot of fun.”\n\n## EthSeoul, BUIDL Asia, and Getting to Gno\n\nJune saw members of our core team heading over to Seoul, South Korea, for a week of networking, talks, and events. Our VP of Engineering Manfred Touron gave a keynote on the evolution of smart contracts and an introduction to Gno.land for participants of EthSeoul, followed by a fascinating dive into Proof of Contribution at BUIDL Asia, where we also had a booth. It was an honor to meet so many talented and motivated Korean developers and contributors from around the globe. Seoul is a hotbed of up-and-coming talent and we’ll definitely be back soon.\n\nWe also had the chance to meet with our most active ecosystem contributors Onbloc and co-hosted an event together, Getting to Gno, at the Code States developer academy along with long-time Cosmos builders, Cosmostation. Attendees had the chance to hear about what the core team is building and see some of the great work of our community. A massive thanks to everyone involved, it’s awesome to be BUIDLing together! Read more about our Korean adventures in this [fab write-up by Onbloc](https://medium.com/onbloc/2023-buidl-asia-recap-894c60a1c0f).\n\nEthSeoul - [Watch the talk here](https://www.youtube.com/watch?v=_iSsStlmxoU)\n\nBUIDL Asia - [Watch the talk here](https://www.youtube.com/watch?v=v6k3NHm5vcE)\n\n## EthBelgrade\n\nCore contributor Milos Zivkovic rocked the Gno.land presence at EthBelgrade in Serbia, giving an introductory workshop about Gno.land, called 'Alice in Gno.land'. Being the first Ethereum conference organized in Serbia, there were lots of attendees from all over the Balkans. Participants joined in a journey through the enchanting realm of Gnolang and the Gno.land platform. Most of the participants were not aware of Goland before but were avid Gophers eager to learn more about the application of the Gno language in blockchains.\n\n## GopherCon Berlin\n\nThe Gno.land team also had a blast last month at the European edition of GopherCon in Berlin. We had a booth at the event for two days, where we networked, talked about all things Gno, made some amazing connections, and even shared some live code! We’re looking to build an active, open-source Gopher contributor group in Gno.land, so stay tuned for more on that soon.\n\nComing up later this month, Gno.land is an official sponsor of EthCC, Paris, July 17-20. Stop by our booth to pick up some swag, say hey, and ask your questions about Gno.land. You can also catch us at the Nebular Summit for a keynote and workshop by our VP of Engineering, Manfred Touron.\n\n*Do you want to contribute to Gno.land’s monthly updates? If you’re building on Gno.land and want to highlight your development, project, event, or idea, let us know and we’ll include your contribution.*\n","gnoland,gnovm,tm2"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"3IO6/1eUULBn1fdu+uD9lSDOzVLKT6xTit9Fx1XKBBo2Hxy3JcgPuRCnQPoJDpLMHwxgPZbg1henad9FKjAo2w=="}],"memo":"from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-4","The More You Gno: Gno.land Monthly Updates - 4","\n## The More You Gno 4: Gno.land Developer Updates\n\nWe’ve had more on our plates than ever over the last few weeks, with a huge team presence in Paris at EthCC and Nebular Summit in July, an opening talk at Stanford Blockchain Club in August by Gno.land’s founder Jae Kwon, and some awesome contributions from Gno.land grantees and ecosystem partners, including the first demos of Gnoswap and Teritori’s social platform and DAO deployer. We continue to make solid progress on GnoVM, an alternative VM in Rust, Tendermint2, native bindings, and much more. Check out our latest developer updates below.\n\n## Upgrade Strategy for AVL Between GitHub and test3.gno.land\n\nOne ongoing discussion is about an incompatibility bug that affects many things we do on Gno.land. The current AVL implementation on the testnet is outdated and does not match the AVL implementation users get when they pull in the latest master branch. Therefore, building and deploying contracts on a local Gno chain (with the latest master changes) and deploying those same contracts on the testnet may fail due to this incompatibility. We need to find a way to seamlessly integrate these two approaches. Ideally, when you write code on the master branch on GitHub, it should work on the testnet as well.\n\nIn [issue 970](https://github.com/gnolang/gno/issues/970), you can find details of five different proposed solutions to implement this upgrade strategy, from resetting the whole blockchain (which would mean losing on-chain content and debugging information) to implementing a migration feature specifically for testnets that allows developers to rename packages and patch their contracts before publishing them. There are pros and cons to each proposal, and we continue to work together to find the best way forward.\n\n## Encoding JSON and the Discussion Around Reflection\n\nSome contributors have highlighted the need for native JSON encoding, and we are discussing how best to approach it. See [issue 808](https://github.com/gnolang/gno/issues/808) for further details. One idea is to copy the code from encoding JSON in the standard library Go and take it over to Gno, but we would need to have reflection to do that. So, the important question here is whether we want to have reflection and, if so, what it should look like. We could emulate Go’s reflection package with some added elements, like being able to inspect the realm state, but we would need to be extremely careful about how we do this.\n\nFor example, should users be able to read private fields of external packages through reflection or even *ufmt*, or could that introduce a problem? It would be simpler, and the language capability security would be tighter and easier to understand if we made accessing private fields impossible, but that would also make it limited. We could consider supporting reflection as an internal user package and whitelisting and encoding JSON. This way, new encoding packages would have to be whitelisted because they’re using the reflection package. We could also mark reflection as unsafe so developers know they must carefully audit their work.\n\nAnother solution is the partial implementation of reflection. In [issue 971](https://github.com/gnolang/gno/issues/971), Gno.land core engineer Petar discusses introspection, which involves implementing reflection as Go has it now but enabling only one of its two main capabilities: the ability to inspect types, but not the ability to modify code. The main difference between introspection and reflection is that, since it is done at compile time, it is completely type-safe. This discussion is ongoing.\n\n## Alternative GnoVM Implementations\n\nTo deliver the best possible virtual machine, we’re working on two different implementations of GnoVM. Petar has spent the last three weeks developing a new GnoVM implementation written in Rust. His work is still private as the machine is not yet ready for public use, but he will soon make the code public for your inspection. Rust gives the ability to write more performant code and, in some scenarios, the Rust GnoVM can run up to 20 times faster than the GnoVM at roughly 87 milliseconds compared to 2,000 milliseconds on a Fibonacci benchmark, which is a considerable improvement in speed.\n\nSince one of Gno.land’s core features is that the entire tech stack is written in Go, we’re unsure if everyone will appreciate a Rust GnoVM or whether it aligns with our vision. However, it’s always good to provide alternatives, and, Petar argues, as long as the VM carries out the same functions (and does so more cheaply), most developers won’t mind what language the VM is written in.\n\nRust has a few other features that some developers may favor over Go, such as more tools for creating languages, advanced garbage collector libraries that allow you to change the algorithm without changing the runtime (by swapping out a tricolor algorithm for a generational one, for example), and built-in data structures that solve many issues. For example, we needed a deterministic map that is fairly fast. With Rust’s Btree in the standard library, this was simple, Petar only had to implement the native Go map type with a Btree map from the standard library. This took just a few minutes.\n\nCore team dev Marc has also started an initiative to improve the Go GnoVM so that it is faster and offers a clean and user-friendly interface. He believes the debate over the VM is more about whether to have a VM that is bytecode-defined or AST-defined (rather than speed). Marc has been comparing the fundamental differences between the two and noted that the bytecode version is 15 times faster than the AST. This means that changing to Rust would give an increased performance of 2-3 times.\n\nThe VM must be fast, secure, and performant in many ways. In either version, the AST will be stored on the blockchain, whereas the bytecode is only an internal representation that doesn't affect the users. We must still consider any potential architecture consequences between bytecode and AST before deciding whether to change. Marc’s WIP code is still in a private repo, but you’ll be able to inspect it soon and make a comparison of the VM implementations in the coming weeks. The decision about the direction of GnoVM is still very much TBD; however, the Rust GnoVM will not replace the Go GnoVM but will complement it, eventually giving validators the choice of which to run.\n\n## Defining Wording for People/Documentation and Consistency\n\n[Issue 1024](https://github.com/gnolang/gno/issues/1024) discusses the need to define the wording we use throughout our documentation, for example, how we name a module, package, sub-module, etc. Once we have the wording defined, we will set the GnoVM to only accept elements with the correct naming. The importance of wording affects the design choice of the whole project and how we go about versioning for the best possible user experience.\n\nFor example, is mt/board/admin part of the same realm of mt boards, or is it its own realm? Can we work with both by adding patterns to have some realms responsible for hosting data and others responsible for having more privileged actions? How do we split a complex realm into sub-libraries and sub-realms? We want to define the documentation and the logic for this and have begun to touch on this issue. We will discuss this in greater depth in the upcoming developer calls.\n\n## Improving the GRC20/Foo20 APIs\n\nWhen working on the specs for a Merkle airdrop contract, Albert came against some issues with users initiating airdrop reward claims (see [PR 906](https://github.com/gnolang/gno/pull/906) for more details). Currently, when the Merkle airdrop contract tries to execute the reward claim for the user, an instance of the GRC20 contract is used for transferring. Within the GRC20 implementation Transfer() method, the caller (token sender) is fetched using the standard library method std.PrevRealm().\n\nHowever, calling this method in the Merkle airdrop context returns the user as the caller, not the Merkle airdrop contract, which is an unexpected functionality. We are discussing different ways to tackle this issue efficiently. However, each solution would require possible changes to the GRC20 API and subsequent token implementations. Additionally, as part of [PR 952](https://github.com/gnolang/gno/pull/952), we are looking into improving the standard GRC20 API and possibly resolving the ambiguity with standard library calls that are causing the mentioned issues.\n\n## Client Optimized for CLI, Not Mobile\n\nOur newest contributor to Gno.land, Berty, is developing the mobile version of Gno, which means writing a mobile app to interact directly with the blockchain. The team is facing some issues as they need a client library with utility functions like sign and broadcast, which are used by the command line. This code (tm2/pkg/crypto/keys/client) is not ready for external users yet, and the Gno client is designed for CLI. However, Berty needs a way to interact with the Gno chain from their application and to call the logic without adding the full CLI.\n\nFrom the existing TypeScript/JavaScript client library (gno-js-client and tm2-js-client), Berty should be able to build out a Go client library by exclusively using the RPC endpoints of the node itself (just like gno-js and tm2-js work), and not having to worry about importing private logic like transaction broadcasting. The team is writing its own framework to call Go code for Gno from Java, Swift, and React Native mobile apps that creates a transaction and sends it (see [PR 1047](https://github.com/gnolang/gno/pull/1047)).\n\nThey are working on an API that interacts with the blockchain and lets them export the code without having to write their own utilities. The API will be minimal, and update the Tendermint2 build script by moving tm2txsync from tm2/cmd to gno.land/cmd (see more details in [PR 1080](https://github.com/gnolang/gno/pull/1080) here). For the time being, Berty will copy the code and use the objects directly until a more convenient API is complete.\n\n## Tendermint2 Development\n\nIn [PR 546](https://github.com/gnolang/gno/pull/546), we introduce file-based transaction indexing. Transaction index parsing should be done as a separate process from the main node, meaning other services can be instantiated to index transactions as readers. The current problem is that there is no way to figure out whether a transaction has failed after it’s been sent out with a broadcast sync, or fetch any kind of receipt information or error reason in the delivered transaction.\n\nSo, we’ve started working on an event indexer to index Gno node events, which include transactions. Soon, developers and users will be able to ask the event indexer what happened to the transaction or in which state in its execution it's currently at, and also to retrieve information on other events like block commits as they happen.\n\n## Extending the Functionality of Go\n\nIn [issue 919](https://github.com/gnolang/gno/issues/919), Petar proposes extending the functionality of Go by adding constant data structures, arrays, slices, etc. He believes this would benefit users, as they wouldn’t need to create special functions as in Go to simulate this behavior, and it would also catch bugs when there is mutation. There has been a discussion, and Jae has similar ideas with the notion of “invar” expressions, where the resulting value can only be read, not mutated or stored. This would fix the bug where if you pass a pointer (that represents part of your contract state) to another contract, the other party can “steal” it by assigning it to their state, and your contract would fail to execute.\n\nMorgan believes that we should take a different approach as slices have the semantic in Go, where the underlying array is always heap-allocated and modifiable. Introducing constant slices would thus necessarily have to introduce concepts regarding im/mutability of values without the matching constructs that a language like Rust has. To make a compromise and keep compatibility with the Go spec, we are likely to implement this in a transpiler (gnoffeescript) that would implement this feature and be able to transpile to valid Go.\n\n## Grantee and Ecosystem Updates\n\nAs you can see, we’ve made a ton of development progress over the last few weeks. We’re also steadily adding more gnomes to our community of builders, and they’re working on the core infrastructure of Gno.land, as well as the permissionless dApps the platform will house. Let’s see what they’ve been up to since the last update.\n\n## Onbloc\n\nOnbloc has been busy, as always, with a slew of updates for us over the last few weeks. The team has been developing Gnoswap, the first Gno.land automated market maker with concentrated liquidity, and they gave us a live demo. On the front end, which is still a work in progress, you can find a one-stop venue for traders to view all the information about tokens on gno.land, so you don’t have to move between Gnoswap and a token aggregator like CoinGecko. You can also see incentivized pools sorted by liquidity, volume, APR, liquidity mining rewards, etc., and a wallet page to check your balances. You will also be able to deposit or withdraw assets from the Interchain when IBC is enabled.\n\nCheck out the work they’ve done so far on the Onbloc [hackerspace](https://github.com/gnolang/hackerspace/issues/29). The team has also released [the documentation](https://docs.gnoswap.io/) about what you can expect from Gnoswap, the rationale behind their design choices, some information about tokenomics, a preview of the UI, and more. Their main focus is on delivering a smooth and welcoming user experience and abstracting away the difficult mechanisms of concentrated liquidity so that the interface is as minimal and simple as possible.\n\nThe team will be ready to launch Gnoswap as soon as gno.land reaches mainnet. Feature updates and enhancements will be aligned with the development of the core Gno Stack.  The code for Gnoswap has now been [open-sourced](https://github.com/gnoswap-labs), so you can take a look at everything they’ve done and even make suggestions. In the coming weeks, Onbloc will also work on building core Gno.land infrastructure to support an earlier launch. Find details of this in Onbloc’s [grant submission](https://github.com/gnolang/ecosystem-fund-grants/pull/4). And be sure to check out Onbloc’s informative 6-episode [blog series](https://medium.com/@gnoswaplabs/why-gno-introducing-gnoswap-dd6acc22e6a1) that features the history of blockchain and exchanges, a deep dive into the Gno Stack, and an introduction to Gnoswap, where they share details of their journey and insights.\n\n## Teritori\n\nWe also saw an awesome demo from the Teritori team, which you can check out at app.teritori.com. Simply connect your Adena wallet to create a user name, start interacting with the social feed, create your own DAO, and add members. The team is working on more extensive documentation to explain how it works in more detail. While still a work in progress, Teritori has developed a cool flagging system that allows you to unfollow content you don’t like or flag content as inappropriate. If posts receive many flags, users can vote on whether to ban them, creating a healthy and supportive social environment free from derogatory content monitored by a like-minded community through a moderation DAO.\n\nThe team continues its work on DAO interfaces and has built a useful tool for speeding up the deployment of packages as a workaround until we’ve decided how to best tackle realm versioning. They are also working on the escrow system, which will be useful for the freelance marketplace, and presenting DAO standards documentation.\n\n## Berty\n\nWe have a new contributing team to Gno.land from the Berty private messaging app. This team is working on a mobile version of Gno.land, implementing the WESH protocol, which is available by Bluetooth, local WIFI, or other means, and provides secure censorship-resistant communication between devices. The plan is to be able to provide an alternative transport for Gno applications when the internet is not available and build the skeleton/foundations that enable developers to create Gno-centric mobile apps more easily in the future. Berty brings a ton of experience in off-grid communication and getting apps to run on mobile devices, both Android and iOS.\n\nThe team has created its own [testnet](http://testnet.gno.berty.io/), which you are welcome to test out and play around with, although they will be restarting and rebooting without prior notice, so be aware that your work could be wiped. In the few short weeks they’ve been working with us, Berty has already finished their first Proof of Concept, a simple app running on iOS and Android. They copied code from the gnokey command line, and now it’s installing and running on mobile and interacting with the blockchain.\n\nNow, Berty is working on a nicer UI for the app and will propose a project to create a formal framework called GnoMobile, which will allow anyone to create their own app and run it on mobile. We look forward to seeing their demo soon.\n\n## Golang Working Group\n\nIn other news, we've started a bi-weekly [Gnome Golang Working Group](https://github.com/gnolang/hackerspace/issues/15) where we get together and discuss various topics, such as the language-related and theory elements of Go and Gno. We also aim to identify meaningful and reasonable ways to contribute to Golang, Gophers, and the general open-source community and improve our visibility there. We hope to attract more Go devs to the project and provide a “blockchain-less” experience for web2 Go devs.\n\nWe've had two meetings so far, and some recent hackerspace issues have already emerged from the discussions. One in particular that we’re actively evaluating is Gnoffee, a transpiler tool inspired by the likes of [CoffeeScript](https://coffeescript.org/) for Go and Gno integration. Gnoffee would be a powerful standalone tool to enhance Go and Gno (blockchain) projects by generating code and seamlessly integrating new features without manual coding. Find out more at the link above.\n\n## EthCC and Nebular Summit\n\nThe Gno.land team was in full force in Paris at the end of July for EthCC, where we met many passionate developers and spread the word about Gno.land and, specifically, how Gnolang compares and contrasts to Solidity. We had a booth during the conference manned by the Gno.land team complete with awesome swag and a continuous presentation in the background playing on a full-screen television.\n\nAt Nebular Summit, our VP of Engineering, Manfred Touron, [gave a talk](https://www.youtube.com/watch?v=CtxBajCcTYQ) called ‘Gnolang for Developers: Examining the Core Stack,’ where he broke down the major components of Gno, demonstrated how the upcoming Gno SDK compares with the existing Cosmos SDK, and explained why Gno.land is an excellent choice for accessible and sustainable blockchain development.\n\n## Blockchain Application Stanford Summit (BASS)\n\nJae opened the [Blockchain Application Stanford Summit (BASS)](https://bass.sites.stanford.edu/) event, attended by thousands of students and future blockchain developers. He gave an overview of Gno.land, GnoVM, and Gnolang, and explained the features that make our platform paradigm-shifting and timeless. He also dove into the core of why we’re building Gno.land – to provide a censorship-resistant platform for truth discovery that helps people improve their understanding of the world in an era of information censorship and control.\n\nComing up later this month, you can catch up with the Gno.land team at [DappCon Berlin](https://www.dappcon.io/) from September 11-13, where we’ll be delivering an informative keynote and hosting a side event to get to gno you better. If you find yourself in Barcelona for [Web3 Family](https://web3fc.xyz/) on September 23, you can join in a Gno coding workshop. You’ll also be able to meet the team at [GopherCon US](https://www.gophercon.com/) in San Diego. We’re hosting an action-packed workshop, ‘Chess: The Gnolang Way,’ on Gopher Community Day, where you can learn to build a web3 chess server on Gno.land and compete for cool prizes in an ongoing chess tournament throughout the event. More details coming soon. That’s all for now! Be sure to check back again with us for the next edition of *The More You Gno* to keep up with all our progress.\n\n*Do you want to contribute to Gno.land’s monthly updates? If you’re building on Gno.land and want to highlight your development, project, event, or idea, let us know, and we’ll include your contribution.*\n","gnoland,gnovm,tm2"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"wqEy2jjCAr9xmajCeteDR5GCvjhLZiTRYyEu5WD92bceidRPrFIgkicG6IiGlJ913kIqxmRLuLJdwAqmDSQJTw=="}],"memo":"from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["chess-gc23","Play Chess with Us: The Gnolang Way at GopherCon 2023","\nCalling all gnomes and gophers! Come join the Gno.land team at GopherCon 2023, September 25 - 28, in San Diego, US. We’re sponsoring this year’s action-packed event that will gather together some of the world’s brightest minds and smartest programmers under one roof. So drop by our booth, pick up some swag, and say hey! We’ll be on hand every day to meet and greet, answer all your questions, and discuss everything Go, Gno, and beyond! We’ll also be hosting a workshop on Community Day, September 26, called ‘Chess: The Gnolang Way,’ where you can learn how to build a web3 chess server on Gno.land.\n\n## GopherCon 2023\n\n[GopherCon](https://www.gophercon.com/) is a community-driven annual event that started in 2014 and is dedicated to promoting the use of Go and the education of Go developers. Every year, thousands of gophers from around the world exchange ideas, share their work and expand the Go network. There are four days of fun-filled activities, including hands-on workshops, informative keynotes, networking events, and hackathons, all taking place in the laidback West Coast city of San Diego. Where better to expand your knowledge and make new friends than in one of the US’ most popular destinations?\n\nAs a gold sponsor at this year’s event, Gno.land will be running a booth and doing our best to convert as many gophers as possible to Gno, showing them how easy it is to port their existing web2 apps over to Gno.land or to build completely new ones from scratch.\n\n## Chess: The Gnolang Way\n\nIf you’re looking for a hands-on coding experience and to have a little fun with us at the same time, join us on Community Day for an awesome workshop, **‘Chess: The Gnolang Way.’** Kickstart your day by learning to build a web3 chess server on Gno.land using Gnolang. By the end of the session, you’ll have gathered basic knowledge on developing and deploying smart contracts on Gno.land, and connecting smart contracts to a web frontend. You’ll also see how web3 enables you to write perpetual and trustable social and gaming platforms and how to build a web3 chess server and website with Gno.land.\n\nIf you want to join us, meet us at 10:00 a.m. in the Grand Ballroom 10.\n\n## Let’s Play\n\nAfter the workshop, the fun begins with an ongoing chess tournament throughout the GC23 summit for event participants. To be in with a chance of scooping up some seriously cool prizes, GC23 attendees will need to show us their best moves and how much they engage with the Gno.land chain. This competition is designed to put our platform to the test over two main areas: chess mastery (50% of points) and platform engagement (50% of points). To be eligible for prizes, participants must be present at the event. We hope to see you there! If you can’t join us in person in San Diego, be sure to [follow us on X](https://twitter.com/_gnoland). We’ll be giving updates on our progress and sharing the highlights of the event. May the best gnome win!\n","gnoland,gnovm,gnochess,events"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"UD2hxTYIvsDGNWQdGH1GZiVwdzVPp53nflqqvNO070scKOWRF5JHI70ev74FTmrNoKwzVZZLiviMF2sGGopqlA=="}],"memo":"from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["gnomobile","GnoMobile, a Framework for Building Gno Mobile Apps","\n*This blog post is written by Berty Technologies, an NGO that is building open and free communication solutions without any of the limitations imposed by centralized systems. Berty is a proud partner and grantee of Gno.land.*\n\nThe year is 2023. Current Gno apps run on desktop or laptop computers that have Go installed. To run on mobile, the app would need to bundle the Go runtime, which is complicated for most developers. At Berty, we have years of experience using Go on mobile and overcoming difficulties with Android and iOS operating systems. We built Wesh Network, a decentralized communication protocol that enables p2p users to reliably and securely send messages over async networks, even in environments with poor or no connectivity.\n\nThis stage is thus set to take the leap and make it easier for builders to develop Gno applications for mobile devices.\n\n# What is GnoMobile?\n\nSimply put, GnoMobile is a framework for developing Gno mobile applications. This is how it works:\n\n*WARNING: Deep technical sections ahead. Grab a coffee before venturing forth*.\n\nFor communication between the mobile app and the Gno code, GnoMobile uses [gRPC](https://grpc.io/), a well-supported framework that sends and receives Google Protobuf messages. Even though the core Gno code is written in Go, the app code can use React Native, Java, Swift, etc. The following system diagram shows how gRPC is used.\n\n\u003cdiv align=\"center\"\u003e\n ![](https://github-production-user-asset-6210df.s3.amazonaws.com/109347079/267934754-e4da6fec-a586-4ebe-97cc-3b3ad7f79370.jpg)\n\u003c/div\u003e\n\nMoving from the bottom to the top, this is how the flow looks:\n\n1. At the bottom are Go packages in the gno codebase. A **gnoclient.Client** supports communication with the remote Gno.land node with methods like Call to call a realm function. The Gno codebase also has **keys.Keybase** to support a wallet stored on the local device with methods like CreateAccount.\n2. These methods are called directly from the next level up by the **GnoMobile** Go code. A Go object can’t be passed through the gRPC interface, so the GnoMobile Go code maintains a persistent gnoclient.Client object, which is accessed by gRPC calls. The GnoMobile API functions are registered by an amino package.go file and the generated Protobuf files are used to configure the gRPC server.\n3. Finally, at the top of the diagram, the **gRPC client in the mobile app** communicates with the GnoMobile gRPC server over a local connection using Protobuf messages. A gRPC call can either return an immediate result (for example, GetKeyCount) or an asynchronous gRPC stream object, which can return delayed results (for example, a Call to a remote realm function). The gRPC framework uses the Protobuf API to generate convenient API functions in the mobile app’s [preferred language](https://grpc.io/docs/languages) (React Native, Java, Swift, etc.).\n\n# How GnoMobile benefits builders\n\nThe first version of the framework will include three main sets of features:\n\n1. **Blockchain Operations**: These refer to the core block of functions that the apps need to interact with the blockchain. Things like the gnoclient API to effectively bring the benefits of the Gno framework on mobile, the gas estimation interface and calling realm functions, querying a blockchain node (and more) are included here.\n2. **Wallet**: As the name suggests, here we have all the standard wallet operations like create or delete an account, set the recovery phrase, account balance, and so on.\n3. **Toolkit**: We want to make it as easy as possible for devs to start building apps with our framework, so we’ll provide them with install instructions, example apps, and more technical stuff like genproto options to support gRPC and helper functions to parse the render output.\n\nThose should be enough to allow builders to get started on using and experimenting with Gno mobile apps.\n\n- *Support for secure p2p communication, even when the Internet is down?*\n- *Yes, please!*\n\nSomething that is not necessarily essential for V1, but for sure will open the doors to some powerful capabilities later on is to add an interface and a constructor to adapt the communication transport. This will make it possible for devs to incorporate other tools like Wesh Network and give their apps the ability to securely and reliably send messages even in very poor network conditions. But that’s a story for another time.\n\n# When will GnoMobile be ready?\n\nV1 is planned for release in mid-December 2023.\n\nUntil then, you can check out our progress [here](https://github.com/gnolang/hackerspace/issues/28).\n\nGot feedback or want to drop us a question? Ask away on our [repo](https://github.com/gnolang/gnomobile/issues).\n\n# What does the future look like beyond V1?\n\nWe see a lot of potential directions for GnoMobile after the initial release that will improve the user experience, extend its functionality, and make GnoMobile even more secure. We’re still scratching the surface in terms of how far we can take its development, and we look forward to working on further iterations and improvements. Some of our ideas for the future beyond V1 include:\n\n1. Making it easier for developers to **build** **desktop apps** **and** **browser extensions**:\n2. Through GnoMobile, we can gradually enable “desktop” devs to use our React Native gRPC interface to write desktop applications while using existing functionality from the core Go code. This way, developers will not necessarily have to learn Go to leverage its advantages.\n3. Browser extensions are usually written in JavaScript in the same way as in React Native. This opens the door to getting the benefits of Go via the GnoMobile framework. Otherwise, you’d have to either make the Go code run inside the browser extension (which is not easy) or use a remote server (which is not pretty).\n4. Making it possible to **execute smart contracts directly from mobile**.\n\n*Why is this important?*\n\nIf you want to add a new message to a blockchain, you need to actually interact with it (the blockchain) and update its state with the new message. However, if you just want to browse through the messages, you can execute the Render function locally without needing to use your network and, at the same time, get the results much faster. This is because the node runs locally on the mobile device without needing to spend crypto coins to get a remote node to do the operation for you.\n\nGno nodes run on GnoVMs (gnovm), and for the moment, these are only available on desktops. We believe it is possible to make them available on mobile as well, but we need to find clever ways to overcome the constraints of mobile devices (like putting the apps in the background (iOS), addressing network bandwidth limitations, and so on).\n\n1. Developing a **decentralized push notification service** for *both* mobile and desktop apps. Getting notifications is now a standard (and very important) functionality of centralized apps. Technically, this happens via a central server. Naturally, having a centralized server is not possible for a p2p app, but there are other ways to implement notifications, and we are considering including them in the GnoMobile framework.\n2. Making it possible for decentralized apps to **interact with the blockchain even if the network connection is poor or virtually unavailable**. Through the [**Wesh Network** protocol](https://wesh.network/), we are opening up the possibility of using alternative transport mediums to exchange messages between peers in an asynchronous but reliable manner in off-grid environments. Enabling reliable, secure, and censorship-resistant communication is our main cause at Berty Technologies. We want to open the door for p2p users to send messages and interact even in extreme situations or adverse scenarios, and Wesh Network is built specifically for this purpose. It is only natural to make it easier for developers to use it through the GnoMobile framework.\n3. Advancing **edge networking for enhanced blockchain resilience**. Edge networking refers to bringing functionality like computing power or storage closer to the user so that they don't need to travel through the whole Internet to interact with a server. The same edge concept can be applied to bring the necessary services to interact with the blockchain closer to each p2p user. For example, hosting a copy of the blockchain so a user can sync it or even execute smart contracts. Having these fundamental services closer to the p2p users is especially important in the case of mobile apps. We want to offer developers the possibility of taking advantage of the edge networking benefits by allowing them to use, for instance, network address redirections or special HTTP headers in the configuration of their applications.\n\nIn all honesty, it’s hard not to get excited about all the different possibilities that lie ahead for GnoMobile, but we’re keeping our focus on shipping V1 for now and collecting feedback from the community. After that, well, we hope you’ll stick around to see what happens next!\n","gnomobile,berty,weshnetwork"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"ocapQaGg2s0drlGgpKsxUqhsL07RhSv9O4tzaxSDwPAxh324lsC+AzQMRgSu841EKT9ekZhaWFXw1zlQTWyJoQ=="}],"memo":"from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-5","The More You Gno: Gno.land Monthly Updates - 5","\n# The More You Gno - Gno.land Monthly Updates 5\n\nIt's been another productive month, packed with developer calls, live events, new contributors, a large team presence at the Go community's biggest event of the year, GopherCon 2023, and the launch of a PoC gaming dApp on Gno.land, GnoChess. We uncovered a bunch of bugs in the code and some issues with the GnoVM, and made further progress on the Go and Rust VMs, the banker module bug, Gnofee, and much more. Check out the updates below.\n\n## Building a Web3 Chess Server on Gno.land - GnoChess\n\nMost of our work over the last few weeks has been dedicated to [GnoChess](https://gnochess.com/), a [PoC gaming dApp](https://test3.gno.land/r/gnoland/blog:p/chess-gc23) unveiled at GopherCon 2023. As gold event sponsors, we wanted to provide gopher attendees with a memorable experience – and a little friendly competition – while battle-testing the Gno.land platform. As our first gaming dApp, developing GnoChess was extremely useful for our team in many ways. We managed to attract 61 players to the game during the event, including some die-hard web2 gophers who wanted to show off their moves and discover more about Gno.\n\nSeveral PRs were opened as a result of our endeavors, and, beyond the conference, GnoChess taught us a lot about where we're at with Gno, how to successfully build complex dApps on top of the platform, and how well we work as a team. We uncovered some key issues and breaking behavior in the GnoVM, made our JavaScript clients much more reliable in their communications with the Gno.land node, and unearthed further issues that lead to complex errors and potential security flaws that must be addressed before mainnet.\n\nFor example, appending nil to a slice of errors resulted in a panic, or conditional statements like if not supporting custom boolean types. The GnoVM doesn't currently perform terminating statement analysis, which results in a cryptic panic message ([issue 1086](https://github.com/gnolang/gno/issues/1086)), and mixing untyped (negative) floats and integers in arithmetic sometimes drops the sign ([issue 1152](https://github.com/gnolang/gno/issues/1152)). The issues uncovered while developing GnoChess were discussed extensively in the public developer calls of [Sept 6](https://www.youtube.com/watch?v=BBBqgycMjqU) and [Sept 20](https://www.youtube.com/watch?v=WrxFVPR55G0), and referenced in the [GitHub meeting agenda](https://github.com/gnolang/meetings/issues/31). Most of the issues are common in software development and fairly simple to fix by making some implementation changes or adjustments to design choices.\n\nWhile developing GnoChess, our engineers took on the role of expert platform users rather than core team members. This approach was very useful as it pushed the platform to new limits, and allowed us to dive deep into many aspects of the project, creating a culture of sharing by opening up issues for each bug and asking for feedback and support. We'll definitely take a similar approach for future app development and onboarding new devs to Gno. We'll be releasing a retrospective of our experiences in the coming weeks. In the meantime, if you want to build a dApp on Gno.land, check out the GnoChess repo, where you can find a useful [tutorial](https://github.com/gnolang/gnochess/blob/main/tutorial/01_getting_started/README.md) or watch the recording of the GopherCon workshop, '[Chess: The Gnolang Way](https://www.youtube.com/watch?v=JQh7LhqW7ns).'\n\n## The Battle of the Virtual Machines\n\nCore engineers Marc and Petar continue their excellent work developing two different VMs for Gno, one in Go and one in Rust. In the coming weeks, we'll have a face-off, comparing and contrasting their features, efficiency, speed, and performance, so watch this space! For now, the definition of the virtual machine is stable for both, and they are no longer working on the virtual machine definition. They are mainly focusing on code generation; everything from parsing to scanning to parsing and compiling. Let's see how they are shaping up.\n\n### Rust VM\n\nPetar has developed a Rust implementation not only of the virtual machine but of the whole chain, including the compiler. He has written a Go compiler entirely in Rust and has even started experimenting with changing the compiler to implement the Invar proposal from Jae. Further progress includes porting a part of the parser and scanner from the Go compiler to Rust (almost a direct translation from Go to Rust) and making it stable. \n\nIn addition, Petar has completed work on typed nil values and improving the recursive closures of Go, which were not working with Gno code and needed additional pointers. He has also implemented Iota and hooked up the garbage collector. In the coming weeks, Petar will be working to smooth out bugs and implement type aliases, as well as implementing function analysis for the dependency graph. The dependency graph is necessary for compiling global types in the correct order, so, for example, when type A refers to type B, you need to compile type B first so that when type A refers to it, type B exists.\n\n### Go VM\n\nMarc is currently rewriting a parser and a scanner from scratch. His work is not as far along as Petar's, but he's getting closer, and the code generation works well. He is currently refactoring and building a single-pass compiler that can perform a **syntax-directed translation**, which means there are no intermediate data structures between the source code and the byte code. This is a much simpler design that should compile faster and be easier to maintain, but it requires a complete redesign. \n\nMarc believes his Go parser will be easier to maintain and understand than the one in Rust and benefit the user since the entire stack is written in Go. However, to assess the best implementation of the VMs, Marc has started a Go **test shoot project, which is a script** that will run many samples to verify that the compiler (in Go, Rust, or any other implementation) conforms to Go's specifications. Marc and Petar will open their repos soon, and the next edition of The More You Gno will highlight how the GnoVM works. \n\n## Gnoffee: Coffeescript for Go and Gno\n\nGnoffee (hackerspace [issue 22](https://github.com/gnolang/hackerspace/issues/22)) will be a powerful standalone tool to elevate the development process of Go and Gno by generating code and integrating new features, eliminating manual coding. We aim to create a custom variation of Golang that preserves similar readability, maintains compatibility, and enables being able to code in Gno very quickly when you know how to code in Go. How do we go about this? \n\nRegarding compatibility, one possibility is to propose all our changes to Golang and wait for approval before we start developing. However, this is likely to take some time. Another approach is to use a way to transpile TypeScript for JavaScript or Coffeescript for JavaScript, so it's another language passing through a program that creates standard valid Golang and will generate valid Gnolang. With this simple method, we can experiment with missing features like new native types, and new keywords, and when we have new features in mind, we can develop what we lack. \n\nFor instance, it does not make sense to have extra security for your exported variables when you write a library in Go. However, in Gno, it is very important to ensure that everything you expose cannot be modified by other contracts. This means finding a way to expose constants and other readable elements without risking their values being overwritten.\n\nBesides allowing us to carry out all types of experimentation more easily, Gnofee could eventually be a way for the Go team to measure the potential adoption of Gno. Gnofee is not a priority for the mainnet, but we're excited to work on this important initiative.\n\n## META Multinode Testnet\n\nThe discussions about single and multinode testnets have been ongoing, so we opened an issue to establish a multinode testnet focused on multi-validator experimentation, including stability, benchmarking, and lifecycle management. This multinode testnet aims to provide a platform for in-depth explorations and evaluations of multi-validator setups, while we maintain the single-node test3+.gno.land set up, primarily dedicated to showcasing the VM and providing examples. Visit hackerspace [issue 9](https://github.com/gnolang/hackerspace/issues/9) if you want to participate in this initiative or share your insights.\n\n## Banker Module Bug\n\nThe banker module bug is a known issue that needs to be fixed before the mainnet because, currently, it's still possible to mint new GNOT tokens from any contract. Several fixes have been suggested, and our goal is to merge [PR 875](https://github.com/gnolang/gno/pull/875) put forward by Onbloc to change the denomination of the coins minted by the banker. Merging this PR is currently blocked by 2 small failing checks, but we are close to resolving this issue.\n\n## Preserving Go Comments in Protobuf\n\nIn [issue 1157](https://github.com/gnolang/gno/issues/1157), Jeff from Berty raises the question about preserving Go comments in the Receiver field. Currently, Amino converts the code, but the proto message Receiver field doesn't have the comment. Manfred agrees that informative comments are helpful. However, he doesn't want to create a complex Protobuf configuration. We will continue to discuss this issue to look for solutions, but for now, Berty will parse the original Go source code and get the comments this way.\n\n## Multi-Sig and Security Features\n\nSeveral contributors, including Teritori, are working on built-in multi-sig support in Gno.land, where Gnokey supports a multi-sig setup. We also want to introduce additional ways to improve the UX and security of Gno.land (and web3 in general). An idea we currently have is to add a new layer in authentication, creating something similar to browser cookies that we can name sessions. The chain will have two tables, one with the public key for an account and one with a public key for sessions linked to an account. From your main account, you can create a session with self-destructing features, such as destructing after one hour without usage or after 24 hours. The goal would be to allow more complex and secure flows when starting your operations. We may not want this for multi-sig, but it comes under the same family of security and privacy features.\n\nFor example, imagine a wallet like Adena uses your key, a passphrase, or a ledger. It will sign a new public key that you just created in memory. Each time you close your browser, the memory is cleared. You can also have a logout button to call on the blockchain to delete all your sessions or simply wait for the session to be self-destructed, especially if the session was just in memory on your side. We will continue to develop this idea.\n\n## New Team Member\n\nWe're excited to welcome a new DevRel team member to Gno.land, Leon, who's been in blockchain development for two years and is passionate about engineering and teaching. Leon has taught languages, development, math, and music privately, as well as an OS fundamentals class at his previous faculty. Welcome on board!\n\n## Grantee and Ecosystem Updates\n\nAs Gno.land core continues to advance, so does our blossoming ecosystem, with new contributors and community members turning their eyes to Gno. The overriding theme of this last month has been collaboration, and we're pleased to see gnomes working together to overcome their obstacles and push their projects forward. Let's see what they've worked on over the last few weeks.\n\n### Onbloc\n\nOnbloc is powering ahead, contributing to Gno.land core, making upgrades and improvements to Adena and Gnoscan, and developing the Gnoswap DEX. Last month, Onbloc released the patched version 1.8.0 of Adena, which includes some UI and UX enhancements, such as more intuitive account management settings, a copy icon next to the names of the accounts, and some bug fixes. This release also comes with new injection methods to enable dApps to request users to add a custom gno.land network or switch to an existing one. Check out the [release note](https://github.com/onbloc/adena-wallet/releases/tag/v1.8.0) for more details.\n\nOnbloc has open-sourced the code for Gnoswap on this GitHub [repo here](https://github.com/gnoswap-labs/gnoswap). You can also find a guide to running unit tests. The team continues to improve the Gnoswap interface, focusing on the earn and staking pages, the graphs for positions, and some components for adding and removing liquidity and providing pool incentives. They're working on the next iteration of the interface, with the governance and airdrop pages, and developing the front-end logic to integrate with Gnoswap realms and APIs. Onbloc also contributed to Gno core, adding PRs for fixes to testing and the banker module. Keep up with Onbloc through their [hackerspace journey](https://github.com/gnolang/hackerspace/issues/29) and check out their latest initiative [Gnodesk](https://medium.com/onbloc/gnodesk-week-2-of-sept-2023-5edbc451bba7), which delivers weekly highlights and updates from Gno.land.\n\n### Teritori\n\nTeritori has been working on improvements since the last update and open-sourcing all their work, including the DAO deployer and the Moderation module. You can visit the Teritori DAO tooling repo to find the complete documentation and new realms to easily deploy your DAO. There is also a tutorial on creating your own DAO using the framework. \n\nThe team has made extensive progress on the Justice DAO deployer, a module that can be used for third-party arbitration when there is a problem with the escrow system in a decentralized freelance marketplace. The Justice DAO can resolve potential conflicts between the seller and the buyer and implements randomness to choose the judges to solve problems without conflicts of interest. The content flagging system, which highlights the content that users deem to be inappropriate, has been tweaked and improved. Keep up with Teritori's [hackerspace journey here](https://github.com/gnolang/hackerspace/issues/7).\n\n### Berty\n\nBerty has already completed the first phase of the project and published the [technical proposal](https://github.com/gnolang/gnomobile/issues/15) to develop the Gno mobile framework. The team is now busy with the second phase of implementing the proposal and the gRPC interface, which is working with the local socket on Android and iOS. Jeff has been trying to use Amino, and, now that Iuri is back from vacation, the team will work on improving other parts of the interface. Check out their latest [demo](https://www.loom.com/share/c0f68f707d3e47089c2fdbd2698fc92f), which shows an example user interface with wallet functions and blockchain communication. \n\nOnbloc has laid the foundations for Gno mobile apps with the Adena mobile wallet, so Berty will use some of this code in the mobile framework and work with Onbloc to ensure a similar user experience across all Gno apps.\n\n### Flippando\n\nDragos, the developer behind new grantee Flippando, is an experienced mobile app developer. Flippando is a simple on-chain memory game, which is currently written in Solidity and deployed on several testnets, including Goerli, Polygon, Near, Aurora, Evmos, and a Saga chainlet. Fippando started as a project for Dragos to learn Solidity but has already been the winner of two hackathons in Korea. It can be deployed relatively easily on any machine and is currently being ported to Gno.land. Dragos is exploring which user intersection can be more beneficial for this and will show us a demo in the coming weeks. Soon, we'll have two gaming dApps on Gno.land – Flippando and GnoChess! Read about Flippando in the [hackerspace journey](https://github.com/gnolang/hackerspace/issues/33).\n\n### New Contributor Joseph Kato \n\nWe have a new contributor to Gno.land who showed a demo last month of what he's been working on, a language server to run tests and scripts. Joseph is a major Go fan looking to get into web3 and was super excited to come across Gno. While interacting with Gno.land, he found many IDE-like features that he missed when working on files, so he decided to work with an LSP implementation—gnols—with the goal of making these features available to all contributors regardless of editor preference, starting with Sublime Text and Neovim and moving on to IntelliJ, Golang, and Emacs. This is a welcome addition for anyone who has ever developed a realm in Gno. Check out his [hackerspace](https://github.com/gnolang/hackerspace/issues/34) page for more details. \n\n## DappCon, Berlin\n\nManfred was back in Berlin in September at the Radial System presenting 'Gno.land: The Key To Perpetual Transparency,' where he discussed how Gno.land offers a familiar, seamless experience for code sharing and a sustainable and transparent path for blockchain development. \n\n## Web3 Family\n\nCore dev Miloš Živković gave a talk at Web3 Family in Barcelona last month, 'Gno.land and Gnolang: The Dynamic Duo of Blockchain Development.' He presented a brief history of smart contract development and the issues associated with existing platforms, such as limitations in design and security. He introduced Gno and showed how we make web3 accessible and blockchain development more intuitive and secure. Catch the [talk here](https://www.youtube.com/watch?v=0K-jr_Ad3bI).\n\n## GopherCon 2023\n\nGno.land was out in force at GopherCon 2023 with a well-stocked booth at the conference and an awesome workshop building a web3 chess server on Gno.land. Both Manfred and Jae were at the booth championing Gnolang to Gophers, and we received a lot of positive feedback, some new contributions, fresh PRs, and exposure for Gno.land in web2 circles. It was also a fabulous chance for the team to meet for valuable face-to-face time.\n\nThat's all for now! Be sure to check back again with us for the next edition of The More You Gno to keep up with all our progress.\nDo you want to contribute to Gno.land's monthly updates? If you're building on Gno.land and want to highlight your development, project, event, or idea, let us know, and we'll include your contribution.\n","gnoland,gnovm,tm2"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"89go3z23QL3aaCMASk511hR3EX6kwrjuwKz0cLVBiiFOvH9nZuByAsnXXnSG+09YVmQb65EBzTSVbRIVykCcqg=="}],"memo":"from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["funding-program-23q3","Gno.land Funding and Grants Program - Progress So Far","\n# Gno.land Funding and Grants Program - Progress So Far\n\n# Quarterly Report: Q3 2023\n\nWe launched the [Gno.land Funding and Grants](https://github.com/gnolang/ecosystem-fund-grants) program in July 2023 to encourage talented and passionate developers to interact with Gno.land, help build core infrastructure and tooling, and enhance the usability of the platform. After establishing a review process to streamline the program and identify core areas that need the most work, we ran with our first cohort of grantees in Q3, awarding four grants from a total of seven submissions (to two teams and two individuals). Full details of grant submissions, scope, and funding can be found on GitHub, but here’s a summary of the program’s progress so far and what’s coming up in Q4.\n\n## Q3 Funding Breakdown\n\nThe total grants distribution for Q3 was **$563,595** over the four grants: Teritori, Berty, Zack Scholl, and Flippando. This work has been split over two main large-scale infrastructure products (the Gno Moderation DAO, and GnoMobile), a gaming application, and our first resident tinkerer (Zack), who is experimenting with Gno and developing Proof of Concepts using it. Each grant recipient was provided with milestones for deliverables and has kept track of their progress through regular syncs, hackerspace journeys, blog posts, and developer calls. \n\n### Teritori (delivered September 2023)\n\nTeritori blockchain and multi-chain hub allows IBC and non-IBC communities to connect, create groups, exchange tokens and NFTs, and launch new projects. The Teritori team has solid experience building social dApps, marketplaces, NFTs, collectibles, and interfaces to encourage community interaction. For the Gno.land Grants and Funding program, Teritori was tasked with building a Moderation DAO to enable effective and fair content moderation in a decentralized and permissionless environment. \n\nThe Moderation Module is a smart contract ‘realm’ that enables a DAO to manage the daily moderation of forums or social threads through blockchain decision-making, supporting the vision of a censorship-resistant platform that fosters a safe space for open debate and discussion. Find detailed updates on Teritori’s [hackerspace issue 7](https://github.com/gnolang/hackerspace/issues/7), and watch out for upcoming blogs on Gno.land.\n\n### Berty Technologies (delivery Dec 2023)\n\nBerty private messaging app was allocated a grant to build a mobile version of Gno.land, implementing the WESH protocol (available by Bluetooth, local WIFI, or other means), and providing secure censorship-resistant communication between devices. Berty’s experience in off-grid communication is invaluable to Gno.land, and the team is an expert at running Go on mobile Android and iOS operating systems. For this grant, to be completed in Q4, Berty will deliver a minimal PoC of the existing apps of Gno.land running on mobile, and deliver an open-source mobile app with basic CI/CD, interacting with the Gno.land testnet. Find detailed reports and updates on Berty’s [hackerspace issue 28](https://github.com/gnolang/hackerspace/issues/28) or within their [Gnomobile blog post](https://test3.gno.land/r/gnoland/blog:p/gnomobile).\n\n### Flippando (delivery Nov 2023)\n\nFlippando is a multi-level on-chain memory game currently written in Solidity and deployed on several testnets, including Goerli, Polygon, Near, Aurora, Evmos, and a Saga chainlet. Like the classic card-based Memory game, Flippando players must match card pairs (digital tiles). When a player selects a tile, the game sends a request to the chain, which sends back the uncovered tile. If two tiles match, they remain uncovered. If they don’t match, they are flipped back until the game is won, and an NFT is generated for the winning player to prove the win. Through the development of a simple gaming app on Gno.land, we want to show how easy it is for gaming and metaverse concepts to be built. Through this grant, Flippando will port its memory game to Gno. Find detailed updates on Flippando’s [hackerspace issue 33](https://github.com/gnolang/hackerspace/issues/33).\n\n### Resident Tinkerers Program: Zack Scholl (6 months)\n\nZack Scholl is Gno.land’s first resident tinkerer with tons of experience in web2 development and a passion for the Go language. Through the grants program, Zack aims to translate his extensive knowledge to Gno and web3 by developing PoCs using Gno. So far, Zack has worked on a microblogging app for Gno.land and a prototype for using generative audio with smart contracts. He’s also creating documentation and tutorials to help other developers follow his lead. You’ll be hearing more from Zack over the coming weeks. Follow his [hackerspace issue 2](https://github.com/gnolang/hackerspace/issues/2) journey for more details.\n\nAfter a great start to the Funding and Grants Program in Q3, below is a breakdown of the percentage of funding allocated to each area of development so far:\n \n[![Funding](https://gnolang.github.io/blog/2023-10-17_funding-program-q3/src/thumbs/funding.png)](https://gnolang.github.io/blog/2023-10-17_funding-program-q3/src/funding.png)\n\n## Coming Up in Q4 and Q1 2024\n\nWe’re looking forward to more exciting developments in the coming quarters as we focus on the road to mainnet. Onbloc, one of Gno.land’s most active contributors, is currently being confirmed as a [Q4 grantee](https://github.com/gnolang/ecosystem-fund-grants/pull/4/files#diff-6dbd2e305897910e59072f9efa8c537d86f8aa281eb3742e0c150048a1df95eb) to work on core infrastructure necessary for mainnet, including tm2-js and gno-js support, GnoVM debugging, contract interactions, and leading the multi-node testnet initiative. Onbloc has already developed essential public infrastructure tools for Gno.land, including the non-custodial Adena wallet, the Gnoscan blockchain explorer, and Gnoswap decentralized exchange. The team has demonstrated immense passion and dedication in attending public developer calls and in-person events, and releasing extensive documentation, blog series, and [hackerspace issue 29](https://github.com/gnolang/hackerspace/issues/29) about their journey. \n\nOver the next two quarters, the Grants program will focus on building our tinkerer and student cohorts, and publishing more content, such as application libraries, documentation, and Gno packages. The goal is twofold: to support more users and ensure a diversified set of users on the Gno.land platform testing, debugging, troubleshooting, and running user feedback loops. We currently have two apps to reference on how to get started – GnoChess, built by the Gno core team, and Flippando, a grant recipient – we’re looking for a lot more to come. \n\nWe’re steadily building out the Gno.land platform, and our ecosystem of grantees and contributors. Let us know if you want to join us by submitting an application any time on the Funding and Grants [repository](https://github.com/gnolang/ecosystem-fund-grants). We’re opening up our second grant batch this month, and look forward to reviewing your submissions. \n","gnoland,funding,grants"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"SeeFMPtpNq+Qo1yyQ32pk2BgSCwgazCWTQODJ9ej5IduBMRecKDVeBNTRk6dkNbxMDf5t5iQYHTeN1ecZS4LWQ=="}],"memo":"from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["gnoland-moderation-dao-module","Gno.land Moderation DAO Module","\r\n# Gno.land Moderation DAO Module\r\n*This blog post is written by the Teritori team, whose focus is to allow organizations to communicate and interact in a resilient and transparent way. Teritori is a partner and grantee of Gno.land.*\r\n\r\nWhen it comes to the complex subject of discussion forums and decentralized social networks, numerous technical and philosophical questions arise.\r\nImagining a 24/7 online communication system whose administration cannot be compromised or censored by any entity or individual is one of the most intriguing challenges of the decade.\r\nApproximately 10 months ago, the Teritori core team decided to explore the new possibilities offered by Gno.land on the theme of decentralized moderation and to build the foundation for future generations of developers to create resilient, robust, and autonomous applications.\r\n\r\n## The vision\r\n\r\n### About Teritori\r\n\r\nTeritori is a decentralized Operating System for individuals \u0026 communities that allows organizations to communicate and interact in a resilient and transparent way. Its core components include the creation of a decentralized User Profile for individuals \u0026 organizations as well as a dApp Store allowing users to pick their favorite services for daily usage and developers to list their product in order to grow their user base. Finally, Teritori backbone, its P2P messenger application that will enable users to create resilient token-gated groups in a click will even allow non-crypto-native users to get onboard as this feature doesn't even require a wallet connection to get started.\r\n\r\n### Teritori \u003c\u003e Gno.land\r\n\r\nConvinced of the benefits of offering a contribution-based consensus model and taking advantage of an interpreted version of Golang, the Teritori core team aims to become one of the most prolific contributors to Gno.land. Our plan is to focus on features that enable the coordination of organizations and individuals via governance, communications, and collaboration. Eventually, all the features listed on Teritori will be accessible in the Gno.land network, contributing to the growth of the ecosystem.\r\n\r\n### PoC and iterations\r\n\r\nAnother important point to emphasize is that the Teritori core team intends to improve the features it deploys on Gno.land by taking advantage of the user test phases to collect feedback that will enable iteration and improvement of the service. As a result, the “Proof-of-Concept” (“PoC”) presented in this article will be subject to updates and evolutions, which will be communicated in due course, as will the associated test phases.\r\n\r\n## What is the Gno Moderation Module?\r\n\r\nThe Gno Moderation Module is a smart contract (“realm”) that enables a decentralized, autonomous organization (DAO) to manage the moderation of a forum or social thread through a transparent on-chain vote.\r\n\r\n### Let’s take an example:\r\n\r\nImagine a simple social network similar to Instagram, in which all content is decentralized (using IPFS for images, videos, music etc.). For each post, users sign in via their wallet to post content, and no centralized administrator can delete this content. The freedom offered by this type of decentralized application is immense since even as developers of the application, it is impossible to delete the content. Therefore, we can consider this “space of freedom” as a “common space” unlike any application owned by a private company and hosted on centralized infrastructure.\r\nWith this radical freedom for the user comes a great responsibility— to collectively ensure the security of this space rather than delegating the responsibility to moderators employed by a commercial enterprise. This is why we’ve created the “Gno Moderation Module.”\r\n\r\n### How does it work?\r\n\r\n[![moderation_flow v0.1](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/thumbs/moderation_flow_v0.1.png)](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/moderation_flow_v0.1.png)\r\n\r\nThe Gno Moderation Module allows users to notify the moderation DAO community that they wish to report content. Through this action (permitted by the smart contract), they inform the DAO community that the content is inappropriate.\r\n\r\n[![content flag](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/thumbs/content_flag.png)](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/content_flag.png)\r\n\r\nOnce the content has been reported a certain number of times (10 times in this PoC) by users (who may or may not be members of the Moderation DAO), an on-chain proposal is automatically created.\r\n\r\n[![moderation dao feed](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/thumbs/moderation_dao_feed.png)](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/moderation_dao_feed.png)\r\n\r\nThis on-chain proposal is then listed in the Moderation DAO tab on the Social Feed as well as on the Moderation DAO profile proposals feed so all Moderation DAO members can vote on it. A debate can take place to discuss the best choice for the content.\r\n\r\n[![moderation dao vote](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/thumbs/moderation_dao_vote.png)](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/moderation_dao_vote.png)\r\n\r\nModeration DAO members have three voting options:\r\n- Ban the content in question\r\n- Abstain\r\n- Do not ban the content in question\r\n\r\nOnce the required vote quota has been reached, the contract automatically executes the voted decision.\r\n\r\n## The Current Status:\r\n\r\nThe Teritori core team received a grant from the Gno.land core team to build the necessary tools for decentralized moderation.\r\n\r\nTo accomplish this task, we divided our work into five main stages:\r\n1. Build “DAO” standards to establish the fundamental building blocks and ensure a modular approach in the long term for various tools.\r\n2. Build a “DAO” deployer that allows non-tech users to easily utilize the different standards.\r\n3. Build a customizable Moderation Module that can cater to a wide range of use cases. For example, if we replace the social feed with a service marketplace, the Moderation Module can transform into a “Justice Module” that resolves conflicts between sellers and buyers on a decentralized platform and serves as an escrow system.\r\n4. Develop the user experience that allows for large-scale experimentation with the Moderation Module within a dedicated context of an active social feed. Here, we created a social feed realm and enabled non-developer Gno.land users to participate in the full-scale experience.\r\n5. Establish interactions between smart contracts (r/boards, r/socialfeed, /r/users), conduct experiments to enhance their security, and identify emerging needs for these innovative use cases.\r\n\r\n### What does a DAO realm look like?\r\n\r\n- We decided to build two different DAO standards, using two different approaches of modularity:\r\n- Aragon DAO Standard, based on the amazing work of [the Aragon team](https://aragon.org/) (using Solidity)\r\n- [DAODAO](https://github.com/DA0-DA0) smart contract, using CosmWasm, that allows more modularity.\r\n\r\n\r\nHere is an example, with the DAODAO contract ported into Gnolang:\r\n[Source](https://testnet.gno.teritori.com/r/demo/dao_realm_v6/dao_realm.gno)\r\n\r\n```go\r\npackage dao_realm\r\n\r\nimport (\r\n\t\"encoding/base64\"\r\n\t\"std\"\r\n\t\"strings\"\r\n\t\"time\"\r\n\r\n\tdao_core \"gno.land/p/demo/daodao/core_v16\"\r\n\tdao_interfaces \"gno.land/p/demo/daodao/interfaces_v16\"\r\n\tproposal_single \"gno.land/p/demo/daodao/proposal_single_v16\"\r\n\tvoting_group \"gno.land/p/demo/daodao/voting_group_v17\"\r\n\t\"gno.land/p/demo/ujson_v5\"\r\n\t\"gno.land/r/demo/groups_v22\"\r\n\tmodboards \"gno.land/r/demo/modboards_v9\"\r\n)\r\n\r\nvar (\r\n\tdaoCore dao_interfaces.IDAOCore\r\n\tmainBoardName = \"dao_realm\"\r\n\tgroupName = mainBoardName + \"_voting_group\"\r\n\tgroupID groups.GroupID\r\n)\r\n\r\nfunc init() {\r\n\tmodboards.CreateBoard(mainBoardName)\r\n\r\n\tvotingModuleFactory := func(core dao_interfaces.IDAOCore) dao_interfaces.IVotingModule {\r\n\t\tgroupID = groups.CreateGroup(groupName)\r\n\t\tgroups.AddMember(groupID, \"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c\", 1, \"\")\r\n\t\tgroups.AddMember(groupID, \"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv\", 1, \"\")\r\n\t\tgroups.AddMember(groupID, \"g14u5eaheavy0ux4dmpykg2gvxpvqvexm9cyg58a\", 1, \"\")\r\n\t\tgroups.AddMember(groupID, \"g1ckn395mpttp0vupgtratyufdaakgh8jgkmr3ym\", 1, \"\")\r\n\t\tgroups.AddMember(groupID, std.GetOrigCaller().String(), 1, \"\")\r\n\t\treturn voting_group.NewVotingGroup(groupID)\r\n\t}\r\n\r\n\tproposalModulesFactories := []dao_interfaces.ProposalModuleFactory{\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.IProposalModule {\r\n\t\t\ttt := proposal_single.Percent(100) // 1%\r\n\t\t\ttq := proposal_single.Percent(100) // 1%\r\n\t\t\treturn proposal_single.NewDAOProposalSingle(core, \u0026proposal_single.DAOProposalSingleOpts{\r\n\t\t\t\tMaxVotingPeriod: time.Hour * 24 * 42,\r\n\t\t\t\tThreshold: proposal_single.Threshold{ThresholdQuorum: \u0026proposal_single.ThresholdQuorum{\r\n\t\t\t\t\tThreshold: proposal_single.PercentageThreshold{Percent: \u0026tt},\r\n\t\t\t\t\tQuorum: proposal_single.PercentageThreshold{Percent: \u0026tq},\r\n\t\t\t\t}},\r\n\t\t\t})\r\n\t\t},\r\n\t}\r\n\r\n\tmessageHandlersFactories := []dao_interfaces.MessageHandlerFactory{\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\treturn groups.NewAddMemberHandler()\r\n\t\t},\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\treturn groups.NewDeleteMemberHandler()\r\n\t\t},\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\t// TODO: add a router to support multiple proposal modules\r\n\t\t\tpropMod := core.ProposalModules()[0]\r\n\t\t\treturn proposal_single.NewUpdateSettingsHandler(propMod.Module.(*proposal_single.DAOProposalSingle))\r\n\t\t},\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\treturn modboards.NewCreateBoardHandler()\r\n\t\t},\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\treturn modboards.NewDeletePostHandler()\r\n\t\t},\r\n\t}\r\n\r\n\tdaoCore = dao_core.NewDAOCore(votingModuleFactory, proposalModulesFactories, messageHandlersFactories)\r\n}\r\n\r\nfunc Render(path string) string {\r\n\treturn \"[[board](/r/demo/modboards:\" + mainBoardName + \")]\\n\\n\" + daoCore.Render(path)\r\n}\r\n\r\nfunc VoteJSON(moduleIndex int, proposalID int, voteJSON string) {\r\n\tmodule := dao_core.GetProposalModule(daoCore, moduleIndex)\r\n\tif !module.Enabled {\r\n\t\tpanic(\"proposal module is not enabled\")\r\n\t}\r\n\tmodule.Module.VoteJSON(proposalID, voteJSON)\r\n}\r\n\r\nfunc Execute(moduleIndex int, proposalID int) {\r\n\tmodule := dao_core.GetProposalModule(daoCore, moduleIndex)\r\n\tif !module.Enabled {\r\n\t\tpanic(\"proposal module is not enabled\")\r\n\t}\r\n\tmodule.Module.Execute(proposalID)\r\n}\r\n\r\nfunc ProposeJSON(moduleIndex int, proposalJSON string) {\r\n\tmodule := dao_core.GetProposalModule(daoCore, moduleIndex)\r\n\tif !module.Enabled {\r\n\t\tpanic(\"proposal module is not enabled\")\r\n\t}\r\n\tmodule.Module.ProposeJSON(proposalJSON)\r\n}\r\n\r\nfunc getProposalsJSON(moduleIndex int, limit int, startAfter string, reverse bool) string {\r\n\tmodule := dao_core.GetProposalModule(daoCore, moduleIndex)\r\n\treturn module.Module.ProposalsJSON(limit, startAfter, reverse)\r\n}\r\n```\r\n\r\n### Public Grant Report:\r\n\r\nYou can find the full report of [Teritori Core’s journey here](https://github.com/gnolang/hackerspace/issues/7). \r\n\r\n### Resources:\r\n\r\nDocumentation:\r\n- [Gno Moderation DAO](https://github.com/TERITORI/gno/blob/teritori-unified/examples/gno.land/r/demo/teritori/MODERATION_DAO.md)\r\n\r\nPackages:\r\n- [https://testnet.gno.teritori.com/r/demo/groups_v22](https://testnet.gno.teritori.com/r/demo/groups_v22)\r\n- [https://testnet.gno.teritori.com/p/demo/daodao/interfaces_v16](https://testnet.gno.teritori.com/p/demo/daodao/interfaces_v16)\r\n\r\nTutorial:\r\n- [Gno.land Social Feed Moderation on Teritori](https://teritori.gitbook.io/teritori-whitepaper/gno.land/introducing-gno.land-social-feed-v0.1#social-feed-moderation)\r\n","gnoland,dao,moderation,teritori"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"ZNGtl4zqWo+8X05bbM3QJd5dVrt+0iUWooniUZL5TjhdhKK0VtyUhy31xfkIuFC+t+dYPPGNGJ7xZ2Shx+HzjA=="}],"memo":"from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["wyg-dongwon-shin","Who You Gno – On the Record with Dongwon Shin","\n# Who You Gno – On the Record with Dongwon Shin\n*Who You Gno is intended to shine a light on the builders, contributors, and generally brilliant humans behind the tech. We’re excited to kick off this series with Dongwon Shin, the co-founder and CEO of one of Gno.land’s longest-contributing teams, Onbloc, a South Korean-based blockchain software company that builds key infrastructure and tooling for Gno.land*\n\nSince embarking on their Gno journey in late 2021, Dongwon and his team have been among the most active gnomes embodying the values of the Gno project: hardworking, passionate, honest, and humble, to name a few. You may already be familiar with Onbloc’s projects [Adena](https://adena.app/), [Gnoscan](https://gnoscan.io/), and [Gnoswap](https://github.com/gnoswap-labs) more about this can be found in [Onbloc's Hackerspace journey](https://github.com/gnolang/hackerspace/issues/29). In this interview, we’ll get the latest updates on these projects, hear about Dongwon the person, and learn more about what motivates him to be a gnome. Check it out.\n\n## Dongwon’s life before coding\nIt’s a cold November morning in Seoul, and Dongwon is in the office early after sleeping just a few hours. Speaking to him from Dubai, where “cool” is 30 ℃, it’s -1 ℃ in Korea. “I hope you’re keeping warm,” I smile, “Yeah,\" he laughs, “it’s not too bad.” Dongwon’s been in the industry since 2015 when web3 was still called “crypto,” ICOs were selling snake oil, and his compatriots were busy paying above the market price for bitcoin in a phenomenon called the “Kimchi premium.”\n\nAt the time, he was traveling the world as a professional e-sports gamer which saw him leaving Korea and living in San Francisco and L.A. for several years. “I had lots of tournaments to compete in, so I had to travel to many other countries,” he says, “while traveling, I learned about other cultures and people, and new experiences. It was really eye-opening, you know, it really helped make me who I am today.”\n\nAnd who is Dongwon today? \n\nAmbitious, driven, and one of the kindest, most genuine people you could ever meet. “I like challenges, and I’m very competitive,” he says. “I can't just do regular jobs. I get bored quickly, so I need to find something very competitive and hard that makes me stressed.” I point out that he’s in the right place, and he laughs. He explains that he used to spend an entire week, sometimes two, learning a game before a tournament, almost around the clock. “I had to put everything I have into winning that game, right?” He views working in web3 the same way.\n\n## The intersection between e-gaming and blockchain\nDongwong is clearly comfortable on the cutting edge in emerging industries that “are often looked down on,” like e-gaming and crypto. He takes great satisfaction in how they’ve both grown. “My parents were saying, 'Just go study,' while I was playing games, but e-sports has grown a lot. Right now, the industry is really big, and it's kind of the same with crypto.” He adds, “I like getting in early when other people are not interested and finding an opportunity there.”\n\nWhen looking to retire as a professional gamer, he found his home right away in web3, working with a blockchain consultant and the sports and entertainment-focused [Chiliz project](https://www.chiliz.com/), before launching his own blockchain consulting and development firm. “I didn't think I was going to be just a regular employee for a big company. So I wanted to start my own business,” he says.\n\n## Getting to Gno… Gno.land\nHow did Dongwon hear about Gno.land? \n\n“My co-founder, Peter, and I were long-time followers of the Cosmos ecosystem, and we found out that Jae was working on a new project called Gno.land in late 2021. We really liked the vision behind Gno.land, why he started, and what he wants to achieve. We value transparency, fairness, and censorship resistance, so we read all the documentation and his initial codebase and decided we should be part of his new initiative. We started Onbloc in early 2022.”\n\nDongwon didn’t know Jae personally, but he felt strongly aligned with his vision and what Gno.land aims to achieve. Also, his reputation as the founder of Tendermint and Cosmos preceded him. Dongwon’s co-founder, Peter, was also working on a project called Lunagram, a Cosmos wallet integrated with Telegram. Peter had fond memories of Jae, being very supportive of experimental projects, including his own, in the early days of Cosmos.\n\n## Building tools… Adena, Gnoscan, Gnoswap\nOnbloc has since become Gno.land’s most prolific contributor, launching the [Gnoscan](https://gnoscan.io/) block explorer and the [Adena](https://adena.app/) wallet, as well as creating tutorials and blogs to help onboard developers to Gno, and creating Gno.land’s first AMM DEX Gnoswap, the beta version of which is estimated for December this year. “Currently, the team is focused on developing Gnoswap, integrating [the realms and APIs](https://github.com/gnoswap-labs/gnoswap) with [the interface](https://github.com/gnoswap-labs/gnoswap-interface), enhancing the swap function and liquidity pools, and some additional features. We expect to launch the beta in about a month, so we’re quite excited!”\n\nAs for Adena, the defacto Gno.land wallet, “It's already production-ready, but we want to improve our UX, and UI to provide more secure ways of using a web3 wallet.” To achieve this, Onbloc is adding a feature called [Air-Gap](https://en.wikipedia.org/wiki/Air_gap_(networking)) which allows the wallet to be used in an offline environment, without the user needing to import their keys to Adena. “They can just use Adena as a broadcaster,” Dongwon explains. “I think this kind of feature is needed for enhancing security and educating people to use noncustodial products in a secure way.”\n\nOnbloc is also a [Q4 2023 grantee](https://test3.gno.land/r/gnoland/blog:p/funding-program-23q3) and will develop core Gno.land infrastructure in preparation for mainnet. “We are working on three key features,” Dongwon explains. “The first is contract interaction. So it's a way for a realm to interact with other realms. The second is porting essential Go packages to Gno, and the third is a multi-node testnet.” All in addition to Onbloc’s continued efforts on Gnoswap, Gnoscan, and Adena. “You’re keeping busy, then?” I ask. “All our hands are full now,” he laughs.\nI ask what he does in his free time and – in fact – whether he has any. “Not much,” he jokes, “but I like spending time with my son and playing board games together. He’s seven years old, and we are like friends.” Dongwon also likes to unwind by reading books when his son is asleep. One of his favorites is [*The Secret*](https://en.wikipedia.org/wiki/The_Secret_(Byrne_book)); he was “really inspired by the concept” when he was younger. I ask if he sees it working in his daily life and whether he believes he manifests what he wants into existence, “Definitely,” he replies without hesitation.\n\n## Dongwon’s conviction in Gno.land\nNot only is Dongwon working night and day, but he has bootstrapped his team from his own pocket to go all in on Gno.land. What makes his conviction so strong? “I truly believe that the Gno.land blockchain is the next generation of the blockchain industry. Gno.land is trying to invite web2 developers into web3 and providing all these developer-friendly tools so they don't need to learn a new language to get into the ecosystem. GnoVM, Tendermint2, everything is so transparent and simple.”\nHe believes Gno.land will be “one of the greatest experiments in the crypto industry” thanks to its fair rewards and contribution-based governance. “I'm really excited about this initiative, and all our team members are well-aligned to support this vision. We want to do our part to achieve the success of Gno.land.”\n\nI thank him for his time and ask if there’s anything he would like to add. He pauses for a moment and then says, “If you're building a dApp or looking for a new opportunity in a new ecosystem, I think this is your chance. I hope to see great developers and teams getting into Gno.land. Let’s make this ecosystem great together.”\n","whoyougno,onbloc,community,interview"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"ah5FkAxcnDglqPiAVBOWplvDMYBhoFMnJ/8nWCb/yz81KUW6nGn45srsXNfnGwSGrI37eucKI2ySTGEHBv9cVA=="}],"memo":"from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-6","The More You Gno: Gno.land Monthly Updates - 6","\nWelcome to the latest edition of The More You Gno, your regular source of updates from the Gno.land core team and contributor ecosystem. There’s a lot to cover this month, from a company engineering retreat to new core members and contributors. We’ve made progress across the board to fix important bugs and issues and provide additional features. There’s a new way to dynamically call realms, Gno.land’s tokenomics and governance are advancing, our standard library list is expanding, and our grantees are killing it with their deliverables. Without further ado, let’s dive in.\n\n## Gno Core Team Updates - TL;DR\n\nOnly got time to skim the updates? You’ll find the highlights in the list below. If you want to dive deeper into the topics, track our progress, understand the rationale behind our decisions, or explore the issues we came across, grab a coffee, kick back, and savor the full details.\n\n* **The Portal Loop** – Much of our focus over the past few months has been on the Portal Loop [(issue 1108)](https://github.com/gnolang/gno/issues/1108), which will make developing on Gno smoother, faster, and more intuitive. The Portal Loop will speed up deploying dApps and improve the UX for Gno.land devs.\n\n* **Dynamic Realm Caller** – We’ve added a new way to call realms dynamically so that dApps no longer have to manually import GRC20/721 tokens [(PR 1262)](https://github.com/gnolang/gno/pull/1262).\n\n* **DAO Structure \u0026 Tokenomics** – We’re close to finalizing the DAO structure of Gno.land and its tokenomics. There will be three main DAOs, GovDAO, EvaluationDAO, and SupportDAO. We’re exploring staking options for GNOT holders and working on transaction fees and gas.\n\n* **Gno Playground** – Gno Playground is an awesome way for developers to collaborate, share, and test their code. The full version isn’t ready yet, but we’re sharing the beta with anyone who wants to help us iterate and improve this week.\n\n* **Gno Standard Libraries** – In [issue 1267](https://github.com/gnolang/gno/issues/1267), you can find our current wishlist for Gno standard libraries. If you want to see what we have and what’s lacking, or you want to contribute, open an issue or a PR.\n\n* **Gno Language Server (Gnols)** – An implementation of the [Language Server Protocol (LSP)](https://microsoft.github.io/language-server-protocol/) for Gno, Gnols makes writing code simpler and works with several editors. Visit the [CONTRIBUTING.md file](https://github.com/gnolang/gno/blob/master/CONTRIBUTING.md#vim-support-with-lsp) to try it out.\n\n* **RustVM Implementation** – The RustVM implementation is almost ready and is in the debugging stages. We’re also looking at adding a Jit compiler and researching the topics of determinism and concurrency.\n\n* **Bytecode Go VM Implementation** – The Parscan project is progressing well toward completion of the spec. We look to provide support for interfaces in the interpreter by extending the standard reflect package, also to the benefit of the entire Go community.\n\n### Engineering Retreat\nGno core engineering team got together last month in our first company-wide retreat. It was an invaluable opportunity to work face-to-face, brainstorm ideas, code together, and fix several high-level concerns. We made many improvements to the technical aspects of the project, including major advances on the Portal Loop, and strengthened our alignment through team bonding activities, socializing, and having fun. \n\nWe made multiple bug fixes and resolved many of the issues that arose out of [GnoChess](https://github.com/gnolang/gnochess) development, and Manfred and the Onbloc team (who joined us on the retreat) demonstrated a new way to dynamically call contracts using dependency injection with a registry. This, combined with Golang's interface capabilities, can achieve a good balance between dynamism, explicitness, and security (including type safety). This pattern could enable massive DeFi applications when used with GRC interfaces. It could also support contract-based DAOs where features can be added later, opening the door to new design patterns around contract upgrades. Check out [PR 1262](https://github.com/gnolang/gno/pull/1262) for more details. \n\nIt was invaluable for everyone to get plenty of 1:1 time with Jae. Morgan was able to bring the Native Bindings topic ([PR 859](https://github.com/gnolang/gno/pull/859)) much closer to completion. This has been a recurring theme in our developer calls for the last few months as it’s a complex topic that aims to change how Gno can use Go code while still being understood by static analysis tools like gno doc. Michael got greater clarity over the DAO structure and GNOT tokenomics, Milos was able to merge [PR 546](https://github.com/gnolang/gno/pull/546), after many months of effort, which adds file-based transaction indexing, and Thomas created instructions for getting started with the Gno Language Server (gnols), to give just some examples. It was productive and enjoyable and unblocked many issues. \n\nAiB engineers were also at the retreat, Zooma from Teritori, and Dongwon, ByeongJun, and Ray from Onbloc, creating plenty of opportunities for interesting discussions and showcasing our work. We also welcomed new core members Dylan and Danny to the team. Dylan is a senior software engineer, and Danny is supporting DevEx. We enjoyed meeting and hacking together with like-minded people and would like to do it more often with a broader audience. How about a Gnome contributor festival next year? Stay tuned.\n\n### Gno.land DAOs and Tokenomics\nThroughout the retreat and ongoing, we’ve made major advances to the DAO structure for Gno.land and the tokenomics of the chain. We’re still hammering out the final details, but we’ve decided on three main DAOs – GovDAO, EvaluationDAO, and SupportDAO – that will work together alongside other domain-specific DAOs, such as EngineeringDAO or ProjectsDAO, making Gno.land more decentralized over time. \n\nThe multi-tiered GovDAO will be responsible for voting on all decisions that affect the chain, such as parameter changes or validator acceptance/denial. GovDAO members will assess new contributors to the chain and allocate them a score and corresponding membership tier. EvaluationDAO will assist with specific contributions, lending its expertise and critic reviews as needed. SupportDAO will provide knowledge-specific services such as HR, marketing, and finance.\n\nRegarding transaction fees, we're exploring something similar to how Ethereum deals with gas in its EIP 1559 update. Essentially, a combination of comparing a new block’s size with the last block to gauge demand and some small parameters we’re looking at. We’re also experimenting with staking alternatives where contributors can stake their tokens to support certain projects in return for staking rewards. It’s still early days, so watch this space. We’ll be releasing more details soon. \n\n### Gno Playground\nGno Playground is a simple web interface that lets you share your code, run unit tests, deploy your realm and package, and execute functions in your code using the repo for a smoother and more collaborative developer experience. We’re excited to release Gno Playground out in the wild later this month in a soft launch set for November 28. If you’re interested in testing it out, head over to our Discord channel. We’re looking for feedback and help to identify bugs and improve the UX before its full launch in the new year. It will be interesting to see how people interact with the Playground and how they use it so we can iterate and attract more gnomes to our growing community.\n\n### The Portal Loop\nThe Portal Loop is an effort to create a continuously-deployed staging testnet to be hosted on the official [gno.land website](https://gno.land). The testnet will be reset at each commit on our repository, but it will re-play all the transactions from its previous version, dropping any that might fail following breaking changes in the code. The Portal Loop will provide a central place where you can experiment with the latest Gno.land updates, resolving the problem our existing testnets have faced (becoming stale only a few months after their launch) while also paving the way for building DAOs and on-chain Game of Realms and Proof-of-Contribution systems. \n\nWithin the Portal Loop efforts, we’re also building systems to more efficiently iterate locally on your Gno realms, similar to the previously described testnet. The Portal Loop will help to create an iterative cycle focused on development, testing, and feedback, enhancing local development and the Gno.land website. As developers are discovering, when building dApps like GnoChess, GnoMobile, or Flippando, they run into issues with the repo, GnoVM, and client libraries when developing locally.\n\nThe Portal Loop will enable much quicker feedback so we can iterate, uncover, and fix problems faster. Devs will get a greatly improved UI, with UX contributions and issues much easier to resolve, and the same CI/CD experience as web2 applications, where each time something is published on Git, they get instant feedback on how it works in staging, not only in terms of code but also in terms of data. Stay tuned, the Portal Loop is coming soon!\n\n### Standard Library Wish List\nThe standard library wish list in [issue 1267](https://github.com/gnolang/gno/issues/1267) is intended to be a starting place for anyone who wants to add new standard libraries to Gno. It's an opinionated collection of libraries that we would like to see added. So, if you see something missing that you’d like added to our standard libraries, leave a comment explaining your reasoning. If you want to port over a standard library from the list, make an issue for it and assign yourself, or if you can do it quickly, make a PR referencing the issue. You can see the global status of our standard libraries (as compared to Go) on our [Go\u003c\u003eGno compatibility document](https://github.com/gnolang/gno/blob/d421b963aed7f7c3ba3718edfc6fbd787fa8f0dd/docs/reference/go-gno-compatibility.md).\n\n### Dreaming with SOGNO\nThe Sogno project is a [dream](https://www.wordreference.com/iten/Sogno) Morgan has about improvements he plans to make on GnoVM. From his experience working on GnoChess, he found that many features were lacking that would have improved the workflow, for example, an improved debugging system, enhanced representation of the values within the VM, having maps as sortable data structures, and adding reflection. Morgan plans to work on this project on the side as a fork when he has time, so Sogno won’t be merged into the master branch for now. If you want to check it out and see if you can contribute, visit the [hackerspace PR 44](https://github.com/gnolang/hackerspace/pull/44).\n\n### The Future of the Gno Language Server (Gnols)\nThe [Gno Language Server (gnols)](https://github.com/gno-playground/gnols) is an implementation of the [Language Server Protocol (LSP)](https://microsoft.github.io/language-server-protocol/) for the Gno programming language. It is similar to the equivalent “gopls” project for Go, as they can be plugged into your code editor through extensions and allow you to access handy features, such as autocompletion, formatting, and compile-time warnings/errors. Gnols makes writing code simpler, working with several editors to suit your preferences. To try it out, visit the [CONTRIBUTING.md file](https://github.com/gnolang/gno/blob/master/CONTRIBUTING.md#vim-support-with-lsp), which contains instructions to get you started. Our current documentation targets Vim, Neovim, and SublimeText, but can likely be used with any editor that supports LSP. Feel free to contribute to improving Gnols and adding more features. It’s well-written, and simple to dive into the code and add more capabilities.\n\n### RustVM Implementation\nPetar continues progressing on the RustVM implementation and has almost finished, apart from a few bug fixes. As the design is now complete, he will enter the testing stages. He is also looking at how to add a Jit compiler to the current design. Petar was initially concerned that the garbage collector might have presented serious issues, but this has turned out not to present a problem. Adding a Jit compiler will require a lot of work (at least six months) to support everything in the language, but it should be possible.\n\nPetar is also looking at implementing concurrency the way it is in Go to have a fully functional virtual machine as it is in the spec. This would likely attract more external contributors to developing the VM. One advantage of Rust is that, with the concurrency model, there is already an extensive library called [Tokio](https://tokio.rs/) which he can use. Petar stresses that this isn’t easy, but he believes it’s achievable, at least as a research topic around determinism and concurrency.\n\n### Go Bytecode VM Implementation\nMarc continues to develop Parscan, another bytecode VM, but entirely based on the Go runtime, with the advantage of reusing the type-checking system, concurrency model, and memory management already part of the existing Go runtime. In the last month, the support for all missing declaration statements (constants, variables, and types) was added in the code generator.\n\n## Grantee and Ecosystem Updates\nOur ecosystem partners and grantees are working flat out on their contributions. We’re close to seeing the on-chain memory game Flippando launch, Adena and Gnoswap are incorporating some major new features, Zack’s released another informative tutorial as part of the Go to Gno series, and we’ve received several new grant proposals as well. We’ve even welcomed a new contributing team, Varmeta, to the fold. Scroll through the details below.\nTL;DR?\n* On-chain memory game Flippando is coming soon\n* Gnomobile is almost complete and will be receiving a rebrand soon\n* Gnosocial will allow devs to experiment with social media dApps\n* Experiment with content moderation using the ModerationDAO or create your own DAO\n* Gnoswap AMM DEX beta will launch in December\n* Adena to implement new ‘Air-Gap’ feature\n* Varmeta is working on Gno.land Unity SDK to make Gno more accessible to game developers\n\n### Dragos\nDragos has been working on porting his on-chain memory game Flippando from Solidity to Gno, and we’re looking forward to playing it soon after seeing an awesome demo earlier this month. When you play Flippando, you uncover a matrix of matching visual symbols. There are 2 levels of difficulty (matrix made of 16 tiles or 64 tiles). For the launch, Dragos aims to have visual symbols containing basic colors, dice, hexagrams, or various gradients. Once you’ve matched all the pairs and completed a matrix, you mint an NFT that can be assembled as artwork on-chain and traded in a marketplace. Dragos is currently looking at the initial tokenomics for Flippando, with a fixed supply of 1 billion and no airdrop distribution (more details soon). \n\nDragos has been a mobile app developer for over 10 years, with an interest in blockchain for around seven years. He enjoys working with Gno, although having to reset the chain and redeploy programs each time he makes a change was a challenge. The Portal Loop solves these issues in local development and will allow him to deploy Flippando sooner. As part of the work for Flippando, Dragos also added [PR 1309](https://github.com/gnolang/gno/pull/1309) to improve our GRC721 implementation]. He is also applying for a grant to port his project management system on-chain for Gno, and he gave us a [demo](https://drive.google.com/file/d/1eJGyATHhEzletWwQ4Xt_9ON7L231Yvow/view). An on-chain project management tool will be essential for organizing the DAO system, focusing on our team’s needs, organizing tasks, setting goals, and more. Keep up with Dragos’ progress by visiting his [hackerspace](https://github.com/gnolang/hackerspace/issues/33).\n\n### Berty\nBerty has been powering ahead with Gnomobile (which will soon receive a new name to better reflect its functionality), Gnosocial, and Gno core. Some highlights include significant progress on the GRPC interface (see [demo video]https://www.loom.com/share/d1cef60199c0487e86deab2a9e61d61c). As the interface to Protobuf has many more data types available than the interface to the language bridge, GRPC greatly simplifies the app and improves the UX. The API is almost complete and now includes wallet functions, such as creating an account and restoring an account from the recovery phase, and an event stream when calling a realm function [(demo video available here)](https://www.loom.com/share/42f2dcb0b4a34f77a95a0f8012e4b52b).To help developers, Gnomobile also includes example apps. Here is a [demo video](https://www.loom.com/share/41a20a764f0f4caf91f068b62e1f16c4) of the latest minimal hello app.\n\nBerty created [PR 1235](https://github.com/gnolang/gno/pull/1235) relating to Amino. They start with a Go struct and add comments explaining all the fields. Previously, when they ran Amino and generated a Protobuf structure, all their comments disappeared. This PR allows them to preserve the comments. They also created [PR 1213](https://github.com/gnolang/gno/pull/1213) since Amino should create a Protobuf structure where the fields follow official naming conventions. Thanks to help from the Gno devs, these PRs are merged.\nBerty is also focused on building a decentralized social media application using the Gnomobile framework, which is almost complete. The aim is to create a testbed where dApp builders can see how their implementations integrate and function with web2-like social media features, opening the door to interesting experiments such as DAO collaboration and content modification. Berty is building a decentralized Twitter-like application and plans to finish it in six months. Check their progress on their [hackerspace here](https://github.com/gnolang/hackerspace/issues/28) and look for more upcoming demos.\n\n### Teritori\nTeritori has been focusing on Escrows in the past couple of months, aiming to make improvements that facilitate on-chain project management. The team is also iterating the Moderation DAO and has identified a need for a conflict solver module to call an external authority to solve a conflict between two parties (for example, the buyer and the seller). They have called this module the Conflict Solver Module and integrated several options like Justice DAO (composed of humans) or any realms (e.g. GnoChess) to solve the conflict. They are researching work on VRF to implement randomness so that the module selects a person (or group of people) with no conflicts of interest in the issue. [PR 11](https://github.com/TERITORI/gno/pull/11/files) provides more details. A true randomness function will also be handy for the Flippando game that doesn’t currently rely on true randomness. \n\nIn other news from Teritori, the moderation DAO is live! You can head to the [Teritori site](https://app.teritori.com/feed?network=gno-teritori) to play around with it and even try deploying your own DAO, creating a user profile, and adding a social feed. The team has deployed V1 of a “Soundcloud-like” app on the [Gnosocial feed](https://app.teritori.com/feed?network=gno-teritori) in which you can listen to music while browsing features, publish your own music as an artist that appears on your profile, comment on tracks, tip artists, and more. Keep updated with Teritori on their [hackerspace here](https://github.com/gnolang/hackerspace/issues/7).\n\n### Zack Scholl\nOur resident tinkerer Zack gave a workshop last month as part of his “Go to Gno” series called [Go to Gno: ByteBeat - Generating Audio with Smart Contracts](https://www.youtube.com/watch?v=lmmUIEHhdqA). This is a really interesting tutorial on how to build Bytebeat (a minimal programming language for synthesized music) with smart contracts and follows on from his microblogging workshop. Be sure to check it out. If you want to hear more about Zack, you can also watch [Getting to Gno with Zack Scholl](https://www.youtube.com/watch?v=LgXa7QCdxdA\u0026t=1258s), a Fireside Chat series that talks about contributors’ work, lives, and motivations to be on the Gno.land journey with us.\n\n### Onbloc\nAs always, the Onbloc team has been busy! Over the past few weeks, they have been working on extending the functionality of Gnoswap, integrating APIs and realms with the interface, improving the governance page UI, and integrating the Adena wallet. Onbloc expects to launch the beta of Gnoswap next month, and we’re super excited to see it in action. To improve the UX and UI of Adena and make the wallet even more secure, the team is implementing a feature called Air-Gap which allows the wallet to broadcast transactions signed from an offline environment without the user needing to import their keys to Adena. Onbloc has also started a discussion around ideas to improve the usability of QR Codes for secure data transmissions between offline signers and watch-only wallets in [Issue 1375](https://github.com/gnolang/gno/issues/1375). We’ll keep you updated on the work here. You can also find more information on Onbloc’s [informative blog](https://medium.com/onbloc). \n\nAs well as developing core tooling for Gno, Onbloc is working on Gno core to help us build important functionality. The team welcomed a new hire, Lee ByeongJun as a core engineer and to help with work on three core areas: contract interaction (enabling realms to interact with other realms), the multinode testnet, and porting essential Go packages to Gno. You can find more details and keep track of everything Onbloc is working on in their [hackerspace issue here](https://github.com/gnolang/hackerspace/issues/29).\n\n### Varmeta\nWe’re excited to welcome a new contributor Varmeta to Gno.land. Varmeta was founded in 2020 to focus on blockchain and virtual reality/augmented reality technologies and has grown from a team of three to over 40 engineers. Varmeta is excited by the vision behind Gno.land and its philosophy for rewarding developers. The team is committed to supporting Gno’s success by providing various applications for the ecosystem, starting with the Gno.land Unity SDK to make blockchain more accessible to game developers. Track Varmeta’s progress on their [hackerspace here](https://github.com/gnolang/hackerspace/issues/43).\n\n### Gno @ Devconnect Istanbul 2023\nGno.land core team members organized a small, unofficial meetup in Istanbul during Devconnect week from November 13-17. The engineering-focused meetup was accompanied by a Happy Hour and snacks, where attendees got the chance to learn about Gno.land in an informal way and how they can easily develop dApps in Gno, as well as contribute to the project.\n\nThat's all for now! Be sure to check back again with us for the next edition of The More You Gno to keep up with all our progress. Do you want to contribute to Gno.land's monthly updates? If you're building on Gno.land and want to highlight your development, project, event, or idea, let us know, and we'll include your contribution.","gnoland,ecosystem,updates,gnovm,tm2"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"JI9/iDJSGVVZ+5qaT7N8e4M3wbI4GkzDYZS4LAeiqE4nj7SWPD/LTdabBWhgiJW979dEev3d8SLh64T25nY1bQ=="}],"memo":"from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["bgl-poc1","Building Gno.land – Next Generation Smart Contract System","\n*Disclaimer: The Building Gno.land series aims to share the core concepts of our platform, mission, and tech stack, providing a snapshot of a current state on our builder’s journey. New episodes may deprecate previous ones, but no editions will be modified at any time. We encourage you to follow along as we create the rails for a more transparent and accountable society, and we welcome feedback and contributions to the repo.*\n\n## I. What Is Proof of Contribution (PoC)?\n\nGno.land is secured by a novel consensus mechanism that makes our platform unique—Proof of Contribution (PoC). PoC prioritizes fairness and merit, rewarding the people most active on the platform and revolutionizing the concept of open-source rewards. By removing the voting power associated with being wealthy (holding tokens in Proof-of-Stake (PoS) networks or amassing mining hardware in Proof-of-Work (PoW) networks), PoC restructures the financial incentives that tend to corrupt blockchain projects in the long run and rewards contributors fairly for their work based on their expertise, commitment, and values. \n\nGno.land contributors receive rewards and voting power according to their contribution level. These rewards increase as they make additional contributions, gain expertise, and are promoted up the Gno.land governing DAO’s (GovDAO) tier levels by higher-level contributors. So how does PoC work, what are its core features, and how does it lend security and decentralization to the platform? \n\n### Prioritizing Fairness and Alignment \n\nProof of Stake (PoS) was a monumental leap forward for the blockchain industry, solving the energy-intensive requirements of Proof of Work (PoW) and enabling blockchains to scale for broader adoption (thanks to its minimal carbon footprint and faster throughput). However, like PoW, PoS has some disadvantages. For example, in PoS networks, participants receive rewards based on how many tokens they stake, which means their incentives for working on the chain are often purely financial. Validators accumulate vast net worths and don’t always hold values that align with the core development of the chain. \n\nSince validators are crucial in securing PoS networks, they should be paid fairly for their work and encouraged to contribute more. However, validators should not be purely financially (and certainly not politically) motivated, taking up competing positions and launching political campaigns to convince token holders to stake with them. This type of lobbying affects all aspects of the chain’s development—from governance to technical upgrades—and can lead to factionalism and misalignment. \n\nPoC makes the system fairer and more sustainable, ensuring participants are aligned and take actions that benefit the Gno.land community and the broader ecosystem. That’s why (unlike PoS) contributors receive rewards based on their contribution effort (tier level) rather than how many tokens they stake. They are thus incentivized and recognized for the quality of their work, ideas, and alignment, driving participation and active engagement. Governance is allocated to the people most likely to care for the ecosystem’s long-term success—the contributors who have spent the most time working toward it—from open-source developers to video creators and everyone in between.\n\n### Rethinking Financial Incentives \n\nFor long-term security and sustainability, PoC emphasizes project principles and values over monetary gains, replacing standard token incentives with a system that separates voting power from token ownership. Two reward systems are currently being considered (in addition to a hybrid system). For the first, contributors receive WORX units that weigh the amount of GNOT tokens (the native Gno.land gas token) earned each month. Each member of the same tier receives the same amount of WORX. At the end of the month, the total each member earned is divided by the total amount of WORX distributed that month to calculate a percentage. This percentage represents the percentage of Gno.land fees earmarked for contributors that each member will earn in GNOT. WORX will likely be cleared each month to prevent cumulative, exponential reward exploits over long periods of time. \n\nFor the second, each tier level simply receives an amount of GNOT each month fixed to a USD value, similar to a salary. This would be combined with risk management and caps per tier level in order to promote long-term sustainability based on Gno.land fee generation. A hybrid of this system is also possible, either rewarding contributors of lower tiers one way and higher tiers the other or using both systems in tandem based on predefined conditions. This will be explored further in future tokenomics articles, models, and documentation.\n\nRegardless, WORX units are not transferable, will not be listed on exchanges, and hold no monetary value. WORX units are more like shares that represent value provided by contributors and allow their work to be quantified compared to other contributors/tier levels. It’s important to stress that GNOT tokens do not influence governance on the platform in any way. Voting power is earned through contributions and distributed according to contribution effort, with each member of the same tier representing equal voting power that increases with their tier level. This creates a network of highly aligned contributors who care deeply about the platform they are building and strive to improve it.\n\nGNOT, the native Gno.land gas token and the gas token of the Gno.land ecosystem, will be distributed via airdrop to qualifying ATOM stakers. It will also be available for purchase after that point (*more on Gno.land’s airdrop and tokenomics coming soon*). GNOT is used to pay all fees associated with the network and beyond, including transfers, IBC, ICS, and contract interactions, giving holders the chance to earn rewards from the economic activities of Gno.land.\n\n### What Makes a Good Contribution?\n\nWORX and/or GNOT can be earned through different types of contributions—not only coding and development expertise—but also through non-technical contributions, such as community building, governance involvement, constitutional proposals, teamwork, media creation, etc. The core focus is on alignment, not necessarily specific tasks. For example, an accepted proposal or merged code will raise or at least maintain the contributor’s tier level, allowing them to receive rewards during their time working between submissions. However, a proposal or code that has displayed a very high level of effort, detail, and aligned values (but is not merged) will also be considered in any proposals regarding contributor promotion.\n\nThis system allows the ecosystem to show appreciation for diverse forms of contributions and ‘useful failures’ that bring us closer to the solutions we adopt. It is designed to foster engagement, creativity, and collaboration while encouraging anyone aligned to contribute to growing the Gno.land chain and community. \n\n### How Are Contributions Assessed?\n\nThere is a strong human element to deciding what makes a good contribution, requiring knowledgeable human judges to exercise discretion. As such, contributions won’t be templated by default or rewarded automatically but assessed through Gno.land’s governing DAO, GovDAO. GovDAO is responsible for development and governance and is organized into tiers, as discussed above.\n\nGovDAO members review, measure, and curate contributions, and the tokenomics of GovDAO incentivizes members to be effective and unbiased evaluators. They engage in discussions and assess contributions based on effort, time, and other relevant factors/metrics that contributors will have stored in their profiles. The decision-making rationale is transparent and visible through on-chain forums. Again, contributors are assigned a tier level and receive a corresponding reward each month according to their tier. As contributors join GovDAO, the DAO grows, giving Gno.land decentralization efficiency and a high Satoshi score. \n\nGovDAO is assisted by a network of knowledge-specific DAOs, such as an Engineering DAO, a Support DAO, an Operations DAO, and the EvaluationDAO, which comprises a trusted group of high-reputation contributors that help assess specific contributions. This enables secure collaboration and seamless integration (*more on Gno.land’s network of interconnected DAOs coming soon*.) \n\n### Sybil-Resistant and Secure\n\nIn addition to being fairer, more aligned, and sustainable, PoC is Sybil-resistant by design. In blockchains, a Sybil attack is where one or multiple attackers multiply their presence and influence by creating fake identities to sway major network decisions (for example, including malicious blocks). In terms of PoS, the Sybil resistance is purely monetary (people need to stake real money to get power), so an attacker that wants to carry out a Sybil attack on a PoS network needs to lock at least as much stake as that locked by honest validators.\n\nPoC minimizes risks of Sybil attacks, takeovers, and alliances as the community vets every person who is given any power or sway in the network (including validator power) through the DAO, so at no point can anyone \"spoof\" identities and regain major sway. Moreover, Gno.land is built and secured by the merit and effort put into the project, as opposed to how many tokens someone can buy, rethinking financial incentives and making the platform Sybil-resistant and secure.\n\nThrough fairer rewards, restructured incentives, resistance to corruption and Sybil attacks, and a strong appreciation for all contributions, Gno.land is designed to be sustainable and fair. A censorship-resistant platform built, owned, and secured by a growing, aligned community for many generations to come.\n\n*I. What Is Proof of Contribution? is the first in a series of articles to dive deeply into the philosophy, vision, mechanics, and work involved in developing a new consensus mechanism for the next generation of smart contract systems. Look out for subsequent editions and additional Building Gno.land series, and let us know what you think! Got questions? Join the Gno.land [Discord](https://discord.com/invite/S8nKUqwkPn) or follow us on [Twitter/X](https://x.com/_gnoland)*.\n","building-gnoland,gnoland,proof-of-contribution"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"d8Aoi7vp5+Kkiai+WeA8ETASN1/NE0+PtfZ661AVqCJRaDfbxLZ1W0E6OQp63yeBavkfG65QSZmVxloYUJ7TaA=="}],"memo":"from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-7","The More You Gno: Gno.land Monthly Updates - 7","Welcome to the latest edition of *The More You Gno*, your regular source of updates from the Gno.land core team and contributor ecosystem. After a well-deserved rest during the holiday break, we’re kicking off 2024 with renewed energy and plenty of exciting initiatives, including a new staging testnet (the Portal Loop), the official Gno.land documentation page, several merged PRs (including native bindings!), and many updates across the board. Dive in to find out what we’re working on and what our ecosystem partners and grantees have been up to.\n\n## Gno Core Team Updates TL;DR\n\nShort on time? Skim the highlights from the core team in the list below. You’ll find additional details in the next section if you want to explore any topic in greater detail.\n- **Native Bindings** - If you’ve been following our journey or experimenting with the platform, you’ll hear virtual champagne pops as Morgan’s ongoing work with native bindings is finally merged [PR 859](https://github.com/gnolang/gno/pull/859).\n- **Gnodev** - Thanks to Guilhem’s `gnodev` initiative [PR 1386](https://github.com/gnolang/gno/pull/1386), you can now create and develop contracts with a single command.\n- **Gno.land Offical Docs** - Check out [docs.gno.land](https://docs.gno.land) for how-to guides, getting started, and an overview of key concepts of the platform.\n- **Effective Gno** - Taking inspiration from *Effective Go*, Manfred’s begun listing common patterns and examples of the differences between Gno and Go.\n- **Assignment in GnoVM** - Jae is working on approaches to fixing assignment in the GnoVM and issues that deal with persistence [(issue 1326)](https://github.com/gnolang/gno/issues/1326). \n- **Portal Loop** - The [Portal Loop](https://portal.gnoteam.com) has been released on a staging domain and is being tested.\n- **Roadmap** - We’re working on a fully-fledged Gno.land roadmap and will share a detailed DAG and important goals and milestones with you soon.\n- **Tendermint2 Update** - There are several PRs aimed at removing the dependencies between Tendermint2 and GnoVM.\n- **Gno.land Tokenomics** - We continue to make progress in defining the structure of Gno.land’s DAOs and the design of reward schemes for contributors.\n### Native Bindings (PR859) Has Been Merged\n[PR 859](https://github.com/gnolang/gno/pull/859) (native bindings) was submitted by Morgan in May 2023 to improve calling Go code from Gno standard libraries, all while improving `gno doc` documentation for standard library functions. Native functions are _declared_ in Gno code, but their definition (the underlying code) only exists in Go: this is similar to how Go and many other systems languages implement assembly functions. Overall, the addition will now allow us to better support precompilation (transpiling Gno code to Go) for all Gno-specific standard libraries, like [`std`](https://docs.gno.land/reference/standard-library/std/address/), and have a system for defining such functions that is transparent to code analysis tools like `gno doc` and `gnols`.\n### Gnodev Has Been Merged\n[PR 1386](https://github.com/gnolang/gno/pull/1386) (`gnodev`) has been merged. Gnodev is a tool to locally develop Gno realms which automatically re-deploys your contracts when you change the files, similar to JavaScript frameworks `npm run dev`. There are some additional features being worked on to improve the experience, including browser hot-reload (for the full front-end JavaScript experience!)—and Gno core developers who have worked on realms all agree that thanks to `gnodev`, they can finally stop visiting their therapist every week. Play around with it, and let us know how you get on. There may be a few bugs still and Guilhem is happily accepting feedback.\n### The Gno.land Official Documentation Page Is Live\nWe’re excited to have the Gno.land Official Documentation page live on the [https://docs.gno.land](https://docs.gno.land) domain. This will always be a work in progress as we expand the docs, make iterations to existing issues, and refine some of the core concepts, but it’s an excellent resource for anyone wanting to find out more about Gno and for onboarding new developers to the platform. A big thanks to the Onbloc team, whose developer portal was a huge inspiration for this. We’re looking for feedback, so leave your reviews and let us know where the docs can be improved and what else you would like to see.\n### Effective Gno\nManfred has been working on a document called [Effective Gno (PR 1000)](https://github.com/gnolang/gno/pull/1000), which takes inspiration from *[Effective Go](https://go.dev/doc/effective_go)* and will become an important reference document for Gno devs to explore common patterns and crucial differences in how we program compared to Go. We’ll be iterating on this as we progress, but you can already find plenty of examples. If you’re just getting into Gno and coming from a Go background, this is a great resource. Read this document and provide some comments if you have any. \n### The Portal Loop Beta Is Live\nThe Portal Loop Beta has been released on a staging domain, and you can check it out now at [https://portal.gnoteam.com](https://portal.gnoteam.com). The Portal Loop will replace the Gno.land website once we’ve finished squashing bugs and adding features. We’re still testing it and have identified several issues. For example, from the last three merged PRs, only one triggered a redeploy when we expected two or three deploys. We will also add a faucet.\n\nAs we continue to evolve the Portal Loop out of its early development stages, transaction volume and general activity will increase. However, currently, there are insufficient transit testing transactions. One of the tasks we want to do to prove that the Portal Loop is working well enough is to write a kind of monitoring-oriented oracle that will try to make transactions, perhaps incrementing a counter every minute. We’re looking for help writing a script or a daemon for this oracle, so let us know if you want to contribute to [issue 1443](https://github.com/gnolang/gno/issues/1443). Once the Portal Loop is finished, we will focus on testnet 4.\n### Assignment Issues in the GnoVM\nMorgan came across a bug [issue 1326](https://github.com/gnolang/gno/issues/1326), which returned an error about an [“unexpected unreal object”](https://tenor.com/es/view/cranizox-gif-8576622211330078986) when assigning a local variable to a dereferenced global variable in the GnoVM. Jae has been spending some time working on approaches to solving this and fixing assignment that will also work for saving escaped objects that don't have a parent (like variables whose pointers are referenced on a persisted object). This is a tough one to figure out, so if there are any other VM issues that deal with persistence and detached parentless objects, now is the time to add them to Jae’s plate. \n### An Update on Tendermint2\n[PR 1483](https://github.com/gnolang/gno/pull/1483) has the same goal as [PR 1438](https://github.com/gnolang/gno/pull/1438): to make Tendermint2 completely independent of GnoVM and Gno.land. This continues a project started many months ago to separate Gno into three separate components: the Tendermint2 consensus engine, the Gno programming language and VM, and Gno.land, the blockchain combining both together. This way, we’re working towards making it possible to build other blockchains that use Tendermint2 (like AtomOne!), the GnoVM, or both!\n### Gno.land Engineering Retreat\nIn the last *The More You Gno*, we covered the Gno.land and AIB company-wide retreat, an invaluable opportunity to work together, code together, and get to know our peers outside of work. It was such a success that the Gno core dev team held another retreat in December in Rouen, France, where many of the above issues and PRs were tackled and merged. We look forward to more productive and frequent face-to-face meetings in the year ahead.\n### Gno.land DAOs and Tokenomics\nWith the input of Manfred, Jae, and the rest of the team, Michael continues to make advancements on Gno.land’s system of DAOs and tokenomics. One key change since the last edition is that the WorxDAO (responsible for governance and all issues related to development in Gno.land) will now be known as the GovDAO. The DAO will likely have seven tiers but initially launch with three or four. The main benefits of moving up tiers are increased voting power, increased monthly rewards, and the authority to promote members from lower tiers. GovDAO will be assisted by WorxDAO, which will encompass several different sub-DAOs, such as engineering, funding, and projects. \n\nWe’re currently exploring different reward systems for contributors, whereby each member of the same tier level will receive the same amount of rewards, either directly or indirectly, in the GNOT native gas token or USD, in a type of salary-based scheme. We may also elect to distribute rewards based on a contribution/work “hash difficulty” (total number and tier split of active contributors that month). We may also adopt a hybrid of these two models. \n\nMichael is also working on a bounty system to make Game of Realms (GoR) more accessible and evaluating contributions easier for judges. High ranking GoR competitors will likely receive Gno.land tier levels based on their leaderboard placing in addition to ATOM rewards. It’s important to note that these discussions are ongoing, and the information here may be deprecated. \n### Making Testing Faster\n\nThanks to Petar, [PR 1417](https://github.com/gnolang/gno/pull/1417), we have improved the entire VM testing suite runtime by around four minutes, which is an incredible achievement. We just need to refactor some test scenarios that are not very concurrent-friendly, but this PR makes interacting with the platform so much easier.\n\n### Bug Fixes and Miscellaneous Items\n\nThanks to Joon from Onbloc, we were able to add support for octals without 'o' (check out [PR 1331](https://github.com/gnolang/gno/pull/1331) for more details), and thanks to Dragos [PR 1309](https://github.com/gnolang/gno/pull/1309), we extended the GRC721 interface so that it now supports setting a token URI. These are both extremely welcomed contributions, and we appreciate our ecosystem partners.\n\nFrom the core team, a special shout out to Dylan for killing it fixing bugs, and getting many PRs ([PR 1451](https://github.com/gnolang/gno/pull/1451), [PR 1315](https://github.com/gnolang/gno/pull/1315), and [PR 1305](https://github.com/gnolang/gno/pull/1305), to name a few) merged over the last few weeks. Props also go to Marc for [PR 1177](https://github.com/gnolang/gno/pull/1177), which has just been merged, which fixes append in certain key situations. We’ve also welcomed a new security engineer, Kristov, to the team.\n\n## Grantee and Ecosystem Updates\n\n### Onbloc\n\nOnbloc has been on a roll, giving us an internal demo of Gnoswap beta just before the Christmas break and a public demo of its awesome Pool Incentivization feature during the last contributor sync call. With Pool Incentivization, anyone can add extra rewards on top of swap fees for LP stakers. This will help bootstrap initial liquidity for new-coming projects by attracting liquidity providers until sufficient organic trading volume is secured. Onbloc is also actively developing Adena’s Airgap feature and has improved the sign-in flow for security enhancement along with some refactoring. There will be a demo coming up in the next few weeks. Onbloc will also be researching airdrop trends and aiming to identify some of the most coveted DEX features users want to see for Gnoswap to streamline the onboarding process.\n\nRegarding Gno core, Onbloc core dev Byeongjoon Lee has developed a JSON parser for Gno, giving us a live demo during the last contributor sync. This allows the conversion or accessing of data from contracts in the JSON format, which will improve the Gno developer experience. His code is currently under review by the core team in [PR 1415](https://github.com/gnolang/gno/pull/1415). Dive deeper into Onbloc’s Builder Journey in the [hackerspace issue 29](https://github.com/gnolang/hackerspace/issues/29).\n\n### Teritori\n\nTeritori continues the challenging work of developing Gno Project Manager, a web app that allows anyone to create, fund, review, or manage projects fully on-chain. During the last contributors' call, the team gave a demo of the work achieved so far, in particular regarding the escrow system and completing project milestones so contributors can be paid once each one is completed rather than having to wait until the project finalization. \n\nGno Project Manager is a complex goal, and the team has run into some issues with edge cases they hadn’t bargained for in the relationships between grantees and funders. The team is looking for feedback and help identifying edge cases, so if you have any in mind, let them know. Teritori is also working on the conflict solver module and improving the social feed on [https://app.teritori.com/feed?network=gno-teritori](https://app.teritori.com/feed?network=gno-teritori), as well as providing more detailed documentation on their work, which they’ll be releasing in the coming weeks.\n\n### Berty\n\nThe Berty team has been busy working on GnoSocial backend implementation. The initial feature set has been implemented [here](https://github.com/gnolang/gnosocial/blob/main/realm/public.gno), including posting and replying to messages and reposting threads. You can keep up with Berty’s journey on GnoSocial in [hackerspace issue 51](https://github.com/gnolang/hackerspace/issues/51), which contains many issues and PRs, such as implementing calls, running tests, and fixing bugs. We’re super excited about pushing the limits of scalability with Berty’s decentralized social platform, and we’ll be looking forward to more demos in the coming weeks.\n### Dragos\nDragos has successfully launched the Flippando game, and you can try it out on the [testnet here](https://gno.flippando.xyz/flip). If you haven’t been following the progress, Flippando is an on-chain memory game that you can play with your choice of styles, such as dice, colors, and hexagrams. Once you successfully complete a matrix, you can mint the end result as an NFT, which can later be assembled into larger, more complex NFTs to create digital artwork. You can find out more about the game, its creator, and the official roadmap on the site. We’ll also release a blog post soon from Dragos sharing his experience porting Flippando from Solidity to Gno, so stay tuned!\n### Varmeta \nVarmeta’s update was brief this week since the contributor sync call ran over. We look forward to hearing more about the team’s progress in developing the Unity SDK for Gno next time. You can read more about it on Varmeta’s [hackerspace issue 43](https://github.com/gnolang/hackerspace/issues/43).\n\n*Do you want to contribute to Gno.land's monthly updates? If you're building on Gno.land and want to highlight your development, project, event, or idea, let us know, and we'll include your contribution. That's all for now! Keep track of our progress by following our socials [Twitter/X](https://twitter.com/_gnoland) and [Discord](https://discord.com/invite/tF2X8M6cVj) and watch out for the next edition of The More You Gno in a few weeks.* \n","gnoland,ecosystem,updates,gnovm,tm2"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"IRpsyYNvTe2oUSIOg7Cp5Kv8g7W78rQoaM1iBuL3Nv48IJtQBW9BFik8ZvEop3aZDF1LQZR5JRyGddo68627WA=="}],"memo":"from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["porting-flippando-gno","5 Things I Learned While Porting Flippando From Solidity to Gno","\nLast year, while visiting Seoul, South Korea, I decided, on a whim, to sign up for a hackathon called Glitch. The project I was going to present was a tiny little game, written in Solidity, called Flippando. It started as a weekend project to help me learn Solidity (I had no prior experience with this language). To my surprise, my tiny little game won the first prize on the Polygon track of the Glitch hackathon.\n\nEncouraged and even more curious now, I started attending side events during Buidl.Asia. One was about Gno, a smart contract platform written in Go. After the presentation, which was really great, I started a light conversation with the team. One thing led to another, and I ended up showing them Flippando. \n\nJust for context, Flippando is a non-degen, deceptively simple memory game. You start with an empty matrix and flip tiles to see what’s “underneath.” If the tiles match, they remain uncovered; if not, they are briefly shown, and you have to memorize their color until the entire matrix is uncovered. The end result can be minted as an NFT, and you can later assemble all the boards into bigger, more complex NFTs, basically “painting” with the uncovered tiles.\n\nThe Gno team seemed to like it, and they suggested I should apply for a grant to port it to Go/Gno. I had no prior experience in Go either, so I thought this would be a good opportunity to learn more. To my surprise, again, my grant submission was accepted.\n\nFast forward a few months until now: the Gno version of Flippando is live (in testnet beta) at [https://gno.flippando.xyz](https://gno.flippando.xyz). What follows sums up my experience porting the game from Solidity to Gno. This blog post is a mix of technical and not-so-technical takeaways.\n\n## 1. Being Early Pays Off\n\nSolidity has been around for some time now, and there is already a solid tooling ecosystem for it. I used Hardhat for my development, and I got really comfortable with it. When I started to port Flippando, though, I was quite surprised to see there was almost no tooling in Gno. Developing was mostly TDD (test-driven development) against a local VM, and deploying realms on the actual chain was more complicated than I expected. \n\nMy first feedback rounds to the team revolved almost exclusively around this topic. Very soon, I started to receive signals that my feedback was not only heard but taken into account and processed, and there were actual projects built aiming to improve the developer experience. In just two or three months, two full projects were finished: gnodev, and Gno Playground. \n\nGnodev makes development very similar to Metro in React Native: there is a watchdog on the file system, and your changes to the realm code are reloaded every time you save. It’s almost like deploying in real time; no need to stop the chain, wipe the state, restart the chain, and redeploy your modifications. Gno Playground is a sandbox-like environment, which helps tremendously with quick testing and even deploying packages on-chain. Both projects were finished, as I said, in just two to three months.\n\nBeing early pays off because you get to shape your development environment much faster than in a solidified (pun intended!) environment. You may have to deal with a little chaos in the beginning, but the benefits are well worth it.\n\n## 2. TDD All Day Long\n\nAs I said above, developing realms in Gno consists mainly of writing and testing your code with another code. It’s called TDD and it’s a very useful developing strategy, in general. I used it, at my day job, in all my projects consistently, but only in the initial stages. Once the codebase was more stable, I was relying more on regression tests from the Q\u0026A team.\n\nMind you, there was no Q\u0026A team this time; I was just coding alone, and I was forced to comply more and more with this TDD approach. In the end, I have to admit that, while slower and a bit boring, this approach is more effective, especially in a volatile environment, where patches are added literally every day, and the environment changes continuously.\n\n## 3. Marshal and Unmarshal\n\nThe current GnoVM doesn’t yet have an API standard for formatting. You can’t put a setting somewhere that will make the response be automatically translated into JSON. You have to write these JSON objects yourself for every payload you return from your realm. \n\nIn Solidity, all this is hidden under the event mechanism and handled by existing libraries, like ether.js, which take care of all this nitpicking. It soon became obvious that development time would be significantly longer in Gno because, on top of the logic, I also had to write the formatted response “by hand.”\n\nBut as with every other thing that seemed weird in the beginning, eventually, I came to appreciate it. It forced me to prototype more carefully not only the actual response but all the objects needed in my game. Eventually, it resulted in simpler and more flexible code.\n\n## 4. Eating Your Own Dog Food\n\nWhen developing in Solidity, most of the time, you just import OpenZeppelin contracts for ERC20 and ERC721 tokens (which are battle-tested, bug-free, and relatively easy to understand) and focus on your own contract logic. No mingling with low-level token implementation details; these are already packaged and ready to use.\n\nWhile porting Flippando to Gno, I realized I had to deal with these low-level details upfront simply because there was no equivalent of the OpenZeppeling contracts. Moreover, some current GRCs (the Gno equivalent of ERC) were incomplete. \n\nSo, I had to make a PR for a GRC721 implementation that was missing the SetTokenURI functionality, and this PR ended up being merged into the main Gno codebase (that felt really good, to be honest). \n\n## 5. Being Early Pays Off. Did I Say That Already?\n\nYes, but this time it’s about something else. It’s not about the satisfaction of shaping the development environment in the early days. It’s about the privilege of witnessing something coming to life from literally nothing. Gno has been in development for almost two years now, and it is several months before its mainnet. It’s literally on the verge of coming “alive.”\n\nEvery day new commits are added, and new decisions are made. There are new contributors constantly joining, and new projects prototyped and launched faster and faster. Every day the ecosystem is coagulating itself into something more and more visible, more and more alive.\n\nBeing able to witness this from the inside is a rare privilege and something I’m very grateful for.\n\n## Final Thoughts \n\nSo, these are, in a nutshell, my five top takeaways from porting Flippando from Solidity to Gno. There are many others, of course, and Gno is (did I already say this?) still very early. If you’re interested in learning more, please visit the official repo, look at the docs, and try interacting with the devs. You’ll never gno what can grow out of it! And be sure to play [Flippando](https://gno.flippando.xyz) today live in testnet beta and share your flips.\n\n## Here’s How to Play Flippando\n\nThe game presents a 16 tiles (4x4) or 64 tiles (8x8) matrix. These tiles are “covering” a board of various colors and gradients or shapes, like dice or hexagrams. Clicking two tiles consecutively “flips” them, showing what’s underneath. If they match, they remain uncovered; if not, they are briefly shown, and the player needs to remember their position. Once an entire board is flipped, revealing its random combination of colors, the player can choose to mint it as an NFT.\n\nWhen minting a solved board as an NFT, the game also mints a fungible token, FLIP, which is “locked” inside the NFT. This is the player's “reward.” But the token can only be unlocked if someone else uses that NFT in a larger project.\n\nThese larger projects, or “artworks,” can be assembled in the Flippando Playground. All minted basic NFTs are displayed here in an area from where the player can drag and drop them onto a canvas, creating a much bigger and more complex NFT. Once the canvas is fully filled and the player is satisfied with what’s in there, these new “artwork” NFTs can also be minted. This unlocks all the FLIP tokens for the NFTs used inside the artwork and sends them to their initial players. Furthermore, these complex artworks can be listed and traded in a marketplace, closing the circle of a virtual economy of goods.\n\nStart playing Flippando and share your Flips with Gno.land on [Twitter/X](https://x.com/_gnoland?lang=en) by tagging #gnoflip. \n\n\n","gnoland,ecosystem,updates,flippando"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"3lzrHFZE5tFzARPLRb4dva265y8AF9H0G8s0YXJEpcseNtROmAipwgr185llFTxmW9qPzKrJ0jTrnfULiOl9jQ=="}],"memo":"from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["wyg-zooma","Who You Gno – On the Record with Antoine Breuil","\nAntoine Breuil, ‘zôÖma,’ is the co-founder of [Teritori](https://app.teritori.com/), an active Gno.land contributor and grantee that’s building key modules and tooling for Gno. A firm believer in equal opportunities, free and decentralized access to information, and helping fellow humans, zôÖma is fascinated by human behavior and how we organize ourselves, holding an avant-garde social experiment five years ago with Teritori co-founder ‘Pop.’ \"La Suite du Monde\" drew people across France to a small village in the countryside to create a shared community and society—with farmland, accommodation, and tools for common use.\n\nThe goal was to form an in-real-life DAO whose members shared common goals and interests using blockchain technology with a token to pay for goods and services and vote on governance matters. While many people participated and were enthusiastic about creating a shared society, zôÖma admits the experiment was early- no one was interested in interacting with the tech. “90% of people, rural or not, found it too complicated,” he admits. “We were a bit naive, but it was fascinating nonetheless.”\n\n## A Fascination for Human Behavior\n\nzôÖma has been an ardent student of human behavior since childhood. His parents taught him early on the value of philanthropy and working with people in need. He’s set up several joint liability companies, non-profits, and NGOs to experiment with finding new and better ways to organize society, and one of the things he loves most about web3 is its “experimental” nature. He’s encouraged by how far the industry has come since he received his first bitcoins in partial payment for a website in 2014. “That turned out to be a really expensive website for my customer,” he laughs. He never expected such broad adoption of Bitcoin and a technology that “inspired a whole generation of engineers to experiment with new things.”\n\nLike most creative types, zôÖma is used to spinning many plates in the air, overseeing La Suite du Monde while working as a freelance designer, front-end dev, and Artistic Director for an independent French record label. “Before entering the world of engineers, I founded and managed a collective for 12 years, which brought together artists from all disciplines, hackers, designers, tinkerers, to build some interesting projects.” La Suite de Monde allowed him to explore his passion for finding new approaches to social coordination first-hand. “I explored very radical things,” he says, “like the notion of “accepted by default” where anyone could use the collective budget by expressing their desire to do so three times. I wouldn’t recommend this,” he laughs, “but the experiments were fascinating and still serve me today in my work.”\n\nOne really interesting trait about zôÖma is how he harnesses the creative and analytical sides of himself with equal application. Most people are predominantly right-brained or left-brained, yet, zôÖma is ‘ambidextrous’ in this regard. He’s a designer who’s created large-scale artistic events, cultural tours of Paris, and an award-winning independent movie documenting French artist and Bitcoin advocate Pascal Boyart, [The Underground Sistine Chapel](http://www.the-chapel.art), (which you should definitely check out!). Yet he’s also passionate about engineering and the future of cooperatives. He’s detail-driven and ambitious, taking his team at Teritori from two to 18 (14 full-time teammates and four part-time).\n\nIn his free time, zôÖma, “like all French people,” enjoys fine wine and good conversation. One of the things he loves most about Paris is how easy it is to find like-minded people to brainstorm with or decompress after a long day of work. “We have a very active ecosystem of engineers, cryptographers, etc.,” he says. Paris is also a beautiful city that captures his imagination with its dazzling architecture and impressive art. Even so, zôÖma channels his creative energy more effectively when working from a small Moroccan fishing village for three months a year. He reconnects with nature and humanity, immersing himself in a different culture and surfing in the Atlantic before he starts his day. \n\n## New Tools for Social Coordination \n\nWhy does zôÖma believe social coordination is so important, and why do we need new tools for it? “We’ve always had tendencies to organize ourselves and tools defining rules for living together, diplomatic protocols for discussing between social groups, or trading goods and services. But almost all the tools that previous generations put in place are outdated. Our entire generation has lost confidence in institutions to allow groups of humans to organize, coordinate, and meet their needs. Our dependence on third parties who do not have the same interests as citizens is immense.”\n\nzôÖma believes that web3 holds the key to unlocking the emergence of new societies through products that are “unstoppable, resilient, and meet a real need,” whether for small villages in the south of France, Africa, or Asia or neighborhoods in Brazil or Korea. “We must have access to the radical transparency of institutions, the privacy of individuals, censorship-resistant tools, and autonomous communication from all commercial enterprises. It is on this solid foundation that civilizations that are more just and equitable can be built.”\n\n## Making Web3 More Accessible \n\nOf course, as zôÖma found out, building new tools is easier said than done. Our industry faces an uphill climb when it comes to balancing the promise of the tech with a user experience that doesn’t cause tachycardia. He says that understanding that most people “don’t have the time or inclination to incorporate difficult technical concepts in their lives” has given him “crazy energy to focus on very simple technologies.” In fact, the ‘failure’ of La Suite du Monde is what gave birth to Teritori, “which today provides all the functionalities people asked us for at the time; a social network, communication systems, voting, crowd-funding, etc. We have made great progress, and it’s important to focus on products that are radically simple for the general public.”\n\nAccording to zôÖma, this means abstracting away the concepts that everyday people don’t need to be aware of, such as networks, dApps, and even blockchain, “and always switching from one decentralized application to another.” Unifying (not centralizing) separate tools, networks, and technologies within a single, simple interface, he believes, is the key to broader adoption. “It's a very complex challenge, in terms of security, design, etc., but it's what I'm passionate about today.” \n\nWhen it comes to Gno.land, Teritori has already delivered essential DAO tooling and standards, a Moderation DAO module to facilitate social communication and a Justice DAO module for conflict resolution. The team is now focusing on an on-chain project management tool to allow organizations and individuals to manage projects and track tasks smoothly and transparently on-chain.\n\n## A Fairer, More Transparent World\n\nIn 2024, Teritori enters a new phase called \"Chapter II,\" which involves unifying all its work into a mobile and desktop application that could “trigger superb demonstrations of the potential of DAOs.” He enthuses, “I dream that we will see the emergence of a village that uses Teritori as a tool for internal discussion and co-financing. Will this be real in 2024? Who knows? But that’s where I focus all my energy!”\n\nHe believes the internet has been a great leveler, enabling anyone with a connection to educate themselves on any subject; yet, the opportunity isn’t open to all, and free and open access is constantly diminishing. “I am a child of the internet. I grew up with warez, p2p, and an internet which provided me with daily resources to learn freely, everything that interested me. In some countries, it is impossible to benefit from this opportunity, and with the centralization of the internet on different key players, mass surveillance, and the censorship of certain dictators, the internet is losing its very essence, which makes it magic. Distributed protocols can reshuffle the cards and offer tools for the public good.” \n\nzôÖma says that humanity is at a turning point, and we must build the necessary tools now to avoid finding ourselves in a real-life version of George Orwell’s 1984. “I aspire to participate modestly in a world that is fairer, more transparent, and where society doesn’t need a puppet in a suit to improve its living conditions or respond to local needs. Web3 is just a tool, and if it doesn't meet this real need, then for me, it will be a failure.”\n\n*Experiment with Teritori today and test its Social Feed, which now includes Twitter-like functionality for posts, Medium-style articles, Soundcloud-inspired music, and videos—all based on Gno and IPFS and totally decentralized. You can also check out Teritori’s GnoModerationModule, which allows you to moderate a social network in a decentralized way. A faucet is available on the home page at [app.teritori.com](https://app.teritori.com/feed?network=gno-teritori).*\n","whoyougno,teritori,community,interview"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"UTIlk+GBJGKnPfXDsLEJG5UykXI0w0kU3Np7ZnoKnpYT6Rl+dApjxeLmr+6BctFYFZKsgnrLzI3o95A9ETcEVg=="}],"memo":"from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["bgl-poc2","Building Gno.land - Proof of Contribution II","\n## II. Proof of Contribution vs Proof of Stake\n\nProof of Stake (PoS) is a robust consensus mechanism that provides a more environmentally friendly and scalable alternative to Proof of Work (PoW) and powers most of the web3 industry today. As PoS pioneers, Cosmos technology secures hundreds of blockchain projects and billions of dollars of digital assets, and Ethereum (launched as a PoW chain in 2015) made the historic switch to PoS in 2022. According to [ethereum.org](https://ethereum.org/en/developers/docs/consensus-mechanisms/pos), PoS is “more secure, less energy-intensive, and better for implementing new scaling solutions compared to the previous proof-of-work architecture.” However, as we briefly discussed in [*What Is Proof of Contribution?*](https://test3.gno.land/r/gnoland/blog:p/bgl-poc-1), PoS has vulnerabilities that can corrupt the network over time.\n\n### The Limitations of Proof of Stake (PoS)\n\nBeyond securing the network, the main goal of any consensus mechanism (PoW, PoS, DPoS, PoC, etc.) is to be as decentralized as possible and not reliant on any central actors. This can be measured by the Satoshi Score (or the Nakamoto coefficient), a quantitative measure that assesses a blockchain’s level of decentralization by calculating the minimum number of nodes needed to compromise a network or carry out a 51% attack. PoS systems can be bootstrapped within days (or even hours), starting off decentralized and achieving a high Satoshi Score.\n\nThe PoS chain Genesis allocates a default voting power to ~20-50 nodes, in general equally (or at least making sure that no single node has more than 5% of the voting power). This makes PoS chains decentralized enough (in theory) from block 0 with a near-perfect Satoshi score. However, in practice, PoS has two main issues. Because the system is dictated by money, PoS chains become imperfect over time. Anyone wealthy enough can stake their tokens progressively and use their accumulated power to sway decision-making on the chain—or take the network over completely.\n\nThe chain can limit the maximum voting power per validator node, but this is almost ineffective, as a malicious actor can carry out a Sybil attack on the network and create multiple validators to bypass the voting cap. Such an attack renders the max voting power per node useless and leaves the chain defenseless against a single organization or cartel gaining the majority of the voting power. PoS systems leave chains like Cosmos Hub and Ethereum at risk from such bad actors, cartels, and powerful protocols (such as Lido and Rocket Pool).\n\nWhile Proof of Contribution (PoC) can’t prevent Sybil attacks on standard user accounts (when malicious actors create multiple accounts with a single computer and transfer tokens within a few hours), it does make it almost impossible for validator nodes to suffer Sybil attacks. Since the community vets every person who is given voting power or sway in the network (including validator power) through the DAO, at no point can anyone \"spoof\" identities and gain major sway. \n\n### Where Proof of Contribution (PoC) Excels\n\nPoC is actually Proof of Authority (PoA) which, instead of offering up a resource like computing power or a financial stake, relies on validators staking their reputation. Anyone can join most public PoW and PoS networks without revealing their identity. However, by definition, PoA validators need to make themselves known and are selected based on their trustworthiness. This means PoA tends to work better when deployed in private or permissioned blockchains than in public platforms (because of this tendency toward centralization). \n\nPoC solves this problem, ensuring the network becomes increasingly decentralized over time by being governed by a decentralized entity, GovDAO. Like standard PoA chains, PoC chains launch with a handful of validators that must be identified and trusted by the network, meaning governance is centralized at the start, and the chain achieves a low Satoshi Score. The system is about contributing and earning contribution units, which are slow to gain and require human interaction. It takes months (or years) before there are enough actors in the DAO and sufficient voting power for the chain to be considered decentralized enough, according to the Nakamoto coefficient. \n\nPoC is thus slower to bootstrap than PoS and harder to achieve. You can think of PoC versus PoS as a marathon versus a sprint, whereby PoC starts slowly but then gains momentum over time, and PoS starts quickly but loses momentum over time (the graph below provides a visual representation of PoC versus PoS). \n\n[![Graph](https://gnolang.github.io/blog/2024-01-26_bgl-poc2/src/thumbs/graph-container.png)](https://gnolang.github.io/blog/2024-01-26_bgl-poc2/src/graph-container.png)\n\nThe GovDAO that owns the chain has a mandate to scale (to grow and decentralize) continuously as it adds more contributors. This means it becomes progressively larger over time, achieving high decentralization efficiency way beyond the initial fast sprint of PoS chains. Once established as a proven consensus mechanism and alternative to PoS, GovDAO can benefit from by any blockchain project (through an evolution of ICS) wanting to achieve decentralization and sustainability—PoC can secure Gno.land and the web3 industry at large.\n\n### Security-Conscious by Design\n\nAnother advantage of PoC is that because it’s reliant on human interactions, it is more Sybil-resistant by design. As discussed, it’s almost impossible to split a validator node into two (or more) nodes, making conducting a Sybil attack infinitely difficult. Since contribution units are not transferrable or exchangeable, PoC cannot suffer from whales attempting to purchase voting power quickly. If someone wanted to take over the network, they would need to invest years of their time making meaningful contributions. Their attack would be so slow that it would easily be prevented by humans monitoring the decentralization and adjusting the parameters. \n\nMoreover, GovDAO will activate and deactivate new validators on request, establish a KYC system for validators, and manage promotions of contributors with votes. This removes the possibility of a takeover happening overnight since the only way to gain validator or voting power is by voting on governance requests, which is slow and managed by humans. This is in contrast to PoS systems which are powerful and fully automated yet defenseless against such coordinated attacks.\n\nGno.land is built on the very premise that such an attack on a PoC network would never happen as it would be entirely counter-intuitive. Since contributions are not only about expertise but also alignment, it is our hypothesis that longstanding contributors who have invested years of time and brainpower in developing the chain will do their best to protect it rather than destroy it. The DAO system will endure thanks to the mix of expertise and alignment and the amount and frequency of contributions. \n\n### Concluding Thoughts\n\nBeyond separating voting power from net wealth, a core component of Proof of Contribution (PoC) is its focus on long-term sustainability. PoC makes the system fairer and more sustainable, ensuring participants are aligned and take actions that benefit the community and the broader ecosystem. PoC is slower to bootstrap and harder to achieve than PoS but focuses on long-term alignment and security. \n\nUnlike PoS, contributors receive rewards based on their contribution effort rather than how many tokens they stake. They are thus incentivized and recognized for the quality of their work, ideas, and alignment, driving participation and active engagement. Governance is allocated to the people most likely to care for the ecosystem’s long-term success—the contributors who have spent the most time working toward it.\n\n*II. Proof of Contribution vs Proof of Stake is the second in a [series of articles](/r/gnoland/blog:p/bgl-poc1) to dive deeply into the philosophy, vision, mechanics, and work involved in developing a new consensus mechanism for the next generation of smart contract systems. Look out for subsequent editions and additional Building Gno.land series, and let us know what you think! Got questions? Join the Gno.land [Discord](https://discord.com/invite/S8nKUqwkPn) or follow us on [Twitter/X](https://x.com/_gnoland)*\n\n\n","gnoland,gnovm,tm2,PoC"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"sh248j3tGLsZvvDJ+W838/0gCxExRzxszVCInYH+3P15OR48uvnfxh0yCRlO+6yfA4nHmx7PlaiXgVxgk7c00g=="}],"memo":"from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["funding-program-23q4","Gno.land Funding and Grants Program - Quarterly Report: Q4 2023","\nThe Gno.land Funding and Grants program identifies talented and passionate developers, researchers, and tinkerers to interact with Gno.land, enhance the platform's usability, and help build the core infrastructure and tooling needed for mainnet. After a strong start in Q3 2023 from our grantees, we awarded four additional grants in Q4. Let’s take a look at their progress and what’s coming up in Q1 2024.\n\n## Q4 Funding Breakdown\n\nThe total amount paid out in Q4 for grants was just under $317,000, spread out over the four grants: Teritori, Berty, Onbloc, and Dragos (Flippando). This work was split over essential stress-testing, debugging, and development on Gno core, and building social, gaming, and project management dApps to extend the platform’s functionality. Each grant recipient received milestones for deliverables and tracked their progress through regular public and internal syncs, hackerspace journey updates, blog posts, documentation, and developer calls.\n\n[![Q4 Chart](https://gnolang.github.io/blog/2024-02-07_funding-program-23q4/src/thumbs/chart.png)](https://gnolang.github.io/blog/2024-02-07_funding-program-23q4/src/chart.png)\n\n## Berty Technologies (delivery May 2024)\n\nAfter successfully meeting their deliverables in Q3 and creating Gno Native Kit (formerly [GnoMobile](https://test3.gno.land/r/gnoland/blog:p/gnomobile)), Berty was awarded a second grant in Q4 to experiment with smart contract integrations around social media. Through the development of GnoSocial, the team has created a test bed for building decentralized social media-style apps and helped to stress test technical issues in Gno.land. \n\nIn Q4, Berty delivered V1 of GnoSocial, which includes basic Twitter-like functionality. GnoSocial will be implemented on mobile using the Gno Native Kit framework, with a minimal desktop app and a read-only web version also in the scope. Aside from this work, Berty contributes to Gno core development, helping raise issues and merge PRs. You can follow their progress in hackerspace [issue 51](https://github.com/gnolang/hackerspace/issues/51).\n\n## Teritori (delivery February 2024)\n\nAfter delivering the [moderation module](https://test3.gno.land/r/gnoland/blog:p/gnoland-moderation-dao-module) in Q3, Teritori received a second grant to carry out research and implement a conflict resolution module and an on-chain project management tool. Their work also continues on the escrow module build. As an active contributor, the Teritori team helps improve Gno core as well, getting more PRs merged, participating in regular meetings, and writing documentation. Read more about Teritori in their hackerspace [issue 7](https://github.com/gnolang/hackerspace/issues/7).\n\n## Dragos (Flippando, delivered January 2024)\n\nTo experiment with gaming in Gno.land, Dragos received a grant to port his on-chain memory game Flippando from Solidity. Flippando is a simple memory game—with a twist. Players uncover tiles and must find their matches to win the game. The result can be minted as an NFT and assembled to create larger, more complex NFTs and digital “paintings.” The beta version of [Flippando](https://gno.flippando.xyz/flip) is now live on the testnet, and you can read about his experiences in developing the game on the [Gno.land blog here](https://test3.gno.land/r/gnoland/blog:p/porting-flippando-gno) or visit [hackerspace issue 33](https://github.com/gnolang/hackerspace/issues/33).\n\n## Onbloc (ongoing)\n\nAfter producing consistently awesome work and being our longest-standing contributor, Onbloc received a grant in Q4 2024 to continue iterating on Gno.land tooling, Adena, and to help build Gno.land core in preparation for mainnet release. Part of the scope was to support contract-to-contract interaction [issue 757](https://github.com/gnolang/gno/issues/757), lead a [multi-node testnet initiative](https://github.com/gnolang/hackerspace/tree/main/multinode-testnet), write pure Gno packages, and help debugging the GnoVM, among many other initiatives. Onbloc is also adding additional security to the Adena wallet and an “Airgap” feature, which you can read more about in [hackerspace issue 29](https://github.com/gnolang/hackerspace/issues/29). We’ll also release a detailed blog post soon, so stay tuned.\n\n## Coming Up in Q1 2024\n\nWe’re looking forward to more exciting developments in the coming year as we focus on the road to mainnet. In Q1, grantees will mainly focus on debugging Gno core, developing smart contracts and libraries, building and porting dApps to Gno.land, and creating educational materials to help grow the community.\n\nBlockchain software and virtual reality technologies firm Varmeta are under evaluation for a grant to support account sessions and build the Gno.land Unity SDK to make blockchain more accessible to game developers (you can track their progress in [hackerspace issue 43](https://github.com/gnolang/hackerspace/issues/43)). We’re also finalizing a grant for a DAO tinkerer and a research report, as well as evaluating the extension of a second grant to Dragos to port his popular project management app to Gno.land. \n\n\n*We’re steadily building out the Gno.land platform and our ecosystem of grantees and contributors. Let us know if you want to join us by submitting an application at any time on the [Funding and Grants repository](https://github.com/gnolang/ecosystem-fund-grants). We’re always on the lookout for ideas to advance the platform.*\n\n\n","gnoland,funding,grants"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"I/X/Ula4WvSajaMKyR0XSSgIa0lJoC3GK8UpKZfNdcUSmC/QX8E4HLFCCo22tmmDfy4Co/UbDKaCbAQmJHLUFA=="}],"memo":"from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["wyg-dragos","Who You Gno – On the Record with Dragos Roua","\nDragos Roua is a humble man. If you had the chance to read his article, [*5 Things I Learned While Porting Flippando From Solidity to Gno*](https://test3.gno.land/r/gnoland/blog:p/porting-flippando-gno), you’d have seen him refer to Flippando as his “tiny little game” and describe his “surprise,” over it winning the Polygon track of the Glitch hackathon, two subsequent hackathons in South Korea, and piquing the interest of the Gno.land team to offer him a grant. If ever there were an inverse of “the empty vessel makes the loudest sound,” Dragos would be it.\n\nAt 54 years old, he’s lived an extraordinary life. Growing up in communist Romania, where scarcity was in abundance, and “everything was in short supply,” Dragos and his peers were “only allowed to learn one coding language,” and it happened to be called “Whatever.” So, when anyone asks in what languages he knows how to code, he always jokes that Romanians can code in “whatever.” Joking apart, his language skills are impressive, to say the least. \n\n## Dragos Knows a Lot of Code\n\n“My first production-level code was written in Cobol on punch cards,” he says when he was just 16. He went on to learn Smalltalk, Lua, and “just for fun,” even a programming language called “Brainfuck.” He spent many years programming in web2, iOS, and Andriod, but over the last seven years (since entering the web3 space), has been consistently working in JavaScript, Swift, Solidity (which he learned by creating Flippando), Python, and Go. Despite this, Dragos confesses he still feels more at home within the Apple ecosystem. “I've been building a lot there,” he says. \n\n## He Speaks Many Languages\nI ask if learning programming languages is similar to spoken languages. “Every programming language has vocabulary and grammar, which is a specific set of rules over that vocabulary, so it’s similar in that sense,” he says. And how many spoken languages does he know? “I can speak five Indo-European languages” (Romanian, English, French, Spanish, and Portuguese). “Five?” I gulp, wide-eyed, suddenly feeling inadequate for only speaking three. “Well, they all share about 70% of the vocabulary, and the grammar has almost the same rule set,” he shrugs, minimizing his accomplishment.\n\nHe’s also learning two Asian languages with varying degrees of success. Korean, a language he understands “some 40%” of, Dragos admits, is a different ballgame. “I've been frustrated for nine months, every day trying to plug away because there's literally no similarity in vocabulary between any Indo-European language and Korean. Literally no word is the same, and the grammar is also very, very different.” He explains that learning a language like Korean means starting from zero and waiting for the brain to forge the neural paths. “It's quite difficult to do,” he concedes.\n\n## A ‘Location-Independent’ Lifestyle \nI check out the backdrop behind him. He’s taking the interview from an elegant cafe in downtown Saigon with impressive dark wooden walls, large ceiling fans circling above, and a rich colonial atmosphere. “It’s such a posh place,” he smiles, “every day, there are groups of people taking pictures. It has an Indochina vibe.” I can’t help but wish I could teleport over and share a beer with Dragos as we discuss his remarkable life. “How long have you lived there?” I ask, “I don’t live in Saigon,” he replies, “I’m location-independent.”\n\nAs I wonder if that’s a more elegant term for “digital nomad,” Dragos quickly explains the difference. Digital nomads typically have no fixed abode, he says, and tend to set up a base for a short period of time before moving on to the next place. Location-independent is someone who has a base but is independent of it and chooses to spend longer periods of time in various places. “So I became a loner,” he says, “and I’ve been location-independent for six years. I spent my first two and a half years in Spain, then from Spain, I moved to Portugal, which is my base right now, and I started to explore Asia last year.”\n\n## A Love of the Open Road\nI point out how amazing his lifestyle sounds—and also how challenging it must be at times. Dragos loves the freedom that comes with being alone in a foreign land and the master of his destiny. He also thrives on learning from different people and cultures and discovering more about himself. “The more you travel, the more you learn. Where can you stay? Where can’t you stay? What is needed? You learn the logistics, and you become a much better administrator and manager of your life.”\n\nHe admits to feeling lonely at times. Being location-independent isn’t for everyone, and certainly not if you don’t like being alone. “It's very difficult to be on the road because you don't have many friends. You don't have a fixed social circle. I'm in a place right now where I'm quite comfortable with myself. I can spend long periods of time on my own without needing close encounters. I have a very limited circle of friends, which I keep in touch with every month or so.”\n\nThe cultural differences between Europe and Asia are something of a double-edged sword as well. Dragos likes Vietnam, where the people are friendly and welcoming and talk to him on the street out of curiosity or to practice their English. But he’s felt like quite an outsider in South Korea, where the culture of politeness and restraint makes it harder to establish meaningful friendships. \n\n## Astrology, AI, and Other Mind-Blowing Stuff\nTalking about human connections inevitably leads to the increasing lack of them—and the topic of AI. I ask how he feels about the prospect of AGI and a potential replacement species. He shrugs and points out that most of what we hear about AI is marketing. He thinks that LLMs (Large Language Models) will hit a wall when they run out of good data to be trained on. He is a little concerned about the prospect of election rigging and AGI being harnessed in the political sphere by nation-states attempting to outmaneuver each other by predicting the next plausible move. “But this is a can of worms,” he says.\n\n“Actually, at the most fundamental level, there is no difference between AI and the process by which we generate ChatGPT or any other language model, and… hold your breath,” he pauses, “astrology. They both take a set of arbitrary features and a set of desired outcomes. After that, they just do a lot of computation, by trying to minimize a cost function between the predicted and expected outcome. That's all there is to it. You take features, add some parameters, trillions of parameters, you run a lot of computation, and in the end, you have the most plausible outcome. LLMs do this in hours/days/weeks of training, astrology did it slowly, over the course of a few thousand years.” \nI ask Dragos if he hadn’t been a programmer, would he have perhaps become an astrologer instead? “I actually studied astrology and used it for 18 years,” he replies.\n\nI try hard not to fall off my chair. Dragos explains that astrology plays a huge role in his life, and he consults it before making any major decision—such as moving countries or leaving jobs. “I consult it on every major decision and even daily life. So wherever I have to, I use it. When I sold one of my companies, when I decided to move abroad, when I travel, and stuff like that.” He gives the analogy of meteorology and says if he knows it’s going to rain, he’ll take an umbrella to have less friction and move around more easily. In the same way, he applies astrology to his life. This man is a Pandora’s box.\n\nWhat else does he do in his spare time besides traveling the world, consulting the Cosmos, and writing code for fun? Dragos likes playing pool, socializing, dining out, and dancing. “I was a tango dancer back in Romania. I had a tango school for a year.” At this point, I’m hardly surprised. \n\n## Dragos on Gno.land \nI met Dragos last year in Seoul at a Gno.land event hosted with Onbloc during BUIDL Asia. That’s when he spoke to Manfred about Flippando and subsequently applied for a grant. We were still building the specs for the Grants Program at the time, and Dragos was our first grantee. Since then, he’s embarked on a whole new journey learning Gno and building the airplane as it flies, delivering Flippando last month and regularly helping the team with Gno.land core issues.\n\nDragos has since submitted a second grant proposal to port his project management app to Gno. “It uses my life management framework, which I call “assess, decide, do.” The name of the project is *ZenTasktic*. There is already an app on iOS that I wrote,” he explains. You can read more about his grant proposal [here](https://github.com/gnolang/ecosystem-fund-grants/pull/11) and be sure to test out [Flippando](https://gno.flippando.xyz/flip) today.\n\nI apologize for taking so much of Dragos’ time, but he assures me it isn’t a problem. “I don’t work today, I'm not busy. I'm just enjoying my afternoon in this coffee shop.” As Dragos sips on the local tipple and drinks in the sights and sounds around him, I can’t help but admire his outlook on life and the choices he’s made—and I look forward to seeing what he's up to next and what else he builds with Gno.\n","whoyougno,flippando,community,interview"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"J5SBBobIga8rdeOOj7/qdwNY2Q0AHsVAOr0gpAswY3Y4ehuldiUK3AMrqTKlyuvM+rdj63YTYYNJv7U1PlXrPQ=="}],"memo":"from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"AdminAddModerator","args":["g125em6arxsnj49vx35f0n0z34putv5ty3376fg5"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"1R1RE3msYAOhqeyBojAbgU03aQOZ1HbPaJsnCWPF0qADOaZkc1TqdxBN97kaSQSVRBWP6HCCWred3jBSAqjxxQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","to_address":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","amount":"200000000ugnot"}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"aywi5vA/pa5G5IrbmCpAVpWtWLQO7hLe13DY2fCi4C8kr+pTYB1Px0rjJauNVy0kzm/pN5Q2Piv2Yfxhi/YTQw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1c74t34ukg2lq39nxx5cddlkvjtfrm3zchnzvk6","amount":"150000000ugnot"}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OOyV3RXHRqkGl/RD1y6qRx5VOw2sah9tOs28WkSdGI0kE6z4mF83BexsRgqTps699T/vIxQV2CiKuUP95N1w5A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1c74t34ukg2lq39nxx5cddlkvjtfrm3zchnzvk6","amount":"150000000ugnot"}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OOyV3RXHRqkGl/RD1y6qRx5VOw2sah9tOs28WkSdGI0kE6z4mF83BexsRgqTps699T/vIxQV2CiKuUP95N1w5A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1c74t34ukg2lq39nxx5cddlkvjtfrm3zchnzvk6","to_address":"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv","amount":"25000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Axgr3pt7vZpg6YkRffyXKuF4xDtDDhtARw7t4Dc0DQq7"},"signature":"GADODP1QiJVsxBAd7klFZ5/jekZy0dnTE+D9ciruB4U/fD0T4vo0r2NNwR1ecECD3tBMxvT9JKs5YISiuGgmlQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/boards","func":"CreateReply","args":["2","1","1","Hello from Gnoboard!"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"Y4PBTfeWywHIO1QBUDnv6GNHI4DxNQu4FQuafdYevw54YAuV1SGpk5ms+9sDQ/fbeC5kUf2xTv9ffqyCiJslug=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"200000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","test_1","Profile description"]}],"fee":{"gas_wanted":"2000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"dclmhMSfte/U67K40D4KLve7+X/lJU7ERn2DR9lAUlFy44ZIToDiV+JWGIpPymxHDbR/ah1jpKATmuyNbjRLiw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1c74t34ukg2lq39nxx5cddlkvjtfrm3zchnzvk6","amount":"150000000ugnot"}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OOyV3RXHRqkGl/RD1y6qRx5VOw2sah9tOs28WkSdGI0kE6z4mF83BexsRgqTps699T/vIxQV2CiKuUP95N1w5A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1c74t34ukg2lq39nxx5cddlkvjtfrm3zchnzvk6","to_address":"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv","amount":"25000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Axgr3pt7vZpg6YkRffyXKuF4xDtDDhtARw7t4Dc0DQq7"},"signature":"GADODP1QiJVsxBAd7klFZ5/jekZy0dnTE+D9ciruB4U/fD0T4vo0r2NNwR1ecECD3tBMxvT9JKs5YISiuGgmlQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/boards","func":"CreateReply","args":["2","1","1","Hello from Gnoboard!"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"Y4PBTfeWywHIO1QBUDnv6GNHI4DxNQu4FQuafdYevw54YAuV1SGpk5ms+9sDQ/fbeC5kUf2xTv9ffqyCiJslug=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"200000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","test_1","Profile description"]}],"fee":{"gas_wanted":"2000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"dclmhMSfte/U67K40D4KLve7+X/lJU7ERn2DR9lAUlFy44ZIToDiV+JWGIpPymxHDbR/ah1jpKATmuyNbjRLiw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1c74t34ukg2lq39nxx5cddlkvjtfrm3zchnzvk6","amount":"150000000ugnot"}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OOyV3RXHRqkGl/RD1y6qRx5VOw2sah9tOs28WkSdGI0kE6z4mF83BexsRgqTps699T/vIxQV2CiKuUP95N1w5A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1c74t34ukg2lq39nxx5cddlkvjtfrm3zchnzvk6","to_address":"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv","amount":"25000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Axgr3pt7vZpg6YkRffyXKuF4xDtDDhtARw7t4Dc0DQq7"},"signature":"GADODP1QiJVsxBAd7klFZ5/jekZy0dnTE+D9ciruB4U/fD0T4vo0r2NNwR1ecECD3tBMxvT9JKs5YISiuGgmlQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/boards","func":"CreateReply","args":["2","1","1","Hello from Gnoboard!"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"Y4PBTfeWywHIO1QBUDnv6GNHI4DxNQu4FQuafdYevw54YAuV1SGpk5ms+9sDQ/fbeC5kUf2xTv9ffqyCiJslug=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"200000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","test_1","Profile description"]}],"fee":{"gas_wanted":"2000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"dclmhMSfte/U67K40D4KLve7+X/lJU7ERn2DR9lAUlFy44ZIToDiV+JWGIpPymxHDbR/ah1jpKATmuyNbjRLiw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1c74t34ukg2lq39nxx5cddlkvjtfrm3zchnzvk6","amount":"150000000ugnot"}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OOyV3RXHRqkGl/RD1y6qRx5VOw2sah9tOs28WkSdGI0kE6z4mF83BexsRgqTps699T/vIxQV2CiKuUP95N1w5A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1c74t34ukg2lq39nxx5cddlkvjtfrm3zchnzvk6","to_address":"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv","amount":"25000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Axgr3pt7vZpg6YkRffyXKuF4xDtDDhtARw7t4Dc0DQq7"},"signature":"GADODP1QiJVsxBAd7klFZ5/jekZy0dnTE+D9ciruB4U/fD0T4vo0r2NNwR1ecECD3tBMxvT9JKs5YISiuGgmlQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/boards","func":"CreateReply","args":["2","1","1","Hello from Gnoboard!"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"Y4PBTfeWywHIO1QBUDnv6GNHI4DxNQu4FQuafdYevw54YAuV1SGpk5ms+9sDQ/fbeC5kUf2xTv9ffqyCiJslug=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"200000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","test_1","Profile description"]}],"fee":{"gas_wanted":"2000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"dclmhMSfte/U67K40D4KLve7+X/lJU7ERn2DR9lAUlFy44ZIToDiV+JWGIpPymxHDbR/ah1jpKATmuyNbjRLiw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1c74t34ukg2lq39nxx5cddlkvjtfrm3zchnzvk6","amount":"150000000ugnot"}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OOyV3RXHRqkGl/RD1y6qRx5VOw2sah9tOs28WkSdGI0kE6z4mF83BexsRgqTps699T/vIxQV2CiKuUP95N1w5A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1c74t34ukg2lq39nxx5cddlkvjtfrm3zchnzvk6","to_address":"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv","amount":"25000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Axgr3pt7vZpg6YkRffyXKuF4xDtDDhtARw7t4Dc0DQq7"},"signature":"GADODP1QiJVsxBAd7klFZ5/jekZy0dnTE+D9ciruB4U/fD0T4vo0r2NNwR1ecECD3tBMxvT9JKs5YISiuGgmlQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/boards","func":"CreateReply","args":["2","1","1","Hello from Gnoboard!"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"Y4PBTfeWywHIO1QBUDnv6GNHI4DxNQu4FQuafdYevw54YAuV1SGpk5ms+9sDQ/fbeC5kUf2xTv9ffqyCiJslug=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"200000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","test_1","Profile description"]}],"fee":{"gas_wanted":"2000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"dclmhMSfte/U67K40D4KLve7+X/lJU7ERn2DR9lAUlFy44ZIToDiV+JWGIpPymxHDbR/ah1jpKATmuyNbjRLiw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1c74t34ukg2lq39nxx5cddlkvjtfrm3zchnzvk6","amount":"150000000ugnot"}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OOyV3RXHRqkGl/RD1y6qRx5VOw2sah9tOs28WkSdGI0kE6z4mF83BexsRgqTps699T/vIxQV2CiKuUP95N1w5A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1c74t34ukg2lq39nxx5cddlkvjtfrm3zchnzvk6","to_address":"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv","amount":"25000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Axgr3pt7vZpg6YkRffyXKuF4xDtDDhtARw7t4Dc0DQq7"},"signature":"GADODP1QiJVsxBAd7klFZ5/jekZy0dnTE+D9ciruB4U/fD0T4vo0r2NNwR1ecECD3tBMxvT9JKs5YISiuGgmlQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/boards","func":"CreateReply","args":["2","1","1","Hello from Gnoboard!"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"Y4PBTfeWywHIO1QBUDnv6GNHI4DxNQu4FQuafdYevw54YAuV1SGpk5ms+9sDQ/fbeC5kUf2xTv9ffqyCiJslug=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"200000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","test_1","Profile description"]}],"fee":{"gas_wanted":"2000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"dclmhMSfte/U67K40D4KLve7+X/lJU7ERn2DR9lAUlFy44ZIToDiV+JWGIpPymxHDbR/ah1jpKATmuyNbjRLiw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1c74t34ukg2lq39nxx5cddlkvjtfrm3zchnzvk6","amount":"150000000ugnot"}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OOyV3RXHRqkGl/RD1y6qRx5VOw2sah9tOs28WkSdGI0kE6z4mF83BexsRgqTps699T/vIxQV2CiKuUP95N1w5A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1c74t34ukg2lq39nxx5cddlkvjtfrm3zchnzvk6","to_address":"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv","amount":"25000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Axgr3pt7vZpg6YkRffyXKuF4xDtDDhtARw7t4Dc0DQq7"},"signature":"GADODP1QiJVsxBAd7klFZ5/jekZy0dnTE+D9ciruB4U/fD0T4vo0r2NNwR1ecECD3tBMxvT9JKs5YISiuGgmlQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/boards","func":"CreateReply","args":["2","1","1","Hello from Gnoboard!"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"Y4PBTfeWywHIO1QBUDnv6GNHI4DxNQu4FQuafdYevw54YAuV1SGpk5ms+9sDQ/fbeC5kUf2xTv9ffqyCiJslug=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"200000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","test_1","Profile description"]}],"fee":{"gas_wanted":"2000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"dclmhMSfte/U67K40D4KLve7+X/lJU7ERn2DR9lAUlFy44ZIToDiV+JWGIpPymxHDbR/ah1jpKATmuyNbjRLiw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1c74t34ukg2lq39nxx5cddlkvjtfrm3zchnzvk6","amount":"150000000ugnot"}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OOyV3RXHRqkGl/RD1y6qRx5VOw2sah9tOs28WkSdGI0kE6z4mF83BexsRgqTps699T/vIxQV2CiKuUP95N1w5A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1c74t34ukg2lq39nxx5cddlkvjtfrm3zchnzvk6","to_address":"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv","amount":"25000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Axgr3pt7vZpg6YkRffyXKuF4xDtDDhtARw7t4Dc0DQq7"},"signature":"GADODP1QiJVsxBAd7klFZ5/jekZy0dnTE+D9ciruB4U/fD0T4vo0r2NNwR1ecECD3tBMxvT9JKs5YISiuGgmlQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/boards","func":"CreateReply","args":["2","1","1","Hello from Gnoboard!"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"Y4PBTfeWywHIO1QBUDnv6GNHI4DxNQu4FQuafdYevw54YAuV1SGpk5ms+9sDQ/fbeC5kUf2xTv9ffqyCiJslug=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"200000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","test_1","Profile description"]}],"fee":{"gas_wanted":"2000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"dclmhMSfte/U67K40D4KLve7+X/lJU7ERn2DR9lAUlFy44ZIToDiV+JWGIpPymxHDbR/ah1jpKATmuyNbjRLiw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1c74t34ukg2lq39nxx5cddlkvjtfrm3zchnzvk6","amount":"150000000ugnot"}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OOyV3RXHRqkGl/RD1y6qRx5VOw2sah9tOs28WkSdGI0kE6z4mF83BexsRgqTps699T/vIxQV2CiKuUP95N1w5A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1c74t34ukg2lq39nxx5cddlkvjtfrm3zchnzvk6","to_address":"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv","amount":"25000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Axgr3pt7vZpg6YkRffyXKuF4xDtDDhtARw7t4Dc0DQq7"},"signature":"GADODP1QiJVsxBAd7klFZ5/jekZy0dnTE+D9ciruB4U/fD0T4vo0r2NNwR1ecECD3tBMxvT9JKs5YISiuGgmlQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/boards","func":"CreateReply","args":["2","1","1","Hello from Gnoboard!"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"Y4PBTfeWywHIO1QBUDnv6GNHI4DxNQu4FQuafdYevw54YAuV1SGpk5ms+9sDQ/fbeC5kUf2xTv9ffqyCiJslug=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"200000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","test_1","Profile description"]}],"fee":{"gas_wanted":"2000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"dclmhMSfte/U67K40D4KLve7+X/lJU7ERn2DR9lAUlFy44ZIToDiV+JWGIpPymxHDbR/ah1jpKATmuyNbjRLiw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1c74t34ukg2lq39nxx5cddlkvjtfrm3zchnzvk6","amount":"150000000ugnot"}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OOyV3RXHRqkGl/RD1y6qRx5VOw2sah9tOs28WkSdGI0kE6z4mF83BexsRgqTps699T/vIxQV2CiKuUP95N1w5A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1c74t34ukg2lq39nxx5cddlkvjtfrm3zchnzvk6","to_address":"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv","amount":"25000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Axgr3pt7vZpg6YkRffyXKuF4xDtDDhtARw7t4Dc0DQq7"},"signature":"GADODP1QiJVsxBAd7klFZ5/jekZy0dnTE+D9ciruB4U/fD0T4vo0r2NNwR1ecECD3tBMxvT9JKs5YISiuGgmlQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/boards","func":"CreateReply","args":["2","1","1","Hello from Gnoboard!"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"Y4PBTfeWywHIO1QBUDnv6GNHI4DxNQu4FQuafdYevw54YAuV1SGpk5ms+9sDQ/fbeC5kUf2xTv9ffqyCiJslug=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"200000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","test_1","Profile description"]}],"fee":{"gas_wanted":"2000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"dclmhMSfte/U67K40D4KLve7+X/lJU7ERn2DR9lAUlFy44ZIToDiV+JWGIpPymxHDbR/ah1jpKATmuyNbjRLiw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","amount":"150000000ugnot"}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5mW+cH0UubEGHf0BmVDXs6ioozY75fprXolzCT5tAzl75NzfwSEeci9k3vYjBscYwJQ39A9DxB3biLql8pNZbQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["intro","Intro to Gnoland - The Smart Contract Platform to Improve Our Understanding of the World","\n\n_Welcome to Gno.land. This is the official site to learn about the Gnolang (Gno) programming language and the Gno.land smart contract platform, as well as understand the motivations behind Gno and our core values and mission. We’re starting a series of blog posts and holding regular community calls and AMAs so that you can stay up to date with upcoming developments and dive deeper into the Gno World Order. Stay tuned._\n\n## What Is Gno.land?\n\nGno.land (pronounced no-land) is a layer 1 smart contract platform invented by Jae Kwon, co-founder of Cosmos and Tendermint, to address multiple issues in the blockchain space — in particular, the ease of use and intuitiveness of smart contract programming platforms. Beyond offering succinctness, composability, expressivity, and completeness not found in any other smart contract platform, we aim to challenge the regime of information censorship that we find ourselves living in today.\n\nBy using the programming language Gnolang (Gno), an interpreted version of the widely-used Golang (Go) language, using a state-of-the-art VM written in Go, we want to lower the barrier to entry to web3 and make it simple for developers (particularly existing web2 developers) to write smart contracts and other blockchain applications without having to learn a programming language that is limited by design or exclusive to a single blockchain ecosystem.\n\n### Gnolang (Gno) Is Essential to Broader Adoption of Web3\n\nFor web3 to grow in a sustainable way, we need technological solutions that are designed for the blockchain with programming languages that are universally adopted, secure, composable, and complete. The main programming language currently used for creating smart contracts, Solidity, is designed for one purpose only (writing smart contracts) and lacks the completeness of a general-purpose language.\n\nSolidity removes many of the complexities that blockchain programming requires (such as memory management, ensuring that the code is deterministic, and understanding how the entire tech stack is implemented) allowing developers to quickly build succinct smart contracts. However, Solidity is only used for smart contracts on EVM-compatible blockchains (like Ethereum, Polygon, or EVMOS) and its design is limited by the limitations of the EVM. In addition, developers have to learn several languages if they want to understand the whole stack or work across different ecosystems.\n\nGo, on the other hand, is a well-designed complete programming language with its foundation based on composable structures, designed by the creators of Plan 9. This allows developers to rapidly accelerate application development and adopt a modular structure by reusing and reassembling existing modules without building from scratch. They can embed one structure inside another in an intuitive way while preserving localism, and the language specification is simple, successfully balancing practicality and minimalism.\n\nGo is widely used, especially among existing web2 developers. It’s easier to learn and can be used to program almost anything, such as GoEthereum or Tendermint. Every part of the Gno.land stack is written in Go so that one person can understand the entire system just by studying a relatively small code base. The Go language is so well designed that the Gnolang smart contract system will become the new gold standard for smart contract development and other blockchain (and even non-blockchain) applications.\n\n### Security Is a Built-in Feature of Go (Golang)\n\nBeyond object embedding, closures, importing of modules, composability of programs, and interfaces that allow you to implement a specific set of functions, Go supports secure programming through exported/non-exported fields, enabling “least-authority” design. It is easy to create objects and APIs that expose only what should be accessible to callers while hiding what should not be simply by the capitalization of letters, thus allowing a succinct representation of secure logic that can be called by multiple users.\n\nAnother major advantage of Go is that the language comes with an ecosystem of great tooling, like the compiler and third-party tools that statically analyze code. Gno inherits these advantages from Go directly to create a smart contract programming language that is safe and helps developers to write secure code relying on the compiler, parser, and interpreter to give warning alerts for common mistakes.\n\n### How Gnolang (Gno) Differs from Golang (Go)\n\n[![Go and Gno](https://gnolang.github.io/blog/2022-11-21_intro/src/thumbs/go-and-gno.png)](https://gnolang.github.io/blog/2022-11-21_intro/src/go-and-gno.png)\n\n_Image 1: Gnolang - Like Go but specific to the blockchain_\n\nGno is around 99% identical to Go and most people can code in Gno from day one, even minute one. The Gno.land programming environment comes with blockchain-specific standard libraries, but any code that doesn’t use the blockchain-specific logic can run in Go with minimal processing. On the other hand, some libraries that don’t make sense in the blockchain context are not available in the Gno.land programming environment, such as network or operating-system access.\n\nOtherwise, Gno loads and uses many standard libraries that power Go, so most of the parsing of the source code is the same. Under the hood, the Gno code is parsed into an abstract syntax tree (AST) and the AST itself is used in the interpreter, rather than byte code as in many virtual machines such as Java, Python, or WASM. This makes even the Gno VM accessible to any Go programmer. The novel design of the Gno VM interpreter allows Gno to freeze and resume the program by persisting and loading the entire memory state. This allows (smart contract) programs to be succinct, as the programmer doesn’t have to serialize and deserialize objects to persist them into a database (unlike programming applications with the Cosmos SDK).\n\nThe composable nature of Go/Gno allows for type-checked interactions between contracts, making Gno.land safer and more powerful, as well as operationally cheaper and faster. Smart contracts on Gno.land will be light, simple, more focused, and easily interoperable — a network of interconnected contracts rather than siloed monoliths that limit interactions with other contracts.\n\n[![Gnolang code example](https://gnolang.github.io/blog/2022-11-21_intro/src/thumbs/code-example.jpg)](https://gnolang.github.io/blog/2022-11-21_intro/src/code-example.jpg)\n\n_Image 2: Code snippet from the Gno programming language_\n\nToday, Gno.land is the only blockchain instance in the world that supports Gno but tomorrow, there will be many chains with different names such as mydapp.zone, or mydao.xyz. Gno.land is the name of ONE chain and is not a name that will be used by other Gnolang-powered chains. Gno.land will remain a minimal hub with three main utilities:\n\n* Managing cross-Gnolang-chain fees/licenses\n* To be the (or an) official home for the best smart contracts\n* To provide new models of governance (w/ DAO modules)\n\n### Earning Rewards Through Proof-of-Contribution (PoC)\n\nThere are four main ways to earn rewards through PoC on the Gno.land chain:\n\n* Pre-defined tasks (technical or otherwise)\n* Pre-defined bounties\n* Retroactive bounties\n* Vesting-style rewards for core members\n\nBounties rewards (both pre-defined and retroactive) will be decided with “local rules,” through the agreement of the DAO with everything on-chain and transparent. If one human were to abuse the system, it would trigger and the bad actor would be slashed. We’ll go into depth on how you can earn rewards in an upcoming post.\n\n### Durable Solutions to Improve Our Understanding of the World\n\nOne of our inspirations for the Gno.land project is the gospels, which built a system of moral code that lasted for thousands of years. Part of Gno.land’s endurance will be having a minimal production implementation that becomes a reference for other implementations and a basis for education to elevate people's understanding of blockchains.\n\nGno.land aims to appeal to web developers, dApp developers, and blockchain builders to create solutions that help people improve their understanding of the world. With the barrage of misinformation delivered today from various factions, it’s impossible to separate the real from the fake. This causes a state of gridlock. We are living in a regime of information censorship spanning all important topics from climate change to global pandemics — a vast coordinated effort to prevent people from understanding the truth.\n\nBy just browsing Reddit, searching with Google, and scrolling through Facebook, Twitter, or Instagram, people are deliberately being [misled](https://twitter.com/lhfang/status/1587095890983936000) about key global issues that we all deserve clarity on. This is as malevolent as any type of censorship regime in the world — and we need to come together to challenge it and break the wall of censorship to achieve a functional democracy at last.\n\n### Gno.land’s Current Phase of Development\n\nGno.land is currently running in its third testnet and there will be several more testnets before the platform is production ready. Modern civilization wasn’t built in a day, and neither will Gno.land rush into committing to an exact launch date. However, the next development, an incentivized testnet called ‘Game of Realms’, is scheduled for Q1 2023.\n\nGame of Realms will be similar to ‘Game of Stakes’ on the Cosmos Hub and will reward the earliest and best contributors. If you would like to find out more about Game of Realms, Gno.land, Gnolang, or anything else, join us for our first community call with Gno.land Founder, Jae Kwon on November 22nd, at 4pm UTC on our [Discord channel](https://discord.gg/YFtMjWwUN7). We look forward to seeing you.\n","2022-11-21T17:13:00Z","christina,jae,manfred","gnoland,gnosh,gnot,permissionless,consensus,proof-of-contribution,dao,governance,ibc,democracy,freedom"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"8n617qvl9nK+EzdbMHLdHhePFpiseJ0Bnkqmuha4/4VMbct61+WMHWqdh30muMiCmEscjhSiaYGlgud6k4XouA=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["tech-ama1","Gno.land Community Technical AMA #1 - Recap","\n\nYour questions, observations, and feedback are vital to our core development team. Not only do they give us an understanding of the types of applications and features the community would like to see but they help us formulate better ideas for developing Gno.land as we go. Before we dive into our second **Discord AMA on November 22nd @4pm UTC**, check out the community questions from our first technical AMA below answered by core Gno.land devs Jae Kwon and Manfred Touron.\n\n### Why did you choose Golang over Rust?\n\n**Jae**: “With parallelism offered by ICS1 [Interchain Security 1], the bottleneck becomes speed of innovation with safe code, rather than bare metal performance. So here, garbage collection, concurrency, embeddable structures, and clear spec are good primitives for the next-generation smart contract language.\n\nRust (or components of Rust** may be used to implement faster clients for gno.land in the future, but in terms of mindshare, I don't think Rust can flip Go due to its design choices. That's not to say that Rust is any worse than Go; they are different.”\n\n### Will Gno be its own hub? Will Gno provide ICS-like security to its own community?\n\n**Jae**: “Gno.land can be a \"hub,\" like \"git hub\" is a \"hub,\" but that doesn't mean it will offer ICS. If other chains solve ICS1 better, it makes sense for gno.land to be IBC-connected to zones that are not ICS1 replicated/secured with gno.land validators.\n\nIf we consider that validators of gno.land are better as contributors to the gno.land ecosystem (rather than general validator service providers** we may be more comfortable contributing to an awesome ecosystem but not entering the validator-as-a-service business.\n\nIt makes more sense to me that Cosmos Hub validators should own that business, which will eventually require validators to run their own server stacks and have data center infrastructure.”\n\n### How can one become a validator?\n\n**Jae**: “First, one has to become a member. We have not yet defined the full member system, but we will figure that out along the way. For now, we can say that we want first and foremost members who also validate, rather than impartial validators that only validate.”\n\n### How does Gno validate work? PoS? Proof of Contribution?\n\n**Manfred**: “The contributors DAO will elect validators and validators will have the same amount of power. They'll be focused on validating and will receive rewards for that job.”\n\n### What is Proof of Contribution? What kind of contribution will be credited?\n\n**Manfred**: “Proof-of-Contribution is a way to replace Proof-of-Stake with a metric based on the contributions. It's a variation of Proof-of-Authority where the authority is a DAO of contributors. After the 'Game of Realms** competition, we'll reward the best contributors with a tiered membership in the first version of Proof-of-Contributions DAO. The voting power and everything related to staking will be distributed across the contributors.\n\nLater, we'll add more flexibility to the membership with $GNOSH, allowing more accurate and fair rewards. Validators won't receive voting power with staking. The DAO will elect them, and they will all receive the same amount of power. Validators will receive rewards for their technical work, not for the amount of staked tokens they are bound to.”\n\n### Is there a document or resource that describes the key concepts in a Gno smart contract?\n\n**Manfred**: “We have yet to get a single top-level documentation, sorry. You can find documentation in the code, README files, issues, etc. We need to improve this. The community will be able to work on this during Game of Realms.”\n\n### Is there a big-picture diagram of the ecosystem?\n\n**Jae**: cosmos hub \u003c-- \"ec2+DTCC\"\ngno.land \u003c-- \"github for gno\"\n(cosmos hub etc) ICS zones \u003c-- \"holy grail\" scalable smart contracts\nyour chain \u003c-- \"gno inside\"\nyour app \u003c-- \"import gno.land/...\"\nblockchain-based communications/coordination/discourse platform \u003c-- us\n// DTCC: \"https://www.investopedia.com/terms/d/dtcc.asp\" // my point is, be a good reliable token hub with good governance.”\n\n### I'm a developer (PHP, Python**. How can I become a Gno developer? Please advise me on where to start.\n\n**Manfred**: “Start learning Go! One of the long-term goals of Gno is to make writing contracts as easy as writing web2 apps. The language is already strong in that direction, but we still need to catch tooling, documentation, tutorials, and language improvements. You need to have a good level with Golang and be autonomous to start building on Gno.\n\nOne of the Game of Realms tracks will be to work on everything related to onboarding more people. This will be the best place to write specific tutorials to onboard people from other ecosystems or languages.”\n\nWhat are Realms, and what is r board?\n\n**Jae**: “A realm is a Gno package with state, that represents a smart contract with storage and coins. The other Gno packages don't have state, and so are \"pure\" packages that can be imported from other realm or non-realm packages. Like land-tax, realms must be whitelisted or pay storage upkeep for their state. You can create new realms by uploading a new package with the package directory starting with /r/REALM/NAME.\n\n/r/demo/boards is a Gno package that renders a message board. It is a proof of concept message board written in Gno. Since we need to preserve messages, it is a stateful (realm** package. You can see the files of the demo boards, like:\n\nhttps://test3.gno.land/r/demo/boards/board.gno\n\n### How do external packages get imported?\n\n**Manfred**: “Example: when you call your smart contract from Go during testing, how can/should that smart contract load external packages?\n\nA gnolang can only import other gnolang contracts/libraries that were published on-chain. If you want to import an external Golang library, you need to port it to Gno, and publish it as a library, then you can import it from a top-level contract.\n\ngnodev test is an exception, it basically creates an in-memory Gnolang VM, publishes the dependencies (automatically detected**, and executes the test. The tool can act differently from the real on-chain experience. Note that we'll improve the gnodev so it can automatically download on-chain contracts or use custom local paths, to support advanced development workflows.”\n\n### What is a Gnode?\n\n**Jae**: “I don't like the name \"Gnode\" because it's too generic, but the idea is to build Gno-based building blocks for GnoDAOs, as MyGnode embeds components (of owners, treasury, board, etc.** here:\n\nhttps://github.com/gnolang/gno/commit/b9128b1d69f02dbb49be883e0c70fe9d3fc40dcc\n\n**Manfred**: “We can change the name 🙂. A Gnode is a DAO implementation that implements an interface allowing them to interact. A Gnode can have a parent and have children. Top-down interactions may be funding, grants, and approvals. Bottom-up interactions may be reporting or voting. The implementation is flexible. You can have DAOs managing a Gnode, its treasury, and voting the cross-Gnode interactions. You can have Gnodes with an elected leader or one driven by a bot or another blockchain. One of the goals of Game of Realms will be to propose various implementations of Gnodes.\n\nAt the level of Gnoland, we will probably have a top-level Gnoland Gnode managing a global treasury and vision. Then various technical and non-technical child Gnodes manage subsets of the treasury and their tasks. They may also have children. With IBC2, Gnodes could be distributed across different chains.”\n\n### What is the timeline for IBC2?\n\n**Jae**: “After the launch of gno.land, IBC2 is permissionless innovation anyone can try for, so I imagine not long after that. After initial implementations, I bet we will want to tweak/optimize the Merkle tree further, but this can come after IBC2 demos.”\n\n### Can you tell us more about Game of Realms?\n\n**Manfred**: “Game of Realms is a competition to build the first contracts of Gnoland and experiment with proof of contributions. The first step of the competition will be to build the missing tools for the second step. So people will compete to write the DAO that will review the other contributions and allocate points.\n\nThe rest of the competition will be about competing to write the best contracts for well-known categories or make non-technical contributions. At the end, we'll have strong foundations (libraries, rules, tutorials, dApps** to help upcoming builders to start in better conditions. The best contributors will earn rewards and membership in the future DAO of contributors that will co-own the chain.\n\nWe'll have the first version of a Proof-of-Contributions-based DAO of contributors. Focus on one of the official tracks: build a contract suite to compete with Cosmos' governance module to eventually complete Cosmos Hub governance. Realm boards are basic discussion contracts that can be used for discussions, and be extended for governance, launchpad, or other things mixing discussions and DAO actions.”\n\n### Is it possible to build code with gno.land directly online?\n\n**Jae**: “We will make the sandbox staging.gno.land environment easy to access, and that will be preferable to testing on gno.land directly. The gno codebase tries to remain minimal so it shouldn't be difficult to run it locally.”\n\n**Manfred**: “I've seen people writing contracts from VSCode on an online VSCode instance. Someone could create a VSCode template configured to communicate with staging by default with a dummy wallet containing tokens.”\n\n### Is there a plan to be able to use the Gno VM with a Cosmos SDK-based chain?\n\n**Manfred**: “This is one of the plans, yes. And not only on Cosmos SDK. But we don't have a clear plan about how it will happen yet.”\n\n### How about interoperability?\n\n**Jae**: “Regarding interoperability, will it be between Gno chains, with Cosmos, or with more chains outside of Cosmos? If it is with chains outside of Cosmos, which ones, in the short and long term? I think if the latter were to come to pass, the world of web3 and NFT could be awesome. Short run, Cosmos SDK-based chains with IBC1 for code import and cross-chain smart contract calls; but with IBC2/Gno it's really up to the smart contract logic.”\n\n### Are Gno.land tokenomics deflationary?\n\n**Jae**: “There will be $GNOT, and this token will be used for spam prevention fee payment, and it will be deflationary. Previously, we discussed $GNOSH as a secondary token, but we have moved away from the $GNOT/$GNOSH model and will keep $GNOT while making gno.land more about membership among levels of peers.\n\nI think we need an alternative to the Cosmos Hub that is more people-centric than stake-centric, and where alignment is not bought or sold but depends on contributions and value alignment proven over time. The hope is that by moving away from a pure tokenomics perspective and moving into the realm of politics and ethics along with general economics we can curate a different kind of culture.”\n\n### Are there any collaborations with other projects to build on Gno?\n\n**Jae**: “Yes, why don't we make this truly open, in the style of free software, so that we can build upon a common VM design? The only thing I want to retain control over for a temporary duration of time is the regulation of trademarks, like \"gno\", \"gno**\", \"*gno\" (but you can use the license to fork this project however you want); and we want proper attribution, but the AGPL fork license suggests how we can work together collaboratively.\n\nThe GNO VM can be used on any chain if it follows the AGPL style license, which we are calling the \"Gno GPL\". Blockchains can still be composed of components licensed with compatible open source software. We can collaborate indirectly by working and contributing to the same codebase, and know that the code we are building together will always be available for you to use for your chain, as long as it remains and is offered as GNO free software.\n\nSo anyone can build GNO smart contracts into their chain for free, according to the license we are deriving from the GNU (not GNO** AGPL license. You don't have to pay gno.land or anyone if the license is followed. Example: we will collaborate with the Cosmos Hub and Cosmos/ATOM community to offer gno DAOs to be hosted by ICS1, and help bring collaboration tools for Cosmos. So this is how gno works with Cosmos Hub assuming ICS1 is solved. As for gno.land, we can start off with an independent gno instance for the Cosmos Hub's gno shards, and later allow the IBC importing of vetted code from gno.land/*.”\n\n### Apart from Adena, are there any plans for another wallet?\n\nJae: “I think what we need are a few competing base implementations that best leverage the framework they build upon, rather react or minimal vue; and to create common core libraries along the way if reasonable. But there ought to be more than one approach for such a key component, with special care taken into consideration for security. Like, I don't agree with Keplr asking so easily for a 12/24-word mnemonic, even if the implementation is secure, it is going to become a problem. PSA btw.”\n\n### Wen mainnet?\n\n**Jae**: “Some time by Q2 next year would be good. But as policy, we can't commit to a date, because everything has to be ready first before the official launch. Our thesis is that having the DAO with sub-DAOs will allow us to reach the end result in a faster way via some form of parallelism. First, we need DAOs to assess new code, and better UX for managing something like upgrades to the Cosmos Hub. Once we have the DAO running on testx.gno.land, for some x \u003e 4, and we have checked all vital TODOs, we will know that we are ready for \"mainnet.\"\n\n_Do you have more questions for Manfred or Jae? Would you like to know more about Gno.land, Gnolang, Game of Realms, or ways to contribute to our growing ecosystem? Drop us a question on Discord and be sure to join us for our second **AMA on December 6th @4pm UTC.**_\n","2022-12-05T16:15:00Z","manfred,jae","gnoland,gnosh,gnot,permissionless,consensus,proof-of-contribution,dao,governance,ibc,democracy,freedom"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["gor-launch","Game of Realms Is On: Win Rewards for Contributing to Gno.land","\n\nPhase one of Game of Realms, a worldwide competition to build the best Gnolang smart contracts, **is now open**. Game of Realms is a high-stakes contest with a total prize pool of **133,700 ATOM** that will see participants compete for tiered membership to co-own the Gno.land blockchain, the next-generation smart contract platform that uses the Gnolang (Gno) programming language. A series of complex technical and non-technical tasks will challenge contributors to create innovative patterns that push the chain to new limits. If you’re interested in helping build the most intuitive smart contract platform in web3—while gaining rewards for your contribution—join today by opening a [PR here](https://github.com/gnolang/gno).\n\nThe Game of Realms contest will allow participants to get a feel for the Gno.land platform while building smart contracts and applications in the ecosystem. It will take place in two stages, phase one and phase two. Phase one is about building the core infrastructure, tools, and tutorials necessary to open the gates to broader participation and will be held off-chain. Phase two, on the other hand, will take place after the successful completion of phase one and be held on-chain, where contributors will build smart contracts on the platform.\n\nIn addition to the ATOM prize pool, the best contributors will also be awarded (mostly) initial-level membership to govern the upcoming mainnet. Membership will be allocated according to the quality and extensiveness of the contribution—the higher the quality, the higher the tier, and the greater the voting rights and rewards. The top equal members will be composed of peers who have contributed the most to the ecosystem and have an understanding of its core components. Top members will also have aligned core moral values. This is essential so that members can maintain the chain together according to its Constitution (TBD** and ultimately create a sustainable ecosystem that rewards all valuable contributions.\n\n## Game of Realms - Phase One (Off-Chain)\n\nWhile we aim to encourage cross-collaboration between devs and non-techs, phase one of the contest is recommended for advanced developers who are more autonomous and can contribute with limited guidelines and support. Accounting for around one-third of the total **133,700 ATOM** prize pool, getting a headstart in phase one will allow seasoned devs to kick the tires on the Gno.land platform, contribute with limited competition, and build the tools needed to open the second phase.\n\nDuring phase one, participants will open PRs against repos from the Gnolang organization. Phase one contributors will be expected to document and share their work efficiently to enable others to use it without conflicts. Your contribution is vital to the success of the contest, the Gno.land platform, and the Cosmos ecosystem at large, especially now, with discussions to move the Cosmos Hub’s core operations on-chain by establishing a DAO system.\n\nThe first DAO to be created will be the [Decentralists DAO](https://github.com/decentralists/DAO), which will provide Cosmonauts with transparency, accountability, and decentralization. The Decentralists DAO will improve discourse, organization management, development, and conflict resolution through smart contracts, and will organize itself into a set of tightly-aligned sub-DAOs dedicated to specific topics, such as engineering and funding.\n\nSo, how does this relate to Game of Realms and what type of contributions are judges looking for? Here are some examples, in order of priority:\n\n* **Define and Implement an Evaluation DAO:** For the Game of Realms contest, a sub-DAO – the Evaluation DAO – is needed to evaluate contributions during phase two and attribute rewards accordingly. Using a DAO will allow community members to vote on the best contributions for the platform. Implementation of the Evaluation DAO is the only step that must be approved by the core team because of its key role in the competition and the future of the platform. Once the DAO is in place, all previous and further contributions will be reviewed collectively by DAO members.\n\n* **Create Tutorials to Onboard More Participants:** We need experienced devs to write or record tutorials to help more people get started during phase two of the competition (and beyond) and to help grow the Gno.land developer community. These tutorials can include topics like interacting with the chain from the CLI, step-by-step guides to creating smart contracts in Gno, tips for running a local dev environment, fast prototyping with gnodev, or they can be tutorials dedicated to certain audiences, such as developers coming from Solidity or web2. All tutorials should be added to the [awesome-gno GitHub repo](https://github.com/gnolang/awesome-gno).\n\n* **Define and Implement a Governance Contract Suite:** In this challenge, developers will be expected to define and implement a governance contract suite capable of competing with existing chains’ governance modules. If you think you can improve the governance system of Cosmos Hub, this is your chance to show us how!\n\nPhase one challenges will stay open during phase two. No competition points will be attributed during this phase as the points will be retro-funded by the DAO and awarded during phase two.\n\n## Game of Realms - Phase Two (On-Chain)\n\nPhase two of Game of Realms will onboard more people to the platform and begin as soon as sufficient materials are completed from phase one. Accounting for around two-thirds of the total 133,700 ATOM prize pool, phase two will be open to both developers and non-technicals who can follow tutorials, create smart contracts, or provide other important contributions to win rewards and scale the platform. As phase two will be held directly on-chain, contributors can submit their contributions to the DAO without publishing them on the main GitHub repo. However, we strongly encourage you to use GitHub as it’s an important resource that helps the community gain a better understanding through specific examples.\n\n_We are currently preparing the challenges for participants of phase two and are looking for your input. Let us know what type of smart contracts you would like to see (minimal or with multiple features) in our upcoming Game of Realms AMA on Tuesday, January 24 at 4 pm UTC. Note that this is a text based AMA so make sure to add your questions before or during the AMA in the #AMA-questions channel on the [Gno.land discord](https://discord.gg/S8nKUqwkPn).\n_Once we have collected your feedback and requests, we will finalize the challenge categories. You can visit the [Game of Realms repo](https://github.com/gnolang/game-of-realms) for more information._\n","2023-01-18T15:36:00Z","","gnoland,game-of-realms,launch"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["gor-ama1","Gno.land Community Game of Realms AMA #1 - Recap","\n\nWith Game of Realms officially in phase one, core dev Manfred Touron jumped on Discord to answer Gno.land community questions about the ongoing high-stakes competition. From starting and end dates to participation requirements and a description of tasks, look for your answer below. If you have further questions or want to join our community, come and find us on the []Gno.land Discord](https://discord.com/channels/957002220384182312/1065646963825066044). The core team will be hosting regular “office hours” sessions soon so you can discuss your ideas with them directly.\n\n## Q. How are the tasks in the issues assigned?\n\nWe received questions about how the tasks in the Game of Realms issues are assigned. Should submissions contain the whole implementation? Is the following task \"available** when the previous one is completed? How is the “sync” happening?\n\n**A.** TL;DR:\n\nEverything should go smoothly and we will be leaving room for negotiation if any review looks invalid. Once it has been established, the evaluation DAO will enforce how to submit a contribution. In the meantime, there are official communication challenges that we encourage participants to use. People are also free to work in stealth mode, with the risk of finishing too late or losing points for being bad at collaborating.\n\n----\n\nWe expect the current issues to be done by multiple people, in multiple steps. But anyone can try to make everything in stealth mode and open a PR with everything. Let's discuss the cases we believe will happen:\n\n### Case 1\n\nWe're in phase 1, people want to contribute but can't manage to do everything, so they will try to participate as much as they can. They will participate on the issue or in Discord by indicating their desire to participate, by sharing ideas, reviewing others' work, giving feedback, clarifying, or whatever makes sense.\n\nThe only thing is that we're fully remote. We don't know each other, so everyone needs to be good at communication. At the end of a big task, i.e. the Evaluation DAO is finished, the core team will take all the small contributions and identify contributors, and then suggest how to split the task prize. We'll propose the split and allow room for public negotiations.\n\n### Case 2\n\nWe're in phase 2, and a small contribution is done by an individual. We just review it, and that's done.\n\n### Case 3\n\nWe're in phase 2, and a contribution is big and requires small steps. Probably, the Evaluation DAO will ask individual participants to submit their contributions so they can allocate points for the individual contributions. But maybe the Evaluation DAO prefers to review big tasks as a whole, and then split the prize, as we'll do in phase 1. We don’t have clarity on this at this stage, as it will be up to the implementers of the Evaluation DAO to design the best system for that case.\n\n## Q. Will there be a leaderboard and place where we can submit evidence for tasks?\n\n**A.** Not yet. The leaderboard will come in phase 2. One of the critical parts of the Evaluation DAO will be to allow contributors to submit evidence for tasks. Votes and point allocations will also be transparent. This will make sense for future Proof-of-Contributions, too. We'll also develop a leaderboard to make it easier to follow the competition, but this will probably come after the Evaluation DAO is running.\n\n## Q. What will the overall tasks consist of?\n\n**A.** Here is a non-exhaustive list:\n\n* Onboard more contributors ([create tutorials and documentation](https://github.com/gnolang/gno/issues/408)\n* Improve the project and implement more things\n* Bootstrap our genesis of contributors for the future mainnet\n* Experiment with Proof of Contribution by having a simpler system: Evaluation DAO\n* Identify the best participants to propose jobs\n* Identify the best organizations to propose partnerships\n\n## Q. At what point in the Game of Realms timeline/phase are we?\n\n**A.** We are at the beginning of phase 1. We plan to create a website soon so you can keep track of the status and, as I mentioned, a leaderboard will come in phase 2.\n\n## Q. What will be the contributions, how will points be calculated, and are there tasks for non-programmers?\n\n**A.** During phase 1, the tasks are relatively well defined, please read this:\n\nhttps://github.com/gnolang/gno/issues/390\n\nThere are more tasks for programmers, but multiple parts are for non-programmers too.\n\nDuring phase 2, it's hard to be sure about anything yet. Game of Realms is a competition to experiment with Proof-of-Contribution, which will replace Proof-of-Stake on Gno.land. If things go the way we imagine, then consider that the stakeholders (contributors** will allocate points to contributions that make sense for the project. The contributors won't lose points, but by allocating points, they will dilute their own point stack.\n\nWe expect the Evaluation DAO to attribute points to whatever makes sense to make the project better. We'll have some task ideas for phase 2, including for non-programmers. You can likely consider that even if the core team doesn’t control the DAO, its suggestions will be approved by the Evaluation DAO because we deeply want the project to be a success.\n\n## Q. What are the requirements to start participating?\n\n**A.** There is no requirement to start participating. You’ll need to do some KYC at the end of the competition to receive a prize. Feel free to fill out the form linked in the Register section of the following issue:\n\nhttps://github.com/gnolang/gno/issues/390\n\nThis will allow us to contact you about the competition through our newsletter and set up prize payment later. Use the comment section of the issues or discuss them on Discord if you plan to work on specific tasks, so we can see that you’re actively working on a topic. It may be better to work with others and share a prize instead of taking the risk of implementing everything in stealth mode and not being the first.\n\n## Q. Is there a fixed period of time for the end?\n\n**A.** No. Phase 1 will be finished when we consider that enough materials have been implemented to switch to phase 2. This will probably take between 1-3 months. The end date for phase 2 will be announced during phase 2, which will probably last between 2-3 months. This is when we’ll send the prize rewards. After Game of Realms, people will continue to earn contribution points by contributing to the project, which will give them memberships on the future mainnet.\n\n## Q. Is it possible to install a local testnet to get a proper local development environment?\n\n**A.** You can find the answer in this GitHub issue. Subscribe to the issue to get updates:\n\nhttps://github.com/gnolang/gno/issues/478\n\nThere are multiple ways to interact with Gno:\n\n* Using gnodev allows you to use the GnoVM, without a blockchain. This method is super fast and allows you to use development patterns like TDD, where you test your implementation multiple times per minute.\n* Running a localnet, by running the gnoland command and then configuring our tools like gnokey to use localhost:36657\n* Using the staging network hosted on https://staging.gno.land reset regularly and you can use the hardcoded test key or use the faucet\n* Using the official testnets\n\nIf you prefer to run a full blockchain node instead of just playing with GnoVM, you should play with the gnoland binary. This video shows how to do this in practice:\nhttps://www.youtube.com/watch?v=-BlnEXCs0eI\n\nBelow is a further resource that may also help you:\n\nhttps://test2.gno.land/r/boards:testboard/5\n\n## Q. Will there be a list of what needs to be tested? When will the tests start?\n\n**A.** The best place to look is on GitHub here:\n\nhttps://github.com/gnolang/gno/issues/390\n\nDuring phase 1, there are 3 official focuses:\n\n- Evaluation DAO\n- Tutorials\n- Governance Module\n\nThe core team will actively review this and decide what contribution deserves to get prizes.\n\nDuring phase 2, we’ll use the Evaluation DAO developed during phase 1 to review old contributions, even contributions made before the competition, as well as ongoing contributions. Right now, we have an issue gathering interesting topics for phase 2 here, but any contribution can be reviewed by the DAO, including things that are not listed:\n\nhttps://github.com/gnolang/gno/issues/357\n\nThe competition was just announced, but we’ll review contributions made in the past, too, so it starts from the first commit, ~1-2y ago.\n\n_Do you have more questions for Manfred? Would you like to know more about Gno.land, Gnolang, Game of Realms, or ways to contribute to our growing ecosystem? Drop us a question on Discord and watch out for our next AMA on Tuesday 7 Feb at 4 pm UTC._\n","2023-02-03T15:44:00Z","manfred","game-of-realms,gnoland,proof-of-contribution,dao,governance"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["gor-phase1","All You Need to Know About Game of Realms: Phase One","\n\nGame of Realms, the worldwide competition to find the best contributors to Gno.land, is currently underway. Unlike some contests you may have entered, we're doing things a little differently. We want participants to be instrumental in building the Gno.land platform with meaningful contributions that help shape the direction of the project – either by writing the best Gnolang smart contracts or contributing to the core blockchain. It’s not just about winning prizes but becoming a meaningful contributor. We encourage participants to collaborate on the challenges – your contribution will be rewarded on individual merit.\n\n## Phase One: The Basics\n\nPhase one of Game of Realms is about laying the foundations to onboard more people to the platform. You’ll need to be an advanced developer who wants to create core materials that power the platform every day. You should also be willing to document your work and even write tutorials and guides that help us advance to the second phase of the competition.\n\nThere is a total prize pool of 133,700 ATOM available during the Game of Realms competition, one-third of which (44,121 ATOM) will be allocated to contributions from phase one. During phase one, which we expect to last between 1-3 months, participants will open PRs against repos from the Gnolang organization. For additional information on the competition phases and timelines, be sure to check out the following resources:\n\n- [Game of Realms blog post](https://test3.gno.land/r/gnoland/blog:p/gor-launch)\n- [Game of Realms AMA recap](https://test3.gno.land/r/gnoland/blog:p/gor-ama1)\n\n## Phase One: The Challenges\n\n**Evaluation DAO**: To ensure contributions in Game of Realms are rewarded fairly, we need an Evaluation DAO. Allowing community members to vote on the best contributions and decide how much they are worth provides a level playing field for all. We’re therefore seeking your skills in DAO development and implementation. This is one of the most important challenges of phase one and the only challenge that must be approved unilaterally by the core team because of its key role in the competition and the future of the platform. Read more about the [Evaluation DAO challenge on GitHub here](https://github.com/gnolang/gno/issues/407).\n\n**Tutorials \u0026 Documentation**: So that we can progress to phase two and open up the Gno.land platform to a broader audience, we need written and recorded tutorials, guides, and documentation from phase one participants. There are almost no instruction manuals when it comes to this new frontier as the only smart contract platform using the Gnolang programming language. Help us to create materials that will onboard more contributors to Gno.land. Read more about the [Tutorials \u0026 Documentation challenge on GitHub here](https://github.com/gnolang/gno/issues/408).\n\n**Governance Module**: We want Gno.land to adopt the fairest and most effective governance solution possible; one that encourages voter participation and is transparent and accountable. We’re looking for contributors to define and implement a governance contract suite that rivals existing ones, such as the Cosmos Hub, and be implemented by other projects. Can you improve on that? Show us how! Read more about the [Governance Module challenge on GitHub Here](https://github.com/gnolang/gno/issues/409).\n\nAll phase one challenges will stay open during phase two. No competition points will be attributed during this phase as the points will be retro-funded by the Evaluation DAO and awarded during phase two.\n\n## Judging Criteria - What Wins Points?\n\nWhat will the judges be looking for when assessing contributions? You can find individual details on the corresponding GitHub issue regarding each challenge, but to get you started, the Game of Realms contest prioritizes communication and collaboration. We encourage participants to work together to find the best solutions. You will be awarded individually for your contribution but working as part of a team is highly valued. Good documentation that expresses high learning efficiency and shows how the task was completed in an educational way will also win additional points, as will a high standard of quality, great UX, and the ability to follow the contribution guidelines.\n\nAs this is primarily a developer-oriented competition, most of the organization for Game of Realms is happening on GitHub; come by the repo and [visit issue #408](https://github.com/gnolang/gno/issues/408) to contribute to tutorial and documentation writing for Gno.land.\n\n## Rules of Engagement\n\nAll participants must keep in mind a strict code of conduct and specific rules and criteria to ensure fair play. Throughout the Game of Realms competition, no plagiarism will be tolerated at any time. Participants may submit what they wish, however, any project that has already been allocated rewards or received compensation in any other hackathon or similar contest will not receive double pay.\n\nThat’s all for now. If you have more questions about Game of Realms or Gno.land you can join us in our next Office Hours session on Tuesday, March 14, 2023, at 4 pm UTC. You can also connect with other participants in the [Gnoland Discord](https://discord.com/invite/S8nKUqwkPn).\n\n## Game of Realms Phase 1: FAQ\n\nBelow are some frequently asked questions about phase one of the Game of Realms competition. If you can’t find your answer below, jump into our Discord and ask, or join us for a live “Office Hours” session with the core team.\n\n### Q. How are the tasks in the issues assigned?\n\nA. There are official communication challenges that we encourage participants to use.\n\n### Q. Can I work individually or should I work as part of a team?\n\nA. You are free to work in stealth mode, but please keep in mind that you risk finishing too late or losing points for being bad at collaborating. We expect the issues in phase 1 to be done by multiple people, in multiple steps. But anyone can try to make everything in stealth mode and open a PR with everything.\n\n### Q. How can I find collaborators?\n\nA. Participate on the issue or in Discord by indicating your desire to participate, by sharing your ideas, reviewing others' work, giving feedback, clarifying, or whatever makes sense.\n\n### Q. How can I ensure good collaboration?\n\nA. Since we are fully remote, collaborating can be a challenge and the best collaborators will be rewarded. We don't know each other, so having good communication is key.\n\n### Q. How will my collaboration be evaluated?\n\nA. At the end of a big task, i.e. the Evaluation DAO is finished, the core team will take all the small contributions and identify contributors, and then suggest how to split the task prize. We'll propose the split and allow room for public negotiations.\n\n### Q. How much is the prize pool?\n\nA. There is a total prize pool of **133,700 ATOM** available during the Game of Realms competition, one-third of which (**44,121 ATOM**) will be allocated to contributions from phase one.\n\n### Q. When will I receive my rewards for my collaboration?\n\nA. Rewards will be allocated retroactively by the Evaluation DAO during phase 2.\n\n### Q. Will there be a leaderboard and place where we can submit evidence for tasks?\n\nA. Not yet. The leaderboard will come in phase 2.\n\n### Q. What will the overall tasks consist of?\n\nA. Here is a non-exhaustive list:\n\n* Onboard more contributors (create tutorials and documentation)\n* Improve the project and implement more things\n* Bootstrap our genesis of contributors for the future mainnet\n* Experiment with Proof of Contribution by having a simpler system: Evaluation DAO\n* Identify the best participants to propose jobs\n* Identify the best organizations to propose partnerships\n\n### Q. Are there tasks for non-programmers?\n\nA. There are more tasks for programmers, but multiple parts are for non-programmers too. During phase 1, the tasks are relatively well defined, please read this:\n\nhttps://github.com/gnolang/gno/issues/390\nhttps://github.com/gnolang/gno/issues/540\n\n### Q. What are the requirements to start participating?\n\nA. There is no requirement to start participating. You’ll need to do some KYC at the end of the competition to receive a prize. Feel free to fill out the form linked in the Register section of the following issue:\n\nhttps://github.com/gnolang/gno/issues/390\n\nThis will allow us to contact you about the competition through our newsletter and set up prize payment later. Use the comment section of the issues or discuss them on Discord if you plan to work on specific tasks, so we can see that you’re actively working on a topic.\n\n### Q. Is there a fixed period of time for phase 1?\n\nA. No. Phase 1 will be finished when we consider that enough materials have been implemented to switch to phase 2.\n\n### Q. Is it possible to install a local testnet to get a proper local development environment?\n\nA. You can find the answer in this GitHub issue. Subscribe to the issue to get updates:\n\nhttps://github.com/gnolang/gno/issues/478\n\n### Q. Will there be a list of what needs to be tested? When will the tests start?\n\nA. The best place to look is on GitHub here:\n\nhttps://github.com/gnolang/gno/issues/390\n\nDuring phase 1, there are 3 official focuses:\n\n* Evaluation DAO\n* Tutorials\n* Governance Module\n\nThe competition was just announced, but we’ll review contributions made in the past, too, so it starts from the first commit, ~1-2 years ago.\n","2023-03-12T14:02:00Z","","gnoland,game-of-realms,faq"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-1","The More You Gno: Gno.land Monthly Updates","\n\nWe made progress across the board at Gno.land last month, from onboarding more devs to receiving an influx of contributions to the Game of Realms contest. To encourage development and discourse, we set up a biweekly public developer call in addition to our biweekly Office Hours sessions. Anyone can join, ask questions, and give their suggestions on how to shape the Gno.land platform and become a contributor. Last month, we covered several pressing topics from Gno IDE and Gno.land website language, to GnoVM, IBC, and ICS. Jae also came back to the circuit in March with two IRL workshops for devs at side events during EthDenver and Game Developer Conference (GDC) in San Francisco.\n\n## Developer Updates\n\nYou can find the live streams of the new biweekly public developer calls on [Gno.land YouTube](https://www.youtube.com/@_gnoland/videos) as well as access the agendas on [GitHub](https://github.com/gnolang/meetings/blob/main/notes/2023_03_15_dev_call_notes.md). The main talking points this month were Gno IDE, Gno.land website language and UX, garbage collection, bug fixes, and how to bring IBC and ICS to the platform. We are working on all these issues concurrently but the order of release will be Gno.land mainnet, IBC, and then ICS (this is reflected in the DAG below).\n\n[![Gno.land mini DAG](https://gnolang.github.io/blog/2023-04-15_myg-march/src/thumbs/mini-dag.png)](https://gnolang.github.io/blog/2023-04-15_myg-march/src/mini-dag.png)\n\n## Gno.land Website Language\n\nWe want to add more features for developers, such as libraries to make writing interfaces better and more consistent. There is an open topic for frontend developers with typography skills and library developers to create a UI framework for markdown or a custom rendering system.\n\nInternally, our core team is working on improvements to Gno.land’s website, making it easier to navigate with shorter columns while ensuring the text is markdown centric and readable in plain text and the GitHub rendering machine. We hope to achieve this using CSS and having classes for vertical columns, without having to make an extension to the markdown parser.\n\n## Gno IDE\n\nGno.land developer experience team is working on a web-based Gno IDE for quickly building Gno realms and packages right on your browser by just visiting a web app. Gno IDE will provide much improved UX for everything around building a realm (including making the testing easier), and additional features like autocompletion in the editor. Gno IDE will contain all the features you would expect from an IDE as well as valuable APIs for devs building tools around Gno.land with the public Gno Infrastructure.\n\n[![Gno IDE](https://gnolang.github.io/blog/2023-04-15_myg-march/src/thumbs/gno-ide.png)](https://gnolang.github.io/blog/2023-04-15_myg-march/src/gno-ide.png)\n\nGno IDE will have multiple modes to support different use cases. The normal mode will be used during everyday developments (as you’re familiar with from other code editors). The presentation mode is for high accessibility and readability. You can use it during video calls or physical workshops while projecting your screen to an audience. The third and perhaps most interesting mode is the embedded mode. Use this mode to embed the IDE into websites and blogs. This feature is especially useful for tutorials to test out sample code, run it on the real testnets, and play with it.\n\n## IBC and ICS\n\nAs depicted in the DAG above, Gno.land mainnet will launch first, followed by IBC and then ICS. We will focus on implementing IBC1, as we strongly believe in the ICS model and want to be a consumer of an existing Cosmos chain. We want a common ICS implementation that works across many hubs because Gno.land is a type of hub that will need its own ICS to scale while providing GnoVM on consumer chains on the Cosmos Hub. Our next step now is to find the best way to configure ICS for Gno.land and make GnoVM available as a consumer chain in the Cosmos Hub system.\n\nRegarding IBC, we will use the current implementation that was written for the Cosmos SDK and port that over to Tendermint2. We anticipate some issues along the way including security patches that need to be applied to our code base. There are multiple ongoing directions and discussions about how to bridge Gno.land’s smart contracts to IBC, which are essentially Interchain smart contract interactions.\n\nOne possibility is to have an API that submits events to a queue of outgoing events, and another queue to receive and consume events asynchronously. This mechanism could work for IBC2 to have rich inter-contract Interchain features, and the same API could work for Interchain plus smart contract interactions that require advanced options. We discussed a proposal to create a standard for Interchain contracts so that IBC2 could eventually be standardized eliminating limitations by applying it with an EVM, other languages, and CosmWasm.\n\nThis protocol could be based on Protobuf or a similar well-known syntax definition protocol so that we can push the Interchain to the next level. IBC2 will be safe and fast and replace vulnerable atomic bridges between multiple technologies. This is a major update that we are committed to developing and we need help identifying all the challenges involved. Working on IBC integration, separate from the Gno.land mainnet launch, will require significant time to understand how the light client system works. If you’re interested in taking on this task, let us know and we’ll set up a group. IBC will likely be the most important challenge of Game of Realms phase 2.\n\n## Garbage Collection\n\nCurrently, our work on garbage collection does not address the problem in the traditional Golang sense of dealing with memory efficiency. Instead, we are progressively optimizing and improving the main state tree by automating the clean-up of orphan nodes. The next phase will be targeting the official garbage collector component to begin work on memory management as we have some common Golang garbage collection challenges, but are identifying some uncommon ones too.\n\nWe need to consider elements like where to hold our objects because this is tied to releasing them in a concurrent lock-free way. We also need a good data structure. This is ongoing research as of now to implement a dedicated routine to synchronously clean stuff in a non-blocking way.\n\n## Game of Realms\n\nThis month, we have seen a massive uptick in contributions to Game of Realms phase one with a tidal wave of issues, general discussions, and PRs. One of the biggest things we worked on was adding support for MOD, which is a version of Go mod with an easier interface to manage your dependencies and version your dependencies. You can track the ongoing issue on GitHub [here](https://github.com/gnolang/gno/issues/390).\n\nThere have been some really strong contributions to the Evaluation DAO and governance module, as well as a big CLI refactor that went into our code base. We've also seen people contribute contracts like GRC 1155 or general improvements to existing realms, with many suggestions for fixing bugs. Finding bugs and reporting what people want is a good indication that the Gno.land platform is being picked up and gaining adoption.\n\nYou can find the Office Hours recordings that cover Game of Realms on YouTube [here](https://www.youtube.com/watch?v=JTmNg-b6Lcs).\n\n## Developer Events Stateside\n\nGno.land hosted a lively meetup during EthDenver last month where Gno.land founder and core dev Jae Kwon gave a talk for Solidity developers called “Gno.land, the Inevitable Next Generation Smart Contract Platform.\" He compared and contrasted Gno.land and Gnolang to Solidity, and showed Ethereum developers how the GnoVM shifts the smart contract paradigm. You can watch the [recording here](https://www.youtube.com/watch?v=IJ0xel8lr4c).\n\nAlso in March, Jae hosted a gaming workshop at a side event during the infamous Gaming Developer Conference (GDC) in San Francisco. “Gno.land for Game Developers, Building Your App in Web3,\" showed participants a sample gaming app built on the Gno.land platform and offered them the chance to try their hand at writing a smart contract for their app with Gno.\n\n## Virtual Events - How to Build a Forum\n\nCore tech lead at Gno.land Miloš Živković held a virtual workshop for Go devs called “How to Build a Forum.” He showed how Gnolang is a fast and simple way to build and launch smart contracts using the Gnolang interpreter virtual machine that interprets Gno and eliminates the need for any servers or ORNs.\n\nThe VM allows for the memory state of your Gno.land application to persist automatically after every transactional function call, which is a completely new way to handle transaction volume and memory recall. You can watch the [full tutorial here](https://github.com/gnolang/workshops).\n\n*We’d like the community to get involved in Gno.land’s monthly updates, so if you’re building on Gno.land and want to highlight your development, project, event, or idea, let us know and we’ll include your contribution.*\n","2023-04-15T13:37:00Z","christina","gnoland,gnovm,tm2"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-2","The More You Gno: Gno.land Monthly Updates - 2","\n\nOver the past few weeks, our core devs and ecosystem contributors have been making massive strides on Gno.land. There’s a lot to cover in the second edition of *The More You Gno*, from updates on Tendermint2 and GnoVM to stack/frames management, Gno IDE, and plenty more. We’ll also see what some of the external teams contributing to the platform have been up to, including Gno.land’s first decentralized exchange, GnoSwap, and Adena compatibility with GRC20 tokens. Check it out.\n\n## Tendermint2\n\nWe’re making steady development progress on Tendermint2, which focuses on simplicity of design, minimal code, minimal dependencies, modular dependencies, and completeness. For the time being, Tendermint2 will stay in the main repo in a top-level folder named Tendermint2. This is the official location to develop and improve the consensus protocol until it is stable enough to be extracted from the Gno repo and become a standalone project. Currently, Tendermint2 depends on GnoVM, however, we are working to unlink this dependency and build a basic demo Tendermint2 chain and Client.\n\nTendermint2 JS/TS Client is a JavaScript/TypeScript client implementation for Tendermint2-based chains. The client will make it easier for developers to interact with Tendermint2 chains, with a simplified API for account and transaction management, removing a ton of manual work and allowing developers to focus on building their dApps. You can [read more about the client here](https://www.npmjs.com/package/@gnolang/tm2-js-client). In addition to the Tendermint2 JS/TS client, we also created a Gno JS/TS client that just extends the TM2 one to provide Gno-specific functionality. You can read more about this here.\n\n## Game of Realms\n\nThe incentivized competition to find the best contributors to Gno.land continues in phase one, with slow but steady progress being made. Nir1218 initiated an Evaluation DAO Kickoff discussion in [issue 792](https://github.com/gnolang/gno/pull/792) to initiate testing code for the key smart contract infrastructure that will power the Gno.land platform. We are also interviewing architects for the core team with experience in governance modules and creating new economies on-chain, and a new DevRel team member will be joining us soon to create awesome tutorials and documentation to advance Game of Realms further. Gno.land must be built by the community and we will not rush to push Game of Realms to the second phase until we have found quality contributors to complete the challenge tasks and become the platform’s first founding members.\n\n## Gno IDE\n\nOur core development team is working on a web-based IDE for Gno.land that will greatly improve the developer experience, allowing builders to quickly spin up Gno realms and packages right on their browsers just by visiting a web app. Currently named Gno IDE but with a rebranding on the horizon, this intuitive product focuses on ease of use and improved UX, and will include all the features you’d expect from an IDE, such as auto compilation in the editor, debugging, extensive testing capability, and powerful APIs like IntelliJ to supercharge your programming.\n\nGno IDE currently has multiple modes to support different use cases, including a normal mode for everyday programming, similar to a standard code editor, a presentation mode for video calls or screen sharing, and an embedded mode to extend functionality, allowing you to embed the IDE directly into websites and blogs. You can also choose to edit your code in Emacs or Vim and easily switch between steps, from previous to next, making creating your tutorials and blog posts more intuitive. Watch out for more to come on Gno IDE soon, and if you want to contribute by creating a plugin for your favorite editor, open a PR to win contribution points.\n\n## Stack/Frames Management\n\nThe stack/frames is an integral part of the virtual machine (VM) and the language. Stack/frames provide context for smart contract developers, enabling them to access useful information, such as the original caller, or to determine if a contract is being called through another one. The current implementation is limited in scope and relies on fixed positions in the stack which can lead to inconsistencies.\n\nThere is an ongoing [issue 683 open here](https://github.com/gnolang/gno/issues/683) and we have continued to work on enhancing stack/frames development over the last month. We’re adding a new function in the standard library std.PrevRealm (previously GetRealmCaller). Currently, we only have GetOrigCaller, which returns the user calling the first realm. This is not secure and we need a way to call the previous caller. This will allow a realm to handle GRC20 treasuries. See [issue 667](https://github.com/gnolang/gno/pull/667) and [issue 634](https://github.com/gnolang/gno/issues/634) for further details.\n\n## Dealing with Panics in Native Functions\n\nWe have devised a solution for dealing with panics in native functions, [see pull request 732](https://github.com/gnolang/gno/pull/732). Previously, when there was a panic in a native function, we could not recover it in Gno code. An example of this was the assert origin call, which panicked if the call was not a direct call from a transaction. Based on discussions with contributors, we’ve agreed that native functions should never panic, but if they panic, they panic with machined Gno panic. This gives us the choice in a native function to code a Gno panic, or, if it's a very bad panic, use Go panic so that we know the Gno code is unable to recover it.\n\n## Logic Upgrading\n\nMaking it possible to upgrade your logic is definitely out of scope for the first version of Gno.land, however, it’s an important issue that we have begun to discuss so that we can place certain restrictions on it, such as allowing upgrades when we consider them safe enough to be compatible with imports. Another idea is to work on creating workflows where migrations become something official. This way, we could define ways to migrate a contract completely in a single transaction at the chain level. Once everything is working and approved as the previous contract is parsed or archived, the new one gets the data. We will revisit this topic after the first version of Gno.land reaches the mainnet.\n\n## Garbage Collection\n\nIn terms of garbage collection, we don’t have memory leaks as such but we do have defacto memory leaks. By the VM having references to all objects, they won’t be released by Go’s underlying GC. We have some form of reference counting but it is only done at the end of a transaction. We have implemented a mark-and-sweep garbage collector and are working on the VM runtime to manage the objects and signal to the garbage collector to release them when they are no longer needed. This is done by adding the notion of a heap, which is managed by the garbage collector.\n\n## GnoVM\n\nDeveloping GnoVM is an ongoing task and we will likely need to fork the GnoVM to create different competing versions. GnoVM will be complete, limited in features, and serve as the only interpreter, an enduring reference point over time. Future versions of GnoVM will be designed to incorporate CosmWasm so that all Cosmos chains can have CosmWasm enabled and the VM can run directly on the browser and execute tasks on the browser without requiring to make an API call, making it faster. To do this, we can make a Gno compiler in WebAssembly without changing the code because Go supports WASM cross-compilation.\n\nWe plan on making a competing version of the original minimalist GnoVM, such as a Rust version with a JIT compiler using LLVM as a backend.\n\n## Ecosystem Updates\n\nSince our last update, the Gno.land community continues to expand with awesome teams and contributors building cool infrastructure and projects on the platform. Below, we take a look at the largest developments of the past few weeks and extend a special thanks to everyone helping us build Gno.land.\n\n## Teritori\n\nTeritori blockchain and multi-chain hub launched in November 2022, allowing IBC and non-IBC communities to connect, create groups, exchange tokens and NFTs, and launch new projects. Teritori’s idea for building on Gno.land is to create a multi-chain experience for users with a web portal, NFT marketplace, and social feed that will grow the community, and gradually integrate smart contracts and realms. This will promote Gno.land to more developers and showcase all the dApps being built through an easy-to-navigate dApp store. In the coming weeks, Teritori will work with the Onbloc team to integrate the Athena wallet into their portal as well as discuss ideas for promoting Game of Realms to new developers.\n\n## Onbloc\n\nOnbloc is one of the Gno.land ecosystem’s most active contributors, responsible for building the Adena wallet and the block explorer Gnoscan. The team has also been working on creating an official Gno SDK that will allow developers to interact with Gno.land more easily, and remove some of the current friction. Onbloc opened [issue 701](https://github.com/gnolang/gno/issues/701) on GitHub primarily for developers who either have their own web app or are building a JavaScript app and want to work with Gno in some way. Currently, developers need to do a lot of manual work, which Gno SDK will abstract away, improving the workflow and developer experience. If you have any ideas or feedback, please contribute to the aforementioned issue.\n\nIn another cool development, Onbloc has rolled out a new feature in Adena and Gnoscan to provide support for GRC20 tokens. To store and send tokens, you can open your Adena wallet, click on \"Manage Tokens”, navigate to the Custom Token page, and see which GRC20 tokens are available on Gno Testnet 3, searching by the symbol or path. To research on or discover tokens, head over to the Tokens page on Gnoscan for a full list of GRC20 tokens. You can click on any token on the list for detailed information, such as the total supply, owner, or other available functions built into the token. The Account Details page has also been updated to display all tokens owned by each address. You can help by checking out [issue 764](https://github.com/gnolang/gno/pull/764), which discusses adding bigint to support a wide range of numbers and encoding binary, and [issue 816](https://github.com/gnolang/gno/pull/816), which highlights a small bug the team runs into when coding.\n\nOnbloc has also created a new [token resource page on GitHub](http://github.com/onbloc/gnotokenresources) for anyone to share or upload resources associated with their Gno.land project. This will serve as a shared knowledge pool about any dApp on the platform. If you wanted to create a decentralized exchange, for example, you would need all the information about the tokens available on Gno.land, such as their images, symbols, descriptions, links to websites, etc. Now you can find this in one handy GitHub repository. If you’re a developer or builder who wants your logo or any other static data posted, be sure to submit a PR.\n\nAnd speaking of decentralized exchanges, Onbloc is also building Gnoswap, the first DEX to be powered by Gno.land, designed to simplify the concentrated liquidity experience and increase capital efficiency for traders. Its interface is built using TypeScript to be user-friendly, secure, and accessible for streamlining complex mechanisms such as price range configurations and staking as part of its core service. Contribute to its interface [here](https://github.com/gnoswap-labs/gnoswap-interface).\n\nAs for the contract side, Onbloc is actively working on its development with help from the core members of Gno.land. The code will be open-sourced for full transparency once the basic functions are ready.\n\n## New Core Contributors\n\nWe’re excited to welcome two new core team members, Antonio and Zack. Antonio joined us in April in the core team, bringing with him vast experience in IPFS, and writing Git servers in Go. Zack is our first “tinkerer in residence” and will try to bootstrap the ecosystem of small contracts and small libraries. He will also be writing apps and helping us design a system to better share and showcase our work with a super UX for team builders and open-source addicts.\n\nAntonio is already hard at work researching a benchmarking dashboard that will show performance improvements or regressions when we change the code. He’s assessing whether to use GiHub to track actions or run our own machine to execute GitHub actions. Take a peek at his research so far on [issue 783 here](https://github.com/gnolang/gno/pull/783).\n\nZack is working on a microblog project. As an experienced web2 Go programmer, Zack is transitioning to web3. Since he’s interested in incentivized social networks, the microblog project will be his first realm, as a Twitter-style blog without titles, where each user has their own page based on their address. Check out [issue 391](https://github.com/gnolang/gno/pull/391) for more details.\n\n## Developer Events\n\nOver the past few weeks, our core devs have been mainly focused on building but they’re preparing to speak at some exciting events in the coming months. Catch up with Manfred at BUIDL Asia, in Seoul, South Korea, from June 5 - 9. We’re co-hosting a side event with Onbloc, Code States, and Cosmostation on June 5, so be sure to register if you’re in town! We’ll also be at EthBelgrade in Serbia from June 2 - 4, and GopherCon in Berlin from June 26 - 29, so stop by and say hello.\n\n*Do you want to contribute to Gno.land’s monthly updates? If you’re building on Gno.land and want to highlight your development, project, event, or idea, let us know and we’ll include your contribution.*\n","2023-05-26T13:37:00Z","christina","gnoland,gnovm,tm2"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["funding-program","Announcing the Gno.land Funding and Grants Program","\n\nIf you’re interested in building in Gno.land and using the Gnolang (Gno) language to make a meaningful contribution, we’ve launched the Gno.land Funding and Grants Program to support you on your journey. If you’re a developer, tinkerer, researcher, or educator and you’re excited by the idea of creating innovative dApps, tooling, infrastructure, products, or smart contract libraries on Gno.land, now you can apply for funding.\n\n## About the Gnoland Funding and Grants Program\n\nWe’re building Gno.land to endure with timeless code that will serve as a reference point for many years to come. Secured by a novel consensus mechanism, Proof of Contribution, Gno.land rewards contributors fairly, addressing one of the blockchain industry’s biggest problems. The developers that are most active on the platform with the highest quality contributions will secure the most rewards. We already have a growing community of Gnomes innovating and building on Gno.land and we’re looking to add more contributors to extend the usability of the platform and its smart contract library.\n\nOur grants program will encourage further participation by allocating financial awards and contributions to individuals and teams who want to build dApps, core infrastructure, products, or features on Gno.land, incentivizing more like-minded Gnomes to test the Proof of Contribution mechanism and push the chain to new limits. The grant amount and duration will depend on the scope and ambition of the project as well as the work involved.\n\n## Types of Contributors\n\nThe Gno.land Funding and Grants program is divided into four different categories – tinkerer, builder, researcher, and educator – to ensure that we cater to a diverse range of people and working preferences. Here’s how we define these categories:\n\n- Tinkerer: You want to experiment and invent\n - Build dApps, improve features, and find and develop new ideas\n- Builder: You have an idea and are ready to build it\n - Build dApps, infrastructure, tooling, products, or port your existing apps to Gno\n- Researcher: You want to discover and analyze\n - Deep dive into topics linked to the Gno.land universe\n\n## What We Are Looking For\n\nTo qualify for a Gno.land grant, we’re looking for motivated and passionate people who can contribute by developing dApps, core infrastructure, useful and innovative products, or features that improve the usability of the Gno.land chain, specifically:\n\n- Decentralized Applications (dApps)\n - What types of dApps do you want to see on Gno.land? Show us.\n - Build, test, and launch a suite of Gno.land dApps for the community, focusing on diverse use cases and industries such as DeFi, gaming, supply chain management, and social media. Ensure that these apps cater to both individual users and businesses\n - These dApps should integrate seamlessly with existing Gno.land infrastructure, encourage user interaction, and promote the adoption of Gno.land services\n- Infrastructure, DevX, Quality\n - Develop comprehensive GitHub and AWS integration for Gno.land, including streamlined deployment processes, continuous integration and delivery pipelines, and monitoring tools\n - Create Helm charts for easy deployment and management of Gno clusters, enabling users to quickly set up and scale their Gno infrastructure\n - Design and implement an event system for Gno.land contracts, allowing for real-time monitoring, analysis, and auditing of contract-related events\n - Enhance Gno.land security by conducting regular vulnerability assessments, penetration testing, and implementing best practices for secure smart contract development\n- Products\n - Develop advanced project management software tailored to the needs of Gno.land developers and teams, with features such as task tracking, collaboration tools, and integrated Gno.land services\n - Create comprehensive documentation, including guides, tutorials, and API references, to help users understand and utilize Gno.land's features and services more effectively\n - Design a censorship-resistant smart contract system, enabling secure and transparent transactions and interactions on the Gno.land platform, free from external interference\n- Interoperability \u0026 Integration\n - Implement cross-chain compatibility and interoperability, allowing Gno.land to connect and interact with other blockchain networks, expanding its potential user base and increasing its overall reach\n - Develop a powerful integrated development environment (IDE) specifically for Gno.land developers, with features like code completion, debugging tools, and seamless integration with Gno.land services\n - Design and launch a user-friendly wallet for Gno tokens, featuring a secure and intuitive interface, support for multiple devices, and easy integration with Gno.land dApps\n\nThe above guidelines are by no means exhaustive and are intended to spark your imagination and give examples of the types of contributions we’re looking for in Gno.land. We’re open-minded and willing to assess all grant proposals, so if you have an idea that’s not on the list or a suggestion that you think will benefit our vibrant community, let us know. If your submission doesn’t qualify for a grant, we’ll do our best to provide you with open and honest feedback and points for improvement, as well as identify any opportunities to get involved in our ongoing incentivized Game of Realms competition.\n\n## Meet Our First Grantees\n\n### Onbloc\n\nOnbloc is a blockchain software company building core infrastructure for Gno.land and\n\nhelping other dApp developers onboard to the Gno.land ecosystem seamlessly. The team has developed the Gno.land Developer Portal, which provides comprehensive introductory docs for developers, the Adena web3 wallet for Gno.land, and the Gnoscan block explorer. As Gno.land’s most active contributor, Onbloc is leading many community-driven initiatives and we’re excited to extend a grant to this passionate South Korea-based development team to continue their incredible work developing the wallet further, iterating the Gnoscan block explorer, and building Gno.land’s first DEX, Gnoswap.\n\nIn addition to this, we want to encourage Onbloc to continue their amazing work with the community, contributing to meetings, replying to comments on our social platforms, writing code base, organizing local events and meet-ups in South Korea, and creating products that expand the Gno.land ecosystem.\n\n*“Onbloc is thrilled to be a part of the Gno.land Grants Program. As one of the earliest contributors, our endeavors have involved releasing technical guides and research reports, developing infrastructure tools for dApps, creating DeFi smart contracts, and more. We are excited to leverage this grant to further enhance the quality of our products and strengthen our workforce. The grant will enable us to cover some of the existing expenses and hire additional developers to focus on smart contracts and the core side of GnoVM. We expect these endeavors to push the Gno.land blockchain to new limits and accelerate the achievement of the milestones on our roadmap. With the support from the Gnoland team, we are confident in our ability to make significant strides and further contributions to foster the growth of the Gnoland ecosystem.”*\n\n*Dongwon Shin, CEO, Onbloc*\n\n### Teritori\n\nTeritori is a super-dApp project allowing individuals and organizations to interact, organize, and communicate in a radically resilient and decentralized way. Based on an interoperable vision, the application is built on a multi-chain experience approach, gradually integrating Gnolang as the fundamental technical brick of the system. Currently in Beta ([available here](https://app.teritori.com/)), the app is making modular tools and dApps available to users, with a single gamified user experience. Teritori's philosophy is to offer users and developers a place that belongs to them, their territory, with an emphasis on interoperability, modularity, and customization.\n\nUsers can interact with a social network, NFT marketplace, DAO launcher, service marketplace, games, etc., and integrate a plethora of dApps thanks to the dApp store, where Teritori will promote all Gno.land dApps to encourage the growth of the ecosystem. Using the Gno.land grant, Teritori will continue this amazing work and develop a moderation DAO to provide content moderation to Gno.land in a healthy and decentralized way, a challenge that faces the entire web3 industry. By 2024, the UX of Teritori v1 will be based on decentralized messaging without blockchain, allowing users to converse in a \"natural\" way while adding modules and web3 features. Creating and managing a GnoDAO could be as easy as managing a WhatsApp group.\n\n*“At Teritori, we want to make decentralized organizations accessible to all and experiment with new governance models for humans, social groups, businesses, and diverse organizations. Gno.land enables us to build this vision in a modular, future-proof, and censorship-resistant way. Thanks to the Grants Program, we'll be able to accelerate our development, continue to contribute proactively and build user experiences that enable as many people as possible to discover the Gnol.and ecosystem. We're starting work developing a DAO launcher, with different standard templates for DAOs, in particular, DAOs enabling moderation within news feeds, forums, or social networks. This will rapidly open many doors, such as those of conflict resolution DAOs, on-service marketplaces, or project management software. Gnol.and is a playground where anything is possible! We'll be documenting [our journey here](https://github.com/gnolang/hackerspace/issues/7#issuecomment-1588197187), and sharing our progress as we stay connected to the needs of the community.”*\n\n*Zooma, Core Lead, Teritori*\n\n### Zack\n\nZack is the first tinkerer-in-residence at Gno.land. With a deep-rooted passion for innovation, he embraced Go early on in 2013 and ever since, has been harnessing its power to craft peer-to-peer programs and develop web2 applications. While Gno.land marks Zack's initial foray into web3 development and blockchain dApps, the Gnolang language allowed him to effortlessly apply his Golang expertise. This has enabled him to flourish within an ecosystem that revolves around decentralized systems, seamlessly transitioning his skill set to create unique decentralized solutions.\n\n*“I have always been curious about web3 and blockchain technologies but have not developed expertise in smart contract languages and struggled to keep up with the fast-changing ecosystem around blockchain technologies. As an avid Go programmer, Gno and Gno.land created the opportunity for me to develop decentralized applications on blockchains by providing a framework and ecosystem that is consistent with Golang in terms of syntax, sustainability, and stability. The additional web3 features in Gno and Gno.land provide huge potential for interesting applications that I hope to unlock to move beyond web2 and harness blockchain technology for novel use cases. The grant provided for tinkerer-in-residence was the key to giving me the resources to move through this ecosystem as I try to think outside the box for what web3 can be and what blockchain can do for a web2 developer like myself.”*\n\n*Zack Scholl, tinkerer-in-residence*\n\n**How You Can Apply**\n\nActions speak louder than words. Until Gno.land is completely on-chain, the best place to start is by contributing to PRs and issues on the Gno.land repos or participating in the Game of Realms competition. If you want to apply for a grant, you’ll need to fork the Gno.land Ecosystem Fund repo and outline your proposal in your project name’s file. Once we receive your application, our team will review it and get in touch if we believe that you fit the criteria. [See GitHub for full instructions](https://github.com/gnolang/ecosystem-fund-grants). Stay tuned, we’ll be hosting a Funding and Grants Program Q\u0026A in the next few weeks!\n","2023-06-27T13:37:00Z","christina,michelle","gnoland,funding,grants"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-3","The More You Gno: Gno.land Monthly Updates - 3","\n\nWe’ve been busy since the last edition of *The More You Gno,* with the Gno.land core team and ecosystem partners present at various global developer events. We’ve visited many gnomes (and gnomes-in-the-making) around the world from Berlin to Belgrade, spreading the word about Gno.land and growing our expanding community. Aside from all the networking, Gno.land is taking shape with a new iteration of our website, the Gno.land Funding and Grants Program, and a host of developer updates as always. Let’s dive in.\n\n## Gno by Example\n\nWe recently launched [Gno by Example](https://gno-by-example.com/), our equivalent to both [Solidity by Example](https://solidity-by-example.org/) and [Go by Example](https://gobyexample.com/), where you can see tutorials and code snippets to help you learn and get more easily onboarded to Gno.land. Gno by Example is designed to be community-run with a front-end app and tutorials in markdown. There’s also a specific markdown syntax where you can embed certain file fragments to make your tutorials more structured. We’d love to build this into the ultimate resource center for Gno.land, so feel free to [contribute](https://github.com/gnolang/gno-by-example) with new tutorials and sections. Contributions here are eligible for rewards from the Game of Realms competition.\n\n## GnoVM\n\nWe continue developing GnoVM and invite you to provide feedback on what can be improved. This month, there have been a lot of discussions about how to improve native bindings and use the Gno machine in native function calls. Native function calls are well-defined in Go code generation and Go templates but need some modifications for GnoVM. For example, since new native functions already exist in the Gno code, when we try to define a native function, calling the function doesn’t yield the desired result. We’ve created a bunch of panics and tried writing out native functions to see what goes on for them, in an investigation that will go on for the next few weeks. Got any ideas? Please contribute. ([PR 859](https://github.com/gnolang/gno/pull/859)).\n\n## Testnets\n\nTalk about testnets has come up a lot in recent weeks and how to best proceed. Some gnomes are asking for a multi-node testnet to allow for great experimentation, whereas others prefer to keep the testnet single-node. There are advantages and disadvantages to both approaches and we are still listening to feedback and ideas. However, we will likely keep testnet 3 single-node and focus on the language while having a second dedicated multi-node testnet where devs can get creative, think outside of the box, test performance, consensus, and everything they need to push the chain to its limits. We’ve created a new [Hackerspace](https://github.com/gnolang/hackerspace) Repository for the multi-node testnet to prevent spam on the main repo, so please use it to share your scripts, posts, snippets, etc.\n\n## Native Coins and GRC-20 Tokens\n\nWe uncovered some significant issues with the banker module ([PR 393](https://github.com/gnolang/gno/pull/393)) regarding minting and burning tokens with the package minter. It was not scoping, filtering, or minting tokens correctly, making it possible to mint and burn unlimited tokens, including GNOT. We want to allow any realm to create its own token and run multiple tokens on their chains, but we need a prefix for security to resolve the issue and allow anyone to create GRC20 smart-contract-based coins but not native coins. We continue to work with small fixes on this issue and will reopen the PR soon.\n\n## Gno.land Funding and Grants Program\n\nLast month we released our Funding and Grants Program to encourage more developers, researchers, educators, and tinkerers to interact with Gno.land. If you’re interested in experimenting with Gnolang (Gno) and building innovative dApps, tooling, products, or infrastructure, check out our GitHub [Funding and Grants](https://github.com/gnolang/ecosystem-fund-grants) page for further information on how you can apply. Start contributing to Gno.land or Game of Realms as this is a prerequisite of the funding and grant application process.\n\n## Developer Relations\n\nThe Gno core team is growing! We hired a new DevRel last month and are looking to take on another dev for this open position, so if you’re interested, head over to our [careers page](https://jobs.lever.co/allinbits) and apply! You can expect to see a lot more documentation, FAQs, tutorials, and onboarding materials in the coming weeks and months.\n\n## Ecosystem Updates\n\nOur community of gnomes continues to expand, making tons of activity and progress over the past few weeks. Let’s see what they’ve been up to below.\n\n## Onbloc\n\nOnbloc has been super active this month attending and co-hosting IRL events and networking to find new gnomes about town. Among other updates, Onbloc has completed the first integration of Tendermint2 JS with the Adena wallet and will continue to swap out their existing libraries with TM2JS wherever applicable to ensure that they are as tightly integrated as possible. The team has also open-sourced the Gnoscan block explorer, so if you’re interested in contributing, hop on over to [Gnoscan](https://gnoscan.io/) or the [GitHub repo](https://github.com/onbloc/gnoscan).\n\n## Teritori\n\nAnother of our first cohorts from the Grants program, Teritori continues to churn out awesome work and expand its growing team. This month, Teritori has been busy integrating Adena with the Teritori app and working on the DAO contract to build a DAO deployer and various DAO standards and templates for DAO creation. Teritori’s target is to focus on a moderation DAO that can be used for content moderation in social feeds and boards. In the coming weeks, the team plans to integrate the DAO contract into the UI to allow the community to launch a DAO and experiment on the testnet. They have also made an effort to really integrate Gno users by adding .gno at the end of nicknames for people to use. All our grant recipients are documenting their journeys in the hackerspace repo, check out [Teritori’s](https://github.com/gnolang/hackerspace/issues/7) journey.\n\n## Resident Tinkerer, Zack\n\nAnother grant receiver, Zack, has been making significant progress on his microblogging project. You can check out the specs on GitHub ([PR 791](https://github.com/gnolang/gno/pull/791)) or watch the informative tutorial video, [Go to Gno: How to Build a Microblog](https://www.youtube.com/watch?v=F-_dadxcRJM). You’ll find this especially useful if you have a background in Go and need some additional insights to turn your hand to blockchain coding. Zack has also been working on an implementation of a smart contract for creating and transferring text-based NFTs that conform to haiku poetry standards (find out more on GitHub ([PR 860](https://github.com/gnolang/gno/pull/860)). Other than that, Zack continues his Gnolang journey, “learning and having a lot of fun.”\n\n## EthSeoul, BUIDL Asia, and Getting to Gno\n\nJune saw members of our core team heading over to Seoul, South Korea, for a week of networking, talks, and events. Our VP of Engineering Manfred Touron gave a keynote on the evolution of smart contracts and an introduction to Gno.land for participants of EthSeoul, followed by a fascinating dive into Proof of Contribution at BUIDL Asia, where we also had a booth. It was an honor to meet so many talented and motivated Korean developers and contributors from around the globe. Seoul is a hotbed of up-and-coming talent and we’ll definitely be back soon.\n\nWe also had the chance to meet with our most active ecosystem contributors Onbloc and co-hosted an event together, Getting to Gno, at the Code States developer academy along with long-time Cosmos builders, Cosmostation. Attendees had the chance to hear about what the core team is building and see some of the great work of our community. A massive thanks to everyone involved, it’s awesome to be BUIDLing together! Read more about our Korean adventures in this [fab write-up by Onbloc](https://medium.com/onbloc/2023-buidl-asia-recap-894c60a1c0f).\n\nEthSeoul - [Watch the talk here](https://www.youtube.com/watch?v=_iSsStlmxoU)\n\nBUIDL Asia - [Watch the talk here](https://www.youtube.com/watch?v=v6k3NHm5vcE)\n\n## EthBelgrade\n\nCore contributor Milos Zivkovic rocked the Gno.land presence at EthBelgrade in Serbia, giving an introductory workshop about Gno.land, called 'Alice in Gno.land'. Being the first Ethereum conference organized in Serbia, there were lots of attendees from all over the Balkans. Participants joined in a journey through the enchanting realm of Gnolang and the Gno.land platform. Most of the participants were not aware of Goland before but were avid Gophers eager to learn more about the application of the Gno language in blockchains.\n\n## GopherCon Berlin\n\nThe Gno.land team also had a blast last month at the European edition of GopherCon in Berlin. We had a booth at the event for two days, where we networked, talked about all things Gno, made some amazing connections, and even shared some live code! We’re looking to build an active, open-source Gopher contributor group in Gno.land, so stay tuned for more on that soon.\n\nComing up later this month, Gno.land is an official sponsor of EthCC, Paris, July 17-20. Stop by our booth to pick up some swag, say hey, and ask your questions about Gno.land. You can also catch us at the Nebular Summit for a keynote and workshop by our VP of Engineering, Manfred Touron.\n\n*Do you want to contribute to Gno.land’s monthly updates? If you’re building on Gno.land and want to highlight your development, project, event, or idea, let us know and we’ll include your contribution.*\n","2023-07-11T13:37:00Z","christina","gnoland,gnovm,tm2"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-4","The More You Gno: Gno.land Monthly Updates - 4","\n\nWe’ve had more on our plates than ever over the last few weeks, with a huge team presence in Paris at EthCC and Nebular Summit in July, an opening talk at Stanford Blockchain Club in August by Gno.land’s founder Jae Kwon, and some awesome contributions from Gno.land grantees and ecosystem partners, including the first demos of Gnoswap and Teritori’s social platform and DAO deployer. We continue to make solid progress on GnoVM, an alternative VM in Rust, Tendermint2, native bindings, and much more. Check out our latest developer updates below.\n\n## Upgrade Strategy for AVL Between GitHub and test3.gno.land\n\nOne ongoing discussion is about an incompatibility bug that affects many things we do on Gno.land. The current AVL implementation on the testnet is outdated and does not match the AVL implementation users get when they pull in the latest master branch. Therefore, building and deploying contracts on a local Gno chain (with the latest master changes) and deploying those same contracts on the testnet may fail due to this incompatibility. We need to find a way to seamlessly integrate these two approaches. Ideally, when you write code on the master branch on GitHub, it should work on the testnet as well.\n\nIn [issue 970](https://github.com/gnolang/gno/issues/970), you can find details of five different proposed solutions to implement this upgrade strategy, from resetting the whole blockchain (which would mean losing on-chain content and debugging information) to implementing a migration feature specifically for testnets that allows developers to rename packages and patch their contracts before publishing them. There are pros and cons to each proposal, and we continue to work together to find the best way forward.\n\n## Encoding JSON and the Discussion Around Reflection\n\nSome contributors have highlighted the need for native JSON encoding, and we are discussing how best to approach it. See [issue 808](https://github.com/gnolang/gno/issues/808) for further details. One idea is to copy the code from encoding JSON in the standard library Go and take it over to Gno, but we would need to have reflection to do that. So, the important question here is whether we want to have reflection and, if so, what it should look like. We could emulate Go’s reflection package with some added elements, like being able to inspect the realm state, but we would need to be extremely careful about how we do this.\n\nFor example, should users be able to read private fields of external packages through reflection or even *ufmt*, or could that introduce a problem? It would be simpler, and the language capability security would be tighter and easier to understand if we made accessing private fields impossible, but that would also make it limited. We could consider supporting reflection as an internal user package and whitelisting and encoding JSON. This way, new encoding packages would have to be whitelisted because they’re using the reflection package. We could also mark reflection as unsafe so developers know they must carefully audit their work.\n\nAnother solution is the partial implementation of reflection. In [issue 971](https://github.com/gnolang/gno/issues/971), Gno.land core engineer Petar discusses introspection, which involves implementing reflection as Go has it now but enabling only one of its two main capabilities: the ability to inspect types, but not the ability to modify code. The main difference between introspection and reflection is that, since it is done at compile time, it is completely type-safe. This discussion is ongoing.\n\n## Alternative GnoVM Implementations\n\nTo deliver the best possible virtual machine, we’re working on two different implementations of GnoVM. Petar has spent the last three weeks developing a new GnoVM implementation written in Rust. His work is still private as the machine is not yet ready for public use, but he will soon make the code public for your inspection. Rust gives the ability to write more performant code and, in some scenarios, the Rust GnoVM can run up to 20 times faster than the GnoVM at roughly 87 milliseconds compared to 2,000 milliseconds on a Fibonacci benchmark, which is a considerable improvement in speed.\n\nSince one of Gno.land’s core features is that the entire tech stack is written in Go, we’re unsure if everyone will appreciate a Rust GnoVM or whether it aligns with our vision. However, it’s always good to provide alternatives, and, Petar argues, as long as the VM carries out the same functions (and does so more cheaply), most developers won’t mind what language the VM is written in.\n\nRust has a few other features that some developers may favor over Go, such as more tools for creating languages, advanced garbage collector libraries that allow you to change the algorithm without changing the runtime (by swapping out a tricolor algorithm for a generational one, for example), and built-in data structures that solve many issues. For example, we needed a deterministic map that is fairly fast. With Rust’s Btree in the standard library, this was simple, Petar only had to implement the native Go map type with a Btree map from the standard library. This took just a few minutes.\n\nCore team dev Marc has also started an initiative to improve the Go GnoVM so that it is faster and offers a clean and user-friendly interface. He believes the debate over the VM is more about whether to have a VM that is bytecode-defined or AST-defined (rather than speed). Marc has been comparing the fundamental differences between the two and noted that the bytecode version is 15 times faster than the AST. This means that changing to Rust would give an increased performance of 2-3 times.\n\nThe VM must be fast, secure, and performant in many ways. In either version, the AST will be stored on the blockchain, whereas the bytecode is only an internal representation that doesn't affect the users. We must still consider any potential architecture consequences between bytecode and AST before deciding whether to change. Marc’s WIP code is still in a private repo, but you’ll be able to inspect it soon and make a comparison of the VM implementations in the coming weeks. The decision about the direction of GnoVM is still very much TBD; however, the Rust GnoVM will not replace the Go GnoVM but will complement it, eventually giving validators the choice of which to run.\n\n## Defining Wording for People/Documentation and Consistency\n\n[Issue 1024](https://github.com/gnolang/gno/issues/1024) discusses the need to define the wording we use throughout our documentation, for example, how we name a module, package, sub-module, etc. Once we have the wording defined, we will set the GnoVM to only accept elements with the correct naming. The importance of wording affects the design choice of the whole project and how we go about versioning for the best possible user experience.\n\nFor example, is mt/board/admin part of the same realm of mt boards, or is it its own realm? Can we work with both by adding patterns to have some realms responsible for hosting data and others responsible for having more privileged actions? How do we split a complex realm into sub-libraries and sub-realms? We want to define the documentation and the logic for this and have begun to touch on this issue. We will discuss this in greater depth in the upcoming developer calls.\n\n## Improving the GRC20/Foo20 APIs\n\nWhen working on the specs for a Merkle airdrop contract, Albert came against some issues with users initiating airdrop reward claims (see [PR 906](https://github.com/gnolang/gno/pull/906) for more details). Currently, when the Merkle airdrop contract tries to execute the reward claim for the user, an instance of the GRC20 contract is used for transferring. Within the GRC20 implementation Transfer() method, the caller (token sender) is fetched using the standard library method std.PrevRealm().\n\nHowever, calling this method in the Merkle airdrop context returns the user as the caller, not the Merkle airdrop contract, which is an unexpected functionality. We are discussing different ways to tackle this issue efficiently. However, each solution would require possible changes to the GRC20 API and subsequent token implementations. Additionally, as part of [PR 952](https://github.com/gnolang/gno/pull/952), we are looking into improving the standard GRC20 API and possibly resolving the ambiguity with standard library calls that are causing the mentioned issues.\n\n## Client Optimized for CLI, Not Mobile\n\nOur newest contributor to Gno.land, Berty, is developing the mobile version of Gno, which means writing a mobile app to interact directly with the blockchain. The team is facing some issues as they need a client library with utility functions like sign and broadcast, which are used by the command line. This code (tm2/pkg/crypto/keys/client) is not ready for external users yet, and the Gno client is designed for CLI. However, Berty needs a way to interact with the Gno chain from their application and to call the logic without adding the full CLI.\n\nFrom the existing TypeScript/JavaScript client library (gno-js-client and tm2-js-client), Berty should be able to build out a Go client library by exclusively using the RPC endpoints of the node itself (just like gno-js and tm2-js work), and not having to worry about importing private logic like transaction broadcasting. The team is writing its own framework to call Go code for Gno from Java, Swift, and React Native mobile apps that creates a transaction and sends it (see [PR 1047](https://github.com/gnolang/gno/pull/1047)).\n\nThey are working on an API that interacts with the blockchain and lets them export the code without having to write their own utilities. The API will be minimal, and update the Tendermint2 build script by moving tm2txsync from tm2/cmd to gno.land/cmd (see more details in [PR 1080](https://github.com/gnolang/gno/pull/1080) here). For the time being, Berty will copy the code and use the objects directly until a more convenient API is complete.\n\n## Tendermint2 Development\n\nIn [PR 546](https://github.com/gnolang/gno/pull/546), we introduce file-based transaction indexing. Transaction index parsing should be done as a separate process from the main node, meaning other services can be instantiated to index transactions as readers. The current problem is that there is no way to figure out whether a transaction has failed after it’s been sent out with a broadcast sync, or fetch any kind of receipt information or error reason in the delivered transaction.\n\nSo, we’ve started working on an event indexer to index Gno node events, which include transactions. Soon, developers and users will be able to ask the event indexer what happened to the transaction or in which state in its execution it's currently at, and also to retrieve information on other events like block commits as they happen.\n\n## Extending the Functionality of Go\n\nIn [issue 919](https://github.com/gnolang/gno/issues/919), Petar proposes extending the functionality of Go by adding constant data structures, arrays, slices, etc. He believes this would benefit users, as they wouldn’t need to create special functions as in Go to simulate this behavior, and it would also catch bugs when there is mutation. There has been a discussion, and Jae has similar ideas with the notion of “invar” expressions, where the resulting value can only be read, not mutated or stored. This would fix the bug where if you pass a pointer (that represents part of your contract state) to another contract, the other party can “steal” it by assigning it to their state, and your contract would fail to execute.\n\nMorgan believes that we should take a different approach as slices have the semantic in Go, where the underlying array is always heap-allocated and modifiable. Introducing constant slices would thus necessarily have to introduce concepts regarding im/mutability of values without the matching constructs that a language like Rust has. To make a compromise and keep compatibility with the Go spec, we are likely to implement this in a transpiler (gnoffeescript) that would implement this feature and be able to transpile to valid Go.\n\n## Grantee and Ecosystem Updates\n\nAs you can see, we’ve made a ton of development progress over the last few weeks. We’re also steadily adding more gnomes to our community of builders, and they’re working on the core infrastructure of Gno.land, as well as the permissionless dApps the platform will house. Let’s see what they’ve been up to since the last update.\n\n## Onbloc\n\nOnbloc has been busy, as always, with a slew of updates for us over the last few weeks. The team has been developing Gnoswap, the first Gno.land automated market maker with concentrated liquidity, and they gave us a live demo. On the front end, which is still a work in progress, you can find a one-stop venue for traders to view all the information about tokens on gno.land, so you don’t have to move between Gnoswap and a token aggregator like CoinGecko. You can also see incentivized pools sorted by liquidity, volume, APR, liquidity mining rewards, etc., and a wallet page to check your balances. You will also be able to deposit or withdraw assets from the Interchain when IBC is enabled.\n\nCheck out the work they’ve done so far on the Onbloc [hackerspace](https://github.com/gnolang/hackerspace/issues/29). The team has also released [the documentation](https://docs.gnoswap.io/) about what you can expect from Gnoswap, the rationale behind their design choices, some information about tokenomics, a preview of the UI, and more. Their main focus is on delivering a smooth and welcoming user experience and abstracting away the difficult mechanisms of concentrated liquidity so that the interface is as minimal and simple as possible.\n\nThe team will be ready to launch Gnoswap as soon as gno.land reaches mainnet. Feature updates and enhancements will be aligned with the development of the core Gno Stack.  The code for Gnoswap has now been [open-sourced](https://github.com/gnoswap-labs), so you can take a look at everything they’ve done and even make suggestions. In the coming weeks, Onbloc will also work on building core Gno.land infrastructure to support an earlier launch. Find details of this in Onbloc’s [grant submission](https://github.com/gnolang/ecosystem-fund-grants/pull/4). And be sure to check out Onbloc’s informative 6-episode [blog series](https://medium.com/@gnoswaplabs/why-gno-introducing-gnoswap-dd6acc22e6a1) that features the history of blockchain and exchanges, a deep dive into the Gno Stack, and an introduction to Gnoswap, where they share details of their journey and insights.\n\n## Teritori\n\nWe also saw an awesome demo from the Teritori team, which you can check out at app.teritori.com. Simply connect your Adena wallet to create a user name, start interacting with the social feed, create your own DAO, and add members. The team is working on more extensive documentation to explain how it works in more detail. While still a work in progress, Teritori has developed a cool flagging system that allows you to unfollow content you don’t like or flag content as inappropriate. If posts receive many flags, users can vote on whether to ban them, creating a healthy and supportive social environment free from derogatory content monitored by a like-minded community through a moderation DAO.\n\nThe team continues its work on DAO interfaces and has built a useful tool for speeding up the deployment of packages as a workaround until we’ve decided how to best tackle realm versioning. They are also working on the escrow system, which will be useful for the freelance marketplace, and presenting DAO standards documentation.\n\n## Berty\n\nWe have a new contributing team to Gno.land from the Berty private messaging app. This team is working on a mobile version of Gno.land, implementing the WESH protocol, which is available by Bluetooth, local WIFI, or other means, and provides secure censorship-resistant communication between devices. The plan is to be able to provide an alternative transport for Gno applications when the internet is not available and build the skeleton/foundations that enable developers to create Gno-centric mobile apps more easily in the future. Berty brings a ton of experience in off-grid communication and getting apps to run on mobile devices, both Android and iOS.\n\nThe team has created its own [testnet](http://testnet.gno.berty.io/), which you are welcome to test out and play around with, although they will be restarting and rebooting without prior notice, so be aware that your work could be wiped. In the few short weeks they’ve been working with us, Berty has already finished their first Proof of Concept, a simple app running on iOS and Android. They copied code from the gnokey command line, and now it’s installing and running on mobile and interacting with the blockchain.\n\nNow, Berty is working on a nicer UI for the app and will propose a project to create a formal framework called GnoMobile, which will allow anyone to create their own app and run it on mobile. We look forward to seeing their demo soon.\n\n## Golang Working Group\n\nIn other news, we've started a bi-weekly [Gnome Golang Working Group](https://github.com/gnolang/hackerspace/issues/15) where we get together and discuss various topics, such as the language-related and theory elements of Go and Gno. We also aim to identify meaningful and reasonable ways to contribute to Golang, Gophers, and the general open-source community and improve our visibility there. We hope to attract more Go devs to the project and provide a “blockchain-less” experience for web2 Go devs.\n\nWe've had two meetings so far, and some recent hackerspace issues have already emerged from the discussions. One in particular that we’re actively evaluating is Gnoffee, a transpiler tool inspired by the likes of [CoffeeScript](https://coffeescript.org/) for Go and Gno integration. Gnoffee would be a powerful standalone tool to enhance Go and Gno (blockchain) projects by generating code and seamlessly integrating new features without manual coding. Find out more at the link above.\n\n## EthCC and Nebular Summit\n\nThe Gno.land team was in full force in Paris at the end of July for EthCC, where we met many passionate developers and spread the word about Gno.land and, specifically, how Gnolang compares and contrasts to Solidity. We had a booth during the conference manned by the Gno.land team complete with awesome swag and a continuous presentation in the background playing on a full-screen television.\n\nAt Nebular Summit, our VP of Engineering, Manfred Touron, [gave a talk](https://www.youtube.com/watch?v=CtxBajCcTYQ) called ‘Gnolang for Developers: Examining the Core Stack,’ where he broke down the major components of Gno, demonstrated how the upcoming Gno SDK compares with the existing Cosmos SDK, and explained why Gno.land is an excellent choice for accessible and sustainable blockchain development.\n\n## Blockchain Application Stanford Summit (BASS)\n\nJae opened the [Blockchain Application Stanford Summit (BASS)](https://bass.sites.stanford.edu/) event, attended by thousands of students and future blockchain developers. He gave an overview of Gno.land, GnoVM, and Gnolang, and explained the features that make our platform paradigm-shifting and timeless. He also dove into the core of why we’re building Gno.land – to provide a censorship-resistant platform for truth discovery that helps people improve their understanding of the world in an era of information censorship and control.\n\nComing up later this month, you can catch up with the Gno.land team at [DappCon Berlin](https://www.dappcon.io/) from September 11-13, where we’ll be delivering an informative keynote and hosting a side event to get to gno you better. If you find yourself in Barcelona for [Web3 Family](https://web3fc.xyz/) on September 23, you can join in a Gno coding workshop. You’ll also be able to meet the team at [GopherCon US](https://www.gophercon.com/) in San Diego. We’re hosting an action-packed workshop, ‘Chess: The Gnolang Way,’ on Gopher Community Day, where you can learn to build a web3 chess server on Gno.land and compete for cool prizes in an ongoing chess tournament throughout the event. More details coming soon. That’s all for now! Be sure to check back again with us for the next edition of *The More You Gno* to keep up with all our progress.\n\n*Do you want to contribute to Gno.land’s monthly updates? If you’re building on Gno.land and want to highlight your development, project, event, or idea, let us know, and we’ll include your contribution.*\n","2023-09-04T13:37:00Z","christina","gnoland,gnovm,tm2"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["chess-gc23","Play Chess with Us: The Gnolang Way at GopherCon 2023","\n\nCalling all gnomes and gophers! Come join the Gno.land team at GopherCon 2023, September 25 - 28, in San Diego, US. We’re sponsoring this year’s action-packed event that will gather together some of the world’s brightest minds and smartest programmers under one roof. So drop by our booth, pick up some swag, and say hey! We’ll be on hand every day to meet and greet, answer all your questions, and discuss everything Go, Gno, and beyond! We’ll also be hosting a workshop on Community Day, September 26, called ‘Chess: The Gnolang Way,’ where you can learn how to build a web3 chess server on Gno.land.\n\n## GopherCon 2023\n\n[GopherCon](https://www.gophercon.com/) is a community-driven annual event that started in 2014 and is dedicated to promoting the use of Go and the education of Go developers. Every year, thousands of gophers from around the world exchange ideas, share their work and expand the Go network. There are four days of fun-filled activities, including hands-on workshops, informative keynotes, networking events, and hackathons, all taking place in the laidback West Coast city of San Diego. Where better to expand your knowledge and make new friends than in one of the US’ most popular destinations?\n\nAs a gold sponsor at this year’s event, Gno.land will be running a booth and doing our best to convert as many gophers as possible to Gno, showing them how easy it is to port their existing web2 apps over to Gno.land or to build completely new ones from scratch.\n\n## Chess: The Gnolang Way\n\nIf you’re looking for a hands-on coding experience and to have a little fun with us at the same time, join us on Community Day for an awesome workshop, **‘Chess: The Gnolang Way.’** Kickstart your day by learning to build a web3 chess server on Gno.land using Gnolang. By the end of the session, you’ll have gathered basic knowledge on developing and deploying smart contracts on Gno.land, and connecting smart contracts to a web frontend. You’ll also see how web3 enables you to write perpetual and trustable social and gaming platforms and how to build a web3 chess server and website with Gno.land.\n\nIf you want to join us, meet us at 10:00 a.m. in the Grand Ballroom 10.\n\n## Let’s Play\n\nAfter the workshop, the fun begins with an ongoing chess tournament throughout the GC23 summit for event participants. To be in with a chance of scooping up some seriously cool prizes, GC23 attendees will need to show us their best moves and how much they engage with the Gno.land chain. This competition is designed to put our platform to the test over two main areas: chess mastery (50% of points) and platform engagement (50% of points). To be eligible for prizes, participants must be present at the event. We hope to see you there! If you can’t join us in person in San Diego, be sure to [follow us on X](https://twitter.com/_gnoland). We’ll be giving updates on our progress and sharing the highlights of the event. May the best gnome win!\n","2023-09-25T13:37:00Z","christina","gnoland,gnovm,gnochess,events"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["gnomobile","GnoMobile, a Framework for Building Gno Mobile Apps","\n\n*This blog post is written by Berty Technologies, an NGO that is building open and free communication solutions without any of the limitations imposed by centralized systems. Berty is a proud partner and grantee of Gno.land.*\n\nThe year is 2023. Current Gno apps run on desktop or laptop computers that have Go installed. To run on mobile, the app would need to bundle the Go runtime, which is complicated for most developers. At Berty, we have years of experience using Go on mobile and overcoming difficulties with Android and iOS operating systems. We built Wesh Network, a decentralized communication protocol that enables p2p users to reliably and securely send messages over async networks, even in environments with poor or no connectivity.\n\nThis stage is thus set to take the leap and make it easier for builders to develop Gno applications for mobile devices.\n\n# What is GnoMobile?\n\nSimply put, GnoMobile is a framework for developing Gno mobile applications. This is how it works:\n\n*WARNING: Deep technical sections ahead. Grab a coffee before venturing forth*.\n\nFor communication between the mobile app and the Gno code, GnoMobile uses [gRPC](https://grpc.io/), a well-supported framework that sends and receives Google Protobuf messages. Even though the core Gno code is written in Go, the app code can use React Native, Java, Swift, etc. The following system diagram shows how gRPC is used.\n\n\u003cdiv align=\"center\"\u003e\n ![](https://github-production-user-asset-6210df.s3.amazonaws.com/109347079/267934754-e4da6fec-a586-4ebe-97cc-3b3ad7f79370.jpg)\n\u003c/div\u003e\n\nMoving from the bottom to the top, this is how the flow looks:\n\n1. At the bottom are Go packages in the gno codebase. A **gnoclient.Client** supports communication with the remote Gno.land node with methods like Call to call a realm function. The Gno codebase also has **keys.Keybase** to support a wallet stored on the local device with methods like CreateAccount.\n2. These methods are called directly from the next level up by the **GnoMobile** Go code. A Go object can’t be passed through the gRPC interface, so the GnoMobile Go code maintains a persistent gnoclient.Client object, which is accessed by gRPC calls. The GnoMobile API functions are registered by an amino package.go file and the generated Protobuf files are used to configure the gRPC server.\n3. Finally, at the top of the diagram, the **gRPC client in the mobile app** communicates with the GnoMobile gRPC server over a local connection using Protobuf messages. A gRPC call can either return an immediate result (for example, GetKeyCount) or an asynchronous gRPC stream object, which can return delayed results (for example, a Call to a remote realm function). The gRPC framework uses the Protobuf API to generate convenient API functions in the mobile app’s [preferred language](https://grpc.io/docs/languages) (React Native, Java, Swift, etc.).\n\n# How GnoMobile benefits builders\n\nThe first version of the framework will include three main sets of features:\n\n1. **Blockchain Operations**: These refer to the core block of functions that the apps need to interact with the blockchain. Things like the gnoclient API to effectively bring the benefits of the Gno framework on mobile, the gas estimation interface and calling realm functions, querying a blockchain node (and more) are included here.\n2. **Wallet**: As the name suggests, here we have all the standard wallet operations like create or delete an account, set the recovery phrase, account balance, and so on.\n3. **Toolkit**: We want to make it as easy as possible for devs to start building apps with our framework, so we’ll provide them with install instructions, example apps, and more technical stuff like genproto options to support gRPC and helper functions to parse the render output.\n\nThose should be enough to allow builders to get started on using and experimenting with Gno mobile apps.\n\n- *Support for secure p2p communication, even when the Internet is down?*\n- *Yes, please!*\n\nSomething that is not necessarily essential for V1, but for sure will open the doors to some powerful capabilities later on is to add an interface and a constructor to adapt the communication transport. This will make it possible for devs to incorporate other tools like Wesh Network and give their apps the ability to securely and reliably send messages even in very poor network conditions. But that’s a story for another time.\n\n# When will GnoMobile be ready?\n\nV1 is planned for release in mid-December 2023.\n\nUntil then, you can check out our progress [here](https://github.com/gnolang/hackerspace/issues/28).\n\nGot feedback or want to drop us a question? Ask away on our [repo](https://github.com/gnolang/gnomobile/issues).\n\n# What does the future look like beyond V1?\n\nWe see a lot of potential directions for GnoMobile after the initial release that will improve the user experience, extend its functionality, and make GnoMobile even more secure. We’re still scratching the surface in terms of how far we can take its development, and we look forward to working on further iterations and improvements. Some of our ideas for the future beyond V1 include:\n\n1. Making it easier for developers to **build** **desktop apps** **and** **browser extensions**:\n2. Through GnoMobile, we can gradually enable “desktop” devs to use our React Native gRPC interface to write desktop applications while using existing functionality from the core Go code. This way, developers will not necessarily have to learn Go to leverage its advantages.\n3. Browser extensions are usually written in JavaScript in the same way as in React Native. This opens the door to getting the benefits of Go via the GnoMobile framework. Otherwise, you’d have to either make the Go code run inside the browser extension (which is not easy) or use a remote server (which is not pretty).\n4. Making it possible to **execute smart contracts directly from mobile**.\n\n*Why is this important?*\n\nIf you want to add a new message to a blockchain, you need to actually interact with it (the blockchain) and update its state with the new message. However, if you just want to browse through the messages, you can execute the Render function locally without needing to use your network and, at the same time, get the results much faster. This is because the node runs locally on the mobile device without needing to spend crypto coins to get a remote node to do the operation for you.\n\nGno nodes run on GnoVMs (gnovm), and for the moment, these are only available on desktops. We believe it is possible to make them available on mobile as well, but we need to find clever ways to overcome the constraints of mobile devices (like putting the apps in the background (iOS), addressing network bandwidth limitations, and so on).\n\n1. Developing a **decentralized push notification service** for *both* mobile and desktop apps. Getting notifications is now a standard (and very important) functionality of centralized apps. Technically, this happens via a central server. Naturally, having a centralized server is not possible for a p2p app, but there are other ways to implement notifications, and we are considering including them in the GnoMobile framework.\n2. Making it possible for decentralized apps to **interact with the blockchain even if the network connection is poor or virtually unavailable**. Through the [**Wesh Network** protocol](https://wesh.network/), we are opening up the possibility of using alternative transport mediums to exchange messages between peers in an asynchronous but reliable manner in off-grid environments. Enabling reliable, secure, and censorship-resistant communication is our main cause at Berty Technologies. We want to open the door for p2p users to send messages and interact even in extreme situations or adverse scenarios, and Wesh Network is built specifically for this purpose. It is only natural to make it easier for developers to use it through the GnoMobile framework.\n3. Advancing **edge networking for enhanced blockchain resilience**. Edge networking refers to bringing functionality like computing power or storage closer to the user so that they don't need to travel through the whole Internet to interact with a server. The same edge concept can be applied to bring the necessary services to interact with the blockchain closer to each p2p user. For example, hosting a copy of the blockchain so a user can sync it or even execute smart contracts. Having these fundamental services closer to the p2p users is especially important in the case of mobile apps. We want to offer developers the possibility of taking advantage of the edge networking benefits by allowing them to use, for instance, network address redirections or special HTTP headers in the configuration of their applications.\n\nIn all honesty, it’s hard not to get excited about all the different possibilities that lie ahead for GnoMobile, but we’re keeping our focus on shipping V1 for now and collecting feedback from the community. After that, well, we hope you’ll stick around to see what happens next!\n","2023-09-29T13:37:00Z","jeff,costin,remi,iuri","gnomobile,berty,weshnetwork"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-5","The More You Gno: Gno.land Monthly Updates - 5","\n\nIt's been another productive month, packed with developer calls, live events, new contributors, a large team presence at the Go community's biggest event of the year, GopherCon 2023, and the launch of a PoC gaming dApp on Gno.land, GnoChess. We uncovered a bunch of bugs in the code and some issues with the GnoVM, and made further progress on the Go and Rust VMs, the banker module bug, Gnofee, and much more. Check out the updates below.\n\n## Building a Web3 Chess Server on Gno.land - GnoChess\n\nMost of our work over the last few weeks has been dedicated to [GnoChess](https://gnochess.com/), a [PoC gaming dApp](https://test3.gno.land/r/gnoland/blog:p/chess-gc23) unveiled at GopherCon 2023. As gold event sponsors, we wanted to provide gopher attendees with a memorable experience – and a little friendly competition – while battle-testing the Gno.land platform. As our first gaming dApp, developing GnoChess was extremely useful for our team in many ways. We managed to attract 61 players to the game during the event, including some die-hard web2 gophers who wanted to show off their moves and discover more about Gno.\n\nSeveral PRs were opened as a result of our endeavors, and, beyond the conference, GnoChess taught us a lot about where we're at with Gno, how to successfully build complex dApps on top of the platform, and how well we work as a team. We uncovered some key issues and breaking behavior in the GnoVM, made our JavaScript clients much more reliable in their communications with the Gno.land node, and unearthed further issues that lead to complex errors and potential security flaws that must be addressed before mainnet.\n\nFor example, appending nil to a slice of errors resulted in a panic, or conditional statements like if not supporting custom boolean types. The GnoVM doesn't currently perform terminating statement analysis, which results in a cryptic panic message ([issue 1086](https://github.com/gnolang/gno/issues/1086)), and mixing untyped (negative) floats and integers in arithmetic sometimes drops the sign ([issue 1152](https://github.com/gnolang/gno/issues/1152)). The issues uncovered while developing GnoChess were discussed extensively in the public developer calls of [Sept 6](https://www.youtube.com/watch?v=BBBqgycMjqU) and [Sept 20](https://www.youtube.com/watch?v=WrxFVPR55G0), and referenced in the [GitHub meeting agenda](https://github.com/gnolang/meetings/issues/31). Most of the issues are common in software development and fairly simple to fix by making some implementation changes or adjustments to design choices.\n\nWhile developing GnoChess, our engineers took on the role of expert platform users rather than core team members. This approach was very useful as it pushed the platform to new limits, and allowed us to dive deep into many aspects of the project, creating a culture of sharing by opening up issues for each bug and asking for feedback and support. We'll definitely take a similar approach for future app development and onboarding new devs to Gno. We'll be releasing a retrospective of our experiences in the coming weeks. In the meantime, if you want to build a dApp on Gno.land, check out the GnoChess repo, where you can find a useful [tutorial](https://github.com/gnolang/gnochess/blob/main/tutorial/01_getting_started/README.md) or watch the recording of the GopherCon workshop, '[Chess: The Gnolang Way](https://www.youtube.com/watch?v=JQh7LhqW7ns).'\n\n## The Battle of the Virtual Machines\n\nCore engineers Marc and Petar continue their excellent work developing two different VMs for Gno, one in Go and one in Rust. In the coming weeks, we'll have a face-off, comparing and contrasting their features, efficiency, speed, and performance, so watch this space! For now, the definition of the virtual machine is stable for both, and they are no longer working on the virtual machine definition. They are mainly focusing on code generation; everything from parsing to scanning to parsing and compiling. Let's see how they are shaping up.\n\n### Rust VM\n\nPetar has developed a Rust implementation not only of the virtual machine but of the whole chain, including the compiler. He has written a Go compiler entirely in Rust and has even started experimenting with changing the compiler to implement the Invar proposal from Jae. Further progress includes porting a part of the parser and scanner from the Go compiler to Rust (almost a direct translation from Go to Rust) and making it stable. \n\nIn addition, Petar has completed work on typed nil values and improving the recursive closures of Go, which were not working with Gno code and needed additional pointers. He has also implemented Iota and hooked up the garbage collector. In the coming weeks, Petar will be working to smooth out bugs and implement type aliases, as well as implementing function analysis for the dependency graph. The dependency graph is necessary for compiling global types in the correct order, so, for example, when type A refers to type B, you need to compile type B first so that when type A refers to it, type B exists.\n\n### Go VM\n\nMarc is currently rewriting a parser and a scanner from scratch. His work is not as far along as Petar's, but he's getting closer, and the code generation works well. He is currently refactoring and building a single-pass compiler that can perform a **syntax-directed translation**, which means there are no intermediate data structures between the source code and the byte code. This is a much simpler design that should compile faster and be easier to maintain, but it requires a complete redesign. \n\nMarc believes his Go parser will be easier to maintain and understand than the one in Rust and benefit the user since the entire stack is written in Go. However, to assess the best implementation of the VMs, Marc has started a Go **test shoot project, which is a script** that will run many samples to verify that the compiler (in Go, Rust, or any other implementation) conforms to Go's specifications. Marc and Petar will open their repos soon, and the next edition of The More You Gno will highlight how the GnoVM works. \n\n## Gnoffee: Coffeescript for Go and Gno\n\nGnoffee (hackerspace [issue 22](https://github.com/gnolang/hackerspace/issues/22)) will be a powerful standalone tool to elevate the development process of Go and Gno by generating code and integrating new features, eliminating manual coding. We aim to create a custom variation of Golang that preserves similar readability, maintains compatibility, and enables being able to code in Gno very quickly when you know how to code in Go. How do we go about this? \n\nRegarding compatibility, one possibility is to propose all our changes to Golang and wait for approval before we start developing. However, this is likely to take some time. Another approach is to use a way to transpile TypeScript for JavaScript or Coffeescript for JavaScript, so it's another language passing through a program that creates standard valid Golang and will generate valid Gnolang. With this simple method, we can experiment with missing features like new native types, and new keywords, and when we have new features in mind, we can develop what we lack. \n\nFor instance, it does not make sense to have extra security for your exported variables when you write a library in Go. However, in Gno, it is very important to ensure that everything you expose cannot be modified by other contracts. This means finding a way to expose constants and other readable elements without risking their values being overwritten.\n\nBesides allowing us to carry out all types of experimentation more easily, Gnofee could eventually be a way for the Go team to measure the potential adoption of Gno. Gnofee is not a priority for the mainnet, but we're excited to work on this important initiative.\n\n## META Multinode Testnet\n\nThe discussions about single and multinode testnets have been ongoing, so we opened an issue to establish a multinode testnet focused on multi-validator experimentation, including stability, benchmarking, and lifecycle management. This multinode testnet aims to provide a platform for in-depth explorations and evaluations of multi-validator setups, while we maintain the single-node test3+.gno.land set up, primarily dedicated to showcasing the VM and providing examples. Visit hackerspace [issue 9](https://github.com/gnolang/hackerspace/issues/9) if you want to participate in this initiative or share your insights.\n\n## Banker Module Bug\n\nThe banker module bug is a known issue that needs to be fixed before the mainnet because, currently, it's still possible to mint new GNOT tokens from any contract. Several fixes have been suggested, and our goal is to merge [PR 875](https://github.com/gnolang/gno/pull/875) put forward by Onbloc to change the denomination of the coins minted by the banker. Merging this PR is currently blocked by 2 small failing checks, but we are close to resolving this issue.\n\n## Preserving Go Comments in Protobuf\n\nIn [issue 1157](https://github.com/gnolang/gno/issues/1157), Jeff from Berty raises the question about preserving Go comments in the Receiver field. Currently, Amino converts the code, but the proto message Receiver field doesn't have the comment. Manfred agrees that informative comments are helpful. However, he doesn't want to create a complex Protobuf configuration. We will continue to discuss this issue to look for solutions, but for now, Berty will parse the original Go source code and get the comments this way.\n\n## Multi-Sig and Security Features\n\nSeveral contributors, including Teritori, are working on built-in multi-sig support in Gno.land, where Gnokey supports a multi-sig setup. We also want to introduce additional ways to improve the UX and security of Gno.land (and web3 in general). An idea we currently have is to add a new layer in authentication, creating something similar to browser cookies that we can name sessions. The chain will have two tables, one with the public key for an account and one with a public key for sessions linked to an account. From your main account, you can create a session with self-destructing features, such as destructing after one hour without usage or after 24 hours. The goal would be to allow more complex and secure flows when starting your operations. We may not want this for multi-sig, but it comes under the same family of security and privacy features.\n\nFor example, imagine a wallet like Adena uses your key, a passphrase, or a ledger. It will sign a new public key that you just created in memory. Each time you close your browser, the memory is cleared. You can also have a logout button to call on the blockchain to delete all your sessions or simply wait for the session to be self-destructed, especially if the session was just in memory on your side. We will continue to develop this idea.\n\n## New Team Member\n\nWe're excited to welcome a new DevRel team member to Gno.land, Leon, who's been in blockchain development for two years and is passionate about engineering and teaching. Leon has taught languages, development, math, and music privately, as well as an OS fundamentals class at his previous faculty. Welcome on board!\n\n## Grantee and Ecosystem Updates\n\nAs Gno.land core continues to advance, so does our blossoming ecosystem, with new contributors and community members turning their eyes to Gno. The overriding theme of this last month has been collaboration, and we're pleased to see gnomes working together to overcome their obstacles and push their projects forward. Let's see what they've worked on over the last few weeks.\n\n### Onbloc\n\nOnbloc is powering ahead, contributing to Gno.land core, making upgrades and improvements to Adena and Gnoscan, and developing the Gnoswap DEX. Last month, Onbloc released the patched version 1.8.0 of Adena, which includes some UI and UX enhancements, such as more intuitive account management settings, a copy icon next to the names of the accounts, and some bug fixes. This release also comes with new injection methods to enable dApps to request users to add a custom gno.land network or switch to an existing one. Check out the [release note](https://github.com/onbloc/adena-wallet/releases/tag/v1.8.0) for more details.\n\nOnbloc has open-sourced the code for Gnoswap on this GitHub [repo here](https://github.com/gnoswap-labs/gnoswap). You can also find a guide to running unit tests. The team continues to improve the Gnoswap interface, focusing on the earn and staking pages, the graphs for positions, and some components for adding and removing liquidity and providing pool incentives. They're working on the next iteration of the interface, with the governance and airdrop pages, and developing the front-end logic to integrate with Gnoswap realms and APIs. Onbloc also contributed to Gno core, adding PRs for fixes to testing and the banker module. Keep up with Onbloc through their [hackerspace journey](https://github.com/gnolang/hackerspace/issues/29) and check out their latest initiative [Gnodesk](https://medium.com/onbloc/gnodesk-week-2-of-sept-2023-5edbc451bba7), which delivers weekly highlights and updates from Gno.land.\n\n### Teritori\n\nTeritori has been working on improvements since the last update and open-sourcing all their work, including the DAO deployer and the Moderation module. You can visit the Teritori DAO tooling repo to find the complete documentation and new realms to easily deploy your DAO. There is also a tutorial on creating your own DAO using the framework. \n\nThe team has made extensive progress on the Justice DAO deployer, a module that can be used for third-party arbitration when there is a problem with the escrow system in a decentralized freelance marketplace. The Justice DAO can resolve potential conflicts between the seller and the buyer and implements randomness to choose the judges to solve problems without conflicts of interest. The content flagging system, which highlights the content that users deem to be inappropriate, has been tweaked and improved. Keep up with Teritori's [hackerspace journey here](https://github.com/gnolang/hackerspace/issues/7).\n\n### Berty\n\nBerty has already completed the first phase of the project and published the [technical proposal](https://github.com/gnolang/gnomobile/issues/15) to develop the Gno mobile framework. The team is now busy with the second phase of implementing the proposal and the gRPC interface, which is working with the local socket on Android and iOS. Jeff has been trying to use Amino, and, now that Iuri is back from vacation, the team will work on improving other parts of the interface. Check out their latest [demo](https://www.loom.com/share/c0f68f707d3e47089c2fdbd2698fc92f), which shows an example user interface with wallet functions and blockchain communication. \n\nOnbloc has laid the foundations for Gno mobile apps with the Adena mobile wallet, so Berty will use some of this code in the mobile framework and work with Onbloc to ensure a similar user experience across all Gno apps.\n\n### Flippando\n\nDragos, the developer behind new grantee Flippando, is an experienced mobile app developer. Flippando is a simple on-chain memory game, which is currently written in Solidity and deployed on several testnets, including Goerli, Polygon, Near, Aurora, Evmos, and a Saga chainlet. Fippando started as a project for Dragos to learn Solidity but has already been the winner of two hackathons in Korea. It can be deployed relatively easily on any machine and is currently being ported to Gno.land. Dragos is exploring which user intersection can be more beneficial for this and will show us a demo in the coming weeks. Soon, we'll have two gaming dApps on Gno.land – Flippando and GnoChess! Read about Flippando in the [hackerspace journey](https://github.com/gnolang/hackerspace/issues/33).\n\n### New Contributor Joseph Kato \n\nWe have a new contributor to Gno.land who showed a demo last month of what he's been working on, a language server to run tests and scripts. Joseph is a major Go fan looking to get into web3 and was super excited to come across Gno. While interacting with Gno.land, he found many IDE-like features that he missed when working on files, so he decided to work with an LSP implementation—gnols—with the goal of making these features available to all contributors regardless of editor preference, starting with Sublime Text and Neovim and moving on to IntelliJ, Golang, and Emacs. This is a welcome addition for anyone who has ever developed a realm in Gno. Check out his [hackerspace](https://github.com/gnolang/hackerspace/issues/34) page for more details. \n\n## DappCon, Berlin\n\nManfred was back in Berlin in September at the Radial System presenting 'Gno.land: The Key To Perpetual Transparency,' where he discussed how Gno.land offers a familiar, seamless experience for code sharing and a sustainable and transparent path for blockchain development. \n\n## Web3 Family\n\nCore dev Miloš Živković gave a talk at Web3 Family in Barcelona last month, 'Gno.land and Gnolang: The Dynamic Duo of Blockchain Development.' He presented a brief history of smart contract development and the issues associated with existing platforms, such as limitations in design and security. He introduced Gno and showed how we make web3 accessible and blockchain development more intuitive and secure. Catch the [talk here](https://www.youtube.com/watch?v=0K-jr_Ad3bI).\n\n## GopherCon 2023\n\nGno.land was out in force at GopherCon 2023 with a well-stocked booth at the conference and an awesome workshop building a web3 chess server on Gno.land. Both Manfred and Jae were at the booth championing Gnolang to Gophers, and we received a lot of positive feedback, some new contributions, fresh PRs, and exposure for Gno.land in web2 circles. It was also a fabulous chance for the team to meet for valuable face-to-face time.\n\nThat's all for now! Be sure to check back again with us for the next edition of The More You Gno to keep up with all our progress.\nDo you want to contribute to Gno.land's monthly updates? If you're building on Gno.land and want to highlight your development, project, event, or idea, let us know, and we'll include your contribution.\n","2023-10-10T13:37:00Z","christina","gnoland,gnovm,tm2"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["funding-program-23q3","Gno.land Funding and Grants Program - Progress So Far","\n\n# Quarterly Report: Q3 2023\n\nWe launched the [Gno.land Funding and Grants](https://github.com/gnolang/ecosystem-fund-grants) program in July 2023 to encourage talented and passionate developers to interact with Gno.land, help build core infrastructure and tooling, and enhance the usability of the platform. After establishing a review process to streamline the program and identify core areas that need the most work, we ran with our first cohort of grantees in Q3, awarding four grants from a total of seven submissions (to two teams and two individuals). Full details of grant submissions, scope, and funding can be found on GitHub, but here’s a summary of the program’s progress so far and what’s coming up in Q4.\n\n## Q3 Funding Breakdown\n\nThe total grants distribution for Q3 was **$563,595** over the four grants: Teritori, Berty, Zack Scholl, and Flippando. This work has been split over two main large-scale infrastructure products (the Gno Moderation DAO, and GnoMobile), a gaming application, and our first resident tinkerer (Zack), who is experimenting with Gno and developing Proof of Concepts using it. Each grant recipient was provided with milestones for deliverables and has kept track of their progress through regular syncs, hackerspace journeys, blog posts, and developer calls. \n\n### Teritori (delivered September 2023)\n\nTeritori blockchain and multi-chain hub allows IBC and non-IBC communities to connect, create groups, exchange tokens and NFTs, and launch new projects. The Teritori team has solid experience building social dApps, marketplaces, NFTs, collectibles, and interfaces to encourage community interaction. For the Gno.land Grants and Funding program, Teritori was tasked with building a Moderation DAO to enable effective and fair content moderation in a decentralized and permissionless environment. \n\nThe Moderation Module is a smart contract ‘realm’ that enables a DAO to manage the daily moderation of forums or social threads through blockchain decision-making, supporting the vision of a censorship-resistant platform that fosters a safe space for open debate and discussion. Find detailed updates on Teritori’s [hackerspace issue 7](https://github.com/gnolang/hackerspace/issues/7), and watch out for upcoming blogs on Gno.land.\n\n### Berty Technologies (delivery Dec 2023)\n\nBerty private messaging app was allocated a grant to build a mobile version of Gno.land, implementing the WESH protocol (available by Bluetooth, local WIFI, or other means), and providing secure censorship-resistant communication between devices. Berty’s experience in off-grid communication is invaluable to Gno.land, and the team is an expert at running Go on mobile Android and iOS operating systems. For this grant, to be completed in Q4, Berty will deliver a minimal PoC of the existing apps of Gno.land running on mobile, and deliver an open-source mobile app with basic CI/CD, interacting with the Gno.land testnet. Find detailed reports and updates on Berty’s [hackerspace issue 28](https://github.com/gnolang/hackerspace/issues/28) or within their [Gnomobile blog post](https://test3.gno.land/r/gnoland/blog:p/gnomobile).\n\n### Flippando (delivery Nov 2023)\n\nFlippando is a multi-level on-chain memory game currently written in Solidity and deployed on several testnets, including Goerli, Polygon, Near, Aurora, Evmos, and a Saga chainlet. Like the classic card-based Memory game, Flippando players must match card pairs (digital tiles). When a player selects a tile, the game sends a request to the chain, which sends back the uncovered tile. If two tiles match, they remain uncovered. If they don’t match, they are flipped back until the game is won, and an NFT is generated for the winning player to prove the win. Through the development of a simple gaming app on Gno.land, we want to show how easy it is for gaming and metaverse concepts to be built. Through this grant, Flippando will port its memory game to Gno. Find detailed updates on Flippando’s [hackerspace issue 33](https://github.com/gnolang/hackerspace/issues/33).\n\n### Resident Tinkerers Program: Zack Scholl (6 months)\n\nZack Scholl is Gno.land’s first resident tinkerer with tons of experience in web2 development and a passion for the Go language. Through the grants program, Zack aims to translate his extensive knowledge to Gno and web3 by developing PoCs using Gno. So far, Zack has worked on a microblogging app for Gno.land and a prototype for using generative audio with smart contracts. He’s also creating documentation and tutorials to help other developers follow his lead. You’ll be hearing more from Zack over the coming weeks. Follow his [hackerspace issue 2](https://github.com/gnolang/hackerspace/issues/2) journey for more details.\n\nAfter a great start to the Funding and Grants Program in Q3, below is a breakdown of the percentage of funding allocated to each area of development so far:\n \n[![Funding](https://gnolang.github.io/blog/2023-10-17_funding-program-q3/src/thumbs/funding.png)](https://gnolang.github.io/blog/2023-10-17_funding-program-q3/src/funding.png)\n\n## Coming Up in Q4 and Q1 2024\n\nWe’re looking forward to more exciting developments in the coming quarters as we focus on the road to mainnet. Onbloc, one of Gno.land’s most active contributors, is currently being confirmed as a [Q4 grantee](https://github.com/gnolang/ecosystem-fund-grants/pull/4/files#diff-6dbd2e305897910e59072f9efa8c537d86f8aa281eb3742e0c150048a1df95eb) to work on core infrastructure necessary for mainnet, including tm2-js and gno-js support, GnoVM debugging, contract interactions, and leading the multi-node testnet initiative. Onbloc has already developed essential public infrastructure tools for Gno.land, including the non-custodial Adena wallet, the Gnoscan blockchain explorer, and Gnoswap decentralized exchange. The team has demonstrated immense passion and dedication in attending public developer calls and in-person events, and releasing extensive documentation, blog series, and [hackerspace issue 29](https://github.com/gnolang/hackerspace/issues/29) about their journey. \n\nOver the next two quarters, the Grants program will focus on building our tinkerer and student cohorts, and publishing more content, such as application libraries, documentation, and Gno packages. The goal is twofold: to support more users and ensure a diversified set of users on the Gno.land platform testing, debugging, troubleshooting, and running user feedback loops. We currently have two apps to reference on how to get started – GnoChess, built by the Gno core team, and Flippando, a grant recipient – we’re looking for a lot more to come. \n\nWe’re steadily building out the Gno.land platform, and our ecosystem of grantees and contributors. Let us know if you want to join us by submitting an application any time on the Funding and Grants [repository](https://github.com/gnolang/ecosystem-fund-grants). We’re opening up our second grant batch this month, and look forward to reviewing your submissions. \n","2023-10-17T13:37:00Z","christina,michelle","gnoland,funding,grants"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["gnoland-moderation-dao-module","Gno.land Moderation DAO Module","\r\n# Gno.land Moderation DAO Module\r\n*This blog post is written by the Teritori team, whose focus is to allow organizations to communicate and interact in a resilient and transparent way. Teritori is a partner and grantee of Gno.land.*\r\n\r\nWhen it comes to the complex subject of discussion forums and decentralized social networks, numerous technical and philosophical questions arise.\r\nImagining a 24/7 online communication system whose administration cannot be compromised or censored by any entity or individual is one of the most intriguing challenges of the decade.\r\nApproximately 10 months ago, the Teritori core team decided to explore the new possibilities offered by Gno.land on the theme of decentralized moderation and to build the foundation for future generations of developers to create resilient, robust, and autonomous applications.\r\n\r\n## The vision\r\n\r\n### About Teritori\r\n\r\nTeritori is a decentralized Operating System for individuals \u0026 communities that allows organizations to communicate and interact in a resilient and transparent way. Its core components include the creation of a decentralized User Profile for individuals \u0026 organizations as well as a dApp Store allowing users to pick their favorite services for daily usage and developers to list their product in order to grow their user base. Finally, Teritori backbone, its P2P messenger application that will enable users to create resilient token-gated groups in a click will even allow non-crypto-native users to get onboard as this feature doesn't even require a wallet connection to get started.\r\n\r\n### Teritori \u003c\u003e Gno.land\r\n\r\nConvinced of the benefits of offering a contribution-based consensus model and taking advantage of an interpreted version of Golang, the Teritori core team aims to become one of the most prolific contributors to Gno.land. Our plan is to focus on features that enable the coordination of organizations and individuals via governance, communications, and collaboration. Eventually, all the features listed on Teritori will be accessible in the Gno.land network, contributing to the growth of the ecosystem.\r\n\r\n### PoC and iterations\r\n\r\nAnother important point to emphasize is that the Teritori core team intends to improve the features it deploys on Gno.land by taking advantage of the user test phases to collect feedback that will enable iteration and improvement of the service. As a result, the “Proof-of-Concept” (“PoC”) presented in this article will be subject to updates and evolutions, which will be communicated in due course, as will the associated test phases.\r\n\r\n## What is the Gno Moderation Module?\r\n\r\nThe Gno Moderation Module is a smart contract (“realm”) that enables a decentralized, autonomous organization (DAO) to manage the moderation of a forum or social thread through a transparent on-chain vote.\r\n\r\n### Let’s take an example:\r\n\r\nImagine a simple social network similar to Instagram, in which all content is decentralized (using IPFS for images, videos, music etc.). For each post, users sign in via their wallet to post content, and no centralized administrator can delete this content. The freedom offered by this type of decentralized application is immense since even as developers of the application, it is impossible to delete the content. Therefore, we can consider this “space of freedom” as a “common space” unlike any application owned by a private company and hosted on centralized infrastructure.\r\nWith this radical freedom for the user comes a great responsibility— to collectively ensure the security of this space rather than delegating the responsibility to moderators employed by a commercial enterprise. This is why we’ve created the “Gno Moderation Module.”\r\n\r\n### How does it work?\r\n\r\n[![moderation_flow v0.1](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/thumbs/moderation_flow_v0.1.png)](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/moderation_flow_v0.1.png)\r\n\r\nThe Gno Moderation Module allows users to notify the moderation DAO community that they wish to report content. Through this action (permitted by the smart contract), they inform the DAO community that the content is inappropriate.\r\n\r\n[![content flag](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/thumbs/content_flag.png)](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/content_flag.png)\r\n\r\nOnce the content has been reported a certain number of times (10 times in this PoC) by users (who may or may not be members of the Moderation DAO), an on-chain proposal is automatically created.\r\n\r\n[![moderation dao feed](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/thumbs/moderation_dao_feed.png)](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/moderation_dao_feed.png)\r\n\r\nThis on-chain proposal is then listed in the Moderation DAO tab on the Social Feed as well as on the Moderation DAO profile proposals feed so all Moderation DAO members can vote on it. A debate can take place to discuss the best choice for the content.\r\n\r\n[![moderation dao vote](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/thumbs/moderation_dao_vote.png)](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/moderation_dao_vote.png)\r\n\r\nModeration DAO members have three voting options:\r\n- Ban the content in question\r\n- Abstain\r\n- Do not ban the content in question\r\n\r\nOnce the required vote quota has been reached, the contract automatically executes the voted decision.\r\n\r\n## The Current Status:\r\n\r\nThe Teritori core team received a grant from the Gno.land core team to build the necessary tools for decentralized moderation.\r\n\r\nTo accomplish this task, we divided our work into five main stages:\r\n1. Build “DAO” standards to establish the fundamental building blocks and ensure a modular approach in the long term for various tools.\r\n2. Build a “DAO” deployer that allows non-tech users to easily utilize the different standards.\r\n3. Build a customizable Moderation Module that can cater to a wide range of use cases. For example, if we replace the social feed with a service marketplace, the Moderation Module can transform into a “Justice Module” that resolves conflicts between sellers and buyers on a decentralized platform and serves as an escrow system.\r\n4. Develop the user experience that allows for large-scale experimentation with the Moderation Module within a dedicated context of an active social feed. Here, we created a social feed realm and enabled non-developer Gno.land users to participate in the full-scale experience.\r\n5. Establish interactions between smart contracts (r/boards, r/socialfeed, /r/users), conduct experiments to enhance their security, and identify emerging needs for these innovative use cases.\r\n\r\n### What does a DAO realm look like?\r\n\r\n- We decided to build two different DAO standards, using two different approaches of modularity:\r\n- Aragon DAO Standard, based on the amazing work of [the Aragon team](https://aragon.org/) (using Solidity)\r\n- [DAODAO](https://github.com/DA0-DA0) smart contract, using CosmWasm, that allows more modularity.\r\n\r\n\r\nHere is an example, with the DAODAO contract ported into Gnolang:\r\n[Source](https://testnet.gno.teritori.com/r/demo/dao_realm_v6/dao_realm.gno)\r\n\r\n```go\r\npackage dao_realm\r\n\r\nimport (\r\n\t\"encoding/base64\"\r\n\t\"std\"\r\n\t\"strings\"\r\n\t\"time\"\r\n\r\n\tdao_core \"gno.land/p/demo/daodao/core_v16\"\r\n\tdao_interfaces \"gno.land/p/demo/daodao/interfaces_v16\"\r\n\tproposal_single \"gno.land/p/demo/daodao/proposal_single_v16\"\r\n\tvoting_group \"gno.land/p/demo/daodao/voting_group_v17\"\r\n\t\"gno.land/p/demo/ujson_v5\"\r\n\t\"gno.land/r/demo/groups_v22\"\r\n\tmodboards \"gno.land/r/demo/modboards_v9\"\r\n)\r\n\r\nvar (\r\n\tdaoCore dao_interfaces.IDAOCore\r\n\tmainBoardName = \"dao_realm\"\r\n\tgroupName = mainBoardName + \"_voting_group\"\r\n\tgroupID groups.GroupID\r\n)\r\n\r\nfunc init() {\r\n\tmodboards.CreateBoard(mainBoardName)\r\n\r\n\tvotingModuleFactory := func(core dao_interfaces.IDAOCore) dao_interfaces.IVotingModule {\r\n\t\tgroupID = groups.CreateGroup(groupName)\r\n\t\tgroups.AddMember(groupID, \"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c\", 1, \"\")\r\n\t\tgroups.AddMember(groupID, \"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv\", 1, \"\")\r\n\t\tgroups.AddMember(groupID, \"g14u5eaheavy0ux4dmpykg2gvxpvqvexm9cyg58a\", 1, \"\")\r\n\t\tgroups.AddMember(groupID, \"g1ckn395mpttp0vupgtratyufdaakgh8jgkmr3ym\", 1, \"\")\r\n\t\tgroups.AddMember(groupID, std.GetOrigCaller().String(), 1, \"\")\r\n\t\treturn voting_group.NewVotingGroup(groupID)\r\n\t}\r\n\r\n\tproposalModulesFactories := []dao_interfaces.ProposalModuleFactory{\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.IProposalModule {\r\n\t\t\ttt := proposal_single.Percent(100) // 1%\r\n\t\t\ttq := proposal_single.Percent(100) // 1%\r\n\t\t\treturn proposal_single.NewDAOProposalSingle(core, \u0026proposal_single.DAOProposalSingleOpts{\r\n\t\t\t\tMaxVotingPeriod: time.Hour * 24 * 42,\r\n\t\t\t\tThreshold: proposal_single.Threshold{ThresholdQuorum: \u0026proposal_single.ThresholdQuorum{\r\n\t\t\t\t\tThreshold: proposal_single.PercentageThreshold{Percent: \u0026tt},\r\n\t\t\t\t\tQuorum: proposal_single.PercentageThreshold{Percent: \u0026tq},\r\n\t\t\t\t}},\r\n\t\t\t})\r\n\t\t},\r\n\t}\r\n\r\n\tmessageHandlersFactories := []dao_interfaces.MessageHandlerFactory{\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\treturn groups.NewAddMemberHandler()\r\n\t\t},\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\treturn groups.NewDeleteMemberHandler()\r\n\t\t},\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\t// TODO: add a router to support multiple proposal modules\r\n\t\t\tpropMod := core.ProposalModules()[0]\r\n\t\t\treturn proposal_single.NewUpdateSettingsHandler(propMod.Module.(*proposal_single.DAOProposalSingle))\r\n\t\t},\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\treturn modboards.NewCreateBoardHandler()\r\n\t\t},\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\treturn modboards.NewDeletePostHandler()\r\n\t\t},\r\n\t}\r\n\r\n\tdaoCore = dao_core.NewDAOCore(votingModuleFactory, proposalModulesFactories, messageHandlersFactories)\r\n}\r\n\r\nfunc Render(path string) string {\r\n\treturn \"[[board](/r/demo/modboards:\" + mainBoardName + \")]\\n\\n\" + daoCore.Render(path)\r\n}\r\n\r\nfunc VoteJSON(moduleIndex int, proposalID int, voteJSON string) {\r\n\tmodule := dao_core.GetProposalModule(daoCore, moduleIndex)\r\n\tif !module.Enabled {\r\n\t\tpanic(\"proposal module is not enabled\")\r\n\t}\r\n\tmodule.Module.VoteJSON(proposalID, voteJSON)\r\n}\r\n\r\nfunc Execute(moduleIndex int, proposalID int) {\r\n\tmodule := dao_core.GetProposalModule(daoCore, moduleIndex)\r\n\tif !module.Enabled {\r\n\t\tpanic(\"proposal module is not enabled\")\r\n\t}\r\n\tmodule.Module.Execute(proposalID)\r\n}\r\n\r\nfunc ProposeJSON(moduleIndex int, proposalJSON string) {\r\n\tmodule := dao_core.GetProposalModule(daoCore, moduleIndex)\r\n\tif !module.Enabled {\r\n\t\tpanic(\"proposal module is not enabled\")\r\n\t}\r\n\tmodule.Module.ProposeJSON(proposalJSON)\r\n}\r\n\r\nfunc getProposalsJSON(moduleIndex int, limit int, startAfter string, reverse bool) string {\r\n\tmodule := dao_core.GetProposalModule(daoCore, moduleIndex)\r\n\treturn module.Module.ProposalsJSON(limit, startAfter, reverse)\r\n}\r\n```\r\n\r\n### Public Grant Report:\r\n\r\nYou can find the full report of [Teritori Core’s journey here](https://github.com/gnolang/hackerspace/issues/7). \r\n\r\n### Resources:\r\n\r\nDocumentation:\r\n- [Gno Moderation DAO](https://github.com/TERITORI/gno/blob/teritori-unified/examples/gno.land/r/demo/teritori/MODERATION_DAO.md)\r\n\r\nPackages:\r\n- [https://testnet.gno.teritori.com/r/demo/groups_v22](https://testnet.gno.teritori.com/r/demo/groups_v22)\r\n- [https://testnet.gno.teritori.com/p/demo/daodao/interfaces_v16](https://testnet.gno.teritori.com/p/demo/daodao/interfaces_v16)\r\n\r\nTutorial:\r\n- [Gno.land Social Feed Moderation on Teritori](https://teritori.gitbook.io/teritori-whitepaper/gno.land/introducing-gno.land-social-feed-v0.1#social-feed-moderation)\r\n","2023-10-19T01:50:00Z","ferrymangmi,zxxma,michelleellen","gnoland,dao,moderation,teritori"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["wyg-dongwon-shin","Who You Gno – On the Record with Dongwon Shin","\n*Who You Gno is intended to shine a light on the builders, contributors, and generally brilliant humans behind the tech. We’re excited to kick off this series with Dongwon Shin, the co-founder and CEO of one of Gno.land’s longest-contributing teams, Onbloc, a South Korean-based blockchain software company that builds key infrastructure and tooling for Gno.land*\n\nSince embarking on their Gno journey in late 2021, Dongwon and his team have been among the most active gnomes embodying the values of the Gno project: hardworking, passionate, honest, and humble, to name a few. You may already be familiar with Onbloc’s projects [Adena](https://adena.app/), [Gnoscan](https://gnoscan.io/), and [Gnoswap](https://github.com/gnoswap-labs) more about this can be found in [Onbloc's Hackerspace journey](https://github.com/gnolang/hackerspace/issues/29). In this interview, we’ll get the latest updates on these projects, hear about Dongwon the person, and learn more about what motivates him to be a gnome. Check it out.\n\n## Dongwon’s life before coding\nIt’s a cold November morning in Seoul, and Dongwon is in the office early after sleeping just a few hours. Speaking to him from Dubai, where “cool” is 30 ℃, it’s -1 ℃ in Korea. “I hope you’re keeping warm,” I smile, “Yeah,\" he laughs, “it’s not too bad.” Dongwon’s been in the industry since 2015 when web3 was still called “crypto,” ICOs were selling snake oil, and his compatriots were busy paying above the market price for bitcoin in a phenomenon called the “Kimchi premium.”\n\nAt the time, he was traveling the world as a professional e-sports gamer which saw him leaving Korea and living in San Francisco and L.A. for several years. “I had lots of tournaments to compete in, so I had to travel to many other countries,” he says, “while traveling, I learned about other cultures and people, and new experiences. It was really eye-opening, you know, it really helped make me who I am today.”\n\nAnd who is Dongwon today? \n\nAmbitious, driven, and one of the kindest, most genuine people you could ever meet. “I like challenges, and I’m very competitive,” he says. “I can't just do regular jobs. I get bored quickly, so I need to find something very competitive and hard that makes me stressed.” I point out that he’s in the right place, and he laughs. He explains that he used to spend an entire week, sometimes two, learning a game before a tournament, almost around the clock. “I had to put everything I have into winning that game, right?” He views working in web3 the same way.\n\n## The intersection between e-gaming and blockchain\nDongwong is clearly comfortable on the cutting edge in emerging industries that “are often looked down on,” like e-gaming and crypto. He takes great satisfaction in how they’ve both grown. “My parents were saying, 'Just go study,' while I was playing games, but e-sports has grown a lot. Right now, the industry is really big, and it's kind of the same with crypto.” He adds, “I like getting in early when other people are not interested and finding an opportunity there.”\n\nWhen looking to retire as a professional gamer, he found his home right away in web3, working with a blockchain consultant and the sports and entertainment-focused [Chiliz project](https://www.chiliz.com/), before launching his own blockchain consulting and development firm. “I didn't think I was going to be just a regular employee for a big company. So I wanted to start my own business,” he says.\n\n## Getting to Gno… Gno.land\nHow did Dongwon hear about Gno.land? \n\n“My co-founder, Peter, and I were long-time followers of the Cosmos ecosystem, and we found out that Jae was working on a new project called Gno.land in late 2021. We really liked the vision behind Gno.land, why he started, and what he wants to achieve. We value transparency, fairness, and censorship resistance, so we read all the documentation and his initial codebase and decided we should be part of his new initiative. We started Onbloc in early 2022.”\n\nDongwon didn’t know Jae personally, but he felt strongly aligned with his vision and what Gno.land aims to achieve. Also, his reputation as the founder of Tendermint and Cosmos preceded him. Dongwon’s co-founder, Peter, was also working on a project called Lunagram, a Cosmos wallet integrated with Telegram. Peter had fond memories of Jae, being very supportive of experimental projects, including his own, in the early days of Cosmos.\n\n## Building tools… Adena, Gnoscan, Gnoswap\nOnbloc has since become Gno.land’s most prolific contributor, launching the [Gnoscan](https://gnoscan.io/) block explorer and the [Adena](https://adena.app/) wallet, as well as creating tutorials and blogs to help onboard developers to Gno, and creating Gno.land’s first AMM DEX Gnoswap, the beta version of which is estimated for December this year. “Currently, the team is focused on developing Gnoswap, integrating [the realms and APIs](https://github.com/gnoswap-labs/gnoswap) with [the interface](https://github.com/gnoswap-labs/gnoswap-interface), enhancing the swap function and liquidity pools, and some additional features. We expect to launch the beta in about a month, so we’re quite excited!”\n\nAs for Adena, the defacto Gno.land wallet, “It's already production-ready, but we want to improve our UX, and UI to provide more secure ways of using a web3 wallet.” To achieve this, Onbloc is adding a feature called [Air-Gap](https://en.wikipedia.org/wiki/Air_gap_(networking)) which allows the wallet to be used in an offline environment, without the user needing to import their keys to Adena. “They can just use Adena as a broadcaster,” Dongwon explains. “I think this kind of feature is needed for enhancing security and educating people to use noncustodial products in a secure way.”\n\nOnbloc is also a [Q4 2023 grantee](https://test3.gno.land/r/gnoland/blog:p/funding-program-23q3) and will develop core Gno.land infrastructure in preparation for mainnet. “We are working on three key features,” Dongwon explains. “The first is contract interaction. So it's a way for a realm to interact with other realms. The second is porting essential Go packages to Gno, and the third is a multi-node testnet.” All in addition to Onbloc’s continued efforts on Gnoswap, Gnoscan, and Adena. “You’re keeping busy, then?” I ask. “All our hands are full now,” he laughs.\nI ask what he does in his free time and – in fact – whether he has any. “Not much,” he jokes, “but I like spending time with my son and playing board games together. He’s seven years old, and we are like friends.” Dongwon also likes to unwind by reading books when his son is asleep. One of his favorites is [*The Secret*](https://en.wikipedia.org/wiki/The_Secret_(Byrne_book)); he was “really inspired by the concept” when he was younger. I ask if he sees it working in his daily life and whether he believes he manifests what he wants into existence, “Definitely,” he replies without hesitation.\n\n## Dongwon’s conviction in Gno.land\nNot only is Dongwon working night and day, but he has bootstrapped his team from his own pocket to go all in on Gno.land. What makes his conviction so strong? “I truly believe that the Gno.land blockchain is the next generation of the blockchain industry. Gno.land is trying to invite web2 developers into web3 and providing all these developer-friendly tools so they don't need to learn a new language to get into the ecosystem. GnoVM, Tendermint2, everything is so transparent and simple.”\nHe believes Gno.land will be “one of the greatest experiments in the crypto industry” thanks to its fair rewards and contribution-based governance. “I'm really excited about this initiative, and all our team members are well-aligned to support this vision. We want to do our part to achieve the success of Gno.land.”\n\nI thank him for his time and ask if there’s anything he would like to add. He pauses for a moment and then says, “If you're building a dApp or looking for a new opportunity in a new ecosystem, I think this is your chance. I hope to see great developers and teams getting into Gno.land. Let’s make this ecosystem great together.”\n","2023-11-24T00:00:00Z","christina","whoyougno,onbloc,community,interview"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-6","The More You Gno: Gno.land Monthly Updates - 6","\n\nWelcome to the latest edition of The More You Gno, your regular source of updates from the Gno.land core team and contributor ecosystem. There’s a lot to cover this month, from a company engineering retreat to new core members and contributors. We’ve made progress across the board to fix important bugs and issues and provide additional features. There’s a new way to dynamically call realms, Gno.land’s tokenomics and governance are advancing, our standard library list is expanding, and our grantees are killing it with their deliverables. Without further ado, let’s dive in.\n\n## Gno Core Team Updates - TL;DR\n\nOnly got time to skim the updates? You’ll find the highlights in the list below. If you want to dive deeper into the topics, track our progress, understand the rationale behind our decisions, or explore the issues we came across, grab a coffee, kick back, and savor the full details.\n\n* **The Portal Loop** – Much of our focus over the past few months has been on the Portal Loop [(issue 1108)](https://github.com/gnolang/gno/issues/1108), which will make developing on Gno smoother, faster, and more intuitive. The Portal Loop will speed up deploying dApps and improve the UX for Gno.land devs.\n\n* **Dynamic Realm Caller** – We’ve added a new way to call realms dynamically so that dApps no longer have to manually import GRC20/721 tokens [(PR 1262)](https://github.com/gnolang/gno/pull/1262).\n\n* **DAO Structure \u0026 Tokenomics** – We’re close to finalizing the DAO structure of Gno.land and its tokenomics. There will be three main DAOs, GovDAO, EvaluationDAO, and SupportDAO. We’re exploring staking options for GNOT holders and working on transaction fees and gas.\n\n* **Gno Playground** – Gno Playground is an awesome way for developers to collaborate, share, and test their code. The full version isn’t ready yet, but we’re sharing the beta with anyone who wants to help us iterate and improve this week.\n\n* **Gno Standard Libraries** – In [issue 1267](https://github.com/gnolang/gno/issues/1267), you can find our current wishlist for Gno standard libraries. If you want to see what we have and what’s lacking, or you want to contribute, open an issue or a PR.\n\n* **Gno Language Server (Gnols)** – An implementation of the [Language Server Protocol (LSP)](https://microsoft.github.io/language-server-protocol/) for Gno, Gnols makes writing code simpler and works with several editors. Visit the [CONTRIBUTING.md file](https://github.com/gnolang/gno/blob/master/CONTRIBUTING.md#vim-support-with-lsp) to try it out.\n\n* **RustVM Implementation** – The RustVM implementation is almost ready and is in the debugging stages. We’re also looking at adding a Jit compiler and researching the topics of determinism and concurrency.\n\n* **Bytecode Go VM Implementation** – The Parscan project is progressing well toward completion of the spec. We look to provide support for interfaces in the interpreter by extending the standard reflect package, also to the benefit of the entire Go community.\n\n### Engineering Retreat\nGno core engineering team got together last month in our first company-wide retreat. It was an invaluable opportunity to work face-to-face, brainstorm ideas, code together, and fix several high-level concerns. We made many improvements to the technical aspects of the project, including major advances on the Portal Loop, and strengthened our alignment through team bonding activities, socializing, and having fun. \n\nWe made multiple bug fixes and resolved many of the issues that arose out of [GnoChess](https://github.com/gnolang/gnochess) development, and Manfred and the Onbloc team (who joined us on the retreat) demonstrated a new way to dynamically call contracts using dependency injection with a registry. This, combined with Golang's interface capabilities, can achieve a good balance between dynamism, explicitness, and security (including type safety). This pattern could enable massive DeFi applications when used with GRC interfaces. It could also support contract-based DAOs where features can be added later, opening the door to new design patterns around contract upgrades. Check out [PR 1262](https://github.com/gnolang/gno/pull/1262) for more details. \n\nIt was invaluable for everyone to get plenty of 1:1 time with Jae. Morgan was able to bring the Native Bindings topic ([PR 859](https://github.com/gnolang/gno/pull/859)) much closer to completion. This has been a recurring theme in our developer calls for the last few months as it’s a complex topic that aims to change how Gno can use Go code while still being understood by static analysis tools like gno doc. Michael got greater clarity over the DAO structure and GNOT tokenomics, Milos was able to merge [PR 546](https://github.com/gnolang/gno/pull/546), after many months of effort, which adds file-based transaction indexing, and Thomas created instructions for getting started with the Gno Language Server (gnols), to give just some examples. It was productive and enjoyable and unblocked many issues. \n\nAiB engineers were also at the retreat, Zooma from Teritori, and Dongwon, ByeongJun, and Ray from Onbloc, creating plenty of opportunities for interesting discussions and showcasing our work. We also welcomed new core members Dylan and Danny to the team. Dylan is a senior software engineer, and Danny is supporting DevEx. We enjoyed meeting and hacking together with like-minded people and would like to do it more often with a broader audience. How about a Gnome contributor festival next year? Stay tuned.\n\n### Gno.land DAOs and Tokenomics\nThroughout the retreat and ongoing, we’ve made major advances to the DAO structure for Gno.land and the tokenomics of the chain. We’re still hammering out the final details, but we’ve decided on three main DAOs – GovDAO, EvaluationDAO, and SupportDAO – that will work together alongside other domain-specific DAOs, such as EngineeringDAO or ProjectsDAO, making Gno.land more decentralized over time. \n\nThe multi-tiered GovDAO will be responsible for voting on all decisions that affect the chain, such as parameter changes or validator acceptance/denial. GovDAO members will assess new contributors to the chain and allocate them a score and corresponding membership tier. EvaluationDAO will assist with specific contributions, lending its expertise and critic reviews as needed. SupportDAO will provide knowledge-specific services such as HR, marketing, and finance.\n\nRegarding transaction fees, we're exploring something similar to how Ethereum deals with gas in its EIP 1559 update. Essentially, a combination of comparing a new block’s size with the last block to gauge demand and some small parameters we’re looking at. We’re also experimenting with staking alternatives where contributors can stake their tokens to support certain projects in return for staking rewards. It’s still early days, so watch this space. We’ll be releasing more details soon. \n\n### Gno Playground\nGno Playground is a simple web interface that lets you share your code, run unit tests, deploy your realm and package, and execute functions in your code using the repo for a smoother and more collaborative developer experience. We’re excited to release Gno Playground out in the wild later this month in a soft launch set for November 28. If you’re interested in testing it out, head over to our Discord channel. We’re looking for feedback and help to identify bugs and improve the UX before its full launch in the new year. It will be interesting to see how people interact with the Playground and how they use it so we can iterate and attract more gnomes to our growing community.\n\n### The Portal Loop\nThe Portal Loop is an effort to create a continuously-deployed staging testnet to be hosted on the official [gno.land website](https://gno.land). The testnet will be reset at each commit on our repository, but it will re-play all the transactions from its previous version, dropping any that might fail following breaking changes in the code. The Portal Loop will provide a central place where you can experiment with the latest Gno.land updates, resolving the problem our existing testnets have faced (becoming stale only a few months after their launch) while also paving the way for building DAOs and on-chain Game of Realms and Proof-of-Contribution systems. \n\nWithin the Portal Loop efforts, we’re also building systems to more efficiently iterate locally on your Gno realms, similar to the previously described testnet. The Portal Loop will help to create an iterative cycle focused on development, testing, and feedback, enhancing local development and the Gno.land website. As developers are discovering, when building dApps like GnoChess, GnoMobile, or Flippando, they run into issues with the repo, GnoVM, and client libraries when developing locally.\n\nThe Portal Loop will enable much quicker feedback so we can iterate, uncover, and fix problems faster. Devs will get a greatly improved UI, with UX contributions and issues much easier to resolve, and the same CI/CD experience as web2 applications, where each time something is published on Git, they get instant feedback on how it works in staging, not only in terms of code but also in terms of data. Stay tuned, the Portal Loop is coming soon!\n\n### Standard Library Wish List\nThe standard library wish list in [issue 1267](https://github.com/gnolang/gno/issues/1267) is intended to be a starting place for anyone who wants to add new standard libraries to Gno. It's an opinionated collection of libraries that we would like to see added. So, if you see something missing that you’d like added to our standard libraries, leave a comment explaining your reasoning. If you want to port over a standard library from the list, make an issue for it and assign yourself, or if you can do it quickly, make a PR referencing the issue. You can see the global status of our standard libraries (as compared to Go) on our [Go\u003c\u003eGno compatibility document](https://github.com/gnolang/gno/blob/d421b963aed7f7c3ba3718edfc6fbd787fa8f0dd/docs/reference/go-gno-compatibility.md).\n\n### Dreaming with SOGNO\nThe Sogno project is a [dream](https://www.wordreference.com/iten/Sogno) Morgan has about improvements he plans to make on GnoVM. From his experience working on GnoChess, he found that many features were lacking that would have improved the workflow, for example, an improved debugging system, enhanced representation of the values within the VM, having maps as sortable data structures, and adding reflection. Morgan plans to work on this project on the side as a fork when he has time, so Sogno won’t be merged into the master branch for now. If you want to check it out and see if you can contribute, visit the [hackerspace PR 44](https://github.com/gnolang/hackerspace/pull/44).\n\n### The Future of the Gno Language Server (Gnols)\nThe [Gno Language Server (gnols)](https://github.com/gno-playground/gnols) is an implementation of the [Language Server Protocol (LSP)](https://microsoft.github.io/language-server-protocol/) for the Gno programming language. It is similar to the equivalent “gopls” project for Go, as they can be plugged into your code editor through extensions and allow you to access handy features, such as autocompletion, formatting, and compile-time warnings/errors. Gnols makes writing code simpler, working with several editors to suit your preferences. To try it out, visit the [CONTRIBUTING.md file](https://github.com/gnolang/gno/blob/master/CONTRIBUTING.md#vim-support-with-lsp), which contains instructions to get you started. Our current documentation targets Vim, Neovim, and SublimeText, but can likely be used with any editor that supports LSP. Feel free to contribute to improving Gnols and adding more features. It’s well-written, and simple to dive into the code and add more capabilities.\n\n### RustVM Implementation\nPetar continues progressing on the RustVM implementation and has almost finished, apart from a few bug fixes. As the design is now complete, he will enter the testing stages. He is also looking at how to add a Jit compiler to the current design. Petar was initially concerned that the garbage collector might have presented serious issues, but this has turned out not to present a problem. Adding a Jit compiler will require a lot of work (at least six months) to support everything in the language, but it should be possible.\n\nPetar is also looking at implementing concurrency the way it is in Go to have a fully functional virtual machine as it is in the spec. This would likely attract more external contributors to developing the VM. One advantage of Rust is that, with the concurrency model, there is already an extensive library called [Tokio](https://tokio.rs/) which he can use. Petar stresses that this isn’t easy, but he believes it’s achievable, at least as a research topic around determinism and concurrency.\n\n### Go Bytecode VM Implementation\nMarc continues to develop Parscan, another bytecode VM, but entirely based on the Go runtime, with the advantage of reusing the type-checking system, concurrency model, and memory management already part of the existing Go runtime. In the last month, the support for all missing declaration statements (constants, variables, and types) was added in the code generator.\n\n## Grantee and Ecosystem Updates\nOur ecosystem partners and grantees are working flat out on their contributions. We’re close to seeing the on-chain memory game Flippando launch, Adena and Gnoswap are incorporating some major new features, Zack’s released another informative tutorial as part of the Go to Gno series, and we’ve received several new grant proposals as well. We’ve even welcomed a new contributing team, Varmeta, to the fold. Scroll through the details below.\nTL;DR?\n* On-chain memory game Flippando is coming soon\n* Gnomobile is almost complete and will be receiving a rebrand soon\n* Gnosocial will allow devs to experiment with social media dApps\n* Experiment with content moderation using the ModerationDAO or create your own DAO\n* Gnoswap AMM DEX beta will launch in December\n* Adena to implement new ‘Air-Gap’ feature\n* Varmeta is working on Gno.land Unity SDK to make Gno more accessible to game developers\n\n### Dragos\nDragos has been working on porting his on-chain memory game Flippando from Solidity to Gno, and we’re looking forward to playing it soon after seeing an awesome demo earlier this month. When you play Flippando, you uncover a matrix of matching visual symbols. There are 2 levels of difficulty (matrix made of 16 tiles or 64 tiles). For the launch, Dragos aims to have visual symbols containing basic colors, dice, hexagrams, or various gradients. Once you’ve matched all the pairs and completed a matrix, you mint an NFT that can be assembled as artwork on-chain and traded in a marketplace. Dragos is currently looking at the initial tokenomics for Flippando, with a fixed supply of 1 billion and no airdrop distribution (more details soon). \n\nDragos has been a mobile app developer for over 10 years, with an interest in blockchain for around seven years. He enjoys working with Gno, although having to reset the chain and redeploy programs each time he makes a change was a challenge. The Portal Loop solves these issues in local development and will allow him to deploy Flippando sooner. As part of the work for Flippando, Dragos also added [PR 1309](https://github.com/gnolang/gno/pull/1309) to improve our GRC721 implementation]. He is also applying for a grant to port his project management system on-chain for Gno, and he gave us a [demo](https://drive.google.com/file/d/1eJGyATHhEzletWwQ4Xt_9ON7L231Yvow/view). An on-chain project management tool will be essential for organizing the DAO system, focusing on our team’s needs, organizing tasks, setting goals, and more. Keep up with Dragos’ progress by visiting his [hackerspace](https://github.com/gnolang/hackerspace/issues/33).\n\n### Berty\nBerty has been powering ahead with Gnomobile (which will soon receive a new name to better reflect its functionality), Gnosocial, and Gno core. Some highlights include significant progress on the GRPC interface (see [demo video]https://www.loom.com/share/d1cef60199c0487e86deab2a9e61d61c). As the interface to Protobuf has many more data types available than the interface to the language bridge, GRPC greatly simplifies the app and improves the UX. The API is almost complete and now includes wallet functions, such as creating an account and restoring an account from the recovery phase, and an event stream when calling a realm function [(demo video available here)](https://www.loom.com/share/42f2dcb0b4a34f77a95a0f8012e4b52b).To help developers, Gnomobile also includes example apps. Here is a [demo video](https://www.loom.com/share/41a20a764f0f4caf91f068b62e1f16c4) of the latest minimal hello app.\n\nBerty created [PR 1235](https://github.com/gnolang/gno/pull/1235) relating to Amino. They start with a Go struct and add comments explaining all the fields. Previously, when they ran Amino and generated a Protobuf structure, all their comments disappeared. This PR allows them to preserve the comments. They also created [PR 1213](https://github.com/gnolang/gno/pull/1213) since Amino should create a Protobuf structure where the fields follow official naming conventions. Thanks to help from the Gno devs, these PRs are merged.\nBerty is also focused on building a decentralized social media application using the Gnomobile framework, which is almost complete. The aim is to create a testbed where dApp builders can see how their implementations integrate and function with web2-like social media features, opening the door to interesting experiments such as DAO collaboration and content modification. Berty is building a decentralized Twitter-like application and plans to finish it in six months. Check their progress on their [hackerspace here](https://github.com/gnolang/hackerspace/issues/28) and look for more upcoming demos.\n\n### Teritori\nTeritori has been focusing on Escrows in the past couple of months, aiming to make improvements that facilitate on-chain project management. The team is also iterating the Moderation DAO and has identified a need for a conflict solver module to call an external authority to solve a conflict between two parties (for example, the buyer and the seller). They have called this module the Conflict Solver Module and integrated several options like Justice DAO (composed of humans) or any realms (e.g. GnoChess) to solve the conflict. They are researching work on VRF to implement randomness so that the module selects a person (or group of people) with no conflicts of interest in the issue. [PR 11](https://github.com/TERITORI/gno/pull/11/files) provides more details. A true randomness function will also be handy for the Flippando game that doesn’t currently rely on true randomness. \n\nIn other news from Teritori, the moderation DAO is live! You can head to the [Teritori site](https://app.teritori.com/feed?network=gno-teritori) to play around with it and even try deploying your own DAO, creating a user profile, and adding a social feed. The team has deployed V1 of a “Soundcloud-like” app on the [Gnosocial feed](https://app.teritori.com/feed?network=gno-teritori) in which you can listen to music while browsing features, publish your own music as an artist that appears on your profile, comment on tracks, tip artists, and more. Keep updated with Teritori on their [hackerspace here](https://github.com/gnolang/hackerspace/issues/7).\n\n### Zack Scholl\nOur resident tinkerer Zack gave a workshop last month as part of his “Go to Gno” series called [Go to Gno: ByteBeat - Generating Audio with Smart Contracts](https://www.youtube.com/watch?v=lmmUIEHhdqA). This is a really interesting tutorial on how to build Bytebeat (a minimal programming language for synthesized music) with smart contracts and follows on from his microblogging workshop. Be sure to check it out. If you want to hear more about Zack, you can also watch [Getting to Gno with Zack Scholl](https://www.youtube.com/watch?v=LgXa7QCdxdA\u0026t=1258s), a Fireside Chat series that talks about contributors’ work, lives, and motivations to be on the Gno.land journey with us.\n\n### Onbloc\nAs always, the Onbloc team has been busy! Over the past few weeks, they have been working on extending the functionality of Gnoswap, integrating APIs and realms with the interface, improving the governance page UI, and integrating the Adena wallet. Onbloc expects to launch the beta of Gnoswap next month, and we’re super excited to see it in action. To improve the UX and UI of Adena and make the wallet even more secure, the team is implementing a feature called Air-Gap which allows the wallet to broadcast transactions signed from an offline environment without the user needing to import their keys to Adena. Onbloc has also started a discussion around ideas to improve the usability of QR Codes for secure data transmissions between offline signers and watch-only wallets in [Issue 1375](https://github.com/gnolang/gno/issues/1375). We’ll keep you updated on the work here. You can also find more information on Onbloc’s [informative blog](https://medium.com/onbloc). \n\nAs well as developing core tooling for Gno, Onbloc is working on Gno core to help us build important functionality. The team welcomed a new hire, Lee ByeongJun as a core engineer and to help with work on three core areas: contract interaction (enabling realms to interact with other realms), the multinode testnet, and porting essential Go packages to Gno. You can find more details and keep track of everything Onbloc is working on in their [hackerspace issue here](https://github.com/gnolang/hackerspace/issues/29).\n\n### Varmeta\nWe’re excited to welcome a new contributor Varmeta to Gno.land. Varmeta was founded in 2020 to focus on blockchain and virtual reality/augmented reality technologies and has grown from a team of three to over 40 engineers. Varmeta is excited by the vision behind Gno.land and its philosophy for rewarding developers. The team is committed to supporting Gno’s success by providing various applications for the ecosystem, starting with the Gno.land Unity SDK to make blockchain more accessible to game developers. Track Varmeta’s progress on their [hackerspace here](https://github.com/gnolang/hackerspace/issues/43).\n\n### Gno @ Devconnect Istanbul 2023\nGno.land core team members organized a small, unofficial meetup in Istanbul during Devconnect week from November 13-17. The engineering-focused meetup was accompanied by a Happy Hour and snacks, where attendees got the chance to learn about Gno.land in an informal way and how they can easily develop dApps in Gno, as well as contribute to the project.\n\nThat's all for now! Be sure to check back again with us for the next edition of The More You Gno to keep up with all our progress. Do you want to contribute to Gno.land's monthly updates? If you're building on Gno.land and want to highlight your development, project, event, or idea, let us know, and we'll include your contribution.","2023-11-29T00:00:00Z","christina","gnoland,ecosystem,updates,gnovm,tm2"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["bgl-poc1","Building Gno.land – Next Generation Smart Contract System","\n\n*Disclaimer: The Building Gno.land series aims to share the core concepts of our platform, mission, and tech stack, providing a snapshot of a current state on our builder’s journey. New episodes may deprecate previous ones, but no editions will be modified at any time. We encourage you to follow along as we create the rails for a more transparent and accountable society, and we welcome feedback and contributions to the repo.*\n\n## I. What Is Proof of Contribution (PoC)?\n\nGno.land is secured by a novel consensus mechanism that makes our platform unique—Proof of Contribution (PoC). PoC prioritizes fairness and merit, rewarding the people most active on the platform and revolutionizing the concept of open-source rewards. By removing the voting power associated with being wealthy (holding tokens in Proof-of-Stake (PoS) networks or amassing mining hardware in Proof-of-Work (PoW) networks), PoC restructures the financial incentives that tend to corrupt blockchain projects in the long run and rewards contributors fairly for their work based on their expertise, commitment, and values. \n\nGno.land contributors receive rewards and voting power according to their contribution level. These rewards increase as they make additional contributions, gain expertise, and are promoted up the Gno.land governing DAO’s (GovDAO) tier levels by higher-level contributors. So how does PoC work, what are its core features, and how does it lend security and decentralization to the platform? \n\n### Prioritizing Fairness and Alignment \n\nProof of Stake (PoS) was a monumental leap forward for the blockchain industry, solving the energy-intensive requirements of Proof of Work (PoW) and enabling blockchains to scale for broader adoption (thanks to its minimal carbon footprint and faster throughput). However, like PoW, PoS has some disadvantages. For example, in PoS networks, participants receive rewards based on how many tokens they stake, which means their incentives for working on the chain are often purely financial. Validators accumulate vast net worths and don’t always hold values that align with the core development of the chain. \n\nSince validators are crucial in securing PoS networks, they should be paid fairly for their work and encouraged to contribute more. However, validators should not be purely financially (and certainly not politically) motivated, taking up competing positions and launching political campaigns to convince token holders to stake with them. This type of lobbying affects all aspects of the chain’s development—from governance to technical upgrades—and can lead to factionalism and misalignment. \n\nPoC makes the system fairer and more sustainable, ensuring participants are aligned and take actions that benefit the Gno.land community and the broader ecosystem. That’s why (unlike PoS) contributors receive rewards based on their contribution effort (tier level) rather than how many tokens they stake. They are thus incentivized and recognized for the quality of their work, ideas, and alignment, driving participation and active engagement. Governance is allocated to the people most likely to care for the ecosystem’s long-term success—the contributors who have spent the most time working toward it—from open-source developers to video creators and everyone in between.\n\n### Rethinking Financial Incentives \n\nFor long-term security and sustainability, PoC emphasizes project principles and values over monetary gains, replacing standard token incentives with a system that separates voting power from token ownership. Two reward systems are currently being considered (in addition to a hybrid system). For the first, contributors receive WORX units that weigh the amount of GNOT tokens (the native Gno.land gas token) earned each month. Each member of the same tier receives the same amount of WORX. At the end of the month, the total each member earned is divided by the total amount of WORX distributed that month to calculate a percentage. This percentage represents the percentage of Gno.land fees earmarked for contributors that each member will earn in GNOT. WORX will likely be cleared each month to prevent cumulative, exponential reward exploits over long periods of time. \n\nFor the second, each tier level simply receives an amount of GNOT each month fixed to a USD value, similar to a salary. This would be combined with risk management and caps per tier level in order to promote long-term sustainability based on Gno.land fee generation. A hybrid of this system is also possible, either rewarding contributors of lower tiers one way and higher tiers the other or using both systems in tandem based on predefined conditions. This will be explored further in future tokenomics articles, models, and documentation.\n\nRegardless, WORX units are not transferable, will not be listed on exchanges, and hold no monetary value. WORX units are more like shares that represent value provided by contributors and allow their work to be quantified compared to other contributors/tier levels. It’s important to stress that GNOT tokens do not influence governance on the platform in any way. Voting power is earned through contributions and distributed according to contribution effort, with each member of the same tier representing equal voting power that increases with their tier level. This creates a network of highly aligned contributors who care deeply about the platform they are building and strive to improve it.\n\nGNOT, the native Gno.land gas token and the gas token of the Gno.land ecosystem, will be distributed via airdrop to qualifying ATOM stakers. It will also be available for purchase after that point (*more on Gno.land’s airdrop and tokenomics coming soon*). GNOT is used to pay all fees associated with the network and beyond, including transfers, IBC, ICS, and contract interactions, giving holders the chance to earn rewards from the economic activities of Gno.land.\n\n### What Makes a Good Contribution?\n\nWORX and/or GNOT can be earned through different types of contributions—not only coding and development expertise—but also through non-technical contributions, such as community building, governance involvement, constitutional proposals, teamwork, media creation, etc. The core focus is on alignment, not necessarily specific tasks. For example, an accepted proposal or merged code will raise or at least maintain the contributor’s tier level, allowing them to receive rewards during their time working between submissions. However, a proposal or code that has displayed a very high level of effort, detail, and aligned values (but is not merged) will also be considered in any proposals regarding contributor promotion.\n\nThis system allows the ecosystem to show appreciation for diverse forms of contributions and ‘useful failures’ that bring us closer to the solutions we adopt. It is designed to foster engagement, creativity, and collaboration while encouraging anyone aligned to contribute to growing the Gno.land chain and community. \n\n### How Are Contributions Assessed?\n\nThere is a strong human element to deciding what makes a good contribution, requiring knowledgeable human judges to exercise discretion. As such, contributions won’t be templated by default or rewarded automatically but assessed through Gno.land’s governing DAO, GovDAO. GovDAO is responsible for development and governance and is organized into tiers, as discussed above.\n\nGovDAO members review, measure, and curate contributions, and the tokenomics of GovDAO incentivizes members to be effective and unbiased evaluators. They engage in discussions and assess contributions based on effort, time, and other relevant factors/metrics that contributors will have stored in their profiles. The decision-making rationale is transparent and visible through on-chain forums. Again, contributors are assigned a tier level and receive a corresponding reward each month according to their tier. As contributors join GovDAO, the DAO grows, giving Gno.land decentralization efficiency and a high Satoshi score. \n\nGovDAO is assisted by a network of knowledge-specific DAOs, such as an Engineering DAO, a Support DAO, an Operations DAO, and the EvaluationDAO, which comprises a trusted group of high-reputation contributors that help assess specific contributions. This enables secure collaboration and seamless integration (*more on Gno.land’s network of interconnected DAOs coming soon*.) \n\n### Sybil-Resistant and Secure\n\nIn addition to being fairer, more aligned, and sustainable, PoC is Sybil-resistant by design. In blockchains, a Sybil attack is where one or multiple attackers multiply their presence and influence by creating fake identities to sway major network decisions (for example, including malicious blocks). In terms of PoS, the Sybil resistance is purely monetary (people need to stake real money to get power), so an attacker that wants to carry out a Sybil attack on a PoS network needs to lock at least as much stake as that locked by honest validators.\n\nPoC minimizes risks of Sybil attacks, takeovers, and alliances as the community vets every person who is given any power or sway in the network (including validator power) through the DAO, so at no point can anyone \"spoof\" identities and regain major sway. Moreover, Gno.land is built and secured by the merit and effort put into the project, as opposed to how many tokens someone can buy, rethinking financial incentives and making the platform Sybil-resistant and secure.\n\nThrough fairer rewards, restructured incentives, resistance to corruption and Sybil attacks, and a strong appreciation for all contributions, Gno.land is designed to be sustainable and fair. A censorship-resistant platform built, owned, and secured by a growing, aligned community for many generations to come.\n\n*I. What Is Proof of Contribution? is the first in a series of articles to dive deeply into the philosophy, vision, mechanics, and work involved in developing a new consensus mechanism for the next generation of smart contract systems. Look out for subsequent editions and additional Building Gno.land series, and let us know what you think! Got questions? Join the Gno.land [Discord](https://discord.com/invite/S8nKUqwkPn) or follow us on [Twitter/X](https://x.com/_gnoland)*.\n","2024-01-10T10:51:00Z","","building-gnoland,gnoland,proof-of-contribution"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-7","The More You Gno: Gno.land Monthly Updates - 7","\n\nWelcome to the latest edition of *The More You Gno*, your regular source of updates from the Gno.land core team and contributor ecosystem. After a well-deserved rest during the holiday break, we’re kicking off 2024 with renewed energy and plenty of exciting initiatives, including a new staging testnet (the Portal Loop), the official Gno.land documentation page, several merged PRs (including native bindings!), and many updates across the board. Dive in to find out what we’re working on and what our ecosystem partners and grantees have been up to.\n\n## Gno Core Team Updates TL;DR\n\nShort on time? Skim the highlights from the core team in the list below. You’ll find additional details in the next section if you want to explore any topic in greater detail.\n- **Native Bindings** - If you’ve been following our journey or experimenting with the platform, you’ll hear virtual champagne pops as Morgan’s ongoing work with native bindings is finally merged [PR 859](https://github.com/gnolang/gno/pull/859).\n- **Gnodev** - Thanks to Guilhem’s `gnodev` initiative [PR 1386](https://github.com/gnolang/gno/pull/1386), you can now create and develop contracts with a single command.\n- **Gno.land Offical Docs** - Check out [docs.gno.land](https://docs.gno.land) for how-to guides, getting started, and an overview of key concepts of the platform.\n- **Effective Gno** - Taking inspiration from *Effective Go*, Manfred’s begun listing common patterns and examples of the differences between Gno and Go.\n- **Assignment in GnoVM** - Jae is working on approaches to fixing assignment in the GnoVM and issues that deal with persistence [(issue 1326)](https://github.com/gnolang/gno/issues/1326). \n- **Portal Loop** - The [Portal Loop](https://portal.gnoteam.com) has been released on a staging domain and is being tested.\n- **Roadmap** - We’re working on a fully-fledged Gno.land roadmap and will share a detailed DAG and important goals and milestones with you soon.\n- **Tendermint2 Update** - There are several PRs aimed at removing the dependencies between Tendermint2 and GnoVM.\n- **Gno.land Tokenomics** - We continue to make progress in defining the structure of Gno.land’s DAOs and the design of reward schemes for contributors.\n### Native Bindings (PR859) Has Been Merged\n[PR 859](https://github.com/gnolang/gno/pull/859) (native bindings) was submitted by Morgan in May 2023 to improve calling Go code from Gno standard libraries, all while improving `gno doc` documentation for standard library functions. Native functions are _declared_ in Gno code, but their definition (the underlying code) only exists in Go: this is similar to how Go and many other systems languages implement assembly functions. Overall, the addition will now allow us to better support precompilation (transpiling Gno code to Go) for all Gno-specific standard libraries, like [`std`](https://docs.gno.land/reference/standard-library/std/address/), and have a system for defining such functions that is transparent to code analysis tools like `gno doc` and `gnols`.\n### Gnodev Has Been Merged\n[PR 1386](https://github.com/gnolang/gno/pull/1386) (`gnodev`) has been merged. Gnodev is a tool to locally develop Gno realms which automatically re-deploys your contracts when you change the files, similar to JavaScript frameworks `npm run dev`. There are some additional features being worked on to improve the experience, including browser hot-reload (for the full front-end JavaScript experience!)—and Gno core developers who have worked on realms all agree that thanks to `gnodev`, they can finally stop visiting their therapist every week. Play around with it, and let us know how you get on. There may be a few bugs still and Guilhem is happily accepting feedback.\n### The Gno.land Official Documentation Page Is Live\nWe’re excited to have the Gno.land Official Documentation page live on the [https://docs.gno.land](https://docs.gno.land) domain. This will always be a work in progress as we expand the docs, make iterations to existing issues, and refine some of the core concepts, but it’s an excellent resource for anyone wanting to find out more about Gno and for onboarding new developers to the platform. A big thanks to the Onbloc team, whose developer portal was a huge inspiration for this. We’re looking for feedback, so leave your reviews and let us know where the docs can be improved and what else you would like to see.\n### Effective Gno\nManfred has been working on a document called [Effective Gno (PR 1000)](https://github.com/gnolang/gno/pull/1000), which takes inspiration from *[Effective Go](https://go.dev/doc/effective_go)* and will become an important reference document for Gno devs to explore common patterns and crucial differences in how we program compared to Go. We’ll be iterating on this as we progress, but you can already find plenty of examples. If you’re just getting into Gno and coming from a Go background, this is a great resource. Read this document and provide some comments if you have any. \n### The Portal Loop Beta Is Live\nThe Portal Loop Beta has been released on a staging domain, and you can check it out now at [https://portal.gnoteam.com](https://portal.gnoteam.com). The Portal Loop will replace the Gno.land website once we’ve finished squashing bugs and adding features. We’re still testing it and have identified several issues. For example, from the last three merged PRs, only one triggered a redeploy when we expected two or three deploys. We will also add a faucet.\n\nAs we continue to evolve the Portal Loop out of its early development stages, transaction volume and general activity will increase. However, currently, there are insufficient transit testing transactions. One of the tasks we want to do to prove that the Portal Loop is working well enough is to write a kind of monitoring-oriented oracle that will try to make transactions, perhaps incrementing a counter every minute. We’re looking for help writing a script or a daemon for this oracle, so let us know if you want to contribute to [issue 1443](https://github.com/gnolang/gno/issues/1443). Once the Portal Loop is finished, we will focus on testnet 4.\n### Assignment Issues in the GnoVM\nMorgan came across a bug [issue 1326](https://github.com/gnolang/gno/issues/1326), which returned an error about an [“unexpected unreal object”](https://tenor.com/es/view/cranizox-gif-8576622211330078986) when assigning a local variable to a dereferenced global variable in the GnoVM. Jae has been spending some time working on approaches to solving this and fixing assignment that will also work for saving escaped objects that don't have a parent (like variables whose pointers are referenced on a persisted object). This is a tough one to figure out, so if there are any other VM issues that deal with persistence and detached parentless objects, now is the time to add them to Jae’s plate. \n### An Update on Tendermint2\n[PR 1483](https://github.com/gnolang/gno/pull/1483) has the same goal as [PR 1438](https://github.com/gnolang/gno/pull/1438): to make Tendermint2 completely independent of GnoVM and Gno.land. This continues a project started many months ago to separate Gno into three separate components: the Tendermint2 consensus engine, the Gno programming language and VM, and Gno.land, the blockchain combining both together. This way, we’re working towards making it possible to build other blockchains that use Tendermint2 (like AtomOne!), the GnoVM, or both!\n### Gno.land Engineering Retreat\nIn the last *The More You Gno*, we covered the Gno.land and AIB company-wide retreat, an invaluable opportunity to work together, code together, and get to know our peers outside of work. It was such a success that the Gno core dev team held another retreat in December in Rouen, France, where many of the above issues and PRs were tackled and merged. We look forward to more productive and frequent face-to-face meetings in the year ahead.\n### Gno.land DAOs and Tokenomics\nWith the input of Manfred, Jae, and the rest of the team, Michael continues to make advancements on Gno.land’s system of DAOs and tokenomics. One key change since the last edition is that the WorxDAO (responsible for governance and all issues related to development in Gno.land) will now be known as the GovDAO. The DAO will likely have seven tiers but initially launch with three or four. The main benefits of moving up tiers are increased voting power, increased monthly rewards, and the authority to promote members from lower tiers. GovDAO will be assisted by WorxDAO, which will encompass several different sub-DAOs, such as engineering, funding, and projects. \n\nWe’re currently exploring different reward systems for contributors, whereby each member of the same tier level will receive the same amount of rewards, either directly or indirectly, in the GNOT native gas token or USD, in a type of salary-based scheme. We may also elect to distribute rewards based on a contribution/work “hash difficulty” (total number and tier split of active contributors that month). We may also adopt a hybrid of these two models. \n\nMichael is also working on a bounty system to make Game of Realms (GoR) more accessible and evaluating contributions easier for judges. High ranking GoR competitors will likely receive Gno.land tier levels based on their leaderboard placing in addition to ATOM rewards. It’s important to note that these discussions are ongoing, and the information here may be deprecated. \n### Making Testing Faster\n\nThanks to Petar, [PR 1417](https://github.com/gnolang/gno/pull/1417), we have improved the entire VM testing suite runtime by around four minutes, which is an incredible achievement. We just need to refactor some test scenarios that are not very concurrent-friendly, but this PR makes interacting with the platform so much easier.\n\n### Bug Fixes and Miscellaneous Items\n\nThanks to Joon from Onbloc, we were able to add support for octals without 'o' (check out [PR 1331](https://github.com/gnolang/gno/pull/1331) for more details), and thanks to Dragos [PR 1309](https://github.com/gnolang/gno/pull/1309), we extended the GRC721 interface so that it now supports setting a token URI. These are both extremely welcomed contributions, and we appreciate our ecosystem partners.\n\nFrom the core team, a special shout out to Dylan for killing it fixing bugs, and getting many PRs ([PR 1451](https://github.com/gnolang/gno/pull/1451), [PR 1315](https://github.com/gnolang/gno/pull/1315), and [PR 1305](https://github.com/gnolang/gno/pull/1305), to name a few) merged over the last few weeks. Props also go to Marc for [PR 1177](https://github.com/gnolang/gno/pull/1177), which has just been merged, which fixes append in certain key situations. We’ve also welcomed a new security engineer, Kristov, to the team.\n\n## Grantee and Ecosystem Updates\n\n### Onbloc\n\nOnbloc has been on a roll, giving us an internal demo of Gnoswap beta just before the Christmas break and a public demo of its awesome Pool Incentivization feature during the last contributor sync call. With Pool Incentivization, anyone can add extra rewards on top of swap fees for LP stakers. This will help bootstrap initial liquidity for new-coming projects by attracting liquidity providers until sufficient organic trading volume is secured. Onbloc is also actively developing Adena’s Airgap feature and has improved the sign-in flow for security enhancement along with some refactoring. There will be a demo coming up in the next few weeks. Onbloc will also be researching airdrop trends and aiming to identify some of the most coveted DEX features users want to see for Gnoswap to streamline the onboarding process.\n\nRegarding Gno core, Onbloc core dev Byeongjoon Lee has developed a JSON parser for Gno, giving us a live demo during the last contributor sync. This allows the conversion or accessing of data from contracts in the JSON format, which will improve the Gno developer experience. His code is currently under review by the core team in [PR 1415](https://github.com/gnolang/gno/pull/1415). Dive deeper into Onbloc’s Builder Journey in the [hackerspace issue 29](https://github.com/gnolang/hackerspace/issues/29).\n\n### Teritori\n\nTeritori continues the challenging work of developing Gno Project Manager, a web app that allows anyone to create, fund, review, or manage projects fully on-chain. During the last contributors' call, the team gave a demo of the work achieved so far, in particular regarding the escrow system and completing project milestones so contributors can be paid once each one is completed rather than having to wait until the project finalization. \n\nGno Project Manager is a complex goal, and the team has run into some issues with edge cases they hadn’t bargained for in the relationships between grantees and funders. The team is looking for feedback and help identifying edge cases, so if you have any in mind, let them know. Teritori is also working on the conflict solver module and improving the social feed on [https://app.teritori.com/feed?network=gno-teritori](https://app.teritori.com/feed?network=gno-teritori), as well as providing more detailed documentation on their work, which they’ll be releasing in the coming weeks.\n\n### Berty\n\nThe Berty team has been busy working on GnoSocial backend implementation. The initial feature set has been implemented [here](https://github.com/gnolang/gnosocial/blob/main/realm/public.gno), including posting and replying to messages and reposting threads. You can keep up with Berty’s journey on GnoSocial in [hackerspace issue 51](https://github.com/gnolang/hackerspace/issues/51), which contains many issues and PRs, such as implementing calls, running tests, and fixing bugs. We’re super excited about pushing the limits of scalability with Berty’s decentralized social platform, and we’ll be looking forward to more demos in the coming weeks.\n### Dragos\nDragos has successfully launched the Flippando game, and you can try it out on the [testnet here](https://gno.flippando.xyz/flip). If you haven’t been following the progress, Flippando is an on-chain memory game that you can play with your choice of styles, such as dice, colors, and hexagrams. Once you successfully complete a matrix, you can mint the end result as an NFT, which can later be assembled into larger, more complex NFTs to create digital artwork. You can find out more about the game, its creator, and the official roadmap on the site. We’ll also release a blog post soon from Dragos sharing his experience porting Flippando from Solidity to Gno, so stay tuned!\n### Varmeta \nVarmeta’s update was brief this week since the contributor sync call ran over. We look forward to hearing more about the team’s progress in developing the Unity SDK for Gno next time. You can read more about it on Varmeta’s [hackerspace issue 43](https://github.com/gnolang/hackerspace/issues/43).\n\n*Do you want to contribute to Gno.land's monthly updates? If you're building on Gno.land and want to highlight your development, project, event, or idea, let us know, and we'll include your contribution. That's all for now! Keep track of our progress by following our socials [Twitter/X](https://twitter.com/_gnoland) and [Discord](https://discord.com/invite/tF2X8M6cVj) and watch out for the next edition of The More You Gno in a few weeks.* \n","2024-01-22T00:00:00Z","christina","gnoland,ecosystem,updates,gnovm,tm2"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["porting-flippando-gno","5 Things I Learned While Porting Flippando From Solidity to Gno ","\n\nLast year, while visiting Seoul, South Korea, I decided, on a whim, to sign up for a hackathon called Glitch. The project I was going to present was a tiny little game, written in Solidity, called Flippando. It started as a weekend project to help me learn Solidity (I had no prior experience with this language). To my surprise, my tiny little game won the first prize on the Polygon track of the Glitch hackathon.\n\nEncouraged and even more curious now, I started attending side events during Buidl.Asia. One was about Gno, a smart contract platform written in Go. After the presentation, which was really great, I started a light conversation with the team. One thing led to another, and I ended up showing them Flippando. \n\nJust for context, Flippando is a non-degen, deceptively simple memory game. You start with an empty matrix and flip tiles to see what’s “underneath.” If the tiles match, they remain uncovered; if not, they are briefly shown, and you have to memorize their color until the entire matrix is uncovered. The end result can be minted as an NFT, and you can later assemble all the boards into bigger, more complex NFTs, basically “painting” with the uncovered tiles.\n\nThe Gno team seemed to like it, and they suggested I should apply for a grant to port it to Go/Gno. I had no prior experience in Go either, so I thought this would be a good opportunity to learn more. To my surprise, again, my grant submission was accepted.\n\nFast forward a few months until now: the Gno version of Flippando is live (in testnet beta) at [https://gno.flippando.xyz](https://gno.flippando.xyz). What follows sums up my experience porting the game from Solidity to Gno. This blog post is a mix of technical and not-so-technical takeaways.\n\n## 1. Being Early Pays Off\n\nSolidity has been around for some time now, and there is already a solid tooling ecosystem for it. I used Hardhat for my development, and I got really comfortable with it. When I started to port Flippando, though, I was quite surprised to see there was almost no tooling in Gno. Developing was mostly TDD (test-driven development) against a local VM, and deploying realms on the actual chain was more complicated than I expected. \n\nMy first feedback rounds to the team revolved almost exclusively around this topic. Very soon, I started to receive signals that my feedback was not only heard but taken into account and processed, and there were actual projects built aiming to improve the developer experience. In just two or three months, two full projects were finished: gnodev, and Gno Playground. \n\nGnodev makes development very similar to Metro in React Native: there is a watchdog on the file system, and your changes to the realm code are reloaded every time you save. It’s almost like deploying in real time; no need to stop the chain, wipe the state, restart the chain, and redeploy your modifications. Gno Playground is a sandbox-like environment, which helps tremendously with quick testing and even deploying packages on-chain. Both projects were finished, as I said, in just two to three months.\n\nBeing early pays off because you get to shape your development environment much faster than in a solidified (pun intended!) environment. You may have to deal with a little chaos in the beginning, but the benefits are well worth it.\n\n## 2. TDD All Day Long\n\nAs I said above, developing realms in Gno consists mainly of writing and testing your code with another code. It’s called TDD and it’s a very useful developing strategy, in general. I used it, at my day job, in all my projects consistently, but only in the initial stages. Once the codebase was more stable, I was relying more on regression tests from the Q\u0026A team.\n\nMind you, there was no Q\u0026A team this time; I was just coding alone, and I was forced to comply more and more with this TDD approach. In the end, I have to admit that, while slower and a bit boring, this approach is more effective, especially in a volatile environment, where patches are added literally every day, and the environment changes continuously.\n\n## 3. Marshal and Unmarshal\n\nThe current GnoVM doesn’t yet have an API standard for formatting. You can’t put a setting somewhere that will make the response be automatically translated into JSON. You have to write these JSON objects yourself for every payload you return from your realm. \n\nIn Solidity, all this is hidden under the event mechanism and handled by existing libraries, like ether.js, which take care of all this nitpicking. It soon became obvious that development time would be significantly longer in Gno because, on top of the logic, I also had to write the formatted response “by hand.”\n\nBut as with every other thing that seemed weird in the beginning, eventually, I came to appreciate it. It forced me to prototype more carefully not only the actual response but all the objects needed in my game. Eventually, it resulted in simpler and more flexible code.\n\n## 4. Eating Your Own Dog Food\n\nWhen developing in Solidity, most of the time, you just import OpenZeppelin contracts for ERC20 and ERC721 tokens (which are battle-tested, bug-free, and relatively easy to understand) and focus on your own contract logic. No mingling with low-level token implementation details; these are already packaged and ready to use.\n\nWhile porting Flippando to Gno, I realized I had to deal with these low-level details upfront simply because there was no equivalent of the OpenZeppeling contracts. Moreover, some current GRCs (the Gno equivalent of ERC) were incomplete. \n\nSo, I had to make a PR for a GRC721 implementation that was missing the SetTokenURI functionality, and this PR ended up being merged into the main Gno codebase (that felt really good, to be honest). \n\n## 5. Being Early Pays Off. Did I Say That Already?\n\nYes, but this time it’s about something else. It’s not about the satisfaction of shaping the development environment in the early days. It’s about the privilege of witnessing something coming to life from literally nothing. Gno has been in development for almost two years now, and it is several months before its mainnet. It’s literally on the verge of coming “alive.”\n\nEvery day new commits are added, and new decisions are made. There are new contributors constantly joining, and new projects prototyped and launched faster and faster. Every day the ecosystem is coagulating itself into something more and more visible, more and more alive.\n\nBeing able to witness this from the inside is a rare privilege and something I’m very grateful for.\n\n## Final Thoughts \n\nSo, these are, in a nutshell, my five top takeaways from porting Flippando from Solidity to Gno. There are many others, of course, and Gno is (did I already say this?) still very early. If you’re interested in learning more, please visit the official repo, look at the docs, and try interacting with the devs. You’ll never gno what can grow out of it! And be sure to play [Flippando](https://gno.flippando.xyz) today live in testnet beta and share your flips.\n\n## Here’s How to Play Flippando\n\nThe game presents a 16 tiles (4x4) or 64 tiles (8x8) matrix. These tiles are “covering” a board of various colors and gradients or shapes, like dice or hexagrams. Clicking two tiles consecutively “flips” them, showing what’s underneath. If they match, they remain uncovered; if not, they are briefly shown, and the player needs to remember their position. Once an entire board is flipped, revealing its random combination of colors, the player can choose to mint it as an NFT.\n\nWhen minting a solved board as an NFT, the game also mints a fungible token, FLIP, which is “locked” inside the NFT. This is the player's “reward.” But the token can only be unlocked if someone else uses that NFT in a larger project.\n\nThese larger projects, or “artworks,” can be assembled in the Flippando Playground. All minted basic NFTs are displayed here in an area from where the player can drag and drop them onto a canvas, creating a much bigger and more complex NFT. Once the canvas is fully filled and the player is satisfied with what’s in there, these new “artwork” NFTs can also be minted. This unlocks all the FLIP tokens for the NFTs used inside the artwork and sends them to their initial players. Furthermore, these complex artworks can be listed and traded in a marketplace, closing the circle of a virtual economy of goods.\n\nStart playing Flippando and share your Flips with Gno.land on [Twitter/X](https://x.com/_gnoland?lang=en) by tagging #gnoflip. \n\n\n","2024-01-24T00:00:00Z","dragos","gnoland,ecosystem,updates,flippando"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["wyg-zooma","Who You Gno – On the Record with Antoine Breuil","\n\nAntoine Breuil, ‘zôÖma,’ is the co-founder of [Teritori](https://app.teritori.com/), an active Gno.land contributor and grantee that’s building key modules and tooling for Gno. A firm believer in equal opportunities, free and decentralized access to information, and helping fellow humans, zôÖma is fascinated by human behavior and how we organize ourselves, holding an avant-garde social experiment five years ago with Teritori co-founder ‘Pop.’ \"La Suite du Monde\" drew people across France to a small village in the countryside to create a shared community and society—with farmland, accommodation, and tools for common use.\n\nThe goal was to form an in-real-life DAO whose members shared common goals and interests using blockchain technology with a token to pay for goods and services and vote on governance matters. While many people participated and were enthusiastic about creating a shared society, zôÖma admits the experiment was early- no one was interested in interacting with the tech. “90% of people, rural or not, found it too complicated,” he admits. “We were a bit naive, but it was fascinating nonetheless.”\n\n## A Fascination for Human Behavior\n\nzôÖma has been an ardent student of human behavior since childhood. His parents taught him early on the value of philanthropy and working with people in need. He’s set up several joint liability companies, non-profits, and NGOs to experiment with finding new and better ways to organize society, and one of the things he loves most about web3 is its “experimental” nature. He’s encouraged by how far the industry has come since he received his first bitcoins in partial payment for a website in 2014. “That turned out to be a really expensive website for my customer,” he laughs. He never expected such broad adoption of Bitcoin and a technology that “inspired a whole generation of engineers to experiment with new things.”\n\nLike most creative types, zôÖma is used to spinning many plates in the air, overseeing La Suite du Monde while working as a freelance designer, front-end dev, and Artistic Director for an independent French record label. “Before entering the world of engineers, I founded and managed a collective for 12 years, which brought together artists from all disciplines, hackers, designers, tinkerers, to build some interesting projects.” La Suite de Monde allowed him to explore his passion for finding new approaches to social coordination first-hand. “I explored very radical things,” he says, “like the notion of “accepted by default” where anyone could use the collective budget by expressing their desire to do so three times. I wouldn’t recommend this,” he laughs, “but the experiments were fascinating and still serve me today in my work.”\n\nOne really interesting trait about zôÖma is how he harnesses the creative and analytical sides of himself with equal application. Most people are predominantly right-brained or left-brained, yet, zôÖma is ‘ambidextrous’ in this regard. He’s a designer who’s created large-scale artistic events, cultural tours of Paris, and an award-winning independent movie documenting French artist and Bitcoin advocate Pascal Boyart, [The Underground Sistine Chapel](http://www.the-chapel.art), (which you should definitely check out!). Yet he’s also passionate about engineering and the future of cooperatives. He’s detail-driven and ambitious, taking his team at Teritori from two to 18 (14 full-time teammates and four part-time).\n\nIn his free time, zôÖma, “like all French people,” enjoys fine wine and good conversation. One of the things he loves most about Paris is how easy it is to find like-minded people to brainstorm with or decompress after a long day of work. “We have a very active ecosystem of engineers, cryptographers, etc.,” he says. Paris is also a beautiful city that captures his imagination with its dazzling architecture and impressive art. Even so, zôÖma channels his creative energy more effectively when working from a small Moroccan fishing village for three months a year. He reconnects with nature and humanity, immersing himself in a different culture and surfing in the Atlantic before he starts his day. \n\n## New Tools for Social Coordination \n\nWhy does zôÖma believe social coordination is so important, and why do we need new tools for it? “We’ve always had tendencies to organize ourselves and tools defining rules for living together, diplomatic protocols for discussing between social groups, or trading goods and services. But almost all the tools that previous generations put in place are outdated. Our entire generation has lost confidence in institutions to allow groups of humans to organize, coordinate, and meet their needs. Our dependence on third parties who do not have the same interests as citizens is immense.”\n\nzôÖma believes that web3 holds the key to unlocking the emergence of new societies through products that are “unstoppable, resilient, and meet a real need,” whether for small villages in the south of France, Africa, or Asia or neighborhoods in Brazil or Korea. “We must have access to the radical transparency of institutions, the privacy of individuals, censorship-resistant tools, and autonomous communication from all commercial enterprises. It is on this solid foundation that civilizations that are more just and equitable can be built.”\n\n## Making Web3 More Accessible \n\nOf course, as zôÖma found out, building new tools is easier said than done. Our industry faces an uphill climb when it comes to balancing the promise of the tech with a user experience that doesn’t cause tachycardia. He says that understanding that most people “don’t have the time or inclination to incorporate difficult technical concepts in their lives” has given him “crazy energy to focus on very simple technologies.” In fact, the ‘failure’ of La Suite du Monde is what gave birth to Teritori, “which today provides all the functionalities people asked us for at the time; a social network, communication systems, voting, crowd-funding, etc. We have made great progress, and it’s important to focus on products that are radically simple for the general public.”\n\nAccording to zôÖma, this means abstracting away the concepts that everyday people don’t need to be aware of, such as networks, dApps, and even blockchain, “and always switching from one decentralized application to another.” Unifying (not centralizing) separate tools, networks, and technologies within a single, simple interface, he believes, is the key to broader adoption. “It's a very complex challenge, in terms of security, design, etc., but it's what I'm passionate about today.” \n\nWhen it comes to Gno.land, Teritori has already delivered essential DAO tooling and standards, a Moderation DAO module to facilitate social communication and a Justice DAO module for conflict resolution. The team is now focusing on an on-chain project management tool to allow organizations and individuals to manage projects and track tasks smoothly and transparently on-chain.\n\n## A Fairer, More Transparent World\n\nIn 2024, Teritori enters a new phase called \"Chapter II,\" which involves unifying all its work into a mobile and desktop application that could “trigger superb demonstrations of the potential of DAOs.” He enthuses, “I dream that we will see the emergence of a village that uses Teritori as a tool for internal discussion and co-financing. Will this be real in 2024? Who knows? But that’s where I focus all my energy!”\n\nHe believes the internet has been a great leveler, enabling anyone with a connection to educate themselves on any subject; yet, the opportunity isn’t open to all, and free and open access is constantly diminishing. “I am a child of the internet. I grew up with warez, p2p, and an internet which provided me with daily resources to learn freely, everything that interested me. In some countries, it is impossible to benefit from this opportunity, and with the centralization of the internet on different key players, mass surveillance, and the censorship of certain dictators, the internet is losing its very essence, which makes it magic. Distributed protocols can reshuffle the cards and offer tools for the public good.” \n\nzôÖma says that humanity is at a turning point, and we must build the necessary tools now to avoid finding ourselves in a real-life version of George Orwell’s 1984. “I aspire to participate modestly in a world that is fairer, more transparent, and where society doesn’t need a puppet in a suit to improve its living conditions or respond to local needs. Web3 is just a tool, and if it doesn't meet this real need, then for me, it will be a failure.”\n\n*Experiment with Teritori today and test its Social Feed, which now includes Twitter-like functionality for posts, Medium-style articles, Soundcloud-inspired music, and videos—all based on Gno and IPFS and totally decentralized. You can also check out Teritori’s GnoModerationModule, which allows you to moderate a social network in a decentralized way. A faucet is available on the home page at [app.teritori.com](https://app.teritori.com/feed?network=gno-teritori).*\n","2024-01-11T00:00:00Z","christina","whoyougno,teritori,community,interview"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["bgl-poc2","Building Gno.land - Proof of Contribution II","\n\n*Disclaimer: The Building Gno.land series aims to share the core concepts of our platform, mission, and tech stack, providing a snapshot of a current state on our builder’s journey. New episodes may deprecate previous ones, but no editions will be modified at any time. We encourage you to follow along as we create the rails for a more transparent and accountable society, and we welcome feedback and contributions to the repo.*\n\n## II. Proof of Contribution vs Proof of Stake\n\nProof of Stake (PoS) is a robust consensus mechanism that provides a more environmentally friendly and scalable alternative to Proof of Work (PoW) and powers most of the web3 industry today. As PoS pioneers, Cosmos technology secures hundreds of blockchain projects and billions of dollars of digital assets, and Ethereum (launched as a PoW chain in 2015) made the historic switch to PoS in 2022. According to [ethereum.org](https://ethereum.org/en/developers/docs/consensus-mechanisms/pos), PoS is “more secure, less energy-intensive, and better for implementing new scaling solutions compared to the previous proof-of-work architecture.” However, as we briefly discussed in [*What Is Proof of Contribution?*](https://test3.gno.land/r/gnoland/blog:p/bgl-poc-1), PoS has vulnerabilities that can corrupt the network over time.\n\n### The Limitations of Proof of Stake (PoS)\n\nBeyond securing the network, the main goal of any consensus mechanism (PoW, PoS, DPoS, PoC, etc.) is to be as decentralized as possible and not reliant on any central actors. This can be measured by the Satoshi Score (or the Nakamoto coefficient), a quantitative measure that assesses a blockchain’s level of decentralization by calculating the minimum number of nodes needed to compromise a network or carry out a 51% attack. PoS systems can be bootstrapped within days (or even hours), starting off decentralized and achieving a high Satoshi Score.\n\nThe PoS chain Genesis allocates a default voting power to ~20-50 nodes, in general equally (or at least making sure that no single node has more than 5% of the voting power). This makes PoS chains decentralized enough (in theory) from block 0 with a near-perfect Satoshi score. However, in practice, PoS has two main issues. Because the system is dictated by money, PoS chains become imperfect over time. Anyone wealthy enough can stake their tokens progressively and use their accumulated power to sway decision-making on the chain—or take the network over completely.\n\nThe chain can limit the maximum voting power per validator node, but this is almost ineffective, as a malicious actor can carry out a Sybil attack on the network and create multiple validators to bypass the voting cap. Such an attack renders the max voting power per node useless and leaves the chain defenseless against a single organization or cartel gaining the majority of the voting power. PoS systems leave chains like Cosmos Hub and Ethereum at risk from such bad actors, cartels, and powerful protocols (such as Lido and Rocket Pool).\n\nWhile Proof of Contribution (PoC) can’t prevent Sybil attacks on standard user accounts (when malicious actors create multiple accounts with a single computer and transfer tokens within a few hours), it does make it almost impossible for validator nodes to suffer Sybil attacks. Since the community vets every person who is given voting power or sway in the network (including validator power) through the DAO, at no point can anyone \"spoof\" identities and gain major sway. \n\n### Where Proof of Contribution (PoC) Excels\n\nPoC is actually Proof of Authority (PoA) which, instead of offering up a resource like computing power or a financial stake, relies on validators staking their reputation. Anyone can join most public PoW and PoS networks without revealing their identity. However, by definition, PoA validators need to make themselves known and are selected based on their trustworthiness. This means PoA tends to work better when deployed in private or permissioned blockchains than in public platforms (because of this tendency toward centralization). \n\nPoC solves this problem, ensuring the network becomes increasingly decentralized over time by being governed by a decentralized entity, GovDAO. Like standard PoA chains, PoC chains launch with a handful of validators that must be identified and trusted by the network, meaning governance is centralized at the start, and the chain achieves a low Satoshi Score. The system is about contributing and earning contribution units, which are slow to gain and require human interaction. It takes months (or years) before there are enough actors in the DAO and sufficient voting power for the chain to be considered decentralized enough, according to the Nakamoto coefficient. \n\nPoC is thus slower to bootstrap than PoS and harder to achieve. You can think of PoC versus PoS as a marathon versus a sprint, whereby PoC starts slowly but then gains momentum over time, and PoS starts quickly but loses momentum over time (the graph below provides a visual representation of PoC versus PoS). \n\n[![Graph](https://gnolang.github.io/blog/2024-01-26_bgl-poc2/src/thumbs/graph-container.png)](https://gnolang.github.io/blog/2024-01-26_bgl-poc2/src/graph-container.png)\n\nThe GovDAO that owns the chain has a mandate to scale (to grow and decentralize) continuously as it adds more contributors. This means it becomes progressively larger over time, achieving high decentralization efficiency way beyond the initial fast sprint of PoS chains. Once established as a proven consensus mechanism and alternative to PoS, GovDAO can benefit from by any blockchain project (through an evolution of ICS) wanting to achieve decentralization and sustainability—PoC can secure Gno.land and the web3 industry at large.\n\n### Security-Conscious by Design\n\nAnother advantage of PoC is that because it’s reliant on human interactions, it is more Sybil-resistant by design. As discussed, it’s almost impossible to split a validator node into two (or more) nodes, making conducting a Sybil attack infinitely difficult. Since contribution units are not transferrable or exchangeable, PoC cannot suffer from whales attempting to purchase voting power quickly. If someone wanted to take over the network, they would need to invest years of their time making meaningful contributions. Their attack would be so slow that it would easily be prevented by humans monitoring the decentralization and adjusting the parameters. \n\nMoreover, GovDAO will activate and deactivate new validators on request, establish a KYC system for validators, and manage promotions of contributors with votes. This removes the possibility of a takeover happening overnight since the only way to gain validator or voting power is by voting on governance requests, which is slow and managed by humans. This is in contrast to PoS systems which are powerful and fully automated yet defenseless against such coordinated attacks.\n\nGno.land is built on the very premise that such an attack on a PoC network would never happen as it would be entirely counter-intuitive. Since contributions are not only about expertise but also alignment, it is our hypothesis that longstanding contributors who have invested years of time and brainpower in developing the chain will do their best to protect it rather than destroy it. The DAO system will endure thanks to the mix of expertise and alignment and the amount and frequency of contributions. \n\n### Concluding Thoughts\n\nBeyond separating voting power from net wealth, a core component of Proof of Contribution (PoC) is its focus on long-term sustainability. PoC makes the system fairer and more sustainable, ensuring participants are aligned and take actions that benefit the community and the broader ecosystem. PoC is slower to bootstrap and harder to achieve than PoS but focuses on long-term alignment and security. \n\nUnlike PoS, contributors receive rewards based on their contribution effort rather than how many tokens they stake. They are thus incentivized and recognized for the quality of their work, ideas, and alignment, driving participation and active engagement. Governance is allocated to the people most likely to care for the ecosystem’s long-term success—the contributors who have spent the most time working toward it.\n\n*II. Proof of Contribution vs Proof of Stake is the second in a [series of articles](/r/gnoland/blog:p/bgl-poc1) to dive deeply into the philosophy, vision, mechanics, and work involved in developing a new consensus mechanism for the next generation of smart contract systems. Look out for subsequent editions and additional Building Gno.land series, and let us know what you think! Got questions? Join the Gno.land [Discord](https://discord.com/invite/S8nKUqwkPn) or follow us on [Twitter/X](https://x.com/_gnoland)*\n\n\n","2024-01-26T13:37:00Z","christina","gnoland,gnovm,tm2,PoC"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["funding-program-23q4","Gno.land Funding and Grants Program - Quarterly Report: Q4 2023","\n\nThe Gno.land Funding and Grants program identifies talented and passionate developers, researchers, and tinkerers to interact with Gno.land, enhance the platform's usability, and help build the core infrastructure and tooling needed for mainnet. After a strong start in Q3 2023 from our grantees, we awarded four additional grants in Q4. Let’s take a look at their progress and what’s coming up in Q1 2024.\n\n## Q4 Funding Breakdown\n\nThe total amount paid out in Q4 for grants was just under $317,000, spread out over the four grants: Teritori, Berty, Onbloc, and Dragos (Flippando). This work was split over essential stress-testing, debugging, and development on Gno core, and building social, gaming, and project management dApps to extend the platform’s functionality. Each grant recipient received milestones for deliverables and tracked their progress through regular public and internal syncs, hackerspace journey updates, blog posts, documentation, and developer calls.\n\n[![Q4 Chart](https://gnolang.github.io/blog/2024-02-07_funding-program-23q4/src/thumbs/chart.png)](https://gnolang.github.io/blog/2024-02-07_funding-program-23q4/src/chart.png)\n\n## Berty Technologies (delivery May 2024)\n\nAfter successfully meeting their deliverables in Q3 and creating Gno Native Kit (formerly [GnoMobile](https://test3.gno.land/r/gnoland/blog:p/gnomobile)), Berty was awarded a second grant in Q4 to experiment with smart contract integrations around social media. Through the development of GnoSocial, the team has created a test bed for building decentralized social media-style apps and helped to stress test technical issues in Gno.land. \n\nIn Q4, Berty delivered V1 of GnoSocial, which includes basic Twitter-like functionality. GnoSocial will be implemented on mobile using the Gno Native Kit framework, with a minimal desktop app and a read-only web version also in the scope. Aside from this work, Berty contributes to Gno core development, helping raise issues and merge PRs. You can follow their progress in hackerspace [issue 51](https://github.com/gnolang/hackerspace/issues/51).\n\n## Teritori (delivery February 2024)\n\nAfter delivering the [moderation module](https://test3.gno.land/r/gnoland/blog:p/gnoland-moderation-dao-module) in Q3, Teritori received a second grant to carry out research and implement a conflict resolution module and an on-chain project management tool. Their work also continues on the escrow module build. As an active contributor, the Teritori team helps improve Gno core as well, getting more PRs merged, participating in regular meetings, and writing documentation. Read more about Teritori in their hackerspace [issue 7](https://github.com/gnolang/hackerspace/issues/7).\n\n## Dragos (Flippando, delivered January 2024)\n\nTo experiment with gaming in Gno.land, Dragos received a grant to port his on-chain memory game Flippando from Solidity. Flippando is a simple memory game—with a twist. Players uncover tiles and must find their matches to win the game. The result can be minted as an NFT and assembled to create larger, more complex NFTs and digital “paintings.” The beta version of [Flippando](https://gno.flippando.xyz/flip) is now live on the testnet, and you can read about his experiences in developing the game on the [Gno.land blog here](https://test3.gno.land/r/gnoland/blog:p/porting-flippando-gno) or visit [hackerspace issue 33](https://github.com/gnolang/hackerspace/issues/33).\n\n## Onbloc (ongoing)\n\nAfter producing consistently awesome work and being our longest-standing contributor, Onbloc received a grant in Q4 2024 to continue iterating on Gno.land tooling, Adena, and to help build Gno.land core in preparation for mainnet release. Part of the scope was to support contract-to-contract interaction [issue 757](https://github.com/gnolang/gno/issues/757), lead a [multi-node testnet initiative](https://github.com/gnolang/hackerspace/tree/main/multinode-testnet), write pure Gno packages, and help debugging the GnoVM, among many other initiatives. Onbloc is also adding additional security to the Adena wallet and an “Airgap” feature, which you can read more about in [hackerspace issue 29](https://github.com/gnolang/hackerspace/issues/29). We’ll also release a detailed blog post soon, so stay tuned.\n\n## Coming Up in Q1 2024\n\nWe’re looking forward to more exciting developments in the coming year as we focus on the road to mainnet. In Q1, grantees will mainly focus on debugging Gno core, developing smart contracts and libraries, building and porting dApps to Gno.land, and creating educational materials to help grow the community.\n\nBlockchain software and virtual reality technologies firm Varmeta are under evaluation for a grant to support account sessions and build the Gno.land Unity SDK to make blockchain more accessible to game developers (you can track their progress in [hackerspace issue 43](https://github.com/gnolang/hackerspace/issues/43)). We’re also finalizing a grant for a DAO tinkerer and a research report, as well as evaluating the extension of a second grant to Dragos to port his popular project management app to Gno.land. \n\n\n*We’re steadily building out the Gno.land platform and our ecosystem of grantees and contributors. Let us know if you want to join us by submitting an application at any time on the [Funding and Grants repository](https://github.com/gnolang/ecosystem-fund-grants). We’re always on the lookout for ideas to advance the platform.*\n\n\n","2024-02-07T13:37:00Z","christina,michelle","gnoland,funding,grants"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["wyg-dragos","Who You Gno – On the Record with Dragos Roua","\n\nDragos Roua is a humble man. If you had the chance to read his article, [*5 Things I Learned While Porting Flippando From Solidity to Gno*](https://test3.gno.land/r/gnoland/blog:p/porting-flippando-gno), you’d have seen him refer to Flippando as his “tiny little game” and describe his “surprise,” over it winning the Polygon track of the Glitch hackathon, two subsequent hackathons in South Korea, and piquing the interest of the Gno.land team to offer him a grant. If ever there were an inverse of “the empty vessel makes the loudest sound,” Dragos would be it.\n\nAt 54 years old, he’s lived an extraordinary life. Growing up in communist Romania, where scarcity was in abundance, and “everything was in short supply,” Dragos and his peers were “only allowed to learn one coding language,” and it happened to be called “Whatever.” So, when anyone asks in what languages he knows how to code, he always jokes that Romanians can code in “whatever.” Joking apart, his language skills are impressive, to say the least. \n\n## Dragos Knows a Lot of Code\n\n“My first production-level code was written in Cobol on punch cards,” he says when he was just 16. He went on to learn Smalltalk, Lua, and “just for fun,” even a programming language called “Brainfuck.” He spent many years programming in web2, iOS, and Andriod, but over the last seven years (since entering the web3 space), has been consistently working in JavaScript, Swift, Solidity (which he learned by creating Flippando), Python, and Go. Despite this, Dragos confesses he still feels more at home within the Apple ecosystem. “I've been building a lot there,” he says. \n\n## He Speaks Many Languages\nI ask if learning programming languages is similar to spoken languages. “Every programming language has vocabulary and grammar, which is a specific set of rules over that vocabulary, so it’s similar in that sense,” he says. And how many spoken languages does he know? “I can speak five Indo-European languages” (Romanian, English, French, Spanish, and Portuguese). “Five?” I gulp, wide-eyed, suddenly feeling inadequate for only speaking three. “Well, they all share about 70% of the vocabulary, and the grammar has almost the same rule set,” he shrugs, minimizing his accomplishment.\n\nHe’s also learning two Asian languages with varying degrees of success. Korean, a language he understands “some 40%” of, Dragos admits, is a different ballgame. “I've been frustrated for nine months, every day trying to plug away because there's literally no similarity in vocabulary between any Indo-European language and Korean. Literally no word is the same, and the grammar is also very, very different.” He explains that learning a language like Korean means starting from zero and waiting for the brain to forge the neural paths. “It's quite difficult to do,” he concedes.\n\n## A ‘Location-Independent’ Lifestyle \nI check out the backdrop behind him. He’s taking the interview from an elegant cafe in downtown Saigon with impressive dark wooden walls, large ceiling fans circling above, and a rich colonial atmosphere. “It’s such a posh place,” he smiles, “every day, there are groups of people taking pictures. It has an Indochina vibe.” I can’t help but wish I could teleport over and share a beer with Dragos as we discuss his remarkable life. “How long have you lived there?” I ask, “I don’t live in Saigon,” he replies, “I’m location-independent.”\n\nAs I wonder if that’s a more elegant term for “digital nomad,” Dragos quickly explains the difference. Digital nomads typically have no fixed abode, he says, and tend to set up a base for a short period of time before moving on to the next place. Location-independent is someone who has a base but is independent of it and chooses to spend longer periods of time in various places. “So I became a loner,” he says, “and I’ve been location-independent for six years. I spent my first two and a half years in Spain, then from Spain, I moved to Portugal, which is my base right now, and I started to explore Asia last year.”\n\n## A Love of the Open Road\nI point out how amazing his lifestyle sounds—and also how challenging it must be at times. Dragos loves the freedom that comes with being alone in a foreign land and the master of his destiny. He also thrives on learning from different people and cultures and discovering more about himself. “The more you travel, the more you learn. Where can you stay? Where can’t you stay? What is needed? You learn the logistics, and you become a much better administrator and manager of your life.”\n\nHe admits to feeling lonely at times. Being location-independent isn’t for everyone, and certainly not if you don’t like being alone. “It's very difficult to be on the road because you don't have many friends. You don't have a fixed social circle. I'm in a place right now where I'm quite comfortable with myself. I can spend long periods of time on my own without needing close encounters. I have a very limited circle of friends, which I keep in touch with every month or so.”\n\nThe cultural differences between Europe and Asia are something of a double-edged sword as well. Dragos likes Vietnam, where the people are friendly and welcoming and talk to him on the street out of curiosity or to practice their English. But he’s felt like quite an outsider in South Korea, where the culture of politeness and restraint makes it harder to establish meaningful friendships. \n\n## Astrology, AI, and Other Mind-Blowing Stuff\nTalking about human connections inevitably leads to the increasing lack of them—and the topic of AI. I ask how he feels about the prospect of AGI and a potential replacement species. He shrugs and points out that most of what we hear about AI is marketing. He thinks that LLMs (Large Language Models) will hit a wall when they run out of good data to be trained on. He is a little concerned about the prospect of election rigging and AGI being harnessed in the political sphere by nation-states attempting to outmaneuver each other by predicting the next plausible move. “But this is a can of worms,” he says.\n\n“Actually, at the most fundamental level, there is no difference between AI and the process by which we generate ChatGPT or any other language model, and… hold your breath,” he pauses, “astrology. They both take a set of arbitrary features and a set of desired outcomes. After that, they just do a lot of computation, by trying to minimize a cost function between the predicted and expected outcome. That's all there is to it. You take features, add some parameters, trillions of parameters, you run a lot of computation, and in the end, you have the most plausible outcome. LLMs do this in hours/days/weeks of training, astrology did it slowly, over the course of a few thousand years.” \nI ask Dragos if he hadn’t been a programmer, would he have perhaps become an astrologer instead? “I actually studied astrology and used it for 18 years,” he replies.\n\nI try hard not to fall off my chair. Dragos explains that astrology plays a huge role in his life, and he consults it before making any major decision—such as moving countries or leaving jobs. “I consult it on every major decision and even daily life. So wherever I have to, I use it. When I sold one of my companies, when I decided to move abroad, when I travel, and stuff like that.” He gives the analogy of meteorology and says if he knows it’s going to rain, he’ll take an umbrella to have less friction and move around more easily. In the same way, he applies astrology to his life. This man is a Pandora’s box.\n\nWhat else does he do in his spare time besides traveling the world, consulting the Cosmos, and writing code for fun? Dragos likes playing pool, socializing, dining out, and dancing. “I was a tango dancer back in Romania. I had a tango school for a year.” At this point, I’m hardly surprised. \n\n## Dragos on Gno.land \nI met Dragos last year in Seoul at a Gno.land event hosted with Onbloc during BUIDL Asia. That’s when he spoke to Manfred about Flippando and subsequently applied for a grant. We were still building the specs for the Grants Program at the time, and Dragos was our first grantee. Since then, he’s embarked on a whole new journey learning Gno and building the airplane as it flies, delivering Flippando last month and regularly helping the team with Gno.land core issues.\n\nDragos has since submitted a second grant proposal to port his project management app to Gno. “It uses my life management framework, which I call “assess, decide, do.” The name of the project is *ZenTasktic*. There is already an app on iOS that I wrote,” he explains. You can read more about his grant proposal [here](https://github.com/gnolang/ecosystem-fund-grants/pull/11) and be sure to test out [Flippando](https://gno.flippando.xyz/flip) today.\n\nI apologize for taking so much of Dragos’ time, but he assures me it isn’t a problem. “I don’t work today, I'm not busy. I'm just enjoying my afternoon in this coffee shop.” As Dragos sips on the local tipple and drinks in the sights and sounds around him, I can’t help but admire his outlook on life and the choices he’s made—and I look forward to seeing what he's up to next and what else he builds with Gno.\n","2024-02-08T00:00:00Z","christina","whoyougno,flippando,community,interview"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"sL4SFQ3zLaK3GeSYccxbr7g7H6dVl1dfDz6J58ogrSs38m4E/K0iKb/8Tp0nmrwuHSE9WFu1yoxZKcFFfk/gbw=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["tech-ama1","Gno.land Community Technical AMA #1 - Recap","\n\nYour questions, observations, and feedback are vital to our core development team. Not only do they give us an understanding of the types of applications and features the community would like to see but they help us formulate better ideas for developing Gno.land as we go. Before we dive into our second **Discord AMA on November 22nd @4pm UTC**, check out the community questions from our first technical AMA below answered by core Gno.land devs Jae Kwon and Manfred Touron.\n\n### Why did you choose Golang over Rust?\n\n**Jae**: “With parallelism offered by ICS1 [Interchain Security 1], the bottleneck becomes speed of innovation with safe code, rather than bare metal performance. So here, garbage collection, concurrency, embeddable structures, and clear spec are good primitives for the next-generation smart contract language.\n\nRust (or components of Rust** may be used to implement faster clients for gno.land in the future, but in terms of mindshare, I don't think Rust can flip Go due to its design choices. That's not to say that Rust is any worse than Go; they are different.”\n\n### Will Gno be its own hub? Will Gno provide ICS-like security to its own community?\n\n**Jae**: “Gno.land can be a \"hub,\" like \"git hub\" is a \"hub,\" but that doesn't mean it will offer ICS. If other chains solve ICS1 better, it makes sense for gno.land to be IBC-connected to zones that are not ICS1 replicated/secured with gno.land validators.\n\nIf we consider that validators of gno.land are better as contributors to the gno.land ecosystem (rather than general validator service providers** we may be more comfortable contributing to an awesome ecosystem but not entering the validator-as-a-service business.\n\nIt makes more sense to me that Cosmos Hub validators should own that business, which will eventually require validators to run their own server stacks and have data center infrastructure.”\n\n### How can one become a validator?\n\n**Jae**: “First, one has to become a member. We have not yet defined the full member system, but we will figure that out along the way. For now, we can say that we want first and foremost members who also validate, rather than impartial validators that only validate.”\n\n### How does Gno validate work? PoS? Proof of Contribution?\n\n**Manfred**: “The contributors DAO will elect validators and validators will have the same amount of power. They'll be focused on validating and will receive rewards for that job.”\n\n### What is Proof of Contribution? What kind of contribution will be credited?\n\n**Manfred**: “Proof-of-Contribution is a way to replace Proof-of-Stake with a metric based on the contributions. It's a variation of Proof-of-Authority where the authority is a DAO of contributors. After the 'Game of Realms** competition, we'll reward the best contributors with a tiered membership in the first version of Proof-of-Contributions DAO. The voting power and everything related to staking will be distributed across the contributors.\n\nLater, we'll add more flexibility to the membership with $GNOSH, allowing more accurate and fair rewards. Validators won't receive voting power with staking. The DAO will elect them, and they will all receive the same amount of power. Validators will receive rewards for their technical work, not for the amount of staked tokens they are bound to.”\n\n### Is there a document or resource that describes the key concepts in a Gno smart contract?\n\n**Manfred**: “We have yet to get a single top-level documentation, sorry. You can find documentation in the code, README files, issues, etc. We need to improve this. The community will be able to work on this during Game of Realms.”\n\n### Is there a big-picture diagram of the ecosystem?\n\n**Jae**: cosmos hub \u003c-- \"ec2+DTCC\"\ngno.land \u003c-- \"github for gno\"\n(cosmos hub etc) ICS zones \u003c-- \"holy grail\" scalable smart contracts\nyour chain \u003c-- \"gno inside\"\nyour app \u003c-- \"import gno.land/...\"\nblockchain-based communications/coordination/discourse platform \u003c-- us\n// DTCC: \"https://www.investopedia.com/terms/d/dtcc.asp\" // my point is, be a good reliable token hub with good governance.”\n\n### I'm a developer (PHP, Python**. How can I become a Gno developer? Please advise me on where to start.\n\n**Manfred**: “Start learning Go! One of the long-term goals of Gno is to make writing contracts as easy as writing web2 apps. The language is already strong in that direction, but we still need to catch tooling, documentation, tutorials, and language improvements. You need to have a good level with Golang and be autonomous to start building on Gno.\n\nOne of the Game of Realms tracks will be to work on everything related to onboarding more people. This will be the best place to write specific tutorials to onboard people from other ecosystems or languages.”\n\nWhat are Realms, and what is r board?\n\n**Jae**: “A realm is a Gno package with state, that represents a smart contract with storage and coins. The other Gno packages don't have state, and so are \"pure\" packages that can be imported from other realm or non-realm packages. Like land-tax, realms must be whitelisted or pay storage upkeep for their state. You can create new realms by uploading a new package with the package directory starting with /r/REALM/NAME.\n\n/r/demo/boards is a Gno package that renders a message board. It is a proof of concept message board written in Gno. Since we need to preserve messages, it is a stateful (realm** package. You can see the files of the demo boards, like:\n\nhttps://test3.gno.land/r/demo/boards/board.gno\n\n### How do external packages get imported?\n\n**Manfred**: “Example: when you call your smart contract from Go during testing, how can/should that smart contract load external packages?\n\nA gnolang can only import other gnolang contracts/libraries that were published on-chain. If you want to import an external Golang library, you need to port it to Gno, and publish it as a library, then you can import it from a top-level contract.\n\ngnodev test is an exception, it basically creates an in-memory Gnolang VM, publishes the dependencies (automatically detected**, and executes the test. The tool can act differently from the real on-chain experience. Note that we'll improve the gnodev so it can automatically download on-chain contracts or use custom local paths, to support advanced development workflows.”\n\n### What is a Gnode?\n\n**Jae**: “I don't like the name \"Gnode\" because it's too generic, but the idea is to build Gno-based building blocks for GnoDAOs, as MyGnode embeds components (of owners, treasury, board, etc.** here:\n\nhttps://github.com/gnolang/gno/commit/b9128b1d69f02dbb49be883e0c70fe9d3fc40dcc\n\n**Manfred**: “We can change the name 🙂. A Gnode is a DAO implementation that implements an interface allowing them to interact. A Gnode can have a parent and have children. Top-down interactions may be funding, grants, and approvals. Bottom-up interactions may be reporting or voting. The implementation is flexible. You can have DAOs managing a Gnode, its treasury, and voting the cross-Gnode interactions. You can have Gnodes with an elected leader or one driven by a bot or another blockchain. One of the goals of Game of Realms will be to propose various implementations of Gnodes.\n\nAt the level of Gnoland, we will probably have a top-level Gnoland Gnode managing a global treasury and vision. Then various technical and non-technical child Gnodes manage subsets of the treasury and their tasks. They may also have children. With IBC2, Gnodes could be distributed across different chains.”\n\n### What is the timeline for IBC2?\n\n**Jae**: “After the launch of gno.land, IBC2 is permissionless innovation anyone can try for, so I imagine not long after that. After initial implementations, I bet we will want to tweak/optimize the Merkle tree further, but this can come after IBC2 demos.”\n\n### Can you tell us more about Game of Realms?\n\n**Manfred**: “Game of Realms is a competition to build the first contracts of Gnoland and experiment with proof of contributions. The first step of the competition will be to build the missing tools for the second step. So people will compete to write the DAO that will review the other contributions and allocate points.\n\nThe rest of the competition will be about competing to write the best contracts for well-known categories or make non-technical contributions. At the end, we'll have strong foundations (libraries, rules, tutorials, dApps** to help upcoming builders to start in better conditions. The best contributors will earn rewards and membership in the future DAO of contributors that will co-own the chain.\n\nWe'll have the first version of a Proof-of-Contributions-based DAO of contributors. Focus on one of the official tracks: build a contract suite to compete with Cosmos' governance module to eventually complete Cosmos Hub governance. Realm boards are basic discussion contracts that can be used for discussions, and be extended for governance, launchpad, or other things mixing discussions and DAO actions.”\n\n### Is it possible to build code with gno.land directly online?\n\n**Jae**: “We will make the sandbox staging.gno.land environment easy to access, and that will be preferable to testing on gno.land directly. The gno codebase tries to remain minimal so it shouldn't be difficult to run it locally.”\n\n**Manfred**: “I've seen people writing contracts from VSCode on an online VSCode instance. Someone could create a VSCode template configured to communicate with staging by default with a dummy wallet containing tokens.”\n\n### Is there a plan to be able to use the Gno VM with a Cosmos SDK-based chain?\n\n**Manfred**: “This is one of the plans, yes. And not only on Cosmos SDK. But we don't have a clear plan about how it will happen yet.”\n\n### How about interoperability?\n\n**Jae**: “Regarding interoperability, will it be between Gno chains, with Cosmos, or with more chains outside of Cosmos? If it is with chains outside of Cosmos, which ones, in the short and long term? I think if the latter were to come to pass, the world of web3 and NFT could be awesome. Short run, Cosmos SDK-based chains with IBC1 for code import and cross-chain smart contract calls; but with IBC2/Gno it's really up to the smart contract logic.”\n\n### Are Gno.land tokenomics deflationary?\n\n**Jae**: “There will be $GNOT, and this token will be used for spam prevention fee payment, and it will be deflationary. Previously, we discussed $GNOSH as a secondary token, but we have moved away from the $GNOT/$GNOSH model and will keep $GNOT while making gno.land more about membership among levels of peers.\n\nI think we need an alternative to the Cosmos Hub that is more people-centric than stake-centric, and where alignment is not bought or sold but depends on contributions and value alignment proven over time. The hope is that by moving away from a pure tokenomics perspective and moving into the realm of politics and ethics along with general economics we can curate a different kind of culture.”\n\n### Are there any collaborations with other projects to build on Gno?\n\n**Jae**: “Yes, why don't we make this truly open, in the style of free software, so that we can build upon a common VM design? The only thing I want to retain control over for a temporary duration of time is the regulation of trademarks, like \"gno\", \"gno**\", \"*gno\" (but you can use the license to fork this project however you want); and we want proper attribution, but the AGPL fork license suggests how we can work together collaboratively.\n\nThe GNO VM can be used on any chain if it follows the AGPL style license, which we are calling the \"Gno GPL\". Blockchains can still be composed of components licensed with compatible open source software. We can collaborate indirectly by working and contributing to the same codebase, and know that the code we are building together will always be available for you to use for your chain, as long as it remains and is offered as GNO free software.\n\nSo anyone can build GNO smart contracts into their chain for free, according to the license we are deriving from the GNU (not GNO** AGPL license. You don't have to pay gno.land or anyone if the license is followed. Example: we will collaborate with the Cosmos Hub and Cosmos/ATOM community to offer gno DAOs to be hosted by ICS1, and help bring collaboration tools for Cosmos. So this is how gno works with Cosmos Hub assuming ICS1 is solved. As for gno.land, we can start off with an independent gno instance for the Cosmos Hub's gno shards, and later allow the IBC importing of vetted code from gno.land/*.”\n\n### Apart from Adena, are there any plans for another wallet?\n\nJae: “I think what we need are a few competing base implementations that best leverage the framework they build upon, rather react or minimal vue; and to create common core libraries along the way if reasonable. But there ought to be more than one approach for such a key component, with special care taken into consideration for security. Like, I don't agree with Keplr asking so easily for a 12/24-word mnemonic, even if the implementation is secure, it is going to become a problem. PSA btw.”\n\n### Wen mainnet?\n\n**Jae**: “Some time by Q2 next year would be good. But as policy, we can't commit to a date, because everything has to be ready first before the official launch. Our thesis is that having the DAO with sub-DAOs will allow us to reach the end result in a faster way via some form of parallelism. First, we need DAOs to assess new code, and better UX for managing something like upgrades to the Cosmos Hub. Once we have the DAO running on testx.gno.land, for some x \u003e 4, and we have checked all vital TODOs, we will know that we are ready for \"mainnet.\"\n\n_Do you have more questions for Manfred or Jae? Would you like to know more about Gno.land, Gnolang, Game of Realms, or ways to contribute to our growing ecosystem? Drop us a question on Discord and be sure to join us for our second **AMA on December 6th @4pm UTC.**_\n","2022-12-05T16:15:00Z","manfred,jae","gnoland,gnosh,gnot,permissionless,consensus,proof-of-contribution,dao,governance,ibc,democracy,freedom"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["gor-launch","Game of Realms Is On: Win Rewards for Contributing to Gno.land","\n\nPhase one of Game of Realms, a worldwide competition to build the best Gnolang smart contracts, **is now open**. Game of Realms is a high-stakes contest with a total prize pool of **133,700 ATOM** that will see participants compete for tiered membership to co-own the Gno.land blockchain, the next-generation smart contract platform that uses the Gnolang (Gno) programming language. A series of complex technical and non-technical tasks will challenge contributors to create innovative patterns that push the chain to new limits. If you’re interested in helping build the most intuitive smart contract platform in web3—while gaining rewards for your contribution—join today by opening a [PR here](https://github.com/gnolang/gno).\n\nThe Game of Realms contest will allow participants to get a feel for the Gno.land platform while building smart contracts and applications in the ecosystem. It will take place in two stages, phase one and phase two. Phase one is about building the core infrastructure, tools, and tutorials necessary to open the gates to broader participation and will be held off-chain. Phase two, on the other hand, will take place after the successful completion of phase one and be held on-chain, where contributors will build smart contracts on the platform.\n\nIn addition to the ATOM prize pool, the best contributors will also be awarded (mostly) initial-level membership to govern the upcoming mainnet. Membership will be allocated according to the quality and extensiveness of the contribution—the higher the quality, the higher the tier, and the greater the voting rights and rewards. The top equal members will be composed of peers who have contributed the most to the ecosystem and have an understanding of its core components. Top members will also have aligned core moral values. This is essential so that members can maintain the chain together according to its Constitution (TBD** and ultimately create a sustainable ecosystem that rewards all valuable contributions.\n\n## Game of Realms - Phase One (Off-Chain)\n\nWhile we aim to encourage cross-collaboration between devs and non-techs, phase one of the contest is recommended for advanced developers who are more autonomous and can contribute with limited guidelines and support. Accounting for around one-third of the total **133,700 ATOM** prize pool, getting a headstart in phase one will allow seasoned devs to kick the tires on the Gno.land platform, contribute with limited competition, and build the tools needed to open the second phase.\n\nDuring phase one, participants will open PRs against repos from the Gnolang organization. Phase one contributors will be expected to document and share their work efficiently to enable others to use it without conflicts. Your contribution is vital to the success of the contest, the Gno.land platform, and the Cosmos ecosystem at large, especially now, with discussions to move the Cosmos Hub’s core operations on-chain by establishing a DAO system.\n\nThe first DAO to be created will be the [Decentralists DAO](https://github.com/decentralists/DAO), which will provide Cosmonauts with transparency, accountability, and decentralization. The Decentralists DAO will improve discourse, organization management, development, and conflict resolution through smart contracts, and will organize itself into a set of tightly-aligned sub-DAOs dedicated to specific topics, such as engineering and funding.\n\nSo, how does this relate to Game of Realms and what type of contributions are judges looking for? Here are some examples, in order of priority:\n\n* **Define and Implement an Evaluation DAO:** For the Game of Realms contest, a sub-DAO – the Evaluation DAO – is needed to evaluate contributions during phase two and attribute rewards accordingly. Using a DAO will allow community members to vote on the best contributions for the platform. Implementation of the Evaluation DAO is the only step that must be approved by the core team because of its key role in the competition and the future of the platform. Once the DAO is in place, all previous and further contributions will be reviewed collectively by DAO members.\n\n* **Create Tutorials to Onboard More Participants:** We need experienced devs to write or record tutorials to help more people get started during phase two of the competition (and beyond) and to help grow the Gno.land developer community. These tutorials can include topics like interacting with the chain from the CLI, step-by-step guides to creating smart contracts in Gno, tips for running a local dev environment, fast prototyping with gnodev, or they can be tutorials dedicated to certain audiences, such as developers coming from Solidity or web2. All tutorials should be added to the [awesome-gno GitHub repo](https://github.com/gnolang/awesome-gno).\n\n* **Define and Implement a Governance Contract Suite:** In this challenge, developers will be expected to define and implement a governance contract suite capable of competing with existing chains’ governance modules. If you think you can improve the governance system of Cosmos Hub, this is your chance to show us how!\n\nPhase one challenges will stay open during phase two. No competition points will be attributed during this phase as the points will be retro-funded by the DAO and awarded during phase two.\n\n## Game of Realms - Phase Two (On-Chain)\n\nPhase two of Game of Realms will onboard more people to the platform and begin as soon as sufficient materials are completed from phase one. Accounting for around two-thirds of the total 133,700 ATOM prize pool, phase two will be open to both developers and non-technicals who can follow tutorials, create smart contracts, or provide other important contributions to win rewards and scale the platform. As phase two will be held directly on-chain, contributors can submit their contributions to the DAO without publishing them on the main GitHub repo. However, we strongly encourage you to use GitHub as it’s an important resource that helps the community gain a better understanding through specific examples.\n\n_We are currently preparing the challenges for participants of phase two and are looking for your input. Let us know what type of smart contracts you would like to see (minimal or with multiple features) in our upcoming Game of Realms AMA on Tuesday, January 24 at 4 pm UTC. Note that this is a text based AMA so make sure to add your questions before or during the AMA in the #AMA-questions channel on the [Gno.land discord](https://discord.gg/S8nKUqwkPn).\n_Once we have collected your feedback and requests, we will finalize the challenge categories. You can visit the [Game of Realms repo](https://github.com/gnolang/game-of-realms) for more information._\n","2023-01-18T15:36:00Z","","gnoland,game-of-realms,launch"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["gor-ama1","Gno.land Community Game of Realms AMA #1 - Recap","\n\nWith Game of Realms officially in phase one, core dev Manfred Touron jumped on Discord to answer Gno.land community questions about the ongoing high-stakes competition. From starting and end dates to participation requirements and a description of tasks, look for your answer below. If you have further questions or want to join our community, come and find us on the []Gno.land Discord](https://discord.com/channels/957002220384182312/1065646963825066044). The core team will be hosting regular “office hours” sessions soon so you can discuss your ideas with them directly.\n\n## Q. How are the tasks in the issues assigned?\n\nWe received questions about how the tasks in the Game of Realms issues are assigned. Should submissions contain the whole implementation? Is the following task \"available** when the previous one is completed? How is the “sync” happening?\n\n**A.** TL;DR:\n\nEverything should go smoothly and we will be leaving room for negotiation if any review looks invalid. Once it has been established, the evaluation DAO will enforce how to submit a contribution. In the meantime, there are official communication challenges that we encourage participants to use. People are also free to work in stealth mode, with the risk of finishing too late or losing points for being bad at collaborating.\n\n----\n\nWe expect the current issues to be done by multiple people, in multiple steps. But anyone can try to make everything in stealth mode and open a PR with everything. Let's discuss the cases we believe will happen:\n\n### Case 1\n\nWe're in phase 1, people want to contribute but can't manage to do everything, so they will try to participate as much as they can. They will participate on the issue or in Discord by indicating their desire to participate, by sharing ideas, reviewing others' work, giving feedback, clarifying, or whatever makes sense.\n\nThe only thing is that we're fully remote. We don't know each other, so everyone needs to be good at communication. At the end of a big task, i.e. the Evaluation DAO is finished, the core team will take all the small contributions and identify contributors, and then suggest how to split the task prize. We'll propose the split and allow room for public negotiations.\n\n### Case 2\n\nWe're in phase 2, and a small contribution is done by an individual. We just review it, and that's done.\n\n### Case 3\n\nWe're in phase 2, and a contribution is big and requires small steps. Probably, the Evaluation DAO will ask individual participants to submit their contributions so they can allocate points for the individual contributions. But maybe the Evaluation DAO prefers to review big tasks as a whole, and then split the prize, as we'll do in phase 1. We don’t have clarity on this at this stage, as it will be up to the implementers of the Evaluation DAO to design the best system for that case.\n\n## Q. Will there be a leaderboard and place where we can submit evidence for tasks?\n\n**A.** Not yet. The leaderboard will come in phase 2. One of the critical parts of the Evaluation DAO will be to allow contributors to submit evidence for tasks. Votes and point allocations will also be transparent. This will make sense for future Proof-of-Contributions, too. We'll also develop a leaderboard to make it easier to follow the competition, but this will probably come after the Evaluation DAO is running.\n\n## Q. What will the overall tasks consist of?\n\n**A.** Here is a non-exhaustive list:\n\n* Onboard more contributors ([create tutorials and documentation](https://github.com/gnolang/gno/issues/408)\n* Improve the project and implement more things\n* Bootstrap our genesis of contributors for the future mainnet\n* Experiment with Proof of Contribution by having a simpler system: Evaluation DAO\n* Identify the best participants to propose jobs\n* Identify the best organizations to propose partnerships\n\n## Q. At what point in the Game of Realms timeline/phase are we?\n\n**A.** We are at the beginning of phase 1. We plan to create a website soon so you can keep track of the status and, as I mentioned, a leaderboard will come in phase 2.\n\n## Q. What will be the contributions, how will points be calculated, and are there tasks for non-programmers?\n\n**A.** During phase 1, the tasks are relatively well defined, please read this:\n\nhttps://github.com/gnolang/gno/issues/390\n\nThere are more tasks for programmers, but multiple parts are for non-programmers too.\n\nDuring phase 2, it's hard to be sure about anything yet. Game of Realms is a competition to experiment with Proof-of-Contribution, which will replace Proof-of-Stake on Gno.land. If things go the way we imagine, then consider that the stakeholders (contributors** will allocate points to contributions that make sense for the project. The contributors won't lose points, but by allocating points, they will dilute their own point stack.\n\nWe expect the Evaluation DAO to attribute points to whatever makes sense to make the project better. We'll have some task ideas for phase 2, including for non-programmers. You can likely consider that even if the core team doesn’t control the DAO, its suggestions will be approved by the Evaluation DAO because we deeply want the project to be a success.\n\n## Q. What are the requirements to start participating?\n\n**A.** There is no requirement to start participating. You’ll need to do some KYC at the end of the competition to receive a prize. Feel free to fill out the form linked in the Register section of the following issue:\n\nhttps://github.com/gnolang/gno/issues/390\n\nThis will allow us to contact you about the competition through our newsletter and set up prize payment later. Use the comment section of the issues or discuss them on Discord if you plan to work on specific tasks, so we can see that you’re actively working on a topic. It may be better to work with others and share a prize instead of taking the risk of implementing everything in stealth mode and not being the first.\n\n## Q. Is there a fixed period of time for the end?\n\n**A.** No. Phase 1 will be finished when we consider that enough materials have been implemented to switch to phase 2. This will probably take between 1-3 months. The end date for phase 2 will be announced during phase 2, which will probably last between 2-3 months. This is when we’ll send the prize rewards. After Game of Realms, people will continue to earn contribution points by contributing to the project, which will give them memberships on the future mainnet.\n\n## Q. Is it possible to install a local testnet to get a proper local development environment?\n\n**A.** You can find the answer in this GitHub issue. Subscribe to the issue to get updates:\n\nhttps://github.com/gnolang/gno/issues/478\n\nThere are multiple ways to interact with Gno:\n\n* Using gnodev allows you to use the GnoVM, without a blockchain. This method is super fast and allows you to use development patterns like TDD, where you test your implementation multiple times per minute.\n* Running a localnet, by running the gnoland command and then configuring our tools like gnokey to use localhost:36657\n* Using the staging network hosted on https://staging.gno.land reset regularly and you can use the hardcoded test key or use the faucet\n* Using the official testnets\n\nIf you prefer to run a full blockchain node instead of just playing with GnoVM, you should play with the gnoland binary. This video shows how to do this in practice:\nhttps://www.youtube.com/watch?v=-BlnEXCs0eI\n\nBelow is a further resource that may also help you:\n\nhttps://test2.gno.land/r/boards:testboard/5\n\n## Q. Will there be a list of what needs to be tested? When will the tests start?\n\n**A.** The best place to look is on GitHub here:\n\nhttps://github.com/gnolang/gno/issues/390\n\nDuring phase 1, there are 3 official focuses:\n\n- Evaluation DAO\n- Tutorials\n- Governance Module\n\nThe core team will actively review this and decide what contribution deserves to get prizes.\n\nDuring phase 2, we’ll use the Evaluation DAO developed during phase 1 to review old contributions, even contributions made before the competition, as well as ongoing contributions. Right now, we have an issue gathering interesting topics for phase 2 here, but any contribution can be reviewed by the DAO, including things that are not listed:\n\nhttps://github.com/gnolang/gno/issues/357\n\nThe competition was just announced, but we’ll review contributions made in the past, too, so it starts from the first commit, ~1-2y ago.\n\n_Do you have more questions for Manfred? Would you like to know more about Gno.land, Gnolang, Game of Realms, or ways to contribute to our growing ecosystem? Drop us a question on Discord and watch out for our next AMA on Tuesday 7 Feb at 4 pm UTC._\n","2023-02-03T15:44:00Z","manfred","game-of-realms,gnoland,proof-of-contribution,dao,governance"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["gor-phase1","All You Need to Know About Game of Realms: Phase One","\n\nGame of Realms, the worldwide competition to find the best contributors to Gno.land, is currently underway. Unlike some contests you may have entered, we're doing things a little differently. We want participants to be instrumental in building the Gno.land platform with meaningful contributions that help shape the direction of the project – either by writing the best Gnolang smart contracts or contributing to the core blockchain. It’s not just about winning prizes but becoming a meaningful contributor. We encourage participants to collaborate on the challenges – your contribution will be rewarded on individual merit.\n\n## Phase One: The Basics\n\nPhase one of Game of Realms is about laying the foundations to onboard more people to the platform. You’ll need to be an advanced developer who wants to create core materials that power the platform every day. You should also be willing to document your work and even write tutorials and guides that help us advance to the second phase of the competition.\n\nThere is a total prize pool of 133,700 ATOM available during the Game of Realms competition, one-third of which (44,121 ATOM) will be allocated to contributions from phase one. During phase one, which we expect to last between 1-3 months, participants will open PRs against repos from the Gnolang organization. For additional information on the competition phases and timelines, be sure to check out the following resources:\n\n- [Game of Realms blog post](https://test3.gno.land/r/gnoland/blog:p/gor-launch)\n- [Game of Realms AMA recap](https://test3.gno.land/r/gnoland/blog:p/gor-ama1)\n\n## Phase One: The Challenges\n\n**Evaluation DAO**: To ensure contributions in Game of Realms are rewarded fairly, we need an Evaluation DAO. Allowing community members to vote on the best contributions and decide how much they are worth provides a level playing field for all. We’re therefore seeking your skills in DAO development and implementation. This is one of the most important challenges of phase one and the only challenge that must be approved unilaterally by the core team because of its key role in the competition and the future of the platform. Read more about the [Evaluation DAO challenge on GitHub here](https://github.com/gnolang/gno/issues/407).\n\n**Tutorials \u0026 Documentation**: So that we can progress to phase two and open up the Gno.land platform to a broader audience, we need written and recorded tutorials, guides, and documentation from phase one participants. There are almost no instruction manuals when it comes to this new frontier as the only smart contract platform using the Gnolang programming language. Help us to create materials that will onboard more contributors to Gno.land. Read more about the [Tutorials \u0026 Documentation challenge on GitHub here](https://github.com/gnolang/gno/issues/408).\n\n**Governance Module**: We want Gno.land to adopt the fairest and most effective governance solution possible; one that encourages voter participation and is transparent and accountable. We’re looking for contributors to define and implement a governance contract suite that rivals existing ones, such as the Cosmos Hub, and be implemented by other projects. Can you improve on that? Show us how! Read more about the [Governance Module challenge on GitHub Here](https://github.com/gnolang/gno/issues/409).\n\nAll phase one challenges will stay open during phase two. No competition points will be attributed during this phase as the points will be retro-funded by the Evaluation DAO and awarded during phase two.\n\n## Judging Criteria - What Wins Points?\n\nWhat will the judges be looking for when assessing contributions? You can find individual details on the corresponding GitHub issue regarding each challenge, but to get you started, the Game of Realms contest prioritizes communication and collaboration. We encourage participants to work together to find the best solutions. You will be awarded individually for your contribution but working as part of a team is highly valued. Good documentation that expresses high learning efficiency and shows how the task was completed in an educational way will also win additional points, as will a high standard of quality, great UX, and the ability to follow the contribution guidelines.\n\nAs this is primarily a developer-oriented competition, most of the organization for Game of Realms is happening on GitHub; come by the repo and [visit issue #408](https://github.com/gnolang/gno/issues/408) to contribute to tutorial and documentation writing for Gno.land.\n\n## Rules of Engagement\n\nAll participants must keep in mind a strict code of conduct and specific rules and criteria to ensure fair play. Throughout the Game of Realms competition, no plagiarism will be tolerated at any time. Participants may submit what they wish, however, any project that has already been allocated rewards or received compensation in any other hackathon or similar contest will not receive double pay.\n\nThat’s all for now. If you have more questions about Game of Realms or Gno.land you can join us in our next Office Hours session on Tuesday, March 14, 2023, at 4 pm UTC. You can also connect with other participants in the [Gnoland Discord](https://discord.com/invite/S8nKUqwkPn).\n\n## Game of Realms Phase 1: FAQ\n\nBelow are some frequently asked questions about phase one of the Game of Realms competition. If you can’t find your answer below, jump into our Discord and ask, or join us for a live “Office Hours” session with the core team.\n\n### Q. How are the tasks in the issues assigned?\n\nA. There are official communication challenges that we encourage participants to use.\n\n### Q. Can I work individually or should I work as part of a team?\n\nA. You are free to work in stealth mode, but please keep in mind that you risk finishing too late or losing points for being bad at collaborating. We expect the issues in phase 1 to be done by multiple people, in multiple steps. But anyone can try to make everything in stealth mode and open a PR with everything.\n\n### Q. How can I find collaborators?\n\nA. Participate on the issue or in Discord by indicating your desire to participate, by sharing your ideas, reviewing others' work, giving feedback, clarifying, or whatever makes sense.\n\n### Q. How can I ensure good collaboration?\n\nA. Since we are fully remote, collaborating can be a challenge and the best collaborators will be rewarded. We don't know each other, so having good communication is key.\n\n### Q. How will my collaboration be evaluated?\n\nA. At the end of a big task, i.e. the Evaluation DAO is finished, the core team will take all the small contributions and identify contributors, and then suggest how to split the task prize. We'll propose the split and allow room for public negotiations.\n\n### Q. How much is the prize pool?\n\nA. There is a total prize pool of **133,700 ATOM** available during the Game of Realms competition, one-third of which (**44,121 ATOM**) will be allocated to contributions from phase one.\n\n### Q. When will I receive my rewards for my collaboration?\n\nA. Rewards will be allocated retroactively by the Evaluation DAO during phase 2.\n\n### Q. Will there be a leaderboard and place where we can submit evidence for tasks?\n\nA. Not yet. The leaderboard will come in phase 2.\n\n### Q. What will the overall tasks consist of?\n\nA. Here is a non-exhaustive list:\n\n* Onboard more contributors (create tutorials and documentation)\n* Improve the project and implement more things\n* Bootstrap our genesis of contributors for the future mainnet\n* Experiment with Proof of Contribution by having a simpler system: Evaluation DAO\n* Identify the best participants to propose jobs\n* Identify the best organizations to propose partnerships\n\n### Q. Are there tasks for non-programmers?\n\nA. There are more tasks for programmers, but multiple parts are for non-programmers too. During phase 1, the tasks are relatively well defined, please read this:\n\nhttps://github.com/gnolang/gno/issues/390\nhttps://github.com/gnolang/gno/issues/540\n\n### Q. What are the requirements to start participating?\n\nA. There is no requirement to start participating. You’ll need to do some KYC at the end of the competition to receive a prize. Feel free to fill out the form linked in the Register section of the following issue:\n\nhttps://github.com/gnolang/gno/issues/390\n\nThis will allow us to contact you about the competition through our newsletter and set up prize payment later. Use the comment section of the issues or discuss them on Discord if you plan to work on specific tasks, so we can see that you’re actively working on a topic.\n\n### Q. Is there a fixed period of time for phase 1?\n\nA. No. Phase 1 will be finished when we consider that enough materials have been implemented to switch to phase 2.\n\n### Q. Is it possible to install a local testnet to get a proper local development environment?\n\nA. You can find the answer in this GitHub issue. Subscribe to the issue to get updates:\n\nhttps://github.com/gnolang/gno/issues/478\n\n### Q. Will there be a list of what needs to be tested? When will the tests start?\n\nA. The best place to look is on GitHub here:\n\nhttps://github.com/gnolang/gno/issues/390\n\nDuring phase 1, there are 3 official focuses:\n\n* Evaluation DAO\n* Tutorials\n* Governance Module\n\nThe competition was just announced, but we’ll review contributions made in the past, too, so it starts from the first commit, ~1-2 years ago.\n","2023-03-12T14:02:00Z","","gnoland,game-of-realms,faq"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-1","The More You Gno: Gno.land Monthly Updates","\n\nWe made progress across the board at Gno.land last month, from onboarding more devs to receiving an influx of contributions to the Game of Realms contest. To encourage development and discourse, we set up a biweekly public developer call in addition to our biweekly Office Hours sessions. Anyone can join, ask questions, and give their suggestions on how to shape the Gno.land platform and become a contributor. Last month, we covered several pressing topics from Gno IDE and Gno.land website language, to GnoVM, IBC, and ICS. Jae also came back to the circuit in March with two IRL workshops for devs at side events during EthDenver and Game Developer Conference (GDC) in San Francisco.\n\n## Developer Updates\n\nYou can find the live streams of the new biweekly public developer calls on [Gno.land YouTube](https://www.youtube.com/@_gnoland/videos) as well as access the agendas on [GitHub](https://github.com/gnolang/meetings/blob/main/notes/2023_03_15_dev_call_notes.md). The main talking points this month were Gno IDE, Gno.land website language and UX, garbage collection, bug fixes, and how to bring IBC and ICS to the platform. We are working on all these issues concurrently but the order of release will be Gno.land mainnet, IBC, and then ICS (this is reflected in the DAG below).\n\n[![Gno.land mini DAG](https://gnolang.github.io/blog/2023-04-15_myg-march/src/thumbs/mini-dag.png)](https://gnolang.github.io/blog/2023-04-15_myg-march/src/mini-dag.png)\n\n## Gno.land Website Language\n\nWe want to add more features for developers, such as libraries to make writing interfaces better and more consistent. There is an open topic for frontend developers with typography skills and library developers to create a UI framework for markdown or a custom rendering system.\n\nInternally, our core team is working on improvements to Gno.land’s website, making it easier to navigate with shorter columns while ensuring the text is markdown centric and readable in plain text and the GitHub rendering machine. We hope to achieve this using CSS and having classes for vertical columns, without having to make an extension to the markdown parser.\n\n## Gno IDE\n\nGno.land developer experience team is working on a web-based Gno IDE for quickly building Gno realms and packages right on your browser by just visiting a web app. Gno IDE will provide much improved UX for everything around building a realm (including making the testing easier), and additional features like autocompletion in the editor. Gno IDE will contain all the features you would expect from an IDE as well as valuable APIs for devs building tools around Gno.land with the public Gno Infrastructure.\n\n[![Gno IDE](https://gnolang.github.io/blog/2023-04-15_myg-march/src/thumbs/gno-ide.png)](https://gnolang.github.io/blog/2023-04-15_myg-march/src/gno-ide.png)\n\nGno IDE will have multiple modes to support different use cases. The normal mode will be used during everyday developments (as you’re familiar with from other code editors). The presentation mode is for high accessibility and readability. You can use it during video calls or physical workshops while projecting your screen to an audience. The third and perhaps most interesting mode is the embedded mode. Use this mode to embed the IDE into websites and blogs. This feature is especially useful for tutorials to test out sample code, run it on the real testnets, and play with it.\n\n## IBC and ICS\n\nAs depicted in the DAG above, Gno.land mainnet will launch first, followed by IBC and then ICS. We will focus on implementing IBC1, as we strongly believe in the ICS model and want to be a consumer of an existing Cosmos chain. We want a common ICS implementation that works across many hubs because Gno.land is a type of hub that will need its own ICS to scale while providing GnoVM on consumer chains on the Cosmos Hub. Our next step now is to find the best way to configure ICS for Gno.land and make GnoVM available as a consumer chain in the Cosmos Hub system.\n\nRegarding IBC, we will use the current implementation that was written for the Cosmos SDK and port that over to Tendermint2. We anticipate some issues along the way including security patches that need to be applied to our code base. There are multiple ongoing directions and discussions about how to bridge Gno.land’s smart contracts to IBC, which are essentially Interchain smart contract interactions.\n\nOne possibility is to have an API that submits events to a queue of outgoing events, and another queue to receive and consume events asynchronously. This mechanism could work for IBC2 to have rich inter-contract Interchain features, and the same API could work for Interchain plus smart contract interactions that require advanced options. We discussed a proposal to create a standard for Interchain contracts so that IBC2 could eventually be standardized eliminating limitations by applying it with an EVM, other languages, and CosmWasm.\n\nThis protocol could be based on Protobuf or a similar well-known syntax definition protocol so that we can push the Interchain to the next level. IBC2 will be safe and fast and replace vulnerable atomic bridges between multiple technologies. This is a major update that we are committed to developing and we need help identifying all the challenges involved. Working on IBC integration, separate from the Gno.land mainnet launch, will require significant time to understand how the light client system works. If you’re interested in taking on this task, let us know and we’ll set up a group. IBC will likely be the most important challenge of Game of Realms phase 2.\n\n## Garbage Collection\n\nCurrently, our work on garbage collection does not address the problem in the traditional Golang sense of dealing with memory efficiency. Instead, we are progressively optimizing and improving the main state tree by automating the clean-up of orphan nodes. The next phase will be targeting the official garbage collector component to begin work on memory management as we have some common Golang garbage collection challenges, but are identifying some uncommon ones too.\n\nWe need to consider elements like where to hold our objects because this is tied to releasing them in a concurrent lock-free way. We also need a good data structure. This is ongoing research as of now to implement a dedicated routine to synchronously clean stuff in a non-blocking way.\n\n## Game of Realms\n\nThis month, we have seen a massive uptick in contributions to Game of Realms phase one with a tidal wave of issues, general discussions, and PRs. One of the biggest things we worked on was adding support for MOD, which is a version of Go mod with an easier interface to manage your dependencies and version your dependencies. You can track the ongoing issue on GitHub [here](https://github.com/gnolang/gno/issues/390).\n\nThere have been some really strong contributions to the Evaluation DAO and governance module, as well as a big CLI refactor that went into our code base. We've also seen people contribute contracts like GRC 1155 or general improvements to existing realms, with many suggestions for fixing bugs. Finding bugs and reporting what people want is a good indication that the Gno.land platform is being picked up and gaining adoption.\n\nYou can find the Office Hours recordings that cover Game of Realms on YouTube [here](https://www.youtube.com/watch?v=JTmNg-b6Lcs).\n\n## Developer Events Stateside\n\nGno.land hosted a lively meetup during EthDenver last month where Gno.land founder and core dev Jae Kwon gave a talk for Solidity developers called “Gno.land, the Inevitable Next Generation Smart Contract Platform.\" He compared and contrasted Gno.land and Gnolang to Solidity, and showed Ethereum developers how the GnoVM shifts the smart contract paradigm. You can watch the [recording here](https://www.youtube.com/watch?v=IJ0xel8lr4c).\n\nAlso in March, Jae hosted a gaming workshop at a side event during the infamous Gaming Developer Conference (GDC) in San Francisco. “Gno.land for Game Developers, Building Your App in Web3,\" showed participants a sample gaming app built on the Gno.land platform and offered them the chance to try their hand at writing a smart contract for their app with Gno.\n\n## Virtual Events - How to Build a Forum\n\nCore tech lead at Gno.land Miloš Živković held a virtual workshop for Go devs called “How to Build a Forum.” He showed how Gnolang is a fast and simple way to build and launch smart contracts using the Gnolang interpreter virtual machine that interprets Gno and eliminates the need for any servers or ORNs.\n\nThe VM allows for the memory state of your Gno.land application to persist automatically after every transactional function call, which is a completely new way to handle transaction volume and memory recall. You can watch the [full tutorial here](https://github.com/gnolang/workshops).\n\n*We’d like the community to get involved in Gno.land’s monthly updates, so if you’re building on Gno.land and want to highlight your development, project, event, or idea, let us know and we’ll include your contribution.*\n","2023-04-15T13:37:00Z","christina","gnoland,gnovm,tm2"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-2","The More You Gno: Gno.land Monthly Updates - 2","\n\nOver the past few weeks, our core devs and ecosystem contributors have been making massive strides on Gno.land. There’s a lot to cover in the second edition of *The More You Gno*, from updates on Tendermint2 and GnoVM to stack/frames management, Gno IDE, and plenty more. We’ll also see what some of the external teams contributing to the platform have been up to, including Gno.land’s first decentralized exchange, GnoSwap, and Adena compatibility with GRC20 tokens. Check it out.\n\n## Tendermint2\n\nWe’re making steady development progress on Tendermint2, which focuses on simplicity of design, minimal code, minimal dependencies, modular dependencies, and completeness. For the time being, Tendermint2 will stay in the main repo in a top-level folder named Tendermint2. This is the official location to develop and improve the consensus protocol until it is stable enough to be extracted from the Gno repo and become a standalone project. Currently, Tendermint2 depends on GnoVM, however, we are working to unlink this dependency and build a basic demo Tendermint2 chain and Client.\n\nTendermint2 JS/TS Client is a JavaScript/TypeScript client implementation for Tendermint2-based chains. The client will make it easier for developers to interact with Tendermint2 chains, with a simplified API for account and transaction management, removing a ton of manual work and allowing developers to focus on building their dApps. You can [read more about the client here](https://www.npmjs.com/package/@gnolang/tm2-js-client). In addition to the Tendermint2 JS/TS client, we also created a Gno JS/TS client that just extends the TM2 one to provide Gno-specific functionality. You can read more about this here.\n\n## Game of Realms\n\nThe incentivized competition to find the best contributors to Gno.land continues in phase one, with slow but steady progress being made. Nir1218 initiated an Evaluation DAO Kickoff discussion in [issue 792](https://github.com/gnolang/gno/pull/792) to initiate testing code for the key smart contract infrastructure that will power the Gno.land platform. We are also interviewing architects for the core team with experience in governance modules and creating new economies on-chain, and a new DevRel team member will be joining us soon to create awesome tutorials and documentation to advance Game of Realms further. Gno.land must be built by the community and we will not rush to push Game of Realms to the second phase until we have found quality contributors to complete the challenge tasks and become the platform’s first founding members.\n\n## Gno IDE\n\nOur core development team is working on a web-based IDE for Gno.land that will greatly improve the developer experience, allowing builders to quickly spin up Gno realms and packages right on their browsers just by visiting a web app. Currently named Gno IDE but with a rebranding on the horizon, this intuitive product focuses on ease of use and improved UX, and will include all the features you’d expect from an IDE, such as auto compilation in the editor, debugging, extensive testing capability, and powerful APIs like IntelliJ to supercharge your programming.\n\nGno IDE currently has multiple modes to support different use cases, including a normal mode for everyday programming, similar to a standard code editor, a presentation mode for video calls or screen sharing, and an embedded mode to extend functionality, allowing you to embed the IDE directly into websites and blogs. You can also choose to edit your code in Emacs or Vim and easily switch between steps, from previous to next, making creating your tutorials and blog posts more intuitive. Watch out for more to come on Gno IDE soon, and if you want to contribute by creating a plugin for your favorite editor, open a PR to win contribution points.\n\n## Stack/Frames Management\n\nThe stack/frames is an integral part of the virtual machine (VM) and the language. Stack/frames provide context for smart contract developers, enabling them to access useful information, such as the original caller, or to determine if a contract is being called through another one. The current implementation is limited in scope and relies on fixed positions in the stack which can lead to inconsistencies.\n\nThere is an ongoing [issue 683 open here](https://github.com/gnolang/gno/issues/683) and we have continued to work on enhancing stack/frames development over the last month. We’re adding a new function in the standard library std.PrevRealm (previously GetRealmCaller). Currently, we only have GetOrigCaller, which returns the user calling the first realm. This is not secure and we need a way to call the previous caller. This will allow a realm to handle GRC20 treasuries. See [issue 667](https://github.com/gnolang/gno/pull/667) and [issue 634](https://github.com/gnolang/gno/issues/634) for further details.\n\n## Dealing with Panics in Native Functions\n\nWe have devised a solution for dealing with panics in native functions, [see pull request 732](https://github.com/gnolang/gno/pull/732). Previously, when there was a panic in a native function, we could not recover it in Gno code. An example of this was the assert origin call, which panicked if the call was not a direct call from a transaction. Based on discussions with contributors, we’ve agreed that native functions should never panic, but if they panic, they panic with machined Gno panic. This gives us the choice in a native function to code a Gno panic, or, if it's a very bad panic, use Go panic so that we know the Gno code is unable to recover it.\n\n## Logic Upgrading\n\nMaking it possible to upgrade your logic is definitely out of scope for the first version of Gno.land, however, it’s an important issue that we have begun to discuss so that we can place certain restrictions on it, such as allowing upgrades when we consider them safe enough to be compatible with imports. Another idea is to work on creating workflows where migrations become something official. This way, we could define ways to migrate a contract completely in a single transaction at the chain level. Once everything is working and approved as the previous contract is parsed or archived, the new one gets the data. We will revisit this topic after the first version of Gno.land reaches the mainnet.\n\n## Garbage Collection\n\nIn terms of garbage collection, we don’t have memory leaks as such but we do have defacto memory leaks. By the VM having references to all objects, they won’t be released by Go’s underlying GC. We have some form of reference counting but it is only done at the end of a transaction. We have implemented a mark-and-sweep garbage collector and are working on the VM runtime to manage the objects and signal to the garbage collector to release them when they are no longer needed. This is done by adding the notion of a heap, which is managed by the garbage collector.\n\n## GnoVM\n\nDeveloping GnoVM is an ongoing task and we will likely need to fork the GnoVM to create different competing versions. GnoVM will be complete, limited in features, and serve as the only interpreter, an enduring reference point over time. Future versions of GnoVM will be designed to incorporate CosmWasm so that all Cosmos chains can have CosmWasm enabled and the VM can run directly on the browser and execute tasks on the browser without requiring to make an API call, making it faster. To do this, we can make a Gno compiler in WebAssembly without changing the code because Go supports WASM cross-compilation.\n\nWe plan on making a competing version of the original minimalist GnoVM, such as a Rust version with a JIT compiler using LLVM as a backend.\n\n## Ecosystem Updates\n\nSince our last update, the Gno.land community continues to expand with awesome teams and contributors building cool infrastructure and projects on the platform. Below, we take a look at the largest developments of the past few weeks and extend a special thanks to everyone helping us build Gno.land.\n\n## Teritori\n\nTeritori blockchain and multi-chain hub launched in November 2022, allowing IBC and non-IBC communities to connect, create groups, exchange tokens and NFTs, and launch new projects. Teritori’s idea for building on Gno.land is to create a multi-chain experience for users with a web portal, NFT marketplace, and social feed that will grow the community, and gradually integrate smart contracts and realms. This will promote Gno.land to more developers and showcase all the dApps being built through an easy-to-navigate dApp store. In the coming weeks, Teritori will work with the Onbloc team to integrate the Athena wallet into their portal as well as discuss ideas for promoting Game of Realms to new developers.\n\n## Onbloc\n\nOnbloc is one of the Gno.land ecosystem’s most active contributors, responsible for building the Adena wallet and the block explorer Gnoscan. The team has also been working on creating an official Gno SDK that will allow developers to interact with Gno.land more easily, and remove some of the current friction. Onbloc opened [issue 701](https://github.com/gnolang/gno/issues/701) on GitHub primarily for developers who either have their own web app or are building a JavaScript app and want to work with Gno in some way. Currently, developers need to do a lot of manual work, which Gno SDK will abstract away, improving the workflow and developer experience. If you have any ideas or feedback, please contribute to the aforementioned issue.\n\nIn another cool development, Onbloc has rolled out a new feature in Adena and Gnoscan to provide support for GRC20 tokens. To store and send tokens, you can open your Adena wallet, click on \"Manage Tokens”, navigate to the Custom Token page, and see which GRC20 tokens are available on Gno Testnet 3, searching by the symbol or path. To research on or discover tokens, head over to the Tokens page on Gnoscan for a full list of GRC20 tokens. You can click on any token on the list for detailed information, such as the total supply, owner, or other available functions built into the token. The Account Details page has also been updated to display all tokens owned by each address. You can help by checking out [issue 764](https://github.com/gnolang/gno/pull/764), which discusses adding bigint to support a wide range of numbers and encoding binary, and [issue 816](https://github.com/gnolang/gno/pull/816), which highlights a small bug the team runs into when coding.\n\nOnbloc has also created a new [token resource page on GitHub](http://github.com/onbloc/gnotokenresources) for anyone to share or upload resources associated with their Gno.land project. This will serve as a shared knowledge pool about any dApp on the platform. If you wanted to create a decentralized exchange, for example, you would need all the information about the tokens available on Gno.land, such as their images, symbols, descriptions, links to websites, etc. Now you can find this in one handy GitHub repository. If you’re a developer or builder who wants your logo or any other static data posted, be sure to submit a PR.\n\nAnd speaking of decentralized exchanges, Onbloc is also building Gnoswap, the first DEX to be powered by Gno.land, designed to simplify the concentrated liquidity experience and increase capital efficiency for traders. Its interface is built using TypeScript to be user-friendly, secure, and accessible for streamlining complex mechanisms such as price range configurations and staking as part of its core service. Contribute to its interface [here](https://github.com/gnoswap-labs/gnoswap-interface).\n\nAs for the contract side, Onbloc is actively working on its development with help from the core members of Gno.land. The code will be open-sourced for full transparency once the basic functions are ready.\n\n## New Core Contributors\n\nWe’re excited to welcome two new core team members, Antonio and Zack. Antonio joined us in April in the core team, bringing with him vast experience in IPFS, and writing Git servers in Go. Zack is our first “tinkerer in residence” and will try to bootstrap the ecosystem of small contracts and small libraries. He will also be writing apps and helping us design a system to better share and showcase our work with a super UX for team builders and open-source addicts.\n\nAntonio is already hard at work researching a benchmarking dashboard that will show performance improvements or regressions when we change the code. He’s assessing whether to use GiHub to track actions or run our own machine to execute GitHub actions. Take a peek at his research so far on [issue 783 here](https://github.com/gnolang/gno/pull/783).\n\nZack is working on a microblog project. As an experienced web2 Go programmer, Zack is transitioning to web3. Since he’s interested in incentivized social networks, the microblog project will be his first realm, as a Twitter-style blog without titles, where each user has their own page based on their address. Check out [issue 391](https://github.com/gnolang/gno/pull/391) for more details.\n\n## Developer Events\n\nOver the past few weeks, our core devs have been mainly focused on building but they’re preparing to speak at some exciting events in the coming months. Catch up with Manfred at BUIDL Asia, in Seoul, South Korea, from June 5 - 9. We’re co-hosting a side event with Onbloc, Code States, and Cosmostation on June 5, so be sure to register if you’re in town! We’ll also be at EthBelgrade in Serbia from June 2 - 4, and GopherCon in Berlin from June 26 - 29, so stop by and say hello.\n\n*Do you want to contribute to Gno.land’s monthly updates? If you’re building on Gno.land and want to highlight your development, project, event, or idea, let us know and we’ll include your contribution.*\n","2023-05-26T13:37:00Z","christina","gnoland,gnovm,tm2"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["funding-program","Announcing the Gno.land Funding and Grants Program","\n\nIf you’re interested in building in Gno.land and using the Gnolang (Gno) language to make a meaningful contribution, we’ve launched the Gno.land Funding and Grants Program to support you on your journey. If you’re a developer, tinkerer, researcher, or educator and you’re excited by the idea of creating innovative dApps, tooling, infrastructure, products, or smart contract libraries on Gno.land, now you can apply for funding.\n\n## About the Gnoland Funding and Grants Program\n\nWe’re building Gno.land to endure with timeless code that will serve as a reference point for many years to come. Secured by a novel consensus mechanism, Proof of Contribution, Gno.land rewards contributors fairly, addressing one of the blockchain industry’s biggest problems. The developers that are most active on the platform with the highest quality contributions will secure the most rewards. We already have a growing community of Gnomes innovating and building on Gno.land and we’re looking to add more contributors to extend the usability of the platform and its smart contract library.\n\nOur grants program will encourage further participation by allocating financial awards and contributions to individuals and teams who want to build dApps, core infrastructure, products, or features on Gno.land, incentivizing more like-minded Gnomes to test the Proof of Contribution mechanism and push the chain to new limits. The grant amount and duration will depend on the scope and ambition of the project as well as the work involved.\n\n## Types of Contributors\n\nThe Gno.land Funding and Grants program is divided into four different categories – tinkerer, builder, researcher, and educator – to ensure that we cater to a diverse range of people and working preferences. Here’s how we define these categories:\n\n- Tinkerer: You want to experiment and invent\n - Build dApps, improve features, and find and develop new ideas\n- Builder: You have an idea and are ready to build it\n - Build dApps, infrastructure, tooling, products, or port your existing apps to Gno\n- Researcher: You want to discover and analyze\n - Deep dive into topics linked to the Gno.land universe\n\n## What We Are Looking For\n\nTo qualify for a Gno.land grant, we’re looking for motivated and passionate people who can contribute by developing dApps, core infrastructure, useful and innovative products, or features that improve the usability of the Gno.land chain, specifically:\n\n- Decentralized Applications (dApps)\n - What types of dApps do you want to see on Gno.land? Show us.\n - Build, test, and launch a suite of Gno.land dApps for the community, focusing on diverse use cases and industries such as DeFi, gaming, supply chain management, and social media. Ensure that these apps cater to both individual users and businesses\n - These dApps should integrate seamlessly with existing Gno.land infrastructure, encourage user interaction, and promote the adoption of Gno.land services\n- Infrastructure, DevX, Quality\n - Develop comprehensive GitHub and AWS integration for Gno.land, including streamlined deployment processes, continuous integration and delivery pipelines, and monitoring tools\n - Create Helm charts for easy deployment and management of Gno clusters, enabling users to quickly set up and scale their Gno infrastructure\n - Design and implement an event system for Gno.land contracts, allowing for real-time monitoring, analysis, and auditing of contract-related events\n - Enhance Gno.land security by conducting regular vulnerability assessments, penetration testing, and implementing best practices for secure smart contract development\n- Products\n - Develop advanced project management software tailored to the needs of Gno.land developers and teams, with features such as task tracking, collaboration tools, and integrated Gno.land services\n - Create comprehensive documentation, including guides, tutorials, and API references, to help users understand and utilize Gno.land's features and services more effectively\n - Design a censorship-resistant smart contract system, enabling secure and transparent transactions and interactions on the Gno.land platform, free from external interference\n- Interoperability \u0026 Integration\n - Implement cross-chain compatibility and interoperability, allowing Gno.land to connect and interact with other blockchain networks, expanding its potential user base and increasing its overall reach\n - Develop a powerful integrated development environment (IDE) specifically for Gno.land developers, with features like code completion, debugging tools, and seamless integration with Gno.land services\n - Design and launch a user-friendly wallet for Gno tokens, featuring a secure and intuitive interface, support for multiple devices, and easy integration with Gno.land dApps\n\nThe above guidelines are by no means exhaustive and are intended to spark your imagination and give examples of the types of contributions we’re looking for in Gno.land. We’re open-minded and willing to assess all grant proposals, so if you have an idea that’s not on the list or a suggestion that you think will benefit our vibrant community, let us know. If your submission doesn’t qualify for a grant, we’ll do our best to provide you with open and honest feedback and points for improvement, as well as identify any opportunities to get involved in our ongoing incentivized Game of Realms competition.\n\n## Meet Our First Grantees\n\n### Onbloc\n\nOnbloc is a blockchain software company building core infrastructure for Gno.land and\n\nhelping other dApp developers onboard to the Gno.land ecosystem seamlessly. The team has developed the Gno.land Developer Portal, which provides comprehensive introductory docs for developers, the Adena web3 wallet for Gno.land, and the Gnoscan block explorer. As Gno.land’s most active contributor, Onbloc is leading many community-driven initiatives and we’re excited to extend a grant to this passionate South Korea-based development team to continue their incredible work developing the wallet further, iterating the Gnoscan block explorer, and building Gno.land’s first DEX, Gnoswap.\n\nIn addition to this, we want to encourage Onbloc to continue their amazing work with the community, contributing to meetings, replying to comments on our social platforms, writing code base, organizing local events and meet-ups in South Korea, and creating products that expand the Gno.land ecosystem.\n\n*“Onbloc is thrilled to be a part of the Gno.land Grants Program. As one of the earliest contributors, our endeavors have involved releasing technical guides and research reports, developing infrastructure tools for dApps, creating DeFi smart contracts, and more. We are excited to leverage this grant to further enhance the quality of our products and strengthen our workforce. The grant will enable us to cover some of the existing expenses and hire additional developers to focus on smart contracts and the core side of GnoVM. We expect these endeavors to push the Gno.land blockchain to new limits and accelerate the achievement of the milestones on our roadmap. With the support from the Gnoland team, we are confident in our ability to make significant strides and further contributions to foster the growth of the Gnoland ecosystem.”*\n\n*Dongwon Shin, CEO, Onbloc*\n\n### Teritori\n\nTeritori is a super-dApp project allowing individuals and organizations to interact, organize, and communicate in a radically resilient and decentralized way. Based on an interoperable vision, the application is built on a multi-chain experience approach, gradually integrating Gnolang as the fundamental technical brick of the system. Currently in Beta ([available here](https://app.teritori.com/)), the app is making modular tools and dApps available to users, with a single gamified user experience. Teritori's philosophy is to offer users and developers a place that belongs to them, their territory, with an emphasis on interoperability, modularity, and customization.\n\nUsers can interact with a social network, NFT marketplace, DAO launcher, service marketplace, games, etc., and integrate a plethora of dApps thanks to the dApp store, where Teritori will promote all Gno.land dApps to encourage the growth of the ecosystem. Using the Gno.land grant, Teritori will continue this amazing work and develop a moderation DAO to provide content moderation to Gno.land in a healthy and decentralized way, a challenge that faces the entire web3 industry. By 2024, the UX of Teritori v1 will be based on decentralized messaging without blockchain, allowing users to converse in a \"natural\" way while adding modules and web3 features. Creating and managing a GnoDAO could be as easy as managing a WhatsApp group.\n\n*“At Teritori, we want to make decentralized organizations accessible to all and experiment with new governance models for humans, social groups, businesses, and diverse organizations. Gno.land enables us to build this vision in a modular, future-proof, and censorship-resistant way. Thanks to the Grants Program, we'll be able to accelerate our development, continue to contribute proactively and build user experiences that enable as many people as possible to discover the Gnol.and ecosystem. We're starting work developing a DAO launcher, with different standard templates for DAOs, in particular, DAOs enabling moderation within news feeds, forums, or social networks. This will rapidly open many doors, such as those of conflict resolution DAOs, on-service marketplaces, or project management software. Gnol.and is a playground where anything is possible! We'll be documenting [our journey here](https://github.com/gnolang/hackerspace/issues/7#issuecomment-1588197187), and sharing our progress as we stay connected to the needs of the community.”*\n\n*Zooma, Core Lead, Teritori*\n\n### Zack\n\nZack is the first tinkerer-in-residence at Gno.land. With a deep-rooted passion for innovation, he embraced Go early on in 2013 and ever since, has been harnessing its power to craft peer-to-peer programs and develop web2 applications. While Gno.land marks Zack's initial foray into web3 development and blockchain dApps, the Gnolang language allowed him to effortlessly apply his Golang expertise. This has enabled him to flourish within an ecosystem that revolves around decentralized systems, seamlessly transitioning his skill set to create unique decentralized solutions.\n\n*“I have always been curious about web3 and blockchain technologies but have not developed expertise in smart contract languages and struggled to keep up with the fast-changing ecosystem around blockchain technologies. As an avid Go programmer, Gno and Gno.land created the opportunity for me to develop decentralized applications on blockchains by providing a framework and ecosystem that is consistent with Golang in terms of syntax, sustainability, and stability. The additional web3 features in Gno and Gno.land provide huge potential for interesting applications that I hope to unlock to move beyond web2 and harness blockchain technology for novel use cases. The grant provided for tinkerer-in-residence was the key to giving me the resources to move through this ecosystem as I try to think outside the box for what web3 can be and what blockchain can do for a web2 developer like myself.”*\n\n*Zack Scholl, tinkerer-in-residence*\n\n**How You Can Apply**\n\nActions speak louder than words. Until Gno.land is completely on-chain, the best place to start is by contributing to PRs and issues on the Gno.land repos or participating in the Game of Realms competition. If you want to apply for a grant, you’ll need to fork the Gno.land Ecosystem Fund repo and outline your proposal in your project name’s file. Once we receive your application, our team will review it and get in touch if we believe that you fit the criteria. [See GitHub for full instructions](https://github.com/gnolang/ecosystem-fund-grants). Stay tuned, we’ll be hosting a Funding and Grants Program Q\u0026A in the next few weeks!\n","2023-06-27T13:37:00Z","christina,michelle","gnoland,funding,grants"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-3","The More You Gno: Gno.land Monthly Updates - 3","\n\nWe’ve been busy since the last edition of *The More You Gno,* with the Gno.land core team and ecosystem partners present at various global developer events. We’ve visited many gnomes (and gnomes-in-the-making) around the world from Berlin to Belgrade, spreading the word about Gno.land and growing our expanding community. Aside from all the networking, Gno.land is taking shape with a new iteration of our website, the Gno.land Funding and Grants Program, and a host of developer updates as always. Let’s dive in.\n\n## Gno by Example\n\nWe recently launched [Gno by Example](https://gno-by-example.com/), our equivalent to both [Solidity by Example](https://solidity-by-example.org/) and [Go by Example](https://gobyexample.com/), where you can see tutorials and code snippets to help you learn and get more easily onboarded to Gno.land. Gno by Example is designed to be community-run with a front-end app and tutorials in markdown. There’s also a specific markdown syntax where you can embed certain file fragments to make your tutorials more structured. We’d love to build this into the ultimate resource center for Gno.land, so feel free to [contribute](https://github.com/gnolang/gno-by-example) with new tutorials and sections. Contributions here are eligible for rewards from the Game of Realms competition.\n\n## GnoVM\n\nWe continue developing GnoVM and invite you to provide feedback on what can be improved. This month, there have been a lot of discussions about how to improve native bindings and use the Gno machine in native function calls. Native function calls are well-defined in Go code generation and Go templates but need some modifications for GnoVM. For example, since new native functions already exist in the Gno code, when we try to define a native function, calling the function doesn’t yield the desired result. We’ve created a bunch of panics and tried writing out native functions to see what goes on for them, in an investigation that will go on for the next few weeks. Got any ideas? Please contribute. ([PR 859](https://github.com/gnolang/gno/pull/859)).\n\n## Testnets\n\nTalk about testnets has come up a lot in recent weeks and how to best proceed. Some gnomes are asking for a multi-node testnet to allow for great experimentation, whereas others prefer to keep the testnet single-node. There are advantages and disadvantages to both approaches and we are still listening to feedback and ideas. However, we will likely keep testnet 3 single-node and focus on the language while having a second dedicated multi-node testnet where devs can get creative, think outside of the box, test performance, consensus, and everything they need to push the chain to its limits. We’ve created a new [Hackerspace](https://github.com/gnolang/hackerspace) Repository for the multi-node testnet to prevent spam on the main repo, so please use it to share your scripts, posts, snippets, etc.\n\n## Native Coins and GRC-20 Tokens\n\nWe uncovered some significant issues with the banker module ([PR 393](https://github.com/gnolang/gno/pull/393)) regarding minting and burning tokens with the package minter. It was not scoping, filtering, or minting tokens correctly, making it possible to mint and burn unlimited tokens, including GNOT. We want to allow any realm to create its own token and run multiple tokens on their chains, but we need a prefix for security to resolve the issue and allow anyone to create GRC20 smart-contract-based coins but not native coins. We continue to work with small fixes on this issue and will reopen the PR soon.\n\n## Gno.land Funding and Grants Program\n\nLast month we released our Funding and Grants Program to encourage more developers, researchers, educators, and tinkerers to interact with Gno.land. If you’re interested in experimenting with Gnolang (Gno) and building innovative dApps, tooling, products, or infrastructure, check out our GitHub [Funding and Grants](https://github.com/gnolang/ecosystem-fund-grants) page for further information on how you can apply. Start contributing to Gno.land or Game of Realms as this is a prerequisite of the funding and grant application process.\n\n## Developer Relations\n\nThe Gno core team is growing! We hired a new DevRel last month and are looking to take on another dev for this open position, so if you’re interested, head over to our [careers page](https://jobs.lever.co/allinbits) and apply! You can expect to see a lot more documentation, FAQs, tutorials, and onboarding materials in the coming weeks and months.\n\n## Ecosystem Updates\n\nOur community of gnomes continues to expand, making tons of activity and progress over the past few weeks. Let’s see what they’ve been up to below.\n\n## Onbloc\n\nOnbloc has been super active this month attending and co-hosting IRL events and networking to find new gnomes about town. Among other updates, Onbloc has completed the first integration of Tendermint2 JS with the Adena wallet and will continue to swap out their existing libraries with TM2JS wherever applicable to ensure that they are as tightly integrated as possible. The team has also open-sourced the Gnoscan block explorer, so if you’re interested in contributing, hop on over to [Gnoscan](https://gnoscan.io/) or the [GitHub repo](https://github.com/onbloc/gnoscan).\n\n## Teritori\n\nAnother of our first cohorts from the Grants program, Teritori continues to churn out awesome work and expand its growing team. This month, Teritori has been busy integrating Adena with the Teritori app and working on the DAO contract to build a DAO deployer and various DAO standards and templates for DAO creation. Teritori’s target is to focus on a moderation DAO that can be used for content moderation in social feeds and boards. In the coming weeks, the team plans to integrate the DAO contract into the UI to allow the community to launch a DAO and experiment on the testnet. They have also made an effort to really integrate Gno users by adding .gno at the end of nicknames for people to use. All our grant recipients are documenting their journeys in the hackerspace repo, check out [Teritori’s](https://github.com/gnolang/hackerspace/issues/7) journey.\n\n## Resident Tinkerer, Zack\n\nAnother grant receiver, Zack, has been making significant progress on his microblogging project. You can check out the specs on GitHub ([PR 791](https://github.com/gnolang/gno/pull/791)) or watch the informative tutorial video, [Go to Gno: How to Build a Microblog](https://www.youtube.com/watch?v=F-_dadxcRJM). You’ll find this especially useful if you have a background in Go and need some additional insights to turn your hand to blockchain coding. Zack has also been working on an implementation of a smart contract for creating and transferring text-based NFTs that conform to haiku poetry standards (find out more on GitHub ([PR 860](https://github.com/gnolang/gno/pull/860)). Other than that, Zack continues his Gnolang journey, “learning and having a lot of fun.”\n\n## EthSeoul, BUIDL Asia, and Getting to Gno\n\nJune saw members of our core team heading over to Seoul, South Korea, for a week of networking, talks, and events. Our VP of Engineering Manfred Touron gave a keynote on the evolution of smart contracts and an introduction to Gno.land for participants of EthSeoul, followed by a fascinating dive into Proof of Contribution at BUIDL Asia, where we also had a booth. It was an honor to meet so many talented and motivated Korean developers and contributors from around the globe. Seoul is a hotbed of up-and-coming talent and we’ll definitely be back soon.\n\nWe also had the chance to meet with our most active ecosystem contributors Onbloc and co-hosted an event together, Getting to Gno, at the Code States developer academy along with long-time Cosmos builders, Cosmostation. Attendees had the chance to hear about what the core team is building and see some of the great work of our community. A massive thanks to everyone involved, it’s awesome to be BUIDLing together! Read more about our Korean adventures in this [fab write-up by Onbloc](https://medium.com/onbloc/2023-buidl-asia-recap-894c60a1c0f).\n\nEthSeoul - [Watch the talk here](https://www.youtube.com/watch?v=_iSsStlmxoU)\n\nBUIDL Asia - [Watch the talk here](https://www.youtube.com/watch?v=v6k3NHm5vcE)\n\n## EthBelgrade\n\nCore contributor Milos Zivkovic rocked the Gno.land presence at EthBelgrade in Serbia, giving an introductory workshop about Gno.land, called 'Alice in Gno.land'. Being the first Ethereum conference organized in Serbia, there were lots of attendees from all over the Balkans. Participants joined in a journey through the enchanting realm of Gnolang and the Gno.land platform. Most of the participants were not aware of Goland before but were avid Gophers eager to learn more about the application of the Gno language in blockchains.\n\n## GopherCon Berlin\n\nThe Gno.land team also had a blast last month at the European edition of GopherCon in Berlin. We had a booth at the event for two days, where we networked, talked about all things Gno, made some amazing connections, and even shared some live code! We’re looking to build an active, open-source Gopher contributor group in Gno.land, so stay tuned for more on that soon.\n\nComing up later this month, Gno.land is an official sponsor of EthCC, Paris, July 17-20. Stop by our booth to pick up some swag, say hey, and ask your questions about Gno.land. You can also catch us at the Nebular Summit for a keynote and workshop by our VP of Engineering, Manfred Touron.\n\n*Do you want to contribute to Gno.land’s monthly updates? If you’re building on Gno.land and want to highlight your development, project, event, or idea, let us know and we’ll include your contribution.*\n","2023-07-11T13:37:00Z","christina","gnoland,gnovm,tm2"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-4","The More You Gno: Gno.land Monthly Updates - 4","\n\nWe’ve had more on our plates than ever over the last few weeks, with a huge team presence in Paris at EthCC and Nebular Summit in July, an opening talk at Stanford Blockchain Club in August by Gno.land’s founder Jae Kwon, and some awesome contributions from Gno.land grantees and ecosystem partners, including the first demos of Gnoswap and Teritori’s social platform and DAO deployer. We continue to make solid progress on GnoVM, an alternative VM in Rust, Tendermint2, native bindings, and much more. Check out our latest developer updates below.\n\n## Upgrade Strategy for AVL Between GitHub and test3.gno.land\n\nOne ongoing discussion is about an incompatibility bug that affects many things we do on Gno.land. The current AVL implementation on the testnet is outdated and does not match the AVL implementation users get when they pull in the latest master branch. Therefore, building and deploying contracts on a local Gno chain (with the latest master changes) and deploying those same contracts on the testnet may fail due to this incompatibility. We need to find a way to seamlessly integrate these two approaches. Ideally, when you write code on the master branch on GitHub, it should work on the testnet as well.\n\nIn [issue 970](https://github.com/gnolang/gno/issues/970), you can find details of five different proposed solutions to implement this upgrade strategy, from resetting the whole blockchain (which would mean losing on-chain content and debugging information) to implementing a migration feature specifically for testnets that allows developers to rename packages and patch their contracts before publishing them. There are pros and cons to each proposal, and we continue to work together to find the best way forward.\n\n## Encoding JSON and the Discussion Around Reflection\n\nSome contributors have highlighted the need for native JSON encoding, and we are discussing how best to approach it. See [issue 808](https://github.com/gnolang/gno/issues/808) for further details. One idea is to copy the code from encoding JSON in the standard library Go and take it over to Gno, but we would need to have reflection to do that. So, the important question here is whether we want to have reflection and, if so, what it should look like. We could emulate Go’s reflection package with some added elements, like being able to inspect the realm state, but we would need to be extremely careful about how we do this.\n\nFor example, should users be able to read private fields of external packages through reflection or even *ufmt*, or could that introduce a problem? It would be simpler, and the language capability security would be tighter and easier to understand if we made accessing private fields impossible, but that would also make it limited. We could consider supporting reflection as an internal user package and whitelisting and encoding JSON. This way, new encoding packages would have to be whitelisted because they’re using the reflection package. We could also mark reflection as unsafe so developers know they must carefully audit their work.\n\nAnother solution is the partial implementation of reflection. In [issue 971](https://github.com/gnolang/gno/issues/971), Gno.land core engineer Petar discusses introspection, which involves implementing reflection as Go has it now but enabling only one of its two main capabilities: the ability to inspect types, but not the ability to modify code. The main difference between introspection and reflection is that, since it is done at compile time, it is completely type-safe. This discussion is ongoing.\n\n## Alternative GnoVM Implementations\n\nTo deliver the best possible virtual machine, we’re working on two different implementations of GnoVM. Petar has spent the last three weeks developing a new GnoVM implementation written in Rust. His work is still private as the machine is not yet ready for public use, but he will soon make the code public for your inspection. Rust gives the ability to write more performant code and, in some scenarios, the Rust GnoVM can run up to 20 times faster than the GnoVM at roughly 87 milliseconds compared to 2,000 milliseconds on a Fibonacci benchmark, which is a considerable improvement in speed.\n\nSince one of Gno.land’s core features is that the entire tech stack is written in Go, we’re unsure if everyone will appreciate a Rust GnoVM or whether it aligns with our vision. However, it’s always good to provide alternatives, and, Petar argues, as long as the VM carries out the same functions (and does so more cheaply), most developers won’t mind what language the VM is written in.\n\nRust has a few other features that some developers may favor over Go, such as more tools for creating languages, advanced garbage collector libraries that allow you to change the algorithm without changing the runtime (by swapping out a tricolor algorithm for a generational one, for example), and built-in data structures that solve many issues. For example, we needed a deterministic map that is fairly fast. With Rust’s Btree in the standard library, this was simple, Petar only had to implement the native Go map type with a Btree map from the standard library. This took just a few minutes.\n\nCore team dev Marc has also started an initiative to improve the Go GnoVM so that it is faster and offers a clean and user-friendly interface. He believes the debate over the VM is more about whether to have a VM that is bytecode-defined or AST-defined (rather than speed). Marc has been comparing the fundamental differences between the two and noted that the bytecode version is 15 times faster than the AST. This means that changing to Rust would give an increased performance of 2-3 times.\n\nThe VM must be fast, secure, and performant in many ways. In either version, the AST will be stored on the blockchain, whereas the bytecode is only an internal representation that doesn't affect the users. We must still consider any potential architecture consequences between bytecode and AST before deciding whether to change. Marc’s WIP code is still in a private repo, but you’ll be able to inspect it soon and make a comparison of the VM implementations in the coming weeks. The decision about the direction of GnoVM is still very much TBD; however, the Rust GnoVM will not replace the Go GnoVM but will complement it, eventually giving validators the choice of which to run.\n\n## Defining Wording for People/Documentation and Consistency\n\n[Issue 1024](https://github.com/gnolang/gno/issues/1024) discusses the need to define the wording we use throughout our documentation, for example, how we name a module, package, sub-module, etc. Once we have the wording defined, we will set the GnoVM to only accept elements with the correct naming. The importance of wording affects the design choice of the whole project and how we go about versioning for the best possible user experience.\n\nFor example, is mt/board/admin part of the same realm of mt boards, or is it its own realm? Can we work with both by adding patterns to have some realms responsible for hosting data and others responsible for having more privileged actions? How do we split a complex realm into sub-libraries and sub-realms? We want to define the documentation and the logic for this and have begun to touch on this issue. We will discuss this in greater depth in the upcoming developer calls.\n\n## Improving the GRC20/Foo20 APIs\n\nWhen working on the specs for a Merkle airdrop contract, Albert came against some issues with users initiating airdrop reward claims (see [PR 906](https://github.com/gnolang/gno/pull/906) for more details). Currently, when the Merkle airdrop contract tries to execute the reward claim for the user, an instance of the GRC20 contract is used for transferring. Within the GRC20 implementation Transfer() method, the caller (token sender) is fetched using the standard library method std.PrevRealm().\n\nHowever, calling this method in the Merkle airdrop context returns the user as the caller, not the Merkle airdrop contract, which is an unexpected functionality. We are discussing different ways to tackle this issue efficiently. However, each solution would require possible changes to the GRC20 API and subsequent token implementations. Additionally, as part of [PR 952](https://github.com/gnolang/gno/pull/952), we are looking into improving the standard GRC20 API and possibly resolving the ambiguity with standard library calls that are causing the mentioned issues.\n\n## Client Optimized for CLI, Not Mobile\n\nOur newest contributor to Gno.land, Berty, is developing the mobile version of Gno, which means writing a mobile app to interact directly with the blockchain. The team is facing some issues as they need a client library with utility functions like sign and broadcast, which are used by the command line. This code (tm2/pkg/crypto/keys/client) is not ready for external users yet, and the Gno client is designed for CLI. However, Berty needs a way to interact with the Gno chain from their application and to call the logic without adding the full CLI.\n\nFrom the existing TypeScript/JavaScript client library (gno-js-client and tm2-js-client), Berty should be able to build out a Go client library by exclusively using the RPC endpoints of the node itself (just like gno-js and tm2-js work), and not having to worry about importing private logic like transaction broadcasting. The team is writing its own framework to call Go code for Gno from Java, Swift, and React Native mobile apps that creates a transaction and sends it (see [PR 1047](https://github.com/gnolang/gno/pull/1047)).\n\nThey are working on an API that interacts with the blockchain and lets them export the code without having to write their own utilities. The API will be minimal, and update the Tendermint2 build script by moving tm2txsync from tm2/cmd to gno.land/cmd (see more details in [PR 1080](https://github.com/gnolang/gno/pull/1080) here). For the time being, Berty will copy the code and use the objects directly until a more convenient API is complete.\n\n## Tendermint2 Development\n\nIn [PR 546](https://github.com/gnolang/gno/pull/546), we introduce file-based transaction indexing. Transaction index parsing should be done as a separate process from the main node, meaning other services can be instantiated to index transactions as readers. The current problem is that there is no way to figure out whether a transaction has failed after it’s been sent out with a broadcast sync, or fetch any kind of receipt information or error reason in the delivered transaction.\n\nSo, we’ve started working on an event indexer to index Gno node events, which include transactions. Soon, developers and users will be able to ask the event indexer what happened to the transaction or in which state in its execution it's currently at, and also to retrieve information on other events like block commits as they happen.\n\n## Extending the Functionality of Go\n\nIn [issue 919](https://github.com/gnolang/gno/issues/919), Petar proposes extending the functionality of Go by adding constant data structures, arrays, slices, etc. He believes this would benefit users, as they wouldn’t need to create special functions as in Go to simulate this behavior, and it would also catch bugs when there is mutation. There has been a discussion, and Jae has similar ideas with the notion of “invar” expressions, where the resulting value can only be read, not mutated or stored. This would fix the bug where if you pass a pointer (that represents part of your contract state) to another contract, the other party can “steal” it by assigning it to their state, and your contract would fail to execute.\n\nMorgan believes that we should take a different approach as slices have the semantic in Go, where the underlying array is always heap-allocated and modifiable. Introducing constant slices would thus necessarily have to introduce concepts regarding im/mutability of values without the matching constructs that a language like Rust has. To make a compromise and keep compatibility with the Go spec, we are likely to implement this in a transpiler (gnoffeescript) that would implement this feature and be able to transpile to valid Go.\n\n## Grantee and Ecosystem Updates\n\nAs you can see, we’ve made a ton of development progress over the last few weeks. We’re also steadily adding more gnomes to our community of builders, and they’re working on the core infrastructure of Gno.land, as well as the permissionless dApps the platform will house. Let’s see what they’ve been up to since the last update.\n\n## Onbloc\n\nOnbloc has been busy, as always, with a slew of updates for us over the last few weeks. The team has been developing Gnoswap, the first Gno.land automated market maker with concentrated liquidity, and they gave us a live demo. On the front end, which is still a work in progress, you can find a one-stop venue for traders to view all the information about tokens on gno.land, so you don’t have to move between Gnoswap and a token aggregator like CoinGecko. You can also see incentivized pools sorted by liquidity, volume, APR, liquidity mining rewards, etc., and a wallet page to check your balances. You will also be able to deposit or withdraw assets from the Interchain when IBC is enabled.\n\nCheck out the work they’ve done so far on the Onbloc [hackerspace](https://github.com/gnolang/hackerspace/issues/29). The team has also released [the documentation](https://docs.gnoswap.io/) about what you can expect from Gnoswap, the rationale behind their design choices, some information about tokenomics, a preview of the UI, and more. Their main focus is on delivering a smooth and welcoming user experience and abstracting away the difficult mechanisms of concentrated liquidity so that the interface is as minimal and simple as possible.\n\nThe team will be ready to launch Gnoswap as soon as gno.land reaches mainnet. Feature updates and enhancements will be aligned with the development of the core Gno Stack.  The code for Gnoswap has now been [open-sourced](https://github.com/gnoswap-labs), so you can take a look at everything they’ve done and even make suggestions. In the coming weeks, Onbloc will also work on building core Gno.land infrastructure to support an earlier launch. Find details of this in Onbloc’s [grant submission](https://github.com/gnolang/ecosystem-fund-grants/pull/4). And be sure to check out Onbloc’s informative 6-episode [blog series](https://medium.com/@gnoswaplabs/why-gno-introducing-gnoswap-dd6acc22e6a1) that features the history of blockchain and exchanges, a deep dive into the Gno Stack, and an introduction to Gnoswap, where they share details of their journey and insights.\n\n## Teritori\n\nWe also saw an awesome demo from the Teritori team, which you can check out at app.teritori.com. Simply connect your Adena wallet to create a user name, start interacting with the social feed, create your own DAO, and add members. The team is working on more extensive documentation to explain how it works in more detail. While still a work in progress, Teritori has developed a cool flagging system that allows you to unfollow content you don’t like or flag content as inappropriate. If posts receive many flags, users can vote on whether to ban them, creating a healthy and supportive social environment free from derogatory content monitored by a like-minded community through a moderation DAO.\n\nThe team continues its work on DAO interfaces and has built a useful tool for speeding up the deployment of packages as a workaround until we’ve decided how to best tackle realm versioning. They are also working on the escrow system, which will be useful for the freelance marketplace, and presenting DAO standards documentation.\n\n## Berty\n\nWe have a new contributing team to Gno.land from the Berty private messaging app. This team is working on a mobile version of Gno.land, implementing the WESH protocol, which is available by Bluetooth, local WIFI, or other means, and provides secure censorship-resistant communication between devices. The plan is to be able to provide an alternative transport for Gno applications when the internet is not available and build the skeleton/foundations that enable developers to create Gno-centric mobile apps more easily in the future. Berty brings a ton of experience in off-grid communication and getting apps to run on mobile devices, both Android and iOS.\n\nThe team has created its own [testnet](http://testnet.gno.berty.io/), which you are welcome to test out and play around with, although they will be restarting and rebooting without prior notice, so be aware that your work could be wiped. In the few short weeks they’ve been working with us, Berty has already finished their first Proof of Concept, a simple app running on iOS and Android. They copied code from the gnokey command line, and now it’s installing and running on mobile and interacting with the blockchain.\n\nNow, Berty is working on a nicer UI for the app and will propose a project to create a formal framework called GnoMobile, which will allow anyone to create their own app and run it on mobile. We look forward to seeing their demo soon.\n\n## Golang Working Group\n\nIn other news, we've started a bi-weekly [Gnome Golang Working Group](https://github.com/gnolang/hackerspace/issues/15) where we get together and discuss various topics, such as the language-related and theory elements of Go and Gno. We also aim to identify meaningful and reasonable ways to contribute to Golang, Gophers, and the general open-source community and improve our visibility there. We hope to attract more Go devs to the project and provide a “blockchain-less” experience for web2 Go devs.\n\nWe've had two meetings so far, and some recent hackerspace issues have already emerged from the discussions. One in particular that we’re actively evaluating is Gnoffee, a transpiler tool inspired by the likes of [CoffeeScript](https://coffeescript.org/) for Go and Gno integration. Gnoffee would be a powerful standalone tool to enhance Go and Gno (blockchain) projects by generating code and seamlessly integrating new features without manual coding. Find out more at the link above.\n\n## EthCC and Nebular Summit\n\nThe Gno.land team was in full force in Paris at the end of July for EthCC, where we met many passionate developers and spread the word about Gno.land and, specifically, how Gnolang compares and contrasts to Solidity. We had a booth during the conference manned by the Gno.land team complete with awesome swag and a continuous presentation in the background playing on a full-screen television.\n\nAt Nebular Summit, our VP of Engineering, Manfred Touron, [gave a talk](https://www.youtube.com/watch?v=CtxBajCcTYQ) called ‘Gnolang for Developers: Examining the Core Stack,’ where he broke down the major components of Gno, demonstrated how the upcoming Gno SDK compares with the existing Cosmos SDK, and explained why Gno.land is an excellent choice for accessible and sustainable blockchain development.\n\n## Blockchain Application Stanford Summit (BASS)\n\nJae opened the [Blockchain Application Stanford Summit (BASS)](https://bass.sites.stanford.edu/) event, attended by thousands of students and future blockchain developers. He gave an overview of Gno.land, GnoVM, and Gnolang, and explained the features that make our platform paradigm-shifting and timeless. He also dove into the core of why we’re building Gno.land – to provide a censorship-resistant platform for truth discovery that helps people improve their understanding of the world in an era of information censorship and control.\n\nComing up later this month, you can catch up with the Gno.land team at [DappCon Berlin](https://www.dappcon.io/) from September 11-13, where we’ll be delivering an informative keynote and hosting a side event to get to gno you better. If you find yourself in Barcelona for [Web3 Family](https://web3fc.xyz/) on September 23, you can join in a Gno coding workshop. You’ll also be able to meet the team at [GopherCon US](https://www.gophercon.com/) in San Diego. We’re hosting an action-packed workshop, ‘Chess: The Gnolang Way,’ on Gopher Community Day, where you can learn to build a web3 chess server on Gno.land and compete for cool prizes in an ongoing chess tournament throughout the event. More details coming soon. That’s all for now! Be sure to check back again with us for the next edition of *The More You Gno* to keep up with all our progress.\n\n*Do you want to contribute to Gno.land’s monthly updates? If you’re building on Gno.land and want to highlight your development, project, event, or idea, let us know, and we’ll include your contribution.*\n","2023-09-04T13:37:00Z","christina","gnoland,gnovm,tm2"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["chess-gc23","Play Chess with Us: The Gnolang Way at GopherCon 2023","\n\nCalling all gnomes and gophers! Come join the Gno.land team at GopherCon 2023, September 25 - 28, in San Diego, US. We’re sponsoring this year’s action-packed event that will gather together some of the world’s brightest minds and smartest programmers under one roof. So drop by our booth, pick up some swag, and say hey! We’ll be on hand every day to meet and greet, answer all your questions, and discuss everything Go, Gno, and beyond! We’ll also be hosting a workshop on Community Day, September 26, called ‘Chess: The Gnolang Way,’ where you can learn how to build a web3 chess server on Gno.land.\n\n## GopherCon 2023\n\n[GopherCon](https://www.gophercon.com/) is a community-driven annual event that started in 2014 and is dedicated to promoting the use of Go and the education of Go developers. Every year, thousands of gophers from around the world exchange ideas, share their work and expand the Go network. There are four days of fun-filled activities, including hands-on workshops, informative keynotes, networking events, and hackathons, all taking place in the laidback West Coast city of San Diego. Where better to expand your knowledge and make new friends than in one of the US’ most popular destinations?\n\nAs a gold sponsor at this year’s event, Gno.land will be running a booth and doing our best to convert as many gophers as possible to Gno, showing them how easy it is to port their existing web2 apps over to Gno.land or to build completely new ones from scratch.\n\n## Chess: The Gnolang Way\n\nIf you’re looking for a hands-on coding experience and to have a little fun with us at the same time, join us on Community Day for an awesome workshop, **‘Chess: The Gnolang Way.’** Kickstart your day by learning to build a web3 chess server on Gno.land using Gnolang. By the end of the session, you’ll have gathered basic knowledge on developing and deploying smart contracts on Gno.land, and connecting smart contracts to a web frontend. You’ll also see how web3 enables you to write perpetual and trustable social and gaming platforms and how to build a web3 chess server and website with Gno.land.\n\nIf you want to join us, meet us at 10:00 a.m. in the Grand Ballroom 10.\n\n## Let’s Play\n\nAfter the workshop, the fun begins with an ongoing chess tournament throughout the GC23 summit for event participants. To be in with a chance of scooping up some seriously cool prizes, GC23 attendees will need to show us their best moves and how much they engage with the Gno.land chain. This competition is designed to put our platform to the test over two main areas: chess mastery (50% of points) and platform engagement (50% of points). To be eligible for prizes, participants must be present at the event. We hope to see you there! If you can’t join us in person in San Diego, be sure to [follow us on X](https://twitter.com/_gnoland). We’ll be giving updates on our progress and sharing the highlights of the event. May the best gnome win!\n","2023-09-25T13:37:00Z","christina","gnoland,gnovm,gnochess,events"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["gnomobile","GnoMobile, a Framework for Building Gno Mobile Apps","\n\n*This blog post is written by Berty Technologies, an NGO that is building open and free communication solutions without any of the limitations imposed by centralized systems. Berty is a proud partner and grantee of Gno.land.*\n\nThe year is 2023. Current Gno apps run on desktop or laptop computers that have Go installed. To run on mobile, the app would need to bundle the Go runtime, which is complicated for most developers. At Berty, we have years of experience using Go on mobile and overcoming difficulties with Android and iOS operating systems. We built Wesh Network, a decentralized communication protocol that enables p2p users to reliably and securely send messages over async networks, even in environments with poor or no connectivity.\n\nThis stage is thus set to take the leap and make it easier for builders to develop Gno applications for mobile devices.\n\n# What is GnoMobile?\n\nSimply put, GnoMobile is a framework for developing Gno mobile applications. This is how it works:\n\n*WARNING: Deep technical sections ahead. Grab a coffee before venturing forth*.\n\nFor communication between the mobile app and the Gno code, GnoMobile uses [gRPC](https://grpc.io/), a well-supported framework that sends and receives Google Protobuf messages. Even though the core Gno code is written in Go, the app code can use React Native, Java, Swift, etc. The following system diagram shows how gRPC is used.\n\n\u003cdiv align=\"center\"\u003e\n ![](https://github-production-user-asset-6210df.s3.amazonaws.com/109347079/267934754-e4da6fec-a586-4ebe-97cc-3b3ad7f79370.jpg)\n\u003c/div\u003e\n\nMoving from the bottom to the top, this is how the flow looks:\n\n1. At the bottom are Go packages in the gno codebase. A **gnoclient.Client** supports communication with the remote Gno.land node with methods like Call to call a realm function. The Gno codebase also has **keys.Keybase** to support a wallet stored on the local device with methods like CreateAccount.\n2. These methods are called directly from the next level up by the **GnoMobile** Go code. A Go object can’t be passed through the gRPC interface, so the GnoMobile Go code maintains a persistent gnoclient.Client object, which is accessed by gRPC calls. The GnoMobile API functions are registered by an amino package.go file and the generated Protobuf files are used to configure the gRPC server.\n3. Finally, at the top of the diagram, the **gRPC client in the mobile app** communicates with the GnoMobile gRPC server over a local connection using Protobuf messages. A gRPC call can either return an immediate result (for example, GetKeyCount) or an asynchronous gRPC stream object, which can return delayed results (for example, a Call to a remote realm function). The gRPC framework uses the Protobuf API to generate convenient API functions in the mobile app’s [preferred language](https://grpc.io/docs/languages) (React Native, Java, Swift, etc.).\n\n# How GnoMobile benefits builders\n\nThe first version of the framework will include three main sets of features:\n\n1. **Blockchain Operations**: These refer to the core block of functions that the apps need to interact with the blockchain. Things like the gnoclient API to effectively bring the benefits of the Gno framework on mobile, the gas estimation interface and calling realm functions, querying a blockchain node (and more) are included here.\n2. **Wallet**: As the name suggests, here we have all the standard wallet operations like create or delete an account, set the recovery phrase, account balance, and so on.\n3. **Toolkit**: We want to make it as easy as possible for devs to start building apps with our framework, so we’ll provide them with install instructions, example apps, and more technical stuff like genproto options to support gRPC and helper functions to parse the render output.\n\nThose should be enough to allow builders to get started on using and experimenting with Gno mobile apps.\n\n- *Support for secure p2p communication, even when the Internet is down?*\n- *Yes, please!*\n\nSomething that is not necessarily essential for V1, but for sure will open the doors to some powerful capabilities later on is to add an interface and a constructor to adapt the communication transport. This will make it possible for devs to incorporate other tools like Wesh Network and give their apps the ability to securely and reliably send messages even in very poor network conditions. But that’s a story for another time.\n\n# When will GnoMobile be ready?\n\nV1 is planned for release in mid-December 2023.\n\nUntil then, you can check out our progress [here](https://github.com/gnolang/hackerspace/issues/28).\n\nGot feedback or want to drop us a question? Ask away on our [repo](https://github.com/gnolang/gnomobile/issues).\n\n# What does the future look like beyond V1?\n\nWe see a lot of potential directions for GnoMobile after the initial release that will improve the user experience, extend its functionality, and make GnoMobile even more secure. We’re still scratching the surface in terms of how far we can take its development, and we look forward to working on further iterations and improvements. Some of our ideas for the future beyond V1 include:\n\n1. Making it easier for developers to **build** **desktop apps** **and** **browser extensions**:\n2. Through GnoMobile, we can gradually enable “desktop” devs to use our React Native gRPC interface to write desktop applications while using existing functionality from the core Go code. This way, developers will not necessarily have to learn Go to leverage its advantages.\n3. Browser extensions are usually written in JavaScript in the same way as in React Native. This opens the door to getting the benefits of Go via the GnoMobile framework. Otherwise, you’d have to either make the Go code run inside the browser extension (which is not easy) or use a remote server (which is not pretty).\n4. Making it possible to **execute smart contracts directly from mobile**.\n\n*Why is this important?*\n\nIf you want to add a new message to a blockchain, you need to actually interact with it (the blockchain) and update its state with the new message. However, if you just want to browse through the messages, you can execute the Render function locally without needing to use your network and, at the same time, get the results much faster. This is because the node runs locally on the mobile device without needing to spend crypto coins to get a remote node to do the operation for you.\n\nGno nodes run on GnoVMs (gnovm), and for the moment, these are only available on desktops. We believe it is possible to make them available on mobile as well, but we need to find clever ways to overcome the constraints of mobile devices (like putting the apps in the background (iOS), addressing network bandwidth limitations, and so on).\n\n1. Developing a **decentralized push notification service** for *both* mobile and desktop apps. Getting notifications is now a standard (and very important) functionality of centralized apps. Technically, this happens via a central server. Naturally, having a centralized server is not possible for a p2p app, but there are other ways to implement notifications, and we are considering including them in the GnoMobile framework.\n2. Making it possible for decentralized apps to **interact with the blockchain even if the network connection is poor or virtually unavailable**. Through the [**Wesh Network** protocol](https://wesh.network/), we are opening up the possibility of using alternative transport mediums to exchange messages between peers in an asynchronous but reliable manner in off-grid environments. Enabling reliable, secure, and censorship-resistant communication is our main cause at Berty Technologies. We want to open the door for p2p users to send messages and interact even in extreme situations or adverse scenarios, and Wesh Network is built specifically for this purpose. It is only natural to make it easier for developers to use it through the GnoMobile framework.\n3. Advancing **edge networking for enhanced blockchain resilience**. Edge networking refers to bringing functionality like computing power or storage closer to the user so that they don't need to travel through the whole Internet to interact with a server. The same edge concept can be applied to bring the necessary services to interact with the blockchain closer to each p2p user. For example, hosting a copy of the blockchain so a user can sync it or even execute smart contracts. Having these fundamental services closer to the p2p users is especially important in the case of mobile apps. We want to offer developers the possibility of taking advantage of the edge networking benefits by allowing them to use, for instance, network address redirections or special HTTP headers in the configuration of their applications.\n\nIn all honesty, it’s hard not to get excited about all the different possibilities that lie ahead for GnoMobile, but we’re keeping our focus on shipping V1 for now and collecting feedback from the community. After that, well, we hope you’ll stick around to see what happens next!\n","2023-09-29T13:37:00Z","jeff,costin,remi,iuri","gnomobile,berty,weshnetwork"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-5","The More You Gno: Gno.land Monthly Updates - 5","\n\nIt's been another productive month, packed with developer calls, live events, new contributors, a large team presence at the Go community's biggest event of the year, GopherCon 2023, and the launch of a PoC gaming dApp on Gno.land, GnoChess. We uncovered a bunch of bugs in the code and some issues with the GnoVM, and made further progress on the Go and Rust VMs, the banker module bug, Gnofee, and much more. Check out the updates below.\n\n## Building a Web3 Chess Server on Gno.land - GnoChess\n\nMost of our work over the last few weeks has been dedicated to [GnoChess](https://gnochess.com/), a [PoC gaming dApp](https://test3.gno.land/r/gnoland/blog:p/chess-gc23) unveiled at GopherCon 2023. As gold event sponsors, we wanted to provide gopher attendees with a memorable experience – and a little friendly competition – while battle-testing the Gno.land platform. As our first gaming dApp, developing GnoChess was extremely useful for our team in many ways. We managed to attract 61 players to the game during the event, including some die-hard web2 gophers who wanted to show off their moves and discover more about Gno.\n\nSeveral PRs were opened as a result of our endeavors, and, beyond the conference, GnoChess taught us a lot about where we're at with Gno, how to successfully build complex dApps on top of the platform, and how well we work as a team. We uncovered some key issues and breaking behavior in the GnoVM, made our JavaScript clients much more reliable in their communications with the Gno.land node, and unearthed further issues that lead to complex errors and potential security flaws that must be addressed before mainnet.\n\nFor example, appending nil to a slice of errors resulted in a panic, or conditional statements like if not supporting custom boolean types. The GnoVM doesn't currently perform terminating statement analysis, which results in a cryptic panic message ([issue 1086](https://github.com/gnolang/gno/issues/1086)), and mixing untyped (negative) floats and integers in arithmetic sometimes drops the sign ([issue 1152](https://github.com/gnolang/gno/issues/1152)). The issues uncovered while developing GnoChess were discussed extensively in the public developer calls of [Sept 6](https://www.youtube.com/watch?v=BBBqgycMjqU) and [Sept 20](https://www.youtube.com/watch?v=WrxFVPR55G0), and referenced in the [GitHub meeting agenda](https://github.com/gnolang/meetings/issues/31). Most of the issues are common in software development and fairly simple to fix by making some implementation changes or adjustments to design choices.\n\nWhile developing GnoChess, our engineers took on the role of expert platform users rather than core team members. This approach was very useful as it pushed the platform to new limits, and allowed us to dive deep into many aspects of the project, creating a culture of sharing by opening up issues for each bug and asking for feedback and support. We'll definitely take a similar approach for future app development and onboarding new devs to Gno. We'll be releasing a retrospective of our experiences in the coming weeks. In the meantime, if you want to build a dApp on Gno.land, check out the GnoChess repo, where you can find a useful [tutorial](https://github.com/gnolang/gnochess/blob/main/tutorial/01_getting_started/README.md) or watch the recording of the GopherCon workshop, '[Chess: The Gnolang Way](https://www.youtube.com/watch?v=JQh7LhqW7ns).'\n\n## The Battle of the Virtual Machines\n\nCore engineers Marc and Petar continue their excellent work developing two different VMs for Gno, one in Go and one in Rust. In the coming weeks, we'll have a face-off, comparing and contrasting their features, efficiency, speed, and performance, so watch this space! For now, the definition of the virtual machine is stable for both, and they are no longer working on the virtual machine definition. They are mainly focusing on code generation; everything from parsing to scanning to parsing and compiling. Let's see how they are shaping up.\n\n### Rust VM\n\nPetar has developed a Rust implementation not only of the virtual machine but of the whole chain, including the compiler. He has written a Go compiler entirely in Rust and has even started experimenting with changing the compiler to implement the Invar proposal from Jae. Further progress includes porting a part of the parser and scanner from the Go compiler to Rust (almost a direct translation from Go to Rust) and making it stable. \n\nIn addition, Petar has completed work on typed nil values and improving the recursive closures of Go, which were not working with Gno code and needed additional pointers. He has also implemented Iota and hooked up the garbage collector. In the coming weeks, Petar will be working to smooth out bugs and implement type aliases, as well as implementing function analysis for the dependency graph. The dependency graph is necessary for compiling global types in the correct order, so, for example, when type A refers to type B, you need to compile type B first so that when type A refers to it, type B exists.\n\n### Go VM\n\nMarc is currently rewriting a parser and a scanner from scratch. His work is not as far along as Petar's, but he's getting closer, and the code generation works well. He is currently refactoring and building a single-pass compiler that can perform a **syntax-directed translation**, which means there are no intermediate data structures between the source code and the byte code. This is a much simpler design that should compile faster and be easier to maintain, but it requires a complete redesign. \n\nMarc believes his Go parser will be easier to maintain and understand than the one in Rust and benefit the user since the entire stack is written in Go. However, to assess the best implementation of the VMs, Marc has started a Go **test shoot project, which is a script** that will run many samples to verify that the compiler (in Go, Rust, or any other implementation) conforms to Go's specifications. Marc and Petar will open their repos soon, and the next edition of The More You Gno will highlight how the GnoVM works. \n\n## Gnoffee: Coffeescript for Go and Gno\n\nGnoffee (hackerspace [issue 22](https://github.com/gnolang/hackerspace/issues/22)) will be a powerful standalone tool to elevate the development process of Go and Gno by generating code and integrating new features, eliminating manual coding. We aim to create a custom variation of Golang that preserves similar readability, maintains compatibility, and enables being able to code in Gno very quickly when you know how to code in Go. How do we go about this? \n\nRegarding compatibility, one possibility is to propose all our changes to Golang and wait for approval before we start developing. However, this is likely to take some time. Another approach is to use a way to transpile TypeScript for JavaScript or Coffeescript for JavaScript, so it's another language passing through a program that creates standard valid Golang and will generate valid Gnolang. With this simple method, we can experiment with missing features like new native types, and new keywords, and when we have new features in mind, we can develop what we lack. \n\nFor instance, it does not make sense to have extra security for your exported variables when you write a library in Go. However, in Gno, it is very important to ensure that everything you expose cannot be modified by other contracts. This means finding a way to expose constants and other readable elements without risking their values being overwritten.\n\nBesides allowing us to carry out all types of experimentation more easily, Gnofee could eventually be a way for the Go team to measure the potential adoption of Gno. Gnofee is not a priority for the mainnet, but we're excited to work on this important initiative.\n\n## META Multinode Testnet\n\nThe discussions about single and multinode testnets have been ongoing, so we opened an issue to establish a multinode testnet focused on multi-validator experimentation, including stability, benchmarking, and lifecycle management. This multinode testnet aims to provide a platform for in-depth explorations and evaluations of multi-validator setups, while we maintain the single-node test3+.gno.land set up, primarily dedicated to showcasing the VM and providing examples. Visit hackerspace [issue 9](https://github.com/gnolang/hackerspace/issues/9) if you want to participate in this initiative or share your insights.\n\n## Banker Module Bug\n\nThe banker module bug is a known issue that needs to be fixed before the mainnet because, currently, it's still possible to mint new GNOT tokens from any contract. Several fixes have been suggested, and our goal is to merge [PR 875](https://github.com/gnolang/gno/pull/875) put forward by Onbloc to change the denomination of the coins minted by the banker. Merging this PR is currently blocked by 2 small failing checks, but we are close to resolving this issue.\n\n## Preserving Go Comments in Protobuf\n\nIn [issue 1157](https://github.com/gnolang/gno/issues/1157), Jeff from Berty raises the question about preserving Go comments in the Receiver field. Currently, Amino converts the code, but the proto message Receiver field doesn't have the comment. Manfred agrees that informative comments are helpful. However, he doesn't want to create a complex Protobuf configuration. We will continue to discuss this issue to look for solutions, but for now, Berty will parse the original Go source code and get the comments this way.\n\n## Multi-Sig and Security Features\n\nSeveral contributors, including Teritori, are working on built-in multi-sig support in Gno.land, where Gnokey supports a multi-sig setup. We also want to introduce additional ways to improve the UX and security of Gno.land (and web3 in general). An idea we currently have is to add a new layer in authentication, creating something similar to browser cookies that we can name sessions. The chain will have two tables, one with the public key for an account and one with a public key for sessions linked to an account. From your main account, you can create a session with self-destructing features, such as destructing after one hour without usage or after 24 hours. The goal would be to allow more complex and secure flows when starting your operations. We may not want this for multi-sig, but it comes under the same family of security and privacy features.\n\nFor example, imagine a wallet like Adena uses your key, a passphrase, or a ledger. It will sign a new public key that you just created in memory. Each time you close your browser, the memory is cleared. You can also have a logout button to call on the blockchain to delete all your sessions or simply wait for the session to be self-destructed, especially if the session was just in memory on your side. We will continue to develop this idea.\n\n## New Team Member\n\nWe're excited to welcome a new DevRel team member to Gno.land, Leon, who's been in blockchain development for two years and is passionate about engineering and teaching. Leon has taught languages, development, math, and music privately, as well as an OS fundamentals class at his previous faculty. Welcome on board!\n\n## Grantee and Ecosystem Updates\n\nAs Gno.land core continues to advance, so does our blossoming ecosystem, with new contributors and community members turning their eyes to Gno. The overriding theme of this last month has been collaboration, and we're pleased to see gnomes working together to overcome their obstacles and push their projects forward. Let's see what they've worked on over the last few weeks.\n\n### Onbloc\n\nOnbloc is powering ahead, contributing to Gno.land core, making upgrades and improvements to Adena and Gnoscan, and developing the Gnoswap DEX. Last month, Onbloc released the patched version 1.8.0 of Adena, which includes some UI and UX enhancements, such as more intuitive account management settings, a copy icon next to the names of the accounts, and some bug fixes. This release also comes with new injection methods to enable dApps to request users to add a custom gno.land network or switch to an existing one. Check out the [release note](https://github.com/onbloc/adena-wallet/releases/tag/v1.8.0) for more details.\n\nOnbloc has open-sourced the code for Gnoswap on this GitHub [repo here](https://github.com/gnoswap-labs/gnoswap). You can also find a guide to running unit tests. The team continues to improve the Gnoswap interface, focusing on the earn and staking pages, the graphs for positions, and some components for adding and removing liquidity and providing pool incentives. They're working on the next iteration of the interface, with the governance and airdrop pages, and developing the front-end logic to integrate with Gnoswap realms and APIs. Onbloc also contributed to Gno core, adding PRs for fixes to testing and the banker module. Keep up with Onbloc through their [hackerspace journey](https://github.com/gnolang/hackerspace/issues/29) and check out their latest initiative [Gnodesk](https://medium.com/onbloc/gnodesk-week-2-of-sept-2023-5edbc451bba7), which delivers weekly highlights and updates from Gno.land.\n\n### Teritori\n\nTeritori has been working on improvements since the last update and open-sourcing all their work, including the DAO deployer and the Moderation module. You can visit the Teritori DAO tooling repo to find the complete documentation and new realms to easily deploy your DAO. There is also a tutorial on creating your own DAO using the framework. \n\nThe team has made extensive progress on the Justice DAO deployer, a module that can be used for third-party arbitration when there is a problem with the escrow system in a decentralized freelance marketplace. The Justice DAO can resolve potential conflicts between the seller and the buyer and implements randomness to choose the judges to solve problems without conflicts of interest. The content flagging system, which highlights the content that users deem to be inappropriate, has been tweaked and improved. Keep up with Teritori's [hackerspace journey here](https://github.com/gnolang/hackerspace/issues/7).\n\n### Berty\n\nBerty has already completed the first phase of the project and published the [technical proposal](https://github.com/gnolang/gnomobile/issues/15) to develop the Gno mobile framework. The team is now busy with the second phase of implementing the proposal and the gRPC interface, which is working with the local socket on Android and iOS. Jeff has been trying to use Amino, and, now that Iuri is back from vacation, the team will work on improving other parts of the interface. Check out their latest [demo](https://www.loom.com/share/c0f68f707d3e47089c2fdbd2698fc92f), which shows an example user interface with wallet functions and blockchain communication. \n\nOnbloc has laid the foundations for Gno mobile apps with the Adena mobile wallet, so Berty will use some of this code in the mobile framework and work with Onbloc to ensure a similar user experience across all Gno apps.\n\n### Flippando\n\nDragos, the developer behind new grantee Flippando, is an experienced mobile app developer. Flippando is a simple on-chain memory game, which is currently written in Solidity and deployed on several testnets, including Goerli, Polygon, Near, Aurora, Evmos, and a Saga chainlet. Fippando started as a project for Dragos to learn Solidity but has already been the winner of two hackathons in Korea. It can be deployed relatively easily on any machine and is currently being ported to Gno.land. Dragos is exploring which user intersection can be more beneficial for this and will show us a demo in the coming weeks. Soon, we'll have two gaming dApps on Gno.land – Flippando and GnoChess! Read about Flippando in the [hackerspace journey](https://github.com/gnolang/hackerspace/issues/33).\n\n### New Contributor Joseph Kato \n\nWe have a new contributor to Gno.land who showed a demo last month of what he's been working on, a language server to run tests and scripts. Joseph is a major Go fan looking to get into web3 and was super excited to come across Gno. While interacting with Gno.land, he found many IDE-like features that he missed when working on files, so he decided to work with an LSP implementation—gnols—with the goal of making these features available to all contributors regardless of editor preference, starting with Sublime Text and Neovim and moving on to IntelliJ, Golang, and Emacs. This is a welcome addition for anyone who has ever developed a realm in Gno. Check out his [hackerspace](https://github.com/gnolang/hackerspace/issues/34) page for more details. \n\n## DappCon, Berlin\n\nManfred was back in Berlin in September at the Radial System presenting 'Gno.land: The Key To Perpetual Transparency,' where he discussed how Gno.land offers a familiar, seamless experience for code sharing and a sustainable and transparent path for blockchain development. \n\n## Web3 Family\n\nCore dev Miloš Živković gave a talk at Web3 Family in Barcelona last month, 'Gno.land and Gnolang: The Dynamic Duo of Blockchain Development.' He presented a brief history of smart contract development and the issues associated with existing platforms, such as limitations in design and security. He introduced Gno and showed how we make web3 accessible and blockchain development more intuitive and secure. Catch the [talk here](https://www.youtube.com/watch?v=0K-jr_Ad3bI).\n\n## GopherCon 2023\n\nGno.land was out in force at GopherCon 2023 with a well-stocked booth at the conference and an awesome workshop building a web3 chess server on Gno.land. Both Manfred and Jae were at the booth championing Gnolang to Gophers, and we received a lot of positive feedback, some new contributions, fresh PRs, and exposure for Gno.land in web2 circles. It was also a fabulous chance for the team to meet for valuable face-to-face time.\n\nThat's all for now! Be sure to check back again with us for the next edition of The More You Gno to keep up with all our progress.\nDo you want to contribute to Gno.land's monthly updates? If you're building on Gno.land and want to highlight your development, project, event, or idea, let us know, and we'll include your contribution.\n","2023-10-10T13:37:00Z","christina","gnoland,gnovm,tm2"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["funding-program-23q3","Gno.land Funding and Grants Program - Progress So Far","\n\n# Quarterly Report: Q3 2023\n\nWe launched the [Gno.land Funding and Grants](https://github.com/gnolang/ecosystem-fund-grants) program in July 2023 to encourage talented and passionate developers to interact with Gno.land, help build core infrastructure and tooling, and enhance the usability of the platform. After establishing a review process to streamline the program and identify core areas that need the most work, we ran with our first cohort of grantees in Q3, awarding four grants from a total of seven submissions (to two teams and two individuals). Full details of grant submissions, scope, and funding can be found on GitHub, but here’s a summary of the program’s progress so far and what’s coming up in Q4.\n\n## Q3 Funding Breakdown\n\nThe total grants distribution for Q3 was **$563,595** over the four grants: Teritori, Berty, Zack Scholl, and Flippando. This work has been split over two main large-scale infrastructure products (the Gno Moderation DAO, and GnoMobile), a gaming application, and our first resident tinkerer (Zack), who is experimenting with Gno and developing Proof of Concepts using it. Each grant recipient was provided with milestones for deliverables and has kept track of their progress through regular syncs, hackerspace journeys, blog posts, and developer calls. \n\n### Teritori (delivered September 2023)\n\nTeritori blockchain and multi-chain hub allows IBC and non-IBC communities to connect, create groups, exchange tokens and NFTs, and launch new projects. The Teritori team has solid experience building social dApps, marketplaces, NFTs, collectibles, and interfaces to encourage community interaction. For the Gno.land Grants and Funding program, Teritori was tasked with building a Moderation DAO to enable effective and fair content moderation in a decentralized and permissionless environment. \n\nThe Moderation Module is a smart contract ‘realm’ that enables a DAO to manage the daily moderation of forums or social threads through blockchain decision-making, supporting the vision of a censorship-resistant platform that fosters a safe space for open debate and discussion. Find detailed updates on Teritori’s [hackerspace issue 7](https://github.com/gnolang/hackerspace/issues/7), and watch out for upcoming blogs on Gno.land.\n\n### Berty Technologies (delivery Dec 2023)\n\nBerty private messaging app was allocated a grant to build a mobile version of Gno.land, implementing the WESH protocol (available by Bluetooth, local WIFI, or other means), and providing secure censorship-resistant communication between devices. Berty’s experience in off-grid communication is invaluable to Gno.land, and the team is an expert at running Go on mobile Android and iOS operating systems. For this grant, to be completed in Q4, Berty will deliver a minimal PoC of the existing apps of Gno.land running on mobile, and deliver an open-source mobile app with basic CI/CD, interacting with the Gno.land testnet. Find detailed reports and updates on Berty’s [hackerspace issue 28](https://github.com/gnolang/hackerspace/issues/28) or within their [Gnomobile blog post](https://test3.gno.land/r/gnoland/blog:p/gnomobile).\n\n### Flippando (delivery Nov 2023)\n\nFlippando is a multi-level on-chain memory game currently written in Solidity and deployed on several testnets, including Goerli, Polygon, Near, Aurora, Evmos, and a Saga chainlet. Like the classic card-based Memory game, Flippando players must match card pairs (digital tiles). When a player selects a tile, the game sends a request to the chain, which sends back the uncovered tile. If two tiles match, they remain uncovered. If they don’t match, they are flipped back until the game is won, and an NFT is generated for the winning player to prove the win. Through the development of a simple gaming app on Gno.land, we want to show how easy it is for gaming and metaverse concepts to be built. Through this grant, Flippando will port its memory game to Gno. Find detailed updates on Flippando’s [hackerspace issue 33](https://github.com/gnolang/hackerspace/issues/33).\n\n### Resident Tinkerers Program: Zack Scholl (6 months)\n\nZack Scholl is Gno.land’s first resident tinkerer with tons of experience in web2 development and a passion for the Go language. Through the grants program, Zack aims to translate his extensive knowledge to Gno and web3 by developing PoCs using Gno. So far, Zack has worked on a microblogging app for Gno.land and a prototype for using generative audio with smart contracts. He’s also creating documentation and tutorials to help other developers follow his lead. You’ll be hearing more from Zack over the coming weeks. Follow his [hackerspace issue 2](https://github.com/gnolang/hackerspace/issues/2) journey for more details.\n\nAfter a great start to the Funding and Grants Program in Q3, below is a breakdown of the percentage of funding allocated to each area of development so far:\n \n[![Funding](https://gnolang.github.io/blog/2023-10-17_funding-program-q3/src/thumbs/funding.png)](https://gnolang.github.io/blog/2023-10-17_funding-program-q3/src/funding.png)\n\n## Coming Up in Q4 and Q1 2024\n\nWe’re looking forward to more exciting developments in the coming quarters as we focus on the road to mainnet. Onbloc, one of Gno.land’s most active contributors, is currently being confirmed as a [Q4 grantee](https://github.com/gnolang/ecosystem-fund-grants/pull/4/files#diff-6dbd2e305897910e59072f9efa8c537d86f8aa281eb3742e0c150048a1df95eb) to work on core infrastructure necessary for mainnet, including tm2-js and gno-js support, GnoVM debugging, contract interactions, and leading the multi-node testnet initiative. Onbloc has already developed essential public infrastructure tools for Gno.land, including the non-custodial Adena wallet, the Gnoscan blockchain explorer, and Gnoswap decentralized exchange. The team has demonstrated immense passion and dedication in attending public developer calls and in-person events, and releasing extensive documentation, blog series, and [hackerspace issue 29](https://github.com/gnolang/hackerspace/issues/29) about their journey. \n\nOver the next two quarters, the Grants program will focus on building our tinkerer and student cohorts, and publishing more content, such as application libraries, documentation, and Gno packages. The goal is twofold: to support more users and ensure a diversified set of users on the Gno.land platform testing, debugging, troubleshooting, and running user feedback loops. We currently have two apps to reference on how to get started – GnoChess, built by the Gno core team, and Flippando, a grant recipient – we’re looking for a lot more to come. \n\nWe’re steadily building out the Gno.land platform, and our ecosystem of grantees and contributors. Let us know if you want to join us by submitting an application any time on the Funding and Grants [repository](https://github.com/gnolang/ecosystem-fund-grants). We’re opening up our second grant batch this month, and look forward to reviewing your submissions. \n","2023-10-17T13:37:00Z","christina,michelle","gnoland,funding,grants"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["gnoland-moderation-dao-module","Gno.land Moderation DAO Module","\r\n# Gno.land Moderation DAO Module\r\n*This blog post is written by the Teritori team, whose focus is to allow organizations to communicate and interact in a resilient and transparent way. Teritori is a partner and grantee of Gno.land.*\r\n\r\nWhen it comes to the complex subject of discussion forums and decentralized social networks, numerous technical and philosophical questions arise.\r\nImagining a 24/7 online communication system whose administration cannot be compromised or censored by any entity or individual is one of the most intriguing challenges of the decade.\r\nApproximately 10 months ago, the Teritori core team decided to explore the new possibilities offered by Gno.land on the theme of decentralized moderation and to build the foundation for future generations of developers to create resilient, robust, and autonomous applications.\r\n\r\n## The vision\r\n\r\n### About Teritori\r\n\r\nTeritori is a decentralized Operating System for individuals \u0026 communities that allows organizations to communicate and interact in a resilient and transparent way. Its core components include the creation of a decentralized User Profile for individuals \u0026 organizations as well as a dApp Store allowing users to pick their favorite services for daily usage and developers to list their product in order to grow their user base. Finally, Teritori backbone, its P2P messenger application that will enable users to create resilient token-gated groups in a click will even allow non-crypto-native users to get onboard as this feature doesn't even require a wallet connection to get started.\r\n\r\n### Teritori \u003c\u003e Gno.land\r\n\r\nConvinced of the benefits of offering a contribution-based consensus model and taking advantage of an interpreted version of Golang, the Teritori core team aims to become one of the most prolific contributors to Gno.land. Our plan is to focus on features that enable the coordination of organizations and individuals via governance, communications, and collaboration. Eventually, all the features listed on Teritori will be accessible in the Gno.land network, contributing to the growth of the ecosystem.\r\n\r\n### PoC and iterations\r\n\r\nAnother important point to emphasize is that the Teritori core team intends to improve the features it deploys on Gno.land by taking advantage of the user test phases to collect feedback that will enable iteration and improvement of the service. As a result, the “Proof-of-Concept” (“PoC”) presented in this article will be subject to updates and evolutions, which will be communicated in due course, as will the associated test phases.\r\n\r\n## What is the Gno Moderation Module?\r\n\r\nThe Gno Moderation Module is a smart contract (“realm”) that enables a decentralized, autonomous organization (DAO) to manage the moderation of a forum or social thread through a transparent on-chain vote.\r\n\r\n### Let’s take an example:\r\n\r\nImagine a simple social network similar to Instagram, in which all content is decentralized (using IPFS for images, videos, music etc.). For each post, users sign in via their wallet to post content, and no centralized administrator can delete this content. The freedom offered by this type of decentralized application is immense since even as developers of the application, it is impossible to delete the content. Therefore, we can consider this “space of freedom” as a “common space” unlike any application owned by a private company and hosted on centralized infrastructure.\r\nWith this radical freedom for the user comes a great responsibility— to collectively ensure the security of this space rather than delegating the responsibility to moderators employed by a commercial enterprise. This is why we’ve created the “Gno Moderation Module.”\r\n\r\n### How does it work?\r\n\r\n[![moderation_flow v0.1](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/thumbs/moderation_flow_v0.1.png)](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/moderation_flow_v0.1.png)\r\n\r\nThe Gno Moderation Module allows users to notify the moderation DAO community that they wish to report content. Through this action (permitted by the smart contract), they inform the DAO community that the content is inappropriate.\r\n\r\n[![content flag](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/thumbs/content_flag.png)](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/content_flag.png)\r\n\r\nOnce the content has been reported a certain number of times (10 times in this PoC) by users (who may or may not be members of the Moderation DAO), an on-chain proposal is automatically created.\r\n\r\n[![moderation dao feed](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/thumbs/moderation_dao_feed.png)](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/moderation_dao_feed.png)\r\n\r\nThis on-chain proposal is then listed in the Moderation DAO tab on the Social Feed as well as on the Moderation DAO profile proposals feed so all Moderation DAO members can vote on it. A debate can take place to discuss the best choice for the content.\r\n\r\n[![moderation dao vote](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/thumbs/moderation_dao_vote.png)](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/moderation_dao_vote.png)\r\n\r\nModeration DAO members have three voting options:\r\n- Ban the content in question\r\n- Abstain\r\n- Do not ban the content in question\r\n\r\nOnce the required vote quota has been reached, the contract automatically executes the voted decision.\r\n\r\n## The Current Status:\r\n\r\nThe Teritori core team received a grant from the Gno.land core team to build the necessary tools for decentralized moderation.\r\n\r\nTo accomplish this task, we divided our work into five main stages:\r\n1. Build “DAO” standards to establish the fundamental building blocks and ensure a modular approach in the long term for various tools.\r\n2. Build a “DAO” deployer that allows non-tech users to easily utilize the different standards.\r\n3. Build a customizable Moderation Module that can cater to a wide range of use cases. For example, if we replace the social feed with a service marketplace, the Moderation Module can transform into a “Justice Module” that resolves conflicts between sellers and buyers on a decentralized platform and serves as an escrow system.\r\n4. Develop the user experience that allows for large-scale experimentation with the Moderation Module within a dedicated context of an active social feed. Here, we created a social feed realm and enabled non-developer Gno.land users to participate in the full-scale experience.\r\n5. Establish interactions between smart contracts (r/boards, r/socialfeed, /r/users), conduct experiments to enhance their security, and identify emerging needs for these innovative use cases.\r\n\r\n### What does a DAO realm look like?\r\n\r\n- We decided to build two different DAO standards, using two different approaches of modularity:\r\n- Aragon DAO Standard, based on the amazing work of [the Aragon team](https://aragon.org/) (using Solidity)\r\n- [DAODAO](https://github.com/DA0-DA0) smart contract, using CosmWasm, that allows more modularity.\r\n\r\n\r\nHere is an example, with the DAODAO contract ported into Gnolang:\r\n[Source](https://testnet.gno.teritori.com/r/demo/dao_realm_v6/dao_realm.gno)\r\n\r\n```go\r\npackage dao_realm\r\n\r\nimport (\r\n\t\"encoding/base64\"\r\n\t\"std\"\r\n\t\"strings\"\r\n\t\"time\"\r\n\r\n\tdao_core \"gno.land/p/demo/daodao/core_v16\"\r\n\tdao_interfaces \"gno.land/p/demo/daodao/interfaces_v16\"\r\n\tproposal_single \"gno.land/p/demo/daodao/proposal_single_v16\"\r\n\tvoting_group \"gno.land/p/demo/daodao/voting_group_v17\"\r\n\t\"gno.land/p/demo/ujson_v5\"\r\n\t\"gno.land/r/demo/groups_v22\"\r\n\tmodboards \"gno.land/r/demo/modboards_v9\"\r\n)\r\n\r\nvar (\r\n\tdaoCore dao_interfaces.IDAOCore\r\n\tmainBoardName = \"dao_realm\"\r\n\tgroupName = mainBoardName + \"_voting_group\"\r\n\tgroupID groups.GroupID\r\n)\r\n\r\nfunc init() {\r\n\tmodboards.CreateBoard(mainBoardName)\r\n\r\n\tvotingModuleFactory := func(core dao_interfaces.IDAOCore) dao_interfaces.IVotingModule {\r\n\t\tgroupID = groups.CreateGroup(groupName)\r\n\t\tgroups.AddMember(groupID, \"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c\", 1, \"\")\r\n\t\tgroups.AddMember(groupID, \"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv\", 1, \"\")\r\n\t\tgroups.AddMember(groupID, \"g14u5eaheavy0ux4dmpykg2gvxpvqvexm9cyg58a\", 1, \"\")\r\n\t\tgroups.AddMember(groupID, \"g1ckn395mpttp0vupgtratyufdaakgh8jgkmr3ym\", 1, \"\")\r\n\t\tgroups.AddMember(groupID, std.GetOrigCaller().String(), 1, \"\")\r\n\t\treturn voting_group.NewVotingGroup(groupID)\r\n\t}\r\n\r\n\tproposalModulesFactories := []dao_interfaces.ProposalModuleFactory{\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.IProposalModule {\r\n\t\t\ttt := proposal_single.Percent(100) // 1%\r\n\t\t\ttq := proposal_single.Percent(100) // 1%\r\n\t\t\treturn proposal_single.NewDAOProposalSingle(core, \u0026proposal_single.DAOProposalSingleOpts{\r\n\t\t\t\tMaxVotingPeriod: time.Hour * 24 * 42,\r\n\t\t\t\tThreshold: proposal_single.Threshold{ThresholdQuorum: \u0026proposal_single.ThresholdQuorum{\r\n\t\t\t\t\tThreshold: proposal_single.PercentageThreshold{Percent: \u0026tt},\r\n\t\t\t\t\tQuorum: proposal_single.PercentageThreshold{Percent: \u0026tq},\r\n\t\t\t\t}},\r\n\t\t\t})\r\n\t\t},\r\n\t}\r\n\r\n\tmessageHandlersFactories := []dao_interfaces.MessageHandlerFactory{\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\treturn groups.NewAddMemberHandler()\r\n\t\t},\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\treturn groups.NewDeleteMemberHandler()\r\n\t\t},\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\t// TODO: add a router to support multiple proposal modules\r\n\t\t\tpropMod := core.ProposalModules()[0]\r\n\t\t\treturn proposal_single.NewUpdateSettingsHandler(propMod.Module.(*proposal_single.DAOProposalSingle))\r\n\t\t},\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\treturn modboards.NewCreateBoardHandler()\r\n\t\t},\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\treturn modboards.NewDeletePostHandler()\r\n\t\t},\r\n\t}\r\n\r\n\tdaoCore = dao_core.NewDAOCore(votingModuleFactory, proposalModulesFactories, messageHandlersFactories)\r\n}\r\n\r\nfunc Render(path string) string {\r\n\treturn \"[[board](/r/demo/modboards:\" + mainBoardName + \")]\\n\\n\" + daoCore.Render(path)\r\n}\r\n\r\nfunc VoteJSON(moduleIndex int, proposalID int, voteJSON string) {\r\n\tmodule := dao_core.GetProposalModule(daoCore, moduleIndex)\r\n\tif !module.Enabled {\r\n\t\tpanic(\"proposal module is not enabled\")\r\n\t}\r\n\tmodule.Module.VoteJSON(proposalID, voteJSON)\r\n}\r\n\r\nfunc Execute(moduleIndex int, proposalID int) {\r\n\tmodule := dao_core.GetProposalModule(daoCore, moduleIndex)\r\n\tif !module.Enabled {\r\n\t\tpanic(\"proposal module is not enabled\")\r\n\t}\r\n\tmodule.Module.Execute(proposalID)\r\n}\r\n\r\nfunc ProposeJSON(moduleIndex int, proposalJSON string) {\r\n\tmodule := dao_core.GetProposalModule(daoCore, moduleIndex)\r\n\tif !module.Enabled {\r\n\t\tpanic(\"proposal module is not enabled\")\r\n\t}\r\n\tmodule.Module.ProposeJSON(proposalJSON)\r\n}\r\n\r\nfunc getProposalsJSON(moduleIndex int, limit int, startAfter string, reverse bool) string {\r\n\tmodule := dao_core.GetProposalModule(daoCore, moduleIndex)\r\n\treturn module.Module.ProposalsJSON(limit, startAfter, reverse)\r\n}\r\n```\r\n\r\n### Public Grant Report:\r\n\r\nYou can find the full report of [Teritori Core’s journey here](https://github.com/gnolang/hackerspace/issues/7). \r\n\r\n### Resources:\r\n\r\nDocumentation:\r\n- [Gno Moderation DAO](https://github.com/TERITORI/gno/blob/teritori-unified/examples/gno.land/r/demo/teritori/MODERATION_DAO.md)\r\n\r\nPackages:\r\n- [https://testnet.gno.teritori.com/r/demo/groups_v22](https://testnet.gno.teritori.com/r/demo/groups_v22)\r\n- [https://testnet.gno.teritori.com/p/demo/daodao/interfaces_v16](https://testnet.gno.teritori.com/p/demo/daodao/interfaces_v16)\r\n\r\nTutorial:\r\n- [Gno.land Social Feed Moderation on Teritori](https://teritori.gitbook.io/teritori-whitepaper/gno.land/introducing-gno.land-social-feed-v0.1#social-feed-moderation)\r\n","2023-10-19T01:50:00Z","ferrymangmi,zxxma,michelleellen","gnoland,dao,moderation,teritori"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["wyg-dongwon-shin","Who You Gno – On the Record with Dongwon Shin","\n*Who You Gno is intended to shine a light on the builders, contributors, and generally brilliant humans behind the tech. We’re excited to kick off this series with Dongwon Shin, the co-founder and CEO of one of Gno.land’s longest-contributing teams, Onbloc, a South Korean-based blockchain software company that builds key infrastructure and tooling for Gno.land*\n\nSince embarking on their Gno journey in late 2021, Dongwon and his team have been among the most active gnomes embodying the values of the Gno project: hardworking, passionate, honest, and humble, to name a few. You may already be familiar with Onbloc’s projects [Adena](https://adena.app/), [Gnoscan](https://gnoscan.io/), and [Gnoswap](https://github.com/gnoswap-labs) more about this can be found in [Onbloc's Hackerspace journey](https://github.com/gnolang/hackerspace/issues/29). In this interview, we’ll get the latest updates on these projects, hear about Dongwon the person, and learn more about what motivates him to be a gnome. Check it out.\n\n## Dongwon’s life before coding\nIt’s a cold November morning in Seoul, and Dongwon is in the office early after sleeping just a few hours. Speaking to him from Dubai, where “cool” is 30 ℃, it’s -1 ℃ in Korea. “I hope you’re keeping warm,” I smile, “Yeah,\" he laughs, “it’s not too bad.” Dongwon’s been in the industry since 2015 when web3 was still called “crypto,” ICOs were selling snake oil, and his compatriots were busy paying above the market price for bitcoin in a phenomenon called the “Kimchi premium.”\n\nAt the time, he was traveling the world as a professional e-sports gamer which saw him leaving Korea and living in San Francisco and L.A. for several years. “I had lots of tournaments to compete in, so I had to travel to many other countries,” he says, “while traveling, I learned about other cultures and people, and new experiences. It was really eye-opening, you know, it really helped make me who I am today.”\n\nAnd who is Dongwon today? \n\nAmbitious, driven, and one of the kindest, most genuine people you could ever meet. “I like challenges, and I’m very competitive,” he says. “I can't just do regular jobs. I get bored quickly, so I need to find something very competitive and hard that makes me stressed.” I point out that he’s in the right place, and he laughs. He explains that he used to spend an entire week, sometimes two, learning a game before a tournament, almost around the clock. “I had to put everything I have into winning that game, right?” He views working in web3 the same way.\n\n## The intersection between e-gaming and blockchain\nDongwong is clearly comfortable on the cutting edge in emerging industries that “are often looked down on,” like e-gaming and crypto. He takes great satisfaction in how they’ve both grown. “My parents were saying, 'Just go study,' while I was playing games, but e-sports has grown a lot. Right now, the industry is really big, and it's kind of the same with crypto.” He adds, “I like getting in early when other people are not interested and finding an opportunity there.”\n\nWhen looking to retire as a professional gamer, he found his home right away in web3, working with a blockchain consultant and the sports and entertainment-focused [Chiliz project](https://www.chiliz.com/), before launching his own blockchain consulting and development firm. “I didn't think I was going to be just a regular employee for a big company. So I wanted to start my own business,” he says.\n\n## Getting to Gno… Gno.land\nHow did Dongwon hear about Gno.land? \n\n“My co-founder, Peter, and I were long-time followers of the Cosmos ecosystem, and we found out that Jae was working on a new project called Gno.land in late 2021. We really liked the vision behind Gno.land, why he started, and what he wants to achieve. We value transparency, fairness, and censorship resistance, so we read all the documentation and his initial codebase and decided we should be part of his new initiative. We started Onbloc in early 2022.”\n\nDongwon didn’t know Jae personally, but he felt strongly aligned with his vision and what Gno.land aims to achieve. Also, his reputation as the founder of Tendermint and Cosmos preceded him. Dongwon’s co-founder, Peter, was also working on a project called Lunagram, a Cosmos wallet integrated with Telegram. Peter had fond memories of Jae, being very supportive of experimental projects, including his own, in the early days of Cosmos.\n\n## Building tools… Adena, Gnoscan, Gnoswap\nOnbloc has since become Gno.land’s most prolific contributor, launching the [Gnoscan](https://gnoscan.io/) block explorer and the [Adena](https://adena.app/) wallet, as well as creating tutorials and blogs to help onboard developers to Gno, and creating Gno.land’s first AMM DEX Gnoswap, the beta version of which is estimated for December this year. “Currently, the team is focused on developing Gnoswap, integrating [the realms and APIs](https://github.com/gnoswap-labs/gnoswap) with [the interface](https://github.com/gnoswap-labs/gnoswap-interface), enhancing the swap function and liquidity pools, and some additional features. We expect to launch the beta in about a month, so we’re quite excited!”\n\nAs for Adena, the defacto Gno.land wallet, “It's already production-ready, but we want to improve our UX, and UI to provide more secure ways of using a web3 wallet.” To achieve this, Onbloc is adding a feature called [Air-Gap](https://en.wikipedia.org/wiki/Air_gap_(networking)) which allows the wallet to be used in an offline environment, without the user needing to import their keys to Adena. “They can just use Adena as a broadcaster,” Dongwon explains. “I think this kind of feature is needed for enhancing security and educating people to use noncustodial products in a secure way.”\n\nOnbloc is also a [Q4 2023 grantee](https://test3.gno.land/r/gnoland/blog:p/funding-program-23q3) and will develop core Gno.land infrastructure in preparation for mainnet. “We are working on three key features,” Dongwon explains. “The first is contract interaction. So it's a way for a realm to interact with other realms. The second is porting essential Go packages to Gno, and the third is a multi-node testnet.” All in addition to Onbloc’s continued efforts on Gnoswap, Gnoscan, and Adena. “You’re keeping busy, then?” I ask. “All our hands are full now,” he laughs.\nI ask what he does in his free time and – in fact – whether he has any. “Not much,” he jokes, “but I like spending time with my son and playing board games together. He’s seven years old, and we are like friends.” Dongwon also likes to unwind by reading books when his son is asleep. One of his favorites is [*The Secret*](https://en.wikipedia.org/wiki/The_Secret_(Byrne_book)); he was “really inspired by the concept” when he was younger. I ask if he sees it working in his daily life and whether he believes he manifests what he wants into existence, “Definitely,” he replies without hesitation.\n\n## Dongwon’s conviction in Gno.land\nNot only is Dongwon working night and day, but he has bootstrapped his team from his own pocket to go all in on Gno.land. What makes his conviction so strong? “I truly believe that the Gno.land blockchain is the next generation of the blockchain industry. Gno.land is trying to invite web2 developers into web3 and providing all these developer-friendly tools so they don't need to learn a new language to get into the ecosystem. GnoVM, Tendermint2, everything is so transparent and simple.”\nHe believes Gno.land will be “one of the greatest experiments in the crypto industry” thanks to its fair rewards and contribution-based governance. “I'm really excited about this initiative, and all our team members are well-aligned to support this vision. We want to do our part to achieve the success of Gno.land.”\n\nI thank him for his time and ask if there’s anything he would like to add. He pauses for a moment and then says, “If you're building a dApp or looking for a new opportunity in a new ecosystem, I think this is your chance. I hope to see great developers and teams getting into Gno.land. Let’s make this ecosystem great together.”\n","2023-11-24T00:00:00Z","christina","whoyougno,onbloc,community,interview"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-6","The More You Gno: Gno.land Monthly Updates - 6","\n\nWelcome to the latest edition of The More You Gno, your regular source of updates from the Gno.land core team and contributor ecosystem. There’s a lot to cover this month, from a company engineering retreat to new core members and contributors. We’ve made progress across the board to fix important bugs and issues and provide additional features. There’s a new way to dynamically call realms, Gno.land’s tokenomics and governance are advancing, our standard library list is expanding, and our grantees are killing it with their deliverables. Without further ado, let’s dive in.\n\n## Gno Core Team Updates - TL;DR\n\nOnly got time to skim the updates? You’ll find the highlights in the list below. If you want to dive deeper into the topics, track our progress, understand the rationale behind our decisions, or explore the issues we came across, grab a coffee, kick back, and savor the full details.\n\n* **The Portal Loop** – Much of our focus over the past few months has been on the Portal Loop [(issue 1108)](https://github.com/gnolang/gno/issues/1108), which will make developing on Gno smoother, faster, and more intuitive. The Portal Loop will speed up deploying dApps and improve the UX for Gno.land devs.\n\n* **Dynamic Realm Caller** – We’ve added a new way to call realms dynamically so that dApps no longer have to manually import GRC20/721 tokens [(PR 1262)](https://github.com/gnolang/gno/pull/1262).\n\n* **DAO Structure \u0026 Tokenomics** – We’re close to finalizing the DAO structure of Gno.land and its tokenomics. There will be three main DAOs, GovDAO, EvaluationDAO, and SupportDAO. We’re exploring staking options for GNOT holders and working on transaction fees and gas.\n\n* **Gno Playground** – Gno Playground is an awesome way for developers to collaborate, share, and test their code. The full version isn’t ready yet, but we’re sharing the beta with anyone who wants to help us iterate and improve this week.\n\n* **Gno Standard Libraries** – In [issue 1267](https://github.com/gnolang/gno/issues/1267), you can find our current wishlist for Gno standard libraries. If you want to see what we have and what’s lacking, or you want to contribute, open an issue or a PR.\n\n* **Gno Language Server (Gnols)** – An implementation of the [Language Server Protocol (LSP)](https://microsoft.github.io/language-server-protocol/) for Gno, Gnols makes writing code simpler and works with several editors. Visit the [CONTRIBUTING.md file](https://github.com/gnolang/gno/blob/master/CONTRIBUTING.md#vim-support-with-lsp) to try it out.\n\n* **RustVM Implementation** – The RustVM implementation is almost ready and is in the debugging stages. We’re also looking at adding a Jit compiler and researching the topics of determinism and concurrency.\n\n* **Bytecode Go VM Implementation** – The Parscan project is progressing well toward completion of the spec. We look to provide support for interfaces in the interpreter by extending the standard reflect package, also to the benefit of the entire Go community.\n\n### Engineering Retreat\nGno core engineering team got together last month in our first company-wide retreat. It was an invaluable opportunity to work face-to-face, brainstorm ideas, code together, and fix several high-level concerns. We made many improvements to the technical aspects of the project, including major advances on the Portal Loop, and strengthened our alignment through team bonding activities, socializing, and having fun. \n\nWe made multiple bug fixes and resolved many of the issues that arose out of [GnoChess](https://github.com/gnolang/gnochess) development, and Manfred and the Onbloc team (who joined us on the retreat) demonstrated a new way to dynamically call contracts using dependency injection with a registry. This, combined with Golang's interface capabilities, can achieve a good balance between dynamism, explicitness, and security (including type safety). This pattern could enable massive DeFi applications when used with GRC interfaces. It could also support contract-based DAOs where features can be added later, opening the door to new design patterns around contract upgrades. Check out [PR 1262](https://github.com/gnolang/gno/pull/1262) for more details. \n\nIt was invaluable for everyone to get plenty of 1:1 time with Jae. Morgan was able to bring the Native Bindings topic ([PR 859](https://github.com/gnolang/gno/pull/859)) much closer to completion. This has been a recurring theme in our developer calls for the last few months as it’s a complex topic that aims to change how Gno can use Go code while still being understood by static analysis tools like gno doc. Michael got greater clarity over the DAO structure and GNOT tokenomics, Milos was able to merge [PR 546](https://github.com/gnolang/gno/pull/546), after many months of effort, which adds file-based transaction indexing, and Thomas created instructions for getting started with the Gno Language Server (gnols), to give just some examples. It was productive and enjoyable and unblocked many issues. \n\nAiB engineers were also at the retreat, Zooma from Teritori, and Dongwon, ByeongJun, and Ray from Onbloc, creating plenty of opportunities for interesting discussions and showcasing our work. We also welcomed new core members Dylan and Danny to the team. Dylan is a senior software engineer, and Danny is supporting DevEx. We enjoyed meeting and hacking together with like-minded people and would like to do it more often with a broader audience. How about a Gnome contributor festival next year? Stay tuned.\n\n### Gno.land DAOs and Tokenomics\nThroughout the retreat and ongoing, we’ve made major advances to the DAO structure for Gno.land and the tokenomics of the chain. We’re still hammering out the final details, but we’ve decided on three main DAOs – GovDAO, EvaluationDAO, and SupportDAO – that will work together alongside other domain-specific DAOs, such as EngineeringDAO or ProjectsDAO, making Gno.land more decentralized over time. \n\nThe multi-tiered GovDAO will be responsible for voting on all decisions that affect the chain, such as parameter changes or validator acceptance/denial. GovDAO members will assess new contributors to the chain and allocate them a score and corresponding membership tier. EvaluationDAO will assist with specific contributions, lending its expertise and critic reviews as needed. SupportDAO will provide knowledge-specific services such as HR, marketing, and finance.\n\nRegarding transaction fees, we're exploring something similar to how Ethereum deals with gas in its EIP 1559 update. Essentially, a combination of comparing a new block’s size with the last block to gauge demand and some small parameters we’re looking at. We’re also experimenting with staking alternatives where contributors can stake their tokens to support certain projects in return for staking rewards. It’s still early days, so watch this space. We’ll be releasing more details soon. \n\n### Gno Playground\nGno Playground is a simple web interface that lets you share your code, run unit tests, deploy your realm and package, and execute functions in your code using the repo for a smoother and more collaborative developer experience. We’re excited to release Gno Playground out in the wild later this month in a soft launch set for November 28. If you’re interested in testing it out, head over to our Discord channel. We’re looking for feedback and help to identify bugs and improve the UX before its full launch in the new year. It will be interesting to see how people interact with the Playground and how they use it so we can iterate and attract more gnomes to our growing community.\n\n### The Portal Loop\nThe Portal Loop is an effort to create a continuously-deployed staging testnet to be hosted on the official [gno.land website](https://gno.land). The testnet will be reset at each commit on our repository, but it will re-play all the transactions from its previous version, dropping any that might fail following breaking changes in the code. The Portal Loop will provide a central place where you can experiment with the latest Gno.land updates, resolving the problem our existing testnets have faced (becoming stale only a few months after their launch) while also paving the way for building DAOs and on-chain Game of Realms and Proof-of-Contribution systems. \n\nWithin the Portal Loop efforts, we’re also building systems to more efficiently iterate locally on your Gno realms, similar to the previously described testnet. The Portal Loop will help to create an iterative cycle focused on development, testing, and feedback, enhancing local development and the Gno.land website. As developers are discovering, when building dApps like GnoChess, GnoMobile, or Flippando, they run into issues with the repo, GnoVM, and client libraries when developing locally.\n\nThe Portal Loop will enable much quicker feedback so we can iterate, uncover, and fix problems faster. Devs will get a greatly improved UI, with UX contributions and issues much easier to resolve, and the same CI/CD experience as web2 applications, where each time something is published on Git, they get instant feedback on how it works in staging, not only in terms of code but also in terms of data. Stay tuned, the Portal Loop is coming soon!\n\n### Standard Library Wish List\nThe standard library wish list in [issue 1267](https://github.com/gnolang/gno/issues/1267) is intended to be a starting place for anyone who wants to add new standard libraries to Gno. It's an opinionated collection of libraries that we would like to see added. So, if you see something missing that you’d like added to our standard libraries, leave a comment explaining your reasoning. If you want to port over a standard library from the list, make an issue for it and assign yourself, or if you can do it quickly, make a PR referencing the issue. You can see the global status of our standard libraries (as compared to Go) on our [Go\u003c\u003eGno compatibility document](https://github.com/gnolang/gno/blob/d421b963aed7f7c3ba3718edfc6fbd787fa8f0dd/docs/reference/go-gno-compatibility.md).\n\n### Dreaming with SOGNO\nThe Sogno project is a [dream](https://www.wordreference.com/iten/Sogno) Morgan has about improvements he plans to make on GnoVM. From his experience working on GnoChess, he found that many features were lacking that would have improved the workflow, for example, an improved debugging system, enhanced representation of the values within the VM, having maps as sortable data structures, and adding reflection. Morgan plans to work on this project on the side as a fork when he has time, so Sogno won’t be merged into the master branch for now. If you want to check it out and see if you can contribute, visit the [hackerspace PR 44](https://github.com/gnolang/hackerspace/pull/44).\n\n### The Future of the Gno Language Server (Gnols)\nThe [Gno Language Server (gnols)](https://github.com/gno-playground/gnols) is an implementation of the [Language Server Protocol (LSP)](https://microsoft.github.io/language-server-protocol/) for the Gno programming language. It is similar to the equivalent “gopls” project for Go, as they can be plugged into your code editor through extensions and allow you to access handy features, such as autocompletion, formatting, and compile-time warnings/errors. Gnols makes writing code simpler, working with several editors to suit your preferences. To try it out, visit the [CONTRIBUTING.md file](https://github.com/gnolang/gno/blob/master/CONTRIBUTING.md#vim-support-with-lsp), which contains instructions to get you started. Our current documentation targets Vim, Neovim, and SublimeText, but can likely be used with any editor that supports LSP. Feel free to contribute to improving Gnols and adding more features. It’s well-written, and simple to dive into the code and add more capabilities.\n\n### RustVM Implementation\nPetar continues progressing on the RustVM implementation and has almost finished, apart from a few bug fixes. As the design is now complete, he will enter the testing stages. He is also looking at how to add a Jit compiler to the current design. Petar was initially concerned that the garbage collector might have presented serious issues, but this has turned out not to present a problem. Adding a Jit compiler will require a lot of work (at least six months) to support everything in the language, but it should be possible.\n\nPetar is also looking at implementing concurrency the way it is in Go to have a fully functional virtual machine as it is in the spec. This would likely attract more external contributors to developing the VM. One advantage of Rust is that, with the concurrency model, there is already an extensive library called [Tokio](https://tokio.rs/) which he can use. Petar stresses that this isn’t easy, but he believes it’s achievable, at least as a research topic around determinism and concurrency.\n\n### Go Bytecode VM Implementation\nMarc continues to develop Parscan, another bytecode VM, but entirely based on the Go runtime, with the advantage of reusing the type-checking system, concurrency model, and memory management already part of the existing Go runtime. In the last month, the support for all missing declaration statements (constants, variables, and types) was added in the code generator.\n\n## Grantee and Ecosystem Updates\nOur ecosystem partners and grantees are working flat out on their contributions. We’re close to seeing the on-chain memory game Flippando launch, Adena and Gnoswap are incorporating some major new features, Zack’s released another informative tutorial as part of the Go to Gno series, and we’ve received several new grant proposals as well. We’ve even welcomed a new contributing team, Varmeta, to the fold. Scroll through the details below.\nTL;DR?\n* On-chain memory game Flippando is coming soon\n* Gnomobile is almost complete and will be receiving a rebrand soon\n* Gnosocial will allow devs to experiment with social media dApps\n* Experiment with content moderation using the ModerationDAO or create your own DAO\n* Gnoswap AMM DEX beta will launch in December\n* Adena to implement new ‘Air-Gap’ feature\n* Varmeta is working on Gno.land Unity SDK to make Gno more accessible to game developers\n\n### Dragos\nDragos has been working on porting his on-chain memory game Flippando from Solidity to Gno, and we’re looking forward to playing it soon after seeing an awesome demo earlier this month. When you play Flippando, you uncover a matrix of matching visual symbols. There are 2 levels of difficulty (matrix made of 16 tiles or 64 tiles). For the launch, Dragos aims to have visual symbols containing basic colors, dice, hexagrams, or various gradients. Once you’ve matched all the pairs and completed a matrix, you mint an NFT that can be assembled as artwork on-chain and traded in a marketplace. Dragos is currently looking at the initial tokenomics for Flippando, with a fixed supply of 1 billion and no airdrop distribution (more details soon). \n\nDragos has been a mobile app developer for over 10 years, with an interest in blockchain for around seven years. He enjoys working with Gno, although having to reset the chain and redeploy programs each time he makes a change was a challenge. The Portal Loop solves these issues in local development and will allow him to deploy Flippando sooner. As part of the work for Flippando, Dragos also added [PR 1309](https://github.com/gnolang/gno/pull/1309) to improve our GRC721 implementation]. He is also applying for a grant to port his project management system on-chain for Gno, and he gave us a [demo](https://drive.google.com/file/d/1eJGyATHhEzletWwQ4Xt_9ON7L231Yvow/view). An on-chain project management tool will be essential for organizing the DAO system, focusing on our team’s needs, organizing tasks, setting goals, and more. Keep up with Dragos’ progress by visiting his [hackerspace](https://github.com/gnolang/hackerspace/issues/33).\n\n### Berty\nBerty has been powering ahead with Gnomobile (which will soon receive a new name to better reflect its functionality), Gnosocial, and Gno core. Some highlights include significant progress on the GRPC interface (see [demo video]https://www.loom.com/share/d1cef60199c0487e86deab2a9e61d61c). As the interface to Protobuf has many more data types available than the interface to the language bridge, GRPC greatly simplifies the app and improves the UX. The API is almost complete and now includes wallet functions, such as creating an account and restoring an account from the recovery phase, and an event stream when calling a realm function [(demo video available here)](https://www.loom.com/share/42f2dcb0b4a34f77a95a0f8012e4b52b).To help developers, Gnomobile also includes example apps. Here is a [demo video](https://www.loom.com/share/41a20a764f0f4caf91f068b62e1f16c4) of the latest minimal hello app.\n\nBerty created [PR 1235](https://github.com/gnolang/gno/pull/1235) relating to Amino. They start with a Go struct and add comments explaining all the fields. Previously, when they ran Amino and generated a Protobuf structure, all their comments disappeared. This PR allows them to preserve the comments. They also created [PR 1213](https://github.com/gnolang/gno/pull/1213) since Amino should create a Protobuf structure where the fields follow official naming conventions. Thanks to help from the Gno devs, these PRs are merged.\nBerty is also focused on building a decentralized social media application using the Gnomobile framework, which is almost complete. The aim is to create a testbed where dApp builders can see how their implementations integrate and function with web2-like social media features, opening the door to interesting experiments such as DAO collaboration and content modification. Berty is building a decentralized Twitter-like application and plans to finish it in six months. Check their progress on their [hackerspace here](https://github.com/gnolang/hackerspace/issues/28) and look for more upcoming demos.\n\n### Teritori\nTeritori has been focusing on Escrows in the past couple of months, aiming to make improvements that facilitate on-chain project management. The team is also iterating the Moderation DAO and has identified a need for a conflict solver module to call an external authority to solve a conflict between two parties (for example, the buyer and the seller). They have called this module the Conflict Solver Module and integrated several options like Justice DAO (composed of humans) or any realms (e.g. GnoChess) to solve the conflict. They are researching work on VRF to implement randomness so that the module selects a person (or group of people) with no conflicts of interest in the issue. [PR 11](https://github.com/TERITORI/gno/pull/11/files) provides more details. A true randomness function will also be handy for the Flippando game that doesn’t currently rely on true randomness. \n\nIn other news from Teritori, the moderation DAO is live! You can head to the [Teritori site](https://app.teritori.com/feed?network=gno-teritori) to play around with it and even try deploying your own DAO, creating a user profile, and adding a social feed. The team has deployed V1 of a “Soundcloud-like” app on the [Gnosocial feed](https://app.teritori.com/feed?network=gno-teritori) in which you can listen to music while browsing features, publish your own music as an artist that appears on your profile, comment on tracks, tip artists, and more. Keep updated with Teritori on their [hackerspace here](https://github.com/gnolang/hackerspace/issues/7).\n\n### Zack Scholl\nOur resident tinkerer Zack gave a workshop last month as part of his “Go to Gno” series called [Go to Gno: ByteBeat - Generating Audio with Smart Contracts](https://www.youtube.com/watch?v=lmmUIEHhdqA). This is a really interesting tutorial on how to build Bytebeat (a minimal programming language for synthesized music) with smart contracts and follows on from his microblogging workshop. Be sure to check it out. If you want to hear more about Zack, you can also watch [Getting to Gno with Zack Scholl](https://www.youtube.com/watch?v=LgXa7QCdxdA\u0026t=1258s), a Fireside Chat series that talks about contributors’ work, lives, and motivations to be on the Gno.land journey with us.\n\n### Onbloc\nAs always, the Onbloc team has been busy! Over the past few weeks, they have been working on extending the functionality of Gnoswap, integrating APIs and realms with the interface, improving the governance page UI, and integrating the Adena wallet. Onbloc expects to launch the beta of Gnoswap next month, and we’re super excited to see it in action. To improve the UX and UI of Adena and make the wallet even more secure, the team is implementing a feature called Air-Gap which allows the wallet to broadcast transactions signed from an offline environment without the user needing to import their keys to Adena. Onbloc has also started a discussion around ideas to improve the usability of QR Codes for secure data transmissions between offline signers and watch-only wallets in [Issue 1375](https://github.com/gnolang/gno/issues/1375). We’ll keep you updated on the work here. You can also find more information on Onbloc’s [informative blog](https://medium.com/onbloc). \n\nAs well as developing core tooling for Gno, Onbloc is working on Gno core to help us build important functionality. The team welcomed a new hire, Lee ByeongJun as a core engineer and to help with work on three core areas: contract interaction (enabling realms to interact with other realms), the multinode testnet, and porting essential Go packages to Gno. You can find more details and keep track of everything Onbloc is working on in their [hackerspace issue here](https://github.com/gnolang/hackerspace/issues/29).\n\n### Varmeta\nWe’re excited to welcome a new contributor Varmeta to Gno.land. Varmeta was founded in 2020 to focus on blockchain and virtual reality/augmented reality technologies and has grown from a team of three to over 40 engineers. Varmeta is excited by the vision behind Gno.land and its philosophy for rewarding developers. The team is committed to supporting Gno’s success by providing various applications for the ecosystem, starting with the Gno.land Unity SDK to make blockchain more accessible to game developers. Track Varmeta’s progress on their [hackerspace here](https://github.com/gnolang/hackerspace/issues/43).\n\n### Gno @ Devconnect Istanbul 2023\nGno.land core team members organized a small, unofficial meetup in Istanbul during Devconnect week from November 13-17. The engineering-focused meetup was accompanied by a Happy Hour and snacks, where attendees got the chance to learn about Gno.land in an informal way and how they can easily develop dApps in Gno, as well as contribute to the project.\n\nThat's all for now! Be sure to check back again with us for the next edition of The More You Gno to keep up with all our progress. Do you want to contribute to Gno.land's monthly updates? If you're building on Gno.land and want to highlight your development, project, event, or idea, let us know, and we'll include your contribution.","2023-11-29T00:00:00Z","christina","gnoland,ecosystem,updates,gnovm,tm2"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["bgl-poc1","Building Gno.land – Next Generation Smart Contract System","\n\n*Disclaimer: The Building Gno.land series aims to share the core concepts of our platform, mission, and tech stack, providing a snapshot of a current state on our builder’s journey. New episodes may deprecate previous ones, but no editions will be modified at any time. We encourage you to follow along as we create the rails for a more transparent and accountable society, and we welcome feedback and contributions to the repo.*\n\n## I. What Is Proof of Contribution (PoC)?\n\nGno.land is secured by a novel consensus mechanism that makes our platform unique—Proof of Contribution (PoC). PoC prioritizes fairness and merit, rewarding the people most active on the platform and revolutionizing the concept of open-source rewards. By removing the voting power associated with being wealthy (holding tokens in Proof-of-Stake (PoS) networks or amassing mining hardware in Proof-of-Work (PoW) networks), PoC restructures the financial incentives that tend to corrupt blockchain projects in the long run and rewards contributors fairly for their work based on their expertise, commitment, and values. \n\nGno.land contributors receive rewards and voting power according to their contribution level. These rewards increase as they make additional contributions, gain expertise, and are promoted up the Gno.land governing DAO’s (GovDAO) tier levels by higher-level contributors. So how does PoC work, what are its core features, and how does it lend security and decentralization to the platform? \n\n### Prioritizing Fairness and Alignment \n\nProof of Stake (PoS) was a monumental leap forward for the blockchain industry, solving the energy-intensive requirements of Proof of Work (PoW) and enabling blockchains to scale for broader adoption (thanks to its minimal carbon footprint and faster throughput). However, like PoW, PoS has some disadvantages. For example, in PoS networks, participants receive rewards based on how many tokens they stake, which means their incentives for working on the chain are often purely financial. Validators accumulate vast net worths and don’t always hold values that align with the core development of the chain. \n\nSince validators are crucial in securing PoS networks, they should be paid fairly for their work and encouraged to contribute more. However, validators should not be purely financially (and certainly not politically) motivated, taking up competing positions and launching political campaigns to convince token holders to stake with them. This type of lobbying affects all aspects of the chain’s development—from governance to technical upgrades—and can lead to factionalism and misalignment. \n\nPoC makes the system fairer and more sustainable, ensuring participants are aligned and take actions that benefit the Gno.land community and the broader ecosystem. That’s why (unlike PoS) contributors receive rewards based on their contribution effort (tier level) rather than how many tokens they stake. They are thus incentivized and recognized for the quality of their work, ideas, and alignment, driving participation and active engagement. Governance is allocated to the people most likely to care for the ecosystem’s long-term success—the contributors who have spent the most time working toward it—from open-source developers to video creators and everyone in between.\n\n### Rethinking Financial Incentives \n\nFor long-term security and sustainability, PoC emphasizes project principles and values over monetary gains, replacing standard token incentives with a system that separates voting power from token ownership. Two reward systems are currently being considered (in addition to a hybrid system). For the first, contributors receive WORX units that weigh the amount of GNOT tokens (the native Gno.land gas token) earned each month. Each member of the same tier receives the same amount of WORX. At the end of the month, the total each member earned is divided by the total amount of WORX distributed that month to calculate a percentage. This percentage represents the percentage of Gno.land fees earmarked for contributors that each member will earn in GNOT. WORX will likely be cleared each month to prevent cumulative, exponential reward exploits over long periods of time. \n\nFor the second, each tier level simply receives an amount of GNOT each month fixed to a USD value, similar to a salary. This would be combined with risk management and caps per tier level in order to promote long-term sustainability based on Gno.land fee generation. A hybrid of this system is also possible, either rewarding contributors of lower tiers one way and higher tiers the other or using both systems in tandem based on predefined conditions. This will be explored further in future tokenomics articles, models, and documentation.\n\nRegardless, WORX units are not transferable, will not be listed on exchanges, and hold no monetary value. WORX units are more like shares that represent value provided by contributors and allow their work to be quantified compared to other contributors/tier levels. It’s important to stress that GNOT tokens do not influence governance on the platform in any way. Voting power is earned through contributions and distributed according to contribution effort, with each member of the same tier representing equal voting power that increases with their tier level. This creates a network of highly aligned contributors who care deeply about the platform they are building and strive to improve it.\n\nGNOT, the native Gno.land gas token and the gas token of the Gno.land ecosystem, will be distributed via airdrop to qualifying ATOM stakers. It will also be available for purchase after that point (*more on Gno.land’s airdrop and tokenomics coming soon*). GNOT is used to pay all fees associated with the network and beyond, including transfers, IBC, ICS, and contract interactions, giving holders the chance to earn rewards from the economic activities of Gno.land.\n\n### What Makes a Good Contribution?\n\nWORX and/or GNOT can be earned through different types of contributions—not only coding and development expertise—but also through non-technical contributions, such as community building, governance involvement, constitutional proposals, teamwork, media creation, etc. The core focus is on alignment, not necessarily specific tasks. For example, an accepted proposal or merged code will raise or at least maintain the contributor’s tier level, allowing them to receive rewards during their time working between submissions. However, a proposal or code that has displayed a very high level of effort, detail, and aligned values (but is not merged) will also be considered in any proposals regarding contributor promotion.\n\nThis system allows the ecosystem to show appreciation for diverse forms of contributions and ‘useful failures’ that bring us closer to the solutions we adopt. It is designed to foster engagement, creativity, and collaboration while encouraging anyone aligned to contribute to growing the Gno.land chain and community. \n\n### How Are Contributions Assessed?\n\nThere is a strong human element to deciding what makes a good contribution, requiring knowledgeable human judges to exercise discretion. As such, contributions won’t be templated by default or rewarded automatically but assessed through Gno.land’s governing DAO, GovDAO. GovDAO is responsible for development and governance and is organized into tiers, as discussed above.\n\nGovDAO members review, measure, and curate contributions, and the tokenomics of GovDAO incentivizes members to be effective and unbiased evaluators. They engage in discussions and assess contributions based on effort, time, and other relevant factors/metrics that contributors will have stored in their profiles. The decision-making rationale is transparent and visible through on-chain forums. Again, contributors are assigned a tier level and receive a corresponding reward each month according to their tier. As contributors join GovDAO, the DAO grows, giving Gno.land decentralization efficiency and a high Satoshi score. \n\nGovDAO is assisted by a network of knowledge-specific DAOs, such as an Engineering DAO, a Support DAO, an Operations DAO, and the EvaluationDAO, which comprises a trusted group of high-reputation contributors that help assess specific contributions. This enables secure collaboration and seamless integration (*more on Gno.land’s network of interconnected DAOs coming soon*.) \n\n### Sybil-Resistant and Secure\n\nIn addition to being fairer, more aligned, and sustainable, PoC is Sybil-resistant by design. In blockchains, a Sybil attack is where one or multiple attackers multiply their presence and influence by creating fake identities to sway major network decisions (for example, including malicious blocks). In terms of PoS, the Sybil resistance is purely monetary (people need to stake real money to get power), so an attacker that wants to carry out a Sybil attack on a PoS network needs to lock at least as much stake as that locked by honest validators.\n\nPoC minimizes risks of Sybil attacks, takeovers, and alliances as the community vets every person who is given any power or sway in the network (including validator power) through the DAO, so at no point can anyone \"spoof\" identities and regain major sway. Moreover, Gno.land is built and secured by the merit and effort put into the project, as opposed to how many tokens someone can buy, rethinking financial incentives and making the platform Sybil-resistant and secure.\n\nThrough fairer rewards, restructured incentives, resistance to corruption and Sybil attacks, and a strong appreciation for all contributions, Gno.land is designed to be sustainable and fair. A censorship-resistant platform built, owned, and secured by a growing, aligned community for many generations to come.\n\n*I. What Is Proof of Contribution? is the first in a series of articles to dive deeply into the philosophy, vision, mechanics, and work involved in developing a new consensus mechanism for the next generation of smart contract systems. Look out for subsequent editions and additional Building Gno.land series, and let us know what you think! Got questions? Join the Gno.land [Discord](https://discord.com/invite/S8nKUqwkPn) or follow us on [Twitter/X](https://x.com/_gnoland)*.\n","2024-01-10T10:51:00Z","","building-gnoland,gnoland,proof-of-contribution"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-7","The More You Gno: Gno.land Monthly Updates - 7","\n\nWelcome to the latest edition of *The More You Gno*, your regular source of updates from the Gno.land core team and contributor ecosystem. After a well-deserved rest during the holiday break, we’re kicking off 2024 with renewed energy and plenty of exciting initiatives, including a new staging testnet (the Portal Loop), the official Gno.land documentation page, several merged PRs (including native bindings!), and many updates across the board. Dive in to find out what we’re working on and what our ecosystem partners and grantees have been up to.\n\n## Gno Core Team Updates TL;DR\n\nShort on time? Skim the highlights from the core team in the list below. You’ll find additional details in the next section if you want to explore any topic in greater detail.\n- **Native Bindings** - If you’ve been following our journey or experimenting with the platform, you’ll hear virtual champagne pops as Morgan’s ongoing work with native bindings is finally merged [PR 859](https://github.com/gnolang/gno/pull/859).\n- **Gnodev** - Thanks to Guilhem’s `gnodev` initiative [PR 1386](https://github.com/gnolang/gno/pull/1386), you can now create and develop contracts with a single command.\n- **Gno.land Offical Docs** - Check out [docs.gno.land](https://docs.gno.land) for how-to guides, getting started, and an overview of key concepts of the platform.\n- **Effective Gno** - Taking inspiration from *Effective Go*, Manfred’s begun listing common patterns and examples of the differences between Gno and Go.\n- **Assignment in GnoVM** - Jae is working on approaches to fixing assignment in the GnoVM and issues that deal with persistence [(issue 1326)](https://github.com/gnolang/gno/issues/1326). \n- **Portal Loop** - The [Portal Loop](https://portal.gnoteam.com) has been released on a staging domain and is being tested.\n- **Roadmap** - We’re working on a fully-fledged Gno.land roadmap and will share a detailed DAG and important goals and milestones with you soon.\n- **Tendermint2 Update** - There are several PRs aimed at removing the dependencies between Tendermint2 and GnoVM.\n- **Gno.land Tokenomics** - We continue to make progress in defining the structure of Gno.land’s DAOs and the design of reward schemes for contributors.\n### Native Bindings (PR859) Has Been Merged\n[PR 859](https://github.com/gnolang/gno/pull/859) (native bindings) was submitted by Morgan in May 2023 to improve calling Go code from Gno standard libraries, all while improving `gno doc` documentation for standard library functions. Native functions are _declared_ in Gno code, but their definition (the underlying code) only exists in Go: this is similar to how Go and many other systems languages implement assembly functions. Overall, the addition will now allow us to better support precompilation (transpiling Gno code to Go) for all Gno-specific standard libraries, like [`std`](https://docs.gno.land/reference/standard-library/std/address/), and have a system for defining such functions that is transparent to code analysis tools like `gno doc` and `gnols`.\n### Gnodev Has Been Merged\n[PR 1386](https://github.com/gnolang/gno/pull/1386) (`gnodev`) has been merged. Gnodev is a tool to locally develop Gno realms which automatically re-deploys your contracts when you change the files, similar to JavaScript frameworks `npm run dev`. There are some additional features being worked on to improve the experience, including browser hot-reload (for the full front-end JavaScript experience!)—and Gno core developers who have worked on realms all agree that thanks to `gnodev`, they can finally stop visiting their therapist every week. Play around with it, and let us know how you get on. There may be a few bugs still and Guilhem is happily accepting feedback.\n### The Gno.land Official Documentation Page Is Live\nWe’re excited to have the Gno.land Official Documentation page live on the [https://docs.gno.land](https://docs.gno.land) domain. This will always be a work in progress as we expand the docs, make iterations to existing issues, and refine some of the core concepts, but it’s an excellent resource for anyone wanting to find out more about Gno and for onboarding new developers to the platform. A big thanks to the Onbloc team, whose developer portal was a huge inspiration for this. We’re looking for feedback, so leave your reviews and let us know where the docs can be improved and what else you would like to see.\n### Effective Gno\nManfred has been working on a document called [Effective Gno (PR 1000)](https://github.com/gnolang/gno/pull/1000), which takes inspiration from *[Effective Go](https://go.dev/doc/effective_go)* and will become an important reference document for Gno devs to explore common patterns and crucial differences in how we program compared to Go. We’ll be iterating on this as we progress, but you can already find plenty of examples. If you’re just getting into Gno and coming from a Go background, this is a great resource. Read this document and provide some comments if you have any. \n### The Portal Loop Beta Is Live\nThe Portal Loop Beta has been released on a staging domain, and you can check it out now at [https://portal.gnoteam.com](https://portal.gnoteam.com). The Portal Loop will replace the Gno.land website once we’ve finished squashing bugs and adding features. We’re still testing it and have identified several issues. For example, from the last three merged PRs, only one triggered a redeploy when we expected two or three deploys. We will also add a faucet.\n\nAs we continue to evolve the Portal Loop out of its early development stages, transaction volume and general activity will increase. However, currently, there are insufficient transit testing transactions. One of the tasks we want to do to prove that the Portal Loop is working well enough is to write a kind of monitoring-oriented oracle that will try to make transactions, perhaps incrementing a counter every minute. We’re looking for help writing a script or a daemon for this oracle, so let us know if you want to contribute to [issue 1443](https://github.com/gnolang/gno/issues/1443). Once the Portal Loop is finished, we will focus on testnet 4.\n### Assignment Issues in the GnoVM\nMorgan came across a bug [issue 1326](https://github.com/gnolang/gno/issues/1326), which returned an error about an [“unexpected unreal object”](https://tenor.com/es/view/cranizox-gif-8576622211330078986) when assigning a local variable to a dereferenced global variable in the GnoVM. Jae has been spending some time working on approaches to solving this and fixing assignment that will also work for saving escaped objects that don't have a parent (like variables whose pointers are referenced on a persisted object). This is a tough one to figure out, so if there are any other VM issues that deal with persistence and detached parentless objects, now is the time to add them to Jae’s plate. \n### An Update on Tendermint2\n[PR 1483](https://github.com/gnolang/gno/pull/1483) has the same goal as [PR 1438](https://github.com/gnolang/gno/pull/1438): to make Tendermint2 completely independent of GnoVM and Gno.land. This continues a project started many months ago to separate Gno into three separate components: the Tendermint2 consensus engine, the Gno programming language and VM, and Gno.land, the blockchain combining both together. This way, we’re working towards making it possible to build other blockchains that use Tendermint2 (like AtomOne!), the GnoVM, or both!\n### Gno.land Engineering Retreat\nIn the last *The More You Gno*, we covered the Gno.land and AIB company-wide retreat, an invaluable opportunity to work together, code together, and get to know our peers outside of work. It was such a success that the Gno core dev team held another retreat in December in Rouen, France, where many of the above issues and PRs were tackled and merged. We look forward to more productive and frequent face-to-face meetings in the year ahead.\n### Gno.land DAOs and Tokenomics\nWith the input of Manfred, Jae, and the rest of the team, Michael continues to make advancements on Gno.land’s system of DAOs and tokenomics. One key change since the last edition is that the WorxDAO (responsible for governance and all issues related to development in Gno.land) will now be known as the GovDAO. The DAO will likely have seven tiers but initially launch with three or four. The main benefits of moving up tiers are increased voting power, increased monthly rewards, and the authority to promote members from lower tiers. GovDAO will be assisted by WorxDAO, which will encompass several different sub-DAOs, such as engineering, funding, and projects. \n\nWe’re currently exploring different reward systems for contributors, whereby each member of the same tier level will receive the same amount of rewards, either directly or indirectly, in the GNOT native gas token or USD, in a type of salary-based scheme. We may also elect to distribute rewards based on a contribution/work “hash difficulty” (total number and tier split of active contributors that month). We may also adopt a hybrid of these two models. \n\nMichael is also working on a bounty system to make Game of Realms (GoR) more accessible and evaluating contributions easier for judges. High ranking GoR competitors will likely receive Gno.land tier levels based on their leaderboard placing in addition to ATOM rewards. It’s important to note that these discussions are ongoing, and the information here may be deprecated. \n### Making Testing Faster\n\nThanks to Petar, [PR 1417](https://github.com/gnolang/gno/pull/1417), we have improved the entire VM testing suite runtime by around four minutes, which is an incredible achievement. We just need to refactor some test scenarios that are not very concurrent-friendly, but this PR makes interacting with the platform so much easier.\n\n### Bug Fixes and Miscellaneous Items\n\nThanks to Joon from Onbloc, we were able to add support for octals without 'o' (check out [PR 1331](https://github.com/gnolang/gno/pull/1331) for more details), and thanks to Dragos [PR 1309](https://github.com/gnolang/gno/pull/1309), we extended the GRC721 interface so that it now supports setting a token URI. These are both extremely welcomed contributions, and we appreciate our ecosystem partners.\n\nFrom the core team, a special shout out to Dylan for killing it fixing bugs, and getting many PRs ([PR 1451](https://github.com/gnolang/gno/pull/1451), [PR 1315](https://github.com/gnolang/gno/pull/1315), and [PR 1305](https://github.com/gnolang/gno/pull/1305), to name a few) merged over the last few weeks. Props also go to Marc for [PR 1177](https://github.com/gnolang/gno/pull/1177), which has just been merged, which fixes append in certain key situations. We’ve also welcomed a new security engineer, Kristov, to the team.\n\n## Grantee and Ecosystem Updates\n\n### Onbloc\n\nOnbloc has been on a roll, giving us an internal demo of Gnoswap beta just before the Christmas break and a public demo of its awesome Pool Incentivization feature during the last contributor sync call. With Pool Incentivization, anyone can add extra rewards on top of swap fees for LP stakers. This will help bootstrap initial liquidity for new-coming projects by attracting liquidity providers until sufficient organic trading volume is secured. Onbloc is also actively developing Adena’s Airgap feature and has improved the sign-in flow for security enhancement along with some refactoring. There will be a demo coming up in the next few weeks. Onbloc will also be researching airdrop trends and aiming to identify some of the most coveted DEX features users want to see for Gnoswap to streamline the onboarding process.\n\nRegarding Gno core, Onbloc core dev Byeongjoon Lee has developed a JSON parser for Gno, giving us a live demo during the last contributor sync. This allows the conversion or accessing of data from contracts in the JSON format, which will improve the Gno developer experience. His code is currently under review by the core team in [PR 1415](https://github.com/gnolang/gno/pull/1415). Dive deeper into Onbloc’s Builder Journey in the [hackerspace issue 29](https://github.com/gnolang/hackerspace/issues/29).\n\n### Teritori\n\nTeritori continues the challenging work of developing Gno Project Manager, a web app that allows anyone to create, fund, review, or manage projects fully on-chain. During the last contributors' call, the team gave a demo of the work achieved so far, in particular regarding the escrow system and completing project milestones so contributors can be paid once each one is completed rather than having to wait until the project finalization. \n\nGno Project Manager is a complex goal, and the team has run into some issues with edge cases they hadn’t bargained for in the relationships between grantees and funders. The team is looking for feedback and help identifying edge cases, so if you have any in mind, let them know. Teritori is also working on the conflict solver module and improving the social feed on [https://app.teritori.com/feed?network=gno-teritori](https://app.teritori.com/feed?network=gno-teritori), as well as providing more detailed documentation on their work, which they’ll be releasing in the coming weeks.\n\n### Berty\n\nThe Berty team has been busy working on GnoSocial backend implementation. The initial feature set has been implemented [here](https://github.com/gnolang/gnosocial/blob/main/realm/public.gno), including posting and replying to messages and reposting threads. You can keep up with Berty’s journey on GnoSocial in [hackerspace issue 51](https://github.com/gnolang/hackerspace/issues/51), which contains many issues and PRs, such as implementing calls, running tests, and fixing bugs. We’re super excited about pushing the limits of scalability with Berty’s decentralized social platform, and we’ll be looking forward to more demos in the coming weeks.\n### Dragos\nDragos has successfully launched the Flippando game, and you can try it out on the [testnet here](https://gno.flippando.xyz/flip). If you haven’t been following the progress, Flippando is an on-chain memory game that you can play with your choice of styles, such as dice, colors, and hexagrams. Once you successfully complete a matrix, you can mint the end result as an NFT, which can later be assembled into larger, more complex NFTs to create digital artwork. You can find out more about the game, its creator, and the official roadmap on the site. We’ll also release a blog post soon from Dragos sharing his experience porting Flippando from Solidity to Gno, so stay tuned!\n### Varmeta \nVarmeta’s update was brief this week since the contributor sync call ran over. We look forward to hearing more about the team’s progress in developing the Unity SDK for Gno next time. You can read more about it on Varmeta’s [hackerspace issue 43](https://github.com/gnolang/hackerspace/issues/43).\n\n*Do you want to contribute to Gno.land's monthly updates? If you're building on Gno.land and want to highlight your development, project, event, or idea, let us know, and we'll include your contribution. That's all for now! Keep track of our progress by following our socials [Twitter/X](https://twitter.com/_gnoland) and [Discord](https://discord.com/invite/tF2X8M6cVj) and watch out for the next edition of The More You Gno in a few weeks.* \n","2024-01-22T00:00:00Z","christina","gnoland,ecosystem,updates,gnovm,tm2"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["porting-flippando-gno","5 Things I Learned While Porting Flippando From Solidity to Gno ","\n\nLast year, while visiting Seoul, South Korea, I decided, on a whim, to sign up for a hackathon called Glitch. The project I was going to present was a tiny little game, written in Solidity, called Flippando. It started as a weekend project to help me learn Solidity (I had no prior experience with this language). To my surprise, my tiny little game won the first prize on the Polygon track of the Glitch hackathon.\n\nEncouraged and even more curious now, I started attending side events during Buidl.Asia. One was about Gno, a smart contract platform written in Go. After the presentation, which was really great, I started a light conversation with the team. One thing led to another, and I ended up showing them Flippando. \n\nJust for context, Flippando is a non-degen, deceptively simple memory game. You start with an empty matrix and flip tiles to see what’s “underneath.” If the tiles match, they remain uncovered; if not, they are briefly shown, and you have to memorize their color until the entire matrix is uncovered. The end result can be minted as an NFT, and you can later assemble all the boards into bigger, more complex NFTs, basically “painting” with the uncovered tiles.\n\nThe Gno team seemed to like it, and they suggested I should apply for a grant to port it to Go/Gno. I had no prior experience in Go either, so I thought this would be a good opportunity to learn more. To my surprise, again, my grant submission was accepted.\n\nFast forward a few months until now: the Gno version of Flippando is live (in testnet beta) at [https://gno.flippando.xyz](https://gno.flippando.xyz). What follows sums up my experience porting the game from Solidity to Gno. This blog post is a mix of technical and not-so-technical takeaways.\n\n## 1. Being Early Pays Off\n\nSolidity has been around for some time now, and there is already a solid tooling ecosystem for it. I used Hardhat for my development, and I got really comfortable with it. When I started to port Flippando, though, I was quite surprised to see there was almost no tooling in Gno. Developing was mostly TDD (test-driven development) against a local VM, and deploying realms on the actual chain was more complicated than I expected. \n\nMy first feedback rounds to the team revolved almost exclusively around this topic. Very soon, I started to receive signals that my feedback was not only heard but taken into account and processed, and there were actual projects built aiming to improve the developer experience. In just two or three months, two full projects were finished: gnodev, and Gno Playground. \n\nGnodev makes development very similar to Metro in React Native: there is a watchdog on the file system, and your changes to the realm code are reloaded every time you save. It’s almost like deploying in real time; no need to stop the chain, wipe the state, restart the chain, and redeploy your modifications. Gno Playground is a sandbox-like environment, which helps tremendously with quick testing and even deploying packages on-chain. Both projects were finished, as I said, in just two to three months.\n\nBeing early pays off because you get to shape your development environment much faster than in a solidified (pun intended!) environment. You may have to deal with a little chaos in the beginning, but the benefits are well worth it.\n\n## 2. TDD All Day Long\n\nAs I said above, developing realms in Gno consists mainly of writing and testing your code with another code. It’s called TDD and it’s a very useful developing strategy, in general. I used it, at my day job, in all my projects consistently, but only in the initial stages. Once the codebase was more stable, I was relying more on regression tests from the Q\u0026A team.\n\nMind you, there was no Q\u0026A team this time; I was just coding alone, and I was forced to comply more and more with this TDD approach. In the end, I have to admit that, while slower and a bit boring, this approach is more effective, especially in a volatile environment, where patches are added literally every day, and the environment changes continuously.\n\n## 3. Marshal and Unmarshal\n\nThe current GnoVM doesn’t yet have an API standard for formatting. You can’t put a setting somewhere that will make the response be automatically translated into JSON. You have to write these JSON objects yourself for every payload you return from your realm. \n\nIn Solidity, all this is hidden under the event mechanism and handled by existing libraries, like ether.js, which take care of all this nitpicking. It soon became obvious that development time would be significantly longer in Gno because, on top of the logic, I also had to write the formatted response “by hand.”\n\nBut as with every other thing that seemed weird in the beginning, eventually, I came to appreciate it. It forced me to prototype more carefully not only the actual response but all the objects needed in my game. Eventually, it resulted in simpler and more flexible code.\n\n## 4. Eating Your Own Dog Food\n\nWhen developing in Solidity, most of the time, you just import OpenZeppelin contracts for ERC20 and ERC721 tokens (which are battle-tested, bug-free, and relatively easy to understand) and focus on your own contract logic. No mingling with low-level token implementation details; these are already packaged and ready to use.\n\nWhile porting Flippando to Gno, I realized I had to deal with these low-level details upfront simply because there was no equivalent of the OpenZeppeling contracts. Moreover, some current GRCs (the Gno equivalent of ERC) were incomplete. \n\nSo, I had to make a PR for a GRC721 implementation that was missing the SetTokenURI functionality, and this PR ended up being merged into the main Gno codebase (that felt really good, to be honest). \n\n## 5. Being Early Pays Off. Did I Say That Already?\n\nYes, but this time it’s about something else. It’s not about the satisfaction of shaping the development environment in the early days. It’s about the privilege of witnessing something coming to life from literally nothing. Gno has been in development for almost two years now, and it is several months before its mainnet. It’s literally on the verge of coming “alive.”\n\nEvery day new commits are added, and new decisions are made. There are new contributors constantly joining, and new projects prototyped and launched faster and faster. Every day the ecosystem is coagulating itself into something more and more visible, more and more alive.\n\nBeing able to witness this from the inside is a rare privilege and something I’m very grateful for.\n\n## Final Thoughts \n\nSo, these are, in a nutshell, my five top takeaways from porting Flippando from Solidity to Gno. There are many others, of course, and Gno is (did I already say this?) still very early. If you’re interested in learning more, please visit the official repo, look at the docs, and try interacting with the devs. You’ll never gno what can grow out of it! And be sure to play [Flippando](https://gno.flippando.xyz) today live in testnet beta and share your flips.\n\n## Here’s How to Play Flippando\n\nThe game presents a 16 tiles (4x4) or 64 tiles (8x8) matrix. These tiles are “covering” a board of various colors and gradients or shapes, like dice or hexagrams. Clicking two tiles consecutively “flips” them, showing what’s underneath. If they match, they remain uncovered; if not, they are briefly shown, and the player needs to remember their position. Once an entire board is flipped, revealing its random combination of colors, the player can choose to mint it as an NFT.\n\nWhen minting a solved board as an NFT, the game also mints a fungible token, FLIP, which is “locked” inside the NFT. This is the player's “reward.” But the token can only be unlocked if someone else uses that NFT in a larger project.\n\nThese larger projects, or “artworks,” can be assembled in the Flippando Playground. All minted basic NFTs are displayed here in an area from where the player can drag and drop them onto a canvas, creating a much bigger and more complex NFT. Once the canvas is fully filled and the player is satisfied with what’s in there, these new “artwork” NFTs can also be minted. This unlocks all the FLIP tokens for the NFTs used inside the artwork and sends them to their initial players. Furthermore, these complex artworks can be listed and traded in a marketplace, closing the circle of a virtual economy of goods.\n\nStart playing Flippando and share your Flips with Gno.land on [Twitter/X](https://x.com/_gnoland?lang=en) by tagging #gnoflip. \n\n\n","2024-01-24T00:00:00Z","dragos","gnoland,ecosystem,updates,flippando"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["wyg-zooma","Who You Gno – On the Record with Antoine Breuil","\n\nAntoine Breuil, ‘zôÖma,’ is the co-founder of [Teritori](https://app.teritori.com/), an active Gno.land contributor and grantee that’s building key modules and tooling for Gno. A firm believer in equal opportunities, free and decentralized access to information, and helping fellow humans, zôÖma is fascinated by human behavior and how we organize ourselves, holding an avant-garde social experiment five years ago with Teritori co-founder ‘Pop.’ \"La Suite du Monde\" drew people across France to a small village in the countryside to create a shared community and society—with farmland, accommodation, and tools for common use.\n\nThe goal was to form an in-real-life DAO whose members shared common goals and interests using blockchain technology with a token to pay for goods and services and vote on governance matters. While many people participated and were enthusiastic about creating a shared society, zôÖma admits the experiment was early- no one was interested in interacting with the tech. “90% of people, rural or not, found it too complicated,” he admits. “We were a bit naive, but it was fascinating nonetheless.”\n\n## A Fascination for Human Behavior\n\nzôÖma has been an ardent student of human behavior since childhood. His parents taught him early on the value of philanthropy and working with people in need. He’s set up several joint liability companies, non-profits, and NGOs to experiment with finding new and better ways to organize society, and one of the things he loves most about web3 is its “experimental” nature. He’s encouraged by how far the industry has come since he received his first bitcoins in partial payment for a website in 2014. “That turned out to be a really expensive website for my customer,” he laughs. He never expected such broad adoption of Bitcoin and a technology that “inspired a whole generation of engineers to experiment with new things.”\n\nLike most creative types, zôÖma is used to spinning many plates in the air, overseeing La Suite du Monde while working as a freelance designer, front-end dev, and Artistic Director for an independent French record label. “Before entering the world of engineers, I founded and managed a collective for 12 years, which brought together artists from all disciplines, hackers, designers, tinkerers, to build some interesting projects.” La Suite de Monde allowed him to explore his passion for finding new approaches to social coordination first-hand. “I explored very radical things,” he says, “like the notion of “accepted by default” where anyone could use the collective budget by expressing their desire to do so three times. I wouldn’t recommend this,” he laughs, “but the experiments were fascinating and still serve me today in my work.”\n\nOne really interesting trait about zôÖma is how he harnesses the creative and analytical sides of himself with equal application. Most people are predominantly right-brained or left-brained, yet, zôÖma is ‘ambidextrous’ in this regard. He’s a designer who’s created large-scale artistic events, cultural tours of Paris, and an award-winning independent movie documenting French artist and Bitcoin advocate Pascal Boyart, [The Underground Sistine Chapel](http://www.the-chapel.art), (which you should definitely check out!). Yet he’s also passionate about engineering and the future of cooperatives. He’s detail-driven and ambitious, taking his team at Teritori from two to 18 (14 full-time teammates and four part-time).\n\nIn his free time, zôÖma, “like all French people,” enjoys fine wine and good conversation. One of the things he loves most about Paris is how easy it is to find like-minded people to brainstorm with or decompress after a long day of work. “We have a very active ecosystem of engineers, cryptographers, etc.,” he says. Paris is also a beautiful city that captures his imagination with its dazzling architecture and impressive art. Even so, zôÖma channels his creative energy more effectively when working from a small Moroccan fishing village for three months a year. He reconnects with nature and humanity, immersing himself in a different culture and surfing in the Atlantic before he starts his day. \n\n## New Tools for Social Coordination \n\nWhy does zôÖma believe social coordination is so important, and why do we need new tools for it? “We’ve always had tendencies to organize ourselves and tools defining rules for living together, diplomatic protocols for discussing between social groups, or trading goods and services. But almost all the tools that previous generations put in place are outdated. Our entire generation has lost confidence in institutions to allow groups of humans to organize, coordinate, and meet their needs. Our dependence on third parties who do not have the same interests as citizens is immense.”\n\nzôÖma believes that web3 holds the key to unlocking the emergence of new societies through products that are “unstoppable, resilient, and meet a real need,” whether for small villages in the south of France, Africa, or Asia or neighborhoods in Brazil or Korea. “We must have access to the radical transparency of institutions, the privacy of individuals, censorship-resistant tools, and autonomous communication from all commercial enterprises. It is on this solid foundation that civilizations that are more just and equitable can be built.”\n\n## Making Web3 More Accessible \n\nOf course, as zôÖma found out, building new tools is easier said than done. Our industry faces an uphill climb when it comes to balancing the promise of the tech with a user experience that doesn’t cause tachycardia. He says that understanding that most people “don’t have the time or inclination to incorporate difficult technical concepts in their lives” has given him “crazy energy to focus on very simple technologies.” In fact, the ‘failure’ of La Suite du Monde is what gave birth to Teritori, “which today provides all the functionalities people asked us for at the time; a social network, communication systems, voting, crowd-funding, etc. We have made great progress, and it’s important to focus on products that are radically simple for the general public.”\n\nAccording to zôÖma, this means abstracting away the concepts that everyday people don’t need to be aware of, such as networks, dApps, and even blockchain, “and always switching from one decentralized application to another.” Unifying (not centralizing) separate tools, networks, and technologies within a single, simple interface, he believes, is the key to broader adoption. “It's a very complex challenge, in terms of security, design, etc., but it's what I'm passionate about today.” \n\nWhen it comes to Gno.land, Teritori has already delivered essential DAO tooling and standards, a Moderation DAO module to facilitate social communication and a Justice DAO module for conflict resolution. The team is now focusing on an on-chain project management tool to allow organizations and individuals to manage projects and track tasks smoothly and transparently on-chain.\n\n## A Fairer, More Transparent World\n\nIn 2024, Teritori enters a new phase called \"Chapter II,\" which involves unifying all its work into a mobile and desktop application that could “trigger superb demonstrations of the potential of DAOs.” He enthuses, “I dream that we will see the emergence of a village that uses Teritori as a tool for internal discussion and co-financing. Will this be real in 2024? Who knows? But that’s where I focus all my energy!”\n\nHe believes the internet has been a great leveler, enabling anyone with a connection to educate themselves on any subject; yet, the opportunity isn’t open to all, and free and open access is constantly diminishing. “I am a child of the internet. I grew up with warez, p2p, and an internet which provided me with daily resources to learn freely, everything that interested me. In some countries, it is impossible to benefit from this opportunity, and with the centralization of the internet on different key players, mass surveillance, and the censorship of certain dictators, the internet is losing its very essence, which makes it magic. Distributed protocols can reshuffle the cards and offer tools for the public good.” \n\nzôÖma says that humanity is at a turning point, and we must build the necessary tools now to avoid finding ourselves in a real-life version of George Orwell’s 1984. “I aspire to participate modestly in a world that is fairer, more transparent, and where society doesn’t need a puppet in a suit to improve its living conditions or respond to local needs. Web3 is just a tool, and if it doesn't meet this real need, then for me, it will be a failure.”\n\n*Experiment with Teritori today and test its Social Feed, which now includes Twitter-like functionality for posts, Medium-style articles, Soundcloud-inspired music, and videos—all based on Gno and IPFS and totally decentralized. You can also check out Teritori’s GnoModerationModule, which allows you to moderate a social network in a decentralized way. A faucet is available on the home page at [app.teritori.com](https://app.teritori.com/feed?network=gno-teritori).*\n","2024-01-11T00:00:00Z","christina","whoyougno,teritori,community,interview"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["bgl-poc2","Building Gno.land - Proof of Contribution II","\n\n*Disclaimer: The Building Gno.land series aims to share the core concepts of our platform, mission, and tech stack, providing a snapshot of a current state on our builder’s journey. New episodes may deprecate previous ones, but no editions will be modified at any time. We encourage you to follow along as we create the rails for a more transparent and accountable society, and we welcome feedback and contributions to the repo.*\n\n## II. Proof of Contribution vs Proof of Stake\n\nProof of Stake (PoS) is a robust consensus mechanism that provides a more environmentally friendly and scalable alternative to Proof of Work (PoW) and powers most of the web3 industry today. As PoS pioneers, Cosmos technology secures hundreds of blockchain projects and billions of dollars of digital assets, and Ethereum (launched as a PoW chain in 2015) made the historic switch to PoS in 2022. According to [ethereum.org](https://ethereum.org/en/developers/docs/consensus-mechanisms/pos), PoS is “more secure, less energy-intensive, and better for implementing new scaling solutions compared to the previous proof-of-work architecture.” However, as we briefly discussed in [*What Is Proof of Contribution?*](https://test3.gno.land/r/gnoland/blog:p/bgl-poc-1), PoS has vulnerabilities that can corrupt the network over time.\n\n### The Limitations of Proof of Stake (PoS)\n\nBeyond securing the network, the main goal of any consensus mechanism (PoW, PoS, DPoS, PoC, etc.) is to be as decentralized as possible and not reliant on any central actors. This can be measured by the Satoshi Score (or the Nakamoto coefficient), a quantitative measure that assesses a blockchain’s level of decentralization by calculating the minimum number of nodes needed to compromise a network or carry out a 51% attack. PoS systems can be bootstrapped within days (or even hours), starting off decentralized and achieving a high Satoshi Score.\n\nThe PoS chain Genesis allocates a default voting power to ~20-50 nodes, in general equally (or at least making sure that no single node has more than 5% of the voting power). This makes PoS chains decentralized enough (in theory) from block 0 with a near-perfect Satoshi score. However, in practice, PoS has two main issues. Because the system is dictated by money, PoS chains become imperfect over time. Anyone wealthy enough can stake their tokens progressively and use their accumulated power to sway decision-making on the chain—or take the network over completely.\n\nThe chain can limit the maximum voting power per validator node, but this is almost ineffective, as a malicious actor can carry out a Sybil attack on the network and create multiple validators to bypass the voting cap. Such an attack renders the max voting power per node useless and leaves the chain defenseless against a single organization or cartel gaining the majority of the voting power. PoS systems leave chains like Cosmos Hub and Ethereum at risk from such bad actors, cartels, and powerful protocols (such as Lido and Rocket Pool).\n\nWhile Proof of Contribution (PoC) can’t prevent Sybil attacks on standard user accounts (when malicious actors create multiple accounts with a single computer and transfer tokens within a few hours), it does make it almost impossible for validator nodes to suffer Sybil attacks. Since the community vets every person who is given voting power or sway in the network (including validator power) through the DAO, at no point can anyone \"spoof\" identities and gain major sway. \n\n### Where Proof of Contribution (PoC) Excels\n\nPoC is actually Proof of Authority (PoA) which, instead of offering up a resource like computing power or a financial stake, relies on validators staking their reputation. Anyone can join most public PoW and PoS networks without revealing their identity. However, by definition, PoA validators need to make themselves known and are selected based on their trustworthiness. This means PoA tends to work better when deployed in private or permissioned blockchains than in public platforms (because of this tendency toward centralization). \n\nPoC solves this problem, ensuring the network becomes increasingly decentralized over time by being governed by a decentralized entity, GovDAO. Like standard PoA chains, PoC chains launch with a handful of validators that must be identified and trusted by the network, meaning governance is centralized at the start, and the chain achieves a low Satoshi Score. The system is about contributing and earning contribution units, which are slow to gain and require human interaction. It takes months (or years) before there are enough actors in the DAO and sufficient voting power for the chain to be considered decentralized enough, according to the Nakamoto coefficient. \n\nPoC is thus slower to bootstrap than PoS and harder to achieve. You can think of PoC versus PoS as a marathon versus a sprint, whereby PoC starts slowly but then gains momentum over time, and PoS starts quickly but loses momentum over time (the graph below provides a visual representation of PoC versus PoS). \n\n[![Graph](https://gnolang.github.io/blog/2024-01-26_bgl-poc2/src/thumbs/graph-container.png)](https://gnolang.github.io/blog/2024-01-26_bgl-poc2/src/graph-container.png)\n\nThe GovDAO that owns the chain has a mandate to scale (to grow and decentralize) continuously as it adds more contributors. This means it becomes progressively larger over time, achieving high decentralization efficiency way beyond the initial fast sprint of PoS chains. Once established as a proven consensus mechanism and alternative to PoS, GovDAO can benefit from by any blockchain project (through an evolution of ICS) wanting to achieve decentralization and sustainability—PoC can secure Gno.land and the web3 industry at large.\n\n### Security-Conscious by Design\n\nAnother advantage of PoC is that because it’s reliant on human interactions, it is more Sybil-resistant by design. As discussed, it’s almost impossible to split a validator node into two (or more) nodes, making conducting a Sybil attack infinitely difficult. Since contribution units are not transferrable or exchangeable, PoC cannot suffer from whales attempting to purchase voting power quickly. If someone wanted to take over the network, they would need to invest years of their time making meaningful contributions. Their attack would be so slow that it would easily be prevented by humans monitoring the decentralization and adjusting the parameters. \n\nMoreover, GovDAO will activate and deactivate new validators on request, establish a KYC system for validators, and manage promotions of contributors with votes. This removes the possibility of a takeover happening overnight since the only way to gain validator or voting power is by voting on governance requests, which is slow and managed by humans. This is in contrast to PoS systems which are powerful and fully automated yet defenseless against such coordinated attacks.\n\nGno.land is built on the very premise that such an attack on a PoC network would never happen as it would be entirely counter-intuitive. Since contributions are not only about expertise but also alignment, it is our hypothesis that longstanding contributors who have invested years of time and brainpower in developing the chain will do their best to protect it rather than destroy it. The DAO system will endure thanks to the mix of expertise and alignment and the amount and frequency of contributions. \n\n### Concluding Thoughts\n\nBeyond separating voting power from net wealth, a core component of Proof of Contribution (PoC) is its focus on long-term sustainability. PoC makes the system fairer and more sustainable, ensuring participants are aligned and take actions that benefit the community and the broader ecosystem. PoC is slower to bootstrap and harder to achieve than PoS but focuses on long-term alignment and security. \n\nUnlike PoS, contributors receive rewards based on their contribution effort rather than how many tokens they stake. They are thus incentivized and recognized for the quality of their work, ideas, and alignment, driving participation and active engagement. Governance is allocated to the people most likely to care for the ecosystem’s long-term success—the contributors who have spent the most time working toward it.\n\n*II. Proof of Contribution vs Proof of Stake is the second in a [series of articles](/r/gnoland/blog:p/bgl-poc1) to dive deeply into the philosophy, vision, mechanics, and work involved in developing a new consensus mechanism for the next generation of smart contract systems. Look out for subsequent editions and additional Building Gno.land series, and let us know what you think! Got questions? Join the Gno.land [Discord](https://discord.com/invite/S8nKUqwkPn) or follow us on [Twitter/X](https://x.com/_gnoland)*\n\n\n","2024-01-26T13:37:00Z","christina","gnoland,gnovm,tm2,PoC"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["funding-program-23q4","Gno.land Funding and Grants Program - Quarterly Report: Q4 2023","\n\nThe Gno.land Funding and Grants program identifies talented and passionate developers, researchers, and tinkerers to interact with Gno.land, enhance the platform's usability, and help build the core infrastructure and tooling needed for mainnet. After a strong start in Q3 2023 from our grantees, we awarded four additional grants in Q4. Let’s take a look at their progress and what’s coming up in Q1 2024.\n\n## Q4 Funding Breakdown\n\nThe total amount paid out in Q4 for grants was just under $317,000, spread out over the four grants: Teritori, Berty, Onbloc, and Dragos (Flippando). This work was split over essential stress-testing, debugging, and development on Gno core, and building social, gaming, and project management dApps to extend the platform’s functionality. Each grant recipient received milestones for deliverables and tracked their progress through regular public and internal syncs, hackerspace journey updates, blog posts, documentation, and developer calls.\n\n[![Q4 Chart](https://gnolang.github.io/blog/2024-02-07_funding-program-23q4/src/thumbs/chart.png)](https://gnolang.github.io/blog/2024-02-07_funding-program-23q4/src/chart.png)\n\n## Berty Technologies (delivery May 2024)\n\nAfter successfully meeting their deliverables in Q3 and creating Gno Native Kit (formerly [GnoMobile](https://test3.gno.land/r/gnoland/blog:p/gnomobile)), Berty was awarded a second grant in Q4 to experiment with smart contract integrations around social media. Through the development of GnoSocial, the team has created a test bed for building decentralized social media-style apps and helped to stress test technical issues in Gno.land. \n\nIn Q4, Berty delivered V1 of GnoSocial, which includes basic Twitter-like functionality. GnoSocial will be implemented on mobile using the Gno Native Kit framework, with a minimal desktop app and a read-only web version also in the scope. Aside from this work, Berty contributes to Gno core development, helping raise issues and merge PRs. You can follow their progress in hackerspace [issue 51](https://github.com/gnolang/hackerspace/issues/51).\n\n## Teritori (delivery February 2024)\n\nAfter delivering the [moderation module](https://test3.gno.land/r/gnoland/blog:p/gnoland-moderation-dao-module) in Q3, Teritori received a second grant to carry out research and implement a conflict resolution module and an on-chain project management tool. Their work also continues on the escrow module build. As an active contributor, the Teritori team helps improve Gno core as well, getting more PRs merged, participating in regular meetings, and writing documentation. Read more about Teritori in their hackerspace [issue 7](https://github.com/gnolang/hackerspace/issues/7).\n\n## Dragos (Flippando, delivered January 2024)\n\nTo experiment with gaming in Gno.land, Dragos received a grant to port his on-chain memory game Flippando from Solidity. Flippando is a simple memory game—with a twist. Players uncover tiles and must find their matches to win the game. The result can be minted as an NFT and assembled to create larger, more complex NFTs and digital “paintings.” The beta version of [Flippando](https://gno.flippando.xyz/flip) is now live on the testnet, and you can read about his experiences in developing the game on the [Gno.land blog here](https://test3.gno.land/r/gnoland/blog:p/porting-flippando-gno) or visit [hackerspace issue 33](https://github.com/gnolang/hackerspace/issues/33).\n\n## Onbloc (ongoing)\n\nAfter producing consistently awesome work and being our longest-standing contributor, Onbloc received a grant in Q4 2024 to continue iterating on Gno.land tooling, Adena, and to help build Gno.land core in preparation for mainnet release. Part of the scope was to support contract-to-contract interaction [issue 757](https://github.com/gnolang/gno/issues/757), lead a [multi-node testnet initiative](https://github.com/gnolang/hackerspace/tree/main/multinode-testnet), write pure Gno packages, and help debugging the GnoVM, among many other initiatives. Onbloc is also adding additional security to the Adena wallet and an “Airgap” feature, which you can read more about in [hackerspace issue 29](https://github.com/gnolang/hackerspace/issues/29). We’ll also release a detailed blog post soon, so stay tuned.\n\n## Coming Up in Q1 2024\n\nWe’re looking forward to more exciting developments in the coming year as we focus on the road to mainnet. In Q1, grantees will mainly focus on debugging Gno core, developing smart contracts and libraries, building and porting dApps to Gno.land, and creating educational materials to help grow the community.\n\nBlockchain software and virtual reality technologies firm Varmeta are under evaluation for a grant to support account sessions and build the Gno.land Unity SDK to make blockchain more accessible to game developers (you can track their progress in [hackerspace issue 43](https://github.com/gnolang/hackerspace/issues/43)). We’re also finalizing a grant for a DAO tinkerer and a research report, as well as evaluating the extension of a second grant to Dragos to port his popular project management app to Gno.land. \n\n\n*We’re steadily building out the Gno.land platform and our ecosystem of grantees and contributors. Let us know if you want to join us by submitting an application at any time on the [Funding and Grants repository](https://github.com/gnolang/ecosystem-fund-grants). We’re always on the lookout for ideas to advance the platform.*\n\n\n","2024-02-07T13:37:00Z","christina,michelle","gnoland,funding,grants"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["wyg-dragos","Who You Gno – On the Record with Dragos Roua","\n\nDragos Roua is a humble man. If you had the chance to read his article, [*5 Things I Learned While Porting Flippando From Solidity to Gno*](https://test3.gno.land/r/gnoland/blog:p/porting-flippando-gno), you’d have seen him refer to Flippando as his “tiny little game” and describe his “surprise,” over it winning the Polygon track of the Glitch hackathon, two subsequent hackathons in South Korea, and piquing the interest of the Gno.land team to offer him a grant. If ever there were an inverse of “the empty vessel makes the loudest sound,” Dragos would be it.\n\nAt 54 years old, he’s lived an extraordinary life. Growing up in communist Romania, where scarcity was in abundance, and “everything was in short supply,” Dragos and his peers were “only allowed to learn one coding language,” and it happened to be called “Whatever.” So, when anyone asks in what languages he knows how to code, he always jokes that Romanians can code in “whatever.” Joking apart, his language skills are impressive, to say the least. \n\n## Dragos Knows a Lot of Code\n\n“My first production-level code was written in Cobol on punch cards,” he says when he was just 16. He went on to learn Smalltalk, Lua, and “just for fun,” even a programming language called “Brainfuck.” He spent many years programming in web2, iOS, and Andriod, but over the last seven years (since entering the web3 space), has been consistently working in JavaScript, Swift, Solidity (which he learned by creating Flippando), Python, and Go. Despite this, Dragos confesses he still feels more at home within the Apple ecosystem. “I've been building a lot there,” he says. \n\n## He Speaks Many Languages\nI ask if learning programming languages is similar to spoken languages. “Every programming language has vocabulary and grammar, which is a specific set of rules over that vocabulary, so it’s similar in that sense,” he says. And how many spoken languages does he know? “I can speak five Indo-European languages” (Romanian, English, French, Spanish, and Portuguese). “Five?” I gulp, wide-eyed, suddenly feeling inadequate for only speaking three. “Well, they all share about 70% of the vocabulary, and the grammar has almost the same rule set,” he shrugs, minimizing his accomplishment.\n\nHe’s also learning two Asian languages with varying degrees of success. Korean, a language he understands “some 40%” of, Dragos admits, is a different ballgame. “I've been frustrated for nine months, every day trying to plug away because there's literally no similarity in vocabulary between any Indo-European language and Korean. Literally no word is the same, and the grammar is also very, very different.” He explains that learning a language like Korean means starting from zero and waiting for the brain to forge the neural paths. “It's quite difficult to do,” he concedes.\n\n## A ‘Location-Independent’ Lifestyle \nI check out the backdrop behind him. He’s taking the interview from an elegant cafe in downtown Saigon with impressive dark wooden walls, large ceiling fans circling above, and a rich colonial atmosphere. “It’s such a posh place,” he smiles, “every day, there are groups of people taking pictures. It has an Indochina vibe.” I can’t help but wish I could teleport over and share a beer with Dragos as we discuss his remarkable life. “How long have you lived there?” I ask, “I don’t live in Saigon,” he replies, “I’m location-independent.”\n\nAs I wonder if that’s a more elegant term for “digital nomad,” Dragos quickly explains the difference. Digital nomads typically have no fixed abode, he says, and tend to set up a base for a short period of time before moving on to the next place. Location-independent is someone who has a base but is independent of it and chooses to spend longer periods of time in various places. “So I became a loner,” he says, “and I’ve been location-independent for six years. I spent my first two and a half years in Spain, then from Spain, I moved to Portugal, which is my base right now, and I started to explore Asia last year.”\n\n## A Love of the Open Road\nI point out how amazing his lifestyle sounds—and also how challenging it must be at times. Dragos loves the freedom that comes with being alone in a foreign land and the master of his destiny. He also thrives on learning from different people and cultures and discovering more about himself. “The more you travel, the more you learn. Where can you stay? Where can’t you stay? What is needed? You learn the logistics, and you become a much better administrator and manager of your life.”\n\nHe admits to feeling lonely at times. Being location-independent isn’t for everyone, and certainly not if you don’t like being alone. “It's very difficult to be on the road because you don't have many friends. You don't have a fixed social circle. I'm in a place right now where I'm quite comfortable with myself. I can spend long periods of time on my own without needing close encounters. I have a very limited circle of friends, which I keep in touch with every month or so.”\n\nThe cultural differences between Europe and Asia are something of a double-edged sword as well. Dragos likes Vietnam, where the people are friendly and welcoming and talk to him on the street out of curiosity or to practice their English. But he’s felt like quite an outsider in South Korea, where the culture of politeness and restraint makes it harder to establish meaningful friendships. \n\n## Astrology, AI, and Other Mind-Blowing Stuff\nTalking about human connections inevitably leads to the increasing lack of them—and the topic of AI. I ask how he feels about the prospect of AGI and a potential replacement species. He shrugs and points out that most of what we hear about AI is marketing. He thinks that LLMs (Large Language Models) will hit a wall when they run out of good data to be trained on. He is a little concerned about the prospect of election rigging and AGI being harnessed in the political sphere by nation-states attempting to outmaneuver each other by predicting the next plausible move. “But this is a can of worms,” he says.\n\n“Actually, at the most fundamental level, there is no difference between AI and the process by which we generate ChatGPT or any other language model, and… hold your breath,” he pauses, “astrology. They both take a set of arbitrary features and a set of desired outcomes. After that, they just do a lot of computation, by trying to minimize a cost function between the predicted and expected outcome. That's all there is to it. You take features, add some parameters, trillions of parameters, you run a lot of computation, and in the end, you have the most plausible outcome. LLMs do this in hours/days/weeks of training, astrology did it slowly, over the course of a few thousand years.” \nI ask Dragos if he hadn’t been a programmer, would he have perhaps become an astrologer instead? “I actually studied astrology and used it for 18 years,” he replies.\n\nI try hard not to fall off my chair. Dragos explains that astrology plays a huge role in his life, and he consults it before making any major decision—such as moving countries or leaving jobs. “I consult it on every major decision and even daily life. So wherever I have to, I use it. When I sold one of my companies, when I decided to move abroad, when I travel, and stuff like that.” He gives the analogy of meteorology and says if he knows it’s going to rain, he’ll take an umbrella to have less friction and move around more easily. In the same way, he applies astrology to his life. This man is a Pandora’s box.\n\nWhat else does he do in his spare time besides traveling the world, consulting the Cosmos, and writing code for fun? Dragos likes playing pool, socializing, dining out, and dancing. “I was a tango dancer back in Romania. I had a tango school for a year.” At this point, I’m hardly surprised. \n\n## Dragos on Gno.land \nI met Dragos last year in Seoul at a Gno.land event hosted with Onbloc during BUIDL Asia. That’s when he spoke to Manfred about Flippando and subsequently applied for a grant. We were still building the specs for the Grants Program at the time, and Dragos was our first grantee. Since then, he’s embarked on a whole new journey learning Gno and building the airplane as it flies, delivering Flippando last month and regularly helping the team with Gno.land core issues.\n\nDragos has since submitted a second grant proposal to port his project management app to Gno. “It uses my life management framework, which I call “assess, decide, do.” The name of the project is *ZenTasktic*. There is already an app on iOS that I wrote,” he explains. You can read more about his grant proposal [here](https://github.com/gnolang/ecosystem-fund-grants/pull/11) and be sure to test out [Flippando](https://gno.flippando.xyz/flip) today.\n\nI apologize for taking so much of Dragos’ time, but he assures me it isn’t a problem. “I don’t work today, I'm not busy. I'm just enjoying my afternoon in this coffee shop.” As Dragos sips on the local tipple and drinks in the sights and sounds around him, I can’t help but admire his outlook on life and the choices he’s made—and I look forward to seeing what he's up to next and what else he builds with Gno.\n","2024-02-08T00:00:00Z","christina","whoyougno,flippando,community,interview"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"4wO6oS8YA5hO1wuqmfFsT2xxg41NtysJBVhCgTsaw2BuF37yhNdlpo6lRoHctwjBbCLDVnGheRLSpJcP1l0TfQ=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["tech-ama1","Gno.land Community Technical AMA #1 - Recap","\n\nYour questions, observations, and feedback are vital to our core development team. Not only do they give us an understanding of the types of applications and features the community would like to see but they help us formulate better ideas for developing Gno.land as we go. Before we dive into our second **Discord AMA on November 22nd @4pm UTC**, check out the community questions from our first technical AMA below answered by core Gno.land devs Jae Kwon and Manfred Touron.\n\n### Why did you choose Golang over Rust?\n\n**Jae**: “With parallelism offered by ICS1 [Interchain Security 1], the bottleneck becomes speed of innovation with safe code, rather than bare metal performance. So here, garbage collection, concurrency, embeddable structures, and clear spec are good primitives for the next-generation smart contract language.\n\nRust (or components of Rust** may be used to implement faster clients for gno.land in the future, but in terms of mindshare, I don't think Rust can flip Go due to its design choices. That's not to say that Rust is any worse than Go; they are different.”\n\n### Will Gno be its own hub? Will Gno provide ICS-like security to its own community?\n\n**Jae**: “Gno.land can be a \"hub,\" like \"git hub\" is a \"hub,\" but that doesn't mean it will offer ICS. If other chains solve ICS1 better, it makes sense for gno.land to be IBC-connected to zones that are not ICS1 replicated/secured with gno.land validators.\n\nIf we consider that validators of gno.land are better as contributors to the gno.land ecosystem (rather than general validator service providers** we may be more comfortable contributing to an awesome ecosystem but not entering the validator-as-a-service business.\n\nIt makes more sense to me that Cosmos Hub validators should own that business, which will eventually require validators to run their own server stacks and have data center infrastructure.”\n\n### How can one become a validator?\n\n**Jae**: “First, one has to become a member. We have not yet defined the full member system, but we will figure that out along the way. For now, we can say that we want first and foremost members who also validate, rather than impartial validators that only validate.”\n\n### How does Gno validate work? PoS? Proof of Contribution?\n\n**Manfred**: “The contributors DAO will elect validators and validators will have the same amount of power. They'll be focused on validating and will receive rewards for that job.”\n\n### What is Proof of Contribution? What kind of contribution will be credited?\n\n**Manfred**: “Proof-of-Contribution is a way to replace Proof-of-Stake with a metric based on the contributions. It's a variation of Proof-of-Authority where the authority is a DAO of contributors. After the 'Game of Realms** competition, we'll reward the best contributors with a tiered membership in the first version of Proof-of-Contributions DAO. The voting power and everything related to staking will be distributed across the contributors.\n\nLater, we'll add more flexibility to the membership with $GNOSH, allowing more accurate and fair rewards. Validators won't receive voting power with staking. The DAO will elect them, and they will all receive the same amount of power. Validators will receive rewards for their technical work, not for the amount of staked tokens they are bound to.”\n\n### Is there a document or resource that describes the key concepts in a Gno smart contract?\n\n**Manfred**: “We have yet to get a single top-level documentation, sorry. You can find documentation in the code, README files, issues, etc. We need to improve this. The community will be able to work on this during Game of Realms.”\n\n### Is there a big-picture diagram of the ecosystem?\n\n**Jae**: cosmos hub \u003c-- \"ec2+DTCC\"\ngno.land \u003c-- \"github for gno\"\n(cosmos hub etc) ICS zones \u003c-- \"holy grail\" scalable smart contracts\nyour chain \u003c-- \"gno inside\"\nyour app \u003c-- \"import gno.land/...\"\nblockchain-based communications/coordination/discourse platform \u003c-- us\n// DTCC: \"https://www.investopedia.com/terms/d/dtcc.asp\" // my point is, be a good reliable token hub with good governance.”\n\n### I'm a developer (PHP, Python**. How can I become a Gno developer? Please advise me on where to start.\n\n**Manfred**: “Start learning Go! One of the long-term goals of Gno is to make writing contracts as easy as writing web2 apps. The language is already strong in that direction, but we still need to catch tooling, documentation, tutorials, and language improvements. You need to have a good level with Golang and be autonomous to start building on Gno.\n\nOne of the Game of Realms tracks will be to work on everything related to onboarding more people. This will be the best place to write specific tutorials to onboard people from other ecosystems or languages.”\n\nWhat are Realms, and what is r board?\n\n**Jae**: “A realm is a Gno package with state, that represents a smart contract with storage and coins. The other Gno packages don't have state, and so are \"pure\" packages that can be imported from other realm or non-realm packages. Like land-tax, realms must be whitelisted or pay storage upkeep for their state. You can create new realms by uploading a new package with the package directory starting with /r/REALM/NAME.\n\n/r/demo/boards is a Gno package that renders a message board. It is a proof of concept message board written in Gno. Since we need to preserve messages, it is a stateful (realm** package. You can see the files of the demo boards, like:\n\nhttps://test3.gno.land/r/demo/boards/board.gno\n\n### How do external packages get imported?\n\n**Manfred**: “Example: when you call your smart contract from Go during testing, how can/should that smart contract load external packages?\n\nA gnolang can only import other gnolang contracts/libraries that were published on-chain. If you want to import an external Golang library, you need to port it to Gno, and publish it as a library, then you can import it from a top-level contract.\n\ngnodev test is an exception, it basically creates an in-memory Gnolang VM, publishes the dependencies (automatically detected**, and executes the test. The tool can act differently from the real on-chain experience. Note that we'll improve the gnodev so it can automatically download on-chain contracts or use custom local paths, to support advanced development workflows.”\n\n### What is a Gnode?\n\n**Jae**: “I don't like the name \"Gnode\" because it's too generic, but the idea is to build Gno-based building blocks for GnoDAOs, as MyGnode embeds components (of owners, treasury, board, etc.** here:\n\nhttps://github.com/gnolang/gno/commit/b9128b1d69f02dbb49be883e0c70fe9d3fc40dcc\n\n**Manfred**: “We can change the name 🙂. A Gnode is a DAO implementation that implements an interface allowing them to interact. A Gnode can have a parent and have children. Top-down interactions may be funding, grants, and approvals. Bottom-up interactions may be reporting or voting. The implementation is flexible. You can have DAOs managing a Gnode, its treasury, and voting the cross-Gnode interactions. You can have Gnodes with an elected leader or one driven by a bot or another blockchain. One of the goals of Game of Realms will be to propose various implementations of Gnodes.\n\nAt the level of Gnoland, we will probably have a top-level Gnoland Gnode managing a global treasury and vision. Then various technical and non-technical child Gnodes manage subsets of the treasury and their tasks. They may also have children. With IBC2, Gnodes could be distributed across different chains.”\n\n### What is the timeline for IBC2?\n\n**Jae**: “After the launch of gno.land, IBC2 is permissionless innovation anyone can try for, so I imagine not long after that. After initial implementations, I bet we will want to tweak/optimize the Merkle tree further, but this can come after IBC2 demos.”\n\n### Can you tell us more about Game of Realms?\n\n**Manfred**: “Game of Realms is a competition to build the first contracts of Gnoland and experiment with proof of contributions. The first step of the competition will be to build the missing tools for the second step. So people will compete to write the DAO that will review the other contributions and allocate points.\n\nThe rest of the competition will be about competing to write the best contracts for well-known categories or make non-technical contributions. At the end, we'll have strong foundations (libraries, rules, tutorials, dApps** to help upcoming builders to start in better conditions. The best contributors will earn rewards and membership in the future DAO of contributors that will co-own the chain.\n\nWe'll have the first version of a Proof-of-Contributions-based DAO of contributors. Focus on one of the official tracks: build a contract suite to compete with Cosmos' governance module to eventually complete Cosmos Hub governance. Realm boards are basic discussion contracts that can be used for discussions, and be extended for governance, launchpad, or other things mixing discussions and DAO actions.”\n\n### Is it possible to build code with gno.land directly online?\n\n**Jae**: “We will make the sandbox staging.gno.land environment easy to access, and that will be preferable to testing on gno.land directly. The gno codebase tries to remain minimal so it shouldn't be difficult to run it locally.”\n\n**Manfred**: “I've seen people writing contracts from VSCode on an online VSCode instance. Someone could create a VSCode template configured to communicate with staging by default with a dummy wallet containing tokens.”\n\n### Is there a plan to be able to use the Gno VM with a Cosmos SDK-based chain?\n\n**Manfred**: “This is one of the plans, yes. And not only on Cosmos SDK. But we don't have a clear plan about how it will happen yet.”\n\n### How about interoperability?\n\n**Jae**: “Regarding interoperability, will it be between Gno chains, with Cosmos, or with more chains outside of Cosmos? If it is with chains outside of Cosmos, which ones, in the short and long term? I think if the latter were to come to pass, the world of web3 and NFT could be awesome. Short run, Cosmos SDK-based chains with IBC1 for code import and cross-chain smart contract calls; but with IBC2/Gno it's really up to the smart contract logic.”\n\n### Are Gno.land tokenomics deflationary?\n\n**Jae**: “There will be $GNOT, and this token will be used for spam prevention fee payment, and it will be deflationary. Previously, we discussed $GNOSH as a secondary token, but we have moved away from the $GNOT/$GNOSH model and will keep $GNOT while making gno.land more about membership among levels of peers.\n\nI think we need an alternative to the Cosmos Hub that is more people-centric than stake-centric, and where alignment is not bought or sold but depends on contributions and value alignment proven over time. The hope is that by moving away from a pure tokenomics perspective and moving into the realm of politics and ethics along with general economics we can curate a different kind of culture.”\n\n### Are there any collaborations with other projects to build on Gno?\n\n**Jae**: “Yes, why don't we make this truly open, in the style of free software, so that we can build upon a common VM design? The only thing I want to retain control over for a temporary duration of time is the regulation of trademarks, like \"gno\", \"gno**\", \"*gno\" (but you can use the license to fork this project however you want); and we want proper attribution, but the AGPL fork license suggests how we can work together collaboratively.\n\nThe GNO VM can be used on any chain if it follows the AGPL style license, which we are calling the \"Gno GPL\". Blockchains can still be composed of components licensed with compatible open source software. We can collaborate indirectly by working and contributing to the same codebase, and know that the code we are building together will always be available for you to use for your chain, as long as it remains and is offered as GNO free software.\n\nSo anyone can build GNO smart contracts into their chain for free, according to the license we are deriving from the GNU (not GNO** AGPL license. You don't have to pay gno.land or anyone if the license is followed. Example: we will collaborate with the Cosmos Hub and Cosmos/ATOM community to offer gno DAOs to be hosted by ICS1, and help bring collaboration tools for Cosmos. So this is how gno works with Cosmos Hub assuming ICS1 is solved. As for gno.land, we can start off with an independent gno instance for the Cosmos Hub's gno shards, and later allow the IBC importing of vetted code from gno.land/*.”\n\n### Apart from Adena, are there any plans for another wallet?\n\nJae: “I think what we need are a few competing base implementations that best leverage the framework they build upon, rather react or minimal vue; and to create common core libraries along the way if reasonable. But there ought to be more than one approach for such a key component, with special care taken into consideration for security. Like, I don't agree with Keplr asking so easily for a 12/24-word mnemonic, even if the implementation is secure, it is going to become a problem. PSA btw.”\n\n### Wen mainnet?\n\n**Jae**: “Some time by Q2 next year would be good. But as policy, we can't commit to a date, because everything has to be ready first before the official launch. Our thesis is that having the DAO with sub-DAOs will allow us to reach the end result in a faster way via some form of parallelism. First, we need DAOs to assess new code, and better UX for managing something like upgrades to the Cosmos Hub. Once we have the DAO running on testx.gno.land, for some x \u003e 4, and we have checked all vital TODOs, we will know that we are ready for \"mainnet.\"\n\n_Do you have more questions for Manfred or Jae? Would you like to know more about Gno.land, Gnolang, Game of Realms, or ways to contribute to our growing ecosystem? Drop us a question on Discord and be sure to join us for our second **AMA on December 6th @4pm UTC.**_\n","2022-12-05T16:15:00Z","manfred,jae","gnoland,gnosh,gnot,permissionless,consensus,proof-of-contribution,dao,governance,ibc,democracy,freedom"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"WLks/m7YVWlut5JaY+B7qgTGMKY5S9xJva3hsViCfUMYoIxhBUfslTQrd9W970+W5gGftFBRsnbPGiWyTkanaQ=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["gor-launch","Game of Realms Is On: Win Rewards for Contributing to Gno.land","\n\nPhase one of Game of Realms, a worldwide competition to build the best Gnolang smart contracts, **is now open**. Game of Realms is a high-stakes contest with a total prize pool of **133,700 ATOM** that will see participants compete for tiered membership to co-own the Gno.land blockchain, the next-generation smart contract platform that uses the Gnolang (Gno) programming language. A series of complex technical and non-technical tasks will challenge contributors to create innovative patterns that push the chain to new limits. If you’re interested in helping build the most intuitive smart contract platform in web3—while gaining rewards for your contribution—join today by opening a [PR here](https://github.com/gnolang/gno).\n\nThe Game of Realms contest will allow participants to get a feel for the Gno.land platform while building smart contracts and applications in the ecosystem. It will take place in two stages, phase one and phase two. Phase one is about building the core infrastructure, tools, and tutorials necessary to open the gates to broader participation and will be held off-chain. Phase two, on the other hand, will take place after the successful completion of phase one and be held on-chain, where contributors will build smart contracts on the platform.\n\nIn addition to the ATOM prize pool, the best contributors will also be awarded (mostly) initial-level membership to govern the upcoming mainnet. Membership will be allocated according to the quality and extensiveness of the contribution—the higher the quality, the higher the tier, and the greater the voting rights and rewards. The top equal members will be composed of peers who have contributed the most to the ecosystem and have an understanding of its core components. Top members will also have aligned core moral values. This is essential so that members can maintain the chain together according to its Constitution (TBD** and ultimately create a sustainable ecosystem that rewards all valuable contributions.\n\n## Game of Realms - Phase One (Off-Chain)\n\nWhile we aim to encourage cross-collaboration between devs and non-techs, phase one of the contest is recommended for advanced developers who are more autonomous and can contribute with limited guidelines and support. Accounting for around one-third of the total **133,700 ATOM** prize pool, getting a headstart in phase one will allow seasoned devs to kick the tires on the Gno.land platform, contribute with limited competition, and build the tools needed to open the second phase.\n\nDuring phase one, participants will open PRs against repos from the Gnolang organization. Phase one contributors will be expected to document and share their work efficiently to enable others to use it without conflicts. Your contribution is vital to the success of the contest, the Gno.land platform, and the Cosmos ecosystem at large, especially now, with discussions to move the Cosmos Hub’s core operations on-chain by establishing a DAO system.\n\nThe first DAO to be created will be the [Decentralists DAO](https://github.com/decentralists/DAO), which will provide Cosmonauts with transparency, accountability, and decentralization. The Decentralists DAO will improve discourse, organization management, development, and conflict resolution through smart contracts, and will organize itself into a set of tightly-aligned sub-DAOs dedicated to specific topics, such as engineering and funding.\n\nSo, how does this relate to Game of Realms and what type of contributions are judges looking for? Here are some examples, in order of priority:\n\n* **Define and Implement an Evaluation DAO:** For the Game of Realms contest, a sub-DAO – the Evaluation DAO – is needed to evaluate contributions during phase two and attribute rewards accordingly. Using a DAO will allow community members to vote on the best contributions for the platform. Implementation of the Evaluation DAO is the only step that must be approved by the core team because of its key role in the competition and the future of the platform. Once the DAO is in place, all previous and further contributions will be reviewed collectively by DAO members.\n\n* **Create Tutorials to Onboard More Participants:** We need experienced devs to write or record tutorials to help more people get started during phase two of the competition (and beyond) and to help grow the Gno.land developer community. These tutorials can include topics like interacting with the chain from the CLI, step-by-step guides to creating smart contracts in Gno, tips for running a local dev environment, fast prototyping with gnodev, or they can be tutorials dedicated to certain audiences, such as developers coming from Solidity or web2. All tutorials should be added to the [awesome-gno GitHub repo](https://github.com/gnolang/awesome-gno).\n\n* **Define and Implement a Governance Contract Suite:** In this challenge, developers will be expected to define and implement a governance contract suite capable of competing with existing chains’ governance modules. If you think you can improve the governance system of Cosmos Hub, this is your chance to show us how!\n\nPhase one challenges will stay open during phase two. No competition points will be attributed during this phase as the points will be retro-funded by the DAO and awarded during phase two.\n\n## Game of Realms - Phase Two (On-Chain)\n\nPhase two of Game of Realms will onboard more people to the platform and begin as soon as sufficient materials are completed from phase one. Accounting for around two-thirds of the total 133,700 ATOM prize pool, phase two will be open to both developers and non-technicals who can follow tutorials, create smart contracts, or provide other important contributions to win rewards and scale the platform. As phase two will be held directly on-chain, contributors can submit their contributions to the DAO without publishing them on the main GitHub repo. However, we strongly encourage you to use GitHub as it’s an important resource that helps the community gain a better understanding through specific examples.\n\n_We are currently preparing the challenges for participants of phase two and are looking for your input. Let us know what type of smart contracts you would like to see (minimal or with multiple features) in our upcoming Game of Realms AMA on Tuesday, January 24 at 4 pm UTC. Note that this is a text based AMA so make sure to add your questions before or during the AMA in the #AMA-questions channel on the [Gno.land discord](https://discord.gg/S8nKUqwkPn).\n_Once we have collected your feedback and requests, we will finalize the challenge categories. You can visit the [Game of Realms repo](https://github.com/gnolang/game-of-realms) for more information._\n","2023-01-18T15:36:00Z","","gnoland,game-of-realms,launch"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"Xhegl2By4pOHbnFHXP2VMikACjFmLBJflURMv+/afc9hj+DIi2TeQxAGrzksXsmTPbrfVGU+npazphtOKFdGEA=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["gor-ama1","Gno.land Community Game of Realms AMA #1 - Recap","\n\nWith Game of Realms officially in phase one, core dev Manfred Touron jumped on Discord to answer Gno.land community questions about the ongoing high-stakes competition. From starting and end dates to participation requirements and a description of tasks, look for your answer below. If you have further questions or want to join our community, come and find us on the []Gno.land Discord](https://discord.com/channels/957002220384182312/1065646963825066044). The core team will be hosting regular “office hours” sessions soon so you can discuss your ideas with them directly.\n\n## Q. How are the tasks in the issues assigned?\n\nWe received questions about how the tasks in the Game of Realms issues are assigned. Should submissions contain the whole implementation? Is the following task \"available** when the previous one is completed? How is the “sync” happening?\n\n**A.** TL;DR:\n\nEverything should go smoothly and we will be leaving room for negotiation if any review looks invalid. Once it has been established, the evaluation DAO will enforce how to submit a contribution. In the meantime, there are official communication challenges that we encourage participants to use. People are also free to work in stealth mode, with the risk of finishing too late or losing points for being bad at collaborating.\n\n----\n\nWe expect the current issues to be done by multiple people, in multiple steps. But anyone can try to make everything in stealth mode and open a PR with everything. Let's discuss the cases we believe will happen:\n\n### Case 1\n\nWe're in phase 1, people want to contribute but can't manage to do everything, so they will try to participate as much as they can. They will participate on the issue or in Discord by indicating their desire to participate, by sharing ideas, reviewing others' work, giving feedback, clarifying, or whatever makes sense.\n\nThe only thing is that we're fully remote. We don't know each other, so everyone needs to be good at communication. At the end of a big task, i.e. the Evaluation DAO is finished, the core team will take all the small contributions and identify contributors, and then suggest how to split the task prize. We'll propose the split and allow room for public negotiations.\n\n### Case 2\n\nWe're in phase 2, and a small contribution is done by an individual. We just review it, and that's done.\n\n### Case 3\n\nWe're in phase 2, and a contribution is big and requires small steps. Probably, the Evaluation DAO will ask individual participants to submit their contributions so they can allocate points for the individual contributions. But maybe the Evaluation DAO prefers to review big tasks as a whole, and then split the prize, as we'll do in phase 1. We don’t have clarity on this at this stage, as it will be up to the implementers of the Evaluation DAO to design the best system for that case.\n\n## Q. Will there be a leaderboard and place where we can submit evidence for tasks?\n\n**A.** Not yet. The leaderboard will come in phase 2. One of the critical parts of the Evaluation DAO will be to allow contributors to submit evidence for tasks. Votes and point allocations will also be transparent. This will make sense for future Proof-of-Contributions, too. We'll also develop a leaderboard to make it easier to follow the competition, but this will probably come after the Evaluation DAO is running.\n\n## Q. What will the overall tasks consist of?\n\n**A.** Here is a non-exhaustive list:\n\n* Onboard more contributors ([create tutorials and documentation](https://github.com/gnolang/gno/issues/408)\n* Improve the project and implement more things\n* Bootstrap our genesis of contributors for the future mainnet\n* Experiment with Proof of Contribution by having a simpler system: Evaluation DAO\n* Identify the best participants to propose jobs\n* Identify the best organizations to propose partnerships\n\n## Q. At what point in the Game of Realms timeline/phase are we?\n\n**A.** We are at the beginning of phase 1. We plan to create a website soon so you can keep track of the status and, as I mentioned, a leaderboard will come in phase 2.\n\n## Q. What will be the contributions, how will points be calculated, and are there tasks for non-programmers?\n\n**A.** During phase 1, the tasks are relatively well defined, please read this:\n\nhttps://github.com/gnolang/gno/issues/390\n\nThere are more tasks for programmers, but multiple parts are for non-programmers too.\n\nDuring phase 2, it's hard to be sure about anything yet. Game of Realms is a competition to experiment with Proof-of-Contribution, which will replace Proof-of-Stake on Gno.land. If things go the way we imagine, then consider that the stakeholders (contributors** will allocate points to contributions that make sense for the project. The contributors won't lose points, but by allocating points, they will dilute their own point stack.\n\nWe expect the Evaluation DAO to attribute points to whatever makes sense to make the project better. We'll have some task ideas for phase 2, including for non-programmers. You can likely consider that even if the core team doesn’t control the DAO, its suggestions will be approved by the Evaluation DAO because we deeply want the project to be a success.\n\n## Q. What are the requirements to start participating?\n\n**A.** There is no requirement to start participating. You’ll need to do some KYC at the end of the competition to receive a prize. Feel free to fill out the form linked in the Register section of the following issue:\n\nhttps://github.com/gnolang/gno/issues/390\n\nThis will allow us to contact you about the competition through our newsletter and set up prize payment later. Use the comment section of the issues or discuss them on Discord if you plan to work on specific tasks, so we can see that you’re actively working on a topic. It may be better to work with others and share a prize instead of taking the risk of implementing everything in stealth mode and not being the first.\n\n## Q. Is there a fixed period of time for the end?\n\n**A.** No. Phase 1 will be finished when we consider that enough materials have been implemented to switch to phase 2. This will probably take between 1-3 months. The end date for phase 2 will be announced during phase 2, which will probably last between 2-3 months. This is when we’ll send the prize rewards. After Game of Realms, people will continue to earn contribution points by contributing to the project, which will give them memberships on the future mainnet.\n\n## Q. Is it possible to install a local testnet to get a proper local development environment?\n\n**A.** You can find the answer in this GitHub issue. Subscribe to the issue to get updates:\n\nhttps://github.com/gnolang/gno/issues/478\n\nThere are multiple ways to interact with Gno:\n\n* Using gnodev allows you to use the GnoVM, without a blockchain. This method is super fast and allows you to use development patterns like TDD, where you test your implementation multiple times per minute.\n* Running a localnet, by running the gnoland command and then configuring our tools like gnokey to use localhost:36657\n* Using the staging network hosted on https://staging.gno.land reset regularly and you can use the hardcoded test key or use the faucet\n* Using the official testnets\n\nIf you prefer to run a full blockchain node instead of just playing with GnoVM, you should play with the gnoland binary. This video shows how to do this in practice:\nhttps://www.youtube.com/watch?v=-BlnEXCs0eI\n\nBelow is a further resource that may also help you:\n\nhttps://test2.gno.land/r/boards:testboard/5\n\n## Q. Will there be a list of what needs to be tested? When will the tests start?\n\n**A.** The best place to look is on GitHub here:\n\nhttps://github.com/gnolang/gno/issues/390\n\nDuring phase 1, there are 3 official focuses:\n\n- Evaluation DAO\n- Tutorials\n- Governance Module\n\nThe core team will actively review this and decide what contribution deserves to get prizes.\n\nDuring phase 2, we’ll use the Evaluation DAO developed during phase 1 to review old contributions, even contributions made before the competition, as well as ongoing contributions. Right now, we have an issue gathering interesting topics for phase 2 here, but any contribution can be reviewed by the DAO, including things that are not listed:\n\nhttps://github.com/gnolang/gno/issues/357\n\nThe competition was just announced, but we’ll review contributions made in the past, too, so it starts from the first commit, ~1-2y ago.\n\n_Do you have more questions for Manfred? Would you like to know more about Gno.land, Gnolang, Game of Realms, or ways to contribute to our growing ecosystem? Drop us a question on Discord and watch out for our next AMA on Tuesday 7 Feb at 4 pm UTC._\n","2023-02-03T15:44:00Z","manfred","game-of-realms,gnoland,proof-of-contribution,dao,governance"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"T3QYfWeAyiriBD0PmQnolmVX1MpPkNxqEV9OO5ep8vI4tQWGEWtRuOG1ZO48a9T+d9pX1pl4Fkq+6Ogjx3wQLA=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["gor-phase1","All You Need to Know About Game of Realms: Phase One","\n\nGame of Realms, the worldwide competition to find the best contributors to Gno.land, is currently underway. Unlike some contests you may have entered, we're doing things a little differently. We want participants to be instrumental in building the Gno.land platform with meaningful contributions that help shape the direction of the project – either by writing the best Gnolang smart contracts or contributing to the core blockchain. It’s not just about winning prizes but becoming a meaningful contributor. We encourage participants to collaborate on the challenges – your contribution will be rewarded on individual merit.\n\n## Phase One: The Basics\n\nPhase one of Game of Realms is about laying the foundations to onboard more people to the platform. You’ll need to be an advanced developer who wants to create core materials that power the platform every day. You should also be willing to document your work and even write tutorials and guides that help us advance to the second phase of the competition.\n\nThere is a total prize pool of 133,700 ATOM available during the Game of Realms competition, one-third of which (44,121 ATOM) will be allocated to contributions from phase one. During phase one, which we expect to last between 1-3 months, participants will open PRs against repos from the Gnolang organization. For additional information on the competition phases and timelines, be sure to check out the following resources:\n\n- [Game of Realms blog post](https://test3.gno.land/r/gnoland/blog:p/gor-launch)\n- [Game of Realms AMA recap](https://test3.gno.land/r/gnoland/blog:p/gor-ama1)\n\n## Phase One: The Challenges\n\n**Evaluation DAO**: To ensure contributions in Game of Realms are rewarded fairly, we need an Evaluation DAO. Allowing community members to vote on the best contributions and decide how much they are worth provides a level playing field for all. We’re therefore seeking your skills in DAO development and implementation. This is one of the most important challenges of phase one and the only challenge that must be approved unilaterally by the core team because of its key role in the competition and the future of the platform. Read more about the [Evaluation DAO challenge on GitHub here](https://github.com/gnolang/gno/issues/407).\n\n**Tutorials \u0026 Documentation**: So that we can progress to phase two and open up the Gno.land platform to a broader audience, we need written and recorded tutorials, guides, and documentation from phase one participants. There are almost no instruction manuals when it comes to this new frontier as the only smart contract platform using the Gnolang programming language. Help us to create materials that will onboard more contributors to Gno.land. Read more about the [Tutorials \u0026 Documentation challenge on GitHub here](https://github.com/gnolang/gno/issues/408).\n\n**Governance Module**: We want Gno.land to adopt the fairest and most effective governance solution possible; one that encourages voter participation and is transparent and accountable. We’re looking for contributors to define and implement a governance contract suite that rivals existing ones, such as the Cosmos Hub, and be implemented by other projects. Can you improve on that? Show us how! Read more about the [Governance Module challenge on GitHub Here](https://github.com/gnolang/gno/issues/409).\n\nAll phase one challenges will stay open during phase two. No competition points will be attributed during this phase as the points will be retro-funded by the Evaluation DAO and awarded during phase two.\n\n## Judging Criteria - What Wins Points?\n\nWhat will the judges be looking for when assessing contributions? You can find individual details on the corresponding GitHub issue regarding each challenge, but to get you started, the Game of Realms contest prioritizes communication and collaboration. We encourage participants to work together to find the best solutions. You will be awarded individually for your contribution but working as part of a team is highly valued. Good documentation that expresses high learning efficiency and shows how the task was completed in an educational way will also win additional points, as will a high standard of quality, great UX, and the ability to follow the contribution guidelines.\n\nAs this is primarily a developer-oriented competition, most of the organization for Game of Realms is happening on GitHub; come by the repo and [visit issue #408](https://github.com/gnolang/gno/issues/408) to contribute to tutorial and documentation writing for Gno.land.\n\n## Rules of Engagement\n\nAll participants must keep in mind a strict code of conduct and specific rules and criteria to ensure fair play. Throughout the Game of Realms competition, no plagiarism will be tolerated at any time. Participants may submit what they wish, however, any project that has already been allocated rewards or received compensation in any other hackathon or similar contest will not receive double pay.\n\nThat’s all for now. If you have more questions about Game of Realms or Gno.land you can join us in our next Office Hours session on Tuesday, March 14, 2023, at 4 pm UTC. You can also connect with other participants in the [Gnoland Discord](https://discord.com/invite/S8nKUqwkPn).\n\n## Game of Realms Phase 1: FAQ\n\nBelow are some frequently asked questions about phase one of the Game of Realms competition. If you can’t find your answer below, jump into our Discord and ask, or join us for a live “Office Hours” session with the core team.\n\n### Q. How are the tasks in the issues assigned?\n\nA. There are official communication challenges that we encourage participants to use.\n\n### Q. Can I work individually or should I work as part of a team?\n\nA. You are free to work in stealth mode, but please keep in mind that you risk finishing too late or losing points for being bad at collaborating. We expect the issues in phase 1 to be done by multiple people, in multiple steps. But anyone can try to make everything in stealth mode and open a PR with everything.\n\n### Q. How can I find collaborators?\n\nA. Participate on the issue or in Discord by indicating your desire to participate, by sharing your ideas, reviewing others' work, giving feedback, clarifying, or whatever makes sense.\n\n### Q. How can I ensure good collaboration?\n\nA. Since we are fully remote, collaborating can be a challenge and the best collaborators will be rewarded. We don't know each other, so having good communication is key.\n\n### Q. How will my collaboration be evaluated?\n\nA. At the end of a big task, i.e. the Evaluation DAO is finished, the core team will take all the small contributions and identify contributors, and then suggest how to split the task prize. We'll propose the split and allow room for public negotiations.\n\n### Q. How much is the prize pool?\n\nA. There is a total prize pool of **133,700 ATOM** available during the Game of Realms competition, one-third of which (**44,121 ATOM**) will be allocated to contributions from phase one.\n\n### Q. When will I receive my rewards for my collaboration?\n\nA. Rewards will be allocated retroactively by the Evaluation DAO during phase 2.\n\n### Q. Will there be a leaderboard and place where we can submit evidence for tasks?\n\nA. Not yet. The leaderboard will come in phase 2.\n\n### Q. What will the overall tasks consist of?\n\nA. Here is a non-exhaustive list:\n\n* Onboard more contributors (create tutorials and documentation)\n* Improve the project and implement more things\n* Bootstrap our genesis of contributors for the future mainnet\n* Experiment with Proof of Contribution by having a simpler system: Evaluation DAO\n* Identify the best participants to propose jobs\n* Identify the best organizations to propose partnerships\n\n### Q. Are there tasks for non-programmers?\n\nA. There are more tasks for programmers, but multiple parts are for non-programmers too. During phase 1, the tasks are relatively well defined, please read this:\n\nhttps://github.com/gnolang/gno/issues/390\nhttps://github.com/gnolang/gno/issues/540\n\n### Q. What are the requirements to start participating?\n\nA. There is no requirement to start participating. You’ll need to do some KYC at the end of the competition to receive a prize. Feel free to fill out the form linked in the Register section of the following issue:\n\nhttps://github.com/gnolang/gno/issues/390\n\nThis will allow us to contact you about the competition through our newsletter and set up prize payment later. Use the comment section of the issues or discuss them on Discord if you plan to work on specific tasks, so we can see that you’re actively working on a topic.\n\n### Q. Is there a fixed period of time for phase 1?\n\nA. No. Phase 1 will be finished when we consider that enough materials have been implemented to switch to phase 2.\n\n### Q. Is it possible to install a local testnet to get a proper local development environment?\n\nA. You can find the answer in this GitHub issue. Subscribe to the issue to get updates:\n\nhttps://github.com/gnolang/gno/issues/478\n\n### Q. Will there be a list of what needs to be tested? When will the tests start?\n\nA. The best place to look is on GitHub here:\n\nhttps://github.com/gnolang/gno/issues/390\n\nDuring phase 1, there are 3 official focuses:\n\n* Evaluation DAO\n* Tutorials\n* Governance Module\n\nThe competition was just announced, but we’ll review contributions made in the past, too, so it starts from the first commit, ~1-2 years ago.\n","2023-03-12T14:02:00Z","","gnoland,game-of-realms,faq"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-1","The More You Gno: Gno.land Monthly Updates","\n\nWe made progress across the board at Gno.land last month, from onboarding more devs to receiving an influx of contributions to the Game of Realms contest. To encourage development and discourse, we set up a biweekly public developer call in addition to our biweekly Office Hours sessions. Anyone can join, ask questions, and give their suggestions on how to shape the Gno.land platform and become a contributor. Last month, we covered several pressing topics from Gno IDE and Gno.land website language, to GnoVM, IBC, and ICS. Jae also came back to the circuit in March with two IRL workshops for devs at side events during EthDenver and Game Developer Conference (GDC) in San Francisco.\n\n## Developer Updates\n\nYou can find the live streams of the new biweekly public developer calls on [Gno.land YouTube](https://www.youtube.com/@_gnoland/videos) as well as access the agendas on [GitHub](https://github.com/gnolang/meetings/blob/main/notes/2023_03_15_dev_call_notes.md). The main talking points this month were Gno IDE, Gno.land website language and UX, garbage collection, bug fixes, and how to bring IBC and ICS to the platform. We are working on all these issues concurrently but the order of release will be Gno.land mainnet, IBC, and then ICS (this is reflected in the DAG below).\n\n[![Gno.land mini DAG](https://gnolang.github.io/blog/2023-04-15_myg-march/src/thumbs/mini-dag.png)](https://gnolang.github.io/blog/2023-04-15_myg-march/src/mini-dag.png)\n\n## Gno.land Website Language\n\nWe want to add more features for developers, such as libraries to make writing interfaces better and more consistent. There is an open topic for frontend developers with typography skills and library developers to create a UI framework for markdown or a custom rendering system.\n\nInternally, our core team is working on improvements to Gno.land’s website, making it easier to navigate with shorter columns while ensuring the text is markdown centric and readable in plain text and the GitHub rendering machine. We hope to achieve this using CSS and having classes for vertical columns, without having to make an extension to the markdown parser.\n\n## Gno IDE\n\nGno.land developer experience team is working on a web-based Gno IDE for quickly building Gno realms and packages right on your browser by just visiting a web app. Gno IDE will provide much improved UX for everything around building a realm (including making the testing easier), and additional features like autocompletion in the editor. Gno IDE will contain all the features you would expect from an IDE as well as valuable APIs for devs building tools around Gno.land with the public Gno Infrastructure.\n\n[![Gno IDE](https://gnolang.github.io/blog/2023-04-15_myg-march/src/thumbs/gno-ide.png)](https://gnolang.github.io/blog/2023-04-15_myg-march/src/gno-ide.png)\n\nGno IDE will have multiple modes to support different use cases. The normal mode will be used during everyday developments (as you’re familiar with from other code editors). The presentation mode is for high accessibility and readability. You can use it during video calls or physical workshops while projecting your screen to an audience. The third and perhaps most interesting mode is the embedded mode. Use this mode to embed the IDE into websites and blogs. This feature is especially useful for tutorials to test out sample code, run it on the real testnets, and play with it.\n\n## IBC and ICS\n\nAs depicted in the DAG above, Gno.land mainnet will launch first, followed by IBC and then ICS. We will focus on implementing IBC1, as we strongly believe in the ICS model and want to be a consumer of an existing Cosmos chain. We want a common ICS implementation that works across many hubs because Gno.land is a type of hub that will need its own ICS to scale while providing GnoVM on consumer chains on the Cosmos Hub. Our next step now is to find the best way to configure ICS for Gno.land and make GnoVM available as a consumer chain in the Cosmos Hub system.\n\nRegarding IBC, we will use the current implementation that was written for the Cosmos SDK and port that over to Tendermint2. We anticipate some issues along the way including security patches that need to be applied to our code base. There are multiple ongoing directions and discussions about how to bridge Gno.land’s smart contracts to IBC, which are essentially Interchain smart contract interactions.\n\nOne possibility is to have an API that submits events to a queue of outgoing events, and another queue to receive and consume events asynchronously. This mechanism could work for IBC2 to have rich inter-contract Interchain features, and the same API could work for Interchain plus smart contract interactions that require advanced options. We discussed a proposal to create a standard for Interchain contracts so that IBC2 could eventually be standardized eliminating limitations by applying it with an EVM, other languages, and CosmWasm.\n\nThis protocol could be based on Protobuf or a similar well-known syntax definition protocol so that we can push the Interchain to the next level. IBC2 will be safe and fast and replace vulnerable atomic bridges between multiple technologies. This is a major update that we are committed to developing and we need help identifying all the challenges involved. Working on IBC integration, separate from the Gno.land mainnet launch, will require significant time to understand how the light client system works. If you’re interested in taking on this task, let us know and we’ll set up a group. IBC will likely be the most important challenge of Game of Realms phase 2.\n\n## Garbage Collection\n\nCurrently, our work on garbage collection does not address the problem in the traditional Golang sense of dealing with memory efficiency. Instead, we are progressively optimizing and improving the main state tree by automating the clean-up of orphan nodes. The next phase will be targeting the official garbage collector component to begin work on memory management as we have some common Golang garbage collection challenges, but are identifying some uncommon ones too.\n\nWe need to consider elements like where to hold our objects because this is tied to releasing them in a concurrent lock-free way. We also need a good data structure. This is ongoing research as of now to implement a dedicated routine to synchronously clean stuff in a non-blocking way.\n\n## Game of Realms\n\nThis month, we have seen a massive uptick in contributions to Game of Realms phase one with a tidal wave of issues, general discussions, and PRs. One of the biggest things we worked on was adding support for MOD, which is a version of Go mod with an easier interface to manage your dependencies and version your dependencies. You can track the ongoing issue on GitHub [here](https://github.com/gnolang/gno/issues/390).\n\nThere have been some really strong contributions to the Evaluation DAO and governance module, as well as a big CLI refactor that went into our code base. We've also seen people contribute contracts like GRC 1155 or general improvements to existing realms, with many suggestions for fixing bugs. Finding bugs and reporting what people want is a good indication that the Gno.land platform is being picked up and gaining adoption.\n\nYou can find the Office Hours recordings that cover Game of Realms on YouTube [here](https://www.youtube.com/watch?v=JTmNg-b6Lcs).\n\n## Developer Events Stateside\n\nGno.land hosted a lively meetup during EthDenver last month where Gno.land founder and core dev Jae Kwon gave a talk for Solidity developers called “Gno.land, the Inevitable Next Generation Smart Contract Platform.\" He compared and contrasted Gno.land and Gnolang to Solidity, and showed Ethereum developers how the GnoVM shifts the smart contract paradigm. You can watch the [recording here](https://www.youtube.com/watch?v=IJ0xel8lr4c).\n\nAlso in March, Jae hosted a gaming workshop at a side event during the infamous Gaming Developer Conference (GDC) in San Francisco. “Gno.land for Game Developers, Building Your App in Web3,\" showed participants a sample gaming app built on the Gno.land platform and offered them the chance to try their hand at writing a smart contract for their app with Gno.\n\n## Virtual Events - How to Build a Forum\n\nCore tech lead at Gno.land Miloš Živković held a virtual workshop for Go devs called “How to Build a Forum.” He showed how Gnolang is a fast and simple way to build and launch smart contracts using the Gnolang interpreter virtual machine that interprets Gno and eliminates the need for any servers or ORNs.\n\nThe VM allows for the memory state of your Gno.land application to persist automatically after every transactional function call, which is a completely new way to handle transaction volume and memory recall. You can watch the [full tutorial here](https://github.com/gnolang/workshops).\n\n*We’d like the community to get involved in Gno.land’s monthly updates, so if you’re building on Gno.land and want to highlight your development, project, event, or idea, let us know and we’ll include your contribution.*\n","2023-04-15T13:37:00Z","christina","gnoland,gnovm,tm2"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-2","The More You Gno: Gno.land Monthly Updates - 2","\n\nOver the past few weeks, our core devs and ecosystem contributors have been making massive strides on Gno.land. There’s a lot to cover in the second edition of *The More You Gno*, from updates on Tendermint2 and GnoVM to stack/frames management, Gno IDE, and plenty more. We’ll also see what some of the external teams contributing to the platform have been up to, including Gno.land’s first decentralized exchange, GnoSwap, and Adena compatibility with GRC20 tokens. Check it out.\n\n## Tendermint2\n\nWe’re making steady development progress on Tendermint2, which focuses on simplicity of design, minimal code, minimal dependencies, modular dependencies, and completeness. For the time being, Tendermint2 will stay in the main repo in a top-level folder named Tendermint2. This is the official location to develop and improve the consensus protocol until it is stable enough to be extracted from the Gno repo and become a standalone project. Currently, Tendermint2 depends on GnoVM, however, we are working to unlink this dependency and build a basic demo Tendermint2 chain and Client.\n\nTendermint2 JS/TS Client is a JavaScript/TypeScript client implementation for Tendermint2-based chains. The client will make it easier for developers to interact with Tendermint2 chains, with a simplified API for account and transaction management, removing a ton of manual work and allowing developers to focus on building their dApps. You can [read more about the client here](https://www.npmjs.com/package/@gnolang/tm2-js-client). In addition to the Tendermint2 JS/TS client, we also created a Gno JS/TS client that just extends the TM2 one to provide Gno-specific functionality. You can read more about this here.\n\n## Game of Realms\n\nThe incentivized competition to find the best contributors to Gno.land continues in phase one, with slow but steady progress being made. Nir1218 initiated an Evaluation DAO Kickoff discussion in [issue 792](https://github.com/gnolang/gno/pull/792) to initiate testing code for the key smart contract infrastructure that will power the Gno.land platform. We are also interviewing architects for the core team with experience in governance modules and creating new economies on-chain, and a new DevRel team member will be joining us soon to create awesome tutorials and documentation to advance Game of Realms further. Gno.land must be built by the community and we will not rush to push Game of Realms to the second phase until we have found quality contributors to complete the challenge tasks and become the platform’s first founding members.\n\n## Gno IDE\n\nOur core development team is working on a web-based IDE for Gno.land that will greatly improve the developer experience, allowing builders to quickly spin up Gno realms and packages right on their browsers just by visiting a web app. Currently named Gno IDE but with a rebranding on the horizon, this intuitive product focuses on ease of use and improved UX, and will include all the features you’d expect from an IDE, such as auto compilation in the editor, debugging, extensive testing capability, and powerful APIs like IntelliJ to supercharge your programming.\n\nGno IDE currently has multiple modes to support different use cases, including a normal mode for everyday programming, similar to a standard code editor, a presentation mode for video calls or screen sharing, and an embedded mode to extend functionality, allowing you to embed the IDE directly into websites and blogs. You can also choose to edit your code in Emacs or Vim and easily switch between steps, from previous to next, making creating your tutorials and blog posts more intuitive. Watch out for more to come on Gno IDE soon, and if you want to contribute by creating a plugin for your favorite editor, open a PR to win contribution points.\n\n## Stack/Frames Management\n\nThe stack/frames is an integral part of the virtual machine (VM) and the language. Stack/frames provide context for smart contract developers, enabling them to access useful information, such as the original caller, or to determine if a contract is being called through another one. The current implementation is limited in scope and relies on fixed positions in the stack which can lead to inconsistencies.\n\nThere is an ongoing [issue 683 open here](https://github.com/gnolang/gno/issues/683) and we have continued to work on enhancing stack/frames development over the last month. We’re adding a new function in the standard library std.PrevRealm (previously GetRealmCaller). Currently, we only have GetOrigCaller, which returns the user calling the first realm. This is not secure and we need a way to call the previous caller. This will allow a realm to handle GRC20 treasuries. See [issue 667](https://github.com/gnolang/gno/pull/667) and [issue 634](https://github.com/gnolang/gno/issues/634) for further details.\n\n## Dealing with Panics in Native Functions\n\nWe have devised a solution for dealing with panics in native functions, [see pull request 732](https://github.com/gnolang/gno/pull/732). Previously, when there was a panic in a native function, we could not recover it in Gno code. An example of this was the assert origin call, which panicked if the call was not a direct call from a transaction. Based on discussions with contributors, we’ve agreed that native functions should never panic, but if they panic, they panic with machined Gno panic. This gives us the choice in a native function to code a Gno panic, or, if it's a very bad panic, use Go panic so that we know the Gno code is unable to recover it.\n\n## Logic Upgrading\n\nMaking it possible to upgrade your logic is definitely out of scope for the first version of Gno.land, however, it’s an important issue that we have begun to discuss so that we can place certain restrictions on it, such as allowing upgrades when we consider them safe enough to be compatible with imports. Another idea is to work on creating workflows where migrations become something official. This way, we could define ways to migrate a contract completely in a single transaction at the chain level. Once everything is working and approved as the previous contract is parsed or archived, the new one gets the data. We will revisit this topic after the first version of Gno.land reaches the mainnet.\n\n## Garbage Collection\n\nIn terms of garbage collection, we don’t have memory leaks as such but we do have defacto memory leaks. By the VM having references to all objects, they won’t be released by Go’s underlying GC. We have some form of reference counting but it is only done at the end of a transaction. We have implemented a mark-and-sweep garbage collector and are working on the VM runtime to manage the objects and signal to the garbage collector to release them when they are no longer needed. This is done by adding the notion of a heap, which is managed by the garbage collector.\n\n## GnoVM\n\nDeveloping GnoVM is an ongoing task and we will likely need to fork the GnoVM to create different competing versions. GnoVM will be complete, limited in features, and serve as the only interpreter, an enduring reference point over time. Future versions of GnoVM will be designed to incorporate CosmWasm so that all Cosmos chains can have CosmWasm enabled and the VM can run directly on the browser and execute tasks on the browser without requiring to make an API call, making it faster. To do this, we can make a Gno compiler in WebAssembly without changing the code because Go supports WASM cross-compilation.\n\nWe plan on making a competing version of the original minimalist GnoVM, such as a Rust version with a JIT compiler using LLVM as a backend.\n\n## Ecosystem Updates\n\nSince our last update, the Gno.land community continues to expand with awesome teams and contributors building cool infrastructure and projects on the platform. Below, we take a look at the largest developments of the past few weeks and extend a special thanks to everyone helping us build Gno.land.\n\n## Teritori\n\nTeritori blockchain and multi-chain hub launched in November 2022, allowing IBC and non-IBC communities to connect, create groups, exchange tokens and NFTs, and launch new projects. Teritori’s idea for building on Gno.land is to create a multi-chain experience for users with a web portal, NFT marketplace, and social feed that will grow the community, and gradually integrate smart contracts and realms. This will promote Gno.land to more developers and showcase all the dApps being built through an easy-to-navigate dApp store. In the coming weeks, Teritori will work with the Onbloc team to integrate the Athena wallet into their portal as well as discuss ideas for promoting Game of Realms to new developers.\n\n## Onbloc\n\nOnbloc is one of the Gno.land ecosystem’s most active contributors, responsible for building the Adena wallet and the block explorer Gnoscan. The team has also been working on creating an official Gno SDK that will allow developers to interact with Gno.land more easily, and remove some of the current friction. Onbloc opened [issue 701](https://github.com/gnolang/gno/issues/701) on GitHub primarily for developers who either have their own web app or are building a JavaScript app and want to work with Gno in some way. Currently, developers need to do a lot of manual work, which Gno SDK will abstract away, improving the workflow and developer experience. If you have any ideas or feedback, please contribute to the aforementioned issue.\n\nIn another cool development, Onbloc has rolled out a new feature in Adena and Gnoscan to provide support for GRC20 tokens. To store and send tokens, you can open your Adena wallet, click on \"Manage Tokens”, navigate to the Custom Token page, and see which GRC20 tokens are available on Gno Testnet 3, searching by the symbol or path. To research on or discover tokens, head over to the Tokens page on Gnoscan for a full list of GRC20 tokens. You can click on any token on the list for detailed information, such as the total supply, owner, or other available functions built into the token. The Account Details page has also been updated to display all tokens owned by each address. You can help by checking out [issue 764](https://github.com/gnolang/gno/pull/764), which discusses adding bigint to support a wide range of numbers and encoding binary, and [issue 816](https://github.com/gnolang/gno/pull/816), which highlights a small bug the team runs into when coding.\n\nOnbloc has also created a new [token resource page on GitHub](http://github.com/onbloc/gnotokenresources) for anyone to share or upload resources associated with their Gno.land project. This will serve as a shared knowledge pool about any dApp on the platform. If you wanted to create a decentralized exchange, for example, you would need all the information about the tokens available on Gno.land, such as their images, symbols, descriptions, links to websites, etc. Now you can find this in one handy GitHub repository. If you’re a developer or builder who wants your logo or any other static data posted, be sure to submit a PR.\n\nAnd speaking of decentralized exchanges, Onbloc is also building Gnoswap, the first DEX to be powered by Gno.land, designed to simplify the concentrated liquidity experience and increase capital efficiency for traders. Its interface is built using TypeScript to be user-friendly, secure, and accessible for streamlining complex mechanisms such as price range configurations and staking as part of its core service. Contribute to its interface [here](https://github.com/gnoswap-labs/gnoswap-interface).\n\nAs for the contract side, Onbloc is actively working on its development with help from the core members of Gno.land. The code will be open-sourced for full transparency once the basic functions are ready.\n\n## New Core Contributors\n\nWe’re excited to welcome two new core team members, Antonio and Zack. Antonio joined us in April in the core team, bringing with him vast experience in IPFS, and writing Git servers in Go. Zack is our first “tinkerer in residence” and will try to bootstrap the ecosystem of small contracts and small libraries. He will also be writing apps and helping us design a system to better share and showcase our work with a super UX for team builders and open-source addicts.\n\nAntonio is already hard at work researching a benchmarking dashboard that will show performance improvements or regressions when we change the code. He’s assessing whether to use GiHub to track actions or run our own machine to execute GitHub actions. Take a peek at his research so far on [issue 783 here](https://github.com/gnolang/gno/pull/783).\n\nZack is working on a microblog project. As an experienced web2 Go programmer, Zack is transitioning to web3. Since he’s interested in incentivized social networks, the microblog project will be his first realm, as a Twitter-style blog without titles, where each user has their own page based on their address. Check out [issue 391](https://github.com/gnolang/gno/pull/391) for more details.\n\n## Developer Events\n\nOver the past few weeks, our core devs have been mainly focused on building but they’re preparing to speak at some exciting events in the coming months. Catch up with Manfred at BUIDL Asia, in Seoul, South Korea, from June 5 - 9. We’re co-hosting a side event with Onbloc, Code States, and Cosmostation on June 5, so be sure to register if you’re in town! We’ll also be at EthBelgrade in Serbia from June 2 - 4, and GopherCon in Berlin from June 26 - 29, so stop by and say hello.\n\n*Do you want to contribute to Gno.land’s monthly updates? If you’re building on Gno.land and want to highlight your development, project, event, or idea, let us know and we’ll include your contribution.*\n","2023-05-26T13:37:00Z","christina","gnoland,gnovm,tm2"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["funding-program","Announcing the Gno.land Funding and Grants Program","\n\nIf you’re interested in building in Gno.land and using the Gnolang (Gno) language to make a meaningful contribution, we’ve launched the Gno.land Funding and Grants Program to support you on your journey. If you’re a developer, tinkerer, researcher, or educator and you’re excited by the idea of creating innovative dApps, tooling, infrastructure, products, or smart contract libraries on Gno.land, now you can apply for funding.\n\n## About the Gnoland Funding and Grants Program\n\nWe’re building Gno.land to endure with timeless code that will serve as a reference point for many years to come. Secured by a novel consensus mechanism, Proof of Contribution, Gno.land rewards contributors fairly, addressing one of the blockchain industry’s biggest problems. The developers that are most active on the platform with the highest quality contributions will secure the most rewards. We already have a growing community of Gnomes innovating and building on Gno.land and we’re looking to add more contributors to extend the usability of the platform and its smart contract library.\n\nOur grants program will encourage further participation by allocating financial awards and contributions to individuals and teams who want to build dApps, core infrastructure, products, or features on Gno.land, incentivizing more like-minded Gnomes to test the Proof of Contribution mechanism and push the chain to new limits. The grant amount and duration will depend on the scope and ambition of the project as well as the work involved.\n\n## Types of Contributors\n\nThe Gno.land Funding and Grants program is divided into four different categories – tinkerer, builder, researcher, and educator – to ensure that we cater to a diverse range of people and working preferences. Here’s how we define these categories:\n\n- Tinkerer: You want to experiment and invent\n - Build dApps, improve features, and find and develop new ideas\n- Builder: You have an idea and are ready to build it\n - Build dApps, infrastructure, tooling, products, or port your existing apps to Gno\n- Researcher: You want to discover and analyze\n - Deep dive into topics linked to the Gno.land universe\n\n## What We Are Looking For\n\nTo qualify for a Gno.land grant, we’re looking for motivated and passionate people who can contribute by developing dApps, core infrastructure, useful and innovative products, or features that improve the usability of the Gno.land chain, specifically:\n\n- Decentralized Applications (dApps)\n - What types of dApps do you want to see on Gno.land? Show us.\n - Build, test, and launch a suite of Gno.land dApps for the community, focusing on diverse use cases and industries such as DeFi, gaming, supply chain management, and social media. Ensure that these apps cater to both individual users and businesses\n - These dApps should integrate seamlessly with existing Gno.land infrastructure, encourage user interaction, and promote the adoption of Gno.land services\n- Infrastructure, DevX, Quality\n - Develop comprehensive GitHub and AWS integration for Gno.land, including streamlined deployment processes, continuous integration and delivery pipelines, and monitoring tools\n - Create Helm charts for easy deployment and management of Gno clusters, enabling users to quickly set up and scale their Gno infrastructure\n - Design and implement an event system for Gno.land contracts, allowing for real-time monitoring, analysis, and auditing of contract-related events\n - Enhance Gno.land security by conducting regular vulnerability assessments, penetration testing, and implementing best practices for secure smart contract development\n- Products\n - Develop advanced project management software tailored to the needs of Gno.land developers and teams, with features such as task tracking, collaboration tools, and integrated Gno.land services\n - Create comprehensive documentation, including guides, tutorials, and API references, to help users understand and utilize Gno.land's features and services more effectively\n - Design a censorship-resistant smart contract system, enabling secure and transparent transactions and interactions on the Gno.land platform, free from external interference\n- Interoperability \u0026 Integration\n - Implement cross-chain compatibility and interoperability, allowing Gno.land to connect and interact with other blockchain networks, expanding its potential user base and increasing its overall reach\n - Develop a powerful integrated development environment (IDE) specifically for Gno.land developers, with features like code completion, debugging tools, and seamless integration with Gno.land services\n - Design and launch a user-friendly wallet for Gno tokens, featuring a secure and intuitive interface, support for multiple devices, and easy integration with Gno.land dApps\n\nThe above guidelines are by no means exhaustive and are intended to spark your imagination and give examples of the types of contributions we’re looking for in Gno.land. We’re open-minded and willing to assess all grant proposals, so if you have an idea that’s not on the list or a suggestion that you think will benefit our vibrant community, let us know. If your submission doesn’t qualify for a grant, we’ll do our best to provide you with open and honest feedback and points for improvement, as well as identify any opportunities to get involved in our ongoing incentivized Game of Realms competition.\n\n## Meet Our First Grantees\n\n### Onbloc\n\nOnbloc is a blockchain software company building core infrastructure for Gno.land and\n\nhelping other dApp developers onboard to the Gno.land ecosystem seamlessly. The team has developed the Gno.land Developer Portal, which provides comprehensive introductory docs for developers, the Adena web3 wallet for Gno.land, and the Gnoscan block explorer. As Gno.land’s most active contributor, Onbloc is leading many community-driven initiatives and we’re excited to extend a grant to this passionate South Korea-based development team to continue their incredible work developing the wallet further, iterating the Gnoscan block explorer, and building Gno.land’s first DEX, Gnoswap.\n\nIn addition to this, we want to encourage Onbloc to continue their amazing work with the community, contributing to meetings, replying to comments on our social platforms, writing code base, organizing local events and meet-ups in South Korea, and creating products that expand the Gno.land ecosystem.\n\n*“Onbloc is thrilled to be a part of the Gno.land Grants Program. As one of the earliest contributors, our endeavors have involved releasing technical guides and research reports, developing infrastructure tools for dApps, creating DeFi smart contracts, and more. We are excited to leverage this grant to further enhance the quality of our products and strengthen our workforce. The grant will enable us to cover some of the existing expenses and hire additional developers to focus on smart contracts and the core side of GnoVM. We expect these endeavors to push the Gno.land blockchain to new limits and accelerate the achievement of the milestones on our roadmap. With the support from the Gnoland team, we are confident in our ability to make significant strides and further contributions to foster the growth of the Gnoland ecosystem.”*\n\n*Dongwon Shin, CEO, Onbloc*\n\n### Teritori\n\nTeritori is a super-dApp project allowing individuals and organizations to interact, organize, and communicate in a radically resilient and decentralized way. Based on an interoperable vision, the application is built on a multi-chain experience approach, gradually integrating Gnolang as the fundamental technical brick of the system. Currently in Beta ([available here](https://app.teritori.com/)), the app is making modular tools and dApps available to users, with a single gamified user experience. Teritori's philosophy is to offer users and developers a place that belongs to them, their territory, with an emphasis on interoperability, modularity, and customization.\n\nUsers can interact with a social network, NFT marketplace, DAO launcher, service marketplace, games, etc., and integrate a plethora of dApps thanks to the dApp store, where Teritori will promote all Gno.land dApps to encourage the growth of the ecosystem. Using the Gno.land grant, Teritori will continue this amazing work and develop a moderation DAO to provide content moderation to Gno.land in a healthy and decentralized way, a challenge that faces the entire web3 industry. By 2024, the UX of Teritori v1 will be based on decentralized messaging without blockchain, allowing users to converse in a \"natural\" way while adding modules and web3 features. Creating and managing a GnoDAO could be as easy as managing a WhatsApp group.\n\n*“At Teritori, we want to make decentralized organizations accessible to all and experiment with new governance models for humans, social groups, businesses, and diverse organizations. Gno.land enables us to build this vision in a modular, future-proof, and censorship-resistant way. Thanks to the Grants Program, we'll be able to accelerate our development, continue to contribute proactively and build user experiences that enable as many people as possible to discover the Gnol.and ecosystem. We're starting work developing a DAO launcher, with different standard templates for DAOs, in particular, DAOs enabling moderation within news feeds, forums, or social networks. This will rapidly open many doors, such as those of conflict resolution DAOs, on-service marketplaces, or project management software. Gnol.and is a playground where anything is possible! We'll be documenting [our journey here](https://github.com/gnolang/hackerspace/issues/7#issuecomment-1588197187), and sharing our progress as we stay connected to the needs of the community.”*\n\n*Zooma, Core Lead, Teritori*\n\n### Zack\n\nZack is the first tinkerer-in-residence at Gno.land. With a deep-rooted passion for innovation, he embraced Go early on in 2013 and ever since, has been harnessing its power to craft peer-to-peer programs and develop web2 applications. While Gno.land marks Zack's initial foray into web3 development and blockchain dApps, the Gnolang language allowed him to effortlessly apply his Golang expertise. This has enabled him to flourish within an ecosystem that revolves around decentralized systems, seamlessly transitioning his skill set to create unique decentralized solutions.\n\n*“I have always been curious about web3 and blockchain technologies but have not developed expertise in smart contract languages and struggled to keep up with the fast-changing ecosystem around blockchain technologies. As an avid Go programmer, Gno and Gno.land created the opportunity for me to develop decentralized applications on blockchains by providing a framework and ecosystem that is consistent with Golang in terms of syntax, sustainability, and stability. The additional web3 features in Gno and Gno.land provide huge potential for interesting applications that I hope to unlock to move beyond web2 and harness blockchain technology for novel use cases. The grant provided for tinkerer-in-residence was the key to giving me the resources to move through this ecosystem as I try to think outside the box for what web3 can be and what blockchain can do for a web2 developer like myself.”*\n\n*Zack Scholl, tinkerer-in-residence*\n\n**How You Can Apply**\n\nActions speak louder than words. Until Gno.land is completely on-chain, the best place to start is by contributing to PRs and issues on the Gno.land repos or participating in the Game of Realms competition. If you want to apply for a grant, you’ll need to fork the Gno.land Ecosystem Fund repo and outline your proposal in your project name’s file. Once we receive your application, our team will review it and get in touch if we believe that you fit the criteria. [See GitHub for full instructions](https://github.com/gnolang/ecosystem-fund-grants). Stay tuned, we’ll be hosting a Funding and Grants Program Q\u0026A in the next few weeks!\n","2023-06-27T13:37:00Z","christina,michelle","gnoland,funding,grants"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-3","The More You Gno: Gno.land Monthly Updates - 3","\n\nWe’ve been busy since the last edition of *The More You Gno,* with the Gno.land core team and ecosystem partners present at various global developer events. We’ve visited many gnomes (and gnomes-in-the-making) around the world from Berlin to Belgrade, spreading the word about Gno.land and growing our expanding community. Aside from all the networking, Gno.land is taking shape with a new iteration of our website, the Gno.land Funding and Grants Program, and a host of developer updates as always. Let’s dive in.\n\n## Gno by Example\n\nWe recently launched [Gno by Example](https://gno-by-example.com/), our equivalent to both [Solidity by Example](https://solidity-by-example.org/) and [Go by Example](https://gobyexample.com/), where you can see tutorials and code snippets to help you learn and get more easily onboarded to Gno.land. Gno by Example is designed to be community-run with a front-end app and tutorials in markdown. There’s also a specific markdown syntax where you can embed certain file fragments to make your tutorials more structured. We’d love to build this into the ultimate resource center for Gno.land, so feel free to [contribute](https://github.com/gnolang/gno-by-example) with new tutorials and sections. Contributions here are eligible for rewards from the Game of Realms competition.\n\n## GnoVM\n\nWe continue developing GnoVM and invite you to provide feedback on what can be improved. This month, there have been a lot of discussions about how to improve native bindings and use the Gno machine in native function calls. Native function calls are well-defined in Go code generation and Go templates but need some modifications for GnoVM. For example, since new native functions already exist in the Gno code, when we try to define a native function, calling the function doesn’t yield the desired result. We’ve created a bunch of panics and tried writing out native functions to see what goes on for them, in an investigation that will go on for the next few weeks. Got any ideas? Please contribute. ([PR 859](https://github.com/gnolang/gno/pull/859)).\n\n## Testnets\n\nTalk about testnets has come up a lot in recent weeks and how to best proceed. Some gnomes are asking for a multi-node testnet to allow for great experimentation, whereas others prefer to keep the testnet single-node. There are advantages and disadvantages to both approaches and we are still listening to feedback and ideas. However, we will likely keep testnet 3 single-node and focus on the language while having a second dedicated multi-node testnet where devs can get creative, think outside of the box, test performance, consensus, and everything they need to push the chain to its limits. We’ve created a new [Hackerspace](https://github.com/gnolang/hackerspace) Repository for the multi-node testnet to prevent spam on the main repo, so please use it to share your scripts, posts, snippets, etc.\n\n## Native Coins and GRC-20 Tokens\n\nWe uncovered some significant issues with the banker module ([PR 393](https://github.com/gnolang/gno/pull/393)) regarding minting and burning tokens with the package minter. It was not scoping, filtering, or minting tokens correctly, making it possible to mint and burn unlimited tokens, including GNOT. We want to allow any realm to create its own token and run multiple tokens on their chains, but we need a prefix for security to resolve the issue and allow anyone to create GRC20 smart-contract-based coins but not native coins. We continue to work with small fixes on this issue and will reopen the PR soon.\n\n## Gno.land Funding and Grants Program\n\nLast month we released our Funding and Grants Program to encourage more developers, researchers, educators, and tinkerers to interact with Gno.land. If you’re interested in experimenting with Gnolang (Gno) and building innovative dApps, tooling, products, or infrastructure, check out our GitHub [Funding and Grants](https://github.com/gnolang/ecosystem-fund-grants) page for further information on how you can apply. Start contributing to Gno.land or Game of Realms as this is a prerequisite of the funding and grant application process.\n\n## Developer Relations\n\nThe Gno core team is growing! We hired a new DevRel last month and are looking to take on another dev for this open position, so if you’re interested, head over to our [careers page](https://jobs.lever.co/allinbits) and apply! You can expect to see a lot more documentation, FAQs, tutorials, and onboarding materials in the coming weeks and months.\n\n## Ecosystem Updates\n\nOur community of gnomes continues to expand, making tons of activity and progress over the past few weeks. Let’s see what they’ve been up to below.\n\n## Onbloc\n\nOnbloc has been super active this month attending and co-hosting IRL events and networking to find new gnomes about town. Among other updates, Onbloc has completed the first integration of Tendermint2 JS with the Adena wallet and will continue to swap out their existing libraries with TM2JS wherever applicable to ensure that they are as tightly integrated as possible. The team has also open-sourced the Gnoscan block explorer, so if you’re interested in contributing, hop on over to [Gnoscan](https://gnoscan.io/) or the [GitHub repo](https://github.com/onbloc/gnoscan).\n\n## Teritori\n\nAnother of our first cohorts from the Grants program, Teritori continues to churn out awesome work and expand its growing team. This month, Teritori has been busy integrating Adena with the Teritori app and working on the DAO contract to build a DAO deployer and various DAO standards and templates for DAO creation. Teritori’s target is to focus on a moderation DAO that can be used for content moderation in social feeds and boards. In the coming weeks, the team plans to integrate the DAO contract into the UI to allow the community to launch a DAO and experiment on the testnet. They have also made an effort to really integrate Gno users by adding .gno at the end of nicknames for people to use. All our grant recipients are documenting their journeys in the hackerspace repo, check out [Teritori’s](https://github.com/gnolang/hackerspace/issues/7) journey.\n\n## Resident Tinkerer, Zack\n\nAnother grant receiver, Zack, has been making significant progress on his microblogging project. You can check out the specs on GitHub ([PR 791](https://github.com/gnolang/gno/pull/791)) or watch the informative tutorial video, [Go to Gno: How to Build a Microblog](https://www.youtube.com/watch?v=F-_dadxcRJM). You’ll find this especially useful if you have a background in Go and need some additional insights to turn your hand to blockchain coding. Zack has also been working on an implementation of a smart contract for creating and transferring text-based NFTs that conform to haiku poetry standards (find out more on GitHub ([PR 860](https://github.com/gnolang/gno/pull/860)). Other than that, Zack continues his Gnolang journey, “learning and having a lot of fun.”\n\n## EthSeoul, BUIDL Asia, and Getting to Gno\n\nJune saw members of our core team heading over to Seoul, South Korea, for a week of networking, talks, and events. Our VP of Engineering Manfred Touron gave a keynote on the evolution of smart contracts and an introduction to Gno.land for participants of EthSeoul, followed by a fascinating dive into Proof of Contribution at BUIDL Asia, where we also had a booth. It was an honor to meet so many talented and motivated Korean developers and contributors from around the globe. Seoul is a hotbed of up-and-coming talent and we’ll definitely be back soon.\n\nWe also had the chance to meet with our most active ecosystem contributors Onbloc and co-hosted an event together, Getting to Gno, at the Code States developer academy along with long-time Cosmos builders, Cosmostation. Attendees had the chance to hear about what the core team is building and see some of the great work of our community. A massive thanks to everyone involved, it’s awesome to be BUIDLing together! Read more about our Korean adventures in this [fab write-up by Onbloc](https://medium.com/onbloc/2023-buidl-asia-recap-894c60a1c0f).\n\nEthSeoul - [Watch the talk here](https://www.youtube.com/watch?v=_iSsStlmxoU)\n\nBUIDL Asia - [Watch the talk here](https://www.youtube.com/watch?v=v6k3NHm5vcE)\n\n## EthBelgrade\n\nCore contributor Milos Zivkovic rocked the Gno.land presence at EthBelgrade in Serbia, giving an introductory workshop about Gno.land, called 'Alice in Gno.land'. Being the first Ethereum conference organized in Serbia, there were lots of attendees from all over the Balkans. Participants joined in a journey through the enchanting realm of Gnolang and the Gno.land platform. Most of the participants were not aware of Goland before but were avid Gophers eager to learn more about the application of the Gno language in blockchains.\n\n## GopherCon Berlin\n\nThe Gno.land team also had a blast last month at the European edition of GopherCon in Berlin. We had a booth at the event for two days, where we networked, talked about all things Gno, made some amazing connections, and even shared some live code! We’re looking to build an active, open-source Gopher contributor group in Gno.land, so stay tuned for more on that soon.\n\nComing up later this month, Gno.land is an official sponsor of EthCC, Paris, July 17-20. Stop by our booth to pick up some swag, say hey, and ask your questions about Gno.land. You can also catch us at the Nebular Summit for a keynote and workshop by our VP of Engineering, Manfred Touron.\n\n*Do you want to contribute to Gno.land’s monthly updates? If you’re building on Gno.land and want to highlight your development, project, event, or idea, let us know and we’ll include your contribution.*\n","2023-07-11T13:37:00Z","christina","gnoland,gnovm,tm2"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-4","The More You Gno: Gno.land Monthly Updates - 4","\n\nWe’ve had more on our plates than ever over the last few weeks, with a huge team presence in Paris at EthCC and Nebular Summit in July, an opening talk at Stanford Blockchain Club in August by Gno.land’s founder Jae Kwon, and some awesome contributions from Gno.land grantees and ecosystem partners, including the first demos of Gnoswap and Teritori’s social platform and DAO deployer. We continue to make solid progress on GnoVM, an alternative VM in Rust, Tendermint2, native bindings, and much more. Check out our latest developer updates below.\n\n## Upgrade Strategy for AVL Between GitHub and test3.gno.land\n\nOne ongoing discussion is about an incompatibility bug that affects many things we do on Gno.land. The current AVL implementation on the testnet is outdated and does not match the AVL implementation users get when they pull in the latest master branch. Therefore, building and deploying contracts on a local Gno chain (with the latest master changes) and deploying those same contracts on the testnet may fail due to this incompatibility. We need to find a way to seamlessly integrate these two approaches. Ideally, when you write code on the master branch on GitHub, it should work on the testnet as well.\n\nIn [issue 970](https://github.com/gnolang/gno/issues/970), you can find details of five different proposed solutions to implement this upgrade strategy, from resetting the whole blockchain (which would mean losing on-chain content and debugging information) to implementing a migration feature specifically for testnets that allows developers to rename packages and patch their contracts before publishing them. There are pros and cons to each proposal, and we continue to work together to find the best way forward.\n\n## Encoding JSON and the Discussion Around Reflection\n\nSome contributors have highlighted the need for native JSON encoding, and we are discussing how best to approach it. See [issue 808](https://github.com/gnolang/gno/issues/808) for further details. One idea is to copy the code from encoding JSON in the standard library Go and take it over to Gno, but we would need to have reflection to do that. So, the important question here is whether we want to have reflection and, if so, what it should look like. We could emulate Go’s reflection package with some added elements, like being able to inspect the realm state, but we would need to be extremely careful about how we do this.\n\nFor example, should users be able to read private fields of external packages through reflection or even *ufmt*, or could that introduce a problem? It would be simpler, and the language capability security would be tighter and easier to understand if we made accessing private fields impossible, but that would also make it limited. We could consider supporting reflection as an internal user package and whitelisting and encoding JSON. This way, new encoding packages would have to be whitelisted because they’re using the reflection package. We could also mark reflection as unsafe so developers know they must carefully audit their work.\n\nAnother solution is the partial implementation of reflection. In [issue 971](https://github.com/gnolang/gno/issues/971), Gno.land core engineer Petar discusses introspection, which involves implementing reflection as Go has it now but enabling only one of its two main capabilities: the ability to inspect types, but not the ability to modify code. The main difference between introspection and reflection is that, since it is done at compile time, it is completely type-safe. This discussion is ongoing.\n\n## Alternative GnoVM Implementations\n\nTo deliver the best possible virtual machine, we’re working on two different implementations of GnoVM. Petar has spent the last three weeks developing a new GnoVM implementation written in Rust. His work is still private as the machine is not yet ready for public use, but he will soon make the code public for your inspection. Rust gives the ability to write more performant code and, in some scenarios, the Rust GnoVM can run up to 20 times faster than the GnoVM at roughly 87 milliseconds compared to 2,000 milliseconds on a Fibonacci benchmark, which is a considerable improvement in speed.\n\nSince one of Gno.land’s core features is that the entire tech stack is written in Go, we’re unsure if everyone will appreciate a Rust GnoVM or whether it aligns with our vision. However, it’s always good to provide alternatives, and, Petar argues, as long as the VM carries out the same functions (and does so more cheaply), most developers won’t mind what language the VM is written in.\n\nRust has a few other features that some developers may favor over Go, such as more tools for creating languages, advanced garbage collector libraries that allow you to change the algorithm without changing the runtime (by swapping out a tricolor algorithm for a generational one, for example), and built-in data structures that solve many issues. For example, we needed a deterministic map that is fairly fast. With Rust’s Btree in the standard library, this was simple, Petar only had to implement the native Go map type with a Btree map from the standard library. This took just a few minutes.\n\nCore team dev Marc has also started an initiative to improve the Go GnoVM so that it is faster and offers a clean and user-friendly interface. He believes the debate over the VM is more about whether to have a VM that is bytecode-defined or AST-defined (rather than speed). Marc has been comparing the fundamental differences between the two and noted that the bytecode version is 15 times faster than the AST. This means that changing to Rust would give an increased performance of 2-3 times.\n\nThe VM must be fast, secure, and performant in many ways. In either version, the AST will be stored on the blockchain, whereas the bytecode is only an internal representation that doesn't affect the users. We must still consider any potential architecture consequences between bytecode and AST before deciding whether to change. Marc’s WIP code is still in a private repo, but you’ll be able to inspect it soon and make a comparison of the VM implementations in the coming weeks. The decision about the direction of GnoVM is still very much TBD; however, the Rust GnoVM will not replace the Go GnoVM but will complement it, eventually giving validators the choice of which to run.\n\n## Defining Wording for People/Documentation and Consistency\n\n[Issue 1024](https://github.com/gnolang/gno/issues/1024) discusses the need to define the wording we use throughout our documentation, for example, how we name a module, package, sub-module, etc. Once we have the wording defined, we will set the GnoVM to only accept elements with the correct naming. The importance of wording affects the design choice of the whole project and how we go about versioning for the best possible user experience.\n\nFor example, is mt/board/admin part of the same realm of mt boards, or is it its own realm? Can we work with both by adding patterns to have some realms responsible for hosting data and others responsible for having more privileged actions? How do we split a complex realm into sub-libraries and sub-realms? We want to define the documentation and the logic for this and have begun to touch on this issue. We will discuss this in greater depth in the upcoming developer calls.\n\n## Improving the GRC20/Foo20 APIs\n\nWhen working on the specs for a Merkle airdrop contract, Albert came against some issues with users initiating airdrop reward claims (see [PR 906](https://github.com/gnolang/gno/pull/906) for more details). Currently, when the Merkle airdrop contract tries to execute the reward claim for the user, an instance of the GRC20 contract is used for transferring. Within the GRC20 implementation Transfer() method, the caller (token sender) is fetched using the standard library method std.PrevRealm().\n\nHowever, calling this method in the Merkle airdrop context returns the user as the caller, not the Merkle airdrop contract, which is an unexpected functionality. We are discussing different ways to tackle this issue efficiently. However, each solution would require possible changes to the GRC20 API and subsequent token implementations. Additionally, as part of [PR 952](https://github.com/gnolang/gno/pull/952), we are looking into improving the standard GRC20 API and possibly resolving the ambiguity with standard library calls that are causing the mentioned issues.\n\n## Client Optimized for CLI, Not Mobile\n\nOur newest contributor to Gno.land, Berty, is developing the mobile version of Gno, which means writing a mobile app to interact directly with the blockchain. The team is facing some issues as they need a client library with utility functions like sign and broadcast, which are used by the command line. This code (tm2/pkg/crypto/keys/client) is not ready for external users yet, and the Gno client is designed for CLI. However, Berty needs a way to interact with the Gno chain from their application and to call the logic without adding the full CLI.\n\nFrom the existing TypeScript/JavaScript client library (gno-js-client and tm2-js-client), Berty should be able to build out a Go client library by exclusively using the RPC endpoints of the node itself (just like gno-js and tm2-js work), and not having to worry about importing private logic like transaction broadcasting. The team is writing its own framework to call Go code for Gno from Java, Swift, and React Native mobile apps that creates a transaction and sends it (see [PR 1047](https://github.com/gnolang/gno/pull/1047)).\n\nThey are working on an API that interacts with the blockchain and lets them export the code without having to write their own utilities. The API will be minimal, and update the Tendermint2 build script by moving tm2txsync from tm2/cmd to gno.land/cmd (see more details in [PR 1080](https://github.com/gnolang/gno/pull/1080) here). For the time being, Berty will copy the code and use the objects directly until a more convenient API is complete.\n\n## Tendermint2 Development\n\nIn [PR 546](https://github.com/gnolang/gno/pull/546), we introduce file-based transaction indexing. Transaction index parsing should be done as a separate process from the main node, meaning other services can be instantiated to index transactions as readers. The current problem is that there is no way to figure out whether a transaction has failed after it’s been sent out with a broadcast sync, or fetch any kind of receipt information or error reason in the delivered transaction.\n\nSo, we’ve started working on an event indexer to index Gno node events, which include transactions. Soon, developers and users will be able to ask the event indexer what happened to the transaction or in which state in its execution it's currently at, and also to retrieve information on other events like block commits as they happen.\n\n## Extending the Functionality of Go\n\nIn [issue 919](https://github.com/gnolang/gno/issues/919), Petar proposes extending the functionality of Go by adding constant data structures, arrays, slices, etc. He believes this would benefit users, as they wouldn’t need to create special functions as in Go to simulate this behavior, and it would also catch bugs when there is mutation. There has been a discussion, and Jae has similar ideas with the notion of “invar” expressions, where the resulting value can only be read, not mutated or stored. This would fix the bug where if you pass a pointer (that represents part of your contract state) to another contract, the other party can “steal” it by assigning it to their state, and your contract would fail to execute.\n\nMorgan believes that we should take a different approach as slices have the semantic in Go, where the underlying array is always heap-allocated and modifiable. Introducing constant slices would thus necessarily have to introduce concepts regarding im/mutability of values without the matching constructs that a language like Rust has. To make a compromise and keep compatibility with the Go spec, we are likely to implement this in a transpiler (gnoffeescript) that would implement this feature and be able to transpile to valid Go.\n\n## Grantee and Ecosystem Updates\n\nAs you can see, we’ve made a ton of development progress over the last few weeks. We’re also steadily adding more gnomes to our community of builders, and they’re working on the core infrastructure of Gno.land, as well as the permissionless dApps the platform will house. Let’s see what they’ve been up to since the last update.\n\n## Onbloc\n\nOnbloc has been busy, as always, with a slew of updates for us over the last few weeks. The team has been developing Gnoswap, the first Gno.land automated market maker with concentrated liquidity, and they gave us a live demo. On the front end, which is still a work in progress, you can find a one-stop venue for traders to view all the information about tokens on gno.land, so you don’t have to move between Gnoswap and a token aggregator like CoinGecko. You can also see incentivized pools sorted by liquidity, volume, APR, liquidity mining rewards, etc., and a wallet page to check your balances. You will also be able to deposit or withdraw assets from the Interchain when IBC is enabled.\n\nCheck out the work they’ve done so far on the Onbloc [hackerspace](https://github.com/gnolang/hackerspace/issues/29). The team has also released [the documentation](https://docs.gnoswap.io/) about what you can expect from Gnoswap, the rationale behind their design choices, some information about tokenomics, a preview of the UI, and more. Their main focus is on delivering a smooth and welcoming user experience and abstracting away the difficult mechanisms of concentrated liquidity so that the interface is as minimal and simple as possible.\n\nThe team will be ready to launch Gnoswap as soon as gno.land reaches mainnet. Feature updates and enhancements will be aligned with the development of the core Gno Stack.  The code for Gnoswap has now been [open-sourced](https://github.com/gnoswap-labs), so you can take a look at everything they’ve done and even make suggestions. In the coming weeks, Onbloc will also work on building core Gno.land infrastructure to support an earlier launch. Find details of this in Onbloc’s [grant submission](https://github.com/gnolang/ecosystem-fund-grants/pull/4). And be sure to check out Onbloc’s informative 6-episode [blog series](https://medium.com/@gnoswaplabs/why-gno-introducing-gnoswap-dd6acc22e6a1) that features the history of blockchain and exchanges, a deep dive into the Gno Stack, and an introduction to Gnoswap, where they share details of their journey and insights.\n\n## Teritori\n\nWe also saw an awesome demo from the Teritori team, which you can check out at app.teritori.com. Simply connect your Adena wallet to create a user name, start interacting with the social feed, create your own DAO, and add members. The team is working on more extensive documentation to explain how it works in more detail. While still a work in progress, Teritori has developed a cool flagging system that allows you to unfollow content you don’t like or flag content as inappropriate. If posts receive many flags, users can vote on whether to ban them, creating a healthy and supportive social environment free from derogatory content monitored by a like-minded community through a moderation DAO.\n\nThe team continues its work on DAO interfaces and has built a useful tool for speeding up the deployment of packages as a workaround until we’ve decided how to best tackle realm versioning. They are also working on the escrow system, which will be useful for the freelance marketplace, and presenting DAO standards documentation.\n\n## Berty\n\nWe have a new contributing team to Gno.land from the Berty private messaging app. This team is working on a mobile version of Gno.land, implementing the WESH protocol, which is available by Bluetooth, local WIFI, or other means, and provides secure censorship-resistant communication between devices. The plan is to be able to provide an alternative transport for Gno applications when the internet is not available and build the skeleton/foundations that enable developers to create Gno-centric mobile apps more easily in the future. Berty brings a ton of experience in off-grid communication and getting apps to run on mobile devices, both Android and iOS.\n\nThe team has created its own [testnet](http://testnet.gno.berty.io/), which you are welcome to test out and play around with, although they will be restarting and rebooting without prior notice, so be aware that your work could be wiped. In the few short weeks they’ve been working with us, Berty has already finished their first Proof of Concept, a simple app running on iOS and Android. They copied code from the gnokey command line, and now it’s installing and running on mobile and interacting with the blockchain.\n\nNow, Berty is working on a nicer UI for the app and will propose a project to create a formal framework called GnoMobile, which will allow anyone to create their own app and run it on mobile. We look forward to seeing their demo soon.\n\n## Golang Working Group\n\nIn other news, we've started a bi-weekly [Gnome Golang Working Group](https://github.com/gnolang/hackerspace/issues/15) where we get together and discuss various topics, such as the language-related and theory elements of Go and Gno. We also aim to identify meaningful and reasonable ways to contribute to Golang, Gophers, and the general open-source community and improve our visibility there. We hope to attract more Go devs to the project and provide a “blockchain-less” experience for web2 Go devs.\n\nWe've had two meetings so far, and some recent hackerspace issues have already emerged from the discussions. One in particular that we’re actively evaluating is Gnoffee, a transpiler tool inspired by the likes of [CoffeeScript](https://coffeescript.org/) for Go and Gno integration. Gnoffee would be a powerful standalone tool to enhance Go and Gno (blockchain) projects by generating code and seamlessly integrating new features without manual coding. Find out more at the link above.\n\n## EthCC and Nebular Summit\n\nThe Gno.land team was in full force in Paris at the end of July for EthCC, where we met many passionate developers and spread the word about Gno.land and, specifically, how Gnolang compares and contrasts to Solidity. We had a booth during the conference manned by the Gno.land team complete with awesome swag and a continuous presentation in the background playing on a full-screen television.\n\nAt Nebular Summit, our VP of Engineering, Manfred Touron, [gave a talk](https://www.youtube.com/watch?v=CtxBajCcTYQ) called ‘Gnolang for Developers: Examining the Core Stack,’ where he broke down the major components of Gno, demonstrated how the upcoming Gno SDK compares with the existing Cosmos SDK, and explained why Gno.land is an excellent choice for accessible and sustainable blockchain development.\n\n## Blockchain Application Stanford Summit (BASS)\n\nJae opened the [Blockchain Application Stanford Summit (BASS)](https://bass.sites.stanford.edu/) event, attended by thousands of students and future blockchain developers. He gave an overview of Gno.land, GnoVM, and Gnolang, and explained the features that make our platform paradigm-shifting and timeless. He also dove into the core of why we’re building Gno.land – to provide a censorship-resistant platform for truth discovery that helps people improve their understanding of the world in an era of information censorship and control.\n\nComing up later this month, you can catch up with the Gno.land team at [DappCon Berlin](https://www.dappcon.io/) from September 11-13, where we’ll be delivering an informative keynote and hosting a side event to get to gno you better. If you find yourself in Barcelona for [Web3 Family](https://web3fc.xyz/) on September 23, you can join in a Gno coding workshop. You’ll also be able to meet the team at [GopherCon US](https://www.gophercon.com/) in San Diego. We’re hosting an action-packed workshop, ‘Chess: The Gnolang Way,’ on Gopher Community Day, where you can learn to build a web3 chess server on Gno.land and compete for cool prizes in an ongoing chess tournament throughout the event. More details coming soon. That’s all for now! Be sure to check back again with us for the next edition of *The More You Gno* to keep up with all our progress.\n\n*Do you want to contribute to Gno.land’s monthly updates? If you’re building on Gno.land and want to highlight your development, project, event, or idea, let us know, and we’ll include your contribution.*\n","2023-09-04T13:37:00Z","christina","gnoland,gnovm,tm2"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["chess-gc23","Play Chess with Us: The Gnolang Way at GopherCon 2023","\n\nCalling all gnomes and gophers! Come join the Gno.land team at GopherCon 2023, September 25 - 28, in San Diego, US. We’re sponsoring this year’s action-packed event that will gather together some of the world’s brightest minds and smartest programmers under one roof. So drop by our booth, pick up some swag, and say hey! We’ll be on hand every day to meet and greet, answer all your questions, and discuss everything Go, Gno, and beyond! We’ll also be hosting a workshop on Community Day, September 26, called ‘Chess: The Gnolang Way,’ where you can learn how to build a web3 chess server on Gno.land.\n\n## GopherCon 2023\n\n[GopherCon](https://www.gophercon.com/) is a community-driven annual event that started in 2014 and is dedicated to promoting the use of Go and the education of Go developers. Every year, thousands of gophers from around the world exchange ideas, share their work and expand the Go network. There are four days of fun-filled activities, including hands-on workshops, informative keynotes, networking events, and hackathons, all taking place in the laidback West Coast city of San Diego. Where better to expand your knowledge and make new friends than in one of the US’ most popular destinations?\n\nAs a gold sponsor at this year’s event, Gno.land will be running a booth and doing our best to convert as many gophers as possible to Gno, showing them how easy it is to port their existing web2 apps over to Gno.land or to build completely new ones from scratch.\n\n## Chess: The Gnolang Way\n\nIf you’re looking for a hands-on coding experience and to have a little fun with us at the same time, join us on Community Day for an awesome workshop, **‘Chess: The Gnolang Way.’** Kickstart your day by learning to build a web3 chess server on Gno.land using Gnolang. By the end of the session, you’ll have gathered basic knowledge on developing and deploying smart contracts on Gno.land, and connecting smart contracts to a web frontend. You’ll also see how web3 enables you to write perpetual and trustable social and gaming platforms and how to build a web3 chess server and website with Gno.land.\n\nIf you want to join us, meet us at 10:00 a.m. in the Grand Ballroom 10.\n\n## Let’s Play\n\nAfter the workshop, the fun begins with an ongoing chess tournament throughout the GC23 summit for event participants. To be in with a chance of scooping up some seriously cool prizes, GC23 attendees will need to show us their best moves and how much they engage with the Gno.land chain. This competition is designed to put our platform to the test over two main areas: chess mastery (50% of points) and platform engagement (50% of points). To be eligible for prizes, participants must be present at the event. We hope to see you there! If you can’t join us in person in San Diego, be sure to [follow us on X](https://twitter.com/_gnoland). We’ll be giving updates on our progress and sharing the highlights of the event. May the best gnome win!\n","2023-09-25T13:37:00Z","christina","gnoland,gnovm,gnochess,events"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["gnomobile","GnoMobile, a Framework for Building Gno Mobile Apps","\n\n*This blog post is written by Berty Technologies, an NGO that is building open and free communication solutions without any of the limitations imposed by centralized systems. Berty is a proud partner and grantee of Gno.land.*\n\nThe year is 2023. Current Gno apps run on desktop or laptop computers that have Go installed. To run on mobile, the app would need to bundle the Go runtime, which is complicated for most developers. At Berty, we have years of experience using Go on mobile and overcoming difficulties with Android and iOS operating systems. We built Wesh Network, a decentralized communication protocol that enables p2p users to reliably and securely send messages over async networks, even in environments with poor or no connectivity.\n\nThis stage is thus set to take the leap and make it easier for builders to develop Gno applications for mobile devices.\n\n# What is GnoMobile?\n\nSimply put, GnoMobile is a framework for developing Gno mobile applications. This is how it works:\n\n*WARNING: Deep technical sections ahead. Grab a coffee before venturing forth*.\n\nFor communication between the mobile app and the Gno code, GnoMobile uses [gRPC](https://grpc.io/), a well-supported framework that sends and receives Google Protobuf messages. Even though the core Gno code is written in Go, the app code can use React Native, Java, Swift, etc. The following system diagram shows how gRPC is used.\n\n\u003cdiv align=\"center\"\u003e\n ![](https://github-production-user-asset-6210df.s3.amazonaws.com/109347079/267934754-e4da6fec-a586-4ebe-97cc-3b3ad7f79370.jpg)\n\u003c/div\u003e\n\nMoving from the bottom to the top, this is how the flow looks:\n\n1. At the bottom are Go packages in the gno codebase. A **gnoclient.Client** supports communication with the remote Gno.land node with methods like Call to call a realm function. The Gno codebase also has **keys.Keybase** to support a wallet stored on the local device with methods like CreateAccount.\n2. These methods are called directly from the next level up by the **GnoMobile** Go code. A Go object can’t be passed through the gRPC interface, so the GnoMobile Go code maintains a persistent gnoclient.Client object, which is accessed by gRPC calls. The GnoMobile API functions are registered by an amino package.go file and the generated Protobuf files are used to configure the gRPC server.\n3. Finally, at the top of the diagram, the **gRPC client in the mobile app** communicates with the GnoMobile gRPC server over a local connection using Protobuf messages. A gRPC call can either return an immediate result (for example, GetKeyCount) or an asynchronous gRPC stream object, which can return delayed results (for example, a Call to a remote realm function). The gRPC framework uses the Protobuf API to generate convenient API functions in the mobile app’s [preferred language](https://grpc.io/docs/languages) (React Native, Java, Swift, etc.).\n\n# How GnoMobile benefits builders\n\nThe first version of the framework will include three main sets of features:\n\n1. **Blockchain Operations**: These refer to the core block of functions that the apps need to interact with the blockchain. Things like the gnoclient API to effectively bring the benefits of the Gno framework on mobile, the gas estimation interface and calling realm functions, querying a blockchain node (and more) are included here.\n2. **Wallet**: As the name suggests, here we have all the standard wallet operations like create or delete an account, set the recovery phrase, account balance, and so on.\n3. **Toolkit**: We want to make it as easy as possible for devs to start building apps with our framework, so we’ll provide them with install instructions, example apps, and more technical stuff like genproto options to support gRPC and helper functions to parse the render output.\n\nThose should be enough to allow builders to get started on using and experimenting with Gno mobile apps.\n\n- *Support for secure p2p communication, even when the Internet is down?*\n- *Yes, please!*\n\nSomething that is not necessarily essential for V1, but for sure will open the doors to some powerful capabilities later on is to add an interface and a constructor to adapt the communication transport. This will make it possible for devs to incorporate other tools like Wesh Network and give their apps the ability to securely and reliably send messages even in very poor network conditions. But that’s a story for another time.\n\n# When will GnoMobile be ready?\n\nV1 is planned for release in mid-December 2023.\n\nUntil then, you can check out our progress [here](https://github.com/gnolang/hackerspace/issues/28).\n\nGot feedback or want to drop us a question? Ask away on our [repo](https://github.com/gnolang/gnomobile/issues).\n\n# What does the future look like beyond V1?\n\nWe see a lot of potential directions for GnoMobile after the initial release that will improve the user experience, extend its functionality, and make GnoMobile even more secure. We’re still scratching the surface in terms of how far we can take its development, and we look forward to working on further iterations and improvements. Some of our ideas for the future beyond V1 include:\n\n1. Making it easier for developers to **build** **desktop apps** **and** **browser extensions**:\n2. Through GnoMobile, we can gradually enable “desktop” devs to use our React Native gRPC interface to write desktop applications while using existing functionality from the core Go code. This way, developers will not necessarily have to learn Go to leverage its advantages.\n3. Browser extensions are usually written in JavaScript in the same way as in React Native. This opens the door to getting the benefits of Go via the GnoMobile framework. Otherwise, you’d have to either make the Go code run inside the browser extension (which is not easy) or use a remote server (which is not pretty).\n4. Making it possible to **execute smart contracts directly from mobile**.\n\n*Why is this important?*\n\nIf you want to add a new message to a blockchain, you need to actually interact with it (the blockchain) and update its state with the new message. However, if you just want to browse through the messages, you can execute the Render function locally without needing to use your network and, at the same time, get the results much faster. This is because the node runs locally on the mobile device without needing to spend crypto coins to get a remote node to do the operation for you.\n\nGno nodes run on GnoVMs (gnovm), and for the moment, these are only available on desktops. We believe it is possible to make them available on mobile as well, but we need to find clever ways to overcome the constraints of mobile devices (like putting the apps in the background (iOS), addressing network bandwidth limitations, and so on).\n\n1. Developing a **decentralized push notification service** for *both* mobile and desktop apps. Getting notifications is now a standard (and very important) functionality of centralized apps. Technically, this happens via a central server. Naturally, having a centralized server is not possible for a p2p app, but there are other ways to implement notifications, and we are considering including them in the GnoMobile framework.\n2. Making it possible for decentralized apps to **interact with the blockchain even if the network connection is poor or virtually unavailable**. Through the [**Wesh Network** protocol](https://wesh.network/), we are opening up the possibility of using alternative transport mediums to exchange messages between peers in an asynchronous but reliable manner in off-grid environments. Enabling reliable, secure, and censorship-resistant communication is our main cause at Berty Technologies. We want to open the door for p2p users to send messages and interact even in extreme situations or adverse scenarios, and Wesh Network is built specifically for this purpose. It is only natural to make it easier for developers to use it through the GnoMobile framework.\n3. Advancing **edge networking for enhanced blockchain resilience**. Edge networking refers to bringing functionality like computing power or storage closer to the user so that they don't need to travel through the whole Internet to interact with a server. The same edge concept can be applied to bring the necessary services to interact with the blockchain closer to each p2p user. For example, hosting a copy of the blockchain so a user can sync it or even execute smart contracts. Having these fundamental services closer to the p2p users is especially important in the case of mobile apps. We want to offer developers the possibility of taking advantage of the edge networking benefits by allowing them to use, for instance, network address redirections or special HTTP headers in the configuration of their applications.\n\nIn all honesty, it’s hard not to get excited about all the different possibilities that lie ahead for GnoMobile, but we’re keeping our focus on shipping V1 for now and collecting feedback from the community. After that, well, we hope you’ll stick around to see what happens next!\n","2023-09-29T13:37:00Z","jeff,costin,remi,iuri","gnomobile,berty,weshnetwork"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-5","The More You Gno: Gno.land Monthly Updates - 5","\n\nIt's been another productive month, packed with developer calls, live events, new contributors, a large team presence at the Go community's biggest event of the year, GopherCon 2023, and the launch of a PoC gaming dApp on Gno.land, GnoChess. We uncovered a bunch of bugs in the code and some issues with the GnoVM, and made further progress on the Go and Rust VMs, the banker module bug, Gnofee, and much more. Check out the updates below.\n\n## Building a Web3 Chess Server on Gno.land - GnoChess\n\nMost of our work over the last few weeks has been dedicated to [GnoChess](https://gnochess.com/), a [PoC gaming dApp](https://test3.gno.land/r/gnoland/blog:p/chess-gc23) unveiled at GopherCon 2023. As gold event sponsors, we wanted to provide gopher attendees with a memorable experience – and a little friendly competition – while battle-testing the Gno.land platform. As our first gaming dApp, developing GnoChess was extremely useful for our team in many ways. We managed to attract 61 players to the game during the event, including some die-hard web2 gophers who wanted to show off their moves and discover more about Gno.\n\nSeveral PRs were opened as a result of our endeavors, and, beyond the conference, GnoChess taught us a lot about where we're at with Gno, how to successfully build complex dApps on top of the platform, and how well we work as a team. We uncovered some key issues and breaking behavior in the GnoVM, made our JavaScript clients much more reliable in their communications with the Gno.land node, and unearthed further issues that lead to complex errors and potential security flaws that must be addressed before mainnet.\n\nFor example, appending nil to a slice of errors resulted in a panic, or conditional statements like if not supporting custom boolean types. The GnoVM doesn't currently perform terminating statement analysis, which results in a cryptic panic message ([issue 1086](https://github.com/gnolang/gno/issues/1086)), and mixing untyped (negative) floats and integers in arithmetic sometimes drops the sign ([issue 1152](https://github.com/gnolang/gno/issues/1152)). The issues uncovered while developing GnoChess were discussed extensively in the public developer calls of [Sept 6](https://www.youtube.com/watch?v=BBBqgycMjqU) and [Sept 20](https://www.youtube.com/watch?v=WrxFVPR55G0), and referenced in the [GitHub meeting agenda](https://github.com/gnolang/meetings/issues/31). Most of the issues are common in software development and fairly simple to fix by making some implementation changes or adjustments to design choices.\n\nWhile developing GnoChess, our engineers took on the role of expert platform users rather than core team members. This approach was very useful as it pushed the platform to new limits, and allowed us to dive deep into many aspects of the project, creating a culture of sharing by opening up issues for each bug and asking for feedback and support. We'll definitely take a similar approach for future app development and onboarding new devs to Gno. We'll be releasing a retrospective of our experiences in the coming weeks. In the meantime, if you want to build a dApp on Gno.land, check out the GnoChess repo, where you can find a useful [tutorial](https://github.com/gnolang/gnochess/blob/main/tutorial/01_getting_started/README.md) or watch the recording of the GopherCon workshop, '[Chess: The Gnolang Way](https://www.youtube.com/watch?v=JQh7LhqW7ns).'\n\n## The Battle of the Virtual Machines\n\nCore engineers Marc and Petar continue their excellent work developing two different VMs for Gno, one in Go and one in Rust. In the coming weeks, we'll have a face-off, comparing and contrasting their features, efficiency, speed, and performance, so watch this space! For now, the definition of the virtual machine is stable for both, and they are no longer working on the virtual machine definition. They are mainly focusing on code generation; everything from parsing to scanning to parsing and compiling. Let's see how they are shaping up.\n\n### Rust VM\n\nPetar has developed a Rust implementation not only of the virtual machine but of the whole chain, including the compiler. He has written a Go compiler entirely in Rust and has even started experimenting with changing the compiler to implement the Invar proposal from Jae. Further progress includes porting a part of the parser and scanner from the Go compiler to Rust (almost a direct translation from Go to Rust) and making it stable. \n\nIn addition, Petar has completed work on typed nil values and improving the recursive closures of Go, which were not working with Gno code and needed additional pointers. He has also implemented Iota and hooked up the garbage collector. In the coming weeks, Petar will be working to smooth out bugs and implement type aliases, as well as implementing function analysis for the dependency graph. The dependency graph is necessary for compiling global types in the correct order, so, for example, when type A refers to type B, you need to compile type B first so that when type A refers to it, type B exists.\n\n### Go VM\n\nMarc is currently rewriting a parser and a scanner from scratch. His work is not as far along as Petar's, but he's getting closer, and the code generation works well. He is currently refactoring and building a single-pass compiler that can perform a **syntax-directed translation**, which means there are no intermediate data structures between the source code and the byte code. This is a much simpler design that should compile faster and be easier to maintain, but it requires a complete redesign. \n\nMarc believes his Go parser will be easier to maintain and understand than the one in Rust and benefit the user since the entire stack is written in Go. However, to assess the best implementation of the VMs, Marc has started a Go **test shoot project, which is a script** that will run many samples to verify that the compiler (in Go, Rust, or any other implementation) conforms to Go's specifications. Marc and Petar will open their repos soon, and the next edition of The More You Gno will highlight how the GnoVM works. \n\n## Gnoffee: Coffeescript for Go and Gno\n\nGnoffee (hackerspace [issue 22](https://github.com/gnolang/hackerspace/issues/22)) will be a powerful standalone tool to elevate the development process of Go and Gno by generating code and integrating new features, eliminating manual coding. We aim to create a custom variation of Golang that preserves similar readability, maintains compatibility, and enables being able to code in Gno very quickly when you know how to code in Go. How do we go about this? \n\nRegarding compatibility, one possibility is to propose all our changes to Golang and wait for approval before we start developing. However, this is likely to take some time. Another approach is to use a way to transpile TypeScript for JavaScript or Coffeescript for JavaScript, so it's another language passing through a program that creates standard valid Golang and will generate valid Gnolang. With this simple method, we can experiment with missing features like new native types, and new keywords, and when we have new features in mind, we can develop what we lack. \n\nFor instance, it does not make sense to have extra security for your exported variables when you write a library in Go. However, in Gno, it is very important to ensure that everything you expose cannot be modified by other contracts. This means finding a way to expose constants and other readable elements without risking their values being overwritten.\n\nBesides allowing us to carry out all types of experimentation more easily, Gnofee could eventually be a way for the Go team to measure the potential adoption of Gno. Gnofee is not a priority for the mainnet, but we're excited to work on this important initiative.\n\n## META Multinode Testnet\n\nThe discussions about single and multinode testnets have been ongoing, so we opened an issue to establish a multinode testnet focused on multi-validator experimentation, including stability, benchmarking, and lifecycle management. This multinode testnet aims to provide a platform for in-depth explorations and evaluations of multi-validator setups, while we maintain the single-node test3+.gno.land set up, primarily dedicated to showcasing the VM and providing examples. Visit hackerspace [issue 9](https://github.com/gnolang/hackerspace/issues/9) if you want to participate in this initiative or share your insights.\n\n## Banker Module Bug\n\nThe banker module bug is a known issue that needs to be fixed before the mainnet because, currently, it's still possible to mint new GNOT tokens from any contract. Several fixes have been suggested, and our goal is to merge [PR 875](https://github.com/gnolang/gno/pull/875) put forward by Onbloc to change the denomination of the coins minted by the banker. Merging this PR is currently blocked by 2 small failing checks, but we are close to resolving this issue.\n\n## Preserving Go Comments in Protobuf\n\nIn [issue 1157](https://github.com/gnolang/gno/issues/1157), Jeff from Berty raises the question about preserving Go comments in the Receiver field. Currently, Amino converts the code, but the proto message Receiver field doesn't have the comment. Manfred agrees that informative comments are helpful. However, he doesn't want to create a complex Protobuf configuration. We will continue to discuss this issue to look for solutions, but for now, Berty will parse the original Go source code and get the comments this way.\n\n## Multi-Sig and Security Features\n\nSeveral contributors, including Teritori, are working on built-in multi-sig support in Gno.land, where Gnokey supports a multi-sig setup. We also want to introduce additional ways to improve the UX and security of Gno.land (and web3 in general). An idea we currently have is to add a new layer in authentication, creating something similar to browser cookies that we can name sessions. The chain will have two tables, one with the public key for an account and one with a public key for sessions linked to an account. From your main account, you can create a session with self-destructing features, such as destructing after one hour without usage or after 24 hours. The goal would be to allow more complex and secure flows when starting your operations. We may not want this for multi-sig, but it comes under the same family of security and privacy features.\n\nFor example, imagine a wallet like Adena uses your key, a passphrase, or a ledger. It will sign a new public key that you just created in memory. Each time you close your browser, the memory is cleared. You can also have a logout button to call on the blockchain to delete all your sessions or simply wait for the session to be self-destructed, especially if the session was just in memory on your side. We will continue to develop this idea.\n\n## New Team Member\n\nWe're excited to welcome a new DevRel team member to Gno.land, Leon, who's been in blockchain development for two years and is passionate about engineering and teaching. Leon has taught languages, development, math, and music privately, as well as an OS fundamentals class at his previous faculty. Welcome on board!\n\n## Grantee and Ecosystem Updates\n\nAs Gno.land core continues to advance, so does our blossoming ecosystem, with new contributors and community members turning their eyes to Gno. The overriding theme of this last month has been collaboration, and we're pleased to see gnomes working together to overcome their obstacles and push their projects forward. Let's see what they've worked on over the last few weeks.\n\n### Onbloc\n\nOnbloc is powering ahead, contributing to Gno.land core, making upgrades and improvements to Adena and Gnoscan, and developing the Gnoswap DEX. Last month, Onbloc released the patched version 1.8.0 of Adena, which includes some UI and UX enhancements, such as more intuitive account management settings, a copy icon next to the names of the accounts, and some bug fixes. This release also comes with new injection methods to enable dApps to request users to add a custom gno.land network or switch to an existing one. Check out the [release note](https://github.com/onbloc/adena-wallet/releases/tag/v1.8.0) for more details.\n\nOnbloc has open-sourced the code for Gnoswap on this GitHub [repo here](https://github.com/gnoswap-labs/gnoswap). You can also find a guide to running unit tests. The team continues to improve the Gnoswap interface, focusing on the earn and staking pages, the graphs for positions, and some components for adding and removing liquidity and providing pool incentives. They're working on the next iteration of the interface, with the governance and airdrop pages, and developing the front-end logic to integrate with Gnoswap realms and APIs. Onbloc also contributed to Gno core, adding PRs for fixes to testing and the banker module. Keep up with Onbloc through their [hackerspace journey](https://github.com/gnolang/hackerspace/issues/29) and check out their latest initiative [Gnodesk](https://medium.com/onbloc/gnodesk-week-2-of-sept-2023-5edbc451bba7), which delivers weekly highlights and updates from Gno.land.\n\n### Teritori\n\nTeritori has been working on improvements since the last update and open-sourcing all their work, including the DAO deployer and the Moderation module. You can visit the Teritori DAO tooling repo to find the complete documentation and new realms to easily deploy your DAO. There is also a tutorial on creating your own DAO using the framework. \n\nThe team has made extensive progress on the Justice DAO deployer, a module that can be used for third-party arbitration when there is a problem with the escrow system in a decentralized freelance marketplace. The Justice DAO can resolve potential conflicts between the seller and the buyer and implements randomness to choose the judges to solve problems without conflicts of interest. The content flagging system, which highlights the content that users deem to be inappropriate, has been tweaked and improved. Keep up with Teritori's [hackerspace journey here](https://github.com/gnolang/hackerspace/issues/7).\n\n### Berty\n\nBerty has already completed the first phase of the project and published the [technical proposal](https://github.com/gnolang/gnomobile/issues/15) to develop the Gno mobile framework. The team is now busy with the second phase of implementing the proposal and the gRPC interface, which is working with the local socket on Android and iOS. Jeff has been trying to use Amino, and, now that Iuri is back from vacation, the team will work on improving other parts of the interface. Check out their latest [demo](https://www.loom.com/share/c0f68f707d3e47089c2fdbd2698fc92f), which shows an example user interface with wallet functions and blockchain communication. \n\nOnbloc has laid the foundations for Gno mobile apps with the Adena mobile wallet, so Berty will use some of this code in the mobile framework and work with Onbloc to ensure a similar user experience across all Gno apps.\n\n### Flippando\n\nDragos, the developer behind new grantee Flippando, is an experienced mobile app developer. Flippando is a simple on-chain memory game, which is currently written in Solidity and deployed on several testnets, including Goerli, Polygon, Near, Aurora, Evmos, and a Saga chainlet. Fippando started as a project for Dragos to learn Solidity but has already been the winner of two hackathons in Korea. It can be deployed relatively easily on any machine and is currently being ported to Gno.land. Dragos is exploring which user intersection can be more beneficial for this and will show us a demo in the coming weeks. Soon, we'll have two gaming dApps on Gno.land – Flippando and GnoChess! Read about Flippando in the [hackerspace journey](https://github.com/gnolang/hackerspace/issues/33).\n\n### New Contributor Joseph Kato \n\nWe have a new contributor to Gno.land who showed a demo last month of what he's been working on, a language server to run tests and scripts. Joseph is a major Go fan looking to get into web3 and was super excited to come across Gno. While interacting with Gno.land, he found many IDE-like features that he missed when working on files, so he decided to work with an LSP implementation—gnols—with the goal of making these features available to all contributors regardless of editor preference, starting with Sublime Text and Neovim and moving on to IntelliJ, Golang, and Emacs. This is a welcome addition for anyone who has ever developed a realm in Gno. Check out his [hackerspace](https://github.com/gnolang/hackerspace/issues/34) page for more details. \n\n## DappCon, Berlin\n\nManfred was back in Berlin in September at the Radial System presenting 'Gno.land: The Key To Perpetual Transparency,' where he discussed how Gno.land offers a familiar, seamless experience for code sharing and a sustainable and transparent path for blockchain development. \n\n## Web3 Family\n\nCore dev Miloš Živković gave a talk at Web3 Family in Barcelona last month, 'Gno.land and Gnolang: The Dynamic Duo of Blockchain Development.' He presented a brief history of smart contract development and the issues associated with existing platforms, such as limitations in design and security. He introduced Gno and showed how we make web3 accessible and blockchain development more intuitive and secure. Catch the [talk here](https://www.youtube.com/watch?v=0K-jr_Ad3bI).\n\n## GopherCon 2023\n\nGno.land was out in force at GopherCon 2023 with a well-stocked booth at the conference and an awesome workshop building a web3 chess server on Gno.land. Both Manfred and Jae were at the booth championing Gnolang to Gophers, and we received a lot of positive feedback, some new contributions, fresh PRs, and exposure for Gno.land in web2 circles. It was also a fabulous chance for the team to meet for valuable face-to-face time.\n\nThat's all for now! Be sure to check back again with us for the next edition of The More You Gno to keep up with all our progress.\nDo you want to contribute to Gno.land's monthly updates? If you're building on Gno.land and want to highlight your development, project, event, or idea, let us know, and we'll include your contribution.\n","2023-10-10T13:37:00Z","christina","gnoland,gnovm,tm2"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["funding-program-23q3","Gno.land Funding and Grants Program - Progress So Far","\n\n# Quarterly Report: Q3 2023\n\nWe launched the [Gno.land Funding and Grants](https://github.com/gnolang/ecosystem-fund-grants) program in July 2023 to encourage talented and passionate developers to interact with Gno.land, help build core infrastructure and tooling, and enhance the usability of the platform. After establishing a review process to streamline the program and identify core areas that need the most work, we ran with our first cohort of grantees in Q3, awarding four grants from a total of seven submissions (to two teams and two individuals). Full details of grant submissions, scope, and funding can be found on GitHub, but here’s a summary of the program’s progress so far and what’s coming up in Q4.\n\n## Q3 Funding Breakdown\n\nThe total grants distribution for Q3 was **$563,595** over the four grants: Teritori, Berty, Zack Scholl, and Flippando. This work has been split over two main large-scale infrastructure products (the Gno Moderation DAO, and GnoMobile), a gaming application, and our first resident tinkerer (Zack), who is experimenting with Gno and developing Proof of Concepts using it. Each grant recipient was provided with milestones for deliverables and has kept track of their progress through regular syncs, hackerspace journeys, blog posts, and developer calls. \n\n### Teritori (delivered September 2023)\n\nTeritori blockchain and multi-chain hub allows IBC and non-IBC communities to connect, create groups, exchange tokens and NFTs, and launch new projects. The Teritori team has solid experience building social dApps, marketplaces, NFTs, collectibles, and interfaces to encourage community interaction. For the Gno.land Grants and Funding program, Teritori was tasked with building a Moderation DAO to enable effective and fair content moderation in a decentralized and permissionless environment. \n\nThe Moderation Module is a smart contract ‘realm’ that enables a DAO to manage the daily moderation of forums or social threads through blockchain decision-making, supporting the vision of a censorship-resistant platform that fosters a safe space for open debate and discussion. Find detailed updates on Teritori’s [hackerspace issue 7](https://github.com/gnolang/hackerspace/issues/7), and watch out for upcoming blogs on Gno.land.\n\n### Berty Technologies (delivery Dec 2023)\n\nBerty private messaging app was allocated a grant to build a mobile version of Gno.land, implementing the WESH protocol (available by Bluetooth, local WIFI, or other means), and providing secure censorship-resistant communication between devices. Berty’s experience in off-grid communication is invaluable to Gno.land, and the team is an expert at running Go on mobile Android and iOS operating systems. For this grant, to be completed in Q4, Berty will deliver a minimal PoC of the existing apps of Gno.land running on mobile, and deliver an open-source mobile app with basic CI/CD, interacting with the Gno.land testnet. Find detailed reports and updates on Berty’s [hackerspace issue 28](https://github.com/gnolang/hackerspace/issues/28) or within their [Gnomobile blog post](https://test3.gno.land/r/gnoland/blog:p/gnomobile).\n\n### Flippando (delivery Nov 2023)\n\nFlippando is a multi-level on-chain memory game currently written in Solidity and deployed on several testnets, including Goerli, Polygon, Near, Aurora, Evmos, and a Saga chainlet. Like the classic card-based Memory game, Flippando players must match card pairs (digital tiles). When a player selects a tile, the game sends a request to the chain, which sends back the uncovered tile. If two tiles match, they remain uncovered. If they don’t match, they are flipped back until the game is won, and an NFT is generated for the winning player to prove the win. Through the development of a simple gaming app on Gno.land, we want to show how easy it is for gaming and metaverse concepts to be built. Through this grant, Flippando will port its memory game to Gno. Find detailed updates on Flippando’s [hackerspace issue 33](https://github.com/gnolang/hackerspace/issues/33).\n\n### Resident Tinkerers Program: Zack Scholl (6 months)\n\nZack Scholl is Gno.land’s first resident tinkerer with tons of experience in web2 development and a passion for the Go language. Through the grants program, Zack aims to translate his extensive knowledge to Gno and web3 by developing PoCs using Gno. So far, Zack has worked on a microblogging app for Gno.land and a prototype for using generative audio with smart contracts. He’s also creating documentation and tutorials to help other developers follow his lead. You’ll be hearing more from Zack over the coming weeks. Follow his [hackerspace issue 2](https://github.com/gnolang/hackerspace/issues/2) journey for more details.\n\nAfter a great start to the Funding and Grants Program in Q3, below is a breakdown of the percentage of funding allocated to each area of development so far:\n \n[![Funding](https://gnolang.github.io/blog/2023-10-17_funding-program-q3/src/thumbs/funding.png)](https://gnolang.github.io/blog/2023-10-17_funding-program-q3/src/funding.png)\n\n## Coming Up in Q4 and Q1 2024\n\nWe’re looking forward to more exciting developments in the coming quarters as we focus on the road to mainnet. Onbloc, one of Gno.land’s most active contributors, is currently being confirmed as a [Q4 grantee](https://github.com/gnolang/ecosystem-fund-grants/pull/4/files#diff-6dbd2e305897910e59072f9efa8c537d86f8aa281eb3742e0c150048a1df95eb) to work on core infrastructure necessary for mainnet, including tm2-js and gno-js support, GnoVM debugging, contract interactions, and leading the multi-node testnet initiative. Onbloc has already developed essential public infrastructure tools for Gno.land, including the non-custodial Adena wallet, the Gnoscan blockchain explorer, and Gnoswap decentralized exchange. The team has demonstrated immense passion and dedication in attending public developer calls and in-person events, and releasing extensive documentation, blog series, and [hackerspace issue 29](https://github.com/gnolang/hackerspace/issues/29) about their journey. \n\nOver the next two quarters, the Grants program will focus on building our tinkerer and student cohorts, and publishing more content, such as application libraries, documentation, and Gno packages. The goal is twofold: to support more users and ensure a diversified set of users on the Gno.land platform testing, debugging, troubleshooting, and running user feedback loops. We currently have two apps to reference on how to get started – GnoChess, built by the Gno core team, and Flippando, a grant recipient – we’re looking for a lot more to come. \n\nWe’re steadily building out the Gno.land platform, and our ecosystem of grantees and contributors. Let us know if you want to join us by submitting an application any time on the Funding and Grants [repository](https://github.com/gnolang/ecosystem-fund-grants). We’re opening up our second grant batch this month, and look forward to reviewing your submissions. \n","2023-10-17T13:37:00Z","christina,michelle","gnoland,funding,grants"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["gnoland-moderation-dao-module","Gno.land Moderation DAO Module","\r\n# Gno.land Moderation DAO Module\r\n*This blog post is written by the Teritori team, whose focus is to allow organizations to communicate and interact in a resilient and transparent way. Teritori is a partner and grantee of Gno.land.*\r\n\r\nWhen it comes to the complex subject of discussion forums and decentralized social networks, numerous technical and philosophical questions arise.\r\nImagining a 24/7 online communication system whose administration cannot be compromised or censored by any entity or individual is one of the most intriguing challenges of the decade.\r\nApproximately 10 months ago, the Teritori core team decided to explore the new possibilities offered by Gno.land on the theme of decentralized moderation and to build the foundation for future generations of developers to create resilient, robust, and autonomous applications.\r\n\r\n## The vision\r\n\r\n### About Teritori\r\n\r\nTeritori is a decentralized Operating System for individuals \u0026 communities that allows organizations to communicate and interact in a resilient and transparent way. Its core components include the creation of a decentralized User Profile for individuals \u0026 organizations as well as a dApp Store allowing users to pick their favorite services for daily usage and developers to list their product in order to grow their user base. Finally, Teritori backbone, its P2P messenger application that will enable users to create resilient token-gated groups in a click will even allow non-crypto-native users to get onboard as this feature doesn't even require a wallet connection to get started.\r\n\r\n### Teritori \u003c\u003e Gno.land\r\n\r\nConvinced of the benefits of offering a contribution-based consensus model and taking advantage of an interpreted version of Golang, the Teritori core team aims to become one of the most prolific contributors to Gno.land. Our plan is to focus on features that enable the coordination of organizations and individuals via governance, communications, and collaboration. Eventually, all the features listed on Teritori will be accessible in the Gno.land network, contributing to the growth of the ecosystem.\r\n\r\n### PoC and iterations\r\n\r\nAnother important point to emphasize is that the Teritori core team intends to improve the features it deploys on Gno.land by taking advantage of the user test phases to collect feedback that will enable iteration and improvement of the service. As a result, the “Proof-of-Concept” (“PoC”) presented in this article will be subject to updates and evolutions, which will be communicated in due course, as will the associated test phases.\r\n\r\n## What is the Gno Moderation Module?\r\n\r\nThe Gno Moderation Module is a smart contract (“realm”) that enables a decentralized, autonomous organization (DAO) to manage the moderation of a forum or social thread through a transparent on-chain vote.\r\n\r\n### Let’s take an example:\r\n\r\nImagine a simple social network similar to Instagram, in which all content is decentralized (using IPFS for images, videos, music etc.). For each post, users sign in via their wallet to post content, and no centralized administrator can delete this content. The freedom offered by this type of decentralized application is immense since even as developers of the application, it is impossible to delete the content. Therefore, we can consider this “space of freedom” as a “common space” unlike any application owned by a private company and hosted on centralized infrastructure.\r\nWith this radical freedom for the user comes a great responsibility— to collectively ensure the security of this space rather than delegating the responsibility to moderators employed by a commercial enterprise. This is why we’ve created the “Gno Moderation Module.”\r\n\r\n### How does it work?\r\n\r\n[![moderation_flow v0.1](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/thumbs/moderation_flow_v0.1.png)](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/moderation_flow_v0.1.png)\r\n\r\nThe Gno Moderation Module allows users to notify the moderation DAO community that they wish to report content. Through this action (permitted by the smart contract), they inform the DAO community that the content is inappropriate.\r\n\r\n[![content flag](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/thumbs/content_flag.png)](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/content_flag.png)\r\n\r\nOnce the content has been reported a certain number of times (10 times in this PoC) by users (who may or may not be members of the Moderation DAO), an on-chain proposal is automatically created.\r\n\r\n[![moderation dao feed](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/thumbs/moderation_dao_feed.png)](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/moderation_dao_feed.png)\r\n\r\nThis on-chain proposal is then listed in the Moderation DAO tab on the Social Feed as well as on the Moderation DAO profile proposals feed so all Moderation DAO members can vote on it. A debate can take place to discuss the best choice for the content.\r\n\r\n[![moderation dao vote](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/thumbs/moderation_dao_vote.png)](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/moderation_dao_vote.png)\r\n\r\nModeration DAO members have three voting options:\r\n- Ban the content in question\r\n- Abstain\r\n- Do not ban the content in question\r\n\r\nOnce the required vote quota has been reached, the contract automatically executes the voted decision.\r\n\r\n## The Current Status:\r\n\r\nThe Teritori core team received a grant from the Gno.land core team to build the necessary tools for decentralized moderation.\r\n\r\nTo accomplish this task, we divided our work into five main stages:\r\n1. Build “DAO” standards to establish the fundamental building blocks and ensure a modular approach in the long term for various tools.\r\n2. Build a “DAO” deployer that allows non-tech users to easily utilize the different standards.\r\n3. Build a customizable Moderation Module that can cater to a wide range of use cases. For example, if we replace the social feed with a service marketplace, the Moderation Module can transform into a “Justice Module” that resolves conflicts between sellers and buyers on a decentralized platform and serves as an escrow system.\r\n4. Develop the user experience that allows for large-scale experimentation with the Moderation Module within a dedicated context of an active social feed. Here, we created a social feed realm and enabled non-developer Gno.land users to participate in the full-scale experience.\r\n5. Establish interactions between smart contracts (r/boards, r/socialfeed, /r/users), conduct experiments to enhance their security, and identify emerging needs for these innovative use cases.\r\n\r\n### What does a DAO realm look like?\r\n\r\n- We decided to build two different DAO standards, using two different approaches of modularity:\r\n- Aragon DAO Standard, based on the amazing work of [the Aragon team](https://aragon.org/) (using Solidity)\r\n- [DAODAO](https://github.com/DA0-DA0) smart contract, using CosmWasm, that allows more modularity.\r\n\r\n\r\nHere is an example, with the DAODAO contract ported into Gnolang:\r\n[Source](https://testnet.gno.teritori.com/r/demo/dao_realm_v6/dao_realm.gno)\r\n\r\n```go\r\npackage dao_realm\r\n\r\nimport (\r\n\t\"encoding/base64\"\r\n\t\"std\"\r\n\t\"strings\"\r\n\t\"time\"\r\n\r\n\tdao_core \"gno.land/p/demo/daodao/core_v16\"\r\n\tdao_interfaces \"gno.land/p/demo/daodao/interfaces_v16\"\r\n\tproposal_single \"gno.land/p/demo/daodao/proposal_single_v16\"\r\n\tvoting_group \"gno.land/p/demo/daodao/voting_group_v17\"\r\n\t\"gno.land/p/demo/ujson_v5\"\r\n\t\"gno.land/r/demo/groups_v22\"\r\n\tmodboards \"gno.land/r/demo/modboards_v9\"\r\n)\r\n\r\nvar (\r\n\tdaoCore dao_interfaces.IDAOCore\r\n\tmainBoardName = \"dao_realm\"\r\n\tgroupName = mainBoardName + \"_voting_group\"\r\n\tgroupID groups.GroupID\r\n)\r\n\r\nfunc init() {\r\n\tmodboards.CreateBoard(mainBoardName)\r\n\r\n\tvotingModuleFactory := func(core dao_interfaces.IDAOCore) dao_interfaces.IVotingModule {\r\n\t\tgroupID = groups.CreateGroup(groupName)\r\n\t\tgroups.AddMember(groupID, \"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c\", 1, \"\")\r\n\t\tgroups.AddMember(groupID, \"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv\", 1, \"\")\r\n\t\tgroups.AddMember(groupID, \"g14u5eaheavy0ux4dmpykg2gvxpvqvexm9cyg58a\", 1, \"\")\r\n\t\tgroups.AddMember(groupID, \"g1ckn395mpttp0vupgtratyufdaakgh8jgkmr3ym\", 1, \"\")\r\n\t\tgroups.AddMember(groupID, std.GetOrigCaller().String(), 1, \"\")\r\n\t\treturn voting_group.NewVotingGroup(groupID)\r\n\t}\r\n\r\n\tproposalModulesFactories := []dao_interfaces.ProposalModuleFactory{\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.IProposalModule {\r\n\t\t\ttt := proposal_single.Percent(100) // 1%\r\n\t\t\ttq := proposal_single.Percent(100) // 1%\r\n\t\t\treturn proposal_single.NewDAOProposalSingle(core, \u0026proposal_single.DAOProposalSingleOpts{\r\n\t\t\t\tMaxVotingPeriod: time.Hour * 24 * 42,\r\n\t\t\t\tThreshold: proposal_single.Threshold{ThresholdQuorum: \u0026proposal_single.ThresholdQuorum{\r\n\t\t\t\t\tThreshold: proposal_single.PercentageThreshold{Percent: \u0026tt},\r\n\t\t\t\t\tQuorum: proposal_single.PercentageThreshold{Percent: \u0026tq},\r\n\t\t\t\t}},\r\n\t\t\t})\r\n\t\t},\r\n\t}\r\n\r\n\tmessageHandlersFactories := []dao_interfaces.MessageHandlerFactory{\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\treturn groups.NewAddMemberHandler()\r\n\t\t},\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\treturn groups.NewDeleteMemberHandler()\r\n\t\t},\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\t// TODO: add a router to support multiple proposal modules\r\n\t\t\tpropMod := core.ProposalModules()[0]\r\n\t\t\treturn proposal_single.NewUpdateSettingsHandler(propMod.Module.(*proposal_single.DAOProposalSingle))\r\n\t\t},\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\treturn modboards.NewCreateBoardHandler()\r\n\t\t},\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\treturn modboards.NewDeletePostHandler()\r\n\t\t},\r\n\t}\r\n\r\n\tdaoCore = dao_core.NewDAOCore(votingModuleFactory, proposalModulesFactories, messageHandlersFactories)\r\n}\r\n\r\nfunc Render(path string) string {\r\n\treturn \"[[board](/r/demo/modboards:\" + mainBoardName + \")]\\n\\n\" + daoCore.Render(path)\r\n}\r\n\r\nfunc VoteJSON(moduleIndex int, proposalID int, voteJSON string) {\r\n\tmodule := dao_core.GetProposalModule(daoCore, moduleIndex)\r\n\tif !module.Enabled {\r\n\t\tpanic(\"proposal module is not enabled\")\r\n\t}\r\n\tmodule.Module.VoteJSON(proposalID, voteJSON)\r\n}\r\n\r\nfunc Execute(moduleIndex int, proposalID int) {\r\n\tmodule := dao_core.GetProposalModule(daoCore, moduleIndex)\r\n\tif !module.Enabled {\r\n\t\tpanic(\"proposal module is not enabled\")\r\n\t}\r\n\tmodule.Module.Execute(proposalID)\r\n}\r\n\r\nfunc ProposeJSON(moduleIndex int, proposalJSON string) {\r\n\tmodule := dao_core.GetProposalModule(daoCore, moduleIndex)\r\n\tif !module.Enabled {\r\n\t\tpanic(\"proposal module is not enabled\")\r\n\t}\r\n\tmodule.Module.ProposeJSON(proposalJSON)\r\n}\r\n\r\nfunc getProposalsJSON(moduleIndex int, limit int, startAfter string, reverse bool) string {\r\n\tmodule := dao_core.GetProposalModule(daoCore, moduleIndex)\r\n\treturn module.Module.ProposalsJSON(limit, startAfter, reverse)\r\n}\r\n```\r\n\r\n### Public Grant Report:\r\n\r\nYou can find the full report of [Teritori Core’s journey here](https://github.com/gnolang/hackerspace/issues/7). \r\n\r\n### Resources:\r\n\r\nDocumentation:\r\n- [Gno Moderation DAO](https://github.com/TERITORI/gno/blob/teritori-unified/examples/gno.land/r/demo/teritori/MODERATION_DAO.md)\r\n\r\nPackages:\r\n- [https://testnet.gno.teritori.com/r/demo/groups_v22](https://testnet.gno.teritori.com/r/demo/groups_v22)\r\n- [https://testnet.gno.teritori.com/p/demo/daodao/interfaces_v16](https://testnet.gno.teritori.com/p/demo/daodao/interfaces_v16)\r\n\r\nTutorial:\r\n- [Gno.land Social Feed Moderation on Teritori](https://teritori.gitbook.io/teritori-whitepaper/gno.land/introducing-gno.land-social-feed-v0.1#social-feed-moderation)\r\n","2023-10-19T01:50:00Z","ferrymangmi,zxxma,michelleellen","gnoland,dao,moderation,teritori"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["wyg-dongwon-shin","Who You Gno – On the Record with Dongwon Shin","\n*Who You Gno is intended to shine a light on the builders, contributors, and generally brilliant humans behind the tech. We’re excited to kick off this series with Dongwon Shin, the co-founder and CEO of one of Gno.land’s longest-contributing teams, Onbloc, a South Korean-based blockchain software company that builds key infrastructure and tooling for Gno.land*\n\nSince embarking on their Gno journey in late 2021, Dongwon and his team have been among the most active gnomes embodying the values of the Gno project: hardworking, passionate, honest, and humble, to name a few. You may already be familiar with Onbloc’s projects [Adena](https://adena.app/), [Gnoscan](https://gnoscan.io/), and [Gnoswap](https://github.com/gnoswap-labs) more about this can be found in [Onbloc's Hackerspace journey](https://github.com/gnolang/hackerspace/issues/29). In this interview, we’ll get the latest updates on these projects, hear about Dongwon the person, and learn more about what motivates him to be a gnome. Check it out.\n\n## Dongwon’s life before coding\nIt’s a cold November morning in Seoul, and Dongwon is in the office early after sleeping just a few hours. Speaking to him from Dubai, where “cool” is 30 ℃, it’s -1 ℃ in Korea. “I hope you’re keeping warm,” I smile, “Yeah,\" he laughs, “it’s not too bad.” Dongwon’s been in the industry since 2015 when web3 was still called “crypto,” ICOs were selling snake oil, and his compatriots were busy paying above the market price for bitcoin in a phenomenon called the “Kimchi premium.”\n\nAt the time, he was traveling the world as a professional e-sports gamer which saw him leaving Korea and living in San Francisco and L.A. for several years. “I had lots of tournaments to compete in, so I had to travel to many other countries,” he says, “while traveling, I learned about other cultures and people, and new experiences. It was really eye-opening, you know, it really helped make me who I am today.”\n\nAnd who is Dongwon today? \n\nAmbitious, driven, and one of the kindest, most genuine people you could ever meet. “I like challenges, and I’m very competitive,” he says. “I can't just do regular jobs. I get bored quickly, so I need to find something very competitive and hard that makes me stressed.” I point out that he’s in the right place, and he laughs. He explains that he used to spend an entire week, sometimes two, learning a game before a tournament, almost around the clock. “I had to put everything I have into winning that game, right?” He views working in web3 the same way.\n\n## The intersection between e-gaming and blockchain\nDongwong is clearly comfortable on the cutting edge in emerging industries that “are often looked down on,” like e-gaming and crypto. He takes great satisfaction in how they’ve both grown. “My parents were saying, 'Just go study,' while I was playing games, but e-sports has grown a lot. Right now, the industry is really big, and it's kind of the same with crypto.” He adds, “I like getting in early when other people are not interested and finding an opportunity there.”\n\nWhen looking to retire as a professional gamer, he found his home right away in web3, working with a blockchain consultant and the sports and entertainment-focused [Chiliz project](https://www.chiliz.com/), before launching his own blockchain consulting and development firm. “I didn't think I was going to be just a regular employee for a big company. So I wanted to start my own business,” he says.\n\n## Getting to Gno… Gno.land\nHow did Dongwon hear about Gno.land? \n\n“My co-founder, Peter, and I were long-time followers of the Cosmos ecosystem, and we found out that Jae was working on a new project called Gno.land in late 2021. We really liked the vision behind Gno.land, why he started, and what he wants to achieve. We value transparency, fairness, and censorship resistance, so we read all the documentation and his initial codebase and decided we should be part of his new initiative. We started Onbloc in early 2022.”\n\nDongwon didn’t know Jae personally, but he felt strongly aligned with his vision and what Gno.land aims to achieve. Also, his reputation as the founder of Tendermint and Cosmos preceded him. Dongwon’s co-founder, Peter, was also working on a project called Lunagram, a Cosmos wallet integrated with Telegram. Peter had fond memories of Jae, being very supportive of experimental projects, including his own, in the early days of Cosmos.\n\n## Building tools… Adena, Gnoscan, Gnoswap\nOnbloc has since become Gno.land’s most prolific contributor, launching the [Gnoscan](https://gnoscan.io/) block explorer and the [Adena](https://adena.app/) wallet, as well as creating tutorials and blogs to help onboard developers to Gno, and creating Gno.land’s first AMM DEX Gnoswap, the beta version of which is estimated for December this year. “Currently, the team is focused on developing Gnoswap, integrating [the realms and APIs](https://github.com/gnoswap-labs/gnoswap) with [the interface](https://github.com/gnoswap-labs/gnoswap-interface), enhancing the swap function and liquidity pools, and some additional features. We expect to launch the beta in about a month, so we’re quite excited!”\n\nAs for Adena, the defacto Gno.land wallet, “It's already production-ready, but we want to improve our UX, and UI to provide more secure ways of using a web3 wallet.” To achieve this, Onbloc is adding a feature called [Air-Gap](https://en.wikipedia.org/wiki/Air_gap_(networking)) which allows the wallet to be used in an offline environment, without the user needing to import their keys to Adena. “They can just use Adena as a broadcaster,” Dongwon explains. “I think this kind of feature is needed for enhancing security and educating people to use noncustodial products in a secure way.”\n\nOnbloc is also a [Q4 2023 grantee](https://test3.gno.land/r/gnoland/blog:p/funding-program-23q3) and will develop core Gno.land infrastructure in preparation for mainnet. “We are working on three key features,” Dongwon explains. “The first is contract interaction. So it's a way for a realm to interact with other realms. The second is porting essential Go packages to Gno, and the third is a multi-node testnet.” All in addition to Onbloc’s continued efforts on Gnoswap, Gnoscan, and Adena. “You’re keeping busy, then?” I ask. “All our hands are full now,” he laughs.\nI ask what he does in his free time and – in fact – whether he has any. “Not much,” he jokes, “but I like spending time with my son and playing board games together. He’s seven years old, and we are like friends.” Dongwon also likes to unwind by reading books when his son is asleep. One of his favorites is [*The Secret*](https://en.wikipedia.org/wiki/The_Secret_(Byrne_book)); he was “really inspired by the concept” when he was younger. I ask if he sees it working in his daily life and whether he believes he manifests what he wants into existence, “Definitely,” he replies without hesitation.\n\n## Dongwon’s conviction in Gno.land\nNot only is Dongwon working night and day, but he has bootstrapped his team from his own pocket to go all in on Gno.land. What makes his conviction so strong? “I truly believe that the Gno.land blockchain is the next generation of the blockchain industry. Gno.land is trying to invite web2 developers into web3 and providing all these developer-friendly tools so they don't need to learn a new language to get into the ecosystem. GnoVM, Tendermint2, everything is so transparent and simple.”\nHe believes Gno.land will be “one of the greatest experiments in the crypto industry” thanks to its fair rewards and contribution-based governance. “I'm really excited about this initiative, and all our team members are well-aligned to support this vision. We want to do our part to achieve the success of Gno.land.”\n\nI thank him for his time and ask if there’s anything he would like to add. He pauses for a moment and then says, “If you're building a dApp or looking for a new opportunity in a new ecosystem, I think this is your chance. I hope to see great developers and teams getting into Gno.land. Let’s make this ecosystem great together.”\n","2023-11-24T00:00:00Z","christina","whoyougno,onbloc,community,interview"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-6","The More You Gno: Gno.land Monthly Updates - 6","\n\nWelcome to the latest edition of The More You Gno, your regular source of updates from the Gno.land core team and contributor ecosystem. There’s a lot to cover this month, from a company engineering retreat to new core members and contributors. We’ve made progress across the board to fix important bugs and issues and provide additional features. There’s a new way to dynamically call realms, Gno.land’s tokenomics and governance are advancing, our standard library list is expanding, and our grantees are killing it with their deliverables. Without further ado, let’s dive in.\n\n## Gno Core Team Updates - TL;DR\n\nOnly got time to skim the updates? You’ll find the highlights in the list below. If you want to dive deeper into the topics, track our progress, understand the rationale behind our decisions, or explore the issues we came across, grab a coffee, kick back, and savor the full details.\n\n* **The Portal Loop** – Much of our focus over the past few months has been on the Portal Loop [(issue 1108)](https://github.com/gnolang/gno/issues/1108), which will make developing on Gno smoother, faster, and more intuitive. The Portal Loop will speed up deploying dApps and improve the UX for Gno.land devs.\n\n* **Dynamic Realm Caller** – We’ve added a new way to call realms dynamically so that dApps no longer have to manually import GRC20/721 tokens [(PR 1262)](https://github.com/gnolang/gno/pull/1262).\n\n* **DAO Structure \u0026 Tokenomics** – We’re close to finalizing the DAO structure of Gno.land and its tokenomics. There will be three main DAOs, GovDAO, EvaluationDAO, and SupportDAO. We’re exploring staking options for GNOT holders and working on transaction fees and gas.\n\n* **Gno Playground** – Gno Playground is an awesome way for developers to collaborate, share, and test their code. The full version isn’t ready yet, but we’re sharing the beta with anyone who wants to help us iterate and improve this week.\n\n* **Gno Standard Libraries** – In [issue 1267](https://github.com/gnolang/gno/issues/1267), you can find our current wishlist for Gno standard libraries. If you want to see what we have and what’s lacking, or you want to contribute, open an issue or a PR.\n\n* **Gno Language Server (Gnols)** – An implementation of the [Language Server Protocol (LSP)](https://microsoft.github.io/language-server-protocol/) for Gno, Gnols makes writing code simpler and works with several editors. Visit the [CONTRIBUTING.md file](https://github.com/gnolang/gno/blob/master/CONTRIBUTING.md#vim-support-with-lsp) to try it out.\n\n* **RustVM Implementation** – The RustVM implementation is almost ready and is in the debugging stages. We’re also looking at adding a Jit compiler and researching the topics of determinism and concurrency.\n\n* **Bytecode Go VM Implementation** – The Parscan project is progressing well toward completion of the spec. We look to provide support for interfaces in the interpreter by extending the standard reflect package, also to the benefit of the entire Go community.\n\n### Engineering Retreat\nGno core engineering team got together last month in our first company-wide retreat. It was an invaluable opportunity to work face-to-face, brainstorm ideas, code together, and fix several high-level concerns. We made many improvements to the technical aspects of the project, including major advances on the Portal Loop, and strengthened our alignment through team bonding activities, socializing, and having fun. \n\nWe made multiple bug fixes and resolved many of the issues that arose out of [GnoChess](https://github.com/gnolang/gnochess) development, and Manfred and the Onbloc team (who joined us on the retreat) demonstrated a new way to dynamically call contracts using dependency injection with a registry. This, combined with Golang's interface capabilities, can achieve a good balance between dynamism, explicitness, and security (including type safety). This pattern could enable massive DeFi applications when used with GRC interfaces. It could also support contract-based DAOs where features can be added later, opening the door to new design patterns around contract upgrades. Check out [PR 1262](https://github.com/gnolang/gno/pull/1262) for more details. \n\nIt was invaluable for everyone to get plenty of 1:1 time with Jae. Morgan was able to bring the Native Bindings topic ([PR 859](https://github.com/gnolang/gno/pull/859)) much closer to completion. This has been a recurring theme in our developer calls for the last few months as it’s a complex topic that aims to change how Gno can use Go code while still being understood by static analysis tools like gno doc. Michael got greater clarity over the DAO structure and GNOT tokenomics, Milos was able to merge [PR 546](https://github.com/gnolang/gno/pull/546), after many months of effort, which adds file-based transaction indexing, and Thomas created instructions for getting started with the Gno Language Server (gnols), to give just some examples. It was productive and enjoyable and unblocked many issues. \n\nAiB engineers were also at the retreat, Zooma from Teritori, and Dongwon, ByeongJun, and Ray from Onbloc, creating plenty of opportunities for interesting discussions and showcasing our work. We also welcomed new core members Dylan and Danny to the team. Dylan is a senior software engineer, and Danny is supporting DevEx. We enjoyed meeting and hacking together with like-minded people and would like to do it more often with a broader audience. How about a Gnome contributor festival next year? Stay tuned.\n\n### Gno.land DAOs and Tokenomics\nThroughout the retreat and ongoing, we’ve made major advances to the DAO structure for Gno.land and the tokenomics of the chain. We’re still hammering out the final details, but we’ve decided on three main DAOs – GovDAO, EvaluationDAO, and SupportDAO – that will work together alongside other domain-specific DAOs, such as EngineeringDAO or ProjectsDAO, making Gno.land more decentralized over time. \n\nThe multi-tiered GovDAO will be responsible for voting on all decisions that affect the chain, such as parameter changes or validator acceptance/denial. GovDAO members will assess new contributors to the chain and allocate them a score and corresponding membership tier. EvaluationDAO will assist with specific contributions, lending its expertise and critic reviews as needed. SupportDAO will provide knowledge-specific services such as HR, marketing, and finance.\n\nRegarding transaction fees, we're exploring something similar to how Ethereum deals with gas in its EIP 1559 update. Essentially, a combination of comparing a new block’s size with the last block to gauge demand and some small parameters we’re looking at. We’re also experimenting with staking alternatives where contributors can stake their tokens to support certain projects in return for staking rewards. It’s still early days, so watch this space. We’ll be releasing more details soon. \n\n### Gno Playground\nGno Playground is a simple web interface that lets you share your code, run unit tests, deploy your realm and package, and execute functions in your code using the repo for a smoother and more collaborative developer experience. We’re excited to release Gno Playground out in the wild later this month in a soft launch set for November 28. If you’re interested in testing it out, head over to our Discord channel. We’re looking for feedback and help to identify bugs and improve the UX before its full launch in the new year. It will be interesting to see how people interact with the Playground and how they use it so we can iterate and attract more gnomes to our growing community.\n\n### The Portal Loop\nThe Portal Loop is an effort to create a continuously-deployed staging testnet to be hosted on the official [gno.land website](https://gno.land). The testnet will be reset at each commit on our repository, but it will re-play all the transactions from its previous version, dropping any that might fail following breaking changes in the code. The Portal Loop will provide a central place where you can experiment with the latest Gno.land updates, resolving the problem our existing testnets have faced (becoming stale only a few months after their launch) while also paving the way for building DAOs and on-chain Game of Realms and Proof-of-Contribution systems. \n\nWithin the Portal Loop efforts, we’re also building systems to more efficiently iterate locally on your Gno realms, similar to the previously described testnet. The Portal Loop will help to create an iterative cycle focused on development, testing, and feedback, enhancing local development and the Gno.land website. As developers are discovering, when building dApps like GnoChess, GnoMobile, or Flippando, they run into issues with the repo, GnoVM, and client libraries when developing locally.\n\nThe Portal Loop will enable much quicker feedback so we can iterate, uncover, and fix problems faster. Devs will get a greatly improved UI, with UX contributions and issues much easier to resolve, and the same CI/CD experience as web2 applications, where each time something is published on Git, they get instant feedback on how it works in staging, not only in terms of code but also in terms of data. Stay tuned, the Portal Loop is coming soon!\n\n### Standard Library Wish List\nThe standard library wish list in [issue 1267](https://github.com/gnolang/gno/issues/1267) is intended to be a starting place for anyone who wants to add new standard libraries to Gno. It's an opinionated collection of libraries that we would like to see added. So, if you see something missing that you’d like added to our standard libraries, leave a comment explaining your reasoning. If you want to port over a standard library from the list, make an issue for it and assign yourself, or if you can do it quickly, make a PR referencing the issue. You can see the global status of our standard libraries (as compared to Go) on our [Go\u003c\u003eGno compatibility document](https://github.com/gnolang/gno/blob/d421b963aed7f7c3ba3718edfc6fbd787fa8f0dd/docs/reference/go-gno-compatibility.md).\n\n### Dreaming with SOGNO\nThe Sogno project is a [dream](https://www.wordreference.com/iten/Sogno) Morgan has about improvements he plans to make on GnoVM. From his experience working on GnoChess, he found that many features were lacking that would have improved the workflow, for example, an improved debugging system, enhanced representation of the values within the VM, having maps as sortable data structures, and adding reflection. Morgan plans to work on this project on the side as a fork when he has time, so Sogno won’t be merged into the master branch for now. If you want to check it out and see if you can contribute, visit the [hackerspace PR 44](https://github.com/gnolang/hackerspace/pull/44).\n\n### The Future of the Gno Language Server (Gnols)\nThe [Gno Language Server (gnols)](https://github.com/gno-playground/gnols) is an implementation of the [Language Server Protocol (LSP)](https://microsoft.github.io/language-server-protocol/) for the Gno programming language. It is similar to the equivalent “gopls” project for Go, as they can be plugged into your code editor through extensions and allow you to access handy features, such as autocompletion, formatting, and compile-time warnings/errors. Gnols makes writing code simpler, working with several editors to suit your preferences. To try it out, visit the [CONTRIBUTING.md file](https://github.com/gnolang/gno/blob/master/CONTRIBUTING.md#vim-support-with-lsp), which contains instructions to get you started. Our current documentation targets Vim, Neovim, and SublimeText, but can likely be used with any editor that supports LSP. Feel free to contribute to improving Gnols and adding more features. It’s well-written, and simple to dive into the code and add more capabilities.\n\n### RustVM Implementation\nPetar continues progressing on the RustVM implementation and has almost finished, apart from a few bug fixes. As the design is now complete, he will enter the testing stages. He is also looking at how to add a Jit compiler to the current design. Petar was initially concerned that the garbage collector might have presented serious issues, but this has turned out not to present a problem. Adding a Jit compiler will require a lot of work (at least six months) to support everything in the language, but it should be possible.\n\nPetar is also looking at implementing concurrency the way it is in Go to have a fully functional virtual machine as it is in the spec. This would likely attract more external contributors to developing the VM. One advantage of Rust is that, with the concurrency model, there is already an extensive library called [Tokio](https://tokio.rs/) which he can use. Petar stresses that this isn’t easy, but he believes it’s achievable, at least as a research topic around determinism and concurrency.\n\n### Go Bytecode VM Implementation\nMarc continues to develop Parscan, another bytecode VM, but entirely based on the Go runtime, with the advantage of reusing the type-checking system, concurrency model, and memory management already part of the existing Go runtime. In the last month, the support for all missing declaration statements (constants, variables, and types) was added in the code generator.\n\n## Grantee and Ecosystem Updates\nOur ecosystem partners and grantees are working flat out on their contributions. We’re close to seeing the on-chain memory game Flippando launch, Adena and Gnoswap are incorporating some major new features, Zack’s released another informative tutorial as part of the Go to Gno series, and we’ve received several new grant proposals as well. We’ve even welcomed a new contributing team, Varmeta, to the fold. Scroll through the details below.\nTL;DR?\n* On-chain memory game Flippando is coming soon\n* Gnomobile is almost complete and will be receiving a rebrand soon\n* Gnosocial will allow devs to experiment with social media dApps\n* Experiment with content moderation using the ModerationDAO or create your own DAO\n* Gnoswap AMM DEX beta will launch in December\n* Adena to implement new ‘Air-Gap’ feature\n* Varmeta is working on Gno.land Unity SDK to make Gno more accessible to game developers\n\n### Dragos\nDragos has been working on porting his on-chain memory game Flippando from Solidity to Gno, and we’re looking forward to playing it soon after seeing an awesome demo earlier this month. When you play Flippando, you uncover a matrix of matching visual symbols. There are 2 levels of difficulty (matrix made of 16 tiles or 64 tiles). For the launch, Dragos aims to have visual symbols containing basic colors, dice, hexagrams, or various gradients. Once you’ve matched all the pairs and completed a matrix, you mint an NFT that can be assembled as artwork on-chain and traded in a marketplace. Dragos is currently looking at the initial tokenomics for Flippando, with a fixed supply of 1 billion and no airdrop distribution (more details soon). \n\nDragos has been a mobile app developer for over 10 years, with an interest in blockchain for around seven years. He enjoys working with Gno, although having to reset the chain and redeploy programs each time he makes a change was a challenge. The Portal Loop solves these issues in local development and will allow him to deploy Flippando sooner. As part of the work for Flippando, Dragos also added [PR 1309](https://github.com/gnolang/gno/pull/1309) to improve our GRC721 implementation]. He is also applying for a grant to port his project management system on-chain for Gno, and he gave us a [demo](https://drive.google.com/file/d/1eJGyATHhEzletWwQ4Xt_9ON7L231Yvow/view). An on-chain project management tool will be essential for organizing the DAO system, focusing on our team’s needs, organizing tasks, setting goals, and more. Keep up with Dragos’ progress by visiting his [hackerspace](https://github.com/gnolang/hackerspace/issues/33).\n\n### Berty\nBerty has been powering ahead with Gnomobile (which will soon receive a new name to better reflect its functionality), Gnosocial, and Gno core. Some highlights include significant progress on the GRPC interface (see [demo video]https://www.loom.com/share/d1cef60199c0487e86deab2a9e61d61c). As the interface to Protobuf has many more data types available than the interface to the language bridge, GRPC greatly simplifies the app and improves the UX. The API is almost complete and now includes wallet functions, such as creating an account and restoring an account from the recovery phase, and an event stream when calling a realm function [(demo video available here)](https://www.loom.com/share/42f2dcb0b4a34f77a95a0f8012e4b52b).To help developers, Gnomobile also includes example apps. Here is a [demo video](https://www.loom.com/share/41a20a764f0f4caf91f068b62e1f16c4) of the latest minimal hello app.\n\nBerty created [PR 1235](https://github.com/gnolang/gno/pull/1235) relating to Amino. They start with a Go struct and add comments explaining all the fields. Previously, when they ran Amino and generated a Protobuf structure, all their comments disappeared. This PR allows them to preserve the comments. They also created [PR 1213](https://github.com/gnolang/gno/pull/1213) since Amino should create a Protobuf structure where the fields follow official naming conventions. Thanks to help from the Gno devs, these PRs are merged.\nBerty is also focused on building a decentralized social media application using the Gnomobile framework, which is almost complete. The aim is to create a testbed where dApp builders can see how their implementations integrate and function with web2-like social media features, opening the door to interesting experiments such as DAO collaboration and content modification. Berty is building a decentralized Twitter-like application and plans to finish it in six months. Check their progress on their [hackerspace here](https://github.com/gnolang/hackerspace/issues/28) and look for more upcoming demos.\n\n### Teritori\nTeritori has been focusing on Escrows in the past couple of months, aiming to make improvements that facilitate on-chain project management. The team is also iterating the Moderation DAO and has identified a need for a conflict solver module to call an external authority to solve a conflict between two parties (for example, the buyer and the seller). They have called this module the Conflict Solver Module and integrated several options like Justice DAO (composed of humans) or any realms (e.g. GnoChess) to solve the conflict. They are researching work on VRF to implement randomness so that the module selects a person (or group of people) with no conflicts of interest in the issue. [PR 11](https://github.com/TERITORI/gno/pull/11/files) provides more details. A true randomness function will also be handy for the Flippando game that doesn’t currently rely on true randomness. \n\nIn other news from Teritori, the moderation DAO is live! You can head to the [Teritori site](https://app.teritori.com/feed?network=gno-teritori) to play around with it and even try deploying your own DAO, creating a user profile, and adding a social feed. The team has deployed V1 of a “Soundcloud-like” app on the [Gnosocial feed](https://app.teritori.com/feed?network=gno-teritori) in which you can listen to music while browsing features, publish your own music as an artist that appears on your profile, comment on tracks, tip artists, and more. Keep updated with Teritori on their [hackerspace here](https://github.com/gnolang/hackerspace/issues/7).\n\n### Zack Scholl\nOur resident tinkerer Zack gave a workshop last month as part of his “Go to Gno” series called [Go to Gno: ByteBeat - Generating Audio with Smart Contracts](https://www.youtube.com/watch?v=lmmUIEHhdqA). This is a really interesting tutorial on how to build Bytebeat (a minimal programming language for synthesized music) with smart contracts and follows on from his microblogging workshop. Be sure to check it out. If you want to hear more about Zack, you can also watch [Getting to Gno with Zack Scholl](https://www.youtube.com/watch?v=LgXa7QCdxdA\u0026t=1258s), a Fireside Chat series that talks about contributors’ work, lives, and motivations to be on the Gno.land journey with us.\n\n### Onbloc\nAs always, the Onbloc team has been busy! Over the past few weeks, they have been working on extending the functionality of Gnoswap, integrating APIs and realms with the interface, improving the governance page UI, and integrating the Adena wallet. Onbloc expects to launch the beta of Gnoswap next month, and we’re super excited to see it in action. To improve the UX and UI of Adena and make the wallet even more secure, the team is implementing a feature called Air-Gap which allows the wallet to broadcast transactions signed from an offline environment without the user needing to import their keys to Adena. Onbloc has also started a discussion around ideas to improve the usability of QR Codes for secure data transmissions between offline signers and watch-only wallets in [Issue 1375](https://github.com/gnolang/gno/issues/1375). We’ll keep you updated on the work here. You can also find more information on Onbloc’s [informative blog](https://medium.com/onbloc). \n\nAs well as developing core tooling for Gno, Onbloc is working on Gno core to help us build important functionality. The team welcomed a new hire, Lee ByeongJun as a core engineer and to help with work on three core areas: contract interaction (enabling realms to interact with other realms), the multinode testnet, and porting essential Go packages to Gno. You can find more details and keep track of everything Onbloc is working on in their [hackerspace issue here](https://github.com/gnolang/hackerspace/issues/29).\n\n### Varmeta\nWe’re excited to welcome a new contributor Varmeta to Gno.land. Varmeta was founded in 2020 to focus on blockchain and virtual reality/augmented reality technologies and has grown from a team of three to over 40 engineers. Varmeta is excited by the vision behind Gno.land and its philosophy for rewarding developers. The team is committed to supporting Gno’s success by providing various applications for the ecosystem, starting with the Gno.land Unity SDK to make blockchain more accessible to game developers. Track Varmeta’s progress on their [hackerspace here](https://github.com/gnolang/hackerspace/issues/43).\n\n### Gno @ Devconnect Istanbul 2023\nGno.land core team members organized a small, unofficial meetup in Istanbul during Devconnect week from November 13-17. The engineering-focused meetup was accompanied by a Happy Hour and snacks, where attendees got the chance to learn about Gno.land in an informal way and how they can easily develop dApps in Gno, as well as contribute to the project.\n\nThat's all for now! Be sure to check back again with us for the next edition of The More You Gno to keep up with all our progress. Do you want to contribute to Gno.land's monthly updates? If you're building on Gno.land and want to highlight your development, project, event, or idea, let us know, and we'll include your contribution.","2023-11-29T00:00:00Z","christina","gnoland,ecosystem,updates,gnovm,tm2"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["bgl-poc1","Building Gno.land – Next Generation Smart Contract System","\n\n*Disclaimer: The Building Gno.land series aims to share the core concepts of our platform, mission, and tech stack, providing a snapshot of a current state on our builder’s journey. New episodes may deprecate previous ones, but no editions will be modified at any time. We encourage you to follow along as we create the rails for a more transparent and accountable society, and we welcome feedback and contributions to the repo.*\n\n## I. What Is Proof of Contribution (PoC)?\n\nGno.land is secured by a novel consensus mechanism that makes our platform unique—Proof of Contribution (PoC). PoC prioritizes fairness and merit, rewarding the people most active on the platform and revolutionizing the concept of open-source rewards. By removing the voting power associated with being wealthy (holding tokens in Proof-of-Stake (PoS) networks or amassing mining hardware in Proof-of-Work (PoW) networks), PoC restructures the financial incentives that tend to corrupt blockchain projects in the long run and rewards contributors fairly for their work based on their expertise, commitment, and values. \n\nGno.land contributors receive rewards and voting power according to their contribution level. These rewards increase as they make additional contributions, gain expertise, and are promoted up the Gno.land governing DAO’s (GovDAO) tier levels by higher-level contributors. So how does PoC work, what are its core features, and how does it lend security and decentralization to the platform? \n\n### Prioritizing Fairness and Alignment \n\nProof of Stake (PoS) was a monumental leap forward for the blockchain industry, solving the energy-intensive requirements of Proof of Work (PoW) and enabling blockchains to scale for broader adoption (thanks to its minimal carbon footprint and faster throughput). However, like PoW, PoS has some disadvantages. For example, in PoS networks, participants receive rewards based on how many tokens they stake, which means their incentives for working on the chain are often purely financial. Validators accumulate vast net worths and don’t always hold values that align with the core development of the chain. \n\nSince validators are crucial in securing PoS networks, they should be paid fairly for their work and encouraged to contribute more. However, validators should not be purely financially (and certainly not politically) motivated, taking up competing positions and launching political campaigns to convince token holders to stake with them. This type of lobbying affects all aspects of the chain’s development—from governance to technical upgrades—and can lead to factionalism and misalignment. \n\nPoC makes the system fairer and more sustainable, ensuring participants are aligned and take actions that benefit the Gno.land community and the broader ecosystem. That’s why (unlike PoS) contributors receive rewards based on their contribution effort (tier level) rather than how many tokens they stake. They are thus incentivized and recognized for the quality of their work, ideas, and alignment, driving participation and active engagement. Governance is allocated to the people most likely to care for the ecosystem’s long-term success—the contributors who have spent the most time working toward it—from open-source developers to video creators and everyone in between.\n\n### Rethinking Financial Incentives \n\nFor long-term security and sustainability, PoC emphasizes project principles and values over monetary gains, replacing standard token incentives with a system that separates voting power from token ownership. Two reward systems are currently being considered (in addition to a hybrid system). For the first, contributors receive WORX units that weigh the amount of GNOT tokens (the native Gno.land gas token) earned each month. Each member of the same tier receives the same amount of WORX. At the end of the month, the total each member earned is divided by the total amount of WORX distributed that month to calculate a percentage. This percentage represents the percentage of Gno.land fees earmarked for contributors that each member will earn in GNOT. WORX will likely be cleared each month to prevent cumulative, exponential reward exploits over long periods of time. \n\nFor the second, each tier level simply receives an amount of GNOT each month fixed to a USD value, similar to a salary. This would be combined with risk management and caps per tier level in order to promote long-term sustainability based on Gno.land fee generation. A hybrid of this system is also possible, either rewarding contributors of lower tiers one way and higher tiers the other or using both systems in tandem based on predefined conditions. This will be explored further in future tokenomics articles, models, and documentation.\n\nRegardless, WORX units are not transferable, will not be listed on exchanges, and hold no monetary value. WORX units are more like shares that represent value provided by contributors and allow their work to be quantified compared to other contributors/tier levels. It’s important to stress that GNOT tokens do not influence governance on the platform in any way. Voting power is earned through contributions and distributed according to contribution effort, with each member of the same tier representing equal voting power that increases with their tier level. This creates a network of highly aligned contributors who care deeply about the platform they are building and strive to improve it.\n\nGNOT, the native Gno.land gas token and the gas token of the Gno.land ecosystem, will be distributed via airdrop to qualifying ATOM stakers. It will also be available for purchase after that point (*more on Gno.land’s airdrop and tokenomics coming soon*). GNOT is used to pay all fees associated with the network and beyond, including transfers, IBC, ICS, and contract interactions, giving holders the chance to earn rewards from the economic activities of Gno.land.\n\n### What Makes a Good Contribution?\n\nWORX and/or GNOT can be earned through different types of contributions—not only coding and development expertise—but also through non-technical contributions, such as community building, governance involvement, constitutional proposals, teamwork, media creation, etc. The core focus is on alignment, not necessarily specific tasks. For example, an accepted proposal or merged code will raise or at least maintain the contributor’s tier level, allowing them to receive rewards during their time working between submissions. However, a proposal or code that has displayed a very high level of effort, detail, and aligned values (but is not merged) will also be considered in any proposals regarding contributor promotion.\n\nThis system allows the ecosystem to show appreciation for diverse forms of contributions and ‘useful failures’ that bring us closer to the solutions we adopt. It is designed to foster engagement, creativity, and collaboration while encouraging anyone aligned to contribute to growing the Gno.land chain and community. \n\n### How Are Contributions Assessed?\n\nThere is a strong human element to deciding what makes a good contribution, requiring knowledgeable human judges to exercise discretion. As such, contributions won’t be templated by default or rewarded automatically but assessed through Gno.land’s governing DAO, GovDAO. GovDAO is responsible for development and governance and is organized into tiers, as discussed above.\n\nGovDAO members review, measure, and curate contributions, and the tokenomics of GovDAO incentivizes members to be effective and unbiased evaluators. They engage in discussions and assess contributions based on effort, time, and other relevant factors/metrics that contributors will have stored in their profiles. The decision-making rationale is transparent and visible through on-chain forums. Again, contributors are assigned a tier level and receive a corresponding reward each month according to their tier. As contributors join GovDAO, the DAO grows, giving Gno.land decentralization efficiency and a high Satoshi score. \n\nGovDAO is assisted by a network of knowledge-specific DAOs, such as an Engineering DAO, a Support DAO, an Operations DAO, and the EvaluationDAO, which comprises a trusted group of high-reputation contributors that help assess specific contributions. This enables secure collaboration and seamless integration (*more on Gno.land’s network of interconnected DAOs coming soon*.) \n\n### Sybil-Resistant and Secure\n\nIn addition to being fairer, more aligned, and sustainable, PoC is Sybil-resistant by design. In blockchains, a Sybil attack is where one or multiple attackers multiply their presence and influence by creating fake identities to sway major network decisions (for example, including malicious blocks). In terms of PoS, the Sybil resistance is purely monetary (people need to stake real money to get power), so an attacker that wants to carry out a Sybil attack on a PoS network needs to lock at least as much stake as that locked by honest validators.\n\nPoC minimizes risks of Sybil attacks, takeovers, and alliances as the community vets every person who is given any power or sway in the network (including validator power) through the DAO, so at no point can anyone \"spoof\" identities and regain major sway. Moreover, Gno.land is built and secured by the merit and effort put into the project, as opposed to how many tokens someone can buy, rethinking financial incentives and making the platform Sybil-resistant and secure.\n\nThrough fairer rewards, restructured incentives, resistance to corruption and Sybil attacks, and a strong appreciation for all contributions, Gno.land is designed to be sustainable and fair. A censorship-resistant platform built, owned, and secured by a growing, aligned community for many generations to come.\n\n*I. What Is Proof of Contribution? is the first in a series of articles to dive deeply into the philosophy, vision, mechanics, and work involved in developing a new consensus mechanism for the next generation of smart contract systems. Look out for subsequent editions and additional Building Gno.land series, and let us know what you think! Got questions? Join the Gno.land [Discord](https://discord.com/invite/S8nKUqwkPn) or follow us on [Twitter/X](https://x.com/_gnoland)*.\n","2024-01-10T10:51:00Z","","building-gnoland,gnoland,proof-of-contribution"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-7","The More You Gno: Gno.land Monthly Updates - 7","\n\nWelcome to the latest edition of *The More You Gno*, your regular source of updates from the Gno.land core team and contributor ecosystem. After a well-deserved rest during the holiday break, we’re kicking off 2024 with renewed energy and plenty of exciting initiatives, including a new staging testnet (the Portal Loop), the official Gno.land documentation page, several merged PRs (including native bindings!), and many updates across the board. Dive in to find out what we’re working on and what our ecosystem partners and grantees have been up to.\n\n## Gno Core Team Updates TL;DR\n\nShort on time? Skim the highlights from the core team in the list below. You’ll find additional details in the next section if you want to explore any topic in greater detail.\n- **Native Bindings** - If you’ve been following our journey or experimenting with the platform, you’ll hear virtual champagne pops as Morgan’s ongoing work with native bindings is finally merged [PR 859](https://github.com/gnolang/gno/pull/859).\n- **Gnodev** - Thanks to Guilhem’s `gnodev` initiative [PR 1386](https://github.com/gnolang/gno/pull/1386), you can now create and develop contracts with a single command.\n- **Gno.land Offical Docs** - Check out [docs.gno.land](https://docs.gno.land) for how-to guides, getting started, and an overview of key concepts of the platform.\n- **Effective Gno** - Taking inspiration from *Effective Go*, Manfred’s begun listing common patterns and examples of the differences between Gno and Go.\n- **Assignment in GnoVM** - Jae is working on approaches to fixing assignment in the GnoVM and issues that deal with persistence [(issue 1326)](https://github.com/gnolang/gno/issues/1326). \n- **Portal Loop** - The [Portal Loop](https://portal.gnoteam.com) has been released on a staging domain and is being tested.\n- **Roadmap** - We’re working on a fully-fledged Gno.land roadmap and will share a detailed DAG and important goals and milestones with you soon.\n- **Tendermint2 Update** - There are several PRs aimed at removing the dependencies between Tendermint2 and GnoVM.\n- **Gno.land Tokenomics** - We continue to make progress in defining the structure of Gno.land’s DAOs and the design of reward schemes for contributors.\n### Native Bindings (PR859) Has Been Merged\n[PR 859](https://github.com/gnolang/gno/pull/859) (native bindings) was submitted by Morgan in May 2023 to improve calling Go code from Gno standard libraries, all while improving `gno doc` documentation for standard library functions. Native functions are _declared_ in Gno code, but their definition (the underlying code) only exists in Go: this is similar to how Go and many other systems languages implement assembly functions. Overall, the addition will now allow us to better support precompilation (transpiling Gno code to Go) for all Gno-specific standard libraries, like [`std`](https://docs.gno.land/reference/standard-library/std/address/), and have a system for defining such functions that is transparent to code analysis tools like `gno doc` and `gnols`.\n### Gnodev Has Been Merged\n[PR 1386](https://github.com/gnolang/gno/pull/1386) (`gnodev`) has been merged. Gnodev is a tool to locally develop Gno realms which automatically re-deploys your contracts when you change the files, similar to JavaScript frameworks `npm run dev`. There are some additional features being worked on to improve the experience, including browser hot-reload (for the full front-end JavaScript experience!)—and Gno core developers who have worked on realms all agree that thanks to `gnodev`, they can finally stop visiting their therapist every week. Play around with it, and let us know how you get on. There may be a few bugs still and Guilhem is happily accepting feedback.\n### The Gno.land Official Documentation Page Is Live\nWe’re excited to have the Gno.land Official Documentation page live on the [https://docs.gno.land](https://docs.gno.land) domain. This will always be a work in progress as we expand the docs, make iterations to existing issues, and refine some of the core concepts, but it’s an excellent resource for anyone wanting to find out more about Gno and for onboarding new developers to the platform. A big thanks to the Onbloc team, whose developer portal was a huge inspiration for this. We’re looking for feedback, so leave your reviews and let us know where the docs can be improved and what else you would like to see.\n### Effective Gno\nManfred has been working on a document called [Effective Gno (PR 1000)](https://github.com/gnolang/gno/pull/1000), which takes inspiration from *[Effective Go](https://go.dev/doc/effective_go)* and will become an important reference document for Gno devs to explore common patterns and crucial differences in how we program compared to Go. We’ll be iterating on this as we progress, but you can already find plenty of examples. If you’re just getting into Gno and coming from a Go background, this is a great resource. Read this document and provide some comments if you have any. \n### The Portal Loop Beta Is Live\nThe Portal Loop Beta has been released on a staging domain, and you can check it out now at [https://portal.gnoteam.com](https://portal.gnoteam.com). The Portal Loop will replace the Gno.land website once we’ve finished squashing bugs and adding features. We’re still testing it and have identified several issues. For example, from the last three merged PRs, only one triggered a redeploy when we expected two or three deploys. We will also add a faucet.\n\nAs we continue to evolve the Portal Loop out of its early development stages, transaction volume and general activity will increase. However, currently, there are insufficient transit testing transactions. One of the tasks we want to do to prove that the Portal Loop is working well enough is to write a kind of monitoring-oriented oracle that will try to make transactions, perhaps incrementing a counter every minute. We’re looking for help writing a script or a daemon for this oracle, so let us know if you want to contribute to [issue 1443](https://github.com/gnolang/gno/issues/1443). Once the Portal Loop is finished, we will focus on testnet 4.\n### Assignment Issues in the GnoVM\nMorgan came across a bug [issue 1326](https://github.com/gnolang/gno/issues/1326), which returned an error about an [“unexpected unreal object”](https://tenor.com/es/view/cranizox-gif-8576622211330078986) when assigning a local variable to a dereferenced global variable in the GnoVM. Jae has been spending some time working on approaches to solving this and fixing assignment that will also work for saving escaped objects that don't have a parent (like variables whose pointers are referenced on a persisted object). This is a tough one to figure out, so if there are any other VM issues that deal with persistence and detached parentless objects, now is the time to add them to Jae’s plate. \n### An Update on Tendermint2\n[PR 1483](https://github.com/gnolang/gno/pull/1483) has the same goal as [PR 1438](https://github.com/gnolang/gno/pull/1438): to make Tendermint2 completely independent of GnoVM and Gno.land. This continues a project started many months ago to separate Gno into three separate components: the Tendermint2 consensus engine, the Gno programming language and VM, and Gno.land, the blockchain combining both together. This way, we’re working towards making it possible to build other blockchains that use Tendermint2 (like AtomOne!), the GnoVM, or both!\n### Gno.land Engineering Retreat\nIn the last *The More You Gno*, we covered the Gno.land and AIB company-wide retreat, an invaluable opportunity to work together, code together, and get to know our peers outside of work. It was such a success that the Gno core dev team held another retreat in December in Rouen, France, where many of the above issues and PRs were tackled and merged. We look forward to more productive and frequent face-to-face meetings in the year ahead.\n### Gno.land DAOs and Tokenomics\nWith the input of Manfred, Jae, and the rest of the team, Michael continues to make advancements on Gno.land’s system of DAOs and tokenomics. One key change since the last edition is that the WorxDAO (responsible for governance and all issues related to development in Gno.land) will now be known as the GovDAO. The DAO will likely have seven tiers but initially launch with three or four. The main benefits of moving up tiers are increased voting power, increased monthly rewards, and the authority to promote members from lower tiers. GovDAO will be assisted by WorxDAO, which will encompass several different sub-DAOs, such as engineering, funding, and projects. \n\nWe’re currently exploring different reward systems for contributors, whereby each member of the same tier level will receive the same amount of rewards, either directly or indirectly, in the GNOT native gas token or USD, in a type of salary-based scheme. We may also elect to distribute rewards based on a contribution/work “hash difficulty” (total number and tier split of active contributors that month). We may also adopt a hybrid of these two models. \n\nMichael is also working on a bounty system to make Game of Realms (GoR) more accessible and evaluating contributions easier for judges. High ranking GoR competitors will likely receive Gno.land tier levels based on their leaderboard placing in addition to ATOM rewards. It’s important to note that these discussions are ongoing, and the information here may be deprecated. \n### Making Testing Faster\n\nThanks to Petar, [PR 1417](https://github.com/gnolang/gno/pull/1417), we have improved the entire VM testing suite runtime by around four minutes, which is an incredible achievement. We just need to refactor some test scenarios that are not very concurrent-friendly, but this PR makes interacting with the platform so much easier.\n\n### Bug Fixes and Miscellaneous Items\n\nThanks to Joon from Onbloc, we were able to add support for octals without 'o' (check out [PR 1331](https://github.com/gnolang/gno/pull/1331) for more details), and thanks to Dragos [PR 1309](https://github.com/gnolang/gno/pull/1309), we extended the GRC721 interface so that it now supports setting a token URI. These are both extremely welcomed contributions, and we appreciate our ecosystem partners.\n\nFrom the core team, a special shout out to Dylan for killing it fixing bugs, and getting many PRs ([PR 1451](https://github.com/gnolang/gno/pull/1451), [PR 1315](https://github.com/gnolang/gno/pull/1315), and [PR 1305](https://github.com/gnolang/gno/pull/1305), to name a few) merged over the last few weeks. Props also go to Marc for [PR 1177](https://github.com/gnolang/gno/pull/1177), which has just been merged, which fixes append in certain key situations. We’ve also welcomed a new security engineer, Kristov, to the team.\n\n## Grantee and Ecosystem Updates\n\n### Onbloc\n\nOnbloc has been on a roll, giving us an internal demo of Gnoswap beta just before the Christmas break and a public demo of its awesome Pool Incentivization feature during the last contributor sync call. With Pool Incentivization, anyone can add extra rewards on top of swap fees for LP stakers. This will help bootstrap initial liquidity for new-coming projects by attracting liquidity providers until sufficient organic trading volume is secured. Onbloc is also actively developing Adena’s Airgap feature and has improved the sign-in flow for security enhancement along with some refactoring. There will be a demo coming up in the next few weeks. Onbloc will also be researching airdrop trends and aiming to identify some of the most coveted DEX features users want to see for Gnoswap to streamline the onboarding process.\n\nRegarding Gno core, Onbloc core dev Byeongjoon Lee has developed a JSON parser for Gno, giving us a live demo during the last contributor sync. This allows the conversion or accessing of data from contracts in the JSON format, which will improve the Gno developer experience. His code is currently under review by the core team in [PR 1415](https://github.com/gnolang/gno/pull/1415). Dive deeper into Onbloc’s Builder Journey in the [hackerspace issue 29](https://github.com/gnolang/hackerspace/issues/29).\n\n### Teritori\n\nTeritori continues the challenging work of developing Gno Project Manager, a web app that allows anyone to create, fund, review, or manage projects fully on-chain. During the last contributors' call, the team gave a demo of the work achieved so far, in particular regarding the escrow system and completing project milestones so contributors can be paid once each one is completed rather than having to wait until the project finalization. \n\nGno Project Manager is a complex goal, and the team has run into some issues with edge cases they hadn’t bargained for in the relationships between grantees and funders. The team is looking for feedback and help identifying edge cases, so if you have any in mind, let them know. Teritori is also working on the conflict solver module and improving the social feed on [https://app.teritori.com/feed?network=gno-teritori](https://app.teritori.com/feed?network=gno-teritori), as well as providing more detailed documentation on their work, which they’ll be releasing in the coming weeks.\n\n### Berty\n\nThe Berty team has been busy working on GnoSocial backend implementation. The initial feature set has been implemented [here](https://github.com/gnolang/gnosocial/blob/main/realm/public.gno), including posting and replying to messages and reposting threads. You can keep up with Berty’s journey on GnoSocial in [hackerspace issue 51](https://github.com/gnolang/hackerspace/issues/51), which contains many issues and PRs, such as implementing calls, running tests, and fixing bugs. We’re super excited about pushing the limits of scalability with Berty’s decentralized social platform, and we’ll be looking forward to more demos in the coming weeks.\n### Dragos\nDragos has successfully launched the Flippando game, and you can try it out on the [testnet here](https://gno.flippando.xyz/flip). If you haven’t been following the progress, Flippando is an on-chain memory game that you can play with your choice of styles, such as dice, colors, and hexagrams. Once you successfully complete a matrix, you can mint the end result as an NFT, which can later be assembled into larger, more complex NFTs to create digital artwork. You can find out more about the game, its creator, and the official roadmap on the site. We’ll also release a blog post soon from Dragos sharing his experience porting Flippando from Solidity to Gno, so stay tuned!\n### Varmeta \nVarmeta’s update was brief this week since the contributor sync call ran over. We look forward to hearing more about the team’s progress in developing the Unity SDK for Gno next time. You can read more about it on Varmeta’s [hackerspace issue 43](https://github.com/gnolang/hackerspace/issues/43).\n\n*Do you want to contribute to Gno.land's monthly updates? If you're building on Gno.land and want to highlight your development, project, event, or idea, let us know, and we'll include your contribution. That's all for now! Keep track of our progress by following our socials [Twitter/X](https://twitter.com/_gnoland) and [Discord](https://discord.com/invite/tF2X8M6cVj) and watch out for the next edition of The More You Gno in a few weeks.* \n","2024-01-22T00:00:00Z","christina","gnoland,ecosystem,updates,gnovm,tm2"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["porting-flippando-gno","5 Things I Learned While Porting Flippando From Solidity to Gno ","\n\nLast year, while visiting Seoul, South Korea, I decided, on a whim, to sign up for a hackathon called Glitch. The project I was going to present was a tiny little game, written in Solidity, called Flippando. It started as a weekend project to help me learn Solidity (I had no prior experience with this language). To my surprise, my tiny little game won the first prize on the Polygon track of the Glitch hackathon.\n\nEncouraged and even more curious now, I started attending side events during Buidl.Asia. One was about Gno, a smart contract platform written in Go. After the presentation, which was really great, I started a light conversation with the team. One thing led to another, and I ended up showing them Flippando. \n\nJust for context, Flippando is a non-degen, deceptively simple memory game. You start with an empty matrix and flip tiles to see what’s “underneath.” If the tiles match, they remain uncovered; if not, they are briefly shown, and you have to memorize their color until the entire matrix is uncovered. The end result can be minted as an NFT, and you can later assemble all the boards into bigger, more complex NFTs, basically “painting” with the uncovered tiles.\n\nThe Gno team seemed to like it, and they suggested I should apply for a grant to port it to Go/Gno. I had no prior experience in Go either, so I thought this would be a good opportunity to learn more. To my surprise, again, my grant submission was accepted.\n\nFast forward a few months until now: the Gno version of Flippando is live (in testnet beta) at [https://gno.flippando.xyz](https://gno.flippando.xyz). What follows sums up my experience porting the game from Solidity to Gno. This blog post is a mix of technical and not-so-technical takeaways.\n\n## 1. Being Early Pays Off\n\nSolidity has been around for some time now, and there is already a solid tooling ecosystem for it. I used Hardhat for my development, and I got really comfortable with it. When I started to port Flippando, though, I was quite surprised to see there was almost no tooling in Gno. Developing was mostly TDD (test-driven development) against a local VM, and deploying realms on the actual chain was more complicated than I expected. \n\nMy first feedback rounds to the team revolved almost exclusively around this topic. Very soon, I started to receive signals that my feedback was not only heard but taken into account and processed, and there were actual projects built aiming to improve the developer experience. In just two or three months, two full projects were finished: gnodev, and Gno Playground. \n\nGnodev makes development very similar to Metro in React Native: there is a watchdog on the file system, and your changes to the realm code are reloaded every time you save. It’s almost like deploying in real time; no need to stop the chain, wipe the state, restart the chain, and redeploy your modifications. Gno Playground is a sandbox-like environment, which helps tremendously with quick testing and even deploying packages on-chain. Both projects were finished, as I said, in just two to three months.\n\nBeing early pays off because you get to shape your development environment much faster than in a solidified (pun intended!) environment. You may have to deal with a little chaos in the beginning, but the benefits are well worth it.\n\n## 2. TDD All Day Long\n\nAs I said above, developing realms in Gno consists mainly of writing and testing your code with another code. It’s called TDD and it’s a very useful developing strategy, in general. I used it, at my day job, in all my projects consistently, but only in the initial stages. Once the codebase was more stable, I was relying more on regression tests from the Q\u0026A team.\n\nMind you, there was no Q\u0026A team this time; I was just coding alone, and I was forced to comply more and more with this TDD approach. In the end, I have to admit that, while slower and a bit boring, this approach is more effective, especially in a volatile environment, where patches are added literally every day, and the environment changes continuously.\n\n## 3. Marshal and Unmarshal\n\nThe current GnoVM doesn’t yet have an API standard for formatting. You can’t put a setting somewhere that will make the response be automatically translated into JSON. You have to write these JSON objects yourself for every payload you return from your realm. \n\nIn Solidity, all this is hidden under the event mechanism and handled by existing libraries, like ether.js, which take care of all this nitpicking. It soon became obvious that development time would be significantly longer in Gno because, on top of the logic, I also had to write the formatted response “by hand.”\n\nBut as with every other thing that seemed weird in the beginning, eventually, I came to appreciate it. It forced me to prototype more carefully not only the actual response but all the objects needed in my game. Eventually, it resulted in simpler and more flexible code.\n\n## 4. Eating Your Own Dog Food\n\nWhen developing in Solidity, most of the time, you just import OpenZeppelin contracts for ERC20 and ERC721 tokens (which are battle-tested, bug-free, and relatively easy to understand) and focus on your own contract logic. No mingling with low-level token implementation details; these are already packaged and ready to use.\n\nWhile porting Flippando to Gno, I realized I had to deal with these low-level details upfront simply because there was no equivalent of the OpenZeppeling contracts. Moreover, some current GRCs (the Gno equivalent of ERC) were incomplete. \n\nSo, I had to make a PR for a GRC721 implementation that was missing the SetTokenURI functionality, and this PR ended up being merged into the main Gno codebase (that felt really good, to be honest). \n\n## 5. Being Early Pays Off. Did I Say That Already?\n\nYes, but this time it’s about something else. It’s not about the satisfaction of shaping the development environment in the early days. It’s about the privilege of witnessing something coming to life from literally nothing. Gno has been in development for almost two years now, and it is several months before its mainnet. It’s literally on the verge of coming “alive.”\n\nEvery day new commits are added, and new decisions are made. There are new contributors constantly joining, and new projects prototyped and launched faster and faster. Every day the ecosystem is coagulating itself into something more and more visible, more and more alive.\n\nBeing able to witness this from the inside is a rare privilege and something I’m very grateful for.\n\n## Final Thoughts \n\nSo, these are, in a nutshell, my five top takeaways from porting Flippando from Solidity to Gno. There are many others, of course, and Gno is (did I already say this?) still very early. If you’re interested in learning more, please visit the official repo, look at the docs, and try interacting with the devs. You’ll never gno what can grow out of it! And be sure to play [Flippando](https://gno.flippando.xyz) today live in testnet beta and share your flips.\n\n## Here’s How to Play Flippando\n\nThe game presents a 16 tiles (4x4) or 64 tiles (8x8) matrix. These tiles are “covering” a board of various colors and gradients or shapes, like dice or hexagrams. Clicking two tiles consecutively “flips” them, showing what’s underneath. If they match, they remain uncovered; if not, they are briefly shown, and the player needs to remember their position. Once an entire board is flipped, revealing its random combination of colors, the player can choose to mint it as an NFT.\n\nWhen minting a solved board as an NFT, the game also mints a fungible token, FLIP, which is “locked” inside the NFT. This is the player's “reward.” But the token can only be unlocked if someone else uses that NFT in a larger project.\n\nThese larger projects, or “artworks,” can be assembled in the Flippando Playground. All minted basic NFTs are displayed here in an area from where the player can drag and drop them onto a canvas, creating a much bigger and more complex NFT. Once the canvas is fully filled and the player is satisfied with what’s in there, these new “artwork” NFTs can also be minted. This unlocks all the FLIP tokens for the NFTs used inside the artwork and sends them to their initial players. Furthermore, these complex artworks can be listed and traded in a marketplace, closing the circle of a virtual economy of goods.\n\nStart playing Flippando and share your Flips with Gno.land on [Twitter/X](https://x.com/_gnoland?lang=en) by tagging #gnoflip. \n\n\n","2024-01-24T00:00:00Z","dragos","gnoland,ecosystem,updates,flippando"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["wyg-zooma","Who You Gno – On the Record with Antoine Breuil","\n\nAntoine Breuil, ‘zôÖma,’ is the co-founder of [Teritori](https://app.teritori.com/), an active Gno.land contributor and grantee that’s building key modules and tooling for Gno. A firm believer in equal opportunities, free and decentralized access to information, and helping fellow humans, zôÖma is fascinated by human behavior and how we organize ourselves, holding an avant-garde social experiment five years ago with Teritori co-founder ‘Pop.’ \"La Suite du Monde\" drew people across France to a small village in the countryside to create a shared community and society—with farmland, accommodation, and tools for common use.\n\nThe goal was to form an in-real-life DAO whose members shared common goals and interests using blockchain technology with a token to pay for goods and services and vote on governance matters. While many people participated and were enthusiastic about creating a shared society, zôÖma admits the experiment was early- no one was interested in interacting with the tech. “90% of people, rural or not, found it too complicated,” he admits. “We were a bit naive, but it was fascinating nonetheless.”\n\n## A Fascination for Human Behavior\n\nzôÖma has been an ardent student of human behavior since childhood. His parents taught him early on the value of philanthropy and working with people in need. He’s set up several joint liability companies, non-profits, and NGOs to experiment with finding new and better ways to organize society, and one of the things he loves most about web3 is its “experimental” nature. He’s encouraged by how far the industry has come since he received his first bitcoins in partial payment for a website in 2014. “That turned out to be a really expensive website for my customer,” he laughs. He never expected such broad adoption of Bitcoin and a technology that “inspired a whole generation of engineers to experiment with new things.”\n\nLike most creative types, zôÖma is used to spinning many plates in the air, overseeing La Suite du Monde while working as a freelance designer, front-end dev, and Artistic Director for an independent French record label. “Before entering the world of engineers, I founded and managed a collective for 12 years, which brought together artists from all disciplines, hackers, designers, tinkerers, to build some interesting projects.” La Suite de Monde allowed him to explore his passion for finding new approaches to social coordination first-hand. “I explored very radical things,” he says, “like the notion of “accepted by default” where anyone could use the collective budget by expressing their desire to do so three times. I wouldn’t recommend this,” he laughs, “but the experiments were fascinating and still serve me today in my work.”\n\nOne really interesting trait about zôÖma is how he harnesses the creative and analytical sides of himself with equal application. Most people are predominantly right-brained or left-brained, yet, zôÖma is ‘ambidextrous’ in this regard. He’s a designer who’s created large-scale artistic events, cultural tours of Paris, and an award-winning independent movie documenting French artist and Bitcoin advocate Pascal Boyart, [The Underground Sistine Chapel](http://www.the-chapel.art), (which you should definitely check out!). Yet he’s also passionate about engineering and the future of cooperatives. He’s detail-driven and ambitious, taking his team at Teritori from two to 18 (14 full-time teammates and four part-time).\n\nIn his free time, zôÖma, “like all French people,” enjoys fine wine and good conversation. One of the things he loves most about Paris is how easy it is to find like-minded people to brainstorm with or decompress after a long day of work. “We have a very active ecosystem of engineers, cryptographers, etc.,” he says. Paris is also a beautiful city that captures his imagination with its dazzling architecture and impressive art. Even so, zôÖma channels his creative energy more effectively when working from a small Moroccan fishing village for three months a year. He reconnects with nature and humanity, immersing himself in a different culture and surfing in the Atlantic before he starts his day. \n\n## New Tools for Social Coordination \n\nWhy does zôÖma believe social coordination is so important, and why do we need new tools for it? “We’ve always had tendencies to organize ourselves and tools defining rules for living together, diplomatic protocols for discussing between social groups, or trading goods and services. But almost all the tools that previous generations put in place are outdated. Our entire generation has lost confidence in institutions to allow groups of humans to organize, coordinate, and meet their needs. Our dependence on third parties who do not have the same interests as citizens is immense.”\n\nzôÖma believes that web3 holds the key to unlocking the emergence of new societies through products that are “unstoppable, resilient, and meet a real need,” whether for small villages in the south of France, Africa, or Asia or neighborhoods in Brazil or Korea. “We must have access to the radical transparency of institutions, the privacy of individuals, censorship-resistant tools, and autonomous communication from all commercial enterprises. It is on this solid foundation that civilizations that are more just and equitable can be built.”\n\n## Making Web3 More Accessible \n\nOf course, as zôÖma found out, building new tools is easier said than done. Our industry faces an uphill climb when it comes to balancing the promise of the tech with a user experience that doesn’t cause tachycardia. He says that understanding that most people “don’t have the time or inclination to incorporate difficult technical concepts in their lives” has given him “crazy energy to focus on very simple technologies.” In fact, the ‘failure’ of La Suite du Monde is what gave birth to Teritori, “which today provides all the functionalities people asked us for at the time; a social network, communication systems, voting, crowd-funding, etc. We have made great progress, and it’s important to focus on products that are radically simple for the general public.”\n\nAccording to zôÖma, this means abstracting away the concepts that everyday people don’t need to be aware of, such as networks, dApps, and even blockchain, “and always switching from one decentralized application to another.” Unifying (not centralizing) separate tools, networks, and technologies within a single, simple interface, he believes, is the key to broader adoption. “It's a very complex challenge, in terms of security, design, etc., but it's what I'm passionate about today.” \n\nWhen it comes to Gno.land, Teritori has already delivered essential DAO tooling and standards, a Moderation DAO module to facilitate social communication and a Justice DAO module for conflict resolution. The team is now focusing on an on-chain project management tool to allow organizations and individuals to manage projects and track tasks smoothly and transparently on-chain.\n\n## A Fairer, More Transparent World\n\nIn 2024, Teritori enters a new phase called \"Chapter II,\" which involves unifying all its work into a mobile and desktop application that could “trigger superb demonstrations of the potential of DAOs.” He enthuses, “I dream that we will see the emergence of a village that uses Teritori as a tool for internal discussion and co-financing. Will this be real in 2024? Who knows? But that’s where I focus all my energy!”\n\nHe believes the internet has been a great leveler, enabling anyone with a connection to educate themselves on any subject; yet, the opportunity isn’t open to all, and free and open access is constantly diminishing. “I am a child of the internet. I grew up with warez, p2p, and an internet which provided me with daily resources to learn freely, everything that interested me. In some countries, it is impossible to benefit from this opportunity, and with the centralization of the internet on different key players, mass surveillance, and the censorship of certain dictators, the internet is losing its very essence, which makes it magic. Distributed protocols can reshuffle the cards and offer tools for the public good.” \n\nzôÖma says that humanity is at a turning point, and we must build the necessary tools now to avoid finding ourselves in a real-life version of George Orwell’s 1984. “I aspire to participate modestly in a world that is fairer, more transparent, and where society doesn’t need a puppet in a suit to improve its living conditions or respond to local needs. Web3 is just a tool, and if it doesn't meet this real need, then for me, it will be a failure.”\n\n*Experiment with Teritori today and test its Social Feed, which now includes Twitter-like functionality for posts, Medium-style articles, Soundcloud-inspired music, and videos—all based on Gno and IPFS and totally decentralized. You can also check out Teritori’s GnoModerationModule, which allows you to moderate a social network in a decentralized way. A faucet is available on the home page at [app.teritori.com](https://app.teritori.com/feed?network=gno-teritori).*\n","2024-01-11T00:00:00Z","christina","whoyougno,teritori,community,interview"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["bgl-poc2","Building Gno.land - Proof of Contribution II","\n\n*Disclaimer: The Building Gno.land series aims to share the core concepts of our platform, mission, and tech stack, providing a snapshot of a current state on our builder’s journey. New episodes may deprecate previous ones, but no editions will be modified at any time. We encourage you to follow along as we create the rails for a more transparent and accountable society, and we welcome feedback and contributions to the repo.*\n\n## II. Proof of Contribution vs Proof of Stake\n\nProof of Stake (PoS) is a robust consensus mechanism that provides a more environmentally friendly and scalable alternative to Proof of Work (PoW) and powers most of the web3 industry today. As PoS pioneers, Cosmos technology secures hundreds of blockchain projects and billions of dollars of digital assets, and Ethereum (launched as a PoW chain in 2015) made the historic switch to PoS in 2022. According to [ethereum.org](https://ethereum.org/en/developers/docs/consensus-mechanisms/pos), PoS is “more secure, less energy-intensive, and better for implementing new scaling solutions compared to the previous proof-of-work architecture.” However, as we briefly discussed in [*What Is Proof of Contribution?*](https://test3.gno.land/r/gnoland/blog:p/bgl-poc-1), PoS has vulnerabilities that can corrupt the network over time.\n\n### The Limitations of Proof of Stake (PoS)\n\nBeyond securing the network, the main goal of any consensus mechanism (PoW, PoS, DPoS, PoC, etc.) is to be as decentralized as possible and not reliant on any central actors. This can be measured by the Satoshi Score (or the Nakamoto coefficient), a quantitative measure that assesses a blockchain’s level of decentralization by calculating the minimum number of nodes needed to compromise a network or carry out a 51% attack. PoS systems can be bootstrapped within days (or even hours), starting off decentralized and achieving a high Satoshi Score.\n\nThe PoS chain Genesis allocates a default voting power to ~20-50 nodes, in general equally (or at least making sure that no single node has more than 5% of the voting power). This makes PoS chains decentralized enough (in theory) from block 0 with a near-perfect Satoshi score. However, in practice, PoS has two main issues. Because the system is dictated by money, PoS chains become imperfect over time. Anyone wealthy enough can stake their tokens progressively and use their accumulated power to sway decision-making on the chain—or take the network over completely.\n\nThe chain can limit the maximum voting power per validator node, but this is almost ineffective, as a malicious actor can carry out a Sybil attack on the network and create multiple validators to bypass the voting cap. Such an attack renders the max voting power per node useless and leaves the chain defenseless against a single organization or cartel gaining the majority of the voting power. PoS systems leave chains like Cosmos Hub and Ethereum at risk from such bad actors, cartels, and powerful protocols (such as Lido and Rocket Pool).\n\nWhile Proof of Contribution (PoC) can’t prevent Sybil attacks on standard user accounts (when malicious actors create multiple accounts with a single computer and transfer tokens within a few hours), it does make it almost impossible for validator nodes to suffer Sybil attacks. Since the community vets every person who is given voting power or sway in the network (including validator power) through the DAO, at no point can anyone \"spoof\" identities and gain major sway. \n\n### Where Proof of Contribution (PoC) Excels\n\nPoC is actually Proof of Authority (PoA) which, instead of offering up a resource like computing power or a financial stake, relies on validators staking their reputation. Anyone can join most public PoW and PoS networks without revealing their identity. However, by definition, PoA validators need to make themselves known and are selected based on their trustworthiness. This means PoA tends to work better when deployed in private or permissioned blockchains than in public platforms (because of this tendency toward centralization). \n\nPoC solves this problem, ensuring the network becomes increasingly decentralized over time by being governed by a decentralized entity, GovDAO. Like standard PoA chains, PoC chains launch with a handful of validators that must be identified and trusted by the network, meaning governance is centralized at the start, and the chain achieves a low Satoshi Score. The system is about contributing and earning contribution units, which are slow to gain and require human interaction. It takes months (or years) before there are enough actors in the DAO and sufficient voting power for the chain to be considered decentralized enough, according to the Nakamoto coefficient. \n\nPoC is thus slower to bootstrap than PoS and harder to achieve. You can think of PoC versus PoS as a marathon versus a sprint, whereby PoC starts slowly but then gains momentum over time, and PoS starts quickly but loses momentum over time (the graph below provides a visual representation of PoC versus PoS). \n\n[![Graph](https://gnolang.github.io/blog/2024-01-26_bgl-poc2/src/thumbs/graph-container.png)](https://gnolang.github.io/blog/2024-01-26_bgl-poc2/src/graph-container.png)\n\nThe GovDAO that owns the chain has a mandate to scale (to grow and decentralize) continuously as it adds more contributors. This means it becomes progressively larger over time, achieving high decentralization efficiency way beyond the initial fast sprint of PoS chains. Once established as a proven consensus mechanism and alternative to PoS, GovDAO can benefit from by any blockchain project (through an evolution of ICS) wanting to achieve decentralization and sustainability—PoC can secure Gno.land and the web3 industry at large.\n\n### Security-Conscious by Design\n\nAnother advantage of PoC is that because it’s reliant on human interactions, it is more Sybil-resistant by design. As discussed, it’s almost impossible to split a validator node into two (or more) nodes, making conducting a Sybil attack infinitely difficult. Since contribution units are not transferrable or exchangeable, PoC cannot suffer from whales attempting to purchase voting power quickly. If someone wanted to take over the network, they would need to invest years of their time making meaningful contributions. Their attack would be so slow that it would easily be prevented by humans monitoring the decentralization and adjusting the parameters. \n\nMoreover, GovDAO will activate and deactivate new validators on request, establish a KYC system for validators, and manage promotions of contributors with votes. This removes the possibility of a takeover happening overnight since the only way to gain validator or voting power is by voting on governance requests, which is slow and managed by humans. This is in contrast to PoS systems which are powerful and fully automated yet defenseless against such coordinated attacks.\n\nGno.land is built on the very premise that such an attack on a PoC network would never happen as it would be entirely counter-intuitive. Since contributions are not only about expertise but also alignment, it is our hypothesis that longstanding contributors who have invested years of time and brainpower in developing the chain will do their best to protect it rather than destroy it. The DAO system will endure thanks to the mix of expertise and alignment and the amount and frequency of contributions. \n\n### Concluding Thoughts\n\nBeyond separating voting power from net wealth, a core component of Proof of Contribution (PoC) is its focus on long-term sustainability. PoC makes the system fairer and more sustainable, ensuring participants are aligned and take actions that benefit the community and the broader ecosystem. PoC is slower to bootstrap and harder to achieve than PoS but focuses on long-term alignment and security. \n\nUnlike PoS, contributors receive rewards based on their contribution effort rather than how many tokens they stake. They are thus incentivized and recognized for the quality of their work, ideas, and alignment, driving participation and active engagement. Governance is allocated to the people most likely to care for the ecosystem’s long-term success—the contributors who have spent the most time working toward it.\n\n*II. Proof of Contribution vs Proof of Stake is the second in a [series of articles](/r/gnoland/blog:p/bgl-poc1) to dive deeply into the philosophy, vision, mechanics, and work involved in developing a new consensus mechanism for the next generation of smart contract systems. Look out for subsequent editions and additional Building Gno.land series, and let us know what you think! Got questions? Join the Gno.land [Discord](https://discord.com/invite/S8nKUqwkPn) or follow us on [Twitter/X](https://x.com/_gnoland)*\n\n\n","2024-01-26T13:37:00Z","christina","gnoland,gnovm,tm2,PoC"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["funding-program-23q4","Gno.land Funding and Grants Program - Quarterly Report: Q4 2023","\n\nThe Gno.land Funding and Grants program identifies talented and passionate developers, researchers, and tinkerers to interact with Gno.land, enhance the platform's usability, and help build the core infrastructure and tooling needed for mainnet. After a strong start in Q3 2023 from our grantees, we awarded four additional grants in Q4. Let’s take a look at their progress and what’s coming up in Q1 2024.\n\n## Q4 Funding Breakdown\n\nThe total amount paid out in Q4 for grants was just under $317,000, spread out over the four grants: Teritori, Berty, Onbloc, and Dragos (Flippando). This work was split over essential stress-testing, debugging, and development on Gno core, and building social, gaming, and project management dApps to extend the platform’s functionality. Each grant recipient received milestones for deliverables and tracked their progress through regular public and internal syncs, hackerspace journey updates, blog posts, documentation, and developer calls.\n\n[![Q4 Chart](https://gnolang.github.io/blog/2024-02-07_funding-program-23q4/src/thumbs/chart.png)](https://gnolang.github.io/blog/2024-02-07_funding-program-23q4/src/chart.png)\n\n## Berty Technologies (delivery May 2024)\n\nAfter successfully meeting their deliverables in Q3 and creating Gno Native Kit (formerly [GnoMobile](https://test3.gno.land/r/gnoland/blog:p/gnomobile)), Berty was awarded a second grant in Q4 to experiment with smart contract integrations around social media. Through the development of GnoSocial, the team has created a test bed for building decentralized social media-style apps and helped to stress test technical issues in Gno.land. \n\nIn Q4, Berty delivered V1 of GnoSocial, which includes basic Twitter-like functionality. GnoSocial will be implemented on mobile using the Gno Native Kit framework, with a minimal desktop app and a read-only web version also in the scope. Aside from this work, Berty contributes to Gno core development, helping raise issues and merge PRs. You can follow their progress in hackerspace [issue 51](https://github.com/gnolang/hackerspace/issues/51).\n\n## Teritori (delivery February 2024)\n\nAfter delivering the [moderation module](https://test3.gno.land/r/gnoland/blog:p/gnoland-moderation-dao-module) in Q3, Teritori received a second grant to carry out research and implement a conflict resolution module and an on-chain project management tool. Their work also continues on the escrow module build. As an active contributor, the Teritori team helps improve Gno core as well, getting more PRs merged, participating in regular meetings, and writing documentation. Read more about Teritori in their hackerspace [issue 7](https://github.com/gnolang/hackerspace/issues/7).\n\n## Dragos (Flippando, delivered January 2024)\n\nTo experiment with gaming in Gno.land, Dragos received a grant to port his on-chain memory game Flippando from Solidity. Flippando is a simple memory game—with a twist. Players uncover tiles and must find their matches to win the game. The result can be minted as an NFT and assembled to create larger, more complex NFTs and digital “paintings.” The beta version of [Flippando](https://gno.flippando.xyz/flip) is now live on the testnet, and you can read about his experiences in developing the game on the [Gno.land blog here](https://test3.gno.land/r/gnoland/blog:p/porting-flippando-gno) or visit [hackerspace issue 33](https://github.com/gnolang/hackerspace/issues/33).\n\n## Onbloc (ongoing)\n\nAfter producing consistently awesome work and being our longest-standing contributor, Onbloc received a grant in Q4 2024 to continue iterating on Gno.land tooling, Adena, and to help build Gno.land core in preparation for mainnet release. Part of the scope was to support contract-to-contract interaction [issue 757](https://github.com/gnolang/gno/issues/757), lead a [multi-node testnet initiative](https://github.com/gnolang/hackerspace/tree/main/multinode-testnet), write pure Gno packages, and help debugging the GnoVM, among many other initiatives. Onbloc is also adding additional security to the Adena wallet and an “Airgap” feature, which you can read more about in [hackerspace issue 29](https://github.com/gnolang/hackerspace/issues/29). We’ll also release a detailed blog post soon, so stay tuned.\n\n## Coming Up in Q1 2024\n\nWe’re looking forward to more exciting developments in the coming year as we focus on the road to mainnet. In Q1, grantees will mainly focus on debugging Gno core, developing smart contracts and libraries, building and porting dApps to Gno.land, and creating educational materials to help grow the community.\n\nBlockchain software and virtual reality technologies firm Varmeta are under evaluation for a grant to support account sessions and build the Gno.land Unity SDK to make blockchain more accessible to game developers (you can track their progress in [hackerspace issue 43](https://github.com/gnolang/hackerspace/issues/43)). We’re also finalizing a grant for a DAO tinkerer and a research report, as well as evaluating the extension of a second grant to Dragos to port his popular project management app to Gno.land. \n\n\n*We’re steadily building out the Gno.land platform and our ecosystem of grantees and contributors. Let us know if you want to join us by submitting an application at any time on the [Funding and Grants repository](https://github.com/gnolang/ecosystem-fund-grants). We’re always on the lookout for ideas to advance the platform.*\n\n\n","2024-02-07T13:37:00Z","christina,michelle","gnoland,funding,grants"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["wyg-dragos","Who You Gno – On the Record with Dragos Roua","\n\nDragos Roua is a humble man. If you had the chance to read his article, [*5 Things I Learned While Porting Flippando From Solidity to Gno*](https://test3.gno.land/r/gnoland/blog:p/porting-flippando-gno), you’d have seen him refer to Flippando as his “tiny little game” and describe his “surprise,” over it winning the Polygon track of the Glitch hackathon, two subsequent hackathons in South Korea, and piquing the interest of the Gno.land team to offer him a grant. If ever there were an inverse of “the empty vessel makes the loudest sound,” Dragos would be it.\n\nAt 54 years old, he’s lived an extraordinary life. Growing up in communist Romania, where scarcity was in abundance, and “everything was in short supply,” Dragos and his peers were “only allowed to learn one coding language,” and it happened to be called “Whatever.” So, when anyone asks in what languages he knows how to code, he always jokes that Romanians can code in “whatever.” Joking apart, his language skills are impressive, to say the least. \n\n## Dragos Knows a Lot of Code\n\n“My first production-level code was written in Cobol on punch cards,” he says when he was just 16. He went on to learn Smalltalk, Lua, and “just for fun,” even a programming language called “Brainfuck.” He spent many years programming in web2, iOS, and Andriod, but over the last seven years (since entering the web3 space), has been consistently working in JavaScript, Swift, Solidity (which he learned by creating Flippando), Python, and Go. Despite this, Dragos confesses he still feels more at home within the Apple ecosystem. “I've been building a lot there,” he says. \n\n## He Speaks Many Languages\nI ask if learning programming languages is similar to spoken languages. “Every programming language has vocabulary and grammar, which is a specific set of rules over that vocabulary, so it’s similar in that sense,” he says. And how many spoken languages does he know? “I can speak five Indo-European languages” (Romanian, English, French, Spanish, and Portuguese). “Five?” I gulp, wide-eyed, suddenly feeling inadequate for only speaking three. “Well, they all share about 70% of the vocabulary, and the grammar has almost the same rule set,” he shrugs, minimizing his accomplishment.\n\nHe’s also learning two Asian languages with varying degrees of success. Korean, a language he understands “some 40%” of, Dragos admits, is a different ballgame. “I've been frustrated for nine months, every day trying to plug away because there's literally no similarity in vocabulary between any Indo-European language and Korean. Literally no word is the same, and the grammar is also very, very different.” He explains that learning a language like Korean means starting from zero and waiting for the brain to forge the neural paths. “It's quite difficult to do,” he concedes.\n\n## A ‘Location-Independent’ Lifestyle \nI check out the backdrop behind him. He’s taking the interview from an elegant cafe in downtown Saigon with impressive dark wooden walls, large ceiling fans circling above, and a rich colonial atmosphere. “It’s such a posh place,” he smiles, “every day, there are groups of people taking pictures. It has an Indochina vibe.” I can’t help but wish I could teleport over and share a beer with Dragos as we discuss his remarkable life. “How long have you lived there?” I ask, “I don’t live in Saigon,” he replies, “I’m location-independent.”\n\nAs I wonder if that’s a more elegant term for “digital nomad,” Dragos quickly explains the difference. Digital nomads typically have no fixed abode, he says, and tend to set up a base for a short period of time before moving on to the next place. Location-independent is someone who has a base but is independent of it and chooses to spend longer periods of time in various places. “So I became a loner,” he says, “and I’ve been location-independent for six years. I spent my first two and a half years in Spain, then from Spain, I moved to Portugal, which is my base right now, and I started to explore Asia last year.”\n\n## A Love of the Open Road\nI point out how amazing his lifestyle sounds—and also how challenging it must be at times. Dragos loves the freedom that comes with being alone in a foreign land and the master of his destiny. He also thrives on learning from different people and cultures and discovering more about himself. “The more you travel, the more you learn. Where can you stay? Where can’t you stay? What is needed? You learn the logistics, and you become a much better administrator and manager of your life.”\n\nHe admits to feeling lonely at times. Being location-independent isn’t for everyone, and certainly not if you don’t like being alone. “It's very difficult to be on the road because you don't have many friends. You don't have a fixed social circle. I'm in a place right now where I'm quite comfortable with myself. I can spend long periods of time on my own without needing close encounters. I have a very limited circle of friends, which I keep in touch with every month or so.”\n\nThe cultural differences between Europe and Asia are something of a double-edged sword as well. Dragos likes Vietnam, where the people are friendly and welcoming and talk to him on the street out of curiosity or to practice their English. But he’s felt like quite an outsider in South Korea, where the culture of politeness and restraint makes it harder to establish meaningful friendships. \n\n## Astrology, AI, and Other Mind-Blowing Stuff\nTalking about human connections inevitably leads to the increasing lack of them—and the topic of AI. I ask how he feels about the prospect of AGI and a potential replacement species. He shrugs and points out that most of what we hear about AI is marketing. He thinks that LLMs (Large Language Models) will hit a wall when they run out of good data to be trained on. He is a little concerned about the prospect of election rigging and AGI being harnessed in the political sphere by nation-states attempting to outmaneuver each other by predicting the next plausible move. “But this is a can of worms,” he says.\n\n“Actually, at the most fundamental level, there is no difference between AI and the process by which we generate ChatGPT or any other language model, and… hold your breath,” he pauses, “astrology. They both take a set of arbitrary features and a set of desired outcomes. After that, they just do a lot of computation, by trying to minimize a cost function between the predicted and expected outcome. That's all there is to it. You take features, add some parameters, trillions of parameters, you run a lot of computation, and in the end, you have the most plausible outcome. LLMs do this in hours/days/weeks of training, astrology did it slowly, over the course of a few thousand years.” \nI ask Dragos if he hadn’t been a programmer, would he have perhaps become an astrologer instead? “I actually studied astrology and used it for 18 years,” he replies.\n\nI try hard not to fall off my chair. Dragos explains that astrology plays a huge role in his life, and he consults it before making any major decision—such as moving countries or leaving jobs. “I consult it on every major decision and even daily life. So wherever I have to, I use it. When I sold one of my companies, when I decided to move abroad, when I travel, and stuff like that.” He gives the analogy of meteorology and says if he knows it’s going to rain, he’ll take an umbrella to have less friction and move around more easily. In the same way, he applies astrology to his life. This man is a Pandora’s box.\n\nWhat else does he do in his spare time besides traveling the world, consulting the Cosmos, and writing code for fun? Dragos likes playing pool, socializing, dining out, and dancing. “I was a tango dancer back in Romania. I had a tango school for a year.” At this point, I’m hardly surprised. \n\n## Dragos on Gno.land \nI met Dragos last year in Seoul at a Gno.land event hosted with Onbloc during BUIDL Asia. That’s when he spoke to Manfred about Flippando and subsequently applied for a grant. We were still building the specs for the Grants Program at the time, and Dragos was our first grantee. Since then, he’s embarked on a whole new journey learning Gno and building the airplane as it flies, delivering Flippando last month and regularly helping the team with Gno.land core issues.\n\nDragos has since submitted a second grant proposal to port his project management app to Gno. “It uses my life management framework, which I call “assess, decide, do.” The name of the project is *ZenTasktic*. There is already an app on iOS that I wrote,” he explains. You can read more about his grant proposal [here](https://github.com/gnolang/ecosystem-fund-grants/pull/11) and be sure to test out [Flippando](https://gno.flippando.xyz/flip) today.\n\nI apologize for taking so much of Dragos’ time, but he assures me it isn’t a problem. “I don’t work today, I'm not busy. I'm just enjoying my afternoon in this coffee shop.” As Dragos sips on the local tipple and drinks in the sights and sounds around him, I can’t help but admire his outlook on life and the choices he’s made—and I look forward to seeing what he's up to next and what else he builds with Gno.\n","2024-02-08T00:00:00Z","christina","whoyougno,flippando,community,interview"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"+F+eOVCdxtctjqHSNPXWrgoOqeizzWHiwIS0yEToec8kgkF7YCgf2d89ZExvlV2aweNJEq/R+xoRLMf1Yk+KtQ=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["gor-phase1","All You Need to Know About Game of Realms: Phase One","\n\nGame of Realms, the worldwide competition to find the best contributors to Gno.land, is currently underway. Unlike some contests you may have entered, we're doing things a little differently. We want participants to be instrumental in building the Gno.land platform with meaningful contributions that help shape the direction of the project – either by writing the best Gnolang smart contracts or contributing to the core blockchain. It’s not just about winning prizes but becoming a meaningful contributor. We encourage participants to collaborate on the challenges – your contribution will be rewarded on individual merit.\n\n## Phase One: The Basics\n\nPhase one of Game of Realms is about laying the foundations to onboard more people to the platform. You’ll need to be an advanced developer who wants to create core materials that power the platform every day. You should also be willing to document your work and even write tutorials and guides that help us advance to the second phase of the competition.\n\nThere is a total prize pool of 133,700 ATOM available during the Game of Realms competition, one-third of which (44,121 ATOM) will be allocated to contributions from phase one. During phase one, which we expect to last between 1-3 months, participants will open PRs against repos from the Gnolang organization. For additional information on the competition phases and timelines, be sure to check out the following resources:\n\n- [Game of Realms blog post](https://test3.gno.land/r/gnoland/blog:p/gor-launch)\n- [Game of Realms AMA recap](https://test3.gno.land/r/gnoland/blog:p/gor-ama1)\n\n## Phase One: The Challenges\n\n**Evaluation DAO**: To ensure contributions in Game of Realms are rewarded fairly, we need an Evaluation DAO. Allowing community members to vote on the best contributions and decide how much they are worth provides a level playing field for all. We’re therefore seeking your skills in DAO development and implementation. This is one of the most important challenges of phase one and the only challenge that must be approved unilaterally by the core team because of its key role in the competition and the future of the platform. Read more about the [Evaluation DAO challenge on GitHub here](https://github.com/gnolang/gno/issues/407).\n\n**Tutorials \u0026 Documentation**: So that we can progress to phase two and open up the Gno.land platform to a broader audience, we need written and recorded tutorials, guides, and documentation from phase one participants. There are almost no instruction manuals when it comes to this new frontier as the only smart contract platform using the Gnolang programming language. Help us to create materials that will onboard more contributors to Gno.land. Read more about the [Tutorials \u0026 Documentation challenge on GitHub here](https://github.com/gnolang/gno/issues/408).\n\n**Governance Module**: We want Gno.land to adopt the fairest and most effective governance solution possible; one that encourages voter participation and is transparent and accountable. We’re looking for contributors to define and implement a governance contract suite that rivals existing ones, such as the Cosmos Hub, and be implemented by other projects. Can you improve on that? Show us how! Read more about the [Governance Module challenge on GitHub Here](https://github.com/gnolang/gno/issues/409).\n\nAll phase one challenges will stay open during phase two. No competition points will be attributed during this phase as the points will be retro-funded by the Evaluation DAO and awarded during phase two.\n\n## Judging Criteria - What Wins Points?\n\nWhat will the judges be looking for when assessing contributions? You can find individual details on the corresponding GitHub issue regarding each challenge, but to get you started, the Game of Realms contest prioritizes communication and collaboration. We encourage participants to work together to find the best solutions. You will be awarded individually for your contribution but working as part of a team is highly valued. Good documentation that expresses high learning efficiency and shows how the task was completed in an educational way will also win additional points, as will a high standard of quality, great UX, and the ability to follow the contribution guidelines.\n\nAs this is primarily a developer-oriented competition, most of the organization for Game of Realms is happening on GitHub; come by the repo and [visit issue #408](https://github.com/gnolang/gno/issues/408) to contribute to tutorial and documentation writing for Gno.land.\n\n## Rules of Engagement\n\nAll participants must keep in mind a strict code of conduct and specific rules and criteria to ensure fair play. Throughout the Game of Realms competition, no plagiarism will be tolerated at any time. Participants may submit what they wish, however, any project that has already been allocated rewards or received compensation in any other hackathon or similar contest will not receive double pay.\n\nThat’s all for now. If you have more questions about Game of Realms or Gno.land you can join us in our next Office Hours session on Tuesday, March 14, 2023, at 4 pm UTC. You can also connect with other participants in the [Gnoland Discord](https://discord.com/invite/S8nKUqwkPn).\n\n## Game of Realms Phase 1: FAQ\n\nBelow are some frequently asked questions about phase one of the Game of Realms competition. If you can’t find your answer below, jump into our Discord and ask, or join us for a live “Office Hours” session with the core team.\n\n### Q. How are the tasks in the issues assigned?\n\nA. There are official communication challenges that we encourage participants to use.\n\n### Q. Can I work individually or should I work as part of a team?\n\nA. You are free to work in stealth mode, but please keep in mind that you risk finishing too late or losing points for being bad at collaborating. We expect the issues in phase 1 to be done by multiple people, in multiple steps. But anyone can try to make everything in stealth mode and open a PR with everything.\n\n### Q. How can I find collaborators?\n\nA. Participate on the issue or in Discord by indicating your desire to participate, by sharing your ideas, reviewing others' work, giving feedback, clarifying, or whatever makes sense.\n\n### Q. How can I ensure good collaboration?\n\nA. Since we are fully remote, collaborating can be a challenge and the best collaborators will be rewarded. We don't know each other, so having good communication is key.\n\n### Q. How will my collaboration be evaluated?\n\nA. At the end of a big task, i.e. the Evaluation DAO is finished, the core team will take all the small contributions and identify contributors, and then suggest how to split the task prize. We'll propose the split and allow room for public negotiations.\n\n### Q. How much is the prize pool?\n\nA. There is a total prize pool of **133,700 ATOM** available during the Game of Realms competition, one-third of which (**44,121 ATOM**) will be allocated to contributions from phase one.\n\n### Q. When will I receive my rewards for my collaboration?\n\nA. Rewards will be allocated retroactively by the Evaluation DAO during phase 2.\n\n### Q. Will there be a leaderboard and place where we can submit evidence for tasks?\n\nA. Not yet. The leaderboard will come in phase 2.\n\n### Q. What will the overall tasks consist of?\n\nA. Here is a non-exhaustive list:\n\n* Onboard more contributors (create tutorials and documentation)\n* Improve the project and implement more things\n* Bootstrap our genesis of contributors for the future mainnet\n* Experiment with Proof of Contribution by having a simpler system: Evaluation DAO\n* Identify the best participants to propose jobs\n* Identify the best organizations to propose partnerships\n\n### Q. Are there tasks for non-programmers?\n\nA. There are more tasks for programmers, but multiple parts are for non-programmers too. During phase 1, the tasks are relatively well defined, please read this:\n\nhttps://github.com/gnolang/gno/issues/390\nhttps://github.com/gnolang/gno/issues/540\n\n### Q. What are the requirements to start participating?\n\nA. There is no requirement to start participating. You’ll need to do some KYC at the end of the competition to receive a prize. Feel free to fill out the form linked in the Register section of the following issue:\n\nhttps://github.com/gnolang/gno/issues/390\n\nThis will allow us to contact you about the competition through our newsletter and set up prize payment later. Use the comment section of the issues or discuss them on Discord if you plan to work on specific tasks, so we can see that you’re actively working on a topic.\n\n### Q. Is there a fixed period of time for phase 1?\n\nA. No. Phase 1 will be finished when we consider that enough materials have been implemented to switch to phase 2.\n\n### Q. Is it possible to install a local testnet to get a proper local development environment?\n\nA. You can find the answer in this GitHub issue. Subscribe to the issue to get updates:\n\nhttps://github.com/gnolang/gno/issues/478\n\n### Q. Will there be a list of what needs to be tested? When will the tests start?\n\nA. The best place to look is on GitHub here:\n\nhttps://github.com/gnolang/gno/issues/390\n\nDuring phase 1, there are 3 official focuses:\n\n* Evaluation DAO\n* Tutorials\n* Governance Module\n\nThe competition was just announced, but we’ll review contributions made in the past, too, so it starts from the first commit, ~1-2 years ago.\n","2023-03-12T14:02:00Z","","gnoland,game-of-realms,faq"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-1","The More You Gno: Gno.land Monthly Updates","\n\nWe made progress across the board at Gno.land last month, from onboarding more devs to receiving an influx of contributions to the Game of Realms contest. To encourage development and discourse, we set up a biweekly public developer call in addition to our biweekly Office Hours sessions. Anyone can join, ask questions, and give their suggestions on how to shape the Gno.land platform and become a contributor. Last month, we covered several pressing topics from Gno IDE and Gno.land website language, to GnoVM, IBC, and ICS. Jae also came back to the circuit in March with two IRL workshops for devs at side events during EthDenver and Game Developer Conference (GDC) in San Francisco.\n\n## Developer Updates\n\nYou can find the live streams of the new biweekly public developer calls on [Gno.land YouTube](https://www.youtube.com/@_gnoland/videos) as well as access the agendas on [GitHub](https://github.com/gnolang/meetings/blob/main/notes/2023_03_15_dev_call_notes.md). The main talking points this month were Gno IDE, Gno.land website language and UX, garbage collection, bug fixes, and how to bring IBC and ICS to the platform. We are working on all these issues concurrently but the order of release will be Gno.land mainnet, IBC, and then ICS (this is reflected in the DAG below).\n\n[![Gno.land mini DAG](https://gnolang.github.io/blog/2023-04-15_myg-march/src/thumbs/mini-dag.png)](https://gnolang.github.io/blog/2023-04-15_myg-march/src/mini-dag.png)\n\n## Gno.land Website Language\n\nWe want to add more features for developers, such as libraries to make writing interfaces better and more consistent. There is an open topic for frontend developers with typography skills and library developers to create a UI framework for markdown or a custom rendering system.\n\nInternally, our core team is working on improvements to Gno.land’s website, making it easier to navigate with shorter columns while ensuring the text is markdown centric and readable in plain text and the GitHub rendering machine. We hope to achieve this using CSS and having classes for vertical columns, without having to make an extension to the markdown parser.\n\n## Gno IDE\n\nGno.land developer experience team is working on a web-based Gno IDE for quickly building Gno realms and packages right on your browser by just visiting a web app. Gno IDE will provide much improved UX for everything around building a realm (including making the testing easier), and additional features like autocompletion in the editor. Gno IDE will contain all the features you would expect from an IDE as well as valuable APIs for devs building tools around Gno.land with the public Gno Infrastructure.\n\n[![Gno IDE](https://gnolang.github.io/blog/2023-04-15_myg-march/src/thumbs/gno-ide.png)](https://gnolang.github.io/blog/2023-04-15_myg-march/src/gno-ide.png)\n\nGno IDE will have multiple modes to support different use cases. The normal mode will be used during everyday developments (as you’re familiar with from other code editors). The presentation mode is for high accessibility and readability. You can use it during video calls or physical workshops while projecting your screen to an audience. The third and perhaps most interesting mode is the embedded mode. Use this mode to embed the IDE into websites and blogs. This feature is especially useful for tutorials to test out sample code, run it on the real testnets, and play with it.\n\n## IBC and ICS\n\nAs depicted in the DAG above, Gno.land mainnet will launch first, followed by IBC and then ICS. We will focus on implementing IBC1, as we strongly believe in the ICS model and want to be a consumer of an existing Cosmos chain. We want a common ICS implementation that works across many hubs because Gno.land is a type of hub that will need its own ICS to scale while providing GnoVM on consumer chains on the Cosmos Hub. Our next step now is to find the best way to configure ICS for Gno.land and make GnoVM available as a consumer chain in the Cosmos Hub system.\n\nRegarding IBC, we will use the current implementation that was written for the Cosmos SDK and port that over to Tendermint2. We anticipate some issues along the way including security patches that need to be applied to our code base. There are multiple ongoing directions and discussions about how to bridge Gno.land’s smart contracts to IBC, which are essentially Interchain smart contract interactions.\n\nOne possibility is to have an API that submits events to a queue of outgoing events, and another queue to receive and consume events asynchronously. This mechanism could work for IBC2 to have rich inter-contract Interchain features, and the same API could work for Interchain plus smart contract interactions that require advanced options. We discussed a proposal to create a standard for Interchain contracts so that IBC2 could eventually be standardized eliminating limitations by applying it with an EVM, other languages, and CosmWasm.\n\nThis protocol could be based on Protobuf or a similar well-known syntax definition protocol so that we can push the Interchain to the next level. IBC2 will be safe and fast and replace vulnerable atomic bridges between multiple technologies. This is a major update that we are committed to developing and we need help identifying all the challenges involved. Working on IBC integration, separate from the Gno.land mainnet launch, will require significant time to understand how the light client system works. If you’re interested in taking on this task, let us know and we’ll set up a group. IBC will likely be the most important challenge of Game of Realms phase 2.\n\n## Garbage Collection\n\nCurrently, our work on garbage collection does not address the problem in the traditional Golang sense of dealing with memory efficiency. Instead, we are progressively optimizing and improving the main state tree by automating the clean-up of orphan nodes. The next phase will be targeting the official garbage collector component to begin work on memory management as we have some common Golang garbage collection challenges, but are identifying some uncommon ones too.\n\nWe need to consider elements like where to hold our objects because this is tied to releasing them in a concurrent lock-free way. We also need a good data structure. This is ongoing research as of now to implement a dedicated routine to synchronously clean stuff in a non-blocking way.\n\n## Game of Realms\n\nThis month, we have seen a massive uptick in contributions to Game of Realms phase one with a tidal wave of issues, general discussions, and PRs. One of the biggest things we worked on was adding support for MOD, which is a version of Go mod with an easier interface to manage your dependencies and version your dependencies. You can track the ongoing issue on GitHub [here](https://github.com/gnolang/gno/issues/390).\n\nThere have been some really strong contributions to the Evaluation DAO and governance module, as well as a big CLI refactor that went into our code base. We've also seen people contribute contracts like GRC 1155 or general improvements to existing realms, with many suggestions for fixing bugs. Finding bugs and reporting what people want is a good indication that the Gno.land platform is being picked up and gaining adoption.\n\nYou can find the Office Hours recordings that cover Game of Realms on YouTube [here](https://www.youtube.com/watch?v=JTmNg-b6Lcs).\n\n## Developer Events Stateside\n\nGno.land hosted a lively meetup during EthDenver last month where Gno.land founder and core dev Jae Kwon gave a talk for Solidity developers called “Gno.land, the Inevitable Next Generation Smart Contract Platform.\" He compared and contrasted Gno.land and Gnolang to Solidity, and showed Ethereum developers how the GnoVM shifts the smart contract paradigm. You can watch the [recording here](https://www.youtube.com/watch?v=IJ0xel8lr4c).\n\nAlso in March, Jae hosted a gaming workshop at a side event during the infamous Gaming Developer Conference (GDC) in San Francisco. “Gno.land for Game Developers, Building Your App in Web3,\" showed participants a sample gaming app built on the Gno.land platform and offered them the chance to try their hand at writing a smart contract for their app with Gno.\n\n## Virtual Events - How to Build a Forum\n\nCore tech lead at Gno.land Miloš Živković held a virtual workshop for Go devs called “How to Build a Forum.” He showed how Gnolang is a fast and simple way to build and launch smart contracts using the Gnolang interpreter virtual machine that interprets Gno and eliminates the need for any servers or ORNs.\n\nThe VM allows for the memory state of your Gno.land application to persist automatically after every transactional function call, which is a completely new way to handle transaction volume and memory recall. You can watch the [full tutorial here](https://github.com/gnolang/workshops).\n\n*We’d like the community to get involved in Gno.land’s monthly updates, so if you’re building on Gno.land and want to highlight your development, project, event, or idea, let us know and we’ll include your contribution.*\n","2023-04-15T13:37:00Z","christina","gnoland,gnovm,tm2"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-2","The More You Gno: Gno.land Monthly Updates - 2","\n\nOver the past few weeks, our core devs and ecosystem contributors have been making massive strides on Gno.land. There’s a lot to cover in the second edition of *The More You Gno*, from updates on Tendermint2 and GnoVM to stack/frames management, Gno IDE, and plenty more. We’ll also see what some of the external teams contributing to the platform have been up to, including Gno.land’s first decentralized exchange, GnoSwap, and Adena compatibility with GRC20 tokens. Check it out.\n\n## Tendermint2\n\nWe’re making steady development progress on Tendermint2, which focuses on simplicity of design, minimal code, minimal dependencies, modular dependencies, and completeness. For the time being, Tendermint2 will stay in the main repo in a top-level folder named Tendermint2. This is the official location to develop and improve the consensus protocol until it is stable enough to be extracted from the Gno repo and become a standalone project. Currently, Tendermint2 depends on GnoVM, however, we are working to unlink this dependency and build a basic demo Tendermint2 chain and Client.\n\nTendermint2 JS/TS Client is a JavaScript/TypeScript client implementation for Tendermint2-based chains. The client will make it easier for developers to interact with Tendermint2 chains, with a simplified API for account and transaction management, removing a ton of manual work and allowing developers to focus on building their dApps. You can [read more about the client here](https://www.npmjs.com/package/@gnolang/tm2-js-client). In addition to the Tendermint2 JS/TS client, we also created a Gno JS/TS client that just extends the TM2 one to provide Gno-specific functionality. You can read more about this here.\n\n## Game of Realms\n\nThe incentivized competition to find the best contributors to Gno.land continues in phase one, with slow but steady progress being made. Nir1218 initiated an Evaluation DAO Kickoff discussion in [issue 792](https://github.com/gnolang/gno/pull/792) to initiate testing code for the key smart contract infrastructure that will power the Gno.land platform. We are also interviewing architects for the core team with experience in governance modules and creating new economies on-chain, and a new DevRel team member will be joining us soon to create awesome tutorials and documentation to advance Game of Realms further. Gno.land must be built by the community and we will not rush to push Game of Realms to the second phase until we have found quality contributors to complete the challenge tasks and become the platform’s first founding members.\n\n## Gno IDE\n\nOur core development team is working on a web-based IDE for Gno.land that will greatly improve the developer experience, allowing builders to quickly spin up Gno realms and packages right on their browsers just by visiting a web app. Currently named Gno IDE but with a rebranding on the horizon, this intuitive product focuses on ease of use and improved UX, and will include all the features you’d expect from an IDE, such as auto compilation in the editor, debugging, extensive testing capability, and powerful APIs like IntelliJ to supercharge your programming.\n\nGno IDE currently has multiple modes to support different use cases, including a normal mode for everyday programming, similar to a standard code editor, a presentation mode for video calls or screen sharing, and an embedded mode to extend functionality, allowing you to embed the IDE directly into websites and blogs. You can also choose to edit your code in Emacs or Vim and easily switch between steps, from previous to next, making creating your tutorials and blog posts more intuitive. Watch out for more to come on Gno IDE soon, and if you want to contribute by creating a plugin for your favorite editor, open a PR to win contribution points.\n\n## Stack/Frames Management\n\nThe stack/frames is an integral part of the virtual machine (VM) and the language. Stack/frames provide context for smart contract developers, enabling them to access useful information, such as the original caller, or to determine if a contract is being called through another one. The current implementation is limited in scope and relies on fixed positions in the stack which can lead to inconsistencies.\n\nThere is an ongoing [issue 683 open here](https://github.com/gnolang/gno/issues/683) and we have continued to work on enhancing stack/frames development over the last month. We’re adding a new function in the standard library std.PrevRealm (previously GetRealmCaller). Currently, we only have GetOrigCaller, which returns the user calling the first realm. This is not secure and we need a way to call the previous caller. This will allow a realm to handle GRC20 treasuries. See [issue 667](https://github.com/gnolang/gno/pull/667) and [issue 634](https://github.com/gnolang/gno/issues/634) for further details.\n\n## Dealing with Panics in Native Functions\n\nWe have devised a solution for dealing with panics in native functions, [see pull request 732](https://github.com/gnolang/gno/pull/732). Previously, when there was a panic in a native function, we could not recover it in Gno code. An example of this was the assert origin call, which panicked if the call was not a direct call from a transaction. Based on discussions with contributors, we’ve agreed that native functions should never panic, but if they panic, they panic with machined Gno panic. This gives us the choice in a native function to code a Gno panic, or, if it's a very bad panic, use Go panic so that we know the Gno code is unable to recover it.\n\n## Logic Upgrading\n\nMaking it possible to upgrade your logic is definitely out of scope for the first version of Gno.land, however, it’s an important issue that we have begun to discuss so that we can place certain restrictions on it, such as allowing upgrades when we consider them safe enough to be compatible with imports. Another idea is to work on creating workflows where migrations become something official. This way, we could define ways to migrate a contract completely in a single transaction at the chain level. Once everything is working and approved as the previous contract is parsed or archived, the new one gets the data. We will revisit this topic after the first version of Gno.land reaches the mainnet.\n\n## Garbage Collection\n\nIn terms of garbage collection, we don’t have memory leaks as such but we do have defacto memory leaks. By the VM having references to all objects, they won’t be released by Go’s underlying GC. We have some form of reference counting but it is only done at the end of a transaction. We have implemented a mark-and-sweep garbage collector and are working on the VM runtime to manage the objects and signal to the garbage collector to release them when they are no longer needed. This is done by adding the notion of a heap, which is managed by the garbage collector.\n\n## GnoVM\n\nDeveloping GnoVM is an ongoing task and we will likely need to fork the GnoVM to create different competing versions. GnoVM will be complete, limited in features, and serve as the only interpreter, an enduring reference point over time. Future versions of GnoVM will be designed to incorporate CosmWasm so that all Cosmos chains can have CosmWasm enabled and the VM can run directly on the browser and execute tasks on the browser without requiring to make an API call, making it faster. To do this, we can make a Gno compiler in WebAssembly without changing the code because Go supports WASM cross-compilation.\n\nWe plan on making a competing version of the original minimalist GnoVM, such as a Rust version with a JIT compiler using LLVM as a backend.\n\n## Ecosystem Updates\n\nSince our last update, the Gno.land community continues to expand with awesome teams and contributors building cool infrastructure and projects on the platform. Below, we take a look at the largest developments of the past few weeks and extend a special thanks to everyone helping us build Gno.land.\n\n## Teritori\n\nTeritori blockchain and multi-chain hub launched in November 2022, allowing IBC and non-IBC communities to connect, create groups, exchange tokens and NFTs, and launch new projects. Teritori’s idea for building on Gno.land is to create a multi-chain experience for users with a web portal, NFT marketplace, and social feed that will grow the community, and gradually integrate smart contracts and realms. This will promote Gno.land to more developers and showcase all the dApps being built through an easy-to-navigate dApp store. In the coming weeks, Teritori will work with the Onbloc team to integrate the Athena wallet into their portal as well as discuss ideas for promoting Game of Realms to new developers.\n\n## Onbloc\n\nOnbloc is one of the Gno.land ecosystem’s most active contributors, responsible for building the Adena wallet and the block explorer Gnoscan. The team has also been working on creating an official Gno SDK that will allow developers to interact with Gno.land more easily, and remove some of the current friction. Onbloc opened [issue 701](https://github.com/gnolang/gno/issues/701) on GitHub primarily for developers who either have their own web app or are building a JavaScript app and want to work with Gno in some way. Currently, developers need to do a lot of manual work, which Gno SDK will abstract away, improving the workflow and developer experience. If you have any ideas or feedback, please contribute to the aforementioned issue.\n\nIn another cool development, Onbloc has rolled out a new feature in Adena and Gnoscan to provide support for GRC20 tokens. To store and send tokens, you can open your Adena wallet, click on \"Manage Tokens”, navigate to the Custom Token page, and see which GRC20 tokens are available on Gno Testnet 3, searching by the symbol or path. To research on or discover tokens, head over to the Tokens page on Gnoscan for a full list of GRC20 tokens. You can click on any token on the list for detailed information, such as the total supply, owner, or other available functions built into the token. The Account Details page has also been updated to display all tokens owned by each address. You can help by checking out [issue 764](https://github.com/gnolang/gno/pull/764), which discusses adding bigint to support a wide range of numbers and encoding binary, and [issue 816](https://github.com/gnolang/gno/pull/816), which highlights a small bug the team runs into when coding.\n\nOnbloc has also created a new [token resource page on GitHub](http://github.com/onbloc/gnotokenresources) for anyone to share or upload resources associated with their Gno.land project. This will serve as a shared knowledge pool about any dApp on the platform. If you wanted to create a decentralized exchange, for example, you would need all the information about the tokens available on Gno.land, such as their images, symbols, descriptions, links to websites, etc. Now you can find this in one handy GitHub repository. If you’re a developer or builder who wants your logo or any other static data posted, be sure to submit a PR.\n\nAnd speaking of decentralized exchanges, Onbloc is also building Gnoswap, the first DEX to be powered by Gno.land, designed to simplify the concentrated liquidity experience and increase capital efficiency for traders. Its interface is built using TypeScript to be user-friendly, secure, and accessible for streamlining complex mechanisms such as price range configurations and staking as part of its core service. Contribute to its interface [here](https://github.com/gnoswap-labs/gnoswap-interface).\n\nAs for the contract side, Onbloc is actively working on its development with help from the core members of Gno.land. The code will be open-sourced for full transparency once the basic functions are ready.\n\n## New Core Contributors\n\nWe’re excited to welcome two new core team members, Antonio and Zack. Antonio joined us in April in the core team, bringing with him vast experience in IPFS, and writing Git servers in Go. Zack is our first “tinkerer in residence” and will try to bootstrap the ecosystem of small contracts and small libraries. He will also be writing apps and helping us design a system to better share and showcase our work with a super UX for team builders and open-source addicts.\n\nAntonio is already hard at work researching a benchmarking dashboard that will show performance improvements or regressions when we change the code. He’s assessing whether to use GiHub to track actions or run our own machine to execute GitHub actions. Take a peek at his research so far on [issue 783 here](https://github.com/gnolang/gno/pull/783).\n\nZack is working on a microblog project. As an experienced web2 Go programmer, Zack is transitioning to web3. Since he’s interested in incentivized social networks, the microblog project will be his first realm, as a Twitter-style blog without titles, where each user has their own page based on their address. Check out [issue 391](https://github.com/gnolang/gno/pull/391) for more details.\n\n## Developer Events\n\nOver the past few weeks, our core devs have been mainly focused on building but they’re preparing to speak at some exciting events in the coming months. Catch up with Manfred at BUIDL Asia, in Seoul, South Korea, from June 5 - 9. We’re co-hosting a side event with Onbloc, Code States, and Cosmostation on June 5, so be sure to register if you’re in town! We’ll also be at EthBelgrade in Serbia from June 2 - 4, and GopherCon in Berlin from June 26 - 29, so stop by and say hello.\n\n*Do you want to contribute to Gno.land’s monthly updates? If you’re building on Gno.land and want to highlight your development, project, event, or idea, let us know and we’ll include your contribution.*\n","2023-05-26T13:37:00Z","christina","gnoland,gnovm,tm2"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["funding-program","Announcing the Gno.land Funding and Grants Program","\n\nIf you’re interested in building in Gno.land and using the Gnolang (Gno) language to make a meaningful contribution, we’ve launched the Gno.land Funding and Grants Program to support you on your journey. If you’re a developer, tinkerer, researcher, or educator and you’re excited by the idea of creating innovative dApps, tooling, infrastructure, products, or smart contract libraries on Gno.land, now you can apply for funding.\n\n## About the Gnoland Funding and Grants Program\n\nWe’re building Gno.land to endure with timeless code that will serve as a reference point for many years to come. Secured by a novel consensus mechanism, Proof of Contribution, Gno.land rewards contributors fairly, addressing one of the blockchain industry’s biggest problems. The developers that are most active on the platform with the highest quality contributions will secure the most rewards. We already have a growing community of Gnomes innovating and building on Gno.land and we’re looking to add more contributors to extend the usability of the platform and its smart contract library.\n\nOur grants program will encourage further participation by allocating financial awards and contributions to individuals and teams who want to build dApps, core infrastructure, products, or features on Gno.land, incentivizing more like-minded Gnomes to test the Proof of Contribution mechanism and push the chain to new limits. The grant amount and duration will depend on the scope and ambition of the project as well as the work involved.\n\n## Types of Contributors\n\nThe Gno.land Funding and Grants program is divided into four different categories – tinkerer, builder, researcher, and educator – to ensure that we cater to a diverse range of people and working preferences. Here’s how we define these categories:\n\n- Tinkerer: You want to experiment and invent\n - Build dApps, improve features, and find and develop new ideas\n- Builder: You have an idea and are ready to build it\n - Build dApps, infrastructure, tooling, products, or port your existing apps to Gno\n- Researcher: You want to discover and analyze\n - Deep dive into topics linked to the Gno.land universe\n\n## What We Are Looking For\n\nTo qualify for a Gno.land grant, we’re looking for motivated and passionate people who can contribute by developing dApps, core infrastructure, useful and innovative products, or features that improve the usability of the Gno.land chain, specifically:\n\n- Decentralized Applications (dApps)\n - What types of dApps do you want to see on Gno.land? Show us.\n - Build, test, and launch a suite of Gno.land dApps for the community, focusing on diverse use cases and industries such as DeFi, gaming, supply chain management, and social media. Ensure that these apps cater to both individual users and businesses\n - These dApps should integrate seamlessly with existing Gno.land infrastructure, encourage user interaction, and promote the adoption of Gno.land services\n- Infrastructure, DevX, Quality\n - Develop comprehensive GitHub and AWS integration for Gno.land, including streamlined deployment processes, continuous integration and delivery pipelines, and monitoring tools\n - Create Helm charts for easy deployment and management of Gno clusters, enabling users to quickly set up and scale their Gno infrastructure\n - Design and implement an event system for Gno.land contracts, allowing for real-time monitoring, analysis, and auditing of contract-related events\n - Enhance Gno.land security by conducting regular vulnerability assessments, penetration testing, and implementing best practices for secure smart contract development\n- Products\n - Develop advanced project management software tailored to the needs of Gno.land developers and teams, with features such as task tracking, collaboration tools, and integrated Gno.land services\n - Create comprehensive documentation, including guides, tutorials, and API references, to help users understand and utilize Gno.land's features and services more effectively\n - Design a censorship-resistant smart contract system, enabling secure and transparent transactions and interactions on the Gno.land platform, free from external interference\n- Interoperability \u0026 Integration\n - Implement cross-chain compatibility and interoperability, allowing Gno.land to connect and interact with other blockchain networks, expanding its potential user base and increasing its overall reach\n - Develop a powerful integrated development environment (IDE) specifically for Gno.land developers, with features like code completion, debugging tools, and seamless integration with Gno.land services\n - Design and launch a user-friendly wallet for Gno tokens, featuring a secure and intuitive interface, support for multiple devices, and easy integration with Gno.land dApps\n\nThe above guidelines are by no means exhaustive and are intended to spark your imagination and give examples of the types of contributions we’re looking for in Gno.land. We’re open-minded and willing to assess all grant proposals, so if you have an idea that’s not on the list or a suggestion that you think will benefit our vibrant community, let us know. If your submission doesn’t qualify for a grant, we’ll do our best to provide you with open and honest feedback and points for improvement, as well as identify any opportunities to get involved in our ongoing incentivized Game of Realms competition.\n\n## Meet Our First Grantees\n\n### Onbloc\n\nOnbloc is a blockchain software company building core infrastructure for Gno.land and\n\nhelping other dApp developers onboard to the Gno.land ecosystem seamlessly. The team has developed the Gno.land Developer Portal, which provides comprehensive introductory docs for developers, the Adena web3 wallet for Gno.land, and the Gnoscan block explorer. As Gno.land’s most active contributor, Onbloc is leading many community-driven initiatives and we’re excited to extend a grant to this passionate South Korea-based development team to continue their incredible work developing the wallet further, iterating the Gnoscan block explorer, and building Gno.land’s first DEX, Gnoswap.\n\nIn addition to this, we want to encourage Onbloc to continue their amazing work with the community, contributing to meetings, replying to comments on our social platforms, writing code base, organizing local events and meet-ups in South Korea, and creating products that expand the Gno.land ecosystem.\n\n*“Onbloc is thrilled to be a part of the Gno.land Grants Program. As one of the earliest contributors, our endeavors have involved releasing technical guides and research reports, developing infrastructure tools for dApps, creating DeFi smart contracts, and more. We are excited to leverage this grant to further enhance the quality of our products and strengthen our workforce. The grant will enable us to cover some of the existing expenses and hire additional developers to focus on smart contracts and the core side of GnoVM. We expect these endeavors to push the Gno.land blockchain to new limits and accelerate the achievement of the milestones on our roadmap. With the support from the Gnoland team, we are confident in our ability to make significant strides and further contributions to foster the growth of the Gnoland ecosystem.”*\n\n*Dongwon Shin, CEO, Onbloc*\n\n### Teritori\n\nTeritori is a super-dApp project allowing individuals and organizations to interact, organize, and communicate in a radically resilient and decentralized way. Based on an interoperable vision, the application is built on a multi-chain experience approach, gradually integrating Gnolang as the fundamental technical brick of the system. Currently in Beta ([available here](https://app.teritori.com/)), the app is making modular tools and dApps available to users, with a single gamified user experience. Teritori's philosophy is to offer users and developers a place that belongs to them, their territory, with an emphasis on interoperability, modularity, and customization.\n\nUsers can interact with a social network, NFT marketplace, DAO launcher, service marketplace, games, etc., and integrate a plethora of dApps thanks to the dApp store, where Teritori will promote all Gno.land dApps to encourage the growth of the ecosystem. Using the Gno.land grant, Teritori will continue this amazing work and develop a moderation DAO to provide content moderation to Gno.land in a healthy and decentralized way, a challenge that faces the entire web3 industry. By 2024, the UX of Teritori v1 will be based on decentralized messaging without blockchain, allowing users to converse in a \"natural\" way while adding modules and web3 features. Creating and managing a GnoDAO could be as easy as managing a WhatsApp group.\n\n*“At Teritori, we want to make decentralized organizations accessible to all and experiment with new governance models for humans, social groups, businesses, and diverse organizations. Gno.land enables us to build this vision in a modular, future-proof, and censorship-resistant way. Thanks to the Grants Program, we'll be able to accelerate our development, continue to contribute proactively and build user experiences that enable as many people as possible to discover the Gnol.and ecosystem. We're starting work developing a DAO launcher, with different standard templates for DAOs, in particular, DAOs enabling moderation within news feeds, forums, or social networks. This will rapidly open many doors, such as those of conflict resolution DAOs, on-service marketplaces, or project management software. Gnol.and is a playground where anything is possible! We'll be documenting [our journey here](https://github.com/gnolang/hackerspace/issues/7#issuecomment-1588197187), and sharing our progress as we stay connected to the needs of the community.”*\n\n*Zooma, Core Lead, Teritori*\n\n### Zack\n\nZack is the first tinkerer-in-residence at Gno.land. With a deep-rooted passion for innovation, he embraced Go early on in 2013 and ever since, has been harnessing its power to craft peer-to-peer programs and develop web2 applications. While Gno.land marks Zack's initial foray into web3 development and blockchain dApps, the Gnolang language allowed him to effortlessly apply his Golang expertise. This has enabled him to flourish within an ecosystem that revolves around decentralized systems, seamlessly transitioning his skill set to create unique decentralized solutions.\n\n*“I have always been curious about web3 and blockchain technologies but have not developed expertise in smart contract languages and struggled to keep up with the fast-changing ecosystem around blockchain technologies. As an avid Go programmer, Gno and Gno.land created the opportunity for me to develop decentralized applications on blockchains by providing a framework and ecosystem that is consistent with Golang in terms of syntax, sustainability, and stability. The additional web3 features in Gno and Gno.land provide huge potential for interesting applications that I hope to unlock to move beyond web2 and harness blockchain technology for novel use cases. The grant provided for tinkerer-in-residence was the key to giving me the resources to move through this ecosystem as I try to think outside the box for what web3 can be and what blockchain can do for a web2 developer like myself.”*\n\n*Zack Scholl, tinkerer-in-residence*\n\n**How You Can Apply**\n\nActions speak louder than words. Until Gno.land is completely on-chain, the best place to start is by contributing to PRs and issues on the Gno.land repos or participating in the Game of Realms competition. If you want to apply for a grant, you’ll need to fork the Gno.land Ecosystem Fund repo and outline your proposal in your project name’s file. Once we receive your application, our team will review it and get in touch if we believe that you fit the criteria. [See GitHub for full instructions](https://github.com/gnolang/ecosystem-fund-grants). Stay tuned, we’ll be hosting a Funding and Grants Program Q\u0026A in the next few weeks!\n","2023-06-27T13:37:00Z","christina,michelle","gnoland,funding,grants"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-3","The More You Gno: Gno.land Monthly Updates - 3","\n\nWe’ve been busy since the last edition of *The More You Gno,* with the Gno.land core team and ecosystem partners present at various global developer events. We’ve visited many gnomes (and gnomes-in-the-making) around the world from Berlin to Belgrade, spreading the word about Gno.land and growing our expanding community. Aside from all the networking, Gno.land is taking shape with a new iteration of our website, the Gno.land Funding and Grants Program, and a host of developer updates as always. Let’s dive in.\n\n## Gno by Example\n\nWe recently launched [Gno by Example](https://gno-by-example.com/), our equivalent to both [Solidity by Example](https://solidity-by-example.org/) and [Go by Example](https://gobyexample.com/), where you can see tutorials and code snippets to help you learn and get more easily onboarded to Gno.land. Gno by Example is designed to be community-run with a front-end app and tutorials in markdown. There’s also a specific markdown syntax where you can embed certain file fragments to make your tutorials more structured. We’d love to build this into the ultimate resource center for Gno.land, so feel free to [contribute](https://github.com/gnolang/gno-by-example) with new tutorials and sections. Contributions here are eligible for rewards from the Game of Realms competition.\n\n## GnoVM\n\nWe continue developing GnoVM and invite you to provide feedback on what can be improved. This month, there have been a lot of discussions about how to improve native bindings and use the Gno machine in native function calls. Native function calls are well-defined in Go code generation and Go templates but need some modifications for GnoVM. For example, since new native functions already exist in the Gno code, when we try to define a native function, calling the function doesn’t yield the desired result. We’ve created a bunch of panics and tried writing out native functions to see what goes on for them, in an investigation that will go on for the next few weeks. Got any ideas? Please contribute. ([PR 859](https://github.com/gnolang/gno/pull/859)).\n\n## Testnets\n\nTalk about testnets has come up a lot in recent weeks and how to best proceed. Some gnomes are asking for a multi-node testnet to allow for great experimentation, whereas others prefer to keep the testnet single-node. There are advantages and disadvantages to both approaches and we are still listening to feedback and ideas. However, we will likely keep testnet 3 single-node and focus on the language while having a second dedicated multi-node testnet where devs can get creative, think outside of the box, test performance, consensus, and everything they need to push the chain to its limits. We’ve created a new [Hackerspace](https://github.com/gnolang/hackerspace) Repository for the multi-node testnet to prevent spam on the main repo, so please use it to share your scripts, posts, snippets, etc.\n\n## Native Coins and GRC-20 Tokens\n\nWe uncovered some significant issues with the banker module ([PR 393](https://github.com/gnolang/gno/pull/393)) regarding minting and burning tokens with the package minter. It was not scoping, filtering, or minting tokens correctly, making it possible to mint and burn unlimited tokens, including GNOT. We want to allow any realm to create its own token and run multiple tokens on their chains, but we need a prefix for security to resolve the issue and allow anyone to create GRC20 smart-contract-based coins but not native coins. We continue to work with small fixes on this issue and will reopen the PR soon.\n\n## Gno.land Funding and Grants Program\n\nLast month we released our Funding and Grants Program to encourage more developers, researchers, educators, and tinkerers to interact with Gno.land. If you’re interested in experimenting with Gnolang (Gno) and building innovative dApps, tooling, products, or infrastructure, check out our GitHub [Funding and Grants](https://github.com/gnolang/ecosystem-fund-grants) page for further information on how you can apply. Start contributing to Gno.land or Game of Realms as this is a prerequisite of the funding and grant application process.\n\n## Developer Relations\n\nThe Gno core team is growing! We hired a new DevRel last month and are looking to take on another dev for this open position, so if you’re interested, head over to our [careers page](https://jobs.lever.co/allinbits) and apply! You can expect to see a lot more documentation, FAQs, tutorials, and onboarding materials in the coming weeks and months.\n\n## Ecosystem Updates\n\nOur community of gnomes continues to expand, making tons of activity and progress over the past few weeks. Let’s see what they’ve been up to below.\n\n## Onbloc\n\nOnbloc has been super active this month attending and co-hosting IRL events and networking to find new gnomes about town. Among other updates, Onbloc has completed the first integration of Tendermint2 JS with the Adena wallet and will continue to swap out their existing libraries with TM2JS wherever applicable to ensure that they are as tightly integrated as possible. The team has also open-sourced the Gnoscan block explorer, so if you’re interested in contributing, hop on over to [Gnoscan](https://gnoscan.io/) or the [GitHub repo](https://github.com/onbloc/gnoscan).\n\n## Teritori\n\nAnother of our first cohorts from the Grants program, Teritori continues to churn out awesome work and expand its growing team. This month, Teritori has been busy integrating Adena with the Teritori app and working on the DAO contract to build a DAO deployer and various DAO standards and templates for DAO creation. Teritori’s target is to focus on a moderation DAO that can be used for content moderation in social feeds and boards. In the coming weeks, the team plans to integrate the DAO contract into the UI to allow the community to launch a DAO and experiment on the testnet. They have also made an effort to really integrate Gno users by adding .gno at the end of nicknames for people to use. All our grant recipients are documenting their journeys in the hackerspace repo, check out [Teritori’s](https://github.com/gnolang/hackerspace/issues/7) journey.\n\n## Resident Tinkerer, Zack\n\nAnother grant receiver, Zack, has been making significant progress on his microblogging project. You can check out the specs on GitHub ([PR 791](https://github.com/gnolang/gno/pull/791)) or watch the informative tutorial video, [Go to Gno: How to Build a Microblog](https://www.youtube.com/watch?v=F-_dadxcRJM). You’ll find this especially useful if you have a background in Go and need some additional insights to turn your hand to blockchain coding. Zack has also been working on an implementation of a smart contract for creating and transferring text-based NFTs that conform to haiku poetry standards (find out more on GitHub ([PR 860](https://github.com/gnolang/gno/pull/860)). Other than that, Zack continues his Gnolang journey, “learning and having a lot of fun.”\n\n## EthSeoul, BUIDL Asia, and Getting to Gno\n\nJune saw members of our core team heading over to Seoul, South Korea, for a week of networking, talks, and events. Our VP of Engineering Manfred Touron gave a keynote on the evolution of smart contracts and an introduction to Gno.land for participants of EthSeoul, followed by a fascinating dive into Proof of Contribution at BUIDL Asia, where we also had a booth. It was an honor to meet so many talented and motivated Korean developers and contributors from around the globe. Seoul is a hotbed of up-and-coming talent and we’ll definitely be back soon.\n\nWe also had the chance to meet with our most active ecosystem contributors Onbloc and co-hosted an event together, Getting to Gno, at the Code States developer academy along with long-time Cosmos builders, Cosmostation. Attendees had the chance to hear about what the core team is building and see some of the great work of our community. A massive thanks to everyone involved, it’s awesome to be BUIDLing together! Read more about our Korean adventures in this [fab write-up by Onbloc](https://medium.com/onbloc/2023-buidl-asia-recap-894c60a1c0f).\n\nEthSeoul - [Watch the talk here](https://www.youtube.com/watch?v=_iSsStlmxoU)\n\nBUIDL Asia - [Watch the talk here](https://www.youtube.com/watch?v=v6k3NHm5vcE)\n\n## EthBelgrade\n\nCore contributor Milos Zivkovic rocked the Gno.land presence at EthBelgrade in Serbia, giving an introductory workshop about Gno.land, called 'Alice in Gno.land'. Being the first Ethereum conference organized in Serbia, there were lots of attendees from all over the Balkans. Participants joined in a journey through the enchanting realm of Gnolang and the Gno.land platform. Most of the participants were not aware of Goland before but were avid Gophers eager to learn more about the application of the Gno language in blockchains.\n\n## GopherCon Berlin\n\nThe Gno.land team also had a blast last month at the European edition of GopherCon in Berlin. We had a booth at the event for two days, where we networked, talked about all things Gno, made some amazing connections, and even shared some live code! We’re looking to build an active, open-source Gopher contributor group in Gno.land, so stay tuned for more on that soon.\n\nComing up later this month, Gno.land is an official sponsor of EthCC, Paris, July 17-20. Stop by our booth to pick up some swag, say hey, and ask your questions about Gno.land. You can also catch us at the Nebular Summit for a keynote and workshop by our VP of Engineering, Manfred Touron.\n\n*Do you want to contribute to Gno.land’s monthly updates? If you’re building on Gno.land and want to highlight your development, project, event, or idea, let us know and we’ll include your contribution.*\n","2023-07-11T13:37:00Z","christina","gnoland,gnovm,tm2"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-4","The More You Gno: Gno.land Monthly Updates - 4","\n\nWe’ve had more on our plates than ever over the last few weeks, with a huge team presence in Paris at EthCC and Nebular Summit in July, an opening talk at Stanford Blockchain Club in August by Gno.land’s founder Jae Kwon, and some awesome contributions from Gno.land grantees and ecosystem partners, including the first demos of Gnoswap and Teritori’s social platform and DAO deployer. We continue to make solid progress on GnoVM, an alternative VM in Rust, Tendermint2, native bindings, and much more. Check out our latest developer updates below.\n\n## Upgrade Strategy for AVL Between GitHub and test3.gno.land\n\nOne ongoing discussion is about an incompatibility bug that affects many things we do on Gno.land. The current AVL implementation on the testnet is outdated and does not match the AVL implementation users get when they pull in the latest master branch. Therefore, building and deploying contracts on a local Gno chain (with the latest master changes) and deploying those same contracts on the testnet may fail due to this incompatibility. We need to find a way to seamlessly integrate these two approaches. Ideally, when you write code on the master branch on GitHub, it should work on the testnet as well.\n\nIn [issue 970](https://github.com/gnolang/gno/issues/970), you can find details of five different proposed solutions to implement this upgrade strategy, from resetting the whole blockchain (which would mean losing on-chain content and debugging information) to implementing a migration feature specifically for testnets that allows developers to rename packages and patch their contracts before publishing them. There are pros and cons to each proposal, and we continue to work together to find the best way forward.\n\n## Encoding JSON and the Discussion Around Reflection\n\nSome contributors have highlighted the need for native JSON encoding, and we are discussing how best to approach it. See [issue 808](https://github.com/gnolang/gno/issues/808) for further details. One idea is to copy the code from encoding JSON in the standard library Go and take it over to Gno, but we would need to have reflection to do that. So, the important question here is whether we want to have reflection and, if so, what it should look like. We could emulate Go’s reflection package with some added elements, like being able to inspect the realm state, but we would need to be extremely careful about how we do this.\n\nFor example, should users be able to read private fields of external packages through reflection or even *ufmt*, or could that introduce a problem? It would be simpler, and the language capability security would be tighter and easier to understand if we made accessing private fields impossible, but that would also make it limited. We could consider supporting reflection as an internal user package and whitelisting and encoding JSON. This way, new encoding packages would have to be whitelisted because they’re using the reflection package. We could also mark reflection as unsafe so developers know they must carefully audit their work.\n\nAnother solution is the partial implementation of reflection. In [issue 971](https://github.com/gnolang/gno/issues/971), Gno.land core engineer Petar discusses introspection, which involves implementing reflection as Go has it now but enabling only one of its two main capabilities: the ability to inspect types, but not the ability to modify code. The main difference between introspection and reflection is that, since it is done at compile time, it is completely type-safe. This discussion is ongoing.\n\n## Alternative GnoVM Implementations\n\nTo deliver the best possible virtual machine, we’re working on two different implementations of GnoVM. Petar has spent the last three weeks developing a new GnoVM implementation written in Rust. His work is still private as the machine is not yet ready for public use, but he will soon make the code public for your inspection. Rust gives the ability to write more performant code and, in some scenarios, the Rust GnoVM can run up to 20 times faster than the GnoVM at roughly 87 milliseconds compared to 2,000 milliseconds on a Fibonacci benchmark, which is a considerable improvement in speed.\n\nSince one of Gno.land’s core features is that the entire tech stack is written in Go, we’re unsure if everyone will appreciate a Rust GnoVM or whether it aligns with our vision. However, it’s always good to provide alternatives, and, Petar argues, as long as the VM carries out the same functions (and does so more cheaply), most developers won’t mind what language the VM is written in.\n\nRust has a few other features that some developers may favor over Go, such as more tools for creating languages, advanced garbage collector libraries that allow you to change the algorithm without changing the runtime (by swapping out a tricolor algorithm for a generational one, for example), and built-in data structures that solve many issues. For example, we needed a deterministic map that is fairly fast. With Rust’s Btree in the standard library, this was simple, Petar only had to implement the native Go map type with a Btree map from the standard library. This took just a few minutes.\n\nCore team dev Marc has also started an initiative to improve the Go GnoVM so that it is faster and offers a clean and user-friendly interface. He believes the debate over the VM is more about whether to have a VM that is bytecode-defined or AST-defined (rather than speed). Marc has been comparing the fundamental differences between the two and noted that the bytecode version is 15 times faster than the AST. This means that changing to Rust would give an increased performance of 2-3 times.\n\nThe VM must be fast, secure, and performant in many ways. In either version, the AST will be stored on the blockchain, whereas the bytecode is only an internal representation that doesn't affect the users. We must still consider any potential architecture consequences between bytecode and AST before deciding whether to change. Marc’s WIP code is still in a private repo, but you’ll be able to inspect it soon and make a comparison of the VM implementations in the coming weeks. The decision about the direction of GnoVM is still very much TBD; however, the Rust GnoVM will not replace the Go GnoVM but will complement it, eventually giving validators the choice of which to run.\n\n## Defining Wording for People/Documentation and Consistency\n\n[Issue 1024](https://github.com/gnolang/gno/issues/1024) discusses the need to define the wording we use throughout our documentation, for example, how we name a module, package, sub-module, etc. Once we have the wording defined, we will set the GnoVM to only accept elements with the correct naming. The importance of wording affects the design choice of the whole project and how we go about versioning for the best possible user experience.\n\nFor example, is mt/board/admin part of the same realm of mt boards, or is it its own realm? Can we work with both by adding patterns to have some realms responsible for hosting data and others responsible for having more privileged actions? How do we split a complex realm into sub-libraries and sub-realms? We want to define the documentation and the logic for this and have begun to touch on this issue. We will discuss this in greater depth in the upcoming developer calls.\n\n## Improving the GRC20/Foo20 APIs\n\nWhen working on the specs for a Merkle airdrop contract, Albert came against some issues with users initiating airdrop reward claims (see [PR 906](https://github.com/gnolang/gno/pull/906) for more details). Currently, when the Merkle airdrop contract tries to execute the reward claim for the user, an instance of the GRC20 contract is used for transferring. Within the GRC20 implementation Transfer() method, the caller (token sender) is fetched using the standard library method std.PrevRealm().\n\nHowever, calling this method in the Merkle airdrop context returns the user as the caller, not the Merkle airdrop contract, which is an unexpected functionality. We are discussing different ways to tackle this issue efficiently. However, each solution would require possible changes to the GRC20 API and subsequent token implementations. Additionally, as part of [PR 952](https://github.com/gnolang/gno/pull/952), we are looking into improving the standard GRC20 API and possibly resolving the ambiguity with standard library calls that are causing the mentioned issues.\n\n## Client Optimized for CLI, Not Mobile\n\nOur newest contributor to Gno.land, Berty, is developing the mobile version of Gno, which means writing a mobile app to interact directly with the blockchain. The team is facing some issues as they need a client library with utility functions like sign and broadcast, which are used by the command line. This code (tm2/pkg/crypto/keys/client) is not ready for external users yet, and the Gno client is designed for CLI. However, Berty needs a way to interact with the Gno chain from their application and to call the logic without adding the full CLI.\n\nFrom the existing TypeScript/JavaScript client library (gno-js-client and tm2-js-client), Berty should be able to build out a Go client library by exclusively using the RPC endpoints of the node itself (just like gno-js and tm2-js work), and not having to worry about importing private logic like transaction broadcasting. The team is writing its own framework to call Go code for Gno from Java, Swift, and React Native mobile apps that creates a transaction and sends it (see [PR 1047](https://github.com/gnolang/gno/pull/1047)).\n\nThey are working on an API that interacts with the blockchain and lets them export the code without having to write their own utilities. The API will be minimal, and update the Tendermint2 build script by moving tm2txsync from tm2/cmd to gno.land/cmd (see more details in [PR 1080](https://github.com/gnolang/gno/pull/1080) here). For the time being, Berty will copy the code and use the objects directly until a more convenient API is complete.\n\n## Tendermint2 Development\n\nIn [PR 546](https://github.com/gnolang/gno/pull/546), we introduce file-based transaction indexing. Transaction index parsing should be done as a separate process from the main node, meaning other services can be instantiated to index transactions as readers. The current problem is that there is no way to figure out whether a transaction has failed after it’s been sent out with a broadcast sync, or fetch any kind of receipt information or error reason in the delivered transaction.\n\nSo, we’ve started working on an event indexer to index Gno node events, which include transactions. Soon, developers and users will be able to ask the event indexer what happened to the transaction or in which state in its execution it's currently at, and also to retrieve information on other events like block commits as they happen.\n\n## Extending the Functionality of Go\n\nIn [issue 919](https://github.com/gnolang/gno/issues/919), Petar proposes extending the functionality of Go by adding constant data structures, arrays, slices, etc. He believes this would benefit users, as they wouldn’t need to create special functions as in Go to simulate this behavior, and it would also catch bugs when there is mutation. There has been a discussion, and Jae has similar ideas with the notion of “invar” expressions, where the resulting value can only be read, not mutated or stored. This would fix the bug where if you pass a pointer (that represents part of your contract state) to another contract, the other party can “steal” it by assigning it to their state, and your contract would fail to execute.\n\nMorgan believes that we should take a different approach as slices have the semantic in Go, where the underlying array is always heap-allocated and modifiable. Introducing constant slices would thus necessarily have to introduce concepts regarding im/mutability of values without the matching constructs that a language like Rust has. To make a compromise and keep compatibility with the Go spec, we are likely to implement this in a transpiler (gnoffeescript) that would implement this feature and be able to transpile to valid Go.\n\n## Grantee and Ecosystem Updates\n\nAs you can see, we’ve made a ton of development progress over the last few weeks. We’re also steadily adding more gnomes to our community of builders, and they’re working on the core infrastructure of Gno.land, as well as the permissionless dApps the platform will house. Let’s see what they’ve been up to since the last update.\n\n## Onbloc\n\nOnbloc has been busy, as always, with a slew of updates for us over the last few weeks. The team has been developing Gnoswap, the first Gno.land automated market maker with concentrated liquidity, and they gave us a live demo. On the front end, which is still a work in progress, you can find a one-stop venue for traders to view all the information about tokens on gno.land, so you don’t have to move between Gnoswap and a token aggregator like CoinGecko. You can also see incentivized pools sorted by liquidity, volume, APR, liquidity mining rewards, etc., and a wallet page to check your balances. You will also be able to deposit or withdraw assets from the Interchain when IBC is enabled.\n\nCheck out the work they’ve done so far on the Onbloc [hackerspace](https://github.com/gnolang/hackerspace/issues/29). The team has also released [the documentation](https://docs.gnoswap.io/) about what you can expect from Gnoswap, the rationale behind their design choices, some information about tokenomics, a preview of the UI, and more. Their main focus is on delivering a smooth and welcoming user experience and abstracting away the difficult mechanisms of concentrated liquidity so that the interface is as minimal and simple as possible.\n\nThe team will be ready to launch Gnoswap as soon as gno.land reaches mainnet. Feature updates and enhancements will be aligned with the development of the core Gno Stack.  The code for Gnoswap has now been [open-sourced](https://github.com/gnoswap-labs), so you can take a look at everything they’ve done and even make suggestions. In the coming weeks, Onbloc will also work on building core Gno.land infrastructure to support an earlier launch. Find details of this in Onbloc’s [grant submission](https://github.com/gnolang/ecosystem-fund-grants/pull/4). And be sure to check out Onbloc’s informative 6-episode [blog series](https://medium.com/@gnoswaplabs/why-gno-introducing-gnoswap-dd6acc22e6a1) that features the history of blockchain and exchanges, a deep dive into the Gno Stack, and an introduction to Gnoswap, where they share details of their journey and insights.\n\n## Teritori\n\nWe also saw an awesome demo from the Teritori team, which you can check out at app.teritori.com. Simply connect your Adena wallet to create a user name, start interacting with the social feed, create your own DAO, and add members. The team is working on more extensive documentation to explain how it works in more detail. While still a work in progress, Teritori has developed a cool flagging system that allows you to unfollow content you don’t like or flag content as inappropriate. If posts receive many flags, users can vote on whether to ban them, creating a healthy and supportive social environment free from derogatory content monitored by a like-minded community through a moderation DAO.\n\nThe team continues its work on DAO interfaces and has built a useful tool for speeding up the deployment of packages as a workaround until we’ve decided how to best tackle realm versioning. They are also working on the escrow system, which will be useful for the freelance marketplace, and presenting DAO standards documentation.\n\n## Berty\n\nWe have a new contributing team to Gno.land from the Berty private messaging app. This team is working on a mobile version of Gno.land, implementing the WESH protocol, which is available by Bluetooth, local WIFI, or other means, and provides secure censorship-resistant communication between devices. The plan is to be able to provide an alternative transport for Gno applications when the internet is not available and build the skeleton/foundations that enable developers to create Gno-centric mobile apps more easily in the future. Berty brings a ton of experience in off-grid communication and getting apps to run on mobile devices, both Android and iOS.\n\nThe team has created its own [testnet](http://testnet.gno.berty.io/), which you are welcome to test out and play around with, although they will be restarting and rebooting without prior notice, so be aware that your work could be wiped. In the few short weeks they’ve been working with us, Berty has already finished their first Proof of Concept, a simple app running on iOS and Android. They copied code from the gnokey command line, and now it’s installing and running on mobile and interacting with the blockchain.\n\nNow, Berty is working on a nicer UI for the app and will propose a project to create a formal framework called GnoMobile, which will allow anyone to create their own app and run it on mobile. We look forward to seeing their demo soon.\n\n## Golang Working Group\n\nIn other news, we've started a bi-weekly [Gnome Golang Working Group](https://github.com/gnolang/hackerspace/issues/15) where we get together and discuss various topics, such as the language-related and theory elements of Go and Gno. We also aim to identify meaningful and reasonable ways to contribute to Golang, Gophers, and the general open-source community and improve our visibility there. We hope to attract more Go devs to the project and provide a “blockchain-less” experience for web2 Go devs.\n\nWe've had two meetings so far, and some recent hackerspace issues have already emerged from the discussions. One in particular that we’re actively evaluating is Gnoffee, a transpiler tool inspired by the likes of [CoffeeScript](https://coffeescript.org/) for Go and Gno integration. Gnoffee would be a powerful standalone tool to enhance Go and Gno (blockchain) projects by generating code and seamlessly integrating new features without manual coding. Find out more at the link above.\n\n## EthCC and Nebular Summit\n\nThe Gno.land team was in full force in Paris at the end of July for EthCC, where we met many passionate developers and spread the word about Gno.land and, specifically, how Gnolang compares and contrasts to Solidity. We had a booth during the conference manned by the Gno.land team complete with awesome swag and a continuous presentation in the background playing on a full-screen television.\n\nAt Nebular Summit, our VP of Engineering, Manfred Touron, [gave a talk](https://www.youtube.com/watch?v=CtxBajCcTYQ) called ‘Gnolang for Developers: Examining the Core Stack,’ where he broke down the major components of Gno, demonstrated how the upcoming Gno SDK compares with the existing Cosmos SDK, and explained why Gno.land is an excellent choice for accessible and sustainable blockchain development.\n\n## Blockchain Application Stanford Summit (BASS)\n\nJae opened the [Blockchain Application Stanford Summit (BASS)](https://bass.sites.stanford.edu/) event, attended by thousands of students and future blockchain developers. He gave an overview of Gno.land, GnoVM, and Gnolang, and explained the features that make our platform paradigm-shifting and timeless. He also dove into the core of why we’re building Gno.land – to provide a censorship-resistant platform for truth discovery that helps people improve their understanding of the world in an era of information censorship and control.\n\nComing up later this month, you can catch up with the Gno.land team at [DappCon Berlin](https://www.dappcon.io/) from September 11-13, where we’ll be delivering an informative keynote and hosting a side event to get to gno you better. If you find yourself in Barcelona for [Web3 Family](https://web3fc.xyz/) on September 23, you can join in a Gno coding workshop. You’ll also be able to meet the team at [GopherCon US](https://www.gophercon.com/) in San Diego. We’re hosting an action-packed workshop, ‘Chess: The Gnolang Way,’ on Gopher Community Day, where you can learn to build a web3 chess server on Gno.land and compete for cool prizes in an ongoing chess tournament throughout the event. More details coming soon. That’s all for now! Be sure to check back again with us for the next edition of *The More You Gno* to keep up with all our progress.\n\n*Do you want to contribute to Gno.land’s monthly updates? If you’re building on Gno.land and want to highlight your development, project, event, or idea, let us know, and we’ll include your contribution.*\n","2023-09-04T13:37:00Z","christina","gnoland,gnovm,tm2"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["chess-gc23","Play Chess with Us: The Gnolang Way at GopherCon 2023","\n\nCalling all gnomes and gophers! Come join the Gno.land team at GopherCon 2023, September 25 - 28, in San Diego, US. We’re sponsoring this year’s action-packed event that will gather together some of the world’s brightest minds and smartest programmers under one roof. So drop by our booth, pick up some swag, and say hey! We’ll be on hand every day to meet and greet, answer all your questions, and discuss everything Go, Gno, and beyond! We’ll also be hosting a workshop on Community Day, September 26, called ‘Chess: The Gnolang Way,’ where you can learn how to build a web3 chess server on Gno.land.\n\n## GopherCon 2023\n\n[GopherCon](https://www.gophercon.com/) is a community-driven annual event that started in 2014 and is dedicated to promoting the use of Go and the education of Go developers. Every year, thousands of gophers from around the world exchange ideas, share their work and expand the Go network. There are four days of fun-filled activities, including hands-on workshops, informative keynotes, networking events, and hackathons, all taking place in the laidback West Coast city of San Diego. Where better to expand your knowledge and make new friends than in one of the US’ most popular destinations?\n\nAs a gold sponsor at this year’s event, Gno.land will be running a booth and doing our best to convert as many gophers as possible to Gno, showing them how easy it is to port their existing web2 apps over to Gno.land or to build completely new ones from scratch.\n\n## Chess: The Gnolang Way\n\nIf you’re looking for a hands-on coding experience and to have a little fun with us at the same time, join us on Community Day for an awesome workshop, **‘Chess: The Gnolang Way.’** Kickstart your day by learning to build a web3 chess server on Gno.land using Gnolang. By the end of the session, you’ll have gathered basic knowledge on developing and deploying smart contracts on Gno.land, and connecting smart contracts to a web frontend. You’ll also see how web3 enables you to write perpetual and trustable social and gaming platforms and how to build a web3 chess server and website with Gno.land.\n\nIf you want to join us, meet us at 10:00 a.m. in the Grand Ballroom 10.\n\n## Let’s Play\n\nAfter the workshop, the fun begins with an ongoing chess tournament throughout the GC23 summit for event participants. To be in with a chance of scooping up some seriously cool prizes, GC23 attendees will need to show us their best moves and how much they engage with the Gno.land chain. This competition is designed to put our platform to the test over two main areas: chess mastery (50% of points) and platform engagement (50% of points). To be eligible for prizes, participants must be present at the event. We hope to see you there! If you can’t join us in person in San Diego, be sure to [follow us on X](https://twitter.com/_gnoland). We’ll be giving updates on our progress and sharing the highlights of the event. May the best gnome win!\n","2023-09-25T13:37:00Z","christina","gnoland,gnovm,gnochess,events"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["gnomobile","GnoMobile, a Framework for Building Gno Mobile Apps","\n\n*This blog post is written by Berty Technologies, an NGO that is building open and free communication solutions without any of the limitations imposed by centralized systems. Berty is a proud partner and grantee of Gno.land.*\n\nThe year is 2023. Current Gno apps run on desktop or laptop computers that have Go installed. To run on mobile, the app would need to bundle the Go runtime, which is complicated for most developers. At Berty, we have years of experience using Go on mobile and overcoming difficulties with Android and iOS operating systems. We built Wesh Network, a decentralized communication protocol that enables p2p users to reliably and securely send messages over async networks, even in environments with poor or no connectivity.\n\nThis stage is thus set to take the leap and make it easier for builders to develop Gno applications for mobile devices.\n\n# What is GnoMobile?\n\nSimply put, GnoMobile is a framework for developing Gno mobile applications. This is how it works:\n\n*WARNING: Deep technical sections ahead. Grab a coffee before venturing forth*.\n\nFor communication between the mobile app and the Gno code, GnoMobile uses [gRPC](https://grpc.io/), a well-supported framework that sends and receives Google Protobuf messages. Even though the core Gno code is written in Go, the app code can use React Native, Java, Swift, etc. The following system diagram shows how gRPC is used.\n\n\u003cdiv align=\"center\"\u003e\n ![](https://github-production-user-asset-6210df.s3.amazonaws.com/109347079/267934754-e4da6fec-a586-4ebe-97cc-3b3ad7f79370.jpg)\n\u003c/div\u003e\n\nMoving from the bottom to the top, this is how the flow looks:\n\n1. At the bottom are Go packages in the gno codebase. A **gnoclient.Client** supports communication with the remote Gno.land node with methods like Call to call a realm function. The Gno codebase also has **keys.Keybase** to support a wallet stored on the local device with methods like CreateAccount.\n2. These methods are called directly from the next level up by the **GnoMobile** Go code. A Go object can’t be passed through the gRPC interface, so the GnoMobile Go code maintains a persistent gnoclient.Client object, which is accessed by gRPC calls. The GnoMobile API functions are registered by an amino package.go file and the generated Protobuf files are used to configure the gRPC server.\n3. Finally, at the top of the diagram, the **gRPC client in the mobile app** communicates with the GnoMobile gRPC server over a local connection using Protobuf messages. A gRPC call can either return an immediate result (for example, GetKeyCount) or an asynchronous gRPC stream object, which can return delayed results (for example, a Call to a remote realm function). The gRPC framework uses the Protobuf API to generate convenient API functions in the mobile app’s [preferred language](https://grpc.io/docs/languages) (React Native, Java, Swift, etc.).\n\n# How GnoMobile benefits builders\n\nThe first version of the framework will include three main sets of features:\n\n1. **Blockchain Operations**: These refer to the core block of functions that the apps need to interact with the blockchain. Things like the gnoclient API to effectively bring the benefits of the Gno framework on mobile, the gas estimation interface and calling realm functions, querying a blockchain node (and more) are included here.\n2. **Wallet**: As the name suggests, here we have all the standard wallet operations like create or delete an account, set the recovery phrase, account balance, and so on.\n3. **Toolkit**: We want to make it as easy as possible for devs to start building apps with our framework, so we’ll provide them with install instructions, example apps, and more technical stuff like genproto options to support gRPC and helper functions to parse the render output.\n\nThose should be enough to allow builders to get started on using and experimenting with Gno mobile apps.\n\n- *Support for secure p2p communication, even when the Internet is down?*\n- *Yes, please!*\n\nSomething that is not necessarily essential for V1, but for sure will open the doors to some powerful capabilities later on is to add an interface and a constructor to adapt the communication transport. This will make it possible for devs to incorporate other tools like Wesh Network and give their apps the ability to securely and reliably send messages even in very poor network conditions. But that’s a story for another time.\n\n# When will GnoMobile be ready?\n\nV1 is planned for release in mid-December 2023.\n\nUntil then, you can check out our progress [here](https://github.com/gnolang/hackerspace/issues/28).\n\nGot feedback or want to drop us a question? Ask away on our [repo](https://github.com/gnolang/gnomobile/issues).\n\n# What does the future look like beyond V1?\n\nWe see a lot of potential directions for GnoMobile after the initial release that will improve the user experience, extend its functionality, and make GnoMobile even more secure. We’re still scratching the surface in terms of how far we can take its development, and we look forward to working on further iterations and improvements. Some of our ideas for the future beyond V1 include:\n\n1. Making it easier for developers to **build** **desktop apps** **and** **browser extensions**:\n2. Through GnoMobile, we can gradually enable “desktop” devs to use our React Native gRPC interface to write desktop applications while using existing functionality from the core Go code. This way, developers will not necessarily have to learn Go to leverage its advantages.\n3. Browser extensions are usually written in JavaScript in the same way as in React Native. This opens the door to getting the benefits of Go via the GnoMobile framework. Otherwise, you’d have to either make the Go code run inside the browser extension (which is not easy) or use a remote server (which is not pretty).\n4. Making it possible to **execute smart contracts directly from mobile**.\n\n*Why is this important?*\n\nIf you want to add a new message to a blockchain, you need to actually interact with it (the blockchain) and update its state with the new message. However, if you just want to browse through the messages, you can execute the Render function locally without needing to use your network and, at the same time, get the results much faster. This is because the node runs locally on the mobile device without needing to spend crypto coins to get a remote node to do the operation for you.\n\nGno nodes run on GnoVMs (gnovm), and for the moment, these are only available on desktops. We believe it is possible to make them available on mobile as well, but we need to find clever ways to overcome the constraints of mobile devices (like putting the apps in the background (iOS), addressing network bandwidth limitations, and so on).\n\n1. Developing a **decentralized push notification service** for *both* mobile and desktop apps. Getting notifications is now a standard (and very important) functionality of centralized apps. Technically, this happens via a central server. Naturally, having a centralized server is not possible for a p2p app, but there are other ways to implement notifications, and we are considering including them in the GnoMobile framework.\n2. Making it possible for decentralized apps to **interact with the blockchain even if the network connection is poor or virtually unavailable**. Through the [**Wesh Network** protocol](https://wesh.network/), we are opening up the possibility of using alternative transport mediums to exchange messages between peers in an asynchronous but reliable manner in off-grid environments. Enabling reliable, secure, and censorship-resistant communication is our main cause at Berty Technologies. We want to open the door for p2p users to send messages and interact even in extreme situations or adverse scenarios, and Wesh Network is built specifically for this purpose. It is only natural to make it easier for developers to use it through the GnoMobile framework.\n3. Advancing **edge networking for enhanced blockchain resilience**. Edge networking refers to bringing functionality like computing power or storage closer to the user so that they don't need to travel through the whole Internet to interact with a server. The same edge concept can be applied to bring the necessary services to interact with the blockchain closer to each p2p user. For example, hosting a copy of the blockchain so a user can sync it or even execute smart contracts. Having these fundamental services closer to the p2p users is especially important in the case of mobile apps. We want to offer developers the possibility of taking advantage of the edge networking benefits by allowing them to use, for instance, network address redirections or special HTTP headers in the configuration of their applications.\n\nIn all honesty, it’s hard not to get excited about all the different possibilities that lie ahead for GnoMobile, but we’re keeping our focus on shipping V1 for now and collecting feedback from the community. After that, well, we hope you’ll stick around to see what happens next!\n","2023-09-29T13:37:00Z","jeff,costin,remi,iuri","gnomobile,berty,weshnetwork"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-5","The More You Gno: Gno.land Monthly Updates - 5","\n\nIt's been another productive month, packed with developer calls, live events, new contributors, a large team presence at the Go community's biggest event of the year, GopherCon 2023, and the launch of a PoC gaming dApp on Gno.land, GnoChess. We uncovered a bunch of bugs in the code and some issues with the GnoVM, and made further progress on the Go and Rust VMs, the banker module bug, Gnofee, and much more. Check out the updates below.\n\n## Building a Web3 Chess Server on Gno.land - GnoChess\n\nMost of our work over the last few weeks has been dedicated to [GnoChess](https://gnochess.com/), a [PoC gaming dApp](https://test3.gno.land/r/gnoland/blog:p/chess-gc23) unveiled at GopherCon 2023. As gold event sponsors, we wanted to provide gopher attendees with a memorable experience – and a little friendly competition – while battle-testing the Gno.land platform. As our first gaming dApp, developing GnoChess was extremely useful for our team in many ways. We managed to attract 61 players to the game during the event, including some die-hard web2 gophers who wanted to show off their moves and discover more about Gno.\n\nSeveral PRs were opened as a result of our endeavors, and, beyond the conference, GnoChess taught us a lot about where we're at with Gno, how to successfully build complex dApps on top of the platform, and how well we work as a team. We uncovered some key issues and breaking behavior in the GnoVM, made our JavaScript clients much more reliable in their communications with the Gno.land node, and unearthed further issues that lead to complex errors and potential security flaws that must be addressed before mainnet.\n\nFor example, appending nil to a slice of errors resulted in a panic, or conditional statements like if not supporting custom boolean types. The GnoVM doesn't currently perform terminating statement analysis, which results in a cryptic panic message ([issue 1086](https://github.com/gnolang/gno/issues/1086)), and mixing untyped (negative) floats and integers in arithmetic sometimes drops the sign ([issue 1152](https://github.com/gnolang/gno/issues/1152)). The issues uncovered while developing GnoChess were discussed extensively in the public developer calls of [Sept 6](https://www.youtube.com/watch?v=BBBqgycMjqU) and [Sept 20](https://www.youtube.com/watch?v=WrxFVPR55G0), and referenced in the [GitHub meeting agenda](https://github.com/gnolang/meetings/issues/31). Most of the issues are common in software development and fairly simple to fix by making some implementation changes or adjustments to design choices.\n\nWhile developing GnoChess, our engineers took on the role of expert platform users rather than core team members. This approach was very useful as it pushed the platform to new limits, and allowed us to dive deep into many aspects of the project, creating a culture of sharing by opening up issues for each bug and asking for feedback and support. We'll definitely take a similar approach for future app development and onboarding new devs to Gno. We'll be releasing a retrospective of our experiences in the coming weeks. In the meantime, if you want to build a dApp on Gno.land, check out the GnoChess repo, where you can find a useful [tutorial](https://github.com/gnolang/gnochess/blob/main/tutorial/01_getting_started/README.md) or watch the recording of the GopherCon workshop, '[Chess: The Gnolang Way](https://www.youtube.com/watch?v=JQh7LhqW7ns).'\n\n## The Battle of the Virtual Machines\n\nCore engineers Marc and Petar continue their excellent work developing two different VMs for Gno, one in Go and one in Rust. In the coming weeks, we'll have a face-off, comparing and contrasting their features, efficiency, speed, and performance, so watch this space! For now, the definition of the virtual machine is stable for both, and they are no longer working on the virtual machine definition. They are mainly focusing on code generation; everything from parsing to scanning to parsing and compiling. Let's see how they are shaping up.\n\n### Rust VM\n\nPetar has developed a Rust implementation not only of the virtual machine but of the whole chain, including the compiler. He has written a Go compiler entirely in Rust and has even started experimenting with changing the compiler to implement the Invar proposal from Jae. Further progress includes porting a part of the parser and scanner from the Go compiler to Rust (almost a direct translation from Go to Rust) and making it stable. \n\nIn addition, Petar has completed work on typed nil values and improving the recursive closures of Go, which were not working with Gno code and needed additional pointers. He has also implemented Iota and hooked up the garbage collector. In the coming weeks, Petar will be working to smooth out bugs and implement type aliases, as well as implementing function analysis for the dependency graph. The dependency graph is necessary for compiling global types in the correct order, so, for example, when type A refers to type B, you need to compile type B first so that when type A refers to it, type B exists.\n\n### Go VM\n\nMarc is currently rewriting a parser and a scanner from scratch. His work is not as far along as Petar's, but he's getting closer, and the code generation works well. He is currently refactoring and building a single-pass compiler that can perform a **syntax-directed translation**, which means there are no intermediate data structures between the source code and the byte code. This is a much simpler design that should compile faster and be easier to maintain, but it requires a complete redesign. \n\nMarc believes his Go parser will be easier to maintain and understand than the one in Rust and benefit the user since the entire stack is written in Go. However, to assess the best implementation of the VMs, Marc has started a Go **test shoot project, which is a script** that will run many samples to verify that the compiler (in Go, Rust, or any other implementation) conforms to Go's specifications. Marc and Petar will open their repos soon, and the next edition of The More You Gno will highlight how the GnoVM works. \n\n## Gnoffee: Coffeescript for Go and Gno\n\nGnoffee (hackerspace [issue 22](https://github.com/gnolang/hackerspace/issues/22)) will be a powerful standalone tool to elevate the development process of Go and Gno by generating code and integrating new features, eliminating manual coding. We aim to create a custom variation of Golang that preserves similar readability, maintains compatibility, and enables being able to code in Gno very quickly when you know how to code in Go. How do we go about this? \n\nRegarding compatibility, one possibility is to propose all our changes to Golang and wait for approval before we start developing. However, this is likely to take some time. Another approach is to use a way to transpile TypeScript for JavaScript or Coffeescript for JavaScript, so it's another language passing through a program that creates standard valid Golang and will generate valid Gnolang. With this simple method, we can experiment with missing features like new native types, and new keywords, and when we have new features in mind, we can develop what we lack. \n\nFor instance, it does not make sense to have extra security for your exported variables when you write a library in Go. However, in Gno, it is very important to ensure that everything you expose cannot be modified by other contracts. This means finding a way to expose constants and other readable elements without risking their values being overwritten.\n\nBesides allowing us to carry out all types of experimentation more easily, Gnofee could eventually be a way for the Go team to measure the potential adoption of Gno. Gnofee is not a priority for the mainnet, but we're excited to work on this important initiative.\n\n## META Multinode Testnet\n\nThe discussions about single and multinode testnets have been ongoing, so we opened an issue to establish a multinode testnet focused on multi-validator experimentation, including stability, benchmarking, and lifecycle management. This multinode testnet aims to provide a platform for in-depth explorations and evaluations of multi-validator setups, while we maintain the single-node test3+.gno.land set up, primarily dedicated to showcasing the VM and providing examples. Visit hackerspace [issue 9](https://github.com/gnolang/hackerspace/issues/9) if you want to participate in this initiative or share your insights.\n\n## Banker Module Bug\n\nThe banker module bug is a known issue that needs to be fixed before the mainnet because, currently, it's still possible to mint new GNOT tokens from any contract. Several fixes have been suggested, and our goal is to merge [PR 875](https://github.com/gnolang/gno/pull/875) put forward by Onbloc to change the denomination of the coins minted by the banker. Merging this PR is currently blocked by 2 small failing checks, but we are close to resolving this issue.\n\n## Preserving Go Comments in Protobuf\n\nIn [issue 1157](https://github.com/gnolang/gno/issues/1157), Jeff from Berty raises the question about preserving Go comments in the Receiver field. Currently, Amino converts the code, but the proto message Receiver field doesn't have the comment. Manfred agrees that informative comments are helpful. However, he doesn't want to create a complex Protobuf configuration. We will continue to discuss this issue to look for solutions, but for now, Berty will parse the original Go source code and get the comments this way.\n\n## Multi-Sig and Security Features\n\nSeveral contributors, including Teritori, are working on built-in multi-sig support in Gno.land, where Gnokey supports a multi-sig setup. We also want to introduce additional ways to improve the UX and security of Gno.land (and web3 in general). An idea we currently have is to add a new layer in authentication, creating something similar to browser cookies that we can name sessions. The chain will have two tables, one with the public key for an account and one with a public key for sessions linked to an account. From your main account, you can create a session with self-destructing features, such as destructing after one hour without usage or after 24 hours. The goal would be to allow more complex and secure flows when starting your operations. We may not want this for multi-sig, but it comes under the same family of security and privacy features.\n\nFor example, imagine a wallet like Adena uses your key, a passphrase, or a ledger. It will sign a new public key that you just created in memory. Each time you close your browser, the memory is cleared. You can also have a logout button to call on the blockchain to delete all your sessions or simply wait for the session to be self-destructed, especially if the session was just in memory on your side. We will continue to develop this idea.\n\n## New Team Member\n\nWe're excited to welcome a new DevRel team member to Gno.land, Leon, who's been in blockchain development for two years and is passionate about engineering and teaching. Leon has taught languages, development, math, and music privately, as well as an OS fundamentals class at his previous faculty. Welcome on board!\n\n## Grantee and Ecosystem Updates\n\nAs Gno.land core continues to advance, so does our blossoming ecosystem, with new contributors and community members turning their eyes to Gno. The overriding theme of this last month has been collaboration, and we're pleased to see gnomes working together to overcome their obstacles and push their projects forward. Let's see what they've worked on over the last few weeks.\n\n### Onbloc\n\nOnbloc is powering ahead, contributing to Gno.land core, making upgrades and improvements to Adena and Gnoscan, and developing the Gnoswap DEX. Last month, Onbloc released the patched version 1.8.0 of Adena, which includes some UI and UX enhancements, such as more intuitive account management settings, a copy icon next to the names of the accounts, and some bug fixes. This release also comes with new injection methods to enable dApps to request users to add a custom gno.land network or switch to an existing one. Check out the [release note](https://github.com/onbloc/adena-wallet/releases/tag/v1.8.0) for more details.\n\nOnbloc has open-sourced the code for Gnoswap on this GitHub [repo here](https://github.com/gnoswap-labs/gnoswap). You can also find a guide to running unit tests. The team continues to improve the Gnoswap interface, focusing on the earn and staking pages, the graphs for positions, and some components for adding and removing liquidity and providing pool incentives. They're working on the next iteration of the interface, with the governance and airdrop pages, and developing the front-end logic to integrate with Gnoswap realms and APIs. Onbloc also contributed to Gno core, adding PRs for fixes to testing and the banker module. Keep up with Onbloc through their [hackerspace journey](https://github.com/gnolang/hackerspace/issues/29) and check out their latest initiative [Gnodesk](https://medium.com/onbloc/gnodesk-week-2-of-sept-2023-5edbc451bba7), which delivers weekly highlights and updates from Gno.land.\n\n### Teritori\n\nTeritori has been working on improvements since the last update and open-sourcing all their work, including the DAO deployer and the Moderation module. You can visit the Teritori DAO tooling repo to find the complete documentation and new realms to easily deploy your DAO. There is also a tutorial on creating your own DAO using the framework. \n\nThe team has made extensive progress on the Justice DAO deployer, a module that can be used for third-party arbitration when there is a problem with the escrow system in a decentralized freelance marketplace. The Justice DAO can resolve potential conflicts between the seller and the buyer and implements randomness to choose the judges to solve problems without conflicts of interest. The content flagging system, which highlights the content that users deem to be inappropriate, has been tweaked and improved. Keep up with Teritori's [hackerspace journey here](https://github.com/gnolang/hackerspace/issues/7).\n\n### Berty\n\nBerty has already completed the first phase of the project and published the [technical proposal](https://github.com/gnolang/gnomobile/issues/15) to develop the Gno mobile framework. The team is now busy with the second phase of implementing the proposal and the gRPC interface, which is working with the local socket on Android and iOS. Jeff has been trying to use Amino, and, now that Iuri is back from vacation, the team will work on improving other parts of the interface. Check out their latest [demo](https://www.loom.com/share/c0f68f707d3e47089c2fdbd2698fc92f), which shows an example user interface with wallet functions and blockchain communication. \n\nOnbloc has laid the foundations for Gno mobile apps with the Adena mobile wallet, so Berty will use some of this code in the mobile framework and work with Onbloc to ensure a similar user experience across all Gno apps.\n\n### Flippando\n\nDragos, the developer behind new grantee Flippando, is an experienced mobile app developer. Flippando is a simple on-chain memory game, which is currently written in Solidity and deployed on several testnets, including Goerli, Polygon, Near, Aurora, Evmos, and a Saga chainlet. Fippando started as a project for Dragos to learn Solidity but has already been the winner of two hackathons in Korea. It can be deployed relatively easily on any machine and is currently being ported to Gno.land. Dragos is exploring which user intersection can be more beneficial for this and will show us a demo in the coming weeks. Soon, we'll have two gaming dApps on Gno.land – Flippando and GnoChess! Read about Flippando in the [hackerspace journey](https://github.com/gnolang/hackerspace/issues/33).\n\n### New Contributor Joseph Kato \n\nWe have a new contributor to Gno.land who showed a demo last month of what he's been working on, a language server to run tests and scripts. Joseph is a major Go fan looking to get into web3 and was super excited to come across Gno. While interacting with Gno.land, he found many IDE-like features that he missed when working on files, so he decided to work with an LSP implementation—gnols—with the goal of making these features available to all contributors regardless of editor preference, starting with Sublime Text and Neovim and moving on to IntelliJ, Golang, and Emacs. This is a welcome addition for anyone who has ever developed a realm in Gno. Check out his [hackerspace](https://github.com/gnolang/hackerspace/issues/34) page for more details. \n\n## DappCon, Berlin\n\nManfred was back in Berlin in September at the Radial System presenting 'Gno.land: The Key To Perpetual Transparency,' where he discussed how Gno.land offers a familiar, seamless experience for code sharing and a sustainable and transparent path for blockchain development. \n\n## Web3 Family\n\nCore dev Miloš Živković gave a talk at Web3 Family in Barcelona last month, 'Gno.land and Gnolang: The Dynamic Duo of Blockchain Development.' He presented a brief history of smart contract development and the issues associated with existing platforms, such as limitations in design and security. He introduced Gno and showed how we make web3 accessible and blockchain development more intuitive and secure. Catch the [talk here](https://www.youtube.com/watch?v=0K-jr_Ad3bI).\n\n## GopherCon 2023\n\nGno.land was out in force at GopherCon 2023 with a well-stocked booth at the conference and an awesome workshop building a web3 chess server on Gno.land. Both Manfred and Jae were at the booth championing Gnolang to Gophers, and we received a lot of positive feedback, some new contributions, fresh PRs, and exposure for Gno.land in web2 circles. It was also a fabulous chance for the team to meet for valuable face-to-face time.\n\nThat's all for now! Be sure to check back again with us for the next edition of The More You Gno to keep up with all our progress.\nDo you want to contribute to Gno.land's monthly updates? If you're building on Gno.land and want to highlight your development, project, event, or idea, let us know, and we'll include your contribution.\n","2023-10-10T13:37:00Z","christina","gnoland,gnovm,tm2"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["funding-program-23q3","Gno.land Funding and Grants Program - Progress So Far","\n\n# Quarterly Report: Q3 2023\n\nWe launched the [Gno.land Funding and Grants](https://github.com/gnolang/ecosystem-fund-grants) program in July 2023 to encourage talented and passionate developers to interact with Gno.land, help build core infrastructure and tooling, and enhance the usability of the platform. After establishing a review process to streamline the program and identify core areas that need the most work, we ran with our first cohort of grantees in Q3, awarding four grants from a total of seven submissions (to two teams and two individuals). Full details of grant submissions, scope, and funding can be found on GitHub, but here’s a summary of the program’s progress so far and what’s coming up in Q4.\n\n## Q3 Funding Breakdown\n\nThe total grants distribution for Q3 was **$563,595** over the four grants: Teritori, Berty, Zack Scholl, and Flippando. This work has been split over two main large-scale infrastructure products (the Gno Moderation DAO, and GnoMobile), a gaming application, and our first resident tinkerer (Zack), who is experimenting with Gno and developing Proof of Concepts using it. Each grant recipient was provided with milestones for deliverables and has kept track of their progress through regular syncs, hackerspace journeys, blog posts, and developer calls. \n\n### Teritori (delivered September 2023)\n\nTeritori blockchain and multi-chain hub allows IBC and non-IBC communities to connect, create groups, exchange tokens and NFTs, and launch new projects. The Teritori team has solid experience building social dApps, marketplaces, NFTs, collectibles, and interfaces to encourage community interaction. For the Gno.land Grants and Funding program, Teritori was tasked with building a Moderation DAO to enable effective and fair content moderation in a decentralized and permissionless environment. \n\nThe Moderation Module is a smart contract ‘realm’ that enables a DAO to manage the daily moderation of forums or social threads through blockchain decision-making, supporting the vision of a censorship-resistant platform that fosters a safe space for open debate and discussion. Find detailed updates on Teritori’s [hackerspace issue 7](https://github.com/gnolang/hackerspace/issues/7), and watch out for upcoming blogs on Gno.land.\n\n### Berty Technologies (delivery Dec 2023)\n\nBerty private messaging app was allocated a grant to build a mobile version of Gno.land, implementing the WESH protocol (available by Bluetooth, local WIFI, or other means), and providing secure censorship-resistant communication between devices. Berty’s experience in off-grid communication is invaluable to Gno.land, and the team is an expert at running Go on mobile Android and iOS operating systems. For this grant, to be completed in Q4, Berty will deliver a minimal PoC of the existing apps of Gno.land running on mobile, and deliver an open-source mobile app with basic CI/CD, interacting with the Gno.land testnet. Find detailed reports and updates on Berty’s [hackerspace issue 28](https://github.com/gnolang/hackerspace/issues/28) or within their [Gnomobile blog post](https://test3.gno.land/r/gnoland/blog:p/gnomobile).\n\n### Flippando (delivery Nov 2023)\n\nFlippando is a multi-level on-chain memory game currently written in Solidity and deployed on several testnets, including Goerli, Polygon, Near, Aurora, Evmos, and a Saga chainlet. Like the classic card-based Memory game, Flippando players must match card pairs (digital tiles). When a player selects a tile, the game sends a request to the chain, which sends back the uncovered tile. If two tiles match, they remain uncovered. If they don’t match, they are flipped back until the game is won, and an NFT is generated for the winning player to prove the win. Through the development of a simple gaming app on Gno.land, we want to show how easy it is for gaming and metaverse concepts to be built. Through this grant, Flippando will port its memory game to Gno. Find detailed updates on Flippando’s [hackerspace issue 33](https://github.com/gnolang/hackerspace/issues/33).\n\n### Resident Tinkerers Program: Zack Scholl (6 months)\n\nZack Scholl is Gno.land’s first resident tinkerer with tons of experience in web2 development and a passion for the Go language. Through the grants program, Zack aims to translate his extensive knowledge to Gno and web3 by developing PoCs using Gno. So far, Zack has worked on a microblogging app for Gno.land and a prototype for using generative audio with smart contracts. He’s also creating documentation and tutorials to help other developers follow his lead. You’ll be hearing more from Zack over the coming weeks. Follow his [hackerspace issue 2](https://github.com/gnolang/hackerspace/issues/2) journey for more details.\n\nAfter a great start to the Funding and Grants Program in Q3, below is a breakdown of the percentage of funding allocated to each area of development so far:\n \n[![Funding](https://gnolang.github.io/blog/2023-10-17_funding-program-q3/src/thumbs/funding.png)](https://gnolang.github.io/blog/2023-10-17_funding-program-q3/src/funding.png)\n\n## Coming Up in Q4 and Q1 2024\n\nWe’re looking forward to more exciting developments in the coming quarters as we focus on the road to mainnet. Onbloc, one of Gno.land’s most active contributors, is currently being confirmed as a [Q4 grantee](https://github.com/gnolang/ecosystem-fund-grants/pull/4/files#diff-6dbd2e305897910e59072f9efa8c537d86f8aa281eb3742e0c150048a1df95eb) to work on core infrastructure necessary for mainnet, including tm2-js and gno-js support, GnoVM debugging, contract interactions, and leading the multi-node testnet initiative. Onbloc has already developed essential public infrastructure tools for Gno.land, including the non-custodial Adena wallet, the Gnoscan blockchain explorer, and Gnoswap decentralized exchange. The team has demonstrated immense passion and dedication in attending public developer calls and in-person events, and releasing extensive documentation, blog series, and [hackerspace issue 29](https://github.com/gnolang/hackerspace/issues/29) about their journey. \n\nOver the next two quarters, the Grants program will focus on building our tinkerer and student cohorts, and publishing more content, such as application libraries, documentation, and Gno packages. The goal is twofold: to support more users and ensure a diversified set of users on the Gno.land platform testing, debugging, troubleshooting, and running user feedback loops. We currently have two apps to reference on how to get started – GnoChess, built by the Gno core team, and Flippando, a grant recipient – we’re looking for a lot more to come. \n\nWe’re steadily building out the Gno.land platform, and our ecosystem of grantees and contributors. Let us know if you want to join us by submitting an application any time on the Funding and Grants [repository](https://github.com/gnolang/ecosystem-fund-grants). We’re opening up our second grant batch this month, and look forward to reviewing your submissions. \n","2023-10-17T13:37:00Z","christina,michelle","gnoland,funding,grants"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["gnoland-moderation-dao-module","Gno.land Moderation DAO Module","\r\n# Gno.land Moderation DAO Module\r\n*This blog post is written by the Teritori team, whose focus is to allow organizations to communicate and interact in a resilient and transparent way. Teritori is a partner and grantee of Gno.land.*\r\n\r\nWhen it comes to the complex subject of discussion forums and decentralized social networks, numerous technical and philosophical questions arise.\r\nImagining a 24/7 online communication system whose administration cannot be compromised or censored by any entity or individual is one of the most intriguing challenges of the decade.\r\nApproximately 10 months ago, the Teritori core team decided to explore the new possibilities offered by Gno.land on the theme of decentralized moderation and to build the foundation for future generations of developers to create resilient, robust, and autonomous applications.\r\n\r\n## The vision\r\n\r\n### About Teritori\r\n\r\nTeritori is a decentralized Operating System for individuals \u0026 communities that allows organizations to communicate and interact in a resilient and transparent way. Its core components include the creation of a decentralized User Profile for individuals \u0026 organizations as well as a dApp Store allowing users to pick their favorite services for daily usage and developers to list their product in order to grow their user base. Finally, Teritori backbone, its P2P messenger application that will enable users to create resilient token-gated groups in a click will even allow non-crypto-native users to get onboard as this feature doesn't even require a wallet connection to get started.\r\n\r\n### Teritori \u003c\u003e Gno.land\r\n\r\nConvinced of the benefits of offering a contribution-based consensus model and taking advantage of an interpreted version of Golang, the Teritori core team aims to become one of the most prolific contributors to Gno.land. Our plan is to focus on features that enable the coordination of organizations and individuals via governance, communications, and collaboration. Eventually, all the features listed on Teritori will be accessible in the Gno.land network, contributing to the growth of the ecosystem.\r\n\r\n### PoC and iterations\r\n\r\nAnother important point to emphasize is that the Teritori core team intends to improve the features it deploys on Gno.land by taking advantage of the user test phases to collect feedback that will enable iteration and improvement of the service. As a result, the “Proof-of-Concept” (“PoC”) presented in this article will be subject to updates and evolutions, which will be communicated in due course, as will the associated test phases.\r\n\r\n## What is the Gno Moderation Module?\r\n\r\nThe Gno Moderation Module is a smart contract (“realm”) that enables a decentralized, autonomous organization (DAO) to manage the moderation of a forum or social thread through a transparent on-chain vote.\r\n\r\n### Let’s take an example:\r\n\r\nImagine a simple social network similar to Instagram, in which all content is decentralized (using IPFS for images, videos, music etc.). For each post, users sign in via their wallet to post content, and no centralized administrator can delete this content. The freedom offered by this type of decentralized application is immense since even as developers of the application, it is impossible to delete the content. Therefore, we can consider this “space of freedom” as a “common space” unlike any application owned by a private company and hosted on centralized infrastructure.\r\nWith this radical freedom for the user comes a great responsibility— to collectively ensure the security of this space rather than delegating the responsibility to moderators employed by a commercial enterprise. This is why we’ve created the “Gno Moderation Module.”\r\n\r\n### How does it work?\r\n\r\n[![moderation_flow v0.1](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/thumbs/moderation_flow_v0.1.png)](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/moderation_flow_v0.1.png)\r\n\r\nThe Gno Moderation Module allows users to notify the moderation DAO community that they wish to report content. Through this action (permitted by the smart contract), they inform the DAO community that the content is inappropriate.\r\n\r\n[![content flag](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/thumbs/content_flag.png)](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/content_flag.png)\r\n\r\nOnce the content has been reported a certain number of times (10 times in this PoC) by users (who may or may not be members of the Moderation DAO), an on-chain proposal is automatically created.\r\n\r\n[![moderation dao feed](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/thumbs/moderation_dao_feed.png)](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/moderation_dao_feed.png)\r\n\r\nThis on-chain proposal is then listed in the Moderation DAO tab on the Social Feed as well as on the Moderation DAO profile proposals feed so all Moderation DAO members can vote on it. A debate can take place to discuss the best choice for the content.\r\n\r\n[![moderation dao vote](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/thumbs/moderation_dao_vote.png)](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/moderation_dao_vote.png)\r\n\r\nModeration DAO members have three voting options:\r\n- Ban the content in question\r\n- Abstain\r\n- Do not ban the content in question\r\n\r\nOnce the required vote quota has been reached, the contract automatically executes the voted decision.\r\n\r\n## The Current Status:\r\n\r\nThe Teritori core team received a grant from the Gno.land core team to build the necessary tools for decentralized moderation.\r\n\r\nTo accomplish this task, we divided our work into five main stages:\r\n1. Build “DAO” standards to establish the fundamental building blocks and ensure a modular approach in the long term for various tools.\r\n2. Build a “DAO” deployer that allows non-tech users to easily utilize the different standards.\r\n3. Build a customizable Moderation Module that can cater to a wide range of use cases. For example, if we replace the social feed with a service marketplace, the Moderation Module can transform into a “Justice Module” that resolves conflicts between sellers and buyers on a decentralized platform and serves as an escrow system.\r\n4. Develop the user experience that allows for large-scale experimentation with the Moderation Module within a dedicated context of an active social feed. Here, we created a social feed realm and enabled non-developer Gno.land users to participate in the full-scale experience.\r\n5. Establish interactions between smart contracts (r/boards, r/socialfeed, /r/users), conduct experiments to enhance their security, and identify emerging needs for these innovative use cases.\r\n\r\n### What does a DAO realm look like?\r\n\r\n- We decided to build two different DAO standards, using two different approaches of modularity:\r\n- Aragon DAO Standard, based on the amazing work of [the Aragon team](https://aragon.org/) (using Solidity)\r\n- [DAODAO](https://github.com/DA0-DA0) smart contract, using CosmWasm, that allows more modularity.\r\n\r\n\r\nHere is an example, with the DAODAO contract ported into Gnolang:\r\n[Source](https://testnet.gno.teritori.com/r/demo/dao_realm_v6/dao_realm.gno)\r\n\r\n```go\r\npackage dao_realm\r\n\r\nimport (\r\n\t\"encoding/base64\"\r\n\t\"std\"\r\n\t\"strings\"\r\n\t\"time\"\r\n\r\n\tdao_core \"gno.land/p/demo/daodao/core_v16\"\r\n\tdao_interfaces \"gno.land/p/demo/daodao/interfaces_v16\"\r\n\tproposal_single \"gno.land/p/demo/daodao/proposal_single_v16\"\r\n\tvoting_group \"gno.land/p/demo/daodao/voting_group_v17\"\r\n\t\"gno.land/p/demo/ujson_v5\"\r\n\t\"gno.land/r/demo/groups_v22\"\r\n\tmodboards \"gno.land/r/demo/modboards_v9\"\r\n)\r\n\r\nvar (\r\n\tdaoCore dao_interfaces.IDAOCore\r\n\tmainBoardName = \"dao_realm\"\r\n\tgroupName = mainBoardName + \"_voting_group\"\r\n\tgroupID groups.GroupID\r\n)\r\n\r\nfunc init() {\r\n\tmodboards.CreateBoard(mainBoardName)\r\n\r\n\tvotingModuleFactory := func(core dao_interfaces.IDAOCore) dao_interfaces.IVotingModule {\r\n\t\tgroupID = groups.CreateGroup(groupName)\r\n\t\tgroups.AddMember(groupID, \"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c\", 1, \"\")\r\n\t\tgroups.AddMember(groupID, \"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv\", 1, \"\")\r\n\t\tgroups.AddMember(groupID, \"g14u5eaheavy0ux4dmpykg2gvxpvqvexm9cyg58a\", 1, \"\")\r\n\t\tgroups.AddMember(groupID, \"g1ckn395mpttp0vupgtratyufdaakgh8jgkmr3ym\", 1, \"\")\r\n\t\tgroups.AddMember(groupID, std.GetOrigCaller().String(), 1, \"\")\r\n\t\treturn voting_group.NewVotingGroup(groupID)\r\n\t}\r\n\r\n\tproposalModulesFactories := []dao_interfaces.ProposalModuleFactory{\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.IProposalModule {\r\n\t\t\ttt := proposal_single.Percent(100) // 1%\r\n\t\t\ttq := proposal_single.Percent(100) // 1%\r\n\t\t\treturn proposal_single.NewDAOProposalSingle(core, \u0026proposal_single.DAOProposalSingleOpts{\r\n\t\t\t\tMaxVotingPeriod: time.Hour * 24 * 42,\r\n\t\t\t\tThreshold: proposal_single.Threshold{ThresholdQuorum: \u0026proposal_single.ThresholdQuorum{\r\n\t\t\t\t\tThreshold: proposal_single.PercentageThreshold{Percent: \u0026tt},\r\n\t\t\t\t\tQuorum: proposal_single.PercentageThreshold{Percent: \u0026tq},\r\n\t\t\t\t}},\r\n\t\t\t})\r\n\t\t},\r\n\t}\r\n\r\n\tmessageHandlersFactories := []dao_interfaces.MessageHandlerFactory{\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\treturn groups.NewAddMemberHandler()\r\n\t\t},\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\treturn groups.NewDeleteMemberHandler()\r\n\t\t},\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\t// TODO: add a router to support multiple proposal modules\r\n\t\t\tpropMod := core.ProposalModules()[0]\r\n\t\t\treturn proposal_single.NewUpdateSettingsHandler(propMod.Module.(*proposal_single.DAOProposalSingle))\r\n\t\t},\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\treturn modboards.NewCreateBoardHandler()\r\n\t\t},\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\treturn modboards.NewDeletePostHandler()\r\n\t\t},\r\n\t}\r\n\r\n\tdaoCore = dao_core.NewDAOCore(votingModuleFactory, proposalModulesFactories, messageHandlersFactories)\r\n}\r\n\r\nfunc Render(path string) string {\r\n\treturn \"[[board](/r/demo/modboards:\" + mainBoardName + \")]\\n\\n\" + daoCore.Render(path)\r\n}\r\n\r\nfunc VoteJSON(moduleIndex int, proposalID int, voteJSON string) {\r\n\tmodule := dao_core.GetProposalModule(daoCore, moduleIndex)\r\n\tif !module.Enabled {\r\n\t\tpanic(\"proposal module is not enabled\")\r\n\t}\r\n\tmodule.Module.VoteJSON(proposalID, voteJSON)\r\n}\r\n\r\nfunc Execute(moduleIndex int, proposalID int) {\r\n\tmodule := dao_core.GetProposalModule(daoCore, moduleIndex)\r\n\tif !module.Enabled {\r\n\t\tpanic(\"proposal module is not enabled\")\r\n\t}\r\n\tmodule.Module.Execute(proposalID)\r\n}\r\n\r\nfunc ProposeJSON(moduleIndex int, proposalJSON string) {\r\n\tmodule := dao_core.GetProposalModule(daoCore, moduleIndex)\r\n\tif !module.Enabled {\r\n\t\tpanic(\"proposal module is not enabled\")\r\n\t}\r\n\tmodule.Module.ProposeJSON(proposalJSON)\r\n}\r\n\r\nfunc getProposalsJSON(moduleIndex int, limit int, startAfter string, reverse bool) string {\r\n\tmodule := dao_core.GetProposalModule(daoCore, moduleIndex)\r\n\treturn module.Module.ProposalsJSON(limit, startAfter, reverse)\r\n}\r\n```\r\n\r\n### Public Grant Report:\r\n\r\nYou can find the full report of [Teritori Core’s journey here](https://github.com/gnolang/hackerspace/issues/7). \r\n\r\n### Resources:\r\n\r\nDocumentation:\r\n- [Gno Moderation DAO](https://github.com/TERITORI/gno/blob/teritori-unified/examples/gno.land/r/demo/teritori/MODERATION_DAO.md)\r\n\r\nPackages:\r\n- [https://testnet.gno.teritori.com/r/demo/groups_v22](https://testnet.gno.teritori.com/r/demo/groups_v22)\r\n- [https://testnet.gno.teritori.com/p/demo/daodao/interfaces_v16](https://testnet.gno.teritori.com/p/demo/daodao/interfaces_v16)\r\n\r\nTutorial:\r\n- [Gno.land Social Feed Moderation on Teritori](https://teritori.gitbook.io/teritori-whitepaper/gno.land/introducing-gno.land-social-feed-v0.1#social-feed-moderation)\r\n","2023-10-19T01:50:00Z","ferrymangmi,zxxma,michelleellen","gnoland,dao,moderation,teritori"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["wyg-dongwon-shin","Who You Gno – On the Record with Dongwon Shin","\n*Who You Gno is intended to shine a light on the builders, contributors, and generally brilliant humans behind the tech. We’re excited to kick off this series with Dongwon Shin, the co-founder and CEO of one of Gno.land’s longest-contributing teams, Onbloc, a South Korean-based blockchain software company that builds key infrastructure and tooling for Gno.land*\n\nSince embarking on their Gno journey in late 2021, Dongwon and his team have been among the most active gnomes embodying the values of the Gno project: hardworking, passionate, honest, and humble, to name a few. You may already be familiar with Onbloc’s projects [Adena](https://adena.app/), [Gnoscan](https://gnoscan.io/), and [Gnoswap](https://github.com/gnoswap-labs) more about this can be found in [Onbloc's Hackerspace journey](https://github.com/gnolang/hackerspace/issues/29). In this interview, we’ll get the latest updates on these projects, hear about Dongwon the person, and learn more about what motivates him to be a gnome. Check it out.\n\n## Dongwon’s life before coding\nIt’s a cold November morning in Seoul, and Dongwon is in the office early after sleeping just a few hours. Speaking to him from Dubai, where “cool” is 30 ℃, it’s -1 ℃ in Korea. “I hope you’re keeping warm,” I smile, “Yeah,\" he laughs, “it’s not too bad.” Dongwon’s been in the industry since 2015 when web3 was still called “crypto,” ICOs were selling snake oil, and his compatriots were busy paying above the market price for bitcoin in a phenomenon called the “Kimchi premium.”\n\nAt the time, he was traveling the world as a professional e-sports gamer which saw him leaving Korea and living in San Francisco and L.A. for several years. “I had lots of tournaments to compete in, so I had to travel to many other countries,” he says, “while traveling, I learned about other cultures and people, and new experiences. It was really eye-opening, you know, it really helped make me who I am today.”\n\nAnd who is Dongwon today? \n\nAmbitious, driven, and one of the kindest, most genuine people you could ever meet. “I like challenges, and I’m very competitive,” he says. “I can't just do regular jobs. I get bored quickly, so I need to find something very competitive and hard that makes me stressed.” I point out that he’s in the right place, and he laughs. He explains that he used to spend an entire week, sometimes two, learning a game before a tournament, almost around the clock. “I had to put everything I have into winning that game, right?” He views working in web3 the same way.\n\n## The intersection between e-gaming and blockchain\nDongwong is clearly comfortable on the cutting edge in emerging industries that “are often looked down on,” like e-gaming and crypto. He takes great satisfaction in how they’ve both grown. “My parents were saying, 'Just go study,' while I was playing games, but e-sports has grown a lot. Right now, the industry is really big, and it's kind of the same with crypto.” He adds, “I like getting in early when other people are not interested and finding an opportunity there.”\n\nWhen looking to retire as a professional gamer, he found his home right away in web3, working with a blockchain consultant and the sports and entertainment-focused [Chiliz project](https://www.chiliz.com/), before launching his own blockchain consulting and development firm. “I didn't think I was going to be just a regular employee for a big company. So I wanted to start my own business,” he says.\n\n## Getting to Gno… Gno.land\nHow did Dongwon hear about Gno.land? \n\n“My co-founder, Peter, and I were long-time followers of the Cosmos ecosystem, and we found out that Jae was working on a new project called Gno.land in late 2021. We really liked the vision behind Gno.land, why he started, and what he wants to achieve. We value transparency, fairness, and censorship resistance, so we read all the documentation and his initial codebase and decided we should be part of his new initiative. We started Onbloc in early 2022.”\n\nDongwon didn’t know Jae personally, but he felt strongly aligned with his vision and what Gno.land aims to achieve. Also, his reputation as the founder of Tendermint and Cosmos preceded him. Dongwon’s co-founder, Peter, was also working on a project called Lunagram, a Cosmos wallet integrated with Telegram. Peter had fond memories of Jae, being very supportive of experimental projects, including his own, in the early days of Cosmos.\n\n## Building tools… Adena, Gnoscan, Gnoswap\nOnbloc has since become Gno.land’s most prolific contributor, launching the [Gnoscan](https://gnoscan.io/) block explorer and the [Adena](https://adena.app/) wallet, as well as creating tutorials and blogs to help onboard developers to Gno, and creating Gno.land’s first AMM DEX Gnoswap, the beta version of which is estimated for December this year. “Currently, the team is focused on developing Gnoswap, integrating [the realms and APIs](https://github.com/gnoswap-labs/gnoswap) with [the interface](https://github.com/gnoswap-labs/gnoswap-interface), enhancing the swap function and liquidity pools, and some additional features. We expect to launch the beta in about a month, so we’re quite excited!”\n\nAs for Adena, the defacto Gno.land wallet, “It's already production-ready, but we want to improve our UX, and UI to provide more secure ways of using a web3 wallet.” To achieve this, Onbloc is adding a feature called [Air-Gap](https://en.wikipedia.org/wiki/Air_gap_(networking)) which allows the wallet to be used in an offline environment, without the user needing to import their keys to Adena. “They can just use Adena as a broadcaster,” Dongwon explains. “I think this kind of feature is needed for enhancing security and educating people to use noncustodial products in a secure way.”\n\nOnbloc is also a [Q4 2023 grantee](https://test3.gno.land/r/gnoland/blog:p/funding-program-23q3) and will develop core Gno.land infrastructure in preparation for mainnet. “We are working on three key features,” Dongwon explains. “The first is contract interaction. So it's a way for a realm to interact with other realms. The second is porting essential Go packages to Gno, and the third is a multi-node testnet.” All in addition to Onbloc’s continued efforts on Gnoswap, Gnoscan, and Adena. “You’re keeping busy, then?” I ask. “All our hands are full now,” he laughs.\nI ask what he does in his free time and – in fact – whether he has any. “Not much,” he jokes, “but I like spending time with my son and playing board games together. He’s seven years old, and we are like friends.” Dongwon also likes to unwind by reading books when his son is asleep. One of his favorites is [*The Secret*](https://en.wikipedia.org/wiki/The_Secret_(Byrne_book)); he was “really inspired by the concept” when he was younger. I ask if he sees it working in his daily life and whether he believes he manifests what he wants into existence, “Definitely,” he replies without hesitation.\n\n## Dongwon’s conviction in Gno.land\nNot only is Dongwon working night and day, but he has bootstrapped his team from his own pocket to go all in on Gno.land. What makes his conviction so strong? “I truly believe that the Gno.land blockchain is the next generation of the blockchain industry. Gno.land is trying to invite web2 developers into web3 and providing all these developer-friendly tools so they don't need to learn a new language to get into the ecosystem. GnoVM, Tendermint2, everything is so transparent and simple.”\nHe believes Gno.land will be “one of the greatest experiments in the crypto industry” thanks to its fair rewards and contribution-based governance. “I'm really excited about this initiative, and all our team members are well-aligned to support this vision. We want to do our part to achieve the success of Gno.land.”\n\nI thank him for his time and ask if there’s anything he would like to add. He pauses for a moment and then says, “If you're building a dApp or looking for a new opportunity in a new ecosystem, I think this is your chance. I hope to see great developers and teams getting into Gno.land. Let’s make this ecosystem great together.”\n","2023-11-24T00:00:00Z","christina","whoyougno,onbloc,community,interview"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-6","The More You Gno: Gno.land Monthly Updates - 6","\n\nWelcome to the latest edition of The More You Gno, your regular source of updates from the Gno.land core team and contributor ecosystem. There’s a lot to cover this month, from a company engineering retreat to new core members and contributors. We’ve made progress across the board to fix important bugs and issues and provide additional features. There’s a new way to dynamically call realms, Gno.land’s tokenomics and governance are advancing, our standard library list is expanding, and our grantees are killing it with their deliverables. Without further ado, let’s dive in.\n\n## Gno Core Team Updates - TL;DR\n\nOnly got time to skim the updates? You’ll find the highlights in the list below. If you want to dive deeper into the topics, track our progress, understand the rationale behind our decisions, or explore the issues we came across, grab a coffee, kick back, and savor the full details.\n\n* **The Portal Loop** – Much of our focus over the past few months has been on the Portal Loop [(issue 1108)](https://github.com/gnolang/gno/issues/1108), which will make developing on Gno smoother, faster, and more intuitive. The Portal Loop will speed up deploying dApps and improve the UX for Gno.land devs.\n\n* **Dynamic Realm Caller** – We’ve added a new way to call realms dynamically so that dApps no longer have to manually import GRC20/721 tokens [(PR 1262)](https://github.com/gnolang/gno/pull/1262).\n\n* **DAO Structure \u0026 Tokenomics** – We’re close to finalizing the DAO structure of Gno.land and its tokenomics. There will be three main DAOs, GovDAO, EvaluationDAO, and SupportDAO. We’re exploring staking options for GNOT holders and working on transaction fees and gas.\n\n* **Gno Playground** – Gno Playground is an awesome way for developers to collaborate, share, and test their code. The full version isn’t ready yet, but we’re sharing the beta with anyone who wants to help us iterate and improve this week.\n\n* **Gno Standard Libraries** – In [issue 1267](https://github.com/gnolang/gno/issues/1267), you can find our current wishlist for Gno standard libraries. If you want to see what we have and what’s lacking, or you want to contribute, open an issue or a PR.\n\n* **Gno Language Server (Gnols)** – An implementation of the [Language Server Protocol (LSP)](https://microsoft.github.io/language-server-protocol/) for Gno, Gnols makes writing code simpler and works with several editors. Visit the [CONTRIBUTING.md file](https://github.com/gnolang/gno/blob/master/CONTRIBUTING.md#vim-support-with-lsp) to try it out.\n\n* **RustVM Implementation** – The RustVM implementation is almost ready and is in the debugging stages. We’re also looking at adding a Jit compiler and researching the topics of determinism and concurrency.\n\n* **Bytecode Go VM Implementation** – The Parscan project is progressing well toward completion of the spec. We look to provide support for interfaces in the interpreter by extending the standard reflect package, also to the benefit of the entire Go community.\n\n### Engineering Retreat\nGno core engineering team got together last month in our first company-wide retreat. It was an invaluable opportunity to work face-to-face, brainstorm ideas, code together, and fix several high-level concerns. We made many improvements to the technical aspects of the project, including major advances on the Portal Loop, and strengthened our alignment through team bonding activities, socializing, and having fun. \n\nWe made multiple bug fixes and resolved many of the issues that arose out of [GnoChess](https://github.com/gnolang/gnochess) development, and Manfred and the Onbloc team (who joined us on the retreat) demonstrated a new way to dynamically call contracts using dependency injection with a registry. This, combined with Golang's interface capabilities, can achieve a good balance between dynamism, explicitness, and security (including type safety). This pattern could enable massive DeFi applications when used with GRC interfaces. It could also support contract-based DAOs where features can be added later, opening the door to new design patterns around contract upgrades. Check out [PR 1262](https://github.com/gnolang/gno/pull/1262) for more details. \n\nIt was invaluable for everyone to get plenty of 1:1 time with Jae. Morgan was able to bring the Native Bindings topic ([PR 859](https://github.com/gnolang/gno/pull/859)) much closer to completion. This has been a recurring theme in our developer calls for the last few months as it’s a complex topic that aims to change how Gno can use Go code while still being understood by static analysis tools like gno doc. Michael got greater clarity over the DAO structure and GNOT tokenomics, Milos was able to merge [PR 546](https://github.com/gnolang/gno/pull/546), after many months of effort, which adds file-based transaction indexing, and Thomas created instructions for getting started with the Gno Language Server (gnols), to give just some examples. It was productive and enjoyable and unblocked many issues. \n\nAiB engineers were also at the retreat, Zooma from Teritori, and Dongwon, ByeongJun, and Ray from Onbloc, creating plenty of opportunities for interesting discussions and showcasing our work. We also welcomed new core members Dylan and Danny to the team. Dylan is a senior software engineer, and Danny is supporting DevEx. We enjoyed meeting and hacking together with like-minded people and would like to do it more often with a broader audience. How about a Gnome contributor festival next year? Stay tuned.\n\n### Gno.land DAOs and Tokenomics\nThroughout the retreat and ongoing, we’ve made major advances to the DAO structure for Gno.land and the tokenomics of the chain. We’re still hammering out the final details, but we’ve decided on three main DAOs – GovDAO, EvaluationDAO, and SupportDAO – that will work together alongside other domain-specific DAOs, such as EngineeringDAO or ProjectsDAO, making Gno.land more decentralized over time. \n\nThe multi-tiered GovDAO will be responsible for voting on all decisions that affect the chain, such as parameter changes or validator acceptance/denial. GovDAO members will assess new contributors to the chain and allocate them a score and corresponding membership tier. EvaluationDAO will assist with specific contributions, lending its expertise and critic reviews as needed. SupportDAO will provide knowledge-specific services such as HR, marketing, and finance.\n\nRegarding transaction fees, we're exploring something similar to how Ethereum deals with gas in its EIP 1559 update. Essentially, a combination of comparing a new block’s size with the last block to gauge demand and some small parameters we’re looking at. We’re also experimenting with staking alternatives where contributors can stake their tokens to support certain projects in return for staking rewards. It’s still early days, so watch this space. We’ll be releasing more details soon. \n\n### Gno Playground\nGno Playground is a simple web interface that lets you share your code, run unit tests, deploy your realm and package, and execute functions in your code using the repo for a smoother and more collaborative developer experience. We’re excited to release Gno Playground out in the wild later this month in a soft launch set for November 28. If you’re interested in testing it out, head over to our Discord channel. We’re looking for feedback and help to identify bugs and improve the UX before its full launch in the new year. It will be interesting to see how people interact with the Playground and how they use it so we can iterate and attract more gnomes to our growing community.\n\n### The Portal Loop\nThe Portal Loop is an effort to create a continuously-deployed staging testnet to be hosted on the official [gno.land website](https://gno.land). The testnet will be reset at each commit on our repository, but it will re-play all the transactions from its previous version, dropping any that might fail following breaking changes in the code. The Portal Loop will provide a central place where you can experiment with the latest Gno.land updates, resolving the problem our existing testnets have faced (becoming stale only a few months after their launch) while also paving the way for building DAOs and on-chain Game of Realms and Proof-of-Contribution systems. \n\nWithin the Portal Loop efforts, we’re also building systems to more efficiently iterate locally on your Gno realms, similar to the previously described testnet. The Portal Loop will help to create an iterative cycle focused on development, testing, and feedback, enhancing local development and the Gno.land website. As developers are discovering, when building dApps like GnoChess, GnoMobile, or Flippando, they run into issues with the repo, GnoVM, and client libraries when developing locally.\n\nThe Portal Loop will enable much quicker feedback so we can iterate, uncover, and fix problems faster. Devs will get a greatly improved UI, with UX contributions and issues much easier to resolve, and the same CI/CD experience as web2 applications, where each time something is published on Git, they get instant feedback on how it works in staging, not only in terms of code but also in terms of data. Stay tuned, the Portal Loop is coming soon!\n\n### Standard Library Wish List\nThe standard library wish list in [issue 1267](https://github.com/gnolang/gno/issues/1267) is intended to be a starting place for anyone who wants to add new standard libraries to Gno. It's an opinionated collection of libraries that we would like to see added. So, if you see something missing that you’d like added to our standard libraries, leave a comment explaining your reasoning. If you want to port over a standard library from the list, make an issue for it and assign yourself, or if you can do it quickly, make a PR referencing the issue. You can see the global status of our standard libraries (as compared to Go) on our [Go\u003c\u003eGno compatibility document](https://github.com/gnolang/gno/blob/d421b963aed7f7c3ba3718edfc6fbd787fa8f0dd/docs/reference/go-gno-compatibility.md).\n\n### Dreaming with SOGNO\nThe Sogno project is a [dream](https://www.wordreference.com/iten/Sogno) Morgan has about improvements he plans to make on GnoVM. From his experience working on GnoChess, he found that many features were lacking that would have improved the workflow, for example, an improved debugging system, enhanced representation of the values within the VM, having maps as sortable data structures, and adding reflection. Morgan plans to work on this project on the side as a fork when he has time, so Sogno won’t be merged into the master branch for now. If you want to check it out and see if you can contribute, visit the [hackerspace PR 44](https://github.com/gnolang/hackerspace/pull/44).\n\n### The Future of the Gno Language Server (Gnols)\nThe [Gno Language Server (gnols)](https://github.com/gno-playground/gnols) is an implementation of the [Language Server Protocol (LSP)](https://microsoft.github.io/language-server-protocol/) for the Gno programming language. It is similar to the equivalent “gopls” project for Go, as they can be plugged into your code editor through extensions and allow you to access handy features, such as autocompletion, formatting, and compile-time warnings/errors. Gnols makes writing code simpler, working with several editors to suit your preferences. To try it out, visit the [CONTRIBUTING.md file](https://github.com/gnolang/gno/blob/master/CONTRIBUTING.md#vim-support-with-lsp), which contains instructions to get you started. Our current documentation targets Vim, Neovim, and SublimeText, but can likely be used with any editor that supports LSP. Feel free to contribute to improving Gnols and adding more features. It’s well-written, and simple to dive into the code and add more capabilities.\n\n### RustVM Implementation\nPetar continues progressing on the RustVM implementation and has almost finished, apart from a few bug fixes. As the design is now complete, he will enter the testing stages. He is also looking at how to add a Jit compiler to the current design. Petar was initially concerned that the garbage collector might have presented serious issues, but this has turned out not to present a problem. Adding a Jit compiler will require a lot of work (at least six months) to support everything in the language, but it should be possible.\n\nPetar is also looking at implementing concurrency the way it is in Go to have a fully functional virtual machine as it is in the spec. This would likely attract more external contributors to developing the VM. One advantage of Rust is that, with the concurrency model, there is already an extensive library called [Tokio](https://tokio.rs/) which he can use. Petar stresses that this isn’t easy, but he believes it’s achievable, at least as a research topic around determinism and concurrency.\n\n### Go Bytecode VM Implementation\nMarc continues to develop Parscan, another bytecode VM, but entirely based on the Go runtime, with the advantage of reusing the type-checking system, concurrency model, and memory management already part of the existing Go runtime. In the last month, the support for all missing declaration statements (constants, variables, and types) was added in the code generator.\n\n## Grantee and Ecosystem Updates\nOur ecosystem partners and grantees are working flat out on their contributions. We’re close to seeing the on-chain memory game Flippando launch, Adena and Gnoswap are incorporating some major new features, Zack’s released another informative tutorial as part of the Go to Gno series, and we’ve received several new grant proposals as well. We’ve even welcomed a new contributing team, Varmeta, to the fold. Scroll through the details below.\nTL;DR?\n* On-chain memory game Flippando is coming soon\n* Gnomobile is almost complete and will be receiving a rebrand soon\n* Gnosocial will allow devs to experiment with social media dApps\n* Experiment with content moderation using the ModerationDAO or create your own DAO\n* Gnoswap AMM DEX beta will launch in December\n* Adena to implement new ‘Air-Gap’ feature\n* Varmeta is working on Gno.land Unity SDK to make Gno more accessible to game developers\n\n### Dragos\nDragos has been working on porting his on-chain memory game Flippando from Solidity to Gno, and we’re looking forward to playing it soon after seeing an awesome demo earlier this month. When you play Flippando, you uncover a matrix of matching visual symbols. There are 2 levels of difficulty (matrix made of 16 tiles or 64 tiles). For the launch, Dragos aims to have visual symbols containing basic colors, dice, hexagrams, or various gradients. Once you’ve matched all the pairs and completed a matrix, you mint an NFT that can be assembled as artwork on-chain and traded in a marketplace. Dragos is currently looking at the initial tokenomics for Flippando, with a fixed supply of 1 billion and no airdrop distribution (more details soon). \n\nDragos has been a mobile app developer for over 10 years, with an interest in blockchain for around seven years. He enjoys working with Gno, although having to reset the chain and redeploy programs each time he makes a change was a challenge. The Portal Loop solves these issues in local development and will allow him to deploy Flippando sooner. As part of the work for Flippando, Dragos also added [PR 1309](https://github.com/gnolang/gno/pull/1309) to improve our GRC721 implementation]. He is also applying for a grant to port his project management system on-chain for Gno, and he gave us a [demo](https://drive.google.com/file/d/1eJGyATHhEzletWwQ4Xt_9ON7L231Yvow/view). An on-chain project management tool will be essential for organizing the DAO system, focusing on our team’s needs, organizing tasks, setting goals, and more. Keep up with Dragos’ progress by visiting his [hackerspace](https://github.com/gnolang/hackerspace/issues/33).\n\n### Berty\nBerty has been powering ahead with Gnomobile (which will soon receive a new name to better reflect its functionality), Gnosocial, and Gno core. Some highlights include significant progress on the GRPC interface (see [demo video]https://www.loom.com/share/d1cef60199c0487e86deab2a9e61d61c). As the interface to Protobuf has many more data types available than the interface to the language bridge, GRPC greatly simplifies the app and improves the UX. The API is almost complete and now includes wallet functions, such as creating an account and restoring an account from the recovery phase, and an event stream when calling a realm function [(demo video available here)](https://www.loom.com/share/42f2dcb0b4a34f77a95a0f8012e4b52b).To help developers, Gnomobile also includes example apps. Here is a [demo video](https://www.loom.com/share/41a20a764f0f4caf91f068b62e1f16c4) of the latest minimal hello app.\n\nBerty created [PR 1235](https://github.com/gnolang/gno/pull/1235) relating to Amino. They start with a Go struct and add comments explaining all the fields. Previously, when they ran Amino and generated a Protobuf structure, all their comments disappeared. This PR allows them to preserve the comments. They also created [PR 1213](https://github.com/gnolang/gno/pull/1213) since Amino should create a Protobuf structure where the fields follow official naming conventions. Thanks to help from the Gno devs, these PRs are merged.\nBerty is also focused on building a decentralized social media application using the Gnomobile framework, which is almost complete. The aim is to create a testbed where dApp builders can see how their implementations integrate and function with web2-like social media features, opening the door to interesting experiments such as DAO collaboration and content modification. Berty is building a decentralized Twitter-like application and plans to finish it in six months. Check their progress on their [hackerspace here](https://github.com/gnolang/hackerspace/issues/28) and look for more upcoming demos.\n\n### Teritori\nTeritori has been focusing on Escrows in the past couple of months, aiming to make improvements that facilitate on-chain project management. The team is also iterating the Moderation DAO and has identified a need for a conflict solver module to call an external authority to solve a conflict between two parties (for example, the buyer and the seller). They have called this module the Conflict Solver Module and integrated several options like Justice DAO (composed of humans) or any realms (e.g. GnoChess) to solve the conflict. They are researching work on VRF to implement randomness so that the module selects a person (or group of people) with no conflicts of interest in the issue. [PR 11](https://github.com/TERITORI/gno/pull/11/files) provides more details. A true randomness function will also be handy for the Flippando game that doesn’t currently rely on true randomness. \n\nIn other news from Teritori, the moderation DAO is live! You can head to the [Teritori site](https://app.teritori.com/feed?network=gno-teritori) to play around with it and even try deploying your own DAO, creating a user profile, and adding a social feed. The team has deployed V1 of a “Soundcloud-like” app on the [Gnosocial feed](https://app.teritori.com/feed?network=gno-teritori) in which you can listen to music while browsing features, publish your own music as an artist that appears on your profile, comment on tracks, tip artists, and more. Keep updated with Teritori on their [hackerspace here](https://github.com/gnolang/hackerspace/issues/7).\n\n### Zack Scholl\nOur resident tinkerer Zack gave a workshop last month as part of his “Go to Gno” series called [Go to Gno: ByteBeat - Generating Audio with Smart Contracts](https://www.youtube.com/watch?v=lmmUIEHhdqA). This is a really interesting tutorial on how to build Bytebeat (a minimal programming language for synthesized music) with smart contracts and follows on from his microblogging workshop. Be sure to check it out. If you want to hear more about Zack, you can also watch [Getting to Gno with Zack Scholl](https://www.youtube.com/watch?v=LgXa7QCdxdA\u0026t=1258s), a Fireside Chat series that talks about contributors’ work, lives, and motivations to be on the Gno.land journey with us.\n\n### Onbloc\nAs always, the Onbloc team has been busy! Over the past few weeks, they have been working on extending the functionality of Gnoswap, integrating APIs and realms with the interface, improving the governance page UI, and integrating the Adena wallet. Onbloc expects to launch the beta of Gnoswap next month, and we’re super excited to see it in action. To improve the UX and UI of Adena and make the wallet even more secure, the team is implementing a feature called Air-Gap which allows the wallet to broadcast transactions signed from an offline environment without the user needing to import their keys to Adena. Onbloc has also started a discussion around ideas to improve the usability of QR Codes for secure data transmissions between offline signers and watch-only wallets in [Issue 1375](https://github.com/gnolang/gno/issues/1375). We’ll keep you updated on the work here. You can also find more information on Onbloc’s [informative blog](https://medium.com/onbloc). \n\nAs well as developing core tooling for Gno, Onbloc is working on Gno core to help us build important functionality. The team welcomed a new hire, Lee ByeongJun as a core engineer and to help with work on three core areas: contract interaction (enabling realms to interact with other realms), the multinode testnet, and porting essential Go packages to Gno. You can find more details and keep track of everything Onbloc is working on in their [hackerspace issue here](https://github.com/gnolang/hackerspace/issues/29).\n\n### Varmeta\nWe’re excited to welcome a new contributor Varmeta to Gno.land. Varmeta was founded in 2020 to focus on blockchain and virtual reality/augmented reality technologies and has grown from a team of three to over 40 engineers. Varmeta is excited by the vision behind Gno.land and its philosophy for rewarding developers. The team is committed to supporting Gno’s success by providing various applications for the ecosystem, starting with the Gno.land Unity SDK to make blockchain more accessible to game developers. Track Varmeta’s progress on their [hackerspace here](https://github.com/gnolang/hackerspace/issues/43).\n\n### Gno @ Devconnect Istanbul 2023\nGno.land core team members organized a small, unofficial meetup in Istanbul during Devconnect week from November 13-17. The engineering-focused meetup was accompanied by a Happy Hour and snacks, where attendees got the chance to learn about Gno.land in an informal way and how they can easily develop dApps in Gno, as well as contribute to the project.\n\nThat's all for now! Be sure to check back again with us for the next edition of The More You Gno to keep up with all our progress. Do you want to contribute to Gno.land's monthly updates? If you're building on Gno.land and want to highlight your development, project, event, or idea, let us know, and we'll include your contribution.","2023-11-29T00:00:00Z","christina","gnoland,ecosystem,updates,gnovm,tm2"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["bgl-poc1","Building Gno.land – Next Generation Smart Contract System","\n\n*Disclaimer: The Building Gno.land series aims to share the core concepts of our platform, mission, and tech stack, providing a snapshot of a current state on our builder’s journey. New episodes may deprecate previous ones, but no editions will be modified at any time. We encourage you to follow along as we create the rails for a more transparent and accountable society, and we welcome feedback and contributions to the repo.*\n\n## I. What Is Proof of Contribution (PoC)?\n\nGno.land is secured by a novel consensus mechanism that makes our platform unique—Proof of Contribution (PoC). PoC prioritizes fairness and merit, rewarding the people most active on the platform and revolutionizing the concept of open-source rewards. By removing the voting power associated with being wealthy (holding tokens in Proof-of-Stake (PoS) networks or amassing mining hardware in Proof-of-Work (PoW) networks), PoC restructures the financial incentives that tend to corrupt blockchain projects in the long run and rewards contributors fairly for their work based on their expertise, commitment, and values. \n\nGno.land contributors receive rewards and voting power according to their contribution level. These rewards increase as they make additional contributions, gain expertise, and are promoted up the Gno.land governing DAO’s (GovDAO) tier levels by higher-level contributors. So how does PoC work, what are its core features, and how does it lend security and decentralization to the platform? \n\n### Prioritizing Fairness and Alignment \n\nProof of Stake (PoS) was a monumental leap forward for the blockchain industry, solving the energy-intensive requirements of Proof of Work (PoW) and enabling blockchains to scale for broader adoption (thanks to its minimal carbon footprint and faster throughput). However, like PoW, PoS has some disadvantages. For example, in PoS networks, participants receive rewards based on how many tokens they stake, which means their incentives for working on the chain are often purely financial. Validators accumulate vast net worths and don’t always hold values that align with the core development of the chain. \n\nSince validators are crucial in securing PoS networks, they should be paid fairly for their work and encouraged to contribute more. However, validators should not be purely financially (and certainly not politically) motivated, taking up competing positions and launching political campaigns to convince token holders to stake with them. This type of lobbying affects all aspects of the chain’s development—from governance to technical upgrades—and can lead to factionalism and misalignment. \n\nPoC makes the system fairer and more sustainable, ensuring participants are aligned and take actions that benefit the Gno.land community and the broader ecosystem. That’s why (unlike PoS) contributors receive rewards based on their contribution effort (tier level) rather than how many tokens they stake. They are thus incentivized and recognized for the quality of their work, ideas, and alignment, driving participation and active engagement. Governance is allocated to the people most likely to care for the ecosystem’s long-term success—the contributors who have spent the most time working toward it—from open-source developers to video creators and everyone in between.\n\n### Rethinking Financial Incentives \n\nFor long-term security and sustainability, PoC emphasizes project principles and values over monetary gains, replacing standard token incentives with a system that separates voting power from token ownership. Two reward systems are currently being considered (in addition to a hybrid system). For the first, contributors receive WORX units that weigh the amount of GNOT tokens (the native Gno.land gas token) earned each month. Each member of the same tier receives the same amount of WORX. At the end of the month, the total each member earned is divided by the total amount of WORX distributed that month to calculate a percentage. This percentage represents the percentage of Gno.land fees earmarked for contributors that each member will earn in GNOT. WORX will likely be cleared each month to prevent cumulative, exponential reward exploits over long periods of time. \n\nFor the second, each tier level simply receives an amount of GNOT each month fixed to a USD value, similar to a salary. This would be combined with risk management and caps per tier level in order to promote long-term sustainability based on Gno.land fee generation. A hybrid of this system is also possible, either rewarding contributors of lower tiers one way and higher tiers the other or using both systems in tandem based on predefined conditions. This will be explored further in future tokenomics articles, models, and documentation.\n\nRegardless, WORX units are not transferable, will not be listed on exchanges, and hold no monetary value. WORX units are more like shares that represent value provided by contributors and allow their work to be quantified compared to other contributors/tier levels. It’s important to stress that GNOT tokens do not influence governance on the platform in any way. Voting power is earned through contributions and distributed according to contribution effort, with each member of the same tier representing equal voting power that increases with their tier level. This creates a network of highly aligned contributors who care deeply about the platform they are building and strive to improve it.\n\nGNOT, the native Gno.land gas token and the gas token of the Gno.land ecosystem, will be distributed via airdrop to qualifying ATOM stakers. It will also be available for purchase after that point (*more on Gno.land’s airdrop and tokenomics coming soon*). GNOT is used to pay all fees associated with the network and beyond, including transfers, IBC, ICS, and contract interactions, giving holders the chance to earn rewards from the economic activities of Gno.land.\n\n### What Makes a Good Contribution?\n\nWORX and/or GNOT can be earned through different types of contributions—not only coding and development expertise—but also through non-technical contributions, such as community building, governance involvement, constitutional proposals, teamwork, media creation, etc. The core focus is on alignment, not necessarily specific tasks. For example, an accepted proposal or merged code will raise or at least maintain the contributor’s tier level, allowing them to receive rewards during their time working between submissions. However, a proposal or code that has displayed a very high level of effort, detail, and aligned values (but is not merged) will also be considered in any proposals regarding contributor promotion.\n\nThis system allows the ecosystem to show appreciation for diverse forms of contributions and ‘useful failures’ that bring us closer to the solutions we adopt. It is designed to foster engagement, creativity, and collaboration while encouraging anyone aligned to contribute to growing the Gno.land chain and community. \n\n### How Are Contributions Assessed?\n\nThere is a strong human element to deciding what makes a good contribution, requiring knowledgeable human judges to exercise discretion. As such, contributions won’t be templated by default or rewarded automatically but assessed through Gno.land’s governing DAO, GovDAO. GovDAO is responsible for development and governance and is organized into tiers, as discussed above.\n\nGovDAO members review, measure, and curate contributions, and the tokenomics of GovDAO incentivizes members to be effective and unbiased evaluators. They engage in discussions and assess contributions based on effort, time, and other relevant factors/metrics that contributors will have stored in their profiles. The decision-making rationale is transparent and visible through on-chain forums. Again, contributors are assigned a tier level and receive a corresponding reward each month according to their tier. As contributors join GovDAO, the DAO grows, giving Gno.land decentralization efficiency and a high Satoshi score. \n\nGovDAO is assisted by a network of knowledge-specific DAOs, such as an Engineering DAO, a Support DAO, an Operations DAO, and the EvaluationDAO, which comprises a trusted group of high-reputation contributors that help assess specific contributions. This enables secure collaboration and seamless integration (*more on Gno.land’s network of interconnected DAOs coming soon*.) \n\n### Sybil-Resistant and Secure\n\nIn addition to being fairer, more aligned, and sustainable, PoC is Sybil-resistant by design. In blockchains, a Sybil attack is where one or multiple attackers multiply their presence and influence by creating fake identities to sway major network decisions (for example, including malicious blocks). In terms of PoS, the Sybil resistance is purely monetary (people need to stake real money to get power), so an attacker that wants to carry out a Sybil attack on a PoS network needs to lock at least as much stake as that locked by honest validators.\n\nPoC minimizes risks of Sybil attacks, takeovers, and alliances as the community vets every person who is given any power or sway in the network (including validator power) through the DAO, so at no point can anyone \"spoof\" identities and regain major sway. Moreover, Gno.land is built and secured by the merit and effort put into the project, as opposed to how many tokens someone can buy, rethinking financial incentives and making the platform Sybil-resistant and secure.\n\nThrough fairer rewards, restructured incentives, resistance to corruption and Sybil attacks, and a strong appreciation for all contributions, Gno.land is designed to be sustainable and fair. A censorship-resistant platform built, owned, and secured by a growing, aligned community for many generations to come.\n\n*I. What Is Proof of Contribution? is the first in a series of articles to dive deeply into the philosophy, vision, mechanics, and work involved in developing a new consensus mechanism for the next generation of smart contract systems. Look out for subsequent editions and additional Building Gno.land series, and let us know what you think! Got questions? Join the Gno.land [Discord](https://discord.com/invite/S8nKUqwkPn) or follow us on [Twitter/X](https://x.com/_gnoland)*.\n","2024-01-10T10:51:00Z","","building-gnoland,gnoland,proof-of-contribution"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-7","The More You Gno: Gno.land Monthly Updates - 7","\n\nWelcome to the latest edition of *The More You Gno*, your regular source of updates from the Gno.land core team and contributor ecosystem. After a well-deserved rest during the holiday break, we’re kicking off 2024 with renewed energy and plenty of exciting initiatives, including a new staging testnet (the Portal Loop), the official Gno.land documentation page, several merged PRs (including native bindings!), and many updates across the board. Dive in to find out what we’re working on and what our ecosystem partners and grantees have been up to.\n\n## Gno Core Team Updates TL;DR\n\nShort on time? Skim the highlights from the core team in the list below. You’ll find additional details in the next section if you want to explore any topic in greater detail.\n- **Native Bindings** - If you’ve been following our journey or experimenting with the platform, you’ll hear virtual champagne pops as Morgan’s ongoing work with native bindings is finally merged [PR 859](https://github.com/gnolang/gno/pull/859).\n- **Gnodev** - Thanks to Guilhem’s `gnodev` initiative [PR 1386](https://github.com/gnolang/gno/pull/1386), you can now create and develop contracts with a single command.\n- **Gno.land Offical Docs** - Check out [docs.gno.land](https://docs.gno.land) for how-to guides, getting started, and an overview of key concepts of the platform.\n- **Effective Gno** - Taking inspiration from *Effective Go*, Manfred’s begun listing common patterns and examples of the differences between Gno and Go.\n- **Assignment in GnoVM** - Jae is working on approaches to fixing assignment in the GnoVM and issues that deal with persistence [(issue 1326)](https://github.com/gnolang/gno/issues/1326). \n- **Portal Loop** - The [Portal Loop](https://portal.gnoteam.com) has been released on a staging domain and is being tested.\n- **Roadmap** - We’re working on a fully-fledged Gno.land roadmap and will share a detailed DAG and important goals and milestones with you soon.\n- **Tendermint2 Update** - There are several PRs aimed at removing the dependencies between Tendermint2 and GnoVM.\n- **Gno.land Tokenomics** - We continue to make progress in defining the structure of Gno.land’s DAOs and the design of reward schemes for contributors.\n### Native Bindings (PR859) Has Been Merged\n[PR 859](https://github.com/gnolang/gno/pull/859) (native bindings) was submitted by Morgan in May 2023 to improve calling Go code from Gno standard libraries, all while improving `gno doc` documentation for standard library functions. Native functions are _declared_ in Gno code, but their definition (the underlying code) only exists in Go: this is similar to how Go and many other systems languages implement assembly functions. Overall, the addition will now allow us to better support precompilation (transpiling Gno code to Go) for all Gno-specific standard libraries, like [`std`](https://docs.gno.land/reference/standard-library/std/address/), and have a system for defining such functions that is transparent to code analysis tools like `gno doc` and `gnols`.\n### Gnodev Has Been Merged\n[PR 1386](https://github.com/gnolang/gno/pull/1386) (`gnodev`) has been merged. Gnodev is a tool to locally develop Gno realms which automatically re-deploys your contracts when you change the files, similar to JavaScript frameworks `npm run dev`. There are some additional features being worked on to improve the experience, including browser hot-reload (for the full front-end JavaScript experience!)—and Gno core developers who have worked on realms all agree that thanks to `gnodev`, they can finally stop visiting their therapist every week. Play around with it, and let us know how you get on. There may be a few bugs still and Guilhem is happily accepting feedback.\n### The Gno.land Official Documentation Page Is Live\nWe’re excited to have the Gno.land Official Documentation page live on the [https://docs.gno.land](https://docs.gno.land) domain. This will always be a work in progress as we expand the docs, make iterations to existing issues, and refine some of the core concepts, but it’s an excellent resource for anyone wanting to find out more about Gno and for onboarding new developers to the platform. A big thanks to the Onbloc team, whose developer portal was a huge inspiration for this. We’re looking for feedback, so leave your reviews and let us know where the docs can be improved and what else you would like to see.\n### Effective Gno\nManfred has been working on a document called [Effective Gno (PR 1000)](https://github.com/gnolang/gno/pull/1000), which takes inspiration from *[Effective Go](https://go.dev/doc/effective_go)* and will become an important reference document for Gno devs to explore common patterns and crucial differences in how we program compared to Go. We’ll be iterating on this as we progress, but you can already find plenty of examples. If you’re just getting into Gno and coming from a Go background, this is a great resource. Read this document and provide some comments if you have any. \n### The Portal Loop Beta Is Live\nThe Portal Loop Beta has been released on a staging domain, and you can check it out now at [https://portal.gnoteam.com](https://portal.gnoteam.com). The Portal Loop will replace the Gno.land website once we’ve finished squashing bugs and adding features. We’re still testing it and have identified several issues. For example, from the last three merged PRs, only one triggered a redeploy when we expected two or three deploys. We will also add a faucet.\n\nAs we continue to evolve the Portal Loop out of its early development stages, transaction volume and general activity will increase. However, currently, there are insufficient transit testing transactions. One of the tasks we want to do to prove that the Portal Loop is working well enough is to write a kind of monitoring-oriented oracle that will try to make transactions, perhaps incrementing a counter every minute. We’re looking for help writing a script or a daemon for this oracle, so let us know if you want to contribute to [issue 1443](https://github.com/gnolang/gno/issues/1443). Once the Portal Loop is finished, we will focus on testnet 4.\n### Assignment Issues in the GnoVM\nMorgan came across a bug [issue 1326](https://github.com/gnolang/gno/issues/1326), which returned an error about an [“unexpected unreal object”](https://tenor.com/es/view/cranizox-gif-8576622211330078986) when assigning a local variable to a dereferenced global variable in the GnoVM. Jae has been spending some time working on approaches to solving this and fixing assignment that will also work for saving escaped objects that don't have a parent (like variables whose pointers are referenced on a persisted object). This is a tough one to figure out, so if there are any other VM issues that deal with persistence and detached parentless objects, now is the time to add them to Jae’s plate. \n### An Update on Tendermint2\n[PR 1483](https://github.com/gnolang/gno/pull/1483) has the same goal as [PR 1438](https://github.com/gnolang/gno/pull/1438): to make Tendermint2 completely independent of GnoVM and Gno.land. This continues a project started many months ago to separate Gno into three separate components: the Tendermint2 consensus engine, the Gno programming language and VM, and Gno.land, the blockchain combining both together. This way, we’re working towards making it possible to build other blockchains that use Tendermint2 (like AtomOne!), the GnoVM, or both!\n### Gno.land Engineering Retreat\nIn the last *The More You Gno*, we covered the Gno.land and AIB company-wide retreat, an invaluable opportunity to work together, code together, and get to know our peers outside of work. It was such a success that the Gno core dev team held another retreat in December in Rouen, France, where many of the above issues and PRs were tackled and merged. We look forward to more productive and frequent face-to-face meetings in the year ahead.\n### Gno.land DAOs and Tokenomics\nWith the input of Manfred, Jae, and the rest of the team, Michael continues to make advancements on Gno.land’s system of DAOs and tokenomics. One key change since the last edition is that the WorxDAO (responsible for governance and all issues related to development in Gno.land) will now be known as the GovDAO. The DAO will likely have seven tiers but initially launch with three or four. The main benefits of moving up tiers are increased voting power, increased monthly rewards, and the authority to promote members from lower tiers. GovDAO will be assisted by WorxDAO, which will encompass several different sub-DAOs, such as engineering, funding, and projects. \n\nWe’re currently exploring different reward systems for contributors, whereby each member of the same tier level will receive the same amount of rewards, either directly or indirectly, in the GNOT native gas token or USD, in a type of salary-based scheme. We may also elect to distribute rewards based on a contribution/work “hash difficulty” (total number and tier split of active contributors that month). We may also adopt a hybrid of these two models. \n\nMichael is also working on a bounty system to make Game of Realms (GoR) more accessible and evaluating contributions easier for judges. High ranking GoR competitors will likely receive Gno.land tier levels based on their leaderboard placing in addition to ATOM rewards. It’s important to note that these discussions are ongoing, and the information here may be deprecated. \n### Making Testing Faster\n\nThanks to Petar, [PR 1417](https://github.com/gnolang/gno/pull/1417), we have improved the entire VM testing suite runtime by around four minutes, which is an incredible achievement. We just need to refactor some test scenarios that are not very concurrent-friendly, but this PR makes interacting with the platform so much easier.\n\n### Bug Fixes and Miscellaneous Items\n\nThanks to Joon from Onbloc, we were able to add support for octals without 'o' (check out [PR 1331](https://github.com/gnolang/gno/pull/1331) for more details), and thanks to Dragos [PR 1309](https://github.com/gnolang/gno/pull/1309), we extended the GRC721 interface so that it now supports setting a token URI. These are both extremely welcomed contributions, and we appreciate our ecosystem partners.\n\nFrom the core team, a special shout out to Dylan for killing it fixing bugs, and getting many PRs ([PR 1451](https://github.com/gnolang/gno/pull/1451), [PR 1315](https://github.com/gnolang/gno/pull/1315), and [PR 1305](https://github.com/gnolang/gno/pull/1305), to name a few) merged over the last few weeks. Props also go to Marc for [PR 1177](https://github.com/gnolang/gno/pull/1177), which has just been merged, which fixes append in certain key situations. We’ve also welcomed a new security engineer, Kristov, to the team.\n\n## Grantee and Ecosystem Updates\n\n### Onbloc\n\nOnbloc has been on a roll, giving us an internal demo of Gnoswap beta just before the Christmas break and a public demo of its awesome Pool Incentivization feature during the last contributor sync call. With Pool Incentivization, anyone can add extra rewards on top of swap fees for LP stakers. This will help bootstrap initial liquidity for new-coming projects by attracting liquidity providers until sufficient organic trading volume is secured. Onbloc is also actively developing Adena’s Airgap feature and has improved the sign-in flow for security enhancement along with some refactoring. There will be a demo coming up in the next few weeks. Onbloc will also be researching airdrop trends and aiming to identify some of the most coveted DEX features users want to see for Gnoswap to streamline the onboarding process.\n\nRegarding Gno core, Onbloc core dev Byeongjoon Lee has developed a JSON parser for Gno, giving us a live demo during the last contributor sync. This allows the conversion or accessing of data from contracts in the JSON format, which will improve the Gno developer experience. His code is currently under review by the core team in [PR 1415](https://github.com/gnolang/gno/pull/1415). Dive deeper into Onbloc’s Builder Journey in the [hackerspace issue 29](https://github.com/gnolang/hackerspace/issues/29).\n\n### Teritori\n\nTeritori continues the challenging work of developing Gno Project Manager, a web app that allows anyone to create, fund, review, or manage projects fully on-chain. During the last contributors' call, the team gave a demo of the work achieved so far, in particular regarding the escrow system and completing project milestones so contributors can be paid once each one is completed rather than having to wait until the project finalization. \n\nGno Project Manager is a complex goal, and the team has run into some issues with edge cases they hadn’t bargained for in the relationships between grantees and funders. The team is looking for feedback and help identifying edge cases, so if you have any in mind, let them know. Teritori is also working on the conflict solver module and improving the social feed on [https://app.teritori.com/feed?network=gno-teritori](https://app.teritori.com/feed?network=gno-teritori), as well as providing more detailed documentation on their work, which they’ll be releasing in the coming weeks.\n\n### Berty\n\nThe Berty team has been busy working on GnoSocial backend implementation. The initial feature set has been implemented [here](https://github.com/gnolang/gnosocial/blob/main/realm/public.gno), including posting and replying to messages and reposting threads. You can keep up with Berty’s journey on GnoSocial in [hackerspace issue 51](https://github.com/gnolang/hackerspace/issues/51), which contains many issues and PRs, such as implementing calls, running tests, and fixing bugs. We’re super excited about pushing the limits of scalability with Berty’s decentralized social platform, and we’ll be looking forward to more demos in the coming weeks.\n### Dragos\nDragos has successfully launched the Flippando game, and you can try it out on the [testnet here](https://gno.flippando.xyz/flip). If you haven’t been following the progress, Flippando is an on-chain memory game that you can play with your choice of styles, such as dice, colors, and hexagrams. Once you successfully complete a matrix, you can mint the end result as an NFT, which can later be assembled into larger, more complex NFTs to create digital artwork. You can find out more about the game, its creator, and the official roadmap on the site. We’ll also release a blog post soon from Dragos sharing his experience porting Flippando from Solidity to Gno, so stay tuned!\n### Varmeta \nVarmeta’s update was brief this week since the contributor sync call ran over. We look forward to hearing more about the team’s progress in developing the Unity SDK for Gno next time. You can read more about it on Varmeta’s [hackerspace issue 43](https://github.com/gnolang/hackerspace/issues/43).\n\n*Do you want to contribute to Gno.land's monthly updates? If you're building on Gno.land and want to highlight your development, project, event, or idea, let us know, and we'll include your contribution. That's all for now! Keep track of our progress by following our socials [Twitter/X](https://twitter.com/_gnoland) and [Discord](https://discord.com/invite/tF2X8M6cVj) and watch out for the next edition of The More You Gno in a few weeks.* \n","2024-01-22T00:00:00Z","christina","gnoland,ecosystem,updates,gnovm,tm2"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["porting-flippando-gno","5 Things I Learned While Porting Flippando From Solidity to Gno ","\n\nLast year, while visiting Seoul, South Korea, I decided, on a whim, to sign up for a hackathon called Glitch. The project I was going to present was a tiny little game, written in Solidity, called Flippando. It started as a weekend project to help me learn Solidity (I had no prior experience with this language). To my surprise, my tiny little game won the first prize on the Polygon track of the Glitch hackathon.\n\nEncouraged and even more curious now, I started attending side events during Buidl.Asia. One was about Gno, a smart contract platform written in Go. After the presentation, which was really great, I started a light conversation with the team. One thing led to another, and I ended up showing them Flippando. \n\nJust for context, Flippando is a non-degen, deceptively simple memory game. You start with an empty matrix and flip tiles to see what’s “underneath.” If the tiles match, they remain uncovered; if not, they are briefly shown, and you have to memorize their color until the entire matrix is uncovered. The end result can be minted as an NFT, and you can later assemble all the boards into bigger, more complex NFTs, basically “painting” with the uncovered tiles.\n\nThe Gno team seemed to like it, and they suggested I should apply for a grant to port it to Go/Gno. I had no prior experience in Go either, so I thought this would be a good opportunity to learn more. To my surprise, again, my grant submission was accepted.\n\nFast forward a few months until now: the Gno version of Flippando is live (in testnet beta) at [https://gno.flippando.xyz](https://gno.flippando.xyz). What follows sums up my experience porting the game from Solidity to Gno. This blog post is a mix of technical and not-so-technical takeaways.\n\n## 1. Being Early Pays Off\n\nSolidity has been around for some time now, and there is already a solid tooling ecosystem for it. I used Hardhat for my development, and I got really comfortable with it. When I started to port Flippando, though, I was quite surprised to see there was almost no tooling in Gno. Developing was mostly TDD (test-driven development) against a local VM, and deploying realms on the actual chain was more complicated than I expected. \n\nMy first feedback rounds to the team revolved almost exclusively around this topic. Very soon, I started to receive signals that my feedback was not only heard but taken into account and processed, and there were actual projects built aiming to improve the developer experience. In just two or three months, two full projects were finished: gnodev, and Gno Playground. \n\nGnodev makes development very similar to Metro in React Native: there is a watchdog on the file system, and your changes to the realm code are reloaded every time you save. It’s almost like deploying in real time; no need to stop the chain, wipe the state, restart the chain, and redeploy your modifications. Gno Playground is a sandbox-like environment, which helps tremendously with quick testing and even deploying packages on-chain. Both projects were finished, as I said, in just two to three months.\n\nBeing early pays off because you get to shape your development environment much faster than in a solidified (pun intended!) environment. You may have to deal with a little chaos in the beginning, but the benefits are well worth it.\n\n## 2. TDD All Day Long\n\nAs I said above, developing realms in Gno consists mainly of writing and testing your code with another code. It’s called TDD and it’s a very useful developing strategy, in general. I used it, at my day job, in all my projects consistently, but only in the initial stages. Once the codebase was more stable, I was relying more on regression tests from the Q\u0026A team.\n\nMind you, there was no Q\u0026A team this time; I was just coding alone, and I was forced to comply more and more with this TDD approach. In the end, I have to admit that, while slower and a bit boring, this approach is more effective, especially in a volatile environment, where patches are added literally every day, and the environment changes continuously.\n\n## 3. Marshal and Unmarshal\n\nThe current GnoVM doesn’t yet have an API standard for formatting. You can’t put a setting somewhere that will make the response be automatically translated into JSON. You have to write these JSON objects yourself for every payload you return from your realm. \n\nIn Solidity, all this is hidden under the event mechanism and handled by existing libraries, like ether.js, which take care of all this nitpicking. It soon became obvious that development time would be significantly longer in Gno because, on top of the logic, I also had to write the formatted response “by hand.”\n\nBut as with every other thing that seemed weird in the beginning, eventually, I came to appreciate it. It forced me to prototype more carefully not only the actual response but all the objects needed in my game. Eventually, it resulted in simpler and more flexible code.\n\n## 4. Eating Your Own Dog Food\n\nWhen developing in Solidity, most of the time, you just import OpenZeppelin contracts for ERC20 and ERC721 tokens (which are battle-tested, bug-free, and relatively easy to understand) and focus on your own contract logic. No mingling with low-level token implementation details; these are already packaged and ready to use.\n\nWhile porting Flippando to Gno, I realized I had to deal with these low-level details upfront simply because there was no equivalent of the OpenZeppeling contracts. Moreover, some current GRCs (the Gno equivalent of ERC) were incomplete. \n\nSo, I had to make a PR for a GRC721 implementation that was missing the SetTokenURI functionality, and this PR ended up being merged into the main Gno codebase (that felt really good, to be honest). \n\n## 5. Being Early Pays Off. Did I Say That Already?\n\nYes, but this time it’s about something else. It’s not about the satisfaction of shaping the development environment in the early days. It’s about the privilege of witnessing something coming to life from literally nothing. Gno has been in development for almost two years now, and it is several months before its mainnet. It’s literally on the verge of coming “alive.”\n\nEvery day new commits are added, and new decisions are made. There are new contributors constantly joining, and new projects prototyped and launched faster and faster. Every day the ecosystem is coagulating itself into something more and more visible, more and more alive.\n\nBeing able to witness this from the inside is a rare privilege and something I’m very grateful for.\n\n## Final Thoughts \n\nSo, these are, in a nutshell, my five top takeaways from porting Flippando from Solidity to Gno. There are many others, of course, and Gno is (did I already say this?) still very early. If you’re interested in learning more, please visit the official repo, look at the docs, and try interacting with the devs. You’ll never gno what can grow out of it! And be sure to play [Flippando](https://gno.flippando.xyz) today live in testnet beta and share your flips.\n\n## Here’s How to Play Flippando\n\nThe game presents a 16 tiles (4x4) or 64 tiles (8x8) matrix. These tiles are “covering” a board of various colors and gradients or shapes, like dice or hexagrams. Clicking two tiles consecutively “flips” them, showing what’s underneath. If they match, they remain uncovered; if not, they are briefly shown, and the player needs to remember their position. Once an entire board is flipped, revealing its random combination of colors, the player can choose to mint it as an NFT.\n\nWhen minting a solved board as an NFT, the game also mints a fungible token, FLIP, which is “locked” inside the NFT. This is the player's “reward.” But the token can only be unlocked if someone else uses that NFT in a larger project.\n\nThese larger projects, or “artworks,” can be assembled in the Flippando Playground. All minted basic NFTs are displayed here in an area from where the player can drag and drop them onto a canvas, creating a much bigger and more complex NFT. Once the canvas is fully filled and the player is satisfied with what’s in there, these new “artwork” NFTs can also be minted. This unlocks all the FLIP tokens for the NFTs used inside the artwork and sends them to their initial players. Furthermore, these complex artworks can be listed and traded in a marketplace, closing the circle of a virtual economy of goods.\n\nStart playing Flippando and share your Flips with Gno.land on [Twitter/X](https://x.com/_gnoland?lang=en) by tagging #gnoflip. \n\n\n","2024-01-24T00:00:00Z","dragos","gnoland,ecosystem,updates,flippando"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["wyg-zooma","Who You Gno – On the Record with Antoine Breuil","\n\nAntoine Breuil, ‘zôÖma,’ is the co-founder of [Teritori](https://app.teritori.com/), an active Gno.land contributor and grantee that’s building key modules and tooling for Gno. A firm believer in equal opportunities, free and decentralized access to information, and helping fellow humans, zôÖma is fascinated by human behavior and how we organize ourselves, holding an avant-garde social experiment five years ago with Teritori co-founder ‘Pop.’ \"La Suite du Monde\" drew people across France to a small village in the countryside to create a shared community and society—with farmland, accommodation, and tools for common use.\n\nThe goal was to form an in-real-life DAO whose members shared common goals and interests using blockchain technology with a token to pay for goods and services and vote on governance matters. While many people participated and were enthusiastic about creating a shared society, zôÖma admits the experiment was early- no one was interested in interacting with the tech. “90% of people, rural or not, found it too complicated,” he admits. “We were a bit naive, but it was fascinating nonetheless.”\n\n## A Fascination for Human Behavior\n\nzôÖma has been an ardent student of human behavior since childhood. His parents taught him early on the value of philanthropy and working with people in need. He’s set up several joint liability companies, non-profits, and NGOs to experiment with finding new and better ways to organize society, and one of the things he loves most about web3 is its “experimental” nature. He’s encouraged by how far the industry has come since he received his first bitcoins in partial payment for a website in 2014. “That turned out to be a really expensive website for my customer,” he laughs. He never expected such broad adoption of Bitcoin and a technology that “inspired a whole generation of engineers to experiment with new things.”\n\nLike most creative types, zôÖma is used to spinning many plates in the air, overseeing La Suite du Monde while working as a freelance designer, front-end dev, and Artistic Director for an independent French record label. “Before entering the world of engineers, I founded and managed a collective for 12 years, which brought together artists from all disciplines, hackers, designers, tinkerers, to build some interesting projects.” La Suite de Monde allowed him to explore his passion for finding new approaches to social coordination first-hand. “I explored very radical things,” he says, “like the notion of “accepted by default” where anyone could use the collective budget by expressing their desire to do so three times. I wouldn’t recommend this,” he laughs, “but the experiments were fascinating and still serve me today in my work.”\n\nOne really interesting trait about zôÖma is how he harnesses the creative and analytical sides of himself with equal application. Most people are predominantly right-brained or left-brained, yet, zôÖma is ‘ambidextrous’ in this regard. He’s a designer who’s created large-scale artistic events, cultural tours of Paris, and an award-winning independent movie documenting French artist and Bitcoin advocate Pascal Boyart, [The Underground Sistine Chapel](http://www.the-chapel.art), (which you should definitely check out!). Yet he’s also passionate about engineering and the future of cooperatives. He’s detail-driven and ambitious, taking his team at Teritori from two to 18 (14 full-time teammates and four part-time).\n\nIn his free time, zôÖma, “like all French people,” enjoys fine wine and good conversation. One of the things he loves most about Paris is how easy it is to find like-minded people to brainstorm with or decompress after a long day of work. “We have a very active ecosystem of engineers, cryptographers, etc.,” he says. Paris is also a beautiful city that captures his imagination with its dazzling architecture and impressive art. Even so, zôÖma channels his creative energy more effectively when working from a small Moroccan fishing village for three months a year. He reconnects with nature and humanity, immersing himself in a different culture and surfing in the Atlantic before he starts his day. \n\n## New Tools for Social Coordination \n\nWhy does zôÖma believe social coordination is so important, and why do we need new tools for it? “We’ve always had tendencies to organize ourselves and tools defining rules for living together, diplomatic protocols for discussing between social groups, or trading goods and services. But almost all the tools that previous generations put in place are outdated. Our entire generation has lost confidence in institutions to allow groups of humans to organize, coordinate, and meet their needs. Our dependence on third parties who do not have the same interests as citizens is immense.”\n\nzôÖma believes that web3 holds the key to unlocking the emergence of new societies through products that are “unstoppable, resilient, and meet a real need,” whether for small villages in the south of France, Africa, or Asia or neighborhoods in Brazil or Korea. “We must have access to the radical transparency of institutions, the privacy of individuals, censorship-resistant tools, and autonomous communication from all commercial enterprises. It is on this solid foundation that civilizations that are more just and equitable can be built.”\n\n## Making Web3 More Accessible \n\nOf course, as zôÖma found out, building new tools is easier said than done. Our industry faces an uphill climb when it comes to balancing the promise of the tech with a user experience that doesn’t cause tachycardia. He says that understanding that most people “don’t have the time or inclination to incorporate difficult technical concepts in their lives” has given him “crazy energy to focus on very simple technologies.” In fact, the ‘failure’ of La Suite du Monde is what gave birth to Teritori, “which today provides all the functionalities people asked us for at the time; a social network, communication systems, voting, crowd-funding, etc. We have made great progress, and it’s important to focus on products that are radically simple for the general public.”\n\nAccording to zôÖma, this means abstracting away the concepts that everyday people don’t need to be aware of, such as networks, dApps, and even blockchain, “and always switching from one decentralized application to another.” Unifying (not centralizing) separate tools, networks, and technologies within a single, simple interface, he believes, is the key to broader adoption. “It's a very complex challenge, in terms of security, design, etc., but it's what I'm passionate about today.” \n\nWhen it comes to Gno.land, Teritori has already delivered essential DAO tooling and standards, a Moderation DAO module to facilitate social communication and a Justice DAO module for conflict resolution. The team is now focusing on an on-chain project management tool to allow organizations and individuals to manage projects and track tasks smoothly and transparently on-chain.\n\n## A Fairer, More Transparent World\n\nIn 2024, Teritori enters a new phase called \"Chapter II,\" which involves unifying all its work into a mobile and desktop application that could “trigger superb demonstrations of the potential of DAOs.” He enthuses, “I dream that we will see the emergence of a village that uses Teritori as a tool for internal discussion and co-financing. Will this be real in 2024? Who knows? But that’s where I focus all my energy!”\n\nHe believes the internet has been a great leveler, enabling anyone with a connection to educate themselves on any subject; yet, the opportunity isn’t open to all, and free and open access is constantly diminishing. “I am a child of the internet. I grew up with warez, p2p, and an internet which provided me with daily resources to learn freely, everything that interested me. In some countries, it is impossible to benefit from this opportunity, and with the centralization of the internet on different key players, mass surveillance, and the censorship of certain dictators, the internet is losing its very essence, which makes it magic. Distributed protocols can reshuffle the cards and offer tools for the public good.” \n\nzôÖma says that humanity is at a turning point, and we must build the necessary tools now to avoid finding ourselves in a real-life version of George Orwell’s 1984. “I aspire to participate modestly in a world that is fairer, more transparent, and where society doesn’t need a puppet in a suit to improve its living conditions or respond to local needs. Web3 is just a tool, and if it doesn't meet this real need, then for me, it will be a failure.”\n\n*Experiment with Teritori today and test its Social Feed, which now includes Twitter-like functionality for posts, Medium-style articles, Soundcloud-inspired music, and videos—all based on Gno and IPFS and totally decentralized. You can also check out Teritori’s GnoModerationModule, which allows you to moderate a social network in a decentralized way. A faucet is available on the home page at [app.teritori.com](https://app.teritori.com/feed?network=gno-teritori).*\n","2024-01-11T00:00:00Z","christina","whoyougno,teritori,community,interview"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["bgl-poc2","Building Gno.land - Proof of Contribution II","\n\n*Disclaimer: The Building Gno.land series aims to share the core concepts of our platform, mission, and tech stack, providing a snapshot of a current state on our builder’s journey. New episodes may deprecate previous ones, but no editions will be modified at any time. We encourage you to follow along as we create the rails for a more transparent and accountable society, and we welcome feedback and contributions to the repo.*\n\n## II. Proof of Contribution vs Proof of Stake\n\nProof of Stake (PoS) is a robust consensus mechanism that provides a more environmentally friendly and scalable alternative to Proof of Work (PoW) and powers most of the web3 industry today. As PoS pioneers, Cosmos technology secures hundreds of blockchain projects and billions of dollars of digital assets, and Ethereum (launched as a PoW chain in 2015) made the historic switch to PoS in 2022. According to [ethereum.org](https://ethereum.org/en/developers/docs/consensus-mechanisms/pos), PoS is “more secure, less energy-intensive, and better for implementing new scaling solutions compared to the previous proof-of-work architecture.” However, as we briefly discussed in [*What Is Proof of Contribution?*](https://test3.gno.land/r/gnoland/blog:p/bgl-poc-1), PoS has vulnerabilities that can corrupt the network over time.\n\n### The Limitations of Proof of Stake (PoS)\n\nBeyond securing the network, the main goal of any consensus mechanism (PoW, PoS, DPoS, PoC, etc.) is to be as decentralized as possible and not reliant on any central actors. This can be measured by the Satoshi Score (or the Nakamoto coefficient), a quantitative measure that assesses a blockchain’s level of decentralization by calculating the minimum number of nodes needed to compromise a network or carry out a 51% attack. PoS systems can be bootstrapped within days (or even hours), starting off decentralized and achieving a high Satoshi Score.\n\nThe PoS chain Genesis allocates a default voting power to ~20-50 nodes, in general equally (or at least making sure that no single node has more than 5% of the voting power). This makes PoS chains decentralized enough (in theory) from block 0 with a near-perfect Satoshi score. However, in practice, PoS has two main issues. Because the system is dictated by money, PoS chains become imperfect over time. Anyone wealthy enough can stake their tokens progressively and use their accumulated power to sway decision-making on the chain—or take the network over completely.\n\nThe chain can limit the maximum voting power per validator node, but this is almost ineffective, as a malicious actor can carry out a Sybil attack on the network and create multiple validators to bypass the voting cap. Such an attack renders the max voting power per node useless and leaves the chain defenseless against a single organization or cartel gaining the majority of the voting power. PoS systems leave chains like Cosmos Hub and Ethereum at risk from such bad actors, cartels, and powerful protocols (such as Lido and Rocket Pool).\n\nWhile Proof of Contribution (PoC) can’t prevent Sybil attacks on standard user accounts (when malicious actors create multiple accounts with a single computer and transfer tokens within a few hours), it does make it almost impossible for validator nodes to suffer Sybil attacks. Since the community vets every person who is given voting power or sway in the network (including validator power) through the DAO, at no point can anyone \"spoof\" identities and gain major sway. \n\n### Where Proof of Contribution (PoC) Excels\n\nPoC is actually Proof of Authority (PoA) which, instead of offering up a resource like computing power or a financial stake, relies on validators staking their reputation. Anyone can join most public PoW and PoS networks without revealing their identity. However, by definition, PoA validators need to make themselves known and are selected based on their trustworthiness. This means PoA tends to work better when deployed in private or permissioned blockchains than in public platforms (because of this tendency toward centralization). \n\nPoC solves this problem, ensuring the network becomes increasingly decentralized over time by being governed by a decentralized entity, GovDAO. Like standard PoA chains, PoC chains launch with a handful of validators that must be identified and trusted by the network, meaning governance is centralized at the start, and the chain achieves a low Satoshi Score. The system is about contributing and earning contribution units, which are slow to gain and require human interaction. It takes months (or years) before there are enough actors in the DAO and sufficient voting power for the chain to be considered decentralized enough, according to the Nakamoto coefficient. \n\nPoC is thus slower to bootstrap than PoS and harder to achieve. You can think of PoC versus PoS as a marathon versus a sprint, whereby PoC starts slowly but then gains momentum over time, and PoS starts quickly but loses momentum over time (the graph below provides a visual representation of PoC versus PoS). \n\n[![Graph](https://gnolang.github.io/blog/2024-01-26_bgl-poc2/src/thumbs/graph-container.png)](https://gnolang.github.io/blog/2024-01-26_bgl-poc2/src/graph-container.png)\n\nThe GovDAO that owns the chain has a mandate to scale (to grow and decentralize) continuously as it adds more contributors. This means it becomes progressively larger over time, achieving high decentralization efficiency way beyond the initial fast sprint of PoS chains. Once established as a proven consensus mechanism and alternative to PoS, GovDAO can benefit from by any blockchain project (through an evolution of ICS) wanting to achieve decentralization and sustainability—PoC can secure Gno.land and the web3 industry at large.\n\n### Security-Conscious by Design\n\nAnother advantage of PoC is that because it’s reliant on human interactions, it is more Sybil-resistant by design. As discussed, it’s almost impossible to split a validator node into two (or more) nodes, making conducting a Sybil attack infinitely difficult. Since contribution units are not transferrable or exchangeable, PoC cannot suffer from whales attempting to purchase voting power quickly. If someone wanted to take over the network, they would need to invest years of their time making meaningful contributions. Their attack would be so slow that it would easily be prevented by humans monitoring the decentralization and adjusting the parameters. \n\nMoreover, GovDAO will activate and deactivate new validators on request, establish a KYC system for validators, and manage promotions of contributors with votes. This removes the possibility of a takeover happening overnight since the only way to gain validator or voting power is by voting on governance requests, which is slow and managed by humans. This is in contrast to PoS systems which are powerful and fully automated yet defenseless against such coordinated attacks.\n\nGno.land is built on the very premise that such an attack on a PoC network would never happen as it would be entirely counter-intuitive. Since contributions are not only about expertise but also alignment, it is our hypothesis that longstanding contributors who have invested years of time and brainpower in developing the chain will do their best to protect it rather than destroy it. The DAO system will endure thanks to the mix of expertise and alignment and the amount and frequency of contributions. \n\n### Concluding Thoughts\n\nBeyond separating voting power from net wealth, a core component of Proof of Contribution (PoC) is its focus on long-term sustainability. PoC makes the system fairer and more sustainable, ensuring participants are aligned and take actions that benefit the community and the broader ecosystem. PoC is slower to bootstrap and harder to achieve than PoS but focuses on long-term alignment and security. \n\nUnlike PoS, contributors receive rewards based on their contribution effort rather than how many tokens they stake. They are thus incentivized and recognized for the quality of their work, ideas, and alignment, driving participation and active engagement. Governance is allocated to the people most likely to care for the ecosystem’s long-term success—the contributors who have spent the most time working toward it.\n\n*II. Proof of Contribution vs Proof of Stake is the second in a [series of articles](/r/gnoland/blog:p/bgl-poc1) to dive deeply into the philosophy, vision, mechanics, and work involved in developing a new consensus mechanism for the next generation of smart contract systems. Look out for subsequent editions and additional Building Gno.land series, and let us know what you think! Got questions? Join the Gno.land [Discord](https://discord.com/invite/S8nKUqwkPn) or follow us on [Twitter/X](https://x.com/_gnoland)*\n\n\n","2024-01-26T13:37:00Z","christina","gnoland,gnovm,tm2,PoC"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["funding-program-23q4","Gno.land Funding and Grants Program - Quarterly Report: Q4 2023","\n\nThe Gno.land Funding and Grants program identifies talented and passionate developers, researchers, and tinkerers to interact with Gno.land, enhance the platform's usability, and help build the core infrastructure and tooling needed for mainnet. After a strong start in Q3 2023 from our grantees, we awarded four additional grants in Q4. Let’s take a look at their progress and what’s coming up in Q1 2024.\n\n## Q4 Funding Breakdown\n\nThe total amount paid out in Q4 for grants was just under $317,000, spread out over the four grants: Teritori, Berty, Onbloc, and Dragos (Flippando). This work was split over essential stress-testing, debugging, and development on Gno core, and building social, gaming, and project management dApps to extend the platform’s functionality. Each grant recipient received milestones for deliverables and tracked their progress through regular public and internal syncs, hackerspace journey updates, blog posts, documentation, and developer calls.\n\n[![Q4 Chart](https://gnolang.github.io/blog/2024-02-07_funding-program-23q4/src/thumbs/chart.png)](https://gnolang.github.io/blog/2024-02-07_funding-program-23q4/src/chart.png)\n\n## Berty Technologies (delivery May 2024)\n\nAfter successfully meeting their deliverables in Q3 and creating Gno Native Kit (formerly [GnoMobile](https://test3.gno.land/r/gnoland/blog:p/gnomobile)), Berty was awarded a second grant in Q4 to experiment with smart contract integrations around social media. Through the development of GnoSocial, the team has created a test bed for building decentralized social media-style apps and helped to stress test technical issues in Gno.land. \n\nIn Q4, Berty delivered V1 of GnoSocial, which includes basic Twitter-like functionality. GnoSocial will be implemented on mobile using the Gno Native Kit framework, with a minimal desktop app and a read-only web version also in the scope. Aside from this work, Berty contributes to Gno core development, helping raise issues and merge PRs. You can follow their progress in hackerspace [issue 51](https://github.com/gnolang/hackerspace/issues/51).\n\n## Teritori (delivery February 2024)\n\nAfter delivering the [moderation module](https://test3.gno.land/r/gnoland/blog:p/gnoland-moderation-dao-module) in Q3, Teritori received a second grant to carry out research and implement a conflict resolution module and an on-chain project management tool. Their work also continues on the escrow module build. As an active contributor, the Teritori team helps improve Gno core as well, getting more PRs merged, participating in regular meetings, and writing documentation. Read more about Teritori in their hackerspace [issue 7](https://github.com/gnolang/hackerspace/issues/7).\n\n## Dragos (Flippando, delivered January 2024)\n\nTo experiment with gaming in Gno.land, Dragos received a grant to port his on-chain memory game Flippando from Solidity. Flippando is a simple memory game—with a twist. Players uncover tiles and must find their matches to win the game. The result can be minted as an NFT and assembled to create larger, more complex NFTs and digital “paintings.” The beta version of [Flippando](https://gno.flippando.xyz/flip) is now live on the testnet, and you can read about his experiences in developing the game on the [Gno.land blog here](https://test3.gno.land/r/gnoland/blog:p/porting-flippando-gno) or visit [hackerspace issue 33](https://github.com/gnolang/hackerspace/issues/33).\n\n## Onbloc (ongoing)\n\nAfter producing consistently awesome work and being our longest-standing contributor, Onbloc received a grant in Q4 2024 to continue iterating on Gno.land tooling, Adena, and to help build Gno.land core in preparation for mainnet release. Part of the scope was to support contract-to-contract interaction [issue 757](https://github.com/gnolang/gno/issues/757), lead a [multi-node testnet initiative](https://github.com/gnolang/hackerspace/tree/main/multinode-testnet), write pure Gno packages, and help debugging the GnoVM, among many other initiatives. Onbloc is also adding additional security to the Adena wallet and an “Airgap” feature, which you can read more about in [hackerspace issue 29](https://github.com/gnolang/hackerspace/issues/29). We’ll also release a detailed blog post soon, so stay tuned.\n\n## Coming Up in Q1 2024\n\nWe’re looking forward to more exciting developments in the coming year as we focus on the road to mainnet. In Q1, grantees will mainly focus on debugging Gno core, developing smart contracts and libraries, building and porting dApps to Gno.land, and creating educational materials to help grow the community.\n\nBlockchain software and virtual reality technologies firm Varmeta are under evaluation for a grant to support account sessions and build the Gno.land Unity SDK to make blockchain more accessible to game developers (you can track their progress in [hackerspace issue 43](https://github.com/gnolang/hackerspace/issues/43)). We’re also finalizing a grant for a DAO tinkerer and a research report, as well as evaluating the extension of a second grant to Dragos to port his popular project management app to Gno.land. \n\n\n*We’re steadily building out the Gno.land platform and our ecosystem of grantees and contributors. Let us know if you want to join us by submitting an application at any time on the [Funding and Grants repository](https://github.com/gnolang/ecosystem-fund-grants). We’re always on the lookout for ideas to advance the platform.*\n\n\n","2024-02-07T13:37:00Z","christina,michelle","gnoland,funding,grants"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["wyg-dragos","Who You Gno – On the Record with Dragos Roua","\n\nDragos Roua is a humble man. If you had the chance to read his article, [*5 Things I Learned While Porting Flippando From Solidity to Gno*](https://test3.gno.land/r/gnoland/blog:p/porting-flippando-gno), you’d have seen him refer to Flippando as his “tiny little game” and describe his “surprise,” over it winning the Polygon track of the Glitch hackathon, two subsequent hackathons in South Korea, and piquing the interest of the Gno.land team to offer him a grant. If ever there were an inverse of “the empty vessel makes the loudest sound,” Dragos would be it.\n\nAt 54 years old, he’s lived an extraordinary life. Growing up in communist Romania, where scarcity was in abundance, and “everything was in short supply,” Dragos and his peers were “only allowed to learn one coding language,” and it happened to be called “Whatever.” So, when anyone asks in what languages he knows how to code, he always jokes that Romanians can code in “whatever.” Joking apart, his language skills are impressive, to say the least. \n\n## Dragos Knows a Lot of Code\n\n“My first production-level code was written in Cobol on punch cards,” he says when he was just 16. He went on to learn Smalltalk, Lua, and “just for fun,” even a programming language called “Brainfuck.” He spent many years programming in web2, iOS, and Andriod, but over the last seven years (since entering the web3 space), has been consistently working in JavaScript, Swift, Solidity (which he learned by creating Flippando), Python, and Go. Despite this, Dragos confesses he still feels more at home within the Apple ecosystem. “I've been building a lot there,” he says. \n\n## He Speaks Many Languages\nI ask if learning programming languages is similar to spoken languages. “Every programming language has vocabulary and grammar, which is a specific set of rules over that vocabulary, so it’s similar in that sense,” he says. And how many spoken languages does he know? “I can speak five Indo-European languages” (Romanian, English, French, Spanish, and Portuguese). “Five?” I gulp, wide-eyed, suddenly feeling inadequate for only speaking three. “Well, they all share about 70% of the vocabulary, and the grammar has almost the same rule set,” he shrugs, minimizing his accomplishment.\n\nHe’s also learning two Asian languages with varying degrees of success. Korean, a language he understands “some 40%” of, Dragos admits, is a different ballgame. “I've been frustrated for nine months, every day trying to plug away because there's literally no similarity in vocabulary between any Indo-European language and Korean. Literally no word is the same, and the grammar is also very, very different.” He explains that learning a language like Korean means starting from zero and waiting for the brain to forge the neural paths. “It's quite difficult to do,” he concedes.\n\n## A ‘Location-Independent’ Lifestyle \nI check out the backdrop behind him. He’s taking the interview from an elegant cafe in downtown Saigon with impressive dark wooden walls, large ceiling fans circling above, and a rich colonial atmosphere. “It’s such a posh place,” he smiles, “every day, there are groups of people taking pictures. It has an Indochina vibe.” I can’t help but wish I could teleport over and share a beer with Dragos as we discuss his remarkable life. “How long have you lived there?” I ask, “I don’t live in Saigon,” he replies, “I’m location-independent.”\n\nAs I wonder if that’s a more elegant term for “digital nomad,” Dragos quickly explains the difference. Digital nomads typically have no fixed abode, he says, and tend to set up a base for a short period of time before moving on to the next place. Location-independent is someone who has a base but is independent of it and chooses to spend longer periods of time in various places. “So I became a loner,” he says, “and I’ve been location-independent for six years. I spent my first two and a half years in Spain, then from Spain, I moved to Portugal, which is my base right now, and I started to explore Asia last year.”\n\n## A Love of the Open Road\nI point out how amazing his lifestyle sounds—and also how challenging it must be at times. Dragos loves the freedom that comes with being alone in a foreign land and the master of his destiny. He also thrives on learning from different people and cultures and discovering more about himself. “The more you travel, the more you learn. Where can you stay? Where can’t you stay? What is needed? You learn the logistics, and you become a much better administrator and manager of your life.”\n\nHe admits to feeling lonely at times. Being location-independent isn’t for everyone, and certainly not if you don’t like being alone. “It's very difficult to be on the road because you don't have many friends. You don't have a fixed social circle. I'm in a place right now where I'm quite comfortable with myself. I can spend long periods of time on my own without needing close encounters. I have a very limited circle of friends, which I keep in touch with every month or so.”\n\nThe cultural differences between Europe and Asia are something of a double-edged sword as well. Dragos likes Vietnam, where the people are friendly and welcoming and talk to him on the street out of curiosity or to practice their English. But he’s felt like quite an outsider in South Korea, where the culture of politeness and restraint makes it harder to establish meaningful friendships. \n\n## Astrology, AI, and Other Mind-Blowing Stuff\nTalking about human connections inevitably leads to the increasing lack of them—and the topic of AI. I ask how he feels about the prospect of AGI and a potential replacement species. He shrugs and points out that most of what we hear about AI is marketing. He thinks that LLMs (Large Language Models) will hit a wall when they run out of good data to be trained on. He is a little concerned about the prospect of election rigging and AGI being harnessed in the political sphere by nation-states attempting to outmaneuver each other by predicting the next plausible move. “But this is a can of worms,” he says.\n\n“Actually, at the most fundamental level, there is no difference between AI and the process by which we generate ChatGPT or any other language model, and… hold your breath,” he pauses, “astrology. They both take a set of arbitrary features and a set of desired outcomes. After that, they just do a lot of computation, by trying to minimize a cost function between the predicted and expected outcome. That's all there is to it. You take features, add some parameters, trillions of parameters, you run a lot of computation, and in the end, you have the most plausible outcome. LLMs do this in hours/days/weeks of training, astrology did it slowly, over the course of a few thousand years.” \nI ask Dragos if he hadn’t been a programmer, would he have perhaps become an astrologer instead? “I actually studied astrology and used it for 18 years,” he replies.\n\nI try hard not to fall off my chair. Dragos explains that astrology plays a huge role in his life, and he consults it before making any major decision—such as moving countries or leaving jobs. “I consult it on every major decision and even daily life. So wherever I have to, I use it. When I sold one of my companies, when I decided to move abroad, when I travel, and stuff like that.” He gives the analogy of meteorology and says if he knows it’s going to rain, he’ll take an umbrella to have less friction and move around more easily. In the same way, he applies astrology to his life. This man is a Pandora’s box.\n\nWhat else does he do in his spare time besides traveling the world, consulting the Cosmos, and writing code for fun? Dragos likes playing pool, socializing, dining out, and dancing. “I was a tango dancer back in Romania. I had a tango school for a year.” At this point, I’m hardly surprised. \n\n## Dragos on Gno.land \nI met Dragos last year in Seoul at a Gno.land event hosted with Onbloc during BUIDL Asia. That’s when he spoke to Manfred about Flippando and subsequently applied for a grant. We were still building the specs for the Grants Program at the time, and Dragos was our first grantee. Since then, he’s embarked on a whole new journey learning Gno and building the airplane as it flies, delivering Flippando last month and regularly helping the team with Gno.land core issues.\n\nDragos has since submitted a second grant proposal to port his project management app to Gno. “It uses my life management framework, which I call “assess, decide, do.” The name of the project is *ZenTasktic*. There is already an app on iOS that I wrote,” he explains. You can read more about his grant proposal [here](https://github.com/gnolang/ecosystem-fund-grants/pull/11) and be sure to test out [Flippando](https://gno.flippando.xyz/flip) today.\n\nI apologize for taking so much of Dragos’ time, but he assures me it isn’t a problem. “I don’t work today, I'm not busy. I'm just enjoying my afternoon in this coffee shop.” As Dragos sips on the local tipple and drinks in the sights and sounds around him, I can’t help but admire his outlook on life and the choices he’s made—and I look forward to seeing what he's up to next and what else he builds with Gno.\n","2024-02-08T00:00:00Z","christina","whoyougno,flippando,community,interview"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"OH/QMnvvs/fC0BD297haxSU1hqyUsk4YLVHG6umwbw1UoFrV0xnl0v5UsVa2x51vbdwC//gv2qGUDIPAaf/eNQ=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["gor-phase1","All You Need to Know About Game of Realms: Phase One","\n\nGame of Realms, the worldwide competition to find the best contributors to Gno.land, is currently underway. Unlike some contests you may have entered, we're doing things a little differently. We want participants to be instrumental in building the Gno.land platform with meaningful contributions that help shape the direction of the project – either by writing the best Gnolang smart contracts or contributing to the core blockchain. It’s not just about winning prizes but becoming a meaningful contributor. We encourage participants to collaborate on the challenges – your contribution will be rewarded on individual merit.\n\n## Phase One: The Basics\n\nPhase one of Game of Realms is about laying the foundations to onboard more people to the platform. You’ll need to be an advanced developer who wants to create core materials that power the platform every day. You should also be willing to document your work and even write tutorials and guides that help us advance to the second phase of the competition.\n\nThere is a total prize pool of 133,700 ATOM available during the Game of Realms competition, one-third of which (44,121 ATOM) will be allocated to contributions from phase one. During phase one, which we expect to last between 1-3 months, participants will open PRs against repos from the Gnolang organization. For additional information on the competition phases and timelines, be sure to check out the following resources:\n\n- [Game of Realms blog post](https://test3.gno.land/r/gnoland/blog:p/gor-launch)\n- [Game of Realms AMA recap](https://test3.gno.land/r/gnoland/blog:p/gor-ama1)\n\n## Phase One: The Challenges\n\n**Evaluation DAO**: To ensure contributions in Game of Realms are rewarded fairly, we need an Evaluation DAO. Allowing community members to vote on the best contributions and decide how much they are worth provides a level playing field for all. We’re therefore seeking your skills in DAO development and implementation. This is one of the most important challenges of phase one and the only challenge that must be approved unilaterally by the core team because of its key role in the competition and the future of the platform. Read more about the [Evaluation DAO challenge on GitHub here](https://github.com/gnolang/gno/issues/407).\n\n**Tutorials \u0026 Documentation**: So that we can progress to phase two and open up the Gno.land platform to a broader audience, we need written and recorded tutorials, guides, and documentation from phase one participants. There are almost no instruction manuals when it comes to this new frontier as the only smart contract platform using the Gnolang programming language. Help us to create materials that will onboard more contributors to Gno.land. Read more about the [Tutorials \u0026 Documentation challenge on GitHub here](https://github.com/gnolang/gno/issues/408).\n\n**Governance Module**: We want Gno.land to adopt the fairest and most effective governance solution possible; one that encourages voter participation and is transparent and accountable. We’re looking for contributors to define and implement a governance contract suite that rivals existing ones, such as the Cosmos Hub, and be implemented by other projects. Can you improve on that? Show us how! Read more about the [Governance Module challenge on GitHub Here](https://github.com/gnolang/gno/issues/409).\n\nAll phase one challenges will stay open during phase two. No competition points will be attributed during this phase as the points will be retro-funded by the Evaluation DAO and awarded during phase two.\n\n## Judging Criteria - What Wins Points?\n\nWhat will the judges be looking for when assessing contributions? You can find individual details on the corresponding GitHub issue regarding each challenge, but to get you started, the Game of Realms contest prioritizes communication and collaboration. We encourage participants to work together to find the best solutions. You will be awarded individually for your contribution but working as part of a team is highly valued. Good documentation that expresses high learning efficiency and shows how the task was completed in an educational way will also win additional points, as will a high standard of quality, great UX, and the ability to follow the contribution guidelines.\n\nAs this is primarily a developer-oriented competition, most of the organization for Game of Realms is happening on GitHub; come by the repo and [visit issue #408](https://github.com/gnolang/gno/issues/408) to contribute to tutorial and documentation writing for Gno.land.\n\n## Rules of Engagement\n\nAll participants must keep in mind a strict code of conduct and specific rules and criteria to ensure fair play. Throughout the Game of Realms competition, no plagiarism will be tolerated at any time. Participants may submit what they wish, however, any project that has already been allocated rewards or received compensation in any other hackathon or similar contest will not receive double pay.\n\nThat’s all for now. If you have more questions about Game of Realms or Gno.land you can join us in our next Office Hours session on Tuesday, March 14, 2023, at 4 pm UTC. You can also connect with other participants in the [Gnoland Discord](https://discord.com/invite/S8nKUqwkPn).\n\n## Game of Realms Phase 1: FAQ\n\nBelow are some frequently asked questions about phase one of the Game of Realms competition. If you can’t find your answer below, jump into our Discord and ask, or join us for a live “Office Hours” session with the core team.\n\n### Q. How are the tasks in the issues assigned?\n\nA. There are official communication challenges that we encourage participants to use.\n\n### Q. Can I work individually or should I work as part of a team?\n\nA. You are free to work in stealth mode, but please keep in mind that you risk finishing too late or losing points for being bad at collaborating. We expect the issues in phase 1 to be done by multiple people, in multiple steps. But anyone can try to make everything in stealth mode and open a PR with everything.\n\n### Q. How can I find collaborators?\n\nA. Participate on the issue or in Discord by indicating your desire to participate, by sharing your ideas, reviewing others' work, giving feedback, clarifying, or whatever makes sense.\n\n### Q. How can I ensure good collaboration?\n\nA. Since we are fully remote, collaborating can be a challenge and the best collaborators will be rewarded. We don't know each other, so having good communication is key.\n\n### Q. How will my collaboration be evaluated?\n\nA. At the end of a big task, i.e. the Evaluation DAO is finished, the core team will take all the small contributions and identify contributors, and then suggest how to split the task prize. We'll propose the split and allow room for public negotiations.\n\n### Q. How much is the prize pool?\n\nA. There is a total prize pool of **133,700 ATOM** available during the Game of Realms competition, one-third of which (**44,121 ATOM**) will be allocated to contributions from phase one.\n\n### Q. When will I receive my rewards for my collaboration?\n\nA. Rewards will be allocated retroactively by the Evaluation DAO during phase 2.\n\n### Q. Will there be a leaderboard and place where we can submit evidence for tasks?\n\nA. Not yet. The leaderboard will come in phase 2.\n\n### Q. What will the overall tasks consist of?\n\nA. Here is a non-exhaustive list:\n\n* Onboard more contributors (create tutorials and documentation)\n* Improve the project and implement more things\n* Bootstrap our genesis of contributors for the future mainnet\n* Experiment with Proof of Contribution by having a simpler system: Evaluation DAO\n* Identify the best participants to propose jobs\n* Identify the best organizations to propose partnerships\n\n### Q. Are there tasks for non-programmers?\n\nA. There are more tasks for programmers, but multiple parts are for non-programmers too. During phase 1, the tasks are relatively well defined, please read this:\n\nhttps://github.com/gnolang/gno/issues/390\nhttps://github.com/gnolang/gno/issues/540\n\n### Q. What are the requirements to start participating?\n\nA. There is no requirement to start participating. You’ll need to do some KYC at the end of the competition to receive a prize. Feel free to fill out the form linked in the Register section of the following issue:\n\nhttps://github.com/gnolang/gno/issues/390\n\nThis will allow us to contact you about the competition through our newsletter and set up prize payment later. Use the comment section of the issues or discuss them on Discord if you plan to work on specific tasks, so we can see that you’re actively working on a topic.\n\n### Q. Is there a fixed period of time for phase 1?\n\nA. No. Phase 1 will be finished when we consider that enough materials have been implemented to switch to phase 2.\n\n### Q. Is it possible to install a local testnet to get a proper local development environment?\n\nA. You can find the answer in this GitHub issue. Subscribe to the issue to get updates:\n\nhttps://github.com/gnolang/gno/issues/478\n\n### Q. Will there be a list of what needs to be tested? When will the tests start?\n\nA. The best place to look is on GitHub here:\n\nhttps://github.com/gnolang/gno/issues/390\n\nDuring phase 1, there are 3 official focuses:\n\n* Evaluation DAO\n* Tutorials\n* Governance Module\n\nThe competition was just announced, but we’ll review contributions made in the past, too, so it starts from the first commit, ~1-2 years ago.\n","2023-03-12T14:02:00Z","","gnoland,game-of-realms,faq"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"wPL/CwHEHi6rZtQz+NmrpeiiSbOnHOKVVVjFN22SygF4QMKATtv+eY1ZbSjZYrSef5gq4z70vnWw5AGLyUsaSw=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-1","The More You Gno: Gno.land Monthly Updates","\n\nWe made progress across the board at Gno.land last month, from onboarding more devs to receiving an influx of contributions to the Game of Realms contest. To encourage development and discourse, we set up a biweekly public developer call in addition to our biweekly Office Hours sessions. Anyone can join, ask questions, and give their suggestions on how to shape the Gno.land platform and become a contributor. Last month, we covered several pressing topics from Gno IDE and Gno.land website language, to GnoVM, IBC, and ICS. Jae also came back to the circuit in March with two IRL workshops for devs at side events during EthDenver and Game Developer Conference (GDC) in San Francisco.\n\n## Developer Updates\n\nYou can find the live streams of the new biweekly public developer calls on [Gno.land YouTube](https://www.youtube.com/@_gnoland/videos) as well as access the agendas on [GitHub](https://github.com/gnolang/meetings/blob/main/notes/2023_03_15_dev_call_notes.md). The main talking points this month were Gno IDE, Gno.land website language and UX, garbage collection, bug fixes, and how to bring IBC and ICS to the platform. We are working on all these issues concurrently but the order of release will be Gno.land mainnet, IBC, and then ICS (this is reflected in the DAG below).\n\n[![Gno.land mini DAG](https://gnolang.github.io/blog/2023-04-15_myg-march/src/thumbs/mini-dag.png)](https://gnolang.github.io/blog/2023-04-15_myg-march/src/mini-dag.png)\n\n## Gno.land Website Language\n\nWe want to add more features for developers, such as libraries to make writing interfaces better and more consistent. There is an open topic for frontend developers with typography skills and library developers to create a UI framework for markdown or a custom rendering system.\n\nInternally, our core team is working on improvements to Gno.land’s website, making it easier to navigate with shorter columns while ensuring the text is markdown centric and readable in plain text and the GitHub rendering machine. We hope to achieve this using CSS and having classes for vertical columns, without having to make an extension to the markdown parser.\n\n## Gno IDE\n\nGno.land developer experience team is working on a web-based Gno IDE for quickly building Gno realms and packages right on your browser by just visiting a web app. Gno IDE will provide much improved UX for everything around building a realm (including making the testing easier), and additional features like autocompletion in the editor. Gno IDE will contain all the features you would expect from an IDE as well as valuable APIs for devs building tools around Gno.land with the public Gno Infrastructure.\n\n[![Gno IDE](https://gnolang.github.io/blog/2023-04-15_myg-march/src/thumbs/gno-ide.png)](https://gnolang.github.io/blog/2023-04-15_myg-march/src/gno-ide.png)\n\nGno IDE will have multiple modes to support different use cases. The normal mode will be used during everyday developments (as you’re familiar with from other code editors). The presentation mode is for high accessibility and readability. You can use it during video calls or physical workshops while projecting your screen to an audience. The third and perhaps most interesting mode is the embedded mode. Use this mode to embed the IDE into websites and blogs. This feature is especially useful for tutorials to test out sample code, run it on the real testnets, and play with it.\n\n## IBC and ICS\n\nAs depicted in the DAG above, Gno.land mainnet will launch first, followed by IBC and then ICS. We will focus on implementing IBC1, as we strongly believe in the ICS model and want to be a consumer of an existing Cosmos chain. We want a common ICS implementation that works across many hubs because Gno.land is a type of hub that will need its own ICS to scale while providing GnoVM on consumer chains on the Cosmos Hub. Our next step now is to find the best way to configure ICS for Gno.land and make GnoVM available as a consumer chain in the Cosmos Hub system.\n\nRegarding IBC, we will use the current implementation that was written for the Cosmos SDK and port that over to Tendermint2. We anticipate some issues along the way including security patches that need to be applied to our code base. There are multiple ongoing directions and discussions about how to bridge Gno.land’s smart contracts to IBC, which are essentially Interchain smart contract interactions.\n\nOne possibility is to have an API that submits events to a queue of outgoing events, and another queue to receive and consume events asynchronously. This mechanism could work for IBC2 to have rich inter-contract Interchain features, and the same API could work for Interchain plus smart contract interactions that require advanced options. We discussed a proposal to create a standard for Interchain contracts so that IBC2 could eventually be standardized eliminating limitations by applying it with an EVM, other languages, and CosmWasm.\n\nThis protocol could be based on Protobuf or a similar well-known syntax definition protocol so that we can push the Interchain to the next level. IBC2 will be safe and fast and replace vulnerable atomic bridges between multiple technologies. This is a major update that we are committed to developing and we need help identifying all the challenges involved. Working on IBC integration, separate from the Gno.land mainnet launch, will require significant time to understand how the light client system works. If you’re interested in taking on this task, let us know and we’ll set up a group. IBC will likely be the most important challenge of Game of Realms phase 2.\n\n## Garbage Collection\n\nCurrently, our work on garbage collection does not address the problem in the traditional Golang sense of dealing with memory efficiency. Instead, we are progressively optimizing and improving the main state tree by automating the clean-up of orphan nodes. The next phase will be targeting the official garbage collector component to begin work on memory management as we have some common Golang garbage collection challenges, but are identifying some uncommon ones too.\n\nWe need to consider elements like where to hold our objects because this is tied to releasing them in a concurrent lock-free way. We also need a good data structure. This is ongoing research as of now to implement a dedicated routine to synchronously clean stuff in a non-blocking way.\n\n## Game of Realms\n\nThis month, we have seen a massive uptick in contributions to Game of Realms phase one with a tidal wave of issues, general discussions, and PRs. One of the biggest things we worked on was adding support for MOD, which is a version of Go mod with an easier interface to manage your dependencies and version your dependencies. You can track the ongoing issue on GitHub [here](https://github.com/gnolang/gno/issues/390).\n\nThere have been some really strong contributions to the Evaluation DAO and governance module, as well as a big CLI refactor that went into our code base. We've also seen people contribute contracts like GRC 1155 or general improvements to existing realms, with many suggestions for fixing bugs. Finding bugs and reporting what people want is a good indication that the Gno.land platform is being picked up and gaining adoption.\n\nYou can find the Office Hours recordings that cover Game of Realms on YouTube [here](https://www.youtube.com/watch?v=JTmNg-b6Lcs).\n\n## Developer Events Stateside\n\nGno.land hosted a lively meetup during EthDenver last month where Gno.land founder and core dev Jae Kwon gave a talk for Solidity developers called “Gno.land, the Inevitable Next Generation Smart Contract Platform.\" He compared and contrasted Gno.land and Gnolang to Solidity, and showed Ethereum developers how the GnoVM shifts the smart contract paradigm. You can watch the [recording here](https://www.youtube.com/watch?v=IJ0xel8lr4c).\n\nAlso in March, Jae hosted a gaming workshop at a side event during the infamous Gaming Developer Conference (GDC) in San Francisco. “Gno.land for Game Developers, Building Your App in Web3,\" showed participants a sample gaming app built on the Gno.land platform and offered them the chance to try their hand at writing a smart contract for their app with Gno.\n\n## Virtual Events - How to Build a Forum\n\nCore tech lead at Gno.land Miloš Živković held a virtual workshop for Go devs called “How to Build a Forum.” He showed how Gnolang is a fast and simple way to build and launch smart contracts using the Gnolang interpreter virtual machine that interprets Gno and eliminates the need for any servers or ORNs.\n\nThe VM allows for the memory state of your Gno.land application to persist automatically after every transactional function call, which is a completely new way to handle transaction volume and memory recall. You can watch the [full tutorial here](https://github.com/gnolang/workshops).\n\n*We’d like the community to get involved in Gno.land’s monthly updates, so if you’re building on Gno.land and want to highlight your development, project, event, or idea, let us know and we’ll include your contribution.*\n","2023-04-15T13:37:00Z","christina","gnoland,gnovm,tm2"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"6yPkSIITVE7qGYZ7BwZ4WHk92JZ0glFy9aATWQIDudMAoZ/Lu2Te+JOTQOrKuL9qussNuQ5xXOg/gxh07wujag=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-2","The More You Gno: Gno.land Monthly Updates - 2","\n\nOver the past few weeks, our core devs and ecosystem contributors have been making massive strides on Gno.land. There’s a lot to cover in the second edition of *The More You Gno*, from updates on Tendermint2 and GnoVM to stack/frames management, Gno IDE, and plenty more. We’ll also see what some of the external teams contributing to the platform have been up to, including Gno.land’s first decentralized exchange, GnoSwap, and Adena compatibility with GRC20 tokens. Check it out.\n\n## Tendermint2\n\nWe’re making steady development progress on Tendermint2, which focuses on simplicity of design, minimal code, minimal dependencies, modular dependencies, and completeness. For the time being, Tendermint2 will stay in the main repo in a top-level folder named Tendermint2. This is the official location to develop and improve the consensus protocol until it is stable enough to be extracted from the Gno repo and become a standalone project. Currently, Tendermint2 depends on GnoVM, however, we are working to unlink this dependency and build a basic demo Tendermint2 chain and Client.\n\nTendermint2 JS/TS Client is a JavaScript/TypeScript client implementation for Tendermint2-based chains. The client will make it easier for developers to interact with Tendermint2 chains, with a simplified API for account and transaction management, removing a ton of manual work and allowing developers to focus on building their dApps. You can [read more about the client here](https://www.npmjs.com/package/@gnolang/tm2-js-client). In addition to the Tendermint2 JS/TS client, we also created a Gno JS/TS client that just extends the TM2 one to provide Gno-specific functionality. You can read more about this here.\n\n## Game of Realms\n\nThe incentivized competition to find the best contributors to Gno.land continues in phase one, with slow but steady progress being made. Nir1218 initiated an Evaluation DAO Kickoff discussion in [issue 792](https://github.com/gnolang/gno/pull/792) to initiate testing code for the key smart contract infrastructure that will power the Gno.land platform. We are also interviewing architects for the core team with experience in governance modules and creating new economies on-chain, and a new DevRel team member will be joining us soon to create awesome tutorials and documentation to advance Game of Realms further. Gno.land must be built by the community and we will not rush to push Game of Realms to the second phase until we have found quality contributors to complete the challenge tasks and become the platform’s first founding members.\n\n## Gno IDE\n\nOur core development team is working on a web-based IDE for Gno.land that will greatly improve the developer experience, allowing builders to quickly spin up Gno realms and packages right on their browsers just by visiting a web app. Currently named Gno IDE but with a rebranding on the horizon, this intuitive product focuses on ease of use and improved UX, and will include all the features you’d expect from an IDE, such as auto compilation in the editor, debugging, extensive testing capability, and powerful APIs like IntelliJ to supercharge your programming.\n\nGno IDE currently has multiple modes to support different use cases, including a normal mode for everyday programming, similar to a standard code editor, a presentation mode for video calls or screen sharing, and an embedded mode to extend functionality, allowing you to embed the IDE directly into websites and blogs. You can also choose to edit your code in Emacs or Vim and easily switch between steps, from previous to next, making creating your tutorials and blog posts more intuitive. Watch out for more to come on Gno IDE soon, and if you want to contribute by creating a plugin for your favorite editor, open a PR to win contribution points.\n\n## Stack/Frames Management\n\nThe stack/frames is an integral part of the virtual machine (VM) and the language. Stack/frames provide context for smart contract developers, enabling them to access useful information, such as the original caller, or to determine if a contract is being called through another one. The current implementation is limited in scope and relies on fixed positions in the stack which can lead to inconsistencies.\n\nThere is an ongoing [issue 683 open here](https://github.com/gnolang/gno/issues/683) and we have continued to work on enhancing stack/frames development over the last month. We’re adding a new function in the standard library std.PrevRealm (previously GetRealmCaller). Currently, we only have GetOrigCaller, which returns the user calling the first realm. This is not secure and we need a way to call the previous caller. This will allow a realm to handle GRC20 treasuries. See [issue 667](https://github.com/gnolang/gno/pull/667) and [issue 634](https://github.com/gnolang/gno/issues/634) for further details.\n\n## Dealing with Panics in Native Functions\n\nWe have devised a solution for dealing with panics in native functions, [see pull request 732](https://github.com/gnolang/gno/pull/732). Previously, when there was a panic in a native function, we could not recover it in Gno code. An example of this was the assert origin call, which panicked if the call was not a direct call from a transaction. Based on discussions with contributors, we’ve agreed that native functions should never panic, but if they panic, they panic with machined Gno panic. This gives us the choice in a native function to code a Gno panic, or, if it's a very bad panic, use Go panic so that we know the Gno code is unable to recover it.\n\n## Logic Upgrading\n\nMaking it possible to upgrade your logic is definitely out of scope for the first version of Gno.land, however, it’s an important issue that we have begun to discuss so that we can place certain restrictions on it, such as allowing upgrades when we consider them safe enough to be compatible with imports. Another idea is to work on creating workflows where migrations become something official. This way, we could define ways to migrate a contract completely in a single transaction at the chain level. Once everything is working and approved as the previous contract is parsed or archived, the new one gets the data. We will revisit this topic after the first version of Gno.land reaches the mainnet.\n\n## Garbage Collection\n\nIn terms of garbage collection, we don’t have memory leaks as such but we do have defacto memory leaks. By the VM having references to all objects, they won’t be released by Go’s underlying GC. We have some form of reference counting but it is only done at the end of a transaction. We have implemented a mark-and-sweep garbage collector and are working on the VM runtime to manage the objects and signal to the garbage collector to release them when they are no longer needed. This is done by adding the notion of a heap, which is managed by the garbage collector.\n\n## GnoVM\n\nDeveloping GnoVM is an ongoing task and we will likely need to fork the GnoVM to create different competing versions. GnoVM will be complete, limited in features, and serve as the only interpreter, an enduring reference point over time. Future versions of GnoVM will be designed to incorporate CosmWasm so that all Cosmos chains can have CosmWasm enabled and the VM can run directly on the browser and execute tasks on the browser without requiring to make an API call, making it faster. To do this, we can make a Gno compiler in WebAssembly without changing the code because Go supports WASM cross-compilation.\n\nWe plan on making a competing version of the original minimalist GnoVM, such as a Rust version with a JIT compiler using LLVM as a backend.\n\n## Ecosystem Updates\n\nSince our last update, the Gno.land community continues to expand with awesome teams and contributors building cool infrastructure and projects on the platform. Below, we take a look at the largest developments of the past few weeks and extend a special thanks to everyone helping us build Gno.land.\n\n## Teritori\n\nTeritori blockchain and multi-chain hub launched in November 2022, allowing IBC and non-IBC communities to connect, create groups, exchange tokens and NFTs, and launch new projects. Teritori’s idea for building on Gno.land is to create a multi-chain experience for users with a web portal, NFT marketplace, and social feed that will grow the community, and gradually integrate smart contracts and realms. This will promote Gno.land to more developers and showcase all the dApps being built through an easy-to-navigate dApp store. In the coming weeks, Teritori will work with the Onbloc team to integrate the Athena wallet into their portal as well as discuss ideas for promoting Game of Realms to new developers.\n\n## Onbloc\n\nOnbloc is one of the Gno.land ecosystem’s most active contributors, responsible for building the Adena wallet and the block explorer Gnoscan. The team has also been working on creating an official Gno SDK that will allow developers to interact with Gno.land more easily, and remove some of the current friction. Onbloc opened [issue 701](https://github.com/gnolang/gno/issues/701) on GitHub primarily for developers who either have their own web app or are building a JavaScript app and want to work with Gno in some way. Currently, developers need to do a lot of manual work, which Gno SDK will abstract away, improving the workflow and developer experience. If you have any ideas or feedback, please contribute to the aforementioned issue.\n\nIn another cool development, Onbloc has rolled out a new feature in Adena and Gnoscan to provide support for GRC20 tokens. To store and send tokens, you can open your Adena wallet, click on \"Manage Tokens”, navigate to the Custom Token page, and see which GRC20 tokens are available on Gno Testnet 3, searching by the symbol or path. To research on or discover tokens, head over to the Tokens page on Gnoscan for a full list of GRC20 tokens. You can click on any token on the list for detailed information, such as the total supply, owner, or other available functions built into the token. The Account Details page has also been updated to display all tokens owned by each address. You can help by checking out [issue 764](https://github.com/gnolang/gno/pull/764), which discusses adding bigint to support a wide range of numbers and encoding binary, and [issue 816](https://github.com/gnolang/gno/pull/816), which highlights a small bug the team runs into when coding.\n\nOnbloc has also created a new [token resource page on GitHub](http://github.com/onbloc/gnotokenresources) for anyone to share or upload resources associated with their Gno.land project. This will serve as a shared knowledge pool about any dApp on the platform. If you wanted to create a decentralized exchange, for example, you would need all the information about the tokens available on Gno.land, such as their images, symbols, descriptions, links to websites, etc. Now you can find this in one handy GitHub repository. If you’re a developer or builder who wants your logo or any other static data posted, be sure to submit a PR.\n\nAnd speaking of decentralized exchanges, Onbloc is also building Gnoswap, the first DEX to be powered by Gno.land, designed to simplify the concentrated liquidity experience and increase capital efficiency for traders. Its interface is built using TypeScript to be user-friendly, secure, and accessible for streamlining complex mechanisms such as price range configurations and staking as part of its core service. Contribute to its interface [here](https://github.com/gnoswap-labs/gnoswap-interface).\n\nAs for the contract side, Onbloc is actively working on its development with help from the core members of Gno.land. The code will be open-sourced for full transparency once the basic functions are ready.\n\n## New Core Contributors\n\nWe’re excited to welcome two new core team members, Antonio and Zack. Antonio joined us in April in the core team, bringing with him vast experience in IPFS, and writing Git servers in Go. Zack is our first “tinkerer in residence” and will try to bootstrap the ecosystem of small contracts and small libraries. He will also be writing apps and helping us design a system to better share and showcase our work with a super UX for team builders and open-source addicts.\n\nAntonio is already hard at work researching a benchmarking dashboard that will show performance improvements or regressions when we change the code. He’s assessing whether to use GiHub to track actions or run our own machine to execute GitHub actions. Take a peek at his research so far on [issue 783 here](https://github.com/gnolang/gno/pull/783).\n\nZack is working on a microblog project. As an experienced web2 Go programmer, Zack is transitioning to web3. Since he’s interested in incentivized social networks, the microblog project will be his first realm, as a Twitter-style blog without titles, where each user has their own page based on their address. Check out [issue 391](https://github.com/gnolang/gno/pull/391) for more details.\n\n## Developer Events\n\nOver the past few weeks, our core devs have been mainly focused on building but they’re preparing to speak at some exciting events in the coming months. Catch up with Manfred at BUIDL Asia, in Seoul, South Korea, from June 5 - 9. We’re co-hosting a side event with Onbloc, Code States, and Cosmostation on June 5, so be sure to register if you’re in town! We’ll also be at EthBelgrade in Serbia from June 2 - 4, and GopherCon in Berlin from June 26 - 29, so stop by and say hello.\n\n*Do you want to contribute to Gno.land’s monthly updates? If you’re building on Gno.land and want to highlight your development, project, event, or idea, let us know and we’ll include your contribution.*\n","2023-05-26T13:37:00Z","christina","gnoland,gnovm,tm2"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"g5eyfl99iwFPe7IsMDV0wQJ0Jazw2JiXFRMoWGOmx0Ig3rjYkyLlyXzHhzbMFpnhiQBg0rF5rmVIPdegKZZnRQ=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["funding-program","Announcing the Gno.land Funding and Grants Program","\n\nIf you’re interested in building in Gno.land and using the Gnolang (Gno) language to make a meaningful contribution, we’ve launched the Gno.land Funding and Grants Program to support you on your journey. If you’re a developer, tinkerer, researcher, or educator and you’re excited by the idea of creating innovative dApps, tooling, infrastructure, products, or smart contract libraries on Gno.land, now you can apply for funding.\n\n## About the Gnoland Funding and Grants Program\n\nWe’re building Gno.land to endure with timeless code that will serve as a reference point for many years to come. Secured by a novel consensus mechanism, Proof of Contribution, Gno.land rewards contributors fairly, addressing one of the blockchain industry’s biggest problems. The developers that are most active on the platform with the highest quality contributions will secure the most rewards. We already have a growing community of Gnomes innovating and building on Gno.land and we’re looking to add more contributors to extend the usability of the platform and its smart contract library.\n\nOur grants program will encourage further participation by allocating financial awards and contributions to individuals and teams who want to build dApps, core infrastructure, products, or features on Gno.land, incentivizing more like-minded Gnomes to test the Proof of Contribution mechanism and push the chain to new limits. The grant amount and duration will depend on the scope and ambition of the project as well as the work involved.\n\n## Types of Contributors\n\nThe Gno.land Funding and Grants program is divided into four different categories – tinkerer, builder, researcher, and educator – to ensure that we cater to a diverse range of people and working preferences. Here’s how we define these categories:\n\n- Tinkerer: You want to experiment and invent\n - Build dApps, improve features, and find and develop new ideas\n- Builder: You have an idea and are ready to build it\n - Build dApps, infrastructure, tooling, products, or port your existing apps to Gno\n- Researcher: You want to discover and analyze\n - Deep dive into topics linked to the Gno.land universe\n\n## What We Are Looking For\n\nTo qualify for a Gno.land grant, we’re looking for motivated and passionate people who can contribute by developing dApps, core infrastructure, useful and innovative products, or features that improve the usability of the Gno.land chain, specifically:\n\n- Decentralized Applications (dApps)\n - What types of dApps do you want to see on Gno.land? Show us.\n - Build, test, and launch a suite of Gno.land dApps for the community, focusing on diverse use cases and industries such as DeFi, gaming, supply chain management, and social media. Ensure that these apps cater to both individual users and businesses\n - These dApps should integrate seamlessly with existing Gno.land infrastructure, encourage user interaction, and promote the adoption of Gno.land services\n- Infrastructure, DevX, Quality\n - Develop comprehensive GitHub and AWS integration for Gno.land, including streamlined deployment processes, continuous integration and delivery pipelines, and monitoring tools\n - Create Helm charts for easy deployment and management of Gno clusters, enabling users to quickly set up and scale their Gno infrastructure\n - Design and implement an event system for Gno.land contracts, allowing for real-time monitoring, analysis, and auditing of contract-related events\n - Enhance Gno.land security by conducting regular vulnerability assessments, penetration testing, and implementing best practices for secure smart contract development\n- Products\n - Develop advanced project management software tailored to the needs of Gno.land developers and teams, with features such as task tracking, collaboration tools, and integrated Gno.land services\n - Create comprehensive documentation, including guides, tutorials, and API references, to help users understand and utilize Gno.land's features and services more effectively\n - Design a censorship-resistant smart contract system, enabling secure and transparent transactions and interactions on the Gno.land platform, free from external interference\n- Interoperability \u0026 Integration\n - Implement cross-chain compatibility and interoperability, allowing Gno.land to connect and interact with other blockchain networks, expanding its potential user base and increasing its overall reach\n - Develop a powerful integrated development environment (IDE) specifically for Gno.land developers, with features like code completion, debugging tools, and seamless integration with Gno.land services\n - Design and launch a user-friendly wallet for Gno tokens, featuring a secure and intuitive interface, support for multiple devices, and easy integration with Gno.land dApps\n\nThe above guidelines are by no means exhaustive and are intended to spark your imagination and give examples of the types of contributions we’re looking for in Gno.land. We’re open-minded and willing to assess all grant proposals, so if you have an idea that’s not on the list or a suggestion that you think will benefit our vibrant community, let us know. If your submission doesn’t qualify for a grant, we’ll do our best to provide you with open and honest feedback and points for improvement, as well as identify any opportunities to get involved in our ongoing incentivized Game of Realms competition.\n\n## Meet Our First Grantees\n\n### Onbloc\n\nOnbloc is a blockchain software company building core infrastructure for Gno.land and\n\nhelping other dApp developers onboard to the Gno.land ecosystem seamlessly. The team has developed the Gno.land Developer Portal, which provides comprehensive introductory docs for developers, the Adena web3 wallet for Gno.land, and the Gnoscan block explorer. As Gno.land’s most active contributor, Onbloc is leading many community-driven initiatives and we’re excited to extend a grant to this passionate South Korea-based development team to continue their incredible work developing the wallet further, iterating the Gnoscan block explorer, and building Gno.land’s first DEX, Gnoswap.\n\nIn addition to this, we want to encourage Onbloc to continue their amazing work with the community, contributing to meetings, replying to comments on our social platforms, writing code base, organizing local events and meet-ups in South Korea, and creating products that expand the Gno.land ecosystem.\n\n*“Onbloc is thrilled to be a part of the Gno.land Grants Program. As one of the earliest contributors, our endeavors have involved releasing technical guides and research reports, developing infrastructure tools for dApps, creating DeFi smart contracts, and more. We are excited to leverage this grant to further enhance the quality of our products and strengthen our workforce. The grant will enable us to cover some of the existing expenses and hire additional developers to focus on smart contracts and the core side of GnoVM. We expect these endeavors to push the Gno.land blockchain to new limits and accelerate the achievement of the milestones on our roadmap. With the support from the Gnoland team, we are confident in our ability to make significant strides and further contributions to foster the growth of the Gnoland ecosystem.”*\n\n*Dongwon Shin, CEO, Onbloc*\n\n### Teritori\n\nTeritori is a super-dApp project allowing individuals and organizations to interact, organize, and communicate in a radically resilient and decentralized way. Based on an interoperable vision, the application is built on a multi-chain experience approach, gradually integrating Gnolang as the fundamental technical brick of the system. Currently in Beta ([available here](https://app.teritori.com/)), the app is making modular tools and dApps available to users, with a single gamified user experience. Teritori's philosophy is to offer users and developers a place that belongs to them, their territory, with an emphasis on interoperability, modularity, and customization.\n\nUsers can interact with a social network, NFT marketplace, DAO launcher, service marketplace, games, etc., and integrate a plethora of dApps thanks to the dApp store, where Teritori will promote all Gno.land dApps to encourage the growth of the ecosystem. Using the Gno.land grant, Teritori will continue this amazing work and develop a moderation DAO to provide content moderation to Gno.land in a healthy and decentralized way, a challenge that faces the entire web3 industry. By 2024, the UX of Teritori v1 will be based on decentralized messaging without blockchain, allowing users to converse in a \"natural\" way while adding modules and web3 features. Creating and managing a GnoDAO could be as easy as managing a WhatsApp group.\n\n*“At Teritori, we want to make decentralized organizations accessible to all and experiment with new governance models for humans, social groups, businesses, and diverse organizations. Gno.land enables us to build this vision in a modular, future-proof, and censorship-resistant way. Thanks to the Grants Program, we'll be able to accelerate our development, continue to contribute proactively and build user experiences that enable as many people as possible to discover the Gnol.and ecosystem. We're starting work developing a DAO launcher, with different standard templates for DAOs, in particular, DAOs enabling moderation within news feeds, forums, or social networks. This will rapidly open many doors, such as those of conflict resolution DAOs, on-service marketplaces, or project management software. Gnol.and is a playground where anything is possible! We'll be documenting [our journey here](https://github.com/gnolang/hackerspace/issues/7#issuecomment-1588197187), and sharing our progress as we stay connected to the needs of the community.”*\n\n*Zooma, Core Lead, Teritori*\n\n### Zack\n\nZack is the first tinkerer-in-residence at Gno.land. With a deep-rooted passion for innovation, he embraced Go early on in 2013 and ever since, has been harnessing its power to craft peer-to-peer programs and develop web2 applications. While Gno.land marks Zack's initial foray into web3 development and blockchain dApps, the Gnolang language allowed him to effortlessly apply his Golang expertise. This has enabled him to flourish within an ecosystem that revolves around decentralized systems, seamlessly transitioning his skill set to create unique decentralized solutions.\n\n*“I have always been curious about web3 and blockchain technologies but have not developed expertise in smart contract languages and struggled to keep up with the fast-changing ecosystem around blockchain technologies. As an avid Go programmer, Gno and Gno.land created the opportunity for me to develop decentralized applications on blockchains by providing a framework and ecosystem that is consistent with Golang in terms of syntax, sustainability, and stability. The additional web3 features in Gno and Gno.land provide huge potential for interesting applications that I hope to unlock to move beyond web2 and harness blockchain technology for novel use cases. The grant provided for tinkerer-in-residence was the key to giving me the resources to move through this ecosystem as I try to think outside the box for what web3 can be and what blockchain can do for a web2 developer like myself.”*\n\n*Zack Scholl, tinkerer-in-residence*\n\n**How You Can Apply**\n\nActions speak louder than words. Until Gno.land is completely on-chain, the best place to start is by contributing to PRs and issues on the Gno.land repos or participating in the Game of Realms competition. If you want to apply for a grant, you’ll need to fork the Gno.land Ecosystem Fund repo and outline your proposal in your project name’s file. Once we receive your application, our team will review it and get in touch if we believe that you fit the criteria. [See GitHub for full instructions](https://github.com/gnolang/ecosystem-fund-grants). Stay tuned, we’ll be hosting a Funding and Grants Program Q\u0026A in the next few weeks!\n","2023-06-27T13:37:00Z","christina,michelle","gnoland,funding,grants"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-3","The More You Gno: Gno.land Monthly Updates - 3","\n\nWe’ve been busy since the last edition of *The More You Gno,* with the Gno.land core team and ecosystem partners present at various global developer events. We’ve visited many gnomes (and gnomes-in-the-making) around the world from Berlin to Belgrade, spreading the word about Gno.land and growing our expanding community. Aside from all the networking, Gno.land is taking shape with a new iteration of our website, the Gno.land Funding and Grants Program, and a host of developer updates as always. Let’s dive in.\n\n## Gno by Example\n\nWe recently launched [Gno by Example](https://gno-by-example.com/), our equivalent to both [Solidity by Example](https://solidity-by-example.org/) and [Go by Example](https://gobyexample.com/), where you can see tutorials and code snippets to help you learn and get more easily onboarded to Gno.land. Gno by Example is designed to be community-run with a front-end app and tutorials in markdown. There’s also a specific markdown syntax where you can embed certain file fragments to make your tutorials more structured. We’d love to build this into the ultimate resource center for Gno.land, so feel free to [contribute](https://github.com/gnolang/gno-by-example) with new tutorials and sections. Contributions here are eligible for rewards from the Game of Realms competition.\n\n## GnoVM\n\nWe continue developing GnoVM and invite you to provide feedback on what can be improved. This month, there have been a lot of discussions about how to improve native bindings and use the Gno machine in native function calls. Native function calls are well-defined in Go code generation and Go templates but need some modifications for GnoVM. For example, since new native functions already exist in the Gno code, when we try to define a native function, calling the function doesn’t yield the desired result. We’ve created a bunch of panics and tried writing out native functions to see what goes on for them, in an investigation that will go on for the next few weeks. Got any ideas? Please contribute. ([PR 859](https://github.com/gnolang/gno/pull/859)).\n\n## Testnets\n\nTalk about testnets has come up a lot in recent weeks and how to best proceed. Some gnomes are asking for a multi-node testnet to allow for great experimentation, whereas others prefer to keep the testnet single-node. There are advantages and disadvantages to both approaches and we are still listening to feedback and ideas. However, we will likely keep testnet 3 single-node and focus on the language while having a second dedicated multi-node testnet where devs can get creative, think outside of the box, test performance, consensus, and everything they need to push the chain to its limits. We’ve created a new [Hackerspace](https://github.com/gnolang/hackerspace) Repository for the multi-node testnet to prevent spam on the main repo, so please use it to share your scripts, posts, snippets, etc.\n\n## Native Coins and GRC-20 Tokens\n\nWe uncovered some significant issues with the banker module ([PR 393](https://github.com/gnolang/gno/pull/393)) regarding minting and burning tokens with the package minter. It was not scoping, filtering, or minting tokens correctly, making it possible to mint and burn unlimited tokens, including GNOT. We want to allow any realm to create its own token and run multiple tokens on their chains, but we need a prefix for security to resolve the issue and allow anyone to create GRC20 smart-contract-based coins but not native coins. We continue to work with small fixes on this issue and will reopen the PR soon.\n\n## Gno.land Funding and Grants Program\n\nLast month we released our Funding and Grants Program to encourage more developers, researchers, educators, and tinkerers to interact with Gno.land. If you’re interested in experimenting with Gnolang (Gno) and building innovative dApps, tooling, products, or infrastructure, check out our GitHub [Funding and Grants](https://github.com/gnolang/ecosystem-fund-grants) page for further information on how you can apply. Start contributing to Gno.land or Game of Realms as this is a prerequisite of the funding and grant application process.\n\n## Developer Relations\n\nThe Gno core team is growing! We hired a new DevRel last month and are looking to take on another dev for this open position, so if you’re interested, head over to our [careers page](https://jobs.lever.co/allinbits) and apply! You can expect to see a lot more documentation, FAQs, tutorials, and onboarding materials in the coming weeks and months.\n\n## Ecosystem Updates\n\nOur community of gnomes continues to expand, making tons of activity and progress over the past few weeks. Let’s see what they’ve been up to below.\n\n## Onbloc\n\nOnbloc has been super active this month attending and co-hosting IRL events and networking to find new gnomes about town. Among other updates, Onbloc has completed the first integration of Tendermint2 JS with the Adena wallet and will continue to swap out their existing libraries with TM2JS wherever applicable to ensure that they are as tightly integrated as possible. The team has also open-sourced the Gnoscan block explorer, so if you’re interested in contributing, hop on over to [Gnoscan](https://gnoscan.io/) or the [GitHub repo](https://github.com/onbloc/gnoscan).\n\n## Teritori\n\nAnother of our first cohorts from the Grants program, Teritori continues to churn out awesome work and expand its growing team. This month, Teritori has been busy integrating Adena with the Teritori app and working on the DAO contract to build a DAO deployer and various DAO standards and templates for DAO creation. Teritori’s target is to focus on a moderation DAO that can be used for content moderation in social feeds and boards. In the coming weeks, the team plans to integrate the DAO contract into the UI to allow the community to launch a DAO and experiment on the testnet. They have also made an effort to really integrate Gno users by adding .gno at the end of nicknames for people to use. All our grant recipients are documenting their journeys in the hackerspace repo, check out [Teritori’s](https://github.com/gnolang/hackerspace/issues/7) journey.\n\n## Resident Tinkerer, Zack\n\nAnother grant receiver, Zack, has been making significant progress on his microblogging project. You can check out the specs on GitHub ([PR 791](https://github.com/gnolang/gno/pull/791)) or watch the informative tutorial video, [Go to Gno: How to Build a Microblog](https://www.youtube.com/watch?v=F-_dadxcRJM). You’ll find this especially useful if you have a background in Go and need some additional insights to turn your hand to blockchain coding. Zack has also been working on an implementation of a smart contract for creating and transferring text-based NFTs that conform to haiku poetry standards (find out more on GitHub ([PR 860](https://github.com/gnolang/gno/pull/860)). Other than that, Zack continues his Gnolang journey, “learning and having a lot of fun.”\n\n## EthSeoul, BUIDL Asia, and Getting to Gno\n\nJune saw members of our core team heading over to Seoul, South Korea, for a week of networking, talks, and events. Our VP of Engineering Manfred Touron gave a keynote on the evolution of smart contracts and an introduction to Gno.land for participants of EthSeoul, followed by a fascinating dive into Proof of Contribution at BUIDL Asia, where we also had a booth. It was an honor to meet so many talented and motivated Korean developers and contributors from around the globe. Seoul is a hotbed of up-and-coming talent and we’ll definitely be back soon.\n\nWe also had the chance to meet with our most active ecosystem contributors Onbloc and co-hosted an event together, Getting to Gno, at the Code States developer academy along with long-time Cosmos builders, Cosmostation. Attendees had the chance to hear about what the core team is building and see some of the great work of our community. A massive thanks to everyone involved, it’s awesome to be BUIDLing together! Read more about our Korean adventures in this [fab write-up by Onbloc](https://medium.com/onbloc/2023-buidl-asia-recap-894c60a1c0f).\n\nEthSeoul - [Watch the talk here](https://www.youtube.com/watch?v=_iSsStlmxoU)\n\nBUIDL Asia - [Watch the talk here](https://www.youtube.com/watch?v=v6k3NHm5vcE)\n\n## EthBelgrade\n\nCore contributor Milos Zivkovic rocked the Gno.land presence at EthBelgrade in Serbia, giving an introductory workshop about Gno.land, called 'Alice in Gno.land'. Being the first Ethereum conference organized in Serbia, there were lots of attendees from all over the Balkans. Participants joined in a journey through the enchanting realm of Gnolang and the Gno.land platform. Most of the participants were not aware of Goland before but were avid Gophers eager to learn more about the application of the Gno language in blockchains.\n\n## GopherCon Berlin\n\nThe Gno.land team also had a blast last month at the European edition of GopherCon in Berlin. We had a booth at the event for two days, where we networked, talked about all things Gno, made some amazing connections, and even shared some live code! We’re looking to build an active, open-source Gopher contributor group in Gno.land, so stay tuned for more on that soon.\n\nComing up later this month, Gno.land is an official sponsor of EthCC, Paris, July 17-20. Stop by our booth to pick up some swag, say hey, and ask your questions about Gno.land. You can also catch us at the Nebular Summit for a keynote and workshop by our VP of Engineering, Manfred Touron.\n\n*Do you want to contribute to Gno.land’s monthly updates? If you’re building on Gno.land and want to highlight your development, project, event, or idea, let us know and we’ll include your contribution.*\n","2023-07-11T13:37:00Z","christina","gnoland,gnovm,tm2"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-4","The More You Gno: Gno.land Monthly Updates - 4","\n\nWe’ve had more on our plates than ever over the last few weeks, with a huge team presence in Paris at EthCC and Nebular Summit in July, an opening talk at Stanford Blockchain Club in August by Gno.land’s founder Jae Kwon, and some awesome contributions from Gno.land grantees and ecosystem partners, including the first demos of Gnoswap and Teritori’s social platform and DAO deployer. We continue to make solid progress on GnoVM, an alternative VM in Rust, Tendermint2, native bindings, and much more. Check out our latest developer updates below.\n\n## Upgrade Strategy for AVL Between GitHub and test3.gno.land\n\nOne ongoing discussion is about an incompatibility bug that affects many things we do on Gno.land. The current AVL implementation on the testnet is outdated and does not match the AVL implementation users get when they pull in the latest master branch. Therefore, building and deploying contracts on a local Gno chain (with the latest master changes) and deploying those same contracts on the testnet may fail due to this incompatibility. We need to find a way to seamlessly integrate these two approaches. Ideally, when you write code on the master branch on GitHub, it should work on the testnet as well.\n\nIn [issue 970](https://github.com/gnolang/gno/issues/970), you can find details of five different proposed solutions to implement this upgrade strategy, from resetting the whole blockchain (which would mean losing on-chain content and debugging information) to implementing a migration feature specifically for testnets that allows developers to rename packages and patch their contracts before publishing them. There are pros and cons to each proposal, and we continue to work together to find the best way forward.\n\n## Encoding JSON and the Discussion Around Reflection\n\nSome contributors have highlighted the need for native JSON encoding, and we are discussing how best to approach it. See [issue 808](https://github.com/gnolang/gno/issues/808) for further details. One idea is to copy the code from encoding JSON in the standard library Go and take it over to Gno, but we would need to have reflection to do that. So, the important question here is whether we want to have reflection and, if so, what it should look like. We could emulate Go’s reflection package with some added elements, like being able to inspect the realm state, but we would need to be extremely careful about how we do this.\n\nFor example, should users be able to read private fields of external packages through reflection or even *ufmt*, or could that introduce a problem? It would be simpler, and the language capability security would be tighter and easier to understand if we made accessing private fields impossible, but that would also make it limited. We could consider supporting reflection as an internal user package and whitelisting and encoding JSON. This way, new encoding packages would have to be whitelisted because they’re using the reflection package. We could also mark reflection as unsafe so developers know they must carefully audit their work.\n\nAnother solution is the partial implementation of reflection. In [issue 971](https://github.com/gnolang/gno/issues/971), Gno.land core engineer Petar discusses introspection, which involves implementing reflection as Go has it now but enabling only one of its two main capabilities: the ability to inspect types, but not the ability to modify code. The main difference between introspection and reflection is that, since it is done at compile time, it is completely type-safe. This discussion is ongoing.\n\n## Alternative GnoVM Implementations\n\nTo deliver the best possible virtual machine, we’re working on two different implementations of GnoVM. Petar has spent the last three weeks developing a new GnoVM implementation written in Rust. His work is still private as the machine is not yet ready for public use, but he will soon make the code public for your inspection. Rust gives the ability to write more performant code and, in some scenarios, the Rust GnoVM can run up to 20 times faster than the GnoVM at roughly 87 milliseconds compared to 2,000 milliseconds on a Fibonacci benchmark, which is a considerable improvement in speed.\n\nSince one of Gno.land’s core features is that the entire tech stack is written in Go, we’re unsure if everyone will appreciate a Rust GnoVM or whether it aligns with our vision. However, it’s always good to provide alternatives, and, Petar argues, as long as the VM carries out the same functions (and does so more cheaply), most developers won’t mind what language the VM is written in.\n\nRust has a few other features that some developers may favor over Go, such as more tools for creating languages, advanced garbage collector libraries that allow you to change the algorithm without changing the runtime (by swapping out a tricolor algorithm for a generational one, for example), and built-in data structures that solve many issues. For example, we needed a deterministic map that is fairly fast. With Rust’s Btree in the standard library, this was simple, Petar only had to implement the native Go map type with a Btree map from the standard library. This took just a few minutes.\n\nCore team dev Marc has also started an initiative to improve the Go GnoVM so that it is faster and offers a clean and user-friendly interface. He believes the debate over the VM is more about whether to have a VM that is bytecode-defined or AST-defined (rather than speed). Marc has been comparing the fundamental differences between the two and noted that the bytecode version is 15 times faster than the AST. This means that changing to Rust would give an increased performance of 2-3 times.\n\nThe VM must be fast, secure, and performant in many ways. In either version, the AST will be stored on the blockchain, whereas the bytecode is only an internal representation that doesn't affect the users. We must still consider any potential architecture consequences between bytecode and AST before deciding whether to change. Marc’s WIP code is still in a private repo, but you’ll be able to inspect it soon and make a comparison of the VM implementations in the coming weeks. The decision about the direction of GnoVM is still very much TBD; however, the Rust GnoVM will not replace the Go GnoVM but will complement it, eventually giving validators the choice of which to run.\n\n## Defining Wording for People/Documentation and Consistency\n\n[Issue 1024](https://github.com/gnolang/gno/issues/1024) discusses the need to define the wording we use throughout our documentation, for example, how we name a module, package, sub-module, etc. Once we have the wording defined, we will set the GnoVM to only accept elements with the correct naming. The importance of wording affects the design choice of the whole project and how we go about versioning for the best possible user experience.\n\nFor example, is mt/board/admin part of the same realm of mt boards, or is it its own realm? Can we work with both by adding patterns to have some realms responsible for hosting data and others responsible for having more privileged actions? How do we split a complex realm into sub-libraries and sub-realms? We want to define the documentation and the logic for this and have begun to touch on this issue. We will discuss this in greater depth in the upcoming developer calls.\n\n## Improving the GRC20/Foo20 APIs\n\nWhen working on the specs for a Merkle airdrop contract, Albert came against some issues with users initiating airdrop reward claims (see [PR 906](https://github.com/gnolang/gno/pull/906) for more details). Currently, when the Merkle airdrop contract tries to execute the reward claim for the user, an instance of the GRC20 contract is used for transferring. Within the GRC20 implementation Transfer() method, the caller (token sender) is fetched using the standard library method std.PrevRealm().\n\nHowever, calling this method in the Merkle airdrop context returns the user as the caller, not the Merkle airdrop contract, which is an unexpected functionality. We are discussing different ways to tackle this issue efficiently. However, each solution would require possible changes to the GRC20 API and subsequent token implementations. Additionally, as part of [PR 952](https://github.com/gnolang/gno/pull/952), we are looking into improving the standard GRC20 API and possibly resolving the ambiguity with standard library calls that are causing the mentioned issues.\n\n## Client Optimized for CLI, Not Mobile\n\nOur newest contributor to Gno.land, Berty, is developing the mobile version of Gno, which means writing a mobile app to interact directly with the blockchain. The team is facing some issues as they need a client library with utility functions like sign and broadcast, which are used by the command line. This code (tm2/pkg/crypto/keys/client) is not ready for external users yet, and the Gno client is designed for CLI. However, Berty needs a way to interact with the Gno chain from their application and to call the logic without adding the full CLI.\n\nFrom the existing TypeScript/JavaScript client library (gno-js-client and tm2-js-client), Berty should be able to build out a Go client library by exclusively using the RPC endpoints of the node itself (just like gno-js and tm2-js work), and not having to worry about importing private logic like transaction broadcasting. The team is writing its own framework to call Go code for Gno from Java, Swift, and React Native mobile apps that creates a transaction and sends it (see [PR 1047](https://github.com/gnolang/gno/pull/1047)).\n\nThey are working on an API that interacts with the blockchain and lets them export the code without having to write their own utilities. The API will be minimal, and update the Tendermint2 build script by moving tm2txsync from tm2/cmd to gno.land/cmd (see more details in [PR 1080](https://github.com/gnolang/gno/pull/1080) here). For the time being, Berty will copy the code and use the objects directly until a more convenient API is complete.\n\n## Tendermint2 Development\n\nIn [PR 546](https://github.com/gnolang/gno/pull/546), we introduce file-based transaction indexing. Transaction index parsing should be done as a separate process from the main node, meaning other services can be instantiated to index transactions as readers. The current problem is that there is no way to figure out whether a transaction has failed after it’s been sent out with a broadcast sync, or fetch any kind of receipt information or error reason in the delivered transaction.\n\nSo, we’ve started working on an event indexer to index Gno node events, which include transactions. Soon, developers and users will be able to ask the event indexer what happened to the transaction or in which state in its execution it's currently at, and also to retrieve information on other events like block commits as they happen.\n\n## Extending the Functionality of Go\n\nIn [issue 919](https://github.com/gnolang/gno/issues/919), Petar proposes extending the functionality of Go by adding constant data structures, arrays, slices, etc. He believes this would benefit users, as they wouldn’t need to create special functions as in Go to simulate this behavior, and it would also catch bugs when there is mutation. There has been a discussion, and Jae has similar ideas with the notion of “invar” expressions, where the resulting value can only be read, not mutated or stored. This would fix the bug where if you pass a pointer (that represents part of your contract state) to another contract, the other party can “steal” it by assigning it to their state, and your contract would fail to execute.\n\nMorgan believes that we should take a different approach as slices have the semantic in Go, where the underlying array is always heap-allocated and modifiable. Introducing constant slices would thus necessarily have to introduce concepts regarding im/mutability of values without the matching constructs that a language like Rust has. To make a compromise and keep compatibility with the Go spec, we are likely to implement this in a transpiler (gnoffeescript) that would implement this feature and be able to transpile to valid Go.\n\n## Grantee and Ecosystem Updates\n\nAs you can see, we’ve made a ton of development progress over the last few weeks. We’re also steadily adding more gnomes to our community of builders, and they’re working on the core infrastructure of Gno.land, as well as the permissionless dApps the platform will house. Let’s see what they’ve been up to since the last update.\n\n## Onbloc\n\nOnbloc has been busy, as always, with a slew of updates for us over the last few weeks. The team has been developing Gnoswap, the first Gno.land automated market maker with concentrated liquidity, and they gave us a live demo. On the front end, which is still a work in progress, you can find a one-stop venue for traders to view all the information about tokens on gno.land, so you don’t have to move between Gnoswap and a token aggregator like CoinGecko. You can also see incentivized pools sorted by liquidity, volume, APR, liquidity mining rewards, etc., and a wallet page to check your balances. You will also be able to deposit or withdraw assets from the Interchain when IBC is enabled.\n\nCheck out the work they’ve done so far on the Onbloc [hackerspace](https://github.com/gnolang/hackerspace/issues/29). The team has also released [the documentation](https://docs.gnoswap.io/) about what you can expect from Gnoswap, the rationale behind their design choices, some information about tokenomics, a preview of the UI, and more. Their main focus is on delivering a smooth and welcoming user experience and abstracting away the difficult mechanisms of concentrated liquidity so that the interface is as minimal and simple as possible.\n\nThe team will be ready to launch Gnoswap as soon as gno.land reaches mainnet. Feature updates and enhancements will be aligned with the development of the core Gno Stack.  The code for Gnoswap has now been [open-sourced](https://github.com/gnoswap-labs), so you can take a look at everything they’ve done and even make suggestions. In the coming weeks, Onbloc will also work on building core Gno.land infrastructure to support an earlier launch. Find details of this in Onbloc’s [grant submission](https://github.com/gnolang/ecosystem-fund-grants/pull/4). And be sure to check out Onbloc’s informative 6-episode [blog series](https://medium.com/@gnoswaplabs/why-gno-introducing-gnoswap-dd6acc22e6a1) that features the history of blockchain and exchanges, a deep dive into the Gno Stack, and an introduction to Gnoswap, where they share details of their journey and insights.\n\n## Teritori\n\nWe also saw an awesome demo from the Teritori team, which you can check out at app.teritori.com. Simply connect your Adena wallet to create a user name, start interacting with the social feed, create your own DAO, and add members. The team is working on more extensive documentation to explain how it works in more detail. While still a work in progress, Teritori has developed a cool flagging system that allows you to unfollow content you don’t like or flag content as inappropriate. If posts receive many flags, users can vote on whether to ban them, creating a healthy and supportive social environment free from derogatory content monitored by a like-minded community through a moderation DAO.\n\nThe team continues its work on DAO interfaces and has built a useful tool for speeding up the deployment of packages as a workaround until we’ve decided how to best tackle realm versioning. They are also working on the escrow system, which will be useful for the freelance marketplace, and presenting DAO standards documentation.\n\n## Berty\n\nWe have a new contributing team to Gno.land from the Berty private messaging app. This team is working on a mobile version of Gno.land, implementing the WESH protocol, which is available by Bluetooth, local WIFI, or other means, and provides secure censorship-resistant communication between devices. The plan is to be able to provide an alternative transport for Gno applications when the internet is not available and build the skeleton/foundations that enable developers to create Gno-centric mobile apps more easily in the future. Berty brings a ton of experience in off-grid communication and getting apps to run on mobile devices, both Android and iOS.\n\nThe team has created its own [testnet](http://testnet.gno.berty.io/), which you are welcome to test out and play around with, although they will be restarting and rebooting without prior notice, so be aware that your work could be wiped. In the few short weeks they’ve been working with us, Berty has already finished their first Proof of Concept, a simple app running on iOS and Android. They copied code from the gnokey command line, and now it’s installing and running on mobile and interacting with the blockchain.\n\nNow, Berty is working on a nicer UI for the app and will propose a project to create a formal framework called GnoMobile, which will allow anyone to create their own app and run it on mobile. We look forward to seeing their demo soon.\n\n## Golang Working Group\n\nIn other news, we've started a bi-weekly [Gnome Golang Working Group](https://github.com/gnolang/hackerspace/issues/15) where we get together and discuss various topics, such as the language-related and theory elements of Go and Gno. We also aim to identify meaningful and reasonable ways to contribute to Golang, Gophers, and the general open-source community and improve our visibility there. We hope to attract more Go devs to the project and provide a “blockchain-less” experience for web2 Go devs.\n\nWe've had two meetings so far, and some recent hackerspace issues have already emerged from the discussions. One in particular that we’re actively evaluating is Gnoffee, a transpiler tool inspired by the likes of [CoffeeScript](https://coffeescript.org/) for Go and Gno integration. Gnoffee would be a powerful standalone tool to enhance Go and Gno (blockchain) projects by generating code and seamlessly integrating new features without manual coding. Find out more at the link above.\n\n## EthCC and Nebular Summit\n\nThe Gno.land team was in full force in Paris at the end of July for EthCC, where we met many passionate developers and spread the word about Gno.land and, specifically, how Gnolang compares and contrasts to Solidity. We had a booth during the conference manned by the Gno.land team complete with awesome swag and a continuous presentation in the background playing on a full-screen television.\n\nAt Nebular Summit, our VP of Engineering, Manfred Touron, [gave a talk](https://www.youtube.com/watch?v=CtxBajCcTYQ) called ‘Gnolang for Developers: Examining the Core Stack,’ where he broke down the major components of Gno, demonstrated how the upcoming Gno SDK compares with the existing Cosmos SDK, and explained why Gno.land is an excellent choice for accessible and sustainable blockchain development.\n\n## Blockchain Application Stanford Summit (BASS)\n\nJae opened the [Blockchain Application Stanford Summit (BASS)](https://bass.sites.stanford.edu/) event, attended by thousands of students and future blockchain developers. He gave an overview of Gno.land, GnoVM, and Gnolang, and explained the features that make our platform paradigm-shifting and timeless. He also dove into the core of why we’re building Gno.land – to provide a censorship-resistant platform for truth discovery that helps people improve their understanding of the world in an era of information censorship and control.\n\nComing up later this month, you can catch up with the Gno.land team at [DappCon Berlin](https://www.dappcon.io/) from September 11-13, where we’ll be delivering an informative keynote and hosting a side event to get to gno you better. If you find yourself in Barcelona for [Web3 Family](https://web3fc.xyz/) on September 23, you can join in a Gno coding workshop. You’ll also be able to meet the team at [GopherCon US](https://www.gophercon.com/) in San Diego. We’re hosting an action-packed workshop, ‘Chess: The Gnolang Way,’ on Gopher Community Day, where you can learn to build a web3 chess server on Gno.land and compete for cool prizes in an ongoing chess tournament throughout the event. More details coming soon. That’s all for now! Be sure to check back again with us for the next edition of *The More You Gno* to keep up with all our progress.\n\n*Do you want to contribute to Gno.land’s monthly updates? If you’re building on Gno.land and want to highlight your development, project, event, or idea, let us know, and we’ll include your contribution.*\n","2023-09-04T13:37:00Z","christina","gnoland,gnovm,tm2"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["chess-gc23","Play Chess with Us: The Gnolang Way at GopherCon 2023","\n\nCalling all gnomes and gophers! Come join the Gno.land team at GopherCon 2023, September 25 - 28, in San Diego, US. We’re sponsoring this year’s action-packed event that will gather together some of the world’s brightest minds and smartest programmers under one roof. So drop by our booth, pick up some swag, and say hey! We’ll be on hand every day to meet and greet, answer all your questions, and discuss everything Go, Gno, and beyond! We’ll also be hosting a workshop on Community Day, September 26, called ‘Chess: The Gnolang Way,’ where you can learn how to build a web3 chess server on Gno.land.\n\n## GopherCon 2023\n\n[GopherCon](https://www.gophercon.com/) is a community-driven annual event that started in 2014 and is dedicated to promoting the use of Go and the education of Go developers. Every year, thousands of gophers from around the world exchange ideas, share their work and expand the Go network. There are four days of fun-filled activities, including hands-on workshops, informative keynotes, networking events, and hackathons, all taking place in the laidback West Coast city of San Diego. Where better to expand your knowledge and make new friends than in one of the US’ most popular destinations?\n\nAs a gold sponsor at this year’s event, Gno.land will be running a booth and doing our best to convert as many gophers as possible to Gno, showing them how easy it is to port their existing web2 apps over to Gno.land or to build completely new ones from scratch.\n\n## Chess: The Gnolang Way\n\nIf you’re looking for a hands-on coding experience and to have a little fun with us at the same time, join us on Community Day for an awesome workshop, **‘Chess: The Gnolang Way.’** Kickstart your day by learning to build a web3 chess server on Gno.land using Gnolang. By the end of the session, you’ll have gathered basic knowledge on developing and deploying smart contracts on Gno.land, and connecting smart contracts to a web frontend. You’ll also see how web3 enables you to write perpetual and trustable social and gaming platforms and how to build a web3 chess server and website with Gno.land.\n\nIf you want to join us, meet us at 10:00 a.m. in the Grand Ballroom 10.\n\n## Let’s Play\n\nAfter the workshop, the fun begins with an ongoing chess tournament throughout the GC23 summit for event participants. To be in with a chance of scooping up some seriously cool prizes, GC23 attendees will need to show us their best moves and how much they engage with the Gno.land chain. This competition is designed to put our platform to the test over two main areas: chess mastery (50% of points) and platform engagement (50% of points). To be eligible for prizes, participants must be present at the event. We hope to see you there! If you can’t join us in person in San Diego, be sure to [follow us on X](https://twitter.com/_gnoland). We’ll be giving updates on our progress and sharing the highlights of the event. May the best gnome win!\n","2023-09-25T13:37:00Z","christina","gnoland,gnovm,gnochess,events"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["gnomobile","GnoMobile, a Framework for Building Gno Mobile Apps","\n\n*This blog post is written by Berty Technologies, an NGO that is building open and free communication solutions without any of the limitations imposed by centralized systems. Berty is a proud partner and grantee of Gno.land.*\n\nThe year is 2023. Current Gno apps run on desktop or laptop computers that have Go installed. To run on mobile, the app would need to bundle the Go runtime, which is complicated for most developers. At Berty, we have years of experience using Go on mobile and overcoming difficulties with Android and iOS operating systems. We built Wesh Network, a decentralized communication protocol that enables p2p users to reliably and securely send messages over async networks, even in environments with poor or no connectivity.\n\nThis stage is thus set to take the leap and make it easier for builders to develop Gno applications for mobile devices.\n\n# What is GnoMobile?\n\nSimply put, GnoMobile is a framework for developing Gno mobile applications. This is how it works:\n\n*WARNING: Deep technical sections ahead. Grab a coffee before venturing forth*.\n\nFor communication between the mobile app and the Gno code, GnoMobile uses [gRPC](https://grpc.io/), a well-supported framework that sends and receives Google Protobuf messages. Even though the core Gno code is written in Go, the app code can use React Native, Java, Swift, etc. The following system diagram shows how gRPC is used.\n\n\u003cdiv align=\"center\"\u003e\n ![](https://github-production-user-asset-6210df.s3.amazonaws.com/109347079/267934754-e4da6fec-a586-4ebe-97cc-3b3ad7f79370.jpg)\n\u003c/div\u003e\n\nMoving from the bottom to the top, this is how the flow looks:\n\n1. At the bottom are Go packages in the gno codebase. A **gnoclient.Client** supports communication with the remote Gno.land node with methods like Call to call a realm function. The Gno codebase also has **keys.Keybase** to support a wallet stored on the local device with methods like CreateAccount.\n2. These methods are called directly from the next level up by the **GnoMobile** Go code. A Go object can’t be passed through the gRPC interface, so the GnoMobile Go code maintains a persistent gnoclient.Client object, which is accessed by gRPC calls. The GnoMobile API functions are registered by an amino package.go file and the generated Protobuf files are used to configure the gRPC server.\n3. Finally, at the top of the diagram, the **gRPC client in the mobile app** communicates with the GnoMobile gRPC server over a local connection using Protobuf messages. A gRPC call can either return an immediate result (for example, GetKeyCount) or an asynchronous gRPC stream object, which can return delayed results (for example, a Call to a remote realm function). The gRPC framework uses the Protobuf API to generate convenient API functions in the mobile app’s [preferred language](https://grpc.io/docs/languages) (React Native, Java, Swift, etc.).\n\n# How GnoMobile benefits builders\n\nThe first version of the framework will include three main sets of features:\n\n1. **Blockchain Operations**: These refer to the core block of functions that the apps need to interact with the blockchain. Things like the gnoclient API to effectively bring the benefits of the Gno framework on mobile, the gas estimation interface and calling realm functions, querying a blockchain node (and more) are included here.\n2. **Wallet**: As the name suggests, here we have all the standard wallet operations like create or delete an account, set the recovery phrase, account balance, and so on.\n3. **Toolkit**: We want to make it as easy as possible for devs to start building apps with our framework, so we’ll provide them with install instructions, example apps, and more technical stuff like genproto options to support gRPC and helper functions to parse the render output.\n\nThose should be enough to allow builders to get started on using and experimenting with Gno mobile apps.\n\n- *Support for secure p2p communication, even when the Internet is down?*\n- *Yes, please!*\n\nSomething that is not necessarily essential for V1, but for sure will open the doors to some powerful capabilities later on is to add an interface and a constructor to adapt the communication transport. This will make it possible for devs to incorporate other tools like Wesh Network and give their apps the ability to securely and reliably send messages even in very poor network conditions. But that’s a story for another time.\n\n# When will GnoMobile be ready?\n\nV1 is planned for release in mid-December 2023.\n\nUntil then, you can check out our progress [here](https://github.com/gnolang/hackerspace/issues/28).\n\nGot feedback or want to drop us a question? Ask away on our [repo](https://github.com/gnolang/gnomobile/issues).\n\n# What does the future look like beyond V1?\n\nWe see a lot of potential directions for GnoMobile after the initial release that will improve the user experience, extend its functionality, and make GnoMobile even more secure. We’re still scratching the surface in terms of how far we can take its development, and we look forward to working on further iterations and improvements. Some of our ideas for the future beyond V1 include:\n\n1. Making it easier for developers to **build** **desktop apps** **and** **browser extensions**:\n2. Through GnoMobile, we can gradually enable “desktop” devs to use our React Native gRPC interface to write desktop applications while using existing functionality from the core Go code. This way, developers will not necessarily have to learn Go to leverage its advantages.\n3. Browser extensions are usually written in JavaScript in the same way as in React Native. This opens the door to getting the benefits of Go via the GnoMobile framework. Otherwise, you’d have to either make the Go code run inside the browser extension (which is not easy) or use a remote server (which is not pretty).\n4. Making it possible to **execute smart contracts directly from mobile**.\n\n*Why is this important?*\n\nIf you want to add a new message to a blockchain, you need to actually interact with it (the blockchain) and update its state with the new message. However, if you just want to browse through the messages, you can execute the Render function locally without needing to use your network and, at the same time, get the results much faster. This is because the node runs locally on the mobile device without needing to spend crypto coins to get a remote node to do the operation for you.\n\nGno nodes run on GnoVMs (gnovm), and for the moment, these are only available on desktops. We believe it is possible to make them available on mobile as well, but we need to find clever ways to overcome the constraints of mobile devices (like putting the apps in the background (iOS), addressing network bandwidth limitations, and so on).\n\n1. Developing a **decentralized push notification service** for *both* mobile and desktop apps. Getting notifications is now a standard (and very important) functionality of centralized apps. Technically, this happens via a central server. Naturally, having a centralized server is not possible for a p2p app, but there are other ways to implement notifications, and we are considering including them in the GnoMobile framework.\n2. Making it possible for decentralized apps to **interact with the blockchain even if the network connection is poor or virtually unavailable**. Through the [**Wesh Network** protocol](https://wesh.network/), we are opening up the possibility of using alternative transport mediums to exchange messages between peers in an asynchronous but reliable manner in off-grid environments. Enabling reliable, secure, and censorship-resistant communication is our main cause at Berty Technologies. We want to open the door for p2p users to send messages and interact even in extreme situations or adverse scenarios, and Wesh Network is built specifically for this purpose. It is only natural to make it easier for developers to use it through the GnoMobile framework.\n3. Advancing **edge networking for enhanced blockchain resilience**. Edge networking refers to bringing functionality like computing power or storage closer to the user so that they don't need to travel through the whole Internet to interact with a server. The same edge concept can be applied to bring the necessary services to interact with the blockchain closer to each p2p user. For example, hosting a copy of the blockchain so a user can sync it or even execute smart contracts. Having these fundamental services closer to the p2p users is especially important in the case of mobile apps. We want to offer developers the possibility of taking advantage of the edge networking benefits by allowing them to use, for instance, network address redirections or special HTTP headers in the configuration of their applications.\n\nIn all honesty, it’s hard not to get excited about all the different possibilities that lie ahead for GnoMobile, but we’re keeping our focus on shipping V1 for now and collecting feedback from the community. After that, well, we hope you’ll stick around to see what happens next!\n","2023-09-29T13:37:00Z","jeff,costin,remi,iuri","gnomobile,berty,weshnetwork"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-5","The More You Gno: Gno.land Monthly Updates - 5","\n\nIt's been another productive month, packed with developer calls, live events, new contributors, a large team presence at the Go community's biggest event of the year, GopherCon 2023, and the launch of a PoC gaming dApp on Gno.land, GnoChess. We uncovered a bunch of bugs in the code and some issues with the GnoVM, and made further progress on the Go and Rust VMs, the banker module bug, Gnofee, and much more. Check out the updates below.\n\n## Building a Web3 Chess Server on Gno.land - GnoChess\n\nMost of our work over the last few weeks has been dedicated to [GnoChess](https://gnochess.com/), a [PoC gaming dApp](https://test3.gno.land/r/gnoland/blog:p/chess-gc23) unveiled at GopherCon 2023. As gold event sponsors, we wanted to provide gopher attendees with a memorable experience – and a little friendly competition – while battle-testing the Gno.land platform. As our first gaming dApp, developing GnoChess was extremely useful for our team in many ways. We managed to attract 61 players to the game during the event, including some die-hard web2 gophers who wanted to show off their moves and discover more about Gno.\n\nSeveral PRs were opened as a result of our endeavors, and, beyond the conference, GnoChess taught us a lot about where we're at with Gno, how to successfully build complex dApps on top of the platform, and how well we work as a team. We uncovered some key issues and breaking behavior in the GnoVM, made our JavaScript clients much more reliable in their communications with the Gno.land node, and unearthed further issues that lead to complex errors and potential security flaws that must be addressed before mainnet.\n\nFor example, appending nil to a slice of errors resulted in a panic, or conditional statements like if not supporting custom boolean types. The GnoVM doesn't currently perform terminating statement analysis, which results in a cryptic panic message ([issue 1086](https://github.com/gnolang/gno/issues/1086)), and mixing untyped (negative) floats and integers in arithmetic sometimes drops the sign ([issue 1152](https://github.com/gnolang/gno/issues/1152)). The issues uncovered while developing GnoChess were discussed extensively in the public developer calls of [Sept 6](https://www.youtube.com/watch?v=BBBqgycMjqU) and [Sept 20](https://www.youtube.com/watch?v=WrxFVPR55G0), and referenced in the [GitHub meeting agenda](https://github.com/gnolang/meetings/issues/31). Most of the issues are common in software development and fairly simple to fix by making some implementation changes or adjustments to design choices.\n\nWhile developing GnoChess, our engineers took on the role of expert platform users rather than core team members. This approach was very useful as it pushed the platform to new limits, and allowed us to dive deep into many aspects of the project, creating a culture of sharing by opening up issues for each bug and asking for feedback and support. We'll definitely take a similar approach for future app development and onboarding new devs to Gno. We'll be releasing a retrospective of our experiences in the coming weeks. In the meantime, if you want to build a dApp on Gno.land, check out the GnoChess repo, where you can find a useful [tutorial](https://github.com/gnolang/gnochess/blob/main/tutorial/01_getting_started/README.md) or watch the recording of the GopherCon workshop, '[Chess: The Gnolang Way](https://www.youtube.com/watch?v=JQh7LhqW7ns).'\n\n## The Battle of the Virtual Machines\n\nCore engineers Marc and Petar continue their excellent work developing two different VMs for Gno, one in Go and one in Rust. In the coming weeks, we'll have a face-off, comparing and contrasting their features, efficiency, speed, and performance, so watch this space! For now, the definition of the virtual machine is stable for both, and they are no longer working on the virtual machine definition. They are mainly focusing on code generation; everything from parsing to scanning to parsing and compiling. Let's see how they are shaping up.\n\n### Rust VM\n\nPetar has developed a Rust implementation not only of the virtual machine but of the whole chain, including the compiler. He has written a Go compiler entirely in Rust and has even started experimenting with changing the compiler to implement the Invar proposal from Jae. Further progress includes porting a part of the parser and scanner from the Go compiler to Rust (almost a direct translation from Go to Rust) and making it stable. \n\nIn addition, Petar has completed work on typed nil values and improving the recursive closures of Go, which were not working with Gno code and needed additional pointers. He has also implemented Iota and hooked up the garbage collector. In the coming weeks, Petar will be working to smooth out bugs and implement type aliases, as well as implementing function analysis for the dependency graph. The dependency graph is necessary for compiling global types in the correct order, so, for example, when type A refers to type B, you need to compile type B first so that when type A refers to it, type B exists.\n\n### Go VM\n\nMarc is currently rewriting a parser and a scanner from scratch. His work is not as far along as Petar's, but he's getting closer, and the code generation works well. He is currently refactoring and building a single-pass compiler that can perform a **syntax-directed translation**, which means there are no intermediate data structures between the source code and the byte code. This is a much simpler design that should compile faster and be easier to maintain, but it requires a complete redesign. \n\nMarc believes his Go parser will be easier to maintain and understand than the one in Rust and benefit the user since the entire stack is written in Go. However, to assess the best implementation of the VMs, Marc has started a Go **test shoot project, which is a script** that will run many samples to verify that the compiler (in Go, Rust, or any other implementation) conforms to Go's specifications. Marc and Petar will open their repos soon, and the next edition of The More You Gno will highlight how the GnoVM works. \n\n## Gnoffee: Coffeescript for Go and Gno\n\nGnoffee (hackerspace [issue 22](https://github.com/gnolang/hackerspace/issues/22)) will be a powerful standalone tool to elevate the development process of Go and Gno by generating code and integrating new features, eliminating manual coding. We aim to create a custom variation of Golang that preserves similar readability, maintains compatibility, and enables being able to code in Gno very quickly when you know how to code in Go. How do we go about this? \n\nRegarding compatibility, one possibility is to propose all our changes to Golang and wait for approval before we start developing. However, this is likely to take some time. Another approach is to use a way to transpile TypeScript for JavaScript or Coffeescript for JavaScript, so it's another language passing through a program that creates standard valid Golang and will generate valid Gnolang. With this simple method, we can experiment with missing features like new native types, and new keywords, and when we have new features in mind, we can develop what we lack. \n\nFor instance, it does not make sense to have extra security for your exported variables when you write a library in Go. However, in Gno, it is very important to ensure that everything you expose cannot be modified by other contracts. This means finding a way to expose constants and other readable elements without risking their values being overwritten.\n\nBesides allowing us to carry out all types of experimentation more easily, Gnofee could eventually be a way for the Go team to measure the potential adoption of Gno. Gnofee is not a priority for the mainnet, but we're excited to work on this important initiative.\n\n## META Multinode Testnet\n\nThe discussions about single and multinode testnets have been ongoing, so we opened an issue to establish a multinode testnet focused on multi-validator experimentation, including stability, benchmarking, and lifecycle management. This multinode testnet aims to provide a platform for in-depth explorations and evaluations of multi-validator setups, while we maintain the single-node test3+.gno.land set up, primarily dedicated to showcasing the VM and providing examples. Visit hackerspace [issue 9](https://github.com/gnolang/hackerspace/issues/9) if you want to participate in this initiative or share your insights.\n\n## Banker Module Bug\n\nThe banker module bug is a known issue that needs to be fixed before the mainnet because, currently, it's still possible to mint new GNOT tokens from any contract. Several fixes have been suggested, and our goal is to merge [PR 875](https://github.com/gnolang/gno/pull/875) put forward by Onbloc to change the denomination of the coins minted by the banker. Merging this PR is currently blocked by 2 small failing checks, but we are close to resolving this issue.\n\n## Preserving Go Comments in Protobuf\n\nIn [issue 1157](https://github.com/gnolang/gno/issues/1157), Jeff from Berty raises the question about preserving Go comments in the Receiver field. Currently, Amino converts the code, but the proto message Receiver field doesn't have the comment. Manfred agrees that informative comments are helpful. However, he doesn't want to create a complex Protobuf configuration. We will continue to discuss this issue to look for solutions, but for now, Berty will parse the original Go source code and get the comments this way.\n\n## Multi-Sig and Security Features\n\nSeveral contributors, including Teritori, are working on built-in multi-sig support in Gno.land, where Gnokey supports a multi-sig setup. We also want to introduce additional ways to improve the UX and security of Gno.land (and web3 in general). An idea we currently have is to add a new layer in authentication, creating something similar to browser cookies that we can name sessions. The chain will have two tables, one with the public key for an account and one with a public key for sessions linked to an account. From your main account, you can create a session with self-destructing features, such as destructing after one hour without usage or after 24 hours. The goal would be to allow more complex and secure flows when starting your operations. We may not want this for multi-sig, but it comes under the same family of security and privacy features.\n\nFor example, imagine a wallet like Adena uses your key, a passphrase, or a ledger. It will sign a new public key that you just created in memory. Each time you close your browser, the memory is cleared. You can also have a logout button to call on the blockchain to delete all your sessions or simply wait for the session to be self-destructed, especially if the session was just in memory on your side. We will continue to develop this idea.\n\n## New Team Member\n\nWe're excited to welcome a new DevRel team member to Gno.land, Leon, who's been in blockchain development for two years and is passionate about engineering and teaching. Leon has taught languages, development, math, and music privately, as well as an OS fundamentals class at his previous faculty. Welcome on board!\n\n## Grantee and Ecosystem Updates\n\nAs Gno.land core continues to advance, so does our blossoming ecosystem, with new contributors and community members turning their eyes to Gno. The overriding theme of this last month has been collaboration, and we're pleased to see gnomes working together to overcome their obstacles and push their projects forward. Let's see what they've worked on over the last few weeks.\n\n### Onbloc\n\nOnbloc is powering ahead, contributing to Gno.land core, making upgrades and improvements to Adena and Gnoscan, and developing the Gnoswap DEX. Last month, Onbloc released the patched version 1.8.0 of Adena, which includes some UI and UX enhancements, such as more intuitive account management settings, a copy icon next to the names of the accounts, and some bug fixes. This release also comes with new injection methods to enable dApps to request users to add a custom gno.land network or switch to an existing one. Check out the [release note](https://github.com/onbloc/adena-wallet/releases/tag/v1.8.0) for more details.\n\nOnbloc has open-sourced the code for Gnoswap on this GitHub [repo here](https://github.com/gnoswap-labs/gnoswap). You can also find a guide to running unit tests. The team continues to improve the Gnoswap interface, focusing on the earn and staking pages, the graphs for positions, and some components for adding and removing liquidity and providing pool incentives. They're working on the next iteration of the interface, with the governance and airdrop pages, and developing the front-end logic to integrate with Gnoswap realms and APIs. Onbloc also contributed to Gno core, adding PRs for fixes to testing and the banker module. Keep up with Onbloc through their [hackerspace journey](https://github.com/gnolang/hackerspace/issues/29) and check out their latest initiative [Gnodesk](https://medium.com/onbloc/gnodesk-week-2-of-sept-2023-5edbc451bba7), which delivers weekly highlights and updates from Gno.land.\n\n### Teritori\n\nTeritori has been working on improvements since the last update and open-sourcing all their work, including the DAO deployer and the Moderation module. You can visit the Teritori DAO tooling repo to find the complete documentation and new realms to easily deploy your DAO. There is also a tutorial on creating your own DAO using the framework. \n\nThe team has made extensive progress on the Justice DAO deployer, a module that can be used for third-party arbitration when there is a problem with the escrow system in a decentralized freelance marketplace. The Justice DAO can resolve potential conflicts between the seller and the buyer and implements randomness to choose the judges to solve problems without conflicts of interest. The content flagging system, which highlights the content that users deem to be inappropriate, has been tweaked and improved. Keep up with Teritori's [hackerspace journey here](https://github.com/gnolang/hackerspace/issues/7).\n\n### Berty\n\nBerty has already completed the first phase of the project and published the [technical proposal](https://github.com/gnolang/gnomobile/issues/15) to develop the Gno mobile framework. The team is now busy with the second phase of implementing the proposal and the gRPC interface, which is working with the local socket on Android and iOS. Jeff has been trying to use Amino, and, now that Iuri is back from vacation, the team will work on improving other parts of the interface. Check out their latest [demo](https://www.loom.com/share/c0f68f707d3e47089c2fdbd2698fc92f), which shows an example user interface with wallet functions and blockchain communication. \n\nOnbloc has laid the foundations for Gno mobile apps with the Adena mobile wallet, so Berty will use some of this code in the mobile framework and work with Onbloc to ensure a similar user experience across all Gno apps.\n\n### Flippando\n\nDragos, the developer behind new grantee Flippando, is an experienced mobile app developer. Flippando is a simple on-chain memory game, which is currently written in Solidity and deployed on several testnets, including Goerli, Polygon, Near, Aurora, Evmos, and a Saga chainlet. Fippando started as a project for Dragos to learn Solidity but has already been the winner of two hackathons in Korea. It can be deployed relatively easily on any machine and is currently being ported to Gno.land. Dragos is exploring which user intersection can be more beneficial for this and will show us a demo in the coming weeks. Soon, we'll have two gaming dApps on Gno.land – Flippando and GnoChess! Read about Flippando in the [hackerspace journey](https://github.com/gnolang/hackerspace/issues/33).\n\n### New Contributor Joseph Kato \n\nWe have a new contributor to Gno.land who showed a demo last month of what he's been working on, a language server to run tests and scripts. Joseph is a major Go fan looking to get into web3 and was super excited to come across Gno. While interacting with Gno.land, he found many IDE-like features that he missed when working on files, so he decided to work with an LSP implementation—gnols—with the goal of making these features available to all contributors regardless of editor preference, starting with Sublime Text and Neovim and moving on to IntelliJ, Golang, and Emacs. This is a welcome addition for anyone who has ever developed a realm in Gno. Check out his [hackerspace](https://github.com/gnolang/hackerspace/issues/34) page for more details. \n\n## DappCon, Berlin\n\nManfred was back in Berlin in September at the Radial System presenting 'Gno.land: The Key To Perpetual Transparency,' where he discussed how Gno.land offers a familiar, seamless experience for code sharing and a sustainable and transparent path for blockchain development. \n\n## Web3 Family\n\nCore dev Miloš Živković gave a talk at Web3 Family in Barcelona last month, 'Gno.land and Gnolang: The Dynamic Duo of Blockchain Development.' He presented a brief history of smart contract development and the issues associated with existing platforms, such as limitations in design and security. He introduced Gno and showed how we make web3 accessible and blockchain development more intuitive and secure. Catch the [talk here](https://www.youtube.com/watch?v=0K-jr_Ad3bI).\n\n## GopherCon 2023\n\nGno.land was out in force at GopherCon 2023 with a well-stocked booth at the conference and an awesome workshop building a web3 chess server on Gno.land. Both Manfred and Jae were at the booth championing Gnolang to Gophers, and we received a lot of positive feedback, some new contributions, fresh PRs, and exposure for Gno.land in web2 circles. It was also a fabulous chance for the team to meet for valuable face-to-face time.\n\nThat's all for now! Be sure to check back again with us for the next edition of The More You Gno to keep up with all our progress.\nDo you want to contribute to Gno.land's monthly updates? If you're building on Gno.land and want to highlight your development, project, event, or idea, let us know, and we'll include your contribution.\n","2023-10-10T13:37:00Z","christina","gnoland,gnovm,tm2"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["funding-program-23q3","Gno.land Funding and Grants Program - Progress So Far","\n\n# Quarterly Report: Q3 2023\n\nWe launched the [Gno.land Funding and Grants](https://github.com/gnolang/ecosystem-fund-grants) program in July 2023 to encourage talented and passionate developers to interact with Gno.land, help build core infrastructure and tooling, and enhance the usability of the platform. After establishing a review process to streamline the program and identify core areas that need the most work, we ran with our first cohort of grantees in Q3, awarding four grants from a total of seven submissions (to two teams and two individuals). Full details of grant submissions, scope, and funding can be found on GitHub, but here’s a summary of the program’s progress so far and what’s coming up in Q4.\n\n## Q3 Funding Breakdown\n\nThe total grants distribution for Q3 was **$563,595** over the four grants: Teritori, Berty, Zack Scholl, and Flippando. This work has been split over two main large-scale infrastructure products (the Gno Moderation DAO, and GnoMobile), a gaming application, and our first resident tinkerer (Zack), who is experimenting with Gno and developing Proof of Concepts using it. Each grant recipient was provided with milestones for deliverables and has kept track of their progress through regular syncs, hackerspace journeys, blog posts, and developer calls. \n\n### Teritori (delivered September 2023)\n\nTeritori blockchain and multi-chain hub allows IBC and non-IBC communities to connect, create groups, exchange tokens and NFTs, and launch new projects. The Teritori team has solid experience building social dApps, marketplaces, NFTs, collectibles, and interfaces to encourage community interaction. For the Gno.land Grants and Funding program, Teritori was tasked with building a Moderation DAO to enable effective and fair content moderation in a decentralized and permissionless environment. \n\nThe Moderation Module is a smart contract ‘realm’ that enables a DAO to manage the daily moderation of forums or social threads through blockchain decision-making, supporting the vision of a censorship-resistant platform that fosters a safe space for open debate and discussion. Find detailed updates on Teritori’s [hackerspace issue 7](https://github.com/gnolang/hackerspace/issues/7), and watch out for upcoming blogs on Gno.land.\n\n### Berty Technologies (delivery Dec 2023)\n\nBerty private messaging app was allocated a grant to build a mobile version of Gno.land, implementing the WESH protocol (available by Bluetooth, local WIFI, or other means), and providing secure censorship-resistant communication between devices. Berty’s experience in off-grid communication is invaluable to Gno.land, and the team is an expert at running Go on mobile Android and iOS operating systems. For this grant, to be completed in Q4, Berty will deliver a minimal PoC of the existing apps of Gno.land running on mobile, and deliver an open-source mobile app with basic CI/CD, interacting with the Gno.land testnet. Find detailed reports and updates on Berty’s [hackerspace issue 28](https://github.com/gnolang/hackerspace/issues/28) or within their [Gnomobile blog post](https://test3.gno.land/r/gnoland/blog:p/gnomobile).\n\n### Flippando (delivery Nov 2023)\n\nFlippando is a multi-level on-chain memory game currently written in Solidity and deployed on several testnets, including Goerli, Polygon, Near, Aurora, Evmos, and a Saga chainlet. Like the classic card-based Memory game, Flippando players must match card pairs (digital tiles). When a player selects a tile, the game sends a request to the chain, which sends back the uncovered tile. If two tiles match, they remain uncovered. If they don’t match, they are flipped back until the game is won, and an NFT is generated for the winning player to prove the win. Through the development of a simple gaming app on Gno.land, we want to show how easy it is for gaming and metaverse concepts to be built. Through this grant, Flippando will port its memory game to Gno. Find detailed updates on Flippando’s [hackerspace issue 33](https://github.com/gnolang/hackerspace/issues/33).\n\n### Resident Tinkerers Program: Zack Scholl (6 months)\n\nZack Scholl is Gno.land’s first resident tinkerer with tons of experience in web2 development and a passion for the Go language. Through the grants program, Zack aims to translate his extensive knowledge to Gno and web3 by developing PoCs using Gno. So far, Zack has worked on a microblogging app for Gno.land and a prototype for using generative audio with smart contracts. He’s also creating documentation and tutorials to help other developers follow his lead. You’ll be hearing more from Zack over the coming weeks. Follow his [hackerspace issue 2](https://github.com/gnolang/hackerspace/issues/2) journey for more details.\n\nAfter a great start to the Funding and Grants Program in Q3, below is a breakdown of the percentage of funding allocated to each area of development so far:\n \n[![Funding](https://gnolang.github.io/blog/2023-10-17_funding-program-q3/src/thumbs/funding.png)](https://gnolang.github.io/blog/2023-10-17_funding-program-q3/src/funding.png)\n\n## Coming Up in Q4 and Q1 2024\n\nWe’re looking forward to more exciting developments in the coming quarters as we focus on the road to mainnet. Onbloc, one of Gno.land’s most active contributors, is currently being confirmed as a [Q4 grantee](https://github.com/gnolang/ecosystem-fund-grants/pull/4/files#diff-6dbd2e305897910e59072f9efa8c537d86f8aa281eb3742e0c150048a1df95eb) to work on core infrastructure necessary for mainnet, including tm2-js and gno-js support, GnoVM debugging, contract interactions, and leading the multi-node testnet initiative. Onbloc has already developed essential public infrastructure tools for Gno.land, including the non-custodial Adena wallet, the Gnoscan blockchain explorer, and Gnoswap decentralized exchange. The team has demonstrated immense passion and dedication in attending public developer calls and in-person events, and releasing extensive documentation, blog series, and [hackerspace issue 29](https://github.com/gnolang/hackerspace/issues/29) about their journey. \n\nOver the next two quarters, the Grants program will focus on building our tinkerer and student cohorts, and publishing more content, such as application libraries, documentation, and Gno packages. The goal is twofold: to support more users and ensure a diversified set of users on the Gno.land platform testing, debugging, troubleshooting, and running user feedback loops. We currently have two apps to reference on how to get started – GnoChess, built by the Gno core team, and Flippando, a grant recipient – we’re looking for a lot more to come. \n\nWe’re steadily building out the Gno.land platform, and our ecosystem of grantees and contributors. Let us know if you want to join us by submitting an application any time on the Funding and Grants [repository](https://github.com/gnolang/ecosystem-fund-grants). We’re opening up our second grant batch this month, and look forward to reviewing your submissions. \n","2023-10-17T13:37:00Z","christina,michelle","gnoland,funding,grants"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["gnoland-moderation-dao-module","Gno.land Moderation DAO Module","\r\n# Gno.land Moderation DAO Module\r\n*This blog post is written by the Teritori team, whose focus is to allow organizations to communicate and interact in a resilient and transparent way. Teritori is a partner and grantee of Gno.land.*\r\n\r\nWhen it comes to the complex subject of discussion forums and decentralized social networks, numerous technical and philosophical questions arise.\r\nImagining a 24/7 online communication system whose administration cannot be compromised or censored by any entity or individual is one of the most intriguing challenges of the decade.\r\nApproximately 10 months ago, the Teritori core team decided to explore the new possibilities offered by Gno.land on the theme of decentralized moderation and to build the foundation for future generations of developers to create resilient, robust, and autonomous applications.\r\n\r\n## The vision\r\n\r\n### About Teritori\r\n\r\nTeritori is a decentralized Operating System for individuals \u0026 communities that allows organizations to communicate and interact in a resilient and transparent way. Its core components include the creation of a decentralized User Profile for individuals \u0026 organizations as well as a dApp Store allowing users to pick their favorite services for daily usage and developers to list their product in order to grow their user base. Finally, Teritori backbone, its P2P messenger application that will enable users to create resilient token-gated groups in a click will even allow non-crypto-native users to get onboard as this feature doesn't even require a wallet connection to get started.\r\n\r\n### Teritori \u003c\u003e Gno.land\r\n\r\nConvinced of the benefits of offering a contribution-based consensus model and taking advantage of an interpreted version of Golang, the Teritori core team aims to become one of the most prolific contributors to Gno.land. Our plan is to focus on features that enable the coordination of organizations and individuals via governance, communications, and collaboration. Eventually, all the features listed on Teritori will be accessible in the Gno.land network, contributing to the growth of the ecosystem.\r\n\r\n### PoC and iterations\r\n\r\nAnother important point to emphasize is that the Teritori core team intends to improve the features it deploys on Gno.land by taking advantage of the user test phases to collect feedback that will enable iteration and improvement of the service. As a result, the “Proof-of-Concept” (“PoC”) presented in this article will be subject to updates and evolutions, which will be communicated in due course, as will the associated test phases.\r\n\r\n## What is the Gno Moderation Module?\r\n\r\nThe Gno Moderation Module is a smart contract (“realm”) that enables a decentralized, autonomous organization (DAO) to manage the moderation of a forum or social thread through a transparent on-chain vote.\r\n\r\n### Let’s take an example:\r\n\r\nImagine a simple social network similar to Instagram, in which all content is decentralized (using IPFS for images, videos, music etc.). For each post, users sign in via their wallet to post content, and no centralized administrator can delete this content. The freedom offered by this type of decentralized application is immense since even as developers of the application, it is impossible to delete the content. Therefore, we can consider this “space of freedom” as a “common space” unlike any application owned by a private company and hosted on centralized infrastructure.\r\nWith this radical freedom for the user comes a great responsibility— to collectively ensure the security of this space rather than delegating the responsibility to moderators employed by a commercial enterprise. This is why we’ve created the “Gno Moderation Module.”\r\n\r\n### How does it work?\r\n\r\n[![moderation_flow v0.1](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/thumbs/moderation_flow_v0.1.png)](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/moderation_flow_v0.1.png)\r\n\r\nThe Gno Moderation Module allows users to notify the moderation DAO community that they wish to report content. Through this action (permitted by the smart contract), they inform the DAO community that the content is inappropriate.\r\n\r\n[![content flag](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/thumbs/content_flag.png)](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/content_flag.png)\r\n\r\nOnce the content has been reported a certain number of times (10 times in this PoC) by users (who may or may not be members of the Moderation DAO), an on-chain proposal is automatically created.\r\n\r\n[![moderation dao feed](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/thumbs/moderation_dao_feed.png)](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/moderation_dao_feed.png)\r\n\r\nThis on-chain proposal is then listed in the Moderation DAO tab on the Social Feed as well as on the Moderation DAO profile proposals feed so all Moderation DAO members can vote on it. A debate can take place to discuss the best choice for the content.\r\n\r\n[![moderation dao vote](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/thumbs/moderation_dao_vote.png)](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/moderation_dao_vote.png)\r\n\r\nModeration DAO members have three voting options:\r\n- Ban the content in question\r\n- Abstain\r\n- Do not ban the content in question\r\n\r\nOnce the required vote quota has been reached, the contract automatically executes the voted decision.\r\n\r\n## The Current Status:\r\n\r\nThe Teritori core team received a grant from the Gno.land core team to build the necessary tools for decentralized moderation.\r\n\r\nTo accomplish this task, we divided our work into five main stages:\r\n1. Build “DAO” standards to establish the fundamental building blocks and ensure a modular approach in the long term for various tools.\r\n2. Build a “DAO” deployer that allows non-tech users to easily utilize the different standards.\r\n3. Build a customizable Moderation Module that can cater to a wide range of use cases. For example, if we replace the social feed with a service marketplace, the Moderation Module can transform into a “Justice Module” that resolves conflicts between sellers and buyers on a decentralized platform and serves as an escrow system.\r\n4. Develop the user experience that allows for large-scale experimentation with the Moderation Module within a dedicated context of an active social feed. Here, we created a social feed realm and enabled non-developer Gno.land users to participate in the full-scale experience.\r\n5. Establish interactions between smart contracts (r/boards, r/socialfeed, /r/users), conduct experiments to enhance their security, and identify emerging needs for these innovative use cases.\r\n\r\n### What does a DAO realm look like?\r\n\r\n- We decided to build two different DAO standards, using two different approaches of modularity:\r\n- Aragon DAO Standard, based on the amazing work of [the Aragon team](https://aragon.org/) (using Solidity)\r\n- [DAODAO](https://github.com/DA0-DA0) smart contract, using CosmWasm, that allows more modularity.\r\n\r\n\r\nHere is an example, with the DAODAO contract ported into Gnolang:\r\n[Source](https://testnet.gno.teritori.com/r/demo/dao_realm_v6/dao_realm.gno)\r\n\r\n```go\r\npackage dao_realm\r\n\r\nimport (\r\n\t\"encoding/base64\"\r\n\t\"std\"\r\n\t\"strings\"\r\n\t\"time\"\r\n\r\n\tdao_core \"gno.land/p/demo/daodao/core_v16\"\r\n\tdao_interfaces \"gno.land/p/demo/daodao/interfaces_v16\"\r\n\tproposal_single \"gno.land/p/demo/daodao/proposal_single_v16\"\r\n\tvoting_group \"gno.land/p/demo/daodao/voting_group_v17\"\r\n\t\"gno.land/p/demo/ujson_v5\"\r\n\t\"gno.land/r/demo/groups_v22\"\r\n\tmodboards \"gno.land/r/demo/modboards_v9\"\r\n)\r\n\r\nvar (\r\n\tdaoCore dao_interfaces.IDAOCore\r\n\tmainBoardName = \"dao_realm\"\r\n\tgroupName = mainBoardName + \"_voting_group\"\r\n\tgroupID groups.GroupID\r\n)\r\n\r\nfunc init() {\r\n\tmodboards.CreateBoard(mainBoardName)\r\n\r\n\tvotingModuleFactory := func(core dao_interfaces.IDAOCore) dao_interfaces.IVotingModule {\r\n\t\tgroupID = groups.CreateGroup(groupName)\r\n\t\tgroups.AddMember(groupID, \"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c\", 1, \"\")\r\n\t\tgroups.AddMember(groupID, \"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv\", 1, \"\")\r\n\t\tgroups.AddMember(groupID, \"g14u5eaheavy0ux4dmpykg2gvxpvqvexm9cyg58a\", 1, \"\")\r\n\t\tgroups.AddMember(groupID, \"g1ckn395mpttp0vupgtratyufdaakgh8jgkmr3ym\", 1, \"\")\r\n\t\tgroups.AddMember(groupID, std.GetOrigCaller().String(), 1, \"\")\r\n\t\treturn voting_group.NewVotingGroup(groupID)\r\n\t}\r\n\r\n\tproposalModulesFactories := []dao_interfaces.ProposalModuleFactory{\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.IProposalModule {\r\n\t\t\ttt := proposal_single.Percent(100) // 1%\r\n\t\t\ttq := proposal_single.Percent(100) // 1%\r\n\t\t\treturn proposal_single.NewDAOProposalSingle(core, \u0026proposal_single.DAOProposalSingleOpts{\r\n\t\t\t\tMaxVotingPeriod: time.Hour * 24 * 42,\r\n\t\t\t\tThreshold: proposal_single.Threshold{ThresholdQuorum: \u0026proposal_single.ThresholdQuorum{\r\n\t\t\t\t\tThreshold: proposal_single.PercentageThreshold{Percent: \u0026tt},\r\n\t\t\t\t\tQuorum: proposal_single.PercentageThreshold{Percent: \u0026tq},\r\n\t\t\t\t}},\r\n\t\t\t})\r\n\t\t},\r\n\t}\r\n\r\n\tmessageHandlersFactories := []dao_interfaces.MessageHandlerFactory{\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\treturn groups.NewAddMemberHandler()\r\n\t\t},\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\treturn groups.NewDeleteMemberHandler()\r\n\t\t},\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\t// TODO: add a router to support multiple proposal modules\r\n\t\t\tpropMod := core.ProposalModules()[0]\r\n\t\t\treturn proposal_single.NewUpdateSettingsHandler(propMod.Module.(*proposal_single.DAOProposalSingle))\r\n\t\t},\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\treturn modboards.NewCreateBoardHandler()\r\n\t\t},\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\treturn modboards.NewDeletePostHandler()\r\n\t\t},\r\n\t}\r\n\r\n\tdaoCore = dao_core.NewDAOCore(votingModuleFactory, proposalModulesFactories, messageHandlersFactories)\r\n}\r\n\r\nfunc Render(path string) string {\r\n\treturn \"[[board](/r/demo/modboards:\" + mainBoardName + \")]\\n\\n\" + daoCore.Render(path)\r\n}\r\n\r\nfunc VoteJSON(moduleIndex int, proposalID int, voteJSON string) {\r\n\tmodule := dao_core.GetProposalModule(daoCore, moduleIndex)\r\n\tif !module.Enabled {\r\n\t\tpanic(\"proposal module is not enabled\")\r\n\t}\r\n\tmodule.Module.VoteJSON(proposalID, voteJSON)\r\n}\r\n\r\nfunc Execute(moduleIndex int, proposalID int) {\r\n\tmodule := dao_core.GetProposalModule(daoCore, moduleIndex)\r\n\tif !module.Enabled {\r\n\t\tpanic(\"proposal module is not enabled\")\r\n\t}\r\n\tmodule.Module.Execute(proposalID)\r\n}\r\n\r\nfunc ProposeJSON(moduleIndex int, proposalJSON string) {\r\n\tmodule := dao_core.GetProposalModule(daoCore, moduleIndex)\r\n\tif !module.Enabled {\r\n\t\tpanic(\"proposal module is not enabled\")\r\n\t}\r\n\tmodule.Module.ProposeJSON(proposalJSON)\r\n}\r\n\r\nfunc getProposalsJSON(moduleIndex int, limit int, startAfter string, reverse bool) string {\r\n\tmodule := dao_core.GetProposalModule(daoCore, moduleIndex)\r\n\treturn module.Module.ProposalsJSON(limit, startAfter, reverse)\r\n}\r\n```\r\n\r\n### Public Grant Report:\r\n\r\nYou can find the full report of [Teritori Core’s journey here](https://github.com/gnolang/hackerspace/issues/7). \r\n\r\n### Resources:\r\n\r\nDocumentation:\r\n- [Gno Moderation DAO](https://github.com/TERITORI/gno/blob/teritori-unified/examples/gno.land/r/demo/teritori/MODERATION_DAO.md)\r\n\r\nPackages:\r\n- [https://testnet.gno.teritori.com/r/demo/groups_v22](https://testnet.gno.teritori.com/r/demo/groups_v22)\r\n- [https://testnet.gno.teritori.com/p/demo/daodao/interfaces_v16](https://testnet.gno.teritori.com/p/demo/daodao/interfaces_v16)\r\n\r\nTutorial:\r\n- [Gno.land Social Feed Moderation on Teritori](https://teritori.gitbook.io/teritori-whitepaper/gno.land/introducing-gno.land-social-feed-v0.1#social-feed-moderation)\r\n","2023-10-19T01:50:00Z","ferrymangmi,zxxma,michelleellen","gnoland,dao,moderation,teritori"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["wyg-dongwon-shin","Who You Gno – On the Record with Dongwon Shin","\n*Who You Gno is intended to shine a light on the builders, contributors, and generally brilliant humans behind the tech. We’re excited to kick off this series with Dongwon Shin, the co-founder and CEO of one of Gno.land’s longest-contributing teams, Onbloc, a South Korean-based blockchain software company that builds key infrastructure and tooling for Gno.land*\n\nSince embarking on their Gno journey in late 2021, Dongwon and his team have been among the most active gnomes embodying the values of the Gno project: hardworking, passionate, honest, and humble, to name a few. You may already be familiar with Onbloc’s projects [Adena](https://adena.app/), [Gnoscan](https://gnoscan.io/), and [Gnoswap](https://github.com/gnoswap-labs) more about this can be found in [Onbloc's Hackerspace journey](https://github.com/gnolang/hackerspace/issues/29). In this interview, we’ll get the latest updates on these projects, hear about Dongwon the person, and learn more about what motivates him to be a gnome. Check it out.\n\n## Dongwon’s life before coding\nIt’s a cold November morning in Seoul, and Dongwon is in the office early after sleeping just a few hours. Speaking to him from Dubai, where “cool” is 30 ℃, it’s -1 ℃ in Korea. “I hope you’re keeping warm,” I smile, “Yeah,\" he laughs, “it’s not too bad.” Dongwon’s been in the industry since 2015 when web3 was still called “crypto,” ICOs were selling snake oil, and his compatriots were busy paying above the market price for bitcoin in a phenomenon called the “Kimchi premium.”\n\nAt the time, he was traveling the world as a professional e-sports gamer which saw him leaving Korea and living in San Francisco and L.A. for several years. “I had lots of tournaments to compete in, so I had to travel to many other countries,” he says, “while traveling, I learned about other cultures and people, and new experiences. It was really eye-opening, you know, it really helped make me who I am today.”\n\nAnd who is Dongwon today? \n\nAmbitious, driven, and one of the kindest, most genuine people you could ever meet. “I like challenges, and I’m very competitive,” he says. “I can't just do regular jobs. I get bored quickly, so I need to find something very competitive and hard that makes me stressed.” I point out that he’s in the right place, and he laughs. He explains that he used to spend an entire week, sometimes two, learning a game before a tournament, almost around the clock. “I had to put everything I have into winning that game, right?” He views working in web3 the same way.\n\n## The intersection between e-gaming and blockchain\nDongwong is clearly comfortable on the cutting edge in emerging industries that “are often looked down on,” like e-gaming and crypto. He takes great satisfaction in how they’ve both grown. “My parents were saying, 'Just go study,' while I was playing games, but e-sports has grown a lot. Right now, the industry is really big, and it's kind of the same with crypto.” He adds, “I like getting in early when other people are not interested and finding an opportunity there.”\n\nWhen looking to retire as a professional gamer, he found his home right away in web3, working with a blockchain consultant and the sports and entertainment-focused [Chiliz project](https://www.chiliz.com/), before launching his own blockchain consulting and development firm. “I didn't think I was going to be just a regular employee for a big company. So I wanted to start my own business,” he says.\n\n## Getting to Gno… Gno.land\nHow did Dongwon hear about Gno.land? \n\n“My co-founder, Peter, and I were long-time followers of the Cosmos ecosystem, and we found out that Jae was working on a new project called Gno.land in late 2021. We really liked the vision behind Gno.land, why he started, and what he wants to achieve. We value transparency, fairness, and censorship resistance, so we read all the documentation and his initial codebase and decided we should be part of his new initiative. We started Onbloc in early 2022.”\n\nDongwon didn’t know Jae personally, but he felt strongly aligned with his vision and what Gno.land aims to achieve. Also, his reputation as the founder of Tendermint and Cosmos preceded him. Dongwon’s co-founder, Peter, was also working on a project called Lunagram, a Cosmos wallet integrated with Telegram. Peter had fond memories of Jae, being very supportive of experimental projects, including his own, in the early days of Cosmos.\n\n## Building tools… Adena, Gnoscan, Gnoswap\nOnbloc has since become Gno.land’s most prolific contributor, launching the [Gnoscan](https://gnoscan.io/) block explorer and the [Adena](https://adena.app/) wallet, as well as creating tutorials and blogs to help onboard developers to Gno, and creating Gno.land’s first AMM DEX Gnoswap, the beta version of which is estimated for December this year. “Currently, the team is focused on developing Gnoswap, integrating [the realms and APIs](https://github.com/gnoswap-labs/gnoswap) with [the interface](https://github.com/gnoswap-labs/gnoswap-interface), enhancing the swap function and liquidity pools, and some additional features. We expect to launch the beta in about a month, so we’re quite excited!”\n\nAs for Adena, the defacto Gno.land wallet, “It's already production-ready, but we want to improve our UX, and UI to provide more secure ways of using a web3 wallet.” To achieve this, Onbloc is adding a feature called [Air-Gap](https://en.wikipedia.org/wiki/Air_gap_(networking)) which allows the wallet to be used in an offline environment, without the user needing to import their keys to Adena. “They can just use Adena as a broadcaster,” Dongwon explains. “I think this kind of feature is needed for enhancing security and educating people to use noncustodial products in a secure way.”\n\nOnbloc is also a [Q4 2023 grantee](https://test3.gno.land/r/gnoland/blog:p/funding-program-23q3) and will develop core Gno.land infrastructure in preparation for mainnet. “We are working on three key features,” Dongwon explains. “The first is contract interaction. So it's a way for a realm to interact with other realms. The second is porting essential Go packages to Gno, and the third is a multi-node testnet.” All in addition to Onbloc’s continued efforts on Gnoswap, Gnoscan, and Adena. “You’re keeping busy, then?” I ask. “All our hands are full now,” he laughs.\nI ask what he does in his free time and – in fact – whether he has any. “Not much,” he jokes, “but I like spending time with my son and playing board games together. He’s seven years old, and we are like friends.” Dongwon also likes to unwind by reading books when his son is asleep. One of his favorites is [*The Secret*](https://en.wikipedia.org/wiki/The_Secret_(Byrne_book)); he was “really inspired by the concept” when he was younger. I ask if he sees it working in his daily life and whether he believes he manifests what he wants into existence, “Definitely,” he replies without hesitation.\n\n## Dongwon’s conviction in Gno.land\nNot only is Dongwon working night and day, but he has bootstrapped his team from his own pocket to go all in on Gno.land. What makes his conviction so strong? “I truly believe that the Gno.land blockchain is the next generation of the blockchain industry. Gno.land is trying to invite web2 developers into web3 and providing all these developer-friendly tools so they don't need to learn a new language to get into the ecosystem. GnoVM, Tendermint2, everything is so transparent and simple.”\nHe believes Gno.land will be “one of the greatest experiments in the crypto industry” thanks to its fair rewards and contribution-based governance. “I'm really excited about this initiative, and all our team members are well-aligned to support this vision. We want to do our part to achieve the success of Gno.land.”\n\nI thank him for his time and ask if there’s anything he would like to add. He pauses for a moment and then says, “If you're building a dApp or looking for a new opportunity in a new ecosystem, I think this is your chance. I hope to see great developers and teams getting into Gno.land. Let’s make this ecosystem great together.”\n","2023-11-24T00:00:00Z","christina","whoyougno,onbloc,community,interview"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-6","The More You Gno: Gno.land Monthly Updates - 6","\n\nWelcome to the latest edition of The More You Gno, your regular source of updates from the Gno.land core team and contributor ecosystem. There’s a lot to cover this month, from a company engineering retreat to new core members and contributors. We’ve made progress across the board to fix important bugs and issues and provide additional features. There’s a new way to dynamically call realms, Gno.land’s tokenomics and governance are advancing, our standard library list is expanding, and our grantees are killing it with their deliverables. Without further ado, let’s dive in.\n\n## Gno Core Team Updates - TL;DR\n\nOnly got time to skim the updates? You’ll find the highlights in the list below. If you want to dive deeper into the topics, track our progress, understand the rationale behind our decisions, or explore the issues we came across, grab a coffee, kick back, and savor the full details.\n\n* **The Portal Loop** – Much of our focus over the past few months has been on the Portal Loop [(issue 1108)](https://github.com/gnolang/gno/issues/1108), which will make developing on Gno smoother, faster, and more intuitive. The Portal Loop will speed up deploying dApps and improve the UX for Gno.land devs.\n\n* **Dynamic Realm Caller** – We’ve added a new way to call realms dynamically so that dApps no longer have to manually import GRC20/721 tokens [(PR 1262)](https://github.com/gnolang/gno/pull/1262).\n\n* **DAO Structure \u0026 Tokenomics** – We’re close to finalizing the DAO structure of Gno.land and its tokenomics. There will be three main DAOs, GovDAO, EvaluationDAO, and SupportDAO. We’re exploring staking options for GNOT holders and working on transaction fees and gas.\n\n* **Gno Playground** – Gno Playground is an awesome way for developers to collaborate, share, and test their code. The full version isn’t ready yet, but we’re sharing the beta with anyone who wants to help us iterate and improve this week.\n\n* **Gno Standard Libraries** – In [issue 1267](https://github.com/gnolang/gno/issues/1267), you can find our current wishlist for Gno standard libraries. If you want to see what we have and what’s lacking, or you want to contribute, open an issue or a PR.\n\n* **Gno Language Server (Gnols)** – An implementation of the [Language Server Protocol (LSP)](https://microsoft.github.io/language-server-protocol/) for Gno, Gnols makes writing code simpler and works with several editors. Visit the [CONTRIBUTING.md file](https://github.com/gnolang/gno/blob/master/CONTRIBUTING.md#vim-support-with-lsp) to try it out.\n\n* **RustVM Implementation** – The RustVM implementation is almost ready and is in the debugging stages. We’re also looking at adding a Jit compiler and researching the topics of determinism and concurrency.\n\n* **Bytecode Go VM Implementation** – The Parscan project is progressing well toward completion of the spec. We look to provide support for interfaces in the interpreter by extending the standard reflect package, also to the benefit of the entire Go community.\n\n### Engineering Retreat\nGno core engineering team got together last month in our first company-wide retreat. It was an invaluable opportunity to work face-to-face, brainstorm ideas, code together, and fix several high-level concerns. We made many improvements to the technical aspects of the project, including major advances on the Portal Loop, and strengthened our alignment through team bonding activities, socializing, and having fun. \n\nWe made multiple bug fixes and resolved many of the issues that arose out of [GnoChess](https://github.com/gnolang/gnochess) development, and Manfred and the Onbloc team (who joined us on the retreat) demonstrated a new way to dynamically call contracts using dependency injection with a registry. This, combined with Golang's interface capabilities, can achieve a good balance between dynamism, explicitness, and security (including type safety). This pattern could enable massive DeFi applications when used with GRC interfaces. It could also support contract-based DAOs where features can be added later, opening the door to new design patterns around contract upgrades. Check out [PR 1262](https://github.com/gnolang/gno/pull/1262) for more details. \n\nIt was invaluable for everyone to get plenty of 1:1 time with Jae. Morgan was able to bring the Native Bindings topic ([PR 859](https://github.com/gnolang/gno/pull/859)) much closer to completion. This has been a recurring theme in our developer calls for the last few months as it’s a complex topic that aims to change how Gno can use Go code while still being understood by static analysis tools like gno doc. Michael got greater clarity over the DAO structure and GNOT tokenomics, Milos was able to merge [PR 546](https://github.com/gnolang/gno/pull/546), after many months of effort, which adds file-based transaction indexing, and Thomas created instructions for getting started with the Gno Language Server (gnols), to give just some examples. It was productive and enjoyable and unblocked many issues. \n\nAiB engineers were also at the retreat, Zooma from Teritori, and Dongwon, ByeongJun, and Ray from Onbloc, creating plenty of opportunities for interesting discussions and showcasing our work. We also welcomed new core members Dylan and Danny to the team. Dylan is a senior software engineer, and Danny is supporting DevEx. We enjoyed meeting and hacking together with like-minded people and would like to do it more often with a broader audience. How about a Gnome contributor festival next year? Stay tuned.\n\n### Gno.land DAOs and Tokenomics\nThroughout the retreat and ongoing, we’ve made major advances to the DAO structure for Gno.land and the tokenomics of the chain. We’re still hammering out the final details, but we’ve decided on three main DAOs – GovDAO, EvaluationDAO, and SupportDAO – that will work together alongside other domain-specific DAOs, such as EngineeringDAO or ProjectsDAO, making Gno.land more decentralized over time. \n\nThe multi-tiered GovDAO will be responsible for voting on all decisions that affect the chain, such as parameter changes or validator acceptance/denial. GovDAO members will assess new contributors to the chain and allocate them a score and corresponding membership tier. EvaluationDAO will assist with specific contributions, lending its expertise and critic reviews as needed. SupportDAO will provide knowledge-specific services such as HR, marketing, and finance.\n\nRegarding transaction fees, we're exploring something similar to how Ethereum deals with gas in its EIP 1559 update. Essentially, a combination of comparing a new block’s size with the last block to gauge demand and some small parameters we’re looking at. We’re also experimenting with staking alternatives where contributors can stake their tokens to support certain projects in return for staking rewards. It’s still early days, so watch this space. We’ll be releasing more details soon. \n\n### Gno Playground\nGno Playground is a simple web interface that lets you share your code, run unit tests, deploy your realm and package, and execute functions in your code using the repo for a smoother and more collaborative developer experience. We’re excited to release Gno Playground out in the wild later this month in a soft launch set for November 28. If you’re interested in testing it out, head over to our Discord channel. We’re looking for feedback and help to identify bugs and improve the UX before its full launch in the new year. It will be interesting to see how people interact with the Playground and how they use it so we can iterate and attract more gnomes to our growing community.\n\n### The Portal Loop\nThe Portal Loop is an effort to create a continuously-deployed staging testnet to be hosted on the official [gno.land website](https://gno.land). The testnet will be reset at each commit on our repository, but it will re-play all the transactions from its previous version, dropping any that might fail following breaking changes in the code. The Portal Loop will provide a central place where you can experiment with the latest Gno.land updates, resolving the problem our existing testnets have faced (becoming stale only a few months after their launch) while also paving the way for building DAOs and on-chain Game of Realms and Proof-of-Contribution systems. \n\nWithin the Portal Loop efforts, we’re also building systems to more efficiently iterate locally on your Gno realms, similar to the previously described testnet. The Portal Loop will help to create an iterative cycle focused on development, testing, and feedback, enhancing local development and the Gno.land website. As developers are discovering, when building dApps like GnoChess, GnoMobile, or Flippando, they run into issues with the repo, GnoVM, and client libraries when developing locally.\n\nThe Portal Loop will enable much quicker feedback so we can iterate, uncover, and fix problems faster. Devs will get a greatly improved UI, with UX contributions and issues much easier to resolve, and the same CI/CD experience as web2 applications, where each time something is published on Git, they get instant feedback on how it works in staging, not only in terms of code but also in terms of data. Stay tuned, the Portal Loop is coming soon!\n\n### Standard Library Wish List\nThe standard library wish list in [issue 1267](https://github.com/gnolang/gno/issues/1267) is intended to be a starting place for anyone who wants to add new standard libraries to Gno. It's an opinionated collection of libraries that we would like to see added. So, if you see something missing that you’d like added to our standard libraries, leave a comment explaining your reasoning. If you want to port over a standard library from the list, make an issue for it and assign yourself, or if you can do it quickly, make a PR referencing the issue. You can see the global status of our standard libraries (as compared to Go) on our [Go\u003c\u003eGno compatibility document](https://github.com/gnolang/gno/blob/d421b963aed7f7c3ba3718edfc6fbd787fa8f0dd/docs/reference/go-gno-compatibility.md).\n\n### Dreaming with SOGNO\nThe Sogno project is a [dream](https://www.wordreference.com/iten/Sogno) Morgan has about improvements he plans to make on GnoVM. From his experience working on GnoChess, he found that many features were lacking that would have improved the workflow, for example, an improved debugging system, enhanced representation of the values within the VM, having maps as sortable data structures, and adding reflection. Morgan plans to work on this project on the side as a fork when he has time, so Sogno won’t be merged into the master branch for now. If you want to check it out and see if you can contribute, visit the [hackerspace PR 44](https://github.com/gnolang/hackerspace/pull/44).\n\n### The Future of the Gno Language Server (Gnols)\nThe [Gno Language Server (gnols)](https://github.com/gno-playground/gnols) is an implementation of the [Language Server Protocol (LSP)](https://microsoft.github.io/language-server-protocol/) for the Gno programming language. It is similar to the equivalent “gopls” project for Go, as they can be plugged into your code editor through extensions and allow you to access handy features, such as autocompletion, formatting, and compile-time warnings/errors. Gnols makes writing code simpler, working with several editors to suit your preferences. To try it out, visit the [CONTRIBUTING.md file](https://github.com/gnolang/gno/blob/master/CONTRIBUTING.md#vim-support-with-lsp), which contains instructions to get you started. Our current documentation targets Vim, Neovim, and SublimeText, but can likely be used with any editor that supports LSP. Feel free to contribute to improving Gnols and adding more features. It’s well-written, and simple to dive into the code and add more capabilities.\n\n### RustVM Implementation\nPetar continues progressing on the RustVM implementation and has almost finished, apart from a few bug fixes. As the design is now complete, he will enter the testing stages. He is also looking at how to add a Jit compiler to the current design. Petar was initially concerned that the garbage collector might have presented serious issues, but this has turned out not to present a problem. Adding a Jit compiler will require a lot of work (at least six months) to support everything in the language, but it should be possible.\n\nPetar is also looking at implementing concurrency the way it is in Go to have a fully functional virtual machine as it is in the spec. This would likely attract more external contributors to developing the VM. One advantage of Rust is that, with the concurrency model, there is already an extensive library called [Tokio](https://tokio.rs/) which he can use. Petar stresses that this isn’t easy, but he believes it’s achievable, at least as a research topic around determinism and concurrency.\n\n### Go Bytecode VM Implementation\nMarc continues to develop Parscan, another bytecode VM, but entirely based on the Go runtime, with the advantage of reusing the type-checking system, concurrency model, and memory management already part of the existing Go runtime. In the last month, the support for all missing declaration statements (constants, variables, and types) was added in the code generator.\n\n## Grantee and Ecosystem Updates\nOur ecosystem partners and grantees are working flat out on their contributions. We’re close to seeing the on-chain memory game Flippando launch, Adena and Gnoswap are incorporating some major new features, Zack’s released another informative tutorial as part of the Go to Gno series, and we’ve received several new grant proposals as well. We’ve even welcomed a new contributing team, Varmeta, to the fold. Scroll through the details below.\nTL;DR?\n* On-chain memory game Flippando is coming soon\n* Gnomobile is almost complete and will be receiving a rebrand soon\n* Gnosocial will allow devs to experiment with social media dApps\n* Experiment with content moderation using the ModerationDAO or create your own DAO\n* Gnoswap AMM DEX beta will launch in December\n* Adena to implement new ‘Air-Gap’ feature\n* Varmeta is working on Gno.land Unity SDK to make Gno more accessible to game developers\n\n### Dragos\nDragos has been working on porting his on-chain memory game Flippando from Solidity to Gno, and we’re looking forward to playing it soon after seeing an awesome demo earlier this month. When you play Flippando, you uncover a matrix of matching visual symbols. There are 2 levels of difficulty (matrix made of 16 tiles or 64 tiles). For the launch, Dragos aims to have visual symbols containing basic colors, dice, hexagrams, or various gradients. Once you’ve matched all the pairs and completed a matrix, you mint an NFT that can be assembled as artwork on-chain and traded in a marketplace. Dragos is currently looking at the initial tokenomics for Flippando, with a fixed supply of 1 billion and no airdrop distribution (more details soon). \n\nDragos has been a mobile app developer for over 10 years, with an interest in blockchain for around seven years. He enjoys working with Gno, although having to reset the chain and redeploy programs each time he makes a change was a challenge. The Portal Loop solves these issues in local development and will allow him to deploy Flippando sooner. As part of the work for Flippando, Dragos also added [PR 1309](https://github.com/gnolang/gno/pull/1309) to improve our GRC721 implementation]. He is also applying for a grant to port his project management system on-chain for Gno, and he gave us a [demo](https://drive.google.com/file/d/1eJGyATHhEzletWwQ4Xt_9ON7L231Yvow/view). An on-chain project management tool will be essential for organizing the DAO system, focusing on our team’s needs, organizing tasks, setting goals, and more. Keep up with Dragos’ progress by visiting his [hackerspace](https://github.com/gnolang/hackerspace/issues/33).\n\n### Berty\nBerty has been powering ahead with Gnomobile (which will soon receive a new name to better reflect its functionality), Gnosocial, and Gno core. Some highlights include significant progress on the GRPC interface (see [demo video]https://www.loom.com/share/d1cef60199c0487e86deab2a9e61d61c). As the interface to Protobuf has many more data types available than the interface to the language bridge, GRPC greatly simplifies the app and improves the UX. The API is almost complete and now includes wallet functions, such as creating an account and restoring an account from the recovery phase, and an event stream when calling a realm function [(demo video available here)](https://www.loom.com/share/42f2dcb0b4a34f77a95a0f8012e4b52b).To help developers, Gnomobile also includes example apps. Here is a [demo video](https://www.loom.com/share/41a20a764f0f4caf91f068b62e1f16c4) of the latest minimal hello app.\n\nBerty created [PR 1235](https://github.com/gnolang/gno/pull/1235) relating to Amino. They start with a Go struct and add comments explaining all the fields. Previously, when they ran Amino and generated a Protobuf structure, all their comments disappeared. This PR allows them to preserve the comments. They also created [PR 1213](https://github.com/gnolang/gno/pull/1213) since Amino should create a Protobuf structure where the fields follow official naming conventions. Thanks to help from the Gno devs, these PRs are merged.\nBerty is also focused on building a decentralized social media application using the Gnomobile framework, which is almost complete. The aim is to create a testbed where dApp builders can see how their implementations integrate and function with web2-like social media features, opening the door to interesting experiments such as DAO collaboration and content modification. Berty is building a decentralized Twitter-like application and plans to finish it in six months. Check their progress on their [hackerspace here](https://github.com/gnolang/hackerspace/issues/28) and look for more upcoming demos.\n\n### Teritori\nTeritori has been focusing on Escrows in the past couple of months, aiming to make improvements that facilitate on-chain project management. The team is also iterating the Moderation DAO and has identified a need for a conflict solver module to call an external authority to solve a conflict between two parties (for example, the buyer and the seller). They have called this module the Conflict Solver Module and integrated several options like Justice DAO (composed of humans) or any realms (e.g. GnoChess) to solve the conflict. They are researching work on VRF to implement randomness so that the module selects a person (or group of people) with no conflicts of interest in the issue. [PR 11](https://github.com/TERITORI/gno/pull/11/files) provides more details. A true randomness function will also be handy for the Flippando game that doesn’t currently rely on true randomness. \n\nIn other news from Teritori, the moderation DAO is live! You can head to the [Teritori site](https://app.teritori.com/feed?network=gno-teritori) to play around with it and even try deploying your own DAO, creating a user profile, and adding a social feed. The team has deployed V1 of a “Soundcloud-like” app on the [Gnosocial feed](https://app.teritori.com/feed?network=gno-teritori) in which you can listen to music while browsing features, publish your own music as an artist that appears on your profile, comment on tracks, tip artists, and more. Keep updated with Teritori on their [hackerspace here](https://github.com/gnolang/hackerspace/issues/7).\n\n### Zack Scholl\nOur resident tinkerer Zack gave a workshop last month as part of his “Go to Gno” series called [Go to Gno: ByteBeat - Generating Audio with Smart Contracts](https://www.youtube.com/watch?v=lmmUIEHhdqA). This is a really interesting tutorial on how to build Bytebeat (a minimal programming language for synthesized music) with smart contracts and follows on from his microblogging workshop. Be sure to check it out. If you want to hear more about Zack, you can also watch [Getting to Gno with Zack Scholl](https://www.youtube.com/watch?v=LgXa7QCdxdA\u0026t=1258s), a Fireside Chat series that talks about contributors’ work, lives, and motivations to be on the Gno.land journey with us.\n\n### Onbloc\nAs always, the Onbloc team has been busy! Over the past few weeks, they have been working on extending the functionality of Gnoswap, integrating APIs and realms with the interface, improving the governance page UI, and integrating the Adena wallet. Onbloc expects to launch the beta of Gnoswap next month, and we’re super excited to see it in action. To improve the UX and UI of Adena and make the wallet even more secure, the team is implementing a feature called Air-Gap which allows the wallet to broadcast transactions signed from an offline environment without the user needing to import their keys to Adena. Onbloc has also started a discussion around ideas to improve the usability of QR Codes for secure data transmissions between offline signers and watch-only wallets in [Issue 1375](https://github.com/gnolang/gno/issues/1375). We’ll keep you updated on the work here. You can also find more information on Onbloc’s [informative blog](https://medium.com/onbloc). \n\nAs well as developing core tooling for Gno, Onbloc is working on Gno core to help us build important functionality. The team welcomed a new hire, Lee ByeongJun as a core engineer and to help with work on three core areas: contract interaction (enabling realms to interact with other realms), the multinode testnet, and porting essential Go packages to Gno. You can find more details and keep track of everything Onbloc is working on in their [hackerspace issue here](https://github.com/gnolang/hackerspace/issues/29).\n\n### Varmeta\nWe’re excited to welcome a new contributor Varmeta to Gno.land. Varmeta was founded in 2020 to focus on blockchain and virtual reality/augmented reality technologies and has grown from a team of three to over 40 engineers. Varmeta is excited by the vision behind Gno.land and its philosophy for rewarding developers. The team is committed to supporting Gno’s success by providing various applications for the ecosystem, starting with the Gno.land Unity SDK to make blockchain more accessible to game developers. Track Varmeta’s progress on their [hackerspace here](https://github.com/gnolang/hackerspace/issues/43).\n\n### Gno @ Devconnect Istanbul 2023\nGno.land core team members organized a small, unofficial meetup in Istanbul during Devconnect week from November 13-17. The engineering-focused meetup was accompanied by a Happy Hour and snacks, where attendees got the chance to learn about Gno.land in an informal way and how they can easily develop dApps in Gno, as well as contribute to the project.\n\nThat's all for now! Be sure to check back again with us for the next edition of The More You Gno to keep up with all our progress. Do you want to contribute to Gno.land's monthly updates? If you're building on Gno.land and want to highlight your development, project, event, or idea, let us know, and we'll include your contribution.","2023-11-29T00:00:00Z","christina","gnoland,ecosystem,updates,gnovm,tm2"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["bgl-poc1","Building Gno.land – Next Generation Smart Contract System","\n\n*Disclaimer: The Building Gno.land series aims to share the core concepts of our platform, mission, and tech stack, providing a snapshot of a current state on our builder’s journey. New episodes may deprecate previous ones, but no editions will be modified at any time. We encourage you to follow along as we create the rails for a more transparent and accountable society, and we welcome feedback and contributions to the repo.*\n\n## I. What Is Proof of Contribution (PoC)?\n\nGno.land is secured by a novel consensus mechanism that makes our platform unique—Proof of Contribution (PoC). PoC prioritizes fairness and merit, rewarding the people most active on the platform and revolutionizing the concept of open-source rewards. By removing the voting power associated with being wealthy (holding tokens in Proof-of-Stake (PoS) networks or amassing mining hardware in Proof-of-Work (PoW) networks), PoC restructures the financial incentives that tend to corrupt blockchain projects in the long run and rewards contributors fairly for their work based on their expertise, commitment, and values. \n\nGno.land contributors receive rewards and voting power according to their contribution level. These rewards increase as they make additional contributions, gain expertise, and are promoted up the Gno.land governing DAO’s (GovDAO) tier levels by higher-level contributors. So how does PoC work, what are its core features, and how does it lend security and decentralization to the platform? \n\n### Prioritizing Fairness and Alignment \n\nProof of Stake (PoS) was a monumental leap forward for the blockchain industry, solving the energy-intensive requirements of Proof of Work (PoW) and enabling blockchains to scale for broader adoption (thanks to its minimal carbon footprint and faster throughput). However, like PoW, PoS has some disadvantages. For example, in PoS networks, participants receive rewards based on how many tokens they stake, which means their incentives for working on the chain are often purely financial. Validators accumulate vast net worths and don’t always hold values that align with the core development of the chain. \n\nSince validators are crucial in securing PoS networks, they should be paid fairly for their work and encouraged to contribute more. However, validators should not be purely financially (and certainly not politically) motivated, taking up competing positions and launching political campaigns to convince token holders to stake with them. This type of lobbying affects all aspects of the chain’s development—from governance to technical upgrades—and can lead to factionalism and misalignment. \n\nPoC makes the system fairer and more sustainable, ensuring participants are aligned and take actions that benefit the Gno.land community and the broader ecosystem. That’s why (unlike PoS) contributors receive rewards based on their contribution effort (tier level) rather than how many tokens they stake. They are thus incentivized and recognized for the quality of their work, ideas, and alignment, driving participation and active engagement. Governance is allocated to the people most likely to care for the ecosystem’s long-term success—the contributors who have spent the most time working toward it—from open-source developers to video creators and everyone in between.\n\n### Rethinking Financial Incentives \n\nFor long-term security and sustainability, PoC emphasizes project principles and values over monetary gains, replacing standard token incentives with a system that separates voting power from token ownership. Two reward systems are currently being considered (in addition to a hybrid system). For the first, contributors receive WORX units that weigh the amount of GNOT tokens (the native Gno.land gas token) earned each month. Each member of the same tier receives the same amount of WORX. At the end of the month, the total each member earned is divided by the total amount of WORX distributed that month to calculate a percentage. This percentage represents the percentage of Gno.land fees earmarked for contributors that each member will earn in GNOT. WORX will likely be cleared each month to prevent cumulative, exponential reward exploits over long periods of time. \n\nFor the second, each tier level simply receives an amount of GNOT each month fixed to a USD value, similar to a salary. This would be combined with risk management and caps per tier level in order to promote long-term sustainability based on Gno.land fee generation. A hybrid of this system is also possible, either rewarding contributors of lower tiers one way and higher tiers the other or using both systems in tandem based on predefined conditions. This will be explored further in future tokenomics articles, models, and documentation.\n\nRegardless, WORX units are not transferable, will not be listed on exchanges, and hold no monetary value. WORX units are more like shares that represent value provided by contributors and allow their work to be quantified compared to other contributors/tier levels. It’s important to stress that GNOT tokens do not influence governance on the platform in any way. Voting power is earned through contributions and distributed according to contribution effort, with each member of the same tier representing equal voting power that increases with their tier level. This creates a network of highly aligned contributors who care deeply about the platform they are building and strive to improve it.\n\nGNOT, the native Gno.land gas token and the gas token of the Gno.land ecosystem, will be distributed via airdrop to qualifying ATOM stakers. It will also be available for purchase after that point (*more on Gno.land’s airdrop and tokenomics coming soon*). GNOT is used to pay all fees associated with the network and beyond, including transfers, IBC, ICS, and contract interactions, giving holders the chance to earn rewards from the economic activities of Gno.land.\n\n### What Makes a Good Contribution?\n\nWORX and/or GNOT can be earned through different types of contributions—not only coding and development expertise—but also through non-technical contributions, such as community building, governance involvement, constitutional proposals, teamwork, media creation, etc. The core focus is on alignment, not necessarily specific tasks. For example, an accepted proposal or merged code will raise or at least maintain the contributor’s tier level, allowing them to receive rewards during their time working between submissions. However, a proposal or code that has displayed a very high level of effort, detail, and aligned values (but is not merged) will also be considered in any proposals regarding contributor promotion.\n\nThis system allows the ecosystem to show appreciation for diverse forms of contributions and ‘useful failures’ that bring us closer to the solutions we adopt. It is designed to foster engagement, creativity, and collaboration while encouraging anyone aligned to contribute to growing the Gno.land chain and community. \n\n### How Are Contributions Assessed?\n\nThere is a strong human element to deciding what makes a good contribution, requiring knowledgeable human judges to exercise discretion. As such, contributions won’t be templated by default or rewarded automatically but assessed through Gno.land’s governing DAO, GovDAO. GovDAO is responsible for development and governance and is organized into tiers, as discussed above.\n\nGovDAO members review, measure, and curate contributions, and the tokenomics of GovDAO incentivizes members to be effective and unbiased evaluators. They engage in discussions and assess contributions based on effort, time, and other relevant factors/metrics that contributors will have stored in their profiles. The decision-making rationale is transparent and visible through on-chain forums. Again, contributors are assigned a tier level and receive a corresponding reward each month according to their tier. As contributors join GovDAO, the DAO grows, giving Gno.land decentralization efficiency and a high Satoshi score. \n\nGovDAO is assisted by a network of knowledge-specific DAOs, such as an Engineering DAO, a Support DAO, an Operations DAO, and the EvaluationDAO, which comprises a trusted group of high-reputation contributors that help assess specific contributions. This enables secure collaboration and seamless integration (*more on Gno.land’s network of interconnected DAOs coming soon*.) \n\n### Sybil-Resistant and Secure\n\nIn addition to being fairer, more aligned, and sustainable, PoC is Sybil-resistant by design. In blockchains, a Sybil attack is where one or multiple attackers multiply their presence and influence by creating fake identities to sway major network decisions (for example, including malicious blocks). In terms of PoS, the Sybil resistance is purely monetary (people need to stake real money to get power), so an attacker that wants to carry out a Sybil attack on a PoS network needs to lock at least as much stake as that locked by honest validators.\n\nPoC minimizes risks of Sybil attacks, takeovers, and alliances as the community vets every person who is given any power or sway in the network (including validator power) through the DAO, so at no point can anyone \"spoof\" identities and regain major sway. Moreover, Gno.land is built and secured by the merit and effort put into the project, as opposed to how many tokens someone can buy, rethinking financial incentives and making the platform Sybil-resistant and secure.\n\nThrough fairer rewards, restructured incentives, resistance to corruption and Sybil attacks, and a strong appreciation for all contributions, Gno.land is designed to be sustainable and fair. A censorship-resistant platform built, owned, and secured by a growing, aligned community for many generations to come.\n\n*I. What Is Proof of Contribution? is the first in a series of articles to dive deeply into the philosophy, vision, mechanics, and work involved in developing a new consensus mechanism for the next generation of smart contract systems. Look out for subsequent editions and additional Building Gno.land series, and let us know what you think! Got questions? Join the Gno.land [Discord](https://discord.com/invite/S8nKUqwkPn) or follow us on [Twitter/X](https://x.com/_gnoland)*.\n","2024-01-10T10:51:00Z","","building-gnoland,gnoland,proof-of-contribution"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-7","The More You Gno: Gno.land Monthly Updates - 7","\n\nWelcome to the latest edition of *The More You Gno*, your regular source of updates from the Gno.land core team and contributor ecosystem. After a well-deserved rest during the holiday break, we’re kicking off 2024 with renewed energy and plenty of exciting initiatives, including a new staging testnet (the Portal Loop), the official Gno.land documentation page, several merged PRs (including native bindings!), and many updates across the board. Dive in to find out what we’re working on and what our ecosystem partners and grantees have been up to.\n\n## Gno Core Team Updates TL;DR\n\nShort on time? Skim the highlights from the core team in the list below. You’ll find additional details in the next section if you want to explore any topic in greater detail.\n- **Native Bindings** - If you’ve been following our journey or experimenting with the platform, you’ll hear virtual champagne pops as Morgan’s ongoing work with native bindings is finally merged [PR 859](https://github.com/gnolang/gno/pull/859).\n- **Gnodev** - Thanks to Guilhem’s `gnodev` initiative [PR 1386](https://github.com/gnolang/gno/pull/1386), you can now create and develop contracts with a single command.\n- **Gno.land Offical Docs** - Check out [docs.gno.land](https://docs.gno.land) for how-to guides, getting started, and an overview of key concepts of the platform.\n- **Effective Gno** - Taking inspiration from *Effective Go*, Manfred’s begun listing common patterns and examples of the differences between Gno and Go.\n- **Assignment in GnoVM** - Jae is working on approaches to fixing assignment in the GnoVM and issues that deal with persistence [(issue 1326)](https://github.com/gnolang/gno/issues/1326). \n- **Portal Loop** - The [Portal Loop](https://portal.gnoteam.com) has been released on a staging domain and is being tested.\n- **Roadmap** - We’re working on a fully-fledged Gno.land roadmap and will share a detailed DAG and important goals and milestones with you soon.\n- **Tendermint2 Update** - There are several PRs aimed at removing the dependencies between Tendermint2 and GnoVM.\n- **Gno.land Tokenomics** - We continue to make progress in defining the structure of Gno.land’s DAOs and the design of reward schemes for contributors.\n### Native Bindings (PR859) Has Been Merged\n[PR 859](https://github.com/gnolang/gno/pull/859) (native bindings) was submitted by Morgan in May 2023 to improve calling Go code from Gno standard libraries, all while improving `gno doc` documentation for standard library functions. Native functions are _declared_ in Gno code, but their definition (the underlying code) only exists in Go: this is similar to how Go and many other systems languages implement assembly functions. Overall, the addition will now allow us to better support precompilation (transpiling Gno code to Go) for all Gno-specific standard libraries, like [`std`](https://docs.gno.land/reference/standard-library/std/address/), and have a system for defining such functions that is transparent to code analysis tools like `gno doc` and `gnols`.\n### Gnodev Has Been Merged\n[PR 1386](https://github.com/gnolang/gno/pull/1386) (`gnodev`) has been merged. Gnodev is a tool to locally develop Gno realms which automatically re-deploys your contracts when you change the files, similar to JavaScript frameworks `npm run dev`. There are some additional features being worked on to improve the experience, including browser hot-reload (for the full front-end JavaScript experience!)—and Gno core developers who have worked on realms all agree that thanks to `gnodev`, they can finally stop visiting their therapist every week. Play around with it, and let us know how you get on. There may be a few bugs still and Guilhem is happily accepting feedback.\n### The Gno.land Official Documentation Page Is Live\nWe’re excited to have the Gno.land Official Documentation page live on the [https://docs.gno.land](https://docs.gno.land) domain. This will always be a work in progress as we expand the docs, make iterations to existing issues, and refine some of the core concepts, but it’s an excellent resource for anyone wanting to find out more about Gno and for onboarding new developers to the platform. A big thanks to the Onbloc team, whose developer portal was a huge inspiration for this. We’re looking for feedback, so leave your reviews and let us know where the docs can be improved and what else you would like to see.\n### Effective Gno\nManfred has been working on a document called [Effective Gno (PR 1000)](https://github.com/gnolang/gno/pull/1000), which takes inspiration from *[Effective Go](https://go.dev/doc/effective_go)* and will become an important reference document for Gno devs to explore common patterns and crucial differences in how we program compared to Go. We’ll be iterating on this as we progress, but you can already find plenty of examples. If you’re just getting into Gno and coming from a Go background, this is a great resource. Read this document and provide some comments if you have any. \n### The Portal Loop Beta Is Live\nThe Portal Loop Beta has been released on a staging domain, and you can check it out now at [https://portal.gnoteam.com](https://portal.gnoteam.com). The Portal Loop will replace the Gno.land website once we’ve finished squashing bugs and adding features. We’re still testing it and have identified several issues. For example, from the last three merged PRs, only one triggered a redeploy when we expected two or three deploys. We will also add a faucet.\n\nAs we continue to evolve the Portal Loop out of its early development stages, transaction volume and general activity will increase. However, currently, there are insufficient transit testing transactions. One of the tasks we want to do to prove that the Portal Loop is working well enough is to write a kind of monitoring-oriented oracle that will try to make transactions, perhaps incrementing a counter every minute. We’re looking for help writing a script or a daemon for this oracle, so let us know if you want to contribute to [issue 1443](https://github.com/gnolang/gno/issues/1443). Once the Portal Loop is finished, we will focus on testnet 4.\n### Assignment Issues in the GnoVM\nMorgan came across a bug [issue 1326](https://github.com/gnolang/gno/issues/1326), which returned an error about an [“unexpected unreal object”](https://tenor.com/es/view/cranizox-gif-8576622211330078986) when assigning a local variable to a dereferenced global variable in the GnoVM. Jae has been spending some time working on approaches to solving this and fixing assignment that will also work for saving escaped objects that don't have a parent (like variables whose pointers are referenced on a persisted object). This is a tough one to figure out, so if there are any other VM issues that deal with persistence and detached parentless objects, now is the time to add them to Jae’s plate. \n### An Update on Tendermint2\n[PR 1483](https://github.com/gnolang/gno/pull/1483) has the same goal as [PR 1438](https://github.com/gnolang/gno/pull/1438): to make Tendermint2 completely independent of GnoVM and Gno.land. This continues a project started many months ago to separate Gno into three separate components: the Tendermint2 consensus engine, the Gno programming language and VM, and Gno.land, the blockchain combining both together. This way, we’re working towards making it possible to build other blockchains that use Tendermint2 (like AtomOne!), the GnoVM, or both!\n### Gno.land Engineering Retreat\nIn the last *The More You Gno*, we covered the Gno.land and AIB company-wide retreat, an invaluable opportunity to work together, code together, and get to know our peers outside of work. It was such a success that the Gno core dev team held another retreat in December in Rouen, France, where many of the above issues and PRs were tackled and merged. We look forward to more productive and frequent face-to-face meetings in the year ahead.\n### Gno.land DAOs and Tokenomics\nWith the input of Manfred, Jae, and the rest of the team, Michael continues to make advancements on Gno.land’s system of DAOs and tokenomics. One key change since the last edition is that the WorxDAO (responsible for governance and all issues related to development in Gno.land) will now be known as the GovDAO. The DAO will likely have seven tiers but initially launch with three or four. The main benefits of moving up tiers are increased voting power, increased monthly rewards, and the authority to promote members from lower tiers. GovDAO will be assisted by WorxDAO, which will encompass several different sub-DAOs, such as engineering, funding, and projects. \n\nWe’re currently exploring different reward systems for contributors, whereby each member of the same tier level will receive the same amount of rewards, either directly or indirectly, in the GNOT native gas token or USD, in a type of salary-based scheme. We may also elect to distribute rewards based on a contribution/work “hash difficulty” (total number and tier split of active contributors that month). We may also adopt a hybrid of these two models. \n\nMichael is also working on a bounty system to make Game of Realms (GoR) more accessible and evaluating contributions easier for judges. High ranking GoR competitors will likely receive Gno.land tier levels based on their leaderboard placing in addition to ATOM rewards. It’s important to note that these discussions are ongoing, and the information here may be deprecated. \n### Making Testing Faster\n\nThanks to Petar, [PR 1417](https://github.com/gnolang/gno/pull/1417), we have improved the entire VM testing suite runtime by around four minutes, which is an incredible achievement. We just need to refactor some test scenarios that are not very concurrent-friendly, but this PR makes interacting with the platform so much easier.\n\n### Bug Fixes and Miscellaneous Items\n\nThanks to Joon from Onbloc, we were able to add support for octals without 'o' (check out [PR 1331](https://github.com/gnolang/gno/pull/1331) for more details), and thanks to Dragos [PR 1309](https://github.com/gnolang/gno/pull/1309), we extended the GRC721 interface so that it now supports setting a token URI. These are both extremely welcomed contributions, and we appreciate our ecosystem partners.\n\nFrom the core team, a special shout out to Dylan for killing it fixing bugs, and getting many PRs ([PR 1451](https://github.com/gnolang/gno/pull/1451), [PR 1315](https://github.com/gnolang/gno/pull/1315), and [PR 1305](https://github.com/gnolang/gno/pull/1305), to name a few) merged over the last few weeks. Props also go to Marc for [PR 1177](https://github.com/gnolang/gno/pull/1177), which has just been merged, which fixes append in certain key situations. We’ve also welcomed a new security engineer, Kristov, to the team.\n\n## Grantee and Ecosystem Updates\n\n### Onbloc\n\nOnbloc has been on a roll, giving us an internal demo of Gnoswap beta just before the Christmas break and a public demo of its awesome Pool Incentivization feature during the last contributor sync call. With Pool Incentivization, anyone can add extra rewards on top of swap fees for LP stakers. This will help bootstrap initial liquidity for new-coming projects by attracting liquidity providers until sufficient organic trading volume is secured. Onbloc is also actively developing Adena’s Airgap feature and has improved the sign-in flow for security enhancement along with some refactoring. There will be a demo coming up in the next few weeks. Onbloc will also be researching airdrop trends and aiming to identify some of the most coveted DEX features users want to see for Gnoswap to streamline the onboarding process.\n\nRegarding Gno core, Onbloc core dev Byeongjoon Lee has developed a JSON parser for Gno, giving us a live demo during the last contributor sync. This allows the conversion or accessing of data from contracts in the JSON format, which will improve the Gno developer experience. His code is currently under review by the core team in [PR 1415](https://github.com/gnolang/gno/pull/1415). Dive deeper into Onbloc’s Builder Journey in the [hackerspace issue 29](https://github.com/gnolang/hackerspace/issues/29).\n\n### Teritori\n\nTeritori continues the challenging work of developing Gno Project Manager, a web app that allows anyone to create, fund, review, or manage projects fully on-chain. During the last contributors' call, the team gave a demo of the work achieved so far, in particular regarding the escrow system and completing project milestones so contributors can be paid once each one is completed rather than having to wait until the project finalization. \n\nGno Project Manager is a complex goal, and the team has run into some issues with edge cases they hadn’t bargained for in the relationships between grantees and funders. The team is looking for feedback and help identifying edge cases, so if you have any in mind, let them know. Teritori is also working on the conflict solver module and improving the social feed on [https://app.teritori.com/feed?network=gno-teritori](https://app.teritori.com/feed?network=gno-teritori), as well as providing more detailed documentation on their work, which they’ll be releasing in the coming weeks.\n\n### Berty\n\nThe Berty team has been busy working on GnoSocial backend implementation. The initial feature set has been implemented [here](https://github.com/gnolang/gnosocial/blob/main/realm/public.gno), including posting and replying to messages and reposting threads. You can keep up with Berty’s journey on GnoSocial in [hackerspace issue 51](https://github.com/gnolang/hackerspace/issues/51), which contains many issues and PRs, such as implementing calls, running tests, and fixing bugs. We’re super excited about pushing the limits of scalability with Berty’s decentralized social platform, and we’ll be looking forward to more demos in the coming weeks.\n### Dragos\nDragos has successfully launched the Flippando game, and you can try it out on the [testnet here](https://gno.flippando.xyz/flip). If you haven’t been following the progress, Flippando is an on-chain memory game that you can play with your choice of styles, such as dice, colors, and hexagrams. Once you successfully complete a matrix, you can mint the end result as an NFT, which can later be assembled into larger, more complex NFTs to create digital artwork. You can find out more about the game, its creator, and the official roadmap on the site. We’ll also release a blog post soon from Dragos sharing his experience porting Flippando from Solidity to Gno, so stay tuned!\n### Varmeta \nVarmeta’s update was brief this week since the contributor sync call ran over. We look forward to hearing more about the team’s progress in developing the Unity SDK for Gno next time. You can read more about it on Varmeta’s [hackerspace issue 43](https://github.com/gnolang/hackerspace/issues/43).\n\n*Do you want to contribute to Gno.land's monthly updates? If you're building on Gno.land and want to highlight your development, project, event, or idea, let us know, and we'll include your contribution. That's all for now! Keep track of our progress by following our socials [Twitter/X](https://twitter.com/_gnoland) and [Discord](https://discord.com/invite/tF2X8M6cVj) and watch out for the next edition of The More You Gno in a few weeks.* \n","2024-01-22T00:00:00Z","christina","gnoland,ecosystem,updates,gnovm,tm2"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["porting-flippando-gno","5 Things I Learned While Porting Flippando From Solidity to Gno ","\n\nLast year, while visiting Seoul, South Korea, I decided, on a whim, to sign up for a hackathon called Glitch. The project I was going to present was a tiny little game, written in Solidity, called Flippando. It started as a weekend project to help me learn Solidity (I had no prior experience with this language). To my surprise, my tiny little game won the first prize on the Polygon track of the Glitch hackathon.\n\nEncouraged and even more curious now, I started attending side events during Buidl.Asia. One was about Gno, a smart contract platform written in Go. After the presentation, which was really great, I started a light conversation with the team. One thing led to another, and I ended up showing them Flippando. \n\nJust for context, Flippando is a non-degen, deceptively simple memory game. You start with an empty matrix and flip tiles to see what’s “underneath.” If the tiles match, they remain uncovered; if not, they are briefly shown, and you have to memorize their color until the entire matrix is uncovered. The end result can be minted as an NFT, and you can later assemble all the boards into bigger, more complex NFTs, basically “painting” with the uncovered tiles.\n\nThe Gno team seemed to like it, and they suggested I should apply for a grant to port it to Go/Gno. I had no prior experience in Go either, so I thought this would be a good opportunity to learn more. To my surprise, again, my grant submission was accepted.\n\nFast forward a few months until now: the Gno version of Flippando is live (in testnet beta) at [https://gno.flippando.xyz](https://gno.flippando.xyz). What follows sums up my experience porting the game from Solidity to Gno. This blog post is a mix of technical and not-so-technical takeaways.\n\n## 1. Being Early Pays Off\n\nSolidity has been around for some time now, and there is already a solid tooling ecosystem for it. I used Hardhat for my development, and I got really comfortable with it. When I started to port Flippando, though, I was quite surprised to see there was almost no tooling in Gno. Developing was mostly TDD (test-driven development) against a local VM, and deploying realms on the actual chain was more complicated than I expected. \n\nMy first feedback rounds to the team revolved almost exclusively around this topic. Very soon, I started to receive signals that my feedback was not only heard but taken into account and processed, and there were actual projects built aiming to improve the developer experience. In just two or three months, two full projects were finished: gnodev, and Gno Playground. \n\nGnodev makes development very similar to Metro in React Native: there is a watchdog on the file system, and your changes to the realm code are reloaded every time you save. It’s almost like deploying in real time; no need to stop the chain, wipe the state, restart the chain, and redeploy your modifications. Gno Playground is a sandbox-like environment, which helps tremendously with quick testing and even deploying packages on-chain. Both projects were finished, as I said, in just two to three months.\n\nBeing early pays off because you get to shape your development environment much faster than in a solidified (pun intended!) environment. You may have to deal with a little chaos in the beginning, but the benefits are well worth it.\n\n## 2. TDD All Day Long\n\nAs I said above, developing realms in Gno consists mainly of writing and testing your code with another code. It’s called TDD and it’s a very useful developing strategy, in general. I used it, at my day job, in all my projects consistently, but only in the initial stages. Once the codebase was more stable, I was relying more on regression tests from the Q\u0026A team.\n\nMind you, there was no Q\u0026A team this time; I was just coding alone, and I was forced to comply more and more with this TDD approach. In the end, I have to admit that, while slower and a bit boring, this approach is more effective, especially in a volatile environment, where patches are added literally every day, and the environment changes continuously.\n\n## 3. Marshal and Unmarshal\n\nThe current GnoVM doesn’t yet have an API standard for formatting. You can’t put a setting somewhere that will make the response be automatically translated into JSON. You have to write these JSON objects yourself for every payload you return from your realm. \n\nIn Solidity, all this is hidden under the event mechanism and handled by existing libraries, like ether.js, which take care of all this nitpicking. It soon became obvious that development time would be significantly longer in Gno because, on top of the logic, I also had to write the formatted response “by hand.”\n\nBut as with every other thing that seemed weird in the beginning, eventually, I came to appreciate it. It forced me to prototype more carefully not only the actual response but all the objects needed in my game. Eventually, it resulted in simpler and more flexible code.\n\n## 4. Eating Your Own Dog Food\n\nWhen developing in Solidity, most of the time, you just import OpenZeppelin contracts for ERC20 and ERC721 tokens (which are battle-tested, bug-free, and relatively easy to understand) and focus on your own contract logic. No mingling with low-level token implementation details; these are already packaged and ready to use.\n\nWhile porting Flippando to Gno, I realized I had to deal with these low-level details upfront simply because there was no equivalent of the OpenZeppeling contracts. Moreover, some current GRCs (the Gno equivalent of ERC) were incomplete. \n\nSo, I had to make a PR for a GRC721 implementation that was missing the SetTokenURI functionality, and this PR ended up being merged into the main Gno codebase (that felt really good, to be honest). \n\n## 5. Being Early Pays Off. Did I Say That Already?\n\nYes, but this time it’s about something else. It’s not about the satisfaction of shaping the development environment in the early days. It’s about the privilege of witnessing something coming to life from literally nothing. Gno has been in development for almost two years now, and it is several months before its mainnet. It’s literally on the verge of coming “alive.”\n\nEvery day new commits are added, and new decisions are made. There are new contributors constantly joining, and new projects prototyped and launched faster and faster. Every day the ecosystem is coagulating itself into something more and more visible, more and more alive.\n\nBeing able to witness this from the inside is a rare privilege and something I’m very grateful for.\n\n## Final Thoughts \n\nSo, these are, in a nutshell, my five top takeaways from porting Flippando from Solidity to Gno. There are many others, of course, and Gno is (did I already say this?) still very early. If you’re interested in learning more, please visit the official repo, look at the docs, and try interacting with the devs. You’ll never gno what can grow out of it! And be sure to play [Flippando](https://gno.flippando.xyz) today live in testnet beta and share your flips.\n\n## Here’s How to Play Flippando\n\nThe game presents a 16 tiles (4x4) or 64 tiles (8x8) matrix. These tiles are “covering” a board of various colors and gradients or shapes, like dice or hexagrams. Clicking two tiles consecutively “flips” them, showing what’s underneath. If they match, they remain uncovered; if not, they are briefly shown, and the player needs to remember their position. Once an entire board is flipped, revealing its random combination of colors, the player can choose to mint it as an NFT.\n\nWhen minting a solved board as an NFT, the game also mints a fungible token, FLIP, which is “locked” inside the NFT. This is the player's “reward.” But the token can only be unlocked if someone else uses that NFT in a larger project.\n\nThese larger projects, or “artworks,” can be assembled in the Flippando Playground. All minted basic NFTs are displayed here in an area from where the player can drag and drop them onto a canvas, creating a much bigger and more complex NFT. Once the canvas is fully filled and the player is satisfied with what’s in there, these new “artwork” NFTs can also be minted. This unlocks all the FLIP tokens for the NFTs used inside the artwork and sends them to their initial players. Furthermore, these complex artworks can be listed and traded in a marketplace, closing the circle of a virtual economy of goods.\n\nStart playing Flippando and share your Flips with Gno.land on [Twitter/X](https://x.com/_gnoland?lang=en) by tagging #gnoflip. \n\n\n","2024-01-24T00:00:00Z","dragos","gnoland,ecosystem,updates,flippando"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["wyg-zooma","Who You Gno – On the Record with Antoine Breuil","\n\nAntoine Breuil, ‘zôÖma,’ is the co-founder of [Teritori](https://app.teritori.com/), an active Gno.land contributor and grantee that’s building key modules and tooling for Gno. A firm believer in equal opportunities, free and decentralized access to information, and helping fellow humans, zôÖma is fascinated by human behavior and how we organize ourselves, holding an avant-garde social experiment five years ago with Teritori co-founder ‘Pop.’ \"La Suite du Monde\" drew people across France to a small village in the countryside to create a shared community and society—with farmland, accommodation, and tools for common use.\n\nThe goal was to form an in-real-life DAO whose members shared common goals and interests using blockchain technology with a token to pay for goods and services and vote on governance matters. While many people participated and were enthusiastic about creating a shared society, zôÖma admits the experiment was early- no one was interested in interacting with the tech. “90% of people, rural or not, found it too complicated,” he admits. “We were a bit naive, but it was fascinating nonetheless.”\n\n## A Fascination for Human Behavior\n\nzôÖma has been an ardent student of human behavior since childhood. His parents taught him early on the value of philanthropy and working with people in need. He’s set up several joint liability companies, non-profits, and NGOs to experiment with finding new and better ways to organize society, and one of the things he loves most about web3 is its “experimental” nature. He’s encouraged by how far the industry has come since he received his first bitcoins in partial payment for a website in 2014. “That turned out to be a really expensive website for my customer,” he laughs. He never expected such broad adoption of Bitcoin and a technology that “inspired a whole generation of engineers to experiment with new things.”\n\nLike most creative types, zôÖma is used to spinning many plates in the air, overseeing La Suite du Monde while working as a freelance designer, front-end dev, and Artistic Director for an independent French record label. “Before entering the world of engineers, I founded and managed a collective for 12 years, which brought together artists from all disciplines, hackers, designers, tinkerers, to build some interesting projects.” La Suite de Monde allowed him to explore his passion for finding new approaches to social coordination first-hand. “I explored very radical things,” he says, “like the notion of “accepted by default” where anyone could use the collective budget by expressing their desire to do so three times. I wouldn’t recommend this,” he laughs, “but the experiments were fascinating and still serve me today in my work.”\n\nOne really interesting trait about zôÖma is how he harnesses the creative and analytical sides of himself with equal application. Most people are predominantly right-brained or left-brained, yet, zôÖma is ‘ambidextrous’ in this regard. He’s a designer who’s created large-scale artistic events, cultural tours of Paris, and an award-winning independent movie documenting French artist and Bitcoin advocate Pascal Boyart, [The Underground Sistine Chapel](http://www.the-chapel.art), (which you should definitely check out!). Yet he’s also passionate about engineering and the future of cooperatives. He’s detail-driven and ambitious, taking his team at Teritori from two to 18 (14 full-time teammates and four part-time).\n\nIn his free time, zôÖma, “like all French people,” enjoys fine wine and good conversation. One of the things he loves most about Paris is how easy it is to find like-minded people to brainstorm with or decompress after a long day of work. “We have a very active ecosystem of engineers, cryptographers, etc.,” he says. Paris is also a beautiful city that captures his imagination with its dazzling architecture and impressive art. Even so, zôÖma channels his creative energy more effectively when working from a small Moroccan fishing village for three months a year. He reconnects with nature and humanity, immersing himself in a different culture and surfing in the Atlantic before he starts his day. \n\n## New Tools for Social Coordination \n\nWhy does zôÖma believe social coordination is so important, and why do we need new tools for it? “We’ve always had tendencies to organize ourselves and tools defining rules for living together, diplomatic protocols for discussing between social groups, or trading goods and services. But almost all the tools that previous generations put in place are outdated. Our entire generation has lost confidence in institutions to allow groups of humans to organize, coordinate, and meet their needs. Our dependence on third parties who do not have the same interests as citizens is immense.”\n\nzôÖma believes that web3 holds the key to unlocking the emergence of new societies through products that are “unstoppable, resilient, and meet a real need,” whether for small villages in the south of France, Africa, or Asia or neighborhoods in Brazil or Korea. “We must have access to the radical transparency of institutions, the privacy of individuals, censorship-resistant tools, and autonomous communication from all commercial enterprises. It is on this solid foundation that civilizations that are more just and equitable can be built.”\n\n## Making Web3 More Accessible \n\nOf course, as zôÖma found out, building new tools is easier said than done. Our industry faces an uphill climb when it comes to balancing the promise of the tech with a user experience that doesn’t cause tachycardia. He says that understanding that most people “don’t have the time or inclination to incorporate difficult technical concepts in their lives” has given him “crazy energy to focus on very simple technologies.” In fact, the ‘failure’ of La Suite du Monde is what gave birth to Teritori, “which today provides all the functionalities people asked us for at the time; a social network, communication systems, voting, crowd-funding, etc. We have made great progress, and it’s important to focus on products that are radically simple for the general public.”\n\nAccording to zôÖma, this means abstracting away the concepts that everyday people don’t need to be aware of, such as networks, dApps, and even blockchain, “and always switching from one decentralized application to another.” Unifying (not centralizing) separate tools, networks, and technologies within a single, simple interface, he believes, is the key to broader adoption. “It's a very complex challenge, in terms of security, design, etc., but it's what I'm passionate about today.” \n\nWhen it comes to Gno.land, Teritori has already delivered essential DAO tooling and standards, a Moderation DAO module to facilitate social communication and a Justice DAO module for conflict resolution. The team is now focusing on an on-chain project management tool to allow organizations and individuals to manage projects and track tasks smoothly and transparently on-chain.\n\n## A Fairer, More Transparent World\n\nIn 2024, Teritori enters a new phase called \"Chapter II,\" which involves unifying all its work into a mobile and desktop application that could “trigger superb demonstrations of the potential of DAOs.” He enthuses, “I dream that we will see the emergence of a village that uses Teritori as a tool for internal discussion and co-financing. Will this be real in 2024? Who knows? But that’s where I focus all my energy!”\n\nHe believes the internet has been a great leveler, enabling anyone with a connection to educate themselves on any subject; yet, the opportunity isn’t open to all, and free and open access is constantly diminishing. “I am a child of the internet. I grew up with warez, p2p, and an internet which provided me with daily resources to learn freely, everything that interested me. In some countries, it is impossible to benefit from this opportunity, and with the centralization of the internet on different key players, mass surveillance, and the censorship of certain dictators, the internet is losing its very essence, which makes it magic. Distributed protocols can reshuffle the cards and offer tools for the public good.” \n\nzôÖma says that humanity is at a turning point, and we must build the necessary tools now to avoid finding ourselves in a real-life version of George Orwell’s 1984. “I aspire to participate modestly in a world that is fairer, more transparent, and where society doesn’t need a puppet in a suit to improve its living conditions or respond to local needs. Web3 is just a tool, and if it doesn't meet this real need, then for me, it will be a failure.”\n\n*Experiment with Teritori today and test its Social Feed, which now includes Twitter-like functionality for posts, Medium-style articles, Soundcloud-inspired music, and videos—all based on Gno and IPFS and totally decentralized. You can also check out Teritori’s GnoModerationModule, which allows you to moderate a social network in a decentralized way. A faucet is available on the home page at [app.teritori.com](https://app.teritori.com/feed?network=gno-teritori).*\n","2024-01-11T00:00:00Z","christina","whoyougno,teritori,community,interview"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["bgl-poc2","Building Gno.land - Proof of Contribution II","\n\n*Disclaimer: The Building Gno.land series aims to share the core concepts of our platform, mission, and tech stack, providing a snapshot of a current state on our builder’s journey. New episodes may deprecate previous ones, but no editions will be modified at any time. We encourage you to follow along as we create the rails for a more transparent and accountable society, and we welcome feedback and contributions to the repo.*\n\n## II. Proof of Contribution vs Proof of Stake\n\nProof of Stake (PoS) is a robust consensus mechanism that provides a more environmentally friendly and scalable alternative to Proof of Work (PoW) and powers most of the web3 industry today. As PoS pioneers, Cosmos technology secures hundreds of blockchain projects and billions of dollars of digital assets, and Ethereum (launched as a PoW chain in 2015) made the historic switch to PoS in 2022. According to [ethereum.org](https://ethereum.org/en/developers/docs/consensus-mechanisms/pos), PoS is “more secure, less energy-intensive, and better for implementing new scaling solutions compared to the previous proof-of-work architecture.” However, as we briefly discussed in [*What Is Proof of Contribution?*](https://test3.gno.land/r/gnoland/blog:p/bgl-poc-1), PoS has vulnerabilities that can corrupt the network over time.\n\n### The Limitations of Proof of Stake (PoS)\n\nBeyond securing the network, the main goal of any consensus mechanism (PoW, PoS, DPoS, PoC, etc.) is to be as decentralized as possible and not reliant on any central actors. This can be measured by the Satoshi Score (or the Nakamoto coefficient), a quantitative measure that assesses a blockchain’s level of decentralization by calculating the minimum number of nodes needed to compromise a network or carry out a 51% attack. PoS systems can be bootstrapped within days (or even hours), starting off decentralized and achieving a high Satoshi Score.\n\nThe PoS chain Genesis allocates a default voting power to ~20-50 nodes, in general equally (or at least making sure that no single node has more than 5% of the voting power). This makes PoS chains decentralized enough (in theory) from block 0 with a near-perfect Satoshi score. However, in practice, PoS has two main issues. Because the system is dictated by money, PoS chains become imperfect over time. Anyone wealthy enough can stake their tokens progressively and use their accumulated power to sway decision-making on the chain—or take the network over completely.\n\nThe chain can limit the maximum voting power per validator node, but this is almost ineffective, as a malicious actor can carry out a Sybil attack on the network and create multiple validators to bypass the voting cap. Such an attack renders the max voting power per node useless and leaves the chain defenseless against a single organization or cartel gaining the majority of the voting power. PoS systems leave chains like Cosmos Hub and Ethereum at risk from such bad actors, cartels, and powerful protocols (such as Lido and Rocket Pool).\n\nWhile Proof of Contribution (PoC) can’t prevent Sybil attacks on standard user accounts (when malicious actors create multiple accounts with a single computer and transfer tokens within a few hours), it does make it almost impossible for validator nodes to suffer Sybil attacks. Since the community vets every person who is given voting power or sway in the network (including validator power) through the DAO, at no point can anyone \"spoof\" identities and gain major sway. \n\n### Where Proof of Contribution (PoC) Excels\n\nPoC is actually Proof of Authority (PoA) which, instead of offering up a resource like computing power or a financial stake, relies on validators staking their reputation. Anyone can join most public PoW and PoS networks without revealing their identity. However, by definition, PoA validators need to make themselves known and are selected based on their trustworthiness. This means PoA tends to work better when deployed in private or permissioned blockchains than in public platforms (because of this tendency toward centralization). \n\nPoC solves this problem, ensuring the network becomes increasingly decentralized over time by being governed by a decentralized entity, GovDAO. Like standard PoA chains, PoC chains launch with a handful of validators that must be identified and trusted by the network, meaning governance is centralized at the start, and the chain achieves a low Satoshi Score. The system is about contributing and earning contribution units, which are slow to gain and require human interaction. It takes months (or years) before there are enough actors in the DAO and sufficient voting power for the chain to be considered decentralized enough, according to the Nakamoto coefficient. \n\nPoC is thus slower to bootstrap than PoS and harder to achieve. You can think of PoC versus PoS as a marathon versus a sprint, whereby PoC starts slowly but then gains momentum over time, and PoS starts quickly but loses momentum over time (the graph below provides a visual representation of PoC versus PoS). \n\n[![Graph](https://gnolang.github.io/blog/2024-01-26_bgl-poc2/src/thumbs/graph-container.png)](https://gnolang.github.io/blog/2024-01-26_bgl-poc2/src/graph-container.png)\n\nThe GovDAO that owns the chain has a mandate to scale (to grow and decentralize) continuously as it adds more contributors. This means it becomes progressively larger over time, achieving high decentralization efficiency way beyond the initial fast sprint of PoS chains. Once established as a proven consensus mechanism and alternative to PoS, GovDAO can benefit from by any blockchain project (through an evolution of ICS) wanting to achieve decentralization and sustainability—PoC can secure Gno.land and the web3 industry at large.\n\n### Security-Conscious by Design\n\nAnother advantage of PoC is that because it’s reliant on human interactions, it is more Sybil-resistant by design. As discussed, it’s almost impossible to split a validator node into two (or more) nodes, making conducting a Sybil attack infinitely difficult. Since contribution units are not transferrable or exchangeable, PoC cannot suffer from whales attempting to purchase voting power quickly. If someone wanted to take over the network, they would need to invest years of their time making meaningful contributions. Their attack would be so slow that it would easily be prevented by humans monitoring the decentralization and adjusting the parameters. \n\nMoreover, GovDAO will activate and deactivate new validators on request, establish a KYC system for validators, and manage promotions of contributors with votes. This removes the possibility of a takeover happening overnight since the only way to gain validator or voting power is by voting on governance requests, which is slow and managed by humans. This is in contrast to PoS systems which are powerful and fully automated yet defenseless against such coordinated attacks.\n\nGno.land is built on the very premise that such an attack on a PoC network would never happen as it would be entirely counter-intuitive. Since contributions are not only about expertise but also alignment, it is our hypothesis that longstanding contributors who have invested years of time and brainpower in developing the chain will do their best to protect it rather than destroy it. The DAO system will endure thanks to the mix of expertise and alignment and the amount and frequency of contributions. \n\n### Concluding Thoughts\n\nBeyond separating voting power from net wealth, a core component of Proof of Contribution (PoC) is its focus on long-term sustainability. PoC makes the system fairer and more sustainable, ensuring participants are aligned and take actions that benefit the community and the broader ecosystem. PoC is slower to bootstrap and harder to achieve than PoS but focuses on long-term alignment and security. \n\nUnlike PoS, contributors receive rewards based on their contribution effort rather than how many tokens they stake. They are thus incentivized and recognized for the quality of their work, ideas, and alignment, driving participation and active engagement. Governance is allocated to the people most likely to care for the ecosystem’s long-term success—the contributors who have spent the most time working toward it.\n\n*II. Proof of Contribution vs Proof of Stake is the second in a [series of articles](/r/gnoland/blog:p/bgl-poc1) to dive deeply into the philosophy, vision, mechanics, and work involved in developing a new consensus mechanism for the next generation of smart contract systems. Look out for subsequent editions and additional Building Gno.land series, and let us know what you think! Got questions? Join the Gno.land [Discord](https://discord.com/invite/S8nKUqwkPn) or follow us on [Twitter/X](https://x.com/_gnoland)*\n\n\n","2024-01-26T13:37:00Z","christina","gnoland,gnovm,tm2,PoC"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["funding-program-23q4","Gno.land Funding and Grants Program - Quarterly Report: Q4 2023","\n\nThe Gno.land Funding and Grants program identifies talented and passionate developers, researchers, and tinkerers to interact with Gno.land, enhance the platform's usability, and help build the core infrastructure and tooling needed for mainnet. After a strong start in Q3 2023 from our grantees, we awarded four additional grants in Q4. Let’s take a look at their progress and what’s coming up in Q1 2024.\n\n## Q4 Funding Breakdown\n\nThe total amount paid out in Q4 for grants was just under $317,000, spread out over the four grants: Teritori, Berty, Onbloc, and Dragos (Flippando). This work was split over essential stress-testing, debugging, and development on Gno core, and building social, gaming, and project management dApps to extend the platform’s functionality. Each grant recipient received milestones for deliverables and tracked their progress through regular public and internal syncs, hackerspace journey updates, blog posts, documentation, and developer calls.\n\n[![Q4 Chart](https://gnolang.github.io/blog/2024-02-07_funding-program-23q4/src/thumbs/chart.png)](https://gnolang.github.io/blog/2024-02-07_funding-program-23q4/src/chart.png)\n\n## Berty Technologies (delivery May 2024)\n\nAfter successfully meeting their deliverables in Q3 and creating Gno Native Kit (formerly [GnoMobile](https://test3.gno.land/r/gnoland/blog:p/gnomobile)), Berty was awarded a second grant in Q4 to experiment with smart contract integrations around social media. Through the development of GnoSocial, the team has created a test bed for building decentralized social media-style apps and helped to stress test technical issues in Gno.land. \n\nIn Q4, Berty delivered V1 of GnoSocial, which includes basic Twitter-like functionality. GnoSocial will be implemented on mobile using the Gno Native Kit framework, with a minimal desktop app and a read-only web version also in the scope. Aside from this work, Berty contributes to Gno core development, helping raise issues and merge PRs. You can follow their progress in hackerspace [issue 51](https://github.com/gnolang/hackerspace/issues/51).\n\n## Teritori (delivery February 2024)\n\nAfter delivering the [moderation module](https://test3.gno.land/r/gnoland/blog:p/gnoland-moderation-dao-module) in Q3, Teritori received a second grant to carry out research and implement a conflict resolution module and an on-chain project management tool. Their work also continues on the escrow module build. As an active contributor, the Teritori team helps improve Gno core as well, getting more PRs merged, participating in regular meetings, and writing documentation. Read more about Teritori in their hackerspace [issue 7](https://github.com/gnolang/hackerspace/issues/7).\n\n## Dragos (Flippando, delivered January 2024)\n\nTo experiment with gaming in Gno.land, Dragos received a grant to port his on-chain memory game Flippando from Solidity. Flippando is a simple memory game—with a twist. Players uncover tiles and must find their matches to win the game. The result can be minted as an NFT and assembled to create larger, more complex NFTs and digital “paintings.” The beta version of [Flippando](https://gno.flippando.xyz/flip) is now live on the testnet, and you can read about his experiences in developing the game on the [Gno.land blog here](https://test3.gno.land/r/gnoland/blog:p/porting-flippando-gno) or visit [hackerspace issue 33](https://github.com/gnolang/hackerspace/issues/33).\n\n## Onbloc (ongoing)\n\nAfter producing consistently awesome work and being our longest-standing contributor, Onbloc received a grant in Q4 2024 to continue iterating on Gno.land tooling, Adena, and to help build Gno.land core in preparation for mainnet release. Part of the scope was to support contract-to-contract interaction [issue 757](https://github.com/gnolang/gno/issues/757), lead a [multi-node testnet initiative](https://github.com/gnolang/hackerspace/tree/main/multinode-testnet), write pure Gno packages, and help debugging the GnoVM, among many other initiatives. Onbloc is also adding additional security to the Adena wallet and an “Airgap” feature, which you can read more about in [hackerspace issue 29](https://github.com/gnolang/hackerspace/issues/29). We’ll also release a detailed blog post soon, so stay tuned.\n\n## Coming Up in Q1 2024\n\nWe’re looking forward to more exciting developments in the coming year as we focus on the road to mainnet. In Q1, grantees will mainly focus on debugging Gno core, developing smart contracts and libraries, building and porting dApps to Gno.land, and creating educational materials to help grow the community.\n\nBlockchain software and virtual reality technologies firm Varmeta are under evaluation for a grant to support account sessions and build the Gno.land Unity SDK to make blockchain more accessible to game developers (you can track their progress in [hackerspace issue 43](https://github.com/gnolang/hackerspace/issues/43)). We’re also finalizing a grant for a DAO tinkerer and a research report, as well as evaluating the extension of a second grant to Dragos to port his popular project management app to Gno.land. \n\n\n*We’re steadily building out the Gno.land platform and our ecosystem of grantees and contributors. Let us know if you want to join us by submitting an application at any time on the [Funding and Grants repository](https://github.com/gnolang/ecosystem-fund-grants). We’re always on the lookout for ideas to advance the platform.*\n\n\n","2024-02-07T13:37:00Z","christina,michelle","gnoland,funding,grants"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["wyg-dragos","Who You Gno – On the Record with Dragos Roua","\n\nDragos Roua is a humble man. If you had the chance to read his article, [*5 Things I Learned While Porting Flippando From Solidity to Gno*](https://test3.gno.land/r/gnoland/blog:p/porting-flippando-gno), you’d have seen him refer to Flippando as his “tiny little game” and describe his “surprise,” over it winning the Polygon track of the Glitch hackathon, two subsequent hackathons in South Korea, and piquing the interest of the Gno.land team to offer him a grant. If ever there were an inverse of “the empty vessel makes the loudest sound,” Dragos would be it.\n\nAt 54 years old, he’s lived an extraordinary life. Growing up in communist Romania, where scarcity was in abundance, and “everything was in short supply,” Dragos and his peers were “only allowed to learn one coding language,” and it happened to be called “Whatever.” So, when anyone asks in what languages he knows how to code, he always jokes that Romanians can code in “whatever.” Joking apart, his language skills are impressive, to say the least. \n\n## Dragos Knows a Lot of Code\n\n“My first production-level code was written in Cobol on punch cards,” he says when he was just 16. He went on to learn Smalltalk, Lua, and “just for fun,” even a programming language called “Brainfuck.” He spent many years programming in web2, iOS, and Andriod, but over the last seven years (since entering the web3 space), has been consistently working in JavaScript, Swift, Solidity (which he learned by creating Flippando), Python, and Go. Despite this, Dragos confesses he still feels more at home within the Apple ecosystem. “I've been building a lot there,” he says. \n\n## He Speaks Many Languages\nI ask if learning programming languages is similar to spoken languages. “Every programming language has vocabulary and grammar, which is a specific set of rules over that vocabulary, so it’s similar in that sense,” he says. And how many spoken languages does he know? “I can speak five Indo-European languages” (Romanian, English, French, Spanish, and Portuguese). “Five?” I gulp, wide-eyed, suddenly feeling inadequate for only speaking three. “Well, they all share about 70% of the vocabulary, and the grammar has almost the same rule set,” he shrugs, minimizing his accomplishment.\n\nHe’s also learning two Asian languages with varying degrees of success. Korean, a language he understands “some 40%” of, Dragos admits, is a different ballgame. “I've been frustrated for nine months, every day trying to plug away because there's literally no similarity in vocabulary between any Indo-European language and Korean. Literally no word is the same, and the grammar is also very, very different.” He explains that learning a language like Korean means starting from zero and waiting for the brain to forge the neural paths. “It's quite difficult to do,” he concedes.\n\n## A ‘Location-Independent’ Lifestyle \nI check out the backdrop behind him. He’s taking the interview from an elegant cafe in downtown Saigon with impressive dark wooden walls, large ceiling fans circling above, and a rich colonial atmosphere. “It’s such a posh place,” he smiles, “every day, there are groups of people taking pictures. It has an Indochina vibe.” I can’t help but wish I could teleport over and share a beer with Dragos as we discuss his remarkable life. “How long have you lived there?” I ask, “I don’t live in Saigon,” he replies, “I’m location-independent.”\n\nAs I wonder if that’s a more elegant term for “digital nomad,” Dragos quickly explains the difference. Digital nomads typically have no fixed abode, he says, and tend to set up a base for a short period of time before moving on to the next place. Location-independent is someone who has a base but is independent of it and chooses to spend longer periods of time in various places. “So I became a loner,” he says, “and I’ve been location-independent for six years. I spent my first two and a half years in Spain, then from Spain, I moved to Portugal, which is my base right now, and I started to explore Asia last year.”\n\n## A Love of the Open Road\nI point out how amazing his lifestyle sounds—and also how challenging it must be at times. Dragos loves the freedom that comes with being alone in a foreign land and the master of his destiny. He also thrives on learning from different people and cultures and discovering more about himself. “The more you travel, the more you learn. Where can you stay? Where can’t you stay? What is needed? You learn the logistics, and you become a much better administrator and manager of your life.”\n\nHe admits to feeling lonely at times. Being location-independent isn’t for everyone, and certainly not if you don’t like being alone. “It's very difficult to be on the road because you don't have many friends. You don't have a fixed social circle. I'm in a place right now where I'm quite comfortable with myself. I can spend long periods of time on my own without needing close encounters. I have a very limited circle of friends, which I keep in touch with every month or so.”\n\nThe cultural differences between Europe and Asia are something of a double-edged sword as well. Dragos likes Vietnam, where the people are friendly and welcoming and talk to him on the street out of curiosity or to practice their English. But he’s felt like quite an outsider in South Korea, where the culture of politeness and restraint makes it harder to establish meaningful friendships. \n\n## Astrology, AI, and Other Mind-Blowing Stuff\nTalking about human connections inevitably leads to the increasing lack of them—and the topic of AI. I ask how he feels about the prospect of AGI and a potential replacement species. He shrugs and points out that most of what we hear about AI is marketing. He thinks that LLMs (Large Language Models) will hit a wall when they run out of good data to be trained on. He is a little concerned about the prospect of election rigging and AGI being harnessed in the political sphere by nation-states attempting to outmaneuver each other by predicting the next plausible move. “But this is a can of worms,” he says.\n\n“Actually, at the most fundamental level, there is no difference between AI and the process by which we generate ChatGPT or any other language model, and… hold your breath,” he pauses, “astrology. They both take a set of arbitrary features and a set of desired outcomes. After that, they just do a lot of computation, by trying to minimize a cost function between the predicted and expected outcome. That's all there is to it. You take features, add some parameters, trillions of parameters, you run a lot of computation, and in the end, you have the most plausible outcome. LLMs do this in hours/days/weeks of training, astrology did it slowly, over the course of a few thousand years.” \nI ask Dragos if he hadn’t been a programmer, would he have perhaps become an astrologer instead? “I actually studied astrology and used it for 18 years,” he replies.\n\nI try hard not to fall off my chair. Dragos explains that astrology plays a huge role in his life, and he consults it before making any major decision—such as moving countries or leaving jobs. “I consult it on every major decision and even daily life. So wherever I have to, I use it. When I sold one of my companies, when I decided to move abroad, when I travel, and stuff like that.” He gives the analogy of meteorology and says if he knows it’s going to rain, he’ll take an umbrella to have less friction and move around more easily. In the same way, he applies astrology to his life. This man is a Pandora’s box.\n\nWhat else does he do in his spare time besides traveling the world, consulting the Cosmos, and writing code for fun? Dragos likes playing pool, socializing, dining out, and dancing. “I was a tango dancer back in Romania. I had a tango school for a year.” At this point, I’m hardly surprised. \n\n## Dragos on Gno.land \nI met Dragos last year in Seoul at a Gno.land event hosted with Onbloc during BUIDL Asia. That’s when he spoke to Manfred about Flippando and subsequently applied for a grant. We were still building the specs for the Grants Program at the time, and Dragos was our first grantee. Since then, he’s embarked on a whole new journey learning Gno and building the airplane as it flies, delivering Flippando last month and regularly helping the team with Gno.land core issues.\n\nDragos has since submitted a second grant proposal to port his project management app to Gno. “It uses my life management framework, which I call “assess, decide, do.” The name of the project is *ZenTasktic*. There is already an app on iOS that I wrote,” he explains. You can read more about his grant proposal [here](https://github.com/gnolang/ecosystem-fund-grants/pull/11) and be sure to test out [Flippando](https://gno.flippando.xyz/flip) today.\n\nI apologize for taking so much of Dragos’ time, but he assures me it isn’t a problem. “I don’t work today, I'm not busy. I'm just enjoying my afternoon in this coffee shop.” As Dragos sips on the local tipple and drinks in the sights and sounds around him, I can’t help but admire his outlook on life and the choices he’s made—and I look forward to seeing what he's up to next and what else he builds with Gno.\n","2024-02-08T00:00:00Z","christina","whoyougno,flippando,community,interview"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"YorygwRB2sbXbpZvi7GNId5TIoYyQQihMAdwuYRFR+hgTSjgP4SDsQBU471OXMxnTVnp/FHbdRp8AtSIV7qg2A=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["funding-program","Announcing the Gno.land Funding and Grants Program","\n\nIf you’re interested in building in Gno.land and using the Gnolang (Gno) language to make a meaningful contribution, we’ve launched the Gno.land Funding and Grants Program to support you on your journey. If you’re a developer, tinkerer, researcher, or educator and you’re excited by the idea of creating innovative dApps, tooling, infrastructure, products, or smart contract libraries on Gno.land, now you can apply for funding.\n\n## About the Gnoland Funding and Grants Program\n\nWe’re building Gno.land to endure with timeless code that will serve as a reference point for many years to come. Secured by a novel consensus mechanism, Proof of Contribution, Gno.land rewards contributors fairly, addressing one of the blockchain industry’s biggest problems. The developers that are most active on the platform with the highest quality contributions will secure the most rewards. We already have a growing community of Gnomes innovating and building on Gno.land and we’re looking to add more contributors to extend the usability of the platform and its smart contract library.\n\nOur grants program will encourage further participation by allocating financial awards and contributions to individuals and teams who want to build dApps, core infrastructure, products, or features on Gno.land, incentivizing more like-minded Gnomes to test the Proof of Contribution mechanism and push the chain to new limits. The grant amount and duration will depend on the scope and ambition of the project as well as the work involved.\n\n## Types of Contributors\n\nThe Gno.land Funding and Grants program is divided into four different categories – tinkerer, builder, researcher, and educator – to ensure that we cater to a diverse range of people and working preferences. Here’s how we define these categories:\n\n- Tinkerer: You want to experiment and invent\n - Build dApps, improve features, and find and develop new ideas\n- Builder: You have an idea and are ready to build it\n - Build dApps, infrastructure, tooling, products, or port your existing apps to Gno\n- Researcher: You want to discover and analyze\n - Deep dive into topics linked to the Gno.land universe\n\n## What We Are Looking For\n\nTo qualify for a Gno.land grant, we’re looking for motivated and passionate people who can contribute by developing dApps, core infrastructure, useful and innovative products, or features that improve the usability of the Gno.land chain, specifically:\n\n- Decentralized Applications (dApps)\n - What types of dApps do you want to see on Gno.land? Show us.\n - Build, test, and launch a suite of Gno.land dApps for the community, focusing on diverse use cases and industries such as DeFi, gaming, supply chain management, and social media. Ensure that these apps cater to both individual users and businesses\n - These dApps should integrate seamlessly with existing Gno.land infrastructure, encourage user interaction, and promote the adoption of Gno.land services\n- Infrastructure, DevX, Quality\n - Develop comprehensive GitHub and AWS integration for Gno.land, including streamlined deployment processes, continuous integration and delivery pipelines, and monitoring tools\n - Create Helm charts for easy deployment and management of Gno clusters, enabling users to quickly set up and scale their Gno infrastructure\n - Design and implement an event system for Gno.land contracts, allowing for real-time monitoring, analysis, and auditing of contract-related events\n - Enhance Gno.land security by conducting regular vulnerability assessments, penetration testing, and implementing best practices for secure smart contract development\n- Products\n - Develop advanced project management software tailored to the needs of Gno.land developers and teams, with features such as task tracking, collaboration tools, and integrated Gno.land services\n - Create comprehensive documentation, including guides, tutorials, and API references, to help users understand and utilize Gno.land's features and services more effectively\n - Design a censorship-resistant smart contract system, enabling secure and transparent transactions and interactions on the Gno.land platform, free from external interference\n- Interoperability \u0026 Integration\n - Implement cross-chain compatibility and interoperability, allowing Gno.land to connect and interact with other blockchain networks, expanding its potential user base and increasing its overall reach\n - Develop a powerful integrated development environment (IDE) specifically for Gno.land developers, with features like code completion, debugging tools, and seamless integration with Gno.land services\n - Design and launch a user-friendly wallet for Gno tokens, featuring a secure and intuitive interface, support for multiple devices, and easy integration with Gno.land dApps\n\nThe above guidelines are by no means exhaustive and are intended to spark your imagination and give examples of the types of contributions we’re looking for in Gno.land. We’re open-minded and willing to assess all grant proposals, so if you have an idea that’s not on the list or a suggestion that you think will benefit our vibrant community, let us know. If your submission doesn’t qualify for a grant, we’ll do our best to provide you with open and honest feedback and points for improvement, as well as identify any opportunities to get involved in our ongoing incentivized Game of Realms competition.\n\n## Meet Our First Grantees\n\n### Onbloc\n\nOnbloc is a blockchain software company building core infrastructure for Gno.land and\n\nhelping other dApp developers onboard to the Gno.land ecosystem seamlessly. The team has developed the Gno.land Developer Portal, which provides comprehensive introductory docs for developers, the Adena web3 wallet for Gno.land, and the Gnoscan block explorer. As Gno.land’s most active contributor, Onbloc is leading many community-driven initiatives and we’re excited to extend a grant to this passionate South Korea-based development team to continue their incredible work developing the wallet further, iterating the Gnoscan block explorer, and building Gno.land’s first DEX, Gnoswap.\n\nIn addition to this, we want to encourage Onbloc to continue their amazing work with the community, contributing to meetings, replying to comments on our social platforms, writing code base, organizing local events and meet-ups in South Korea, and creating products that expand the Gno.land ecosystem.\n\n*“Onbloc is thrilled to be a part of the Gno.land Grants Program. As one of the earliest contributors, our endeavors have involved releasing technical guides and research reports, developing infrastructure tools for dApps, creating DeFi smart contracts, and more. We are excited to leverage this grant to further enhance the quality of our products and strengthen our workforce. The grant will enable us to cover some of the existing expenses and hire additional developers to focus on smart contracts and the core side of GnoVM. We expect these endeavors to push the Gno.land blockchain to new limits and accelerate the achievement of the milestones on our roadmap. With the support from the Gnoland team, we are confident in our ability to make significant strides and further contributions to foster the growth of the Gnoland ecosystem.”*\n\n*Dongwon Shin, CEO, Onbloc*\n\n### Teritori\n\nTeritori is a super-dApp project allowing individuals and organizations to interact, organize, and communicate in a radically resilient and decentralized way. Based on an interoperable vision, the application is built on a multi-chain experience approach, gradually integrating Gnolang as the fundamental technical brick of the system. Currently in Beta ([available here](https://app.teritori.com/)), the app is making modular tools and dApps available to users, with a single gamified user experience. Teritori's philosophy is to offer users and developers a place that belongs to them, their territory, with an emphasis on interoperability, modularity, and customization.\n\nUsers can interact with a social network, NFT marketplace, DAO launcher, service marketplace, games, etc., and integrate a plethora of dApps thanks to the dApp store, where Teritori will promote all Gno.land dApps to encourage the growth of the ecosystem. Using the Gno.land grant, Teritori will continue this amazing work and develop a moderation DAO to provide content moderation to Gno.land in a healthy and decentralized way, a challenge that faces the entire web3 industry. By 2024, the UX of Teritori v1 will be based on decentralized messaging without blockchain, allowing users to converse in a \"natural\" way while adding modules and web3 features. Creating and managing a GnoDAO could be as easy as managing a WhatsApp group.\n\n*“At Teritori, we want to make decentralized organizations accessible to all and experiment with new governance models for humans, social groups, businesses, and diverse organizations. Gno.land enables us to build this vision in a modular, future-proof, and censorship-resistant way. Thanks to the Grants Program, we'll be able to accelerate our development, continue to contribute proactively and build user experiences that enable as many people as possible to discover the Gnol.and ecosystem. We're starting work developing a DAO launcher, with different standard templates for DAOs, in particular, DAOs enabling moderation within news feeds, forums, or social networks. This will rapidly open many doors, such as those of conflict resolution DAOs, on-service marketplaces, or project management software. Gnol.and is a playground where anything is possible! We'll be documenting [our journey here](https://github.com/gnolang/hackerspace/issues/7#issuecomment-1588197187), and sharing our progress as we stay connected to the needs of the community.”*\n\n*Zooma, Core Lead, Teritori*\n\n### Zack\n\nZack is the first tinkerer-in-residence at Gno.land. With a deep-rooted passion for innovation, he embraced Go early on in 2013 and ever since, has been harnessing its power to craft peer-to-peer programs and develop web2 applications. While Gno.land marks Zack's initial foray into web3 development and blockchain dApps, the Gnolang language allowed him to effortlessly apply his Golang expertise. This has enabled him to flourish within an ecosystem that revolves around decentralized systems, seamlessly transitioning his skill set to create unique decentralized solutions.\n\n*“I have always been curious about web3 and blockchain technologies but have not developed expertise in smart contract languages and struggled to keep up with the fast-changing ecosystem around blockchain technologies. As an avid Go programmer, Gno and Gno.land created the opportunity for me to develop decentralized applications on blockchains by providing a framework and ecosystem that is consistent with Golang in terms of syntax, sustainability, and stability. The additional web3 features in Gno and Gno.land provide huge potential for interesting applications that I hope to unlock to move beyond web2 and harness blockchain technology for novel use cases. The grant provided for tinkerer-in-residence was the key to giving me the resources to move through this ecosystem as I try to think outside the box for what web3 can be and what blockchain can do for a web2 developer like myself.”*\n\n*Zack Scholl, tinkerer-in-residence*\n\n**How You Can Apply**\n\nActions speak louder than words. Until Gno.land is completely on-chain, the best place to start is by contributing to PRs and issues on the Gno.land repos or participating in the Game of Realms competition. If you want to apply for a grant, you’ll need to fork the Gno.land Ecosystem Fund repo and outline your proposal in your project name’s file. Once we receive your application, our team will review it and get in touch if we believe that you fit the criteria. [See GitHub for full instructions](https://github.com/gnolang/ecosystem-fund-grants). Stay tuned, we’ll be hosting a Funding and Grants Program Q\u0026A in the next few weeks!\n","2023-06-27T13:37:00Z","christina,michelle","gnoland,funding,grants"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"v7fDGzeYbujL/WoZ/d/5Is9FV8jdp8BcvKa3Sq0zo9NsBTBD1IPBeyHZEneDVQAyMWU4osRr/FEqLylJU4i9BQ=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-4","The More You Gno: Gno.land Monthly Updates - 4","\n\nWe’ve had more on our plates than ever over the last few weeks, with a huge team presence in Paris at EthCC and Nebular Summit in July, an opening talk at Stanford Blockchain Club in August by Gno.land’s founder Jae Kwon, and some awesome contributions from Gno.land grantees and ecosystem partners, including the first demos of Gnoswap and Teritori’s social platform and DAO deployer. We continue to make solid progress on GnoVM, an alternative VM in Rust, Tendermint2, native bindings, and much more. Check out our latest developer updates below.\n\n## Upgrade Strategy for AVL Between GitHub and test3.gno.land\n\nOne ongoing discussion is about an incompatibility bug that affects many things we do on Gno.land. The current AVL implementation on the testnet is outdated and does not match the AVL implementation users get when they pull in the latest master branch. Therefore, building and deploying contracts on a local Gno chain (with the latest master changes) and deploying those same contracts on the testnet may fail due to this incompatibility. We need to find a way to seamlessly integrate these two approaches. Ideally, when you write code on the master branch on GitHub, it should work on the testnet as well.\n\nIn [issue 970](https://github.com/gnolang/gno/issues/970), you can find details of five different proposed solutions to implement this upgrade strategy, from resetting the whole blockchain (which would mean losing on-chain content and debugging information) to implementing a migration feature specifically for testnets that allows developers to rename packages and patch their contracts before publishing them. There are pros and cons to each proposal, and we continue to work together to find the best way forward.\n\n## Encoding JSON and the Discussion Around Reflection\n\nSome contributors have highlighted the need for native JSON encoding, and we are discussing how best to approach it. See [issue 808](https://github.com/gnolang/gno/issues/808) for further details. One idea is to copy the code from encoding JSON in the standard library Go and take it over to Gno, but we would need to have reflection to do that. So, the important question here is whether we want to have reflection and, if so, what it should look like. We could emulate Go’s reflection package with some added elements, like being able to inspect the realm state, but we would need to be extremely careful about how we do this.\n\nFor example, should users be able to read private fields of external packages through reflection or even *ufmt*, or could that introduce a problem? It would be simpler, and the language capability security would be tighter and easier to understand if we made accessing private fields impossible, but that would also make it limited. We could consider supporting reflection as an internal user package and whitelisting and encoding JSON. This way, new encoding packages would have to be whitelisted because they’re using the reflection package. We could also mark reflection as unsafe so developers know they must carefully audit their work.\n\nAnother solution is the partial implementation of reflection. In [issue 971](https://github.com/gnolang/gno/issues/971), Gno.land core engineer Petar discusses introspection, which involves implementing reflection as Go has it now but enabling only one of its two main capabilities: the ability to inspect types, but not the ability to modify code. The main difference between introspection and reflection is that, since it is done at compile time, it is completely type-safe. This discussion is ongoing.\n\n## Alternative GnoVM Implementations\n\nTo deliver the best possible virtual machine, we’re working on two different implementations of GnoVM. Petar has spent the last three weeks developing a new GnoVM implementation written in Rust. His work is still private as the machine is not yet ready for public use, but he will soon make the code public for your inspection. Rust gives the ability to write more performant code and, in some scenarios, the Rust GnoVM can run up to 20 times faster than the GnoVM at roughly 87 milliseconds compared to 2,000 milliseconds on a Fibonacci benchmark, which is a considerable improvement in speed.\n\nSince one of Gno.land’s core features is that the entire tech stack is written in Go, we’re unsure if everyone will appreciate a Rust GnoVM or whether it aligns with our vision. However, it’s always good to provide alternatives, and, Petar argues, as long as the VM carries out the same functions (and does so more cheaply), most developers won’t mind what language the VM is written in.\n\nRust has a few other features that some developers may favor over Go, such as more tools for creating languages, advanced garbage collector libraries that allow you to change the algorithm without changing the runtime (by swapping out a tricolor algorithm for a generational one, for example), and built-in data structures that solve many issues. For example, we needed a deterministic map that is fairly fast. With Rust’s Btree in the standard library, this was simple, Petar only had to implement the native Go map type with a Btree map from the standard library. This took just a few minutes.\n\nCore team dev Marc has also started an initiative to improve the Go GnoVM so that it is faster and offers a clean and user-friendly interface. He believes the debate over the VM is more about whether to have a VM that is bytecode-defined or AST-defined (rather than speed). Marc has been comparing the fundamental differences between the two and noted that the bytecode version is 15 times faster than the AST. This means that changing to Rust would give an increased performance of 2-3 times.\n\nThe VM must be fast, secure, and performant in many ways. In either version, the AST will be stored on the blockchain, whereas the bytecode is only an internal representation that doesn't affect the users. We must still consider any potential architecture consequences between bytecode and AST before deciding whether to change. Marc’s WIP code is still in a private repo, but you’ll be able to inspect it soon and make a comparison of the VM implementations in the coming weeks. The decision about the direction of GnoVM is still very much TBD; however, the Rust GnoVM will not replace the Go GnoVM but will complement it, eventually giving validators the choice of which to run.\n\n## Defining Wording for People/Documentation and Consistency\n\n[Issue 1024](https://github.com/gnolang/gno/issues/1024) discusses the need to define the wording we use throughout our documentation, for example, how we name a module, package, sub-module, etc. Once we have the wording defined, we will set the GnoVM to only accept elements with the correct naming. The importance of wording affects the design choice of the whole project and how we go about versioning for the best possible user experience.\n\nFor example, is mt/board/admin part of the same realm of mt boards, or is it its own realm? Can we work with both by adding patterns to have some realms responsible for hosting data and others responsible for having more privileged actions? How do we split a complex realm into sub-libraries and sub-realms? We want to define the documentation and the logic for this and have begun to touch on this issue. We will discuss this in greater depth in the upcoming developer calls.\n\n## Improving the GRC20/Foo20 APIs\n\nWhen working on the specs for a Merkle airdrop contract, Albert came against some issues with users initiating airdrop reward claims (see [PR 906](https://github.com/gnolang/gno/pull/906) for more details). Currently, when the Merkle airdrop contract tries to execute the reward claim for the user, an instance of the GRC20 contract is used for transferring. Within the GRC20 implementation Transfer() method, the caller (token sender) is fetched using the standard library method std.PrevRealm().\n\nHowever, calling this method in the Merkle airdrop context returns the user as the caller, not the Merkle airdrop contract, which is an unexpected functionality. We are discussing different ways to tackle this issue efficiently. However, each solution would require possible changes to the GRC20 API and subsequent token implementations. Additionally, as part of [PR 952](https://github.com/gnolang/gno/pull/952), we are looking into improving the standard GRC20 API and possibly resolving the ambiguity with standard library calls that are causing the mentioned issues.\n\n## Client Optimized for CLI, Not Mobile\n\nOur newest contributor to Gno.land, Berty, is developing the mobile version of Gno, which means writing a mobile app to interact directly with the blockchain. The team is facing some issues as they need a client library with utility functions like sign and broadcast, which are used by the command line. This code (tm2/pkg/crypto/keys/client) is not ready for external users yet, and the Gno client is designed for CLI. However, Berty needs a way to interact with the Gno chain from their application and to call the logic without adding the full CLI.\n\nFrom the existing TypeScript/JavaScript client library (gno-js-client and tm2-js-client), Berty should be able to build out a Go client library by exclusively using the RPC endpoints of the node itself (just like gno-js and tm2-js work), and not having to worry about importing private logic like transaction broadcasting. The team is writing its own framework to call Go code for Gno from Java, Swift, and React Native mobile apps that creates a transaction and sends it (see [PR 1047](https://github.com/gnolang/gno/pull/1047)).\n\nThey are working on an API that interacts with the blockchain and lets them export the code without having to write their own utilities. The API will be minimal, and update the Tendermint2 build script by moving tm2txsync from tm2/cmd to gno.land/cmd (see more details in [PR 1080](https://github.com/gnolang/gno/pull/1080) here). For the time being, Berty will copy the code and use the objects directly until a more convenient API is complete.\n\n## Tendermint2 Development\n\nIn [PR 546](https://github.com/gnolang/gno/pull/546), we introduce file-based transaction indexing. Transaction index parsing should be done as a separate process from the main node, meaning other services can be instantiated to index transactions as readers. The current problem is that there is no way to figure out whether a transaction has failed after it’s been sent out with a broadcast sync, or fetch any kind of receipt information or error reason in the delivered transaction.\n\nSo, we’ve started working on an event indexer to index Gno node events, which include transactions. Soon, developers and users will be able to ask the event indexer what happened to the transaction or in which state in its execution it's currently at, and also to retrieve information on other events like block commits as they happen.\n\n## Extending the Functionality of Go\n\nIn [issue 919](https://github.com/gnolang/gno/issues/919), Petar proposes extending the functionality of Go by adding constant data structures, arrays, slices, etc. He believes this would benefit users, as they wouldn’t need to create special functions as in Go to simulate this behavior, and it would also catch bugs when there is mutation. There has been a discussion, and Jae has similar ideas with the notion of “invar” expressions, where the resulting value can only be read, not mutated or stored. This would fix the bug where if you pass a pointer (that represents part of your contract state) to another contract, the other party can “steal” it by assigning it to their state, and your contract would fail to execute.\n\nMorgan believes that we should take a different approach as slices have the semantic in Go, where the underlying array is always heap-allocated and modifiable. Introducing constant slices would thus necessarily have to introduce concepts regarding im/mutability of values without the matching constructs that a language like Rust has. To make a compromise and keep compatibility with the Go spec, we are likely to implement this in a transpiler (gnoffeescript) that would implement this feature and be able to transpile to valid Go.\n\n## Grantee and Ecosystem Updates\n\nAs you can see, we’ve made a ton of development progress over the last few weeks. We’re also steadily adding more gnomes to our community of builders, and they’re working on the core infrastructure of Gno.land, as well as the permissionless dApps the platform will house. Let’s see what they’ve been up to since the last update.\n\n## Onbloc\n\nOnbloc has been busy, as always, with a slew of updates for us over the last few weeks. The team has been developing Gnoswap, the first Gno.land automated market maker with concentrated liquidity, and they gave us a live demo. On the front end, which is still a work in progress, you can find a one-stop venue for traders to view all the information about tokens on gno.land, so you don’t have to move between Gnoswap and a token aggregator like CoinGecko. You can also see incentivized pools sorted by liquidity, volume, APR, liquidity mining rewards, etc., and a wallet page to check your balances. You will also be able to deposit or withdraw assets from the Interchain when IBC is enabled.\n\nCheck out the work they’ve done so far on the Onbloc [hackerspace](https://github.com/gnolang/hackerspace/issues/29). The team has also released [the documentation](https://docs.gnoswap.io/) about what you can expect from Gnoswap, the rationale behind their design choices, some information about tokenomics, a preview of the UI, and more. Their main focus is on delivering a smooth and welcoming user experience and abstracting away the difficult mechanisms of concentrated liquidity so that the interface is as minimal and simple as possible.\n\nThe team will be ready to launch Gnoswap as soon as gno.land reaches mainnet. Feature updates and enhancements will be aligned with the development of the core Gno Stack.  The code for Gnoswap has now been [open-sourced](https://github.com/gnoswap-labs), so you can take a look at everything they’ve done and even make suggestions. In the coming weeks, Onbloc will also work on building core Gno.land infrastructure to support an earlier launch. Find details of this in Onbloc’s [grant submission](https://github.com/gnolang/ecosystem-fund-grants/pull/4). And be sure to check out Onbloc’s informative 6-episode [blog series](https://medium.com/@gnoswaplabs/why-gno-introducing-gnoswap-dd6acc22e6a1) that features the history of blockchain and exchanges, a deep dive into the Gno Stack, and an introduction to Gnoswap, where they share details of their journey and insights.\n\n## Teritori\n\nWe also saw an awesome demo from the Teritori team, which you can check out at app.teritori.com. Simply connect your Adena wallet to create a user name, start interacting with the social feed, create your own DAO, and add members. The team is working on more extensive documentation to explain how it works in more detail. While still a work in progress, Teritori has developed a cool flagging system that allows you to unfollow content you don’t like or flag content as inappropriate. If posts receive many flags, users can vote on whether to ban them, creating a healthy and supportive social environment free from derogatory content monitored by a like-minded community through a moderation DAO.\n\nThe team continues its work on DAO interfaces and has built a useful tool for speeding up the deployment of packages as a workaround until we’ve decided how to best tackle realm versioning. They are also working on the escrow system, which will be useful for the freelance marketplace, and presenting DAO standards documentation.\n\n## Berty\n\nWe have a new contributing team to Gno.land from the Berty private messaging app. This team is working on a mobile version of Gno.land, implementing the WESH protocol, which is available by Bluetooth, local WIFI, or other means, and provides secure censorship-resistant communication between devices. The plan is to be able to provide an alternative transport for Gno applications when the internet is not available and build the skeleton/foundations that enable developers to create Gno-centric mobile apps more easily in the future. Berty brings a ton of experience in off-grid communication and getting apps to run on mobile devices, both Android and iOS.\n\nThe team has created its own [testnet](http://testnet.gno.berty.io/), which you are welcome to test out and play around with, although they will be restarting and rebooting without prior notice, so be aware that your work could be wiped. In the few short weeks they’ve been working with us, Berty has already finished their first Proof of Concept, a simple app running on iOS and Android. They copied code from the gnokey command line, and now it’s installing and running on mobile and interacting with the blockchain.\n\nNow, Berty is working on a nicer UI for the app and will propose a project to create a formal framework called GnoMobile, which will allow anyone to create their own app and run it on mobile. We look forward to seeing their demo soon.\n\n## Golang Working Group\n\nIn other news, we've started a bi-weekly [Gnome Golang Working Group](https://github.com/gnolang/hackerspace/issues/15) where we get together and discuss various topics, such as the language-related and theory elements of Go and Gno. We also aim to identify meaningful and reasonable ways to contribute to Golang, Gophers, and the general open-source community and improve our visibility there. We hope to attract more Go devs to the project and provide a “blockchain-less” experience for web2 Go devs.\n\nWe've had two meetings so far, and some recent hackerspace issues have already emerged from the discussions. One in particular that we’re actively evaluating is Gnoffee, a transpiler tool inspired by the likes of [CoffeeScript](https://coffeescript.org/) for Go and Gno integration. Gnoffee would be a powerful standalone tool to enhance Go and Gno (blockchain) projects by generating code and seamlessly integrating new features without manual coding. Find out more at the link above.\n\n## EthCC and Nebular Summit\n\nThe Gno.land team was in full force in Paris at the end of July for EthCC, where we met many passionate developers and spread the word about Gno.land and, specifically, how Gnolang compares and contrasts to Solidity. We had a booth during the conference manned by the Gno.land team complete with awesome swag and a continuous presentation in the background playing on a full-screen television.\n\nAt Nebular Summit, our VP of Engineering, Manfred Touron, [gave a talk](https://www.youtube.com/watch?v=CtxBajCcTYQ) called ‘Gnolang for Developers: Examining the Core Stack,’ where he broke down the major components of Gno, demonstrated how the upcoming Gno SDK compares with the existing Cosmos SDK, and explained why Gno.land is an excellent choice for accessible and sustainable blockchain development.\n\n## Blockchain Application Stanford Summit (BASS)\n\nJae opened the [Blockchain Application Stanford Summit (BASS)](https://bass.sites.stanford.edu/) event, attended by thousands of students and future blockchain developers. He gave an overview of Gno.land, GnoVM, and Gnolang, and explained the features that make our platform paradigm-shifting and timeless. He also dove into the core of why we’re building Gno.land – to provide a censorship-resistant platform for truth discovery that helps people improve their understanding of the world in an era of information censorship and control.\n\nComing up later this month, you can catch up with the Gno.land team at [DappCon Berlin](https://www.dappcon.io/) from September 11-13, where we’ll be delivering an informative keynote and hosting a side event to get to gno you better. If you find yourself in Barcelona for [Web3 Family](https://web3fc.xyz/) on September 23, you can join in a Gno coding workshop. You’ll also be able to meet the team at [GopherCon US](https://www.gophercon.com/) in San Diego. We’re hosting an action-packed workshop, ‘Chess: The Gnolang Way,’ on Gopher Community Day, where you can learn to build a web3 chess server on Gno.land and compete for cool prizes in an ongoing chess tournament throughout the event. More details coming soon. That’s all for now! Be sure to check back again with us for the next edition of *The More You Gno* to keep up with all our progress.\n\n*Do you want to contribute to Gno.land’s monthly updates? If you’re building on Gno.land and want to highlight your development, project, event, or idea, let us know, and we’ll include your contribution.*\n","2023-09-04T13:37:00Z","christina","gnoland,gnovm,tm2"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"VRk4WiRjvx8lSUmlZYYkFxT+vamSa+Uq8FmcuPsmPdxGbmRuChwq+e7wSzgM4wmQh62zxz9DVe0IPcweMxEn1Q=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-3","The More You Gno: Gno.land Monthly Updates - 3","\n\nWe’ve been busy since the last edition of *The More You Gno,* with the Gno.land core team and ecosystem partners present at various global developer events. We’ve visited many gnomes (and gnomes-in-the-making) around the world from Berlin to Belgrade, spreading the word about Gno.land and growing our expanding community. Aside from all the networking, Gno.land is taking shape with a new iteration of our website, the Gno.land Funding and Grants Program, and a host of developer updates as always. Let’s dive in.\n\n## Gno by Example\n\nWe recently launched [Gno by Example](https://gno-by-example.com/), our equivalent to both [Solidity by Example](https://solidity-by-example.org/) and [Go by Example](https://gobyexample.com/), where you can see tutorials and code snippets to help you learn and get more easily onboarded to Gno.land. Gno by Example is designed to be community-run with a front-end app and tutorials in markdown. There’s also a specific markdown syntax where you can embed certain file fragments to make your tutorials more structured. We’d love to build this into the ultimate resource center for Gno.land, so feel free to [contribute](https://github.com/gnolang/gno-by-example) with new tutorials and sections. Contributions here are eligible for rewards from the Game of Realms competition.\n\n## GnoVM\n\nWe continue developing GnoVM and invite you to provide feedback on what can be improved. This month, there have been a lot of discussions about how to improve native bindings and use the Gno machine in native function calls. Native function calls are well-defined in Go code generation and Go templates but need some modifications for GnoVM. For example, since new native functions already exist in the Gno code, when we try to define a native function, calling the function doesn’t yield the desired result. We’ve created a bunch of panics and tried writing out native functions to see what goes on for them, in an investigation that will go on for the next few weeks. Got any ideas? Please contribute. ([PR 859](https://github.com/gnolang/gno/pull/859)).\n\n## Testnets\n\nTalk about testnets has come up a lot in recent weeks and how to best proceed. Some gnomes are asking for a multi-node testnet to allow for great experimentation, whereas others prefer to keep the testnet single-node. There are advantages and disadvantages to both approaches and we are still listening to feedback and ideas. However, we will likely keep testnet 3 single-node and focus on the language while having a second dedicated multi-node testnet where devs can get creative, think outside of the box, test performance, consensus, and everything they need to push the chain to its limits. We’ve created a new [Hackerspace](https://github.com/gnolang/hackerspace) Repository for the multi-node testnet to prevent spam on the main repo, so please use it to share your scripts, posts, snippets, etc.\n\n## Native Coins and GRC-20 Tokens\n\nWe uncovered some significant issues with the banker module ([PR 393](https://github.com/gnolang/gno/pull/393)) regarding minting and burning tokens with the package minter. It was not scoping, filtering, or minting tokens correctly, making it possible to mint and burn unlimited tokens, including GNOT. We want to allow any realm to create its own token and run multiple tokens on their chains, but we need a prefix for security to resolve the issue and allow anyone to create GRC20 smart-contract-based coins but not native coins. We continue to work with small fixes on this issue and will reopen the PR soon.\n\n## Gno.land Funding and Grants Program\n\nLast month we released our Funding and Grants Program to encourage more developers, researchers, educators, and tinkerers to interact with Gno.land. If you’re interested in experimenting with Gnolang (Gno) and building innovative dApps, tooling, products, or infrastructure, check out our GitHub [Funding and Grants](https://github.com/gnolang/ecosystem-fund-grants) page for further information on how you can apply. Start contributing to Gno.land or Game of Realms as this is a prerequisite of the funding and grant application process.\n\n## Developer Relations\n\nThe Gno core team is growing! We hired a new DevRel last month and are looking to take on another dev for this open position, so if you’re interested, head over to our [careers page](https://jobs.lever.co/allinbits) and apply! You can expect to see a lot more documentation, FAQs, tutorials, and onboarding materials in the coming weeks and months.\n\n## Ecosystem Updates\n\nOur community of gnomes continues to expand, making tons of activity and progress over the past few weeks. Let’s see what they’ve been up to below.\n\n## Onbloc\n\nOnbloc has been super active this month attending and co-hosting IRL events and networking to find new gnomes about town. Among other updates, Onbloc has completed the first integration of Tendermint2 JS with the Adena wallet and will continue to swap out their existing libraries with TM2JS wherever applicable to ensure that they are as tightly integrated as possible. The team has also open-sourced the Gnoscan block explorer, so if you’re interested in contributing, hop on over to [Gnoscan](https://gnoscan.io/) or the [GitHub repo](https://github.com/onbloc/gnoscan).\n\n## Teritori\n\nAnother of our first cohorts from the Grants program, Teritori continues to churn out awesome work and expand its growing team. This month, Teritori has been busy integrating Adena with the Teritori app and working on the DAO contract to build a DAO deployer and various DAO standards and templates for DAO creation. Teritori’s target is to focus on a moderation DAO that can be used for content moderation in social feeds and boards. In the coming weeks, the team plans to integrate the DAO contract into the UI to allow the community to launch a DAO and experiment on the testnet. They have also made an effort to really integrate Gno users by adding .gno at the end of nicknames for people to use. All our grant recipients are documenting their journeys in the hackerspace repo, check out [Teritori’s](https://github.com/gnolang/hackerspace/issues/7) journey.\n\n## Resident Tinkerer, Zack\n\nAnother grant receiver, Zack, has been making significant progress on his microblogging project. You can check out the specs on GitHub ([PR 791](https://github.com/gnolang/gno/pull/791)) or watch the informative tutorial video, [Go to Gno: How to Build a Microblog](https://www.youtube.com/watch?v=F-_dadxcRJM). You’ll find this especially useful if you have a background in Go and need some additional insights to turn your hand to blockchain coding. Zack has also been working on an implementation of a smart contract for creating and transferring text-based NFTs that conform to haiku poetry standards (find out more on GitHub ([PR 860](https://github.com/gnolang/gno/pull/860)). Other than that, Zack continues his Gnolang journey, “learning and having a lot of fun.”\n\n## EthSeoul, BUIDL Asia, and Getting to Gno\n\nJune saw members of our core team heading over to Seoul, South Korea, for a week of networking, talks, and events. Our VP of Engineering Manfred Touron gave a keynote on the evolution of smart contracts and an introduction to Gno.land for participants of EthSeoul, followed by a fascinating dive into Proof of Contribution at BUIDL Asia, where we also had a booth. It was an honor to meet so many talented and motivated Korean developers and contributors from around the globe. Seoul is a hotbed of up-and-coming talent and we’ll definitely be back soon.\n\nWe also had the chance to meet with our most active ecosystem contributors Onbloc and co-hosted an event together, Getting to Gno, at the Code States developer academy along with long-time Cosmos builders, Cosmostation. Attendees had the chance to hear about what the core team is building and see some of the great work of our community. A massive thanks to everyone involved, it’s awesome to be BUIDLing together! Read more about our Korean adventures in this [fab write-up by Onbloc](https://medium.com/onbloc/2023-buidl-asia-recap-894c60a1c0f).\n\nEthSeoul - [Watch the talk here](https://www.youtube.com/watch?v=_iSsStlmxoU)\n\nBUIDL Asia - [Watch the talk here](https://www.youtube.com/watch?v=v6k3NHm5vcE)\n\n## EthBelgrade\n\nCore contributor Milos Zivkovic rocked the Gno.land presence at EthBelgrade in Serbia, giving an introductory workshop about Gno.land, called 'Alice in Gno.land'. Being the first Ethereum conference organized in Serbia, there were lots of attendees from all over the Balkans. Participants joined in a journey through the enchanting realm of Gnolang and the Gno.land platform. Most of the participants were not aware of Goland before but were avid Gophers eager to learn more about the application of the Gno language in blockchains.\n\n## GopherCon Berlin\n\nThe Gno.land team also had a blast last month at the European edition of GopherCon in Berlin. We had a booth at the event for two days, where we networked, talked about all things Gno, made some amazing connections, and even shared some live code! We’re looking to build an active, open-source Gopher contributor group in Gno.land, so stay tuned for more on that soon.\n\nComing up later this month, Gno.land is an official sponsor of EthCC, Paris, July 17-20. Stop by our booth to pick up some swag, say hey, and ask your questions about Gno.land. You can also catch us at the Nebular Summit for a keynote and workshop by our VP of Engineering, Manfred Touron.\n\n*Do you want to contribute to Gno.land’s monthly updates? If you’re building on Gno.land and want to highlight your development, project, event, or idea, let us know and we’ll include your contribution.*\n","2023-07-11T13:37:00Z","christina","gnoland,gnovm,tm2"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"4D5ocCVj8IhYlmOet3XpZLN1f5Otgg433mq9GpxjruA3zPYCcoKJhCCZ/+jJrizzhqlcDI9PFpsPtWBscXh1Rw=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["chess-gc23","Play Chess with Us: The Gnolang Way at GopherCon 2023","\n\nCalling all gnomes and gophers! Come join the Gno.land team at GopherCon 2023, September 25 - 28, in San Diego, US. We’re sponsoring this year’s action-packed event that will gather together some of the world’s brightest minds and smartest programmers under one roof. So drop by our booth, pick up some swag, and say hey! We’ll be on hand every day to meet and greet, answer all your questions, and discuss everything Go, Gno, and beyond! We’ll also be hosting a workshop on Community Day, September 26, called ‘Chess: The Gnolang Way,’ where you can learn how to build a web3 chess server on Gno.land.\n\n## GopherCon 2023\n\n[GopherCon](https://www.gophercon.com/) is a community-driven annual event that started in 2014 and is dedicated to promoting the use of Go and the education of Go developers. Every year, thousands of gophers from around the world exchange ideas, share their work and expand the Go network. There are four days of fun-filled activities, including hands-on workshops, informative keynotes, networking events, and hackathons, all taking place in the laidback West Coast city of San Diego. Where better to expand your knowledge and make new friends than in one of the US’ most popular destinations?\n\nAs a gold sponsor at this year’s event, Gno.land will be running a booth and doing our best to convert as many gophers as possible to Gno, showing them how easy it is to port their existing web2 apps over to Gno.land or to build completely new ones from scratch.\n\n## Chess: The Gnolang Way\n\nIf you’re looking for a hands-on coding experience and to have a little fun with us at the same time, join us on Community Day for an awesome workshop, **‘Chess: The Gnolang Way.’** Kickstart your day by learning to build a web3 chess server on Gno.land using Gnolang. By the end of the session, you’ll have gathered basic knowledge on developing and deploying smart contracts on Gno.land, and connecting smart contracts to a web frontend. You’ll also see how web3 enables you to write perpetual and trustable social and gaming platforms and how to build a web3 chess server and website with Gno.land.\n\nIf you want to join us, meet us at 10:00 a.m. in the Grand Ballroom 10.\n\n## Let’s Play\n\nAfter the workshop, the fun begins with an ongoing chess tournament throughout the GC23 summit for event participants. To be in with a chance of scooping up some seriously cool prizes, GC23 attendees will need to show us their best moves and how much they engage with the Gno.land chain. This competition is designed to put our platform to the test over two main areas: chess mastery (50% of points) and platform engagement (50% of points). To be eligible for prizes, participants must be present at the event. We hope to see you there! If you can’t join us in person in San Diego, be sure to [follow us on X](https://twitter.com/_gnoland). We’ll be giving updates on our progress and sharing the highlights of the event. May the best gnome win!\n","2023-09-25T13:37:00Z","christina","gnoland,gnovm,gnochess,events"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["gnomobile","GnoMobile, a Framework for Building Gno Mobile Apps","\n\n*This blog post is written by Berty Technologies, an NGO that is building open and free communication solutions without any of the limitations imposed by centralized systems. Berty is a proud partner and grantee of Gno.land.*\n\nThe year is 2023. Current Gno apps run on desktop or laptop computers that have Go installed. To run on mobile, the app would need to bundle the Go runtime, which is complicated for most developers. At Berty, we have years of experience using Go on mobile and overcoming difficulties with Android and iOS operating systems. We built Wesh Network, a decentralized communication protocol that enables p2p users to reliably and securely send messages over async networks, even in environments with poor or no connectivity.\n\nThis stage is thus set to take the leap and make it easier for builders to develop Gno applications for mobile devices.\n\n# What is GnoMobile?\n\nSimply put, GnoMobile is a framework for developing Gno mobile applications. This is how it works:\n\n*WARNING: Deep technical sections ahead. Grab a coffee before venturing forth*.\n\nFor communication between the mobile app and the Gno code, GnoMobile uses [gRPC](https://grpc.io/), a well-supported framework that sends and receives Google Protobuf messages. Even though the core Gno code is written in Go, the app code can use React Native, Java, Swift, etc. The following system diagram shows how gRPC is used.\n\n\u003cdiv align=\"center\"\u003e\n ![](https://github-production-user-asset-6210df.s3.amazonaws.com/109347079/267934754-e4da6fec-a586-4ebe-97cc-3b3ad7f79370.jpg)\n\u003c/div\u003e\n\nMoving from the bottom to the top, this is how the flow looks:\n\n1. At the bottom are Go packages in the gno codebase. A **gnoclient.Client** supports communication with the remote Gno.land node with methods like Call to call a realm function. The Gno codebase also has **keys.Keybase** to support a wallet stored on the local device with methods like CreateAccount.\n2. These methods are called directly from the next level up by the **GnoMobile** Go code. A Go object can’t be passed through the gRPC interface, so the GnoMobile Go code maintains a persistent gnoclient.Client object, which is accessed by gRPC calls. The GnoMobile API functions are registered by an amino package.go file and the generated Protobuf files are used to configure the gRPC server.\n3. Finally, at the top of the diagram, the **gRPC client in the mobile app** communicates with the GnoMobile gRPC server over a local connection using Protobuf messages. A gRPC call can either return an immediate result (for example, GetKeyCount) or an asynchronous gRPC stream object, which can return delayed results (for example, a Call to a remote realm function). The gRPC framework uses the Protobuf API to generate convenient API functions in the mobile app’s [preferred language](https://grpc.io/docs/languages) (React Native, Java, Swift, etc.).\n\n# How GnoMobile benefits builders\n\nThe first version of the framework will include three main sets of features:\n\n1. **Blockchain Operations**: These refer to the core block of functions that the apps need to interact with the blockchain. Things like the gnoclient API to effectively bring the benefits of the Gno framework on mobile, the gas estimation interface and calling realm functions, querying a blockchain node (and more) are included here.\n2. **Wallet**: As the name suggests, here we have all the standard wallet operations like create or delete an account, set the recovery phrase, account balance, and so on.\n3. **Toolkit**: We want to make it as easy as possible for devs to start building apps with our framework, so we’ll provide them with install instructions, example apps, and more technical stuff like genproto options to support gRPC and helper functions to parse the render output.\n\nThose should be enough to allow builders to get started on using and experimenting with Gno mobile apps.\n\n- *Support for secure p2p communication, even when the Internet is down?*\n- *Yes, please!*\n\nSomething that is not necessarily essential for V1, but for sure will open the doors to some powerful capabilities later on is to add an interface and a constructor to adapt the communication transport. This will make it possible for devs to incorporate other tools like Wesh Network and give their apps the ability to securely and reliably send messages even in very poor network conditions. But that’s a story for another time.\n\n# When will GnoMobile be ready?\n\nV1 is planned for release in mid-December 2023.\n\nUntil then, you can check out our progress [here](https://github.com/gnolang/hackerspace/issues/28).\n\nGot feedback or want to drop us a question? Ask away on our [repo](https://github.com/gnolang/gnomobile/issues).\n\n# What does the future look like beyond V1?\n\nWe see a lot of potential directions for GnoMobile after the initial release that will improve the user experience, extend its functionality, and make GnoMobile even more secure. We’re still scratching the surface in terms of how far we can take its development, and we look forward to working on further iterations and improvements. Some of our ideas for the future beyond V1 include:\n\n1. Making it easier for developers to **build** **desktop apps** **and** **browser extensions**:\n2. Through GnoMobile, we can gradually enable “desktop” devs to use our React Native gRPC interface to write desktop applications while using existing functionality from the core Go code. This way, developers will not necessarily have to learn Go to leverage its advantages.\n3. Browser extensions are usually written in JavaScript in the same way as in React Native. This opens the door to getting the benefits of Go via the GnoMobile framework. Otherwise, you’d have to either make the Go code run inside the browser extension (which is not easy) or use a remote server (which is not pretty).\n4. Making it possible to **execute smart contracts directly from mobile**.\n\n*Why is this important?*\n\nIf you want to add a new message to a blockchain, you need to actually interact with it (the blockchain) and update its state with the new message. However, if you just want to browse through the messages, you can execute the Render function locally without needing to use your network and, at the same time, get the results much faster. This is because the node runs locally on the mobile device without needing to spend crypto coins to get a remote node to do the operation for you.\n\nGno nodes run on GnoVMs (gnovm), and for the moment, these are only available on desktops. We believe it is possible to make them available on mobile as well, but we need to find clever ways to overcome the constraints of mobile devices (like putting the apps in the background (iOS), addressing network bandwidth limitations, and so on).\n\n1. Developing a **decentralized push notification service** for *both* mobile and desktop apps. Getting notifications is now a standard (and very important) functionality of centralized apps. Technically, this happens via a central server. Naturally, having a centralized server is not possible for a p2p app, but there are other ways to implement notifications, and we are considering including them in the GnoMobile framework.\n2. Making it possible for decentralized apps to **interact with the blockchain even if the network connection is poor or virtually unavailable**. Through the [**Wesh Network** protocol](https://wesh.network/), we are opening up the possibility of using alternative transport mediums to exchange messages between peers in an asynchronous but reliable manner in off-grid environments. Enabling reliable, secure, and censorship-resistant communication is our main cause at Berty Technologies. We want to open the door for p2p users to send messages and interact even in extreme situations or adverse scenarios, and Wesh Network is built specifically for this purpose. It is only natural to make it easier for developers to use it through the GnoMobile framework.\n3. Advancing **edge networking for enhanced blockchain resilience**. Edge networking refers to bringing functionality like computing power or storage closer to the user so that they don't need to travel through the whole Internet to interact with a server. The same edge concept can be applied to bring the necessary services to interact with the blockchain closer to each p2p user. For example, hosting a copy of the blockchain so a user can sync it or even execute smart contracts. Having these fundamental services closer to the p2p users is especially important in the case of mobile apps. We want to offer developers the possibility of taking advantage of the edge networking benefits by allowing them to use, for instance, network address redirections or special HTTP headers in the configuration of their applications.\n\nIn all honesty, it’s hard not to get excited about all the different possibilities that lie ahead for GnoMobile, but we’re keeping our focus on shipping V1 for now and collecting feedback from the community. After that, well, we hope you’ll stick around to see what happens next!\n","2023-09-29T13:37:00Z","jeff,costin,remi,iuri","gnomobile,berty,weshnetwork"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-5","The More You Gno: Gno.land Monthly Updates - 5","\n\nIt's been another productive month, packed with developer calls, live events, new contributors, a large team presence at the Go community's biggest event of the year, GopherCon 2023, and the launch of a PoC gaming dApp on Gno.land, GnoChess. We uncovered a bunch of bugs in the code and some issues with the GnoVM, and made further progress on the Go and Rust VMs, the banker module bug, Gnofee, and much more. Check out the updates below.\n\n## Building a Web3 Chess Server on Gno.land - GnoChess\n\nMost of our work over the last few weeks has been dedicated to [GnoChess](https://gnochess.com/), a [PoC gaming dApp](https://test3.gno.land/r/gnoland/blog:p/chess-gc23) unveiled at GopherCon 2023. As gold event sponsors, we wanted to provide gopher attendees with a memorable experience – and a little friendly competition – while battle-testing the Gno.land platform. As our first gaming dApp, developing GnoChess was extremely useful for our team in many ways. We managed to attract 61 players to the game during the event, including some die-hard web2 gophers who wanted to show off their moves and discover more about Gno.\n\nSeveral PRs were opened as a result of our endeavors, and, beyond the conference, GnoChess taught us a lot about where we're at with Gno, how to successfully build complex dApps on top of the platform, and how well we work as a team. We uncovered some key issues and breaking behavior in the GnoVM, made our JavaScript clients much more reliable in their communications with the Gno.land node, and unearthed further issues that lead to complex errors and potential security flaws that must be addressed before mainnet.\n\nFor example, appending nil to a slice of errors resulted in a panic, or conditional statements like if not supporting custom boolean types. The GnoVM doesn't currently perform terminating statement analysis, which results in a cryptic panic message ([issue 1086](https://github.com/gnolang/gno/issues/1086)), and mixing untyped (negative) floats and integers in arithmetic sometimes drops the sign ([issue 1152](https://github.com/gnolang/gno/issues/1152)). The issues uncovered while developing GnoChess were discussed extensively in the public developer calls of [Sept 6](https://www.youtube.com/watch?v=BBBqgycMjqU) and [Sept 20](https://www.youtube.com/watch?v=WrxFVPR55G0), and referenced in the [GitHub meeting agenda](https://github.com/gnolang/meetings/issues/31). Most of the issues are common in software development and fairly simple to fix by making some implementation changes or adjustments to design choices.\n\nWhile developing GnoChess, our engineers took on the role of expert platform users rather than core team members. This approach was very useful as it pushed the platform to new limits, and allowed us to dive deep into many aspects of the project, creating a culture of sharing by opening up issues for each bug and asking for feedback and support. We'll definitely take a similar approach for future app development and onboarding new devs to Gno. We'll be releasing a retrospective of our experiences in the coming weeks. In the meantime, if you want to build a dApp on Gno.land, check out the GnoChess repo, where you can find a useful [tutorial](https://github.com/gnolang/gnochess/blob/main/tutorial/01_getting_started/README.md) or watch the recording of the GopherCon workshop, '[Chess: The Gnolang Way](https://www.youtube.com/watch?v=JQh7LhqW7ns).'\n\n## The Battle of the Virtual Machines\n\nCore engineers Marc and Petar continue their excellent work developing two different VMs for Gno, one in Go and one in Rust. In the coming weeks, we'll have a face-off, comparing and contrasting their features, efficiency, speed, and performance, so watch this space! For now, the definition of the virtual machine is stable for both, and they are no longer working on the virtual machine definition. They are mainly focusing on code generation; everything from parsing to scanning to parsing and compiling. Let's see how they are shaping up.\n\n### Rust VM\n\nPetar has developed a Rust implementation not only of the virtual machine but of the whole chain, including the compiler. He has written a Go compiler entirely in Rust and has even started experimenting with changing the compiler to implement the Invar proposal from Jae. Further progress includes porting a part of the parser and scanner from the Go compiler to Rust (almost a direct translation from Go to Rust) and making it stable. \n\nIn addition, Petar has completed work on typed nil values and improving the recursive closures of Go, which were not working with Gno code and needed additional pointers. He has also implemented Iota and hooked up the garbage collector. In the coming weeks, Petar will be working to smooth out bugs and implement type aliases, as well as implementing function analysis for the dependency graph. The dependency graph is necessary for compiling global types in the correct order, so, for example, when type A refers to type B, you need to compile type B first so that when type A refers to it, type B exists.\n\n### Go VM\n\nMarc is currently rewriting a parser and a scanner from scratch. His work is not as far along as Petar's, but he's getting closer, and the code generation works well. He is currently refactoring and building a single-pass compiler that can perform a **syntax-directed translation**, which means there are no intermediate data structures between the source code and the byte code. This is a much simpler design that should compile faster and be easier to maintain, but it requires a complete redesign. \n\nMarc believes his Go parser will be easier to maintain and understand than the one in Rust and benefit the user since the entire stack is written in Go. However, to assess the best implementation of the VMs, Marc has started a Go **test shoot project, which is a script** that will run many samples to verify that the compiler (in Go, Rust, or any other implementation) conforms to Go's specifications. Marc and Petar will open their repos soon, and the next edition of The More You Gno will highlight how the GnoVM works. \n\n## Gnoffee: Coffeescript for Go and Gno\n\nGnoffee (hackerspace [issue 22](https://github.com/gnolang/hackerspace/issues/22)) will be a powerful standalone tool to elevate the development process of Go and Gno by generating code and integrating new features, eliminating manual coding. We aim to create a custom variation of Golang that preserves similar readability, maintains compatibility, and enables being able to code in Gno very quickly when you know how to code in Go. How do we go about this? \n\nRegarding compatibility, one possibility is to propose all our changes to Golang and wait for approval before we start developing. However, this is likely to take some time. Another approach is to use a way to transpile TypeScript for JavaScript or Coffeescript for JavaScript, so it's another language passing through a program that creates standard valid Golang and will generate valid Gnolang. With this simple method, we can experiment with missing features like new native types, and new keywords, and when we have new features in mind, we can develop what we lack. \n\nFor instance, it does not make sense to have extra security for your exported variables when you write a library in Go. However, in Gno, it is very important to ensure that everything you expose cannot be modified by other contracts. This means finding a way to expose constants and other readable elements without risking their values being overwritten.\n\nBesides allowing us to carry out all types of experimentation more easily, Gnofee could eventually be a way for the Go team to measure the potential adoption of Gno. Gnofee is not a priority for the mainnet, but we're excited to work on this important initiative.\n\n## META Multinode Testnet\n\nThe discussions about single and multinode testnets have been ongoing, so we opened an issue to establish a multinode testnet focused on multi-validator experimentation, including stability, benchmarking, and lifecycle management. This multinode testnet aims to provide a platform for in-depth explorations and evaluations of multi-validator setups, while we maintain the single-node test3+.gno.land set up, primarily dedicated to showcasing the VM and providing examples. Visit hackerspace [issue 9](https://github.com/gnolang/hackerspace/issues/9) if you want to participate in this initiative or share your insights.\n\n## Banker Module Bug\n\nThe banker module bug is a known issue that needs to be fixed before the mainnet because, currently, it's still possible to mint new GNOT tokens from any contract. Several fixes have been suggested, and our goal is to merge [PR 875](https://github.com/gnolang/gno/pull/875) put forward by Onbloc to change the denomination of the coins minted by the banker. Merging this PR is currently blocked by 2 small failing checks, but we are close to resolving this issue.\n\n## Preserving Go Comments in Protobuf\n\nIn [issue 1157](https://github.com/gnolang/gno/issues/1157), Jeff from Berty raises the question about preserving Go comments in the Receiver field. Currently, Amino converts the code, but the proto message Receiver field doesn't have the comment. Manfred agrees that informative comments are helpful. However, he doesn't want to create a complex Protobuf configuration. We will continue to discuss this issue to look for solutions, but for now, Berty will parse the original Go source code and get the comments this way.\n\n## Multi-Sig and Security Features\n\nSeveral contributors, including Teritori, are working on built-in multi-sig support in Gno.land, where Gnokey supports a multi-sig setup. We also want to introduce additional ways to improve the UX and security of Gno.land (and web3 in general). An idea we currently have is to add a new layer in authentication, creating something similar to browser cookies that we can name sessions. The chain will have two tables, one with the public key for an account and one with a public key for sessions linked to an account. From your main account, you can create a session with self-destructing features, such as destructing after one hour without usage or after 24 hours. The goal would be to allow more complex and secure flows when starting your operations. We may not want this for multi-sig, but it comes under the same family of security and privacy features.\n\nFor example, imagine a wallet like Adena uses your key, a passphrase, or a ledger. It will sign a new public key that you just created in memory. Each time you close your browser, the memory is cleared. You can also have a logout button to call on the blockchain to delete all your sessions or simply wait for the session to be self-destructed, especially if the session was just in memory on your side. We will continue to develop this idea.\n\n## New Team Member\n\nWe're excited to welcome a new DevRel team member to Gno.land, Leon, who's been in blockchain development for two years and is passionate about engineering and teaching. Leon has taught languages, development, math, and music privately, as well as an OS fundamentals class at his previous faculty. Welcome on board!\n\n## Grantee and Ecosystem Updates\n\nAs Gno.land core continues to advance, so does our blossoming ecosystem, with new contributors and community members turning their eyes to Gno. The overriding theme of this last month has been collaboration, and we're pleased to see gnomes working together to overcome their obstacles and push their projects forward. Let's see what they've worked on over the last few weeks.\n\n### Onbloc\n\nOnbloc is powering ahead, contributing to Gno.land core, making upgrades and improvements to Adena and Gnoscan, and developing the Gnoswap DEX. Last month, Onbloc released the patched version 1.8.0 of Adena, which includes some UI and UX enhancements, such as more intuitive account management settings, a copy icon next to the names of the accounts, and some bug fixes. This release also comes with new injection methods to enable dApps to request users to add a custom gno.land network or switch to an existing one. Check out the [release note](https://github.com/onbloc/adena-wallet/releases/tag/v1.8.0) for more details.\n\nOnbloc has open-sourced the code for Gnoswap on this GitHub [repo here](https://github.com/gnoswap-labs/gnoswap). You can also find a guide to running unit tests. The team continues to improve the Gnoswap interface, focusing on the earn and staking pages, the graphs for positions, and some components for adding and removing liquidity and providing pool incentives. They're working on the next iteration of the interface, with the governance and airdrop pages, and developing the front-end logic to integrate with Gnoswap realms and APIs. Onbloc also contributed to Gno core, adding PRs for fixes to testing and the banker module. Keep up with Onbloc through their [hackerspace journey](https://github.com/gnolang/hackerspace/issues/29) and check out their latest initiative [Gnodesk](https://medium.com/onbloc/gnodesk-week-2-of-sept-2023-5edbc451bba7), which delivers weekly highlights and updates from Gno.land.\n\n### Teritori\n\nTeritori has been working on improvements since the last update and open-sourcing all their work, including the DAO deployer and the Moderation module. You can visit the Teritori DAO tooling repo to find the complete documentation and new realms to easily deploy your DAO. There is also a tutorial on creating your own DAO using the framework. \n\nThe team has made extensive progress on the Justice DAO deployer, a module that can be used for third-party arbitration when there is a problem with the escrow system in a decentralized freelance marketplace. The Justice DAO can resolve potential conflicts between the seller and the buyer and implements randomness to choose the judges to solve problems without conflicts of interest. The content flagging system, which highlights the content that users deem to be inappropriate, has been tweaked and improved. Keep up with Teritori's [hackerspace journey here](https://github.com/gnolang/hackerspace/issues/7).\n\n### Berty\n\nBerty has already completed the first phase of the project and published the [technical proposal](https://github.com/gnolang/gnomobile/issues/15) to develop the Gno mobile framework. The team is now busy with the second phase of implementing the proposal and the gRPC interface, which is working with the local socket on Android and iOS. Jeff has been trying to use Amino, and, now that Iuri is back from vacation, the team will work on improving other parts of the interface. Check out their latest [demo](https://www.loom.com/share/c0f68f707d3e47089c2fdbd2698fc92f), which shows an example user interface with wallet functions and blockchain communication. \n\nOnbloc has laid the foundations for Gno mobile apps with the Adena mobile wallet, so Berty will use some of this code in the mobile framework and work with Onbloc to ensure a similar user experience across all Gno apps.\n\n### Flippando\n\nDragos, the developer behind new grantee Flippando, is an experienced mobile app developer. Flippando is a simple on-chain memory game, which is currently written in Solidity and deployed on several testnets, including Goerli, Polygon, Near, Aurora, Evmos, and a Saga chainlet. Fippando started as a project for Dragos to learn Solidity but has already been the winner of two hackathons in Korea. It can be deployed relatively easily on any machine and is currently being ported to Gno.land. Dragos is exploring which user intersection can be more beneficial for this and will show us a demo in the coming weeks. Soon, we'll have two gaming dApps on Gno.land – Flippando and GnoChess! Read about Flippando in the [hackerspace journey](https://github.com/gnolang/hackerspace/issues/33).\n\n### New Contributor Joseph Kato \n\nWe have a new contributor to Gno.land who showed a demo last month of what he's been working on, a language server to run tests and scripts. Joseph is a major Go fan looking to get into web3 and was super excited to come across Gno. While interacting with Gno.land, he found many IDE-like features that he missed when working on files, so he decided to work with an LSP implementation—gnols—with the goal of making these features available to all contributors regardless of editor preference, starting with Sublime Text and Neovim and moving on to IntelliJ, Golang, and Emacs. This is a welcome addition for anyone who has ever developed a realm in Gno. Check out his [hackerspace](https://github.com/gnolang/hackerspace/issues/34) page for more details. \n\n## DappCon, Berlin\n\nManfred was back in Berlin in September at the Radial System presenting 'Gno.land: The Key To Perpetual Transparency,' where he discussed how Gno.land offers a familiar, seamless experience for code sharing and a sustainable and transparent path for blockchain development. \n\n## Web3 Family\n\nCore dev Miloš Živković gave a talk at Web3 Family in Barcelona last month, 'Gno.land and Gnolang: The Dynamic Duo of Blockchain Development.' He presented a brief history of smart contract development and the issues associated with existing platforms, such as limitations in design and security. He introduced Gno and showed how we make web3 accessible and blockchain development more intuitive and secure. Catch the [talk here](https://www.youtube.com/watch?v=0K-jr_Ad3bI).\n\n## GopherCon 2023\n\nGno.land was out in force at GopherCon 2023 with a well-stocked booth at the conference and an awesome workshop building a web3 chess server on Gno.land. Both Manfred and Jae were at the booth championing Gnolang to Gophers, and we received a lot of positive feedback, some new contributions, fresh PRs, and exposure for Gno.land in web2 circles. It was also a fabulous chance for the team to meet for valuable face-to-face time.\n\nThat's all for now! Be sure to check back again with us for the next edition of The More You Gno to keep up with all our progress.\nDo you want to contribute to Gno.land's monthly updates? If you're building on Gno.land and want to highlight your development, project, event, or idea, let us know, and we'll include your contribution.\n","2023-10-10T13:37:00Z","christina","gnoland,gnovm,tm2"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["funding-program-23q3","Gno.land Funding and Grants Program - Progress So Far","\n\n# Quarterly Report: Q3 2023\n\nWe launched the [Gno.land Funding and Grants](https://github.com/gnolang/ecosystem-fund-grants) program in July 2023 to encourage talented and passionate developers to interact with Gno.land, help build core infrastructure and tooling, and enhance the usability of the platform. After establishing a review process to streamline the program and identify core areas that need the most work, we ran with our first cohort of grantees in Q3, awarding four grants from a total of seven submissions (to two teams and two individuals). Full details of grant submissions, scope, and funding can be found on GitHub, but here’s a summary of the program’s progress so far and what’s coming up in Q4.\n\n## Q3 Funding Breakdown\n\nThe total grants distribution for Q3 was **$563,595** over the four grants: Teritori, Berty, Zack Scholl, and Flippando. This work has been split over two main large-scale infrastructure products (the Gno Moderation DAO, and GnoMobile), a gaming application, and our first resident tinkerer (Zack), who is experimenting with Gno and developing Proof of Concepts using it. Each grant recipient was provided with milestones for deliverables and has kept track of their progress through regular syncs, hackerspace journeys, blog posts, and developer calls. \n\n### Teritori (delivered September 2023)\n\nTeritori blockchain and multi-chain hub allows IBC and non-IBC communities to connect, create groups, exchange tokens and NFTs, and launch new projects. The Teritori team has solid experience building social dApps, marketplaces, NFTs, collectibles, and interfaces to encourage community interaction. For the Gno.land Grants and Funding program, Teritori was tasked with building a Moderation DAO to enable effective and fair content moderation in a decentralized and permissionless environment. \n\nThe Moderation Module is a smart contract ‘realm’ that enables a DAO to manage the daily moderation of forums or social threads through blockchain decision-making, supporting the vision of a censorship-resistant platform that fosters a safe space for open debate and discussion. Find detailed updates on Teritori’s [hackerspace issue 7](https://github.com/gnolang/hackerspace/issues/7), and watch out for upcoming blogs on Gno.land.\n\n### Berty Technologies (delivery Dec 2023)\n\nBerty private messaging app was allocated a grant to build a mobile version of Gno.land, implementing the WESH protocol (available by Bluetooth, local WIFI, or other means), and providing secure censorship-resistant communication between devices. Berty’s experience in off-grid communication is invaluable to Gno.land, and the team is an expert at running Go on mobile Android and iOS operating systems. For this grant, to be completed in Q4, Berty will deliver a minimal PoC of the existing apps of Gno.land running on mobile, and deliver an open-source mobile app with basic CI/CD, interacting with the Gno.land testnet. Find detailed reports and updates on Berty’s [hackerspace issue 28](https://github.com/gnolang/hackerspace/issues/28) or within their [Gnomobile blog post](https://test3.gno.land/r/gnoland/blog:p/gnomobile).\n\n### Flippando (delivery Nov 2023)\n\nFlippando is a multi-level on-chain memory game currently written in Solidity and deployed on several testnets, including Goerli, Polygon, Near, Aurora, Evmos, and a Saga chainlet. Like the classic card-based Memory game, Flippando players must match card pairs (digital tiles). When a player selects a tile, the game sends a request to the chain, which sends back the uncovered tile. If two tiles match, they remain uncovered. If they don’t match, they are flipped back until the game is won, and an NFT is generated for the winning player to prove the win. Through the development of a simple gaming app on Gno.land, we want to show how easy it is for gaming and metaverse concepts to be built. Through this grant, Flippando will port its memory game to Gno. Find detailed updates on Flippando’s [hackerspace issue 33](https://github.com/gnolang/hackerspace/issues/33).\n\n### Resident Tinkerers Program: Zack Scholl (6 months)\n\nZack Scholl is Gno.land’s first resident tinkerer with tons of experience in web2 development and a passion for the Go language. Through the grants program, Zack aims to translate his extensive knowledge to Gno and web3 by developing PoCs using Gno. So far, Zack has worked on a microblogging app for Gno.land and a prototype for using generative audio with smart contracts. He’s also creating documentation and tutorials to help other developers follow his lead. You’ll be hearing more from Zack over the coming weeks. Follow his [hackerspace issue 2](https://github.com/gnolang/hackerspace/issues/2) journey for more details.\n\nAfter a great start to the Funding and Grants Program in Q3, below is a breakdown of the percentage of funding allocated to each area of development so far:\n \n[![Funding](https://gnolang.github.io/blog/2023-10-17_funding-program-q3/src/thumbs/funding.png)](https://gnolang.github.io/blog/2023-10-17_funding-program-q3/src/funding.png)\n\n## Coming Up in Q4 and Q1 2024\n\nWe’re looking forward to more exciting developments in the coming quarters as we focus on the road to mainnet. Onbloc, one of Gno.land’s most active contributors, is currently being confirmed as a [Q4 grantee](https://github.com/gnolang/ecosystem-fund-grants/pull/4/files#diff-6dbd2e305897910e59072f9efa8c537d86f8aa281eb3742e0c150048a1df95eb) to work on core infrastructure necessary for mainnet, including tm2-js and gno-js support, GnoVM debugging, contract interactions, and leading the multi-node testnet initiative. Onbloc has already developed essential public infrastructure tools for Gno.land, including the non-custodial Adena wallet, the Gnoscan blockchain explorer, and Gnoswap decentralized exchange. The team has demonstrated immense passion and dedication in attending public developer calls and in-person events, and releasing extensive documentation, blog series, and [hackerspace issue 29](https://github.com/gnolang/hackerspace/issues/29) about their journey. \n\nOver the next two quarters, the Grants program will focus on building our tinkerer and student cohorts, and publishing more content, such as application libraries, documentation, and Gno packages. The goal is twofold: to support more users and ensure a diversified set of users on the Gno.land platform testing, debugging, troubleshooting, and running user feedback loops. We currently have two apps to reference on how to get started – GnoChess, built by the Gno core team, and Flippando, a grant recipient – we’re looking for a lot more to come. \n\nWe’re steadily building out the Gno.land platform, and our ecosystem of grantees and contributors. Let us know if you want to join us by submitting an application any time on the Funding and Grants [repository](https://github.com/gnolang/ecosystem-fund-grants). We’re opening up our second grant batch this month, and look forward to reviewing your submissions. \n","2023-10-17T13:37:00Z","christina,michelle","gnoland,funding,grants"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["gnoland-moderation-dao-module","Gno.land Moderation DAO Module","\r\n# Gno.land Moderation DAO Module\r\n*This blog post is written by the Teritori team, whose focus is to allow organizations to communicate and interact in a resilient and transparent way. Teritori is a partner and grantee of Gno.land.*\r\n\r\nWhen it comes to the complex subject of discussion forums and decentralized social networks, numerous technical and philosophical questions arise.\r\nImagining a 24/7 online communication system whose administration cannot be compromised or censored by any entity or individual is one of the most intriguing challenges of the decade.\r\nApproximately 10 months ago, the Teritori core team decided to explore the new possibilities offered by Gno.land on the theme of decentralized moderation and to build the foundation for future generations of developers to create resilient, robust, and autonomous applications.\r\n\r\n## The vision\r\n\r\n### About Teritori\r\n\r\nTeritori is a decentralized Operating System for individuals \u0026 communities that allows organizations to communicate and interact in a resilient and transparent way. Its core components include the creation of a decentralized User Profile for individuals \u0026 organizations as well as a dApp Store allowing users to pick their favorite services for daily usage and developers to list their product in order to grow their user base. Finally, Teritori backbone, its P2P messenger application that will enable users to create resilient token-gated groups in a click will even allow non-crypto-native users to get onboard as this feature doesn't even require a wallet connection to get started.\r\n\r\n### Teritori \u003c\u003e Gno.land\r\n\r\nConvinced of the benefits of offering a contribution-based consensus model and taking advantage of an interpreted version of Golang, the Teritori core team aims to become one of the most prolific contributors to Gno.land. Our plan is to focus on features that enable the coordination of organizations and individuals via governance, communications, and collaboration. Eventually, all the features listed on Teritori will be accessible in the Gno.land network, contributing to the growth of the ecosystem.\r\n\r\n### PoC and iterations\r\n\r\nAnother important point to emphasize is that the Teritori core team intends to improve the features it deploys on Gno.land by taking advantage of the user test phases to collect feedback that will enable iteration and improvement of the service. As a result, the “Proof-of-Concept” (“PoC”) presented in this article will be subject to updates and evolutions, which will be communicated in due course, as will the associated test phases.\r\n\r\n## What is the Gno Moderation Module?\r\n\r\nThe Gno Moderation Module is a smart contract (“realm”) that enables a decentralized, autonomous organization (DAO) to manage the moderation of a forum or social thread through a transparent on-chain vote.\r\n\r\n### Let’s take an example:\r\n\r\nImagine a simple social network similar to Instagram, in which all content is decentralized (using IPFS for images, videos, music etc.). For each post, users sign in via their wallet to post content, and no centralized administrator can delete this content. The freedom offered by this type of decentralized application is immense since even as developers of the application, it is impossible to delete the content. Therefore, we can consider this “space of freedom” as a “common space” unlike any application owned by a private company and hosted on centralized infrastructure.\r\nWith this radical freedom for the user comes a great responsibility— to collectively ensure the security of this space rather than delegating the responsibility to moderators employed by a commercial enterprise. This is why we’ve created the “Gno Moderation Module.”\r\n\r\n### How does it work?\r\n\r\n[![moderation_flow v0.1](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/thumbs/moderation_flow_v0.1.png)](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/moderation_flow_v0.1.png)\r\n\r\nThe Gno Moderation Module allows users to notify the moderation DAO community that they wish to report content. Through this action (permitted by the smart contract), they inform the DAO community that the content is inappropriate.\r\n\r\n[![content flag](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/thumbs/content_flag.png)](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/content_flag.png)\r\n\r\nOnce the content has been reported a certain number of times (10 times in this PoC) by users (who may or may not be members of the Moderation DAO), an on-chain proposal is automatically created.\r\n\r\n[![moderation dao feed](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/thumbs/moderation_dao_feed.png)](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/moderation_dao_feed.png)\r\n\r\nThis on-chain proposal is then listed in the Moderation DAO tab on the Social Feed as well as on the Moderation DAO profile proposals feed so all Moderation DAO members can vote on it. A debate can take place to discuss the best choice for the content.\r\n\r\n[![moderation dao vote](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/thumbs/moderation_dao_vote.png)](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/moderation_dao_vote.png)\r\n\r\nModeration DAO members have three voting options:\r\n- Ban the content in question\r\n- Abstain\r\n- Do not ban the content in question\r\n\r\nOnce the required vote quota has been reached, the contract automatically executes the voted decision.\r\n\r\n## The Current Status:\r\n\r\nThe Teritori core team received a grant from the Gno.land core team to build the necessary tools for decentralized moderation.\r\n\r\nTo accomplish this task, we divided our work into five main stages:\r\n1. Build “DAO” standards to establish the fundamental building blocks and ensure a modular approach in the long term for various tools.\r\n2. Build a “DAO” deployer that allows non-tech users to easily utilize the different standards.\r\n3. Build a customizable Moderation Module that can cater to a wide range of use cases. For example, if we replace the social feed with a service marketplace, the Moderation Module can transform into a “Justice Module” that resolves conflicts between sellers and buyers on a decentralized platform and serves as an escrow system.\r\n4. Develop the user experience that allows for large-scale experimentation with the Moderation Module within a dedicated context of an active social feed. Here, we created a social feed realm and enabled non-developer Gno.land users to participate in the full-scale experience.\r\n5. Establish interactions between smart contracts (r/boards, r/socialfeed, /r/users), conduct experiments to enhance their security, and identify emerging needs for these innovative use cases.\r\n\r\n### What does a DAO realm look like?\r\n\r\n- We decided to build two different DAO standards, using two different approaches of modularity:\r\n- Aragon DAO Standard, based on the amazing work of [the Aragon team](https://aragon.org/) (using Solidity)\r\n- [DAODAO](https://github.com/DA0-DA0) smart contract, using CosmWasm, that allows more modularity.\r\n\r\n\r\nHere is an example, with the DAODAO contract ported into Gnolang:\r\n[Source](https://testnet.gno.teritori.com/r/demo/dao_realm_v6/dao_realm.gno)\r\n\r\n```go\r\npackage dao_realm\r\n\r\nimport (\r\n\t\"encoding/base64\"\r\n\t\"std\"\r\n\t\"strings\"\r\n\t\"time\"\r\n\r\n\tdao_core \"gno.land/p/demo/daodao/core_v16\"\r\n\tdao_interfaces \"gno.land/p/demo/daodao/interfaces_v16\"\r\n\tproposal_single \"gno.land/p/demo/daodao/proposal_single_v16\"\r\n\tvoting_group \"gno.land/p/demo/daodao/voting_group_v17\"\r\n\t\"gno.land/p/demo/ujson_v5\"\r\n\t\"gno.land/r/demo/groups_v22\"\r\n\tmodboards \"gno.land/r/demo/modboards_v9\"\r\n)\r\n\r\nvar (\r\n\tdaoCore dao_interfaces.IDAOCore\r\n\tmainBoardName = \"dao_realm\"\r\n\tgroupName = mainBoardName + \"_voting_group\"\r\n\tgroupID groups.GroupID\r\n)\r\n\r\nfunc init() {\r\n\tmodboards.CreateBoard(mainBoardName)\r\n\r\n\tvotingModuleFactory := func(core dao_interfaces.IDAOCore) dao_interfaces.IVotingModule {\r\n\t\tgroupID = groups.CreateGroup(groupName)\r\n\t\tgroups.AddMember(groupID, \"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c\", 1, \"\")\r\n\t\tgroups.AddMember(groupID, \"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv\", 1, \"\")\r\n\t\tgroups.AddMember(groupID, \"g14u5eaheavy0ux4dmpykg2gvxpvqvexm9cyg58a\", 1, \"\")\r\n\t\tgroups.AddMember(groupID, \"g1ckn395mpttp0vupgtratyufdaakgh8jgkmr3ym\", 1, \"\")\r\n\t\tgroups.AddMember(groupID, std.GetOrigCaller().String(), 1, \"\")\r\n\t\treturn voting_group.NewVotingGroup(groupID)\r\n\t}\r\n\r\n\tproposalModulesFactories := []dao_interfaces.ProposalModuleFactory{\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.IProposalModule {\r\n\t\t\ttt := proposal_single.Percent(100) // 1%\r\n\t\t\ttq := proposal_single.Percent(100) // 1%\r\n\t\t\treturn proposal_single.NewDAOProposalSingle(core, \u0026proposal_single.DAOProposalSingleOpts{\r\n\t\t\t\tMaxVotingPeriod: time.Hour * 24 * 42,\r\n\t\t\t\tThreshold: proposal_single.Threshold{ThresholdQuorum: \u0026proposal_single.ThresholdQuorum{\r\n\t\t\t\t\tThreshold: proposal_single.PercentageThreshold{Percent: \u0026tt},\r\n\t\t\t\t\tQuorum: proposal_single.PercentageThreshold{Percent: \u0026tq},\r\n\t\t\t\t}},\r\n\t\t\t})\r\n\t\t},\r\n\t}\r\n\r\n\tmessageHandlersFactories := []dao_interfaces.MessageHandlerFactory{\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\treturn groups.NewAddMemberHandler()\r\n\t\t},\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\treturn groups.NewDeleteMemberHandler()\r\n\t\t},\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\t// TODO: add a router to support multiple proposal modules\r\n\t\t\tpropMod := core.ProposalModules()[0]\r\n\t\t\treturn proposal_single.NewUpdateSettingsHandler(propMod.Module.(*proposal_single.DAOProposalSingle))\r\n\t\t},\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\treturn modboards.NewCreateBoardHandler()\r\n\t\t},\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\treturn modboards.NewDeletePostHandler()\r\n\t\t},\r\n\t}\r\n\r\n\tdaoCore = dao_core.NewDAOCore(votingModuleFactory, proposalModulesFactories, messageHandlersFactories)\r\n}\r\n\r\nfunc Render(path string) string {\r\n\treturn \"[[board](/r/demo/modboards:\" + mainBoardName + \")]\\n\\n\" + daoCore.Render(path)\r\n}\r\n\r\nfunc VoteJSON(moduleIndex int, proposalID int, voteJSON string) {\r\n\tmodule := dao_core.GetProposalModule(daoCore, moduleIndex)\r\n\tif !module.Enabled {\r\n\t\tpanic(\"proposal module is not enabled\")\r\n\t}\r\n\tmodule.Module.VoteJSON(proposalID, voteJSON)\r\n}\r\n\r\nfunc Execute(moduleIndex int, proposalID int) {\r\n\tmodule := dao_core.GetProposalModule(daoCore, moduleIndex)\r\n\tif !module.Enabled {\r\n\t\tpanic(\"proposal module is not enabled\")\r\n\t}\r\n\tmodule.Module.Execute(proposalID)\r\n}\r\n\r\nfunc ProposeJSON(moduleIndex int, proposalJSON string) {\r\n\tmodule := dao_core.GetProposalModule(daoCore, moduleIndex)\r\n\tif !module.Enabled {\r\n\t\tpanic(\"proposal module is not enabled\")\r\n\t}\r\n\tmodule.Module.ProposeJSON(proposalJSON)\r\n}\r\n\r\nfunc getProposalsJSON(moduleIndex int, limit int, startAfter string, reverse bool) string {\r\n\tmodule := dao_core.GetProposalModule(daoCore, moduleIndex)\r\n\treturn module.Module.ProposalsJSON(limit, startAfter, reverse)\r\n}\r\n```\r\n\r\n### Public Grant Report:\r\n\r\nYou can find the full report of [Teritori Core’s journey here](https://github.com/gnolang/hackerspace/issues/7). \r\n\r\n### Resources:\r\n\r\nDocumentation:\r\n- [Gno Moderation DAO](https://github.com/TERITORI/gno/blob/teritori-unified/examples/gno.land/r/demo/teritori/MODERATION_DAO.md)\r\n\r\nPackages:\r\n- [https://testnet.gno.teritori.com/r/demo/groups_v22](https://testnet.gno.teritori.com/r/demo/groups_v22)\r\n- [https://testnet.gno.teritori.com/p/demo/daodao/interfaces_v16](https://testnet.gno.teritori.com/p/demo/daodao/interfaces_v16)\r\n\r\nTutorial:\r\n- [Gno.land Social Feed Moderation on Teritori](https://teritori.gitbook.io/teritori-whitepaper/gno.land/introducing-gno.land-social-feed-v0.1#social-feed-moderation)\r\n","2023-10-19T01:50:00Z","ferrymangmi,zxxma,michelleellen","gnoland,dao,moderation,teritori"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["wyg-dongwon-shin","Who You Gno – On the Record with Dongwon Shin","\n*Who You Gno is intended to shine a light on the builders, contributors, and generally brilliant humans behind the tech. We’re excited to kick off this series with Dongwon Shin, the co-founder and CEO of one of Gno.land’s longest-contributing teams, Onbloc, a South Korean-based blockchain software company that builds key infrastructure and tooling for Gno.land*\n\nSince embarking on their Gno journey in late 2021, Dongwon and his team have been among the most active gnomes embodying the values of the Gno project: hardworking, passionate, honest, and humble, to name a few. You may already be familiar with Onbloc’s projects [Adena](https://adena.app/), [Gnoscan](https://gnoscan.io/), and [Gnoswap](https://github.com/gnoswap-labs) more about this can be found in [Onbloc's Hackerspace journey](https://github.com/gnolang/hackerspace/issues/29). In this interview, we’ll get the latest updates on these projects, hear about Dongwon the person, and learn more about what motivates him to be a gnome. Check it out.\n\n## Dongwon’s life before coding\nIt’s a cold November morning in Seoul, and Dongwon is in the office early after sleeping just a few hours. Speaking to him from Dubai, where “cool” is 30 ℃, it’s -1 ℃ in Korea. “I hope you’re keeping warm,” I smile, “Yeah,\" he laughs, “it’s not too bad.” Dongwon’s been in the industry since 2015 when web3 was still called “crypto,” ICOs were selling snake oil, and his compatriots were busy paying above the market price for bitcoin in a phenomenon called the “Kimchi premium.”\n\nAt the time, he was traveling the world as a professional e-sports gamer which saw him leaving Korea and living in San Francisco and L.A. for several years. “I had lots of tournaments to compete in, so I had to travel to many other countries,” he says, “while traveling, I learned about other cultures and people, and new experiences. It was really eye-opening, you know, it really helped make me who I am today.”\n\nAnd who is Dongwon today? \n\nAmbitious, driven, and one of the kindest, most genuine people you could ever meet. “I like challenges, and I’m very competitive,” he says. “I can't just do regular jobs. I get bored quickly, so I need to find something very competitive and hard that makes me stressed.” I point out that he’s in the right place, and he laughs. He explains that he used to spend an entire week, sometimes two, learning a game before a tournament, almost around the clock. “I had to put everything I have into winning that game, right?” He views working in web3 the same way.\n\n## The intersection between e-gaming and blockchain\nDongwong is clearly comfortable on the cutting edge in emerging industries that “are often looked down on,” like e-gaming and crypto. He takes great satisfaction in how they’ve both grown. “My parents were saying, 'Just go study,' while I was playing games, but e-sports has grown a lot. Right now, the industry is really big, and it's kind of the same with crypto.” He adds, “I like getting in early when other people are not interested and finding an opportunity there.”\n\nWhen looking to retire as a professional gamer, he found his home right away in web3, working with a blockchain consultant and the sports and entertainment-focused [Chiliz project](https://www.chiliz.com/), before launching his own blockchain consulting and development firm. “I didn't think I was going to be just a regular employee for a big company. So I wanted to start my own business,” he says.\n\n## Getting to Gno… Gno.land\nHow did Dongwon hear about Gno.land? \n\n“My co-founder, Peter, and I were long-time followers of the Cosmos ecosystem, and we found out that Jae was working on a new project called Gno.land in late 2021. We really liked the vision behind Gno.land, why he started, and what he wants to achieve. We value transparency, fairness, and censorship resistance, so we read all the documentation and his initial codebase and decided we should be part of his new initiative. We started Onbloc in early 2022.”\n\nDongwon didn’t know Jae personally, but he felt strongly aligned with his vision and what Gno.land aims to achieve. Also, his reputation as the founder of Tendermint and Cosmos preceded him. Dongwon’s co-founder, Peter, was also working on a project called Lunagram, a Cosmos wallet integrated with Telegram. Peter had fond memories of Jae, being very supportive of experimental projects, including his own, in the early days of Cosmos.\n\n## Building tools… Adena, Gnoscan, Gnoswap\nOnbloc has since become Gno.land’s most prolific contributor, launching the [Gnoscan](https://gnoscan.io/) block explorer and the [Adena](https://adena.app/) wallet, as well as creating tutorials and blogs to help onboard developers to Gno, and creating Gno.land’s first AMM DEX Gnoswap, the beta version of which is estimated for December this year. “Currently, the team is focused on developing Gnoswap, integrating [the realms and APIs](https://github.com/gnoswap-labs/gnoswap) with [the interface](https://github.com/gnoswap-labs/gnoswap-interface), enhancing the swap function and liquidity pools, and some additional features. We expect to launch the beta in about a month, so we’re quite excited!”\n\nAs for Adena, the defacto Gno.land wallet, “It's already production-ready, but we want to improve our UX, and UI to provide more secure ways of using a web3 wallet.” To achieve this, Onbloc is adding a feature called [Air-Gap](https://en.wikipedia.org/wiki/Air_gap_(networking)) which allows the wallet to be used in an offline environment, without the user needing to import their keys to Adena. “They can just use Adena as a broadcaster,” Dongwon explains. “I think this kind of feature is needed for enhancing security and educating people to use noncustodial products in a secure way.”\n\nOnbloc is also a [Q4 2023 grantee](https://test3.gno.land/r/gnoland/blog:p/funding-program-23q3) and will develop core Gno.land infrastructure in preparation for mainnet. “We are working on three key features,” Dongwon explains. “The first is contract interaction. So it's a way for a realm to interact with other realms. The second is porting essential Go packages to Gno, and the third is a multi-node testnet.” All in addition to Onbloc’s continued efforts on Gnoswap, Gnoscan, and Adena. “You’re keeping busy, then?” I ask. “All our hands are full now,” he laughs.\nI ask what he does in his free time and – in fact – whether he has any. “Not much,” he jokes, “but I like spending time with my son and playing board games together. He’s seven years old, and we are like friends.” Dongwon also likes to unwind by reading books when his son is asleep. One of his favorites is [*The Secret*](https://en.wikipedia.org/wiki/The_Secret_(Byrne_book)); he was “really inspired by the concept” when he was younger. I ask if he sees it working in his daily life and whether he believes he manifests what he wants into existence, “Definitely,” he replies without hesitation.\n\n## Dongwon’s conviction in Gno.land\nNot only is Dongwon working night and day, but he has bootstrapped his team from his own pocket to go all in on Gno.land. What makes his conviction so strong? “I truly believe that the Gno.land blockchain is the next generation of the blockchain industry. Gno.land is trying to invite web2 developers into web3 and providing all these developer-friendly tools so they don't need to learn a new language to get into the ecosystem. GnoVM, Tendermint2, everything is so transparent and simple.”\nHe believes Gno.land will be “one of the greatest experiments in the crypto industry” thanks to its fair rewards and contribution-based governance. “I'm really excited about this initiative, and all our team members are well-aligned to support this vision. We want to do our part to achieve the success of Gno.land.”\n\nI thank him for his time and ask if there’s anything he would like to add. He pauses for a moment and then says, “If you're building a dApp or looking for a new opportunity in a new ecosystem, I think this is your chance. I hope to see great developers and teams getting into Gno.land. Let’s make this ecosystem great together.”\n","2023-11-24T00:00:00Z","christina","whoyougno,onbloc,community,interview"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-6","The More You Gno: Gno.land Monthly Updates - 6","\n\nWelcome to the latest edition of The More You Gno, your regular source of updates from the Gno.land core team and contributor ecosystem. There’s a lot to cover this month, from a company engineering retreat to new core members and contributors. We’ve made progress across the board to fix important bugs and issues and provide additional features. There’s a new way to dynamically call realms, Gno.land’s tokenomics and governance are advancing, our standard library list is expanding, and our grantees are killing it with their deliverables. Without further ado, let’s dive in.\n\n## Gno Core Team Updates - TL;DR\n\nOnly got time to skim the updates? You’ll find the highlights in the list below. If you want to dive deeper into the topics, track our progress, understand the rationale behind our decisions, or explore the issues we came across, grab a coffee, kick back, and savor the full details.\n\n* **The Portal Loop** – Much of our focus over the past few months has been on the Portal Loop [(issue 1108)](https://github.com/gnolang/gno/issues/1108), which will make developing on Gno smoother, faster, and more intuitive. The Portal Loop will speed up deploying dApps and improve the UX for Gno.land devs.\n\n* **Dynamic Realm Caller** – We’ve added a new way to call realms dynamically so that dApps no longer have to manually import GRC20/721 tokens [(PR 1262)](https://github.com/gnolang/gno/pull/1262).\n\n* **DAO Structure \u0026 Tokenomics** – We’re close to finalizing the DAO structure of Gno.land and its tokenomics. There will be three main DAOs, GovDAO, EvaluationDAO, and SupportDAO. We’re exploring staking options for GNOT holders and working on transaction fees and gas.\n\n* **Gno Playground** – Gno Playground is an awesome way for developers to collaborate, share, and test their code. The full version isn’t ready yet, but we’re sharing the beta with anyone who wants to help us iterate and improve this week.\n\n* **Gno Standard Libraries** – In [issue 1267](https://github.com/gnolang/gno/issues/1267), you can find our current wishlist for Gno standard libraries. If you want to see what we have and what’s lacking, or you want to contribute, open an issue or a PR.\n\n* **Gno Language Server (Gnols)** – An implementation of the [Language Server Protocol (LSP)](https://microsoft.github.io/language-server-protocol/) for Gno, Gnols makes writing code simpler and works with several editors. Visit the [CONTRIBUTING.md file](https://github.com/gnolang/gno/blob/master/CONTRIBUTING.md#vim-support-with-lsp) to try it out.\n\n* **RustVM Implementation** – The RustVM implementation is almost ready and is in the debugging stages. We’re also looking at adding a Jit compiler and researching the topics of determinism and concurrency.\n\n* **Bytecode Go VM Implementation** – The Parscan project is progressing well toward completion of the spec. We look to provide support for interfaces in the interpreter by extending the standard reflect package, also to the benefit of the entire Go community.\n\n### Engineering Retreat\nGno core engineering team got together last month in our first company-wide retreat. It was an invaluable opportunity to work face-to-face, brainstorm ideas, code together, and fix several high-level concerns. We made many improvements to the technical aspects of the project, including major advances on the Portal Loop, and strengthened our alignment through team bonding activities, socializing, and having fun. \n\nWe made multiple bug fixes and resolved many of the issues that arose out of [GnoChess](https://github.com/gnolang/gnochess) development, and Manfred and the Onbloc team (who joined us on the retreat) demonstrated a new way to dynamically call contracts using dependency injection with a registry. This, combined with Golang's interface capabilities, can achieve a good balance between dynamism, explicitness, and security (including type safety). This pattern could enable massive DeFi applications when used with GRC interfaces. It could also support contract-based DAOs where features can be added later, opening the door to new design patterns around contract upgrades. Check out [PR 1262](https://github.com/gnolang/gno/pull/1262) for more details. \n\nIt was invaluable for everyone to get plenty of 1:1 time with Jae. Morgan was able to bring the Native Bindings topic ([PR 859](https://github.com/gnolang/gno/pull/859)) much closer to completion. This has been a recurring theme in our developer calls for the last few months as it’s a complex topic that aims to change how Gno can use Go code while still being understood by static analysis tools like gno doc. Michael got greater clarity over the DAO structure and GNOT tokenomics, Milos was able to merge [PR 546](https://github.com/gnolang/gno/pull/546), after many months of effort, which adds file-based transaction indexing, and Thomas created instructions for getting started with the Gno Language Server (gnols), to give just some examples. It was productive and enjoyable and unblocked many issues. \n\nAiB engineers were also at the retreat, Zooma from Teritori, and Dongwon, ByeongJun, and Ray from Onbloc, creating plenty of opportunities for interesting discussions and showcasing our work. We also welcomed new core members Dylan and Danny to the team. Dylan is a senior software engineer, and Danny is supporting DevEx. We enjoyed meeting and hacking together with like-minded people and would like to do it more often with a broader audience. How about a Gnome contributor festival next year? Stay tuned.\n\n### Gno.land DAOs and Tokenomics\nThroughout the retreat and ongoing, we’ve made major advances to the DAO structure for Gno.land and the tokenomics of the chain. We’re still hammering out the final details, but we’ve decided on three main DAOs – GovDAO, EvaluationDAO, and SupportDAO – that will work together alongside other domain-specific DAOs, such as EngineeringDAO or ProjectsDAO, making Gno.land more decentralized over time. \n\nThe multi-tiered GovDAO will be responsible for voting on all decisions that affect the chain, such as parameter changes or validator acceptance/denial. GovDAO members will assess new contributors to the chain and allocate them a score and corresponding membership tier. EvaluationDAO will assist with specific contributions, lending its expertise and critic reviews as needed. SupportDAO will provide knowledge-specific services such as HR, marketing, and finance.\n\nRegarding transaction fees, we're exploring something similar to how Ethereum deals with gas in its EIP 1559 update. Essentially, a combination of comparing a new block’s size with the last block to gauge demand and some small parameters we’re looking at. We’re also experimenting with staking alternatives where contributors can stake their tokens to support certain projects in return for staking rewards. It’s still early days, so watch this space. We’ll be releasing more details soon. \n\n### Gno Playground\nGno Playground is a simple web interface that lets you share your code, run unit tests, deploy your realm and package, and execute functions in your code using the repo for a smoother and more collaborative developer experience. We’re excited to release Gno Playground out in the wild later this month in a soft launch set for November 28. If you’re interested in testing it out, head over to our Discord channel. We’re looking for feedback and help to identify bugs and improve the UX before its full launch in the new year. It will be interesting to see how people interact with the Playground and how they use it so we can iterate and attract more gnomes to our growing community.\n\n### The Portal Loop\nThe Portal Loop is an effort to create a continuously-deployed staging testnet to be hosted on the official [gno.land website](https://gno.land). The testnet will be reset at each commit on our repository, but it will re-play all the transactions from its previous version, dropping any that might fail following breaking changes in the code. The Portal Loop will provide a central place where you can experiment with the latest Gno.land updates, resolving the problem our existing testnets have faced (becoming stale only a few months after their launch) while also paving the way for building DAOs and on-chain Game of Realms and Proof-of-Contribution systems. \n\nWithin the Portal Loop efforts, we’re also building systems to more efficiently iterate locally on your Gno realms, similar to the previously described testnet. The Portal Loop will help to create an iterative cycle focused on development, testing, and feedback, enhancing local development and the Gno.land website. As developers are discovering, when building dApps like GnoChess, GnoMobile, or Flippando, they run into issues with the repo, GnoVM, and client libraries when developing locally.\n\nThe Portal Loop will enable much quicker feedback so we can iterate, uncover, and fix problems faster. Devs will get a greatly improved UI, with UX contributions and issues much easier to resolve, and the same CI/CD experience as web2 applications, where each time something is published on Git, they get instant feedback on how it works in staging, not only in terms of code but also in terms of data. Stay tuned, the Portal Loop is coming soon!\n\n### Standard Library Wish List\nThe standard library wish list in [issue 1267](https://github.com/gnolang/gno/issues/1267) is intended to be a starting place for anyone who wants to add new standard libraries to Gno. It's an opinionated collection of libraries that we would like to see added. So, if you see something missing that you’d like added to our standard libraries, leave a comment explaining your reasoning. If you want to port over a standard library from the list, make an issue for it and assign yourself, or if you can do it quickly, make a PR referencing the issue. You can see the global status of our standard libraries (as compared to Go) on our [Go\u003c\u003eGno compatibility document](https://github.com/gnolang/gno/blob/d421b963aed7f7c3ba3718edfc6fbd787fa8f0dd/docs/reference/go-gno-compatibility.md).\n\n### Dreaming with SOGNO\nThe Sogno project is a [dream](https://www.wordreference.com/iten/Sogno) Morgan has about improvements he plans to make on GnoVM. From his experience working on GnoChess, he found that many features were lacking that would have improved the workflow, for example, an improved debugging system, enhanced representation of the values within the VM, having maps as sortable data structures, and adding reflection. Morgan plans to work on this project on the side as a fork when he has time, so Sogno won’t be merged into the master branch for now. If you want to check it out and see if you can contribute, visit the [hackerspace PR 44](https://github.com/gnolang/hackerspace/pull/44).\n\n### The Future of the Gno Language Server (Gnols)\nThe [Gno Language Server (gnols)](https://github.com/gno-playground/gnols) is an implementation of the [Language Server Protocol (LSP)](https://microsoft.github.io/language-server-protocol/) for the Gno programming language. It is similar to the equivalent “gopls” project for Go, as they can be plugged into your code editor through extensions and allow you to access handy features, such as autocompletion, formatting, and compile-time warnings/errors. Gnols makes writing code simpler, working with several editors to suit your preferences. To try it out, visit the [CONTRIBUTING.md file](https://github.com/gnolang/gno/blob/master/CONTRIBUTING.md#vim-support-with-lsp), which contains instructions to get you started. Our current documentation targets Vim, Neovim, and SublimeText, but can likely be used with any editor that supports LSP. Feel free to contribute to improving Gnols and adding more features. It’s well-written, and simple to dive into the code and add more capabilities.\n\n### RustVM Implementation\nPetar continues progressing on the RustVM implementation and has almost finished, apart from a few bug fixes. As the design is now complete, he will enter the testing stages. He is also looking at how to add a Jit compiler to the current design. Petar was initially concerned that the garbage collector might have presented serious issues, but this has turned out not to present a problem. Adding a Jit compiler will require a lot of work (at least six months) to support everything in the language, but it should be possible.\n\nPetar is also looking at implementing concurrency the way it is in Go to have a fully functional virtual machine as it is in the spec. This would likely attract more external contributors to developing the VM. One advantage of Rust is that, with the concurrency model, there is already an extensive library called [Tokio](https://tokio.rs/) which he can use. Petar stresses that this isn’t easy, but he believes it’s achievable, at least as a research topic around determinism and concurrency.\n\n### Go Bytecode VM Implementation\nMarc continues to develop Parscan, another bytecode VM, but entirely based on the Go runtime, with the advantage of reusing the type-checking system, concurrency model, and memory management already part of the existing Go runtime. In the last month, the support for all missing declaration statements (constants, variables, and types) was added in the code generator.\n\n## Grantee and Ecosystem Updates\nOur ecosystem partners and grantees are working flat out on their contributions. We’re close to seeing the on-chain memory game Flippando launch, Adena and Gnoswap are incorporating some major new features, Zack’s released another informative tutorial as part of the Go to Gno series, and we’ve received several new grant proposals as well. We’ve even welcomed a new contributing team, Varmeta, to the fold. Scroll through the details below.\nTL;DR?\n* On-chain memory game Flippando is coming soon\n* Gnomobile is almost complete and will be receiving a rebrand soon\n* Gnosocial will allow devs to experiment with social media dApps\n* Experiment with content moderation using the ModerationDAO or create your own DAO\n* Gnoswap AMM DEX beta will launch in December\n* Adena to implement new ‘Air-Gap’ feature\n* Varmeta is working on Gno.land Unity SDK to make Gno more accessible to game developers\n\n### Dragos\nDragos has been working on porting his on-chain memory game Flippando from Solidity to Gno, and we’re looking forward to playing it soon after seeing an awesome demo earlier this month. When you play Flippando, you uncover a matrix of matching visual symbols. There are 2 levels of difficulty (matrix made of 16 tiles or 64 tiles). For the launch, Dragos aims to have visual symbols containing basic colors, dice, hexagrams, or various gradients. Once you’ve matched all the pairs and completed a matrix, you mint an NFT that can be assembled as artwork on-chain and traded in a marketplace. Dragos is currently looking at the initial tokenomics for Flippando, with a fixed supply of 1 billion and no airdrop distribution (more details soon). \n\nDragos has been a mobile app developer for over 10 years, with an interest in blockchain for around seven years. He enjoys working with Gno, although having to reset the chain and redeploy programs each time he makes a change was a challenge. The Portal Loop solves these issues in local development and will allow him to deploy Flippando sooner. As part of the work for Flippando, Dragos also added [PR 1309](https://github.com/gnolang/gno/pull/1309) to improve our GRC721 implementation]. He is also applying for a grant to port his project management system on-chain for Gno, and he gave us a [demo](https://drive.google.com/file/d/1eJGyATHhEzletWwQ4Xt_9ON7L231Yvow/view). An on-chain project management tool will be essential for organizing the DAO system, focusing on our team’s needs, organizing tasks, setting goals, and more. Keep up with Dragos’ progress by visiting his [hackerspace](https://github.com/gnolang/hackerspace/issues/33).\n\n### Berty\nBerty has been powering ahead with Gnomobile (which will soon receive a new name to better reflect its functionality), Gnosocial, and Gno core. Some highlights include significant progress on the GRPC interface (see [demo video]https://www.loom.com/share/d1cef60199c0487e86deab2a9e61d61c). As the interface to Protobuf has many more data types available than the interface to the language bridge, GRPC greatly simplifies the app and improves the UX. The API is almost complete and now includes wallet functions, such as creating an account and restoring an account from the recovery phase, and an event stream when calling a realm function [(demo video available here)](https://www.loom.com/share/42f2dcb0b4a34f77a95a0f8012e4b52b).To help developers, Gnomobile also includes example apps. Here is a [demo video](https://www.loom.com/share/41a20a764f0f4caf91f068b62e1f16c4) of the latest minimal hello app.\n\nBerty created [PR 1235](https://github.com/gnolang/gno/pull/1235) relating to Amino. They start with a Go struct and add comments explaining all the fields. Previously, when they ran Amino and generated a Protobuf structure, all their comments disappeared. This PR allows them to preserve the comments. They also created [PR 1213](https://github.com/gnolang/gno/pull/1213) since Amino should create a Protobuf structure where the fields follow official naming conventions. Thanks to help from the Gno devs, these PRs are merged.\nBerty is also focused on building a decentralized social media application using the Gnomobile framework, which is almost complete. The aim is to create a testbed where dApp builders can see how their implementations integrate and function with web2-like social media features, opening the door to interesting experiments such as DAO collaboration and content modification. Berty is building a decentralized Twitter-like application and plans to finish it in six months. Check their progress on their [hackerspace here](https://github.com/gnolang/hackerspace/issues/28) and look for more upcoming demos.\n\n### Teritori\nTeritori has been focusing on Escrows in the past couple of months, aiming to make improvements that facilitate on-chain project management. The team is also iterating the Moderation DAO and has identified a need for a conflict solver module to call an external authority to solve a conflict between two parties (for example, the buyer and the seller). They have called this module the Conflict Solver Module and integrated several options like Justice DAO (composed of humans) or any realms (e.g. GnoChess) to solve the conflict. They are researching work on VRF to implement randomness so that the module selects a person (or group of people) with no conflicts of interest in the issue. [PR 11](https://github.com/TERITORI/gno/pull/11/files) provides more details. A true randomness function will also be handy for the Flippando game that doesn’t currently rely on true randomness. \n\nIn other news from Teritori, the moderation DAO is live! You can head to the [Teritori site](https://app.teritori.com/feed?network=gno-teritori) to play around with it and even try deploying your own DAO, creating a user profile, and adding a social feed. The team has deployed V1 of a “Soundcloud-like” app on the [Gnosocial feed](https://app.teritori.com/feed?network=gno-teritori) in which you can listen to music while browsing features, publish your own music as an artist that appears on your profile, comment on tracks, tip artists, and more. Keep updated with Teritori on their [hackerspace here](https://github.com/gnolang/hackerspace/issues/7).\n\n### Zack Scholl\nOur resident tinkerer Zack gave a workshop last month as part of his “Go to Gno” series called [Go to Gno: ByteBeat - Generating Audio with Smart Contracts](https://www.youtube.com/watch?v=lmmUIEHhdqA). This is a really interesting tutorial on how to build Bytebeat (a minimal programming language for synthesized music) with smart contracts and follows on from his microblogging workshop. Be sure to check it out. If you want to hear more about Zack, you can also watch [Getting to Gno with Zack Scholl](https://www.youtube.com/watch?v=LgXa7QCdxdA\u0026t=1258s), a Fireside Chat series that talks about contributors’ work, lives, and motivations to be on the Gno.land journey with us.\n\n### Onbloc\nAs always, the Onbloc team has been busy! Over the past few weeks, they have been working on extending the functionality of Gnoswap, integrating APIs and realms with the interface, improving the governance page UI, and integrating the Adena wallet. Onbloc expects to launch the beta of Gnoswap next month, and we’re super excited to see it in action. To improve the UX and UI of Adena and make the wallet even more secure, the team is implementing a feature called Air-Gap which allows the wallet to broadcast transactions signed from an offline environment without the user needing to import their keys to Adena. Onbloc has also started a discussion around ideas to improve the usability of QR Codes for secure data transmissions between offline signers and watch-only wallets in [Issue 1375](https://github.com/gnolang/gno/issues/1375). We’ll keep you updated on the work here. You can also find more information on Onbloc’s [informative blog](https://medium.com/onbloc). \n\nAs well as developing core tooling for Gno, Onbloc is working on Gno core to help us build important functionality. The team welcomed a new hire, Lee ByeongJun as a core engineer and to help with work on three core areas: contract interaction (enabling realms to interact with other realms), the multinode testnet, and porting essential Go packages to Gno. You can find more details and keep track of everything Onbloc is working on in their [hackerspace issue here](https://github.com/gnolang/hackerspace/issues/29).\n\n### Varmeta\nWe’re excited to welcome a new contributor Varmeta to Gno.land. Varmeta was founded in 2020 to focus on blockchain and virtual reality/augmented reality technologies and has grown from a team of three to over 40 engineers. Varmeta is excited by the vision behind Gno.land and its philosophy for rewarding developers. The team is committed to supporting Gno’s success by providing various applications for the ecosystem, starting with the Gno.land Unity SDK to make blockchain more accessible to game developers. Track Varmeta’s progress on their [hackerspace here](https://github.com/gnolang/hackerspace/issues/43).\n\n### Gno @ Devconnect Istanbul 2023\nGno.land core team members organized a small, unofficial meetup in Istanbul during Devconnect week from November 13-17. The engineering-focused meetup was accompanied by a Happy Hour and snacks, where attendees got the chance to learn about Gno.land in an informal way and how they can easily develop dApps in Gno, as well as contribute to the project.\n\nThat's all for now! Be sure to check back again with us for the next edition of The More You Gno to keep up with all our progress. Do you want to contribute to Gno.land's monthly updates? If you're building on Gno.land and want to highlight your development, project, event, or idea, let us know, and we'll include your contribution.","2023-11-29T00:00:00Z","christina","gnoland,ecosystem,updates,gnovm,tm2"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["bgl-poc1","Building Gno.land – Next Generation Smart Contract System","\n\n*Disclaimer: The Building Gno.land series aims to share the core concepts of our platform, mission, and tech stack, providing a snapshot of a current state on our builder’s journey. New episodes may deprecate previous ones, but no editions will be modified at any time. We encourage you to follow along as we create the rails for a more transparent and accountable society, and we welcome feedback and contributions to the repo.*\n\n## I. What Is Proof of Contribution (PoC)?\n\nGno.land is secured by a novel consensus mechanism that makes our platform unique—Proof of Contribution (PoC). PoC prioritizes fairness and merit, rewarding the people most active on the platform and revolutionizing the concept of open-source rewards. By removing the voting power associated with being wealthy (holding tokens in Proof-of-Stake (PoS) networks or amassing mining hardware in Proof-of-Work (PoW) networks), PoC restructures the financial incentives that tend to corrupt blockchain projects in the long run and rewards contributors fairly for their work based on their expertise, commitment, and values. \n\nGno.land contributors receive rewards and voting power according to their contribution level. These rewards increase as they make additional contributions, gain expertise, and are promoted up the Gno.land governing DAO’s (GovDAO) tier levels by higher-level contributors. So how does PoC work, what are its core features, and how does it lend security and decentralization to the platform? \n\n### Prioritizing Fairness and Alignment \n\nProof of Stake (PoS) was a monumental leap forward for the blockchain industry, solving the energy-intensive requirements of Proof of Work (PoW) and enabling blockchains to scale for broader adoption (thanks to its minimal carbon footprint and faster throughput). However, like PoW, PoS has some disadvantages. For example, in PoS networks, participants receive rewards based on how many tokens they stake, which means their incentives for working on the chain are often purely financial. Validators accumulate vast net worths and don’t always hold values that align with the core development of the chain. \n\nSince validators are crucial in securing PoS networks, they should be paid fairly for their work and encouraged to contribute more. However, validators should not be purely financially (and certainly not politically) motivated, taking up competing positions and launching political campaigns to convince token holders to stake with them. This type of lobbying affects all aspects of the chain’s development—from governance to technical upgrades—and can lead to factionalism and misalignment. \n\nPoC makes the system fairer and more sustainable, ensuring participants are aligned and take actions that benefit the Gno.land community and the broader ecosystem. That’s why (unlike PoS) contributors receive rewards based on their contribution effort (tier level) rather than how many tokens they stake. They are thus incentivized and recognized for the quality of their work, ideas, and alignment, driving participation and active engagement. Governance is allocated to the people most likely to care for the ecosystem’s long-term success—the contributors who have spent the most time working toward it—from open-source developers to video creators and everyone in between.\n\n### Rethinking Financial Incentives \n\nFor long-term security and sustainability, PoC emphasizes project principles and values over monetary gains, replacing standard token incentives with a system that separates voting power from token ownership. Two reward systems are currently being considered (in addition to a hybrid system). For the first, contributors receive WORX units that weigh the amount of GNOT tokens (the native Gno.land gas token) earned each month. Each member of the same tier receives the same amount of WORX. At the end of the month, the total each member earned is divided by the total amount of WORX distributed that month to calculate a percentage. This percentage represents the percentage of Gno.land fees earmarked for contributors that each member will earn in GNOT. WORX will likely be cleared each month to prevent cumulative, exponential reward exploits over long periods of time. \n\nFor the second, each tier level simply receives an amount of GNOT each month fixed to a USD value, similar to a salary. This would be combined with risk management and caps per tier level in order to promote long-term sustainability based on Gno.land fee generation. A hybrid of this system is also possible, either rewarding contributors of lower tiers one way and higher tiers the other or using both systems in tandem based on predefined conditions. This will be explored further in future tokenomics articles, models, and documentation.\n\nRegardless, WORX units are not transferable, will not be listed on exchanges, and hold no monetary value. WORX units are more like shares that represent value provided by contributors and allow their work to be quantified compared to other contributors/tier levels. It’s important to stress that GNOT tokens do not influence governance on the platform in any way. Voting power is earned through contributions and distributed according to contribution effort, with each member of the same tier representing equal voting power that increases with their tier level. This creates a network of highly aligned contributors who care deeply about the platform they are building and strive to improve it.\n\nGNOT, the native Gno.land gas token and the gas token of the Gno.land ecosystem, will be distributed via airdrop to qualifying ATOM stakers. It will also be available for purchase after that point (*more on Gno.land’s airdrop and tokenomics coming soon*). GNOT is used to pay all fees associated with the network and beyond, including transfers, IBC, ICS, and contract interactions, giving holders the chance to earn rewards from the economic activities of Gno.land.\n\n### What Makes a Good Contribution?\n\nWORX and/or GNOT can be earned through different types of contributions—not only coding and development expertise—but also through non-technical contributions, such as community building, governance involvement, constitutional proposals, teamwork, media creation, etc. The core focus is on alignment, not necessarily specific tasks. For example, an accepted proposal or merged code will raise or at least maintain the contributor’s tier level, allowing them to receive rewards during their time working between submissions. However, a proposal or code that has displayed a very high level of effort, detail, and aligned values (but is not merged) will also be considered in any proposals regarding contributor promotion.\n\nThis system allows the ecosystem to show appreciation for diverse forms of contributions and ‘useful failures’ that bring us closer to the solutions we adopt. It is designed to foster engagement, creativity, and collaboration while encouraging anyone aligned to contribute to growing the Gno.land chain and community. \n\n### How Are Contributions Assessed?\n\nThere is a strong human element to deciding what makes a good contribution, requiring knowledgeable human judges to exercise discretion. As such, contributions won’t be templated by default or rewarded automatically but assessed through Gno.land’s governing DAO, GovDAO. GovDAO is responsible for development and governance and is organized into tiers, as discussed above.\n\nGovDAO members review, measure, and curate contributions, and the tokenomics of GovDAO incentivizes members to be effective and unbiased evaluators. They engage in discussions and assess contributions based on effort, time, and other relevant factors/metrics that contributors will have stored in their profiles. The decision-making rationale is transparent and visible through on-chain forums. Again, contributors are assigned a tier level and receive a corresponding reward each month according to their tier. As contributors join GovDAO, the DAO grows, giving Gno.land decentralization efficiency and a high Satoshi score. \n\nGovDAO is assisted by a network of knowledge-specific DAOs, such as an Engineering DAO, a Support DAO, an Operations DAO, and the EvaluationDAO, which comprises a trusted group of high-reputation contributors that help assess specific contributions. This enables secure collaboration and seamless integration (*more on Gno.land’s network of interconnected DAOs coming soon*.) \n\n### Sybil-Resistant and Secure\n\nIn addition to being fairer, more aligned, and sustainable, PoC is Sybil-resistant by design. In blockchains, a Sybil attack is where one or multiple attackers multiply their presence and influence by creating fake identities to sway major network decisions (for example, including malicious blocks). In terms of PoS, the Sybil resistance is purely monetary (people need to stake real money to get power), so an attacker that wants to carry out a Sybil attack on a PoS network needs to lock at least as much stake as that locked by honest validators.\n\nPoC minimizes risks of Sybil attacks, takeovers, and alliances as the community vets every person who is given any power or sway in the network (including validator power) through the DAO, so at no point can anyone \"spoof\" identities and regain major sway. Moreover, Gno.land is built and secured by the merit and effort put into the project, as opposed to how many tokens someone can buy, rethinking financial incentives and making the platform Sybil-resistant and secure.\n\nThrough fairer rewards, restructured incentives, resistance to corruption and Sybil attacks, and a strong appreciation for all contributions, Gno.land is designed to be sustainable and fair. A censorship-resistant platform built, owned, and secured by a growing, aligned community for many generations to come.\n\n*I. What Is Proof of Contribution? is the first in a series of articles to dive deeply into the philosophy, vision, mechanics, and work involved in developing a new consensus mechanism for the next generation of smart contract systems. Look out for subsequent editions and additional Building Gno.land series, and let us know what you think! Got questions? Join the Gno.land [Discord](https://discord.com/invite/S8nKUqwkPn) or follow us on [Twitter/X](https://x.com/_gnoland)*.\n","2024-01-10T10:51:00Z","","building-gnoland,gnoland,proof-of-contribution"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-7","The More You Gno: Gno.land Monthly Updates - 7","\n\nWelcome to the latest edition of *The More You Gno*, your regular source of updates from the Gno.land core team and contributor ecosystem. After a well-deserved rest during the holiday break, we’re kicking off 2024 with renewed energy and plenty of exciting initiatives, including a new staging testnet (the Portal Loop), the official Gno.land documentation page, several merged PRs (including native bindings!), and many updates across the board. Dive in to find out what we’re working on and what our ecosystem partners and grantees have been up to.\n\n## Gno Core Team Updates TL;DR\n\nShort on time? Skim the highlights from the core team in the list below. You’ll find additional details in the next section if you want to explore any topic in greater detail.\n- **Native Bindings** - If you’ve been following our journey or experimenting with the platform, you’ll hear virtual champagne pops as Morgan’s ongoing work with native bindings is finally merged [PR 859](https://github.com/gnolang/gno/pull/859).\n- **Gnodev** - Thanks to Guilhem’s `gnodev` initiative [PR 1386](https://github.com/gnolang/gno/pull/1386), you can now create and develop contracts with a single command.\n- **Gno.land Offical Docs** - Check out [docs.gno.land](https://docs.gno.land) for how-to guides, getting started, and an overview of key concepts of the platform.\n- **Effective Gno** - Taking inspiration from *Effective Go*, Manfred’s begun listing common patterns and examples of the differences between Gno and Go.\n- **Assignment in GnoVM** - Jae is working on approaches to fixing assignment in the GnoVM and issues that deal with persistence [(issue 1326)](https://github.com/gnolang/gno/issues/1326). \n- **Portal Loop** - The [Portal Loop](https://portal.gnoteam.com) has been released on a staging domain and is being tested.\n- **Roadmap** - We’re working on a fully-fledged Gno.land roadmap and will share a detailed DAG and important goals and milestones with you soon.\n- **Tendermint2 Update** - There are several PRs aimed at removing the dependencies between Tendermint2 and GnoVM.\n- **Gno.land Tokenomics** - We continue to make progress in defining the structure of Gno.land’s DAOs and the design of reward schemes for contributors.\n### Native Bindings (PR859) Has Been Merged\n[PR 859](https://github.com/gnolang/gno/pull/859) (native bindings) was submitted by Morgan in May 2023 to improve calling Go code from Gno standard libraries, all while improving `gno doc` documentation for standard library functions. Native functions are _declared_ in Gno code, but their definition (the underlying code) only exists in Go: this is similar to how Go and many other systems languages implement assembly functions. Overall, the addition will now allow us to better support precompilation (transpiling Gno code to Go) for all Gno-specific standard libraries, like [`std`](https://docs.gno.land/reference/standard-library/std/address/), and have a system for defining such functions that is transparent to code analysis tools like `gno doc` and `gnols`.\n### Gnodev Has Been Merged\n[PR 1386](https://github.com/gnolang/gno/pull/1386) (`gnodev`) has been merged. Gnodev is a tool to locally develop Gno realms which automatically re-deploys your contracts when you change the files, similar to JavaScript frameworks `npm run dev`. There are some additional features being worked on to improve the experience, including browser hot-reload (for the full front-end JavaScript experience!)—and Gno core developers who have worked on realms all agree that thanks to `gnodev`, they can finally stop visiting their therapist every week. Play around with it, and let us know how you get on. There may be a few bugs still and Guilhem is happily accepting feedback.\n### The Gno.land Official Documentation Page Is Live\nWe’re excited to have the Gno.land Official Documentation page live on the [https://docs.gno.land](https://docs.gno.land) domain. This will always be a work in progress as we expand the docs, make iterations to existing issues, and refine some of the core concepts, but it’s an excellent resource for anyone wanting to find out more about Gno and for onboarding new developers to the platform. A big thanks to the Onbloc team, whose developer portal was a huge inspiration for this. We’re looking for feedback, so leave your reviews and let us know where the docs can be improved and what else you would like to see.\n### Effective Gno\nManfred has been working on a document called [Effective Gno (PR 1000)](https://github.com/gnolang/gno/pull/1000), which takes inspiration from *[Effective Go](https://go.dev/doc/effective_go)* and will become an important reference document for Gno devs to explore common patterns and crucial differences in how we program compared to Go. We’ll be iterating on this as we progress, but you can already find plenty of examples. If you’re just getting into Gno and coming from a Go background, this is a great resource. Read this document and provide some comments if you have any. \n### The Portal Loop Beta Is Live\nThe Portal Loop Beta has been released on a staging domain, and you can check it out now at [https://portal.gnoteam.com](https://portal.gnoteam.com). The Portal Loop will replace the Gno.land website once we’ve finished squashing bugs and adding features. We’re still testing it and have identified several issues. For example, from the last three merged PRs, only one triggered a redeploy when we expected two or three deploys. We will also add a faucet.\n\nAs we continue to evolve the Portal Loop out of its early development stages, transaction volume and general activity will increase. However, currently, there are insufficient transit testing transactions. One of the tasks we want to do to prove that the Portal Loop is working well enough is to write a kind of monitoring-oriented oracle that will try to make transactions, perhaps incrementing a counter every minute. We’re looking for help writing a script or a daemon for this oracle, so let us know if you want to contribute to [issue 1443](https://github.com/gnolang/gno/issues/1443). Once the Portal Loop is finished, we will focus on testnet 4.\n### Assignment Issues in the GnoVM\nMorgan came across a bug [issue 1326](https://github.com/gnolang/gno/issues/1326), which returned an error about an [“unexpected unreal object”](https://tenor.com/es/view/cranizox-gif-8576622211330078986) when assigning a local variable to a dereferenced global variable in the GnoVM. Jae has been spending some time working on approaches to solving this and fixing assignment that will also work for saving escaped objects that don't have a parent (like variables whose pointers are referenced on a persisted object). This is a tough one to figure out, so if there are any other VM issues that deal with persistence and detached parentless objects, now is the time to add them to Jae’s plate. \n### An Update on Tendermint2\n[PR 1483](https://github.com/gnolang/gno/pull/1483) has the same goal as [PR 1438](https://github.com/gnolang/gno/pull/1438): to make Tendermint2 completely independent of GnoVM and Gno.land. This continues a project started many months ago to separate Gno into three separate components: the Tendermint2 consensus engine, the Gno programming language and VM, and Gno.land, the blockchain combining both together. This way, we’re working towards making it possible to build other blockchains that use Tendermint2 (like AtomOne!), the GnoVM, or both!\n### Gno.land Engineering Retreat\nIn the last *The More You Gno*, we covered the Gno.land and AIB company-wide retreat, an invaluable opportunity to work together, code together, and get to know our peers outside of work. It was such a success that the Gno core dev team held another retreat in December in Rouen, France, where many of the above issues and PRs were tackled and merged. We look forward to more productive and frequent face-to-face meetings in the year ahead.\n### Gno.land DAOs and Tokenomics\nWith the input of Manfred, Jae, and the rest of the team, Michael continues to make advancements on Gno.land’s system of DAOs and tokenomics. One key change since the last edition is that the WorxDAO (responsible for governance and all issues related to development in Gno.land) will now be known as the GovDAO. The DAO will likely have seven tiers but initially launch with three or four. The main benefits of moving up tiers are increased voting power, increased monthly rewards, and the authority to promote members from lower tiers. GovDAO will be assisted by WorxDAO, which will encompass several different sub-DAOs, such as engineering, funding, and projects. \n\nWe’re currently exploring different reward systems for contributors, whereby each member of the same tier level will receive the same amount of rewards, either directly or indirectly, in the GNOT native gas token or USD, in a type of salary-based scheme. We may also elect to distribute rewards based on a contribution/work “hash difficulty” (total number and tier split of active contributors that month). We may also adopt a hybrid of these two models. \n\nMichael is also working on a bounty system to make Game of Realms (GoR) more accessible and evaluating contributions easier for judges. High ranking GoR competitors will likely receive Gno.land tier levels based on their leaderboard placing in addition to ATOM rewards. It’s important to note that these discussions are ongoing, and the information here may be deprecated. \n### Making Testing Faster\n\nThanks to Petar, [PR 1417](https://github.com/gnolang/gno/pull/1417), we have improved the entire VM testing suite runtime by around four minutes, which is an incredible achievement. We just need to refactor some test scenarios that are not very concurrent-friendly, but this PR makes interacting with the platform so much easier.\n\n### Bug Fixes and Miscellaneous Items\n\nThanks to Joon from Onbloc, we were able to add support for octals without 'o' (check out [PR 1331](https://github.com/gnolang/gno/pull/1331) for more details), and thanks to Dragos [PR 1309](https://github.com/gnolang/gno/pull/1309), we extended the GRC721 interface so that it now supports setting a token URI. These are both extremely welcomed contributions, and we appreciate our ecosystem partners.\n\nFrom the core team, a special shout out to Dylan for killing it fixing bugs, and getting many PRs ([PR 1451](https://github.com/gnolang/gno/pull/1451), [PR 1315](https://github.com/gnolang/gno/pull/1315), and [PR 1305](https://github.com/gnolang/gno/pull/1305), to name a few) merged over the last few weeks. Props also go to Marc for [PR 1177](https://github.com/gnolang/gno/pull/1177), which has just been merged, which fixes append in certain key situations. We’ve also welcomed a new security engineer, Kristov, to the team.\n\n## Grantee and Ecosystem Updates\n\n### Onbloc\n\nOnbloc has been on a roll, giving us an internal demo of Gnoswap beta just before the Christmas break and a public demo of its awesome Pool Incentivization feature during the last contributor sync call. With Pool Incentivization, anyone can add extra rewards on top of swap fees for LP stakers. This will help bootstrap initial liquidity for new-coming projects by attracting liquidity providers until sufficient organic trading volume is secured. Onbloc is also actively developing Adena’s Airgap feature and has improved the sign-in flow for security enhancement along with some refactoring. There will be a demo coming up in the next few weeks. Onbloc will also be researching airdrop trends and aiming to identify some of the most coveted DEX features users want to see for Gnoswap to streamline the onboarding process.\n\nRegarding Gno core, Onbloc core dev Byeongjoon Lee has developed a JSON parser for Gno, giving us a live demo during the last contributor sync. This allows the conversion or accessing of data from contracts in the JSON format, which will improve the Gno developer experience. His code is currently under review by the core team in [PR 1415](https://github.com/gnolang/gno/pull/1415). Dive deeper into Onbloc’s Builder Journey in the [hackerspace issue 29](https://github.com/gnolang/hackerspace/issues/29).\n\n### Teritori\n\nTeritori continues the challenging work of developing Gno Project Manager, a web app that allows anyone to create, fund, review, or manage projects fully on-chain. During the last contributors' call, the team gave a demo of the work achieved so far, in particular regarding the escrow system and completing project milestones so contributors can be paid once each one is completed rather than having to wait until the project finalization. \n\nGno Project Manager is a complex goal, and the team has run into some issues with edge cases they hadn’t bargained for in the relationships between grantees and funders. The team is looking for feedback and help identifying edge cases, so if you have any in mind, let them know. Teritori is also working on the conflict solver module and improving the social feed on [https://app.teritori.com/feed?network=gno-teritori](https://app.teritori.com/feed?network=gno-teritori), as well as providing more detailed documentation on their work, which they’ll be releasing in the coming weeks.\n\n### Berty\n\nThe Berty team has been busy working on GnoSocial backend implementation. The initial feature set has been implemented [here](https://github.com/gnolang/gnosocial/blob/main/realm/public.gno), including posting and replying to messages and reposting threads. You can keep up with Berty’s journey on GnoSocial in [hackerspace issue 51](https://github.com/gnolang/hackerspace/issues/51), which contains many issues and PRs, such as implementing calls, running tests, and fixing bugs. We’re super excited about pushing the limits of scalability with Berty’s decentralized social platform, and we’ll be looking forward to more demos in the coming weeks.\n### Dragos\nDragos has successfully launched the Flippando game, and you can try it out on the [testnet here](https://gno.flippando.xyz/flip). If you haven’t been following the progress, Flippando is an on-chain memory game that you can play with your choice of styles, such as dice, colors, and hexagrams. Once you successfully complete a matrix, you can mint the end result as an NFT, which can later be assembled into larger, more complex NFTs to create digital artwork. You can find out more about the game, its creator, and the official roadmap on the site. We’ll also release a blog post soon from Dragos sharing his experience porting Flippando from Solidity to Gno, so stay tuned!\n### Varmeta \nVarmeta’s update was brief this week since the contributor sync call ran over. We look forward to hearing more about the team’s progress in developing the Unity SDK for Gno next time. You can read more about it on Varmeta’s [hackerspace issue 43](https://github.com/gnolang/hackerspace/issues/43).\n\n*Do you want to contribute to Gno.land's monthly updates? If you're building on Gno.land and want to highlight your development, project, event, or idea, let us know, and we'll include your contribution. That's all for now! Keep track of our progress by following our socials [Twitter/X](https://twitter.com/_gnoland) and [Discord](https://discord.com/invite/tF2X8M6cVj) and watch out for the next edition of The More You Gno in a few weeks.* \n","2024-01-22T00:00:00Z","christina","gnoland,ecosystem,updates,gnovm,tm2"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["porting-flippando-gno","5 Things I Learned While Porting Flippando From Solidity to Gno ","\n\nLast year, while visiting Seoul, South Korea, I decided, on a whim, to sign up for a hackathon called Glitch. The project I was going to present was a tiny little game, written in Solidity, called Flippando. It started as a weekend project to help me learn Solidity (I had no prior experience with this language). To my surprise, my tiny little game won the first prize on the Polygon track of the Glitch hackathon.\n\nEncouraged and even more curious now, I started attending side events during Buidl.Asia. One was about Gno, a smart contract platform written in Go. After the presentation, which was really great, I started a light conversation with the team. One thing led to another, and I ended up showing them Flippando. \n\nJust for context, Flippando is a non-degen, deceptively simple memory game. You start with an empty matrix and flip tiles to see what’s “underneath.” If the tiles match, they remain uncovered; if not, they are briefly shown, and you have to memorize their color until the entire matrix is uncovered. The end result can be minted as an NFT, and you can later assemble all the boards into bigger, more complex NFTs, basically “painting” with the uncovered tiles.\n\nThe Gno team seemed to like it, and they suggested I should apply for a grant to port it to Go/Gno. I had no prior experience in Go either, so I thought this would be a good opportunity to learn more. To my surprise, again, my grant submission was accepted.\n\nFast forward a few months until now: the Gno version of Flippando is live (in testnet beta) at [https://gno.flippando.xyz](https://gno.flippando.xyz). What follows sums up my experience porting the game from Solidity to Gno. This blog post is a mix of technical and not-so-technical takeaways.\n\n## 1. Being Early Pays Off\n\nSolidity has been around for some time now, and there is already a solid tooling ecosystem for it. I used Hardhat for my development, and I got really comfortable with it. When I started to port Flippando, though, I was quite surprised to see there was almost no tooling in Gno. Developing was mostly TDD (test-driven development) against a local VM, and deploying realms on the actual chain was more complicated than I expected. \n\nMy first feedback rounds to the team revolved almost exclusively around this topic. Very soon, I started to receive signals that my feedback was not only heard but taken into account and processed, and there were actual projects built aiming to improve the developer experience. In just two or three months, two full projects were finished: gnodev, and Gno Playground. \n\nGnodev makes development very similar to Metro in React Native: there is a watchdog on the file system, and your changes to the realm code are reloaded every time you save. It’s almost like deploying in real time; no need to stop the chain, wipe the state, restart the chain, and redeploy your modifications. Gno Playground is a sandbox-like environment, which helps tremendously with quick testing and even deploying packages on-chain. Both projects were finished, as I said, in just two to three months.\n\nBeing early pays off because you get to shape your development environment much faster than in a solidified (pun intended!) environment. You may have to deal with a little chaos in the beginning, but the benefits are well worth it.\n\n## 2. TDD All Day Long\n\nAs I said above, developing realms in Gno consists mainly of writing and testing your code with another code. It’s called TDD and it’s a very useful developing strategy, in general. I used it, at my day job, in all my projects consistently, but only in the initial stages. Once the codebase was more stable, I was relying more on regression tests from the Q\u0026A team.\n\nMind you, there was no Q\u0026A team this time; I was just coding alone, and I was forced to comply more and more with this TDD approach. In the end, I have to admit that, while slower and a bit boring, this approach is more effective, especially in a volatile environment, where patches are added literally every day, and the environment changes continuously.\n\n## 3. Marshal and Unmarshal\n\nThe current GnoVM doesn’t yet have an API standard for formatting. You can’t put a setting somewhere that will make the response be automatically translated into JSON. You have to write these JSON objects yourself for every payload you return from your realm. \n\nIn Solidity, all this is hidden under the event mechanism and handled by existing libraries, like ether.js, which take care of all this nitpicking. It soon became obvious that development time would be significantly longer in Gno because, on top of the logic, I also had to write the formatted response “by hand.”\n\nBut as with every other thing that seemed weird in the beginning, eventually, I came to appreciate it. It forced me to prototype more carefully not only the actual response but all the objects needed in my game. Eventually, it resulted in simpler and more flexible code.\n\n## 4. Eating Your Own Dog Food\n\nWhen developing in Solidity, most of the time, you just import OpenZeppelin contracts for ERC20 and ERC721 tokens (which are battle-tested, bug-free, and relatively easy to understand) and focus on your own contract logic. No mingling with low-level token implementation details; these are already packaged and ready to use.\n\nWhile porting Flippando to Gno, I realized I had to deal with these low-level details upfront simply because there was no equivalent of the OpenZeppeling contracts. Moreover, some current GRCs (the Gno equivalent of ERC) were incomplete. \n\nSo, I had to make a PR for a GRC721 implementation that was missing the SetTokenURI functionality, and this PR ended up being merged into the main Gno codebase (that felt really good, to be honest). \n\n## 5. Being Early Pays Off. Did I Say That Already?\n\nYes, but this time it’s about something else. It’s not about the satisfaction of shaping the development environment in the early days. It’s about the privilege of witnessing something coming to life from literally nothing. Gno has been in development for almost two years now, and it is several months before its mainnet. It’s literally on the verge of coming “alive.”\n\nEvery day new commits are added, and new decisions are made. There are new contributors constantly joining, and new projects prototyped and launched faster and faster. Every day the ecosystem is coagulating itself into something more and more visible, more and more alive.\n\nBeing able to witness this from the inside is a rare privilege and something I’m very grateful for.\n\n## Final Thoughts \n\nSo, these are, in a nutshell, my five top takeaways from porting Flippando from Solidity to Gno. There are many others, of course, and Gno is (did I already say this?) still very early. If you’re interested in learning more, please visit the official repo, look at the docs, and try interacting with the devs. You’ll never gno what can grow out of it! And be sure to play [Flippando](https://gno.flippando.xyz) today live in testnet beta and share your flips.\n\n## Here’s How to Play Flippando\n\nThe game presents a 16 tiles (4x4) or 64 tiles (8x8) matrix. These tiles are “covering” a board of various colors and gradients or shapes, like dice or hexagrams. Clicking two tiles consecutively “flips” them, showing what’s underneath. If they match, they remain uncovered; if not, they are briefly shown, and the player needs to remember their position. Once an entire board is flipped, revealing its random combination of colors, the player can choose to mint it as an NFT.\n\nWhen minting a solved board as an NFT, the game also mints a fungible token, FLIP, which is “locked” inside the NFT. This is the player's “reward.” But the token can only be unlocked if someone else uses that NFT in a larger project.\n\nThese larger projects, or “artworks,” can be assembled in the Flippando Playground. All minted basic NFTs are displayed here in an area from where the player can drag and drop them onto a canvas, creating a much bigger and more complex NFT. Once the canvas is fully filled and the player is satisfied with what’s in there, these new “artwork” NFTs can also be minted. This unlocks all the FLIP tokens for the NFTs used inside the artwork and sends them to their initial players. Furthermore, these complex artworks can be listed and traded in a marketplace, closing the circle of a virtual economy of goods.\n\nStart playing Flippando and share your Flips with Gno.land on [Twitter/X](https://x.com/_gnoland?lang=en) by tagging #gnoflip. \n\n\n","2024-01-24T00:00:00Z","dragos","gnoland,ecosystem,updates,flippando"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["wyg-zooma","Who You Gno – On the Record with Antoine Breuil","\n\nAntoine Breuil, ‘zôÖma,’ is the co-founder of [Teritori](https://app.teritori.com/), an active Gno.land contributor and grantee that’s building key modules and tooling for Gno. A firm believer in equal opportunities, free and decentralized access to information, and helping fellow humans, zôÖma is fascinated by human behavior and how we organize ourselves, holding an avant-garde social experiment five years ago with Teritori co-founder ‘Pop.’ \"La Suite du Monde\" drew people across France to a small village in the countryside to create a shared community and society—with farmland, accommodation, and tools for common use.\n\nThe goal was to form an in-real-life DAO whose members shared common goals and interests using blockchain technology with a token to pay for goods and services and vote on governance matters. While many people participated and were enthusiastic about creating a shared society, zôÖma admits the experiment was early- no one was interested in interacting with the tech. “90% of people, rural or not, found it too complicated,” he admits. “We were a bit naive, but it was fascinating nonetheless.”\n\n## A Fascination for Human Behavior\n\nzôÖma has been an ardent student of human behavior since childhood. His parents taught him early on the value of philanthropy and working with people in need. He’s set up several joint liability companies, non-profits, and NGOs to experiment with finding new and better ways to organize society, and one of the things he loves most about web3 is its “experimental” nature. He’s encouraged by how far the industry has come since he received his first bitcoins in partial payment for a website in 2014. “That turned out to be a really expensive website for my customer,” he laughs. He never expected such broad adoption of Bitcoin and a technology that “inspired a whole generation of engineers to experiment with new things.”\n\nLike most creative types, zôÖma is used to spinning many plates in the air, overseeing La Suite du Monde while working as a freelance designer, front-end dev, and Artistic Director for an independent French record label. “Before entering the world of engineers, I founded and managed a collective for 12 years, which brought together artists from all disciplines, hackers, designers, tinkerers, to build some interesting projects.” La Suite de Monde allowed him to explore his passion for finding new approaches to social coordination first-hand. “I explored very radical things,” he says, “like the notion of “accepted by default” where anyone could use the collective budget by expressing their desire to do so three times. I wouldn’t recommend this,” he laughs, “but the experiments were fascinating and still serve me today in my work.”\n\nOne really interesting trait about zôÖma is how he harnesses the creative and analytical sides of himself with equal application. Most people are predominantly right-brained or left-brained, yet, zôÖma is ‘ambidextrous’ in this regard. He’s a designer who’s created large-scale artistic events, cultural tours of Paris, and an award-winning independent movie documenting French artist and Bitcoin advocate Pascal Boyart, [The Underground Sistine Chapel](http://www.the-chapel.art), (which you should definitely check out!). Yet he’s also passionate about engineering and the future of cooperatives. He’s detail-driven and ambitious, taking his team at Teritori from two to 18 (14 full-time teammates and four part-time).\n\nIn his free time, zôÖma, “like all French people,” enjoys fine wine and good conversation. One of the things he loves most about Paris is how easy it is to find like-minded people to brainstorm with or decompress after a long day of work. “We have a very active ecosystem of engineers, cryptographers, etc.,” he says. Paris is also a beautiful city that captures his imagination with its dazzling architecture and impressive art. Even so, zôÖma channels his creative energy more effectively when working from a small Moroccan fishing village for three months a year. He reconnects with nature and humanity, immersing himself in a different culture and surfing in the Atlantic before he starts his day. \n\n## New Tools for Social Coordination \n\nWhy does zôÖma believe social coordination is so important, and why do we need new tools for it? “We’ve always had tendencies to organize ourselves and tools defining rules for living together, diplomatic protocols for discussing between social groups, or trading goods and services. But almost all the tools that previous generations put in place are outdated. Our entire generation has lost confidence in institutions to allow groups of humans to organize, coordinate, and meet their needs. Our dependence on third parties who do not have the same interests as citizens is immense.”\n\nzôÖma believes that web3 holds the key to unlocking the emergence of new societies through products that are “unstoppable, resilient, and meet a real need,” whether for small villages in the south of France, Africa, or Asia or neighborhoods in Brazil or Korea. “We must have access to the radical transparency of institutions, the privacy of individuals, censorship-resistant tools, and autonomous communication from all commercial enterprises. It is on this solid foundation that civilizations that are more just and equitable can be built.”\n\n## Making Web3 More Accessible \n\nOf course, as zôÖma found out, building new tools is easier said than done. Our industry faces an uphill climb when it comes to balancing the promise of the tech with a user experience that doesn’t cause tachycardia. He says that understanding that most people “don’t have the time or inclination to incorporate difficult technical concepts in their lives” has given him “crazy energy to focus on very simple technologies.” In fact, the ‘failure’ of La Suite du Monde is what gave birth to Teritori, “which today provides all the functionalities people asked us for at the time; a social network, communication systems, voting, crowd-funding, etc. We have made great progress, and it’s important to focus on products that are radically simple for the general public.”\n\nAccording to zôÖma, this means abstracting away the concepts that everyday people don’t need to be aware of, such as networks, dApps, and even blockchain, “and always switching from one decentralized application to another.” Unifying (not centralizing) separate tools, networks, and technologies within a single, simple interface, he believes, is the key to broader adoption. “It's a very complex challenge, in terms of security, design, etc., but it's what I'm passionate about today.” \n\nWhen it comes to Gno.land, Teritori has already delivered essential DAO tooling and standards, a Moderation DAO module to facilitate social communication and a Justice DAO module for conflict resolution. The team is now focusing on an on-chain project management tool to allow organizations and individuals to manage projects and track tasks smoothly and transparently on-chain.\n\n## A Fairer, More Transparent World\n\nIn 2024, Teritori enters a new phase called \"Chapter II,\" which involves unifying all its work into a mobile and desktop application that could “trigger superb demonstrations of the potential of DAOs.” He enthuses, “I dream that we will see the emergence of a village that uses Teritori as a tool for internal discussion and co-financing. Will this be real in 2024? Who knows? But that’s where I focus all my energy!”\n\nHe believes the internet has been a great leveler, enabling anyone with a connection to educate themselves on any subject; yet, the opportunity isn’t open to all, and free and open access is constantly diminishing. “I am a child of the internet. I grew up with warez, p2p, and an internet which provided me with daily resources to learn freely, everything that interested me. In some countries, it is impossible to benefit from this opportunity, and with the centralization of the internet on different key players, mass surveillance, and the censorship of certain dictators, the internet is losing its very essence, which makes it magic. Distributed protocols can reshuffle the cards and offer tools for the public good.” \n\nzôÖma says that humanity is at a turning point, and we must build the necessary tools now to avoid finding ourselves in a real-life version of George Orwell’s 1984. “I aspire to participate modestly in a world that is fairer, more transparent, and where society doesn’t need a puppet in a suit to improve its living conditions or respond to local needs. Web3 is just a tool, and if it doesn't meet this real need, then for me, it will be a failure.”\n\n*Experiment with Teritori today and test its Social Feed, which now includes Twitter-like functionality for posts, Medium-style articles, Soundcloud-inspired music, and videos—all based on Gno and IPFS and totally decentralized. You can also check out Teritori’s GnoModerationModule, which allows you to moderate a social network in a decentralized way. A faucet is available on the home page at [app.teritori.com](https://app.teritori.com/feed?network=gno-teritori).*\n","2024-01-11T00:00:00Z","christina","whoyougno,teritori,community,interview"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["bgl-poc2","Building Gno.land - Proof of Contribution II","\n\n*Disclaimer: The Building Gno.land series aims to share the core concepts of our platform, mission, and tech stack, providing a snapshot of a current state on our builder’s journey. New episodes may deprecate previous ones, but no editions will be modified at any time. We encourage you to follow along as we create the rails for a more transparent and accountable society, and we welcome feedback and contributions to the repo.*\n\n## II. Proof of Contribution vs Proof of Stake\n\nProof of Stake (PoS) is a robust consensus mechanism that provides a more environmentally friendly and scalable alternative to Proof of Work (PoW) and powers most of the web3 industry today. As PoS pioneers, Cosmos technology secures hundreds of blockchain projects and billions of dollars of digital assets, and Ethereum (launched as a PoW chain in 2015) made the historic switch to PoS in 2022. According to [ethereum.org](https://ethereum.org/en/developers/docs/consensus-mechanisms/pos), PoS is “more secure, less energy-intensive, and better for implementing new scaling solutions compared to the previous proof-of-work architecture.” However, as we briefly discussed in [*What Is Proof of Contribution?*](https://test3.gno.land/r/gnoland/blog:p/bgl-poc-1), PoS has vulnerabilities that can corrupt the network over time.\n\n### The Limitations of Proof of Stake (PoS)\n\nBeyond securing the network, the main goal of any consensus mechanism (PoW, PoS, DPoS, PoC, etc.) is to be as decentralized as possible and not reliant on any central actors. This can be measured by the Satoshi Score (or the Nakamoto coefficient), a quantitative measure that assesses a blockchain’s level of decentralization by calculating the minimum number of nodes needed to compromise a network or carry out a 51% attack. PoS systems can be bootstrapped within days (or even hours), starting off decentralized and achieving a high Satoshi Score.\n\nThe PoS chain Genesis allocates a default voting power to ~20-50 nodes, in general equally (or at least making sure that no single node has more than 5% of the voting power). This makes PoS chains decentralized enough (in theory) from block 0 with a near-perfect Satoshi score. However, in practice, PoS has two main issues. Because the system is dictated by money, PoS chains become imperfect over time. Anyone wealthy enough can stake their tokens progressively and use their accumulated power to sway decision-making on the chain—or take the network over completely.\n\nThe chain can limit the maximum voting power per validator node, but this is almost ineffective, as a malicious actor can carry out a Sybil attack on the network and create multiple validators to bypass the voting cap. Such an attack renders the max voting power per node useless and leaves the chain defenseless against a single organization or cartel gaining the majority of the voting power. PoS systems leave chains like Cosmos Hub and Ethereum at risk from such bad actors, cartels, and powerful protocols (such as Lido and Rocket Pool).\n\nWhile Proof of Contribution (PoC) can’t prevent Sybil attacks on standard user accounts (when malicious actors create multiple accounts with a single computer and transfer tokens within a few hours), it does make it almost impossible for validator nodes to suffer Sybil attacks. Since the community vets every person who is given voting power or sway in the network (including validator power) through the DAO, at no point can anyone \"spoof\" identities and gain major sway. \n\n### Where Proof of Contribution (PoC) Excels\n\nPoC is actually Proof of Authority (PoA) which, instead of offering up a resource like computing power or a financial stake, relies on validators staking their reputation. Anyone can join most public PoW and PoS networks without revealing their identity. However, by definition, PoA validators need to make themselves known and are selected based on their trustworthiness. This means PoA tends to work better when deployed in private or permissioned blockchains than in public platforms (because of this tendency toward centralization). \n\nPoC solves this problem, ensuring the network becomes increasingly decentralized over time by being governed by a decentralized entity, GovDAO. Like standard PoA chains, PoC chains launch with a handful of validators that must be identified and trusted by the network, meaning governance is centralized at the start, and the chain achieves a low Satoshi Score. The system is about contributing and earning contribution units, which are slow to gain and require human interaction. It takes months (or years) before there are enough actors in the DAO and sufficient voting power for the chain to be considered decentralized enough, according to the Nakamoto coefficient. \n\nPoC is thus slower to bootstrap than PoS and harder to achieve. You can think of PoC versus PoS as a marathon versus a sprint, whereby PoC starts slowly but then gains momentum over time, and PoS starts quickly but loses momentum over time (the graph below provides a visual representation of PoC versus PoS). \n\n[![Graph](https://gnolang.github.io/blog/2024-01-26_bgl-poc2/src/thumbs/graph-container.png)](https://gnolang.github.io/blog/2024-01-26_bgl-poc2/src/graph-container.png)\n\nThe GovDAO that owns the chain has a mandate to scale (to grow and decentralize) continuously as it adds more contributors. This means it becomes progressively larger over time, achieving high decentralization efficiency way beyond the initial fast sprint of PoS chains. Once established as a proven consensus mechanism and alternative to PoS, GovDAO can benefit from by any blockchain project (through an evolution of ICS) wanting to achieve decentralization and sustainability—PoC can secure Gno.land and the web3 industry at large.\n\n### Security-Conscious by Design\n\nAnother advantage of PoC is that because it’s reliant on human interactions, it is more Sybil-resistant by design. As discussed, it’s almost impossible to split a validator node into two (or more) nodes, making conducting a Sybil attack infinitely difficult. Since contribution units are not transferrable or exchangeable, PoC cannot suffer from whales attempting to purchase voting power quickly. If someone wanted to take over the network, they would need to invest years of their time making meaningful contributions. Their attack would be so slow that it would easily be prevented by humans monitoring the decentralization and adjusting the parameters. \n\nMoreover, GovDAO will activate and deactivate new validators on request, establish a KYC system for validators, and manage promotions of contributors with votes. This removes the possibility of a takeover happening overnight since the only way to gain validator or voting power is by voting on governance requests, which is slow and managed by humans. This is in contrast to PoS systems which are powerful and fully automated yet defenseless against such coordinated attacks.\n\nGno.land is built on the very premise that such an attack on a PoC network would never happen as it would be entirely counter-intuitive. Since contributions are not only about expertise but also alignment, it is our hypothesis that longstanding contributors who have invested years of time and brainpower in developing the chain will do their best to protect it rather than destroy it. The DAO system will endure thanks to the mix of expertise and alignment and the amount and frequency of contributions. \n\n### Concluding Thoughts\n\nBeyond separating voting power from net wealth, a core component of Proof of Contribution (PoC) is its focus on long-term sustainability. PoC makes the system fairer and more sustainable, ensuring participants are aligned and take actions that benefit the community and the broader ecosystem. PoC is slower to bootstrap and harder to achieve than PoS but focuses on long-term alignment and security. \n\nUnlike PoS, contributors receive rewards based on their contribution effort rather than how many tokens they stake. They are thus incentivized and recognized for the quality of their work, ideas, and alignment, driving participation and active engagement. Governance is allocated to the people most likely to care for the ecosystem’s long-term success—the contributors who have spent the most time working toward it.\n\n*II. Proof of Contribution vs Proof of Stake is the second in a [series of articles](/r/gnoland/blog:p/bgl-poc1) to dive deeply into the philosophy, vision, mechanics, and work involved in developing a new consensus mechanism for the next generation of smart contract systems. Look out for subsequent editions and additional Building Gno.land series, and let us know what you think! Got questions? Join the Gno.land [Discord](https://discord.com/invite/S8nKUqwkPn) or follow us on [Twitter/X](https://x.com/_gnoland)*\n\n\n","2024-01-26T13:37:00Z","christina","gnoland,gnovm,tm2,PoC"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["funding-program-23q4","Gno.land Funding and Grants Program - Quarterly Report: Q4 2023","\n\nThe Gno.land Funding and Grants program identifies talented and passionate developers, researchers, and tinkerers to interact with Gno.land, enhance the platform's usability, and help build the core infrastructure and tooling needed for mainnet. After a strong start in Q3 2023 from our grantees, we awarded four additional grants in Q4. Let’s take a look at their progress and what’s coming up in Q1 2024.\n\n## Q4 Funding Breakdown\n\nThe total amount paid out in Q4 for grants was just under $317,000, spread out over the four grants: Teritori, Berty, Onbloc, and Dragos (Flippando). This work was split over essential stress-testing, debugging, and development on Gno core, and building social, gaming, and project management dApps to extend the platform’s functionality. Each grant recipient received milestones for deliverables and tracked their progress through regular public and internal syncs, hackerspace journey updates, blog posts, documentation, and developer calls.\n\n[![Q4 Chart](https://gnolang.github.io/blog/2024-02-07_funding-program-23q4/src/thumbs/chart.png)](https://gnolang.github.io/blog/2024-02-07_funding-program-23q4/src/chart.png)\n\n## Berty Technologies (delivery May 2024)\n\nAfter successfully meeting their deliverables in Q3 and creating Gno Native Kit (formerly [GnoMobile](https://test3.gno.land/r/gnoland/blog:p/gnomobile)), Berty was awarded a second grant in Q4 to experiment with smart contract integrations around social media. Through the development of GnoSocial, the team has created a test bed for building decentralized social media-style apps and helped to stress test technical issues in Gno.land. \n\nIn Q4, Berty delivered V1 of GnoSocial, which includes basic Twitter-like functionality. GnoSocial will be implemented on mobile using the Gno Native Kit framework, with a minimal desktop app and a read-only web version also in the scope. Aside from this work, Berty contributes to Gno core development, helping raise issues and merge PRs. You can follow their progress in hackerspace [issue 51](https://github.com/gnolang/hackerspace/issues/51).\n\n## Teritori (delivery February 2024)\n\nAfter delivering the [moderation module](https://test3.gno.land/r/gnoland/blog:p/gnoland-moderation-dao-module) in Q3, Teritori received a second grant to carry out research and implement a conflict resolution module and an on-chain project management tool. Their work also continues on the escrow module build. As an active contributor, the Teritori team helps improve Gno core as well, getting more PRs merged, participating in regular meetings, and writing documentation. Read more about Teritori in their hackerspace [issue 7](https://github.com/gnolang/hackerspace/issues/7).\n\n## Dragos (Flippando, delivered January 2024)\n\nTo experiment with gaming in Gno.land, Dragos received a grant to port his on-chain memory game Flippando from Solidity. Flippando is a simple memory game—with a twist. Players uncover tiles and must find their matches to win the game. The result can be minted as an NFT and assembled to create larger, more complex NFTs and digital “paintings.” The beta version of [Flippando](https://gno.flippando.xyz/flip) is now live on the testnet, and you can read about his experiences in developing the game on the [Gno.land blog here](https://test3.gno.land/r/gnoland/blog:p/porting-flippando-gno) or visit [hackerspace issue 33](https://github.com/gnolang/hackerspace/issues/33).\n\n## Onbloc (ongoing)\n\nAfter producing consistently awesome work and being our longest-standing contributor, Onbloc received a grant in Q4 2024 to continue iterating on Gno.land tooling, Adena, and to help build Gno.land core in preparation for mainnet release. Part of the scope was to support contract-to-contract interaction [issue 757](https://github.com/gnolang/gno/issues/757), lead a [multi-node testnet initiative](https://github.com/gnolang/hackerspace/tree/main/multinode-testnet), write pure Gno packages, and help debugging the GnoVM, among many other initiatives. Onbloc is also adding additional security to the Adena wallet and an “Airgap” feature, which you can read more about in [hackerspace issue 29](https://github.com/gnolang/hackerspace/issues/29). We’ll also release a detailed blog post soon, so stay tuned.\n\n## Coming Up in Q1 2024\n\nWe’re looking forward to more exciting developments in the coming year as we focus on the road to mainnet. In Q1, grantees will mainly focus on debugging Gno core, developing smart contracts and libraries, building and porting dApps to Gno.land, and creating educational materials to help grow the community.\n\nBlockchain software and virtual reality technologies firm Varmeta are under evaluation for a grant to support account sessions and build the Gno.land Unity SDK to make blockchain more accessible to game developers (you can track their progress in [hackerspace issue 43](https://github.com/gnolang/hackerspace/issues/43)). We’re also finalizing a grant for a DAO tinkerer and a research report, as well as evaluating the extension of a second grant to Dragos to port his popular project management app to Gno.land. \n\n\n*We’re steadily building out the Gno.land platform and our ecosystem of grantees and contributors. Let us know if you want to join us by submitting an application at any time on the [Funding and Grants repository](https://github.com/gnolang/ecosystem-fund-grants). We’re always on the lookout for ideas to advance the platform.*\n\n\n","2024-02-07T13:37:00Z","christina,michelle","gnoland,funding,grants"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["wyg-dragos","Who You Gno – On the Record with Dragos Roua","\n\nDragos Roua is a humble man. If you had the chance to read his article, [*5 Things I Learned While Porting Flippando From Solidity to Gno*](https://test3.gno.land/r/gnoland/blog:p/porting-flippando-gno), you’d have seen him refer to Flippando as his “tiny little game” and describe his “surprise,” over it winning the Polygon track of the Glitch hackathon, two subsequent hackathons in South Korea, and piquing the interest of the Gno.land team to offer him a grant. If ever there were an inverse of “the empty vessel makes the loudest sound,” Dragos would be it.\n\nAt 54 years old, he’s lived an extraordinary life. Growing up in communist Romania, where scarcity was in abundance, and “everything was in short supply,” Dragos and his peers were “only allowed to learn one coding language,” and it happened to be called “Whatever.” So, when anyone asks in what languages he knows how to code, he always jokes that Romanians can code in “whatever.” Joking apart, his language skills are impressive, to say the least. \n\n## Dragos Knows a Lot of Code\n\n“My first production-level code was written in Cobol on punch cards,” he says when he was just 16. He went on to learn Smalltalk, Lua, and “just for fun,” even a programming language called “Brainfuck.” He spent many years programming in web2, iOS, and Andriod, but over the last seven years (since entering the web3 space), has been consistently working in JavaScript, Swift, Solidity (which he learned by creating Flippando), Python, and Go. Despite this, Dragos confesses he still feels more at home within the Apple ecosystem. “I've been building a lot there,” he says. \n\n## He Speaks Many Languages\nI ask if learning programming languages is similar to spoken languages. “Every programming language has vocabulary and grammar, which is a specific set of rules over that vocabulary, so it’s similar in that sense,” he says. And how many spoken languages does he know? “I can speak five Indo-European languages” (Romanian, English, French, Spanish, and Portuguese). “Five?” I gulp, wide-eyed, suddenly feeling inadequate for only speaking three. “Well, they all share about 70% of the vocabulary, and the grammar has almost the same rule set,” he shrugs, minimizing his accomplishment.\n\nHe’s also learning two Asian languages with varying degrees of success. Korean, a language he understands “some 40%” of, Dragos admits, is a different ballgame. “I've been frustrated for nine months, every day trying to plug away because there's literally no similarity in vocabulary between any Indo-European language and Korean. Literally no word is the same, and the grammar is also very, very different.” He explains that learning a language like Korean means starting from zero and waiting for the brain to forge the neural paths. “It's quite difficult to do,” he concedes.\n\n## A ‘Location-Independent’ Lifestyle \nI check out the backdrop behind him. He’s taking the interview from an elegant cafe in downtown Saigon with impressive dark wooden walls, large ceiling fans circling above, and a rich colonial atmosphere. “It’s such a posh place,” he smiles, “every day, there are groups of people taking pictures. It has an Indochina vibe.” I can’t help but wish I could teleport over and share a beer with Dragos as we discuss his remarkable life. “How long have you lived there?” I ask, “I don’t live in Saigon,” he replies, “I’m location-independent.”\n\nAs I wonder if that’s a more elegant term for “digital nomad,” Dragos quickly explains the difference. Digital nomads typically have no fixed abode, he says, and tend to set up a base for a short period of time before moving on to the next place. Location-independent is someone who has a base but is independent of it and chooses to spend longer periods of time in various places. “So I became a loner,” he says, “and I’ve been location-independent for six years. I spent my first two and a half years in Spain, then from Spain, I moved to Portugal, which is my base right now, and I started to explore Asia last year.”\n\n## A Love of the Open Road\nI point out how amazing his lifestyle sounds—and also how challenging it must be at times. Dragos loves the freedom that comes with being alone in a foreign land and the master of his destiny. He also thrives on learning from different people and cultures and discovering more about himself. “The more you travel, the more you learn. Where can you stay? Where can’t you stay? What is needed? You learn the logistics, and you become a much better administrator and manager of your life.”\n\nHe admits to feeling lonely at times. Being location-independent isn’t for everyone, and certainly not if you don’t like being alone. “It's very difficult to be on the road because you don't have many friends. You don't have a fixed social circle. I'm in a place right now where I'm quite comfortable with myself. I can spend long periods of time on my own without needing close encounters. I have a very limited circle of friends, which I keep in touch with every month or so.”\n\nThe cultural differences between Europe and Asia are something of a double-edged sword as well. Dragos likes Vietnam, where the people are friendly and welcoming and talk to him on the street out of curiosity or to practice their English. But he’s felt like quite an outsider in South Korea, where the culture of politeness and restraint makes it harder to establish meaningful friendships. \n\n## Astrology, AI, and Other Mind-Blowing Stuff\nTalking about human connections inevitably leads to the increasing lack of them—and the topic of AI. I ask how he feels about the prospect of AGI and a potential replacement species. He shrugs and points out that most of what we hear about AI is marketing. He thinks that LLMs (Large Language Models) will hit a wall when they run out of good data to be trained on. He is a little concerned about the prospect of election rigging and AGI being harnessed in the political sphere by nation-states attempting to outmaneuver each other by predicting the next plausible move. “But this is a can of worms,” he says.\n\n“Actually, at the most fundamental level, there is no difference between AI and the process by which we generate ChatGPT or any other language model, and… hold your breath,” he pauses, “astrology. They both take a set of arbitrary features and a set of desired outcomes. After that, they just do a lot of computation, by trying to minimize a cost function between the predicted and expected outcome. That's all there is to it. You take features, add some parameters, trillions of parameters, you run a lot of computation, and in the end, you have the most plausible outcome. LLMs do this in hours/days/weeks of training, astrology did it slowly, over the course of a few thousand years.” \nI ask Dragos if he hadn’t been a programmer, would he have perhaps become an astrologer instead? “I actually studied astrology and used it for 18 years,” he replies.\n\nI try hard not to fall off my chair. Dragos explains that astrology plays a huge role in his life, and he consults it before making any major decision—such as moving countries or leaving jobs. “I consult it on every major decision and even daily life. So wherever I have to, I use it. When I sold one of my companies, when I decided to move abroad, when I travel, and stuff like that.” He gives the analogy of meteorology and says if he knows it’s going to rain, he’ll take an umbrella to have less friction and move around more easily. In the same way, he applies astrology to his life. This man is a Pandora’s box.\n\nWhat else does he do in his spare time besides traveling the world, consulting the Cosmos, and writing code for fun? Dragos likes playing pool, socializing, dining out, and dancing. “I was a tango dancer back in Romania. I had a tango school for a year.” At this point, I’m hardly surprised. \n\n## Dragos on Gno.land \nI met Dragos last year in Seoul at a Gno.land event hosted with Onbloc during BUIDL Asia. That’s when he spoke to Manfred about Flippando and subsequently applied for a grant. We were still building the specs for the Grants Program at the time, and Dragos was our first grantee. Since then, he’s embarked on a whole new journey learning Gno and building the airplane as it flies, delivering Flippando last month and regularly helping the team with Gno.land core issues.\n\nDragos has since submitted a second grant proposal to port his project management app to Gno. “It uses my life management framework, which I call “assess, decide, do.” The name of the project is *ZenTasktic*. There is already an app on iOS that I wrote,” he explains. You can read more about his grant proposal [here](https://github.com/gnolang/ecosystem-fund-grants/pull/11) and be sure to test out [Flippando](https://gno.flippando.xyz/flip) today.\n\nI apologize for taking so much of Dragos’ time, but he assures me it isn’t a problem. “I don’t work today, I'm not busy. I'm just enjoying my afternoon in this coffee shop.” As Dragos sips on the local tipple and drinks in the sights and sounds around him, I can’t help but admire his outlook on life and the choices he’s made—and I look forward to seeing what he's up to next and what else he builds with Gno.\n","2024-02-08T00:00:00Z","christina","whoyougno,flippando,community,interview"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"rqIkHnH8qHIJXsLHOaTf5D017CWz95d5RwTp6OnxfNAs7zcBivUHzHWKpwYz2DZ2fVmMnSIjSebuez6vZ+qXRw=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["chess-gc23","Play Chess with Us: The Gnolang Way at GopherCon 2023","\n\nCalling all gnomes and gophers! Come join the Gno.land team at GopherCon 2023, September 25 - 28, in San Diego, US. We’re sponsoring this year’s action-packed event that will gather together some of the world’s brightest minds and smartest programmers under one roof. So drop by our booth, pick up some swag, and say hey! We’ll be on hand every day to meet and greet, answer all your questions, and discuss everything Go, Gno, and beyond! We’ll also be hosting a workshop on Community Day, September 26, called ‘Chess: The Gnolang Way,’ where you can learn how to build a web3 chess server on Gno.land.\n\n## GopherCon 2023\n\n[GopherCon](https://www.gophercon.com/) is a community-driven annual event that started in 2014 and is dedicated to promoting the use of Go and the education of Go developers. Every year, thousands of gophers from around the world exchange ideas, share their work and expand the Go network. There are four days of fun-filled activities, including hands-on workshops, informative keynotes, networking events, and hackathons, all taking place in the laidback West Coast city of San Diego. Where better to expand your knowledge and make new friends than in one of the US’ most popular destinations?\n\nAs a gold sponsor at this year’s event, Gno.land will be running a booth and doing our best to convert as many gophers as possible to Gno, showing them how easy it is to port their existing web2 apps over to Gno.land or to build completely new ones from scratch.\n\n## Chess: The Gnolang Way\n\nIf you’re looking for a hands-on coding experience and to have a little fun with us at the same time, join us on Community Day for an awesome workshop, **‘Chess: The Gnolang Way.’** Kickstart your day by learning to build a web3 chess server on Gno.land using Gnolang. By the end of the session, you’ll have gathered basic knowledge on developing and deploying smart contracts on Gno.land, and connecting smart contracts to a web frontend. You’ll also see how web3 enables you to write perpetual and trustable social and gaming platforms and how to build a web3 chess server and website with Gno.land.\n\nIf you want to join us, meet us at 10:00 a.m. in the Grand Ballroom 10.\n\n## Let’s Play\n\nAfter the workshop, the fun begins with an ongoing chess tournament throughout the GC23 summit for event participants. To be in with a chance of scooping up some seriously cool prizes, GC23 attendees will need to show us their best moves and how much they engage with the Gno.land chain. This competition is designed to put our platform to the test over two main areas: chess mastery (50% of points) and platform engagement (50% of points). To be eligible for prizes, participants must be present at the event. We hope to see you there! If you can’t join us in person in San Diego, be sure to [follow us on X](https://twitter.com/_gnoland). We’ll be giving updates on our progress and sharing the highlights of the event. May the best gnome win!\n","2023-09-25T13:37:00Z","christina","gnoland,gnovm,gnochess,events"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"ChPwdT7pgvuqF8aBJQEnJ3fuTyeHzPBmqdMz7yoHyZwg0Gck3JJCyYXTgcOrz/MKF2M3duzM2XghW59wNWTkNw=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["gnomobile","GnoMobile, a Framework for Building Gno Mobile Apps","\n\n*This blog post is written by Berty Technologies, an NGO that is building open and free communication solutions without any of the limitations imposed by centralized systems. Berty is a proud partner and grantee of Gno.land.*\n\nThe year is 2023. Current Gno apps run on desktop or laptop computers that have Go installed. To run on mobile, the app would need to bundle the Go runtime, which is complicated for most developers. At Berty, we have years of experience using Go on mobile and overcoming difficulties with Android and iOS operating systems. We built Wesh Network, a decentralized communication protocol that enables p2p users to reliably and securely send messages over async networks, even in environments with poor or no connectivity.\n\nThis stage is thus set to take the leap and make it easier for builders to develop Gno applications for mobile devices.\n\n# What is GnoMobile?\n\nSimply put, GnoMobile is a framework for developing Gno mobile applications. This is how it works:\n\n*WARNING: Deep technical sections ahead. Grab a coffee before venturing forth*.\n\nFor communication between the mobile app and the Gno code, GnoMobile uses [gRPC](https://grpc.io/), a well-supported framework that sends and receives Google Protobuf messages. Even though the core Gno code is written in Go, the app code can use React Native, Java, Swift, etc. The following system diagram shows how gRPC is used.\n\n\u003cdiv align=\"center\"\u003e\n ![](https://github-production-user-asset-6210df.s3.amazonaws.com/109347079/267934754-e4da6fec-a586-4ebe-97cc-3b3ad7f79370.jpg)\n\u003c/div\u003e\n\nMoving from the bottom to the top, this is how the flow looks:\n\n1. At the bottom are Go packages in the gno codebase. A **gnoclient.Client** supports communication with the remote Gno.land node with methods like Call to call a realm function. The Gno codebase also has **keys.Keybase** to support a wallet stored on the local device with methods like CreateAccount.\n2. These methods are called directly from the next level up by the **GnoMobile** Go code. A Go object can’t be passed through the gRPC interface, so the GnoMobile Go code maintains a persistent gnoclient.Client object, which is accessed by gRPC calls. The GnoMobile API functions are registered by an amino package.go file and the generated Protobuf files are used to configure the gRPC server.\n3. Finally, at the top of the diagram, the **gRPC client in the mobile app** communicates with the GnoMobile gRPC server over a local connection using Protobuf messages. A gRPC call can either return an immediate result (for example, GetKeyCount) or an asynchronous gRPC stream object, which can return delayed results (for example, a Call to a remote realm function). The gRPC framework uses the Protobuf API to generate convenient API functions in the mobile app’s [preferred language](https://grpc.io/docs/languages) (React Native, Java, Swift, etc.).\n\n# How GnoMobile benefits builders\n\nThe first version of the framework will include three main sets of features:\n\n1. **Blockchain Operations**: These refer to the core block of functions that the apps need to interact with the blockchain. Things like the gnoclient API to effectively bring the benefits of the Gno framework on mobile, the gas estimation interface and calling realm functions, querying a blockchain node (and more) are included here.\n2. **Wallet**: As the name suggests, here we have all the standard wallet operations like create or delete an account, set the recovery phrase, account balance, and so on.\n3. **Toolkit**: We want to make it as easy as possible for devs to start building apps with our framework, so we’ll provide them with install instructions, example apps, and more technical stuff like genproto options to support gRPC and helper functions to parse the render output.\n\nThose should be enough to allow builders to get started on using and experimenting with Gno mobile apps.\n\n- *Support for secure p2p communication, even when the Internet is down?*\n- *Yes, please!*\n\nSomething that is not necessarily essential for V1, but for sure will open the doors to some powerful capabilities later on is to add an interface and a constructor to adapt the communication transport. This will make it possible for devs to incorporate other tools like Wesh Network and give their apps the ability to securely and reliably send messages even in very poor network conditions. But that’s a story for another time.\n\n# When will GnoMobile be ready?\n\nV1 is planned for release in mid-December 2023.\n\nUntil then, you can check out our progress [here](https://github.com/gnolang/hackerspace/issues/28).\n\nGot feedback or want to drop us a question? Ask away on our [repo](https://github.com/gnolang/gnomobile/issues).\n\n# What does the future look like beyond V1?\n\nWe see a lot of potential directions for GnoMobile after the initial release that will improve the user experience, extend its functionality, and make GnoMobile even more secure. We’re still scratching the surface in terms of how far we can take its development, and we look forward to working on further iterations and improvements. Some of our ideas for the future beyond V1 include:\n\n1. Making it easier for developers to **build** **desktop apps** **and** **browser extensions**:\n2. Through GnoMobile, we can gradually enable “desktop” devs to use our React Native gRPC interface to write desktop applications while using existing functionality from the core Go code. This way, developers will not necessarily have to learn Go to leverage its advantages.\n3. Browser extensions are usually written in JavaScript in the same way as in React Native. This opens the door to getting the benefits of Go via the GnoMobile framework. Otherwise, you’d have to either make the Go code run inside the browser extension (which is not easy) or use a remote server (which is not pretty).\n4. Making it possible to **execute smart contracts directly from mobile**.\n\n*Why is this important?*\n\nIf you want to add a new message to a blockchain, you need to actually interact with it (the blockchain) and update its state with the new message. However, if you just want to browse through the messages, you can execute the Render function locally without needing to use your network and, at the same time, get the results much faster. This is because the node runs locally on the mobile device without needing to spend crypto coins to get a remote node to do the operation for you.\n\nGno nodes run on GnoVMs (gnovm), and for the moment, these are only available on desktops. We believe it is possible to make them available on mobile as well, but we need to find clever ways to overcome the constraints of mobile devices (like putting the apps in the background (iOS), addressing network bandwidth limitations, and so on).\n\n1. Developing a **decentralized push notification service** for *both* mobile and desktop apps. Getting notifications is now a standard (and very important) functionality of centralized apps. Technically, this happens via a central server. Naturally, having a centralized server is not possible for a p2p app, but there are other ways to implement notifications, and we are considering including them in the GnoMobile framework.\n2. Making it possible for decentralized apps to **interact with the blockchain even if the network connection is poor or virtually unavailable**. Through the [**Wesh Network** protocol](https://wesh.network/), we are opening up the possibility of using alternative transport mediums to exchange messages between peers in an asynchronous but reliable manner in off-grid environments. Enabling reliable, secure, and censorship-resistant communication is our main cause at Berty Technologies. We want to open the door for p2p users to send messages and interact even in extreme situations or adverse scenarios, and Wesh Network is built specifically for this purpose. It is only natural to make it easier for developers to use it through the GnoMobile framework.\n3. Advancing **edge networking for enhanced blockchain resilience**. Edge networking refers to bringing functionality like computing power or storage closer to the user so that they don't need to travel through the whole Internet to interact with a server. The same edge concept can be applied to bring the necessary services to interact with the blockchain closer to each p2p user. For example, hosting a copy of the blockchain so a user can sync it or even execute smart contracts. Having these fundamental services closer to the p2p users is especially important in the case of mobile apps. We want to offer developers the possibility of taking advantage of the edge networking benefits by allowing them to use, for instance, network address redirections or special HTTP headers in the configuration of their applications.\n\nIn all honesty, it’s hard not to get excited about all the different possibilities that lie ahead for GnoMobile, but we’re keeping our focus on shipping V1 for now and collecting feedback from the community. After that, well, we hope you’ll stick around to see what happens next!\n","2023-09-29T13:37:00Z","jeff,costin,remi,iuri","gnomobile,berty,weshnetwork"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"i1+3JXF6eAZqf00c9euS14NYsPxUXlaYtt2r48Dh8y8aSJzFr04LVXa7Q3eE1Q1yRwCv858gdttO6NtytxAkeA=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-5","The More You Gno: Gno.land Monthly Updates - 5","\n\nIt's been another productive month, packed with developer calls, live events, new contributors, a large team presence at the Go community's biggest event of the year, GopherCon 2023, and the launch of a PoC gaming dApp on Gno.land, GnoChess. We uncovered a bunch of bugs in the code and some issues with the GnoVM, and made further progress on the Go and Rust VMs, the banker module bug, Gnofee, and much more. Check out the updates below.\n\n## Building a Web3 Chess Server on Gno.land - GnoChess\n\nMost of our work over the last few weeks has been dedicated to [GnoChess](https://gnochess.com/), a [PoC gaming dApp](https://test3.gno.land/r/gnoland/blog:p/chess-gc23) unveiled at GopherCon 2023. As gold event sponsors, we wanted to provide gopher attendees with a memorable experience – and a little friendly competition – while battle-testing the Gno.land platform. As our first gaming dApp, developing GnoChess was extremely useful for our team in many ways. We managed to attract 61 players to the game during the event, including some die-hard web2 gophers who wanted to show off their moves and discover more about Gno.\n\nSeveral PRs were opened as a result of our endeavors, and, beyond the conference, GnoChess taught us a lot about where we're at with Gno, how to successfully build complex dApps on top of the platform, and how well we work as a team. We uncovered some key issues and breaking behavior in the GnoVM, made our JavaScript clients much more reliable in their communications with the Gno.land node, and unearthed further issues that lead to complex errors and potential security flaws that must be addressed before mainnet.\n\nFor example, appending nil to a slice of errors resulted in a panic, or conditional statements like if not supporting custom boolean types. The GnoVM doesn't currently perform terminating statement analysis, which results in a cryptic panic message ([issue 1086](https://github.com/gnolang/gno/issues/1086)), and mixing untyped (negative) floats and integers in arithmetic sometimes drops the sign ([issue 1152](https://github.com/gnolang/gno/issues/1152)). The issues uncovered while developing GnoChess were discussed extensively in the public developer calls of [Sept 6](https://www.youtube.com/watch?v=BBBqgycMjqU) and [Sept 20](https://www.youtube.com/watch?v=WrxFVPR55G0), and referenced in the [GitHub meeting agenda](https://github.com/gnolang/meetings/issues/31). Most of the issues are common in software development and fairly simple to fix by making some implementation changes or adjustments to design choices.\n\nWhile developing GnoChess, our engineers took on the role of expert platform users rather than core team members. This approach was very useful as it pushed the platform to new limits, and allowed us to dive deep into many aspects of the project, creating a culture of sharing by opening up issues for each bug and asking for feedback and support. We'll definitely take a similar approach for future app development and onboarding new devs to Gno. We'll be releasing a retrospective of our experiences in the coming weeks. In the meantime, if you want to build a dApp on Gno.land, check out the GnoChess repo, where you can find a useful [tutorial](https://github.com/gnolang/gnochess/blob/main/tutorial/01_getting_started/README.md) or watch the recording of the GopherCon workshop, '[Chess: The Gnolang Way](https://www.youtube.com/watch?v=JQh7LhqW7ns).'\n\n## The Battle of the Virtual Machines\n\nCore engineers Marc and Petar continue their excellent work developing two different VMs for Gno, one in Go and one in Rust. In the coming weeks, we'll have a face-off, comparing and contrasting their features, efficiency, speed, and performance, so watch this space! For now, the definition of the virtual machine is stable for both, and they are no longer working on the virtual machine definition. They are mainly focusing on code generation; everything from parsing to scanning to parsing and compiling. Let's see how they are shaping up.\n\n### Rust VM\n\nPetar has developed a Rust implementation not only of the virtual machine but of the whole chain, including the compiler. He has written a Go compiler entirely in Rust and has even started experimenting with changing the compiler to implement the Invar proposal from Jae. Further progress includes porting a part of the parser and scanner from the Go compiler to Rust (almost a direct translation from Go to Rust) and making it stable. \n\nIn addition, Petar has completed work on typed nil values and improving the recursive closures of Go, which were not working with Gno code and needed additional pointers. He has also implemented Iota and hooked up the garbage collector. In the coming weeks, Petar will be working to smooth out bugs and implement type aliases, as well as implementing function analysis for the dependency graph. The dependency graph is necessary for compiling global types in the correct order, so, for example, when type A refers to type B, you need to compile type B first so that when type A refers to it, type B exists.\n\n### Go VM\n\nMarc is currently rewriting a parser and a scanner from scratch. His work is not as far along as Petar's, but he's getting closer, and the code generation works well. He is currently refactoring and building a single-pass compiler that can perform a **syntax-directed translation**, which means there are no intermediate data structures between the source code and the byte code. This is a much simpler design that should compile faster and be easier to maintain, but it requires a complete redesign. \n\nMarc believes his Go parser will be easier to maintain and understand than the one in Rust and benefit the user since the entire stack is written in Go. However, to assess the best implementation of the VMs, Marc has started a Go **test shoot project, which is a script** that will run many samples to verify that the compiler (in Go, Rust, or any other implementation) conforms to Go's specifications. Marc and Petar will open their repos soon, and the next edition of The More You Gno will highlight how the GnoVM works. \n\n## Gnoffee: Coffeescript for Go and Gno\n\nGnoffee (hackerspace [issue 22](https://github.com/gnolang/hackerspace/issues/22)) will be a powerful standalone tool to elevate the development process of Go and Gno by generating code and integrating new features, eliminating manual coding. We aim to create a custom variation of Golang that preserves similar readability, maintains compatibility, and enables being able to code in Gno very quickly when you know how to code in Go. How do we go about this? \n\nRegarding compatibility, one possibility is to propose all our changes to Golang and wait for approval before we start developing. However, this is likely to take some time. Another approach is to use a way to transpile TypeScript for JavaScript or Coffeescript for JavaScript, so it's another language passing through a program that creates standard valid Golang and will generate valid Gnolang. With this simple method, we can experiment with missing features like new native types, and new keywords, and when we have new features in mind, we can develop what we lack. \n\nFor instance, it does not make sense to have extra security for your exported variables when you write a library in Go. However, in Gno, it is very important to ensure that everything you expose cannot be modified by other contracts. This means finding a way to expose constants and other readable elements without risking their values being overwritten.\n\nBesides allowing us to carry out all types of experimentation more easily, Gnofee could eventually be a way for the Go team to measure the potential adoption of Gno. Gnofee is not a priority for the mainnet, but we're excited to work on this important initiative.\n\n## META Multinode Testnet\n\nThe discussions about single and multinode testnets have been ongoing, so we opened an issue to establish a multinode testnet focused on multi-validator experimentation, including stability, benchmarking, and lifecycle management. This multinode testnet aims to provide a platform for in-depth explorations and evaluations of multi-validator setups, while we maintain the single-node test3+.gno.land set up, primarily dedicated to showcasing the VM and providing examples. Visit hackerspace [issue 9](https://github.com/gnolang/hackerspace/issues/9) if you want to participate in this initiative or share your insights.\n\n## Banker Module Bug\n\nThe banker module bug is a known issue that needs to be fixed before the mainnet because, currently, it's still possible to mint new GNOT tokens from any contract. Several fixes have been suggested, and our goal is to merge [PR 875](https://github.com/gnolang/gno/pull/875) put forward by Onbloc to change the denomination of the coins minted by the banker. Merging this PR is currently blocked by 2 small failing checks, but we are close to resolving this issue.\n\n## Preserving Go Comments in Protobuf\n\nIn [issue 1157](https://github.com/gnolang/gno/issues/1157), Jeff from Berty raises the question about preserving Go comments in the Receiver field. Currently, Amino converts the code, but the proto message Receiver field doesn't have the comment. Manfred agrees that informative comments are helpful. However, he doesn't want to create a complex Protobuf configuration. We will continue to discuss this issue to look for solutions, but for now, Berty will parse the original Go source code and get the comments this way.\n\n## Multi-Sig and Security Features\n\nSeveral contributors, including Teritori, are working on built-in multi-sig support in Gno.land, where Gnokey supports a multi-sig setup. We also want to introduce additional ways to improve the UX and security of Gno.land (and web3 in general). An idea we currently have is to add a new layer in authentication, creating something similar to browser cookies that we can name sessions. The chain will have two tables, one with the public key for an account and one with a public key for sessions linked to an account. From your main account, you can create a session with self-destructing features, such as destructing after one hour without usage or after 24 hours. The goal would be to allow more complex and secure flows when starting your operations. We may not want this for multi-sig, but it comes under the same family of security and privacy features.\n\nFor example, imagine a wallet like Adena uses your key, a passphrase, or a ledger. It will sign a new public key that you just created in memory. Each time you close your browser, the memory is cleared. You can also have a logout button to call on the blockchain to delete all your sessions or simply wait for the session to be self-destructed, especially if the session was just in memory on your side. We will continue to develop this idea.\n\n## New Team Member\n\nWe're excited to welcome a new DevRel team member to Gno.land, Leon, who's been in blockchain development for two years and is passionate about engineering and teaching. Leon has taught languages, development, math, and music privately, as well as an OS fundamentals class at his previous faculty. Welcome on board!\n\n## Grantee and Ecosystem Updates\n\nAs Gno.land core continues to advance, so does our blossoming ecosystem, with new contributors and community members turning their eyes to Gno. The overriding theme of this last month has been collaboration, and we're pleased to see gnomes working together to overcome their obstacles and push their projects forward. Let's see what they've worked on over the last few weeks.\n\n### Onbloc\n\nOnbloc is powering ahead, contributing to Gno.land core, making upgrades and improvements to Adena and Gnoscan, and developing the Gnoswap DEX. Last month, Onbloc released the patched version 1.8.0 of Adena, which includes some UI and UX enhancements, such as more intuitive account management settings, a copy icon next to the names of the accounts, and some bug fixes. This release also comes with new injection methods to enable dApps to request users to add a custom gno.land network or switch to an existing one. Check out the [release note](https://github.com/onbloc/adena-wallet/releases/tag/v1.8.0) for more details.\n\nOnbloc has open-sourced the code for Gnoswap on this GitHub [repo here](https://github.com/gnoswap-labs/gnoswap). You can also find a guide to running unit tests. The team continues to improve the Gnoswap interface, focusing on the earn and staking pages, the graphs for positions, and some components for adding and removing liquidity and providing pool incentives. They're working on the next iteration of the interface, with the governance and airdrop pages, and developing the front-end logic to integrate with Gnoswap realms and APIs. Onbloc also contributed to Gno core, adding PRs for fixes to testing and the banker module. Keep up with Onbloc through their [hackerspace journey](https://github.com/gnolang/hackerspace/issues/29) and check out their latest initiative [Gnodesk](https://medium.com/onbloc/gnodesk-week-2-of-sept-2023-5edbc451bba7), which delivers weekly highlights and updates from Gno.land.\n\n### Teritori\n\nTeritori has been working on improvements since the last update and open-sourcing all their work, including the DAO deployer and the Moderation module. You can visit the Teritori DAO tooling repo to find the complete documentation and new realms to easily deploy your DAO. There is also a tutorial on creating your own DAO using the framework. \n\nThe team has made extensive progress on the Justice DAO deployer, a module that can be used for third-party arbitration when there is a problem with the escrow system in a decentralized freelance marketplace. The Justice DAO can resolve potential conflicts between the seller and the buyer and implements randomness to choose the judges to solve problems without conflicts of interest. The content flagging system, which highlights the content that users deem to be inappropriate, has been tweaked and improved. Keep up with Teritori's [hackerspace journey here](https://github.com/gnolang/hackerspace/issues/7).\n\n### Berty\n\nBerty has already completed the first phase of the project and published the [technical proposal](https://github.com/gnolang/gnomobile/issues/15) to develop the Gno mobile framework. The team is now busy with the second phase of implementing the proposal and the gRPC interface, which is working with the local socket on Android and iOS. Jeff has been trying to use Amino, and, now that Iuri is back from vacation, the team will work on improving other parts of the interface. Check out their latest [demo](https://www.loom.com/share/c0f68f707d3e47089c2fdbd2698fc92f), which shows an example user interface with wallet functions and blockchain communication. \n\nOnbloc has laid the foundations for Gno mobile apps with the Adena mobile wallet, so Berty will use some of this code in the mobile framework and work with Onbloc to ensure a similar user experience across all Gno apps.\n\n### Flippando\n\nDragos, the developer behind new grantee Flippando, is an experienced mobile app developer. Flippando is a simple on-chain memory game, which is currently written in Solidity and deployed on several testnets, including Goerli, Polygon, Near, Aurora, Evmos, and a Saga chainlet. Fippando started as a project for Dragos to learn Solidity but has already been the winner of two hackathons in Korea. It can be deployed relatively easily on any machine and is currently being ported to Gno.land. Dragos is exploring which user intersection can be more beneficial for this and will show us a demo in the coming weeks. Soon, we'll have two gaming dApps on Gno.land – Flippando and GnoChess! Read about Flippando in the [hackerspace journey](https://github.com/gnolang/hackerspace/issues/33).\n\n### New Contributor Joseph Kato \n\nWe have a new contributor to Gno.land who showed a demo last month of what he's been working on, a language server to run tests and scripts. Joseph is a major Go fan looking to get into web3 and was super excited to come across Gno. While interacting with Gno.land, he found many IDE-like features that he missed when working on files, so he decided to work with an LSP implementation—gnols—with the goal of making these features available to all contributors regardless of editor preference, starting with Sublime Text and Neovim and moving on to IntelliJ, Golang, and Emacs. This is a welcome addition for anyone who has ever developed a realm in Gno. Check out his [hackerspace](https://github.com/gnolang/hackerspace/issues/34) page for more details. \n\n## DappCon, Berlin\n\nManfred was back in Berlin in September at the Radial System presenting 'Gno.land: The Key To Perpetual Transparency,' where he discussed how Gno.land offers a familiar, seamless experience for code sharing and a sustainable and transparent path for blockchain development. \n\n## Web3 Family\n\nCore dev Miloš Živković gave a talk at Web3 Family in Barcelona last month, 'Gno.land and Gnolang: The Dynamic Duo of Blockchain Development.' He presented a brief history of smart contract development and the issues associated with existing platforms, such as limitations in design and security. He introduced Gno and showed how we make web3 accessible and blockchain development more intuitive and secure. Catch the [talk here](https://www.youtube.com/watch?v=0K-jr_Ad3bI).\n\n## GopherCon 2023\n\nGno.land was out in force at GopherCon 2023 with a well-stocked booth at the conference and an awesome workshop building a web3 chess server on Gno.land. Both Manfred and Jae were at the booth championing Gnolang to Gophers, and we received a lot of positive feedback, some new contributions, fresh PRs, and exposure for Gno.land in web2 circles. It was also a fabulous chance for the team to meet for valuable face-to-face time.\n\nThat's all for now! Be sure to check back again with us for the next edition of The More You Gno to keep up with all our progress.\nDo you want to contribute to Gno.land's monthly updates? If you're building on Gno.land and want to highlight your development, project, event, or idea, let us know, and we'll include your contribution.\n","2023-10-10T13:37:00Z","christina","gnoland,gnovm,tm2"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"ellr5nkYcJuKBIbZG0SQ3zuCq06PBz0E/oS5i4e5I0pIrFTkAyR5y9+DGtdgQenoJZYpAoTs8jzM9Koar2yfig=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["funding-program-23q3","Gno.land Funding and Grants Program - Progress So Far","\n\n# Quarterly Report: Q3 2023\n\nWe launched the [Gno.land Funding and Grants](https://github.com/gnolang/ecosystem-fund-grants) program in July 2023 to encourage talented and passionate developers to interact with Gno.land, help build core infrastructure and tooling, and enhance the usability of the platform. After establishing a review process to streamline the program and identify core areas that need the most work, we ran with our first cohort of grantees in Q3, awarding four grants from a total of seven submissions (to two teams and two individuals). Full details of grant submissions, scope, and funding can be found on GitHub, but here’s a summary of the program’s progress so far and what’s coming up in Q4.\n\n## Q3 Funding Breakdown\n\nThe total grants distribution for Q3 was **$563,595** over the four grants: Teritori, Berty, Zack Scholl, and Flippando. This work has been split over two main large-scale infrastructure products (the Gno Moderation DAO, and GnoMobile), a gaming application, and our first resident tinkerer (Zack), who is experimenting with Gno and developing Proof of Concepts using it. Each grant recipient was provided with milestones for deliverables and has kept track of their progress through regular syncs, hackerspace journeys, blog posts, and developer calls. \n\n### Teritori (delivered September 2023)\n\nTeritori blockchain and multi-chain hub allows IBC and non-IBC communities to connect, create groups, exchange tokens and NFTs, and launch new projects. The Teritori team has solid experience building social dApps, marketplaces, NFTs, collectibles, and interfaces to encourage community interaction. For the Gno.land Grants and Funding program, Teritori was tasked with building a Moderation DAO to enable effective and fair content moderation in a decentralized and permissionless environment. \n\nThe Moderation Module is a smart contract ‘realm’ that enables a DAO to manage the daily moderation of forums or social threads through blockchain decision-making, supporting the vision of a censorship-resistant platform that fosters a safe space for open debate and discussion. Find detailed updates on Teritori’s [hackerspace issue 7](https://github.com/gnolang/hackerspace/issues/7), and watch out for upcoming blogs on Gno.land.\n\n### Berty Technologies (delivery Dec 2023)\n\nBerty private messaging app was allocated a grant to build a mobile version of Gno.land, implementing the WESH protocol (available by Bluetooth, local WIFI, or other means), and providing secure censorship-resistant communication between devices. Berty’s experience in off-grid communication is invaluable to Gno.land, and the team is an expert at running Go on mobile Android and iOS operating systems. For this grant, to be completed in Q4, Berty will deliver a minimal PoC of the existing apps of Gno.land running on mobile, and deliver an open-source mobile app with basic CI/CD, interacting with the Gno.land testnet. Find detailed reports and updates on Berty’s [hackerspace issue 28](https://github.com/gnolang/hackerspace/issues/28) or within their [Gnomobile blog post](https://test3.gno.land/r/gnoland/blog:p/gnomobile).\n\n### Flippando (delivery Nov 2023)\n\nFlippando is a multi-level on-chain memory game currently written in Solidity and deployed on several testnets, including Goerli, Polygon, Near, Aurora, Evmos, and a Saga chainlet. Like the classic card-based Memory game, Flippando players must match card pairs (digital tiles). When a player selects a tile, the game sends a request to the chain, which sends back the uncovered tile. If two tiles match, they remain uncovered. If they don’t match, they are flipped back until the game is won, and an NFT is generated for the winning player to prove the win. Through the development of a simple gaming app on Gno.land, we want to show how easy it is for gaming and metaverse concepts to be built. Through this grant, Flippando will port its memory game to Gno. Find detailed updates on Flippando’s [hackerspace issue 33](https://github.com/gnolang/hackerspace/issues/33).\n\n### Resident Tinkerers Program: Zack Scholl (6 months)\n\nZack Scholl is Gno.land’s first resident tinkerer with tons of experience in web2 development and a passion for the Go language. Through the grants program, Zack aims to translate his extensive knowledge to Gno and web3 by developing PoCs using Gno. So far, Zack has worked on a microblogging app for Gno.land and a prototype for using generative audio with smart contracts. He’s also creating documentation and tutorials to help other developers follow his lead. You’ll be hearing more from Zack over the coming weeks. Follow his [hackerspace issue 2](https://github.com/gnolang/hackerspace/issues/2) journey for more details.\n\nAfter a great start to the Funding and Grants Program in Q3, below is a breakdown of the percentage of funding allocated to each area of development so far:\n \n[![Funding](https://gnolang.github.io/blog/2023-10-17_funding-program-q3/src/thumbs/funding.png)](https://gnolang.github.io/blog/2023-10-17_funding-program-q3/src/funding.png)\n\n## Coming Up in Q4 and Q1 2024\n\nWe’re looking forward to more exciting developments in the coming quarters as we focus on the road to mainnet. Onbloc, one of Gno.land’s most active contributors, is currently being confirmed as a [Q4 grantee](https://github.com/gnolang/ecosystem-fund-grants/pull/4/files#diff-6dbd2e305897910e59072f9efa8c537d86f8aa281eb3742e0c150048a1df95eb) to work on core infrastructure necessary for mainnet, including tm2-js and gno-js support, GnoVM debugging, contract interactions, and leading the multi-node testnet initiative. Onbloc has already developed essential public infrastructure tools for Gno.land, including the non-custodial Adena wallet, the Gnoscan blockchain explorer, and Gnoswap decentralized exchange. The team has demonstrated immense passion and dedication in attending public developer calls and in-person events, and releasing extensive documentation, blog series, and [hackerspace issue 29](https://github.com/gnolang/hackerspace/issues/29) about their journey. \n\nOver the next two quarters, the Grants program will focus on building our tinkerer and student cohorts, and publishing more content, such as application libraries, documentation, and Gno packages. The goal is twofold: to support more users and ensure a diversified set of users on the Gno.land platform testing, debugging, troubleshooting, and running user feedback loops. We currently have two apps to reference on how to get started – GnoChess, built by the Gno core team, and Flippando, a grant recipient – we’re looking for a lot more to come. \n\nWe’re steadily building out the Gno.land platform, and our ecosystem of grantees and contributors. Let us know if you want to join us by submitting an application any time on the Funding and Grants [repository](https://github.com/gnolang/ecosystem-fund-grants). We’re opening up our second grant batch this month, and look forward to reviewing your submissions. \n","2023-10-17T13:37:00Z","christina,michelle","gnoland,funding,grants"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"UO9+1FSYbYORGolD52L6PcX9HAD9idxUUHKadnOAXTp0rsxLotMSuloJeErSO39KGkDunSQvnBHx7TNzuIS9xg=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["gnoland-moderation-dao-module","Gno.land Moderation DAO Module","\r\n# Gno.land Moderation DAO Module\r\n*This blog post is written by the Teritori team, whose focus is to allow organizations to communicate and interact in a resilient and transparent way. Teritori is a partner and grantee of Gno.land.*\r\n\r\nWhen it comes to the complex subject of discussion forums and decentralized social networks, numerous technical and philosophical questions arise.\r\nImagining a 24/7 online communication system whose administration cannot be compromised or censored by any entity or individual is one of the most intriguing challenges of the decade.\r\nApproximately 10 months ago, the Teritori core team decided to explore the new possibilities offered by Gno.land on the theme of decentralized moderation and to build the foundation for future generations of developers to create resilient, robust, and autonomous applications.\r\n\r\n## The vision\r\n\r\n### About Teritori\r\n\r\nTeritori is a decentralized Operating System for individuals \u0026 communities that allows organizations to communicate and interact in a resilient and transparent way. Its core components include the creation of a decentralized User Profile for individuals \u0026 organizations as well as a dApp Store allowing users to pick their favorite services for daily usage and developers to list their product in order to grow their user base. Finally, Teritori backbone, its P2P messenger application that will enable users to create resilient token-gated groups in a click will even allow non-crypto-native users to get onboard as this feature doesn't even require a wallet connection to get started.\r\n\r\n### Teritori \u003c\u003e Gno.land\r\n\r\nConvinced of the benefits of offering a contribution-based consensus model and taking advantage of an interpreted version of Golang, the Teritori core team aims to become one of the most prolific contributors to Gno.land. Our plan is to focus on features that enable the coordination of organizations and individuals via governance, communications, and collaboration. Eventually, all the features listed on Teritori will be accessible in the Gno.land network, contributing to the growth of the ecosystem.\r\n\r\n### PoC and iterations\r\n\r\nAnother important point to emphasize is that the Teritori core team intends to improve the features it deploys on Gno.land by taking advantage of the user test phases to collect feedback that will enable iteration and improvement of the service. As a result, the “Proof-of-Concept” (“PoC”) presented in this article will be subject to updates and evolutions, which will be communicated in due course, as will the associated test phases.\r\n\r\n## What is the Gno Moderation Module?\r\n\r\nThe Gno Moderation Module is a smart contract (“realm”) that enables a decentralized, autonomous organization (DAO) to manage the moderation of a forum or social thread through a transparent on-chain vote.\r\n\r\n### Let’s take an example:\r\n\r\nImagine a simple social network similar to Instagram, in which all content is decentralized (using IPFS for images, videos, music etc.). For each post, users sign in via their wallet to post content, and no centralized administrator can delete this content. The freedom offered by this type of decentralized application is immense since even as developers of the application, it is impossible to delete the content. Therefore, we can consider this “space of freedom” as a “common space” unlike any application owned by a private company and hosted on centralized infrastructure.\r\nWith this radical freedom for the user comes a great responsibility— to collectively ensure the security of this space rather than delegating the responsibility to moderators employed by a commercial enterprise. This is why we’ve created the “Gno Moderation Module.”\r\n\r\n### How does it work?\r\n\r\n[![moderation_flow v0.1](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/thumbs/moderation_flow_v0.1.png)](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/moderation_flow_v0.1.png)\r\n\r\nThe Gno Moderation Module allows users to notify the moderation DAO community that they wish to report content. Through this action (permitted by the smart contract), they inform the DAO community that the content is inappropriate.\r\n\r\n[![content flag](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/thumbs/content_flag.png)](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/content_flag.png)\r\n\r\nOnce the content has been reported a certain number of times (10 times in this PoC) by users (who may or may not be members of the Moderation DAO), an on-chain proposal is automatically created.\r\n\r\n[![moderation dao feed](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/thumbs/moderation_dao_feed.png)](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/moderation_dao_feed.png)\r\n\r\nThis on-chain proposal is then listed in the Moderation DAO tab on the Social Feed as well as on the Moderation DAO profile proposals feed so all Moderation DAO members can vote on it. A debate can take place to discuss the best choice for the content.\r\n\r\n[![moderation dao vote](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/thumbs/moderation_dao_vote.png)](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/moderation_dao_vote.png)\r\n\r\nModeration DAO members have three voting options:\r\n- Ban the content in question\r\n- Abstain\r\n- Do not ban the content in question\r\n\r\nOnce the required vote quota has been reached, the contract automatically executes the voted decision.\r\n\r\n## The Current Status:\r\n\r\nThe Teritori core team received a grant from the Gno.land core team to build the necessary tools for decentralized moderation.\r\n\r\nTo accomplish this task, we divided our work into five main stages:\r\n1. Build “DAO” standards to establish the fundamental building blocks and ensure a modular approach in the long term for various tools.\r\n2. Build a “DAO” deployer that allows non-tech users to easily utilize the different standards.\r\n3. Build a customizable Moderation Module that can cater to a wide range of use cases. For example, if we replace the social feed with a service marketplace, the Moderation Module can transform into a “Justice Module” that resolves conflicts between sellers and buyers on a decentralized platform and serves as an escrow system.\r\n4. Develop the user experience that allows for large-scale experimentation with the Moderation Module within a dedicated context of an active social feed. Here, we created a social feed realm and enabled non-developer Gno.land users to participate in the full-scale experience.\r\n5. Establish interactions between smart contracts (r/boards, r/socialfeed, /r/users), conduct experiments to enhance their security, and identify emerging needs for these innovative use cases.\r\n\r\n### What does a DAO realm look like?\r\n\r\n- We decided to build two different DAO standards, using two different approaches of modularity:\r\n- Aragon DAO Standard, based on the amazing work of [the Aragon team](https://aragon.org/) (using Solidity)\r\n- [DAODAO](https://github.com/DA0-DA0) smart contract, using CosmWasm, that allows more modularity.\r\n\r\n\r\nHere is an example, with the DAODAO contract ported into Gnolang:\r\n[Source](https://testnet.gno.teritori.com/r/demo/dao_realm_v6/dao_realm.gno)\r\n\r\n```go\r\npackage dao_realm\r\n\r\nimport (\r\n\t\"encoding/base64\"\r\n\t\"std\"\r\n\t\"strings\"\r\n\t\"time\"\r\n\r\n\tdao_core \"gno.land/p/demo/daodao/core_v16\"\r\n\tdao_interfaces \"gno.land/p/demo/daodao/interfaces_v16\"\r\n\tproposal_single \"gno.land/p/demo/daodao/proposal_single_v16\"\r\n\tvoting_group \"gno.land/p/demo/daodao/voting_group_v17\"\r\n\t\"gno.land/p/demo/ujson_v5\"\r\n\t\"gno.land/r/demo/groups_v22\"\r\n\tmodboards \"gno.land/r/demo/modboards_v9\"\r\n)\r\n\r\nvar (\r\n\tdaoCore dao_interfaces.IDAOCore\r\n\tmainBoardName = \"dao_realm\"\r\n\tgroupName = mainBoardName + \"_voting_group\"\r\n\tgroupID groups.GroupID\r\n)\r\n\r\nfunc init() {\r\n\tmodboards.CreateBoard(mainBoardName)\r\n\r\n\tvotingModuleFactory := func(core dao_interfaces.IDAOCore) dao_interfaces.IVotingModule {\r\n\t\tgroupID = groups.CreateGroup(groupName)\r\n\t\tgroups.AddMember(groupID, \"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c\", 1, \"\")\r\n\t\tgroups.AddMember(groupID, \"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv\", 1, \"\")\r\n\t\tgroups.AddMember(groupID, \"g14u5eaheavy0ux4dmpykg2gvxpvqvexm9cyg58a\", 1, \"\")\r\n\t\tgroups.AddMember(groupID, \"g1ckn395mpttp0vupgtratyufdaakgh8jgkmr3ym\", 1, \"\")\r\n\t\tgroups.AddMember(groupID, std.GetOrigCaller().String(), 1, \"\")\r\n\t\treturn voting_group.NewVotingGroup(groupID)\r\n\t}\r\n\r\n\tproposalModulesFactories := []dao_interfaces.ProposalModuleFactory{\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.IProposalModule {\r\n\t\t\ttt := proposal_single.Percent(100) // 1%\r\n\t\t\ttq := proposal_single.Percent(100) // 1%\r\n\t\t\treturn proposal_single.NewDAOProposalSingle(core, \u0026proposal_single.DAOProposalSingleOpts{\r\n\t\t\t\tMaxVotingPeriod: time.Hour * 24 * 42,\r\n\t\t\t\tThreshold: proposal_single.Threshold{ThresholdQuorum: \u0026proposal_single.ThresholdQuorum{\r\n\t\t\t\t\tThreshold: proposal_single.PercentageThreshold{Percent: \u0026tt},\r\n\t\t\t\t\tQuorum: proposal_single.PercentageThreshold{Percent: \u0026tq},\r\n\t\t\t\t}},\r\n\t\t\t})\r\n\t\t},\r\n\t}\r\n\r\n\tmessageHandlersFactories := []dao_interfaces.MessageHandlerFactory{\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\treturn groups.NewAddMemberHandler()\r\n\t\t},\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\treturn groups.NewDeleteMemberHandler()\r\n\t\t},\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\t// TODO: add a router to support multiple proposal modules\r\n\t\t\tpropMod := core.ProposalModules()[0]\r\n\t\t\treturn proposal_single.NewUpdateSettingsHandler(propMod.Module.(*proposal_single.DAOProposalSingle))\r\n\t\t},\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\treturn modboards.NewCreateBoardHandler()\r\n\t\t},\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\treturn modboards.NewDeletePostHandler()\r\n\t\t},\r\n\t}\r\n\r\n\tdaoCore = dao_core.NewDAOCore(votingModuleFactory, proposalModulesFactories, messageHandlersFactories)\r\n}\r\n\r\nfunc Render(path string) string {\r\n\treturn \"[[board](/r/demo/modboards:\" + mainBoardName + \")]\\n\\n\" + daoCore.Render(path)\r\n}\r\n\r\nfunc VoteJSON(moduleIndex int, proposalID int, voteJSON string) {\r\n\tmodule := dao_core.GetProposalModule(daoCore, moduleIndex)\r\n\tif !module.Enabled {\r\n\t\tpanic(\"proposal module is not enabled\")\r\n\t}\r\n\tmodule.Module.VoteJSON(proposalID, voteJSON)\r\n}\r\n\r\nfunc Execute(moduleIndex int, proposalID int) {\r\n\tmodule := dao_core.GetProposalModule(daoCore, moduleIndex)\r\n\tif !module.Enabled {\r\n\t\tpanic(\"proposal module is not enabled\")\r\n\t}\r\n\tmodule.Module.Execute(proposalID)\r\n}\r\n\r\nfunc ProposeJSON(moduleIndex int, proposalJSON string) {\r\n\tmodule := dao_core.GetProposalModule(daoCore, moduleIndex)\r\n\tif !module.Enabled {\r\n\t\tpanic(\"proposal module is not enabled\")\r\n\t}\r\n\tmodule.Module.ProposeJSON(proposalJSON)\r\n}\r\n\r\nfunc getProposalsJSON(moduleIndex int, limit int, startAfter string, reverse bool) string {\r\n\tmodule := dao_core.GetProposalModule(daoCore, moduleIndex)\r\n\treturn module.Module.ProposalsJSON(limit, startAfter, reverse)\r\n}\r\n```\r\n\r\n### Public Grant Report:\r\n\r\nYou can find the full report of [Teritori Core’s journey here](https://github.com/gnolang/hackerspace/issues/7). \r\n\r\n### Resources:\r\n\r\nDocumentation:\r\n- [Gno Moderation DAO](https://github.com/TERITORI/gno/blob/teritori-unified/examples/gno.land/r/demo/teritori/MODERATION_DAO.md)\r\n\r\nPackages:\r\n- [https://testnet.gno.teritori.com/r/demo/groups_v22](https://testnet.gno.teritori.com/r/demo/groups_v22)\r\n- [https://testnet.gno.teritori.com/p/demo/daodao/interfaces_v16](https://testnet.gno.teritori.com/p/demo/daodao/interfaces_v16)\r\n\r\nTutorial:\r\n- [Gno.land Social Feed Moderation on Teritori](https://teritori.gitbook.io/teritori-whitepaper/gno.land/introducing-gno.land-social-feed-v0.1#social-feed-moderation)\r\n","2023-10-19T01:50:00Z","ferrymangmi,zxxma,michelleellen","gnoland,dao,moderation,teritori"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["wyg-dongwon-shin","Who You Gno – On the Record with Dongwon Shin","\n*Who You Gno is intended to shine a light on the builders, contributors, and generally brilliant humans behind the tech. We’re excited to kick off this series with Dongwon Shin, the co-founder and CEO of one of Gno.land’s longest-contributing teams, Onbloc, a South Korean-based blockchain software company that builds key infrastructure and tooling for Gno.land*\n\nSince embarking on their Gno journey in late 2021, Dongwon and his team have been among the most active gnomes embodying the values of the Gno project: hardworking, passionate, honest, and humble, to name a few. You may already be familiar with Onbloc’s projects [Adena](https://adena.app/), [Gnoscan](https://gnoscan.io/), and [Gnoswap](https://github.com/gnoswap-labs) more about this can be found in [Onbloc's Hackerspace journey](https://github.com/gnolang/hackerspace/issues/29). In this interview, we’ll get the latest updates on these projects, hear about Dongwon the person, and learn more about what motivates him to be a gnome. Check it out.\n\n## Dongwon’s life before coding\nIt’s a cold November morning in Seoul, and Dongwon is in the office early after sleeping just a few hours. Speaking to him from Dubai, where “cool” is 30 ℃, it’s -1 ℃ in Korea. “I hope you’re keeping warm,” I smile, “Yeah,\" he laughs, “it’s not too bad.” Dongwon’s been in the industry since 2015 when web3 was still called “crypto,” ICOs were selling snake oil, and his compatriots were busy paying above the market price for bitcoin in a phenomenon called the “Kimchi premium.”\n\nAt the time, he was traveling the world as a professional e-sports gamer which saw him leaving Korea and living in San Francisco and L.A. for several years. “I had lots of tournaments to compete in, so I had to travel to many other countries,” he says, “while traveling, I learned about other cultures and people, and new experiences. It was really eye-opening, you know, it really helped make me who I am today.”\n\nAnd who is Dongwon today? \n\nAmbitious, driven, and one of the kindest, most genuine people you could ever meet. “I like challenges, and I’m very competitive,” he says. “I can't just do regular jobs. I get bored quickly, so I need to find something very competitive and hard that makes me stressed.” I point out that he’s in the right place, and he laughs. He explains that he used to spend an entire week, sometimes two, learning a game before a tournament, almost around the clock. “I had to put everything I have into winning that game, right?” He views working in web3 the same way.\n\n## The intersection between e-gaming and blockchain\nDongwong is clearly comfortable on the cutting edge in emerging industries that “are often looked down on,” like e-gaming and crypto. He takes great satisfaction in how they’ve both grown. “My parents were saying, 'Just go study,' while I was playing games, but e-sports has grown a lot. Right now, the industry is really big, and it's kind of the same with crypto.” He adds, “I like getting in early when other people are not interested and finding an opportunity there.”\n\nWhen looking to retire as a professional gamer, he found his home right away in web3, working with a blockchain consultant and the sports and entertainment-focused [Chiliz project](https://www.chiliz.com/), before launching his own blockchain consulting and development firm. “I didn't think I was going to be just a regular employee for a big company. So I wanted to start my own business,” he says.\n\n## Getting to Gno… Gno.land\nHow did Dongwon hear about Gno.land? \n\n“My co-founder, Peter, and I were long-time followers of the Cosmos ecosystem, and we found out that Jae was working on a new project called Gno.land in late 2021. We really liked the vision behind Gno.land, why he started, and what he wants to achieve. We value transparency, fairness, and censorship resistance, so we read all the documentation and his initial codebase and decided we should be part of his new initiative. We started Onbloc in early 2022.”\n\nDongwon didn’t know Jae personally, but he felt strongly aligned with his vision and what Gno.land aims to achieve. Also, his reputation as the founder of Tendermint and Cosmos preceded him. Dongwon’s co-founder, Peter, was also working on a project called Lunagram, a Cosmos wallet integrated with Telegram. Peter had fond memories of Jae, being very supportive of experimental projects, including his own, in the early days of Cosmos.\n\n## Building tools… Adena, Gnoscan, Gnoswap\nOnbloc has since become Gno.land’s most prolific contributor, launching the [Gnoscan](https://gnoscan.io/) block explorer and the [Adena](https://adena.app/) wallet, as well as creating tutorials and blogs to help onboard developers to Gno, and creating Gno.land’s first AMM DEX Gnoswap, the beta version of which is estimated for December this year. “Currently, the team is focused on developing Gnoswap, integrating [the realms and APIs](https://github.com/gnoswap-labs/gnoswap) with [the interface](https://github.com/gnoswap-labs/gnoswap-interface), enhancing the swap function and liquidity pools, and some additional features. We expect to launch the beta in about a month, so we’re quite excited!”\n\nAs for Adena, the defacto Gno.land wallet, “It's already production-ready, but we want to improve our UX, and UI to provide more secure ways of using a web3 wallet.” To achieve this, Onbloc is adding a feature called [Air-Gap](https://en.wikipedia.org/wiki/Air_gap_(networking)) which allows the wallet to be used in an offline environment, without the user needing to import their keys to Adena. “They can just use Adena as a broadcaster,” Dongwon explains. “I think this kind of feature is needed for enhancing security and educating people to use noncustodial products in a secure way.”\n\nOnbloc is also a [Q4 2023 grantee](https://test3.gno.land/r/gnoland/blog:p/funding-program-23q3) and will develop core Gno.land infrastructure in preparation for mainnet. “We are working on three key features,” Dongwon explains. “The first is contract interaction. So it's a way for a realm to interact with other realms. The second is porting essential Go packages to Gno, and the third is a multi-node testnet.” All in addition to Onbloc’s continued efforts on Gnoswap, Gnoscan, and Adena. “You’re keeping busy, then?” I ask. “All our hands are full now,” he laughs.\nI ask what he does in his free time and – in fact – whether he has any. “Not much,” he jokes, “but I like spending time with my son and playing board games together. He’s seven years old, and we are like friends.” Dongwon also likes to unwind by reading books when his son is asleep. One of his favorites is [*The Secret*](https://en.wikipedia.org/wiki/The_Secret_(Byrne_book)); he was “really inspired by the concept” when he was younger. I ask if he sees it working in his daily life and whether he believes he manifests what he wants into existence, “Definitely,” he replies without hesitation.\n\n## Dongwon’s conviction in Gno.land\nNot only is Dongwon working night and day, but he has bootstrapped his team from his own pocket to go all in on Gno.land. What makes his conviction so strong? “I truly believe that the Gno.land blockchain is the next generation of the blockchain industry. Gno.land is trying to invite web2 developers into web3 and providing all these developer-friendly tools so they don't need to learn a new language to get into the ecosystem. GnoVM, Tendermint2, everything is so transparent and simple.”\nHe believes Gno.land will be “one of the greatest experiments in the crypto industry” thanks to its fair rewards and contribution-based governance. “I'm really excited about this initiative, and all our team members are well-aligned to support this vision. We want to do our part to achieve the success of Gno.land.”\n\nI thank him for his time and ask if there’s anything he would like to add. He pauses for a moment and then says, “If you're building a dApp or looking for a new opportunity in a new ecosystem, I think this is your chance. I hope to see great developers and teams getting into Gno.land. Let’s make this ecosystem great together.”\n","2023-11-24T00:00:00Z","christina","whoyougno,onbloc,community,interview"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-6","The More You Gno: Gno.land Monthly Updates - 6","\n\nWelcome to the latest edition of The More You Gno, your regular source of updates from the Gno.land core team and contributor ecosystem. There’s a lot to cover this month, from a company engineering retreat to new core members and contributors. We’ve made progress across the board to fix important bugs and issues and provide additional features. There’s a new way to dynamically call realms, Gno.land’s tokenomics and governance are advancing, our standard library list is expanding, and our grantees are killing it with their deliverables. Without further ado, let’s dive in.\n\n## Gno Core Team Updates - TL;DR\n\nOnly got time to skim the updates? You’ll find the highlights in the list below. If you want to dive deeper into the topics, track our progress, understand the rationale behind our decisions, or explore the issues we came across, grab a coffee, kick back, and savor the full details.\n\n* **The Portal Loop** – Much of our focus over the past few months has been on the Portal Loop [(issue 1108)](https://github.com/gnolang/gno/issues/1108), which will make developing on Gno smoother, faster, and more intuitive. The Portal Loop will speed up deploying dApps and improve the UX for Gno.land devs.\n\n* **Dynamic Realm Caller** – We’ve added a new way to call realms dynamically so that dApps no longer have to manually import GRC20/721 tokens [(PR 1262)](https://github.com/gnolang/gno/pull/1262).\n\n* **DAO Structure \u0026 Tokenomics** – We’re close to finalizing the DAO structure of Gno.land and its tokenomics. There will be three main DAOs, GovDAO, EvaluationDAO, and SupportDAO. We’re exploring staking options for GNOT holders and working on transaction fees and gas.\n\n* **Gno Playground** – Gno Playground is an awesome way for developers to collaborate, share, and test their code. The full version isn’t ready yet, but we’re sharing the beta with anyone who wants to help us iterate and improve this week.\n\n* **Gno Standard Libraries** – In [issue 1267](https://github.com/gnolang/gno/issues/1267), you can find our current wishlist for Gno standard libraries. If you want to see what we have and what’s lacking, or you want to contribute, open an issue or a PR.\n\n* **Gno Language Server (Gnols)** – An implementation of the [Language Server Protocol (LSP)](https://microsoft.github.io/language-server-protocol/) for Gno, Gnols makes writing code simpler and works with several editors. Visit the [CONTRIBUTING.md file](https://github.com/gnolang/gno/blob/master/CONTRIBUTING.md#vim-support-with-lsp) to try it out.\n\n* **RustVM Implementation** – The RustVM implementation is almost ready and is in the debugging stages. We’re also looking at adding a Jit compiler and researching the topics of determinism and concurrency.\n\n* **Bytecode Go VM Implementation** – The Parscan project is progressing well toward completion of the spec. We look to provide support for interfaces in the interpreter by extending the standard reflect package, also to the benefit of the entire Go community.\n\n### Engineering Retreat\nGno core engineering team got together last month in our first company-wide retreat. It was an invaluable opportunity to work face-to-face, brainstorm ideas, code together, and fix several high-level concerns. We made many improvements to the technical aspects of the project, including major advances on the Portal Loop, and strengthened our alignment through team bonding activities, socializing, and having fun. \n\nWe made multiple bug fixes and resolved many of the issues that arose out of [GnoChess](https://github.com/gnolang/gnochess) development, and Manfred and the Onbloc team (who joined us on the retreat) demonstrated a new way to dynamically call contracts using dependency injection with a registry. This, combined with Golang's interface capabilities, can achieve a good balance between dynamism, explicitness, and security (including type safety). This pattern could enable massive DeFi applications when used with GRC interfaces. It could also support contract-based DAOs where features can be added later, opening the door to new design patterns around contract upgrades. Check out [PR 1262](https://github.com/gnolang/gno/pull/1262) for more details. \n\nIt was invaluable for everyone to get plenty of 1:1 time with Jae. Morgan was able to bring the Native Bindings topic ([PR 859](https://github.com/gnolang/gno/pull/859)) much closer to completion. This has been a recurring theme in our developer calls for the last few months as it’s a complex topic that aims to change how Gno can use Go code while still being understood by static analysis tools like gno doc. Michael got greater clarity over the DAO structure and GNOT tokenomics, Milos was able to merge [PR 546](https://github.com/gnolang/gno/pull/546), after many months of effort, which adds file-based transaction indexing, and Thomas created instructions for getting started with the Gno Language Server (gnols), to give just some examples. It was productive and enjoyable and unblocked many issues. \n\nAiB engineers were also at the retreat, Zooma from Teritori, and Dongwon, ByeongJun, and Ray from Onbloc, creating plenty of opportunities for interesting discussions and showcasing our work. We also welcomed new core members Dylan and Danny to the team. Dylan is a senior software engineer, and Danny is supporting DevEx. We enjoyed meeting and hacking together with like-minded people and would like to do it more often with a broader audience. How about a Gnome contributor festival next year? Stay tuned.\n\n### Gno.land DAOs and Tokenomics\nThroughout the retreat and ongoing, we’ve made major advances to the DAO structure for Gno.land and the tokenomics of the chain. We’re still hammering out the final details, but we’ve decided on three main DAOs – GovDAO, EvaluationDAO, and SupportDAO – that will work together alongside other domain-specific DAOs, such as EngineeringDAO or ProjectsDAO, making Gno.land more decentralized over time. \n\nThe multi-tiered GovDAO will be responsible for voting on all decisions that affect the chain, such as parameter changes or validator acceptance/denial. GovDAO members will assess new contributors to the chain and allocate them a score and corresponding membership tier. EvaluationDAO will assist with specific contributions, lending its expertise and critic reviews as needed. SupportDAO will provide knowledge-specific services such as HR, marketing, and finance.\n\nRegarding transaction fees, we're exploring something similar to how Ethereum deals with gas in its EIP 1559 update. Essentially, a combination of comparing a new block’s size with the last block to gauge demand and some small parameters we’re looking at. We’re also experimenting with staking alternatives where contributors can stake their tokens to support certain projects in return for staking rewards. It’s still early days, so watch this space. We’ll be releasing more details soon. \n\n### Gno Playground\nGno Playground is a simple web interface that lets you share your code, run unit tests, deploy your realm and package, and execute functions in your code using the repo for a smoother and more collaborative developer experience. We’re excited to release Gno Playground out in the wild later this month in a soft launch set for November 28. If you’re interested in testing it out, head over to our Discord channel. We’re looking for feedback and help to identify bugs and improve the UX before its full launch in the new year. It will be interesting to see how people interact with the Playground and how they use it so we can iterate and attract more gnomes to our growing community.\n\n### The Portal Loop\nThe Portal Loop is an effort to create a continuously-deployed staging testnet to be hosted on the official [gno.land website](https://gno.land). The testnet will be reset at each commit on our repository, but it will re-play all the transactions from its previous version, dropping any that might fail following breaking changes in the code. The Portal Loop will provide a central place where you can experiment with the latest Gno.land updates, resolving the problem our existing testnets have faced (becoming stale only a few months after their launch) while also paving the way for building DAOs and on-chain Game of Realms and Proof-of-Contribution systems. \n\nWithin the Portal Loop efforts, we’re also building systems to more efficiently iterate locally on your Gno realms, similar to the previously described testnet. The Portal Loop will help to create an iterative cycle focused on development, testing, and feedback, enhancing local development and the Gno.land website. As developers are discovering, when building dApps like GnoChess, GnoMobile, or Flippando, they run into issues with the repo, GnoVM, and client libraries when developing locally.\n\nThe Portal Loop will enable much quicker feedback so we can iterate, uncover, and fix problems faster. Devs will get a greatly improved UI, with UX contributions and issues much easier to resolve, and the same CI/CD experience as web2 applications, where each time something is published on Git, they get instant feedback on how it works in staging, not only in terms of code but also in terms of data. Stay tuned, the Portal Loop is coming soon!\n\n### Standard Library Wish List\nThe standard library wish list in [issue 1267](https://github.com/gnolang/gno/issues/1267) is intended to be a starting place for anyone who wants to add new standard libraries to Gno. It's an opinionated collection of libraries that we would like to see added. So, if you see something missing that you’d like added to our standard libraries, leave a comment explaining your reasoning. If you want to port over a standard library from the list, make an issue for it and assign yourself, or if you can do it quickly, make a PR referencing the issue. You can see the global status of our standard libraries (as compared to Go) on our [Go\u003c\u003eGno compatibility document](https://github.com/gnolang/gno/blob/d421b963aed7f7c3ba3718edfc6fbd787fa8f0dd/docs/reference/go-gno-compatibility.md).\n\n### Dreaming with SOGNO\nThe Sogno project is a [dream](https://www.wordreference.com/iten/Sogno) Morgan has about improvements he plans to make on GnoVM. From his experience working on GnoChess, he found that many features were lacking that would have improved the workflow, for example, an improved debugging system, enhanced representation of the values within the VM, having maps as sortable data structures, and adding reflection. Morgan plans to work on this project on the side as a fork when he has time, so Sogno won’t be merged into the master branch for now. If you want to check it out and see if you can contribute, visit the [hackerspace PR 44](https://github.com/gnolang/hackerspace/pull/44).\n\n### The Future of the Gno Language Server (Gnols)\nThe [Gno Language Server (gnols)](https://github.com/gno-playground/gnols) is an implementation of the [Language Server Protocol (LSP)](https://microsoft.github.io/language-server-protocol/) for the Gno programming language. It is similar to the equivalent “gopls” project for Go, as they can be plugged into your code editor through extensions and allow you to access handy features, such as autocompletion, formatting, and compile-time warnings/errors. Gnols makes writing code simpler, working with several editors to suit your preferences. To try it out, visit the [CONTRIBUTING.md file](https://github.com/gnolang/gno/blob/master/CONTRIBUTING.md#vim-support-with-lsp), which contains instructions to get you started. Our current documentation targets Vim, Neovim, and SublimeText, but can likely be used with any editor that supports LSP. Feel free to contribute to improving Gnols and adding more features. It’s well-written, and simple to dive into the code and add more capabilities.\n\n### RustVM Implementation\nPetar continues progressing on the RustVM implementation and has almost finished, apart from a few bug fixes. As the design is now complete, he will enter the testing stages. He is also looking at how to add a Jit compiler to the current design. Petar was initially concerned that the garbage collector might have presented serious issues, but this has turned out not to present a problem. Adding a Jit compiler will require a lot of work (at least six months) to support everything in the language, but it should be possible.\n\nPetar is also looking at implementing concurrency the way it is in Go to have a fully functional virtual machine as it is in the spec. This would likely attract more external contributors to developing the VM. One advantage of Rust is that, with the concurrency model, there is already an extensive library called [Tokio](https://tokio.rs/) which he can use. Petar stresses that this isn’t easy, but he believes it’s achievable, at least as a research topic around determinism and concurrency.\n\n### Go Bytecode VM Implementation\nMarc continues to develop Parscan, another bytecode VM, but entirely based on the Go runtime, with the advantage of reusing the type-checking system, concurrency model, and memory management already part of the existing Go runtime. In the last month, the support for all missing declaration statements (constants, variables, and types) was added in the code generator.\n\n## Grantee and Ecosystem Updates\nOur ecosystem partners and grantees are working flat out on their contributions. We’re close to seeing the on-chain memory game Flippando launch, Adena and Gnoswap are incorporating some major new features, Zack’s released another informative tutorial as part of the Go to Gno series, and we’ve received several new grant proposals as well. We’ve even welcomed a new contributing team, Varmeta, to the fold. Scroll through the details below.\nTL;DR?\n* On-chain memory game Flippando is coming soon\n* Gnomobile is almost complete and will be receiving a rebrand soon\n* Gnosocial will allow devs to experiment with social media dApps\n* Experiment with content moderation using the ModerationDAO or create your own DAO\n* Gnoswap AMM DEX beta will launch in December\n* Adena to implement new ‘Air-Gap’ feature\n* Varmeta is working on Gno.land Unity SDK to make Gno more accessible to game developers\n\n### Dragos\nDragos has been working on porting his on-chain memory game Flippando from Solidity to Gno, and we’re looking forward to playing it soon after seeing an awesome demo earlier this month. When you play Flippando, you uncover a matrix of matching visual symbols. There are 2 levels of difficulty (matrix made of 16 tiles or 64 tiles). For the launch, Dragos aims to have visual symbols containing basic colors, dice, hexagrams, or various gradients. Once you’ve matched all the pairs and completed a matrix, you mint an NFT that can be assembled as artwork on-chain and traded in a marketplace. Dragos is currently looking at the initial tokenomics for Flippando, with a fixed supply of 1 billion and no airdrop distribution (more details soon). \n\nDragos has been a mobile app developer for over 10 years, with an interest in blockchain for around seven years. He enjoys working with Gno, although having to reset the chain and redeploy programs each time he makes a change was a challenge. The Portal Loop solves these issues in local development and will allow him to deploy Flippando sooner. As part of the work for Flippando, Dragos also added [PR 1309](https://github.com/gnolang/gno/pull/1309) to improve our GRC721 implementation]. He is also applying for a grant to port his project management system on-chain for Gno, and he gave us a [demo](https://drive.google.com/file/d/1eJGyATHhEzletWwQ4Xt_9ON7L231Yvow/view). An on-chain project management tool will be essential for organizing the DAO system, focusing on our team’s needs, organizing tasks, setting goals, and more. Keep up with Dragos’ progress by visiting his [hackerspace](https://github.com/gnolang/hackerspace/issues/33).\n\n### Berty\nBerty has been powering ahead with Gnomobile (which will soon receive a new name to better reflect its functionality), Gnosocial, and Gno core. Some highlights include significant progress on the GRPC interface (see [demo video]https://www.loom.com/share/d1cef60199c0487e86deab2a9e61d61c). As the interface to Protobuf has many more data types available than the interface to the language bridge, GRPC greatly simplifies the app and improves the UX. The API is almost complete and now includes wallet functions, such as creating an account and restoring an account from the recovery phase, and an event stream when calling a realm function [(demo video available here)](https://www.loom.com/share/42f2dcb0b4a34f77a95a0f8012e4b52b).To help developers, Gnomobile also includes example apps. Here is a [demo video](https://www.loom.com/share/41a20a764f0f4caf91f068b62e1f16c4) of the latest minimal hello app.\n\nBerty created [PR 1235](https://github.com/gnolang/gno/pull/1235) relating to Amino. They start with a Go struct and add comments explaining all the fields. Previously, when they ran Amino and generated a Protobuf structure, all their comments disappeared. This PR allows them to preserve the comments. They also created [PR 1213](https://github.com/gnolang/gno/pull/1213) since Amino should create a Protobuf structure where the fields follow official naming conventions. Thanks to help from the Gno devs, these PRs are merged.\nBerty is also focused on building a decentralized social media application using the Gnomobile framework, which is almost complete. The aim is to create a testbed where dApp builders can see how their implementations integrate and function with web2-like social media features, opening the door to interesting experiments such as DAO collaboration and content modification. Berty is building a decentralized Twitter-like application and plans to finish it in six months. Check their progress on their [hackerspace here](https://github.com/gnolang/hackerspace/issues/28) and look for more upcoming demos.\n\n### Teritori\nTeritori has been focusing on Escrows in the past couple of months, aiming to make improvements that facilitate on-chain project management. The team is also iterating the Moderation DAO and has identified a need for a conflict solver module to call an external authority to solve a conflict between two parties (for example, the buyer and the seller). They have called this module the Conflict Solver Module and integrated several options like Justice DAO (composed of humans) or any realms (e.g. GnoChess) to solve the conflict. They are researching work on VRF to implement randomness so that the module selects a person (or group of people) with no conflicts of interest in the issue. [PR 11](https://github.com/TERITORI/gno/pull/11/files) provides more details. A true randomness function will also be handy for the Flippando game that doesn’t currently rely on true randomness. \n\nIn other news from Teritori, the moderation DAO is live! You can head to the [Teritori site](https://app.teritori.com/feed?network=gno-teritori) to play around with it and even try deploying your own DAO, creating a user profile, and adding a social feed. The team has deployed V1 of a “Soundcloud-like” app on the [Gnosocial feed](https://app.teritori.com/feed?network=gno-teritori) in which you can listen to music while browsing features, publish your own music as an artist that appears on your profile, comment on tracks, tip artists, and more. Keep updated with Teritori on their [hackerspace here](https://github.com/gnolang/hackerspace/issues/7).\n\n### Zack Scholl\nOur resident tinkerer Zack gave a workshop last month as part of his “Go to Gno” series called [Go to Gno: ByteBeat - Generating Audio with Smart Contracts](https://www.youtube.com/watch?v=lmmUIEHhdqA). This is a really interesting tutorial on how to build Bytebeat (a minimal programming language for synthesized music) with smart contracts and follows on from his microblogging workshop. Be sure to check it out. If you want to hear more about Zack, you can also watch [Getting to Gno with Zack Scholl](https://www.youtube.com/watch?v=LgXa7QCdxdA\u0026t=1258s), a Fireside Chat series that talks about contributors’ work, lives, and motivations to be on the Gno.land journey with us.\n\n### Onbloc\nAs always, the Onbloc team has been busy! Over the past few weeks, they have been working on extending the functionality of Gnoswap, integrating APIs and realms with the interface, improving the governance page UI, and integrating the Adena wallet. Onbloc expects to launch the beta of Gnoswap next month, and we’re super excited to see it in action. To improve the UX and UI of Adena and make the wallet even more secure, the team is implementing a feature called Air-Gap which allows the wallet to broadcast transactions signed from an offline environment without the user needing to import their keys to Adena. Onbloc has also started a discussion around ideas to improve the usability of QR Codes for secure data transmissions between offline signers and watch-only wallets in [Issue 1375](https://github.com/gnolang/gno/issues/1375). We’ll keep you updated on the work here. You can also find more information on Onbloc’s [informative blog](https://medium.com/onbloc). \n\nAs well as developing core tooling for Gno, Onbloc is working on Gno core to help us build important functionality. The team welcomed a new hire, Lee ByeongJun as a core engineer and to help with work on three core areas: contract interaction (enabling realms to interact with other realms), the multinode testnet, and porting essential Go packages to Gno. You can find more details and keep track of everything Onbloc is working on in their [hackerspace issue here](https://github.com/gnolang/hackerspace/issues/29).\n\n### Varmeta\nWe’re excited to welcome a new contributor Varmeta to Gno.land. Varmeta was founded in 2020 to focus on blockchain and virtual reality/augmented reality technologies and has grown from a team of three to over 40 engineers. Varmeta is excited by the vision behind Gno.land and its philosophy for rewarding developers. The team is committed to supporting Gno’s success by providing various applications for the ecosystem, starting with the Gno.land Unity SDK to make blockchain more accessible to game developers. Track Varmeta’s progress on their [hackerspace here](https://github.com/gnolang/hackerspace/issues/43).\n\n### Gno @ Devconnect Istanbul 2023\nGno.land core team members organized a small, unofficial meetup in Istanbul during Devconnect week from November 13-17. The engineering-focused meetup was accompanied by a Happy Hour and snacks, where attendees got the chance to learn about Gno.land in an informal way and how they can easily develop dApps in Gno, as well as contribute to the project.\n\nThat's all for now! Be sure to check back again with us for the next edition of The More You Gno to keep up with all our progress. Do you want to contribute to Gno.land's monthly updates? If you're building on Gno.land and want to highlight your development, project, event, or idea, let us know, and we'll include your contribution.","2023-11-29T00:00:00Z","christina","gnoland,ecosystem,updates,gnovm,tm2"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["bgl-poc1","Building Gno.land – Next Generation Smart Contract System","\n\n*Disclaimer: The Building Gno.land series aims to share the core concepts of our platform, mission, and tech stack, providing a snapshot of a current state on our builder’s journey. New episodes may deprecate previous ones, but no editions will be modified at any time. We encourage you to follow along as we create the rails for a more transparent and accountable society, and we welcome feedback and contributions to the repo.*\n\n## I. What Is Proof of Contribution (PoC)?\n\nGno.land is secured by a novel consensus mechanism that makes our platform unique—Proof of Contribution (PoC). PoC prioritizes fairness and merit, rewarding the people most active on the platform and revolutionizing the concept of open-source rewards. By removing the voting power associated with being wealthy (holding tokens in Proof-of-Stake (PoS) networks or amassing mining hardware in Proof-of-Work (PoW) networks), PoC restructures the financial incentives that tend to corrupt blockchain projects in the long run and rewards contributors fairly for their work based on their expertise, commitment, and values. \n\nGno.land contributors receive rewards and voting power according to their contribution level. These rewards increase as they make additional contributions, gain expertise, and are promoted up the Gno.land governing DAO’s (GovDAO) tier levels by higher-level contributors. So how does PoC work, what are its core features, and how does it lend security and decentralization to the platform? \n\n### Prioritizing Fairness and Alignment \n\nProof of Stake (PoS) was a monumental leap forward for the blockchain industry, solving the energy-intensive requirements of Proof of Work (PoW) and enabling blockchains to scale for broader adoption (thanks to its minimal carbon footprint and faster throughput). However, like PoW, PoS has some disadvantages. For example, in PoS networks, participants receive rewards based on how many tokens they stake, which means their incentives for working on the chain are often purely financial. Validators accumulate vast net worths and don’t always hold values that align with the core development of the chain. \n\nSince validators are crucial in securing PoS networks, they should be paid fairly for their work and encouraged to contribute more. However, validators should not be purely financially (and certainly not politically) motivated, taking up competing positions and launching political campaigns to convince token holders to stake with them. This type of lobbying affects all aspects of the chain’s development—from governance to technical upgrades—and can lead to factionalism and misalignment. \n\nPoC makes the system fairer and more sustainable, ensuring participants are aligned and take actions that benefit the Gno.land community and the broader ecosystem. That’s why (unlike PoS) contributors receive rewards based on their contribution effort (tier level) rather than how many tokens they stake. They are thus incentivized and recognized for the quality of their work, ideas, and alignment, driving participation and active engagement. Governance is allocated to the people most likely to care for the ecosystem’s long-term success—the contributors who have spent the most time working toward it—from open-source developers to video creators and everyone in between.\n\n### Rethinking Financial Incentives \n\nFor long-term security and sustainability, PoC emphasizes project principles and values over monetary gains, replacing standard token incentives with a system that separates voting power from token ownership. Two reward systems are currently being considered (in addition to a hybrid system). For the first, contributors receive WORX units that weigh the amount of GNOT tokens (the native Gno.land gas token) earned each month. Each member of the same tier receives the same amount of WORX. At the end of the month, the total each member earned is divided by the total amount of WORX distributed that month to calculate a percentage. This percentage represents the percentage of Gno.land fees earmarked for contributors that each member will earn in GNOT. WORX will likely be cleared each month to prevent cumulative, exponential reward exploits over long periods of time. \n\nFor the second, each tier level simply receives an amount of GNOT each month fixed to a USD value, similar to a salary. This would be combined with risk management and caps per tier level in order to promote long-term sustainability based on Gno.land fee generation. A hybrid of this system is also possible, either rewarding contributors of lower tiers one way and higher tiers the other or using both systems in tandem based on predefined conditions. This will be explored further in future tokenomics articles, models, and documentation.\n\nRegardless, WORX units are not transferable, will not be listed on exchanges, and hold no monetary value. WORX units are more like shares that represent value provided by contributors and allow their work to be quantified compared to other contributors/tier levels. It’s important to stress that GNOT tokens do not influence governance on the platform in any way. Voting power is earned through contributions and distributed according to contribution effort, with each member of the same tier representing equal voting power that increases with their tier level. This creates a network of highly aligned contributors who care deeply about the platform they are building and strive to improve it.\n\nGNOT, the native Gno.land gas token and the gas token of the Gno.land ecosystem, will be distributed via airdrop to qualifying ATOM stakers. It will also be available for purchase after that point (*more on Gno.land’s airdrop and tokenomics coming soon*). GNOT is used to pay all fees associated with the network and beyond, including transfers, IBC, ICS, and contract interactions, giving holders the chance to earn rewards from the economic activities of Gno.land.\n\n### What Makes a Good Contribution?\n\nWORX and/or GNOT can be earned through different types of contributions—not only coding and development expertise—but also through non-technical contributions, such as community building, governance involvement, constitutional proposals, teamwork, media creation, etc. The core focus is on alignment, not necessarily specific tasks. For example, an accepted proposal or merged code will raise or at least maintain the contributor’s tier level, allowing them to receive rewards during their time working between submissions. However, a proposal or code that has displayed a very high level of effort, detail, and aligned values (but is not merged) will also be considered in any proposals regarding contributor promotion.\n\nThis system allows the ecosystem to show appreciation for diverse forms of contributions and ‘useful failures’ that bring us closer to the solutions we adopt. It is designed to foster engagement, creativity, and collaboration while encouraging anyone aligned to contribute to growing the Gno.land chain and community. \n\n### How Are Contributions Assessed?\n\nThere is a strong human element to deciding what makes a good contribution, requiring knowledgeable human judges to exercise discretion. As such, contributions won’t be templated by default or rewarded automatically but assessed through Gno.land’s governing DAO, GovDAO. GovDAO is responsible for development and governance and is organized into tiers, as discussed above.\n\nGovDAO members review, measure, and curate contributions, and the tokenomics of GovDAO incentivizes members to be effective and unbiased evaluators. They engage in discussions and assess contributions based on effort, time, and other relevant factors/metrics that contributors will have stored in their profiles. The decision-making rationale is transparent and visible through on-chain forums. Again, contributors are assigned a tier level and receive a corresponding reward each month according to their tier. As contributors join GovDAO, the DAO grows, giving Gno.land decentralization efficiency and a high Satoshi score. \n\nGovDAO is assisted by a network of knowledge-specific DAOs, such as an Engineering DAO, a Support DAO, an Operations DAO, and the EvaluationDAO, which comprises a trusted group of high-reputation contributors that help assess specific contributions. This enables secure collaboration and seamless integration (*more on Gno.land’s network of interconnected DAOs coming soon*.) \n\n### Sybil-Resistant and Secure\n\nIn addition to being fairer, more aligned, and sustainable, PoC is Sybil-resistant by design. In blockchains, a Sybil attack is where one or multiple attackers multiply their presence and influence by creating fake identities to sway major network decisions (for example, including malicious blocks). In terms of PoS, the Sybil resistance is purely monetary (people need to stake real money to get power), so an attacker that wants to carry out a Sybil attack on a PoS network needs to lock at least as much stake as that locked by honest validators.\n\nPoC minimizes risks of Sybil attacks, takeovers, and alliances as the community vets every person who is given any power or sway in the network (including validator power) through the DAO, so at no point can anyone \"spoof\" identities and regain major sway. Moreover, Gno.land is built and secured by the merit and effort put into the project, as opposed to how many tokens someone can buy, rethinking financial incentives and making the platform Sybil-resistant and secure.\n\nThrough fairer rewards, restructured incentives, resistance to corruption and Sybil attacks, and a strong appreciation for all contributions, Gno.land is designed to be sustainable and fair. A censorship-resistant platform built, owned, and secured by a growing, aligned community for many generations to come.\n\n*I. What Is Proof of Contribution? is the first in a series of articles to dive deeply into the philosophy, vision, mechanics, and work involved in developing a new consensus mechanism for the next generation of smart contract systems. Look out for subsequent editions and additional Building Gno.land series, and let us know what you think! Got questions? Join the Gno.land [Discord](https://discord.com/invite/S8nKUqwkPn) or follow us on [Twitter/X](https://x.com/_gnoland)*.\n","2024-01-10T10:51:00Z","","building-gnoland,gnoland,proof-of-contribution"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-7","The More You Gno: Gno.land Monthly Updates - 7","\n\nWelcome to the latest edition of *The More You Gno*, your regular source of updates from the Gno.land core team and contributor ecosystem. After a well-deserved rest during the holiday break, we’re kicking off 2024 with renewed energy and plenty of exciting initiatives, including a new staging testnet (the Portal Loop), the official Gno.land documentation page, several merged PRs (including native bindings!), and many updates across the board. Dive in to find out what we’re working on and what our ecosystem partners and grantees have been up to.\n\n## Gno Core Team Updates TL;DR\n\nShort on time? Skim the highlights from the core team in the list below. You’ll find additional details in the next section if you want to explore any topic in greater detail.\n- **Native Bindings** - If you’ve been following our journey or experimenting with the platform, you’ll hear virtual champagne pops as Morgan’s ongoing work with native bindings is finally merged [PR 859](https://github.com/gnolang/gno/pull/859).\n- **Gnodev** - Thanks to Guilhem’s `gnodev` initiative [PR 1386](https://github.com/gnolang/gno/pull/1386), you can now create and develop contracts with a single command.\n- **Gno.land Offical Docs** - Check out [docs.gno.land](https://docs.gno.land) for how-to guides, getting started, and an overview of key concepts of the platform.\n- **Effective Gno** - Taking inspiration from *Effective Go*, Manfred’s begun listing common patterns and examples of the differences between Gno and Go.\n- **Assignment in GnoVM** - Jae is working on approaches to fixing assignment in the GnoVM and issues that deal with persistence [(issue 1326)](https://github.com/gnolang/gno/issues/1326). \n- **Portal Loop** - The [Portal Loop](https://portal.gnoteam.com) has been released on a staging domain and is being tested.\n- **Roadmap** - We’re working on a fully-fledged Gno.land roadmap and will share a detailed DAG and important goals and milestones with you soon.\n- **Tendermint2 Update** - There are several PRs aimed at removing the dependencies between Tendermint2 and GnoVM.\n- **Gno.land Tokenomics** - We continue to make progress in defining the structure of Gno.land’s DAOs and the design of reward schemes for contributors.\n### Native Bindings (PR859) Has Been Merged\n[PR 859](https://github.com/gnolang/gno/pull/859) (native bindings) was submitted by Morgan in May 2023 to improve calling Go code from Gno standard libraries, all while improving `gno doc` documentation for standard library functions. Native functions are _declared_ in Gno code, but their definition (the underlying code) only exists in Go: this is similar to how Go and many other systems languages implement assembly functions. Overall, the addition will now allow us to better support precompilation (transpiling Gno code to Go) for all Gno-specific standard libraries, like [`std`](https://docs.gno.land/reference/standard-library/std/address/), and have a system for defining such functions that is transparent to code analysis tools like `gno doc` and `gnols`.\n### Gnodev Has Been Merged\n[PR 1386](https://github.com/gnolang/gno/pull/1386) (`gnodev`) has been merged. Gnodev is a tool to locally develop Gno realms which automatically re-deploys your contracts when you change the files, similar to JavaScript frameworks `npm run dev`. There are some additional features being worked on to improve the experience, including browser hot-reload (for the full front-end JavaScript experience!)—and Gno core developers who have worked on realms all agree that thanks to `gnodev`, they can finally stop visiting their therapist every week. Play around with it, and let us know how you get on. There may be a few bugs still and Guilhem is happily accepting feedback.\n### The Gno.land Official Documentation Page Is Live\nWe’re excited to have the Gno.land Official Documentation page live on the [https://docs.gno.land](https://docs.gno.land) domain. This will always be a work in progress as we expand the docs, make iterations to existing issues, and refine some of the core concepts, but it’s an excellent resource for anyone wanting to find out more about Gno and for onboarding new developers to the platform. A big thanks to the Onbloc team, whose developer portal was a huge inspiration for this. We’re looking for feedback, so leave your reviews and let us know where the docs can be improved and what else you would like to see.\n### Effective Gno\nManfred has been working on a document called [Effective Gno (PR 1000)](https://github.com/gnolang/gno/pull/1000), which takes inspiration from *[Effective Go](https://go.dev/doc/effective_go)* and will become an important reference document for Gno devs to explore common patterns and crucial differences in how we program compared to Go. We’ll be iterating on this as we progress, but you can already find plenty of examples. If you’re just getting into Gno and coming from a Go background, this is a great resource. Read this document and provide some comments if you have any. \n### The Portal Loop Beta Is Live\nThe Portal Loop Beta has been released on a staging domain, and you can check it out now at [https://portal.gnoteam.com](https://portal.gnoteam.com). The Portal Loop will replace the Gno.land website once we’ve finished squashing bugs and adding features. We’re still testing it and have identified several issues. For example, from the last three merged PRs, only one triggered a redeploy when we expected two or three deploys. We will also add a faucet.\n\nAs we continue to evolve the Portal Loop out of its early development stages, transaction volume and general activity will increase. However, currently, there are insufficient transit testing transactions. One of the tasks we want to do to prove that the Portal Loop is working well enough is to write a kind of monitoring-oriented oracle that will try to make transactions, perhaps incrementing a counter every minute. We’re looking for help writing a script or a daemon for this oracle, so let us know if you want to contribute to [issue 1443](https://github.com/gnolang/gno/issues/1443). Once the Portal Loop is finished, we will focus on testnet 4.\n### Assignment Issues in the GnoVM\nMorgan came across a bug [issue 1326](https://github.com/gnolang/gno/issues/1326), which returned an error about an [“unexpected unreal object”](https://tenor.com/es/view/cranizox-gif-8576622211330078986) when assigning a local variable to a dereferenced global variable in the GnoVM. Jae has been spending some time working on approaches to solving this and fixing assignment that will also work for saving escaped objects that don't have a parent (like variables whose pointers are referenced on a persisted object). This is a tough one to figure out, so if there are any other VM issues that deal with persistence and detached parentless objects, now is the time to add them to Jae’s plate. \n### An Update on Tendermint2\n[PR 1483](https://github.com/gnolang/gno/pull/1483) has the same goal as [PR 1438](https://github.com/gnolang/gno/pull/1438): to make Tendermint2 completely independent of GnoVM and Gno.land. This continues a project started many months ago to separate Gno into three separate components: the Tendermint2 consensus engine, the Gno programming language and VM, and Gno.land, the blockchain combining both together. This way, we’re working towards making it possible to build other blockchains that use Tendermint2 (like AtomOne!), the GnoVM, or both!\n### Gno.land Engineering Retreat\nIn the last *The More You Gno*, we covered the Gno.land and AIB company-wide retreat, an invaluable opportunity to work together, code together, and get to know our peers outside of work. It was such a success that the Gno core dev team held another retreat in December in Rouen, France, where many of the above issues and PRs were tackled and merged. We look forward to more productive and frequent face-to-face meetings in the year ahead.\n### Gno.land DAOs and Tokenomics\nWith the input of Manfred, Jae, and the rest of the team, Michael continues to make advancements on Gno.land’s system of DAOs and tokenomics. One key change since the last edition is that the WorxDAO (responsible for governance and all issues related to development in Gno.land) will now be known as the GovDAO. The DAO will likely have seven tiers but initially launch with three or four. The main benefits of moving up tiers are increased voting power, increased monthly rewards, and the authority to promote members from lower tiers. GovDAO will be assisted by WorxDAO, which will encompass several different sub-DAOs, such as engineering, funding, and projects. \n\nWe’re currently exploring different reward systems for contributors, whereby each member of the same tier level will receive the same amount of rewards, either directly or indirectly, in the GNOT native gas token or USD, in a type of salary-based scheme. We may also elect to distribute rewards based on a contribution/work “hash difficulty” (total number and tier split of active contributors that month). We may also adopt a hybrid of these two models. \n\nMichael is also working on a bounty system to make Game of Realms (GoR) more accessible and evaluating contributions easier for judges. High ranking GoR competitors will likely receive Gno.land tier levels based on their leaderboard placing in addition to ATOM rewards. It’s important to note that these discussions are ongoing, and the information here may be deprecated. \n### Making Testing Faster\n\nThanks to Petar, [PR 1417](https://github.com/gnolang/gno/pull/1417), we have improved the entire VM testing suite runtime by around four minutes, which is an incredible achievement. We just need to refactor some test scenarios that are not very concurrent-friendly, but this PR makes interacting with the platform so much easier.\n\n### Bug Fixes and Miscellaneous Items\n\nThanks to Joon from Onbloc, we were able to add support for octals without 'o' (check out [PR 1331](https://github.com/gnolang/gno/pull/1331) for more details), and thanks to Dragos [PR 1309](https://github.com/gnolang/gno/pull/1309), we extended the GRC721 interface so that it now supports setting a token URI. These are both extremely welcomed contributions, and we appreciate our ecosystem partners.\n\nFrom the core team, a special shout out to Dylan for killing it fixing bugs, and getting many PRs ([PR 1451](https://github.com/gnolang/gno/pull/1451), [PR 1315](https://github.com/gnolang/gno/pull/1315), and [PR 1305](https://github.com/gnolang/gno/pull/1305), to name a few) merged over the last few weeks. Props also go to Marc for [PR 1177](https://github.com/gnolang/gno/pull/1177), which has just been merged, which fixes append in certain key situations. We’ve also welcomed a new security engineer, Kristov, to the team.\n\n## Grantee and Ecosystem Updates\n\n### Onbloc\n\nOnbloc has been on a roll, giving us an internal demo of Gnoswap beta just before the Christmas break and a public demo of its awesome Pool Incentivization feature during the last contributor sync call. With Pool Incentivization, anyone can add extra rewards on top of swap fees for LP stakers. This will help bootstrap initial liquidity for new-coming projects by attracting liquidity providers until sufficient organic trading volume is secured. Onbloc is also actively developing Adena’s Airgap feature and has improved the sign-in flow for security enhancement along with some refactoring. There will be a demo coming up in the next few weeks. Onbloc will also be researching airdrop trends and aiming to identify some of the most coveted DEX features users want to see for Gnoswap to streamline the onboarding process.\n\nRegarding Gno core, Onbloc core dev Byeongjoon Lee has developed a JSON parser for Gno, giving us a live demo during the last contributor sync. This allows the conversion or accessing of data from contracts in the JSON format, which will improve the Gno developer experience. His code is currently under review by the core team in [PR 1415](https://github.com/gnolang/gno/pull/1415). Dive deeper into Onbloc’s Builder Journey in the [hackerspace issue 29](https://github.com/gnolang/hackerspace/issues/29).\n\n### Teritori\n\nTeritori continues the challenging work of developing Gno Project Manager, a web app that allows anyone to create, fund, review, or manage projects fully on-chain. During the last contributors' call, the team gave a demo of the work achieved so far, in particular regarding the escrow system and completing project milestones so contributors can be paid once each one is completed rather than having to wait until the project finalization. \n\nGno Project Manager is a complex goal, and the team has run into some issues with edge cases they hadn’t bargained for in the relationships between grantees and funders. The team is looking for feedback and help identifying edge cases, so if you have any in mind, let them know. Teritori is also working on the conflict solver module and improving the social feed on [https://app.teritori.com/feed?network=gno-teritori](https://app.teritori.com/feed?network=gno-teritori), as well as providing more detailed documentation on their work, which they’ll be releasing in the coming weeks.\n\n### Berty\n\nThe Berty team has been busy working on GnoSocial backend implementation. The initial feature set has been implemented [here](https://github.com/gnolang/gnosocial/blob/main/realm/public.gno), including posting and replying to messages and reposting threads. You can keep up with Berty’s journey on GnoSocial in [hackerspace issue 51](https://github.com/gnolang/hackerspace/issues/51), which contains many issues and PRs, such as implementing calls, running tests, and fixing bugs. We’re super excited about pushing the limits of scalability with Berty’s decentralized social platform, and we’ll be looking forward to more demos in the coming weeks.\n### Dragos\nDragos has successfully launched the Flippando game, and you can try it out on the [testnet here](https://gno.flippando.xyz/flip). If you haven’t been following the progress, Flippando is an on-chain memory game that you can play with your choice of styles, such as dice, colors, and hexagrams. Once you successfully complete a matrix, you can mint the end result as an NFT, which can later be assembled into larger, more complex NFTs to create digital artwork. You can find out more about the game, its creator, and the official roadmap on the site. We’ll also release a blog post soon from Dragos sharing his experience porting Flippando from Solidity to Gno, so stay tuned!\n### Varmeta \nVarmeta’s update was brief this week since the contributor sync call ran over. We look forward to hearing more about the team’s progress in developing the Unity SDK for Gno next time. You can read more about it on Varmeta’s [hackerspace issue 43](https://github.com/gnolang/hackerspace/issues/43).\n\n*Do you want to contribute to Gno.land's monthly updates? If you're building on Gno.land and want to highlight your development, project, event, or idea, let us know, and we'll include your contribution. That's all for now! Keep track of our progress by following our socials [Twitter/X](https://twitter.com/_gnoland) and [Discord](https://discord.com/invite/tF2X8M6cVj) and watch out for the next edition of The More You Gno in a few weeks.* \n","2024-01-22T00:00:00Z","christina","gnoland,ecosystem,updates,gnovm,tm2"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["porting-flippando-gno","5 Things I Learned While Porting Flippando From Solidity to Gno ","\n\nLast year, while visiting Seoul, South Korea, I decided, on a whim, to sign up for a hackathon called Glitch. The project I was going to present was a tiny little game, written in Solidity, called Flippando. It started as a weekend project to help me learn Solidity (I had no prior experience with this language). To my surprise, my tiny little game won the first prize on the Polygon track of the Glitch hackathon.\n\nEncouraged and even more curious now, I started attending side events during Buidl.Asia. One was about Gno, a smart contract platform written in Go. After the presentation, which was really great, I started a light conversation with the team. One thing led to another, and I ended up showing them Flippando. \n\nJust for context, Flippando is a non-degen, deceptively simple memory game. You start with an empty matrix and flip tiles to see what’s “underneath.” If the tiles match, they remain uncovered; if not, they are briefly shown, and you have to memorize their color until the entire matrix is uncovered. The end result can be minted as an NFT, and you can later assemble all the boards into bigger, more complex NFTs, basically “painting” with the uncovered tiles.\n\nThe Gno team seemed to like it, and they suggested I should apply for a grant to port it to Go/Gno. I had no prior experience in Go either, so I thought this would be a good opportunity to learn more. To my surprise, again, my grant submission was accepted.\n\nFast forward a few months until now: the Gno version of Flippando is live (in testnet beta) at [https://gno.flippando.xyz](https://gno.flippando.xyz). What follows sums up my experience porting the game from Solidity to Gno. This blog post is a mix of technical and not-so-technical takeaways.\n\n## 1. Being Early Pays Off\n\nSolidity has been around for some time now, and there is already a solid tooling ecosystem for it. I used Hardhat for my development, and I got really comfortable with it. When I started to port Flippando, though, I was quite surprised to see there was almost no tooling in Gno. Developing was mostly TDD (test-driven development) against a local VM, and deploying realms on the actual chain was more complicated than I expected. \n\nMy first feedback rounds to the team revolved almost exclusively around this topic. Very soon, I started to receive signals that my feedback was not only heard but taken into account and processed, and there were actual projects built aiming to improve the developer experience. In just two or three months, two full projects were finished: gnodev, and Gno Playground. \n\nGnodev makes development very similar to Metro in React Native: there is a watchdog on the file system, and your changes to the realm code are reloaded every time you save. It’s almost like deploying in real time; no need to stop the chain, wipe the state, restart the chain, and redeploy your modifications. Gno Playground is a sandbox-like environment, which helps tremendously with quick testing and even deploying packages on-chain. Both projects were finished, as I said, in just two to three months.\n\nBeing early pays off because you get to shape your development environment much faster than in a solidified (pun intended!) environment. You may have to deal with a little chaos in the beginning, but the benefits are well worth it.\n\n## 2. TDD All Day Long\n\nAs I said above, developing realms in Gno consists mainly of writing and testing your code with another code. It’s called TDD and it’s a very useful developing strategy, in general. I used it, at my day job, in all my projects consistently, but only in the initial stages. Once the codebase was more stable, I was relying more on regression tests from the Q\u0026A team.\n\nMind you, there was no Q\u0026A team this time; I was just coding alone, and I was forced to comply more and more with this TDD approach. In the end, I have to admit that, while slower and a bit boring, this approach is more effective, especially in a volatile environment, where patches are added literally every day, and the environment changes continuously.\n\n## 3. Marshal and Unmarshal\n\nThe current GnoVM doesn’t yet have an API standard for formatting. You can’t put a setting somewhere that will make the response be automatically translated into JSON. You have to write these JSON objects yourself for every payload you return from your realm. \n\nIn Solidity, all this is hidden under the event mechanism and handled by existing libraries, like ether.js, which take care of all this nitpicking. It soon became obvious that development time would be significantly longer in Gno because, on top of the logic, I also had to write the formatted response “by hand.”\n\nBut as with every other thing that seemed weird in the beginning, eventually, I came to appreciate it. It forced me to prototype more carefully not only the actual response but all the objects needed in my game. Eventually, it resulted in simpler and more flexible code.\n\n## 4. Eating Your Own Dog Food\n\nWhen developing in Solidity, most of the time, you just import OpenZeppelin contracts for ERC20 and ERC721 tokens (which are battle-tested, bug-free, and relatively easy to understand) and focus on your own contract logic. No mingling with low-level token implementation details; these are already packaged and ready to use.\n\nWhile porting Flippando to Gno, I realized I had to deal with these low-level details upfront simply because there was no equivalent of the OpenZeppeling contracts. Moreover, some current GRCs (the Gno equivalent of ERC) were incomplete. \n\nSo, I had to make a PR for a GRC721 implementation that was missing the SetTokenURI functionality, and this PR ended up being merged into the main Gno codebase (that felt really good, to be honest). \n\n## 5. Being Early Pays Off. Did I Say That Already?\n\nYes, but this time it’s about something else. It’s not about the satisfaction of shaping the development environment in the early days. It’s about the privilege of witnessing something coming to life from literally nothing. Gno has been in development for almost two years now, and it is several months before its mainnet. It’s literally on the verge of coming “alive.”\n\nEvery day new commits are added, and new decisions are made. There are new contributors constantly joining, and new projects prototyped and launched faster and faster. Every day the ecosystem is coagulating itself into something more and more visible, more and more alive.\n\nBeing able to witness this from the inside is a rare privilege and something I’m very grateful for.\n\n## Final Thoughts \n\nSo, these are, in a nutshell, my five top takeaways from porting Flippando from Solidity to Gno. There are many others, of course, and Gno is (did I already say this?) still very early. If you’re interested in learning more, please visit the official repo, look at the docs, and try interacting with the devs. You’ll never gno what can grow out of it! And be sure to play [Flippando](https://gno.flippando.xyz) today live in testnet beta and share your flips.\n\n## Here’s How to Play Flippando\n\nThe game presents a 16 tiles (4x4) or 64 tiles (8x8) matrix. These tiles are “covering” a board of various colors and gradients or shapes, like dice or hexagrams. Clicking two tiles consecutively “flips” them, showing what’s underneath. If they match, they remain uncovered; if not, they are briefly shown, and the player needs to remember their position. Once an entire board is flipped, revealing its random combination of colors, the player can choose to mint it as an NFT.\n\nWhen minting a solved board as an NFT, the game also mints a fungible token, FLIP, which is “locked” inside the NFT. This is the player's “reward.” But the token can only be unlocked if someone else uses that NFT in a larger project.\n\nThese larger projects, or “artworks,” can be assembled in the Flippando Playground. All minted basic NFTs are displayed here in an area from where the player can drag and drop them onto a canvas, creating a much bigger and more complex NFT. Once the canvas is fully filled and the player is satisfied with what’s in there, these new “artwork” NFTs can also be minted. This unlocks all the FLIP tokens for the NFTs used inside the artwork and sends them to their initial players. Furthermore, these complex artworks can be listed and traded in a marketplace, closing the circle of a virtual economy of goods.\n\nStart playing Flippando and share your Flips with Gno.land on [Twitter/X](https://x.com/_gnoland?lang=en) by tagging #gnoflip. \n\n\n","2024-01-24T00:00:00Z","dragos","gnoland,ecosystem,updates,flippando"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["wyg-zooma","Who You Gno – On the Record with Antoine Breuil","\n\nAntoine Breuil, ‘zôÖma,’ is the co-founder of [Teritori](https://app.teritori.com/), an active Gno.land contributor and grantee that’s building key modules and tooling for Gno. A firm believer in equal opportunities, free and decentralized access to information, and helping fellow humans, zôÖma is fascinated by human behavior and how we organize ourselves, holding an avant-garde social experiment five years ago with Teritori co-founder ‘Pop.’ \"La Suite du Monde\" drew people across France to a small village in the countryside to create a shared community and society—with farmland, accommodation, and tools for common use.\n\nThe goal was to form an in-real-life DAO whose members shared common goals and interests using blockchain technology with a token to pay for goods and services and vote on governance matters. While many people participated and were enthusiastic about creating a shared society, zôÖma admits the experiment was early- no one was interested in interacting with the tech. “90% of people, rural or not, found it too complicated,” he admits. “We were a bit naive, but it was fascinating nonetheless.”\n\n## A Fascination for Human Behavior\n\nzôÖma has been an ardent student of human behavior since childhood. His parents taught him early on the value of philanthropy and working with people in need. He’s set up several joint liability companies, non-profits, and NGOs to experiment with finding new and better ways to organize society, and one of the things he loves most about web3 is its “experimental” nature. He’s encouraged by how far the industry has come since he received his first bitcoins in partial payment for a website in 2014. “That turned out to be a really expensive website for my customer,” he laughs. He never expected such broad adoption of Bitcoin and a technology that “inspired a whole generation of engineers to experiment with new things.”\n\nLike most creative types, zôÖma is used to spinning many plates in the air, overseeing La Suite du Monde while working as a freelance designer, front-end dev, and Artistic Director for an independent French record label. “Before entering the world of engineers, I founded and managed a collective for 12 years, which brought together artists from all disciplines, hackers, designers, tinkerers, to build some interesting projects.” La Suite de Monde allowed him to explore his passion for finding new approaches to social coordination first-hand. “I explored very radical things,” he says, “like the notion of “accepted by default” where anyone could use the collective budget by expressing their desire to do so three times. I wouldn’t recommend this,” he laughs, “but the experiments were fascinating and still serve me today in my work.”\n\nOne really interesting trait about zôÖma is how he harnesses the creative and analytical sides of himself with equal application. Most people are predominantly right-brained or left-brained, yet, zôÖma is ‘ambidextrous’ in this regard. He’s a designer who’s created large-scale artistic events, cultural tours of Paris, and an award-winning independent movie documenting French artist and Bitcoin advocate Pascal Boyart, [The Underground Sistine Chapel](http://www.the-chapel.art), (which you should definitely check out!). Yet he’s also passionate about engineering and the future of cooperatives. He’s detail-driven and ambitious, taking his team at Teritori from two to 18 (14 full-time teammates and four part-time).\n\nIn his free time, zôÖma, “like all French people,” enjoys fine wine and good conversation. One of the things he loves most about Paris is how easy it is to find like-minded people to brainstorm with or decompress after a long day of work. “We have a very active ecosystem of engineers, cryptographers, etc.,” he says. Paris is also a beautiful city that captures his imagination with its dazzling architecture and impressive art. Even so, zôÖma channels his creative energy more effectively when working from a small Moroccan fishing village for three months a year. He reconnects with nature and humanity, immersing himself in a different culture and surfing in the Atlantic before he starts his day. \n\n## New Tools for Social Coordination \n\nWhy does zôÖma believe social coordination is so important, and why do we need new tools for it? “We’ve always had tendencies to organize ourselves and tools defining rules for living together, diplomatic protocols for discussing between social groups, or trading goods and services. But almost all the tools that previous generations put in place are outdated. Our entire generation has lost confidence in institutions to allow groups of humans to organize, coordinate, and meet their needs. Our dependence on third parties who do not have the same interests as citizens is immense.”\n\nzôÖma believes that web3 holds the key to unlocking the emergence of new societies through products that are “unstoppable, resilient, and meet a real need,” whether for small villages in the south of France, Africa, or Asia or neighborhoods in Brazil or Korea. “We must have access to the radical transparency of institutions, the privacy of individuals, censorship-resistant tools, and autonomous communication from all commercial enterprises. It is on this solid foundation that civilizations that are more just and equitable can be built.”\n\n## Making Web3 More Accessible \n\nOf course, as zôÖma found out, building new tools is easier said than done. Our industry faces an uphill climb when it comes to balancing the promise of the tech with a user experience that doesn’t cause tachycardia. He says that understanding that most people “don’t have the time or inclination to incorporate difficult technical concepts in their lives” has given him “crazy energy to focus on very simple technologies.” In fact, the ‘failure’ of La Suite du Monde is what gave birth to Teritori, “which today provides all the functionalities people asked us for at the time; a social network, communication systems, voting, crowd-funding, etc. We have made great progress, and it’s important to focus on products that are radically simple for the general public.”\n\nAccording to zôÖma, this means abstracting away the concepts that everyday people don’t need to be aware of, such as networks, dApps, and even blockchain, “and always switching from one decentralized application to another.” Unifying (not centralizing) separate tools, networks, and technologies within a single, simple interface, he believes, is the key to broader adoption. “It's a very complex challenge, in terms of security, design, etc., but it's what I'm passionate about today.” \n\nWhen it comes to Gno.land, Teritori has already delivered essential DAO tooling and standards, a Moderation DAO module to facilitate social communication and a Justice DAO module for conflict resolution. The team is now focusing on an on-chain project management tool to allow organizations and individuals to manage projects and track tasks smoothly and transparently on-chain.\n\n## A Fairer, More Transparent World\n\nIn 2024, Teritori enters a new phase called \"Chapter II,\" which involves unifying all its work into a mobile and desktop application that could “trigger superb demonstrations of the potential of DAOs.” He enthuses, “I dream that we will see the emergence of a village that uses Teritori as a tool for internal discussion and co-financing. Will this be real in 2024? Who knows? But that’s where I focus all my energy!”\n\nHe believes the internet has been a great leveler, enabling anyone with a connection to educate themselves on any subject; yet, the opportunity isn’t open to all, and free and open access is constantly diminishing. “I am a child of the internet. I grew up with warez, p2p, and an internet which provided me with daily resources to learn freely, everything that interested me. In some countries, it is impossible to benefit from this opportunity, and with the centralization of the internet on different key players, mass surveillance, and the censorship of certain dictators, the internet is losing its very essence, which makes it magic. Distributed protocols can reshuffle the cards and offer tools for the public good.” \n\nzôÖma says that humanity is at a turning point, and we must build the necessary tools now to avoid finding ourselves in a real-life version of George Orwell’s 1984. “I aspire to participate modestly in a world that is fairer, more transparent, and where society doesn’t need a puppet in a suit to improve its living conditions or respond to local needs. Web3 is just a tool, and if it doesn't meet this real need, then for me, it will be a failure.”\n\n*Experiment with Teritori today and test its Social Feed, which now includes Twitter-like functionality for posts, Medium-style articles, Soundcloud-inspired music, and videos—all based on Gno and IPFS and totally decentralized. You can also check out Teritori’s GnoModerationModule, which allows you to moderate a social network in a decentralized way. A faucet is available on the home page at [app.teritori.com](https://app.teritori.com/feed?network=gno-teritori).*\n","2024-01-11T00:00:00Z","christina","whoyougno,teritori,community,interview"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["bgl-poc2","Building Gno.land - Proof of Contribution II","\n\n*Disclaimer: The Building Gno.land series aims to share the core concepts of our platform, mission, and tech stack, providing a snapshot of a current state on our builder’s journey. New episodes may deprecate previous ones, but no editions will be modified at any time. We encourage you to follow along as we create the rails for a more transparent and accountable society, and we welcome feedback and contributions to the repo.*\n\n## II. Proof of Contribution vs Proof of Stake\n\nProof of Stake (PoS) is a robust consensus mechanism that provides a more environmentally friendly and scalable alternative to Proof of Work (PoW) and powers most of the web3 industry today. As PoS pioneers, Cosmos technology secures hundreds of blockchain projects and billions of dollars of digital assets, and Ethereum (launched as a PoW chain in 2015) made the historic switch to PoS in 2022. According to [ethereum.org](https://ethereum.org/en/developers/docs/consensus-mechanisms/pos), PoS is “more secure, less energy-intensive, and better for implementing new scaling solutions compared to the previous proof-of-work architecture.” However, as we briefly discussed in [*What Is Proof of Contribution?*](https://test3.gno.land/r/gnoland/blog:p/bgl-poc-1), PoS has vulnerabilities that can corrupt the network over time.\n\n### The Limitations of Proof of Stake (PoS)\n\nBeyond securing the network, the main goal of any consensus mechanism (PoW, PoS, DPoS, PoC, etc.) is to be as decentralized as possible and not reliant on any central actors. This can be measured by the Satoshi Score (or the Nakamoto coefficient), a quantitative measure that assesses a blockchain’s level of decentralization by calculating the minimum number of nodes needed to compromise a network or carry out a 51% attack. PoS systems can be bootstrapped within days (or even hours), starting off decentralized and achieving a high Satoshi Score.\n\nThe PoS chain Genesis allocates a default voting power to ~20-50 nodes, in general equally (or at least making sure that no single node has more than 5% of the voting power). This makes PoS chains decentralized enough (in theory) from block 0 with a near-perfect Satoshi score. However, in practice, PoS has two main issues. Because the system is dictated by money, PoS chains become imperfect over time. Anyone wealthy enough can stake their tokens progressively and use their accumulated power to sway decision-making on the chain—or take the network over completely.\n\nThe chain can limit the maximum voting power per validator node, but this is almost ineffective, as a malicious actor can carry out a Sybil attack on the network and create multiple validators to bypass the voting cap. Such an attack renders the max voting power per node useless and leaves the chain defenseless against a single organization or cartel gaining the majority of the voting power. PoS systems leave chains like Cosmos Hub and Ethereum at risk from such bad actors, cartels, and powerful protocols (such as Lido and Rocket Pool).\n\nWhile Proof of Contribution (PoC) can’t prevent Sybil attacks on standard user accounts (when malicious actors create multiple accounts with a single computer and transfer tokens within a few hours), it does make it almost impossible for validator nodes to suffer Sybil attacks. Since the community vets every person who is given voting power or sway in the network (including validator power) through the DAO, at no point can anyone \"spoof\" identities and gain major sway. \n\n### Where Proof of Contribution (PoC) Excels\n\nPoC is actually Proof of Authority (PoA) which, instead of offering up a resource like computing power or a financial stake, relies on validators staking their reputation. Anyone can join most public PoW and PoS networks without revealing their identity. However, by definition, PoA validators need to make themselves known and are selected based on their trustworthiness. This means PoA tends to work better when deployed in private or permissioned blockchains than in public platforms (because of this tendency toward centralization). \n\nPoC solves this problem, ensuring the network becomes increasingly decentralized over time by being governed by a decentralized entity, GovDAO. Like standard PoA chains, PoC chains launch with a handful of validators that must be identified and trusted by the network, meaning governance is centralized at the start, and the chain achieves a low Satoshi Score. The system is about contributing and earning contribution units, which are slow to gain and require human interaction. It takes months (or years) before there are enough actors in the DAO and sufficient voting power for the chain to be considered decentralized enough, according to the Nakamoto coefficient. \n\nPoC is thus slower to bootstrap than PoS and harder to achieve. You can think of PoC versus PoS as a marathon versus a sprint, whereby PoC starts slowly but then gains momentum over time, and PoS starts quickly but loses momentum over time (the graph below provides a visual representation of PoC versus PoS). \n\n[![Graph](https://gnolang.github.io/blog/2024-01-26_bgl-poc2/src/thumbs/graph-container.png)](https://gnolang.github.io/blog/2024-01-26_bgl-poc2/src/graph-container.png)\n\nThe GovDAO that owns the chain has a mandate to scale (to grow and decentralize) continuously as it adds more contributors. This means it becomes progressively larger over time, achieving high decentralization efficiency way beyond the initial fast sprint of PoS chains. Once established as a proven consensus mechanism and alternative to PoS, GovDAO can benefit from by any blockchain project (through an evolution of ICS) wanting to achieve decentralization and sustainability—PoC can secure Gno.land and the web3 industry at large.\n\n### Security-Conscious by Design\n\nAnother advantage of PoC is that because it’s reliant on human interactions, it is more Sybil-resistant by design. As discussed, it’s almost impossible to split a validator node into two (or more) nodes, making conducting a Sybil attack infinitely difficult. Since contribution units are not transferrable or exchangeable, PoC cannot suffer from whales attempting to purchase voting power quickly. If someone wanted to take over the network, they would need to invest years of their time making meaningful contributions. Their attack would be so slow that it would easily be prevented by humans monitoring the decentralization and adjusting the parameters. \n\nMoreover, GovDAO will activate and deactivate new validators on request, establish a KYC system for validators, and manage promotions of contributors with votes. This removes the possibility of a takeover happening overnight since the only way to gain validator or voting power is by voting on governance requests, which is slow and managed by humans. This is in contrast to PoS systems which are powerful and fully automated yet defenseless against such coordinated attacks.\n\nGno.land is built on the very premise that such an attack on a PoC network would never happen as it would be entirely counter-intuitive. Since contributions are not only about expertise but also alignment, it is our hypothesis that longstanding contributors who have invested years of time and brainpower in developing the chain will do their best to protect it rather than destroy it. The DAO system will endure thanks to the mix of expertise and alignment and the amount and frequency of contributions. \n\n### Concluding Thoughts\n\nBeyond separating voting power from net wealth, a core component of Proof of Contribution (PoC) is its focus on long-term sustainability. PoC makes the system fairer and more sustainable, ensuring participants are aligned and take actions that benefit the community and the broader ecosystem. PoC is slower to bootstrap and harder to achieve than PoS but focuses on long-term alignment and security. \n\nUnlike PoS, contributors receive rewards based on their contribution effort rather than how many tokens they stake. They are thus incentivized and recognized for the quality of their work, ideas, and alignment, driving participation and active engagement. Governance is allocated to the people most likely to care for the ecosystem’s long-term success—the contributors who have spent the most time working toward it.\n\n*II. Proof of Contribution vs Proof of Stake is the second in a [series of articles](/r/gnoland/blog:p/bgl-poc1) to dive deeply into the philosophy, vision, mechanics, and work involved in developing a new consensus mechanism for the next generation of smart contract systems. Look out for subsequent editions and additional Building Gno.land series, and let us know what you think! Got questions? Join the Gno.land [Discord](https://discord.com/invite/S8nKUqwkPn) or follow us on [Twitter/X](https://x.com/_gnoland)*\n\n\n","2024-01-26T13:37:00Z","christina","gnoland,gnovm,tm2,PoC"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["funding-program-23q4","Gno.land Funding and Grants Program - Quarterly Report: Q4 2023","\n\nThe Gno.land Funding and Grants program identifies talented and passionate developers, researchers, and tinkerers to interact with Gno.land, enhance the platform's usability, and help build the core infrastructure and tooling needed for mainnet. After a strong start in Q3 2023 from our grantees, we awarded four additional grants in Q4. Let’s take a look at their progress and what’s coming up in Q1 2024.\n\n## Q4 Funding Breakdown\n\nThe total amount paid out in Q4 for grants was just under $317,000, spread out over the four grants: Teritori, Berty, Onbloc, and Dragos (Flippando). This work was split over essential stress-testing, debugging, and development on Gno core, and building social, gaming, and project management dApps to extend the platform’s functionality. Each grant recipient received milestones for deliverables and tracked their progress through regular public and internal syncs, hackerspace journey updates, blog posts, documentation, and developer calls.\n\n[![Q4 Chart](https://gnolang.github.io/blog/2024-02-07_funding-program-23q4/src/thumbs/chart.png)](https://gnolang.github.io/blog/2024-02-07_funding-program-23q4/src/chart.png)\n\n## Berty Technologies (delivery May 2024)\n\nAfter successfully meeting their deliverables in Q3 and creating Gno Native Kit (formerly [GnoMobile](https://test3.gno.land/r/gnoland/blog:p/gnomobile)), Berty was awarded a second grant in Q4 to experiment with smart contract integrations around social media. Through the development of GnoSocial, the team has created a test bed for building decentralized social media-style apps and helped to stress test technical issues in Gno.land. \n\nIn Q4, Berty delivered V1 of GnoSocial, which includes basic Twitter-like functionality. GnoSocial will be implemented on mobile using the Gno Native Kit framework, with a minimal desktop app and a read-only web version also in the scope. Aside from this work, Berty contributes to Gno core development, helping raise issues and merge PRs. You can follow their progress in hackerspace [issue 51](https://github.com/gnolang/hackerspace/issues/51).\n\n## Teritori (delivery February 2024)\n\nAfter delivering the [moderation module](https://test3.gno.land/r/gnoland/blog:p/gnoland-moderation-dao-module) in Q3, Teritori received a second grant to carry out research and implement a conflict resolution module and an on-chain project management tool. Their work also continues on the escrow module build. As an active contributor, the Teritori team helps improve Gno core as well, getting more PRs merged, participating in regular meetings, and writing documentation. Read more about Teritori in their hackerspace [issue 7](https://github.com/gnolang/hackerspace/issues/7).\n\n## Dragos (Flippando, delivered January 2024)\n\nTo experiment with gaming in Gno.land, Dragos received a grant to port his on-chain memory game Flippando from Solidity. Flippando is a simple memory game—with a twist. Players uncover tiles and must find their matches to win the game. The result can be minted as an NFT and assembled to create larger, more complex NFTs and digital “paintings.” The beta version of [Flippando](https://gno.flippando.xyz/flip) is now live on the testnet, and you can read about his experiences in developing the game on the [Gno.land blog here](https://test3.gno.land/r/gnoland/blog:p/porting-flippando-gno) or visit [hackerspace issue 33](https://github.com/gnolang/hackerspace/issues/33).\n\n## Onbloc (ongoing)\n\nAfter producing consistently awesome work and being our longest-standing contributor, Onbloc received a grant in Q4 2024 to continue iterating on Gno.land tooling, Adena, and to help build Gno.land core in preparation for mainnet release. Part of the scope was to support contract-to-contract interaction [issue 757](https://github.com/gnolang/gno/issues/757), lead a [multi-node testnet initiative](https://github.com/gnolang/hackerspace/tree/main/multinode-testnet), write pure Gno packages, and help debugging the GnoVM, among many other initiatives. Onbloc is also adding additional security to the Adena wallet and an “Airgap” feature, which you can read more about in [hackerspace issue 29](https://github.com/gnolang/hackerspace/issues/29). We’ll also release a detailed blog post soon, so stay tuned.\n\n## Coming Up in Q1 2024\n\nWe’re looking forward to more exciting developments in the coming year as we focus on the road to mainnet. In Q1, grantees will mainly focus on debugging Gno core, developing smart contracts and libraries, building and porting dApps to Gno.land, and creating educational materials to help grow the community.\n\nBlockchain software and virtual reality technologies firm Varmeta are under evaluation for a grant to support account sessions and build the Gno.land Unity SDK to make blockchain more accessible to game developers (you can track their progress in [hackerspace issue 43](https://github.com/gnolang/hackerspace/issues/43)). We’re also finalizing a grant for a DAO tinkerer and a research report, as well as evaluating the extension of a second grant to Dragos to port his popular project management app to Gno.land. \n\n\n*We’re steadily building out the Gno.land platform and our ecosystem of grantees and contributors. Let us know if you want to join us by submitting an application at any time on the [Funding and Grants repository](https://github.com/gnolang/ecosystem-fund-grants). We’re always on the lookout for ideas to advance the platform.*\n\n\n","2024-02-07T13:37:00Z","christina,michelle","gnoland,funding,grants"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["wyg-dragos","Who You Gno – On the Record with Dragos Roua","\n\nDragos Roua is a humble man. If you had the chance to read his article, [*5 Things I Learned While Porting Flippando From Solidity to Gno*](https://test3.gno.land/r/gnoland/blog:p/porting-flippando-gno), you’d have seen him refer to Flippando as his “tiny little game” and describe his “surprise,” over it winning the Polygon track of the Glitch hackathon, two subsequent hackathons in South Korea, and piquing the interest of the Gno.land team to offer him a grant. If ever there were an inverse of “the empty vessel makes the loudest sound,” Dragos would be it.\n\nAt 54 years old, he’s lived an extraordinary life. Growing up in communist Romania, where scarcity was in abundance, and “everything was in short supply,” Dragos and his peers were “only allowed to learn one coding language,” and it happened to be called “Whatever.” So, when anyone asks in what languages he knows how to code, he always jokes that Romanians can code in “whatever.” Joking apart, his language skills are impressive, to say the least. \n\n## Dragos Knows a Lot of Code\n\n“My first production-level code was written in Cobol on punch cards,” he says when he was just 16. He went on to learn Smalltalk, Lua, and “just for fun,” even a programming language called “Brainfuck.” He spent many years programming in web2, iOS, and Andriod, but over the last seven years (since entering the web3 space), has been consistently working in JavaScript, Swift, Solidity (which he learned by creating Flippando), Python, and Go. Despite this, Dragos confesses he still feels more at home within the Apple ecosystem. “I've been building a lot there,” he says. \n\n## He Speaks Many Languages\nI ask if learning programming languages is similar to spoken languages. “Every programming language has vocabulary and grammar, which is a specific set of rules over that vocabulary, so it’s similar in that sense,” he says. And how many spoken languages does he know? “I can speak five Indo-European languages” (Romanian, English, French, Spanish, and Portuguese). “Five?” I gulp, wide-eyed, suddenly feeling inadequate for only speaking three. “Well, they all share about 70% of the vocabulary, and the grammar has almost the same rule set,” he shrugs, minimizing his accomplishment.\n\nHe’s also learning two Asian languages with varying degrees of success. Korean, a language he understands “some 40%” of, Dragos admits, is a different ballgame. “I've been frustrated for nine months, every day trying to plug away because there's literally no similarity in vocabulary between any Indo-European language and Korean. Literally no word is the same, and the grammar is also very, very different.” He explains that learning a language like Korean means starting from zero and waiting for the brain to forge the neural paths. “It's quite difficult to do,” he concedes.\n\n## A ‘Location-Independent’ Lifestyle \nI check out the backdrop behind him. He’s taking the interview from an elegant cafe in downtown Saigon with impressive dark wooden walls, large ceiling fans circling above, and a rich colonial atmosphere. “It’s such a posh place,” he smiles, “every day, there are groups of people taking pictures. It has an Indochina vibe.” I can’t help but wish I could teleport over and share a beer with Dragos as we discuss his remarkable life. “How long have you lived there?” I ask, “I don’t live in Saigon,” he replies, “I’m location-independent.”\n\nAs I wonder if that’s a more elegant term for “digital nomad,” Dragos quickly explains the difference. Digital nomads typically have no fixed abode, he says, and tend to set up a base for a short period of time before moving on to the next place. Location-independent is someone who has a base but is independent of it and chooses to spend longer periods of time in various places. “So I became a loner,” he says, “and I’ve been location-independent for six years. I spent my first two and a half years in Spain, then from Spain, I moved to Portugal, which is my base right now, and I started to explore Asia last year.”\n\n## A Love of the Open Road\nI point out how amazing his lifestyle sounds—and also how challenging it must be at times. Dragos loves the freedom that comes with being alone in a foreign land and the master of his destiny. He also thrives on learning from different people and cultures and discovering more about himself. “The more you travel, the more you learn. Where can you stay? Where can’t you stay? What is needed? You learn the logistics, and you become a much better administrator and manager of your life.”\n\nHe admits to feeling lonely at times. Being location-independent isn’t for everyone, and certainly not if you don’t like being alone. “It's very difficult to be on the road because you don't have many friends. You don't have a fixed social circle. I'm in a place right now where I'm quite comfortable with myself. I can spend long periods of time on my own without needing close encounters. I have a very limited circle of friends, which I keep in touch with every month or so.”\n\nThe cultural differences between Europe and Asia are something of a double-edged sword as well. Dragos likes Vietnam, where the people are friendly and welcoming and talk to him on the street out of curiosity or to practice their English. But he’s felt like quite an outsider in South Korea, where the culture of politeness and restraint makes it harder to establish meaningful friendships. \n\n## Astrology, AI, and Other Mind-Blowing Stuff\nTalking about human connections inevitably leads to the increasing lack of them—and the topic of AI. I ask how he feels about the prospect of AGI and a potential replacement species. He shrugs and points out that most of what we hear about AI is marketing. He thinks that LLMs (Large Language Models) will hit a wall when they run out of good data to be trained on. He is a little concerned about the prospect of election rigging and AGI being harnessed in the political sphere by nation-states attempting to outmaneuver each other by predicting the next plausible move. “But this is a can of worms,” he says.\n\n“Actually, at the most fundamental level, there is no difference between AI and the process by which we generate ChatGPT or any other language model, and… hold your breath,” he pauses, “astrology. They both take a set of arbitrary features and a set of desired outcomes. After that, they just do a lot of computation, by trying to minimize a cost function between the predicted and expected outcome. That's all there is to it. You take features, add some parameters, trillions of parameters, you run a lot of computation, and in the end, you have the most plausible outcome. LLMs do this in hours/days/weeks of training, astrology did it slowly, over the course of a few thousand years.” \nI ask Dragos if he hadn’t been a programmer, would he have perhaps become an astrologer instead? “I actually studied astrology and used it for 18 years,” he replies.\n\nI try hard not to fall off my chair. Dragos explains that astrology plays a huge role in his life, and he consults it before making any major decision—such as moving countries or leaving jobs. “I consult it on every major decision and even daily life. So wherever I have to, I use it. When I sold one of my companies, when I decided to move abroad, when I travel, and stuff like that.” He gives the analogy of meteorology and says if he knows it’s going to rain, he’ll take an umbrella to have less friction and move around more easily. In the same way, he applies astrology to his life. This man is a Pandora’s box.\n\nWhat else does he do in his spare time besides traveling the world, consulting the Cosmos, and writing code for fun? Dragos likes playing pool, socializing, dining out, and dancing. “I was a tango dancer back in Romania. I had a tango school for a year.” At this point, I’m hardly surprised. \n\n## Dragos on Gno.land \nI met Dragos last year in Seoul at a Gno.land event hosted with Onbloc during BUIDL Asia. That’s when he spoke to Manfred about Flippando and subsequently applied for a grant. We were still building the specs for the Grants Program at the time, and Dragos was our first grantee. Since then, he’s embarked on a whole new journey learning Gno and building the airplane as it flies, delivering Flippando last month and regularly helping the team with Gno.land core issues.\n\nDragos has since submitted a second grant proposal to port his project management app to Gno. “It uses my life management framework, which I call “assess, decide, do.” The name of the project is *ZenTasktic*. There is already an app on iOS that I wrote,” he explains. You can read more about his grant proposal [here](https://github.com/gnolang/ecosystem-fund-grants/pull/11) and be sure to test out [Flippando](https://gno.flippando.xyz/flip) today.\n\nI apologize for taking so much of Dragos’ time, but he assures me it isn’t a problem. “I don’t work today, I'm not busy. I'm just enjoying my afternoon in this coffee shop.” As Dragos sips on the local tipple and drinks in the sights and sounds around him, I can’t help but admire his outlook on life and the choices he’s made—and I look forward to seeing what he's up to next and what else he builds with Gno.\n","2024-02-08T00:00:00Z","christina","whoyougno,flippando,community,interview"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"q8OcTk2+Z+0Onmt9cS8+G/6Xu9PwAqHXQSa6ONGTLfYv1AwIMwH+4yjclvRSH7KviOHRdMokRtgfbgBN0q/bhw=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["gnoland-moderation-dao-module","Gno.land Moderation DAO Module","\r\n# Gno.land Moderation DAO Module\r\n*This blog post is written by the Teritori team, whose focus is to allow organizations to communicate and interact in a resilient and transparent way. Teritori is a partner and grantee of Gno.land.*\r\n\r\nWhen it comes to the complex subject of discussion forums and decentralized social networks, numerous technical and philosophical questions arise.\r\nImagining a 24/7 online communication system whose administration cannot be compromised or censored by any entity or individual is one of the most intriguing challenges of the decade.\r\nApproximately 10 months ago, the Teritori core team decided to explore the new possibilities offered by Gno.land on the theme of decentralized moderation and to build the foundation for future generations of developers to create resilient, robust, and autonomous applications.\r\n\r\n## The vision\r\n\r\n### About Teritori\r\n\r\nTeritori is a decentralized Operating System for individuals \u0026 communities that allows organizations to communicate and interact in a resilient and transparent way. Its core components include the creation of a decentralized User Profile for individuals \u0026 organizations as well as a dApp Store allowing users to pick their favorite services for daily usage and developers to list their product in order to grow their user base. Finally, Teritori backbone, its P2P messenger application that will enable users to create resilient token-gated groups in a click will even allow non-crypto-native users to get onboard as this feature doesn't even require a wallet connection to get started.\r\n\r\n### Teritori \u003c\u003e Gno.land\r\n\r\nConvinced of the benefits of offering a contribution-based consensus model and taking advantage of an interpreted version of Golang, the Teritori core team aims to become one of the most prolific contributors to Gno.land. Our plan is to focus on features that enable the coordination of organizations and individuals via governance, communications, and collaboration. Eventually, all the features listed on Teritori will be accessible in the Gno.land network, contributing to the growth of the ecosystem.\r\n\r\n### PoC and iterations\r\n\r\nAnother important point to emphasize is that the Teritori core team intends to improve the features it deploys on Gno.land by taking advantage of the user test phases to collect feedback that will enable iteration and improvement of the service. As a result, the “Proof-of-Concept” (“PoC”) presented in this article will be subject to updates and evolutions, which will be communicated in due course, as will the associated test phases.\r\n\r\n## What is the Gno Moderation Module?\r\n\r\nThe Gno Moderation Module is a smart contract (“realm”) that enables a decentralized, autonomous organization (DAO) to manage the moderation of a forum or social thread through a transparent on-chain vote.\r\n\r\n### Let’s take an example:\r\n\r\nImagine a simple social network similar to Instagram, in which all content is decentralized (using IPFS for images, videos, music etc.). For each post, users sign in via their wallet to post content, and no centralized administrator can delete this content. The freedom offered by this type of decentralized application is immense since even as developers of the application, it is impossible to delete the content. Therefore, we can consider this “space of freedom” as a “common space” unlike any application owned by a private company and hosted on centralized infrastructure.\r\nWith this radical freedom for the user comes a great responsibility— to collectively ensure the security of this space rather than delegating the responsibility to moderators employed by a commercial enterprise. This is why we’ve created the “Gno Moderation Module.”\r\n\r\n### How does it work?\r\n\r\n[![moderation_flow v0.1](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/thumbs/moderation_flow_v0.1.png)](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/moderation_flow_v0.1.png)\r\n\r\nThe Gno Moderation Module allows users to notify the moderation DAO community that they wish to report content. Through this action (permitted by the smart contract), they inform the DAO community that the content is inappropriate.\r\n\r\n[![content flag](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/thumbs/content_flag.png)](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/content_flag.png)\r\n\r\nOnce the content has been reported a certain number of times (10 times in this PoC) by users (who may or may not be members of the Moderation DAO), an on-chain proposal is automatically created.\r\n\r\n[![moderation dao feed](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/thumbs/moderation_dao_feed.png)](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/moderation_dao_feed.png)\r\n\r\nThis on-chain proposal is then listed in the Moderation DAO tab on the Social Feed as well as on the Moderation DAO profile proposals feed so all Moderation DAO members can vote on it. A debate can take place to discuss the best choice for the content.\r\n\r\n[![moderation dao vote](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/thumbs/moderation_dao_vote.png)](https://gnolang.github.io/blog/2023-10-19_dao-moderation-module/src/moderation_dao_vote.png)\r\n\r\nModeration DAO members have three voting options:\r\n- Ban the content in question\r\n- Abstain\r\n- Do not ban the content in question\r\n\r\nOnce the required vote quota has been reached, the contract automatically executes the voted decision.\r\n\r\n## The Current Status:\r\n\r\nThe Teritori core team received a grant from the Gno.land core team to build the necessary tools for decentralized moderation.\r\n\r\nTo accomplish this task, we divided our work into five main stages:\r\n1. Build “DAO” standards to establish the fundamental building blocks and ensure a modular approach in the long term for various tools.\r\n2. Build a “DAO” deployer that allows non-tech users to easily utilize the different standards.\r\n3. Build a customizable Moderation Module that can cater to a wide range of use cases. For example, if we replace the social feed with a service marketplace, the Moderation Module can transform into a “Justice Module” that resolves conflicts between sellers and buyers on a decentralized platform and serves as an escrow system.\r\n4. Develop the user experience that allows for large-scale experimentation with the Moderation Module within a dedicated context of an active social feed. Here, we created a social feed realm and enabled non-developer Gno.land users to participate in the full-scale experience.\r\n5. Establish interactions between smart contracts (r/boards, r/socialfeed, /r/users), conduct experiments to enhance their security, and identify emerging needs for these innovative use cases.\r\n\r\n### What does a DAO realm look like?\r\n\r\n- We decided to build two different DAO standards, using two different approaches of modularity:\r\n- Aragon DAO Standard, based on the amazing work of [the Aragon team](https://aragon.org/) (using Solidity)\r\n- [DAODAO](https://github.com/DA0-DA0) smart contract, using CosmWasm, that allows more modularity.\r\n\r\n\r\nHere is an example, with the DAODAO contract ported into Gnolang:\r\n[Source](https://testnet.gno.teritori.com/r/demo/dao_realm_v6/dao_realm.gno)\r\n\r\n```go\r\npackage dao_realm\r\n\r\nimport (\r\n\t\"encoding/base64\"\r\n\t\"std\"\r\n\t\"strings\"\r\n\t\"time\"\r\n\r\n\tdao_core \"gno.land/p/demo/daodao/core_v16\"\r\n\tdao_interfaces \"gno.land/p/demo/daodao/interfaces_v16\"\r\n\tproposal_single \"gno.land/p/demo/daodao/proposal_single_v16\"\r\n\tvoting_group \"gno.land/p/demo/daodao/voting_group_v17\"\r\n\t\"gno.land/p/demo/ujson_v5\"\r\n\t\"gno.land/r/demo/groups_v22\"\r\n\tmodboards \"gno.land/r/demo/modboards_v9\"\r\n)\r\n\r\nvar (\r\n\tdaoCore dao_interfaces.IDAOCore\r\n\tmainBoardName = \"dao_realm\"\r\n\tgroupName = mainBoardName + \"_voting_group\"\r\n\tgroupID groups.GroupID\r\n)\r\n\r\nfunc init() {\r\n\tmodboards.CreateBoard(mainBoardName)\r\n\r\n\tvotingModuleFactory := func(core dao_interfaces.IDAOCore) dao_interfaces.IVotingModule {\r\n\t\tgroupID = groups.CreateGroup(groupName)\r\n\t\tgroups.AddMember(groupID, \"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c\", 1, \"\")\r\n\t\tgroups.AddMember(groupID, \"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv\", 1, \"\")\r\n\t\tgroups.AddMember(groupID, \"g14u5eaheavy0ux4dmpykg2gvxpvqvexm9cyg58a\", 1, \"\")\r\n\t\tgroups.AddMember(groupID, \"g1ckn395mpttp0vupgtratyufdaakgh8jgkmr3ym\", 1, \"\")\r\n\t\tgroups.AddMember(groupID, std.GetOrigCaller().String(), 1, \"\")\r\n\t\treturn voting_group.NewVotingGroup(groupID)\r\n\t}\r\n\r\n\tproposalModulesFactories := []dao_interfaces.ProposalModuleFactory{\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.IProposalModule {\r\n\t\t\ttt := proposal_single.Percent(100) // 1%\r\n\t\t\ttq := proposal_single.Percent(100) // 1%\r\n\t\t\treturn proposal_single.NewDAOProposalSingle(core, \u0026proposal_single.DAOProposalSingleOpts{\r\n\t\t\t\tMaxVotingPeriod: time.Hour * 24 * 42,\r\n\t\t\t\tThreshold: proposal_single.Threshold{ThresholdQuorum: \u0026proposal_single.ThresholdQuorum{\r\n\t\t\t\t\tThreshold: proposal_single.PercentageThreshold{Percent: \u0026tt},\r\n\t\t\t\t\tQuorum: proposal_single.PercentageThreshold{Percent: \u0026tq},\r\n\t\t\t\t}},\r\n\t\t\t})\r\n\t\t},\r\n\t}\r\n\r\n\tmessageHandlersFactories := []dao_interfaces.MessageHandlerFactory{\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\treturn groups.NewAddMemberHandler()\r\n\t\t},\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\treturn groups.NewDeleteMemberHandler()\r\n\t\t},\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\t// TODO: add a router to support multiple proposal modules\r\n\t\t\tpropMod := core.ProposalModules()[0]\r\n\t\t\treturn proposal_single.NewUpdateSettingsHandler(propMod.Module.(*proposal_single.DAOProposalSingle))\r\n\t\t},\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\treturn modboards.NewCreateBoardHandler()\r\n\t\t},\r\n\t\tfunc(core dao_interfaces.IDAOCore) dao_interfaces.MessageHandler {\r\n\t\t\treturn modboards.NewDeletePostHandler()\r\n\t\t},\r\n\t}\r\n\r\n\tdaoCore = dao_core.NewDAOCore(votingModuleFactory, proposalModulesFactories, messageHandlersFactories)\r\n}\r\n\r\nfunc Render(path string) string {\r\n\treturn \"[[board](/r/demo/modboards:\" + mainBoardName + \")]\\n\\n\" + daoCore.Render(path)\r\n}\r\n\r\nfunc VoteJSON(moduleIndex int, proposalID int, voteJSON string) {\r\n\tmodule := dao_core.GetProposalModule(daoCore, moduleIndex)\r\n\tif !module.Enabled {\r\n\t\tpanic(\"proposal module is not enabled\")\r\n\t}\r\n\tmodule.Module.VoteJSON(proposalID, voteJSON)\r\n}\r\n\r\nfunc Execute(moduleIndex int, proposalID int) {\r\n\tmodule := dao_core.GetProposalModule(daoCore, moduleIndex)\r\n\tif !module.Enabled {\r\n\t\tpanic(\"proposal module is not enabled\")\r\n\t}\r\n\tmodule.Module.Execute(proposalID)\r\n}\r\n\r\nfunc ProposeJSON(moduleIndex int, proposalJSON string) {\r\n\tmodule := dao_core.GetProposalModule(daoCore, moduleIndex)\r\n\tif !module.Enabled {\r\n\t\tpanic(\"proposal module is not enabled\")\r\n\t}\r\n\tmodule.Module.ProposeJSON(proposalJSON)\r\n}\r\n\r\nfunc getProposalsJSON(moduleIndex int, limit int, startAfter string, reverse bool) string {\r\n\tmodule := dao_core.GetProposalModule(daoCore, moduleIndex)\r\n\treturn module.Module.ProposalsJSON(limit, startAfter, reverse)\r\n}\r\n```\r\n\r\n### Public Grant Report:\r\n\r\nYou can find the full report of [Teritori Core’s journey here](https://github.com/gnolang/hackerspace/issues/7). \r\n\r\n### Resources:\r\n\r\nDocumentation:\r\n- [Gno Moderation DAO](https://github.com/TERITORI/gno/blob/teritori-unified/examples/gno.land/r/demo/teritori/MODERATION_DAO.md)\r\n\r\nPackages:\r\n- [https://testnet.gno.teritori.com/r/demo/groups_v22](https://testnet.gno.teritori.com/r/demo/groups_v22)\r\n- [https://testnet.gno.teritori.com/p/demo/daodao/interfaces_v16](https://testnet.gno.teritori.com/p/demo/daodao/interfaces_v16)\r\n\r\nTutorial:\r\n- [Gno.land Social Feed Moderation on Teritori](https://teritori.gitbook.io/teritori-whitepaper/gno.land/introducing-gno.land-social-feed-v0.1#social-feed-moderation)\r\n","2023-10-19T01:50:00Z","ferrymangmi,zxxma,michelleellen","gnoland,dao,moderation,teritori"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"DacykX1WjmUNSwbSgwELLw2pksaQWm0uNVLwYFdiTBFkdcwOLfOcndQTgH0ghSAbIpOFhhUI5fxdqrkswr4cgg=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["wyg-dongwon-shin","Who You Gno – On the Record with Dongwon Shin","\n*Who You Gno is intended to shine a light on the builders, contributors, and generally brilliant humans behind the tech. We’re excited to kick off this series with Dongwon Shin, the co-founder and CEO of one of Gno.land’s longest-contributing teams, Onbloc, a South Korean-based blockchain software company that builds key infrastructure and tooling for Gno.land*\n\nSince embarking on their Gno journey in late 2021, Dongwon and his team have been among the most active gnomes embodying the values of the Gno project: hardworking, passionate, honest, and humble, to name a few. You may already be familiar with Onbloc’s projects [Adena](https://adena.app/), [Gnoscan](https://gnoscan.io/), and [Gnoswap](https://github.com/gnoswap-labs) more about this can be found in [Onbloc's Hackerspace journey](https://github.com/gnolang/hackerspace/issues/29). In this interview, we’ll get the latest updates on these projects, hear about Dongwon the person, and learn more about what motivates him to be a gnome. Check it out.\n\n## Dongwon’s life before coding\nIt’s a cold November morning in Seoul, and Dongwon is in the office early after sleeping just a few hours. Speaking to him from Dubai, where “cool” is 30 ℃, it’s -1 ℃ in Korea. “I hope you’re keeping warm,” I smile, “Yeah,\" he laughs, “it’s not too bad.” Dongwon’s been in the industry since 2015 when web3 was still called “crypto,” ICOs were selling snake oil, and his compatriots were busy paying above the market price for bitcoin in a phenomenon called the “Kimchi premium.”\n\nAt the time, he was traveling the world as a professional e-sports gamer which saw him leaving Korea and living in San Francisco and L.A. for several years. “I had lots of tournaments to compete in, so I had to travel to many other countries,” he says, “while traveling, I learned about other cultures and people, and new experiences. It was really eye-opening, you know, it really helped make me who I am today.”\n\nAnd who is Dongwon today? \n\nAmbitious, driven, and one of the kindest, most genuine people you could ever meet. “I like challenges, and I’m very competitive,” he says. “I can't just do regular jobs. I get bored quickly, so I need to find something very competitive and hard that makes me stressed.” I point out that he’s in the right place, and he laughs. He explains that he used to spend an entire week, sometimes two, learning a game before a tournament, almost around the clock. “I had to put everything I have into winning that game, right?” He views working in web3 the same way.\n\n## The intersection between e-gaming and blockchain\nDongwong is clearly comfortable on the cutting edge in emerging industries that “are often looked down on,” like e-gaming and crypto. He takes great satisfaction in how they’ve both grown. “My parents were saying, 'Just go study,' while I was playing games, but e-sports has grown a lot. Right now, the industry is really big, and it's kind of the same with crypto.” He adds, “I like getting in early when other people are not interested and finding an opportunity there.”\n\nWhen looking to retire as a professional gamer, he found his home right away in web3, working with a blockchain consultant and the sports and entertainment-focused [Chiliz project](https://www.chiliz.com/), before launching his own blockchain consulting and development firm. “I didn't think I was going to be just a regular employee for a big company. So I wanted to start my own business,” he says.\n\n## Getting to Gno… Gno.land\nHow did Dongwon hear about Gno.land? \n\n“My co-founder, Peter, and I were long-time followers of the Cosmos ecosystem, and we found out that Jae was working on a new project called Gno.land in late 2021. We really liked the vision behind Gno.land, why he started, and what he wants to achieve. We value transparency, fairness, and censorship resistance, so we read all the documentation and his initial codebase and decided we should be part of his new initiative. We started Onbloc in early 2022.”\n\nDongwon didn’t know Jae personally, but he felt strongly aligned with his vision and what Gno.land aims to achieve. Also, his reputation as the founder of Tendermint and Cosmos preceded him. Dongwon’s co-founder, Peter, was also working on a project called Lunagram, a Cosmos wallet integrated with Telegram. Peter had fond memories of Jae, being very supportive of experimental projects, including his own, in the early days of Cosmos.\n\n## Building tools… Adena, Gnoscan, Gnoswap\nOnbloc has since become Gno.land’s most prolific contributor, launching the [Gnoscan](https://gnoscan.io/) block explorer and the [Adena](https://adena.app/) wallet, as well as creating tutorials and blogs to help onboard developers to Gno, and creating Gno.land’s first AMM DEX Gnoswap, the beta version of which is estimated for December this year. “Currently, the team is focused on developing Gnoswap, integrating [the realms and APIs](https://github.com/gnoswap-labs/gnoswap) with [the interface](https://github.com/gnoswap-labs/gnoswap-interface), enhancing the swap function and liquidity pools, and some additional features. We expect to launch the beta in about a month, so we’re quite excited!”\n\nAs for Adena, the defacto Gno.land wallet, “It's already production-ready, but we want to improve our UX, and UI to provide more secure ways of using a web3 wallet.” To achieve this, Onbloc is adding a feature called [Air-Gap](https://en.wikipedia.org/wiki/Air_gap_(networking)) which allows the wallet to be used in an offline environment, without the user needing to import their keys to Adena. “They can just use Adena as a broadcaster,” Dongwon explains. “I think this kind of feature is needed for enhancing security and educating people to use noncustodial products in a secure way.”\n\nOnbloc is also a [Q4 2023 grantee](https://test3.gno.land/r/gnoland/blog:p/funding-program-23q3) and will develop core Gno.land infrastructure in preparation for mainnet. “We are working on three key features,” Dongwon explains. “The first is contract interaction. So it's a way for a realm to interact with other realms. The second is porting essential Go packages to Gno, and the third is a multi-node testnet.” All in addition to Onbloc’s continued efforts on Gnoswap, Gnoscan, and Adena. “You’re keeping busy, then?” I ask. “All our hands are full now,” he laughs.\nI ask what he does in his free time and – in fact – whether he has any. “Not much,” he jokes, “but I like spending time with my son and playing board games together. He’s seven years old, and we are like friends.” Dongwon also likes to unwind by reading books when his son is asleep. One of his favorites is [*The Secret*](https://en.wikipedia.org/wiki/The_Secret_(Byrne_book)); he was “really inspired by the concept” when he was younger. I ask if he sees it working in his daily life and whether he believes he manifests what he wants into existence, “Definitely,” he replies without hesitation.\n\n## Dongwon’s conviction in Gno.land\nNot only is Dongwon working night and day, but he has bootstrapped his team from his own pocket to go all in on Gno.land. What makes his conviction so strong? “I truly believe that the Gno.land blockchain is the next generation of the blockchain industry. Gno.land is trying to invite web2 developers into web3 and providing all these developer-friendly tools so they don't need to learn a new language to get into the ecosystem. GnoVM, Tendermint2, everything is so transparent and simple.”\nHe believes Gno.land will be “one of the greatest experiments in the crypto industry” thanks to its fair rewards and contribution-based governance. “I'm really excited about this initiative, and all our team members are well-aligned to support this vision. We want to do our part to achieve the success of Gno.land.”\n\nI thank him for his time and ask if there’s anything he would like to add. He pauses for a moment and then says, “If you're building a dApp or looking for a new opportunity in a new ecosystem, I think this is your chance. I hope to see great developers and teams getting into Gno.land. Let’s make this ecosystem great together.”\n","2023-11-24T00:00:00Z","christina","whoyougno,onbloc,community,interview"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"ViCQ77dDmqpMLbCm8An4W+yOQDaJVd5K2HUp7c0dtoJWcslZyslwR4xb2Sc6kA8RTriynFtyExf69uRW3mMSiA=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-6","The More You Gno: Gno.land Monthly Updates - 6","\n\nWelcome to the latest edition of The More You Gno, your regular source of updates from the Gno.land core team and contributor ecosystem. There’s a lot to cover this month, from a company engineering retreat to new core members and contributors. We’ve made progress across the board to fix important bugs and issues and provide additional features. There’s a new way to dynamically call realms, Gno.land’s tokenomics and governance are advancing, our standard library list is expanding, and our grantees are killing it with their deliverables. Without further ado, let’s dive in.\n\n## Gno Core Team Updates - TL;DR\n\nOnly got time to skim the updates? You’ll find the highlights in the list below. If you want to dive deeper into the topics, track our progress, understand the rationale behind our decisions, or explore the issues we came across, grab a coffee, kick back, and savor the full details.\n\n* **The Portal Loop** – Much of our focus over the past few months has been on the Portal Loop [(issue 1108)](https://github.com/gnolang/gno/issues/1108), which will make developing on Gno smoother, faster, and more intuitive. The Portal Loop will speed up deploying dApps and improve the UX for Gno.land devs.\n\n* **Dynamic Realm Caller** – We’ve added a new way to call realms dynamically so that dApps no longer have to manually import GRC20/721 tokens [(PR 1262)](https://github.com/gnolang/gno/pull/1262).\n\n* **DAO Structure \u0026 Tokenomics** – We’re close to finalizing the DAO structure of Gno.land and its tokenomics. There will be three main DAOs, GovDAO, EvaluationDAO, and SupportDAO. We’re exploring staking options for GNOT holders and working on transaction fees and gas.\n\n* **Gno Playground** – Gno Playground is an awesome way for developers to collaborate, share, and test their code. The full version isn’t ready yet, but we’re sharing the beta with anyone who wants to help us iterate and improve this week.\n\n* **Gno Standard Libraries** – In [issue 1267](https://github.com/gnolang/gno/issues/1267), you can find our current wishlist for Gno standard libraries. If you want to see what we have and what’s lacking, or you want to contribute, open an issue or a PR.\n\n* **Gno Language Server (Gnols)** – An implementation of the [Language Server Protocol (LSP)](https://microsoft.github.io/language-server-protocol/) for Gno, Gnols makes writing code simpler and works with several editors. Visit the [CONTRIBUTING.md file](https://github.com/gnolang/gno/blob/master/CONTRIBUTING.md#vim-support-with-lsp) to try it out.\n\n* **RustVM Implementation** – The RustVM implementation is almost ready and is in the debugging stages. We’re also looking at adding a Jit compiler and researching the topics of determinism and concurrency.\n\n* **Bytecode Go VM Implementation** – The Parscan project is progressing well toward completion of the spec. We look to provide support for interfaces in the interpreter by extending the standard reflect package, also to the benefit of the entire Go community.\n\n### Engineering Retreat\nGno core engineering team got together last month in our first company-wide retreat. It was an invaluable opportunity to work face-to-face, brainstorm ideas, code together, and fix several high-level concerns. We made many improvements to the technical aspects of the project, including major advances on the Portal Loop, and strengthened our alignment through team bonding activities, socializing, and having fun. \n\nWe made multiple bug fixes and resolved many of the issues that arose out of [GnoChess](https://github.com/gnolang/gnochess) development, and Manfred and the Onbloc team (who joined us on the retreat) demonstrated a new way to dynamically call contracts using dependency injection with a registry. This, combined with Golang's interface capabilities, can achieve a good balance between dynamism, explicitness, and security (including type safety). This pattern could enable massive DeFi applications when used with GRC interfaces. It could also support contract-based DAOs where features can be added later, opening the door to new design patterns around contract upgrades. Check out [PR 1262](https://github.com/gnolang/gno/pull/1262) for more details. \n\nIt was invaluable for everyone to get plenty of 1:1 time with Jae. Morgan was able to bring the Native Bindings topic ([PR 859](https://github.com/gnolang/gno/pull/859)) much closer to completion. This has been a recurring theme in our developer calls for the last few months as it’s a complex topic that aims to change how Gno can use Go code while still being understood by static analysis tools like gno doc. Michael got greater clarity over the DAO structure and GNOT tokenomics, Milos was able to merge [PR 546](https://github.com/gnolang/gno/pull/546), after many months of effort, which adds file-based transaction indexing, and Thomas created instructions for getting started with the Gno Language Server (gnols), to give just some examples. It was productive and enjoyable and unblocked many issues. \n\nAiB engineers were also at the retreat, Zooma from Teritori, and Dongwon, ByeongJun, and Ray from Onbloc, creating plenty of opportunities for interesting discussions and showcasing our work. We also welcomed new core members Dylan and Danny to the team. Dylan is a senior software engineer, and Danny is supporting DevEx. We enjoyed meeting and hacking together with like-minded people and would like to do it more often with a broader audience. How about a Gnome contributor festival next year? Stay tuned.\n\n### Gno.land DAOs and Tokenomics\nThroughout the retreat and ongoing, we’ve made major advances to the DAO structure for Gno.land and the tokenomics of the chain. We’re still hammering out the final details, but we’ve decided on three main DAOs – GovDAO, EvaluationDAO, and SupportDAO – that will work together alongside other domain-specific DAOs, such as EngineeringDAO or ProjectsDAO, making Gno.land more decentralized over time. \n\nThe multi-tiered GovDAO will be responsible for voting on all decisions that affect the chain, such as parameter changes or validator acceptance/denial. GovDAO members will assess new contributors to the chain and allocate them a score and corresponding membership tier. EvaluationDAO will assist with specific contributions, lending its expertise and critic reviews as needed. SupportDAO will provide knowledge-specific services such as HR, marketing, and finance.\n\nRegarding transaction fees, we're exploring something similar to how Ethereum deals with gas in its EIP 1559 update. Essentially, a combination of comparing a new block’s size with the last block to gauge demand and some small parameters we’re looking at. We’re also experimenting with staking alternatives where contributors can stake their tokens to support certain projects in return for staking rewards. It’s still early days, so watch this space. We’ll be releasing more details soon. \n\n### Gno Playground\nGno Playground is a simple web interface that lets you share your code, run unit tests, deploy your realm and package, and execute functions in your code using the repo for a smoother and more collaborative developer experience. We’re excited to release Gno Playground out in the wild later this month in a soft launch set for November 28. If you’re interested in testing it out, head over to our Discord channel. We’re looking for feedback and help to identify bugs and improve the UX before its full launch in the new year. It will be interesting to see how people interact with the Playground and how they use it so we can iterate and attract more gnomes to our growing community.\n\n### The Portal Loop\nThe Portal Loop is an effort to create a continuously-deployed staging testnet to be hosted on the official [gno.land website](https://gno.land). The testnet will be reset at each commit on our repository, but it will re-play all the transactions from its previous version, dropping any that might fail following breaking changes in the code. The Portal Loop will provide a central place where you can experiment with the latest Gno.land updates, resolving the problem our existing testnets have faced (becoming stale only a few months after their launch) while also paving the way for building DAOs and on-chain Game of Realms and Proof-of-Contribution systems. \n\nWithin the Portal Loop efforts, we’re also building systems to more efficiently iterate locally on your Gno realms, similar to the previously described testnet. The Portal Loop will help to create an iterative cycle focused on development, testing, and feedback, enhancing local development and the Gno.land website. As developers are discovering, when building dApps like GnoChess, GnoMobile, or Flippando, they run into issues with the repo, GnoVM, and client libraries when developing locally.\n\nThe Portal Loop will enable much quicker feedback so we can iterate, uncover, and fix problems faster. Devs will get a greatly improved UI, with UX contributions and issues much easier to resolve, and the same CI/CD experience as web2 applications, where each time something is published on Git, they get instant feedback on how it works in staging, not only in terms of code but also in terms of data. Stay tuned, the Portal Loop is coming soon!\n\n### Standard Library Wish List\nThe standard library wish list in [issue 1267](https://github.com/gnolang/gno/issues/1267) is intended to be a starting place for anyone who wants to add new standard libraries to Gno. It's an opinionated collection of libraries that we would like to see added. So, if you see something missing that you’d like added to our standard libraries, leave a comment explaining your reasoning. If you want to port over a standard library from the list, make an issue for it and assign yourself, or if you can do it quickly, make a PR referencing the issue. You can see the global status of our standard libraries (as compared to Go) on our [Go\u003c\u003eGno compatibility document](https://github.com/gnolang/gno/blob/d421b963aed7f7c3ba3718edfc6fbd787fa8f0dd/docs/reference/go-gno-compatibility.md).\n\n### Dreaming with SOGNO\nThe Sogno project is a [dream](https://www.wordreference.com/iten/Sogno) Morgan has about improvements he plans to make on GnoVM. From his experience working on GnoChess, he found that many features were lacking that would have improved the workflow, for example, an improved debugging system, enhanced representation of the values within the VM, having maps as sortable data structures, and adding reflection. Morgan plans to work on this project on the side as a fork when he has time, so Sogno won’t be merged into the master branch for now. If you want to check it out and see if you can contribute, visit the [hackerspace PR 44](https://github.com/gnolang/hackerspace/pull/44).\n\n### The Future of the Gno Language Server (Gnols)\nThe [Gno Language Server (gnols)](https://github.com/gno-playground/gnols) is an implementation of the [Language Server Protocol (LSP)](https://microsoft.github.io/language-server-protocol/) for the Gno programming language. It is similar to the equivalent “gopls” project for Go, as they can be plugged into your code editor through extensions and allow you to access handy features, such as autocompletion, formatting, and compile-time warnings/errors. Gnols makes writing code simpler, working with several editors to suit your preferences. To try it out, visit the [CONTRIBUTING.md file](https://github.com/gnolang/gno/blob/master/CONTRIBUTING.md#vim-support-with-lsp), which contains instructions to get you started. Our current documentation targets Vim, Neovim, and SublimeText, but can likely be used with any editor that supports LSP. Feel free to contribute to improving Gnols and adding more features. It’s well-written, and simple to dive into the code and add more capabilities.\n\n### RustVM Implementation\nPetar continues progressing on the RustVM implementation and has almost finished, apart from a few bug fixes. As the design is now complete, he will enter the testing stages. He is also looking at how to add a Jit compiler to the current design. Petar was initially concerned that the garbage collector might have presented serious issues, but this has turned out not to present a problem. Adding a Jit compiler will require a lot of work (at least six months) to support everything in the language, but it should be possible.\n\nPetar is also looking at implementing concurrency the way it is in Go to have a fully functional virtual machine as it is in the spec. This would likely attract more external contributors to developing the VM. One advantage of Rust is that, with the concurrency model, there is already an extensive library called [Tokio](https://tokio.rs/) which he can use. Petar stresses that this isn’t easy, but he believes it’s achievable, at least as a research topic around determinism and concurrency.\n\n### Go Bytecode VM Implementation\nMarc continues to develop Parscan, another bytecode VM, but entirely based on the Go runtime, with the advantage of reusing the type-checking system, concurrency model, and memory management already part of the existing Go runtime. In the last month, the support for all missing declaration statements (constants, variables, and types) was added in the code generator.\n\n## Grantee and Ecosystem Updates\nOur ecosystem partners and grantees are working flat out on their contributions. We’re close to seeing the on-chain memory game Flippando launch, Adena and Gnoswap are incorporating some major new features, Zack’s released another informative tutorial as part of the Go to Gno series, and we’ve received several new grant proposals as well. We’ve even welcomed a new contributing team, Varmeta, to the fold. Scroll through the details below.\nTL;DR?\n* On-chain memory game Flippando is coming soon\n* Gnomobile is almost complete and will be receiving a rebrand soon\n* Gnosocial will allow devs to experiment with social media dApps\n* Experiment with content moderation using the ModerationDAO or create your own DAO\n* Gnoswap AMM DEX beta will launch in December\n* Adena to implement new ‘Air-Gap’ feature\n* Varmeta is working on Gno.land Unity SDK to make Gno more accessible to game developers\n\n### Dragos\nDragos has been working on porting his on-chain memory game Flippando from Solidity to Gno, and we’re looking forward to playing it soon after seeing an awesome demo earlier this month. When you play Flippando, you uncover a matrix of matching visual symbols. There are 2 levels of difficulty (matrix made of 16 tiles or 64 tiles). For the launch, Dragos aims to have visual symbols containing basic colors, dice, hexagrams, or various gradients. Once you’ve matched all the pairs and completed a matrix, you mint an NFT that can be assembled as artwork on-chain and traded in a marketplace. Dragos is currently looking at the initial tokenomics for Flippando, with a fixed supply of 1 billion and no airdrop distribution (more details soon). \n\nDragos has been a mobile app developer for over 10 years, with an interest in blockchain for around seven years. He enjoys working with Gno, although having to reset the chain and redeploy programs each time he makes a change was a challenge. The Portal Loop solves these issues in local development and will allow him to deploy Flippando sooner. As part of the work for Flippando, Dragos also added [PR 1309](https://github.com/gnolang/gno/pull/1309) to improve our GRC721 implementation]. He is also applying for a grant to port his project management system on-chain for Gno, and he gave us a [demo](https://drive.google.com/file/d/1eJGyATHhEzletWwQ4Xt_9ON7L231Yvow/view). An on-chain project management tool will be essential for organizing the DAO system, focusing on our team’s needs, organizing tasks, setting goals, and more. Keep up with Dragos’ progress by visiting his [hackerspace](https://github.com/gnolang/hackerspace/issues/33).\n\n### Berty\nBerty has been powering ahead with Gnomobile (which will soon receive a new name to better reflect its functionality), Gnosocial, and Gno core. Some highlights include significant progress on the GRPC interface (see [demo video]https://www.loom.com/share/d1cef60199c0487e86deab2a9e61d61c). As the interface to Protobuf has many more data types available than the interface to the language bridge, GRPC greatly simplifies the app and improves the UX. The API is almost complete and now includes wallet functions, such as creating an account and restoring an account from the recovery phase, and an event stream when calling a realm function [(demo video available here)](https://www.loom.com/share/42f2dcb0b4a34f77a95a0f8012e4b52b).To help developers, Gnomobile also includes example apps. Here is a [demo video](https://www.loom.com/share/41a20a764f0f4caf91f068b62e1f16c4) of the latest minimal hello app.\n\nBerty created [PR 1235](https://github.com/gnolang/gno/pull/1235) relating to Amino. They start with a Go struct and add comments explaining all the fields. Previously, when they ran Amino and generated a Protobuf structure, all their comments disappeared. This PR allows them to preserve the comments. They also created [PR 1213](https://github.com/gnolang/gno/pull/1213) since Amino should create a Protobuf structure where the fields follow official naming conventions. Thanks to help from the Gno devs, these PRs are merged.\nBerty is also focused on building a decentralized social media application using the Gnomobile framework, which is almost complete. The aim is to create a testbed where dApp builders can see how their implementations integrate and function with web2-like social media features, opening the door to interesting experiments such as DAO collaboration and content modification. Berty is building a decentralized Twitter-like application and plans to finish it in six months. Check their progress on their [hackerspace here](https://github.com/gnolang/hackerspace/issues/28) and look for more upcoming demos.\n\n### Teritori\nTeritori has been focusing on Escrows in the past couple of months, aiming to make improvements that facilitate on-chain project management. The team is also iterating the Moderation DAO and has identified a need for a conflict solver module to call an external authority to solve a conflict between two parties (for example, the buyer and the seller). They have called this module the Conflict Solver Module and integrated several options like Justice DAO (composed of humans) or any realms (e.g. GnoChess) to solve the conflict. They are researching work on VRF to implement randomness so that the module selects a person (or group of people) with no conflicts of interest in the issue. [PR 11](https://github.com/TERITORI/gno/pull/11/files) provides more details. A true randomness function will also be handy for the Flippando game that doesn’t currently rely on true randomness. \n\nIn other news from Teritori, the moderation DAO is live! You can head to the [Teritori site](https://app.teritori.com/feed?network=gno-teritori) to play around with it and even try deploying your own DAO, creating a user profile, and adding a social feed. The team has deployed V1 of a “Soundcloud-like” app on the [Gnosocial feed](https://app.teritori.com/feed?network=gno-teritori) in which you can listen to music while browsing features, publish your own music as an artist that appears on your profile, comment on tracks, tip artists, and more. Keep updated with Teritori on their [hackerspace here](https://github.com/gnolang/hackerspace/issues/7).\n\n### Zack Scholl\nOur resident tinkerer Zack gave a workshop last month as part of his “Go to Gno” series called [Go to Gno: ByteBeat - Generating Audio with Smart Contracts](https://www.youtube.com/watch?v=lmmUIEHhdqA). This is a really interesting tutorial on how to build Bytebeat (a minimal programming language for synthesized music) with smart contracts and follows on from his microblogging workshop. Be sure to check it out. If you want to hear more about Zack, you can also watch [Getting to Gno with Zack Scholl](https://www.youtube.com/watch?v=LgXa7QCdxdA\u0026t=1258s), a Fireside Chat series that talks about contributors’ work, lives, and motivations to be on the Gno.land journey with us.\n\n### Onbloc\nAs always, the Onbloc team has been busy! Over the past few weeks, they have been working on extending the functionality of Gnoswap, integrating APIs and realms with the interface, improving the governance page UI, and integrating the Adena wallet. Onbloc expects to launch the beta of Gnoswap next month, and we’re super excited to see it in action. To improve the UX and UI of Adena and make the wallet even more secure, the team is implementing a feature called Air-Gap which allows the wallet to broadcast transactions signed from an offline environment without the user needing to import their keys to Adena. Onbloc has also started a discussion around ideas to improve the usability of QR Codes for secure data transmissions between offline signers and watch-only wallets in [Issue 1375](https://github.com/gnolang/gno/issues/1375). We’ll keep you updated on the work here. You can also find more information on Onbloc’s [informative blog](https://medium.com/onbloc). \n\nAs well as developing core tooling for Gno, Onbloc is working on Gno core to help us build important functionality. The team welcomed a new hire, Lee ByeongJun as a core engineer and to help with work on three core areas: contract interaction (enabling realms to interact with other realms), the multinode testnet, and porting essential Go packages to Gno. You can find more details and keep track of everything Onbloc is working on in their [hackerspace issue here](https://github.com/gnolang/hackerspace/issues/29).\n\n### Varmeta\nWe’re excited to welcome a new contributor Varmeta to Gno.land. Varmeta was founded in 2020 to focus on blockchain and virtual reality/augmented reality technologies and has grown from a team of three to over 40 engineers. Varmeta is excited by the vision behind Gno.land and its philosophy for rewarding developers. The team is committed to supporting Gno’s success by providing various applications for the ecosystem, starting with the Gno.land Unity SDK to make blockchain more accessible to game developers. Track Varmeta’s progress on their [hackerspace here](https://github.com/gnolang/hackerspace/issues/43).\n\n### Gno @ Devconnect Istanbul 2023\nGno.land core team members organized a small, unofficial meetup in Istanbul during Devconnect week from November 13-17. The engineering-focused meetup was accompanied by a Happy Hour and snacks, where attendees got the chance to learn about Gno.land in an informal way and how they can easily develop dApps in Gno, as well as contribute to the project.\n\nThat's all for now! Be sure to check back again with us for the next edition of The More You Gno to keep up with all our progress. Do you want to contribute to Gno.land's monthly updates? If you're building on Gno.land and want to highlight your development, project, event, or idea, let us know, and we'll include your contribution.","2023-11-29T00:00:00Z","christina","gnoland,ecosystem,updates,gnovm,tm2"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["bgl-poc1","Building Gno.land – Next Generation Smart Contract System","\n\n*Disclaimer: The Building Gno.land series aims to share the core concepts of our platform, mission, and tech stack, providing a snapshot of a current state on our builder’s journey. New episodes may deprecate previous ones, but no editions will be modified at any time. We encourage you to follow along as we create the rails for a more transparent and accountable society, and we welcome feedback and contributions to the repo.*\n\n## I. What Is Proof of Contribution (PoC)?\n\nGno.land is secured by a novel consensus mechanism that makes our platform unique—Proof of Contribution (PoC). PoC prioritizes fairness and merit, rewarding the people most active on the platform and revolutionizing the concept of open-source rewards. By removing the voting power associated with being wealthy (holding tokens in Proof-of-Stake (PoS) networks or amassing mining hardware in Proof-of-Work (PoW) networks), PoC restructures the financial incentives that tend to corrupt blockchain projects in the long run and rewards contributors fairly for their work based on their expertise, commitment, and values. \n\nGno.land contributors receive rewards and voting power according to their contribution level. These rewards increase as they make additional contributions, gain expertise, and are promoted up the Gno.land governing DAO’s (GovDAO) tier levels by higher-level contributors. So how does PoC work, what are its core features, and how does it lend security and decentralization to the platform? \n\n### Prioritizing Fairness and Alignment \n\nProof of Stake (PoS) was a monumental leap forward for the blockchain industry, solving the energy-intensive requirements of Proof of Work (PoW) and enabling blockchains to scale for broader adoption (thanks to its minimal carbon footprint and faster throughput). However, like PoW, PoS has some disadvantages. For example, in PoS networks, participants receive rewards based on how many tokens they stake, which means their incentives for working on the chain are often purely financial. Validators accumulate vast net worths and don’t always hold values that align with the core development of the chain. \n\nSince validators are crucial in securing PoS networks, they should be paid fairly for their work and encouraged to contribute more. However, validators should not be purely financially (and certainly not politically) motivated, taking up competing positions and launching political campaigns to convince token holders to stake with them. This type of lobbying affects all aspects of the chain’s development—from governance to technical upgrades—and can lead to factionalism and misalignment. \n\nPoC makes the system fairer and more sustainable, ensuring participants are aligned and take actions that benefit the Gno.land community and the broader ecosystem. That’s why (unlike PoS) contributors receive rewards based on their contribution effort (tier level) rather than how many tokens they stake. They are thus incentivized and recognized for the quality of their work, ideas, and alignment, driving participation and active engagement. Governance is allocated to the people most likely to care for the ecosystem’s long-term success—the contributors who have spent the most time working toward it—from open-source developers to video creators and everyone in between.\n\n### Rethinking Financial Incentives \n\nFor long-term security and sustainability, PoC emphasizes project principles and values over monetary gains, replacing standard token incentives with a system that separates voting power from token ownership. Two reward systems are currently being considered (in addition to a hybrid system). For the first, contributors receive WORX units that weigh the amount of GNOT tokens (the native Gno.land gas token) earned each month. Each member of the same tier receives the same amount of WORX. At the end of the month, the total each member earned is divided by the total amount of WORX distributed that month to calculate a percentage. This percentage represents the percentage of Gno.land fees earmarked for contributors that each member will earn in GNOT. WORX will likely be cleared each month to prevent cumulative, exponential reward exploits over long periods of time. \n\nFor the second, each tier level simply receives an amount of GNOT each month fixed to a USD value, similar to a salary. This would be combined with risk management and caps per tier level in order to promote long-term sustainability based on Gno.land fee generation. A hybrid of this system is also possible, either rewarding contributors of lower tiers one way and higher tiers the other or using both systems in tandem based on predefined conditions. This will be explored further in future tokenomics articles, models, and documentation.\n\nRegardless, WORX units are not transferable, will not be listed on exchanges, and hold no monetary value. WORX units are more like shares that represent value provided by contributors and allow their work to be quantified compared to other contributors/tier levels. It’s important to stress that GNOT tokens do not influence governance on the platform in any way. Voting power is earned through contributions and distributed according to contribution effort, with each member of the same tier representing equal voting power that increases with their tier level. This creates a network of highly aligned contributors who care deeply about the platform they are building and strive to improve it.\n\nGNOT, the native Gno.land gas token and the gas token of the Gno.land ecosystem, will be distributed via airdrop to qualifying ATOM stakers. It will also be available for purchase after that point (*more on Gno.land’s airdrop and tokenomics coming soon*). GNOT is used to pay all fees associated with the network and beyond, including transfers, IBC, ICS, and contract interactions, giving holders the chance to earn rewards from the economic activities of Gno.land.\n\n### What Makes a Good Contribution?\n\nWORX and/or GNOT can be earned through different types of contributions—not only coding and development expertise—but also through non-technical contributions, such as community building, governance involvement, constitutional proposals, teamwork, media creation, etc. The core focus is on alignment, not necessarily specific tasks. For example, an accepted proposal or merged code will raise or at least maintain the contributor’s tier level, allowing them to receive rewards during their time working between submissions. However, a proposal or code that has displayed a very high level of effort, detail, and aligned values (but is not merged) will also be considered in any proposals regarding contributor promotion.\n\nThis system allows the ecosystem to show appreciation for diverse forms of contributions and ‘useful failures’ that bring us closer to the solutions we adopt. It is designed to foster engagement, creativity, and collaboration while encouraging anyone aligned to contribute to growing the Gno.land chain and community. \n\n### How Are Contributions Assessed?\n\nThere is a strong human element to deciding what makes a good contribution, requiring knowledgeable human judges to exercise discretion. As such, contributions won’t be templated by default or rewarded automatically but assessed through Gno.land’s governing DAO, GovDAO. GovDAO is responsible for development and governance and is organized into tiers, as discussed above.\n\nGovDAO members review, measure, and curate contributions, and the tokenomics of GovDAO incentivizes members to be effective and unbiased evaluators. They engage in discussions and assess contributions based on effort, time, and other relevant factors/metrics that contributors will have stored in their profiles. The decision-making rationale is transparent and visible through on-chain forums. Again, contributors are assigned a tier level and receive a corresponding reward each month according to their tier. As contributors join GovDAO, the DAO grows, giving Gno.land decentralization efficiency and a high Satoshi score. \n\nGovDAO is assisted by a network of knowledge-specific DAOs, such as an Engineering DAO, a Support DAO, an Operations DAO, and the EvaluationDAO, which comprises a trusted group of high-reputation contributors that help assess specific contributions. This enables secure collaboration and seamless integration (*more on Gno.land’s network of interconnected DAOs coming soon*.) \n\n### Sybil-Resistant and Secure\n\nIn addition to being fairer, more aligned, and sustainable, PoC is Sybil-resistant by design. In blockchains, a Sybil attack is where one or multiple attackers multiply their presence and influence by creating fake identities to sway major network decisions (for example, including malicious blocks). In terms of PoS, the Sybil resistance is purely monetary (people need to stake real money to get power), so an attacker that wants to carry out a Sybil attack on a PoS network needs to lock at least as much stake as that locked by honest validators.\n\nPoC minimizes risks of Sybil attacks, takeovers, and alliances as the community vets every person who is given any power or sway in the network (including validator power) through the DAO, so at no point can anyone \"spoof\" identities and regain major sway. Moreover, Gno.land is built and secured by the merit and effort put into the project, as opposed to how many tokens someone can buy, rethinking financial incentives and making the platform Sybil-resistant and secure.\n\nThrough fairer rewards, restructured incentives, resistance to corruption and Sybil attacks, and a strong appreciation for all contributions, Gno.land is designed to be sustainable and fair. A censorship-resistant platform built, owned, and secured by a growing, aligned community for many generations to come.\n\n*I. What Is Proof of Contribution? is the first in a series of articles to dive deeply into the philosophy, vision, mechanics, and work involved in developing a new consensus mechanism for the next generation of smart contract systems. Look out for subsequent editions and additional Building Gno.land series, and let us know what you think! Got questions? Join the Gno.land [Discord](https://discord.com/invite/S8nKUqwkPn) or follow us on [Twitter/X](https://x.com/_gnoland)*.\n","2024-01-10T10:51:00Z","","building-gnoland,gnoland,proof-of-contribution"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-7","The More You Gno: Gno.land Monthly Updates - 7","\n\nWelcome to the latest edition of *The More You Gno*, your regular source of updates from the Gno.land core team and contributor ecosystem. After a well-deserved rest during the holiday break, we’re kicking off 2024 with renewed energy and plenty of exciting initiatives, including a new staging testnet (the Portal Loop), the official Gno.land documentation page, several merged PRs (including native bindings!), and many updates across the board. Dive in to find out what we’re working on and what our ecosystem partners and grantees have been up to.\n\n## Gno Core Team Updates TL;DR\n\nShort on time? Skim the highlights from the core team in the list below. You’ll find additional details in the next section if you want to explore any topic in greater detail.\n- **Native Bindings** - If you’ve been following our journey or experimenting with the platform, you’ll hear virtual champagne pops as Morgan’s ongoing work with native bindings is finally merged [PR 859](https://github.com/gnolang/gno/pull/859).\n- **Gnodev** - Thanks to Guilhem’s `gnodev` initiative [PR 1386](https://github.com/gnolang/gno/pull/1386), you can now create and develop contracts with a single command.\n- **Gno.land Offical Docs** - Check out [docs.gno.land](https://docs.gno.land) for how-to guides, getting started, and an overview of key concepts of the platform.\n- **Effective Gno** - Taking inspiration from *Effective Go*, Manfred’s begun listing common patterns and examples of the differences between Gno and Go.\n- **Assignment in GnoVM** - Jae is working on approaches to fixing assignment in the GnoVM and issues that deal with persistence [(issue 1326)](https://github.com/gnolang/gno/issues/1326). \n- **Portal Loop** - The [Portal Loop](https://portal.gnoteam.com) has been released on a staging domain and is being tested.\n- **Roadmap** - We’re working on a fully-fledged Gno.land roadmap and will share a detailed DAG and important goals and milestones with you soon.\n- **Tendermint2 Update** - There are several PRs aimed at removing the dependencies between Tendermint2 and GnoVM.\n- **Gno.land Tokenomics** - We continue to make progress in defining the structure of Gno.land’s DAOs and the design of reward schemes for contributors.\n### Native Bindings (PR859) Has Been Merged\n[PR 859](https://github.com/gnolang/gno/pull/859) (native bindings) was submitted by Morgan in May 2023 to improve calling Go code from Gno standard libraries, all while improving `gno doc` documentation for standard library functions. Native functions are _declared_ in Gno code, but their definition (the underlying code) only exists in Go: this is similar to how Go and many other systems languages implement assembly functions. Overall, the addition will now allow us to better support precompilation (transpiling Gno code to Go) for all Gno-specific standard libraries, like [`std`](https://docs.gno.land/reference/standard-library/std/address/), and have a system for defining such functions that is transparent to code analysis tools like `gno doc` and `gnols`.\n### Gnodev Has Been Merged\n[PR 1386](https://github.com/gnolang/gno/pull/1386) (`gnodev`) has been merged. Gnodev is a tool to locally develop Gno realms which automatically re-deploys your contracts when you change the files, similar to JavaScript frameworks `npm run dev`. There are some additional features being worked on to improve the experience, including browser hot-reload (for the full front-end JavaScript experience!)—and Gno core developers who have worked on realms all agree that thanks to `gnodev`, they can finally stop visiting their therapist every week. Play around with it, and let us know how you get on. There may be a few bugs still and Guilhem is happily accepting feedback.\n### The Gno.land Official Documentation Page Is Live\nWe’re excited to have the Gno.land Official Documentation page live on the [https://docs.gno.land](https://docs.gno.land) domain. This will always be a work in progress as we expand the docs, make iterations to existing issues, and refine some of the core concepts, but it’s an excellent resource for anyone wanting to find out more about Gno and for onboarding new developers to the platform. A big thanks to the Onbloc team, whose developer portal was a huge inspiration for this. We’re looking for feedback, so leave your reviews and let us know where the docs can be improved and what else you would like to see.\n### Effective Gno\nManfred has been working on a document called [Effective Gno (PR 1000)](https://github.com/gnolang/gno/pull/1000), which takes inspiration from *[Effective Go](https://go.dev/doc/effective_go)* and will become an important reference document for Gno devs to explore common patterns and crucial differences in how we program compared to Go. We’ll be iterating on this as we progress, but you can already find plenty of examples. If you’re just getting into Gno and coming from a Go background, this is a great resource. Read this document and provide some comments if you have any. \n### The Portal Loop Beta Is Live\nThe Portal Loop Beta has been released on a staging domain, and you can check it out now at [https://portal.gnoteam.com](https://portal.gnoteam.com). The Portal Loop will replace the Gno.land website once we’ve finished squashing bugs and adding features. We’re still testing it and have identified several issues. For example, from the last three merged PRs, only one triggered a redeploy when we expected two or three deploys. We will also add a faucet.\n\nAs we continue to evolve the Portal Loop out of its early development stages, transaction volume and general activity will increase. However, currently, there are insufficient transit testing transactions. One of the tasks we want to do to prove that the Portal Loop is working well enough is to write a kind of monitoring-oriented oracle that will try to make transactions, perhaps incrementing a counter every minute. We’re looking for help writing a script or a daemon for this oracle, so let us know if you want to contribute to [issue 1443](https://github.com/gnolang/gno/issues/1443). Once the Portal Loop is finished, we will focus on testnet 4.\n### Assignment Issues in the GnoVM\nMorgan came across a bug [issue 1326](https://github.com/gnolang/gno/issues/1326), which returned an error about an [“unexpected unreal object”](https://tenor.com/es/view/cranizox-gif-8576622211330078986) when assigning a local variable to a dereferenced global variable in the GnoVM. Jae has been spending some time working on approaches to solving this and fixing assignment that will also work for saving escaped objects that don't have a parent (like variables whose pointers are referenced on a persisted object). This is a tough one to figure out, so if there are any other VM issues that deal with persistence and detached parentless objects, now is the time to add them to Jae’s plate. \n### An Update on Tendermint2\n[PR 1483](https://github.com/gnolang/gno/pull/1483) has the same goal as [PR 1438](https://github.com/gnolang/gno/pull/1438): to make Tendermint2 completely independent of GnoVM and Gno.land. This continues a project started many months ago to separate Gno into three separate components: the Tendermint2 consensus engine, the Gno programming language and VM, and Gno.land, the blockchain combining both together. This way, we’re working towards making it possible to build other blockchains that use Tendermint2 (like AtomOne!), the GnoVM, or both!\n### Gno.land Engineering Retreat\nIn the last *The More You Gno*, we covered the Gno.land and AIB company-wide retreat, an invaluable opportunity to work together, code together, and get to know our peers outside of work. It was such a success that the Gno core dev team held another retreat in December in Rouen, France, where many of the above issues and PRs were tackled and merged. We look forward to more productive and frequent face-to-face meetings in the year ahead.\n### Gno.land DAOs and Tokenomics\nWith the input of Manfred, Jae, and the rest of the team, Michael continues to make advancements on Gno.land’s system of DAOs and tokenomics. One key change since the last edition is that the WorxDAO (responsible for governance and all issues related to development in Gno.land) will now be known as the GovDAO. The DAO will likely have seven tiers but initially launch with three or four. The main benefits of moving up tiers are increased voting power, increased monthly rewards, and the authority to promote members from lower tiers. GovDAO will be assisted by WorxDAO, which will encompass several different sub-DAOs, such as engineering, funding, and projects. \n\nWe’re currently exploring different reward systems for contributors, whereby each member of the same tier level will receive the same amount of rewards, either directly or indirectly, in the GNOT native gas token or USD, in a type of salary-based scheme. We may also elect to distribute rewards based on a contribution/work “hash difficulty” (total number and tier split of active contributors that month). We may also adopt a hybrid of these two models. \n\nMichael is also working on a bounty system to make Game of Realms (GoR) more accessible and evaluating contributions easier for judges. High ranking GoR competitors will likely receive Gno.land tier levels based on their leaderboard placing in addition to ATOM rewards. It’s important to note that these discussions are ongoing, and the information here may be deprecated. \n### Making Testing Faster\n\nThanks to Petar, [PR 1417](https://github.com/gnolang/gno/pull/1417), we have improved the entire VM testing suite runtime by around four minutes, which is an incredible achievement. We just need to refactor some test scenarios that are not very concurrent-friendly, but this PR makes interacting with the platform so much easier.\n\n### Bug Fixes and Miscellaneous Items\n\nThanks to Joon from Onbloc, we were able to add support for octals without 'o' (check out [PR 1331](https://github.com/gnolang/gno/pull/1331) for more details), and thanks to Dragos [PR 1309](https://github.com/gnolang/gno/pull/1309), we extended the GRC721 interface so that it now supports setting a token URI. These are both extremely welcomed contributions, and we appreciate our ecosystem partners.\n\nFrom the core team, a special shout out to Dylan for killing it fixing bugs, and getting many PRs ([PR 1451](https://github.com/gnolang/gno/pull/1451), [PR 1315](https://github.com/gnolang/gno/pull/1315), and [PR 1305](https://github.com/gnolang/gno/pull/1305), to name a few) merged over the last few weeks. Props also go to Marc for [PR 1177](https://github.com/gnolang/gno/pull/1177), which has just been merged, which fixes append in certain key situations. We’ve also welcomed a new security engineer, Kristov, to the team.\n\n## Grantee and Ecosystem Updates\n\n### Onbloc\n\nOnbloc has been on a roll, giving us an internal demo of Gnoswap beta just before the Christmas break and a public demo of its awesome Pool Incentivization feature during the last contributor sync call. With Pool Incentivization, anyone can add extra rewards on top of swap fees for LP stakers. This will help bootstrap initial liquidity for new-coming projects by attracting liquidity providers until sufficient organic trading volume is secured. Onbloc is also actively developing Adena’s Airgap feature and has improved the sign-in flow for security enhancement along with some refactoring. There will be a demo coming up in the next few weeks. Onbloc will also be researching airdrop trends and aiming to identify some of the most coveted DEX features users want to see for Gnoswap to streamline the onboarding process.\n\nRegarding Gno core, Onbloc core dev Byeongjoon Lee has developed a JSON parser for Gno, giving us a live demo during the last contributor sync. This allows the conversion or accessing of data from contracts in the JSON format, which will improve the Gno developer experience. His code is currently under review by the core team in [PR 1415](https://github.com/gnolang/gno/pull/1415). Dive deeper into Onbloc’s Builder Journey in the [hackerspace issue 29](https://github.com/gnolang/hackerspace/issues/29).\n\n### Teritori\n\nTeritori continues the challenging work of developing Gno Project Manager, a web app that allows anyone to create, fund, review, or manage projects fully on-chain. During the last contributors' call, the team gave a demo of the work achieved so far, in particular regarding the escrow system and completing project milestones so contributors can be paid once each one is completed rather than having to wait until the project finalization. \n\nGno Project Manager is a complex goal, and the team has run into some issues with edge cases they hadn’t bargained for in the relationships between grantees and funders. The team is looking for feedback and help identifying edge cases, so if you have any in mind, let them know. Teritori is also working on the conflict solver module and improving the social feed on [https://app.teritori.com/feed?network=gno-teritori](https://app.teritori.com/feed?network=gno-teritori), as well as providing more detailed documentation on their work, which they’ll be releasing in the coming weeks.\n\n### Berty\n\nThe Berty team has been busy working on GnoSocial backend implementation. The initial feature set has been implemented [here](https://github.com/gnolang/gnosocial/blob/main/realm/public.gno), including posting and replying to messages and reposting threads. You can keep up with Berty’s journey on GnoSocial in [hackerspace issue 51](https://github.com/gnolang/hackerspace/issues/51), which contains many issues and PRs, such as implementing calls, running tests, and fixing bugs. We’re super excited about pushing the limits of scalability with Berty’s decentralized social platform, and we’ll be looking forward to more demos in the coming weeks.\n### Dragos\nDragos has successfully launched the Flippando game, and you can try it out on the [testnet here](https://gno.flippando.xyz/flip). If you haven’t been following the progress, Flippando is an on-chain memory game that you can play with your choice of styles, such as dice, colors, and hexagrams. Once you successfully complete a matrix, you can mint the end result as an NFT, which can later be assembled into larger, more complex NFTs to create digital artwork. You can find out more about the game, its creator, and the official roadmap on the site. We’ll also release a blog post soon from Dragos sharing his experience porting Flippando from Solidity to Gno, so stay tuned!\n### Varmeta \nVarmeta’s update was brief this week since the contributor sync call ran over. We look forward to hearing more about the team’s progress in developing the Unity SDK for Gno next time. You can read more about it on Varmeta’s [hackerspace issue 43](https://github.com/gnolang/hackerspace/issues/43).\n\n*Do you want to contribute to Gno.land's monthly updates? If you're building on Gno.land and want to highlight your development, project, event, or idea, let us know, and we'll include your contribution. That's all for now! Keep track of our progress by following our socials [Twitter/X](https://twitter.com/_gnoland) and [Discord](https://discord.com/invite/tF2X8M6cVj) and watch out for the next edition of The More You Gno in a few weeks.* \n","2024-01-22T00:00:00Z","christina","gnoland,ecosystem,updates,gnovm,tm2"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["porting-flippando-gno","5 Things I Learned While Porting Flippando From Solidity to Gno ","\n\nLast year, while visiting Seoul, South Korea, I decided, on a whim, to sign up for a hackathon called Glitch. The project I was going to present was a tiny little game, written in Solidity, called Flippando. It started as a weekend project to help me learn Solidity (I had no prior experience with this language). To my surprise, my tiny little game won the first prize on the Polygon track of the Glitch hackathon.\n\nEncouraged and even more curious now, I started attending side events during Buidl.Asia. One was about Gno, a smart contract platform written in Go. After the presentation, which was really great, I started a light conversation with the team. One thing led to another, and I ended up showing them Flippando. \n\nJust for context, Flippando is a non-degen, deceptively simple memory game. You start with an empty matrix and flip tiles to see what’s “underneath.” If the tiles match, they remain uncovered; if not, they are briefly shown, and you have to memorize their color until the entire matrix is uncovered. The end result can be minted as an NFT, and you can later assemble all the boards into bigger, more complex NFTs, basically “painting” with the uncovered tiles.\n\nThe Gno team seemed to like it, and they suggested I should apply for a grant to port it to Go/Gno. I had no prior experience in Go either, so I thought this would be a good opportunity to learn more. To my surprise, again, my grant submission was accepted.\n\nFast forward a few months until now: the Gno version of Flippando is live (in testnet beta) at [https://gno.flippando.xyz](https://gno.flippando.xyz). What follows sums up my experience porting the game from Solidity to Gno. This blog post is a mix of technical and not-so-technical takeaways.\n\n## 1. Being Early Pays Off\n\nSolidity has been around for some time now, and there is already a solid tooling ecosystem for it. I used Hardhat for my development, and I got really comfortable with it. When I started to port Flippando, though, I was quite surprised to see there was almost no tooling in Gno. Developing was mostly TDD (test-driven development) against a local VM, and deploying realms on the actual chain was more complicated than I expected. \n\nMy first feedback rounds to the team revolved almost exclusively around this topic. Very soon, I started to receive signals that my feedback was not only heard but taken into account and processed, and there were actual projects built aiming to improve the developer experience. In just two or three months, two full projects were finished: gnodev, and Gno Playground. \n\nGnodev makes development very similar to Metro in React Native: there is a watchdog on the file system, and your changes to the realm code are reloaded every time you save. It’s almost like deploying in real time; no need to stop the chain, wipe the state, restart the chain, and redeploy your modifications. Gno Playground is a sandbox-like environment, which helps tremendously with quick testing and even deploying packages on-chain. Both projects were finished, as I said, in just two to three months.\n\nBeing early pays off because you get to shape your development environment much faster than in a solidified (pun intended!) environment. You may have to deal with a little chaos in the beginning, but the benefits are well worth it.\n\n## 2. TDD All Day Long\n\nAs I said above, developing realms in Gno consists mainly of writing and testing your code with another code. It’s called TDD and it’s a very useful developing strategy, in general. I used it, at my day job, in all my projects consistently, but only in the initial stages. Once the codebase was more stable, I was relying more on regression tests from the Q\u0026A team.\n\nMind you, there was no Q\u0026A team this time; I was just coding alone, and I was forced to comply more and more with this TDD approach. In the end, I have to admit that, while slower and a bit boring, this approach is more effective, especially in a volatile environment, where patches are added literally every day, and the environment changes continuously.\n\n## 3. Marshal and Unmarshal\n\nThe current GnoVM doesn’t yet have an API standard for formatting. You can’t put a setting somewhere that will make the response be automatically translated into JSON. You have to write these JSON objects yourself for every payload you return from your realm. \n\nIn Solidity, all this is hidden under the event mechanism and handled by existing libraries, like ether.js, which take care of all this nitpicking. It soon became obvious that development time would be significantly longer in Gno because, on top of the logic, I also had to write the formatted response “by hand.”\n\nBut as with every other thing that seemed weird in the beginning, eventually, I came to appreciate it. It forced me to prototype more carefully not only the actual response but all the objects needed in my game. Eventually, it resulted in simpler and more flexible code.\n\n## 4. Eating Your Own Dog Food\n\nWhen developing in Solidity, most of the time, you just import OpenZeppelin contracts for ERC20 and ERC721 tokens (which are battle-tested, bug-free, and relatively easy to understand) and focus on your own contract logic. No mingling with low-level token implementation details; these are already packaged and ready to use.\n\nWhile porting Flippando to Gno, I realized I had to deal with these low-level details upfront simply because there was no equivalent of the OpenZeppeling contracts. Moreover, some current GRCs (the Gno equivalent of ERC) were incomplete. \n\nSo, I had to make a PR for a GRC721 implementation that was missing the SetTokenURI functionality, and this PR ended up being merged into the main Gno codebase (that felt really good, to be honest). \n\n## 5. Being Early Pays Off. Did I Say That Already?\n\nYes, but this time it’s about something else. It’s not about the satisfaction of shaping the development environment in the early days. It’s about the privilege of witnessing something coming to life from literally nothing. Gno has been in development for almost two years now, and it is several months before its mainnet. It’s literally on the verge of coming “alive.”\n\nEvery day new commits are added, and new decisions are made. There are new contributors constantly joining, and new projects prototyped and launched faster and faster. Every day the ecosystem is coagulating itself into something more and more visible, more and more alive.\n\nBeing able to witness this from the inside is a rare privilege and something I’m very grateful for.\n\n## Final Thoughts \n\nSo, these are, in a nutshell, my five top takeaways from porting Flippando from Solidity to Gno. There are many others, of course, and Gno is (did I already say this?) still very early. If you’re interested in learning more, please visit the official repo, look at the docs, and try interacting with the devs. You’ll never gno what can grow out of it! And be sure to play [Flippando](https://gno.flippando.xyz) today live in testnet beta and share your flips.\n\n## Here’s How to Play Flippando\n\nThe game presents a 16 tiles (4x4) or 64 tiles (8x8) matrix. These tiles are “covering” a board of various colors and gradients or shapes, like dice or hexagrams. Clicking two tiles consecutively “flips” them, showing what’s underneath. If they match, they remain uncovered; if not, they are briefly shown, and the player needs to remember their position. Once an entire board is flipped, revealing its random combination of colors, the player can choose to mint it as an NFT.\n\nWhen minting a solved board as an NFT, the game also mints a fungible token, FLIP, which is “locked” inside the NFT. This is the player's “reward.” But the token can only be unlocked if someone else uses that NFT in a larger project.\n\nThese larger projects, or “artworks,” can be assembled in the Flippando Playground. All minted basic NFTs are displayed here in an area from where the player can drag and drop them onto a canvas, creating a much bigger and more complex NFT. Once the canvas is fully filled and the player is satisfied with what’s in there, these new “artwork” NFTs can also be minted. This unlocks all the FLIP tokens for the NFTs used inside the artwork and sends them to their initial players. Furthermore, these complex artworks can be listed and traded in a marketplace, closing the circle of a virtual economy of goods.\n\nStart playing Flippando and share your Flips with Gno.land on [Twitter/X](https://x.com/_gnoland?lang=en) by tagging #gnoflip. \n\n\n","2024-01-24T00:00:00Z","dragos","gnoland,ecosystem,updates,flippando"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["wyg-zooma","Who You Gno – On the Record with Antoine Breuil","\n\nAntoine Breuil, ‘zôÖma,’ is the co-founder of [Teritori](https://app.teritori.com/), an active Gno.land contributor and grantee that’s building key modules and tooling for Gno. A firm believer in equal opportunities, free and decentralized access to information, and helping fellow humans, zôÖma is fascinated by human behavior and how we organize ourselves, holding an avant-garde social experiment five years ago with Teritori co-founder ‘Pop.’ \"La Suite du Monde\" drew people across France to a small village in the countryside to create a shared community and society—with farmland, accommodation, and tools for common use.\n\nThe goal was to form an in-real-life DAO whose members shared common goals and interests using blockchain technology with a token to pay for goods and services and vote on governance matters. While many people participated and were enthusiastic about creating a shared society, zôÖma admits the experiment was early- no one was interested in interacting with the tech. “90% of people, rural or not, found it too complicated,” he admits. “We were a bit naive, but it was fascinating nonetheless.”\n\n## A Fascination for Human Behavior\n\nzôÖma has been an ardent student of human behavior since childhood. His parents taught him early on the value of philanthropy and working with people in need. He’s set up several joint liability companies, non-profits, and NGOs to experiment with finding new and better ways to organize society, and one of the things he loves most about web3 is its “experimental” nature. He’s encouraged by how far the industry has come since he received his first bitcoins in partial payment for a website in 2014. “That turned out to be a really expensive website for my customer,” he laughs. He never expected such broad adoption of Bitcoin and a technology that “inspired a whole generation of engineers to experiment with new things.”\n\nLike most creative types, zôÖma is used to spinning many plates in the air, overseeing La Suite du Monde while working as a freelance designer, front-end dev, and Artistic Director for an independent French record label. “Before entering the world of engineers, I founded and managed a collective for 12 years, which brought together artists from all disciplines, hackers, designers, tinkerers, to build some interesting projects.” La Suite de Monde allowed him to explore his passion for finding new approaches to social coordination first-hand. “I explored very radical things,” he says, “like the notion of “accepted by default” where anyone could use the collective budget by expressing their desire to do so three times. I wouldn’t recommend this,” he laughs, “but the experiments were fascinating and still serve me today in my work.”\n\nOne really interesting trait about zôÖma is how he harnesses the creative and analytical sides of himself with equal application. Most people are predominantly right-brained or left-brained, yet, zôÖma is ‘ambidextrous’ in this regard. He’s a designer who’s created large-scale artistic events, cultural tours of Paris, and an award-winning independent movie documenting French artist and Bitcoin advocate Pascal Boyart, [The Underground Sistine Chapel](http://www.the-chapel.art), (which you should definitely check out!). Yet he’s also passionate about engineering and the future of cooperatives. He’s detail-driven and ambitious, taking his team at Teritori from two to 18 (14 full-time teammates and four part-time).\n\nIn his free time, zôÖma, “like all French people,” enjoys fine wine and good conversation. One of the things he loves most about Paris is how easy it is to find like-minded people to brainstorm with or decompress after a long day of work. “We have a very active ecosystem of engineers, cryptographers, etc.,” he says. Paris is also a beautiful city that captures his imagination with its dazzling architecture and impressive art. Even so, zôÖma channels his creative energy more effectively when working from a small Moroccan fishing village for three months a year. He reconnects with nature and humanity, immersing himself in a different culture and surfing in the Atlantic before he starts his day. \n\n## New Tools for Social Coordination \n\nWhy does zôÖma believe social coordination is so important, and why do we need new tools for it? “We’ve always had tendencies to organize ourselves and tools defining rules for living together, diplomatic protocols for discussing between social groups, or trading goods and services. But almost all the tools that previous generations put in place are outdated. Our entire generation has lost confidence in institutions to allow groups of humans to organize, coordinate, and meet their needs. Our dependence on third parties who do not have the same interests as citizens is immense.”\n\nzôÖma believes that web3 holds the key to unlocking the emergence of new societies through products that are “unstoppable, resilient, and meet a real need,” whether for small villages in the south of France, Africa, or Asia or neighborhoods in Brazil or Korea. “We must have access to the radical transparency of institutions, the privacy of individuals, censorship-resistant tools, and autonomous communication from all commercial enterprises. It is on this solid foundation that civilizations that are more just and equitable can be built.”\n\n## Making Web3 More Accessible \n\nOf course, as zôÖma found out, building new tools is easier said than done. Our industry faces an uphill climb when it comes to balancing the promise of the tech with a user experience that doesn’t cause tachycardia. He says that understanding that most people “don’t have the time or inclination to incorporate difficult technical concepts in their lives” has given him “crazy energy to focus on very simple technologies.” In fact, the ‘failure’ of La Suite du Monde is what gave birth to Teritori, “which today provides all the functionalities people asked us for at the time; a social network, communication systems, voting, crowd-funding, etc. We have made great progress, and it’s important to focus on products that are radically simple for the general public.”\n\nAccording to zôÖma, this means abstracting away the concepts that everyday people don’t need to be aware of, such as networks, dApps, and even blockchain, “and always switching from one decentralized application to another.” Unifying (not centralizing) separate tools, networks, and technologies within a single, simple interface, he believes, is the key to broader adoption. “It's a very complex challenge, in terms of security, design, etc., but it's what I'm passionate about today.” \n\nWhen it comes to Gno.land, Teritori has already delivered essential DAO tooling and standards, a Moderation DAO module to facilitate social communication and a Justice DAO module for conflict resolution. The team is now focusing on an on-chain project management tool to allow organizations and individuals to manage projects and track tasks smoothly and transparently on-chain.\n\n## A Fairer, More Transparent World\n\nIn 2024, Teritori enters a new phase called \"Chapter II,\" which involves unifying all its work into a mobile and desktop application that could “trigger superb demonstrations of the potential of DAOs.” He enthuses, “I dream that we will see the emergence of a village that uses Teritori as a tool for internal discussion and co-financing. Will this be real in 2024? Who knows? But that’s where I focus all my energy!”\n\nHe believes the internet has been a great leveler, enabling anyone with a connection to educate themselves on any subject; yet, the opportunity isn’t open to all, and free and open access is constantly diminishing. “I am a child of the internet. I grew up with warez, p2p, and an internet which provided me with daily resources to learn freely, everything that interested me. In some countries, it is impossible to benefit from this opportunity, and with the centralization of the internet on different key players, mass surveillance, and the censorship of certain dictators, the internet is losing its very essence, which makes it magic. Distributed protocols can reshuffle the cards and offer tools for the public good.” \n\nzôÖma says that humanity is at a turning point, and we must build the necessary tools now to avoid finding ourselves in a real-life version of George Orwell’s 1984. “I aspire to participate modestly in a world that is fairer, more transparent, and where society doesn’t need a puppet in a suit to improve its living conditions or respond to local needs. Web3 is just a tool, and if it doesn't meet this real need, then for me, it will be a failure.”\n\n*Experiment with Teritori today and test its Social Feed, which now includes Twitter-like functionality for posts, Medium-style articles, Soundcloud-inspired music, and videos—all based on Gno and IPFS and totally decentralized. You can also check out Teritori’s GnoModerationModule, which allows you to moderate a social network in a decentralized way. A faucet is available on the home page at [app.teritori.com](https://app.teritori.com/feed?network=gno-teritori).*\n","2024-01-11T00:00:00Z","christina","whoyougno,teritori,community,interview"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["bgl-poc2","Building Gno.land - Proof of Contribution II","\n\n*Disclaimer: The Building Gno.land series aims to share the core concepts of our platform, mission, and tech stack, providing a snapshot of a current state on our builder’s journey. New episodes may deprecate previous ones, but no editions will be modified at any time. We encourage you to follow along as we create the rails for a more transparent and accountable society, and we welcome feedback and contributions to the repo.*\n\n## II. Proof of Contribution vs Proof of Stake\n\nProof of Stake (PoS) is a robust consensus mechanism that provides a more environmentally friendly and scalable alternative to Proof of Work (PoW) and powers most of the web3 industry today. As PoS pioneers, Cosmos technology secures hundreds of blockchain projects and billions of dollars of digital assets, and Ethereum (launched as a PoW chain in 2015) made the historic switch to PoS in 2022. According to [ethereum.org](https://ethereum.org/en/developers/docs/consensus-mechanisms/pos), PoS is “more secure, less energy-intensive, and better for implementing new scaling solutions compared to the previous proof-of-work architecture.” However, as we briefly discussed in [*What Is Proof of Contribution?*](https://test3.gno.land/r/gnoland/blog:p/bgl-poc-1), PoS has vulnerabilities that can corrupt the network over time.\n\n### The Limitations of Proof of Stake (PoS)\n\nBeyond securing the network, the main goal of any consensus mechanism (PoW, PoS, DPoS, PoC, etc.) is to be as decentralized as possible and not reliant on any central actors. This can be measured by the Satoshi Score (or the Nakamoto coefficient), a quantitative measure that assesses a blockchain’s level of decentralization by calculating the minimum number of nodes needed to compromise a network or carry out a 51% attack. PoS systems can be bootstrapped within days (or even hours), starting off decentralized and achieving a high Satoshi Score.\n\nThe PoS chain Genesis allocates a default voting power to ~20-50 nodes, in general equally (or at least making sure that no single node has more than 5% of the voting power). This makes PoS chains decentralized enough (in theory) from block 0 with a near-perfect Satoshi score. However, in practice, PoS has two main issues. Because the system is dictated by money, PoS chains become imperfect over time. Anyone wealthy enough can stake their tokens progressively and use their accumulated power to sway decision-making on the chain—or take the network over completely.\n\nThe chain can limit the maximum voting power per validator node, but this is almost ineffective, as a malicious actor can carry out a Sybil attack on the network and create multiple validators to bypass the voting cap. Such an attack renders the max voting power per node useless and leaves the chain defenseless against a single organization or cartel gaining the majority of the voting power. PoS systems leave chains like Cosmos Hub and Ethereum at risk from such bad actors, cartels, and powerful protocols (such as Lido and Rocket Pool).\n\nWhile Proof of Contribution (PoC) can’t prevent Sybil attacks on standard user accounts (when malicious actors create multiple accounts with a single computer and transfer tokens within a few hours), it does make it almost impossible for validator nodes to suffer Sybil attacks. Since the community vets every person who is given voting power or sway in the network (including validator power) through the DAO, at no point can anyone \"spoof\" identities and gain major sway. \n\n### Where Proof of Contribution (PoC) Excels\n\nPoC is actually Proof of Authority (PoA) which, instead of offering up a resource like computing power or a financial stake, relies on validators staking their reputation. Anyone can join most public PoW and PoS networks without revealing their identity. However, by definition, PoA validators need to make themselves known and are selected based on their trustworthiness. This means PoA tends to work better when deployed in private or permissioned blockchains than in public platforms (because of this tendency toward centralization). \n\nPoC solves this problem, ensuring the network becomes increasingly decentralized over time by being governed by a decentralized entity, GovDAO. Like standard PoA chains, PoC chains launch with a handful of validators that must be identified and trusted by the network, meaning governance is centralized at the start, and the chain achieves a low Satoshi Score. The system is about contributing and earning contribution units, which are slow to gain and require human interaction. It takes months (or years) before there are enough actors in the DAO and sufficient voting power for the chain to be considered decentralized enough, according to the Nakamoto coefficient. \n\nPoC is thus slower to bootstrap than PoS and harder to achieve. You can think of PoC versus PoS as a marathon versus a sprint, whereby PoC starts slowly but then gains momentum over time, and PoS starts quickly but loses momentum over time (the graph below provides a visual representation of PoC versus PoS). \n\n[![Graph](https://gnolang.github.io/blog/2024-01-26_bgl-poc2/src/thumbs/graph-container.png)](https://gnolang.github.io/blog/2024-01-26_bgl-poc2/src/graph-container.png)\n\nThe GovDAO that owns the chain has a mandate to scale (to grow and decentralize) continuously as it adds more contributors. This means it becomes progressively larger over time, achieving high decentralization efficiency way beyond the initial fast sprint of PoS chains. Once established as a proven consensus mechanism and alternative to PoS, GovDAO can benefit from by any blockchain project (through an evolution of ICS) wanting to achieve decentralization and sustainability—PoC can secure Gno.land and the web3 industry at large.\n\n### Security-Conscious by Design\n\nAnother advantage of PoC is that because it’s reliant on human interactions, it is more Sybil-resistant by design. As discussed, it’s almost impossible to split a validator node into two (or more) nodes, making conducting a Sybil attack infinitely difficult. Since contribution units are not transferrable or exchangeable, PoC cannot suffer from whales attempting to purchase voting power quickly. If someone wanted to take over the network, they would need to invest years of their time making meaningful contributions. Their attack would be so slow that it would easily be prevented by humans monitoring the decentralization and adjusting the parameters. \n\nMoreover, GovDAO will activate and deactivate new validators on request, establish a KYC system for validators, and manage promotions of contributors with votes. This removes the possibility of a takeover happening overnight since the only way to gain validator or voting power is by voting on governance requests, which is slow and managed by humans. This is in contrast to PoS systems which are powerful and fully automated yet defenseless against such coordinated attacks.\n\nGno.land is built on the very premise that such an attack on a PoC network would never happen as it would be entirely counter-intuitive. Since contributions are not only about expertise but also alignment, it is our hypothesis that longstanding contributors who have invested years of time and brainpower in developing the chain will do their best to protect it rather than destroy it. The DAO system will endure thanks to the mix of expertise and alignment and the amount and frequency of contributions. \n\n### Concluding Thoughts\n\nBeyond separating voting power from net wealth, a core component of Proof of Contribution (PoC) is its focus on long-term sustainability. PoC makes the system fairer and more sustainable, ensuring participants are aligned and take actions that benefit the community and the broader ecosystem. PoC is slower to bootstrap and harder to achieve than PoS but focuses on long-term alignment and security. \n\nUnlike PoS, contributors receive rewards based on their contribution effort rather than how many tokens they stake. They are thus incentivized and recognized for the quality of their work, ideas, and alignment, driving participation and active engagement. Governance is allocated to the people most likely to care for the ecosystem’s long-term success—the contributors who have spent the most time working toward it.\n\n*II. Proof of Contribution vs Proof of Stake is the second in a [series of articles](/r/gnoland/blog:p/bgl-poc1) to dive deeply into the philosophy, vision, mechanics, and work involved in developing a new consensus mechanism for the next generation of smart contract systems. Look out for subsequent editions and additional Building Gno.land series, and let us know what you think! Got questions? Join the Gno.land [Discord](https://discord.com/invite/S8nKUqwkPn) or follow us on [Twitter/X](https://x.com/_gnoland)*\n\n\n","2024-01-26T13:37:00Z","christina","gnoland,gnovm,tm2,PoC"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["funding-program-23q4","Gno.land Funding and Grants Program - Quarterly Report: Q4 2023","\n\nThe Gno.land Funding and Grants program identifies talented and passionate developers, researchers, and tinkerers to interact with Gno.land, enhance the platform's usability, and help build the core infrastructure and tooling needed for mainnet. After a strong start in Q3 2023 from our grantees, we awarded four additional grants in Q4. Let’s take a look at their progress and what’s coming up in Q1 2024.\n\n## Q4 Funding Breakdown\n\nThe total amount paid out in Q4 for grants was just under $317,000, spread out over the four grants: Teritori, Berty, Onbloc, and Dragos (Flippando). This work was split over essential stress-testing, debugging, and development on Gno core, and building social, gaming, and project management dApps to extend the platform’s functionality. Each grant recipient received milestones for deliverables and tracked their progress through regular public and internal syncs, hackerspace journey updates, blog posts, documentation, and developer calls.\n\n[![Q4 Chart](https://gnolang.github.io/blog/2024-02-07_funding-program-23q4/src/thumbs/chart.png)](https://gnolang.github.io/blog/2024-02-07_funding-program-23q4/src/chart.png)\n\n## Berty Technologies (delivery May 2024)\n\nAfter successfully meeting their deliverables in Q3 and creating Gno Native Kit (formerly [GnoMobile](https://test3.gno.land/r/gnoland/blog:p/gnomobile)), Berty was awarded a second grant in Q4 to experiment with smart contract integrations around social media. Through the development of GnoSocial, the team has created a test bed for building decentralized social media-style apps and helped to stress test technical issues in Gno.land. \n\nIn Q4, Berty delivered V1 of GnoSocial, which includes basic Twitter-like functionality. GnoSocial will be implemented on mobile using the Gno Native Kit framework, with a minimal desktop app and a read-only web version also in the scope. Aside from this work, Berty contributes to Gno core development, helping raise issues and merge PRs. You can follow their progress in hackerspace [issue 51](https://github.com/gnolang/hackerspace/issues/51).\n\n## Teritori (delivery February 2024)\n\nAfter delivering the [moderation module](https://test3.gno.land/r/gnoland/blog:p/gnoland-moderation-dao-module) in Q3, Teritori received a second grant to carry out research and implement a conflict resolution module and an on-chain project management tool. Their work also continues on the escrow module build. As an active contributor, the Teritori team helps improve Gno core as well, getting more PRs merged, participating in regular meetings, and writing documentation. Read more about Teritori in their hackerspace [issue 7](https://github.com/gnolang/hackerspace/issues/7).\n\n## Dragos (Flippando, delivered January 2024)\n\nTo experiment with gaming in Gno.land, Dragos received a grant to port his on-chain memory game Flippando from Solidity. Flippando is a simple memory game—with a twist. Players uncover tiles and must find their matches to win the game. The result can be minted as an NFT and assembled to create larger, more complex NFTs and digital “paintings.” The beta version of [Flippando](https://gno.flippando.xyz/flip) is now live on the testnet, and you can read about his experiences in developing the game on the [Gno.land blog here](https://test3.gno.land/r/gnoland/blog:p/porting-flippando-gno) or visit [hackerspace issue 33](https://github.com/gnolang/hackerspace/issues/33).\n\n## Onbloc (ongoing)\n\nAfter producing consistently awesome work and being our longest-standing contributor, Onbloc received a grant in Q4 2024 to continue iterating on Gno.land tooling, Adena, and to help build Gno.land core in preparation for mainnet release. Part of the scope was to support contract-to-contract interaction [issue 757](https://github.com/gnolang/gno/issues/757), lead a [multi-node testnet initiative](https://github.com/gnolang/hackerspace/tree/main/multinode-testnet), write pure Gno packages, and help debugging the GnoVM, among many other initiatives. Onbloc is also adding additional security to the Adena wallet and an “Airgap” feature, which you can read more about in [hackerspace issue 29](https://github.com/gnolang/hackerspace/issues/29). We’ll also release a detailed blog post soon, so stay tuned.\n\n## Coming Up in Q1 2024\n\nWe’re looking forward to more exciting developments in the coming year as we focus on the road to mainnet. In Q1, grantees will mainly focus on debugging Gno core, developing smart contracts and libraries, building and porting dApps to Gno.land, and creating educational materials to help grow the community.\n\nBlockchain software and virtual reality technologies firm Varmeta are under evaluation for a grant to support account sessions and build the Gno.land Unity SDK to make blockchain more accessible to game developers (you can track their progress in [hackerspace issue 43](https://github.com/gnolang/hackerspace/issues/43)). We’re also finalizing a grant for a DAO tinkerer and a research report, as well as evaluating the extension of a second grant to Dragos to port his popular project management app to Gno.land. \n\n\n*We’re steadily building out the Gno.land platform and our ecosystem of grantees and contributors. Let us know if you want to join us by submitting an application at any time on the [Funding and Grants repository](https://github.com/gnolang/ecosystem-fund-grants). We’re always on the lookout for ideas to advance the platform.*\n\n\n","2024-02-07T13:37:00Z","christina,michelle","gnoland,funding,grants"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["wyg-dragos","Who You Gno – On the Record with Dragos Roua","\n\nDragos Roua is a humble man. If you had the chance to read his article, [*5 Things I Learned While Porting Flippando From Solidity to Gno*](https://test3.gno.land/r/gnoland/blog:p/porting-flippando-gno), you’d have seen him refer to Flippando as his “tiny little game” and describe his “surprise,” over it winning the Polygon track of the Glitch hackathon, two subsequent hackathons in South Korea, and piquing the interest of the Gno.land team to offer him a grant. If ever there were an inverse of “the empty vessel makes the loudest sound,” Dragos would be it.\n\nAt 54 years old, he’s lived an extraordinary life. Growing up in communist Romania, where scarcity was in abundance, and “everything was in short supply,” Dragos and his peers were “only allowed to learn one coding language,” and it happened to be called “Whatever.” So, when anyone asks in what languages he knows how to code, he always jokes that Romanians can code in “whatever.” Joking apart, his language skills are impressive, to say the least. \n\n## Dragos Knows a Lot of Code\n\n“My first production-level code was written in Cobol on punch cards,” he says when he was just 16. He went on to learn Smalltalk, Lua, and “just for fun,” even a programming language called “Brainfuck.” He spent many years programming in web2, iOS, and Andriod, but over the last seven years (since entering the web3 space), has been consistently working in JavaScript, Swift, Solidity (which he learned by creating Flippando), Python, and Go. Despite this, Dragos confesses he still feels more at home within the Apple ecosystem. “I've been building a lot there,” he says. \n\n## He Speaks Many Languages\nI ask if learning programming languages is similar to spoken languages. “Every programming language has vocabulary and grammar, which is a specific set of rules over that vocabulary, so it’s similar in that sense,” he says. And how many spoken languages does he know? “I can speak five Indo-European languages” (Romanian, English, French, Spanish, and Portuguese). “Five?” I gulp, wide-eyed, suddenly feeling inadequate for only speaking three. “Well, they all share about 70% of the vocabulary, and the grammar has almost the same rule set,” he shrugs, minimizing his accomplishment.\n\nHe’s also learning two Asian languages with varying degrees of success. Korean, a language he understands “some 40%” of, Dragos admits, is a different ballgame. “I've been frustrated for nine months, every day trying to plug away because there's literally no similarity in vocabulary between any Indo-European language and Korean. Literally no word is the same, and the grammar is also very, very different.” He explains that learning a language like Korean means starting from zero and waiting for the brain to forge the neural paths. “It's quite difficult to do,” he concedes.\n\n## A ‘Location-Independent’ Lifestyle \nI check out the backdrop behind him. He’s taking the interview from an elegant cafe in downtown Saigon with impressive dark wooden walls, large ceiling fans circling above, and a rich colonial atmosphere. “It’s such a posh place,” he smiles, “every day, there are groups of people taking pictures. It has an Indochina vibe.” I can’t help but wish I could teleport over and share a beer with Dragos as we discuss his remarkable life. “How long have you lived there?” I ask, “I don’t live in Saigon,” he replies, “I’m location-independent.”\n\nAs I wonder if that’s a more elegant term for “digital nomad,” Dragos quickly explains the difference. Digital nomads typically have no fixed abode, he says, and tend to set up a base for a short period of time before moving on to the next place. Location-independent is someone who has a base but is independent of it and chooses to spend longer periods of time in various places. “So I became a loner,” he says, “and I’ve been location-independent for six years. I spent my first two and a half years in Spain, then from Spain, I moved to Portugal, which is my base right now, and I started to explore Asia last year.”\n\n## A Love of the Open Road\nI point out how amazing his lifestyle sounds—and also how challenging it must be at times. Dragos loves the freedom that comes with being alone in a foreign land and the master of his destiny. He also thrives on learning from different people and cultures and discovering more about himself. “The more you travel, the more you learn. Where can you stay? Where can’t you stay? What is needed? You learn the logistics, and you become a much better administrator and manager of your life.”\n\nHe admits to feeling lonely at times. Being location-independent isn’t for everyone, and certainly not if you don’t like being alone. “It's very difficult to be on the road because you don't have many friends. You don't have a fixed social circle. I'm in a place right now where I'm quite comfortable with myself. I can spend long periods of time on my own without needing close encounters. I have a very limited circle of friends, which I keep in touch with every month or so.”\n\nThe cultural differences between Europe and Asia are something of a double-edged sword as well. Dragos likes Vietnam, where the people are friendly and welcoming and talk to him on the street out of curiosity or to practice their English. But he’s felt like quite an outsider in South Korea, where the culture of politeness and restraint makes it harder to establish meaningful friendships. \n\n## Astrology, AI, and Other Mind-Blowing Stuff\nTalking about human connections inevitably leads to the increasing lack of them—and the topic of AI. I ask how he feels about the prospect of AGI and a potential replacement species. He shrugs and points out that most of what we hear about AI is marketing. He thinks that LLMs (Large Language Models) will hit a wall when they run out of good data to be trained on. He is a little concerned about the prospect of election rigging and AGI being harnessed in the political sphere by nation-states attempting to outmaneuver each other by predicting the next plausible move. “But this is a can of worms,” he says.\n\n“Actually, at the most fundamental level, there is no difference between AI and the process by which we generate ChatGPT or any other language model, and… hold your breath,” he pauses, “astrology. They both take a set of arbitrary features and a set of desired outcomes. After that, they just do a lot of computation, by trying to minimize a cost function between the predicted and expected outcome. That's all there is to it. You take features, add some parameters, trillions of parameters, you run a lot of computation, and in the end, you have the most plausible outcome. LLMs do this in hours/days/weeks of training, astrology did it slowly, over the course of a few thousand years.” \nI ask Dragos if he hadn’t been a programmer, would he have perhaps become an astrologer instead? “I actually studied astrology and used it for 18 years,” he replies.\n\nI try hard not to fall off my chair. Dragos explains that astrology plays a huge role in his life, and he consults it before making any major decision—such as moving countries or leaving jobs. “I consult it on every major decision and even daily life. So wherever I have to, I use it. When I sold one of my companies, when I decided to move abroad, when I travel, and stuff like that.” He gives the analogy of meteorology and says if he knows it’s going to rain, he’ll take an umbrella to have less friction and move around more easily. In the same way, he applies astrology to his life. This man is a Pandora’s box.\n\nWhat else does he do in his spare time besides traveling the world, consulting the Cosmos, and writing code for fun? Dragos likes playing pool, socializing, dining out, and dancing. “I was a tango dancer back in Romania. I had a tango school for a year.” At this point, I’m hardly surprised. \n\n## Dragos on Gno.land \nI met Dragos last year in Seoul at a Gno.land event hosted with Onbloc during BUIDL Asia. That’s when he spoke to Manfred about Flippando and subsequently applied for a grant. We were still building the specs for the Grants Program at the time, and Dragos was our first grantee. Since then, he’s embarked on a whole new journey learning Gno and building the airplane as it flies, delivering Flippando last month and regularly helping the team with Gno.land core issues.\n\nDragos has since submitted a second grant proposal to port his project management app to Gno. “It uses my life management framework, which I call “assess, decide, do.” The name of the project is *ZenTasktic*. There is already an app on iOS that I wrote,” he explains. You can read more about his grant proposal [here](https://github.com/gnolang/ecosystem-fund-grants/pull/11) and be sure to test out [Flippando](https://gno.flippando.xyz/flip) today.\n\nI apologize for taking so much of Dragos’ time, but he assures me it isn’t a problem. “I don’t work today, I'm not busy. I'm just enjoying my afternoon in this coffee shop.” As Dragos sips on the local tipple and drinks in the sights and sounds around him, I can’t help but admire his outlook on life and the choices he’s made—and I look forward to seeing what he's up to next and what else he builds with Gno.\n","2024-02-08T00:00:00Z","christina","whoyougno,flippando,community,interview"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"3nwArwBmZb8VCjyH/RcbF0lmL4AcZqbrRiGTFHDOBV8EVBlxiLqR6CEt+7LzmhZwLAIIX6lq/C0b2hccVGNUYw=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-6","The More You Gno: Gno.land Monthly Updates - 6","\n\nWelcome to the latest edition of The More You Gno, your regular source of updates from the Gno.land core team and contributor ecosystem. There’s a lot to cover this month, from a company engineering retreat to new core members and contributors. We’ve made progress across the board to fix important bugs and issues and provide additional features. There’s a new way to dynamically call realms, Gno.land’s tokenomics and governance are advancing, our standard library list is expanding, and our grantees are killing it with their deliverables. Without further ado, let’s dive in.\n\n## Gno Core Team Updates - TL;DR\n\nOnly got time to skim the updates? You’ll find the highlights in the list below. If you want to dive deeper into the topics, track our progress, understand the rationale behind our decisions, or explore the issues we came across, grab a coffee, kick back, and savor the full details.\n\n* **The Portal Loop** – Much of our focus over the past few months has been on the Portal Loop [(issue 1108)](https://github.com/gnolang/gno/issues/1108), which will make developing on Gno smoother, faster, and more intuitive. The Portal Loop will speed up deploying dApps and improve the UX for Gno.land devs.\n\n* **Dynamic Realm Caller** – We’ve added a new way to call realms dynamically so that dApps no longer have to manually import GRC20/721 tokens [(PR 1262)](https://github.com/gnolang/gno/pull/1262).\n\n* **DAO Structure \u0026 Tokenomics** – We’re close to finalizing the DAO structure of Gno.land and its tokenomics. There will be three main DAOs, GovDAO, EvaluationDAO, and SupportDAO. We’re exploring staking options for GNOT holders and working on transaction fees and gas.\n\n* **Gno Playground** – Gno Playground is an awesome way for developers to collaborate, share, and test their code. The full version isn’t ready yet, but we’re sharing the beta with anyone who wants to help us iterate and improve this week.\n\n* **Gno Standard Libraries** – In [issue 1267](https://github.com/gnolang/gno/issues/1267), you can find our current wishlist for Gno standard libraries. If you want to see what we have and what’s lacking, or you want to contribute, open an issue or a PR.\n\n* **Gno Language Server (Gnols)** – An implementation of the [Language Server Protocol (LSP)](https://microsoft.github.io/language-server-protocol/) for Gno, Gnols makes writing code simpler and works with several editors. Visit the [CONTRIBUTING.md file](https://github.com/gnolang/gno/blob/master/CONTRIBUTING.md#vim-support-with-lsp) to try it out.\n\n* **RustVM Implementation** – The RustVM implementation is almost ready and is in the debugging stages. We’re also looking at adding a Jit compiler and researching the topics of determinism and concurrency.\n\n* **Bytecode Go VM Implementation** – The Parscan project is progressing well toward completion of the spec. We look to provide support for interfaces in the interpreter by extending the standard reflect package, also to the benefit of the entire Go community.\n\n### Engineering Retreat\nGno core engineering team got together last month in our first company-wide retreat. It was an invaluable opportunity to work face-to-face, brainstorm ideas, code together, and fix several high-level concerns. We made many improvements to the technical aspects of the project, including major advances on the Portal Loop, and strengthened our alignment through team bonding activities, socializing, and having fun. \n\nWe made multiple bug fixes and resolved many of the issues that arose out of [GnoChess](https://github.com/gnolang/gnochess) development, and Manfred and the Onbloc team (who joined us on the retreat) demonstrated a new way to dynamically call contracts using dependency injection with a registry. This, combined with Golang's interface capabilities, can achieve a good balance between dynamism, explicitness, and security (including type safety). This pattern could enable massive DeFi applications when used with GRC interfaces. It could also support contract-based DAOs where features can be added later, opening the door to new design patterns around contract upgrades. Check out [PR 1262](https://github.com/gnolang/gno/pull/1262) for more details. \n\nIt was invaluable for everyone to get plenty of 1:1 time with Jae. Morgan was able to bring the Native Bindings topic ([PR 859](https://github.com/gnolang/gno/pull/859)) much closer to completion. This has been a recurring theme in our developer calls for the last few months as it’s a complex topic that aims to change how Gno can use Go code while still being understood by static analysis tools like gno doc. Michael got greater clarity over the DAO structure and GNOT tokenomics, Milos was able to merge [PR 546](https://github.com/gnolang/gno/pull/546), after many months of effort, which adds file-based transaction indexing, and Thomas created instructions for getting started with the Gno Language Server (gnols), to give just some examples. It was productive and enjoyable and unblocked many issues. \n\nAiB engineers were also at the retreat, Zooma from Teritori, and Dongwon, ByeongJun, and Ray from Onbloc, creating plenty of opportunities for interesting discussions and showcasing our work. We also welcomed new core members Dylan and Danny to the team. Dylan is a senior software engineer, and Danny is supporting DevEx. We enjoyed meeting and hacking together with like-minded people and would like to do it more often with a broader audience. How about a Gnome contributor festival next year? Stay tuned.\n\n### Gno.land DAOs and Tokenomics\nThroughout the retreat and ongoing, we’ve made major advances to the DAO structure for Gno.land and the tokenomics of the chain. We’re still hammering out the final details, but we’ve decided on three main DAOs – GovDAO, EvaluationDAO, and SupportDAO – that will work together alongside other domain-specific DAOs, such as EngineeringDAO or ProjectsDAO, making Gno.land more decentralized over time. \n\nThe multi-tiered GovDAO will be responsible for voting on all decisions that affect the chain, such as parameter changes or validator acceptance/denial. GovDAO members will assess new contributors to the chain and allocate them a score and corresponding membership tier. EvaluationDAO will assist with specific contributions, lending its expertise and critic reviews as needed. SupportDAO will provide knowledge-specific services such as HR, marketing, and finance.\n\nRegarding transaction fees, we're exploring something similar to how Ethereum deals with gas in its EIP 1559 update. Essentially, a combination of comparing a new block’s size with the last block to gauge demand and some small parameters we’re looking at. We’re also experimenting with staking alternatives where contributors can stake their tokens to support certain projects in return for staking rewards. It’s still early days, so watch this space. We’ll be releasing more details soon. \n\n### Gno Playground\nGno Playground is a simple web interface that lets you share your code, run unit tests, deploy your realm and package, and execute functions in your code using the repo for a smoother and more collaborative developer experience. We’re excited to release Gno Playground out in the wild later this month in a soft launch set for November 28. If you’re interested in testing it out, head over to our Discord channel. We’re looking for feedback and help to identify bugs and improve the UX before its full launch in the new year. It will be interesting to see how people interact with the Playground and how they use it so we can iterate and attract more gnomes to our growing community.\n\n### The Portal Loop\nThe Portal Loop is an effort to create a continuously-deployed staging testnet to be hosted on the official [gno.land website](https://gno.land). The testnet will be reset at each commit on our repository, but it will re-play all the transactions from its previous version, dropping any that might fail following breaking changes in the code. The Portal Loop will provide a central place where you can experiment with the latest Gno.land updates, resolving the problem our existing testnets have faced (becoming stale only a few months after their launch) while also paving the way for building DAOs and on-chain Game of Realms and Proof-of-Contribution systems. \n\nWithin the Portal Loop efforts, we’re also building systems to more efficiently iterate locally on your Gno realms, similar to the previously described testnet. The Portal Loop will help to create an iterative cycle focused on development, testing, and feedback, enhancing local development and the Gno.land website. As developers are discovering, when building dApps like GnoChess, GnoMobile, or Flippando, they run into issues with the repo, GnoVM, and client libraries when developing locally.\n\nThe Portal Loop will enable much quicker feedback so we can iterate, uncover, and fix problems faster. Devs will get a greatly improved UI, with UX contributions and issues much easier to resolve, and the same CI/CD experience as web2 applications, where each time something is published on Git, they get instant feedback on how it works in staging, not only in terms of code but also in terms of data. Stay tuned, the Portal Loop is coming soon!\n\n### Standard Library Wish List\nThe standard library wish list in [issue 1267](https://github.com/gnolang/gno/issues/1267) is intended to be a starting place for anyone who wants to add new standard libraries to Gno. It's an opinionated collection of libraries that we would like to see added. So, if you see something missing that you’d like added to our standard libraries, leave a comment explaining your reasoning. If you want to port over a standard library from the list, make an issue for it and assign yourself, or if you can do it quickly, make a PR referencing the issue. You can see the global status of our standard libraries (as compared to Go) on our [Go\u003c\u003eGno compatibility document](https://github.com/gnolang/gno/blob/d421b963aed7f7c3ba3718edfc6fbd787fa8f0dd/docs/reference/go-gno-compatibility.md).\n\n### Dreaming with SOGNO\nThe Sogno project is a [dream](https://www.wordreference.com/iten/Sogno) Morgan has about improvements he plans to make on GnoVM. From his experience working on GnoChess, he found that many features were lacking that would have improved the workflow, for example, an improved debugging system, enhanced representation of the values within the VM, having maps as sortable data structures, and adding reflection. Morgan plans to work on this project on the side as a fork when he has time, so Sogno won’t be merged into the master branch for now. If you want to check it out and see if you can contribute, visit the [hackerspace PR 44](https://github.com/gnolang/hackerspace/pull/44).\n\n### The Future of the Gno Language Server (Gnols)\nThe [Gno Language Server (gnols)](https://github.com/gno-playground/gnols) is an implementation of the [Language Server Protocol (LSP)](https://microsoft.github.io/language-server-protocol/) for the Gno programming language. It is similar to the equivalent “gopls” project for Go, as they can be plugged into your code editor through extensions and allow you to access handy features, such as autocompletion, formatting, and compile-time warnings/errors. Gnols makes writing code simpler, working with several editors to suit your preferences. To try it out, visit the [CONTRIBUTING.md file](https://github.com/gnolang/gno/blob/master/CONTRIBUTING.md#vim-support-with-lsp), which contains instructions to get you started. Our current documentation targets Vim, Neovim, and SublimeText, but can likely be used with any editor that supports LSP. Feel free to contribute to improving Gnols and adding more features. It’s well-written, and simple to dive into the code and add more capabilities.\n\n### RustVM Implementation\nPetar continues progressing on the RustVM implementation and has almost finished, apart from a few bug fixes. As the design is now complete, he will enter the testing stages. He is also looking at how to add a Jit compiler to the current design. Petar was initially concerned that the garbage collector might have presented serious issues, but this has turned out not to present a problem. Adding a Jit compiler will require a lot of work (at least six months) to support everything in the language, but it should be possible.\n\nPetar is also looking at implementing concurrency the way it is in Go to have a fully functional virtual machine as it is in the spec. This would likely attract more external contributors to developing the VM. One advantage of Rust is that, with the concurrency model, there is already an extensive library called [Tokio](https://tokio.rs/) which he can use. Petar stresses that this isn’t easy, but he believes it’s achievable, at least as a research topic around determinism and concurrency.\n\n### Go Bytecode VM Implementation\nMarc continues to develop Parscan, another bytecode VM, but entirely based on the Go runtime, with the advantage of reusing the type-checking system, concurrency model, and memory management already part of the existing Go runtime. In the last month, the support for all missing declaration statements (constants, variables, and types) was added in the code generator.\n\n## Grantee and Ecosystem Updates\nOur ecosystem partners and grantees are working flat out on their contributions. We’re close to seeing the on-chain memory game Flippando launch, Adena and Gnoswap are incorporating some major new features, Zack’s released another informative tutorial as part of the Go to Gno series, and we’ve received several new grant proposals as well. We’ve even welcomed a new contributing team, Varmeta, to the fold. Scroll through the details below.\nTL;DR?\n* On-chain memory game Flippando is coming soon\n* Gnomobile is almost complete and will be receiving a rebrand soon\n* Gnosocial will allow devs to experiment with social media dApps\n* Experiment with content moderation using the ModerationDAO or create your own DAO\n* Gnoswap AMM DEX beta will launch in December\n* Adena to implement new ‘Air-Gap’ feature\n* Varmeta is working on Gno.land Unity SDK to make Gno more accessible to game developers\n\n### Dragos\nDragos has been working on porting his on-chain memory game Flippando from Solidity to Gno, and we’re looking forward to playing it soon after seeing an awesome demo earlier this month. When you play Flippando, you uncover a matrix of matching visual symbols. There are 2 levels of difficulty (matrix made of 16 tiles or 64 tiles). For the launch, Dragos aims to have visual symbols containing basic colors, dice, hexagrams, or various gradients. Once you’ve matched all the pairs and completed a matrix, you mint an NFT that can be assembled as artwork on-chain and traded in a marketplace. Dragos is currently looking at the initial tokenomics for Flippando, with a fixed supply of 1 billion and no airdrop distribution (more details soon). \n\nDragos has been a mobile app developer for over 10 years, with an interest in blockchain for around seven years. He enjoys working with Gno, although having to reset the chain and redeploy programs each time he makes a change was a challenge. The Portal Loop solves these issues in local development and will allow him to deploy Flippando sooner. As part of the work for Flippando, Dragos also added [PR 1309](https://github.com/gnolang/gno/pull/1309) to improve our GRC721 implementation]. He is also applying for a grant to port his project management system on-chain for Gno, and he gave us a [demo](https://drive.google.com/file/d/1eJGyATHhEzletWwQ4Xt_9ON7L231Yvow/view). An on-chain project management tool will be essential for organizing the DAO system, focusing on our team’s needs, organizing tasks, setting goals, and more. Keep up with Dragos’ progress by visiting his [hackerspace](https://github.com/gnolang/hackerspace/issues/33).\n\n### Berty\nBerty has been powering ahead with Gnomobile (which will soon receive a new name to better reflect its functionality), Gnosocial, and Gno core. Some highlights include significant progress on the GRPC interface (see [demo video]https://www.loom.com/share/d1cef60199c0487e86deab2a9e61d61c). As the interface to Protobuf has many more data types available than the interface to the language bridge, GRPC greatly simplifies the app and improves the UX. The API is almost complete and now includes wallet functions, such as creating an account and restoring an account from the recovery phase, and an event stream when calling a realm function [(demo video available here)](https://www.loom.com/share/42f2dcb0b4a34f77a95a0f8012e4b52b).To help developers, Gnomobile also includes example apps. Here is a [demo video](https://www.loom.com/share/41a20a764f0f4caf91f068b62e1f16c4) of the latest minimal hello app.\n\nBerty created [PR 1235](https://github.com/gnolang/gno/pull/1235) relating to Amino. They start with a Go struct and add comments explaining all the fields. Previously, when they ran Amino and generated a Protobuf structure, all their comments disappeared. This PR allows them to preserve the comments. They also created [PR 1213](https://github.com/gnolang/gno/pull/1213) since Amino should create a Protobuf structure where the fields follow official naming conventions. Thanks to help from the Gno devs, these PRs are merged.\nBerty is also focused on building a decentralized social media application using the Gnomobile framework, which is almost complete. The aim is to create a testbed where dApp builders can see how their implementations integrate and function with web2-like social media features, opening the door to interesting experiments such as DAO collaboration and content modification. Berty is building a decentralized Twitter-like application and plans to finish it in six months. Check their progress on their [hackerspace here](https://github.com/gnolang/hackerspace/issues/28) and look for more upcoming demos.\n\n### Teritori\nTeritori has been focusing on Escrows in the past couple of months, aiming to make improvements that facilitate on-chain project management. The team is also iterating the Moderation DAO and has identified a need for a conflict solver module to call an external authority to solve a conflict between two parties (for example, the buyer and the seller). They have called this module the Conflict Solver Module and integrated several options like Justice DAO (composed of humans) or any realms (e.g. GnoChess) to solve the conflict. They are researching work on VRF to implement randomness so that the module selects a person (or group of people) with no conflicts of interest in the issue. [PR 11](https://github.com/TERITORI/gno/pull/11/files) provides more details. A true randomness function will also be handy for the Flippando game that doesn’t currently rely on true randomness. \n\nIn other news from Teritori, the moderation DAO is live! You can head to the [Teritori site](https://app.teritori.com/feed?network=gno-teritori) to play around with it and even try deploying your own DAO, creating a user profile, and adding a social feed. The team has deployed V1 of a “Soundcloud-like” app on the [Gnosocial feed](https://app.teritori.com/feed?network=gno-teritori) in which you can listen to music while browsing features, publish your own music as an artist that appears on your profile, comment on tracks, tip artists, and more. Keep updated with Teritori on their [hackerspace here](https://github.com/gnolang/hackerspace/issues/7).\n\n### Zack Scholl\nOur resident tinkerer Zack gave a workshop last month as part of his “Go to Gno” series called [Go to Gno: ByteBeat - Generating Audio with Smart Contracts](https://www.youtube.com/watch?v=lmmUIEHhdqA). This is a really interesting tutorial on how to build Bytebeat (a minimal programming language for synthesized music) with smart contracts and follows on from his microblogging workshop. Be sure to check it out. If you want to hear more about Zack, you can also watch [Getting to Gno with Zack Scholl](https://www.youtube.com/watch?v=LgXa7QCdxdA\u0026t=1258s), a Fireside Chat series that talks about contributors’ work, lives, and motivations to be on the Gno.land journey with us.\n\n### Onbloc\nAs always, the Onbloc team has been busy! Over the past few weeks, they have been working on extending the functionality of Gnoswap, integrating APIs and realms with the interface, improving the governance page UI, and integrating the Adena wallet. Onbloc expects to launch the beta of Gnoswap next month, and we’re super excited to see it in action. To improve the UX and UI of Adena and make the wallet even more secure, the team is implementing a feature called Air-Gap which allows the wallet to broadcast transactions signed from an offline environment without the user needing to import their keys to Adena. Onbloc has also started a discussion around ideas to improve the usability of QR Codes for secure data transmissions between offline signers and watch-only wallets in [Issue 1375](https://github.com/gnolang/gno/issues/1375). We’ll keep you updated on the work here. You can also find more information on Onbloc’s [informative blog](https://medium.com/onbloc). \n\nAs well as developing core tooling for Gno, Onbloc is working on Gno core to help us build important functionality. The team welcomed a new hire, Lee ByeongJun as a core engineer and to help with work on three core areas: contract interaction (enabling realms to interact with other realms), the multinode testnet, and porting essential Go packages to Gno. You can find more details and keep track of everything Onbloc is working on in their [hackerspace issue here](https://github.com/gnolang/hackerspace/issues/29).\n\n### Varmeta\nWe’re excited to welcome a new contributor Varmeta to Gno.land. Varmeta was founded in 2020 to focus on blockchain and virtual reality/augmented reality technologies and has grown from a team of three to over 40 engineers. Varmeta is excited by the vision behind Gno.land and its philosophy for rewarding developers. The team is committed to supporting Gno’s success by providing various applications for the ecosystem, starting with the Gno.land Unity SDK to make blockchain more accessible to game developers. Track Varmeta’s progress on their [hackerspace here](https://github.com/gnolang/hackerspace/issues/43).\n\n### Gno @ Devconnect Istanbul 2023\nGno.land core team members organized a small, unofficial meetup in Istanbul during Devconnect week from November 13-17. The engineering-focused meetup was accompanied by a Happy Hour and snacks, where attendees got the chance to learn about Gno.land in an informal way and how they can easily develop dApps in Gno, as well as contribute to the project.\n\nThat's all for now! Be sure to check back again with us for the next edition of The More You Gno to keep up with all our progress. Do you want to contribute to Gno.land's monthly updates? If you're building on Gno.land and want to highlight your development, project, event, or idea, let us know, and we'll include your contribution.","2023-11-29T00:00:00Z","christina","gnoland,ecosystem,updates,gnovm,tm2"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"+Upe347IQJ1fx1YXTk5MRvGa8mxLpBabFLg7zYpCG2ZlxNldD9ha7c4M5MzYYU10siX4ODt5Lf8Op3FXGzF9tQ=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["bgl-poc1","Building Gno.land – Next Generation Smart Contract System","\n\n*Disclaimer: The Building Gno.land series aims to share the core concepts of our platform, mission, and tech stack, providing a snapshot of a current state on our builder’s journey. New episodes may deprecate previous ones, but no editions will be modified at any time. We encourage you to follow along as we create the rails for a more transparent and accountable society, and we welcome feedback and contributions to the repo.*\n\n## I. What Is Proof of Contribution (PoC)?\n\nGno.land is secured by a novel consensus mechanism that makes our platform unique—Proof of Contribution (PoC). PoC prioritizes fairness and merit, rewarding the people most active on the platform and revolutionizing the concept of open-source rewards. By removing the voting power associated with being wealthy (holding tokens in Proof-of-Stake (PoS) networks or amassing mining hardware in Proof-of-Work (PoW) networks), PoC restructures the financial incentives that tend to corrupt blockchain projects in the long run and rewards contributors fairly for their work based on their expertise, commitment, and values. \n\nGno.land contributors receive rewards and voting power according to their contribution level. These rewards increase as they make additional contributions, gain expertise, and are promoted up the Gno.land governing DAO’s (GovDAO) tier levels by higher-level contributors. So how does PoC work, what are its core features, and how does it lend security and decentralization to the platform? \n\n### Prioritizing Fairness and Alignment \n\nProof of Stake (PoS) was a monumental leap forward for the blockchain industry, solving the energy-intensive requirements of Proof of Work (PoW) and enabling blockchains to scale for broader adoption (thanks to its minimal carbon footprint and faster throughput). However, like PoW, PoS has some disadvantages. For example, in PoS networks, participants receive rewards based on how many tokens they stake, which means their incentives for working on the chain are often purely financial. Validators accumulate vast net worths and don’t always hold values that align with the core development of the chain. \n\nSince validators are crucial in securing PoS networks, they should be paid fairly for their work and encouraged to contribute more. However, validators should not be purely financially (and certainly not politically) motivated, taking up competing positions and launching political campaigns to convince token holders to stake with them. This type of lobbying affects all aspects of the chain’s development—from governance to technical upgrades—and can lead to factionalism and misalignment. \n\nPoC makes the system fairer and more sustainable, ensuring participants are aligned and take actions that benefit the Gno.land community and the broader ecosystem. That’s why (unlike PoS) contributors receive rewards based on their contribution effort (tier level) rather than how many tokens they stake. They are thus incentivized and recognized for the quality of their work, ideas, and alignment, driving participation and active engagement. Governance is allocated to the people most likely to care for the ecosystem’s long-term success—the contributors who have spent the most time working toward it—from open-source developers to video creators and everyone in between.\n\n### Rethinking Financial Incentives \n\nFor long-term security and sustainability, PoC emphasizes project principles and values over monetary gains, replacing standard token incentives with a system that separates voting power from token ownership. Two reward systems are currently being considered (in addition to a hybrid system). For the first, contributors receive WORX units that weigh the amount of GNOT tokens (the native Gno.land gas token) earned each month. Each member of the same tier receives the same amount of WORX. At the end of the month, the total each member earned is divided by the total amount of WORX distributed that month to calculate a percentage. This percentage represents the percentage of Gno.land fees earmarked for contributors that each member will earn in GNOT. WORX will likely be cleared each month to prevent cumulative, exponential reward exploits over long periods of time. \n\nFor the second, each tier level simply receives an amount of GNOT each month fixed to a USD value, similar to a salary. This would be combined with risk management and caps per tier level in order to promote long-term sustainability based on Gno.land fee generation. A hybrid of this system is also possible, either rewarding contributors of lower tiers one way and higher tiers the other or using both systems in tandem based on predefined conditions. This will be explored further in future tokenomics articles, models, and documentation.\n\nRegardless, WORX units are not transferable, will not be listed on exchanges, and hold no monetary value. WORX units are more like shares that represent value provided by contributors and allow their work to be quantified compared to other contributors/tier levels. It’s important to stress that GNOT tokens do not influence governance on the platform in any way. Voting power is earned through contributions and distributed according to contribution effort, with each member of the same tier representing equal voting power that increases with their tier level. This creates a network of highly aligned contributors who care deeply about the platform they are building and strive to improve it.\n\nGNOT, the native Gno.land gas token and the gas token of the Gno.land ecosystem, will be distributed via airdrop to qualifying ATOM stakers. It will also be available for purchase after that point (*more on Gno.land’s airdrop and tokenomics coming soon*). GNOT is used to pay all fees associated with the network and beyond, including transfers, IBC, ICS, and contract interactions, giving holders the chance to earn rewards from the economic activities of Gno.land.\n\n### What Makes a Good Contribution?\n\nWORX and/or GNOT can be earned through different types of contributions—not only coding and development expertise—but also through non-technical contributions, such as community building, governance involvement, constitutional proposals, teamwork, media creation, etc. The core focus is on alignment, not necessarily specific tasks. For example, an accepted proposal or merged code will raise or at least maintain the contributor’s tier level, allowing them to receive rewards during their time working between submissions. However, a proposal or code that has displayed a very high level of effort, detail, and aligned values (but is not merged) will also be considered in any proposals regarding contributor promotion.\n\nThis system allows the ecosystem to show appreciation for diverse forms of contributions and ‘useful failures’ that bring us closer to the solutions we adopt. It is designed to foster engagement, creativity, and collaboration while encouraging anyone aligned to contribute to growing the Gno.land chain and community. \n\n### How Are Contributions Assessed?\n\nThere is a strong human element to deciding what makes a good contribution, requiring knowledgeable human judges to exercise discretion. As such, contributions won’t be templated by default or rewarded automatically but assessed through Gno.land’s governing DAO, GovDAO. GovDAO is responsible for development and governance and is organized into tiers, as discussed above.\n\nGovDAO members review, measure, and curate contributions, and the tokenomics of GovDAO incentivizes members to be effective and unbiased evaluators. They engage in discussions and assess contributions based on effort, time, and other relevant factors/metrics that contributors will have stored in their profiles. The decision-making rationale is transparent and visible through on-chain forums. Again, contributors are assigned a tier level and receive a corresponding reward each month according to their tier. As contributors join GovDAO, the DAO grows, giving Gno.land decentralization efficiency and a high Satoshi score. \n\nGovDAO is assisted by a network of knowledge-specific DAOs, such as an Engineering DAO, a Support DAO, an Operations DAO, and the EvaluationDAO, which comprises a trusted group of high-reputation contributors that help assess specific contributions. This enables secure collaboration and seamless integration (*more on Gno.land’s network of interconnected DAOs coming soon*.) \n\n### Sybil-Resistant and Secure\n\nIn addition to being fairer, more aligned, and sustainable, PoC is Sybil-resistant by design. In blockchains, a Sybil attack is where one or multiple attackers multiply their presence and influence by creating fake identities to sway major network decisions (for example, including malicious blocks). In terms of PoS, the Sybil resistance is purely monetary (people need to stake real money to get power), so an attacker that wants to carry out a Sybil attack on a PoS network needs to lock at least as much stake as that locked by honest validators.\n\nPoC minimizes risks of Sybil attacks, takeovers, and alliances as the community vets every person who is given any power or sway in the network (including validator power) through the DAO, so at no point can anyone \"spoof\" identities and regain major sway. Moreover, Gno.land is built and secured by the merit and effort put into the project, as opposed to how many tokens someone can buy, rethinking financial incentives and making the platform Sybil-resistant and secure.\n\nThrough fairer rewards, restructured incentives, resistance to corruption and Sybil attacks, and a strong appreciation for all contributions, Gno.land is designed to be sustainable and fair. A censorship-resistant platform built, owned, and secured by a growing, aligned community for many generations to come.\n\n*I. What Is Proof of Contribution? is the first in a series of articles to dive deeply into the philosophy, vision, mechanics, and work involved in developing a new consensus mechanism for the next generation of smart contract systems. Look out for subsequent editions and additional Building Gno.land series, and let us know what you think! Got questions? Join the Gno.land [Discord](https://discord.com/invite/S8nKUqwkPn) or follow us on [Twitter/X](https://x.com/_gnoland)*.\n","2024-01-10T10:51:00Z","","building-gnoland,gnoland,proof-of-contribution"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"LRJxqnoALsPWY9uPbXT1jQyGsHoDNmSSfY2kf0afsxpMX1TYaWcd8v2AcjfTarP2+U8F2NwK7GdY9qUK4DrKrg=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-7","The More You Gno: Gno.land Monthly Updates - 7","\n\nWelcome to the latest edition of *The More You Gno*, your regular source of updates from the Gno.land core team and contributor ecosystem. After a well-deserved rest during the holiday break, we’re kicking off 2024 with renewed energy and plenty of exciting initiatives, including a new staging testnet (the Portal Loop), the official Gno.land documentation page, several merged PRs (including native bindings!), and many updates across the board. Dive in to find out what we’re working on and what our ecosystem partners and grantees have been up to.\n\n## Gno Core Team Updates TL;DR\n\nShort on time? Skim the highlights from the core team in the list below. You’ll find additional details in the next section if you want to explore any topic in greater detail.\n- **Native Bindings** - If you’ve been following our journey or experimenting with the platform, you’ll hear virtual champagne pops as Morgan’s ongoing work with native bindings is finally merged [PR 859](https://github.com/gnolang/gno/pull/859).\n- **Gnodev** - Thanks to Guilhem’s `gnodev` initiative [PR 1386](https://github.com/gnolang/gno/pull/1386), you can now create and develop contracts with a single command.\n- **Gno.land Offical Docs** - Check out [docs.gno.land](https://docs.gno.land) for how-to guides, getting started, and an overview of key concepts of the platform.\n- **Effective Gno** - Taking inspiration from *Effective Go*, Manfred’s begun listing common patterns and examples of the differences between Gno and Go.\n- **Assignment in GnoVM** - Jae is working on approaches to fixing assignment in the GnoVM and issues that deal with persistence [(issue 1326)](https://github.com/gnolang/gno/issues/1326). \n- **Portal Loop** - The [Portal Loop](https://portal.gnoteam.com) has been released on a staging domain and is being tested.\n- **Roadmap** - We’re working on a fully-fledged Gno.land roadmap and will share a detailed DAG and important goals and milestones with you soon.\n- **Tendermint2 Update** - There are several PRs aimed at removing the dependencies between Tendermint2 and GnoVM.\n- **Gno.land Tokenomics** - We continue to make progress in defining the structure of Gno.land’s DAOs and the design of reward schemes for contributors.\n### Native Bindings (PR859) Has Been Merged\n[PR 859](https://github.com/gnolang/gno/pull/859) (native bindings) was submitted by Morgan in May 2023 to improve calling Go code from Gno standard libraries, all while improving `gno doc` documentation for standard library functions. Native functions are _declared_ in Gno code, but their definition (the underlying code) only exists in Go: this is similar to how Go and many other systems languages implement assembly functions. Overall, the addition will now allow us to better support precompilation (transpiling Gno code to Go) for all Gno-specific standard libraries, like [`std`](https://docs.gno.land/reference/standard-library/std/address/), and have a system for defining such functions that is transparent to code analysis tools like `gno doc` and `gnols`.\n### Gnodev Has Been Merged\n[PR 1386](https://github.com/gnolang/gno/pull/1386) (`gnodev`) has been merged. Gnodev is a tool to locally develop Gno realms which automatically re-deploys your contracts when you change the files, similar to JavaScript frameworks `npm run dev`. There are some additional features being worked on to improve the experience, including browser hot-reload (for the full front-end JavaScript experience!)—and Gno core developers who have worked on realms all agree that thanks to `gnodev`, they can finally stop visiting their therapist every week. Play around with it, and let us know how you get on. There may be a few bugs still and Guilhem is happily accepting feedback.\n### The Gno.land Official Documentation Page Is Live\nWe’re excited to have the Gno.land Official Documentation page live on the [https://docs.gno.land](https://docs.gno.land) domain. This will always be a work in progress as we expand the docs, make iterations to existing issues, and refine some of the core concepts, but it’s an excellent resource for anyone wanting to find out more about Gno and for onboarding new developers to the platform. A big thanks to the Onbloc team, whose developer portal was a huge inspiration for this. We’re looking for feedback, so leave your reviews and let us know where the docs can be improved and what else you would like to see.\n### Effective Gno\nManfred has been working on a document called [Effective Gno (PR 1000)](https://github.com/gnolang/gno/pull/1000), which takes inspiration from *[Effective Go](https://go.dev/doc/effective_go)* and will become an important reference document for Gno devs to explore common patterns and crucial differences in how we program compared to Go. We’ll be iterating on this as we progress, but you can already find plenty of examples. If you’re just getting into Gno and coming from a Go background, this is a great resource. Read this document and provide some comments if you have any. \n### The Portal Loop Beta Is Live\nThe Portal Loop Beta has been released on a staging domain, and you can check it out now at [https://portal.gnoteam.com](https://portal.gnoteam.com). The Portal Loop will replace the Gno.land website once we’ve finished squashing bugs and adding features. We’re still testing it and have identified several issues. For example, from the last three merged PRs, only one triggered a redeploy when we expected two or three deploys. We will also add a faucet.\n\nAs we continue to evolve the Portal Loop out of its early development stages, transaction volume and general activity will increase. However, currently, there are insufficient transit testing transactions. One of the tasks we want to do to prove that the Portal Loop is working well enough is to write a kind of monitoring-oriented oracle that will try to make transactions, perhaps incrementing a counter every minute. We’re looking for help writing a script or a daemon for this oracle, so let us know if you want to contribute to [issue 1443](https://github.com/gnolang/gno/issues/1443). Once the Portal Loop is finished, we will focus on testnet 4.\n### Assignment Issues in the GnoVM\nMorgan came across a bug [issue 1326](https://github.com/gnolang/gno/issues/1326), which returned an error about an [“unexpected unreal object”](https://tenor.com/es/view/cranizox-gif-8576622211330078986) when assigning a local variable to a dereferenced global variable in the GnoVM. Jae has been spending some time working on approaches to solving this and fixing assignment that will also work for saving escaped objects that don't have a parent (like variables whose pointers are referenced on a persisted object). This is a tough one to figure out, so if there are any other VM issues that deal with persistence and detached parentless objects, now is the time to add them to Jae’s plate. \n### An Update on Tendermint2\n[PR 1483](https://github.com/gnolang/gno/pull/1483) has the same goal as [PR 1438](https://github.com/gnolang/gno/pull/1438): to make Tendermint2 completely independent of GnoVM and Gno.land. This continues a project started many months ago to separate Gno into three separate components: the Tendermint2 consensus engine, the Gno programming language and VM, and Gno.land, the blockchain combining both together. This way, we’re working towards making it possible to build other blockchains that use Tendermint2 (like AtomOne!), the GnoVM, or both!\n### Gno.land Engineering Retreat\nIn the last *The More You Gno*, we covered the Gno.land and AIB company-wide retreat, an invaluable opportunity to work together, code together, and get to know our peers outside of work. It was such a success that the Gno core dev team held another retreat in December in Rouen, France, where many of the above issues and PRs were tackled and merged. We look forward to more productive and frequent face-to-face meetings in the year ahead.\n### Gno.land DAOs and Tokenomics\nWith the input of Manfred, Jae, and the rest of the team, Michael continues to make advancements on Gno.land’s system of DAOs and tokenomics. One key change since the last edition is that the WorxDAO (responsible for governance and all issues related to development in Gno.land) will now be known as the GovDAO. The DAO will likely have seven tiers but initially launch with three or four. The main benefits of moving up tiers are increased voting power, increased monthly rewards, and the authority to promote members from lower tiers. GovDAO will be assisted by WorxDAO, which will encompass several different sub-DAOs, such as engineering, funding, and projects. \n\nWe’re currently exploring different reward systems for contributors, whereby each member of the same tier level will receive the same amount of rewards, either directly or indirectly, in the GNOT native gas token or USD, in a type of salary-based scheme. We may also elect to distribute rewards based on a contribution/work “hash difficulty” (total number and tier split of active contributors that month). We may also adopt a hybrid of these two models. \n\nMichael is also working on a bounty system to make Game of Realms (GoR) more accessible and evaluating contributions easier for judges. High ranking GoR competitors will likely receive Gno.land tier levels based on their leaderboard placing in addition to ATOM rewards. It’s important to note that these discussions are ongoing, and the information here may be deprecated. \n### Making Testing Faster\n\nThanks to Petar, [PR 1417](https://github.com/gnolang/gno/pull/1417), we have improved the entire VM testing suite runtime by around four minutes, which is an incredible achievement. We just need to refactor some test scenarios that are not very concurrent-friendly, but this PR makes interacting with the platform so much easier.\n\n### Bug Fixes and Miscellaneous Items\n\nThanks to Joon from Onbloc, we were able to add support for octals without 'o' (check out [PR 1331](https://github.com/gnolang/gno/pull/1331) for more details), and thanks to Dragos [PR 1309](https://github.com/gnolang/gno/pull/1309), we extended the GRC721 interface so that it now supports setting a token URI. These are both extremely welcomed contributions, and we appreciate our ecosystem partners.\n\nFrom the core team, a special shout out to Dylan for killing it fixing bugs, and getting many PRs ([PR 1451](https://github.com/gnolang/gno/pull/1451), [PR 1315](https://github.com/gnolang/gno/pull/1315), and [PR 1305](https://github.com/gnolang/gno/pull/1305), to name a few) merged over the last few weeks. Props also go to Marc for [PR 1177](https://github.com/gnolang/gno/pull/1177), which has just been merged, which fixes append in certain key situations. We’ve also welcomed a new security engineer, Kristov, to the team.\n\n## Grantee and Ecosystem Updates\n\n### Onbloc\n\nOnbloc has been on a roll, giving us an internal demo of Gnoswap beta just before the Christmas break and a public demo of its awesome Pool Incentivization feature during the last contributor sync call. With Pool Incentivization, anyone can add extra rewards on top of swap fees for LP stakers. This will help bootstrap initial liquidity for new-coming projects by attracting liquidity providers until sufficient organic trading volume is secured. Onbloc is also actively developing Adena’s Airgap feature and has improved the sign-in flow for security enhancement along with some refactoring. There will be a demo coming up in the next few weeks. Onbloc will also be researching airdrop trends and aiming to identify some of the most coveted DEX features users want to see for Gnoswap to streamline the onboarding process.\n\nRegarding Gno core, Onbloc core dev Byeongjoon Lee has developed a JSON parser for Gno, giving us a live demo during the last contributor sync. This allows the conversion or accessing of data from contracts in the JSON format, which will improve the Gno developer experience. His code is currently under review by the core team in [PR 1415](https://github.com/gnolang/gno/pull/1415). Dive deeper into Onbloc’s Builder Journey in the [hackerspace issue 29](https://github.com/gnolang/hackerspace/issues/29).\n\n### Teritori\n\nTeritori continues the challenging work of developing Gno Project Manager, a web app that allows anyone to create, fund, review, or manage projects fully on-chain. During the last contributors' call, the team gave a demo of the work achieved so far, in particular regarding the escrow system and completing project milestones so contributors can be paid once each one is completed rather than having to wait until the project finalization. \n\nGno Project Manager is a complex goal, and the team has run into some issues with edge cases they hadn’t bargained for in the relationships between grantees and funders. The team is looking for feedback and help identifying edge cases, so if you have any in mind, let them know. Teritori is also working on the conflict solver module and improving the social feed on [https://app.teritori.com/feed?network=gno-teritori](https://app.teritori.com/feed?network=gno-teritori), as well as providing more detailed documentation on their work, which they’ll be releasing in the coming weeks.\n\n### Berty\n\nThe Berty team has been busy working on GnoSocial backend implementation. The initial feature set has been implemented [here](https://github.com/gnolang/gnosocial/blob/main/realm/public.gno), including posting and replying to messages and reposting threads. You can keep up with Berty’s journey on GnoSocial in [hackerspace issue 51](https://github.com/gnolang/hackerspace/issues/51), which contains many issues and PRs, such as implementing calls, running tests, and fixing bugs. We’re super excited about pushing the limits of scalability with Berty’s decentralized social platform, and we’ll be looking forward to more demos in the coming weeks.\n### Dragos\nDragos has successfully launched the Flippando game, and you can try it out on the [testnet here](https://gno.flippando.xyz/flip). If you haven’t been following the progress, Flippando is an on-chain memory game that you can play with your choice of styles, such as dice, colors, and hexagrams. Once you successfully complete a matrix, you can mint the end result as an NFT, which can later be assembled into larger, more complex NFTs to create digital artwork. You can find out more about the game, its creator, and the official roadmap on the site. We’ll also release a blog post soon from Dragos sharing his experience porting Flippando from Solidity to Gno, so stay tuned!\n### Varmeta \nVarmeta’s update was brief this week since the contributor sync call ran over. We look forward to hearing more about the team’s progress in developing the Unity SDK for Gno next time. You can read more about it on Varmeta’s [hackerspace issue 43](https://github.com/gnolang/hackerspace/issues/43).\n\n*Do you want to contribute to Gno.land's monthly updates? If you're building on Gno.land and want to highlight your development, project, event, or idea, let us know, and we'll include your contribution. That's all for now! Keep track of our progress by following our socials [Twitter/X](https://twitter.com/_gnoland) and [Discord](https://discord.com/invite/tF2X8M6cVj) and watch out for the next edition of The More You Gno in a few weeks.* \n","2024-01-22T00:00:00Z","christina","gnoland,ecosystem,updates,gnovm,tm2"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"ugBKF9NsWRWZf6N6hGGPHyEJYEsyOgWAtehIi0F7vOJQ61owlPzb6EChjEIR/u3HyQQ+ZNMjpRblaZeiA+GxwQ=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["porting-flippando-gno","5 Things I Learned While Porting Flippando From Solidity to Gno ","\n\nLast year, while visiting Seoul, South Korea, I decided, on a whim, to sign up for a hackathon called Glitch. The project I was going to present was a tiny little game, written in Solidity, called Flippando. It started as a weekend project to help me learn Solidity (I had no prior experience with this language). To my surprise, my tiny little game won the first prize on the Polygon track of the Glitch hackathon.\n\nEncouraged and even more curious now, I started attending side events during Buidl.Asia. One was about Gno, a smart contract platform written in Go. After the presentation, which was really great, I started a light conversation with the team. One thing led to another, and I ended up showing them Flippando. \n\nJust for context, Flippando is a non-degen, deceptively simple memory game. You start with an empty matrix and flip tiles to see what’s “underneath.” If the tiles match, they remain uncovered; if not, they are briefly shown, and you have to memorize their color until the entire matrix is uncovered. The end result can be minted as an NFT, and you can later assemble all the boards into bigger, more complex NFTs, basically “painting” with the uncovered tiles.\n\nThe Gno team seemed to like it, and they suggested I should apply for a grant to port it to Go/Gno. I had no prior experience in Go either, so I thought this would be a good opportunity to learn more. To my surprise, again, my grant submission was accepted.\n\nFast forward a few months until now: the Gno version of Flippando is live (in testnet beta) at [https://gno.flippando.xyz](https://gno.flippando.xyz). What follows sums up my experience porting the game from Solidity to Gno. This blog post is a mix of technical and not-so-technical takeaways.\n\n## 1. Being Early Pays Off\n\nSolidity has been around for some time now, and there is already a solid tooling ecosystem for it. I used Hardhat for my development, and I got really comfortable with it. When I started to port Flippando, though, I was quite surprised to see there was almost no tooling in Gno. Developing was mostly TDD (test-driven development) against a local VM, and deploying realms on the actual chain was more complicated than I expected. \n\nMy first feedback rounds to the team revolved almost exclusively around this topic. Very soon, I started to receive signals that my feedback was not only heard but taken into account and processed, and there were actual projects built aiming to improve the developer experience. In just two or three months, two full projects were finished: gnodev, and Gno Playground. \n\nGnodev makes development very similar to Metro in React Native: there is a watchdog on the file system, and your changes to the realm code are reloaded every time you save. It’s almost like deploying in real time; no need to stop the chain, wipe the state, restart the chain, and redeploy your modifications. Gno Playground is a sandbox-like environment, which helps tremendously with quick testing and even deploying packages on-chain. Both projects were finished, as I said, in just two to three months.\n\nBeing early pays off because you get to shape your development environment much faster than in a solidified (pun intended!) environment. You may have to deal with a little chaos in the beginning, but the benefits are well worth it.\n\n## 2. TDD All Day Long\n\nAs I said above, developing realms in Gno consists mainly of writing and testing your code with another code. It’s called TDD and it’s a very useful developing strategy, in general. I used it, at my day job, in all my projects consistently, but only in the initial stages. Once the codebase was more stable, I was relying more on regression tests from the Q\u0026A team.\n\nMind you, there was no Q\u0026A team this time; I was just coding alone, and I was forced to comply more and more with this TDD approach. In the end, I have to admit that, while slower and a bit boring, this approach is more effective, especially in a volatile environment, where patches are added literally every day, and the environment changes continuously.\n\n## 3. Marshal and Unmarshal\n\nThe current GnoVM doesn’t yet have an API standard for formatting. You can’t put a setting somewhere that will make the response be automatically translated into JSON. You have to write these JSON objects yourself for every payload you return from your realm. \n\nIn Solidity, all this is hidden under the event mechanism and handled by existing libraries, like ether.js, which take care of all this nitpicking. It soon became obvious that development time would be significantly longer in Gno because, on top of the logic, I also had to write the formatted response “by hand.”\n\nBut as with every other thing that seemed weird in the beginning, eventually, I came to appreciate it. It forced me to prototype more carefully not only the actual response but all the objects needed in my game. Eventually, it resulted in simpler and more flexible code.\n\n## 4. Eating Your Own Dog Food\n\nWhen developing in Solidity, most of the time, you just import OpenZeppelin contracts for ERC20 and ERC721 tokens (which are battle-tested, bug-free, and relatively easy to understand) and focus on your own contract logic. No mingling with low-level token implementation details; these are already packaged and ready to use.\n\nWhile porting Flippando to Gno, I realized I had to deal with these low-level details upfront simply because there was no equivalent of the OpenZeppeling contracts. Moreover, some current GRCs (the Gno equivalent of ERC) were incomplete. \n\nSo, I had to make a PR for a GRC721 implementation that was missing the SetTokenURI functionality, and this PR ended up being merged into the main Gno codebase (that felt really good, to be honest). \n\n## 5. Being Early Pays Off. Did I Say That Already?\n\nYes, but this time it’s about something else. It’s not about the satisfaction of shaping the development environment in the early days. It’s about the privilege of witnessing something coming to life from literally nothing. Gno has been in development for almost two years now, and it is several months before its mainnet. It’s literally on the verge of coming “alive.”\n\nEvery day new commits are added, and new decisions are made. There are new contributors constantly joining, and new projects prototyped and launched faster and faster. Every day the ecosystem is coagulating itself into something more and more visible, more and more alive.\n\nBeing able to witness this from the inside is a rare privilege and something I’m very grateful for.\n\n## Final Thoughts \n\nSo, these are, in a nutshell, my five top takeaways from porting Flippando from Solidity to Gno. There are many others, of course, and Gno is (did I already say this?) still very early. If you’re interested in learning more, please visit the official repo, look at the docs, and try interacting with the devs. You’ll never gno what can grow out of it! And be sure to play [Flippando](https://gno.flippando.xyz) today live in testnet beta and share your flips.\n\n## Here’s How to Play Flippando\n\nThe game presents a 16 tiles (4x4) or 64 tiles (8x8) matrix. These tiles are “covering” a board of various colors and gradients or shapes, like dice or hexagrams. Clicking two tiles consecutively “flips” them, showing what’s underneath. If they match, they remain uncovered; if not, they are briefly shown, and the player needs to remember their position. Once an entire board is flipped, revealing its random combination of colors, the player can choose to mint it as an NFT.\n\nWhen minting a solved board as an NFT, the game also mints a fungible token, FLIP, which is “locked” inside the NFT. This is the player's “reward.” But the token can only be unlocked if someone else uses that NFT in a larger project.\n\nThese larger projects, or “artworks,” can be assembled in the Flippando Playground. All minted basic NFTs are displayed here in an area from where the player can drag and drop them onto a canvas, creating a much bigger and more complex NFT. Once the canvas is fully filled and the player is satisfied with what’s in there, these new “artwork” NFTs can also be minted. This unlocks all the FLIP tokens for the NFTs used inside the artwork and sends them to their initial players. Furthermore, these complex artworks can be listed and traded in a marketplace, closing the circle of a virtual economy of goods.\n\nStart playing Flippando and share your Flips with Gno.land on [Twitter/X](https://x.com/_gnoland?lang=en) by tagging #gnoflip. \n\n\n","2024-01-24T00:00:00Z","dragos","gnoland,ecosystem,updates,flippando"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"ToDRWXkldTORygMK7rBqhvTndOVO6ogeSUWE2YkzBIcqpdh5OtTH8QZJLCu2ZZlzTQwRVuzM+RbQ0c5lc+eytg=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["wyg-zooma","Who You Gno – On the Record with Antoine Breuil","\n\nAntoine Breuil, ‘zôÖma,’ is the co-founder of [Teritori](https://app.teritori.com/), an active Gno.land contributor and grantee that’s building key modules and tooling for Gno. A firm believer in equal opportunities, free and decentralized access to information, and helping fellow humans, zôÖma is fascinated by human behavior and how we organize ourselves, holding an avant-garde social experiment five years ago with Teritori co-founder ‘Pop.’ \"La Suite du Monde\" drew people across France to a small village in the countryside to create a shared community and society—with farmland, accommodation, and tools for common use.\n\nThe goal was to form an in-real-life DAO whose members shared common goals and interests using blockchain technology with a token to pay for goods and services and vote on governance matters. While many people participated and were enthusiastic about creating a shared society, zôÖma admits the experiment was early- no one was interested in interacting with the tech. “90% of people, rural or not, found it too complicated,” he admits. “We were a bit naive, but it was fascinating nonetheless.”\n\n## A Fascination for Human Behavior\n\nzôÖma has been an ardent student of human behavior since childhood. His parents taught him early on the value of philanthropy and working with people in need. He’s set up several joint liability companies, non-profits, and NGOs to experiment with finding new and better ways to organize society, and one of the things he loves most about web3 is its “experimental” nature. He’s encouraged by how far the industry has come since he received his first bitcoins in partial payment for a website in 2014. “That turned out to be a really expensive website for my customer,” he laughs. He never expected such broad adoption of Bitcoin and a technology that “inspired a whole generation of engineers to experiment with new things.”\n\nLike most creative types, zôÖma is used to spinning many plates in the air, overseeing La Suite du Monde while working as a freelance designer, front-end dev, and Artistic Director for an independent French record label. “Before entering the world of engineers, I founded and managed a collective for 12 years, which brought together artists from all disciplines, hackers, designers, tinkerers, to build some interesting projects.” La Suite de Monde allowed him to explore his passion for finding new approaches to social coordination first-hand. “I explored very radical things,” he says, “like the notion of “accepted by default” where anyone could use the collective budget by expressing their desire to do so three times. I wouldn’t recommend this,” he laughs, “but the experiments were fascinating and still serve me today in my work.”\n\nOne really interesting trait about zôÖma is how he harnesses the creative and analytical sides of himself with equal application. Most people are predominantly right-brained or left-brained, yet, zôÖma is ‘ambidextrous’ in this regard. He’s a designer who’s created large-scale artistic events, cultural tours of Paris, and an award-winning independent movie documenting French artist and Bitcoin advocate Pascal Boyart, [The Underground Sistine Chapel](http://www.the-chapel.art), (which you should definitely check out!). Yet he’s also passionate about engineering and the future of cooperatives. He’s detail-driven and ambitious, taking his team at Teritori from two to 18 (14 full-time teammates and four part-time).\n\nIn his free time, zôÖma, “like all French people,” enjoys fine wine and good conversation. One of the things he loves most about Paris is how easy it is to find like-minded people to brainstorm with or decompress after a long day of work. “We have a very active ecosystem of engineers, cryptographers, etc.,” he says. Paris is also a beautiful city that captures his imagination with its dazzling architecture and impressive art. Even so, zôÖma channels his creative energy more effectively when working from a small Moroccan fishing village for three months a year. He reconnects with nature and humanity, immersing himself in a different culture and surfing in the Atlantic before he starts his day. \n\n## New Tools for Social Coordination \n\nWhy does zôÖma believe social coordination is so important, and why do we need new tools for it? “We’ve always had tendencies to organize ourselves and tools defining rules for living together, diplomatic protocols for discussing between social groups, or trading goods and services. But almost all the tools that previous generations put in place are outdated. Our entire generation has lost confidence in institutions to allow groups of humans to organize, coordinate, and meet their needs. Our dependence on third parties who do not have the same interests as citizens is immense.”\n\nzôÖma believes that web3 holds the key to unlocking the emergence of new societies through products that are “unstoppable, resilient, and meet a real need,” whether for small villages in the south of France, Africa, or Asia or neighborhoods in Brazil or Korea. “We must have access to the radical transparency of institutions, the privacy of individuals, censorship-resistant tools, and autonomous communication from all commercial enterprises. It is on this solid foundation that civilizations that are more just and equitable can be built.”\n\n## Making Web3 More Accessible \n\nOf course, as zôÖma found out, building new tools is easier said than done. Our industry faces an uphill climb when it comes to balancing the promise of the tech with a user experience that doesn’t cause tachycardia. He says that understanding that most people “don’t have the time or inclination to incorporate difficult technical concepts in their lives” has given him “crazy energy to focus on very simple technologies.” In fact, the ‘failure’ of La Suite du Monde is what gave birth to Teritori, “which today provides all the functionalities people asked us for at the time; a social network, communication systems, voting, crowd-funding, etc. We have made great progress, and it’s important to focus on products that are radically simple for the general public.”\n\nAccording to zôÖma, this means abstracting away the concepts that everyday people don’t need to be aware of, such as networks, dApps, and even blockchain, “and always switching from one decentralized application to another.” Unifying (not centralizing) separate tools, networks, and technologies within a single, simple interface, he believes, is the key to broader adoption. “It's a very complex challenge, in terms of security, design, etc., but it's what I'm passionate about today.” \n\nWhen it comes to Gno.land, Teritori has already delivered essential DAO tooling and standards, a Moderation DAO module to facilitate social communication and a Justice DAO module for conflict resolution. The team is now focusing on an on-chain project management tool to allow organizations and individuals to manage projects and track tasks smoothly and transparently on-chain.\n\n## A Fairer, More Transparent World\n\nIn 2024, Teritori enters a new phase called \"Chapter II,\" which involves unifying all its work into a mobile and desktop application that could “trigger superb demonstrations of the potential of DAOs.” He enthuses, “I dream that we will see the emergence of a village that uses Teritori as a tool for internal discussion and co-financing. Will this be real in 2024? Who knows? But that’s where I focus all my energy!”\n\nHe believes the internet has been a great leveler, enabling anyone with a connection to educate themselves on any subject; yet, the opportunity isn’t open to all, and free and open access is constantly diminishing. “I am a child of the internet. I grew up with warez, p2p, and an internet which provided me with daily resources to learn freely, everything that interested me. In some countries, it is impossible to benefit from this opportunity, and with the centralization of the internet on different key players, mass surveillance, and the censorship of certain dictators, the internet is losing its very essence, which makes it magic. Distributed protocols can reshuffle the cards and offer tools for the public good.” \n\nzôÖma says that humanity is at a turning point, and we must build the necessary tools now to avoid finding ourselves in a real-life version of George Orwell’s 1984. “I aspire to participate modestly in a world that is fairer, more transparent, and where society doesn’t need a puppet in a suit to improve its living conditions or respond to local needs. Web3 is just a tool, and if it doesn't meet this real need, then for me, it will be a failure.”\n\n*Experiment with Teritori today and test its Social Feed, which now includes Twitter-like functionality for posts, Medium-style articles, Soundcloud-inspired music, and videos—all based on Gno and IPFS and totally decentralized. You can also check out Teritori’s GnoModerationModule, which allows you to moderate a social network in a decentralized way. A faucet is available on the home page at [app.teritori.com](https://app.teritori.com/feed?network=gno-teritori).*\n","2024-01-11T00:00:00Z","christina","whoyougno,teritori,community,interview"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"45ffrYxXBAQ55cETWl+gnQzcavMi//7Kz8Ih8YxojX0ZrfHVAT+w+b1VZO/5Ay2vBXaqMwQrJGWdmK4pe/XORg=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["bgl-poc2","Building Gno.land - Proof of Contribution II","\n\n*Disclaimer: The Building Gno.land series aims to share the core concepts of our platform, mission, and tech stack, providing a snapshot of a current state on our builder’s journey. New episodes may deprecate previous ones, but no editions will be modified at any time. We encourage you to follow along as we create the rails for a more transparent and accountable society, and we welcome feedback and contributions to the repo.*\n\n## II. Proof of Contribution vs Proof of Stake\n\nProof of Stake (PoS) is a robust consensus mechanism that provides a more environmentally friendly and scalable alternative to Proof of Work (PoW) and powers most of the web3 industry today. As PoS pioneers, Cosmos technology secures hundreds of blockchain projects and billions of dollars of digital assets, and Ethereum (launched as a PoW chain in 2015) made the historic switch to PoS in 2022. According to [ethereum.org](https://ethereum.org/en/developers/docs/consensus-mechanisms/pos), PoS is “more secure, less energy-intensive, and better for implementing new scaling solutions compared to the previous proof-of-work architecture.” However, as we briefly discussed in [*What Is Proof of Contribution?*](https://test3.gno.land/r/gnoland/blog:p/bgl-poc-1), PoS has vulnerabilities that can corrupt the network over time.\n\n### The Limitations of Proof of Stake (PoS)\n\nBeyond securing the network, the main goal of any consensus mechanism (PoW, PoS, DPoS, PoC, etc.) is to be as decentralized as possible and not reliant on any central actors. This can be measured by the Satoshi Score (or the Nakamoto coefficient), a quantitative measure that assesses a blockchain’s level of decentralization by calculating the minimum number of nodes needed to compromise a network or carry out a 51% attack. PoS systems can be bootstrapped within days (or even hours), starting off decentralized and achieving a high Satoshi Score.\n\nThe PoS chain Genesis allocates a default voting power to ~20-50 nodes, in general equally (or at least making sure that no single node has more than 5% of the voting power). This makes PoS chains decentralized enough (in theory) from block 0 with a near-perfect Satoshi score. However, in practice, PoS has two main issues. Because the system is dictated by money, PoS chains become imperfect over time. Anyone wealthy enough can stake their tokens progressively and use their accumulated power to sway decision-making on the chain—or take the network over completely.\n\nThe chain can limit the maximum voting power per validator node, but this is almost ineffective, as a malicious actor can carry out a Sybil attack on the network and create multiple validators to bypass the voting cap. Such an attack renders the max voting power per node useless and leaves the chain defenseless against a single organization or cartel gaining the majority of the voting power. PoS systems leave chains like Cosmos Hub and Ethereum at risk from such bad actors, cartels, and powerful protocols (such as Lido and Rocket Pool).\n\nWhile Proof of Contribution (PoC) can’t prevent Sybil attacks on standard user accounts (when malicious actors create multiple accounts with a single computer and transfer tokens within a few hours), it does make it almost impossible for validator nodes to suffer Sybil attacks. Since the community vets every person who is given voting power or sway in the network (including validator power) through the DAO, at no point can anyone \"spoof\" identities and gain major sway. \n\n### Where Proof of Contribution (PoC) Excels\n\nPoC is actually Proof of Authority (PoA) which, instead of offering up a resource like computing power or a financial stake, relies on validators staking their reputation. Anyone can join most public PoW and PoS networks without revealing their identity. However, by definition, PoA validators need to make themselves known and are selected based on their trustworthiness. This means PoA tends to work better when deployed in private or permissioned blockchains than in public platforms (because of this tendency toward centralization). \n\nPoC solves this problem, ensuring the network becomes increasingly decentralized over time by being governed by a decentralized entity, GovDAO. Like standard PoA chains, PoC chains launch with a handful of validators that must be identified and trusted by the network, meaning governance is centralized at the start, and the chain achieves a low Satoshi Score. The system is about contributing and earning contribution units, which are slow to gain and require human interaction. It takes months (or years) before there are enough actors in the DAO and sufficient voting power for the chain to be considered decentralized enough, according to the Nakamoto coefficient. \n\nPoC is thus slower to bootstrap than PoS and harder to achieve. You can think of PoC versus PoS as a marathon versus a sprint, whereby PoC starts slowly but then gains momentum over time, and PoS starts quickly but loses momentum over time (the graph below provides a visual representation of PoC versus PoS). \n\n[![Graph](https://gnolang.github.io/blog/2024-01-26_bgl-poc2/src/thumbs/graph-container.png)](https://gnolang.github.io/blog/2024-01-26_bgl-poc2/src/graph-container.png)\n\nThe GovDAO that owns the chain has a mandate to scale (to grow and decentralize) continuously as it adds more contributors. This means it becomes progressively larger over time, achieving high decentralization efficiency way beyond the initial fast sprint of PoS chains. Once established as a proven consensus mechanism and alternative to PoS, GovDAO can benefit from by any blockchain project (through an evolution of ICS) wanting to achieve decentralization and sustainability—PoC can secure Gno.land and the web3 industry at large.\n\n### Security-Conscious by Design\n\nAnother advantage of PoC is that because it’s reliant on human interactions, it is more Sybil-resistant by design. As discussed, it’s almost impossible to split a validator node into two (or more) nodes, making conducting a Sybil attack infinitely difficult. Since contribution units are not transferrable or exchangeable, PoC cannot suffer from whales attempting to purchase voting power quickly. If someone wanted to take over the network, they would need to invest years of their time making meaningful contributions. Their attack would be so slow that it would easily be prevented by humans monitoring the decentralization and adjusting the parameters. \n\nMoreover, GovDAO will activate and deactivate new validators on request, establish a KYC system for validators, and manage promotions of contributors with votes. This removes the possibility of a takeover happening overnight since the only way to gain validator or voting power is by voting on governance requests, which is slow and managed by humans. This is in contrast to PoS systems which are powerful and fully automated yet defenseless against such coordinated attacks.\n\nGno.land is built on the very premise that such an attack on a PoC network would never happen as it would be entirely counter-intuitive. Since contributions are not only about expertise but also alignment, it is our hypothesis that longstanding contributors who have invested years of time and brainpower in developing the chain will do their best to protect it rather than destroy it. The DAO system will endure thanks to the mix of expertise and alignment and the amount and frequency of contributions. \n\n### Concluding Thoughts\n\nBeyond separating voting power from net wealth, a core component of Proof of Contribution (PoC) is its focus on long-term sustainability. PoC makes the system fairer and more sustainable, ensuring participants are aligned and take actions that benefit the community and the broader ecosystem. PoC is slower to bootstrap and harder to achieve than PoS but focuses on long-term alignment and security. \n\nUnlike PoS, contributors receive rewards based on their contribution effort rather than how many tokens they stake. They are thus incentivized and recognized for the quality of their work, ideas, and alignment, driving participation and active engagement. Governance is allocated to the people most likely to care for the ecosystem’s long-term success—the contributors who have spent the most time working toward it.\n\n*II. Proof of Contribution vs Proof of Stake is the second in a [series of articles](/r/gnoland/blog:p/bgl-poc1) to dive deeply into the philosophy, vision, mechanics, and work involved in developing a new consensus mechanism for the next generation of smart contract systems. Look out for subsequent editions and additional Building Gno.land series, and let us know what you think! Got questions? Join the Gno.land [Discord](https://discord.com/invite/S8nKUqwkPn) or follow us on [Twitter/X](https://x.com/_gnoland)*\n\n\n","2024-01-26T13:37:00Z","christina","gnoland,gnovm,tm2,PoC"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["funding-program-23q4","Gno.land Funding and Grants Program - Quarterly Report: Q4 2023","\n\nThe Gno.land Funding and Grants program identifies talented and passionate developers, researchers, and tinkerers to interact with Gno.land, enhance the platform's usability, and help build the core infrastructure and tooling needed for mainnet. After a strong start in Q3 2023 from our grantees, we awarded four additional grants in Q4. Let’s take a look at their progress and what’s coming up in Q1 2024.\n\n## Q4 Funding Breakdown\n\nThe total amount paid out in Q4 for grants was just under $317,000, spread out over the four grants: Teritori, Berty, Onbloc, and Dragos (Flippando). This work was split over essential stress-testing, debugging, and development on Gno core, and building social, gaming, and project management dApps to extend the platform’s functionality. Each grant recipient received milestones for deliverables and tracked their progress through regular public and internal syncs, hackerspace journey updates, blog posts, documentation, and developer calls.\n\n[![Q4 Chart](https://gnolang.github.io/blog/2024-02-07_funding-program-23q4/src/thumbs/chart.png)](https://gnolang.github.io/blog/2024-02-07_funding-program-23q4/src/chart.png)\n\n## Berty Technologies (delivery May 2024)\n\nAfter successfully meeting their deliverables in Q3 and creating Gno Native Kit (formerly [GnoMobile](https://test3.gno.land/r/gnoland/blog:p/gnomobile)), Berty was awarded a second grant in Q4 to experiment with smart contract integrations around social media. Through the development of GnoSocial, the team has created a test bed for building decentralized social media-style apps and helped to stress test technical issues in Gno.land. \n\nIn Q4, Berty delivered V1 of GnoSocial, which includes basic Twitter-like functionality. GnoSocial will be implemented on mobile using the Gno Native Kit framework, with a minimal desktop app and a read-only web version also in the scope. Aside from this work, Berty contributes to Gno core development, helping raise issues and merge PRs. You can follow their progress in hackerspace [issue 51](https://github.com/gnolang/hackerspace/issues/51).\n\n## Teritori (delivery February 2024)\n\nAfter delivering the [moderation module](https://test3.gno.land/r/gnoland/blog:p/gnoland-moderation-dao-module) in Q3, Teritori received a second grant to carry out research and implement a conflict resolution module and an on-chain project management tool. Their work also continues on the escrow module build. As an active contributor, the Teritori team helps improve Gno core as well, getting more PRs merged, participating in regular meetings, and writing documentation. Read more about Teritori in their hackerspace [issue 7](https://github.com/gnolang/hackerspace/issues/7).\n\n## Dragos (Flippando, delivered January 2024)\n\nTo experiment with gaming in Gno.land, Dragos received a grant to port his on-chain memory game Flippando from Solidity. Flippando is a simple memory game—with a twist. Players uncover tiles and must find their matches to win the game. The result can be minted as an NFT and assembled to create larger, more complex NFTs and digital “paintings.” The beta version of [Flippando](https://gno.flippando.xyz/flip) is now live on the testnet, and you can read about his experiences in developing the game on the [Gno.land blog here](https://test3.gno.land/r/gnoland/blog:p/porting-flippando-gno) or visit [hackerspace issue 33](https://github.com/gnolang/hackerspace/issues/33).\n\n## Onbloc (ongoing)\n\nAfter producing consistently awesome work and being our longest-standing contributor, Onbloc received a grant in Q4 2024 to continue iterating on Gno.land tooling, Adena, and to help build Gno.land core in preparation for mainnet release. Part of the scope was to support contract-to-contract interaction [issue 757](https://github.com/gnolang/gno/issues/757), lead a [multi-node testnet initiative](https://github.com/gnolang/hackerspace/tree/main/multinode-testnet), write pure Gno packages, and help debugging the GnoVM, among many other initiatives. Onbloc is also adding additional security to the Adena wallet and an “Airgap” feature, which you can read more about in [hackerspace issue 29](https://github.com/gnolang/hackerspace/issues/29). We’ll also release a detailed blog post soon, so stay tuned.\n\n## Coming Up in Q1 2024\n\nWe’re looking forward to more exciting developments in the coming year as we focus on the road to mainnet. In Q1, grantees will mainly focus on debugging Gno core, developing smart contracts and libraries, building and porting dApps to Gno.land, and creating educational materials to help grow the community.\n\nBlockchain software and virtual reality technologies firm Varmeta are under evaluation for a grant to support account sessions and build the Gno.land Unity SDK to make blockchain more accessible to game developers (you can track their progress in [hackerspace issue 43](https://github.com/gnolang/hackerspace/issues/43)). We’re also finalizing a grant for a DAO tinkerer and a research report, as well as evaluating the extension of a second grant to Dragos to port his popular project management app to Gno.land. \n\n\n*We’re steadily building out the Gno.land platform and our ecosystem of grantees and contributors. Let us know if you want to join us by submitting an application at any time on the [Funding and Grants repository](https://github.com/gnolang/ecosystem-fund-grants). We’re always on the lookout for ideas to advance the platform.*\n\n\n","2024-02-07T13:37:00Z","christina,michelle","gnoland,funding,grants"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["wyg-dragos","Who You Gno – On the Record with Dragos Roua","\n\nDragos Roua is a humble man. If you had the chance to read his article, [*5 Things I Learned While Porting Flippando From Solidity to Gno*](https://test3.gno.land/r/gnoland/blog:p/porting-flippando-gno), you’d have seen him refer to Flippando as his “tiny little game” and describe his “surprise,” over it winning the Polygon track of the Glitch hackathon, two subsequent hackathons in South Korea, and piquing the interest of the Gno.land team to offer him a grant. If ever there were an inverse of “the empty vessel makes the loudest sound,” Dragos would be it.\n\nAt 54 years old, he’s lived an extraordinary life. Growing up in communist Romania, where scarcity was in abundance, and “everything was in short supply,” Dragos and his peers were “only allowed to learn one coding language,” and it happened to be called “Whatever.” So, when anyone asks in what languages he knows how to code, he always jokes that Romanians can code in “whatever.” Joking apart, his language skills are impressive, to say the least. \n\n## Dragos Knows a Lot of Code\n\n“My first production-level code was written in Cobol on punch cards,” he says when he was just 16. He went on to learn Smalltalk, Lua, and “just for fun,” even a programming language called “Brainfuck.” He spent many years programming in web2, iOS, and Andriod, but over the last seven years (since entering the web3 space), has been consistently working in JavaScript, Swift, Solidity (which he learned by creating Flippando), Python, and Go. Despite this, Dragos confesses he still feels more at home within the Apple ecosystem. “I've been building a lot there,” he says. \n\n## He Speaks Many Languages\nI ask if learning programming languages is similar to spoken languages. “Every programming language has vocabulary and grammar, which is a specific set of rules over that vocabulary, so it’s similar in that sense,” he says. And how many spoken languages does he know? “I can speak five Indo-European languages” (Romanian, English, French, Spanish, and Portuguese). “Five?” I gulp, wide-eyed, suddenly feeling inadequate for only speaking three. “Well, they all share about 70% of the vocabulary, and the grammar has almost the same rule set,” he shrugs, minimizing his accomplishment.\n\nHe’s also learning two Asian languages with varying degrees of success. Korean, a language he understands “some 40%” of, Dragos admits, is a different ballgame. “I've been frustrated for nine months, every day trying to plug away because there's literally no similarity in vocabulary between any Indo-European language and Korean. Literally no word is the same, and the grammar is also very, very different.” He explains that learning a language like Korean means starting from zero and waiting for the brain to forge the neural paths. “It's quite difficult to do,” he concedes.\n\n## A ‘Location-Independent’ Lifestyle \nI check out the backdrop behind him. He’s taking the interview from an elegant cafe in downtown Saigon with impressive dark wooden walls, large ceiling fans circling above, and a rich colonial atmosphere. “It’s such a posh place,” he smiles, “every day, there are groups of people taking pictures. It has an Indochina vibe.” I can’t help but wish I could teleport over and share a beer with Dragos as we discuss his remarkable life. “How long have you lived there?” I ask, “I don’t live in Saigon,” he replies, “I’m location-independent.”\n\nAs I wonder if that’s a more elegant term for “digital nomad,” Dragos quickly explains the difference. Digital nomads typically have no fixed abode, he says, and tend to set up a base for a short period of time before moving on to the next place. Location-independent is someone who has a base but is independent of it and chooses to spend longer periods of time in various places. “So I became a loner,” he says, “and I’ve been location-independent for six years. I spent my first two and a half years in Spain, then from Spain, I moved to Portugal, which is my base right now, and I started to explore Asia last year.”\n\n## A Love of the Open Road\nI point out how amazing his lifestyle sounds—and also how challenging it must be at times. Dragos loves the freedom that comes with being alone in a foreign land and the master of his destiny. He also thrives on learning from different people and cultures and discovering more about himself. “The more you travel, the more you learn. Where can you stay? Where can’t you stay? What is needed? You learn the logistics, and you become a much better administrator and manager of your life.”\n\nHe admits to feeling lonely at times. Being location-independent isn’t for everyone, and certainly not if you don’t like being alone. “It's very difficult to be on the road because you don't have many friends. You don't have a fixed social circle. I'm in a place right now where I'm quite comfortable with myself. I can spend long periods of time on my own without needing close encounters. I have a very limited circle of friends, which I keep in touch with every month or so.”\n\nThe cultural differences between Europe and Asia are something of a double-edged sword as well. Dragos likes Vietnam, where the people are friendly and welcoming and talk to him on the street out of curiosity or to practice their English. But he’s felt like quite an outsider in South Korea, where the culture of politeness and restraint makes it harder to establish meaningful friendships. \n\n## Astrology, AI, and Other Mind-Blowing Stuff\nTalking about human connections inevitably leads to the increasing lack of them—and the topic of AI. I ask how he feels about the prospect of AGI and a potential replacement species. He shrugs and points out that most of what we hear about AI is marketing. He thinks that LLMs (Large Language Models) will hit a wall when they run out of good data to be trained on. He is a little concerned about the prospect of election rigging and AGI being harnessed in the political sphere by nation-states attempting to outmaneuver each other by predicting the next plausible move. “But this is a can of worms,” he says.\n\n“Actually, at the most fundamental level, there is no difference between AI and the process by which we generate ChatGPT or any other language model, and… hold your breath,” he pauses, “astrology. They both take a set of arbitrary features and a set of desired outcomes. After that, they just do a lot of computation, by trying to minimize a cost function between the predicted and expected outcome. That's all there is to it. You take features, add some parameters, trillions of parameters, you run a lot of computation, and in the end, you have the most plausible outcome. LLMs do this in hours/days/weeks of training, astrology did it slowly, over the course of a few thousand years.” \nI ask Dragos if he hadn’t been a programmer, would he have perhaps become an astrologer instead? “I actually studied astrology and used it for 18 years,” he replies.\n\nI try hard not to fall off my chair. Dragos explains that astrology plays a huge role in his life, and he consults it before making any major decision—such as moving countries or leaving jobs. “I consult it on every major decision and even daily life. So wherever I have to, I use it. When I sold one of my companies, when I decided to move abroad, when I travel, and stuff like that.” He gives the analogy of meteorology and says if he knows it’s going to rain, he’ll take an umbrella to have less friction and move around more easily. In the same way, he applies astrology to his life. This man is a Pandora’s box.\n\nWhat else does he do in his spare time besides traveling the world, consulting the Cosmos, and writing code for fun? Dragos likes playing pool, socializing, dining out, and dancing. “I was a tango dancer back in Romania. I had a tango school for a year.” At this point, I’m hardly surprised. \n\n## Dragos on Gno.land \nI met Dragos last year in Seoul at a Gno.land event hosted with Onbloc during BUIDL Asia. That’s when he spoke to Manfred about Flippando and subsequently applied for a grant. We were still building the specs for the Grants Program at the time, and Dragos was our first grantee. Since then, he’s embarked on a whole new journey learning Gno and building the airplane as it flies, delivering Flippando last month and regularly helping the team with Gno.land core issues.\n\nDragos has since submitted a second grant proposal to port his project management app to Gno. “It uses my life management framework, which I call “assess, decide, do.” The name of the project is *ZenTasktic*. There is already an app on iOS that I wrote,” he explains. You can read more about his grant proposal [here](https://github.com/gnolang/ecosystem-fund-grants/pull/11) and be sure to test out [Flippando](https://gno.flippando.xyz/flip) today.\n\nI apologize for taking so much of Dragos’ time, but he assures me it isn’t a problem. “I don’t work today, I'm not busy. I'm just enjoying my afternoon in this coffee shop.” As Dragos sips on the local tipple and drinks in the sights and sounds around him, I can’t help but admire his outlook on life and the choices he’s made—and I look forward to seeing what he's up to next and what else he builds with Gno.\n","2024-02-08T00:00:00Z","christina","whoyougno,flippando,community,interview"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"WBB/ILu++KuEGeZ0tqn29HTZp+Rn50ttzc7NbjvJW8Ztpg3pc7mhQVuHGFUG8kJyumdomzEdMj+ty86PhOfSdA=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArDpFd2owLPsaNRQ2xWL/ELLJVVwo7OoPqIi0OtZJV7/"},"signature":"Z4tKgZW2QGk8za519s9oNghUMZ5fR2Kk3sDELn5p5jtyIC1VlkM97WFEGUKDdT0PoWd5rzwb1mLuRH7q8ONN8A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArDpFd2owLPsaNRQ2xWL/ELLJVVwo7OoPqIi0OtZJV7/"},"signature":"3BQ6N0SQthLTMb+4KybCpkQek5rIG0X+K0ZrTW1mvwNP0dy/otwOno25C1zabC726Qoa7Qp2LnjeDBRfJlzOJA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArDpFd2owLPsaNRQ2xWL/ELLJVVwo7OoPqIi0OtZJV7/"},"signature":"vnIo4ij5IX131C/rkSZTdhm8SihGjFMEs1AVxcNJ6ogscOk6pl42DLnMk6fJ4RqtAr8MLgsR4m+7+loVTa66aw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArDpFd2owLPsaNRQ2xWL/ELLJVVwo7OoPqIi0OtZJV7/"},"signature":"lQSYBqwnvsHffKjYSa07QLeC/DpDbUmB15DE/E06nMNtYa5lxSh0JaAPG8sO3LBOVpO0Ar/WEfGD2lH9zdaeuw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArDpFd2owLPsaNRQ2xWL/ELLJVVwo7OoPqIi0OtZJV7/"},"signature":"1tAmyimstCHs2hqkcQWOlit20oSwLwIDCHvk0mOJiKAiH1dQa19NFcAlNAvzQinunv/G72TjF6M/rHXHbPw+7g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArDpFd2owLPsaNRQ2xWL/ELLJVVwo7OoPqIi0OtZJV7/"},"signature":"pLZwpL6ljwBXVTHTwUnxIXgYoJUt+LLraxCIVhE2u+pM2vAM4ya/JB4r0FEecYlVBk/k9+1VD8yJpxdPUq1STw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArDpFd2owLPsaNRQ2xWL/ELLJVVwo7OoPqIi0OtZJV7/"},"signature":"Qj39uax1eWeGpt5O6X6a3k5Xzeb8zMVrGUco8yZxD2EcsCyouqlIYdGrTJMJ/0NAgRDULOvAzbWLeuCebxBZVA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArDpFd2owLPsaNRQ2xWL/ELLJVVwo7OoPqIi0OtZJV7/"},"signature":"z6e72jSNLfpbXnh6aSTD03vLK0UtvkU0UC5DbF7gHgMcV09aDF3Dk7eN5q/m2M7sdyTyJifKNOS7shEZW3tstA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArDpFd2owLPsaNRQ2xWL/ELLJVVwo7OoPqIi0OtZJV7/"},"signature":"MnHfv6h+AzBOg6pjb2qcVL9jjGGYsktohnvc/i4z80Zg+Cy1SK91AakKlcC+QrrDn7qCWjvLb6HKo73pkx6jww=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArDpFd2owLPsaNRQ2xWL/ELLJVVwo7OoPqIi0OtZJV7/"},"signature":"fVYohdS38xMAcG7hLG+thEYWkAyhzrOjvPQGrfIAJDRCP3MRbF/fassIgM/nVJrS9cISP7hnCZSWXnl6T4JBKA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArDpFd2owLPsaNRQ2xWL/ELLJVVwo7OoPqIi0OtZJV7/"},"signature":"2oNec7PxBSYlAsxHLBtB8IPxJePrlvRl0H12pNN+WF9SpSTanVvV86bpJENbbMVi6KIsLs0tHPmmgG6iCXnLMQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArDpFd2owLPsaNRQ2xWL/ELLJVVwo7OoPqIi0OtZJV7/"},"signature":"9y0iY376c+lox9JTjmFYEVJM6XvPud3WOPkWc/zi8GQuyXkhDrfjJjSvkio83mMoPhCH7Ei30azSUPisFKThRw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArDpFd2owLPsaNRQ2xWL/ELLJVVwo7OoPqIi0OtZJV7/"},"signature":"3GEluFGovSRvgKXLgQ2y+Z+hrEJ4zh+sqPBJfF8wSYkphSN04EXSffqFLT1MIXu8Kx6Y0niGPgW8qRt4vLKcMg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArDpFd2owLPsaNRQ2xWL/ELLJVVwo7OoPqIi0OtZJV7/"},"signature":"fiH0aD1pUdLomud2G+vEefDsq4YKM/vUSTwzPCe0tpsYdmbifj3jt5akYUz24AmfWHliKkzMGF+gqnRmPF7Hfw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArDpFd2owLPsaNRQ2xWL/ELLJVVwo7OoPqIi0OtZJV7/"},"signature":"DLgN0ngLjUig6XWzy49Ew0saOSiTe4bm6gYy8D2FE3clqHtYS3HDknYoxy2sY0FBTJ391LpjPAIBkbB1Pyfl7g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArDpFd2owLPsaNRQ2xWL/ELLJVVwo7OoPqIi0OtZJV7/"},"signature":"QzSI+13ikkkyKVZnyyDhkGDaHtIjzDkZDXvo1Vob4OxrL6V3t4TCwY7jgJy/OwFp+B5VOnhUGDc/Dg+fsWYLEA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","4","{\"title\":\"\",\"message\":\"Hello Gnophers! :)\",\"files\":[{\"fileName\":\"Pocket-Gopher_Ano-Nuevo-SP.jpg\",\"url\":\"ipfs://bafybeiai6da7g6avkhtftbwuqkt2yh36wf6rlpsppwyu2suzntsconclay\",\"mimeType\":\"image/jpeg\",\"size\":493981,\"fileType\":\"image\"}],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"createdAt\":\"2024-03-11T15:51:32.713Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArDpFd2owLPsaNRQ2xWL/ELLJVVwo7OoPqIi0OtZJV7/"},"signature":"hLxk/aL9ZyjuO3hxSwgl+x9iWgeliIGxUPobJ4o3NHYTLONYlvi7Ggi1HgJ+2a/XAx0DcQy6Y9FOWiJTMPcL0w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","1","🤩","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArDpFd2owLPsaNRQ2xWL/ELLJVVwo7OoPqIi0OtZJV7/"},"signature":"szo44H2Tub7IkvdpbsUkZXTpQmNiusP8ITIYA2WrgBBHZ8AyG+gykaSvKP4A1BAM9sDnL6drBijJyvqU+J4pzg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","to_address":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","amount":"20000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"mao98mGqBx0Svsav3ClD4e03fSi+YimkqRUFLmaolNAQzzT76wnJBfFZ1Wj8W0rZOr/dK+NemwBfXV4YRYwk8g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/demo/users","func":"Invite","args":["g125em6arxsnj49vx35f0n0z34putv5ty3376fg5"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"7S/kPZ/084/c+1LIMTYvXhOX/Ri6ieJrdpQqeqHyZR1QXla8bKD/nFhdstYgryj9TNAIxiJmdvdU6Qio8XHN1A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/users","func":"GetUserByName","args":["moul"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"doxXO6ioG/AU8y0HxetyLPPy+gc7E3C39jXjJ43EORRVQlk1nu+s33oPUrVhNq3RjgvpqsPvgt0ueAiy+VImKg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/users","func":"GetUserByName","args":["manfred"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"2vxM9lH66lMdDxdFUFKhPKd21WuLVrYZgOrPnGSF/J1I08NcQPvJ5uniqCJAz1XC2dSWU/+TN6gaC/zC+L0qug=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/users","func":"Register","args":["g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","leon","https://github.com/leohhhn"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"EyCqh5Szis2xEJbutgM3LNjxoMBeaW9vSphMT8vg96FU40g2KHsIHmRwdqGs/zWY7PI1tj7Trw7X3clQXAmE6w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/users","func":"Register","args":["g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","leohhhn","https://github.com/leohhhn"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"LdrgSMsz38O8DYEAsltVJqDfkzqzMr8veid9f1hG0Kh7O5dBYiy024AmlupJ86KC7NEHfUVgTUCcO5ejf0vvIw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv","to_address":"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c","amount":"20000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArDpFd2owLPsaNRQ2xWL/ELLJVVwo7OoPqIi0OtZJV7/"},"signature":"n++MOdWS5qlMLin/fR7vgC6oVv+PuaxNrPfHujBH0GBfxx4gdl9q5EWuo9UqDY/s8/7Z1mQ1ZM0BDiHj2VWPSg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","to_address":"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv","amount":"150000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"uRhSFvKy4Soe/0KDD8qGCVcV23mTarHcomL4sw7lF3xH22+C1w4owDV7FWapn4mX9i6h/p03e09TWEr24k/UVw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApW/ppgHadUkxCHXfJ29lc0cqkc7X6A0FaET+6xbvD4t"},"signature":"BpHlVA7azcGC2S0WlYEqub0smojBbK8wsxKKOLzwdmZJRvfXzsv1OgAlTD0MvoC5ai8xm4YC9NPlJHLpUv5iMg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"3000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApW/ppgHadUkxCHXfJ29lc0cqkc7X6A0FaET+6xbvD4t"},"signature":"+0IrQ+29q9ZAye3C5GY1OHtGEdkjF7aHy33SgzBPkqRE6lqCRYeSpIoxXyN/vdtAi7LEC+k14/WFbOCjMbCyXQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"1000ugnot","pkg_path":"gno.land/r/demo/wugnot","func":"Deposit","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"b/wShOikqQyd3AxS88atkyGqsGZKSMe0LU8POaO1s64nvR0BTLofSd6T4ARCQr9iQL4VFe3CQcfb74LTc9yVMg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"Withdraw","args":["1000"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"rJBxGLUVmkSujsUdwiRX4SYmbRLswdZy6E1u64ZBXxB4Y+w8ZWrJri4cspqvDBXyvIsO7JoCRhZAgk5GN4Nylw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"1000ugnot","pkg_path":"gno.land/r/demo/wugnot","func":"Deposit","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"KjHtxotoJW01MF3pgvU6QmbcvR3tj91oNfEHKy2irWpAKVpji7Mm5LropjKlfXOW+EzJGc19OWvWH6rT1ybRlA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"Withdraw","args":["1000"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"sv+LLSaWTCw5aXTt2QCOd7H1XAKQ6cl3rqUBHVf/Nf0FjbmMmmBpNxavlMMSwAmWP22ND5Hwy1qEuRtFg1USIw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","to_address":"g1l9aypkr8xfvs82zeux486ddzec88ty69lue9de","amount":"100000ugnot"}],"fee":{"gas_wanted":"800000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"nYhkH/7opUZ0u/lrqCmNK8IfONmA0Necoee5zzCoMUJgBBxd20IYjYG49BLeZjKP5mUXVj7sBNWsrTrEDSXXcw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"1000000ugnot","pkg_path":"gno.land/r/demo/wugnot","func":"Deposit","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"twX8UnltxcqsaReB1hbScpPQedmuXE1S2Wsta6PCLQYHdUxjUh8oZVgLVhL9vGDpw1HV5/CXGEMUJW3Np/Izrw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","to_address":"g14yr553ykn7lw7ex6lr6uafek2gaedvlyq0d68r","amount":"7000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApW/ppgHadUkxCHXfJ29lc0cqkc7X6A0FaET+6xbvD4t"},"signature":"FlURb8m+txwBDT9PUlU58xfFXz1/KIpbjTA/loBKzkskFfpMhaw996+Fl8bLBPVIFQrk2Hm67T5NgPMcw/UoKw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g14yr553ykn7lw7ex6lr6uafek2gaedvlyq0d68r","send":"","pkg_path":"gno.land/r/demo/postit","func":"CreateUser","args":["gojo","Gojo Saturo"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgPsmZMaFRMRHVL9X/yEgdJbrN4niUjZUFA1wDsYu1XQ"},"signature":"xhlcExJvxr1xlGQqo5XsP/5FqWHNkb1w8v8NKlawO4pQJTCGrj6P2fPJ5Iy2cpr1IYDrirGwxxpKA/m2AahQjw=="}],"memo":"createUser"} +{"msg":[{"@type":"/vm.m_call","caller":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"CreateUser","args":["naruto","Naruto Uzumaki"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApW/ppgHadUkxCHXfJ29lc0cqkc7X6A0FaET+6xbvD4t"},"signature":"9jDrwtI3ZKegOAPsG+HZ12rCNHyTo8D3bOQt/b5m4c5kUv3QiZpF0jajtzyRFrGl2b528tVZcEfDXKAVj6qM7Q=="}],"memo":"createUser"} +{"msg":[{"@type":"/vm.m_call","caller":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"SetAvatar","args":["data:image/gif;base64,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"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApW/ppgHadUkxCHXfJ29lc0cqkc7X6A0FaET+6xbvD4t"},"signature":"c4OLY/UYctRoZEgmjM4xaBcq8PRTiQS0B5ZaTHoJVEYoG4ir88pJOt1nUUQDDYyobLqwBj2M2vBM/cMsfzfYag=="}],"memo":"setAvatar"} +{"msg":[{"@type":"/vm.m_call","caller":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"SetAvatar","args":["data:image/gif;base64,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"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApW/ppgHadUkxCHXfJ29lc0cqkc7X6A0FaET+6xbvD4t"},"signature":"8VO9hDOKBBBJ9gBics8iw5fNYmWJ+6dOre2LbRk+mJ0XjtZ26twG6PPOx+JAj/5yhbukYEw+mUB96yf59Se3RA=="}],"memo":"setAvatar"} +{"msg":[{"@type":"/vm.m_call","caller":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"UpdateBio","args":[" Hokage-in-training | Shadow Clone Master | Ramen Lover"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApW/ppgHadUkxCHXfJ29lc0cqkc7X6A0FaET+6xbvD4t"},"signature":"h1umqiCeQxXh/hyMQ+ykTdH+n0A55ASIAerPMp7zpF0C7qCbZ7v5r04Fw5+vPtV9kk/BUemZovB4aLBi1w7LFw=="}],"memo":"setAvatar"} +{"msg":[{"@type":"/vm.m_call","caller":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"CreatePost","args":["Brothers in arms, rivals at heart #Team7 #NinjasForever","data:image/jpeg;base64,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"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApW/ppgHadUkxCHXfJ29lc0cqkc7X6A0FaET+6xbvD4t"},"signature":"20MHo982wDXpumGCJuXGAie6cNhVXjUfOC75jT04MvAXYFy2nuwRxnhEEgeF/CHK1HP+jEmk0AvngWo92NbndA=="}],"memo":"createPost"} +{"msg":[{"@type":"/vm.m_call","caller":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"LikePost","args":["0"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApW/ppgHadUkxCHXfJ29lc0cqkc7X6A0FaET+6xbvD4t"},"signature":"O2qw/9lMdfUhwmcpg45KaZ6aBLt35OS5IEY4uzJRr3t9dj4l7aPLOdtlt3pZug9kCwZtmYpfz4nsKfcjQDQ/IA=="}],"memo":"likePost"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"e06UnMx5vv9WPoOs/acGg3L7hLY7DHi4aD8nR9J3dzICJS2n6kgDgPyUqZ1rKk83+RusuIoUqZWCQARtHrtk7w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"Ira5iztA3NY1fKtBaFT4nv4LKSYX2VCvgUC+fYhc5YB9FgeKqzlIGft3Z7T7yTmXWMRJR0kde7Z7Hq4vG/HV5Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"MVJTnYjGVf/gPdgTG/+MKIzoKwdQoAxqZgdF1nZK/PtWEWLxH3p4mEAB99XbZPth2rLhqCpXwcI77xJAM6xBMw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","to_address":"g1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp","amount":"30000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"8uwqttD2+AkDdnCDMIGaSblpMVuBWqQOS3cIIWS53DYRLOoggKoR47eal9BkpriYhkF7RNxVoZdUhwzBYQHMKQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v1","func":"PostMeme","args":["data:image/jpeg;base64,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","1710514573"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyaNg+hBb1kUTyhx23vyBeg6wyIXhtmXXtOwDG5fOJB3"},"signature":"/iiYK26o73hGYAm1qwll+B1yob2je+Mk1IOnAYd9oCdN5RVD++h/10SPEtE/t/K0iyE6XMhVVcNwiQWXABqiTA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v1","func":"Upvote","args":["0000001"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyaNg+hBb1kUTyhx23vyBeg6wyIXhtmXXtOwDG5fOJB3"},"signature":"Qqy6tOfpDp/9iQ4eS/XZPtQO8lXl3T9rQl5Gbjzg3lE217jU6MhVGO3HCINFM1GHghLk/NSNQvjIFc+Tj4/joA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v1","func":"Upvote","args":["0000001"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"71M8YRwKWE+kN4DC/4qx9it3oU0wvCwhjOHkNTp2RfJdoitDOtFNCSp5+rs2mxZpsJZxuAmA18JQNU1rOb+3iA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v1","func":"PostMeme","args":["data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4gHYSUNDX1BST0ZJTEUAAQEAAAHIAAAAAAQwAABtbnRyUkdCIFhZWiAH4AABAAEAAAAAAABhY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlkZXNjAAAA8AAAACRyWFlaAAABFAAAABRnWFlaAAABKAAAABRiWFlaAAABPAAAABR3dHB0AAABUAAAABRyVFJDAAABZAAAAChnVFJDAAABZAAAAChiVFJDAAABZAAAAChjcHJ0AAABjAAAADxtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAHMAUgBHAEJYWVogAAAAAAAAb6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9YWVogAAAAAAAA9tYAAQAAAADTLXBhcmEAAAAAAAQAAAACZmYAAPKnAAANWQAAE9AAAApbAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAACAAAAAcAEcAbwBvAGcAbABlACAASQBuAGMALgAgADIAMAAxADb/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAJYAlgDASIAAhEBAxEB/8QAHQABAAAHAQEAAAAAAAAAAAAAAAIDBAUGBwgBCf/EAGcQAAIBAwIDBwIDBAYEBwoBHQECAwAEEQUGBxIhCBMiMUFRYTJxFEKBCSNSkRUzobHB0RYkYtIXGENytOHwGSUmNTiCkrKz8TR1dqKjwicoN0VTVFVjc3eEk5XD0zZEVmaDhZSk4//EABsBAQACAwEBAAAAAAAAAAAAAAADBAECBQYH/8QALhEAAgIBBAEEAgICAgIDAAAAAAECAxEEEiExEwUiMkEzURQjFUJhcUNSU5Gh/9oADAMBAAIRAxEAPwD6p0pSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgF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","1710518114"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyaNg+hBb1kUTyhx23vyBeg6wyIXhtmXXtOwDG5fOJB3"},"signature":"a9WOHuM3iWNFI+1WxjNIyVotAj9UjKS4mZXccwyD4j9HAzr5yX5FOd5Xq3iGMar/SIkO/Klb8KnVjTZ7d+jUFA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v1","func":"PostMeme","args":["data:image/jpeg;base64,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ooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooAooooD/2Q==","1710518162"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"T7UGofjtGJ8UCmxucCA0zWSYv/hUpPt7SwetIzYuYiIA61Ts4SFrre7E3uK9UD41floQHB3KLDEQBZD0AM1KpQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v1","func":"Upvote","args":["0000002"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyaNg+hBb1kUTyhx23vyBeg6wyIXhtmXXtOwDG5fOJB3"},"signature":"gH9msQ+BgkzjafkM93TcAvQSUgtARYWcRRqNXWb/8G0Jnq6iwIxN5gTy9huPyGbrGqSl4LSz8APd1EQZtbslYA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v1","func":"Upvote","args":["0000002"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyaNg+hBb1kUTyhx23vyBeg6wyIXhtmXXtOwDG5fOJB3"},"signature":"HZG6jchUralzwtj7hb8S5bQBXFuPseCQ+qvCmN0BVQ0cK5nG0v2UMhxpB1uq0xOzpAtQj95bm+k2DnEk1/UlYA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v1","func":"Upvote","args":["0000002"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"cbrHmMyI4OP+G0VsqvFaodJx2rv//p8Jcp5SuYpQxYpZz9p03nbslHMd5EGRv/x32eqPo+/Rl75Y7BeNpAbiFw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v1","func":"Upvote","args":["0000003"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"9HY9dT5V/9cCs7nOrSN9ZQYx2AAT3Fbbxq/Dymf8gVgBFsqE+wnNwE3dioquEZ0PFDE+Bxe7w3Mh0CUiSmsdcA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v1","func":"Upvote","args":["0000001"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"hiOoSF03j5FHg3446Q0HrHcTKyO6cK6tbVF81LAoD65nOt748FiPVGaR3OncSgpESKDTGrehklUzXnN0nC/UQQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sCYkZ2IcQiYnCt9LPrkYFvwN3sNx1Hinh2MAslBZF39QIpeutF9tNbAve1qLXKK7csV6j2TZinxShCkEpa1Swg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AK6Cckt+aZHLDuJlrzRrmz32ZykBzv0uClU8lT0O8DMBdjUMj6mzZAZkptTAw4ptqCrg/d6sV+JKEoZARUcETA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g14yr553ykn7lw7ex6lr6uafek2gaedvlyq0d68r","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"CreateUser","args":["gojo","Gojo Saturo"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgPsmZMaFRMRHVL9X/yEgdJbrN4niUjZUFA1wDsYu1XQ"},"signature":"wf/H0k8d9YcwkaMBVBmE0nWfiNQZsdQ+4LlKjfwLY5pPtk+CHtvVDWii9tMqOHOk/1OqQtR8XZIPfTXjlmO9xA=="}],"memo":"createUser"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"KW/BYf+Z12swkNy/13fgFdwZiUsLxpMXirQWRhQlqyBGfVZNBHlfk41AUAAXht9EuDUICeK0unNaVAtiF7IrrQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","to_address":"g1fjh9y7ausp27dqsdq0qrcsnmgvwm6829v2au7d","amount":"30000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"EnZpKtdyTWLefCKAPq2D+jRVntlrIVpVMWsTyjcBcpUXrS9oTl1fz5sDlOox3MkRLWkkNZ1LCYsRUD9l4nCtiA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"WRViqygKg6Id33f/yEIBVyBqOGSx+SGDa8X516DPq6QAkaJkOOEwv+cZA24MwcnOKaaPIKn9b/ypPcW4KyO9sg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"nZ26TCCImd3slSCbBimmn4ojGDrYznMQjfIsZScdZuIZ0HcV16EftGWJ9FLM0Rqjslb9V6+mQ8gEUNcxF3JXMQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"UO6gle82j88VwUrrjDiO32d2LDAkpOV14Tojg9iUC4YmyrTk/FFLQfdurClsncXiFRXaQv2X6HnmG0KHxpQjIQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v1","func":"PostMeme","args":["data:image/jpeg;base64,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","1710671806"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"VPABH/kiLZJQH6Vf/FmUW2BcCg/25eWBjLaVCA2cGa4yvz2E7b6AQOlc7VM+GO2Hb4Gr0H5UoOctR71+bCKKHA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v1","func":"PostMeme","args":["data:image/jpeg;base64,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","1710671853"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"I3DZUN4U97cqNCIVCRO+vLY2t52tjP0yQJ+yb3bGHzBZuYWPgM+S26FHCAtPlAeSUOFvk78mPM8VYtBDt5/Smg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v1","func":"Upvote","args":["0000005"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"uSVwrzBAnBHHVZE3pJWK1mcVndjUN4tYAazSnGylgi5beZxeXDRzMOOe9gtY1IlWnImd9BdaosnPRepH4QWHqw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"QpAJCAdJne0lFZ9qbS138dRfvCwa4P8y5guVZdD9q/M2nNqgQyE5BeadgKLcgQNFC+iOtsH/EH9dTxIuviOC7g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Y1bQqsqXcX/dIwDZI6kfxVYt8DFaCxAddoIE1+vj4u1dpe6ldIh+ViWwMZOsZhoSy3IH3RtAWpvnx1+/tv7uUA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"6BVCBqfX1xb/aY1IujuaMEgcZPqiizVNTqq2jKbQCUBAuI8pMmqkuwV9QgzV1RLI6si0wS99ERHsOb4q+hlgsg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"LlYe2JBiLyBY9lgNcny84asnvPRKG3m0gbQBWXiTTZcevGQtgLKCgbpDrAYvY+X4vq6REeRfhNQi/ShOkNovcQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8frDrZdzq3qQ34vzZZYOrgzczJiueWw3ldGUU/HzJlYfDrv0WqRRyow6ykhe6Srkf9v10l/s9GHKqgdmtDe3Cw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"iywR/CgnMZm2fBFcmumrHzPmPz6wVseuNxYVaqf8VyMT8r7UVwrVEdL/ZCT9vcnsLhC/m9xxh643CmLbzW1LGA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"bLDdR3Ew0o34yR0QW/kGtjreQ04SN6WrXNeC5kVjbdsNplW4p70yIHL4p2PZrw73n6wWGvDWxmNMQgOcLMeg+w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"uWhlG+NE3RWOZssSuMlQjMkmmXTEWYieBDNQnh/wiDU19EsocKZiN2ZwTKTt45WOOYb1gTX0r1MDIDIsUuEJCw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1rmxzq6n6k8qu8de4lgvjnfquqz3pecurxayasp","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"K4KqTW/gcRbJmsiPydWn88zdfAdE1XZBKTriC1ij4zpBKtRhLHSdyNTOv//+61Y6il26Ai3PnIfRXrhfFOHfEw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1rmxzq6n6k8qu8de4lgvjnfquqz3pecurxayasp","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"dRrVahSm4y5OVLR0Hy+ES5tcxqMIkEzrQaE7SHHy17UJja1R5sp7GiPpnIW2GrU92MwraLSAIqd/7YZOmdJ7fA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1rmxzq6n6k8qu8de4lgvjnfquqz3pecurxayasp","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"JunZb7mcXsUh4NlH9OXKlmtwxvVKDM1wvBKw4vZdy/kFpTCI+fY+P6jGlZy9rUVRqcHth+eZ3HcKIGLN2ftPmQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1rmxzq6n6k8qu8de4lgvjnfquqz3pecurxayasp","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"CreateUser","args":["gogo","Go Dev"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6WYhNe6vaMP3yeHQdJupVfrYO+x1kKRYMEkz0fEciZ/"},"signature":"zH39g77FP9fsyXg13LIvnc6KWrtOMV5mC4cgZcpA+QByS/DF5T2Sy1k0zuSHINk7e/je2nKrp5hntJV+W5Ti8Q=="}],"memo":"createUser"} +{"msg":[{"@type":"/vm.m_call","caller":"g1rmxzq6n6k8qu8de4lgvjnfquqz3pecurxayasp","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"SetAvatar","args":["data:image/png;base64,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SE6riYAIiIAIiIAIiIAIOAISlOoIIiACIiACIiACIiACVRGQoKwKn1YWAREQAREQAREQARGQoFQfEAEREAEREAEREAERqIqABGVV+LSyCIiACIiACIiACIiABKX6gAiIgAiIgAiIgAiIQFUEJCirwqeVRUAEREAEREAEREAEJCjVB0RABERABERABERABKoiIEFZFT6tLAIiIAIiIAIiIAIiIEGpPiACIiACIiACIiACIlAVAQnKqvBpZREQAREQAREQAREQAQlK9QEREAEREAEREAEREIGqCEhQVoVPK4uACIiACIiACIiACEhQqg+IgAiIgAiIgAiIgAhURUCCsip8WlkEREAEREAEREAERECCUn1ABERABERABERABESgKgISlFXh08oiIAIiIAIiIAIiIAISlOoDIiACIiACIiACIiACVRGQoKwKn1YWAREQAREQAREQARGQoFQfEAEREAEREAEREAERqIqABGVV+LSyCIiACIiACIiACIiABKX6gAiIgAiIgAiIgAiIQFUEJCirwqeVRUAEREAEREAEREAEJCjVB0RABERABERABERABKoiIEFZFT6tLAIiIAIiIAIiIAIiIEGpPiACIiACIiACIiACIlAVAQnKqvBpZREQAREQAREQAREQAQlK9QEREAEREAEREAEREIGqCEhQVoVPK4uACIiACIiACIiACEhQqg+IgAiIgAiIgAiIgAhURUCCsip8WlkEREAEREAEREAERECCUn1ABERABERABERABESgKgISlFXh08oiIAIiIAIiIAIiIAISlOoDIiACIiACIiACIiACVRGQoKwKn1YWAREQAREQAREQARGQoFQfEAEREAEREAEREAERqIqABGVV+LSyCIiACIiACIiACIiABKX6gAiIgAiIgAiIgAiIQFUEJCirwqeVRUAEREAEREAEREAEJCjVB0RABERABERABERABKoiIEFZFT6tLAIiIAIiIAIiIAIiIEGpPiACIiACIiACIiACIlAVAQnKqvBpZREQAREQAREQAREQAQlK9QEREIGWJlDI5yyfzRYfueJry2bMl0mbFQpm+bwVclmzXB5/4zX+c8uxzozN4zXz+cw8xU94+MKLZXzgPY8Hf+P9PP7Oe31WwGsvHh737Mdrv/mCQXwUn1cTAREQgTYgIEHZBhdZpygCi44AhSIeBQjEzHjC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6G87m7luMqHS9FKaYBkdE+P1SMaY0d3232wIIICA6wIEStdbiPIhgAACCCCAAAKOCxAoHW8giocAAggggAACCLguQKB0vYUoHwIIIIAAAggg4LgAgdLxBqJ4CCCAAAIIIICA6wIEStdbiPIhgAACCCCAAAKOCxAoHW8giocAAggggAACCLguQKB0vYUoHwIIIIAAAggg4LgAgdLxBqJ4CCCAAAIIIICA6wIEStdbiPIhgAACCCCAAAKOCxAoHW8giocAAggggAACCLguQKB0vYUoHwIIIIAAAggg4LgAgdLxBqJ4CCCAAAIIIICA6wIEStdbiPIhgAACCCCAAAKOCxAoHW8giocAAggggAACCLguQKB0vYUoHwIIIIAAAggg4LgAgdLxBqJ4CCCAAAIIIICA6wIEStdbiPIhgAACCCCAAAKOCxAoHW8giocAAggggAACCLguQKB0vYUoHwIIIIAAAggg4LgAgdLxBqJ4CCCAAAIIIICA6wIEStdbiPIhgAACCCCAAAKOCxAoHW8giocAAggggAACCLguQKB0vYUoHwIIIIAAAggg4LgAgdLxBqJ4CCCAAAIIIICA6wIEStdbiPIhgAACCCCAAAKOCxAoHW8giocAAggggAACCLguQKB0vYUoHwIIIIAAAggg4LjAvwAU8mclCFg0QQAAAABJRU5ErkJggg=="]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6WYhNe6vaMP3yeHQdJupVfrYO+x1kKRYMEkz0fEciZ/"},"signature":"yiA4gdPj3G8O2a6keMLG95qMH7nI0qfUuLq+bfJHhB0q22svqGNquL8TAIeYWtuoRqndqCJ73Ld/VGhHtdtUSQ=="}],"memo":"setAvatar"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1rmxzq6n6k8qu8de4lgvjnfquqz3pecurxayasp","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"X6+/b7SQrhWqLOUxGYJ4lXnNcPkHVrM9DTr6ihUr+aIJ4Gc25sC2XaMgXcBshNrRMswTPmnzgHM/pGxheF4OkA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1rmxzq6n6k8qu8de4lgvjnfquqz3pecurxayasp","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"UpdateBio","args":["Let's GoLang!"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6WYhNe6vaMP3yeHQdJupVfrYO+x1kKRYMEkz0fEciZ/"},"signature":"Rzwhcgla+mbqh0d6t3d5CkmXz9MqQB72ldR7Gb6aEt1USWPecY7RgGYdqQy+cXGI607CimhKrrCQ/AtT9pnRPQ=="}],"memo":"setAvatar"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jcm4tvkrnnjtr5pez263pgxseh85cx8n3nc849","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"XeaWLYEw2WrJCa6YO6tihq82qv1SFyZb+OA7KXq7E+VGTNmuFLnTMtzj+nOn8WbmkT+jxSavC6ONQQ9GqKVH0A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jcm4tvkrnnjtr5pez263pgxseh85cx8n3nc849","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"s0FC8jnwo3xzL0zQKZ06SwdKWOSDNLvgQJnQcU7UnrllwdnHHn8FDeWYWiwsNXMkiDbnLArtpX10UH8h69Ns2Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jcm4tvkrnnjtr5pez263pgxseh85cx8n3nc849","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"UygDoRn0OD6EU6WAJ6CA8MhXooDMpLlVf5BXMWVRRzsGoG1kWe178hmalXdsHEmnb9oEkTdtFTjKgtxRr0A15g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g14yr553ykn7lw7ex6lr6uafek2gaedvlyq0d68r","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"SetAvatar","args":["data:image/gif;base64,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"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgPsmZMaFRMRHVL9X/yEgdJbrN4niUjZUFA1wDsYu1XQ"},"signature":"USvsofUW8k8N9KJiSMGzxSUi6ia+8M6E58/5J8o42GwYu5yjuwLkBgm/blcBmzE+ti6O45szhQamz63S/3jLCQ=="}],"memo":"setAvatar"} +{"msg":[{"@type":"/vm.m_call","caller":"g14yr553ykn7lw7ex6lr6uafek2gaedvlyq0d68r","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"UpdateBio","args":["🔥 Sorcerer Extraordinaire 🔥 | JujutsuKaisen's strongest | Shades always on 😎 | 'I'll murder you... with kindness!' 💥"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgPsmZMaFRMRHVL9X/yEgdJbrN4niUjZUFA1wDsYu1XQ"},"signature":"SC2JjkGucbyCtxcvO+WElg6x7xPudQ4tsuKxyNaWttdDb4C2Le4psJkHj057Ma39Q8Lypi0jAPXCLLV+UAvayw=="}],"memo":"setAvatar"} +{"msg":[{"@type":"/vm.m_call","caller":"g14yr553ykn7lw7ex6lr6uafek2gaedvlyq0d68r","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"UpdateBio","args":["🔥 Sorcerer Extraordinaire 🔥 | JujutsuKaisen's strongest | Shades always on 😎 | I'll murder you...with kindness 😘"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgPsmZMaFRMRHVL9X/yEgdJbrN4niUjZUFA1wDsYu1XQ"},"signature":"AkiMLV/8Lc3j7IzS6n0zBgGFrIvkkztosrKF2WntUC0GncRFJPMpN+PjrS23DKfmWE1uH8lJ4sgllLZfg29UBQ=="}],"memo":"setAvatar"} +{"msg":[{"@type":"/vm.m_call","caller":"g14yr553ykn7lw7ex6lr6uafek2gaedvlyq0d68r","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"CreatePost","args":["Hey folks, Gojo Satoru here! Just dropping in to brighten up your timeline. Remember, it's all fun and games until you challenge the strongest sorcerer 😉 Let's have some fun! #JujutsuKaisen","data:image/png;base64,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"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgPsmZMaFRMRHVL9X/yEgdJbrN4niUjZUFA1wDsYu1XQ"},"signature":"S0PtCtQR5NpSOmF9RxXWPZ9o5zrYMjf+OrS0ouqOhf1euhxNmeThIwRF6v4K6OS/O2F2YrtnyCjwEPGfNm9A/g=="}],"memo":"createPost"} +{"msg":[{"@type":"/vm.m_call","caller":"g14yr553ykn7lw7ex6lr6uafek2gaedvlyq0d68r","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"CreatePost","args":["Hey folks, Gojo Satoru here! Just dropping in to brighten up your timeline. Remember, it's all fun and games until you challenge the strongest sorcerer 😉 Let's have some fun! #JujutsuKaisen","data:image/png;base64,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"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgPsmZMaFRMRHVL9X/yEgdJbrN4niUjZUFA1wDsYu1XQ"},"signature":"ENE9Y5TG9NjCyzUhZaR6G4SD+9L2BeC7KRToqYEA3gI/ERD2GEtwzWVZuCn+GfebhufmlYJXmRi5s4dwjrr3pQ=="}],"memo":"createPost"} +{"msg":[{"@type":"/vm.m_call","caller":"g14yr553ykn7lw7ex6lr6uafek2gaedvlyq0d68r","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"CreatePost","args":["Hey folks, Gojo Satoru here! Just dropping in to brighten up your timeline. Remember, it's all fun and games until you challenge the strongest sorcerer 😉 Let's have some fun! #JujutsuKaisen","data:image/png;base64,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"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgPsmZMaFRMRHVL9X/yEgdJbrN4niUjZUFA1wDsYu1XQ"},"signature":"k1z2D4G2VWkBX0sX/FrwfJvot8YyvjhMbd7BpnIoFvU8TuvCKjZjju9ggkE1atmrrVIyqDZ/oJhVSlxE2kiYzw=="}],"memo":"createPost"} +{"msg":[{"@type":"/vm.m_call","caller":"g14yr553ykn7lw7ex6lr6uafek2gaedvlyq0d68r","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"CreatePost","args":["Hey folks, Gojo Satoru here! Just dropping in to brighten up your timeline. Remember, it's all fun and games until you challenge the strongest sorcerer 😉 Let's have some fun! #JujutsuKaisen","#"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgPsmZMaFRMRHVL9X/yEgdJbrN4niUjZUFA1wDsYu1XQ"},"signature":"XyGAkAANoSd8z3m9lj1vfxtGbfLUQYAKGyAoZ8CGPLI05V++jZJAbbCd1+9A587fhc5L29rFxvbBJ+OeC++vog=="}],"memo":"createPost"} +{"msg":[{"@type":"/vm.m_call","caller":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"LikePost","args":["1"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApW/ppgHadUkxCHXfJ29lc0cqkc7X6A0FaET+6xbvD4t"},"signature":"sUAooyILq4AAuQ2fdyXds9jY0PazFzG/xDsZnFJQ+dZ4SySCYMPqohS2HtOpx11XSZsknlFw8lAMl2BaL9HafQ=="}],"memo":"likePost"} +{"msg":[{"@type":"/vm.m_call","caller":"g14yr553ykn7lw7ex6lr6uafek2gaedvlyq0d68r","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"LikePost","args":["0"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgPsmZMaFRMRHVL9X/yEgdJbrN4niUjZUFA1wDsYu1XQ"},"signature":"dsn64UbvQSSrcrBV8V3EYw/axQPGf7fMSUBEw+yaX3phXJ/KOeYKBHwWSanBUC7p69YEIT4nFQv0NbQsnbJmPA=="}],"memo":"likePost"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1rmxzq6n6k8qu8de4lgvjnfquqz3pecurxayasp","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"eIibHWYsxAuImkKT76fU6wfH+/EFyiWpYdBeN5LJ4yAV3vXLQ/oX8X8wSm+CRJ3IgKZLgjL92YXToqIEvvZ0gg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1rmxzq6n6k8qu8de4lgvjnfquqz3pecurxayasp","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"CreatePost","args":["Refactoring legacy code to Go feels like a breath of fresh air. The simplicity and efficiency of #GoLang never cease to amaze me. Happy coding! 💻🚀","#"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6WYhNe6vaMP3yeHQdJupVfrYO+x1kKRYMEkz0fEciZ/"},"signature":"hqmCG5dWWjis7Ly6cppJ58Xm47IBbeEmzblV673gIl1GKlY94vXZUY1uwBoahgZa/LJwAutoQrOodzyB/KNqCQ=="}],"memo":"createPost"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1fjh9y7ausp27dqsdq0qrcsnmgvwm6829v2au7d","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5ZEHsLWXv63NWgMbbUlHsvkerLKW5/vf5MLPjGG7bpMx50LClVZnhVHLDQf6kvr9Osce1qayBbk9/+f7eUqj3w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1fjh9y7ausp27dqsdq0qrcsnmgvwm6829v2au7d","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"b07FBI7cdBFXERaAn63x/fJzHdtNsD/MGDNzCEuC/cJkrYt56zYeBG6PdULZYBNm2mJ7ZC8IyQ1u03fOySBggA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1fjh9y7ausp27dqsdq0qrcsnmgvwm6829v2au7d","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"gGxBEUwqoc4BNBHRBscge5x273SJ27q+TLXBz/wA6m5jeUswV6PJUYwt4RchtzVsYiVk2Am52Geq+H+8yB734g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1fjh9y7ausp27dqsdq0qrcsnmgvwm6829v2au7d","send":"","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","reggaesoul",""]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1sQrIl4krsBIKtCTfMqWzbkKQDSfmPtMYQA9EvsJqmu"},"signature":"tyrzGRnQNdsMuW5LHVI721KW07mifI8tbXy+evh2x+EMKZgF9sd9k9KgQbbn453+3HAw5RhtAV3tEEzMcFiJhQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1fjh9y7ausp27dqsdq0qrcsnmgvwm6829v2au7d","send":"200000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","reggaesoul",""]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1sQrIl4krsBIKtCTfMqWzbkKQDSfmPtMYQA9EvsJqmu"},"signature":"C++UCVQqdUVIu32MFvBHK4sJBXbAxoiOIhFQloxn1Z43ARlgdrmWPhV2Lp1x4flT9hgvA78Lsc4s47CUeMGqfw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1fjh9y7ausp27dqsdq0qrcsnmgvwm6829v2au7d","send":"","pkg_path":"gno.land/r/demo/tamagotchi","func":"Reset","args":["GOAT \"CHI\""]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1sQrIl4krsBIKtCTfMqWzbkKQDSfmPtMYQA9EvsJqmu"},"signature":"t3IXrWVOKBA2+hTWAH7XeoFpazptY5G5+Q1/usKT69MYQTsCCBHImQXmax0mPnffLeiWN2dprFjI2YWZp3BQUw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"UpdateBio","args":["Hokage-in-training 🍥 | Shadow Clone Master | Ramen Lover 🍜"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApW/ppgHadUkxCHXfJ29lc0cqkc7X6A0FaET+6xbvD4t"},"signature":"iZrVlgMD252qQn2vADL1aFVmgkeYaFOf7+XWSrjL85tVFRxOm61k+2qY2XNK9Z+btEmsD1H7d0VQ6XW5066Ctw=="}],"memo":"setAvatar"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Z9zFRRNKHC82nPplgBcCXD0MHlusO+E50ELa1iRfESg4eWDJF+sOM5drW1wq2iEGWFUZGnHfmOSKZgxmD4rd7g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9ap+evGhuwZucWD1yQuALK5aeagC9xUhuB+ktYLapU5dpI5imsHSZMSHKOOhx+0unG77bifvGATW7crinkd8xg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"SORZ6pZh5sU2A6FEjpJ+PMWFCiu7zLcEjc0eapCdlIULkInZfPDjQEncB0lcPNktoIBos4x5M+gzik5KZLIv3Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8MQ2/XWZXUU7+lwKSGQ/6Hg89M2XFv+9RKYfQxdZDu9dyR+E6FcMW2911zmURrdu/fTuaIZqOvW3BYA5ZMB2Zw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ebJtnl9TcD8zZ6+IOIU65mdh/4BySs0eOC9xxKlb8vsJVGQhZJpMV5RRfKvrWbGEY2BH0AQSGb7e67GmfOW8OQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v1","func":"Upvote","args":["0000001"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AzFdv1Uf9hYAYGR/nDjpuWViwY6oujHVSjOHfnVPnW0a"},"signature":"7elAFV+WlZUX+Ys9w55zVQ3pQbpCg0TJhpY6Rt0QQ7IXvlzhB70uSLxXCuHquGgCUFmgyYz6D+kDzUhKOmStVw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g16lycnanaxyedev4zj0thkcg5y7sghhfdnua5rv","amount":"100000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"mVS2Z2TnEW5EwtqhaN/OVPZ6YrxN1+k3nNdUj+kd+x9qXsNDpyb/Lv8a6+SdIUe31IVejIVSjNYOR/I7ZcWJkw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g16lycnanaxyedev4zj0thkcg5y7sghhfdnua5rv","to_address":"g1ffzxha57dh0qgv9ma5v393ur0zexfvp6lsjpae","amount":"99999999ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Atkt46Q3c5HWhn9EzD6X6bHKdc8AKdlv2g+JIOJWVLB5"},"signature":"wrYdWuqebiKzxjWtOBluiovErduwM/xXAunNAA6iX5BagVu/dvdRfoqjodCtp66gmYTmPPLUygxomcwiLiL7JQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g13d6yw85g34zytcu8g67s8mqr4gh22fzuggv3tr","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"i/VemCwJLKyrTkcd2vl3FkTzMhr6F0Xv//Lm/mDSLO8pzATfWNKmrBnf24QdX7w2J7AM2IYtwqR2Mu+VRw/2dg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1ffzxha57dh0qgv9ma5v393ur0zexfvp6lsjpae","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v1","func":"PostMeme","args":["data:image/jpeg;base64,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dp7+Fcui+enicBERCoREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAFSSRkMfG9zWxtHtOfgAe8kKq61fbKO6RhlZSQVbR0bPGHgfFTHVlsGNag2s6V00HfXLxTvI/wBFSDtn58ORWIVG227393ZaR0jW1nFybWV36uHPvwP9pSVR6YtFuk7SltVFTv8A2ooGtPyCubTw5wADjAIW8qtvTXlbZsKVOK2yQsdnO0TW7w7U2p4LTSHrRWz2jjvaeE8veSsw0rsX0rpSZk0VtZV1LR/yqsPaSF3eR3D3BZzzwMkn1VeI5VZ3s56RWEVdeT20OLQ1owxoYO8NGM+viq94OASPFVJyVRabeXkwNvIJycoiKCNwiIgCIiAIiIAiIgCIigBERTnTAyUI4hz6jofD0UfbRdilj1/FJOIW0F0Ay2rgaGknwf4j5qQkHes0K86MlKBeM3TacTWPTOqtVbCNR09m1MH1unpncEcwJIa0nHEw+AzktPjywtl6OeOrpIamF7JYZWh7HsHJzTzafeF17zZKLUNDLQ3KnjqqSXGWSDOB3kHuOMcx4Lo6R0yNIWdlriqH1NLC9/1d0n22xlxIafTK27mtSuIKSWGZ6041VzY1L2nfnJ+KIucaiQPM5IyfEoRkjPPHcURCQTk5KHn15jwPREQGHbTtmlBtJsZpZ2COuiGaWrH2on92T4E9fipu3DN+Sr0xeYtje1mrkjukUwp7Reah2RJkhrYZXnx+6/v6FYDjPyUd7YtlkO0OzdpTObT3mjaDSzB/CTjOG+8967XDr3s32VTbodS0uuRqEtj2sieXtycHmcEd6+i80dwHf+nZW0eyTatVfU7pTltJa7vVnHakHhbDM49/QNcevQ+K9KoXGQEnI8ivVNemx6NPOqPoiIqkhERAEREAREQHkjTjNNH5tXMrjS/8njH7oXI9Svnp4kIiIVYREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREARETIyEREepOQiIhAREQBERAEREAREQBERAEREAREQBERAG+ycj5pnPU5PiepRFBOWERFJUIiISEREAVeIgEAkZ8FREeu5GNckF7xGyh13pHapssLm3Ok/WVLIxzkYPv9ebhj3hbk/Rn78cu0Ggp9letq8yamo4+G119QedXE0YETiTzc0A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","1710759506"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A09whvkfsR4pCSEYMMt/do4mD9Zf76Dzs9/kOirITiy0"},"signature":"1Z2ftltaQAqSgM9Klk4VWdM9ciF5YYyUHk7ZaTmww/935Pm73csU44eJnE1jxs8JAISfbOvY2yGx1MleHCUS1w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1ffzxha57dh0qgv9ma5v393ur0zexfvp6lsjpae","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v1","func":"Upvote","args":["0000006"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A09whvkfsR4pCSEYMMt/do4mD9Zf76Dzs9/kOirITiy0"},"signature":"ZpiC9ehDA+3lhRadBLRrN/td3UfhnY0vwh015D9QGd40BweFc9du/to3TmteH+FVPnKSoQbcUq042MXLEQ++og=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1ffzxha57dh0qgv9ma5v393ur0zexfvp6lsjpae","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v1","func":"Upvote","args":["0000006"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A09whvkfsR4pCSEYMMt/do4mD9Zf76Dzs9/kOirITiy0"},"signature":"AWYz6pRIO7+5DnoAE+Fyya951VJ6ON8UH879VJjmmxMPZDJdjXV2NDbnTm82bsioGotb5ubdtt6WeVqlEIEYqA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1ffzxha57dh0qgv9ma5v393ur0zexfvp6lsjpae","to_address":"g122n67es9vzs0rmharsggfr4sdkd45aysnuzf7m","amount":"10000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A09whvkfsR4pCSEYMMt/do4mD9Zf76Dzs9/kOirITiy0"},"signature":"sNCaBv8faeh5RaMkWpsvQ9Qjnl5OxCkfxiMFYGpaBvxcykf4MwTWgcdXaiu2pX+JuUT1TUtRmuZ8N7ObqhEMUw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g122n67es9vzs0rmharsggfr4sdkd45aysnuzf7m","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v1","func":"Upvote","args":["0000006"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArADVPfUBrZVmlqmZWPWucRTe9gkJ9wJFyTszJoU5Ebi"},"signature":"d85FITiiA0DyLCjoMQxu4GjG65NHeENWybqyO7gipFxqBhMpdi0ev3JLju3udQm9ZVK4a0oS2cR6JbOTzsL4fA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1cc423gpedjenks4p2ptl9uvsn8e0dfkdux65dp","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"YCHj+pm9jxknKmSeC3qvFG+EPZPX691Do0CFU5ADrT0a+tiVvPkFzQxu/SJj7Ho9ygRN0zElqfSCkp28ulk52g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1cc423gpedjenks4p2ptl9uvsn8e0dfkdux65dp","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"66t1+OiBeXXhzpB4lkR5sA/52/r3QFXsun3+D8mUR15wSHMh9K/8Z+4/ZqpPBbQt6C79hYnRjsGopyF7JC+nvw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1cc423gpedjenks4p2ptl9uvsn8e0dfkdux65dp","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"nq1nI9uUbULA/PzdQBxiCUecCSrRkFDrkVdYsXaBcN41cprUTInWkKxP7Vrm4SLhLQeMdhe/cXhWaIdklgGBuw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jcm4tvkrnnjtr5pez263pgxseh85cx8n3nc849","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"CreateUser","args":["nezuko","Nezuko Kamado"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjEYBUCjLMBgdrtXMmkPiZ0XXUg6ZWEa0CAvhG66D3pM"},"signature":"Y50/s7+ABdEtycuM4iwIRFxVHy3MAMIACEFMCLRmoDcD7fhY6iW7KS2AYIzTbURh2OBTj8FpCM3OM5oUTAXIwA=="}],"memo":"createUser"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jcm4tvkrnnjtr5pez263pgxseh85cx8n3nc849","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"UpdateBio","args":["🌸 Demon with a gentle soul 🌸 | Protecting my brother Tanjiro 💪 | Lover of bamboo and peaceful days 🎋 | Peace 🦋"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjEYBUCjLMBgdrtXMmkPiZ0XXUg6ZWEa0CAvhG66D3pM"},"signature":"qY428ZJPl7+AI+eIN5nO6tPCMUswgY6e0R/eXd79T3tyPG583ejFVH3Bfeu5bAsXsVHCw2blbRXmJa8i6qYlSg=="}],"memo":"setAvatar"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jcm4tvkrnnjtr5pez263pgxseh85cx8n3nc849","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"UpdateBio","args":["🌸 Demon with a gentle soul 🌸 | Protecting my brother Tanjiro 💪 | Lover of bamboo and peaceful days 🎋 | Peace 🦋"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjEYBUCjLMBgdrtXMmkPiZ0XXUg6ZWEa0CAvhG66D3pM"},"signature":"8+E1ilXwp+lju4K7QAUBfStV6vFdVhgmRJ8f20yuwloc4ywgQGiKi2bnsTpaB3J/dvQ2GRxEQE843PFKr+JgBQ=="}],"memo":"setAvatar"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jcm4tvkrnnjtr5pez263pgxseh85cx8n3nc849","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"VuIELjTi1/akuTRaXdjRuMmdI1UT0D/dB9dlDqZWsTNuyXnxagrCY6AVJT/vLEC515r6oJQOAD4oKPmWK9h+Hw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jcm4tvkrnnjtr5pez263pgxseh85cx8n3nc849","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"YzbpxuARNRlYtH/YAP9/6yMfzV11Xc7Y2at4n5Sc4f9svMSDUvWPkGYJCkjYsvn6Z22S4pCrRnA4dsHs+HOXQg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jcm4tvkrnnjtr5pez263pgxseh85cx8n3nc849","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"jitzkxaVWSLj/7kwa7/o8OZsqAa7V+rIc/NvCqFLTktBznEi87bW4RfhKA2/s0kMvigPzenWDz5A1/JodJSWpQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jcm4tvkrnnjtr5pez263pgxseh85cx8n3nc849","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1TpleZzc7QECIvcrXwT1WY9zmR2NIDeYrC2nA7uKfUU4QzpNpwgTt78vjykiFkMcLVJHd2rEpZFoggyzZLEd2Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jcm4tvkrnnjtr5pez263pgxseh85cx8n3nc849","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Q8W/4ILid3mZsLn54iQpNLoIAal5fKZ5SpDtekPYL4RMC6YYhgfO/1XrhaE8v5tvW3HgYIVid8QVXjdiwG5grg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jcm4tvkrnnjtr5pez263pgxseh85cx8n3nc849","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"7QPn5o+lmyNjPbWgcwzw6xFTa6Ow5G1XB7QSV7fGadAkij8iSsHKFgKGXYvNt5Au/joJscMYnQY0XjXi8q1nUA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jcm4tvkrnnjtr5pez263pgxseh85cx8n3nc849","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"UpdateBio","args":["🌸 Demon with a gentle soul 🌸 | Protecting my brother Tanjiro 💪 | Lover of bamboo and peaceful days 🎋 | Peace 🦋"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjEYBUCjLMBgdrtXMmkPiZ0XXUg6ZWEa0CAvhG66D3pM"},"signature":"3Ac79JE+d9eWj1DCaapOA/mUa0fHMf0Ybx1Pbifz9u9CRlReH8Rvjbmiwz5rEnbry7lM8EpU7WE18mroOs1sPg=="}],"memo":"setAvatar"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jcm4tvkrnnjtr5pez263pgxseh85cx8n3nc849","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"SetAvatar","args":["data:image/gif;base64,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"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjEYBUCjLMBgdrtXMmkPiZ0XXUg6ZWEa0CAvhG66D3pM"},"signature":"o9Dc7dxPGNjjjXfyGDw4OQabHr5bfq1gAC+s8/w8nN8eIN0X4ZBqysMT7cm95IFF7vumdSSJprQzerKnKK+img=="}],"memo":"setAvatar"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g122n67es9vzs0rmharsggfr4sdkd45aysnuzf7m","to_address":"g1t4du52tfdfcnsrhlkfxhulr3r2a8a965zs07tx","amount":"7999999ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArADVPfUBrZVmlqmZWPWucRTe9gkJ9wJFyTszJoU5Ebi"},"signature":"uthQVVjW35IGMnrTjhsmk7mougQIjCKjXfucGMGjSTcezNga84b+2vGGXw1NeMU9tensWz1olMO5bqEsi0f93A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1t4du52tfdfcnsrhlkfxhulr3r2a8a965zs07tx","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v1","func":"Upvote","args":["0000006"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AoWl1n0gPDWHmsIdghOux9H5dKTvm5LHh/7c9EXMTS0y"},"signature":"gua0O6U+9k1na67p4gy1oiGtMFQTo/K16B5inxU1Yn9iZkGAgx8CPAZzDwakqR0n3gA0kDaknUeQ5y9tIx3nBA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jcm4tvkrnnjtr5pez263pgxseh85cx8n3nc849","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"CreatePost","args":["Just woke up from a long nap... anyone else feel like sleeping for 100 years? 😴💤 #SleepyDemon #NapTime","data:image/png;base64,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"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjEYBUCjLMBgdrtXMmkPiZ0XXUg6ZWEa0CAvhG66D3pM"},"signature":"rTgt6zS1+hnEA2pmYdps0CNm63ssreLBD36tqPNA6BomV8tvuw1kTME3LkzcJFXmVIGBWwmA5AcaC/4jX2fBIQ=="}],"memo":"createPost"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v1","func":"Upvote","args":["0000006"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"bw1yWwdihGyCQfvQvy1BO2JpPK8TR6zCaZYlOju96y1gAhloDaUY77BlmjQ9OtNnx7xv19Swyv1LZRlG45mSpw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1ffzxha57dh0qgv9ma5v393ur0zexfvp6lsjpae","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A09whvkfsR4pCSEYMMt/do4mD9Zf76Dzs9/kOirITiy0"},"signature":"BuPZeR3zzGTy2N8z3T+jLElvzN/cLh+mOKsbgfZLbTVoWCpnEtE8EK6Yg/ZSKTa7VcBvlu+XcLpLjO96oLFMAg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1ffzxha57dh0qgv9ma5v393ur0zexfvp6lsjpae","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A09whvkfsR4pCSEYMMt/do4mD9Zf76Dzs9/kOirITiy0"},"signature":"YsVare4aiESuAQHSwhfIh0XEBCO16UHj10GfQ2Xn2TNK43iNsNgZc4DJYRxjtLVlZ1o5zoKDI8zyQ4YAS5lgkA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1ffzxha57dh0qgv9ma5v393ur0zexfvp6lsjpae","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v1","func":"Upvote","args":["0000004"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A09whvkfsR4pCSEYMMt/do4mD9Zf76Dzs9/kOirITiy0"},"signature":"L9NQC0h28EgJN9y4SNuneRq3dEt61MVHAD/mT8EhWg4xBt3DmyjvXcOhVRcW3BzFtdi25HugfnNXsqWmmGvLKg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15eyd28yeggddp7newqc5nndcep9z43wg38mfds","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"HoCb3nNzES5XrEJK0hhlL1/RkYLozsjugBvURU/XlycWYAix9b0S+gSF6Q5LysK8Gw1ZApKSExEd7fZx/LeImw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15eyd28yeggddp7newqc5nndcep9z43wg38mfds","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OEtBeCsLHCo6LHc0PHAGqH1uBpSYcUB0V430zRWVwXVyByDM3PeZQ3mH/I9Ii7oaHWTbovbe9sykg06h7PXjUw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15eyd28yeggddp7newqc5nndcep9z43wg38mfds","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"aDNuudGSywcDMcqwXt41vh1AlehNsHv3eAZykY/hQTcmfqVrRqR0dP981nttPB9QFd2VK/piEHjRDDMkjk732A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15eyd28yeggddp7newqc5nndcep9z43wg38mfds","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"jEh87f7AtrMKJjS/zcP4l7bqHejyE/RVml4OzqxSshdLzBHkrSmg5Z7+y67T0fGOWM5f1hWWGW/7x/tlSlJN5w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15eyd28yeggddp7newqc5nndcep9z43wg38mfds","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"QP+vzHKZCazgi5CpIm91dJ8hG9r8727eiGUIFIf2daUr6Eqbm4GSYuaVZ13/NDELCfblk0fTEWfFo5ILF+HVUg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"9000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"vd4cvT4dybzE1Gdw5SmGSvk7dXOeLw4isdSODbwHCQQghwFgtUB0PieeXB9JHeU4FSjJZKSGWHmpZsBsLkNObA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g15eyd28yeggddp7newqc5nndcep9z43wg38mfds","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"CreateUser","args":["daniel","Daniel"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApeKYP0FqMVPgt5VAXO5f+yXQl0dXa3OxeFpqMF6p+lI"},"signature":"SQkHii7Ypjbc2Y8+0MEX+GkDNng0mXYTa1op0zmtdaR+HNilvgH0PPa0zpg+a2cyeFH54PWCVe/p1D9cUxth4A=="}],"memo":"createUser"} +{"msg":[{"@type":"/vm.m_call","caller":"g15eyd28yeggddp7newqc5nndcep9z43wg38mfds","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"SetAvatar","args":["data:image/gif;base64,R0lGODlhEwETAfcAAAABANve5D05R9LU2wAGAAAEAOLe6UU+TgAAA7nG0TMxPrS6x62xuJKbqIuQmdrj2jdNVsS+ywBRvAAACyYhL2lyeQAAAhMeLQADAE1SWXB8iXiIlOPl2uPb3pqnsgACAxgrN1FcaVlocwIEDQB82w0SGwIMGABu0QBOswAIAABbzACJ2gICAwAAAWRgbbTP6AAAGgAAFoOAijVYbAYEDqOgsAADDRQ3TcLBwQCA6wBqvQAABgACKQAAKgEVLgdZuAAKAAAAMQAADQEAAgCF6wAABABMnrnk9QABIQADVBpJWgADTbbGtgBCrwAvfgACOcPOvQABAjFONAAyj42w1ABwu6GtngA8l2VaXAAETwAwfgAbdXWJdQBCsQEQAQAIPAANXE95kwAyWoOIf6O851VtVwASWQEDAABhzABRngAEKG6WtGV2XJzK3JqqlwAAERMwE0ZgOFSHniQ8HwAMITBtlxtGIwcoACGN1QAaVePj697i6QACAAAAAHSmvQAdchBUmwAjSQAqP5LA50h9unOe0EF/zRBroJTL6QAQPApJcgACPAA+nAAQbCptuQBGnyZhlAMcAk+KtgAqUglCcwAgdAAETVKRzgAqASBhs26q2AA6czyFpEGf6lum1TBzzQBGdnCy6Cea6UOy8jKp6gAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh/wtYTVAgRGF0YVhNUDw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBXaW5kb3dzIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjExRTdBODEyMDI1RjExRTE5OEZGQkExQTgyOEVGQTMwIiB4bXBNTTpEb2N1bWVudElEPSJ4bXAuZGlkOjExRTdBODEzMDI1RjExRTE5OEZGQkExQTgyOEVGQTMwIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MTFFN0E4MTAwMjVGMTFFMTk4RkZCQTFBODI4RUZBMzAiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MTFFN0E4MTEwMjVGMTFFMTk4RkZCQTFBODI4RUZBMzAiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4B//79/Pv6+fj39vX08/Lx8O/u7ezr6uno5+bl5OPi4eDf3t3c29rZ2NfW1dTT0tHQz87NzMvKycjHxsXEw8LBwL++vby7urm4t7a1tLOysbCvrq2sq6qpqKempaSjoqGgn56dnJuamZiXlpWUk5KRkI+OjYyLiomIh4aFhIOCgYB/fn18e3p5eHd2dXRzcnFwb25tbGtqaWhnZmVkY2JhYF9eXVxbWllYV1ZVVFNSUVBPTk1MS0pJSEdGRURDQkFAPz49PDs6OTg3NjU0MzIx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"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApeKYP0FqMVPgt5VAXO5f+yXQl0dXa3OxeFpqMF6p+lI"},"signature":"ZniLiqFM1qCh5NLY8PYEinRbZOTdXZY9VOgIP0Bimb9Jf+dfd9Qw0zKEMBQuuZfQTJUeTkDDquHloTglP5qGow=="}],"memo":"setAvatar"} +{"msg":[{"@type":"/vm.m_call","caller":"g15eyd28yeggddp7newqc5nndcep9z43wg38mfds","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"UpdateBio","args":["Aspiring photographer capturing moments 📸 "]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApeKYP0FqMVPgt5VAXO5f+yXQl0dXa3OxeFpqMF6p+lI"},"signature":"Phi0iQyJ3B/ljmkAzfiWpCUJd5v7f0cVPivJS3seDpMbBF5hqqvid8aINRNX/Pg0doZVBniqxcrNHeprW0L+Cw=="}],"memo":"setAvatar"} +{"msg":[{"@type":"/vm.m_call","caller":"g15eyd28yeggddp7newqc5nndcep9z43wg38mfds","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"CreatePost","args":["Weekend vibes: Music on 🎶, camera in hand 📸, ready to explore new photo spots in town! #AdventureAwaits #PhotographyFun","data:image/jpeg;base64,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"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApeKYP0FqMVPgt5VAXO5f+yXQl0dXa3OxeFpqMF6p+lI"},"signature":"Jc4r3nrZvYE/BRSMrQZQEvha4YZzHVytENFWg9f//85G7k7Uu85abh6NskxxDhV7P3X/ETNgtZSEsw6RT6avGg=="}],"memo":"createPost"} +{"msg":[{"@type":"/vm.m_call","caller":"g15eyd28yeggddp7newqc5nndcep9z43wg38mfds","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"CreatePost","args":["Weekend vibes: Music on 🎶, camera in hand 📸, ready to explore new photo spots in town! #Photography","data:image/jpeg;base64,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"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApeKYP0FqMVPgt5VAXO5f+yXQl0dXa3OxeFpqMF6p+lI"},"signature":"RHBGzmsYljQvUIJVU/7fecRMDEnhkPuuRjxJM69clycnKjVhV02mYwC18qq9coXVIJ8dGRYAOsmdK0UDVA7d1g=="}],"memo":"createPost"} +{"msg":[{"@type":"/vm.m_call","caller":"g15eyd28yeggddp7newqc5nndcep9z43wg38mfds","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"CreatePost","args":["Weekend vibes: Music on 🎶, camera in hand 📸, ready to explore new photo spots in town!\n#Photography","data:image/jpeg;base64,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"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApeKYP0FqMVPgt5VAXO5f+yXQl0dXa3OxeFpqMF6p+lI"},"signature":"ilEAAllZDe/6YvQDIuIOJEcvrUBPEqJ7f16NfkTK+bkA5jF10//fpFaGHX1/XvNdEX8JH0FDBd205UfDQcEyXw=="}],"memo":"createPost"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v1","func":"Upvote","args":["0000002"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AzFdv1Uf9hYAYGR/nDjpuWViwY6oujHVSjOHfnVPnW0a"},"signature":"rysfujnYRe2adbZvU6i68iICh929VwkrSm7EKirFc9VOSzT1MchAdGgcaalDd7E6T/TB+b3aRyCGTMrkA/EJkw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v1","func":"Upvote","args":["0000003"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AzFdv1Uf9hYAYGR/nDjpuWViwY6oujHVSjOHfnVPnW0a"},"signature":"SKtMP9qIdoZnSvGZ3hAU+2X7R67uH0blKicox1ayqxlPpsabPF4DAAxSUHbcUdFB463Em9Wlf37CXqQOb82/2g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15eyd28yeggddp7newqc5nndcep9z43wg38mfds","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"XB+LLcQicUKFWCu2eTeTgRTCZp/mb0+Crecn60KLsSgILfFQ6ACxIudOzyGzBFGE6FCbdH86vFf0NAGGgEbgVQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g15eyd28yeggddp7newqc5nndcep9z43wg38mfds","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"SetAvatar","args":["data:image/png;base64,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"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApeKYP0FqMVPgt5VAXO5f+yXQl0dXa3OxeFpqMF6p+lI"},"signature":"hkz8hoMigFxuDKmn6cBuvP3WC8Lf0McnAIGqxvtmg0p3/r6+azQTAXy2xVfILdZALkjlxx+avMN50uN06K34+g=="}],"memo":"setAvatar"} +{"msg":[{"@type":"/vm.m_call","caller":"g15eyd28yeggddp7newqc5nndcep9z43wg38mfds","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"SetAvatar","args":["data:image/png;base64,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"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApeKYP0FqMVPgt5VAXO5f+yXQl0dXa3OxeFpqMF6p+lI"},"signature":"4L4bb1y8EB0s2fLSkqN12PLl8ghtMNNqDzx2xNkPQRR5MMTHHDtjtn+FmJwldGdfAHAwrJI5SfSdT6SFjzBJmQ=="}],"memo":"setAvatar"} +{"msg":[{"@type":"/vm.m_call","caller":"g15eyd28yeggddp7newqc5nndcep9z43wg38mfds","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"CreatePost","args":["Stuck in traffic on the way to the Cursed Spirit showdown like 🚗💨 Should I just teleport there? 😏 #JujutsuKaisen","data:image/jpeg;base64,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"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApeKYP0FqMVPgt5VAXO5f+yXQl0dXa3OxeFpqMF6p+lI"},"signature":"M2c5snona8MgQ1lmLb4qJkrzdCb/e2nVFlTAQ4h19kpb0+CsfhDjgZtHHpYVWSs68UEkMbM1/02eAkZvfBODLg=="}],"memo":"createPost"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g14yr553ykn7lw7ex6lr6uafek2gaedvlyq0d68r","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8x+n0L82I5exvAvipn57SBc7bv+RHx+F90a+yW26pFksoQ/9UFJsxTwZoiVW+dIwIF6womLtNbRhOYrzPY2T8w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g14yr553ykn7lw7ex6lr6uafek2gaedvlyq0d68r","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"vUay2zYIZSYikm6YQmfRXlF1zUXdMOZxV9QAUvfH6ycY/Uz8GfASrHkLfJb+P/+KU/yYeq9o+DLYD2b4JKSQ/A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g14yr553ykn7lw7ex6lr6uafek2gaedvlyq0d68r","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"TKwvmfsu6D6NV/o7awD5ZTEpAeYmxlB2TaKRIZ/PU/UjAZxk5vZAzPiBgmTgWnl3lhEIabjpCRRnOAs3DWc2xw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g14yr553ykn7lw7ex6lr6uafek2gaedvlyq0d68r","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"CreatePost","args":["Stuck in traffic on the way to the Cursed Spirit showdown like 🚗💨 Should I just teleport there? #JujutsuKaisen","data:image/jpeg;base64,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"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgPsmZMaFRMRHVL9X/yEgdJbrN4niUjZUFA1wDsYu1XQ"},"signature":"rD7V8hWrVS5g7NBA7JBSpyUoaJG8ZUOj9ZeDEzxZ3aVLKIa6UHEgc2VRoSjb/vUdo6sFuMF2hgFiTwbpvplcGg=="}],"memo":"createPost"} +{"msg":[{"@type":"/vm.m_call","caller":"g14yr553ykn7lw7ex6lr6uafek2gaedvlyq0d68r","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"CreatePost","args":["Stuck in traffic on the way to the Cursed Spirit showdown like 🚗💨 Should I just teleport there? #JujutsuKaisen","#"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgPsmZMaFRMRHVL9X/yEgdJbrN4niUjZUFA1wDsYu1XQ"},"signature":"7ueF1AUgkvHzDQVRi2eVxWYVg3ce+8xqxCB5H3U3JgUwzlkT+AjZYjEzeg31ozpeOcEgNlmS2TQr4mk4U1sMDA=="}],"memo":"createPost"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jcm4tvkrnnjtr5pez263pgxseh85cx8n3nc849","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"CreatePost","args":["Trying to master the art of not turning into a demon when I get hungry... it's a work in progress. 🍱👹","data:image/jpeg;base64,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"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjEYBUCjLMBgdrtXMmkPiZ0XXUg6ZWEa0CAvhG66D3pM"},"signature":"pqm49ZukL3a1wSmlCUbog+izPfNO1IKpZdyRs+W50+M47tTrCPxexUPIJcm6tYr0/aCcfBpMpL1YDFrk+e4sbA=="}],"memo":"createPost"} +{"msg":[{"@type":"/vm.m_call","caller":"g14yr553ykn7lw7ex6lr6uafek2gaedvlyq0d68r","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"LikePost","args":["6"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgPsmZMaFRMRHVL9X/yEgdJbrN4niUjZUFA1wDsYu1XQ"},"signature":"h+Yc5nKmvyqFuWc1ARyWux6RpdMY1pn40YdZ9RdxgmtuU1gn1WREA3UmBCIRa7wmThxFfme3R/K7/vTobJ/rRQ=="}],"memo":"likePost"} +{"msg":[{"@type":"/vm.m_call","caller":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"LikePost","args":["6"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApW/ppgHadUkxCHXfJ29lc0cqkc7X6A0FaET+6xbvD4t"},"signature":"2H13pm/DH8sY35nrRomJi65sqEozG76xVUV98N821P1vSlwhp4H4f99m5+rcDLGIHcUJy6Jm1qWlQN0yaikLuA=="}],"memo":"likePost"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jcm4tvkrnnjtr5pez263pgxseh85cx8n3nc849","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"LikePost","args":["0"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjEYBUCjLMBgdrtXMmkPiZ0XXUg6ZWEa0CAvhG66D3pM"},"signature":"UPYrvZT/Tgno2pX8gyI3PH8q/XR8aqmPRkQ5D5jidlMLSByjgtLMXJS63J43gAW2Tne/ZyAFujys06TWYvJM9Q=="}],"memo":"likePost"} +{"msg":[{"@type":"/vm.m_call","caller":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"LikePost","args":["3"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApW/ppgHadUkxCHXfJ29lc0cqkc7X6A0FaET+6xbvD4t"},"signature":"7B7AYlQA3oTvsHoAgy+IlpWxzRcLIlPtnAsdlekvqQJGuwRVzZovmQQsuq64hvALS+ZKUlhLUyRwnylFd0Ih4Q=="}],"memo":"likePost"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jcm4tvkrnnjtr5pez263pgxseh85cx8n3nc849","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"LikePost","args":["3"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjEYBUCjLMBgdrtXMmkPiZ0XXUg6ZWEa0CAvhG66D3pM"},"signature":"qIM986ihlAJCM1Ch7AYfbsj0PJmVKiiyaIJWFfmHDpYCqW2MfW7oQ7ZQBKiw6kisNfFcEzSXUwkDd7dO3j1hbg=="}],"memo":"likePost"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jcm4tvkrnnjtr5pez263pgxseh85cx8n3nc849","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"LikePost","args":["1"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjEYBUCjLMBgdrtXMmkPiZ0XXUg6ZWEa0CAvhG66D3pM"},"signature":"vIBzkr0srW0rnD0vMS5S2EP0Qdxer2jFtrISo+HwWaxx4RCtytONXrAleJU0g0w634ONoyzxpbDm9QrIXUzM/Q=="}],"memo":"likePost"} +{"msg":[{"@type":"/vm.m_call","caller":"g15eyd28yeggddp7newqc5nndcep9z43wg38mfds","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"LikePost","args":["4"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApeKYP0FqMVPgt5VAXO5f+yXQl0dXa3OxeFpqMF6p+lI"},"signature":"BCa+hGnn8A42g22FkyilzXv1O02hkaBibKnKXa+jV44NQnIaiC21hjGEAg72+6/G9qlspJ1X1GwXNbEr5CGyEg=="}],"memo":"likePost"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15eyd28yeggddp7newqc5nndcep9z43wg38mfds","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"vm0+8quqfJ88HhHZrh8NsX/KoqQldTxYl+6PWTEsSkdNrQsrAq/1lUsI6ZRed8BCTNqIYsAQPk2baTgYAhh6fA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15eyd28yeggddp7newqc5nndcep9z43wg38mfds","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5H9TKa/Do4viZvrL8EIqMjEQ1XgBqutG0/0yzTIgSHkKD9NJ+lp6QpZwH6hdb9VX3Zy6gWwGKqhkSNqqfEOnZw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g15eyd28yeggddp7newqc5nndcep9z43wg38mfds","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"LikePost","args":["4"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApeKYP0FqMVPgt5VAXO5f+yXQl0dXa3OxeFpqMF6p+lI"},"signature":"PkAskpbacaZasQGhWc2yiJsMxFR9SG58nTR7aukoZTwZwNGgui7IqUNv1ERJ+KMlrEX4rZmUeBRFnFdTVSXd1w=="}],"memo":"likePost"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1rmxzq6n6k8qu8de4lgvjnfquqz3pecurxayasp","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"heF6ZlzQhz/X2mGHVAOtXDKig40bPKD07FC5l5AepW4hozGEWoDx9n4I2HTeVOSAu/5zXHX/brP/yPMOqtuv8A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1rmxzq6n6k8qu8de4lgvjnfquqz3pecurxayasp","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"hoM1snOXWCkoebz/8N4XvnIkj+Y+yTPh3R0zXTh6vpE5kmECt83MPseieGCceyaxJyDikjeXNjql0pzUjpsbdw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1rmxzq6n6k8qu8de4lgvjnfquqz3pecurxayasp","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"CreatePost","args":["Did you know? Go (Golang) was created by Google engineers to blend the performance of C++ with the simplicity of languages like Python. #GoLang","#"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6WYhNe6vaMP3yeHQdJupVfrYO+x1kKRYMEkz0fEciZ/"},"signature":"4wSl51j5eX470wxdTpVB59bIFdoqjlagX0rzUjTs7pVsdD0V4+uSpj0W2KchesavvenUEVySTTQC2MeTMjzbyA=="}],"memo":"createPost"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9gp4tiOsFZEpfeFk6K878L02uX2oHleWx3sh5EUzb55TnKEJGsTbl3KhKkEr8RtxkCWr7b0yJZ4GxCQow/ukRg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Vba4arIWdJSBdNOlpBRxlGJYe4xS5tFZKey9hiJr6khdOruNI5SYRDu/taB+wMe17tRYZKuZwbVFUgBq7/JMvQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"l34kC/Gb1Q8xpYNvmOjENj3O9sZO8WoEMVL27dTX+KIHn5R5WJJUhwHiwPxnrwM1mc3C1bAdzk5HT8Atu22ONQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v1","func":"Upvote","args":["0000003"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AzFdv1Uf9hYAYGR/nDjpuWViwY6oujHVSjOHfnVPnW0a"},"signature":"8Wn8UwZ9ZrIyCzBMDamysyIKkH7Y299U6uw7FQ7JFG1ezKeIZcf1061rwhFly9UG692fagflIF9pjW0V3Rwbtg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v1","func":"Upvote","args":["0000003"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AzFdv1Uf9hYAYGR/nDjpuWViwY6oujHVSjOHfnVPnW0a"},"signature":"WGvDFymo03tzjNlU2HRL4KAIVHRdCgPuYRcWySLsyetIS/to9BwPSjiZ06FL6fMy+Lrb3GVSSDhwmwivkQNQFA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"vOTLiKOGi7aj5fJpYV5KHHkWgpV4vG2pKoPNU2cCPmxfMPMQ5mqgy74WvRteuBnMlz1eMWFHdfh4E0vtQWTHmg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Qde96a6jL7+iyxK+uksVLliLZTMjbn089T1hUeBZI3Qnj1HKeUGSFxLTu/w2IQQP1Ckf9d4c/7IaHhs5vSbjpw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v1","func":"Upvote","args":["0000003"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AzFdv1Uf9hYAYGR/nDjpuWViwY6oujHVSjOHfnVPnW0a"},"signature":"THf3rFHemeIB4gIDGWXxHgWgr1sFLmjAxi7mg8ok+NAYcBGDQRYEgAKRT13vRwcr/TZFa/mY5K/2x37hQoDc8A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v1","func":"Upvote","args":["0000004"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AzFdv1Uf9hYAYGR/nDjpuWViwY6oujHVSjOHfnVPnW0a"},"signature":"eEPBvgT11zOOlH9RGz8B+rsENuuD2GBPEQwNsKjvLVwbqwDVa7yuhtNf5WRYfn3JseZ8CEmNl/X9EarWMz/9zg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"M/AaXFE0oDEW9Eka43KRFQ+mrmli4s6vGEfA9nMbfcta3zNX7+E3WpX6gYui0CPA+03XhrXBjtoFRCB9pUzSag=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"iyGNppqV+FYvMfEWW+7OEQKbrB0u/QuwxiQaVV7BjVAsEMxOCau5OTwV5e+7GaKp0NJKxUefoUVMk1k1/grokA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"yYsppjI2bS8jn4zUVbvRvAa9WxYSd+Tt9z2IaTSctSoqFsqcwpt3CDW4tJHDbfvnfEsFAkR3DmBDB1uO3oaFdg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v1","func":"Upvote","args":["0000005"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AzFdv1Uf9hYAYGR/nDjpuWViwY6oujHVSjOHfnVPnW0a"},"signature":"WvYO9HncG2/NGT6WOasr4vEYRLUTBtNCyWA2ztZEhB1V3IXhFGEjzMyCvmsDJkl8JTCJlGvarAktOZGJQbjEEw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1IzWpoYucrggC/XR0MNZhzW4a0C3xAlspYuOrYK2rQcbWj3smwC3jdklbT/iUBeDetKd4gOml/dkj8l1UYvixQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"7F8CS3EyTrSGg6JiLq8HzzzSCb25CpcG5LXk7KrxiIprOeEvpC/o5FyHzKEvEjputKp+FCo3hYcHRdydXgN/eg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0r6Sqx2th+OnWJhhr/QM1LZjzl73vHa0RqgJ6Y4UuVsDrWIaFHh/kO37Qb1C8HLE1JGlkem5oArChYjczpLskQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"xYpnRTMKbnfab7vrv+7rUu/18RQ0TE65T6L9N1J0yPF7tyTTP4ubXU/rHCBhXv0D9JI2tdUPggiJhsxwX/O7aA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v1","func":"Upvote","args":["0000004"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AzFdv1Uf9hYAYGR/nDjpuWViwY6oujHVSjOHfnVPnW0a"},"signature":"Kor9rZuOnh6w+y0r9PBg2yNFZhzyHtUQjVfId1o1k9cBF4Hwa9ojVy+YMbUKJd4zZCtadWcA8zduZTciiMXIgQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v1","func":"Upvote","args":["0000003"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AzFdv1Uf9hYAYGR/nDjpuWViwY6oujHVSjOHfnVPnW0a"},"signature":"b1wn8tDPmkGWaldLDt1pnHr2O6JOgoDTBnwPcBVfPYNrM0CJZpOMT4rpOBV8FPpiYmLbd6fgR0ruybwPj8N4/w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v1","func":"Upvote","args":["0000001"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AzFdv1Uf9hYAYGR/nDjpuWViwY6oujHVSjOHfnVPnW0a"},"signature":"Hg1BuFmkTuM7JRCuZYeLVurUUE2lwUdJjz0hETAPWXcNMpEgoLXqL6munlztrpaEUQTgb/UmygG6LJF5YPdmnw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"tAaq9grQ4aKCSc8XKv4eaL4Ol1TuXsNeRVjIfyIGiXwc3TmK0Yr4PjYnK5AQmKq7l+yeVz8WecQvmClKS7fjYg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"LUx1eCBgYg4Lvt44S/1kvdniW9GCMjjZ1YpQeAC1aUtQ8JbAxYrefdbQkToOBZT5Ad9oLOdGSJOLMV4Im63EeA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"lGgB/XBPUOub0vpj1ntEYDzrzZ0plfTBebULJEd1IWlXcO0Uvpl148KzDMG2YiCu+Qt5i/c+Y48CApo0qClTkg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1rmxzq6n6k8qu8de4lgvjnfquqz3pecurxayasp","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"CreatePost","args":["Just stumbled upon Gnolang—an innovative fusion of Golang's performance and the dynamism of interpreted languages. Excited to witness the possibilities unfold! #Gnolang #Golang 🚀","#"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6WYhNe6vaMP3yeHQdJupVfrYO+x1kKRYMEkz0fEciZ/"},"signature":"87jIj5H9o9Zb0IJz5pozwuxO5eUUAC/NorHAXB9JAMoJlEbTMkTgFoHy/xrg2iuj4XCvKnPn/uEYeINUSG5yXg=="}],"memo":"createPost"} +{"msg":[{"@type":"/vm.m_call","caller":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"CreatePost","args":["Another day, another adventure!","#"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApW/ppgHadUkxCHXfJ29lc0cqkc7X6A0FaET+6xbvD4t"},"signature":"0B2P1VqkvREkmJvaDar1uVJyHJFdhs5IIAxMDYpZkhFGeezZlb3PuYFE9Ez9J9Ee9MOXZUsqP6dayprxEymuIw=="}],"memo":"createPost"} +{"msg":[{"@type":"/vm.m_call","caller":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v1","func":"Upvote","args":["0000006"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApW/ppgHadUkxCHXfJ29lc0cqkc7X6A0FaET+6xbvD4t"},"signature":"9BjvxFgNwez/EOtCdvl/G2wjWdzj9lQY5y8B9HdqVu1ibtGJgr9iWXLZY5i9b/o1wAt8Wq+6DvNcDD9w9pdoXQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1rmxzq6n6k8qu8de4lgvjnfquqz3pecurxayasp","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"YmAVLzPop/reKZoJ6BwYVqpRL+9hlWABn8HzS0t5V+AijJxCxDNPhHgRyClf/wGEVyZT2mwSuDVeGhG0s2At7Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1rmxzq6n6k8qu8de4lgvjnfquqz3pecurxayasp","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"CreatePost","args":["Each line feels like poetry. #Golang","#"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6WYhNe6vaMP3yeHQdJupVfrYO+x1kKRYMEkz0fEciZ/"},"signature":"5gNKCzVtrGnUUZ3LyzmHAVY0qF3A5U88vpiEGJVpGCNEpAGy2Ud8YSMqO0Pp7zI04qtqGr22g6ORMYWXBMeRkw=="}],"memo":"createPost"} +{"msg":[{"@type":"/vm.m_call","caller":"g14yr553ykn7lw7ex6lr6uafek2gaedvlyq0d68r","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"CreatePost","args":["Training the next generation of sorcerers today. Remember, it's not all about power - strategy and style go a long way! 😏 #SenseiLife ","data:image/jpeg;base64,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"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgPsmZMaFRMRHVL9X/yEgdJbrN4niUjZUFA1wDsYu1XQ"},"signature":"OotPasWX7Aogh3YBw+vWWZCOKdjJRSrvW6tqa6Fc0Pt2leMlfOHPdjPryyd3qvxV0RyZUu8PWFHftguYvVHFbQ=="}],"memo":"createPost"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g14yr553ykn7lw7ex6lr6uafek2gaedvlyq0d68r","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"27MBQuciPbsWYXlvfWFpUrNwaksRWCCjvlCNCfS3w+oAecLErzFSHLTomeGwVCMFV7R3Ea9grWny5kvu0vjAgg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g14yr553ykn7lw7ex6lr6uafek2gaedvlyq0d68r","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"PQQ6gK4yl3K0EVpfDLYOkDJbut3O5SD9bU88gfLXL2sRtnT3TFztorkKoERE8+gkhyOLVr2Px0pqWZ5ZMOag7w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g14yr553ykn7lw7ex6lr6uafek2gaedvlyq0d68r","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"xc5P3hv5FyWMSqtD5FmCFT9l0hSkZJE6FAvrilchybEVz0bL2T5juWNUdLH01K3m5QrPko81tQo2GR3NKvUGAA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g14yr553ykn7lw7ex6lr6uafek2gaedvlyq0d68r","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"CreatePost","args":["Training the next generation of sorcerers today. Remember, it's not all about power - strategy and style go a long way! 😏 #SenseiLife #JujutsuKaisen","data:image/jpeg;base64,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"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgPsmZMaFRMRHVL9X/yEgdJbrN4niUjZUFA1wDsYu1XQ"},"signature":"0KDmDuLq2EZfEd4+svzOZMZZwuk3RgaqvYhREOcabE4Ejo1lOHve3pdFZ0MUQeVUrI8jWPuKd6I0R6MAMAOyQQ=="}],"memo":"createPost"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"qNXqVIusTY5Wtr6SSuPAw6yFgjDCl8ZO3jSLNHFP/sE2p6WtL9Grhw7xalQQ3a9iyUrf8mWdyjvRPqSQYuGh6w=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"owabPA8SOM5T2UXvzCdfkbsSh4iBeVeBvzEwR+Atzp0pGyU+UP7NygeHt8alywj7XvxvG8rtMxDtoyOvSY1HIg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"WMjowS3f4bKL1Oz6EtnQyzJL74ureENHF2So8bsjfShTo3Z7O1JBLboZGJMLRXlpZvGlVVQjOPFEEHX4CEpxAw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"ULztKtkYdHwIwBTmhQMwdzFqIUo1nwynZah/sKK/KZRGIEUKv5115oxwBeO80nva3qdly2rJE2eymKxOpk+kXQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyaNg+hBb1kUTyhx23vyBeg6wyIXhtmXXtOwDG5fOJB3"},"signature":"P7rNCs/SA372hbBrn+MCoyWUFWuJd6QPiNIjcDQRwMpWCfBctCg6tzVNpBe/t2vlhcbwuhGwGeSmGlUWJWufFQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyaNg+hBb1kUTyhx23vyBeg6wyIXhtmXXtOwDG5fOJB3"},"signature":"6gKU785GJYBj+I45g+SBXx5GCK2yxW1lIvpJaDWmV4Rb9vkoobB/UOcJHdkJt9kLLGazU/tX/cy0hWvjkmgcQA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1cpx59z5r8vzeww2fm4ezpz7yvjs7kptywkm864","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"yj+IXnMbEiCsz0gcDTMN/F69f+cVY+H+WDIUZCcdnWsNsDs/+EUfRurEIOcp2enP70innWWBUHdeg1at1Zzymw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1cpx59z5r8vzeww2fm4ezpz7yvjs7kptywkm864","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"/fVIktwiXq+zkac/vTQu4U0nhPUn5yJlaA/C+IcGkdEysvERlAAQrudOC2zWq3dp4ydOI2FA+krcZ7v2RUSm4g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1cpx59z5r8vzeww2fm4ezpz7yvjs7kptywkm864","send":"","pkg_path":"gno.land/r/demo/boards","func":"CreateThread","args":["1","Hello world!","This is a test."]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AiUkDPOKGgpjkZRc8zxqbwBhgTsQHa2fspi5PvxiZT11"},"signature":"VmwUciWsh+vziG5kezJlhIfWkN7/O5Yo1kCbnkekOnQRT8PBlWoUkMkoZk6pkwtT+8C6rkkAgXPn8zAAkSM3dg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/boom/boom","func":"TotalSupply","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"ZaxUYrD/mx1VDP+kWjn+Qgxo9wLgOmrBpj9eig8YKTpzKHj1UCVxnVcY3Y4RC4xLfwseIa5L/LUe5o+jY2WiIw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"cq2IxHqhKcQ1Z8haPxsAHr/ZLPrmO3hxdRf86RRa3+p4kahLP86s+nR+FpYxLNH3cv/aov1nga7MXTI4fxy8Og=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"FTA8b81tnDpP2k279TBJi18LyWhMCT2f8UEqGJAfJNU2VGGpYq8Than7SuzCCfnmhSmN5zRRNpw4DECDXTabuw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"fnvLpMeuPyQvq6uAvh86JTIh3AS4bCqtz0Ep4uLA91pxNx0P2+d6iAREwBu6UchDqLA2nLUVJ7hFI6AwnxBmDA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"XWqlb+02MGHxc8h6LTL3TeEIE5NlvyT1SYbPlbK80s10lIwQ79Yp4Yd4SYbICQzCuAuIl0kYkIKSTgn9liew3Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"ZLGJEOGn58r79YFGo40wt1VTqy6roGnkHAmIlFHsyjQDVwmb6IHe5uY4vZvQJ0em8bSbLqj45cZxuyxoLhTBUA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v2","func":"GetOwner","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"E00ifd4O1VAahHh/h/956M3a10ciWYasROp93ZsYbAITb/l+cdCzFkp3xWNpbn+vq2jqhHQ5e+Xkefx8IoEltw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v2","func":"PostMeme","args":["data:image/jpeg;base64,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","1710864357"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"t+b/Q/hBtKSF/rKuNFudv3bZWVO+3Eh/hUp/MsC7ug4FHhoBc/JcYfnHklUsqZ045ghBHwPmFJ0Ki6vJ0e6FDA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"CreatePost","args":["Just finished a tough mission! Time to refuel with some Ichiraku ramen!","data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAWwAAAH7CAMAAADfIlVwAAADAFBMVEVHRk/q597v8PFIR1AaGR/ku6rm5+jd3mPk3dPm6Orx8/Tz9fbk5+hHRVFFRU3//v/w8vOio57l39UXGB2kpaGqq6dHRktDQkrp5tyoqKSurqrs7u7u7/FGQ02noarc3mDY29vi4+Tg4eLi5eb+/fxFQ1Dg3mLnvK3m49nc3d3W2Njo6uoUExnguKgaGBnFxsR3d4GztLAdHSPBw8H7//7Dl42xhEpKRE4tKzC7vLnT1dW+v71ER1Cxsq3muqdRSkrgvK3JlpBLSVI/PUQmJCrd3uA5OD6goJrIysm4ubY0MjjivafMzs3HmZW/mZLg3NP29/i5TkaNYjXj28wmISBGRlW2trMPDhP8+/jg3WnS09JNR0W6jlG3iUtyWVAhGhmwUUrm5OPp7O7jwLIZEA2iZEUyJyLd22RHQkPP0NGGXza7mFrClVM4MCxvTCetfkausK5FNizevI+dc0Lb08XXt4uzilOCWS3m3c9aS0G4uMBVPjfkwZXWzbyOb2eSkI7Dml3b3W3d19HryJy4nk5lUkmmjIfxzqNBOjjAopSbbDuHh4fFn52wjo7f2MmWgHDLpJWlgHwOCgm8vMWdoaWmeEOTaDtqZV4tHhRua2rRrZ62m2qyk4N5UirUysbRsIOymZLSmZ+Xl5javrmUelhVOiPbpKrasqP79PLe33r07uu8kZJkXFXi12zAr6SDX1mmLC6Ff3rWuKzmrbSRNjh9d3GjTEnLwLl2ZFZKQzdXVFO5f4Crpq25n51+bGNfX2XQnFY+MhtnPTqGZEakWltoIBmkiV/QsbLIiY93S0klFAtlUTbkxbt8LCiBOz1xcHWvam+EblOWaFCbdWzYqWXpt7tBHhpUJiOYh3/cr22XKS20KienjnORR0PbkJdQSinNvF1uYEPMpafArVSvsri+on+QT1H05uXpoah5WzzXy2a6uW7MzXqnpV/my8rv391mRh6jqq5zdEHGbnaUkVXJoGDuv8WEf0zv09PVf4ZZXjq7WGDb24zYwqDehF3Kn2/6bCShAAAgAElEQVR42pyZvWvjWhrG3bkWHM9wXNida6fbgTWBXbji3j8gINJfDcwEkr/AI5gLWVRsc8CY2WIQ0wjiIkVgbWY2uJnWbD+gCeE2Y7mQ8WIQWdj3fc+Hjj6cZO+RYzuxYku/8+h5n/e4xWA4NNQTuHejceTQb+ql5w/3jw74vM54MXXcyeV8OnbwIOiP+j2FEGZfeHo9z9dxEAQPm+T1UPTUR9NJmCHkg/6jOrmmA47kIcg9+R8enSdGC3ky2uRn030En/4UZ7d0a9yedSto8/Fiu/7vepvMJ2N6RTgFYkc9i+DjhBhPkn0aB+0gXm8vb6Nej0ls5kQEE3CDTf8uOQs6XCHU3iV1SMVxPVVcb89GXYLdRL7FmCVf0JOgA8BTcoRLR4ePjTdXodbw9WbRfoaiLWmH+Xb98LDeJ5eTMMIPhuEo2j3ijipAkd/AnnHgD/wg3SR/DUUPlSthq4H/i7CZxOsKA5vmrXZs+up2NGrDW96q3Jn6sVhXYMutqmxWsJbwFGzHFnvjgHOA6VHIXfnU/scnVF2ZDx7Ot+sgfkh3yXJxHcG7EW3pD5aNCBFdJbs0ANgDL07zM5I20dZnI+TZCGMc8DqnKXBcOYfybfHQhQW7QM0N44Ipe0zWnDcCrihbTWZh2o5jYD/iJTZZJCKkqoUtdSXdx+yjULbLwsvtOo2Rdr48vokUakKlr/eIhD3M79Zx7Pf7fYC9S16HWU8ATGXatnbUrz1H0DNUexThO7uO8RHSTEG6MJES6ScM5YBz1G2ESdO2K6S+IJmt/IO+7TqWdeN5CLo9ZiUNTiMQdgxlL043+cXpMMrAB2Af1nOYY1VHEd3mG3BshE2ufTYVmehxqeweObW+IFGfaNysJ6S3RMPVKsxQ4UbN8vglgMKqWd0pbPWWNyXoBtxda2ux8pBaINha8czMuCymB+ELedCu+XEPWpBdQwttS9ieB1ayvjt7sQIFwocKZtcxhrxeYxTx/TbQhn13ywVJW+YnwXrMXAh4GhRKehlZ/jicvvjlp5XIekxeBlJO1jk+Vv8OWgQ/DLhrjRJsrgHLo5S/OEr3SvxqEkQJsnQPVU/1vdK62/RTrqE63IVn2zSY+b4P2l7vLy5vxwIZyYv9H5IdiDNc5LsU5sQb9In2Jp+vcEd1WQLrnjwH6cX0b70sy8R4tbg8PX79EvdmhW0YXdk6ZtVMx5/hE4q0PTol2NxOO+rBjWz/srhr8tJbaip369p2TGhpenQdjRsNGmCvEXa7jdreJ/OrUFBhVHsxjCQimi4xihjYQbq7+MtYUO1DYYNB95wvrJTqOKAOV4vj/Ld//TtfDCmpMKdyVdeT3pMm0ajmQ8LutuQsqtIrAw9Hh2QHhlOeAWX4smJW1G4ZxYHN3JEVZwTbG/h+36dQkl8gbUfB/ihzhAjz5Q5NxPP8vjSSdXI5jOSOShPA+0uhA8FI1fPl3bff//b3nKZQ9y/MOvsDvsGf1nLngJbVOD8f4WiZQiDtSh4AViXSOS+CZg26tWncxkFsoVsirqja8hKngA02AnUPaW/y5em10P2KCtviNqGM7c88ry99JN0nV+NMKtsUdd0Xo6hFOJmfJfvNOl3/vr+AfTOOL2vDYOZehTjDumP7dE2pVcJNr5/j6I5G57C19Nyqzypg8yJxSu4V4JaDWz7t2O5CiqyRbuh9lLTDXxRsMJJ+O4ZQsk1OUbNS3dhKMXTsdRC0B97Mgwek7QXg2qHINGiVLBzu4KFnUFBvj0/z7Q5iZXr/YbucRFnWoZ0Lg2ZWF2g9q6u627x1zU+BmbZRV6NGZVdGAZur66xZ2UVlKbRtl0dWuHXVNpqiCbqQCH8C2NCqAOp+G8WdQu9+uhqjDVA0hiweTfJ9GvgAG2m3YVeop+l2OY2yQs8KOx69O76ZHl8k2036EAc/vm8+3P0KQTHr8MbkIbNFo290/79xbmQ9MqNV/0A4BgmbMws0r0m7Rr04UXGwgT/cj6qcHZCsgSKoNgiC9S6ZT7H6QUdOb3QzvyMTAdiBh6wBOwaSPBRK064p3/Bf45vF2UW+26QpBPPg+/1mc3cGYaRkGE+tI9lV71mckfC5UrMZR0dHrdpHIm2jbMbMMsBBfZccvNBVJVHbT4qb7j3ISLCDxCYcQINpk2axQcwvb0NMdvSW4STZPRBs36N5abfhSbzez29F4Wl04BhApuAfd3vogHCFEIT9/sO3q8sbgWf02fhFE+cq4M4hqiVvPtcOXeMMY3TUKuquRbtQNi+6KcLPSzmpztt4pp0KD+rZte+hqTkj2JgxAqTdHgxibMcpApIlO1Ncq4o9fzBo+wGxBtgo7WQxdkxMAt/Jsii8ucqTHKyaZgfm5vv9mw+frhYhwv4Mo9MxqHkFtPINeujU/FjaMUi3O5J2AXy7ZpN3JdajI1K21QZZtCVslVC4hdwK44zVcJt20wTEx1CXuX90nOslwka7JtjeYDCYzbB3TxbX2E067niRYKM+g5faagDrGbj7Np9G1JfjwQrZwZBVg6pjD6bP937cv3/z4Z+L2zFTsD8bly6h1qB1xOhWy163SyYhS995xZirgrZGq7RWpfXNrEpd8hfG7aDI6sZiOmDm2Lif9b2Dgo1LHlQfEfbAAweAUPJ6hQUwur7CEuohbIp9A4RNbrPJT8Hae4iPZZBZpi9OrzDroYFQZvH97+/BRX57MYzw4LtS2uW4Ia3jQIgj0Bptd9TIV2Ougz46OTlpVRp8aShIqnmFoLBy3QTxhkopn9GcPBM2c7SyfYQNwg4kbfAItGQqk06Y321Srw3Z0ILtY38D0p7fQOFjcBYsCqeLPN9Kq0b77+MVQML+Nn8Z0ql1PkMkaYp0DaTPjW8oh2gWMt0I9KgMWY9WfUEFDxeF3bFLdqdSvJmR+uHSqVzdYeXVy0MV1mESNlE0sMkuqExOw/FNsk1jsHJ0ERu278cPu3wyBlVDSz8eXs2T/Rrjh1wZbLdhxmbf37598+brxcuI8y9wNpkN+7Gc8ZiCHxknGvPRAdh6IGzl4sU01HOL3e4eDitS4E9sdFcoG1NfEGgBt3HR9e5yMQG1xgE4woCiOMIeDFDmuHS13udDXH8ar47nVzt0dmkf9P8+RJF7hP1p/udIqSjLuhbpOm+sflaKO38S8YmGfHRi6xnHzzRaRRdk6buA3SnWYjp13sUKe0G8LFfdmpVWuhxrWcVa58qGZwo2XPc+xhFlFh4tcW/z5XKXBlTrPF/Sbg9oPnz/B34/No3c8TQnA3kAB5G9EQkfY9/923fvvmJEBLx4YplJHt0G0OeY5lSs6FbkPFJbxZJPDOkybeQM9ycA22rvC9wSdvUrzKZOwLISW+BcrS4zlazUAi63UTv2I+O9bPgngE3tut/3pdFSZZuBymM07uQ+Jh9H2bfJIID1gPbx4nW+mN5M8kTGag87ngFMBhZQfwas379795+v23yVZZ8rix2devNnVjSeKHuGtOR7VJczgNZPWh1b2ho3EivXTMO9xptZBm6j5rLucVlwHdtnHF58H2Ge9kQB2/NVJCHYsxlKE2hvNj+QNSRs9Jg2sfYHMmoMPPD1X5fULILbA2f8hnLg0ergbAbV8T0o+1OyCC2v7poEInmPTIOCaxqjRkFXjZkoHxl3PipIk5pPLNyt0tKVDvSc8aavI3hjKC+vtesn5ju2Dgun0+ux28FYy5j19RPnpvPhMCmZGMqmxp+RtlHZJF80DXSSOP0RtLFmggXL5pGU3e8raafbZLtbo4GoFz0MM2gksxnEPoD9Yb+8itCrQQJq+cJOdZJ3zTcqiE+eGj9XxivY4P7Vq1Z1EZZwE+xuyUZ4+Tt66SqdA2FcrVrKlTVndXw6ubkOI0zBRTKRM0Ip5CP/SMtzAJtCCAwQt/QJYNXWZIPgf7SbPWgbaxaG1U0dsFg0xaqbIo0jXClGLGxja0ktkLP1nYT4wqSMGlmQC1lcbHENWqMlhbmNwRa4EImNkuAmTYolXYoFWXjSWFIxQmAQKfb8fX8z4yTO3vuNfm3Hjh6dec97znfkmSXlY0DnQIi0O5fPryixyk+QkKBvCTGwtyE/9j7+tJ8kkU/nJwAeRkNSZ7xHZ+f7/WLf8h9uMH8TciNDmRhX6caC7TsuU8G+eUmBn2MHjYj/+Q31xe+098/edk9Pjwa7bdkWVHsU9ODNSonyaJII7A4559Bj1tYqC2FP36PQhLTbgLQ9/HfwFc6MHj4n2s1jKNS3n28/f//6Z5DsJML/NiLW7o6NR411xKmzLeJpl0EiYT1uZOKZQNc17YLSKUMc5WQFTzOrfM3TE/YrXAQZ3Xb7w+gxVu7sn/7z8+L6er4cLQftjRVJmLrPpXzK3slPc0LtYV7jDOnEcZgJbKZdhh8P0H43PYRNX5RvYQJtYmA/2d7eefL+9aN77K9LqZ6pVIZ2V6OSkuhMGBvW9bqW5xRrZxWocZLedSgRbN+urPKAl4q5QqKwD0GmEzQjg9Hiy5fpZDEfLedvB4MTnCQUEVnhO9b4wfkcTYaH/hnoYc1uhbDD2l4AG74XUJtQ3gZ5n0IuL5E1rt5vv2B+JH/dL8mr7UtujKIYDt3nyOZBC7JDNiUe1by1TkfB9Kls3CUFW2fOGxJmSUtKjjGEbyWlpOi3u/PZF0hc08kMgD8FQTn5RIoicrKCaRTAM2zUj4DqFi8MbwLs0qYf5UC24p7yJsDG7PgEK5rex2f7BxjZ9kuTKhEpA21YlRyb57LOkWcdztV6JqTX1VGQc8b0CC3YfrGYTZ7p+t6U9Wncb8hBJsXSxgmOQdJC3ovr8Wg0GqOEY9c5oXekJJHdoVoEK0Nk1vG8b+MO6IqgSar5FFCGsAm27wJZbz/Z6X14MdiLEnpVEtBKN6JKJU4HdcOYOi0WN62sZgDc9CpYDsdEeFrSHCvuZ2hra1LUNyUydnc4uFfaz8aTKW29AO8OCspyOZ53u939e7vtA1Bx/JMrG4Pz60OmHQTpRPh12rbCG9hl1GuwfVDPbKNk90Y/75bE4JHr0P3+CkR1hfOhgm1xruc5umpdJ79sJBPpDO9CRf8NjTyCbC02NNufuWEgyBT0Vnwja8qBG4MuhHZIDoGqwel0gsRRUtAVtnG2sCSw0bJBXAeY5MLvwA26gwkxCLjOF/Fh9x0ccz1DsHvvRy/aQHZIeylaplE8KnFFWvy1fqa/4QZ0C9i2AHArT5oV3nRUr62vwSpoWRLQdE4hbLXjE2XMSk7OVLhLxqQYdwKSfHA0wtl1ijiizbxRUhD5aIm+8FN3tIAfCptCuPxdrFGqUUmadB6wkAhsdiJUz5DLXiz/uhezNMNNDXtMGNRwgcM21Jb1SLkMied6JpjpmgnmNXXQTUHtj9VUeOMWhA+wazVuEmjcxTRm/aiUos0WXLdE8Bg8W8goJDf0hDhpOPBezufd8fIpw0ZWPM3wfUKCYS1BTgUn1ZdImnZ6MLApP/Zm18t3e5QEh5gIYwoswAxRHTW4Dd1PuQ/lOxrsM+otF3JLo84RDeRr0XYi29YSzIw1tb2Wiu6vpUrHE1J9XpRdiPbb8eyLou3R5rknMQ6uEJBjhI+WM9wt1Abue5e8OV6oas7QE9gS2OD8UEXGy3t7aDp4cTo0r556/umc2MhkwbRGa6+RQq0CWi14VGg0HI9jw8YwVxM9Wd6pRmGW+zDBjSdxJnfIkCiSpBES5BzgU1SVyeSqA1+9ws6pon0b6GXZUCMbGBBuzI7AemcHjN/70XI3AcIVIJ0oR11Bva5xgejDXayLQrsmrKqyu24FdFWnwWpKp01IK84S2dKvEjXhu0gVrTzTI1k7G9u5+m1wJ8Bb0f60HM8OD5vHTb3LImiQjocb5Lg6ChgbZe92CwmT0FMrnBaJCAT2zs7O58X58iDhaI4oruGF1mKSaHjc4Jcfxxm11oW3kY51sRx5Bk+xzq6CPmOc+PY5siuRNM+FuOzFOSNuKf22d9cwtsWg/GNj8Mt8SrOn1GBSqNm6UY/6UJrUvNclheAteUtke0pGBDYVkL3r82WbxgaGQ9ASEmSECwsVu16p4BcaccOuvfOqbh3SN2F25EOvVQu2im6GTZGNMa4b6NzijdIKXrzBEHJw0w42ikmxeHA2okHfwMbsqRCUCOd6hjr+zM67LWx8kzrkRkhHwquLS1jA+3Ix/9doMDg52d1ttw/29hJUFCXgrbguohHX6658ZAtCg7qanxBzw3oVI9t0rkyA13AyIm3AhXikW7+atLbjjp6QI8H+CI0MFEuD5fWE96rYD4fYSg2acr5rYaHdgZD9X/m2tMuugMO7dsXr4gKnNMH0gPN59ujR6cOzd/tk8O8kCbButXSfo1U1DVLNeb2aG8lrlolee2VdCS4ceFlVt6sF006xift+LWNRJMapIIiitEVR2p2WcH845Kf+wWsyG4oIdkYDqDoUbOzeqX0A3KrRqnDbFXqmqKHWyPEhXWbz6wUZe/Q9Iyhhx4Aeytj9/wx2uY4F4Y7rrdaNolHNOmi1XrlRzKRl6UeFqtW90lGOWs0Vq+nHsBGP5OpHeY4w7Qx9zRqyf3HAhgSdH/NsEu4wYOUIO6FZzfCHIjswrlEiG8e4j2ldzibT6eFUOZ+ZVFTn5+dPT/9y1N3HbiTKS2zrRpqwiIW7XrFKWHzzV4F+ZRo4ajVvY9pZs2IiPOJmO+fM3MlwcSrSPIwAdq09HuOnFztNHbms2aHAzrC+NWz6V8pbQq2DvypAsQoBdueKWzMddj2d6ZVivsBm+3i5XD589Keze3t1458z1eBajs9YXdWX1QzwTTnwpmA8jeXeG2iF0hbF4S1qQoOFtkUpatTmEya4ojgpruzixxelRFS2mOcWeNiGTnvpQYXej6xUT5Z+o5SSYRP/NLZwqdclBh9KKiyqpggdK9kXfztrN7LynJf1VtccsVh9tZrlvLlqHZsFc8bUq/mwU8Tt8Jaqp5ajKTZuH8ePkqS4ccSfXzSgy8YC0oa6zpY/htpTpwS1vJo0qCa/E9OxnrYC++mh1aSZiEM4pvSxkunk34NH7w4aOYkwH3VOJBvKCrE829Sw6ynYFYHd0DMRmR4K0eaxWZ87s1FOzuwX+3AX4cZfEpVOxvPJl46Xho2VO7btynRBY2LhDn8gsssKN/0hRRu3c3jCyuPhE1PPYi/yajL5/N/XDwc1R6iF87rLORcysn1pIDPgzU3zqEANKx3bLSYubS8y+Rq67cMrlkPRtCN7Ijyy+4SQHWltdEczhk1MuZTUhppRB2iQ1b76LdUklN6f3X/FsSkeGYRUIbMRHu4Ch7xRieVrE+w4fiph9vq0u/frmuXn8v2FK8cWVlkvnWcP6IKw1TtoKn6kDmw5xN2VlhTVme3zBrVqxuNkwLAypB09XzXr2WufXk9k0iCgFjS+fh2LARaPhDr4cdl2NoM5ZUqdxJ8dkXxhBrx5MwdHXHsfRw/brV9dnXDQ2gQf6Hs68PKV9RiOginxLdYadt3eRo4FeMxtSLyLGLfPCVPvewwreB0idsZdY9p+u3u04L42BjNXL7SRXv4Gttuitn1JqNSFPkEi77SK9qbMpiHr30anJzGc9YZvTtzaUB9rjnhz09raerxFtzqy15WeYICjfDheUBtwUZSYGuyAOyZF6aspIjUsrmYxavLxNOkk+iu7D3HoqcNSLaj5c0g/Hsj5DtD+fWEoMd5h3eC2AMQ6JE0UEOqe9N5/eNotrj1Inf4PLLxC1HAFjFt0/eq6jwvuC1bOlcYswW7wprzbz3UERbBnykzeM+6jtFgb11AmIexo44wMiarvPMYdeGXvd16hW+uENBYbqkkpdvO4Z8aonz/Z6fXG50cHa1oY0jLg8DUM78udXnflYh244PZ+Qep7FzZCTntvu6ivGNzKHNZ00vQN8FqfBQb0RlZxsLzWsJscdbnTT/93ZDsTPfpJBzUbqyoudC4upCVIgn3aXseANmsLL3BQ+D5OhapL2KF6Vx6nVmFNdavsZWZN1JZbhrcd4xVT/ThB3veVY8FBgQRbbNHG0WjGsL1mU30C6XeGnQ7sUN/yWBpFNW7iXF5Ks7vHgt0g3bDj+aVI89YD1l2Neysby/YXiLd5D/i+wDsJTNw4E4RtJ82WgzyVNGNOnXm4BXZkRmCiwQgMCc+4NylTUe1e/sNIW9MNbHqoM3CMnUBA/XeMamL94XRQYdabdmRzaOPxWEf3/fz4vmuY20JiHheMlXRDu8oNW3dh/7GVCfJ6XFfAG6b0kX0fHi8i2vW4ArBPlh9mhzIKHKDhxdrO+0NX+D/erh60jWwLq8o0bnaxi2yjsQ2DpUYEVZYI2zw9j2FAnWG0aVINQ1wkkFdYjT3CgYCKFAroGUMemNcYNA9cmF2HJUtYSJNiSbeFQTLKNrL9YI0XgXDx7vm5d+6dkbK83XXujCRbyRrn8+fvnnvOd87quSnGGlm9CaVgBPvF2ZPjx56nh3AN76n6CLDW5bpRmQK1DrIp2vynOtgJv0E+qtPANkRlQ0P744YWrWhnHwIdhAR3yYWX7d5boSMwTwGM6hha+0FgWbcNd+LbAZfUiLbF4ebug81NoSKnZyfdBY7kaD3FPTHhNSn3VMGWms1inch3sugdDWyJdZlAVmcdfeNkfq+birLR/LiunXug2CQ4nPJi3L+7tn3c7XYnZ9fn2AXKiQvsZPxsWCOzZc0dDCW76N758aT30q2EnuS1kOgQ8ZWvv7c1KqhnL5CRko42P1dXzbyXDjeWmDW8obghbn3f1KjNRi5A+uj4rN+fXEEjKExVcKi9gLvrrFsnNxM7zyHfUGINUd+Hfu+gI4gs4AbRbijFCBtTcC5+GtTZK8e1BB1zKd9lM0bRD5nrBuCwgTY3MA6noBCOoOzFgIrq47sHR93+2/7VNebv+QiJxBYXRMBB9DmY7chmPnJb4noAJ8f3W9tlGUejfOBe6OkanWhFcQbaLbtYFLd42LSK8onfYLApi5VCOxOkIL2bpoQD4M2qjMgpS0jHHykfj1+2f+q97l5dXY0vLyh7D0UZPKVbMuf0OajNzEabFNktAetdODlutdeR1+LRaDDUoeK15DNvdallFwlkxLlVtOviDYG7eLXhQTc+7JxWKSsnFE/b1LSosGqizZ4KhLpJaKNJWcgL6fTRXnfSnwigb27QyOfL/n6UEbb56q7329Zsx3diP5bcfrR/+uybvQ08ISLar0LzBKPOiFP2PcZYwc3XrJXTipKy9kBoc3HCoHei3U1dT9gM9xHUhErVq6sbG/cX5kE9hExfc8N+xLP4IBEC3LYwyZf/4zmn/4/ZDhPb4aokoC2Cvu+ed793gdCVsFIJK9mshgrp5EanQa20Au+irUNdN5AWn+Uws2UsILiRzE3Te7VqBifrlPsWSDc/4r0q4L43v/3T60kPxAOQPoxoVply50ASGUI/rjNGt79ByoIF5Ad85vZw//S7kx9eehVkcwVkpGVA3agkImKS2lY0TomFeC7Y9YJ4sgt81ekll1QkNbizK3PIrOqJFDJ5NmmJN+7Pbx+9IfU4h/4O2BGhFKU8Bnmsr/uBXkH/PKJNfWWwAO3zy/HW1wclgDOcFUNXzJiOMa4Xp9EX8CWM4amg0KaXnDsN7WlwK00x4kGVrloFrDudanP9/oIIqHtPoAEUY49Dno4AbHbkoBCcNhRwC/pfn/PLOBwcDXAsAge4T8KYnnaVQQW0/ytTeQ0Da43QtAUWZyCtLlj0nKxcUidjvF0GW9Xnp1BcJ3iVC//N1WpHxCaP19rdyQT8MOcce0RkKwsspBM1kyK1I8ns/K0TGzxAFnfDY0aQvNuHw8k/+9vlBiYwAOynnOHQQa4klK7bGp/rulCIq26ibNMHiuHIbFeH22XIE6gzMThzXKM3LsHpavXxwdHx8fgKZ+jd0JYIw7WkS122krNqR5GvZORWuQ2NkrJJB8vLXAT2D4dX/Um3fd+zGexWQyU5krSGzmqdzSbWROyCAvxTzFbsxsKwUT4up2QlFQ2KwKXTQaxXD4DU1+c41g2gpI5/BBsYhfYb9qpCnSSOuGf6tpXEAbhlRlvLkRyOhpfjyeT4VxfgTSLqop6dxlUvZuUijeU0fGeDrVwO6TVFTjS8BdZE7PX2N5OfLy7kXCacjCDtIJZFhslAGoOZ2bK8PiXR/xdS28lulOLbAUZcwCCT1+17np6JzkbUqNJ1U5gLBYPZvwc1gO1B4f1VCvIpzhO2pKQQJ7DLHdKUg73e0X9ubm4ipmw+zz4ZiHAx3ItQqjEl4tNMEPYTwAwFixOgQdKe+8fCDvVjk9MEZC0dxqpZlJPBfSPCWd3jyVm3vQDstm3ic6vSakmIiyTSdakThihPWbVCjW/5IlcuSSqq6rxruqayqKc4LrAu017ZnO9+/Qbn6EVWoHouEGwS7QhDEMis8pZIRW4wGUBLAoA9GpH0oLoHTso7pRxUbArkLj7sC3E0SxsXkwl5dG9a3OZA/51Drnv8TYNh3f3+8cE9t1irQfzcAvFu1VsoxPJMkkZUR5HXUm0JVw1v/ozfg5XzlPHhlYZ2KXulFKVkoM0ULze/2Ns6u4Y4JMIOA2hWQpsMV9OB1sBeJBn7KonZ4odAlrzBIPApNPSV8W+694nayoyYQ2tpQKMsFcIcxwn0t336GTrSTwJzY8aTfnetXLFrgtsi7mu1WhBAaOe/hLYpfNVVw0fyxpJ6TsBOcdtL23tmAW5wXOXC1/b6ZxBgR4R2ZAXJby3ZNLDBPFJHaIcAw+HjAuzRcEBnS5xf8Sd8OjRIin6efiBH86hyPmcAHWzlA3JD13H3oMPHb6EgBTyOk0wz0lkmG+BmqJxahox4rzxQcE+zpxkmwYx+S7g7Kp1Sqq51Bbcvzwcj4CVOpJBok3IG1JYOzM5LGUHPdsTTKoYxwBFJx3DaS+wHhuN4etsBZ7qkd8Fn3SBbEKiKbCih/mCcMHpxDZMxX9bVJc8AACAASURBVDZDwNG2awB2saAFHbUUryXCOpeVjiwtwr0oX5aWxWsuzDqlXDdLbo3i6f2yZCZmV+f3TibXl5fDwSiO8UTOdGawJdp5JjZ+Bv4ZcODBGJZBnPQd8Lne4keA2dlZ2W80+kQSYm13daRIS9F2YFRXnm2u4kvjSAFg9+Ttyd58qSLILPAWd2EGpwHqT9N4eWlxUT7BJRAXYDe8kPwRn4Q7IXomb5WgzYbP+eOtyfjyclfBTX5RNKmiwc/hyIAGagUOGmiwnQ5GgxDYkd5QFsjO0kDtixrE8mIofc6Vm/+Nw8cZmitAvwW+/HWB7ynGsa9jFJNyheRXwFwXVyGD8ScQlmtZXPiUvOSongl3mFZvab5KMTwboaDLE56/rcJHne8B7evLXYI7oGFlyijNMpJnrOmXGjdJB+alErOTjFUqSPa1BDVBzMlE/oJOwKY23A0sFh3CGw/tyVfz/TiII/ENYgowdnDKqIgDT3pHa2V7ScL9ZWGFI41aisgsExrW8mJ8l40XYDaZ/hpUrdfRpttNEb0kD/YK8/K3WvYK/qTz1dHW26t3jx7tMt5xFCW2dNqWOKRwJFMjPFUKYjPYatyko68AH2pAV94UbPbF+jIOodgukBTGcYt5Lc0IrWSQ+xvFakE3/emzE3HKCZHGtZXCl7XayhRC6wwGOAXG4ok/xodcGrO5CAQ3FpVDSXFXi1DoAzNA0SU8SaN03E6pXP3q517/7N0+oj0cDKBbi2K7WFxo7eNYOaa5ckRPBwYBD/GXwefDJcmOdtH+FvDxhORHiwcB5zhJd9HplKKRETeRyPfzoyGu34YDugYD6OC7+Me/Tt8A3OuVGnN7paaL86IuFXDrnxC6y9NXriHRJsTR/xp6GbjNE4862cskYeJh7rgI98ZBt/9+vI9wC7IOBHsizCHLNg7aqQTysSOjlUCB7cQ+tmKwu5cyooS2jzdaMiXQkOyKuFUkBmmQg+rIVg97BbwzGgRJLzePHebuXyiy4zc6/E2s819+efHs+fO9X4s2sHulsFJg1cB70dTlZUnnWRAbYHPJXvFbExNDxaWsZHIpiZ9ZAO26Zdo073afTManCPcDVBP4ZQ1QG9XEPuD1KA64WBbgP39Ifw/DdNkWzVA7Pqg8aQICzUZgpSYCU2gOixSzHSvgTLrviJ84vMicbmRxEXIH0WbgsSq5v3/6Yutvf2/jNimIjdSmGC69TDTvqOvhHK47sOYe3nkIDwG2VnQLubJMaIdemEV8+rnHJahhdZjqbvnuUW8ipGRf/FMeEG0AcHXGIct/LPgG4QCOsw2g4j1gBeVjCMztg6QRZuk4VkOwoeJi0US/PLUXUGc2/P7gDgFIq8YZQWohFCM9QA94FMkOONA2ZYe7WO/2T/+9ddJrN+3ack3Exysp8QCIJagSY4T14Zy6EeflO/iX8I/hkaOqRII2M9wLSU/CMAN6Yl8m1D0VFHodCTxAX1rf7m69/3C6vwNDg4A0Q9TFgO2ksI+BP3qkwMZ/PIEdRPLcCZtanvB1LK5oBQwydgVbKmEud1GEGPNM4iQeQ24xQLBx7030ne0Mmzti4XQ0MLSC8W989n5yPO/VlgSQiPUKk5iRnlue09YdojC9Jm8i/vgzmKN7bi4ni0Am3Im93jPR5r3SS5pJmOkYoXheJ3RVd5pb/mLvZOvDu338x+w8Ilkc4JECwUZnkpANIcOORbMOCWwOHnBUH2KdJxpjE3AUENxJ0M2vhDb81cjH4lA0Gozg/8IHjU04cE58bV+N6JHjcGE8xs7/GDu70DSzNI5nuyXFaS5mYMeyY2aaNGXZRNhkNktNLYNgPsYGL8ISCvqWCYr4UWMZKVuwSzcREhBysRftdBTZXCzmwqW56EUgSmmQBS/0ovRm2YWCih1K/IAQHIRQmH2e55zzvudVw8x5jR+vhDa/9+//PM855zki601app0udsuV7Y3ZMdQsSJuh5qTBmEfg6cjIhHowqEzKEuxhw7Chtw1p85o6N5GbEPggE+c1Jn2ZzzShd7zbyUdrGbAS3F0FaEOm03DxLfdctMARPZpGRehFB4CITlQtG73EM0wcraIcEgsYXaxd0mMXm5tjnwkP9U41G6cvo2CwQdpC29BB7LP9cBE13tY3iXWmHN3+7x33tRFEDcoe//24x6O35n5Z9zfDgDakn0jmClf17daAD+g3HbK19Beo4flHaCWnxfRPqO4wCdvFtzekKq06wQ6wpaVbz75D2GKPBvpSlDivC1Wb9LTvDA1mXeK/dCmerXfajSwNHfKNhunKUgakLfkL46Z/6/T/S6c7tdh26uvpyREDD5E91AAeqHmYuXMvXsMvbUPaBCeuUOEPbmkBVkjmPbDXDDlCWpiiDdKyp7OfHuQqQBu8hFg3aGvaACmblskQbAix97PVzj8eULZOFs7rnT/A0aLWZKXm57RmHbc9qrYgT2HbAeDvttqnuDwZ1xNy2CRtPr6lroraugt9OPz/0sVMLfd849bYBJnFhGGYs55AoIw26fnnuZoHtSE236a1EOk7pAtRVGORcx65GIL3l46ehDOEi0Jn72w8j5bJufnfihH0Vba6sS6SGPyct0/vddIAW+yORkXlf2k1f2AbKJzWzsoV3ERhUNurQCufnXa7nQ6Qx9ZqffjQrnTpKysEbObabISEddAs5Lt7dx06xuJhLvfiS/ciejKDDQEb6RphD6uS/iVgB8PWZtt6/cQ6mLjOzilEdOizfEF+d5e5+ewnr8qV44cAm/5UvtwPXYR/sqGHvBqINzrH3WKapuWzrSar3Iew4CxWiWHL5Sq5SrQQ5XQj/kjBH/EX8IgUopFoIpGDVqEGj2cVXFBRS5abcRfbTZGJGD44tPoqQJbDok0K+34s/ru8ncKOEYWLZj2O0RwL6wiqxLmHorf/GNSG1AInq2wotEjFLXebKmy3FqLIrtKX5Qup41tfvarcL4aRa4D1ai6CTbJisKHbq3ZPMm+LRZJxl7a8qRSS2Pz+QjQaRZQ5JabEbL1NgcOmYMvlEnAx/Mk1OJKlJFyZEn5nOEgZP0aUJqJrYUIUoO9fAXXTNcCOEdx6544Vx5OQNQYfHgA8yDXMP8/afC5sqRZBZymMt1u/1rBf4FqdoK58GH2b11rdPKhlHrK/E9M8UZBX1WBDTFw/Lhz+7XD7r1E/AMYdV0jLcB/LKTkgGYMfgbaPNnuPHnOcey4XTPhLftwFNnDVJZS9Rb0GbXMSYEEKFVK/fRXLpT5zToqxI/QOjweNeoSr2qwjrYM4iKzJ3Hf0wJZoqwuw3FoULoou9WGhribTuevc5a+dDDY8c3zyzTdv05hS0PxXoIHRs/BL7tmBRvt+yY8CTiSWlhKJRNBiIXag5Bh7IJicr8VmtP2aHza7De6NilGxEHmbLc8uge3zubXSXhG/PhJg/4/qDDD2xJWHv3NBV3qVddIg620ltfFoDL0abtQpvvcI00DcZqBtViVNgGURI0qTiT2IH1PPj9c0NMZn73WVNlPW3ohQ0ndIr28aDnf2wKfIHLT9GHCHrO9S25l0uNqgjjC+X62q21qzAIHW7jTbFZ8vGQkqXKw2e56bg6pqhTSsUVf6FM7Erb6wJFZ9hW6zRb1xFROYMLk2aRrzqTicb9XbmXIs9UUIzHqE9Y0e6hhZCOJlcn6vcw2v1yQfZvW1IN1/cNhqVUKPo1it1j7qsp2IftPp1jkLG6glU9l9jLQdO8qbdJhCPNrWo151UdxFe4hj5A2WinNSFV8pEuSAkVXeTlAVfs8oWuCw93NWBc9NhYNP+H3Jw7fNBn5FE/gFZC7Uc+D0fRxSKEh54vvZZrpW+P722LVxTKpZzuKhqMMs9YcG2TvQFUDc7I6Ey2iaTKP8Z2DTw1aJi3X24k4fp/SEKbKx8Eo26jrdTsfjx4+d009T+b+TsPfjlLk8bLh4QoO7/yJs+JS32t1CKRkVulVUdkK1dM4iiTjfI2sLELbYpIuFzu0vJXOZJoYgcVQ25C4kbdxJp7F1b6sBrPdbzTeFg+lx4DwuMu5hXb6t6wfNIFyuVQkzZy21UX7T7kxDk3raonKhv3ZST9uq07ZEm5TuDO2y5+jf36Zib9rhOpsTqVYfnHDY9LFmyr7kajTbNYCdAPOwc/OQUTP+FgJup5ts4Xb23IK8bczi+Tu5CAQlh2n4xxE2joKEeUACsDsnnSZKINvqlA8/nUS79tAAx/DIiBRM90QcJlIzd2HJI7w9hOHBO6qBJ2WLFZh63n0Vk9aeQEWnbyZvq+g+RQmQm3KkWzu5M+od2RYqW39G2HwQKMyUTd9tUqxAkJcQ4HTaVqD34zZB2rWr+IXALeKkXeie3lHAR0q+chEzpf0qFk6vh++StHGhYeckk6Y8q9Hunh04cYzPA9bh0WUt4B8GL/NpuhOO7B0oZ4nwqPpyFG/YOOxFqZhsbBBunZm4dYmPNmAoSuk56ylraGoq9DR/1gUTYajXt8Iy7HWMDqqo83q7A8L2B0nZ3DQsDDW8NiqKEe4Zczu7BBB92BR+R5fBqNjtNruqd+pRlVyk5It22yDmLMC+G2bzog2i3dl7kyahN1rtytlnU9A3jv/KbNaniJKsTcyvJcz0MCoJetQkwALl0VHtDKl9iFZFsMXamrzHzi1S7Y9U1I6zx83pioxZ3x1UTovhepUXMIeFsmlUgikbN0hA2BiLEC8StjCRPAE0BrHNQ1vCtgwtAre5uTl8SueW5ueDVz43Gol9Pk+/pyiRNV+y3Eb9AuwbN3ByYB0noQOubKfw5geiXa2mT88OZg3k1hB2yKQNgjXrFwVqk3Bsjli7CZfmmAV7puxFkPUiantyTPOTKa1mUhcUWntK3/t6TikJopNPds5qHYgA6vUwmwl5eO9kq8GyRzb3R7CrW+2u3+dPKHYLCRmVGTQG5xOAdSmxlACOwDnIiXPs8wl6B95i565cwStBvwItaLxiwXhkdc23V0TXBtjfPXiI2l6vS7CxoBrrmGK/WaQwz/zeYBYGonk1C0C4or2SM6viNUk6ZkJWHy7wNjTJZpAJOSMu41aLonrTTMG+X+Oq0MGwQ46nzysQYuOmQOE2js2HM/dP2vsUZIfZTCuZZn2reJr0+SGRsdiNoGJFAZ6J5bmF1dXVhbm5pSBI9egolXr9+vXBzMyLHd426P7FzMxrbKmjPNCGX/rjxYt/uLgAyOcttoQfQ21cnwWwi8/u3djEfxUHaVwAO53GDxfOO2a2XzyawGTlvdcsQBNrjloCLSMWPHtFrGsq7EW+hA0XHC+Sey8KBz+/07RKWh/sK4Q6FHr3feU4jQPZbTa9l357vAewcUIKyYfX2agnWEyxjLDtdrtxfhkQLywH80ep17gRMO5J+/LL2zdvzfJ5TlbwzGrIQ47p29++5O2LjdQRtnzebgSZLy8sLCvByGopWUZpV/FjtfcMYZN3udoEmz5eVFP9wmoAq9WPfagOIvuHZhHn8pUQa21IXbqNB+GeFIayKHyFF/z14x4QGMqjWc6bO7lacRNCACRLs06ZSvJ+fZ8MFE8B7M0q+vcmvLE2h448b7SDjFMzG1+/vD0dglRj2HTho8srKyvXr//p+vWV6yvULl/+GLhMXFucCk0/eTL75Mk0HI53GzPQdkjpqPPluSXjvH8tWcCwA3yrePyfezhJt4kBSbaNNpKmCdL18GaxXPvtJMGW0nIe7VForaI2eSUtmwgqoB1Etw82W4mCCzfRuyeZwhlqqcMcY+Ws5/aaurCc83Y7Np7XMj9t0oQT/9qBWjJ5v5lF2MUHRfhDyUbARX7sFtZW58AD5o9m/vnVbGhyxGwa/fjCvz5a+T9n5xfSxpqG8VYPCyahpOyh4WCQGM9eJFnqoF5k04WFyR9SETYXOXvEHgiEEJRUaG4WnMKJF+dCmAshGXDC7KEwRLDFm14IcRAHEXIRL4bAsrsXARtMKdYWjrIilAPu+37f/EtM2+35oq3V0tpfnjzf877fvFNnyknwfpuamSGUHUOIZAIwJ4EzGb2s6Ksr8wxZmkZ+UqPh6GIs3Wx2GqRr3TgVT/EY4zEGkufvjy/aEjmyu8Rz3lqn/sBl5Y+bjQ8z0FmWbHfkTyw3eRiw4yZzIvEAtZKAr8dRjBJzUBbvRe/zQcAOzj3ZAMPGw9TVArlgYPW6BpHjZ4D99qRx9fMhmPljVDbW7Ydi5n6M1UrdyUj8d6OO1DxIeH4+1bOc3qzL74tgP3EyOa2DBtQm7q7AM4CZvhHa4dloGLbIpzVy3CwdoqOQF9QJwj7+0Ko1gLe0Cg+ptVJKukZCIavLhIBD9vjhzY7aRU0UPvR/r1v6Fd0mamom6CVxazJq0BrMPEInjX2o7IfaLv7THhMbIdqWTptl8RRgQw1ztHkkYeq9fEX+Q/RO834syu9FHDMz31p0t5wOJ3rIDIAeAc7o0RU6H29xRtRImzOVretaqVY9EAxjmabYIddmSS0RfXoV98S3z88+7H6o79c7ncOrWqMgvW7Xt+Wgy5ZAiFfb2h7em0HvS5TtvuX3W1MKhqFQT9HjoG3Oz5r+6yPeS52MSviC06XdD8CaGAiqp9GotZ7mygcXZ7++PZFqm83NNkr75J+4WTaOmt8nmG5lbsRpFzRY85AbbcSZjS8kEakBGeFyNnGTz4zpLkJZf+dhVTURS4QzmeYxXnhYANjNozY9Dn31/Oxi42Xp5cZK8fio06rV1v+zs6Z2/Vb71GzfUdYUfK+F9CnbbT56f20o22/QtpuJEUz0dBKwQbcmtK0k7jNuUqD3VsiK3N1YaaElStJrqd1er9VXisV8uSxevPv1FWqsvEmfistVcs+P3PfKGCfInG8UGVPWW0507JnUjHNiyeDKPUDOIG6C27RrhN2VGTtsCItKNTqVCKch/R1KlwX8W3PFdYkc9J+8PbvY+To5N/nw69LLHfzmHm0vRrWky7RqW7mo191GVWin/UlBw7vb3aNsc8CpFzi59J78FIj7rKCij6b1tmaNEbagvpP6sHRc2W8TPZOjxO3qDkQE9o/lg6t37y4LjU6zDK9okBjKDFJKMRfTuK5c4v6UHALIuq63UvPoIQ7/HPClVlHh9kqYNxhe7lZ02ETiFU5nzTNE4BoLwtaGQdmxWEZEaYOyD8r5On60CnvF2UX1mzgQ9S9MP/ymxMO3p3qotEmuDln9JXtHqS/xDfQLQ8xuZO0e6lG235C3CRw3SYI5oL8btmK7s0MvcF/wr1Tiuq455t5idad11WpddFZ2d5WNl3cfJpP8FIENW/9KM3cAjg4xAFlLHfE+K3PdEn9+9+Gonj+IwjGCOPxJI3RwXFdg1GHMiHc0XgCb3pMF8jRUOIHX7MrWlO9UjVGgzInF8k2xhbBhg87t1hB24adX0tWG7MuO4JHBhMs1HpyEVwZf8VsdELONavU+eqqXIe9nbZqsfmWbk3s3o4lVYer840Y7pW/rDAaCOPRDPlkp/TmciC4+Ujaq+P9SP/nbg8k52DzlGMB+9gwkVoRdaxOzCrX0o1xGe1LheJX5esGd2tJhO7ZQ1+540twQK10e7IGNJqIeFopKoStrUVUgXzm3G7YZANV7s2EoRHNNCEYS7hRlkZQyhdWT91cbJV82i1vibUiaWdfEOPz7RrIGbXsdY3NrU9A6bEvNbtsaohbSs24NnA3pcRNrStUs6XXw1tZJbm4CrImu4TcuCaqiYT0tC+fdSnLJCI7CbPmg9uwM4IppkaiN+KfUPi6neTACQX6yEBoyLNvpxI+cI3MVzsjTeyVNYVX8o3kGbaKq3gnDS4Lj+gzbAs7GwrPpdCZz0JEgegLszBFKG4Joe3+bwIZ12wVWnfXCfpztcWrTrXXIoxQ0ljBe/Ue7mu2w3TdYE9jW/NgA2Bb0gP0TOna7fQPrQCAYJ/VQhVdLFbzeJ0jY4xex1qGwr6+lxnEOdq3mKa0rf5IaB+WEjN67lE1tvXCYtGGHdIxE9OyBtowFeZUfwxuNCpqqeGYTrMqMceguRj1jqVrDhzIVXksD7RyY1nUDYQN2CS8Tfr+/zQNsIm16jAvVklGb29r+tJDRievlItX1J5Q9gLX7Fl6b6aegB9G+sWXSbVPnbW2cxk0K4lgIxYNd4TxJKWMOpEPhkYgvKIfLxf9K1+AiuSmArZt24T3Uj8oYbnILjvn5rS1zg3SA1CKcHqSB9R6jKIwAoEu8fL7HDCselqDmuHMjYQPkHZM5+kh6FmFP5Yo1gP0LwMYcuPr4h0J7R+GD2RGd8SgeeKFdmCdeXlrD9NYxhn/oj48q21wORy/scTr2NG6puy8MDlgmd+RruylBnAh9LolX7Zv1pzEpu1SKIezX0mn+/lQaIkKN+Mhq40LMo2VXKhEnsHZsOQ3aTm+QRg4Km1dVtcQJGguxTuVlMBOhS7fNkukbNnljNIEici2fSU9N/euo8RrifDmTKdYlLLSkH//CBLPZEdLqJ7BDb0IvQiHr6JbGvVF7Z5rq2noMJvxR2H6ibT9F/hl521GbH+q3KaCmQuRMB63iurbpF7AkneO/QthSY1NMT6XTInlBQ9JuHGWWX5IgF3Gm3MCaJG18d49P6m5NfFlF0xirJsJRTyKq8nvn3KTeFGEGO7bGVBOza8vpdCwm/rv2ut0RAXaa5MBC+8dHWgRtg8BG1i+gOr8d0vvVxlHiaF+52J/2vgQ2HcCBh99wlN7hPkvrg1Dr81S22xX4bF8PGI1EQjseTzK/J7BrYjONPorlXOGHx5eQshM8wuaWnCko0AG0gzagXHNWqwliuArRQ2A8YNQKCxtlqUsrdk6wkog9/oHBa9V7icRaDGA3xXq7fZEvZ9L3RZK1pfXd6hIxae8bLykcsRNiNPayXv10oK9U9PYD/ix3h7FuGWMi/nF96NffZ9+fMxYzIQbMdK73xONGd5zspOje0xqFXRebeaSd213HYLBaE8tRmRgFKBs4k4VlenZB732QJavqH1iBH/aopfMxcBRW3dMbUKUBpMGu4SlRq8OJxGI4HQPXerr+j3o+l4FoUmxR2BtJZD3y5oXXiNYhA7ftlKuvLHd/4bLBNoYm/eM2+/bb3Nt254wbKaWngUU+6TNPfeznP3Fq5d0qwG5AbS5m8ul8OI+bFsaRw2bZIxABR5wzdGN0wjeXcvqmOaMHAu88q3rYcyYxzHcnx0q8GmWFT5oIBHHwdjaRuAcVO0bNenv/IIcvKRFfUtJ6cXvahbQJbL2VGhrt8Y4BrIe8vxW2NSxizrRP+Af7SF9F7++jHe+7a4GZ0X26o8SD5+pXCLtVFMV0enltOXNQl65XC38/zZXvCd09YY8LpmZovsblGEnae02yxt5JKE+YKMsIQlXjobiWsQEFNeVHYNNzm0Ti0Wya0F5Z3y/C0wz+hfWU1C4qlQnqI2bRaLK2KsX+zt5vV7Z+1aY5z24tk/j4QPv+qLEE7OR9lDZ9EiIyC7DbUJuLIOzZxcW8eNy4lrDlVx4W8EBxLAg24iZ9PrDs7NIDzuw/VbpVVonOKmO8An4Nb+gRcpeU6YaFaH3bo+q5o1ZR2WsxskUsb+/v5peBtige4bRjUSHnjtkXbzDh2fK1dXw7eqNn7f44bsen1/+IOZ/XttE0jpckBOKYYhhwDnZNbLGwnRiPUA8R2YJBUkQqepiDlizjg4gxQjkImqM9B586CHwoxF5qsz2JHVhML3MYGItQ092be9Bt2UNhLx727P0L9nne99UvW06cye7OK8exE9PQj7/+vs/zvu/zPIrXWHPJ+uAwIEyEKFFhMaV9S9BSeRqbKSsV7qT7fOd68vnzpxkI23TqDZA2JtF/BNjSwOfdafdL8I5MhgZ+mdP+i040BtPHEiSNPZf3NEVUp7y3DbA7/UWXXzdA174PsHEn0kDEznvHdBD2DP/w56v6/LSZbRaoi4SqTmzgrqyibuV+IevMo2xYOhk2D+ASrCvlNfFJJdnVZHndMPE2IHWEfYCw//xPmKR0PENp13Ch4k9/+x5h83x31D3JsRD7DxiJdCLY/RtEBwnhtAupI0LvTmUPjH6dYYfy3lZleFvRRxTDBGFP8PFs+AkCQYS9twewGW1c3RtHod5W8iRCfCXvnrDJHgjAxrqcC467SPCOtJ2cNhMOHlN6OI2uNE8KmONnAGAL1+3PP32cGYbpAGzHgDkLUpwh2MjiVZd35xhns1w9cxKAnqMzu1PPd2/4g23fLZUGpbnrg9IH/btYU9h1ByNtRTQNw54QaQ8//vvnd9+isveOEDC17GIxlpljTp5cRU1b8cjcPfZDZYO0sXRyRd/lhH2nWPky9NQpNXJ4hN2ThVb7H+2hgS7SqNctffj6zc/vPs2M83ypc1Oa979hqSPcKmed3zHWZFVEOvDn/Z6Hq098r+fj3MfP72TN+7KGb6sIobYoa62ajZ6im7hlA7BfnaKix+MCU3YRLKWw5iRC+uyYyWyEO1A2K/Ar7yZoM+AVxj1owEPbHXErceEKcSyNjbsMTpA9dafmvbkCyzZtPPVkiRDxvvv8fcs4twYdPJJAYWNK03yJuzJhNFLiIfjouugl099PR9Pt33iQTN7i17F03aoDYEVQtLylG3ajATI39dnHD9+164tTiPjGmKGT/cbY8bw1O+S5BymbFLEHVwA8FptwK40IKkF2vxwXpks78heALej1D2ZLBxchRyTRR969uWoZVdmlcXbma5LT5HLlMJlhcd9Ukh9t4xTpo6pHxFXuZA2TpCA2ALYDsNX8tmrDJwp8BD5bM/iMeYvTIk1kGOtmcZx6xCa3Nuy7p7J3d3cj2kt2kuhiwsXi8fgMugQ4vFWiDmxkseQSYIuNtgmWbVvkrKmsz15/9+EjJO95TNdfYAZJE8i9S7qNGwbZ0wNVxRNlqoxH+g48vzdw49sF/rpge0fDE62WKCiyVLdkrG0gYXfr6sf3bweHAPtfR8ExSaA8XnOe6Z54J+LGXgAAIABJREFUCeKl8YjVXwe0sxccqPsi6SYrD0PFc2WWBXG0Q1K6smmIyHEEtmObICsHz1bD/12ctX94bc5MLT9asIUosmWQefqMrT7NKexFj5z08/0ROWIGcWJpaRts1a3Z5oFab7Trx6IgPpbytDbHwsWCltl+P0LYR2xxlbAujtft3d7Fen9VzSmwUduBsrNU2cRPIrKJJl5cmXWcItImPh51olpNOeGOI33uOO5LmCB1TC9MVqckNezZ5KeJObQtyxsA2mdgI2R7pnlJ93Cj/TByWgQ3Deb03MjCJTT9W4Js/N00L8qo7GMNLBtPyOLftSCxEWqG2Ri5JzgnjhOw03ZxY8reVNYpyqZFwtmYk3AXUSeppWYxyUAc8VeWr9j4bULhZS572JV3ajXQtegEtTMOTFj2EEITVesCUoSNS6u4KNLpdGIrfv3onu3usp2CNDmT7V4J12MhAVLzRNkqPsjjRJHHwiZd0Gst0+tdAkgM/ULY0RpqLj0IWe/Kdyp7L94lI2gPs1uO4CZGeTnxCeLBkDVXqcSQxyfNMnfoHlSvMaERraBUxjJNjH2tuqbwEE4/+6ZJj+S8DCPsiG9EvnPj9tKdOszZ/SdPpo88ns8rMq37ALPP05I/sBKI/gSh1mqp/GUm85diLHPcGm8Vl6bFpdj6AcpmFcOsSIr69m6c7vIIWZPfpSibfrFZk6Odfwh3gP34/LqqKyZmj6z8xTZaLd1ueKrol1DJZ2dP978unrJzZfOYrjvh6t+81F1rH+HPpe0pBIe+qudpNY5lMesiRSQQnKCjyQg7Nz5KKDtxxiZpIQ9VNql/X6JNvtaN+BIKF1d12EGQdcNkjQXDfR/ucCBVr2u6ElaWNrAyAGCDq1iy1+s/G/Qgjazss0Q9dkQ1OjdCj08SqD/cNj3izjCYiarlg9onVrcqYYmOZQtVxXs75S9xlwAnSJR3jkg7Ap56IOFByg66O7DOO7FGU+toMysvp1xhx0YSh3OxKAWUfbqYfnFu6AqGIscSLTEC2DUR4Et5bdR51hu5PZizKl/F9wz6X0UuApNjye1FbtFbH4v4IyCuBY4VVgTTIuGGqp8r8MdA2cC2cNSEu60Uz85tmsVsqOw47TDFyd4i7bCbXRSoLK3QUt4XBDShj97NZSsdf6eK0yPojOmtMTFbhoZOmhe9QQdgu4MT7kt6oGxOow82bhY3pVJpMOgyu/iRIg0GT74Sk6Y/khSNxh8Iuh2xhslCORf5F/PFYQaPgTdx27ywVdxkNfWhyiZeEpa2ZrPZu9oBlsuJRDMWhsfuEsouY1X4GS8QFyEFjce0PNSswRQmNSRJ3ubnr7q+P7i87CNcYDsYuK7b7dLSmZhmMdqm8XY0vOAB+gdcb+Ghhak6uLQkYUDSDnCTkMRuqe7Lw8MmUCkSERcw6MMtxWIK6ti27YOVvRfOk7uxzl6s/VTs2k0zlKUOjuEMehHf+rnAf/glL1TRRSDsPSYCa2PtHATCWJC+rea7nRdu1yWIETJD7JP8HCtlpMeQPWqaJmoiGbQqTyMXyS9p1Z7Ihq1pVoMW9wV9HVg1qyfVnZq8OGwWMxm4bdFF6wKwLuZS08ZMRPvhyk749i6V9qq+d9eEJtxy2hOsYnHlwLLJR+GkB7BFImxaLQ3/dc10kIgkSarm8V3wYywLY3CxoCkvSdv54zyWQCJGBeIINhRFTAwFBu7IGDUYhmEotgMhSB48y7Imk3hvAQhJLANh5/ZzCLsZlMbk1rnIf1fZe0vYA20nZb65srkw56mwXc0yd+oqVUVFzrg0QqtxHYdWpB8/OT4QRVVmhaWkwg6p7WBtHorUCYbssNpHmTzVqJojQcOr2cBCSZV0L4ExsWj0F0yTujw42StmMGckUR+wzqUvrW7o2fvLTzaBTdpsZEPS9xhl2tqYdDcusyd03YQjd+WBKoCwPRaHYUOROv3/YyJ9fEzLd3G1CRFhFa+NlOFi9EQTUZJ7NkzRxEMhOHDJWjEVkwyd3MNTvCnwVNdN9B3SNoZ+pJ73zsgC9rhwVEDQObILVigsnbTObW0cjezHrg2VzWBvoGwuufRKIw+Cm7hGlOfA7Ii/KM89UWvE+inQWv922GOhYVlhubSjIhlSN21TxOgRdBgCpNsGLpTSQZdc2FCil+CLBPoUXwvUyYcEVw8tVZ7Omzm6EZZDByG0CxiUJFP1/4eys9l7CZtqmmPKZti5IInPUoV3fNXGtjgIuBFOV40GzpcT7FjkIFkbK3upAYcMxeCZqacMI/ZYYELXyT8gRPgV5unkMdqOvNgrIm2MNQLYW4WtX0XZWdZW5lZth4kj03Ql+GkEnlFH6fd5VWu0JxiFtGnbBNCyhfoFj8APP8BUlkAS1TJ0ZAz1oYED1WogaAOfE+Lsp/BSmD4FJXgfaFk2DIE8Nyn3L8QB1wSWYBw55JwpUtjFX0XZFHQYdmcT132MPFhhyZ71nqtU0hNkDEIGJZuiGIJEFgKVosBkqeswUVZrtVYVrti4Zt9ns9nQ/DuxaANXuWqtlgFf+Nrg9TP6rVqtke81fDuEnarocmRCLOSojeDtf6vsI3ato73GUDajTWRNz2uS5y+7koregWIGxCb1ViQr4A2/70AAIggQutXIYG8BDPZQN4d0CqR8P9pXV9/+9TWO945uTyamYdrOFc6mpv0f3s4ntI0rj+OL2RE4q4OhLYXYh8o6DNRV2U3RpQF5TDdxuhPNKWzJBmTsCW724INgL4MWhT1o6GCJGWUXpE7mMGvFEY61Mp5idhywghqoqTSwCONUB4FX3S1sahu2xiBYGtjf782MLNnynxCnvxkZWfNkw2e+7/t+782bN9OdAWdw+gaAz1YqE2jo773x9l+GsYUE1oNDNm0Ce7Dvp1X2UdzeI8o+FfeVg0Z0+MqwC/s3VyGpcOo1qfYHpntp4ucTE+93yfb2bcjfVsFxHj8uZDKZEok4hIyRrtfrYl0UU6lFPZWqC6sr9Ux0tSRC1NOwyXC8Lst1eTluf7MwE92qbm1FQfwTn/z6yb/9XnIFss8e8APcfa9D2e1JOscouwft7k6890x5oZ0G2iOy+I3f3/3oEjZdTnuF/msL163vN6ZnoquCsJqtZFcLZkEoZ4UVeRmhpYGglkppsOm6zmlckOM4XcJNkjhubU2MJMwVeMmatIafLC4ucouczum4p0joslBt7e8/aGbvVaYnbjz+4Uq/e0tYRwN53spun4SfnbBS7hEr6bZs70sk3x575cepD+euftI2DOi0VIiDTmBSPAN+EI0lIqU4oJUjMSFSkxuNmhCRU0BTCnPh4NjYWBj2cFjBGFMkBY8kpSSGaMYSppkoafip4kRYaQeW+lZsPv9qe/v+g/J0wizc+eiXl33u3Y19h67znqOyD6YyHK/sfk837K4BqjM2k7Zn+51Vl7zed354+71LjgVDc1XBxi07HRUIY9BuSufWQLCSpDfi1fkq4JYTXy6J8FFwLAiwCTZVVfPtMPIGieRSVBAScV1VDfJ5COI/8AqQsIsajP786S6BbRZz6/Vbd2av9w+SCcDuXY2vIxs5k7I7F+Tuwt7fMUjVI474+aS7er3f/+cnb2CKgIvSTtwYjUTMJXBguS6mNE0DyCDWcBjQhiVOS8efPq8243KtGZEVwOsgDuRD+UAAWYYommIwjFyuWIo9iyZkCeDDUSrkBo1BUSyhzvDS89b9nZ2d3fm4ZVnF5TuFXw2Dh+DAx+GO+snKPst41C/c6QxnUvbxIj/cWB5pOrtF77GvaaIRfTh79f3paKxaNc1yVBaRMLcmJUGvweB3QfQGJ0C+anDj6XOzZkaqkYbK8wwFEaKBcYhFjiwLv9M0wM7xxXgZWG9wqqoo+Q7WUByK0Pb7AGUB7O0ff9zZrcqWsZ4rFm7N/g782pU2XqSxB7UHTh4bOdvon6PnnsoeeQnYJ/nHEdrO5WNSJa7PjU4XwIvvf9eYj4lcEFs5TuLaiIl2IegAeaNq8VjVjMSqDZUxUMQUbizFsmwAXiyBzfNGvJwtm3DigsEwwA7gZ0wAqDMoaxqEzR6GbXDJ3N+XRzMfDE4NEdTESB71uRMZTlT2y83Vea3KPpyoeJ2hEjDta3NPZrJNXL9mu7E1LzoKVtEc8gHEEUJEQJCm80oYD0mavDQfnY/FFeAHEBkKDlJIm8CGssBans/G4hq0nGNhFcyC4a2cUdTqdd2AgwaDJaEisIwLe79Zkje4XE5/vHrRO+XcMObc4kg8+1yU3d1gvh5l+7uV7SWPxUHX9g5/MPu4MLra/Gr7X9v/3P7vvKYSg2VYCuu7ba8gSxpUSfMBMJaxMJwMKW0mYpVvapLB8MSisRzr0gbYavrLebAQBZIV5WGABzc2imKpIEAOWdIM/I5b2oG9vb8lxDWVyRUzM+PDNmmia9jcG3jPU9kn5tme3vESyva7iSLORYHf+30+r9d3fXb01uxdc2935/vvF3aqWxKQxkrOsra7UhQ6yCbQAeJ0QA0G0WakJJeOfPMsFpeYnIPapv0ClQ3nSPt6PiKSzPCvD+lNEHVSLMUq9zCyglwEdTusQdlPCexWOSYaoHljZebuu4MD9kBUnz0fe3BgcGDonJR94QzKJgvsdu2HaJ+ubAJ60uM+q4gsk/zuW4XRucsXl5u7C3/708LCXlU3KMcRSPsVogltQB1Adw4F1DGCG/ITLb0UWeLQRegvaNxD4NkkqaMoNb20gXaNrMGrc0lZmMneJqwh7SlHdKMtbUsyiY20tkrrPGMYueWZlWtTYNkX7FGRwUdup/2nVPbRvRv26Z6NFyzJ4xn8dnmvb/LabGHl8h8+rv9vf+EmgQ11HJI39sULhP0F+ggFdgsUgBkP2s2rCjgJNHoQQW1RBVm7wka/yQNuOh9WgmkNHCcYfpinLUAdiYKqK9OriUQhkYiVy4kGcW04OaDsmm0jTdHiWYax6p/94zLAhozB9WwX9asqe6An7F6ejet0d+79L61s2CbtR2G4A4e+yY8zmbvj4+N3t1oLNz+9udBqAmxw1IANm7YTC0bVG3VRk1QDdQy0CetgUFGBNIVtI9SGEIENJsLwSpzL24UUhs99K5rRSgVyy0RJ1NfWimtiqQpta8DOXViEvYuwazrApmhLFD7/7dQQVHHU86PBR4/aHclXVXav472VfUTVh2if7tnYMCLtSRt1v9fnG37zs0w9I3y+HN0jsPdr4Jub4Bkv0EZIwgw+qpvRaehTAqy19ZyVUyUAia8xSAvBZYAxFcB2Ed7iN/gG1A9MHzk4O4ZeisGXhXgKzpVB6gdjJDUdYMN/gISEV2p7LmxIvmlLL2Qu9k+Rkew+vGYz1Hduyu5R4ljP9rTl3Y8/jjaRpyYj6CKetmP7fe/MzRTG68uZW9m9HbLubK2hbiJsligbdAydE1mw7RbUKUTktVzOULggCS2ohkKOQqGtA4kja0U2dUOCRF3lrWI8Fo0KpbqObaIdFqYm+TyDsP/YCTtlw5bMzFtT9nUDSEYGnXk656PsXrCP8ewRV9YjB8L2e7xnDz9Rtt8xHWwf52ZK6zmjHq1Ut/FRbLstWd3kaaeBZLFvopfABLIVfDhN5fa9SjQSTyUh95MI77E8ZXdmDJbBlA9dh0nDGTPA26HPo8cFQK0bOQt7NODvPDF3PCXwD7CDz1pJG3arplk8VCZLKmXeHLngwMZpfu6kqBPGRtxZDa+k7MPJH2HdkQb6O+ao+U/fPD6Pz9OeXuWb9IOyV3I8L5XK1e2FBYT9QAEuNHauiUwNPTL/rBxLREwzkhCiWTJGZYprxWSSdC4DFAkGWjawEezN8OrS1xJjj49oS1WzgV6Cv9llweWxSWUopwPJAOzW7oLj2fBH+ORKZrx/wJ4H5Uh68GDNlm5ln35PzWnDVb17kB7nRwdtv6fr+ZKTp+0eVDZ5YIPffhiJF2AvWzzN6DEXdg1g0wgbbAFx1cyaLOpSEUNP1eUSJBNo3ynIQwwHtR2YjgBtRqnV8jwqPJDXZE0xGOyJMjTJICmmXRw7kCHoWrqwWy3JIj2n4nJhfMSeLzI0dHDB99ASOR1rmPW9GuyewnY2h7U9A/CAtcfvjG4fu9uTjn3kyX5eeyzKQ5TN0Na62dzdAdjbLVOyQHhk/A6BcRuAy/ZZDOhx6+lSRBDAvEG+B7CJYKHTw/B5bSONvXPgDd6uNRrphqbkCV7MwFnnCyH0qQDlwLZtBLvxBPbcyJA7mE2u1CDtw6s/Haxn1nf+ym6TJtOjDrZORz55x23S63dtBPs3to3QvCHv7duwmwQ22gg6A8X+n7nzCW3jyuM41e4I5Oqg0l2Xrn2IMwezmCFsl0A2C9OhiZPsTvEp7MXgIk0xySFQL+zBcZAJxSLCCbIh4HhWsCJSMQlGxrMIFIMctIWERgNBmFAfBEahOZTYUITBFxv6fr/fe29GtiS7adytJMuu3djw0Vff9/s372GhCW8QR7D10gLgqZGJqZRjAEPwGyhF9XPYdnotDbCZxi1nqFqpfL+0dhqsncGGwFAqG3xE82A36ikILQk2zo7ILeR6vE2g9kn7uJSNlAeEsg+yhoJH2we/WiQcVfmZlWgjqiphpxsNAZs5NijbVFhQolOqomB5BIlDgOKU1uOziSF4McjcFQVtGNdHgK1RwcTQ7ORQkqy930Brl28FHRdI4dm7u1uNenXWsRD23MVYVw+/3hSV/bBH7v7UPBJ/yIXrRxgs7lj1I9otdN1Z2eLnUVXOH/f1qUEJO1lnps1g5+pDFnBBG2EJIS9BI08FUxjDsNOJRJrFG2giuiKV/V/2zNbHGsHGmIPBd12IbtjCh5VBZZ9nE2yWQW7Vq8W4zWG/x2AP9GDM500y7NuMMuJd8vHzYHeq9flY76v6BTs+SOEAmyu7jy2Zf0TYiuHk6xuvH9y8uZmrv4KOAEhbwfLIAm+uwAcsguxh1yiZ1DSqoHDPZvJnqBjsWbARELsGzg2VKVMD2KZveUQXYXfNg52Lx+/A8lAqQOiHypabAvQIG4kcvMb3GJXdpsl+uGfTz1lQwpUNZ3WFB1mczcIFw7HrXxHsStpSuBNjKeqGwO31szRoMjIP4cUqWiCBPdSqLAhBDEvBtBLqr+wlMfB9gXbkEzbWsxF2DmBXconZ+BDAnp//Q4yPU/qikWYbkaJ+Q2V7u58dehptS9SdHkF+LnkUejQUjcDQd2jwIktqoIll18tbD24+2NzZANgmwTb1L3X/zUQHV7CErUB6guoUyoYqOIu3WTRS0wA28IUAHMqATPem4TcRiC0hf5Swt3/IZRIjCWY7mcXn/+iRekYf8ZQdeEvK9sE+JmWHPWXDCYvhcOjkxWvzTx0WNiQrZRaO3NzcKdcsBescOkQPHLJu+m9AENNF6mxxYRu8MrKXTCFshRJKcH7N7FeaUXNlaz7YG7nMnaVZluEnPn7+VxHwyeoqhx2JtNiX4ViUHfbuLW+dohFUNoYjapBPekf71PDJ9/4+n3cs10lNjO2wtEbC1ikuNpl9ABa0ZyiCoEABH6jc1HSfsiEzNKFEmGYLpFgLKeAzyEaalA2wb7Dfwz17eyPOYK8NWe76lcKpSBc0eKWP0MxwG2W3Yt06rT8K7OCRyh/qkZStRv3RSPjk3VtzeRY728XKSH2Lw6ZGouwp+m4aaNqk/qFCK5zn2YaCNmLu2TavulKYgr8JkxlzXzRyQ9M92F/FS7NTSwx26tb01d4IzGdj7BdpUnYg8LM2PWux8W3nZmObLm9YxtOtn+lzlHs2lPyg4/shwjaSxWJ8Y/vBg93tcs3gXVuvgQuY2DKHqDXqsBBnU66PhNUE2lgnUailplDX3dwHWsFXitFmP7LyOYizd8qpUurbpZdZd/na5AnYbDUg0pqI1HVv4P8Mu1nZ3khxi2dm2J6yadD7i+G5Uta10/FUqryDsJ+YBk1/KBy0QrMKBuAG4swWpJez1EdH1TJ3McjMDf7voV2sSzkjbvqSInOKs5tgZ5a+Xcta2cKtuyqLRroCMvbzVshApP2278cOO3xQ2eH2z7A8RlWRQgL00PXHc5msm1xLZVLlxuYuwtaoQw5vfsOXX8MKaGjovLRoEnBCiXaBRe09XD4VkQsJyvuUTS6FyrZzDYKdmhrJuO7T1VtfMNaRLq7sCCo70GK35g4bZf8alK1SBhmk0A+W3FPP59azbnpptrS+QbBzCz7YArPvs6Hw6ScErkiWcOe6BtokbN0TtPikC2krFORYdqqxjbCLE7O2m83PDf+lC6IRXCAfiqyGn2fQ+2tRdks1B/mFqfStKNoIKTsaCsVCn04vFhw38c3s7UQd1ykGG3DhMJ5JWTrdNRFNaL4k0HMJ/pkvoKR+6SIm/x8EZl4DN2/oex7s4tR40spmM3OPT73b2xsTC2TTeZkt4pFfTtk+abdTdlDadZCRfgcyRzVEjZpQLHb2/srcU3e2ksgnVqtQD9rI2YaMRnhIIRY1RdM1XdF5ICLUyiMNj7ZBXLmwIRLR8cNEh9dFuGiQtFl+T7AnpuIsynbW55avRmCDYbCRh70eblgzDxxp0OZwg0O/7R2d8hNgexPaHT1b5dTxSFzwDxQ7g33i9yvjeTcxMlvKpOoNBvsHgL1nYvdA2Ei/eP8DZ+Bt+uQpgzoSsslfKunZpgaxDMtf4L2hiwcWU8BF9iyHYN8rr5Ycw3WKixdP0F6VUIvyS7u1ttudJNH6zIMD95/i2SToQz0b4cIumO8A7D5UNoMei6l/XhzOZIfia3dKiUplc3fr+9wM4tJlMAL6ZJA1eZchMx+pJNPmU6x0E8VCih3pXQBvCo2cBJ4MoWyC3Xg2lshmDffl+MqfVDpR4mHPgF/ZPTTO2k7bx69sz5XbKTsotxPAL7H+hMpW+8KxWCh8tjCesu3EUqqUqWy83n3dYLANrDXL7NzUEJXm5eumWC6x5EHfMgVdA18qLF0plHeyIF3nv0cHYYOyFcuAYYY903DSDPZmoxyH7Mq5M7F4iZ9Kw1gfUHZPW20fv7KlPzQrW+y94/Ns3ocUysaxSrjIY/B3c1MZ9/bIaqZUrPx79/X2kyR0vjU0i4M5JNb8TZ7GGBTwKaYiA0G9Sdn0X+QbGnkQvGrwDfzX8Epw2DuVZDZrubdXJ5YHYzFm2rTV3EN+qrT/bLzAoRezv5GyW11iEG5RxlblakgqjuL6F/R7tphfgA57CH/EsnX2J9RLy7fWXSc+spyB1tgmgw1FaA1ogwNrVBHhDDWO2guWZUTXZCN+9JqIYMQT9CKxRoULg7UAsPe2q7ZrGFZi4trzS6FIVy/fNjvGQXvnWx1F2v7zxI6s7GCbMK9p6Nr3UxF10CZ1TZ4dFg0H3pWnWJsZyuD9K8tPs8mR4cnJYv315lYujfNnTIj9VIyC0il+hd7Cw5B9+QnEGTzT4XPXQtiCssTt9TP56OvCq/rOHoP9L9N08quffX5u+mrkXUzTWfDXS3uEEuwA5PAdQ5LWp+R1PHyzNex20yBiswauZOrrqqLUF/SGRhA2po5B2qSRLoD67vH8xWw29XFhsrCxvbndqBkw56EgCQYaxK10vulUnvY5jYnVFAUG6f3FPk2DwRLeoITh1xcM9j8Bdj61858vTWd9/LPLZ87dPwtVP5Y5cn2DowS8rec65jYHT8qLdLy/AWwxrUDWHeV7Ssl6n0/ZUT4FAdjhIxT6dHKlkHVL8fFCaqP6pLERh6EaS4ylYkG1PWWRpuDiyJWt+9NKErSm0EPTFvCqBt6b7O9/oTBlV6uJAjYg88XRMxfOXP7krhrBcx5pE/6BIG07FyDkrfsIv7Syw2LTbbyuQO4H2KzsIFRH6JI+2CswHBoY/G5lscQyt0o1ValUyuVVBwYRXlgGVqFp3ro9b5kX6ry0RAmMomH8QeG1TDv7tYWZdLqWPp1MztjwZ2AobS9ZrRfLYwWbJTSPLp/rvnD+o8fXVTxRjI569PZllRv9HR124A1ht2XdpGzcBDoqtnHd79lRb7hHFU2Is9OLq3nXSddq8Yl7z54twUBBv4Uj2aa2P0dvo2zRD8BKN4kawg7s9fLiFQpbs2dO19biX1cqq+tJ24A/Ys5UHz0afVTIu5nxy6Pd3R9ceP/8/PUwnd+GLV7JGS/17RSSvDXY7WbchbJFFcS7hw96djCIs5U0gkYNttDJv80PJxxLs5Pp/90bfTYCsEF0zkx67bTJB8sOv8nihwlRucnx81dK4zlNv7Jgz6Rra9UqXOy+lobL+/IjY4sri+tOsnjv89Hu33R/cP7984/vXg3h6WK435yPdo93otjxKvsQzw5KaUf9OxQ3KbvpchzocsLvPTE5PJcBvC+XxqdGAbbFXMR+lap+XTOpc3sU2rzeZPqqT6LfI98JdLkpi3acZK1a+SaeSNpOfvzR9PLyZD4+NnZv9Mon3d3nzvz2o+7p6ydCzEcG4KOn14e7t8028W8XdpvLkpo9u0nYTcom1lH/XDcUWUPqSfXU9I+8XV1IW3kWv/bWUJdEugyb6xJvqQ0h3TqXSkow+GAvScx2k9n2YfRlCkqSEiyLwwb2xYaJw4ASKTtJpkI1yUCphoBbDKsPY+yoZIQO1kJxs136EBCXivjUzkDZp7J7zvnfe3Pjx9R2d/Z/Q4z58ON3f/f8z/e5vpLBjL7lPz+P9n+PGoPk3NzepCS9gNz4bitQ71cNyJrPr7FRKQhBIfUGrqRK/2hybm748q9+PfLXxXx+c2MoYTab3QLO+BVu32kDbqM7W1P/9KOBfm5mH6VnqzKbZaq2GWr6iA58anxZ4zVjtpEJkhdLpZW56SfT098vx0bnn4Tnc/FiPJkrkPJHYYP3WKo7UBdeYxeJEmcI26VUOh4fWx6+/svfrsTK+bXq5lbCg33szB6/1+tbHbnTY/kFpv2FtAmFlvr5pv9HZu+X2cZ9xK5pJyRSmMRm5CZetxPUoaauiaWBCKA9Pf0GIjWzAAAgAElEQVTNcuzB/Pz4WHxvzRkIUxqCzvH3XoCr/pRAjfjMnxLoxuLUsbHl0cTduyXEOjuzEfG5eTPPCc2Cz+v1PJ242EOtby2tId046rqxvT/TBrmf29ZalZ1VsdUNqshu05itJZXUiWwmRGiduzmx5P3qBkN7uTQ6d6+4nryakejyl+zMEXVwMzzellnH7BreMqbowAK0p7+5G4lE8tuPstnso+1JHwhtnuPcbg6FiWfqzE0jttZBu53Z7uqAj/8NtzkN5yN7MByVOKI2Ng8aNG3EoO6M1Ngf01iDwaBVBRt+U8+l22YvNnCJAdqfLZeiK/HKWEpGB4kidKWDdEXtW1Jz4Kl+T82Ixw2VqS/sqtAl95BGErAzA19xwsJO8c2D8vB2vLqzA2hvRvyC2Syam3k3zzd7/C4/P3X/ovU0eaMoJ43NCKK0P/2s9ffFnaslPb0L2LXNkQGuSWrFJ8K6FWu1OOQYARHSc6vD5+jtLfUvxsqb45/NlcqLSawBkCkXR2KBlzq40YmHL6lp8GE75uSoKdqUfhlmYJPXScfsbhJHkmJyUm5bQJ6e24gmc9VHM4+q2Z3ksM8HqrYgcjwncm7e4/K6zE8nLvWElOFLiuRmSFlaa8d/Afa7lCUdoHabwmyDVZ81T/TGCrR2djLxPtR09sVTl2MoMbmVrG7my4v3lkulsTmqGwhjpiQVhtawlpgRw55VsnAalYwc5lkKk7VJ+ZeU5YDJU1LNCU4uABVtBnZ4biNfzSWxb8xM9fldnx/ABqx5DtgtCgLKbt/UmY/aQtSoIdSOs5TbGeCWOmq/C8m1t3LHTYI6GEhgO6Se2fvRxvQzRBkQx3miXROrLq8/EZ3cyO6ALhAdXSlfx1pneQHzUhsVZkv11LZLrG66EZUVifLRGmWlGAxMxFQmo5nodAkoxMZwe4CVZ8NPhkdYLgZKyfhWvrozs1XGFkkP7vq9IEc6OU4URZuJA9AF0ExcwtTEzRANYMdBszjcl2W26qn9LmjXwDa8B9ZWo35IVpD59KzGeqyN5MWmSG8IyH32youRJcDaDKoATsrLzWxEy49L9+YlaeHZszCLEkoBnddPYsqy4p/CziF4TpSGOvCEVKD631SmdnLoB0hKpNKuOG0DLBNTKgDYb3byBHY0MRSJJDwnHR4EWxQFm8lmQmHCA7kdLnfHHy8oA8JpbrVFTXCoRc5qsB8HbPZe7shIulZBesgrmjXJqN2m6Cb6pHmDGo0HsI09XXcmOlZ9OHDqcqIMusC/szm4mP9xozRW6AawqULvEGZLWigdywmQ3AAwNSkBvBHq3MOcE4whuyI1FHIzo0YpuZZZ4wyJmP0ml3+FYJcGL3cCiT8EsDs7ed4mmkw2oLfY3MyhHnjSuwQ7JdsiQxas/T2hqoH7mW05Btjq+zldAdgRevZhySN1498MVmNdTExFm2XDhkLWrlu3V0Eaev3AI/NQeQZUgWoVW5uVS88LQN0FdMiptJTqmB2QWC0BqXB2Wcr83kndz6ie3fmwuF7MEdhMdgdI5ihQ485ppw4PWKYKwHdLgUL11afZnZl8YpBz94HM8PsE7NHNm3iTzQaSpJmDGw+Kide1NHGzKaQMLbTorcr9sB9HitQz21pfvms9itlaiwvNfAnWIjX1q6kd5Ue78cKLEYDa4XXBbmQ2exLDyerM2nZsawY7FyUL9u4FVjNAxJbrtREiqkRhXOoHVUjl0pVivJLDzhjOdLG4VnFiTTuBrcZ6JNUzgqoLI/YbmYoj5Uzy1dfZnc181GPr6+vjBI/HzFNLdDdS2wQ7pQhbJdeMHhO+44eu9laLZr+37vO86qzLt6x6ZtcZf1aD9Shm1zXJMepG7dXFxNSFwvpc1537Uz7HB16fQKax6EuMrixu5CcfT67tVGOxeKa72z4tywGlVPqANhIIFFi3ONT7EOzK+nffrVewDcNf/rZeISmi+MBZAxJJ9bNiUSmoOZnMPGrxpCeGU/FXezvA7CFfs8nEiwL8SZ0iwG1CuG0otoHYHIeyxOXwukcunQuF9rF6H7ePtw4y22p4G7P1Xba0DwWPZHaT9eyl+6t+h8Pv84BeZeY7O0WfKxKNRrCl8I/Z7Kd5AlutPNovsyWlfJQqqVnXl0LKmavEi3FsMQIP0kxiM4iVxaJjrOpGllLV5DimS2BLmIXw+OKrvezOo42o3yPgdUZgixzsjozdvAnkNlg4zc2ol5x0rZ45y2b7nmi1HLFa33poi6uFb/VOO+NPMpudBOoDEDwSa2OT8cKtkVUPMMQFtAbbAf63Tt7nHRjoHUoM+iM/fv6Hr/PFVHc3XOl2FhnHOqS63ZH4nqk6GbtlUkFgY0xXKuk03JDXElOnaWuUlJ6J+GGZBXwzuXg1hVg/sz979mS5n7lFRoe8icFBRBvOPy2TSRUmiLQAOyVslB+4lm5fbLLoRinXSRPFLXg8WsPBKeI3qDpQa46lw9VrtS8iWYZBttTQjc7N0mQ813Xr/pQHNnafIHjgjwewBYFDsHuHPINm/+Te68/38v1OLL2Vw42BwnhKYmUxWmSMKSMB51qFga2iCvR+mE6jIpKRVA0bO3sFNKSpNFUmbqeS8WqBrPqF8JN7scnH5e2ZanK415UQzAxnERQR3B77EGubDY0bBJvngCgn/U9/19N6wkJJUyzhgRp4qV7B0DHFNpPZCtSqMoEp7FYiqwq43oTXjfVgrVuCwZbz54MALTPIa0VPbSBAQFY7XCBAOA7/eKA2qrF+r3cIKCUg2K/XYtsANlWMIgMLMomKRs16QSFSyFTXAWzKSWBoF6jbJ+tQx96lGD4Z6lgnKx4TjBrgpXCvuImnkbWCKT++cWNyOHkvHh1wCSJiqy2TspTvOJNJ9PgdHzpWv/0N8nJ2dneWoEawFWM+tB/OkOpXqV+n2R1HQLIuLkHmE0UMlXhW3cLnlfGF9NquYRewbjnf0tDejqy21sBuOndlYsrjQmVPUHwPIn4F2P0uH1y/guCaXHv9+l9bGwD2AhZGp/srV5mclWQmFPAL6B9Xq5WKkz1P1jdICuwPKlGzRUQbtG92DsaruQw8M8+who9Q+8r5TLyYK2C4NyzPJ8uR3q8GIrFk8sGA16Phe9iyEcl9oIu7R640tZ6Y3d2dnVUAPjE7i49/ktJapwc6sCfmaS7YQKsFYAu2BPF2Hrh6Poi3Fjoagtq38Ca2gNK7cOAHW1oaGvA9sNoot6/J0PPRDx1ukNU+gS5JQSSwRR62f8HnG+wUhE4E+++vZ7byOTBqFuR/Vtb3cgVSiiV2rwiM8Vw1DZo0aW5KskO30se2IBWY1JDZp+DaqGSYPLHbuwnsXDpVmJ/PbRavUl+dQCaZjw7dgN05tjjaewTYtj44VLBFAZVAT8eLntbZBriI6X/dhX/7ZcNLwoEweandGrQjqDvgJbrjvviTdnyh+/oJPviEvjl8nTp16hrcrl37+NqXX3586tR/KDu/0DayKw4PqIK+aF4WJCjopSBciielAa/cRusayQgqUweEBj8kO2ZxEEJe2ViOI4ztWYhWVibrrUaBeF1ZxobInYeCRaaUyKX2Yg0rcLR9kMcpflDxOqCHeQvLhj6F9Jx7ZyQ5sePk3CvN1R+M9M2Z3z3nzuj47p/vXr979/r1X332y9//8Ss//ntiFzAGAUHgbpbAZlG+UST97tD+zNHL2sl+U+GePVvWqwfglTTTGyTLTHYkCvyw2CHJt/GpAbul2go3QFjb6Y99OVV5PpIv64qdKBD9jS+nFkX83fu2OJ8roAhxcq0+nxgLxRLR/USkP+A515B327NB/zB///Zfv/7s54tPniwuPlq8ffv24veL0B9BI3ft9qT7Qbs/gUY6s32R/WL7/ewTuO1K0vYuefTba7+59sW3oaGroYDPz7ogI3NjBuzGxR6iJsCbcfCOQGK6dPTDl/X9mmJ/9le9Kiwha1qzhVbbwtWMPqOaw+tNydoGKf1HYKsqglYs71f/rg4W/gbZjl5E7aYn1jiUeTkvFlVw7XIZf6new7VqjblEJOi+d286AQp3Eey2jLAQd+PS69Uh11fXfre7tAlWLG62ipvFVhE63F1szTMdG5P7YPvpzSdKYLkSjh4fHx8//kvgKri1D2Ip8GbwbYhbUbaBM9DGHM3h4D3BxMlPRz+s1fdLBayCKCwpxCGx0qp90IRt5/q0edgLj8ylDeggHX2Sog5a1bM5UuUWr4PQ8zo5CLh28AeCz/UJujqoFoqC+Bx25UCzVJqLRgNe943YvZiLvRQ2Wei22XCeDPzji2P4hnpJLxEzNx9kTEPrtPe1H6FZVoFmwBZuFbBv5u5FesGt4Uj0gEajejCYJKCE4AgMv4YvlKjXXr5une6XZAUcb4QUXqDL/fTSSBQTkGFhK3O8jS/SNWmIOCC6Xn5O1qJoPW2sjauXD3Rd1JdBl+l5BPwbmK1Lgg56/2h7T8g/B9g1rXaymgjwfu8NYH05bBZ1EOTPCTlw4pvHOVE81A7RNNIOtRVoWtjqK6TTTXil0yxj4lqnocU1MgxDN9tKexQOh+NdBm8z8M0GjA2wU6GSSUDKAjkMw+Cnps6M68QMejaFDaICe6I/Wi9NrLV+3G+0+vS8BMc6dcge0y8xIUEh2dyDlF5S8RV6AkDpE4WyjukMqU8sjZD8vazrgoA1GYfNYJDGf+NyOVdQseBfOfM116OU4s2TpwmQD7fT7/P5LoftxiiKZZyQvUeif9gTSw3tkHDTsIfxdsZW4pQu6W+yXmGQoHVDmICTEIURPgibA7oN/7cLN30xjjsGzdAqwtx0ZAzTRZBoyMNwagTfBuJoCBsVnPXAl3VFoqcNo356sn9aazZlztQJu3k+ERJJc+pTJaCNjj9s1hvnlKJYLgtCuSyKYqOsCcZBvWqUy/VqWR4fLEBmNMDRH4XgRhbzWBBNVY8PxD9xhZLWPLkVIrBtPh//LtpkxJIlV9YJ20AoEt0R9hoNjbgzstZMcGcb3cTP9ezOXjHBhtsU49206WvnWZzsAMMA1glETZwBImknYY3ZGBC3gJPcjPUEIvuVzH+wgN+W0ZRxLushZ6/MNWlrJQRroi2L8/ONEYUbpgvUVKGFarVaB4/e2tqqHmiNQ82Y1JrKuFKEzH7ADFIGcJVPb8oEtqQLekFqaLnpK0GXxwe+4ON5h+cSY+FgZFknAQ4hd2Q6UwHY8IVXAGj8TSrUUcP0qS6X74IdN1053vbZFPRU3GptS4VTxLXpfki1G7w5hTJyOr86lsDIzuPGAw+XQ1DvbJQy6ombRIFOJ8sExqKVnaer0f7o6laO1HK3k/r6NNqwxBuzPlVdzh9UIS0ZJDVBMQrHK/hgOgQr4a1hGFqp2ZKT2WyrIfaR/24wTLP7wUK+KQFsRVE3hfJSTqgL0bEAgGaQte8S2IyHHorgHW7w7gBISWRHaBCdvdTQw9Gt20IDDxgglVrHtr6eajfaoeFrdIDjCw0Vuz69GkkE3ObndOJFAkSzLdigLG4yYeKJqEAk+s970VAgEFrdr0gkGaSXjNnp9ajmT9hJIq8WlhoHBzmZVkcsyFIfxlU5HQID6KBCtWZxI5keXkgvNA1RJrJPTkPCSC4uSVjsD1eyKxks1BrpdzlZ+HA2nuffLdoOejCylkGOALSnM+UGYZ0yoIGb4ZRFuzmR0V1haQURGpwvQc0ZgDy5PnmJrWOHtk7ffbD+htWN0/r+6ljI5eDRHCB2TqeTPc+AdczrDUSjO8Ggi+fZxOr8EkQW5vITZ+9cn03KIBLayohYFfKSDOmkrus1vVYDxNSKrZa8MbuQzmbTCwutQyNfgEOEs64x4aSmCZtTd/eiWOV1KMDanDEK24HO+3brht31wSEQZImUAG0DD2dgbXSjNuKWyxPiQFrrng+1MENgvph88W6bxE4atSrQ/zd0shfq9To6TSQEfk1g8x72QqOwQ5FIEHMKngcfF0cIbFM/FFy9Nq/4I6shELupkihURLFcB402DmutFsQiWID11XA6m36VfJVcyALt2ZLRKBZIEaOeYVK6jpMw0sG650pht7L64NZob7+LceLiKoOf89wPyLS9+gxs1uOw+WCeHItmRFCuFNFbI/WWfmhxy7Hb+kEkHjYUNkI0sX5Hblu4/e4i8O0dtE52QD2T2Yk+jeCik8eHKwvWzHPud/F6vX5X/xBJ4HifL9YfzeSfE9rktK1SLHI9nRVteo4GRECo1rfmK6Vcs9XaSM7OgjOnZxFxNguoySi9YUzW+gp262wkjUZ0SR23DygFaSlz60Fv79Ug7wPYMSf6heNC2Mw5sDFXsNliEAPONUpa1xxnzoowZaJWkPt4d8TXmSC7JMTy4XP54u7o6A3VE6pAwDoWHRsKwoTI+tAIbYyeLoDt93tCQTdDWPsggk3s7S6TNdRB/GcROoFtna/BXzRiTblcdV44bRSVcdSLNNAGl55NppFxMkmwD6c31l80+2R7j3lNA571VYoNUR0fHCjIm3uJB6O9Hw25eF8sdiMWc13kDRA3dVifgQ1BicPmdSUI7dLhDNr/Zj7AGHOKW7dmQDobdltqvfNqikwJJBgJm2OjkolFftbv9EOQYSOwPT6gzQNs5jzz+r1eR8Dtd/h58m4mGMksjRQ4UoaZKxp5xaqDQSsFADOEPV8vgmyMZ7/PLiQXkhtvwE6ant0sylyPWYmVnD9QyhkJ7mVp6caV0d7R3hDv98V2gDV4tuf8D3iBsXiuwWFz2JyhsdW5XHNt7c7andqdMzZBbxN33rKbeMfcfx+buf/w/szMw7M2NfXwIWb8p9ORoZAL4lG/34auwPhQ9Pjug7HbyCkonPP9fnocBIam9zaXcR1qfDBfzsu02CRHqwXQGpUA+6Chjr8aBtZZEI3kxkYbdpbATsNwtqTpAJtIDwkisVDdUjm/rMrS13vR0Su9ox8FQahjREbw4Htv0vBWmPK9eNEDBFpAu96UN16bdmT2o9evO0+9PMeYqU+nPp6i9vFUZwj2KbWbln0Owy9vft6xiYmJtbVmhbD2Q2SEyTgEIfjZeIfjItgoJRAgenk/vBlY867/s3Y+oW3kVxwfGOUoXVRm6IIuLcEXRW0F8ohd0cSaqbZVsApBRlDFnkNmhZpaCZajXYSF16DakVgZOQbHiv9Uoqj1oaJLAmGdgL0OAdE6oeBYBxtcWB90ML304mNR33u/30iyNk7sdX4zlmeUyNifefPe973fb34/TZ/YyxeWrr2+FdrdXcI+MnM6PrZ+GM5wWzzavXVrLYV0k6lsL+xkhmAv7+IkwyA+sGaFHcg4g+iDkQdL+Xwx50LYbhUcNbFW/KJoPTtr+GM4bKvPJiX00uEKBI5yav88TUBqW3xjO/vefr+3HcPGDo5brebBzpgOwgIBQlNECH/mb3cKbJ8ProsCrBUJYfsAthEbmclDIFvafTBH091eYo8/s4krsaQEsKvX7/8PYWfbsJMkQjhsUH/J5gqWTNh4HFpxCWC/XpmYzOdna66I3R5xauplmwxaxAH3FcsAzsraKoiKCKzJ96EnOWwmU+X9c9EWvgezl+8xbY2txnGjgd86rbXfPFjHDJ16qcEVt5sgMQt/O2yfHI/64b+DEseQqmq6EdvEJTTZBM00obA5ERf63b5LfUu7CDvJYCfvA+xMD2yw8ky56fGE0GmzIavXMeK+Dk1/XamAE7FbnPPuAPY6w+82RNf6PKytEGz8mHjizeiTcvqLnWayvL9/QdhdkAHwFt/Mo87Ld63/HBy+oMKTFJW6WSs0JEM6FbYUj9K1Af2F6IO6YYDbDu3iJJJ8tbb2wnc0oW3f0sGbg4wJmywbOGcyGRYgMwgb6CNsT57DxjGrOFH8ytebe8UJwwmGPa85FIINvIYU6ay0eY6DsElvAWwfaBKgDbAb3TQb+43unf9j2zqFtziKHuM2KXPL3mJ747jVrB/GXJrtMtkKjr8AflZk7XgvbPjvfvwEeECfLRA2DCM3ubc5UnnyxCxJXeeTcF3p67t26dbaSr2ZvU96GtUHg51lsEFzA+wUwR6YG8yvUfZIU5Zgcr9SnNxMhyMWizMS8SpXJSwk+H+AZVv9iuCTZQYb/uREaQxolxlKAtt4XxO60HIfPcoPe8yc9kbnrdbywXRM96o4iFyiQgg4QlTXVof8LthAm66NVaFKt1UUVM1pcemJ6cmZjcLSk2vcMPlsAJS3X1uDVIZgZ7McdhKxm5YNLhtggxuZw7zyCi0AeR3HueICNrO7aR2yGTdmNGCcEg4JgQguKMK5fDZIbIjuxBqLKv5orgTRoNxqMDM+YcIn0Jv23oAAyfie2MyDXtzHxx1zby3Xp2PuoAxZiiRhlwAb5oLy+rLD9i7Y1J8gUPjEmqDDIQNst64nRgB2YWmNTYyDj2bweUdwJSZPk/RHJnu/GzbK60wmmWSwwbLn8BlqNi90Etfz9IQKhdmRGDoRC6bqfrH7dzhnU/iNCVkbqCl/NBGbmPl7uXHCkXR8R/cb7HI0BCY7hrfYK9s66o4Th+9T0EanOuyXwYeEgz4/wAZzMS+/H9WrIr7Tsk9wFwXZIXotbrfFMBKLe5UN0IC0NCSfQgQTG1qusGmKvS43wmFnumH3XVlC2Dh6G8NlfmN2M2E4LXZwIm5V/CGM2+YtcthDCFvwX43HYtMzphwpm2hh/67jv03SZNpCF2F+BAewndYYfsY6IJFxQnYCdyZKUKsVkywRLVs+C2t6ksVhC2qaxeVybZfSk7OVEFu5AKccNtXfrTWEzfVHL2xwIrxQkk0B7Ft9V+CjbL09Tz6/MbMeMwyLG6KjHTIv4SKw6WZEy8bxrhCcorlYab1ZbjDbbnW7kRbt3Q1PheHeNko7z2eGbw6PQjrzx9Gbo2Zqg9nM8nL91YtSTqLRe0jb78MhOBgi8QsHrIpnsSIRPyTggFFN03XdAMddnM2HQh62UMQvafwCWxmyaSprkh4mbHwvk8HrgLEzBf6a1vnAdTgJ9sZMLTY/70TYEU3FBwsuwroNG2ljFz0FydbU8lRrCne88ae2po75dqLhqXC30/qpYRrZ3zmFTLK/uw0Pf/55vV48hNgoSXFITzAR84M3AW44sBxMGuWV4PefETYm8AG3NxjWdZcxX5pY36uE8vnQoLng7NraX5fwKQOATXIkg6ZcZrqEKiQd2GUGm7H+hycUItYRp8vidkYsQRuNY7kgbH4Mpo3F4kTpL3WwvHpvkeTtTegugLAdNzp9W+EKiyLV6s50QtdUSaRkhkZ+OgQ8iauqGgjEgbjDzzz5uxt18QHygOYNauBIXKABY+nJmQqqCI9nzjMwRxuwbpmwUXx0WTZVSjJMFaaa+DDTlaUBbJ7BQmVvMWZEXBAcQfd5VXqIw3ZR2LZ2fHJIUTVcOqwf1KvV8fE3C21Iny18tjBeXTi5wRvC2/rPqLfxixudYi3v16WOtIcvd3bSXrdX9fkwDVREHHNz2Qqso6pX18Nh3Yv58NlikQ37y2TyI0Gvm+HejqU3QZew1ds8DBy37CyIEMxhUh2fnUkl0cAzLKmZWwPWcHEGBgYLhY1iOuZyAmu72+LEXgMUTbYL+myK+2DXQ3DrQmjKhWPrKyv1nZe3ecd3u9/g9o2THeYvb9wW2t1dq3fa26mNarBHh+mY2ytDGiVSKYQqfKIgxXO5XLz2aDEaDGKh5yw6VnTIAo2DoSHzYRc3bp0WGgyh80ba9LASBMgswqbUnGCj4obEJkXFbQ4bR5MMDgzCfVHYmNmcCBvI2omW7QSV6hdtF4E9xGBLOCgGVS5cOklO6GObe5M7O2+OVo9WWV8ZtH93enLxbfr6YlVgvQI923/bnQSveAckvw7QXr16FrN7fdSrJGNyQrEZHJiaiNee/vhnn3x5FUIRJofvL6rh4B3Qfg6bQ9XsmmZHTWLRuXUXwZvkcXVvejCs6Ul+HzZqk1QKC6wZXhvB2wB9UGXmcS1hgLu2W+x2E7Yo2i6gRoYQNmUQaGB4Clm7pHpdiVpter26c7SKYFd57Z+O2d5uwp12vyIdmF/E9l93/nnHtHjT7F+BXbu8Mg5x8dlQehBrrK3Gg88fPf3qF/c+WQyrChuS837aFEbR46terxYGuQ1gALdre7tEzjs/GMLtb55mk8MGnZdisLE2guC7YZMGCW1U9moJHdw1/DD4gW6702lRcUi+eFHYlEAoNIZuiJJ3OeDSc9GxsenJ6sujo15/fPJUON1f0D0B21G7MwfHLBxO42BbH8HmaQk9/aOgG6k9rn1173eP1Vz8fLBtgl8KaJrXbScztJB1G6VEemR3FnLAAvoT3jmTwZ3DpviIyoTBTjYJdqFQKS7mwgapEPxhkKlH7F5ZtMk224eBrQjUx4qwbQF78PGfH9fGpovF6g52k6G++Gz8YdfG2sNx4ZRhTjd6eyypMx5i4/RYWFN9VNW1UtCAq2z1C2ogkcvF0nvpzW/uffQoEQDBrZzrb5FUiJFoguy+d+n6tjFvlCZGJh9UNiBcNptY8gPSZdhTvMQKgOE4lWVlkiSwBndd2duMhufnI/iD0LKdLieFRwGHfnwg2ArmyjJ2Aste97e//unHP3r+DANlvd5f7+/nL/3tE74J46cJvIVx0DIL/Axfxser1er6M10LwAWFgKgIHLaoyAGQyeFEIvpo8emn3/zpy0SQnng7TxOxx10j07Zz2jpYt7ENyrs4s5Fv8nw9yWFnO7CTPD6ulUGfVx5sTsAHnWDWFqb5IhEnaCfIniA8fAjYCpYsocH9KKsyqNaff/yTX/3+0+fPivkmKO4/QIMX1ut4E/f2JizcXbh7SoMUpn6XJzp4CtdtMo0FER8OKYqSECHYsjcA7roWi409e7q4+JvffvQ8p8bPCVuBUIPyD3SamxythSkTDJZj6fW9lSYZcBt2hnoNIJdMppjahivxf1bOLzSNfIvjA8p9U7hkqyTgUvbSh5ZgGrUq6jMAACAASURBVAtxunURHGu6c/fRVlj/vchgSIeiqDBtei2bujUINyUtjNMUhZC+Dbm4IP7hkiAFoelDycuShUAJ1Ie8Xu6rsOec3/gnbZPbNHeM2pqmMZ+c+Z7vOb/zG+ynxh5Iu2sJp3OasYbM6Od5KNSBtQ9Vmzu/G4Ewc5PrTYp8EPLMzszNi1cW8mHl4EVvfXF98aQjwmG5OPdfus8N7/gaQYZ7Lmr8MZc7WI3JcdF6G2Anw+EwOhE0fYLospVmZ+a9clnaVpVvMo1SEr32mX4Wh8MmuiBJuvAw0+k/jU4QonRtDSqdWJeCOQsVDMDOImzQarDcaVxaB+aQPQ/+AahBfBL4hS6CPRGaCNCmHnTZtsFE7bl8NsDGlkRAFGWel+Si373x/cL9Z3fqUnOlus5YP1pkjTu63320eJduHCvO59ht+GG8xpgj7VwXPrp7qSBv992+ZHW7kbWNI9iiP7BTuvZzI9+Ky7qq1mYrU+1gMmw7k2g70GybXX6gjT1ASG3kj81xquLXErtve0vorLMEu8pgY35MY+2IFfvS+tHvu3gq4K/IPPidhcwCCgioK202OXe5bmxUtWMBJxXDbV33Jnee/bRR+jDVaq32e0T70eLiqCuyOHziBlF871gH5N6AufEI4Q71/54SDwqcDxvvQJvWdnGxmfdrmjrfyDTqRUnS6+39zEwd6puzJUisbewiRDbhNpOPmMAHJ9OTtVc9Mh1VI7KpK/IEwppWIrGITG++2iXQ8OuBR4INRsRl93HUE0ANMflM54PNmscOQRSLybBS0GNNVU0Wv73y7538tVqrsJVloR25+4ghN4IcHyGy54YBfMIRZZ8Ewe6+BcGGd2sxWWj1i8WuxyPyal3T5iuVKbWcCNeVeqMyr0tF9xkjG0520G2QWDz/mWebQC2Av4E1ocjGrkh2HDYEdhqnKvHv6S7ARsJxF9KGXxLZdt6Kl1qwshrq/wIb3mzAL4bbarMZO4zFmmG59NM17eqH2XZqdYuEJHIX7mM344ObO+2I4vAIoUbYR504jy1hbFxfwuCGxIywQb7e5b31HyqVfCohq2hIGjVJPptoO8gEm8RpXjSjQXZRgoPwxNZG3LkrHfb6OHjGYDM3srQMBc0Swk5Xl5f/3nu7mzC7wIWAXjuZlkyE/AKV6CAj1If8+uWDYWsEYYv+ZLhYANaHgFspqpMLz9+VZmrFwgoICYAdHLlFdl+kR+6zgZ0D3cjliDSjDXrdff1qNyiA8LlNl3AymMZW4Ht7PFCot2s1tX4982NNTqTqGnjtjZYsnAm21UP7nAIuPuAH2sN6xIXEzc7dzt5KH7hiCQN1DcKGOmapWqXARhe43H96VE5Ms38ep8LfSY1Vu8dY4oDA5s5T1tCZSoENeudNQtIG0ofNQ12R678svNu5P6sW9/srA9hgAOEWQRNIT2D9Pq8hObxFB0NRORTszbflcgBHft0+NoV9m3MbsKF2bOfrar6RuaOiIdGnKj9oRflTU2vhjk0tHvsUlkl2KG2CvBh0Im3GmrkTZyK1+XQAGx0Iwl5isJ+wpV94ea+ToKSKYu1Ef40G20N8aecUboI9L2x2Fop+b1h6ALCPDuFQynrlcn7n+UxeVrf6PcAajRo2O2KM+bF+9tDioWYYN4BNx3D1BgP7P52ybPNYbTgXxGBbcEAEJ5xsSVnUanV1MlP5a0FSdHX/TmM+KdnZdcXGOm2nDEqZTB4a7heDLp4WySZIRai1gQuUygFkRiYjaSzXl2kMCmUEVSRNufLgQSKEfg+zo5NqGRHC2nGJrR6SIfkaR3JMeTCy3W7RHPbKKSV2+AaEJFaQClNXbpSu3v/gTe7/1usCubnxRYNBCHPHFXp0i+aiA9ogO+D6wNclbQYXNjdpGb2BpChqJb22lansp6TCtrKfaeiyACkSdyyNSolTYSNrO+4TcgWNvAgmkJWT8cTuYQ9gUxGTZrCXsrRik04Pasnscu8wEaI2ljPuxM2YUHrZrdQoGw0antEiWVGAxmijMYBXAmahnZQxtGN4PPCWFi7P+zZulQR9C2F/qhVYFnLHF7+iA+ZRiuy5IexVJRgMnLK8JfDhdzW93shsbUvKtlJrPNz38gK5w7FT9zTY1Gy22vBab2bskFAVOYGJDh4S5b2VLHb5GOxq9Q8GO8tgZxns7F454STWcSdkRhyTRdhsROUrD1y5sztow5iHCl0q1gV/oO2VUgj6CO6FVvvGX2Z3Ss8+mJL7vfUcCfGwJXKva5Tk3DCixx6IcQSk+rHBGiy27BTtJ78fG5h8b17T9xuVrUKrAIbk4XUtGPDRfJx16AFOh20spFgFP1SPcJiNugYUO9FZxc0GCHuJmn74hCqSpVEShA0v9Q9S4LTjcfgKbD1ZIZ14bBiMlnOg9lmFgGDFSn8I2+2zi2D9pFSB4jrWjKXEC9/NlN5tzGgBvYehjUlvLjeqWroY2pzhOKL0bOBmOj0SEciO7+PxE90FNR1sYlHN173zmYe/Kq26Wm/8syQGwLngWozpS2GbcBMcZxNE3gWwEfkEBLjLmdh9f9BHl4el4gh2egAbs2Rvvdp/uietTWNCDYVckMyBNodbHb4+sgl2QAxY7YIwgm1yuwV/US+ijvwLbrFmS974+cqdHe3WfDh1UF3/eKV3LkdZ8dNRhsEYQ5RgP8a82sUhEfnEsRuctLHbQbZrebU+BYWksq2rW5kLqii66XJXx/a6nfaD4TA9XaEErLt/mvWSSLLL4LIN2MsE+4/0UnoAe5l6fuubB9n+y/e4cWY6FDLjGLPHQnPM7q9XEQwB0DXRGgiMwYbD7uLB8UmD0Ib4un5zQdu5f0OTVsFpRyK5T4GPw44MH/Apkhv+GUQkhdnxxCrFgmneFuC9QLvWyFyoK21t//rMhsjb8PrUxj6E/wHbSuFvwq2qeAU4uwgmmSobkuzNF9jIxmYIg13FyjGLW5moYwJGcP310UG/v9lZA8cH2RH7+iYL1qU+n/t8ih2A/40XxyPb4bb5+baeKgPsNxDZMV1pb3x3Ma89v5VPNV+CarOm6ke0OQL76UEv4ydy6PuUslT0ngSbmlE4XSnw7bwGbruy0dI1/Ztf7nj5JLhyE9ny8Wr384nfRBfVA/2n/SsmAZQE21FYDSY6B/30CDawprUwAzZORD1Z6r3uHPX61WZ5esLlF2m3jsWAfZ5BKM7uEMCt+/lxzXaY3CKf1FtY19ABUV67fPND6eq1KUVZzaKODGrIyDhs4voxcXzpcZT940XIjnERPfXn37SFhiShQgsHiu2S1p6szGrbajhfadSSeD5wPsOWs5LTdsrcnwNne+iCO1abXXSFQhPYAnTGy297I9i4XoCijbCztLKOfb9+da/c2av2X+rBaT/GNRwmGtD6suGsk843K8GGwtbuYbBp2N/kE3i+raTAasfekI5I2sLlKxu+C5VaqvlivZsblTMYr1QkkoyMwnjEOkJqjYV9bnFTCfoFhO0+CbYDvjvkaBvIdknVJhuTmlevT1am9GDRZndbvhA2XZoTHQn8gDgtKILLRlcSSnT2shDPDDY2/ihDPmGRjbBx62m229l9tfn0t18LMo/7MUFGOFqcOxdrbNkILj/vEjnOM/TZEFxuPu7VH2AV+SZ2qDcLsvrjxb99285XJouFFdCRHAWqEdtRo4KMjik1Pf/J2fmEto1ncVygUiisBCUdaTMg6HbxoaE0mwzUztaDwVKVjNKj3cIqTQ5TjEqjg0Nd0NiMw3SdyuTgkovqpNhLyN5EwAWRyAye7cUw00PJZelCoOTgw9x32ZOYfe/3kxy7qdNkHZqQQx3746f35/e+72mBQH6wEFk2eOzcNOQVUnykG4nhJhH4zFOy1l4vp7zbk3Xdc1uNhmeihCQW0T7VjeBYDk/TPzIvLmA5OT124/7GxsaHQ0SMxWIIuzAAO1ShBb23L3/5UNt9veYacZwdTvJ0DIJN/v+wJYStTk8risrSBjeFDReMtqS71kuSakNpUym62xOXvvtT695eyn9f7fXdSORNQthPh3j3sVPWj59u7VhLCRSYSaMsmyMKWhb7F3Lip7JXL+9t1+up+r0ns66pCZKUPQNs2o4nq3ZYngi+UWMvq4mx+xsPj6pg2P8qUcsuDMJuHsN+cfBm4xfrMHi91tHFWDbGC3jmjkPQyXOa82AFyTO8emFMScjpIdhiXE3YbgVT7Z8J7or+7i9/nLtSLzc826028VR7uf9FT1oXwgB5kjXQph/I4VFOUbOxGDs6hYqR5U8shmlNdba9+pWp9VQbmO+tmwkc1TyLG5H6+R89CRUkFNknZS2z9GYnCOUhqDajsEnTkbTWS0S1XQigpNl4CLkA0HZSIiryiWFz2XPBpgsIcWMHHw4SitoYHmj1YeNpRUyKi5rZdn102rRmz7cn70zcduuTsym/WugNSViXV1expcBQl7EQuo7oFxx5JC57odv1b2qxbJLDFudponYujbiBdmu97n05qzt1Z/eHcQiRErmoCWz+bBr5AS/LZnnNPOphW52cOUECGMJ+FsFeobALQfXty1zeOui9Bto6XolEc4BTGcmzREI67Y0rb0W6rU0KIyQkoZD8HcMmi3YkSc0ZDoRI6kegiDSmJq7ddZyZ205+bbNJp05Xo+9EQ3xs2YMRcnlhGQwbW/IL3QP7pprNwtU42rIJGw5l2piVql653brc8lxrtjHjGZoYR2lc9nOp32AmfgxbYETbqgWYZBPYKxR2s0nOnwjsAo58PC9sBps7lm371kH19eZ7R4dggZkIR2e2zwEb3oLM8hITyQNC2CwTwuYi2EvgR978sxKadlHfnrt4tfzu8t2W2akibEoa52Mo7VUmyj4GH5H0HWBvdY8SigxeJMlx8dEHdrgcEceXpDjkRO56y/FmHd31vmiMtxXUosW4z+XZnywy4UowDH+/irCfrQzALhzDLpFO+7Mm+JFX+z48rNrmt7u1im6glAYQZZNn9CMENiDmNS1caEX2xIsJLP5Fmo30X6nEyBnTdfNREblopd7NXLw+5b2bvKxbh4UtpPufUBMfCuOZkPSDCPJy+O2v8OPxFoRHX9FiMRFhp0fBZnBflYqrHsUYK6notlv3HDz8e9Ko001GA83p01gP/wVcEWPYlVoQ0Kr807CpG2k2wbRruq/rxcXD4NvqgWWgC0HY4AOZM9PmeZbREqpEbAjPwAlsReaHYMe4GCvmwGkX39C65tfFipW6/Ifrj1qpqZm67W32Vrco4X8s02kEhP3gE5YNDhuRQ469BXmfgtvKeB4XTI940RDJRE2TMSsRJXhxmjc70yh33Hxn78ls27axZGe4s8waDtHG/E8nhk0nDUpEsxDCLg3Bxp5NE0JkRdd1w4L/EbxaNOJpXCmSpHnQ2WkzDBQsIivRNhqTprDZYcuOcWnBNnW3ks9X9qkf0XPrE9fvlIUrk+tmZ7d3bNHLVEGClv3gwXFQ/KiKBNY7lUwii4pEnuFG1b1grSLeLAqH8yDlxqRofQ/qR9/qYBlpavHPF8zcCdrkjQuGXzkMAhIPn5dQjRNlI0QM3yQH2vRIG2DPVzuWHY8XK4eFoNmxDAKbTWe581SMuKtNg8ICAwc5rZEVgC2CmR/DxgjECoYJfoSW7D+DM7Fy3ldXL/5YL0+O2+7feluPqW0vL6/isB1+ReX6iSybtNG6hwe2omUZ3PeEsEcZtqBqqqKINHIIcTvRLu89KVsOxOYfZg3NCF31KYdR3AnahLXkF7+vztN4+By174Ownw/CxgrzGZg2wDYgIwkC8NpxhM2w5zrNRtppqM5lAhv/Aewbiti3bLLfAy8WQUhkKq7/0o9O/vLulYnfTZa9r2+39VrhN6o5ozN2qzj2tTx0xHqr33Okhc6t7qGbS8hYY+BeRG6kFxESiqpMq7gLGWALup1zpxpfthyrPd64V7c14xj2iCc5AZv6T0FffBUEvR7Z3hLCXhmGHVCfjZ3JUlDdhzoGr4YCREsKm2wiOlfVyKRRUStGWb+q4Ljqx7CxA5vLWI6FsMnxSMXSW3++9uhHpzzn+fuFAsr+Vh9jDIxWhjCf7D9SHcOtW92d1LTKi0JaANgjRySIZWsKjn6QdweO1rS9e41Zy0ct2qyekalpn7Lz5WPY0fauyvebQa+7FbZ18TQVO5CDsNG0yZD1CiYkNVeKAe3/NoNqR5fw5YhnkooPHaBwYuKCIksEdRrM/P6YJkGkHbZsgG1mfLdi2piPoF6nYrpzd65+l/LgLVuFld/CCHk8Q8r0G+qDrMN25NPuvjqt4mgSHkLx/IgMCqfGVJSNqbEYrRMN27TfN2bcitMuP5lxE7bxOdjDEbKf9Br7r+abOztbKwFt65ZWSAsyCpCFlaBARVFkHLJQAq9tiAAb/MhurWjAn4Pa5ixqysE6imUk9cK01od9AdUn7NALpbDtnFkJi8jFYt63cvq9iWtzrjf5TTvfKwDsLVSdhQ/IOJhh9VNfKEKQP+1WIMlOs1RsP7IzzQrpNK5xBkcnQTRicW+elnPH99Y6lu/tNdZ109BD2mFmgOukoMznCVu+X3b0WVMRsWCkvM2g++tOj85RlwhsYtm0G9Yk5AlsMv1Rmofsz4gb9j467aJBlt4R8QE+L5ekHybHhnBZPB1mOXJ3GlpICfTyleQx9BzwTgA21jQq/5FV4PS6ICcyutM28+BCivm87+eM7UeXHrW8qbl6vtbDEAk+e4A2c8Jfh80wohbBJFvkUIsDNnLaUgvI9zJLNzNgDcSfiTxkT87unpevdNb2dp2cDQWdgEtYIfPFp4PQzpMtv3RFWhLFJwIfarzwdzxqgbTPXXvdO/p7CBvTbJzxKFRDhR84jkHYaOiQ8um6CBcE5IGWEWV9WLbTUjKJhReL5sEm2XR4fxq8sywTLl0iuQAjo24Nf0kJBmZ+It9Xj1DWeLsM7OHYjpszF/eL+dZu2U8Y3leXJi63ynfXIWEtENFf32ETNzKkGhl8PO3++8CcxhsDkJWDo2HHkkBMzTxcWkoY9PA6xslKxvb21iqO5ew23ufBtHVi2rjoI04lgiQB5sipHLDmI0dDWOMMiaD7fqcaHL4t1qCEhFR6PoINzrn0EewS1Q+jH7EMhD0fwsZnH4JNDjAZYJ3EOy9x5M5i/CBsgcc2EbgOmfhPWdm4n+jnfcfzm3gXB1nR2lBEWo5tjv/+tmPY7amLE9+8+2nySkpfC7aIcJhmfcR3M30/TRrrtwasHGAfZaZFgvlU2GCiIiMoD2/ehKhCYCezkDyZ9vYXLTdvzTa+dmybwEZ1TzqO01bIOp0lNz1CI+NxloGP3AgYXZKTIMe2aru7Bx+KtRdBia5yIdNLhRcoITkJG0wb/MihZcvGfu9bSAMNCCGkNCLHOhQ2WeuNgm2AzZPiBAUryfBwl0hyeD4tKDduKCqw/h9h1xvaxnnGNeT2WwTFq0QKhhIwwZsbJw6LVKxORdIuiZKP8gy9IbUoHLcuL+0FtHKos0vbc694Qca02HKa2FjOt0NBAkc6geXYXmyUeA6GzVbBJnibDP4SxqgJlInseZ73zrETq3uVSGdHdk6/e+75//zeAFgjAvtlJQqXDO5f72iKmQaA/bNbM+VI5LUPOi5k5IsXR1mtYWX+ru5dtWIbx7l9LXJu/8mqri9N/xgN4045Dup6bwa2H7mHnMFIvLMzKhDrZrs/KIQFnRlT50URHJLigC6R1nY624m5wckJANFc0sAE1mfc7n3X0Emj4W3gwg0Wvt5WONjY20ejeZRfxYI6b4UHBU6NaDziudSox0xd52CL7b1cWEUiUkKAHcc4sy2xU/FeLX4yTurNpbSCwwWKGq2iDGjLkdaR1siLHZkoIcjiK4QjFESKSq34jhGQfVMdHR15+fjZPEs3KBl17zM7Wr+Hkm11YR/0SKyi+lMTwkeeEfkJsLnIuDHQQu+PKlIOOAtwSTJTmVFDnLp1JiDpXB1SmgTe0hsk/XkMKw5tXp5QtFwqa1oI/GXRmCx+p1lgE59c0gabWkXwmJy/A2BfGu9XdbNUJzVig43qwH3Q1wfV0Q4CgmzeqLXgVvSjp2SRDGOJEZ1r0tq+vpFuwfHCbLAFdpsnHC5jEKmZolYWjQDLd3WcmJqb6hpglfEkplkB6av/5PMeVx2HR5bsYRqE/I9L/5GiAr/WDvLoHM0lGwQzgvVZwe/3IC+R7mOy7JMfDTyS9fzZrhmdWiFcuKkDiX4v1QhpHhs7O3Dg5blkw+dCeZcDlVyxpioq19noTn+/D3bSitev8RY0Iq1ESYcocts0176+1Eir4PqhK+XaR9vLi4g46iVEfBEB0fRwG9Hu55S9RD4MGsbXh3oEVXbfCBw43a6XelxwbgT8EUOVUiDeEhONsj56vOPEmaGBnuN6DJy/vWd790Ck9+5xCXc0mRPD4bDpH+PhkKdpZvWQZLuw2bCzszXi6oWbUwapBlkO+UJDGdnInL/8hhGWg24npovbuaLx011Mi6rVFthEnQYCF8Q9INSZfbAbHGyU7O8p54fgUherBTbnMZrAo7XHj6eHkVEUDCRlZTiLktvqr0GwvYIvHI5GaTdQvOGIstdemE92Rqj5BPs8+/pAxI8qGuPWO5GwDkCbmqFpmhEzVHGo40TX1KOPL5bVdBIJpPY43xPmtT9zHKT7PCzj306rV3xw8bwkbc3LNNzMg6vta+1s8YXA1rh1Fn3wQNJDglCemxsNzHRdziN7APVI08dBcn7cZyzeHUVaQGxhsOyjBbaTwE4j2Lo6Q2CjzgbJRnQtsL9CsK9xC0mS/imWJJPTDx+mG4nxfgSbdg/xu55DjcS7oFtZYCaf0aM+2U39MNjJZyGNnERwLHR3tgLIIWyoILCdh7tbMdftQRMpqRDXpGIxA9tHNJZ57zfvfROc6sqYawD23t8QbruIQHOQ/HF4IPIcOH5mHCwDBxvPqKmA+3tp4B9DrbDgCsoRiZkphTGQHhYYLcujb9z6eRk3OsW8DvggvZ52j8stMCaXjXIAok1MvhwAG9F3Qmii5peLeQC7Mglg2wbSAptPHCQpVWKDjeCD+l7a3saMdsVE1w+sMN1HLrsa4cZsAtMGl7O5fECSdDkQoKZ+gNPGGlwUnn4ScLervr4Itmg5XypPI39HG4uboEeoOGbERjWp3NNx4uPQ0IW8uZ2csEAm6rh7qEb2kT4s2t+eQ0ZbAeeV4HRpsrV5zs5PAbanG5R2xCOzqGTUrtdKMpPicaazQGagq5hnfDQyyMnMIaKXmFHLLedqGmM6bhuDzglFwW4aZ0WwSY3oIoYoNJ6OauQamUTq7+NgJ6kj/gDYN55OQwA5WBI95IW2W/1YxyxSBRnOy7ieXclmlwfKLAq2BTyloNsD9yFu8YeuEGgfD5gg+DBCuBXARg4b5wsFeGwCxU7tuKJp0rzdGcUCxz//5dvu010D5sOJiRvog+xxTxuDGkuu8Y/NHfwRHS9NP5TCIWS6+X9gO/most/ha21tQf4hZWa2UCjkZgfzmjQWj5uVgeLnr+tSyOMmSr1ev9MdYpI5M7uchTVb0UG+ZAQbsT6GOhVcxOcGMqVtjnM98pUNdhIDd8qO8JQrMaBxtfLpF/UfNpOJRs3AhgZ0rG2wnby6D5dZHyxks39fyRZnKywelZiORiYab+nGPZ2xzxluQaGvD5Si0E1ge4Ne50u5FDTjQVliqjbP7OKYog5cePXs3OmLr5mP63UrC/WlnYg6yNFsw05g/zD9OM5ktMIW2D/R7etFhiiHE/TcKTh3MZ1bWckmAMfcZLqkzs+nSoPFYoYcEhfN2npA0Wi1HEhXAd+VNyWf4EK6PBBtCOfhk2CcJ4ujs8VJcP3U9PC1Bs11JJFGJ9nA2gx1i3DoEWLEntgrv/jvxI16I5HrV0XUfHT6VK3GFXAHAjLTK8UnK7CePLmVq1VUJkXhwWRj1CibTGIhZNN0QsQO92kEh9+FlyTbSlyBZMNtotvJqFhMU8VMz6sXhoZef0cFsJ8B2l9a6WzMjRzS2Qc0ydL00/lTghv/j+dgH20kaY4bFa7H13flSlwFdYh7rxUKiZVEtjDZD7IZSw/m5ShOIiBjFyp1bTK7gu96N7vyp2IN0A6RhaJeP9rLEME2BouFfjWVmq5j4gn8P0z8cbCp6WxftPEakFrBSb1kPdloTJZSpkzL0+Ztg+eQbC09KtZyxVxuPLeMa7KijI2BkTFqs8XcZEVVmA4hqDfowZ7lcLi1s6+TwG5WOdHjjOIaC21TPPPB7785PXWxbG4S2FZehCT7KMePg702fwqsMJ+ZRifb29tEstGVavNi40pkZIRj/S7tLEqktbiJT38slVKlOKpHcAtlpPq5/o9CgbjNQOFkczUzLgkU3HhFLCMiz4AISrs/V9iEn13cxN4zRBnleHh8GDsbJoiZqz6RnKjXJybw4FryV8PDcHSjPlzvX1BwgT1Q4MEYg0NlHZ/ZA6Uy01+BVRqNlUpGSlKQmTRXKBZw96DBikhmU/S1dHYT2C0C8bkcjbVXjkqapqzb/awmO//mL/716HSPoaTrzw4UalCyX3T47GmbpeltKSo7rVycnyTb2wxsjEza2zzeyJUrgDWx1yZO8r3vXkkkEgB3ulIyx5CuKxoGs/mAUeGuWt2q7iwu3rlTis0jdc66tI5rDF4lOhy7Xb1Tvb2+vvHv3d3Fxd0q7oeDz9XdDxc/vInbmu3exG+t7lZvwrcX4Tfu7n5yc3V1d3VhA9f6xqGVogVGAORQ01KKNCaltFKlNpkrwH2GdNuJxFt/HqxoYL31SLyvpRsZULpDqIWalFGRJVTUlDEVhxBimP8buvBmz9xcT0ZZ++7Z76gpxG4NeRFsa179oyUIaaSwm8phALbrJySbEwZjyhFENlUDseabFp8kStVLv74EAr6SGJ9Mx1TQiJxDBKCkT38fHrhub6wfvQgx6/XQun9/I5nIDQAAIABJREFUY/9xH38RHVjrr/h3AR+0Vq1VXYWrsbCAeCup1IayPq+kSrVZAHqFqKSRc/fkyUR2+XolxSTp1MipFqTzCnuag+12BiBY5u2s9gzCbzsuz5XfnlFKm/U/HGp5PzKCpImbNdCjbpsPh9JEzWZT8OZHg+bVJaVWALBfwQ27bUJVolR9C3RFdhn8k4o+9mBsbP52aqFa3dna2cIFr7i2DqydLesfP1mt7lTxaHXrwDvw0PrZnbs7hxZ8effu+3fv/uV/jF3vS1tpFg6k/Tj5sF2UXRBKQaQwltkuGZ1FavyxdkY3AcHtQrUxgzU4WOnegfkQLqRl2HtJaCS5ZRZjNjDZOuIHQ4OSZqOgiyFmJ2ICu8KNDHM/zEDzF+y3fNg9z3lvYhJNZ97a1h9Xic973uc8533Pe06Gx2Imn8cHeQz6cjEnN+a14jtUyaQ3drm/r2OqT9RH73PQS01kpXnUd0A5eRxAdkwQwH37mX3y4shoYBeZvP/pzfX9Bzt7bgb7Lxe3Cyym/mhlbMK6cLgyPmnrEmDbbCxKOhwfQvphq7RrMLDz+hRYxyJOpzNClFyHux/WDWV7EFZ8bnpZuc1KrloFAp68x4N/CCIPvWEsegAPPgRcjNPiooDNswgIPfWB76VvpkHTUS4bDKqnVqt5avxF+ruIn0PfWjVg1rIbZH2YOvT7zzRmD7Jqso+Fhet9ZhNE9IHf2CX9H0WRGAE2EsetnU5gB+dnkzJJLvMOgrRz6/YH//zzC58A+9GTd1m2oO3CGqlslDcTdg253emKGxd0tpLknBk+YBLZGhHVD7miKhfT759C2yoHmdGBqiaCcfUsRcubwAa+07Xp9uGZBpT0DiHLFpxpzMU03viZ+qA5McolwR9pmqRa88+oP5MugbAk3+EO2rGq51roX0IOCQKZ4hLpJtz9/bsOklE+Mu1rN16+P9lteQfYyNReEpnaqBrg9kXXH958sf6rF0kl3kQjbNmt9NE4/S0U1mbGURwbex8IBYY6g23h/jQkOednKZhxXN9C4Wq7c4SrTXKB5XvcNBC/1EYsRojTL7nrLFbKRAdpGnX4mkat/hkjXeKRFubcPilipEsXdE3P1ZqnD9/iyZRA7LouH4ZJh/j94VRK+3GBxRK6vvXTH7Ra4YYWbBygvR0vrrCiOjFuV3UAm5b0xHhgXzHT4t1JxZv8x5f3P/jq2Zov/vUye0hh34/mLO2HYfXEkXDyziAM2yqkyNA7EivFtp/NOjazd767MBVjrO3bXPvQPoLe5/f60G+GGzxyA3REFKca+aqGPbbBaII47UlfoCjgbn1oum61xyXYP94pZzytP8nEulTM6bmUW40Fg6FY7EdN0Rauc2cWwDzluO7g3n2iqnwfvdaNDZVMe4bAnui2dcwvwufHJleGlRVS2mTZSlZZSf764W9effUsuad+sSxazDyvn64354s0sJ4rfDN8ZxCVfprA7iT9zAOnriWv1x3kWteE8bZLgA28mUy40Q/6ezPkjtPTeBEiQyDJaHtaoc6bJlsiLibzNh9qoRrxJEFJM0Ejv2jQY0YLL2FGgHW5+p+intLcrlOSRjTVQXdYeJQ+c+GJnuL00ti46eONRJJCtDsvcaXSYumQfML5jWTavPPHrJ3c2z//7A8fffRqX1K/QJLOEzN3ZM48g2y/dYCLNLM3Bkct8HwcPrJld+LsIVs3Hx8EZlbUXbLrEby5XHZRSpXZm3sQ9vXRTETIuDfA3qp8ooNJqgIhxu6CbDNAGzBCqhjVjAFEL5s2BuYhnymXjMwi0C5lWqeEl0eJ/GOu4o/7g+gr7kCbobDddIiigSqcCqKwBWHbBPZB8uTx3RtIF0aKfLftyjwTZPiOXVsxMyx/cCdJ4K59fOv2zfvDUvxzAnvuiZkXNWfmjTxqPV9Hhex/B65NjvLBHNLabO/KcbbZhvimKJLf1hIHojqwfRsla0dGTLyd3Dt2IRbXglAlkFt+PXpssD5rQqjh/9jvEUpGvlqGdVfFQ220jY/pC+VMhi2f1J35VAuP8JQRZ8vhRDgC2YG9hEQ43j+FdcYNtdBtfBfLrk/0t0AwdpB8/KdrBPZYbw+3Z227+ivSebAjO8Y3UM1M7WwysPTJ7Vu3Xg3Lic+fmzdrRFRjuapWEWoUrU3enRxF5r7IvQBNdL7nZROtdkYnxifXE64RuyiCTy7S7nQCciAOKejYdZHkUhOvKcp0FfWKkTeYig1e/Iyyad41oMT4ZsrM2EbGaIfRNG2eEQOuEQpQuMgWssH6qBoUTSoqwO4D2hSXh7/f4g4WaDmJjuKRSCRIDuYe6A6xzcJB9o4AW/QnueLud4+Nb8L1Dg7ONm6gZrOBwC8/u/37+/u+twB7uZ703hRBfngRrFMEWQj/sDI+YR0wD2EtZsOTjjcYxamT1TZ5N/CGPCPT9Xb8DGI2DvZ2usjSXeiYeeZ2H4bP1VXVX9FzdXMVYJs0fAGkcSxslli7XCUzLzHWnlawhfnTjNAqEYzUZtmg7DLNAoG9mjh0nYKXHQu7QY3AZpy3YpFQxLUtWI/QFvsMjoZld7/Xc/nmldko14qWN9YJCiKxFcxor8l7z357++arfSVOnL08J5KiiE3mro4gC4X/JgcHJyiAFGltXe8EG3fpxKsZtUyOB8IupwvF3LWspOtHKKYa50rvGMGgy5VIqH5yJZsnehEMQa4tz2BfRhII5gkqQ3ANc3a7aJn2mGDrxzQl8IStYAsHWs5Xj3U9l0go6ilcIUn+UNzO1jzCBbqdZAxmZfQYescR1qekRprBHmq/2cKFX5AJYx0bnxkm0vZluR6Gb/bNg1u/o6CGpB+KnpkOcnnZclWo/vSvhbAyPjjW1SPAtvwE2PUTVdvQaM/gjO+MfKPTrqV85DF8PlmSc2TMqisYAdTBUCiUUM/9in5SqRJGJUIZTGG0BCwCprQJdkmoOiKctvjHY9q/AdoXArFstM4JHvkOFFMmmX1+kA1jtzEY1+Jkx04BL0H995DTtb0twB7ZIrT7KIr0e18C7PHe9wYuWTaf03A2FYriL43PzypyVASRa4pv//6nD9elbPzr5yxGzHy/5U6WXfDh6PnngW0RyWNdqF42OuaNKhoWpJZKqcGEGk7lNqXNnOJOnWmqGl9N8FD9OdJ91TxRQ5qBLGUuRTYmjbDUpqhGMHbtcqTJswE1Qv8TtacBdivTCD9brOipg/OwpmlnZ/7U2Ta4jUg65HRur65q/CmBdiRGNLLgeK2gVDGDzV2OhpoNG2lFnCZotVgHumZX5vcUX3SzXjVAevGLj5OS/+3/UBrUxHq51bI/bPSELKBM0WT3zwQb/cG6cNna1tvdMxCI6ikXL8o4saAr6IprYb9b1qNH2M18g2A5fOirVHKVSjnP0QaM0lz7re4vwwhzzGIq6UsTYi6AUmPnKQ22aVoe00KtkxzJF/VcOKGlirliyq+t0goL0UrbXtU0f8qdI/+ZUl1OoVsjW0Tqqgyw32+A3ZqjY+lhyya4RweQ/S8pypF5grDm8+58+WB47/u3f1t+0shiFQ6yqSZofTDYEwQ2EhJ/Guw/DvVwtqR1qNsyurQSleO8QIUEdAbpF1L9clSXvCsBaQU7+nqUnGOuUmKSANwUsxuXYvEaYCQ9lyHbN8AUhHytvjHSPCf02Hc0W6TLWY1nPFf4UIpqyLRzYTJiTVNRAp1eFcGs5ORKRaqQe0mpq0Gn0K2kUxdeu70vUbtEgG1rkX493aJEoJXvNQ/gvJ60iCyzHklmfTNvPnkWkLE1IqIZFn7LQvo9ba+k+LTwzd7dCRu6s/U2wLZ0ouwh5IoND/RY0JW3a3YveqQ5TahZ9LlcztBqSpdkr1cGh594ZXkzlyoeE9pVg5Y/PBswat8hEWE23GOVt5r4EY9wi827KGJ9lNJMNulm/2hGmSwfc7J+ciJn/UQk4bD/MOtW6LVIvNkq4URBfZ1QE8EQ+cxYjKKbhHTymAvFjItmaU1g945NjPWYFa1QratrdjYQlZKKT1h2cnZ+aX14L8uGPWdedhSHB40St03qjyx7785EVxvYHbN0ADYN5JThgldU0iCv7d/avzVbcZBtn5EYkOUs0fWOpKjnSoWlCKs63rG7Autpj/B7pYtHGqNVkmQaO1GtWJtw1/CDKnr05GTeeyT5FKB85I1GozgeknB445OPJP//GTu/kMbyK44HNMLCmIdKzcOS0igS2jEuWGTykGo0Im1shIGZBtZt3BATAktYgmUgyGSeckk6ZqMDM7ox0LtE64Mhwduq0W1SRmynDu6iCevkwemDoL7NvBVBCj3f87uJpl1Wf/ljEpwx+dyTc8+/3zlSMiKlUimF7T5F8k8K2JYuBnpN1HQjDgd2oXLdMHkY44FxZCJZhbiz8wPBnskJ/3wasHlklQr7kabWzPmq2zBHs5e2euxN7e16Q+vNsFXJ5hCJXheI+UmNDKpnenGyX10dm5t+s7Pzcloq5uSCuypHdnaI9jd/VzMuNUbXDW3hHtYwfsNKux6gajwmBJODg3+pH4+GKOslnT53SKz94S/XqiTUkUgkuV6az4L5grpev34ZWnZLZBNiAqXNmystTPZMulzdbRYQbaxiJZ+xd3hEz2079AZ9IIBIRThLpOlAxvwPLD0T2Zz3jwz7yqf5fjv78yUBW8PjMW+WbOtD7jps5RJLlBulOQblJIkmj2aG16p7eTocCuUTuWI1G5USBSQP3goTAkZEnc91JQChVWOsb1XS9z9tPCL3VcWC37yS/NqLG0hEvEVCErmhfJJ811ycVi6l5OJygkxQUiekT8Ik3TtRjMbGUFukOuQowe4m2M0ObGNvKGJtGtI5hpt7LQ67aChA/mXAYgnMZwdCsVgsSK8PB9cef9GQFEODC41aMdK4/rHEsIk2We285e9GyeZm2tgmbg/GSmOk+JzOGdjVaZyP0olVKb/8Zoc+U7JYlN1b1WJ1evlbZFXIftjYuJJWFVxjEPWaSN///0Ny/3qSgAnf31BzCj7yhUgFvTl6uRyNzLEre5JS4EB6vd/RDcnHjHIyM5ZIk1kaR34MU1LNZu9+dWuiZ6LH9ay718E9fhp3QTVpRobR6XXErhcb3NtHLJbtgeCEPxgkk1lvcXy5uc8dXtR2F78TsEVNzucNwJeWSiHARnGSuufgB2CLTYEoHSHYQ/YH4WrKvGLmKoVUPL8MmXLn89GjBRLto4JcLK6HS5KcnCY7e/cSCZgNDqfWlg9PL+tRVk6E+T69lgtD3sxHL9Xj2ZzF4cwjp9c2RLh113d29i15lkdvdtyRKrxY9hTHEGDH0GuTV10ISynKCh0Er4nDIlqzN5P0T6Lv5TMXF2fTuatxlwf2onaj1MFh1yBpNtTu6MWMjQCME71+xDJe9J4+ut6FoS7Zz9XxHT7ciVFtoR60FOZIlOZm2EKyrQ+tTUOxiWxRscErQNwylY7k84d5Wm46B4WOXpNo56RCeJ1UN2ntg4PdgwPc7dL18vLgkh6U+cL5STwhrGe+szLg7fp84ExrV2QmL8U/3N2tHFTw/xx8zevgoLJbPtsT1QykPSrH6Ti+ZbUQ+yzPe7PVlgmFF4AuQlBIHXgzpYnJnt4r2F2NoTc9GSNE29XWi4o1+O06Eu1hS2BoaGCoHfu3gtX/LKqti9QsJKZ5XGMt7qYE7DYBu1bCehvJFiPJF0oKPgGixJh9buapxWmhHsNbIbecK66HsnJRyk/v7e2dlSu8mBUhq1Tm5tLS12mmNsf3af4pXqH1T7r1sdfEw636yBOMx2dmZk9SJ2S8SbDrcGyRUybU+blVsubiamyGBLvvNN03a9aaberUcdOfTZBzG96vmfNitLyvCpyAJNgoidfpNA2ZGm5jPwTZbkOXHceIHaESA0rN0UJDZ7VaHqylFhv7RAH2FEs0S7XgzRNpSoCNwt1bwG4VsDkOq7MHg8kMaqFsWvMoz4lGpFh8U5VXOdkdpbOUFA2XipuJMJm4yzt7h5HI0lIFPnQ+HyGnPlHMKfvvLt69u7jAlR/yuvj3BV4SrzesH9Ht/cXFZrUgjDqynKP5EpnUCXJh407ExcZqkj14OpgyIxVj43wGozZB1M3qrM9+kzeTy/IMOMC2Y8NEY1oMrXZ0KM7udqGtZi8pb71Og9Y2hnsGlHpbHRMltQUaulHW1IiqO1TMjFyVbPuQ6Kd+E2zh0cODBGyHPyzt4wyEdLWWh6jbRKkRZ6Myx+5oNScnw2EpoyRfhgpkhkWWImJVdiN5Iu6ORgsROXNxfn7+nq71Rc9q9+fqBXe0PHw931wLh8kVeU3r6Ggao7LErKyaiwXrf5AdRM572UZtYmo43iqyYvWUr0mRo5h1g9Zr3wfbwO01m0hbNKOJKdo2Em5UKIpOv1aCnT1eVMcCiXwM/dSIKUvPferMSCHmdIKMNdsJNHdEuhm22moLOw4t/kIcsEWJgMnMY9TNWmI+aoYWT5W21orFRPRlobify25Xc2SCpdPpY0lKJBLkQUPdRMfHB+bXnvz1o597WjweT0dHh9FopAdA7TnHzWM08kvv+UFLZ2dLi6flZ0/HpwsFNuJ2onvuvXxiZmy1b5VZI+Ix+NXgv0B7MMWpGFYiWq1gLXKQwM1aRJHGXSiHItiWAOngrtaGpiUcgRoiI8XuQF9NbmJPuMmtxM43nd7a5JiIHtf63/IGJXQc1kz5+DLFN75/Xp4qLx3GeiHZbGjfCLuV69MAu6nJ4k+eoLzIzKWVpLpBGx9BK2oGvMcYrSmXQv5I5rE0Px/PsIKx2TKZjDdj+y7DpVNytbQd2F775ccgaWTYxLYF6Om+5Y76msfTeYced3Yy7Y/+FovIYwkcNrLvxyI7FXZfRZzGyWLNsMWscK3XZqrLNVnWo5waQ3odsJOxZ6QdBGw9YF/vbNMkYCMzpicT0MXjAtra0MmB69R01qaRB9vJxc+uGuxzi2eNOjyWUQvdLU6QBLu1FV+MrttItrUG+57fP6d46Z2PQrTpbbPYIPOBjC+pcW+cDL9iXC4tTEuPN9ei1RTpFxgDnGuF+Uu6RkGlWnV9fvvpLzwfdHYQTWMnybAH4g3s9LzF2Iln4GzEL7Tc/elPtsOJGQzedLInNbdXSYucAMdoxpARpTUWT4nEI7+hGm6bOGEitW7q799XSn7AbibYjoC+/X9g14SbHciYpcfFQ1ra0GoRbXbb2ewO12HXJiA8gmT/QZVsn8rcR4LtDhJsdo9uJdmcXL+HYNWwP7kCybaNohaDUfdzoSV/NJIgRQ5n5VcZObSQzT3+cckt0YfEaVShbwOfoFbSx3PHVdIn6+Hg1tqvOhhuJwuzhy4s5J2e2mLYHQT7w4+fbLtXney59sGknitH5vrqi63sr9hyob/EB9+srZ8gtVxksaKsiMKRfSU74arBblcl+2FD1A8bIQ0cNAlYerprcy1IuA2cabA7tpZOP6vpEdGx8hMMTPZhPnKZbi9w872YerF0GH7QDA/SgHHqGnbXf7DjkIY3CAG23x+BGrEpbPipGdV+8cmEI5wruKubX+QK/uD6rx/L4dIJqkdNdHj4/NRvmq2QZV6CG50NB8ef/ObOnQ7jnbt3O0l1E+sOIy7GDo9Q4zgOLN6eDz9+ul1YFZVYpD2cznQlX+mL950KyXaK0yPBTomjS6CFHhGWHwzUWUT8Vv60smLLhXu4T3r3M5cDOyW7uhok2yAqpBCIMgTaA45ml1DcJN0WB30R9AQ7WDhdvKZG0GZYIwZRE+ryixfqlOpy+TDrdzWjB5XhFiOLWuut16FGHP6snMmw/kO1ERiOjmpRpKOitynpgjv3e0Wafh2qbm4mCxFFLbkT+tJk5hngqZl4To5EQwO/vUuCfOcDkmwjGJMq6QDmDtYpHqHKIfQMWziJUNDO2VXAVpWIWlGBh7MrrK/ouwQ/xqRlM5v+eIpsRJ5iO+uMF6Xgs260SQfsJp2Vd9hfbxWm1o1wiBVdTGGVcANqkm8LOTnt+hF/9HSRB4Rz/9VP0IaVYZMsl+kGIccA8PJhYbzX1YseVO23gH2PaYtyB4yHDa2/2s949xncfym7vte08iwuJPjUCkM6SbtDYDQMTbbWZbPYcbuBNNHaVtb7MOvWhzI3SEWyDzJcWhYuF+/AsPfiFcUf0JpmZDCd2MIqXiKImkWX9SFLOvOwRqb1wZcu7H+wrwt7zvl+ddqHzCTXxDZ5MX7u8XPO55zzPQeo8H/o4XnjMMIORKLK5W+/r4uxjqa36k2xjD1318GiXuy+2M1hs/Et1qHWQD96CcC9AG4Q+YIAj3Co7fwZKAXAtn5088t1rZwDosBivkCWnadYj/UJ8SYWLAzAX0SRB3iIWz9cBVVDHTqANoge3AHc1Z+FAOxZCP7CTv+mBcE+9RyoDTFagKgk7KRFRs5ZD2jORX9ILiHY78zZ53vXCW1u2YD1QIvTAjSb5UybRmjiKRE30Mh8ILSOBz1+IF/z8PpLoGLqxiWwQT0AkmNRNb5PZLVap11P6G3VePiwsZvbywEgpSHwbBA/zWDrjV1Vit9ZcQBhL1kvcLQB4mV7ZPqAcIVFgddWrmwr4CANcI6IeFo3AWwjyLtY+N5lYBO4nf/ehdv64mXj1reUkLpK3hnQRhICD9o92N4Kh3EkvTPs+jmwWbuOLeAjgQM8j2gDj2x19PERjnP+C1uvhKEfI2q8UoQ24D4YdLZ8q2jZNtsZRv5c/JSjzcDejoWUUfqfjQaxAqpIasVlISxFtI3drJxNJOoHWrF30GqN5GwDsCblncv3T5j+yL3EBipVSj6/aUcPyGjETmA7mE0zuNHCHRErcMvdWkfHFEga4AY1M+ybJQO3txPYqB7R6AU3RSvUV5FOA+ovG7zdE5iEdE/Q0LVQCGgYOCEansVZzn/8KbBZRZLkZJiWjwDkAa831BmDZVMiarLXw8J5+umjVGpC2YO30pbH5/PiOL+z7BjmNMLBnk/GYkpbh/eB3fDXmVlTHy53RvDWBE2tJx7r2kGzVk6gw2zsMnbNDd+YWCnGouvu9Vto2c9/GbkNsZ3dMQX7sn2ZuNo++Q1QOZi39eMDuVcug3sFMQo6VNayrF/FzYBNY1hYxZTvME/pGCZbQbOieC2Bm2Dtt0JJjEXjPrRTsOzQBOxTh0vZqBi5CWgjlcxxtP1b0njMZ5azRSooapiHxJCPYf1of6DEPAEAmw2IsJyFsyfD+HGy03oyFo1p2QyWqnPsuAfLP0ywRottj1p/6LabzVqvmyjXRCMnUCxsDCuqwZsF0y8B7Hjs+Yp95bZ9ImwYVTPDdkzJhJTONfulmqJmxX5f07C+qKnlbpdl+zBfnWfomnTh4anjY037rt/vK5VKpX88xIgRghe3WzdfR7eSHgznXFGcVYlHjy2fnj7Q3oZH7XGBFB4HnqDtcUlZoJHPedh3gynIFC2vxoXVHGs8Jub3A9hYDbKcdT8UH8vC6vqFwiuppwssMbeH/dkkaq6yaBZsvqRp9x/XR8UmrrNuHYhqScAQQjCyFVPgza/CbsOA+PAKCvbbE7u2Oy7Tg/Bmv3Qg0vD9kfUXtThrAcMc1EinDpWMntHzWWxWqFC5pn98TGP4zDYe7jLNHuZ/T8z9PEueCO6q+npnJ7TtpdUt4egE7NOWbaNZs+hkBhfs4mQKirlXw7HB+GtqnfzzjSnY0wshx7TI4C28lh8424KbMM7kIadDU2ZQQHljuAY2LuYFA1HL4XEPvCCK3YNowTDShtCW77QSda2mY9B9vykPDQwhBCMvamYetHYwBx/7rirH16+sXIvYiUccRNgY/jHL5maOBBMBtK+tHKwXsXYr4VkwBeu6VO5SAGKZ8DVVIA/s0sFLx++xrpfY5WbuUxCGfUmRtvwLQMEAttPjtTCwF0/tKp32WW5u2mhXF63XKeyIBDatxcOtQF98YXnEUtiYjkqlaN03CBrPvH921muxnWftyMXJXnCIOguAdhQ7owQKuoAhSmN4PywoM4JGzhgVi+XHrd5hc9QWgUg0MY+k2i2XR6bIMoDDbFbV4tKzD79iKRFGJMyul8Gopy4S81REJL+vPRiJMthwn447vsEOhUoFse6LrMPTQN5Op3P8gdVITMGCmgluUNgiCKXjiihK0QDOqpl10YGaNZw6ceokRhpMzFd1zeAgELY8fja88x1wNnVj/wu/cN0VN+lHqSdTFpFigQX/rBPnc59nxwtDexH31YQLYRegDbYdpH5h9xi4EqsCpSq8ZbzKTemglbhSlEdZrVlv6bKWwV4ePFqkmpqCVKrIsrQTf3bnLqb+HJGpP7xMygbgRu1Oz6ToI47fHHZGIrBQFbuc8sPjNyZWIvJ/y2Sq7mAa4xC3QFE4nmUL0o2HP4QS3kFmFAB2VlFG4k40MOMHC+VgU3fw6abNK+80hxS5xEdy0rmlHOFKt8/Zdk1sXCAaeZKiByVbBzhX2L8ACtRHCe1zDDEl2l5cxEW8hcIcbl/rQRiGYJdUcwCkCY6of4zBAoDQk9pXHieaUk/VOhD/9dAiiQBkZFy4em3AOhZP1j5YpiSIlRky8vUyBCRMrxNzk463Oz7+7WEnb6rBNAZ4VSGoKsNqtRpM7+0xaN1U1QlusPwfSXfWWStM+lfBQZZERdTlQiGwubDqdALYuDZr5uJPWDYaJI6qown+2O044w34cOnLlnT0HxQ1N95xkDwKQfPGuA9YxOVZwI08qwEbSwC8s/XhLE4SeAvBBlf+SiunSUqUstn80MTTteCfTHyIotJpJh5/CUGDpsijVrcNMCtg0Qr2YIp03Bk5t5OMN38FrIHpVXKG9qlsXLoMVo5C3b6MGRPHyr31TtZUBUI6GIQ4e0jFmfTkcE+QdwdzZsMfMCx0G0He4gLRUF6RsyOlEA1s2jxzYVcBW5VopuPp0QiCvcjApr3uoCf9ALcz+o/9rznOE7Cfpt67QD52XAEbgk2yk9YdonJAAAAgAElEQVTYTbCe+ZllI7jpwrJIYJP+iso6VaKoMdugLkad9ZCa5rEoafVv6s241OvJWjcx6si9kZ7J6MOe2ZeoJUxUdbVYSx4+/8rqiFAGhKj6sp2wvxDBrKvDzjJS8J+VXxPYRpoQFtIqgT09R8Vb9DcmUJOo3JjcBA62oL7W9JEEYIPNrBacCLYNiwHnW2ttWwDqdsX2QdX8uKgQweYynT09PRm0O87AGoI9t+qhUzs2Vru3nP5qa++BbYFwk8COFiQVTNtddRsGr24LyKgIeqaa6dUO7iUudbRMWRWb91uoSLrdtAGMC3cCQre8Xq6WVfnwsPjNNWRsKyKK4Z5jmbJQS1xA8u+lmx9sd7KiiWBjd2FOrQyFKqvyMk0anPQfbrxzsZM/nEWEUvt1u3zQibqAPRZ8hXDBlZzHCYCW+fOtcVpb8/pDO1m+9HTS+4Rgpz5LfQZfpNUR7DkO9pwv4F1gSxcWFz8hHE89mjdNkixOwQa0Y2ImzYol5J3cdAJEwKgOwkC9p0FAUhRHXUEFIqkXa6My3pKcYJo6ST6ALF8rPnjwu79agZmtlBjhmVWHYxp5wy+W7EvWlbt3HnRUzRRYJT29q75RST+yPGAuyE/6cKtmEmAKOP0DL6cpqt5WQGiAnaHrCW3P22zvrA89O9prnp234/HRER5V58NzLJgT+dGyU/v77eSsf9MGYEP84vMzpHGC98yM7XSwpxmpGQY2S+NEXyn6lDHZATJqkxEoSOmqSraV0ItwQ/Ja7XlrVHurg7MScqVjkz4HAMdepvksGf9wxcFE4hJTkugveRmB56IiS9Y/3bv0921RVMv00akKVbMyDAqMPSAAcXN9OAHc/Z5xb+Sociao4B71mpb0Adif0GBQHG8D4m5zZv6cWG96Y9Lbwf7R0f6T//ImEQ42/3p6cjIQsfpowQnds3OzARq893/Oru+1iT2LByYUhDUg3p1whYT9gQ9KqRDJNru3S2kSU2/YzIPEK2xh8lJCXAhs2AUZB6dPE5I6QzpW2wrDZartU0JDH4rTmhlohXpzfbh0AzZPCyv+A/4He875fie9Xl21+63WMT+M/cz5nu85n/OLZlB+ygo8ARskWySwwZGaKM2XWx7bxkx6fkBbIEl00MyMUXfd+r1nvmpJzlDp/PqPO2rLgRcX7ANy3/EdBQJ74Zvrl38HeP6ek1FkdrNvAUcy9turvfj2dM1Hn9Gq25YFusgm9c1zrgOh5rqE8J3598wPAeRL4L/a/WPNMXdWK6mMcHYqkwXJziD5cTHyf0i22Kjt7/+H0Ia1+AjBDqR6EWm/lY0jvQY2H0g2zRmFO4zj1dKfAXvEtYqTMWzyGEaww6WJB2u+CWgHKjFJFkCSB1/BpgVf/d5Q10zD8ZXVLc/VB81mcsk+6EtcshHsSuP+hb9/+82V25fBaf/VmTNnxjitTXI9xrG+/d1X8dnHVX3IyqNkt6vVwVUlAspYKhSCz58p8AOyMFMY/adIpwPWXfUA7jzN3ROmbkbArymloukQdmk/Jdqg59OYIr+vHrUY2gg2D4YtMpKVuOxUJh1lYIcT2VxMOFmf+QTeFzKHvfBgYyRK8yVl6FHexom5BWc+bmu4Mkxddu5t7egtwzPd3eEzR5Vt0Nntft/GqAmqG2f4eG56oXfuXLz33fL167f/evk3ly5du8R9xrGxM2NsXbrbi8d79/cqe4/9Dqa2q3jGwpeF7vnz56TByPRbWsdfhP5MO9meCUKUkmRqx6rWljxzt5SLANjp3ESpWAQDOIJz94TTSnZanKsQA7px+A+WlhNiRDZb/0JrRMHbSgckY68yQnA0ngJsyrUtJeYflF3H42AnfxhJEROqQmHg+lv36qqLJ6HsOy81ULmSAQdkC7NIwA40nWFn+qdZABJWD9fbu3evXv/LnxDya0x/o4Rfu957GO/Fv1rYy1cblTlkSMhDokx3tO01cCTB/JaSLHDWJqoVls1KY3EnOdrBcRf0vTeslTKUrhDNZrPFbJ5aqoixU+oRKuqaBLj33cMNAHtx8VHoxgp9sT9WXrw4UgHsqSjq7ESCmFmsH8EE5S8Gu4HE7q3xCXBZ58tzvtkMnOFgzxYCm6vdVZx/bnVkq7COOmXLk2EbexJTBODVyL4/XVl98nUv/jV84XqHmL99+/bbu7iWl5evXl2+cuXK8tv4Q3gm/nDhp9XVx53qnOtja/zXaz+uvdaJT8X2RZjc1kIrv68fqOoxMquaLRWYH2Br6utuvSAZzna1WIlEpm6GMvlSMZ9I5ISpCDmJp1Ej2J4TayRj+TVlY+MReukA9s/Xi5UXYPfkwcbE1uij1BOWIREJCZ8YDXEC9nQum5hApT1+a7yYa+zKLTsZqMckd5y5gBsatVvVu+11w+ko2y+Humx5ntPCZlnltWJ5brrSud/rMaQfIqBxdsUve3yxh1GTxGefLDwu65gKAbdMR8HWWpoGTim4pq7vd0fJ7/DMK3lgs1LY+sBVN3WwhkC5udWyGMGxU9FcuJRLJbIZbKYePZ3OjorUbvTmzYvVmn74BzoiQ0yqceHFCpjZZWxmksmOg2Bj6gnaf4JA2eBCMPuBz8n7cEIVoY3eE0r2+IPzedRaim+1Z8hrt+027OMmOZWYPdO0XLl+b6ujmOuGV+8ozsuh6jvm0JfV8tr8fLE619l5QlLd4/C+Q9lmcJ8jeAOgz9HFO0J8p+p6tCTHtLoq6AZPajvEa/tU42FZlO3m2DarObZb3YNjtWuTN2Qp1bwoTGHXq2g2nM+kwEyIjIztT29v1u8cfgPYQUPlzFpt45Dy30NcXQPOBPgLt1HORQWsQidWljJPckhtsw+LRbHBLpkmv8SaLtiU6jCm7APYxYxYyVWLZRX2Z1PCVG3NsrHUF9lN8HEkp6X6z55u64O2YXhD2fe2fCwvAsmrrs0Xp7cXFmYR0DhH9JNrJN6zftU3PGQIjKbUtPpa28ATEexAx7Rt026jJR7wfk7Tq2s65haTkEtJYwAWgkgsnjCZL6Yymez5bIacaCx6xF1OM3AZHBQ7QC0bC50V2OhC6pwrUH0ZXVZK+0eH5Nm8r0ZAkbho0CNRmKJxxRguxjyfKI7cEtIhFgH+BdjBbAhssQ+qLZcNY8IFSDfOXZ/KhCeqqgyus6WxeJTcBdmq2w7AsWXKsvnU8/WhYbwx/d2dC9sK9j5U9E5HaezNXuhxFHsfovqxRWLv+DXfINMRo5q2rNnE8SWJoSkEfCozBqUm6CwFztDBc3pF0m77xRSPvCJdGs7BzwOaBBQJy6fkzBxFZziVTY/hEJZ0mnf5v5kOscbcF6dClVL5iBl/oTs37tz4G+F8504ANhIB0RzxhON4TCYAbewiLLImG3zo1sfAvhiNYLQC87Zujd8K5yfFyFQ0kdpTawdYTQ37uK8eH28S0ToAxE2zpbtbT4fqDuxyrVNTfF9R4GR0W3WnPtdYQHXc48r4S6T7Hb6SJJtoEUBvyXqltQPqIykFHk1g+jfhYK6hniNSCt9i6WDt0agtRCE1Dn8ByFMZFCOQtmgw1xk7xoLoCZEQJ6kodsJGBtE4FgJ7KhKqFMsumiOPFgM1QokMoEaO3DwOaInhyNIsqBFKiE2ECe2YGLTXxRG3P5+ZJI4OSvx0MP1Ash9gHvnkZGRKzOZ3ht3N464jgXtnsshrt48xQSywVned770OWA9gp8kqViR3LbDS4JhUGvcDmHtcnnvxz2COaM+iznZ4F4il1mY3yQoy8Xjm5QrvYe3XHYOf4PAOTS3nQnwwZCSWB5ixxgA1CRgkFNeNMkI1lKapzlHeGQ35I0yNBKARbQ42yCWAHUj2ysm6Ab7NkVtNZES8Y9i4HUBDVzBBlSNUNEUUCc24/XCEI7uOgAbiYMM5Aw6BmMqvmvUuOAxOUzIMjJmAlYsWGNgFsl4tY+NmHfS07oOiacl9jO+sG288nYF96uVhWSucjlT9YQxUTRqRrDMnlB97yNZVt+5hGCfJmARJLlczQoRHYCKZFNjZaSGXANAx2SwiRpm2jvDvMZEPQMDy0xjWjZ49yycNEdhgoa+BzmZgn1gjdEAeuakwptpHccfgIYneCSbEgmyTjmL/aOR/gQ23Ph2AHc6k8aaL+dTc0DC7x5sDQNthBKixjuHAuqXJYIUNv99SqqtDE/wZo9nXJaMNL/Dq042F9/R07wvPyN7CtOrz2DpaNpZB+gNplxOZZsvubsom0YTkv8OJWVdLORFby9H0d9CmiVQkjfTFeXCsBVAlTJJHHjXvXyRgNTTeBq5KeFcjuGFiZW1/4zCQbO5ALqJggzVCYDM+JIqHZJDmQzODaRYDjRX+mOmH0XVBoJjnLRDsVJROb7BOqlhs0H/9ympigVy7UDgJAradVs3d+rOy23IwbcwwujJWZ7TNllzZe3JqqX6ItuDszlyts4PdH3xXUVoO6RQ8GJMByccSgZJJbVO3jGZwmGLdt1Yj7ilEkRf4YXOJLA4ZC+UT42yaWywiMGskiF+JOM46GuXf8RTFYQj4TJo6OjVOwF4M8oXZ4pLNImExgI153siTYA0aNSMYNV770M6mt2H2BIB9PidgkykhWkmVd7ymZPWPMbuBR6oY0QyXbxwARK8plmSQfTboDuDYBIGfXv24Ful9Emt6ena7s7fb2K1Vwaxxh5SrgwcmB5tzBgCx1d/URuEFfNAw5Wq5AttTJLPrv5xdT0hb+RYO3GwnUOK7lxm47tyFkAmU3IVDMfdyhQtmUTIvC8G8hYQwEDC4GORCskqIk4hNyGgCLmzQVQQRKlirkTrloXahPqF18V6h4CvTZemqzOad7/x+uSa2U4Z3sW1KWv9899zz+8453zkHpm1ZDlSpJoWShqZKq4bjVtl1mKbjGLgotLfoD8fGPHadN9GjOKllK+DZ6ApD1m+FC5D8a/6XyxnLb2rirtHXY0kV0A6yGNbGOwNt3F9aKY22HnocUg22COxgyBrJHmyrfrw5U4dps/CRopopFkAm6jN5t1RYEtjXytsLe72t6cqDdvEr7uPAe+tzcggKU9zdr1RymdzT0urqam+5vLQuW/MYU1ZTJNbqp8fou7nNuiZqZRcRDbtguBJsT7aQBSWzdfx+0ATsRpD4isuKgh5jHDGDxDYpZTsIJLO5jPvPvs8WwaOsjq38tmVFTfh1VnrjHI4GYdtcnUePDm6CYCN3l6V7k9BYypAKGapYe6GrRnqrTOdVlwypdMX5IMDc7cKPwpNQQAfqNcGpt+uZXG56dbfamWyO/l8XQX3v3rcH9zrFnfbW/oPpSi6XnylcM9wYWUBfG23ea/XC6evjcsKrbTyagBfJGFl2tbouc9jE+0zmeJrhj9qmQ+BCjC2vvtxMKirxKmrg0MP0yQCyUZXM87dDYP9ETPtnEdSUkgAb47CZcgx6Emnb6mcKwFu82aPbFmGNHYrixI5RHLZwfVgjYOvbxy7BnQAhkTIOQX6Jfjx+PJVYXCrQc7+7u1OcbI4cfMFnHPzZ34beGKFf3wHzTqdYrO7stldLGLxSAKXkZr0lOpjdzdebp1fdvsr1v6x4K88kDSyyEtSPYxjNAtUWghDumxHuAhcBz2USP9u0FLAy2mhKVcawjPIBeZHLjQ2WiQxGkBzULABsHQyezBdbOmxCO8WVF3wePCS46wE+e72ZzrzIWWeqorJ2NtUgB6dyiQcbQd0CKopTU2uFEn7qcjfhFVD4FQybHMr1nvs8X9qZ/NsPcx+ag47hz1H+kpdpEtzfiizV93M3f/9+5Ho1N3uWcxeQiios8/gcgvp4xpNsyR6nRMFNOhJs3SdzIQ6zPnhPbPO1HMdGZRbGSx4bsmzUWyXYQU4nwbbJsrFdSJ2unLmXG0Iw4usXaWQRUoA9aLkcSjLaomnEMcW0TM2bVIAoVRH9PIQ19D1A21HFdDAlrtOD3DuscS0wUe65LFIguNHJRYTLE01T4JzPl9z8dLvaaTabH/6KRX/hr83RJjkg3CyZEGwWd7cq6WQmeYah9LlKPv/8Vb60fVVe6tc1+jXSQzJsc1Ahgr1bNh+RaHkRdJvPM1XhZV288S0VkmBzzxheo0kPDHDcRy777OXGv1b4VPSkDEJ8Nn9JbkRThgYQaCwW9DwJ94wI9hdgvONih6UiqBIy4SG6OVEzjpSugsV4Zi5ZEkEa9F7XPQIUPeX3p7gA3BcmrW272Pqx+xTDDY4iHS+hJ140hw7AIR8tg/pbsEdxpxjtZidypDtGpVLJQlw7Sx8ZOhGur8vrQuYgsRbas/JC2h6SPqFFnazH4EF+OuQ0fnq0Qe5UBjseh9oM83ZgiGzWrGG1HMSSaMatZFoCbHIk7Ea8Do/5efhsbbDaSDGqZhvilJS3D53D/dndWBpKnxRgM7VXsfgMs+sdNR4Q/fUxXauk3TL/XIiHa+t1VvNBJ/yoJqCuLa4tz7jHPQr8ehlMCyIGcHROBj46kK6+9Sifhe4HdzJ/B3M3H5qdTvX8KE7fPR3s2Vgs66RSGNeSdvZ3QQchPPPKo+hur633KpYeG0QbJEGx/ZYmJGZKwIEntc2ACPDg1uOMdpDB9vchR6aUMVFzrfz7jXkC+9fBrB8jzm4kMAQ2OFD/lJRPC30muU9GxFA/SgErV5LwCIRSdMfQPxjgXZsxM50vdKek6Ahsr1wo5Z+7e1f/XpNTLOuFl5svr9Zrh9cVrBpgAmTEzyPVYqc5aM1fz/55jqPZKVYjkSPibQgPNKwt0gE2tnOkQsnK1vKSEHhO3Fp2YrG8kHFiMW1sEGxNR3XMxPnFIlXeXmPYukhe8CHK9sVlLYk20UBCW8fILJUMm1025CO+hz9LHsK//yTAviMtI/fgWIglQyF8t3xMCnbf539jnBhQ4yocNv08QUNTADZWbRJrUjO5ve5j7mZOsOsg6rW857565W7X1xcXCWr39TEZOmG9kG6E0/60P0yPphM3HXu/zYAfSCy/Tvrofca5vW/S424QVaULAXZc14iRoiASDIVT6enCkugA8RIlEyhC5pKmPjzHBRyOfnisqkbsyBoPJDAMDL3QONJk3SqXWqTLxlyMMP2Lbwhss9V6f7kCsH8F2MNs5P1CknvyBsHGA4SsFGhlUNQUZB1Y9AOOiaR5AEsH/fDsoZRlapzP5Uw6ge1k3CVu059iNcPE1KNHibWrGQipS3t7M8fkVK66talaea/VaHiM1Y6cH+Ha34/vH/Wt/IAxvZH1sBvxio2ZUT6Kx/f3+X+dnzt4/EXSGTbqiMwDWc3s9PIhkrD3PS0UMtvXpQwa1YfAZoGSZkRNDuYw+YLNCdVCW/PCOFmxlWCz3w77DW08oFVarcsNeGyYNrORAcAZ7CEajcgUu9qQpe4fkxiPhAVz7Le0/hVQ7Sg9P+D8jiLywQGAjfE6yVy9i8EsLPp6LKQxjxL1QmlzE9VAghqq6W4hTw5bdCaT44s350YnKTTZ12wzRgi22+fn55FIZCdSrRarRf7AtROJ0Bttuo7iJv3To3ak2By9GdUNmV5AdSXms8lWgAmBnS8cyoRI37S7icNeLlfBeL2hvY8sBjP85DeE1cUVYrbIPWNAVICHMwR0xcEiMmHa0neHQxRvjpu51ubGxsNfhJbBtyKI30OJ+G9fApt5HYfujDYeRU6V8FY/Cl7B73HZVihq4d2oTQd2QIKN5RPZTGv76t0LjBU6Ofk08enkRAqk1+vLhcIy825yLssu0QXUK+ABQ0GFwG5Km63CyglKB7EEHXhYpYmdZrEsf33Dsel2tCM7ZP7Cy4/eNDUjpqhAGvo4XZdgB8Op2bOZdU/e2j9KyqV0LqveVTQCSsWJ8igogS02RXIxnAwOhTJ4c80JiSbIfmSDYSVRJ6Aln/e5iJeIWnko0V55C7DHh8DWAyruKXK7TErYuEPwUuKTBxG2BvkGhIKG4Q/yqmGFLdsnxs+R026dvnt38enNxLOLPy4+fvxEiANt8iZdxO/cF0DM66zRYHkPbCQcjjW/86jdKCO+Qybcho9o37nI4quM84h3Sh50COyYWKQ+TpjF7CATNIgQZzG/oU+veVZDYr2Xn81NoyAwPJMc+RGbbm/gdoRiVDC9IM/2Q1iu6bzmlQERgIcRt1u2nc7vCbDnPbBh3QOWPQy2yBSClUBSz2gLzAXIfI8RxUZDjZBlJIlJBE2VfAqS52IL+3hcqWReHzPYJxcYTfYHZmediL5buPDuRJdi5b00Yc0CWPENZyd/GEovQTAyB/88Odm5vfrvzs3xm7f/YVIz1JgYzUFgx+ImDhQ6uwB2vsAzvjFFIAENYndxfSE9ywm/wN21j8yvHQTICBpxMgWZmAWxmx2lGaIHOtu7v2/aBHbaHw1a1mz+8pKJNTo8fINK+IcrnBvBJEZOMHHKg/tEyCVgybMGsROABtZRi5yHjfNeI2fhAyuybCYtlgZnB5Gl8iOv2Y4/yOZar08xnuz3N/948uQ/7168EKPKTsih4BeFk+u9XKOBeWMyrRNOOV6O9d7nIpG7yRDmgiOQPYyI13OdrMHHNG/R8THYOLnC4XR4tlXqCtPmEg05tMPrfCOctJWBfg7BZ5UxTf/G9hs8nhwnk08hfhsCU8CgVvIkDHZAjGYI9gl3mP8Mz7obl6LmSB8+0bjEQAPrt6VkktiIhjW23CEjJQxc4YwjfRpNkVuNcorA5K/tG9PRkqc45MYxxScVdDQ4OoWbrCXaauXs1enFs48Xv7/548mLZycTj6fuP8OcOHIp7MHJYT+dbfyPr+sLaSvPwoEbln1JoGT2Xnbh7tPkacPdIQwksIHSJNyBgAMtFQuC8SEbgiCs9EGKYGGgpbSVpdJt7ctgagllLFuHtK6tjVJj0XHabewSHVrmQn1o44uzEAiGvOz3nd+9Gt3tXh1l4ox/vnvu+X3nnO+cY1luZQiGkY347eVrLsM+0RUsMu/xGd5OqE+fuV9U128V9uSA1+w4px8nBWx8Tp2NuHFZFqZ94+ueA5HWOnjQADinP9N9QEp9i4IBE4YUT5kCNdm2ctvKk2RMnpB40VAHp7osvLEbe2Pk/eatqld3PLBsKY1Vhxbe57MFLRgOiAoiEPa6PGRXIdeVK1IvgzGPDF7DIRLNqMAevI87blVHO1feJxJ6DEfk2PhirdZoNAeb5XL9Zb1cggNfHRzswIkvLs5eVru8+iYF7Gw2K49pbPn19xdPHEQ1z55VnsF0FcIn+EnQPnQdv/sL/7uv7pJqx+IZaavXAokEG+wLHMSH2xjFWy6/BK/tgd1zvQIe1GdxH3XM61IPuGBTnBDOIADXTEMlMjXSLqU7QPDiE7BVlkSopcWnJ6TA/rF6qyqyvirgdcH2Eq3V6oN8NhU8rMFIUltTM/5x6BFrCsUN80gO22TaN2rDtcGbUx0Ic1e99fg7admxWP/I1vaHWq0Ny246rVL5Zau13yo7zcFHbx/Nw6f86832xsbG1EZuMpe15FEXjtlnpVPLwrBv3iTmFdq2J/zjHfjN7w8TIzd5CXMBW4yzXV8U41oSt5tgi+1l/XxsuJB1p8eFmpqzgWzOCnGv/X+BLXCn0mmEaUFPGcUgT54RiTikhJbUmRWi18ZvLliH/Lmp95vVoaEqgB06M0SwD8u9eG1zAGAbYenVTQZUIU4y2HDYTOiB1Rn0GebRaZksV8YRo9Fj86cT7ICa00q0tdjJk4gRa06j0Wh3mo1WudWq11v1Bu387aNOpyPbaF5sbW0B8Sx8CcC2QiQ9VsTK4knSVVBz96tDkZ9yKrRkGvdNyV2DHyLqFCYIL2dKJ4QmfgQYgp/R9CwebpFc/rG7UQdgi2HneNrHDW8ro2dwIrzpTaZlcqVkO30iq2F9lpCyqU5qJhrDZ9JWf8RSCanIxvOBzaEhBTXefYfB4+go7kEVbsQm2OpwUPo9n8Z0KbEOpW0ZPq8dbwu0uY8iE2UDcga3ni04mqtT7pVneGUFdAT+ud0ZbDbqpXq92FMqOw6wn++0nXa72elwhP6L7a2tkeH8WbgRS9rAo5bUQ2SSWwzBocQ2ZHpfvP5CPgoVxOv4BXGA44qn05whySn5LMqZsmaO+l3DDolX5fcN9VkPJr72BpEw3WdxUJE/nTKPgS2m3ZvMUF5AjymtjsCb03OkFMYsKFNIOizOlSKoZDQM+8ICDNu9RgXs0VHmR/ARaO8K2JKwEqkPU9QpdfFewkMJjz/ey2TYmRSlLAxoUvAqZlA1KsjSsYBMJOGOgw+rncH5+aZTL5VLs4unyov0KqfbjTJMvOEA90dvX716taIWZArgliXc0h/yOBCQYqUkg5+HH4pLaoAHDCnOZphwMtkbNlQTqNSO3A0YqneFZ5cFB1X4flpaq2DYEwv5nPhZaghiRyqsIifD90vF2YTrFXBgfDpVdsyEREUuJm5W0stubpQd1SMLm7sAlcgSXp+APCp487XdS+yUCousTfr5GJ+l0+rvpQhLSc+OqIfh0EFM8BThB3BVZRDMT3W9BwVsDg89yXZSspHV+Z877QZPx1PwIc0GvHaT3qUBo3ea82/l4grYlTFY+BS9SUh+8xBdihglOUUkYi8bSrAfUsVWN6jlOnFgowFgBXNCbeLSOf03Kn1VhDUa6jv7gMUDpninx7ntln6WLvg42IJ1OGCnMyriEHGlTvrBxARTzpKr4E+ho/LL7fTz8LSeLG3uEmsXZN9o93VmdPfSMMBOKPGkDmtOSzKhD3xvEji6aetjw6Q1JsAkDytrz3CEmGCDB2Aryx4D2OsOHQbiR6dYLJYaTq1GPzLYaYobaTfap+fe4W0Or9RqDwdEpS0DhFw26Pd7eZ5In/06mZaUUEhFr1FJDQV43PRy+QJBlo+yGoNgK37Mh4XRRyQyRvUEk+k/cc2mGDblMeZx6XkSdy+QTAnLU+MAZH4OTDsiuRZOZjHUkiY+3Ok0/Qi/V+7JuIB9xvUcPhd1+Te67fcAO5yQY5Fp90B9drUAACAASURBVKgKYiapJpNUgO9/gm3iAbN5YiCgYb2OqVXtcHsh18ufHFsZRwxzynHWeQHt9eb8apsnJs7HWmd1lWC/wzV3uu00SjvXZ1mXXYFHmZqCR8lFLL+LNp8zgP3UBVtOIw5DFZIsiXXup4RRi10HE5rCOunjxBYyHckZ9eWXpil2rXhOhEwixKf3KNjAupdgpymJ8oYwJH26AcKjpHnsUBWnyxsQiotnE+ZHsHcP3MZoV4qVryGqGcnbiQQ1bSlmVV1fyaomWYZIOZX+5OiYJJ+hxq2FMj7dp9iITziUi7Ye6++/NC4jgxjRlErFosOgRlyI025ynrNTbgrY73CC1mdae3t7rdJ67QNHu29vEW9l2ooY5uw7T9NcACHpTELN9e/U00oylEsTNRlBSxyk9JzsDUiUh0iaCXN/H9jf9cpsZRpMJBsl1uKtFHP10Jb8sShTAUeG8TS9E0snPMzi4uKoFROD502NAydCx8B9cnhps7pLWOV91Cdh+0HA/uc3m0/idiIgZq2OJVcf4c8I1lKh8B3v0+PodEbqDGjkZKUEXw0wV2jjoSs8fVz5x8xahfMpEKfPzhYdOBXYuNN26FUaOCY7c8T6tFMu7czs7e+Didfh1OfBw8cf/jA2fNbC445Tkx9yV+4sxyddYQyCLIM7LmQqu9opJw4vQdKa0NgwSrB7hQkzOCUbBvsbZ3vCjbEswPYq5DBt4wirNcNhycqbpNoszohuVVEHW9Q5fv7R1M7j3KQzhb2J/7Um85c2N6uqX4mXmqTjDng5zwFRT0BlEiwWRGUuoORogTWFe7or3Tw+NCDoMygYwvHYx7XZTOUEAu5kfte0Nd1Yvvjtx/sff7038/cK+0InJoBz0SnSsRRLdOGN9rwCu1G+DrDBxEHFy2Wn03FKxR74lNsXruSnhIpvbORG7tyOT0pvBKE2QY+Zce13j8MkRytLZUNGVOCCMwioMBtOG28RTo24XKlcHpjKWe5hIDmktC36VcZq3lRK6SBgdYxckk24ItCWPKjE7LbSUVOmDsqTTjFNamfSZ7MjS/fuvTkwZp87Zk6mBFy9df7ewkg+hWMlI3ZKlYRE4KGM8X/mElDDgEcKT2ZfRi10Cbhgxzyw8TQv3/3jH86du3//u4+/7H+7VpkQlzLbA5cCKGfXFxebHQ/s+s7a3n6rtFOql0/BtMENcTPKazuVnx6uuKEPwR6etETMLFJdPu+mHtMLBJtjrEUqLSGgRGYJLeAjEVbUj//kcsNLlemlYZkBHz3Q2ZBQB5UJd7cOaeG4+oppqswcZwwTJqbvqWKl5iCoq/BO8yUDQQOmcWn83j0x5qt/O3/VJ4HjGVFECfW7kM8bHE/CiiPOd1vEfv6MQWPRPtkaxclfpAgh+xBsb96fi7auwOYlgO+9XNu5LsunbixOEPKi0+zAZ8/NzTv1mbWZmXJxdrZcXi8psMHMAfjazuLPsotsa2N7YQFgxxEpkniBYLoj0w05DDXZiOv+DnQucgv0uMgW3VSRmPZjKTBHu0RNDMBNkcaYmtYV3YQ5pCzJTn5ZmUfAdWmGCfkZRBquh4G7iaa4bjaoswly4K+eaQPsbuaHmObfz/MZKjZ5IqZtXUqP5M6k7J9ulJIyDoVT7FrotmxvbGgCGCxfFLA/P+de9z9+3J+BtU67E6971tfJC8FN1hFglvFeKtVLALu26JRxZDaatWapDr/+lpHPixf//GF7Kn+l0N9fKMRMiVQTEu7qUiLSvGb6WCx5sr/A/TF58MhJRacJL/Paw7evZBXrC0VVMMJ4RAoFporLu+SjsFlbNQSorzHZyoYBuvkklavs38P/kUmz9T1s6oXC8NQIvLbb2XGmu+B7q1r98fnUcIESKBZ12OjL9hhOAFPK1k92/bFCGZV98F2W7XrtgI8RHMC+9qdfAeMvv/xcXWLi97/75Rv6FM4iW5w95TTIxP9D19WGtnVe4ZtcMYKN5FAx3UEmaIsuhcV4xXhYA7NgSdU6gcEGuzELi9OhClOwqcc2CIYsf1LC6tCkjOJ2OOwOR4QEGhcFJ8tdkvmjrWLTVI6xA06mIv+IpT+lIEgnDM7Oc857r66c+HXjOJFw6kdHz/uc77yVA1sTZ5fzdpZ+5en2zJWrJL/pEiXbp7Oxcf36/XnM5jt55FhnOMBMRWQRi6nF5GrJWudwnIBGU1SG6CezJNAS2PBO00P9SmEH66WRElvSVJG1R28PpKBUOKXJvA2wUfjP7wVN6tah/5BqwErO0PCx4f7MyVPTCwpgzRkT8NePf/hhpXKJbOVsov3oUVSZYfdKkJNcarrLnmDj+/sIbF885AGbf9ZOtZHBCN364Jdvw6I7XKyVhYPEv4ONE6cggUPKMEdWbeXz5HEWLIK8nC1254lkTlTLBLacmQ3Exe0Lq3eOnzkCIRKW+RExKVDH/8gxWPQIloitXxpfPn7t1Oqp8Ull2lCSQ+mjiOq2tfnqhZFSYocleYGGLlsIbtIjST+X8IZZ/kFh4gcnpY3XRgWjTQ2SHDs5Q6HhVP/IzQ+n5Yb8uG7ZCEJdmpwcYXWdSLHzCQsnagho0rCk7zkiE81OqGBAMWWooetX3soouLz1+luvgEYiLcq0O/AHQj0iLA7AJzBkx7ZBKvB68nbBzltk1TniFKtWJWen2OeAPbNdLNNrws7P53dQHDw+jC1GsSPYGci0MZmZG8PgqXsLDx6sfmnbv7CvrX/EriJr9SE0EEKmt3tKfpFpRqbgebAHCJCoYSpFJnO4AsTQhHYKcZiQYB32h5OppIAdGo72j596PC2Sr87ZlVLpW8a6Ff8YQR0XoU3fSFp2TJUne9GB7gvKPVq37PoQEsDdeeub914leAXqlkgHTgt/dkydOOV/3311+x/vM4n3TBDgcDfJ0J/SWctBildnHLD7GOs1eiSXnSBheO3e/Dxo4ywKslE9Obc+d2m+sjD95WP7GZ2dHfq0+hBBEE6OEYsQ1uJZt3mwFgrdPasT40/NOMk6goFBJb0D5gBrC9hM4zpvazKSBDYc+K5AMjFZegzTbigZXlg5M7eUOQulh14lHgkdZNFH969paP6w6d8D7LARFcPm6zHkzkHzgk3nk3+/QVjzgV0z2C7a+Dsh8S2w+CbP5rOvijQkIbK5uZmFFD9RB7tMbN6TzbFy7Mla9pP7944fP3MWa2qw/mbhAcH8d/u0/WwHSPN5VrgEocd1HWmEe5xYC3zKoE+YG8Vj8QCPhQo1eu5GgjuL1LAbt+bA54uGA1zOg6pswskwTMNksMn/GBpfmVZOTf1yLP1rMjMShfcZx053eIQ+wjqOGjJ60VjIvhhsQ7GI5FfrYHd50T4Svvu3lwc7WhrQxpfyu7J3vBiR3itM4p/dvo22SSKVfI+1CciL+cLszIwX7CzcnpyVt61yfnHRxvxEzA1+cGqV2P90zQF5Z+c0f66dHl1KcxYcXT8qjoWIq1N+4JM0Ips2tm7vAhtTA/y6puocJYIErR3lhBl6m7g6zDD9ptnJo7y6komxUgPYaDctLWeG0CuSSPk7w4I1vaGiBsd2UGjt3wtsvAk4sZ8KeWnEmdMlJNIZSsb+8tteATjiAZm/YLDFyvnwvbnvwB9vsLfJFj4BEkdwsE9Ye2ab1HdPDiSSzeVthA9rYHdEXcgpLT6r7tTPf5wvagtzaRQvoXeQN9GwYatwiWhtjmwl4uwj7hoBQFKbY3+qaV3nURcoGUG7NRpMYzBJEytQOsHZEP9GKvPt9DRPB9AEarLs0lx/NEXMjsQ6uvK4EgcBbD/eMvQv8Td6EeCxQNTXipK0JMD2LJ1QYW9OunbGo6nXf96srLlFoa1+F8P2gE3M4nAKeZusU+DfWxxPqWJF9czsdnktRySTs+w8/cqWa4UimXjeoidUi+U/VE/09e08d06vjqdBHq0omXAqIYNIArutMUEJR4Ww4VzCbNxdQQZr6kYiyHHmgGG4YCP7m0iGeZsKugL85E7Rc8m89BjKZpJDcwQ2qoQ1R4pUlif7UQNiDgyYAwQfYtOtmEaAgnadY+gNnXgcSOVdiGhfa21lOa5z0E13nqerFESYdzC0JT75zX4oEI9lqyO8EqH70vnbiHNcZfgZeT/nuNCkyFHxbUKUNMomUYidI9/HsgG2bfeU6bFCd7nKvv9uwGt/vrfE8WLOzbaLf0NyZKh+P0oHASIkXOonrfqciiTHP8rpdOW+iHWjyRaJSGlp53yDZnINBWPdRWCvrHBiTJPepXcrpfGhRAgDLkzTHPAjnIUKFNUE7288DWCjNYGuUk4+StW2ym9w0phHFhhGHHOj2m/9+HCvyD3mZg/WEc9phFteh97LWy/h2rx9FfMXr16FLMwT2GtrxBqWtWbZVrbbtkiWILO5PTubJ9mi2B3rOX/ngm0vrC+lQdeIsWGrQZsk35T7KNXs7apOVwWvATbnAhHbbIcu5ACJ82A4CTkSCxv1Tlx+N4d0BXbm5kJFwOZcb2XhzFh/tFPcD7+f02u849MbfnrBMBdNxb6QNggmtZgzrYFHbjC3cRVEnNvg2+L/fKV5EHw8KDB6DNuDdwc5mYMO2optyMJ7HS0OaXjhnMiUr3LwM9dy+UKe+MTKIVKYq23PLpJlP3LOxsyJdxTatZ3a6vzkEvxIVDQQ0KifQPJtqO7TBIVI8OMERGwzF/PwpjhMm9uJnOEU6BalV0Ac9oalGyEu4wCN3FwRsB2VfTKTSWphP1pH/NxoALEZbvAavWBzpIebxALIfOIubVdBMt1Jk+qIIZADSxRCgpLEVuKDn/20ube3V6HtkrSrT+RDWbZcmsLpEbF1ovGtrZ8cuKhI5f1ztyc2OYhCVEKq+ynL8ay9PUsU44JN3k+tm4intlOl88x+wjHadBrdTOvrvKAzI4kJliRELNy04eMEL/vlDDaWEobD8ZTPx6at6dK5x3113Ji6C2xy4wJcM5MisCuVytTUlCY5m0plfJK88oCJrItJdhhEeXHYaJhC1QA2qhn4tQ2giR751ijRFpfHK6wl9BpwSixg2t+8+fumpuZmhnvQRbvOKIP1+7GFPyItXr5xbJ8DKjcgDenA1yxa+SI5mmvwcJ7myjV4mtuuZZNK+fT8+T+dL3Yj0FVYRIwWw6LH5+/P875mlQfihgeVUPbxBEnunmCwdX9AVlEnUWJgqHYaXarBMAkn3jiyi7coB6BG4omhsVJlygEbed7K2NKIofGlprFhQzruqnxqtGzdaZVH6Q48zSR3j7GvyYOSNCmTj8tLx5fA3bd+1AS0m13rVrqEzbfhwnROxHlYHoB3H1FR2q2XLt6AhTOHZ/kw3uRqkqfZ53g/j2okyLut3Gu/QgKusPjk6y8ePpw/fufDC7ZdeHL9+sbXXwBsbi5Rhs08gvpqTRp9Aaxm8i6xeILjTpIGczoFtBRdm41V9GGuMSTKjqYnx0uV0alRBTZ89bH0iNHFQ5CkoyMal7ki+h6crfjYrVYh91Fz3gkm38dcBMhsLVnZttbW0K9fbW4+uP9gU/PlXpe6Ix5oO7x/aDgu2BF5T9AHIX7o8NsHLkqYljDfzEJns/djLzrOzyNy62uFPEdXuhHaWvzv/ftPCuwllbl4gsFug9aWMgdJswc5Z6NGcLGjwTUoiDwRshqXn6vJK5qejGILe4NXrXFxUFfK99Hc8vLy96N0BOwKwE4FupC017k6MpHUdRWe3eOC1PWwpHpB2XAfVUGMpiZUcS92MprwKU8Btfipz19uOnjo0P79TU2Xey871B2pm7hrzB4B7nXvlRwUkcLPGCR3k4TKDXDKVZkEv4mIYdVxfh711YrVxQKyE59aPRZk4/ZiAUHbNTDOiY2NDQFb+qYYbYlMiSLR3OHh4BF4y6jkCciyA9kvS1SejO8aRQfb70KMujU9Vlr+XsCemiKwpxTYXQNYk4UOhaT+fI3ZLjWi8/A5jq4iUpaS20KGgrEM4iRz0BFUsGzf3TcPHzp0hf472MS2HRlsADvSCLVLKK4kdKGvP4Wjhr2X9x0A4IB7YmJi07LY9+H78RGKUGyEs0i6vLa2Vs7VCnSdIryVQwEzwGab9g0J1Ei0q/0nPEFSJnbK7Bb0FnGXY0CuRgO1rWj0jxu7Y6JdoUCcsGlNj99cHh1VYOMw2AY4hgtV4ZPG3GFQe4AdFslPJMYx4GRMogUc98ILL/l51WUMW2lrPRp6743DW/sI7itN5B8K2grx5znj/4xdUWhb5xW2J1HCQuwSgW0oHpmRIU40MTSXaF0GceQ6q6kSd3EX00IVg2eygMMMeQmBDAQtGZMfZPZgSmyi3CGMNFwtymzaW3fUFUi1TCIS7gIJVuh9sN0XKSAwDn7Z+c7575XkWFmuwQSHOPLno+//zjnfOT8/Q72tNRwuWLM4UdWUVrdq/ki6uYZ0kyilzwYbfbZKjOgFDQn0I/q2YoAeXc14eqtAnP0YYLtsvGEwVHJbNsG18CizLLzpJNakkJemMCMkDvmXbk9ynGQAPGOr174D2PnneZtGvgz5Afahdr9k6TxU2VLnWagHW5pxYBEZpglIBsNtDGS03OWpDtDz5wuDd47RwYbofnNe0LYet3sfpHur4S0ikH8xraxiRqza+AhJ997aLkTWVKmN0HYqdbGYjgfjxlrcjHxOMpGA1nNxVunGVmH93v3HxCJSF+Ej0ituHdWPbJLlI9YKEUe3X2SxPXTLe5zskefqLlY+rpwXxiY//YEjewWcPctgXx/3D+DwxADl8AB3ZlpalOVvX7BRwIXhHpVYsEg797Jly4yy+FSnAuW1uy74H/zurdHm483HVWwnNhMK8qrKa90DdVWdINBremoj8yJN5hOEMmA2s1qptK3RQfh2zABBAO0Ul6ySUZMUeDBJmSYK5DkCO53WskjyCxsrM956sKsRgoY6LzUUOoEEQUvFxWs8m9pk2gh78/e2w7s51WMrkGB9hSLbopFrE8ODSC8pUJ2DbTVNmAY0wubZJnH44RLEAVb5VlMKB+NLDymS4dN/HgXYzcffSiQS85vnNa20owB313CHe8hOaBTsrXVVE65SAWT6LpubO4jnmJ7JRE2NoM7pBToQ4UKBbxBCm8B+FExz8pOjv86hUIjuD70F6MjUP51RRj8bZK9qJ7C3DDqh0z4nD/G+G97OgIGmBtcKnpS9iC7XdIgCO38lz5FNBySDnZ8M+U+f/LDd398/GGhra7zh1gJb7RJEZo9ph4BY4NALkqiuB1rmMZ0u/50jPx9tpuf48eZE4vxC9FF0KqKVyoCbGWHIrktZWA/1ulVeOSTkIeVASt1L2lJ2SSttlyhoScaRxkibwWA8XixsZHJbRQE7BRoxzCjBHAvmSHDnojpUeRqRTWgnp25cH2bnvc8eq7OwVrTdztVTcYs0NQU4tH1qH3Cj3lU716hdHgL7kzxz9hWKbOHsH/OTY/2U8gQw0Hmp/XXAlgWOrEXg2Id0EScnH4yulwMbbyrng1914QIDQpvA1qJf3F9fJ5Bip0rlTeaT3iG7UmVRs5LWbsXLOzvbKD/lcnrSzOJJZ+ORZB/lMXrMiEwl40TEGxt6uniRm/DEJYt62jCl5QP7STJo0hOLLKM5MTUV/eZmSCpRPMVYE9cS5pwwqi2gXPDjjJmIhK+BbNCX7e6GEZDBvvYDg01o8wF5GaT9bHU40NIdQJtmf6xfOiDBU/iWTqdksDBttCs/Zt3aJKeq7SCJPP33I+92AWzSJM1a9P59ggNDNbqp7ZQTgrfAy5pjSLQGqfKDxDoUzttpaOjM4r1799b1uKFpWjobIy6OxtK5Qp+RPZs001vEKDbY9GmxEKO8kjJ5InScn/REktiF/tlnU7eXl/91yeO1oJY5bowgWa+cGINSGRmYg4uhsyXgEyc3QruhT6yb/Xh0THlrDshZS448Ww3dbEeTAQWB1wL7NK+7Y8uFPwB1z6MUfrsiXx/VahrY/8v3e3qOjja/QWgDbEYj9eQexbce0cDftjyxKINALpcPhIk16H2vZzbWSRojZIkdYsmIZhhEv3E9mO6L0m9M0yhbJ7aIGww2IX1xt6DHuDhI/5zSezYFLS8vmNmlufCBcjl85hJ67Gwj9jltIqmWAKG2JeXAJqd2rOhyiSfQ0WineBMbqNgQPzaDEzIvNCI8Mvsj/DntPKvT1GAJ+t4SK2oDfrb8Y0obe5OUV9ZX6+bawyWer/5wrOdwF/NIx5q+LoohpeI7F7tbovhWj0g5nGZaaQ4xTH/MZQA108PulpGcMlHnIywxohNMmms7YBnk7KQzdndR53uRywUjFMuoWt2mj4WF95aW5q6GD4O4iJ1GzwSmL9S+WjFeMt4utdGQDf5WsVM0AdBufJ3MIUs6YO5UIjs/qw5ICu38s5nhS6cJ7A9feS1eTQZJ/3EA5nsMafMiIw5rma/eB20pyl8I/OX9Lo7tjo7mnWDmnl0vwmHGfGIQYGVSGOzcCeYKhQIJtSzpDHq2jcoiugKppwx2X5K+Ao2RJqSNU/GssQ2r8bZx1+zT9Rx7kQlnAH2bCGN5gaL5HB0W83Igg6jc7/5tgMGuiWs7tNUbEjPqHNyc6AUGZC7PqRyY+1tpTqBACEpCun4lLxmkVKKgR74N3TyBZeaHHI7XANshZ4VHRnh4+pdvi3P5fMP7Yi1f8fj/85uunsM9R492dXTsfE5xmqoBm+J7faMQxVbWqSkk3nQQFnYrW/FgJBsPQtGRfk7JLMiTD4qknIMmab1kzCAlHblLRyWdl/QO0O5m45Sz55LJKeHlhexcqbRTJtZPVGWmqMlj//Z7qi82ZMc1PpT/j4cLlPzCsSRgc+uspfGV3TzQJWDnkUHyAXlZHZGTM4OdMtj/emDjDUUKG5ZZOihYW3tcMvng3CP95EtSlB84805PzxEK7o6OsnYrs/hE1edEp8HDt56JJiOkNDT6ICFXqcQNM7u9Hcusb+TSDLb8bipb20Y2yxoD3ccI5BzkiYlbPG+jTqKC+U/v9IyymreETStpSZUlDc39c9jjrQ74c9burYlta1OT9Hh55MCv1l30B1ocja9Hb/fzJo/pybzIEQb795fVETk+EUCPstu6vupVYHOiOuCTDlJAhbVaAlavVevBdnp8D37d03OOQvvo0Y7zd98uLC6m5HnKH2DvQo4nD8C/WWKJSoww1Iwg5LMNNjLDorG9Rici6YxsEE0EM24KOd+eAmssLC2Fz40mfsrNodomp1XdaiWsE0tfhaY9XrbpyBoB+uyzX7/SVTzzp1zwnWLwU8uAHQ3BbkO64fNMT+QlqyGwZ2VGD0nkpIB98v+oEbtiy1uKfPwLlqEQj6VCrBaqs2aRI75EP4rH+/Gdj8Lhc+Hw1atra7+I6buLgBttWa73p2DiM9KatlZipRaJI2gJw7NJXS+mjRe7/It5CpmhBxH/eCiaI5Ek2sGC8txcuFxO/AS1xbrqbGvrnoqXO7EEOzwmR+Ac8UpgWxRi5WKYbwhI8Rptk8F+W4M7XhHaONEI7PFriOznV57Xev2u3ZwI8GX1je7/Rje39p5gNk1BMPllYMdZu7rRJkHV2JNnLLS6OvNNllI/NkQ+ymQI6l2sZsCzK2KtIqMHa9kIMUOQBDRIRctyhh2r4F98AKFB2SCHMkcyiHmZoF+a+yjcUx6lM9CyukGvHxwStFVHs9WtqrmUNDVnb+S/XYUpTdIzWLfZHOW1d8cxtfBqVFlO3sY/uOUuptSmBas9612+3HwdxDt5evx6Pv88z2DPVsGemLh5wtHU1NQYbIfNINzn9LlkfNjnq261q9OpTuWiA9hcn4cP778r0eTyWUx2FCg5ebJYeVGMoWNVZCcfRS2BHTFLJcOMkKbL5dJxxG8JQzbY5FCx9RzfscyK7mdf//Y9omaSc4n5Ebv6rSqyIwR2r1hmuRlUa5toHTnw1xuwSisLYKheYfvUzwO/gxN20xasXcF9JWraqX+wiYUYOvG1YMMNxn0Yl4ANHnkONTKraOTjiYlA26vAtuFu46ogjOAuNattiw/vXmWt2tah0Mz4BG6feryy8v2NKGXaFKhbKN5fLG6lt+JFvaDHixLadPCZpmZo8CnEdWQkwhQxrhtBzsUoaeQUcIqZeS7c9UbizYMHoeiGOHLdVoO+FwVvbibbDf0q1khPS7f+8fAhob065vHKALtaPenkHoJP+YtDiO2AumMKe0Kd1mxZJ9YEQ43tuVysxXGiCrbN2SqyP/lyfPDSCUfdguxX3DUO5lK0ZmeIIV+9sFZo018Oh2aufxGN6tEb36MBmNXW6EnDlophU+nE6rGtSgoJ5cWccYooe3vNwEqSAjMznjiIO5nUb6GkISiXKJibNy3OcIuoa5Xsk6Ed4j/TCemWFhv0XhXr+ZF5Lfrw4R8ffrcCKglxXdundCp3bJw+6xCShbYy9xfot9Dmieb/UXZFIW2mWVSrLLst0e4IcdhZn0ahS90sBEEfOrCOrg+CXQvaCSxUy8ShOzDCvExbZF0QKjOiDCmMlBkUgzWECE3HBN0SXJj4q4nV8BNRSxmzbGCT+BILgig+zN5z7//9+WObzm4sLdoU7cnN+c6999z71ckW+KID7lqVvZlnQ43Ijg5OWTj71pc9/wfYnCHVWBIW/uGskV3I2WHJ7duN66gkt+qLZ6njTcpYCOyuVA79QSaGM/QFjzgT39e9f9ycXVhYwPQBLzUaH7/OWg4oz1+nJBDcTNmJSk4UO0sQd18WOS1WCXSGb//utv9c3xgdIpQC1reTAwMDyWQcVOJ28BQpgkc6ZTWVxgSIQ/rtbTwJJWCrm+4MO6C9rsiHea2Oxwka5YB8NTg49WnZgRpeIrAdHfafB5v7QcRRxh1NyrbltKJbKcibg5z0TuzbjWoRFCli2pHvmJTdLKUfrZFYrlXXNA3LdOBp0sMksxcz+vwCyRB+EGOMd3Fu8sKD9OQJsfe9Q4jmblVBKbTNgCD9cXFkXAf3FAAAIABJREFUCc/K+pW3J7v0wXSg2ohrlMbrm3jwAaaf8WRSY7RXmLiZp/ldaqLtVIKqkS/aRWhzKi504+zgnKNKRmGKwYY2bnQDbGKRlaQ1sj9zdGCorcL29sDm9dlsJ1SeT1Klhr/Fmjc6HIVOjbOSaGQ4Bg+kV9d9x4RFemLeS/lKjqgC06dc/Ixoi/0EPHgjhOIcVAZm9wRlIg3KAQMBI5pd/KteOY5N7VztOlzeHt72TDwZCbi4HB6YHv3+17fxTwwDPk5JKXcF7s0kEdkEdnIFqsQhSQGGyTBK7CgIK6ZLmX+x16qMvRJtBPFYFhtHbA11zewyUZF9kPyibOpg6i5H98EDgI36f0nTex3XdeVWHB5uUvqj4Gu2ZGLGpiRl7d+Q7We/9+m6l8CeHZ/3hlK6FsPgAAZo0jCkxrCdq6treVkYg0Ambl6+uU6y+Z3DrFXOFbry1ia82EnynkwiEQ8OL4/4uWD755l//uPFCNEG2g/GO4BruZf8gb+NCtgDY4Q2VMlHvMRRAtuNpkKNs7BCjqvbHNpK/KFDJjfcVVUVpyTYKUhJJCU1DPbK2k/KpHP3038/aHG0fVhmK216F3uQ3GRhqB+DSc7XrwXvPh7DovMcH0Taexk90soA74QWFtJpXyima/q81ys3IDBl4MGkgbGameWbEs2kMQptyqJuu2FhU3zM3fbs+nAiHCa4PbPZLP1j+jwe/37az5NqBtbdeFy6ECh/8rUB9uTAJMEd3d1wfyQLNyiw+3hVVY3pcDXRrqhtUU1sEiRo5BTfYWizNQDsZpA2Msi5ucHH3/1EnH3AtRHM9la2VWDjg81W+mS029Vwg9NIDEX4vV5QpcjmFWbyd5DYu/EIlrhoi3QUhhZ86a4IdjHEvF7KTFDSpywnEgFrMGlMj4xcKQ8EpKJRXV1vURjF3jTlOlYzUf78fCaMydQE+Cq9NHLz63giPjwbcLkU1wDrS5cuXggQizw2wB4QMokPPXI3VvZghEwEn0EhhdhG4m63c59bYru9zXBsnwe7GTMgqI38C2D/RyL7AOfjwf12Z1vF2wKbbT7c4bTXslvENDTXqI02xWVhLjcYxw394DgiMaC+qB3FvONpXoORQmOQI5mFBoU35YqzzM1CzSZnoGPTpJSyxTllsXh3N6EIEkBgP336cmsro+tE3i9IbSYSw+tZl2qvMdSXLl4OBLKbP1qxZrSjGGbvM9ha9WycBleyc7uD1wbJDSdGHU72qJ4HuxnXJAjYr5IU2VMstKem7j5/hm1qDbbe3regLePZFVK4LpbTjnNgI7JVUPRxDvbJXjyDWD4j5RG7TrCmmTToDBwd/fuoCA1B2c/unSbTKCVWniaAXa1MruovpR3/22zABRRdfjoN4wmO7K3EfoLYJDoUjW5FgwpsF8kYhDXiOntvYS1JBIJHv0I7+ICzd/bp1DhMJrFUIlo67LxGR+2awWKA4pU3xnyzvaqNwZ4jsFfWvjOsDPR4/qylpY7n7/CylGARMHZVhd2K9RvSGLPhIfU+J6YoiFI2ENrYWISYxgHoMZUGqWYpgoqLxMRUTR401YvGk6oSCMN6PDY1/eqvS3luGPuz+YlgIgEFSWCTan+5tbq3iqSVwG4y+mwX/YELly8E3isv3/zq8aQg3f8NfRiyJP7DxkM3BzGLVoMMjbk9WSRll+arVDIx4Fs8bc53ueGExN3tHNlzdx9/IWBTKjn1/HOAzfMZDSXABmfj97ZirAu19nOfgES4uNrndGLbLIFNKco8Fmlzr9XUcxTOF7u5ra68rcojYpAIh2STmkloEtFX320aTf70mxcT6+9QPhjYnGDWCGfoEQ6jV7m6Gk1ktmfyrAO7CenLhDX8hlfLD2d/TE6aFMJYj9E5ufJ8F/cu8M/ucBhGeXP1p+xIs3cWdJizQ64ktYLdy1gjst3PENlzUyT9CGZx/RHYnQrs0iSCWlaHmTqeq1qfK4z08fnp5EFxgtq9uxfNeCJ8x/fM8gc3UQa9YjZ467l8oUzy1eIfkdJcvQpt+qKryTL4btp6XCMzweD28lL+l/nrQcJa0yPz3nRskbuVW6tb+550niUNkbWfDl3C+mr5L8oPD7/dFsY++8ZgEQJ7bBKihBd5k+pz9PX0YZZMXM+yZJW7klzLl3SOt2uXVRVHtq2u7k5zbUdPYw+D/WoquVYGl/Z5sN9O2BzXjTX/Q2Tz7dZc8QPWn9wPxuPDE1w3unL76nsgDWUSkTyw3lVEDtVFOk8gtqx0YEcP+3bqXSMT8SgJ69HlieHEViLTOkvvlhOfJq1h4hPP7GHAzxMmGM0JENZX33+//DD/lXk6Jk2s6SO5MvSIJ8oITp5JcKjFX2pKtb2Dh1uMhdlc1i4e0uglsGE2cDo+uw8WmRt8I9gNttJLXHjGzmkoa8fPRLYqkBDWDx9ufB4PBjNBzzqTBsHczf1zv9lJ95tfCOAIE2C6+Xkuo2jkkmey64yfCfHhx1fzE5lENBGP34pHV7eiWugwe5hPS+setJ3IeMYptP0BmN4C2Wy2vLz83SvvnsxGtIH+foYa1ShGe0xyd1KAvIlMVgoY9rQaFduUyrSo9zdfu8uzY1a0e20NpLPvdDoczwywV9bKphTahcguueuirkqwdhY7nqzB7Dj3EhhhvbGxFySm9vDEM4m76elpaR8YhmpcxtkVUw+Sf0t/mM7neS/G8vj6MXfb0XCfTfMKmNPTVCzWmiaNmD9BDJ+gZRaPU2wPa9vEIaGTk4WItv/ypdgkwsTZE2mxQ5Cex7dEMwImFHSJwuF9wncMaI8ZwZ1MHhDaArd0PazVNT4k29tVeQSz67JWygp2rw272AjsvwjYrw4evyGy31YXUVhbMS4V2fg5JOl1b+ytJvRUq7dV5xGLCC7+pgwGa+QS+5qmUSKpweSEbZXo9+pgdc5yPFomo3t9XGBd9/m6dHboiK2H86H10A4vJ/FGtAx9QSbcU7mQl/0l0hnuP4vwIkHv+Dg6FplEhlQR6fuIrvG33NpCtj5WnN3cIgHY5+D7fmqsfT417G4YNuRrsDrWvQ52s72zse/+/bk54RHLAfllSyfp7NIkwtsSO501r4m8EpENRiO9537ofjSU2U9gFbwvdbavnWKsC8Z09v2Hj1L0yKW4Kca7QW8cpegJmzxnF6LsXj/N+brS6a75mDe3EzNN10/PUiHMqod8gC2GApcXg+tiYk1xaVwawzeO0J1AT41eF8w2adop1gmGsOOYOT0M+hC0x24gtkErJAA3CG0pjViaqqJHCl1Aviy9o6rMCnZFhQF2i5vARk6DI7JsUKENnU1gl52j+mJrpmFPLeV3qnwtsjFt+MPQSnI/oUci8PFq2FR+nAeSyN0XF09hHwth69bpDW4dnBGEH29yc/045AtFCHtYnnyU3KeOjdV/bGSgFwu2shBc1hF4GULHsJB4Y9qiFgsdsYkVT2R/iQ9TZDt4+eh70WuRwmRZSF5gAdukbQntyeTBHiU3NfIfYbCtdgEHz36an7bUlhV1yW2917DY8E4P6QKObEJ7jmhEdDbAbq/9EOPuzfaq0li/BrajJNqYcXBv7A7Fg0mNwV5rzZ2eRXZ863ksrsjFTnMpbfEol6PQ1rUjinMObQLxWyLYPCx8412wO+VCvp3jkJ7JHKk9i/Tb4hGvCDjeRCfYG4HdzLvzX7quNqStNAunYylhwHa3XSzbUhi6Cv1au+sq6o5L0brtjChxJ84QIowtq2J/ZEFW2LgSCwGLzmi2drB1oQ2m1iBGlNZq2rpucRRMm3bWDyzSQYcVWtM/USgUpRT2POe89yPRPe/Nzc3Nzb25z3vueb/OeV4O3lh5D7CRdew4hdzr6AwIfQOOAKVArDD468XFIF/y+csxLhkJ7umamj8ZluTNi6fV7DAgHa5mzww11ZL+uTgpWKygIGPvkdzcc5lUGYn+tCGGBAUkl5G3DLC3kWPLefZK4MbupFGCHUQ8XcDBdO3pZHQYvfPLP/ytZnZcwKZW+b2yyArBGIvN8kwTs7PsdvqezcjbWHD1XnyzdzVUFgyuQmtXONwOZKIa2D/SM/B2JDgeWHxHx4UWg2SSQ50EPWi8VmYZbHZTg0/gW4DdTtCuhjoCwcJILDK7EhQXbY5fYrClFmLuJqm5PvWkXtDWmsPaXYt73SmDxSsLlApm15qCjAJwzZVUV7US2H2CtoVNCFQ72lhbdbYotSBVuR0rQg2LCtxIERti9BDoVc4Du01ThkijC2NKMNek1m+mqP1LN0FGe4Xt5Tj8SSXWYnZlZIV7/kjeFi4qzSZFXIU36moQngsECqhbZ4JUD1mJac5nP4q54ZZ/qLNjZKSskI5r54Bqji8IjpDNfomh+pdwQykDW2MgNN6JwIMgBzAB68XYLBjS76vGTE2S8EBwteKzTOrdPHDA1BGHRiRmDFLzgPO0U19+WZBW56ruRs0PaG9oYLMZidZWtRYVFKSqmcQ5ekmoQEEUl6JjfcA0wqgNxEgPiOqJZKVGHaS7Lzo1r8p4gL3C/asBLtSCMao/jAfBEMLzpwRiI1sXUDe4f2FrZGTmHpxWFykvIuxThtF1cP3B2UHFE9wnDJmToSxUBnypdJzpRWkAt9dgTA3Uw4xMb8EnMMBlZ4QeFESKBTj0gIrf1wT2st6a2Yb2VN8L9ikR3j9TfJDJWO6WBnyREGUI1uzGZzkLk01Yb4jVtmywYsOUtExWtaZYCmS6AxWsw5VHMSIcW6rycgdXvixtzaO7otZ/0aGuqfniOeojVJGbHueIxBgIhOGeGoONiAVjzHBL1b8xst7v3sWfIbooQiYmgJg6kl7ZMa281cbG3m+x0zXz/62OI1coR94xhesIjrwwdgFeVmNj03Ig6j8Yehvn4KUR0NnhfFRRWtbajtuFhxOuVWdmmabW3CGAhR154ShcJPQfai6kc1XVk1EBWgpIhppeUXixgtUo4wjzWKASmMrxaDLHZ7Gp1zrhomw3tEoQTBk4gK9V17IF0f/1MoMNGecqL0KbtU2WlchbJRHYD4wmYGw9BBuieTJg3Ew7agthpIz2s3cI4qBPpPy9i/IMUG17SxPUWaQmyW4+YPZib1e4ZAYKx2eXv1At9R3gxshkHzs5GLYzCXXl+ZB3ljm0ixTnNoGdShW/6npVy9YLSJH/1ne7zu4tSLVkpKRkSAYp3qkjEoJu1mmNKUz5VKjQNmmboyOk29U4rKDukr99a3l2XBqIhVQxLgtIg7GMNylhHqbISmQLPDlofsAhhwWUc+1KyngCT0Kc2i2RwjLez0EbYKULyCY1OeXYQCG79NDpyton+Dh4DEJCHAms1tQYSoD3gm5TOMnIJD2nWpudi0phvUzgAmQaEvZzzbUIX1EKrMjDpr5JHWyFNYx2k6v2XJpyetKmDWFKYwRImUvB3VmG40KmgG30gzCRx4umr+cSh0BqflheYF6tMgSYh3gtd8sR56FIKAIYI/I1Cw/ddCQLfZETGpeve9jHD+sOY8e2H3A3IyRh9xUMDy11Lgw/md9uPb5Ryzfcvz38PWiNq9V9KjYBJbszD+hTUh9MO3gEfEVUvyBDUpRCVqS+qQlYT27QepI0m+DekOpIfVVJWhrHQ+daMrgeksszmCoviSzNiS9LHp3MA2avHBlprM4kC9fd92Zufj4B7On55SfDC2DV4sHczqXOKyZRd9/RwwuQ4VfHBGPUI1EDIqyaQ9Dh1ZmhISwzM58rOxMOhz8N53/Fm9qOcG+41x/2GxI3rf3+3ns3E/5o13SiYtfM/xVODk9QTp7ieGupaYkPj3J5lfZOhe6dhukAyAgfJCvysLGebfakmBFA/RxwR6MPq/Lq0qjikcYM3cgivB2USByxzuIoWZWlXwvwa2EdGCEgqCe/n0qCmkebnjRPzIS/+y7895l8gif/c4KCtmj1aZiFNv3h05TM0BgYxeOb9Ip7vXbIpnXTun//sWPHaHV8/9FjR9fX1xHydxEb6+tr68fWd+26uOfinj0nTx4+LLGpa2sSpNq/1j+AvkOW9bb54YROkRrujzJVTnAvpNz13cJLzywwPFqmY6D6qjAdZx0oQRHIRTpOit3d1FQ/CenDSjMjpNrRliZQJMvUFwcZb8z9BM4HJoeoYvK7TL6S+RqZQtxy6hSg1tU6uZwhuYJeTq1DtZ8DW2gFb0jpXlXi0DbQv+rQPqLPFbsc/WrRIt9VNDbvdcDloVy2+nnUMt1Ea8xd5f0ah4Zy9nP3DA+LaqC1znKdlprrjPZ1tYsy5OuHtbg9uu3qzOpTlNitxBAofHFJXWVlZVrlmTNgqW+tqnjY0tLYBI/hn1Af4WGxjVuoAEZbGl21rrq6Ojo6rTK3Mhes35Vn8yqq9CxE/dnI0SotaRQXpNZP61vmBGteuNtS7mJ4oefZmkO5Mak71ggC1GcjXnpfunEcjjJcF4yxAw0+3T3Y4BmVcTRtoEexBuqH9xsHOfr9Hc3N84bcmZs3f+Rd8/N0SHPz6CMXz7YAGCqU1NKruDivNs+V53Ll5ZXUPXo0+Hjw8eMbNzAtVOuZ0aWlpX/oYoFLPLvFb0SjTfUVFa11JqmsKykGviQV+gX4GrW1LsoZuYZMKVtS4nK56lseNC/cob93p6ZrltJCV9cdSgtdCwsLnW3hdQYpgVhOANCHGE1UUA71DY+qZxt8JCas9yWQqJVrvBgO8TPTLiTsUxremkMgRo0djoHw0ERbW07OVZI2JVeHrurSJm9U7xka+sXlu5p8e/dbk1zmGYV5TuHb51l+TnL+9uXzQwlimZuauj6FKfTmHjx4MNhYOXgDos3WemPwzCOWQcgNk/DX/6b0z9H/UPrN3bujo6N3l6709NwkeZVD6dVNTtjMyclpGxoKW3koy8SZk25Q5TDW+nC6zi1i0KGZmF4cDmPo3XBnwJlBuggvNaCrAoXLmXDHoVh29xn+asiDAX8YDrVI9md2n08KBEqaYBtRgnG71ea12Wxer9fpVBsssuH0OhvwuuR3OqmEueQvLeWixsPywfMhTMmCrHxFiYSwn/jloUNDh/4wlJ8fRqKi/at8Kb5UKaaLJ+z3nPacpoI+7MFZcW6Pv4HE44Hv9Z+faeKRt3jcHz7xMSGSrp7tJElgi1IwpptIdJLJMHQ+KZVjGsHlGsG3PlBOz0O5mJL07HSzy5pQPIhDq+Oji36/z22P291uHd64vuVTL4jbC4RtGso2DWXC2QeUvQ2EdsOlBqefFqcg8hkh5AkTzEosHrMAqwZCTM7io4UuY/PakbCymWS/lYXeaJs+7SexWulPu91YyZshbrfVe9p5uDyR22y7pG/PAjPY2q8TOF8Mi+xwrPk7Ojvaw7YBhygzafbHP3MojjWh0hA+NT7H4RNOrzfutbsFWx9jK3dPag7hN9w7g6vrsyEEdQPhDaj9BLa/wY/FX/qZB1iHJX1gxC0MhN0MCwCzEcZ2q91KC8PM/8GeIDb6kRU/tNltPiyiA1b7pmBNX0Bwdrs77ibl8fpLjyaCnf7/8c5O1vgEuBMI6XQyaNQuNtubX7+e7pzw71JWvf9iqfMj40LZCbFiJ50ngB+ZCL4lr40UyqxSdA8+KLNNrbxYZMXS4PX9Hjrp9LFiOxtkVUoq6ykltD2s25IU2GYFhEbarT7RZtZo9TT5Ep4qs7AGeJHsXrfV6oWuG/9WOy3ZvoZwQ78j3SAp35e9I5VfErCJbGgJFK5ibqTmwUbcMTADqr77r4ev+IVdrX/9t7f/dbR8x6zNLv/VpU/+mICuzUZ//rj3uM32SdJ+syjwTTbby/cPrNk0ENylhDTbEVp+R4ngtnhtNhPQ/PCTsDpruqx025cMsbZQ5v+Ps+t5bSM9wx4fzCAH4v1OoiqL1wg6E1F8WF92bz2EzR6SMegifAjM/+DDXKSFgXUvlsqceinCQRCGcbF2U3VVEM4hKCgCS4iK0GBQDz6MbtKhUATLQt/3/X7MNyO5TfqNNOMfsuM888zzPu833/tKvtZfmZBtbIAbJcVrdKtRpZjCeAPY/GrXmuKmAdL76xDEu9E8FKU0lfC0HtM87XjaojWD4XLw4x+/80MViVOndO/x1/uPbcdmAC6g6+AB/nbYbPrb91MQg1hmIPcF7g5JLvD8tHEqRxUAF+p8iDuAe0v8gBQTRBrEAxBCmsLOUaoh9yQxCL18SEYAzigsCLcHW/K34u+FWG46h4dWKDo3JxqahUB+7ejhOuX1k0EFBGBCHn/5lR/x3CVcXNJN9dvRuH930zqFTHIQDIcfmqG2EjNZTH/8YH/fhgTUZgAzwWszxh8mfpHDy0w6YkzCPTzMDWTnlzYH/ESgDUpy+iSB+3BLnRxHkhulGvkIeMFASSb9ljA78thQG7HBdFY+4sx90wp0H8DeT8iB/8rpEz9KNaksZoX06F4x2dzG8vgo9+V3P36OC/kqx9HiWXuMbbh+GI3iXj04u3v/chKPh0EzSgofaSUbVZBVdg8e2ZZFhd0OHpnF7KVJGyKLUwEMJwSY5THxMbyQyZGSduAmYI1DsbuKW1VoN+K9pa74Mg9lZbqM4EdNX8KMm0PPMqJv8s99GTPllYcPfsIAcEBcP/+28wie+37ziVHUOidy4DN6rQpwtcXXmU6WSTdRMBS/+uufX9eb8zBcds/iMV98cjvqzGazuN3HlSnDaTNMykypcIlWXIUF27fyiKDFIccnI5xhzzeLNok7fp9jDlBbjsAc/qOoA6ipqCOAdUNBLZSE4O5uIX0Z+ThHuAkAz0f0yhJC3Mr8ieewzHceDyYOft1c+ajU/CrwTboqPELf4wYREwIbniegI6qTX0WiXUzrKf+a3ntOper8A630oHI0/+xv33/fDq4WiwGW0uCyn1mnMx7xMR69GQ2DRViUdb9EaVxfmcsVDNCIfB7wtZKxfGylx9Ja5q1Ng58GxkHAK5xTWxC7KomNYiLGlrdCtNEjC1ZyASaABFAmeAwON0CJe45/MlYILp0mLXqYnki/PCK5T+HHbzqQ3yV4q0kLDdYkrc70sZTMTLU3r7gX+AY1w9pZfTrE9VXTaRAE/RktzR69fTuC7535ojkm0pqg3s3tbUcl5Ku1XAKDl2kcD+jp5pfuMg9ng57WBshBfCholhXSSYTU85cmt4BbYMkkssBGIiLEBjRwvkkMx6N6OmozhXDgR94K4ypxvaEclEQb1JsEHMONCfHDIJNwHB5rfW8f8qgp1ULlfcWM5T4SzcwfaqnM/KrWHtJ482bU6b+7wbnYl5MOXy38djQeti9YSLW/RVoOz6HGtfDAayQowG1l0La+AIQtF2HOLyXcHPG8Rm3kNhcRh+zvaYK2YnaTHui2q1uemR2YCKKzMNcHYew5OutxiLBK+pJYE9MT6SS/dnjW6ftmFIVY0lJRLcuTKrviQyUZymSng+dRMfHe/DTlTq7w7Wxqw38Asp2fX+ICzJt//oxhEt9dbzapXzcj9W59u0BrLPDABdp5RsgBiBxFQWJ9GLCtDwU4aTfqL+R0qegogE6NbgZsLwNs9jseVxNU6dQrubiQy0P+qp/2uJMknQLZ9iG5b/j5eRTm9vYA791QFRoo2HWwjxT6SbVSIvNy8mTbxbZdAYANEt1/N7g6f9ab/HSLfWJG6EpelSOa50ZSh3u7IUBdigrzkkHtZYDTEuk1vA218U/F0TXoBNGdCwDbk7k+Qp347Czgr0BG7oF6bfioyj6ZwYxiU2x1kPG4MY9tOFkENqTC8Ht8No+2o+3CrkJbe49IURutNehPEnLeLpvXfojwyVtaVMCIDKa4Mns0gtwRRkxtWAFscCX9OwKb6h5zuSiHi7RLJVqgzZVBgM2RdnWY8aiojW02jbxrGSgsFpGbAqTHJzv4JIpgdjVREUXraveXrf8GMFuZ0uupE+GvM5uMuSeMC5PBtbwmTg4ZHd8xogKM7Vxub1e/QaMHTfXWY+Qi+PdVExE5G30k31gonLeCNij2qAOp4/D58+fcbCOxO53Z5HwRYUw8xlIaHCVqBgu4kYjITUVChbGhHY2UpihmA9piKkmgfSrgblQbmvOjWdYu+myFI1JSEXNteKYC2cnwVki5RzqzUYUkt+F0NHzLKCHahQjw3t7NRXMTby6a1MsiimTTYT5jTfXlZnPQWs0570WhupoJxDqP+V968RA8NXrs2d+nwTTuENZgADvYnvGc5Y5zOSzG2y6UiNWANam1rh5wcC0lIPhwE9iJ2i5xm4fMpcbscsLsjI7o4xeUEYYQ48P0mKez9eOHkPJEXjzHc9JnQ4CNU/C+Bdwq4Y1YwHY3Z3UhwPXql8+o4VmTagnE3Vm6P7tcnAc1KtPgJUvqZoMoFqsAr+PhMHjaw2mRfu9Plz0+P9KZTHFSahwHzcIxGRCwewAYNifNW7ayGEqoJbMThA0UaoMrCD7ybipCkmX2TD6XkcAtgiRwWwO8SxkkkpaZyWNtrD4GbYSbyK14nT1dNPONQuQ77k6ptLODBN/eK5x8U2tjIV3chzGd4Hudvvvd07u7wSvsa/ab377o9Wfgn9/9G9GWcTOZ5D5GrMfD2t3NJeaPY5DsIRZAdjrxi1cAO2Q5AHZuexv7/wPWroucxt1BfiPcFAOlfiisOd5KUnTNTlNb2r9GNkiCZiOZWRIfOcXXg6X3P3gtdMNJLgxnzTQKOQFq266b3zHcuYFq4p+9hmwEL3gakADGPync/zWZUP1HBxz0e6yuEz2fi6L69GExbGKVaXy5WJ3XMH8kyz3GXzR5v2phJUlcXxRAPyJUEPcA0xVbJC4SXCtr+JSWbBh5Aw0Md+bEbE/6EUltDnfj91y4T4VmE7MR3ZUkNUvD67EEZs/8JGXZ8HJ08GS47Tz1dXbdnZ1CwbnGMtGOAHtEDyyDBtg7kHh3ePHHbYe4rVWqizvD0RX+eHswn7fqtbgPbqQ2rcXYKbq3mK9eTOK4ds1QqgFpZLXNLAcyP1ds0dx9AAAPE0lEQVSItiV1Wg+BQjCMLNiuYLfQEZoaAW8r7r00BNynyXaqTZB0uYxosi0hLQuoNwvLx8iKs05sMXFjMZxBttylazwA8WZXf6CaXH3cyiOvVqJGt7P+01VYTN5kT3juX4PrG+L0R7is3t1dBu24FtSDaW3ae7WaL9+fB8FFa17aAeUCrPPYmRQ7OObJ+QmnJ/B2KSYKmO9jNnfbmmgjs01xe0UzgMnk340Skq2M12Ob/Ij36YB7aRUpO5zVjFLcAxvIbVsHruU+MB5YzTNQ2RkOYDIQWuKtkKYuraDBwWBeLGrvaEgTiOHi4nW7dr3Efk/L1TkiD2hDxMU2XnfP6hfXXTYvwTW0A4ERtAPnwyzsu2upOQ9dOxIzsllFROiUxi/FbF24G5LYKkgis4nS0oZkVER8h6V8ysdSO/0pY5LaKJgQJE2bufbBFwdu3r+m2Y3xeDbks3Zjgl1uCPsPqMHD6d1SecLikegWDya7Hly2lvQmEzc9mviLJ70JlTT08XZkazlHxULZsnDuEcAmflpprTZSGaNxz+AnxdLRRu+l3ZDX0YZNsyRbiVVIAPUyJsL8f9TESXlsMkl8jzNSPgRJh+HtEfibzW8/vG6L8Ry8xHPMAYdxMma0H7bPuvOKyLyPReZ5vG35zcFgwCtUhekTIiTOVrtehbiISNu0DuHrE4egTHKYRLKTw71Y4yt4is9vLPD7iNryh8QANtJ+u7slZcNjMqvRQPJIWbyPjY+MrWcy2YH3UxlffMFITWyLLb694Ct4z8SeFrYGfNCiV2ywc3bdNaMw3MP+DbzaulLZzdlffXb24QO8JAim0zim3PFWxFTCHS6IK+YeHDD7sfPIPzlpHjb9vMhOrDw3zkbK7t3nQ3SrolHb8/iUm35/tpxS7hSzJdBEbqYLCQcazgeJ+aeDzTfFbE55BwWcuO3s491WUJVmExexiAWrh/BZE+uecdFvq1qlzrat/xR3/aBtZGnc04nd5vSQYKRtgqtxUijClSzMVUYWmJvChwodGKYJpFiIQYWMsAUDFgHdOWylqBmEtlkWoTCws+MY5AVBCA6cdbBgqb4i7qI25X3f997MvBn9sS7rjd/Tn5Gscchvfvq97+8zbmV7yytPf/rmp2/xr9x8C+5nOWGfg4N+wC2+awL7V56r4dYNmOB93TBwnTDL1m4mn7NMAjlwHNUgEmJ4qC/REI52gDXzKmX8RPi+TO7A/FvzOcwDIYybgTO4rqQiS5hNmIcUHKsAHsNNf0RZhQ0Af2NnZ7ozXZ8axpRZ/cHgv+Ck3yrgxN/ywZH2in3h6C/f/WymHA701TVOsmp+JXtdZG0+njSKpoY5ufJeJl/MlvJlTz8kq092Ghda2IocG/HhrvLg5n5ISiJiwtFeC5SD+bgK6wPpLEdL2B9ldvAhRr7NFpbNbZW3trYe49jAwe1vwxrYJyd2x5qiwQbu5pNbRQDO91R4wvdm+O5n5k5E7uDqWrgzYNYAyFdgcONfX/9b37VMABo4XSyV0umipdHiqCiBO2NE9HrJ+hgKaVe1KqM5K9xCSKQA97GwRiKyEYtodzUWW8kaYVG0WYjasSjaIKB7OMpwg4HViaguYK+YucnB6fDgZGCCnQgGiyEGuhXwACbxkye3txhT0ipgy4CKvEFsT3Bnl1+uP378/T98PyT4clDZHYhHsbSdTidTWcDag1PVgtCTrNeLF0g1Ajcx21OSamACSgulF5sCuH1rpCosbJ/Inoj7vuXdcLPQihhidshqxygJgW2BhsLYhbG3h5WIiAzqS6X/6nQ4BPvjR0zSrRvocKJZjq0FeAgPGE8CA0OLuZ1XAPMEse1MzlFJ3vzwz/e0zQaN3U2gdBaQBqgTyYwuLGyZp36ISVmZ2hzqKLVnV0nJLuEy8plF8jWo39UgasKBZqswm8WCKTFb/u2UvNHJIkHC5XL5zU1CPJPZ3HTdDFXaggs/hPl7/xOGUtiOtrNDKqPB0/o6HaFRA/ajZv7Y7/dL72F5rbgFDLMM3/zr/ScsbwTLYzOfyxWzxOlECrDOmwrnpKrIOiLozJfHZaafhLZwIgXeAuyqRO79IFjCyb0WkmOfyMxz4WMe6ivJyEJmh8FmVZ7BNy23WAQhhQcAfHMzDwNrkzOu2wGwkdod1FvTfPzo0SMu61T4g4dwsbaojNfEolELK2+Z1bkcItgNBNvKZPIgHS9evACkUwksUU+UypqikYnMEdZCChKgfpdTI6CuerMawB2u0ds/8zx4Att3HqvSGiknFNjK5sjdzNZFXpLABiWxkHcARxYJDiQErHMw8v3Gm+Hwenh18APZg3vPy3zASgrLqSlelSuo9FjICJ9BuXc7bwDs64NG/9iF3wRQpxIJ4HQiHi8Uut3CdkbnyTAquJHCIkqQClOWMVskx6ae1chUCe8ZtM8icK8Jn5wvk599R5JxknuvPq9m+q3A7H3yACjVzqbM3C1lS8lUGpavYo4Exc0B14sC7OHVqz7oSiYQdkT9+XOQ973KHhX40wRh3kW9fw+nXf97eDXpu7AeJgHmOLZcANCIdRcEm0LZjHEJkMLXoZSjsZjYip+VRGID1Iiyj/Qst888B16SkXsZLMrsGetEp8sIxN7XebRENzNgjaWSsIBlQU0AbqDjdj+bblwOCe2TTilHXIchpB1Q3UVwd3E9Rak/hrd5T19/ckBfiJMOijSADBDXuzjq8JTaNBUlVGwzEx+RVsxlQ7ZIWATpeWukoPbavSAsey4Rci8InPjO5JkL3/VUup9Mg7qW0GoYgN2Qmpzjnp5DkN9ktp/NlmgQ+UFpNl2EHR7giwATdZ7UJzdAsOG0kzo1ECHGorFo0qwncuimG1IljqpFsY5mEZaALRLFbAnUflH1fTFb5nKY2Cy2DG6vAiJmHgPY8XgC1fXFC1jKBgN4jWAjbOeTeBJGmsY2DAIevwMwxGORrkQ2m90u2GAwjofDy4mHdLPebDYncLcL4EfyAgYOs1/E4GdreHw7hP9yas+gPcvsfWl9vAewY8uYfRfaWAhqHpcSop8tgUsZ3gqTVm34DnA7sAv4Gi8FmG6plMB9m6Y/4HLgD1MN57Q2hrPObUJ6Uhe9c9hMt21RfgZTMwGz5fyjwQ+NFagt++xMXhyr+3M7M0Tx35/M7OVGDDIbfDDdyuJ3vkDiWujALHTtXm387h2CXS/gGzg6hTheEPwSpDj8NKjnkI/65dF4/G5cg7OI0tiviG2LjtNMWDoLCUhA8AC5GSlZwdpmiLY6uzxWQ20wX4HZy4WbNBvRjlnFBC5hyMZut4HPBDaQ9NShBa4B9gTORsEbaF94k1ZAPGuCYI/hEjkS0oi1nbK0dbauaRHJDgmJn2vXVgBbjrRW1cD8m0H77D7BDjN7zqslyyRRGz9WycXFSgb3BqDm9FAP3o1PL+G9BklCg692+NzgT/4x/hjv9nkNwYazvFZc56njjJx6tkwZXqb7rFYlLRF5X7lK5y7NlsldVdEE1GTDhJDW/Uqpyn0tkHcyewm5hW/DNL3iprtcXXmnMoovUnt4aYMlMcHL0AQ0cTYF6AQwvoY3+SpoOy0C++Vp2yFCA9CjdtvuFsnmAwefyTIir5KBg0PpduUuZodi23h+VQVqi2AJOpTYJMBbN86+FrO9N5akhblsg5Rsd71vPdwvTzlHhy3C3p7YzYnXL26L2RSPgWDg94GfRT3eI+r5tuPgyxjky2DsyIhWtIsCy7k1w0uNbWWmnDgo3RbLFbVq6Ni4ePbgzKZIq3eW6cabxEaQWKd9dEiw1XqOvcp4SoJxCWDfwDzqtQFoxLo1qhfLuuhSYvO6NTwFCZcMK3eDHcXaEySpdpuPKtXLA73/fGYvMUl0xgvveZchMzPJOsBMcBPYNwD2KX89oksgrgWOpzRH/h2JPGqf1gDrm8Naj29z0GrbhbzOybweleqwa6NJNcPaKjIiBUvUuQXz0ZrAmL52b376FzCbt/+g027qVHtZziG5Caejwxsc46MWMXTUHo24NMCAYzxw2qgUdB/Rh9qtUzrr+1qv1cadI5zmdhn/w1T+xOYS2wfaEHKtrSojSqgQ0Pu4OrdXgRP+nsD+Mmbjp6hpocrLXDVNL+dTTYLtgmAbHx5523FctiMHwT4deGvJl+jwovUb0jqRMQFpAfJG0F/n98TIzo0fldJWBzu6ZEblRRFNOVMKFN4P2LEv1WwpiMvLpTTdKsWbTkuAfTPmG6C0xSYn0rH/LI3ePw6f3cA8/GuvBwpStHTDUKdTKlmdz2uNNyppc63s/w9tqXg+KPmRTJep+rDMxoSNd2cc7Q3TtEpdu92rEdjPahcCx/ADPePuQHDr8Qnj4u33z17DgO+D00xlqI+fQgJMuI/qHF7PujZqmOorwR6G2q+f9+LfyhR+/sDM5u2unN30J5QtK+O6+WwBDO3DG4CNSMrHhXj+LfREP6AJ4+glYX3zstUsZF2MglsiqwmgM8qF+T11CzRbkwpbV/PcPQFRI8QOfQCxnj44s6vUhQ8GieX24wXurWDADm3mmw8fPvz9pdg4aek4ohsQ+/WH17A8OvV4GgPkmGLDvWo4vWdbdEORVi2k2Ia2MrPVSLG8V3jiIz4V+Z+vw2y2mNdeZLvibhfqEzSZ0WFEvCfOwVHt7duLnq/QtA7yp9Cg1RH3q2odvT1827I7fdxxKZfPUG4S/p0QvIwb3RGLRCKyps7LKCx0bDyQFbnHTD7H/xVfg9kLxYXxLAJxu+KW+v1BEsOlKQpdp5ODQaLDYyJ0a2CIqlHv+vEQL1ZCO44lUqlkOtWd2JNCyaWdl5DOGgsYLf5VH/YNjUnk9mRa85fJBUkcqYbKT+qoxnxjWwmXIn8tZs+ZPHOmc5EBn9bvsvok0rcw/A0rj/3H4z3ahamC238Fs2Jiev2M8uyUSsYibMFlsRdCxPCbk7HRpMbpBfyeh6cx/ydatOr7IZnNreyYYLbYx4O2QQBxQYeP4SG1PIf1lvk2m8iRa6rsGKpT3McCtGNd29Clf98j8ganNekJi8Rbpac7uB3ptjbmuu4Cbe/SPSyzdealI3kvNqor7vLBNrQNCtFhlAr7wyk2qEtTHhrfEISDSjEARk3SaLXje9UQp1n4qrFQhERMfqyFeb4AbwNdfMkvCvJsRpTb/wM9oOUO9L8aFQAAAABJRU5ErkJggg=="]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApW/ppgHadUkxCHXfJ29lc0cqkc7X6A0FaET+6xbvD4t"},"signature":"Lp/fT6Woo9zZa0psJjPtL2uZjhVKdJVOAKnwrAeucx5io2yYMs4vTxR0n0Vb0tlOafKVGVtMAljnG+UN+tHVow=="}],"memo":"createPost"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v2","func":"Upvote","args":["0000001"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"82ONO4zyClZJY1uM3TawoMPt8G4+gvU869HdHCSSlIlUwDTSUFhoXDZKtJqfofZdg9pq7hb4p54j9FzXRCMnkA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"Pt4cC3YPLulpFyvqiCH/AmZRG10TRapLui3jT393jkocs3dzVRkKtAMAnEsyyYCsSQUYXhy7ph83bwDvYH3ubA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"HRw9jIS9cBKYOFewCGXw3KuWRLHJMWi0NvF58/GQ57EE/kNCjk5PdSMIo3uxOgo9iNWdgdRLE/kyaEFbVflA7A=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"fwGqX2nL/n3uVkZQfN6LVuNKIzprfbVvojyGUhrejYUy8w4gxq+O7iepbIEHJprkZBRXLPbDUAfn8GrqaWSH2A=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1ffzxha57dh0qgv9ma5v393ur0zexfvp6lsjpae","amount":"100000000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"8RwmrrunhNFS3F2BFu8IDzg5JwuELxWuTrPKkrQUGTUsj05pDFnUXH/gp/PC7CFirr2xE+l2vVYkE0QtemkVKw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1ffzxha57dh0qgv9ma5v393ur0zexfvp6lsjpae","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v2","func":"PostMeme","args":["data:image/jpeg;base64,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dp7+Fcui+enicBERCoREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAFSSRkMfG9zWxtHtOfgAe8kKq61fbKO6RhlZSQVbR0bPGHgfFTHVlsGNag2s6V00HfXLxTvI/wBFSDtn58ORWIVG227393ZaR0jW1nFybWV36uHPvwP9pSVR6YtFuk7SltVFTv8A2ooGtPyCubTw5wADjAIW8qtvTXlbZsKVOK2yQsdnO0TW7w7U2p4LTSHrRWz2jjvaeE8veSsw0rsX0rpSZk0VtZV1LR/yqsPaSF3eR3D3BZzzwMkn1VeI5VZ3s56RWEVdeT20OLQ1owxoYO8NGM+viq94OASPFVJyVRabeXkwNvIJycoiKCNwiIgCIiAIiIAiIgCIigBERTnTAyUI4hz6jofD0UfbRdilj1/FJOIW0F0Ay2rgaGknwf4j5qQkHes0K86MlKBeM3TacTWPTOqtVbCNR09m1MH1unpncEcwJIa0nHEw+AzktPjywtl6OeOrpIamF7JYZWh7HsHJzTzafeF17zZKLUNDLQ3KnjqqSXGWSDOB3kHuOMcx4Lo6R0yNIWdlriqH1NLC9/1d0n22xlxIafTK27mtSuIKSWGZ6041VzY1L2nfnJ+KIucaiQPM5IyfEoRkjPPHcURCQTk5KHn15jwPREQGHbTtmlBtJsZpZ2COuiGaWrH2on92T4E9fipu3DN+Sr0xeYtje1mrkjukUwp7Reah2RJkhrYZXnx+6/v6FYDjPyUd7YtlkO0OzdpTObT3mjaDSzB/CTjOG+8967XDr3s32VTbodS0uuRqEtj2sieXtycHmcEd6+i80dwHf+nZW0eyTatVfU7pTltJa7vVnHakHhbDM49/QNcevQ+K9KoXGQEnI8ivVNemx6NPOqPoiIqkhERAEREAREQHkjTjNNH5tXMrjS/8njH7oXI9Svnp4kIiIVYREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREARETIyEREepOQiIhAREQBERAEREAREQBERAEREAREQBERAG+ycj5pnPU5PiepRFBOWERFJUIiISEREAVeIgEAkZ8FREeu5GNckF7xGyh13pHapssLm3Ok/WVLIxzkYPv9ebhj3hbk/Rn78cu0Ggp9letq8yamo4+G119QedXE0YETiTzc0A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","1710899208"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A09whvkfsR4pCSEYMMt/do4mD9Zf76Dzs9/kOirITiy0"},"signature":"ZvPylVht8Wb+ohsaTpNb0HO1FaVBJ65cc6XzBBJak9x9dVB5SL6A5XZtCE1rxtN9Eq1pRI5/ZnZtEXbfjSpyhA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1ffzxha57dh0qgv9ma5v393ur0zexfvp6lsjpae","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v2","func":"Upvote","args":["0000002"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A09whvkfsR4pCSEYMMt/do4mD9Zf76Dzs9/kOirITiy0"},"signature":"onw3/sMLmgQ/zx7lpVaQbuNdvxm7yvudGYcij6fO6s4U1nT4fFvuQovMVT84MhQMBy6w1wMB/WCzS570rv/Nvg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v2","func":"Upvote","args":["0000002"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"3jD940YaLlIzm+Tdmw5KVqFfqrRNfS1sntZ3w9qSSu0VEt5YnG3s4f5O57YvFdySZwPBBkP/005nvr+ZGFlDkA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v2","func":"Upvote","args":["0000002"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"cz2ZvN/mh2pc5UVGgvZJ0cc0k6iQ8nBS0tLdlCCXxBRww0uWjfEwo5VaHSguHijsLZGp+jD4vIh0x4+iQ6Whkg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"TlYHM5hpnYR7XW2KCk/NPfCrAngpdZ57csKVLq1KjdZZUVoTbI5/d+pKIKvm16hXitiNaMj2VJ6MJWEaTan8oQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"LPpfWHJQtPmtB7ThimB3WDrZICnIT0Dp8Je6Nm6N91QjhgCbQNdcCcBB4yZZ+vAJ+yiZI3wsUN5nMVuKwge6Tg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Lh1F2jRo2lstlHI+9RDUmeblellyBwq/C3CbgGuI0QNiYaEije8K8031jMBSYGbIAnnt7IS1gsF13ivwc12C/g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v2","func":"PostMeme","args":["data:image/jpeg;base64,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","1710925223"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AzFdv1Uf9hYAYGR/nDjpuWViwY6oujHVSjOHfnVPnW0a"},"signature":"jIXg61HVTEO7gKsZ6+br0JAEczL12UNvdyW1aWfmaPYP6rtGxuvgSQ3vjRrc/YV2LjN3K0pzT7ocBjhEY0jgfg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v2","func":"Upvote","args":["0000003"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AzFdv1Uf9hYAYGR/nDjpuWViwY6oujHVSjOHfnVPnW0a"},"signature":"PgrcloNUWLNPONbLa4C7o4+IJ/CmgfuIyZ7V5D0jfXl/UGYGL3WE6YDUiZcRaOR5LID5ZN8LRucg5UPzll5w2g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"mLaCzIa6oRr2fc4wHSEXNsf3ifY/BRb6NgxE2934i7c34mH+x12EIILsLOKd8yJURECkmIczpUTQG3Y+cgr+dQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Vcetl7mK4BB9U73m2YO1h4vehKIkAiHPFDIHibwC+wF8sEXXlV13eM4SDDkLwv1xICXw3EU1tW3vIBb74+aqkA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"LikePost","args":["13"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApW/ppgHadUkxCHXfJ29lc0cqkc7X6A0FaET+6xbvD4t"},"signature":"wq0Fgl85oUeAGLIWbcnjhB6wR8pvIGofzpk0vShqYk0+PN9AsIeB+TMtBc+8pjTw3LY77oMwa5QENEPDX/8aBw=="}],"memo":"likePost"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"obqGtbIGxwnonZWTSY1oGybPk9XdNQTRYhCtBIVFlmRr6pf55CfjyGrJcH+34eAKFkOxhCML6FELEkCM9pMS6A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"6WvAWKry270pWZyN4VJ74kAfx6jdpF/f48uS2feBFelauqIf2685/eRTn/TzXYSb5H09NdaCetZXElZUvjJntw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"CWeUXp/DEOw6bYklBPgfS7KMk6D00fnEaceyP/6LnlNS0ts9gv/z28IpteevsDaF3pSPkKV0gWOL3wz1csx8BQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"2uxMRwrDH0ulGz5N6j4RZ+2vo7V5A31/Hx4MQbxZ/2oD0Jl1kAxi7CWD6wGRq6LZiqzwO9gvyTwP/lXS/1qxwg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0qQv9QaMtIykJb0gr1H4AYj9kJAi768vV72RZfG+lj5wv9y8v9lQlWtuHBLwFH4DbuQLxW78/dA67mQmBgOl0g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"QU+H0TK+G80IsB3MhjQFL0p/ryjQzDDRiHUkz3iLtPM9HYxIdTBkRLLqjNzyKG6PbnXlO3v/Gbt9lDclmEtB5g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"gpLogTF7izHg1Ut7GWaReK/0sE5YwK79fFs3w5efueEQUWgp2I0RaEv3kT8fKkhzZgkLSVemzAgAJ6RLOTtxBQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"jICnPZmDmDj0y+p8g9zGtUweWkdm7tZjsnZPkIKRZx8t9VK7LYmqjvOnXPB5XxOfq21z5cKzNqOTfiGH8d+a+Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fXp3/WvlfZk30RPrTECZC3C9diQChHyvRKizxACXo9MkN86Je9ojCQk5La9s3n/sD1+0npZPrQ2i3edthwtbSg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RSRzU6R37ovRDKzvIjzODH8hPjvBgcHOvNr4cBOrApZGRkS5RLm7Kj0EvSsK3BwTF0+dkT6w38sIxHi7G+oUQA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"DhiBZVRETzIGL6ns4pJDVtBrpBnExd+NyF6sQ0bLRy8k5amUI3GvG7+0uQFgmVUgp/lsKVNf9I2ZTZLddPvy4g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"UiB5aCMNQaO5ErXNxgJqEf/mLkKUNWl8Hi0jct5vesF/MImaOMn5WMd15qBczDs5RMJR61wSgq+JK+4R9yp3xQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"tjLaBuwjj7M3PEcTcokdHYRFB26VISk5UvkL7w+rhZlKxJVInxb1QfbyOM+N4MT7cCLWKRxp1ebyyaIXX+YaOw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v2","func":"Upvote","args":["0000002"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AzFdv1Uf9hYAYGR/nDjpuWViwY6oujHVSjOHfnVPnW0a"},"signature":"yrM+Mr34ueNQ0iY7eu9t/TfjedoS7pduj8qzg97NmJ0wXR9s1gcKqNF8JuvIAJAwXiZlbzb17cn0J427nf2Wag=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v2","func":"Upvote","args":["0000003"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AzFdv1Uf9hYAYGR/nDjpuWViwY6oujHVSjOHfnVPnW0a"},"signature":"1nQ90MUmSb9yT9bThUzXIxw5v2u+suty+t4Y30pXwqVTdfi1bthr/tVCoVvOLbusu+1rm3wszd9688wdMbAZ5w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v2","func":"Upvote","args":["0000001"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AzFdv1Uf9hYAYGR/nDjpuWViwY6oujHVSjOHfnVPnW0a"},"signature":"Iv7JIcAqxO9fyY9DNDGZ75f+ysEKXCuNG2u4K2kAt5R5dgKtWCD1zF8PnEM84Qlm4wn4iqU38tZT6Lq4kBV1Zg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","send":"","pkg_path":"gno.land/r/demo/memeland","func":"PostMeme","args":["data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4gHYSUNDX1BST0ZJTEUAAQEAAAHIAAAAAAQwAABtbnRyUkdCIFhZWiAH4AABAAEAAAAAAABhY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlkZXNjAAAA8AAAACRyWFlaAAABFAAAABRnWFlaAAABKAAAABRiWFlaAAABPAAAABR3dHB0AAABUAAAABRyVFJDAAABZAAAAChnVFJDAAABZAAAAChiVFJDAAABZAAAAChjcHJ0AAABjAAAADxtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAHMAUgBHAEJYWVogAAAAAAAAb6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9YWVogAAAAAAAA9tYAAQAAAADTLXBhcmEAAAAAAAQAAAACZmYAAPKnAAANWQAAE9AAAApbAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAACAAAAAcAEcAbwBvAGcAbABlACAASQBuAGMALgAgADIAMAAxADb/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAJYAlgDASIAAhEBAxEB/8QAHgAAAQQDAQEBAAAAAAAAAAAAAAQFBgcDCAkCAQr/xABnEAABAwMCAwUEBQYJBQgNCgcBAAIDBAURBiEHEjEIE0FRYQkUInEVMoGRxCNChaGx0RYXM0dSYnKCwSQlQ7PwNDh2g5Kyw+EoN1Nlc3R1hJOipLTCGBkmREVjldLT8SdUV2RmlKP/xAAcAQACAwEBAQEAAAAAAAAAAAAABAIDBQEGBwj/xAA6EQACAgIBAgMGBQQBBAAHAAAAAQIDBBEhEjEFE0EiMlFhsfAUcYGRoQYjweHRBzNC8RUkQ2JystL/2gAMAwEAAhEDEQA/AOqaEIQAIQhAAhCEACEIQAIQhAAhCEAcsfbjHH8Sv6b/AAC5Yj0XU72438yv6b/ALliAq33JIyRnBCcQc8qbmnol0DgQAqpE0KBGeZpWaJjw8YGy+w4cACOnisnPyOVOyZle084ThCMxn5JG1vO0FLKM82QozfBInnCaF7LjLIOiuQ1Hw9VUPDeqbTVT2nYuVkSVRI2KK1tbFpvTMtZPnKa53hepqglJHO5jlMpaKGz2CvucFY84X3KmBmY/dOdHNykJoa7BSynfjxUWjpLrZWlhG+FL7ddBgZKrilqcY3TxS3AsHVKzhstjLRYguYLeoCQ1NyEr+VpyPNRcXF7xjm28lnhqDnqqejRZ1EytddyEbqQRXP4frKA0tVy4OU5xVriMByqcdklIkdTXd5sDlFKMuyU1U0nN4p1p3dFHsd7kitE3cyAqa2ytAczJVd0s3KfkpBb7jyluSqpIsi9F5aRrhlgyFcGnqxro2jK1o0xf+7e0cyuHTGow4N+L9ajB9L5GO5ctJM3AThG7PRQ61XUShvxKSUlUHAbrQhPZTKI6Ar64bLCyXK9Ok2TaktFGhLVnDSohfX7OCk9dMA0qG3icEuSVrL4kWnh5pCUrphj0WF7gXpRG4AJNFxkkqHRg7pju9wPKclOFZMAw7qGX+vMbXbobAj2pLmOV++VT+rbkHFzQ7KleqLw/LwHKqr5Wl7n7qUI7eyiyQw102XndYIX5ck9TLl5KIHnOU1oV3slNmn5XtwrQ0pdXR8oBVQ22XDgrD0w8uezCUsQzBl56fuffNaHdVPLJGXPaeqq/S5Hwg9fNWhp6UB7QVTHuNFg2qMcrdk/w4AACYLbKOUYT7C8YWnULzFKMZXxpyF6anIsofBlhGMrKscXisiYXYqYIQhdOAhCEACEIQAIQhAAhCEACEIQAIQhAAhCEACEIQAIQhAAhCEACEIQByx9uMcfxK/pv8AuWIOV1O9uN14Kfpv8AALliNlW+5JHpqVwk+CSNSmHZwVciaHOB4IA8Vmbjm3SSm+tslePvS77kxUchuyUW44+1JA7lAz0SykAByuS5idJfpNzm17S3zVmmXMY81XGimB9SSfBWC92AMKVK4FrXyeXvJXxpyvJK+tKaKD3lC+ZXkkdEHT0HJTC7okbXZ8EphduuAOUD+icYJOiaYT0ThA7oqmSQ7wSZCWxO3TbCeiXROVLJIc4ZMeKcaaXJCZ4nJdTyYI3VTLESSjk2TxTvGFG6WbGN07U8+QFQy1DzHLgpdT1GMbpmE2AClNPNlQ0dJdaK50cjcFWfpe8vHJucKn7W/MjVZGm38vIqpF8GXlp2687WZPkp9bazma3dVLpyTZu6sO1T7N3VkHosZM4KnIzlZH1HimiCowBuvctUA3qnFLgp6Txc6vDTvuoPeK/4zvsnm8V/Kx26gF4uWHu3wlrJbJJaFXvg5+oWdtaMKLCvyfrLJ9IYHVU7JjvcK8Bp3UD1LcOZrgCnO4XP4T8Sg2oLjnm3XO5FshmpKkkuOVXN3m+I7qYX6p5i4AqCXSXJcmq0JzY0zSZdleoH7hJZX5cvcD9wmNFaZIKB+HBT/TFUI3sVb0cuCN1LbNW8hacpacdl0XovfT9e1oYcqxrHcgHNPMqG0/eyGtDirFsl3JDcHKU7DsXsvS1XQODd1KaKqEgBzlU9Zrs8luCrFsNYZWDJTFc+TkkS6N+VmaUjgdloStvRaUGKSQoh8VkWKDoVlTcexSwQhCkcBCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgDlj7cb+ZX9N/gFyxPULqb7cf+ZX9N/gFyxHVVvuSRkaFnjOCCsMYyUqERDQVXIkkKqV3xhOfc8wBTbAeXCcmOLmqiXcsPMu2Al8AxHkJumPxBOcB/JAei4+x1Eu0NJicqfveq70W7E/2qe8581OoUt7mUFegViDsleubZMFJ7Ll4JyvJevPMgDK05KUxFJGHJSqLqEHULoXJwgPRNsJ3ThT+CrZIdID0S6I5TfT+CXwhUMkhZGcJ1tdtqLhIGQxveXbDkGU207Q4/EQ1o6k9ApDpjX9jp6sUVLI2Z7Th8okDd/nhMY2JPLn0R4+ZieMeMVeEUO2acn6Jd3/wS61cLL3UCJ742sicQC/PT5jqFJ5eCt8t8oY4wT00gyyeN+Q0+GfLyUh03qakp6P3lgZMAN2tqXc33Hqldr4s2mvqJYqSqbFMw4fTTuyM/4L10P6cxulKc23+h8Gv/AOqHirslLHx0oL4pv92QC6aDvFoihkmpiYpDgvYchh9fJNMbXwzOjcMOaS0j1WwNju9Fcu9e1wfTjLaineclnr6j18sqJ6u4OdzS1Nzs9UapocZDTkZdy+h8SAsTxLwOeL7dDco/yj3X9Lf9Q6PFm6PEkq7N8Nb6Xv6fT8iEWx+HNVhafqNmb7hVvQHlODsfJSyz1xjcN15Fn2mLLp09W8oburAtNcCxu6prT902burBtFxy1u65Hgt2WJFW7DdeKmvIad1Horl8I3WKquXwnJVuzhjvly+F26rq8XPMh+JPV/unwu3VdXS4c0p3Vbezjeh2Zcsu6pQa8luxKjlJLzblOIl+FRI9R5uFbhpyVC73W55t1Jq88zXKEXzILlOKK5SIrdp88xyodcZNypJdZMByiVyk3KdghaQ2Sv8AiWWB26SPf8RWSF26tIj1SyYI3T9QVBaQozTSdE80knRUSRYmTe0V7mOburL0xcOYNBKp62TbhWBpms5HMyk5oZgy8tOyc72+qtTT7Q2NpVMaVrQ58e/kresNUO7aMqNfDGX2JpTPIAwlsb8pppagFoS+OYELSgxaSHGn/OWZJaJ3Nz/YlS0IPcULS7ghCFMiCEIQAIQhAAhCEACEIQAIQhAAhCEACEIQAIQhAAhCEACEIQAIQhAHLD24/wDMr+m/wC5ZAYXVD24Qz/Er+mvwC5ZlmCq33JI+xjJCc4osswmxuxTnRcxI32VUixHvk7twASyE5YsMkXK/PmssQIaqG9kj48ZIz5pxjdiJN7+qWsHNGF1cgSvR7+WYeqnfPsFXmnJe4lZup5E/nYHIrkt6F7V6itrsL1zbLC1y98yaFz6XYXwOXhzkB26AFEZSqI9CkkXVKYz0QAuhO4TjT+CbYD0TlTHOFBokOdOMgJyp252TdTeHyTnT9EuyaIpxY1IdO6YkbG5rZZ/gBJ3x6BQPhbqCioKuOZ1KauYnJkqH8kbT6NGSfsCe+PNJNLYG1DQ0RRH43nGfkFTektY1NkqQ6nji5v8Ausozha2K1CMZHmfF8OeZVOC+uvpyb/6I4hz1dueyaio6Wna368sL8O+zOcfMBay8atWy6d1i+vtFxp4Ji7Jjo2SRj/kv/wAEp0drasuha6ok72MfEXzvLYx6hjSP1lQ/XNRV6uuU0Nh0264t5jz1zonOa4+hOwWxdkSnDvyfK/BPBI4XiE3OK6WtNf8Aj+rl3+vyJbpftWXGhlozJIe8D+WVodjmbgjHyzj7luzwu4wwX3RdRcKe4vqLnNSsljooLfNKwPGBLF3gyw43PNzA435cLlbVaV1DpbUzoKm01MFypyJjTmMktBxg7f2h94WxPDK73vVdPPa26TrL3OY+4qRUXeOCaKORrgXMc8FzXHBAJy1oBwMnKUlm5DXRKT4PU5f9LeDR1lV1x1rvta0/ntL17m0X04y83Kec0zaGZ3LI+nbKyQDI+sC0nYkHGcHzAT7bHZIVN8O6TVtVqG41N30y+yW6lb3YkjqzUQ8zhHhoweRuzBnA65G2MK4LS/dq8rlr+7J61s+j+EPWHCHVvp43vfC7cpv0JzYpS0gZU/tNSQ0bqvLW7HLhS+31PK0JE3EyYx12G9Ulrbnhp3TX738PVNtwryGndd2GxDf7ps7dQWsr+aY5Kc75W5DjlQyqq/yh3U4xKZSJdQVYLQnBtVt1ULt90DCATsniO4Nc3PMF1xIqQ61dQCw4Khl+nGHFOtZc2tYfiUNvNw7xzsHZTjEhKRH7rLku3UUr5Mk5T5cZtnKM1suSd03FFDYje8ZWSF26SOfuskT8KbRxDxTv6J2pJPBMNPInSllVUkTRJ7dNgjdTax1WOU5Vd0U2CN1J7VWd2RulZoui9F0aYufduZurh0zeRLG34t/Ja42G78pblWhpy9Y5S126X7Mci9ovaiuAcBunWGsyOqrS2agy0cykVLemuaMOV6md0WFZJu9E2/TH+KdFGtG1XvQq9845P/iUlWxQ91piNnvMEIQrysEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCAOWvtwB/2lv01+AXLLO66ne2/wD5lv01+AXLKRvKeqqfcsXY8jqnGjf8TQm5pSyl6g+Krl2JLgeZY8sDl6hAIWSDEkGMLGz4HkJRPfBNnwM5ilcQ+HCxMbvlZm/CEdXJwdLdKWyMOcKfW2Xnpwq5o3fG1WDZTzUw+SrUtWIhNbiOTTuvZdssYOF6PRaa5Ej4SvTSsecL205UjiFEZSqMpHGUpiKidF8KcqY9E1wHonOmPRQkSQ703gnOn6JqpinWlycFLskiNcTdPy6h0zNTwxCaQfE0OOGtP9I/JanzCa210kToyTGcHmH61vK2MPYQRkEYUVv3CyyX4PM1KGve7mc5mxJV9dygullcob2zVml1ZX5bFG8ta7YNHitlODWgdQSmgvl3c6ru0pb9F0VQ4mOmb1M7m9PhG4GNsjxISek4W2Gz3SnndbJauOkLZe7ijLjK8nEcTQOpJyT5Bu+xVnaV1jX6etVfeK+y1VPdaoGkpcxlzadmccxAGQB1xjfGfFegw4da8yx8en/P+F8+T5j/AFNnqlPFw4Lq7N8ct9or11rmfy49Sw57BYbbSVFxfivitLzLh4y6rqWsxLI8+OHcrAOgJd5J605wgNXeLbf5KUvudPTtfXVTIwTK+Vz+9YQMEsBYC0b48N+rfQTadv8AFZ7FQV8fdySMlqXSO+NsMAD3czeodJK5u2MkZ8lsjo2mpI33Wlge972SxxOc4Y3EbSMeQyTha/RBJ71xrt9/lr9T5R+MyG1BNptPv312W/z9ra/L4Ij8VhpqWSWSm5IYnNdmRjAHY6HvAMCVp/pEZ+3Kjl10gKd5qKKPu8N55KdpyCP6cZ8W+ngrHksXLNIWlzWjLixpwRtuR6+P6jsRhJUUccULYGM5mZJHKeUg7/Ew+B9OhHXfdJZeNXlx6ZLn0fwNfwXxbL8GuVsJbi+6fZ/fo/QgVufygbqSUdRgBMd7pJLXO2Yta2OTByz6pJHUeWd9vA5HgvNPdWgDdeBuplTN1y7o/SWDnU+IY8cmh+zL+Pk/miVuqsM6pnuNaCDgpFJdct6por7hzZ3VSQ85Dfeq3PNuofWVJ5ycp1utVzZ3UaqZd0xFCsmKo64tPVKm3UgdSo+Z8FfPePVWdJDqHmouRePrFM1dVZzkrHJUnBTbV1Gc5KkonGxFcKjOVH6qTJO6cK2YnKZqh+Sr4ojsxOfuskb0lc7de434wutbBDrBInOnkwmSF+MYTjTybdVU0TQ/0k2CE/UFRjG6ilPJgp7optwqJIsTJ5Z6o87d1Z2nqnDWnplU/ZZ/jarM07UczG+aTmhmDLOt9Zlo3T3BX8g6qGUMxDR1To2odjCp2MJl08Jq33sXQZzy91+vnVgqqOBUxldfQfDuP+kVrr0GL/2Y/fqJW++wQhCaKgQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIA5be2+/mX/TX4BcsZjkrqd7b84/iX/TX4Bcrpd3Kp9yxdj63ZKqQ/GElAwFmp3crwoS7HUSahPM0L3VRcjw4DZJLfIcAZTlPvGCs98SLBK53K4eqUE5jykknQJbBGZIfsXZcaYCig+JwKsDT+8IHooHbYzz49VO7G7kjASls+mSZ1LaHRw5T0RlfZTkrx4Lbg9xTMyS09HzoV7aV4X0HCsOCmMpREUkYUpjOVFnUL4HJzpjkhNMB3CdaU9FCRJDvSnonikHRM1N4J4ptgEtIsQ6QkYSmINJAyAScZccAfP0SKN4a3JUL4ta3Ol9NQx0jHS3G4SOiiY13KWsDfiOfmQPTBXaK3dao+nr+RRlXOipyityfC/P75fyRkul398F4utFXyihiaWQU8biXlxLmh/p8Ic5YLRryx2mm0e9lzE0VDJLLVxzT8rw783LSd9/H5qqtOcINW64bBUVbammtk7gDUuY5kG2dmnbnPXotjuGHZF0OeR11ppbvL4maVzGk+gaR+1aed4zV4frrj29Pv8jz+F/Qtni6blb3b5/NNPn1fLe/iYNIcRLJW3Skut4Fvucb56mqfHHK1zoy94EbCOvwsYB9q2a4JagFTpm8XCw1FBBHW175ga57gynyAOVo8ennhR6LsKcNNQ0BMFpktc5HwS0k7xg/IkhPfBn2b8VXDUfwu1ZcpLTDKRRUFvnczLc9ZHHx6bDPzVGD/UePnbjGL2Zni3/TG3FsU4ZC6fXvwuey/X5D5qXVVsnlqReeIMFJIyPBjpKhkEQc4EcuRk5+E5BP5w81Fqyu01S08UtNrGqLHTAse2t7xpJjOANyHYcMn0Wytk7EPCDT9EIG6RguD8fFPWSve958zuBn7Ex3/sV8Grk5zJNF09MTtz008rCPUfFhTu8ddEtTr4/P/QtD/p1j2w1HLfV/+HH/AO+ynYKi5SRwU7a+O/2qcOYBI0NqIsH6zXAAPDfHodkxVFRPb6qSCZvJJG4sI6jIODj7lKtY+z8uFkifcuGOt7pbXxnvG2u5TOniJG45STkH7vmq9or3X1bK6y6oo47dq+izK4QczoaiIfWkY7AxlxzgjOQ/OMDNWRfV4hFThxNLs/Vf6HvDPC83+l5Ou2Ssom0uqP8A4y7LafK6u3quw8m7ZHVJKm4F2d0xGu3wCsb6onxWSonuuoy11VzZ3TLUSrNUTcybJ5tyr4opb2fXy7rGZtknfL9qxul3U9ENmaSb7031UuxWSWVN9RJspJHBFVyeqaZnpdVP9U1zP3VpzZ4c8r0yTdJnP3XprlLR0coX9E4QSZwmeKTYbpdDJhVNFiY+U8nTdPNDLjCjlPLjCd6GXcbqmSJImtnk+JqsrTUhBYQVVNmm+NqsvTc2zd0lNDMGWlbJWuYMgdE4vcwMyAo1bqjDW7p3bU5b1S+hhFtcAXc0uofT3f8A6VW+qe7PruaTUJ/8X/6VXCt7F/7Mfv1FLPeYIQhNlYIQhAAhCEACEIQAIQhAAhCEACEIQAIQhAAhCEACEIQAIQhAAhCEAcs/bhnH8S36a/ALlfnJXU/24p/7Sv6b/ALlhjdVvuWLse17i+sFiWaL6wUWdHiheRjITyw95CEzUew3CeaduGgjcFZ9i09liMMkBATjb4wWYWOWHmZkJTbGkDBS85bidS5FVLCI5FLLRvhRctLZB5KUWIZaMpGx70yxDpKcYXjmXqoGCsQK9FT7iMqz3mZM5X0BfMr2AryB7Z1SiIpMFnjK4zqF8B3TrSFNEBTrSncKEiSHmlPRO1O7omel8E6056JSRYhfLnuHFvXCh0nDx2p7vFebk14o2zxWyjj5vrO+vUO36bGMfaVL/eBG3dOGu5XM4Y6f9z+GoaKqoy0783eY/Y0fcFpeGa857+Ajm7cIpfEsDixxTpdRXi3WeghZFb7NzU0bYgA3o0N2HTDWgAJx0BfI2VMQLh5YK1h4camn1NcK9ldJmpc4OLjtvjH+CvXTejNQPrIBRxRz94csDpOUO9M9Mrx/jkY2Xy29H07wDqqx4JLejc7QVzhqKCLJBACvTRtdTz0AZE4EjqFqhw6ra7TlFVN1Dpqvgip8Pmnjic9sYI+tluct9RkKytDaxt1LcHSUVY6oppd2FjjJ5Y6dD6LK8Mm8KxN9mOeK4yzIS6e65NhTOwsJyMKJXyuiFQAw7+i8wVlwuVJ3lNTSBrhkOlHJ+o7/AKlGRR3KS4TzVDOSGLq4nYlbfiOQ7IxSj+p5fDxIwlJykuPQmdmubTTcjjuHbfJaddqnRTaW9G+0mY6mkqHPBZ+dFIMPafTPKf7oWxkd+EUzmg4IVR8b6luobRcWAAudA/B8cgEj9n7UjTnpuCT5ixnI8N66rYyXEl/PdfyauwVfONzgrOZ9uqbDGabqfkj3rI9VvpHk/QUTzbJummySvs1R4ZykMs2VdFEGe3S9ViMnqsLpvVYzIrNEDJJJ6pHO/ZenyJLK/Y7qaRxiOpfsmyd6XVDk2znJViImFzyCvTX7rC52ENcpaOoXRPwl0EnRNUbt0shkxhVsmh5gk6bp1o5cY3TDBJlONLLghUNE0TK1VGHNOVYmnK7kLd9lVNtmw4bqdWGqI5d0rNFsXouC21DXxgtdlOnvIa3qoNbawhgw7CdDcCG/WJSbQypGw/Zvn75+pPT3b/pVdaoPsrz987VHp7r/ANMr8W5i/wDZj9+pRPmQIQhNkAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIA5Ye3H/mU/Tf4Bcscrqd7cf+ZT9N/gFyxxtlVvuTXY+t3SiBvM8YWBoyssbuVwI6qJJD9CwNiHiU60Lg8AJgo6kv2cnOlqO7ePAJO2O0WD+yMuOMJTTxd27ok9FKJMJye0CPIWRNtPRaj5KzIBCfrBIBgJlgcJWYS+1vMc4HgqZ9tEkSarb8OUjBS6b4oQfRIOjl6HFl1VIy7lqRlb0WVoysbBsso28E2VI+hZo+qwhZoxuos6LYeoTrS9QmunG6daUbhQkSQ7U3gnWDomum8PJOkJDSM9EtLkl6DvS6blvdmuVZR19BLPbwHz24VA97DCM84j8W7+Bz44wl1HLS3W3TWqcuir7JSg1VLKwtdGXuLtwemWuBWtN01DX2XXl1vNHVGkulHc3Pp5HtDgCx3wZadi3AbsQQQrE4U36qudp1xqO5zukqKuKlo5qqT60sriS57j+c48pJJ3PitLw+LjJ77tEvEseNarlDsu/56/2ItIWW26X1bLWX26x2i2zPIjDxl0gyRkDrjOd/Q+S2g4Y8S7do6909ur6mO7WGqkBorlH8TWOP5j8fVPz8FpBxXt41XrKvr3XCOG3wu92p8EYbGz4QftAz9qjdFq28aFfFNab/AE9ZGzH5MyYJA6AtJw79ay/EcPHzLZR6jd8NzsnCpjJw+/gd+OF95tWpLayroqkFsTOQjmBABOMfelV2FNpNt5rmw0ofRxscS2ENJ5tgcj5/qXIfgx7QOs0VDLBc6OVrpSeY031ZPiDscpOxyOo8zstnK/tmR6nsery6VsQq4aamGXfULqd7Dv8A1ZHN+5YNkbMSCqlHn0a/b/g2aoVZlsra5+y9bT7902vqdAdPllLbYn1NX3j5QXuc7bJ8fuTTd61t5D6S2D8kN5ak7MH2nxXL6u9qrWQWiOCl046sr4/hcKqTDAeVoJw3c5Id4jqoLffaB8SeKZdSVl0o7DbscvcU7m08bR9mXOWg8e62ny56ivz239TJ6qoXdcG5N/LhfT/g6iXeyxe7zSUtbFVcnwudE4ENPkcKqda2+pt7/eZw51JODE1uMlzsdPuytS+zhxjvNg1tQxRXwXa33OdsFVAJS8PY44JwepBwRjdb6a+uP0Jp/Tt67jvoqC5NllDRn4RE89PHcBeasxoUXew9rW+D0sL7J0qM1y3r9zVmg4FauvWiKjU7qeC30bAPd4K6Xupqv/wbSN/TOMnYZVVGpIznYqc8W9U6s7Q1dbNQ0eqKV1moq6N7NP0j3Nlpm5yyWTwJ2Bx+aD5qAXqVrbtWhhyzv38uPLmK9FiZHnykn6HmPE/DH4fXXJvmW9/prt+4ST58VgfLsk5lXh8i1EjzrMrpVjMv2JO+VYzKrNEGKHSJPLJleHSrDJJsukTDO7Kb5j1SqZ2UimdhWIDA47r4CvjjuvikAojclMUmEha5KI3/AHqDRNDpDKnCnk6JlikS6CXxVTRJMktBUYIUzsVZsBncKvKSbcDopJaqwxlpBVElskmWpb634G7p1bVgjqoRbbmMDJTzHcBy7FIyiWpm0vZFl7w6s36e6f8ATLYlazdjCo792svIe5/9OtmVs43FS+/U53BCEJkAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIA5Ye3H/mU/Tf4BcsR0wup3tx/5lP03+AXLBVvuTRkYvbeqxtWQDoQuEhdA3lIPgnWFveEYTPC/IATtROycKia4Joe7ZlrgDvhSBv5SEj0UeohyPB81JbeA/bzWLfw9l0RHQSclRyFSCnhAe1wTNV0joannHTqnq2Sd4GtPVUWacepE18CQM+OABInN5SlUUnKOUrHOBzZ81peH2bXSI5ENPZ5ZssjQvDVkC1mJo9AYWWMbLwOqzRjdB0V04GQnalHRNdOE7UfhlVyZIdaYYwl8g/JEBIqbbCe7Raay/XCnt9uppKutqHiOKGJuXOceiX9SRr3xls1Qy/wyQtP+XYxyjq9uAR9xb9ytd+mXaX4O262OIFTXVVXUycpyXCINjG/juH/et1rv2TYW8J7BX1VoE17sFXNNDHPygVMkjOV0j87cjXBpA3OGDfqtTO0BVM0xq/TFkdIHNo7c8VDx0dJLI8uK3KIxx63Kb54KZ2zypQqinpJv/C/g19k4a1dxtH0nTsNwpvrTQt6t9cJpqrBRTWwwe7ygtHwtMhw37D0Vl6Ov1VpS7Rw0oFUyeQRthzs7Jxv6Le3hjwt0Uyxw3i62a2+/uYJHuMYIZtvgn1XmMrPjjpOS2vTR7nE8N/FJ9L5S53yct7Rws1BcqszRROp42/GZ6l3KAPPfc/cumfZr7CPD3WfCx9XfbldK28y0gkdVQTtibE4t/NbgjA/rZVYu0+daah1lq6waftt00bbZvdJQ+qc2pcxrh3k0TRsQ0569QCuh/Aa0Wy26ajp7fFFHTvpxyMacDCWsyHkXVwS1v/j1+ZN40cTFsmnt7Wv3+jSOQ3GLsB8SNE6gr5aO3VOqNPxvc+G4W8d48RdQZIhlzSB1wCPXCU8F+AtPrm+w01wirKmqIw97w7l5cBp53MBcW4GCMdAuteu9SXHh3Za3VNJp+K5Wq1uMtWI5MVBhH8pKwePKMnl6kA43wsNt0/wv4n0cOq7ZaLVPWztFQyoETRzO65cBsT81yvJslX5c5KMl29Nr4rZBV1Ql5zh1Rf5PT+D+H6lT8MOxdwn0Bb6G8U9kdDdGN546g1LwJCepwHkYPkPA4PirUrm/TWmb9SwRmofRRsro429SY3ZIHzbkfaqU4w8Zr9pS+Ggr4uVoH5J8YwxzR5K0+zFfai/d/W1TC19XDnld5Z2/UsSNkrsmCl7r42+72jUvxfIxbLHJOSSel2XKNOK7gAOCV31HqamrGzWO8zOfaaZhJdG1hMj2v8vi7to8w8Kr+Z4zzn4s7n1XULUfCenvtLddMvhkZb7hDJNFV8oc2CTI5cZzuDv03HyXPDixwq1Dwm1FLb77bZKSF7iaaqYOanmbnYsf0z5g4I8l6HBpnXGTs97ev2PMeMZn4p1qPuxT/lkM5l4e9fHOGFje5aiR5s8PkwFhdIiRywOcVI4zIZF4fIsZcsbnKRE8yuzlJJXdVmkcksh6qQGNxXkO2Xlzl85l0DK1yzsekgcsrXLgC6N52SyGTcJtY9Kon4KrZJMe6aXdPtvnwQovTSdE9UUvRUyRMmNFU9N08RVOWjdRWin2Cd4p/hG6Wkg2bedhuTvDrb09y/ELahandhCTnOufT3H8QtsVpUf9tFq5QIQhXnQQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIA5Ye3H68FP03+AXLFdTfbkfzKfpv8AuWI6Ktk0ewFkZucLwzovQ6rhIUxNIcCnqhAcmSAkuT1QuDVTNbROI7wy8pAT/AGmXLx+xRdr+Y5GyerTNyuG6yr47RZHuTSajE0AdjdI6EdzU8vTdO1teJ6bHomqoxBW+W6x4NtuIw16j5I0jlcESHLVkpiJoQvMsfKFo4G1ZoUyPdPDRusrVjaMLM1q9EZqPbBlZo2rwxqzN+ELjJIU043CfbJbqy810VFbqSevrJDhkFNGXvcfkFaPCPsxXTWNLFetTVJ03p9wDo2vb/lVSP6jD9Uf1j9gK2Os9RpzhRZnUOkLTFbwG4fWyAPqJT5ued/s6JS26FfEmaWPg3ZPMVpfEqvSPZUqqO3Muuv71DpikI5/cISJaojyP5rT962Q7O+m7O0Gs0dpqGjs7HGCG4VWH1Nc8bOJeTlrB4keRAC1M4icQKzVOo6GzvuTYpa+pZB39S88jA52C53jgDJ2W8PBmlt9q0XQyR07ZKOFoZBPRx9y6LB5XYyecg9cuPQ+S7RLzPa1wWZFEcb2V3JZe7JTX2imts8rHUdG7ndBSue1vNuQOcnLsEHO46rk92srW+s4y3oxMDIoeSJrWEkDDRkAn1K7GyU8dyjzW0rLbRg/CZJRzTA+nh9pytG+MvZyq+JvGaSz6Ypoead3fVMxxyU7Mkc7yM4zg4HXZX32NQ6V6i+NGKt6pfA0E01Sz01wp8NLpRMHAkdAP3k/qW1+m9KcSeLGnKm3adtVa+3xwl0s4Hd9+cbRMe7DRnoXZwB6rcnhL2HuHPC+OmrblRN1Heo25dPW7wh3jiPp/ysq4dSaysmjbQ4ySQ00TW8rY4wAGj0A8Fn246t6fMaWjYr8RdCkqU25HDe3cQtV8Hb3d7TJFW2+cSS0lfBTyNdGSCQ9hbgtcOoyDjHitjeF/bd/gnY6dr6+CeOGNrAySQtlGPAx9T9gKS8XrHS6y1VqK9Ni5YaupkkjfMRlzebYemf8ABUnoq1aYtPGKxTXSOmuFigkaagNc0skkDgeU+G/kpZGLjWNdEufUjheKZsItShtfBo3o4Ccc+KPaV4hUluNllt/D5hMlXVyQlrXxNBPLzdCXHDcDfBJ8E36t07qnsjazqH0rJ6vh5XzmSmkbkihLjnun+Tcn4XdMbHfrt5w84p6VvNkoY7bPS0cPIGNpYgGMZ4YAG2On3hTqtobbqe3TUVbTwV1LK3lkhmYHtcD6FKTwKL46g+fzGavGL6LOqcF0+qS0jUO5UFv42aaiqyA98D2zMe0/ePkQrf4MWn6KroWNbhrWY2GBjCldp4Gae026p+g4voyCf/6tGPybT6DwHonbS+jZLJWcz3/UOGuA2e1YdfhuVRlVuS9lPZrZPi+NfjWQr4bXYl+MhNOpbBQajtU1FcKGnuFM8YdBUxh7D9hTt4YXl2N/Ve3nHqTR4aL09mpHE/sQ6Z1F3tXpaWTS9eQT7u3MtI8/2Scs/unHotQ+JvBvV3CasdFqC1vZSE4juNNmSmkH9vHwn0dgrrUKZsmQQkt101R3ejlpqqniqYJAWvimYHtcPIg7FZ8FfDt7SLpxqn8mcYXvB6FYS7yW7vHfsMU9SKu8aA5aCs3kdZpXYglPUiI/6M+TT8P9kLSm62ytsVzqbdcqSWguFM/kmpp28r2H1CarsjZ27/ASsrlX37fETErw47L6SvDldooMMhSSQ9UplPVJJfFSAwudhfOdfHleM4QBmDlka5JgVka5ACyN3RKY3JDG7ZKI3qLOodKd+CE70knqmCB3RO1I/GFTJEiSUcvRO8M+wUdpZMYTnFJtlUNEdm5XYGfznXX/AJh+IW3C1B9n67m/h5/5h+JW3yeq9xF8ewIQhXEwQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIA5X+3I68FP03+AXLFdT/bj/wAyn6b/AAC5YKt9ya7HsbL20rGOi9jouHUzPE/BCdKWQBoTTF9YJzpYwSFB6JoXsmIwnu1SA4ymEkMI8gnK1PGc52Sc4dSJosqwSgsxlYrtSl8+RskWm6prn4BynypAL9152xOqxja5RmtDXBgBSqpbjYr3aYg4jCz10GPBPYE92CuSvZG5rd0oY1eGMwUspKaSqnZBBE+eZ55WxxMLnOPkANyvRtmYjw1uBkq8eGOjbNoW3UerNWwMnuFRiS12yb6rW9RNI3x82g/NPPBrsh6y1RcKW7X+xz2uyQflvd6vEc9URu1nId2tJxkuA2zhRftAcHOLDtSVN6ntxlpWHEUFMSRGwdAAlrLYQWurk1cPFnZLrlFuKLpi4nuv7jLNOXl3gT0TRqbVTPc5OV/gtVrHxDuVlmNNXRy08zDhzJAWkfeny5cSXVVKR3mTjzWLKifVs9nDIrUNLgcdK6wpKDjvpyurxVTQxVLu6ZSS92/vixzYiXYPwh5aSAMkZC6NaJuN+o6KjL5Iq6GeYSVd1jw0EudjuwD0x02/Vlcy+AusYLPxvt1yllcyqZBUe5kQtlBqDGeQODgQGncF23LnOdlv1pDiVarNpm1y3ytbcuYum+iKdzomwyEnJ5jsc8xPzW3S1XBbPI5m7bXo2ll0xT6usjX3CSKlqJWgmSjO4b5ZPmMZx95X3S9i09w4oZ6egJDpXGSeplPPLI7HUu/2wtYK/jrbZWyT0t2noad8pLKN4dI6Mf2/E58MKH3/ALR1HTNNHFc6mrqJRgUzD8bx6jOw+aVsydcxjtldeN1PTekbB8XePVv0nbKmpFYyKCAEvl5th6D1XMvjF2uNccTNXS27SIfQ2+nd+UqHx95K8+Gx2afvPqrs1JpLV/F6FojoJ+5lOIKZrTjfYPd6DOSegWzfBLsc6Z4YaGZTzW6nuF8qXn3qulAc5oJ6s8hjPqcpeiqV0nO/9hm2+FEejHW38Tk9eNNat1pXia+XGtuEz/gEMkrmNA8GtY3YfIBWDpLsYcTNVU7TbNC3Geizy98+s7pnqMuAz6gLpgzsh6O0xqEaie2WvkY8uZSyENiZk7eGThuyuKzaooWzx0ELI2wtYRExmGtaBgYA8t1p/wBqtKKQvDKypcs5U0vZn428KS36OlqrYS4MjpIqr3lpPgACNvsU10d21+KnArVVuteu7a2stDpBFNUvidHLCD4nwLfsXUJtitlxe2olpIJi0YYS0ED1Hhnc7qvOJvZr0lxLoJoK+gje54wHco5m+WD+9Kzx031xX7dy5Zk5ezN7X5D7w24y2PiHaKero6lnNKwO5c5G48D4j1VgMmbI0EEELnNW8JtadlPUD6i19/cNKF/OAzJ7hufEDw9Vsxww45UWqrZG81BbJjdud0rXnyrn5V/f4jVnhynDzsflfQ2Adnq1wHovMh5RnqEzWi6x1MTZA8Bjt93ZTo93PAXRuGT0J6LWjNSW0Y0oOD1ISxXGMyuAO2UvjqWPGxCqO46x93utQ0EfC8j4TkZ9EqpteEEDJWJDxSuEnGTNyXhVripRRZlYxkrDnC1x7S/Z6tPGC0vqKbu6HVVJEfcq4AflMZIhl82E5wfzScjxBtFurZ6xuI2OcT5BYaayXi7VPevYY4/N2yquzPNmpUJuXyCvC6ItXtJHJO4UNVZ7jV26vgfS11JK6CeCQYdG9pwQUmc5dGu0B2OKHi5ML1Q3SGxaoYwMdUOZzw1TQMBsrRg5AwA8bgDBB2WoGtuyXxR0UJHnT5vtIz/T2aQVBI8+7GH/APqrcqvU0uvh/A87bjyhJ9PK+JTkhyEklSqsZLRVMlPVQy0tQw8r4Z2Fj2nyLTuEjkcmUKGBx6rGSvbjssZ2UgPoKyMd4rD4r20qLAVMcs8bkkYUoYVwBdC/cJ0pXpnhO6c6V26rYD7SybBOUUmyZqZycY37BUtHGboez2dzfw+/R/4lbiLTf2eDub+H/wCj/wAStyE3X7iGYe6CEIVpMEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCAOWHtx/5lP03+AXLBdT/bj/zKfpv8AuWQCrfckj6F6XkdV7AyuEke4/rBOVLIWkJviblwSxr+XACgyaFr3cxSykcWN28U3w/GQnqhpe8AHmqZNIkiSaSkPvABOym9TDkAqIWCjNNKHEbK1+H/AA/vHFHUVNZbLCHzSfFLPIcRwR/nSPPgB956Ddeby07LkoLbGoNKO2N2lrfV3SvipKKmlq6mU4ZDCwvc4+gC2G0z2PdRagp46i9XOi0/G4Bxiee+laPUA4B9Mpwo79pfgzGdOaTa2tujvhrbzIMyTO6ENP5rB4NH25KsLh9YtV8RrpFLcTUWXTVOQT3mWz1Z9B4D1P2Z8GoU/gl5lstff8jFVSyn0pbE2l+xZoehmbJcbtddSyN601K0Rxu+fKMj/lBXhpjhbS6Khih0xp60aadJ8LJZG95Uv+7Lj9pX3WfESh4V6fhjp4Yffqj8jQUDT8UzvFxA35RnJPqB1KlXDawV8VEK27zOqb9WgPqpnfmZ3ETB0a1vTAR+MlKvrl2fCXq/9L/Q3+Drqs8uCW1y38P9sdLJpOqtpElyv9VX1J3MULQxjfTxUhnpYaqAxT0vfRY6SDKk1o09Exgc8ZPmU6y2qN7SA0LqoutXV2Iyy665dK50av8AFTsraL4oUsxNvipa8g8ssbeVwPzC548euzTqXg1cJS+KSrtZJ5Khozgeq7IVlh/ylvdbOz4JJrThha9cWCa33KnjmbIzlJc3K7TC2Del2GJ5VM9dfr6+qOJvZ0m9x4xWeeScU5LZYmu92bO8uewtwwP+Fjtye8dszBdvjCs7V9ZfdPV88NQJqenbI6OMVLy5xAJ8cDPnnCt7VHZgdwd45We601FT1lqErpWR1TuWFsmDyF2ASQHEHlaCTgAKcVvZZvfFbU9yrtVXwVL2zNY6ejfzxkOALeTP1WgEDl6jG61V/cr2jKv1Vd32tGqNjl1NxAukdsscctVUPPKZTkMjHTK3n7O3Y+smhKOHUGpYjer69xZM2Q7R9OgPlupvwj4Jad4T2Z4oWww3GNxbzP8Ai73BOSdum/6grtt5gfNK2N8Uh5Wc7BuHeoKIwUO3cXnNz79jJRWQW8sbT8gYyHu4yWgPx4DPjhLGCo92je2IGVgLXA4+IL7SjmJ7twxG7dmN2pbGzJy1xb44O6s7lOtCWGmbURyQSxHkcMHmOVWFPwnuFBro1brnEbZkuii5PjIznkPhjruPRW+5jjhzdiOo80yXEAXISvdlnLswdcquyEdLfoTrk03p9xyouR7SBG6B/jgY/wCpODeuM59UhpHl0Y+Lfwz1Sxh8CNvNXwfBTJcie5Wqlu1M6nq4GTxPGC14yFQeruzHFb7m+7aSk9wmLuZ9I04jd8h4fsWxAPgF8HTfHzVN+LVkx1NfqMY2Vbiy3WypdJaevtroo3XFrHub1bGdwpz79NHQOcwgkN2Bbn70/OiGM4BysE1ujlacDlcR1CohiumOoMusylfLqmirzog19U94b9d3NsOmU/UXDukomd7UvDWt3OTspeWwUDA44aoNxK1DI+xvZS8wbzAPx5LFuxsbEhK2xbl8DVpysrMsjTW9J8bPbtVW23SdzbqZsnKcd44dfks51xWujwIIy0+hVd6YlEzml55ifBWbQWiGrgGG7+aVxbsnJT6Ja+SHszGx8VpWLfzZF67nuvMQ6Snl8MPPKf3JvpYnUxdFUyywyjo8Egqwo9MddgV5rNJNrIQHtBcOjgm44Fkn1S7iTz64rpj2Ka1xoyya0hFPqWw0Go6Vww2eaPErf+MbhzT6grW/iD2GIKxs1XoS8SU827m2i8uyP7LJgPu5gfUrexmjRE3IYDtgtO6j1908aNrpGD4WjIHkn4V5GOvZlx8BC2WNkv2o6fxOROrNJ3vQ95ltWoLXU2mvjODDUMxzDzaejh6gkJn5gunvEXS2muJ9mfY9T0LKyFwzFUtGJ6d3g6N/UH9vQghaIcdOz/euCtyZKXuuum6l2KW6xswAf+5ygfVf+o+HiBpU5KsfTLhmNfiSq9qD3Eq/myV7BWAOyvbSnGI7FLHYShhSNhSmM9FE6LojuE50qaoN8J0ptgq2A7U52S1j8BIIDslIfgKtoibq+zqdn+MH9H/iVuYtLvZyO5jxD/R34lbopmv3UNQ91AhCFYTBCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgDlj7cbrwU/Tf4Bcsuq6m+3G/mV/Tf4BcsgVW+5JHoDC9Abr4BlesYUdkz3GcFZ2buWFjd1nZscqLOodqGDnAUotFBkhRKjqDGQMqb6el5gMnwWbkSlFbLYrY/UVPJLLFBCxz5XuDGMaMkk7AALdhtvg7PHB6nsFCwP1vfmtNbNEMyNLtmxA+TckAeZJWt3Z7oYKniRS3CqYHwWthrMHoXtwGf+sQfsTpxN49T03EKW7PjFbPAXNp2Pd8DX9AT5gJnAp1VLJ1uXZC1slK2NTel3Zsvwn4a2Ph7SNvl9lhqb45veST1JHd0vjhudsj+kfsTzqrtZ6bsIdQ6cI1Dd3j4I4D+RafFz5PIemVz7v/E2/wCu6nvr7cJqmAO+GmaeWMnwDWDb7eqlemZJYnQ0FM3v7nWODZBEMkZOGxt/23KQXhTun52ZPb+C7f8Ao3J+MeTX5OHXr5vl/n97NwOBEF04t8T5dR36b373BrZHyAYijOT3cTG+Azk/3TncrdOyVDYiHHC164M6fg4YaHo7dI9jrjN+Wq3tPWQ/m/JowPsVoUupWRNbh4ydhuvMZeZGeRuC9mPC/JHpcPw6yGMlZzOXL/Nl2W68M5QMpebj3x5Y/tVT0Wpg0NYHjnd6p+g1MyNga12T4la1PiSa02Y93hcoy2kTttRDBlz3Au8SU2XbVLaaF3d428So79JvnbnJ5fVRTWl89yoZXc2MNKZeY2tQ4IVeHrq9vkq/izxQkbqSlhZUPjmHOTLFKYzE3lOX5AJOAcgDGTgEgZKnOjbpbmWijm7qZ9qOW01RPGI55TgHMmDk5PievVaS671VJfOJPLDC6sqqdrpoIcnBLXNJJ2xs3mO+232LYHTV8h1ZRCSnu09RqiqqGOdb2w8o5OQEADA3AHplaePtVrfcRzYrzml2RdTK6aCpfb6+OOA4L45ZnkEA7gAqQ2q5MqWtfFCyCogY3mDX47wZ8FWNtvcOoqea31jnQ3KnLne8VkxYWcn+j5cfNP1puX0pUtiudSaSZlPyxvLDjbpzePRTbFUXBQ10ji2ZsYDX/Xbj4h6p4iqSG/EMjwI8VXlirpY5C6aqDKiNo5WPyBI35lTC11NRIHtmHI8bgFSjIhKKHuOTmZkHbyKiup6o08rHsw54dhp8fkn6mqmzucMcjx1aoDxFfJByuZIY3jffYOHh9qjZL2dhXHU9Eut1f3/L3rTHKG528k9wyiSP4HZwq809f4/dY5IpxU1GA2RmckfYpvQzB8QlDeRzurUQkdnEc2uOMOP3I5snA3aQsTXeB3yvrnE/VIx5JnYtoytII+E/YV9Jx16rE1w8cFyycw8eqlvaI6Gq6QGXZMFVYmVDHsewPY4YLT0IUqnHO7deWQA+CyrsaNsm2aFWRKpcFYM0RJaavvKbL4D+aerf3qd2H4Y2gtT22kYRuAUlqaX3YGSIYI3I81GnCWM+qHYvvzpZSUbO/wARxaBheJJGtyScJnh1HAfgLwHdE1XnU0dLOGc4w5ucefyWgsivXDM50zi/aRIairaz6zgGpqr3Mlhk5xuBkH/FVnqDivRhsQo6hs/M9rH92ectJ2GQPVMtLxgYyvNNWsfEYtpS/Y8h/Ox5DxVErk2SjB+h71pa6IwmeDEM5fnrseuQPIgqH6pqLZW6ep7JfqdlwtNzgcysgk68m2Hg+BblpyN/FYNdapZLqFtqiDpBVyNMbmHYZxuFW+t9ftumsZLTRPzyM93iYNwX42I+3b5LOl7T1+pp1cRbfyRqdxl4Y1HCPXdVZHSOqaB494oKtw3mp3E8pONuYYIPqPVQtrlt72ntP02ouEkFbFK2pq9Oygsl/O7pxDJGn0/k3fYtP2Ozha2Hf+IqUn37GHm4/wCGucV27oUxuSmMpGw7pVEeicYkOEBxhOdMdgmmA9E50ztlWwHWF2yyOk2SSN+Gr6+XAUCBu57Nt/OeIvp9HfiluwtIPZov5ncSP0b+KW76Yh7o1X7qBCEKZYCEIQAIQhAAhCEACEIQAIQhAAhCEACEIQAIQhAAhCEACEIQAIQhAHLD24/8yn6b/ALlk0rqb7cf+ZT9N/gFyzb4Kt9ySPbSvY6ry0LK2M5HkoMmjJG3IWUNx0XxgwF6UDpkjOHBSuw1vdgDKijG9E52+funBK3R6o6LIvTL64XXr6JsOoqxn8oRHGPucf3fcqp1JcJbjdHy7uPTPqrm0noea2cD6y81TXMrLvL3tJEephjB+L5OLj9gC1/rK175nRsBLs4IC06ouqmEJcCPFlkpR5HKiqTTTskzzSM+qPBvr81tL2cNMw2aL+Ft4bmXB9yZJ4eBkx+ofafIrVixUkTK2CSsPMwPBMedsZ8fNbFat4hMoaWWjpnhsIha2Hl6AAbYWVnznOHk1+vf8j0PhlEIWefb/wCPZfP4mxLuKwdXU7TNs6R3j5YH+Ke6fi9ELhJzTZjp2gEA9XHoFozS8Tpe4hnfIeeGpAdv4Ej9yd9J8VQytqa2qeTDTPdLj/ukzyQxo/stAP8AeXmbPDHo9lV4lHqSbOg1l4hue9gc/NTJ0YDktB8Pmri0pDPPEyWo2cdw3P1fn6rVTs726ruEcd3uWXVdRhwjPSIHwHr5n7Ft/p2ENgYM7Y+xZMafLs6TTyblKrcV3JAwFse3kq94nSFtqqOXOeUqw8AR9cqAcRKYz2ycZ25TstePGjBh3Zz6rILld+JNZbLdURU0tVTytkfO/kb3bSHuHN4HDVfWi5WMhM90utTTa3YYO4YHM7tzS1oZl4/qnrlaz8ZaKS364jLJvdSZ2t70uLQ0E4OSPDff0Vz6UvOnrXD9B3VjHXdkvefTdI4ygYZlrQMgHJwPuXpqmuhM8vlxfmsvGoneKl1FXw/R94piXNdEwvkrJHuB+Jxd08iBvlShmo5nT1dLqKKq+lmtZHC9zwO7x4EdMHPVVuLqGhkWpGVIqZohU0tRHCxsjjgBnMevLt0ynqnq3UXu1DeTiGciqNTT8ksuCNhzZ6emVyX3/sXS7ff7Fz2atbO6GG4ielk2EdSfia5uNgMnBGfEKbWSuFY8B9WWSR5DS7YO32VMaaqI42x/SclaKd7C6ic0DB364PgfQq07XWzzimorlD3DGMBbMIxk/wBHfxCgnvn7/U60TOmuGZDHNiOcH4T5qt+N9wfHQU7g4tkjOeUeKmoMVRKI5XuErT8D+XYjCrPjnde7sjO8Hdzx/ET/AEh4Lsm3F7OQS6kN/D4OoZG19VO63SSs5qfnbzNm8D8lcthuDZ6fvZZS6U9WeB9QtXtE36k7zF5lrGFrA6lZGNiT0znwV96P1I+5wwOrqb3ZrGhsUoiLQ5VwaXYssTfcsuB/fR/CSPQrwZeQkAgOWGnqDIBkcrvPzWZwEj/ibkjxCd3tcCWtM9wStz8f1/NKWuyDvukJqWxdcPPhgJV3nOwOOxIUov0IyXqfMZKysbheI+qztCnFbZBs+OlDGknome+XdtPSSPYcuaM4808uaCCFCdaWmoZTvnojl7Rkx+fySmZZZXW5QW/qNYkIWWqM3r6FIcTuJZ009t5gdmh7xsdU1p/kidmvPoTgH1ITb/D6PWlPSS01Virgdzsw7HeMOz2H57H5gKp+PF3Fnqqhk7HC13JjoZo3fmOOzh6eY+S1s4ecXK3TU1VbaipL56GZ0QeT9blOx+0brw9crbN2RZ9LtxaFXGqa7osjWPGCbh5qKppKF7qysjnLnmqPMyGMknumtB6+Z8PBQ6Hi7JaLxDc6aZ4oJ3EhhOeUnZ8T/sPXxBafk16jg01rK43G8y3aSjnq5DK+JjA4B5HxePTO/wBqiX0DabJT1NVcL5DV2wYcxsLXtldIN2tAIwXHcdSN8novS1XUyilz1evDPB24GXVJtpdKfD2v3ZspZdew1War36Rwo4Hmke/rkt658m5A+bmhMGkLqzuq3VF1kZBH3hjgfjHPKQcuHo0fEfXCpe1akr9TXWO3xd1E6oY2PljPwUlPzAhp/rE7k9TzHPXZdxU1ky7C26eszGnT1M0gVL3lrXkfXe4jfd2SfPb0XLIyX9r1ff5L/ZdS015muI9vm/8ARY964gm/2zWVE10csVVbZWu7l4ewyNhc4uGPRrT6ErXiF+WN+SvTscaQpuIGv6+gqgX2eK31MTyBy83esMRIHgSHHH9lVhxG4cXfhPq+s07eYXMlhcTBPjDKiLPwyNPiCPuOQtDASr6q18jL8Ucp9NgxsKUxFI2O2SmNy1WYaHCF3ROFO/omqF+Evhd0UGgY5sk2XiWTZYRIsU0uy5orZvL7Ml/M7iV6fRv4pbyrRT2YLuZ3Ez9Gfi1vWro9huv3UCEIUiwEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCAOWHtx/5lP03+AXLJuy6m+3H/mU/Tf4Bcswq33JIyx9UuGBGkLAlDXZaqmSRmi+PZKfd/RJqf6ycYzkbqEnomjFGwA7q5OzxwXHEe8yXe75h0rbXc1Q87e8PG4ib/ifL5qvtDaJreIWr7dYbc09/VyYdJjaNnVzz6ALemqsNv0tYqDRdgDYqOljDHBh3kf+c4nzJySVo4WKrm7LPdX8mbm5DqSqh7z/AIRCNf6wgr31VWWsgttNF7vS07RhrWAYAA6LUe7TxsuU7oRiF7y5g8hlbNcVtEVz7ZJSU4B7tvMeQ5+xayyWCsZNUQPjdzxEnOPvXcrqlLbL8JRrjpGMVHN0KWy3+eopo4pnOc6McrXHxHkm+goZqqrZTsae8c4Nxhb19nbsdaf1XZIay+U5qJJADgnCxL7YUrcj0uPVO56iaFVdW+NkrQSA/DvtCs/gXpqG9Xamr7k4e408xmjid/pJc9SPIABbC9szsX2zhlo12qdNc0UNOR7xTnccp8QtWNG6lksvuXI4tjDAMfbuoRsWRW3Am4PHuSs5R034YXOipaSFsQaAAMK/NP3pj42Yd1C0G4UcSxLBCHSbgDx6rZ3R+tWyxxAvAOMjfqvK30Sqns9hC2N8DYWOtD2DfwUe1WwVNHKNskeSQWi/CeNvxZyEurpW1EBwc7eK5GZQ6ulnPTtRWKSiuL6lgI3yDjxSTh5qyiuVvpbFU1sstHUyNqnVEcDDMJizZvUYGeu+yujtPaajqbPUShgJAJytI9GahNqv01pZDH7xVyhkUrjhwJcPhB6DP716bFl1VnnM+vps2bqWK6stNZV2yvtwu94D2wwZlMjYyCMABp+LPRTK0yR074oY7dUT3tlQ5k1ung5o+XwaGg83MN1rvpjUVXJILTFQMbeqedz31JeRMOUbtzzY2xnPVWlpPUckRoa+13Grm1C+R7pGxROD4x5iQHLid87KyTM1J+n3/ovbQ8bp45aYmjFQ9zminqQ5slPy7nBdgDxGM+Csmw1dTaaMMbUsr4J48OaM/k8Hp6KltLVdPqCmpRS2+vrb5zvkrJC4ytc0b5DQMjHjlW7pqVtJBG+0TVM0r4s1ELowA3B388hQj8jkiwKGRzYIxVDnjc0lkvNkj02VS8eKvms7I5mgSMGA4jflKsa2OayJnNUB8DhkhoPwn1Cqvj5JMbbG2cMyCA2T0Km+YkY8SK60pDCKjmvbqgZhzByPHNnHw5z4K9+HV3qblSxyVVyY1lNhsEc53d4Y+S1003T0rBUPrKySnq4mtMEYZztkPkTnbZXLYb864VNvqdQU80dK2PuYpKeLuy/HTJxhypjxz9/qXS5+/oX9R1rpowaqPu3eBHRLBXERB4c0M6bqIWe5NnomPke40GSI5M4LfLIWa6XqnoaUSSnmaNmPB2ePVMuelsXUNvQ/xVJdWsEMfNGfrPynUyKFaSu8lzlknlp3U2AA1p2BHmFJ31HkVVC1a2TsqaaQ4smAWUVTQOqY31waOqR1F37sfWXXlKCIrGlNkjluLYwd0xXS7tLXbqOV+ouXILsKLXfVDWsd8ePtWLleJcNI2sXwuTabK67R3D+i17pW5xRckNa+Mljunxj6p+ef1ZXI+53uqt+pKsTc0VUHGOZh6h7TyuB+0LqhxT4gxUFoqSZQHchA38Vzg0vwuu/aL4+3u2afjd3MtbNPUVTW5ZDGZDlx9Sc4HilfDZJuyc/d7m9nxlVXVXF+0QOl1FWVNQ6CJz3hzskN32Umq4K28SRDmiFMxobGJH8vdjG+QfEnJJXRLR3s97Hpu0MY6AyzcvxPfu5x8yVVfaB7O1Lwws8FVSWipuUtRL3UcFLET8WCfiP5owOq0oZHt+xDRi3VxnDVlmzVabUNPpiw1EVvc+aoqPyYqyOXvHYIe5o68rQS0HxLifBNtBQyGOOihic+vmw6cg5IJ6MHlgbn1PopZHwX1jfbs2ruFsfC4YENOxuWxty4BuB0A5Hbdc9eqkdu4WXSiM0fxU07n8szgwvLx12I3weuDjruntKC36syXNSlrsl2+/mXd2TamDRNTFHT8pklmjhkmbuHvcCTv4gAAAepP5y2p4ycI7Dxq0myhuzO4m3fRXGMflaSXp9rT4tPX54K154DcPK2W6UAFNKyho3cwMjcF7zgucf6xw0Y8AFt5T0hjoJ4pXDkJBGenNjdK9E4/wBxPkYc4Wf22uDlHr7QN54YapqrBfacwVkByyQfyc8Z+rIw+LT+8HcJkjeugnaQ4WU3FjRdRTRsA1LaWOqLZUNxzSgbvhd5hwG3kcHzzz0jcRs4FrgcEHwK2se9Xw+a7nm8rGeNPXo+w5RPS6B6a4XpfA5MiYuD9limfsUB2AsMrtt1wgzen2Xbsu4m/oz8Wt71ob7Lc5dxO/Rf4tb5K1dhuv3UCEIXSwEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCAOWPtxdzwU/Tf4BctBsupntxOvBX9N/gFy4jYCq5dya7ADgLJGsbm4K9xqpnUKYtilrH/CEhjOClLHbKqRYbFdmOso9G2fUGqqnHvOPdafPUbAuI+8fcpBY+LUdxvjmPlAlleTzvdgD7VTdhuzm8PHU7HFrW1DuYD1wmrTM1VNdmMpYu/keccpWwrnCiMImbGjrulN9zbKepkrKId650bX+LjkO9eboUz12iqV9K+RtO0H85+N3FItKWTVlHRs92t0s0UjRzQHEsLv7pOR9if6yC9zVsTaOzVtrYP91R1AJgAHUtLt8+Sz5Z0e0mv3NdYFi01F/sQrS3CaCK61N2fGBGx3wN+XX9a307O94pqTTfPKWiKFo5neR8APVaR2bXbrdcKuy1jhyvfmAnbY9W/etoNES1GmNK2+KOYd9LmomiI6B31R88YP2rzGZKU31P9D2eDXBR6Y/qSDtgaopdQ8I7zRRjmbLCRhw6bLkrROLWPhzh8TiPsXRrjnffpXS1U0nPNGQVzeucn0bfJj+YXkO+WU54emoPZneJaU469CzuHmspLbUMjdIQAdt1tbw74hNnhjAkDnDGy0VhlMT2yxn1BVl6A19JQysY55BB33V+RQrEVYuS6npnSDSOse9a0OeObzBVg09+E0WA4Eei030JxFZK2L8qR08Vddg1i2WNuXj7DleZsplXI9TXbG1bFPGehF1ss7B8WWlczOJlmms+op9i3DyQV06vdYy6Ub25DshaZ9oPQJdUS1MceSN9gtbAs0+lmT4jT1x2isNEcQaQCjo5GT09Zy8skxl5mykdMDGRt4bq/dEasrKDNVQ1D4HfUkmjk5XAHw65WnU0DqWYjdrmnYjwVj6C1q+Soja9zDUsbyuY845x/SBWrZHa2jz0Xp6Zvjw91IX1dLDY6updWTRETjmEfMd8gHO4x5rYXSd3iuUNOLTSSU9RBTn3wmo+vv8AEdz+oLQfSl/MM1Ox4FHzgP71r+cEEbdM/vWy3DnVMktFBDT1oFLGAJ5xFh2T+afEhKp64JzhvlG0VBV0hLqmijPucYaZYnnJ+X3qk+P10hNNGGyu7mU5Dc7s9FYdJc6pkdNUxRxU9IMNdLEByvAGckfLda0dqLXVuo65j2OfT0Dp2RB3MMFxOMjy6FWt8C8F7WzDpWuddXMtUIpWSh7pGzzP7tztvq8xOPDorT0nqSVkdulgrZ7jc4nmMUU0feMDfJpyc7LWa2agjuU1KzkbRxtxG+oAJByfrO9ceXkrN0ZfpaipprZQtg97bM50Vc0ljnYHiScYVO9MYcUzZ6w32ngj97fIXSuc4TW4NI5fl5hRbihryPQ9uirLuJZ7JUuYGRUbi6aR7s8rMDducYyduij9k1lT00XvkjpxdWF7nT5Do5HeWMbFQut09HrvX9vulXWe801KwSCmZKXRtlJz8TSBhzc48UpkXKuA5h47us0bF8KrjWnTVPNcpXSVcwMj+Y7tBOQ37BgfYpo+6NP5wUAs1YyClZG0gADGAl0txc387bzysmOU0jYnhqU9pEkqLoMH4ky191LQcO2+aYay7AZ+PCjd11Gadp+LI9ClbMly4HqcJLkcb7fgxjjzjbwyqe1vxIFrikL5AAM43WHXev4qWGQmUD7ei1E4s8V3zzSwRy8ziSBg7KNGNLIlyNW3wxoijjBxcrr5I6it3PU1kzxDTwx7mSVx5WAfaQt/+xT2c7Z2euH1DBcHRzajuWJ7jV4yDKR9QH+i3oPPc+K5d8EL9RnjLaLjcXCZlul76Njjkd8RsT/ZBz8/kuuug+IdNfLVC7na8OaMLUuksWUa0uFz+bMSULMyuVqfPb8kX2YWcnQYVVcQadsde6mly1sztnAZAB2J+7I+ZUj0xrGKrmdQyPHeAZjyeo8QsupbFFqqJgMndSxuBB8wCDg/ctyGRVkQUonlJ0W483GZWFXw+o+dzoaKLuoohzADc53IHrsCsdJwqoJniVtMyQSHm52btP3qyoKb6JpI4aoASSuJe4HIz6H7glMTmxu7sARR+Ab4nxV2tFDeyN23QEVvazugyFnTlYN0g1HafcYjzOc4j6obv+pTyCrawfAzlHmdznxUH1/WiGklc6URNbvzE9f3qE29cFlSj1clLaiuz7XdGTBkwY2Tc8uGgeP+2Vo12gNOw6W4uXuKlaGUlY5tdE1vQd5u4D05+b7MLY/iTrylo5pwZpXHJw4NWuPHm8NvmoLFXNJLpLYwOJ6nDnBVYkZxu5XDQz4i67KPZe2mQWF26XwOKaoHbBOEL1tM8uODXbLDM5AecLFM/ZAG9nstDl3E/wDRf4tb6rQj2WJy/ih+i/xa33Vi7DMPdQIQhdLAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIA5Z+3DGf4lf03+AXLdhwV1K9uD04Lfpr8AuWYO6qlyyaPbzkr0wrxnICyRNyVWdMrQsoOGr4GgheZDytUHyWFh6Et77lpG9hoJEcjSPnhTHhbZW0twgPLzPLviOOikfB/h1WycLY3RQOdVXSQzdOjOjc/YM/arl4ecFWWp0M9WeeQbnbYLubdHHqipPnQ34ZjzyLZSiuEy6uGlraLVFI5vKeXxCV64pgaJ4x4EJ508+noqZkTeUYGE36xIfTvPUEeC8A59dmz6WoKMNGoTdG/TvFqkjnHJbKZ/vlXIegjaen944b9q2cZXcuXAhzH7jHT5KLx6Sp46ara9oFVXAOl82sH1W/tP2jyXujMlvpfdZnZdGNifELUnPzdfIzKq/J2/iRbi7W/5onw74S05C0L1ac3ac+bity+Ll2LLZM0u8D4rS3Us3eXGZ39ZbmHHUTz3iMtyPllubc+7SuwfzSf2J8jldTSBzDgqBAudLzA9DspJbbqXMEcx38HFaEloyIT3wy1NJa+loZGNe8jHmVeujuJ/O2Nom39StTY9yC0/aE5Ud7raB+YZHjkGdgT+zokrKY2GlTfKp8G+Vt4hCeMCR+yifEa5U92t8oyHEgrXSwcU5zTNEzi142z5pxreI7qmItMmcjxSkcZwltGlLLVkdMr7VduEVwlLRgZKjbmPjcHMcWPG4c04IUpvVxjrZS7OSUwTFuVpIxpJNltcK+IUbZm083dun5O77urPOCcY5mnw8/THitmNFakjtPJTyPJqmSDL4Htex7CM428VofarvNY7lDW0snJNGc58x4g+hC2o4Ta5NbZ7OIaygno46kytbWBgk74/Wj5R8ThuDjp4pO6GuUWQfozb2j1ixtplrTPLG2Nw5Le7YzDG4BBxsOvitDO0nxUg17dYaC0F0droXF7iJC4Sznq4HO7QNh8yfFWH2hOJNpstjNktNZNW6hef8qcC0wUIIPM1h35nODmjJwWgHO521abMHUpHipVLjqIuKT0XLwy1y24UUNNVTTFjSO8DHgZI2zv49Fd2nb1PTR0tC9wkFQRJDyyc3KD5AdCfJaV2TUT7DUyN3fTSkd6xux26EHzV+6C1nTVdFUdy1skb2NMVUD+UieCP1eY67qFkOl7Oxe+GbS3fiJS6T0/PR23U1PR0kUQrHPuZ7trqhrS7uwACS4luAB1UO4X8aX1s01ZcahslbVSummkwG8z3HJOB81rpx11vTVNLY9P0c9trhSh1XPXUTXiQyvwO7kLsbtx0HTKr206xq7WR3cjsD1S9mP58OR/Gv/DybR1DsnFClqWNxO3p5qRQ67he3eUFp9VzQs3Gy4UAA7533qWUvaUraeMZeTgeayJ+Gz9Ddh4hU/eR0Crb/TzQF4lHTplVBr/iRBa45Py2w/UtP7l2kNT3ueskprrBbY6VrXR00meao65A2O/Tbbr81E9UcV7ne4g6eflc5vx79D4or8MkmuthLxStp9BYHE7jLJWvlhhk5ydtitfNSaokaZHc3e1L+gPRqS3O+Ole7kJLj+eVH5z3hJccuPiV6GmmNa0jzWRkTse9i3SF8nt1wM4eRK1/PzZ6rfrs6cfXyUFPSTTHIAHVc7mf5NUNkB2OxVmcNNWy2O6wlryG8w8VzLx43x5J+H5UseWvQ602/X0sggrqSXlqIXB7SD1x5rYbSWqafUlmpbnSvBinbkgH6rhs5p9QQQtAeFmuW3W3REvAHKM+at/hZxMZw71022XKcxaev72tZK8/BT1ewaT5B+A0nz5fVeVp6sa1wfZnqM+mOXQrYrlfQ25rI4bjTmOUBw6g+IPmEzCGemaIDzSuG4eQT49V6bcDG7lJ6JSy7QxY53gLdry0uGeKsw5S5ifY6esqeQnLcHJJOEz6l0ZDXQl9Qe9IGwOwUjhvMDzgOH3pRKBWwkDcFNO/zI6revyFI4qrmpWrf5mm/G6ih0jAJjYKKooXO5HSuibn1ycLTfj9BTwastRo4+6opLcx8LB0aC9+y6YcV9FxXq0V1uqYuanqGFpIH1fI/Yue3aW0HXaWs2iq2pjJDPe7VLIOnNHIHx/8pkhI/slJ+H2NX9E3zyanidS/C9cFxwUxCUuhfsm6E9EsicvUHixe1+yxSv2Xlr9ljmcuaA309lacnih+i/xa36WgfsqTl3FH9F/i1v4poah7qBCELpMEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCAOWntwjgcFv01+AXLIdV1N9uEf+0t+mvwC5ZY3VT7kkevzlmjWEBZmDAUGSRmY4qX8LuHNbxS1nRWWk/JwE95VVBG0MIPxH5+AHiSFDmnBW43Zet9DpWzQQtjb9KV4bVVcx+tykfk4x6Ab/ADcfRQlJVxdkuyL6q3dZGqPdm2vDLhZSiho6GmhEdJBG2NjceAGAphxE0M7TmnZaqmiw6JhOAOqmnBmCGekjxyuzjOFP+ItjirtNVTS0Ed2T+peOvnZlSds2e7p8vC6aILSObkXHaOC5vgdLyFjiCCp/Z+JlFfKWaoleH01OAXb/AFnH6rPt/YtPOPdrfpPifdoKdzmwvkMsZ9Cf3ptsnE6qo46OhbIWUcRL3DP15D1cfsAA+S0/wMJxUoCb8QnCbhP0N2qe7iveZ+cFzzzeiS3esjkjcScOHQ+KqPR/EFlVTxjvPDoSpNctRMfTl/PnbzS6ocZD3nxnArDjJd+WmlZnwK1SvE3PPI7zKvTi7exOZAHZz4ZVD11NM9nf927uC8t7zG3N1xn7QvQ0R1E8pmT6piWEBoS2Nw+1JGNKzsJV7Eo8DpS1z4MYOW+RTjHdgd+Z0ZIwcHGR5JijG+6UtCqaL4tjqysEe4d9yDcyPHKb44nSH4RulUVslfv0XNE9s2a7NXYb1t2o9FVupdO3m0W6kpax1E6O4OkDy4Na7I5WkYw4KX8UvZf8SOFfDzUWsLnqSwVNvslHJWzw0zpTI9jBkhuWAZTD7O7V2pbJ2ldD6epL/cqawVddI+ptcNU9tNM7uXbvjB5XHYdR4BbN+1fv2qY9Z6IsFlvVxobTc7XUsrqGmqXxwVI71oxIwHDtiRuCrFGPTtlDdjsUE+5VdJ7ILibJHHIdT6bLXAOwXzZ3/uJp7M3Ys4ia51Tf3WuS0W6y6au8tsqa+4mQxVVRCcOETWAP+H4TzZHUDfcLqNxm4dXniXoWgtFkv1Tp2qjqYah9VS1MkD3Ma1wLOZm+DkbdNlg4HaUtmktC1Gl4JRJM2oqH1Ly8l8z5HEvkJO5JJOSd1XNQ61XJd/5+R2udjqdqfZr9Pmcze0J2A9f8O/o+6e/W++2y63OChmuNPI/mglqJQxkkrXDmLS94y4Z6jzTi32Q/FNrSP4Vaax/bm/8AyLeTtUwXy1cGK2x0sMTbYIYmRVsXMJIXROa6Mgg/C4FgwfRJ+wZfb1f+zh71fLvW3m4i4VrPe66odNLyh3wjmcScDwUanCUnDTTRZd5salbtNN+n3wc94fZg8RK3ibcNEt1FYBcaO0094fOXS92YpppomtHwZ5gYHE+hCj/BXsJ8Sdea017ZLVeLVabjoq4toa+OvMhjnf8AEQ5oDTlpDM74yCFuF7M+rv181Zri66jvdffrg6gpadtTcal88jY2ySODA5xJABc448yVuTYuG1v01rzWWpqKJsU+pYqV1YG/nSwsfHz/AGs5B/dV8YRmk/QXsssrk4t8nIDgz2AOIvaV0lUa6tWoLDb6aquNVA6CfvGFskcha7la1pAbnoPJSqj9lXxSn1RcLG3VGnPeKKjpqx7y6blLZnzsaB8HUGndn5hdBuyhw1m0N2eq7TlHUGGomrbk6GfJHdvle4tdkbjBOdlokzh1xw4Adq/hnZtS8R7tqOC53S1mrmpbnUvilpvey3uZOfHMBmTYgj4z5lRXR0qXoye7euUN8oT3L2UXFKzWusrptS6ZfFSwvncGPmyQ1pJA+D0WjMV6fK5rGwlznnAa07knwXWr2tOuNS6K4d6Fdpy+3GyOrLlUQ1Jt1S+EzR9z9V3KRkehXPbsZ8HpeMfaT0TYJKcvt8dYLhXuIy1tPAO8cD/aLWs+bwozgurpRbVZNw65MvY+yw4pHSTb+++6epWe4+/Pp5HymSMd3zlh+DHMOnzWi01W+Zx53837F+h+1cQIOIej+Jxoy11HZ62vskTmjqYKdjZPulMg+QC/P5Ho6qmy4RuA+S5ZGMNaCidlu9+hHX4I3SaVuPknW42qagfyyNI+xNzwTsoJls1ruJXDIweicbTVOi5SCedhSPui47JZQ0cjpRyNLnHblA6qTZXFNM2a4I8Ru4EMMkmMYHqtkrhWU2rNOyU8jgeZnwuB3B8MLntp68TWOuY9pLcHcLYfQ/FdopI2vk+89Fj5WL1Prielws3pj5czeDgLx7n1fpyo07dpx/CmwsDZXH61XTjZkoHiRsHeu/5yk914rR0bHmWbkA81zo1vryp07f7dquwVnul4onh8bwdnjxY4eLSMgjxBTjxQ7SLdWaWorza80FZKTFWUPNnuZMeHm09Qf3LLtwbJSTj2f8M0KcmiCkp91ybuWPtP2ibUbLWKxrpScHdbW6IuzLtQxTMPM1wzkLhFwruN21XxHssNC97qqepBkIyeVucuJ+zK7c8FYJKbTtHHISXBgySmqaXi3xjvezLzbIZOO7IrWib6js0ddSOBaCtWe0twvGueE2pbHDD3lypuW728NGXGaEEOaPVzHFv2rbi4yNZTOJPgtduIurBbdaWanhfmV8ryWjxaGEH9ZapZso490bo9xHw+uWZTOh9jlFTSh7GuByDulbHbBWp2oOGkHD7iRUVtsjDbFenvqadsY+GCXOZYfTBIcB5OGOm1TRuXqKrI3QU49meNvpnj2yqsWmhUH7Ly968By8ucrRc379lOcnij+i/xa3+XP/2UnXil+ivxi6AKSG4e6gQhC6TBCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgDln7cP+ZX9N/gFy2aAQupPtw/5lf03+AXLdm2FVLuSR65cfJZGjIXxvRe2kBVMkj5jfC2M0DrQWXXL6cu5WkRtb6ANACoCy0DrreKOkZuZpWs+wndTjVsz7drF88O3K4Db0XJw66mn6jONZ5dykvQ639n3UTJaSD424cB0OcrYO9SNqbY9pPM1zcYA6rnr2T+Iz7hQ08cj3czQBut87VcG3GytIIJ5d9146adUpQZ7ixK1QuRy37dnC1+m7+L3Cwimkce7d1DmE/E3Pm04+x3otS4Tzgb4IXXjtFcNqbiTpa4WKoa0STNL6aV35koBxv5HOD81yO1DZqrSOoa+0V0ZjqqKZ0MjT1BBwtnw+/zK+l90ZniNHl2eYuzH7T+p6i0vaC5xb81NH8R3PpeUv3wqqirGOABKyF5lw2MOc5xwGt3JWk4pvbRnKbiuGKNVXiS71PJHmR73crWjqSegVm2jQlKdGR2Wsa3vHtMkjxuWynfI+Ww+xR/ROi3UdU25XBuJ27wwn8z+sfVWHC8kq9LSMXIt65cehrhf9NVGnrnNR1DC1zDsfBw8CE1lpaVshq7SNPq638hAZWRj8jL/APCfRUPfLJPaJZIaiMxyRuwQVHei6uasXzG6LcjCcqOjNQ7CbKXd4z0Ugon9w8HwXGNR5HejszY25IXmoHu7/h6JS25AR4BSPvveZHeKgXaXobB9gNzXdrXh8T197k/1T1tb7U69RWbiXw8kfjmNtqCM/wDhmrnhw+r9V6a1XQ3nSFVUW690jy6mrKbHPE4gjIyCOhK2ArOEfGPtI19trtdarqLpJSRmOnlrMOdExxBIGAOpAKhZbCEGpvRKui2dqnBb0dZ+NOn9W6m0FSU2jJ2U93FRDIXPqnU47oNPMOYfMbKA8BGM1NpDVBqnOn1lp651dtqm09W44qI2gt8RkEnqRvuqk0Fwx4xVUUX0txp1I7AA5Inxt/8AgU10F2UDoPU911RaNbago77dpDPcallVkVbyS4ukYRyuOSeo2ycJOeRj2zU+lsujRkY1XlOajzv13+uvQnPHHUlTQ9k6+3fVcDbdcjamuqIJSAWTEgNbttzZI2Hioh7PetjruzCKiP6r7jXHb+0qv7V3AnUHEmwGK7a5vd0paU97FQyTBlPzgbOMbAGkjJwSCRk+a0RouKnGTgjTyaR0rrS6WizRyvc2kpi0M5nH4ju09VfTk1WT9ne0tclV2JbGnT1pvfHY3K9lHqP6b1Dr6Lmz3VJSn73vW5/A3ifTcT9E3CrjmEtZarlWWqsbndskMrg3PzjMbv7y49dnfSnFrSdbVz6I1TV6TfcGtZUyUmMytaSWg5B6En71tVwU7N/FDSkdydb+Kd5s7bvUmtr2UfIBPM76z3ZB3PopPMpp1FsJYF17c9a7dzcHs16mZrfg4+uongl9XWQsIOMOa8jr81rvr6luGguOnDGh1dKye53O7Uho3uqTO7lbUMGMncbu6KY8Muy9qDhzYGWiy8S9SW22iV8/u1NOwM53nme7dp3J3WfWnZXh1XfrLqG/asvl3vtjeJbbX1NSO8pXhweHNwAPrNB38ln2XVOENqXs/kO1KcLbPaj7e/jv6Fe+1shhl0BoHvfC6T4H/FKlfZza30jwp1vqO86llNC+qt7KWkmZTPlO8gc9vwA4zyt6+Sm3aW4K6v1hBSC96zumo6ChldNBT172uEbiMEjAHgq50RZbdpiMQva3vWbHK5Z4lBvrqW38xnH8Kl5flXPh+qOjnBmxaDoeHN4bo+Spm09ca2rq6ySpMhkfNLvM74wHb5yubnE7hZpm1X68u080iyNqJPczJnm7rJ5c82+ceatmk46XXR9ikt9svc1DQHmcYIyOUkjfw8VrLxG4pVN/r2WizRuq62odyMii3JKosy55agox1ru/v0GaMKGBKyU5bT7L1/X5lH6/sz6m4SwUkfeuafzVWM8L4ZnRvaWvacEHwW39RwYvOldKvr6yMPuE7edzMZx6LW/V2nKtl8gdJCRJVtLg0DxDi0/sH3p3HvjZtRfYQy8edepSWtkZpKIzOAAyT4BXHw70G23RRXOvjHenBgicOn9Y/wCCy6M4fwWRjKq4sD6rALIT0b6u/cpq+oMruYnJK0YQcuX2PO5GSopwh39Sq+JmkHUVWbrSs/yWd2ZQ0fybz4/I/tUSoayekI5HnC2BeyOohfFKxssTwWvY8ZDgeoKrfU3DGoikdPZSJozv7s84c3+yfH/bqpTg12O4uVFrpten8SKT101UwGd5IA2BKjN0nHOcHASqtqpqSeWmnjfDPGeV8cgw5p8iFm0fp7+GWqaSgkc5tLnvaqRvVsTd3H/D5kKmK1yzVnJNaibPdjLS9Dp+AaguTHCurt4SWEiKAHY9NuY5PyAXUPhbqmnqaCEwzMkYGjBa7IXPXg/BTz1hqLfc7fDE6Hum2+sbyNZE1vwsaTnfbGRgrZbh/LW0E9NVvjda31sfeMqHSGSGRo2OXb4I9S77Oqxr4OVnmRfI5VburypL2TZ7U+qo4KJ7i4AAea1Ek1fHqvX16vbpRHb7bG+GOZ3TbdxH2j9SufVdwkvNpnpYHtD3McwTR/V8RzD/AGPzVIP4d/RWjbvbXzd26ojdE6QDpkdVgZNspWNWdz1XhePCuvqj6mvWr3X/AFdozV1yvkToqOV0V1tjZOrYw7lBHllriqTjfkBbo8U7XDqDs/VQp2GKst9E6MhvUsZh5Z9zCtKo3bDdet8In1UyXwf+Dw39TVqOTFr1Xf8AUVBy+F3msYcgnK3DyCOgPsozk8Uv0X+MXQFc/fZQ/wA6X6K/GLoEpIbh7qBCELpMEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCAOWftw/wCZX9N/gFy2Ydl1J9uJ/Mt+m/wC5aM6qqRJCqMbIcMDyQ3cJdZbcbrc4KXweSSfQAk/qBVS5ZPtyTDgrZDc9VOrHj8hQxGVzj05jsP8U7Vb4ay+1pkYH8socM+IKduGMDLFw+q6s7TVkxGfHlaMfvUKbXc99eQ7Al2I/Yr7FqtI7jvdjkbfdnW/w0fdxxhkRAGwGAR+9b58PtUmS3sb3pewt6OwVy+4U3eaxXCnZVYbE/HJKRsR81vTw0vneUcLmTNwR4HI/eF4nOj0T6kfRcLVtPTL0LO1tTisjc9v1uoK57duLghObjHr6zQl8czBFcoGNyWvb0lHzGx+WVv3XXRk0IY5w5sfeoNqi2014tFZRVEbZIJWFrmuGQk8a90WKaHL8ZZFLrl+hxwfUPYdiVc/Dm108emKWu7prqqbmJkIyQM4AHkm/jzwmOjdS1b6JmKV7y5rR0CW8Lqvv9JthP1oHlpC9zXKM0pI+b5kJ1Nwl6ErB3SiJ6SB3xLMw7K1mUOMMmFG+JWnoL7p2pqg0NradnM1wH1wOoKe43YT9q2motH8Jau73JgfdLs0wW+B/wCYw7GXHmd8em/ioqOyyDaktGqAh7rlHj4p0pWl0YBTlp/TM95nBawkEqXVvDitpqXvGREgDyVUpJcNm5CuUltIgro3tB32SykaI2ArHWwy0cpjlaWkHG69U0oMZCiTLZ4XatpbNVRl7G5z1IW2WguL8DGRhs7W4xtlc+Iqx9LJzMcRhSiycQam3ObiUjHqkr6PNRo42T5XB1M03xkHw4mz9qsCg4vPfEPyoA+a5cWPjvPQNbmU7eqltF2mqg4ihZJM87YYCST9iw54dq902o5OPYvbRvtrniNDWWubnlbktPUrQDijdqePVr6gBpa52Sp1ZtRat1xA6V1tq6al5c95LG5ufllUBxYrKygvUkU7Xtc09SMK7BqcZtN8kM2cfLXQtI2B4b8UoLWImteG4x0WyOkOO7IomAy56eK5eUGtamhcC1xACl9o411VDygudt6pu7Dc+UJ05sIrUjrHa+PMT425mH3rLX8aIKlpBmHzyuYlH2jp4mjLnbeq9VfaTrJIyGPeSfDKzZ4eRLjfA9C/DT6tcm8/EPi9QCkkjkma7mGMZWofE3U9TFUvrKEP7snJLeiYNFw6q4p3EVMsc8FsacmRwI5vQK/LNwpk1LHHbY6TvNuUvcNgFRGEMSXtPb9R/rllQ9haXoayWSXV3FO7x2ey0808jzhzwDyMHmSt1+A3ZOpuG9Gy4XCP6S1BMMvme3PJ6DyCvDgd2fbPw/tsYp6ONtQ7d8nLuSrypdPwQsHwDPyTE1blx6a10x+pju+rDnuT6pfT8jXm98KBcKOQ1MYe4jpjYLUzj/wQ/g3bXahpaPvPo2bndhueRkhDS7Ho4N+WcrpjcrXGYyOUYVZ6x0hQ3ejq6OrhbLS1UT4JmEbOY8Frh9xSldcsG6M+69RmeQvEaJ1PhtcHKVtSZfiJyTus7JEt1zo+r4d61vGnK1pE1vqHRtcf9JH1jePRzS0/amtjvVe+TUl1Lsz5c4uDcZd0LWSbLO2TJSJrllMvdsc49GjKDhQ3Fe4Ct1vXFm4jDIcjxIaM/rz9ym/CkxaOsEtyqaUz1FfJ3ZA6siaAf1kj7lDKW1C6Xuqr6j4g+VzwD6nKl9PqIU1N3TaiWnawkAReIOOo+xJWPq4R6Sut117L00frLS8tHHDVUssUjnlxmg+B+/gRgtP3BX/ottrpdMC4xXitYGvaxtPNB8MrC7J5AXYB6ZJGPn0WuXCh0V3BrpqRk1HG1oilrCyJj3DY80juUBueoz4LYayWmsnovf7bUWvVN4ceSOkprvSObAMbcsTJC448gFj5De+mJp0dKj1WPRPIuIFW1tRX3aWKihMYbFCAGA4H1iPM+ig3FfitUUDKFtIQ+jrYXOdKw53BGyS6Z4aXzWdc+7axqn2ymbMY20knwSOwcYDerQsPHLT1DFptsFuip6eO3vwOVw5wT9ZrsnOSAT82LM1Sr49fL9fgavm3vGkq/ZXp8Rw0xqOPVumayANayJ5DJ2DoQWuG3/KwtI2NMLnRn6zCWn7FsfwprXUTpYjNgSBvOPtz+xMHHLhvQ8KuGmj6c4lvl/rqu61UpHxMhAa2CMenK5zvm4+QW1guNN8649nrX8nn/Feu/Gqtn3W9/wAFKcy+52WJrl65l6E8edBvZPnP8af6K/GLoGufPsnDn+NP9FfjF0GUkOQ91AhCF0mCEIQAIQhAAhCEACEIQAIQhAAhCEACEIQAIQhAAhCEACEIQAIQhAHLP24f8yv6a/ALlmDuupftxP5lf03+AXLRVvuSQoidsFMNFQNpqC+XeQfDS0pgiP8A95L8P/N5lDozsp7p+i73T1upXkimnmlr6nBx+TiHL+0EfMhQj7x1vglQlpLTo+3U1xr2W6LuedxLS+RxduQxg+sd8bkDzIUZor3pSOtD47LerwAfrOqY6fm+wMfj7ymyolhv1w99uc3KHkhsbPzGgHlaPIZwM+uVJNJUlnnqKv32pfbqGBnO0QRiSWcn6rGgkDPm4nAG+D0NN098vt8hqiLjwi8eHWvbPcqeGkbwVuFyj2w/+EnduPqAYwFtnwyvVlt1JH7zw14hWGnI/lIHQXKFn/Iw/H2LUvgdcrG7VdLS1VBPRUT9hWS1DpXw/wBchvICPTb5ro1w8tlfbQHtqG2yzP5RTTvoY4+8HKPjLxM7rv5ryuS319HTx82/8s9FTZKEepTe/v5ERGpdFagrfc7Hq6kN0P8A9lXeN1vq/kGShuT8kyajkmtPfQ1Mb4ZQPiZIMFTvtJ1WiK+1Uto1Tp92q6OZru7qG0gldA4D82QYLSevwnoFpdqvWVw4d3Vlr0RqSXV2mmxCRlkvhMopWlvMY4p88zMdMDYHqClFRGU+mPD/AI/c1cfxCcIp28r+f9jXx6t8N4oJpeQczQVrhw4m91utxoejSOcD7VcOseJFu1ha6k0TZqSrjYXT2+px3sPmQRs9v9YeYyAqP0jPyazPgHscF6jD2o9L9Dz/AItKFr64c7LIzusrHLA44eVljOQtQ8qPGnqD6VvFJSuOGSSDnPk3q4/dlRnjbql+uNaNooTihogIIYx9VoG3T5KS2iu+jXVNUDh0cD8HyyMKpbNW+9aifNIcl8hdk/NRb0h3Gh1S2y+eEnDyKWKImMEnHgr+peFVPW0JY6EHI8lAuEdZE2KEZHgtl9NSwywNBxkheUzLpqZ9Aw6oeWjSHjfwOdbmy1FPDy4ydgtbDBJR1T4ZBhwOF1T4m6bp7papssBJaVzr4uaYFm1FPyN5RzHCewsh2rpZmZ+Mq31xI9YNGz6kqGxxStjDjjJV1aK7JLb+6N1ZdXRsdjPJgFUdZdQzWmZrmOLSCrx0BxmnpTGySY7Y6lOXeZr2GKY6q3qaNmuGXYO4dxuilur5ri4EZbJMeX7gVtnw97OnDLSUMYt2nrfE9oHx9y0n78LUXQnG5r2Rjv8AB+auvTvGJr2NzPt55XnbLpwl/dWze/Cxtj/Zl0/kbDXzR2nm2+SOKkgY3l6NaAtJOMnBPTdz1Z3tRTx8hdvsr8l4sQTU5BnGceJWt/GfiVELi1wkA38CqYW+bbuuOiVeNKip+bLZZPDzsxcMq+kiNTZqSdxG5dGDlWpRdj3hPLGCdM252fOFq1s4b8Z2NEbDPjG2CVflg4uxyQt/yjr5lWO11v8AuLYTolbHdMtDzVdjPhOWn/6LW4f8S1MlV2TOGNpJlg09QRuG4xC1SCXimx0f8uPvUO1NxYjhieDNv4bpS3IjPiMSdGJfF7nM+VGirNbHCioaaKKMbBrGgAKydCaRoLVC1zI2853JwqN05q911uXfyO+DO2VdundQRmJh5/1pOtan7ZoZCk69QZadA6OJgAwEudWsa07j5KF098DmDDvuWV16GPrYK9BHKjCOkeRnhTlLbHyurQ4HdQ2+ThwflZaq8A53UM1TqaKjp5HOeMgeazMi/rNnCxHFmnXbctMTdY2C9xtAkq6V1LM4fnOid8JP91+PsWuzDlXx2ptRx3+32HlcHOZW1GD6cjM/rwqDYfJey8Pbliw2eF8XgoZtij8RYxyTX+sFDp+4VB/MhcB8zsP2rMwpk4hS91o2vOcZ5Af+WE9LsZlS3ZFP4lZw3VtLTOydz4LDSVgdOPyYmncchsp/JMx4v/pfLp556KNzVrnuHKcHwJ8B5/NPOmJY3VLI3gEOO0jycD54HRJuPStnoXPqei++FWlLVe71Sz6jllvsuQWxSl3cN9GsBGw8th6LoNpSw8P26Rgpbvpew1Mb2EMhpKKDvWAjAJIHwnyweZc4tJavo7ZWzGetfbapsnPSvMbfdZWY3jcGjLHZ3Dtwc4PLjmO2vCnj3TcNbS6SeGOou9Q0ZpZXCRkIc3qSOpOc7eGPt89lq3rUm+Pv0NLHdbg4pc/fqT7ifoC5cLrXHe7DW1l10pTQGealnqDJcbTC8Frpad7jzPY3JzE8kt6txu4UDr7V0motSNEQ9+t9ypOSOrpfykdVlpd3zQNx8UW4OC0l7Tgqd6o4jXu7U8d297nkp5HDEeOd7ceDm5+FvgCcAg49FrRqvv7ZdQ2mebfbrlUufQkktZbKwjIbzD6scgYOvTAP5hzRVJXyfV3X3+6GJQnTFafH3/Bd3Z80hFqK6vF0mdQ2mDmr7lVPPK2GlZ1HN4E4x9voov2lb9cdf1U2pain9yt76kCgpZjySQwMzDyiPwGW4/tMerD1BVUOiOHI0ZXV7dM11ZTC5airZn80sM5ZzU1G1oOXOY4h7m+GT5FUxxCsVdeb1fGz0NRTw222Qy0z55STgsM/N683JOT6u88q+m3WRCT+O/8AH+RW+PmUSj8FpfX/AB9PiVe05C9B6xN6BfeZeyZ4XR0K9k0c/wAan6K/GLoOue3smDn+NT9FfjF0JXUOQ91AhCF0mCEIQAIQhAAhCEACEIQAIQhAAhCEACEIQAIQhAAhCEACEIQAIQhAHLL24n8yv6b/AAC5aALqX7cX+ZX9N/gFy2jGSq5dySMkY29VNKCvlj0W9jN3yyNom46iPmMrx9rgxQ9oypLpsmopfd+oildPj/in/wCLQq4vkk1wZr46OaslfSBjITjEQ/0YAA3/AG5X2hkHv9P7s0CPIdg9MDrlMrHOkY9jOZ9S88gHm0bAD1SmluM9HDNQsI5ZHAPx1JHgCqpLjgYi16mxVq1bFRR22jhr6ZlqmZHPJWW9rmPpXF3KWOOeZztsEOz5jZbJ8MOJ9TW225NqKyeSltpa51DQTNc+rp5HcjGOcQfiDiwF7QDh2NsArQuw3h9PSyW57Q+nne173DYtc3oQfv8Ann5K7LVryLS1lt4ttBJHSXB5FXUzylwmY15b3fOzlLRkcxxv9U+CwMjH+Hdm3Tbte12RtNxP41D6ErrDAyiukVNRRMfXh7nNjnBxiORp3c3OGkHPw53AK1P1LqaC3UPNJO4y1YJnOcyS77/3Ttv55Hgkur9W0LJaast4qqijp5R71S1tR3z499wOgLS3OCB9vgoBrOubR19fR0wYaaUtnp3OGMxuGRg+QVePj64+P+Cy23jgSaqu5r3Q1MUZp5mnlgkZs/Plnx8U16OqjW6rhe5ndzNa4SADAJ8wPD5KPVdxkriGPk5ixuGE+nkpJw9a6a6zVkhycBgJ8VuQSqjtmLbPrTLLk2eskTt1im3wV9iO+E4ntbRk9uBY4GSlqIh1kjcz7cKl6Wqfb7iSdi15BVzRO6KAa+0s6nqH3OmYe4kOZWj8x3n8iuMcx5pPpZanDLiA2mMIMnT16LabRHECOohZ+UBIHmucVpvctrmbyuOAVc2gOK5pXsZJKQPmsfKxfMW0esw8zy2oyN67nfY6+gfhwJx4laPdoTkF9f8ADgkndX/pXXUF6pA3vgSR5qlu0da2PfHUxkE+OFnYUXXbpmlmyVlG4mvM1MXHLV6pqqeieCMjCV0bwJeV48VNrFYKS6crXtGSvQSaXc81CLk+BDp7iFV28t+N2ArPsPGasYxreZ52WfTPCK31Ra5zA4FXbo7g/YoWxl9CyRw8wsrIupS5RtY1F/pLRX1BxVr6towZMH0KZNTVU2oXZlec+S2C4lah0/wV0Q+7u0z9Iv5hEyKKIY5iDu4nYDbqtcqLiva+K9VLLBZfoOrYfqxnLHfqSWPLr/uQhpfEdyF0arnPbfoOGlLHUxStLZSB4K3bG6sp4wHTZA9VX+n4XxPAyFYVsyWjm6/NV5Db7lmMkkSBtxqeTBkcT5ZSCeKSrlBmcS0HolDHNaNksoKB1bUMY0cxJxgLM93k01zwI33l1nhYYtmqxtDa0fUws5n/AHlRjXmjTa7D3xGCG5JKrjTWuGW+QxGTlwpRgrYbiRlPonp9jb236l/JD4xv6pRNqmNgOZB9610i4n08UAJnGMeajWpOONPRRO5akZHqqlRZJ6SJOVUVts2Kv3Eimt8Ly6UDbzWtnFzj9HEyWCCbLjsMFUdr7j9UV7pI6eV2TtsVW9qqqu913v1WXOa08zGuPUrXxvDW2nYZGV4rCiD8ssbWd9ku7LZSveXuponPlOc/lZDzOH2Dlb8wVH2rEHFxyTknckrK1evhBVwUF6HzO62V1krJd2Z2OTBxFjkn0hVRxEDL2F2Rkcuf/wBk+NOFhuVI25W+ppH/AFZmFmfI+BUmtrRGEumSZrnHGwTkSZ5Ad+XqUspJO7ezl25Tkr1fKKe31Rp6hw5oy5jRjBAB8Ukh2jODjJ+9LPk2l3J1ZLo2KobI58uRjk5H8pb8jjP2rYHRV4prrRsFeZGxw4dHM+lkADmjPI5zgA8Y8jkbEZ6HV+1XCVzY4I8Dkfzh7WgPBOOrupGwwPDfHUqxtL2mK5zgzT1LZnuyJmTHmB+XMM/esvKhFrl6H6JNPhF8UGoblZLuTUU8jKDOJnvzyyMIzyjwPMDkH7UXzh/Be9GVeqNS1Uli0rLzQ0cbWh1RXzjdvI0/mMcA5z/6pA3K8aUppbXJbKHiBQ3G5RbVtojpWCL6UjBOafmP1Bk8zwMnDSW9SVh4za1uWoKkllRDcLx3QpqekoWF9JQRuA/yeBuCHuAw0vyQN+rjluLCPTNNfua0pOS0/v5EC0xrepFc243KGK4XexzPp5BVt7wNkAcyOoLTs8t64OxMbc9V5vGs73q+1sbWVRpoLRGWU8PeESzQyyOaA8/n43OTj+Ud54EFlbPpvU9NHVytxVQ+61Lg4ODJG/CQXDYlpazOEpttVzwTxGlEMzJeSacuLnTOaXEdegAeBgfNa9VKd0Wvv4mTk29FMk/Tj/gU9F5J3XolYyV6M8gjoZ7JU5/jV/RX4xdClzz9kmc/xq/or8YuhikhqHughCF0mCEIQAIQhAAhCEACEIQAIQhAAhCEACEIQAIQhAAhCEACEIQAIQhAHLL24gz/ABK/pv8AALlvGupHtw/5lf03+AXLVnVVSJoUtGwKddP1ho7g083K2Rrozn+s0j/FNsXxNwvuCOmxCq7E+6FNwj91LOZ3LLIMjHQN8/tRTOGxPM9+frgElLqqjnrYmXQsZ3UjhE0DcsDQBjHyQ1ksPxCTvPPHgiRODJbou2VVyqWx09urKuQ9BFGM/rKu+4cNNQU+lg6fR2pYIHDvDL3UT4zt1wCCmDgRdKmnuFKKfT9TcnbZcyeOIE/N2V0But9qjwjY28aCv9DTRROLa6gqaasAyPFhcx2PQLzGTfJW6SXHz/2eix64+Wtvv8jlRfM26onhd30TtwYZ2GORo9QfBRF1S5zywvJLfqHPUK0ONN7pLldJXU0wqqdrzyv5Cx8Z9Qd2n06KoJJC+UAD4wdvVbeM3ZBNoy70oT0mZW5L+Ro5g7p6FWHpqEW6niZ49XfNQ6y0YdVNleNh0B8CplTP5HNKhky37KFFyTuJ3ewA9dl8YcFYLRJ3sGPRZ3DlcrMWzqjoTuj0y2LIivl2vsdmsVfEKRlXcLhC6jpHSnDIXOGHPI6EgZAz0Jz4LHC5Nuq55n01DHFC17YpjM9xPljA/wBvNP62ypP1KSqaiqtNVJS1kbmyRnlcD1CV0N2aHAxS4d5L3rur+k7rLO4cs7jklRMgg77qcqhyrIbS2XHpfiVXWKVrmyuwPDKfdU8THaopWxyuycKiaevmjwBJkeT/AN6cGXJ7QC5rmjzG4ScqF1dWuTThlycenZLpHAv5mlSLTN/dRVDQ523moHR3dkjcFwTjDVDIIK44+jOxnp7RtJoXV0Tu7BcAdt1f2jtQwTd38Q+9aD6d1XLQPaOc4Hqrl0dxP7nkzLjHXdY2VjOXKPQYmWlpM39sE9pvFudSXSkp62me0h0U7A9rh6g7LW/i/wAPLBp7UD5rLRU9BC4kiKBga0fIDosVg4zsghbmcdPNRDXvEyC7VgJkznzKyKKbYWfI2L7KpV72Z6JzBy+Y8fFSOgquUD4v1qsaTU0EjgRIE/Ueo4GgHvAAm7INidViLKpKkOwPNTjSdRT0EjZpSNjtlUY3X1HQty6Vu3qo5qTjxFQQubDMCQPApN407OEh38TXWtyZsfxb4jW8acnhdK0O5DjdaPXfiKYK+YxyHHMehUW1zxirr9K9r6hwjyfzlCre656glc212quu0o3Io6d8uPnygraxMLyIvq9TAy89XSXR6Fj1nFGulaWxyO+9Re5anq6vL56gsZ45coZdrjd7bM6GemFDK3YsmOHj5jqExSy1FwfmWR8x8ujQtWFC7ox7Mz07krqNTR993dKBPL4yvPwN9fVXDa9TWnUFstrLdQPopqanENQ8uBbO4f6QDwJ3z9i1/paQMwJCNvzR0CunRdnkttBDJIwM76IPbv1BJwVb0qMotGZbZK2Et9iTsC9jZeBsvQKYMo9g4X0FecoygCDcR9JuurG11M3MjNpWt6keB/wVWMDud0ZbhzdseS2LIDgQcEHwVS680qy03Bs8DcUsuXBvk7xVM4+qNHHu2uiQw2oMbO0Bxc5x3bEwuP8Agtl+B+h5r3UQclivlaCf/qdsilcR4kB0rcqiNGwSseypjp++Y2QMc97+7iDj0bnByfQLoJ2ZYdTTRQGnoLDC7PKxtTV1DHHA33DCAV53xG5wWj0eJDachh4raKs1Pp9olN+0rVOiYI6y96ZqGRsc05bI2WndI1jhth3KSMHB3OderZqiO8RVsgfa4aoyd1dLy2d/LHExp/LxDP1ZTyghjchw5QGh4C6Acd9T6wtNleb1oSlvlRVEN5rZdfiawAnAD48HYdeXOVzc4x6gs1Rqp1ws9irdOXCLmFRQV0glZNGeoLgAfPw3z1yAkMSStk69cfHf1XdfyN2twgrG+fv9H/BGtYXiglsDrfbaI8jZvem1L8mZ7scpOMkMaRj4R4tGScJ4oeeWigklZyTPY10g83YG/wCoJBpyTFxjutLI0s+vTggOc0Y3LhjGQSB82p56nPmvU4lfTz8DzPiF3V7G+/2jwRhYH7JQQEnlK0DEOhXskDk8Vv0T+MXQ5c7vZGnJ4r/on8YuiKkhqHuoEIQukwQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIA5Ze3E/mV/Tf4BctWnddS/bh/wAyv6a/ALlq0ZKqkTQpgKzkApNFkFZg/cKlk0SzThFZpq6Ujj8UDmzsBHh0P7AkTJSXsAaA7I5XY3KyaIqoIbpUNqpRFTyU72vJGc+IGPPZe2RSSyOFPTSSFpABOwGTt967NpxQQ4kzY3s+acv8V/p2k0NJzOAc2pnYHs+bWkkfI4XQnXEWpLdwdmDbxaZqdsH8kfhyQOgcD1+a5rcCrdqtusYaClkorfM2UF5mYJi0/Jpx+tdKtZ6O15Nwcma/UNjr4TSlvI+2PjcHY8HtkyPuK8Xlx/vSfHb0/wAnqqZJVx/P1ORvFSq98vNVJNC2KYvILmjB+R81W8UHeSgD5fJWVxXstytF+qoq+ANfzH4ozzMI9P8ArUAt8fK8/NelxZLyk4sxcrfW9j1Qt5cHxPVPULvhBTPF8ACc6J3eYCqs55FIkx03UZGCU81LcOyorZ5RTyjJ2UndUxyBuXBV48uib2ctg5rgyQMc8gNBKQcSdNV9lt9puNRBLHHI11RFluBIzJbzNz1AIIyPIr1XajZQRuEIDpGgn7gs3Fy/z614daUvFPeHy19BTOt81C47Mha4uZgdPziPsWvVOU5J+hGWN0w+ZQd8rRWVLnOJ5j0OE05I9QlFRUCV5528rvFYORpOQU+3sUjHpWgADvDCGvkgdlji35FZYnCMP2DuYY+S8udl4Ocs8lW2WpH1lw5T+UiZJ6j4T94S6C5wAjlllh9HDnH3prYxskoaXcjScZPgvLmBkhGQR5hQcUyxTkiX2+sZUPa1tfSsJ2zK5zP14U905o+/3gt+jbjYJnHo11/pIj9z5AVTlHSCoZKefDm45W8uebPgpJZ7TRUjG1FQ1tTUE4ZG8EsB9Gj6x+e3zStsUlw/4/8AQ7VZJvlfz/7NlLP2f+KtTStnbBY2QEZEj9SUIBH/AKZPc/Zr1bqawWqbS87NRX0yTx3Wjiq6ZkNG5rg1gZIZfyvNh+S3I2G+6oD6Ths1TFPdZnVtRgclthw0N/oh5b9Uf1Rv8lPuHV9pIIYaK5ahfY6xv+UUtyLXSQRuJ5Xwyco5uXIBDmgkb7HO2Rb5sV1Jr9v9mpGal7Lf8kwrOy1xfsOHXG3W62NIyDW3uki2895U2z8LtQW1v+c9d6EtXm2bU1O9w/usLin3UFZd7bBH9PVtPebLVSCP3qRkdfbqkf0efBdGfUEOHXA6qp9d8JKFgq7jp9jqWGFxfU22eQPNOCcAxvz8bMkAE7gOG56qmq9TerGl+m/5/wBErITgtw5/XTJFV6Z01ASLrxn09GfFlro6uud9nLG1p/5Sw09VwMsgL7jXa117UN6R0sMNppnfMuMj8fJVjq3QlTo63W2oqK2nqJqslrqenBPdkAEYd0cN+o2yCm/T9mjut4oaWtr4rXBUTNjfWVAcY4Gk4L3BoJwOuwWrCFc49ak2v2+iM2y22MumS0y2ajjvp2zuDdE8IdK2Tl+rV3syXepHrmQtYD/cKjWquMPEDXFJ7rdNUVFPbTsKC3NbS0+PIRxBrcLBbbfZ9I8RZ6fvqXVVvo++7qYs/ITuETiwluSCA/G2SDjyU4grNGVNlNT9Ez3C/SxOMnvLXGJsh2xEyNzGtaNjl2epw3ohuuDWob+/mVbnJcy19/IpB9op2ZLYnSO8XynKyw2KorIZ5YY/yUDeZ7ugHXA+ex+5TyHST5Ysy4b6HqmW7WOan5o4OYtds4A4B+zxTimKOL+BDHRhpwrn0I24Xuxy3F0M1RHCGRyzNjPJEAOVrSRsOn61WkliNCA+4v8Adc/VixmV3yb4D1Ktjhdr65ac0nd7XDSRUdhrSxsj5G5fI7P9LxJ26dMKm2bSUoLbHMfEnkScO2xfykL4SQps6yxTWvvYoucvblpaM5UQrqGaifyysLD6qvHy68jaj3Qhk4dmM11GLmwjOVjyjmTwge+ZNGr6FtwsNQwjLmDvG+e3/VlOnMsFxlkioKh8Te8lbG4sb15nY2H3o1xyTg2pJorbSkUsV4pATKJ+Yd21jS5zR/VaATldG+AlyvVut9Ayns9yjp3Hu2tgtWZnkNycue8Ek7nGPsK0q4RN1NHeaeSh0YLhW1MzWNllqeR/MRnl32Gwz8luFw97VGq9NVElaOF4dTQw+6tkp6xjRICwSbnBy7kIIzg7geOF47xFO6xRSWl80e2xH5dbfq/k/qWTxh48W5tJW0lZRXexNqohHG64UUgjdI0ty74WnJIBGG+fTZc+OKtIb3DV1dNPSXelaT/lNK/Jgk3Ia5pAczO+zgM42zhbucSdWHTvJYrbVRUuuL9Quqrhcn4iqG8zXFlJHJyFsAIa7LvhyANwX5WpmvdG2uO5yT6Mgq5aqniIqZKqR5FS74RIwskJe0F5LWkk82AcDLXGrGrqpmpSb2/2JSdlkHGK49Cr9P2xlptscDGcjz8UnzP7uidQVih3YDvuM79VkXudJdjwcm3Jtg4pJMUoedkkmdsg4dDPZFnJ4sfon8YuiS51+yJOTxY/RP4xdFFIah7oIQhBMEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCAOWntwv5lv01+AXLVvVdSfbhj/tLfpr8AuWrSqZdySFDCCVkczbZJ2Hbqs7XbYKrZMlHDHkdrOibLychbISXt5g3DCc49OqcblO36UnbSyPq4i7uxIM4IB2Jz0UQtlT7jXR1HKHFgOGkkA5BGDjw9F6rqyeonjbIHVBdsxoHLG3fo1o8PkuNdXBOL6Xs2M4J3a00l/op6672204IDnVVTJJISDthkLJHfeuiMnFHSLuFNRQyXyua2SPDaymsN2dG0/wBrum/fsuVfC6m1hb7vTGz1lPY6h+eSYRNMg+3BK3J0pYeLF8s80dw4m6pc+F3dubQxxdy04/OJdkY+S85l4yU23p/q/wDC/wAnoMeU7IJR3+y/y/8ABqtxqcarUNRPbtQUeo4WvLsQskhlYN8tdHM1r/uyqjpm5kcQMAkkALeXXXY44g6ppKiqm1PHeaot5om3mmYZCfSUAuaVp7qXRV40HfaizX2hlt9xp/rxSjGR4OB6Fp8CNk1hzr8voi+V9/BfQWzqbIS65p6f38X9RvaCWBLqFxYcpC0EdOiX0vwjJTEuxloXurO4aXA4SVl+mmm5Q/lb5psudeAeRpTex/wk5JKlVX6jVa2PNXexTV9OXDmiJIcT+dnZR+7Xioou8pY5D3BdkIvEompYXNO7BjATYJ2VbBHOcY6O8QtiMVH2S5+17P7CV8sdSfj2d/SCxPppIxkDnb5hKKm0Twt7xje9i/ps3WCCrkp3ZBx6Ke9dxadaT1atMxB48QvYd6khLDPR1f8ALRGNx/Pj2/UsT7a129PUMePJ3wldKZY0u8Hv6/sJjGHdDj57LwY3MPTPy3WWWCogHxxnHn1CwiYZ3y0+i4LSjKPEkP8AbIRExoaznaficR9Zxx0Hy/enKlq3xOL4G81S891CXf6MeLh5HfA8tyo9bq7H5Mnm32yfD96eqaYB7XQEun5uZp5cfF5H5hJWJp8jtck0tDhFTGKKb3b8vOCWuqDth3oTsPmVLtOMm92qPfqSCqo2QPkEUh58P2w6NrdwfN2wIG6h9K1kj2+7s7pmS575TzFh8SB4nwClUUzbVDQyTMqLPPK0zUlzhqD8WXYw8DPiCDy9MdCkbttaHKmovZJqa4y2G2i4WOukuVuPJDcaKWNpb8QwWuaBu1x+qeoP9FwWd89ZTmWJznGnpXHkc85cIMB2D54yAM+JTRFcHUlXc5KqSICrnDpqWk35gHBzQMeLnAADwGTgbLPO6tu9aJK/NJRRyc9UWDZzgSWws/pHPX1z5LNcdvbH48Lgz6wtLbnpP+EdXcn0zgGx01IW8xkyfqknxxknGwwq1pqeouEzY6enlqZXbNjiaXE/IBTvVGsamO903vdNR1tDAz/J7fcGySGE4A5nsy0ZwBsc7eATlD2gNaUNK6ns1y/g3SkYMdhpIbfn5uia1x+0rWxozhWt/wDozb3Cdj1/7EmnuA/EK4sZVw6VudPD4S1MPcMwfN0haMb+asqw8EX0bGv1Zr3SWj6dv1opbiKuox6R0weSfTmCr3S+mNf8aLm4Wi137WFWTh8rGy1PKT/TkJIb9pV22HsWXiw93V8TtXaa4ZW7HO6O4VjZ64j+rAx37XD5K6XzZyupyeopjJcK/g5pRhhpavU3ESrb+dTQttVCT/afzSkf3R80mtlHrniw19u4eaDo9O247SVdBCZZg3+vWTElg8+UtU8uHEXstcDo+a00Fy4t6gi+pLc8RUId58gADh6Fp+apnjB269e8T6F1noHwaX04Byx2q0MEEQb4AhuMqvocuy+/oaNdMIL+9LS+C7/8/voUap4f6F4Mxum1VfWau1Odza7ZMXQxu/8AvZ/zt/Bv3qsZ9X3HXV2718UdJb6cfkaWnbyxRDyA8/VMukuH9/4h3FphhmlY93xzvBOfl5qX6qoaLR4bp22vbLXN2qpG/mHxbnz81fGKXzZ6HFhJx61Hor9PjJl38ENTQXS2e4VZaZYvqF3i3wT9rfR0tYx87CAwbtAVA6VuNRp+60DoSebIDgPHPgtmu+qKqgjZOCI3s+5eB8Sc/DM6N9b4l9s0MrDhk1OuaKJqYnU8z43jDmnBXgOUw1lpU0p96gJkYd3KHFvLsvd4mVXl1Kyt7Pk2VjTxbHXNHoFILzUXKmpWyWpj31rZGlvI0OIHicFLshoJPgrj0p2LdRcUdNNr7xWP07SS8r6WlMRNRNnOHOBxyNwds5J8h433SjGD6iGPCUrF0rsVVofiXrvR7aaSG2xPZTyd6GupsfmxsxlpB+rGG+fxO8SrBZ2m2PsMVpvVmfZqmOVzo5o2HuslzTuOoOG8ud9sdMLDeOw7rrS0kx0/qWszH+bktH2gHCpviRYeKWlbfLTagiZdqAE/lXQtcRv1yACsR41dkt6XP6Hp45M4L1+psJrTW8euL3c9RPr466OppYaqCB7+VkmIWwydPGMRbg/mvd5qtbJfautuFRUN5/eS6b/JOduZyGnDy/ODgxM5QAdwfDdUdobiBJaKynpqqCSspGS96KZsnK8OI5TyHfq0kFpBB222BFm1OsbTVOdU2miurrtLO+Q1NdRRUkNK0yOkDWhrnF4a555Wjkbs3IPKAFpYU4T6Ut77FqzIOHW3rRgvLGQ3m4sY0MY2qlAYDkNAeRhIS7CxghoAG4GwyV8L16iMemKj8Dxk5dc3LXc9OdlYzE6U7LNCzvHDyTrS0gONl1y6QjHZvn7JGnMH8a2fH6K/GLoatBfZVwdwOJ/r9F/i1v0pRfUtjCWloEIQpHQQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIA5ae3C/mW/TX4Bcs8bLqn7bmMSN4M58Ppr8AuWbouUqiT9omlwY49ilIbkJOBhyzsf4KDJHtoxspBpymM8fvThltJI3B8uYn9yYc4Uy0sWw6UrnluTLUhuf7Lc//EpVrbJN6LO4cCWo1BHLTRR1szi0RxEF2HZ+IED0+zdb1cKdetpKGKo1GA+WIlkEcQxG0jwAHw58ytA+HGqX2K8wMhYQ2oYBufia8HIcD5gjK2n0/qKa4XItErJoJXDdrcRufjd3KFmW1uc3Brg26rVVBTi+TbvSF1ZqEzTvbysOzW52CgXHfgPp3i3ZnUd4p+SaJrhSXGEDv6Vx8j4tzjLTsfQ7qRaGlFpsrA5vdvA+IZzjPqstXrihFQYJZ25IxgnxXlbp6tcq+Ndj2dNHXSo3Le1ycr+KnB6/cIdRG13mEPiky6lrYh+SqGA4y0+B82ncfcTCpR3cZXTTjdoW2cU9G1lmnLGzuaZrdVDGYKho+EZ/ou+qR5HzAXM+8Qy0T5oJmGOaJ7o3sP5rgcELcxL/AMRH2u6PGeI4X4K3UfdfYjkw55z1cfIL7Uc8VOcYx477r4yT8vjG+dyeicZKTv4HYfkAHJxgLUlPoa2K1c9iN9/z/C/6p8EkqqN9Ph31o3dHBKKyA08hHULLQ14i+CRokiPVrlpQkpLTGOmNnsy4+YjpLpNRuyx5A8k5MuNBX/7rpW8x6vj+ErLJpuG4xmS3ygu6mB5w4fLzTHU2+oonlssb4yPBwU31R4LX+IxlqS6o/uh5dYrdU709W6P0eM/rWM6TlP8AJ1MT/twmZsr2HqVmZXzM6PKj1L1RxWYs/fr0/k2OH8HblDnu3h3o1yRVVurYf5alLh/S5f8AELK27Tt6PP3rMy/VLfzyu9SOSrx5rSbX8jI5jQfqlp+aWUlxdC8c2XY8QcH70sluYqf5aFjz5lu6wQ0LLlUNhpqeZ87zhscLS8uPoOq49PuZ0sfoe4S2O9kr6avvFDBU1D2RzVMTJA4iMFpcAeZ+DgYPXlOPI9FcfaHtUWjNSU0E7Ki01DzUvq7RX0rWPY4SmNsrAyNgLH8mW/C3AadtwXRrhLw5tz9U01Nd7TPqioYG1E9poZBzRQB4Ejts95I1pz3QPXAOcFqtLjFwfsVfpm16qqbjcLhSQyutlVf2wSNEjw8906WnLeeKMg8rSBzYYMsBKzLJ1+Yo7Lq4T1s12ptURU84fTQmeTOWumdysafPGf1kqaWejgukcct219Y9Pw42ji7+d7AeoDYozv8A3khvmjK/RbG1DdK0N2tjj+SulPLLV08vyc1wAPm1wDh4gJLaeKNPZ5QX6L03UcvVtRQF37XKeovmC3+w7GrS1ZNfs9fQsSyVfZ/0kC+9X3WOuKgb+72WggtcBPkZJXSPI9QAUsre1XoTTjgNCcDtPUsjfq1mq6ma8zfPkcWRg/NpCxaZ7Uul7aWC5cFdDXJo6n3B0ZP3PVnWTtt8J6BgEvZ70y13j3Bc0frJU+fWL+/yJrHT5jYvv89FO6k7aXG7WlELdBqqss1sA5GW7TtO2hhY3yDYWjAVbRaO1pq6pdPJRXOvmlOXS1HM4uPmSVuZD7Q3hpbt6LgPYonDoXEnCxVXtRX0cZbYOFel7YfzXGlLyPvcu7a7R+/4Go0UpassevzSX8dX0NetGdkTiFrCdjKey1DQ7xEZdj7lsPpbsB2/QltF+4kX2hsVvhHM/wB+mDPsDfE+nVV5qz2j3GTVcb6a33GnsUD9hHbqZkZHoCBlQ/THDrit2j79G+slul3lld/LVjnvx8gei42//JjtCx4S1RDqf6v+XpL9iweKXH7TNktz9K8JaJ8cRBjnv8zOWSQdMQs6tH9Y7+QHVV1ofhXcq6Ge7VcL2wRNMss82waOpJJW1Nl7KGiez3YWXriReIIakN5m0bXB88h8msCpLjLxpn4kvbZNMW0WLS8BwyFo+ObH58h8T6dFUp86gj0eO02rrvaa7Jdv0+P0KvFway+ioh+NkLw5uR4A7ZW2WjL39N2KnfPBhr4+bON1rTpvSzamRsDCeZ2MyHplbV6I0y6hsUUEsuHsZ8LnkAj5+YXg/wCrJV6r373+DRqhNtyl6la6vElPUnu3iSneTgD/ABVeVtMYpHHB5TuFPuI8JpK+QBzXZORyOyc/7dPtUGicyprII5nOEb5GtcR1DSd1r/09JqrfofM/HEnb0+psD2bOEtqooqPXesKR8tCZf83U8jMx5DsGeQeLQQQ0dPHyW212us1KIbnTzRz0z3AhxyWgH5beRz81p9xN7RdDYOGlLTWp3cQUzgyGIn8wFoDfu2x6K7Ozfrah1xpNslNWGot07eaSikBIiON+Q+XotCd05z8ya43ocjg11U+VW/aS2/mbCz6fjkt1M2bDW1AL3uduS3Hj+5VDxM0tbr7NNQGCOSmdAS5rgA2NuCA5x8ANz67KyK2or6i3Oo4X9yI3CNpEoaXgjbDnDfPoR6kFVPrulqe6dbhM2OSUAO7l/M57s9XO8gPkAN91Y2tbMyuLUtM0K4zdm2kNbVVdkD442SYdI1nwgHoSPDJCr6g0nctLUrG19Q+pEv8AJucSQ0DGwyfUfet+dS6fppaSqt9BFLJb6SJ1TUVuMl0gAILR446Aeu61s4t0NO/SsdRTQuDYqlsjJnEZcx/NkEDYb8v3BM42Q5SUX2OZuKlVKS4etlPl+ENfzHCTvf1Xls+HLc0eVHuk2T1SkDCjNNUdN06wVe3VUTWxiDR0R9lmQRxNx/3s/FrfRaA+yml70cUPT6L/ABa3+VkFqJYwQhCmcBCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgDl57bZ/L/EwPP6a/ALl28czdguontuIjJHwaI6t+mfwK5cxP8Clprlsuj2Erzgr7G74komgDgSOqSgFrkLTQCzOym2leV2k5g88rRUuOf7rVBBIAFKdM3ACxVdPndsweB55GP8FKvhnHyuB9tlW+lrYpIhzyMeC0Zxsdj+pbZ8BaSWnDBWTR1UBc17WtzzNPgDkbH5dfFajtrae30scgLZZiDkg+eR+pWhwT41stFcae4OxGX5BykcuM5QbgehwFUpwVvob/ANVfpaShEcZ5XAfatJ+O/Gu6ae4h08tFM5tM04laD0OVsVHrq16tpIRHcDC3u8tljw55+zxWlHG6qNx1/W26ZzKp1M/DqpjCwvBHQtPQhefw6U7PbR6fxPIdOOpVvT2jYzTfF6t1RZTHTzdQCZSdmnG32rWLiW4z6rvEpbyvlqHSPGMfETl368q2ezxA2ogNIYmkRZa50jsMb6n/AG+1Qnj7p4WHWdX3bmSQTNbKySI5a7Iwd/nlaNNcarGkYnidkr8eE2U057YZ8AF7z+pOVNUOgLXF4LupyM4+9Ml0k5HZHU75XyiuTMgO6k7kjJ+wLQsrco7R52uzpeiQVtDFdIS8ARuAyZCev2BRWso5KWQhwIGdneBU60/UwyOY00gl3z8Tv14/xKWX2xQ1YcyFznuPVvRrfPAxv89knXkOmXQ+xpdPXHaK0jqpIHBzHFpHiCnul1ZIYxHVxsqWdMSNyU3XS1PoHkbSR/0m74TY5hb03C2oWbW4s7XkW0e4yU5sdfu6J9M4/wBA5C9DTFsqN4rhy+j2qJh5HisrKl7ejj96s38UMLMqn/3K19PoSlmiYXH4bhER6lLYNBwnBdXQY9XKHtuMrejz969i6TEfXP3ru0XRvxF/9P8AksTT/Dy0XTUFrt1VeIKRlZVR07pjuIw5wbzH5Z8cKQ6msBstit40zNBZoaqpmpKqkn52XIyxZyJXEYLMBp5WYaOYZyd1TLq6STq4/erVtU+oLxaKa63maqvjGUjre0y5kko6YgHmZ5HlI3PVuRlJ3b2nvgrcVmWqFUdL1/5JpwMq6OyT1VM27Wa3ama1skFyu0MjWQxuBa7unAjJDSThwAdkY3ADrE1rri0ag07BaNO1F9uU7ah0NTR1txkggbOImO74uYMTuEkLyCQR08CAKr0NouPWOqKSaWgbd6ehfStrhTnL20zS4iXA35Hfk2k48d8K/u0PpSl0hfPp+gtTKekvEYrY6iqd3bTPysje2KOMBp5myB3oWu9FiWygr0m+TUxcCNl7ocvZ3+6Kl0BqKp03qKFmmrlBBdxBJJc9PR0r6qC5BrC7l7uQcjc4Ic3q0AuZnYLY3UnA3gZxLvn0LWV9Nw+1jJR09Y+nyZKF5mjDw1pJ5mOGd25x0I2K16vegfe9L0NfaKmZmp2NNZT1NG4sLWs+IAvbuXkbs8fh67gDXu+Xm81N5muNdcKqrr5X88lVPK58jz0yXE5J2TNVLtn1RnwvQtysG7wuxdXMJLa120/inxv4/mbbcQvZia5tEbq3TMlLqO3OHMye2zCUEf2Th36iqHu3ZS4l2WqdBU6ZrGOB6mMj9qz8Ou1ZxJ4ZyM+hNTVkEbf9E6QuZ9x2Wwdj9qpxOpadsddSWm5OG3PUU4z+pPKF0Oz39/oJdFNnKS/mP/8AS/bRQln7I/EO7cpNkmiafNhJ/UrC0x2A9fXeZjBYq6bPU8ndMHzc5Te6e1F4nVkf+SU9poXH86Ckbn9YKq/WPbc4ta2jkiqtWVscL+scEhjb9zcBHTa+7GYVUR96K/dv/CNl9I9jXh9wapGXbifqq02oRjndb6WUSzu9C7c5/shJtf8Ab7s2jrZJpvg1pyCz0rR3f0vUxgyu/rBu+/q4laJXDUNyvtQ6avrJ6yVxyXSyFx/Wllva4AF2GsP5w3+9TjUt7Y3FKx69F6a0v2/52Tm8aqums7vJc9S3OqutbMS4yVEhfv8A4D5JXQ0Ela8A47v+gw8rh8j4qP2lrRI1sINS55x3Y3Ofl4q/OHfCOuu0dPPcoe4p3fEyJ5w/IP1c+GR03SWdnY+BX1WSS+R6ChqS5PnC3SM9VVmaCAvgjIEpmZsR+9W7fLg610bozIJXRt+AFoaflnwPzSyogtul6Ad3KDJDHybMw/lHgSMbjbrn/FUJxj4qttlI6Vrm1NNIOVkkbsg5GeRwHQ7HBHr6hfJL77vHMz2Fx6FuTkwx6nOTG7WGoxdKp74SWtBIAPVpB3afIjwTJYbfUXm8QU8EJmcCZHBuxw3cqC6Y1BLqismqBO58ZO4ePi2/pHxOCN1sNwF0gK2uqLrVe908MZ5IKmCLnDXt3cXAb8vTJX07Gxv/AIdivfc+XKx+J5sUlx3f5Io3tJWKbTdZSRRuLqKtAnY3wa7HxBWZ2L9WXayTspHSd1ap5MMk7z+TORnI64WDtZmi1dqGgtcL46eupWulkcwYY8n4R16c2M/MKE8P6Gvsdpjno3yRT4Ejwdg4+DgPDIAV8X5uMoy7s1eny89uPZHUtojvlkhbVyMbWU5JhqNsH5+hVcNjvFBf6mjrYn1kO8jnujy1rSCPyeBg9Djxy4E48NH9SdrfVVo7uippw1zQGvBJ2wrq0Z2xqR2jI6u8ycla5n5QE7g9AB5/9aSlXfXDttMY1i3XNqWmu5YGqdQQ0Xv1A+pbRXGuBD4+fDImfVaMjfPUnA6YWvPGeOmp6CWgt452RRM7yZhPdygPHxNB32Lj9bfcKZ3Xjloye2OvVYxkl+qB+Ta4Ze3PRoHn6qsbjqem1jQ1L6Nh5u7MMgJyeZ0jXfYMRq7HUlNPX5nM+FUaJe0m2noqiWJwGwScQyE7NJVhQ6QfNuWJYzRvL/o/1Le/EwR4JY8mV3BFK3HwlOEBc3GcqZyaYETfqJrq7X3ROGrnnRkSdMom+Hsm3cw4p/or8Yugy5++yhiMR4p+v0V+MXQJMxe1sjrQIQhSAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCAOYHtsJRG/gw09HfTX4BcwKijAHM1dNfbfu5DwWP/AJa/ALmEyvJj5TuqJrkti+D7gt9Vhmjzvhe++yvQ+JU9iXcQuyNkttkxa6SIHAkbgfMbhYpafDsry1hicCDgg5VikcHNkx7wEnZ+x9CvpJoa1ruYhp3yFhIDwSPzt/kUtkaKq2h+PyjCuvkci9o257LNygFVA9wp2Nxh0kjQ52fkf8FCu07puOz8ZbhURNPcV8MdSxxGAduU4+1v61Fezlrn+DeoYDOWPjDwC2ToPVbG9o21M4s6Mo9QafhZXVNm5veH043dEQOYD+lykA7eqwZp1X/JnpbP/msDjvH/AAUxwSnjl1RHSuYJpD8bYizn5um4bkAkeqt3tU8K7nX8O6PVUdulghoXd1M+V4L3MdgA8rWhrQD6nqtXbXqCs03d6O526c01dSyCSKVvgfl4g9CFsVxF7ddz1lwbr9JV2mqRstVTiB9YKglrenxNZy9dv6RTHlTlNOJmwzKHiypvemu3+DSi8ThspaBuE0CTldz77bpTXTied7s9SkLz6rcjDS0eb6tj/adQPgcPjdHg5Jb1JU/tGoqWWAMqRzxNBLgXkgZ8/Mqnw4sIKVUlykgIBcXMzkjPVIX4is5Q5VkuHcuqttduuMTDCGxsePhyMucPQdAoVfdHdw574vgOc8nXA9UgtuuJoMDvOUnqfIeQT5SangqvyZawHfAIzj1+fzWdGq7HfyNDzq7FwQapoJoCQ5h+5Ji0hTutY2tbzNja0f0i7r6qP1VuAdu3OfLxWlXf1LkpkvgMi+pY+gwTjZYX0r498ZHomVOLICmyW911u1JSNye9kDTgZw3xP2DJV3Xeggsoge2Ka3VDAHB00bmtlcM4khmYTggYBY4YwOvlB+FVjcWVt4LmxvhPcwlzSRzY5nD0JbsP7SnNXaoRTxNivIe2am719NiTDXnLhE5x6kDG/gfkSs7ImnNR2ey8Jw73jO+qHU381wl/v/0y0+AvD73i1VFZV2pst1kY6phlfIzuZqeOVsuG483Nc0b4DmAYyHAWhqyzU2pNCUl3gnFwtbhJLDBDXQyyQcrgCzna8Mc0RknJwQGAg/WaK2tHFDSFLHaGV2n6inp5YoYKujZL31NLTbc7AxgzzEEvGSCC0Ak7gzvSPGrSouFHQSQOfb6QcklRHl0fcsOY3FjWA8jQ7m5SC7AO+zg7Cm5ufmNPhkKLr8fIhOtcp/Ah+lK23WqaWllfJJeRJ7xaaJlQDHTzszl9S4sAe1gc5+G4wBITsAqH406YOnNWVre8p5qepJqIn00gkYA45LQ4bHByNlbst0uE91dUWeudbrfLMwNgicGNg5nbEEtDgfBuT8OfrHCw8ZNFUOs9OVlxtE4qrrQUzZ56RkPJIwg4lBwMEDqDsfDdP4tvRPqk+57vI8LyrsS+y+voa1Jb9eOfy2vj66RqhUAMf8PReRIQR5J1p9N3G4nMFLI8efLhPtu4TXyuJBi7rlcGu5h0ytWzLoq9+aR8tUbG/ZREmTnzKXUrgQC7IB6HwVr2LgC8yR++OcXc3K4E4H3+H/WFP7JwSscDiZ3sMjSAWOeBzjwOFkW+O4tfu8mlVRe+XwUbaKGeucyOlppJ3O2BY0n7wrX0hwRuN2fDJcJhSQu2LGDLnb/uVh0zdLaVLTDAxjS8t5mnGH4xjfocb/NRvU/Fi30bZGNqZGmJuQ6N/dkjOzsdOYePgd/sxLvGMrK9jFjr5mrFV1R3dIszR3D3TeiXh8bYppw7D3y452Oxt16H9qc79xbi07G6ke+N7Xs+OnYPsEkZ6+Rx4HO++VqnqftD1FXRSxRzB07W904t6uHgQT1xvseiqm966u+pntZLM8MDuZrGk/CcYOPEA+SUq/p/LzZ+Zly/cTv8eooj00rZf/EPtJmbENvqXz10eRHJGOXkO+CT47HcfMeKp10tx1RXSVtxf8Uh5ixo5WA+gSDTWmnSPE02/jups6COCENAGw6r3mB4VjYEf7cefieDz/FL8x6m+PgjDw2kbadWGkftDVN2H9Yb/sytytBdoM6E0gbRQ6ap3V4p3Uza4VDWczSScn4C4buOQM58x4aNXCpdb62nrISRJDIHj7Cr4tta2uo4KhhyyVgePtCbyKIWpKYvi5d2K3Op8tafCf1DUtmZqG81d/vNd3txqHAyS45WNGQGta3Ow3AG5Kf++o7ZRRHm2YwAVEf5px0cPJUzxS1k6WpbaaSUBsDuaVwPV/gM+n7fko/S8RHvpZBNO9tUG8mQTiQYx4bJC2vq1GHCR6HBudcXO57lLkd7nav4W6+nMcQETHhjuUYDj5pTrfTTqW+0FmgYfeHMEsm+Q0ZwP8Up4bTNtdT3tU/NSAZXB3XmduM/IJRb78y7Xe6XuWaPvDJyxh/XkaMDH7ftUOqSlpdki9QjKLb7yezBWaLFHdDEJC9tFTGoqHk5PMfqt+Z2+9W3wl0P7ppxs8rfiqpDIM+IGQD9pyftVZ6Etdy4gS1ppSWw1NQH1NU8/Cxg2DR5n0WzNjo46Ckp6WEERQRtjZnrgDASeRa649O+SDULH7PY+Umlo+XZgXup07HEw/CAU/sqWwx+CQVda2RxGVkebLfct8uKRE6ywtkJAATJWaQEgJ5VYcIidu4he5204YemVcsiUeCt0Rl3NhfZn2f6JfxJ2x3n0b+r3r963hWoPs/jGZNf8n/9hn/2lbfL1WJNzojJ/fJ5/IioWuKBCEJwWBCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgDll7cQ4/iV/Tf4Bct43ZXUb245x/Ep+m/wAAuWbHbquSJoUlxafRZ4pMrqv2AdIdl7ilwj0NpS/2DS9/4qzU9W+tpKukL6p/JPM8FzsYOIgw9egCvXjZwd7IvAi30p1nozR+m5rnHMKA1FCcyuYBzY5Qehe3r5qPRs71HD3ZzduqwH62F2o7JXZN4O6x7Jeg9RXvh1YbnfKyye8VFdUUodLLJ8XxOPidgkvYt7KHB/XnZS0TqHUPDuxXe91dDJJPXVVKHSyuEjwCT47AfcoKt7O9Rxrhxy7rJFK6Brm4y1wXWD2c3Zo4V8TuDGp7nqvQllv9wptWV9FFU1tMHvZAxkJZGD/RHM7A9Smzsj9jDhvr/jxxvvmodP01wsmmtXVlos9hcMUcTWyvOXRjZ4a3laGnLeuQVxRZONnScrYpHwOLo3uYenwnCsDQ/GnUGk/d6ZtfIKJhwG+TfLC7RUHBLs69oaPW2l6XhlY6Z+l7m+yV1TR2iGgmjqGsa4mGWEB3KOYDJwMg7EdeMXHbh1T8KeMOrtI08hqKezXKakilkA5nRtd8Bdjx5cZULIRa9pbGasqVb3Dg+axuFsud2ZW2v8nHVN72WnHSJ+dwPQ9ceGVEtVVpZSNjB+t1XZLs39lXhFqXsnaN1DdeHtirr5VaeFTPXzUoMskvdk85PicgKD9gHsd8M7zwdg4m6101Q6oudwnq3U8N2hFRTUlPDM+L4YXZY5xMTnZIJGQBjxlVX0NCd0/Nk5a0cb5HbrEu6db2aez522OAbtT6S0Hb9MPr4altsulBbIrdVQTRuewF7Yfhe3mb9V2cg+B6VX7M/st8KOK3Zbo75rHQNl1Be3XWtgfW11MHy8jXgNbn0Tuyk5AFq8OyF1/7EHYw4efw+48aW11oq16jk03qOKmtz7lB3joqZ8b5Iw0nwLCwpHwG7PfBq9cGO0PcrzoixVdx0zqa/wBPS1E9MC+igjjzA1h8GtIOEbBHIvmI6HC9xVD4iS1xGdjhd4uCPBfshcebZVv0TovR2pJLWyBteaehOYXyNdy83MB15H/cqH9oJozst8KeEmtdK2LT+ltP8VI6amloaSlpCyqbzSxuy12MDMfN49MrnclvRyjgvtRC7OebfO6cG6jje34oyT5+fzW1HsreFekeL3aJudl1np6h1JamWKeobSXCLvIxIJYgHY8wHH710P468Kex5wJpW0esdIaN03crhSTSUDJ6F3NIWjGW4B6OIVMqoP0JqyS9TiabjA87uaXEYwP2L66eN+wILR1Pgu1fAbsmcDOMHZa0jqKLhpp193u2nIw+uZSDvPehD3b5Af6XeNcfmq/9m72SuF2v+yxZb9rTQNm1Be6yuq+aquFNzycjZSxrc+Q5VX5K9GWK5+pz84UWyV+gWVFDSwTTVFZNFIyd2I5owxrnF5z8IY1kjucYLcZHkXegpKS8NrKiy6hbDRsY4Otd1IhqXvDhhrTsCO7DpC7O/JgjJaD1D7JvArhXq/QurKj+A1lfSQ6svVBTx+7AtjgZP3fdj+rhgGPLZQrtJaM7PV+pbFaLFbNMs1HBfG0D6aOl5ZXsjZLHJEcjcNc9h/uhZeRQ69zlL8vj+Rv+H+J248kqNr4/D8zQeLhvc2U1fQOdTVFQynp46J7qgYY59QXmONvxflXtaficQB8YJzspNp3hlHNeJa6311LT0AbDT04pZHvfCAG5mw5jTIC1swwMOcWHAzgHoT2nOxpw1HCesrNLaItNku9HV0lQaugpxHL3LZmCVuR4chcfsXnjp2aOFWn+z5X3636C09RXOnpKetNQKdkTpOQse9nP4c4Bb/eS92PKHXt9lv7/AGNSjxyyUoSXfel8mu31NDIdB0UlquLLjqijopKiWSlEducX9+3uo6iDlaASRKX8owNnDCvDhjo+WsbWMdQRwWaW3v7qaZrffahzowzmqC3bmY9hbjGdwXZJJM97N2g+Hw42y6e/g9aX09xpRc6EMhDHOYI+V7dsHAc2N2PAknqFtbxL4caY09oDVN2ttkoqGuho56v3iKLB5wwEuOPMMGfkslU25uLOdHCXx79t8Gh4j45dfkQrzJOXbWta76OTMOoNL0VS2R1NHTuMnK+LAw1x8R9uxHqEz3XitarXVVDYqWIjnIhkb9V4H5jgem24+3ywuovCzsicJLvwu0pVXvQFkul0q7VS1FZVVFNzPmmfE17nH15nFU3wQ4NcFtY9pXjvw4vHDvT1VLp2uoa22RS0oJbSS0zA9jfRkgz/AMcrav6e6tSsn+h56fjXTuMYnO/UfHSngwYZ2N+I92W9WbZA88EH7CMHZV1fOOs9yAMbZIZWO5gYz8OT1x/VPi3z3HkuoXZX7CnDl/E3j1U6v0Var1ZqPVP0dZaavg546SFsQnd3YPQEVMY/uLlP2kbjp658edczaTtdJZdNMuk0FvoaGMMhjhjPdt5QPPk5j5kkrao8Gxau62zOt8VyLOFwhLeuKdfc45Yn/EJNpCT9bHR3oQodW3iqriO9mc4DOBnpnqu9ulOyL2d7TwZsep9RcNNMR08Nip6+vrp6POB3DXySOx9pKoTh7w67MHG7tjWe0aA0zpbUGkIdGVlRXUdJSEQCsFXCGPc1wHxBjiAfIrUqx6qFquOjNtvste5y2chI2F7hgZypXp6zNJD3jfruurPF/swcKLD29uCGkrfoKyUemrvabjNX2uKmAgqXsjlLHPb4kEDHySztmdkTQWiNZcFr1pXR1ttFjqtVUlmvNFRwcsNRHNKzl5x4j4Xt/vYTa0hWe2uDmlSvZDGAAP2LxVVgDTv9hW+/tSuCeheEmmuHkmitJ23T1Tca6qhndb4O7dMGsj5QfPBcfvW5eluxNwUotK2WmuPDjT9ZWx0cMU1RNTAvmkEYDnE+JJBJUuoX8ttnBi5VHeBw81b/AAvuZrtI0wJy+ncYT9m4/UQr97RHArSGiPaS8P8ARtFpyhpNHXuss8rrOyLFO+KSXupWlvk50b8/NbQdtzs/cN+EXBGCv0doy06crJLvDG+agpxG5zTHJkE+vKPuVVnKLVHSOYOvuGwnjqLla+9kqHSc8lNnIIPUt8evh81W0mnbjDA+Z9HURwtOHSOiIA/UtjWVIDgM+K663bs9cErBoyS737Q+n4LZBStmq556QOa1vKMlw+1KKLfYervaWpLZwBpq2uZmGOeR3efC7xLs+HmrW0DwbqrjLT3G7VL6Cldh3ujP5R4HnnZoP2n5Lo1p3s/cFOMXaRpIdBWy00+jbdY21dfHZoTCJp+/e3kLsBwyHMzjwC2d/i84SHVTuHo0LZhWttjbicW2IDuTI6Mflcc/Plp36+qolCc99LSG/wAQl6M5l2WjorTSMpqCmio6Zu4ihbyjP+KfqepawZytmaTs9ac0T2ubJpl9Gy56XutDPWw0Nb+UEeIpMsJPXlc0EHruPJXvfuEvBuzahsen6/SltguF774UUbIHN7wxNDnjmafh2cOp3WV+BnPbbS09DP4qMNLW+NnPGouIDeqZaq7criebC204l9n7TWgu0bw1pKOibLpnUdTJHLbKhxkY18YHM3LiSWkPacE+BV5687M/DmfROoG0GjLVTV5t9QKeoigw+OTu3crmnzBwVGHh831JtcEp5sFrS7nMuXUpiGzspvqdWO5Tl+ftXRDs29nHQF84F6NuOoNH2y53atohVTVNVBzSP7xzntyfRpaPsWkfbs09ZOHXHevs2nrbTWe2soaaRtLSs5WBzmnmOPVSlhOEVN+pFZfVJxRst7M28/S03EsZz3X0Z+v3v9y3jXPH2SdWaubiySc4+ifxq6HLexo9NUUZN0uqxsEIQmSkEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCAOV3tyjj+JT9N/gFywY7ddTvbl/wAyn6b/AAC5XKLOo3H9lG7PbS0p/wCI3D/3WRbNe2zZ3kHCX+1c/wBlMtYvZQHPbT0p/wCI3D/3WRbPe2wOIuEg/rXP9lMoS4iSXc3D7C8DJextwuhkH5N9jY12+Ni5wKsvhzoHTvC/htQaY0nH3On7fTvjpGd8ZsNJcT8ZJzuSqu7Fn+8q4c/8Hv8A86Qez/GOxZw9/wDJsv8ArZFNPsRZA/ZUHPAHV/8Aw2uf+rp1S/Zu7X+lOBXaw49aI1vWC0Wi+azr6qju0v8AIQTiokY5kp/NaRykO6DBzhXT7KoY4Baw/wCG1z/1dOoR2TuEnDbi3xv7S9PrDS1o1Hd6DXVY+I3CBskkcL5pRtnoOZp+1R+GjvxLb7RPZHreJFBdtWcIteXnQOrbmRXS/Q91mgt13k5AGvlbG4APLQ0CVvpkHqOLvEi36jtmur5R6wfVy6opquSG4vr5TLM6Zpw4ueSS47dcnIwu5HZb4d6s4Y6u4t2e5W82rQYvrJdI0jZWuiipXRZkETQSWM5uX4Tjfm2XJf2gNRSVHa64iuonMdGK5rXlhyO8ETA/9eVTYuEyUfgdbOyr/vKNCf8ABZv+rctafZwdsLRtt0ZS8IdWXOGy3inrqhtomrDyQVjJpXSd1znYSB73gA45gQBvstleyp/vJtCf8Fm/6tyoXsD8BOFPFrsw0Fwvmi7HfdR09fcKapq6uma+USCd7o+Y+jHx49MK1b3EgeO1f2H9cac0nXag7PWvtU6TZSCWqm0NbrxUQ0UoJL3mkax4Ebycnu8EOzty9DKvZFuJ7HNAXk5+mq/JP9sK1Ow7p7iJozs72i0cUm1MOo6GoqYmtrqhs0raVsh7rmeHEEcvTJ6YUI9nFPRVHZy1FNayw26TVd7fSmP6vdGoJZj05cK44bI2PQ9tsus9R6oogG1WoIaQVfINpHwNkayTPiSx7G/KMLgFxp4x620Rxa40aYsGprhadP3rUdybcbfTS8sVSDPI0848fh2XbPsVcUW8XezPoq+umE1ZFTOt1Xvktmp3uhdn1PIHfJwK4OdpE/8AZD8Tf+Etx/8AeZEI4dDfYeN5bZxh/wDDWr/m1a1o9rS3PbO1Af8AvbQf6kLZr2IA/wA2cYP/AA1q/wCbVrWn2s/+/M1B/wCTaD/Uhd9TpJvYzj/sprv/AMG6n/XQroV23eyRw87RFui1BrG83G23HT1rqzQxUdZFC2X4ef4g9ji74mgbELnr7Gf/AH093/4OVP8AroVuL7R7sQa77Wep9G3DSFZaKWCz0c8FQLnO+Mlz3tcOXla7IwCueoEp9lBqf6f7HFhoi/ndZrjW0GCckN74yj/Wq4OzPpiDhVwIhtswFPT2ysur35GOVja2o3/5IC1H9i5enw8OeJmk55A6ezXyOQhpyAJIyzb05oXLbvtY36Ph/wBlnirc6bFO+HT1w7ot2xNLG9rT8+eQH7VwCovZZXmTUfZVZdpjmWv1DdKp5Pm+oLj+sqv+0dwF4ccLtf2DXEV5qa2+ag1XHT1DayqiljpTKJXYYwNBZ+U5R1Pqpd7Iz/eZWf8A8r1/+tWm3aK7B/ELhbxiruL11r7O/TNbrWnnZDTVD3VHLUVze7BaWAbcwzul76I3wcZF9NsqZqSOxl2t1NerVVW2raH09XC+CRmfrNc3Bx9hVOdqm9Q8Ouzdd6+rf7xBa4KcSvLd3ta5occeoB29cJF2p+Kz+EV64K3J05gobhreC01m+Guino6uPB9A8sd82hRP2nEM1R2ONZRwOc17n031fEd83IRfUra5QfqtHKbHVOM16PZrr2L9f2e/9pqg0/FMx1TSR1FdRva4OEsMlOc8p6gbtyB15WnwXQ2+1kN9uNy0k+Tupau0vl5x1a15MRP2EhcOPZYyPf23dE87nOPu9eNz4e5y7Lr1fdVi19tHSdje/lZddF3B7R/SfFV07gP+S55+xUYeHHDr8uL36/wi/LypZVnmNaLPsVxhoL8dLREH6NtdLNkD81zpIx/qlzJsvE3+Lf2yuoopZe6pNQyssk2TgOMtJCYwf+MYz7cLe/QupfpbtY8VbW1/My1WGxRkZ+q57qyQ/qc1cme1ZK+D2pcskb3RyN1ZZi1zTgg/5MnxI6w9qziBRdnvs58TdZUYbTXCWllfA4dX10zGU8LvXB7sn0YV+cpz3SPLnuLnOJJJ3JK7h+2GkezsigNcWtdfqMOAPUYkOCuHsWCVJAfpXsWk7frvs4WjTl1mkp7ZddMU9HUywvDHsjfTNa4gkEA4PUhaedmPs36P7NHb8k0/om5Vt0tNRoSarkmrqiOZ4ldVxNIDmNaMYaNsLZjX3+8humen8BvwQXOn2Qxb/wDKaugaMf8A0aqjj/j6dC7EW+Ubl8cKfn9ozwAm/oWe5j//AJyrZ/X2iLdxDsbLRcMFsNZSXGJw3dHLT1DJ4nD+9EB8sha18aQD7QfgRnqLRcsf+jlVm6g4lDTna70rpGom5INR6XqnQMJ2dPBNzgD17syn+6g4n32a+e06sZ1Nqzs82gNLxXapdC5o8QTBn9WVsvxq1w3R2p+EdtbJyOveqmUBbnHMwUVU8/8ArNYqw7V+n/4Tdo3sv0ZZztj1FX1jh6Q0om/6NWbxr13w30ZqzhtTa5pWVF5ul6FLpt7qYzGGtLQOcEfU2cBzeq4d1yarduzSApO3D2VdUsZvXXmK2SuHh3NXDIwf+0P+5Wl7S2Tu+z3Rn/v5T/6uZOHbU0v9Kau7PN5azL7VxGtrS7ybK4tI+9rfuUr7Y/BK/cfOFFPpvTs1JBXx3KKrLq2QsZyNZIDuAd8uCi+x047e9ZkbjzC7o6q0lbte8M6rT12mkp7bcaBsE8sLwx7WloyQSCAfmFxJ1Noit0XrK76er3RyVtqrZKKd0JJYXxvLXFpIGRkLsR2hhns06tH/AHl/+FqqT0mCRV/Zv4VWDg92iNZaf05V1FbbmWGlmEtTK2R/M6TcZaAMbeSsBjv+zFnb/wD4bEf/AGuVas+zgvFPR8UNQ0EsjY5qu1ZiYTjnLJGkgfYSfsW3jdHXcdpyXVHuh+gnaXjoRVczcd+KmRxZjOc8pBzjG6ph7UU0vUYfDe/gQzXb8dtbhm3zstd/q5FaOrtMabvHEPRVyulzFNfbaat9qoTUMYaouYwSkMPxP5AGn4emd1TWs7zTVvbx4e0EMrZJ6Ox1Zma055C+KYtB8jgZx5EeakXG1rv/AJRfAog7Ce65/wDQxLq0lJ//AHL/AAHL6fy/5IBx01bdK/tg8GrJVWae322iqppaWtlc1zax0gAeW4JwG8jNjv8AFuBkZ2jr7lF9L09okxmsppnj15SwH/nqhu0fT952guz3IBuy61+T/chVh63upt3GzhtDzYbXRXKmI8z3LJB/qyuxfQ5b+K/wDXUo6+DJLp2Gm0kbJpOlx3VNbXFnoyMxsH/OXKz2lz3N7TdyAP8A9m0n/MK6YfSvf9owW4Han0uZiP7dUAP9WueHtDrA659pS4y8uR9HUg/9Qqu+SUOfiSqi3Lgn/sgA/n4tlwIB+iMf+2ro2tCPZX2gWkcThjBf9F/q97/et91dQ1KtNFdqcZtMEIQmCoEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCAOVvty/5lP03+AXK5dUfbl/zKfpv8AuVyizqJnwi4var4Ga4pNXaLuYtGoKWOSKGqdTxT8rZGljxySNc05aSNwpnxr7U3EvtHts44haibfhaTKaPloaem7rvOXn/AJGNnNnkb1zjGypoHBSiJ2yhLlEjZnQfb8448PNEW3SNh1oyh0/bqf3SlpDaqKTu4t/h53wlx6ncklZOH3bv428LtEW7SWmNZNt1gt8RhpqQ2qjl5Gkkkc74nOO5PUrWuKTGEvhky1UPa9Sa0Xnwr7aPGPgjp6tsui9WNtFsq66W5Twm20k/NUSBoe/mkicRkMbsDgY2CiGl+0VxF0ZxTufESyanqbZq66VMtXXVtOxjWVL5Hl8nPFy925pcSeUtwPABQFjg4Y8Fikj3yFHqYNG3eofag8fdUWB9s/hDb7R3jOSSttluZFUuGN8POQ0+rQCPAhauXKuqbpVT1lXPJVVc7zLLPM4vfI4nJc4ncknxTdT7BLmt5mqtybfLO6L30h28+OGiNEUGkLNrJtHp6hpPcaekNqo38kOCOXndCXHY9ScqOcEe0xxE4AXOprNF6iltrKt3NVUckbJqaoPm6N4Iz/WGD6qpywtKzU4Jdhd6mGjYzjP7QrjhxW0zPZa7U8FmstSwxVVPZKRtM6oadi10m7wCOoa4A+OVFuDPbI4t8FdEM0lovVbLPYGyyTik+jaWbD37vPNJE52/zVHamldDRxNH5zslMNLdHwOG60oP2VsVkm3wbGcKO1dxc4B6arbJw91d9CWyrq3V8tK+gpalrpnNa1zgZY3FuQxuwIG3RUBqnUFy1Rqe63q9Te8Xa5VUlZVzcjWd5LI4ue7laABkknAACW097bI3c4Pkm68SsqcPGOYeSsaRCLa4ZZXA7tVcTOzbDeI+Hmo22Fl4MLq0Ooaep70xc/J/LRv5cd4/pjOd+gUS4wcZNWcddaVGrNa3QXi/VEUcMlUKeKDmYxvK0ckbWtGB6KE85C8k5UC0sDgtx41v2etVzak0FeG2S8zUzqN9Q6lhqMxOLXFvLKxzerW74zsrv/8AnTO0x/8A1Dj/APwO3/8A6C1QQg6W1wX7VfE/s+XTUFw0FqMWSqvxY64ONFT1AmLHPc08ssbg3Bkf9UDqpfxJ9oLx44uaIumkdVa1bctP3OMRVdK21UcJkaHBwHPHC1w3aOhC12QuAX1wf7c/GrgNoqHSeh9XMs1ghmknZSutlJOQ95y488kTnbn1S7iL7QLjtxX08yx6o1my5WxlXBXNhFpo4sTQyCSJ3MyEHZzQcZwcb5C13TtpfTdXqq8U9vo4y+SVwBI6NHiSotqK2zqW+EbX2ntFcY+1m+2UXETVH0xp6yV7LnTxst1NTFtUxrmNcHxRtccB7ts439FspxS45674taHrtMagv7a62VQb3kHucDOYtOR8TWA9QOhVE6S03T6F01T26hABY0GSTxc7xKXsvkrHb5dheMyMu2+1uqTSNymqEIJTXJrbTan1f2YeLkGq9HV/0PeabvRS1jqeOcMEjHMeOSRrmnLXEbjxUgvPbz4337iTp/X1brJsuqrDTT0lvrhbKRoiimGJWmMRBj8j+k048MKzuKHD6LiJp2SSGMCsiaXNIG5K07ultntFdNSVMZjmicWuaV6XDyFfWt913Mu+ry5fJl+WHt/cddNa71PrK3a0bBqLUraZl0qzaqN4nFOwxwgMdEWs5Wkj4QM9TkqsNXcaNX664qu4j3q6is1i6rgrjcBTRRjvouXu3d21oZtyN25cHG+VCEJ8WL14y9t3jL2gNHjS+u9WMvVjFQyq92bbKSn/ACjM8ruaKJrtuY7ZwqLacFfELuwNlqv2h/Hm76Gl0dV62ZLp6Wg+jH0f0RRNzT8nd8nOIeb6u2c59VB+CnHzWXAXVMmotEXcWa8S0r6N9QaaKozE5zXObyyscNyxu+M7KoQcLI2dzR1UkyLWzaK69uDi1qPiJYNd3PVbKjVNhhlp7fW/R1IzuY5AQ8d22IMdkOO7gfRJ9TdsTi9xO4laZ1dUajdV6r07n6Lro6Gmj93ycuyxkYa4HJBDgcgkdFrXHO+VwHMVP9H3elsjGuZjvD1ceqktMpmnFcGz9b2ou0LqTUGn9S3XiLT/AE1YfeHW2b6GovyBmjEcuwhAdlu24OPDCrPjl2meOOtL/pG+at1cy81OlK36Qs9VDbqWEU0/Mx3OWxxND942bPDht6nMWdr9pGC8FudiCmi7akju1LNA/DmPBByutRKoTs3ybCaX7bvHjihDSz6n1nHX0turYLjRRGz0UfJURO5o5cthB+Ejp0O+QVa0Xbs45k/FrRv/AOFUf/6K1c4Z0giop2gYY1sbW/LBUumIjGUh1tsekulj1d75W6q1Bcb3dJxU3O4VD6upn5Gs7yV7i5zuVoAGSTsAArgv/a14pat0zV6fuupm1Npq4fd5oBb6ZnNH5czYw4dOoKoFlbh2E5UdUHEbqme0Ti0SfTl3uembvS3Wz1s9uuNM8Phqad5a9h9CFf8AH22OME1o9z+l6FsvJy+/C3x9/wDP+hn+6tfLfMzA3T0yvjY3AwkJTnD3R2Cg/eHjT+v9V6V12dZ0N4lGpyZHOuNQxs73F7S12Q8EHIJHTbwT/qHtM8Sb7qOxXyv1EKi6WR0rqCf3Gnb3JkAa/wCERgOyGj6wOPBQCorO82YCT6JOy11NW/6hASvXOK5ehtKMnwiybp2j+IusdQafvN2v4qrjYpXzW+b3KnZ3L3gBxw1gDsho+sD0TzfO0nxB1BebLd7hfxNcbNI+ahmbRwM7pzm8rjhrAHZG2CCqzp7M6ljy4YKw1GIclxSs8ibfEmNRpilzEsxvaX4i0+r6nVMeoQ29z0jaGSpNHTnMLXFzW8hZyjck5AzuoBxF4iXniPqCW+ajrRcLo+NsTp+6ZFlrRho5WAD9SityvDYxhpUYuN6dg4Kh5lk1pt6O9EIcpG/vszJ2zScSuXw+jPxS3jXP72UlYauTipk55for8YugK9RhrVEf1+pg5L3a/v0BCEJ0WBCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgDlb7cv8AmT/Tf4Bcrl1R9uX14J/pv8AuVyizoLJG7Cxr3H1XCQpYd0ugfloCQRpXAqZkkxW07rOGZblYW4AzlKoTzhLsmeWEN2SuF+UjkYQ4JXC34M5UWgF8NKJh5pdT2CqkPNFE5w8wFm0ra5btWtjYQ1jT8TirDvepbfpa2+7U0bZZgMFx8Cs67JlVNQgttjtGP5kXKT0ijtYPdT1EdO8crg3JBUYMbXu22Tpqy7vvF3mqHbF22yZg8heirbcFsy5JKT0Zu5e3dpC8Pc/lwV875xXlzneJVhE8oQhB0EIQhsARhO9k0pc9QSAUdM57c4MhGGj7VY+nuENNQFs93lE7xv3Ldm/b5pay6FfvMnGEpdiu9P6UrtQTAQs5IQfimfs0LYXhppqi0lS/5KznqHj8pO4bu/6ky1ToaSJsVOxsUTdg1gwnCx6khp2cjyAVg5t1l8HGPYbrioPktqkL66PlB39U52SysbKTK3mCg9l1GC8crtlYVqvtO2AOkcAcLz9Vnkvpkh7fUP1upKWnmwwdeoVR8feAVNqunfd7Q1sNyaMuaBtJ6KzoLxRulD2yN+9PMtcyshAaQ4HwTfnyomrK+C7y42x6ZHNe72assdbJS1sD6edhwWvGEiW+muuFdo1jTPFdRtMh+rK0Yc37Vr1qnsxXajlkks9Sysh6iOTZ4XpcfxKm5alwzJtxZ1vjlFIIT/qHQd90sc3G3TQR/wDdOXLfvTAtSLUltPYo013BCELpwASDkJQ2slG2UnHVZBjwXUAvo2y1LhzP5Wp7ip4ImZLi/bcuKjbJ3g7E59FnE0riG83xOOAF3eiOtm1nDfStS7T9E5re8M0EbwR4jH/WpNW6IqzGSGnKsDhRc6HSejdLTujjnjkt8XMSM7huD+xWZbKzT+tqiaKjhjhmd1c7YD7F88yv6gWNkyqlF6T7ntqfAvxFCtUuWjU6ewVkEpaYzsUqpLRWAj8mVs9d+FNPTODw5krHeICx0fDykZjmYMLYh4rXbBSjyjGl4ZOufTLgoWgs1dIRiMqT2zRlZVEGQEBXKzTdBRDJa3ITfcbtRW1pDOUEJezOcvdRfDCUfeZH7VoiClYDKBnrkrJcBRW1pDQ0YTbeNcANcGOx8lXt81RJO53xHBSf9yx7kObhWtRRJrrfotwCBhQe+6hzzBrkwV18ke4gOJTY+oL8uecq+NWu5RK3fYzTVj5nFznHCabncWsYWg5K9VtaGt2KYpjzyZdnzBTUIJ8i0ps6HeyIe+R/Fpzuh+icf+2roque/skw00nE9zW4ybWCR0P+610IXosb/tL79TIu/wC4wQhCaKAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIA5We3M2/iT/AE3+AXK4HddUfbmfzJ/pv8AuVvigD0vreq+L6DgqBMVNSiMkEJNEeiVNwqpHUKg74fNZqablckrTsskZwVS0S2ORAkAK9MJY3BWKJ+yUgCRqpJEo0wfcqZ9QHZcR0B6Jg1Bc5amoeHHI8k5WBjqlpga4D18k332gihldHGTI4blyTUUrW33H4t+WkiEVtJI6QuDcg+SROjcw7tIUpdFyH4sBv7V9+jmVDSWNJaPRaav6VyKOnb4IpkhfFIJbVGXEY6eQSV9ta09FerosqdMkNKE5Gibg7LA6iwdlNTTIOuSEiXWWnhnuMIn/AJLmBcPNYDSkHqlFLH3JBHXzXJS9ng7GL3ybF0pgorPAKHu2MLB8LNsKN3C7zB+5PVQWy3+pgexrpHco9fBWCz3e420TN+sBuT1Xnul1S1Pk05RU47hwN7awTg5O5XllsfK8PjJ69AvkDYmuduErpKoNl+F3RTm3FcCaJBZg+lDec4wpMy4SyR8rHH7FB5bm5vwjqpNpSWSpnY1w2ysmdepdbL4vfBJrZbqqoLXd48A+SsvTVBLAwF7y4epWC0UdPBQhz8DZJ6m/iF/dxuAaFC6xWR6Uh2uPQ9tk7mgjkpcjc4UKuMfc1B5dt1IdM3iKqh5JHjmPhlINX04gjfNGcYGcpCltS0Nz01tEd1I61u09OLuyJ9M5pBEgWkOu7Zb7dfqgWuQvonOJYD+b6K2+LHEitq3y2tw5Y2nGR4qk63M7ifFeuwK51+03wzJynGS0lyNqFkMDvAI93fjYLb2jL0zGgEhejE4Hoju3eS7sNMGyO8CnG1hvfB7j06JHFTyPIAad1IdPWNz6hr5hlrd+TzVVlsa47bLK6pWPUTZ3hjq99Vw8tttqHcggc4Mc763LnZSq3Xess9ZEaSp5nyHZ4OMBU1YLs2NrI34iGAG5P1fLPorV03Q1Yt7qiaJhDHdOpd8ivknikVO6Vsl3fY+n+Hy6KY1xfZGz+j6r3ywxy1NSambAy4nYIut+p6CNxMgGPVVLZNR1VutbjhzGjoHO/wAFC9T6urql78Pdyn1TvhWPKVSTZneJ5EVa2kWFqfiUxnM2J/T1VdXHWE1c8nnOD6qDVFdPPITI4/evrZ3uw1uSV6ZY0YI85K9yfJI6i8FzclyYq2vfO4hvj4rLFbppgHHK+yWySPown7EdKiG20NLoyBzHqkcvfTOLY2lxG+An9tukldhwLR54UgtVmooYBJUHDgOh8PXPl+xQnaq1slGtyIDFp6pq3AkHfcZGxPkl8OlJAIyWu7s56dQVKr9fqOiw6kw3B6Ebg46H5jKjkuoe+AcHYG5AA3B8cKnzbJraLfLhF8m/nsrqOOhh4mQjBlBtnM5vRw/yvBH61vstAvZUVfvh4ovzl3+a8nOx/wB2brf1epwt+RHfz+rMLK15z198AhCE6KghCEACEIQAIQhAAhCEACEIQAIQhAAhCEACEIQAIQhAAhCEACEIQByv9uTG6T+JXlGcfTZ/9wXK3unAty05PT1XWf21sHfs4OgNLj/nkbf+Yrl3VUxiYHNaJJjs0NHQ+apdmpaLFHa2RxzSxxa4YI2IXxZ6mndBJhxBd4gHOFhAyp9zhliO6WscMJGwYKVMKhIDOzosrFhaCsrTgKlkhVC/cBLGghuQmxr8FL6Kbmdy4yq2vUkh4szjE8u5sE7LHdG8smRzPyc4PRZIo3NIIbhZK+F01MTuMBUyim9l0J6WiNTyd5Nl5yP6KUMq3Oj5C0tA6Nam+Rrw8+OepCVtlDIhy7eGT1K7KK0i6MjMXNDC52OYeCTzAuG2MeaMZB3w7GDlJ3kgkcyFEk2eZGN8djhJ5ADv1KyOY7qTnK8EY6lMIqfJiwvbWgHdewGkbDfxWeGDnbkty1dckjiWz3TZaQc7Kx9OzxstTmnIdjr1Ve08OZmsBU6tNOYqEjOCB4FZ96UtDEXpCSd4792HY3Qx74SCDkJFcN3ktOHBeKKrc/4HnJVrhtCW+R/pKzvZW8ysnSEkcjm7AHzVXW8tbLknBUttV9FI9oGxHisvIr3wi6EtPkuKGvfI3uATkBQ7UNbW0NQQMgZ6hY6bWUdLyyOIyBle7lqmjvEYf8PMlo0tLehpzTF2ldWyQVLA9+COu6sK9Xc3KyPdG7mPLuqWi7uSYOjIBHkplYrq9sIhk3aRhLzr6ZbLoT40zXDiJJz3ub62Qdw5Q14+9W3xlszILkamKMND+qqZ4+LC9PjSUq00JWLkxgZ8F7DMYXsRkevosnIemMnzTTZUkeBECM4WaOkJIy3IPl4LyHljsFLaOpAB8T45VUm0uCyMV6maipGAhxb8IO5UhiiBZy91yjbBYdnfYm+CraHAcoz0Lh/inm21DzzQyd2G4ODJ0z4fesu6T7mjVFdhbbqoMPc1DfyePhPiFbHD+uuFZ3NPBIJIwQ0Ak7HwVUwzwPIZM3u+X81ytDgsIajVMAiqXsx9ZjXD/bC87nV+ZB8G7iT6JLkuW5WCopKSMSNLXPHMQTsohdrZhrvh3VxXacVsMcZ+IMGMkKNVdjZNuQMKeHLy60mhXKirJtopee0PdKcNP3JwttjIIJbv6qwKqywQ5PKE3Hu4nYaAtbzepcGV5Si+RBDbO7aPh/UnOM08FE8SwMcANnAb5+a8GocOUN8d8EdU1XaqmkiDWZY07OyMtH2JKx9XDHILXKMc9VA52I4mukadxj4XemOqjV3uPfta2AkuOxb4g+WUvFXBFGXTtEjy8tIYfhcMHBB889E1CrZUygujAwfiDvH7fBU9Wnsm47RG5YpKl2Oo8z4fP96WW6xvmD2cpJaM+Raf8Qn0Np++JP1+b6w328cg/tSkahpKFgHdkhpwH9CNuijPKlrUEdhjre5M3h9lfbjb/wCM8bhrvovDT4f7rzut+FoP7LG6Q3KbimYXhwabWSAAME+9+XyW/C9h4dKUsWDl35+rPOZsVHIko9uPogQhC0hEEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCAOYntq3OaeDRad/wDPJ5fMf5CuYzne9NYI2AB45R5jzXT/ANtHD338Tvxcgb9MOJHXH+QrmM6SWNznsizkAEAbNztj5pGx+29DUV7KGS4W4kvfG38k3Zv9ZNgh5HEOBB8ipp3QnjbG3A5fgz5bZ+0qP3GkbHLhhe8+LiNiVOE98MhKPqIWR4XrBaV7jacrI5mVNvkjo+RyYC9uflYS0hfWZcQFEBVE3mS2jJp5WuCwU7MAA7Z8U4Mp+Zo8XHqPJVv4EiUWycTxASRggDqstwoW1FM5rPhPl5pha6Wjiww5CV0d1dzNDsn5qny2ntEurfBHbqDRExhvLvuktHKx0jnOeD5NPVSDU0rDHnkDpCNlCslshycYO4CtjHqRJS0x2dI0ucWuwfEleByiXqOnRNwmJG5wAvjZCCXZ+1SVZZ1jgXgZGcHySd+48MJI+d4dzZ6r42owcHofNTUGiLmhSH8p2WeGoIcOoHj6pGZAU72+1yVULZAAAVxx4OdWjLRMdJUN5OmfuUxbM6kpmtI3ITPbqJlKRznJCfWmKoiwcE+CUmuVs7177EdrucvLh4pLTvcH5zgp4uEHcg56eaYpJeSTI6K6PKKh5o6stkBJ2UloOWoxjqoTTz4cCFIrbcu5aDtnxS1kN9jqeh+uNHMKfIJwAmSmrHwFzXOI9E8i9d9ByuIO3go/WjMhd0CphtcMm/ih3ob5LA/d2WqdabvraosBOCqmZVFm3UJ9sN0MM7SDjdL3VdS2W1zcWT3iVZ23W087AHPAWu1wpXUlQ9juoK2HfXOr7e5mS5zm4wqtumgLlW1sr4oDyZJyrMOXQtSZbZzyiCMIaMnr4BehkAnovFbA+imex4LXtODlYG1YaeowVr6bW0UdSXcVGPJ26+ZWMtLN25HyWMVXN12/xSkVDS34RsOpK5poE0zGyrkY4/FglLYq+R3KC/BxjmSDDXbnGFnicxpJzkgZCjKMX6E4tr1HZtwkhpi57yT1BO+Fc/ZVkfXaurJns544ot5D4FUVJURvpSGDDs7tK2E7MFD7hYrjXtZmSaUM5t+gCz8iteVLa7jlVj8yOmbNyV0MYO4JTJcL4GkhiZpauZ7ts/YlEFhq7tAZogHY2Pz8PksPohXzJj7nOfEUI5K81UvK4kZS8WKMGN75mlj9g4HG/p/t6LGy3w0XMaoEytOOQHB9fUEfccpqveroIaN1E1wYWnma0dCDvkHwO33/ADVNtz3qstrr9Zi++SsoKeeKNuZBkdQRkdcePkceHyVfyXWauc+FjQd/ia3bI8x5H9uU3Vt9nkqufvA5rvEnfGdjnz8E33DUry17qeIQ5d8QaOpPmR06KqMZJfHZNyTfwHCuohA3L3tB3LgfEfZ4pofPDEd5g5od8PLnOEjqbq5zi6Y8uBs0u338D+9Ru53yNrixhGG/m5/xV1dVkuGVTnGPKH65ahjpWubE8Of/AFj+9Ret1bIwn8oY4/IfED96ZxFPcJMmZojPiTlLW6Skq8RUhMrT9eR+wWhHHqr99izusn7p0X9jbcm3GbjE5oIa36Hx659+XSpc6fZB6aZp2HisO9bJLKbTz8vhj3zH7V0WXpcWUZUxcO3P1MHJUla1Lv8A6BCEJsWBCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgDmz7Y6ATP4PuI3abvggZ//AJLw8VzVko3iP4By8ufgPQZ8c/eumftgo5pHcIxGQ1mbvzOd0H+4sf4rnMaOKVjwyUPk6E9Vh5M3G5r77GpTDdaZHHmOFgaBykkgbYyfEpmrKE/lOaUlp3BH7MKa1NgdI5pkaR6g5OEnmsr5w9jo2tY87Paeh8FyF8V6nJVNlcFvI70WRoL9gCds7KbyabpmsZ3/AC7A8zWb5PzSmgtFMwO7inYxrtjK87K95MdbRX5EvUr6SnkjyS3GOvoslNAJXtGCSenKMq0Gafpa2LDom9Pr4wD55XluioIzmlIAJ8Tv+zoq1lxfDJfh5LsQ6is75sg/U2w7yPknB9GIPAc+M48gn9+mZ2ycwjLYmnLRn62P9vsSeexTxyufID3z+jc7Z/8A2Qr4t9yLqaXYjRfJDJhzcgrKWtyHt6+ifW2WWRvJKBGc7tzjA/xWD6FMAy1netzguzv9gV3nQK/KkMVwhdU5znBGceaidXSOp3kP2BVh1VtLoix3wbbn84eiaK6ys7jJb8Awc4xn9y5C5JlnlvRDhE4EDGQRlesDGEqq43RlwDTzdBtsAkxZ+SD853wU8nvkjrRieCWkEJN4pXO7YO8UmcS458VbEomKLfTuq6lkY6ePyU6oXNgY1g6AYwopZAIeaTxOwT3FUDmy4qE2Vsfw1k3QfYsZkFO7ySCCu5H7EcqUTzxzxnfdLyWySejJV1jZocO+L/BR+pDQTgrLUSmNxHNskT5DJsoxho7vZkp5cEbp3pmveMgpjihlDgQCVIbYXObjG67IkhbSTOjGHBeK2oMgOOiJWvPRu6GUcz2F/KS0JZx52SETXkDdKqOqEUgwUmlYSeUAglfIaOQSjIPyXHHaOon9muuAASppabgxzd8HZVpb6eRsYLdipLaKiRoAdlIzqa5GYz9Cu+Menvo67NroW4pqk5OPByrYnfdbEato477ZKmklGXYyw+Th0Wvk0LoZnxvBDmkgg+C2MSfVDT7oWujqWzEHnpnKyxyPaf3r1FSukwOU7nCfbVp0TSckhBkPSM7Ej0KYnOMVtkIxcnwI7bRyVUrWEODXdTj/AGypvZuHXvzRI2oAc3pzt2Pp/wBRwnPT2mYaQs56mKPmBJjqWdcfqyp3ZKSngnZJHjkcC2RucxyD5b/rz6LDyMvXuGrTQn7xBmcK3O5oQSwPOebGA0jPj19CPBX9wXttNZLXHbJYwxwySHnJB9Vms1rpbjFB3UrBJj4g04bKPLfOPDzT5DeobEx7KaFne/UPfddunXoR/tledtz52LoNevFjB9RJ5aWK2TR1AaWO6uY0glg/pDzHp6pDcdWCB8klLikJHKWx7Nkz+xQW+a7kNTh0jg1vj1LfT5eqbW3KWqbzPI5ScZwcfYlG5PmYwuntAfbnqpsz3umD+cHcg7n5/d1yoHd3TzVPeNLS1x+F+PremFku2q4IHuBGHA4O4J2TJJquOrjcyMOc7IzjcOx9nVNVRmuYx4KZyi+Gz3cmTFw+MfB8XIdhnx6JPW174WbRc2RgkjcfvCUUVJVVEoPKZGZ6N8v2hPhtMdNTtlnDnEZDW4+Meh81c5qOk+StRcttcFV3W8ve7IaWkbOJ6lMNYXGRr3FzoznDht9hVn3KwRXYvaIhG855JAOqbotAvIIeHAgfE13T5rSryKor4CM6ZyZBo3vbGzumucD0CcqO71dG088nID+a0ftKkNzoYaGMMwPhHhucqF3evYGOjHK1vmBhyuTV3Gitp187Om/seLu66Hi41xyIvojG2Ovvv7l0gXMP2KcwlPGUA8wH0Nv/AP7y6eLfx4KFSijHvk52OTBCEJgoBCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgDml7Zjn//AIP8riG/545hnAP+4lzptlSeRrmu29Rufs8F0b9skzmbwiIGXf54A+33Jc1I4poGOcAeZ2wDejR5LFyUnNo1KOIJkkjvUcb+XlyTtkjc/uX100c/M9roxjx8kx0zDMXcwLGNG5Pl5rPHTknle0iNv1MbZP7lnutLsOKTYseynwJQTIQSCXnDR648V8+lacFrGgPdnoNmpM6nlI2eCxu7pP6PoB4pHV0HfDMTTG7Jww4HN6n9ykop92Rba7IfGVwJ5ycxk9ScD7B1KW09dTRvy1zQScAj4t/VQMT/ABOZI9wA253Hf7AskdS6kmaGuBjd1Ltw7x6eCnLH36kFaWN9LCIFz5fhbt3vN8bl6dcadzHF7DyOGRIevyHjlQtlSGAOme57JOhI3afTKcaeu5JHNc/mi5Ojznm+WPFLOnRep7HOetpXgNZGc9AD1KxiBr3gyuyfzQ3bHpnwWBoik+GIhmWgtc/p+/KyR1EUMrYciaUkcx8BhHZaRzW+59kg7xxJgbETtloy5vqQkFRSmUd4QHnHK5o3Dh5hO9PUQ1AeWuewNH1vH7/9ilcUUb4w5rMM6nA6nbceq4p9JLo2VzeNNzVUQEQ5WNGSTtkeCjNbbTQHuZPrnfBGMK8uWnbHzFo+H4iHDoR6efj6JhuVjttylOafmkduZG5TlOZrv2KJ0fBlKytIGHD4fAhYhGQQRuCrhboe2Rtexrch3qSM/sSOXQFNGXd0A1wJDc9T+/on451fYVljTfJA4GtYwY222Q9zs/CSVOHaKhiIez45P6PUMP8AiUhqNDuiPK2QF2fiH9EKayq36lDomvQizZZBuSUrglkdgdEvm01VxySOEeWfmgdT9iRz0NdStAMJd/ZGcK1WQl2ZU4SXdH10LZN3PwUme0RuwDle3Wq5cneGneGk/aFmpbTWSSDMRjOcZcMKXXHXcj0v4Ga3QPleObmYw+ONypPTUUUEYOSSTkOLdx88dQiy2CdriKhg5R+c84KlVPSUzB3YY2RwHiOizrbknwOV1t9xkNtJHeNxkeW+R6LJTVzYI3RuiAycYIUmEcTI8StZABvttssUtLTyzAmDIY3m5jtt5+qWjla7ouePvsyKyWltTIZohy4O+RtlZ20Ze1uIhzN2JBwFK46WmcObLclu7GnOB6jy+S9CxOkY6RmHAg4cPH0x0+RVbzFvksWKyOt/Ix75w385o2Xht8bTsIDiHDxI6p5nsDxE2N5EERGXc5w4eqxR2igml5WHvpgOnTJ9Fz8QmuTvkNdhlqqysrsxwMdz4+WU0M4ePrnGqqWd1I5++2QT6+SsqitELHwsGA8jID9sH5ef3fJOUVvDsGRrG8pId3mDj0IzjHqFU8tw4jwWrG37xXdp4dUsneGNr2R5IfzYa7Ppnp/tupPaNIW22QsexveBoLe9cAN/EZ890613MQQYzJGGHLmnYA+Wd3D0SCtqWsZzkiQtbgMaMgjPUdd/mlZXWW+oxGuFfOhfLZmVVOOV8cTuXG5HK4f0gPl1CU2z3K2iNm0vLuC3AA/6kzRtlrS14Li/rGXEDI/sjoOnqssdlqRIZZi1rS3mcD+0BKtekmXr4pEppNTMi5u6YI8jDmt+qf3FJrhXTzYdzgR4zjONvI56qLVdzhtzCwflJB9RzsZPoovdNbTPb3bnkBufg6ELkMZze4olK5RWpE3uF/pqUt5sSSBuMn/FRa6a5kBfyyfC7YsPVqhdVfKm5vbEwmR3hjr9qd7JpR1ViWreX5IzgZx81oxxIVLqtE3kTm9QPVNUVF9rWCNhlJGAXH9ysXS2iJgGSyswzPK9uMEH1XvT9HQadZG98LQ/flIPX5hSmHUorARG9rAD9V24ISmRfL3a1wM01Je1N8iS56auNMGCmYWNaduTr9uEhbDXxuDZMucDg8w3CcpteQ0P5JrgA0dD1ym2HUvv1QZM5A3Lh1SkPNa9qIzLy9+yxdC54Y5ssIac9SPFK6WOKpa9soLB8uibXXQ1/wALsN9U50HPFEWOcdxlrvBRafqTi16EB1TYR74S1zTGfF371X160qwvMjpCCepG6ty7WWpqpXtYSObqMKK1ui6+F4c9xDPHm3WvRd0Je0Zl1W3wjev2MFtZQN4wFhyH/Q+/y9+/eumK50eyHhMEvFppaAALRggYz/u1dF16rGl11KT++Tz966bGgQhCZKAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIAEIQgAQhCABCEIA5ze19EZPCXvDgf52H/ALkud8NDBPlrJA0DpkBCF5zMbV0v0+ht4y/tL79TxV2Sdu8ZaYmnJPXm9Smyso6oB7RG5zB1AGChCRrtk3pjUoLQjZOYOQMlL2tdkl3h8l6by1wcYHd2OrjzcvMhCeaSXUKp74E9XSwPhEgdzO5ck04GP19U2zTspY29yAS/6wJ5j80IV1XPDKp9wpbqXGQTFzGuPxtOUuinjYxsb8903eOTOHD5oQpzik+DkZMcKWtNTAW7xHm2YSRn1z80sjiZDEQCHPAAcS4gAdf9ihCSmtdhiL2tn2S5mKRuWtkLcFshOAvH8InsqC+SQvfk8nI34R+8/sQhdjXGXcjKbR8kv0ndt2DSSQGc3TbbmPqVh+lnd6GVEhJG+cHPy8x890IQq4nXJmOLUEsNS5skhMZGGPc3Bx5HzS6K8PmqS0nkj6hz/ibnxBPkhCnKuOt6OKT2OkVRzBggf3ZdvJG0/FnPVpB3CXOYxs7TJNGAQOVjuoOPE+KEJCa09IYXPcxzy0PeO5nzyFgGXhux8j9qTS+7gvETwwM+sQMk/b80IXUtIjvbPE7JJWtDWt7142Ld/vKTsifDiR8rCC3ZuBzt8/2IQhSZxxXc8tucr5PihMVK0Ad4Rnm/eVnjqTFEGCpbE57uZgZk8o8OY+qEK1pENieatPKwyAyOB5JGYBydt/1L19Kyskfl/eTRO5o+bwb5bIQjpTO7aEtJcpWXJs7zyRudkbYz5j7E8fwkndUAQDvXfmyeY8sdPRCF2yuL5aCMmuEzFFUTV8r2zynkzkxud8TCOpHqlJkhhGHTOD5Tyks25wOmPL1+SEKtrXCLEfX6gdSzhrDhgOMnfPr819qL/NO7u4+Vgd8ZecO+L18/mhC50R1s51y7Clt2d7iBHK1pJ5hgkDb9gSeja8zslMjIajJIEgzzD7OnTqhCq6UtpFqbemxwn1DFRuAPJHLgFzdsO9WuG4UYu2tap8z4mucYD4jqD5/9YQhTpphLujllkl2ZHaq71VSxzsjHmTumCdz6icMfk5OOZCFr1JLsjPm2+5ONN2SGmawF2ZHHJc4dR6KTsmba5u/nlZG0HaJgGXfMoQsmbc56kaEEow2hBV32WvmHLuwk4A2AS6jJhcHRTZyfiBQhRlFRWkdi3J7YrntEdyd3rn4d47pZSUcVA0FrsDxQhLOT930GEkvaFBqIYCZGkHPVqI9Qx5DMkevkhClGEZdwc2uxJbJXRTEcz+b0JT5V2iK4Q7y4Hl0QhZ9q6ZcDdb6lybmezGskdnfxL5P9L9GZ+z3v963oQhe38MbliQb+f1Z5XOSWRJL5fRAhCFpiAIQhAAhCEACEIQAIQhAAhCEAf//Z","1710937053"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AzFdv1Uf9hYAYGR/nDjpuWViwY6oujHVSjOHfnVPnW0a"},"signature":"DJZ1UoD7Pnl4+pAwB4yztqDwAYdHF90X65IomeF4awAnOmQsD2MsSvStXkS9w4EzBN4LCuRV5HBpTjj3u9TCzg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000001"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AzFdv1Uf9hYAYGR/nDjpuWViwY6oujHVSjOHfnVPnW0a"},"signature":"Anz5YhNWECBscGy3Sk5N5297JtPZ5LvwrQtZY+wpSDtshMvTVVqxS+aEyBCcK3MWssj3Q2QT8U75N/G0ZJD71Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","send":"","pkg_path":"gno.land/r/demo/memeland","func":"PostMeme","args":["data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4gHYSUNDX1BST0ZJTEUAAQEAAAHIAAAAAAQwAABtbnRyUkdCIFhZWiAH4AABAAEAAAAAAABhY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlkZXNjAAAA8AAAACRyWFlaAAABFAAAABRnWFlaAAABKAAAABRiWFlaAAABPAAAABR3dHB0AAABUAAAABRyVFJDAAABZAAAAChnVFJDAAABZAAAAChiVFJDAAABZAAAAChjcHJ0AAABjAAAADxtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAHMAUgBHAEJYWVogAAAAAAAAb6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9YWVogAAAAAAAA9tYAAQAAAADTLXBhcmEAAAAAAAQAAAACZmYAAPKnAAANWQAAE9AAAApbAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAACAAAAAcAEcAbwBvAGcAbABlACAASQBuAGMALgAgADIAMAAxADb/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAJYAlgDASIAAhEBAxEB/8QAHQABAAIDAQEBAQAAAAAAAAAAAAUGBAcIAwIBCf/EAGUQAAEDAwMCAwUEBQUICwwGCwEAAgMEBREGEiEHMRNBUQgJFCJhMnGB1BUZI5GVFjNCVqEXJFJXdoWxtDQ4RmJydZSWssHEJSY2N0RHhqSztdHhKDlDc3eCKVNVZWZnhKPD8PH/xAAaAQEAAwEBAQAAAAAAAAAAAAAAAgMEAQUG/8QAJhEBAQACAgICAgIDAQEAAAAAAAECEQMhEjFBUQQTIjIUQmEjUv/aAAwDAQACEQMRAD8A/qmiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiDj1nvL9LSfZ6RdWXfdZKP84vX9ZNpv/E91b/gdJ+cXOdvue5jcHlTMVzPqjm28/wBZNpv/ABPdW/4HSfnF4y+8z0nAcSdJOrDD9bJR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iICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiD/9k=","1710937209"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AzFdv1Uf9hYAYGR/nDjpuWViwY6oujHVSjOHfnVPnW0a"},"signature":"zzj3/usP54GdWJlV6qXdcgAFPLHWIkFTwVM5L/yaCRRkupa6v+czV6Is04Xhp3Agx+4Rnr+yZ96mM3zkrAMaUw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000002"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AzFdv1Uf9hYAYGR/nDjpuWViwY6oujHVSjOHfnVPnW0a"},"signature":"4SKwjmAuNw4pQq77BTUIS81YTfrqGDzdWKHh1RwDBtRI2+puTlCYw4ODezEmJoMyPm3fRkVhvb1GfPfEaXTewA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000001"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyaNg+hBb1kUTyhx23vyBeg6wyIXhtmXXtOwDG5fOJB3"},"signature":"VoIFzzkvg7ypcznuTdCPBuA0sK1EVQphW2ZBn0wFeHYkLs0qTul7Gp7Prqnuy86M8oVY2/aPZyLP5BGxoc2tNw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000002"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyaNg+hBb1kUTyhx23vyBeg6wyIXhtmXXtOwDG5fOJB3"},"signature":"k2F6X6oE/otVrF0chew3Im3bk1fQAcAjj5P7Cicc5rU8Nj3YejowAXXRTid3iPCKd/LTeB5Xizqqn/p/QbTLwQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp","send":"","pkg_path":"gno.land/r/demo/memeland","func":"PostMeme","args":["data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4gHYSUNDX1BST0ZJTEUAAQEAAAHIAAAAAAQwAABtbnRyUkdCIFhZWiAH4AABAAEAAAAAAABhY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlkZXNjAAAA8AAAACRyWFlaAAABFAAAABRnWFlaAAABKAAAABRiWFlaAAABPAAAABR3dHB0AAABUAAAABRyVFJDAAABZAAAAChnVFJDAAABZAAAAChiVFJDAAABZAAAAChjcHJ0AAABjAAAADxtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAHMAUgBHAEJYWVogAAAAAAAAb6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9YWVogAAAAAAAA9tYAAQAAAADTLXBhcmEAAAAAAAQAAAACZmYAAPKnAAANWQAAE9AAAApbAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAACAAAAAcAEcAbwBvAGcAbABlACAASQBuAGMALgAgADIAMAAxADb/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAJYAlgDASIAAhEBAxEB/8QAHQABAAAHAQEAAAAAAAAAAAAAAAIDBAUGBwgBCf/EAGcQAAIBAwIDBwIDBAYEBwoBHQECAwAEEQUGBxIhCBMiMUFRYTJxFEKBCSNSkRUzobHB0RYkYtIXGENytOHwGSUmNTiCkrKz8TR1dqKjwicoN0VTVFVjc3eEk5XD0zZEVmaDhZSk4//EABsBAQACAwEBAAAAAAAAAAAAAAADBAECBQYH/8QALhEAAgIBBAEEAgICAgIDAAAAAAECAxEEEiExEwUiMkEzURQjFUJhcUNSU5Gh/9oADAMBAAIRAxEAPwD6p0pSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgFKUoBSlKAUpSgF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","1710937316"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyaNg+hBb1kUTyhx23vyBeg6wyIXhtmXXtOwDG5fOJB3"},"signature":"Xw7Mv12Ig8JyIOskuuBTllphxdsQG4fXE5VjqYKg/+sYcNlIdZDrhzPIzH3RG03jY4avdvGNu3afzwFYKgEJyw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"CUgxY4IrtKJ3DbIWuHXqxMdKMMMCTVmiSgJDe8r53IQg06/9fGQtrr0GPQnGgA6YbvzKfouYjHbxZVN5lzOOkQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"+wa5gibxUu3B3jH9WpK7r/vvCgVO8J2yuK8fHA1fFiVFnwC0naF22TPNTyIv/gR1kQ3hxkO91NzNqRJ3U4lrMw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/staging/memeland/v2","func":"Upvote","args":["0000001"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"8ocyo2yRsJBXGUcbrLcgBUX1RO719snpvbZ5tr0Q5WhiIc+wzRpYQuJuHDldnffS3b+pEFG8yenwqgg1ii+etA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qqvEVEIExtQxRVcS8Ir9j7qicMbeJNqF8WCPoGAT9OlZy03mC8yMUznUlGJ2/ESkPmhDnSSiSqJS6BzqSqG59w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"n6NOiT1dpELNWiFE0Mp28dC3wXpUSpeehmqNvvIW/UY/DhhraQg/SL5z7Xvy7gXpCxD9UFTKbpVWH9aFPajfBg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Dg2OP464L16Lf8PZPvYsXA8BjfHJ879aXFW8uBsgrQZDxRbHvFb86rbLTOrzJbBP+7u4HhVivxjKsoRfWsGA1Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"iu5euPrL1aoYVt4lmiIRB4b1Yk4DvWyRtavJ+HAK2UpFux8aDcWbXi/fxSPYK32z71AkddbxbMklNc9nsITu/Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"wP/f7ffYvlBUDB69R7tnvf2cmioPFIE3lhxubHFm0Wosjnp0mPZB0CPhFRoi5wenWma1I8orYJp4lWfk4HCbUQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000003"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AzFdv1Uf9hYAYGR/nDjpuWViwY6oujHVSjOHfnVPnW0a"},"signature":"EUZHJCWryZMxikScV451yrx9+X/KL1/SzFBWzrpLub8y4Ks/I/dUdhndSK0tOsMB2hGnkK7oMJt0zrRgz2QUww=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000002"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyaNg+hBb1kUTyhx23vyBeg6wyIXhtmXXtOwDG5fOJB3"},"signature":"5rue9nlxKys8PiBclrzO4/GlSwufJgG5pmLCTkUxhOYFmluebgYwpRRoKr5yGUMy7/UIlxnQDG/tv5FXc3+XuQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp","send":"","pkg_path":"gno.land/r/demo/memeland","func":"PostMeme","args":["data:image/jpeg;base64,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","1710937674"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyaNg+hBb1kUTyhx23vyBeg6wyIXhtmXXtOwDG5fOJB3"},"signature":"yyGVHe7DdVuFttxp3afry1Qplp0CD7cvabS2364/zNJdU/sBPUdo/V66+WX9B/fteJ4cl7sTKFcwYO/p/TGFLQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000004"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AzFdv1Uf9hYAYGR/nDjpuWViwY6oujHVSjOHfnVPnW0a"},"signature":"jLdp6GhId83NO3hXNWGkccA5y3lChGcZfT6ieMHu3UlvN+XCAHDGCiqFvxGkdcWBKfjZK2fM9coZSaSJxZnHaQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000003"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AzFdv1Uf9hYAYGR/nDjpuWViwY6oujHVSjOHfnVPnW0a"},"signature":"8HJQJ+BNxiAZNKLArgnOGHWQkjgSZ9Nla3Zy4W11lpVOQdttmElDZQfCt6DYp0OGcrqKLD82cz4coisDiYMuQw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp","send":"","pkg_path":"gno.land/r/demo/memeland","func":"PostMeme","args":["data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4gHYSUNDX1BST0ZJTEUAAQEAAAHIAAAAAAQwAABtbnRyUkdCIFhZWiAH4AABAAEAAAAAAABhY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlkZXNjAAAA8AAAACRyWFlaAAABFAAAABRnWFlaAAABKAAAABRiWFlaAAABPAAAABR3dHB0AAABUAAAABRyVFJDAAABZAAAAChnVFJDAAABZAAAAChiVFJDAAABZAAAAChjcHJ0AAABjAAAADxtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAHMAUgBHAEJYWVogAAAAAAAAb6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9YWVogAAAAAAAA9tYAAQAAAADTLXBhcmEAAAAAAAQAAAACZmYAAPKnAAANWQAAE9AAAApbAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAACAAAAAcAEcAbwBvAGcAbABlACAASQBuAGMALgAgADIAMAAxADb/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAJYAlgDASIAAhEBAxEB/8QAHQABAAAHAQEAAAAAAAAAAAAAAAECAwQFBgcICf/EAFgQAAEDAwMCAwQGBgUGCwcCBwEAAgMEBREGEiEHMRNBURQiYXEIFzKBkdIVFlaVodEjQlKUsTVGc5KTwRgkMzQ2Q0RTVWKERVRydYKD4Ql0JSdjZIWisv/EABsBAQADAQEBAQAAAAAAAAAAAAABAgMEBQYH/8QAMBEBAQACAQMDAwQBAwQDAAAAAAECEQMSITEEE1EFQaEUFUJSIgYyQxYjYXFTYpH/2gAMAwEAAhEDEQA/APqmiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIiAiIgIiICIodkEUREBERAREQEREBERAREQEREBERAREQEREBFDOFFAREQEREBERAREQEREBERAREQEUFFAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQERUKuoFNTvefIJ5FCuubKTLcbpP7PosVLdamQ53lg9G8LT+peparTGhb7eaXaaulpnSxl/IDvI48+Suc6c6Yal1FYqC6VfUjUMNRWQtnfHTStZGwuGcNGOAFvMZJ3ZW13WK6VMRGX7h6O5WVoboyqw12GSenkV5i1bpnUvTm56aq4dcX67x1VzippqerlDo3NPfIAH8V31ji0hwOHA5BCXGfYlbcoq2oaj2mmY/z7FXHosGpkJnnHmuEdP+td81R9JvqHoCsjpGWSwUENTTSMYRKXPLc7jnke8VuVq+kJ02vWrRpih1paKq/mQwtoo6gFzng42g9i7PkCg6KmVo/UDrVobpXJTx6s1RbrHPON0UNVLiRw7Z2jJx8cYXM/pO/SOf06+jjXdRtA11sve2op4qeoz40Dw+UMcPdPcZ+4prY9CZHqi5vovr3oXWt1p7Bb9WWmt1IYQ+W3U84L9+3LwPXHPAORhcm6d/S+trNedT7V1Bvln09bdP3s262Pld4b5mDOcjkuI4yQFOh6hymQvOX0mPpJ1PTDSugb/pOsttwtd/vVPRy1kp8SL2d5G5zXA4HBPK6hovrhoPqDX1VBp7Vdru9fSMLp6emnBewDuceYHqMqNDfcplcvrfpOdKre2B1TryywiaV0DA6oGS9p2uGPLB4yeF0qkqoa6liqKaVk1PK0Pjljdua5pGQQfMIKyLV67qfpO23j9FVWobdBcd2z2eSoaHA+h9CrvUms7Ho+niqL3daW2QynbG+okDdx+Hqmhncpkeq5xoDqWdaay1nRx1FJPZbT7I6kqqc5D2yxvc4udnHBb/isL1G6+We02ETaXvVs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je/8lVX+jKTzpF7K9FUsrKWOdgIZI0OAd3VdY7T/APkaj/0Y/wAFkUIIiIlpnUnphYOqVldbL5SCVoOYahmBLC7+0wkH8Ox815Pv/wD+n3eqe4F1g1XTTUbjjbWtfDJGM/1S0OGfwXuA5yfRRHIVuqyaRjvG9U7OA9MPosU2kXUUt4u8ly9mjaxtHE3bEQ3sHO7uH4feu+xxtZG1rQGtAwABgAKIHKmUXK1Exk7oDsooihYREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBWN7/yVVf6Mq+VjegTa6kDJOw8BMfMRfCTT/wDkaj/0Y/wWRWPsLS2z0gIIIYMg/JZBTfJBERQlLuGcI4rEX7UNPYacyS+/IfsRAjLlqP1gV1VM7YyOna0E4PvK+PHll3jmz5+Pjure7ozeygfktRoNZOJgZVRjErg0yMOMceYW1xvbIxr2uBa4ZBCjLG4+WmGePJNyqg7KKgOyiqtRERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQQwFpPUPqtZenL6WnrvHq7jW59moKOMyTS488eQz5rKa203Wapsr6GivdbYJjI14rKHHiADORz5HK4ZV6Xu/RPqZSasvVXdtc2eahdSSV74RJPRP3ZHut/qn4KZNq22OsaC6v2TqBWVNBSMq7fdKVofLQV8BikaCcZAPcfELfW9gvM7bPduvHU86ksdRdtGWWhojSMurIRHNVuLskBrvIfH0XcdDaXr9JWh1JXagrtRzOeX+1V+N4B/q+75JlJPCJbfLZz6KQnA+SmHYHzUu3OfioT8vOvU7qHBbLtX1NbI5rIpjDCzvkDyA+eV4U6gay1D1t6sXemfq+4WCx0NQIKOmpnhjBtYMuPqS4n+C9T/AEnreLLqqKKaPbFI980TyeHZIP8ANeH9fVrbRr64QUAkbTVrI3mWJheGSk5cePUAferep5MpjJg5/p/pcM+W5cnm7fQ3obcK+bp/boLpeJb7PS1Lqc3Cbh8jR2zjzbnH3LvuibgKmikgHaBwx72cA5/kV5u+jxHNQ9OreaqoEz6jNSzG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","1710943031"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyaNg+hBb1kUTyhx23vyBeg6wyIXhtmXXtOwDG5fOJB3"},"signature":"vFJr7fQJfroQ5Ti93sAcasj/CHqkLGitP7S3XolYVPYGqdEHlZ9F+UqZ5E7yeYRGorYLqV8xZ6F/VjKyh5JewA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000005"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyaNg+hBb1kUTyhx23vyBeg6wyIXhtmXXtOwDG5fOJB3"},"signature":"Imo1yq+4YFvY9oqPVr3pNZaA+LrEe+pjKUn8RDNL1q0cGITxUuk0bZrdIb95aw/aAxT8Jm1x+l9/RdYDIf6UoA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/memeland","func":"PostMeme","args":["data:image/jpeg;base64,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","1710944473"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"Qx/SdtIt5SJkj0c122wB/55lKf9L0mewGd0xB1QzVl8JI1UhrOw8zVqQ6nLq3hUeQXF910ogGOpHEXa7j3xblg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000006"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"KoRXSwX3BMH0AQloVKUXjSn9TcP5EzE88gqm+kKvt4xnb7kuMH43GRWteFCfjZxq0w13boKs2+gbMIBoPeoB+Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000005"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"wj19p3V5XWbMkNlxeDJK7YE5as+FmLVM/VHnrBEbymo7not3pgjumJ2TcVk4+799Qr/2W93wK2HZjXO7jHJ1OQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1t8m7k6cud8fhexs3ttslh3l3uul8upk9j7y2c3","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"95XahMTdvTp2eg1HxR4NSJNCx7wke8hvViHnqwelH6A6vUqQwS8aP31+mkk85iEMQ8hv6iTItAviOgQEz4lbeg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1lq8cn8kftq0q9ttvnnpy9ye043vca70n3akme3","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"YnEWmHBh8x05GrS8Y+9uCwo3tfQ/VP03KN8/qPrJni0DR9qTDjhCE+qo5pabBw7bcgQPYO9+bFWjwXwg2iJfZw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1t8m7k6cud8fhexs3ttslh3l3uul8upk9j7y2c3","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Wvn55XuUOSxW7JFSxYnqzX1JXG+O4j2dP8ouoigLR2Esg2MY5UnGqE6kEYAZSpXS8tX53Eg9RLZsImhcvbsd/Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1t8m7k6cud8fhexs3ttslh3l3uul8upk9j7y2c3","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8S6sgJKk+kBFS7mazuZPGqT3wj6zMC/cO4VirXW7VMok3pv16+Bj4p7KuxNieZ+murE812PSM5vtrbULw23mPw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1t8m7k6cud8fhexs3ttslh3l3uul8upk9j7y2c3","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qtfvJ2ne0tx+DjoVqaEnEvMORgRl63jbc87Vv3Fh/V9iS1klLfBYTd8G1e0CGw5dFaKR9dJ17JwYW2QZJKI0yw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1t8m7k6cud8fhexs3ttslh3l3uul8upk9j7y2c3","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"YZZnUmhHbR+Qt2N+U1fp8pp87UHJdZZFniok6a7uGw9/fc2tuhpm4h6LLcNy1VSvHzXMozOop1IEkjyjFLibOA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1t8m7k6cud8fhexs3ttslh3l3uul8upk9j7y2c3","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"n8Rmh6TFai4YiMeLi5FWKj6nr3/NGCuYLCNlOUvk10kyMknQa6Zr2PRrB+4Cy8ZD8G0qr/EE3w1gh6xLv606BA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1t8m7k6cud8fhexs3ttslh3l3uul8upk9j7y2c3","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5WQqkZMArDenQfJ2Oit8F2UEKgicTm8RuliAnQ3UcQd8C8Yv0qkXrWlzFdGm4mf0dAhSgqG3C5Re8IvvSXY5QQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1t8m7k6cud8fhexs3ttslh3l3uul8upk9j7y2c3","send":"","pkg_path":"gno.land/r/demo/memeland","func":"PostMeme","args":["data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4gHYSUNDX1BST0ZJTEUAAQEAAAHIAAAAAAQwAABtbnRyUkdCIFhZWiAH4AABAAEAAAAAAABhY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlkZXNjAAAA8AAAACRyWFlaAAABFAAAABRnWFlaAAABKAAAABRiWFlaAAABPAAAABR3dHB0AAABUAAAABRyVFJDAAABZAAAAChnVFJDAAABZAAAAChiVFJDAAABZAAAAChjcHJ0AAABjAAAADxtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAHMAUgBHAEJYWVogAAAAAAAAb6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9YWVogAAAAAAAA9tYAAQAAAADTLXBhcmEAAAAAAAQAAAACZmYAAPKnAAANWQAAE9AAAApbAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAACAAAAAcAEcAbwBvAGcAbABlACAASQBuAGMALgAgADIAMAAxADb/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAJYAlgDASIAAhEBAxEB/8QAHQAAAQMFAQAAAAAAAAAAAAAAAAIDCAEEBQYHCf/EAFsQAAECBQMCBAMFBAYECAoIBwECAwAEBQYRBxIhCDETIkFRFGFxCTKBkbEVI0KhFiQzUsHRFxhiciVjc4Oys7ThNDhDU2RmdHWT8SY1NjmCorXwKDdWZZKjpP/EABwBAAEFAQEBAAAAAAAAAAAAAAABAgMEBQYHCP/EAD0RAAIBAwMBBAgEBQQBBQEAAAABAgMEEQUSITEGExZBFBUiUaGi4eIyUmNkQlNhcdEjM0RUQyQ0kbHBcv/aAAwDAQACEQMRAD8A9U4IIIACCCCAAggggAIIIIACCCCAAggggAIIIIACCCCAAggggAIIIIACCCCAAggggAIIIIACCCCAAggggAIIIIACCCCAAggggAIIIIACCCCAAggggAIIIIACCCCAAggggAIIIIACCCCAAggggAIIIIACCCCAAggggAIIIIACCCCAAggggAIIIIACCCCAAggggAIIIIACCCCAAggggAIIIIACCCCAAggggAIIIIACCCCAAggggAIIIIACCCCAAggggAIIIIACCCCAAggggAIIIIACCCCAAggggAIIIIACCCCAAggggAIIIIACCCCAAggggAIIIIACCCCAAggggAIIIIACCCCAAggggAIIIIACCCCAAggggAIIIIACCCCAAggggAIIIIACCCCAAggggAIIIIACCCCAAggggAIIIIACCCCAAggggAIIIIACCCCAAggggAIIIIACCCCAAggggAIIIIACCCCAAggggAIIIIACCCCAAggggAIIIIACCCCAAggggAIIIIACCCCAAggggAIIIIACCCCAAggggAIIIIACCCCAAggggAIIIIACCCCAAggggAIIIIACCCCAAggggAIIIIACCCCAAggggAII8vprh50Dt4iv1hA8yR849WXYTKz6T8n3HJev/wBL4/Q9RII8tVd4B3g8Cc49J+T7iPxD+l830PUqCPLQ8mFxN4B/dfJ9weIf0vm+h6kQR5bwQeAP3XyfcHiH9L5voepEEeW8EHgD918n3B4h/S+b6HqRBHlvBB4A/dfJ9weIf0vm+h6kQR5bwQeAP3XyfcHiH9L5voepEEeW8EHgD918n3B4h/S+b6HqRBHlvBB4A/dfJ9weIf0vm+h6kQR5bwQeAP3XyfcHiH9L4/Q9SII8t4IPAH7r5PuDxD+l8foepEEeW8EHgD918n3B4h/S+P0PUiCPLeCDwB+6+T7g8Q/pfH6HqRBHlvBB4A/dfJ9weIf0vj9D1Igjy3gg8Afuvk+4PEP6Xx+h6kQR5bwQeAP3XyfcHiH9L4/Q9SII8t4IPAH7r5PuDxD+l8foepEEeW8EHgD918n3B4h/S+P0PUiCPLeCDwB+6+T7g8Q/pfH6HqRBHlvBB4A/dfJ9weIf0vj9D1Igjy3gg8Afuvk+4PEP6Xx+h6kQR5bwQeAP3XyfcHiH9L4/Q9SII8t4IR9gcf8AK+T7g8Q/pfH6HqRBHlw2CAr5QpeYi8C/ufk+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EaR54EEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEABBBBAAQQQQAEEEEAH/2Q==","1710945385"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnfXU2lgviH+qJrG7JVe7CkTJlQohTS5wpX601bRF6SR"},"signature":"Gy8HLO1LSVJp+REP9Rl1yFJ65pSePKn/ZEgW6Xb7rP1Ii4IrDIhujt5y+MZ7eAOwckNK6GJfHY7snQkFnww0Pg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g14yr553ykn7lw7ex6lr6uafek2gaedvlyq0d68r","send":"","pkg_path":"gno.land/r/demo/postit","func":"UpdateBio","args":["heloo i m gojo"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgPsmZMaFRMRHVL9X/yEgdJbrN4niUjZUFA1wDsYu1XQ"},"signature":"w1uKFD17f7d2R5PPT3sqaB2M6LIZMGSKmJYkEAM39mVNQFAGNNWL/8AacjKO4q2aEoLM90aJgg9vzSx4KmQOpg=="}],"memo":"setAvatar"} +{"msg":[{"@type":"/vm.m_call","caller":"g14yr553ykn7lw7ex6lr6uafek2gaedvlyq0d68r","send":"","pkg_path":"gno.land/r/demo/postit","func":"UpdateBio","args":["heloo i m gojo"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgPsmZMaFRMRHVL9X/yEgdJbrN4niUjZUFA1wDsYu1XQ"},"signature":"rVRRQWCq4LhMrjV269TgNqHklg3SGOn8Ux//y3R2JXs8TwKPc3SYbhDInh6PSLkFn9wM+ORsRCPz/HrfNnxngQ=="}],"memo":"setAvatar"} +{"msg":[{"@type":"/vm.m_call","caller":"g14yr553ykn7lw7ex6lr6uafek2gaedvlyq0d68r","send":"","pkg_path":"gno.land/r/demo/postit","func":"UpdateBio","args":["gojo"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgPsmZMaFRMRHVL9X/yEgdJbrN4niUjZUFA1wDsYu1XQ"},"signature":"U//MhY1a8XWfqLmENPJesMlLoj9RMjw1tIdtOJHdeS9snU56dP9mmkzXhC88OtItpBCZWgUeiK9Te6pH0+ZY9A=="}],"memo":"setAvatar"} +{"msg":[{"@type":"/vm.m_call","caller":"g1t8m7k6cud8fhexs3ttslh3l3uul8upk9j7y2c3","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000007"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnfXU2lgviH+qJrG7JVe7CkTJlQohTS5wpX601bRF6SR"},"signature":"rBhW6bLoTEHmOOA7v+z4Pf6+RB2lMbKYfsOstd2FSZhc/Ji3NqBuCDIh/nZxYQo8NXcBA/lESJBR7GKulCXTTA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1t8m7k6cud8fhexs3ttslh3l3uul8upk9j7y2c3","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000006"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnfXU2lgviH+qJrG7JVe7CkTJlQohTS5wpX601bRF6SR"},"signature":"6GIW+7XnUlWn6FAGKdfU6D/QNfmuKVGLBViJJfDZTDNI5qAiTZ19hdtfuoa1vm3NJMQ+Cvgdf5QubD2da3sG7Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g14yr553ykn7lw7ex6lr6uafek2gaedvlyq0d68r","send":"","pkg_path":"gno.land/r/demo/postit","func":"UpdateBio","args":["updated"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgPsmZMaFRMRHVL9X/yEgdJbrN4niUjZUFA1wDsYu1XQ"},"signature":"DhhfYFHubELHaq6V5NV/k9Ytyu8sxKzElCueUCYsjlIsH9M2+ajgL2JSdDfQybMIA86a8SeF5T2UftMtHM/2Hg=="}],"memo":"setAvatar"} +{"msg":[{"@type":"/vm.m_call","caller":"g14yr553ykn7lw7ex6lr6uafek2gaedvlyq0d68r","send":"","pkg_path":"gno.land/r/demo/postit","func":"UpdateBio","args":["updated"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgPsmZMaFRMRHVL9X/yEgdJbrN4niUjZUFA1wDsYu1XQ"},"signature":"8Tewk18MyT4TEm4+ZyKqWWZSuSPUYkM+irA6UZ7Ud056Dv9e+le1LUXtRy3eh/WlzYE27DhZ41Zj5GVd8/Dx7w=="}],"memo":"setAvatar"} +{"msg":[{"@type":"/vm.m_call","caller":"g14yr553ykn7lw7ex6lr6uafek2gaedvlyq0d68r","send":"","pkg_path":"gno.land/r/demo/postit","func":"UpdateBio","args":["updated"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgPsmZMaFRMRHVL9X/yEgdJbrN4niUjZUFA1wDsYu1XQ"},"signature":"jYQY96cpQ5Hj75RcHA9xujdPXTyiXgfYHmIxE0Dcm9ga8+oiUfKrFQk2C9t/u2G0EdHxwDJSQvAmmnMHWIf5Rg=="}],"memo":"setAvatar"} +{"msg":[{"@type":"/vm.m_call","caller":"g14yr553ykn7lw7ex6lr6uafek2gaedvlyq0d68r","send":"","pkg_path":"gno.land/r/demo/postit","func":"UpdateBio","args":["updated"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgPsmZMaFRMRHVL9X/yEgdJbrN4niUjZUFA1wDsYu1XQ"},"signature":"/PxODJ+F4rPqD76Nel/eQkDwo5Ad65aEpA6xNojoPEAOa9pIH8wBZvM99v3ebw6jkrTeeaBd+EqnNMLLAKaSsw=="}],"memo":"setAvatar"} +{"msg":[{"@type":"/vm.m_call","caller":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"UpdateBio","args":["Hokage-in-training 🍥 | Shadow Clone Master | Ramen Lover 🍜 zzz"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApW/ppgHadUkxCHXfJ29lc0cqkc7X6A0FaET+6xbvD4t"},"signature":"VZrpOD0lkGMs3b3W3h80KC5jd8IXgf4B4XJrqq5o7gt/dYZiLjSv8xLmrNZJtqoRz8cFDh/0yBIehQvhyT67gA=="}],"memo":"setAvatar"} +{"msg":[{"@type":"/vm.m_call","caller":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"UpdateBio","args":["Hokage-in-training 🍥 | Shadow Clone Master | Ramen Lover 🍜 zzz"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApW/ppgHadUkxCHXfJ29lc0cqkc7X6A0FaET+6xbvD4t"},"signature":"m9Tx6Y1axkzI4Q78JI+qc9zTrnHyFg0MorIXf+tOfDFk8cu8ljGrSBcsfXjif7cA0jLuZtleeysTjoYHJKvdNg=="}],"memo":"setAvatar"} +{"msg":[{"@type":"/vm.m_call","caller":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"UpdateBio","args":["Hokage-in-training 🍥 | Shadow Clone Master | Ramen Lover 🍜 zzz"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApW/ppgHadUkxCHXfJ29lc0cqkc7X6A0FaET+6xbvD4t"},"signature":"359jC+aOgnRJejU9c0Z7ayizdb73L0DetxTgn0IbStgBVSaQXc/dvpP4HeDQZgmdaw22mIYgKk8oec7/BBsTVw=="}],"memo":"setAvatar"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"DhVU1PyZ5m7oEQdwHJVmLG10MFY2eP58os35vYAn7spGmMK4mZOuMOhNlOVvwbcEx5zow3E1qB0l6Gzw5vATIg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"hpufNa521kh66UYN5HOPmV6cRRXskcPeKlqMIU1pM/M2rCwDLW8h/E/6CX93JJhyf/n7HAC8SGWxEx/2JkSddA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"m0yywJeRn6NRSILMqIOfitRjnPsb4WR/bFba+01FlSVw3Ja5Am0nIIJ3LfsaBOcNxdBXBgxg3kNCpJ380qj6Bw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"+PCU49AUUz/Yg7ZrWQD57yXZY/s7hjZAj9JYHFpSveRrNwVyd0rbvV6cPD6jcL2rR+IhuQh9NICa3f6j8IXwIw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"M+VZrDzvNXPz+9wSu5L8G66QKWIJHQEwQMrZWSGoUqBLUmC49gOsjed/0fr9rhOTQf1oTKfeja/0zvIjNLjbBg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rFMjXHVTG4U63F0ys/s3nXv0CIP3X8ZmZhNwlXzQyLEf6BHGB2LaIRqKOXvpZV5tsRdByvJVGevZpPKefa5YTA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"k/e1RbX+M0ixduNTTLCFB/uNJYS8myyDBwkGRQdwJYdT7XwpJQ+2JMNRDT2rGdZpmW7K5UKcHW/BF8VZLd8xfw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"BbdTTjULUK8inz01e+Vduja8EBFMUsj3l8Yu7TlnBVUxvo9Beh0jdYw3MaistIEWg/OX+9xU6g1lHWcQvqhw0g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"hk1kEc5q2OCulSXIfed4xVUj+BbT7qhT9nYgEY2OilJXhBUKou9ETTOKEePh6auGnbWbQOlzG/b7gzPGXFnLTQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"UpdateBio","args":["Hokage-in-training 🍥 | Shadow Clone Master | Ramen Lover 🍜"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApW/ppgHadUkxCHXfJ29lc0cqkc7X6A0FaET+6xbvD4t"},"signature":"N+A/4IEyQh/yv8lFkRXIXcU4ubHbM4tnxSziTlgyQj8LCjQ3fWI6VFRTs3NWGAi9xAgOBO0HL+HsUbxA74prnw=="}],"memo":"setAvatar"} +{"msg":[{"@type":"/vm.m_call","caller":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"LikePost","args":["13"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApW/ppgHadUkxCHXfJ29lc0cqkc7X6A0FaET+6xbvD4t"},"signature":"X7LcWxEXVMT991ZFT/15GiRsGszPKY6kJeOv+4DhywZVjIqAgbD2zaXR4yRVVNJ28AnE3nXqNE10Amjsv6YadQ=="}],"memo":"likePost"} +{"msg":[{"@type":"/vm.m_call","caller":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"LikePost","args":["4"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApW/ppgHadUkxCHXfJ29lc0cqkc7X6A0FaET+6xbvD4t"},"signature":"tBj+3hUjFx9T75RjBeU3GZ6TnoeDDoQAYiWKT3xZP6cy9z4UyMW7+0th0ER78Rvoa/Q8G6Iy+aHCO4b5SCYKyQ=="}],"memo":"likePost"} +{"msg":[{"@type":"/vm.m_call","caller":"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c","send":"","pkg_path":"gno.land/r/demo/memeland","func":"PostMeme","args":["data:image/jpeg;base64,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BBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBABBBBAH//2Q==","1710951355"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyDlf14q7C2aBqar/Qryh6dVR9VACxVZV6fOaM3X5YEA"},"signature":"kvriC7sqgTNaHqURWyTt35+eMcR7mcRvyJCPSMtpRAs6mY6KM14G3GLeD2FC/1W/LkWAFK7hEKr2chSzBkzb0w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"VJaETnux8v4fglYv2c/ZFgM4AlHCBVm3+o7Oqnm1pRBNeKY6WFaEX7OyQzAlaqhwoqcTFyvUkIL9BrMzmYwjEw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1tsvsa6x0xhekmp4yhvuh69x5fd7u7ar3cwzj9y","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"jf3jvXZa0Q3/oOGKV+froWCcO9v9hp1If5zp0ArxKecTCBXBOY3Ysg50zm2MBYA6DV0zGZL0lOA0Ohte+iKUNQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GivYtFati+nv/Iuari5hCtnywaQZbuJyAaoy6+0UQf0uEp/JuNTiMUvhDDNh5aCm/sfyi+Zn2JA7Xm6avEA4ag=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"xwD6AuCWRuBdnc0FUsGDhUi+WPeTZGKjQ2iVSLGxydZIjds9qgWn8YaOBEay4Z2TvCd3s71NTsoGxpTsHzvPAg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"QbQWK5XBE0hj3eY2gntYSMR0rxVyEyOs670GqrqMjSdH3uys4/6A7gVF1heh4EXlT2UjNPffckGtRhJYymiRwQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/memeland","func":"PostMeme","args":["data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4gHYSUNDX1BST0ZJTEUAAQEAAAHIAAAAAAQwAABtbnRyUkdCIFhZWiAH4AABAAEAAAAAAABhY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlkZXNjAAAA8AAAACRyWFlaAAABFAAAABRnWFlaAAABKAAAABRiWFlaAAABPAAAABR3dHB0AAABUAAAABRyVFJDAAABZAAAAChnVFJDAAABZAAAAChiVFJDAAABZAAAAChjcHJ0AAABjAAAADxtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAHMAUgBHAEJYWVogAAAAAAAAb6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9YWVogAAAAAAAA9tYAAQAAAADTLXBhcmEAAAAAAAQAAAACZmYAAPKnAAANWQAAE9AAAApbAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAACAAAAAcAEcAbwBvAGcAbABlACAASQBuAGMALgAgADIAMAAxADb/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAJYAlgDASIAAhEBAxEB/8QAHgABAAAHAQEBAAAAAAAAAAAAAAECAwQFBgcICgn/xABYEAABAwMCBAIHBAUHCQQFDQABAAIDBAURBiEHEjFBE1EIFCIyYXHSF1aBlRUjQpGhFjNDUrHB0QkkJjZGYnJ14SVUovAYNXaCkjQ3OERTY2R0g5SztPH/xAAaAQEAAwEBAQAAAAAAAAAAAAAAAgMEAQUG/8QAJxEBAQACAgICAwACAgMAAAAAAAECEQMhEjEEQRMiUTJhBSMUJEL/2gAMAwEAAhEDEQA/AP1TREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEXzA/azrj75ag/NJ/rT7WdcffLUH5pP9aD6fkXzA/azrj75ag/NJ/rT7WdcffLUH5pP9aD6fkXzA/azrj75ag/NJ/rT7WdcffLUH5pP9aD6fkXzA/azrj75ag/NJ/rT7WdcffLUH5pP9aD6fkXzA/azrj75ag/NJ/rURxY1xn/XLUH5pP8AWu6H0+ovmF+1jW33y1B+aT/UpXcWNcZ21lqDH/NJ/rTQ+nxF8wP2s64++WoPzSf6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zcfvWXfw/wBSzw5FiuQIOSPVX/4Kek4c6hjHiTWK5BoBIaKV5J/gu6ru41y4UYEXjRjlYdiM91hZ2te3AG/Zbde9IauqHN8PT1ybADsxtI/5eSsWcP8AVLocHT1z5vP1R/8Agu+NjtykalM7lYeix3ro6F2CVt9Tw31UH5/k9dC3yFHJ/gsFXcNtVh+WaZu2AP8Aucn+Csk3FO5VrDOx0XMTlwVTmLiMEDKlptC6vYSDpq74Hb1KT/BZ2k0BqqUZdpq6D2e9HJ/gnhTcYvJDAMgnqVBhLg3ldhqzDuHmqmPx/Jy6/wD7ST/BTM4d6q5zjTt1A/8Aykn+Cs10bjHU0hbMGk5BGF58tEht3Eq+U+eVvrBOO25Xp+Lh1qrxGu/k9c/l6o//AAXAtRcKtbU/FS5TRaSvRhe4HxGUEpafx5VGRDL/AEzfELTkeq9EzwYDpYWGRjsb7BeRaiA08ro3bOaSCF7809w31ZVUXhzaaurMs5SHUcgyMfJeWuI3APXNu1dcY6bR19mhMnM10dvlIwfiGrTgz5zVcjRbr9iXEH7kag/LZvpT7E+IP3J1B+WzfSrL7VtJycqeM5BW4ngnxBz/AKkag/LZvpU8fBPiDg/6E6g/LZvpQasfcapVup4K8QOQf6FX/wDLZvpUo4KcQB/sVf8A8tm+lWDTEW6fYrxA+5N//LZvpUDwV4gH/Yq//ls30ro00YIUMhbn9inED7lag/LZvpT7FOIH3Kv/AOWzfSg0zYlRIwty+xTiB9ytQfls30qP2K8QPuVf/wAtm+lBpaLdPsV4gfcq/wD5bN9Kh9ivED7lX/8ALZvpQaYogbLc/sV4gfcq/wD5bN9KfYrxA+5V/wDy2b6UGlnZR2xstzPBXiAf9ir/APls30qH2KcQPuVf/wAtm+lBpiLdPsV4gfcm/wD5bN9KIPpnREWcEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERAREQEREBERB//Z","1710952332"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"pNfK8US4sgJkEBOOlcCuWmGnSg6KZ4/XWYC+CkgyTIYi6bqqhobWNaaANO7aTEHd+OSww+mlF1YZsDKU8rHsuA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000009"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"FP5KpfjlYCKxtxnBf4lum1i3mgfvwfAjO72wUPnm7KROkVxIop3ulhK8/hXWPy7aYrOkBch6xSXDVBPQAUskiQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000002"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"ZcUAARjSdSMD/H0ioLM5mrL5iBwvwoCYtWq0HFnGohAvNEZFpGDf8X19XTEAJcDf9ij7Ra2/lzBbJxBoP9nTYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1t8m7k6cud8fhexs3ttslh3l3uul8upk9j7y2c3","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000002"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnfXU2lgviH+qJrG7JVe7CkTJlQohTS5wpX601bRF6SR"},"signature":"Qmk6Da17TQjG6UUIS0Nizgg5T5S9Or+zmDygGNUBojcwvgXfNG13yeYRANUP4flZWSMAKUSMjN+yfvaWYcFWPA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000009"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyDlf14q7C2aBqar/Qryh6dVR9VACxVZV6fOaM3X5YEA"},"signature":"qHXehVYI1Ao5FkW1NigJwJD2Me/weULlD9Gz0oGTCrgwZWx4Jr4HIHqnTaTpAmgEoDC6wxkFne12sCOo8NFgqw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/memeland","func":"PostMeme","args":["data:image/jpeg;base64,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","1710954233"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"W8Rn/T+yzs/DJCYPO8jcq8YGacuNpXnmVE2Ik2eAOq9j7ivubV6maajJ23duwNUAXZZkg11PilGGWPUvG0S7eA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["000000a"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"notXtjKGBne97aGm1+UW71M5+7cuiRiPFbvHrhOqDhY4B8cZTbzDHcAIAaBkx45vAWYbB7Xte4NMi9Ek51bA6Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000002"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyDlf14q7C2aBqar/Qryh6dVR9VACxVZV6fOaM3X5YEA"},"signature":"gzDRAiQW/4VrYgzfBhcE2KTfA+8Fz76NGRjvCL9a+OkvZPiSfcZasHCiku8EfNAyvrrhGrZfJI9RONyGmg7l5w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0NeGBuVUBlw2sxEyG+glaba9S/Q5f7senua9htqiadNex3XWBOY0bwcMI+iAVlK37x5uj9WmQRCKectCZGdfXQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000009"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AidlxNTtkl1dDNCgxrSNVJKYWZdC9yrixvgSAP6U6WYX"},"signature":"JX3gq0XJlUaE9D+zy1onKN6PY1sYdEgRNQT/FIcOyt9fUeH85uOLr1F1TmiZeU2dUk7eAbtt7ueLbBZmnHfTpw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"HROsjBVafBXmQyA9bKM1MgkhqiQcv2kJQSD28RQPXZs+eQCb+NVdXdSONJaQruRI+tXfCYw++8UL5CW+NCTPVA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000009"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AidlxNTtkl1dDNCgxrSNVJKYWZdC9yrixvgSAP6U6WYX"},"signature":"PBSIcyWW/FdT6YqJKTNmiHq1b56sTDYSzO4GySkUPTNPrdR3+etDUQo3JZzySfzoFx5NSsMYF0D9CyMLEwl91g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"wKI1pjbR+Vu43FPg9JXY5cic9fPmt8x+IFsPQIPUAHoqGo2U0zObLOlQX7njoVIMYDfE1Ex2oq+vvqjLRqgLJw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"pJ92XddYZb1ONCcCDSJEDYd0vjakOPp2oywbxg8w88se4ImzJMV6ThqJkeSfB40apii+N7LtXvnWKVyoCZX6zQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000009"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AidlxNTtkl1dDNCgxrSNVJKYWZdC9yrixvgSAP6U6WYX"},"signature":"S5x2Xg4U2otWY0hPZ/uJtr13HcIAMYA5ptkmBWhS4K9dcIKosiSwncSC5VWKr1LqFx+WXZ1nqYgGzs3WTzSa8Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"36XRRRLYllCW7lPZrIJW4M2JRWffB3e3qwidLFzIIDVRNvhWZ4CpptxcT+UEI96FnfrhR344Jm1iw9lgw5MoTA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ODuFIZ7fzLgzCSz5qCRNElyu+1HJ8xUfXL3X/19+e+clNKo5YhV2nRM+lL27udQMZ11uwCi8/PQRch1ERLPInw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000008"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"40tLlu5b6lHvmEPhdjd7B5edSQwJzErwtRPB7FakjFA2Xaj3cDDzzzAdnsgV2lsf4IKneKwDFrx5JK3UeGgUeg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9hQHkOz38RcK5S6qH3yOzgB9+9xiJNkZdSRXBOs0vnR90+pLp3ZRd3MsHHdM6+/rQT0oTJ6EgrUcxGWp2VQO6g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"pfhZ8BgR9UkqPDUQYdMJKAOkgaUHtw98/b7l7yI8yXQ45a5/vfw6cD8Cbg2yAQF2aSykdYd9T1EpjL8pXPbDTw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"yJlHa+9MoqoYODsIxh8IbB9Q/nGsgul1IJKGkuU2KopVqnKBh56flQNf5eldjnD7q07njck/aMfRlulaftR6Xw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"X+Dg+bjKOEAWbT/buHY7Pojk0mh5qMblxSCrC9ve5+9a9IMlzRojQJc3V8dYvL0tICHhz7EqX1NNjEVZqc62Ww=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"CeAq6ewKY/lHp+bOvfya8+jiQ93Y+EbotD7gSSVk9SZ0SwFH1/qy/xEB1++mpD/fs6jJUevwqOd5vPODRL0z1g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"4gYEmbk7vmdD5CHiT/S8spIGn0/i6rOXSDAA2I7A52V5/OVVMbnh3kLrFwgH2Pukm3sLKQ/jfNVN8/7cyiXJQg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000008"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"ZxY9F4ta1xaWpaTlVgtRDGGm+nYnXMBV9IEWcAD1o7RJo0MSPq3NCTp2CFqzwWgwbBhMCA2sqjn9+AFOnhVmEA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"gmCoLa/t+OatNdiawSYKtff0hswm0Fzam9vWRnquTQdWa1ES3PbQ72QZC0mrImzBb0X4iwd67EybmTL4zxAeMA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"ga5EvWJnHySGmgHWkRko7/hvSOJITa6iUXawmBIEY+wgbmVdXKRXvlrqdwVOyPTbRVNLFH70xnFDu4yMyK9CJg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"592e9pS08IxG7RM5EPHu4NROGoVxffAySiq2bstLaitjSmVT0dP/S5TeIAj+0dgSJhHCvWkMoSZ9CP+njZx65A=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"tIad8eE18ZXIjM6KUF98BXnEWomjPEPGWrx5x/HwrNYpEzG93C4M+zI+GnUC425PL+Isk3UmBJ0yux4sxE8THw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"q5jRHVyYE6ARSCle6XEdECMEOqrnhZ1+EiNnG4IVv25L3xQsC+zFGG+2t5C2+fNgZyXJvuLXdkJ77xAlU97CIA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"TnHZJhOQv9XbRXqvNtCc8QSF1u/eYe4wbpCRHOqkKrp2eYuxpuYZaE0b9n2iuDVfa0QRtEl9bjAAJViuKsHyIA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"l1Df6V0pyhGH4Sk9DKUgEgveAPkbNmqjIbtKIv7Q6u0BiygKNl+B9wcc3lb0w5YUrH0nU9c9w56HOWXlJkOgfQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"RSPz+Lvs3j9P5BzZLlUEY545yjY1VrO5mPZY1EjU5AFzf0z6v+En2tUbnaqZBBNH4u+NbMySaaQT03QRZwJW8A=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"K6Q+2rwSe/qRPuNCJ9IDdq+N0ONYZnYCkML6VOIMra9uqSzaTKdVhv32JThcbIvLboKp2RPBvY261sk59QXCfg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"exbCRGxuGzQvFTRh0b++FcSF0FgHEBnk51xhPPDrvPsP2LM37TR32EiFZffWCEIjEgkRC1vBiWXtRbpcHTH1eg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"jdOr2UFeVNFgVsuiHnrA1vf2gimYJUtHnshUoVGhcZEh5zo/K8V0iSMSMYchIYTDam5BqdpVzNDfEUyEydEDHQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"xYhr3s7+8enuAjI4oppZL1e88OXt+c+Z0DHmSXbyZ7VKUMMOWI69kB6anKeV3kgoLoHkOPZCMdXQj58XEm04Ag=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"yD6c7l/D1f01QzSXcEDRG8hOQSZHGGpD/tKboDBhcYo5jaKfj7Qwq6gBI5O/C2oDlPs+506FRZUOSnoj0RAi2w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"TBCJDmwJQ7xslDUIjhwzvkM1R+X3OMwn0nIk0pGybP84NZvL2MOfEDrsbb+haLPcz9NKTN90veOhQ0gEM7WVhQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fkYBRt/AcnTTXub2CBFx4V44lInTId+e1JDvg1JbKwhTkmg/2KDc+K1ci0cHu6LwRBekWWJg3NEdrh1yPX8Ggw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"hhBeAkpFiLwMGjMww/P4VVWJmqroWvN7VnRJeOYf08RVEJtRGcH003mmR6cADVHtt0GmNEEBItXx2KzCcob4Rg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"pVmJPNNDeO6FjR8rXQbUgLLs7Ebe5c80856Y8sDpcNM+xMLarmGwB/IEi2iUUHFKmKevNssgaZW35e4VuXVTLw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"DxGl74zW/aM1go5C3Sw7ADN2S8FCqdkzrebUIK1RSSUtm/BXY5Dl4kSoNyim3+HnWqmVZScT0qb0ewQGZT6XQQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"Z+9Tk232pydu1Drbk7c46FNIQvCveSa2bjUJteX0Qlt9SJ3AXhxm/zSWgDJXcBxfSpilyoPJJC23gZAw2AtK0g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"8wP8XVWIVudRYrbhjvGZSWnkcutCCJquZ4/JgMJgRfU5mDi1rzGzuRgOrBG1fDMhwNBl2P6J+YfYscXIpq8BkA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"yXzcGUY5bNYbSWU9cs51eiip9Mr6/4hiZ0uNmeWS6TAQh59HoXokg0lqYUJvN9BTbiED9+0vumCKwvdOKwPbRQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Jb1JW4TTWsBWuORwqJeTPggBVLPPecVw9md3O21Ixpg0EXqsAM3nSh1klABE2u4hGvh0c8vZlHY1oBoY4Bg60A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"MkeDqJ0bP+kmsgAacLAIYRHnjozrxBnBQX2SfjdMqFcCIssQ8hbAPuecYnxIHRBC93cqGv8beGRdeajMt9ADDA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"cIZ/VMzUa6Zm0ggD1AgAZcKAVJ4Zob2q6t28CPiisKZ5wAZx65XeavDVcTUU3mKhMdWSnXSyoQrhboWaZXIViw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"msJ/XyBVqEWlYXvwuq3713elCN1eH7Chs6aI8pM2YUBG7mfet7BlyQbhBwAr+32Aehs5E95sQkPnKxI0lnaZpg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"N0oYk/msqqHsWzqhXKN9y+0Nk0PJmAaaBV80NSXTtHwV50nL46dxWlpOES6Mg9mBith1v2bb+4hcwlLGTzcmrA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"xMwtJ44e5tfja51GESo6Gvl5Ok39TPQHHVCrO6HWBllRU+Sfk8AeUkIXKO6sd3uscADgo+z+lYSbizDfwABcXA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000009"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"BMNmL/I4oZRenOroljB7KGBZl0AMOluTigLgI+LGgIhZgJYmKbLHhTgoOIFG97PB0O7H//NmZALKHpRS3atQWA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000002"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"9wM92yW5uqkD0FkeeQTuS5bMwBYeMamH6mRJ66SlEfZB7M7X5BV+AQpkSGdgH7uaPd0wygZcNd2BurI1IfMFcQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1d598tyfatprdstalqutk62cnzpm3thvyy9mypg","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"XKFsEA+VAvA5gnBXG8mMs/NUrjLv4e8D0XYrWoqibnViwtmB+8EY8Tds+MWZ78HslKOwOMZf02xVsfI2iLMhJQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000009"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyaNg+hBb1kUTyhx23vyBeg6wyIXhtmXXtOwDG5fOJB3"},"signature":"7RDMr0Pb7GHfFPEtz1tRoYdJrO1Vlw+wktE8/KZm5sh01uHDOVI6Jv5z3xdj/Q1FQMaColmNekYKACsq0RRlIg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000008"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyaNg+hBb1kUTyhx23vyBeg6wyIXhtmXXtOwDG5fOJB3"},"signature":"q8M8O8Ft4B9iffVvYYQ8HYf2pPzYdZ7/sbUY3aT0Rik/gg7W+sw3Va0+gZdE4w8PeVcIQDHu+AUUgsDSW0YMoA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000008"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AzFdv1Uf9hYAYGR/nDjpuWViwY6oujHVSjOHfnVPnW0a"},"signature":"MLYVdgGLi7CQKxBqJiAkDep6D0wmRNlXAnNcQiaj6Kh3lhSpu83jN/x/1qkKPQlgz6JvO6bz/JmmRMTzIn3tBg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"UHg+W27oCkt8kr+FX1CxnqeM1CiJellZvvTq2CsxkV9f27ZT2BKHN+vzb1IP4YMEghuFJY+Tn+amSA6X1GhZMg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000003"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AzFdv1Uf9hYAYGR/nDjpuWViwY6oujHVSjOHfnVPnW0a"},"signature":"Ool4gYGMUHtgtgZBHMSdry25VgOlx5usB0FNkc4o3UEEzMcYDM+G/RYC9+CELTQcNFNgl5JJqdeULNNpVZrtMg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AlsLfjqkRlqJLxWivHmUWcSU+bKlFTvhUJD8EPUnLys2bJm5kO0JgELMxqJ+OoUstVbZEbwjY237f5y0BRgIOg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GtP/EmBrGEV/sXlNrCaPlIeOYI1mVIQ6B5qgFpP/pNswrWNrtdASXPZg655iQGkwdjjvLIxRs14zgOV/nnHpMQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000006"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AzFdv1Uf9hYAYGR/nDjpuWViwY6oujHVSjOHfnVPnW0a"},"signature":"LsNwsYq4eldX5XV6GsSJmH8gaK3u5BaAdYG23H1vT1wQcPz7bfmgcvaqpAGo2DOm51ZInFD39lafj6c5En8kYg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"j/OMWYzWosWVulnVt9vrudhVZ4t+vtrnL2FV9Un3MYcHO17wnZAW84cFwb9zJju7IpRkTUQXMXV3ml+Nsezclg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"mGLW1RUJ55Q8Ld21m9Vn46FWvo7b8UVbd9LyPUz+Ybkzi5xx2shOkgzdTALa4qbnvqnIR4YmZXQuoZhoy8IdwQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000005"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AzFdv1Uf9hYAYGR/nDjpuWViwY6oujHVSjOHfnVPnW0a"},"signature":"UV00AXhj2z9JSsVhnzX2p8oA5eno4HW0Mr9JkXuRjeZ1IFeE8nAl8CDp5VJsjiga3ri+ZdRDGep/IS04KI1ajg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"IPWPeopHT2UR/t/7a9ib2tUMojeiHs1TOWDpIN+J4oYQJebBGX/QbF1Pf/313W6dC18L/ntHGPXlKnqMgqeByg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0yugnvCjKoe6iWBv9nij9kGEo1rW6oTA0X/e5MaGFC5apj123QMPG7xAsdT5W46oYstUbtQmvHe5D48HuAG/ew=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"BuhUPb8bQwIpYGtSd0kNfF99Tsm8cCfnRc9PmoIVc3EoSz2vd5nLO6cHYvoH+jAXscTwe4YalUmhzs1UrxNIRg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"xTQa8YjK0MkkGAK96uu8euRb+78PuFoC4BOxAQ1gb9IkF+lroKhZDQ1ZE9AgdChEDaQocVFXUcbzyXn/GwTZqw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"T7ltpoWBC9v0s3VEbICvu7+iLRIs9Dml0qPboiI+lzVvfOwp3+JBlSESUxex3pJ/+I6jF2WsbnCLbl+2HtdMcA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"pipDx7LwblfFNXZ3yYULsQzytkQIKX7ZNGnC2AuUSUgP/ioQyIMxtUTQOJiUXQhFALlqj+4eTo6nAQYN0k2Glw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ewUcKHADZnl39jryCW70przlIDYRoku7myU1QQL4p1Qe+fALHoCI/1CekOKaj2+Hylp3D9u7gPtim0bdvA4QTA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000009"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AzFdv1Uf9hYAYGR/nDjpuWViwY6oujHVSjOHfnVPnW0a"},"signature":"J4ISXDHM9fFEZVNeQdBiuwNcB3WCFppK/Fow3YCRsK4LXzxi/jAQgjkls9jqeRwa57U0kCQrHaQzLkAZ/TNnMg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","amount":"100000000ugnot"}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Zl/XXvo8iTXz5NSOr9PZpB0F+DSKjH2eAcKIPRwsMBIpsdTEQGfEI4UL7PhqdCgEPb6F+57SMDqgXSSjvBZFAQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/manfred/home","func":"AddNewTodo","args":["use more this todo system"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"rk2uKfuz6TU0qBz+Y9AUQf7LtVTY5MzZld7EXK/a5bgMPc6lCjPFxq/KiGL0/L7V+RL1pGabcYxcUOF65L7RSQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","send":"","pkg_path":"gno.land/r/test10/poll","func":"Render","args":["red"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AzFdv1Uf9hYAYGR/nDjpuWViwY6oujHVSjOHfnVPnW0a"},"signature":"oZygiDWyovvOWPMFWSzFxBHJD6hjWzyLHFAluiGGBwIb9FnvDcNYm2YjVJG9dx0pAQUsm0r4ZukqeEJa6A7UKg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1wvjfeck8vu66v0vruj6y32v4qy9l9vjchzwzuy","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"bvn2Lri2EvdWK+ZXP8YH8sdpshoM1a0B4uxRenxSe5I9JT3VfXeccYGV6s+umi7Ygx1h4vYjkHlv5VVMKLTvDA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1wvjfeck8vu66v0vruj6y32v4qy9l9vjchzwzuy","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000009"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A3OQvrO7PFi8Kp+i2oT2cHln7VftqmLGZA7lqIeiFCiK"},"signature":"IhiU2NMfag1jf2U2RF8ylDP9fRBWZxAXGa9sVrfCXxdu9yjDyLdoP6PkwNb0ikKY9xXNrVCu+IfbcOk+xVDU6A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1un6eduj3js40765mmakejyuez8x6t4sp44q99p","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sxX1aM9iNMq0IQc4FFDO9i7XbHUmgzyC/sxDzmM5eCRyYlwWIsWAwYvFFbNu6Zv+1k/Iju3scOLvqlGtMHSZ9A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g12vsl72vkygm306py6q6hjyqdsnt5ujeqh2n40p","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"vZChUYBKGjR5PNRwuzs1966AkNO/XKqgo1htr3ViQgUDrgCZ8IFnjBdn6gioOI2e5PJA76fyFIUOoOPQC5y4bg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1frvde3cwzpmkmcsgh6wfcc099k7xt838qtdk6w","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"YN4t2qfaGcBOOkwbbaIzdQQRSQzfoxHJgVoArlWVk+MT8YwoODYQQLidff9gkKIoSsjwG6PeTgrVV0/9HgyEkw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1f2gy53gjx46l8njpxum48e79s9ehlzq5vzsgkk","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"bW9r7KjVPpMaC2d869z9qNcbR1/3j8ACX7kCh9tU3Jc732/Q8HWPAV42ullPzxtwvYqR7JdyEHw5VtFuhe1bpg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ywyuldfmjuzcv565jrn2aja5ux3cg5qwy7x4h2","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"egpgfj4z1fatyP3QVXifTLOHFoT0K1NdULJDlMdz7N4q8O63rhHfnS6lAaZHC5S3wahYVavAfsS2cdonw8kv8A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1qt6jry75fq3d9j4t77xtc286qhqsqlg4xdvvml","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ch33BadMRHkDuAA8J1R3jxicC7KODTcaPAkIu6HO6dUbaMOrCZVViqtyZu+px6TkyRe/ajVJ8z2F9xr7HpoIQQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1s4lvedlmr7j6zzh0qm0njgm8wqaks6jn902dmw","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"oOslll78saKixnBsq/IheJWw2pXSImTaYt2mq63f4blgnkLhpmqHCZUuyPiU7jDbxK7z9HVOB/loZqzGXG2mEA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1g862el8cz3jap78cdnk39435dmhjqevqhuwy2j","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"cTnCRZzfnWncl0j8+K1l2BaIxLSm6aO0oCKQi+APTAB44zmBFuj+Zb/emGc89O2R0XYPekcxblLkMGwuCoNnaA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g13z8g3fttsj86j0ul40eym30gcvzc8hvsqpjylv","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"j9PKW+rhaoYg4oZ1xWoewSw5/bHXmkjELBUML9FQgMUX5DHDgXeFSt7IcRXdKv7YR7c6Ns0jQB/8b9/nylzJ3w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g13z8g3fttsj86j0ul40eym30gcvzc8hvsqpjylv","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"gaVBto1oN7Pnamq8Q66nUmYcWMoAHYTtR7ggUyYqtR1+HH1bYQlrwhfgutbaQsQvpudcBEPXa1htNssIkZyKJQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g13z8g3fttsj86j0ul40eym30gcvzc8hvsqpjylv","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"x3Hr9EuHTy6vnzzQm7q+yjW4v1vE3ze/d154MVnQNZNR984U+P5Dx17sAOFlv8idAAwvkLbRAXU3DWpxOornEA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g13z8g3fttsj86j0ul40eym30gcvzc8hvsqpjylv","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"KF9+V0rIaOURBETyy4TfV6bgmT9HmZ/7IJDzTECuRfwPNxQZtkJGQFIQ4zq5Eckb8nIfHzf4O2Bmghfa/s48VQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g13z8g3fttsj86j0ul40eym30gcvzc8hvsqpjylv","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"WWHunYDQBC77pYIA2LxWKv9UHId0LRFnq3rREvf/Jt44sGNZJArneyzUxTTfNuDWhWQ5aSsBAxIv7VvAEvgyDw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g13z8g3fttsj86j0ul40eym30gcvzc8hvsqpjylv","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000009"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+fOPibFIbqTv6CIVeJ4x20otArMbwxmbdP+v2mwLwf7"},"signature":"Dh7qIkwDLQWtsCHl68tY1t+sKJpAsz2fyXjZjFx0hDRkpDSl1zqU958D0NOAHSk2Acn6PSzB+LPBcFlg155LBQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g13z8g3fttsj86j0ul40eym30gcvzc8hvsqpjylv","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000002"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+fOPibFIbqTv6CIVeJ4x20otArMbwxmbdP+v2mwLwf7"},"signature":"B04XDeoKbIylIvT9pUAIMOLb/jtYYUfbECzVClewN0dM/ek9FuyytWgYbmS3cLv0JzqjdNIDW/1SvAD/HkFfNg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g13z8g3fttsj86j0ul40eym30gcvzc8hvsqpjylv","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000005"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+fOPibFIbqTv6CIVeJ4x20otArMbwxmbdP+v2mwLwf7"},"signature":"L6LBm68g57bdtPy6gTd379rNy82LuNqTjoVhVoeLRgQmV4B8ohIbd6RQHkqKWtyz5V5d8kj+wt5os8/u4Y98Kg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g13z8g3fttsj86j0ul40eym30gcvzc8hvsqpjylv","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fD9x37lKM6PABVVLFn4ihwUl8/9JFmyI/DH7RapPkz4KDgrPxEtUnMA5gAMXpGl2qG+jl6roGXBjDNWujocBOw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g13z8g3fttsj86j0ul40eym30gcvzc8hvsqpjylv","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qZ6Kvz8otjkdbAn7t6N7/OGpXJMn/GDY8cwbezpoQltR5XqFG0qK5OSb9TM0EXWNxFsFKEpIAvk0JL9Ec6OVvw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g13z8g3fttsj86j0ul40eym30gcvzc8hvsqpjylv","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"PfpjIzPlyG0sauPqXDoVanKrYmPA+qHGLGbnRcSmZdBBL2iWGQfRD0yAoBhnaH8IUI3QLbY1ny+/zJJRWV13AQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g13z8g3fttsj86j0ul40eym30gcvzc8hvsqpjylv","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qDwv2VwcOGVDWdCv15oDIkK4clJwYtov4dw2kT+0cwlfkw6KFNLAuAUOdk69uyvh/h6aWeHUf8uqx9ciQu/lEQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g13z8g3fttsj86j0ul40eym30gcvzc8hvsqpjylv","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"+wg6ZOr8IQ21WqYYsxh3pIlJn90nRQe6kFlO1XHBmxkNDaZ14qqqVCb5P5lLvER6rtXLDW+BQM0RvYViVuFg1g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g13z8g3fttsj86j0ul40eym30gcvzc8hvsqpjylv","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"nWVK+kgg8gQ2s8G0JF7ublNHhLp1l+dQfZdDRvUsKsMFiUmHKPqe/ko9Lu8Ks66eg0PsLx/+7ycEtheyVv2PyA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g13z8g3fttsj86j0ul40eym30gcvzc8hvsqpjylv","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"KodzEThyxf5hzb6wq1Bbw9PprR8IoDa4ZVlhnEiVC8QXAMctHiZHdbGzcg8VoKgPivQ+rLUPyaBlCQAnZ0OKlg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10jhlnlcjce9xv33vu6mdqg7srpxm40wqn9w4d3","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8LWwmFLfXUBaVTYuzZKtrl2MmqoYTnu+Nu2zOpnZ1MoaI/it8Yi+FE3Ud6jVNqKfGmF4XxryFD3d6oOo2Ew6qA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10jhlnlcjce9xv33vu6mdqg7srpxm40wqn9w4d3","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"wftHaxxewtXyBYll/sD1FfCUn6QyOShLP3WzyGDZkjxmv7LMPrA6+MNMtTSLVzX/8Jo5tuvlDaohdKWgi3MP5w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1wxar2cfqg9y0455x4vqhmqrc8fhv8mzmtzrt8m","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qSSXGMt4V9UIL35qcCLraTVDMk3YEXkqrybAG7EXnHhfmYod+V2RPdJGswG2pqHJW1sx8xTzNWJUzY7qSwuwxg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1wxar2cfqg9y0455x4vqhmqrc8fhv8mzmtzrt8m","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sI6x512zUAkc2KKmqPfxu6lJ5bIYmEgHFgvqCzZtBlcn+8JGyeQFXXutMhAb9YrL5iI7YmL8JMD3byuUFkcKuw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dpw8yqzsk23z0vw434cpkhtldqd32vqr8h2700","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"j58LzlS3OmuiMMXlFSgpAUA4Xl9vPube8X9epBlDcSRRYSHcV0JXJLauULeVHMyAd2GkRH3alVYR+2SxBKkucw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dpw8yqzsk23z0vw434cpkhtldqd32vqr8h2700","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"CLTCQ8TECHbexFe2nDhbXgSr3ylAp24yBYT35YR9mABNh/rHSE1v2ouRy1SUVmSTQDM8OZOf4IgWjuzKCWBHqA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dpw8yqzsk23z0vw434cpkhtldqd32vqr8h2700","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"JDvQbqin90D/mTLJOTh/h6iBNRWr4F5bgaVmLCn3VBl+706GR4IpnelZmlac+Y5y5SSayqLh34UPLs8rF2AQzw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1dpw8yqzsk23z0vw434cpkhtldqd32vqr8h2700","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000009"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxHGO22KKu4NcV6+glfSQw/e+HNfoe7KfRl03/AF+wQD"},"signature":"TIZXe/KdcKNsj40wvdfxKezGYAHEtzyuTLvLhfyOAwo3C0vebyE5xoNP0/w5FrfF6FNgt/IpfFtIZCiMXpoStA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1dpw8yqzsk23z0vw434cpkhtldqd32vqr8h2700","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000002"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxHGO22KKu4NcV6+glfSQw/e+HNfoe7KfRl03/AF+wQD"},"signature":"r4mi9NmRfhWpF7ddX5Qn1biJDlA556W++pmLOC8MHn9skIZdzTJ3HDrN0WfaTxzVe1PPAaZfUsYDp+DRbCy2Sw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dpw8yqzsk23z0vw434cpkhtldqd32vqr8h2700","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qNYzT33xAgut7MKyIfLLxJMmsBAhQIZ6flpfeKTaT/ZXcK3Qq/KrxQTVqiiPKep6OvsJqaLAFWx5UOMu1xYKgw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1zn60z6ty70v292050zs00aqp3ua6h0x43309vp","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"gyFDObkntOpx3ak+UY6yfFo6H0rw7PPpt5gyRSOaGcFZHOaZLQWMg9K+JkDJw1DxV5o3HtbqBKLsy7B6IMmSmA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1zn60z6ty70v292050zs00aqp3ua6h0x43309vp","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"iYVIbdm6RMrt1ITgHctfLKF/vPI4457VeCR0i/GucjpiD8BGAtBXl1pg1fKovMq6Bo4UfzieZ8/a2DV91x319A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1wvjfeck8vu66v0vruj6y32v4qy9l9vjchzwzuy","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"bRf8OBxo0wd50ur41EziQeUu+JZGtclxNLzUP/nfzTFgZb7jpUxNQIXaJZLhmtRVEeoSrxUUFKxZtmh7uki5qw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1wvjfeck8vu66v0vruj6y32v4qy9l9vjchzwzuy","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"zAvrHmCqVyiQ5rjb4l9GsW1JHowKZzqPKxOK2woLGf1q+EGnLUK/ZolDXMsgscODNKPva8uWiVTa0f41KdV91w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g19z05mfcauu0lqlenysklhha0urdvtkap2y2gh7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"VWvObN4XNAI1iep49MzbIkMTK6o2XN9v5IH064MRMlMYOv2OsBvrhqAqik+X2hMZYjuD9smtE4UMZ2/FIgM18A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g19z05mfcauu0lqlenysklhha0urdvtkap2y2gh7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"CixgUXgx4SBpYNOgCzhYj9Jgfca9KuWtyy8WZ0XL6vAPUuUwFDsyOZa0GyVyetQeifXze9w3oy0VD/W/TzQ9wg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g19z05mfcauu0lqlenysklhha0urdvtkap2y2gh7","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000006"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AlW9mvzoDO0Jr/FlPPXOiU7CuMfHoXmavhi6fQYj7Wr/"},"signature":"lqVbZwxaEAxqM30+miL+G8zREs+DIs2vPdibLhQ98B0w53APXWdcBQen8rK9IT7hNb5+HpCYLzRNuJmE/tgmzg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g19z05mfcauu0lqlenysklhha0urdvtkap2y2gh7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"QX/5V+K1Bt7it7Kc4E5V1y8SPi68bAE8vI3mj8XL8fETzWSSfT9GCt1S2DJ9SBhaGR1kMd8gImkEGpcgMK9T3g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/boom/boom","func":"Approve","args":["",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"SJ6hW4Xt4WmyKR/5E/VLXaTUhWdudkOf8XcGRYi4g3JRmWAf3xDFvoSP5fasN0FjEdp3MesmkFcHow5vt1Al+A=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1lm3m7vvtdmetw2rakac59ckjtd8gr85wdj32ym","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"4Yz49Xgg10wEuAP/D5WgbdKK2JrlydKQ7uWUNQtB2Q0wBeDTXV0HGvAC+mEq/pziWI9g7Mje/9lUROgwKTVvLw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1lm3m7vvtdmetw2rakac59ckjtd8gr85wdj32ym","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"XJt3x8YMxBvGT0whm6Y0m93IR3xFmHJ7w40Z8u4Qr+EPzKWKlA0+Z0Mmb574BAm8KW2JceILpWrH6tGMRm+TOg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g130g97u00ayr3gjr38w5qpf4he7xku8kszwe26y","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Arj+eV9KeaK2bwfIubTEz49yLr2yCc6OBTxn7AeNrqM4ZwkryKHyoARu7DLY09G8kQIMDST9SwKTNTvvp4yxVQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g130g97u00ayr3gjr38w5qpf4he7xku8kszwe26y","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"92ds7n+wtGIbkvJ8X0NczP/8n2fORiBR+F/3c2f5eXRs1bCgK4KKyhz3h6r5zB5HEm0EAPqNpiB5y2kqCNHthQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/memeland","func":"PostMeme","args":["data:image/jpeg;base64,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","1711131601"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"ZnySUvN16r+bQqLzwvEtKQrdO5/Ur2xOcxWXIOtadnNOngXsfzhfOSed0NPakaTQ5Ac1p/Ju5gKuIzZ7/FQqtA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g130g97u00ayr3gjr38w5qpf4he7xku8kszwe26y","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A9qrusMQFIDdLNttvkGh7qxDNZfcZFxbdDpBkzXDKEOt"},"signature":"yGf3vu+plGPWgune5tahikr70h6Y9UTCUtaU01nnBJFcIyrLejiZwZudUT44+OUdkq3zfGT8pK8Aq2rDJwBacg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1w8cpkflxysztll935x45llywtz0rdwajcm2lwu","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"POH6h0b5q+AA4ABK/0LdAE62f7k3TaQyRx0NAI0HHx9luDP4nTGsdDwYkb6+SCZvhEjKZhjmJgMnbaxl0ER+Zw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1w8cpkflxysztll935x45llywtz0rdwajcm2lwu","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"NciTIe3i2HrM/zF6+Pgh5RlEaerULIiQ0Cp7oL+vIrMsF3UV7W9k/C/VeGvnpMyqQj+xVyNA3onS0FBugR755Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1w8cpkflxysztll935x45llywtz0rdwajcm2lwu","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"wmh0vzkqhEmab7BjmMT5iCWED6wMAxru2NR6rL2gj1IXi0phSwUHeRP8ulkm9YS2qg3WAZzZX1reU99gnkGkOQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1w8cpkflxysztll935x45llywtz0rdwajcm2lwu","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"pHrayCLKWztfDSZBxw3W6qcV4yMjcCB6737v/pH2z1ZaGYOW47My5cQCpl2oNRbKj12zxPXhwjH7YFclpSeGHg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1w8cpkflxysztll935x45llywtz0rdwajcm2lwu","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"86BP+xdgwlzyYYIyu6PoIpbsMNEs60PD4RK6iqigUHMm3o5dn4bWmMKekrkGB2NqyfrsN/PNjtb9J/dIVOSiYQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1w8cpkflxysztll935x45llywtz0rdwajcm2lwu","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"41lJOr3Jzzpb9E7f5B0554mGtFdY4s9HoRKtBrQQlsAHOrXG3/F1uxMPSg2/oQM2W31mn46BS5Tw7QZnI1uXnw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1w8cpkflxysztll935x45llywtz0rdwajcm2lwu","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"dWOkQwFNlYwaEWJbMhTu1HyLSk5Ku3GlgfSdv2bjFsE1YY8rdSuIO3NHkGZ8kEhhrcWoCP/bnVv0Be6BjuHv/w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1z6qs6t88rhlafv6qqu5f5xxsax83zczunsc0v0","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"CpH+l9Y9tYfmx1Px9r+1oVVzEMBZ3kstxeAJVzGUvQwhZFqRVFlOF7fy3X8pall2mgjnl+RLw0COShA+FF0SUA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1z6qs6t88rhlafv6qqu5f5xxsax83zczunsc0v0","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"i9DiuljbCUjmac9p3jEJTFxXz1UjFcLqo9TmZ7WhmeIxzthxjPV4P55Pv4pwRwmJQ3TiXsNtqrDMH3NNsK5WRg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1z6qs6t88rhlafv6qqu5f5xxsax83zczunsc0v0","send":"","pkg_path":"gno.land/r/demo/memeland","func":"PostMeme","args":["data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4gHYSUNDX1BST0ZJTEUAAQEAAAHIAAAAAAQwAABtbnRyUkdCIFhZWiAH4AABAAEAAAAAAABhY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlkZXNjAAAA8AAAACRyWFlaAAABFAAAABRnWFlaAAABKAAAABRiWFlaAAABPAAAABR3dHB0AAABUAAAABRyVFJDAAABZAAAAChnVFJDAAABZAAAAChiVFJDAAABZAAAAChjcHJ0AAABjAAAADxtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAHMAUgBHAEJYWVogAAAAAAAAb6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9YWVogAAAAAAAA9tYAAQAAAADTLXBhcmEAAAAAAAQAAAACZmYAAPKnAAANWQAAE9AAAApbAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAACAAAAAcAEcAbwBvAGcAbABlACAASQBuAGMALgAgADIAMAAxADb/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAJYAlgDASIAAhEBAxEB/8QAHgABAAEFAQEBAQAAAAAAAAAAAAUEBgcICQMCAQr/xABbEAABAwMCAwUFAwgECQkGBAcBAAIDBAURBiEHEjEIE0FRYQkUInGBMpGhFRYjQlKxwdMzYtHwGSRygpKistLhFzZDU5Ojs8LxJSY0RnODGFSEwyg1VmNklOL/xAAcAQEAAgMBAQEAAAAAAAAAAAAAAwQCBQYBBwj/xAA8EQACAgECAwQJAgYBBAIDAAAAAQIDEQQhBRIxEyJBURQyYXGBkaGxwdHwBhUjQlLhMxaSsvFiciRDgv/aAAwDAQACEQMRAD8A6poiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIDTQ9tPWT5h3dhsroj5tmz/tqap+1vqyqgDmWaztcRn4mykf7a13tJjll5ct529RlXJRvAcW+Hguaeqt/yPocuH6Rf/rRmv8A/FfqtrPis9nL/QSgf7atit7a+uKK5d0/TllFPnHMWTc3+3hY+neGuyqOsbDNGedocSi1Vr/uK70Om/wRl+l7aGpZzg2S0h3oJf8AfVeO1/qMMLn2a1jx2Ep/8y17pqRlOHOzkkqtaPeYHAYBIxkLP0m3/Ii9B0+fUMh617eGtNM24VkFgsMrDKIw2Rk5yD45Egwsc1HtQdewzOYNK6bIHpUfzFY/FujFJogB4DiKhnxfNa23EctW8eIW20tkrIZl1Od11MKreWCwbj/4UbXpbn81dN5+VR/MXjL7UvXzDgaT0391R/MWmYBB9F41OBlXDX4RukPama/P/wAp6b+6o/mL4f7U7iAw/wDNLTWPUVH8xaV0+zjk59Cv2p3x0wgwjdCP2qPEFx30lpofSo/mr7d7U/iAASNJ6aP0qP5i0lY8h3ReshBjOAUGEbnn2q3EEf8Aylpr7qj+YvtvtUuIBB/90tNfdUfzFpG3q1egPwnB3C8yHE3Pd7VziE1xH5oaa+6o/mr7/wAKxxCI20lpn6io/mrR9+ecr2ZH8JI3AG68R4kbru9q7xBAz+aOmfuqP5qpf8LZr1shY7SOmc+GBUfzVpbgE7nZ3QhfhpIubma3ncOpcNkbxsZcpu/D7VniDIC52ktMxx+bm1H81U109rbri1R/pdI6cdIemBUY/wDEWjF2rZRHiEANbs4u6BY9uT6ueqcXS55j18Fke8qOhEvtmtaxztb+ZunCzIDnAVBI9f6RftV7ZjWwaRTaM05I/OxeKjGPl3my5zSQFjS52CSV4Oe9/Lk9AmTFwWDonV+2e4gxVPJDo3SrmbbubU5B/wC1VXRe2O4gTysEuktJtYf2RU5/8Vc3JeXnBdkE/eF6Ad0Gnm5mnxHgjyyWCinlrJ04g9r1rapeWx6S04SDg/DUfzFX03tZNdTZ59KaaZgkdKj+auYMVa+FoMUrm/JVtLqCobKHSSl3mSq7jLwZtK7NN/dUjpxN7VnXjIY3M0npt73Z2xUY/wDF+ak9B+1F1rqLUcFDdNNaaoqOR3KZ4u/Bb67yLmtbNSxE5lJ3H6quO13WnqZIwaruyT54Kwl2nTJhd2ElmEUjpxq3t+cQtPXKmhp9NadqqaTPPLifI8sASKkq/aPawttC+afR9sneWktZA2X4cDJLvj6YWmukL8au3utctUyVsbRJA+R/iB9nPl/YoG+XuuMksJqDAMlpbGcZCpQeo5uVyNXKUebZG11P7VDiQ64UsU+jtMRwzycm3vHOPp3qq5fah8RzX3Cnh0jpmQUp8W1OXAnbfvMLSC207heqaQuLgZB+9e9656PUtROwgvdITjw2Wxbko7CtKT6G9Fs9prxAqY7p71pLT1PLRt/oyJwebPQ5kU7oj2ievNT1jRUaWsMVIP6SSIT5b98h3WlfDp0moL9Uunja/wB5l715nOGY8QSr/wBO1M1kvN1iZSjuXyBzHRfYOM7D71rtRdbGLcHubWiiqUu+tjdHUXbmu1vtM9dQ26zyMa4Na2dsoO5PUByvzS3aVv1+sFJcJbbbI3TRh55Ofl3GdsuWhk9FctR8kE7Ww0HM1z42tw52P6yynb70626cltbeWGilj7oNLyXNBGNitNdfq3WlCeGWux0yl6uxtZUdpmSiYHTttbM9A1z3E/IBy/bV2nReqV9TStt7oGSOic5/OzDh1GCQVqPanxQQNjgc4sZsA3qpJk/u+7Imh3XLzvn5Kpz63G9z+gUNPn/jRtTVdpd9M0nuaF/+SHn+KxTprt5Xy9ajnt8mnbd3D5520ksTpAXxxnAJy7qd/TZWBU0NfHbmSvqacMkGzWEOcPosd2/h/T0l9imEknMxzu7YDhrcnJVvT6m5J81jZhZTTtiGDbCq7W98pm80lptUDT4yyPH/AJlbGre3HqCz2WeptdrsdxrW7RwNMruY/R6xh+ZcEha4wsk5twXkuXxLp0UI5WxshH9RoClWstT3myF0V/4l7aO7eOv7tHI666OtVOTtGYmTMb9XOf8AuVzN7ampDjmstnj8wO9dj6hywZUWiPvMklxPXmK/ImUNNk1EMswIwGtdjB81O9XY9+YwVNXkZ0l7bl8ibtZbZI7GdhIB/tqkk7cuoR9myWkeYIlP/mWvF4kppHcsMRjYB+s7J+9WxWP7kuw4AfNWIW2yWeYwlXWuiNpJu3hqOIE/kK0Y+Uv++qY9vnUxyG2C0Z9RL/vrU+asLnfbyB4eC84qxoY93iNvJW4ynjdmKrh5G2h7e2qMc35As2PXvc/7a8XdvvVnUaesuPXvT/51qJVXQ4IBwVRNupaMOcslKzzM+xr8jcqLt9apfubDZAPP9L/vrwqvaC6npwcWGyOP/wB3/fWnkty6nOR4KMrLsQHHOT5KTM/MydVSXQ3Dk9oxq1szWN05YyD44m/mL3m9obq+IH/3dsRPlibb/vFpG2rfJWRFzcgnbHgpKeblkyTvjqFarTfU113LF4ijbt/tHdZA4bpuwHfxE38xebvaOa5cfg0xp7Hr3/8AMWpEeJiXADI32Cpw8ulDc7ZVjCXgVluzcFvtFtf5bnSun3NJxlvf7f8AeLxqPaQ67pX8smlbCPXE+P8AxFrBTzBsbAB0HmvqQiR2Sc48CsOdLqiVV56M2fj9pDrd5AGmdPnPk2f+Yqn/AAi+tzsNMWLm8uWfP3d4tX6Z8cLcsa1h8eUYVZC1ksYc2NvMf1sb/enPHyJOyfmbNO9oVrwNa4aYsByMkYnyP+8XifaKa6AcfzVsQx5iff8A7xa2TtcwDmHwqlYRnlB6eK9TXkeSrx0NpovaF63fCJHaasIB8hP/ADFVQ+0C1nKAfzcsePQTf761cbO1jcDG+y/YJWsOD16hY9TBxwbVu7fOsQ0lunbI4/8A3v8AfXm7t/avacHT1jz8pv8AfWsbKkOGMeC+HlgkeXNDsdR4oRGzVV7QLWUMTnM07Yi4DOCJt/8AXUO72jutg8humLA7HX+n/mLXqSlqJwe6p5H5x0aeijX6VuD5Hd3Ry4zvthZxcMd4jkp+Bsx/hHtaA/FpmwD/ALf/AH1+H2j+tRn/AN2bD/oz/wAxa+0fDa6VIY98DWt64LsKTi4S1JLS6SJhz+0XLB6jTR6tHqqvl0Rms+0h1sMj82LAD6if+YvMe0o1tIMs0xYC09DifH+2sSnhFHJJGX1owOoYzr81Is4NWlwc6SaXPTLMD+1QvW6ReJKtNqGZKZ7SLXL/AP5Y08R5gT/zEWODwpskNOIoufmb1ke4kn6IvPTtL5Gfot5TSUlZQXUVdK4uifjMWc5/BZHtrC6NjjkOx0KjY6WKKFgaN27Anqpq000lVG4RDme0cxGVyj7x9Pm0keV0gLYg9vh1UOJS8dcq4YY5LgJIWsMh3BA8FE1tr9xaCzJaNiPJFsirldCjG2QvWkwxx3+i8Sd18OlLOik8DFrBbfGiN0uiHcmD+nZ1WsVyBFQ8l2eU4IWy/EyoNRpCVjuglafxWtd3IZXyho8c5W70L/pnKcSj/WT9hQc4VNVn/SVQW53C8Klufmtiag8oHkuOfBelRjlBC84RyvOPuX7O4Bu/XKBng37S9S7DSF5NO4yvWQYjysWeopckvHkvVm/N5dV4B/xL9fWR0kkJqueKAuHO4N35fHCxW7wevZFBc6ptK3mbuT4KMabjd52xUbZZnu2xGCfosx0WkdO67Mt0p4JrXpO1Q/43XOPLJVy4BEbc7Z8z4DJ8laNopSKapmM3u1FCf0LI/hMg8C5TW19nNxUk8eRhW1Nc2C3/AMgvtLWd7I6WtkOCC7LI/qFRy3dheYInB+PtO8z6L71TfGPhNOwkzvweVu23jkqg0vYpK6qa+WM9wDmR5/goveSe4SMkqoXzPBMQPQ7ZP9ihpqZ04L3tIYT18lkI2v8AKDmta7u6Zh3BOxVr6lGap8UDcQx/s9CskwWJcoQ1xDTgAqPlwx2w6qarqR87C7BDj0JVEKDLhnfCLZgjHhzsly+4GuIJ5sN8QqqqpSRnPK0L1pba57WnB5Sc581Jk9wUrYg5xDT9y+JWhhIUoyjERccYGSo2pwZX4WOUJbIou8ewktcQqyCse/GHljm7h2ei8XMw3J8V5MhLTkHqjwzDmZeun9W1dvaMSySNHQeIV80mpKq5MbM8tkkAxkt3+qxJQTGkeHHZpGFd1jrhGO/jfzNJAdGFFyrO5E+pedruhkvNOx7cfpBt4LOVq4UC9uFyPd8j/ik5Wl5aPPfAWFbfSNra6hnZgND2k4+ayJV8Qbq2B1uFS9lEwlhZF8PMPmN1XvU+X+mX9NyrqXvVRWHTV3mtzathfEcBzzy5/wA3A8/VS9PcaG3ytlbVgy4y0QxZx9SViehmZcKgPlma6RoOHSuzt5ZKkaareQGg4yegVHsf8nuXG8vYyJNqsVVVGCySYt2DnvwPuA/irjN7d3LeVjGeGAP4lYpoLhJDUNbt1xv4K5jcXPaAHAePVJU5MefBe9FeZGnDDgnfdVAvk7pMOlYw/tA5VgR3SeL9bIPg7cL0fcDVgBpIA3cQovRzztDLVo1TR0snNWNFZHy/Z7zk381+1N2irKmSWipvd4XHLWF/Pj6rFjK6KBrRzOLz5+CyTpnizb7NYm0VfaGyGNvKJImjL/nlVbNNKtc0I5ZnGyL2ky47drOnp6VkEkrZJgNsBeU2o21TnukcXAeDfALFN91dTXG6PqbfRvpISNo3uzgryj1DWNHMx+Pxws46GT3xgjlqF4MydU3GEtDg8AeZUDV32EuIGOUeSsh15rMOxIN/AhRFTXVT5SHyP64GDgfgp4aTHrMhlcvAui8XmOZ7mMc0tAzkK2KquD3FvO0u8gcr5pbdW1Ew7qOSTO/wsJXhVwPppZMgtLdsEbj0KvwrjjCZG5Se7RS1VQ+MkBpPyVNH3tRnDwceZG69JXumcObGfIeC9O7bE3OwKsKCR5zPwKV8MhA5nBo8x1VI+H4/t7KqfU5B3yqR1PPUEmONxGfAdFniPizF2TEz2NBAOfTqqCaaJxGW4dnOSvY2W5Svy2lkx5nZfrtOVkgDsNb83ALNTqXiQt2vwKdtWxocObB8MYXvHKHtyX5yFVR6TqHPDXVDG5GRjJ9FIU+jHk/HV52x8LV5LVUQXrGMarZvoZH7N3Ad/H3Ut0tYups1NRUZqpKvuO9GeZrQ3HMNzknr4LHWo9PMsOoLlR08klZT0dTJTtqnR8jZA1xbzY3xnHmt3exRp+n4e8J9favlifVczu6DXdXMhjLiB8zJj6eivzhlqyPjjwb1hTansNvpbRSxyshjgh5Y2tEZcCM9HNO/MFh6TB4w+u5n2M1nK6bHOCAOMIfykN8DhepbKBzmCVzT4taVvnQaWdrnsg6Us1FSxuqhXR0YaGA8uKpwB/0SCo3tMalo9I2Gx8NbI1jaehiY6tMYA5nAfC04+rj8x5KtPUqMOdrwX1LdVMpT5PHL+hprSWatrYe8ho5nNzuRGcKcp9J3lkbC6jkha/7PeYbzfLPVbo8E6lmgOzhfdT1NNHUT1UzzHHOPheBhjQfTm5ldOp+IskHASy6quNmt1Tdnyx+5QyQ/oY5Dzcrw30aCcfJRO9uPNlLbPQtKKUuVRzvjrg0Uk0JdGNDKgRwAjIdI/qPA9F80/DSqna9wqeYNGXd1E54A23JW9/Fm2xcRdGcPYbtBHBdLvU05c+IYMYczmeB5DC+dX8SJuF+vtPaJ0xZqVtuLoWVDO7+OTncBsR443JOVi7bV1nhbb48z2PJJJRhmW/jtsaON4eU5DQ6pnkf4taAP4KUoNCUEUUkjqWd8bNiXOOB89lvbRcP7Vb+P011pKeGnY21meeNrQGiRzuXmx0BI/cqfhdxIi1tFrx9bQUMGnqGRzstjwJGkPLy/wds0E/NY4tbxKzffw8jB2V45oQ8vqab0mlbfBAJmW1pYNu9e0kfeq6mtdMZOWCiZI/qeSPJ6jwW0mjeIVDq/gZqq519BRUtgo4ZWU0VLF8DWBnw7eJBLd1Xx01Fwo0Lp6mtF4sthudxYJ56u6Ny+qAaHODcb7FzfkPmoOxlYubn2xk8dkYvHJvnBqVWVApGFpYIznoRjB+Stw1FUavlihc92+zWkkjzwFtJxMg05r7iTw1NsqKG43ieub+UXUJw0sjaJOdwPUZaR9VcWoONNRQ9pS2aLs1poZQ7uaWvq3tPehhb3hDXDYBodnHiVnChQ9aWd8EM5ys6LG2TUrS9jumur/SWa3MIrKmQMa55LWtPqceSujVmiLvwyvL7Rc3081XHG17nxSF4w7JAyQN8YP1Wz+nbkxnac1Bbbdb4GUf5Pjlqqnu8ETD9k+ZzuVrV2leK2qdfagudsoaanoKO1188NNVxgd5K0OLA93ns38VhfXFVvPXOEe08zml7C2ZayU7Fhz5nov2Gu5AQ4taQPErHRs+p6ijNM6tZPK8EunL+Uj7hsvJmi9QUdBJE+qhnjcSXOmne44IAPh6LX4S8i9st+Yv8Aq7vBFjvZ42jxw4H9yLHOkNF5Y+op6+nmpXnlywOJ5hnOSSizxjYJw8ZGVTI1u2c/JXHox3NXS56d0dlZTZXAYzlXLoSoLrhPnoI/4ryHU6631GTWl3h1zqd98H96jaxwc+UF2RzFfWlKjF0qnAgktJH3qjbK2SWQOJxzFH0RSfrES8FkjgQR5ZUtp60wXSrMc+S0MLsA4VHVuEsngpbSLxHcXZ/6s/wReRk20jHnF6kjpNK1XdD7MzRj6rWG6tLqyU+q2g4wTiTStYxv2u/bj71q9dXFtS8E7g7rd6BYrfvOa4lvavcUW7hscfRUs7iqobePgqOcZ3WyNNg/Izk7FftSQ1oJ6lfEIPMvuoYQBndAUjTly9pTiP0XgzZx9F7ztzEvGeFGPtdVkKxcN6nVWhrjebhUU9BbbczvfeKhueZ2cNYB4knbHzVsaM0rPq3UlHb4Wud3jwX8oyeXO4Hqeg+ayRx+1hSWiKLQFpMbaCzHFYYsYlrMYcM+LWfYHqHFRyfgj1GGTrm9ajtsOn5e7prPTSucYqVojjec5wAPEr2mr/dqeo53juoxzFp6E+CjbLCXxd6R8LCeXH7RXi9rrhK+Bo5uaT4vos0miUtuLmqLk+YEyOcds9CVf9loZ6S3lrgWOk+IqmtOm43XSPAbEI/jIPiQNsK8TSNMTgADzAAEdUzkxwR1FFEDDTmXkEmQ92M4HicL7uNstbqlsNO1s0TepLvtH7lQSvHec3eAODi3l8mj+OcpPFO49/3TmMwMlxzsjWDLqfFx0bRysErSZpD4N2b9PkrKvdhNG0loGPkr+orkxsW3eGMnl5ug67qauNjor7Rd7ABs3DcdFjnY9wzA0VpmlIIiLwTgD9r5K/5NKNhtEWabkeyMHOfHyVz6e0A+73Mc593t1MR3r/AnwA9Tur0vVjpJw2npnY5cDHXZY53wZcu25rrd7a+Bp+HkLt8Hw8V4w6XZW09PUx9HfC8eRWVtSaFlNx71ze9gdjZvUbdPwUnYdGQ6fqIpq2Emz1je7f4mFx6O+hCwlPlPIw5mYSv+i5qCJkvdnu3gFr/DBGQraFI6F5a4ZH7luFZtKUtfLUWC4RMe81DJIZwPtNyQ4fIhwIWJOL/Bio0NqCpgDCaZ5L4n+f1Xldqk+XxM5UtLK6GHDGS3qD5qpt9Y+hqGFr8MJxh3RVMtA6NrzycuAqmyUUVXzRTNzG/bI6t9VM8tlZovbTl4NPyhv6QA56q/aCiku8UbqaJznP6kHxWM7XbjY7gIKhxDHbNf1GCs0cGLfBcr9JbKqvZb4nMdJHPPs3bwyvJ4jDmfgewy3yx6s+aLR1a14DzHGfUkj9ynGaRnpeQPnY4HfmxjCzHHpbQtBGDXarjc8YB7oAr0muPCqgbh9bV172jYMB3Wo/mFGcKMm/czYKi7G7S+JiWnscEb4+d7pHuOxbsFJPtscLdg/vMbDKyIeJfDW2YNJp6asc3p33/Er4m7RFqpNqDSNI1vg6Qtz+5Y+nTfqUv44R76Mv7rEWZRWOpqxC2KkmfzDq1hduriouG2oqzBhtU5b0GWFo/Fe9V2nL46PkorbQ0jB0+Ekq367tB60qycXFkA8GxRAY+9YdvrJ9K0vie9lRHrNsvSLgjqeYNe6kZDn/rHjZV44E3NsfJVXGipx/WJcsM1/FnVtwz318rD6Nfy/uUPUamuleCKivqZs/tyuP8AFR//AJ8uskvcjFvTLpFsz+OEunrSc3LVlNFjq0FjQfvcvN1p4W2s5qtRuqT1xE8kH0+EFa5STO5Tk/UrzkmI5dzkdMFevT6ie8738Ekeq2qPq1o2GqNc8JrUR3NLU3EjbDYnnP8ApEKil4+aNoNqDSjjjYOlEbfv6rX6SYc2T181QTznc56lPQIvec5P4ki1PL6sUjZnR3aIfqbWVussFgpaWmqpO7MgflwGCc9APBUeqrBSVmoLlLJK9rXzvcWtx5rD3BWUx8UbG4nYSO/2HLK2qtQU0NbWzE8zGzOaXNyd89NlrNRD0S/FLxlF6mXbRfa7kcbFa4PsxvJ83PXi63UMJJ7hkg65duqKtvr+/hjEL394NpANgPVR77lVSVEzDTFjGD4ZHHZ59F6rrZdZHkoQXREye4B+GCIEHOA0BfPvbGgjAYOoVsGtuMlM89zFHMDhrS/Ix5khfDqm4uiibGYmyZ/SZzjHove8+rIm0vAuR9Q5wIJy3z8FFVU4jk8Gg+J6Kgca91UCJj3QGO6HifPK8Y7dUPbPzzSvbKcgOf8AY+WFLDukc1zdCSbVEFxDgMDOSpKkqoomd5JMwR5+052ArWjtEcNO6keXzRnZxmJOc+GV6yvgpGQUrqSOaIYwxwyGj5FZSa8BXF53Nq+H/a1p+GnDa26RprFTSz986SapqqoFtUHSlz2d3yeLSG55jjGVKam7Uh1pbafh9o3TUGmRcnthkZAS4PLyByghjWtBJ3zuVrJSTiSOJz8F4b5dFWw36K2TslFT7tMxwcx7XcrmkbggjoV4tRZjkzt0LEdPW3zY36nQPQDndnHgnUR6uqaP36KolnpaWKUPL3EDkaPM5BO3QFaV3PV901fqC6XO40b4qmeZ0veTStIkcT0wNwPmrQufEOe6l089TWXR7CQ18j3SEbnOCT6KHp9T3K4ASQUndMJ2MzsH7l7fZK1RjFYSJKKVS3Ob3ZsZcuO1deuC9DoaPT8FndScpNU2vM4mcCXElndN5cuOepXjq7tBHiNoKwadbbW6fjtBLHSip78TOa3lDg3kbj9bGc/aWAqGO7VTZXVdVG2EAgMhB5s/M+i9tDRh9H3k8Z7vvH/E52+ATvhQTssw8vrhfAvU1UcyaXTL+JsjxV7SI1vPYJrbTyafNmdzw9zUiQkgjHVoAGBjGD1V0jtn2iqnguFVoJlx1NSwFsddE/OD0BHwEgbnYHxO46rXerbSwcsEIgE8uS0nGGD9o+XivqrlpbPRNmdVsjbGMiV7xh/plZR1NsZNt7v3Gc9Jp5RUFHZe1marF2pr7RjVFZc9NmtuN6j7plQ6rbTtpmcrmta1nK4kDOeoUBofjNXaN4Xak0fDYo21d5bKfyn70XCPnYGY7ruxnAH7Q6rF9BqKhnpIqytm92a8AsjeD0I2I23VXqO+UlroI3vbLM6f+gZFGXF7hgj5eBWS1FuVl7rP1IJ6arD5VhPH0Mm0XF6Sg4LS8PYLf3dRWPJkuDJgOYFwcf0XIcDAA+1nZTLu0PZqaw6V07rjRtPrSahbI2iuFRKGPaWtAGWlh3LTgkHfl3CwbDeKq0CGSut89XUzEcrqdmzc743Oyj+INXVPNnqaWjfOYaoBwyBjnYR19P4qxXdYpJJ7Yway2qDe66vJshQdoLvOI9Jqqo01TvipKZ1PR0NPIIhCHYy4u5Tk/QKhtPGGm07xQrdd1lodWTTvlkZSmo5e6LwWgB3Ic4bt0WGal92t9Cypo44ZH8oMsM8mAz5HG6TSXe+RwzU76SDk6NkBc0HG5GF72tjaeejyVXCKzt7DNGj+0VVaS4l3vU1fZ2zRXvA7kTEd2B0bz8uxHywfRWrxL1lQal1RUV9stEVoZU8vd0UTw7LsZc4nA6kkkqzbzSVNZaBC6rbDMQOd7I85PoD03UNRWespAKeuu03vEvKxldFjOOvIc7D+KOcpR5ZMiUIrvImqamqLV+kYXzh5LpeZ2cf5OegVRPWC65gpXg0wH6WXbYfs5VLXWxtRQR2k1dTLPIN5u8LZGtHVxIxjyVDBpCn03azR08ctZQOJMzJZS57s9TnKjST3fUdFse9xpzTsdNROiYY/tR5Aje3xBx+/qi8aGitkcLqOggiZRuGZt85z1Bz8kVlbELwi/pNEyH+iqYXny3CrNO6eq7NUTSTOYWFmMtOd85ViQ1lVTnMdQ8HzDiqpt9uckRMdVKWOGD8XRQ5wzu5Rm1jJPaPl57pWZOQGO/eqJkhknkDGueQSTyjOFCUNwqbZI98TuUuHK7IzkKtst7qLNM+SJrXl4w4PCwa2wRyg8tklISBuC0+RCrtKyl92mBHwCI7ry/PwgYloo3k+IK8na9po+cihMbi0jmbgFZLYjfNJYwY/4q1RdZJgDlpmH71gy42+OdxkIy5Za4l1xdp8kjOZhvn5rE7qjvW+p6LeaL/jOb4ptavcR81pjkjwHOB8MblUP5vvl/6Yg535m4GFNl2N1cHDRtuqteWWG5wtnoJapkcsROAQTjf71eeyNMm2WVbNHXa7Vfutuo31k2CQ2MeA8clVl64baqtjWmqsVbDzD4cxZz8sLcXiHQ1PDvV9KNJW2301HHTiR9O6Bp7/AOLcF53GyruP2ka28WSg1HQRM96tsD5HU7yQHNc0E9PEYWC70sGUk4RUn4mgdXbau0nlq6KeAnfEsZafnuqEzg5AOxPVZcvPES4aptFsfcdOi525jJGSSUwIngAOMg+PyPkrUvVmoJbKy6WqoZXUMzixjmgNkY7GS1zfArPlMcvxL04OSV2hbZX6lo6WGqqXQSMoHvfjkqGjaQ9chucgftALAd/uL6uqkfLIXyyOLpC45Jdncn65Wxoh/I3Bm3NOWSGhkm265kccfvCwHqi2OmhL4YBHyguLyOXIAXrio4EHlspLHUOfRTRbBuCQB5+amNLWMe8tka4buxgnZQWlf8aikdghrGZcR4K5bHMKcNDZB+jcWkg7lYt7E2xNV4pre4OY/mkG22OvRezKyOloJZeXvH93ho8jjYq2tY45KWZh5WiUmX5dfxXxYq99XDExx5mk56+BPRY4ytj3xLDivtU+ocXvzJzHJIUzTarr6gOgO5cPjc7wb6Dz9V8XXRldU6ikgpYnTSTSERRsaS52fT6rKw7L+qmWqCprWNtjpmj9DIcS8vnhYO2ENpMmjTOz1UWxS3OGutrbdBAwPBBaGnmOw3+uVdej6OqfS8j6Z7YAfhwwkH6q/OG3Z6prFXRzXOQvaAC6Jwxn5+KzNerhS2CzvgobfA5gGGgR5JCrTtT2gXq9O1l2bGudyqn01G6kpWysjDuaTbDWnzUTDcJaB5e9xj5sEF53PzVdrfUV2uFxkDqdtLCdmxsYck+ZP0UbpzhtqTXNdHBTUVS5j9zM5jgB9VnzcscsgcXOXLFF96KiZqifDB3jQDzADPMVf9TZqH8iz0FQxrmujPdnAHKfBX3wl4It0hRNlqGnvDs4kb48goPjDb/yPO10bOQZ+FoHh6rWS1UbLOWJtI6N1V80upilkDLPdaKrkcSIXtLZHjoG4yCVkXippem15ZYSAzmPxMl6HcbYWGNcahP5Fa1sm8/xsHQkg4OPvx9Fne11j6bS9npJm95USQNcebfA5fH71ldJxUZIiohzZhI0k17o51o75nI4mMn7Ixt/HdWdY6QwVcQeCGvODgdFsdxytrKd1QQeaRzPiPzWDdK291RWxxzAhri7f18Ftapc0EzT3Q7OTReItUdxoO7l+3GPgOOnkq21PfLEyOSNraiDbnBwSPVe2GwwvAGS3lz67KIhuXc3XY/C53KcKbGxVUlkvaGYSRgjIK++vzPiV4UUjZIQ5u48F71EraendK88jQOqoN7lrLZ6RuwQD96+2u+LCsuo1NO+qbyu5YmuOw/WCuq3TirpmSt3a9uQvGevYq+Y4wvOR2+F6+BJVO8+OPFeHh8udyuwnN4hfn2jlfjhjKEQ58faGQrc1Ndnwd3DDJyv6vyN8eiuAShoIIyfMqwNSNdHcnmVwkJO2PAdVkt2ZJly2u4MqaRvx80jftBJpeYnfxyo+0wMpIgQcGQB2Ekn5WnCyePANl58IqoniRaNzs95yP8AIcsm3q4RtrKkFwLRI4k467ndYf4R1BfxBtvdnDh3hO/hyH+1X1e5KqqdUuYYmPEzuXmGQ4ZXP61c2oT9hs9LPEGVUlexvM54J+HAYSMb/wAVQGteHlrn/a3+E7fIKOlM9TM2fv2thaMOja3PN/YvNjJA6UvqHkvHKGdOQ+ijjHBJKRJGVoAcHcjR9p2egWYezr2erlx2v8wbVOt1iose91zW8ziD0jYDsXEefRYIhpGupjSzTSP+b/icTnfZdMeyda4uHvZPbdaIB9U6lq7i5x3LntDsA+eOQK9pqY2T73RFW6x1x26kHWcK+zTw+ukelr1WUL72eUSNrbjIZwT0L+Vwaz7gsY9qPsqWfhtp3889KVUzLBHj3ujkf3vdNd9l7H9S30Oeo3WpN4kmvN/qLpNzT3KskfJPO/d7y5xJ3WdKni5xX1hpa28OLhTy0tkubqe1skqLe6Mhpe0M+M+OQFI7K7YuLhjywYKE4uMubPvMLWO03HV9S99gt1wvkULsNZRQPlcSM5w1oJOM4/8AReerbLe9I1NI29WC522SQktbU0roz4YyHAYXRfinrC0djThBZbdpe108tzrJBTxOlGO9e1vNJLIRu4+n9YeCqrBdKXtWdma512pbZBBVGKpY17W7RTRglsjCem+PxWa0i9Xm72AtQ4tTS7uTnPPQ6ikghfbLBX11E5uHVMERLG+eSAemclQVq07e75fnR0luluhDO8eKZhkc0f5IGR165XQPsL3YXTs56ytrpRLLR3GsYQD0Y+CMt/iqbse6VoODHBrUHEq/t7mSqY57C/ZxhZkNA9Xu6fMLCOlT5Wns1lkz1TjzLHTp7TSinsl+ormbXNbn04wBFB3DhO7PiW/8FJ1vDTXdip31t3ttfQUm/LPNbnxRkHoMnr55W/PZs01Jqax3zi5W0kVz1dqSeaSjE7vgghjc6OONhI+EZaRkeACvnho3ifdrhdaTiPbLG+y1ER7llE/nIyfsPaR8QwevopIaNNZz19hHZrGnhLp9zmDYbfcb9BU2yB9bXV/IXPEEQ7xg9A0YI9VK6N4YXltoq7cLLeamSB7u8a1kneMyc/E4D4R6+S3a7M/C636S48cT5bfC0UNslFJTnryCU95yg+gHL9FbvFXtpQ6YvOpbPZrVRRUDTNSyXOWcte6Ugs7wY2ODjGfJQS00YwUrJYz4FqvUzcnGuOdjUW1W2joqR1NWRmspnnBEoLg3fbcnJCvu0aEumpqKF1u01VXG1Q4EYhpHPjyPHYYwPD6+itjSd60+7Udnku9Uw2SSqjE8pyWuYXb9PD+C6Q63/O+GxWWbhmLTJbY2cz6Z4GJI8Dk7sjbGM7fJQ06dXc0n4eXUtXauVPLFePn0Rz/vtEbczlqaR9PUU/SMxkPaR4Bqq9CWnUOq3zTGy1FXWxj4WU0Dn8jD0xgeY/vhZt4oajfxg4l6X0xdNF1enL++s7mWoeWu5ocbkkdRscHdZP448Wo+zfZLBYNJWKGoqqsOOCQ1kMbcAvd4uLj+4rOOlilJyl3V4+Iesm+WMY9+Xt2NUr9a7hb6gUVfQ1FLM7rHPGWEDz3ChL7py7Q6Yc+O31lVRxSNnjrGxOe3DXjmDiB4Z/A+WFvDrE03Fzs/jUNdQxx3EUjqmNw27t7SQcHrg4OyXG/w8GezLBX1FBHcHw0MYNHLsyWWZw+F3pzPOfQFTx0ijLr3cZKUtY5Jd3vZxg07qNJalqaMXB9kr47SwZ94dAQx+/XPl9VHz000/KaZpbUZ2YxpPeehAW9/AbiRW8VtK3Ge7UVPA2CUQARNxG9hbnGD5dFYXZs0PZ3N1DrmWJstO2tnit7ZG5EMTDlzwP2idh5cvqslpU+XklsypO6ScnJbo1aGn77ByPudorKAynlibLE4B2enKSBn7lUXXTtXaaMNr6KeFsx5GCojLeZ31W1Gg+PTOLuvvzdrbJD+SXyGallOS9ro3BzXHPyVj9tyohvuo9P2J1TLCKOmdVuEEpY7MjuUZx/9M/evJ0QUHNSyiFWPnw1g13tVB+Rq2UVU4e+oI5ZHP2GP1VKV9ZFTxFoexkh6PcRyj13UNdbHSXC1e6VTHTQ4aAHSEEkdDkHKijQw0dALVWQNfE8csbpCSHtByG7+P71UUeZkjkt2ypq5qa1xPqKaWN1MPiky7Y+ZBzsUVJT0VNFAaWKGNlOBh0bW/D8sIrXKQKUesilOqqOAETVIb/WaDgr6pdY2txfG2tDAOvMCMrw4d22lvMUwqaeOduARztz9yvYaBsUzSXW+LmHiNl23F+AUafVyjQ8R2wUeE/xPqNTpYTuXe8Sz59T0Tnju66JxHhnCqIdYRcnJ71E7PqFLVPDXTpLi6jc09cNeQFAV/DOwySFzBPBjoGvyFoHwiT6M30ePrpJFRLqBrnggscPMFftbqKipoWmokZC5w25j19VBTcPaZriYaydgzsrW1VaKSz1VHHcKx76WeQNMjhks+iq38NsphzM3PDeJUa69Uy26/QlNe3SOrtTaZh7x7nhwLemFjvnDBy45T6rMY4VPZaJLnQ97XUMcTpXTdQBjIWOmaYqr/wB7U0ro+VpDSHuwcrHRylCXYOO5a4twuqWmeuqtyljJANO5XrRVPuNdBOzZ8bw8HHkcqXk0Pd4NxFG8dNnhUkmk7wx4HumSfDmG63XYz6YOD545NydWU1XrKk07daaeLu5aeKQsGA4tOOb6ZX5xD1hc3aCvMcluc800Ya2VjwRI3YOIHhsVYGmdZfk3RmmIah5FdSNdSzweIjzsfkp92oLJU2S6UEVWQKqB0bGSEn4yCP3qRUOOXgklbzJLyMEW3Rd6PDqofaZYe/lnmhbG8ZJYSSMeu6sm1aYdZYbRp+pg7usfIX1EYG7XvOMfMN5Vkue5Vem9BUFFTT8lzmuhphKwHDW9X/gsX3TXvuGqn3+ob38cdS53IT8RHQFV2nFLJi5c26L/ANXmCjulLQxOLKSnpi50RceXAPw7fQlav8ReJNRf71Tspi+mpI/hMAdlrt+p81lO8a/h1RR327RB0UYi7tjT1G2P4rAtdRiqYHtb8XUOChjvNykZuWIqKL1t9aGUVTSsAHfM3I2OBuvuzt7yWRjHFrW7Au8fVQdFUdyyncT8WBnPRXBaatokkc5wDegUsmsnieS6LXoK68Qi+2WimfVVDYy55ZsMDz+uFtZwM7H9u0xao63U7RcLvI0YiaT3cP8AaV49ijSeLHdLzLH8VTII2uP7Ld/3rbWipw0gkZwuY1msn2jhDZHbcN0NSrVtiy2Y60fwN0vpW5uuNNbYpLifs1EreYsHkM9Ffw0JQ184qatjZZPDI6KcggaTnlA9V7mtjgGMj71rO0lJ5kzbuMIrEVggn6EsoLh7hCCf1g3f7+qpJ+HlocAW0zWkeIKrbvrK0Wlrn1lzpqbl3IfIAR815WnWVqvzOa3XKkrQOoglDiPopIzsW+5WkoN4ZYmtuBdk1JC4imZFMOkjG9F66L0pV6UgjonOZNGwhodyY+HyWShMyYKndTBz8r30qaXLJiOngnmKwyirKJsdE57ITI4DIYwdSsA8R9D37VNx95lo5vcAN4GHL5AP1ceA8/mtnIIQWD0XxNJDFzZA9FDXZyvmiZThzrDNAbBwH1HrDiEyouttdbrLRPBLXNIyAchgz81me+2V1tm97kiAbEzumNI3AWatUant9hgfNO4NHU4GSVgnXHGPSsscokuUbZerWHwVzntvkn4FVwppT8zXHjVKa2okfgku5sDH0CxNpekiprhHLL9hge9+eh22wsta+1JbtSd4+CRjg1pDS0jcdVhyXUFPbsiUgNGcDC6PT5UEn4HH6x8020T08jIKdjieXmHQnJOFj6tuuLsTvyPf0C/LlqyS5Vcnc/DTt+FmPFQ8DZKy8w43axwc5XG9slDGTPFjPeUTC4fFgL0vkfeWqoHNjDcrz09UMrKCJzMAgYLQpR9OJWFrtwfArXSluTc2EY1o6CprZCyGMyPHxYO2yyDaI5IaOKORndvaMcvkvynhZFWuaAGnkHQbkZUgGZeMdVi5bGcXzNJH3BSTV0vdQsJcfHwHzPgpaHRh7vM1Thx8GNzv81N22gjtlGGkAyP3e71XvPUcsfToVortdPmcaz6rwz+HNPGmNus3k/DPQse66cqLYOZpE0X7TRuPmohxJ2z4K+prm1zH872hoG4PiPJY/vFW2lqpncoiiJLmZ8B5K1pr52d2fU5b+IOE06HF2mfcfVeR4VE/dkt6FQF9p46gxueS1wcMnzCTXN9wmLYcjHUt8l41bj7vEA4OOQXEn8Vs+hxKme0smGEsO4G3yVp3i/yQVfdRPGANzjOVK3GrkhoZnsd3eG7FWM6TvZMk87ifxU0FnqZp5Rl/g1WF2s6CVzsAsfzkAYGR+5ZCvFW336qIIFOHnIzgZyfBYx4G0ksOsqQl2S+KQFpGcAjdZLqaKmZVyUToGPhc9zmGTffPRaPV4V+V5G00zzAphKA4NL2EY+yOuPP1xlU8lXGZ5ZBI17YRyvAPQeZwpB9HBDUtjDWmQtAZIR8TB5Er4DIqaodRNMfLJkuwPPqCq/MWFHBQC5Qmn9/HO6H7MZa0nPr0+a3h7GfaZ05bNJ/mBq6pjtzeZ/uNTUgiCWN/2onOOwOSevXK0zZgTmkDv0LDnmHiMAgfvXlN8NRzNcAwbADplTU3SqnzIjsqU44Z0Ut/Zq4HaJ1K7V1RfxJSRympjoq24xOpI3ZyNg0OIHgC4+uVhztO9qyl1Jq2xRaWpRVWqw1rKxsrj3YrJ2OBGPEM2IyR45WpEk5Y4SeLPiz6DcqqjrPeJZBOAQBgY+SmsvbjywikmRwq3zN5Z0g1/b+HvbB0DZpBqqOzVlG/v2kPZ31O4tAkjexxHXA39ARkdbN40catGcBODEvDjQtxjud5mpXUpfG8Sdy1+0ssjhtzkE4A8SD4LRGOV9NMGyDm5xmN3gMeH3KkqQ6Wpl7x3RmBt08d1k9ZJptR3fiZR0qTSb28jcX2eGtrPaLbxCtV+uVNboKmWlkiFVMI+8yyRsmCT/krz7bvGCgq7VaOHmjKuCW1UkbZah1K8OjcQMMZkdcDJ69SM9FpdQVzaOSvqCDIC9uGkHIzkEfgp6klY4kl7DM/ctackBZyvkq+zSMFUu052bt9lnibpTWvAWThffb+bJXsZPBT1Lp+6kkjke6QOY44+JpeRy+QH09YuDPCTgZpa61et9bV2tKmXL4II7lPBK7A2YxkU+STtkl2PlutFY6umm7yenkjeI93BrhgDHj5L1j1JQ1lNJJTvLoYx8cjASAR1Gw6rBanupOOcEj03ebjLGepv32U9c6V0ZwJ1HeBX0drrrhWVtdHb56ounja0FscZL3F7sFpwXHJBWjs9ebjWTufEHiplfK5rm5aMnJPT1/vuof8pUvuZrYzKWAFreSIk5+WFUm9RxQNmjgqZ2ScuGNi+Lf08OhUdlrsUYvwLNNar55J9TLHBVmi2ayo6bW1IJdOPjMbyyV8fcu/VeSwg48/vW52keH9m0rqigv2juJrbdolgEktj95FRDKMYID3vOAfPGRvv0xzpr7xJT0bIYrdPUyTDEoaWhzAR9k56eqrveKi201O+3W01FOG4lp+9DSwY8CfPdZVXKpYa/AnS7nszcXjbx0sw4xaYvti5LrDYXclRLEQGzczviaw+OBnfospa20joTtEwWa/RakZSGmjLHOiezmMZPMY3Ndu1wP7zsfDn6+7183u01JRxSROOXB0uOQ9PLfxUhJW3CSoi9yfCxvLiYvJ3B64A8fIrF6p95zimmWFoovkVcsSRu3xP4kadprDbOHOlqiGpjnfFSVE7JP0dPAHDmy7xJ3zj1UV2xNW2qq4bWmxUFdBVtlqBI8U0jXcrYgAAR6l4+5alOfd/fGSUNZDFGP6UPiLnEehzhUurqu53Ole2GtbSxwsLn/ouY83hv4bLx6qc01hYePgjH0KuDjh9M/Fm6fCXVVl0V2d6mUXSmbcZqWacQiZve87m8rRjr1wqLs5cU9PW/QlVpi/1LLWxr5Hxz1J5I5Y5Nz8R2BBJ6+YWoDLXVTwUcsVyngi5G/o4w3Dth1JC2R0Fx/0p+ZUOlda2BtdTwQtpzVwRtPetbsMjY8wwNwVap1Ck474wsGs1OncHJ9cvJlngbofQdh1XdKjTF1lv9XFEAakua+KBjj9hrgN3bbrWrtNX1moOLmoKqCZrJaOQUkTs/8AVtDXNO+45g/71kys7TOj+Hun6mg4fackhmm3MswDQDjHNjJLiPLK1Y1BDSaumkqa3vKmd73SPfzuaS4kk82/XdS2yjyqEfoUEu85FRZtUe+gT1cbKUtOAx5Hw+Z+q9bxc4qilcKiWJlO4/b5sEHwIPgoio01b7hBCyaBhjgHwFx6ADofML3itdPUw+7y08fu7CBHG9oIcAAMgeX9/FVmop5RIlndkbFd6e2U/LPVM7hxy2pMgcH79c+aKXqLTSSUggMEYgb8QZyhrQR4/iisRkkjDlb3RaXZ11BNdX1kMpBfBG0AnxH9ws/1rIjRRzQxhhJw7Bytcey3bJqq6XKrlaY4nxhrWg7nHitiLbWxvkkp3scwO6ZK7u2dk2pW/tGipqrhmMER1RgtJ+9W/WtGSPVVF81xpux5pK67UlLWlxHdyTN5vqM7L5twgvjA+mqI5o3DmbJG7mafqsFNJnjqecETgx5z4LG/GG6x2iz0d0hgFVU0ryX08n2H4cMb/L9yy+y1e8NlZzAuZ1Vj624f3fVVjqIrXbJq6QOw3kbt96oa+1Kht+w6LgNUo62LSzs/sUtBqur4m8HINR0JltFVQyupbhSU8p5Cw9D4Z+qg9EuJjqW+AIPz6r5sAvXDi1X6xS0T6Wnr3jninj5fAE8ufVe+gaeSpbWua3mawtyfLque0VsZ62M17T6TxCmdHALqprxTT+KLjwHDfcKnnbvtthTDLbI+BzmtLnDwCpH0Li1z3YY0debZdm5ZPjKTwRjJXB3Uk9Aq6GmdPPGDI5rnEHY7qoo7aB8bm/D1BXjS1HfX0tbju42nBHyWL7xi9ilvvGS01uirvY6y0RNuVNmOjq24PxE4Lj4g4zutYNVSulfO1rgQ1rSd9t1et5l5rrWtzt3zx+KtjUVplnoKiaFnM48ocQM9CtLPEpNGxrwomJ9Q1NXQPEEc0scErcua1xDT8x4q+9BWE3e320uYSyXvxnGdxhXdqDg1U3KmoZIoS9z4ubbr0B2VZwqohDQacYRgiatbv1+y1R4xsZeJiaridTVEsR/6N5b9xV0aTpGVrZGOxzkgNAHmovUEHd3OrJxkyuz96vfgTZfzh1rZaMscY31DeYDyByV5a+WDfkT0wc5qPmdFuAulRpTh3aqTlAe6IPcR4k75WU4G5IUNaoRSUcETWhrWtAAHgpuA+K4G2TnNyPpkIdnWorwKuSTlh5RsVA3allnp3ta9wLvFTYaevgvtsDZW4Kiyz1bMwjxV0TLctFMo6Oy+/ujmM08McxilnHI4Nw/BOQ5wOPTCxjwM0bXR6nssNdYpbM+hieysrC90bZhvyuLTnLskb9NhsttZKJ4BIc048HBR1RbQ9xJijJ8wFsqta4R5GslCzSxsnz5wR1puJ96qaLvhM6ABzX/tMJIB+eQrmoYTKMlRdHaooJDII2seRy8wG+PL8FLCp7tga0Y26rWWzy9i6o4xg95HinjO/grVudxe6UtB8VK1k7+7ceqtSVzpqvlHUlQrOCSOIkZqHTA1RA6GoDnscMYHgsP6t7KVtukTpaaokpqg5J5jzZ2WZNW8WtNcMYoIbzUu99nIEVJTs55H5IA26AE7ZJChaDjvpfUV1q7efe7fWUxLZoq2nLAwg43cCQPqrdT1NazDOCna6LXyT6mhHEjhLfOHFdUPdmop+Yhr2g5HXA6LAFzfUV1zkEnO9+cEeAXWLXdnt1/t0x7uKo5mEtcMEHI/Fc1eIVHHpnVF0ohGI5u9d9kb4Jyum0Wpd/dlszk9fpfR+9Hoy0mUwiZHFEAXDr81dFp0lXWmg9/nhIjmOWnHQefyUpwh0DU6+v3dtb/i8PxPefsj0WdONGm2W+sit8LWxtbQwnkA2BAz/D8VZt1UYWKnxNcqW4do+hjXQcEhinfu2PYDfYnxV2Eb9MfVeNpoG0FBFAzflGSfVVhDW7vIa0DJJ6BV5y5pbFd77EfDGXXCY4zhgGc7jdU1y1VQWGRrppeeRrs90zdxVt3vU1RVXOSC0uc4SAR8zG/E75KQtfD6K3Zqb1J3tY74jSDfk8fjPn6K3Xp3P1iJ2dlLmXgVNRxD1RqIiKyWsxRH/pmsMjvvxgfcvx+ltXVzRNXV1ZzE7sIdgfQDC6M9hCK3XLT8NE+3Ur4o7a2XDoGkcxlcOpHXAW2/5r2dw3tNCf8A9Oz+xXZaCnSyScc5SfzNlrdfr7lHmteGk/mcTLNwyma1s09XWY/WkfGWjPlg5XlctF238qMp6ysrHR5Ac7vAOU+Hh0+XmunHbhoKOycAtQVNFSU9HM2FxbLDE1rht1BAXFKr1Jfa2s2uVQZHOyZC4/C3fzVSmym2yyHJhxePon+Tj77dZdc4K3aP6ZMwV+gYjd2UFtr4pScuDMZ2AyS5w/ioS/aXu1rYxs1vqAJX5Y6OMuaRnzHgpnswvvGr+J9HaWtbV0cUZdWOMeS6MdWjzLncrceOV2u0Hw5obDpG3UNfQUdVVMjDpnPga4B7iXFoyOgJwPQBWHoo9mrm/HC9psNPTqFF22y2zj3+fy2+ZwrutmqHUb2PopmsDehjKsiotj6Sdjozl3NgNev6Hbxo6xzWyqabNbt43bmlj8vkuGfHe2xU/GPUHcsbDG6sdM1rG4aA8B+AB0+0tc7VC/sPHGfrgn7bFiqx1Tfyx+p58F5WN1kzmGXiGTYDfPLt9Fe1Uaianqe6p5qiq70h7mjDmuzs442x02CtTg1SNdrVjwBzCF+fUev3/gupfZG4U0lpsdRWVtDBLgCJwlia7mldh7zuP1QWtBGyijo5aq6c84UUvm3sjdaeWKpT8jm5DPXjv4pLbPLINpHcpyDjblGOmOhXnDT1rI5mVdI+OoDvgeWvy7yPQYXbE6WsoBP5Ioc+fuzP7Fr/ANrrV1m0DoWalprfQtr6wGNgFOzO4x5fMqnqtPHTQ7RvO6SXvIJ69xW0cttJHMuWeaopGQskiZXd4O8BBdjfqBsvGZznV8cElX3LBzB7XM3d03z0/BXG50QfLI4ND27OI8l6Ur4ZpWEcuXNy0nHRUcpdDaxzIiaOnc6qdTmqdURHDmtZGMjfzxk/8FUOsNUWSRvkrHjm+GQsLX/IYA/ctuOyLwcF9u8V1rKcOjfiZ5ewEMgB2G46yOG39VrsFb0M0vZsf/ymh/8A9Zn9i3C4bJ1wnKWHJZx5Lw+fUhv1CoaWN2cY3aafc7f3E4rjCzdrw5zXu8iXAbqPvFkbHiSqp5WdzECxzy4E4H4ldrfzWsw2FpoQOn/wzP7Frh249J0X/JNW1FJb6eKaGIuaYYGgl3M3G4GenMqmp03otfO3ndL5spy4iq8Nx8Uvm0vycz7HZ6WWqlrDE01LZHAPOPhBJOwHTr81Px2sQzyVAjZGx4HeObGA4+ueqibFWhtTVxQsfJExwMpbGQMjIO/n029FcFLeI6tr4oYJ3uAy0lmGv+RVSyTz7DaQjsftLSwBv6BkR5j/ANG0BVUlnnhjMkNHI5x25e7I58/RTvBW1uumrqUGklgjY587W1DRjnG42Gdidl1Y0lpC3Umm7ZFPbaR8zadnO58DSeYjJ8PMraafQO6j0hSwstfJJ/kwvs7GCk14/v8AByOpbVWzxtdLRy7DZojO3/FUc9K+kdVNfG6J0zRG0cuCDg77Y6brsk/TlojY935LoumT/i7N/wAFzP7VFZNqHitURWqmpO7p2BvLjuwQ4ucMco3IBx9FS1MY6ayEJPOcv5Y/UrU6123KiMd5Jv5f+0YtoG95s0Bmepcckn5qfgoaj9G9keI27NxuSf2iqf8AIFwqI44qSKm5Sfja8EnP9XH4Lbfs69niqqZo7nemjla0Ya5ue78xvsX+Z8Pn0yoqnrJ8sNorq34fvyNw3Givmm9zWGaz17mCakpnxv5vjidGeQjzHkVJ0mn6iZpf3MkbTn4e7OfqfvXT+DTNrp4GRi20ga0AAdy09Poqa8RWKxW+atrKSkgp4xlzzC0fIdFanoezjzSnhI1r4tCMW5Q+pzNuNDVUsDWwxOjqTsxzwQPr6Lyktk77FURmKQzcji98cfV2Bv8AuWceLnEOm4magpKS1OjpbTFMM+6xM5pRncZxnHjstkuBOm6Y8P6eorKOnmlqJZHBz4mnMYcWsxkdC1rT9VDo9G9XXO5SwotLp1zn8IuPVSjp1dOGPZnf2eHsNA6ahnq7RTQNgmIIAJDC3GDt0C9KmyVDYWDuJGMb+sIzj6/38F08Fgtg6W6lHyhb/Yv38hW3GPyfS4/+i3+xXI6Dk3UjU3a/tU1ynLiKjqKZ3O+mkeGn4AWHcrwntlRTkSCnkbnJe0txzn9oeR/f+7qWdO2o9bZRn/7Df7F+SaatE2Oe10b8dOanYf4Kf0Rt55il2yxjBy6pv00BceaKIHBLwWuyPovG81dDb4A6qq2Uu2YpHvxg4yMf2eS6b6js9jttlrKue00LoqeF0hBp2bADPkueWtxT6j1ZdBJQtd7rKIHNfE0MLmNDC9o6cpLScjzWsuaqu7Lrtl+zw/BhC5Ts7LHhn6r7/gx/PqekpWRT1tREymeAY5jnlftj9+dkVwV1no6mn7mWGMMGOUEYDT6IpYuOCZmQaezUVsubvd4IoGTgn9EwNGT8lh3jprS4aJs5pLMySW+18hgpGsGXN8349B+9ZgqKmR1ppZo2l8kZAwBknwKt2ltVFc+PWnZq9re9bb5XxxSD7Dg4b/cV2GqudVUrOuEQ6bSrU3Qq6ZZp0ey1xWurHXKosFTUGX9I95lBkOfEgnOVfHAN+qOHGtm2K92+spqGryzkqGlojkAyCPnjGy6Puto92BbggjwWP9eaPgvNMHSwtMkTg9ryN248QVzFXF5ymlZHY7if8OVKtuqbbRiyhe736rb4YKzFwlDKjTMbM4eC7p81iqKiNNcpANwep81e+hLsbRVe7tPK0nOP3rZcTfaUOS6dTV8FT0+rUH1eUXBxB4d0erLTPTVMQJc08kgG7T4HK1osnD6t0ddLvQ1bgQ7DWHP2gNwVuVPOJqQkdCMrA/FqndBeqWoaMNlHK93yWg4Ty9umdZx3UXfy+UE9n1MfWypEFWWu22IBXmzaaeKWF0jJDnA238FK1Oma+le2okpJWQuIc2QsIaR81XVVMwBs+NjjmC7yNkZvuvJ8kdU4Lvpot6oaaOz1pflgLDyDO4KtjSNPJLUPdzFxcCMuOSFLasuZrp4qSHZpdjboVV6etnuVS7I6N8FKmVLfYa6Xxror1WsIALZn5+8qosgbNcI4ZsGFwJLSdumV56pJGo7jg9J3fvVFLVNtlnkuMgdlkoaHAHAz4HwWlklzs2EPVRsbS6qsWn7BbayaISOhh5XRsIyeaPrv5LBHDZrawWDkGeWqrsgeXICFZR4gROiML5ZHxgENa92wyr64OvhZR2yQEDkmrDk+sTf+KxzjYmxjqYm1Gwuu9eMcw754/FbD9h3Rk101tUXaRnNS0bMAkdHFa+X2Vr7vXlp6zP8A3reLsIWdtLw5uFfykGorXMBI6hoH9qpa6fJQ8eJtOGw59RFM2hj+0B5KUo93AKMjGTnCkaU8rgVxTR3+SYfAO7DunmkLW+C+Ypu+aWr5LTG8AKPY8PufA6Kgd1Kr3xF4XgaYgnIWL26DYpgC70X5IN9zuqicspo+Z55QqFs/evJULPVsfb2ZjcDurWqH9xcSQFdjweXKtS8tLa0OxsQinjY8ZiTjTwTouJLjWmvqKK4NbhsjcOad8gEFWrwx4Tnhxbbq+4SzXKvrGmMvDPga3OfHxKz+9glj3UfPbWPB6/RWY6yyuPK3sV3pq5Pma3MLcOqa7UDKq31j3yUzZXGBzuoafArT7tN2WKo40VdPF8LWxsDy0YJ2yf3roXNbWW+V7g3APVaSXi1f8oHaHubXs56aGsLpXHbDI8bfU7Lb6C1NysfgjRcRi2o1+bMm8JdM2/QmkqSjjaBVPhbPN57/ANmVR8dXtk1QwsOR7hEdvksnQiFuPha3Ax08FiPtBVRg1riMYc6jiBI8Byqjp5yu1eX45IdTBQ0/KvYWzSvDI8vIAAyS7oFZl+udVqmtit1tY+SN7wxsbAeaV2cD6ei+bteJ5YvdhIeUjL8ePorhjlZwtsMdYMO1Pc4cxA9aKAg/Fjwkd4eQ+a6ymrxZzUngFlv4YxGjhMdVqZ7cVFVsW0merGf1vM+CsC8azlDnxwOJlJIdL/Z6qEuNxllme1z3OLt3OJ3OVFSSHoeoVzma6FZwT3Z1R9mRdm12k4+Z/PMIpYXEnJPLJzfxW+TTkLnZ7LiqjGn6WP8A6R89YfngRroo3otjq9+zl5xX6fguahd2p/8Ax/LRrb2/pOTs66j3we4O64nUlZFTioe9gJfloLuo6AY+5dpvaHuI7NupsZz3HUdR8QXH3hTokcStf2GwU8TpIZpA+qcDkMjbvIfX+1c9oa5T1F6j1cl/4o56MJWaiyMera+yN+PZk8A20VCdUV8fPJVObVuL2/qNP6Fp+uX+YIauk7fsj5LH3BHQkGhdBW+kjgbTvkjbI6MDHIMAMb9GgBZBGwW+1UlzquPSO36v4s312IYpXSO3vfi/n9MFPXAGknB/YP7lxT7RdkpYuM+oWPi5i33fG5xvTxZ2Xa+qHPDI3zaQuM3a4oHUnHLULBIGMcY9m9SWt5P/ACLQpJ8QXMusH9JL9TT259Jrx/jL7xKbs4aTN14lUktFDltMwyStbu55yAxgByMueW7HrgrsNoTTbNJaWt1sHKZYIx3r29HSu+J5HoXE4HgNloz7PHg+2Lur7VRc5eRXOe8dQMtgb5EZ5n+YLQugvLyhdDfFUVRqisN95/hfL7m7l/TojXneXef4/L+J41tZHSUs0sh5WRtLnE+AC5f9qLixR8SeItbSvmElFRPdCWZOObx+4beYJcFuh2ueLUXDHhjXPbK0VtU3u4oyftOOzW/U9R+yHeS5PWm8yyVs/fYqXzPfK6V4DnyOJyfrlcpfTLXWSlH1a9l7X4/JYXzNdp7Yy1act1D7v9F935F11FLY6qGKJ8LJY4ccjTkgY6K59BaXpNc6roqangzIzeSdseSyMHdoI8T0HzVmy81O6nl9xe8PIDiMfo84wXHO3VbydjDgq2ma29V1K1r/AIah+W7HO8TPoPiP0UPDtItRf/U9SO7/AE+PQ63niouT6I2c4R6Gj0RpKCm7psdVMBLMANm7YawejQAPDxPir4B5ev4IPgWI+MfFU6Yrae1UUrG1sjHSOBdghrRk4+n710k7XbdGL9abSXx/CX0OcnN3WrPWTSXx/RfRGXQcrDnastLbtwivEbmlzWQSuIHie6eAPvIWXaN/eUsTz1c0H8FafF2gbctCXGB+eQ8hdgfqhwJ/AFajisc6Ofsw/k0yjq9qJvyWflv+DjzZKhlPSva8803MAW46nJ2H3qtpaUWqSWcbRvy9wZvynGdgoazQVsV5ujKxzY44sNjb0cBjOVMUkNfM17p5KfIz3Xdg/TOVopLDZ2UHlJmeey5Ynam1TG+Rv6OaWCmMJaPha5wcXfMcv4rpm0YaB6LRnsI6SqYJ6KorHNle01NaySNuGgfDDyHfrkkhbzDoF2lcOx0lFXs5v+5/oka7iE88kfY39cfZIh9V3D8m6duFRz8jmQu5XeRxgfiuVGsbs7UfFC/Rc8jI5nfo3MJcQQ7GMdDsei6QdoG+/kXhzcHBxDpBy4AyceY+uFrh2b+y1NVaiZq3UL5DUEbRkfDGTg/V/r+rnz6cxZRPW6+UY7KKSb8F4/oVOHTjC+y6fSMUvm8v7ImOzpwAqK18F3vMRge3cMI/ov8A/s/h81t7QW+G200VPTxtihjHK1jRsAlBb4bZSx09PG2KGMYaxowAvm5XOntlHJU1EgjiYMlxXQpV6evkhtFfvL/exjqdS7nmTwkeV6vdJY7dLWVkrYYIxzOc44WmPGLjyeIVY6jts4baGFzByO2k8/nkeP06Zz4doHjxPxAuD7PZnn8ixPIfLG7aYjw9R6jr4bdddrjpptru9LeqSUtMZxJTOlLYnNwRsOgOD+HquU1mp9Jny5xFdP8Af4/U2fD+HubWovWy6L8v8Lw69emStKR5vgkpXgPZG6QRAZ70gY5PrldCtFWdlg0pabdGMMpqWOID5NAWgPZ20/Taq1tT18J733irhgdyuOY+U95ktztnlx9V0WjxjA8F1ejr7HQVxfWTcvlhL7Mm4rNcsYrxf26fVs/XPDASegGVbVXxO0pQVBgqdQW+CcYJifUNDtxkbZ8lWayuDrXpu4VLCBIyF3JnxdjYfeufWraOiqtUVVyFLHNVF5jikLfiLQMMAP8AkgLVanXui/sYxztn5/8Ao0Wmr9IudfRJZfxeF+fkb5u4taNZVspXamtgqXjLYjUt5j8hlflXxc0ZQTshqdTWyCV4y1klS0Ej71z3ZYobfX++1UcVS7/rO6HPB8j1IXtdYaOcMlkp4ZZ3fDGXtDnfTKiXEpZ9U2E9CodWbo8WeMOk6bSFbFDqG3yzScodEyoaS5mQXDA825+9aH6nvlNbne8SVYp6qRxIe9uQ8nfDvv69d16z2tlqkErIBUUzjzSfCHPYf2htuOmyrqiWJ9G2RginLzlgyDnPRUp4sudz8cL5EFeljXY5p7tJfLL/ACWrX61twpI/epPdZCfjaGElvj5ePgil57VCyo753KJy34ngDf0RSpLGxO5KLxgy7S0sVGAGYAx0Cwjq66Pt/ai0S6V/JTzQOga7OxJ5tvvwslVV8qo6yUSQ91HEOpG5WqPGniSKfj5YqyRxFPap6c8rNsfEC4/cV0OolKyuS9hu46f0aULPajpjbgX0LPLChr9TNdBKCMjBUtpesjuNnppozlr4w4fIjIVJfIHGN4AzsuQXd6o7emac/eYccyP3qeGSNvPG8gEDfHgvOlgdTXWA9Q44VDqHUlJY9bRW2q5o5a4nunEbEgdFLSfBX0x3HxeK38puzRyXsOTVar4imvMybQyPfQgY6BWdrPT8d7moWTNyGTcxOPDbZZDsFM2e3MdjfG6pq62xvqGcwB5XZC5rTXOlqSOp1UIamLrkRtbCHU7Y3MHdhuAzG2Fg/iL3GlTIxuRHM0mJp8PRZ+ukWYjgdAtf+0FQvlprZKzGA57Xfhj+K33CbUr+VvZmm/iCqMtF2iW8fsYnt07X1LpHnH7JCuW2XNs0pHgBgHzVqU8PcRnPUqWsco7xwP1XfcqSPjMpeJgzVLQ/U1zA/VqHfvUJqe7mj4e6hoCcGZscsWBkhzXb/gVL6plA1XdCBgCocoG40Ud2op6WZxa2UFpI6gLRz9aRva/VTMCieYPae8cTnzWZOH2qBa7bRxuJw2WY5HhzMAUFVcLIKZ0EsdVK4vY+UNOCMN6qDfVG3VEcbDjl64WEUSvqV9TVOkuNQ8knme5xPnuul3ZCtZtvAywFww6oEk59eZ5x+AC5hCrbLJ1+I+K6xcAqYUPCLSEHLgttkBI9SwE/vWn4m8Vo3vB4rtXLyRk6AEhVWS1q8IdvkvcjmZsuUe52SPWiquWTcqQE4c/qoHPdvPmvRlUQeqjaS3PS4hMGtzleEtS+bZqj2TlzdyvVkvIOqje5g5YKOok7+sLJDlrPD1UhBFA0Ad43J8MqDrqaV9S58Thh3XKthnDdv5yS6jkuFW6u5QyOFspEUYH9Xpv5rKMUTYWOplCeOnNMSyQOPorO1AGgtOdwVC3zXcFgaPe5O7wPFpJPyACtz876nUtzgjjppYKZ+Cx8jcc/rhQyPFBp5LrL+VoC+HyZC9Jm907l9FH1EvKPJVctssqOxF6jkEFDNKTsxpcfoFpPwmr4LzxG1K3vXRVdUHyRSt6gB+/8FtJxk1lFpvRd3qXux3VO8nfrstI+zpUVNbxDnr2RPkZHSyPMbMc25GwyQF0ehhnSWy9hynEZJamuKNsILU6QyBtRNE0s5QBg8p/az5rE/aI/xfWDfiJIpIW5PU/CstMqZg57RFJkR84O2Cf2c56rB/Hm8R33X8kdM0l0EMcDsb/GAMj6dFW4WpT1Sx0SZHr2o0FoaRoqcSVN6uMfeUFAA8MPSWX9Rn37n5KztV6gnvVzqq2rf3lTUOLnOP8Af5DCu/X1SLTDSWGCUBtIzvKnGwdMRk/d0WNKh4meXLuenQ5F95lLJk5PgqGaYMHxBVlRIGAtUHc6ru4wSftbBY7s8aOkfsra1lXKxwJ5qeaqjxnb42sP8F03b0XJv2TlU83i6HvDyNucbA3P7ULs/uXWRvRbTU/8dP8A9fyyxf8A8dXuf/lI1g9omf8A+G7UoBxmn/8AM1alezF4FG6yv1RcKX9HVuPd846Usbt/TD5AB8mEhbndtzSc+u+EFbp6mcI5bgWQ85/UaZG8zvXDcnHorr7NfDem4ecOLdDBTin76CPu48YMcDW8sLd9/s/EQehe5avhf9KWpv8AKWF73FfZfXBr9Euzuv1D8Gkve4r7dfl5mWefkYNuitqz66pb1qWa004DzHDJKZQ7b4XhmMfMn7h5qH438R6Lhbw4vF+rp+4ip6d7ucYyMNJOM9TjoPE4HitZ+wPrq58QamS+XKRpkq4K3MIOe6JqWPawejWFoHoF7pZekamyrwhBt/8A22x8lnPvRJR/WvlX4Ri2/f4L6P6G67hkFclu09oyS/8AacjtLeYisJe852a3v5sknyAC61dQtMbjwjfqntSyXOZhdH3DaRv9Ud5JJK7PgeVwG/XmUVMFLidOenLPPu7rf0RW7LtdXTF9HzJ+7Zv6I2A7P+iotG8P6JjYe5lqQ2VzcYIbgBg+jQP3rJVTOynp5JZHBrGNLiSdgF+RUzKeFkcY5I2NDWtHQAeCw52peLVNwp4XXOvfIGzvjLY253J6AfUqXiGql37sbvZL2vZIn1eoxzXY9y+iX4NBu3Lxbk4j8TTaKaf/ANn2kk/C7Yy46EeQb4Hxc7zWuNNI2Vo5cBzTloHgV83m8TXO4zV80nezVEhkmfnclxzn8V5UbH1tfFHSB0jpHBgDR9pxOAG+qnoqjptOqk8tLd+be7fxZS09Uq4pPr1fv6sz1wL0tUcTNXUtO+AzUdK9hmjAyJJCcRxj/Kd+AK6t6E0rFo/TtNb2YdKBzzSAfbkP2j/AegC147GHBSHSenoLnUw/pogQ15H26gjEjvk0fAPXnytpj8BH8Vl2K0lfYLq95e/wXwX1bOg1VjjFU+PV/hfr7/YUN+u0NitVTXVDg2KFheST5Lm/qPijLxJ413KeKfEXu9RS07uuHY+Ij7sfT1WxPbb4v/mvpIadoajurjcMxgsdhzdt3D/JBz6FzPNaOcIrO226+sbn1Ms7BITMHOxzYa45z5ei5qnVKzilU/7YSSXzWX+Pg/Mh4dW7L/SWu7DZe/xfw6fM6+WGYVFmoZWnIfCx2f8ANCodb0rq3SV4gZnnkpZGjHXJaVR8LasV3DnTVQHcwlt8D85z1jaVcFcwSUszTvlhH4LdcRq5q7qn5SX3K2qqXNZU/ajjPrOw+5641RTgvETLpOWOPiO8dy/TGP8AhlUEVRJHhryWOYNhnb5q+eMljisfFbU4c6TL3w/bcSM9xGXYHnzFytbSOkYr1qGgoX99NDPO3vGFxJ5Orhk9BygrjqJdsoLxePqbzROVukqtx1in9Dox2PNMvs+k6uaVnJMyOnopG42ErGc8hB8iZGn5hbDjose8C7V+TOGtreTzOrees7zGOdj3Exn/ALPux9FkJfQ9XhXyiuke7/2rH4NdrZZ1El5bfJY/BbeqtIQ6n92bO8hkLiQMZ2Ox+uPHwU3Q2+C20sdPTsbHDGMNa0YwqlNiqEIqtNRXV5ftfQorZNLx3/BSXG6U9ro5KmpkbFEwZLnFaRdo3tBu11Xy6Zs1f7pbw7lllikw6Tf7I8wcEHzBI6ZzuZrLTzNR6draJ4yZIzy5238FzP1xomHS2s6uKSjaaqGTmZM5uCB4f2LnuIXT7XsXssZXt/8ARb0EYWarlsWcLKXnvvn3bfPJBxXuO3VBopKiGOUDI+LDiPkvlt3ivdc+3iaMtawZa5wJec82APoN151GmKa7yOmmp/0jTjv24a7Phgquttnp7bVB88MYmwGsnYzd2+B8j0/uVqe58Tt4c8upsp2OtLUpv0NwggZEe5kqZCBnnJPI0n1BB8VuVGMBYJ7K2nY7dY7nUsYI28zKZrdssc0ZkG39Z2Vnf7K+h3x7NV0/4xS+OMv6s5HiM+a5LyS+u/5IjVenG6ps01vdUPpWyEHvYxlwIORj6hYZi7IFlE3fT36uqJQMNe6JgLfMj1PiVnvvN/BfvP6hayelpnNzlHdmuqslTJzreG/x0+5gc9kOxOxzXqtfv+vG0+KjD2MNO0tRNVC/XDPKA1pa3lYBk7D6n71sZzbdQoPWlybatM3Oqc4AMhdvnpthVdRTRp6Z2qPRN/Izs1dkYucpdNznRxPuto0RquSzRV81QRjlL4SXZJxvy7KwL3qZliuMbppZxA/7MUcLnAebvIK9NWVElz1RcqiT4szFoIGehxn8FHxiNrwxzQ8EYPOPRaWlvlXN18S9TGxUwdvrNLPvIqpvtFRU8MsjamZk4yzlhLx08cdOqKoLJaEl0UYEDj/Rk77ZOw+iLPPNuiTkS6l66+ra6OpbRxxPjY4ZLw3Zx+awFrDhczVGu5paxw70U8b2EDGOoyfuW9V6s8UwcTG17T1yAVhTWmiBDqJt0gy39AYpGHcEZyCPxWxjrOb1lg7fW8Ot7JSqeYrr5ma+BBc/RtuppZhK+CFsZcepwMZ/BZEr7Ux8ZIbla4cK9eMtNaykjla/PxDDs7LYS2aibcqcEjBx0WjteJtElatlCNq6GBePXDR2pYqWrpH+7XCjlbNDNy5wR4K1LDql9fdIbXXxinu9M3MsednD9pvoVsHq6k94t9QGEF/KSDjxWkunKm6u431Ulwlkke15haXbDlGcD7itpVa3ppL2FWcM6yEzeHSJzbWj+qF9V+BOPmqHQ1UX0LWu64xnyVTe2vjlDs/COhXPQ6G3s2saPCtiMjDg+Cwhx7oJo7NRShhcwTkE+WyzhDIKhmQd1YnF23+/aNuDRuWt5ht0wtloZcmog/aUeJRd2jsr9hqpUO+DZVmnw50kj87DZRtfIY2EDYqv0+/umHx59yvqSex8NeehhDVzSNV3YeHflRLiABjqpnWb+TV11aNszEkKFc3m6bLSWeuzo6/+OJN2uj94q6IyBpiNHMxo9S7r+KwJqBr6e9zROy3u3loyOuFsNYG8zbYM5IbO0/e0/wAVE694YM1U+KppJY6epZ9oPG0g+Y8VR7dQsxIvwqlOGUjBMU3K9rsjA3XXngrUB/DPSpByDbKbcf8A0mrmM7hReGv7uK1yzOG2Y8EH8V0b7PE1ZS8LNN0lygfTVtNStgfE8YI5ctH4ALW8SnCytcrN1wmEoWS5l4Ga4AJY+Vwy09VVEgNVBRzAtGFV95suYl7DrEUNS53enB2Xw2QhfU5zKV5frKs287hleyoAYF9CYv6HKh6987Ys07A9wBOCcfRWS7ivPbZXRVFjqmyA77gj8FLCLfQwjVKx4ismU2syMlJpxA0M6l+wWL4+MUszuU0DqVudnSNJypWm4jw1Qb3zWnl352bELNwl5FpaK9+BcWpLVT1dOBJGCDjwVs2yz0dtmL4mu7zplzicfLK959f2+5d3C15YemXkL4NS1zgWkEHyVSxSiQuNlcu8TwcyWAZxzeqtfUNaykjc4kDZV8ld3TFjzXN5PK9rXfRVYbyLXNhZMA9qXVEldpMWyN4a+tqGxk5/UG7vwChOzdp2ChttwuZDWGoe2NmSNmN8c+ufwXvrXhjeuLGsI2U8zaO026L455M4llcd2t+QA39VfOjNBSabtdRQV0cLnOJH6N2WvZjZdP29dWi7GL7z6nITjK7WOxrZdC5bxc47Vaqqp52fooi8bj+/Va86VArb3XXmscHR2+N9dIXfrPz8A/0iPuKydxa5bXpOYsYWSVDmxF2d+Xrj8FiKWpFt0HUkHElfUtHMPGOMEn/Wd+CvcHqxXKzxZruJW5arLHvtc+skqJ5Xl007y9zj5k5KgQcA53VdcZOZ5GcBu2FHSO5QV0Bo10I6sn5nE9FAXN/enOdmqUrTku3woC4ylrHY6LHxMsG9/srLg+LWctNEQWm6xPk9B3EgH4rsM3puuJ/sr7wYOKV0gwS1r6WUnyy8s/8AMu2DOi2eo/4KX7H/AOT/AFJb96avj9/9kDq3SlPqul92qsGI4DgRnLeYFzfqAR9VMsaIYmtGzWjAC9i0HqrM4ta6o+HOhbve6ydsEdNC53M44wQMrUXWx01MpPosv3t/rsjWzsVUHJ9Fv9F+hzz9qVx/FVWUfD221I5TietDT+oDkNPzcM/5oU37LSrlFs5ZZXOc+51UbWE9G+7sdt9QFzs4n69reKPEm+aluD3SCuqHOjY92OWHPwjHhsPvJW+vsxq5st0gJZJTsir3uYx5wXCSAtzj5tVzhNDpUlYu9KMm37cN/wChwqDVsnJ7yjLPvcXt8NkdQh0Vu2/SNNRamqryDmolj7sDlHwgnLvqcN+5XEEIGFEliXMuuGvmSptbo+ZXhjHFxAABJJXKn2hXHSLVmv49M01Vigt36SYN3Dnfqj7vi+rV0D7R/FWg4S8Lrxea6cRNZC4DDg1x8MA+BJIaD+05uVwr1JqCq1LqSvvF0k7+srZnTyjGMEnoPIDwHgAFUpq9M1W77tf/AJP9F9zWW2c1yiukd/i+nyW/xRItvEBdyiT9E38fn/fxWxfYw4VT8TNeMrRB3lDSShkTiMtM37XqGjf54Wsth07WaivtDbbfGaiorJWwxNb+u5xwG/j1+q7Qdj3glR8LtA0bmQ4kdGWskIwXn/pJP853T0A8CuihVXSne98dPa/D9Tb6WTbds1tH6vwX5fsRnXT1mp7BaaW30reSCnjDGjzx4n1UkWh3Vfh+HcLGnErtHcPuEFdT0erdQttdRUEiONtLNOTgZJPdsdyj1OAtNO2Kl/Ulu/qRSnzS7z3b+fiXxXaWtFzkElZbKSreDnmngY8/eR6BeUWitPwvD47Jbo3jo5tJGCPwWDH+0K4BsODrs9cbWevI/CD0VZRdvLgfc3wMptaucZ5BFFzWitaHvJAABMI8Sse4vIySaWxnympoqOBkMMbYomANaxgAa0DwAHRfTwDnPRROktVW7Wlkiu1pqDVUMr5GMlMbmZLHljtnAH7TT4KWfuppxlFuMluJKUZNS6nKXtmCn0/xjqo5n/FUQuqXNIPjPMB6bNDdvkra7O1wZq3WbPye5z56eJxhcWkN752GMB+ZcQr89pRbJaHibaKqJhc6qM7dh4NbBgfeX/ivzsAaRhuurPeG4mzXRNmc3HJiJplBZ54eGgnbquc4BoYytpsnuoZf/Zn9DbcG1r9HhQ1tDK+EW/wjpzZbZDaLRQ0MDeSCmgZDG3ya1oAH3BVZfhfTfsj5K2+IF2fZdJXKqik7qYRFkTztyvds38SFu9Teqa53y3xl+80l1qhGVs/DLf3Mbcc+05p/g/UUNumqGTXWtf3cULQXcpJxzEDwBWRuHmrma00vR3L4WzPBZMxpyGvGxC4v6z4iXHW+tbpdJK+qk95qXywmZxc2KPmPIPQAY29Fv92FeLzdQWqG2VFSZ3zgwGR4xzVEbeo/ymDPpyeZWWh7S6NsLcc3rL3Lqvz8Da10Qlp//n1+XVL9+BuS77JWnXbK4dyU08Wo6BhDv12tyA4E4cDjyJB/zneS3FPRWhxQ0fDrPR1xt8kYlc6J3I13icEEfIgkH0K1PFtO7qO0j60N/h4r5fU1sbZaeyOogsuDzjzXivispe3DOWVBqJk0rqGScuqWF3OAxzWn5bqT0ve6e7art1pfHJI18v6VoiI5WN6u5vQK1L3QV2kNUXumu80kNLbp3Rtc9uHTZ3ZgDxLSCR4dPBTvZ+rrhqTiHO5jxK6OmfKyPl+GRx5YwzOP6+225C1Og4RLUautZym1v4YePwfSquMU31RVa9fp8enwOnXA+1utnDu2mQATVPNUPI6O5j8J+rQ1X2/wVHY7bHZ7RRUMP9FTQMhYPRrQB+5VU+eQ8oJdg4A8122pt7Sydvm2z57qLFbdKa6NmmvaV42ag0/xHjs9ju9VQsDC97YXYYMbEE/XKw/b+0Xrqpuc0btT3ZtNAwh5IIBkGNg7Hp+PrtkHjB2aeLOuuKE92t1voha5QGd7LWR8wHMSSGE9SMBWpqDsqcbXzyU1osFqZbo2gMdPcIuaR2N3kB22+APT5rgq9Hrp4k8ptZ3bWM/vodLwnVaLT8PhG9Jy3bylndt4+GcEG3tLa0muQpxqK7kjO4e4R/f4qHqu0VratuE1vnvF8qKD7Ejy93d7kjc53BVxW/sfccH1wFVZ7XDTO+25txicQMeABHVRHFHgnxJ4X2Gevr7DSU1gpgXSS/lKJ8r8ZcXcodk4Gdtz4+gkei1cNrJZT9u3u3+xbt1/DXDOEl7kWjU6yjjr2wClqHlxH6UNJbv5nP4qkr9cy26sdGaWpkY5gIdHHzMB8s/JY+i1eZXyVYpHw0rHjn+PIefBo9T6dAo2fiJVvqT/AIvyNjBDWc2dvu/vhZQ4bqubp9TCfENJhY8fYZOreJHubGMbTT1DZG793Dzgbgf2osT0+qa2uqhNHTOZTw/pahwd8LWg5JxtuegHii8fD9RW8NBa3Tz3j09x0pheZ6UHORjIVvXmkiqIJo5GZa4EdPMKh4Sayj1XZo2PePeGNAe3+thXvXWLvYy4t+5V6NQrq1JdT6M5xg3CfiaQ8OdPXTRvFm822rle+mZIZKYuP/Rk5W4ejrriNgc/wwsY8QtCd1eYbxGwtlj+EuBxt6q5tFVYnbH5jZe3vLUzW6aCgp0fEypXM76LbxC1x1bok2viaLkIvgmH2gNg7z+5bK0zo3Uzc7kBWZrmzipY2VreYtPXCyrtcIvyKkYR7WOfArdEyiKmYCpy8ASxOx4K0dO1BgaxudxsVdM0wkgduOipVvwLGoi1PJGWgO+PPTwUbrCJzrDcBjOYXfuUvaXgPJ8Mrx1fymxV7h0ED/3FX6X/AFI+8oan/jkn5Gi92fiqlZnOCpaznlib8lA1rhLXTeJLzupyzMIxnOAOpX1RNOKPiDg8swrrlnLrO6Hzkz+Ch2DfKn+JAEOuLk1o2PK77wrcE2wWqn67N5S+4i47A7MUAzuyZ4+9o/sVzhp6FxyrS007IBxsJhn/AET/AGK6g8uOVzeuX9U3ukfcKS719Vbo4vdah0T53tgLh1AJW7kLhQGneCQ3lAd9y0oqLZJdrnZaZmOWSvhYfPd4C3mnpBNScuP1dlqrWklg6HQpy5my4rdWNc1pBzspNs4IBCxzarw6hnNNOSzHQnyV50lYySIEPB2WvmsbmyzgrZXb5XlzZK/DK13UoAD4qlLqepnqHfCoC/aZguw5gBHKDnnA3KuBjAcL2FM10eMZJXkZuLyiaFjreYmMn6ekpXPbNFzsGwcPJW9ddOwPkLiHxNx+q8jP3LLlVaXyNIB28AVbty0vJUuHO97Wt/Vb4q9G9YzI3tOvj/eYOv8AbJbO18lBI98nXlkcTn6rIfDipu1bQxG6QdxhuG75yFIS6Sp3zh0kfMWn9ZTcXd00Aa0BvL0wqt1ykirqrIXPuFDe6z3Vzm5+qxNq+7NHeuL9gCcnw2V4axu7GSOw/fCw3quO46kjqKK1NEtQ9uDl4aGgnBySoaK05rPQ1d81Ct7Edw+4yNoq+a3XYNFC+UiCoxvHk9HenqsiXqaSonc+jqWgOjaY38vM35+q1/1ToKr0dRwTV9RTufLJyNiifzHGMk+G2Vf/AAyuzvzVPemaRkUhA2L9vDGN/wCxbnU6evlV1bOUo1E3PkmQnHGvnZHbIHSF0Ti5/LjxG38VjLUNa6K0WijABY2MyEnr8RJx+I+5X7x2qh+ULdF8TS2Nx3GAc46HoVizUFTzywN3w2JoGfRdFw1cuniabXvNzLaqpO8mcR0yqKrfysVTKz43b9So6ud8OFsWUl0Iyowck9Fblzl2djYFTFXPgFW/cnFwOwAWMXuZYZtn7Mu5stfFe7lxx3woYx8zUtXdFnRfzodlHjdb+BvEX8sXO3VNyppRGO7pXNDw5kjXtPxEDG2F0nd7YjRkLMnQF+dt4VcK2VlkZUVxXVN/XH+xZOLphDxTl8ny4/J0He7HjgLmr7VjtCG30Vv4fWyf9NW5lquQ/ZiBwc4/aPw/R4U5J7YnSFXC+OLQV8glc08r31ULg0+eB1XNjjfxSr+M/Eu8aqrOaEVkvLBE9/MYohs1pPn4k+LnE+K01tUrroRku5Hf3vwXw6/BGnuhK2cYf2rd/Dovnv8AAtOjqOefkDOZ56EeBW/vs4Lp7vq+qhmk5j79QQxOd1OTICtErFacVkbeYkj43E9AB5rZTsy8YKDgXqd1yuFrqrnBzwzsZSuYHB7HZx8RAxgndbbS3whqFzdMNP4pov6Llhep+Hj9jt+OgX49wawk9AFokz2sGl3YH5gXvGcEirh2UXf/AGrmnKy11dNRaIvUNU+Ihr3VERDSRtkdfuVSanyN1rL8iKUuWLljODGHtMOOjNQ6ppdH26o72GiInqGt3aHfqA/i7Hj8PktE6ancQJJ3cjcZAcdz6KX1jrOs1frC7aguRM1ZcJ3SuiJyGNPTPyGNvRQczc1zHyukfT8wcX/Zy3xx6/RbDQ6f0alVv1urfm3u/wB+Rq6oSjHv9Xu/ezdT2fnAabXmqWamradzKVhdFRu/6uMbTSj1IPdt9XHbZdZqGkioaaGngjbFDEwMYxuwa0DAA+QXL7gh7RjhzwX0vDZ7foS9T8jGRCVs8LByMGABkk9cnruSdh0GWWe1j0n7t30uhb1CCAY2mrhLn/TwUuscnywiu6vq31f4N1KyvkVUHst37W+vy6L3e03b1VfqfTVhq7jUuDIoGFxyevkPvXE7tOccLhxS4j3SthjY63Me6KnnJyZGZ3LfIE/gAs/dov2iNPxj4e1em9Mafulmqqv9E+WokY/4Xdccvjylwx/WzsWrTqmjZb4u7kkjlrY2lzcjmbEeuOvX18FyFsXK92WLaOyX3f4+BhRVOy5zeySwvj1f4+D8yOiikp6aSoq+WSVwIjpmux4eJ8PFedJqG5vuNHNGxslRDI17IWbNZggjH3L5ppvfZaiF2HyvHMwk7lx6/h+5fcckNq5aeMtmqHgiaoYemf1RnyPUq2tn5yLuOaKx6v5O5XZpq3TcNY4Xt5HQVLwW+XO1sv8A+4srkArmvwT9ojZOHlnmsc+k7xeKmeoFQ6aGWJjIx3MUeNycj4M52+1jGyyHcvaq6Ut8zYjoi8SPdgANqotz6Lb6zU02aiUoyzzb/My1MXZbKcFlbfPG/wBS1Pam0TqSjs1yjADnTRwcxHQFkxdv6kMV0+za0lJSaTo7lUMHee6PnbI05B75/wBn5gMH3rEHaT7Vtj7R2mqWiotN19rniIcHVb45Gg8wORjfOAR9fRX1wT7Yml+EemTbxpu51j3MjD3RvYxrCxgacDJ2JGfDqtLwvVVaSN8LHhvm5fbzSz9smOi0ttNdra373L//AFjP3Z0MHQLAnbN1RNpvgnezSAvq5YHsjYDg8xbysd9JHRlYbrfakaaobl7l+Yt4mdsWujq4iHA+I8Vg3tW9tuk4zabhsths1ZaaprgZpKmRkga3PMWtLTu7IZ8sfc1sZamqNdW+Wvknl/Y1upplKDhJbZSfuys/TJqtc3yWdzKGNgnc7eeVrsBvoPwWaOy/r6r0dq6ljizDT1UzGipLto5muLonEdSOYhpHjzbrAjJA8MbHzSufs1gaSSfL5rINgay1WKuhbKw1zSXv5c4jPIcDOdzthW3Y9I42xeZJp/r8DdaSbnblbJdDtppPUMOqdPUF0g2ZUxhxZnJY7o5p9QQR9FLPaC07Lnbwb9oBQaFttPp6v03c7rVymMl0MsbWMkLQHnJPQ4B6DG/VX1evai6QtNc6ni0ldbgxv2p4amLkz4gE9Vcsdbtca90917v3t9infXGM5Sh6uf2vgY79opwvqLHdqLU9Exxonksla0nDOY5B+/P3qC7A2j665amira6ifBFVXGLuy8/EGwNfPz4/ZcQG/wBwry4m9ufQ/F7h1cm3LSFxoYWZFMamaN/fy4yGtA3xnBJ8Firs99tSx8ImxV1607crrcO7nh5aOSNkQEkjXNI5j1a1nL06FQcJUtLOdbW0OblfnlbL4Z+h7oK/RuaVnhlx+KePk+nswdXWBfpGVpBT+1J0tLbZ652iLxDTxENaXVMWZHn9Vqpm+1a0k57QdEXpoPj7zCVKot5wuhD2cljK6m9HKE5R5LS0+0003JBbn0+i7xO+u2jZ7zE3BzuCTtt5rxvntRdG2evdTQ6WulxaxjXOnpqqIx8xz8IPjjHX1WMXzPCMnVOKy0bscoWoPtC79UR6Fp7NSO5X1b2xueTgR8zs5PoWtkCt2i9qZpW4z9zFom8id20cZqoRznyB81rJ2we1FT8c7zT01oo6q30VOcVLKhzT3j2jDWtI6hpL99s56bb0tTRbfZVXFdJJv2JZ/OCnfVKSht3crPw3+6S+Jgq/ar5qmG3UlG5tJTZYJgR8bv1nn7lE+/1dXWmnhppJXuB/SAgDGNyfQYXgHtc0skdybHlc47D5+ilbi2TTVpbSuaRcq1vPMcY7uHLgGg+uMn5YW1cFXiC6lhd9ub6I+tR6ypxaKK2W6le9rRzzkAAOf4ZPU/8AoitOQO5+dp38M+KLKulVrCZlOzneTefgJfW0mozSlxaZGhwJOxIW4VE1lVSRuLc8wyQua1j4s2LSN9pKiS5wc8cgdysPMevTZdCuHWpabUVgpKmneJI5Iw9rgcggjOV8l4fXZXBc8WvefYtdOE94POPIptW6fjqYHgs2IxhYys9N+Rq98LfhaHdD4LOV0pveW4asaamsJjrfeIm+PxLcWbxwzDSWYl3vEuK2V4dE3JycL7uje/pXNxs5Q9nePhB6qaqNmgY6qFewyuhieUWzb6JwqS0dAVK1k3cQu88KpghZESQNz1K+ayPvfBZRrXU8lPmZQ2WYvLgV4a1qu50xdXZ6U7z/AKpVfTwNhdlowoLXsDqvSl0hHWSne37wpqk4yWSpqEnBs5/U2ppa7U4pKVvewteXSy+HyCyZbJm93gdVblp0pHY3PLIsOf1cdyVHat11FpRoigDZq07mM9GjzK+iabURsWMnzPW0Pm5kiy+Jzw3XNb5ljP3K1y44X5e79U3u5vr6stdM7rybAAeC/I5myBrhu0+Kxmt8leMWlgujSbXOpZiRsJm/7JVzAOb4KA0y4tt0r2gk9+Bt/kqbbK/myQSuc1qzabvSNKHQvPhjROrdbWlj48gTtcCRnBB/9VuK2nIgbt4LVrgTbp6/WtLUcv6GmBcSfPBwtsYQXxZ9Fzl0mpYOs0KxBvzLWvFtFRl2PjHRR9Fdp7XKGzBxi6Aq6qyHId5q366nD2lr+iwUsrDLtkPFE9T3iKdoc05BHVSNPWsk2WNJWT23L4XF0Y6gr9oNaiGo5Kglm+xPRYyrT6FZvBlmGVpA3VfE8OAVlW7UENQAWyA/IqdgvTBgZUDqSPOZlwENxso+t6FfH5WaR9FSVdwYQMHdYuGEeqRG1sQGSBurW1BXNt0LsnBIyrhrbgxjXOc7ACwRxM1/71cHUNA4zSjLXBnUfMqKNTsZK7lBbkRq7UT66uFPTB01RI8MbGzqSrm03oeW1W8CQNdUS/HK7Pj5K0dNW8UU4q5Ze9rnfrA5EY8h6+qvH8rVDG7TSf6SzsTXdiUbLO08S1+J/BOXV9NFV0AZHdIByty/4ZG+R/tUVo7SNfo21mhurWR1Ie5+I3cwwVfUd8qmzsxUPAJ3GV8azipp7m9skfM6SNnM7JBOBssoX2qHYT6FJ0xUufxMD8foeVtqm5+bdzdj06H+Cw7cqkTchPUDlWwfGmxQ3DS8lZDFiaBzSSD+r06LXGrbjP7Q3XY8NmpUJLwOe18cWc3gUUhAeVEV0vwlSdQ84O26g66TGQVs37SgmiIqHguOVCXJ+AdlJ1RIcomsa5xK9SJHnB82VhddKfb9ZXrNFjGdm+atPTsLzcmHl6b58le0rGSxxnl5sDceqzKksIjGVcNLKRyvePIdSpSldSOp2zthaJ24yCf1j5D71HNpXmUtp4u8eTgZOwVTUU0dvnEbpA523MRtv5LG2W2CCSedkSMcE1RIXloiiOCQNsj181c1BU/oKeIE5du4jwOOii6RzZKRx+zFyloPNnm2PTdV0ERli+DnZGd8N3JH8AqEZvqy3XSofEk46kNwwho+LAJOclQNXO5ldKxryDjJ5eoO6qqeAe+xNEnNynm38MbrwLmuu0hkaQzlBz5bKzCTlBsz5EpeZQyUHeyPlMZ5GjLsDfm9PxX21hrmMLGjunfExrB0Km4KxlXCWCN0u+COg/f0X3RRU1L+jiaxjNyBnJU+HhJS2PHhvdbkbBQwW10UssQkqM/C3wB36/38FX0OnqnUUkr5Q/DzkP6cu+V6Pg5HmSRrORpy0u/V8d/P0+qlaPVUMEJZA5khechkYL3H5gdPkqOruurg2pPC6FnSaau2zlcc+Z71FiobK2nfF3zqgg803McAY8lDW/TctRM+SncWhxzzPcXDB+au+C6RxMj96pSC4EtAjyA7Axv4ZOfv+aoX3YwwubCBE9jsuD4/gAz4ef0XOrU3779TonoqFj2EDeLf+R6J9JRgxyTbTVPOQ89fhafAK1aekdK+Nksj6eNo5i/O7sfvWRJaujrKIVFSSQ4AhzYyAzrtjxOV4XS0WqSKBpmkY6Qfo+YZ5T5dP4q1RrnBcs0VLuG5fNCWfLyLOrLl3c/JRTTQQA8haHkc/qfv6fJVvctgigqHOkk5XRjBOT9rf8F9XCyMilayIF8uOfA8ts9R/HzXvTTtgYxskzTPG9rgwHmyRv0G/hhXvSKrYf01jBr/AEa2izNjzkuymq2UNBJHFNJNJI7Ja5w/RnbOD5bqpprlLJDTUEdRIaiT4pJm4JY3+4A+qiKyostwibKaw05GO95G5wPnjAP9qz12OuH2meJ3EBtA+1vr6GOWLndM9ze9+Il2HDqWgZxnplUqNM9TYq4Ld/pk2Dly9DX/AFZUOoLg2Omq3NqI42tMgA5i0/8Aooanpau5VANHzve0F72tbkkDrldpD2K+EEju8fo23ue7cuNPGST/AKK863sm8KdLWuurKXS9FR8sTnPkhpos4AJ8W7ra8z0mnlJx9VZ6+Ryl2qlZJzlB8vvX6nHiqjn05Vxd1MBX4zURgAhg6cufB3nhSekWSzVFbL71+h5CJIC3cnlceqpOK9dS/wDKjqYW+GKmo2XGaOJsOGtIa4t5h/lY5seqkuH9QQ+SWWnPdvPKXj9Ycj/vUt0eXTOb6vBe0dnbWweMLy8jzlqTaH1UrKp0lVUB0YZyYMDCOvN5n8Mrw05pSouLZq651Laay04HPMWYe4k7NaP1nbq8uEWlIOI3FKmtNVCZ6bd0sPMW8+AMN5gfhyT5rqZQdj7ha+z0FNLpWkMUMY5YpI2v5SRk7kEk58Tkqx2M66Izh/d4+OyX67Hl1jUuaUMxTaS/f1OPV295uNUCXRso4miKnp2s+wwefqepPiV82DStXXe/1dZPFHb6YF73tb6jAHqQV2Kk7HPCaFhf+aNCOUZz7vHt/qrnB2p32ywcS63TGn6eChstu5B3VPG2JsriObmdygAkBzR9PNRO988dNBYeG/clj6vOxUp1L7b+rB7pvw8MfqYQq5ay4MjhmEcVLA3EMMLSGtHid+p8yvm1adr7hWNpiInSSHDeXYNb1Jd6Ab/Rb/dirs1aO15pF931JY2XOd8YcHzuLgxxcduQ/D9kAg4zutnIuyHwtgZKyPStFGJW8j+WCP4m+X2VetVmn/pxXh9/MlttnGxOUM/FHHeelqRpmj95fC9rS8Rujzv5fioOC31ksjGPjYe82iEOXcx/uQu0R7H3Ct1M2A6VoTCz7LDTxkD/AFV8Rdj/AIW08rZINL0UMjQeV7aaLLcjBx8Kr1W21p93zMbdT2jWK30Xiv1ONroqi1NkpHwwumP9JPG8ktP7A+XiVSx++3Sq5aoRtkOWsmL/ALeBgcx/DK6zat9n7w2vdO80VE2jqOrTgsaD6d0Wfjn5LVLiv2FLtomubNSVMrraSeZk+H8wGdmStABcf2XNb6FyifEIUb3px9rWV81nHszg11nEIVzUb4OEXtl+r8Wm0vjg1Qjt9bZoXVVdRtiLw5tNzPy7PQvI9PD1UJNVVziIXMD6dpwx7n5IHp6b9Femqq992uXuzofdW0xdBFHIHNcANg13gD9PmreqIO62eOUg4IV6tykuafVl+bSfLD1fuQ8MVbVVsVPBSd6HkAOL8fMn0CKfpWfku3VGSGVlW0sbzDHdx+P+ljHy+aLxzsk3yPYzxFJZRnLXHZQs99tsVTp7FDXQRgd2Xfo58DbPkfVbFdkyS62bSlLaLvG+Gpox3DmPOcgdMHxUDaq57aWMEAENHTxGFenDyubT3cnODJ0ytbr61ZU/NG64TqZwuUZPKlsbBcrZI2kKKvdqinpXnkGcKuoZhLTsIOdl9Vg5oHD0XL8uVudisxlsYvihkp67kDTgHqp18h5AD96+5qQifJGN0liHJt4KGMMM2cpcyTZ4Bx6r9LyvkbbL5cTupVsRNn2GDOVD6jhM1qrGDxicPwUs3mx1VJWt54nt3PMCNlnHaSZDbvBo1CvV1orHaKyqq+Xlha7HmT4D71q1d7lJdrpUVUgAdK8uIHgr446XO90GqLvp6WYtghrHStaRvy5yBnxG6xrDVCNg78Fh/aI6rvqKI1rnh4nzCTt3jPzPV2xXwKx1KS/HMwDcBHTNccjcLPPADs+O1rJFfL5A4WlpzFTuGO/Pr/VWGovhp4c0y3pdLZrJquvqQfCDQ1/1vYZqq3297IveMtdUHka4cuNj4q9pODWsaa501NJaQ6GZ2HVUMocyMebuhW2dm07Ba6aKCngZBBG0NZGxuGtA8AFKS0jO5LcDJXH36t3ScsYO6r4NDT14cssxvoTSUGlJaGigHM4McZJD1e7zWVaeE9zgeStn3XuL3SHH6rld0AJjAAxlaW2XM8lquKgsIoKinyCoWtpQQdldT4Dg+ai6qm+E5Cr8zRdWGi0ZKUuaQRsrVv2mhUsPLs70WRpKYEYwoqqoeYuwN1ajZsV5VZMNOrLzpqQhh72IHbmO4+Sr4OMNRSvayogfkDdXhe7IydhPLvhY31HpaQjMbAHDxwrUXGS7xRsrkvVLwpeOFNsJQY/UqoquONmiiLpapoIHg7dYMuemquR/IW7fNQz9KiGUB5LnE7NU3Z1vcqylJFzcX+0hU0WnayptMRZGxpBmecZJ2GFo/eOI+ortX1FYbpUxyzOy4RSFox5bLPXaRjbYdC0lGDyuqaluceIAJx+AWsQw0dF0HD6Idm5YOc4hdJz5Eye09xP1Npi5sraO71Qma7JEkhe13oQVtRwU7S7Nd10NnvsMdLcZNop2HDJD5EeBWmErfi2UjaJ5qCohnhe6OWNwe1zTggjoVPqNDVqY4xhmvp1VlUs52Ol75OWeLwy4KQ1m6rbdHGNrDmOMx8w2IxusT8H+Ih13pi31NU9rrhC4Q1AHi4YwfqFlvX1wZRV0TnZw2JhOATjPTYLg7aZU29nLqjq42RsipLxLZu9DNd7ZcKUxMLJoiyMOz1I8VqNcYZbXd6u3VjTFVwOMcjXeYW4cd0ZHJK2Vwj7sAuznYHotcO09TNpuKM9bTRAB8MLpHMGA48g3W44Xc42Ot9GavXV5r5/IxpXtcyPJA8lb9S/mJ8VcFTNHWUwfG4EHfZW3VZa8jzXUs0SKKeDnGdtlHTQ4+ak5BzAgZ3VDJC7nK98CTbBVWCEMqskbEK5ye6idsDkdSrZtPNFMCfxVwyPMkbQDkeKlS6FaZSx1T6GQTNHMWnPL5qmp4X3W4DvHYL/ie9yqqiEmHmyBjoqGBxp5XOacvLSObA2+X/BeTWYvHUr80ZbSLtimgt7YadhLmjx8AfVe1bc5TzxRsxzHBcPxKgbVTOkjc+bLmdAM53U09vd0gcGuiAHwFzcnJ8fNa1KMHu8svw78U0SFLTO5aeQvwcHmHic+P7lT1LhLcZRGzm2Az4dM/wAV7UVPKYe958tLdxnfqOgURcnyRV0kueXlf9ob+A/v9FZi1KvMvM95Wp4XUr66pbbYm08X2n7y8vl5fcF+09RJ7vHJL9hrtnEZJ28FHywwinZU1Bc8kkti8X7ePov2KsdUvw7Jkx8DQNgFhN+PyRNGOVj5snKu7wnu2EOLA5uT+ypDT1rpLITXVjzJO5xMUbOoBPUqDoI2veIY8Oqj0kxlrTjoM/PqpyahkqqdtOZnR1UfVwxkjO48VQ11iaUG92bPh1WJOfgiWq62e5RgmQQRbOHL1x4/xC8KyF1RbnlzOWaIc0bCcFxHmqC2000VTGxrjM8kAs6saCRvk9T+AVZU01VSxzc8rHE/ZOCeQ+u+60PMoSw2dFKtyXcWxSWy7TVUHezRFsrWYLcbbeQ+gX5Q11ZdK0kx90zJD3h3Q+foMJQzy0NE6V00DN/0hMZ+Pyxvnp+9fr7hPXlsEcEdNTPcO9e5xMjhkeX7llnDlJoyaziESWoJKi5mS2U04eG5E9Ry/wBG1wHwjzJ8PkrltlltNpAEdKXPePie7cv+9R2kKOSkjqo4Y4TSumeTIXu5/hHI3bHT4fPxUzFUTtlc+WlZytPwcr/tnw6jZRppbR2RrrO/LMjyu2lqG6Ujmtj92c52eZrR9xC3S9nXw5bZqqWsPJMwGSYPjZy928AMAPzBJWnUdbMaZ0ppDE/I5YQ9pLtuoP8AaumfYp0462aCdWTQmCokjiiIzkOGOYH5/FjbyXTcF5lK2x9Ix+rwvtk1+r5YVykuv7X5NkhsAsf8cNQjTPDm7Vufijhe8N/aDWlxb9QCsgDotae2/rCHT3DllHJzvNbK2FscX2i7OQCfAENcN/NR8Wny6Vx8ZNL67/Q5VV9tKNX+TS+bwc1bxw7s9NVNrJI46iodl5708rpHeJyT55/BRthsTIdSy1TQH8zC3GcgYxgYBwNidlIal1JS3TUzKGOGWNkLcOL243O58xjdTlrntjA2OEtpaindzPaIS7PXfGR123yucjrb33G85Ppb4bpY4mtmvIzB2K+G2eJgqGRNfDM9nfSMcS9x5i8OOegHKB9V1DYOXpsFpP2A7K2tBupye7ZK+OQdHtLuTBHgQWnoVu2ei76PNHTUwn1xl/F5+2DiuJKMbezh0RFaprxbbBW1BeGFkTiHO6ZxsuGvEbUDdTcTdQXLvZpPyhcZHAPdkRgvw0NH99guxvaOvwsfCm9vMrYOeBzO8PVmRgO+hIXL3h/wpsldri1TCpmrZ2TioEWW4mewCTlONyDjf548QtJTqqf5jKuWeZ8sVj27v7r5FPS8Pv1kp3V45YLfL+L+iR0u7KWlhpjhdSRuBMhDYu88JWsaGtf9QszZwra4b2llk0RZqSMODG0zHAO6jmHNj6ZwrilOB1wF0WrmpXTkumfoYXvNj9m3y2PKquNLQ8vvFTDBzdO9eG5+9U0Oo7VUVIp4rnRyTnpEydpd92crnV26eL2paTXTqKxagudrio4x3nuFW+JjuY7bNI32Wp1B2geIdDWQyVWpLhe6ZhBNHdZ3VMRGfJ5OCf2hgjwIKp6C6rWQ7SSaXz/T7ksK6uSE7W0peWH4+Wx3XDgehBVDdrXS3qhno6yFlRTTN5XseMghYN7J/EWv1lpj3etfLLE2niq6U1D+8liY8YdE53V3K4EAnfGM7rYBv2QrOq06rk6pNSi18Gmskes0qpm6ZNSi18015P2dV8Dld28OBA0Bf2X23RhtK9wZM4Dd7XfYcfUYLSfl5rVi0w1FYO9uDKdsDXFlPI93xSOAyB6gZGSurfb20/SXXg7caiqcIGRREOmDeZzQHsft/oY+q5LX24uuVZ8DGQ00Y5IYWn4Y2bbD9+VpuHxk4z0+fUk0n7MJpfDOPcjT8NXo0bKJbqDxH3NJr5ZwvcUFfJcX3CR00cbhzYc/m3PyCKspoJ7xJDTMYZKonljf4Edd/lvv6Itw7YVd2bwbNVzn3oLJuYLlFRxuY7MbY2bZ8lUaT1dJLcIpGsLIWyDlkI6j5K2L+J7zqJlBbWscwNzVSEZx/VCuu3Wltuj7tzcbdStdKbmmjaQhyyTRtPpKtbV0TeR3MANlcD4iRuNljLhNePeaCCNrw8Nbyk/JZUa7IB8FzvSbR2rbSjLzRbN1h5H7DCi3PA2V1XmlMsXwjorMqBJFIQ7wUUlhl2uXPA85nfFsV+heLnZK94gXAYGSolvI9lsegwW9FTTsxnZSbaU8qp6mnOFLyvqV+fJot2z9BG2auo7/ABsIhr4+VxA2D2/8FrXLTc2xGR5FdNONvCtnFbRM9sa9sNfEe+pZHdA8eB9Cue9/0BfLDf5LNVUEzK9snd91yZLj4Y8x6rr+H6lTp5ZPeJx3EdLKF2YrZlTwW4XHXmuKWlPMKCL9NUDGxA6D6rofYLNDaaSCmhY1kMTA1rAMABYr7NPB6XQmnjWXNjW3Osw97P2B4NWcxC0bjYrm+Ial6m58vRbHa8I0voenTku9Lc/RyMbuVYPELiVQaSnpKWapjhnqXhsbHHGVcep7/S6ftNRXVUndwU7S97vQBc3eLXFKfiFq6quhkd3IeWU8WdmMB2+qy0mieqyuiMOJcRWmSj4s6F0OoKW+S0U0DgXtOHtzu0q+acZ5d9loDwU43OtNbSRXaqIDXBokednDOBlb16avVNfKOOpppRIxwzsVrNTpZaafJLf2kem1MNTBTiXCImubhR1XBgHxUk12yp5oy4E4Wtki/F7lvzQ7nwVFJT758FNzRDOSFQVLAGnCxWxZRDVFJG8HIUFc7VE5h2GPJT1U5zBnCte9XKSNhDWn7lLCTI5JY3LI1LRwRMkIAaR0wrYtFhdXVD5nj4W9Mjqrvq6SW6TtaWnrkqeis7KGi3AaA3JV6E3jDNVOCzlGkfbHl7u7WO3M6ASSn8B/atbqod00Y6rN3ae1Ey98TapkeDHRRiAYOfi6u/ErDD6eSofzchDf3rt9FDloivFnC6yaldJoj4oS5wceiq2bdPBVHuxY3psvzkwPVbKMcGuJzS+trrpKcTWyskpXdSGnY/MLcrhDxeqeLFk98uMbGXCj5aeV8bcB+2QVoo5o65xjwUnZNZXrTvMLXc6qgaTktglLQT5kBazXcOjqoZjtLzL+n1MqZb9DoowNc7IxusCdooxniTVtkHwmnhBHn+jCw9Z+P+t6FxLroathAGJmgkfIjCq9VcV6jXl6N0udO2nqJI2Md3Jy0lrQ3O/TOFpKOF36e1Tlui/bq67YcqIuppXW2oPd5kp5G7gb8qjain70/D8XkQrlsWp2Wu70tbDySPheH928Za8eLSPIhXZxCOhrzRC66d7+13aQh01sLOaAk/a5T+r4nxHoFtHZKucYTi8PxKHZqcXKLMMVBkp5eUtIPhkKma8ukOVeIdT1HwTNGcbhw2T80KeqIMMro3HfcZCvKrm6FV2cqwy3IiGgHAXs2sdGC3Gc+KuKLQUrx8VWzHh8JC9joKIMD5K1xHlG0An6n+xTKmSRUnfFPqQEk/NAx2MtPX0XxS0L61xGeRg8tyVV6jtbLbJHDTOfyYB+J2SSpC0QdxbXsdG1z5RkOI+JvoCqk2106nqxJrHQ84baaVhexznnbIBVcZWuieah7Wcg2jJ3+5TenaOjLoW1ccjuffLX+HkPVXNcuH9lbTe9xUk9Q1wJcH1BPL64AGVDGqTj2iWWi52kK8VS2LNtlQ10IYDzANO+MHzURUVkTayVxaHuyMRg9dh1WS9IU1qgvUn/ALNgkHdEgT80gB2A2J819wN5K6sbTRUobzYcGRhoa3HUZWVcc1c3tPHNRs5TFuJ6lz3OaS/fqPD09Aq+lpJZ6bu4Y3OeT8UnQfIFSutb4+aMUEMgMTpB3kgbgux0G3QeiltOmCjgJqGP7kNJYRt06YH9+i1up1HYrMVlm502m9I9Z4iiM01bo6cVEr5MSwE5eNg0Y6/epypr6ctE9HI1r5Orzu4+g8sqFmvMslS1/L3dPE/mbEDn6n1UhTsa6dhpz8Mw+yBkDxwtFbKU3znQ0wjWlBn3SVUNoqzJDI2R537tx3HX+1Vr+6NuL6ojJGGsDviz/W8lF19QLG9he5jqyQ8hjwPgHg4+Z3VFb6x9SyVjqds7pcHmLck+uywcMrmwTRcm8J7I93RPnnjk2LujWjoOuPopWC3e71rfeXju3OGQzq7fr8lR1lLT22BkXdRvfIThgPwNwOuB8l526nE9zhqKnnAYQWMBLSfXY9FjJOSbzsSc+HsXNa5H010jka4CCq543t/ZcHOe38CfwVxuADmEbk4PXZW5QUsbu4qeeRsjpSXRl5I6uGzc4Cl20QpGsZ387zUOOXufkx7Z222Wb8DUrxJrTNPJfb3TUUTQZDURxtb4O2Gy67cCLKyy8NLUyIHkmYZmg9WgnZv0XKrs+6Zdc+INNTSVE8/cSGXvnnmIJJDHHGNg4hdibBQ/k2yUNKQA6KFjHcvTIG/4rrOHQ5NHKX+UvpFfqzUcRm1BR8/3+hX5AWgHtDtR1tTf7JbKKVje4LpJWuOz2kYafoS5b9zPEbHO8hlcqO1prCr1Bxqu1M0wPoKYMaA4/pIj9p2fDrn6ZXP8bm26614Zf4/LKnCYKzX153xl/JY+7MOQxQ0s76y4gMHNn7fU+A/vsqH86JLzcHwjlh5mvDWk4OzXFWnU3msul0qJp2/4oCQwMcOmdhg/XdTnCmCe78RLRQ1dE4UUk4EmHAkxgHnP0aStVRp5TkordvCPp1s4Ri3Z1wzq32M9KDTfDVp5BESWROj/AGJGt/Sfe45WwLuisrg9aXWfh7Z4pOUyvi7172/r827T/o8qvRxw3K+k6lrtZRXRbfLb8HybVSc7pP4fI1e7cuoYaLREFumnZAyqeGuc4/aaT8Q+5au9nPR1Dedc0opYWNhdLHTtmYMmNz3Dld9zHA/NXp2/uI1DFrWgss4MvctMz4QMkEbA4+RP3KX7Bdopb3fYrpRiRsbBLM8StLedgAY3G/6sh/H0XD8HctRxXtsd1OUvku79cHZ8OhHS8FlqG+9Nv6bfaJvtC0MYGgYAGMeSp7rUCloJ5SQORjnZPToqpowobWNsqrzp6soqMtbNOwsBccYz4rpNXz+jz7NZlh4958/nJqLkjk/x3dR6q1VrC5RzuqHvqjH3ZdkxuGAQPLBysHUeixYbJLcatk1RUTSBtBTAkl+P+kIxnlBI+71C6Cz+z4vNbVVlRNqiH3irqDPK91Hs7JyQQJVkHhv2D9MaYvlJd9Q1cmo6ikYGU8DmdzBHgkjLQTnGdt/UjO40ugr1VWK3HEfH3ew6u3UcMdEYVSfNBJLutZ29q+7JDsPaAuWl+Flur7q2QVlRTiPml+09vMXZPlu4j6LZUbBeVHSRUNNHTwRthhjaGsjYMNaB0AC/ZpBG1zicALqr7lOXO9kvsjm5zlZLMjVT2imq2ae4IVkJLXSVkjKdjXDOXF4JBHq1rwuT8Foq6qOWpp5mTRR7upg342Df7wtq/aQcbhxD4iU2lrRKZbXY+b3iWM/DJUHqNuoaNvmStWNMwmkbJdqmb3elpj8GSQZn/sNx+K12ijy1SvzvN5/CXyIK63Cyakurz8lj8H2+assVOImywmWqjxLygh8TT+pnzO2ceCKirK4XKeSp5Q10h5nMG4B9EW1jFJZfVkjlnZdEbh8LpKSlhqaOpqYqi80TWe9uYc5c4Z3PioritxZo7BH7lQytqbnJkMiYfs+pWpvD/Wt8sdTcH0MznVVe3kfKXEnGc5+ayjpTSz+8FRVGSad/xOc85c4rUzaqkdbw/Qz1GJvobmdlGrqavSdLNVSc9RI5xeR55K2UY7Abla69m6L3WyxsawRsDnYaFsJz5Y35Ln7HmyTOmthyJR8j3mkDmH5K0bvFzzkgbK5+YYURdWtDsgYOFi1zIjh3Cz6hhY89QpK2+B8FSXDd6rLactaq62kTTfdySuNsKnnADSqpsYcBhedTGBGVZzsa+Eu8RE+ADnxUBX2Kgq66OsmpIZapgwyZ7AXNHzU/WY5dgouRxLlXk2uhtq1GS3PCOIh4AGy9ZiYoyTsqmliBGSrU4tawp9DaJuV1mdjuYzyDzcegWVFXPNJPqZX6lVQcvI1z7SfFNtwN50xb5s+603ezuYepyNlpR3Dqqol5DsHLJ9LeJNQV2p66Z/eT1FI97v8ASBWObMzM1RkZ+Mjf5rvNLSqoNI+ZavUT1VrsmVFNMKd4jnPKD0d4Z+azlwT7Qtw4dV8NLWTPqrO4hpBOTEPMeY9Fhru2vJBAI6YI2Xk+EM2Y7A8vBNRRC+LjJZFN89PJSgzrBpDWNv1haIK631DJ45GBwLDkYKng/OQVzP4McdLzwpukbOaSos73/pIAd2f1m/xHit+uHnFGz8RbRHWW+qZICMOb0LT5EeC4DXcPs0kn4xO40ethqYLfEvIumqGxwomd3XKlpiCOqiqkAgrT4wbqMskRWAEHdQVxpe8YQBklXC+APf1Kj7lPR2qF9RVTMhjYMuc84A+q9Wc7Hs5LG5GWy0BhMkjQ3HTIWMeOvFSj0Vp+pbDI11WGENaHD7WNgrT4v9qijoGTW7TWK2oGWuqNxE35H9bx9FqRq6+3PU9a+tuFU6eQ9B0A+QXS6Dhll7U7dkcpruJV1p1w3Zatzifcq+eqqJeeaeQyvLjuSd1SVNL3WwOQvt7XGoOCfkvkl5yDk4XdqCisI4x955ZRljsdFSvcGOIJGV6VdxZDzMYS+TwDVEPllkcXSHr4LzODA9Zn87z0ASOBzyA0dTj5L4iHePA81LU8fd/cpED0ggETML0X4F9LJHjZ9RSlm4OCFJ090zhp8PFQkrgxvqvqjlDj16LCUEzDnxtkutsVPUWyacytErXACMkZIVLZauWlroh3ju75vsk7KM7wtGxV0N09QHST7zT3iP3ume0TUEzMPOTjLTndU2uyeZMnk1bHZdC4+Z/M7A2xsvmR0jgXEYPQep+S/dN3OC/VFFQwZdVz/AARgZx5lXNqrhPqeejYaSGHlG8nLO3J8vFSW6qqlYnLDKMNNO2WUtjEtXUPkkxMQ6USHp+5SUVUGxRguzzAAN9PBQlwp5rfWSQTt5Z4nFrwd8Ozuve1Uz66rbIT8DCNsqlJrHOW5d2SikZCoYCyGnDgS0jIwOh+aum2Xk007adzSWEbt6/Ufeo2gYwRsa4czXNGRjofMI6gfT1D8vL43klpcenyVrT5UeZFTW+vgmaqnjpallRFgQvc0uDR+OfAeHzKt63VpdPWwY5YyXHfbO56/VV35Raykkp55SzbmDwPvOP3q3KyKWnfLPC3zGB0DvHPmCcqHV15rfJsjzTWb97qWnX9628wNnDSS4Fsfi4ZO59P3q66WCase2pmqw5uPhiaMABWn3zhd2z4JmBLm7nOR4/ip62vnqpOcSFuCXPdLs0gnK5bWZk1y7HdcPcVBuYNtqbhK6NkzO8c/BBAAAVwvhk03BCyINlqnDEhI2B9PL5KMrquBtG+eOXlYx+eZuznvHQn8cL8bXxVkAM0gZEQMu6Z9B45WvblJZj8TZRis95+4jamkqrrenEtDYmN53TvdjG2d8/VSFpuD4x7pR0zHuGxlDx8fy8lTyVRuT2U74vd4Gt2a0+Pm7zKlLc2OzxCaHMlVICGb5HzPkspyxDl6km7eZbFFdak1dU2R8f6Zp5REzl+Dpnx9V6UccpvDZv0zqflDS8t+DOMEc38V4NvHd1we+nicw5BcG7HfxPj1KmvfmytBD2RMDcNjA2HkMdOqxkmkljY95sJkharpBVughj52uGZcFhOxOSM+PgpkX6kkfE0TNDYyQ/mGOXbx6KJsnN3sLRKT3dG1uPMknO/+aAve4SH3KCfA5o5cOJHUH/0wsmlzYNVF7GznYhtdLeOJE9XHI2pYyemgeA8Oa9kjiT9Q5oXUxgw0Llp2LtQUVp1JLVlwDhU0Mj2jbli70hzz8uYLqXGcsB812tCxoKGune+ed/wafiUGlCXg8/j/RE6qqxRWCvmJI5Ynbjw2XGfjVdJ6rWuqLhK/kqZnuIOd9yGkH6EldorvbGXa21VJJsyeNzCfLIxlcwu0Z2U7/BrqqudJR1NWyYOD4BIQxzugeweII8B03yuP4upQvVkl3Wks+1POPiUeF6+rQ8RitQ+WM1hN9ObPRvwz4e41GoJRUP7t9Q0EAOcGAHw8PPbC2I7O3DJlfxDssjBI+6OBfBCBmMFw5Q2Q+ZY6Qgeh8lZlm4Batt9xbUUGmrvX3BzuSmoxCe7Lz+s4/sj1K6D9jvswXXhPQy37V9Q2r1JWHn7n4XCAHwyNiQNh5ZdvvgWuE1t6mF/9sN/e10Xzx8DueIcSprqcU1KT8t/3sbO22kioKGmpYW8kMEbY2N8mgYA/Be1TIIqeR56NaScL75cK0eKur6XROgr3eKubuIKWlfIX7bYH4+WPVbrWXOqidnjj6+H1PnTzJ5W7OUvasvo1hx6v9T3od7p3dPG/m8AObfy+1j6LejsJaWdadBPrJYwCYo4m8ww6N5+KVv38pXOG0VtRrvXtdcrpDFTmtrBJJFA/IPOegJ8hn7l117Plk/IvDeg5omxzVBdLIW7Bxzhp282gLV8ApddV1svJRXx3f2PoPF3HScLo0ceqST96/bMlE4X5zBH9FqX2yu1fd+ArrfT2OGOeeZ7u9JIBaBy7EFrtjzD7ltbtTVp3FWvHM8HC6eiepujTX1l+E39kbaZHgE5lzVovaD64fpr8szsjbF3vd4zHjH/AGWUf2/ddXWkfWh9BQWiNnLJUd28yySHOGM3DenX4dvNVrOI6avHeznyT/ODoK/4d1k89NvadH7leaKz0r6muqoqSBgJdJM8NaB8ytM+09227TTUdXpnRtcXumDoaq9R7MiGMERnxPT4ui011nxW1XxcrpqrUeoKiup3HLKLvsRMaOmwOCd+qxbqJ77xeqe3UrRIxm3KzoXn9Y/ILR6jiEtZmmpYXizf6b+H6dGldqpcz8F4EqyzRXqvqpqa5TVVPIf081SCSeYnpnq4+A8VH1ekKy993DRtmkt9K0shZIA3kJ6uI8yQVL09TTx1FLboJhLDSTMLpWu2kkzu7x2HQfVUlRrCut9XCySlcah7XMe6Q/0mTty42OPPdQU3W1zxCW6JtTpaLoc0llMtv/k3vltuEMbJXSueTytMe2PHf0GUWTaesqaK3u98lMlZVgYp49+RuN8/x+5Ff/mlte02mzSfyemzevKRbfCrQLqikbUv5WgjYj7RWYKO2NosNihc4gbud1Cs/RcFTb7TC1oAyNwR9lXh73Lyjmfv4lbGUuaTbOv09aprUImxfZ9c6OzPD3A4kJCzzFUB0bTnwWufZ6uHeUNVE45Ikzus9wS5YPDC096cbGRSxYyUdN8OQo24Scw819d6c4zsqerPN0UPMyKUGkQ1S3LjlelDtIAF8T7OIXzDJyOBQicWy4YiAOqp6gl2cdFTxVJON0km26qeJXcMPJ4TU5PgqY0XjyquMzR1K8paloZ1wveRMz52kR8o7o+QHVafdt/iKX0tBpilm3c7v6gNPh+qCtodcatptL2KsudVIGQU8Ze4k7beC5i8SNYT661VX3qoeXOqZS5oP6rf1R9y3PD9PzT5vI0XE9Tyw5E+pTaDkkM1+aTnNtlLR6jBVoU9Q+lqpHdGvOfqrv0EDJdbhG3fnt1QPn8CtSppJBFzYzhdNHbJyi3JCC5wO+F8ga7yK/ZamMMc4HPl6qzJaGWpqedr3MIONvFV7YaqGPALnDHissGWSfZcnRsa9wBjJxnrhXhoziBeNE1ra2z1z6ZxOSGbtf8AMeKx9by+aiqIpB8R3aqahu8tDmOZju7HRywnVGa5ZLKMozcHmJuLpTtq3Gj5Ir5bGVUQ2fPTu5X488HZZj012jdH6shb7vc2QVLh/wDDVJ7t/wBAev0XOJ2oaaYDllAcfAr0ivDC3IcOYeIK0Wo4Pp7F3Vhm4p4rfV1eTf8A4jdpHT2had8TJBW3bGWUcLhnpsXHwH4rUziNxo1LxGlea6sdBR5yKSAlsY+fn9Vi+arbK8vfzF56udvleZr3h2AdipNJwqjTd7GWQ6niV2o2bwitkquYbnOVFVkpe/HgksxJ28VS1DJHtONvVbhLBqG8kdV1TaaduftFwwvC81T4SGwkczh9yjrrzwzDmOXE9SpltIKukgkdu8t6rLOQiGoreDlxO56rwr4Ax+yuaC38kZGFF3eLkaGkJjHU8IeKkeWlwJHyXtT1roX4l6E4yq+mhwzK86yhbNGS3Zw+z806AqWHmaD4FfRdhRVJWGJ4heOU+qrS/mB8lnFnjPGreATynIXzbf6QpMAQv23txKRlS4Kz6ks05avprPeHthBPxkNx5ryDsKqtrc1wk6CNpdzeR8FBPZbnsM5L94Y24/lYzQhr5KcAs53AEA7ZHnsss1N2q+5la2OQBgy34/tLA9h1LNYrzHUNOYz8Mjc/aCzFFc46unZNBIHMc0OBC47itMu0jOXQ3uksXI4p7mELqJK661EhJ7x0ji4HwOVL2iFsJjYxo+1knxJV2XzQrbpJLXUb44JicujIIa4+forMnlls1d3NS3lkZh2GOyHLYUXQugorqijODhPLMg0UneYZktI3BG+FJmTv6dzXDkc3xHQHrkeix/S6r5ZAWxyPHgWjcqrqdce65f7lVAH9csIaVuaZpRwa7URc5ZJqrFVUl7Gxu71g5hzNOD03yqq2Sl0zcw/4u4FsgIyCMDx8SrRfxMqHNPu9GOXl2LnEkf8ABXBYaetuWnYq6SpjhZIf6KNg5hvjr9FjbdXTHmm9iKqmy18sURLNOwz6jnlMhZQNjJIB+IuJ2bnw6dVU1Mr6gxQlphpoiOSJowPr9fFXvR6cpm0Bd7znvD8bsbux5n+xY9rbkbOzuZAyonaMBhBHh1JXFai30i1urod3ooOqpRnuytuFEyVrHTtbHAHbxkjmeR4fiVDXGJ1bNGwMaXf9HG0bD5L9oquqqpHzSxd/M7AaGnAA+7bxU9b7a6OTvWwh8XTmc/p9/UKtlU7Z6G1TTW/UjIqQQwyNke1tQ3DXuG4B8Pn/AOi/Kmnay2vbBI9oBzJ8YJdn18vRSbqqnmuEv6MPA2c8EYec5JH3Kmq79ShzWsY6BhJBLhh3lsPFZRcsppdSGU4NPmfQoWUj5aVpc5zcAEYGSfHH3AqXo6KrkFNyf0Jk3y0ZOxOcqmmuVFQQu5qp0dTI0d20syIx/AlV9p1BTSsex00k8kQMjRyEYwDncrGXaeCPXZCSxncl9NR1LpKyaQsERd3MTcfFhu37+YKqhnqGMqqSpiZ3x2ZGzoR4EHwKoLLXvt1IyJrwS1rZy15znm3OD81ISXR1WB3lO0yAjDmu6BeyT5uhTi44Lj4U67m0BqeGarppn0Eg92q4oTkmF2xc3zIPxfMLrhwE4q02udN09DUVUcl3pIGFzg4EVUJHwTs8w4dfI5BXGWtuMcEfP+kxsQ1vQHH4bfvV/wDB3tD3fRFypaen751HBIZIJYZDHNTEncxu3HKT1YRyu8vFdJw3WwjW9NqdoPdP/F+ftT8fHo10wZuFV9T09rwm8p+T/R+Pj0a6YfbHnz4LyqKOGrj5JomSsP6r2ghan8JO27bL5R00F97l87mNPesIhm3/AG4nHBdjryOIWwFn4x6VvLWiK5MieRtHKCHLayocl3Gpx808/wC18cM5u/ht9WzjzLzW6/X5pMu6G3U1M0NigjjA8GsAXuW4UFLrywQt5n3akYP68gH71jXiJ2ueG/DqNzKy+RVlZg8tLRfpHu29FVnOFXrPBWq0d0nyV1v5GZZJWxxue4hrQMklc6+272j6XiNXycP9N1Tam00z+8ulZFJhjiw55c9C1px47ux4BQfaA7ZeoeLdPVaasBfpew1EDXS1DHkVErD1DnD7LcdQDvnqtN7vUG3sdbKSSoZSBw72SRwL5H+Dj/V6YH8VzWuvWpkoRfdW/v8AadfwvhcqH21yzLwXl+/AyvwCfHqDiTR0kNM3vWF8zI3jmMoHUf5W67H6VtrLPp220UeeSCnYwZ67ALkj2MYbRauIMlyvVcyCCARubJKQ1+zg4keewwR6rpl/+JDQUTo2uvcbXPbloI6hb/QwhTo0otZlJt7+5L8kPGnfqnCKi8L2fvzMnTPEcZcegGSuSXbT1FNrrtI1FrYXS09LDFTOLfskEmQv+jXAZ/qrobqLtQcP6K01r/y9C2WOFzg0jJO2wwNyuW3GbV1Pc9QXy90kMgutyqPhDXYMMGSG9eji3lJHoFz3FuaeorjjZJ/Nv/R7/D2ltq1jvti0oxeMrxeF9s/M96ielOnxS07Y3QNqsBuA4nlzn9ys+51s88Mo5mCggkMEUQHwty8lzsY6nm6leOlJ5KfSk76immkMkzCC0kkjB67qoqtVU1G180dE7uOcyBjti058AOm60FylBJQWd2fTNLyTlJzfginmoobXQzVIp3Mi5cHmHwuPgMq26itp9H2pwdTk3i6NJEZO9PC7o4+PM/qPT5q96i90MOnGXWpY4UgcTT00u3ey/wC6Ov4Ky7dp+kutbJcqys7zvJOcVDjzeHiT5Hb6BS6afZwc7UU9aoXNVwa2P3T9kbao2hzCI5vtFpOxPhnwVySWqhtVo/KNVNNOyMltNG+TmLn9Mj0H8Vc+n5aGKjmNSyCSkYCZp9nNa0DYZ8/kse6ruU1+rKeZvKy3te6KBg/6JowBnzzt9ylrnO2faSWPyaidcI/047oho7pcY7iKw10s02AGMO5x5AY3RSUNkEkJeHgvHXKKSahN5kj1KMVhGcqSP8nWO3SM5Xl7cvOOp9VW1FI2povfKYEx/rMG/KfFXPLR0jOWNsDBA3ozGwVpcQeJdo0XQuprfHDPcJBtFFjlZ6uXaRpb7pzEuK8r5orfJkngXqqlfquKzwSiSo93Mkob0G/itmoKoAYJ3WlXYyt9wvutL3fqlpc0sDTKW7FxOSB9y3L5C3C0Wvjy28qN1obXfV2j8WSHfgjZypamodnrsv2JnMNt14VZIbha5G1kslO+XmdklfIOXKn7zqvRrxnOV6V5RwV0TyML0klBxuqA1GM7qmmrOXq5SRbIpLbcknSDc5UbcbpFSwPkleI2MBJcTgAKkmubY43EvAABJJPRakdpLtEGrlqdMWCpIY34ampYev8AVaVstNRK+WImo1ephp47shO01x1Gr536dtEmbbE/9NMDtK4eA9FrjLT5jKqnSGQku3JOclfjhkFdfTSqY4RxN1rulzMr+GuHavig2/SU87PnmNyiXgOYcjw6KZ4cRhvES0N/be9v3scFCT/o2uz4ZUz6kSIOLlFQ5vkVWSY5DgeCooRz1LiPEqvez4MFe48QU9vPLUBvgeqrZoopWOaWjoqCJoZU5yVXCPLXEHqvQW5UW2AVBeWDmUrRWyB7f6NoKp6lveVXIB0O5ypNgMTRgbrBgoq2kZEQGt6qJmq+6eWlu4U/L+lO68J4GYHOAT5lYhIhRW836q/ZZ3OZjGCpCaSCJhaA3J26KNew5J8EGNyIu9L3kJeN3BV9keZaBmDkN2+S/Zoe8jc3HgvOyDuHvYT16BZI9xglHdFb16l5pgxT855OuwVt1+Jqsuadui9PGVFEzLN1UmIAdF+UUXwdV7yt+E4XhiQddbWzBzmbP8FQR1MkDuR426ZKnZGnPiqeqofeI9hgheGDTZROcJcFpyF70rAHE+OFGd6aeXBzgbYUtQyskZlu5UyZg0VQzn0UraIe7pppnODS/wCyD1IA/tUWWOc3A2JUzPH3NBDB3pd3Yx/b+Khs32EdtygfLl/MepV7aBvrRJLQTkFsmHMJ8/2VY8uF9wvfHJG+Nxa5hDg7yUGopjdU4MQscJ5RmqeRz5gGEgNGzWu2IWO9T0Yfc6yRxzIx/Ln/ADQpuyaplq4MnD3gcrznfPmoQMNzjq6s1EEQMrzySSYdsei5LTVypvlzdEW7LE+82RVLWT0UPeMfgt3AUrbdV1rKYzsmLHZ3YTljv80qHeznpHPaDygkZ8FF0VWYnRxv2ic74neQ+S6OLT3Kz6F9fli1XqBra6jFBWuBxU0rcMcf6zOn3YUvofU0FvpZKCqw+J28cjW8wO+4AHmrztXA7RjrOLjceItDFE+Ayx08bCZTtnBB8VjSussdHerhFp6pdd7fTPwJC3lLh1zj7x9E1FCthyy8Tyi7llmPgZEgvcDIZpJ5HNhDXGBndn4j16Y+WyxXVXFtZViR0DHSNAZyufuOvXdXLfKG90Vjt1fFNMwVbgxkWct5cE4x9ApCip7TS0cVwuVJFTVD24e2ojDi4nxAI3+a5yel9GfM1k6GnVdquWDwU1oqIaCkdXV1O2lijBa3ndu92MDAA/v1VLVw3a+wGWkpxS0JdjLnYB3xt4n7lXyVlBPE/wB0t7Z3QPD4mMaGnlOxx4+SpJ7y6aDMlWKepb9iGJx/RjzdnqcKnGvDzGO/tLsrZS2bJnT/AA/p6an7yslfPP8Aayw8rWjH/FU8FRbqa5Ttipm1D43BrDy82+eoKjdP0Ed2ina24VFaHAc0Uj8NjOd8jxCu2O1ubZyYXwZjGWlzORpHkcHdYyk4yfM8v5HsY8y2PyKhNPW80tDE1k+OZ1S0PJfvjYdOnyVaZLWO8kkjijEbXNdJygA58B+KhWT3S7xU8RhjYI/hfnq7bwPyVXLbWUkjWSwl/IwkPD8tGdsY/iq89vWe5Zhh9ER1No+4tp4X08VJM58IYHl5Y9rT0B8DjdfrNH6hp2OY2A8pOeZs4JH3lXKy8SU7HuZQTvMfQcowR6LzotXUtU93ed7RSZx3dQCCq61FqWUidaat9S1q+zXqOGKnkEzOjsmPn5xgAZP0/ApYrNcqi8x1Pu7pWx7PjcDg+m2MfVZBZfIaSNj3zs7uRuQehd4KsprhLK8ODcNBx16eufqsHrLOVpImhpa85Ii3Mro5XRlkPcxyyMLi4lww4gAYGDtj7lIV3Ea76ItlRJFzQN5MRvjmPXLcAt9ScfVUtVaq6Oolmt/LNHM/vHQuOHAkZKtjibZq8aQqK6ojdE6AsPxPBLgZB4DoBgKzW42OOX1JKk655cc4IibX981RUS1NXcbg6SMlmTM7l26YGcdML5pr9Uh5kM00hbue/B3I8d1belZ+8mnjL8cwDxv12wVdDW/Adnb+PVZahKE+Vo+g8KohqaVY0t+uxP0nEiR7A+SnoakNHJzyRY2B6HBCXDU0d/EMjqKjiLSWiSnyMg+B3PioOOjjeNw35Hovx9BG5vdGJjocb46BUGo5yjo4cOo/wT+a3LxtOrm0TOV1D30IPwtjk5cDw8FKfnVQXHvJKmmrY8AYc17X8h6AgYH3ZVgx2mJ9MYmREMzkNYSFVxW58cXK0yxDoHA/EPqVUlCC3RsFwuixbwx7my47tHTQVwutFM+qd4MlYIuVwGzjuRj6qmtNqkvzjPVV9I10jjkSVUbXE4Jzgn6KKljqREBHMWkfruaCT8wvQVNW2nYxjmF3RxLNjgeX3qVWNQ5UULP4fhKfMpMu+16YgpKeopPemyMe8kNDw4DHUZbkKnbpQR1ZmqeeWmjPMGsBD5h8WGjy6bk7Aeuytr3h8LCY4IXzHrhob+PVDcZ6RrpYo5GzPwCISGnG+2fqscyljcqT4JOnmdcuvsZcGo9M3G7N97kZzSQ/0cLP6NjR+qAvO36cljo3TVcsbKQnD4sbvPk0ev3eKt+o1LcY4GvM1S7zBOXj0z18vFekHEOrpqaIyNDoGZHJK07b+Wf4KSKsa3eTRarhd8emP9H7cDLUtfE+KOntzSB7tCTyDY4zj96hqb3SmqZqMMIp3dGgnBJ8vphTP5+wSU7i+hp+XOWuYMAH6qmo75a57t786nmGBjmic1w5uuTlWI87feNNPR3RWFD7H2yM6XYJWxSSwz45GSuyWu8Dg+A6+qKqbcrRdqp09xFW+TADXg/C0ZG2BnwRZNryKUaLY9YP5MvLitxLAljp7PVSMk5CJXMO2/h81ZHDnhvqHipfW01tpZan42ioqXAlsLSftOPh0KyBwr4GQT6OtWpbndn0dbW1XexRSgECIY+Ig9crc7glwwtmnbhXXmi5ZZLjyl8rIhEHgDryt2Xd3aj0avC6+Z8+02mlq7N+iJThPwroeGOl6a1UUewbmSUj4pHHq4q7aml5NwrlfTtxsFFXWBzIi4DIC5OyTm+aXU7mlRglGOyRAyTmnGQVRy1wkJyvKtqmhxDtj5FRFRWsBOHbqBN5NxGKxllcZcE+S+XVGBsop1YSNjkoe+LMtBKmjByKdk4o9ai6d08gnp6q3b9xBtNipzNX1kdNGB9p7sBWrxk1tBw/0pVXWvmbG8NIhhzh0j/AALn3rPiPetc3U1FfVPdFzfo4QfhYPAYW20vD5Xd59DmtbxOFGy3Zs5xm7TYuME9p01K4RPy2SqA5SR4hv9q1kmkfNM6R7i5xOS49V8U7zLGDnwXqYtuq6yjTxojiJxd189TJymfrDkbL9JOCvEP5SQv0PJBOPhBwSrGSruiV0IHDiFYXkgf40xoA9ThR18HdVNY3wbK8Z/zipLQ5xruwn/8AzIx8viCj9TtMdXX52Ink/wBoqN9TNMt2iGZCfVSL28zVQ0LQ7cquaQ3KzMygI5JcnzUpGAYwPTKoKk5ccD6qropAYx8ljg8yRjG81wcCN85UlKMAKNLxHdd9gVITPBb816eo8ZS2JhcXbKKrK8SnDTt4bKoqmOmHKMgLxhoRzZfkrHBkUkDC5xcc5yqxtIJCCTj0CqGU7GeC+zsDheApXUzGNI6/PwURGWw13KBuSpqVp6q36yYwVu43yvTxkhV4e3OcKDMXNMcbhTcuZmZA3O6ooYcSHIQ8PakiPdBfckZ5VU08Ya0AeCVDfhXpiRjohndfpYA0r2MefvwvvucA+YQFm3BgbWPHhlejS+i5Jh9g+CqLpEXVjS4YGeq9qyn56Ecv6vRMkfiStkMdZWRk/wBGBznfx8FVVEneSkhfmmKFtvsctU/4pJzgN8gF5+J8yo0+Z5PXseEvUpHKQGjG6+pNwqrT1sfd7zRUUYc59TOyFoaMnLnAfxWU2sFd5ybA8MexBxx1XbrdqO1aFmrLDcoe+gqfyhRx87D0PI6YOH1AWGNZaPrNGXy5UlW1gfSTyQ1UPO1/dyNcWvAc0kOAIO4JHkSu/ss1PwT4ByzODWRaY0+XkeBdBBn8S38VwV05JBrRlxdX1L310lR3hY/JM3M4kkeWD1XP6lP/AJF8TNtR2ZefB7gZr/j/AKXrf+T/AEjUX6nt8wZUuZW08IjeRkAmZ7M7b7ZVk8WeBeteBN/o7Pryxusdxq4feYac1UEznRcxbzZie8DdpG/kuw/s5uGtNoHgN71DTxwy3itkqnmMY5gAGtP3Bc1vac8Qnax7XuqKeCTvYLHDT2mIg9CyMPkH0klkH0U1DUq4tdCWLUlkwLpy0V+or1QWe1Uktfcq6dlNS0sW75JHuDWtb8yVvTwI7EHFbSmoZZb/AMO3wUbqbuzI+4Uj+Z+2+Gyn1Xz7JHs4Tam1RXcWr9T89vtJdSWZsrdpKgjEko/yAeUepPkun2keINo1rdtTW611AqZtP1ot9Y5p2bN3bXlo+QcAfUEeCs5xJNCa5ouPmcZdZ6ysulLrV2W4UL3y2K5yRR0wxyNdzPHI44II6YOfA+e9FbuD+uu0dqiSTRemZL+ykpWymOKphpxEwuxyEyPaMjptk7ZVtdsehqrF2qdc2gQCGgF8knaWeLSebP45+i6Leyz0rJS8MdR6klacXOvZDCXdeWNgLj9S8f6KkvxbBpkdMexkpRNBNdcMNWcH7rT2LUem3WK/RxtqG0glikD4ySAedriHA7jY7b+IVk2rhffOJ+uKG0aVtU9fd7k/kZTtcxjS7GT8TnBoGAepHkupftJeCU+uOFcetLQ3u7xpkOdUvYPiloXbSDP9QkPHkC9a9+zc0tHfuM7rlHSBlPZ7fJKebfD34aCD4lc06XVeoR6M6GNyspc31Rr1xB7LPFjgpph18v8Aph2n7RHMIzVS1lNM6okcDhoZHI49GkgYxsrO0++SdrprjVD3Z/xMDXbM9On8F0R9p/rllssujLC6blidNPcZ4x1PK0RxH73yfcuYd31DVXysMdLB3kUe7YQNvmfNR315scI9PMkoszWpy6s2J0R2fOKnGHTVNfND6QfWacnkfEy4urKaMu5HFr+Vj5GnZwI3CsbVumdQaF1JcNOagt0lBdKFwZUmonjlw7lyGt5HEHYjx2z0XXvss6T/AOTrs5aHtdRF3E8FqjqKhgGMSSAyyf6zyuTnGC5Ta2406m1AKiV8FZXyyMYXZZyhxa372gKPV6euitY6sm0d877JJ9EXLw14Xan4tXOpt2lLVJeKymh94lY2aOINZzBucvc0dXDbOfuXjxx4I6w4Uaejl1hY/wAlOqWv91e6eGVxLMOP9G9xH1W43s0NHzUen9Z6lqXCQVVXDQwODOXlEbOd49c94z7laPbYldxS7V3Dfh/T81RDC+mNXB+oGPlD3k+Z5AdlUr0UfR43Nvmb+HUsPWzWpdSS5Uvwa7af7E3He4sopqrh/JLRPDJY3PuNGC1pwd2mbOT5Hor0m7E/GGSWKVuipmvi3afyjSY/8bzwujvGvihFwT4VXjVklGa8W2JvJStdymVxcGtbnw3K1Eovalx1c/dfmO9rj0PvWR9dtle1Gk0lb/qSa/fuK9Gt1lycq4J/v3mumtuDGseEddaW6stktqq7i/uaOFtVFIJDkN6Me7xc3c46q5tb9izjRqDSFxp6XSU9RUVDGujifcKRuTlpxvIMbDxKvKo4ut7YHaT0JTG3toKWhki5qTn7zAa8yPfnHkG/6K3U7T3Hyl7N/Cqp1jUUBuj2VMVLDRh/J3r3k7Z9GtcfoodLoqLXKxSfLF7fvBau1+op7OtRXPLqvt4nKKz+z57Q1FUMe/QLmtMfK7/2pQ5BHynVp8ROD/EnhJqGksmqLCy13OspjUwQe+wS94wFwz+jc7H2SAD1xtlbh03tefeHQZ4elrZXcuffuhz/AJK1s7SnH6u4y8ZhqaW2x26GGnhhp4ZXmVsbWtOT9XOP3qzqa6Hlp5kbvQa/itUVBxUYZ6rrv8WWVQ6G1PVW11ZNbXMc0kGnDh3px6E/hsr14e9mzihxOoamo03pGouEVO4MmL6mCAscd8Yke3K8qbipG0MIlOSd+VuwXTHsM0QfwKpLwGuBu1VLU5eMEtB5G/TDc/VazS6dai3knHCNxruPa/h1Haxll5wso5oan4Ka40Dqi26Zv+nKmhvVwLG01KJYZecvOG/FHI5oyQepCu/V/ZU4p6D0vX36/aUfbrRRR97UVMldSu7tuQM4bKSTkjotqKLVlFxU7ddRaocVAskhDuZuQBCzf7nuKv72iWp4bN2eZrS93x3y4U9HyjqWtPfOPy/RgfVSPQUuuyyWUo5x+8eZdo/i7ictVpdKoQbs5c7PbL9/kcy46yjkhyHNa7AOCOvr0WZYux5xdq7RFcINHYo5IRM2V1ZTNPIW55iDKCDjzCxLw84ft1jr/TllaCYauvhhc1pP2C8c34ZXXbtF6jHD3s+6wuEMncS01qfBTuBxiRze7j/1nBU9FoKtRCdk5PCOk/iP+JNXwrUafS6WEXKzrnL8UljDXjk5TcOuD2q+LFzqqDSNo/LNXSR95O1k0UYY3OAeaRzQd/Iqm4i8KNUcKLtDadWWl1mr5YfeIoZZY5A+MuIyHRuc07gjrlbo+y90dUUWkdV6hq25dVVMdLDJj7TGtyfxKyJ2++DlTxG4Ti+2WkbUag0841EbeXLpKd39KwfcHD/J9VPHhalpe2i3zfQ11/8AGcqONvQWRSpTxnfmTx78dduhzP05ou7a3v8ARWSyUD7hda1/d01PE9rS92CccznADYHqfBXXxF7K3EzhlYJL5qPS7rPaI3tjdUyV1NJ8TjhowyRzjk+izF2A9JXC78fKSquFtfAy1UU1UZHs2EhAY0A+ZDnLNPtPtbmyaD0vYmU09SK6skqpRBGX4ZEwDfHQc0jfuXlGjT00rpZz4GHEv4lnDi1eho5XW0nJvPtbxul0XkzmzLbgWkHlx05cZB/BeDKJvdFjWcrH9WgY/v0VdLqSkZAHkTwnfDHM3H0XyL/SPpzIZzyt/WOW4+9VMWLqjo/SKLfVkmUDLa2mge1hcxjvtcpRez7tSzt/RyRlp6nI/FF73n1MEqmtsG9d14e2LiRwytH5LqmRvpKdhaInFpwACWEdR9yybpDjLouyaep4J7rT251MwQvp5nYewtGDstBaHU92tELoqK6T00Zz8LJCBv1URLUOlkc+WUyPdu5zjklfSdTooalLm2wfm7RamzRSljdM6PS9pzh5F9q/Rn0bG4/uC9KftCaCu/6ODUFMHH9WXLP9oBc3H1zWkfFk+ZVNLdOpD8EeOVQ/k8MesbaPGZxe8EdMH3uw35vPSV9LVA+MUrSo2ezwSPy1+x8ui5n/AJwVdHUd9HPJHI3o6OQg/eFcdm7RusdOEe73epexv6sp5xjy3VWXB5R9R5NnXx+D2lFnQ2C0xxHrn5r5qpo6Zji4hrWjJPQALTOxdt/UNGB+UqCmrWdMhpY5e2te1+7Vemqy3UFE621dQwsMxdzcrT1wvIcPtjJZWxHbxSqafKzHfah4nT8S9XSxUpd+R7c4xRb7PcOrlhGGP9MwEeKu+WnE9MWjfPj5q3ayn92kx0PVdNVWqoqKONtm7ZuTJiliwwAKo7v0VJap++i2OSOqklKRdChmiDR03VNyFV8w8V4FoQHtpSRzNb2AZxmtiG3+UF9a03uN18MVMn+2V4aeeYta6ex/+fiH+uF+66fm73Rpx/8AFy/7ZUL9YzTIa2NDozhVEjdsdFT2xhZGSPFVUh3zhSYM0yNuEphAa09epKq7f8UMbunUKnuEXOzPkF5WmZz2FoJABWLR4ftdFyXBmSNyq57Acb7YVPXwmSRjvEKojI5G7EnCxbMkeL2kHYJyErLuu+zXqvQXD2x6xuUUf5LugbyhjjzwucMta8eGRurgs3ZZrrzwAm4lU1xjkEEzmPoQ3drWkZdn69FipI9exr+Rg4XyQtouBnYh1Bxv0nPqGmrqW2UneOhpxUZzO9v2gPIDosdcZuzfqvgrcaanvdK0tqnFkMsJ5mvPl81jzJjmRh9+3VQd+gaWsmGQ4HCyTcuGuo7dD3tZY7hTMxnmlpntGPuVpXO1ONJI10Tg4eBGFkmOvQiaN7pKdp8cL8jZl5yvO3tc2NzMnY4VXEz4ivcgqIWANByviobzDbovVjCB6L6kj+DKyPMFE2MNHmvot5QSV9gBfkucdNliYFt3iPMjTjbK96SDv6flG/MeUA+ZX1cITMNtt1I6fp+eRjSM8p5iPksZvCPEss+r8HUVugpIyA1gw4jqVGUlU2WPbcjYqsukoqLlIzOeU4Pz8VEzxupK9rOb9E8E59R4LxLEUxLrgrJJMH0Wc+xVoUcQe09w9tZZ3tO24trJmYzzRwgyuB+jCsDNcXShu2D1W/nsh9Di8cbtR6jfHzQ2S09212PsyzvDW/6jJVDZLbBC1udR+I9bpGm0pV0uuKu10unq0e7Ttu8rI6eXO/IS8gHOOnosH2Xhd2Uqmua202nhzNVO+FopX0rnnPgACtevbG64bTaa0HpJsmDVVMtwmjB6taAxh+8uWl/Y8oWXXjPp2zPbKDcq+GOJ8Q6ODv3Yzlau+zs4bLL8hOWFssndaz2m0aM05FSWulp7ZZ6KIujhgaGRRsAycAbYXGKhsdXxz491Qtdvp33PU94qJnzug5nN7yUvc52c9AflgLrR2itSR6O4G6truYRgUDqZpzjHeYjyPkHZ+iw12JeDMFss8WuK2kjZPNE+G2bbiFx+OX0Lug9M+aq3R7S6FaWy3K90pc8aorr4+SRkm+UMfZZ7Nc1FouxVN4rLNb+4t1vt9M6aSpqnbNcWNBJHOed3oCsF+y9susrNpfiJ+etou9rulddYq90l2pJIHVD5GvMjxzgcx5hvjzHmpHjh7TLSPBviLd9JR6brtRS2twinq6WoYyPvcZcwZ8uiv3smdtCz9q2pv0Fs09WWJ9pZG93vMzJBIHHG3L5HC2Ze6I1V7ZmiLdF2idQ81op53XKCCd9S6IF7AY8PIOeu39yt0eyXp6LRHZu0ix8EdJ3lCbhI2MYaGyEvafD9Qt+5a6duTTVXNx10cbe4+9XalipGxgZEjzK5mD8st3W0PHLUMHC3s/6lqqd7YGW+0upqckgY+ERt/ep5tKEcFapSdkl4FgdlPjxD2hdMaysN9eyrulrrqilqYZG/DNSSOd3Zx+sOXLD6tPmojsXdnav4Ear4ox1zHvpZbmyC1VDzky0nKXtOepI5g0nzaVoN2W+Ml14I8c7NfKx75LBVv9wuMjT8EkEzgO8HnyuAf/mkeK7NtqYnUgqGyNMJZziQHYtxnOfLCoxUW1l5aNjZmGVHozkd7SC+V2ve01cLY2o7u0WOhp6Fobgl7y0zP/1pCPmFhjhfpL8s6y01Y6agE8tfcYKd/I7OGOeA5xJ8m5OFP8Z9YR644p6tvTnBzqy4zvBO5DeYgAfRZP7CWlXal7R2n8Q4pbbHLXOPh8LcDP1ctBKTvux4Nm7jFU058kdWrhUWvTenXOulRT0Vrp4RHLLUvbHE1uA34icADwWEXaS7NL3YNPoIvJyAZqbP71D+0K1ULFwIZa2yFsl6uUNJyt6ljcyuPyzG0H/KXL6Gjlu+orTbaYd5LNMImNG+XHZo+9yuavVqmfJyJ7eJS0mldsHZzNb+B250Jp7TOnNOQxaSoqCistQfeYm25rRDJzAfGOXY5AG60l4N93xT7f8Aqy+j9NT2d8/I8nIaY2iJoH1c9blltNw14ScrMR0tls4a3G3K2OLA/ctQ/ZkafNYeIOr5vinra7uXO65eSZHY+rlYtXNOqtL2/IipbjVbZ8PmbacWJtBVNiZadf1tpp7VVu5m092qWQslLMHbmIzjZYebw97LTGSd0zRLtsuDK6E5x6B6o+2J2VtVdo7UGnp7PqCjtFBaaeRnc1DHOL5HuBcdvDDWfcVrPrH2fus+HOl7zqSs1ZZ326200lVNEIpOd4a0nlafM9Pqo9TO1N4qUkvFkulrqcUnc4t+CLq7A2m6TUXHvUWoKWhjpKC3088tNExuGxd68BrB5Ya53+itxeN8fCm/22jsXE6ssApHP96p6O91UcQc4At52tc4ZxkjPqsFezU03JBw61PqCaMMNwuDKaJ3iWRRgk/V0h+5RnbJ7EetO0vxOo9QWzUdstttoqFlHBT1THucN3OcTjbq4rzQxlDSppZb3JtQ67da42T5YrbPuJTUvDvsiWXTF1qqSk0DNNTU0s8UEFdC5z3tYS0NAfuSQAuXML47syapiBZFMXPa3O8YJJAxnoOi2N4rezo1VwX4c3zV131ZaKiitsHeviijkD5PANaTtk5Wwns7+HHCbizwCppK/TVruupLdVzU1wfKC6UZcTGTg9C0j8VHdTZqJciSi0dRotXo+GVO6UndGW3ua9/vOfMNvklhbFT85mJADpANz4bD6LtzwhskXDLgXpygnLYo7VZ43TP6DLY+Zx3+q1er/ZyOl43G/Ut3oqXRhrm1jbcyF3extBDu6HhjI6+Szb2yuJ9Bwr4A3+n75kdyu9M61UFOHYc4yN5XuA8msLjnzwPFY6WuzSxssuPeL6jTcZt0uk0G7k9/ZnH23ya++zrtr9ZcUOIuvaqIGWokcQXYJjfNK6QjPyyPoqD2oGt42aj0dppxcGU9PJXPLATvI7kAP/Zn71WezI1/a6F+qdJzzxQXCrkjq6ZhIBlDQWuA8yMg/JZX7W3Y8rOPN/t+pbFdYKC7U9MKWWCraTHKwOc5pBHQ/Ec/RQqM7+H4rWW+vzNlKzT8M/inm1j5K4ruvfHq7fXJqF2F7QNWdoywsa3MVrgluEhcPENw3I+bltV7TPWH5B4DUVmjlDZ73dIoyzOOaOIGVx+jmx/erm7I/ZEZ2dxdrvdblFdtRXJjYnSwsLY4IhvytzuST1K1J9oXxSoeMXGHT2jrNILhRWJxpjJC7LZKuZ7RIAR1DQxjfnzIqvQ9E4S2lL8/6JPSv+oP4lhqKu9XUs56LEd19TdTsUaZ/Nbs36WEjRHLWRvrZB5c52/ABRvZf7QUfG2fXlguoIuNqu1SYI5sZmt8kju5IHiG7s+QZvur41zUxcH+zrczG8RCyWA00b27YkbD3bD/AKWFyt7OHGCfhHxntGqJZZTTyymnr2g7SwSHD8/I4cPVoVq29aR1VPpjf7Gi0fCreP163XQWZZzH39WvlsdMeAvC2bh/rvXTpaZ0dM6ojjopiBiSEgvGPkSR9Frb23eK1lHGf8g1VYI32mhhjkjMbnAPkBkO423a+PZb90VbBcKGGrpntlgmY2SORhyHNIyCPmCuJ/aQ1qNb8aNa3yBjZ/ebpM2JxO/csJjjP+g1qi10Y06dVx6NlfgWmnxPW2W257q3x57L9S8p9SaVvMT295RTOA3EzG5/ELEmuLbbY6x/cMozG/Aa2n6AdADjI/8ARW3UyyRUcb+QzHIy1rPiAVEZmxs5peYN6kcu4+gWhWcdT6PpdAtLbzp/PyPGS00o5md18LjuG7IvaJ0bo3Sd6O7xuceCKZSkzYumt7uK+hOmokyQV+Omc7qVVytY5qpHtZ4EbL6mfnM83O2O6pic7FVTgA0lUjyC7ZDFkfXNdynByB1UaQ0D7W6lq4ANPqFAzHD9kMD8lIeTsqZwcHjlPVeuclB5+A8UPCdt7nCBod1AVJfYhI1p6FVNvkEkLSF61UDZ4y126xPUW/aZxDVBrjjOyuTp1VuysbFOCPAqYp6sVUeW7YCHuD7k3HmvF2y9ScNI6FU3MShifdkLW6wsLj4V8P8AthUmuqjvdUXdg8Kybf8Azyqi0tP5zWR3lXQn/XCotWAu1beQN8Vko/1yof7jMpaZ7oYm+oXp3xOclfPLiMZ6r4zjqpWFlCciWJ7c7qgskcznvxG4xc3LzY2z5KskeGtKpbbWvpriwBx7suDiAfFeMzLy0zFSw6otJuMPPRsrIjPG8dWcw5gfotuO1dwUtzteaEuVlt8VJRX5sNI/3WMNbzhwGcDzafwVdxU4CWbjHw0ptc6Fgay/UdKz8pW6MBpeQwEuAHjjceaz5wZo6bi5wb0TX3Fv+O2CpZI5rh8QkYCwg/cCtXbZiSkuhapjzxaJTtGaAbqHgNfdPxNa6Wkt8dbA3qQ6Hfb1LWuCwt2Kqx+uOBPEHRjh3pjjdJGxzRtztI/eFlSPinTXXtNaq0NUSd5SCzwtaHHZrw09436iUH6LFPYtoHaE7QvETRs57top5A1gPUNflv4EKOvONzy3Ej87Os1z4m9nu7cP7BdX2fVtlr5Zmd3IWOexzw4O235c5acKS7Vtp1JpHgToe6X6cVOpbFXQySVEn6QFzSS0nI3+yOqruzjpWg4X3XjDr+skaxtvraigpHuP2W5L3H65aPorT4l66uPFfsa3G93moNTWMujgHnwb3nwj7ipUsEL6Iyb2Y+11cO0Hq6PSd90paSPdnTS1cTCRgAdWnpk+qtTjtr3syXeTUth1BY3UF8ohLE2pt1NyuMgBxyOG2c+eysr2aFtFNftc6heAGW+2iMOPm4lxH+qtdaLQl2478Y6632thlnr6+WZ8xGWxRl5Je4+QCrcr58KTSROnHGXEwlR6dqppZ6ltNK63RvDZKjlIawnoCfNZB40cKKThZerZT0FyddKG426C4QzPZyuAkbktPng5GVtx2udA2vgrwJseitP2KWqknlbNVXFsROC3cuc4D7Tj9wWmes9XVOrrdp+GpLnT2uhFDzO8WNcS0fQHCvVzc3ldDCyHLgtRoBbsF8vHwkEbrZjsY8F9McZdWX60ajZI/ltj5aMRv5SJQR8XrjKwZrLSk+ltT3W0vjdmjqZIST48rsKxnvYIX1LSIwV8yZOdlUPbyuIxjC85BsssZPCImZ8RyFJ6fAhZVzuAIa0DHjjqf3KnkiDnZ8VIMYIbETjBkcQfVYzTex7Fos9tS6a6OdnZziVW3mnL6B0gHxMcHj55/wDVUPK1lw9MqfxmLldu0jovUtsGLwQcJw8HOcrOPADtda87MtFd6bRZtkQu8kUlU+toxM5xjDgwA5GAOd23qVhLu/0zsbNC/ZiM+WVWtRXb3MocfO0drDtI6kor3rOellrKOn91hFHB3TGs5snbJ3yeq9+BXE648JNV27U9mZT/AJSoJHOp3VcXeM5i3lyR6AlYrihbI3Od1LUNeyClAxlodkNytXfDbLMXLl3ZtxxY7avEPjZoubTWoKmg/JckjJnikpBE4lucDmz0yeivrg325+MOoq2DTdv/ACLQ2S3UraeOOC3AGNrRyNa0822w6rTWlri+hBj3JGD5+ql+FuvYNHa5FNWySNt1Y3uZhEcBh8CfPrv81otXZeqJul976/8AsTcnFYZMcZ+FNysT7xfqqokfNV3Fwc2re3Mrnku52uz59fJT/ZN43a07Plwu0umKeldWXWBsXLUNbI12HAjGSB4ea8e1Fqajq9G2uht9Q6WP3jnJ3xs0bj7ysC6VobhUhj6LvnucRvHIQW48dlZ4ZffbpVZa8tm4jCMsZXVeZvfq3tE8Ytd6x0zqG5Wm2G4WZ3vNE+OFhYC348va1zsgFufmOoV5XHtB8Q+LOiq2ycSG0tTbqmqbimobVJEC1rstdz+I8SCFqjwPs1fcb1c6c1k8Th3TCwvLtjzZWx0thuNNa3tp71VMkDctAcM5x0yR6/grE9S23DJ7GmKSkjB3FC50ZukccEsEjG/9VA6F7cDOCzGPE/csoWzt6cULFoul03Hc7bJboqT3CN8tIDOIuXlGX56gbZ9FibidTXN9cxlRXTzPEoPNNE3m2bv8Q6+Cx9PT3NlS/lghMfjzu6nzVGU+SWYywbKEIyj3lkn5XQSzSTPcx5ecSHOck9chZG4NcadR8CrzV3TSraNlVUQ+7udV0/ehrc5+EHpusOsZXmTL6KncQNizqdvVVMtzqIGMJimYPFrAchUlmLTi9y20ppprYzhxr7SOtOPdPaKfU9ZSFlsfK+KClgEXM54aHc3ns3byyVjTTt3uml9V2e9wPp3VFDUsqIIZGcwa9ruYcwzgjICtcXFzJo/iqWyP3DnDdwx+K9KS8Pfd4mOd3g5w058Oqws5pZk3lk9ShFKCWEbN687cfFfXGj7vp+5SW2G3XCnfTzPp6QNe+MjBDTn4T96s/gT2vdb8ENEPs+m/cqe3vqH1TzVUQkkLj5nIPhssezsEkMj3HmBDi0eHTyVs6frHNt4bMwxMDnDLtg7yUVWouknNyeSaempjHlUVhm2U3tHeLUXITU2docMjNvG/4q29Y9ubiRxM0zd9OX2ttn5GromiX3ajEchAcHY5s+bR9FgerMdZG0SMEg8MjoqNtrZJWxPLQ0hg+HPr5fRZy1NsouLmxDS6dPKgtjY3hZ2wte8J9D0mnrA+2wW6nfI9ompBJIS9xcS45674+gUHe/aicbrbd56dlVY+5Y7Dea2Dp6nKxHHC3IcJXNz1bnbyWNtXaXrpLhPPCXVfQ4Y3fGFNodTNS5JS2xsS26SmS5uzTfUzhxW7dnFLjlois0pqWqthtNU5kkraOiETzynIHNnpkLGHBXjFq7glrJ900deprPWSx8sjGgPinAOeWRjgWuHzG3grRqNL3uywukq6QuZg55AcD5qMt9e1l1p5XAsLXfEMZ2WxcpSUpKWdjZadaeCrr7NJN7rHnsb6Re1F4umhEDrTpZ0nLy+9CinEmcdf6flz/m49Fr7xM4ua04zXz8s6ovc9fWj4Y9g2KJn7LGAYaPkFZkBjNO17peQEY+IYUlT0+WscJAQd2nIwVortTbYuWcso+ncO4Tw/Sy7TT1pS811+fgVdlvV507X0tytVZLRXGmeHx1MRLXNcPEEdCtmbJ7SLi/pa0xU01PZNRSsAaai50rxJjHnE9gJ9SMrWuCheGkkfF6L5ko3YILQWnP8A6KrVqbKXmuWDdazhOj4jHGqrUn4Nrde4zNxL7f8Axa4mW2a3yV0Gn7dMOSWOxU5iLgfAvc5z8egcsF2LVtTpLU1svcTo311DUMq4hUM52Oka4OHMD1GRuPVVkNoa1uAcfLZfAtMDmuz8TvAEqSzUuyXNJtkGk4VToqJUUQUVLrhdff5maOIPbi4mcWdKV+l7/W2wWuta0TNp6RsT3AODgObPmAsJk4wAQNvA5Xk6zRsc0uibIR0LlSVFF31Tl/M125HK75/8UnZK+XNKWSDTaWrhtTp09aim87bGxule3bxW0ZpKi03b7hQOoaOD3eGWejD5Ws8PizuRnZYAqHue4vJy9x5nE+J/uVQTxyYZyyvjx5DY/evurknmY0xSRsI2Ic3r4KSdk7MKUs4KNOn02klOdFSi5bvHiergQ3J2PgvAlzXHJy4/ivipq6kQs5IWvd4jOF4y1ro2Nc6El2d2s6hYqLJ3ZHxPfu2lpaWNI8RgbovB9zjZEJXczW9d29EWeJEMp1Z3aLgJc5u+x8l4uznC+nkg7kjC+d+pX1k/MZ8P+yqJ7hGSSVJNhJbzeCj62aNji3YnxQxZDV9YHOIUe9wPVV9RTiWQkbKkmg5NuqEZS5+JeVTMI24HVVjYCd8KOrR8RCArrHVFkhaX7E9CrgcSQrKp5u4laVd9HVtmpw4bk+CxBGXaPkILRheVtquR7mE9d1XXId815HgFEUj2tlBJ3WLPUTRlznfdePNhfYc0sz4ryLhhEesqLS4fl+zO6ltZEeXz+ILw1bEW6zvQA3NbMf8AXK/LfJyXy15//NR5I6j4gqrUkDpda3jAJPvch8+rio5bPIRRUFtnudbT0dO0yVE8jYo2Dq5ziAB95CyRxZ7Muu+DUVPNqS1GGCVgcJ4Hd5GMjOC4dCsm6M7DXFC+0Vvu8Vrhp4pgyaHnm5ZANi048PAro7obQ191Pwwj0vxQtlLcHiEQe8MPOXgDAJ22PqoJ3csl5EiW2xxKoLLU3SripaeF808rwxkbGkucSdgArz4w9m7V3A+h01d9SwwUsd5DnQ0zX5lZjfD2+Bwt8Kfglpjsca11DrO9Wia/2tkQls8zY+cU8hJyx37J+zhy0U7TnaCv/H/WT7teH9zTQEspKNpwyBnkPXzKOxzkkuh6uhvHwb7TfD3g9wN0eamhjn1FeII46tsTN+Vju753n5NKyzQ6z0Bwdrq6vq73SUOn9RNNypmBw5RJy/GBjz2PzXIuovlTcrdboJJC5lJD3Ue+3KXOd+9xXhXXesqYo2T1M0zIhyxtkeXBg8hnoq8tPl5ySQs5GZb1l2gKmi7RFz1/ZT3ubhLLFFMdpIXDl5T5Zbj5Khn7TurRxfruIdodBZ7xV/C5sLQ6Pl5Q3BDs56LDUu7iT1X3C7GArKqh1wMtoyjU8cNYXKy3e0T3qd1Bdqo1tbBkcs0p6u9M7bDbYL0h41aipuF1VoISQfkKapFUcx5ka7yDh4LHUR2X28EtWXZowNkOzV2nLZwZ4dcQrDV0dTLXXuAe5VMOMB/KWkOz0G+fHxV8dmLjroLgxwq1HfaqZtVrmV5bHSPYeaQfqYP7A6laXPZnJA+q+4iQMZKrzozlp9SaMmjdXRfbz1Nrqth0nqmxW290d2l90EjWd3JHznAPiDjPkFrDrrQddYOI1609FTPdU01ZJC2BjS5zt8jH0KtuxXqo07eqK50jg2ppJWzRl245mnIWT9D9pWrp+0VR8Rb1bKeqmiqO9qaaJgDXjkLCQD475+awjX2M81rb8kk59pHvdTa/sPdlrWukNWUGtr1F+Q7e2B7W00wxNMHNxjl8B81k6v4C6S0Zc+KfELWNso6+jqWze7RVTA5rIyzLyAeji44z1WK9H9svW3HjjNp+z2WmFssrqxhkp4d3uiG55j4DCkvaN8ZvdbbQaBt1RgzD3muDTg8oOWtPzIz9y8jKc5PKwYyjGK2ZzquzWCvm7tnLGXktb5DOyoZAMYwq2rIdk+OVQOzkrYKLKzKKUkPAG4JUxcREyx0w5v0jn7A9cYJP8FAyOLJyTuAeiui7wt/IFpeQMlriHZ67LCzZoxXRmP6+MMnPL9rxUtA4mlaScnCjrntVkqvp3Zp2rJGUksEdJJyykDz8V5zNLyAHblflc4MlyCqeWYgZ8VDMgwVDHvpgPjaS44w7r9FWU8kdROQz4mNaObOwzlRPI90ZO4z9SVOaGpGz6poaeZwZFK8NcXDw81rdR6j9hG8PZl4xiK02zvHvxyM5jzHY+Ow/v1WMHV7KisfLzkukcTkeeeqyXxtijsooaajdLyyxESd5g8xHU/VYipG4mAIwB0Wu0keaDnLxJElJbdDLWvL3S1/DTTvLM19cJZGVDQBnYDB+oKs/Tc5hhlc1xYXHGyjLxI73KBmds7BVdlOKU5OPiU0ao1V8semTaw5U8JYwjZvspPZz32R0fNIHRNDyfsj4ith7hK0WOQOdFIC3H+MZLTuOuN1r92W6YRWO6Tk/HJUdAPAMAGfIfESs63Wo7m3fo5HjkLQ7u2B/L47jy6Khanzskh6pr/r2uip7zyOYyMb/ANHKXt6+XgraNQ18pAkyeuNlNaqnZW32d7e6ccbmIcoPrhQbqeNsvOGgP6F3otdYsyeTbV+qj1jfzOc1rgT5/wB/kvWNhH2iHH5KObC2J7w0ObzAn4T/AH8V7tbM2NrWyO28X7kqFosRK9rWmQO5RkeOFRV9tp55SWxYqpDjvAN8/wBwV4XG7m004mlfG2Adeuc+iibay5yzi5uLo6p5y1jzs1ngMeayjDKzkycsPCWS5G2O7GndHJWtEWSS5+7h5AeGPFflZWw6ct4DKinmqevK5u7/AKNVAbncr1SOikaKZpceZ27ScZ6/Pqvyjt0NM4vbG1ztv0mc7pyqPX6Gak30PujrJQXudES2V3M1hO8Y9c+fVSM1Q3lPcxyyTsGBgYYR16r4ijjkJ+IZxuAjKkRzth5jhwDtupw4KGSz0RYjseDbzU1tSynpW92/GXCZgBjAJyQPH++yuO10TKamb+kcJHuLpHg8x39SOv08F9NdR0kHvTw1reUFzzgZz4ZVoVGoJbrWS0Vmg93bIcvn8h5+g6rKEeb1Vglc+zxl7lTr7UlOaOe3w1LxVhvdkxtzscbE+axbDbJKd7ZO7e12xD3Hp9Fky3aCpIWkyvlqJic9685BPn6qeFiYaPlbHHJLjGXswD/YrMdTClckdyaFM7WpyeMdDHVPVVXd4klBwOhYXZ367BfbrjUiMAtZUNA2BicOX8FkE6Qoo6Z0vuBnnx8bYn436bZVY3Stmt1JFJVQVBEvUDLuXpscKtK+jxidHTfrcYjb+/iY9/OapmjZzwzNaz7JikwcfIhVEusi4tDG1EXL9oGNrg78Vk2p0tZGsbH3phfJhzSX8vN5df3Lwl4bU7WNMdS/LjgBzc5+76feoe10sn6uDaR1nFIraxP4L/Rj6TXDM4jjPKdnd40/wXoddUnM0BziHbH9H0+n1V8u0GIyW4jkx+ufEKin0AzvQWCLI67gAH5r3Glf/syfFuKR3ck/h/styXUFBkZq4gHHYOBH35X26tomlrRVUxJ+zyTDP71MVGgZ2AcsbJsn7IeMBUMnD10xANDHlx5t8FZRrofSX2K9vHdTnvQX1KfvYSAA+Ib7YflfTWFwPK3mz+ttuvOXhcZHb0rg7zacHr6Lxn0DWsIbHLUxYOMRudjzx+OFn2NfhMhXHZf31/J/6Kh1O4gAxE56DdUc1G5rjlr2488r5qdLXqiGYKydjW9e9BP4lUc9Ve6ZuBKyoc0YdzD+/mslp2/VkmSLjtX90Gj6kpnMHUnPmip6i6XWGEPMcco8QxmSEUi09hMuOaP2/Iu+WnGT5n8F8dzyStBPiOqqTUxRyYna+P0c0rynDKh2WyADwyvpx8Aex411Y2mhdvkgY2CtGV0lRO5xcXZ6K562iM0XUjAUQKEtPXdDBvJGSTtiOCd14x1TJHuBO6kam0iTLjseuVFOg5HloACGJ7PqmsaQG83qoec8ziVX1hZFCAN3HZUMu5QFHIB9VL2Ov7kljiDtjJHQKJlb+K+aeYQvJH1yvAXXUuEjPhII8woOZndvyOiq4ajmjC8ZTzgjwHRYg96Wcub1yvVrtj81Qwyd270XqajBIBHqsTI945hFcKGTO7aiP/aC364D8HNC3/Q9yu1XS265XmtrKh9TJWsEhpmtfhsbW9WZHxcwIIzlc8a2qEU1M9pJcJozj/OCuzU+rLtZtTX6korjVUlPLO5skcEzmNePUA7qCxOXQyi8Pc22uvb+15oC8XDTdmuFFcrXb5X0tJVTRB7ixpw08wxzYGy2b4WcftRcbOzveLxaLgafWdtjeJmsGQXYyHAeGQuQbKl3NkHputrPZ+8Z4uH3Fv8AJNxqGx2m9xGnl7xwDGu/VJzt6KtZTFLJPzt7IzRwd7eVLXW656S4uwtrKSXmiNc+AOBHi17f4rQrjM+wza1vcul3yOsLqh7qQyjld3fhssidq+32exccNTUthrYaug94MgNO4OYwuGS0EbbErB9wDpqaRpcc4U1Vagu69iNvPXqe9vlLqVhzlejznOVQ6eqmS0AGcuY4h2VtFwk4Z6P4m8LonXO5R2e5Ww1R7wcgdO44cwOJ6gBpH1UsnyrLCNY5Wk7gbJDzPIDGkk9ABkrbnjHwq0Lw24K3W0Q3SnuGoxVQ19NIZYi9sZnfEeXl3PNGGOIPQb4VLpPTnBTh/FpDUVTqE3e4TUjJqmgkflsUhc1ry4NG2AX4aeuMqu7kt0ieMG/E1up7LXSQ1EjaWZzKZodO4MOIgTgF3lk7KttOlbpfxm30ctSPjzyN/ZYXu+5oJ+i2M0/xb4dWLitqttVCy46TvVop6aVtO1zmmZndvOAcHq07+ar7Nx54b6P4m3ustFjedM1VE1kMMcIb+nwQ8taSeUFriOv71lC2UlnBE1ua3aW4e3XWF8o7ZRwuZJVSthEsjSI2FxwC52Ngrr1v2fb3oTS4vVRU09RFHJG2WKLm5mNeHAO3Hg5rmn1CzXV9tWmodN1NHbtKUsFwmgEPvjeVjXFvMxjnMA3wzlP+VkrGnE3tP3XiNpWTT7rLbbZTTFpmnpmHvJMP58ZJ2BcScDzWE5WtrlWxKlFLqYTdHkKgcfdrg0+DhhSLtyVH3SJwayUfaYd/krGDAzj2X+PMXAHiBLfprZ+VYZKSSm7sEB0bndHDPy39FaPE7iDceJmsbnqC5yGSprJTJgnIYPBo9AFY8UhzkAbqsjGW5/evFBc3N4jJTzb+Gyo5CBlSFRgMPko2TclSp7kUmUFQ0ZPlhXzqC3j8ydOVYHwv5mEjB8MqzKhmSMD5rJdyj7/gnaJg4F0FYA4A+BDm5+9YWY2yK1zNow1dg33twAwQOi96J57o5xy+i8byc1ZxnOOq/KJ2GEeCNnr6YIOvc6SudnOA7ovuSQFfVaGCeR3mVQyTDfdQy6ELJGkne8uaC3PqcK4uHUgg1xbXPaKlgl+NhJw4Y3CtWlyQCRsrk0JU+76uopWtJIJIA88HdULlmDRg+hdvH54fXWprKaalDYnfo5X8x6+eAsUU8jRNmQgfJZG41VtXUXWjbVNcJWxnd3qVi9wLXklV9PDFSiSQeywSVzqGPEQa4HGSpKyjnjDRsMkk5VsyP5uXzU5bC8UrCIzkHIdvv9ymccItRnk237NUvdaSndkAPqH7lvjygb/3/gsqauuTBTAMZzvDSQY5e7LTjGcfrfIrBfZ1urYdMsbLVMZAyaSSdjmnvN9mho8RkZP1V48SbyblaGy22d0Tg44jqI+Vzx5sPitXaszLMbYqG5jG5zvkulTyve0h52kwf3KmZLUNmDSGOZj7Wd/uUNa7pC4SmrqWQzd44EPPLk5zndTEbC/dsgdncYWqsXe3NzVJSisH1HVOPeF7HMDDjcA59V8Vt+p7fTGeaVjY8bHx+i+KythtVO+eolaxjATl39/RWnTUNbrG7R19UDHa4zmKNwwXfT+K9hWpLmlsjNycXhdT2tsVVra/Mqq7nprdAQ6ODoZPEE/dusid2C/AI655T4KKjp4WzNkDfiYOUYPQKpil7suAe4jcgHwKhtm5tY2SLFUORb+JVCL4+nMPVUtVRCRhy0EDcADCNqZwx+MTSgk8gGMr2dVDkZzscCerWfFj5qvnzLaWUfsVOTyPa4x4GMNAOfnlftRbnzEnvnNAwWlgw9p9Cvs1UFPK2Jzw17x8LfEqobKH5wUy08ozUfMtJmm7hWy93WVss0DcH43czdifDPX1V0WllPSQPZHDJCG4a4yDd3qvYDnABccDbIC+2QZAOchZyslNYZJVVGDyispa2Cpy9szS3OM5UjBHE5oIkzjG5OT/AMVDdwwtIcwFp6jC9WwROgbCJXQMaQQ6NxBCqSWTaUrcuumgc2NpaSB89iq+CFrywFgcreb713bBT1OCMbuGchSL6+sgEfcwsm8HBz+UjpkhVGb+vZbkubTT1HKZII3FhyOYdPkvupsNPUiGSQudJEcscHFvL9xVM6+ug5GOppXcxGZGDIB9d8qrkv8AboZI4J6hsU0mzWOyOYnw6KBpkjaPirsss07HCtlh5CC6NgBa75g/wVPW0FwNQwwSU/uuRzNlYS/r4EeKlveIQ8tbMCM9M7r6dU8pABHL0yfFSQRrr5NZwyArRPBUsjZRF8B6zMcAW/QheEk1NT1MUBFS3mxyuAdydf2grjfO17vsDA8QvLu4zIQAANuoVhLHU0Flks9SJmkpaaoZFNUhj3nAD37n71W/k8NcHNc0ZJI6ePiqn8n09RKHysjkI6F7ckFeFZZaOqla6SMEs2DskevgVlhEHaSyfjaIMaRzlwHTbZR1fYKCve91TDE4tOAWjlPQfeq6qtPvMrTFWT0vL/1ZBH3FfFwhqHuYKWaHII5mSsJGPoso5TymYueepDS8PrXI4ubE9mfAEIputdUUlOHwUoq3frMjkAx4ZGUUqnZ/keZj5GfR7MziEYyx2qtNOB261H8tU8vsvNcyj/nRpxvq11QD/wCGulSL6R6RYfO28nNB3svOImSBrHThb4A+8fy14Seyz4hvdkat0z881H8pdNkT0iw86nL+X2VnEqUOB1fpflPrU/ylRj2TXEXlGdYaYz86n+UupiJ6RYeYOVdT7JHiNO8Eax0uG+RNT/KXwfZG8RiP+eOlj8zU/wApdV0T0iwYOUUnshuI7+mstLD/ADqn+UqY+x94lFxP56aV/wBKp/lLrMi89ImMHKaD2RnEmKMNOstLHH9ap/lL7/wR/EfP/PHS/wB9T/KXVZE7eYwcpT7IviRzZ/PLS331P8pD7IriOT/zy0v/AKVT/KXVpE7eYwcnar2QXEuVzHM1npUOaQck1Pgc/wDVeilL/wCyY4i3i9VlczWGmGtnkLw1xqcj/ul1ORedtM9OUQ9kPxIB/wCeWlfvqf5S/WeyK4lMOW600uHDoQ6p/lLq4i87WR7k5Rv9kVxLe7J1ppYnxJdU/wApecvsg+JMjCPzz0sM/wBap/lLrAi9V00e5ZyWtnseuJVCx7TrTShBdzAA1P8AKUo32SXEtmOTWumGAfsuqf5S6qonbTPG8nKeo9kfxMqCA7Wuly0eJdU5/wDCXi72QvEdzcHWel8/5VT/ACl1eRY9pI95mcqKb2RPESHrrLTB+tQf/wBpStq9krrUTgXDWlgbD4up2TucB8iwfvXUJEdkmOZnMC/+yS1k6aMWrXFjqIQ0ZdWQzQuB8gGteCPXI+SjP8ElxF//AKw0v99T/KXVJE7WQ5mcrx7JTiKDvrDS/wB9T/KXxN7JDiJNG5h1hpfB/rVI/wD2l1TRe9rIczOU8XsjeJMbQDrLSxI/rVP8pVMXsl+IzB8WsdMH5Oqf5S6nonayHM2cr5vZKcRZW4GsNLj5mp/lKl/wRPEcj/nlpb76n+UurSJ20zw5RO9kNxHI/wCeWlv9Kp/lK9LV7L/X1Nw2r9N1WrNOSVEkgfBIx1R3bcPDt/0fz8CulKI7ZS6hPBySrfY68S6mZz2600oAegJqf5S8Y/Y4cTmDH57aT+hqv5S65ovO0kxk5AVPsY+KExy3W+kR8zVfyVRn2KvFJzwTrnSOM/tVX8ldi0WPOzw5Bt9jLxNbFyDW2kht1zU/yVL6J9j7xJ01qOnr6nWulpIIw7LYjUl24I6GLHiusqLCXeWGY4Ryi1/7IXiLqq4wVFFq/SlNHHHyljzVDJz1/oz+9Wl/gV+KROTrnSP+lVfyV2KRYwioLCPUsHHV3sVeKBxjXGkdv61V/JVfS+xp4o07Gj8+NJEjr8VVg/8AdLr2iye5nlnNzhZ7NTibw6gp4Dq7TE0PeZnDfeDzNOc4zGN91+az9mBrnVBmqGavsvvsj/t1EkzmcvhsIev4LpIigdMG8s8yzlBD7InidA4vbrTSYfnIdioO/ngxYUpS+yh4nsqGvm1tphzAcnk94Dj6Z7pdS0WD01b6omjfZD1Wco5vZGcTK25+81mtNL1EMWTDA99SRnO3N+hGQPJXOz2W/EQRjm1Xpd78Dm3qAM+OP0S6aosZaWqeMomhq7YdGczv8Frr7O+qtM4//UZ/8NB7LXXvNk6r03j51H8tdMUUb0ND8PqS/wAwv8/oc0G+y3161x/969OYySN6jxx//b9PxK92ey/16wf869OffUfy10oRefy+jy+p6uJaheP0ObP+DC12c51Rpsj51HT/ALNfjPZe63ZL3g1NpwOIwSHVH8tdJ0T+X0eX1M/5pqfNfI5rs9mBr6PmI1bp0kjbJnOD/wBmv2L2ZHEWON/NqzTMj8nlHNUgD/u10nRP5fR5fU9XFdUuj+hzhj9mbr7kBfqjTgk32Dqgj/w17D2aWuwQfzn07tjxn/lrowix/l2nfh9SWPGdZHpJfI56s9m9rVjdtTWDOPOf+WvVvs5tbNA/95rCMf1p/v8A6NdBUUb4VpX4P5ln/qHXrbmXyRoHH7O/WTWgHUdhP1m/lr9k9nfrGRwJ1FYCB0z323/d/Jb9ovP5VpV4P5nn/UOvf9y+SOf0vs5NWS1DJzfdPmdpyJC6fI/7tJPZ063kqo5hq60R8vVjXzFrvmDGugKLJcL0y8PqQS41rJ9ZL5HP53s8uIIqw9mq9PdwftRubPkfIhiqmez8102TB1Fp4x/tc04cfp3a33RZfy3T+X1K/wDM9T5/Q0PZ7P3WQOXaisWPIGb+Wvz/AAfmsgcjUViz55m/lrfFF5/LNN5P5nn8y1Hn9DQ1vs/NZt/+Y7D1zsZh/wCRP8H1rHH/ADjsZPiSZv8AcW+SJ/LNP5P5j+Zajz+hoYz2fetG7fnLYuXyzP8A7iLfNF7/AC3T+T+Y/mWo818giItoasIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiA//Z","1711192293"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AhobqyKnmANFpSFdkEohnWFvemimTO/ImkX1jpHROW1p"},"signature":"Mig6SONgVK8qlkjPdjMyZqyXhrC1GRjcqBqsWmmi8K4161e8nPW4JV4eQUujf61nbtfOFuYoQtePvhpFp46iVQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1w8cpkflxysztll935x45llywtz0rdwajcm2lwu","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"IeJAGNws4CG7SaQrbWiCZ4visLdmJb8EROMUzsvH6jQOCJD+L8OD89RJAXHdNnziF92aLRuq8HpD/erRk1OtUw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/banktest","func":"Deposit","args":["ugnot","1000"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"drgnmIU5Wo8/5KoKUqfnt+ckBiBCY28Cpz3H/Ncefz0eqoNpTkEjen90id+YXs+77NXwMesUWqbKr3+SyjySdA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"+UWRiMgHXnUYS9ywWIsVZIQK/3N8nrYJ6ksTokK4PAd7drSzR28eVVtRX1zxi+gOLPM/5CXyZn8vDbo8Mlp64g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"1WrLgIiyRCsjgVAZ2I8/6GvKjvqU8qkQaAWSEJKor4wZU3OFd1QriI8XPAhIEqZ5rFHZKf54M4iTh3xDr15CZw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"IB+fCM8YgyobVC3Mc+9tyXmLbakj6S10cOeoGxhRAk9ObmhRtiNOzludAcpj2fhwGsygDqDSwAi7ZXifusielA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"zkkwGmllD6WxGCdofceGosCKSnLu1h6g4GZTUyW29oQ0JerUw1eq+2AGNOYgPHOIOyf6TUkk1UDjFMLrgwwgxg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"N905LQDlTDxMDBWIGa19015BFSVeQDbvOiEDUglZHLA+L2Lk2wGpkqwa2GIghUwlxqtxg0GXlrOsGk4rvAAZyQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/testing/counter2","func":"Increment","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"s/vdNL86ftAW2rzvcqZbCCebIMFmIIduP5BLAV1G6vE2MuBB5HV+qsnGVVMbjkB6MIzGqUvPm+ggKxta/+iduA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/testing/counter2","func":"IncrementAndPanic","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"zaFN1Aj6/3y3W41uyu94f2K024m40oqPEGUR1UGDaExpQ5lVJ8VrfGmMDhQU45l2JoVcDr/5h5whVz1bEZhzCw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"sX0v0v7e+DgLw/2h02Q1coqn5dW7sFWfFGkLTCzJos0CgB/JF6RrpgHSf9A+lBnlVfr2/vDI7Spp2gAnWnRQYg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/testing/counter3","func":"Increment","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"a2klhIiWS04x9B9We2VDNOd/ykjJTVE5CBkDQNycPv9nfcZ6rciqsEfZrQTUQzLilPnoQ20/+dHz8Li1/v1vtg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/testing/counter3","func":"IncrementAndPanic","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"Z4qv0cfu4yKcAs/W7k5WdOE5MtMnAIQq5sqLuk+R/NUwrLtXqaBVNOAnJByOvS0CqfclSSp+gVJdMPCgWrmGQw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/testing/counter3","func":"IncrementAndError","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"ENnSLBEMadpJz9v+H47CQqiv4pwsUv9dOzejBk35lo4d9mIQL/GhjFnu5Bvp9fiQ0IaHMYe8cgxgOP5jNUiGtQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1nnt7uqxfg3gaqs7uvtcdr3hx4nd7v6yfejfzpq","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"WA7hOeMXoZumxZ6tkiNXUk7X88V/7q10yd/eVFAg7X00r/xshIgOWQqh9igHtZ0O7sdkMW6bmWhOROq6Llvv6w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1nnt7uqxfg3gaqs7uvtcdr3hx4nd7v6yfejfzpq","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"lEvJHUWUQJpLNDXTinY/z6+edAnQ/zVAovVT9vFKpddvfGUfbbp6n7JDmLXRXEtarKYilzEZtqLzVeEBhPLqDQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1074c8an6aps829sx9h36m674ky4d8jlup9nmuv","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"e4997w84VJW8jH4rb7yLkzbWh0/GXg3TZd9muKJ/MDwtzf7CMhJIxyUikdPZKE5+iW5D50cCLHLbyCyHOoaEXQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1074c8an6aps829sx9h36m674ky4d8jlup9nmuv","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"vs1r9G1Nhu2n1PoStk67W/vd0QPM5m2ywH07Z4m6iDZm21WlwqJr2U3RNRqZhohD4slfjikWUVqBSyolFZTJpg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1074c8an6aps829sx9h36m674ky4d8jlup9nmuv","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"dyhK16TErfLUlwGCvPihtIeYFpvIIt+45AQceAYdswxkd0SSHgl4I29+d02VP1VnRrLVzU+RZ0eS0iC6aeygKQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1074c8an6aps829sx9h36m674ky4d8jlup9nmuv","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"QMpxxuEMjf5C6tjYUiLFyD1PnHDM6ucwlMWAWfdoA7YTJ3Md1kpsjEYCTnhFOPEWEFaBwhu/i/xfR/igqkpFlA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1074c8an6aps829sx9h36m674ky4d8jlup9nmuv","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"SsDm0CiNlocPcpGlJZYjPjG0Mt0J4YncE1v84bOeolRqeIRwRLPRDrNvkCFfm+SwFotlgk4wYjxW5/zf5XFWgQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1074c8an6aps829sx9h36m674ky4d8jlup9nmuv","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"JWoICtZdBLliAmTVAVzcvnBUc3Jo59/Ih9ohLrFQX986kLoMLmjtRGmzDJuU3Tfgx4EfAbVLY/itVb2nafCwig=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1074c8an6aps829sx9h36m674ky4d8jlup9nmuv","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"K79X1V+AGDbOTVAAa5mG+FNi2r0Z5JpCpA/s8lFZyGdtxdDgOjIRZQenjgsb+rvKWUbH98MujXemegHhC+wpoA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1074c8an6aps829sx9h36m674ky4d8jlup9nmuv","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ii8a69QV5V2rb5yfurl0vSIHU/Q0LhDIsGc9ZXp5NzsJV/5uI4QUjl71AZzHFISRnoWd0dhvrzl6anVTB1Bnhg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1074c8an6aps829sx9h36m674ky4d8jlup9nmuv","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"xcF1YgE8mY6u8736ykBwAnpl1pKcTowsp1zJHrTZnkZpJnQNYuK3W82aa1vhsAUgRo8IdmbpHheyu85LnjrKCA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1074c8an6aps829sx9h36m674ky4d8jlup9nmuv","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g9hkHAosfwAtuxeuwz0+mycyOpVL3+RiNe0/KVT5WKcB9F4fQiIDJFaAsyL8G71zDLqyRyQP50HrgQNRdi3yVA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1074c8an6aps829sx9h36m674ky4d8jlup9nmuv","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"bLbPqsphCmePRRMK0iEsG5sFHfalAxb8kFk7gi+lq3di4KU6nug07X7zwqng8zb6T8dU0unEdGaMNLTJwXx9ow=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1074c8an6aps829sx9h36m674ky4d8jlup9nmuv","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"KC+LXMIcTnkmlwhqCAz9eXoLxi0LXpYvCFU59yVImsZmcIYukeDkeC5LTAgqmI1waU3HLsijPTAw4isBSKRBFA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g199v9fxazlp2n7ls7n4e04x0q4rcg3ggehtjdsh","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"TLV5S/tdn+pAzXj7MYeK5R9qxjYiNwU5dyOQv1XD+KwLA+/1Zpl0uA+NRWK4YOLj+Gt3tFm3MEuv/vooyh46lw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1w8cpkflxysztll935x45llywtz0rdwajcm2lwu","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0Zs33bFEJxwc7R84wmlJez28bQxH21lyJctgjB9cNt4TuAgVmuN0kFQzvJs6ZMc7F/z2IHliV25ZVSXEe0/Nug=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1w8cpkflxysztll935x45llywtz0rdwajcm2lwu","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"pN8lKmB44cwET3NYX6zvyzL23Bx3soyQKTuuJG5wH853U+B/IqPtNuOYm2fEA9JY1BegzuxYyUhtf5mNi8Ekiw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"tWzhnMIr5M5ofzZ1RxLRPo2PdB+ItFqvVQqTFIXjdbIGnVm0JPNvGhkzJ5tARv7i/IdBqZ+07xi+BbjPPKP5BQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/tokens/leongrc20","func":"BalanceOf","args":["g125em6arxsnj49vx35f0n0z34putv5ty3376fg5"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"y+pEKM8htQHTCVd4NlnwxoQDztycVQwssu1isu3sgvM7lhhMfeXr2j1JZWP+dSLPvwE8FYQW7SQ/BfN93GPPFQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/tokens/leongrc20","func":"TransferFrom","args":["g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","g1urt7pdmwg2m6z3rsgu4e8peppm4027fvpwkmj8","100"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"nXSMVmNrEp7JGgOMPE1QPWu1CYaAvRmLfHz9T5vijZUx3OVce6rjTi596kOtBoy+2HdV+e3B7edN2r9re0i47Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/tokens/leongrc20","func":"TransferFrom","args":["g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","g1urt7pdmwg2m6z3rsgu4e8peppm4027fvpwkmj8","100"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"hZTBZFLDg2QXMGq0QUohkN0CkrTgilKB4ESuAhFYA0Yes9l59VxJMTk/0R6U0PfTUoqrINRNS8HRsj9LIa+y+A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/tokens/leongrc20","func":"Transfer","args":["g1urt7pdmwg2m6z3rsgu4e8peppm4027fvpwkmj8","100"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"b/u/fc9iWLSQOhMW0+dJ/8iXTqBNHavubliTdETNvwwuClofq0ZgJQEHeeSWUK02wCb6s9Cz3Rh4NgVVsgF6kQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/tokens/leongrc20","func":"BalanceOf","args":["g1urt7pdmwg2m6z3rsgu4e8peppm4027fvpwkmj8"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"ppMpsWM3Oxk6oqsQQEmMj9uzUUlgwZLNH933m/g1orBQ87YFGagQvhoXF73co0W6F1HKQT1eEPxgPgzbh1lexw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"peC4xlep6Vgut4cbKnU8RL6ZjJ+KVTAWH4Xy+v8/C71l0vX8Vqf9uUiuhGDPGui0R1k9VOYYR8EFkqVNk4BymA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"OcdgEUCSpdn91rQtI3lL79EPwh6t5pt853XOLySYmHY/N1mzg1vgtNbjddLh96ypCEStvYMHh+QNec0d8dwtKA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"CtQ7WzIa4uwYCq9+VG5z1t54FxMPZLzIM7RkGdCUg6QZoN3o63U3I39mVNJvWQyMgs7CfTs6VAhJO4UoGkK/rw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000005"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"WeXwFUMJnWwVKykZ8ZhB1RDooBSAKlAKEZGGsL8fTUhdQQFzVpja4CbMkkOwqSD3xrhuD2eYsRrJiPz7nPm8vQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"mZsoIuGQm8+HC7lly52FYHUSi6GSqo/yyIlO6IV/cIYp95KvIUEF2zDblZQ1qqmUY1R2Bh4Ayq6wicRbMcoIvw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"oKqs5fNRxkvTWPhYwvlmPwLhkULyIdtxRvmSAfRW6wIkXHSliNfuPtLdnT5h1ihNwTbNtgygmFOLBldai0J5Ag=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"xKS5GI0DYtFxYNwEsDa8DpMaYaQCM18MG7KurRCF83YgNsQS7210JYXGblqOoZGCUcf6oViUqIAbsMt2tociRQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/test/avltest","func":"AddListing","args":["1"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"M7ZLfYpiBq9ceeNU8uw+RldS2zktawv1xpc8B4q2SZ5fKXeFKsrsWfgY+qDUtzalcR/qzQN+TdUN+iaxO7T5CQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/test/avltest","func":"RemoveListing","args":["1"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"F7Fi4RJ7iTNPLyLfE20LZnFkUF3aUtAcmsOMdRlBUMMezRcKCIMhlSfMf+7irxm05V6PwAj5lYmPFqUUOJI7gg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/test/avltest","func":"AddListing","args":["1"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"YRO3UCeZXU+AREuQ540nmnppDiej0n7IFIRQG//STJkYMTXF7SWCD6mRVUaSZNdR+AleN90M4dxA7JLI1v5cBw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"9+aUdmUqTGQSSGaPWYuslYlDVlpB5F5m9P972BDR4P1xGTiwl0vTsiF0yIjysDkdRNy8cB0sDN6eznEZW3wQoQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/test/avltestv1","func":"AddListing","args":["1"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"Ktar5+WHg0M8q+ZDSk+GTr3wEr6rz6oRokDX+XUm+1FscHap9oGOUvIkoZZF+9Dv96xnJ6I8IvnRXcj4Pw8XAQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/test/avltestv1","func":"RemoveListing","args":["1"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"8ukegLD6fxAezklvX7/QxTFZRLnoYEhDECrb9VsuE4R7H7VXiC/BVYBxZaZzvmkZkx566H/L46xeXp/1FDOOZw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/test/avltestv1","func":"AddListing","args":["2"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"KICa2YlznWW7VtdYZbQuttvfy4WFiSmMuP7bbnqin90Vb5Ezs+YVqs44LcGGwZG59no6uP4LB7APLgi6s6uqmw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/test/avltestv1","func":"Read","args":["2"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"pCojmig84RJTYbEuJvJLOJV9aCvM43oiT0B2Bv/skKMcFQHj1sVh0dEwJQTZd2wxzQyV1y96Cf57x6nV+ZdQUA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/test/avltestv1","func":"RemoveListing","args":["2"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"vRNlpmxPzXWhv/2o+EYGLfIOz3f41Fli4Y7I/9yM0gZCHXmAClruZeFII3K4EvzedjKLBTcfMc34kV/2oWeXDA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/test/avltestv1","func":"Read","args":["2"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"ieuxs2zJ9aCeHX88JVn+9zPlIy/F0bIeiYNRmHv1acQSo2XR478/kzBoqrZDbGHvT9VbHeziW6V1I3lNGvbIEg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/test/avltestv1","func":"AddListing","args":["2"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"2qRMXTuyFbbRbdbK+PNJscNS+FD3khGGwLRNOW+/XEdhDksNHB/ev8e0KrvHlYKHnLzLiO8+7P5orFRlEdSoeA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/test/avltestv1","func":"Read","args":["2"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"q6KLT8UbAYpsixM5N/Qi8lBHdTyCra1UEPnxuJBL+RJAACR164LstmUQA0Arkmvh9xiDzYSJsKBWAgy+/6vg9A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1hjmr4p8u695tku0jepmehz4f58jrupuxg8ea65","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"xDn5isiPxi7bt5ri70TtCWEtUNIdh3/ZaDZfF77uwrk2VzWCMmegqW9MTqnhWuQtZOhrzL5cW71tLJFFIYybgw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1hjmr4p8u695tku0jepmehz4f58jrupuxg8ea65","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ZDaIvjjgqlslHARvzQFDbNsTKGuePYmidmvwt3MxgsRoXDlaqk7pLr1iZRIWZiSR2kBtBjrHaJl84/+cKoppeQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1hjmr4p8u695tku0jepmehz4f58jrupuxg8ea65","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Y6XtAdFmnPAEd6UMCyYeXe200e2Enu8TJem0Om3Oo8Q6lyNpbsEDilOm8tYH0eNPSL2CgUjdn+Q3abssSlSNIw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1hjmr4p8u695tku0jepmehz4f58jrupuxg8ea65","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"TMGyiK2HhtEF7Ii7UgWPsaYznTAmebuOIQT9qMJ+H7RNkeqIcwbmGIBHVZHSMOglYMajX27wbVrOE0oyaRWdlQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1hjmr4p8u695tku0jepmehz4f58jrupuxg8ea65","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"U1pTbznxudEJqx05pPPHLG+4+BLAAxlUJbguXo9+Njgl2uB+0neyFrFVhYX4roVuGt8ke+5lclN8zY9xnYZAhw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"uqNJX8ewPUyizyuPF7A/9QllxoBIPswmt1+iR6pPivNWxoeNCfUE0c977DZiO1TzOtqARRp+vHwwI+9YaQXWbQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"8qyagXNXdv4zgUmMgp8wxq44bf7tM8q8fNjwf7IveVhAM2S2iQMX4FBPf7TGp7sXQbvfKlHi2Sn1ECx/wxJmuw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g13lcs6h7emmdqze78qtw5p4xkxyzc53f6pu5mfw","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"/ljrBb/9/bGYYR9pr0n9bIjWi7JWl0oEslvpMF9Fc5QlTEbZxq/SU5AK915nw9AhwcfrbkV2t7sOEtOP/UqGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g13lcs6h7emmdqze78qtw5p4xkxyzc53f6pu5mfw","send":"","pkg_path":"gno.land/r/demo/memeland","func":"PostMeme","args":["data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4gHYSUNDX1BST0ZJTEUAAQEAAAHIAAAAAAQwAABtbnRyUkdCIFhZWiAH4AABAAEAAAAAAABhY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlkZXNjAAAA8AAAACRyWFlaAAABFAAAABRnWFlaAAABKAAAABRiWFlaAAABPAAAABR3dHB0AAABUAAAABRyVFJDAAABZAAAAChnVFJDAAABZAAAAChiVFJDAAABZAAAAChjcHJ0AAABjAAAADxtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAHMAUgBHAEJYWVogAAAAAAAAb6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9YWVogAAAAAAAA9tYAAQAAAADTLXBhcmEAAAAAAAQAAAACZmYAAPKnAAANWQAAE9AAAApbAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAACAAAAAcAEcAbwBvAGcAbABlACAASQBuAGMALgAgADIAMAAxADb/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAJYAlgDASIAAhEBAxEB/8QAHgABAAICAwEBAQAAAAAAAAAAAAYHBQgDBAkCAQr/xABgEAABAwMCAwQGBAgICQcJCQEBAAIDBAURBgcSITEIE0FRFCJhcYGRFTJSoQkjN0KSscHRFhczVGJydZMkQ1VzdIKys+EYNTZTY7TCJTQ4doOUotLwGSYoRFZlxNPxo//EABwBAQACAwEBAQAAAAAAAAAAAAABBQIEBgMHCP/EADoRAAIBAwIDBAkDAwQCAwAAAAABAgMEEQUhEjFBE1FhcQYiMoGRobHB0RTh8CMzQgcVUvE0ckNi8v/aAAwDAQACEQMRAD8A9U0REAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBF1+Gp+3H8k4an7cfyQHYRdfhqftx/JOGp+3H8kB2EXX4an7cfyThqftx/JAdhF1+Gp+3H8k4an7cfyQHYRdfhqftx/JOGp+3H8kB2EXX4an7cfyThqftx/JAdhF1+Gp+3H8l9Bs+Ob2fAIDmRcPDN9tv6KcM322/ooDmRcPDN9tv6KcM322/ooDmRcPDN9tv6KcM322/ooDmRcPDN9tv6Khe8m47dodtL7q6qY2oitkIeIQCDJI5zWRt5dMvc0Z8ASfBSk5PCM4QlUkoRWW9idItAf8A7UCq/wD0TF/74f8A5V2GfhMbi8sH8BGgO5hxqjjHnnhW6rK4lyiWVTS7qis1IpebX5N9kWitN+EnnmmEbtIwZzjLKziA9/JWBt121ZNb62s9iqbJTWyG4TiD0p9QXBriDwDGOfE7haP6y246PeyhKpGGUue6/Jyd5qtpYVoW9zLhlPllPD9+MG1SLgDZ8DL2Z8cBfvDN9tvyVMW5zIuHhm+235Jwzfbb8kBzIuHhm+235Jwzfbb8kBzIuHhm+235Jwzfbb8kBzIuHhm+235Jwzfbb8kBzIuHhm+235Jwzfbb8kBzIuHhm+235Jwzfbb8kBzIuHhm+239FOGb7bf0UBzIuHhm+239FOGb7bf0UBzIuHhm+239FOGb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","1711388210"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AzIwEGmZJ17EJC5CjFILCU+pO+oEhjMcN+W2KD7KW9Q8"},"signature":"q/+pQuja23UCnCuIgn9FiTZ4vN1ofegWb5j3pji+a6ZAglv1s9Yb2ohDWDnnt5kGB7AEU+8hZ5ZU9EE0G6K/wg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g13lcs6h7emmdqze78qtw5p4xkxyzc53f6pu5mfw","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"W5azqjFADoiT4fbOpA014dHD9kq2cxhXhZidML4BtL5nsZKtFa8k0iZMaFV1MrBauASq7Jwf/POEOswxS1n9sg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g13lcs6h7emmdqze78qtw5p4xkxyzc53f6pu5mfw","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"f5mrdwh0oIdO6UimovGOJABlLnYo6uvAIiMT+y/DrNNwLahx0re73s1xvTcgSWOSbxUCv4A7PEO31ZhMWQ415A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g13lcs6h7emmdqze78qtw5p4xkxyzc53f6pu5mfw","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"iCayaIFgMRDcgzuNwSbmx+FqVXquM8gy16RYvMUIRSFNXmTb9o5GfMNAWEEFBo+W27kz3E+fnYtIrkFAdfpZgQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g13lcs6h7emmdqze78qtw5p4xkxyzc53f6pu5mfw","send":"","pkg_path":"gno.land/r/demo/memeland","func":"PostMeme","args":["data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4gHYSUNDX1BST0ZJTEUAAQEAAAHIAAAAAAQwAABtbnRyUkdCIFhZWiAH4AABAAEAAAAAAABhY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlkZXNjAAAA8AAAACRyWFlaAAABFAAAABRnWFlaAAABKAAAABRiWFlaAAABPAAAABR3dHB0AAABUAAAABRyVFJDAAABZAAAAChnVFJDAAABZAAAAChiVFJDAAABZAAAAChjcHJ0AAABjAAAADxtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAHMAUgBHAEJYWVogAAAAAAAAb6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9YWVogAAAAAAAA9tYAAQAAAADTLXBhcmEAAAAAAAQAAAACZmYAAPKnAAANWQAAE9AAAApbAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAACAAAAAcAEcAbwBvAGcAbABlACAASQBuAGMALgAgADIAMAAxADb/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAJYAlgDASIAAhEBAxEB/8QAHgABAAICAwEBAQAAAAAAAAAAAAYHBQgDBAkCAQr/xABgEAABAwMCAwQGBAgICQcJCQEBAAIDBAURBgcSITEIE0FRFCJhcYGRFTJSoQkjN0KSscHRFhczVGJydZMkQ1VzdIKys+EYNTZTY7TCJTQ4doOUotLwGSYoRFZlxNPxo//EABwBAQACAwEBAQAAAAAAAAAAAAABBQIEBgMHCP/EADoRAAIBAwIDBAkDAwQCAwAAAAABAgMEEQUhEjFBE1FhcQYiMoGRobHB0RTh8CMzQgcVUvE0ckNi8v/aAAwDAQACEQMRAD8A9U0REAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBF1+Gp+3H8k4an7cfyQHYRdfhqftx/JOGp+3H8kB2EXX4an7cfyThqftx/JAdhF1+Gp+3H8k4an7cfyQHYRdfhqftx/JOGp+3H8kB2EXX4an7cfyThqftx/JAdhF1+Gp+3H8l9Bs+Ob2fAIDmRcPDN9tv6KcM322/ooDmRcPDN9tv6KcM322/ooDmRcPDN9tv6KcM322/ooDmRcPDN9tv6Khe8m47dodtL7q6qY2oitkIeIQCDJI5zWRt5dMvc0Z8ASfBSk5PCM4QlUkoRWW9idItAf8A7UCq/wD0TF/74f8A5V2GfhMbi8sH8BGgO5hxqjjHnnhW6rK4lyiWVTS7qis1IpebX5N9kWitN+EnnmmEbtIwZzjLKziA9/JWBt121ZNb62s9iqbJTWyG4TiD0p9QXBriDwDGOfE7haP6y246PeyhKpGGUue6/Jyd5qtpYVoW9zLhlPllPD9+MG1SLgDZ8DL2Z8cBfvDN9tvyVMW5zIuHhm+235Jwzfbb8kBzIuHhm+235Jwzfbb8kBzIuHhm+235Jwzfbb8kBzIuHhm+235Jwzfbb8kBzIuHhm+235Jwzfbb8kBzIuHhm+235Jwzfbb8kBzIuHhm+239FOGb7bf0UBzIuHhm+239FOGb7bf0UBzIuHhm+239FOGb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RAEREAREQBERAEREAREQBERAEREAXBXV1PbKOarq5mU9NC0vklkdhrQPElc6pvtE7e6y3KoKC1adnpIbY3MlW2ed0Zkf+aCADkDr71r3FSVKm5wjxPojzqScYtxWWar757lP3N15VV0b3fRtOe4o2E8hGD9b3uOT8V1Xa9pLXbGU1oozE/A9aToD458ypuOx5r77Vp/96d/8i+v+R5r37dp/96d/8i+cVrG9rzdSpTbb3OdlSryk5OL3Kz0vpW/bn6kjobfDJXVsxHHIfqxtz9Zx8AFv1tftvbtsNLQWqha10pAfU1GOc0mOZPs8lGez5s8/afTNQ2vMcl7rpOKpfE7iY1rSQxrTgeByfafYrVXX6VpytYKrNeu/l4fktrS37KPHL2mERF0BYBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQFf7/AH5F9Yf2fIiy26mmqzWO3WoLJb+7FbXUj4Yu9dws4j0ycHARbdGSSeWV1zCU5JxRKkRFqFiEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAf//Z","1711388312"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AzIwEGmZJ17EJC5CjFILCU+pO+oEhjMcN+W2KD7KW9Q8"},"signature":"J25z8seL5wAb9wfR2lCWujviZynsSVPKNe7023vH6CAevLZlN3hO2s2uTU4PuNYlYoApny4wmG4WlfFzi+jlZA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g13lcs6h7emmdqze78qtw5p4xkxyzc53f6pu5mfw","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["000000b"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AzIwEGmZJ17EJC5CjFILCU+pO+oEhjMcN+W2KD7KW9Q8"},"signature":"vocNr6/iLGXgRo5hCh2eeI6D8Oe0eJOD6fEdZGjGBzJgFlQaYsrL4PkvvsL95AUdzCXU5qREaQ4XoBlx0b0gow=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1a02qa9rc2phxkdrymp2jcw5hcsk7ucm9gzmgxk","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"P6PXDXkMZPxykMloEU0WsGiBzuAB8opOIWN3mNXdV0MHsOFZQszA7jLWqe/pSgwpEyN2R5a9uZ6w2rj+ZL/Bjg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1a02qa9rc2phxkdrymp2jcw5hcsk7ucm9gzmgxk","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"elx5LAjX108qPnppTKulK3tag7rIJtrRn4MnpGvkyyAElWCoquLV3GhevHV7NXuq1glevz0zQ71gKBsVJv6zBQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1a02qa9rc2phxkdrymp2jcw5hcsk7ucm9gzmgxk","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"b+p/Tflv1A5FpqSmTZN5N3HDajE6kIf05gDp386595VT9GuVoVHo5tGxjEVED0tDTWHk/UMTdgWm5DYywu9ucQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1a02qa9rc2phxkdrymp2jcw5hcsk7ucm9gzmgxk","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rm3/+5h16NvzirRbEwMPjK+7S7cc2Lr9MFuNgcnhWvtMG9nWGADc22PWMJ8REV4LWBLkqTmBqA20OK02ob/CTw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1a02qa9rc2phxkdrymp2jcw5hcsk7ucm9gzmgxk","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"M2dCOQ/ZrbB6AuIFLGHb/doKwDvY4qqkbObJTYT1004qCOKRqWeGD5Q1QOQrhXzckHChg1lWt0RzP6BPDEYkzA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1a02qa9rc2phxkdrymp2jcw5hcsk7ucm9gzmgxk","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RO3R+6j4RsC7x50P5ZnUqwa1MRTkqAQEm2VvsHCQU4gVNeaAJr/0vlza8k/yjeDd5uOzlfItnbGvpfjOAC1WfA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1a02qa9rc2phxkdrymp2jcw5hcsk7ucm9gzmgxk","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"HwUA1ArG/80SxZuZTnTqqM548IVV7xbsXPYdrZUk8gNjqR/f/wlRgqGy90pARF/FwmmhKZIQeCAec77AMYai6g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1a02qa9rc2phxkdrymp2jcw5hcsk7ucm9gzmgxk","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"djIHek1tCevsXnkCltfK4/2/ux1sJEd8KpolN8Na/BQ9QNjbZ26X7Tu6jtIjrnGbcA8S7v67ehnNII5g27qXqg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1a02qa9rc2phxkdrymp2jcw5hcsk7ucm9gzmgxk","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"+AUGnVY7DqZy0gAYkaXr8s+L4R8WSvgmgsPTiiVLmRRbN3oG56CXTj3HLm4nBeL7LSnhCnNKDP90p5q65erXwA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1a02qa9rc2phxkdrymp2jcw5hcsk7ucm9gzmgxk","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"S8g33UckqRbKrCUNHrXkPx/pECjWELxSQGQwI3987Ho+fcmegTBZCJnrKmXyw4yA45FUfykpbHqwraSI9hd0qQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1a02qa9rc2phxkdrymp2jcw5hcsk7ucm9gzmgxk","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"EaDlfEb5PpvgzsKOo74aizhcQHpO9n1yFQcZcVb8Tc0PAp+X/LGQ5lLfA+Hcu1gv4+7jmx2zBiHeW7BofmLQsA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1a02qa9rc2phxkdrymp2jcw5hcsk7ucm9gzmgxk","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"B2dzo1P6E2HqqFWnC5LjoxLxxOXI6vOUoWa2mkuiaCo6gDGBdUXydP6thKGsW1+ISpLfxVdF57PG5p5JU0nBYA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1a02qa9rc2phxkdrymp2jcw5hcsk7ucm9gzmgxk","send":"","pkg_path":"gno.land/r/demo/memeland","func":"PostMeme","args":["data:image/jpeg;base64,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","1711407617"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvlVPZX4IhoX9c/YuqYywfLVRxkCZ1XWYaDMmMwtkK9I"},"signature":"aOiD9tHqfhpd/jOEIY/KJIryljE/fySFfmeComP+AfxlV50f2GthXvYiTV6I2p46Oqr07whlawyvyPoOYQhL2g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1a02qa9rc2phxkdrymp2jcw5hcsk7ucm9gzmgxk","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["000000e"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvlVPZX4IhoX9c/YuqYywfLVRxkCZ1XWYaDMmMwtkK9I"},"signature":"pEWGzEOAfTJjTAFoFGaR+8Mi87Gcub2VLhkvf1wREhcDB1T6Djmg11KESB44Eynxov4GX+iPpXly9p8GMWglQw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1a02qa9rc2phxkdrymp2jcw5hcsk7ucm9gzmgxk","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["000000d"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvlVPZX4IhoX9c/YuqYywfLVRxkCZ1XWYaDMmMwtkK9I"},"signature":"Eq7kgtraIzY9nBbW53K5/XdCz4VqHRN8AoPdbAQec20K/LVFod08Fz2z0QV+kG5fOI4JmqZRb+xSgA6p+UOucQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1a02qa9rc2phxkdrymp2jcw5hcsk7ucm9gzmgxk","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000009"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvlVPZX4IhoX9c/YuqYywfLVRxkCZ1XWYaDMmMwtkK9I"},"signature":"BDkbwAMXNZ0nSXJtNFKFXUD/CaCiRoC0JW3sdZbICjoTqY7ZLoHoZKcyHvTAaXLalxCIV4E5lTUbuRx6cBI/Hg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1a02qa9rc2phxkdrymp2jcw5hcsk7ucm9gzmgxk","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"WhC5SkmWmqhw50cJFD7I3hSH4PdHo4Akepna+F+vYKsTGoWtjTo+1Z7dSXQ4tBQnoeBnwrzOsPBeWQS/8Bi4rg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1a02qa9rc2phxkdrymp2jcw5hcsk7ucm9gzmgxk","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"FdwRDVGZmBPoElE2t2yiTakhWqlPMwF+JzAvwo98XLpxxia1F+Umh3MWOH//QdcpSZ5y+UMr2WbG2oAtt0xTQg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/boom/boom","func":"TotalSupply","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"ZaxUYrD/mx1VDP+kWjn+Qgxo9wLgOmrBpj9eig8YKTpzKHj1UCVxnVcY3Y4RC4xLfwseIa5L/LUe5o+jY2WiIw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp","send":"","pkg_path":"gno.land/r/demo/memeland","func":"PostMeme","args":["data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4gHYSUNDX1BST0ZJTEUAAQEAAAHIAAAAAAQwAABtbnRyUkdCIFhZWiAH4AABAAEAAAAAAABhY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlkZXNjAAAA8AAAACRyWFlaAAABFAAAABRnWFlaAAABKAAAABRiWFlaAAABPAAAABR3dHB0AAABUAAAABRyVFJDAAABZAAAAChnVFJDAAABZAAAAChiVFJDAAABZAAAAChjcHJ0AAABjAAAADxtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAHMAUgBHAEJYWVogAAAAAAAAb6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9YWVogAAAAAAAA9tYAAQAAAADTLXBhcmEAAAAAAAQAAAACZmYAAPKnAAANWQAAE9AAAApbAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAACAAAAAcAEcAbwBvAGcAbABlACAASQBuAGMALgAgADIAMAAxADb/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAJYAlgDASIAAhEBAxEB/8QAHgAAAQQDAQEBAAAAAAAAAAAAAAMEBQYCBwgJAQr/xABWEAABAwMDAgQEAgUIBAgMBwEBAgMEAAURBhIhBzETQVFhCBQicTKBFSNCkaEWM1JisbLB0QkXJHIlJkNTc7Ph8BhEVGNkdIKSoqPC0ic0ZXXD0/FF/8QAHAEAAgMBAQEBAAAAAAAAAAAAAAMBAgQFBgcI/8QAMBEAAgIBBAEDAwQCAgMBAQAAAAECEQMEEiExEwUiQRQyUQZhgcEVoSNCQ1KRU3H/2gAMAwEAAhEDEQA/APVOiiigAooooAKKKKACiiigAr82uvSf5daj/wD3KT/1qq/SVX5t9eo/49aj/wD3KT/1qqVk+B+L5IBJOayyTWOMA47195xSqHmPOaMms0p9RXxSasUbMcmjJr7srNKRj3oKHxPCvvWe2scYpSporZ8T5UuOUYrFKQTnGfaldo8uKuijMNtZgEdqySgGlQjAqwCScnORmvpweCADnvSwR5AUFvHlQQJBHNZ7PelUMnI5pVLPPIzU0A08M+tGynS2eMisENEKBUCrHYAUAJobJPfIpVDQ7+nNbU6ffDT1E6kMNy7Rp51mAte35yeoMtj3weSK6b6df6P6xWstytb3h6+PJwo2+2q8COP6pVjcofuooo8iRwy1FeWy68206thCglx3aShBPko9gfasmklIxnHoPSu+/i80dY9C/Daq1aftMWzQjdIqQxGRgHk8qJ5Ufck1wY20MgnnmhoIzsm9FaRu2udRRLHZYvzlzl7wyxvCd+1JURk+wp9qLRF+0VMVGv1nmWl5Jx/tLJSg/ZXb862R8HsTxviJ0kNg+gSlEn/oVV6PzLbHusRcadGYmxlJwpiW0l1BH2UCKuopi5ZHF0eRbbSlAHduGcHnIrdnwrdKf9ZXUqO5LaK7NZ9s2UT+Fawf1bf5kZ+wrqXWfwbdPNY+K/ChP6ZnrO4O2xeGc+7R4x9sVcuh/RqJ0W0g7ZmZf6SlyZKpEmf4fhqdPZAI8gEijbyVlk44Ly20VHJ7+dKeBjOBS6Uk8hOKXYaKyckUMyL3DRtkAhSvxVJMoC0etYOR8duaVh/SsDuDS5DoraxVEPeoY71JR4RbTlXBFKQ44UrPanjjf0mkNm1EXJBUcAZ4piIa1YyMVLqABGO+KxwPOpIZFFnYcEVguIchQNP3EAqNYpbOef3VDZFDXwCEYHevngHzp8lI/KlAyFEACq3RcYNQ8KBzT5mKUHtS6GEg04Q0SM0qTsshopmk3GN/lT1xOOK+BFQkSNEsqSMAYFKoa+n3p0GcpzX0ND0orkBoprbWBTxzTwtcmky1ngirlWMiOcAZpNcbcrPanym/QUmGju5zUgmM1RfasC0SPw1J7ATisiwkjHlVWW3EP8rkdqTMFAOSPqqZMTzFNJDe3nzqu0FyRr0QLSUKAWk8EKqHlaGsstYW5aYTih/TZBOfvVkS1v79qUSxgHB5qNg1SkumU9fTfTvzQk/oeKmR5vIRhXbHl7UzV0O0lOu0OUu2qRLaebUlbb6kjhWRxV+bY5GTmncRsCWzxn60/wBtJeGDdtD46jJFdm56KKK7BzgooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACvzb68J/l1qIf8A6lJ/61VfpIr83WvUhOuNRHOf+EZP/WqpUxkHRAFBHc0bfesjzXzYSfaqDbAA4r4e1KBvAxWQbxUoixJKD61920rtSKUbbSoZJ5piRSTEQ2VEUslrGPp4pXwexxSgRz2ooWxNLYJ7cUqhrO4H1pUN4xil0t5zVqIGzcYUu2ye1LoY4zinLcUkBQHBOM471JWxkYyh64rMRyfKpeDaZNymNxosd6bIUcJjxmlOOE+Q2gE1vvQ/wO9TdVeE9cYMbStvcSlfj3J4Kd2n0aTlWfZWKA3JdnOPyxAyOB70oYjqo3jhtao4UEF5KCUbj2G7tmvSLpv8DmgdGOMSryHtXz0jkzcIjg/9GO/51tPV/RvSuren8/RzlriW20zG9rfyTKUfLuDlDqcDuk/wzQLeS3SPIgM/T7V8QlbLqVsr8NxCgpKx3Cgcg/wFW3Xegrt021hc9M3xkMXG3ulC9vKHEfsuIPmlScEVAFjPJHPnVqGXuPT74a+qzPWLpTb7osoF3gAQLmyMDw3kjhQA8lgBQ/OtohlKSOMk+deY3wy9ZHuivU2LNkuqGnbkUw7sx5bCRteA/pIJB+2a9RElDyEONrS62tIWhxByFpPIUPYigzzjTOZvjvBT0RYA43XZj+AVXADDRKec8n/GvQH4+wU9HrSjBKV3dBJHshWK4Hit5GRk80doZjVG8vgwjb/iF0+cZ8ONMX/8oivR5Ef+yvPn4Honi9f4CjwGrbLX/wDCB/jXoultOBgZqLK5fuQyQxgds0oWPPFOg2Ae1ZtpSVdqBQ0S1gUvHZI/Zzmlw0FKwBSyEbTjyqCUhuYxXjy+1LNQEtqBzmnASBzmlEHJwOT6UtsbGPuHsdraM+1KrBxTdmawlYbW8gOY/CTzWapSMEA548hWRmobLpJYyKVSoLBwM/lX3wjjIyRTL4FjXZntWSG8HJpV1o44FMLzd02O3ma8w4tpspCwnAKQT398VDkkrZZK+EPC2ARxS7SAOTxzjvVIuGrJDEWW+lcdlDOVoU8eSPUjyGOff8qhW+ojc2XKgEqRGeYS6Z/4W21k4Bye3GcVkepjZoWFm2Q2kHmldoSmqVozVyrwG45cL6lJBBJHIHZQPnmrwE5HIwfSr7lLlFHFxElICxXxKNqvQUsEDHfFBbBIxTUVZjXwjNKBo+lffCz5VNkCO2mtxXIjQXnYkQz5KQCiPvCN/PqcjtmpANEHtWaWjuBI4HNRZHZFwn0TWlKSFNqBwtCuSk+hpx4I8+aSiw/kZcpKRlt5wu49Ce9Pw0PQ4qUSxp4AzWewAUuW8g0mpNSAltTjtzTZ2PvP1AU/CefKgsZ5xQBGpYx5VkIwBJA5NPilI4xWPB4xQA3Ecbe37qGEBMprHB3j+2nK1bUHtmkI6syWTnH1j+2q7ebA29RRRW8oFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAV+bzXif8AjzqI/wD6jJ/61VfpDr84eu2/+PGov/3GR/1qqpIZArmzJ4rMNkcUqGsUoGyT2qjGCWwJ4FfQknypYNZ2g980o0yAeeashbEPDP8ARzSyWQny5pcMkngcUslkEjI5PamIWxuhrJz3xSyWc8bacIZyCSAlPqrgVbdF9MNT9QHkNae0/Puu9WxLsdk+Fn0KzwKCtlSbj5IGM/anCWEtJyshGewUcZ+1dgdOP9Hpfbrtf1peI9hjYB+Tg4ekZ/3vwprqHpx8L3TbpipmRbdOsz7mgg/pG7ASXQfUZ4T+Qqb5KOXB549O/hp6idSVhVm0zJZjEjMy4gxmk57HKuT+Qrp/p3/o97VBbbkazvTtwkKxmJaz4baSO4Us8q/LFdiqK1kJJKkgYGewA9PSsUoI8qGxG5lU0P0t0n04i+DpqwwrXxtL7bYL6x7rOSasy2hnKhn370tsI8qNmfv6VAcvsbqQCMYyfWsPDIxjv7078M+nFYlsgZxQFHNfxh9Az1P0inUFmj7tT2NpSglA+qVFHKke5TyRXnchBUndgjPPP+Ve0oSoYKeCDkZ7Z/74rzy+M7oGnpvqwarsTBTpm9uqU8yhP0wpR5Un2Ss5Un7kVZDos5mU1kKyMgjmvQH4HesY1ropWj7o+Xb3YWx4G85U9D/ZIPns7H2xXA5a47cVP9N9fXTpRru0aqtKyqVb3QVsg4D7BwHWj6hScj91TVjHzydp/wCkClrY6VadjDG1+75IPfhtRrg6N9PA7V2j8cmrLZrXo308vtme8a2XOYuSwScqR+qIKD7p5BrjKKk98ZGAeaKopDs6S+A9jf1ycUTkossoj25SK9CkN7cehrgX/R/sB7rNdlkfzdieOfu6gV6Bho8cZqhE+xINrxxWaWSk/enKW8isg3zUWUoTbZweBzSpbx3FKpbwn3r4e9Uk2WXBghpKj+dMr9dW7DDU4lHiOnO1Oe+KlGxnsKquq7W9eb7CaQ8prEdxAKfMnHNZM8pLHcR0EnLk1+xqC+3OdKdhQW3UtunchxexROMnd5YHrSLXVZ6LGKbs86ibGdKFMRvqSMD9WSRncMnJxW0psK12uEzb2YzSlu48QY5UP2lKPlWrtW2GGq+Bm2B4zGVltpaFHaQeSgbRhKcHGTXNblCN3yaqvotWmOojlyucW1TJDPz7R3yUsKBwnaCCfTPfFbCiSzMjKcUkJySW0juRmuVoK123UIeYt7dszHTGebSna8666sp4z6JSefSt43TW8WzWKa1GfKlwI44HKnSkD9r0Hr51OPM39xChZfpLyY5QkkEr8hySB3x71q/VWopMu3yWzHWtTkoR0Nt/tDcfqJ/o47+4qxXPXcDT9qeuUuezIk/LmShhw+CkIAzgZ9D51rHTmpYmpoz1zlCXb2H5TbrSPEBbiIcwrYfNOTzntmpzyuoxfY3HHbyTK9PypTkiNHBUWWm0LK+VyG1ZKhzwCB2x71IDQDNytE1t5pt16OhG3cnHjspI+lY81pPIV5Yq42y0uQSlp1Rm/o5biY7/ADuWys5IPkcfwxVmhNR4zqkbm0LVlxKOCSjAyPfvUY8aS9xLnJmo4OhZbFwk/JvLLcqOZEZYV9bbqRykH0PBx5VsrSt0lOwmWbm2tMkpBDhTyv2UfUVKNRIweb8FO1TZKht/iP3U7jQw3nnIz39K17V8CW7PvhDdzQpnHY0ulATk9zX0AZ5q4oQCDisggjnFL7AeRRt9qgBAp55yKV8MBI86+qTx2pTAwKlANnY4cSARkpOUn0rPw85zS3nxxXwj1pgCHhjBFImPk07IBr4G8+lSA0DQB+1ZqQNnHely0MmklowODQVsaOcZ4/OmwPpTl0ZBFMHpfgpITyaalZVsUKFbsk8Uh8/HYlspJGStI7+9Rcu5vlWArbxUfGaW/co6lqz+sT3+4pixXyxe+nR0TRRRTBoUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABX5y9dI/wCPOoeP/wDoyP8ArVV+jSvzy63sD6tbX8o2qSbhIJIP/nFVDVl4lOQ3u8qzDXPapR6zSYydwZUpOfIZrFu3PPrCWmlrX/RSgkk+wHJoplmxglkE/wDfilm2tysAE/lW7OmHwhdTuqG12Fp9dltqxkXG9/7O0R5YT+NX7hXU3TL/AEd+l9OGNK1penNUS28EwoiCxECvMEk7lVD4FykkcBaf01ctS3JuDa7fKuUpRASzEaLijnjBx2/Ouiem/wAA/UXV6wu+IjaNt5P1OTz4z5+zaf8AE16GaR0JpzQsMRdO2OHZWhwUxWQkn7q7/wAanvDJUVHkHvnzosS5nP3T34H+mGhVMyZdvkapuSQMv3dzLQUB3S0nCQPvmt7wYDFriIiwY7MKMgYQwwgNoSPYJAp0opQgqUQlKe5V5VDP6siR7vEgojyJTsgcKbTtQMHHc0N8C0pTZLlsYye44OOw/KvuwfnVV6Wate13p+4XF0qUEXSVFb3NBvahte0J4/F2PNXItiqp3yRKLi6EdnHvQlo4pfaKyCMjtVrKjfwzR4f76chPrX0tZHeiyRv4ZArFTRCu1Oig182ZNFgNS0R2GKgNdaHtnUDSlx09d2Q7AnsqaWcZLav2Vj3Bwc1ay0fevha44OMetTZZHj51N6cXTpRrS46avCP9qhr+h7GEvtH8DqfUEfxqprBI4xnyNel3xfdAR1g0KbvaGEnV1hbU7G2D6pkfu4wT5+qfcYrzXUkhxQUgoXnBQoYKT5g1dOxqJGXrK5SNEw9KPOeLaYc5c+MlR+ppa07VJHlg96j4ico5NIPtc5BINOIyMNJPmKksjrP/AEeDAX1R1SsgZRYgAfPl9Nd7gEDjk1wr/o5Y5X1E1u5gfTZGR+9+u7wkjGaTJ0VkrYmlKh3FKISSe1ZpbKh3pRKcD3qLK0fNpUOK+BokUuhsjkc0zuN2j20ArUjdjcQpwJIH2JpU8iirY2MHJ8Cv82nkgVDamvDVos0qVgKcbSSnaNyirHCQPelDrC3LH0PNElW3K3UjuMjPpxzVP6mR1SbatVuStcl1nYxIQseGl1RwCfXGea5mq1MVjqL5NWHE3LlGqZXUPUiJTq1ttOuOPBn5FTR3NtKH41r9T/R9qQ071NFzuLkluGl19tS0BsqKFSRkJ4HYEAEJqbQm3XSM03CYYeaKyy7NfClIdex+seQn8SgCMD+Fatu6BbLrMakRFW1SQhllbTOVqVuyoEA8OFPPoAa85PJkh7rOhSk6SH2rrH8lqi0aycS5+jjIxOiyJJ/VyCf1LW8nKUhIyVds1H631pK1VYH56wluJGcbElUU+G2Gwv8ACnn6h5k+vNS2oHYuqNM3C3WmBBuTcp9AZV8wUrU022SXHEH9rdxkfaub9RamlRbE/DLiEs71NqaJylA7cHzHcU2E5aiooXOKgrLxqPqXqHqhJjxGXFfoGE54iXnG/EWG87QFK80+WPzre/RLqKqfakszYEV9ttpUaU4pJLfhb8NJUk5P0qGMjIwRXPvTaNKfU98zMYYZLrLENtBBAeWjDaVKSRgHPKjxnvW2+m9xs+mYlz8WFdrfe7ZKBd+ailyO+Ej9c0FeSVYJBPAroK4tL8CrtHVLDzFsksT0zvBt4Zx4Rc3JUVfsY8wCDg/lVL1T1Zh2eN4/h+C66oNsM5Cw7lY+vjng444rlTXvVi8XG8XdizOqeZlBE4llKh4EZKj4TSc8J3/iUR3OKmNFaZvmqJ0d6St9TMGc14kEpJV9YCxj1wCVEew9a1TbceCI8dm1P/CP1M9ePlIqY1r8R0NoQ6wPqUk/UTk+YHbzreGnOqzMmQzDuYbbeW2kplD9Ul5X+6fw/lVZgdNYeobOWJhak/qlMB0NALyo5bdbV3CgfI+YqyRumMWPaURX9011v62H3PxoV7+pzzVIeRdjZOLVGxUKS5hQBxjvnilCgY4qK0sovWlhRKwQnapLnfIqaCa3xuuTA1TMEjAowKU2cV8KcD0qSpjtBr7wKyKCE0mO9XSAyI3DtWBSfSlkJ4r6U4IqwDfZQlJpVQ5rEc1IGCgKQdTtSTSrkhKUnjkVHvzlYI5x7VMULYk84E9uSPKoOa+QVJAxntinT0hxa84NJogOSMZ9a1xpCm74I0MlxeeVe1SUW3+JIjktAfWk5/MVIRLWljBIJ+9PWUJD7WE4+sf21Epr4ZKh+TZ1FFFWGhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFeDkXpXrfqVrvULemLBPuDTU+Qp2WW9kZpPiK5U6r6a94658hxUyPGgOtCHFhurS3DZ+lBRk4WfXNRdEOVHEGgPgM1TdLYZF/wBSQYKlN5Zjw0ePlXurIzxTmd8DuqLZsnWLU1rkuNKCk+OlUZ5Cx5A8812y5IRZnY0bYXW5Kw1FbT3CsZCT6DvzWLkByPPFyeId+jY4y2OAM/j91CmLIxVtnD821fEZpmCWJLmoZsNlSV7mH0SuP2TwclNTMX4zdf6OW1F1VphlakcZmRXYjigO57Yrr3Urb9zgvptAD9zThTTgV9CRuBwo/by9afqt0W/w0rlETlAbvFmIC1NqHcEK/Dz5Vd5V8ojbZzRo/wCOmwznX0X2yyIjKlJLTlvcS+EJ89w4NbRs3xO9NL3JitMaiTH8ZRQVTGVM+EfLcSMDNJXvpZ061q7IizdF2tMhpRS4/Fjhlxf9dBTjv61r25fCloGVIcjNOXm2yMkMpjyPF8bzxsUOTjvSVlwTdLss8LXJ0hCu9ru8Uvw7lBuEYDKlx5CFpx74NNrhpqNepltnLK20RSVgIGUOIxnBPpnB4rk6V8EF4hSlOWLVzMYujDTcllTRI80KKDjNQN1g9cuhb0a2s32RJguBSGgxJEhrbj6sBY486mUI1wyYRkmnE6b+G6IlnpFCW02UJkXK4Op89wMheP7P4Vs4JCgCDkeorhHpb1p1v0p09Gd/k49MsMlorEiTGdLS/rUchwZAwSr99bRsvxuxrjfbemVaBFtzaVfNpZeC3ecYwDjgURxNIrOVu2dPJQknBzn+yswg45HatE65+LbS9m0lLnadS7dbuhvc3CkNqRg5HfyNbg03rax6q01Fv9vuMZyA/GTJVl0b2xjKgpOcgg5FVcXF8i+CW2VkEZFKtEPMtOoO9t1AWhYHCgeQaz8Mj8X01RugEUt5r6GhzxSwG1Pb2xRjnHn51XcX2iHhe9fC0PWnBRzisSgCiyUhoUBCsgcgjGa8+vjh6BDQ+pEa2s0XbYbw9slpSMJiyz2+yV84969Dltbh2qG1Zo+16801ctOXyKmZabkyWH21DsD+FY9FJPIPtUxdPkLPGbaCCn07570oynsOwFXDq/0runRjqBctM3IreTHX4kWWtOPmo5P0OZ9ccEeRqqbcp4rRZdHY/wDo3Gt2reoT3km1xGwfu6T/AIV3KlognPrXEP8Ao1EZvXUk+XycAf8AzF13Lx681mm+SRIJxX1KO5JpQJOeKy8sVWyBKS4mMy46UlexJUEp7njgfvrUR03M6g3JyRPaMZ6O4R4iwQnBGU/+7/jWytZSVMWlKUbw4+8hlst8YUT3qVhWlqFAEdCicHClHuokYOa42ZSz59rfCOjjrFi/dmktQaYbdtOoJRWhiI3ujRMo2uPrUBuWcDOSeE49a1dBk6ph3GLEU8+IiWDIjxHx9DeTgpWfIn0NdXXCzswG2pSI6pKoiStmMgfjV5fnnzNaSndKpA1Q/dJlxcdZkSxIWNuAy6kbkqUSeUA549RWDUafa9yHY8trkqukeobNwt0xwoQXLdHU1MUy3sWPq+lKUH8GCSCcUonTdtkSFXCPHdfgW4OSZanmllbcopCUYzjOB3Pbmqb1m028xrZzVNnactyPmkqZeaVuDzyUjBLfkVEk4INSujNXQJ2oXEarMyddnkvEW2ctZZYdQdzgZSD+s3AgjHcgjyrPKCnGhqdOyr6GXJ0xeHY1xZTIjp8KSZZKQuK6olPhAnuCk9hwTWm+pWkGpmt5Nptqg4pUoCKEkJaLqzy3k+xJz2Bq8qv0jWt01NOcectceHLE2Jb3k+GqUUHY2k59ASceWKoF+amXrZcEuOMqalJjyJRd3oaWo5xnvnaDSsEJYsjZGRqcaIXTky22aSv51cqO22FRXmWGwCSknaoqP0/Sofc54rZs7Wl9uUNEEXyZcFzo6YzEVshS5CeyGdwH1FKs7iew86oOpnVx/wBL+C8t2GshZ8NYGEgDcVJ9COP3VeuiOlm7lOkN3RD7K1NMLtjoUTsUHQQkKTwkFKuw5rtLpyZjrmhW0aRnWhUhdxtzU11cpqYyidIS2t0NAh5vdkJLZ+rCc+X3rrzpDYP5W2Zy8KUzAdnSI7yG4CshtUdG0A+QUUkBXkcZrUcu32vTTiNGvw13RMZ6YzJSFFSEME+KhaSf2wrdyPXFWyR1TcsTyGNLpan2cxmJXycFG2SV7SFpI4KRtSCfYUiOoiuGaPBLtHSDDcKC8CpaG1oTwhP7RPIOP+/enwuDBfcS4C14asEu4AJ9ua5p/wDCFkXFMyYw2FzJMUusRwvaoDwz+EHvtKSassHqo5qTRkt6XCXFbjNsq+YW5nx3FDKd2OxyO57UyOrT4JenlRveFJije2yAT3I8xk0/H1cBJz7iufbV13lyUMypkePDQoqaW679Ki4jAcZUP6Scgj1zW5NKattepILEmHMQ94oBDZUM58xWyGaMuDNPDKKsnynFfCB2rNf51geTT+mZmJOHJPtWKE80upkK9qA2EnvTUVZ9RivuQT9qRddDY74pk7OIOE5xjOattsrY/WoJ9KRWsHHI5qMMhazkmlWwtRBOcVOwkVWlKs00kxxjgHmn6EHzB/dWZZH7QqydFSBTGKVfhIHvTxlsgY9KePtJGMCsUJKcmhu2FUzEpxSKXQ3IbyM/WPL3rJ90jOODUa6VuSWQVn8ae33q+2yG6NvUUUU4uFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVz1fZN0clPphWtEieypSm3GXgUjnkKz5H0roWtJhCLK69GWrw4pcUWnlefJO1R9apJ0UkrIeLIYkRPElQ5niLH61xxvcUq/L8ODXy26jRMluRBI2uNAbpLiFDxB6p47+tP5EZx6Y3LSlbcEA+Mx2U56K48h3x50/mNNmO2tpY3hJLHhjvx+HHfBotEbbIqMqFpxlMcPJRB3ktukjIUo5IPrnyNVbVGpGReUIQ+I8dB/2mODtUo+Th+3p55q5/oo362JXJQ03JWkDwlpyhhec7SPPB865s6zTbjJ1A5ZZjkaNdFKSThWxDjOCd2/y7djWLVScY2mNxR9xtR9Uo3FudDcZmysb4yGRkEf0V4/YP8DViat7ExqNLL228J/WNuJzsZVjBSB6ckEGuRdFfEA/0wbmRcC6B10BC1HCGFD0AzuSPQHnNbD071itupbg9PuF5FvYd/Vvxm3fD8Rf7KsHsO4NcvDlceUjVNKXB0M3JTqSJJjoCWwj9U84MHarH7H+BrVXX65s2yRYrYvY6qLAcUvnO8bT9RA5zxk/en8/VlttafntK3xMp9DSd9udKdj6OD9JHZXPeonqpPh3TpjqHUMpVvXdYsJ1AfRG3rAKcFKFA898bvUV0I5HlIiowZb/AIeIDyejej4txUh1s29LkZgJ/VqbJUeQeCrk96dX/QGmdU6hYtVw0varjGEdx5U5+IkYyQPCCk4yvz9cUr0hCr30c0nGQy7bwzbmWipSuUqSO6cevrV8V8u5HS0tBbdSfpZSMqSsdv3+tbYuSXZjmk5NHFHxVdG9K9KLLZnNPwplvfuUlbZdRMWpHhgZKdp4BzikOkPw/wBy6maJF8tupYtsKpDkZLTsdQS5txnctJzk586unxlNTf5O6ZXc5YffVPdAjpG3wgEYAHrkY59a2t8MMI3Lopb4r0Qw4qnHVKdTgLfyrIVx5Z4/Ktfl2wKbEanGh+u+g4q4Frur8+CEFIcgzQptIGMhCXOQcU/jfEL1J0IGIGptJuSwhO1MiRFWl1QHmVIyD5V07cm13S1zLUnY1PWwUpUc7WuMJc/xojxkxre0xKcBktoQlx05KluAAbx6g0RzWvciHE0Bo34wLNIjJj6jgS4swKIXJYSCnB/DlPBGK2Dpjr/ozU0yUwm5sW4pIDIk5QXEnvnyBzVkuWgbFrJoO3mwW6VLSThD8dOE8/tYxnI88+dUS5/C50/1GhbtvtkywuoUcrgyVDcofiASvIx71F42UqSNn2nUNqv8mVHt1xYmvRseKGVhQGe2CO9SQRhxbZOVtgFSfNOe2RXNFw+EmbGdMnSOuZDC21cs3Bggt+xcbIOR9qZtaO66dNpzs23TmdSeMAFuMS0ulYHbKHACAPvUbIvpk8nUak4JyMD1x3r4B68jvzXL9n68dQun8ucdY6WmzG5MjxCZDCkFrI4CFICkkf4VY9KfF7pmdKeYvjUy2uqcyj6AUtg90nnPFLeKRezQv+kfKTr/AEcj6c/ox08d8eJwPtXJSUgDtnJ7V0j8amro3VLWlgulgjPyoUO3rjrWhJznxMjPHBI5xXOT7DsVe15tbSwM4Wkg06MGkCkmdtf6NaGAx1Jl7dpU5AY/g4o/4V2oG81x9/o3GNukOoEhS8k3SMgjH4QGVEc/nXY6U4xznNYp3YyhMNnNZeEOc0oR6Yx558q+4PoKVuomuSMvNuVcIzCUnlp5DuPXBqVSSrvwO/FYd/alAQE4ApG1JuX5LvlJP4MhnPfFQuoLEm9R/lkpbbc3Z3qTn88eZ+9Te3igJwe2ec5zUNWWXCtGqdRdPEqu8ZUNpuS6AXQ69neXDw46fLJAAA8sVyt1X05fo+q9RXaKiQ8pLiFofbSN0Z1lO8rbUPwJO4g445rvaYykNqOQgkZKj6Dyz6VprWWkFLelsl5LImRnN0fILT7jqwNy/XaE4A9K5GpiscrXB0MKc0cuKed1RbomqbauQuTHh7ZDHhhSMFs7yd3d3OcGtfW2wPWrR062y4Tjce5aijkOuK+pCFtEJVgefOfyro5zpcx0315OdjSFz7OiE1JTBbcV+qbUsIdUONuEqOcHnGajdU9M3bFr7TclmW25bLteoimHgj9Wt5O78Q9yRz2pCaydDnj2umcvpsrTmorna/mXXYKchdxeT9Z2g4P2JArelotsrRFrhX61JXGu6GEuvwlN7m1hQBKgjsFBKSR6Zo1PK09Hf6hQokKMXnJSExZmwjkcKQkk8HduqJ1FfZMhKPmkLQ9EdDa0JPiFSA0AAFDGVHsapn1Lj7YkwwpO2bZu6oestK2+bbbmzb5Dkvwtsn6ZA3kLcG8/jIP9tWHSemLez0/tFwgIjXCX84Yl2koa2POMq3hCt3kpskfcZFc/6mmyZUW3rjgsOtSVzksu/gayhsBO3JB4SDnzzWzuj2vdSz493siI8aUl9syhEU4loJPBKk8duMAcg5NLwPcrfZac2uF0YytJuW23TGza40m6QWVi3LaQQmQpsqSoH0BSrP3Fbz0J07ZsVxuS3UeLbNSxWXDCcwpLTuzKwM/fIPpVjtehoup9PocDL0FqUd6o4cwUJWMOoyP2SDV5t+n4dthw48dCvCiNIZZK/qUlKQAnJ8+OK6sNOuzNLM10ctay6WSdIBCkyBIiMzm1TGnEeIsB/CUuZ9kjBP8AVFP+jjtxs94k275d1u3Rn1BvACBKQhwha8HkEEjt3rpu6WSHdoslh9hpaZCC2sKGcjuP48/nWu7x04L8plxDvgrYQ4sKQs70q3pVj3T9ParPDtlaLRzxktrNnx3C+yhZzggEZ7keVZkVEaRurV3sEV9pSik5+lQxtI7jFS5POK3x6OdNUzIDIzSLznBApXccViW93lTF2KZGllbyj6UC27j+I59KkksBJ7UpsHlxTXKuilDH5FKUDCQT6msg2U44p4UD1r4exxVdxKEQMV8XyOayWnH+VJOKwmrLkBIjJPnSLzobBzX11Sz6YFM5ByOTjNXSKydCUh8Yph8yDLZ/6RP9or7Kc2nhWaZMArlMnP8Ayif7a0xXBlnM3hRRRQbQooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACtMTYzNz8UyFhwFe9CQr6EKBODjzIrc9aYuaC1cVmIhJjLdIkOBP0s57KT7570rJ8EMSRcX0vLieCFzwN4BP0lH9M/5V8t8F21LdLr4dD69wcSnAQT+yknsmnP6DjtAusoDUhIH61R/EPRR9DVA6jankjTgFtUEKlKLPyyuVqT+1j0IwSKy5syww3svjxPLLaiyaknhlLimJTzaQCJDjecFI/o+49a4l606ikah1HNTEU2+FpJWpC9pKBxnJ/iK3LqW5axnxJTEFqVLDgQUuMDa44xgZKUeo88Vzo7pyReHrxLS6u3sxYpuH+0YwppbpQkHPOeDXFlOeaayPo6ixRhFxXZqa3WSRO1B8nAQt+QoLW00F8nanJCB5njNS1s0w/NY+ealuB/eEuocbIDayeNxPHJ4x71a7vEa07b4MmLEjOORnd6J6Fft90pOO3OPPPlUvK6wXZnTseGrTcNJdWXZpZwdySe49eefvXYi01aOXJNM2Ro7pFNuOnGLtHbmW99KUOliQvCk5ylQ9MgHIHmBTadcL1YumOoLNelOxkvsqYQ7t+iW+HADtB5T9PJHnWwem/xLaeudth2y8oYtrqi2EtyFfSsgfiCv2iCM4qW+KGVY9Q9LnFNht27t3CLgxj+BTpCQo/7wFTxXBWFqXJt/p7i09OdNrYQHVuQ2W3Ggr8I7bj9qty4YhvOTM73lN7XST+JsA8j7VpH4WepNx1Bbr/pq6RWUtaZcRBblDPiPE5JSrPB48hW747axIWh9GIqiDHbx345Cvv5D0zTE3SIkvccq/HHMTcGtCOMNpQ06t9xtah9SgAME+3pW6+gbLjfQ/RiYmPmRC3Eq5CUlZJB9ft61oj463gxfdHQUrSW248h0IHdGVDz9OO3lXR3RqM1p/pNo5CWlNtSLcwtQT38RYzn7GtUq8aIRc3W0MMfNNDxHAgHHdTnnsPrz+6kvlC+8xcMDxkNqCW0nICTgqB9cY7+VLeAIkp2Q8oJSoAKSn8DJ9R9/OhxorfCgrZBcT9WP6fkf90isyfJI0J+eLUthWIwzuRj+eHb+FKylHIMcp2kpS8R+wn1+4NKKWuPLbYa/mXMhS8fS0fIf+12HvQlCLatuM22VJeWfDHfCjydx96G7JE3sW1YWwkLLzmVBHmo/tn1HrQ201a1KLhBTIUCT5lZ7AegNZNNtwEll1RWl5R2FXGf6gpRpgqDglkKUDlvI/Cny/Oo4ChhCtf6PdnmU8XBJd8ZtLh+ltOANiPfioi6aAsWrB/w1YrbNebWfDL8ZJO0/tKIA7/wqzBlU5A8YbFNOBTfv6KNJ7DcMLSCgNKKSlRxvx7ennRvkugpM86PjDt8Dp11Nt8PS0L+T8Ny2JecjtqJQXN5TkJ/L91adb6izUoWzcIcecccJUgFX51ub495DMnrTFSyUuFFmY2D1+pWa5rSfpL6jl9POVH8Q/pH7VuhN1yVcEdcfDnH17qrRWoZmgILVttq5iG50ZMlDTjzyUbgoZ4/D5e9bpkdb+qOmIiG7roaS4iOpCFSmopVuSByMpJByPPFVv8A0fMIXbonqxlQdYTL1ApSnwnBV+oQDtP3GPzrq1t1aggxlKZQwQh0Z7jH4R/Cs7yK+UTsaNH2n4xdNS7i03c7XNsjO3Cw8kKO4nGQeOBWxbB1u0HqOW7Gi6iipcbIwZBLQcB9Mipy56btN/R8tPtcGfCdSf56Okkn0zjitN9W+n/RbRtsaumrYUbTkYuhtDkVS0OSDjH0oTkkD1xS90JPouotm9k3KG5GVIblMPMpGStt1KhjHfg1U9U9Z9EaMcDN41PbYb5/5LxgtY+4TmvPHrDrywQb+5aNB6huL+mVhJXNW6QXASMpSBjgDP7qp/XPTtl0Hrv9FWKbKnNphsvSXZqtyw8sbsfuIOD61Tx88DdrXZ6W234kOmVzdQhnW1r3rO0B1RRz+YrY8KbGucZMmLIZkxVDKX2VhbZH3FeIyppUkpWQ4CcKyBVu6edbtYdLZyXdP3uTGZXw7CWsqjuJ9Cg8D8qJ4nte0utvR6y6p1Ui227xVIbDH1Bz6gSgJ8yPPn0rn29z1aljNXYh1EJyU4YTzjivpSnurA8sgkVWOmHxTad6rx1Wy+oY09dW2Q2lKzmM4jHO09858jWyodyst803c7XY5cJeWAYkdJ2lsgbVgj3PIHoa+a66GtnqHuTo9TppYIY0r5IjQ8+53K3POuNJeeZi+PEjylAGRGJKJCSfPghQJ7GovrBLZR0s0ZcWPGZTaLslrwieFr5CDuH5YNbZ0joZx+1xZ7bBiXKKltvlABcaIwtvB7IJrQHWqFF09oq6Wf8ASDgVaZbkhuIrcpX4ssoz2xk108CyYox3rsIxhqJP9hv0r6STuoTV0mSXlhuGEIhuuMgtyJQSStQ9UhRI9SaIGgrrbrQuG8kbJ0tTqXlx/rZextKc+ScgnHtXSfQaBCsWi7dpSI26uRZYjQmyVj6TJdT4i0Z8yN3PpV1uWiYUyXIkhpBdd2OZ7jenzx9ia6z0qn7kzivLtk0zkFPSy6s2u2uXlKlxojjkZ9BTtJaVwF7vPyPsK2Lo3pmdK6mt8y3NNLWuCphtxzKUqSAc8fux966FlaejyreGHGgpPGQRyoD19qaXDTrb821ONN7URkrRgeWRxUx00ofIt5UyasLaGrNECWlNnwwSlfkfMU/OD2yPvWLCSUtgeQAGfPFRreq7G5dXLYm8wjcW1bVRPFAcSfQj19q6kOFTMcu7JMD1FNLnb0yY8pKBtddbLe8cEZHlT4nyxzWLiCtJptCV2RGmLW1ZLQxEQMeGMHPJz61KnnmvqWsDkc+tZbePSpAxQM0oE5PkPvTWZOYtrAefVsbzgnHn6V9TdYaoq5PjpSwgZWon8IpbyRi6bJ2tjvHsawWcHioLSWq2tVR5D7Kmy2l5SG0pVyUjjJqcX3GO1TGamrQONH3uKx86Ox57VitxCElRVgAfmftUuSirZFW6E33kMAlZ4AyceVQKtXW1M5Mbx0KcUkqUQr8P39KqeubrKubC4bUpdvbWVFchKdxSB2+1c+6sN+0zc1z3FphxHChtRdkbQ8vaSnI784FcXJ6moz2xNa0zULOrYGobfeI6XWJCcryEoP0qPJHn9jScp3eMj6QPP1rj2P1kmWR9q5yQqW8zhTYAG3eOAB5FIyfzrYUf4inLtFUmVGjl0RlvFDCgnftPbJPBrq6fXQnC12c/JiaZuldzhqaed8dBS1nftUDtI8jVbj6xS7qaDDZbCmZJQpt1eQD9QziuYrP1fF1vkh5Zeg224yPCW0HkoSwCNyic9xk1Nx+oDsa76egOMqenwZZjtyOfD8JS0lPbucGssvU8jn41EstNFR3NnotRRRXpACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK1G9N/WvBcYNgLUnwQR3zn6R/jW3K1BKhvt3N2clLbsrlsgngozwB7ikZfgkZxG5CZC0ymdjBVmKgqzj1B96ofUtqQdUWSRHgiQ4lwhxscpSk/8AKkeorYzqnrtEcbjKaCVpKfGKc7Fe3uD296ZyLYRb0IXJCJcZIV4pRkuH1PqT6Vgz4/JGhuHJ45DfT+mE2lptyOlapIVvblYSMA8kD0TXD8iDD6nfFG/ChwHHmCp1C4K1DaQhRUdvlgEkgetd0wobrkh1D7zjFrcb3IbJwUr/AGifRPoK5i+Hq1w9Sdd+oWpY0Vlz9EPBmKylOPFUpWCvPlwD2ocbjtNOOX3SZF656DPPxJVws8b9G3uKkfKxUJw1cdvdJGeFgHvWvtH9ObZ1LYlsykSIt2hPBp9pX/IvD9lfolXrjGa75uOlI09gPIQgzAQ406T9KD54HkPWue+q2ib9B103rLR0FDcvw1Q77CQkbZ7WQSQPPA7HvSYw28GduzmzX/TuV02dVDkKjvQC4lcZxSxlOfQHuR2pu71Ak/oux21Mj56CialxTSj+tR4S/o3D0III+1dsW21WPqHYYMK92CFcVoaAjKW0lXitjukH8SVJ8wa5n60dCkaE1DaGsxI9uuEsnEYFKmiOcc+RBGfcUybcVZbGtzo2/wDBqwq8sdR5jxw7+nWZMfJGEKU2rKgB+410etf6YYfjoUWSglt11PdC8d0+uPXyrkz4KLrcbY3qmK62F2ZU5tD0hKOQoAhPI7AjvXVd6uJscQyY8NyYRjcxHTuUpOfxfkMn3FOg90ReRVKjkD44H0q1rpaKpsIXGtbhWB+0S5+LPvjNdX9NoKofT7TkWaUKfYtbCfpGEhGwFJT+WPzrjX4z7om49U4Gx9b6U2hAzjGNyj2H2rtyxxfntOWJ1GUpZhsFpJ4Jw2kYNbZ/YhSRINoVLU7HfG5jA2E8eMnHf2wePfFfVLJdXD2lRDYy4O20nAA9x6VktZnNKEZza8heC4P2SDyPuRWUgJLX6kfrk8tgd0q9D7HzrNZNCDJbitIhEeIrbkBR5WP6X5Vkw0WGvCkr3Og8rPdSfIClA0PCS+5t8dIznHIPmge3tQ0hUpLMpaNj7Z3JST+A9j++osKE2WHJCCuSEh5Cvp8wkDsr74r4hC7g2lahtLK/pBPdQ8z7UJP6TSzIQlSQknDZ7q55r48582UPR1fqdxC1AY3pHGPyP9lRuJBZNwSh1slpLa/q9V4OCn7ULHjqQtkjwRkOqR3+wPrX11akOI8Ep8Jf84ryTx3H3r6D8q4iOy3hCsqBPZHnz96i2B5t/Hqyynr7LKMJQza4oQgHjGCa51SoFz51SVEKXgpAxn1H+7W+/jgZEb4jbuPEPy8eHERzyfwZI/jWloSGZiW1h8JZdcUVBY4CB+wB5V0IVSD5PQP/AEe6FHoFckoV+tVqKS4o99qfDaAH8D29K6WO5C0BrCkle1xX9Hvz9/KuffgIbda+HhCxhS3L9OISMYCP1YH7hXROxLKi22glDuSsjy/rH71zptbmMaZVepmsYfTXQN+vs5JMC3RFvbEHBcX2S3n+sogH2rzz6Q6we+Ib4l4dz6gKau0VmHKnItj31RwG2ipDCE9to7488V1D/pAb6iy9Ak2tsr8edcYyPpPZCSVEn24FeaNsus60XlmdbZTsCcylZQ80vaUgpIUB9wSMU3GlRPStD1+/hi/OXNiO18uJqpCWEjCAnfuCB6DGBUt1L6iK6j6vn379HptnzaW0KiocK/wJxuKj5moDTlikagS+2wpIQ0M/UfXyx+WfzrOJZFl9TD6VIcQOCDkA5703yRTpjo4sk0ppcGXyKkW1UoqyScc01LDymkPhBDZO3eexqeatciQ0mGhtx9x9QSjaPfvVj1DppNstse3RmXZNwcUNiCchBx5eQpPmVm36STVtFY047LgSm7gyAVNOBaU9sn3+9ejPTTojorq5oix6qhKudnRMipXhh4LG/sr8QOMKB4rhhzp3e7TaY2WfEjtoCpDqORu7lNeifwXRn4/QGyLktlttyTIUw2RjKC4cECk5Mjl0hM8OyPIpH6E6t0usr0x1DltOZCds1sqBR6E57flWhesVvvz4cTqiYzN8CSuKXoawlTrmR+NPc9+M13Vj9aEgbnMEEe2a5K+Jli12PUL0f9HgtTZqJr0kJ3bTtHHHY5T296zZJJVasZpVuk1uoS6C6qumhba7LXY7zfIr52LmNqWpRUO6VAnBxwM963rbviI0hKcbRMcmWpxScr+cjFACvTNSPRbT38menVqbSlxqTLR807vJ3blHIyPI4xxVxmW+FcGy1MhRpTRPIfZSoH+FPU4tdGPLak1ZF2nXenb622Yd6iO+J2SXAkj75qY8MPttLYdQ4lKuS2sKz+6qldejmiby4pbum4rbxHDsXLRSfXg1Xnfh8tcUqXZ9RX6xq/ZQ3I8RAV5HB5qUosVbNsBO1YB+kA/bFaDsqXpHW+5/LllDa7gpcnejcShI7D0OcVPL0J1SsxV+idex7ruHLd0jYyR2BIrWGgblqOPri53B5TM+/okOOuwImAl9fIKUk9hx/CrUkMg+HwdXHG770bTkHt7Vo3Q/xPQ73GuK7nZ7gkxpKmi9HZ8RII/Ek47YOavkTrbomYkn9OIjLAB8OSgoVz5c1NUJa5Luo818AJIGcZprCvFvujfiQ50eSjvlt0E48qe7MHscdjmhriiOig6hk3RqU44llS4yEuJUhZ+lw4Ncx9Tesl4YtkTTLMJTdwSstqaCz4ix2QD7Dvmu1nSHQUudjkEEAgA8GuXur/TdxfWGDLtsJCZa4Dvybf7LriMHB9cjJri5sLhLe+Tfjl5FX4HHwuWa8WC7zjdXncSGUFIeTtQ2vP1J59fI+ddLB1vCRvT9Q9ePyrm2zdJdWaoiCTcJLtt8RKCfCcPIIVyBnjaQMCrJozR2qtG/LQ31SLmwHiEyXnMqaQR5+orbhc1Hrgz5Iq+Dc8mU3HBCjlXkE85qq6j1OzBiqQl0fMrH6tGQSk+4r5d7jIMxEBCSt/wisKSO3kKiBoNbzEtcxBfmPqCPHH4koPfHpXJ1GTNmbhjXBrxwhjVy7KtdOo9sgx5a5qnWIrZKFKQySN23J5HrWqdQIZ1uTKRcmpTX41x1PD6duMJA9cH+2rz1B0pMtel5DI//AC6lpL7pP80kHAKfftnNac1HZv5MMxmihmfMlBuLJDCDkb8qSsK4+ocH7V5yeDJdSOhvx7eB5rWxW5yGmQwhiO82lG1to8KWBxt+4qnRdLRrg9bo0zxG22ojhW7IVhKATlWBjnIpkvVKNLOOw7qUzl7i2JhbweDwft5ZFQ2odUOMWuZJjKU0hCzvUyoncFjjv+fFdDSwnhkmmczNUiU0bpUwIaNQXOYuSZL7rbUWQkDfHQClCj5DOQAO+AKt3TTQs27a2tl0WtTERpSVbEj6kKDoThX761ndLvCVp6FE+bVc3GW2HVtvKKQolYLie/P5V1j0JebYkG3x7e0zHfdWXEIc3ls5BACjyQU4I9MV6fS4nkyeSRy8sqVI7Hooor0JIUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXBT3+kJ0IxeZcC6WO/20syHG3JDKGngvaspzgKyO1d614IavjhWub+kLHhfpB8rI7D9YqlZEnVjIR3Ho9ZPje6NSFFLF+nQ0L5WzJtzicH1JGRVshfEb0o1E7HkR+oFjW+ydzLbrxa5PcEKAxXlWmIBlLLElxHkW+x/M1k5ZXnWS78psV22ukHikbY/kv4z1P1b8QOkmsWu23q23OVKjPKKmZSShvag9yD+7Far+A26w1DW6XJLaH5bzDiEq/bA3ZwT964RVp+4MKaTIYVHK/rbKUYx+VSNnZvEF3/gz9IKdzyqA26Tx5fQDg1TYkMVtUexC4zqJOVBTdvWnG3byFnzJ8k44ppfIZ8JTsRhLs5CctsjzHoR5Y715kWG/9a1sj9Fv60lsg7S20y8snPkdw4rq34V9Q9RPkL4nqNEvsbCmxBNziFK3O+7YRyTx2NJnUVYRx80b9g6VjQXlTI4bMlZ8RUgDCSfM48h61pH4hbcnW/UXphbnbc45FckSxJ+hRwEo7lQ4CSQMe1bBvet7bp64pN2VMiRnk7kxVsqSoKz+Mj0PbFVvUPXqx213xYqVpkoH60POoQkI8+M5yPKk25odjiscrsoXwfOLsb2rLO7CW1KlTA6huUlTSlNpBSVEKGCM+YrptM6BpqORKlpbb3FSXF5O/n8P3HkK5t1f8RmkXm21Jkwm7gwd7LqnS45yM4O0edVWf8XrMuIlK23nn0kKaRGYADSwOFZV3NWxrIuKIyrHJ7infFM8xeevIaioKGflYqEJB5+o5P27/lXe/wA0hkR0sONiGUJC3QoYBCQBtPbBNeYWs9dvdRuosu/SGlNuOpaBbOB+Ae3rVwV1x1S5CbhR3GYsZtOEt7SooGMYBPArozhJxRki027PQo3aBBkIZjS4y3nlhKmA6nJ75X3p88EW9b0pQyojDxHc8dx/ZivM0dTdWtveI3c3G3N2/PhhxH2UDzj7V0X0n+LJ5mMxG1WpuYgcIlMHc0kdsZ7j8xWeUJIilZ1OW1NOmUvAQEYKD2SP6R+3nTG73NmBmUQt2KlsrWEftDyXTbSesbRrNtP6PmtvR3U7mGifrcHZQ+1SM6Cm4tuwSkoaWkpLoHGDxs/wqhbaVmP1Esd+iPyLfd22Y7SSqYpYCXWcdvpPr5kcVqbVXxTQtPOxIDBYYWUlcl1XKGweUEe5GD54zUB1q6USbTeLRMtPiMqZS4JAQobHI4BIQodjz61yHq2+lyEHXmVJilW8NFGMryQoZ7pBGMDtSo250iHwjuTRfxJN9QUt2TTUAs3FSsLdcVuZSOd5z5+Rrd1qjORLezDkPGQ/4ZJWf2j5qz7GvN74aZtwm9RbfNiuogWeE54jq/ECEtjByFeXoT7CurtYfFbpnTtwszkCeLq6lKk3MIaUEN8fSUqOOScflTMklDgiCbONfjOddf8AiX1Kh9RW02mM04VHjAbHP8a1EYzJf2JdCWF8thJxt5xnPmTVs6/a6HUrrZqK7oa8FmbJbU2hQ2lISgAHP7612HmpRZjs7mvCCl7ln3yf+yt8HaQNcnqJ8EQZsvw02VxYS2l64zVEk4OPEAySftW8GLxAXIagty2nZL6VONoSr6iAMk+wHf8AI1wZ0m1zbo/w66UjXAOx5DUyUqK+X+FthwFe9AP0gkjGe/NV+X1lv9kvUabAfeZYUtKZDjK0lSG0qG4hXkFcJx7muBm1DhNpI1qKrs6U+OTTv8ovh+v7rBTIl2VUeWtTZypKd4C1H2wc/auLukfw7XLqZo9rUX8oLFaoTly+UkLm5LkYDgK47BWcAefqK6jtHXi56kvNxiKtTE613AiNOt8hSXFOxfDws5HpniqFpb4X9MzYd/maX1bMQ27JKIdplLSytkpAUC8M/WAOwHPbNXw6rfx8jVjVHMOlrO7pDXeodMSnm1SGlORm5DSspWpCjgg+hTyKn9P6fMxxSn8t+G7ypXmketferXw8ay6aSo93uZLvzjhkNSGwdvhntlQ4C+DlPkKl9Mq3RS5IJ+YcSkqCuxNTmfNpno/TvfBY2uET9lsp/RjKm9ra0gpStScqCc8Goa76d1H+kErclNrYzuG1ohQH3qfcviGC2EY3jAwKYOa7RdZSrU2/4LiHg2pXAK3Bzs+rHbvmsuOcrO1nx4lGmy1WG06guOr9PWCGGlWyWptMiQ45j8R5yPPAr0dslrYsdmiQYyA3FitpYQhIAA28ZwP3153dMdVv/wAtLHbWXUzQys+KtDJTseKsBOfP14r0MskFUaA2HXVlS2xvUpXO7zNPjNt0eW9RjGNUxa6XZuystuvAqSCd68cITkcn2rRXxgRo0np/FnRkJL6pTRblMKAKwfPPnU91lvd70C+7fmpTdy0/Ji/L3G0PJ+pO4hKXkH9kDOCD51qHqdqKJcvhz0+qMHvBkXMpjofB3pAWRjPlikyyNy2sw4YU9x1rp57xLJa/1hdUqIzlajkk+GM5I4/dUoACcHsOK5u0r8VWi9O6VtVu3TbjeAw3HUzHYPhJdH0kFR/wrb+mdRXfU7SZQYTFipKQP6yv2hg+Xoa170nRjcE7Zc+CTxjNCgAQPKviN236u474oJ4B8s8U5C+D6hALqMnaCeT6Hyrl/pdsT1kceebB8d19tb/A2rJVt/fXUG4JUT3wM1zl0wEFd5u0icrwGwtai53IIyUke+apVzRpxfa2OvhS+XsejtWPvSA2l2+OR0rdG4BQUUgY/Ot43LS1nurZE20QpZwQA6wk59ea560RKt2g4UbS0u4F6VfL78+08UbfDbSrJ3jy8gD510uSHFFQPBOQR51pk+TK/wAlGm9EtHylBxFucgOJ7OQpCmuf3+VRbXSS5WuS65Ydd3uCARluaEvoKvI+XGK2aTzx3NfFIx3UTRuKs1m5burllwti9WDUTKM4EllbC1ffFUi+6k1Qx1E0ZedQ6Wd+Zt3zUdpu0vpW3MWpPKh6bRzXQJRkHaee1a8120mPr7pqWloYbTcX2wlRxuBZPb3qHT7LQ5MEdfdMoUhE5m52jcoJzMiKCQMcq4B8+KnLb1Q0pfkEwb3EkKRnKPECFDHfhWKsr7SJCCh5tDyCNpSpAVkHy5rQHW3qT0w6aPLjXiwxb5fFHcYcJCUKb9N6v2eKme1qiuONys3RY2DJdmTFIQpUhf0lDgWQgdselS4QrjJ4/fmvLnUvxCalg31yXpiQ9Ybfv3txGnStKB6KV504tPxgdTLFIae/lI+59WS3KQlxBH9Eg+VKx4fGqSNGTG5O2z0R6oRmxoG+rKA4BG5SocElQxVGvnTGPPtVxnXFtDyUMhbCCnHhqLYG8AeY7D7VpXTnxkO9QrU5abyq2svvJShSN3h+Kc5G0ngHNbrT1Ov6rfEbesJfS4QkvR1IfC0AZ4AOSa52oxKT5Q6CcY1Zy/100VGs7yERkrWyww2HZAGTtxk5Hlzj99c/ydSS48YQ1uLLSSCEq5Bx2Ndwa6btt+N5eehuQpc9gt4koUlsjjv6HAx98Vzf1M6V4ucNyA001EfBLwYV4iWQD5q+38a5+nUsbamuC2SDn0au+eMhpoYLqyretKhjYAeMV118LOumJV7fd8FYcR4QfThClEngLSCQSPXHaqt05+GqfbWYN5v0dlyJIhiQEPDkHJAQoepTz+dSemuj0vT3U613a0FVuUZbaWCSSklX7BHptBBrowzOMqSMU8KcbPRuiiivTmUKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArzDh9K7S98Z9w0e7FZk6cYmLkSGHkfiSpsrAJHf6jXp5XnZaJLSf8ASO323zCtLdwjqLSVYGSGQoH+FZNQro16d02WPqzoz4f9Bajg2y+WJy2TVN/NFqAh0hbZJSDweMGtb650/wBBJOkLm5puDfG7ypoGE8+lYbC9wwTnipj4nx+lfiMdikblxbJGbQlP9ZRPP7xWPxRx4mgOm9uhNNxWrhNUwglCcFO0ZO32PnXPTqSRsS9u4qmqLNpNfRXUEmZbUr1dEeQtEw52ttqIGEnOMn0roL4FYnhdDYskRkhcm4yd7+zCgE4AGa5lv1y+X+FeNKlwwt+43fHirGCEgcJBrrr4MmBC+G/SqSrJeVIdAA8i6RnFWm20VlwuDczzKYLbz7aXfEQMrShZyof4mqd1ckBrpJqm5tuPR5Ma2PSmFIcIcaWEnB+4q7R0LbVh0AkqwgpPAHpWq/ibdch9DNZOxT4KVwyhxaPxEkgcfftSo/ckZnwrPOW6aov1/U07cr5cJ52DHzEhRxx25poLTJfBcUw+6Fc5IK8/20wlQ0yXkrcUs+Gd2ArA7VsrS/TKzXSwsS3g63MkNhanWn1IKTzxwRx2rtLbH4MluXZSPCMYJQpCmfXegj/ClkqGUnI5ODUndNPmBebPCt15uLYmzVRXULkl5ISE53Jz2qVuulZNrMoKvCnnm0pcSmTBacSU+eTgHNWWWMSdllNsziVXuav+uEpAHc+lbN0R04vWs7pDgQ4TrDchfhpmS2FpZzjIBVjzqK+Fm3J1N1v00h0oShy5eIRsASdiSrASeOcDivSWY3cBIdluzENx1jAaCBtZOfxfmO9UzZtnAzHjvk41R8L+qPEW2qba8oWW14LhCSPL8P2prA+F6/z0LlsXSFGWlxTYw06VfTxngeflXY8n5+Ev516SBb8hLzTTYBeJ/CR7Dz9acPXJTshBhMKIynxthGAjyx5buf3Vieo+GaXiSOUdL9C9a6fWXIepI7akkhSYjbpIUCOFJ8s58sVurRXUDWkSQ/ZL7YlSlR0jbPaWAnnscHkE+9Xu9ybpaprSLd8s4tZB8J1oZ2/01H1T/GnMWfcLZb1PzGY0mc5lSktDbuQO3bzApUsnNg8dIY3+TadVadkQ1KLdwLKwhp5B3Ic28E+xriTqX8M14u14gizNOSmn4qFPqKQhLUk/jb59OD+ddynUKmmpc9FsbkONxlOL8HJU4lIJSkeffiotrVMq2WqHdLtbmjcnYqFy0MfSGgSSEgHPIBAJ796XvW7chextHDdn6T6w0e0Le3pWY9aQ8DJlMKSVySkjAHvn+FSOvunmptSIMyDpafBW5tQ4pwJDYQBgcZ+pWa7fh6gVKt0u8C0ANtNKWhrIUoKA+k7cdzkDNaYldetQC+XFLGmbRHiW99MYrmFwnx9oUvscDuB96jasjslRpHnBrqBIgavu1ndbXHlxJSkLbUrJyAMjPtVdcdVMYSllf61By4v8O8eSiatnVq8rvnVLVdzRHajypdzeW+1GB2IOR+HPlxVOcUoKYDKAd6drqQMjd5p+1dWHCRnl2by0Lpx/VEa0RbfLW1NuoW1FZejLLTi0YJSV4wEkbjn2pWRbGLLcEWu+yIrDYmr+cQknCW0fSEhwcAknNVKwdRNS6bLFts98nxIsTIYSy8f1ZPcI5wO9X9jqHrN+1291ENGooDoIdXMtAkNKWhzPJCe/AORzWDLpr5GRmiIgh11i5m2QJIZZC5aJ7bxC0MpP4FkH8J4pJvUBtF2blu5N3hJ3okMSyEt7kgpWCOD+fpitr2K86d1IpqXqnSb9mCXi6zc9PKXEcQtQ+pPhrG1QPpVM/klZ4rTrMe3pDC1FQ8f61lOfpCj5nGKwPHHE/cdrRabJq/s6JQde9Xah6b3bTl5W1dWpzvjMS1kKcaz+PI9x2x2qkpjLZiIQhWHUgA+5qO1RpFvSAN+sjS0Fs5fhhX6tSfPFWXTKUavtAnw0KAGELR3wrzFGWCryQ6PR6SMcLeCX3FZZugalhLyi2tJ+pJ7q9xVvt+lY2pX0oaEJ1qSNi3X2wvw88FQPkcU8j6TiPORlyIYfU0+HFhY4Wgfs1G9cLbdLBc7Zcoa4cTT0leSu3xUxy1yPodCcBQHr70vCnN0mM1Enjg5NWXjpVrdnpxqCA5G0w+/a27ilKJS1pytKcjz4wcZFdhdPPie0rr2a9EKH7XOZUWxFeAUXDnyI4zWjegnTsdRLNJs9/at2ITyZkYBAS6tCk5HIP1IPljtTLUfQ7UHSV1yTZZDkqzy3g88fA3OtgK5AV5YPb1FJlKcW2vg8xkTyyTkdH646nW9q4W+zStOSLtFlSEx5r+xLjcY/iQFpHmfL7Vp/4m2odv6YWWPam9tvVc9zSCnYolWcgD2rZ/R11gfNh54TbrOLTkx8M4ysJO1KgeQQkj+Na2+N+UiHpmyx2k+G2HzscA7fSeQKjGpNqUiYRVtI0n0pbjWzVLcuZp+Zdnm1u+ApLoaAcx3Ge+BXeuhNQuajtMeS3C+RhBAaKHjleQkc8f21UdGdJtIytGWB1enoC334DDvjpa+reWxuIV3yavbDcSzxkMtOtxIsf6A2khIB4xitqi91sw7VzRO4OMcg+fpWLjiGGlOLVtQkcqV2A9arr2pYUNZbduqdyOXCSMAHtVYvXWLS9mjqXNvLfh7vl/CW6nCwrjJBpzbfQlQpl6nXqNCQQt9IK2lrSpJykgDg5rlbS2o0NatuNkcgPncyl8SgP1YJONv3q13j4oNAW9bdnjTmnnjmK002rcFKX9IPA8iaqkyU7YTIfUEKcS4hoNjkrPoB3P5UR3b1wa4RSxshbJbF6l67XJlJS4Gw3DAz+FKV5BH71V2gy34LaWweEJAzXE0G1XnTkpeubPGkXG7Jub6EIbzuU0RsJOO2CDXRnR7q41re3twbkFxr0n6XGn0FCuPv3HvWyfZg+DaPcf4V8JyM+fpWexe0nYQeTj/srAnOFYKQoZGaWmmUpsT78e+a171FWyOo3TRDoJUbk+pHsQya2AZTLTjba1toeXyG1KAUfsK1X1avYs/UTpgp9v6VXF8rUeA2PAVn+yqOVsvii26Q8679VP8AVdowvxlJVfZ5+Vt7SuSFnkuEf0UjJ++K85NY3N653R5bshcmdKdUpyQ4cqUfMk+9bb6t9QZvUTVM26SF5ZZC0RwOyWwTgD07Vod2Ur9PJfzltLyErB9Cf86pubZ24YFgx21yyGvSEjdleQngNjtmq6/NddIcGVAfSM+Qq5X6GHLzMYUNrbG9Sv8AezVUVb35b5aaSoDOMJHetuPJ+TnTjbEoKEOKU8tIT4R3A+prcPRrrDdNC3+33aJKXJTFX/tEJayQoHzAPbitUSoKmHBGaCjs+lQA7qrD5ObZJLclrckhQOPIDzBqZJSEtNcHsBojUdj6o6fj3mAtmWw/hS21BKi0vzQoHtWmuudqZ0rGkKagqgLU8kQw0kFt5RUPoJPHI3furnLoR1Nu3T24MXS2OKRCcUPmIWSG3B5gj7V1trDUVp6m9K2J0lhEWPMmoQ5vVu8BLZySD5HHn71zNVUUv2NmlT30Otb9NYcTQ5ulqm3GC4hth8j5gqSUnbuJB4HBNOLZoedMkQJkPULUmGy+h1G8BQxkdyD3qtW3UdxvDN9hzmHWI7NnUtiO4kgJ2qBTjPkAEp9K1RpjWbarmxBUsxJKpKHVx2XvpdV4oCs/+2QPsKw/V1GMtoeDtNnohRRRXrjiBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFecHxhQX+jfxO6H6uRWQLe6UNTiOfqQdigfuhWR/u16P14N9R9S3m86pvUKZc5s6MLg8W47zynEj61AYSTgVnyx3NDsXyzqrXeoo+t/iC1Vcbe63NjgwhGkq5SpOwKxx2Faz+ILqHP6x9VLVY2/DcMDEda2kgNhf7RHOCABWioV8n2eO47ElS46t211xtSgAQMAd8ZHpUtYoWpLZIMuPAujCnUh4ykQ3DweywdpznNY/Dtk5G3yboqJtHrbqK7wtK6d0n8y2ixxg7NbQ219SlZ25UTXoL8NFlNn6CaCJJU8bUlaioY4Uoq/xrym1FfLvdpiGbw/IceipLKESklK0pJzgpIHfvW57D8Z3U7SNmh2qPe4xiRGUMNRpMJv8AUtpGEpzwTkUSxvaQ5W+D09X4dzY2A/qnB+NJ/s/dWm/i/uaIXQPUEYubHpK2WQlPmC4P4VydZfj+6kth0OM2GUlAzkxCn8uFd6rXVj4x9UdWdNfoO62mzxmS8h5bsRKw5hJyE4KiMZ9qVHHJNNi64NfPvBCSlJPPYirraprz8KK0VlqO02lJS33Ucdz+81qRepXWSlCmmlLxkHdgVtLpvqNvUDRbRZj/ALO2Ap1uTnCu34SK6s1VGGI0vy3mNUWRMZxpLwfWtKgOcBA/jVwvExr+T85b61OhTP1OL5IVg9qjHhYIXUuyGdClqiJalLVH3jcVnaAQfT86uKdL2bU14MSA7PQxMdU2uC1H8R1CQgn6Tu5Bxz6DJ8qztc2PirRUvhOZSvq1pxWVbEPOvEp7pAQcK/Liu72NVyrmt+LMwlhH0HGcyk47/b1riD4Tw5H6qxZcaKt9EZMpwtIBKtgyMADP7vOu0rlreRMY2w2ZLclvgOqhHDeDyknHn2xS9S+UadOuKJuBfn7jLatraw4htJc8dX7KOEhOP6Q5/KpqBIjadKIyuGEJW6ySrgBI3EH+HNa5tmuy7cL3HhwA85BDCFuuHwiHVthzG3GfpChnPerU5dmntPO/pZllEiQhLT45UrPcAJ9PMVzVJWbJw44KHduo8tqU4wHw41NdwlaRlQWo8Iz6en2rYL01dmClyFYacCUBWMpZIGNoHor+2tc6gfnpl6fTBsdklNOzSm7Jmbm1RYmOHW8HlecfnV3iazblhxmZGQUNnCW1d1IH4VknzNMk0LcZdEfdbzLsrStji4rdxlsMMoJALAKty8H3ApW63Fx+6Sn3iU25a8R0ufsqHCt3sRyKb3TUbeo2nEv2QXVFvUJDbcRYQ4/yAHBuUBgentSsPWStSxpcSbYWoCm1bVpddSrxE5+lSSn7c+mMVSw2uhmdXP2S1JhsrKW51waZjrP0lSUpKnAT5AADFaR09KTLs+pZksKMYXKdMCivl9QXwSrtxgDFbP1rq2HcL7bLJJ0fcJzTESVMcnWpRKGCgJKU4A5Wvy9gaaWpWndW25VkiWK6wojkgKdYcWG/EWrCjtTj9rjOcedOhKlQuWPg80NUun+WV3llXzCpMt9RHpknKfv6VANKRbfAyVFt8bt3m2nPn/Wqdv6f0XrS9l1nw0C4SglhXdADqwFE+3aoyHGSjxRLXsWpJW0oDlB/pHPrXVi6iYGnfA/jF2Dciw4pSTIAeS6TjIPYfnxn7Cu8fg01VKY6czLOyuJLZgqcf8J54b0rWVYAHc5IxWhNSWrRregdGv2rS1yeu6LW2JrxkpAK8crSDknnnFUK83aNb0Q/0cgM3BqL9ZBKHG1FSjtVj9rnnvS8mN5Fwyyddo7E6w6qut40/wDo26wmIios5Dg8FwKUjj8Jx34zWlppAwSBkkdqqHTifPnW+U7MluymytOEKdUsIUAcgZ9M1aJX61ougp2BewYUNxP2rgZ4tT2yZ9B9JxLHprXyR76H7pcEW5pHitPMrU7jyHb99GkEx9Fw49uYK/DaWoq8QYWVnkq+/lTy2xJDEpyYglaC3ltnOAoA8kH1pe4NwL2grc8ZElQBUsDC2z/jSYzajsXRpyRg5qXyWaFc3pr7TDsWJ8glORKLh8Uq8himnVe0Iu/TG9x5BIEdpL4x3SUq8seoOKgoFvu1plIchmNcl4Gz5le0KI/ZI9Pf1qua76wvyYs6xSbLJs7khspeDyucex8xkd66GhwSy5U4flHO9Q1ePFhlGT+DbHwpuzOp1hYslucRG1NZWUttSiopc+VJ4A55xnGK1/rLrl1FtlxmW2cG5K4Up2MpCnF/zaFYSTg8nIJpn8L/AFBkaD6kQ7oFEtNJQl1J7lBP1J/dUF1iuYmayuq46PBkuTnnFNK4UGlK3J/eDmteqxwhqXGK4/B5yDnLDGfxRNWD4j9Xxr3cn2GIGTDW+XFqcG8I245B8s4rZGvNa3XqN8MGk77dWGIrz1wdZUhkqUFfURkFRJrQ+htPvz/5U+C0zMYj6emuIW65go+pr6h688VvFMB2T8GWh/HDSVJlPOFXKe7p8vasWVRi1Q3Am7X5Hcfr3q7SvQ5d5jPx1IiXAWlLTgUpOxKRhaee/wDlVBPXvqtqeK6+5cn40N9tTrTsGIEoACeBk5yT3rK0zEQ9Mx7FMlx3tPuTlzHWnU/iV2ByfIUiiTLhyCqLJW2oK2NOg4aU0PwkJ9ccYprzKDNOP02U17mUcdQNR6iusVVxvtxltPrShtDsg/WocEHGPWmk2wXVu4JRKttybQtzxVrdaWTuB7AnPFWXUT6oPUTTFtkhhUOOthxlxCQn63F7lBXHl/jTrR+pNV6t6twtPWq8z0/OXJbS9rylJbbSsqWQD5BIPFbMcozjdHD1GN4sjhfRbuh/QCf1B1Uq+T1uW3T0SclzehOHJCkLBCUZ7J9VGrT8Ybka2z0zNPwn4d4jMoXcLmw+pIaQtX6oJSTgKUocqHkK6utsCPBiBiK0hphvhCEjAPOT++tC/EPpUz1KR4iGod9Y/RkiSoZ8BwOBxpePTun862YXGM1Zkm5NUmbS6B3Ru6dFNFT2Wy2XrchTpKtyi5khaifVStx5rW/xa9V5mi2dJ2jTshLWrJcwSUOtpBW20k7Qk+oWo9j6VU/h21iq2aaa0k5eSw9blONwWlABbze85PoSFE8elObX0Wvr/wAQadZ64ukS+WqIULhuR0lO5QB8NsoPCAgnJ55NW9rySchTTjFUbH6szNR6Ittt1hIu0luYtDLcpQfVsjyCnsEjgpzkc9qZdOviE1RddQzp79zRPiBsIQ059LZP7SggevbNbmmQ4mo7VKt8xKZMOa0ptxKkgjkHkZ7Ed8+tcxufDnq2yXTZp23z7gI73hJmKWEtrRuznv6V5zVwcU5QOpp3GTSkWrXGtRf7obqX5aXUOpkFyI8W0tkH+bAPlVP6h691Br1qAblMUx8lNXLaU2f13Kdu1R/o4x++tqag6XXW2aRdmT3bdCKUKdVbnHcuKQPxYxwTWiJilOo3owpSld/asWkc0ryHqNLgwNbkuUQ0lCUh5Sk/qSDu28cVry22yI/OkESQtG8LKT+LhWR+VbGuCSbdKa43uJIB9K1RFsN3tFyekLLSIwbUtTil/hSBnOK6EZVZfV4pTpRQ7vpjm9zH+QHh9RH3FPYNqaTHDjCz4hH0nI4qGv7YdhMzG1hYcQCoo43IPng0lpe8B1ooW5y3kZHmB501S44ONkh45VIevJj26Q62tKPEySVK8zUHKuIAUHBw4ckAcfemM25m4TJlwe+lsLKW058hUOq4F51RU5lbnl5AeVa4W1ZiltNz9OLkwiEwyoKWkulpYScfSfSulNLJa/kxcrRMnLYtqHETi2lO/wAbCgC3jy38AmuHNL6qXafFQsqVs+pIJ7+tbpHXSCGIEeE07KnSoZi+E1+yvdwok8DHBzWPUQlI0YZRT5O2mr5aNW6xujkJpTTwtTsNxTqSkttjGMDttJzg+1Uub8MihqmI+i8uSYKHmpDYeZSFkAADaoeQ5PPc4pHo3d03XUdwmXW8Wp6fLt/hqZgyArwwGwlLec/URzk+qq3hopN1n6asf6YioizGXFMOBODlAV+rIIPmmufUXxLsrki4u10blooor1xwQooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACuN7r8DHSe53STPNpuMd519Tq0tTVfUoqyT+/yrsitC6b6y6V1nKW1a71GcnBSx8upxIc+gnJCe5xjnFYtS5LbQ7GrTPLnVGgw/1Gj6OtqlJiS78tAJOVJSpwNjI9k5r1psloi6ctUS17WVmFHRGDimQnxEoAAPoDx2rzx6Tlu5fETDuz4ZMZi7KfkOrRk7StRCh+eK9EHbpAulwREM9kyCQ+mOFp8TGR9RT3xzWbUSfCs0wXB5j/ABf3GPd/iY1ehpbSPBkMxUKSjaE7UJzn3ya3BqD4J9W661CZTs3TZYehMOouLiXfFcykAIUkHAIHn2rnrqnPGtPiT1TO8RstzdTFtC8ZBSlxKOB9hXqyi5QNNtlp6S2ywEg5WoAp4AwB328VXNkeNRJjHcrOBdQ/AHq232PUExm42tyRaU+LFZihxKpKQMqP1cE+Va4d1vE1b0ogWKfYILeoLTMBVcWIiUOOsBJGxxQ/EoKx+6vUtbyZxakJIR4RKkIVyVj0NcDdTekaEdZtU2azNoSLnKAaSTsQ244AQCfLCqbpJ+We1icylCFo55btcFstlURso3DnHJ55ArrvSlm0VZ7AqVA0RJhhra2H1KJLqsD6cjvk1reV8G3VqDKSEWiA68hQU2kT0fWR9/Kr1E0R8Q1lekuq0db5jTgCCwLmgNpyOSnng1qzzUq2sTgVJ7iO0jYdOa66/wDybtqdRHj6aceehvEpLMhT4A2nz+lOc09itsaB6yTVNPONw4sWW4wqKkuK5jqAVjzANQcnp316/ltJ1U70/daMiKzEXHjTm8BDaiofVnPP9lP2bV1ZkayuGqdR6JlaUt8K1Tnlzi424hsCMtKQQCSc8DHvWSLafLNbca4Kd8J+u7Z071em+XcvIiuQnmfEjtFagpas/hHma7GsvxE6MmIdVa13GYnPiutIguEoUr9pXHY1yZ8Gl809py9TV6ikKTHfgIaZwyF4WVZKuex96tN8+K7qTrnXtw030atduat1tJblXZyKgbgkkFaycBA9ByTTNQ05UGF2nRvmf1S6bWy43S5y5y4M25lCpnzMNxouFKdqSNwxkJGPen1t6t9MnLozcTrK2Oy2WVNNxnHezZwckY5Nc8TPib6ldObnZY3V6yWfUWmpeESJLMZKltgq4cGMg4BHHpW70QOjl5khRXphEJ5IeQhxHhLUvv6fhwayRgqsZKTTpl4j9RNA6jmR5MfUVlcVHSVIS4+kKJPH1D04OBUgb/pDUCUKYulpWG14P69AKj/RPNahuvTrpfO1XbYcS2aYfscpp0zZrVwShcZxOC2lIzkhR4PpUjO+HjplcXWvk4MAoUcOrj3EfqvRQwrz7VNJlN1dG022tO311YiPQFraCUqLTiMjnlGQfypd/T1nuCUphR4wdRkEtlP0jPKTz3rUk34TtHIlpVDhTm/F2hQYnH9WP6eQeaxuXwnWWJ4KoUvULBUQlYZmKwM/td6hwDfI2r/I61OOuGFDR4oQErLRJwnP1JVg9/Sk3+ntnQtpcSGptaSVOL3KBCR3J9xWj1dF7VaeoDmkoupdXR7oYKJ5dQVhlaVq2nLnYkYyR3qWvHQa7WOK+qL1C1C2FtOrUNxIJCFHKvY4NVXHY23XJ5eXh1L9zuinFlYTMkFrxDgr/XLwkj3FRypHiRnHn1BTqUnakjAUO2PyrBckXVkyVHalIKlHHJBUefvTaQ8mYpclYLaU43ISfPsCPvXXS9hi3e47otWg5ur39M6a0jYrlcZf6Ojmbc1JUIcRXghZDroSUoyAcA8ngAHNanb6GXjrjbLtcNN6g0xZJNrmrguG/wB2TEUpxIG4pGw7k4Pf2NbG+GDUcy8/E9o7+S+v5l50y9CeRcrWytxhCXUw1hIeaBCVEEcEg9q050L6Is9QfiEuJ1x4P8lNMOXDU9yS79CFxIzmQhR9FOLbB/q7qqnSRFtyaQy1/pbVvwpLtWndWyrRMenwlXBh6zSzIbU2VEAlRSnGcZ9x51a3ejXVRrQy9Y+BZggWw3waeXc0fpf9H43fM/Ld9m36s5zjyzWv2+o3V/qbeesutNLW/wCcYvVjlN31paUFMC0bFjajeobQhsEDZnscCuu7hpy7QfjMuHxArWmV0Xd0SqU1fi438sGTHCRFAKs7ioHCcd1470rwY8jbZ0Xr9RihGCdJGj9FdMuq2vNEW7VMSPbI0e5wnp9lsEq4oZvFzjtcqdjRlDLiMcg5GQUkZCkk69tnUW765vlrsWnre5I1Rc5CYTEEfSVuk42qzwOe+e2DXSkbpzetdfEZ8OPWbSDCG+ktl0Zb0TbqJaAzb0Rg/wCNHc+rO5IUEkeoIPauZvhK1zYdJ/GJYL9OujVvs8mdcY7cpa8tsqkNPNtLJPYBTiDnyqstJi4pFYa/PT5NxSfh56hNsXVix9Q9D6r1vZ2HJVx0bZ7ql2ew23jcEjupQJSCCEgFQGckZpjfSvUfUfQOmNT3/qB010pb9Qx1S7cxqbUPyExTaXFNlQSpvsFJPYkUjpX4I+qOk+rOqdRayukzplpG2CfPk69jTUIUttQXsDJQsKUp0rA2+YKhySAdlW3pxedZ/DZ0HetPw+Q+scdiwykKnzbo5EVCzNdIb2odQDkfVnBp8cUISuKoyz1GTItsnZqTQPQfVVz1NqdpjqJoZjS+nmmHLprNi8JftbRdz4baHABuc4OU8AY754p31K6A6t/lDpp5/qT09bsV3gSHbVrWXfgxbJyGnAhbPi7SA8kkfTyMA4JKVAbB6adPup2kE9VYln6VacWxMXCduPRm4rMhxcYtlLcph5ThOAoLJ5JBVxjiqJ8afSe1aS6GdLrq3Ybn0zv85+Sh/pu/d3JkSIgFZVKZbUtXh7lYyR38QZwQau4xk9z7KrLkS8afA8n/AA+a06IWW7ydQ9SOmh/SGnn3YttjaiPzs+O5ghUdpTaS7uLRCccEjGauFm1sq89BLDo2ayEqhvuPKloXx9RyEp9sVVfjCsoX1I6LeKg7Wun1uBwOx8aRTW3XFEomE062hTaMhtR5xXN1EIt0js6CLcXJ9ikmym8NOQytKIy8JStXGE+37qsOkL1FEo6ckuNyfCAKHvMCoWPY23kyFTbiiMU4LTTSt4dPpnPFMYGn1aeaLkdW91SiouEZIye2fQdqzNR6Z18ayJ2dAaUj2a0XOFJuNig6oiMqCks3BAK2zkEFCvIg1dumeoOnupNXX1Gn+myNI6ltqfEdnhYVkOK2q2gevPPpXP8ApjXkhDiWpe5JH0njgEelbw0Xq6NHkB19xIS4hKFOJSMkA55Pc03HLxvk5WqxeW3Fcm/Y7SURwtRAbbSVqKuwxWnNaX2BqmzBbUG4zWUlSV7Le4oOBWfqQcfs981taPqK3RbQq5yZrEe2st7nZbjgS22nHck/2Vrm+6tvlt0/ZLzpGHJvkeQoFDkFtTqVNKH4sAdiO1alJuakujjqNQcZLk5t0JoyPq2yonsrd+aizHGkLKSlSVBXKvUE4rfXSyRctQWG+qnKduItWYzcdhoqdf43Z91ccVB/DppC66l0jqJ63R1JubVzUGzMbUW8kZUlWOx5rojTWlXtMWVyOuIHH0gvokMIKUKUofUCP6vqaz55SU+H2PxqLhUjVlh68aUjW4R3Xri5c0/R+ikW55Uor/obQnvnA74pi+3rhi6fpq4yBaY98e8U2Rx4JditpRtRnJA3EDKsdjWl53wy9YmLvcLpY9bR2FPyFupDU91CiFKJxkjyqF1R0+15BTGg9S703PVFAkNzBI8dxtgntnjgnvW7UYoTwKnyZcM9uXo6T6lxbSNKW6bJltOrRGx4TLwcWh5XcEA5xWg35rAABITn18qhRHs1hiRWoMFuNNZjBMqW28tS5RJylRBOAcHsKgXr0ouK3/hBP51xtqSo9tpI7IX+SwXh5KWDtWnB7GqNfrq47c27VFiuKjLZIky1jA3d8DNKXG8qWAcfQDjBPYVD33Vu5opZjKdWlO1K1nAB9ao1b4OjaUGxjqG7tQvH3AeGlPhoRjhPFUSy3NUSVJKTwpo49qTva5DOWn1KKlq8RRJ8zxUXEWpkOLWcp2bTmujjgttnjdblcsrJOXMKbKj6spUvAJ7+9REaUS6hZHCTiiW+XoTCAPoDhOabDal8IOSkDPFa4KlRzN5MPzEtBDwyDuKT9qfQLmkeCpG5DhJSFjjGah4jSZb7iSdyUJ/D6mpmAEvssrUkNqbG0Y4peRDIu3Z278N2hYjlytDKozE9+THfXJfScpYwgkAf1vwn8yPKus4lyT05iQYKpC5kycpopZfWD4Kfw8D8+a5L+BWNfm73bZlwZccs9yD6Ybm3kbMZUfUEnH5V07r3SqJ/VfTl+dnyGFWw7UREoBaeK+Du+w/ia4uVpR3Ls6MIOclCXVWdA0UUV6k88FFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAV5V9UulzmkL81qXple27PMecdRcLN8yX3ozilK3utOK/pdlJFeqleTGo/FRqS6kEgfNu8Dy+s1r0+iWsbuVbTn6zX/QxXF7v6K/0m0zdrdc5i77DnvFwKy1EkBh1wYPZzP0nJ711I7fI2l7Y4+w2xLP6F+UjSI+Hb3HWE5IXIPDmOPua5xQ5II4Woe2e9OmJLwBA3DzyD2rTm9CjlknvMeL9ReNNbLNG6QsGof5W29y4Wy8spVKD65DEcKfSdxV4gBG0r8+fOvReVHRdFJ1dLhxhHb06GWr0kh2/+IcfSpj8Ge5wPOuZG5stOCHnU4/rGnTVwloxtkOjnd9KiOf31TP6H5EkpdE4f1BGN7oHVqXV2+4sXWS2HnY2nVbNROkKuAUSnKFRh9Cl4ye3etaazZZHU+NcmPGeQGoMxxS07VvKyMqUP2VdsitTx7pNQ4QiS6XAdx3OHj3zninC7lcHM5eWoeZKycj0rNh9ElinamaM3rmPLFLYegb6o8lfi+O0cHegeKn6SRSCZbE4Ot+O0W+ULClp5P2rgU3m4pI/2t8ccjxSK+OXiejbvkuA+oeVk/xq79Ek39yM69dxdbTvqTKbbQ2w0tvxFY8NQWMADzPPetM/GRo9u69AdTTE3efaBbGvngmG6oNyVbgPBdSPxIVn8q5oN7nBSVfMvI9MPq/zrKXqy5SYymJM+VJYWNpZcfUtKvyOQfzqv+Emne4YvW8TVKLNc9JGJBgz3Itldu7LLYK/Df8ABUydpIUD9x2qyaMiyun+m7Xp+HaXL1ci83NkQI6ilVyuMnctCHFJOS2035A81Ks3xcTchC/BKhhaUJAHtnA5p3D1bIjvJdZlLZeRgpdQkBYIGAc49OPtTdR6PPOuJDNP67jw9wYh1UkP606D6lus5u2xb5Z5SUy7fbHFqba7hOEqyU+hAyOK1vpa7WqK/Cg6wnXG2R7gw09b53hpcb5T9bauMjGOPvWz16pfU08grSsP/wA6AlP14ORu459efOhu+y3kNpU204EnKQppBA+2RxSMPomTGtrkic3r+LLJPa0MVdO7RfXGW7XqF9wf0vlcI8PyXuB8vSnL/SNyFICI+pGFuLOWwWFAqHme9S8TWN0jIdSHfCT4ZACUpA/gKyRrS5LSFKUFk+qEn93FVfpeRcWi/wDmMLV0yCd6c3u3yw0xqKEp17CGgHXEhSj5cdjjmrFB0n1Esqm9l6QreCMt3BYz5YFJK1tcI31eEhPOQQ2CM00e6pzWwtO8DHl4YHPrUr0rI/lEf5rFH4ZYJE7qnapLjKbxPUtaQlst3M7cE/hH+VKXTWfV202a5GXc7ktr5GQVF9xtxIAbVn1zxmqivq1OCkLLiN3YHwx/3FN5vV24LU62opdQApspUAQpJGCCPcHFH+Hyp9ln61ha5Rw3BVLvkuNB05BlXeV4Qc+WgR1vuYGNyilIJxz/ABptarnI1Ld2YNht0u4uqSSmHCYU85gfjOxIJ/yrrz4YNdt6K+J/U2p2bcwWbHoq73ERY7aWg74LaHNmQPPbjPvW7/h/6SWbon8VmsOpKG0SdNa4nwm9GupCNrqbmgynltEYwlvC0YA/CU1SePxtwNmPIsqU10cJsNX2HriBqPSujL5crQkfKym41teeacCfpcTlKSCQcn1ChW2eqVxZvuko0K2aM1BF1I2hLiojVneU6+1uwFuJCQQnPGe2citnMaojab+CjST8/rHfOjSHNbXltN0sdtfmuS/9okHwVJZdbIT+1kk8p7Uw+GbXLV41T12mjrpqLVtug9O3duu5tsktS7YAvcVtMLeU4otkqUAFjJ7Y71m8SdDvI10cmXXTmrJLbbUvRV+Yckq8FpJs0hsvL2lRSkFPJ2pUcd8JJ8qjH9Ca+TbRa16S1h+hUOl8w1W+WIyVY5X4e3aDjzxW3OoXVx+Jp6FcdLfFLrPqTeIMv5hmJNtk22/KnwnEF5DrkhY3bVqRgDOHFfY2zr/196m274OugF5i6+1FGuV6auaLnLbuTqXZgEp1KQ6rOVYSABnPFM8aXKLRztumrOYpundUQ2HrFFtWpWITkdNxlWtDEgNrZBITIW1jBSOcLIx35qNtbDM6yT5zNulSokJKfmZDEdTjcfcSEFagMIzggZxnHFent/6kv9JOsV71kIjdyXZ+g9qlORXxuQ8n58haSMjuknz71rSX0YsWkehnXnVWklJldLeoo0xc7MsLJ8FKpzyZURfmFNKcA/3VJ5znF00geT3uVHGdo0d1M1hpNq4QtP6q1Foy3H9QS0+/GZCjj9UnkYJ80CrNprTunNQ2tp1hp9NzSvwHbahKvF8TOAkIHOSeMetdHdYuruqNL/F/dtIPdWrn0S0rpb5SPpi2W61yJ8Se2nZ4YVHaUkLC+6irO4HHNaf+Kyz3/pd8W+ozLvNvavL6411VOsMNy3sNOKSCFNtqdcUggpCs7yc81SUPKqROPL4+xhH0bqGz3NuRatJayts5k/q5sKBKZdT9lpSCKaT9HuamuTEqXb9QSL9cJDjHzdwiSJC5SmyUuDJBUpaNpBAPG0g4xW909aOqLPwCX2/r17qI6kY1wISLqbi6ZIY8Ns+GHM52nJOM+dbS+Gq93O4aD+E26Tpb0+5P3XVMmTJkrK1vOl6WpS1qPJJJJJ781n8XxbH/AFDrdtRwXb7z+jNZOWSDYJlzujLxZ+SLLiXllPJR4YG9ORngcjmujnOrcrUvRr9DWvpHIsd7iyFtSU2i1yHVgjslxxSSvcRjIUfSt1aa6eWex/F1e/iNaaR/I+VZItwtWQpObzcHjB8NQ8zuS+oj9nxGzjzo6taiY090/wCrUmd1YvPR5pXVBTab7ZID0150mIo/LlDTiFBKsbs5xlA45q0sMZKmUWpmnwWj4R7rY7/05semtX6GbauqEuJIvNsKHXE7yQfrSCRzjNW/q98I8SbFduvT9hu2zmxvctDij8tIPqgn8CvQdq5g6R9RGla+tz9v6uX7rMkRyk3G+RJEJcUk8oQl1xwn1yDiuxInV+4Ijs+CwsbAPxOkk8eeRSZaLJN3jXAteqw08vfPk4z1ba7rpiR+jtRWOTY5QJ2CQ3hKj7L7GpHR17LWI75AQMFOOR9811LqzWh1raZNsvUJE6DIH1MvtJWUcYBQcZBHfNctap0RI0FOH4n7S4rLMkj8HolfoffzqktFmirnHg2YvWMOaVKXJZtV6fha902/aZy3FQ3TvAacKdix2VjOD9q6N+FabpzROjoel4FwlFyMgJzcHQpxxRJKseWM9h6VyzbZqmRuaXvRgfSTU6xPWHUvx3FMPIIO5CsGsbnKHC6Ou8MM647OkvhLhzNP6f1mzdYrttWvUUl5tuUNhUgnhQz3FbJ1bqxEiO5ChKLm/wClbw7Y9BXN+netlyYbRGuikyWxhAkEZWAPWrnE1+1cE5ZDb6Mf8nwcmteJRyS4OHqcU9OrkuC2xUbNjbWck7Ugdyc1slrTtvdtTUWbb4sxJbw6HmEr3A+R3A5rnnUt4v1yjwk2G5/ydksTGpDsn5YPl1tCsloA/h3dia2031mt5AK7ZMSSRnbg/kK0ZNPmbSSOfDVYflnPPxW27QcfxGbPaXbbqaGsNmTCZ8OOtOPwrAIHb2rlSQ045lak7EnkYrp7rZ02Rry8TLtYLvJts+U8p55NxbU40kkY2oSnGBj71p7VHSu7aNsCH5MyPc20r2rUw0pPhj3z5VglpM6jKU/g9JpPU9OpRx45M149F3oTxwe9J3SI2WilCE78A5I7VM2xpL7jniJ4A4zTW+oSmQ0hvGCkg1ytz3Hs0k4OzUmrslxAIBUc81V35md6E55/FxVy1bEWNzpTkN5Na/UvdhZPB7129PzE8Rro1lHbZLsZbeeE8imzrhQcgnOOazae8PCknvwRSEgDlXcGtiOXXJO2chuItfYqGEmrfobSknVt7hWmIvL810MpBHY9yf3A1TrVvcZhtNNl11asJQElRUc4xgd67q+C/pa9o+4Xu6axtqIXzUHZBkySnxWiVYUAkfhJHn6UnLCTj7SYzhGScmdEdDtGoszOn5sZttUJqI3GiJTlKWGkjGMeqjlR962hqO5RYV+j+NAM3esEuEDDfbnmtUdMuoFxh3OJartZEwoDSEhq4tyEqRkqXlKk9xhKUc+qqumuLzFus6Gm2zmHnW32llAc2hQCh9JPn3Nef+nzxg7XJ1nnw5Mq93FG9KKKK9aeeCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK8mdSSgnUV1ST2lu/wB816zV5BaplJGpLuDwRMe/vmu/6T3P+P7PL+udY/5/oX+aSpQAJpduUEkAVX2pIzkZpyiVzxzXo6PKFhZmqI+o05RLAxjtUAiUEpIJGcetLIlgDBVjiltfAKrJu3yA5JkunzwAKfqmobSrjdVeYkJbS2onAOfzrJ6claCQaQlTNb6HMu4bnMpyKbfOKcWN2Vnyz5Uyde4GO5rESBt96ZTM9Jj9b/Oc5pWE+TLYA4+sZzzxUV80AoJPOfSom667tGl5G6ZJSFoST4aDlWaVklGCuTH4ccsktsEWOU8DLe28/VzWCXeSApOceZFaG1L1juN7Utu1Mrixzn9Z3Wqq0dS3JhW8y5G/PIUo1zMvqOPG6grO9j9GyzW6To6e8f0OfUilUyScDke9c42bq3dbapPiKMhJPKD6VtLTfU21XxtCFu+A+r9hytGLWY8qtujFm9MzYnSVo2VBlmR4wIyEsqOfypBFxUlA28HFN7bKQtiWtpQUkMHlJ4qPekZzwRxnimRUZdGRx8S2yRJyLq7jG8ioWU+VlRUrco0m9L3YPOe2POmL7+HFDaoU1RVkP9hVThBSTyNw4/Ok7ivEt4Yx9ZApu2+px9tIBGVj+2sLk8r5x9JB4cPNHUiyuivqTfNOXS73HT8lEOTdbXKs0pTjKXN8aQjY6kZ7EjzHIr7b+oPVm3Wzp3bUakbch6Bd8ewIdiNr+XUEKQncSPrCUKKQFZwMDyqScfUcAppIvH07VlyabHNttG7Hq8sFSZIaW6kdYdF6Jj6ctsuyS7CzJfuKI1yskWWEvPOKW4oFxBOSVq+wOKk4HUfq9adRTdQ2+Tp+FcJ9rFolNM2CIhh6MFlzapoN7SSpRySMkYHasmZjibWDnCfDxgU+iznD4avqOD29axfSY0zR9dmk1TKN1f1N1F13oBVlvzWnm4b8trK7bY4sJwEZ/bbQk455Ga1LrK6ak1BovT+gLzcGZFi0oHhaozTKELb8VSnFlS+6hlR7mty9Qp7t4Wxb0r2pbV4iueM9hWvpukod51Cn5jLraWAgLSrHiYPnXJzThjlt+D6ZovSMktAtVNe5/BCam+IPqTrGXdHbleYbxuemmtIyCmE0gKtzbviJbGBwoK53d/eoWydW9faa6O3npRBvSRom6SRJegraQtQc3IV+rcI3I+pCThOOcnzqzXfpvF8NaISlxgSD/SFVi9QLjZmCmRFbcTna2801wn3PvVoZMGTiPZycmjz4m3Po2tb/AIvOs1k0/Ati2NP3y52ttpELUVxs7MmfGbQBtSHFA7iMdyCR5EVTp2qNRdctanUmspyLlqdTUeMJKmEtpWEEJbS4EgDk9z3NV3TOnL7qAT5FlYce+RiqfkuuK2pQkd8ZPJ9qf6BfajaqiR3ZTMdhx9syJrm7awAoEuEe2K0QxJcmLK0lwrOm9aaG1QvphP0dGlR0aXXcU3aRbkMIKlPhKQSleN2BtHGfKltDW7qbY9BaSnaevkWHZNIvTV2ZL0BpzY5IKy8CojKifEVwe3l2raPTqQrqDeLkm37EQIW4ouMhW1mUPJSM471rRxufK1NPsel5j0+JvXJdt6FkIbWk/UUjzrDrIxXvxPkX6dLLJvFmjwvkpsZXVMaHsmjxqJCNP2e9C/xIxioyJQcW4CpWMqQFuKOw8duOBVia111qtQvXg3KyXFm83JV2mNT7JFkIVJKQkrCVoITwMce9OBeXneNpS6DgoUOx8xTy3X5YdCHUEJBwVe58q8+8+ZM9nj0mmmuif0JK1LrG8wpuqU2tiXDQpDQtdsZhJIPJyGkpB/Ot0wpLbLISCFAJAzWn2Zfy60rZcUCBwocYq0WvU6ZKEIeOxQHceddfReoUtuXg816t6DkyS8ml5/Y2CiYkqIWoH2rOZCh3mG7FlNJkR3k7FNr5B/7+tU1u8IdGAs59adsXdLYSPH2/eut9XgnxZ5f/AA2vx87Gax11od3p7L+ZhOOS7K4rCSR9UdR/ZV7e9MYUxLqUrbXhXnW43JUe4MLYecQ+w4nYtpQyCPQ1qbUfT24afuiF2Nszob6gkRwrLjPt9q5Gpw4pLdGR6j07UarE1jywY6ZnB1KgobV4xgUtHuciCpLrEhcdwH9k4zSbGlbg0jM2RGir/wCaC97g+4FKqtsVpCS/LcJPGW0Af21xK2P2s9vCDyr3xtF3071Y+W8OPd296CcB9ruD7itjwLpFu8USIshMhvcMlJH01zw+3ZhHVibMacH/ADjIUn+BrO1ajTYX0vwL02cfUplaSAfXiunp9dki6m7R5/1D0LHmW/DHazoku5Ks+R7mmN0t0e9wn4MoJLL7S21A+44rVT3xCaSaSpD94DcpKCtwKQdicd+arZ+KTSSpKEJuiFDPC0ngivRSnGUeeE0eAhp8uPK9nLizX79uXbJr0ZQJdjrUg55zg1ldkRZcRCkMhuQeMnyqrau6w2FrUlwlszEKQ86paMKzkH/v/GoVzqjbpzCnG3wB9+1eEy4pb20j7TptRCWKKm+aHOoLUh6M6j6ckYJNaZvVoXbJJQUgtbjhQ8qv73Uu1fUVvJV5d81Ey+oGnJDZS+G1hR8/KtOF5MfwYtZiw5uVJFIVH2qAS4FBXJ9qsSen12f025eW0JeiI3b0skKUkJ7qI7gcjnFLR7/pOc74SkICifoWDtxW8ejctpp2Q7GQh2alrw32hgofZV+1j17/ALq3eXnlHBlo2rcJWXr4S/h1d08uHrfUrIRLDebXbnkDKNw4eWPXB4H511lGIcLyiEK/WE5KRk5qoxNRMPRGVtNKWnw0pTtPYYHl5eX7q+R9TsMSpafl3F/UMjnjivQY0lBOJ4nO3ve8uoLe8AhoAjkBI5pWL4aZkUhto4eT2SM9xVITqFTr6VNwXSMEYANPoV1eduMQC3vo/Xt5JBwORUtSbFx5qjsOiiiued0KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArxw1M7jVV4zz/tj3f/AHzXsfXjHqh3dqq8DBH+2Pf3zXofSO5/x/Z5f1z7cf8AP9HxCgV8HinAVg8ZqKQ4RwM+9OBJ2oGTj3zXonweWSbJMHclO7ml0OhByog1EIeG0KLiT+dJPTGgkgLyfaq/BaMW2WBiTuUQVhYHYelLhaQMY59Kr9oWhxPKgkn1qVkSENqbSySFHzxms6kqNcoXwhRxxIX3Ax5ZpNLqTkBQz7mm6Ii3CVrB2k5z51TuoV9VZYhiR1YmPD80CoyZ4Yo22Xw6PJnybIoa9QupP6KV8nbVpW/jC3E+Vapbfcucha31lxxR3FSuea+yob7IQ46Tlf8AS7mn+m7YidJeStWFBBUketeR1Oqed8Pg99o9EtNHbXIlBlIt09KFgFpXfNbngaBtV5tzb7iQN43ZrSF0ZPjHPZGeTW8+nc5b2l4nP1AY+9cycqR6DTRUm4tWQF66HsqQpyCsoc8qotw0JfrC9tEZ1WzJC0c10CXX0IIWo4zxUlAe+Z+nw0qSSO45pKytHRl6fCS3I1P066ihvZabzujNrwjxSMHOeM1ti6W9yChLoUVMrwUuDkYphetFQpboeagoW8TnBAxmpa2MX11n5V5LTkQcBChyK3aXXTxTSbtHn9f6RDUY+F7kVya8zGe2tPiS3jPiAFIz6c96YvyUqIIBx7Cpa5WOVHkKQY6gkk4PfFMF2mb+HwSPcivaRzY5rcmfMsmDLhn45x5I4yw2sKwe9YPyC44pRBySSfenv6EmOKx4KlDtx618ask5J+tG3GfpUO9Vcldkxg9pFOvncSpJI9hWBcwBlOMVYU6WlyNhSUgnvkjFKf6vrhIc+l+OPXc4MUPLj/JKxZPwQaZbwYKATtKTgVLxZKylIOSnvkHtTn+RMuOlajNj4CcKweBWbGnpDTgSJjagMZA9KRLJjsbGGS1S5KFeIi4epSFOH5JbHi5V3K8kH+FZ6cYEhiTOUMNvu/qQRjCB2qb6hWeEwzCWt91chQWy6nOUhs4OQfXIqJYu0f5dDLZ/CkJCB5DyryWvcd/tPsXpHqGSehWPM+eh+uIHUL/V5A7k0g5b2ZshLPhpCHMJ2n8Oe1O25IdQcEE4ycdsUgoBJUvnfkFPHFcWPtfB2U1kj+Uap6k6MkaYf+Yafc/Rzqi2otrICF+Wcd0+5q+fCl06Z6i6ouQUp3wYcFSVoQgfrCvjbk+dO+oTbcvQ0pSkeIVJDQQlPJWT9IA8yTW7PgT0beNGRrpc7pAct8OUppsGQ3scUAclQB8hXo9NlcsW1ng/UoLBlfNIh+v0fU1i1BZ7JflMQmYdub+TiQT4bbTR4AVt7q47mqDpfUtz0fcjPtbwjyC0psrUkKylXenPW/qi9rjqhfZ8lYSGXzFjpx+FtBwnj3qos3hDifxbia5eWE1N0dnS5sMsSi6LxZL+4JSkuku+Kd6lf1jU/PlLmMJiMLHhFfibOAN2O+a1vHknYpSFqCSnBx3qTtVwcZU4SUlsJyArzNY5Qv5NMGocXwX7TeqEuNqYe+spOz6u4Iq3QJLS1DasDjvmtNxbkXXErB8MjtjtVtsd4CVDerP5+dZ5QZvxalPizaqcFIIJ7cU3eKkgq3YPlmq9HvyktoIWRk+fIp6i/hxISlCHie5Twc1SvyjpQkn8DiRJeCxlRSP6pxWHzagAVFSieCdxpF67sk5WysAd096hJF33SlhAOwHiquUkaowhLnbyWF13KO+D3J8zURKlqKiOQkdqbfpNxxwgDKcdzTG+XH5KA9IAztTmqW2OtQVsSnSQ4SAsD15pt4iCtIJCQPQ+dU2Yxbf5I2u/6m6gxtHydQOvIs0J6C6+2tLbnhqckOI/mkbuxwrgEnGK+SunMhmOzaP9Ykc9R3rEdRx9NtwHVMPRhHMgIEoHb4haSSE4xnjNbY6XJJWcTJ6vgjKmroiNe2+Bb9VaYmXNKf0B+kYwuQOcGP4qfFzjk/Ru7c1001e7S3dHJGqb5pwQ7LrKMvSrLj9r+UNpMhYb+VQ0A4hpLOxK95IJSfQmtC9YehU7prqXUVs11rBMbSttRHcbv0S3qkCQFuFpaQ2FZCkOAgpz5g9iKfI+B+wytU6wstt11Kvc/SaYbdxYh6YddeQZSQtkNpDn1DaSSR+HHNdvHbx7cj5R4bU7HqHkwx4ZcrHJ0CiPGu+hbnp+DqK+Q9U3TTkG5LYWbPeVC0obbPiZQk5jzCypfBBGMmqfdrxaZfW3oO71ZdtF5vw51hJioj+AFqeWIyZfhDw1lB8MuHts4PmKjbF8Es+66uuFjlapYDluTd1Om325chw/Ii35SG9yTvUbgAU/slsjnPFb6n/DpcukNmlO3G9RJixqGHYw2iMtCsSY3jocVuwUqSDhSeefM0qW74Rpgsd8zNq2O465Vep0vqBqvQcvqD8lc2tISVsQFLaebCPBcLiB4YbWAoMhzsTn2qbt/VmN090v+nuoV1iSeq7el3/0+7p828XBazcmxGaUrYplbyWUqBASVBPB9a1HM+FPSkqNfBF6lqdvdt1KNJJhLsTgQ5cnHFoYR4m84QopGV4ITnzxXzTPwpWbXWsXtK6T6jR7zerTdBa9QtOWh1oRF71tqcZUo/r0BxBTn6Scg45qfd+CjWO+ZHS0vqPprTlr1vI0Y9CU9dNWsymWNPXWzwn/AAF2S3lS3BISUkeMHQrYB+s3+9c8dO2JxBuTSwm6tvOFSFqSrxgVkkKUng/ccHyqqdYPhsm9G7todtqau5jVkp+FDbuNtXAktutLaSpSmlE5bPjJwoHn6uOBmcv9siaU1BC0lo3XsXU2rBdmLLKtCYTkVaZDilIBYUrh1tKkgE8Ebk8YpGaMsi2pHQ0ebFpnvbuzsW1znJuk42pLYhTRQ2lN0hnuhYPKgPKpeFOYnJVJEtwsvJQpPIJ7duK571DfNU/D4vXVtvV6ZudttT0JhLzbJSmY1LQ7hwc8bS0oY5+4qwdPNTv6X1tYNPSJiZyNQWSLfGVJRtDQeCiG+Sc4Ce9TpJZNO9uTowep48Wqg54Vybub8LxAtDzi05yCpwjH5CnESbGfukJHjLcUp5v6fEWOQRXxiMHXkLc2qa38qRyQPyqbtkKNMuDCEtONkOpIcUnhWFDFehk1W5HhVllu2/J1XRRRXKPWhRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFeMGr7I8NVXkmUs5mPHGMftmvZ+vGTXOp4Fu1Td/EkoJ+ce+lPJ/Ga7Xpjacq/Y4Hqyi4wv8Af+iIbsSzj/aFhJ7jNOGdOtg/W8og98k1FnqHDKihDK8DzIFNnOoe1WExQoeWVV6KpyPLueNFoFjj/sqWkDsaVTamEJBJIUfMVUh1JWTzECOPXNfF6+kvHAbS3xwrbkVV45llnxIvMW3t7gEevcipiLAbSApSSoj9rnitYDVV6Rjw3kEHn6BnFZDU9wWFJkSlqSecA4pTwyptsvHURckkuzZN+vFvsFvU66Ulwg7EbuSfKtQSGEXy6uSJLm5bhzn+j7Co28XpVzkDhWxJOCVZqe0/C+aYae7lRxkV4rX57nsT4PpXpGkUIKclyxrrrTcNmAw9HWVqQNu30qhwHTEdWtJwtIwCK2l1Hiohw4qGxgukk5PoKoGnrIq6uuI2kkqHI8q5uOdRO7mxNzpCUa3C8SG2lZc8yBW39KwFW6Ewyg7W0DAHpSFg0jFscMOKCVvnkqI5FOXpvhDglI7D0q7e41YsLirRZPmELTsWoZJxUzaFNNISEgEjua1s7e/CcCSoEmrfp+cHmFLWraOwFJktptxqb4L3MnNwIIUNpUocHAqssarZakr8V5LYSeTTGVKWQW3Fbm1DgZqj6i0BL1ApbcO4/LBXOCD+7NSpLoblwShU0jdLGo7NdISmzcWi8eEJChuJqiag1fNtclcUQnmCngvOJJH5YqjWfpQ7Z5rcidMcC0EEKaUSM1uyOu0CwJQ5Gl3F0JG9SCMq/f2r0PpeeEJ7MnyfNf1NodTlw+bTrlGuFXq5zkIMdaVqSCVFLak59qxY1nGg4WqU7NWk4XHdbKOfZZqfvWrWFKbYtZds5RkOtOrBCv3Diq7FszeoG1LBQlAV/PucEq9h517tQxyVpHxbz5oypyZarVqGJeCyw06mDMdSClt5AcQv7HuKnLjpy7CMVfNMx1bTgNRgrJPbzqjRNLO2Vlueh8S3mTuSwpnA/wDezxV7tU+fMKXJchFsdUN5YKirikeLEn0aPrMzVORr65ac13AWHGv1474SUEEf7tPP03dbe0n9JWF52RgABqOvH3JFXx28CMyXVvsoQFEB5YIB/fTJi6uTZjCVXfwoqskvMFKkAe4zmqzx4/wTi1We+JGqdY6pS01+ttjreE5G4HaD+YrWzt5cluhbam29h42JwfzrcnVSYJTbkSLNm3BgZyQxtQr3B9K0YYb4lLShh5IzyCO1cPU4sbf2nu9DqNRHFbnwiwMaumwwUtqaVu4OU84p83qqfLIbUhoJI/Ft5qGhWEk+I8HdxH0j/Oplq1BQ+pzw9qe+Of3UrF6dinzkRXN6/rMP/HimyatGsZNlkx5TEVmTIjPIkNJkjcjxEnIymulrZ11vPUHTMOQmLGgSxc24rrLfG9C+Dx5Z8q5JBCFYSvercEpynBNdB9MdH3bTGh03O4wRsuE9tba1ODcgJH08Cuh9Lhwr2I4U/UtXqpvyuyh9bejjlp6hT1W+bHdakAPELUcpUe4rXznTu8RXP5+ODnASFKyf4V2Nden8DXTUx1KEIlR2sKWonfv78+la41V02u+kd0pLyX4JCCHB9SASOQSay/TRndjl6hmwc/BqHTvSfWt2ZW7b24DjKTgqclBPPoM1Mu9GdcsNAyYKA2oZDjUhCh/bV1QHVx0/o5+Edw3LbYSQ5n154pzNvrjFtjplWvwXGgUlxTm1f5gcVMPSoS5K5P1RmgtqKRC6dP21p79NXGVaiW90cKi70uL8wTnIFRy7bd7Ssqa23GODnxIuScf7p5FWOVfzdMKcD7qkjAStWUj7VGuKcbf3sqW0ojgk810P8NppR93Zxo/q31DFkuPR8tmqioBrcouK4CFD6gfbFTqLzhQQSU47g8EHzqJkwTGkwJzbRalq/XNvBPOQR5dsUxuibncLjJlqcS66+ouL2JwQftXndX6HkjcsXKPoPpv62xZGoaj2suCb44hO4OEpPlimqrnuP4iM+eKrKUzmI5cdaKEA4KTyT74pNq9DaCU/VkcHivOZdFlx8SifR9J6/psy9s0y1qm7cKQtRPnk0znSjMhOx1LJCxg1Ft3ZHfPJ7jPallyEbQpCgR7fesDwtfB116hjlHvsjbXrW8aTtNmtjmjdO6pOnJcibYJl2aeUuA88QVkpQ4lLqQRuSlYO1WFDtim83qfq+52V0P6Ysi9ZvWJemF6xKXvnDb1I2FHh+J4XiFGUeJtztPkeamHVpyC2oKz+I9sViZKGxlRA4496csuWKowfSabK9xFdQeoPUHqnYNaWS+MWkW3VF3bvT7bDDoMR5CQCGCpxRShW1JUFbskDGKYau1vrnWF96gR3V22yy9euWx+RItyHm1sqhNhDIaPiHaFAfVu3ZPbbVutaBOlpSpKlNYOQkgKzjIqHmXOJbVPXSbGL6WGlJCkpyUKVwnny5xXQ9PyPLmUci4MOt0eCOJyg6aJW6dWupqJDz83TWl57F0hT7fLaDU1pLolIhIfKlIkpWFn9HtEEKHK1nzG3BPVfWlylqTqDRWmL3ampUG4QbS4mUiPAlw2i1HdSQ9vcG3haHFKCwMZHJptYeosRGl7mxqVXy9yjupcaxycq/APfIzVjZkiQw0tABQpIPFavVMc9JkWz7WK9LxaXVw9z9yNdrumuI1uvKWBBan3TVLWsHJqGVF1qe2tS0lsFW3ZuWTtKT2HNXGJ1h1nA1LIv2mtEaW01dbjdk3u9ux0SVouctPiEEpW6fCRlwqKGyMq5J8qkUoDrwT2z60PuJQsoAA/LvXDWoyRfJ3ZenYH2qNV3FrV920rpyzXFxmY9py6yrvbZ7ynFyGVPlpS2sqWUlrcyhQG3IOecHFbEg9YdXo1I5erLorSli1BLuBudwujDEhbkuX4LrKHMKdIQEeMXEoThIcAXjgCvj6SHFEJ7Dnil7c54DyFnz9aYs8+2Q/TsD5QxuGudf6i0unTOuLDZtdsJDaVz70ZnzboaW4pve4zIb3bfFWAe+DznFbJ02zf7rqCxv3PQ+n4Mq2wI9vt8+3Lmh1mM0SUIAckKSrAJGSkkjuc04uVt222FKa+lLp5UeME1tf8AlCi0WS0z2VJMlKAptt3G1zHcZ96y5tVNKkVj6diTLmuCi1KTKaYBivht1BabVuG4c+fIzmrXCenrnRlsNRHUEoSttS9ik8/iGf7Ki7Syi76YtV0ZaLRbK2iwF5ABOR+45r61IbcuUVa1x3HEvISpKHBnOR3ANen0l6nAmj5N6lt0eslH8nUdFFFJPSBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFeFGvrahWpb6sSW1K+efwCO36xVe69eFes7YUasvinIz6kme/8ASE8fziq7/pLqU/4/s8x659sP5/orHybCUHLoCjyTnANKtxIpGS+lPuVCnDdvWH/1NucWR5KTnFZi2LWd67YsAfiIBr0jyWeM2hCtUWe8htua0FZ/bWEj99WlrQEpuOotluW0rsI7qXCKr7aI7SQG7WVZODvCjVgtrl2Rhdus5QoD8bbRqN5VxCJpVtDzaJanInONroIz+6o3XUxmzLat0JTSgRucdSnCgPTNWRxOonrXLuEluOw1GQVrXKVtPHkB61pOZdXLjNekOqJKlkjB4ri+qajZj2x7Z6j0PRvPm8kukSK3ghJKcknjmtgaMlJ+XaZUfwjJrVaJSlFPfvVvsk5bJSlKvpUoCvB5uez6vpnTNk3OxG+T4Ty/qistkEHzJpW22aNbH1rab2pJ7VJ21JRb29xyVc96aXGSGsg8emPKs0WdmCv3CNxuGEqU6vYygZUongVqm/dSVybgYkD6GwrYVnkKqe1pb7lfEqixVFppeN7meCPaom0aLgWZKShn5iRnlSuea1xaS5FZPLJ1E+W+VMLza3nMoznkcmtsWSTuQyPwpxkjHeqfZ9NvPSUvyUYQOQPSrWlJaQCOB2zSpy3dHT0+GeOO6YXu9xrLGfnzHNjLYOM+f2qK0H1Aa1RNU6y2sMp5CVeeKZ6xsSNVWcwH1rQneF8edONM2KPpiM2hhIQED8XrU448cis+STl7eiQ0nqC9XzWk9uSwpMFJUEpXkAelbEtlwQ0sJAAO7aQeRVTsmpIttuaVOlJQvhfNTNwCEu/MRFhUdf1DHl96s1KPKfJVNSVSXZZdR6WhX22fMphMLLKC4vBKCrjHl3rUrUqXAQ20ZqmmGifDbaa+r7ZNba0RqLcVsKVwoFJHfg1UtZW9u03R5ktF1Dn1tqWM4Ne39G1vmXiyPk+H/rP0RaOS1mBe19i1uv8ACu0WPC+QU7J3pS64p4t5Tnk+lbA0xY4UtcxDVsMFtrdtffcCi4j7+VaWhswUrc+egOTmgoHa04Ubf3Vd9PapgR5XgqlvRGVpAUhQySnyTk+lennBpWj5djyrlSJrXWkdPutEzjPA4AUyo7Rx6CqjbLJoWNGkxIl4ehvvhKVF8HenB7gH71sFWsIyDlqXFnR0qwhp1YBFR79/htuqmLs8MJRyt7wkuHA9OKXTospV0zXN40rbGUtMxdUKkNrBworCQMeozVPd0yyyyt9mYZyknBUTwfethaqk2i5wHVxrV4MtYyh8ISgJHtiqpbITi0bYqWgHOFuOq7CqR08JctGmeuzRjtUiCVGWGQtKUKB4wDSC40pnw/HaQ0hRyVqPOKvbNhs0S3vrnyil0E7fAV9CvSmFmn2GA6mR+jVS5AV2lK3II9hTlgrow/UuTubKxGjtNLy42HBzjAzmui+jdla1boJDK5TjUiE8vwmSSUjzAINauuE2HMabchsiG6tWdoAwPtVk03ri7aKQS2UvJk8uDI5quXFKfRbDq44pcklYdRXe3arlyX3XEOIcIfbwdq9vAyKturnpN2sar3b35HiRnP8AaIKz9IyPJPmK19atfSvmHw6whCXVKypScq5881O23WUdS1LfBQ9ja48v8CyO2f7KQ9M07Zpjr4zi1ZVG7yku+KtKOD9KN2EDPesNgv8AOcbhtfNvNt+K8Er3bftUxetDwtSzG3GXVRFOkeKmMQpAyeTip1LTWgt8WKwgMqQElxP8456ZPlWpSio0jmOE5S3SfBRXYrrZacXHdYaHGHE4G6m0ctreWX0FsZIyB+L7VbrhOlS5rEpMtPgbv1bbqRjPmP307tkpxaZUK426PNS2CtLhVuUwe+9OKndxyivhuVpkDLvKrhAjMupQ66yktpdxgkeQI8uKZNbLevcHhvH4ht7UrcdGvTHkqRLQ06pzKHwcJKT5feml0jT9PzFw5QClKWkEkZCh5DPvRFXwx2T2tPtktZXrb+n4bl3CnrYVEPpQcKKcHBBHvioG7NQ4zq1ssB0E7UoX9XPrTm5WGVGb/SAShDSspUyg9sd+KYRWn5cNb6Yzm1OOCO/vWfLGC+7k3abLlarHwIzEQlRmz4JcdUSlSUJ27DjOfeoGbHlJbiqiqU2+tCi4ySMp9Kn58ZfhIUzGdacb/EHDxz5+1NXpr89xpA2thJ2KKUgqJ9q5nghlbSgenjrcmjhGTyNlNkTtQw3ErRhQA5Q4BjP5d6+L1NObU2mRGbK18FSCcD8qvtnTaVPSE3J19aEpUEqUgDYvBwOKrhu9jdbDT0JSwPpCQBu++ayz0UE6cT0Wn9YyTjcZkPK1q8jaNoWtHG1AwKF60F1TJiHehLiEhxsJBCseRqSlQbfDQ4XLcuKwtI8FW/e4SfWonaxICnYqTtGEncnBz7Vq0+lhj5UaFZ9bLK9sptlcuVpbnyA8GX2RkZIyocDHarjadeoskKJGWy/NCU4UtIwR6cUwYf8AlEuBTi0hXBCjTdq5oblgJaSRn8SuanWYY6pbZI6Gi1OTSvdilyy9Q9WxbiN7JcSvGdquDS7jzskJcUtSSKohlR3nHFpCkLTjC0nzp+qaWVJJmPt5AODzXDl6Uu4o6s/V8837plnU4VKG1ZUMc806iSC1jOSSfOqtH1GVLGE/M59E4JNT1tuTMl9LTkdbbvmFA4HnWV+mNy6I/wA7LCr3GxF6yckWNq2qbT24UTzU/b9TybtpwWBcdDqVK3tnblSP930qL0xrKPakjeIyvCTnYYoWo/Y1frT1HtsloPIdhqW2tPjMqYS2tCVemKlelxq5RMz/AFLmk+Jlp0NNv8aCLc64+zDSCk8fSR5EU8090tQxfI85c6UFGQlwpR9IUSoZJzTdPUezwUqQp9LYGO6SePao+N1igSNRQWWlOSt0hsIIOEDKgK6um0+XCtmNUjy+v1WHVZPLnfJ31RRRXnj6AFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAV4wanWWNW3Zf0uH554/UOPxqr2frxe1Hd4TOs7w5ILbiRNeygngneeK73pTpz/j+zyfr7ajjr9/6HNs1EqEw5HbaYIcOVEJ5qx2/VKmmAwu1R3EAZ3HzqEia30+lv6rbGbUn9pJOTUxb+s1lsyVfLWBLrpH84og/wNejTR5DYx7Hk2oAPORm4ZXyUoY3H8s0/iNQHUl1XziWxz9LQQCPeqJd+p8a5yS85a3NyvMO7Qn8hUG5rUfUksF1AGcPPKI/dVJSSVi1BuSihLr7r+Iu2M2C1gttqX4j54yoDsMitBLf2KO01L6quf6SvEh/CeVYASOMVXVuBKvfNeL1eZ5cr/B9V9N0/wBPgiiVjvYSM8c1ZNPPl6ayg5+pwCqKJJBHJxVu0O+XLywCoEbh3rjZY2emwSto6VtEFtTSN4ACEAk/lUZc4Le5x1SwlJP0+tZ225eEobyVo2478UpPER5aSl0kK/Y9K5rdHqMSi0K26xM3CEHNoAAICKanTrcZZxhPttqSivMsoCm3NmOMGkJl0RvH1g545qFJt0dGGyhuiLuUAMYFfLmltiISPqP27V8U7yTkAUxvMk/JqwaelTRXNNbeBFpaVtBWcq86qurNXN2lpbba8ueefKlZ92Fttzr6jhIGSc9q0NqXUb15mulKlKQT+zXRhC2edzamOKNXyWeRrhMd5SkuKdcUc5zwKu2gOsK48tMW4AKjv/TjP4a1NYNFz7y4C2gpQe6lA1uPSXSGFHQ27NUFOfiyKvJRuhGGWeb3tcG2Ityjwp7bsRwONOAEEVbtWW5nUOnWZK3HN7fHHkD3V+VUq0adadU0xAyoo9T3rY8e0PMaanNysoLbRI5qdNk8Goi4mb1jT/VaDJjyfhmqJEANDbFQ6pBAy+pWCceeKbMSmWXQtaS6tPmTyajZ92edcKG31JUklJB88V9tTk5KfFaU2oqz/OYV/CvrkEpQTPyXlbU2vwS7N1jBjiEw6oqyN/JHNYG+FhxwI+hQ+oJByP3f4UwUw786hKG0rfJ3KKBjNJOIDc0hxhQUO6EnzqzgmhDnJPgfP3Iy0pcU5gqH1thOCDnsaQlT2my4tttxtHbYgcU3U0tRILYShPfJ5rJUVlDYLhWdwzkK4quzaWWRy7GzGbruBUW0p5ShY/FWAaIJJTyg4CQKXjJ8B79SVE4x9XIFO1MOMYX3yrjI71a0iklbGrUlzxhkFvb5+lS9ulsttlLjinVN8p3+R9aSFvemLXsDagByCakrfDw0oLjIJ3cEnsBVG+S8U6FWbg1KbwlouKJ5X6Uuy6w2yW5DYUhR/ATkEURVNI8doMqTu5w2O1fVKgr2NuR3gtfBWfKkvs1QjFKywWp23SG4oaaXFDaVb1tkpKj5ZqSeWLgwwiS74gAwhwnJx/jVIZuzDK1ttsvhaDwEkYVTtxi5XVxlcdlLCW+C2teMiqbebNEstLon7rEgJYbjuIKEDGU7v41I2S0xVxnzbWy+sNlJSh3DmMeWe9RMiQ7MfjIfhoDraNn6k5BHuagvEnQJK1Q4ylOBRIwsg1ba30LWZR4aGst+4WqV4L5ddbbO5DThI2q/xNE3UU24mOmYUqS3xlfJ/wD9q0vxLtItqVhUWRnBKJI/WJV5jNLRbQ69CQuVCYQlXAV3yfPA/wAat1wxPujK0VWdcXJDDLSHCUYKD5EZ5yTUf8zPbYWR4io6Rt3Nk9x5VeU6dgLcSEvKC1HCcj8NO7daVWxp9gtt8uFYdCs7vbbSJtdG+Ca5s13bbld71lpMN9CQcF8o7gds571n8kYSlIaWUyVKypTrYwT++tuWfToUwQv9YVEnKOAD6U6R09stwP8At0dxJSdw2k5JpCqPJ0VklJJNWaOZtUiQ6GVvFrJPiLWRgj7e1JyYlshMttItj095KiC62raT71t/UWgJclClWVqOWUgbhJZHiflzzTS0dM9W3x5Hi/o1Phj9X4qdik48uKrabtmhTcVaNMsSbW3OWwFvNlWBha8q3elJuMvCUuM3HQlKARu75OfKt1626e6gslsLz2l4s9SMKDzLiUkk9+e9abv9+ubLoBsBi8bSsPg9qc2mqiatI8ilclwVKVayVqU+pbaN3BJGCabrsJUhKhLa8M85C8q+1STjd1vkV1bMdnw2sqKWjuUPvVTduabfLLa3CGyeSUbVA/as2RuKuj0WCePI6cuvgnUsR/lkgpUlQP8AOp44pFt3xnfCQC4gYSlxajgDNRou7SlAfPOBJGCcdqVSWXQSLqW2j2Cx3NVhklVcG1YMeVe1lxZuMeCMMuNl1pH1PoRlK8fsj/Opl7VDUwQnIsBLexvDxUclavWqAJCoTbTYl/Msq5ISjAFMXb1OaljwXVGMBgBQx/CtEGpHHy+mx3XuNwMKcmKZdiJdQsoyUKIAB+/pUlG09MlPuts7PEUonJ8yPPOaoOmdTElhUxpxlpKcrAVwTVxjX2zXSS1Ftk0/NO/SnfkgE+XHarvCn0cfPhlhVLk3BpzQV3lW1qFIfhsNPALU2SVvY9j5Vm30J1BDv9qmxVqkw25bX1bgDjeD28617ZLpqbTlwS07dtyk58PwlZVt+4ralpv2obmuzKavTrscS2gpKVEKzuGR2pOSGRfa1REJYpJbouz0fooor5+fYAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACvC/VsCW7q++bIkhWZz+P1KiP5xXtXuhXkbqS8XiNqS6urG1kTHglIwSRvPNd70pW5/x/Z5H9Q5HjWJr9/6NLtWC44B+Qlfk2asen7fEjNkXayT3/RTQKf7a2UzrlpMVSnEDeP6XBP5UwlJuVybVLW43GaIykKUAcV3/AB0zxz1DZFMDRjJwqyXMqHOFjNGpdXaagacnKj2B1DgaUlDjzQwk445pFm+RWXUsyJLSj2JRzk/eqr1JvTTWmLi0hAUhzACs0vN7cbZo0zeTPCP7miJDqnVKURgkkkCo95ftTh1eCaZPuYHqa8PJ22fXIcRUT4HN3erHo+YIlxQ4TjFVhrKlZ8qfRZZYfyk+VZ5q0bcT2yN+S9WIg2tp1IU86v6UNoSVFRPYAeZPalv5P9YG3C6rpFroRk/V4itNTAkJ75z4XbHnWnv008/JsjW8lXzzH/WDFdv/ABbOf/iPqhLMrriif8g34LemPmf0Pv8AlxjbsO3bn8WPes8MMZLk05tbkxyUY9HO0nWF5huWmPP05d4My7obXbY0mA625OSsgNllJTlwKJABTnJIxX1u29UbrKmN27pbrOeqE+Y0kRtPy3Cw6AFFtYS2dqgFJO04OCD51srqdpnUeuuovwh3fTdnuN5tBtlmaXPgxXHWWlNSkBzetKSE7dpJyeACa2h171dppvQHUi43bXerNG27/WfNjIuGjgVSHHG4rDa214cR9IUhXn3FMWngiP8AJ50vacu/yp1S1qhvSLmjr+1q9QTiwuWx9M45G4HwSnfyMHt25pfqE/rrptLiW7V+iL3YJU9Xhwky4awmUvCfpaUBtcUNychJJGQCM11prCdLkQL/AHLQEy5XvWX+pezL0veHkLXd5kNb73juqPJL/wCAnbkjeeTk1orotK6gvfCvr5HVU31dv/lVp7+TCtTeJ8wZ3zR+YEfxvrIDYRuxxjxMc76t4IlX6nnfbNH9S9JdU7ZpqTKu/TLWNis0fC5NwuFhlx2Gk5wCtxbYSkZIHJHcU00n0H6myERZjXSbXEyFIQl1qQ1puYtt1CgClSVBrBSQQQRwQa6p+IPr7pLpV1L6+Q29W671bqG+2+fp0aWuQxZYLkhKUlxGXDnYM4wkHClDjNTPWhxLEzSKVSetrckaPtIQnQ3zH6M3fKpxjw+N2fxflTVGujJ9TktNnL1i1PJl2O4XCzacuU+02tCVz58OG46zDSeAXlpSQ2D/AFiKffy8ucfTDGpHbFdG9MPPGM3elQ3BCW6O7Ye27CoYOU5zxXSvwkQtK9FOhui9Naz1RbNN3Tqwt9+42mew6qVKt7zZjw0tlCVBB3KDiSrH857cJaWt9q6R/CtaujnUqMluw37W140vKnKScwnkkqjSkEjkBxCTn+irI8qjx3yzT/kcq4Rq7Rup57dytjMq2TbeuewmZDMuOpkSGVEhLrZUBvQSDhQyDg88Vsa/XqUm13AyXSkbMJQk1TfiT05dOlnVPpDpie8FS7RoWFEdcZVuSpSH5A3A+hHNNr3OduUYISpSgQFKPlx61q0WmeXUxr4OX616r4fTpylw2qKaLe5JUV7gkE55NO4VgnqP6tYR/R+rFJyJTDTpbUQScZKafMx7pOcaXFQ4Gk8DaOfvX1NKopI/Mrk5NuXyR8SSoSlIekLQ82dqlDjt5VNhyCWA4l1x9RyMISSsH3qe0N0ok3K4GXP+shRV4Ku/3NXx/R1r0da5jtvlIQ9u8R0O4Vu/qp/hVJSSXLHLFKf2GrbZa03JClJZk7wr8K0EcU1cYCZyI7TK3UhYzuQcJq5WbUNyut4ZWmOt9vwyrw0p2j8zUTquXLu05KmGUxPBc4Za4KvXJ86RkzKK5NWLSTzPoh9QPxILsaRDBkhYIUgJ2IBHv50yF33Mla0eEvyQewpPVqJs+WlxuM5EDaACyPw/eo2E1cWyFqZLic5+v8JqI5oS6ZaeicFbRYrTdCuaylCGynkkg5KuO1WJ1wzFBxtvwhtI7cZqHhobuU2K7EjCK6U4dCRxkd8VaJEtqKUJcSW2Vdljsau5X0J8aSpjRoutpSgLABHOBzTjc2gJ8dtZyO5TSLIMoh5Csp/Zx50o5KfJSHSpxKewV2pO53yhvjVdjlLLamgpltGSOMjB707bVOJDRYbI24ynAzTJqS2tzOAgEYwO2aVcluMJSlCXFKWcDAqvJdRY4W08h1OG0IUBjCVdvvTlEB1SBtZSpQGVKB700bkSW2ghUUrd+45p7bbmhtxaJ4LCCMDByc1bcq7JUK7RkiHKddG+MpZIykA5NPY9quTjO4RXQlKs8ipC02+YxIMkOfKoI+nfzx61sC2z/AZQHXG3sp/EeKyznXTNWPFvfKNf26xyFyEtux/CJ7rKuAKmkabSysJbdCiQeSM4p/frRAkueKXyh0jKVRl5H5ioJtmc0tvwVqPPcKzmpi1L5KZYuDqhZvTs6RIDSLmY4Urs2KnZWiLtCQHGbt84MD6HCEmqxJulzhupT4ayc8qIxTZOorymaqM1uecWjclI5xTdkn1QiM8a+5Mn59h1GttRbtSXscBxMkA1WZ83WmnnkOQrPIceTyU8qFWew325vpS0qDIZdB+p9AKh+6rtYdVSWXFKK1LKAQvcjyHnWeWWWPiSTOjgwRnNOLZyrrTWevrjPSq4RpJQn6vBaCsZ9DWr9b/pGVP3XF9xtxSAoR28gI/Ou6layt9yYKm4rYlqVtUXEDG3PeqDrPRUO6Bwo+UQhStykrRyR7VmxauKnW09TlhkxwTXJxxZdSOWCQA28sRVr3q2H61EeVXiFrKyalU+bhbAoqGWXG2QpecdjirlqzQ+mrGlpbtvbefWvOxk53D/AAqm3DUDUaO9HttrZiMLWAFpThQ/Or5NXFqmUho1KSmuyu3PTkV/L0SOURz3Dg2kH7VEzLW2yhG5tKtvGfSp1pDmD4j+9WckA+VP02xt+Mp1TZ9B965W/c+Dsqcsa2tlTZ2FtKVIK09iMYqZSi3BCEsxXQ8cAqJ4A86dItKEJUTEOR3NLIgJWpOUhpPkTW3HufyZMmoY+tlkZuhZQzHeeGcbSeBV8smk24VskPCCpTqSQhtjhWfWqlBt7UZYWncsAfsrIxW0NAXQQLegqlZl7ytKFdwB5E1aXlhymYnli+yTs1metqIFxNo8Z1bZ37nMqaJ8iKvel5k9c+CiHAbazJaKlYxgbh5Gntu1EuZb2n1QUMurxgLI59xU9Y2Grjd4K3WS0746DwrGPqFU8s3F7kXx+JNbTueiiivIH0gKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArxi1JrBMPU9+jN7nczHuAMnO88V7O14ba8DjuvL26ysMpE578Pn9Zr0HpPc/4/s8j+oVccX8/0OGNYoZDgENLj6idvjc7DX2bqC4XlCBMWAlP/ADY2jFRaoaZDYWoFLhH84Dwfyp01HQiPtKiFAc816E8VJroTQhDQG0AA+1VfqBPdetwjHhtPOccmpqYrASpC9u0cCoO7LamNLQ+oJyOCaxauX/G0dP05VnjP8GsnVFRB7Zpq5zx3PpTyajwVKQM8E4JpuytDSlKICleWa8ZL2n1OHupiKlJjNEqOD55ps3MdMRc5ESQuC2vw1yg2otJV/RKsYB9qmNM2ePq/qFpOx3F1ce33W7xIMl1tQSpDTryELUCQcEBR5Oa7E6mfFP1D0J8W986RaW0DDvfT+2OixROnDNuZbE6MlgJC0uJaUtKlj9YlXOEqAxS++x7lt6OM7ZdlXEqERqS88ynxyuKlRU0lJH15TykA458qv8T4jOpD6djnWHXPhKTs8NWppu3b2xjxO1bk6udc9VfCR016M6c6W2qHpCPqDTjeqLvOcgtSnbhNkOKS5HWt1s/S0G0jAIO1aQcBKa6RiTtA6Bt/VPX2rNKRmbXqjSOlZWprMy0hAiLnS34b7raQklJ2OB7aOSR3GQRTx10yHmb+5HBOl+t2semWnJFh0v1Ev9hskj6lwrdcXGkIOckt4OWyfMo2k+earsTVsJOmxp9y9T3bEiQZQtapazFDxABdDWdu8gAbsZ4rp/rTC1f8EvQzQqdJ3aJ86vUV4FvvaokeWmdbXkR3GV4cbUk5SE847g44PO4eoHVfVLnx4dH+nbr8L+SE+FbrlJt6bZGT4khUd4qUVhvfyRnbux7VOz4sss6TtROGIvVS8In2KZC13qCNLsLJj2l0XV/db2sAFtj6v1aCEpBSnAIABHFOtfdZNQdSLxBuestdXjUMyCvfDVJlqCYq/p+ppAIS2o7U5KQCcAnmuuNW3i/6i6UfECjV3UrQvVG2W2zvuwdP6bisNzLY4JCQl9xfy7ak+GPp4Ksk+vNWe4XNGkLr8RN1h6mtvT9+HYtCFnUEy1pmtRC4y4lf6nYrJczsyB3UD5VOx9WT9QnztRwzK1ZbNSvzJlynv3W6TVlyROnvqefeWf2lrUSpR7ck1IPdfOodlaZYi9XdbRYbKEtsx2NRzEttoSMJSlIcwAAMADjiu3U29jV+oo+pIU2266cunRvUEU6pt0BuKi6T2XWshMZIGxaAtIzgE59q5P6G6+u3Tz4MteavsbzEPUMDWNuRBmvxWnykqivJUkJcSpJykngg+vlQo0RPUbu0alma0a1JcIU+76hutzudvZajw5kyc489GbaOW0NrUolCUHlISQB5YqX1Jrm965tbf8qtUal1DaHJRdaXeLhIksGQEbSpPiKKd4SAkkc4GO1dr33qNqXqLcvhW0hfbjDTYuo1pEjVCW7VEQZ6gpK8bvBy2FYCSEbcgmqJ03+KDXPVj4tJXSjUmn7e903utxlWN7Ry7WwhNsip3I370o3hbYTuKirkg9hjF6M7yXyc8sdTmZV2iTtRakuV/lxmUxWHbpNckqYZSSUtoUtRKUDJwkcAk1MzOqBvkhMS1IekuOA7GYySpavyAJNdYSZt/wBEdHuiUHSPVPRHTKC4JjElrVMZp565IblJQ34ZVHcztTkHlP4x9xnqvVti6adQ+tkO2z/9SV9uF+hxYeupdgTNt7pEbetgK5TH8Q7nAfIHjJzW3TamWme6K5ORr9FH1CHjyPg5l0lHcvQckhTKksnDiFqwpJ9MetbN0/Hn3hglEkRLfHGVuJ+hJI8h71E/EdM1AjqRou46iiWOQ7d7Ews6g0vM8WHfth2mUEeE34aie6QnHPBxQLzLLDMKMUsx0q3ltXavR4fUss42zxuf0DSYslNWbP0jdlXq2KCH3re6tRbykZUpI4zu96s9q0/o2G66u5zVvr2bUsrc3EqPc4rSkq/Tp6w21J+XYQOEt8DNfZ7jfy7CmXSuQkZUsnnP3q/kyZOWyy0unwLbjiX+V1HtFluEmLY4CFtgFreog49artxtsa8N+Ml9QkurCzzgCtZW51m3S1shDgedWXCVHI9+auUNUgMF5LRLYHCgay+TJOdPofPT4MGJ5F2yT1HbHJX6qPJT4hSEnPnScTSIZYjuyHS4lJ2qST9NIQWkPPl96SU8dgaVbbUFEiSvwCcAE8Uy2vtOOouveuCRkNR7a40IICkpGCO2KY3RXzTbbTYTjsrdSbAXud2K3geRNLRm1vg8eGoc4rq6Zz23NWee1sMW/wD43yPYtvVEhN7Ubykdk1k5KDSgHmQk+ST503Klst7nVlWeMA8U5DfzDaVqwSnvk54rZF88o5ko18jVqUDMSshKGgewHerJHZYu0fxvHbBaICGgcFWarS32XHm0llRQFc+VTMdyAwSiKnajg7sYINMnBNCseba6LMLfAYUC+lfiJHDg7Z96hX1olPjCE58lBOc19buPzZDXi+fAVTJ6Whl51sJVlPYj18zWfwmmWfcifZfuNz2tFaRjCQTxgCnCbhMjrLMlYDRJTlQqGb3PQ2ssuhe4ErzyRWch5TrYKnsbMnaruKS8UbpmmOeaXBPQJyGnCFBJSPPyNTKtRORWg43DaCQDykgn91auevDq1hKXFlonkgdvtXz595uTvU8VN88E1WWCNXEbDUTupLguNw1jAlNIcWFb8kKGfOm1s1UzAW5IiIzJUNgUo5IqEtNtgzHkvTXw2nBwEnjPvSrarZCmSEBhT6icpKPwmsrhm+EdHy6WKuT5Ls51Sdei/LxEKblKSAtZGc+uPSq9cOrUjTa3I7zKgVjbvSBkimV1t866Q2zCDcEgAD+kfuao9+0TqCV4y0uh9xnng8E02GkhLmb5Fy9RyY+MMbJa69ZmlTTCS34YXhW5WB/GsV9RpF+lNttODYPMDvj3rWE3TUtpGyXHUV/01+voDSSrLLYQkxpfgKQj6UjsfvWqOkxx5QifqOebpujYV5cTKW8geGlL3BWD9SR/lVEnSlxt0RCWn4yc7fWmIdvzKELU808EHO0nlXtUHOvcsSSXIQQ6TuKU9hWHUaVf9eztaHNKbe58FktS7RKJD6DEkJ4yVcH8qkItkF2feW08ULQNyWgTgj1qlR0syF+MtKxnvuGcH2p9KuE9tCFwX/CGMfjrD4Jx4aOlOal1InpqZMUBp5/eCRwBt/fS7kR5K29jJU0RkLxkCq4xJmPLSpxRkObhuKuTVmhXWQyyhBUr6TnZ5GtuPGzk5sygTztkdDDSmdjwWjKk9se1O7Sm5sPMtR/CYccyNjgzxTWBcrjNa3Nx0qKTwEjBJ8/yFWJK2or8R11SVO4/WpHO2tMcTRz5aiN8ki1ri6sBFuu8ZCkIwlLjZIwPbFPoOuLnbtR2lhia6EuS2glLiMYTvT3Pn3p9ZLIm+rTJDTSmd2PEUfqA+1XSFpOzqvNtaUoNOiQ0oJUoKJO4VScUk00acGVbkz0PooorwR9iCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK8Rb5AS5q6+BZx/tr5Gf+kVXt1XiTqpwt6rvSgcH51/8A6xVej9GVvJ/H9niv1K2o4q/f+iOBSy94bnbsDil3EMBs5zu9Qe9Zlbb0fJ2hWM5xmox2WhtpWfqPpXpNtHh4ttje5KjCOoKGD5EVR72HF7lZ/VgcGrUkJeUd/Y9qjLvay6yQF8Hyrn6rG8kHR29Dnjiyrca8uiklsEYKs81FqUkp4q0S7Spoq3t70+WBVZlRXEqUQgpSD6V47NilE+nabU45x4Ziu3m4IUULKHW8KSpBwQfUGt8j40OsUqyfJl6zKvfy4hHVZtbX6VUwEBG0v4yTgD68bvetDwpamXCkclRxVzZgpZhJdLqSpX7Ke4rE3KJ14xhl7L90y+IDqn060bF02pizapscMuPW5vUdtRNVAW4QpSmVKGQMjO0nbz2qtao6qdQdTQtesahvqZjWuEwkXoOR0ZcTEc8WOhvj9WlCgOEY447U4j3/AOTtKwoAnaAD6VQb9d13J9KE5KUn170tTk3Q6eDFCNlu1FrDWHULp1pbRF7vAuOnNNFw2tlbSQtnfjIK8blDgAAnjyq1XPqtr+89W7D1KlXWMrV1kYajQZaYbQQhDaVJQC3jacBauSKhNHWuIvTi5MhazI/5NA9KzSsNK2kAE+RNapQlSaOYsmOTpDbTd41To25aum2mTGEjVkN6Ddkvw23W32nVhxaQlQIT9QBBAGPKrxbutfWS1XPUV0amWqW7qKNb4lyan2iO8083CQpEYeGtBAKQo8jucE81D2jwnngpS0p2HsT51aLWh6VObSDvAP5Vqw4XJe452o1CxvgRf6oda7jrvS2qhfmLfd7Ey4zbY8CAyxEZbcGHEFhCQ2QscKBHOBntXzqbrLXnV+xxtM3hFns9gYfEtVqsdvbiMuSAkjxXNoypXJ78DJxW27FAYbaceSlDsgjbhY7E+nvVUuul12mS4864rC1Hkit0NLFP3HFza7K09hrfU38uNYxNER5V2DR0XFEWxuxW0suRW0lJT9SQCo5Sk5Oa2HN689YtRWuXHWLDbLxNbcjzNSQbQyzcZLawQoF0D6TgnKkgKPmTzUeyQ24eMjPJNTER5CgE8jPbNOeDFL4OZ9fqILsoWpNL6m1ppnRthvdwbkwNJNONWlKWEJW0lakKVuUBlfKE8qzV3X1i6rM369zLoLHqmDeAz89a7va2nIjq2UbG3dgA2rCeNwIJ86flgpVyoE44pIuBIO88DzFWWkg+0Lj6pqLqyn6gnar6k6itl61fPZUu3MCJCiw4yIzEZoHOxttAATz3wOfOpR2O2w0HN6uDgj1qU8eJIUPqKlDsQM81V9TmTEaHhnKVK+ojyoSWPhG2Mp53c+xCbcVxnFBvKSnnjzFL2qc5MIQCpSlj8CBmm9skIu0JfitbVJ+jcRzTvT70PR93feeU4+4pOEgdhWvDPc+SNSowh1yWpixtyIYD8ZQdH7Rq0huP8k1ERhpDYyQB3qkx9eqVKSthkugHJB5BNPXdRruCn21lMcODlY8jjtXUUYHks2XI+CNvDTTMlwsvKOSeAaRF18GKGVOFSx2BppHZQ48UeMlWO7lLR5DKZYBCV443VR4I3aZWOqm47WuiRhXB5pKlcEd81MxZrzraQhJ3+ZqJjRtzq18FJxjaKl4jC4u4qP0nsK2YYuCOPqZRyztLkzUHX2koUTgnNP4EUMJJ3lXsaTiobWClRwqnDqm4ZShB3LV/R5x961RdnOyRceGKttqKlb0gjvkU5QqOClZaKSBjgcGmzkhDISlSiVHnI8qzfdASkY785py54M7jtVobyrokPpQY2Egn6007tyfnm/EYSor3YIUPKmUxyQhA2ISof1qUg3p23xlJOGT3yO5olD8CFlSdNE23fFtPiM4hSFI7q28faoaVb5F3uYW27tClY2g8GmL+pvEPhyUlAWMhSRzRG1TGjtFkpUHSeHc4pfgb5GR1UVxZIvaTlBxSfE2KBwAk8E03e09MbcJUAVIPKfap2DdrY7DChc1BfcpV619VeY7MYyELEtaicg8EVKjKPwRNwn7rIV64RkttMqjGO433I8zSi/lpI8X5vwSnhO0cZpJ64Oy3C4mMgKUfMZ/KoiTtD6m1AJUo52gedZ8mTajbp8CytFysjSpDjbDkwHceAo9qWuL78C5qjQnipvP1KIyCaqkCFJVJSoZyP2yrHFWyE4FwVIJC8HJVnJzXKlm5PS4tPGNDG72Y3GEFTXdqQrIa24Vn2rJ/SllegILsYtvIxnnk1JxZbJIVOa8ZrH0ndyKfRbM1Nty34bqluLJ2pdPIFL8km+DV4cceZI1RqixwhL+VajFAABS+k/uzVOuenEW9TanXty1eQGc1uVpUaU5IbfSCGztWMciq/Ls0ebJW0GwmOeG145p/ufJG+C9sTX8LTjaIqn230KeV/wAmRUbPt7beFOshQSrB2pxV6uLbFuiBIYAdQcBSByqqg46ZUxxlW5LKufrGOaJZZIiEE3yN4sJmS6Q3iNgbxg4z96kLe/GbUSVEKSfvUVEaDElxvkoH4VHv9qUUgsywsHIV5VEcz+SksCkyxRLmsPqcS6sAjG0DFTNp8WS4p4M5ZB+rd3NV+2upclNlK0DB+oGtgWiQylSQcFIOSn1rRHOkc/Lpm3RJQFrS14cd1bRzwlPBFSFh09dXdT22R8yte2U2QCvnG8U8iKhyIq3UpKHQeDgAfvqe0ZDMe9QpOVbnJDeOeB9QqZ51TZSGldpWejlFFFfPT7gFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAV4mariLXqu87ef9tfPH/SKr2zrxEv97dg6svYKQpJnP9x/5xVei9HdOf8AH9ni/wBSxco4q/f+hgllScgnbnuKweipcZxgA471IJvDE1SQW9iv6QFfZTaWynard7Yr0zmvk8GoTsqq2S24Bgis3GVKYUKt1ktUa5XBpEhQQkryVVYb/pi2SppaiAJZSngA4yazTmqOrhwOXNml5TWMgjOPeoC6tNJB/V7s98VerjpaQqY42y2QnJzn0rF3Qi2IpK3AoqGTgZxXJzYd6tI6+n1HilTZqeNZzIfLqBtGeM1YrbZLlOKiw0SyjupXAq6WfTsGK/8AzBfUnsM8V8u94lRguOlpLCAeEpTjP3rmywY0vcenxavPLItj4KovSzzyHEPSQlB8u9IR9JMw1Fw/r8cBOKWl3uSFhCUBPOScVdbDIYFuQ6lgLfx9W4d6x49OpzqJ1M+s8MbmyFt7st+Csx46WGGOVFXFV9BemTztUSc43Z4q/wAuS2yw4VISlKhyyB51FRUMG3uOvxw04rtgYNaJYnF0xGLURmtyHVp0y5IdxvShATyUmtlWKJGscGMsHela8KUe9aytl1/R8lDbat6F8FOeRmr5GlKcYYjlQU53z5Cn4Ukc/VSbNvOCzMMsOQiFuqT/ADecbVeopncbBIurJ3PeMQnIQo85qguXp6G4yQEpcTgcDNWqLrplFsU+o+HMCSOPXHeuhCmcXI9nBVnIbQvC4yQfoTlRxwD6U5ZhnOVEIaTzu8hUZAvSFvPrdQVSX+yj/bTx28t+GmMtGQSSrae9WUUlZkm3J0iVQ/FcGFOAnGAaYOLIUtCQFJ8vemjKUPyUBCdoPYGph1DbICCkb1Dv6VeK3cIVs2VKRBqtoUoOIPhpT+Lisbi+wYxWo+IryGM0tcHFOpDSSUtjuBSiILJjNoQnjvuxWOcalydbHJ7VJFVZCkOKcSlX1H8IHFYv2xbmVEeGpXOFedTd0l/o9G9KE7+20CmLU6RNQZLqQVIGEprThjxwjLqMql2xK3xFR2yhKCFnkkU5VGLqHGwSnzKvWnMG4kNEFHJHNfUu71kKbIA7YrtQUa9x5TK2p8EQyGlpEdsEYzkeZp800lthSUNgL9xUpEsaXwH0o2Lz5+dP3dOPQHkLe4S4M7j2FTcOkIccj918EXbJK46Qgq3DPYjtU0uaXEApOPaoxxowy63gKdJyD7UpFZU6AMHPlmtWGUJcHN1MMkHvix+ZfhNFZznvwaXjyUrcaUTuCuCSe1MWklJU2pJCe3NKsQMr8Ns4B55rTtj/ANTmeWblcyeLrSV/QkO54zTtlsqa3ukqx2HpULEC4OduF57g96lWczmyEK2qP7NYpNxlydaEVlh7ReYhMmMFtJIWg/VUE9AemA7BleeOal12yS1Hd2le8jhPrTWC8uHISqW0pBGSRTo5Y9WZc2lk1dEU9FWpIQ6gZBwAaXGjpc+IXkJHhpGQB3NWQw2bihT6QNvGB50uxLctC0pQFqRn8Pp707zpdGCOht+4pLFscSosvJKPdQ7VM2ayJhEuycrjEntVhuEyLIiKL7GVK5SvHNVZN/jyyqKlSwEHB57UmWocuKNGLRqAtdoohILsd4uMq5CfNNMtPbJr22SNwH4Se9SCWYKoqlmUveAPoPnUXFUgySpO4HsMVy8zb7PS6eEY8xJu4tll1SGXAkhPGeMVEW9l1ol1yZ9AVyhBzmsJ8Z+XISn5gpSR+dKQLa1DBHibjnuay0btzXRY4k1Lq04aUtrHJUKkX7iQAphXgNoH4u1V0SFttKKFEgDsOKhpcK53U4cWWI58ge9a8fj6OfmllbsnVpjeOXIcrx33D+sQO1KKQHEoaS4G3UH8Hmai2LM5b4aREUQsDlfY1BSmJVvlIkSXFqG7Oc8j860PGvgzxzyT5RJ3CK4lKkuLGQo4TjJquSGEuoBcKAd2KnLndHpDDctlkB5IwFZzx6mqs5AVLWtZcIUo7sDyrPLCboZ4v5I2VEeamFttKlgHIps5FkOKBKVBIz+RqWjwpSLgAp7aSPpKjU3bLJKnrLZKUtjIUU9zSJYnRtWpgmivWeC45MSkHYFcE5q8x7c1DAdW86oDtj1phbNJuQ7pvCicH/lBxV1diAxUp2JKc4GPWk7GiZ5IS5GlsvTctYQEKVg8g1snR9wTIuFuaQ2QpMlsduPxCqGzp5beVsBLa18nNbD0BEES6wg8oF0yG/z+oVZr2sTGS3raeitFFFeKPr4UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXh3rCwdXH9V3pTHTORIZM58oX+j3CFJ8RWCD7ivcSuSJB23SX6eMv+8afiyzxXsdHN1qxtR8kNx5vNaV6vFe49J5SseRgvjP7qsDEbrAzECVdFVurPG4wpGa9DWHQB3p8y/g096rP/AO5yEtMusSPNluzdZArcjo9OTnyTEkAA1KRY3WZnOejM5zj9qNIGf4V6PNug8CnTbowM+VT9Rmf/AGJU9PH/AMSPN6Ijq/F8Tb0FmuuOjG9bcnA/hSP6K6vFpxP+oy5grGNyW5GR9hivTBt/I9qctvYxUefL05MW82BO/Ejyyi6J6vsSfHHRe9lRPKQ2/j+7Sd76cdW70+V/6mdQsA4/A06f/pr1Zbdz7U6YkkH/AAqnkm+Gxi10YO440eQrnRHqq8ohXR7VWfUMOf8A21LW7pd1ctccst9F9TqKv2lMuHH5ba9bkS07ueKcNyQtWRnFRCU4O0yuT1FZFUsaPI1npR1YC1+P0W1VJKzk7WnU/wD01MMaA6oNspSvoHqpahxkhzt/7leszMjOM96dpfHFWcpPmxS9TUVtWNHkE70t6pKf8UdCdUoV3+lKz/8ARS6NBdV0qSW+h2sWyn9ravn/AOCvXpLgUM0KWPKhOS+RU/U1LvGv9nkWnQ3VhRy50R1ipXmdqx/9FO06N6pFJQroRrFQIxner/8Arr1n3+9fN+Dmmqc18mZ6/G/uxr/Z5Jr0J1TONnQzWKFDHP1HH2/V1ZIukdSC3kSvh56nLmkcuNTkBG71CSwf7a9Sg5XwuGpvI/8AsT/kIJcY1/s8m2tMdUGpJLfQfXBSk/RvUcge5DdPf0J1MWAV9ANblQyc+If/AOuvVjxKN/vTo5MkepCpa3FLvGjymNi6luHP/g+62Tkf84f/AOulBZ+poThPQDW/HbLhP/8AFXqr4vNAc5qd027ci69RhFJLGv8AZ5NO6N6lzXlF7oTrgZOfxYx/8unbmjeo6GkpR0I1mkgYzuz/APx16t7/ADNfPE706OXJHhSES1WGTuWJf/WeVNt071AgLHjfD7rmSD3wvb//AB07cs2vRKD3/g+68S2OzaXAT/1VepfiV8C6v5s3/sJefTv/AMS/2eW0yB1GkOtbegeu22EDhCe5+58OpOXI6gz4CYjvw/a9Tt/C4kZI/wDl16blzNfN+Oat58q/7C3l09V4l/s8qRpfqGJS3l9EeoCkq42+COP/AJdSDVk10yFFXRHqGSBxsjAj+5XqN4nHHFfN5GastTmTtSET+lmkni/2zy5Zsmts7l9Euo3PkIY/+ynKIGtGvpT0R6jAephj/wCyvTzfgUFVMWszr5Eyx6OX/iX+zzGTadZK5c6M9Rgkn9mGnI/+CnrEfVbZSU9HepKFJ7H9GpP/ANNelZV78V8yM1EtXml2wgtNjVRx/wC2ecTkzWThA/1Q9SAe2Tahx/CsnI+pJyQmR0l6jIIGPEFnzmvRkrwaxLg86qtRkXyWllwPh4/9s87YMLUsQY/1ZdQygjBSbEeP40+bYvfhKDnTfqJtPG06dUT+/dXoF4u7OK+Fw1V6nL+RXk0/zj/2zz7kWu+PICR0/wBfkDsFaaX/APdUUxoa4iUXHNAa/bKjzs0yv/7q9GQugrBODVlqcv5KXp//AM1/9Z53r0Nc3c7NEa+9t+mnBj/46Qc0FqgpCYmiNYIycb3rA4Mf/FXouXMcUbxUfUz+SVlxr7YUcBWvp3qFERaX9JapL/ko2NwDH/vVkz031K04n/ilqJQPrZ3OP/irvdb6U9z500ekgA4zzUfUTLKUW+jiSP05vxc/W6ZvyUn/APSnB/jSzPSq/qmF1y13YMAcNm1rB/trshx485Jpm8/3Gc0LVSXRdOL7RyFJ6fagkvKS3Yro0hPYm3rAP8aiLr0h1FcAhk2i4KSRjKoSgE8/eux3Hs+dN1u4Pfj0pi1s1zRHhxyOOpHQrUMG3rbbiznXicDbDXjH76ioHQ3VEbxVP26WokcBEVddpuPZH+VNnXefTNN+vnfSFx0OK2zimR0P1ROwTZ5yCg8H5ZeTU/YujWqGGwv5B1rYclLzakFWeK6wU9+dIrdyc0f5CbTW1F16fD/2Zz1/qrvZcShbKwPUMk8j3rL/AFd31nI+SUpJOP5o/vrfS3Uk4zmm7zoHakfWz/BrWji19zNMR9B3VH1KaXkeRQRU5YNMTmLxAU40Rh9s/hP9IVfXXcZzScFebpEP/nkf3hVJayb+B+PRQi07Z2BRRRXmz6YFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVyBMd/4Tl+WHl/3jXX9ccTVgXSYCc5eX/eNSjla/qP8j9l7Ip806fWoZpzCu/FP2XAccirrk4rdEsy6c5zTxD3FQ7TnqeadIc7d6Lozt2Srb+B3pwl7I4NRiHRtHlSiXfT+NMFOiXbkADGaWTI9DUQ29g0u2/uNRQluiXRI9TTlp8JHfmodDvFLpf4qyQtsn2ZfbmnjcoEd8e1V1iVjANPUSdvY4qxnkycbk8c9vKshICj3NQ7UkJBwrg04blBZHJz71YzTZKBWaCrHnTVEgbSc1l4oUnyq5mlKhfxfvXwuUkV+1fN35U0S8jFt59a+BfFJZ47183CpojyMX8SjxKQK6CupRHlHBewK+eLTYuZ4r74lXRTyi5fwK+hzFNlLr54lTYPKOvF9a+F3NN9/qa+b+akjysc+Lz6V8LtNivJ71jvNSUeVjovcVj4/saQ3Zr5uoK+Vi4eoLue1IFfpRuoK+UVLuSKFLyaQ8TJIx2rLdxQR5LFArFfCvmkivFfN/50FPJYruye9ffECe9Ni9jzFJOye/OKCVMdqeG0nNN1yDjO7B+9NHJSefP3pu5LSEgjJqRqmO1yCod6auyhnvzTRcjHnTZySEjn99VY5SHT0onkdqZuvE5pByUCPem6niriooYpMXW9yPWkHXs9vKkVuY/zpFyQUjtxRVGiLFlrABJNN1u55/tpFb3B5pBbwxUWaFIVW5SK3ee9ILeyKQW7yRmo4NMZIVdc9BzTZ5zj3pN14g80g45kHmqsfFnx1zOSRWFud/4ViAf88j+8KSccGOfKsLcsfpaGf/PI/vCqmiEnaO0aKKK5R78KKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAri64LxdJv/AE6/7xrtGuJrg7i7Tf8Apl/3jQcn1B0o/wAj2O5xyDTtl3y7Coph0nv3p207hX3q6ODJ2S7T2MZ704S9jHNRaHQDThLnGQatQluiTS770ul3nviopDvvzS6XvapTENkoh0Uq25jzqMQ7/wB80uhwgA45qwlsk23sdz++lhI4qMD3PtSiHc4HlVkIlIlW3vMGlg9jsrFRSHecZpdt7yPNWQiUiXalc89j6U5RJBVycAVCJexSqX8+dXoyTZPplp9ePtSpkAYwar4kkpxnIpcSPpxmmJUZmye8cjndmlvmNwqDTLOQM5x70siaM+me5piM8pEwl4FNBcBNRaJg/a4FKCYCeDkVYU5D/d5ZrLdxUemT55xSqZI7ZyamhTmOVH3oC8YpDxQaxKxVkijmLqXQFYFNw5x3r54nPeiinkHHi8V8DhNI78edfC4CcbuakjyfuLl2vhc49KQ3gDOc18Lo45FWop5BcLwK+bxj0pHxk471ip8BQFSkVeUcpVj7Ub+DTT5kA4IP76xMoDNG0Fk4Hm4CsSsDzpn82B3OKSVMxwSCKmkRvY/U+EjvSTkkJ4/jUeuSCCM0iuUAcHkGpoFJtj9yWMetNlyspyTTB2WEn1pByWDwBVWkh0WPVv5J8qTVJShPfP3pgqRuGMYpEvgjk5NQPUrHjkrKsjgU3deCs802W9j7Ukp3n2qUvyOUhdTgxSRfxk03ceAPekVPbTzUUMUhdT1IuPY5FILfB8qRW7kVDNEZirj+RnOKQU73Pf2pJTgFILdz50uh0ZMWU+n1xTdb3J5JFIrcBJpFbvfmqmmEhdTgznNNnHtxODisFPAnINN3HRznig1RkfXHAfOi2OZu8P8A6dH94U2W6ADRal/8Lwv+nR/eFUZqg+Udx0UUVyj6MFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVw/cnB+lZpP/AD7n9413BXC9yURdpwx/y7n941Bx/Ueo/wAjtpzcMinDbmDyajGXNpz5U5bc3HirHn2yUQ6FYNLocz51God5pZD35mrpiJOiSQ7gc0ul3IqOS6MDml23ceeRVqEtki26MHNKpeHFRwfHGRSiHtwNWXAqTJJD/vSiXfeo0Pdsce4pVD+E+/rV1yZpyRJJf9DSzT5AyTUWh7JpVL43e1XRkkyTS6SO/alUO+dRiXx9qUS+PI01IzSZIJfx2JxSvzPOajEPj86yTIAFWoztkt82e471mJeSOe/vUP8AMk+VZCQEn71ZJmeTJpEsEEk0omUM4CqhRJ9819RIOfSriWycEvdxWaZRSeTUGmTk5zg0oJJV51NCGTyZuPPBr6JZV+1UF8z7496zTMxx++rCrZMfMbvwnHuayMpRPmKiEyiAQD39K+fNnsOB71ZULbZMiUVDkkViX/fmopMwpGM5pNconsrNW4KXZM+PzgnGaxckBHc1E/OFKMZ5pNc3IJKqngKfwSwmJIHPPmaPmskHI7etRAfJSkgE554rBUkpODkH0qu5fku8U6umSq5vOM1j85t4J49Kh1y0njPvmsPm8eeferWL67Jhc0DkH8jSCppJ/Oo35sehP51g5KIwRxQSmSJlkjOaQVJ9+fKmCpBUPxUn4v04B5qRqkh8ZIOeeaRU/juaZre5xWBf96gspDwv9yDSRfx3NNFP+XpSJf5OKBimPVv88mklSOeO1NC6R9qwLuc5qR6Y5W/k1gpzJ5NNlPDiklvYqB0WOFOgZ5pup7PnSKnCR6Ukp3nGfvS2zRFoWW9tOKSW6cZ7U3W9nPnSSnSB61QcpCq3NvamzqyPPFYLeyoimy3sqoHRkLKc4ODSLjucc+VJqcz7Ugt0eVUNMJGTjmAcms7U4P0vB/6dv+8KZOu7ue1KWl7/AIZgj/z7f94VD6N+N+5He1FFFcg+mBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFcIXN3F4nAd/mHO/+8a7vrgi5uf8Mz8/+UOf3jQcb1LqP8jhtXal0OlPOc+1R7Tm3kdqXQ4Cmg88yQQ8FUuhzFRqHAfal23vU5FAiZIB0nzpw2761GhwEcHFLId7ZpsXYlkgHQcUolXnUcl/FLIe44q4ib+CRS9x6VmHhTDxSa+hzHOTV0ZJskEvZGaU8THnUel/ypRL2aYjPLjhj9L/AGxSqXyAaj0vc1ml7PenLgyy7HqX9pOTms0P+dR/ijPvWQd3Y9ferozvgkQ/71kl/nuPzqPDvHFfQ9681YzyJL5gc4xWSX+O9RninHHArIPn1qwhskvHx54r6l4+tRpkEnvX0SD5VIltkmX8cZ7e9ZCSeDUX8wDyBg+dffmc+tSkLskvnFFXej5k4781GGQRX1Mn1HNTTFuXwSfzROPq/Khckk9/yqLMlQPGK+GSsjGcUUyESPzSwPxVg5cEsI8VQ347Jz3NRpfPfP51A6guvyu0EktkZVg1TIqidTQY4zze/lEzJ1QEPblukKXzsBxx5dq+t6pLSgHHCpK+yVHv71r568sz5BU2gFecc1nJuEqTsS6sJS3wjP7I9KwqNOz2ElFwpo2YqaleCOQea+/MYGc1AWmSVW9oqJPGKe+MCM5NdKHKPA51tySrokTJyMg4r4ZQz3zUd44r744PtVzNY8L4B96x+YPcUxL9fFPkEHy9KCUx6qQT50mXcc5poXirI4FYeLtABNAyPPY6L2eM1gXwB3ps4/n0/KklO8e9A7hdDlTxOOawU7gnmmvj++KTU8RnFQNix2XTj0pNTvfmmqn8jBpMuc4qjHpi5dJJ5pNTpT2pDxME80kt7vVRkf8A+jhTuE5xzSCn+ODSCnMg8mklO8CqmhOuBVbmSSKSU5gZOKQcd+sEGknHCef7aB8RVTxJ9qQUsEmklu0ipwDtVDXB2KuLApS0OZvUDH/lDf8AeFMFOZzmnFmXi9QP/WG/7wqH0a8cuUeg1FFFcg+qBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFcBXVf/DNw/8AWHP7xrv2vPu8Lxerhj/yhz+8aqzjeo9R/kySrnFKtuHdimIcyKUbczjuDU3aPPtEil0cmlkOZ7YqOS5xS/ijA2g+9AiaH/i5GO1KoewOTTBD2MA0ol0Z4OauhDRIIdye9KIdxz3qOS5z3pVLxBFMQmSokQ/58Vn437qjvHxx6mlUvgH/AAq6ZjkuR8F4pVD1MPErJLnHNMTMzV9j8OZOQaUS6SM+QqPS6AMVkl7A86anZnkmPi9x35oS6TznFMg9nHNAfP5VdGeVEj4pz3oD5A9eaj/mST3xWYex71ezNIfiRX3xyOc96YeNzWfi5xVrEyiPfHKTgigP9/KmPjduc0B7GDV7EtD9L5xjPPvWQeKe/pTDx6PmSR3/ACqbFbbH3j8d6PmCBjHNMPH4OawMnB4zU2UUSRMjketNpVybiN+ItRcG7GxpQyT+f2PNNHXFLYdWF7AhJJWf2R61Rv0xFSohYU6vG0eIcgjOSB6DOKRlyNL2nd9P0Uc73ZOjYrN0hymd7K3FqHdnaN6R2z3wRnH76hNSITIhuONqypKcg44IqLtjiGVuRmlsjcnLroWON3ZKfyrHU1wUzaloYJUpY2gp549qVCbf3M6OfTxxyj4I82VdoKXIJSsox5p9afWsvOTmklwuJUv6twz6VTm5rrUjP1ghXKeQTWxLREilDUhpSiVYUNxz5ZplF9TleKFMt7ToQgJTgAHsKWD/AL1FIfwBzSiXhj3PvWmLVHkJe5skDIzX0u8d6jy5jzo8Y8VexL4Hxe+2BWBkA+dM/GNYlzjigLHipGBkc1gXwRyaaeLgViXsD1otF00OS+fI8Vit3I96bKcwOKwLxx61DLpjgr9e3rWPiU3U9nIJCU+ppMuE8j99V3DU6HC3jnFJqkGm5cwawU4D+XlVfgbFiynTjNYFwY7/AJU3W6R5YpMunjyqGaI9Cy3+O/FJqdz502U7jjvWC3sdhVWNjXyLKdxnypFblJF04zmki4e9BqiLKcyOKbuLPNYLd7+tNy6ec81VmiLoXKsDk0vZnM3y3j/0hv8AvCo5bhxTmyLP6dt2P/KG/wC8Khm3E/cj0Xooorjn1cKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArz0u6/+G7gP/SHP7xr0LrzsvK9t8uH/AKw5/eNUkcj1BWo/yAcOaUS4RzmmW80oHuMEVHRwpRHgdPrmlkO+RNR4dBSMHFKtrFWsRKJIJX70qlyo4PYxSqXcedT+4hxHwdIV34pRMgnsRTILyMUJUQcjtV0xEokgl05zkYpUPA1Hh4DjPNZh05pqoyyiSAd571kHT60yS75UoHeKumZZRHqXwDzWQkD14ph4oP3r6HR61dMzyiyQ+YGBQl4HzpkHdx4r54oz35q6ZncaJFLuc+1ZeKB3piHtqcetfQ7xjNX3GeUbHu/nvR4lMy927/ejxs5781dMS42PAs+9ffEOBz2pkX6PHx55qbFOA+D3vXzxOM5pkp4YFBeyB7VaxW1jzxgM5rD5gD2pkt/nOaRVJGDmhyJjB3SQXu4pYt75XyCkjGa1o/MT9D+9Zb3YxjGBVp1jKKbasDkq+kA+9QDKW0aYWFoTvUdwB78enn51nlTPWaXdDDHgdWqM7eWlttjCs53oRuOPT19KXkWvwVITIU60v+kpC0Y/hVeavMSPHCP0fJaUTgrbdVn7jI4/7aVavwK1L8e5pxwCXgB/ZWZtnpIwht5JKfZUJ2q3Batu4kKyc0zhagmWchguqDPZOR2pR28eO2Cp0qQUYwvnnHnULIuIVlIZ3HzXEcJSr7oPamRbXZly4YT4oucDWyk7UutlYJxuB71PN6miFaGytanCATgds1qFqQ4txTSAr6jlvcMHPpT5p+TGdUypKQ6T9Swc49s05NrlM4uXSYW2nE3AiWl5CVIUFA85FKfMduar1nfKYLacdu32qSD2cVqjLg8dmx7MkkvySAkY471ip70OKZF0A5zzR4x/LHNXTEbR34xJ71iXc+dNC6MZr4JGfPH5UAo2Oi9n2rDxue/5U2U7n3rAu7R60WMSHKnvIdqxL2PPmmvi579qT8UZPJqBiQ6W+c0mXsmkC7z3pNToVzVbHJMcLe880kt3ikFO5+1YKcwPY1WzQkKrcyawUsj70iVhPc0kt7Hbmix8VXYsp3BwaSW6OOabOO5V7+lYFwY96izTFMzUsbic5NfFOCkVOAHmklu8DFQaIqhVS/enVjexfbcAf/GW/wC8KjFOjGfOndhWP07bv/WW/wC8KhmrH2j0oooorkH1gKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArznvSsXy4ef+0uf3jXoxXnBe14vlx/8AWXP7xpc3RzNbG1ET3H1rILyOTzSO4bcYxR4lK3WcdxHCVfvpZtfODTHxQKySv0NWsS4EgHM+dZpUBTBK6zLxIAyBVrEOBIIdPPNZhzGKYJfxilUvBXY1ZOhMoD8KHByKy8QeXemaXQDzSiXQcnj0q6fPJnlAdoeHnSocB7GmaF55Br7u575pliJQHKl+YJFCV88k0ilfrxWeR2pikZpYxx4gAo8QcYpsQR596CoirqRmljY7D3vX0O58+KaBYo3GrWIeMe+L9NAc98UzLhxR4h8qYpCPHQ98byzQXPp96ZB09q++Ke1W3CnjHfijIOa+Kf788U0U6R34HrSEy4M2+KqQ8s7B2AHc1DmkWx6eWWVI+Xu6C3xQvxA0on8ShnA+1R51N82lAhNNKKh9XiqIUD/ZVXLj+qFrkOLCW0khOex/yqBevEW3xHEqUVSCr6CycfvpEm2el0+kwrirZYNRXWU6/GjSVJLu5SlbOAB5D939tQ12eRGEUJkOKcdSVpRnhGcD+P8AhUGm4vyZK5KvwoTnJOeOwH8KjpV+clOhSkIC0DCEp44qy6NXi5W3pFvQtTjalTLo6pKeA1GSdxPpz2qFu+okNJ8CIjCf2ipW5RPvUZer+61GSw0PCV+0Gz61WfnlP/So8k5JPeoivya3yWhOpn21o8Qh1A7pPapiTOZfbalNIWnen61t/jQff1HatfzJW1aeeQKlrHclOOIbCyCDu48x5irNFHwWMyVOKSpUrxwPqTnvn3qysOtSI8ANoDYyrcD3zkZOarKYapvjLY2+G2CScYJ/Ly4zT22svRJ7LTqiR4e7PkM1KfBzs0Yzl2bQtytkZv7etPEuY7moGz3JmXGAaVktnaoehqT8QkAnzp8HweR1GBqbse+Jk96C7ime/Ao8XnPem2Ynjdjsu+9Y+LzjNNFPGgrwOeaLJ8Q6U/jisckoJzTUrB86PFA8z3xRZZQ/Iv4vHlmvhWePSkC5tBNYF33qLGqH4HC1Y86T3im5dyCKwLpAxmosaojhxwAcGkVuk+fFIlRzyaxKuOKgcomaleppNTmOBSanM+fNYLVgHJ/dQOUTJS8DJ8qxLmU5B5pELIPJ71gpfpUNmhJroU37TzWDihjA8qRW4Aee5pJbhzUDYipcHn3p3YXR+n7bn/ylv++KiSsg+1PrAv8A4ftvP/jLX98VFmnGnuVHpzRRRXKPqwUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXm1e1Yvty5/8Zc/vGvSWvNS+qxf7l2//Muf3jScj6MWpVpGCFYr6Vj1xSSVZT35rM7dozyaz3RzXEyASrseazAKR3pv5/Twfelmtxxk1axLgZoUSOxFfM/Vk8UqCcetNZL2ealMQ4WOPFHrSja+c1Hokc/hz71INgKSD2pliXHgUVIGBg9qxRKUDzivvy/OT50JZS4rAGMVKknwIcB1HdLh7jH3p0FbuxwPamTTYZHfNKtukngECrWJcGOwTkAn86+hfJ54FNg5k1lkE+1XUvyJlAcl4KUADzWSjkelNypKE5Ayfaknpm1PbCqupCZY0PBwRWflUY3PJ7qp21ICqtuEPEuxRxYQPt6Vh4h8+1JqKVLyrAoSoE4zxV1MU8Zl44HtQX80ktBSe2aS+oHOBimKQrx2LKcA7mqxrCctMZTW/CANydqufOp9RATlWcCqTq9xT8hMcLT9RwAfPiqNmzSY6nbKedQrYiqjh9xDajkhsgVELeS8tS/E4QMjdUdJWpK1ADOKaKfLT2FAlJ74pp2YxS6Ra2JKRblFwp2uLAJz3qsT5KW3lhC9xCvyqEgTb5q7VkbS2lbXJv8AfnkrW3BjYKylKdyjyQOB71WJus5UW4O2l23SRf25JiLtvhkvh8EpLe0c7s8Yqm5fk1RwZHG1EuvzpWvecj1xSapRS8FbjjvS1+6UdbtNWORf730zvUSyMNh52QlptRQgj8RQklQxnPbjGT2qoRLhe5miE61XZZCdJmYLeLqnb4XjkE+H3znAJ7Y4q2+NDHpci7iWhckLUdw3LPY9sU5t80tSUFPAzjHrVWgfymvWjrnrK3abmS9HWt3wJt3QB4TK+PpJzn9pPYeYpSxL1LqrT161Hp3T0262GwpSu5zo6QpEYEEgqGc9knsD2qVNFHpcj/6l/YvDsN7dHlKQtPGc/wAPerFZLq/MfW/Ic8RQTgHyz5Vp7TF0vmuLNf71YLPIulqsLCZV2lM7dsNpW4hSsnOP1a+2exq/aQuSJ1qYdQpO1w5Jz/396HJGeelceWi32rUKYl7C28NsKISpOeDxz/GtntSA62haTwQCPtWpLTYHJb0pQXtLQ3IwO5rYGm5apNtayfqSMVbdRwdZgjOPHaJ8O+/FCnsdqbheU9qxJJ+1N3I4nh56F/F9+a+KcOM5pAAg55rFS8nGatZDxVwLeLxXwrz502U4QcY/jxQlwHjsandZXxMcKUc8msSvnvSJe2nB4PnXwujyIqLLLGxVSiBkViFZGT3pEvZ86xzgVG4YsYutfvWCnD5GkivgisFO9/Kq7hixii3M89x7UkpzJPNJqXgeuaTUqjcMUPgzK+KSU5g0mpR3HApJaz9hUWy6jQotzPP9lJlfeklq96TcdOPWhSHKApvGeT++nlge3agtoH/lTX98VFLXkdqeaec/4w2vBwPmmv74qGzVjXuo9S6KKK5x9PCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK8zL+8P09cgO/zLv9416Z15h314Jv8Ac84//NO/3zSMvwZsyujFDhx3yacodwnPnUOuZg8fanDD3B53H79qzGRxHu9a3Aewp0ztCiSc8dqZIUoDy5pZOfIgVViXAel4IBPYU2ceZd5PesiMJwec96+ohIWkHdx5irJiXFCaZLIO1Kc+pqSY2YBxgYpu3GZZ5SM05C0lOAAT5VO4S8bFUEOZweKXQgAeX3polwoBGwfur58ySg5OPcCixTj+R2ohP2pMvJwfI00flqSMnHFJh5B+pRA9M0yMhThQ9QsH2NKBvPO5WRTEvJSBgkmlkyV4HGBTLEuA8IKhjPFN32kueufOskuhKSFKzmsB+MbQSDUqQl4zARQk8KJ+9OUAp7dx6UI7Z2HGOc19Q4fDVsSc+9W3FHjPillWUq70ipXhqwkKPvWSApSz4idpPanHgKCRg8H1qdwlwMEO709xmk3HTnApRQDDRUtSE/1icU1M2K9kNyGlK8wFVbeQsdibzyh5HHnVdvBQqcy+WlYUQkHOB59x+VS0y5IjuoQtxLQJxuVUdMS2+lUlDzYZDgTyvKlHPHBA471R5KaOjptP7ZSNM3keBcZCEjA3kd+3NV+6yF22O7IcJ+hJOSanNRqQ1dJLZdCylZyonmqdq4pkW+QyHxuPbBrbu4H448o3d8CumtY2nQ/VDrTpbT8jUWpUOtWCwQmkJV4h3ockrwryCShO4H9pY7isPiGs6Phv/wBIforqRN0rLuWn9SIRf122HGU841J8Mol7UjJW42vD3HH1jt3rSOv+rl01j0b6edM9OW97RVl0mh52U/FupcXdJbp3LfVhCC3lSnTs3KA34z9Iq3aV+LbVejdE9LrW1phF91R09uUiXF1JNuXiKkw30uIehrbLRKUqbWlO4OZHhoOKQ77PSQnjSUTc3Ty1XG/9aL1rroL8RNu1vqW8CW/I0Drlt9r5hlSF5ZWhKwVKb4KeG9u0ZOAoHS+phNtf+jQuseZBRa58fqY409AYSUpjOBDwU0kZJASQUgZParJZviP6L9PtZq6j6D6C3aD1UcL7rbk68qVbYjzyFIccbAJ3fjPGxGQojKc5qmaR+IKZbum9r0vqfRLep/D1wNbzJX6WTFEx4KWssFrwFhKStYJOSCAU7eciozyR/J290d6J6l0R0l0Z0LmaSU5pbUelpknVV8WwlXyt2kALbT5hRbP0ZP8AzSDXNHwcdQXvhY6IddZOpbUibHs2rbZY71AkJ3ZYW4uPIGM4JCSr1rTPUDqnrrXfXef1WE6Rapa7q1co9mYnuGO020UBpkkYChsQkKO0biVHAzirV1b+IhPVuydVLXG6efybPUC4Wy5TXheBIRHkREgKUhAjo3B3aCckEKKjlWRi1Mp5sf5N36a6Ft9CenPxbKsbvzuhNSaQi3jTdwRgodirTMPhgjjLZVtI9NpxyK5y6OTknT8bx1naUgAf41Y+n3xTan0L8M2qOiVysCNR225xpEG33ddxDK7ay6jBb8PwleKlKsqA3pxnHbGKbpNLVls8Zgup8RIxjcO1WiqMGsnGaW06H00ymMSlSi4h1IKXM8EU9s8hVsacS1tOHCkBXPAJFUzR15MS0peD7To38sOLxkD0Pkash1Han5iQmS2wV/US6QNqiex9+9IySl0cmOHHNt/LLg1LDqEKICVEc47UqX8njGKiIcyA7KTFFzjJfWBsBUcL+xxincllUMJWt9haFZAKHQeR5U6GRKKTZx82inudR4HvjAnFJqWM00YdS8nKFpJHvmslKUO+33xWhStHOeFp8jlf1HIP5UgtRCuMZFYh4JUMKGfTNYvOenNWUiviPpc3kEjmvhcps4rbyDivgfITg81Fst4hwVV88Q+tNt+4dsD71iVHd/lU7gWJjkqzzSYc+o/akS53GaxLmBntUWxniHCl8cnmkFuY96S8ZOfU+9fFuZ+/tRZKxGRVkd6ScWMYJ4pJT3OAf30itzbgHFFjFi/Ipv7jPFYKWAeaTU5zSK1d6LGrHQo44CfanmnnANQ2v3lNf3xUQ44QBzmnmnXCdR2r/wBba/viix8MfKPV6iiisZ9CCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK8vdQD/h65nH/AI073/3zXqFXlfqKYr+Ud0CU8CU7yeP2zWfN8CsisYPIeKyoEbR2waVjv7AcjJ9awBD4I349TSkZhkJKg7u+xrNfBmcSRiuZSDnn3p8w5uODxUckoaQM5zTlh5Ctu48GqWLoeuOEn2FKsP4OB2pqEjPB/fWQyRgnzo3IpKNj1T2QQlQ96yS+UkDAB8s+dNCFbwoLAAHbFffEDYypW4j18qm7FOND5MwDjIKvasVKc+oDBHnUZ+kE7jwB5ZpVEhxKM5BJ86uhMkLbXEqypXHnkUjcGnn9uxJPnxSyZBW2QrKlUu0pL2Eq/gat0Z3GiPiRXVEFa8Y7DNSqec880mY6Gvw5BzmvpcO7A7+eKluyjXAolSTkL4OKcsAAfSvdjyphjxV7CopyKeR2fCwACfU+dFlHGxZtYJICgR60o4yjGBk57EeVIKATvUjGPMAd6wamtoVz4mfMYqUxThTHCGFoIV4gA9xS/ioB5UDjnGaaukvEKwNvuO9Juxt6FJCQk7eMetTYtwNfNW+/dceqb2jrLdGtPWa3RV3C9Xx/+bhRkcqUfLPHGSBwSTxionQ/Tnpf1dvF8sfSTq/qS46zhMLkwWtQwEsQrmEDKg0ralQ9MrwRnOCKlfh9tS7lr/rfohuW3Hv2r9JSINnbeVsTIeSFkthXYZyPyz6Vpjoz8Ieruo96mWDXGm7z0703ZIr8i66iuFuU2hoNA8IUsBLmSOCkkedaF0ekwYYLGvbdl80108iP9H4/U/rdr246F09cpDkKy22zxi/PnLQpSVLCSkgJOwkHsRhW4AjMf1I6dxLV0VHVPo/r+brbRMWY1AvbN1YDFwtjq3EJSpSMAEZW2MYz9SSCpJJTYOtui7r1m+FL4edU9PrVK1rbNFwpVgusK2sF6Uy9+oQFlpIKiD4GTgdloOMHNMtEaauvQX4NesF61tbJGnpfUGXb7PYtO3NpTL7ikOErfDShuThK1q5A/mU+oopNm5Y4xW1Lgh/jS+HK8fDDZ9N6stV6maj0zeEpblSZYSFxZSk70oO0YCVJzgnn6T6V81L0R6L6Es2hbj1K6p6n08vVWl4V+YTCtwkgOPNpW4gFDasJTvGM/vNbu6y9UbM18Vt86K9RXT/q36gabtcBb7i8C3XAtYYkJJ/D9YSCewISTxmtDf6TjQsjp/M6MaUlOolSLFouPbHH2gQlxbKUNqUkHyJSTz60y2R44J3RM9f/AIbOgXw8LXar31e1c3qeXZhd7bBVbA42+le8MhS0NYTlTagQSCKX6hfDz8PvQyZYLXr/AKxavs18u9ojXYMR7UJDaWnSoA7kNK43Nq478e9Vr/SrwivrtpAbclOhLcPt+vlVtH44er+j+mnUzpzHv/RmwdQZ6dHW6Ui53WXIbW2jxHgGg2hWxQBQo8g5KjnijslKN9FCifC23A+LLp501GtHbtpHW1pkXi2XyIwG5PyyYr7yQpCxgK3MYPHY9gaYae6FdLYfSCZr/qd1G1Np6IjVE/TzAtcJEgL8BeEqKQgkEgZPlXQ90xc/9JN8OF/ihca03jRsiVDtiUJDNvR+jZw8FvaB9OefuaqOnNSag0l8IlwkWHpZF6ry1dSL0hdql2hdxSwnxD+tCEJUR6Zx51AbI/g1dqD4bbC1fekFx0Xr+Xqfpr1DuKrZHuciIY81hxClJX9C0jI+hQyUjkeYIrWetIzOl+tF+6eNynZEaBqZ2wImuBIeU2mUWQs4GN2Bn0z7V1Z1G1C5L0D8OnUbXukm+kl6tOr0QoelGR8rFMJa0lb5YIT4JBJUdwBAB9a1H1a+FnqXcfjyurFs0tdZ1jvOq035i/tQ1qgiO68JBKngNg2ZUkgkH6e3IqbZSWKL6RO3r4ZuhGnOtMzpfqHq7q236wXc2oEOGxbAtDvjJQWiXA2UjJXjkjH8arvVj4fOlml9VzemmgOpOqNTdYxdI1pi2GbbSmMp1bqA4VvJa2hCG1KWVZ4Cc9qS6sXyFrT/AEoNvudtcTJiN6wt0QPNkKSpTS2m1YI4Iyk81LNaptfT7/S5TNQ3x5MS1N6mfjOyXMBDSn4amEKUT2SFuoyT2HPlRbLbYdUO7z0j6C9L9XxNC61666gj6yYKWLlItlvSbXCkKx9C3CgkAbhk5IGDuKa+aZ+Eq6xOves+nvUXWMu32eyafXqZi+WNCVfOwwThwJUFEHCVgp5OUkAkYJ1d18+FPq2n4gNZ2SHoC9Xk3u+SZkK6w4bjkN1t95S0KU+BsRwr6txGCPtXbtsvdssPXW56LKmNVv8AT3o4bTeH1qVia+hpO9lxQ5GUoBODkeKR3BqLKrHC7o5t0V0i6O9XBcLR0i633+7a2gwnrhEtl+ta2WpCWk7loSrw0848gSfPBANQ2nNM6agdDbX1P6z691BpiLfrg7BtFl07EQ7LdLKil11Yc42j1GMZHJKgKv3wadWNJa9vGttI6d6PWXpnebnpie5Cvdkfdkyt6WuW0qf3FIKfJPpzVb6YzOr3RL4YtDyYGjrN166c3uTJdd0y9ZFzXrHMB+pKykKUDkujO36TuBIyARl9kXykTV701H6ZSNGXvS+r3NbaC1fHW9bZ8tnwZSCggLQ6ggYPPfA/xq/tlLjIUofURnnvWsOu3TbSej4HR7Xll0G70y1HqsSDdNLKcUnwVIKdqw24coCipQAOPsK2JHiS3IrbwjvIISMpUQST9hQp1wee9Q0tz3QXAottIyUJ+qsACoYIxSSnnFjG08Hk1gt5TZIHPrTlI4Dg7FXkNtpBKSaQL434Cf4UnIlkgJAB9qbp3E4yU+hqyZKgOkuAqJINZqUkHI4yKYLQsZJUVH1pVsuBICgDRZZQsyU4E8Z5pFx4pUME0k6g71bVEkc4NJE7x9JJIost47HHjKxyc0mt4pPOeaaEuBX1KCT6HzrEhxWMglPtUplljFXJBFIl7J5VmsHG0bcZI/tpLYEnntRYxQQup7d2rBTpJxWBaIPmKxUrbgetRZfx2DiwSMkU7046P5SWof8ApbX98VHuK24OBTnTi86ktR/9La/viixsYU6PW2iiis57IKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAryj1HIS7qa6JyQoS3SQD/XNerleSWpFn+Ul22/Usy3c84/bNZc3wUkhwsFaPpOB6Ad6cIbPggKIa9k1GRmiW/rUoADuTxS2wL2p8UnHlmsl0hLRKx5DKMpU4Vn3pw0tAPHPNRSfBjnctSUk+ppwzLbCdyVhW7kAVV8i2iZQ8oDgZNZtOqcUdycAVGR5mVfWrt2wMUuJyuNqU4PbJ70VRVofnxDwkgJ96YvpeaJyMhXYg1ki4tuNYHJzyVcYpZLnbaDn1UOKuhbQg02pIGUZI5yayTLccURgoHfntWcqQjwd2/apPcIGaYm4Ngj6Fqz/S701MXKKJptSUpGCFf0tvel2nfllJG3KSM7gO1REaV4ysMhCVEeY7U+R4iDuJyPQciq8iWh6iU3IJKgoe5OKSkym46tqELXnklKvOkBIQ6pLZB3e5xQqEkLLmDkjnmosXtFWZZe/EhzaewPGKfmZ4WNqVKyO48qjVSAhQaClIVjzHFPIywBsWSc9xVrKOCPoubxO0NJ2nyPBpw1KS4n8WwkdsUoloKSkIAKs9yO1C4wKhgbcHkY71Fi3Ew8RaDjJKc/lS6HCAFbfqPn5UioLLhSlKe/c18UpSRjeoHsTUlNpSdedLhqiUxcYkty2XaKsOx50J0tPNLHZSVpwQR6g1D6j011L6i25my6w6j32/2NlISYMiYQ26B28UDHinjuvJrYyHXED6tuPYc00n3Z2O0rw2FFR/axxV1JrgfHLOK2pmo06D1P0TW/eunerrppGU6Eh5ECQUtydudviN/gcA3KxuScZOKpkTS+pOsuql3fXuqrpqe5NJ/Uu3GSpwsgqzhoHhtOf2UgDntW7dWSHZmnXPEAcWRlO0djWrNL3X9G31GDt3HYrI7DI/zp0W2mOjlyNcsbXPps9r7WM9WpLrcNQTQyGfnbpKckvBCeEp3rJOADwM8eVWG7dMpur5Af1Vqi8anfYbLLLt7nuylMo77ElxR2j2FNbiqWrUVxchvrZ253rRxhNJzjcVN72M+Ge5Urk/fNS7fNhGWSXyN7/0/m67vBcvV+n6jnoZENuXd5LktxtpJJS2lTiiQgFSiAOASeOTVS1/pG83O6Jc1XerhfpcZhMRmRcpjklbTKSShpKlkkJG4kJ7DJrdHTazKkwnLhJKh4IVvB/CT5YrXXU68olX6QwykKbbX+MDlRx3JqYO5UaPcldlIFw1rIl2iY3r/UiZdjStu0u/piQHLehaNi0xzvy0FI+khGMp47Vnbnepmh7I6ixdTtWWJiRJXKXDtmoJLCHHVnK3VJQ4AVqPJJ5PnTQocQd4JB9u9OU3RSdoLIUUjuoZrU1TKrLP8jS6W27awcYumu9SXrVs/BaYfvFwdlutt5yQlTiiQM+XarVaepHU+Npx7S0Dqjqi2aYSlKW4iLi4VJQAEhpDgO9tsJGNiVBPtVXfdeeOVkn29PtUpYXWUSP9rUUtkZyO+aJJJFfJP8mMDS1r00zHft0mU1fo7yZDM+K6pt1lYOQtLgIUFg4OQcg1jK0OvXF5kPXaZLuF1uCy5InXB9b77qsfiWtRKlHAHJPlV7TAgPw0z2pDYDZ+tKxgn04pTTIiwbz867KLrWNoUlOAkk8HuaQ5UVfkrhklp17rRYNLJ03beqmpbfYUBLbcduesLZbSAEobd/nG0gAAJQoADyqO0z0ue0c9Mcs9+uVtlzmlMTXoMxxhcttf40OKSoFYPmFZB862Em6MjgtvkK5DifOlkx3zJbeLm9rGQkgA/nVN35M0s2V8NlJt/TKXYpsW46duc/T9yjpUhq4WmS5GfbBBCgFoIUMgkHB5yajNKWnqd0dnynNCa8u9jE94uymkv+Iy86rlTim17kFZx+Mjd71uNl9QjnOEn+j5GkVpbeU2laUJwSo4+x/zoU7FrPlj0zTlw0fqa/317VusdQ3PVd7ZT9Eia+p9aAOSlAPCEjk4TgD0qU0rOnXuSpT0x9DEcD6UOrH7+efvVq1nKRbrG6ppSUqUdowOcHv/AAqO6fwVQrR4q0hJkK38+afKmOqsHlnJO2WSO6+UpAO9AAwVHnFOC2VHj6felAVJUNidyT5g4A/jSZfCXiCg9uMdjVVIybWJlsBYBzn+2s3Eur/mwFewoWUOJOOD96wQlSVp3LKiO2OM/erqXBGwUZSs5CxWaiEgEcHNJrIUcg7VDvyaYvlby04UpBB7DtQnYbB6shYzvKcc8DvTJUxlClFKiFegpKRO+VGXFb88cCmyNkpRU2nYo9iTVky2wcqIkpKkkn3rExiWwQR7Uig/KKJJJJ8vKnCJCVJGSKncXUENVOJCinBKh3zSLigCTnAHlSkl1BUfq5/tqPW4pThAyB64qdxdLkdMvqWSSCfSvrit3J/dTVJeJxg496+rC0pI3DNVUi6iIPy0jgg5FPNMuh3Ulp2n/wAbZ8/64pi4vAO9O6l9Nhv+U1pKOP8AbGf74q9jYw5PX2iiilHpQooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACvIDUMxLOprqUpUpXzj3l/XNev9eQN+YKtTXdX07jMexg/wBc1mzdIhg1IkOKKlJO0jhPlWSJzvh7PBKXPQDvSK0JbaA37D5nvTFapTTxU2tTnHAQnNY074KUPTHckujxVqST5KHIqUhJSw1gArT2JqLt0sKWpL6yt1XkU4x7VJLeUhH0Iyn+ikZok0uitEwiS3hKfD/IUoXt6go4SnHn3qFa8cublpITjI4OB+dPGXUKTuKSD60sW0PWlNtKOxICT3PcmlHp4CkpUs57gYxn99QL0wMyPpCz9xxXx+5rdCFbcbOOBnNNUflC2iXckjeUpWpW7gkYApLDaXfpWHFJHKs5CRUTEkoLxcAUcHIJHnUixKKkYDZI9AMH91O4QuUSUhrVhP0gcfs8VIoTuAUSoH71GQ2zJ7HbyOacqV4Kdqty/Xaaq2L2D5zckBaEBax2z5V8+akOIUXilI7BIFYNOrbaJKSUYyDg1mxMQ+0FknzA+mqORVxFreXnipRSgIUeMjNSjS0JXlaOR50wZxtVwe2M1hCdVJASHiAk9uM/nQnZVxJgPpSgkK75xgV8S6pKcpV9R55HlSBc2qAwc5rJS0qSrIJBpdi3ExeeKgQFJ3+WT3psuOuSANq2vMrCxg0i408wNzYbKQe7nBxSXzsvOW2UqST33YqyZXaSCEuN5CyFj371kUggkj8hX1L/AITaStvetR5APah2Q0okdh/bV0yNpEXJKFtuJWnY0ATkp4FaETIbXq/IwG1PY44Hnj7cit/PTy4pTaGFbAcFahiud9UTWXNXSCwoeD45A29u/en4n2WS+DYVhRi+31Y+tIw3tCc7uTT1qOiRFaAIwVbVE4AAHc1AWS6u26ZJS04h+ZKOT4eFobHPJIPHn3q0RdO3CW02h2VGYjKbCkLRlzcPUgDAz6ZNVnPaa8ONrkl27vCtemDGjvoeUpBBcSCckD2z71p+VYHblLefQ4064pWSlKh//o/dVpuWnpqLbLDikT4jSiouoGx1tPfKTgbhyeCaqkhLFrjLmiU+p9OUJSrgoJBIBHpx39qMb+Ux7j+RnIssyOQlULcRyoY7D/GvrdsbcI/2RZ9foNNWrvc5TqXQ8448SMLTx+VWBKr3cVth6Ovwif8AlUgDHc+laHJrtl1FP4GYsSFBBLfhoUP2+PyxjJ/IGmztiYjLKiz4ix5K+lPl5d/34qfGiy22lx+a3vRypJcBIHt5+1OGbXGCi2p5RVgjcpOB9x5e35UvyK6sh4kyl3d547Uo2YJzlGN32+3tV40Dq61NxkW+ZFS2onJc25SsjyIpzbbC2XNhgnaMFMlwApVk+329KLpoVD6i82lLLycqCm+SfsPSolkjL2sq8TT4LfGmxD4YipJZUMEp5A9OPKnQCVKIZcCgk4WEnOK061cLnpSUMKUMKzjOQcVdbZr9rwg85wpaju/onzx/20umuhE8MX8FucLrSAnapaO24Hmm3ziEuK8QLwn15zUdM1dFajJcX9C1pJThR47+R+1Ix9UouNubWy0XnVjJQlWCnnFMSbXJjnh2ld1zdf0lMjW9lIDRUCPLJz51eYzsYxWWEr2BCQkBI9q1xHSq6a7ShaC2EJyUHyIFW2dJkwXSphKQ3jkkA02T6Qlx4J+SfAZBU8ltJ7Z7mk4balYUpZWFDIV2/KqNOvD013K1FauwweKlrFcVFOFunajkCiqRXbZanw5GyphtLij3CjjFJkSHW1FQSFHkBJ5/fTd27gs5Q2TzyaQjXNTzm0DjzNRZOwdOblo+olBxyD3FM3HXACBhWOyj506G1xKnSvejzyMYrJlaAkAJBSfMCjfRChZHIMhwHxkoKPevqpaYzJ3JIUewA71Jlttw8AH19awXEbLSsuYP9I+VTusZ4yIbUuQgqWFJye/oKBg5SFjI/ZPBp0Ws/UhwOgcbqQdUlHcDePMipuw8YgE5XknAHYetfHEBwjIII9DSm1KsY/PFLJKUgdleWaHKyyxjJSShISFcn1pBxp0DJ7DzzT0uoW52yr0xTd4b1E9x+6psYoWMHd20HIJ9qNPvrTqq0JUCB84z/fFKutKJyABxWFijup1RaFJVt/21nPv9aaun8DVGj2IooooOyFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAV476kvC/5U3YYCMTHgR/7Zr2Irx1v5S5qS8HKUD517Kkd/xnzrLn+CQS6hf84pZJ9ewpYRUOtn9dhJPZJqHXNYaHhNurd9RkqP3pWM4XVfSFbT+ye9Y+eyGiXaiJKxh/akdsc/xpd5tBS2hCVAg5CweSaTREU02D4gQjvxSgkFK8bzz2KjVComqciMf51xTmcEbs09M9h6P4m1ZI7pVwP4VHojLckqU4UpaWcJ2ZzT2Nam2XAvx3XPQLPAqvBRjTw1uv9kNoPkokkfvqXYgpKygpBSnsrPc02Yt7KH95KnXM7gAec+9STJcbZHiZSvGMoHb7Vfeq4KNGLUMuO48NaOMqVjg/anjSmw34LjazjnceAfzr4yHPDAJUfdZyadtM72hvG7+r71G8q4jmKE+GABt+3lTlsJ5JTlXqRTMFtnJQolQ8qQ+fkhZyApHrVdxVok0rQpRA358+OPtWTr/yoUpSTsxyc00YvKUJTuQVbjhJQM806+ZW8VJcSkIxxkZxRYtoi/02+++fBRvSnngVLwpLiwFuslGfamjVuQl0LZe2HPPnn8jT5+KFEFCyhJHOKtuortElXtnxy1naRxk01nrunj7YqAGlc7s1hGsAivuOFYdcJyd4zT59uQ8gJU4Ao9iMgAflUJ10U22ZQY7rYAlvb8jt707fS2gAoI+n0qDfusaIPBe8RwoP4yc8/eskXSPIH0pynzOc1bnsrKJIOSikp5GPc03+aStwpUUqI7YpB+RFDe5bu0ZxjNRlynQWmlFToIHYBWKsk2ym0R1lcFwrM85Hdw6gfhSe4/wrn64NLfm7wnC3DnGf8a3PKnwp7JJcDTKuCkq/EP8ACtMXuXsvK2G0oUgubQXEBWB+f+Fa8RKVdkmxeZlkuCErbDTSk5KMcZIx3qxqv18lsN/LvOOpQCpCthxyckg1THrjPgtqKZykKQralAUoDPsM05alSpqS7IdWpaRhKieftTGvyaU0i3s6jkR4zofWQvACkOHCc+4qHfuIiMCSzJZCFHY6y4gElGOQPUZFRvgquqkMvbW2+MO5xxVcvhXDmux215bTwNwzmhRRO7arNv2c2ue0l9pTCVoUMBStraj5HP8AgfWrE6mJKiIYbRHcaKgFJQsJCjjkcedc92S/v2eSVI2uNq4W05+FQyKscfVb0x/bDLsdajlLG9Skr9s5yPt2qs8VyuxscqaNtxQ1IcCXVIbYQSlIB5HJwc+YxTlpotKCnHmiwkHk4/t8q0Y5q66BxaVyl5TlJClc547/ALvSmbWoJLy3VOPLKlpCSdxFR4UyvmXRvZ25NJcWkyYyG1YCk7uST/Yf86WkXZstq2uoSE4yVKCdvHY5rQX6TkKC0J8P/fCBnHtWaZc59tSvHVtx+ye4xzmo8KRPmXwbYuN4hSmkB1aEoXwFLI5H38xVONldu0pxVtw4hsb8eWO/H/fypp/J1YiIlqlH8BASR6j/ALazuOoE2qGiLFcAedH6wpGB37f9+amMa+0iWRNcjdqbKaaLEtsONcpSCfwnvxj8+Km9HX9m0ynN5AaS0UhKj+1kH+NV2JdnGk4c2heCQSO4PlUvL081Fsz8pxS94CVITjCQVH+ym3zRkfJI6PlyJWo5lxSypxYCj4Y9zWw4dxbuKFpXHWggc7x3qhdLIzqo8mQlYThWCfWru+1LfbcADbBV+FxCuRS5NbhVcULIs0IukuJQg9wO2fenBi26AgrwlCSOc8BX51CQLZ8u8JEh0uqQexOT+VSbzzcmOWy2FpTk+GscE1HJXbQ+aeYW2fAaCkn2xmvphoZ+pSNueSKr0i5uIShpwCOk4CVI8j5CpRa3CwA88FOY/Grt+dFF6HyJKHP1WRj0PmKSbeQHFoALe04AVwPypCAUbcJWFc9yORT1TBdTt8QjywMYqthQOlKEkqUduf3UkpWRuQcnypTww22WzkjtTZsIaJ2q2nP4TUpllGz60A0hW9CUc5PvWDqQvIRgH+l3rGQ84jhDQVn14NR7jr6FK2oIGcbT2H51ZMvsHaVqA2qIJ8ikYr4UnduJAqMkTnVMhDS0JczjBVS8J9Qb2Sdjixzk1Z0iVEWeKUp3AbiTj6awOAkqI/I0qEoJ3JAHoAeKYvZQ+SCpWfLOcVNui6VCiygg549MUtYUn+UtoB7fOM8/+2KYeLyMk58qkNNBS9TWonkfOM4x/vipTLpHrrRRRTTeFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAV4z6ybD2o7shtSgPnXshBx+2a9mK8k42g7hqvUepjbmlPvsTQhDKUoAcW7I8NIUtS07eTwcH3wOax6h1RaKsoEWzskkjxFlIyTkpP/bUvb2BGG9Lmzd+IEZx9smr290Z1VAihT9tSUqUhKPl5bDqlb3A2nalCySN6gnI4BODUxpb4er3JuLzd2lMWyKWgtt1D7EguEuhsAAOgYCjzznjABOBWNOUnVFmjX015ZSrYncgjnmvtpYdfSC40PD8ioZq5yejOoU3B5m2oTMaaJC3nXWWBnxnWkJSFufVuLRIHfJxjjJj7Noa+39UtmGytxyLgP73m2UtqJwE5WpI3E5ASDk4PFVqX4KtEbLDbZTvcSjHkKRZQfFS54qwkeRAxVjgdItTeDHcNuUtMh1tpAVIbKwXDhG5O7KAoggFQAPrUpdemN/09bnZk6C03CaSFrcTLZcwkqCM4SskjcQCQODwapyu0VaK608F42AAk8qxg07D6EgAnJ+9REubDtrRUt5PJwCkbgPvivkMfPoS6gEt4yFHIz9qi1ZWibS+SeUgjPFfXUbgMKOBzwaZbVMICfNXArEIkMuDxHwhB7c4zUENC7swpQogZ9qytipO5RW4A2o8JPOK+RosV4qWh4KVjBSDzTtbLisllYSQMDA8qtaRSiRbb8NvjBUOeBik/EQoHfyfY98U3TGVtyteFjzJ719OGnkuj6lhOzPoKquGU2nxu4tPuBuOhSSVY3+ef3U5jNyUPncsKb9AD/jmm8aYA6SWwCfMU8M5pScJIJ8wKtdlGhZ6aGG1KCCpX781Fm7vqd8myo/ShXJP505XNQ0CHFIQB5A5NQ867IaUPAdQrjJxyRVkuSo4cYTKcWJikqJ7BJIpJDLUdopCVADjJOc0hEuiXVblICjSkial5BSpOMcjHlVrpkNDR2Kp1SdyCtvOQSrkUzmQY5eWXH1q3qP0BPAFSD0xpDSVJO4j6tqu3amImN3QY2BLmMlLfIFMUvkiiKlWWCGlrCVubc4TuwK1Dcxv1Q2lSNqi5yjuQMf8AZW5zMFv8VtTX0H8KysE5+1aYv03wdYOSUq3EKUc/+yR/jWnFfLKSGrjbkm6Ekb2gvJSOxpZy4OW98sqClBWCkHy9qStr5LwB3IbJ/Gkc0pc2/ESFlKg4j8O48kU1u+GRVLgRmXl9D7e07Wx3STimF3f8RxSycqNI3F0ukrHO4YwB2po/J3toVhXI5FMVFHyqEHJRzwcYobuSm1J2rICTu3DypqsAr4H1fam76wlCsYyfKnik6LUxMRcmNjo/2n9h5Jxx6Eef9tIqaeYWUKKcjy86rkSd5gEeQxUoZCwtLpUXD35PalNUxyakiVZf2ghQ9u9OYshKEgAnB4JFMW7vGdwl6MUk4+ps/wCdKvSTHQXA20WyD9KVZJ44Bx2ofRKgvyWV+8iNFXlxS1YASjdgVXQ+ZMpxasrVnjyH7qSEz5tQQIyEknKdiicfvq7aU0k18yiQ+4l4hOQgHJCvelNqJdqxpH0vNkwVSXmvD2oK947qGOE48u38amdVTkOaPtaGnlFR2hSc9xtOeatrUdx9pYWC2lSSkjIOMjtVF1dGFvtMGI4B4yFr4HknPBqkJX2Uargs+hEqTp1PhJ+lSzvPrVq+aIaSFNK7f9+KidIJiwbFHQH0BzG9QJ86ml3OPsUkqCikcYT/AI1S+WW2obxIyIxdlvjaSc4Sokfupq/fVuL/ANmjhxo91Yxj3p05cG0Zwy47kfUG05obSyoHwmHgVHG309zzUp12RQihJW0FKb35VjJP/ZWbaltuobMdSgeN/pTyOpkPLaJ8THfcc8/v9qcB/wClW1spUfw5xz/Gi7ZNUNoxRDWtTuUr78gkEVkdSMNknYcD0PNJfp+Mt7wXGl7hwdyOKcG3Qpw3hACu4xQv3Jo+R74xMx4alII5+oUp862pX1JCik/ixzXxthEZRAaQvA/Ee+aUKmiSD4SHCecHFSWSRmHhISOSPQimE6OiQkoW4rBHYHFZyFrSf1f1nHdNQ71ySH1NpcV4wPKFjH7jUpcE0NXrIlCzhxwemcVGpuT9ukeG6N6c459ParSl0qSnP6zFIzIYeRlTYUk904FW+CVH5PkWWJSd4IDfkB3BpVKglSvp3E+tEeI1HZ2IGPyrFbfhgAqIz2NAyj4sp8wKe6aJGo7SBx/tbXI/3xUW6Pr+lWUiltOyCdS2lKkniYz3/wB8VdIuonsBRRRTB4UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABXlBYtcXHRGqNSCLbPmfmZ6VnxEqGPCkeIMY9SMH2oorFqfhjIfJYNMdS7lHuFtcdtym24zbMZTiEKUoITLRIKgD3OUYx71K6q6pxbAu3xtNWouRmGhuC2nEJ3CQl/CRkn9gA/eiisO+XVl0k2MLR1aVcrPOXc7At+emUy/FZBcS2Ch95/cojnhT2MeYFM7ZrVbLc9qVZUTm7gpD0tpanE+I+hxaw5kdvxkbRxiiipc5UVaSZLjq1cbapMhFibTMWYwef+v9Y2wsLQgJ7DlKcn+rVYvOvrtf7K5b0W7a25CMJSsKB2/MJf3ffKMfY0UVTfJR7IqyrW2zSGlBL0GQtJ4+pBIqfZbdQnaI7jaeycIPAooqq93LIaIiTAuLLjjm99SM8BSD/lTOQ1cX0JJjvgIPDhB4+wooqE6YtkzY4a3UCQ7FfKxx4mwjNTbZeOQhh0f+weaKKs+rKma4spQ5ZcA/3DWKWJbQ4ZdV90GiihEMbSnJyUfqoqsnjBQarjIuk14oVFeaOTgpQcH86KKtF8FZGC7dc952xXV7jjcpKjis2NOzo6lOFl1zfjdlJwP4UUUKTuijJJu1y29pSw4APPYeaV+VfKsFp5RA8mzRRR2UYPQ32ElfyzpxzjYc0zmfMOxXEsxXUupGS2ls88+1FFNii6Sor8+DcH2gVR5COORsUSRWprlb5v6ccUiI+Vblbf1ZPl9qKK1YxcopmcWJObSguwnjnyLZ5/hTa4zJDilJTDkKI4JKD/lRRWhIpJUiIet0v5RShFfJThSf1Z86YvR5YYTiI/uTnjw1f5UUVb5FVyRDybp4m75V8K7Z8I/5Uh8hPyFKivkK/wDNq/yoorRXCIikxWFAmpcI+TfHn/Nq/wAqmGoM5tvAivhB7Dwlc9/aiiqyRSuRVm2TF8/KP58v1Z/yobtc8PlIivDJ7+GaKKoy64Ji3QpMPATEeOD+LwznP7q2VpHEmCltcZ5DyTlQ2Hk+tFFJyLgYuyyFBckJbSl5K0pyU+ErP/8AlUHV0OTN1HHZQy86gBIJ8NXHP2oopcVVsZJFsYsrLLS1pQ85sBxuSQon0AxzTq0uqmgJbYkNvk4zsOEiiioUeA+SXmJfgtFCmnnCE/VhsnPtmqpPuU5SgGoslnBOQlBxRRV4pFZdkrpuNImM+K608HQeMoIOfU1J3hy5RmULZYdJB52oJ4xRRVb5L0IQCqeUlTDjLhAKv1Z7/uqVYs8phwLabc25yfoPaiiplwgHbjT6hjwHQfTYabGzvKd8T5Z3xe2Qk80UVQlHwRZYUvdFeQORuKDULcTMjLLjltW+lPAWGzk0UUxDEkECc662T8i+165ScU/BkuYIivbcf0DRRVvkKobvqfZdALT2e23af8qzVHkOtkGO8AR2KDRRQ/wWQzFtk+GrKHlgHvsPFO7BAlfyktJLDu0TGTnYf6aaKKIgj1+ooopw4KKKKACiiigAooooAKKKKAP/2Q==","1711553453"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyaNg+hBb1kUTyhx23vyBeg6wyIXhtmXXtOwDG5fOJB3"},"signature":"7pDmxiGewhLciJUYNthCAKf/bw99+rbT5sk52OASyGBXlgKV5whg90DSuaFVop1Fc2WZnIQB3BC6hwPHgHEETg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["000000f"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyaNg+hBb1kUTyhx23vyBeg6wyIXhtmXXtOwDG5fOJB3"},"signature":"X96VBFUdx34GBU2fpMztDplWVvXlvg3ZEmXVNMkr25kBGeo/0ICkdBg/KUM7APwm0Vl/7ZfPwbUzqgFSZIGBQg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["000000e"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyaNg+hBb1kUTyhx23vyBeg6wyIXhtmXXtOwDG5fOJB3"},"signature":"BaiD64+wFJo+IpmeecG445gdToKkjvq2n6Ti8jltvzcS0wWhbXZrJxN7vuit9Odxx7ZWjegBPGlWKZMDj7/2iQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"bg3RgO3IE6yFjEDvgt5bFIZrVHXKCVri2Gq7f4/NqO5HCm7JccNs/vPYRyOgBeXoWqS+HOWBedExs+0GCsSd/A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"JU3pidk5ML/NhxrAUjRHMwfhDT2ja+JsXQKLFzmBkmAYgIKh+ebAClqPr7oaxstE82c92u3VKBkH1tHy3fcHAg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"zJRzvyp6uEsM2yxA92s/Nj+/Qyl5rWdL1PPc2qkgxZ5yA8HW/k6uZZGtKfZFMq18/Mg4YffTFgoCREtwlHYZZg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["000000d"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyaNg+hBb1kUTyhx23vyBeg6wyIXhtmXXtOwDG5fOJB3"},"signature":"z9RLnASsqoPMYG2Xi3/3XyWllV8BAaz9UfTF2Eds5FJken3nF7kJt8LaSH0hlkelvzrMF7Y7p0SKaX6yOhjH4w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp","send":"","pkg_path":"gno.land/r/demo/memeland","func":"PostMeme","args":["data:image/jpeg;base64,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ggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggP//Z","1711553718"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyaNg+hBb1kUTyhx23vyBeg6wyIXhtmXXtOwDG5fOJB3"},"signature":"1Pd2Y7iVyfMO8KsyIRovWov/NvTTPB47DrFAmrOJqAkPT5QpGUUmJSDcug9cWlT1SpclYkj3RlozAsBsLPSpcA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"PmfL7CO/I5mXIxe7XerQn0nduqArmO6lnl5Tapg/+BBkESjytdU6JfaUh4yAoULc5e6DAzqqQFOC1WOR7pVD0w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp","send":"","pkg_path":"gno.land/r/demo/memeland","func":"PostMeme","args":["data:image/jpeg;base64,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ggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggP//Z","1711553787"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyaNg+hBb1kUTyhx23vyBeg6wyIXhtmXXtOwDG5fOJB3"},"signature":"kpzQc3RbNKxOmMaVNNV1GkZGT7IjFAAmJ4Qndr1X4IVHjj5+IJqePmzziWYi+VRVaroPc0LA7Xi2iXWvrZILEw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"eZ1thr4iGD1jyXcQ+7wwIqWSyPet0Ms+wNQAMMOCz2FJM+suT36i0921T6Znbr5JwwUVpRyvtQ2PlaeAwoq0Rg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Mp+k7GgRlNEws6vkzHgwlgtq9Cvg4mn0j/Tn09J9lxEa5PAIlAKOZfVEcKONX+1oR+sL9B03lBANobW+AJHecQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"2qyp+EfHCVA4IKgmGJ1dDn91H1zEwtmxu2ePmVZCmMcnsgynjkyuSSaC1KfhJ6fiBs/3kJkNQI46PfGOgGZoNw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp","send":"","pkg_path":"gno.land/r/demo/memeland","func":"PostMeme","args":["data:image/jpeg;base64,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ggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggCCCCAIIIIAggggP//Z","1711553850"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyaNg+hBb1kUTyhx23vyBeg6wyIXhtmXXtOwDG5fOJB3"},"signature":"Y7wavr9RDUGIho2HdNhQNw0oKci+i7ZdAeFBF17w36tK7YR/qSm5OCfDoFYfho3fsC1u4TYM3XPWmMrvPyvceQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["000000f"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"tOhcQ3mhn8cLDEoh96YCZQOnznLkCQ7hCQpZO9+XGjQKFUpRvruHdJQcc+lMRVg4NoqyypV5ZR0l5VpaOOfRtg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["000000d"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"u0dmNqPLQ/X25WLTeU4FTADM/IZQqRVhCzoDl2OBbp1xlU9CvooqMbe0pg1TOOOJ0olVCubLQz6UnY4JqZsG9g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["000000g"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"Nbi4ZUgAbB0OIU3yRMk4tDxPXapnkGNQUVmDqbiJyrU1emfEK5KpR3yJgVUk3rgXJe3FS900FYesMPZZBfohKA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"ICtFQ/ply08ZT4QHmn+ffCGtxseOK8j1aNQv/p01CHpSrJvG77tFoDQS9lY7+1bfeZ5nU/hhBNycIURKd3wU+g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"GYJt4HspM6ecrse8DNJHbjQ5bhdmhts8XEIvJMVke2soIxhoXJc+0kq94/BRMJP5wV49ngKDVvJrfGhDUzMFFQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"GXKYbYpUk/Zq2p6Q6+HVr7pGWrMnMx7n20MGWa5djnkGfX+P1NdMLKaHDD3XjkY+/VLW4IjvopthgxigrQZEmA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"o+cY4+WFxzKRrxC4wI0RyNYRoP8wLv35oQU6uAc1YqlenQ2t3Fzu3KEbNAbxpiYq427gtjliWcm1ghNLEf95dQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/test/test1/whitelistfactory","func":"NewWhitelist","args":["list1","1000000000","1"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"HdQaD3KBaMxAk0CYqsrIze36eIgMuRzKa021YXRBTn4i/VpQpsY7ZBLfUdxLLBYP2zHWx03Il6FnUP1yOd+scQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/test/test1/whitelistfactory","func":"NewWhitelist","args":["list1","1000000000","1"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"6jFkxrJlKKC7/rnr6xVzcQD4ujO7mjJB34dXNLQyh5Ne7izpz4gsIWh1dv++igFl9Cg9MAFnNTuZklR9E2LPwA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/test/test1/whitelistfactory","func":"NewWhitelist","args":["list1","1000000000","1"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"ccdtxWPCLIvpBuVRnGsD1BujKIrxx4E7kuoTWKJ7e6gE9NFq3B0v8uWtAzUX4Rfp+IytrjyqvwUxoRUvpGcH2w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/test/test1/whitelistfactory","func":"SignUpToWhitelist","args":["0"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"Rk07d9V/z/7mvlBsEHEEt/4dzoKaBgDmsC4C67Uap45o5Gq+GNRoOC4C7L3AFiPr+s1PsdBxM5k8ax0CLbm0uQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/test/test1/whitelistfactory","func":"SignUpToWhitelist","args":["0"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"dQojBTN6nT7Lg2PvdftIj6ve40pgz6oG7NdtX/IFyhtoeQ+9q9U1/NFQxmJJ8garOwY9OCzDJK1AnX03p0Q73g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"N6JlCbzWGuZ5nhauEdL8fxAq8lhQIDBlf1zTBPP+vCJ0Mt5Db598SlRN0lVGtQcS6WQZHuEYaRFglKE1z4KzWQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1z6qs6t88rhlafv6qqu5f5xxsax83zczunsc0v0","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"wafhDvxVykFZQtmJop0/O8KG456YHgSuL4/FzVknLEVpDGYBcLLyKGhQ/ImmJOLvmpwWW3JNerNqe3LU+CccnA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1z6qs6t88rhlafv6qqu5f5xxsax83zczunsc0v0","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"hcJ1zo1FqsB+yUU3X84ifIZiEZdkQ1ak6QacVUHu3fJ7c5Fub7O7IQIsYyFVK9eDHWwtSkw2nGt/7qui7EzDvQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000008"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"DwQ8ZMwD9kHgq9D5wMJg8LccdAFKB8ZDmbT5ky8QCTNt1l8pl+9+oCtMDThdxNoYMiN3Mq+mNBk7CNiW0OtCsQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1w8cpkflxysztll935x45llywtz0rdwajcm2lwu","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"jRLUGQYLeOksAPGlwRbqRcZN0V0xAZC9Hfnfmwfw1yA5l7mtL3zhBFv9MYkGIjHoSlugOn9IzvSqwwXynn9T8Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1w8cpkflxysztll935x45llywtz0rdwajcm2lwu","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"M4IlmI1xe5uuKgz3hSpfOihO03OT8Kf19iryjQ/PV80JweZsJswEWDMdFSe79e+voKx0lk6lbsnFZwq/6ewGfA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"7z1wDnM5J5fJI/b0sNbJizKlgcv0kLtWbZHqqwNdtbkt3qc2tVCYN303NWQnQUfMkd+esb4FAIiQRaK0xL/7gg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"9oO/LRNZ5AAp1PH18Z1xwxv5ccCJIEAA06NSZtqDoLwE88AOgU6tQWAi98viTEH4P+TlFY1+NHNU+p3nqXxOVA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"CAI5JSMGSQ25FW9Y66ChW5fKB40ruv5U8g33k5Xmfe0wwPOULdm1gFlw3wJh9+PvjyZmCEf4/4Xb/ABXGtT3WA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"aPHGmFt308R8/Aszso3WZmisuqyagfRdJ9FvcF2JA/hTunRsDijV4+NM/Ut10nehsSy4CST+9b0l9HN2Gc5MGg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"jI3fOdTH/fvvqmD8wVWX1t+dTvS+ESkESeCbRbkKJClfqyNKPrpUTvj8rTMYZO3labPtFR2qjK3WXY7CvCHtJg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"ULsk/M0UHjLXTTOoRE0OdOSxxOgt524ENIlehqQo1cQYqGF77GllQTwrBj5I9F/vnV4vAFMQSfVEl78ISrZe7w=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"Z7IH7C7X+71aDczL7TwJ4k1Xpz+bXRYB2K0BbrnN5llmyEWKWSnwltWnV1dkGs0lGec5U/prO+sIaGFIQE0TLQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"uJw1Va+qkRBjLHvqi6SDlYaFT+4m2XzHye+Mw/uAiww3NIJ2guEeRzXbISbRZRX/j+sanzszDqBrRsd5hHQRTg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/hehe321/hehe321","func":"Func","args":[""]}],"fee":{"gas_wanted":"3000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"rif3SzCpSHCfz1YQ2qnYTQme32SimH/W+Gp3rcNsNDRZ4LjDSdT5/mfggmhryP84i77XWmnzQtqJ8EQn4kcDNw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/hehe321/hehe321","func":"Func","args":[""]}],"fee":{"gas_wanted":"3000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"gpayqT1BSrDcmHb0KYwPTKmV1ZYNoCv9Or62PhmmxLEenhzf6aMLHySsvzW16ofyp2ZdX+nDu5i4d+8PuGZ+zw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"U7H/NSmXm2atT5W8Y8oe+qMob4N+kf6en+ibX0CLOg8Q87+n5nDbsVCi+U9wCfxMN1oFeik4OwZ3nSKFvohBrg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/hehe321/hehe3211","func":"Func","args":[""]}],"fee":{"gas_wanted":"3000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"bsn8vJ0CFVyIhNvmom3CIFCUWGnNTdKyUth+a4/GZllq2yQdo726ILwqqTx38t8mfeesSVQEMjGmanO0kqcDfQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"CJbJw1jtEnljiMdGQpm8gCSnaga86YHJMKPL9an6MQhhuJbW8Noqzqp6SwMixk7d7NJI0GQ7wG2lUs6BQgxR/w=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/hehe321/hehe3211","func":"Func","args":[""]}],"fee":{"gas_wanted":"3000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"MpSELpqg/mSUtpRHWxWbehRtqXWSmg6nO4TuHb0HfMAz3BDjEwdS66jIInjwutJIDiNApGn7JG5BSZPt+nb9mQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"P4J0J2VaQHWohl49iN2REA2OaVtp3HLK4XBAhd7fcvUZbyBTlkSmuiticacWd402qtu4GIKQD9gNaZEGZObjGA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/hehe321/hehe3212","func":"Func","args":[""]}],"fee":{"gas_wanted":"3000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"friBp78F3+O6Hq7Qhdiy9lsmVAau66R3VbbVzGfzAFo2neC4U6HWonZpLem5F08VGH9tFQbAGh4RKlVeAO4+ng=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"YiFKYU+9Ej/6n5tRqNqycHE9sNpO/oSXVWAnzaNEPnQSIkVw0wgDzOryjJNfjzoZ2m0BesRXEuw63iUzN67biw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/hehe321/hehe3212","func":"Func","args":[""]}],"fee":{"gas_wanted":"3000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"WcX42iZhfa8O9twE/L0JmBFCr10QtJ0s/Mw0+qoZfaBThEHcH2W6ta86ORcarx7iQnA4sC4f/N/u8FOa0QHf6g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"3/1zVMNr7LelG4GcVgvWbGRapIth6/IzBZNLLmzArSsN84ylBHZm2Q90rHx/xvHYccU3x60AcEzpeCKWADLXhw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/hehe3212/hehe3212","func":"Func","args":[""]}],"fee":{"gas_wanted":"3000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"5UZQ0QVelxsBjDTwXBeZO+52wLlRro6i/VwomwIsTNgH13/2qqm6THgclQKVWca/WkpfeuVgjj/U2DXmtSOhLw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"7LbimryPTJ8SgHUNrLMzgYScOqnbqqpYvtmAZ3gQMbtMEOVqQbdCFgeiI60VfO7ye2MeZgFnU4u9SjFJKAdifQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"tLkaw9rptL0KTU7sQ+1W24DYudrouCxu9AudrIJzBCYDG/52/t8KqBcE+vaf4MPDK6kB02CEhEMcGMyPIGzcvg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/faucet","func":"Transfer","args":["g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","10000000"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"NKlOTFYrcqnBRwyqdXJ0lq+rXezeuKq4qo3imScdmvh86WMT91ZQAWOvVZpkPHvXHO9XfwpyBnZUHyCfQbG5mw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AidlxNTtkl1dDNCgxrSNVJKYWZdC9yrixvgSAP6U6WYX"},"signature":"QncKyVEMBAoeGOqbzvXVlU5Zkji/HAYBGH/fihG6V7xgzgEtjdxuYq05bDjxkkwilLQoj13SuPm7o2b5972UZw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AidlxNTtkl1dDNCgxrSNVJKYWZdC9yrixvgSAP6U6WYX"},"signature":"n+XX9oZlQxl0KLwqqUgM36TcVvHVJkSwJORW8ktmcN4zVp6mfFc0cEOHxEDa2uJJwX0ecm6kh353oWQumafYCg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AidlxNTtkl1dDNCgxrSNVJKYWZdC9yrixvgSAP6U6WYX"},"signature":"xi0ciRLyawrbJT58n4O/ULLuJJIKAf4mQQaTrhJl0wxHArV4CJwq9oS3vDDjUo83qvzbydxgkI5fj5mns9cxtQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"eGVW8KghwK9HbtzvXphRFI56BL2fv3CQhQ0Bbfp5LvBemgdsrxgY6EazLHuXOK8F2G+etmSsXjhF+xtHrAi0uA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AidlxNTtkl1dDNCgxrSNVJKYWZdC9yrixvgSAP6U6WYX"},"signature":"5R6ZArUnppjWtyt21hCbk869nimx6/5T9Xyu2kCWSPUjWZTBuW+5Mz4xSMuFxmNb1kInlSpIJzQ2NEEN++eTuw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ygj7k87y674kmjtgely62hqyerks36zqajmmmw","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g+4gG5FgZ3YQkcrmhIsvUZQVaV4cku+GCGR1SlYKrNBD9WpRlvxGYWzpXdlaUXtsyFn7lZV3Bu+4SPNBGu1/pQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"vPxRhfUfTR0B7I9rjuOhtjqpN8zRm0Pic+CUxLe26kIGhMCqtPbS4L7tGfLV7F7l/WgIjuQTDKQC49QsXdVJFg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"7K5iEqxA4J8LqUQSsJ0uQy6a/469TUzRAEuyen4hTZlh1/VVrX8/2V4OqGKidLhXdI4ml6bbfUoxdkMx6f/OuQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"eQqZ80ZWFNJityT1CX3eVd+ssThIXilb9dMajZ8sKJcWBsU5eRS9Hlobnv+iNZuqmthOQPkOe6UWzxqF41XtwQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"iBBsPiL7SweGbtPDQuv8Mrbp43WGHBLBz0XtqepLJN4hYmQvH3n8pDnYleMeKeC7u1MHRY4r1IHTnU62odLMZw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/test/todolist","func":"NewTodolist","args":[""]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"+T30vQUJmYbh4mnPQY7KP2GCrDThYUOvGX6e2HOCrW0CsHXAEQaUKM7MjhLpaaAfFFRa+Rf41qN1JroHHxyF8g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"PT1xmzMrmJPW45PH9q4oIVRhxENRitPrKcu5Q/4EbVhxynOB+6+6qD+SuPiRi9HmYwr2fWBGfNDyUQ8S3ijWGA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["000000d"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"Sgmj2cboKltgywwGm0yjFsBhBWCrGFIW+vuokul9lH9J1j4YkuexVmExo7hGpG/F1syvpZ9sFRmyO8TyjVMwrw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AidlxNTtkl1dDNCgxrSNVJKYWZdC9yrixvgSAP6U6WYX"},"signature":"idqADgt5wJpD1XIRpNNImdBgNWERA+tRzIfrTnEWlW48Kr0/ql1qAklEZBfbyAUsDPy+hdCo8PDBJveHQ3ILhg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"20BgF9PcYjpr2h+tAggjTlB24jrHmim0la6JbCwsb30KTSwrZi5ZYy1hTMj1mOAlL/E9qkTH5Q9yapIb/2muPw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AidlxNTtkl1dDNCgxrSNVJKYWZdC9yrixvgSAP6U6WYX"},"signature":"Lng6g0CddDV6Jm/vl16WiAlF+25ikKBYLWyTLVbjOTp+OpA24LrD7RyDIRzxRtnq+a+utA6xM5PEZZADa8CRxA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AidlxNTtkl1dDNCgxrSNVJKYWZdC9yrixvgSAP6U6WYX"},"signature":"xh5g/KVXhXKHmfY0cIV34jdzo5Xs05PGSboVPrz7HZN58yV6V8TYCHHDSGUeeVsAsfgmKclwfAMBr59gUIad4Q=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AidlxNTtkl1dDNCgxrSNVJKYWZdC9yrixvgSAP6U6WYX"},"signature":"N4FpqRNyOpPUFz2GXHSeB7Yy4t+t5am0gJsQJMJNUusQRvYXPAOoypNhKkw1KcMEOwyA2H7FhLb4duA0lwz4pQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AidlxNTtkl1dDNCgxrSNVJKYWZdC9yrixvgSAP6U6WYX"},"signature":"UDEF/p7n8FoDpAxRS6rBr6iCyFF6h6vpZEqi7S5llexY305aDYXGrFSiSDtYVaNPx3IpxyarxsJzGuLjkh18lA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/malek/todolist1","func":"NewTodolist","args":["1st todolist"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"u0nUcbzRAIVl8kzsVtNWsM6T8pcQ+eY0f9k1GemdaIJJpR+00etVkbmSkOxBSpg0YKxHq7Mg9rwwCnxfURhHvw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/malek/todolist1","func":"AddTask","args":["1","1st task"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"h0UwyfakCpQbdjLcKw6wLM7ls/sODaG7Bgj9RH0JZJEPebAwHtNNYtLGLiTBQIEbptcg7W7ZOMQwJQ1/EooK9w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/malek/todolist1","func":"AddTask","args":["1","Another task I have to do"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"MaSs2kuVao7VgHlmgRftnepIcgNU85TH8tAik/rU9alGj5OTas+5N+ALKKwZW+r6hwHOE6AkmpWax1mC33UH1A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/malek/todolist1","func":"ToggleTaskStatus","args":["1","1"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"KrnW9XIQLZnzyHqvHEiNHu1nnkZbE7vH6HHS/6WO85pQFVLJ9SK6YpvYDgkZCy5b47cWF/3vZEH/fyiUKrHsDQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/malek/todolist1","func":"RemoveTask","args":["1","1"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"xTOmt/6Q0Xh06/TILBL6JfVWWo4M2U0FFmjgcjhrVrYAS0U3/OCZbsLnDB4coeEs2lxqMa8uoqWvFS8OU2HYHA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/malek/todolist1","func":"NewTodolist","args":["test todolist"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"bggOjeS4H3RUvyD3fmPYsZoGm4Mxc3ZeoZ82js16eVJy3k6MFRyWDC/pPVYHPXLEqtpBZL/M1vnI3gEDZ7b60g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/malek/todolist1","func":"RemoveTodoList","args":["2"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"yoZEmXWoKH2PO0m5dI2ImZKSma4rr6w9nDVDOT+S/hUAXrdBWWRhxT6kRGcEOGtXIR327Ua2CmYSPtoGtmNhug=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g17qkpnddk5n9jpmk2kt3pes5gyf3nh2pvwu7e5x","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"fCKXH2kqTDxTHus0i+dnd+JYs6U6qFrw/CR65beUjM51KbSwCWbtU+eBBt/U0XuSgfPjehIF43UfR3oXRZtCOQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AidlxNTtkl1dDNCgxrSNVJKYWZdC9yrixvgSAP6U6WYX"},"signature":"TarQiXaGCn+L15xb4u041XNcRq1La60Bp8dbQk90zaoYgxBXM6X2+abvoz+astUlOR18SdYLcCRYuND6P7VzLw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"20BgF9PcYjpr2h+tAggjTlB24jrHmim0la6JbCwsb30KTSwrZi5ZYy1hTMj1mOAlL/E9qkTH5Q9yapIb/2muPw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"bkZ9Lc34Iw7FS2YhDiBMaaNVOexELG+qB8jOqq2njEtP1b2C+g5awBsJrsmIphulSZT4ju1W2VRjET3Et1yr2g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AidlxNTtkl1dDNCgxrSNVJKYWZdC9yrixvgSAP6U6WYX"},"signature":"ojkKIwzcYCVR2lyIVz7HLmgvXVFCbKXjvg7+83N7a75nlzO9dgAM9jHBzd+/ohmURDtLG0Lwgyj37TTCXrLoNg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AidlxNTtkl1dDNCgxrSNVJKYWZdC9yrixvgSAP6U6WYX"},"signature":"MN/LXIvQw/ycwqFIkMNhKrvdCsWry1+CKgo2qtOBAD4ReUPAglcrwVTLkI2VbivMONPutreQ4ePjSKNgUb81og=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"xbeCN31wJ21hWrr7g5a6PYEHMQdY2i3gS895FsYTHMFf2RavB6G4rXpcxPQkhgDOS8PxqN2GOeyYCjhuA19F7g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"zcQLonXrBHgAr6ONiaw6hgJM5o/+6w/JI7ieHq6JIr0eK6RmTRqr6BLoo1jyWC/yCufr1BroSKhk25MGRefh1w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"5000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"JLkPognv/CGbFkcp34T3hKDcNRcOrSBMSKhF6OxXZGAP2ucQP6+ojNgTaEFXl5kqxHwJB3oeFfiy4Suxui1Ybw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"YoFniUqtYVsRc9WRMJn3J0gz5QZ0uk+RlRkuULdT+tkn5bElllni0iQo++71hLXbH4rNlF9LbuWZdIfsQAYhKw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"5000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"eoMGeMy3K/CWPuAICvoqkht+/MZtaxOU8+P4HXdqDBBURuVyc+qZFbMiu1OATadlbRTfRwtOCNtwAqbXCTDEcg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1fwz225cl6tjnydt7l7tljqehh8dwnyw3reygd8","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"2utkDy19yWnM0jMviA6NPcvv4uEiKItBsdGV050GuEBBtcmrXbmjOuvk+QLMcD091Rll87wfGO4qqju3T2bMMA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","2","{\"message\":\"test. \",\"files\":[],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-04-02T16:54:33.865Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"nFmrnOdwyuuqoxFOWu0xUdop9JkrLziMMbMCq8LpgZFrjb0xlCvw0pdYs6afVTeAFzskq/q1Uqff80s1152ppQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1fwz225cl6tjnydt7l7tljqehh8dwnyw3reygd8","to_address":"g1y0sdtqeldxe8cswc4szyv53fewkmv37un7mu60","amount":"1ugnot"}],"fee":{"gas_wanted":"60000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Aq4Htr7Ia7/gvrm/AdbdzTDJTp3tPPVrSkNDmo2a8fnO"},"signature":"DXgQDTKbvHP5y6+NxHvtdpgbzmHlphjL0VQ4r0IA+Fgk/oPMqmpbdVd22eJ++azz4/9AXYMeHRWOOUkjpPGUQw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1d598tyfatprdstalqutk62cnzpm3thvyy9mypg","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"ThqQRRcgfENmfkfNK+Vs7ABVcf44g08vMetxMU8IBcIvxzzFx3FXe0pfEe6rOJTi6wElZFhQRT7CA8ETzyssjA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g14supzhx0v5sza947sdh4x74wnws9xvcfwdecef","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"AiQfi5BHlSJ4UqZUtK5B8WhwxAfnKCdkQISn4lawRikA0w8dI4YSdpWDdC4X9p8gvnANUU2B1bpjHas7og73hQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","amount":"10000000000ugnot"}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9kbnk9QMDnREjJVPi+Rxi1UiNFhXkFXtXbWvqkIG1pYkPoPnZ/YyExR4wfUGqXMPDbK19hMfl/1qXeAOgALf5w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"12PjKpcl/xGtNi+4Fypld2/fdqgFlGMZowE0yDlfP7gY2lhhkOTBPYRZIkZ4LGq/tg4fUCcLwOu9jNzyX6ijww=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1guq6c9u0tyty83rk008p56hra0srn0lynkm2ep","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"sImp12N8IJycGJL6Nt00ECfRPCWCHZjJ4oO75Ea+DfIY65WtBY/HCMstvWhm/wgSO5JZb9IILPQhEq3INxsx1A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"V653IFzbNHYn/YomrcjVXIOyU9yy5UZ3KQfprE3c5yslWv01prlGAXhjVg3I8UAEI3Sow5KR8N0LqOKLTyvhvA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"T0m6CsqQE6XLoGNeBvD1kDcT+LJ+ees2oaC2VtKMM7FvXwEkjo7V5+oo3kFNER9XAWVOnNzIMoTGuAMDeGc51g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/test/realm/hello","func":"R","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"jGzC0UdUesJc3Hgn2it3ErP455/hdrZ+kQyv3bq2jzMD3razlnoJc3FLwShKmJ7nosBvJCNGJOuYKc8K53CmKg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1vp2hlcg9ca02sv8l02asr6ktswtf9s20m5mcw9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"YFnk3gKrGaJcFGqYzZMiKRcrMZWxWE0Z9Qo5OHcmeMcfCKlo7BzAtuyZ/57ovBMah+t+zbtva3raC7LyP6QqUQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"2000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"3YeiFODPV7FjctACG6I4cQUII6B9I6L0ecHdHKS5YgR5qTGpyFA8bvF/oHlqPujCuvNUyIRUrkjWkSTi34BYVQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1hqw5gnjkuhy9lwckq5vjv8y4xa8d7j4anlw6g0","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"D5+8mraxYeVEhZ0MC8E84fOBZ02n2uJqu9NheZ/jVXMBu68kQC85AG50cRUJQh3IRRdMXC5jyXn3Gxxm527Haw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1rhanz3z0jr38a0zg448m6qa7wm349fcxurdckn","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"8gEMDe+M/tWhQk8OdGRIpp1juFStPSxq7z1cZKIj0KZg/PFgAEq4uaMPxiHptwJpFvYl4v5eH1DkizDLi74EbA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1v664qx78zhv2edtx6ypdylfpafrqjz8g2rlaea","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ae+cT2Xh7DSSG81yZ/jfoLu0yRqhaVHq9xhkd0SKbPl90IaGq7VXQ2r8+6MP4mtQyyKUCzNm+WC4cMPyO4gipg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1v664qx78zhv2edtx6ypdylfpafrqjz8g2rlaea","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"F0oKcOwTTkJ5I+1cL3aw6AB3Gy2iAI9ETD1P/5+s6Bhz19DQQLgvcxZg3nMfQk1aJ64CbvDjwk1SZkxoUdDhEA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/mikecito/gh_test_1","func":"LinkAccount","args":["","g14mfv59k38r8k5vkevpu0lpqlqra0e9trwp3d32",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"d8ZLqeLyLSQtDxPXxr7eF4CWq3wc8knA+KGt7GDHYaUx5Hq21n3c5SmrNLLKxEIDgzc5Nk+rEyB2pThWBCkL6w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"xbeCN31wJ21hWrr7g5a6PYEHMQdY2i3gS895FsYTHMFf2RavB6G4rXpcxPQkhgDOS8PxqN2GOeyYCjhuA19F7g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9ECiHIdI1idwiXzr14HnpXc30x1LsqWeM0iOu50KOD0ZYQodU23AaMtibwvwF6vy3u3wXHc1iP3EpaSdDQtIOw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/mikecito/gh_test_1","func":"LinkAccount","args":["","g14mfv59k38r8k5vkevpu0lpqlqra0e9trwp3d32",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"Km/9+u0iy2VSVl4kQNkLHPF1jpxoEh4kIPQiyiuR53wAUZT1Z91pncAO/ts7FpQ50ItjkTKS/ImHuHAXdjbnbA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"TK6pZ1bY620sZKE0hxfvfTOpr4/DrZ7Vp3xqvjzkr6AWkM+8JVzjCAP92pGnfiXufOH8747jBY7fjHLGza1+vg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"w0j8SZPAFSJ33tm8xjuFcEovkjyE+K4juWkrik8McDYfZPR9RWn6loJn41+M1yabCWoxv7cZ6N2coyqQKTOi8A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"yhkgTd96uOM7IqSJn2/JzivTkEk7tnANfKS0coJJvOBqmOh2HsOrlqmQT2BAz2EVrNBMptntErFp92G46J5hig=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"jB381TTUw8Kj9t+7ZZgQjKob0ye+f1Y2WrsCXa5IdQ8U5l0+wOPgLP8tdmrmPteWYkNeUPSHwjhwz8jofJPN+A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"7l9zW+1/PP7zIBrSSW7baPBTwF/4Ss0FT8AwTVHP26oYK/1zkoaQuOgBDC710gbi4X/+05QVnqtBBntGOM4LnQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Vx5sb/Z68opRNDLMnohf0TNWEz/XgUPsUse2ndqJT2IAmx8bd4Z2DtEpkU4YB3ao7nUUDmCL+RJZewWIJYtnpQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"LpWshthS3P3FvHRlufvgmvaMkVu4zh8hzel+5FQ8Ngh28VqAf+Ik/vCm2sUq5Jwy1TVyGHn7352wH4A0Am+wcQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GjB4U6fI1N/Zo5pGj23nA5iY3qyU0KCkP6wTlErqPwJJpa4l4JTJNJI+aooV+fdfQx42P2WUT7iFMxMjiNS6bA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Oml32Wo4n89QBVLfpWbdtIW6e1j+8FrP3Y7zu3t6seh8zsaN6YqHCjvZ30tIiAetWEiP7ywk5hEN0lZ2Jf6wTA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"aGJ4FfqmssFbhpsGv/jOBTnS/V7AYFiW6j0mJVyjfgFXOa4uL/LaDRq2jZn+2o5N064CDqoANCy2oECp7w34zQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/mikecito/gh_test_1","func":"LinkAccount","args":["","g14mfv59k38r8k5vkevpu0lpqlqra0e9trwp3d32",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"oSjADro6RlH3FASmDAKoz+EP/A8fwI0nsBWfMPthdD8hWBSMpkr3e+fnAZW9heGLkeQCU2WjnohUHebSQuyD2Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"vtbnNfSzqLdTORKoqOwtNgL9wWnmalvV82pqdvW95FseDJYG2YwTJ+aH4FcumMJ86PsrIdJGDeeWz47jQcUC8A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"5000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"XLIu2R8mo4dZ9YLQVhVinTRLPrEXmzdO/NcmcfUxKCpUAfmgvtC2sVQ5hAX5cF32iwqY1UkVFZZ7Y7zR3x1GGQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8lgVoV2CQu+L1aFn41mf4/aPOZlbE6VPDufUITas+rtKz5/y7xqa2D2S2XefAY+pTnNRxESqCfzSQGeRnwDaRg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"5000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"CWPhxyIq+Ils/FqyK2vhWZVSg7i4STScP+0cZ+eAJ1ofU4T5tYg5DebMRqz1JnnO43VpKP1o2JzrDOfNnqUFzQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"5000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"tk+vRDAovavq6UD/6JjVNKq0oYLBfSrRzIe/gbgJh2ghwE/XfaaUyZKNxsl+Sp8t3I1kGeYEhBeuNsMoz5ThoQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RQ249b2QrbP/PFVkPnr2/CiRiiLCmsBp2nci01duUjBmnZwx2msnJbrCB/GiDTmmqEzb98QrDqlFcxp5rRbGFg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"joTTIv8P7/W8EVsPMCeObJCoptwjYUdQxjjLiU6j7A5CqNcYEQtyI+/r5M7FZA0uUReHkv30wh4LoMrANiqdjw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","send":"","pkg_path":"gno.land/r/mikecito/gh_test_2","func":"SetOracleAddress","args":["g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"3kPSXJ9WHk/1p0zTMPfb34CSIn5Ix8LMCow08DuG9zZ+WD3SEQszxKG9FNJaf9y+mjDtPjoAWmHxXq4lqXMMhA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","send":"","pkg_path":"gno.land/r/mikecito/gh_test_2","func":"AdminSetOracleAddr","args":["g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"U61fvwAh+skq0gQXFBbjWs8Zx2Hv9FkQkGPTIGeOm39fLQcOM8RosShM5yIHdTF9sRl96KILvOEl0Gqu+4wNbQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","send":"","pkg_path":"gno.land/r/mikecito/gh_test_2","func":"OracleUpsertAccount","args":["15034695","omarsy","6h057","user"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"+c6WqDvnvCxDymy8/y59WWPNCPlqaEtAs/SI2q5vWvlj81Bea54qFNGg8ofsf4I7+0ovCkAeqDgOyRXKFKcyXQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"+SBU48qIe8wXNKrJK2/EeYsuTelK2+d0KIhzhxIIOlZSZv1QyCRLvkarevROOXenoREwuCgz7UIwC1I/qBlCIQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"HmxP55tYNcF5tcX/1qdKISxjpYmCPJnW6G+InS8vUSVbQmdiygOt4xnMPu7pJOZPgvkB0bhxYsai6UWMnzwWCg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/mikecito/gh_test_2","func":"LinkAccount","args":["","g14mfv59k38r8k5vkevpu0lpqlqra0e9trwp3d32",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"95SFakbPyajXu0XlZ0bnlzmH9RJBp5aciCg3xXNK7JkjHMqubx0wRy9JacW7sI+gK1AjvdBbVeepTYkjr8UdhQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","send":"","pkg_path":"gno.land/r/mikecito/gh_test_2","func":"OracleUpsertAccount","args":["15034695","omarsy","6h057","user"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"DGSji+8Vm39fpIc339KyGt6tw5FRsIOUJxs+Ty3ifyoFYMYrC28VxI8jpxJJTfgjlnyqcRus0x5Shp/iZvtMuQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8Cv10YGiooUqjRnMw9hBasEd9q4/qcef/Il46Gqb9+J92ogGrgB3FFDVUOcDUE79b33bihJgNUJzyQLVE9/MZA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sI+jidJ7RHkZl+yLJyuEW02JpICD5TczuaHFjZy5SVg14AfuFoDzSogAnUl0PQL5vr85oLgUZzR24owli349tg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"+XxkAsx8OYx6ARxCiz9zgkAPPkiVWPGrJWcpo2TmOFktsQ9B9hwx7pnCIiqfPTH+Lz3T6+DUcYRkDYDFjFqLPw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"5000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"r6H7CVlNwq0v4ktwvd7wfqqZ8GaaDjPaR4z6YiKy+c5POu4we0Fzg7u/E8eG8MJtJttzWAiKh3ciifz/aWleMA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"5000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"UeYE4vkhRrq4QG6pNbUVLAM+zVH8QzReBrUUsAvLpGBjZ+roKydFIYZtdhV4I+UMocqU25VxOJPXJ32blFCnkw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"5000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"hgwU8jtUT/JdvRDadmhuJbiMZgbO3Pw+nPZieXTIvQw/zF2FUT0zrzQ9iupoWVPk4U3ZHuSOyOiZwiG4zdsYNQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","send":"","pkg_path":"gno.land/r/mikecito/gh_test_3","func":"AdminSetOracleAddr","args":["g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"F7FQlXZM8zrDl4DuoJo/3bIPwpkniFqdLNa4STWtJyp7ZTVpymiqcYTj9D+UV9rPnPwjkgc7TsMjkUGC+Bt4Jw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"jB381TTUw8Kj9t+7ZZgQjKob0ye+f1Y2WrsCXa5IdQ8U5l0+wOPgLP8tdmrmPteWYkNeUPSHwjhwz8jofJPN+A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","send":"","pkg_path":"gno.land/r/mikecito/gh_test_3","func":"OracleUpsertAccount","args":["15034695","omarsy","6h057","user"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"KkJfu3RDdvTEuWDEX6ZstHm0lyjkR0ZxilmsrQcObkgiyDwQZbwpKud4dpj9sRiHLwPqLe9OQZezaqy8CdWkWg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/mikecito/gh_test_3","func":"LinkAccount","args":["","g14mfv59k38r8k5vkevpu0lpqlqra0e9trwp3d32",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"GJmQNQyJJ+5shSbTV+Z2DgyvHIeEdhjY1d/3JfzPsQgrCLKlSQEstu8mKE8QLv3LgQcLAnXNixDX5ocVvwIlAg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/mikecito/gh_test_3","func":"LinkAccount","args":["","g14mfv59k38r8k5vkevpu0lpqlqra0e9trwp3d32",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"AJhdFKNda/irPolNIUTpmZbIM0IA0Haq16YU2woq11484Wasqw8ap1T4FfWupuCvfwi7lB0yYBPPram9aVYFPw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/mikecito/gh_test_3","func":"LinkAccount","args":["15034695","g14mfv59k38r8k5vkevpu0lpqlqra0e9trwp3d32",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"rzy8g7CCcNrPq2XEAwBsyXE28LqOHzXcUrcRY+iECX1Yp10y8NMjJnRUhHn6lnoWa2l0KQq0D5tQV0zLgnBVAg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"7l9zW+1/PP7zIBrSSW7baPBTwF/4Ss0FT8AwTVHP26oYK/1zkoaQuOgBDC710gbi4X/+05QVnqtBBntGOM4LnQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Vx5sb/Z68opRNDLMnohf0TNWEz/XgUPsUse2ndqJT2IAmx8bd4Z2DtEpkU4YB3ao7nUUDmCL+RJZewWIJYtnpQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1wcmpyq7p6mvmeq75fdj2quk08pzzvmfwcm7hvn","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"u+7vOO0OlWp7wAg4QvaQMg3u9xw5uNA8wPnbHKko0alT2Wra4huYcnuuLDCxj659BpFlTebXGpLV0vY+BDYIiw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"LpWshthS3P3FvHRlufvgmvaMkVu4zh8hzel+5FQ8Ngh28VqAf+Ik/vCm2sUq5Jwy1TVyGHn7352wH4A0Am+wcQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GjB4U6fI1N/Zo5pGj23nA5iY3qyU0KCkP6wTlErqPwJJpa4l4JTJNJI+aooV+fdfQx42P2WUT7iFMxMjiNS6bA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Oml32Wo4n89QBVLfpWbdtIW6e1j+8FrP3Y7zu3t6seh8zsaN6YqHCjvZ30tIiAetWEiP7ywk5hEN0lZ2Jf6wTA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"aGJ4FfqmssFbhpsGv/jOBTnS/V7AYFiW6j0mJVyjfgFXOa4uL/LaDRq2jZn+2o5N064CDqoANCy2oECp7w34zQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"vtbnNfSzqLdTORKoqOwtNgL9wWnmalvV82pqdvW95FseDJYG2YwTJ+aH4FcumMJ86PsrIdJGDeeWz47jQcUC8A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"MXdy4o6J2n65Y5+ncAr4yvZFB4Qvj1YXOxdx5NMCxldUKdAVY9twiwFZ1IA5vgAUJQf/6sPhKyOF5pDPY74hAw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"l7YEvaraEj/0JuxlvubYJaiZaogOG5OWK9cfcWn7QIx/1gx2QDPaQyVJO26M1LhnKpN42G8wOdRMynlXIWcBtg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"M8G3uNbPlUQw8Zg0D/UTj2jroeUaQNKWndKnuvYNhmZ4/1RHpGJgrMwLft7EcewnzuSgY5sioiqjNJtWaYgfnw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"+SBU48qIe8wXNKrJK2/EeYsuTelK2+d0KIhzhxIIOlZSZv1QyCRLvkarevROOXenoREwuCgz7UIwC1I/qBlCIQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"HmxP55tYNcF5tcX/1qdKISxjpYmCPJnW6G+InS8vUSVbQmdiygOt4xnMPu7pJOZPgvkB0bhxYsai6UWMnzwWCg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"jiMdcEfP70kxcXGZEJkT3rWK+hatIqUT6EAGNuHoxg0+uG/BbC0zJORImPAwqBsg7aWfw7k5LSxoq2t6G18Twg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"QkoeGBcEcUeXrR/gWrSACFNexDl/eaef4zpKLZi1UkkRQki16lSZypapppvAppuOHDl38Serr7taXxUeJ6ybdQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"LsD3L2TD8YWOaRnNilpBhbMy8MdFR0voR4hZWSbti0U07uy3RM1WiEnnPti8sR52RR/RMhVwRXi3S4vCaRBb5Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"t9axB0LRFXblhvA9/na0ldkpHyfDXOZNE1NYMWSKJM4c8uzXtCn8TldkjvCzjYRkOPo/DRBA4wX5CsboPUFdhg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"iUHc2/+ePAUIs1iGMMqkdeKkyqv9i/LCT1h1l4Hd4QtghURxfjfmh2Hgu+KEUTjYKywObTSz8gR8Chyxg8a6mw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"JKAa1822JUkI+qRm56j0ueY+T5LVi+54nS6dKc0hQrdAnesZw7R6vsW6H4aT8/vdNivtTFNizgLY4yTb54tGqw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"wjUv9v14dBLXOss8wF2NVFG9+Tc5FA9aeYSvGRjZra0xCZy56jt8rCLiugPzEoE8d93I3DVrS/Ahv1uzIEoGoQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"kUkzC6gvK+Nh2tdzpzEkOjnxVqsuJggCoPFD81CJ/CtKSM95JZcFLnAUYfJ1tv3t5ZO4CGKRDLFjjk2J4UbFkA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"z44PklYTAeHEmTfhxPwZS+sLnq/gcmLtRQMSGa8yUlNt8C807BdIZmKikypYEfnvb7KWKisHddDC//FkqJ+F3g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"U3/x+8HKK+lGhumJGzy2gyDsxNblEZ1COEcyaS/xcIAM57CYpJlJNzrciAnhbEpouIdl/vCwUD3CXqZqp7V0kA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ykiJp2bO8mRX4oI2e1xUxCCa7nQ7MWplv4IOx+O5uJg+WN3KiXhVV+6MWk4UxSWQi/HEOdYjdvw3xXMiL243rA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"u2XI2lqV9T6Pn/X2wpiVmNP5mcuV7Z+7x0LHKpUb9TZ4W8moSsHWriu7u4gx98KMWtpQuIE9wHyb3Vfq2EtyxA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3XofFLX/cMkTGtNGbwySIxTMNIHm95Fbecj+sXjP92hDKUui/grT/R/x1CvPI0AERlAfqqQUW838nygu3LkkDA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8YWKcm04AuYfhF40FbA2dp/8Arlb9+uRGSBxHk5d9u8eSnjODF1M34XcMrksK+lfn3K7cywI46Yu8EAI+6fpYA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fVEPdbgZnt9sOlfpXouWc3PaTNBJpIUckg1ihLdv4M0QAouwZblR+yjD6pFGgJC757o9oVp6RcZhAQuH3mguTQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"TK6pZ1bY620sZKE0hxfvfTOpr4/DrZ7Vp3xqvjzkr6AWkM+8JVzjCAP92pGnfiXufOH8747jBY7fjHLGza1+vg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"w0j8SZPAFSJ33tm8xjuFcEovkjyE+K4juWkrik8McDYfZPR9RWn6loJn41+M1yabCWoxv7cZ6N2coyqQKTOi8A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"yhkgTd96uOM7IqSJn2/JzivTkEk7tnANfKS0coJJvOBqmOh2HsOrlqmQT2BAz2EVrNBMptntErFp92G46J5hig=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"jB381TTUw8Kj9t+7ZZgQjKob0ye+f1Y2WrsCXa5IdQ8U5l0+wOPgLP8tdmrmPteWYkNeUPSHwjhwz8jofJPN+A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"7l9zW+1/PP7zIBrSSW7baPBTwF/4Ss0FT8AwTVHP26oYK/1zkoaQuOgBDC710gbi4X/+05QVnqtBBntGOM4LnQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Vx5sb/Z68opRNDLMnohf0TNWEz/XgUPsUse2ndqJT2IAmx8bd4Z2DtEpkU4YB3ao7nUUDmCL+RJZewWIJYtnpQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"LpWshthS3P3FvHRlufvgmvaMkVu4zh8hzel+5FQ8Ngh28VqAf+Ik/vCm2sUq5Jwy1TVyGHn7352wH4A0Am+wcQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GjB4U6fI1N/Zo5pGj23nA5iY3qyU0KCkP6wTlErqPwJJpa4l4JTJNJI+aooV+fdfQx42P2WUT7iFMxMjiNS6bA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Oml32Wo4n89QBVLfpWbdtIW6e1j+8FrP3Y7zu3t6seh8zsaN6YqHCjvZ30tIiAetWEiP7ywk5hEN0lZ2Jf6wTA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"aGJ4FfqmssFbhpsGv/jOBTnS/V7AYFiW6j0mJVyjfgFXOa4uL/LaDRq2jZn+2o5N064CDqoANCy2oECp7w34zQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"vtbnNfSzqLdTORKoqOwtNgL9wWnmalvV82pqdvW95FseDJYG2YwTJ+aH4FcumMJ86PsrIdJGDeeWz47jQcUC8A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"MXdy4o6J2n65Y5+ncAr4yvZFB4Qvj1YXOxdx5NMCxldUKdAVY9twiwFZ1IA5vgAUJQf/6sPhKyOF5pDPY74hAw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"l7YEvaraEj/0JuxlvubYJaiZaogOG5OWK9cfcWn7QIx/1gx2QDPaQyVJO26M1LhnKpN42G8wOdRMynlXIWcBtg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"M8G3uNbPlUQw8Zg0D/UTj2jroeUaQNKWndKnuvYNhmZ4/1RHpGJgrMwLft7EcewnzuSgY5sioiqjNJtWaYgfnw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"+SBU48qIe8wXNKrJK2/EeYsuTelK2+d0KIhzhxIIOlZSZv1QyCRLvkarevROOXenoREwuCgz7UIwC1I/qBlCIQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"HmxP55tYNcF5tcX/1qdKISxjpYmCPJnW6G+InS8vUSVbQmdiygOt4xnMPu7pJOZPgvkB0bhxYsai6UWMnzwWCg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"jiMdcEfP70kxcXGZEJkT3rWK+hatIqUT6EAGNuHoxg0+uG/BbC0zJORImPAwqBsg7aWfw7k5LSxoq2t6G18Twg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"QkoeGBcEcUeXrR/gWrSACFNexDl/eaef4zpKLZi1UkkRQki16lSZypapppvAppuOHDl38Serr7taXxUeJ6ybdQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"LsD3L2TD8YWOaRnNilpBhbMy8MdFR0voR4hZWSbti0U07uy3RM1WiEnnPti8sR52RR/RMhVwRXi3S4vCaRBb5Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"t9axB0LRFXblhvA9/na0ldkpHyfDXOZNE1NYMWSKJM4c8uzXtCn8TldkjvCzjYRkOPo/DRBA4wX5CsboPUFdhg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"iUHc2/+ePAUIs1iGMMqkdeKkyqv9i/LCT1h1l4Hd4QtghURxfjfmh2Hgu+KEUTjYKywObTSz8gR8Chyxg8a6mw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"JKAa1822JUkI+qRm56j0ueY+T5LVi+54nS6dKc0hQrdAnesZw7R6vsW6H4aT8/vdNivtTFNizgLY4yTb54tGqw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"wjUv9v14dBLXOss8wF2NVFG9+Tc5FA9aeYSvGRjZra0xCZy56jt8rCLiugPzEoE8d93I3DVrS/Ahv1uzIEoGoQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"kUkzC6gvK+Nh2tdzpzEkOjnxVqsuJggCoPFD81CJ/CtKSM95JZcFLnAUYfJ1tv3t5ZO4CGKRDLFjjk2J4UbFkA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"z44PklYTAeHEmTfhxPwZS+sLnq/gcmLtRQMSGa8yUlNt8C807BdIZmKikypYEfnvb7KWKisHddDC//FkqJ+F3g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"U3/x+8HKK+lGhumJGzy2gyDsxNblEZ1COEcyaS/xcIAM57CYpJlJNzrciAnhbEpouIdl/vCwUD3CXqZqp7V0kA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ykiJp2bO8mRX4oI2e1xUxCCa7nQ7MWplv4IOx+O5uJg+WN3KiXhVV+6MWk4UxSWQi/HEOdYjdvw3xXMiL243rA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"u2XI2lqV9T6Pn/X2wpiVmNP5mcuV7Z+7x0LHKpUb9TZ4W8moSsHWriu7u4gx98KMWtpQuIE9wHyb3Vfq2EtyxA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3XofFLX/cMkTGtNGbwySIxTMNIHm95Fbecj+sXjP92hDKUui/grT/R/x1CvPI0AERlAfqqQUW838nygu3LkkDA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8YWKcm04AuYfhF40FbA2dp/8Arlb9+uRGSBxHk5d9u8eSnjODF1M34XcMrksK+lfn3K7cywI46Yu8EAI+6fpYA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fVEPdbgZnt9sOlfpXouWc3PaTNBJpIUckg1ihLdv4M0QAouwZblR+yjD6pFGgJC757o9oVp6RcZhAQuH3mguTQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"mFv5QHwtYSOV31bsS29UmoKQldOADiYv7lKHe9V2QL9UepB6tIZYdYVXNJbnEPls7uIALF9/I6T6lvSc1SPXyg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"e8FbE6s4MUkoQ7/wXX+4/AsElc6fKe5LhEgxzqo4Z+w27OJkniVf+uhEPfjAMJesGZUCNeUYhk5ulMxcM7pV8g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"vqauTtnApZXXUxe6aYhID8eCV6deac3nrNR/RSNG1Soop/YqM4HaLOxEamO9EzCqGlWh0Hwx7uCXHZ25Zg2PpQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"KeEPk1AnSrXfZ1HzFWX3ZLybLIGI576mEmU0f+63QT90AxkdkWkASxZFutoyaajqTnojlqaad64uTUEbZJjNeQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"IHu+wluDGa8HFe3v6rCMeGQfC/UFXtq8NgMr77xEtXdVQpoLhNNlUUe3m1TQpf4cdBtuY+EFecr0DioXe05JgA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"f8q1Wx7qBSGy0h3bOlFPfUu3icsPcE9pZOaOHa+6huY5mHvXjwtm8Ps8Ob9s/sIHQDKOuF2lgMkP/UK6KPnG2g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"cEFYvy63W+ZnaVkh/pnqjrDrCqBLikUi04s4TveXSZMPTlfF11tE4Yfo4YhIFydRcmRQkwC4naGEGh1uFw05DA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"+W2YX57Z0gFJBCyII+USlbVBC7qzruvorkFqYFWXzWQ9xrze4+p/6dLMqQ5El8aIO2re6mqlPHrfGf73NdQJ/A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"F+BlC3yKKGs2CIaDexX80Mjw7AHIC6ZZ8YEInAg1MU92lSsOhaDDkyw6KxzOiHchyt2i3EKyCUn8lE+5yqxzow=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"oC4uv8Tklppe4xcKDZxUDrAWAFPb82iV6N7er9iCrMJOt7LOeweuDLR1lfzFBMP8K31PNa4dhInc6jh+GzWsiQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"lh6WCCHT1JGXnX8PTaM56NNMpxEtA0/392qE+N46nmlIbO3IH3yrdKvrycIOi+b6ZL7fN8FETVeuVZlSjIDhXQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"xU5PiWK536Yuy12Yoj1bRp+fv41L0XMzusQzztAw9z8oAK9LZNKIRkz6gVdNuDbRG04vF7rzScF3wOfXcZcKLA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"QLnnTBhTiVrXXPiZUGE2VuNE+IOx3A3iG6zejbwvQtgkEjzfLqgZaLXA3ybwJDWxVoAOLwVuUMAywJtddLc+HA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"t41Leo6MXF0/x38q3xBKBmGxvKtGryENFML0wAE8Q9hUy4LXKRymaZCoIUdi4JcWfX/gaouMwy74gj4L13JuMg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"74n+vyGjIikQBITpeeVHWk8YPD9qQ1r/vLwkWx7zn1otESTYu8/lSAveYWyhL0oStRjbeP6CkBabPap2RlyYJA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"a19LaYO8cAadCIwBA3abmwKngydRjDd/fU7pzjt1KgFo83ZIXKwiQGFj0mu7AOVdk3t6DNgEBfwtnPbc0AA8QQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AeL0Y+0hYuqc97t5wozyeGATkOGTwfAc/lZWdXPhrcQvezNbenSOUXS8ITDLrcP3r5sVB6/6iCcCLm1Z+uXT/Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"n3li8Z2DeVpaBQZ7qZsJtO50iYrA86AyrR11XgQwRhtzUizpMW1WLvmRd0UPOWjAl+jYyae0eFJvHObfcTqr6A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"SHPkHdnrnFdRrUTbXptCnfH9dMJyu900qwaCjnJthvpYqVd20Wc8K4uQt1LT300Xn4gxpKcS8hYJqgqoQVQUVw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"FLqr1HJjF9MWYh+FJm1+ZqRPfOfx/Ja65GZMPV+rELlILuXBwOH2ch4iSAUjtjZtEnFcPvLt8S5+kyIv/lLM+A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"LMtUIajx5wri1VxPZYI/4P6IoeysQNeFtACVrash+xFzd6ho3Gl32dBwFsiJLJRZqkLE1p8xi+3CzA6oiUTThg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"cCCQE9w+D+mXiR/F3r6wRvi2r6Niy2Yl4qfe38OGwVgT6C09rsR8nQvCMdrU3KNXAyjqTOgnXcUw6pQiAxOIEQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"cCJ3YBT2O6VSHXZMOaYhzQSidmO2ZGNm+Q2T6Hd1hiJuhNS9MNCn6FcKZ8E6y0t/7/142hAg8l2UowC+I13F0A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"L4pX9uaVmGp0PIpnqJ7peHLzgeA0buUNOpdiJwhEeychNXMH+gHG0ZQPA2y+ynOZ4ZiMKaFdB00aX94ggsuTzQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qqRhEkImBeByZ9dxDaa9CzoiMkYGiHtV1nOjjoW6XO4uRK23SY8Do4Dy7wQnUdchTKr5G8LSMVu43kPshxz8fQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"DVIwVNdexFxx0Vq9EWk5ukHwO2ikBYB+v/7ppBSopIB4x+OOjc6UCfbEbogry+FNduKh1A33GIbFlayz/dO/MQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"TK6pZ1bY620sZKE0hxfvfTOpr4/DrZ7Vp3xqvjzkr6AWkM+8JVzjCAP92pGnfiXufOH8747jBY7fjHLGza1+vg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"w0j8SZPAFSJ33tm8xjuFcEovkjyE+K4juWkrik8McDYfZPR9RWn6loJn41+M1yabCWoxv7cZ6N2coyqQKTOi8A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"yhkgTd96uOM7IqSJn2/JzivTkEk7tnANfKS0coJJvOBqmOh2HsOrlqmQT2BAz2EVrNBMptntErFp92G46J5hig=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"jB381TTUw8Kj9t+7ZZgQjKob0ye+f1Y2WrsCXa5IdQ8U5l0+wOPgLP8tdmrmPteWYkNeUPSHwjhwz8jofJPN+A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"7l9zW+1/PP7zIBrSSW7baPBTwF/4Ss0FT8AwTVHP26oYK/1zkoaQuOgBDC710gbi4X/+05QVnqtBBntGOM4LnQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Vx5sb/Z68opRNDLMnohf0TNWEz/XgUPsUse2ndqJT2IAmx8bd4Z2DtEpkU4YB3ao7nUUDmCL+RJZewWIJYtnpQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"LpWshthS3P3FvHRlufvgmvaMkVu4zh8hzel+5FQ8Ngh28VqAf+Ik/vCm2sUq5Jwy1TVyGHn7352wH4A0Am+wcQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"TK6pZ1bY620sZKE0hxfvfTOpr4/DrZ7Vp3xqvjzkr6AWkM+8JVzjCAP92pGnfiXufOH8747jBY7fjHLGza1+vg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"w0j8SZPAFSJ33tm8xjuFcEovkjyE+K4juWkrik8McDYfZPR9RWn6loJn41+M1yabCWoxv7cZ6N2coyqQKTOi8A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"yhkgTd96uOM7IqSJn2/JzivTkEk7tnANfKS0coJJvOBqmOh2HsOrlqmQT2BAz2EVrNBMptntErFp92G46J5hig=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"jB381TTUw8Kj9t+7ZZgQjKob0ye+f1Y2WrsCXa5IdQ8U5l0+wOPgLP8tdmrmPteWYkNeUPSHwjhwz8jofJPN+A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"7l9zW+1/PP7zIBrSSW7baPBTwF/4Ss0FT8AwTVHP26oYK/1zkoaQuOgBDC710gbi4X/+05QVnqtBBntGOM4LnQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Vx5sb/Z68opRNDLMnohf0TNWEz/XgUPsUse2ndqJT2IAmx8bd4Z2DtEpkU4YB3ao7nUUDmCL+RJZewWIJYtnpQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"TK6pZ1bY620sZKE0hxfvfTOpr4/DrZ7Vp3xqvjzkr6AWkM+8JVzjCAP92pGnfiXufOH8747jBY7fjHLGza1+vg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"w0j8SZPAFSJ33tm8xjuFcEovkjyE+K4juWkrik8McDYfZPR9RWn6loJn41+M1yabCWoxv7cZ6N2coyqQKTOi8A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"yhkgTd96uOM7IqSJn2/JzivTkEk7tnANfKS0coJJvOBqmOh2HsOrlqmQT2BAz2EVrNBMptntErFp92G46J5hig=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"jB381TTUw8Kj9t+7ZZgQjKob0ye+f1Y2WrsCXa5IdQ8U5l0+wOPgLP8tdmrmPteWYkNeUPSHwjhwz8jofJPN+A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/mikecito/gh_test_3","func":"LinkAccount","args":["15034695","g14mfv59k38r8k5vkevpu0lpqlqra0e9trwp3d32",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"aUanRZGALCocJZXKl8zfDUJsrKSIpH+OLaGBU/W9TfZxdCxFTQO/d7uSG+DVUhwzYj4fJRX+kCVOLJjo90Y5ow=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"7l9zW+1/PP7zIBrSSW7baPBTwF/4Ss0FT8AwTVHP26oYK/1zkoaQuOgBDC710gbi4X/+05QVnqtBBntGOM4LnQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Vx5sb/Z68opRNDLMnohf0TNWEz/XgUPsUse2ndqJT2IAmx8bd4Z2DtEpkU4YB3ao7nUUDmCL+RJZewWIJYtnpQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"5000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"eWjRjwMaaeUkX/iph3HvK27+nPjqED0IsEidY7MSqRAagNnm1ECB+6Sn8FuaWHbFG8GoJIAg2ufwqYVdJap5Ag=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8D7XPTgcuYQtsVSsPQ7U8icSFL/FUEJK517hFeBZot5CUHbgDOuk+tvhPG2423insfijTekYwFrSUptYBj7x0Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"5000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"0e0u2SXigwz4454ymwpHttBKwreBwJqe8XB8OY8z6qV+HvASkkbZOxExOTow/XnoNIcx3E5d3Z07UAM/humD2A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ZYwtt7Ncda+sw+GIJoHG0I9og0KJ+nDKJDW8snxB9Vpq7AdsYUgD7ZiiYkqBp/W86/0u/R8odGAf2/cQAsZ6cA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Oml32Wo4n89QBVLfpWbdtIW6e1j+8FrP3Y7zu3t6seh8zsaN6YqHCjvZ30tIiAetWEiP7ywk5hEN0lZ2Jf6wTA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"5000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"A8lB3diODdshRx09H45+5+974qmB0QuwXWeKMSLLUAR5r6ey9sNR0v5uHkTeIZR4R5sVc1mCwNd/kL05LPwJ2Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"muR8Xy6Jzbv9NOqzR0dWVrL/2FMoC5b31a35oXA9TO0gw5iF2Pocyi0xCefJ3WxqYcVOS/QOKd/RtrjaCF/J3w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","send":"","pkg_path":"gno.land/r/mikecito/gh_test_4","func":"AdminSetOracleAddr","args":["g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"6eDpHwB/EZV4BQ3d98+h33f/0PlrtHTSAjF8VqIVev9r/StkQ/UG2BaaSPH292kU0rs0qlRQ3opQlu/tpiPSog=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"mHGos7wkr0VgP+Y9pBj53ATBz8rzl1rgYzAog0cKS4FQpJqYnS/1wP1IGBJAQ5FOIm2HsLF2XVenG2eF50cChQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","send":"","pkg_path":"gno.land/r/mikecito/gh_test_4","func":"OracleUpsertAccount","args":["15034695","omarsy","6h057","user"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"dr3M0CQ2s3AaWzbIcwcERhL/j6J2Q4meagOSV+kZuWU4Ccas0hipuCXvoQjnwE4GKR19zYyOlBN/UIJFX5T0Gg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/mikecito/gh_test_4","func":"LinkAccount","args":["15034695","g14mfv59k38r8k5vkevpu0lpqlqra0e9trwp3d32",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"49K9IDt4Ou+9gIIWd3pjIyWfzEf641tL2WfPN4xjucp6TAc5gjNnKELTppnSGXLfs/3amxlnT90cGsZ9De3a8A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"TK6pZ1bY620sZKE0hxfvfTOpr4/DrZ7Vp3xqvjzkr6AWkM+8JVzjCAP92pGnfiXufOH8747jBY7fjHLGza1+vg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"w0j8SZPAFSJ33tm8xjuFcEovkjyE+K4juWkrik8McDYfZPR9RWn6loJn41+M1yabCWoxv7cZ6N2coyqQKTOi8A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"yhkgTd96uOM7IqSJn2/JzivTkEk7tnANfKS0coJJvOBqmOh2HsOrlqmQT2BAz2EVrNBMptntErFp92G46J5hig=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"jB381TTUw8Kj9t+7ZZgQjKob0ye+f1Y2WrsCXa5IdQ8U5l0+wOPgLP8tdmrmPteWYkNeUPSHwjhwz8jofJPN+A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g19etegna0phd2wu64t9atxhm0kpgx8x2z3g4uv5","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"bEUoFcQGgMnOqJ6XhnVgH+CfqFQyOtdWLNurfFxrPU5VwG6lJLRn1QN3n7YXofAUubwZn5BmNYnF1cGjA8xnwg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g19etegna0phd2wu64t9atxhm0kpgx8x2z3g4uv5","to_address":"g19etegna0phd2wu64t9atxhm0kpgx8x2z3g4uv5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Av0KDkEG7FVrMHQhGFeFr4t0FrQISN0NVXnu5qwrkh/M"},"signature":"C1wLSm5T+Q9nzmB+1zZL5JzyhTujluWhhFRLb4vvAY95ABSs98I3/rWoscMsr3/XwBCw7GIWYdsXWo/E4Lwb3A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"7l9zW+1/PP7zIBrSSW7baPBTwF/4Ss0FT8AwTVHP26oYK/1zkoaQuOgBDC710gbi4X/+05QVnqtBBntGOM4LnQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Vx5sb/Z68opRNDLMnohf0TNWEz/XgUPsUse2ndqJT2IAmx8bd4Z2DtEpkU4YB3ao7nUUDmCL+RJZewWIJYtnpQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"LpWshthS3P3FvHRlufvgmvaMkVu4zh8hzel+5FQ8Ngh28VqAf+Ik/vCm2sUq5Jwy1TVyGHn7352wH4A0Am+wcQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GjB4U6fI1N/Zo5pGj23nA5iY3qyU0KCkP6wTlErqPwJJpa4l4JTJNJI+aooV+fdfQx42P2WUT7iFMxMjiNS6bA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Oml32Wo4n89QBVLfpWbdtIW6e1j+8FrP3Y7zu3t6seh8zsaN6YqHCjvZ30tIiAetWEiP7ywk5hEN0lZ2Jf6wTA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"aGJ4FfqmssFbhpsGv/jOBTnS/V7AYFiW6j0mJVyjfgFXOa4uL/LaDRq2jZn+2o5N064CDqoANCy2oECp7w34zQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"vtbnNfSzqLdTORKoqOwtNgL9wWnmalvV82pqdvW95FseDJYG2YwTJ+aH4FcumMJ86PsrIdJGDeeWz47jQcUC8A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"MXdy4o6J2n65Y5+ncAr4yvZFB4Qvj1YXOxdx5NMCxldUKdAVY9twiwFZ1IA5vgAUJQf/6sPhKyOF5pDPY74hAw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"l7YEvaraEj/0JuxlvubYJaiZaogOG5OWK9cfcWn7QIx/1gx2QDPaQyVJO26M1LhnKpN42G8wOdRMynlXIWcBtg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"M8G3uNbPlUQw8Zg0D/UTj2jroeUaQNKWndKnuvYNhmZ4/1RHpGJgrMwLft7EcewnzuSgY5sioiqjNJtWaYgfnw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"+SBU48qIe8wXNKrJK2/EeYsuTelK2+d0KIhzhxIIOlZSZv1QyCRLvkarevROOXenoREwuCgz7UIwC1I/qBlCIQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/mikecito/gh_test_4","func":"LinkAccount","args":["15034695","g14mfv59k38r8k5vkevpu0lpqlqra0e9trwp3d32",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"yGhmovXHFJzk679kWlxOOcVRWBSnvNoLyBN9g5Q8aNEAVMfnp3MJw0rycO/zGKqxvkCq4VNNIHC4xlDAwnNYCw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"HmxP55tYNcF5tcX/1qdKISxjpYmCPJnW6G+InS8vUSVbQmdiygOt4xnMPu7pJOZPgvkB0bhxYsai6UWMnzwWCg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"jiMdcEfP70kxcXGZEJkT3rWK+hatIqUT6EAGNuHoxg0+uG/BbC0zJORImPAwqBsg7aWfw7k5LSxoq2t6G18Twg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"QkoeGBcEcUeXrR/gWrSACFNexDl/eaef4zpKLZi1UkkRQki16lSZypapppvAppuOHDl38Serr7taXxUeJ6ybdQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"LsD3L2TD8YWOaRnNilpBhbMy8MdFR0voR4hZWSbti0U07uy3RM1WiEnnPti8sR52RR/RMhVwRXi3S4vCaRBb5Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"t9axB0LRFXblhvA9/na0ldkpHyfDXOZNE1NYMWSKJM4c8uzXtCn8TldkjvCzjYRkOPo/DRBA4wX5CsboPUFdhg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"iUHc2/+ePAUIs1iGMMqkdeKkyqv9i/LCT1h1l4Hd4QtghURxfjfmh2Hgu+KEUTjYKywObTSz8gR8Chyxg8a6mw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"JKAa1822JUkI+qRm56j0ueY+T5LVi+54nS6dKc0hQrdAnesZw7R6vsW6H4aT8/vdNivtTFNizgLY4yTb54tGqw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"wjUv9v14dBLXOss8wF2NVFG9+Tc5FA9aeYSvGRjZra0xCZy56jt8rCLiugPzEoE8d93I3DVrS/Ahv1uzIEoGoQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"kUkzC6gvK+Nh2tdzpzEkOjnxVqsuJggCoPFD81CJ/CtKSM95JZcFLnAUYfJ1tv3t5ZO4CGKRDLFjjk2J4UbFkA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"z44PklYTAeHEmTfhxPwZS+sLnq/gcmLtRQMSGa8yUlNt8C807BdIZmKikypYEfnvb7KWKisHddDC//FkqJ+F3g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"U3/x+8HKK+lGhumJGzy2gyDsxNblEZ1COEcyaS/xcIAM57CYpJlJNzrciAnhbEpouIdl/vCwUD3CXqZqp7V0kA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ykiJp2bO8mRX4oI2e1xUxCCa7nQ7MWplv4IOx+O5uJg+WN3KiXhVV+6MWk4UxSWQi/HEOdYjdvw3xXMiL243rA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"u2XI2lqV9T6Pn/X2wpiVmNP5mcuV7Z+7x0LHKpUb9TZ4W8moSsHWriu7u4gx98KMWtpQuIE9wHyb3Vfq2EtyxA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/mikecito/gh_test_4","func":"LinkAccount","args":["15034695","g14mfv59k38r8k5vkevpu0lpqlqra0e9trwp3d32",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"IZLwH5e1jb6Yuos+OW55ydnGudQRjxcM1TWCVAj0bsgR1Do03Mzh5J8LA97MMHb3X33et1eDe6D+QTRhDXSz5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/mikecito/gh_test_4","func":"LinkAccount","args":["15034695","g14mfv59k38r8k5vkevpu0lpqlqra0e9trwp3d32",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"LAgjLiQBKXlQnbt4svK3+LUn6gIxTbjWhT0DQDKZO50cwiP+QVm6jCZ9IrncpuntbTJO5GsZJgLPFKZyKbM3hQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/mikecito/gh_test_4","func":"LinkAccount","args":["15034695","g14mfv59k38r8k5vkevpu0lpqlqra0e9trwp3d32",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"Ucp5DLRnzh8T0ZHsfjzFeu8sQGzFIdrTKUjL1nyWtexz+KIqW/Fgh0y87qs8QAW3rUVSQZuXqeUf4YAOEQX1QQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"CV24MSllBUIrME82e98/VcCgqUt9/r6QdYMT3qz/PtkElmaaEPM6+5+/gufnnP7ijQ4LQugFEm71Rj9uUgL9rg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/mikecito/gh_test_4","func":"LinkAccount","args":["15034695","g14mfv59k38r8k5vkevpu0lpqlqra0e9trwp3d32",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"68GcxPIabiiungvnuVgXiLTDYcz3OAOxmEDBxTTnvU0ykLCkp3n6pJkUVVarUx6AcJJXMibGi7Ug/1QmJTYByQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"YsClPibybDa6VeV8he18nweWvQ7F0OMDoYOKXjyii01pm2XcXjLSooVe0Snt5Orhzbt+GFSRn/+GXIUMKl5llQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/mikecito/gh_test_4","func":"LinkAccount","args":["15034695","g14mfv59k38r8k5vkevpu0lpqlqra0e9trwp3d32",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"uD2hCjiodhnwkj3H64oQgw5ZD338bpiS8UmFG/fSX9E2A6mUsKBV94S0bIV/1+cc9ZBWEl6RHeWiFQ7s9rM00A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/mikecito/gh_test_4","func":"LinkAccount","args":["15034695","g14mfv59k38r8k5vkevpu0lpqlqra0e9trwp3d32",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"yw5yEHihdIXz2kMBj5ZiARlmtsRGHPsDShmCYUQhw04585WcFLnFNxpPgmsWW6YPqdECyD3szjjMjWCC30L+jw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fVEPdbgZnt9sOlfpXouWc3PaTNBJpIUckg1ihLdv4M0QAouwZblR+yjD6pFGgJC757o9oVp6RcZhAQuH3mguTQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ODm6b9uy8KTcZWH6vptNKvl1pJur55krHHgGL6oJLoJiddskTV096MHOaruB0IoOheneZW2ymx5C1obCkYETBw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/mikecito/gh_test_4","func":"LinkAccount","args":["15034695","g14mfv59k38r8k5vkevpu0lpqlqra0e9trwp3d32",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"0MQRh+HOE2jbG6280nog1pTTzWR/ewj9fQFxww+U/GVizWlReImK6/0sxFv0q/hiPB14+cz52OHckYl30FyN4w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"e8FbE6s4MUkoQ7/wXX+4/AsElc6fKe5LhEgxzqo4Z+w27OJkniVf+uhEPfjAMJesGZUCNeUYhk5ulMxcM7pV8g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"vqauTtnApZXXUxe6aYhID8eCV6deac3nrNR/RSNG1Soop/YqM4HaLOxEamO9EzCqGlWh0Hwx7uCXHZ25Zg2PpQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"KeEPk1AnSrXfZ1HzFWX3ZLybLIGI576mEmU0f+63QT90AxkdkWkASxZFutoyaajqTnojlqaad64uTUEbZJjNeQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"IHu+wluDGa8HFe3v6rCMeGQfC/UFXtq8NgMr77xEtXdVQpoLhNNlUUe3m1TQpf4cdBtuY+EFecr0DioXe05JgA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"f8q1Wx7qBSGy0h3bOlFPfUu3icsPcE9pZOaOHa+6huY5mHvXjwtm8Ps8Ob9s/sIHQDKOuF2lgMkP/UK6KPnG2g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"cEFYvy63W+ZnaVkh/pnqjrDrCqBLikUi04s4TveXSZMPTlfF11tE4Yfo4YhIFydRcmRQkwC4naGEGh1uFw05DA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"+W2YX57Z0gFJBCyII+USlbVBC7qzruvorkFqYFWXzWQ9xrze4+p/6dLMqQ5El8aIO2re6mqlPHrfGf73NdQJ/A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"oC4uv8Tklppe4xcKDZxUDrAWAFPb82iV6N7er9iCrMJOt7LOeweuDLR1lfzFBMP8K31PNa4dhInc6jh+GzWsiQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"lh6WCCHT1JGXnX8PTaM56NNMpxEtA0/392qE+N46nmlIbO3IH3yrdKvrycIOi+b6ZL7fN8FETVeuVZlSjIDhXQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"xU5PiWK536Yuy12Yoj1bRp+fv41L0XMzusQzztAw9z8oAK9LZNKIRkz6gVdNuDbRG04vF7rzScF3wOfXcZcKLA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"QLnnTBhTiVrXXPiZUGE2VuNE+IOx3A3iG6zejbwvQtgkEjzfLqgZaLXA3ybwJDWxVoAOLwVuUMAywJtddLc+HA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"t41Leo6MXF0/x38q3xBKBmGxvKtGryENFML0wAE8Q9hUy4LXKRymaZCoIUdi4JcWfX/gaouMwy74gj4L13JuMg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"74n+vyGjIikQBITpeeVHWk8YPD9qQ1r/vLwkWx7zn1otESTYu8/lSAveYWyhL0oStRjbeP6CkBabPap2RlyYJA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"a19LaYO8cAadCIwBA3abmwKngydRjDd/fU7pzjt1KgFo83ZIXKwiQGFj0mu7AOVdk3t6DNgEBfwtnPbc0AA8QQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AeL0Y+0hYuqc97t5wozyeGATkOGTwfAc/lZWdXPhrcQvezNbenSOUXS8ITDLrcP3r5sVB6/6iCcCLm1Z+uXT/Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"n3li8Z2DeVpaBQZ7qZsJtO50iYrA86AyrR11XgQwRhtzUizpMW1WLvmRd0UPOWjAl+jYyae0eFJvHObfcTqr6A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"SHPkHdnrnFdRrUTbXptCnfH9dMJyu900qwaCjnJthvpYqVd20Wc8K4uQt1LT300Xn4gxpKcS8hYJqgqoQVQUVw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"FLqr1HJjF9MWYh+FJm1+ZqRPfOfx/Ja65GZMPV+rELlILuXBwOH2ch4iSAUjtjZtEnFcPvLt8S5+kyIv/lLM+A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"LMtUIajx5wri1VxPZYI/4P6IoeysQNeFtACVrash+xFzd6ho3Gl32dBwFsiJLJRZqkLE1p8xi+3CzA6oiUTThg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"cCCQE9w+D+mXiR/F3r6wRvi2r6Niy2Yl4qfe38OGwVgT6C09rsR8nQvCMdrU3KNXAyjqTOgnXcUw6pQiAxOIEQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"cCJ3YBT2O6VSHXZMOaYhzQSidmO2ZGNm+Q2T6Hd1hiJuhNS9MNCn6FcKZ8E6y0t/7/142hAg8l2UowC+I13F0A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"L4pX9uaVmGp0PIpnqJ7peHLzgeA0buUNOpdiJwhEeychNXMH+gHG0ZQPA2y+ynOZ4ZiMKaFdB00aX94ggsuTzQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qqRhEkImBeByZ9dxDaa9CzoiMkYGiHtV1nOjjoW6XO4uRK23SY8Do4Dy7wQnUdchTKr5G8LSMVu43kPshxz8fQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"DVIwVNdexFxx0Vq9EWk5ukHwO2ikBYB+v/7ppBSopIB4x+OOjc6UCfbEbogry+FNduKh1A33GIbFlayz/dO/MQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sWlVqxqA+6X0UH+eNljdRI50oxdy/Z6mUMBj/n/uuoM/eAtvRZMNtHJg4H5ZljYVhGkebpMp4WHbVGMPdWp8kA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3H6OrH/stKtni6qUW4iU2j2b6wYaUKjpan3ypcIVQp5IN41BCC5j7d2qMDo6UWLbQlN7dNlfUZsoZpA683dG7g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Bhqgq2jlj3LNKrG6s4DWKYNonsd5FO487Bx1sCtC3gt6hWJPs6RCOmEazQT9z0JziIb383mYffcRMdwHlrdn7Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"CuXrnGaoHB+XIJZniy6J0PrhJbjPDupZJviVbdSU0q46Z1vsWh7buaC2/B+AF8PiU5nVC0LmcXWXRhTwCCY8Xg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1nvjuXTm3pJP/zMOpvg7inla3sS4AMHQoOV56TXxVXETuea0mlFPyz0z9nfB7w7YCg5g7KZMMr5eBfm+/Q0yxA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"pcdgYJDEmvz+eEtdOpPxH/LCkSURDCtcJqorzbL4zEsxwQonYAjDj06XgOMIEcuT4721eZXGvjYn1d1RkA+Asg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Ho/H07cjitxcKAMtYJ+XuPBcE9OTKag0lA7t1mmjDWx8FHl21wwys6eejZY5tPB6bwKgzNN7lBUYpoRkRfNqsg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Ar6xqkkJg0lEyak2jcTD2zcZ1nLGYFV3wKhILczMM9lAjPkWszzH1fsVAEIIJ1feeTW420bzPgoR0OpxAQ9BAA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8j0QB5lxvBuDPoNR+eJm3maNS5oz1cHKH8DPeZ/spLRkMi2rumr0OCBNuCk8FdPv/h/Nk2SGlno1VsiWhBMeIg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"HNXFi1L5/KY+CQH0a6+gxLhSwvoD5sIvOwCc/QJms3t6TKvsyXammQlfmy7jjQ0YRghWmqTPxQq/bODBRNBsDA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"iTFwML6IcOlkK54XmQZGR0To9L08G5KDDlCS9UK9e5sn3duqJ+WEmqdL4+VF4CcQuv+T4TfMCkotVpNH61PkWQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"r7eqeMWJxeNqRwdUI7bPZfORySNnhE6iudNZr+w36TopCcXf2JxBoGgzjl+5aHiiew1ERBk4cg9M6cqSFk9ctg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AclJ6X6moLZsF8vRqfXH7XOa6s6aVUH2BKxt5Bq4le9/xWUXuSpnKPs+GWtBjIjuQITvqG8UGPqcWVJ/fHcXOg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"oncpiI5gZ1+m9B095V/0vGOzS+Q3NFUU+c5xX+yjKRlW/vBDRZkNYbR26VZkJY3is9cTD2jswh3vIDW+QGRjNg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"DeMbH+UN4NMn87pDhmc9FMQokBqqYNj57A1uIsCkTccJfm/ub6DJ2l/h8omET1S9W3z1Apb3kXDNJ9bYueFm2Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G+7GSHxC1vZePPrygv70woPAyfm1B0A6QSGEYqzsuFVrYQjc+VpnQcZRxujJK45wdEA8gJljp6nEUIoe2fvX5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OO7U2vDRqdsXYGH97YoH9B90ZvpcknnSYgkqDV0h5RZea0Ot1MDC26QlSuT7K+ue0baNFqJcHEXT1YjZaMcbaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y0/pWqx4XTKb4JVmh0gfBQffJ31hYcE4GlolQot5/qpJ+0IivG9G3lrfhbbEl/6heNFpPMKDg45OfVHTt5Nx5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5yV/dtQhLn6TpQlYVtE/zKo128dU0yQUf2JX05RvLqMy1/dbHmogOtjyOeJbQ/a+M+Wei2dNCNBA+92tVYQgqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5HsVSrJFSVrvvaY7PR3ixMRXsFKqzHfSxFa0nNfIYsMMtdFSB20+/246yCxBa0iZ7H/f1MUHf5Dzuf6G1f8b+Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G+7GSHxC1vZePPrygv70woPAyfm1B0A6QSGEYqzsuFVrYQjc+VpnQcZRxujJK45wdEA8gJljp6nEUIoe2fvX5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OO7U2vDRqdsXYGH97YoH9B90ZvpcknnSYgkqDV0h5RZea0Ot1MDC26QlSuT7K+ue0baNFqJcHEXT1YjZaMcbaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y0/pWqx4XTKb4JVmh0gfBQffJ31hYcE4GlolQot5/qpJ+0IivG9G3lrfhbbEl/6heNFpPMKDg45OfVHTt5Nx5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5yV/dtQhLn6TpQlYVtE/zKo128dU0yQUf2JX05RvLqMy1/dbHmogOtjyOeJbQ/a+M+Wei2dNCNBA+92tVYQgqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5HsVSrJFSVrvvaY7PR3ixMRXsFKqzHfSxFa0nNfIYsMMtdFSB20+/246yCxBa0iZ7H/f1MUHf5Dzuf6G1f8b+Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"phtNWuw+s6rlNwVt+PgyXTrg6l5QLytx7A99mWlFHdlXhJL4kT/E9iSGoutU5nmVGqVI3T3Obc3xqaPT+bwXfg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"aAMaFvYTgfSBuYdQERL3b9Xb4y6DLfKf84wtfL2tPRV/xjdXpuj0KjqJw8whNopkCdOGwP3J+xxlaenyfn1vSw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sy7aCwhwl53QGymG4qlTarx+z2YHt4nXhRTBuAcWdOhF07Ij0G908kNJjOLRO5ppCXoVdpGgYqpE79xcPYKrbg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rpKHlFQBR86UZnlEIb/JUNuzYLbwpF9cGl83jhh7j+sAC1Tg5OFW1aBqxfRscgFKuv2CCQzyUo3mltKsZuhkeg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GUka0bGpN9vw5UjP5hLNkNF3AhMj7opdkFi47Ieo+X5iBcP5Nir7Z5XnPS9fqi9psrSuUellKOc9kvKNhTLKSg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g2Ogh/Y5E59Gqy0SRh3q+QKx8BGVDqh7WfJwzXq29HdJl5np6YsNGgXki046dtIYXM7Vk6YqhbVWpWlx5D/jhw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fxllR6psdh00kEGZ13C9GbUK0Ef763WPehcu0Cw3nGtHQMEnFJ0baEOT+exnK2rMPsDSlzRV3GeWc9D5Y5hpnQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Jk87FQTiUyvACAZ+LXzQSym4xFBwjT7dEmlXCfrKoc4Gfulki9zLJCPpYtTdAsB+d5VdkEab3Ywx1WECm0Rgxw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RszGJc/GTwskYskc82z9WfRUfdmMT1EXnBBa+lbhuQ4SkgiFx6EOJ4R66i5xQI0vjccEkufBvsX58LYnhKiiyQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AmnwZ3Grd2QW962s+rEn2QvuwFWhhFC3k8e6k+Lpq6hJOVqgbGWXGtPemqSHwmML62Za8Hyzcao9Y4zuXM8JCQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qTF3punEcwvO68Sd3WkL3bq2LYi47P0SJJUwi0gdsr9jYV1LcJLfDV6eTLRD+AuX4uKgi1ZZ3/UNxYjaFRigLg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G+7GSHxC1vZePPrygv70woPAyfm1B0A6QSGEYqzsuFVrYQjc+VpnQcZRxujJK45wdEA8gJljp6nEUIoe2fvX5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OO7U2vDRqdsXYGH97YoH9B90ZvpcknnSYgkqDV0h5RZea0Ot1MDC26QlSuT7K+ue0baNFqJcHEXT1YjZaMcbaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y0/pWqx4XTKb4JVmh0gfBQffJ31hYcE4GlolQot5/qpJ+0IivG9G3lrfhbbEl/6heNFpPMKDg45OfVHTt5Nx5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5yV/dtQhLn6TpQlYVtE/zKo128dU0yQUf2JX05RvLqMy1/dbHmogOtjyOeJbQ/a+M+Wei2dNCNBA+92tVYQgqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5HsVSrJFSVrvvaY7PR3ixMRXsFKqzHfSxFa0nNfIYsMMtdFSB20+/246yCxBa0iZ7H/f1MUHf5Dzuf6G1f8b+Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"phtNWuw+s6rlNwVt+PgyXTrg6l5QLytx7A99mWlFHdlXhJL4kT/E9iSGoutU5nmVGqVI3T3Obc3xqaPT+bwXfg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"aAMaFvYTgfSBuYdQERL3b9Xb4y6DLfKf84wtfL2tPRV/xjdXpuj0KjqJw8whNopkCdOGwP3J+xxlaenyfn1vSw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sy7aCwhwl53QGymG4qlTarx+z2YHt4nXhRTBuAcWdOhF07Ij0G908kNJjOLRO5ppCXoVdpGgYqpE79xcPYKrbg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rpKHlFQBR86UZnlEIb/JUNuzYLbwpF9cGl83jhh7j+sAC1Tg5OFW1aBqxfRscgFKuv2CCQzyUo3mltKsZuhkeg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GUka0bGpN9vw5UjP5hLNkNF3AhMj7opdkFi47Ieo+X5iBcP5Nir7Z5XnPS9fqi9psrSuUellKOc9kvKNhTLKSg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g2Ogh/Y5E59Gqy0SRh3q+QKx8BGVDqh7WfJwzXq29HdJl5np6YsNGgXki046dtIYXM7Vk6YqhbVWpWlx5D/jhw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fxllR6psdh00kEGZ13C9GbUK0Ef763WPehcu0Cw3nGtHQMEnFJ0baEOT+exnK2rMPsDSlzRV3GeWc9D5Y5hpnQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G+7GSHxC1vZePPrygv70woPAyfm1B0A6QSGEYqzsuFVrYQjc+VpnQcZRxujJK45wdEA8gJljp6nEUIoe2fvX5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OO7U2vDRqdsXYGH97YoH9B90ZvpcknnSYgkqDV0h5RZea0Ot1MDC26QlSuT7K+ue0baNFqJcHEXT1YjZaMcbaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y0/pWqx4XTKb4JVmh0gfBQffJ31hYcE4GlolQot5/qpJ+0IivG9G3lrfhbbEl/6heNFpPMKDg45OfVHTt5Nx5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5yV/dtQhLn6TpQlYVtE/zKo128dU0yQUf2JX05RvLqMy1/dbHmogOtjyOeJbQ/a+M+Wei2dNCNBA+92tVYQgqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5HsVSrJFSVrvvaY7PR3ixMRXsFKqzHfSxFa0nNfIYsMMtdFSB20+/246yCxBa0iZ7H/f1MUHf5Dzuf6G1f8b+Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"phtNWuw+s6rlNwVt+PgyXTrg6l5QLytx7A99mWlFHdlXhJL4kT/E9iSGoutU5nmVGqVI3T3Obc3xqaPT+bwXfg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"aAMaFvYTgfSBuYdQERL3b9Xb4y6DLfKf84wtfL2tPRV/xjdXpuj0KjqJw8whNopkCdOGwP3J+xxlaenyfn1vSw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sy7aCwhwl53QGymG4qlTarx+z2YHt4nXhRTBuAcWdOhF07Ij0G908kNJjOLRO5ppCXoVdpGgYqpE79xcPYKrbg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rpKHlFQBR86UZnlEIb/JUNuzYLbwpF9cGl83jhh7j+sAC1Tg5OFW1aBqxfRscgFKuv2CCQzyUo3mltKsZuhkeg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GUka0bGpN9vw5UjP5hLNkNF3AhMj7opdkFi47Ieo+X5iBcP5Nir7Z5XnPS9fqi9psrSuUellKOc9kvKNhTLKSg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g2Ogh/Y5E59Gqy0SRh3q+QKx8BGVDqh7WfJwzXq29HdJl5np6YsNGgXki046dtIYXM7Vk6YqhbVWpWlx5D/jhw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fxllR6psdh00kEGZ13C9GbUK0Ef763WPehcu0Cw3nGtHQMEnFJ0baEOT+exnK2rMPsDSlzRV3GeWc9D5Y5hpnQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Jk87FQTiUyvACAZ+LXzQSym4xFBwjT7dEmlXCfrKoc4Gfulki9zLJCPpYtTdAsB+d5VdkEab3Ywx1WECm0Rgxw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RszGJc/GTwskYskc82z9WfRUfdmMT1EXnBBa+lbhuQ4SkgiFx6EOJ4R66i5xQI0vjccEkufBvsX58LYnhKiiyQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AmnwZ3Grd2QW962s+rEn2QvuwFWhhFC3k8e6k+Lpq6hJOVqgbGWXGtPemqSHwmML62Za8Hyzcao9Y4zuXM8JCQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qTF3punEcwvO68Sd3WkL3bq2LYi47P0SJJUwi0gdsr9jYV1LcJLfDV6eTLRD+AuX4uKgi1ZZ3/UNxYjaFRigLg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"V+qs5vyCMaGRN+TxNYqX79rypwMK4oypWzFZog0zaIZhjcUpVL/iA5OpTIsNrI5U7X9b04dfDcrC/Vm3hXHzgQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G+7GSHxC1vZePPrygv70woPAyfm1B0A6QSGEYqzsuFVrYQjc+VpnQcZRxujJK45wdEA8gJljp6nEUIoe2fvX5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OO7U2vDRqdsXYGH97YoH9B90ZvpcknnSYgkqDV0h5RZea0Ot1MDC26QlSuT7K+ue0baNFqJcHEXT1YjZaMcbaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y0/pWqx4XTKb4JVmh0gfBQffJ31hYcE4GlolQot5/qpJ+0IivG9G3lrfhbbEl/6heNFpPMKDg45OfVHTt5Nx5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5yV/dtQhLn6TpQlYVtE/zKo128dU0yQUf2JX05RvLqMy1/dbHmogOtjyOeJbQ/a+M+Wei2dNCNBA+92tVYQgqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5HsVSrJFSVrvvaY7PR3ixMRXsFKqzHfSxFa0nNfIYsMMtdFSB20+/246yCxBa0iZ7H/f1MUHf5Dzuf6G1f8b+Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"phtNWuw+s6rlNwVt+PgyXTrg6l5QLytx7A99mWlFHdlXhJL4kT/E9iSGoutU5nmVGqVI3T3Obc3xqaPT+bwXfg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"aAMaFvYTgfSBuYdQERL3b9Xb4y6DLfKf84wtfL2tPRV/xjdXpuj0KjqJw8whNopkCdOGwP3J+xxlaenyfn1vSw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sy7aCwhwl53QGymG4qlTarx+z2YHt4nXhRTBuAcWdOhF07Ij0G908kNJjOLRO5ppCXoVdpGgYqpE79xcPYKrbg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rpKHlFQBR86UZnlEIb/JUNuzYLbwpF9cGl83jhh7j+sAC1Tg5OFW1aBqxfRscgFKuv2CCQzyUo3mltKsZuhkeg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GUka0bGpN9vw5UjP5hLNkNF3AhMj7opdkFi47Ieo+X5iBcP5Nir7Z5XnPS9fqi9psrSuUellKOc9kvKNhTLKSg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g2Ogh/Y5E59Gqy0SRh3q+QKx8BGVDqh7WfJwzXq29HdJl5np6YsNGgXki046dtIYXM7Vk6YqhbVWpWlx5D/jhw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fxllR6psdh00kEGZ13C9GbUK0Ef763WPehcu0Cw3nGtHQMEnFJ0baEOT+exnK2rMPsDSlzRV3GeWc9D5Y5hpnQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Jk87FQTiUyvACAZ+LXzQSym4xFBwjT7dEmlXCfrKoc4Gfulki9zLJCPpYtTdAsB+d5VdkEab3Ywx1WECm0Rgxw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RszGJc/GTwskYskc82z9WfRUfdmMT1EXnBBa+lbhuQ4SkgiFx6EOJ4R66i5xQI0vjccEkufBvsX58LYnhKiiyQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AmnwZ3Grd2QW962s+rEn2QvuwFWhhFC3k8e6k+Lpq6hJOVqgbGWXGtPemqSHwmML62Za8Hyzcao9Y4zuXM8JCQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qTF3punEcwvO68Sd3WkL3bq2LYi47P0SJJUwi0gdsr9jYV1LcJLfDV6eTLRD+AuX4uKgi1ZZ3/UNxYjaFRigLg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"V+qs5vyCMaGRN+TxNYqX79rypwMK4oypWzFZog0zaIZhjcUpVL/iA5OpTIsNrI5U7X9b04dfDcrC/Vm3hXHzgQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0K9XFITRAZscBYnBZcuQ5o3kT954xWmHuOiQUoAxuMJsUSX6CblwCm7YE8j5ELDvE8STnvKC40K17ohGu0iylA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"elgK/N388Iz5oKDzZr4t0dmeBaamC4VtBPzMHFYz47hNFvqHsHgJuL3lEtTQw0HqCOmDqlo96PIMrq/xL1JNeA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"pOrIun9Eu7qyQNMRBdIGDif+bSXhwkPCL+N1/5npNtsGb4xMhxpBP3yT/Lq9VmotatYExusB8zv67uyJj6EKbQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qGV+uH7f3tTjf4VArb1QF6YX67Yak7wU0MmT+U8zR0M6e8LJUfqufu1Ed8lAv7oQ148sTBHm7lG9BA0sBPT/hw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1mG5XOwHMust28kEm3mU5xzlTNeuJxEI+RA9vXMY5LQ+7QKHH35Jr2MbeW/40vVk82bWtxdFX4a/Cw+D142gqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"kRBCjz7SITeivFCjgohy0TzMjqmPbXOAdacH/frLPbItHCaaTfF/tIWQUP3F9HYh8EG2c5SPgocLKIIyGDNkXQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"xxvYsUyp3A1KK4xIchgEBHsX6QVAf3Lqk7uQSwj8vZAayELv25Jo/enGiXzyopH0bXyuKlGjfdcHKR5dQ8VfoA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qGsJYQgoLimEZzLKR2BmxQx9fxl6v34tQRITkUrtPP9jiYcHUUZuMQmHlzkhE29JJh1bCdm6QAkc2aBOdLasNQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"C2KNw9POqmtvQyAXaYkjQQHq1a/iRr5Eu88HdwxF8KEzIedIpAuOlyBgGwHkFwIkLYIpPVhR8cJXoHzLsV3w0w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"git0TH08GJKUkdmOH1EHjlcpBFDgOBgqikHZNPTh/ktORDUoO3izV7WKK6TZTy8OxFDUkbC14sb3W9M8M/GQ1Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fYL42+rtkVaR4A+Ecp8sud6vaYKciPf+EeRcDOUfldErs1lCToaCfZjxs4DJ9J+iMcIjyg1cczuRr2EjviVo8Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"MRBFuxxpHJKm7Ua4WhGZiukEHi3j3F4CmXk72CKVuXlwQogd8Av0g4ji9S/2L0ZH+5z6c9s0ap+7vBYzE4G7SA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"B8ieqH3XjzVqB4no0OQDCO66Bqs0+LQD6AYba+oYmy05OVyxX7xwszootmv5eYMSUt2USWN8Shf3HN9NtGLoMA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5MOLSFMZ+PxHoR2y6rwrFxmYle57dtILpWY4n364JiNgQA5yKkpjQ223Srufb3yJfTrqPtshw/AYf6eYraKEXg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"TQIr0tLmfAvldbLdDnZHnI/Stxnxj5Ha8XJFHg9MKBpd80W9A7n5IKsxwn+gGAvOrZWE969vmYLAYx2qPpjR4Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g7pC5xf9HvIZeyO82aJzbqnMXXu7cC30bkJ3h90n96VVUL2Vs3m7hGYq64GolwQLkLYCy4BoqI0K1KmWgKnfJw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"b2dNMfD+K2Un28ji+Kegt7t8uVXvASPh+KjcRT4NHHMLJXCevBmYCvISIpxRYnXZrd3eU7Z3/Ui6inIP7N8RdA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"S0gWccFnm8zInib2yPeMOAS88+xh22BZya0HhikfYNMrkHFPHt0seGW+KTIuaWAUiT79gYYViFdBRnaBvYnr1A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RxXliVI+xdd8IXpvBtrhOOR4CfjeFqcFAzu5U04wG4QEv9J6QMzdCUYS0fabGbizUg0YIbxjduJpsbgFb29w1Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"wE4jDZd9BoDYT2Hrre6Go9Evu07/Y/ylQE90p/f9961pJdE1VWGIVKa9e6cd3V0WhyEiCDUvgMrwksMkDSUGOA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3ZzJTYMP9kyHozVzuoZqiKZp257HaTcp71hiel+FxxEL2cC6j24v1TssBoqwUARYEHkek6yj1WAY4BCYOtA4HA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1JArJ2bOzc6Im5SDgNjDsqrF/N0KCLz558ntuub/pXNuSWt6gFsFir4Eerg27tCvV7zugZWz3HLn+ErAq4Khaw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"32oPuVz4U2LnUF+wUgmEog8LVSR64r1vdzjbylfDdZ0KCppQFyo172eglV9rs8SYl7z6qM+qt2inUWv1N6lHhw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"i3aH29nsx2BoRynHURfBnHv61NNC0uILP2n2A0t1hb9NOfNyiIaMbQS9ETrN++NjuLfXyxngi3IYRF5KoMn/Vw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Pz9ao+RnNprgUh5dTOFfwQR5jdQQYrMZTqLUMWJaBoci/jNujl9UjySXNIc2TQepTydtSpRM5uJ/i0AgwhqoFg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"MlzY0Q3IX2ngoI4OvP0QgkotoyYAWSKxeMU5gTRSde5YgezoQ6fKwrAiQLbfy+7WoCbvU7nGRMHVS2K7akyjrw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"useHxyDXK73e0vvkiWDmU97QH8+Gr6HBlMj2sFx44OUq4PFWAyTIFTzr4QpYBDeUjy1ee3K9zZJg/Ianifv/dA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G+7GSHxC1vZePPrygv70woPAyfm1B0A6QSGEYqzsuFVrYQjc+VpnQcZRxujJK45wdEA8gJljp6nEUIoe2fvX5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OO7U2vDRqdsXYGH97YoH9B90ZvpcknnSYgkqDV0h5RZea0Ot1MDC26QlSuT7K+ue0baNFqJcHEXT1YjZaMcbaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G+7GSHxC1vZePPrygv70woPAyfm1B0A6QSGEYqzsuFVrYQjc+VpnQcZRxujJK45wdEA8gJljp6nEUIoe2fvX5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OO7U2vDRqdsXYGH97YoH9B90ZvpcknnSYgkqDV0h5RZea0Ot1MDC26QlSuT7K+ue0baNFqJcHEXT1YjZaMcbaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y0/pWqx4XTKb4JVmh0gfBQffJ31hYcE4GlolQot5/qpJ+0IivG9G3lrfhbbEl/6heNFpPMKDg45OfVHTt5Nx5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5yV/dtQhLn6TpQlYVtE/zKo128dU0yQUf2JX05RvLqMy1/dbHmogOtjyOeJbQ/a+M+Wei2dNCNBA+92tVYQgqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5HsVSrJFSVrvvaY7PR3ixMRXsFKqzHfSxFa0nNfIYsMMtdFSB20+/246yCxBa0iZ7H/f1MUHf5Dzuf6G1f8b+Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"phtNWuw+s6rlNwVt+PgyXTrg6l5QLytx7A99mWlFHdlXhJL4kT/E9iSGoutU5nmVGqVI3T3Obc3xqaPT+bwXfg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"aAMaFvYTgfSBuYdQERL3b9Xb4y6DLfKf84wtfL2tPRV/xjdXpuj0KjqJw8whNopkCdOGwP3J+xxlaenyfn1vSw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sy7aCwhwl53QGymG4qlTarx+z2YHt4nXhRTBuAcWdOhF07Ij0G908kNJjOLRO5ppCXoVdpGgYqpE79xcPYKrbg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rpKHlFQBR86UZnlEIb/JUNuzYLbwpF9cGl83jhh7j+sAC1Tg5OFW1aBqxfRscgFKuv2CCQzyUo3mltKsZuhkeg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GUka0bGpN9vw5UjP5hLNkNF3AhMj7opdkFi47Ieo+X5iBcP5Nir7Z5XnPS9fqi9psrSuUellKOc9kvKNhTLKSg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g2Ogh/Y5E59Gqy0SRh3q+QKx8BGVDqh7WfJwzXq29HdJl5np6YsNGgXki046dtIYXM7Vk6YqhbVWpWlx5D/jhw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1uqn42u87gfvdd43d248ngkkt8zsdslpxjdtu4j","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"fHXMn2X4IMXpfrsbAp4FeHw3aUT4ojco+TtcYb39dSpsT38q8I8l+LD+rcmTzv7u4Y9qXxLYd9Vow4dl6lhbuQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fxllR6psdh00kEGZ13C9GbUK0Ef763WPehcu0Cw3nGtHQMEnFJ0baEOT+exnK2rMPsDSlzRV3GeWc9D5Y5hpnQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Jk87FQTiUyvACAZ+LXzQSym4xFBwjT7dEmlXCfrKoc4Gfulki9zLJCPpYtTdAsB+d5VdkEab3Ywx1WECm0Rgxw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RszGJc/GTwskYskc82z9WfRUfdmMT1EXnBBa+lbhuQ4SkgiFx6EOJ4R66i5xQI0vjccEkufBvsX58LYnhKiiyQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AmnwZ3Grd2QW962s+rEn2QvuwFWhhFC3k8e6k+Lpq6hJOVqgbGWXGtPemqSHwmML62Za8Hyzcao9Y4zuXM8JCQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qTF3punEcwvO68Sd3WkL3bq2LYi47P0SJJUwi0gdsr9jYV1LcJLfDV6eTLRD+AuX4uKgi1ZZ3/UNxYjaFRigLg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"V+qs5vyCMaGRN+TxNYqX79rypwMK4oypWzFZog0zaIZhjcUpVL/iA5OpTIsNrI5U7X9b04dfDcrC/Vm3hXHzgQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0K9XFITRAZscBYnBZcuQ5o3kT954xWmHuOiQUoAxuMJsUSX6CblwCm7YE8j5ELDvE8STnvKC40K17ohGu0iylA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"elgK/N388Iz5oKDzZr4t0dmeBaamC4VtBPzMHFYz47hNFvqHsHgJuL3lEtTQw0HqCOmDqlo96PIMrq/xL1JNeA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g12vsl72vkygm306py6q6hjyqdsnt5ujeqh2n40p","to_address":"g1un6eduj3js40765mmakejyuez8x6t4sp44q99p","amount":"999999ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6tnDWbHbo5j59y0A15GSvlkP7Rs1zaqfCr+OhtQ03M5"},"signature":"S2frnTY2D4Q8kzqQQ8q/1Ow38fiYwqluszdWxJl8TshjULgfDcjmddotDxdFCvgidQIt0voh0nHQLhozolaOog=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"pOrIun9Eu7qyQNMRBdIGDif+bSXhwkPCL+N1/5npNtsGb4xMhxpBP3yT/Lq9VmotatYExusB8zv67uyJj6EKbQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qGV+uH7f3tTjf4VArb1QF6YX67Yak7wU0MmT+U8zR0M6e8LJUfqufu1Ed8lAv7oQ148sTBHm7lG9BA0sBPT/hw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1mG5XOwHMust28kEm3mU5xzlTNeuJxEI+RA9vXMY5LQ+7QKHH35Jr2MbeW/40vVk82bWtxdFX4a/Cw+D142gqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"kRBCjz7SITeivFCjgohy0TzMjqmPbXOAdacH/frLPbItHCaaTfF/tIWQUP3F9HYh8EG2c5SPgocLKIIyGDNkXQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"xxvYsUyp3A1KK4xIchgEBHsX6QVAf3Lqk7uQSwj8vZAayELv25Jo/enGiXzyopH0bXyuKlGjfdcHKR5dQ8VfoA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qGsJYQgoLimEZzLKR2BmxQx9fxl6v34tQRITkUrtPP9jiYcHUUZuMQmHlzkhE29JJh1bCdm6QAkc2aBOdLasNQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"Ufjv3hvwfqBgqs7OnX08CUUMlw4/dmg/7IKXzc5MiGJCMip2Ox5TDBPv475Oht/CJDzyvsZXMpVB7SKxQ360AA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"C2KNw9POqmtvQyAXaYkjQQHq1a/iRr5Eu88HdwxF8KEzIedIpAuOlyBgGwHkFwIkLYIpPVhR8cJXoHzLsV3w0w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"git0TH08GJKUkdmOH1EHjlcpBFDgOBgqikHZNPTh/ktORDUoO3izV7WKK6TZTy8OxFDUkbC14sb3W9M8M/GQ1Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fYL42+rtkVaR4A+Ecp8sud6vaYKciPf+EeRcDOUfldErs1lCToaCfZjxs4DJ9J+iMcIjyg1cczuRr2EjviVo8Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"MRBFuxxpHJKm7Ua4WhGZiukEHi3j3F4CmXk72CKVuXlwQogd8Av0g4ji9S/2L0ZH+5z6c9s0ap+7vBYzE4G7SA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"B8ieqH3XjzVqB4no0OQDCO66Bqs0+LQD6AYba+oYmy05OVyxX7xwszootmv5eYMSUt2USWN8Shf3HN9NtGLoMA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5MOLSFMZ+PxHoR2y6rwrFxmYle57dtILpWY4n364JiNgQA5yKkpjQ223Srufb3yJfTrqPtshw/AYf6eYraKEXg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"TQIr0tLmfAvldbLdDnZHnI/Stxnxj5Ha8XJFHg9MKBpd80W9A7n5IKsxwn+gGAvOrZWE969vmYLAYx2qPpjR4Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g7pC5xf9HvIZeyO82aJzbqnMXXu7cC30bkJ3h90n96VVUL2Vs3m7hGYq64GolwQLkLYCy4BoqI0K1KmWgKnfJw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"b2dNMfD+K2Un28ji+Kegt7t8uVXvASPh+KjcRT4NHHMLJXCevBmYCvISIpxRYnXZrd3eU7Z3/Ui6inIP7N8RdA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"S0gWccFnm8zInib2yPeMOAS88+xh22BZya0HhikfYNMrkHFPHt0seGW+KTIuaWAUiT79gYYViFdBRnaBvYnr1A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RxXliVI+xdd8IXpvBtrhOOR4CfjeFqcFAzu5U04wG4QEv9J6QMzdCUYS0fabGbizUg0YIbxjduJpsbgFb29w1Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"wE4jDZd9BoDYT2Hrre6Go9Evu07/Y/ylQE90p/f9961pJdE1VWGIVKa9e6cd3V0WhyEiCDUvgMrwksMkDSUGOA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3ZzJTYMP9kyHozVzuoZqiKZp257HaTcp71hiel+FxxEL2cC6j24v1TssBoqwUARYEHkek6yj1WAY4BCYOtA4HA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1JArJ2bOzc6Im5SDgNjDsqrF/N0KCLz558ntuub/pXNuSWt6gFsFir4Eerg27tCvV7zugZWz3HLn+ErAq4Khaw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"32oPuVz4U2LnUF+wUgmEog8LVSR64r1vdzjbylfDdZ0KCppQFyo172eglV9rs8SYl7z6qM+qt2inUWv1N6lHhw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"i3aH29nsx2BoRynHURfBnHv61NNC0uILP2n2A0t1hb9NOfNyiIaMbQS9ETrN++NjuLfXyxngi3IYRF5KoMn/Vw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Pz9ao+RnNprgUh5dTOFfwQR5jdQQYrMZTqLUMWJaBoci/jNujl9UjySXNIc2TQepTydtSpRM5uJ/i0AgwhqoFg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1v664qx78zhv2edtx6ypdylfpafrqjz8g2rlaea","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"rTWk3CFCjI/MNgkr5WTYVE6ydYkCsVWMOAuTWk5RxAsTL+zSJwb7qwucPdac18+ZE+tBj/CZl3jDPlEqbRGtcw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"MlzY0Q3IX2ngoI4OvP0QgkotoyYAWSKxeMU5gTRSde5YgezoQ6fKwrAiQLbfy+7WoCbvU7nGRMHVS2K7akyjrw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"useHxyDXK73e0vvkiWDmU97QH8+Gr6HBlMj2sFx44OUq4PFWAyTIFTzr4QpYBDeUjy1ee3K9zZJg/Ianifv/dA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"DUQ7Cs76HHQ6J5XqyMDf1oCufOMtfboZWG4Rh2QAayMohxQAHzOnYp9PoB/J48SsJ8A0oL006IvZIvyAZ5dL8w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9bkNRN9vkR2cUl1WAIWcfv3pdasg5IKeGCl8QgrZVgJyHLnkcS1Lef02X3do1rlMui0RvtVRR2ytwb06ASS+UA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"BnCMNzUTpTJp0S1e37t3f8iHMTG4XzsP2RRBHwahkbcDqkLICPEpSiTVGCX4QNx6cBAz3iziRarVJ5xptyitxQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qp0FSC+cM7IB97Qg8d9r2JRuUhjmDjTk4L3R0DJVi2MXbz4uLfq3su98EUx6B4RR42Tg+rmJVYfGUZyzMLdLHA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"CXBKJuKxHBysTXgegvOLbc3dBTUqJFl5epQkGZjtfSNX/77i8UoYqeqyymTEaCYif/gkxjx1gYds8FfI8gyOcQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3G2uA8tHcb8LMk9rSOqrSx7bmXAJqRpgR4qTxwXny14ecYHLrZYoN6ol7YYAcOgrgFjIEYn7YD8Tg+g77d/5Lw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"d6ZnqzlgPJwIxh9lesfGStq4zP8wgRinGwgRvLpxCSlMYmydxBcgSqiRGhoaYQdN6D3esRBX090t3R1K1J4O9Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"v9SiD7vZsgjiww5M9RoDgyqXS9a54OPeldsk+igGOX4WVNerR2gdcfTewJFtz6r0+sMzxUM3y0TCClSJppZHjw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"/tWgpynW1EbDE2200qHkRdAyOXNtJOIr9AZ9JvJQ0HNi+Ap7FNuqqwZsFscX9cgg71b5XIon2c9zws1u29e2Nw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"XZFlkN9x7Ni7ZZ+h7FhmmH3VCok1E7ZqIYCrK5r+aoh9+hMMHfucBz/69Sr3MAGj6e7yTjT1NT0Ol6GZlv3LWQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3Z4tpmdimv5cGEsCfhDxHunUcYm2GF2sYjLbva34AQgzDyn45uRG7qcRBQkgK9FaKNU7jiOJdhOEBaS4rwRLrg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"BFWKchFXQz8ctgj9RvJ1bhL3+UWRIC0P9h9SLUFN7QgOppSDXqnx8bRCxz9BfVPUpmhGhfuQE8QhID7yEG0tdQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RIQIgtR6jKCENISFZsF21Bauz6CR42iH8vVMv6jzdw5afK9BUZiq8LqRYPSlAPcyuGGeXqw1vRJ8iGYsfqJbmw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"4h5TBDJnLq4tLniJPxb5KQ2PvIzlrI7mBCu9+t8DvyYD2ngRmCJiYV8O+ptoBJ9Zi+g15jIcexcjWm5wwFIOrA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"VUo1jZTWpjnxUPKUgUoFejFFyQKNOGgy9K6I2P3C0SMXJs7vPxoocZs1bXqSgcFMD1PaXBQHrg0MAOJrCEeERw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"u3a4toTRtd332a8s1Cwerjf9PNHMZi4qiGfbWscV1dR0wXYafjEAxj1+g+5FV5bvkJV2taNPYHUl7woLdBSrSw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"gMkg6yr9NUL+S217dJx7iDOTqQBeltTRdNr7wf2iDhRG4qjEJsKVpPTb48qX2jCjT9sgKcGDe209MlTYUf0aQQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9iG2FVmi9beSwiK9KGAp7Kj0EgEW3f+TO+hYSllTRiwvD2OsPxNzgMFzK8VdmkY7bNQco5wqct8AWBAeB7UdyQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"bJDj7aD4/A7LTvX6Qz6rcUFfs9hPvj2LJtFLWHnPFog8OhUIKFjI2wcWyZFBpkHYJyQKjOZHO92x2EUeLowpLQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sLwNlaapwQpDWgRD3Hu2H/7X2X4+mDOfgkJ1UBtEux8YN35V8IdsH/xM+VGEg6SPjviqHvj9OsKH17A2t96tdA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qq4+mzEVRra7WDJM70tseZD2pxmDHO3rfQw5GOG7Tp9DQh+avmmrdg1gDv0e18AIJXia5Yr5+eyBCHILLOevvA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fnRP/XezHy2AJlON5yLdeOjYCQdyw8rZxWzqP4Li4KsVhFmlSCV0UfOC1mtoGGOvQDWHsmuQHZuhxyvLDybjTQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"zYYhSOMW75A9eMBI2xWPc6gTK7E5KozSB98e7GbD6y5zJZRZjFpDpBFG+ZRwd1h3/wqvhV024y2nj/IqJv0G+g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"bm5heK5sEuPDNPPP6FAjVYI7BtRCINPCssNM1VUYBGU/BeZXz5jXUh6ZnrMMV/62Q4zICyDt81X6XpqcUt7FVg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fpE7Q9GFmS4+eKYvSm/5NZLs/RqWOktCq+YApAe4bn0azu0KF7BNy+cUIrD50pft58qi1mJdJET+tpbPMttIug=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"KQkgb8fWyOsTCNkibpd2OZS6YvV0BpGOxbKY9F9jrCpAQXqYhMjMpoXhgysh41ggL9yozJYMniDrZ07i86XhKw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ED7DClAGLfxTF06GgsvDutUWefXfKRbjDq9KPDtzutlYAugvIvg1HeTi3PYQJ5KHjouoyN9YV6z/XCXGED8zOw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qJr2gOmXpb9Q8dkhzXmcS38qSN0v1snbx1K1i6+s+m11tCbHhlhNqAg3v36rh177DsKqUPt2t0D2kX5MKUlHyA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"SP+rp9OqDQXQSwTklSedH5EmibQr4s0ciOTpYdcrm6dXyAw8HkEgX91vvAf7L7O6w3DljhItK/f+FuRVDnLjOg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"EqoaeTzRujnOM07rgs8R2ZGicLCwS3TlfbbyEvmWrzUX+iraMCFHU2vvvLwdZ1YZVY/lQNpq9NomCbiDkj7v2g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"IFe0f5HNzttK7wx5AWJjN9DPz2aW/qYN6ZH51z2Eqa9bOEEtakK41n4ZTyTIkUTS46q+awxScSyrPHAVrAFU2g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"7HXbPGQrkPNCtCFOuawp0H3ad955S8/emDiPHhtHUDVXMCp+JV2g/LtRxvg1BPI8Ngc9szMpRsbt6g2NrvEoTA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"oEW4n3ZvcNVze4gQei3naLH9Cn2FblcINg+UxVSK3QZoVGHWoI2yq5m9uHfqvBilEpZgrirdjaFUQgajakRNgQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sYNlCyRT3Zgg1J1LVbAJ4WcNdngacTweMTT3C89+nBAwHk1z/Vaesgt+wIGevmBCx8Sn029klEyWZwGloYlcFA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sUENkLrtwC7HCQpxubvCDgEmvPldpHYB+UMWkcIN2p4iygsAFbsduR6iVv9eJBF5rV5QDNNjeOw/jN/bMElhJA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AZYEa2wlLhPftKCbOrt9BGSg3bT8NEEeJkx/4izWygl01qovuvY2v4uY08LV3r53x3i5+YNRBfUMBRJxUio1UQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y1X6kSZB30xecpGPI8ua129FEwOlk6+eZRJ41v8R+497m7lkMK1204y2tcciHw3Ca/SQXVZ0DIItS4a52a8ISg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"iXdBKO7yY0XQWwik+30TcY4G+PH/D6SXRXrFSDPmYnQ29NckX0MO+eoLNbFLA+4kFwd1QzJcGcQV93HsKnwD7w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"UAqfYxpI4lzzuOXk6nRYwrRgfm3zYaaP0/lyDeY+RhkjRzp1NNvT6Jw2+WlVBloYAmPsCGHl+ZlvPwHSaU6ZZA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"NcUNsXGOJhdTELVaCF3P3EbQ5DaEy6P4dxPmT/gRTdcVoZytMrVRwkRu1q14VJ5Qh7n/D6XQyg4ldprT8bAzFQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"snnLpuA72vK9FwZZIwCEi8MdJob1qZUbrJMbP3hAWYgFeNNOvlli3ZPisYNpb04uKJoJCLaOO9tJlMWfnk0M5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"zG0ikhc5N8W5OD2LwBMmzNUVu+YwIA/G2HFNws+s3twD70hC3zweKqPnHR4fX5gbMiyhc34WmpmYe0tF6nJxPA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AfEBUIp7mcugkORTTSh3AKTsy/o5vTdKbX9IJtzgwBEIODY9sdpOGD4fgACiXTix6HtdAyj3I/Psoed0b8iHZQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"LNd3Vb4Ry6Y1PDRYNNJzq2/9rmmqEftkaM2/jdfLc3RkIN34Y/1hzhirl7uQIssvqCZKv8zxkFzwQLsczVwD5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8HiQVTtN5J02mzgVQgeyLWUj50Av1aFNOGS7tRTvAhZOTGLRmvpjAl6BcuDQcF2+57A4l0yDeMUxkmkMCgOgGA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"wDJ0E4UVu5G/7u57wCC5VhIFJcK6S9V5IE0snse4fOhDA1CD9f6D0ej+Xz6vrnUuHHQzwOFJfowGlZeTJp9tBQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"JUizEIZ8mKVrevFfgsei6X1NO3qupPoYtZmuHruF4m5c3DXsemmx0iQJETHV8+5g6kDuI1uR17PO06IB2D0EdQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Pxrf+1f4CHjRd/dJ2afqfUzWh+0QiWpVXjLRz16rPsQ9mBO8rpZD2rf7foGBaGfwwXh2J+UfEYVxUs9XxPSddQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"hjcg2iL1oq00gcY6VOzzqUliIyryP7zV+ZCe5GJtqiNsOYp3ZbN/uH9BxmXPdF7HjoouDog7zn3cKVwSxqD/Gg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"+1b4q/dD0xGeSziXmeB1njhUs4zRUv0rLZ0g9F/wBrIA9/ojyyXFjqJqrCt/pQ9IUircG+A6Wvem1kdgsNWWGQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"00mNzW4bnkR9yQv+aznbpg91vrLojXu4bftyw2stw35e88s4jC+mzUup53BqwRYE2JhZbEzLX/MP6pCI7f5EDQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"uii+/ESlkKivVYK3XteP+KjPLLsCKrIY3x/KDLmlHKUNgp4szKqL7Lk85ivuZe7BNeWQ1xTuDC6AYt+k8TFmdQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"N6KBSlh14xCm44YnGQqGNA6i9rSklrKt1T4baXa+2HkxGYW+OY1Mq8Mw5rHzXNxNo0rIKTL7pwsGb6eC+wi11Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"isOEo3/+XtoxxwWo+8mE7kEoUDqHMon69nnmH/6DUWJkvjc6yE+uEQlrInn3TZbXpCZwWNle/VEkwIeicZ98+w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AwSu/QRenTswEnJwoOneDhIftuhdknQXeROhXXvvVaE+zivDnffubswHcHtCYkiJHwEHCKIRWSnY3TJ0/44pFw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RjecZ87c8qgLCjGhM5/SCbc3rHIM4wwAv4MZJMNCCe1Ve69dEqi0xu3ricW06vKFGr8lRwSeTxkUtb74FaQZLw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"k0qQvIU5hfR/anVjNx3RCFz4/ZcVB0y7Tc2tqEhVO5BgAcM/HExcxX3pDGJkPQ9MDL6B3f3T33vujV2yr1iLhw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"u8DTAYxhyE5InKPi2/gshQpXaeJLg/4A5Cj8CZnPhCllTUjK8dIWyKf3bXLsgSxHXVP+u/QWg5yj3CpPPR5M2Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"pKy8GGHpzH2npH2cjz1HEIRTI2Dj7vYkoGTL7za8PasdqE+xEAi/0+Y+YcVgfoECZDSD+NnX0/wkfAWzJcVMNA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"N2pRBZuF62kAi8XpguwFfrG9FsQk8TXL7wMv38fmKd98a4c+qgtWTncgrn6MxVwNhI0NTDTjnbRrFqYmG662qg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8DHo/ZpmpmA872epluy+tuINx93tc9JjFKGvKyNaQh4wQzngFjyrn719dqGQugylrbY82LnGAh+6KO/9L2YBJQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"QtKbdrurUgxjSHfjdF9BQJ5RKOPZooAfLNVLL7NzhjxsC1V4150kuWm4FneliMTV967LvH7lkzcxVXQXycW2MA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"mcNjjzTA70eQ8laQa+l3FSrJcf49jOqPye1YLbN92+tEUnI0p+Ss9JgtOaIVOSaNscPAtu3L0LiFCCE4oOWwCQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3Z2eUkRzxMIXdvamfAO5qilrDJoJLHyf5mqiHk91wc8z/VAIZ3jDDnFXsS6UExPWRT0d7K951EiOXctrQSiOCQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9V37tjLnKacCWRLS7kF/nWq2MuUPhYXKzGjlA1OTVnJB+UNab6ZkccXVh6W0pCYo8jfwidyYX3M0gSF0QUgwfA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"w0OPAC4O1cOrU4/3BfKMvfY1buwku9Tg81vUf8d8flBeovgMVRKgM4wEhR+A4qYjR6DAnvcikAgVY0wdR1Uj7g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9RUxXTDdolYiEyfih6BWF8COn4xs7+KJiuEt71ACMG0OaZhwEYy/V3NSPFJSuLl7XCWBttGJ/4+k0SDBfqu+iA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"E3KBU8CiVGvJOvZIHv1BQmO1IMKDp89U/TGr5gyq/P9peaYrnQZA/qFqywHBqgzuYXRHe3zE7XruRIMhTsF+3Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"pGrD149Edxh5LGkdVCJQfLLpbwu4Y9BOHoyjcfJSu/I6gTprgnVLPvLArs3pOHVKFdm5BIjJGlG6cax2MqhE/g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"dsvtdwBSN9cODHOOsSvdKK7Mdy1PCLq81QYOzn0mjPMBhOXFz7eij5AKKbBdRcouD61G4v5bWNPgk31BC2vMsw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3PK5n23LSAsTm0cxEaHGeNkp9UyxRxcH4R0zWuSOZ7xKpQ5T+EIukgKYqAq+kfxLnK5aG9fGgPg9aQfAO3K8Hw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"QA87rqHxHI+sMhSffPpo13gSi+rkg1ZZZ66Rb1KsHu86NtoQJrrzuGyBis0umn1Hm0nWEb44QZUUYcK3B0s2kQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"De/APSclHPXQBIs0w35iJZc3CvitGZYzOHpF8ImFOol6CjvEbDHRjPEfRcZOo2claePQoy8C4VBjCZubl4YgXw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OjnzZiLFQo/HmpJXJX/Qu/9c5lUTX4SlrCFAvPDI6yIGBSIIxj3DCDkVl18HTyLe36BvtFmegVhoQI7MHphWEw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1OL+LYu2DpS2Pxy0IXJ8TOzT1BCKD6sME2aD3V8DXCdZeYah+bMulsxSQBEVPAvkLDyw/HMO/wCVuq4X/BbRJw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"S1vq5Vr3Bm/tQqT0jfVu1ZaFOwPBPmGSUOW/juW5zQ8Ia/FkHmd9JGvo7mMvQIQFWr4QDZu0xu3IOponuNhjRw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9Ur7+4U9lER2+mtp4PNCJjjlXWz1SMNdFxjW4H0ldLtx7R/NieszjFs/3YCLo8PoO3zFK9fE/E7pnyH3mcGqSA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AVCaaTvHHHkAgnqtAvT2aV4yMZqcbMOGTKWeO9TJ1iBw5zszZW4APbiZK2x+M3ZK/UemlS2wM6KM99lXN2OJXQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GKpHdN4bbs63YemrNxavHYxHpH9Ty9YJvjmtlANBQg0LxF49JC/tNnYC+fPv24x1amHxgWC9a4RWv/BaXURzkQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"kBChAErHeRs0RpQX+jmdVZS13LvNncl5sGpsxptIxHZK2F6pydJOOyf/2kGAit5m6LuFGG/9HNf4SlWHU44hMw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3Zu5PhBz84diRvOXtGhXht5dFB+j8+5RnhlaBCUkvLNoM7RrYzGqyQLyBfJB7uI7RuFddQPSVUeAQFsc0vinbg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"2rEHJdnVX6JRe1JYV8pl/+rfd5xjON6YFBgm75LFQgUlwAFrskLRqGOY53i4y+k0M0KIn4CZIIXRTgmPzXRABQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"kyIR73xgZgQ4ekV82hGLR65nG62rKwPVp8iKJ8AdspNhMPXNfebYoN6UPYcqLEnoAgnZ1lOfGRykPLLWt9b7dw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"6sDxy+LXKttd77/yvPasxealeAkY22kZ3GaKNp9fhhQJNXQRKIAxEsn1S19VVvHxnQijt1QIWYrnHGB5xGNYOA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"blzDNRE2hDkcRevMzDHFfY+o6Dl2ziQA0v6C7zJSZU49xdA8taq7wubP1Avp321Btm/bnKlLm4qaTN81seh45w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"vM3yzOUKUKM2XUIJP59CooGNglgh0aHGioKQP5R5TZBu7sSA2gclL2/9YTld16Kqq+Ck6mSzJABc4v2xVpBY5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"uPFhWVJenzowHVehgIpD6beNoK7rCsx848/1z15AG+c8JOM3ewr/egAomlSgp15EuCc6rhTS3W9Lj2VRNM3XAQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"UPUK5P93f9NUGuVDdPeBuqZw952yIvBoESCQ5U1oKGpXAuAzAZPLziF8+A34m+RYAri/121EAuii4RtskFvYyg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"pT0Ykug8aEWTzpSxxTp94aZkPm/f+B53QwzoeqFjxcw6RuwmYxI8uI3x60l6j/3yCISnGpouyQjGi3U5GxRoVA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fo0wfez7FTFBz8Mec9QuBpmY9dwYp/kEJgR3sbVcwJ0OUhaGcb1y0ALXSNOmjNQzXMvrOkDPHdlqTrayyyA4nQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"yTC3QfzxUgsHPCDcutdOOB6oI7KHZbF63E+U3Ic4kMU03QHH6chN/GJxvQIDtXcXuInQQs3/b5Mo3/hoBkFODA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ql4x03n0R9UZK3raj5A9SsdfKyG0ZmMqoecwmyZgaB9KngxIY6f9QWT/kNfYhD1S8rK+vnAczSVU1hLOV/OPyw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"/Xa9dOx/0chJCVudMF8Jy86A94O5KpxgL60438P/odk3WoY3jBTPk5JyPVgDsqIi1ANhKzcVd2hYdFK/Pt5OwQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"HKx6Ly4HuCkr566ISzgbAoF4tDVrv8AcHFm/Jb879ZJnYhB9B2agQtE8AYlEUyHy6Td/ztXHkNq+nDvKXxJq2w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"BQx5Sja+RC6+YjBoeM6W+ezr7wkA+je7oIJ6jvN4En9JYm/fIDjHofDCLrWCz3GVs+og1bcab2FxVk8svAZMzw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AbOn974OuNEvUNUHU4EDCfqPnzu2/0u4L/BVEkf647sAYJsAN7yW2Oq2xFw/g/1YZpL47JuloRqTzd6yg6YuPw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"tW2l0fGu3VqxCtTr4X2V0VlGlwRHeyZPiIeESV79VgkztSl3sox0Sf1GccsX4v/3/WS1r/9vO+9f+KQMK9dNNw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"T/mkgC+BJX2f5O3iFPtIpqwXj98xZFm5yggpuipZsAAmwGoT/dt3Ro7fAEazOFz/JLPp7MlHNdAAp+IKfgMATg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"NJQtVeOHnbjdlBVNWuN8gAiL1GgLejocYePoNjinnLxyE27g6A66AblCPrDF0Ldn+AMm/0n02YzB3SaOcead/A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5tqBMPwYi9/Cslef6S4IWiB6vi72a2G9UbqkWhKOQ+xJn+ghmAtw/BPblAeobfQVVzVH+zzPusMKBscSJK6/Zg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"M2YlevevuSOrXKAlQY0cq1M+3pANiwxpQpl5OjGpTu9nrMPpNZUzB0RXNZyRcGZPC47kfrqG+t30qunsUG6uCg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ZVaXGZcj6f18vIZp8hcVmHEjJv1fJNBWk0q9hs2nEjcVh6m6CkfVbh5qUC7ZjVbIR1kuVeDFQ0rvP/pfJXIqPg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"q3kO7mXvcWCwGH7okwHSDueyj0Z1NourM4pmS2xN9TlLP7YIL7nzUfBajMip+K5ivyMTzWUKZGusOJxKdUqFYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"/UTl6F2C3WQveP0Fvb/yTgfTr3Zyj3GmMX0hVifi/rsyUqvSGaA8qW9Km//x1B01wKHh3h1/mXZztQrOHsMvMw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"yt/SuVjYn6qBVzrrA1p7bVX7LXKT02S4jaChQOEV91AFS499O/I92DzLDzs0YLeF1w4ECzI9iAGyoq4KyPe0gw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"m+LqZrXYS0vloeA3GbT0jAimcHPypBizdQ/EV6ASi6QCM2hAg4GY+SEuax2lPyGNeRATMux8FwCaUQRInoyw5Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"+0YJBInXhS0hIS1VFImyR7oAMBV9sO1FPEM/bFTkGTEj98Wqv4TAK9NW8VrhmtWxIGukMVs5+AOHCXl9lqKxyQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"7giFg2ASK1zjgZcBfhYRy3oZG5ly5s1P8fCUTPtDm9JmBm1jrd2kk/OkXPhWg7F7Mnc4MWTzwj3gss5BDBctsw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"dh2iqeZp5y9gbmlEz6Yau0d3F9ince8VCaZwdU6I+iNVekx2+EZTz8ru84LbC/ESF7GcnINVXhL+XaQeSewmrQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"WeNd5wAv8vIBykdZ3ozCIiq6i94ZKMSjFZqtfMmhni1JgKlQb+fQmPHkWNtTp0flfXnRmILRGr+FEpEUpu+WYw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OsyBbrSjP7vA4UDOzTLu4K0VR3hBt7axwsyNKib+hjlbwEXe9AJr1+XaqCZgA2gREqx85T68GTZvMQE414qLKQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"nAYPFJY0Kr34z9slmNDFU1e3yyzcDWxB4k94O3kJgk05fxGqHOQo8Dx8fm5Nbf0Y2mkzVkL2Q+ElaIueFIBREw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"R2or6aRCuCsYElo+KKN9W7HgM6Z661tWSrVTSIXXYo0ODIIvOoo/EPTgd3lzo9LgHFdHgeVDgPhiVVsSpoIytQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"7B8pdPimCrgroSQG5YjZR5OzG0GHb29nv9YBiG+xkP08gyC7KzOZP+CQoqxXfuq9Sm+4wLydLOz9rv0n3RIMMA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"gh+jovaXF4dQ8DVB5Q6WG7r3vnJhhwfPVaHedNPUxA02ows0waRLQsw8XmV1DTEogLJMm445+6VdZVchJjLXDw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qGkExeXBBtAH3SUBmvCWuMf9y1xM62Hmzf5KNjKpSOoVlBiPIzbmmuf7rkWrnzDv2eT660Y8UcIcu9dpJgZgtg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"FJ4w4byTndnZ7889c+6ML8wTsicIi1/0E3BkX6GWuG1Kwmh4oB2doedb15kP8rq1FvvItXsDW7vkUk4JviO1ug=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"q+chST11GKkzn6zpN84tSxhrJCIhuVcPraX5zJ9hW/VXf73ZF2npa0/T4u3GP+9/Fxn5DaM5CaBMhdwcDN1i6w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qNmm8VEdls5qwsJYKvT27hy6SMlEveDbtoBjXydmlZ9Sl4Sl8TnMRR3I6WFZv4Gsr8td4OiAl2Yp1Zb1wwPPyw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"hsf1hJCPGaV73xFlmlvroUKj0Ivzxln+OK4IVRPlZug1MROl1Py5pW0qlTHDHxJEoyTk7UWYztvreC9cANiSIQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1fyAihlFDsgF27y60Bi7CxpHu9pPbNSYpJlZGNJ4Ba97r5FXB559FABQ3CatL3RetlYuyUI0LaQ01DiVces1Cw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GtZN4c/Opo0gFT6iTk7deVqnw0q8tB4jtVdZKcTRHiRbDHdmPQygyPXGFet5Bl7/35ExvYXsOoL8qqHb4Tr+vQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"uuXPljD8p1JvdWVglN6cvFrTIfNNZ+0aB7uwC4nHwel5VtYlcJGVkgq4UydwBt6BVIoRc1eQxlzC+ahWQSUa/g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3Mm6wFDa+NUqbf2kUC8C7n25RaJkBhu+ENsFO/IIRB1vCRp/FUzwnNMh5xhinet7usPQt0CvK6oXUUXrMtk7ZQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"o48YCcrWxl4qq8X9yzMZZGbViSI934Eo36EDv51uZjt3KsJIqd+7Cm8G2/GUmyasN3LtMIRzLHBsc5Qo0xgn2w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9KTf9Q2ofRrmgruAusPsxB7+lKYcuFwZjVbhad8MDQFRrr3K9h6GflIjMlhP9uCoH+CxQom8vK2A5weqYFA14Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"SgeTrXZ1dA3M47NENlHram8mhfQgLsqqc/H5jcJwHwILDkMSnmt0zSu+OU+Dj7Vok8crEcU/kkkk6TNv4zA7xw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Yt3SaxIADZ9jFqAWOoYajGYA4xS5FF56iUR4rE0ju7ZvsDqhYHK5RYGTBr3K2NcQYeizvE7jnjUTKOaZ5SgU8A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"q4Kqt7+n+zO+rgIPZ+fIx817YvyCvroUFi19KQJgrZtrHEneV0ELU4ST9SO+xefPgndFruuwsC7Zlqy/7T44+A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"YaJFdfaKFD8z8M4CPZXMaEVRXhqm96HgOaCl+W26ILZT0ln52xb99M8EElIkafpUKCbNMq+g7MzM+Q8bjGQQxQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"zseLGUKAfIYQ/BizpBN50/dDgWe6n4JSesXgJ5tTjP0E1XZv90taSJmAXnvHytek2Ji19LRqHmKa2+yvQrpsLA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"HpSSfsuX/A7mR9Zv+AXCTgliawks+1eaAzbMcfMY+Kd3lrk8fyxlvAScOEyItAbs43ts5IqDh/zASGXjBvL1KA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qeM5rkGmtpz8oeaFgJKTBWKif5/CIB4BGFCNopWmzZQ+8+EDYvJ1gJShN0hyhId8/rB0lTsyCJ++7RbsPc2gCQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"mp7Z3tz/cMOP6bS9iG+nDR1C3pHjSU5ItZMkM52EI3wduswQkX1AkufddWe2oCo5XrW+bhTR02NTZqatxASQkw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"kexhT+h5Me/U3z144ynQ+8tsnAvYbBM3DFw1BxvvaIQXh9IsBKXxdjOW36Efu2ACPTdHDxI2qXSshjeKDcyUoQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"wC0CIgVuOYU6mxEEE3vVExPxTfSL9h/zhf4T8VGwMtsuU6xCWjMsMnzs8PTtW4l4fpRIGz/89RV5KaZODtUvgw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OxAEBVqU/BvOXdSDALdttMV2Fhjdmg6mOlJaEKe51mtBiojZd0zdJt3CmMbBPIfognDvHAz5dPUo7NgOYEvp5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"MRB/FMHGfLeGhxj4RBKcRhFhjWsc0WxupIeozFTHOUN5X1CZbnkvdIRelsZKIRBYR8TBgBDd4BdiWb9qt2YaDw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3mjf6wZuRijeIzfzPZeDIIF3BwgYpj6nBSjhWbumfjUwnoRXU0dA7QjdIsJQITKidsALMopxi44ceMEhSXcsWA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"cAV0zf0ELGgN3+ETG8PZ+XoOxiBTGHpZ9waTBfPRSwZ3jvaqbHIfDe5IS6f+eA45UGIWBOK/IiV+Gc0TEYpgAg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Vt6mJGZ7QM54jcLhoEIH5QUnu7UgWINo9Wfp0jrjlJR+fm5d+GnPO7F81zHQLphBwE04Y962TBDG6f7XBD3i/A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Mcw87yCRophOiFw90Hg84BPAOpcSzYuevXyC0g8jzj89B+kL8EJKz23xYQo/2U8vewPfwfhLXAhIVeLEsDXmzw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"gY0TlnU0ELvkbLqlDP1ApXU3zN9U23OGeWNZrsxef4tMRfggdjmEWeW4EcuxbTsjMAVfpoAhqkU9M0T5NwkxQg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"c9CE2heRjTBcJQzX7YvZye504EpAAC+ueIrEi6ZTB8F9HBFWjDlADqCYofSePsPgy4ArxR2Nod9xyTp128m8ag=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"JPekBL7qrSZly4ruCebDy9UtekK3uCtDYmDnQ6/czPgzR/i4lAom9NPXrCI41U8ttb45o4qSzb8ttjongdLL7Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"uMqlSENnoULd4XOcZOhDWZbg3EQXW4Ln/qO6DPRGo+MJ7vrje47NRgxzOyQpMxj83JwUEpnSF5IhIaZyVhDAzg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G+7GSHxC1vZePPrygv70woPAyfm1B0A6QSGEYqzsuFVrYQjc+VpnQcZRxujJK45wdEA8gJljp6nEUIoe2fvX5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OO7U2vDRqdsXYGH97YoH9B90ZvpcknnSYgkqDV0h5RZea0Ot1MDC26QlSuT7K+ue0baNFqJcHEXT1YjZaMcbaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y0/pWqx4XTKb4JVmh0gfBQffJ31hYcE4GlolQot5/qpJ+0IivG9G3lrfhbbEl/6heNFpPMKDg45OfVHTt5Nx5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5yV/dtQhLn6TpQlYVtE/zKo128dU0yQUf2JX05RvLqMy1/dbHmogOtjyOeJbQ/a+M+Wei2dNCNBA+92tVYQgqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5HsVSrJFSVrvvaY7PR3ixMRXsFKqzHfSxFa0nNfIYsMMtdFSB20+/246yCxBa0iZ7H/f1MUHf5Dzuf6G1f8b+Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"phtNWuw+s6rlNwVt+PgyXTrg6l5QLytx7A99mWlFHdlXhJL4kT/E9iSGoutU5nmVGqVI3T3Obc3xqaPT+bwXfg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"aAMaFvYTgfSBuYdQERL3b9Xb4y6DLfKf84wtfL2tPRV/xjdXpuj0KjqJw8whNopkCdOGwP3J+xxlaenyfn1vSw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sy7aCwhwl53QGymG4qlTarx+z2YHt4nXhRTBuAcWdOhF07Ij0G908kNJjOLRO5ppCXoVdpGgYqpE79xcPYKrbg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rpKHlFQBR86UZnlEIb/JUNuzYLbwpF9cGl83jhh7j+sAC1Tg5OFW1aBqxfRscgFKuv2CCQzyUo3mltKsZuhkeg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GUka0bGpN9vw5UjP5hLNkNF3AhMj7opdkFi47Ieo+X5iBcP5Nir7Z5XnPS9fqi9psrSuUellKOc9kvKNhTLKSg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g2Ogh/Y5E59Gqy0SRh3q+QKx8BGVDqh7WfJwzXq29HdJl5np6YsNGgXki046dtIYXM7Vk6YqhbVWpWlx5D/jhw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fxllR6psdh00kEGZ13C9GbUK0Ef763WPehcu0Cw3nGtHQMEnFJ0baEOT+exnK2rMPsDSlzRV3GeWc9D5Y5hpnQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Jk87FQTiUyvACAZ+LXzQSym4xFBwjT7dEmlXCfrKoc4Gfulki9zLJCPpYtTdAsB+d5VdkEab3Ywx1WECm0Rgxw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RszGJc/GTwskYskc82z9WfRUfdmMT1EXnBBa+lbhuQ4SkgiFx6EOJ4R66i5xQI0vjccEkufBvsX58LYnhKiiyQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AmnwZ3Grd2QW962s+rEn2QvuwFWhhFC3k8e6k+Lpq6hJOVqgbGWXGtPemqSHwmML62Za8Hyzcao9Y4zuXM8JCQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qTF3punEcwvO68Sd3WkL3bq2LYi47P0SJJUwi0gdsr9jYV1LcJLfDV6eTLRD+AuX4uKgi1ZZ3/UNxYjaFRigLg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"V+qs5vyCMaGRN+TxNYqX79rypwMK4oypWzFZog0zaIZhjcUpVL/iA5OpTIsNrI5U7X9b04dfDcrC/Vm3hXHzgQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0K9XFITRAZscBYnBZcuQ5o3kT954xWmHuOiQUoAxuMJsUSX6CblwCm7YE8j5ELDvE8STnvKC40K17ohGu0iylA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"elgK/N388Iz5oKDzZr4t0dmeBaamC4VtBPzMHFYz47hNFvqHsHgJuL3lEtTQw0HqCOmDqlo96PIMrq/xL1JNeA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"pOrIun9Eu7qyQNMRBdIGDif+bSXhwkPCL+N1/5npNtsGb4xMhxpBP3yT/Lq9VmotatYExusB8zv67uyJj6EKbQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qGV+uH7f3tTjf4VArb1QF6YX67Yak7wU0MmT+U8zR0M6e8LJUfqufu1Ed8lAv7oQ148sTBHm7lG9BA0sBPT/hw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1mG5XOwHMust28kEm3mU5xzlTNeuJxEI+RA9vXMY5LQ+7QKHH35Jr2MbeW/40vVk82bWtxdFX4a/Cw+D142gqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"kRBCjz7SITeivFCjgohy0TzMjqmPbXOAdacH/frLPbItHCaaTfF/tIWQUP3F9HYh8EG2c5SPgocLKIIyGDNkXQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"xxvYsUyp3A1KK4xIchgEBHsX6QVAf3Lqk7uQSwj8vZAayELv25Jo/enGiXzyopH0bXyuKlGjfdcHKR5dQ8VfoA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qGsJYQgoLimEZzLKR2BmxQx9fxl6v34tQRITkUrtPP9jiYcHUUZuMQmHlzkhE29JJh1bCdm6QAkc2aBOdLasNQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"C2KNw9POqmtvQyAXaYkjQQHq1a/iRr5Eu88HdwxF8KEzIedIpAuOlyBgGwHkFwIkLYIpPVhR8cJXoHzLsV3w0w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"git0TH08GJKUkdmOH1EHjlcpBFDgOBgqikHZNPTh/ktORDUoO3izV7WKK6TZTy8OxFDUkbC14sb3W9M8M/GQ1Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fYL42+rtkVaR4A+Ecp8sud6vaYKciPf+EeRcDOUfldErs1lCToaCfZjxs4DJ9J+iMcIjyg1cczuRr2EjviVo8Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"MRBFuxxpHJKm7Ua4WhGZiukEHi3j3F4CmXk72CKVuXlwQogd8Av0g4ji9S/2L0ZH+5z6c9s0ap+7vBYzE4G7SA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"B8ieqH3XjzVqB4no0OQDCO66Bqs0+LQD6AYba+oYmy05OVyxX7xwszootmv5eYMSUt2USWN8Shf3HN9NtGLoMA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5MOLSFMZ+PxHoR2y6rwrFxmYle57dtILpWY4n364JiNgQA5yKkpjQ223Srufb3yJfTrqPtshw/AYf6eYraKEXg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"TQIr0tLmfAvldbLdDnZHnI/Stxnxj5Ha8XJFHg9MKBpd80W9A7n5IKsxwn+gGAvOrZWE969vmYLAYx2qPpjR4Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g7pC5xf9HvIZeyO82aJzbqnMXXu7cC30bkJ3h90n96VVUL2Vs3m7hGYq64GolwQLkLYCy4BoqI0K1KmWgKnfJw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"b2dNMfD+K2Un28ji+Kegt7t8uVXvASPh+KjcRT4NHHMLJXCevBmYCvISIpxRYnXZrd3eU7Z3/Ui6inIP7N8RdA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"S0gWccFnm8zInib2yPeMOAS88+xh22BZya0HhikfYNMrkHFPHt0seGW+KTIuaWAUiT79gYYViFdBRnaBvYnr1A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RxXliVI+xdd8IXpvBtrhOOR4CfjeFqcFAzu5U04wG4QEv9J6QMzdCUYS0fabGbizUg0YIbxjduJpsbgFb29w1Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"wE4jDZd9BoDYT2Hrre6Go9Evu07/Y/ylQE90p/f9961pJdE1VWGIVKa9e6cd3V0WhyEiCDUvgMrwksMkDSUGOA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3ZzJTYMP9kyHozVzuoZqiKZp257HaTcp71hiel+FxxEL2cC6j24v1TssBoqwUARYEHkek6yj1WAY4BCYOtA4HA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1JArJ2bOzc6Im5SDgNjDsqrF/N0KCLz558ntuub/pXNuSWt6gFsFir4Eerg27tCvV7zugZWz3HLn+ErAq4Khaw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"32oPuVz4U2LnUF+wUgmEog8LVSR64r1vdzjbylfDdZ0KCppQFyo172eglV9rs8SYl7z6qM+qt2inUWv1N6lHhw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"i3aH29nsx2BoRynHURfBnHv61NNC0uILP2n2A0t1hb9NOfNyiIaMbQS9ETrN++NjuLfXyxngi3IYRF5KoMn/Vw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Pz9ao+RnNprgUh5dTOFfwQR5jdQQYrMZTqLUMWJaBoci/jNujl9UjySXNIc2TQepTydtSpRM5uJ/i0AgwhqoFg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"MlzY0Q3IX2ngoI4OvP0QgkotoyYAWSKxeMU5gTRSde5YgezoQ6fKwrAiQLbfy+7WoCbvU7nGRMHVS2K7akyjrw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"useHxyDXK73e0vvkiWDmU97QH8+Gr6HBlMj2sFx44OUq4PFWAyTIFTzr4QpYBDeUjy1ee3K9zZJg/Ianifv/dA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"DUQ7Cs76HHQ6J5XqyMDf1oCufOMtfboZWG4Rh2QAayMohxQAHzOnYp9PoB/J48SsJ8A0oL006IvZIvyAZ5dL8w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9bkNRN9vkR2cUl1WAIWcfv3pdasg5IKeGCl8QgrZVgJyHLnkcS1Lef02X3do1rlMui0RvtVRR2ytwb06ASS+UA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"BnCMNzUTpTJp0S1e37t3f8iHMTG4XzsP2RRBHwahkbcDqkLICPEpSiTVGCX4QNx6cBAz3iziRarVJ5xptyitxQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qp0FSC+cM7IB97Qg8d9r2JRuUhjmDjTk4L3R0DJVi2MXbz4uLfq3su98EUx6B4RR42Tg+rmJVYfGUZyzMLdLHA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"CXBKJuKxHBysTXgegvOLbc3dBTUqJFl5epQkGZjtfSNX/77i8UoYqeqyymTEaCYif/gkxjx1gYds8FfI8gyOcQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3G2uA8tHcb8LMk9rSOqrSx7bmXAJqRpgR4qTxwXny14ecYHLrZYoN6ol7YYAcOgrgFjIEYn7YD8Tg+g77d/5Lw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"d6ZnqzlgPJwIxh9lesfGStq4zP8wgRinGwgRvLpxCSlMYmydxBcgSqiRGhoaYQdN6D3esRBX090t3R1K1J4O9Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"v9SiD7vZsgjiww5M9RoDgyqXS9a54OPeldsk+igGOX4WVNerR2gdcfTewJFtz6r0+sMzxUM3y0TCClSJppZHjw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"/tWgpynW1EbDE2200qHkRdAyOXNtJOIr9AZ9JvJQ0HNi+Ap7FNuqqwZsFscX9cgg71b5XIon2c9zws1u29e2Nw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"XZFlkN9x7Ni7ZZ+h7FhmmH3VCok1E7ZqIYCrK5r+aoh9+hMMHfucBz/69Sr3MAGj6e7yTjT1NT0Ol6GZlv3LWQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3Z4tpmdimv5cGEsCfhDxHunUcYm2GF2sYjLbva34AQgzDyn45uRG7qcRBQkgK9FaKNU7jiOJdhOEBaS4rwRLrg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"BFWKchFXQz8ctgj9RvJ1bhL3+UWRIC0P9h9SLUFN7QgOppSDXqnx8bRCxz9BfVPUpmhGhfuQE8QhID7yEG0tdQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RIQIgtR6jKCENISFZsF21Bauz6CR42iH8vVMv6jzdw5afK9BUZiq8LqRYPSlAPcyuGGeXqw1vRJ8iGYsfqJbmw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"4h5TBDJnLq4tLniJPxb5KQ2PvIzlrI7mBCu9+t8DvyYD2ngRmCJiYV8O+ptoBJ9Zi+g15jIcexcjWm5wwFIOrA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"VUo1jZTWpjnxUPKUgUoFejFFyQKNOGgy9K6I2P3C0SMXJs7vPxoocZs1bXqSgcFMD1PaXBQHrg0MAOJrCEeERw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"u3a4toTRtd332a8s1Cwerjf9PNHMZi4qiGfbWscV1dR0wXYafjEAxj1+g+5FV5bvkJV2taNPYHUl7woLdBSrSw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"gMkg6yr9NUL+S217dJx7iDOTqQBeltTRdNr7wf2iDhRG4qjEJsKVpPTb48qX2jCjT9sgKcGDe209MlTYUf0aQQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9iG2FVmi9beSwiK9KGAp7Kj0EgEW3f+TO+hYSllTRiwvD2OsPxNzgMFzK8VdmkY7bNQco5wqct8AWBAeB7UdyQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"bJDj7aD4/A7LTvX6Qz6rcUFfs9hPvj2LJtFLWHnPFog8OhUIKFjI2wcWyZFBpkHYJyQKjOZHO92x2EUeLowpLQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sLwNlaapwQpDWgRD3Hu2H/7X2X4+mDOfgkJ1UBtEux8YN35V8IdsH/xM+VGEg6SPjviqHvj9OsKH17A2t96tdA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qq4+mzEVRra7WDJM70tseZD2pxmDHO3rfQw5GOG7Tp9DQh+avmmrdg1gDv0e18AIJXia5Yr5+eyBCHILLOevvA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fnRP/XezHy2AJlON5yLdeOjYCQdyw8rZxWzqP4Li4KsVhFmlSCV0UfOC1mtoGGOvQDWHsmuQHZuhxyvLDybjTQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"zYYhSOMW75A9eMBI2xWPc6gTK7E5KozSB98e7GbD6y5zJZRZjFpDpBFG+ZRwd1h3/wqvhV024y2nj/IqJv0G+g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"bm5heK5sEuPDNPPP6FAjVYI7BtRCINPCssNM1VUYBGU/BeZXz5jXUh6ZnrMMV/62Q4zICyDt81X6XpqcUt7FVg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fpE7Q9GFmS4+eKYvSm/5NZLs/RqWOktCq+YApAe4bn0azu0KF7BNy+cUIrD50pft58qi1mJdJET+tpbPMttIug=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"KQkgb8fWyOsTCNkibpd2OZS6YvV0BpGOxbKY9F9jrCpAQXqYhMjMpoXhgysh41ggL9yozJYMniDrZ07i86XhKw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ED7DClAGLfxTF06GgsvDutUWefXfKRbjDq9KPDtzutlYAugvIvg1HeTi3PYQJ5KHjouoyN9YV6z/XCXGED8zOw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qJr2gOmXpb9Q8dkhzXmcS38qSN0v1snbx1K1i6+s+m11tCbHhlhNqAg3v36rh177DsKqUPt2t0D2kX5MKUlHyA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"SP+rp9OqDQXQSwTklSedH5EmibQr4s0ciOTpYdcrm6dXyAw8HkEgX91vvAf7L7O6w3DljhItK/f+FuRVDnLjOg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"EqoaeTzRujnOM07rgs8R2ZGicLCwS3TlfbbyEvmWrzUX+iraMCFHU2vvvLwdZ1YZVY/lQNpq9NomCbiDkj7v2g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"IFe0f5HNzttK7wx5AWJjN9DPz2aW/qYN6ZH51z2Eqa9bOEEtakK41n4ZTyTIkUTS46q+awxScSyrPHAVrAFU2g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"7HXbPGQrkPNCtCFOuawp0H3ad955S8/emDiPHhtHUDVXMCp+JV2g/LtRxvg1BPI8Ngc9szMpRsbt6g2NrvEoTA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"oEW4n3ZvcNVze4gQei3naLH9Cn2FblcINg+UxVSK3QZoVGHWoI2yq5m9uHfqvBilEpZgrirdjaFUQgajakRNgQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sYNlCyRT3Zgg1J1LVbAJ4WcNdngacTweMTT3C89+nBAwHk1z/Vaesgt+wIGevmBCx8Sn029klEyWZwGloYlcFA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sUENkLrtwC7HCQpxubvCDgEmvPldpHYB+UMWkcIN2p4iygsAFbsduR6iVv9eJBF5rV5QDNNjeOw/jN/bMElhJA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1tzksddsn8eculwh43ke7zh2vp4hlu4sqhudeut","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"P34z/70As2yOIs7+rg1S+CLqJV9/sAbT3Gjq+azuC6pbbjnxfA30JNovex4YCMxiqElHMVThzl8/MZvRGYjLEw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AZYEa2wlLhPftKCbOrt9BGSg3bT8NEEeJkx/4izWygl01qovuvY2v4uY08LV3r53x3i5+YNRBfUMBRJxUio1UQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y1X6kSZB30xecpGPI8ua129FEwOlk6+eZRJ41v8R+497m7lkMK1204y2tcciHw3Ca/SQXVZ0DIItS4a52a8ISg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"iXdBKO7yY0XQWwik+30TcY4G+PH/D6SXRXrFSDPmYnQ29NckX0MO+eoLNbFLA+4kFwd1QzJcGcQV93HsKnwD7w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"UAqfYxpI4lzzuOXk6nRYwrRgfm3zYaaP0/lyDeY+RhkjRzp1NNvT6Jw2+WlVBloYAmPsCGHl+ZlvPwHSaU6ZZA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"NcUNsXGOJhdTELVaCF3P3EbQ5DaEy6P4dxPmT/gRTdcVoZytMrVRwkRu1q14VJ5Qh7n/D6XQyg4ldprT8bAzFQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"snnLpuA72vK9FwZZIwCEi8MdJob1qZUbrJMbP3hAWYgFeNNOvlli3ZPisYNpb04uKJoJCLaOO9tJlMWfnk0M5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"zG0ikhc5N8W5OD2LwBMmzNUVu+YwIA/G2HFNws+s3twD70hC3zweKqPnHR4fX5gbMiyhc34WmpmYe0tF6nJxPA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AfEBUIp7mcugkORTTSh3AKTsy/o5vTdKbX9IJtzgwBEIODY9sdpOGD4fgACiXTix6HtdAyj3I/Psoed0b8iHZQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"LNd3Vb4Ry6Y1PDRYNNJzq2/9rmmqEftkaM2/jdfLc3RkIN34Y/1hzhirl7uQIssvqCZKv8zxkFzwQLsczVwD5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8HiQVTtN5J02mzgVQgeyLWUj50Av1aFNOGS7tRTvAhZOTGLRmvpjAl6BcuDQcF2+57A4l0yDeMUxkmkMCgOgGA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"wDJ0E4UVu5G/7u57wCC5VhIFJcK6S9V5IE0snse4fOhDA1CD9f6D0ej+Xz6vrnUuHHQzwOFJfowGlZeTJp9tBQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1htwz4c09ktf0e8tqqn2yrtmtshfv7234y7n52r","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"Mig2hfat0LP63ncKRPGhxW9rMFmjfhwYjpr2YiQQwPVHnH5PazIKdOYq0E+eXYurSxdYEX/mLMHU2QqSsZnqDA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"JUizEIZ8mKVrevFfgsei6X1NO3qupPoYtZmuHruF4m5c3DXsemmx0iQJETHV8+5g6kDuI1uR17PO06IB2D0EdQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1d0ysm70pc2pl5fppz36g9jzqm3360kr2w707nq","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"TUfH0Ui26zdskqChUupug+6zef+i1QjOgVgZ1SHmk+F0CqxJ8rEQSzjHh89/3p62attaIM/kENMgzn5swQKSEg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G+7GSHxC1vZePPrygv70woPAyfm1B0A6QSGEYqzsuFVrYQjc+VpnQcZRxujJK45wdEA8gJljp6nEUIoe2fvX5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OO7U2vDRqdsXYGH97YoH9B90ZvpcknnSYgkqDV0h5RZea0Ot1MDC26QlSuT7K+ue0baNFqJcHEXT1YjZaMcbaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y0/pWqx4XTKb4JVmh0gfBQffJ31hYcE4GlolQot5/qpJ+0IivG9G3lrfhbbEl/6heNFpPMKDg45OfVHTt5Nx5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5yV/dtQhLn6TpQlYVtE/zKo128dU0yQUf2JX05RvLqMy1/dbHmogOtjyOeJbQ/a+M+Wei2dNCNBA+92tVYQgqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5HsVSrJFSVrvvaY7PR3ixMRXsFKqzHfSxFa0nNfIYsMMtdFSB20+/246yCxBa0iZ7H/f1MUHf5Dzuf6G1f8b+Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"phtNWuw+s6rlNwVt+PgyXTrg6l5QLytx7A99mWlFHdlXhJL4kT/E9iSGoutU5nmVGqVI3T3Obc3xqaPT+bwXfg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"aAMaFvYTgfSBuYdQERL3b9Xb4y6DLfKf84wtfL2tPRV/xjdXpuj0KjqJw8whNopkCdOGwP3J+xxlaenyfn1vSw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sy7aCwhwl53QGymG4qlTarx+z2YHt4nXhRTBuAcWdOhF07Ij0G908kNJjOLRO5ppCXoVdpGgYqpE79xcPYKrbg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rpKHlFQBR86UZnlEIb/JUNuzYLbwpF9cGl83jhh7j+sAC1Tg5OFW1aBqxfRscgFKuv2CCQzyUo3mltKsZuhkeg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GUka0bGpN9vw5UjP5hLNkNF3AhMj7opdkFi47Ieo+X5iBcP5Nir7Z5XnPS9fqi9psrSuUellKOc9kvKNhTLKSg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g2Ogh/Y5E59Gqy0SRh3q+QKx8BGVDqh7WfJwzXq29HdJl5np6YsNGgXki046dtIYXM7Vk6YqhbVWpWlx5D/jhw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fxllR6psdh00kEGZ13C9GbUK0Ef763WPehcu0Cw3nGtHQMEnFJ0baEOT+exnK2rMPsDSlzRV3GeWc9D5Y5hpnQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Jk87FQTiUyvACAZ+LXzQSym4xFBwjT7dEmlXCfrKoc4Gfulki9zLJCPpYtTdAsB+d5VdkEab3Ywx1WECm0Rgxw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RszGJc/GTwskYskc82z9WfRUfdmMT1EXnBBa+lbhuQ4SkgiFx6EOJ4R66i5xQI0vjccEkufBvsX58LYnhKiiyQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AmnwZ3Grd2QW962s+rEn2QvuwFWhhFC3k8e6k+Lpq6hJOVqgbGWXGtPemqSHwmML62Za8Hyzcao9Y4zuXM8JCQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qTF3punEcwvO68Sd3WkL3bq2LYi47P0SJJUwi0gdsr9jYV1LcJLfDV6eTLRD+AuX4uKgi1ZZ3/UNxYjaFRigLg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"V+qs5vyCMaGRN+TxNYqX79rypwMK4oypWzFZog0zaIZhjcUpVL/iA5OpTIsNrI5U7X9b04dfDcrC/Vm3hXHzgQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0K9XFITRAZscBYnBZcuQ5o3kT954xWmHuOiQUoAxuMJsUSX6CblwCm7YE8j5ELDvE8STnvKC40K17ohGu0iylA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"elgK/N388Iz5oKDzZr4t0dmeBaamC4VtBPzMHFYz47hNFvqHsHgJuL3lEtTQw0HqCOmDqlo96PIMrq/xL1JNeA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"pOrIun9Eu7qyQNMRBdIGDif+bSXhwkPCL+N1/5npNtsGb4xMhxpBP3yT/Lq9VmotatYExusB8zv67uyJj6EKbQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qGV+uH7f3tTjf4VArb1QF6YX67Yak7wU0MmT+U8zR0M6e8LJUfqufu1Ed8lAv7oQ148sTBHm7lG9BA0sBPT/hw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1mG5XOwHMust28kEm3mU5xzlTNeuJxEI+RA9vXMY5LQ+7QKHH35Jr2MbeW/40vVk82bWtxdFX4a/Cw+D142gqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"kRBCjz7SITeivFCjgohy0TzMjqmPbXOAdacH/frLPbItHCaaTfF/tIWQUP3F9HYh8EG2c5SPgocLKIIyGDNkXQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"xxvYsUyp3A1KK4xIchgEBHsX6QVAf3Lqk7uQSwj8vZAayELv25Jo/enGiXzyopH0bXyuKlGjfdcHKR5dQ8VfoA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/demo/boards","func":"CreateReply","args":["1","1","1","Hello !"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"LWAAxjIpEPFC8VfnhbiXTDAwubQx0ljCzEn1t3zeQbAMc/iUi7LjXP8uR2RA6x+Tp51BhPaZkWcAt/QVeU+JGw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/demo/boards","func":"CreateReply","args":["1","1","6","Hello."]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"q6wpB98vKzFYxq9HQExS21H5YHl3gd2V0MVmS1QQK/kYI8Dxyeg+fPZXhhbJclSWzRlr2+FkzQ7jYgMN16/GLQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qGsJYQgoLimEZzLKR2BmxQx9fxl6v34tQRITkUrtPP9jiYcHUUZuMQmHlzkhE29JJh1bCdm6QAkc2aBOdLasNQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"C2KNw9POqmtvQyAXaYkjQQHq1a/iRr5Eu88HdwxF8KEzIedIpAuOlyBgGwHkFwIkLYIpPVhR8cJXoHzLsV3w0w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"git0TH08GJKUkdmOH1EHjlcpBFDgOBgqikHZNPTh/ktORDUoO3izV7WKK6TZTy8OxFDUkbC14sb3W9M8M/GQ1Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fYL42+rtkVaR4A+Ecp8sud6vaYKciPf+EeRcDOUfldErs1lCToaCfZjxs4DJ9J+iMcIjyg1cczuRr2EjviVo8Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"MRBFuxxpHJKm7Ua4WhGZiukEHi3j3F4CmXk72CKVuXlwQogd8Av0g4ji9S/2L0ZH+5z6c9s0ap+7vBYzE4G7SA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"B8ieqH3XjzVqB4no0OQDCO66Bqs0+LQD6AYba+oYmy05OVyxX7xwszootmv5eYMSUt2USWN8Shf3HN9NtGLoMA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5MOLSFMZ+PxHoR2y6rwrFxmYle57dtILpWY4n364JiNgQA5yKkpjQ223Srufb3yJfTrqPtshw/AYf6eYraKEXg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"TQIr0tLmfAvldbLdDnZHnI/Stxnxj5Ha8XJFHg9MKBpd80W9A7n5IKsxwn+gGAvOrZWE969vmYLAYx2qPpjR4Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g7pC5xf9HvIZeyO82aJzbqnMXXu7cC30bkJ3h90n96VVUL2Vs3m7hGYq64GolwQLkLYCy4BoqI0K1KmWgKnfJw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"b2dNMfD+K2Un28ji+Kegt7t8uVXvASPh+KjcRT4NHHMLJXCevBmYCvISIpxRYnXZrd3eU7Z3/Ui6inIP7N8RdA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"S0gWccFnm8zInib2yPeMOAS88+xh22BZya0HhikfYNMrkHFPHt0seGW+KTIuaWAUiT79gYYViFdBRnaBvYnr1A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RxXliVI+xdd8IXpvBtrhOOR4CfjeFqcFAzu5U04wG4QEv9J6QMzdCUYS0fabGbizUg0YIbxjduJpsbgFb29w1Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"wE4jDZd9BoDYT2Hrre6Go9Evu07/Y/ylQE90p/f9961pJdE1VWGIVKa9e6cd3V0WhyEiCDUvgMrwksMkDSUGOA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3ZzJTYMP9kyHozVzuoZqiKZp257HaTcp71hiel+FxxEL2cC6j24v1TssBoqwUARYEHkek6yj1WAY4BCYOtA4HA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1JArJ2bOzc6Im5SDgNjDsqrF/N0KCLz558ntuub/pXNuSWt6gFsFir4Eerg27tCvV7zugZWz3HLn+ErAq4Khaw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"32oPuVz4U2LnUF+wUgmEog8LVSR64r1vdzjbylfDdZ0KCppQFyo172eglV9rs8SYl7z6qM+qt2inUWv1N6lHhw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"i3aH29nsx2BoRynHURfBnHv61NNC0uILP2n2A0t1hb9NOfNyiIaMbQS9ETrN++NjuLfXyxngi3IYRF5KoMn/Vw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Pz9ao+RnNprgUh5dTOFfwQR5jdQQYrMZTqLUMWJaBoci/jNujl9UjySXNIc2TQepTydtSpRM5uJ/i0AgwhqoFg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"MlzY0Q3IX2ngoI4OvP0QgkotoyYAWSKxeMU5gTRSde5YgezoQ6fKwrAiQLbfy+7WoCbvU7nGRMHVS2K7akyjrw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"useHxyDXK73e0vvkiWDmU97QH8+Gr6HBlMj2sFx44OUq4PFWAyTIFTzr4QpYBDeUjy1ee3K9zZJg/Ianifv/dA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"DUQ7Cs76HHQ6J5XqyMDf1oCufOMtfboZWG4Rh2QAayMohxQAHzOnYp9PoB/J48SsJ8A0oL006IvZIvyAZ5dL8w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9bkNRN9vkR2cUl1WAIWcfv3pdasg5IKeGCl8QgrZVgJyHLnkcS1Lef02X3do1rlMui0RvtVRR2ytwb06ASS+UA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"BnCMNzUTpTJp0S1e37t3f8iHMTG4XzsP2RRBHwahkbcDqkLICPEpSiTVGCX4QNx6cBAz3iziRarVJ5xptyitxQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qp0FSC+cM7IB97Qg8d9r2JRuUhjmDjTk4L3R0DJVi2MXbz4uLfq3su98EUx6B4RR42Tg+rmJVYfGUZyzMLdLHA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"CXBKJuKxHBysTXgegvOLbc3dBTUqJFl5epQkGZjtfSNX/77i8UoYqeqyymTEaCYif/gkxjx1gYds8FfI8gyOcQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3G2uA8tHcb8LMk9rSOqrSx7bmXAJqRpgR4qTxwXny14ecYHLrZYoN6ol7YYAcOgrgFjIEYn7YD8Tg+g77d/5Lw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"d6ZnqzlgPJwIxh9lesfGStq4zP8wgRinGwgRvLpxCSlMYmydxBcgSqiRGhoaYQdN6D3esRBX090t3R1K1J4O9Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"v9SiD7vZsgjiww5M9RoDgyqXS9a54OPeldsk+igGOX4WVNerR2gdcfTewJFtz6r0+sMzxUM3y0TCClSJppZHjw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"/tWgpynW1EbDE2200qHkRdAyOXNtJOIr9AZ9JvJQ0HNi+Ap7FNuqqwZsFscX9cgg71b5XIon2c9zws1u29e2Nw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"XZFlkN9x7Ni7ZZ+h7FhmmH3VCok1E7ZqIYCrK5r+aoh9+hMMHfucBz/69Sr3MAGj6e7yTjT1NT0Ol6GZlv3LWQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3Z4tpmdimv5cGEsCfhDxHunUcYm2GF2sYjLbva34AQgzDyn45uRG7qcRBQkgK9FaKNU7jiOJdhOEBaS4rwRLrg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"BFWKchFXQz8ctgj9RvJ1bhL3+UWRIC0P9h9SLUFN7QgOppSDXqnx8bRCxz9BfVPUpmhGhfuQE8QhID7yEG0tdQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RIQIgtR6jKCENISFZsF21Bauz6CR42iH8vVMv6jzdw5afK9BUZiq8LqRYPSlAPcyuGGeXqw1vRJ8iGYsfqJbmw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"4h5TBDJnLq4tLniJPxb5KQ2PvIzlrI7mBCu9+t8DvyYD2ngRmCJiYV8O+ptoBJ9Zi+g15jIcexcjWm5wwFIOrA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"VUo1jZTWpjnxUPKUgUoFejFFyQKNOGgy9K6I2P3C0SMXJs7vPxoocZs1bXqSgcFMD1PaXBQHrg0MAOJrCEeERw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"u3a4toTRtd332a8s1Cwerjf9PNHMZi4qiGfbWscV1dR0wXYafjEAxj1+g+5FV5bvkJV2taNPYHUl7woLdBSrSw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"gMkg6yr9NUL+S217dJx7iDOTqQBeltTRdNr7wf2iDhRG4qjEJsKVpPTb48qX2jCjT9sgKcGDe209MlTYUf0aQQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9iG2FVmi9beSwiK9KGAp7Kj0EgEW3f+TO+hYSllTRiwvD2OsPxNzgMFzK8VdmkY7bNQco5wqct8AWBAeB7UdyQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"bJDj7aD4/A7LTvX6Qz6rcUFfs9hPvj2LJtFLWHnPFog8OhUIKFjI2wcWyZFBpkHYJyQKjOZHO92x2EUeLowpLQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sLwNlaapwQpDWgRD3Hu2H/7X2X4+mDOfgkJ1UBtEux8YN35V8IdsH/xM+VGEg6SPjviqHvj9OsKH17A2t96tdA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qq4+mzEVRra7WDJM70tseZD2pxmDHO3rfQw5GOG7Tp9DQh+avmmrdg1gDv0e18AIJXia5Yr5+eyBCHILLOevvA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fnRP/XezHy2AJlON5yLdeOjYCQdyw8rZxWzqP4Li4KsVhFmlSCV0UfOC1mtoGGOvQDWHsmuQHZuhxyvLDybjTQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"zYYhSOMW75A9eMBI2xWPc6gTK7E5KozSB98e7GbD6y5zJZRZjFpDpBFG+ZRwd1h3/wqvhV024y2nj/IqJv0G+g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"bm5heK5sEuPDNPPP6FAjVYI7BtRCINPCssNM1VUYBGU/BeZXz5jXUh6ZnrMMV/62Q4zICyDt81X6XpqcUt7FVg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fpE7Q9GFmS4+eKYvSm/5NZLs/RqWOktCq+YApAe4bn0azu0KF7BNy+cUIrD50pft58qi1mJdJET+tpbPMttIug=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"KQkgb8fWyOsTCNkibpd2OZS6YvV0BpGOxbKY9F9jrCpAQXqYhMjMpoXhgysh41ggL9yozJYMniDrZ07i86XhKw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ED7DClAGLfxTF06GgsvDutUWefXfKRbjDq9KPDtzutlYAugvIvg1HeTi3PYQJ5KHjouoyN9YV6z/XCXGED8zOw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qJr2gOmXpb9Q8dkhzXmcS38qSN0v1snbx1K1i6+s+m11tCbHhlhNqAg3v36rh177DsKqUPt2t0D2kX5MKUlHyA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"SP+rp9OqDQXQSwTklSedH5EmibQr4s0ciOTpYdcrm6dXyAw8HkEgX91vvAf7L7O6w3DljhItK/f+FuRVDnLjOg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"EqoaeTzRujnOM07rgs8R2ZGicLCwS3TlfbbyEvmWrzUX+iraMCFHU2vvvLwdZ1YZVY/lQNpq9NomCbiDkj7v2g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"IFe0f5HNzttK7wx5AWJjN9DPz2aW/qYN6ZH51z2Eqa9bOEEtakK41n4ZTyTIkUTS46q+awxScSyrPHAVrAFU2g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"7HXbPGQrkPNCtCFOuawp0H3ad955S8/emDiPHhtHUDVXMCp+JV2g/LtRxvg1BPI8Ngc9szMpRsbt6g2NrvEoTA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"oEW4n3ZvcNVze4gQei3naLH9Cn2FblcINg+UxVSK3QZoVGHWoI2yq5m9uHfqvBilEpZgrirdjaFUQgajakRNgQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sYNlCyRT3Zgg1J1LVbAJ4WcNdngacTweMTT3C89+nBAwHk1z/Vaesgt+wIGevmBCx8Sn029klEyWZwGloYlcFA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sUENkLrtwC7HCQpxubvCDgEmvPldpHYB+UMWkcIN2p4iygsAFbsduR6iVv9eJBF5rV5QDNNjeOw/jN/bMElhJA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AZYEa2wlLhPftKCbOrt9BGSg3bT8NEEeJkx/4izWygl01qovuvY2v4uY08LV3r53x3i5+YNRBfUMBRJxUio1UQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y1X6kSZB30xecpGPI8ua129FEwOlk6+eZRJ41v8R+497m7lkMK1204y2tcciHw3Ca/SQXVZ0DIItS4a52a8ISg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"iXdBKO7yY0XQWwik+30TcY4G+PH/D6SXRXrFSDPmYnQ29NckX0MO+eoLNbFLA+4kFwd1QzJcGcQV93HsKnwD7w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"UAqfYxpI4lzzuOXk6nRYwrRgfm3zYaaP0/lyDeY+RhkjRzp1NNvT6Jw2+WlVBloYAmPsCGHl+ZlvPwHSaU6ZZA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"NcUNsXGOJhdTELVaCF3P3EbQ5DaEy6P4dxPmT/gRTdcVoZytMrVRwkRu1q14VJ5Qh7n/D6XQyg4ldprT8bAzFQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"snnLpuA72vK9FwZZIwCEi8MdJob1qZUbrJMbP3hAWYgFeNNOvlli3ZPisYNpb04uKJoJCLaOO9tJlMWfnk0M5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"zG0ikhc5N8W5OD2LwBMmzNUVu+YwIA/G2HFNws+s3twD70hC3zweKqPnHR4fX5gbMiyhc34WmpmYe0tF6nJxPA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AfEBUIp7mcugkORTTSh3AKTsy/o5vTdKbX9IJtzgwBEIODY9sdpOGD4fgACiXTix6HtdAyj3I/Psoed0b8iHZQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"LNd3Vb4Ry6Y1PDRYNNJzq2/9rmmqEftkaM2/jdfLc3RkIN34Y/1hzhirl7uQIssvqCZKv8zxkFzwQLsczVwD5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8HiQVTtN5J02mzgVQgeyLWUj50Av1aFNOGS7tRTvAhZOTGLRmvpjAl6BcuDQcF2+57A4l0yDeMUxkmkMCgOgGA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"wDJ0E4UVu5G/7u57wCC5VhIFJcK6S9V5IE0snse4fOhDA1CD9f6D0ej+Xz6vrnUuHHQzwOFJfowGlZeTJp9tBQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"JUizEIZ8mKVrevFfgsei6X1NO3qupPoYtZmuHruF4m5c3DXsemmx0iQJETHV8+5g6kDuI1uR17PO06IB2D0EdQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Pxrf+1f4CHjRd/dJ2afqfUzWh+0QiWpVXjLRz16rPsQ9mBO8rpZD2rf7foGBaGfwwXh2J+UfEYVxUs9XxPSddQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"hjcg2iL1oq00gcY6VOzzqUliIyryP7zV+ZCe5GJtqiNsOYp3ZbN/uH9BxmXPdF7HjoouDog7zn3cKVwSxqD/Gg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"+1b4q/dD0xGeSziXmeB1njhUs4zRUv0rLZ0g9F/wBrIA9/ojyyXFjqJqrCt/pQ9IUircG+A6Wvem1kdgsNWWGQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"00mNzW4bnkR9yQv+aznbpg91vrLojXu4bftyw2stw35e88s4jC+mzUup53BqwRYE2JhZbEzLX/MP6pCI7f5EDQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"uii+/ESlkKivVYK3XteP+KjPLLsCKrIY3x/KDLmlHKUNgp4szKqL7Lk85ivuZe7BNeWQ1xTuDC6AYt+k8TFmdQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"N6KBSlh14xCm44YnGQqGNA6i9rSklrKt1T4baXa+2HkxGYW+OY1Mq8Mw5rHzXNxNo0rIKTL7pwsGb6eC+wi11Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"isOEo3/+XtoxxwWo+8mE7kEoUDqHMon69nnmH/6DUWJkvjc6yE+uEQlrInn3TZbXpCZwWNle/VEkwIeicZ98+w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AwSu/QRenTswEnJwoOneDhIftuhdknQXeROhXXvvVaE+zivDnffubswHcHtCYkiJHwEHCKIRWSnY3TJ0/44pFw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RjecZ87c8qgLCjGhM5/SCbc3rHIM4wwAv4MZJMNCCe1Ve69dEqi0xu3ricW06vKFGr8lRwSeTxkUtb74FaQZLw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"k0qQvIU5hfR/anVjNx3RCFz4/ZcVB0y7Tc2tqEhVO5BgAcM/HExcxX3pDGJkPQ9MDL6B3f3T33vujV2yr1iLhw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"u8DTAYxhyE5InKPi2/gshQpXaeJLg/4A5Cj8CZnPhCllTUjK8dIWyKf3bXLsgSxHXVP+u/QWg5yj3CpPPR5M2Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"pKy8GGHpzH2npH2cjz1HEIRTI2Dj7vYkoGTL7za8PasdqE+xEAi/0+Y+YcVgfoECZDSD+NnX0/wkfAWzJcVMNA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"N2pRBZuF62kAi8XpguwFfrG9FsQk8TXL7wMv38fmKd98a4c+qgtWTncgrn6MxVwNhI0NTDTjnbRrFqYmG662qg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8DHo/ZpmpmA872epluy+tuINx93tc9JjFKGvKyNaQh4wQzngFjyrn719dqGQugylrbY82LnGAh+6KO/9L2YBJQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"QtKbdrurUgxjSHfjdF9BQJ5RKOPZooAfLNVLL7NzhjxsC1V4150kuWm4FneliMTV967LvH7lkzcxVXQXycW2MA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"mcNjjzTA70eQ8laQa+l3FSrJcf49jOqPye1YLbN92+tEUnI0p+Ss9JgtOaIVOSaNscPAtu3L0LiFCCE4oOWwCQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3Z2eUkRzxMIXdvamfAO5qilrDJoJLHyf5mqiHk91wc8z/VAIZ3jDDnFXsS6UExPWRT0d7K951EiOXctrQSiOCQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9V37tjLnKacCWRLS7kF/nWq2MuUPhYXKzGjlA1OTVnJB+UNab6ZkccXVh6W0pCYo8jfwidyYX3M0gSF0QUgwfA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"w0OPAC4O1cOrU4/3BfKMvfY1buwku9Tg81vUf8d8flBeovgMVRKgM4wEhR+A4qYjR6DAnvcikAgVY0wdR1Uj7g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9RUxXTDdolYiEyfih6BWF8COn4xs7+KJiuEt71ACMG0OaZhwEYy/V3NSPFJSuLl7XCWBttGJ/4+k0SDBfqu+iA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"E3KBU8CiVGvJOvZIHv1BQmO1IMKDp89U/TGr5gyq/P9peaYrnQZA/qFqywHBqgzuYXRHe3zE7XruRIMhTsF+3Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"pGrD149Edxh5LGkdVCJQfLLpbwu4Y9BOHoyjcfJSu/I6gTprgnVLPvLArs3pOHVKFdm5BIjJGlG6cax2MqhE/g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"dsvtdwBSN9cODHOOsSvdKK7Mdy1PCLq81QYOzn0mjPMBhOXFz7eij5AKKbBdRcouD61G4v5bWNPgk31BC2vMsw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3PK5n23LSAsTm0cxEaHGeNkp9UyxRxcH4R0zWuSOZ7xKpQ5T+EIukgKYqAq+kfxLnK5aG9fGgPg9aQfAO3K8Hw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"QA87rqHxHI+sMhSffPpo13gSi+rkg1ZZZ66Rb1KsHu86NtoQJrrzuGyBis0umn1Hm0nWEb44QZUUYcK3B0s2kQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"B0CjMNc81fG+9UKTgEBDC+oV90jKOBFjgJHPMMSyaQQL0JOQO9LKx27a8z9O9dluqf846Gcuv4Of5AcU4BgExw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"De/APSclHPXQBIs0w35iJZc3CvitGZYzOHpF8ImFOol6CjvEbDHRjPEfRcZOo2claePQoy8C4VBjCZubl4YgXw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OjnzZiLFQo/HmpJXJX/Qu/9c5lUTX4SlrCFAvPDI6yIGBSIIxj3DCDkVl18HTyLe36BvtFmegVhoQI7MHphWEw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1OL+LYu2DpS2Pxy0IXJ8TOzT1BCKD6sME2aD3V8DXCdZeYah+bMulsxSQBEVPAvkLDyw/HMO/wCVuq4X/BbRJw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"S1vq5Vr3Bm/tQqT0jfVu1ZaFOwPBPmGSUOW/juW5zQ8Ia/FkHmd9JGvo7mMvQIQFWr4QDZu0xu3IOponuNhjRw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9Ur7+4U9lER2+mtp4PNCJjjlXWz1SMNdFxjW4H0ldLtx7R/NieszjFs/3YCLo8PoO3zFK9fE/E7pnyH3mcGqSA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AVCaaTvHHHkAgnqtAvT2aV4yMZqcbMOGTKWeO9TJ1iBw5zszZW4APbiZK2x+M3ZK/UemlS2wM6KM99lXN2OJXQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GKpHdN4bbs63YemrNxavHYxHpH9Ty9YJvjmtlANBQg0LxF49JC/tNnYC+fPv24x1amHxgWC9a4RWv/BaXURzkQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G+7GSHxC1vZePPrygv70woPAyfm1B0A6QSGEYqzsuFVrYQjc+VpnQcZRxujJK45wdEA8gJljp6nEUIoe2fvX5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OO7U2vDRqdsXYGH97YoH9B90ZvpcknnSYgkqDV0h5RZea0Ot1MDC26QlSuT7K+ue0baNFqJcHEXT1YjZaMcbaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G+7GSHxC1vZePPrygv70woPAyfm1B0A6QSGEYqzsuFVrYQjc+VpnQcZRxujJK45wdEA8gJljp6nEUIoe2fvX5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OO7U2vDRqdsXYGH97YoH9B90ZvpcknnSYgkqDV0h5RZea0Ot1MDC26QlSuT7K+ue0baNFqJcHEXT1YjZaMcbaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y0/pWqx4XTKb4JVmh0gfBQffJ31hYcE4GlolQot5/qpJ+0IivG9G3lrfhbbEl/6heNFpPMKDg45OfVHTt5Nx5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5yV/dtQhLn6TpQlYVtE/zKo128dU0yQUf2JX05RvLqMy1/dbHmogOtjyOeJbQ/a+M+Wei2dNCNBA+92tVYQgqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G+7GSHxC1vZePPrygv70woPAyfm1B0A6QSGEYqzsuFVrYQjc+VpnQcZRxujJK45wdEA8gJljp6nEUIoe2fvX5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OO7U2vDRqdsXYGH97YoH9B90ZvpcknnSYgkqDV0h5RZea0Ot1MDC26QlSuT7K+ue0baNFqJcHEXT1YjZaMcbaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y0/pWqx4XTKb4JVmh0gfBQffJ31hYcE4GlolQot5/qpJ+0IivG9G3lrfhbbEl/6heNFpPMKDg45OfVHTt5Nx5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5yV/dtQhLn6TpQlYVtE/zKo128dU0yQUf2JX05RvLqMy1/dbHmogOtjyOeJbQ/a+M+Wei2dNCNBA+92tVYQgqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"pmdhfDQlD9X+kNexB0djVUcRThRhON9T8kq9XFCCVGNtM7H9kNJTFfe+BS86zjEgx+Y2nAFwBNPf90buLCfsKw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"8000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"idSZOarxZQFJvF1WN7EhNgfke1Np9WcYXq7QLy1E/y4C22Cg/1UfEpzsX8F0GtOPPcDrCeadNwuCMjaTz5ytfQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5HsVSrJFSVrvvaY7PR3ixMRXsFKqzHfSxFa0nNfIYsMMtdFSB20+/246yCxBa0iZ7H/f1MUHf5Dzuf6G1f8b+Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"phtNWuw+s6rlNwVt+PgyXTrg6l5QLytx7A99mWlFHdlXhJL4kT/E9iSGoutU5nmVGqVI3T3Obc3xqaPT+bwXfg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"aAMaFvYTgfSBuYdQERL3b9Xb4y6DLfKf84wtfL2tPRV/xjdXpuj0KjqJw8whNopkCdOGwP3J+xxlaenyfn1vSw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sy7aCwhwl53QGymG4qlTarx+z2YHt4nXhRTBuAcWdOhF07Ij0G908kNJjOLRO5ppCXoVdpGgYqpE79xcPYKrbg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rpKHlFQBR86UZnlEIb/JUNuzYLbwpF9cGl83jhh7j+sAC1Tg5OFW1aBqxfRscgFKuv2CCQzyUo3mltKsZuhkeg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GUka0bGpN9vw5UjP5hLNkNF3AhMj7opdkFi47Ieo+X5iBcP5Nir7Z5XnPS9fqi9psrSuUellKOc9kvKNhTLKSg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g2Ogh/Y5E59Gqy0SRh3q+QKx8BGVDqh7WfJwzXq29HdJl5np6YsNGgXki046dtIYXM7Vk6YqhbVWpWlx5D/jhw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fxllR6psdh00kEGZ13C9GbUK0Ef763WPehcu0Cw3nGtHQMEnFJ0baEOT+exnK2rMPsDSlzRV3GeWc9D5Y5hpnQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Jk87FQTiUyvACAZ+LXzQSym4xFBwjT7dEmlXCfrKoc4Gfulki9zLJCPpYtTdAsB+d5VdkEab3Ywx1WECm0Rgxw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RszGJc/GTwskYskc82z9WfRUfdmMT1EXnBBa+lbhuQ4SkgiFx6EOJ4R66i5xQI0vjccEkufBvsX58LYnhKiiyQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AmnwZ3Grd2QW962s+rEn2QvuwFWhhFC3k8e6k+Lpq6hJOVqgbGWXGtPemqSHwmML62Za8Hyzcao9Y4zuXM8JCQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qTF3punEcwvO68Sd3WkL3bq2LYi47P0SJJUwi0gdsr9jYV1LcJLfDV6eTLRD+AuX4uKgi1ZZ3/UNxYjaFRigLg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"V+qs5vyCMaGRN+TxNYqX79rypwMK4oypWzFZog0zaIZhjcUpVL/iA5OpTIsNrI5U7X9b04dfDcrC/Vm3hXHzgQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0K9XFITRAZscBYnBZcuQ5o3kT954xWmHuOiQUoAxuMJsUSX6CblwCm7YE8j5ELDvE8STnvKC40K17ohGu0iylA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"elgK/N388Iz5oKDzZr4t0dmeBaamC4VtBPzMHFYz47hNFvqHsHgJuL3lEtTQw0HqCOmDqlo96PIMrq/xL1JNeA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"pOrIun9Eu7qyQNMRBdIGDif+bSXhwkPCL+N1/5npNtsGb4xMhxpBP3yT/Lq9VmotatYExusB8zv67uyJj6EKbQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qGV+uH7f3tTjf4VArb1QF6YX67Yak7wU0MmT+U8zR0M6e8LJUfqufu1Ed8lAv7oQ148sTBHm7lG9BA0sBPT/hw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1mG5XOwHMust28kEm3mU5xzlTNeuJxEI+RA9vXMY5LQ+7QKHH35Jr2MbeW/40vVk82bWtxdFX4a/Cw+D142gqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"kRBCjz7SITeivFCjgohy0TzMjqmPbXOAdacH/frLPbItHCaaTfF/tIWQUP3F9HYh8EG2c5SPgocLKIIyGDNkXQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"xxvYsUyp3A1KK4xIchgEBHsX6QVAf3Lqk7uQSwj8vZAayELv25Jo/enGiXzyopH0bXyuKlGjfdcHKR5dQ8VfoA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qGsJYQgoLimEZzLKR2BmxQx9fxl6v34tQRITkUrtPP9jiYcHUUZuMQmHlzkhE29JJh1bCdm6QAkc2aBOdLasNQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"C2KNw9POqmtvQyAXaYkjQQHq1a/iRr5Eu88HdwxF8KEzIedIpAuOlyBgGwHkFwIkLYIpPVhR8cJXoHzLsV3w0w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"git0TH08GJKUkdmOH1EHjlcpBFDgOBgqikHZNPTh/ktORDUoO3izV7WKK6TZTy8OxFDUkbC14sb3W9M8M/GQ1Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fYL42+rtkVaR4A+Ecp8sud6vaYKciPf+EeRcDOUfldErs1lCToaCfZjxs4DJ9J+iMcIjyg1cczuRr2EjviVo8Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G+7GSHxC1vZePPrygv70woPAyfm1B0A6QSGEYqzsuFVrYQjc+VpnQcZRxujJK45wdEA8gJljp6nEUIoe2fvX5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OO7U2vDRqdsXYGH97YoH9B90ZvpcknnSYgkqDV0h5RZea0Ot1MDC26QlSuT7K+ue0baNFqJcHEXT1YjZaMcbaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y0/pWqx4XTKb4JVmh0gfBQffJ31hYcE4GlolQot5/qpJ+0IivG9G3lrfhbbEl/6heNFpPMKDg45OfVHTt5Nx5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5yV/dtQhLn6TpQlYVtE/zKo128dU0yQUf2JX05RvLqMy1/dbHmogOtjyOeJbQ/a+M+Wei2dNCNBA+92tVYQgqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5HsVSrJFSVrvvaY7PR3ixMRXsFKqzHfSxFa0nNfIYsMMtdFSB20+/246yCxBa0iZ7H/f1MUHf5Dzuf6G1f8b+Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"phtNWuw+s6rlNwVt+PgyXTrg6l5QLytx7A99mWlFHdlXhJL4kT/E9iSGoutU5nmVGqVI3T3Obc3xqaPT+bwXfg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"aAMaFvYTgfSBuYdQERL3b9Xb4y6DLfKf84wtfL2tPRV/xjdXpuj0KjqJw8whNopkCdOGwP3J+xxlaenyfn1vSw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sy7aCwhwl53QGymG4qlTarx+z2YHt4nXhRTBuAcWdOhF07Ij0G908kNJjOLRO5ppCXoVdpGgYqpE79xcPYKrbg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rpKHlFQBR86UZnlEIb/JUNuzYLbwpF9cGl83jhh7j+sAC1Tg5OFW1aBqxfRscgFKuv2CCQzyUo3mltKsZuhkeg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GUka0bGpN9vw5UjP5hLNkNF3AhMj7opdkFi47Ieo+X5iBcP5Nir7Z5XnPS9fqi9psrSuUellKOc9kvKNhTLKSg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g2Ogh/Y5E59Gqy0SRh3q+QKx8BGVDqh7WfJwzXq29HdJl5np6YsNGgXki046dtIYXM7Vk6YqhbVWpWlx5D/jhw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fxllR6psdh00kEGZ13C9GbUK0Ef763WPehcu0Cw3nGtHQMEnFJ0baEOT+exnK2rMPsDSlzRV3GeWc9D5Y5hpnQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G+7GSHxC1vZePPrygv70woPAyfm1B0A6QSGEYqzsuFVrYQjc+VpnQcZRxujJK45wdEA8gJljp6nEUIoe2fvX5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OO7U2vDRqdsXYGH97YoH9B90ZvpcknnSYgkqDV0h5RZea0Ot1MDC26QlSuT7K+ue0baNFqJcHEXT1YjZaMcbaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y0/pWqx4XTKb4JVmh0gfBQffJ31hYcE4GlolQot5/qpJ+0IivG9G3lrfhbbEl/6heNFpPMKDg45OfVHTt5Nx5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5yV/dtQhLn6TpQlYVtE/zKo128dU0yQUf2JX05RvLqMy1/dbHmogOtjyOeJbQ/a+M+Wei2dNCNBA+92tVYQgqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5HsVSrJFSVrvvaY7PR3ixMRXsFKqzHfSxFa0nNfIYsMMtdFSB20+/246yCxBa0iZ7H/f1MUHf5Dzuf6G1f8b+Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"phtNWuw+s6rlNwVt+PgyXTrg6l5QLytx7A99mWlFHdlXhJL4kT/E9iSGoutU5nmVGqVI3T3Obc3xqaPT+bwXfg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"aAMaFvYTgfSBuYdQERL3b9Xb4y6DLfKf84wtfL2tPRV/xjdXpuj0KjqJw8whNopkCdOGwP3J+xxlaenyfn1vSw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sy7aCwhwl53QGymG4qlTarx+z2YHt4nXhRTBuAcWdOhF07Ij0G908kNJjOLRO5ppCXoVdpGgYqpE79xcPYKrbg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rpKHlFQBR86UZnlEIb/JUNuzYLbwpF9cGl83jhh7j+sAC1Tg5OFW1aBqxfRscgFKuv2CCQzyUo3mltKsZuhkeg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GUka0bGpN9vw5UjP5hLNkNF3AhMj7opdkFi47Ieo+X5iBcP5Nir7Z5XnPS9fqi9psrSuUellKOc9kvKNhTLKSg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g2Ogh/Y5E59Gqy0SRh3q+QKx8BGVDqh7WfJwzXq29HdJl5np6YsNGgXki046dtIYXM7Vk6YqhbVWpWlx5D/jhw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fxllR6psdh00kEGZ13C9GbUK0Ef763WPehcu0Cw3nGtHQMEnFJ0baEOT+exnK2rMPsDSlzRV3GeWc9D5Y5hpnQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Jk87FQTiUyvACAZ+LXzQSym4xFBwjT7dEmlXCfrKoc4Gfulki9zLJCPpYtTdAsB+d5VdkEab3Ywx1WECm0Rgxw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G+7GSHxC1vZePPrygv70woPAyfm1B0A6QSGEYqzsuFVrYQjc+VpnQcZRxujJK45wdEA8gJljp6nEUIoe2fvX5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OO7U2vDRqdsXYGH97YoH9B90ZvpcknnSYgkqDV0h5RZea0Ot1MDC26QlSuT7K+ue0baNFqJcHEXT1YjZaMcbaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y0/pWqx4XTKb4JVmh0gfBQffJ31hYcE4GlolQot5/qpJ+0IivG9G3lrfhbbEl/6heNFpPMKDg45OfVHTt5Nx5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5yV/dtQhLn6TpQlYVtE/zKo128dU0yQUf2JX05RvLqMy1/dbHmogOtjyOeJbQ/a+M+Wei2dNCNBA+92tVYQgqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5HsVSrJFSVrvvaY7PR3ixMRXsFKqzHfSxFa0nNfIYsMMtdFSB20+/246yCxBa0iZ7H/f1MUHf5Dzuf6G1f8b+Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"phtNWuw+s6rlNwVt+PgyXTrg6l5QLytx7A99mWlFHdlXhJL4kT/E9iSGoutU5nmVGqVI3T3Obc3xqaPT+bwXfg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"aAMaFvYTgfSBuYdQERL3b9Xb4y6DLfKf84wtfL2tPRV/xjdXpuj0KjqJw8whNopkCdOGwP3J+xxlaenyfn1vSw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sy7aCwhwl53QGymG4qlTarx+z2YHt4nXhRTBuAcWdOhF07Ij0G908kNJjOLRO5ppCXoVdpGgYqpE79xcPYKrbg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rpKHlFQBR86UZnlEIb/JUNuzYLbwpF9cGl83jhh7j+sAC1Tg5OFW1aBqxfRscgFKuv2CCQzyUo3mltKsZuhkeg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GUka0bGpN9vw5UjP5hLNkNF3AhMj7opdkFi47Ieo+X5iBcP5Nir7Z5XnPS9fqi9psrSuUellKOc9kvKNhTLKSg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g2Ogh/Y5E59Gqy0SRh3q+QKx8BGVDqh7WfJwzXq29HdJl5np6YsNGgXki046dtIYXM7Vk6YqhbVWpWlx5D/jhw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fxllR6psdh00kEGZ13C9GbUK0Ef763WPehcu0Cw3nGtHQMEnFJ0baEOT+exnK2rMPsDSlzRV3GeWc9D5Y5hpnQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Jk87FQTiUyvACAZ+LXzQSym4xFBwjT7dEmlXCfrKoc4Gfulki9zLJCPpYtTdAsB+d5VdkEab3Ywx1WECm0Rgxw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RszGJc/GTwskYskc82z9WfRUfdmMT1EXnBBa+lbhuQ4SkgiFx6EOJ4R66i5xQI0vjccEkufBvsX58LYnhKiiyQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AmnwZ3Grd2QW962s+rEn2QvuwFWhhFC3k8e6k+Lpq6hJOVqgbGWXGtPemqSHwmML62Za8Hyzcao9Y4zuXM8JCQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qTF3punEcwvO68Sd3WkL3bq2LYi47P0SJJUwi0gdsr9jYV1LcJLfDV6eTLRD+AuX4uKgi1ZZ3/UNxYjaFRigLg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"V+qs5vyCMaGRN+TxNYqX79rypwMK4oypWzFZog0zaIZhjcUpVL/iA5OpTIsNrI5U7X9b04dfDcrC/Vm3hXHzgQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0K9XFITRAZscBYnBZcuQ5o3kT954xWmHuOiQUoAxuMJsUSX6CblwCm7YE8j5ELDvE8STnvKC40K17ohGu0iylA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"elgK/N388Iz5oKDzZr4t0dmeBaamC4VtBPzMHFYz47hNFvqHsHgJuL3lEtTQw0HqCOmDqlo96PIMrq/xL1JNeA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"pOrIun9Eu7qyQNMRBdIGDif+bSXhwkPCL+N1/5npNtsGb4xMhxpBP3yT/Lq9VmotatYExusB8zv67uyJj6EKbQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qGV+uH7f3tTjf4VArb1QF6YX67Yak7wU0MmT+U8zR0M6e8LJUfqufu1Ed8lAv7oQ148sTBHm7lG9BA0sBPT/hw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G+7GSHxC1vZePPrygv70woPAyfm1B0A6QSGEYqzsuFVrYQjc+VpnQcZRxujJK45wdEA8gJljp6nEUIoe2fvX5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OO7U2vDRqdsXYGH97YoH9B90ZvpcknnSYgkqDV0h5RZea0Ot1MDC26QlSuT7K+ue0baNFqJcHEXT1YjZaMcbaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y0/pWqx4XTKb4JVmh0gfBQffJ31hYcE4GlolQot5/qpJ+0IivG9G3lrfhbbEl/6heNFpPMKDg45OfVHTt5Nx5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/demo/boards","func":"CreateReply","args":["1","3","3","hello world!"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"tExs3D8grIKdN6U1/8gFZ/OZkwgiCtBjmHhN2/0HE+0D9CEl6KkdUTTIF0z3Ga2oDuhQBVf4C5u6CbuX24EW1w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5yV/dtQhLn6TpQlYVtE/zKo128dU0yQUf2JX05RvLqMy1/dbHmogOtjyOeJbQ/a+M+Wei2dNCNBA+92tVYQgqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5HsVSrJFSVrvvaY7PR3ixMRXsFKqzHfSxFa0nNfIYsMMtdFSB20+/246yCxBa0iZ7H/f1MUHf5Dzuf6G1f8b+Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G+7GSHxC1vZePPrygv70woPAyfm1B0A6QSGEYqzsuFVrYQjc+VpnQcZRxujJK45wdEA8gJljp6nEUIoe2fvX5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OO7U2vDRqdsXYGH97YoH9B90ZvpcknnSYgkqDV0h5RZea0Ot1MDC26QlSuT7K+ue0baNFqJcHEXT1YjZaMcbaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y0/pWqx4XTKb4JVmh0gfBQffJ31hYcE4GlolQot5/qpJ+0IivG9G3lrfhbbEl/6heNFpPMKDg45OfVHTt5Nx5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G+7GSHxC1vZePPrygv70woPAyfm1B0A6QSGEYqzsuFVrYQjc+VpnQcZRxujJK45wdEA8gJljp6nEUIoe2fvX5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OO7U2vDRqdsXYGH97YoH9B90ZvpcknnSYgkqDV0h5RZea0Ot1MDC26QlSuT7K+ue0baNFqJcHEXT1YjZaMcbaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y0/pWqx4XTKb4JVmh0gfBQffJ31hYcE4GlolQot5/qpJ+0IivG9G3lrfhbbEl/6heNFpPMKDg45OfVHTt5Nx5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5yV/dtQhLn6TpQlYVtE/zKo128dU0yQUf2JX05RvLqMy1/dbHmogOtjyOeJbQ/a+M+Wei2dNCNBA+92tVYQgqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5HsVSrJFSVrvvaY7PR3ixMRXsFKqzHfSxFa0nNfIYsMMtdFSB20+/246yCxBa0iZ7H/f1MUHf5Dzuf6G1f8b+Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"phtNWuw+s6rlNwVt+PgyXTrg6l5QLytx7A99mWlFHdlXhJL4kT/E9iSGoutU5nmVGqVI3T3Obc3xqaPT+bwXfg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"aAMaFvYTgfSBuYdQERL3b9Xb4y6DLfKf84wtfL2tPRV/xjdXpuj0KjqJw8whNopkCdOGwP3J+xxlaenyfn1vSw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sy7aCwhwl53QGymG4qlTarx+z2YHt4nXhRTBuAcWdOhF07Ij0G908kNJjOLRO5ppCXoVdpGgYqpE79xcPYKrbg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rpKHlFQBR86UZnlEIb/JUNuzYLbwpF9cGl83jhh7j+sAC1Tg5OFW1aBqxfRscgFKuv2CCQzyUo3mltKsZuhkeg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GUka0bGpN9vw5UjP5hLNkNF3AhMj7opdkFi47Ieo+X5iBcP5Nir7Z5XnPS9fqi9psrSuUellKOc9kvKNhTLKSg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g2Ogh/Y5E59Gqy0SRh3q+QKx8BGVDqh7WfJwzXq29HdJl5np6YsNGgXki046dtIYXM7Vk6YqhbVWpWlx5D/jhw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fxllR6psdh00kEGZ13C9GbUK0Ef763WPehcu0Cw3nGtHQMEnFJ0baEOT+exnK2rMPsDSlzRV3GeWc9D5Y5hpnQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Jk87FQTiUyvACAZ+LXzQSym4xFBwjT7dEmlXCfrKoc4Gfulki9zLJCPpYtTdAsB+d5VdkEab3Ywx1WECm0Rgxw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RszGJc/GTwskYskc82z9WfRUfdmMT1EXnBBa+lbhuQ4SkgiFx6EOJ4R66i5xQI0vjccEkufBvsX58LYnhKiiyQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AmnwZ3Grd2QW962s+rEn2QvuwFWhhFC3k8e6k+Lpq6hJOVqgbGWXGtPemqSHwmML62Za8Hyzcao9Y4zuXM8JCQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qTF3punEcwvO68Sd3WkL3bq2LYi47P0SJJUwi0gdsr9jYV1LcJLfDV6eTLRD+AuX4uKgi1ZZ3/UNxYjaFRigLg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"V+qs5vyCMaGRN+TxNYqX79rypwMK4oypWzFZog0zaIZhjcUpVL/iA5OpTIsNrI5U7X9b04dfDcrC/Vm3hXHzgQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0K9XFITRAZscBYnBZcuQ5o3kT954xWmHuOiQUoAxuMJsUSX6CblwCm7YE8j5ELDvE8STnvKC40K17ohGu0iylA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"elgK/N388Iz5oKDzZr4t0dmeBaamC4VtBPzMHFYz47hNFvqHsHgJuL3lEtTQw0HqCOmDqlo96PIMrq/xL1JNeA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"pOrIun9Eu7qyQNMRBdIGDif+bSXhwkPCL+N1/5npNtsGb4xMhxpBP3yT/Lq9VmotatYExusB8zv67uyJj6EKbQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qGV+uH7f3tTjf4VArb1QF6YX67Yak7wU0MmT+U8zR0M6e8LJUfqufu1Ed8lAv7oQ148sTBHm7lG9BA0sBPT/hw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1mG5XOwHMust28kEm3mU5xzlTNeuJxEI+RA9vXMY5LQ+7QKHH35Jr2MbeW/40vVk82bWtxdFX4a/Cw+D142gqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"kRBCjz7SITeivFCjgohy0TzMjqmPbXOAdacH/frLPbItHCaaTfF/tIWQUP3F9HYh8EG2c5SPgocLKIIyGDNkXQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"xxvYsUyp3A1KK4xIchgEBHsX6QVAf3Lqk7uQSwj8vZAayELv25Jo/enGiXzyopH0bXyuKlGjfdcHKR5dQ8VfoA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qGsJYQgoLimEZzLKR2BmxQx9fxl6v34tQRITkUrtPP9jiYcHUUZuMQmHlzkhE29JJh1bCdm6QAkc2aBOdLasNQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"C2KNw9POqmtvQyAXaYkjQQHq1a/iRr5Eu88HdwxF8KEzIedIpAuOlyBgGwHkFwIkLYIpPVhR8cJXoHzLsV3w0w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"git0TH08GJKUkdmOH1EHjlcpBFDgOBgqikHZNPTh/ktORDUoO3izV7WKK6TZTy8OxFDUkbC14sb3W9M8M/GQ1Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fYL42+rtkVaR4A+Ecp8sud6vaYKciPf+EeRcDOUfldErs1lCToaCfZjxs4DJ9J+iMcIjyg1cczuRr2EjviVo8Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"MRBFuxxpHJKm7Ua4WhGZiukEHi3j3F4CmXk72CKVuXlwQogd8Av0g4ji9S/2L0ZH+5z6c9s0ap+7vBYzE4G7SA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"B8ieqH3XjzVqB4no0OQDCO66Bqs0+LQD6AYba+oYmy05OVyxX7xwszootmv5eYMSUt2USWN8Shf3HN9NtGLoMA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5MOLSFMZ+PxHoR2y6rwrFxmYle57dtILpWY4n364JiNgQA5yKkpjQ223Srufb3yJfTrqPtshw/AYf6eYraKEXg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"TQIr0tLmfAvldbLdDnZHnI/Stxnxj5Ha8XJFHg9MKBpd80W9A7n5IKsxwn+gGAvOrZWE969vmYLAYx2qPpjR4Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g7pC5xf9HvIZeyO82aJzbqnMXXu7cC30bkJ3h90n96VVUL2Vs3m7hGYq64GolwQLkLYCy4BoqI0K1KmWgKnfJw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"b2dNMfD+K2Un28ji+Kegt7t8uVXvASPh+KjcRT4NHHMLJXCevBmYCvISIpxRYnXZrd3eU7Z3/Ui6inIP7N8RdA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"S0gWccFnm8zInib2yPeMOAS88+xh22BZya0HhikfYNMrkHFPHt0seGW+KTIuaWAUiT79gYYViFdBRnaBvYnr1A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RxXliVI+xdd8IXpvBtrhOOR4CfjeFqcFAzu5U04wG4QEv9J6QMzdCUYS0fabGbizUg0YIbxjduJpsbgFb29w1Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"wE4jDZd9BoDYT2Hrre6Go9Evu07/Y/ylQE90p/f9961pJdE1VWGIVKa9e6cd3V0WhyEiCDUvgMrwksMkDSUGOA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3ZzJTYMP9kyHozVzuoZqiKZp257HaTcp71hiel+FxxEL2cC6j24v1TssBoqwUARYEHkek6yj1WAY4BCYOtA4HA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1JArJ2bOzc6Im5SDgNjDsqrF/N0KCLz558ntuub/pXNuSWt6gFsFir4Eerg27tCvV7zugZWz3HLn+ErAq4Khaw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"32oPuVz4U2LnUF+wUgmEog8LVSR64r1vdzjbylfDdZ0KCppQFyo172eglV9rs8SYl7z6qM+qt2inUWv1N6lHhw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"i3aH29nsx2BoRynHURfBnHv61NNC0uILP2n2A0t1hb9NOfNyiIaMbQS9ETrN++NjuLfXyxngi3IYRF5KoMn/Vw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Pz9ao+RnNprgUh5dTOFfwQR5jdQQYrMZTqLUMWJaBoci/jNujl9UjySXNIc2TQepTydtSpRM5uJ/i0AgwhqoFg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"MlzY0Q3IX2ngoI4OvP0QgkotoyYAWSKxeMU5gTRSde5YgezoQ6fKwrAiQLbfy+7WoCbvU7nGRMHVS2K7akyjrw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"useHxyDXK73e0vvkiWDmU97QH8+Gr6HBlMj2sFx44OUq4PFWAyTIFTzr4QpYBDeUjy1ee3K9zZJg/Ianifv/dA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"DUQ7Cs76HHQ6J5XqyMDf1oCufOMtfboZWG4Rh2QAayMohxQAHzOnYp9PoB/J48SsJ8A0oL006IvZIvyAZ5dL8w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9bkNRN9vkR2cUl1WAIWcfv3pdasg5IKeGCl8QgrZVgJyHLnkcS1Lef02X3do1rlMui0RvtVRR2ytwb06ASS+UA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"BnCMNzUTpTJp0S1e37t3f8iHMTG4XzsP2RRBHwahkbcDqkLICPEpSiTVGCX4QNx6cBAz3iziRarVJ5xptyitxQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qp0FSC+cM7IB97Qg8d9r2JRuUhjmDjTk4L3R0DJVi2MXbz4uLfq3su98EUx6B4RR42Tg+rmJVYfGUZyzMLdLHA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"CXBKJuKxHBysTXgegvOLbc3dBTUqJFl5epQkGZjtfSNX/77i8UoYqeqyymTEaCYif/gkxjx1gYds8FfI8gyOcQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3G2uA8tHcb8LMk9rSOqrSx7bmXAJqRpgR4qTxwXny14ecYHLrZYoN6ol7YYAcOgrgFjIEYn7YD8Tg+g77d/5Lw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"d6ZnqzlgPJwIxh9lesfGStq4zP8wgRinGwgRvLpxCSlMYmydxBcgSqiRGhoaYQdN6D3esRBX090t3R1K1J4O9Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"v9SiD7vZsgjiww5M9RoDgyqXS9a54OPeldsk+igGOX4WVNerR2gdcfTewJFtz6r0+sMzxUM3y0TCClSJppZHjw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"/tWgpynW1EbDE2200qHkRdAyOXNtJOIr9AZ9JvJQ0HNi+Ap7FNuqqwZsFscX9cgg71b5XIon2c9zws1u29e2Nw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"XZFlkN9x7Ni7ZZ+h7FhmmH3VCok1E7ZqIYCrK5r+aoh9+hMMHfucBz/69Sr3MAGj6e7yTjT1NT0Ol6GZlv3LWQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3Z4tpmdimv5cGEsCfhDxHunUcYm2GF2sYjLbva34AQgzDyn45uRG7qcRBQkgK9FaKNU7jiOJdhOEBaS4rwRLrg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"BFWKchFXQz8ctgj9RvJ1bhL3+UWRIC0P9h9SLUFN7QgOppSDXqnx8bRCxz9BfVPUpmhGhfuQE8QhID7yEG0tdQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RIQIgtR6jKCENISFZsF21Bauz6CR42iH8vVMv6jzdw5afK9BUZiq8LqRYPSlAPcyuGGeXqw1vRJ8iGYsfqJbmw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"4h5TBDJnLq4tLniJPxb5KQ2PvIzlrI7mBCu9+t8DvyYD2ngRmCJiYV8O+ptoBJ9Zi+g15jIcexcjWm5wwFIOrA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"VUo1jZTWpjnxUPKUgUoFejFFyQKNOGgy9K6I2P3C0SMXJs7vPxoocZs1bXqSgcFMD1PaXBQHrg0MAOJrCEeERw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"u3a4toTRtd332a8s1Cwerjf9PNHMZi4qiGfbWscV1dR0wXYafjEAxj1+g+5FV5bvkJV2taNPYHUl7woLdBSrSw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"gMkg6yr9NUL+S217dJx7iDOTqQBeltTRdNr7wf2iDhRG4qjEJsKVpPTb48qX2jCjT9sgKcGDe209MlTYUf0aQQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9iG2FVmi9beSwiK9KGAp7Kj0EgEW3f+TO+hYSllTRiwvD2OsPxNzgMFzK8VdmkY7bNQco5wqct8AWBAeB7UdyQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"bJDj7aD4/A7LTvX6Qz6rcUFfs9hPvj2LJtFLWHnPFog8OhUIKFjI2wcWyZFBpkHYJyQKjOZHO92x2EUeLowpLQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sLwNlaapwQpDWgRD3Hu2H/7X2X4+mDOfgkJ1UBtEux8YN35V8IdsH/xM+VGEg6SPjviqHvj9OsKH17A2t96tdA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qq4+mzEVRra7WDJM70tseZD2pxmDHO3rfQw5GOG7Tp9DQh+avmmrdg1gDv0e18AIJXia5Yr5+eyBCHILLOevvA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fnRP/XezHy2AJlON5yLdeOjYCQdyw8rZxWzqP4Li4KsVhFmlSCV0UfOC1mtoGGOvQDWHsmuQHZuhxyvLDybjTQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"zYYhSOMW75A9eMBI2xWPc6gTK7E5KozSB98e7GbD6y5zJZRZjFpDpBFG+ZRwd1h3/wqvhV024y2nj/IqJv0G+g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"bm5heK5sEuPDNPPP6FAjVYI7BtRCINPCssNM1VUYBGU/BeZXz5jXUh6ZnrMMV/62Q4zICyDt81X6XpqcUt7FVg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fpE7Q9GFmS4+eKYvSm/5NZLs/RqWOktCq+YApAe4bn0azu0KF7BNy+cUIrD50pft58qi1mJdJET+tpbPMttIug=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"11000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"4w1ASHQdaDTqd7f6SIwrpSCk3oMgYmwMQLVuaaDssP0hHXuj7an7PEH6JyRBqDWtVz5jDdeyi9V1gZkmNfjM8Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"2000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"0p2HN+ShQH/7mQseggGtrSFZ+WBn9cbM4ZaMeyGvOLww+ZCktJSE2o2XBzmfS143V4FUbEEzNCpSlxIG6A3j4g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"wpwqM/7400CfI+mADvv+yS9CfbU3hqLtvgs4OSuJMDsH2uZWSQXmPa5/3Iuq7u0O6N0pZA1/4WJn2meqM+0jxg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"KQkgb8fWyOsTCNkibpd2OZS6YvV0BpGOxbKY9F9jrCpAQXqYhMjMpoXhgysh41ggL9yozJYMniDrZ07i86XhKw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"123000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"nolr8c7Si5e38SbWZ/WGaIPxDtUs8xV7M2TutDbtqUozsjYDAtfNJrjeSJg0FDkx7hisOgTbJ8+3tTQA3yNJCg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"12000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"764EIj5B9Kpom19ubwNL8Qi3ENq/3JrpSK7HPCtDMT8yMUYfE1/RnGM6sDMfwDs+5Z1Nqm6OEywHsH3C2gltaw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ED7DClAGLfxTF06GgsvDutUWefXfKRbjDq9KPDtzutlYAugvIvg1HeTi3PYQJ5KHjouoyN9YV6z/XCXGED8zOw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qJr2gOmXpb9Q8dkhzXmcS38qSN0v1snbx1K1i6+s+m11tCbHhlhNqAg3v36rh177DsKqUPt2t0D2kX5MKUlHyA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"SP+rp9OqDQXQSwTklSedH5EmibQr4s0ciOTpYdcrm6dXyAw8HkEgX91vvAf7L7O6w3DljhItK/f+FuRVDnLjOg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"EqoaeTzRujnOM07rgs8R2ZGicLCwS3TlfbbyEvmWrzUX+iraMCFHU2vvvLwdZ1YZVY/lQNpq9NomCbiDkj7v2g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"IFe0f5HNzttK7wx5AWJjN9DPz2aW/qYN6ZH51z2Eqa9bOEEtakK41n4ZTyTIkUTS46q+awxScSyrPHAVrAFU2g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G+7GSHxC1vZePPrygv70woPAyfm1B0A6QSGEYqzsuFVrYQjc+VpnQcZRxujJK45wdEA8gJljp6nEUIoe2fvX5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OO7U2vDRqdsXYGH97YoH9B90ZvpcknnSYgkqDV0h5RZea0Ot1MDC26QlSuT7K+ue0baNFqJcHEXT1YjZaMcbaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y0/pWqx4XTKb4JVmh0gfBQffJ31hYcE4GlolQot5/qpJ+0IivG9G3lrfhbbEl/6heNFpPMKDg45OfVHTt5Nx5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5yV/dtQhLn6TpQlYVtE/zKo128dU0yQUf2JX05RvLqMy1/dbHmogOtjyOeJbQ/a+M+Wei2dNCNBA+92tVYQgqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5HsVSrJFSVrvvaY7PR3ixMRXsFKqzHfSxFa0nNfIYsMMtdFSB20+/246yCxBa0iZ7H/f1MUHf5Dzuf6G1f8b+Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"phtNWuw+s6rlNwVt+PgyXTrg6l5QLytx7A99mWlFHdlXhJL4kT/E9iSGoutU5nmVGqVI3T3Obc3xqaPT+bwXfg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"aAMaFvYTgfSBuYdQERL3b9Xb4y6DLfKf84wtfL2tPRV/xjdXpuj0KjqJw8whNopkCdOGwP3J+xxlaenyfn1vSw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sy7aCwhwl53QGymG4qlTarx+z2YHt4nXhRTBuAcWdOhF07Ij0G908kNJjOLRO5ppCXoVdpGgYqpE79xcPYKrbg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rpKHlFQBR86UZnlEIb/JUNuzYLbwpF9cGl83jhh7j+sAC1Tg5OFW1aBqxfRscgFKuv2CCQzyUo3mltKsZuhkeg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GUka0bGpN9vw5UjP5hLNkNF3AhMj7opdkFi47Ieo+X5iBcP5Nir7Z5XnPS9fqi9psrSuUellKOc9kvKNhTLKSg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G+7GSHxC1vZePPrygv70woPAyfm1B0A6QSGEYqzsuFVrYQjc+VpnQcZRxujJK45wdEA8gJljp6nEUIoe2fvX5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OO7U2vDRqdsXYGH97YoH9B90ZvpcknnSYgkqDV0h5RZea0Ot1MDC26QlSuT7K+ue0baNFqJcHEXT1YjZaMcbaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y0/pWqx4XTKb4JVmh0gfBQffJ31hYcE4GlolQot5/qpJ+0IivG9G3lrfhbbEl/6heNFpPMKDg45OfVHTt5Nx5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5yV/dtQhLn6TpQlYVtE/zKo128dU0yQUf2JX05RvLqMy1/dbHmogOtjyOeJbQ/a+M+Wei2dNCNBA+92tVYQgqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5HsVSrJFSVrvvaY7PR3ixMRXsFKqzHfSxFa0nNfIYsMMtdFSB20+/246yCxBa0iZ7H/f1MUHf5Dzuf6G1f8b+Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"phtNWuw+s6rlNwVt+PgyXTrg6l5QLytx7A99mWlFHdlXhJL4kT/E9iSGoutU5nmVGqVI3T3Obc3xqaPT+bwXfg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"aAMaFvYTgfSBuYdQERL3b9Xb4y6DLfKf84wtfL2tPRV/xjdXpuj0KjqJw8whNopkCdOGwP3J+xxlaenyfn1vSw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sy7aCwhwl53QGymG4qlTarx+z2YHt4nXhRTBuAcWdOhF07Ij0G908kNJjOLRO5ppCXoVdpGgYqpE79xcPYKrbg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rpKHlFQBR86UZnlEIb/JUNuzYLbwpF9cGl83jhh7j+sAC1Tg5OFW1aBqxfRscgFKuv2CCQzyUo3mltKsZuhkeg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GUka0bGpN9vw5UjP5hLNkNF3AhMj7opdkFi47Ieo+X5iBcP5Nir7Z5XnPS9fqi9psrSuUellKOc9kvKNhTLKSg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g2Ogh/Y5E59Gqy0SRh3q+QKx8BGVDqh7WfJwzXq29HdJl5np6YsNGgXki046dtIYXM7Vk6YqhbVWpWlx5D/jhw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G+7GSHxC1vZePPrygv70woPAyfm1B0A6QSGEYqzsuFVrYQjc+VpnQcZRxujJK45wdEA8gJljp6nEUIoe2fvX5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OO7U2vDRqdsXYGH97YoH9B90ZvpcknnSYgkqDV0h5RZea0Ot1MDC26QlSuT7K+ue0baNFqJcHEXT1YjZaMcbaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y0/pWqx4XTKb4JVmh0gfBQffJ31hYcE4GlolQot5/qpJ+0IivG9G3lrfhbbEl/6heNFpPMKDg45OfVHTt5Nx5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5yV/dtQhLn6TpQlYVtE/zKo128dU0yQUf2JX05RvLqMy1/dbHmogOtjyOeJbQ/a+M+Wei2dNCNBA+92tVYQgqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5HsVSrJFSVrvvaY7PR3ixMRXsFKqzHfSxFa0nNfIYsMMtdFSB20+/246yCxBa0iZ7H/f1MUHf5Dzuf6G1f8b+Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"phtNWuw+s6rlNwVt+PgyXTrg6l5QLytx7A99mWlFHdlXhJL4kT/E9iSGoutU5nmVGqVI3T3Obc3xqaPT+bwXfg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"aAMaFvYTgfSBuYdQERL3b9Xb4y6DLfKf84wtfL2tPRV/xjdXpuj0KjqJw8whNopkCdOGwP3J+xxlaenyfn1vSw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sy7aCwhwl53QGymG4qlTarx+z2YHt4nXhRTBuAcWdOhF07Ij0G908kNJjOLRO5ppCXoVdpGgYqpE79xcPYKrbg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rpKHlFQBR86UZnlEIb/JUNuzYLbwpF9cGl83jhh7j+sAC1Tg5OFW1aBqxfRscgFKuv2CCQzyUo3mltKsZuhkeg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GUka0bGpN9vw5UjP5hLNkNF3AhMj7opdkFi47Ieo+X5iBcP5Nir7Z5XnPS9fqi9psrSuUellKOc9kvKNhTLKSg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g2Ogh/Y5E59Gqy0SRh3q+QKx8BGVDqh7WfJwzXq29HdJl5np6YsNGgXki046dtIYXM7Vk6YqhbVWpWlx5D/jhw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fxllR6psdh00kEGZ13C9GbUK0Ef763WPehcu0Cw3nGtHQMEnFJ0baEOT+exnK2rMPsDSlzRV3GeWc9D5Y5hpnQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Jk87FQTiUyvACAZ+LXzQSym4xFBwjT7dEmlXCfrKoc4Gfulki9zLJCPpYtTdAsB+d5VdkEab3Ywx1WECm0Rgxw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RszGJc/GTwskYskc82z9WfRUfdmMT1EXnBBa+lbhuQ4SkgiFx6EOJ4R66i5xQI0vjccEkufBvsX58LYnhKiiyQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AmnwZ3Grd2QW962s+rEn2QvuwFWhhFC3k8e6k+Lpq6hJOVqgbGWXGtPemqSHwmML62Za8Hyzcao9Y4zuXM8JCQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qTF3punEcwvO68Sd3WkL3bq2LYi47P0SJJUwi0gdsr9jYV1LcJLfDV6eTLRD+AuX4uKgi1ZZ3/UNxYjaFRigLg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"V+qs5vyCMaGRN+TxNYqX79rypwMK4oypWzFZog0zaIZhjcUpVL/iA5OpTIsNrI5U7X9b04dfDcrC/Vm3hXHzgQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv","to_address":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","amount":"100000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArDpFd2owLPsaNRQ2xWL/ELLJVVwo7OoPqIi0OtZJV7/"},"signature":"wNJ2PK2dczSJ3KOO98h/q+PWkT9KWOJ+iRs4+bB0z3oBgMFqVxv7iCIeJiuGa7Z3sinNZo6qvEhmI2yOsMrufg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0K9XFITRAZscBYnBZcuQ5o3kT954xWmHuOiQUoAxuMJsUSX6CblwCm7YE8j5ELDvE8STnvKC40K17ohGu0iylA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"elgK/N388Iz5oKDzZr4t0dmeBaamC4VtBPzMHFYz47hNFvqHsHgJuL3lEtTQw0HqCOmDqlo96PIMrq/xL1JNeA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"pOrIun9Eu7qyQNMRBdIGDif+bSXhwkPCL+N1/5npNtsGb4xMhxpBP3yT/Lq9VmotatYExusB8zv67uyJj6EKbQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qGV+uH7f3tTjf4VArb1QF6YX67Yak7wU0MmT+U8zR0M6e8LJUfqufu1Ed8lAv7oQ148sTBHm7lG9BA0sBPT/hw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1mG5XOwHMust28kEm3mU5xzlTNeuJxEI+RA9vXMY5LQ+7QKHH35Jr2MbeW/40vVk82bWtxdFX4a/Cw+D142gqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"kRBCjz7SITeivFCjgohy0TzMjqmPbXOAdacH/frLPbItHCaaTfF/tIWQUP3F9HYh8EG2c5SPgocLKIIyGDNkXQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"xxvYsUyp3A1KK4xIchgEBHsX6QVAf3Lqk7uQSwj8vZAayELv25Jo/enGiXzyopH0bXyuKlGjfdcHKR5dQ8VfoA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qGsJYQgoLimEZzLKR2BmxQx9fxl6v34tQRITkUrtPP9jiYcHUUZuMQmHlzkhE29JJh1bCdm6QAkc2aBOdLasNQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"C2KNw9POqmtvQyAXaYkjQQHq1a/iRr5Eu88HdwxF8KEzIedIpAuOlyBgGwHkFwIkLYIpPVhR8cJXoHzLsV3w0w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"git0TH08GJKUkdmOH1EHjlcpBFDgOBgqikHZNPTh/ktORDUoO3izV7WKK6TZTy8OxFDUkbC14sb3W9M8M/GQ1Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fYL42+rtkVaR4A+Ecp8sud6vaYKciPf+EeRcDOUfldErs1lCToaCfZjxs4DJ9J+iMcIjyg1cczuRr2EjviVo8Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"MRBFuxxpHJKm7Ua4WhGZiukEHi3j3F4CmXk72CKVuXlwQogd8Av0g4ji9S/2L0ZH+5z6c9s0ap+7vBYzE4G7SA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"B8ieqH3XjzVqB4no0OQDCO66Bqs0+LQD6AYba+oYmy05OVyxX7xwszootmv5eYMSUt2USWN8Shf3HN9NtGLoMA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5MOLSFMZ+PxHoR2y6rwrFxmYle57dtILpWY4n364JiNgQA5yKkpjQ223Srufb3yJfTrqPtshw/AYf6eYraKEXg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"TQIr0tLmfAvldbLdDnZHnI/Stxnxj5Ha8XJFHg9MKBpd80W9A7n5IKsxwn+gGAvOrZWE969vmYLAYx2qPpjR4Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g7pC5xf9HvIZeyO82aJzbqnMXXu7cC30bkJ3h90n96VVUL2Vs3m7hGYq64GolwQLkLYCy4BoqI0K1KmWgKnfJw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"b2dNMfD+K2Un28ji+Kegt7t8uVXvASPh+KjcRT4NHHMLJXCevBmYCvISIpxRYnXZrd3eU7Z3/Ui6inIP7N8RdA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"S0gWccFnm8zInib2yPeMOAS88+xh22BZya0HhikfYNMrkHFPHt0seGW+KTIuaWAUiT79gYYViFdBRnaBvYnr1A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RxXliVI+xdd8IXpvBtrhOOR4CfjeFqcFAzu5U04wG4QEv9J6QMzdCUYS0fabGbizUg0YIbxjduJpsbgFb29w1Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"wE4jDZd9BoDYT2Hrre6Go9Evu07/Y/ylQE90p/f9961pJdE1VWGIVKa9e6cd3V0WhyEiCDUvgMrwksMkDSUGOA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3ZzJTYMP9kyHozVzuoZqiKZp257HaTcp71hiel+FxxEL2cC6j24v1TssBoqwUARYEHkek6yj1WAY4BCYOtA4HA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1JArJ2bOzc6Im5SDgNjDsqrF/N0KCLz558ntuub/pXNuSWt6gFsFir4Eerg27tCvV7zugZWz3HLn+ErAq4Khaw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"32oPuVz4U2LnUF+wUgmEog8LVSR64r1vdzjbylfDdZ0KCppQFyo172eglV9rs8SYl7z6qM+qt2inUWv1N6lHhw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"i3aH29nsx2BoRynHURfBnHv61NNC0uILP2n2A0t1hb9NOfNyiIaMbQS9ETrN++NjuLfXyxngi3IYRF5KoMn/Vw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Pz9ao+RnNprgUh5dTOFfwQR5jdQQYrMZTqLUMWJaBoci/jNujl9UjySXNIc2TQepTydtSpRM5uJ/i0AgwhqoFg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"MlzY0Q3IX2ngoI4OvP0QgkotoyYAWSKxeMU5gTRSde5YgezoQ6fKwrAiQLbfy+7WoCbvU7nGRMHVS2K7akyjrw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"useHxyDXK73e0vvkiWDmU97QH8+Gr6HBlMj2sFx44OUq4PFWAyTIFTzr4QpYBDeUjy1ee3K9zZJg/Ianifv/dA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"DUQ7Cs76HHQ6J5XqyMDf1oCufOMtfboZWG4Rh2QAayMohxQAHzOnYp9PoB/J48SsJ8A0oL006IvZIvyAZ5dL8w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9bkNRN9vkR2cUl1WAIWcfv3pdasg5IKeGCl8QgrZVgJyHLnkcS1Lef02X3do1rlMui0RvtVRR2ytwb06ASS+UA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"BnCMNzUTpTJp0S1e37t3f8iHMTG4XzsP2RRBHwahkbcDqkLICPEpSiTVGCX4QNx6cBAz3iziRarVJ5xptyitxQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qp0FSC+cM7IB97Qg8d9r2JRuUhjmDjTk4L3R0DJVi2MXbz4uLfq3su98EUx6B4RR42Tg+rmJVYfGUZyzMLdLHA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"CXBKJuKxHBysTXgegvOLbc3dBTUqJFl5epQkGZjtfSNX/77i8UoYqeqyymTEaCYif/gkxjx1gYds8FfI8gyOcQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3G2uA8tHcb8LMk9rSOqrSx7bmXAJqRpgR4qTxwXny14ecYHLrZYoN6ol7YYAcOgrgFjIEYn7YD8Tg+g77d/5Lw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"d6ZnqzlgPJwIxh9lesfGStq4zP8wgRinGwgRvLpxCSlMYmydxBcgSqiRGhoaYQdN6D3esRBX090t3R1K1J4O9Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"v9SiD7vZsgjiww5M9RoDgyqXS9a54OPeldsk+igGOX4WVNerR2gdcfTewJFtz6r0+sMzxUM3y0TCClSJppZHjw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G+7GSHxC1vZePPrygv70woPAyfm1B0A6QSGEYqzsuFVrYQjc+VpnQcZRxujJK45wdEA8gJljp6nEUIoe2fvX5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OO7U2vDRqdsXYGH97YoH9B90ZvpcknnSYgkqDV0h5RZea0Ot1MDC26QlSuT7K+ue0baNFqJcHEXT1YjZaMcbaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y0/pWqx4XTKb4JVmh0gfBQffJ31hYcE4GlolQot5/qpJ+0IivG9G3lrfhbbEl/6heNFpPMKDg45OfVHTt5Nx5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5yV/dtQhLn6TpQlYVtE/zKo128dU0yQUf2JX05RvLqMy1/dbHmogOtjyOeJbQ/a+M+Wei2dNCNBA+92tVYQgqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5HsVSrJFSVrvvaY7PR3ixMRXsFKqzHfSxFa0nNfIYsMMtdFSB20+/246yCxBa0iZ7H/f1MUHf5Dzuf6G1f8b+Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"phtNWuw+s6rlNwVt+PgyXTrg6l5QLytx7A99mWlFHdlXhJL4kT/E9iSGoutU5nmVGqVI3T3Obc3xqaPT+bwXfg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/demo/boards","func":"CreateBoard","args":["manfred"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"Cd4PlNfuL+Yg+JMuQH1gUX7i0OglJSMlq/c9GE0qhUF2roj5iG7qNww5nM1JF5WAFkTQGfQV7m1Xfw2DHjN7Bw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"aAMaFvYTgfSBuYdQERL3b9Xb4y6DLfKf84wtfL2tPRV/xjdXpuj0KjqJw8whNopkCdOGwP3J+xxlaenyfn1vSw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sy7aCwhwl53QGymG4qlTarx+z2YHt4nXhRTBuAcWdOhF07Ij0G908kNJjOLRO5ppCXoVdpGgYqpE79xcPYKrbg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rpKHlFQBR86UZnlEIb/JUNuzYLbwpF9cGl83jhh7j+sAC1Tg5OFW1aBqxfRscgFKuv2CCQzyUo3mltKsZuhkeg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/demo/boards","func":"CreateBoard","args":["manfred"]}],"fee":{"gas_wanted":"2000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"AS8pkztCu36P5ZCxv4IzeXb3/RAn4fKVIOr7NiJYSHYy/LWCv02Yhnzmra7d7qbghCCRNl0GaNEnR1QmzAe6ng=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GUka0bGpN9vw5UjP5hLNkNF3AhMj7opdkFi47Ieo+X5iBcP5Nir7Z5XnPS9fqi9psrSuUellKOc9kvKNhTLKSg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g2Ogh/Y5E59Gqy0SRh3q+QKx8BGVDqh7WfJwzXq29HdJl5np6YsNGgXki046dtIYXM7Vk6YqhbVWpWlx5D/jhw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G+7GSHxC1vZePPrygv70woPAyfm1B0A6QSGEYqzsuFVrYQjc+VpnQcZRxujJK45wdEA8gJljp6nEUIoe2fvX5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OO7U2vDRqdsXYGH97YoH9B90ZvpcknnSYgkqDV0h5RZea0Ot1MDC26QlSuT7K+ue0baNFqJcHEXT1YjZaMcbaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y0/pWqx4XTKb4JVmh0gfBQffJ31hYcE4GlolQot5/qpJ+0IivG9G3lrfhbbEl/6heNFpPMKDg45OfVHTt5Nx5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5yV/dtQhLn6TpQlYVtE/zKo128dU0yQUf2JX05RvLqMy1/dbHmogOtjyOeJbQ/a+M+Wei2dNCNBA+92tVYQgqg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"J8YIWAQFBiYLJd8hYvsCz9XGWdiT6Ls9rDnCL4lC/Bd+7TnPMpMr2bsypkJNpNvTS9/z06DutCpR2hDyyf2wFg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"DAIIHQGk29vkDQCSN3A6xuBmjrNvZ+28TBHdDeVpmSYcz7z3sjViwFHCNIzQDT0T1iVwABYEuHNdy843MBd9Kw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"SPpT81n2iNTlzkhMKWcfZ9tnoJNCeHar1p+afP26RLEisdXdmwJ0wLaA8bqBtokzvhrSWux8drhsC3mfLEraug=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"PP6awJEBIbo+TanynQjo8VLNWSQtbpD5lNzqsz7ugUpzT6c7izb2NteHqvJPtoEbwhG7R4XnW/DXqQ7E4B9rWg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rpKHlFQBR86UZnlEIb/JUNuzYLbwpF9cGl83jhh7j+sAC1Tg5OFW1aBqxfRscgFKuv2CCQzyUo3mltKsZuhkeg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GUka0bGpN9vw5UjP5hLNkNF3AhMj7opdkFi47Ieo+X5iBcP5Nir7Z5XnPS9fqi9psrSuUellKOc9kvKNhTLKSg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g2Ogh/Y5E59Gqy0SRh3q+QKx8BGVDqh7WfJwzXq29HdJl5np6YsNGgXki046dtIYXM7Vk6YqhbVWpWlx5D/jhw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fxllR6psdh00kEGZ13C9GbUK0Ef763WPehcu0Cw3nGtHQMEnFJ0baEOT+exnK2rMPsDSlzRV3GeWc9D5Y5hpnQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Jk87FQTiUyvACAZ+LXzQSym4xFBwjT7dEmlXCfrKoc4Gfulki9zLJCPpYtTdAsB+d5VdkEab3Ywx1WECm0Rgxw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RszGJc/GTwskYskc82z9WfRUfdmMT1EXnBBa+lbhuQ4SkgiFx6EOJ4R66i5xQI0vjccEkufBvsX58LYnhKiiyQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G+7GSHxC1vZePPrygv70woPAyfm1B0A6QSGEYqzsuFVrYQjc+VpnQcZRxujJK45wdEA8gJljp6nEUIoe2fvX5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OO7U2vDRqdsXYGH97YoH9B90ZvpcknnSYgkqDV0h5RZea0Ot1MDC26QlSuT7K+ue0baNFqJcHEXT1YjZaMcbaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y0/pWqx4XTKb4JVmh0gfBQffJ31hYcE4GlolQot5/qpJ+0IivG9G3lrfhbbEl/6heNFpPMKDg45OfVHTt5Nx5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G+7GSHxC1vZePPrygv70woPAyfm1B0A6QSGEYqzsuFVrYQjc+VpnQcZRxujJK45wdEA8gJljp6nEUIoe2fvX5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OO7U2vDRqdsXYGH97YoH9B90ZvpcknnSYgkqDV0h5RZea0Ot1MDC26QlSuT7K+ue0baNFqJcHEXT1YjZaMcbaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y0/pWqx4XTKb4JVmh0gfBQffJ31hYcE4GlolQot5/qpJ+0IivG9G3lrfhbbEl/6heNFpPMKDg45OfVHTt5Nx5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G+7GSHxC1vZePPrygv70woPAyfm1B0A6QSGEYqzsuFVrYQjc+VpnQcZRxujJK45wdEA8gJljp6nEUIoe2fvX5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OO7U2vDRqdsXYGH97YoH9B90ZvpcknnSYgkqDV0h5RZea0Ot1MDC26QlSuT7K+ue0baNFqJcHEXT1YjZaMcbaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y0/pWqx4XTKb4JVmh0gfBQffJ31hYcE4GlolQot5/qpJ+0IivG9G3lrfhbbEl/6heNFpPMKDg45OfVHTt5Nx5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5yV/dtQhLn6TpQlYVtE/zKo128dU0yQUf2JX05RvLqMy1/dbHmogOtjyOeJbQ/a+M+Wei2dNCNBA+92tVYQgqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5HsVSrJFSVrvvaY7PR3ixMRXsFKqzHfSxFa0nNfIYsMMtdFSB20+/246yCxBa0iZ7H/f1MUHf5Dzuf6G1f8b+Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"phtNWuw+s6rlNwVt+PgyXTrg6l5QLytx7A99mWlFHdlXhJL4kT/E9iSGoutU5nmVGqVI3T3Obc3xqaPT+bwXfg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"aAMaFvYTgfSBuYdQERL3b9Xb4y6DLfKf84wtfL2tPRV/xjdXpuj0KjqJw8whNopkCdOGwP3J+xxlaenyfn1vSw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sy7aCwhwl53QGymG4qlTarx+z2YHt4nXhRTBuAcWdOhF07Ij0G908kNJjOLRO5ppCXoVdpGgYqpE79xcPYKrbg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rpKHlFQBR86UZnlEIb/JUNuzYLbwpF9cGl83jhh7j+sAC1Tg5OFW1aBqxfRscgFKuv2CCQzyUo3mltKsZuhkeg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GUka0bGpN9vw5UjP5hLNkNF3AhMj7opdkFi47Ieo+X5iBcP5Nir7Z5XnPS9fqi9psrSuUellKOc9kvKNhTLKSg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g2Ogh/Y5E59Gqy0SRh3q+QKx8BGVDqh7WfJwzXq29HdJl5np6YsNGgXki046dtIYXM7Vk6YqhbVWpWlx5D/jhw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fxllR6psdh00kEGZ13C9GbUK0Ef763WPehcu0Cw3nGtHQMEnFJ0baEOT+exnK2rMPsDSlzRV3GeWc9D5Y5hpnQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Jk87FQTiUyvACAZ+LXzQSym4xFBwjT7dEmlXCfrKoc4Gfulki9zLJCPpYtTdAsB+d5VdkEab3Ywx1WECm0Rgxw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RszGJc/GTwskYskc82z9WfRUfdmMT1EXnBBa+lbhuQ4SkgiFx6EOJ4R66i5xQI0vjccEkufBvsX58LYnhKiiyQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AmnwZ3Grd2QW962s+rEn2QvuwFWhhFC3k8e6k+Lpq6hJOVqgbGWXGtPemqSHwmML62Za8Hyzcao9Y4zuXM8JCQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qTF3punEcwvO68Sd3WkL3bq2LYi47P0SJJUwi0gdsr9jYV1LcJLfDV6eTLRD+AuX4uKgi1ZZ3/UNxYjaFRigLg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"V+qs5vyCMaGRN+TxNYqX79rypwMK4oypWzFZog0zaIZhjcUpVL/iA5OpTIsNrI5U7X9b04dfDcrC/Vm3hXHzgQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0K9XFITRAZscBYnBZcuQ5o3kT954xWmHuOiQUoAxuMJsUSX6CblwCm7YE8j5ELDvE8STnvKC40K17ohGu0iylA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"elgK/N388Iz5oKDzZr4t0dmeBaamC4VtBPzMHFYz47hNFvqHsHgJuL3lEtTQw0HqCOmDqlo96PIMrq/xL1JNeA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g125vkahf7cxz0n6q8mtz72lrvhek6kmln4hxhku","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3ar9JOFHl2V3GgQuniZVGmhw7a1+/ef/pbyVuY39S4MWa+Strl7pAvudXfFzQUly+DHFLPeZCbKIKoaPFEP5nw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qGV+uH7f3tTjf4VArb1QF6YX67Yak7wU0MmT+U8zR0M6e8LJUfqufu1Ed8lAv7oQ148sTBHm7lG9BA0sBPT/hw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1mG5XOwHMust28kEm3mU5xzlTNeuJxEI+RA9vXMY5LQ+7QKHH35Jr2MbeW/40vVk82bWtxdFX4a/Cw+D142gqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"kRBCjz7SITeivFCjgohy0TzMjqmPbXOAdacH/frLPbItHCaaTfF/tIWQUP3F9HYh8EG2c5SPgocLKIIyGDNkXQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"xxvYsUyp3A1KK4xIchgEBHsX6QVAf3Lqk7uQSwj8vZAayELv25Jo/enGiXzyopH0bXyuKlGjfdcHKR5dQ8VfoA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qGsJYQgoLimEZzLKR2BmxQx9fxl6v34tQRITkUrtPP9jiYcHUUZuMQmHlzkhE29JJh1bCdm6QAkc2aBOdLasNQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"C2KNw9POqmtvQyAXaYkjQQHq1a/iRr5Eu88HdwxF8KEzIedIpAuOlyBgGwHkFwIkLYIpPVhR8cJXoHzLsV3w0w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"git0TH08GJKUkdmOH1EHjlcpBFDgOBgqikHZNPTh/ktORDUoO3izV7WKK6TZTy8OxFDUkbC14sb3W9M8M/GQ1Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fYL42+rtkVaR4A+Ecp8sud6vaYKciPf+EeRcDOUfldErs1lCToaCfZjxs4DJ9J+iMcIjyg1cczuRr2EjviVo8Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"MRBFuxxpHJKm7Ua4WhGZiukEHi3j3F4CmXk72CKVuXlwQogd8Av0g4ji9S/2L0ZH+5z6c9s0ap+7vBYzE4G7SA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"B8ieqH3XjzVqB4no0OQDCO66Bqs0+LQD6AYba+oYmy05OVyxX7xwszootmv5eYMSUt2USWN8Shf3HN9NtGLoMA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5MOLSFMZ+PxHoR2y6rwrFxmYle57dtILpWY4n364JiNgQA5yKkpjQ223Srufb3yJfTrqPtshw/AYf6eYraKEXg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"TQIr0tLmfAvldbLdDnZHnI/Stxnxj5Ha8XJFHg9MKBpd80W9A7n5IKsxwn+gGAvOrZWE969vmYLAYx2qPpjR4Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g7pC5xf9HvIZeyO82aJzbqnMXXu7cC30bkJ3h90n96VVUL2Vs3m7hGYq64GolwQLkLYCy4BoqI0K1KmWgKnfJw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"b2dNMfD+K2Un28ji+Kegt7t8uVXvASPh+KjcRT4NHHMLJXCevBmYCvISIpxRYnXZrd3eU7Z3/Ui6inIP7N8RdA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"S0gWccFnm8zInib2yPeMOAS88+xh22BZya0HhikfYNMrkHFPHt0seGW+KTIuaWAUiT79gYYViFdBRnaBvYnr1A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RxXliVI+xdd8IXpvBtrhOOR4CfjeFqcFAzu5U04wG4QEv9J6QMzdCUYS0fabGbizUg0YIbxjduJpsbgFb29w1Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"wE4jDZd9BoDYT2Hrre6Go9Evu07/Y/ylQE90p/f9961pJdE1VWGIVKa9e6cd3V0WhyEiCDUvgMrwksMkDSUGOA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3ZzJTYMP9kyHozVzuoZqiKZp257HaTcp71hiel+FxxEL2cC6j24v1TssBoqwUARYEHkek6yj1WAY4BCYOtA4HA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1JArJ2bOzc6Im5SDgNjDsqrF/N0KCLz558ntuub/pXNuSWt6gFsFir4Eerg27tCvV7zugZWz3HLn+ErAq4Khaw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"32oPuVz4U2LnUF+wUgmEog8LVSR64r1vdzjbylfDdZ0KCppQFyo172eglV9rs8SYl7z6qM+qt2inUWv1N6lHhw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"i3aH29nsx2BoRynHURfBnHv61NNC0uILP2n2A0t1hb9NOfNyiIaMbQS9ETrN++NjuLfXyxngi3IYRF5KoMn/Vw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Pz9ao+RnNprgUh5dTOFfwQR5jdQQYrMZTqLUMWJaBoci/jNujl9UjySXNIc2TQepTydtSpRM5uJ/i0AgwhqoFg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"MlzY0Q3IX2ngoI4OvP0QgkotoyYAWSKxeMU5gTRSde5YgezoQ6fKwrAiQLbfy+7WoCbvU7nGRMHVS2K7akyjrw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"useHxyDXK73e0vvkiWDmU97QH8+Gr6HBlMj2sFx44OUq4PFWAyTIFTzr4QpYBDeUjy1ee3K9zZJg/Ianifv/dA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"DUQ7Cs76HHQ6J5XqyMDf1oCufOMtfboZWG4Rh2QAayMohxQAHzOnYp9PoB/J48SsJ8A0oL006IvZIvyAZ5dL8w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9bkNRN9vkR2cUl1WAIWcfv3pdasg5IKeGCl8QgrZVgJyHLnkcS1Lef02X3do1rlMui0RvtVRR2ytwb06ASS+UA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"BnCMNzUTpTJp0S1e37t3f8iHMTG4XzsP2RRBHwahkbcDqkLICPEpSiTVGCX4QNx6cBAz3iziRarVJ5xptyitxQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qp0FSC+cM7IB97Qg8d9r2JRuUhjmDjTk4L3R0DJVi2MXbz4uLfq3su98EUx6B4RR42Tg+rmJVYfGUZyzMLdLHA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"CXBKJuKxHBysTXgegvOLbc3dBTUqJFl5epQkGZjtfSNX/77i8UoYqeqyymTEaCYif/gkxjx1gYds8FfI8gyOcQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3G2uA8tHcb8LMk9rSOqrSx7bmXAJqRpgR4qTxwXny14ecYHLrZYoN6ol7YYAcOgrgFjIEYn7YD8Tg+g77d/5Lw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"d6ZnqzlgPJwIxh9lesfGStq4zP8wgRinGwgRvLpxCSlMYmydxBcgSqiRGhoaYQdN6D3esRBX090t3R1K1J4O9Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"v9SiD7vZsgjiww5M9RoDgyqXS9a54OPeldsk+igGOX4WVNerR2gdcfTewJFtz6r0+sMzxUM3y0TCClSJppZHjw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"/tWgpynW1EbDE2200qHkRdAyOXNtJOIr9AZ9JvJQ0HNi+Ap7FNuqqwZsFscX9cgg71b5XIon2c9zws1u29e2Nw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"XZFlkN9x7Ni7ZZ+h7FhmmH3VCok1E7ZqIYCrK5r+aoh9+hMMHfucBz/69Sr3MAGj6e7yTjT1NT0Ol6GZlv3LWQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3Z4tpmdimv5cGEsCfhDxHunUcYm2GF2sYjLbva34AQgzDyn45uRG7qcRBQkgK9FaKNU7jiOJdhOEBaS4rwRLrg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"BFWKchFXQz8ctgj9RvJ1bhL3+UWRIC0P9h9SLUFN7QgOppSDXqnx8bRCxz9BfVPUpmhGhfuQE8QhID7yEG0tdQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RIQIgtR6jKCENISFZsF21Bauz6CR42iH8vVMv6jzdw5afK9BUZiq8LqRYPSlAPcyuGGeXqw1vRJ8iGYsfqJbmw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"4h5TBDJnLq4tLniJPxb5KQ2PvIzlrI7mBCu9+t8DvyYD2ngRmCJiYV8O+ptoBJ9Zi+g15jIcexcjWm5wwFIOrA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"VUo1jZTWpjnxUPKUgUoFejFFyQKNOGgy9K6I2P3C0SMXJs7vPxoocZs1bXqSgcFMD1PaXBQHrg0MAOJrCEeERw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"u3a4toTRtd332a8s1Cwerjf9PNHMZi4qiGfbWscV1dR0wXYafjEAxj1+g+5FV5bvkJV2taNPYHUl7woLdBSrSw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"gMkg6yr9NUL+S217dJx7iDOTqQBeltTRdNr7wf2iDhRG4qjEJsKVpPTb48qX2jCjT9sgKcGDe209MlTYUf0aQQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9iG2FVmi9beSwiK9KGAp7Kj0EgEW3f+TO+hYSllTRiwvD2OsPxNzgMFzK8VdmkY7bNQco5wqct8AWBAeB7UdyQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"bJDj7aD4/A7LTvX6Qz6rcUFfs9hPvj2LJtFLWHnPFog8OhUIKFjI2wcWyZFBpkHYJyQKjOZHO92x2EUeLowpLQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sLwNlaapwQpDWgRD3Hu2H/7X2X4+mDOfgkJ1UBtEux8YN35V8IdsH/xM+VGEg6SPjviqHvj9OsKH17A2t96tdA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qq4+mzEVRra7WDJM70tseZD2pxmDHO3rfQw5GOG7Tp9DQh+avmmrdg1gDv0e18AIJXia5Yr5+eyBCHILLOevvA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fnRP/XezHy2AJlON5yLdeOjYCQdyw8rZxWzqP4Li4KsVhFmlSCV0UfOC1mtoGGOvQDWHsmuQHZuhxyvLDybjTQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"zYYhSOMW75A9eMBI2xWPc6gTK7E5KozSB98e7GbD6y5zJZRZjFpDpBFG+ZRwd1h3/wqvhV024y2nj/IqJv0G+g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"bm5heK5sEuPDNPPP6FAjVYI7BtRCINPCssNM1VUYBGU/BeZXz5jXUh6ZnrMMV/62Q4zICyDt81X6XpqcUt7FVg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fpE7Q9GFmS4+eKYvSm/5NZLs/RqWOktCq+YApAe4bn0azu0KF7BNy+cUIrD50pft58qi1mJdJET+tpbPMttIug=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"KQkgb8fWyOsTCNkibpd2OZS6YvV0BpGOxbKY9F9jrCpAQXqYhMjMpoXhgysh41ggL9yozJYMniDrZ07i86XhKw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ED7DClAGLfxTF06GgsvDutUWefXfKRbjDq9KPDtzutlYAugvIvg1HeTi3PYQJ5KHjouoyN9YV6z/XCXGED8zOw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qJr2gOmXpb9Q8dkhzXmcS38qSN0v1snbx1K1i6+s+m11tCbHhlhNqAg3v36rh177DsKqUPt2t0D2kX5MKUlHyA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"SP+rp9OqDQXQSwTklSedH5EmibQr4s0ciOTpYdcrm6dXyAw8HkEgX91vvAf7L7O6w3DljhItK/f+FuRVDnLjOg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"EqoaeTzRujnOM07rgs8R2ZGicLCwS3TlfbbyEvmWrzUX+iraMCFHU2vvvLwdZ1YZVY/lQNpq9NomCbiDkj7v2g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"IFe0f5HNzttK7wx5AWJjN9DPz2aW/qYN6ZH51z2Eqa9bOEEtakK41n4ZTyTIkUTS46q+awxScSyrPHAVrAFU2g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"7HXbPGQrkPNCtCFOuawp0H3ad955S8/emDiPHhtHUDVXMCp+JV2g/LtRxvg1BPI8Ngc9szMpRsbt6g2NrvEoTA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"oEW4n3ZvcNVze4gQei3naLH9Cn2FblcINg+UxVSK3QZoVGHWoI2yq5m9uHfqvBilEpZgrirdjaFUQgajakRNgQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sYNlCyRT3Zgg1J1LVbAJ4WcNdngacTweMTT3C89+nBAwHk1z/Vaesgt+wIGevmBCx8Sn029klEyWZwGloYlcFA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sUENkLrtwC7HCQpxubvCDgEmvPldpHYB+UMWkcIN2p4iygsAFbsduR6iVv9eJBF5rV5QDNNjeOw/jN/bMElhJA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AZYEa2wlLhPftKCbOrt9BGSg3bT8NEEeJkx/4izWygl01qovuvY2v4uY08LV3r53x3i5+YNRBfUMBRJxUio1UQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y1X6kSZB30xecpGPI8ua129FEwOlk6+eZRJ41v8R+497m7lkMK1204y2tcciHw3Ca/SQXVZ0DIItS4a52a8ISg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"iXdBKO7yY0XQWwik+30TcY4G+PH/D6SXRXrFSDPmYnQ29NckX0MO+eoLNbFLA+4kFwd1QzJcGcQV93HsKnwD7w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"UAqfYxpI4lzzuOXk6nRYwrRgfm3zYaaP0/lyDeY+RhkjRzp1NNvT6Jw2+WlVBloYAmPsCGHl+ZlvPwHSaU6ZZA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"NcUNsXGOJhdTELVaCF3P3EbQ5DaEy6P4dxPmT/gRTdcVoZytMrVRwkRu1q14VJ5Qh7n/D6XQyg4ldprT8bAzFQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"snnLpuA72vK9FwZZIwCEi8MdJob1qZUbrJMbP3hAWYgFeNNOvlli3ZPisYNpb04uKJoJCLaOO9tJlMWfnk0M5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"zG0ikhc5N8W5OD2LwBMmzNUVu+YwIA/G2HFNws+s3twD70hC3zweKqPnHR4fX5gbMiyhc34WmpmYe0tF6nJxPA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AfEBUIp7mcugkORTTSh3AKTsy/o5vTdKbX9IJtzgwBEIODY9sdpOGD4fgACiXTix6HtdAyj3I/Psoed0b8iHZQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"LNd3Vb4Ry6Y1PDRYNNJzq2/9rmmqEftkaM2/jdfLc3RkIN34Y/1hzhirl7uQIssvqCZKv8zxkFzwQLsczVwD5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8HiQVTtN5J02mzgVQgeyLWUj50Av1aFNOGS7tRTvAhZOTGLRmvpjAl6BcuDQcF2+57A4l0yDeMUxkmkMCgOgGA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"wDJ0E4UVu5G/7u57wCC5VhIFJcK6S9V5IE0snse4fOhDA1CD9f6D0ej+Xz6vrnUuHHQzwOFJfowGlZeTJp9tBQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"JUizEIZ8mKVrevFfgsei6X1NO3qupPoYtZmuHruF4m5c3DXsemmx0iQJETHV8+5g6kDuI1uR17PO06IB2D0EdQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Pxrf+1f4CHjRd/dJ2afqfUzWh+0QiWpVXjLRz16rPsQ9mBO8rpZD2rf7foGBaGfwwXh2J+UfEYVxUs9XxPSddQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"hjcg2iL1oq00gcY6VOzzqUliIyryP7zV+ZCe5GJtqiNsOYp3ZbN/uH9BxmXPdF7HjoouDog7zn3cKVwSxqD/Gg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"+1b4q/dD0xGeSziXmeB1njhUs4zRUv0rLZ0g9F/wBrIA9/ojyyXFjqJqrCt/pQ9IUircG+A6Wvem1kdgsNWWGQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"00mNzW4bnkR9yQv+aznbpg91vrLojXu4bftyw2stw35e88s4jC+mzUup53BqwRYE2JhZbEzLX/MP6pCI7f5EDQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"uii+/ESlkKivVYK3XteP+KjPLLsCKrIY3x/KDLmlHKUNgp4szKqL7Lk85ivuZe7BNeWQ1xTuDC6AYt+k8TFmdQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"N6KBSlh14xCm44YnGQqGNA6i9rSklrKt1T4baXa+2HkxGYW+OY1Mq8Mw5rHzXNxNo0rIKTL7pwsGb6eC+wi11Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"isOEo3/+XtoxxwWo+8mE7kEoUDqHMon69nnmH/6DUWJkvjc6yE+uEQlrInn3TZbXpCZwWNle/VEkwIeicZ98+w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","to_address":"g1pwxuhltfqxcumjmuquuue6y3f2g3f2d0rcq52x","amount":"2000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"ltrnnmkVu6oVvFVRDPVTm6ODHDNe5ZGuwW0qt8DNl540N+PHMJRk6HfU3brNstbVX8iSAO1oMM2U0wjVaBuQZw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1pwxuhltfqxcumjmuquuue6y3f2g3f2d0rcq52x","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"5000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgwpT7FkpoFZ7hw8yLsNA/iPBH9YNf5G6fhwZC7hlhzT"},"signature":"2j1se6E8JPvWZqHu40XRkcITZTFAT73VFwQjzErjjjgvGWmSlJt42RhqZrI1LrmlwRfjH1PLcUWlYH5LyNZ6bg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AwSu/QRenTswEnJwoOneDhIftuhdknQXeROhXXvvVaE+zivDnffubswHcHtCYkiJHwEHCKIRWSnY3TJ0/44pFw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1pwxuhltfqxcumjmuquuue6y3f2g3f2d0rcq52x","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"5000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgwpT7FkpoFZ7hw8yLsNA/iPBH9YNf5G6fhwZC7hlhzT"},"signature":"Sju84lKR0fb7tznygqDJA6uUgQf/M+shVPRw6W3dvP57WXkUXkRCJiA7izmjxvlLOlqW54Ris1mtmO66kwaNfA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1pwxuhltfqxcumjmuquuue6y3f2g3f2d0rcq52x","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"5000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgwpT7FkpoFZ7hw8yLsNA/iPBH9YNf5G6fhwZC7hlhzT"},"signature":"xPYIDLomO7R/oUtn/Z4zx0uOM/8PTdhNYDAA6HrtQnA8WtXQaKc4Xiy7DztsxYRpRwDL108SmGZQ3XG8yEksgg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RjecZ87c8qgLCjGhM5/SCbc3rHIM4wwAv4MZJMNCCe1Ve69dEqi0xu3ricW06vKFGr8lRwSeTxkUtb74FaQZLw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"k0qQvIU5hfR/anVjNx3RCFz4/ZcVB0y7Tc2tqEhVO5BgAcM/HExcxX3pDGJkPQ9MDL6B3f3T33vujV2yr1iLhw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"u8DTAYxhyE5InKPi2/gshQpXaeJLg/4A5Cj8CZnPhCllTUjK8dIWyKf3bXLsgSxHXVP+u/QWg5yj3CpPPR5M2Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"pKy8GGHpzH2npH2cjz1HEIRTI2Dj7vYkoGTL7za8PasdqE+xEAi/0+Y+YcVgfoECZDSD+NnX0/wkfAWzJcVMNA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"N2pRBZuF62kAi8XpguwFfrG9FsQk8TXL7wMv38fmKd98a4c+qgtWTncgrn6MxVwNhI0NTDTjnbRrFqYmG662qg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8DHo/ZpmpmA872epluy+tuINx93tc9JjFKGvKyNaQh4wQzngFjyrn719dqGQugylrbY82LnGAh+6KO/9L2YBJQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"QtKbdrurUgxjSHfjdF9BQJ5RKOPZooAfLNVLL7NzhjxsC1V4150kuWm4FneliMTV967LvH7lkzcxVXQXycW2MA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"mcNjjzTA70eQ8laQa+l3FSrJcf49jOqPye1YLbN92+tEUnI0p+Ss9JgtOaIVOSaNscPAtu3L0LiFCCE4oOWwCQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3Z2eUkRzxMIXdvamfAO5qilrDJoJLHyf5mqiHk91wc8z/VAIZ3jDDnFXsS6UExPWRT0d7K951EiOXctrQSiOCQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9V37tjLnKacCWRLS7kF/nWq2MuUPhYXKzGjlA1OTVnJB+UNab6ZkccXVh6W0pCYo8jfwidyYX3M0gSF0QUgwfA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"w0OPAC4O1cOrU4/3BfKMvfY1buwku9Tg81vUf8d8flBeovgMVRKgM4wEhR+A4qYjR6DAnvcikAgVY0wdR1Uj7g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9RUxXTDdolYiEyfih6BWF8COn4xs7+KJiuEt71ACMG0OaZhwEYy/V3NSPFJSuLl7XCWBttGJ/4+k0SDBfqu+iA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"E3KBU8CiVGvJOvZIHv1BQmO1IMKDp89U/TGr5gyq/P9peaYrnQZA/qFqywHBqgzuYXRHe3zE7XruRIMhTsF+3Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"pGrD149Edxh5LGkdVCJQfLLpbwu4Y9BOHoyjcfJSu/I6gTprgnVLPvLArs3pOHVKFdm5BIjJGlG6cax2MqhE/g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"dsvtdwBSN9cODHOOsSvdKK7Mdy1PCLq81QYOzn0mjPMBhOXFz7eij5AKKbBdRcouD61G4v5bWNPgk31BC2vMsw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3PK5n23LSAsTm0cxEaHGeNkp9UyxRxcH4R0zWuSOZ7xKpQ5T+EIukgKYqAq+kfxLnK5aG9fGgPg9aQfAO3K8Hw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"QA87rqHxHI+sMhSffPpo13gSi+rkg1ZZZ66Rb1KsHu86NtoQJrrzuGyBis0umn1Hm0nWEb44QZUUYcK3B0s2kQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"De/APSclHPXQBIs0w35iJZc3CvitGZYzOHpF8ImFOol6CjvEbDHRjPEfRcZOo2claePQoy8C4VBjCZubl4YgXw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OjnzZiLFQo/HmpJXJX/Qu/9c5lUTX4SlrCFAvPDI6yIGBSIIxj3DCDkVl18HTyLe36BvtFmegVhoQI7MHphWEw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1OL+LYu2DpS2Pxy0IXJ8TOzT1BCKD6sME2aD3V8DXCdZeYah+bMulsxSQBEVPAvkLDyw/HMO/wCVuq4X/BbRJw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"S1vq5Vr3Bm/tQqT0jfVu1ZaFOwPBPmGSUOW/juW5zQ8Ia/FkHmd9JGvo7mMvQIQFWr4QDZu0xu3IOponuNhjRw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9Ur7+4U9lER2+mtp4PNCJjjlXWz1SMNdFxjW4H0ldLtx7R/NieszjFs/3YCLo8PoO3zFK9fE/E7pnyH3mcGqSA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AVCaaTvHHHkAgnqtAvT2aV4yMZqcbMOGTKWeO9TJ1iBw5zszZW4APbiZK2x+M3ZK/UemlS2wM6KM99lXN2OJXQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GKpHdN4bbs63YemrNxavHYxHpH9Ty9YJvjmtlANBQg0LxF49JC/tNnYC+fPv24x1amHxgWC9a4RWv/BaXURzkQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"kBChAErHeRs0RpQX+jmdVZS13LvNncl5sGpsxptIxHZK2F6pydJOOyf/2kGAit5m6LuFGG/9HNf4SlWHU44hMw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3Zu5PhBz84diRvOXtGhXht5dFB+j8+5RnhlaBCUkvLNoM7RrYzGqyQLyBfJB7uI7RuFddQPSVUeAQFsc0vinbg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"2rEHJdnVX6JRe1JYV8pl/+rfd5xjON6YFBgm75LFQgUlwAFrskLRqGOY53i4y+k0M0KIn4CZIIXRTgmPzXRABQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"kyIR73xgZgQ4ekV82hGLR65nG62rKwPVp8iKJ8AdspNhMPXNfebYoN6UPYcqLEnoAgnZ1lOfGRykPLLWt9b7dw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"6sDxy+LXKttd77/yvPasxealeAkY22kZ3GaKNp9fhhQJNXQRKIAxEsn1S19VVvHxnQijt1QIWYrnHGB5xGNYOA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"blzDNRE2hDkcRevMzDHFfY+o6Dl2ziQA0v6C7zJSZU49xdA8taq7wubP1Avp321Btm/bnKlLm4qaTN81seh45w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"vM3yzOUKUKM2XUIJP59CooGNglgh0aHGioKQP5R5TZBu7sSA2gclL2/9YTld16Kqq+Ck6mSzJABc4v2xVpBY5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"uPFhWVJenzowHVehgIpD6beNoK7rCsx848/1z15AG+c8JOM3ewr/egAomlSgp15EuCc6rhTS3W9Lj2VRNM3XAQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"UPUK5P93f9NUGuVDdPeBuqZw952yIvBoESCQ5U1oKGpXAuAzAZPLziF8+A34m+RYAri/121EAuii4RtskFvYyg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"pT0Ykug8aEWTzpSxxTp94aZkPm/f+B53QwzoeqFjxcw6RuwmYxI8uI3x60l6j/3yCISnGpouyQjGi3U5GxRoVA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fo0wfez7FTFBz8Mec9QuBpmY9dwYp/kEJgR3sbVcwJ0OUhaGcb1y0ALXSNOmjNQzXMvrOkDPHdlqTrayyyA4nQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"yTC3QfzxUgsHPCDcutdOOB6oI7KHZbF63E+U3Ic4kMU03QHH6chN/GJxvQIDtXcXuInQQs3/b5Mo3/hoBkFODA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ql4x03n0R9UZK3raj5A9SsdfKyG0ZmMqoecwmyZgaB9KngxIY6f9QWT/kNfYhD1S8rK+vnAczSVU1hLOV/OPyw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"/Xa9dOx/0chJCVudMF8Jy86A94O5KpxgL60438P/odk3WoY3jBTPk5JyPVgDsqIi1ANhKzcVd2hYdFK/Pt5OwQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"HKx6Ly4HuCkr566ISzgbAoF4tDVrv8AcHFm/Jb879ZJnYhB9B2agQtE8AYlEUyHy6Td/ztXHkNq+nDvKXxJq2w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"BQx5Sja+RC6+YjBoeM6W+ezr7wkA+je7oIJ6jvN4En9JYm/fIDjHofDCLrWCz3GVs+og1bcab2FxVk8svAZMzw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AbOn974OuNEvUNUHU4EDCfqPnzu2/0u4L/BVEkf647sAYJsAN7yW2Oq2xFw/g/1YZpL47JuloRqTzd6yg6YuPw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"tW2l0fGu3VqxCtTr4X2V0VlGlwRHeyZPiIeESV79VgkztSl3sox0Sf1GccsX4v/3/WS1r/9vO+9f+KQMK9dNNw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"T/mkgC+BJX2f5O3iFPtIpqwXj98xZFm5yggpuipZsAAmwGoT/dt3Ro7fAEazOFz/JLPp7MlHNdAAp+IKfgMATg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"NJQtVeOHnbjdlBVNWuN8gAiL1GgLejocYePoNjinnLxyE27g6A66AblCPrDF0Ldn+AMm/0n02YzB3SaOcead/A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5tqBMPwYi9/Cslef6S4IWiB6vi72a2G9UbqkWhKOQ+xJn+ghmAtw/BPblAeobfQVVzVH+zzPusMKBscSJK6/Zg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"M2YlevevuSOrXKAlQY0cq1M+3pANiwxpQpl5OjGpTu9nrMPpNZUzB0RXNZyRcGZPC47kfrqG+t30qunsUG6uCg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ZVaXGZcj6f18vIZp8hcVmHEjJv1fJNBWk0q9hs2nEjcVh6m6CkfVbh5qUC7ZjVbIR1kuVeDFQ0rvP/pfJXIqPg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"q3kO7mXvcWCwGH7okwHSDueyj0Z1NourM4pmS2xN9TlLP7YIL7nzUfBajMip+K5ivyMTzWUKZGusOJxKdUqFYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"/UTl6F2C3WQveP0Fvb/yTgfTr3Zyj3GmMX0hVifi/rsyUqvSGaA8qW9Km//x1B01wKHh3h1/mXZztQrOHsMvMw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"yt/SuVjYn6qBVzrrA1p7bVX7LXKT02S4jaChQOEV91AFS499O/I92DzLDzs0YLeF1w4ECzI9iAGyoq4KyPe0gw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"m+LqZrXYS0vloeA3GbT0jAimcHPypBizdQ/EV6ASi6QCM2hAg4GY+SEuax2lPyGNeRATMux8FwCaUQRInoyw5Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"+0YJBInXhS0hIS1VFImyR7oAMBV9sO1FPEM/bFTkGTEj98Wqv4TAK9NW8VrhmtWxIGukMVs5+AOHCXl9lqKxyQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"7giFg2ASK1zjgZcBfhYRy3oZG5ly5s1P8fCUTPtDm9JmBm1jrd2kk/OkXPhWg7F7Mnc4MWTzwj3gss5BDBctsw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"dh2iqeZp5y9gbmlEz6Yau0d3F9ince8VCaZwdU6I+iNVekx2+EZTz8ru84LbC/ESF7GcnINVXhL+XaQeSewmrQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"WeNd5wAv8vIBykdZ3ozCIiq6i94ZKMSjFZqtfMmhni1JgKlQb+fQmPHkWNtTp0flfXnRmILRGr+FEpEUpu+WYw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OsyBbrSjP7vA4UDOzTLu4K0VR3hBt7axwsyNKib+hjlbwEXe9AJr1+XaqCZgA2gREqx85T68GTZvMQE414qLKQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"nAYPFJY0Kr34z9slmNDFU1e3yyzcDWxB4k94O3kJgk05fxGqHOQo8Dx8fm5Nbf0Y2mkzVkL2Q+ElaIueFIBREw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"R2or6aRCuCsYElo+KKN9W7HgM6Z661tWSrVTSIXXYo0ODIIvOoo/EPTgd3lzo9LgHFdHgeVDgPhiVVsSpoIytQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"7B8pdPimCrgroSQG5YjZR5OzG0GHb29nv9YBiG+xkP08gyC7KzOZP+CQoqxXfuq9Sm+4wLydLOz9rv0n3RIMMA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"gh+jovaXF4dQ8DVB5Q6WG7r3vnJhhwfPVaHedNPUxA02ows0waRLQsw8XmV1DTEogLJMm445+6VdZVchJjLXDw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qGkExeXBBtAH3SUBmvCWuMf9y1xM62Hmzf5KNjKpSOoVlBiPIzbmmuf7rkWrnzDv2eT660Y8UcIcu9dpJgZgtg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"FJ4w4byTndnZ7889c+6ML8wTsicIi1/0E3BkX6GWuG1Kwmh4oB2doedb15kP8rq1FvvItXsDW7vkUk4JviO1ug=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"q+chST11GKkzn6zpN84tSxhrJCIhuVcPraX5zJ9hW/VXf73ZF2npa0/T4u3GP+9/Fxn5DaM5CaBMhdwcDN1i6w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qNmm8VEdls5qwsJYKvT27hy6SMlEveDbtoBjXydmlZ9Sl4Sl8TnMRR3I6WFZv4Gsr8td4OiAl2Yp1Zb1wwPPyw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"hsf1hJCPGaV73xFlmlvroUKj0Ivzxln+OK4IVRPlZug1MROl1Py5pW0qlTHDHxJEoyTk7UWYztvreC9cANiSIQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1fyAihlFDsgF27y60Bi7CxpHu9pPbNSYpJlZGNJ4Ba97r5FXB559FABQ3CatL3RetlYuyUI0LaQ01DiVces1Cw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GtZN4c/Opo0gFT6iTk7deVqnw0q8tB4jtVdZKcTRHiRbDHdmPQygyPXGFet5Bl7/35ExvYXsOoL8qqHb4Tr+vQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"uuXPljD8p1JvdWVglN6cvFrTIfNNZ+0aB7uwC4nHwel5VtYlcJGVkgq4UydwBt6BVIoRc1eQxlzC+ahWQSUa/g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3Mm6wFDa+NUqbf2kUC8C7n25RaJkBhu+ENsFO/IIRB1vCRp/FUzwnNMh5xhinet7usPQt0CvK6oXUUXrMtk7ZQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"o48YCcrWxl4qq8X9yzMZZGbViSI934Eo36EDv51uZjt3KsJIqd+7Cm8G2/GUmyasN3LtMIRzLHBsc5Qo0xgn2w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9KTf9Q2ofRrmgruAusPsxB7+lKYcuFwZjVbhad8MDQFRrr3K9h6GflIjMlhP9uCoH+CxQom8vK2A5weqYFA14Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"SgeTrXZ1dA3M47NENlHram8mhfQgLsqqc/H5jcJwHwILDkMSnmt0zSu+OU+Dj7Vok8crEcU/kkkk6TNv4zA7xw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Yt3SaxIADZ9jFqAWOoYajGYA4xS5FF56iUR4rE0ju7ZvsDqhYHK5RYGTBr3K2NcQYeizvE7jnjUTKOaZ5SgU8A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"q4Kqt7+n+zO+rgIPZ+fIx817YvyCvroUFi19KQJgrZtrHEneV0ELU4ST9SO+xefPgndFruuwsC7Zlqy/7T44+A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"YaJFdfaKFD8z8M4CPZXMaEVRXhqm96HgOaCl+W26ILZT0ln52xb99M8EElIkafpUKCbNMq+g7MzM+Q8bjGQQxQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"zseLGUKAfIYQ/BizpBN50/dDgWe6n4JSesXgJ5tTjP0E1XZv90taSJmAXnvHytek2Ji19LRqHmKa2+yvQrpsLA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"HpSSfsuX/A7mR9Zv+AXCTgliawks+1eaAzbMcfMY+Kd3lrk8fyxlvAScOEyItAbs43ts5IqDh/zASGXjBvL1KA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qeM5rkGmtpz8oeaFgJKTBWKif5/CIB4BGFCNopWmzZQ+8+EDYvJ1gJShN0hyhId8/rB0lTsyCJ++7RbsPc2gCQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"mp7Z3tz/cMOP6bS9iG+nDR1C3pHjSU5ItZMkM52EI3wduswQkX1AkufddWe2oCo5XrW+bhTR02NTZqatxASQkw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"kexhT+h5Me/U3z144ynQ+8tsnAvYbBM3DFw1BxvvaIQXh9IsBKXxdjOW36Efu2ACPTdHDxI2qXSshjeKDcyUoQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"wC0CIgVuOYU6mxEEE3vVExPxTfSL9h/zhf4T8VGwMtsuU6xCWjMsMnzs8PTtW4l4fpRIGz/89RV5KaZODtUvgw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OxAEBVqU/BvOXdSDALdttMV2Fhjdmg6mOlJaEKe51mtBiojZd0zdJt3CmMbBPIfognDvHAz5dPUo7NgOYEvp5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"MRB/FMHGfLeGhxj4RBKcRhFhjWsc0WxupIeozFTHOUN5X1CZbnkvdIRelsZKIRBYR8TBgBDd4BdiWb9qt2YaDw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3mjf6wZuRijeIzfzPZeDIIF3BwgYpj6nBSjhWbumfjUwnoRXU0dA7QjdIsJQITKidsALMopxi44ceMEhSXcsWA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"cAV0zf0ELGgN3+ETG8PZ+XoOxiBTGHpZ9waTBfPRSwZ3jvaqbHIfDe5IS6f+eA45UGIWBOK/IiV+Gc0TEYpgAg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Vt6mJGZ7QM54jcLhoEIH5QUnu7UgWINo9Wfp0jrjlJR+fm5d+GnPO7F81zHQLphBwE04Y962TBDG6f7XBD3i/A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Mcw87yCRophOiFw90Hg84BPAOpcSzYuevXyC0g8jzj89B+kL8EJKz23xYQo/2U8vewPfwfhLXAhIVeLEsDXmzw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"gY0TlnU0ELvkbLqlDP1ApXU3zN9U23OGeWNZrsxef4tMRfggdjmEWeW4EcuxbTsjMAVfpoAhqkU9M0T5NwkxQg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"c9CE2heRjTBcJQzX7YvZye504EpAAC+ueIrEi6ZTB8F9HBFWjDlADqCYofSePsPgy4ArxR2Nod9xyTp128m8ag=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"JPekBL7qrSZly4ruCebDy9UtekK3uCtDYmDnQ6/czPgzR/i4lAom9NPXrCI41U8ttb45o4qSzb8ttjongdLL7Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"uMqlSENnoULd4XOcZOhDWZbg3EQXW4Ln/qO6DPRGo+MJ7vrje47NRgxzOyQpMxj83JwUEpnSF5IhIaZyVhDAzg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5FSkD8j10hlZEABXYlPID6g56fsgr1ZHl6JKmLYVQOYLTc244bsZ527IFEKpws/ImbSAKc7KVG04NG54IhTffQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"a7gxHZatXrDW6nZou5Wq3UzuYbH2BfA8i7ltD0rFVpE/NKawNkk/5mqtO2zHGSMFYViMKt873hUP88rISpVxxg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"12Tvy62XADJvwShsCARAs861NJy49EDmOkmjx/WOxggf4n7MmogOdBhpX3GbHAaQCIKdeY1qtL3Qt8/+EXVKVw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"UOZ9Qw7tbDIBp9euQ3r6KDPikQA5rqMD3Igs9zyvGH9VNOTbiDKEV7PMYBlgXSyGiKSWOoZZjlVgAaL3i8q7oA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5J2Gh3oIJ/002lB32k1wUjNYND+TiAAcmLtg/P/hMmkQV7kCCI4MzGnMv23dbKvD5UM5rYHebOth25Ia9jTbiQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"FRoS/n8o+3lrOurMu4+H+emE33rNm/MCyqi91pCFBbg12icSdYCOq9f61akQNlIv1gkKpHmXeyfAvJcgnYFZBA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"t2WROlpQj8CDBh130lu3vn5YBBnZvrJsqNLa7wTorZ1BSu0m09ofmIp46O+siB3+cRR2+I7rrHbL7QZ+g+vxFg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"s9PxZV3+rgUDDSFWhAGwGKyiSCAEi3gcyf+kwNEEZgYRFRKBBIGtksKpB9jrf+WYQXhRpEcs3rOhC8XwCwhCNw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"thb6wZ6KVjxCzfMh97kVDCBNmG7EM7K6mjqUwA0v5pp+O4zJGLptELbJdcUUarA65MoyklH4XEa6gfZdNmwYuw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OIztdeLGonjPTrw6xXz7ypHFm/ZLeGWWnjFnP3Syyv50XV0CNcAKiWETTya3q9ao7DqXU4r2nEGJt07TQ84vIQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"/6r95mveograOrnitKZBMfGLmVQmNsMnkJM7DAOPa2MgzMaapwjeKzhctZPszbK37REXkHWt13dPDLDk7wZ0tg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GISuANtfNpmed85tAg+rkNzcg9acsm/uP1dzHc0HSK0PhLY+RvWiFoRN69b8CDXV4V7q+IMR9vuWlGSmECdTTQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Uyy6n65zfA1MaeZXRnaJk6KRyYnEsKMRpdqtkSCGQ2MojxrGWF1vocVmT+NXYELh08kpeprNtj//iJD5QG0QIg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"jFTb0HTaX1ti3NOhNC+a9g1wgSr/r3MN4yCoR3WLhHpIvWeqodhKoZX5twwN5jHUg956E8QgbTkLyxMln2elXA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Zd+RO93oE3SZHVX8GWr9I+t8A43qHtyWWxW1syRsgtYu3McqMFmoQMGsctBnMkEfnX+ORho+W9mgDx67FsLRYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"q++H2NjUopaLB/G1NcPeCiwfF+i5CfEEZTvdzwb4WVIDQaQmlfu4p/DKdYHm50SsbkGygy1oBKehOBYXVQbqDw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3hTqjIL8j+Me4lWU0VBH60ebiBK8au3vUKPw0vrGn91zDfUEhucCOj5UTQpdX9IzNClCfS8JKNpfjW3NRmOmWA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"i1GscxfOaOCgIwI/7M8120Q2lVYTl/mnZYQf4GkyRLAMDODyhMfZ1AbR/LNDvx2cqJ+rXu63hlR2Y9lGrWcA1Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"vYjm+eGgrZ/T9Gyv1fqnKP/ltAjGPlGNV+Vr51tYQDRq+Mzojzo3m3lcsua9KghKQwkQTsU7BRwABcnOJVi+7g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"EUaR7usI2XH56VULkny18V/CElzMMWOZ1mLiK5kODrR1QVI164sUBwQRdVtrVHTAmwEYyI7/iHWPaGgsGorglg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"jH0B6885EQ5RZXvxrgOUKf5ETMhIQWANLFzSWKsvx/pb+ph8HJZ0m4+abRxnldLYa600OKv8fGq8TGFCSRn/Ew=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"m/KbKvN7iTI6YkniwDEp+EKj/AF10tL81UXl/Ma2d4Mn+PbI8XbuG+aPIQps9v4f90BCbtnGrVHKLxonHFGJAA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0ujPeD3YKxw+Nk+61mbIe+8IJ94AVdK+EkKv2Iy+gs88RSNT20x9NPb+Y/hmRCLDOoPoFk7YFsFuEt+qmvwcuA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"nKYQyE+kAPM/KNBovP92RklqNUM1gP9kSunOm9KPsrMh4zTjakLYNgUSjJ1sZC71gdnQfyd5EgM26QhpzUd6tw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"BrWhvrpIrZoYRUP17uuuGG6N3Qx1ijZk5g/3qKFk9p1vOsroexfu6VQWOl3aehGLGtfVEgfVC1Rv8T1bVUL+Ig=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"MCgMN9uGCmWO+xR5JIJIa4gBzgIfWBAnzRvLRe5TZ6wrmEDgfYRUyN2MttUAyG3zxpTQgd9yFQgsNOcpKPf0oQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"odnm3aqETFdCAhOl6EJXSIM7r8Qy6ipFCoUw/clvu49RJXlIYppKbYllXqBXRWNFdtcGs7Grk6MhvzanPWvgQA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"yFykR7Q3DUd+lxws1wrOzx4OvxAh2PLwHb0xrdW710AcJQOj4iiOgFKpVVXydh9/Roc6swVhjB5xatMxxQMgcw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"pm1hBlmYT7rHVkt91HFIvSHV/8i9IYtCXPJJubDGkwAgkEcko9pwmQl1UEt7v2tfWjpS7CkfLeSR0hd/+6lwJw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"cwV2SxcrpfTJPfCVrmrIIflbTNw2C3UnfKGX4BartyIqKz+Ngr24uABmTaeNqqPcU6mbuSrK3u8Hhc1aLFXu9A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Ob48nmwgrGc/n06cnmXyepHcRycLJqz0MUf86qxSv9ovnMdE2UUxXbASQofAC55FvlxIgP/RxQEhHn8+vmHxkg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"DxqoFFhAJuDsyNfXT92jhnEZPH7p7AzofondsjF38iY8FSrQhg6Whre1EtZYVzfuoc3XEZao4znpOvrgVC2MPQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"xn4mFUPC7iHu5raGe20QhQhINacD3M17CheH+t88qewTCl7uKlP6Z0ZMNy4cNay2Yp/20k7Jv2T1Y3ML+PUsdw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"zkoRH7jfKW5xf/YE9AAY3canfRjh3GuyoYpd2b6H3eZgcVMOnRmfXIKMSMCZvPnzybwV9nM7z1iiviwIfZfJlg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9b/9ND9QaZUafgiEd8ufte/mOsRmj6lm36iKfc9bWSB1HZq5L06U6/KookOMQGBDk1TUwgTjROWuodLcCrbsHQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"iR4cUnrfCX0wjqGpUj3dRoHn/zVIw3fj9KPA0Q2iM0gV74q3nX4biCcmBGxW2MAAa59+CRKyqFYE/iLMuuWJQg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"UgQuYUzVxg9JEHksPKPQCily1H3aUEIpvq/RARdbSc5DzVQlGxiPIt90y209wfKLSCTFjOGO52T5tTqPE//STQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"R3HBV3gJ4FyjzFU5haBET6GJn/1UIeJGPOBh5rZfYsNf4x2f1N6rffF1wIMX0davnTsQSLrdI8klMnMe7C8HhA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"jIuJM92Cy8UzVDB9TF2uO8vQdRil7K0XtwjpRlGgZLRTy3a928cJjkM7GEGFgoaljhujjwnD74EK/sChgitPMA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"bpBXDWwd3yM1/aE82NZ8Zm+GbqPKCjVqffQYtDxsvlU7vGCbWjNpdLLisZ4VAhV9O8TuVdd8y0X6jO7aL80/fA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"2g4giBdO0VK+LHnbB6ExXhHVMsJgrw/tsWRMyS8+CvB4wERKgRmc11eBJxaRRvCHbQtek7G7s97YqaxAp8vNRg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0MzeEuExYPdXZ7lpg60m2gkqN+YB3P7GZ4b+OzZGNJMSc0Q8xoIxK1P1LJcabR+gihTS8891/SMOu+TpJbqwuA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"xrnCMhIMNHQvO70iK2dQs/p/zITW2jSrIC4BmEog4GEk6TPpnrF5J8+TzBiceJ2vKdW/45rYLiKWFjfy57Jt0A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"z99cqob+tLcmNzmj3Jgzx7K8QgnRgYTRme/reGa7j1ExHb3PWwIaxxRYCOSv3CD+PhceJt4FcmrCX+1ltu/JbA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rWfXMzVRx10g2BKS8vnFXk4mMC/jjpIs8v/3DqIS3gdExWMCBDQl3maqXgfo7NRarOTeEaoe9MWDEc69GpK0cw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"I10MCHdBEvG6SROmm31YEHjuuODEAjea8NFVbZwZFyxBb0ebqNWbuZS6GR6p+p3fC1JviTD+wDdUZ0o2J6xIPg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"k9EG3Oe7LggDZugUjiEwE9XTl73LKvBl0uZjv3rZB5BMxVZipVMalt4EtzzG3kM2G1qa9yX9IjDLcORBLYdilg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RIJ8K9zs2DoaUpW9QRkuMSXvtrSdPLRaVJmyibNSlkkzkbSkotYKoG1E7Uz+RcskQZgkCDLwEyWn0zlfqCswpA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rbB6dKAZpTYeVe9jTUbfq8ID67JCqxzcZ0LMYZYCkds7hT+9z0/LJdIBqSBFMGFaJo8XSsJy5snmjjN42mZRcQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"bWQlWOIWuK4gYkz0jZAFJ6w1P5zgZo66mreIGXxBnLEC92TAJ38E2zqzMeSiXUjVnAGxqWFRyWRPjkFoIyR/lQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"4RV/DyttRMHTU7Y43fmSqCfNWMy+Dud7Dn//msgYsKl8peXETz+TiqZnPz65I+u8KNwVR8hUvh0xDK8WXo+IWQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"mjLvfCXQwXcERF6jT7dk+klBi5PqzFHSDr6/Hug9esgz2OwtySUx4GlpoYu8HuNUCamHwyTw0Xt4acwALw4ysg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"UBdFkzjKF6VnZFh9weXGq/CkOKgpn8BmgnIWblQFdqEOplk1n4Pq9KnUruP5k97iJ0YkbYZOOVJMf4ALCa73YA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"xErI6CERXi2Q4agE7QpD7FLyd5ubzs810GM05/RAucg1+URtW04LxCcyv4iiy/WRrH/QPDiSjpfE+ZcqENoJMA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"LmmfQvzKTtS+8IKC+xxC7TKsS6N6exWblrnUHKw3xOVxr+NmxXfMXnW9+Oflvb439lgG8zdzGGdNNRlvtbDomw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"reFmUW3kiR1EIR+0zJgbkJ3AJNOUDE1i9ayz8NJ51lYRHqQI+KOXhmNcVvbMCUazVe2Eq4Emn4NHjCukO1AmBg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"vv/jLLrnQEYaeSwRuUDkHRLWjXK3k8B0XQEtzPUMh5JywnY6saoIlQPfo3R4Uxv4DZBHvHQSh7citTTSMpLhcw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Z0zVj1ewJLlHYAi296jdx2G2KIWlQvkcMmTT7Yxck35CNBIamDnWEsDLgE+aGkZFTCIVTAbJLjrbyDuRuYeyEQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"syXM8yLesEPBVui0A3FcZv4c+/fo/ugsAJIhu5jJTbhud4qw7EQRnVgfCO3RQaUd7RRWOMCFbYeqHYfLBuwUGg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Di/+JFeV/SgAA9nflajGC9c5XKtssK3YwxI4B9d0yVpwuAKMw2cu8IEH8GEJ84cmW5oijoyphwc6Zfx4f0ueQQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"T5+mTkyUqxns/HN5Hi2/LDsW4wP25zc9cl6oV5FQ5vYyI3ozvCfqMdOEtHTvb1GSA44lwAsMPFSOxBa98lH0OQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Wd3Cmk/ZQpWJbOiLifKRigy3X+mwj9aG2l070xn5eCoe85N5tSjkklWluocVMx1/HkQAXQczNqpQomrbdrhUzw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"xRPKZr3kYT4iqXI/fVpLFSBKYGD7OuWqhflu80L+9XhWYDlDWlff0CbuTgvbMW/r3WpHW0FuTduqery7YHqvsg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9P6iNIktJmXeuVsLEETQ/1pJdDvf5nRI0YKEtQVmh9181fKBoUXoFM0N7gnY5muAIsY0oQFMS7wjS22XyI5gxg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0qTLGHqlNllfJuZILWAviA1yE1QdB9ybPhqgjj2DVfBIr4R8QlkrNBBxTD9oz/ojNv1vpfnYrqYIWcUwOpIigQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"tCtdmOaqrRfBe/83ZOYMJ1oqM0svk98DwP4gQFapZs0ni1T2+f1/zhQCUaR5HSW8UT5ROYKJlbgKRE121a84vg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"gBh4dSg44FL8oX3yF5amUkscXoL9UCgWulhLQhQINtsSv3N1QHDEosL6AU1nkVo+/eMeJqa9zduxvGl7+z0i1A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ij3O1w7AaEFufG7pmihXoIxinPu/R8Y5sMOoQVGgIf40kgYXz6BLeuC4dQXiFRQoa9j3OOHUYxLcq9voPFievg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"o8c/gEk+o+ynttZdUsxY3VEUVDMsYlbVZCgYtDCGzTgf/CtScJwYFs00AaqFcqhIUH1AbtM6jJThuq0hOumuUg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"HaLXIVNPsjx8P3NSL0SoZz+8YNZw1LFYMANymQsHP1xWndhJpLWndPRj0lvcISfPU5jNbAW71Rd0h4+kA1ep+g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"kVijPzNE08Zcw8+lNE9ke/0sunFHz+uDjddp+69717JLcbLGMnDinHpL1j3Mecf/qQc7Yh/qtFOgDzaOZHO7EQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"wXtkrg/O0tkv2jtvL6PwzsgeAMmpxQJjGmtmvGFznDFoPbIxwOihmeswpVzFKZWomDDC0U19isVSvTu9OF8K6A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"7uugblkBbPmElZoqg8QY1bdlppf0x+VMEiYbmKbNM+No89nv3B9kCuY6FYQtTYP0b+Cl/qKTeHkEZ02by31Heg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"4KbUNYW+DDOFoyJMNtSHvzaVA8eA36Zf2lU2TpxEzLEJ+z4oq7AytkQGsqRaOCydSf3larvm98rYO4CsLZt3Tg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"PJrZYKVG4pni9SKFVCOM4uS/JQpy0qa/q2fohPpKrb1sJqbwOO9HW3WhY6Uf9a4OKnkEqn6gZC0feoUmajy7WA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Mj4nHHIK9fC8GlkRyT4KoKbvB9NYPWdqNMbXmvmAtZ5TJQ4LcEFC9Wf9GVU6N9ASMiewNvrRhDr9/XqaLxBbhg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"kp8xhWT/feNnx2XbW3MS7snjWyjTehB/viAvKOuYXglLaTUnOlZPPR6ZCbPmaRbGk2z5k0LKCVXpiz7bMv76sQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rfbkCiu0MASeLRFqRkkCdVhHRYO5v0DfUDCRDPSSGcp62g0WQ8RSRoDV1IMGzuTRbucL6Nofd9seimc74V/Bsw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"07HBT9l9gVpcFG5Hn4TBvnJ3i3tHC29bc8+fuAS2pkg7TagJcjrxKB8OY4GWbw+3UeOlqpq4PIEOKrk+XF+ryw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Py1jDIxU7WUVAFV+TdrFbriP7+ezddhl2lxvZ00bztQzYlTbo9ubJWht0e2dnvJbD0oMBO7Dn1BUXUJXAxRi6A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Z1qlsIraCHwMc/s0NGQnEk0kwJ96gToYCTi4DlZNtc1HJyYkEu//xVXMlVEXAj6xHWQTJa3BXUyKNPyi3gJHOQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Yu6+Vmhptcsgck/GDQqf0awJn0YvS91U2UN0dfNP3mJpJveukF6TLNA7lus7FytPqfWDFwGq2OpjA7ym/4qVrQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"/9RjQn5g1J75GqSrO9KyeJ1jnzB4RIRyHsrhjtmWx3cCsaRvy04G3Pr2CQeNtxyqNGcw5wMpV2gpqsUGUoDfIA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"toNacB9Fk2nNQFD+S51x3s2D7403I9aorCL0ixj8gNNCsfI6Jd1PHz/f1miBVoiRU5CDCHxEx+07D+i/LvPVsA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"pIrkm63A/P60mi1zoJfPQJJy8ShKGX+Sz0uESFj5j7ofoj9WpZyUV4jt1jKPFAUwx7jwP3wjj/A6pOcCg0pVKQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ZKpgcO4acibuT3n/S0ZGaaLjFAnRFMYd0KacpYjILuVWSCY+kCvUryV5mfabOoXcf4nC41stePPw6LtDwNVmUQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"73LH7Vyu1/8F+Vu64y3MflSK5usSwhVg0DC/DmZLKXtP7X6uoL7rqnz0+Q5biXeWliXs0SbjBp0JILyFjhiO3g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"bJWl4Ufs0G1xR8n3zmYclrvDSjPp+pZNOig+V/KmfFwVHjEAuXN2oZ0tTVFDNA57h05NJTO74fSflLXwAvYlcA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"puiY+GMY7Vn6zTz6if2uWCUUReFmH9zqJFD012SAHTYjSvntSymxV6G8HvCvPRzGae08+m6/EIj2yseGoN1/Fg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"pEDcdv6mHeNeYeeM+hVlfzwd4pYIOCyx9sEOj8Lb8cM/vn4fcPG/dgToLVPcgvG7Wwi6WomqLrvitP7FgBL8IQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"DJt4lGzxzFs2Lv1U+1sq134HL/Pk7ttjBBMq6Wqz7J8bkgKFeLscyF+XBOXBzDAl8dIyYnIgPP3g00mlQk7Wpw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G+7GSHxC1vZePPrygv70woPAyfm1B0A6QSGEYqzsuFVrYQjc+VpnQcZRxujJK45wdEA8gJljp6nEUIoe2fvX5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OO7U2vDRqdsXYGH97YoH9B90ZvpcknnSYgkqDV0h5RZea0Ot1MDC26QlSuT7K+ue0baNFqJcHEXT1YjZaMcbaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y0/pWqx4XTKb4JVmh0gfBQffJ31hYcE4GlolQot5/qpJ+0IivG9G3lrfhbbEl/6heNFpPMKDg45OfVHTt5Nx5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5yV/dtQhLn6TpQlYVtE/zKo128dU0yQUf2JX05RvLqMy1/dbHmogOtjyOeJbQ/a+M+Wei2dNCNBA+92tVYQgqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5HsVSrJFSVrvvaY7PR3ixMRXsFKqzHfSxFa0nNfIYsMMtdFSB20+/246yCxBa0iZ7H/f1MUHf5Dzuf6G1f8b+Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"phtNWuw+s6rlNwVt+PgyXTrg6l5QLytx7A99mWlFHdlXhJL4kT/E9iSGoutU5nmVGqVI3T3Obc3xqaPT+bwXfg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"aAMaFvYTgfSBuYdQERL3b9Xb4y6DLfKf84wtfL2tPRV/xjdXpuj0KjqJw8whNopkCdOGwP3J+xxlaenyfn1vSw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sy7aCwhwl53QGymG4qlTarx+z2YHt4nXhRTBuAcWdOhF07Ij0G908kNJjOLRO5ppCXoVdpGgYqpE79xcPYKrbg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rpKHlFQBR86UZnlEIb/JUNuzYLbwpF9cGl83jhh7j+sAC1Tg5OFW1aBqxfRscgFKuv2CCQzyUo3mltKsZuhkeg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GUka0bGpN9vw5UjP5hLNkNF3AhMj7opdkFi47Ieo+X5iBcP5Nir7Z5XnPS9fqi9psrSuUellKOc9kvKNhTLKSg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g2Ogh/Y5E59Gqy0SRh3q+QKx8BGVDqh7WfJwzXq29HdJl5np6YsNGgXki046dtIYXM7Vk6YqhbVWpWlx5D/jhw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fxllR6psdh00kEGZ13C9GbUK0Ef763WPehcu0Cw3nGtHQMEnFJ0baEOT+exnK2rMPsDSlzRV3GeWc9D5Y5hpnQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["gno-tokyo","Tokyo Meetup Recap: Getting to Gno Gno.land","\n\n\n[![banner](https://gnolang.github.io/blog/2024-04-15_gno-tokyo/src/thumbs/Banner.png)](https://gnolang.github.io/blog/2024-04-15_gno-tokyo/src/Banner.png)\n\n\nThis year, we're going global, connecting with various local communities in \nperson to introduce them to Gno.land and the community of Gnomes working on the\nproject. Last week, we hosted the first-ever Gno.land community meetup in Tokyo, \nJapan. Held at the [Crypto Lounge GOX](https://cryptoloungegox.com/) in the heart\nof Shinjuku City, the event drew over 20 attendees from diverse backgrounds spanning \nWeb3, development, traditional business, and fintech. This meetup marked the second\nin a series of in-person community events we're planning for this year, a followup \nto our recent local meetup in Korea with OnBloc\n[Go to Gno](https://medium.com/onbloc/go-to-gno-recap-intro-to-the-gno-stack-with-memeland-284a43d7f620),\nwhich focused on introducing Gno.land to Go developers in Seoul.\n\nThese regional meetups are intentionally designed to be small and intimate, \nfostering personal relationships and building a community of trusted Gnomes \nthat can influence the future of Gno.land. The content of these gatherings can \nrange from introducing Gno.land and its unique concepts to guiding developers on \nhow to kick start their journey with Gno. For this event in Tokyo, we covered \nthree main topics:\n\n・What is Gno.land: an introduction to the Gno language and the platform,\n\n・How the Gno.land ecosystem is developing: an overview of our contributors and applications, and how people can get involved, stay connected, and join the Gnome community,\n\n・The future of Gno.land: what's coming up this year and ideas for the future.\n\n## Introduction to Gno.land\n[![leon-presentation](https://gnolang.github.io/blog/2024-04-15_gno-tokyo/src/thumbs/leon-poc.png)](https://gnolang.github.io/blog/2024-04-15_gno-tokyo/src/leon-poc.png)\n\nLeon Hudak, Gno.land's Developer Relations Engineer, was the on-site Gnome\nrepresentative and kicked things off by introducing attendees to the project's \nunique features:\n\n・Fully Open-Source Smart-Contracting Platform: Highlighting Gno.land's commitment to transparency and accessibility,\n\n・Custom Smart-Contracting Language (Gno): Showcasing the innovative language tailored for future blockchain development, \n\n・New Consensus Protocol, Proof of Contribution: Exploring the cutting-edge protocol under development, emphasizing its role in supporting open-source, and on-chain development.\n\nAfter introducing the high-level facets of Gno.land, the presentation\ndetailed the specifics of each one, and how it is being designed to address \nproblems in both open-source development and blockchain ecosystems. \n\nSpecifically, Gno.land is addressing a large issue in regard to open-source\ndevelopment: many projects and businesses rely on open-source technology created \nby developers who often volunteer their skills and time without receiving anything\nin return for their efforts. Proof of Contribution is aimed at tackling this\nissue by being a foundation for a system which empowers contributors and rewards \nthem fairly for their work, allowing them to thrive in a sustainable ecosystem of\nvalue creation.\n\n## Our Ecosystem of Gnome Contributors\nWe spotlighted the diverse projects and contributors bolstering the Gno.land \necosystem, ranging from the [Adena Wallet](https://adena.app) and\n[Gnoscan](https://gnoscan.io) to innovative applications like Flippando. \nAdditionally, we introduced attendees to the Gno.land\n[Grants \u0026 Fund program](https://github.com/gnolang/ecosystem-fund-grants)\nand the Game of Realms initiative, demonstrating various avenues for builders to\nengage and contribute to the ecosystem's growth.\n\n## The Future of Gno.land\nIn conclusion, we guided attendees through the development and aspirations of \nGno.land, highlighting its growth from its origins to its present challenges \nwith Test4, Mainnet, and beyond. We discussed the current emphasis \non engineering and development to build a solid base the Gnomes of the future,\nunderlining the importance of Test4 — an advanced experimental testnet that \nprecedes the launch of Mainnet — and what the successful implementation of Test4 \nsignifies for our ecosystem.\n\nWe opened up the floor for questions and answers, and the topic of Proof of \nContribution sparked interest to understand its economic aspect and governance\narchitecture, as well as its comparative analysis with other popular consensus \nmechanisms.\n\n## Gnomes Go Global\n[![leon-presentation](https://gnolang.github.io/blog/2024-04-15_gno-tokyo/src/thumbs/merch.jpg)](https://gnolang.github.io/blog/2024-04-15_gno-tokyo/src/merch.jpg)\n\nAs Gno.land advances on its Road to Mainnet, we will be hosting more local\nmeetups, so you'll want to stay updated on upcoming Gno.land events by visiting \nour [Upcoming Events](https://gno.land/events) page and following us on \n[Twitter](https://twitter.com/_gnoland).\n","2024-04-15T00:00:00Z","leohhhn,michelleelen","meetup,tokyo,community"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"qjqcLCHV/M6gGbLLfB4p6nQHttRV85kecy55Ks8opbY7MAtdv2OfZl3b0mXt2QiPFEye+SmH8OQCm/br0JFbrA=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Jk87FQTiUyvACAZ+LXzQSym4xFBwjT7dEmlXCfrKoc4Gfulki9zLJCPpYtTdAsB+d5VdkEab3Ywx1WECm0Rgxw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RszGJc/GTwskYskc82z9WfRUfdmMT1EXnBBa+lbhuQ4SkgiFx6EOJ4R66i5xQI0vjccEkufBvsX58LYnhKiiyQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AmnwZ3Grd2QW962s+rEn2QvuwFWhhFC3k8e6k+Lpq6hJOVqgbGWXGtPemqSHwmML62Za8Hyzcao9Y4zuXM8JCQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qTF3punEcwvO68Sd3WkL3bq2LYi47P0SJJUwi0gdsr9jYV1LcJLfDV6eTLRD+AuX4uKgi1ZZ3/UNxYjaFRigLg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"V+qs5vyCMaGRN+TxNYqX79rypwMK4oypWzFZog0zaIZhjcUpVL/iA5OpTIsNrI5U7X9b04dfDcrC/Vm3hXHzgQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0K9XFITRAZscBYnBZcuQ5o3kT954xWmHuOiQUoAxuMJsUSX6CblwCm7YE8j5ELDvE8STnvKC40K17ohGu0iylA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"elgK/N388Iz5oKDzZr4t0dmeBaamC4VtBPzMHFYz47hNFvqHsHgJuL3lEtTQw0HqCOmDqlo96PIMrq/xL1JNeA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"pOrIun9Eu7qyQNMRBdIGDif+bSXhwkPCL+N1/5npNtsGb4xMhxpBP3yT/Lq9VmotatYExusB8zv67uyJj6EKbQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qGV+uH7f3tTjf4VArb1QF6YX67Yak7wU0MmT+U8zR0M6e8LJUfqufu1Ed8lAv7oQ148sTBHm7lG9BA0sBPT/hw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1mG5XOwHMust28kEm3mU5xzlTNeuJxEI+RA9vXMY5LQ+7QKHH35Jr2MbeW/40vVk82bWtxdFX4a/Cw+D142gqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"kRBCjz7SITeivFCjgohy0TzMjqmPbXOAdacH/frLPbItHCaaTfF/tIWQUP3F9HYh8EG2c5SPgocLKIIyGDNkXQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"xxvYsUyp3A1KK4xIchgEBHsX6QVAf3Lqk7uQSwj8vZAayELv25Jo/enGiXzyopH0bXyuKlGjfdcHKR5dQ8VfoA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qGsJYQgoLimEZzLKR2BmxQx9fxl6v34tQRITkUrtPP9jiYcHUUZuMQmHlzkhE29JJh1bCdm6QAkc2aBOdLasNQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"C2KNw9POqmtvQyAXaYkjQQHq1a/iRr5Eu88HdwxF8KEzIedIpAuOlyBgGwHkFwIkLYIpPVhR8cJXoHzLsV3w0w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"git0TH08GJKUkdmOH1EHjlcpBFDgOBgqikHZNPTh/ktORDUoO3izV7WKK6TZTy8OxFDUkbC14sb3W9M8M/GQ1Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fYL42+rtkVaR4A+Ecp8sud6vaYKciPf+EeRcDOUfldErs1lCToaCfZjxs4DJ9J+iMcIjyg1cczuRr2EjviVo8Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"MRBFuxxpHJKm7Ua4WhGZiukEHi3j3F4CmXk72CKVuXlwQogd8Av0g4ji9S/2L0ZH+5z6c9s0ap+7vBYzE4G7SA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"B8ieqH3XjzVqB4no0OQDCO66Bqs0+LQD6AYba+oYmy05OVyxX7xwszootmv5eYMSUt2USWN8Shf3HN9NtGLoMA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5MOLSFMZ+PxHoR2y6rwrFxmYle57dtILpWY4n364JiNgQA5yKkpjQ223Srufb3yJfTrqPtshw/AYf6eYraKEXg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"TQIr0tLmfAvldbLdDnZHnI/Stxnxj5Ha8XJFHg9MKBpd80W9A7n5IKsxwn+gGAvOrZWE969vmYLAYx2qPpjR4Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g7pC5xf9HvIZeyO82aJzbqnMXXu7cC30bkJ3h90n96VVUL2Vs3m7hGYq64GolwQLkLYCy4BoqI0K1KmWgKnfJw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"b2dNMfD+K2Un28ji+Kegt7t8uVXvASPh+KjcRT4NHHMLJXCevBmYCvISIpxRYnXZrd3eU7Z3/Ui6inIP7N8RdA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"S0gWccFnm8zInib2yPeMOAS88+xh22BZya0HhikfYNMrkHFPHt0seGW+KTIuaWAUiT79gYYViFdBRnaBvYnr1A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RxXliVI+xdd8IXpvBtrhOOR4CfjeFqcFAzu5U04wG4QEv9J6QMzdCUYS0fabGbizUg0YIbxjduJpsbgFb29w1Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"wE4jDZd9BoDYT2Hrre6Go9Evu07/Y/ylQE90p/f9961pJdE1VWGIVKa9e6cd3V0WhyEiCDUvgMrwksMkDSUGOA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3ZzJTYMP9kyHozVzuoZqiKZp257HaTcp71hiel+FxxEL2cC6j24v1TssBoqwUARYEHkek6yj1WAY4BCYOtA4HA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1JArJ2bOzc6Im5SDgNjDsqrF/N0KCLz558ntuub/pXNuSWt6gFsFir4Eerg27tCvV7zugZWz3HLn+ErAq4Khaw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"32oPuVz4U2LnUF+wUgmEog8LVSR64r1vdzjbylfDdZ0KCppQFyo172eglV9rs8SYl7z6qM+qt2inUWv1N6lHhw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"i3aH29nsx2BoRynHURfBnHv61NNC0uILP2n2A0t1hb9NOfNyiIaMbQS9ETrN++NjuLfXyxngi3IYRF5KoMn/Vw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Pz9ao+RnNprgUh5dTOFfwQR5jdQQYrMZTqLUMWJaBoci/jNujl9UjySXNIc2TQepTydtSpRM5uJ/i0AgwhqoFg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"MlzY0Q3IX2ngoI4OvP0QgkotoyYAWSKxeMU5gTRSde5YgezoQ6fKwrAiQLbfy+7WoCbvU7nGRMHVS2K7akyjrw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"useHxyDXK73e0vvkiWDmU97QH8+Gr6HBlMj2sFx44OUq4PFWAyTIFTzr4QpYBDeUjy1ee3K9zZJg/Ianifv/dA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"DUQ7Cs76HHQ6J5XqyMDf1oCufOMtfboZWG4Rh2QAayMohxQAHzOnYp9PoB/J48SsJ8A0oL006IvZIvyAZ5dL8w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9bkNRN9vkR2cUl1WAIWcfv3pdasg5IKeGCl8QgrZVgJyHLnkcS1Lef02X3do1rlMui0RvtVRR2ytwb06ASS+UA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"BnCMNzUTpTJp0S1e37t3f8iHMTG4XzsP2RRBHwahkbcDqkLICPEpSiTVGCX4QNx6cBAz3iziRarVJ5xptyitxQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qp0FSC+cM7IB97Qg8d9r2JRuUhjmDjTk4L3R0DJVi2MXbz4uLfq3su98EUx6B4RR42Tg+rmJVYfGUZyzMLdLHA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"CXBKJuKxHBysTXgegvOLbc3dBTUqJFl5epQkGZjtfSNX/77i8UoYqeqyymTEaCYif/gkxjx1gYds8FfI8gyOcQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3G2uA8tHcb8LMk9rSOqrSx7bmXAJqRpgR4qTxwXny14ecYHLrZYoN6ol7YYAcOgrgFjIEYn7YD8Tg+g77d/5Lw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"d6ZnqzlgPJwIxh9lesfGStq4zP8wgRinGwgRvLpxCSlMYmydxBcgSqiRGhoaYQdN6D3esRBX090t3R1K1J4O9Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"v9SiD7vZsgjiww5M9RoDgyqXS9a54OPeldsk+igGOX4WVNerR2gdcfTewJFtz6r0+sMzxUM3y0TCClSJppZHjw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"/tWgpynW1EbDE2200qHkRdAyOXNtJOIr9AZ9JvJQ0HNi+Ap7FNuqqwZsFscX9cgg71b5XIon2c9zws1u29e2Nw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"XZFlkN9x7Ni7ZZ+h7FhmmH3VCok1E7ZqIYCrK5r+aoh9+hMMHfucBz/69Sr3MAGj6e7yTjT1NT0Ol6GZlv3LWQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3Z4tpmdimv5cGEsCfhDxHunUcYm2GF2sYjLbva34AQgzDyn45uRG7qcRBQkgK9FaKNU7jiOJdhOEBaS4rwRLrg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"BFWKchFXQz8ctgj9RvJ1bhL3+UWRIC0P9h9SLUFN7QgOppSDXqnx8bRCxz9BfVPUpmhGhfuQE8QhID7yEG0tdQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RIQIgtR6jKCENISFZsF21Bauz6CR42iH8vVMv6jzdw5afK9BUZiq8LqRYPSlAPcyuGGeXqw1vRJ8iGYsfqJbmw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"4h5TBDJnLq4tLniJPxb5KQ2PvIzlrI7mBCu9+t8DvyYD2ngRmCJiYV8O+ptoBJ9Zi+g15jIcexcjWm5wwFIOrA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"VUo1jZTWpjnxUPKUgUoFejFFyQKNOGgy9K6I2P3C0SMXJs7vPxoocZs1bXqSgcFMD1PaXBQHrg0MAOJrCEeERw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"u3a4toTRtd332a8s1Cwerjf9PNHMZi4qiGfbWscV1dR0wXYafjEAxj1+g+5FV5bvkJV2taNPYHUl7woLdBSrSw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"gMkg6yr9NUL+S217dJx7iDOTqQBeltTRdNr7wf2iDhRG4qjEJsKVpPTb48qX2jCjT9sgKcGDe209MlTYUf0aQQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9iG2FVmi9beSwiK9KGAp7Kj0EgEW3f+TO+hYSllTRiwvD2OsPxNzgMFzK8VdmkY7bNQco5wqct8AWBAeB7UdyQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"bJDj7aD4/A7LTvX6Qz6rcUFfs9hPvj2LJtFLWHnPFog8OhUIKFjI2wcWyZFBpkHYJyQKjOZHO92x2EUeLowpLQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sLwNlaapwQpDWgRD3Hu2H/7X2X4+mDOfgkJ1UBtEux8YN35V8IdsH/xM+VGEg6SPjviqHvj9OsKH17A2t96tdA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qq4+mzEVRra7WDJM70tseZD2pxmDHO3rfQw5GOG7Tp9DQh+avmmrdg1gDv0e18AIJXia5Yr5+eyBCHILLOevvA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fnRP/XezHy2AJlON5yLdeOjYCQdyw8rZxWzqP4Li4KsVhFmlSCV0UfOC1mtoGGOvQDWHsmuQHZuhxyvLDybjTQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"zYYhSOMW75A9eMBI2xWPc6gTK7E5KozSB98e7GbD6y5zJZRZjFpDpBFG+ZRwd1h3/wqvhV024y2nj/IqJv0G+g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"bm5heK5sEuPDNPPP6FAjVYI7BtRCINPCssNM1VUYBGU/BeZXz5jXUh6ZnrMMV/62Q4zICyDt81X6XpqcUt7FVg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fpE7Q9GFmS4+eKYvSm/5NZLs/RqWOktCq+YApAe4bn0azu0KF7BNy+cUIrD50pft58qi1mJdJET+tpbPMttIug=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"KQkgb8fWyOsTCNkibpd2OZS6YvV0BpGOxbKY9F9jrCpAQXqYhMjMpoXhgysh41ggL9yozJYMniDrZ07i86XhKw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ED7DClAGLfxTF06GgsvDutUWefXfKRbjDq9KPDtzutlYAugvIvg1HeTi3PYQJ5KHjouoyN9YV6z/XCXGED8zOw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qJr2gOmXpb9Q8dkhzXmcS38qSN0v1snbx1K1i6+s+m11tCbHhlhNqAg3v36rh177DsKqUPt2t0D2kX5MKUlHyA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"SP+rp9OqDQXQSwTklSedH5EmibQr4s0ciOTpYdcrm6dXyAw8HkEgX91vvAf7L7O6w3DljhItK/f+FuRVDnLjOg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"EqoaeTzRujnOM07rgs8R2ZGicLCwS3TlfbbyEvmWrzUX+iraMCFHU2vvvLwdZ1YZVY/lQNpq9NomCbiDkj7v2g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"IFe0f5HNzttK7wx5AWJjN9DPz2aW/qYN6ZH51z2Eqa9bOEEtakK41n4ZTyTIkUTS46q+awxScSyrPHAVrAFU2g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"7HXbPGQrkPNCtCFOuawp0H3ad955S8/emDiPHhtHUDVXMCp+JV2g/LtRxvg1BPI8Ngc9szMpRsbt6g2NrvEoTA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"oEW4n3ZvcNVze4gQei3naLH9Cn2FblcINg+UxVSK3QZoVGHWoI2yq5m9uHfqvBilEpZgrirdjaFUQgajakRNgQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sYNlCyRT3Zgg1J1LVbAJ4WcNdngacTweMTT3C89+nBAwHk1z/Vaesgt+wIGevmBCx8Sn029klEyWZwGloYlcFA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sUENkLrtwC7HCQpxubvCDgEmvPldpHYB+UMWkcIN2p4iygsAFbsduR6iVv9eJBF5rV5QDNNjeOw/jN/bMElhJA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AZYEa2wlLhPftKCbOrt9BGSg3bT8NEEeJkx/4izWygl01qovuvY2v4uY08LV3r53x3i5+YNRBfUMBRJxUio1UQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y1X6kSZB30xecpGPI8ua129FEwOlk6+eZRJ41v8R+497m7lkMK1204y2tcciHw3Ca/SQXVZ0DIItS4a52a8ISg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"iXdBKO7yY0XQWwik+30TcY4G+PH/D6SXRXrFSDPmYnQ29NckX0MO+eoLNbFLA+4kFwd1QzJcGcQV93HsKnwD7w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"UAqfYxpI4lzzuOXk6nRYwrRgfm3zYaaP0/lyDeY+RhkjRzp1NNvT6Jw2+WlVBloYAmPsCGHl+ZlvPwHSaU6ZZA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G+7GSHxC1vZePPrygv70woPAyfm1B0A6QSGEYqzsuFVrYQjc+VpnQcZRxujJK45wdEA8gJljp6nEUIoe2fvX5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OO7U2vDRqdsXYGH97YoH9B90ZvpcknnSYgkqDV0h5RZea0Ot1MDC26QlSuT7K+ue0baNFqJcHEXT1YjZaMcbaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y0/pWqx4XTKb4JVmh0gfBQffJ31hYcE4GlolQot5/qpJ+0IivG9G3lrfhbbEl/6heNFpPMKDg45OfVHTt5Nx5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5yV/dtQhLn6TpQlYVtE/zKo128dU0yQUf2JX05RvLqMy1/dbHmogOtjyOeJbQ/a+M+Wei2dNCNBA+92tVYQgqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5HsVSrJFSVrvvaY7PR3ixMRXsFKqzHfSxFa0nNfIYsMMtdFSB20+/246yCxBa0iZ7H/f1MUHf5Dzuf6G1f8b+Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"phtNWuw+s6rlNwVt+PgyXTrg6l5QLytx7A99mWlFHdlXhJL4kT/E9iSGoutU5nmVGqVI3T3Obc3xqaPT+bwXfg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"aAMaFvYTgfSBuYdQERL3b9Xb4y6DLfKf84wtfL2tPRV/xjdXpuj0KjqJw8whNopkCdOGwP3J+xxlaenyfn1vSw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sy7aCwhwl53QGymG4qlTarx+z2YHt4nXhRTBuAcWdOhF07Ij0G908kNJjOLRO5ppCXoVdpGgYqpE79xcPYKrbg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rpKHlFQBR86UZnlEIb/JUNuzYLbwpF9cGl83jhh7j+sAC1Tg5OFW1aBqxfRscgFKuv2CCQzyUo3mltKsZuhkeg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GUka0bGpN9vw5UjP5hLNkNF3AhMj7opdkFi47Ieo+X5iBcP5Nir7Z5XnPS9fqi9psrSuUellKOc9kvKNhTLKSg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g2Ogh/Y5E59Gqy0SRh3q+QKx8BGVDqh7WfJwzXq29HdJl5np6YsNGgXki046dtIYXM7Vk6YqhbVWpWlx5D/jhw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fxllR6psdh00kEGZ13C9GbUK0Ef763WPehcu0Cw3nGtHQMEnFJ0baEOT+exnK2rMPsDSlzRV3GeWc9D5Y5hpnQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Jk87FQTiUyvACAZ+LXzQSym4xFBwjT7dEmlXCfrKoc4Gfulki9zLJCPpYtTdAsB+d5VdkEab3Ywx1WECm0Rgxw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RszGJc/GTwskYskc82z9WfRUfdmMT1EXnBBa+lbhuQ4SkgiFx6EOJ4R66i5xQI0vjccEkufBvsX58LYnhKiiyQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","send":"","pkg_path":"gno.land/r/demo/memeland","func":"PostMeme","args":["data:image/jpeg;base64,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","1713878906"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AidlxNTtkl1dDNCgxrSNVJKYWZdC9yrixvgSAP6U6WYX"},"signature":"651hEjJOjCw5xyABIggwUuDho/uUGgtTdpz1GpNw9i5a6li7cL5ULx/sLIU5uxc5VGqoHFFA5jYOha4zKfUDSQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["000000h"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AidlxNTtkl1dDNCgxrSNVJKYWZdC9yrixvgSAP6U6WYX"},"signature":"mjFCtis0iazHjFzgaCSyBYWJcNbu69a6h3HND1LlfT4o9QdrHsXzOy29p+NvaCuioVsbmrx8FH7Ciuu8FAnSpg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"yisFo5Do4Alj9vBDL0U3GIpBe7qw6/RMqGyJYNBAJBwIZBfeywyvtCfsfVkWlgwLPdidPX9pnzDIbwfCwqXvQA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AmnwZ3Grd2QW962s+rEn2QvuwFWhhFC3k8e6k+Lpq6hJOVqgbGWXGtPemqSHwmML62Za8Hyzcao9Y4zuXM8JCQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qTF3punEcwvO68Sd3WkL3bq2LYi47P0SJJUwi0gdsr9jYV1LcJLfDV6eTLRD+AuX4uKgi1ZZ3/UNxYjaFRigLg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"V+qs5vyCMaGRN+TxNYqX79rypwMK4oypWzFZog0zaIZhjcUpVL/iA5OpTIsNrI5U7X9b04dfDcrC/Vm3hXHzgQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0K9XFITRAZscBYnBZcuQ5o3kT954xWmHuOiQUoAxuMJsUSX6CblwCm7YE8j5ELDvE8STnvKC40K17ohGu0iylA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"elgK/N388Iz5oKDzZr4t0dmeBaamC4VtBPzMHFYz47hNFvqHsHgJuL3lEtTQw0HqCOmDqlo96PIMrq/xL1JNeA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"pOrIun9Eu7qyQNMRBdIGDif+bSXhwkPCL+N1/5npNtsGb4xMhxpBP3yT/Lq9VmotatYExusB8zv67uyJj6EKbQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G+7GSHxC1vZePPrygv70woPAyfm1B0A6QSGEYqzsuFVrYQjc+VpnQcZRxujJK45wdEA8gJljp6nEUIoe2fvX5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OO7U2vDRqdsXYGH97YoH9B90ZvpcknnSYgkqDV0h5RZea0Ot1MDC26QlSuT7K+ue0baNFqJcHEXT1YjZaMcbaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y0/pWqx4XTKb4JVmh0gfBQffJ31hYcE4GlolQot5/qpJ+0IivG9G3lrfhbbEl/6heNFpPMKDg45OfVHTt5Nx5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5yV/dtQhLn6TpQlYVtE/zKo128dU0yQUf2JX05RvLqMy1/dbHmogOtjyOeJbQ/a+M+Wei2dNCNBA+92tVYQgqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5HsVSrJFSVrvvaY7PR3ixMRXsFKqzHfSxFa0nNfIYsMMtdFSB20+/246yCxBa0iZ7H/f1MUHf5Dzuf6G1f8b+Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"phtNWuw+s6rlNwVt+PgyXTrg6l5QLytx7A99mWlFHdlXhJL4kT/E9iSGoutU5nmVGqVI3T3Obc3xqaPT+bwXfg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"aAMaFvYTgfSBuYdQERL3b9Xb4y6DLfKf84wtfL2tPRV/xjdXpuj0KjqJw8whNopkCdOGwP3J+xxlaenyfn1vSw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15wmukt79xymnnu6c4de32trnufudqum60yrxu8","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9zhtNP0SYSJ8tRCeZA93IglWCs2dLRk/H/9RE8xWu7cMy25ZlR06sEpNXJCHcYVKfT64lLRYeNhYsjZPBwibXA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rpKHlFQBR86UZnlEIb/JUNuzYLbwpF9cGl83jhh7j+sAC1Tg5OFW1aBqxfRscgFKuv2CCQzyUo3mltKsZuhkeg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15wmukt79xymnnu6c4de32trnufudqum60yrxu8","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5ikIkebIXlX+KjCc6CKEtZu1zKcw7qipWKsLz1bA6+IeeIDkvLeqJXIO/O22/csuZl/iFjFT894wVAHkpBVU7Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g2Ogh/Y5E59Gqy0SRh3q+QKx8BGVDqh7WfJwzXq29HdJl5np6YsNGgXki046dtIYXM7Vk6YqhbVWpWlx5D/jhw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fxllR6psdh00kEGZ13C9GbUK0Ef763WPehcu0Cw3nGtHQMEnFJ0baEOT+exnK2rMPsDSlzRV3GeWc9D5Y5hpnQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Jk87FQTiUyvACAZ+LXzQSym4xFBwjT7dEmlXCfrKoc4Gfulki9zLJCPpYtTdAsB+d5VdkEab3Ywx1WECm0Rgxw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RszGJc/GTwskYskc82z9WfRUfdmMT1EXnBBa+lbhuQ4SkgiFx6EOJ4R66i5xQI0vjccEkufBvsX58LYnhKiiyQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15wmukt79xymnnu6c4de32trnufudqum60yrxu8","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"T0jyj7fCxz0/ERp3aAgVigdZ2gKbpO+jAE31xPMWbuRuKftvoTpbAnudwrFLgKsneGv0SfPb9CqdToJW4jAfvQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15wmukt79xymnnu6c4de32trnufudqum60yrxu8","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"vkRfTc9MuaLv+fINQzcdVh4uWuTE04528iu/qhZG+IhxwwOSa4NNKf4imRLgjTmj5bPdaEOxIs1eT5pQamlt9w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Xzd8mEquKyA7Mi0MkopQ7hEHqm+v3A9Za5XT6vbYFpJgpCA/VJqDdzHzB21Zj8qKjAIWcB6VAp/9SDcrVqEZSw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0K9XFITRAZscBYnBZcuQ5o3kT954xWmHuOiQUoAxuMJsUSX6CblwCm7YE8j5ELDvE8STnvKC40K17ohGu0iylA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"elgK/N388Iz5oKDzZr4t0dmeBaamC4VtBPzMHFYz47hNFvqHsHgJuL3lEtTQw0HqCOmDqlo96PIMrq/xL1JNeA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"pOrIun9Eu7qyQNMRBdIGDif+bSXhwkPCL+N1/5npNtsGb4xMhxpBP3yT/Lq9VmotatYExusB8zv67uyJj6EKbQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qGV+uH7f3tTjf4VArb1QF6YX67Yak7wU0MmT+U8zR0M6e8LJUfqufu1Ed8lAv7oQ148sTBHm7lG9BA0sBPT/hw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1mG5XOwHMust28kEm3mU5xzlTNeuJxEI+RA9vXMY5LQ+7QKHH35Jr2MbeW/40vVk82bWtxdFX4a/Cw+D142gqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"kRBCjz7SITeivFCjgohy0TzMjqmPbXOAdacH/frLPbItHCaaTfF/tIWQUP3F9HYh8EG2c5SPgocLKIIyGDNkXQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"xxvYsUyp3A1KK4xIchgEBHsX6QVAf3Lqk7uQSwj8vZAayELv25Jo/enGiXzyopH0bXyuKlGjfdcHKR5dQ8VfoA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15wmukt79xymnnu6c4de32trnufudqum60yrxu8","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"uwCBKH/x1ktxZGmrxVaXGXSxkKTmUQ7n85cECDbtBMwCRdl7ZAOAli7vCXpYhkei2OW4+qfKz+yD+/6N4eZPMQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"C2KNw9POqmtvQyAXaYkjQQHq1a/iRr5Eu88HdwxF8KEzIedIpAuOlyBgGwHkFwIkLYIpPVhR8cJXoHzLsV3w0w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15wmukt79xymnnu6c4de32trnufudqum60yrxu8","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"vExemZ9R++uva4yszb8qHPsjaIwc67rEGDC0MRp7DKkEbMKzdqu3LetaCn3gmKj/Jd9zxFFRsG+t1EG/v1CGAw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fYL42+rtkVaR4A+Ecp8sud6vaYKciPf+EeRcDOUfldErs1lCToaCfZjxs4DJ9J+iMcIjyg1cczuRr2EjviVo8Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"MRBFuxxpHJKm7Ua4WhGZiukEHi3j3F4CmXk72CKVuXlwQogd8Av0g4ji9S/2L0ZH+5z6c9s0ap+7vBYzE4G7SA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"B8ieqH3XjzVqB4no0OQDCO66Bqs0+LQD6AYba+oYmy05OVyxX7xwszootmv5eYMSUt2USWN8Shf3HN9NtGLoMA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5MOLSFMZ+PxHoR2y6rwrFxmYle57dtILpWY4n364JiNgQA5yKkpjQ223Srufb3yJfTrqPtshw/AYf6eYraKEXg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"u3Iv9cbFWIzChTtwI7D9Btjz45DhB1AxZfAcfSFo0H1kg3OT3rjtNUTCCM33jwGy5NtuO4XU/2HEXnP9I2RJkg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g7pC5xf9HvIZeyO82aJzbqnMXXu7cC30bkJ3h90n96VVUL2Vs3m7hGYq64GolwQLkLYCy4BoqI0K1KmWgKnfJw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"b2dNMfD+K2Un28ji+Kegt7t8uVXvASPh+KjcRT4NHHMLJXCevBmYCvISIpxRYnXZrd3eU7Z3/Ui6inIP7N8RdA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"S0gWccFnm8zInib2yPeMOAS88+xh22BZya0HhikfYNMrkHFPHt0seGW+KTIuaWAUiT79gYYViFdBRnaBvYnr1A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RxXliVI+xdd8IXpvBtrhOOR4CfjeFqcFAzu5U04wG4QEv9J6QMzdCUYS0fabGbizUg0YIbxjduJpsbgFb29w1Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"wE4jDZd9BoDYT2Hrre6Go9Evu07/Y/ylQE90p/f9961pJdE1VWGIVKa9e6cd3V0WhyEiCDUvgMrwksMkDSUGOA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15wmukt79xymnnu6c4de32trnufudqum60yrxu8","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"iSIZwCRqvcu9dXp4HPI2YEZ+uMHTRxMTe7GM9FVID1ZHPhJFYIg4jYK3Ao27I5Yd5wjKPxr7MRMXMK3ZxrgWFw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1JArJ2bOzc6Im5SDgNjDsqrF/N0KCLz558ntuub/pXNuSWt6gFsFir4Eerg27tCvV7zugZWz3HLn+ErAq4Khaw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15wmukt79xymnnu6c4de32trnufudqum60yrxu8","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"oCwV68e9BDAKw0jzJbEwloRpRa4NGSZ/FMJy/vcXPdFHdMHUAWXqWXI4nHhMgYmNYArMHpKH0byv30Wge8rkjQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15wmukt79xymnnu6c4de32trnufudqum60yrxu8","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"IRB6A9nPGGzr/w0NsVcjM/t3MrPeW73yvJ5qBIDS6gp5MO+BhvQFnhuFdPmkULcpyjV2LhtRQlVFNkJ96C3FMQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Pz9ao+RnNprgUh5dTOFfwQR5jdQQYrMZTqLUMWJaBoci/jNujl9UjySXNIc2TQepTydtSpRM5uJ/i0AgwhqoFg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"MlzY0Q3IX2ngoI4OvP0QgkotoyYAWSKxeMU5gTRSde5YgezoQ6fKwrAiQLbfy+7WoCbvU7nGRMHVS2K7akyjrw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"useHxyDXK73e0vvkiWDmU97QH8+Gr6HBlMj2sFx44OUq4PFWAyTIFTzr4QpYBDeUjy1ee3K9zZJg/Ianifv/dA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"DUQ7Cs76HHQ6J5XqyMDf1oCufOMtfboZWG4Rh2QAayMohxQAHzOnYp9PoB/J48SsJ8A0oL006IvZIvyAZ5dL8w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9bkNRN9vkR2cUl1WAIWcfv3pdasg5IKeGCl8QgrZVgJyHLnkcS1Lef02X3do1rlMui0RvtVRR2ytwb06ASS+UA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"BnCMNzUTpTJp0S1e37t3f8iHMTG4XzsP2RRBHwahkbcDqkLICPEpSiTVGCX4QNx6cBAz3iziRarVJ5xptyitxQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qp0FSC+cM7IB97Qg8d9r2JRuUhjmDjTk4L3R0DJVi2MXbz4uLfq3su98EUx6B4RR42Tg+rmJVYfGUZyzMLdLHA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"CXBKJuKxHBysTXgegvOLbc3dBTUqJFl5epQkGZjtfSNX/77i8UoYqeqyymTEaCYif/gkxjx1gYds8FfI8gyOcQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3G2uA8tHcb8LMk9rSOqrSx7bmXAJqRpgR4qTxwXny14ecYHLrZYoN6ol7YYAcOgrgFjIEYn7YD8Tg+g77d/5Lw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"d6ZnqzlgPJwIxh9lesfGStq4zP8wgRinGwgRvLpxCSlMYmydxBcgSqiRGhoaYQdN6D3esRBX090t3R1K1J4O9Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"v9SiD7vZsgjiww5M9RoDgyqXS9a54OPeldsk+igGOX4WVNerR2gdcfTewJFtz6r0+sMzxUM3y0TCClSJppZHjw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"/tWgpynW1EbDE2200qHkRdAyOXNtJOIr9AZ9JvJQ0HNi+Ap7FNuqqwZsFscX9cgg71b5XIon2c9zws1u29e2Nw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"XZFlkN9x7Ni7ZZ+h7FhmmH3VCok1E7ZqIYCrK5r+aoh9+hMMHfucBz/69Sr3MAGj6e7yTjT1NT0Ol6GZlv3LWQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3Z4tpmdimv5cGEsCfhDxHunUcYm2GF2sYjLbva34AQgzDyn45uRG7qcRBQkgK9FaKNU7jiOJdhOEBaS4rwRLrg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"BFWKchFXQz8ctgj9RvJ1bhL3+UWRIC0P9h9SLUFN7QgOppSDXqnx8bRCxz9BfVPUpmhGhfuQE8QhID7yEG0tdQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RIQIgtR6jKCENISFZsF21Bauz6CR42iH8vVMv6jzdw5afK9BUZiq8LqRYPSlAPcyuGGeXqw1vRJ8iGYsfqJbmw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"4h5TBDJnLq4tLniJPxb5KQ2PvIzlrI7mBCu9+t8DvyYD2ngRmCJiYV8O+ptoBJ9Zi+g15jIcexcjWm5wwFIOrA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"VUo1jZTWpjnxUPKUgUoFejFFyQKNOGgy9K6I2P3C0SMXJs7vPxoocZs1bXqSgcFMD1PaXBQHrg0MAOJrCEeERw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"u3a4toTRtd332a8s1Cwerjf9PNHMZi4qiGfbWscV1dR0wXYafjEAxj1+g+5FV5bvkJV2taNPYHUl7woLdBSrSw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"gMkg6yr9NUL+S217dJx7iDOTqQBeltTRdNr7wf2iDhRG4qjEJsKVpPTb48qX2jCjT9sgKcGDe209MlTYUf0aQQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9iG2FVmi9beSwiK9KGAp7Kj0EgEW3f+TO+hYSllTRiwvD2OsPxNzgMFzK8VdmkY7bNQco5wqct8AWBAeB7UdyQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"bJDj7aD4/A7LTvX6Qz6rcUFfs9hPvj2LJtFLWHnPFog8OhUIKFjI2wcWyZFBpkHYJyQKjOZHO92x2EUeLowpLQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sLwNlaapwQpDWgRD3Hu2H/7X2X4+mDOfgkJ1UBtEux8YN35V8IdsH/xM+VGEg6SPjviqHvj9OsKH17A2t96tdA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qq4+mzEVRra7WDJM70tseZD2pxmDHO3rfQw5GOG7Tp9DQh+avmmrdg1gDv0e18AIJXia5Yr5+eyBCHILLOevvA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fnRP/XezHy2AJlON5yLdeOjYCQdyw8rZxWzqP4Li4KsVhFmlSCV0UfOC1mtoGGOvQDWHsmuQHZuhxyvLDybjTQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"zYYhSOMW75A9eMBI2xWPc6gTK7E5KozSB98e7GbD6y5zJZRZjFpDpBFG+ZRwd1h3/wqvhV024y2nj/IqJv0G+g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"bm5heK5sEuPDNPPP6FAjVYI7BtRCINPCssNM1VUYBGU/BeZXz5jXUh6ZnrMMV/62Q4zICyDt81X6XpqcUt7FVg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fpE7Q9GFmS4+eKYvSm/5NZLs/RqWOktCq+YApAe4bn0azu0KF7BNy+cUIrD50pft58qi1mJdJET+tpbPMttIug=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"KQkgb8fWyOsTCNkibpd2OZS6YvV0BpGOxbKY9F9jrCpAQXqYhMjMpoXhgysh41ggL9yozJYMniDrZ07i86XhKw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ED7DClAGLfxTF06GgsvDutUWefXfKRbjDq9KPDtzutlYAugvIvg1HeTi3PYQJ5KHjouoyN9YV6z/XCXGED8zOw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qJr2gOmXpb9Q8dkhzXmcS38qSN0v1snbx1K1i6+s+m11tCbHhlhNqAg3v36rh177DsKqUPt2t0D2kX5MKUlHyA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"SP+rp9OqDQXQSwTklSedH5EmibQr4s0ciOTpYdcrm6dXyAw8HkEgX91vvAf7L7O6w3DljhItK/f+FuRVDnLjOg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"EqoaeTzRujnOM07rgs8R2ZGicLCwS3TlfbbyEvmWrzUX+iraMCFHU2vvvLwdZ1YZVY/lQNpq9NomCbiDkj7v2g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"IFe0f5HNzttK7wx5AWJjN9DPz2aW/qYN6ZH51z2Eqa9bOEEtakK41n4ZTyTIkUTS46q+awxScSyrPHAVrAFU2g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"7HXbPGQrkPNCtCFOuawp0H3ad955S8/emDiPHhtHUDVXMCp+JV2g/LtRxvg1BPI8Ngc9szMpRsbt6g2NrvEoTA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"nNmekmbYXaZPQcsn4VNRpA/2Kun/PgiVVnofTOy+ptIEIwtoSl4mhcBP7FaTh9U0FAHfQLD+tf8WczGuKcC74Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sYNlCyRT3Zgg1J1LVbAJ4WcNdngacTweMTT3C89+nBAwHk1z/Vaesgt+wIGevmBCx8Sn029klEyWZwGloYlcFA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sUENkLrtwC7HCQpxubvCDgEmvPldpHYB+UMWkcIN2p4iygsAFbsduR6iVv9eJBF5rV5QDNNjeOw/jN/bMElhJA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"2NHSUQAzkLqqiN2C8jOa7cfSzYAnHjCfhjN3j6p3cB8L09xIH5OMSNeW59ZhgNFoy7ovgM8Cfa4gVG9ccruP9A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y1X6kSZB30xecpGPI8ua129FEwOlk6+eZRJ41v8R+497m7lkMK1204y2tcciHw3Ca/SQXVZ0DIItS4a52a8ISg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G+7GSHxC1vZePPrygv70woPAyfm1B0A6QSGEYqzsuFVrYQjc+VpnQcZRxujJK45wdEA8gJljp6nEUIoe2fvX5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OO7U2vDRqdsXYGH97YoH9B90ZvpcknnSYgkqDV0h5RZea0Ot1MDC26QlSuT7K+ue0baNFqJcHEXT1YjZaMcbaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y0/pWqx4XTKb4JVmh0gfBQffJ31hYcE4GlolQot5/qpJ+0IivG9G3lrfhbbEl/6heNFpPMKDg45OfVHTt5Nx5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G+7GSHxC1vZePPrygv70woPAyfm1B0A6QSGEYqzsuFVrYQjc+VpnQcZRxujJK45wdEA8gJljp6nEUIoe2fvX5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OO7U2vDRqdsXYGH97YoH9B90ZvpcknnSYgkqDV0h5RZea0Ot1MDC26QlSuT7K+ue0baNFqJcHEXT1YjZaMcbaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y0/pWqx4XTKb4JVmh0gfBQffJ31hYcE4GlolQot5/qpJ+0IivG9G3lrfhbbEl/6heNFpPMKDg45OfVHTt5Nx5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5yV/dtQhLn6TpQlYVtE/zKo128dU0yQUf2JX05RvLqMy1/dbHmogOtjyOeJbQ/a+M+Wei2dNCNBA+92tVYQgqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5HsVSrJFSVrvvaY7PR3ixMRXsFKqzHfSxFa0nNfIYsMMtdFSB20+/246yCxBa0iZ7H/f1MUHf5Dzuf6G1f8b+Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"phtNWuw+s6rlNwVt+PgyXTrg6l5QLytx7A99mWlFHdlXhJL4kT/E9iSGoutU5nmVGqVI3T3Obc3xqaPT+bwXfg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"aAMaFvYTgfSBuYdQERL3b9Xb4y6DLfKf84wtfL2tPRV/xjdXpuj0KjqJw8whNopkCdOGwP3J+xxlaenyfn1vSw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15wmukt79xymnnu6c4de32trnufudqum60yrxu8","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9zhtNP0SYSJ8tRCeZA93IglWCs2dLRk/H/9RE8xWu7cMy25ZlR06sEpNXJCHcYVKfT64lLRYeNhYsjZPBwibXA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rpKHlFQBR86UZnlEIb/JUNuzYLbwpF9cGl83jhh7j+sAC1Tg5OFW1aBqxfRscgFKuv2CCQzyUo3mltKsZuhkeg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GUka0bGpN9vw5UjP5hLNkNF3AhMj7opdkFi47Ieo+X5iBcP5Nir7Z5XnPS9fqi9psrSuUellKOc9kvKNhTLKSg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g2Ogh/Y5E59Gqy0SRh3q+QKx8BGVDqh7WfJwzXq29HdJl5np6YsNGgXki046dtIYXM7Vk6YqhbVWpWlx5D/jhw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fxllR6psdh00kEGZ13C9GbUK0Ef763WPehcu0Cw3nGtHQMEnFJ0baEOT+exnK2rMPsDSlzRV3GeWc9D5Y5hpnQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Jk87FQTiUyvACAZ+LXzQSym4xFBwjT7dEmlXCfrKoc4Gfulki9zLJCPpYtTdAsB+d5VdkEab3Ywx1WECm0Rgxw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RszGJc/GTwskYskc82z9WfRUfdmMT1EXnBBa+lbhuQ4SkgiFx6EOJ4R66i5xQI0vjccEkufBvsX58LYnhKiiyQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AmnwZ3Grd2QW962s+rEn2QvuwFWhhFC3k8e6k+Lpq6hJOVqgbGWXGtPemqSHwmML62Za8Hyzcao9Y4zuXM8JCQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qTF3punEcwvO68Sd3WkL3bq2LYi47P0SJJUwi0gdsr9jYV1LcJLfDV6eTLRD+AuX4uKgi1ZZ3/UNxYjaFRigLg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G+7GSHxC1vZePPrygv70woPAyfm1B0A6QSGEYqzsuFVrYQjc+VpnQcZRxujJK45wdEA8gJljp6nEUIoe2fvX5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OO7U2vDRqdsXYGH97YoH9B90ZvpcknnSYgkqDV0h5RZea0Ot1MDC26QlSuT7K+ue0baNFqJcHEXT1YjZaMcbaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G+7GSHxC1vZePPrygv70woPAyfm1B0A6QSGEYqzsuFVrYQjc+VpnQcZRxujJK45wdEA8gJljp6nEUIoe2fvX5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OO7U2vDRqdsXYGH97YoH9B90ZvpcknnSYgkqDV0h5RZea0Ot1MDC26QlSuT7K+ue0baNFqJcHEXT1YjZaMcbaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y0/pWqx4XTKb4JVmh0gfBQffJ31hYcE4GlolQot5/qpJ+0IivG9G3lrfhbbEl/6heNFpPMKDg45OfVHTt5Nx5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5yV/dtQhLn6TpQlYVtE/zKo128dU0yQUf2JX05RvLqMy1/dbHmogOtjyOeJbQ/a+M+Wei2dNCNBA+92tVYQgqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5HsVSrJFSVrvvaY7PR3ixMRXsFKqzHfSxFa0nNfIYsMMtdFSB20+/246yCxBa0iZ7H/f1MUHf5Dzuf6G1f8b+Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"phtNWuw+s6rlNwVt+PgyXTrg6l5QLytx7A99mWlFHdlXhJL4kT/E9iSGoutU5nmVGqVI3T3Obc3xqaPT+bwXfg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"aAMaFvYTgfSBuYdQERL3b9Xb4y6DLfKf84wtfL2tPRV/xjdXpuj0KjqJw8whNopkCdOGwP3J+xxlaenyfn1vSw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sy7aCwhwl53QGymG4qlTarx+z2YHt4nXhRTBuAcWdOhF07Ij0G908kNJjOLRO5ppCXoVdpGgYqpE79xcPYKrbg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rpKHlFQBR86UZnlEIb/JUNuzYLbwpF9cGl83jhh7j+sAC1Tg5OFW1aBqxfRscgFKuv2CCQzyUo3mltKsZuhkeg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GUka0bGpN9vw5UjP5hLNkNF3AhMj7opdkFi47Ieo+X5iBcP5Nir7Z5XnPS9fqi9psrSuUellKOc9kvKNhTLKSg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g2Ogh/Y5E59Gqy0SRh3q+QKx8BGVDqh7WfJwzXq29HdJl5np6YsNGgXki046dtIYXM7Vk6YqhbVWpWlx5D/jhw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15hrw6y9wuvdvnupcfksp9yp2l5057l79zy7vu5","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"LY9w7TIC/m2NkuD7MaxCQ+uxSIS8arxsjZhu7+caafB0eGq56+vyOOgb1JH4tA/rb780lCzcS7/y9nXOKsTDhA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15hrw6y9wuvdvnupcfksp9yp2l5057l79zy7vu5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"KU8uG0FXrEycs9N1yFbvgzh+DUtqvsWvUI/pOjIDxyFWdRHXitiU0Et/80CDMxzKtKCSKTyx9PZGljuXwx14BQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15hrw6y9wuvdvnupcfksp9yp2l5057l79zy7vu5","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3+wpG2DGhR7koOMjMN4xLm3UaNNm//CclrhvMYMAG3FE00yvAxGzgysC9Wqpp7O09wJuonp/IzHAV3Me8svoDQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15hrw6y9wuvdvnupcfksp9yp2l5057l79zy7vu5","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qesnID0OcLsuhuNU+5MZn5rbKzDQi2JcZIIeipC0OLFPxbKDVlhq793ECMC8mcTEoxOqy/wOWgIDrlN+HGLT9Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y0/pWqx4XTKb4JVmh0gfBQffJ31hYcE4GlolQot5/qpJ+0IivG9G3lrfhbbEl/6heNFpPMKDg45OfVHTt5Nx5A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15wmukt79xymnnu6c4de32trnufudqum60yrxu8","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"l2yOUjm0quff4NiKAxQISLFu7LWvaGpjHbM3Op7ufPI4k5GQdVvkvTUAN3G3QpTTsqn67CP7X9NcUB2pkEIVsw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15wmukt79xymnnu6c4de32trnufudqum60yrxu8","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"HSnZH6iB39m9ERY9+TxYTj3Dgfw08Md/l5uSrGWY+ORSUCgddTDCHH6QfTh5EMkRBjsX5N+Fm9CwC/eLnmDTUQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15wmukt79xymnnu6c4de32trnufudqum60yrxu8","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AJ071PGUSeKqPJmZGuZLbGOJq4Ob8RvRiHlD1ui2zqhGxnxdFotO84ZEoA+6w6n93yDgTYIJoQT65jnkgyw/eg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"aAMaFvYTgfSBuYdQERL3b9Xb4y6DLfKf84wtfL2tPRV/xjdXpuj0KjqJw8whNopkCdOGwP3J+xxlaenyfn1vSw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sy7aCwhwl53QGymG4qlTarx+z2YHt4nXhRTBuAcWdOhF07Ij0G908kNJjOLRO5ppCXoVdpGgYqpE79xcPYKrbg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15wmukt79xymnnu6c4de32trnufudqum60yrxu8","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"i/bptPe7UnnPvw/JjeRPk56zrbaQV1XeDohofkiSgIh5w1w4QColH0opaFQ3eD7oxYx+z2EkPXz1A+XKJy3EOg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OO7U2vDRqdsXYGH97YoH9B90ZvpcknnSYgkqDV0h5RZea0Ot1MDC26QlSuT7K+ue0baNFqJcHEXT1YjZaMcbaA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15wmukt79xymnnu6c4de32trnufudqum60yrxu8","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"XnUPJswkXwsjTNgn8+ZkUU/umvzi2YfgaSbUsXR34093MfUo1tya5S1tXN1oOpRXyBV0x03gwao7zTDpFF1sBw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15wmukt79xymnnu6c4de32trnufudqum60yrxu8","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"l2yOUjm0quff4NiKAxQISLFu7LWvaGpjHbM3Op7ufPI4k5GQdVvkvTUAN3G3QpTTsqn67CP7X9NcUB2pkEIVsw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15wmukt79xymnnu6c4de32trnufudqum60yrxu8","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"/dhsAw40JamwdnVgCzbPs5dabBek7elIoWAOaLG6EdZ42ebHdJGRoNwCsEmKxIH5LNfdOWikLTZB1d6wukeF7w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15wmukt79xymnnu6c4de32trnufudqum60yrxu8","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"x1PZ1MKd4Jk+acPgEqQ0RxXSd9s/K5aKJwg8yWQUf2saUX75j1A8d+1cojT4vqowgJBFximB61ZD9T960YDgBw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15wmukt79xymnnu6c4de32trnufudqum60yrxu8","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"keJbCnbdq090jpS+tl9laHMOQ8s3Yve8LTDl71mGrdxG4wxKFCRxOaOwu85zFxoV/BTggQo/b3mEKUzJ5fgb7A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15wmukt79xymnnu6c4de32trnufudqum60yrxu8","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"daeJWhgZDmxNSekDQxhAoHP/1quxZ0JmHKUXP3UGP0pTy/8RmK5RdmP7FyvJLZLPRuoM3KAvzNAbjf6aotauIw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rpKHlFQBR86UZnlEIb/JUNuzYLbwpF9cGl83jhh7j+sAC1Tg5OFW1aBqxfRscgFKuv2CCQzyUo3mltKsZuhkeg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GUka0bGpN9vw5UjP5hLNkNF3AhMj7opdkFi47Ieo+X5iBcP5Nir7Z5XnPS9fqi9psrSuUellKOc9kvKNhTLKSg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g2Ogh/Y5E59Gqy0SRh3q+QKx8BGVDqh7WfJwzXq29HdJl5np6YsNGgXki046dtIYXM7Vk6YqhbVWpWlx5D/jhw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fxllR6psdh00kEGZ13C9GbUK0Ef763WPehcu0Cw3nGtHQMEnFJ0baEOT+exnK2rMPsDSlzRV3GeWc9D5Y5hpnQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Jk87FQTiUyvACAZ+LXzQSym4xFBwjT7dEmlXCfrKoc4Gfulki9zLJCPpYtTdAsB+d5VdkEab3Ywx1WECm0Rgxw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RszGJc/GTwskYskc82z9WfRUfdmMT1EXnBBa+lbhuQ4SkgiFx6EOJ4R66i5xQI0vjccEkufBvsX58LYnhKiiyQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AmnwZ3Grd2QW962s+rEn2QvuwFWhhFC3k8e6k+Lpq6hJOVqgbGWXGtPemqSHwmML62Za8Hyzcao9Y4zuXM8JCQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qTF3punEcwvO68Sd3WkL3bq2LYi47P0SJJUwi0gdsr9jYV1LcJLfDV6eTLRD+AuX4uKgi1ZZ3/UNxYjaFRigLg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"V+qs5vyCMaGRN+TxNYqX79rypwMK4oypWzFZog0zaIZhjcUpVL/iA5OpTIsNrI5U7X9b04dfDcrC/Vm3hXHzgQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0K9XFITRAZscBYnBZcuQ5o3kT954xWmHuOiQUoAxuMJsUSX6CblwCm7YE8j5ELDvE8STnvKC40K17ohGu0iylA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"elgK/N388Iz5oKDzZr4t0dmeBaamC4VtBPzMHFYz47hNFvqHsHgJuL3lEtTQw0HqCOmDqlo96PIMrq/xL1JNeA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"pOrIun9Eu7qyQNMRBdIGDif+bSXhwkPCL+N1/5npNtsGb4xMhxpBP3yT/Lq9VmotatYExusB8zv67uyJj6EKbQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qGV+uH7f3tTjf4VArb1QF6YX67Yak7wU0MmT+U8zR0M6e8LJUfqufu1Ed8lAv7oQ148sTBHm7lG9BA0sBPT/hw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1mG5XOwHMust28kEm3mU5xzlTNeuJxEI+RA9vXMY5LQ+7QKHH35Jr2MbeW/40vVk82bWtxdFX4a/Cw+D142gqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"kRBCjz7SITeivFCjgohy0TzMjqmPbXOAdacH/frLPbItHCaaTfF/tIWQUP3F9HYh8EG2c5SPgocLKIIyGDNkXQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15wmukt79xymnnu6c4de32trnufudqum60yrxu8","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"vDkY4Ri2VVuSRV+p1lsrd4nVwIgwpBjtm9MKZcx40fVdVaxbb+p7N8ErFmHXXSg8/jzCjuhmmkiyUxQgKmeSeg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15wmukt79xymnnu6c4de32trnufudqum60yrxu8","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"uwCBKH/x1ktxZGmrxVaXGXSxkKTmUQ7n85cECDbtBMwCRdl7ZAOAli7vCXpYhkei2OW4+qfKz+yD+/6N4eZPMQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15wmukt79xymnnu6c4de32trnufudqum60yrxu8","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0o2W3z12bZRujUJNMlZ11feu7g2VYEHcf2EWXmwEmP56hBb6Ps6iVewfv1DrYeXTyIl3H1pQ1HXjeZxcOOU+qA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15wmukt79xymnnu6c4de32trnufudqum60yrxu8","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"vExemZ9R++uva4yszb8qHPsjaIwc67rEGDC0MRp7DKkEbMKzdqu3LetaCn3gmKj/Jd9zxFFRsG+t1EG/v1CGAw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15wmukt79xymnnu6c4de32trnufudqum60yrxu8","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"/S2cSZzQWtArFNAEoMPhyIg5I1IlvACtjeNWncfhX841rhQCgS4F8FTK5Nu+c9LzysgknAquxyE+oYt5pp+QXA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15wmukt79xymnnu6c4de32trnufudqum60yrxu8","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"/Apy4viipqcSHRoDOuQTQGPW6CERLgpGTZL+xHnLNNthVZG1Ga7S9HT9c2kqWiaoydBr56eR0cZXrvo/AtP7hg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"B8ieqH3XjzVqB4no0OQDCO66Bqs0+LQD6AYba+oYmy05OVyxX7xwszootmv5eYMSUt2USWN8Shf3HN9NtGLoMA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15wmukt79xymnnu6c4de32trnufudqum60yrxu8","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8Y+C9PhcXTg0P1e8eDbnAY4JKclXgPM2yaQMQFZjwcgy73/l2dFUYP/BPhe5FB89zUzyHJB97WTx5QTL2YVYHQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15wmukt79xymnnu6c4de32trnufudqum60yrxu8","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"+mpwPj60NId2Ps2fwxibNyzZLnef7X4q5/HxP5XY0woG6NW3xF3pRxLKIxluXA4T4sFDwN7lYn9fPUfnv2sXGQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15wmukt79xymnnu6c4de32trnufudqum60yrxu8","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ltxaHpr1NepY1E+V/inmTZgCLX9kSn9lAM9RuBkhjW1OT0/3YN/Uy2fZdpwB2UFbQ6KJLjd+c6YIADpE6Wd/Og=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"b2dNMfD+K2Un28ji+Kegt7t8uVXvASPh+KjcRT4NHHMLJXCevBmYCvISIpxRYnXZrd3eU7Z3/Ui6inIP7N8RdA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15wmukt79xymnnu6c4de32trnufudqum60yrxu8","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"X0H4Ci4svW6E0Rjikesz2XN/bI5mHm0t7VINHsrwDmZDIKjFKhXrMYmsCvpz0/S9kCU9N2XxBmv2O0WOW8LFbw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RxXliVI+xdd8IXpvBtrhOOR4CfjeFqcFAzu5U04wG4QEv9J6QMzdCUYS0fabGbizUg0YIbxjduJpsbgFb29w1Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"wE4jDZd9BoDYT2Hrre6Go9Evu07/Y/ylQE90p/f9961pJdE1VWGIVKa9e6cd3V0WhyEiCDUvgMrwksMkDSUGOA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3ZzJTYMP9kyHozVzuoZqiKZp257HaTcp71hiel+FxxEL2cC6j24v1TssBoqwUARYEHkek6yj1WAY4BCYOtA4HA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1JArJ2bOzc6Im5SDgNjDsqrF/N0KCLz558ntuub/pXNuSWt6gFsFir4Eerg27tCvV7zugZWz3HLn+ErAq4Khaw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"32oPuVz4U2LnUF+wUgmEog8LVSR64r1vdzjbylfDdZ0KCppQFyo172eglV9rs8SYl7z6qM+qt2inUWv1N6lHhw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"i3aH29nsx2BoRynHURfBnHv61NNC0uILP2n2A0t1hb9NOfNyiIaMbQS9ETrN++NjuLfXyxngi3IYRF5KoMn/Vw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Pz9ao+RnNprgUh5dTOFfwQR5jdQQYrMZTqLUMWJaBoci/jNujl9UjySXNIc2TQepTydtSpRM5uJ/i0AgwhqoFg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"MlzY0Q3IX2ngoI4OvP0QgkotoyYAWSKxeMU5gTRSde5YgezoQ6fKwrAiQLbfy+7WoCbvU7nGRMHVS2K7akyjrw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"useHxyDXK73e0vvkiWDmU97QH8+Gr6HBlMj2sFx44OUq4PFWAyTIFTzr4QpYBDeUjy1ee3K9zZJg/Ianifv/dA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"DUQ7Cs76HHQ6J5XqyMDf1oCufOMtfboZWG4Rh2QAayMohxQAHzOnYp9PoB/J48SsJ8A0oL006IvZIvyAZ5dL8w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9bkNRN9vkR2cUl1WAIWcfv3pdasg5IKeGCl8QgrZVgJyHLnkcS1Lef02X3do1rlMui0RvtVRR2ytwb06ASS+UA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"TDEqZ+Z1BtXGdAaLpmkQgf2PKJwaxqBD6jL9TvIUIQVQksV8Ld0oLqpkvhHzK8lOCXWVJW/nWUTudbRudcMMKg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qp0FSC+cM7IB97Qg8d9r2JRuUhjmDjTk4L3R0DJVi2MXbz4uLfq3su98EUx6B4RR42Tg+rmJVYfGUZyzMLdLHA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"CXBKJuKxHBysTXgegvOLbc3dBTUqJFl5epQkGZjtfSNX/77i8UoYqeqyymTEaCYif/gkxjx1gYds8FfI8gyOcQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3G2uA8tHcb8LMk9rSOqrSx7bmXAJqRpgR4qTxwXny14ecYHLrZYoN6ol7YYAcOgrgFjIEYn7YD8Tg+g77d/5Lw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"d6ZnqzlgPJwIxh9lesfGStq4zP8wgRinGwgRvLpxCSlMYmydxBcgSqiRGhoaYQdN6D3esRBX090t3R1K1J4O9Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"v9SiD7vZsgjiww5M9RoDgyqXS9a54OPeldsk+igGOX4WVNerR2gdcfTewJFtz6r0+sMzxUM3y0TCClSJppZHjw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"K0zJtyMGbVcAU+w6Ckm9nJQ316Me1nxocrl+iS/1dLBUyI00bE8Kts1fH9Sm6uJKY0Np4DmshJ4phHYHQC8b1A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sqZYDO/HLbGGf505SD9qdGk8xMSuIFLLtFbYmiJBhoMMWGTfJ2kWsoo5fLEkGXXJv3+RcHZnztsfM2N1IBPUVQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3Z4tpmdimv5cGEsCfhDxHunUcYm2GF2sYjLbva34AQgzDyn45uRG7qcRBQkgK9FaKNU7jiOJdhOEBaS4rwRLrg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"BFWKchFXQz8ctgj9RvJ1bhL3+UWRIC0P9h9SLUFN7QgOppSDXqnx8bRCxz9BfVPUpmhGhfuQE8QhID7yEG0tdQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RIQIgtR6jKCENISFZsF21Bauz6CR42iH8vVMv6jzdw5afK9BUZiq8LqRYPSlAPcyuGGeXqw1vRJ8iGYsfqJbmw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"4h5TBDJnLq4tLniJPxb5KQ2PvIzlrI7mBCu9+t8DvyYD2ngRmCJiYV8O+ptoBJ9Zi+g15jIcexcjWm5wwFIOrA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"VUo1jZTWpjnxUPKUgUoFejFFyQKNOGgy9K6I2P3C0SMXJs7vPxoocZs1bXqSgcFMD1PaXBQHrg0MAOJrCEeERw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"u3a4toTRtd332a8s1Cwerjf9PNHMZi4qiGfbWscV1dR0wXYafjEAxj1+g+5FV5bvkJV2taNPYHUl7woLdBSrSw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"gMkg6yr9NUL+S217dJx7iDOTqQBeltTRdNr7wf2iDhRG4qjEJsKVpPTb48qX2jCjT9sgKcGDe209MlTYUf0aQQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9iG2FVmi9beSwiK9KGAp7Kj0EgEW3f+TO+hYSllTRiwvD2OsPxNzgMFzK8VdmkY7bNQco5wqct8AWBAeB7UdyQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"bJDj7aD4/A7LTvX6Qz6rcUFfs9hPvj2LJtFLWHnPFog8OhUIKFjI2wcWyZFBpkHYJyQKjOZHO92x2EUeLowpLQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sLwNlaapwQpDWgRD3Hu2H/7X2X4+mDOfgkJ1UBtEux8YN35V8IdsH/xM+VGEg6SPjviqHvj9OsKH17A2t96tdA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qq4+mzEVRra7WDJM70tseZD2pxmDHO3rfQw5GOG7Tp9DQh+avmmrdg1gDv0e18AIJXia5Yr5+eyBCHILLOevvA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fnRP/XezHy2AJlON5yLdeOjYCQdyw8rZxWzqP4Li4KsVhFmlSCV0UfOC1mtoGGOvQDWHsmuQHZuhxyvLDybjTQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"zYYhSOMW75A9eMBI2xWPc6gTK7E5KozSB98e7GbD6y5zJZRZjFpDpBFG+ZRwd1h3/wqvhV024y2nj/IqJv0G+g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"bm5heK5sEuPDNPPP6FAjVYI7BtRCINPCssNM1VUYBGU/BeZXz5jXUh6ZnrMMV/62Q4zICyDt81X6XpqcUt7FVg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fpE7Q9GFmS4+eKYvSm/5NZLs/RqWOktCq+YApAe4bn0azu0KF7BNy+cUIrD50pft58qi1mJdJET+tpbPMttIug=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"KQkgb8fWyOsTCNkibpd2OZS6YvV0BpGOxbKY9F9jrCpAQXqYhMjMpoXhgysh41ggL9yozJYMniDrZ07i86XhKw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15hrw6y9wuvdvnupcfksp9yp2l5057l79zy7vu5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"LInOCh/aHtq4GhAUPnzyBd5hEOK2DljIz0bTlIfRX+Vzdv7uViahyIkL/ATH81rfgaIqiqPpxd3nz45yCsQhAg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qJr2gOmXpb9Q8dkhzXmcS38qSN0v1snbx1K1i6+s+m11tCbHhlhNqAg3v36rh177DsKqUPt2t0D2kX5MKUlHyA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"HwL08OpcSUajRFF/fSqSiixSi65wSABPPEtBpf0eaqZfiNZMYcVEZlkDtJ2sC4vtQu26MXztKHo/oJg30TfkxQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"EqoaeTzRujnOM07rgs8R2ZGicLCwS3TlfbbyEvmWrzUX+iraMCFHU2vvvLwdZ1YZVY/lQNpq9NomCbiDkj7v2g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"IFe0f5HNzttK7wx5AWJjN9DPz2aW/qYN6ZH51z2Eqa9bOEEtakK41n4ZTyTIkUTS46q+awxScSyrPHAVrAFU2g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"7HXbPGQrkPNCtCFOuawp0H3ad955S8/emDiPHhtHUDVXMCp+JV2g/LtRxvg1BPI8Ngc9szMpRsbt6g2NrvEoTA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G+7GSHxC1vZePPrygv70woPAyfm1B0A6QSGEYqzsuFVrYQjc+VpnQcZRxujJK45wdEA8gJljp6nEUIoe2fvX5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OO7U2vDRqdsXYGH97YoH9B90ZvpcknnSYgkqDV0h5RZea0Ot1MDC26QlSuT7K+ue0baNFqJcHEXT1YjZaMcbaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y0/pWqx4XTKb4JVmh0gfBQffJ31hYcE4GlolQot5/qpJ+0IivG9G3lrfhbbEl/6heNFpPMKDg45OfVHTt5Nx5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5yV/dtQhLn6TpQlYVtE/zKo128dU0yQUf2JX05RvLqMy1/dbHmogOtjyOeJbQ/a+M+Wei2dNCNBA+92tVYQgqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5HsVSrJFSVrvvaY7PR3ixMRXsFKqzHfSxFa0nNfIYsMMtdFSB20+/246yCxBa0iZ7H/f1MUHf5Dzuf6G1f8b+Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"phtNWuw+s6rlNwVt+PgyXTrg6l5QLytx7A99mWlFHdlXhJL4kT/E9iSGoutU5nmVGqVI3T3Obc3xqaPT+bwXfg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15wmukt79xymnnu6c4de32trnufudqum60yrxu8","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"j/5LrP2qLzDcFAC/yZoEhyRxOfjKN45dgOlpyCvkJshLsjB76eipSMbD7MuSmKeqZbi2zp7E4O+6zB/yALJr1g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sy7aCwhwl53QGymG4qlTarx+z2YHt4nXhRTBuAcWdOhF07Ij0G908kNJjOLRO5ppCXoVdpGgYqpE79xcPYKrbg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G+7GSHxC1vZePPrygv70woPAyfm1B0A6QSGEYqzsuFVrYQjc+VpnQcZRxujJK45wdEA8gJljp6nEUIoe2fvX5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OO7U2vDRqdsXYGH97YoH9B90ZvpcknnSYgkqDV0h5RZea0Ot1MDC26QlSuT7K+ue0baNFqJcHEXT1YjZaMcbaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y0/pWqx4XTKb4JVmh0gfBQffJ31hYcE4GlolQot5/qpJ+0IivG9G3lrfhbbEl/6heNFpPMKDg45OfVHTt5Nx5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5yV/dtQhLn6TpQlYVtE/zKo128dU0yQUf2JX05RvLqMy1/dbHmogOtjyOeJbQ/a+M+Wei2dNCNBA+92tVYQgqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5HsVSrJFSVrvvaY7PR3ixMRXsFKqzHfSxFa0nNfIYsMMtdFSB20+/246yCxBa0iZ7H/f1MUHf5Dzuf6G1f8b+Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"phtNWuw+s6rlNwVt+PgyXTrg6l5QLytx7A99mWlFHdlXhJL4kT/E9iSGoutU5nmVGqVI3T3Obc3xqaPT+bwXfg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"aAMaFvYTgfSBuYdQERL3b9Xb4y6DLfKf84wtfL2tPRV/xjdXpuj0KjqJw8whNopkCdOGwP3J+xxlaenyfn1vSw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sy7aCwhwl53QGymG4qlTarx+z2YHt4nXhRTBuAcWdOhF07Ij0G908kNJjOLRO5ppCXoVdpGgYqpE79xcPYKrbg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rpKHlFQBR86UZnlEIb/JUNuzYLbwpF9cGl83jhh7j+sAC1Tg5OFW1aBqxfRscgFKuv2CCQzyUo3mltKsZuhkeg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GUka0bGpN9vw5UjP5hLNkNF3AhMj7opdkFi47Ieo+X5iBcP5Nir7Z5XnPS9fqi9psrSuUellKOc9kvKNhTLKSg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G+7GSHxC1vZePPrygv70woPAyfm1B0A6QSGEYqzsuFVrYQjc+VpnQcZRxujJK45wdEA8gJljp6nEUIoe2fvX5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OO7U2vDRqdsXYGH97YoH9B90ZvpcknnSYgkqDV0h5RZea0Ot1MDC26QlSuT7K+ue0baNFqJcHEXT1YjZaMcbaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y0/pWqx4XTKb4JVmh0gfBQffJ31hYcE4GlolQot5/qpJ+0IivG9G3lrfhbbEl/6heNFpPMKDg45OfVHTt5Nx5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5yV/dtQhLn6TpQlYVtE/zKo128dU0yQUf2JX05RvLqMy1/dbHmogOtjyOeJbQ/a+M+Wei2dNCNBA+92tVYQgqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5HsVSrJFSVrvvaY7PR3ixMRXsFKqzHfSxFa0nNfIYsMMtdFSB20+/246yCxBa0iZ7H/f1MUHf5Dzuf6G1f8b+Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"phtNWuw+s6rlNwVt+PgyXTrg6l5QLytx7A99mWlFHdlXhJL4kT/E9iSGoutU5nmVGqVI3T3Obc3xqaPT+bwXfg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"aAMaFvYTgfSBuYdQERL3b9Xb4y6DLfKf84wtfL2tPRV/xjdXpuj0KjqJw8whNopkCdOGwP3J+xxlaenyfn1vSw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"Ufjv3hvwfqBgqs7OnX08CUUMlw4/dmg/7IKXzc5MiGJCMip2Ox5TDBPv475Oht/CJDzyvsZXMpVB7SKxQ360AA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sy7aCwhwl53QGymG4qlTarx+z2YHt4nXhRTBuAcWdOhF07Ij0G908kNJjOLRO5ppCXoVdpGgYqpE79xcPYKrbg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/hello","func":"Render","args":[""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"KNkB0oJFyh1bK4wGDRVHRN2EgBKq0WaB4eyu/407jjJWaRUTOHlV3o5efsUu0mtvmno0EsBWAK862uNB/9feug=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rpKHlFQBR86UZnlEIb/JUNuzYLbwpF9cGl83jhh7j+sAC1Tg5OFW1aBqxfRscgFKuv2CCQzyUo3mltKsZuhkeg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GUka0bGpN9vw5UjP5hLNkNF3AhMj7opdkFi47Ieo+X5iBcP5Nir7Z5XnPS9fqi9psrSuUellKOc9kvKNhTLKSg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g2Ogh/Y5E59Gqy0SRh3q+QKx8BGVDqh7WfJwzXq29HdJl5np6YsNGgXki046dtIYXM7Vk6YqhbVWpWlx5D/jhw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G+7GSHxC1vZePPrygv70woPAyfm1B0A6QSGEYqzsuFVrYQjc+VpnQcZRxujJK45wdEA8gJljp6nEUIoe2fvX5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OO7U2vDRqdsXYGH97YoH9B90ZvpcknnSYgkqDV0h5RZea0Ot1MDC26QlSuT7K+ue0baNFqJcHEXT1YjZaMcbaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G+7GSHxC1vZePPrygv70woPAyfm1B0A6QSGEYqzsuFVrYQjc+VpnQcZRxujJK45wdEA8gJljp6nEUIoe2fvX5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OO7U2vDRqdsXYGH97YoH9B90ZvpcknnSYgkqDV0h5RZea0Ot1MDC26QlSuT7K+ue0baNFqJcHEXT1YjZaMcbaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y0/pWqx4XTKb4JVmh0gfBQffJ31hYcE4GlolQot5/qpJ+0IivG9G3lrfhbbEl/6heNFpPMKDg45OfVHTt5Nx5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5yV/dtQhLn6TpQlYVtE/zKo128dU0yQUf2JX05RvLqMy1/dbHmogOtjyOeJbQ/a+M+Wei2dNCNBA+92tVYQgqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5HsVSrJFSVrvvaY7PR3ixMRXsFKqzHfSxFa0nNfIYsMMtdFSB20+/246yCxBa0iZ7H/f1MUHf5Dzuf6G1f8b+Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"phtNWuw+s6rlNwVt+PgyXTrg6l5QLytx7A99mWlFHdlXhJL4kT/E9iSGoutU5nmVGqVI3T3Obc3xqaPT+bwXfg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"aAMaFvYTgfSBuYdQERL3b9Xb4y6DLfKf84wtfL2tPRV/xjdXpuj0KjqJw8whNopkCdOGwP3J+xxlaenyfn1vSw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sy7aCwhwl53QGymG4qlTarx+z2YHt4nXhRTBuAcWdOhF07Ij0G908kNJjOLRO5ppCXoVdpGgYqpE79xcPYKrbg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rpKHlFQBR86UZnlEIb/JUNuzYLbwpF9cGl83jhh7j+sAC1Tg5OFW1aBqxfRscgFKuv2CCQzyUo3mltKsZuhkeg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GUka0bGpN9vw5UjP5hLNkNF3AhMj7opdkFi47Ieo+X5iBcP5Nir7Z5XnPS9fqi9psrSuUellKOc9kvKNhTLKSg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g2Ogh/Y5E59Gqy0SRh3q+QKx8BGVDqh7WfJwzXq29HdJl5np6YsNGgXki046dtIYXM7Vk6YqhbVWpWlx5D/jhw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fxllR6psdh00kEGZ13C9GbUK0Ef763WPehcu0Cw3nGtHQMEnFJ0baEOT+exnK2rMPsDSlzRV3GeWc9D5Y5hpnQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Jk87FQTiUyvACAZ+LXzQSym4xFBwjT7dEmlXCfrKoc4Gfulki9zLJCPpYtTdAsB+d5VdkEab3Ywx1WECm0Rgxw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RszGJc/GTwskYskc82z9WfRUfdmMT1EXnBBa+lbhuQ4SkgiFx6EOJ4R66i5xQI0vjccEkufBvsX58LYnhKiiyQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AmnwZ3Grd2QW962s+rEn2QvuwFWhhFC3k8e6k+Lpq6hJOVqgbGWXGtPemqSHwmML62Za8Hyzcao9Y4zuXM8JCQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qTF3punEcwvO68Sd3WkL3bq2LYi47P0SJJUwi0gdsr9jYV1LcJLfDV6eTLRD+AuX4uKgi1ZZ3/UNxYjaFRigLg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"V+qs5vyCMaGRN+TxNYqX79rypwMK4oypWzFZog0zaIZhjcUpVL/iA5OpTIsNrI5U7X9b04dfDcrC/Vm3hXHzgQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0K9XFITRAZscBYnBZcuQ5o3kT954xWmHuOiQUoAxuMJsUSX6CblwCm7YE8j5ELDvE8STnvKC40K17ohGu0iylA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"elgK/N388Iz5oKDzZr4t0dmeBaamC4VtBPzMHFYz47hNFvqHsHgJuL3lEtTQw0HqCOmDqlo96PIMrq/xL1JNeA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"pOrIun9Eu7qyQNMRBdIGDif+bSXhwkPCL+N1/5npNtsGb4xMhxpBP3yT/Lq9VmotatYExusB8zv67uyJj6EKbQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qGV+uH7f3tTjf4VArb1QF6YX67Yak7wU0MmT+U8zR0M6e8LJUfqufu1Ed8lAv7oQ148sTBHm7lG9BA0sBPT/hw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G+7GSHxC1vZePPrygv70woPAyfm1B0A6QSGEYqzsuFVrYQjc+VpnQcZRxujJK45wdEA8gJljp6nEUIoe2fvX5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OO7U2vDRqdsXYGH97YoH9B90ZvpcknnSYgkqDV0h5RZea0Ot1MDC26QlSuT7K+ue0baNFqJcHEXT1YjZaMcbaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y0/pWqx4XTKb4JVmh0gfBQffJ31hYcE4GlolQot5/qpJ+0IivG9G3lrfhbbEl/6heNFpPMKDg45OfVHTt5Nx5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5yV/dtQhLn6TpQlYVtE/zKo128dU0yQUf2JX05RvLqMy1/dbHmogOtjyOeJbQ/a+M+Wei2dNCNBA+92tVYQgqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5HsVSrJFSVrvvaY7PR3ixMRXsFKqzHfSxFa0nNfIYsMMtdFSB20+/246yCxBa0iZ7H/f1MUHf5Dzuf6G1f8b+Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"phtNWuw+s6rlNwVt+PgyXTrg6l5QLytx7A99mWlFHdlXhJL4kT/E9iSGoutU5nmVGqVI3T3Obc3xqaPT+bwXfg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"aAMaFvYTgfSBuYdQERL3b9Xb4y6DLfKf84wtfL2tPRV/xjdXpuj0KjqJw8whNopkCdOGwP3J+xxlaenyfn1vSw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sy7aCwhwl53QGymG4qlTarx+z2YHt4nXhRTBuAcWdOhF07Ij0G908kNJjOLRO5ppCXoVdpGgYqpE79xcPYKrbg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rpKHlFQBR86UZnlEIb/JUNuzYLbwpF9cGl83jhh7j+sAC1Tg5OFW1aBqxfRscgFKuv2CCQzyUo3mltKsZuhkeg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GUka0bGpN9vw5UjP5hLNkNF3AhMj7opdkFi47Ieo+X5iBcP5Nir7Z5XnPS9fqi9psrSuUellKOc9kvKNhTLKSg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g2Ogh/Y5E59Gqy0SRh3q+QKx8BGVDqh7WfJwzXq29HdJl5np6YsNGgXki046dtIYXM7Vk6YqhbVWpWlx5D/jhw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fxllR6psdh00kEGZ13C9GbUK0Ef763WPehcu0Cw3nGtHQMEnFJ0baEOT+exnK2rMPsDSlzRV3GeWc9D5Y5hpnQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Jk87FQTiUyvACAZ+LXzQSym4xFBwjT7dEmlXCfrKoc4Gfulki9zLJCPpYtTdAsB+d5VdkEab3Ywx1WECm0Rgxw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RszGJc/GTwskYskc82z9WfRUfdmMT1EXnBBa+lbhuQ4SkgiFx6EOJ4R66i5xQI0vjccEkufBvsX58LYnhKiiyQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AmnwZ3Grd2QW962s+rEn2QvuwFWhhFC3k8e6k+Lpq6hJOVqgbGWXGtPemqSHwmML62Za8Hyzcao9Y4zuXM8JCQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qTF3punEcwvO68Sd3WkL3bq2LYi47P0SJJUwi0gdsr9jYV1LcJLfDV6eTLRD+AuX4uKgi1ZZ3/UNxYjaFRigLg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"V+qs5vyCMaGRN+TxNYqX79rypwMK4oypWzFZog0zaIZhjcUpVL/iA5OpTIsNrI5U7X9b04dfDcrC/Vm3hXHzgQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0K9XFITRAZscBYnBZcuQ5o3kT954xWmHuOiQUoAxuMJsUSX6CblwCm7YE8j5ELDvE8STnvKC40K17ohGu0iylA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"elgK/N388Iz5oKDzZr4t0dmeBaamC4VtBPzMHFYz47hNFvqHsHgJuL3lEtTQw0HqCOmDqlo96PIMrq/xL1JNeA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"pOrIun9Eu7qyQNMRBdIGDif+bSXhwkPCL+N1/5npNtsGb4xMhxpBP3yT/Lq9VmotatYExusB8zv67uyJj6EKbQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qGV+uH7f3tTjf4VArb1QF6YX67Yak7wU0MmT+U8zR0M6e8LJUfqufu1Ed8lAv7oQ148sTBHm7lG9BA0sBPT/hw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1mG5XOwHMust28kEm3mU5xzlTNeuJxEI+RA9vXMY5LQ+7QKHH35Jr2MbeW/40vVk82bWtxdFX4a/Cw+D142gqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"kRBCjz7SITeivFCjgohy0TzMjqmPbXOAdacH/frLPbItHCaaTfF/tIWQUP3F9HYh8EG2c5SPgocLKIIyGDNkXQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"xxvYsUyp3A1KK4xIchgEBHsX6QVAf3Lqk7uQSwj8vZAayELv25Jo/enGiXzyopH0bXyuKlGjfdcHKR5dQ8VfoA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qGsJYQgoLimEZzLKR2BmxQx9fxl6v34tQRITkUrtPP9jiYcHUUZuMQmHlzkhE29JJh1bCdm6QAkc2aBOdLasNQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"C2KNw9POqmtvQyAXaYkjQQHq1a/iRr5Eu88HdwxF8KEzIedIpAuOlyBgGwHkFwIkLYIpPVhR8cJXoHzLsV3w0w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"git0TH08GJKUkdmOH1EHjlcpBFDgOBgqikHZNPTh/ktORDUoO3izV7WKK6TZTy8OxFDUkbC14sb3W9M8M/GQ1Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fYL42+rtkVaR4A+Ecp8sud6vaYKciPf+EeRcDOUfldErs1lCToaCfZjxs4DJ9J+iMcIjyg1cczuRr2EjviVo8Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"MRBFuxxpHJKm7Ua4WhGZiukEHi3j3F4CmXk72CKVuXlwQogd8Av0g4ji9S/2L0ZH+5z6c9s0ap+7vBYzE4G7SA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"B8ieqH3XjzVqB4no0OQDCO66Bqs0+LQD6AYba+oYmy05OVyxX7xwszootmv5eYMSUt2USWN8Shf3HN9NtGLoMA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5MOLSFMZ+PxHoR2y6rwrFxmYle57dtILpWY4n364JiNgQA5yKkpjQ223Srufb3yJfTrqPtshw/AYf6eYraKEXg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"TQIr0tLmfAvldbLdDnZHnI/Stxnxj5Ha8XJFHg9MKBpd80W9A7n5IKsxwn+gGAvOrZWE969vmYLAYx2qPpjR4Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g7pC5xf9HvIZeyO82aJzbqnMXXu7cC30bkJ3h90n96VVUL2Vs3m7hGYq64GolwQLkLYCy4BoqI0K1KmWgKnfJw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"b2dNMfD+K2Un28ji+Kegt7t8uVXvASPh+KjcRT4NHHMLJXCevBmYCvISIpxRYnXZrd3eU7Z3/Ui6inIP7N8RdA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"S0gWccFnm8zInib2yPeMOAS88+xh22BZya0HhikfYNMrkHFPHt0seGW+KTIuaWAUiT79gYYViFdBRnaBvYnr1A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RxXliVI+xdd8IXpvBtrhOOR4CfjeFqcFAzu5U04wG4QEv9J6QMzdCUYS0fabGbizUg0YIbxjduJpsbgFb29w1Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"wE4jDZd9BoDYT2Hrre6Go9Evu07/Y/ylQE90p/f9961pJdE1VWGIVKa9e6cd3V0WhyEiCDUvgMrwksMkDSUGOA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3ZzJTYMP9kyHozVzuoZqiKZp257HaTcp71hiel+FxxEL2cC6j24v1TssBoqwUARYEHkek6yj1WAY4BCYOtA4HA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1JArJ2bOzc6Im5SDgNjDsqrF/N0KCLz558ntuub/pXNuSWt6gFsFir4Eerg27tCvV7zugZWz3HLn+ErAq4Khaw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"32oPuVz4U2LnUF+wUgmEog8LVSR64r1vdzjbylfDdZ0KCppQFyo172eglV9rs8SYl7z6qM+qt2inUWv1N6lHhw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"i3aH29nsx2BoRynHURfBnHv61NNC0uILP2n2A0t1hb9NOfNyiIaMbQS9ETrN++NjuLfXyxngi3IYRF5KoMn/Vw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Pz9ao+RnNprgUh5dTOFfwQR5jdQQYrMZTqLUMWJaBoci/jNujl9UjySXNIc2TQepTydtSpRM5uJ/i0AgwhqoFg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"MlzY0Q3IX2ngoI4OvP0QgkotoyYAWSKxeMU5gTRSde5YgezoQ6fKwrAiQLbfy+7WoCbvU7nGRMHVS2K7akyjrw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"useHxyDXK73e0vvkiWDmU97QH8+Gr6HBlMj2sFx44OUq4PFWAyTIFTzr4QpYBDeUjy1ee3K9zZJg/Ianifv/dA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"DUQ7Cs76HHQ6J5XqyMDf1oCufOMtfboZWG4Rh2QAayMohxQAHzOnYp9PoB/J48SsJ8A0oL006IvZIvyAZ5dL8w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9bkNRN9vkR2cUl1WAIWcfv3pdasg5IKeGCl8QgrZVgJyHLnkcS1Lef02X3do1rlMui0RvtVRR2ytwb06ASS+UA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"BnCMNzUTpTJp0S1e37t3f8iHMTG4XzsP2RRBHwahkbcDqkLICPEpSiTVGCX4QNx6cBAz3iziRarVJ5xptyitxQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qp0FSC+cM7IB97Qg8d9r2JRuUhjmDjTk4L3R0DJVi2MXbz4uLfq3su98EUx6B4RR42Tg+rmJVYfGUZyzMLdLHA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"CXBKJuKxHBysTXgegvOLbc3dBTUqJFl5epQkGZjtfSNX/77i8UoYqeqyymTEaCYif/gkxjx1gYds8FfI8gyOcQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3G2uA8tHcb8LMk9rSOqrSx7bmXAJqRpgR4qTxwXny14ecYHLrZYoN6ol7YYAcOgrgFjIEYn7YD8Tg+g77d/5Lw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"d6ZnqzlgPJwIxh9lesfGStq4zP8wgRinGwgRvLpxCSlMYmydxBcgSqiRGhoaYQdN6D3esRBX090t3R1K1J4O9Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"v9SiD7vZsgjiww5M9RoDgyqXS9a54OPeldsk+igGOX4WVNerR2gdcfTewJFtz6r0+sMzxUM3y0TCClSJppZHjw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"/tWgpynW1EbDE2200qHkRdAyOXNtJOIr9AZ9JvJQ0HNi+Ap7FNuqqwZsFscX9cgg71b5XIon2c9zws1u29e2Nw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"XZFlkN9x7Ni7ZZ+h7FhmmH3VCok1E7ZqIYCrK5r+aoh9+hMMHfucBz/69Sr3MAGj6e7yTjT1NT0Ol6GZlv3LWQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3Z4tpmdimv5cGEsCfhDxHunUcYm2GF2sYjLbva34AQgzDyn45uRG7qcRBQkgK9FaKNU7jiOJdhOEBaS4rwRLrg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"BFWKchFXQz8ctgj9RvJ1bhL3+UWRIC0P9h9SLUFN7QgOppSDXqnx8bRCxz9BfVPUpmhGhfuQE8QhID7yEG0tdQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RIQIgtR6jKCENISFZsF21Bauz6CR42iH8vVMv6jzdw5afK9BUZiq8LqRYPSlAPcyuGGeXqw1vRJ8iGYsfqJbmw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G+7GSHxC1vZePPrygv70woPAyfm1B0A6QSGEYqzsuFVrYQjc+VpnQcZRxujJK45wdEA8gJljp6nEUIoe2fvX5g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jazghxvvgz3egnr2fc8uf72z4g0l03596y9ls7","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"wH+LoltDYgboXvMuDW38uEFWEyHV8i8e3wc8z0Q0ZooehS6ot5wtG6knNG/dA9d7jLNVILy45J0kWp+0b8Ti6g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y0/pWqx4XTKb4JVmh0gfBQffJ31hYcE4GlolQot5/qpJ+0IivG9G3lrfhbbEl/6heNFpPMKDg45OfVHTt5Nx5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5yV/dtQhLn6TpQlYVtE/zKo128dU0yQUf2JX05RvLqMy1/dbHmogOtjyOeJbQ/a+M+Wei2dNCNBA+92tVYQgqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5HsVSrJFSVrvvaY7PR3ixMRXsFKqzHfSxFa0nNfIYsMMtdFSB20+/246yCxBa0iZ7H/f1MUHf5Dzuf6G1f8b+Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8+Qa4KNWtVmtJZX+K52Ej21ft01dOcX2NN8xk4gCkZ0UakqPCACBquWqVMQ1tsO/LOfNdhgH4uBdiB6xCdwGYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","malek","https://github.com/MalekLahbib"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"yLYTDrz/J0OLM0VLn/6oja+AhC3r6BMZYPuej/8Zm00A2JWyaFtYZk1zXmbb+V/BFJk+Nrmywg4rXdvKdNoCpQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G+7GSHxC1vZePPrygv70woPAyfm1B0A6QSGEYqzsuFVrYQjc+VpnQcZRxujJK45wdEA8gJljp6nEUIoe2fvX5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OO7U2vDRqdsXYGH97YoH9B90ZvpcknnSYgkqDV0h5RZea0Ot1MDC26QlSuT7K+ue0baNFqJcHEXT1YjZaMcbaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"y0/pWqx4XTKb4JVmh0gfBQffJ31hYcE4GlolQot5/qpJ+0IivG9G3lrfhbbEl/6heNFpPMKDg45OfVHTt5Nx5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5yV/dtQhLn6TpQlYVtE/zKo128dU0yQUf2JX05RvLqMy1/dbHmogOtjyOeJbQ/a+M+Wei2dNCNBA+92tVYQgqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5HsVSrJFSVrvvaY7PR3ixMRXsFKqzHfSxFa0nNfIYsMMtdFSB20+/246yCxBa0iZ7H/f1MUHf5Dzuf6G1f8b+Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"phtNWuw+s6rlNwVt+PgyXTrg6l5QLytx7A99mWlFHdlXhJL4kT/E9iSGoutU5nmVGqVI3T3Obc3xqaPT+bwXfg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"aAMaFvYTgfSBuYdQERL3b9Xb4y6DLfKf84wtfL2tPRV/xjdXpuj0KjqJw8whNopkCdOGwP3J+xxlaenyfn1vSw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sy7aCwhwl53QGymG4qlTarx+z2YHt4nXhRTBuAcWdOhF07Ij0G908kNJjOLRO5ppCXoVdpGgYqpE79xcPYKrbg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-8","The More You Gno 8: Portal Loop, Test4 and More","\n\nWelcome to the 8th installment of The More You Gno. Because we have a lot of great updates, we're experimenting with a different article format that's cleaner and more to the point.\n\nIf you want to dive deeper, we have the weekly engineering [updates](https://github.com/gnolang/meetings/issues/37) and video [recordings](https://www.youtube.com/watch?v=9ch7MhKNBmw\u0026list=PL7nP7r1QiDktMCdw1ydQo2crM3y6Zk7E4) available. \n\n## Gno Core Updates\n\nThis edition is packed with great updates, but the most important ones are the launch of the Portal Loop testnet, and the announcement of the next milestone on the road to mainnet - Test4.\n\n### Test4 Milestone is Live\n\nThe next major milestone on our road to mainnet is Test4. This testnet will have several important improvements:\n\n- Multinode capability\n- Rolling release of testnet binaries\n- No resets\n\nThe initial validator set will be comprised of the most prolific contributors and All-in-Bits teams. We're aiming to launch Test4 in July, and with 32% of the milestone complete, our confidence in the launch date is high.\n\nThe entire milestone can be seen [here](https://github.com/gnolang/gno/milestone/4).\n\n### Portal Loop is Live\n\nPortal Loop is an always-up-to-date staging testnet that allows for using the latest version of Gno, Gno.land, and TM2. It can run the latest code from the master branch on the Gno monorepo, while preserving most/all the previous the transaction data. \n\nFind out more about the Portal Loop in the [documentation](https://docs.gno.land/concepts/portal-loop/).\n\nWe've also enabled the [gno.land faucet](https://gno.land/faucet) to receive testnet funds for Portal Loop.\n\n### Gno Playground now supports multiple networks\n\nWith Portal Loop live and Test4 coming, it made more and more sense to be able to use Gno Playground on other networks. That's why we've added support for not just Test3 and Portal Loop, but also any custom network you might want to spin up.\n\nThe network selection dropdown is in [Gno Playground](https://play.gno.land/) at the top right. You'll also find there an option to add your own custom network. \n\n### Changelog\n\nWe've also done a ton of other work to make everyone's lives easier.\n\n- Docs are now searchable on [docs.gno.land](http://docs.gno.land/). No more manual searching!\n- With the help of Onbloc, our tx-indexer [just went supersonic with GraphQL](https://github.com/gnolang/tx-indexer/pull/20). Users can now have fine grained filtered GraphQL queries, which are curiously quick. This is a quantum leap in data serving for the indexer.\n- [Added support for `gnoland secrets`](https://github.com/gnolang/gno/pull/1593), part of our [larger effort](https://github.com/gnolang/gno/issues/1836) to overhaul the way Gno chains / nodes are initialized. Now users can directly manage, display and verify their node secrets, without having to rely on manual CLI magic.\n- Finally merged in [support for a non-reflect JSON parser package](https://github.com/gnolang/gno/pull/1415). Rejoice, JSON support is now provided out of the box with an easy to use Gno package, thanks to the Onbloc team.\n- Merged in support for [int256](https://github.com/gnolang/gno/pull/1848) and [uint256](https://github.com/gnolang/gno/pull/1778) packages. Since Gno does not support `big.Int` yet, these packages are a nice and much-needed replacement for large number logic.\n- [Implemented shadowing rules](https://github.com/gnolang/gno/pull/1793) in the GnoVM. This VM fix prevents packages shadowing global-level identifiers.\n- `gnodev` now [automatically reloads the gnoweb page](https://github.com/gnolang/gno/pull/1457) whenever you update the realm's code. The goal of gnodev is to make realm developers' life easier. This change further reaches that goal, creating a feedback loop for development similar to that experienced by front-end developers (ie `nodemon`).\n- Plethora of quality of life fixes and improvements, including [docs updates](https://github.com/gnolang/gno/pull/1741), [command fixes](https://github.com/gnolang/gno/pull/1716) and [conformity to the standard go tooling suite](https://github.com/gnolang/gno/pull/1407). Updates like these keep the lights running and the UX smooth for end-users.\n- [Merged in the `cford32` package](https://github.com/gnolang/gno/pull/1572) to the Gno package examples. Packages like these help the community and implementation partners in utilizing Gno effectively.\n- Cleaned up and exposed an [endpoint for querying transaction results](https://github.com/gnolang/gno/pull/1546) directly from the node. Even though our transaction indexer (standalone tool) offers many bells and whistles, having the ability to fetch transaction results on the node was the final missing piece in keeping the TM2 RPC minimal, but functional.\n- Gnodev now [supports account premines](https://github.com/gnolang/gno/pull/1938), soon to support transaction predeploys. It is also now installed out of the box with make install. This means that you can now specify an account balance to be premined when using gnodev, no clunky balance file changes required!\n- Added support for [WS clients, updated JSON-RPC batch processing](https://github.com/gnolang/gno/pull/1498). Switching all of our tools, and implementation partner tools from the HTTP client to the WS client will be a massive boost in terms of network overhead.\n- We've updated the `gnoland` (node) command [to include](https://github.com/gnolang/gno/pull/1954) the `genesis` management suite. As part of our bigger effort to overhaul the chain initialization and management flow, this was a necessary step in achieving a 2 step setup (`gnoland init` and `gnoland start`).\n- Updated the deployment flows (releases) for the vast majority of our tools (faucet, indexer, supernova, main gno binaries) using go-releaser. Now the core team can tag specific tool / repo versions and have a prepared release, with all release binaries ready to go.\n- The gnoland node [now supports telemetry](https://github.com/gnolang/gno/pull/1762), and exposes metrics out of the box. This allows the node to be tracked in time-series databases like Prometheus, and better record the health and performance of the node.\n\n## Ecosystem Updates\n\n### Onbloc\n\n* Adena wallet [v1.10.0](https://github.com/onbloc/adena-wallet/releases/tag/v1.10.0) released \n* Adena [Security Evaluation Report](https://github.com/adr-sk/adena-extension/blob/main/audits/Adena%20Security%20Evaluation%20Feb%202024.pdf) published by the AiB security team \n* Published a [short video guide](https://www.youtube.com/watch?v=TfSzp1_MaOI) on how to broadcast and sign a transaction using the AirGap Account.\n\n### Teritori\n\n- Linked the GitHub account with on-chain address. The realm allows a bot to add a public key. The bot can sign the address and GitHub ID account. This functionality permits everyone to link their account on the realm seamlessly.\n- Social feed, DAO SDK, and Moderation DAO deployed on portal loop: https://app.teritori.com/feed?network=gno-portal\n\n### Dragos\n\n- Flippando\n - Public faucet set up\n - Fixed and slightly improved the multi-chain dashboard at https://flippando.xyz\n- Zentasktic, an on-chain project management application \n - There is the Zentasktic core first complete implementation. A package containing an unopinionated implementation of the Assess-Decide-Do workflow. \n - Docs and code: https://github.com/irreverentsimplicity/zentasktic-core\n\n### Berty\n\n- In order to avoid the misconception that it's an official social dapp, GnoSocial was renamed to [dSocial](https://github.com/gnolang/dsocial)\n- Demo video of the customer journey, showcasing the updated social app UI https://www.loom.com/share/621f151459b040b0a2e6a22adf96b371\n- Building out a series of Gno Native Kit tutorials ([Episodes one and two](https://www.youtube.com/watch?v=N1HLyQDHGQ0\u0026list=PL7nP7r1QiDktseW7786wrp23ipBZFLPb6\u0026index=2))\n\n### Student Contributor Program\n\nWe've started a [program](https://github.com/gnolang/student-contributors-program) to work with student cohorts directly through their universities. The first university cohort is based in Roeun with four students currently particpating in this initiative. You can see some of the work in our hackerspace [repo](https://github.com/gnolang/hackerspace/issues/59). \n\n- Malek was cited for the 2 PRs ([ufmt multibyte](https://github.com/gnolang/gno/pull/1889) \u0026 and [todolist example V0](https://github.com/gnolang/gno/pull/1811)).\n- Malek also finished V0 of GnoFundMe, a crowdfunding example.\n- Theo made a [pull request](https://github.com/gnolang/memeland/pull/21) on issue#11 of the memeland repo. \n\n### New Content\n\nWe're regularly building out written and video tutorials and content. We recently released the '[How to build a realm using Gnodev](https://www.youtube.com/watch?v=Hp4aeRsPt3g)' video tutorial that starts with the basics of initializing a gno.mod file, creating a Gno realm, and implementing simple functions for effective realm visualization. \n\n## Events and Meetups\n\n### Past events\n\n#### Go to Gno Korea (March 23)\n\nTogether with Onbloc we hosted the Go to Gno workshop. The 8-hour session included a lecture, a builder challenge, and a networking event. 25+ developers from dev communities, Web3 startups, and the Cosmosnauts in Korea have attended the event for a hands-on experience of writing a simple app in Gno. Check out the [Onbloc's recap](https://medium.com/onbloc/go-to-gno-recap-intro-to-the-gno-stack-with-memeland-284a43d7f620) for more details and pictures.\n\n#### Gno.land Tokyo meetup (April 11)\n\nIntro to Gno session in Tokyo was held in front of 20+ developers and web3 enthusiasts. They got to hear about Gno.land, how it's developing as an ecosystem, our plans for the future, and how they could get involved. That's the TL;DR, full recap is on [our blog](https://gno.land/r/gnoland/blog:p/gno-tokyo).\n\n### Upcoming events\n\nWe've got three major events coming up\n- **GopherCon EU** / Berlin / June 17th - 20th\n- **GopherCon US** / Chicago / July 7th - 10th\n- **Nebular Summit** / Brussels / July 12th/13th\n\nIf you plan to attend any of these events, find us at our booth or on the hallway track, and let's talk!","2024-04-26T00:00:00Z","Kouteki","gnoland,ecosystem,updates,gnovm,tm2"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"VsA6un0NDtc3ARI9AXO0yJpON4g4r17qUifs11/jHBp46BdGoG7NC4fq/7Wv2kaKcab4OfXeWhYrjs+kS8h9qw=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rpKHlFQBR86UZnlEIb/JUNuzYLbwpF9cGl83jhh7j+sAC1Tg5OFW1aBqxfRscgFKuv2CCQzyUo3mltKsZuhkeg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GUka0bGpN9vw5UjP5hLNkNF3AhMj7opdkFi47Ieo+X5iBcP5Nir7Z5XnPS9fqi9psrSuUellKOc9kvKNhTLKSg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g2Ogh/Y5E59Gqy0SRh3q+QKx8BGVDqh7WfJwzXq29HdJl5np6YsNGgXki046dtIYXM7Vk6YqhbVWpWlx5D/jhw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fxllR6psdh00kEGZ13C9GbUK0Ef763WPehcu0Cw3nGtHQMEnFJ0baEOT+exnK2rMPsDSlzRV3GeWc9D5Y5hpnQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Jk87FQTiUyvACAZ+LXzQSym4xFBwjT7dEmlXCfrKoc4Gfulki9zLJCPpYtTdAsB+d5VdkEab3Ywx1WECm0Rgxw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RszGJc/GTwskYskc82z9WfRUfdmMT1EXnBBa+lbhuQ4SkgiFx6EOJ4R66i5xQI0vjccEkufBvsX58LYnhKiiyQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AmnwZ3Grd2QW962s+rEn2QvuwFWhhFC3k8e6k+Lpq6hJOVqgbGWXGtPemqSHwmML62Za8Hyzcao9Y4zuXM8JCQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qTF3punEcwvO68Sd3WkL3bq2LYi47P0SJJUwi0gdsr9jYV1LcJLfDV6eTLRD+AuX4uKgi1ZZ3/UNxYjaFRigLg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"V+qs5vyCMaGRN+TxNYqX79rypwMK4oypWzFZog0zaIZhjcUpVL/iA5OpTIsNrI5U7X9b04dfDcrC/Vm3hXHzgQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0K9XFITRAZscBYnBZcuQ5o3kT954xWmHuOiQUoAxuMJsUSX6CblwCm7YE8j5ELDvE8STnvKC40K17ohGu0iylA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"elgK/N388Iz5oKDzZr4t0dmeBaamC4VtBPzMHFYz47hNFvqHsHgJuL3lEtTQw0HqCOmDqlo96PIMrq/xL1JNeA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"pOrIun9Eu7qyQNMRBdIGDif+bSXhwkPCL+N1/5npNtsGb4xMhxpBP3yT/Lq9VmotatYExusB8zv67uyJj6EKbQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qGV+uH7f3tTjf4VArb1QF6YX67Yak7wU0MmT+U8zR0M6e8LJUfqufu1Ed8lAv7oQ148sTBHm7lG9BA0sBPT/hw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1mG5XOwHMust28kEm3mU5xzlTNeuJxEI+RA9vXMY5LQ+7QKHH35Jr2MbeW/40vVk82bWtxdFX4a/Cw+D142gqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OafnT4afLpL7qFHNrul35ZJlo5+hU67Xxs8yqwOzjG5/mPeyupBuI9+Rd2iRVVKAjXu1GXdIb2OcClcjA7cI9A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"7aEDjN2HbRwfqNRZ+f0c2nlcO1QDwnFPCxbHxqo1eZdvZaF05WvpR3my6t21pnG9WlrilcQ1z2U4T+57TypoEQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Irm8ls1rjxcY2+YeI6mVGzd2BUjM1etAtAaXc0aeP8J6mT2/TGBv6Arvk/uvbAEk8kp+eD++kSSo9xtXwuEmhg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"+Z15it8KYyOqYjZrPF6rxRxRAL6CIp9C72Vu9oQ4BQs8oo9bSKvHyTF1d0HM7mVaIcD0qhxDHPpWuu2uctL5lw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"gSr7sG602n743L9oAqrQXJzLsDdNIPTRh1MM28elrHUKJhrjyLMAXn63Wjl9AYP5H/hcVAMgXAkSCEHXskuI/w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"zUycDLAi8A4dfg4wh80DNTiCtk8suq3vDUyMt/YU1rkvorcY1vefYr5yt8sf/g3/frItpRxFXzSXcr9HW2ikWQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"eyDc7xCllQEehnTVHbO0JDi4L10m5QHNlScMfHceCt9VRSMmHTzydUeB8/P86Xo3EKGWgJW1wU98n3yJmwSV6A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"mDcNh7Ig+R/ZNNoIsKuE/t8apzZLeqsL5GvOQh6vOfYhpBGlSrQSWgjU8W8yTljtZ9nRIq4iXlinAPyL98CI9g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"+MLkrKCzqLbuPCI3u49qrNdWBDMS5jzmAGyAmt5gdHspWknyKKe3zjZdZyEibhq023n1/1Ntxr+skJg0A5pbFw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"oAQRHAr9+Kn0ujvNvXzupkAH0z5FB+6H60LyMt5gC60QDG7uyjYtMmGkiUnkgQVuivoSmerDxR7kch0d4xQ2Ow=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ehS2t3U1sdgEHkfu+0ZT15fkz/uWzX9NbTDRSje/vSpPJgwjDsPBTlA9wuHoxcEmseqTXaaoapEuAKJu6jhbww=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Tq/1WU27CDniM2SZgI5nGjTbd40EWsPV62360P7ilCRfD4P0EXmlYs0UaFIiIbFReiG/NysoNc/EKuyeiB4xGg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RKezAr5xDAXg64ni1EWEhazuj5w3yLh+nTXCkrCi/S40KjjPpiW3eNxbkrmr632oj6iKzs5Qr9u1R5hbLJMgoA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"CcRZPu/Ymhu6uwtvfJM6WNPL5Tr3rZNt6XeuiuGf35UmqasbskjH5j9LxGK0VMNjYULXECMPR+HQeuM9Ygy46w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"KazKEIt2tVC0d+E0XzLhg8RwcNSoe3vEELfr8G5FJw9qHJmj6BU4rBU9OkLtuvGXKGi1Y0dnU8r0/MoSK7e+3A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"bxunmnqo8gOQlIJp+ctK6n4+iwTOzp2B8ECkjKxnvsAvjEMdRtO6+h4+NIcgskxqPoq4H84Ctfvw9aHyCWUrfQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"TDeHlzda5gx7KLmn5selknHe2q9MCjjmP/GCUPSZMxEJh/zdhTHPxQ2jjmqlZZQbI6mi50oclVL9p/hOdZQbAw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"MeP3VKvSD/ul9SRurNRjN/CKQRlORlXLs+gFZ0UP7nkgU3RzhfkOjgE5W09Vyr0MYzUGl6Wttg83bcreq3csMg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5JSwU8nKMV3fELH9mfILkC0KlV3O+yZTO6/2F1ozo2AHoiS4shE02mjFdkBUNv51uZdbrght0Z3GvHwLvcd/GQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"iiGREMRjPz8iGX5Q4fseHtpl7l6l5kzrghwi5HmVEktK4+vTq7KE8ZslqXGmHhDzmLJnhOB+VmOTX2MHMzRODQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3SEWSTGvmKpypXA4x4bBnGQWBniOQWD926RyHFtx9TVsrbBnmx7hubDg4arEKvwFs7FtDV2KsSxebN4hv1kb5w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"aw3klft+xfd9o+OI3afPtNujOyvLb8APsTPECPGyBjANPEzKKknpu3JB9Gjnk1UXMTOQf4Ot3VTR6D3lemb1wA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Zr9SvMY5qAldtYoUVBbPr9hXB0I0FaGPV3TaiVDkxjV93IWh4Q17+lS29E2XZOZ5jFL3lgk8fOCJ05LCIUSJrA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"cY9rzPTEWXk7nswATQu99k+BZUyKeqRLxGJn2fuIE6UwsK3vY/nexlNVNg7fx1PD+KAn2zalPsCJUXsX0mAU7Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"eduhZ8b+jEeDK6T/GgFdx9hXow1bkeI80p8hn7E2MO0cKMCZS29HLG9zMT63VDc3wqUS968tvzrdWMcSJDM2+Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ODAuJrSEBB2GpJ+jO3UDe/PYXzw0O94MiMH8YQ+wTVsv/jDujX+pT9Tmoc4f532iDtIP1b0nr0M1K13c4cFjQg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"P2KeOJMZr1cAqC43pRXoLzCVz3ADio8+YPppvrJUZwEAZiKxCYXtk/6kBgTyZ3u8qoqh26owsFUwThUNvKobrQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Na1YUj3xVR+JYlbrhyKrbXsu/xgRm4KtP+zveG/Gd5cdlkpIhV82WND99Pta9FL+nSwqYn7lBz0wvNteOk4YHg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Mp9cnIZIUYIQJDeCH+51F1llOr7zUQ+q04FZyyzRxEJN6bhkhiVUDxrmgljOvLI3507g1gUEsgimobF3uGpICQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"88CIR9q9FG+T4pU9ihD7D+rfjsVqoWTzDISoa/h3WLBFSiO0oNRpu+6s/bTVJg2dt2o1asn3tewuTUB98QdsNQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"XVntozy1+ciIjApvr471Mr7BDIhIK9XOrVWqCFi5RDYg9rCCbDA9CANfNn/x+xuxzGmdvBliWLIgunbEkAKwFA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ZDcOdTQ1w+MniBj9teG46VzLS0Vp0iimfRWn1gpQl00CbbxKnU2Iv1v97Np2MXNIta94RK0PyFJJtOUkxuVFtQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"p4KSL/ZcgxKvegocHShU4JQLl+sxLXHDFZixIHM8pJRZbKQHJ3Om3RgvwFrJyLEO8QPEmalvVR39/AA/2zul5Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"CkOFjL/6txHj50o6nzLdL8pkQ2qJIIjrZMSpmqHpZJJOE1k6rKf6FWaAGNmXoGgAmGqMrhbNZe4wio1B7j7gLg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"T0/Jw3BXhvcaw05ffOMD4Cq9sE53MWwfO3ld0E+lJ9BbUoeAltl2NNRwBMTu0xQhbX1Qpx98paAOAJYjYkRTfw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"/EUopAbOTLHNI+ogvPKy6Q3ZyWw8qgJa6u/EjnDbe40xkLZXOTKwgq07XvfT+FK2+HwPl3VXijcWWxKQ8JC4VQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ZkZND9msC6+HCbcEKN0TYjAtu8Ixco/GVq5UEzXzJH8wE7saF73vaRzBvdXgFeNVqt6KtgYRnrJ66yYTgQDY7g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9hO1TEeKV2qU/eUQer4za83KF9kw1b09Xj7NqD/6ou4j/HPhqIwOWX5xLDWNe3w3jwR79CtRodWRA0H2IR4mSg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"f7BxJGLOiTxOxNV1VAB4I6TXtA3GPI441v3npRRHvIMdbWUUdEKtlAtutNEoq6Mxnzdd57/5EHykBD5gfh5prA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"KCFgLgZPM9Y0pKnZnNEwfy137U9py38XFnnOJwOuK4hPoI+IJ5VAS+41RC+JbDiv/hKGOfEuNAqNfS36IZ3qZA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"tjHfHvjtrSwfbrs6wri3c831xP9Q5YkWMcBD9WSsTC5d6JAuhoz4s0Nfg6k0htN+1OTe/RV3H4t/rFiMO2A1gQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"4hDSqLIJ0y8gKsE+e1FzWRlWTkrOsWMeQmKVxjSHfAsdU8SAKJPKtAxMCeG9PopMNQLvcIg+LGBI5yYPLMyuWg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"UkIXAFDEkADgHty/0fbSHQZGM4DJhIhkZjPIQbUTvcg0Abl05ylAU4uqMQHYG9O+XkQc8Zq/EAypwDyCpvFncA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"UwPxCwyshhR6ZMQsC6xAxeyCPQupXZGQRScA9qAl2C9x9A9pzSgowQRk2ktJoOnPOiy5c2Lekf0OaLao77CRBw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"j10P0rkjMHMwS+Gig4z7LtJpsa075QbN7XkVm08H7GoHx740QtjfeUCRR3rAkahSqSdzR2sUimKy0BWGKdmGhg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"B4x2k19T5CphhhwtrYjwMMXGuSesyGPqJAz7zHVbqUVyAqTwAs/39k2Nz2mXYfFeAsVX9A3VtjNlq3+GWLvcXg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"14uPNWUd3fW9NA9AtFDx3D4lawtdAZwVCz0/5EApMTImapHh+4fHzi2uWtHo4ZTYAeBCL2hl0DC/wZi78ZDVQA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"j63CAH/4C9GVEd7J2cnHGN2nVpUfV8mt9W2f3DOIZ90g+V5dYaacqGQRAO1eUGTjFRd5Us+cPCTIRa53/LuYnw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Wcz+QR5FHISTpGg5vW49DBE3U8Nhg/PMfMclAvF61GEMbEc/hFiXBQ0UWcLUzzSkVq3Qz9fFEwmfO0/dGYP17Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"cZgaTouVWgd39CzOr9YJi2mFOVho7m9UESltyvq3CBcNw5tpnvxSDZfMqu7AvQygGqoIPQxxOsBrn+8P7d2QVg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"hZ9j0qDYPuLAnF0A98ri1knvaIm+bsatKhvFB7g3KmFegTC6D9HOfCW6IBK22hCKWYppJye4G/WJWRV4cleCDA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"p3IXD42cWhIMhzB6NXNyCH3QWDjPlEruQ9a7ct9AKlpDSqlPM2dP/0yIU1zI66LyX37UsRJZf3fWgstegoSL+g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"bhOHQo+ubxWReQAkn1gXpvrtBGheCyMcBum+cX2sUVt7SLdDTdRojaaZTLrPUCQ4f53uZbG1cX1OMYMG3TAd9g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"UeiJBISjuCBVPgJREYhVsnx4rDGvEWkYLMa7p6uVDGgBf60k5oiiIDUfXQvuQK6KlXajsKVbpxVqj2xFet+teg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"W6Og1cmbEwIgLZXMlVt1/YLqDCeFn/Ynw+SYd+RVJzwSPVWSI2a9hk7Yq80KG5GnHgjzcry0DBlZY4Sa1ZVOZA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"njLw9JE3z2O2ilhYYYzMe8QDpIYfFODcH/k0ovDYJ4swVFgKiWFzjkUuo74ZYeKNzZQH4ZBapwm05g8pdKEQog=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"royujZBPMvNH0XPV+6vwMK2Q8PUqoP7EXExfyObcmw5rLoLJr9WIk+AP6Z7V3DuKxnBWoKa3ZRku3mXdMoSglw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"mtnurbNSizM/bdwo199fo3Iv7yjMmWLy1ESwB1CeMiNAYv/awp5a32qMgqhYKjGCwfYFWzJDWqb/S1tSvSPbFg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"v3/TzxoiMfhokGiIc53Nx3EblxsO5ltr/FIJMh0JVHtmFMVZhlSsYlzi3zkMtWDjcEFM3tnGMYZ7sA8uNmqQFQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"MnXmSFrQnpGuLHCUtEAQRTOaxJCrOfnyhBu8BM025nUfCqUYJ3Ad+g9Yeu4mBnHbiWzYY9NJYAU9q7U+fF5F4Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g18vaqtt5jrdhnsz7f4wl27j9z9txpaflsc0l43y","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"62qAnnt0G7ED8bf4oaKfjPMM5PI+kUH4mzP03SUwiEgu64wTtbu6HzvTe2xoDIH1/W5+/voNrPwrR1Rho6qrcw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"NGfj4ZAvXujd4PObib/bwYMG5q/i7itOP5s03EwLyVo67uoXEy+rfCqY/pRgtnfWNL6+iEs/vjQTuBHV/kqwEQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"badjKpnwhNJ5O/xRcYz58iz4zrApDfEe5Qda7FTEfVh2cl34Jtn9t3J4Li3DVGt6g4TTVKoCKHtoA9l23wZASQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"s3D0XSiCgfwUId7nFucMpvFC9OBNVX7kJZrksbJuXx1J0EmZW5o2pAeopoHHS9QeBEvG0JJccTeN+yRo8f2wvw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"QJPgoMFwcHTElBWfRKOMHJcVF6/JUO69m0rM0z6nr4kOTUw4T+JlrrNG8vtB8A0E8LPubmmShw2gOfnFPDa8ww=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"toRUm/O+JHaRHZ0RqLW1170slnVPX21paDYkecPP9u1pdN1R0q+RcuxXUPqy4HzekcsUr4G/cExf0hmcQycLMA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"lEO+Yc1Sr4TLDjVEW6f+IYX90z5kKO4gxqfAhGz8EzEq3awAdRYSFBm6cSSDC9yVZqjj/Gs54jcoyNYWhnMZWA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9G35PVuwVVrhhUqvTaxeWnXqQnD8cSDAwY4Axt37ZFkWGjm/lMX6S8sgzzZH/3Ni9TSsSp+V5K5K8TDEtfPxfQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"kCqc+Ep6kCSYTPjHH5odF/nZwYZw64s17HnK3JA+4i1dByVni0SL7jcG7fqAquJSHWe4Sh/Hj1BCga+lUSXF9Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"k5DKPRIBzpdKmtSD8qWsoED/WwyN3M95iPmLVQfktsVInlFKEjYI7CVoYeIhmMwD48ESd0wmFGynZTErMFy4Gg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"UkCss2qpdOhsJ3sj2wpLBfgrWJz2KPAY+wpRX3nHE60rq4Nu3Pp2cxry5RhgxE4vR/sAw9OTLcMryxIswFtTCA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"NhnsUYxRHnAnj0MvfaGvYT/S19u+AjxPO3QQYoD/KGBGnr8vx8ytCtYLkxalxqVcczbvlohJv69CfqyXIba0QQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"MjqLIUBemCUkGGVhHP3e4oWVEW/hUqIFb4/5waYX3cxGPjFPf3q2pyhDyGfRoMOxqZfoCEkaTmJ9NX6xNIB7sw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fAUov45zk0ZI4wN5m/jnMZaO3wDe0Y1JcUBjl2viDiNCZAnvdTaYsRWSaSg4emxodkNClFuECGZ7alXSK/1vIg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"TBT27FCQdpJiDeB/bM7cwbN42TEOzvW30RAmlNJw0fwXwIbYLOBzDp0AvYKHXPxixL3rnQd4GORwBYPlobRaWQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"drZpx9hC7FHC60HK1WxxC+ZN4Xir/BuoDLi9m4PXCu5suHM38T6pYbggpmfU1uSEpbAYgAguAEO8rGYTOfgSYQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5uditqxT9S/l2M8onIY4WQqBubiZlrH22QtfoYKTSrgvh6XoysikUyyTpVE6jI/G/BfMMRvLRgf0ZwePQrRYrw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"hkv+kPdEPbuAyVxddywaaEplY56CqIAWmo2GNQP+q6wOKku16HOs8qRhC2NTWcOE1qKL6q6+PIVEm+Xnt9DMNA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5G9KD0Jm6uM5WmVM16tS+TvkqI19tXnzdLDsSmzajnBOscIUg0gyrj89Q4+di4hgMs+d03WSVlZqDVtGrtxt9A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"H/xvrv+vPNsB95pJLtK/Cp95R3rdDeUCH0W3dnLQl6cufLXiK1xeqFPc0ubR+5GFG7W5TtStf2IddSRb+/RPSg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"PZfs+qJUp4l9ywLDZz9jBw7+pxGJ5KUpeD5NbuD2OBkcEob10sYRCVtkXUtH2CNLkAF1+co9yrqA0fqz76C8RA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"kOzhADkneUxl43GcijgViy82OIA8Il5bmPRJZ6mNByFW0/46a3B/mM9jac7zHRhHjTd1maFRqsLyS9pbG5LU7g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"iZ/14Y7wYO0S9ueEmWhLaMdY8ivQbuZiGsZmEceItJ4kE2yNs1S8nl5MniNy17Wgt7q8ERCVA7EFDg5fcgHG0Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"j9M65U+w2aaRd3fExSvZTfky1GQcak1i3W9AaI42i20YBlFRaoyMytrq0nkyoeEzkcl0RhK7y52tikznMOtGWA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"DGmrEJHedde0nzyHCoWqyqUPoLfX6vZRTtJmr8IU4isa9Fzb5uUlIqj2iIko4KfBxmOZ4cH7TujB9//KW6zisg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"aRhahXz11GHPl2DKcicmItp6sbFU4TYXW18ZOQkOG9dNKPQIxsXDDP41GgD658bJlRFChHn38t9FnL1lTKsWfQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"igVY4bK6/Q2IDXDz9irQ8FExq/hOuRSirOWGeexKXMUN4suGc5P3fMRYNFjZQFKFUuiUnH8IkDHQyPysdfhgww=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"XdYLd5i2DatNnTtwU18RyLdTnK2A0Zm3W7uQqFhoBSgkyYiWKD18lpiHlzsE9P+iz8sdc/I4Q2U6VKcxQmWTEQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"hqJJ2Os7oNGIR8hYgqPmWhFI9bV7wOrnMBUXkDhSO0AL1FlaF1tNyjjACTThXw9o3gWWV+fXJQE8fGxv1czASA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8PM+/iloUPwyPxlY3eBMoC+nzMtst2Q19BHZvlJ6rgkfai52h9NriHwPX/e+LFwwMRhRCTnFEHBt3EkQkD8yOw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"YWl5QDF1fuKw0AwTpiiLNZ8nTfQvPtCbU9H3Qy2XV+ATuAXS0hu7WNQ4w4RAcrpSuPdt3OmaopITZIWXZus4BQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"uMNs2YEHPUusgDCfekzCxckSSsEADD2M0P0FmKpbjGdnan+zDCntzk70o4WqqV1R7SxjiQmApXN3m/OrZzhBOA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Iskw9R1pM/Vr3wYM8pwyX50d8CEMgV6UgKLgm5pCkCgUBlccULTobzqe5/WkffKNP4GjgvMI55WTxpn6rKbKJw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"tAM6PAE9DGWUixjviw7tP5FOG+PfL11/vvhaJdyt/Z125Zpzem/ECOnae66SAQwWmjdU95LFPDaquc31Y+YbUA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"2lSGoW+cwNKaPdbugmcAjzszUoRSwM2HcisMv40pzotIi7MRyWEStwynNgwWcmnHBuMkPIVEV/3tJZl5luCNpg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"CM7EVZZQqs0Xgoqc1OcPplN/SP/ayPzm4CsnGkQ2VelU/y2oOaX8Nvve6uhtdkIHXfQEPV5sSD3pXwLnQ2oZag=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Jcst5tcEJY2iY+fD8X7KL6X6rQ2kVybBDRl5qBNGwwNed50wctLtxj2riKDDhVbzbZ2vjPp59PtVVsQa3tOPZA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ePJLzz38QETcMGQ1l7G0tu0y24UlG60yMsDptgvDPsNFlEJfr0kzdOUkfTGSSMZ0xG9PLNYMNUX2NTNEByYpYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"etj8enbxDsvwV8B2fIF1lAh6ObgKbYuG9s1jakEyV2s7+QQqr7eAi9yu0aKliqUQjPUtglCteWclLS6LpTm5Cw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8soUskW/ctmh1hcPkURYlb9gEkRkvQT54nCUzO1rrf1TmOmONEQP1aAeFoSeFof8FiUWE64On3VUZPykojYknQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"eJAJpD07iXRLyRqPFGv2OmYO0ukxjwANEaWNfdUKDM5vKj0R5R7TwUCzdfHFAAo2UmpJwrHEarOTmYSS2fwKCA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"FTePeFHGrYdmysULNRXf4Hz3JEDdoVP9y3jUkTw4fSd/WCHiJZn1gjC3R/SrdWm4WTIznv2S2AApLb/GK9UI8A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"auHeTCdhIDf6s8fjBdupPct1UfRYs7CJUSaF0DKm8CtFhR/A50wFhzFgV6ETk+ztNqtcvegZIBimlp0wPS1Yqw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RGhn7/S/uJ2suoKtyuoGOiNP9K2WlJ+infXIEOWtL8sFoAHltljQIVNnNlssECNhVVZFPUHTgfYD97W41KuIWw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"bm+4VjEt1kDGsqKoSgcZ+6xBMTpXMEIHbYAsBUAQgb1gWs5EXsuwp9rHpQls+fIlm4sGxWRg7ILmxCJ2vbn3jQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Kpo9m+T+LF8uCtbz+RvGiuGEo+hfhW54i9FQD6Nu/o8L7p9gOfN9T6T4RpFq7madrlqKZrMeh+22iqXIfGUm7Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Y3I1HFEEaCtppcZZlAd/szGFFXVI2B7yox/7ZUCayS9z2+NlRxZUy/qlBCK7yWf0WQDpYzGdQmY1k4SGaEdV8A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8ceGeFopLRwiODDh/Lleq0c6+ICnN74w41jccLymdVF3E+1lMeTdHT3FyY+WLKfOER8MxaYJL5pm6/vPKs94tA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"hZW439wzw7GV4QC6NvHRCAB50HsaG1uqdwjOWsyMtnYd2Eq3NkY5NKSsgsNAcX9v+KRazVIzYRZm5g9qul2Qog=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0OGTKNLP5ZdpflMnzC/Lbdl7i010nKWGdn7GTstCCeVoST7WUTm5Vc8bGKbRUcGzppjdi90J9zoIKn7kLSHN1Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"tW+Pjwt8Rof+viZ6jzuW+AzvcHV/dM/wS4vK7hwfJ0BqCrn2a/xlkAMzG4waSRfy0uX6ryenVyaSFmxpwCRwrw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"gGvzaGrFuk/Jdpv+1TcoqHmI3ecPmKwigVlAb/Seo5QnTOFgOpI3E71QAMst9w1duZxoVS8h5LvM1ez2aHwY2A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"KPFbU3OhBxAVDOdEazf/27/XzP+URnt6WVO+QIrio1g9x+T0I3HrUhbm197mQzZTUWfQEqow7TkK8cHmQT/bww=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"hIWDot4Rwi7/89HMxjX+ZHUDYPsWA3+PxZ77dcoB06wjI+yxnDsAt7xDaRobsiE7HC47+dcc1SnzvHv1HuktQA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"+JKO08GVp0GGul/DeiZ5rIhDY8TXJ3jYVr3lRVAp3jFh4HeceW4XLXz2gL2lFy4ZtL6osbepep0uS4+PFXxjnQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"XjpZLt0NN12zS5MSw2M/eVmORjKcgc/UUULPwslkWgQHP021zP1a0hLLn23aYmrt46id+ItyPR3kwo/z+/nDWw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"vsoG92XT7OIs5Mv4qC9WXsIb1HjjrNsBWNm/IqkIMHN8Ui1gMJcxYvck6sdFiGGr+g6wsB5uAcRMMNx6yl8rYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9QVTVmSW5aX+E7HjnB4HUKZz8DOBInGn0tPJgNIiFmJ8oIA3wFpo6dK/3E0jRyjtmPppIMSuOD+khY5Ej4Ig8g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"JDxqHowYLBsoefNMkzwUXl3rFvRkJS8w/PUed7oRv2o38T8ZdHBfVOSoLnqkVpRBy5tuStjpkrV3e0Uxw0c2gQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rKL6nMQe+5OK3Ucx5H3hfLFrWW/DMFNrinaZAqQEIiARqgsP5dJQXuH+NYQhWfYVFNs5XawJ14bkjlbtTdQl7Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"2Ml+HobCMY+nLZ4dRr7JXAfkDC0qy1j+veX4dCDsBllIIcSsc/PU/LaHlLDWeG3eh/2VFTMTK9SWNbhBR6ckQw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"xooJYgdHsxln7hjakpD0bfbW9ZQ6PC1xRZK+hJz5JpRWlbrwUXYt0wmq36wl9vnyY36fnv0ZeJFwdwuC0TioEA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Ee3yMYhb21ICsta05tmesOwriizAVYyavMo/pohskEQvdZgThaNBXS0mSfOfkFWVzO1ilubS3q75yFF1OzIWKg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"zkWoLHKeW2WBB9OKLJmfOrg8uwJxIURm+zuH4WhV4mRAy5BnyMp9LxKU0lfNx3lNXQ/e/gjp9ORTclsEwZ3yew=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"4kUYsgspnvo21AV4zmQ+ZCe8U3s3t9D1WN5QGhA4sssMpmSGXwlLy6kKeWW6c4YZZlTNWV5HShKjnpLzydD4gQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Zo5kmta7CpKoA+Gzh2K53h/6MbHbeKuUpJrEaMBWkl4rOEtrk5HliCmfqiCJVLI5FmJ1am6q15wk+viWmpwP8g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ZpXxaUSUdfqYLyfGhOgOmXYwUJJDQ1PN2/uW+0eN6EIQgGslKWbfRtn3oScfYJBrxtyoDK95t4g1ZywdcXgdlw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"DmAGGVY0YO3GywFa/LWBXpD/U2rzGgSPZ6uE5McKQ2FZZfrMRlf2IK1umR2sp3YFFYkuKnVkT+J+mSYguuVQVg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"IWgo/uWUk9926jliMJScDCVKj+gM+whKQ8ix/HoYeKsQzOmvSJg7nMGwdxUQI89fszO/9ryXwPDftJpgSZ9fIw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"lqT78I2rPQ46CiVN2DeMPDUsl/g+enNpV1cfCXI1eF9O4pQ32Fj0BrsLQ1WCm1fN6YlJDSKce91qgHumRRC8qg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"iz5/ioWUrZmo8F5h15Gowze47BYYlrOKV4Oypc1IoKFNIMc6t18I+3RQaPcG8eh7O+aQrQLHWIyo3eTuFQQmjw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0zLeMIuRCMWzPARiYyQdnYjg2UJAtfb6Lp+lpjpmMbpkHwUT94CMOQ85ZEEQljs5g5M6FI/csAGaDqtZhAZGBg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"PCfo/ejK4eNg2soAg9pIKuPmrnQ8qzQ0NVPcoUyncSEUwfSn/MLGIt4t8myyjTcfjkzF3kyK8ofgQ/7QlszL2w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rjjdeNPExdQx+PEwakKZthHSH/lkc9rUVPDAZEA7E5l1suvoW6oVB6a60/bqso7oEUBrf8rJTJByW1dLxpwg2g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"clrd3+ZdtnpbGqV/yPomDFIJVlh0UzfJKE/ui3aHIMpHyJ/8+lI35/mqPY1ZnP/dx2WKS5F9anhcaCvUEtDucg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sWmgbSQDpTRHAgP62LmLPVoIwWdFHP0Ax5DwlEjNBhtzfy7L9lhufUHRifq5qYJEGbAbRfzJjQhVDjykegTVcg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"PoqRYIwpkyCAxLzVN5YgZSFXCFZVXNbjUNrNd87gFX8iiKL3MWf3pZ4u2Ri9E8TWdN5ervRv13FUVeMBUBCm+A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"glvuMkxhO4YpgIzqbFPQuasV+7gukTl41cIPjEmspwhcI0AH9zsQ0MeTxvvW3JSVAAw9XYEAgZDFVtB8ahkGBg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"wI96NUg/Hoxp3AztMjNnelz4FWwuewAJP8/js3UrMddTJhpnF1SEOngLWk8dYNwOuxaiF1SfkbgF+qBrQ8pqqQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ah3DRWLIoz9fYbf8LXjtnsw2KdxiMLJc3InBVqFtzRAHL/snTCsAPBCnG2iHA20THWsPBrlhHjiQyVt7P92O8g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"N6gRPiAyM28x+nnn5FttJtG/Q4B3i30uCft4dZbMbSUbTAQ5IleSzBrqG0lPAcS8f09VKErEOkrBJbID3DHd9Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"DDuOAvUhc7O1kR0T+gZ+WCkzKUzb9djtyzuxFD2hVK4fVnfiZf2vTtYTXjFcxxnN0lJDC8GAd9e4//wIE6Nc5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"h0/d6pDDxqkULZt8mP5m/k7neddHmx8f5pg+fD9MHIwyEP+3Z5e+sH8Cg5QPECBpQJLniXYYLBF70lp+odvSvQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"mz5La598dr/O+ZHKwspMGdorPabDMSZ3gIutW6WS93UKYaCypX8TC1YXylgP7mSyUfTwzmi0ZzeL2lZeo8S30w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"h5nVIUMgEnlNbHRiQ3FtJ0kSl2iRSfgp8NQd603yWvZL3ygtsivOnQEd76cOlvQzTogDELfprPn7q3Hk4PRuQg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"LRaerdzRKw7Nc9AoSANz1vQeHChsKDAPMn/lh/Q/++JdiiS6iAvSNNMWKGwTp+XcvIWlDaIjjAuC2uY1nmNHwA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"SjF6cBe4Hq6NbiKJwLujaYTd7kXr1PLY/9S/k0az/XwhN4iBz5AmB+E/OQ3RJae4Aphv1xjJC++G2IqBdGzqWQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Sm3Vxe7/WIltKcIdROsN5E5u5qttHq0lEXBJ0dNioV5QGVuEwPP1LUJ7rEdx7H+K2vR290SRoQ8GIb4VC0WMag=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Ea40pBtMPJyPnFeOrEFcc+3eRPQB1w8RaMEr9m88iLA5toV5TgdSNr54xT4UAV5cbKNc3wlwNj/RflFTHHcBag=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"4GU4tj1EUySKXmbb6lZMVYXEa+PLCMtZD5xOOViDB5EepII4+cHa4VLfGM4sjv4j1/b9d96KwnI/YnmhgCdwmw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"LgY8+zF7gAYbkrBm1Of1+nQEp2iI0rzdT25OI6NBmQ9a+uCG1Hp11gd9070sA2lJyEkhIFD7WnYpbl16ZKHupQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"pcld71DxFCNIAnLrjyvB7Bp5ZHK+T7idHfjEIhlzL69jbAn0MdFWXJ3A+3mQfk5G5HDrTvEBY53k84y9bXLLgQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"QMzgTUqYfEW3jhew38oqqk49iwg0cEsQ2iq1vFdZfNc6GQ0VzeaR1cuMSsqslCQ2cePoybGLZTCw6vkwqMDxog=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"O3lLoGpK1pAVb6y4OFTNhkODpvIi7l27ZSXIfQUdCfE4HHEVIpEarY4BvBYeuIcOEllIQIIJ1AO+DvVpl19yEQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"MKxMi1dvek+xSc9X+/f+/wrHrsFOQQeqm/hv48zKTV50DXSvKlM7qdAlxcvM8wozdDZk/jvIZipx+6LEsIO43A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"TPfarFaqqjdy0RBUgysYYhkIIaD5HErh+nQjLdiBwSYk8zJttuSO4XK4LLwAr5pIiQSPc8tVjV3FVTlEepXy4w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g53ubUzw21sdT1wD6ZzsJD46i408dv6lD20V+fuAuWE/xcJX9kDtA9n64PAYMlbx50mhg4/Igo+OuVjXy0ZUmw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"aZN0cKwirvQ1YWJMTax1K2njr95TFwhnlcZY+P2IHk1OPpMIeW1bUTo/ctyoJ0+ydott+0RUwoQVejV0e7oViA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"jv4vgNmrXLW690illkDGF7AfHpyMNwr1UFJfhtCLriI4D+buQVn/W/Fhmxb6Os8zpylCZkQHtbwwr3fFSSEC8g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"I0V/UeyhBFOkzJEb9Vaqzr5BJVZHGAc0lxvJWoHsD5sE1Wxljl5FcGUGy9DSxT8ZKMGDu0vhyFCMjj2bf6+7Sg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"PvXXtQZIZywrcUNgFGxHRBX5qZKchp600jKbIfss75MIekDdd/sVqn03WNYtCErP6e5hrDUykvE5wIP0cXgQyw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"jhwVeh06OMCMg9lNZ8yc/qQetKB8ltpS6ZwBIgGLX75NQc0lPMcB/Ifs+p3fL3hGpXmSxELcdaT3mkDYxq+qWg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"JUfVKgy61nTkQ1COkukOahwXtrktTPwyIQT4f018QVdNQ0dw6DiA4PEuv7bqbnPogq33B5duV6e/6KpW8URHTw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"uPUhobJb0OQ9+uRWLTBRB4bCyl2u4PwLX6Zyx40iQ3FtfJ6LY5BKrtXvBzAwv36ZGvdtM1PJwvh7NQEwpds/VA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9VrvyilYnoaOZubRq3D7hJ4BZx4V6ly0f22HHdd39/tg8C6EazgXOhJJmLdOHsK126RpXrYGiE17u6XsrPlRCw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"U+sd2kDL6DelJf4cDnxVD4RlMWnT3toXUsmYdLEEUOw1nWs8+jMj0mMlHMlETHIDh/JvljA8Xjx2Gzoy9dyzQQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"PePutBXoEHj+jZddUMIWg9zrnI+Zbb7FbC4EMQXFiQQuIsyaWfyc2uzC/WSPNQpTgJdmY226sKAwkNqmVJf33A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"HHHstjYHkm9Ce6mh1hlo5v4fODgouf1otUlIc21Y5xdIkY5k6S/BpnmEXxnhj3fgjyP1VcqXBqg1lCFsbzIw7A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AAX7u9hm/IIGu55eFZrZOi9uZqLLKlUBbWTYHa0yKSVsJ948Fq9RaRDUcsBlcKoyK0s3SBDyWQNXliND8Boh5w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"yYEzdwHrUyKuxgvFINyK8YP1Zw+mUkr0dd/B12QVXzovxacMiQFOl5fbB27ZE2yUDfr3OpYSFMz71CZYFG7Ltw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"WY7rZedV0K5zlCj7ks8OPajsihCBNyWyUpMyfYZie9VJ/uDu4K4GaxR02GwEU6Ki99IPL3WiegiNTa6buhMXsw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"KmhqtrekGZfr3/UnDiHwD+PMIUxpHDURMxgT7tkX3YRHAqlHJ9bN3Vy0R5lLCeO0aYiX0HtyCX91BuOhnAQ12A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"gYCntU7vpsDPuSc3Taj/Ci57Gu/UGLaI33OVZWy1vixoFVdY2P7C5RDZCdPq5+OGkTQbkcTuYt2k+rl+QYLiCQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"d/X3Tb4gacMikCArxdkzIxedNDTweEM4ptRZINPXA/NNNWjpdLKYYyOeoZuHCKOWlOoKzPCrjetiw6qm8LrVYA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"eCrRzkIrEFZTESjakIBrK7mhO+9o/wAKD73RWYCY1kReGOkx2eQnzEzsFk/8ruoIyj0tfkMyVIkeT2DoMktmVw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8/edu66xpAj5ntckyNwxy1tpkvb2ITL0aaAHAGuKNwRr41MSv8DqZ4m5TUWLVsBmvZY0yvLfg87QFq7bh20dOQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"2mnFyVKMutkremWrSpmKa2MQYE7ylxRBKbZPSF6vyVs1T6KIP6SMYEDwwnNZoGm1fr6oT5V/JmBauxBxS+7Z0w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"2IvfYdIwDl7zMyOoUf6Xs3xBZHoSAgf+qPPRVuhHGLoSKrbFiaPQtMpJjB01zq2P51i76jEWsQHtAG8qCY8Edg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"X4eTEWgHUv9sMbHwWev6KRCK5GHCazfSzSnTY8Kg2R0rrMpv8Rmkur0gPN++MTrqZeIeC5XvuX6luzW2VLX8cQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1SHnVlBSqo0NBAQHiai+cqEwPK5dXukzb25r5TmEg8gdbCBR20Qvv3WL+HKzsnoR9E6CLAR4DFD0ngOqO21F3Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"nt5nKCuvZ+3YlTpQ/NDRGhZFQ3V6JHTGIWyjhOYpuZV2CPqVlYbew961wCAdecZsEFmFAkvZSOntYSzSFWxGmQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"VNDN5RfjS5T5iHpSTy4fGCalyJ1srfEf29FKWPtqXQd8tLuZwr8amQ7clf33yb0UXHfKhi9tN95YM8HHa6cbJA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Die6K/T0o3SEp6cjCKvlSlhnDbYSG033poalFEVcu2U02A0+mw6oSWThBaEr01QS/uV36Mw4yN2rIrz9lFyNTQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"SJzCmNBrl8T91cyyjH7zw/h4DoOana+8yRTHCjJBDZ4X7c5guNkuMrREu1jmLMUZVLezKn7D8/Rne3jzxi1DHg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"hrdEzsI534w5rIy3OKEN8GWHoZlF1+IC9cvTjYpDHxBBunJ5zTBUcwim1b1RkcOGSHKuxcDQRVgcyshrQNAUtg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RivPdzeS7oPR768IsHnctekrcLWpns7YOGv0FLk9Xr1uju+sQdVMJbOeAad8cWFpGjzm9GU9mkrRyeAXYRed2A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"VtwiR7fpe+ZE0OBO7BS5DG5xw389+2vSsAAcMuwBr3VMIFidsSMz0qVcwK14RzPSlXSVCdDXy4QB9vKhxSATjw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ZW4qmD7s51lCQmj2HJ6Qexm5Zh4oNqk0hO3Ona+DOeYH+G5GP/8akint1tlTIVHCeL5zJBNid3hddLKBQ5ZusA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9igqlz8GTrn6uSHoInPq4ZteroxHIi5pcKkMJBYXwXJSk4EcHhyceGE8z7hocnJV5zR0vkDqqwmZAtVtdnvm+g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"eF39a+tlKepKGclBwzJr0YHBwSp7BMyHON1IwjKhefpktDwZw9yr03I0mGRmFU7EI5SH1fHHYc7KIM0+HoNoXg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"FBMM5b2PfjNUuFB8Olytl6IgMosTHtVVzcFrxoRLFsdiii2AmRXE5B/DkM55TSKIAvTEWeEPC9Lsa7rfGqwsew=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"NZCom2EMFCK0SCxArcARR6Ou+79vY6YvjCaZ0MQfTrFH5HVocCyX5nH6CKaMv/KySINH+qQEr0GedmVxfcmj4Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"b4IJ8+mWRqno6FhhCdfSCTM9N0rDyeWVzrqXPbPf4v0h9hpz0sRxBlQ2z7oziyO36tz7FkK7YqHQqpGzLscTxg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0g6ysxdWRcvrhDQGNabV1TzYvFpvWqHHh7bcBgRQp09cs/WZnNnFadip8y5VLJ81anZKZ7LiMwPPXgYeCBQLJw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"E0Ub8h44rAMhgIexD/fpmjq49/+cKPGoXGjRI8R6TeduQNhOEGK3Q2jm6xmWmDF67GkpioB3QfN/10qoMr2tLw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"KDhMlVd91UToWQg95pgbMHKAMM1tcR88aE4Xwk4I+BItftvIwHPEos0FrSPaSLcZ/fF7bBkDS/m8JoqT4MmGGQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"frD8Trgn2XlxCpa3ZYVJ4TCmrcWS+FIle1j2sDKOpSgJoe0KVA/cDsB8hTYAdyIXa0wm4RlAOaqEXuLFjQHb5w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"azW1I/mwiZWCT3hrOMK+668EnI2uELVonRLm7W4VfeJMcmWGN9ATxozBa8zZIV5wpyZP2kEdCNea6BDUbzTKjw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"o6nUP98OCR9Q8ardNo44t5IQUH3VqTXLBly7YKHzRkA1jTvzIdlxIivrTzqIGPwggpvSIbAJasZLocgbTOHhFg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"/9f6LEvtS9Ia/pRdQWezacBMLoDQiC4B3MF2/VzRiiYD/WULZ+H7qcvL1z4LjqHgKcSQANyTLu69Q79uai17Ng=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RmG6PwF5xgDdJydQO2G/37GDdryE5iMyic7UVBGIPTBdGmH5qdfSBrm6PI3D0M+6lvQ16KB6AqxJpEPJBRcjcw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RxsRrRLo36F6KyPXHjf9SGKlV4ZAyxGMKBWIl85Kj3owjRa1frok5iwUJitFGhsfxEoD97g4b50ANTzJ0hov+Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"W7VhyILTWuN7cBDoiYxbRzUGG5GzctHyGKyJnfJIp91XMMTsiCbwTGDiqPnHflkL9G8Ph3z3nbfw8sKhmIQ75Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"hBxlyWZeTtDJyCl7q1H4IUnim5RBEQJ9AlWDtLneLLsmc5m9g5JTqzOISsXBXI25Uk/miY5t/Pu6NAnkV+TBwA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1EeqWE5ZbZz1DCwLWDYS+H3zA0E3grfnujqVVgcs1kAzCXEdN/9npcFqgnWBiIW4WpbyLMYS4AOddP6CmFSr2A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"/ljI1uTS0gdgGZaDo4KAPN05HmLGJZnMNzQUvfZA2KYU2SpLhIjzr18qp8aEzwvXEfJA76Wo+UC3uh87y3LLcA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"FEOuIXPJNzlCY0NPbseIxT3cxT2LMGEypPiUcE5jbMh2MfyMrmYiVlnN7hxhBSBZidH8B+PQjqxaHeIlaLCakA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OYWAOTKlHisE1P9bR8EPXkIcB0GDtNcFKcCHHH7DLX0bHRx8rJpruG+uAVd9C9OHnUv6M2wpKVCDxPXOh8sm6A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"/l+X1QoHmbuxJVmwqBg5KP/kOC3Efx/rScNwDWfI5zpHZR9DT2NYa4gmReMzJhiPum8QP5cYq14oQNaD+2irUA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"unNXpOd5i56gJsrMLY2+bxbrehSsE2n6GhFRW8ujUew4jsAsO4Akav8BGvX3Ymgra8OmwV20aLwkYN32GkvAGg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Fn9+hLtN2X4Vb+CwIzxaAvIPx4dRK/3sn3Gqs8BiE3MOUwSp9R0LkJhS6UVs5d73b6uJCSKV0MZ0PpQMyap6EQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"TyfuA9Oj3kvAdk74oUITOW0K7JQwsQX68UGIt+8kSqQlP8U95C+F7WJFfohh+i7ERZ8pm/LpeXlt+lnCzaeGhQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"eleoLliH+v7ZxAg94CUdxRsw60lKJpVcQdrrJwlo3itHcjnKpHD5/8A7C2deHES0McDjcKdeqTXa56bGyhsgIA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"PYpmjOkr0P4AQVrXasF7zOYceEDFTa7wGPYHfGmAnaV/ag3SdK1ymtgDUlF6NJQF06XEu0ZpgNDn7xqcBUupEQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"NLZkLmwP6QDaR2wjxO1FHihj4pEYFcM1B+5ewaD+U7QWSpu8sdNuZFloHI1Mez1AXE9EXKeBglaBTg9wJq+tvw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"6RT/66nyWEURlYpIjFaiQudbk0bOc3sDeDUTuVZLeMluFuf7/Myn4a6cthrUtvuOJ5QC2swMroYZoi8/x0hGMA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rAGOpQ3/v9QlbXISaUCSNbAGRKB7h2J6IDWCZQVle3gd1xE4tDFWrW3m8JOZau2tbNyjy62oU335AR+mQydc/A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"IE8jY95DWbUIaT1/G0sWzxdDijV039AUIkEboNjivHBDn/JC1lbS9ypkgynNbaYc6GuW47oqQXK981xvKJ4now=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"+VSKEiV66T7596dy/ryGB1pDFqqnuGQgvQX/QtTEZ4Qm0uvq7phBOMz+6ntkN7HsO/HO7U/kd/0HmEi/K6WIjQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RG8QYqNF29tpCk5Rk+rtC8ersYrmTCQmA8NGVghRe8h2uz9Q9F4KwcvXwkAM7C7FxNxUiszU10IY2+5ljWSJ3A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"JNaXg7d06LUoPKMf+0aZrtRBBFNQLYnJi1VC9VR0cZsQ6UEr+wfPWdYyDu5D3UPw2dbPPOGoVMEqi9cXtewZKg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"2zE2zz184Kaw2LTOXtvil54yzSXG/dxt32zMa5Z/xf8aP02gMBCuDXZ2ek0YnIMkiMsDxDJYEgrdKCRz4pJ2uw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fxSaq5w3Gd0mDH5TfMHcrioXunE4Y/YENX72b5upgUBU5yoOGzkbEruKQAT4+jAIPfJhauAxULM2wXzoF/5IUA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"nZqNZCAdajnw03p8XLW7xBtFYC1dfpYoCfk6ithrlFRFQscvcjdby26taHsGdSwGbAoQcVA8NRCZUYB9XzDr2w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"P0OFoixvLe49W7T/VqcR+kaC31thgs5jELYWe5LwLFFAYR6EuVG7EWLGbYPFPlPqKlz2mhvBDRSAJy2EA6A3WQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"yNwkR0kjTtgoXb6K75PparLETQada/6HPopaeI1smkU09JudG0lvw1/FyeFHCV2WGPCT6WPf7B/0Xyd2/61rnA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Ne4qiMQBACCee0WvcC4B4ykttOzdruXZ9Lx84Z4ZfI19kiLTJIqnieAtRx5HtLh8yAJSLYY6gfgQPy4toY8IzQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"bjLIaLeyPUHLy1miKF/u23+YPMsnP3sC0JELqg7H75ZMSCidQKRCOcM2flw1AcTQMqphncuYzOs1/vAt+OV+Jg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3bQjmjM5BN/xP7U5jXAxOrljIRKl9+VXX2Lp256buwwvc/u9yfCtC9f2ADlyjRs9TQNihOpbY8+NOMJWvJlWNw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"mcMUXZCR8snhYt0FxJ9yU85I8BEfy+tHoxfFfuyQSjoNQHHf71Mx6ztksNiKLd20EAikLFC1I2XOmLL0Q+poUA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"DZ7o35TWHUvG/VzseGNYYf972tOf0XYOpDLi7u4WUNsSrGmJ0O7UbaFgL2+/Pitj/wi5Busp3mR/zf4f429K9A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"N17+ERiLXra7OL80Wmio2+dPLT45g+5xYEa5MmbAF60meegrMwLNxUdWudezMgIG/ga5+L2rtlj94OXrOo5vqQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ZlTyq2/eog+4tbVUyrcDm6jrkRtAE0EAycm+8XZps4oNPeqTtCyNlr7YkjXJlY6VyGXXocGHPtCyXTiMJQMqOQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"in0IO49SLHkvPjJsgSG1KpLEb0sArGudRAxja1OF0VU7w6SX9X7V6kerK4mvGqy6YTJxZcUymP/xZ9vmYQkl0A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"WdvcwaxxcwV6SaPnlqh7ko619avLdU/2m8va6X7afrl5e73dCborxTE9wIKIfC8ozT+zb5GPWyt9J63Zt7ULAw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"2L6w+qKc2VjJsjH5ldLRbH46TDGRL5ykRcp19xpKfDo44TCH6Y5ioXJXylb0ngeMChgk3+tyueSrki+2hOvN6Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8q6/VbkzKo5h7i/oxnO3vEU3nwtElmebY9ohJTSet1k0GVQIu2HuOs+PZo+oIfN0DM4yQHrsDEASzNfTgWf0VQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"cVhLcvtolEoDosOCSDJalfZVgEE8kmdjt4n1Roj5gjMKDl/OfHC853AW9QNqROEP3lRIL5t4s0KuLJ7W3YAW4A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"2vimG8LMoX+OAxMVSwH/U1AQGm5T9TOn3fEe1V765SYts0NZhjtuXKT97tkdqBmU3JjG6WmYU02WAGo2Vka0ZA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"DoVOfZTZ8micPlq1L4mo8tIblOrsi0qPRd/0KqiUIwQYiO54iBYKhlvBEmBg17U6lxLVM7OnT5sGslCIsDGXIg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"tEbJtBum4M44HfG9g/Hwnu9GgXfzyQqiSNbXjilYOnZ8MaNuyDDMg4jAT0cnZ1dNjZZgfDtO8kjm1y1HG8Sjjw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AcCwj/ujRVOLrAadxlbK+/RTpaVsBfQ50y6oz/1E1mhCpBPBLk2GS2Ztdwqt1/gQodXlg9HreMkahKcZ6a61bw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"LBrWXqE1pPUtXq49sJBjoorIhAcqU2ML298jlPpZcW5t0wAaycDNJdJuQV3x1uwGnPYdjsWCL0JWIHGiUz/D0w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5gDtQxzegQat+ieJwBbRBvJMtTwaUntSO15vpAO98yhnJeOW4zW7OoF5R8F+/mo561p0pAhgHWd863ocLFUbnQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"IGvps8zRHEGpdptQN9u2cST1tKrPmKhyNTTkdcveTlkFVDis+x598UZVw3mkr7Fk27/3HeyOjqClqie1qYb3Mw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"IhrUY59+xOpshwy/UvVxy1o8vdg6GyY9L+L+QC3cAVRpwK4tAU1T2iKzF2YczjdG/iQk1Up/m8LEGyMb5/IWEw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"45f+tvSIA36P/YULpICwFHgyU13A4TIUgkWaKToNKxAApxbshutw5pLG7jJ6Ld629d9+VfPmw4UaXODkaPZksw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"PLNKHgQX+a8BOhzw78iUe9A5/yvePaGIuhc5ITaoJaEn+OtUL4YB2rSZyu2Op/a+zsIhdlaBRZ0l2gvpw14/LA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GJXjR7vaFCTEpE46tDFHRUghpJHWBge5fA6bTnEo0DkVvperwkl481YwwPnTFneA+AOdvPYGQ3C/+9qMckumQg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"UROV298MIxCCLAAFQIqVGIi70JMdzfhCfZKEv+3s1x0xtl6s7RtRfbl9xqCKEKRXZC2+1H8vk/JWgO+uwQjKhw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"giyk8ei9umvflxr3jIsYHZ3yBYcsuohODcotPt2+X20q7qXbzE5XK9aSS+m///KpQYd2yfv54Sj9+sKzX6i83A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OafnT4afLpL7qFHNrul35ZJlo5+hU67Xxs8yqwOzjG5/mPeyupBuI9+Rd2iRVVKAjXu1GXdIb2OcClcjA7cI9A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"7aEDjN2HbRwfqNRZ+f0c2nlcO1QDwnFPCxbHxqo1eZdvZaF05WvpR3my6t21pnG9WlrilcQ1z2U4T+57TypoEQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Irm8ls1rjxcY2+YeI6mVGzd2BUjM1etAtAaXc0aeP8J6mT2/TGBv6Arvk/uvbAEk8kp+eD++kSSo9xtXwuEmhg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"+Z15it8KYyOqYjZrPF6rxRxRAL6CIp9C72Vu9oQ4BQs8oo9bSKvHyTF1d0HM7mVaIcD0qhxDHPpWuu2uctL5lw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"gSr7sG602n743L9oAqrQXJzLsDdNIPTRh1MM28elrHUKJhrjyLMAXn63Wjl9AYP5H/hcVAMgXAkSCEHXskuI/w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"M99btug2d3OErP9ip6ZJ8PT2pLPKaNZZZZa972cWLRMH+10oq7SCWOPASD8kYSVOu4TbtnLKfgeiqSUNL1Tv0g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"eyDc7xCllQEehnTVHbO0JDi4L10m5QHNlScMfHceCt9VRSMmHTzydUeB8/P86Xo3EKGWgJW1wU98n3yJmwSV6A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"mDcNh7Ig+R/ZNNoIsKuE/t8apzZLeqsL5GvOQh6vOfYhpBGlSrQSWgjU8W8yTljtZ9nRIq4iXlinAPyL98CI9g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","send":"","pkg_path":"gno.land/r/portal/counter","func":"Incr","args":null}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"+MLkrKCzqLbuPCI3u49qrNdWBDMS5jzmAGyAmt5gdHspWknyKKe3zjZdZyEibhq023n1/1Ntxr+skJg0A5pbFw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9+bEzX7WtbaMy61E423+zNkAFvAOp77x2xeizRl9VIJ/9YVL/FIDpM79J5ZX5doEQNIQZLTmeo5r1NQblI4GKw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15hrw6y9wuvdvnupcfksp9yp2l5057l79zy7vu5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OIfqRAuqMZvJ6XxD97nu5tekzWzOKVQx3GH6VCbSpBk76pKzJct492QCsePSl4HUDsO8jI0L3VxSr5dtL44Iqw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Pt9Po5vqQpERhS/Piac2kgpUuOwfo4Eogg5QAxapKjcnOJYb9gN9R3Jla0J3AI//fqFjm+lIiTnt+JXcXnVboQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"QljvGpBfhqpMXJ5GpZTRJDuo05VX0oX4ak4FuJQetIYM88mlR0oKrFUwqK4Sp5WsJL0QooPQW5ybjiCvVG4dPQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/userbook","func":"SignUp","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"p6IFZ6frCUd7G0AemDAhhdeVLrvoh+pzXu30nKh6NqlFJjL1Uifa7GAddbjAfnUnOTN0t/xkijEPs7TJ/+UL7w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RA19vrW7TFAMpDie1gN9cO7BSty9pInbo35HjMG+biha8B5U3Ltfxr41WhziWztIq7O+nwYAcug/uMXzCPou5A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rZRsRLxuAarFi3CKgxn5NwAS817fObm+5dGw6TzmqBRq722QblHmvdNNo9WNe7hyYbSm9qnKRXLeAfVm2rZAqQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15hrw6y9wuvdvnupcfksp9yp2l5057l79zy7vu5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"PRjMnaVVx3PwIDFA6ZhT0kCqmS/FKbUwVKMP/iFXlCsDEOfKsbK2ecQYXOZr5KFdQg9Y8304huTYr8YaCLdLfw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"u2ik3jJNbmf6Zjry/BGt/uTsfWHGHapGTzZ/Af3hGbJfXzdHaGg+/spYahsjv7Uki8l2zXwSkgjKAQcBEdmaSA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/userbook","func":"SignUp","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"p6IFZ6frCUd7G0AemDAhhdeVLrvoh+pzXu30nKh6NqlFJjL1Uifa7GAddbjAfnUnOTN0t/xkijEPs7TJ/+UL7w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/userbook","func":"SignUp","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"MJDksXIOQlDDinWZV6M/riE54oEXzhwBgi4ckVH/ZgFSFa/gR1Mh/kYqQajDAU4CF4odmc/VTXVEbI7MyryEmg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/userbook","func":"SignUp","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"7DUJsrNdxFkIYOw1BaA/5usDTadMxb8Nmwri0arCr7AzPUqEofJ/H6D6SbxfAv9Ga05LZakJaGYyHXZe1nSSuA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/userbook","func":"SignUp","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"7O2rZjZOnCVEyp3EDgRrXzvrzPmDs7+fFevdG757wWQtBhuEjmpycdCW2ZW+8XJqVatjOU6hYxixNAvC6RPN9Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"13999999ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgRVZeBhCNiXMgeopMseJTFgTUwWKdw1TibC+g1lyO3E"},"signature":"nvUVPfpmYI/VPxawxnuxmOBNe9T5MaYC96PSm+9upnULw+NGW+NY7xZRkXV+K3Txw32/bG0gbC09N5hJv8WKXg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"0l/C2g+q2MWmMGw0EaPgly600nLZmmHYO+bXJWc1Igsrq3bAwmkUFE+VRxBq+vAMqtfZsPyZU8dAS2Oa71yIVA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"1ugnot"}],"fee":{"gas_wanted":"3000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"cGwV9pJCDi7IM8xsyOJMu93pOLhsqhrGriGaJ11O13dkbdOW8Lcp9ASH4eK0jM4IoYDlWtEu+hJaTPBvsxwdQg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"pzd99nl5aY6INEMLdp0yVvAuW1NzoPsBYF6WKhswngs/mR74dniY10ASRw/anvxRHxnnfXcezR1QHyd8rlkGZw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"G6nFSUsnMQ58zR3pR5mWfBUGvY2RLXXXuSUkdST3YYpIRtmx8ovRsvLpXCADUwDH4FsaDXOy55eUi+xQCsMUNg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"lMwGDpiYAIx2Uvg62r2CrCNECbqcfaGuCxw/61AXcktcO8H2D+XjBsQ59b3cIUVYUhKuUgDqcHqfNpKLQ4dcpg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"Sk4zWwXmDDpfXYTfEf7HWp+dUhTesIBWiWJ3sXFoHohzBiDK0xODkLqPQW+EdLuJ59X6rPhWRXE0Y67wGVGAJQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"kZqJEMwHwl3URhPnBi6lpPwoSOHP2DPp70WIPrye4sYSyBO9X4BkEhvENxcXO4y9wBclX6eWLIR1aPIxUnVYpQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"O0DV0A8pspZmSEeQTeIpF/jUkB5L/+ILNrbLAa4H3XUSbskY+9PJ39fhGYnaPNQyvMa7Yd+IMLemQXuGEuEJSA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"jmVEjdLM/iWUc6hA0/s1lRpumjp2PG8rL3dbz5V+vbtOZX4CmGFaMwbvIruXAyCq1/yTOli4S7+oG4z6owVe7A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"GKLYUNKfifDPal3KEtvoXjX/9jHBr8rwvnnkoZn9VuJBRnWMSsLsTra15QdG4kAWqzsAlabH2XtaCQ9qWBt00g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"xm5IlA6KkBIder17ggAdrdkz93xULcekGJUOuQeRBM8lYFtCR63Q2RnfJNbR3ttHdGgwhb5jAsq76eK8Twkv4g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","send":"","pkg_path":"gno.land/r/michelle37/testpoll","func":"GetAdmin","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"Zxxz8XvP+JO1mxxOU7Fa9c0gnnKaaKvXocfZbpZbzXkhdSgxi+rl1UnFV3po3li/NK69PY2zmzMleUg9xqY7VA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","send":"","pkg_path":"gno.land/r/michelle37/testpoll","func":"Vote","args":["true","false","false","false"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"047mGZzj7/0fLg6C/hMoNkYLgOm1OhlIFARR6T2oTxZr/N68NAR2LlPbrwiyaPISvWkZp7166Y7OOj+5uLualg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","send":"","pkg_path":"gno.land/r/michelle37/testpoll","func":"EndPoll","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"WsbXJMelKAO3SoyLYBG7qFkix2qTKCqZKh+Yog9xkR4HViRq8VXAULLS6U4VyeLrwFhdYOtyc/BnPTSreCE/iA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","send":"","pkg_path":"gno.land/r/michelle37/testpoll","func":"Vote","args":["false","false","false","true"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"D50wN5p32qxopdqBtEIB1cNHnUBH1EGkuCHFbO+r2Z8NJTbk872wfPt6MjnrPMW2xPUe72HZX6RQ0FQn4RwPuw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"zw4YR70dxos6FPREYPUIP7v4ePABJHk8AqnhOt9+qkAV5dfZfW75M1y1eNXnY1MhiOCb2xIoOgI2n+xilnTLSA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"Imn24HrkUhWWwz5waJj/albVaNU+1nAtHjJqRPNqzbZsnlp41R4zP1ztcwYZ2iNC1lnDRBQb6vj6s6BMJint4Q=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"MpbUpCmhu5NanqsBe9dYqxDzHOpm7KkFgiHJUGDMVG0v7UROuDYc1KBW6we3Rwfd0ePpaMy1cE3bOLBzNyYrRQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","send":"","pkg_path":"gno.land/r/jeronimoalbi/testpoll","func":"Vote","args":["false","false","false","true"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"iCVpiwuxVX1ibkviEYWKJJa/ESUaDmgtORHysGSSTBEVr35Xi16QdzW4NvwndmQbz/0LuizYOJzNhrMRJZbaHQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1fv90q4fscffxadmtf7d93nvhvkl48g7zxeftng","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5CrQzhuJFrd+n1Z6g3kH3hw+eLlqwHjT/+CoWOrIQ29qaa5XnjXIBgKSI8jV1suS2mttRjhGSzGWWaWE6KZwTA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1np2s2gwq2ht0ulrvrdpzq9avkuhz0xqn448yll","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"HFF0Q8/Z6PKo4b2Qj/ZOD2ucfZor9TtQE8y8eeb5cGA+kO1fJ/NmBfP12aT0kIqSYsS7tqDUX3YVY1P8JQlsJw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1pk8a4rdvuv4w0ncf5cxewkajrgnth55ue74ru2","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ME17nnRQSxZu2DSTa2YUbE9D4bVvTDdkdw4dBeze63xq6s5v261T1lJHl5FGSMkK8U9bXZkeuVL+hFIJMmw1rg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1pk8a4rdvuv4w0ncf5cxewkajrgnth55ue74ru2","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"LE8Cb7AegmNDStp0w2FujXQNJa8/OxoHXykqDTQ6caQfGDyAhvDw2IA/hluPk+tsaB9kkZhzR7aFK7AwxUCtTg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dmfc4j55wl890t4z4sul67x45ygxupjsl6fn9z","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"KRMTdwOMUTzMDxsgA9jULCPu93TUITOBChJgAtly8DRTeuU/OgaC3/3NIW7pkxVqgqx2Rweyt33v/0BHU9fZYA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1h4tg9p2tf4krkrd2jqecs0wgtfpp9d5yp4l0tl","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"CqeQOl14baK2mXVUi00qC64eZz7S4pkoaxII18XnSRsoR3cgxIaxhR89f0Fr/Lu3O2BqGNVfX6j3PYg5IpVANw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g12hz77yewaymym0uv08880e375z64esq4dandtk","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"lunaZwrsjQXbtRJu7nxx0yu4mzmniUPFvMdZnJVyVOJ5SQ29vSlZu1NzgLJpFSgsBmiPFOzBvOq/YBI73LxbwQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g12vsl72vkygm306py6q6hjyqdsnt5ujeqh2n40p","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"P/b1+28FPxEEFAfnYQ/YlqsGYdtRtj/94HsU+fEdUj5y4pxdUfSawpces09qWABUxRLrp7VIthH455kJnxUQuw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1un6eduj3js40765mmakejyuez8x6t4sp44q99p","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"QM+qc1nBj0HaoJymE+kdQWJFOXRSlUamPhTtqNnIlDIoDE+3nfHYPGQJ5bODnXfE/0erFZqf+Le3/8eyy4/TSw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g12vsl72vkygm306py6q6hjyqdsnt5ujeqh2n40p","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"2rUA0ukZGeXBfQxHTKIc8qGRf3wF3g8+BhstiSipqEcILzJjPxJTxsgCkmLQdJUgnRkmpHXiBJE2sAP/LD0R2w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1un6eduj3js40765mmakejyuez8x6t4sp44q99p","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"vp9o6rkKlVvvVvtOsTJpgBUIIBvNX8lV2SSfuXOMKmQOk2Hn5w0R2T4PaaRshLl+Gf9fGcGW0FCeP6COJQHmSg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1frvde3cwzpmkmcsgh6wfcc099k7xt838qtdk6w","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"CP4GdVFvIxmKKFnSyyK1On6u9xv/120y0fqzYVyO44txE4Whid47jOpnvlEMlAgqTCOtKfg29w6FADROt0BvKg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1f2gy53gjx46l8njpxum48e79s9ehlzq5vzsgkk","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"T7Q+s+FptfqQMB3n9j3l6vyPjDVbo3T0RC/NzucmoX026cCILZOWgaIbio+fHBZop5ca/B3hzNotY2bAZ9QheQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1uw2z2pusvmtlsu6ljrzcgzw4fxm3k6z3e72fg7","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"/ZPXVAxDwz5Tmx2h6V3m+ojDigPBpsz5R8FrPRiSTos3HSfF+CLXgkGoxGINCpCUr554yz8B3AxZK0PIgGGRlA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ywyuldfmjuzcv565jrn2aja5ux3cg5qwy7x4h2","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"cWfW+FZ/2Tmwiol0nEUenvb3mgoiLQ9XhrR2qtBBVohsXoGca1XpOYdh0FI89FqUVkadF4k48gkVaTF7g3yTJg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1qt6jry75fq3d9j4t77xtc286qhqsqlg4xdvvml","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5GaQ8L5T2uyRqirn29rT7E6ykdfPJ2F4WiVVDTsEr9FzjzuOobSobqPQBXPhVo9oFj+X6LI3ZixWykF1ujRqqA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1s4lvedlmr7j6zzh0qm0njgm8wqaks6jn902dmw","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"xfFb3vJL3LJ1ADBTlLP9Eo7885lKRubmahNEW8ifFm1qHrJAN7qZoO83G9RiwvKrLxzOokXEN0oQBRxkQct8Qw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1g862el8cz3jap78cdnk39435dmhjqevqhuwy2j","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"urGcZUldXoo3idVz3nLRHLJb17RCTPD/ppCyjDgdTNA+xsg/8Eahv4SFwrKVnzGRbX7zwhXAreF69s2HafcWAA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g13z8g3fttsj86j0ul40eym30gcvzc8hvsqpjylv","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ylrStYHeRCftmlwy0LdOSsQvMmOKIY1SmzxZcTffWF1LdsOUaNeVbThgVk9axiUPKXsRXVERasOqfvrSHf8rzA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10jhlnlcjce9xv33vu6mdqg7srpxm40wqn9w4d3","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"NPJra0ql0O48AoLHq5gD0iGPv/YbLdatWAUVphbSoBVftyOj08l43OIyk/8Q1YdOA8skzMUD2YpNqHnOYk776g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1wxar2cfqg9y0455x4vqhmqrc8fhv8mzmtzrt8m","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ivBd7YqF1idB5d58S1G6sfibzRw/DlnUaXd2zdecFzlGvdalVJvvzwTkL/Z7M5rrRmfdJxb9Hky32tVpw1j0Aw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1lh9m4un79rkcna3kzk2qav2nzu4c2rrn3599kt","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Dh56WYyfhq95QLNaVvikS91err/mDY/cFXCTRStjCZ912k98RbLQezlKTW72Kw+tk7jTUPuAfS+gFWuJemt0Vw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dpw8yqzsk23z0vw434cpkhtldqd32vqr8h2700","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Jk3UHmv9fuXhl6aQD5MB04+2pcRxWACeBji9KFbk4nx9LpqjqYbJOPqX7gNGDRicYq/5xBvQUL0BM4dyvb/Ong=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1zn60z6ty70v292050zs00aqp3ua6h0x43309vp","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"7AtoMwejjB0+OGhVJb0YoodRCFSO2CKpHW874ZHjfNUU/bUrfUXPzMFBNKOySJiLQ2Qr6OaMoZr/pEjvYOjusQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1wvjfeck8vu66v0vruj6y32v4qy9l9vjchzwzuy","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Vh6iKcxu2YlgIz1Xfk0b6v7GWfWJwYc75UsBQ9YTxbVjFatdvPyhqHH7Nf7801KtgGQ75aPG60vjplEeUwnJag=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g12vsl72vkygm306py6q6hjyqdsnt5ujeqh2n40p","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"TU14GOCTx1IZhxg9hAqHaziTSu4xoTU+gOW/F2CIH1AfMySLMt7NGSAOYDFkevLWFqlL1tJL3CoUp32cAIHHyg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1rkajd7ftnnv4v4kwgnsw7rqahqjcnqlafcjjhe","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"UXjgoc2F5wI+xAxCOdsAUztxPSxzXJZ7dm+fmQkDwCQFeuyH+sMEElqAQoqblMWSD/OjLvvep2LDTukK+//yxg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"vMk06EBbb7NwqFSJ974Y832kwPuZ0wTcbsne2MxvSf4GJu5DDzdU4NGNXJG6Hr5lERBUzf6E15LQBuJ5Oq/u8A=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"N1d9kCyZ6WZHW0Zc+joCCQdmZQqiZhhWcFxwnYWy3GMJ8fRzwiMxTAT3RGwTd4IL4fQ/ejUgmP4Gr+fgF+N5tA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"D5pXdq0P6uvVQSFrhaIxhWn7Ae7eDBe1r9FP95YPuudc8iFcDiLR7IyNwJq8bCh9orcNU8LqZkgK7d0l3vmKSw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g18jtj2tpzcd6vd0kkdcfdsymgzlmclw9ejqpx8u","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"aHlDLzLFM2z36ZgQMWTJgyPJNJUPQ2MdcqxoouL3NNkcEuQIiz8elYi9lm4RUVR0p33lY2opbRcaZInDF6RR7w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"KgeUByx5AjlNvcCPX7o+vUD0yzG8g8mg5wciuOvJFABJX6zopkYjsTeo6IxC112AlFOaN1cGvZKLhZwNIfGoMw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"BDjXKgU7u9ZTLeaDNhXfCo0vy2U/ryVOmGNK/YIAaFYhT1cTTp499u6+H/kfXiXSmLAhYiAxaIPs+vL4n/vdPw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","send":"","pkg_path":"gno.land/r/jeronimoalbi2/testpoll","func":"GetAdmin","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"Wi1yJvalWR45rutlIzPVDsQw1TASrFtG/dJ8maUH6E9rVHZgY5DSYhzlfrgPHVU9Tixwct6YWLUUFLJ6viobSA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","send":"","pkg_path":"gno.land/r/jeronimoalbi2/testpoll","func":"Vote","args":["true","false","false","false"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"K+iSDXXNcl3mtIOaz7E7uFmGq7YT1pgWwmcx7pFkS71nEyLztB09CIufhTnrDbEvd0+vaCEz206r2qr55T2zaQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g17np07gtd7nj5rh4x582srdhd8247xa3s3us3y3","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8gf7k/4AMApHMHbTebtYiBC4rFQiqm1hKu6Z+MiuDaQsKgJBgwICCjOg3y6XLVJySFOYrMNYXQZUvmGI447mwA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dvyds08axndvanwptq94qxydjtqltxz62hykat","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"YZerEWCGzY1IRkHOMETOA8hscFoFFNvDx15U2Sr5wZE8HWSZT4FArL/l5Q1n6CTjJc68OViyMBR5h4RJ0fgMBw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/jeronimoalbi/testpoll","func":"GetAdmin","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"ITsxswdkGLVjed3PGP0rLExs7+01GUUsCS6fbB5K9Tl2zM7TMX2CVmCE0HywSGvEkMplivFpI4s69wP7zx22mg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/jeronimoalbi/testpoll","func":"GetAdmin","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"h5uueQDm0Vjm++dr5/QamUW0gfFekGWC0p2YPgrdREVlaUNKQmtRsDP8uaDkl+f5g4AdKI/s2rk3ew2L800yWQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","send":"","pkg_path":"gno.land/r/jeronimoalbi/testpoll","func":"GetAdmin","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgRVZeBhCNiXMgeopMseJTFgTUwWKdw1TibC+g1lyO3E"},"signature":"x+O+2lm2afxyWWdJN5KPl27aYn+HkOP04ChiWJWUxxgmw5oYtmUhUDnHNP0jcjQiBxga/8iXlQwop+31sLtXkw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","send":"","pkg_path":"gno.land/r/jeronimoalbi/testpoll","func":"GetAdmin","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgRVZeBhCNiXMgeopMseJTFgTUwWKdw1TibC+g1lyO3E"},"signature":"GhPocE9R8w2Gzk+sWdf2qy4uBiRyGSWEfc0Lw7UC/Pdjw4yggRraw6zN4+gLw6+wuoFeHnMT1jSWJSZYIB9yQw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","send":"","pkg_path":"gno.land/r/jeronimoalbi/testpoll","func":"EndPoll","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgRVZeBhCNiXMgeopMseJTFgTUwWKdw1TibC+g1lyO3E"},"signature":"TdLu0tYXTNxmvFtKY6jazDLSxsTKWeZ5nmL/ec3AoRRBZvXs3XuJI2LDPTx66n1+HwAdCOBJrR1vej0t3g/o4Q=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1322347tt6wuluc2vl8ym7ccfv7lf27t8pdnmre","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"4sRe3TTWeq/Lr9LmcYmwTTALDjqpZH3S+vAuNrXVy04Vxh6ovnwW0q8au9fIXGagxs7knk5LIJ5WCar9y2l7sw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","send":"","pkg_path":"gno.land/r/jeronimoalbi/testpoll","func":"Vote","args":["true","true","true","false"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgRVZeBhCNiXMgeopMseJTFgTUwWKdw1TibC+g1lyO3E"},"signature":"7zERirubmMNMlTIvRIaXjWefyk505xcBU/hGSOOC0QYSgz379GbdN+OEl4LG4zK+Z4/xYDVfIPjc0TJ3BsznpA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1322347tt6wuluc2vl8ym7ccfv7lf27t8pdnmre","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5fiN8MmbPbBkaoh+elCuGFH/tbhxSmCO9I9uSAf2lpEvSlLRyg2GugMmZwS8Vt+N5h9TidPY3RRrIeFCoqcYCg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","send":"","pkg_path":"gno.land/r/jeronimoalbi/testpoll","func":"Vote","args":["true","true","true","true"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgRVZeBhCNiXMgeopMseJTFgTUwWKdw1TibC+g1lyO3E"},"signature":"MXOiOiDLJPGe3mtp39aoxs3aV1fQep1wp8iKeoppOdh7TRXrDMvz7RY5fUsj+1edsARy/N2inLJNo+QsjsmeFQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1gdynnfdc48hqkkjmqawgwxl6rl6cmlkmh5jmqd","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"E6oijfj9jnp+D+2hsAcRXL/+jggBu0FMlTVNO8X8clcZS33xxb7cSc4LEn0ShpBAK0F9bScxPAw3MiwIUXNi8A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","send":"","pkg_path":"gno.land/r/jeronimoalbi/testpoll","func":"Vote","args":["true","false","false","false"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgRVZeBhCNiXMgeopMseJTFgTUwWKdw1TibC+g1lyO3E"},"signature":"9DQkK7wQc6zKm9DG5vex4cztznQLjP/304h93ysBU60E9IknKg1SW532mOUFcoEyL5UJ6FE+YhP8i9yzP6ygFQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","send":"","pkg_path":"gno.land/r/jeronimoalbi/testpoll","func":"EndPoll","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgRVZeBhCNiXMgeopMseJTFgTUwWKdw1TibC+g1lyO3E"},"signature":"oTBzbZn4hvEss6ua2j4TCg89rpthzDiCCZRuQril9mFkWtia4zIzPTHZZlQEH2K79cayimq8KCrkCv/yNalN5A=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g14kl33gv5mxlg3ja47st0m94vpytegpszcpcnes","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5hBrFEt1D34CS/TrUjawgW+a0ZE+ckd4GMkURrWmHIZ+uI6U7tjNJFFcyiQDbS1/CR7mJd+uV+vV126lrnfMTQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","send":"","pkg_path":"gno.land/r/jeronimoalbi/testpoll","func":"GetAdmin","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgRVZeBhCNiXMgeopMseJTFgTUwWKdw1TibC+g1lyO3E"},"signature":"QVCwuPymUKtkWxh9YCM58M1/J3SVm3bf4N9mzQMQXYQVrLeyInalnEON075ewhSV+jxzKx80zxkLfrfyb94Vkw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"5hj9+BR8X+88h4zDUXfJQ7tWcryMnWiL84mxdEiSCc0Xlg2A0fcTEqNG9vcf5wllPA7oygtMBfJiQiTu1OTiMw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"8E1/zl3gRUx/BQFcN0iDgAI0i1lUKzIg0ccou4dvaVkGDqY3zbcZ9ZOwYnL1fgPWjdFlZdn5GyIsjONidEsAdA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"lMwGDpiYAIx2Uvg62r2CrCNECbqcfaGuCxw/61AXcktcO8H2D+XjBsQ59b3cIUVYUhKuUgDqcHqfNpKLQ4dcpg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15m6aajcafau8dy7nes9c5ejse5wtfgc6gcfmrg","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"bQbHWjA1KEaWXbvtUJNVgt+c+QZSQE5ZZXtsP6Y0rLtQk7JUtywAd5o7aJ7PbmhsmhnX9mczNhqUPhXC03WEpQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/hello001","func":"Hello","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"ATjpaqXnvtZ2qW4PCcI4JAl0kmALNonBUOIMvPEvYlgv7+T2BS28nEvDsqU+2zvqB7wavXMjG1Ko6TkJn16z9g=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/hello001","func":"Render","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"TnYaCIDnWWUbeFzbtKM0SscLlhR0ivvR7oocub+3mCddFgLseJTHX2Gb/qZbguEHF6WRBKz+j59F/zfEhS0P1g=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1hwnmzlurjxh4kfd2u64jqh7q50wu55vk408em5","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AzVagUbcdQUiYSOjCYqwLMCsTRPZrd4rAk11w18w2Jgvr1f9bRqPGazeJVPuDbceubAtKGyLVjBoPGMx0dyImg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/hello001","func":"Hello","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"JrodWMJiaYzL+DOYfuH2+0VFo3k43adb7MkEZ3O151t3JZ668NNNH1TMJCp4MWTxQbwa46JMDDObiTvqZuVSJA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1nujevt48ft2hn23nfs8wvggde4j8wm7457d0kj","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"XiqAA4gqdqXjy1lazVTALXNjpVBmsKqNy7755kh7x9QsRYyNKLm9Quz/m+g84KlZlodeFy/dbT41ykoW+FzXcA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1kq9tf4wlpawsysxvz9s2ql0lf2jqyz3p20dajm","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"XFNfJ8WfiRGE5dRNTv6cU5miJNcVExSo1L6gkogh869y0tebrA+lQ08HPZ3vY1sMjyXE9k0PYkIU0jOAEaXKAw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","send":"","pkg_path":"gno.land/r/jeronimoalbi/testpoll","func":"GetAdmin","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"KnjRsTXDLf/ZVfvM/gh7TBEJgOWG4HXgpP0/T9dAEPJRAq68NRJderfrFuueAzUBO8tn5jsYwo+0Tx4ZgumIFQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1q4aw0vtcydtn7lqmkfprm4ncmr4jdj70dx8zke","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"W95Ki603UcTbP9klBf6KKOKQ6jX5XgrOsCK22j68j1wPTDROrZ9fJ8BuSmvaddR2BGXwScJCWjjbGpSDlFr1kw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1709nv99x5vmzuwzhc038h3kcgp5g8rsd2g06h8","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"jkLDKEBQDJZo+3RbCR01DvyJer3dk6MGJONOq84c2zQRZDvyTD4FUxEUI2bfD7ulw06EWO0+7NzWNE2iXZoEJw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1e8u7rzaecgsywzqc0wsmae6u2d0jylaqdxxaf5","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"cE5GKHpxbHzIoVw3h+RiAxbucYWYHsmgb1jxnQZ6VgwJUUbStVuiibCIT7XNw6TuFGSkrKRvq+YI+dhul9I2mA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g19ykf4md0gqea9d74n0vt45wfv5x2ytglcsv5m4","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"BUOXv1/w/Gs1IlUTYh3/cHDJQZ0JgXnOn+81xW2lXpU6SDTtUFXybO3iol6N68TTJsXjCm9GM7O+uszs6lXsEg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g19ykf4md0gqea9d74n0vt45wfv5x2ytglcsv5m4","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"xYD70ILFpNGZz6U+icHdO9mD8ZV3nE4o1gkdwqUqGDMOBfFXR3ErEt3Fr1usnpqyTZCfZQlAaYyQOa1B4FvZ4A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1f748xee7gpwldyrz4xea3nk6hw24lfya49fus8","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"JqN3nn7EYCjB/Mig8n/aoIOV22xW1/h0Ye5aHUJGHKQtL/zEWCKF/fErwftCH+SZR9VP7418wpi7SOP4gyU+ig=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1f748xee7gpwldyrz4xea3nk6hw24lfya49fus8","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AsfGYP4d45M3jSq3Cs02mX9XC3pIVzEkSG91ZXpsKZ2s"},"signature":"sZWESoY72xvTSynFyIkEiu+g0Iaj2vJtP6wqL7MYN7J0z1Hkb4cXaSmzUOv/84Htu+kqgzgHYc2c98tuv6mVog=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1vudhmep9ns3f938heglxc3a5jfwpgh9pz4xtwe","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"nemGxwrIoOBzUn0xSDrF7O2Lmmpd6QnjrDrGcsi9V04+0gDtfex62XdSak+Alq4rd425ijICxKyGkolzRSydbg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g19ru33nlzs356eyrz0620s7wpusxw7553zq2t3u","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"FaQbevbagixmNfCa6KkSKYP8Edp5DqsDlw5UTkpmfxUwIZRwvn/UuH0oXlVdFufLERn6vnT1zVrBkbvB8Yii3A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1w7r45mkk94egfffcfq6dgyz08gymhty28xaxsg","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"uAsWv5FS2Y7QAX8GprTV3f+SCf1jPlfwGtctbxYx4w5V7wEDDF9R5d8ZjKCsarqfZhUWFgbnKoMqtUKbvYEfhw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1g2ppsp62d2mcjy8ajw5yuu8qrdnryuz9rx3uqq","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"DPm6kJtH5brR/v/5yDFgu3MblwbxuqQvlDnZc2mGicF+Ftcd8WR/zR92vXWHDBNg+tKHyjvr1C1ODi/WL+DKgA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g13dey7ppg5qra55w96tz5pxwhluracmvsncpvcp","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"32WhbI0vvaUr+v8J8aj/O0L6/8E0mISx6OUhKVLf/uESjjPEP5RYuMjyl1Tj59z/G8xeAdrKwJuxYZ+p4L7+OA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ruq7lvl98p5nwvmz0ws58pqdw07qlw4wk3fw7h","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"iPAnwRLaG2aDU2dpPv8UdRFK+99Cv7Nm6B6+xPXGuY8SnWyeaUsvgqE8MqRW240GmdT4QutHSl9rUYvf46E0Vg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1zvfw42mzpa5ddvpkxcwhcxkpt6zy9zch4lrzf6","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fxE9M2GTAaoKrOsoVsER+Tjz0huL6zRaxHmAhaiZkjU5ZBibPqKcrKspbrGaxCWkUT4hJqCt7x8TpD/B/8k7ug=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jsh6v8050lz2n9fsxru6tswqqjpjp95utly55h","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"+nqZ4nQDoHKnf74dTBIeyb7rhEyapTEekN3lchY2cchTYQrAQaXtOZ4hHSCWSlOnmNmuuPYFLWpOatRSRaxcEA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1fdcd4a57hx6hqmvp70n8ht0dlmduyfuhsf7srk","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AfDjwWFbRl6Hpg+s7pgX7L0YwzHJc2EIRV1qmiFbZ89G5bwrX8663sulLNUE8WOXUYSjKY08OJya/MJUGAaIEw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1fdcd4a57hx6hqmvp70n8ht0dlmduyfuhsf7srk","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"40Tt6OdJHerEtSy7kLDiJTXoPRiDuHc3DZx8j6SIw1IjGc7o+Vv1rw1pJlLwSlewCA43vuQCwrKJe1NOTQ3hSA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1fdcd4a57hx6hqmvp70n8ht0dlmduyfuhsf7srk","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Xwk3QcruG424s6aiCjXgCQMSvAUe0gBRZSlyDLMPJjsXst6ju0yf1TUTmx5c5TaK12thWvzD0RQruBWysIBy4A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1fdcd4a57hx6hqmvp70n8ht0dlmduyfuhsf7srk","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AinQVrecvPwxlVWvPowR4SDlmZBU80PVH/HfGNUy/UHq"},"signature":"Xx5n1Yl48m3vZFI1D0ZKVC6UWAOFj5NFKdgNYxMd3oUCwgdbNQnw1PYCWxQE1dJ8u4lhTVLs7+lIGe0mNmKnyw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1t5wmu8x093ac6xsvqdm2v95a3ekk7fsrp9sm77","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"W0ex2Z3Y9GUUA9ccdpgWio9GVahAQBVmCkgooiB88R4tymu3Q/5PECv0AT0pzfG34KqLyl2a4Aua4oa6lyVZ0g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1t5wmu8x093ac6xsvqdm2v95a3ekk7fsrp9sm77","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ghvPfwVkUw0PdkZDoOuxshvqhQI9goctz6UQfUC1ipJDZsBR/sqUE/j5plT623R6bdSej6cx1d8v9YdZgEywWA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1t5wmu8x093ac6xsvqdm2v95a3ekk7fsrp9sm77","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Y7nTs1D/ssOvPl+xyXD3sVoHChozkts8vATW+5F+eHpPtpxqDPZxioS3lxowag87xj3BWOFsm9xYxQ+fOD75AA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1tml20hzkmftlheal6jcg00h3qzadu8adsver64","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Z6/Tpv0ubsE2Qb/tHdmc3rNUwBXQHgnLZLXAV2PJN4EtPr433fWCDDNnvjB7eomgxkTQji9vP+oGusrMZ4Wsiw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1y4xxce0xjtpy3w72dfj2tmxsf9dc7aneyxvqrz","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"j4xRvZeJnLR1lNLVaM70/j17ZFgEJozB2yjCPj1H86E8vQxBwmuokip4yG85rAd9N7NAkBKYWc4nt0l1ORDXSg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dndupzzhfffctfllzl765wfkckth30xrcp2r9k","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"hvtLd4pDuZuq3QafGD5zsLRzuqaxT6KJj/tp2eLFINNIEioUwRN666Ue+6wS45gRWXBg/XJbfNDE95fEmY11xQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1t20he984hqsd79y32c20uezq0fgagw29zpstza","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"77rCxYf5Zj7WwwL5fCxKPR6AFxtzNojeEoxUrE8lu2x5LjXE3NKtslszrYSxfROabCTlQkZugTXe6Jrf7Wk28g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1t20he984hqsd79y32c20uezq0fgagw29zpstza","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OOgc8RsCcTRALzhwIVal3bSHD7ob5hkoPYA9OM1AGQBFb2Q71W2eQ4yLjyd/pY1VB2AgA7EP3/oTsAbrbUyAhg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1u5qnxr0h0u8gu2v7rzccqu7h2w7r8wu4282v6v","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1OMANCmyGLRjBlCC4oLNK2DBtfSvOtRiQTJ7dDfwkwxKXiPR4QpkXI/hQ4yvvisvaMFyqlpHb1WRUPLMdG9hhg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g130g97u00ayr3gjr38w5qpf4he7xku8kszwe26y","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"tFCflfNVQaohHPdMsHzzZkL7sxRYBYiNveA0xYsQ/LwPy4jDUUM47Yw3Mp9T/vdWoFSd0AZPMTGKZlmE5QhxHw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g130g97u00ayr3gjr38w5qpf4he7xku8kszwe26y","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A9qrusMQFIDdLNttvkGh7qxDNZfcZFxbdDpBkzXDKEOt"},"signature":"0nesnepPgkLgCLE7Xl1M/PC2OqA2hkDmDmWE4/t0w4AA+GcBkVLbnrZ3uj0SRx61bYLpU73Zkff8Ey/XwRN4iA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g12w28y8g6feadunkl6wv7w2e8yjnal0j3p9dxhw","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"QfC/VuqBLoRRHNkXbbxEu7kwOT4OL7uz9wcgTS2W8gkQQYQVEXqME5DnNNe2+BnBcGzBZ7+VmT3eZRyssCGRTw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1aggt5sr6y3dcsmhu4kp6vm857nj9mpey50yum7","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0VWTVO5ALV86Fv1oj1GYTCUDmSjcXRwdOhOuMyhl03UidWSXQFMMjAhZQVQSL1ZgzxPRJ7QVOKauGYGvgYvWBg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g130g97u00ayr3gjr38w5qpf4he7xku8kszwe26y","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A9qrusMQFIDdLNttvkGh7qxDNZfcZFxbdDpBkzXDKEOt"},"signature":"Tsah18CtQtCNZ7Q1AwGOVzJTrpR4EztIvyOrtXfVdNBbgJW93ANqoNiEj1zPQxhyn+oTD7U3sfyEbbZ2N+ywkg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g12w28y8g6feadunkl6wv7w2e8yjnal0j3p9dxhw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AuB8BNOWimpiFHaYn9DH45izPbiVxvZVbADaTft4iDD9"},"signature":"8Jux1XRTaza6/JHu6Vqe7xy1kAi5sNmcyHxuecykZMBh2JEZt6M49r/uUQVcA5ZCZogF/4slLDJ/VzZ68dHuAA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g12w28y8g6feadunkl6wv7w2e8yjnal0j3p9dxhw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AuB8BNOWimpiFHaYn9DH45izPbiVxvZVbADaTft4iDD9"},"signature":"zbzormyXUY3MNSzn7LkkVA1VfHzyZKM0MndZzJSqE6xTSHjwymUa0innxORBsWx5XL2Y+nbV6MXS+QCx5GqErA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g14vxq5e5pt5sev7rkz2ej438scmxtylnzv5vnkw","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"N+L3IWo1oh0RlUsaCHMoLGTh0uYhmRHoD93F38sNfmwj9JzjZKY7+XOSW2Dv/8Or3KFBjb8Laqo/+1tweF3Gqw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1f9cz0xezps2mxcevdhc8nxcrzgnuyvzy6dmwhd","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"J5NFNFmjkxNuW+fPEANkwKht0I3V+eNF00s8+rv++FpWbNFzD0Bb5RaMBLzUpTqPEoVHFldy3sB7VQAxuNetGQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1f9cz0xezps2mxcevdhc8nxcrzgnuyvzy6dmwhd","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AzwKh4+N5MIdvQGwVkrPwu8jTuoEKVhk4i1Z0RA2+yyK"},"signature":"6q7ucVnUXPux3Io1pHmQiwPNcWg2yQYLQBKX66duqVdRLnp5pmY5BgLj4yqT3DxV64WRWEYZNaZW/BIYG9cpiA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1f9cz0xezps2mxcevdhc8nxcrzgnuyvzy6dmwhd","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AzwKh4+N5MIdvQGwVkrPwu8jTuoEKVhk4i1Z0RA2+yyK"},"signature":"61ZSjDVNxgAo1x8IRErrjxcIGmFHmevylT9m7nuuJDV/9FGpT4dFlTHqL3Ip7gV6dVzQcc0JpsbBZHymFvHo6Q=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1f9cz0xezps2mxcevdhc8nxcrzgnuyvzy6dmwhd","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AzwKh4+N5MIdvQGwVkrPwu8jTuoEKVhk4i1Z0RA2+yyK"},"signature":"q+dpDHdIRW8pm6SW7NH6nDbny5cvy+UBOXDq4984m9RuamAg2pAq6Ij7/A45+WX3ws3wAlVaK0hk8VaQk8N2QA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1u5qnxr0h0u8gu2v7rzccqu7h2w7r8wu4282v6v","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"626o3Rv0s9bi6lrQVIxaqYIDeiptg89Nf25qNbpQfLVnaAZqiFYFBgy7DXdkxcKkpU9IjNwZBN3UnWh5unLqkQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g130g97u00ayr3gjr38w5qpf4he7xku8kszwe26y","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A9qrusMQFIDdLNttvkGh7qxDNZfcZFxbdDpBkzXDKEOt"},"signature":"ScYo51ua0SEQsz1f04RnJf3g+ZUTwgDbESmpg/jujuJ4Se9BR3tTpxMzOjEFAefILFwF5NgI+LWmx0ciHXAARA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1m4lkf0dg9lar74x3xcukj6c0svesv5vduq5l35","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"XExp4nEvEEXT4Uw/KdQnz2stmEX0H7y+rYtCybWlOYcltruVI9x0n1ut4ocXR5XUzcAIT8gcbN4YTjMOwj5daA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g17fuh620zyj2wfhnx75anjfjaudt4xqd4aq79k0","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"+eeLbNqfSVDEfKCHkIkD5zV0yx14OkKqTqx6UMR7On05CX3hhmQpNieIXDDMukl0y93XY+sC9kuImc5qHuMQ5w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1w8cpkflxysztll935x45llywtz0rdwajcm2lwu","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"lhBQLidU0q8huHXh+m3wGtlH385UP0v81vH9GzZv1KUm46cGOqTB3O42449jOptVlM1mJ+0aBgGVbprBiL6/wg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1e9jwge5j6lp3lmpvsht0a7aqsqp9ct4380yzw0","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"+xNCx6I8iq37X1BtyQDumkR48Ej63YuGY1i01P5a2kMMvbjg9exSiLZ1gWicGiMxijdAc4xtV6brukEVC2QO7Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1xfl329g3xy2jky0wrcuc6emqfu9kky7hprxgl4","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"owmCoVWEnRJBuOAkgnce4YBlZO/yhhXcRn5o+OfuUOBd7pcoVkhs9cqW/+Slf+CKjcfl+ujVETkIwS27qgTf8A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1h4tg9p2tf4krkrd2jqecs0wgtfpp9d5yp4l0tl","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GZhm9LZY/ffl5yz7SwfnlaQZR+9KWXR5BXnFlKpvYPo+vRYNpmIVZpDMHKdXZOl9ZdMkbXgK/cRSrFsZgTQB+Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1yghm3zzf6u3gqrqecx0rhqrslhtfsgf5h9kggy","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0X6eraNF8Kt9IbDASQd9MbwE7HPF4t6oS48SYWwarj1w543IiR48CgyPc+RMsE1arZZD7pRc1mmA4m7ltuQ19Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1pgr5hyw69q0slyczjv2w5xx0x25337y7pjhzq9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"DySElGqZAXZkuGu4veTZHOZ8Yd33zwoK3LJfMs7nrWYM6PWShYoHzYqWbtMNkyL5vB/bWqUh5CY9onjeMYdYFQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1pxwk028jhq09fg7ey30xe8lk36su3mk73vnwm0","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"2CPyWy1b8WozkHPyXxDfEQMU1ZrwkebP52R+Qyev9fAvym064mgUUkeX29S5dZ2XjwShIuZXUStkvZZE3sR/mQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1pgr5hyw69q0slyczjv2w5xx0x25337y7pjhzq9","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A3Z7lP+LaLsbriIstwGgkAF/+w14ik3fo/Mx9+5XhY5S"},"signature":"ATs3Hmlj+g80FZD1D99xR++LjNXEx4lgtaPGRtPWWF13CRYmtQf7x96PrVkMrp7P/c/0PQsPi2ypXxJHxDGy0A=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"zcooq9zGQZCPvnMANndZ+l4iIoTay0DeG+EIY77M/KhJRjpHX136SuIh/XCpllyZeACTBwcKJh2sNdDh54CRgQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1xq6suh33r3dkwps8c89my04s3k3gyqjlpqxcgj","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"B6p7KEK8YK/NXRQW4aI93SZp64QRlZ/lMV/hl6iLB/NB4ylu54Bc6yU9iQiA1nmKLblwF053+esZYQCJPc6Fdw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1w8cpkflxysztll935x45llywtz0rdwajcm2lwu","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"eBe1UEehXovlqnLCrZxOAEOxfo/tVlrwn43P0HWlWFtqta+KMqCfF0BRDaIUyAvTjsjruGSyGmAtJg6MLFHUmA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"cMYzoqi5YntghbKjNfEM2YYRe4KJF+I4NpBUOHYjngBtoLFKXk/u97YYRca7Ba3fqG6nEMatTGKrIp3hLAdKaQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1303986x7yqr7fux0w364hs9z30zt8ydd5hqj03","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"/r2UsQxH2w97vRAwYFB4h0N8TNoDJwMMaJXlyGQKWXc+PDJIaxQAkMdX4Eb5u2yLWinVgoLyn6+NFIs3+OQ0UA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10cg5m6dzuxcaf3gdqqxm4c6pvzslfd79r4wwde","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"XxXGcxM5P9dphnJNyPCQrE/K+skhZ32VkqZK2BZh29ZkroJzQleq15o1km91OqIbDGEX3RSzJZ/uJPf5DZd0OQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10cg5m6dzuxcaf3gdqqxm4c6pvzslfd79r4wwde","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"gacSKgkbJ6v5xaWe9dFJIUUpCxCBI0TA5pI4WPZIt3JfT+zDCvtf2QF4FsSLgExk9L2dyUc73ONnmwCelfM+XA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10cg5m6dzuxcaf3gdqqxm4c6pvzslfd79r4wwde","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"zHEfIrnYbjN9jgVCoPmRGzuaVW+AQssKwV3DtmYssUZON3YzLanvchNThhwCltB614n84OHZabFtC/PiuBKYzw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10cg5m6dzuxcaf3gdqqxm4c6pvzslfd79r4wwde","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"MarzYwbYl1ekcsWS/r7EANEEmGmArVlNzmCH9il2qDl0uDusMPCMgNyU5HGvsLGTnMwoqvSy/8qLBbXPClwsIQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1303986x7yqr7fux0w364hs9z30zt8ydd5hqj03","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ejzUMi8GKFXXBCA9DPh71U/skTKCxBZ9T7cfr7DSowAHMunX3HvKQiC6h0a4g0zSYHbNZmlDwKIW1/8Xo46K3Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1zd3aykct4yr4steu6f6n9t9z9emwhrkc0wgzef","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"x7sn7Onk1JIn+ozVEpCwLSiNVsTXEcgQsTtGFpVMTYtwMfa/V/BvhX/qr8Sk/MBJlnm/c8I0HDzxWucHeEiMqQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1zd3aykct4yr4steu6f6n9t9z9emwhrkc0wgzef","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A0yKzurCYH3tCglpJlbOlwBHla7694EUZKb6lJu+3ugA"},"signature":"fpgwUTCSJ3vYBC1j59Zf0HEOYqi7eC3wN0EWUrdxVzcnRXB0W1jF1gdhq0QNKWQa26EkL8l5CNJ6fLS4Obl14w=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1zd3aykct4yr4steu6f6n9t9z9emwhrkc0wgzef","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A0yKzurCYH3tCglpJlbOlwBHla7694EUZKb6lJu+3ugA"},"signature":"B/NaBMY1qXd+I75uZobQUUMb3cfzTo/vgfBQ9N4Gup4csQrDyiB6wZInCx96IR3rPj2jrEjXVnD7kwTDCL0hHQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1zd3aykct4yr4steu6f6n9t9z9emwhrkc0wgzef","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A0yKzurCYH3tCglpJlbOlwBHla7694EUZKb6lJu+3ugA"},"signature":"aBYyV/qeu3aw9BjM0PSXkFvGqBf9rY2haYISIi6z+Tls4m4iNZBG9a63lubqLLpsigqHWv4Fem69TvBGy3kA0A=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1zd3aykct4yr4steu6f6n9t9z9emwhrkc0wgzef","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A0yKzurCYH3tCglpJlbOlwBHla7694EUZKb6lJu+3ugA"},"signature":"Zzw6elmTU7HabQ3AoksKgYfLE9XyisbO2FZb9gqvYdFjmyaXm7BhF+LaHJ95diK3HtCQFicho5GXBuW3lKasEA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"xZzw5d4m+l7w6WpdVYPK0g380elHwe5nyegBNuN9LB1Gm0sBc0QKXc0Ql9YKQga17MP8LzJUyxtb8qASjja6DQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1rjvp8rxukfel3c22chcnw9yu4zqz7n4nypdjeq","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"4s4XrLjWdo1NQPJowKRBTNFoNeOyaE2rbZdbICt3BAQVPPduxX7lu6g3VQ8BoME4QpuMKLsCVxQEb+roFHnTWA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dvfhkhjp0qgrrm4tr065aqz6ntjs0qr7rtmxuu","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"eo1LJXQdrtBilFmPXzihm07vMY2Cht6fgAcerMYhJ80ejc86s5QI0+Q/tCQsF0z4yShzxMOU2X0v+2TVIg/YPw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1dvfhkhjp0qgrrm4tr065aqz6ntjs0qr7rtmxuu","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+9xx+94xhyiUTyIGc4DIbRdl27WwSGo9O8Ov0v4njNZ"},"signature":"rQBlpjap/62yl7EySfzFdvHI+P0Q6i2ZssQ4OZCAyOsT7VX/ze/V3GlXETKIA0zJ/fLuMYN7Qe/fOrYfr/aCFA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ajg796sf4f5fu8lu9eu848cew3c9vl7cj0nmnn","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Inw2kZQYBFmbpNR/GbHaDWF4/JoyPtLd/JJRF8k7bKRX99YhuIPlj5eLYoNvxBYxba8h/eZfUNITKtsQMqrbaw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ajg796sf4f5fu8lu9eu848cew3c9vl7cj0nmnn","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"FixROIloPP5mbxaL7aEdzJin6oYk0Clj9YnOeDvS9XoNsa9pADGf2K+OrOKc2RB4fzO0Q/XHfvjCNY751LnImg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ESloqIJWjmFmXGv9DQ18+oUR4ue4HrnBMr3eqJaDKuF3tynXkPh24allgs49IeD+vXAA2lIj+r8pGUFuDBd2rw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"uv/zKnGMd9frS7T5Ve38uf62d7DFDEr2DZMS6ZYCRo8vit8hh7Az/2skSGmrq5dHOcGWybyg7FGdyrOCU5ftAg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"uv7gGKGzv7++VGiIlNE3BW0K1TlDOnRqTC62YVQBxvhfsjxzU5CWw5KC5mYgGp2dcGyq1mA+QKnIm5qALcEr6w=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"caKEocQIZts7aQPXd58MkvUnORwpoDsW28kZ5dWtD94eRkNpwDsylLkW3kC/KZqTWtCSmVyEWE6mep2XR+Vmgg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"aGjtHwV9MJL4g0BDjYXSJlhYQtVCSRPiMM51IrrkAqhSy1+MFMeUuMp49gKIgoDbVfTbFNw207cA06q+8ehbmA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"VK708FR8nwskxxGnGTrO606PxbmvR82K9DO8+5rNoi8RnhWBQOoHKMfWXHby7mVlZmylifE+keXwv7SVQwKkVw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"9000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"bhPV72NPx5kmRAwkGUFd7D9OQrAARHKVXZjZPKr/lycmkaZW7mSOos2Xz2lsHwX1EKI9Ek1OdNSl3MmpOrlLCA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"D4dUbCeOknWtXxRbkzTX+LIrNAJi4MM8XjeSJRzX1foUU2zOSKiFC19cAXiY5qVpzrNmDKzSYNoYUoq/DKhMcw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"OzQoD8JAQJXOqLS2ZZy3F6t9HdO2Rk1Ws3aOJb/OZRABe5oFqg2KPnu6YiXngw+sppBL6Od6fNW1FZf170VODQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"7000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"JvEGvUzTPGY5/SCTU/h2qVE3lytSSKIaZ3yIJ7PkkWtcqOokKrgGZNRSZCcvD/UsJtxpingtbsrRlQDh6kOK+Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre1","func":"CreateSubDAOAddProposal","args":["main","Create First Sub DAO","Proposal for the first sub DAO","first","First Sub DAO","Some bybook","g1uf8u5jf2m9l80g0zsfq7tufl3qufqc4393jtkl,\ng1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5,\ng1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"zVKXIqE4D+MTOOJ1coeglBPUm6Q5UMaexaKGEmhjRUIHYqkMhplYpdfy0HyIriMbRD+EnIb1cwrOiB2km9zrTA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre1","func":"Vote","args":["1","true","false",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"Juz7RkUlbITZ9G09EuJyYJ0dGrv57iMpzGf2KtRU8I9Dx9yOY9nNKelOE8b5bpXtpb0kDBvSgCeh7fPVteayOg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1vh7krmmzfua5xjmkatvmx09z37w34lsvd2mxa5","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"LcJZdPzdGq4VSW7dDstQZIMY5XWqkT3B0VnTIn3vY1pclCAI2+uU2c2O9NalvbU1Gl6pDA3ewiV2x4aEpqCitg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1vh7krmmzfua5xjmkatvmx09z37w34lsvd2mxa5","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre1","func":"Vote","args":["1","true","false",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AhZQixZ1ZXKXC+czqzNTDa78qEvD1FKMeZg6quhKcfA1"},"signature":"h3z5RiD6PT7MzQkfXhXSnNfbQILs/xNGQyfZwPAeejp1ZPUz46gJBz6CM3tdn4GkUqSdbLADKGvuPBGs1rLA0A=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre1","func":"Vote","args":["1","true","false",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"Vm1H4fzNSPlJucArKHULgmrkM7a8QhwLm/n2BiN9/bt4o24sdbu2T13cCstLXHpeHuTzJZRgCokqZn71R3DArw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1vh7krmmzfua5xjmkatvmx09z37w34lsvd2mxa5","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre1","func":"CreateSubDAOAddProposal","args":["main","Create First Sub DAO (2)","Second try","first","First Sub DAO","Bybook","g1uf8u5jf2m9l80g0zsfq7tufl3qufqc4393jtkl,\ng1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5,\ng1vh7krmmzfua5xjmkatvmx09z37w34lsvd2mxa5"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AhZQixZ1ZXKXC+czqzNTDa78qEvD1FKMeZg6quhKcfA1"},"signature":"L41xF1xOHZIDyWnxqIxFagpgKLiJ3816oVhQQ3ie68ZJiqt/MdCOHXgINJL09FTI46Z4XNfFFnGZi+AzyZN8qg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1vh7krmmzfua5xjmkatvmx09z37w34lsvd2mxa5","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre1","func":"Vote","args":["2","true","false",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AhZQixZ1ZXKXC+czqzNTDa78qEvD1FKMeZg6quhKcfA1"},"signature":"TOUChmoLVk0BiePtB5E4+9+bJYRyFhI/5CpUTRHnR5pBZNk7BrJvPCO/uvB+g8GhsPy60QX3B6nsKwPM+LLIEQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1vh7krmmzfua5xjmkatvmx09z37w34lsvd2mxa5","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre1","func":"Vote","args":["1","true","false",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AhZQixZ1ZXKXC+czqzNTDa78qEvD1FKMeZg6quhKcfA1"},"signature":"eU7aiK+PU47HE4mr15lYh9MLWB/+B5Kbjl8ZcpN/jU1Bhfa52g0i5jqiVTEGlosR+0VIyaDlDiX4/NSbrIw4gA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1vh7krmmzfua5xjmkatvmx09z37w34lsvd2mxa5","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre1","func":"Vote","args":["1","true","false",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AhZQixZ1ZXKXC+czqzNTDa78qEvD1FKMeZg6quhKcfA1"},"signature":"wQ1mYUXVySeVWnMCtSGgquXuQ/PSky5TgV902WRc6toZCljait2eopRe+H5xaHvLAiKjQ9aeqOnlK+/xvzKMfA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1vh7krmmzfua5xjmkatvmx09z37w34lsvd2mxa5","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre1","func":"AdvanceProposals","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AhZQixZ1ZXKXC+czqzNTDa78qEvD1FKMeZg6quhKcfA1"},"signature":"CfsPwSPgK7D0mso+FXX4IH4sTobARBTPVx3Ir/8wyE4pSKd53R1zBR3CsZEPge85iv/I/e0KJyQ55v3bkelIaA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1vh7krmmzfua5xjmkatvmx09z37w34lsvd2mxa5","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre1","func":"Vote","args":["1","true","false",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AhZQixZ1ZXKXC+czqzNTDa78qEvD1FKMeZg6quhKcfA1"},"signature":"d2tEY9pJ7o9pjZJiBl3kWCjKz7ZrVtPCVoHW+wZXMDZK/JfN+l5ejQdkr7mJi99qIcN5r8ZabFxx7Zmegk/DNA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1vh7krmmzfua5xjmkatvmx09z37w34lsvd2mxa5","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre1","func":"Vote","args":["2","true","false",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AhZQixZ1ZXKXC+czqzNTDa78qEvD1FKMeZg6quhKcfA1"},"signature":"8pSyTpGerkqP4G1ocZRQ/S/c0YLN1Z6YtXt4UcmP5TVCBj9lnd5xWJ9g7lVSGlIdMLJjf6zxb+LmMRkdRb5WYg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre1","func":"Vote","args":["2","true","false",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"F1V93PgW+Mf+0Uykb9jPpCG0b4hdJ1EZ6pp3Hz4U3hNxHP5gmDQW9hQDnIj/kzTZ+9VWOn31liAVrJiQA45H3A=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre1","func":"Vote","args":["1","true","false",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"qs45whgo6ajblUQYe4ZkV68WtHlNBN/8/PQG0Smi2nU+jjWoT94KaJf8irBnYegYyU8wCEaXYVMYLQizZYtICA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre1","func":"Vote","args":["2","true","false",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"oEwuzOuwIl6OgMpw/95ZuIW/sGJNIKp4cVv65zXgqYUwx5p+i2LbrPkXVB4OpRao/jP4gIejeTU8oUrtiVugOg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1h63xr9dx0xluhya9zhvqkytmktuuk4t9ylrq4e","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5WoM9kHqIQFZLcOxXIHxWOzMTe7gb8EKkH53lVrY2kJQubD0P8SqIVG028WwM4UY0phWfDIYq+FoOZiniTTRFA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"9000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"nUGBf2P3bvml+GyatKljhmX6nnnXlt9lhUR+Wgh58hx8SPQTf85dQ+RGCfJn0QQX36oJUAy+XTmCY2ZlJz+geQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"7000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"/BXa0V+M/2cN7zqDXV5Ep0oRcDENKQ2WiTEFmVmX+W1ZJzPV5iT+skBeO0Qw1SLPP0tc9EDmjr6ucgAgGXkSgQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre2","func":"CreateSubDAOAddProposal","args":["main","Create First Sub DAO","Some description","first","First DAO","Bybook","g1uf8u5jf2m9l80g0zsfq7tufl3qufqc4393jtkl,\ng1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5,\ng1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"UU1z4DefA4OmuHI1ibhoKVoJ1P7JD1O4C+J99ipiy4AJO+riwIXkphgn3j6kWd6truaUzHSHOEyHfqMEM7fOcw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre2","func":"Vote","args":["1","true","false",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"o/NNZ7OnV5/BYOcJNY1A6Ww2TrsYIii9nJkRq73nGr54Td5pqMj41K6lRkLcoYrqGwGkkB6XPX6LXUQIcV0V2Q=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre2","func":"Vote","args":["1","true","false",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"OJr/jhZ/eLApj01BVh+2rYw9URSeX2mXsZ8h1ltwp7om2jA5cyqcZUI9Qq9JGYjsXa+UpAbWV7/VgV7wFNn5KQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre2","func":"Vote","args":["1","true","false",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"Uoqz2RmPocUET8cSxsg5ENYcd5wHtuvCgrh5fl7aOKdG5TePDXUjnEWyTUKr4XJVg0SLmXgkj/VpHP27Sf6cUg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","to_address":"g1uf8u5jf2m9l80g0zsfq7tufl3qufqc4393jtkl","amount":"5000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"zkj8BgiSY1kyh2J3AIvk5xxy3jLVw0KnjXgWkKW+4WovJ11kN5UB2Umu9dfRCCIAq6I863Uq5oK+eKRBxSULOQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1uf8u5jf2m9l80g0zsfq7tufl3qufqc4393jtkl","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre1","func":"Vote","args":["1","false","true",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AitYIWT3az4Jx3hGzTapJ6hyalJ6EYgqQCpYoe7Gx2Sw"},"signature":"jt/CTb83MC8OFH5DaYJuD6hqqiyjKDeXOfhx/UdLI2MRE12HDED0R0S4aFNL/ziNMfZRzSYWUr3ug68g0Rr6ow=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre2","func":"CreateSubDAOAddProposal","args":["main","Create a sub dao tutorials","Create the tutorial sub dao team to manage and execute tutorial content ","Sub DAO Tutorial Team","GnoDevX Tutorials","This sub dao is mandated to work on devx tutorials for Connect","g1uf8u5jf2m9l80g0zsfq7tufl3qufqc4393jtkl,\ng1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5,\ng1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"AquV7EsxvU5G7kVIBtfodM7yKaV6NosQx4cYpER7AgQ6j4RClqKbFwFXWyqo73S08r4nuj8llOcUcgsKACA6jw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre2","func":"CreateSubDAOAddProposal","args":["main","Create a sub dao tutorials","Create the tutorial sub dao team to manage and execute tutorial content ","tutorial-team","GnoDevX Tutorials","This sub dao is mandated to work on devx tutorials for Connect","g1uf8u5jf2m9l80g0zsfq7tufl3qufqc4393jtkl,\ng1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5,\ng1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"sTLDRtFoTYmKYAg47nQw8DvOBqlofhPCCfKUxLYn88ds7OmYvZeidrtqKDQEGFa+fHBKnf1ZVlqNNZvPvyg4AA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1uf8u5jf2m9l80g0zsfq7tufl3qufqc4393jtkl","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre2","func":"Vote","args":["2","false","true","For some reason "]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AitYIWT3az4Jx3hGzTapJ6hyalJ6EYgqQCpYoe7Gx2Sw"},"signature":"g+96Gn5W7ykulWnCKntu1L3fHW5Jl+zs0hMfiCK0fg4jD1IGR7i4fLs+2LuIOkm4BBL/jS8z6RO38SLxddv6cg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1uf8u5jf2m9l80g0zsfq7tufl3qufqc4393jtkl","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre2","func":"Vote","args":["2","false","true","For some reason "]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AitYIWT3az4Jx3hGzTapJ6hyalJ6EYgqQCpYoe7Gx2Sw"},"signature":"48FosFP0/8ojs6xlI3q9HETuM+LHhvh45o3L9xVMLfx0JmK1IrrRV9ptDEyjIkjCzsuQkFgpXr+ZR+RFIayB4w=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre2","func":"Vote","args":["2","true","false",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"dChcXf/ohilYQdnS4Wi1BnwnO8FKt2iQUg9tAcBAlVsPI3OLoOb6fwY3UTylOgS1RtyvGxfEc0vJ5/T8Jsz/yg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre2","func":"Vote","args":["","true","false",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"+fYBk60Yqw+xLhjcuKf/+6Z2R3mq9vNhpvy+ujECUihTnYg+wLZIxNxvEth7BlcQ26sdDMOOm1fiKT/RC/qpMQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre2","func":"Vote","args":["2","true","false",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"k8mXnFOqt4g+IPVof00MyxUZXhhP91pLMLYPy9BDs+pb8uDCYrhnHTM57KiXYGq8ss5AUDxKkwR1zNQaJ7vc6g=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre2","func":"AdvanceProposals","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"HRxEm2SIBW/nOFwCxdqOHgYLGIjm4tW2CwmKeTjgpmtNqWxM22DxHsqiP2wIX6SV5UuYlhhAf2/k9yUtWtuF0w=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre2","func":"CreateSubDAOAddProposal","args":["main","Effectively Create a New Sub DAO","Third is the charm","tutorial","Tutorials Sub DAO","Bybook ...","g1uf8u5jf2m9l80g0zsfq7tufl3qufqc4393jtkl,\ng1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5,\ng1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"jf70QS5c5VHgQBPMkb2ErEt+ZRNqI62SR5nxskCdBAATYLDB5HpIPLO1MwU/THy/Ej5fAbnJ9zK5M6oLz8s6yw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1uf8u5jf2m9l80g0zsfq7tufl3qufqc4393jtkl","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre2","func":"Vote","args":["3","true","false",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AitYIWT3az4Jx3hGzTapJ6hyalJ6EYgqQCpYoe7Gx2Sw"},"signature":"wwa/pd6LZHgLmm4FI58cG4f9tPGPduDZI6MOI5KZy0hX0KhV38yHZxDTuo4Gzo2e010JoRCo2/1ehpPqIFBqlw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre2","func":"Vote","args":["3","true","false",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"l94yn+vqPU9JlzW5EpJUCQ/yM3dvjbzEH8DNac2wIvxMeyqXtn6xXCYTFRBywHlOEHzF05Uun1jpHQVdthug7g=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre2","func":"Vote","args":["3","true","false",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"iE8E2QYPFdN2M5E5bjncSnOgbxPWrfEHUHgCGEf6btYQpHGcG44tgCeoD7NOESbHS/VxHubv77dmeosqMycKRg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre2","func":"AdvanceProposals","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"9v2xBXC0hQJhvJyGpf44XoG2N2qYbqRk0+MK4h1DK9R8DiV/QwUAFTaR2PpXYZc/wa309FYh68npLQ/1cQJlzg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre2","func":"CreateLockProposal","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"xEmGVvUSwZCjyTAdmEtQsW0Qp1QxPaEqYPqowrKOZN0uvgOzktP5hXkC4CKGcWALF/tLNOAQXppFmkuwGvNU/A=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre2","func":"GetFinalDAOStateHash","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"o+C71u/YembOiLBHhoCT4lBfT2c1OpFS2K47erEatYcDhf/OsKNVL4l1BLTp1VUxWYZ9mET4tq133yLHkF0cDw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1pgr5hyw69q0slyczjv2w5xx0x25337y7pjhzq9","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A3Z7lP+LaLsbriIstwGgkAF/+w14ik3fo/Mx9+5XhY5S"},"signature":"mUFtdfzJeLfaM7x6/cORzB9rLRMI8zFkJy2sUMVgMRsZlDGoz0Z7tIRcnVpIiHGmXDu4zUxrGDo9WDPquDBWKg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1s9gfyghc53pchgtueyn4v4rjp37azxjz9ncarr","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ZCgS0UKJl72RBRZ3Pa0RO0ooVcUC068tHCQjXtrtoIsvi0FZrq5TuUou9dgqP70AXLxwef1MOflhJO2w1eVWFQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1s9gfyghc53pchgtueyn4v4rjp37azxjz9ncarr","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"KFiPgfT1q7un8GFVdFrWqpeN7+2KBzaoE4/rkEIB5BV7QbfnVA5Oq6lLOf7YQbdEMtx4lc4yzFGMUdlgxCHCAA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g17j9y7xmxsjz57xxvxd4crpnfmsjnut0aqwedx9","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"LsDXdvs/71GaUJ1nEPXlggGtAAvGCbd4sSxhZQ8oCCsVR43nqalW2NBh4FrITcxJGbar7tgCK88WalGP/EOI/Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1wnk77fuxp622hquyc97zgks00gcaj4xj4ygh7r","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8CYLAdryEEXet4cjCxhMoFJh4qdguyEmXmxgZ9C7Pn4ec+WW5X0vhFcAi4AaeXvyCCc5CTcJ9TlfVJXigvyuZQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1wnk77fuxp622hquyc97zgks00gcaj4xj4ygh7r","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4myI2CgzH+19EAeIADZkPf7rQMJP7azRZDQE0YrHS1p"},"signature":"8APqFZ83oPP1JRgMZaAWPzhKDo5+yGVGvzNXXvDN0GhW451enWjG6+1ctcvLK78bHqwqe5H8qdRYeyqW2Nw/3g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g17zumnvtv34mpzcva2n7jnux9jnq9kdau7km580","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g+kpGjxMhRAK6mcv+XDx94svHX7uCqLcndhLyhj6wstH7IuyDgKgZLiBPS7G+GtwDhRZQlGgzMti0PMTfS9EIA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g17zumnvtv34mpzcva2n7jnux9jnq9kdau7km580","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9zIyrcdUyjFWDHjbJb626ylouBMuGlyEmHI/rRPKf0UPv3cPktfQghP+ApZ8jKlZayldR6J0d0hvRVvJOCu/aw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g17zumnvtv34mpzcva2n7jnux9jnq9kdau7km580","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"At/re/CNup2LUOI1+WXKfcpWuk1nqrurL8bqre9o2x0F"},"signature":"aW30s2DyzV69gNqeO3JQiuopQ5W7fZbuVph8Pz7OpPNxI0adPh8IJ3UZfVxX/k/4OZm0pZSAyUw8SdHWGTPC0Q=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1nueflqclwc7894s6qrlh5cen9uveme9hu5kqaz","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0Kdo3MbXAukdSYtpEvgBJAqMRKLwcI/vuNSz94hdG3c/pV/HZ6JuO9axV5SGoLOJQNJwbP/0xv6oZVV1RLUHpA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15wquakaxclag872tn3zguegtqufl22pwed0r3n","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"4AgxBSR0cU9vs9NuREEllOZh3A6Gg7XGP0Rkq7AMXbcJFreTeQ7Ap0eyaq3tRBS4NZDlm4CnPEoXyPPlydk4qQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15wquakaxclag872tn3zguegtqufl22pwed0r3n","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"pRXSAZBLsC4V9qSLdfRoQ+Tw3BGCIlMLUyez4GhMrDE0Esbh7oX/VasCnZgSbHA/2CMQO4Es4X/4q6OFIqBmzQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g18h9ggekrl6ym9n7t3ye8ah58vm44v25nhugz62","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"gD5xq36yZopYysQWpHBsx4pKwqUv/Pt+bEFqdk4+ThEDg/oisZpp18PKIcrHdOLW1JMjM8PRE9D53OOVJJi8UQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g18h9ggekrl6ym9n7t3ye8ah58vm44v25nhugz62","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/Pfsu6CDe04M9CTxLeeDkd/dd+8QtxzBneCx3OJW2iY"},"signature":"SSbl1dTWKQ5b5V8gvtcFGgcggx9SjjAMEsjdz/ZIi21xNsuvL/ymaxAYovKpg0K/nNlWqzCmETJLA4vq86rbfA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g18h9ggekrl6ym9n7t3ye8ah58vm44v25nhugz62","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/Pfsu6CDe04M9CTxLeeDkd/dd+8QtxzBneCx3OJW2iY"},"signature":"Q/rxoGNY1nmJkZfkzc3y12s9RC/L3FsIMQ0PwoW4n8x3zphCrhpLyAQ/ztLeRa7d8JMD3BH7PojvX59clMzU0g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g18h9ggekrl6ym9n7t3ye8ah58vm44v25nhugz62","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/Pfsu6CDe04M9CTxLeeDkd/dd+8QtxzBneCx3OJW2iY"},"signature":"vNa2CnDR9nQGaj2XnKOA7NyUImHg44HgYuY7mU7kXlstLmXyTuiAxgfapcC5LX55Xl6eNoeb0AVnZ1fSpc4b/Q=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g18h9ggekrl6ym9n7t3ye8ah58vm44v25nhugz62","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/Pfsu6CDe04M9CTxLeeDkd/dd+8QtxzBneCx3OJW2iY"},"signature":"vEPVmosEPHdaAXiuMLua/qSBVYk4TtXO2EnnIuzbJc8OkdRHbMVLp2cCMv3JUtB/Xuf4ozqmtvxC6yGZJ9DemQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g18h9ggekrl6ym9n7t3ye8ah58vm44v25nhugz62","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/Pfsu6CDe04M9CTxLeeDkd/dd+8QtxzBneCx3OJW2iY"},"signature":"IIZlcatLfM5XCA6XJKL6f9mSZpfn6Yc8iH2a+yeXsMAYiE8REyP22HBbcWmF+m78XRSsondrb6VJ3olh06hy1g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g18h9ggekrl6ym9n7t3ye8ah58vm44v25nhugz62","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/Pfsu6CDe04M9CTxLeeDkd/dd+8QtxzBneCx3OJW2iY"},"signature":"74apENR5V4JbieAQmVrtDJiy5Y5v9wJ6CTl194h5VzA/35I5CeJaqLEFWXTYlWYQMnvXKPyWzV6o1nyCel7wDA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1anajhdr28jlh4dd6dz5pzdjk0dsyqvc4ayk0aa","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8Mj2RBNBi6AYfnHYY3i/pjf6V8bqsQWyyTAXOUqhUdR0RP1PBRg5mp/ljixA//frUdiEq7Gvhkc5Rvle+TFGmQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1anajhdr28jlh4dd6dz5pzdjk0dsyqvc4ayk0aa","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A5VVQOKuIJduYT53isYRljsPqVIOmvoodigS0VTlJJpd"},"signature":"npIGjc9+16xXpvYhUE2C9JqTf8IVuvjuR+1fpVes3ph/0C/ltGqvD9PgeXPN0+CuaQgAiYTUEf8Pi+9rYz1p/w=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1anajhdr28jlh4dd6dz5pzdjk0dsyqvc4ayk0aa","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A5VVQOKuIJduYT53isYRljsPqVIOmvoodigS0VTlJJpd"},"signature":"U5RTOzXAPZQCT8lVj+2G7CpSbRKebFrpN9lX56c1OO8epbR/QsfVcLEQKYNT+1QcfxbFzygZNglvhryRNoLp4Q=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1anajhdr28jlh4dd6dz5pzdjk0dsyqvc4ayk0aa","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A5VVQOKuIJduYT53isYRljsPqVIOmvoodigS0VTlJJpd"},"signature":"TXosmaj6tjnnWAqLzYZSH1/PpaJvSQdonrzddM6zl7pmYsQIb0NatGwXcyWmzbEND8/pzdF6TrPCiKgbWHpx0w=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1anajhdr28jlh4dd6dz5pzdjk0dsyqvc4ayk0aa","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A5VVQOKuIJduYT53isYRljsPqVIOmvoodigS0VTlJJpd"},"signature":"jwNcPViLoEtWLb12Gjq45XcMrnaTx32vj3C7cYCQLhVrIGHIVOx9qOwH8okbtx6BPdh4U400LdzeT9agrG7siQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g15ruzptpql4dpuyzej0wkt5rq6r26kw4nxu9fwd","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"/K7dGL2H3vAqgBiz1YXcgBB8+jNGLxxwskKHNPS7NPUgclSjkSsfSwUg7OqqGwRW2099p9dhrLAhKxn4IorvSw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g15ruzptpql4dpuyzej0wkt5rq6r26kw4nxu9fwd","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ax8dMlyeZTx7/5c7upbCj/sMsgJdjajg4b8kgHZ+d1mV"},"signature":"witjphrEIY2t0lKVjdF7AIgWzLyaBu2+CHxQtFhJIEg1iCks6SHe4cFp+ZYAOl8PhXemlbmeGcPOXe7to6yWXw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g15ruzptpql4dpuyzej0wkt5rq6r26kw4nxu9fwd","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ax8dMlyeZTx7/5c7upbCj/sMsgJdjajg4b8kgHZ+d1mV"},"signature":"nB8976Dc0VhhliCqAGaDLVQPdmqa0GMxiJOWda2AxqYyFbBZZ00VKIpG/BSh/ecDYsAwyWh/kG9PC0dc53Z61g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"9999999ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"dzBx2SIunKyd2BWDsh0xXH+Mk7GirNBvEsriSF0ESqZ+mXYlDdkDHL8WYFMyH3FI1CFSxz310Aw2v+DClZPApA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1d598tyfatprdstalqutk62cnzpm3thvyy9mypg","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Aijm8N1gZwShpsIZe96/o1CmHdenljEhC5w3MA1JBTj6"},"signature":"87bbQKa4Xb68fkHNr7uojluvFvjkkFGab+zIL6WzHgMZYoRCBW4LbsK0oD/6ut1zhH47AM86j2xLRkJ40WDW2w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1d598tyfatprdstalqutk62cnzpm3thvyy9mypg","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"NTkVJy9GQnE/EEmv0GvYR0+bl0fsaYgtXJgMtXfH/YlGvIcxoNI9AnPFZfp4niyTrAkXIiEGp/HT059/OuQWzg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1zelq69gvlytut072w0d7pak9meh4q0ns3585nm","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"ZPoUh846pVm92P9UpKHb8ysJ8alCJJj7cpSo1GqIPUUikxEtdlKKyGtrOx+88HYoC6555ucH7x6n+zEJv2DsFQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1zelq69gvlytut072w0d7pak9meh4q0ns3585nm","send":"","pkg_path":"gno.land/r/jeronimoalbi/testpoll","func":"EndPoll","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A2oq/NOh7KpfTScIBPEuNgakrT52CGnhoJlmySx9vCJ7"},"signature":"PzveDtmetiYgR3Fa1/2b0xrx2/NnKTjRfa3nwuqze6VX6FCpqtZF44e4BEkyQKkFjLz3K/oS4zkp7UKyeJYvHw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1zelq69gvlytut072w0d7pak9meh4q0ns3585nm","to_address":"g1q50ht04re4239txdvwdfzvrehhdmqak8g46wzr","amount":"60000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A2oq/NOh7KpfTScIBPEuNgakrT52CGnhoJlmySx9vCJ7"},"signature":"hH+RROtO542RlXQ6oOSX2bIvfKki5izjXR8oiS2W3DZ2hc4bZzUVO9/J/JJBoD8xvrGmPSJmTOflEo1DhHLliQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1q50ht04re4239txdvwdfzvrehhdmqak8g46wzr","send":"","pkg_path":"gno.land/r/jeronimoalbi/testpoll","func":"GetAdmin","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AtNG/+vuu6yLmcrte4dj6e1HYvG+yX1j5eFH5R3FELLX"},"signature":"KiQlQ6Yr8Xk/ecNsUj+kHibcDnpm9gFuWJGYuu4GODwsvYFH4sWxKG2hXpICZSRoKRmtmJpoShUcvWOQ9wnLgA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1zelq69gvlytut072w0d7pak9meh4q0ns3585nm","to_address":"g186ds44vhuuwpjergp934q9x9f6m2ujr0375gz0","amount":"10ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A2oq/NOh7KpfTScIBPEuNgakrT52CGnhoJlmySx9vCJ7"},"signature":"CD3oefAX/D8rQ69tIpDt9y91TEjIuK23o75ZhQIVCX5bxc0NnaAeAEg9t5Jk/JAAhzMSq2T46mDqj9a/N1OVJA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1zelq69gvlytut072w0d7pak9meh4q0ns3585nm","send":"","pkg_path":"gno.land/r/jeronimoalbi/testpoll","func":"GetAdmin","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A2oq/NOh7KpfTScIBPEuNgakrT52CGnhoJlmySx9vCJ7"},"signature":"uY0gtG9s6dHEt2GHtZKflc2W8aoGE3WwbKjajE8V88EzyGe/Is00cGDY5vSx873371tqR0glV3ganeErtUU5HQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1w4qqmxdk59xsh3x5hnp2z78s4ymyva8pnenfem","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"i3lWJgYmAR7WbROnsT7Fln5YOYqAo1vTPOzzFgRn7tdmV4tM2pmFytrNurj8CdI6aIjAPom87HcOfzooIQ9ylA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1w4qqmxdk59xsh3x5hnp2z78s4ymyva8pnenfem","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A3qb8HYMMShXDmVxNvUPSm208qrj/S2Ym7hJqJeQtNW5"},"signature":"BEiOyptRxRzhSLgAJKw6PqYvrWPjCNIo9ULlio5Vh21oZtGf8oPAhx8NRMGeI176k36bfz2XhdsUmCN6g3AmUA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"1ugnot"}],"fee":{"gas_wanted":"3000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"h32egKdK+o7bBuuRYDz3CQnSNc0KdDnnxH9lxLXeTgUqaKZ291eGYzdl795qgukeAwXQMU7WIkHKvl+V/xTxnQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"1hEEitbAIjILXJTF4dQHTk6RiNVZN+aEZ7Xo1YvIU54CspRe9YpfQIP8B2pRVlTkpDeUYoQ2s+jUsK7y4z52fQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"NjoKfqa6Q1gxt004b17nyf2u4jrhzhtlEUDcWEPT2l8FzQmNbg33zOtv6sDXG/LuRHWadaAkmJnNJQPhBbC/IQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"XJILmF9PiZrm4miVAsAzL5zH8bb+RZE9ojW8KRENr+VhO8fQpsxS3TFNLc0uYTggQJSlqsqL99qn9Fh9RKU5Lg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"ieJ4GX/5QH4Z+OtZvYTITj0bmL3BlAj002f4kbCuevY0mzce1knFEeDYRge5O4204nmJImrmbl8IK6F1rQiInA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"1VhfBpFpYkbmhmjH1z4IvKiw/Qyq1Yj1y+kBQ0t1mIAB4QLAa2Zy7+EFmDf4Cv9qFam/PA2BiRDw1FrQUpm3XQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"gJnupHooUN+S0tut19lxaFKJhP6wMMFMADgs/LE1FKJs1k8yT3oSgZxFADiAH3t4EvYiOKCE8T5WgZLwVJaW7Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"OaDCnkkEMWxCmEToBR7Q8nnd+ZKJlB39bgILbINR1MYPwdNnNZ5bqyZK8uDuK5rHPqSU2H6IrUT2tmLbmJq9eA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"sEkiT456hcEtBKKg6RWlevIlx5QwMC+gLgDCLQh58ys38im0ktzcLUJHrnrB8MOVMtH8QR/GkBx/DHWMkv53Ag=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"6KZQiomntDN+AkxXPtUyhuMkh1Eynv0ZKPKYLxYUAcFk/Du8YcGZBykTZm7+YFyrmXQ+2rhNtM6JdBIuMIe+YA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","send":"","pkg_path":"gno.land/r/demo/hi001","func":"Hello","args":[""]}],"fee":{"gas_wanted":"3000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"S5upB5P7WIblX36r3HaHnr47VOiURCaFR2NQyyNR8JolOBXutWkKDH0zBEHz3Wy9PdapCCQcMA15bLF3qy69jQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","send":"","pkg_path":"gno.land/r/demo/hi001","func":"Hello","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"0q2ncmW90U7XxzraHdIBIWbRmwtxy6apOFf4apCAFDJ12c46EZ/iDp2ekrk1JkvSUPvLEC4B0ZTB7tDSSECyEg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1303986x7yqr7fux0w364hs9z30zt8ydd5hqj03","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Td9iYIaDC4UZ97fTDLEA2jveuRdAdnoTQzC33/z/vwduBPHGDUR7H1KOlq/CSAANnILCBGdxoimygdIowF0ehQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1303986x7yqr7fux0w364hs9z30zt8ydd5hqj03","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"6+ZG3kCGUePRDUuaiqvtuDgPcdhcmfFVMq5wBS3O07oFl5gEw/Ihcfdxs2V/FakxE5Bo7fCVtBXfOq2KlY9WrQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1303986x7yqr7fux0w364hs9z30zt8ydd5hqj03","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"eFzeYqfUGZkC8hO6ux2dXmsOjz2Bpf2TsFnb4ekC62kmmVhadawARXFgHMJ8yMxtMgWDIcevD3ye7NoKGXeX5w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1303986x7yqr7fux0w364hs9z30zt8ydd5hqj03","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"jNObqMIAdl3jlxdiG0KhJYNmr9G7DcW9tLP7wEflZHAzzuR4HqTY/MBzrULfbawu1W6iPhd4Jyt8RXyOiy4q+A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g19y8hwqwp43ena79yg95nv6nfzhmyn90zcvx0u8","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"H9231t8xHCFDoCPzWatnC4W9ufMmeF16nQccu02ob9Y/j2tlAGZQ/hhTbC7kAW+rKEWqqcHVVx9Dd/uSZijSuw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g19y8hwqwp43ena79yg95nv6nfzhmyn90zcvx0u8","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A9ABK1ikjJNzBdE6cNiD+2r/OW6a7KdUm6Xu0+4H0gdl"},"signature":"oaJFz7iWc+KHMc6qg6vEBS9umiK38Wshwemsd+bOvvtCTQm+3S4PdVapnDYPsoFCAqkzyDMVS6cBGTKizh2qjw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1ndzpczjr2rzrchtkm3tsut2xjfn50mlgax2v77","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"V1hliWH2Cjt5lw7VAV+RkwBI4aNasDc6LnJLf2397sRx1cMAk7cj3ydBfv9zk10zY2W9zeUqcgvGG+6yzxcb0g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ajg796sf4f5fu8lu9eu848cew3c9vl7cj0nmnn","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"VVbLXkVFHQoOdemfY0ECn54M95vqlGmSMrhbKH5DSjF/xb/2//cutK4P2otPvqKi7620Opi5qjAWZl3hOc/2yA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1ndzpczjr2rzrchtkm3tsut2xjfn50mlgax2v77","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AlPPfH2Io3wMzoHGYZZrFe5fBvCjwPeMssJTP239gMYH"},"signature":"b84bZ6inYgIqczVcTCuPOP0y7zjlmq5fZPMODijYYxlHbqWtJdm8gqEZtlaBs+1slPH8XFpJQ6KGPejml6imyg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g13jt6wq3z2mp2wg9dkcejn046f8fnyu74002ftq","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"18hDEL5hn9y9RSCOqQq5TWqFdRw+H8mMP78yJNllq1AFH6LDWGUshjB9r5tGqWlDsmCuC4xcm8gvfW6GZsb26A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g13jt6wq3z2mp2wg9dkcejn046f8fnyu74002ftq","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4666afZWctProTzm/8jsq2l5TIw560uoSXSEyv7NaDr"},"signature":"XxbhUV7CobHUt8HurkaB+jEq9yIZZpvVcjkHqkq5mwZ7EuY6Q/K2S2UpKxMXvEoyXTCF9g3DUjScccu1C3Si6Q=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g142nyevvsxcezxfmq4pc2eja96mxrvm75xdymf5","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"xCxjpQhGHIMZBgGAPTyabqUwQkm2cAG9NghMKqwTZkFA2ZiSMHtp8JZ/Es7Po/xlHSescLsIQ+xmJNEqnrfwfQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1t03agwh7uu8xe0sx6y0pl2ntrc85ks72xenwy8","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"cOTM/551dFiGnD8BF8SykjsGebis6HRdinj47iINsH5vfS8ThtJJBQ4Nn8vq+3xZSdW6EaUJ2noK4o+FFqHcsA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1t03agwh7uu8xe0sx6y0pl2ntrc85ks72xenwy8","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4riDE+CTk55ZlAzwmI+bJZIXe9VLBZkHaVo9nN9j62k"},"signature":"9w+KtbUPDuNoIsXqGouqoXg4Z16S3Uyjeu2C8j9oj1FgdkoL3Wte4CAD53XgwlG0oigPx8vzFyHC0I+uG4kL7Q=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1t03agwh7uu8xe0sx6y0pl2ntrc85ks72xenwy8","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4riDE+CTk55ZlAzwmI+bJZIXe9VLBZkHaVo9nN9j62k"},"signature":"WQ3eKv6L/iCmC1Cb8A9kUxnqlo2Rjq7uNl90wDpx4AR+MdiEcTKUiJEb27kIsJzFAUKjquk4nKkhdgS2pbThww=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1t03agwh7uu8xe0sx6y0pl2ntrc85ks72xenwy8","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4riDE+CTk55ZlAzwmI+bJZIXe9VLBZkHaVo9nN9j62k"},"signature":"l2vilpuV0SQpzAVAkyiQQrPaZufD2EkoIrz3IEGf0bB9G9Bewiw8FdMltLo38JgQF6TRCp50d+lqUp+9JKxj4Q=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g14pphz8c09skfghk67cg8dpp9sm3k6wy443xszz","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"dU8MgUNgiOaG8uNDhVhtYm2mc/vyLUfSemJFcIgzANNZfnc/sD4fSZxYtYlRtiFqElRHVNNLrSbLpu19GnjPIA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g103f46t2k9jj26q2nvhvfc7v2j9e6w08snln5pa","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ZbG8+uzIXezdsb8xsIaR2ywImdx/sjB+gvoapavJ1wge08ipdvohKSSSMvjZCimh1QtX4cXTIrCDd+ZcQzy2kQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1lee0xzj5xmuaur3wf5pw6jexrrs2r0uygskcww","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"nHE6Ll2E+vqX1rHPLfr1zwtyt70VFSzMetfwqdUIBc8iWuJCxUbi9EwQrO3NMjWRDNC3P7BM/gxIPm5BqB29vw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1mhnd9g3zcc8k9yh5lccjc9jtc2zk4w7n5gd0kl","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OxqvVPDANwYvfe3JHXRDG9Hpet10Q+TdQC2CleVHUKBO4RdxSODkj+AOG4ev1i47kkNK7M8fqNCxfwL5k/2f1w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1mhnd9g3zcc8k9yh5lccjc9jtc2zk4w7n5gd0kl","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"uy5vgREz+pWXNxfxFD5jS7RsM17QTfZ9G5kOYwtz9q5z1PLFXtUDuXLqlzs+ww70ZkWczXZSb6fQXCcrs0U+jw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"6n7jS455ELGTlq/iM7SG5+CecHLD6PoXYk2xBAfGpGoIeT6V/H3HmcFECEsyysf/brpYw+xam0Mof9poribl9A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1xm8jhcsp6205r7punsx5hz8g3p0tudn3wdczmt","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3JC94PQlixKlYk+svSuglBEqQbkXY/urpRUy5LEW5T9gR5pEFQLZJzc60J6xs20o/Z+pBsId6dFSYj697UUcVg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"DXODH05GFzVGrtL+KBtAVJo9jDvY7ym4DdNb4qeVBEoXQbaN+WxNpHwYcgt7ugz714G+qbZpIWZklX8Cey5JZg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ajg796sf4f5fu8lu9eu848cew3c9vl7cj0nmnn","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GFbIJlVwrlxhlKGLEInT8+yZ/XkqPSE6PSvEAXWTdktATSRaS2FsytlMmPN3CIMk7y0UOwL7QLvZvmgZedjhiQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"OltaDlCx5Fm2X9szPeCwkUHe0FpZGKAZ74MxgRG++HoVtMCr3O5BQehQ6xKDcHQgh5B321ND6/WSvPMYxHlqOA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"el2RUqjkPxc5+0XFhyoUjEiCB3MufESz41Jq6KJ/IqdI6R2HW7N1QOoLWksGlaG4+PKK6D57qRFCGnGRmhCXow=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"yvyGxB59vAuGHCExLfY558ML/KjcSYx3fHfZTSN8PDxCaZSVBhq9BR+CDGYoPxcaRAZKuiBH7P6tWV6aKx8hYQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/event","func":"Firemo","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"+GAssTgJw79xa1YNpGVOJ6uJ9BNfy/sLmNFsP30EJ01xIiETyplZtZo4bqN/x9olDLJc3Ht3fTbO8HjgUd95Fw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/event","func":"Fire","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"3a6hs3PICn6K5cK9yRLkhsy0DU82G90mWGfHqXqxMqNpq/2znyh3Q5sdsrKNru588WyhtvX6A8nFKNL3ehr19w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["000000k"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"6+p+Hu4EK1py6kzFUW9u1SBwkTr4ll2EWxMQojMQr0NF4Ey5No6sEWipreXxjx6TzWcnWl1TN1TQ90IOW/zqvA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["000000m"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"g/eRZwQeALnnVvvGpCTs6y+3khWu0ZIhwkIpHsntB3kh30LehoeiRwDsiUKXwQA/XREbdimmZ+OOvUXfL0c2RQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/memeland","func":"PostMeme","args":["data:image/jpeg;base64,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CNE2wtp09lCFiHrbA9I76qns6s5K0zypzC9NXdNuYmpS4I/60VxUvZa5+S9QcEjhuQflFG4UqryySPTdcWnGSlaYQm2uTk1Tmr4wWpxI8JAv8I6r/qXPEN/etT/9cyv7cY/qW/ENe/4LU/8A1zK/twva12Q3ccrh2/kU+RhM7JtrVrR9Ws/k9I6wV7LbiG3then/AOuZX9uNT7LbiIuLYXp9v8syv7cFSqqIbTfc47qzM4q5UsrR5iG1qTddIO4jtlPsuOIfTZWFqeR5fTMr+3GD7LLiD6/gtT/9cSv7cMUpJUkUdN2ceydICTde/wAYcw2lhk2FjHWSfZdcQybf7lqf/rmV/bjVz2XPEQQbYWp5Pl9Myv7cV+aTtlVx2OL6jNB1ZQknbaJDT1opFLbUu2tQ1ER0m37KTiPM0lxeE6dp1XP9mpX9uHCa9llxGT0wnmYWp6GU7C1alf24a06pB9bOQXi/WHyoJsgnpD3IU1EuhJI37x13Ley3z7lWQhGF5C9uv0vLftxsfZh8QWm34LSH+uJX9uFS3doounfdnJ6QltJSN7m8YeeShtS1WTaOqley+4hD0wtT/wDXMr+3CSZ9lrxEzBIOGKeE/wCWZX9uCpJ2Dr3OPZ6bXPO6U7C/aMIlilsX7R16j2VPEI2q6cL0/wD1xK/txsr2WfESQR+CtP8A9cyv7cXS8VwJfJx+5taMtqGoHy3jrhfsquIlX/Ban/66lf241T7KviLBP+5Wn/66lf24mgVnM9BqDshPy8yyoocaWlaSnrcG8e4OQ2OUZj5RYcreoqedlktvHvqSLGPOSR9ltxDy7qVKwtT9j/8AzMr+3HoBwfZBZk5WZYu4fxfS5eTmGZguS6Wp1p66T6pJAjFqITn2Rr009r+YtVKtIPpGVOeKH5WBayom8ugX8nU/rgDAVXHRhPzdTHNWHKv5Wb/Vx+4w8wXjN4ffwCq535CP9KI2/AOrkfvKP9KIPRy/0sPVh7kfN4ESD8Aqv/BJ/wBKmBB6GT+lh6sPctCBAgR6Q4wIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAAIECBAB//Z","1714758919"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"gjCe2jq+yGzYWsZNMZWlgln0gd9K92dpLqfSwN1fs0hRgxDBmmeDcbye5+mLcD/AnoH8JkgOCEn87Mb/Tsgsvw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","to_address":"g1urt7pdmwg2m6z3rsgu4e8peppm4027fvpwkmj8","amount":"2000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"ena0+qI1kr+x4eE7njpaVHAX7TDosu8pzflF1nqQKUBma2ByNmPAO6gfxOk9YZGlOTUy28+SH2xjWbQXse9dsg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1urt7pdmwg2m6z3rsgu4e8peppm4027fvpwkmj8","send":"","pkg_path":"gno.land/r/demo/memeland","func":"PostMeme","args":["data:image/jpeg;base64,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","1714758984"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArvWv8M+y47Y+EdM+meMEO/x9ukYOnb0DaxWpjih8z9C"},"signature":"W52h/u1NSp2f0A9D4UQ7esdVThLUxCrQh0pkbbhmMGh3v0fnn95S7Zj+nBjEzKdPCvBF1Dn2Kf38BJ8O+mEoHA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g14kdg0zn97xms3eza5xh6lcycmwm4zjksg4peum","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ZAktuE9TlQwlT52gUSeU8GVxvqFq+DTxKU7jVqCE5ddk3W2ZvZTMPNlpOhS03lreLCSN3IOSEgxq3W6C7Uh5YA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1mhnd9g3zcc8k9yh5lccjc9jtc2zk4w7n5gd0kl","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5058cAqB8LSRYzpa2Q8bma7RgTng3Z5uKFVcEFqH4+ghZpRjaWG0mG87973RZ14C6zK3Of929brSNNOZj7eMNw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g14pphz8c09skfghk67cg8dpp9sm3k6wy443xszz","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Qf8m2STXovozLC9AsQF71Cvnn56+zeyIgLQuNDlcMBtwMIJkvmEh5C69EaCQakEP1G93C9VD+Hgi/16mI/Zvrw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1626wwzfe7psdz6ke9vc8qltcdkfev7h4mwm0k0","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"QtmvjWdQ/4+DdNNAxQQTX/PXmBsdcj+zprdS1nKio+45311+1qJglIuP8d//8JytgnUh0b1/tQjpx9wtL2AKdw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1yd6r9485vt33gg8z4y7rqa30mv66ps9064a9lt","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"b3gouhQS3cQcomWTPNnEyF4RehBG1qURSSeS6VI99FIC4Ro+x+vcEnmeNyzz1qyWX3n+PFjYKi7KDVV18tGC/g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1yd6r9485vt33gg8z4y7rqa30mv66ps9064a9lt","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"7E1u51GGENG3/vDaRBzGIOqWA64xjJX9O2nYAC7aFMpoqb0xnTFsLqvVNJUGE+O9BZjpX6yJ1o7PcC78lbHdEA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1rwc2hsm2m33aql5rfe73r9ekdmhhm4pzcmp5jv","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"NGz/FlLW9mbGtiOKkDt4p15+8TYk2ZIErsxdXOCRL7hDozcaGMIlK2pxy7K6hgZYszjwLU84uyvDMIqceybilw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1xm8jhcsp6205r7punsx5hz8g3p0tudn3wdczmt","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"cUy60LwpYBsS5LeRbwFWxwofwfm2srvR/DQv86CXlkdLRdwwPvB8I7yXv8RXq/rvF7rBJWL5I369CA+VxONNgw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1w8cpkflxysztll935x45llywtz0rdwajcm2lwu","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"r87vh09vZ89IkSijozxOpMBv/jOko9eXvFpZnmOHI5NH+tcKIg5p3cvgnTYMuLkg1YhLwXOL+Cm8kDaK8gQ18w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g13hsacd5wjejd9r4p7gp49psyl5w3jqw0x35cxj","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"FxWRXsn/7adHScY4c0z98Mo4qn2EArZ2uUQo9L7/lnp9EmAx4GUdOhTz+tZqEhiwyZXvoDCpIGadrHCLPwAVZQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g13hsacd5wjejd9r4p7gp49psyl5w3jqw0x35cxj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","2","{\"message\":\"hello GNO fam! 👋\",\"files\":[],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-05-05T09:52:01.918Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwFVrrIoQSZvCVHWbpKT1l6dquDRCNnIy6PFmr+p7jVk"},"signature":"WWneTWh6VY8kAOmm34EZq7NXmg/woF9u7DXqNfK2Si0EZvGYNSDBp5dIOV6UYHoMsEPMOaXrKSYchYkDQDBfuw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g13hsacd5wjejd9r4p7gp49psyl5w3jqw0x35cxj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","gnoport-3","👋","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwFVrrIoQSZvCVHWbpKT1l6dquDRCNnIy6PFmr+p7jVk"},"signature":"8tC/bfSWXVKsD9Hb56ikDcfeC/rygCPxFCka7rEBjZNguKnsf5GhJxn2JVRZmyJEfQrcFaNRqZPMBxO5w2visg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1w996yw2emnc3plwhw6vzgjnd9kdgd9cklwpp2x","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"EIui7j+itoA5nZTk65d9ymZJa0sNAyuQXzzmHvQXEpI9y2DWjvdDcMTZLFS2NWbcGYcCNytGO5+5yFRLcUKfVQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1w996yw2emnc3plwhw6vzgjnd9kdgd9cklwpp2x","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A8uk/uS3oRfEdBvl82Kcyt6r6yIbRHM8um3IuLvg0eLJ"},"signature":"h2INWiujI6sc57YXxeQffhNDXvJ4u4ASriDLeCIEKStAaldjixwGGO6c0aZw4ixYAzZuf+lbX0qOiILlsq1S5A=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1w996yw2emnc3plwhw6vzgjnd9kdgd9cklwpp2x","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A8uk/uS3oRfEdBvl82Kcyt6r6yIbRHM8um3IuLvg0eLJ"},"signature":"xdVbNcnzU3nhB44qemCpI3QoafTHyYboO5r44zZRVg4ekOInDWqFeJ3HAOFf+ShBAeL8lhhQ7hu3trUVbeiikQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1w996yw2emnc3plwhw6vzgjnd9kdgd9cklwpp2x","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A8uk/uS3oRfEdBvl82Kcyt6r6yIbRHM8um3IuLvg0eLJ"},"signature":"O5zQtBOJj4UifFC4rHfGIhaiaodUV2449PoecOgJrHV4xkrf6nWDyXFoKiuAKOpzGpFQKFT7V86Rvo9y72cEZw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1w996yw2emnc3plwhw6vzgjnd9kdgd9cklwpp2x","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A8uk/uS3oRfEdBvl82Kcyt6r6yIbRHM8um3IuLvg0eLJ"},"signature":"O4CiI0VHmVZ89oFDl+QBNODM/8KkPJBNP8h/tDmDGNRLb2P9rFlUk+d/QiHFhJwE36HfB80jKIYJzEnrolXOJQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1w996yw2emnc3plwhw6vzgjnd9kdgd9cklwpp2x","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A8uk/uS3oRfEdBvl82Kcyt6r6yIbRHM8um3IuLvg0eLJ"},"signature":"sLGgP6H842u6//q+GeaPn4967HdFUhhmsDnMK1pvckByuWwEXRIaWs3EoUQO1md85fmdvc/ml1Vo8EGGMZdldg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1lee0xzj5xmuaur3wf5pw6jexrrs2r0uygskcww","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"bMq4o7AqOsUqfoPuyJG+c2Yti+RcAT8Zac7xUBJ07eAaaI0eyTtz8kff4Wu2KGDHw9ACGYFLMPfPozzYJyubtw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g103f46t2k9jj26q2nvhvfc7v2j9e6w08snln5pa","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AB/c0s2I7qi0GPj4ng9rCa32naT9gMrksO8UHbYBTK8AQaDDPjSTGdAT21nyW2kSoxad0Nya1KVjY0EJTgIu6A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lee0xzj5xmuaur3wf5pw6jexrrs2r0uygskcww","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6rhlFzqZkFaKVNJFk0VNFKXaNzBGzR9+IxUD7EF1LwK"},"signature":"SuWRQz+DvZuMdXb3S9XtihsjelhNsQjGKSnqH3NchsIWHGDdQszdpBmVNzcVhv1+muLqlWuJ9JvFomUkfIr7Zw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lee0xzj5xmuaur3wf5pw6jexrrs2r0uygskcww","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6rhlFzqZkFaKVNJFk0VNFKXaNzBGzR9+IxUD7EF1LwK"},"signature":"o7xAH0BBJcQL/rclGzj/+IXRtoez1D6uGYXb9+ekXL0Kq/HqnubJ7VilG0LPr+RaohHKt7pgSiOFHsiNCxwDMw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lee0xzj5xmuaur3wf5pw6jexrrs2r0uygskcww","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6rhlFzqZkFaKVNJFk0VNFKXaNzBGzR9+IxUD7EF1LwK"},"signature":"l91bEYhDJfyrX9r0hRNGnYHkkghdVdt+xvhmcTyiwgJTi3BjZb32GzobDN1WEeh94+Pr658IlDT5/QEJ7roGlA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dvfhkhjp0qgrrm4tr065aqz6ntjs0qr7rtmxuu","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"NXQAVwYtb+pP6+dmybikpDZnnS1uM2vO2TBklMKK9UcroSQBiuMOYEV1MFQZ3nXV3KsUtaXEon9qayN1zQ+12g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1dvfhkhjp0qgrrm4tr065aqz6ntjs0qr7rtmxuu","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+9xx+94xhyiUTyIGc4DIbRdl27WwSGo9O8Ov0v4njNZ"},"signature":"vppIXe9DsWJNqNpZ6eRa4+q9Doot93z8CQXwZdjnz7lvaUG3WxCFsoNib0OC/Rv/m++A4pCGx6pFRthk0yYAkA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1dvfhkhjp0qgrrm4tr065aqz6ntjs0qr7rtmxuu","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+9xx+94xhyiUTyIGc4DIbRdl27WwSGo9O8Ov0v4njNZ"},"signature":"d7Hps9v3O0N5hUuuw2L4e05dyYH72UgRYi1TZXLd16go0ciD1RvH7h8lW3bhlM7yMRLeZIZhb0QfEsf/VI0/iw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1dvfhkhjp0qgrrm4tr065aqz6ntjs0qr7rtmxuu","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+9xx+94xhyiUTyIGc4DIbRdl27WwSGo9O8Ov0v4njNZ"},"signature":"3ABt2wzOOOL1xLIVWNqYlyWv8W2HuNuM8hCXTWUr91IDSui6hw4SQQOsXwzhJWo3z3M56fgn8KtlKQXRTowRjQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1dvfhkhjp0qgrrm4tr065aqz6ntjs0qr7rtmxuu","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+9xx+94xhyiUTyIGc4DIbRdl27WwSGo9O8Ov0v4njNZ"},"signature":"pKzQ2s/RwrEuhQhDRf1mkVZLN8+Rl/ezX+UkCg4XEu8T6GY3CZgYAp06sNsN6rUO8aGDPqzFKLStsbrvyHKBAQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"9000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"JWZp61DYS0oQlzrMwGqDdrXrGQiOJcx74GRhaAR88mUE6M7cniFM1P+wGpp5UjBXdpCRpAQNgDRzmDXKOPqdhQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"7000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"JwE6UKE9n9tPgLygOJea4/LsA/lXMbIuRp+NChBTSiVp5/BbyiJbmHz75Ib7om5VAhwLnUSjk0yXALFfPOMGRQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre3","func":"CreateSubDAOAddProposal","args":["main","Foobar","fdkjflskjf","","Tutorials DAO","fkggjdlkgj","g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl,\ng1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"ZijnYJrRhmwdK6+ChOWhhUiAlwk9uh8Bb5hmgRe+Y2Uz07tejE9X4E+TKtfLEvZP0gvDWpiZygLVyNaDQUBCLg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre3","func":"CreateSubDAOAddProposal","args":["main","Foobar","fdkjflskjf","tutorials","Tutorials DAO","fkggjdlkgj","g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl,\ng1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"E3aFtoWlXNep+UYgTVDls88W1Hqmcr0tl/MRkWLMwhNc1RcPT3HpkFiOpca9IYAKCgkcgsm40qpL6hkZNw5VMQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre3","func":"Vote","args":["1","true",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"36roIvTc9g/hwvwKN54WcouTc/DRbJVkvexofU86Y7koA5Ixcke6bPfYQAuXWZcsQntgDApxSeAdGUy7OzustA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre3","func":"Vote","args":["1","true",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"TXN2ZUDUl8gRKqqbSjgmLNt+2N038NXUl+RraLv3NXsRbr6zHEklknKjsaqVOBlYjvnvYDwbgdsQ2fEBQjyMJg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1uf8u5jf2m9l80g0zsfq7tufl3qufqc4393jtkl","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre3","func":"Vote","args":["1","true",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AitYIWT3az4Jx3hGzTapJ6hyalJ6EYgqQCpYoe7Gx2Sw"},"signature":"anBtm+6BbrebJFjvpkrjGOvSTFFDsMYUTN3ytA8zLDkM3xME358BzRS5blkQoPfNFVygx/fRhtRn1cADLO5GHg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre3","func":"GetState","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"ZmNBBg8mt0vGDsd5ZkpSq+U+T+GC70tOf8EPNWK5TT5h244yWt8PinP6ge1If08+eyIqfNndt32cjktL0lAoxQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre3","func":"GetFinalDAOStateHash","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"FtrnNfOv8hZDZm4R2PGzVsKrpu9/RHJWWRhqduhO0DAMoGDlv8kHhpUN/TA1Af3mFCVfdC0582b15acHPsZb/Q=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre3","func":"GetInitialDAOStateHash","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"QXgkRBEs+EJl3NAtH15DSTc8d/eA4sp0/z3K635uPvlD6umkOoYaJT665eAxCszFDWjSbZefqTIBvecRXbbfoA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre3","func":"CreateLockDAOProposal","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"6pdx/XEPGAAKCC5GZ7DPS1PtnrvUqAWMAIypz9BmVJIbdz4Oxcr1hX1GtEx/2sN7dF7gHIHyaK39vJd7sI4UJQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre3","func":"GetFinalDAOStateHash","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"WUu+0MZzi6VfFDb50UmzQ2AHGuDWgI4C1dy2uo/OJ919D7qcl4GohLZnTW4rPehyJUhHdlDc4yRbuSVER6UWuA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre3","func":"GetState","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"IsiDow1BufrJCrzsPV6L/9OXRXX8enTRUPXxC0msxBtqvAjgcrV8EHd7lADm7DJRh5M+feSLVWIZFGY3HE/d9Q=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1uf8u5jf2m9l80g0zsfq7tufl3qufqc4393jtkl","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AitYIWT3az4Jx3hGzTapJ6hyalJ6EYgqQCpYoe7Gx2Sw"},"signature":"QvlUg7QzHZRI0MFxzTZRZA9KpoJ+A/2tblmMlLdipFB15m4vicx7nUjri2jbN47b51/jxDImWbePNk7xEtygQw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"9000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"Tla3pjgppccK0ptoiqBq8mOenj27LN+xTAK5nukzLdEjb/vsTFwvHE993ResxrxmcJSpf9Un5mE0GX64sYPmSA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1uf8u5jf2m9l80g0zsfq7tufl3qufqc4393jtkl","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AitYIWT3az4Jx3hGzTapJ6hyalJ6EYgqQCpYoe7Gx2Sw"},"signature":"WWoP6WQ9aJaO7kJOcU9Qw4IyIMpjy815d1eHJemOAvxiFwjaVqMZHtZHYpwRpap+FXyWf+m8OYHguQR+1BX9AQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dvfhkhjp0qgrrm4tr065aqz6ntjs0qr7rtmxuu","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"JwOGFN+1se8tDvhAIcQo/wlnVGFR/oJbKkgN7hrI1FxTnESRDzreh48cIX+naqgVzy5Lvo2MFfUdceZU96WJMg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1dvfhkhjp0qgrrm4tr065aqz6ntjs0qr7rtmxuu","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+9xx+94xhyiUTyIGc4DIbRdl27WwSGo9O8Ov0v4njNZ"},"signature":"T9jhyBg4Atp5mQsJRJzsXRGA2h43SMJpCZdgG5FnonBSRh6FXUWsEtE+KZ1Qhp75yzxMtPoNNm4twmkMKk0tRQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1dvfhkhjp0qgrrm4tr065aqz6ntjs0qr7rtmxuu","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+9xx+94xhyiUTyIGc4DIbRdl27WwSGo9O8Ov0v4njNZ"},"signature":"YDUr7jTuAO0wAb015s0CnbiBHnOr6yu5T6g4FTd3sxIpZ0Mr+sdOySh2jZJbSs8K2tkM7N9RkKltolcUKEmMzQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1dvfhkhjp0qgrrm4tr065aqz6ntjs0qr7rtmxuu","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+9xx+94xhyiUTyIGc4DIbRdl27WwSGo9O8Ov0v4njNZ"},"signature":"dtIWBxy3XQqu8fHRPMqAGbwCwoyUBKQ0nN7aK4Iac0ZgVx84EaLPS7Ow37XVn774BEAlL5gzhgHJgPBO1Qh5Zg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1uf8u5jf2m9l80g0zsfq7tufl3qufqc4393jtkl","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre3","func":"AdvanceProposals","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AitYIWT3az4Jx3hGzTapJ6hyalJ6EYgqQCpYoe7Gx2Sw"},"signature":"YKDg90J609QZrRA5n8nioOIjjsl+qLZTFrLn75jKilY1Rmj1gbqDVvh8JTfLNKBvwJrp7wkkecH6pvrSZkYgsg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"9000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"Ic866+TZ9EBU45zDWlhj/OLWxdJMPbhyPZnqplA1RmAtG4n3h+OV8LUyg7ISzgVI3eVcXmP2Kd6wynG18rrD5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"7000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"Wp25yUBzbPHhHIpPHMSjAaj7yEXGzaAtUk9D8Y8vXc18BeRlUeL1FgjrS2mZSwS9Jnir5rlVzPMrMbTyqxMtOQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"7000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"/hTW2k2BD0JXheECyiXh4ve5Mvp7VEEYb13hG2W6kngQWV9F9xVDW/WmbY0NDjIR6eZUphikYvONZpSgTpBYJA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"7000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"Pu0z5YnB1OHf4AEYslFXytQ/pXVcyBM2XqH4jiypfzR4uEQA/7soMnTQivdn3/0cpMptYHe1f1DtRlusgVM6Lw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1gdgft676z3egdk4r3x09hure94yywrutu5awuz","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"9zzme5opgzkpcxvTQwl2WBeivLith4xljQhyGDDnOHRDjP/hWNDm++ixaAC/KavNMF2hloOdPXmJDPx0fBudzw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1gdgft676z3egdk4r3x09hure94yywrutu5awuz","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000009"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A2D9lm7AP29XI7ciqLpJ0IDGJmICfzu0sEiroPF+G2jk"},"signature":"hlzqMtC4cSghAxyKJnlph9nd4QPSttAQLkDIRc8OvipjiRW8SFpXcOmjLwi6/hnSzbDAEBbklVoubM9Abd9iGQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre4","func":"SubmitNewSubDAOCreationProposal","args":["main","Create a documentation DAO","","docs","Documentation","Gnomes are writing...","g1vh7krmmzfua5xjmkatvmx09z37w34lsvd2mxa5,\ng1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"IYK2DnispEFlYpGosE3V6tj2u3FsRRMDGrM5NbsnGIUwb6ORDsIXXBPbnfY2ccYkwvBjbbEWVqysgosSIy6Y+g=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre4","func":"Vote","args":["1","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"A6EpkvcGrofeMyYU60R4LeoXZW9oC6y9gaB+mEKm8cUf2ndgP/IvEgFHq0UMaTRL1X0JBXD3BFXTo/+rBtFm3w=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre4","func":"Vote","args":["1","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"2VgamuNWTXtk9xLwnLEhASDVkrs9XD1CMj4ss6+poMskgXgGp3s6IYBkgNKl1tJbzZ3wmR3pBBeUH5OkzOZZ1Q=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1vh7krmmzfua5xjmkatvmx09z37w34lsvd2mxa5","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre4","func":"Vote","args":["1","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AhZQixZ1ZXKXC+czqzNTDa78qEvD1FKMeZg6quhKcfA1"},"signature":"aV0Q0FggXBgkYTQBrEGCkrgYYd1j8FbwriVEBeiYGyAWXyxDWsqKeSipPak+Akaal0OBw1UvSieWPsXV+L8CYw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1vh7krmmzfua5xjmkatvmx09z37w34lsvd2mxa5","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre4","func":"AdvanceProposals","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AhZQixZ1ZXKXC+czqzNTDa78qEvD1FKMeZg6quhKcfA1"},"signature":"bjz4d6q9vqkDP6vz2HWjz3aAgXE8n+ys1sc9FO53f79ZDdyPppTOR6Lt/9tpKjjyLXDtRPxhMFMVutqwzjaNsw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre4","func":"SubmitGeneralProposal","args":["docs","Add a Tutorials Section","Add a new tutorials section to the official documentation","0"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"8PFPInNaSUWcLhcDFMx94rmVX1Zq5OjBoukdK3ien6kzjeP+i66swESSUnh7SQ82IUJADmnsW6uaBv3GwaVf1A=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre4","func":"SubmitGeneralProposal","args":["docs","Add a Tutorials Section","Add a new tutorials section to the official documentation","0"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"7FGIQ8/ZDui9rT1WG4NkXZ0vdiO3jvOwtWOaygmrQ5pROwurTliqLwctxd3qQndJGhs5CzOiVemwWzUp/x/dUA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre4","func":"Vote","args":["2","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"Gb/M/EyzaxgIUGpsqsFmkb5me1q1h8XqPrTPB08LvBAflq0o5gB3frU1j0/4v9so0lI0JFI3cyFuP1PLEbx4Yg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1uf8u5jf2m9l80g0zsfq7tufl3qufqc4393jtkl","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre3","func":"GetInitialDAOStateHash","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AitYIWT3az4Jx3hGzTapJ6hyalJ6EYgqQCpYoe7Gx2Sw"},"signature":"IXoYTxS+0bgGJHRrjqpdY/T0fzfh7LHAiq37pBP5a985PXaUAyWevfyfsPpZYyJuPC7LeGTAZxd/mKu572j+rg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1vlqqt6wsvd8kcgxp2nt63zku4ps3ldh2xmxf4h","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"psGctDOBK/Rt/wVBKZAY0qKj5/oh6yXL2YDSV9TDDXBt4cTf0An7hDgirAPQr3PHsQxqBT/CFBnSiOHlPftLTg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1vlqqt6wsvd8kcgxp2nt63zku4ps3ldh2xmxf4h","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre3","func":"GetInitialDAOStateHash","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwB7i0OW1+dGoCl9o+T7NJjxzunYN44VYdWnJ8rhaAfn"},"signature":"zE1mcm/QL0+IAxtz0eSMg9IM9fhMkw9C8zHEvhYsJ/Jzcadfo4ofgjDBG/Rp/H7sozp2qXl2dpnj/KeJf9dohg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1vlqqt6wsvd8kcgxp2nt63zku4ps3ldh2xmxf4h","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre3","func":"GetState","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwB7i0OW1+dGoCl9o+T7NJjxzunYN44VYdWnJ8rhaAfn"},"signature":"wACHjpRyUNevEOR+GuX96Am8vqNq1KW6T3KDdbXEnokWjfCoxPG1r7sNhWmyp6RYq4h72/Ds/Y59Mw7xVcJlLw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1vlqqt6wsvd8kcgxp2nt63zku4ps3ldh2xmxf4h","send":"","pkg_path":"gno.land/r/gnome/dao/v1pre3","func":"GetFinalDAOStateHash","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwB7i0OW1+dGoCl9o+T7NJjxzunYN44VYdWnJ8rhaAfn"},"signature":"3n2QAAD2rlTZszU0Hfbl1iXliUchd2ymDiaZ64H6g759TJbP9OszY0RMKE11Q4PnJ0QXVgdb4wvZCrscmrmWdg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"9000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"N97hc364ocHvp5rjirYN+aP3i9wasd6PzMhy+ZXlmup/Bldjinr6BfrpHuMG7ZYLdOkbC898ZVulZfgMgS4dDg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"7000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"+H8vrrTebU5eaPOVWbYYiLPm7uv9ajS53JX781l/bPsG6t0zuSV11hD9aOFz0k764D4yUzzj7MO1yYNyb85tkA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"9000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"cyCQLHF+c/hk5E/qq/TiZcogBLC8TERx7C2zmYHNAUAVoOqJ9lS0XYmTOqwfUwQW0QihYi9HoLTJkDOjoeMkuA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"7000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"A2xvNUr9Rxt24sacqxV7uxfA4UoQvDRcyLX7K9JFF5A2H7GomV3mYEE4BTyL6BCASQXLWcO04LSToe0MKkzSgA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev01","func":"SubmitNewSubDAOCreationProposal","args":["main","Create a documentation DAO","","docs","Documentation","","g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl,\ng1vh7krmmzfua5xjmkatvmx09z37w34lsvd2mxa5"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"FGhVDYsLt7i7vywtJcA/JIifoYqjgULxeMF/5UMhWboWZMZdyCbPcj0daxQGspPnFaIvqwcngVmkbmzN0RWXOg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev01","func":"SubmitNewSubDAOCreationProposal","args":["main","Create an example sub DAO","","sub","Sub DAO","Foobar","g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl,\ng1vh7krmmzfua5xjmkatvmx09z37w34lsvd2mxa5"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"c2byLqw5bIXKjIYhxnhiMTLY9Oc7FjhqV0tnc8OTNf9Fd5eNKBPa66+2RAHKAx+QSa8GQDMLT6ym6nsnE/5h5g=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev01","func":"Vote","args":["1","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"0LJqjgAeJCANneQiKDbFc5eTXSM0roA46GQoi2KkP88E6/b0RzmOLyuS11iUaC4oK8SE2WCDelZ14MGDJrs0fQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev01","func":"Vote","args":["1","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"tiNBVpGxUgmMs/sRttC89OPAlEkFPiaWgzUWBu14GLAct9eTY3oXEAJik7+V+vTX4JbQkZNlb8htIWc5/l4RGw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1vh7krmmzfua5xjmkatvmx09z37w34lsvd2mxa5","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev01","func":"Vote","args":["1","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AhZQixZ1ZXKXC+czqzNTDa78qEvD1FKMeZg6quhKcfA1"},"signature":"VyQiiBcGQpNJWWCEIFMQnzCmYlMog71dISexY/yHbKNQnYFayKNG3vySMXSXKXcvGoNp/yCLTE6spX9S3wPsJQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1vh7krmmzfua5xjmkatvmx09z37w34lsvd2mxa5","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev01","func":"AdvanceProposals","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AhZQixZ1ZXKXC+czqzNTDa78qEvD1FKMeZg6quhKcfA1"},"signature":"dtkXdoZEwhScYjcPCSqtoY6F0wio4s4XitmQolUwfY1wffpMdegwwGuc6W7TmC9ck/suulGblVoXX9lD3NC1IQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev01","func":"SubmitGeneralProposal","args":["sub","Example general proposal","Some description ...","0"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"WrBKn/d73BxpbVwilBBR5u0DJpRbqtq3Ou4PDnzjhwQiFzcDhIVBgKmJrdoOTgxFhBQNZId6PR7FndiGInLFHA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev01","func":"SubmitGeneralProposal","args":["sub","Example general proposal","Some description ...","0"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"B6b42eBMmN0+NxyY4g8GgFdsfhilc6FmtyZFS/AM7aIe0JPWmHwFO3On/W9ZGhXdBBYhoQ9YyBQv97rJTsTnuA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev01","func":"Vote","args":["2","false","I disagree",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"Fh6CKqNqpq50S009AyxJ2U+Xxco9fxjeQYfGbz/VkIMKN5+pEAhMnC7qIWt59NggZkfXiYGfIDewPvZ0V3txqQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"9000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"r6XNViH1UChtZ6EbU1RyWcUqvAEqkUO3IJwTiFq1Sy8wT+wf5dcbnaGashDZbMtVyUZCX2PaRytiL3UCKCR5JQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"7000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"fPgQ88kBUa+AsQqBgetk6oNZkzSQSRF1fI0Kn+GLTe5UQBkfElk3OZifZg8RDns8Hn7q76E4IRRrlY5UgFDdHQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"7000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"aQV6UOqYcIG4/2d0VZq90wCXn1Vgb84QgHnKihxeDpA9b8EkaFjIQvhtWHNglYPs+7EVQ/ngyk9kqYoSH6jV+w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"9000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"pJJvwIgg/gREXjznrrWTI8yRJnHex37uWG0MQCbbwOMtDm2XHIK0nRyQ0Ljki9ppNeE4VutQC0r0ej3duLai2g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"7000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"po/eT8CSDsLFAaSSKaL2WHY+q4H/fSmeGoJGrMBUNvh65/6KK6zB84ifAlSEA8m6POggc5Fb+qoyfHQhZu4Zgw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"9000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"EcNEB7uvQZ633S9GBtIfhQQn8s/YVpHsfaHoZnopWbN7yG7WUqhC+LKSVT5Dw1IG4GbtSsqiZ927RTh10HWhxQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"7000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"2xqtrb+jSo7ccwGoH606ORXGMAjXInme3nDhhVBWcLFBmdavGhtY3lW4SDwaCHujLqypEDSU5Kw++RgOydXugw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g16qawu39j3axarec4fylawapp2uvtuxc78yhc33","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ktD268do4UzaAmbY47gIuixRfRObf+FFQMC1iuzgiN1ruhq6qz7nRPu/HC+2syS0csBEo5WgqUfgcgS5281mpg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g16qawu39j3axarec4fylawapp2uvtuxc78yhc33","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"FjbiU5KNffiR7Rq2gDGxBCxB+GfgHbj2EOVdwpu1WZhF8zTOD5OSV+qw2mCdpA3UplgwcK+vSm3MVJ12bokRhA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ajg796sf4f5fu8lu9eu848cew3c9vl7cj0nmnn","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Sb0MaPes0fi1PZCNJYHLOGYv90F/GL8wawpTjwaP2oQ+g5kZKVfgEpuIu3MSq0tBvAUF9VmzoutZDvNODmTC9w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev01","func":"AdvanceProposals","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"JtqBWa6YJ7B7zYbTT5tNgqyQOGvO3iJLfE/BDK7RG8ZKqCLG1OkTccELKA0Q0EfAMAzqNVORsGKDBssiZxEO/A=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1uf8u5jf2m9l80g0zsfq7tufl3qufqc4393jtkl","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"lIOmJp47lKgQyzzPWX8sGc4zEypl3Xil6Hi8ZKV8G7sMnJFVlKLDL+E6Jlnsd31ndflP8f22vScLYgWjAi8Giw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1303986x7yqr7fux0w364hs9z30zt8ydd5hqj03","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9Gby9b+1AEidrESsSni+O50BNRvLcIB45v0l7VKUK+NI5rhIsYlpJ23sbIVnWBqEQanao6p+BDPaBpBe5R491g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1zq6suuwmkqtt7zm4nwruw0hl9xr0cdux7wyajf","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"CoGz8UW2Wpc84B9MFxIkw0wtSpSMO8N1hoEVjlXSrB49XFaqcXg7eLRlBQoFUTMbpR1DHjdck/cJeHhQM9ycDQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1zq6suuwmkqtt7zm4nwruw0hl9xr0cdux7wyajf","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"isc7m2SQsKbx/KbTHcoTDsM0IrfNPfV0RbBdDci/grNYMvRsBOqqfQ9PKVhS4mHdDEHtNNDZZlEOZ3AJWdF35g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev0","func":"SubmitNewSubDAOCreationProposal","args":["main","Create a documentation DAO","","docs","Documentation","Gnomes are writting...","g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun,\ng1uf8u5jf2m9l80g0zsfq7tufl3qufqc4393jtkl,\ng1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"napw8wjrwz3N9t60mv6VN0lHj55TbXplVgqT32wdcTZ2zUlySA3O9Ty1XH4v2IRZ8EYOaGO16p3HjDSEa03Ugw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev0","func":"Vote","args":["1","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"uzIcq6HjBXOgToJOlXoW7vh2CgjmYLIp9KlL751wefcpHbv+SUMJnpGGZFWKiSgEPHIYLGRkO+1vi4vstbw/GA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1uf8u5jf2m9l80g0zsfq7tufl3qufqc4393jtkl","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev0","func":"Vote","args":["1","true","I like this dao",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AitYIWT3az4Jx3hGzTapJ6hyalJ6EYgqQCpYoe7Gx2Sw"},"signature":"sim2cNwbhegtt6Gd9gZ/C+hPXGDrRiOfIhpanNU56ngynD331KCBhjWU5wqEafDPN1B9D109aDxiaNbpc6WSqw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev0","func":"Vote","args":["2","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"2ZxNmvjjGVQh3oOF9FFapeYUUz8JKrrJKmYe/iob/VElJcPeg0PGEpzmc6CFrxB3klK1GVez6kzUkWO0VpdfCA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev0","func":"Vote","args":["1","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"+OoL4nKEDfZfrcH8tJ/WfmRxRv0GmDsXMFx06Z6wsPdGs3g4lAtgcFTWNHpJYkDcx2N6cj761y1z6kXCYmRk4g=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev0","func":"SubmitNewSubDAOCreationProposal","args":["main","Create a documentation DAO","","docs","Documentation","Gnomes are writing...","g1uf8u5jf2m9l80g0zsfq7tufl3qufqc4393jtkl,\ng1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5,\ng1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"9YxTtWXKimcdVbmg5VAkHvYRtIej0Amd9A3cI5teVv8Ka2xzDtjb8xGNRouE0N9wKB7YZ/A8KJdlFZbNY8syRA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev0","func":"Vote","args":["3","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"aqHS1vL7LdxNT4qw5uULGibB2ghsyYStjbE3y62kVphfTQlMs2JTpyirObL2UQZtyzjHzsbLyvakUZU3JpydEQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev0","func":"Vote","args":["2","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"U92ERs2ak5ATSDvhmAE0HhCgnNlo8KeG6WF6L0K2APpyVFzwBixWPDHLXiGJ2kR9J0nXg8nhWPicBm8nh0sc/g=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev0","func":"Vote","args":["2","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"tZ+TTeXdfEsVbDTcSYDFYAegWovI+pIKC/RwoxnRZEA+mjKL5lYS46VvafbZIEM+dsdQQBQt28SRe6AForAFqg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1uf8u5jf2m9l80g0zsfq7tufl3qufqc4393jtkl","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev0","func":"Vote","args":["3","true","I like this dao",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AitYIWT3az4Jx3hGzTapJ6hyalJ6EYgqQCpYoe7Gx2Sw"},"signature":"RGJnakX++VsI7ABtF7w2NGMUjJF5IT+Qn/jQ65vX8/IMCDem0qi84RZ+KToixNuxBQ84eXueRhQmKJrLoNfPZQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1uf8u5jf2m9l80g0zsfq7tufl3qufqc4393jtkl","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev0","func":"Vote","args":["0","true","I like this dao",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AitYIWT3az4Jx3hGzTapJ6hyalJ6EYgqQCpYoe7Gx2Sw"},"signature":"YaECgpjPIQIiQuPUUpAbyH5mF7mp1E5aUw3YptQUg8gFmPC9CPHTUHEsrKCQQdgy7zEKsj4tAWQf7IcrJ6PP2Q=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1uf8u5jf2m9l80g0zsfq7tufl3qufqc4393jtkl","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev0","func":"Vote","args":["2","true","I like this dao",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AitYIWT3az4Jx3hGzTapJ6hyalJ6EYgqQCpYoe7Gx2Sw"},"signature":"v5Rws0SLSBKI3mP2cvNeUDwSWEU+mhbpzNoaWbmzcvtN6T06TZrJr3EiJKKi3qbBYKpgRC4E/2jJ/pGv/purlw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev0","func":"AdvanceProposals","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"8GRgrpjx6jDb1PF8BdppSAJD9pGEub1AU0rkgkUcs1hYafgyLbqU4OMloCQccwJKyYKW5slReYd0EZAFe0VOrw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev0","func":"SubmitGeneralProposal","args":["docs","Proposing a New Tutorials Section","I'm proposing to create a new tutorials section in the \"Gno.me\"","0"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"pFfSovQ3gFicDMTj6wPTAp1BIMv15oTQqGas4Qc9TSJxbpty9Nlqn7Ddja6Up8TOPMrLKC66myybCo5dj6lfyQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev0","func":"Vote","args":["3","true","","This is a go!"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"anTcHfyUZcWziPn2KObiZ98gjDKNDSY2WL2h3htEyv1b9qZwLv+F+k82cFgiCAJ7HNpk+ehjWaJh2mcrBqppkA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev0","func":"Vote","args":["3","false","Some reason",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"K4zrjWowkPCMlPnDk19hlYj922oJ6d58dpHEjl/cdlMFjr7aUkdiUWV9m5X5aeKudwPbH2D9FP+EekxSWoSjsQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev0","func":"Vote","args":["3","true","","This is a go!"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"KpcnmXeXcTZgZfP61ay4RLHF07tT7mTJYjE2SmQlbZ4eRUIRYbWg+VvMzTGlME19MFjPEm7BYoxzJtzlDYIwlw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1uf8u5jf2m9l80g0zsfq7tufl3qufqc4393jtkl","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev0","func":"Vote","args":["3","true","good by me",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AitYIWT3az4Jx3hGzTapJ6hyalJ6EYgqQCpYoe7Gx2Sw"},"signature":"CD20iDK575hu8Q4Fe1/pWFiv8NBgkV9DHQ97wizBmaREu47J2tvEJExBiHMW+MBpuD6D/F0Mw321ZZT/XcenBA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev0","func":"Vote","args":["3","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"gGRkzm+MK+Nq/8MZAE5JvRqgUYtSfdZWwEHocb4ZxyZ6rUoEQHcFOFvz+n+myqCpIGQGI8o0nY9KjpqTKb/iOw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev0","func":"SubmitDAOLockingProposal","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"34f/WsaQw/KkA6P5EJD0qL/5jKisSxlCErcEq0O+bUBrv3FvZ35LgbqFLnBTnvF0vNDWl+VffNINU1Tw/4xSlw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev0","func":"Vote","args":["2","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"6g+KxqlIdrLTdtDLInZzA2JNrFb1yLA6qfPd59oR4hdWZ7L9n9g0rT4A0MHZRyymyiRjmjXuFncP9XoZ9e+Rug=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev0","func":"GetInitialDAOStateHash","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"ou0V+Iq99567N7ruPxxia8HJzC6zmeL1Wut0j7KS0dAa5iYxFAAsEJaE+2tp/TwrwELp7h2+nxamG2BehlhP4g=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev0","func":"GetFinalDAOStateHash","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"OrnMDXIskFyrDgcDynHFZ6vSeTqCKCKuuvpDK/APZrtol9t+bK5O5vaNZGe85iNq1IdhM7RTDIQvjJ+hGN21nA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev0","func":"GetState","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"2UdoPA64dZD3suwNnLDdd+0E6ToXOpZ8Ss65Ke8Zyic1hz+v7Efsy08CDimbZnsDaWxujtGYUqpROgEF6JvUiw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1dnllrdzwfhxv3evyk09y48mgn5phfjvtyrlzm7","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"y1hykr7JMdYSqTiesbV/LGq5HEx4mszq41CTJyDyKCM9rHxVkj8ZNKemlgy9UN4NjgfMBtBYsQFz4z9qRq3AUw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jql2c90c29gfx98qchcmk93fkdr303ep02wrh5","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sJ8WFZ7r1E+/C/C+GO0wVdwPXIhssnzOkE4y1chPpYwLa3seb1LgaLNH/Rz0RXMjtm2xTmZg9kxuFeRu6Mn3YA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev1","func":"SubmitNewSubDAOCreationProposal","args":["main","Create a documentation DAO","","docs","Documentation DAO","Gnomes are writing...","g1dnllrdzwfhxv3evyk09y48mgn5phfjvtyrlzm7,\ng1vlqqt6wsvd8kcgxp2nt63zku4ps3ldh2xmxf4h,\ng1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"HLfjjsx++GcXCEKxzJQbHdPBcgBhxlcJS82rLCXMBft8s6vpFzinjbyYroELIvOkAK8cOc6vtOsoOSE1khHIaw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev1","func":"Vote","args":["1","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"bBVOjP/umBsaeq7wmoVjVYrBcRzTLsYltozLKZC+WhgaQu+PfpqUKOwWT49YmjIRgfegM34YscqItGHO4qguPQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1uf8u5jf2m9l80g0zsfq7tufl3qufqc4393jtkl","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev1","func":"Vote","args":["0","true","I say yes, we need this dao!",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AitYIWT3az4Jx3hGzTapJ6hyalJ6EYgqQCpYoe7Gx2Sw"},"signature":"avhpF1SSs1e2FwzB7nm57SZBlc4aPhlDI5c+X2mzOipL6Zr2QcWmSZOGBdNQZoBCnMRYgKsxxJwjyZZ2wLCEKA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev1","func":"Vote","args":["1","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"FQUZbL66K/qOXD6Zj9SSJQQ0LweJNZV0IehWWpE8Bbgu8w0M+7sV8X9FNithVQ1pnDoFwy0WwF7b9z1d5nj25A=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1uf8u5jf2m9l80g0zsfq7tufl3qufqc4393jtkl","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev1","func":"Vote","args":["0","true","I say yes, we need this dao!",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AitYIWT3az4Jx3hGzTapJ6hyalJ6EYgqQCpYoe7Gx2Sw"},"signature":"69C2iebmG00f/ySsjKwvxTLnJ2RJbKNNygSEG1j2nnl33NdtdQ+/kkVmks/hCDmjPm1QlR4KzYrFQGO6tDcRRQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev1","func":"Vote","args":["1","true","Yes! More DAOs!",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyaNg+hBb1kUTyhx23vyBeg6wyIXhtmXXtOwDG5fOJB3"},"signature":"sngah5bdFwQREg3tol8xAc1Zw/sOEXC9b8Z/YMfEdtIfxF9TR19K8ALG3hDB+Ty7Odyq3L9mr40Pds6DIEeqlg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1vlqqt6wsvd8kcgxp2nt63zku4ps3ldh2xmxf4h","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev1","func":"Vote","args":["1","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwB7i0OW1+dGoCl9o+T7NJjxzunYN44VYdWnJ8rhaAfn"},"signature":"a/d7nCCOtJ+j2RWrL3qOApGTr1wx421M+YIcZ4VQG7c/XqEwE6OSwVSLMu46+8AI9VBY8lTZ3DnTAg5s6J1/aQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1uf8u5jf2m9l80g0zsfq7tufl3qufqc4393jtkl","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev1","func":"Vote","args":["1","true","I say yes, we need this dao!",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AitYIWT3az4Jx3hGzTapJ6hyalJ6EYgqQCpYoe7Gx2Sw"},"signature":"+GB+Td2XEYrNHD0Yvb7LI9ZAHrSZ9XM7JtnpYc6z3FgdB8PZGnE1S7NtT7m8u6cPSUE9QWw4GbtMDqMFNdDfZQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev1","func":"AdvanceProposals","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"gFL/8tgr8f4TuBwO9ghFdXE+uJOR7LPNyT8LzaW/gL1f3hp0yKS5Unet5UCyoWS33H71mkpY0kA/80qiZM5KeA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1vlqqt6wsvd8kcgxp2nt63zku4ps3ldh2xmxf4h","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev1","func":"SubmitGeneralProposal","args":["Documentation DAO","Congratulate the DevX team for their excellent work.","See Title","1"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwB7i0OW1+dGoCl9o+T7NJjxzunYN44VYdWnJ8rhaAfn"},"signature":"MY7gm8y5U9/5mFZv2lFRaCC77ToagvwWx63EqYX/159J44hsDdpdPItiY0dgq616YI7ZInhFy5JM9UKG0Hd0vg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev1","func":"SubmitNewSubDAOCreationProposal","args":["main","Create the Euler DAO","Proposing to create the famous Euler DAO","euler","Euler DAO","Foobar","g1dnllrdzwfhxv3evyk09y48mgn5phfjvtyrlzm7,\ng1vlqqt6wsvd8kcgxp2nt63zku4ps3ldh2xmxf4h,\ng1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp,\ng1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"yVF7DZLQo8VYEltVYKYrtMjjjYaRBRqMtdJme/e8AyF4pUemi7q65sFi3V1XJ9yPzKDJPULFV0BvEZaOYGKxdg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev1","func":"Vote","args":["2","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"kHmBvqbutJmcMcEdVYi64BODgDG0G86opGbiyMXluW4ieLCr0TLcU7PsJ0tVktmrmyJmafNOqAw+jhM76hkaqw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1uf8u5jf2m9l80g0zsfq7tufl3qufqc4393jtkl","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev1","func":"Vote","args":["2","true","good",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AitYIWT3az4Jx3hGzTapJ6hyalJ6EYgqQCpYoe7Gx2Sw"},"signature":"hO4kikdE6J/6NQ6Y1mFJc+rz66kn3G6cUg6o3jH4ujc+PnlgwamH2NuDMxJHsyEtuD7VLhnGEGBuKhxU8KUC6g=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev1","func":"Vote","args":["2","false","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"Kt+qN5hFJwAvFs1ebD6bQuTsRFoWi9xEhXDNY6pzTPYwpemLFVrVgffqwLch4Wp4uv6/o1WKLieYR85W7y4ZPw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev1","func":"Vote","args":["2","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"l4uQ4Uu3zv10D4JeLeoDKC3Ej7sRyzlsJ7+93Kg4YTZG1VV7abq7N5S9RT1V4o3iyzNwL3W7hSTlu7ZshrNIoQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1uf8u5jf2m9l80g0zsfq7tufl3qufqc4393jtkl","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev1","func":"Vote","args":["2","true","looks good",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AitYIWT3az4Jx3hGzTapJ6hyalJ6EYgqQCpYoe7Gx2Sw"},"signature":"RDeoDEHT9zGcIEC2YZ7CtkNK6/UzCUb/7RyXd7g61B1hzPUEK19yD0q4qTiWii0HOHljG3XjiUBUI7g7ZIDn+g=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev1","func":"Vote","args":["1","true","Advance!",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyaNg+hBb1kUTyhx23vyBeg6wyIXhtmXXtOwDG5fOJB3"},"signature":"mhTlDQu0c832gTtHPNK7TqzTsZfA2Yk+ppjr0egq6y5lIF22cmJzf8OUb8NgdG1hppoidIZHbQfUW1cpz5uqaQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1vlqqt6wsvd8kcgxp2nt63zku4ps3ldh2xmxf4h","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev1","func":"Vote","args":["2","false","testing \"no\"",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwB7i0OW1+dGoCl9o+T7NJjxzunYN44VYdWnJ8rhaAfn"},"signature":"uY3zHDY7TjDkg2hOOLZLd6V85/axo2E2LETddbp4duJm9HsUr049MjkD+gVkJhSm8mhuinR4xtNCjYpvTgxiCg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev1","func":"Vote","args":["2","true","Yes, more DAOs!",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyaNg+hBb1kUTyhx23vyBeg6wyIXhtmXXtOwDG5fOJB3"},"signature":"Phdv7aSosOnsNHyphNDznVMt+dbrfrvYXnh2e/XBUzsVvy0HIMzPQ7y9nw/Q5OLu+tDxA/+UxdRHRmToeVY10g=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev1","func":"Vote","args":["2","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"fF2zUqPgbckfNhNAXwz4p8ss8wcV3Vm0Xi+BVX1ioLt742YX7B//TeOzy2irciexypFHmV8i29ncqM0jev5DRQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev1","func":"AdvanceProposals","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"P8NI5y1FLDvpmf+1Oh3k4lCMyw4gyOqmaA079tsvUbBxTAOr6Yxd8YrtxnEpl4znYKsaqEl9HUnXIvbiwE6LWw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev1","func":"SubmitGeneralProposal","args":["euler","Proposing New Tutorials ","I'm proposing to create a new tutorials section in \"Gno.me\"","0"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"He+xUEZOiZ9skHF1ePdzdjAFx1CGVMiKQ0WdwFKW3EIBo9DHNV6RiqB6xEg+hvSA/Uug/m4EDjYAmvh8R3Aiow=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1dnllrdzwfhxv3evyk09y48mgn5phfjvtyrlzm7","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev1","func":"Vote","args":["4","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AsGEi/6/N0zRtRCWxHb7KZ1Z/BTfZIc77fvtkSRJlmwQ"},"signature":"qAksdsuxp1g1dMk/BAbf5yU4gqaKT7OR0SFsdqf4v/hKQBHsTJQqQIIIhZ3fB8DTf2pA7dCkIodvLtrkjrb+jA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1vlqqt6wsvd8kcgxp2nt63zku4ps3ldh2xmxf4h","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev1","func":"Vote","args":["3","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwB7i0OW1+dGoCl9o+T7NJjxzunYN44VYdWnJ8rhaAfn"},"signature":"mewBu3FBn8yvNBMZfn5O+VKsDFxbwx0DHOjk9E3We4JIkEjlWJunrWSq0u4z9FFxkNriLZSy8waWucJX8xlFWg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev1","func":"Vote","args":["3","true","Do we need a reason for this awesome proposal?",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyaNg+hBb1kUTyhx23vyBeg6wyIXhtmXXtOwDG5fOJB3"},"signature":"C7nRyqe3+yqhC2PicjXo63mkFgczioF383mxkoAdRPg0sYSkiXHPTFoFZk+g+2c+1OqbLpVvEJvzV5JK5O7MSQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1dnllrdzwfhxv3evyk09y48mgn5phfjvtyrlzm7","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev1","func":"Vote","args":["3","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AsGEi/6/N0zRtRCWxHb7KZ1Z/BTfZIc77fvtkSRJlmwQ"},"signature":"w7urODi91ZSPf/wqtO73QePkQI6pMm6JX5A8xTDJ36dKtePGlp5jUV+GVxEKuWYX5eGZvoyu+/hrEA1rolXDjQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev1","func":"Vote","args":["3","false","try again",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"055/hrqvrQev//XcOURwWGsPXd3pKhxMe9tZ5lphuoBgy/SPsH/q2JUOghCquQueRfRUOMdaBauSqik/tBQSpQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev1","func":"Vote","args":["3","false","Because is Tuesday",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"04jCSld4Peb98zH2M4AcjTHOi3Jdr7BEL/C3y8aguI0P9ad/6MFc4boycZaLVX7SeOtttekmb2aIKawwoAKffg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev1","func":"GetInitialDAOStateHash","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"K98sq8Kuno7xOam3Q3FmD64johZQ9R2+brMI4/AR5CR3VeBJ5rNDkOpQtIOrNN6Fw6YOc9Cv8XTKvVzmDlC2GQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev1","func":"GetFinalDAOStateHash","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"+0AeGtYtIS3DZ7ieP3vSI9uwxTR4Ff/9T6GuOoBHHaZTZhhAFLmrIdjcWfcO+Eg6PTf9760tRBQ2uZfaqHUNOA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev1","func":"SubmitDAOLockingProposal","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"lAagnCeTUvNoj4blyTRmm26umsZAtUSMOjXC6VgPXXlYHNc+KtFQuuupsOzc3KW6mUyT/fsWsDDmfiLPDRq2mw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev1","func":"SubmitDAOLockingProposal","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"7J/8v/ggoJYNWyC/Hj7Y1hxfMTLsyAojMkMYMSUQ+LgLFhg25ASe/+CRDUjgNtW9kPtsdljYNAZJZnti0hj8bA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev1","func":"Vote","args":["2","false","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"QCwBB5UL8hgvSNsydlba2i9VPM/f46CPVIhbGH4+AH5Agikql0dH7L81dHdZmP0M1edoQdf8IXGTjwoXB05XUg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev1","func":"GetFinalDAOStateHash","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"4JjrpjrNtJrWPVWYhuTRm625/Q66u+DnW3l0tZ92vmoAWxuJPQHxfoVGGlBHS8p8PblmT/FlimWQ2BXwzkOZgA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev1","func":"GetState","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"QX5Ur1pBgUCkBK8rDpLeg1/UNQSWna+cmXWdFr28XC4jIctTzkzMfbM/UQKimCAfA1Rk7R8mWiIU/vxXQu7irA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1u9gc29amtd2sqrddv856mxwp8895edykmyaaac","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"dSalaPyqgG0FQ11Dwb0XEDGx20Xn4X7VyqKWqgCEOqYQGtd+OQZWRA7KRxw0VQQE+hCvz1Pu0LFAaOQ5k+MkTw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g14kdg0zn97xms3eza5xh6lcycmwm4zjksg4peum","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"r1cP4pamSiVoaUNY6kw2zcrZ9HQ/vQu8CdxGl5LhZgdMzhfKfOuAentnWJclfzpLn2t4ZfRTDAvKXAPvQTYIeQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1kh0rnxzpmadzushz2fmspt7sspmljk3ufdzxae","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5KghGt0OROoA/sqQtgcPlHOUQuF9a7Kb4NA6BQdrNCh9f+/6E8sJccQg6CUroKAGFfSjD/2zvx3EJ5OkDKUBKA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1mhnd9g3zcc8k9yh5lccjc9jtc2zk4w7n5gd0kl","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1WkJcW2NsDkJfbQy9AFZMl4f43KkdDGyJkuHom4jVxQ+kkVRec6+4FSZM+wJCrhJ6bsLNWIFfazWJK3kQk/loA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1cax2wteyppjt8p6ejlwssum9qrgphuv6wcky4w","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"/MRI7Bv+dcIpcxSr1pfXziAGHQYizC0ST+MMXMNqqW5L+8msjyNlISiEcuJ3XSkEKQ9kXKeVHoJa3Svvi78EDA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"50oWc5EjN6JCMMxB8pitKEghQpJP6GHAynGogbYO46BIYT28hwBjZaCm7WS3uq+SWSR+gBrvTpXub91uNZGFzA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/restest","func":"FuncNo","args":null},{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/restest","func":"Func2","args":null},{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/restest","func":"FuncNo","args":null},{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/restest","func":"Func3","args":null},{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/restest","func":"FuncNo","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"fogD3ae7FbDtigW2mL2pMjvfaaemDBMrJbeI9DtBMt8NtkYBo8G8xz/64O+leJMYZxfaAIsbGWvNnBvd2HjILg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g12d83njqsvp009mc2mcsrxh60famfarn9tag0a5","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"nVUiGxmUo6FdxAFyvXShuOhztXiQtwqVPfmp9c+4tB0dSzy8iTFkxQYaryZCV+AkPgOcUa/mKWPJS0os9oVI+Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g12d83njqsvp009mc2mcsrxh60famfarn9tag0a5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A9IuyiRVDPlUfnNihYyqX9bZK1xi3qH91jy6KXq+eijD"},"signature":"Fv9YuOM1yNqr7uMEAOtDrILkgu6TjDZEW51b1O4/4SBpfwsC2SozNmju+LcvVmtce5vYBDGVZ2tZB7RgmyyvjA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g12d83njqsvp009mc2mcsrxh60famfarn9tag0a5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A9IuyiRVDPlUfnNihYyqX9bZK1xi3qH91jy6KXq+eijD"},"signature":"j8Mm8UbAw/lhSO7hVgcpV6yiGwl3umk8ik0hJtSvwk5FiAmFYExLLlzr4abbJ/dsVmlmWzFTviUrjyCkQ2kTBQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g12d83njqsvp009mc2mcsrxh60famfarn9tag0a5","send":"","pkg_path":"gno.land/r/hello/event_emitter","func":"Event01","args":["1"," 2"]}],"fee":{"gas_wanted":"3000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A9IuyiRVDPlUfnNihYyqX9bZK1xi3qH91jy6KXq+eijD"},"signature":"TdtT6ZEI5cBRnxL7JcCnVUUf7TAH7+yiwKnkY6bHqH00LurZkOlnUu7kLT5xZPBkGRQHrOPAQdm6oF7nDZFvNg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ajg796sf4f5fu8lu9eu848cew3c9vl7cj0nmnn","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"A0oEymdXBWYaWmXw7nZlxoy9zw4WZsnSJh0WMKThstBatoH6jHw9kj9nC6bQd9O4/MAZH23ulPE0eqpWMTWO3w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1u9gc29amtd2sqrddv856mxwp8895edykmyaaac","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"wg+EJBvGWQFV/wYitcJJCYoykOBcFTzBHRs/Phi+lP07QqK0cY5WzJrupvn89ajB/KMl5I8va1wr32KiRMARkw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1kh0rnxzpmadzushz2fmspt7sspmljk3ufdzxae","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"6IDI5MKKqay/ZQ57O6G0OmNYB/O6Bsij1LMu5AVoVf5pij/JOXxSe1XyQGNlfENmvzJiiHvulAsw3NGbHihVwg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g12d83njqsvp009mc2mcsrxh60famfarn9tag0a5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A9IuyiRVDPlUfnNihYyqX9bZK1xi3qH91jy6KXq+eijD"},"signature":"vrRWCVFrHBDP4PNYOxd3q05+B8KAx9JfBLI8s6+o9dMMbW2r/ibKYSHMl5gwCOjs32YTsloZGzRWKV1I5dzW0Q=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g12d83njqsvp009mc2mcsrxh60famfarn9tag0a5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A9IuyiRVDPlUfnNihYyqX9bZK1xi3qH91jy6KXq+eijD"},"signature":"fIJRJxjM1eoq+JQvPVPD91raWv0QirT9j5aBTPV+G4Aq+BryBTcjYNUj4dzQXRTIqfCLHrSz/rJlzAlfytuvjQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g12d83njqsvp009mc2mcsrxh60famfarn9tag0a5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A9IuyiRVDPlUfnNihYyqX9bZK1xi3qH91jy6KXq+eijD"},"signature":"TlsgMsLCdFFT8mJT3nTUQDzYkyJfuckYq7l2LDxWYn8LrJp4Z9G6GnMgxXLWzKgl4YHcC3r/8apnneEr6w1sEQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g12d83njqsvp009mc2mcsrxh60famfarn9tag0a5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A9IuyiRVDPlUfnNihYyqX9bZK1xi3qH91jy6KXq+eijD"},"signature":"5Z2CBufSDeVPJkzjWqPBiRWBttx2Kd9UE5sKH8DKi28KqCSWTCvwqYPg3ycy7BIumdRxbT8jM8DLmb+5eoCp3A=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g12d83njqsvp009mc2mcsrxh60famfarn9tag0a5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A9IuyiRVDPlUfnNihYyqX9bZK1xi3qH91jy6KXq+eijD"},"signature":"IiyAzhlJZkeWc7emIVHDeDC5Sb5KgoJ5i5CflovWwicsnEB8WQCp6nUjE5DNeuFBdU+TdbexJyoxkw01ZV6MDA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g12d83njqsvp009mc2mcsrxh60famfarn9tag0a5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A9IuyiRVDPlUfnNihYyqX9bZK1xi3qH91jy6KXq+eijD"},"signature":"K0ygQpm0XCYlGVyCrYxVM6cQi6y7MYQ9B8pe9cEnQMwTkvj0yPyfItBfF8QoA3oC6GVVwg0mVqX9ScNW+56nJw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g12d83njqsvp009mc2mcsrxh60famfarn9tag0a5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A9IuyiRVDPlUfnNihYyqX9bZK1xi3qH91jy6KXq+eijD"},"signature":"jystbQhUWRn2lzFJjl0RJrbCkQ88r6MrABYpU/B9ghUsevD2yDiikjUIDz/pTXy/w05NCtzB051iZy1bos9e5A=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g12d83njqsvp009mc2mcsrxh60famfarn9tag0a5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A9IuyiRVDPlUfnNihYyqX9bZK1xi3qH91jy6KXq+eijD"},"signature":"bbcp7opYyWq3I2T/lmemlP+avwKfZOMQtQjICifOVFgbsi6RftKDGBMA55ITj1alxEiLOAWeDJoTFpwZs7ID9A=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g12d83njqsvp009mc2mcsrxh60famfarn9tag0a5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A9IuyiRVDPlUfnNihYyqX9bZK1xi3qH91jy6KXq+eijD"},"signature":"OphOeGvzdzEmyPZcf/AUpTsrOdLhC6U5UPFLqIZWl4oXlvEVWN7nkXCIcjLbPVsJLPHIJBD3wZ+MLiJdYw3wAA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g12d83njqsvp009mc2mcsrxh60famfarn9tag0a5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A9IuyiRVDPlUfnNihYyqX9bZK1xi3qH91jy6KXq+eijD"},"signature":"aHxYc3KXiHMM9x26SulzgaiVXeVAxCVfc3q3ATg+m/tE6S21u81zYUxrj7xAHMfAMPy6HyRWQ0a46qBEwR08/Q=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g12d83njqsvp009mc2mcsrxh60famfarn9tag0a5","send":"","pkg_path":"gno.land/r/hello/event","func":"Event02","args":["1"," 2"]}],"fee":{"gas_wanted":"3000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A9IuyiRVDPlUfnNihYyqX9bZK1xi3qH91jy6KXq+eijD"},"signature":"hv4pyfJE5faq/uMwtL3QPyiueg5l+kxBm7RsGp+hrd0aELfEn5fhrCApfLvkEu0V7jzWfAEks0N8VR1j/oYeAw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g12d83njqsvp009mc2mcsrxh60famfarn9tag0a5","send":"","pkg_path":"gno.land/r/foo/event","func":"Event02","args":["1"," 2"]}],"fee":{"gas_wanted":"3000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A9IuyiRVDPlUfnNihYyqX9bZK1xi3qH91jy6KXq+eijD"},"signature":"nQBd03YCHHiPe+CesKBlxNdB6jg+su8mglOGwtvYGdkTJ20HFGPJWRE8rOvtWT72P2B+RvSFh1HtboqvnCnneg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1626wwzfe7psdz6ke9vc8qltcdkfev7h4mwm0k0","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"jFJKaLEPz3c+z2vsZzNUlhssrSNWW0rpn5JclL739HNkkRNjxYdW24WgL+gDmJKAmuyO+3CYF883YdXZOK9oHg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g12d83njqsvp009mc2mcsrxh60famfarn9tag0a5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A9IuyiRVDPlUfnNihYyqX9bZK1xi3qH91jy6KXq+eijD"},"signature":"knWTFtzDVr58O5MuovZF8MGsnbOe7UOuw+qsNmuwQg8exmvK5KZgp7VLZOoNwu6WKll60woCdIK/Y1s5NrqWNw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g12d83njqsvp009mc2mcsrxh60famfarn9tag0a5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A9IuyiRVDPlUfnNihYyqX9bZK1xi3qH91jy6KXq+eijD"},"signature":"85aeBXaTXAULhhnhIEjPi6Ve3rSBgZy5/KIukUW/4WlN6IpH6akl9Japc/gPkajZIoioLtQe1180AnLt4z1iYA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"Nnv5im+jL60Rl4uFAYHM/1x3sOkELkny1PBpdld5hO8q36CNwST2yE1eSvG4LBoelWjc1TcIfSq9qfmpp1xLnA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1urt7pdmwg2m6z3rsgu4e8peppm4027fvpwkmj8","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000009"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArvWv8M+y47Y+EdM+meMEO/x9ukYOnb0DaxWpjih8z9C"},"signature":"KeEnppTwE83nUZkBg7jXFdggg7xDj9g5wMVfFIxWCREo0q3wgv/22nnL+MNaMhp1Rg6ZKSziRizxznE/UouQ8A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/memeland","func":"PostMeme","args":["data:image/jpeg;base64,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","1715192740"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"EL3z6uCVRa2vU2M2zV0DVoQASbzU4ScTTP6mb7M405RiJZPDTUdaK2XaOjhIn7cwSr4CIS5fAnaUkDyrApGEjQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["000000q"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"aGK+rPaeLtATE89VF6NHRsCSlzCgsqnCE95KIpBCBw44vDNrB8DDPjGKwKFR8nUYgkLCwYHACV5VtgdmLhl1Hg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1uf8u5jf2m9l80g0zsfq7tufl3qufqc4393jtkl","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev1","func":"GetState","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AitYIWT3az4Jx3hGzTapJ6hyalJ6EYgqQCpYoe7Gx2Sw"},"signature":"QLzvTm0IZauh8KTKi3+j94VElWvWoZBZXxYR7W9UbjociYLEHb7KwGPjQPgV3C1hNOWKgFIBb+9va0ceRBjAeA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/gnome/dao/v1dev1","func":"Render","args":[""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"ybG4Du4tZ29PE9bB0dXvr9iCWvyDmh6HoYD4NPN/kdRiXpHlbQpZ6mE5Ix9sX4dE0e787UbzfO3eWFIew23oRg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"Y/v/hYRKy1dMf+JONWOFjnTL+bwNDOYXmi3s9dea7Zx52urAyGnxM11lTzlGI1W+lJVkelt7bJhZqWKtKlGjRA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","send":"","pkg_path":"gno.land/r/test321/hello","func":"Name","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"IfB0I2IschIFGBTap1BbwbC5f43CIJvJWkoVQE/hQyBF0mSyMXdLVtQUpTjsVAdC9SJ8UeU4D0dlZXBwoJa8RA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","send":"","pkg_path":"gno.land/r/test321/hello","func":"Name","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"vKjPPA2l1+FlxS/H4r2r/9gR++7AVuFvgG3f8F1XysZvkkuy9GhUiqvq8gWnNiYXCRpofF/llvhm7jjtYFmEkQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","send":"","pkg_path":"gno.land/r/test321/hello","func":"SetName","args":["Foo"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"dZZgQjjpmGEQkWSZk3/4HqWKoDnY3DCROkXa1EyucuJIY7fqjgMVuYCabngBK5f7QwVottRSozzMoWlgEJ0X2w=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","send":"","pkg_path":"gno.land/r/test321/hello","func":"Name","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"qH1JHOEujG+M1tkAEN2hvx2j/sP9mUEfmjQeJytgx4ppHHIrr9EmneAM7pn/FXJXoiz6RM8dywv2WOqYzA6utA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","send":"","pkg_path":"gno.land/r/test321/hello","func":"Render","args":[""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"Mg1lrT02j19DE6KP5pH5BJVppLt97QsYurgdyle3qZRDUtjqtHPWSs7wuweDn5dx1jSs9LSfm48PZbf/pYoI8Q=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","send":"","pkg_path":"gno.land/r/test321/hello","func":"Name","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"Nd0no2PuHxWNErosY5tbcpiZkEQDs6l85Ly1dbSajlwLJYCZVH1PgQ3n1JVhjvaKLqvdy+eEfrvVCV13ZvCJ1A=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","send":"","pkg_path":"gno.land/r/test321/hello","func":"Name","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"L7nFKY33TmSl9iuM8X6ghKZWPcpHVE9200sZBL/kH9tasMX6+jgQT/d3qcWVT+w0D9rfDaO74Mu7BgwIB0Rl4Q=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","send":"","pkg_path":"gno.land/r/test321/hello","func":"Name","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"25EmgjS7zuyWvQrrfQCcw9uRhOgItllf+0dROnHLlW4A0VW6XNZlf5IIprPrQ3h1Y/9Y+a+JLEmnU7RIQmo9NA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","send":"","pkg_path":"gno.land/r/test321/hello","func":"Render","args":["\"s\""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"O+8cWctCYvT20FKz0/4q3SJWh5CyWOv+xFGIO92RGyd8CLzhToyoHIQ2ufi6dI+JxoghyulqPDFQJeRr3jEdUg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g14kdg0zn97xms3eza5xh6lcycmwm4zjksg4peum","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"HnXYDe16LrIyeP7r6XdglLZiWbAROfnuUwH/s0Bn7udZm6dujoWbJFcZfBWLbSwLIBGwjWpS39AaTx5mN2FdHw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g14kdg0zn97xms3eza5xh6lcycmwm4zjksg4peum","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"LDuDxri7fJuBOPzvMWQYOLUKlZuc+ckn8LArYNxLQfZd2sLnDSDyNd8Vu/OHNv0TkEgOvW2TTDR5g3y6MNJV2w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"DYvPs6CN6MuONIaY7gXFAFz6qN6bSxuQbF06FS+SysV21nB+DIql1YDO2mXGSRAfqcyoB1ksiyWVgB39U153Cw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"y/vlhRvcpinvDVMWHL4qDyQ/SY38kSbwwkf8gqFpRNhMxs5UINwEa3o05VjmGYHNmfNEaXijhhj9Mybzicu92A=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"rnBX6VOTX/m+/foNJhW6Tr3h5524UM3AcZ2QlD57o8wNUIZLqjr85yxHjI3cYYjQisv1RrndhWEqFoGeqjkJmA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"pEWx1ltJh8s5lvbEP4VFbf+Ndth1iTC5WzNAnDXI7aUqVKFvVd0vBnX+XX0oWPdRiI+YuqP/2SibSxD5pVFGsw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"H991mZFa1R9QDqGC3YEJzI/T5PBckYs1f9nFt3VrTC4khNC4zreXE4F8cU9jzvdJkd/g99rPosG39ZXmJamPaA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","send":"","pkg_path":"gno.land/r/test321/hello","func":"Name","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"gJFFzziHZjuIhrCknOj4CqXoM82KADKNtanrgT+H/wt3TsKhGTfJcxnzEOF1Tk7pknazMPysXkyyBTuyqK8Uaw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"SkookCsxKdTHyZ/kucNMOJX7WdqjUFqg//31yAJW0T8hmGgDjtZ/UOIFXKTcJsQblZaJdCDpOLi9zB2c+8aQFg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/test2/hello","func":"Inc","args":[""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"wLFN3gIlulHr/qi7EV4YxOr2Mo/QwXIcYNl17e9PuBEUVqNDc3TYpuUh7bMR1FggqzmvKH8VinkxjxEmyfnI2g=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/test2/hello","func":"Inc","args":[""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"PrCUGaKk0T7zR2oY9Ez1Ret+KwgJU1nnImWw/BtKV6k0zSgOfnfGWyeuYsOJsgTf9ZIxIeek/DmPPzIdT+AnTg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/test2/hello","func":"Inc","args":[""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"tRRL/5ZMw+4CfcK2DBBxl+0r2z2ITJUNH220CYH5W3NKIYQni9nm4clWR11rSSMDMIhGPSicrqqzVucvJ85/4Q=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/test2/hello","func":"Inc","args":[""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"HjHhhoFud6xVdli8c0/zWxKcnB4cf1qz7LQ4HHc6prs5vMwJHtpIiDhGK10JfaxXvLheptPSYzMQAQPXBJp6Zg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/test2/hello","func":"Inc","args":[""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"oB/NEsbJchnBpSK4wswHre+QuSu/Wu+ii6RDr5q43i5CGzS7Hrg/0dUPSRfGVcu1k2Uw09zu+afT/oPA1nTr8w=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/test2/hello","func":"Inc","args":[""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"2PdQoE9td/HWTis5AelS3jW/WU1ATn8lP3ML6nlJvqhlkfuCL6pJq7Y/IL9PQXFSevuuk843Ageo9+X5ocoAYA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"6IffW3auRaHMWrHc2Lu92KHuJLfkbRam09EZEngZGCBV1SR9MbaNr/QKR9YpnQTPKBjvu1E2W7MCgT2WR9M6AQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/test3/hello","func":"Inc","args":[""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"huvd46wsgzHanKnsXG84Xc+IbL3UnmHp/z3jc9yXsYEDoS8Ul1URj/BfBov1AWnaswXi8tmi4aj7IFA6vUapMg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/test3/hello","func":"Inc","args":[""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"pSN8VbJALulwV1jmhDMqFHQFJ97dpTsklJouQ7njy/4DRcbky0rQqLaNlYM2mPgfpGN4Sj3WhLCZZnygTG9kgQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"ptimflcgSNsNMVf1LxLgnWKE0RkzSovGiQvGDAjJB+wyeNg1WJdAlbQ056MGyFEuAtSm3X4vJ3vHFlXzNUYKOA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/test4/hello","func":"Inc","args":[""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"AuOT0WaqjruiL7NJj9JQrNYo6Ov3fyAW2wWQl5ZbYvVwwUNjxvRBNseW6MYMSj0nPM+3/4NTSudm8xOemWkeFA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/test4/hello","func":"Inc","args":[""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"93Rq0H6mCZf0ohXPSIGttlBZiBP5TFwtIMHdRjP5+iwNN0zLjJWBo3QyXarPCBBCihDI4+dANj9cJDzheVv+3A=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"zes3qN3TncYNGHHeujBX3cf88JS8b4fZO8rs96B/NEp1+Z/QVXw6kuEt1GNjqYvqfVZM8n9OLlX4IfDnvTKs1w=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/test5/hello","func":"Test","args":[""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"u8oaC+vKsgazbJSR6EiAY/nciKG9OQ2Uom+KIt2pem5t6pkf7zaE5VetqLkkiUY/CVkcumNd6pcZhtNqLoQIkg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1rdc6g9nxaxanp7fcj4sk53kqtfssm6q7yxn40c","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"FhdaqJ1buGn/3K19DJiICCzc9mLrnSHFSol0yOOE+xY6XhWoNNCdV6V4dpmnmbdf4BivlJhrMXhqkDa0sd5lzA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"xRvRcc98LxybN30SpZcdsdjZPnlNL1f/VWHXHZhfyIZuoydHcf825ZoQ5By9140dMpz5XixKrHPpHL4NrlyRLQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1gagf00f5sesevl35f75zpe8ehz55z8a40ds988","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"QAvFuwsqC4xgvLTeQuEcu+Nmw18IKiSR/7jVN0/k9CB+6OeRyr+1u7PdCjUsZqYn0sr6ZEVRXTPX5TvQ2T9XIQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dvfhkhjp0qgrrm4tr065aqz6ntjs0qr7rtmxuu","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"QlFkOUOkOci0PWP+9XhIUG2eB+JGlkFd9WHdEoiVnsE4zjUH0xOO68G9+am8tfbz9Ul4wNT9h3MSnlLROlpKNQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1kqv375z322zvll4fea47pvpcx9nsz7u2pct74q","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"TTDBhitIS3xOydxKLUACePvb8nhJF69WZZZ0+9H14NNldiPhrCX7WfOMqVrS8g8qkHuyJ7YkE+Xh6jbB2Po2Xw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dvfhkhjp0qgrrm4tr065aqz6ntjs0qr7rtmxuu","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rvqIEx/Q7AnSacz/TRGWn6TdQsoRcPmYCrfboUbr0RoszjAopyyauwQMPsmW//APY1gGucvvmRzjiIn/MsytiA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1dvfhkhjp0qgrrm4tr065aqz6ntjs0qr7rtmxuu","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+9xx+94xhyiUTyIGc4DIbRdl27WwSGo9O8Ov0v4njNZ"},"signature":"Aiu+sLZy7wSG1OxQjlrZj/Jou8jk1I7KfdNDeWKMCn5ozMpaFiI7ns1wXEkLD2LKUEu7yhqebUVoGcISE4LQNg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1dvfhkhjp0qgrrm4tr065aqz6ntjs0qr7rtmxuu","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+9xx+94xhyiUTyIGc4DIbRdl27WwSGo9O8Ov0v4njNZ"},"signature":"s1UNQdKp8aJ+ZULkcIVi4k3tKMttAFIutYbsCxN/rgoBXdnNe1rbG72mrpGyQQCnC+LK7l8FkKLKzp+xuvyc2g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1dvfhkhjp0qgrrm4tr065aqz6ntjs0qr7rtmxuu","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+9xx+94xhyiUTyIGc4DIbRdl27WwSGo9O8Ov0v4njNZ"},"signature":"jRGr9dKiszMr8lMipFV7lp6MCKKk3Dk6jcLbtPjhEYpzfV4nKflR0RA3lzV+wXSg2ST4Cr4crOLhJxxdApjiYw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1dvfhkhjp0qgrrm4tr065aqz6ntjs0qr7rtmxuu","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+9xx+94xhyiUTyIGc4DIbRdl27WwSGo9O8Ov0v4njNZ"},"signature":"0UE/syBpyqQoIOfqbIFgcJPl8q+OVbdS/s+jmPuKRyA0QPkBkqS35UcjptgNhVqpsjE+UGY/ZXvaKxxvpE91dw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1dvfhkhjp0qgrrm4tr065aqz6ntjs0qr7rtmxuu","send":"","pkg_path":"gno.land/r/demo/faucet","func":"Faucet","args":["g1dvfhkhjp0qgrrm4tr065aqz6ntjs0qr7rtmxuu"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+9xx+94xhyiUTyIGc4DIbRdl27WwSGo9O8Ov0v4njNZ"},"signature":"kzEllqUHNG1WGTsHAxH0X2dvU2UY8FY33lrCSAc3MyVezbJ/FJTXTDRtxTl73rgrWM5Vc0pRjtqfqlT1Ft5bDQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1mhnd9g3zcc8k9yh5lccjc9jtc2zk4w7n5gd0kl","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"M+f3SMokGVXbWaVm2+4Um0ZeoUgCzdpWLZ5ykgdyiYcLWEZRIBgzaaaPgf7YboiS51GKvvc2wwB7BRDi9QhDUw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g17rzyq2c64eg3vtqg5lx4prh65f46yhh56fysk7","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1HMC0WXp/5GRh0HzVXw8rapw6hjsjyE8Urn+ymjH5rAz4tisEmWnya/7rLPEsZXkSivEOqiSPZCD3zaAUxPjAw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1eussptehceyrtzw69kek72qy8d40rjrf654rrt","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"WWyPhtOiQ1bLlj+A/2FlnmSHW9w/7y5YoSKmDyPCgZ17WyQ4Lg9w3wZg2MdKwaGJ8KkHL3AW8JZc/NIuAZrv9Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1eussptehceyrtzw69kek72qy8d40rjrf654rrt","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GeoPqLICb5rBSyNjV8ttnMxJxMHwEc8J+fE5LCyPgBJcS5L2ZcloiawOeMyY5w8siw1+glbWDtJJWongczvsoA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000009"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"8lU9X79adaJ//5mpQDADkWjcmFhist93a8p5IBEeEhcmmgtpE/t5mV/VySrWdTGjQwS0on7AmcuQ+vOpwwUNvA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1qhhenw5ydq05tes7ardrxhu37zpu6ux5lygvwf","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"DJu8x1YNgc0ZPvuBolHLV7wZC8i7cy2UAjxfZviybEF2DM7c/gDisCKIEaAR6Il5by5Irppv+ZvSRItgLJc5SA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dvfhkhjp0qgrrm4tr065aqz6ntjs0qr7rtmxuu","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"hdsJAZb2DRQfFc0OTdPFpxlNUO+QpI0+v5gXSEltRnRor+xe/PrnE+lRGPiduG3A66I6A+SmKYksQRRSVtk8MA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ajg796sf4f5fu8lu9eu848cew3c9vl7cj0nmnn","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"kCFX+vBDEwFCuxK8Bc/FSAQAbEx79ZMXPCCL8ARq2OYcqHfufthtjy6+Oigo05yHyFRocjCCMjGBaFceRPzT6w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g18700zpxdch58ytw9msedyaskrywwxtsr8zh7hy","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"7KQbPKak0tf5LaOXt86BDOWm76i9EMdHS8tBLXwSCfQpFMtols1zsnSMiEt8dO0O3bMxPOGSczCpk/+BngpVxQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g18700zpxdch58ytw9msedyaskrywwxtsr8zh7hy","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"t4OIebjtfog4hd0W7laNs63ADNIy3bdiwOF+PY2VJ8x92+UKs3kTQnC4eXI+EkM9+OfakDxFrVxcChIfOBSQ2A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g18700zpxdch58ytw9msedyaskrywwxtsr8zh7hy","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"8000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Al48/RbfBehPCcdjyUJnVowa9bM9bIDuF4YNVcJnEC96"},"signature":"qb8FLIKxSLqYJycWmZakma/S1RDoXCp0AOWbJi6JZd0Ci/s6KFMh/r785HeF83ZtbLUotWcLnotXsmvhbQR+2Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g18700zpxdch58ytw9msedyaskrywwxtsr8zh7hy","send":"","pkg_path":"gno.land/r/leon/v1/memeland","func":"PostMeme","args":["data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4gHYSUNDX1BST0ZJTEUAAQEAAAHIAAAAAAQwAABtbnRyUkdCIFhZWiAH4AABAAEAAAAAAABhY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlkZXNjAAAA8AAAACRyWFlaAAABFAAAABRnWFlaAAABKAAAABRiWFlaAAABPAAAABR3dHB0AAABUAAAABRyVFJDAAABZAAAAChnVFJDAAABZAAAAChiVFJDAAABZAAAAChjcHJ0AAABjAAAADxtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAHMAUgBHAEJYWVogAAAAAAAAb6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9YWVogAAAAAAAA9tYAAQAAAADTLXBhcmEAAAAAAAQAAAACZmYAAPKnAAANWQAAE9AAAApbAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAACAAAAAcAEcAbwBvAGcAbABlACAASQBuAGMALgAgADIAMAAxADb/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAJYAlgDASIAAhEBAxEB/8QAHgABAAEEAwEBAAAAAAAAAAAAAAIBAwYHBQgJBAr/xABdEAABAgUBBAMGEQcICAUFAQEBAAIDBAUGEQcIEiExQVFhCRMicYGRFBUWFxkyQlNVkpShscHR0tQjM0NSYnKTGERUVnOCouIkJTQ2wtPh8DVFV2OyJkZkg4Txlf/EABwBAQACAwEBAQAAAAAAAAAAAAABAgMEBQYHCP/EAEURAAIBAgEGCwUGAwgDAQEAAAABAgMRBAUSEyExkQYUMkFRUmFxgaHRIpKxweEHFhczQlMVI/A0NWJyc4KiskPi8STS/9oADAMBAAIRAxEAPwD1TRa19cmp+8SnxHfeT1yap7xKfEd95ZdHI1ONUzZSLWw1IqnvEp8R33lX1x6mf0Ep8R33k0chxqmbIRa49caqe8SnxHfeVfXFqfvMp8R33k0cieM0zYyLXQ1FqXvMr8R33k9cWpe8yvxHfeTRyHGaZsVFroai1L3mV+I77yeuJUveZX4jvvKNHIcZpmxUWuvXEqXvMr8R33k9cSpe8yvxHfeTRyJ4xA2Ki1164lS95lfiO+8nriVL3mV+I77ynRyHGIGxUWu/XDqXvMr8R33lX1w6l7zK/Ed95NHIcYgbDRa89cOpe8yvxHfeT1w6l7zK/Ed95Ro5EqvBmw0WvBqFUj+hlfiO+8q+uDUveZX4jvvJo5DTwNhIte+uDUveZX4jvvJ64NS95lfiO+8mjkNPA2Ei1764NS95lfiO+8nrg1L3mV+I77yaOQ08DYSLXvrg1H3mV+I77yeuDUveZX4jvvJo5DTwNhIte+uDUveZX4jvvKnrg1L3mV+I77ynRyGngbDRa99cGpe8yvxHfeT1wal7zK/Ed95NHIaeBsJFr31wal7zK/Ed95PXBqXvMr8R33k0chp4GwkWvPXCqXvMr8R33k9cKpe8yvxHfeTRyGngbDRa89cOpe8yvxHfeVDqHUveZX4jvvJo5DTwNiItdeuJUveZX4jvvJ64lS95lfiO+8mjkNPA2Ki1164lS95lfiO+8nriVL3mV+I77yaKQ08DYqLXJ1FqY/QyvxHfeVPXGqfvMp8R33lOikRxiBsdFrf1xqn7xKfEd95DqPU/eJT4jvvJopDjEDZCLWvrkVT3iU+I77yeuTVPeJT4jvvJoZDjEDZSLWh1Kqg/QSnxHfeVPXLqnvEp8R33lOhmRxmmbMRayOplUH6CU+I77yp65tV94k/iO+8mhmOM0zZyLWHrnVX3iU+I77yeudVfeJP4jvvKdBMcZpmz0WrjqhVh/N5P4j/vKnro1b+jyfxH/eTQTHGaZtJFqw6pVYfzeT+I/wC8qHVOrD+byfxH/eU8XmV41TNqItU+urV/6PJfEf8AeVDqtVx/N5L4j/vJxeY43TNrotTnVerj+byXxH/eVDqxWP6PJfw3/fU8WqEcbpG2UWpDq1WP6PJfw3/fVPXcrH9Hkf4b/vqeLVBxukbcRai9d2s5x6Gkf4b/AL6odXayP5tI/wAN/wB9OK1BxukbeRaeOsFaH82kf4b/AL6j68Va/o0h/Df99TxSqRx2kbjRabOsdbH82kP4b/vqPry1v+iyH8N/31PFKpXj1E3Mi0udZ64P5rIfw3/fVDrRXB/Naf8Aw3/fU8Tqjj1E3Si0odaq4P5rT/4b/vqJ1sro/mtP/hv++nEqpHH6PabtRaS9e2u/0Wn/AMN/31bOt9eH80p38OJ99TxGsOP0e03ii0Ydcq9/RKd/CiffRTxGsR/EKHbuGOKruquFVVuc+xTd481INAVAMqWFNywARMKoCi5NiiYUt1VQWI4TdUwFXdUEkMKuFIhA1CSO7lV3VJMIWSI7qbqmGquELaiGMKu72KSISRwmFMBV3UBDdTdCluqu6gI4TCluquEBDCpuq4iAt7qrhSwm7lAQ3UwphqYQFvBTCnupgqQQxlUIVwjColwW91N1XMZVN1TcEN1ULFc3VTCXBb3VTdVzCoWqQQIUS1XMJjKm5Fi0RhMK5uqhapuVsWt1ULVcLULVJFiyWqhCukKOFKKlohUIV0tUSOxSRYtlqjuq7uqOFa5BawolqukKJbhSC0QokZV0hRLVa5FrlotUSFdIUS1WuUaLRaolqukZVCFYrYskKBCvEKJCsmVLJCoeAVwhRIwrJgtOaoFqvKJblXuVaLBCgWq8WqJCsmYmiwQokK8QoEK6ZUslqgQrxCiQrIq0WSMFRc3KuEKJGFdMqWHNwUV0jIRXuVsZ/gqWFINVV5o7FiOCq7oVcKoCE2KBqruqSDihNiO6qgYUgFXAUXJsRQDKlu5VcJctsKYCKQCrhQCGMqW6pbqFqWFiOEwpBqruhWsTYhhVU1TAQkiq4Kluqu6ouCAaq7qlhN1RnE2IkJhS3VXCi5NiGE3VNMJnMWIYVVLHYq4TOIsW8KW6FXHYii5JEtB5HCFo4DKkmFOcLEDD8qoWY6FPBTj0qc4WLe72Ju9iu8E4dStdEWLO6m6rpAKpuILFohULVd3FEt7FJBbwolqu7qpg9SkFrdQhXN0Km6pBbPFRwrpao7qAtkZVC1XC0qOCrXK2LZao4wrpGVQhWuVaLRGVQhXN1RIwpILRCoWq7uqJapuQWi1RIV3CiRlWKlkhRLVeLVEhTcFohQIV4hQLVa5VotEKJbwVwhUIwrFGiyW4USFeIyoFqsmVsWiFHHFXSFAtV0yC2W8Fbc1XlFzcq9yrVz5yFEhXi1QIVkzG0WSFAjCvEKLgrplLFhzeCiQrpCg4K9ypaIwikQitcqbC3UwFXCkBhecudgju4CYKkqgZUE2IhqqpbqYQsU3SqgKQGVXCAiAq4KqpbqtYmxHdVVXdTdQkoq4VQPOpBqq5IEcBN3JUw1VDcFVzibEA1V3QpqvNUuySAb2JuZVzdVEJIbiphXCqYJUixHCbilhM4HUpJsUDEIAXGVe7KJQIRi1SsSFOhjm+bmWQh/iIWs69tfaN229zJ3UGjB7TgtgxjF/+IKglRbNvIuvUzt/aFy5IN7QImPe5eIf+FfIe6H6FB+76rie0SkTH0JdFsx9B2QAymMrQVP289DKg4NbfcpBJ9/hRG/8ACti2xrvp3eQHpNetEnnHkxk6xrz/AHSQVNyM1rmM43VTdCpBmYMy0OhRWRWnk5jgQVcwhWxDdCbqnuqm6gsQIwqK5uoWqdQsW0wp4VN1LCxHCKW6qEKU2iCmAVEjqClhFa4IFoJ5KJYrpCpuqSCyW4VCMq8QolgKtcixZLVTdCulhUC1SQWy1RLVdIVC1SC0Qo4V0hRLVNyti0WqhCuEYUcZVrlbFsjCiQrpGFEjKlMgtEZUS1XSFEjCuVsWiFAjCvEKBarJkFotUCMK8QolqtsIaLOOpRIyrhGFEjKkxtFshQLVdIUSFZMq0WSFEhXSFFzVdMgtEZVtzSr2FRwVkyGrnzkKBCvuarZGVdMxtFlwyoEYV4twoOblXTKNFlwRTIwitcobAAyq4VVUDK88dixQBVwqqqi5JQNTCkAq4RvoJsRATCljJUt3gouSRAwq4UgxSwozmSkWw0lTDApY4KoaobbJsRDQFUBVxxVVUFN1UVeOeCYVrFrADPBSVFVLCxEphSDVwd6XvQdPKDM1q4qrLUimy7S6JHmYgaOHQOs9gS5JzW6sP1H1ds7SajxKlddfkqPLMGQI8Ud8f2NZzJ8QXSjVPugF16nzcxQNFKO6VlA4si3RUoeGhvLMNh4A9pyexaap+igrlWdXb+rE3edeiO33RJ2K50Jp7Gnn9HYuZico0MLqk7voRSdSFLlvwOwd790ubWo8anaU2TP3LNcWtqE8DBlmn9bHMjyhaauC/tonVXe9P77g2rJROcnRIfet0dWWnJ8rllUjT5amS7YEpLw5aC0YEOE0NA8gX0LzVbLVeeqms1bzRljJfoVjVEPZ1o1Qid/uKs1q45s+2iTc44AnxcT8652Q0PsemgCFb0o4jpigvPz5WdIuRPF4ipypveasq9WW2TMdhadWvAADKBTgB/8AjM+xXxZNvBm4KJT93q9DM+xc2iwaSb/UzHny6TF5vTC055pEa3qe4Hql2j6AscqGzpYs84vZTIkjE6Hycd0Mj6QtloskcRWhyZteJZVqkdkmawpum162HGEextTK7SNziyWmI7nw/FwOPmWxLX2u9obTOI0XFSKXqDSYftny4ECax17zeB8rV9aLpUsrYqntd+82Y4youVrN0ab90m0xuyahSFyw56x6m4hph1WEe9B3Vvj6wu0lDuKlXPIQ52kVGVqUpEAcyNKxmxGkeMFebVw2bRLrl3QarTJedYRjMSGC4eI8wsHp+m116WVE1TSu8Z+3I4O8ZCNFMSXeerB4Y7CCu9h8tUqmqqs1+RtwxNKeqWo9bSFTC6Faa90bq1nzEvRdabYi06Lnc9UFLhl0vEH6zmDOPIfIF3XsjUC3NSKJBq9tVmUrFPjNDmxZWKHY7COYPYV6CFSNRZ0HdG3bVdHPEKO6ru6qbvYrkFvdVCMK7uqm6puC2qEK4W8VEtUkEEyuMuK6aNachEna1U5SlykMFzo03GbDaAO0ldWNR+6Uac23NxadaUpP31U2ktApsMiDn98jj5AqtqOtsZrew7dYyvgqVZp9HgujT0/LSUJvN8xGbDaPKSF5xXTtO7ROq8R4pLKfpvRontWsb3ya3e15458QC19F0QnbsmfRd83nW7omCcljplzIfzkn6Fy6uVcNR1OV32GKVSnDlS3az0BvHbK0csaK+FUb6psSYbzgybzHd/hBC1pUO6Y6OSz3Nl41XngOToEi7B8661UjRey6GB6Gt+ULh7uM3vjj5XZWTS9v0yUAECnysIDkGQmj6ly55fin7EDXeLprZFs3FB7p1pNEJD5auwe10iftXN0nujmilSeGxq5N05x/pUm8DzhaIfS5OIMOlIDh2wwvgnLMoNQaWzNHkowP68Bp+pVjwg6afmV43T54ved2bP2k9L79DRRL3o8293KG6ZbDf4sOwtiwJiDNQw+BFZGYeIdDcHA+ULy3qugNjVYlzqM2UiH9JJvMJw83D5l8dJsTUDTSYExp7qPVaa1nFslOxDEhnsPQR42rfpZcw09U7xMsa9GXPbvPVYjKiQugdmbft+6bOhyWrVoemMmDu+ntEbgY63M4gnxEeJdwtKtcbK1qozKhaddlqk0jw5cO3Y0I9TmHiF3qVanWWdCV0ZnHVdbDOCMKhCuEKJatgxlshRIV0qJGFZMqWiFAhXSMKJCtcgtEKBCukKJarplS0RlQLVeIUHBW2ENFojKiQrpCgQpKNFohQIV4hQLVZMo0WnNUMcVdIUHNVyCBCtuarqo5qumQ1c+ctUCFec1QIyrIxtFlwRTIRXuY+8z4BVAypYTC89c66RQBVAUg1VAUFim6gbwUgOPJSa3CEkWtwpKSrhVJIgKuMKW6qdPBCRjKcuakFEgpYmwTmq7qqBhSSRDVXdVVXCi4I4CqpYC6fbXW2udP55+n+m8Nlcv6ab3uJHh+HCpwPDLjyLxzxyHSqykoq8nqLJXNhbTO2FamztINk3f6+u2ZG7KUOTdmIT0OiYzut+c9C6H1qmXxtF3Cy59VqlE9B73fJS25ZxZAgN6A4Z6ufSekr6rD0sdSKjHuO5px9w3fOu75MVCZcXlrjzDc/Sthrx+OytKd6eH1Lp9Dn1sVb2aW8+Wm0yUo8nDlZKXhysvDGGwoTQ1o8i+pEXmW29bOW3fWwiIoAREQBERAEREAREQBERAfLUqZKVeUfLTstCmpd4w6HFaHA+QrXMtp3c+lNd9Uek1xR7cn2nffTXv3paN+zunhg9RyPEtoItqhiauGlnU5WM1OtOk7xZtXQLuhdLuWqy1pao08WVdfCEJuL4MnMv7CfaZ7TjtXceXmYU3AZGgRWRoMQBzIjHAtcOsELzDvGw6LfdOdJ1eTZHaR4EUcIkM9bXdC+LS7XvUfZAm4ctPPmb701c7BgPdmYkR1tJ5eLkexezwWVaeItCpql8Tr0sRCtq2M9TCMqmMLRsxts6QS2mcC94l2SvpfGZ4Eo0700YmOMLvQ8LeB4csLqfqBtuap67RItN0ypLrGtx3gvrdQAMy9v7HQ3PYCe1dipWp0Y51R2Rsv2VeWpHd7VbX+wtFqXEnbsuKUpxaMtlQ/fjxD1NhjiT5F01vruhF96mui03SG0XUuVcS01+ttzgfrMZwAPjz4lqO3tDadCqLqxc87M3bXXnefN1F5e0O7Gn61smBAhy0JsODDbChtGAxgwAvNYnLaXs0FftZoVMZCOqCuavmdJa7qDUvTTU276jdc2473oXvzmQGnqx1eLCzyg2lRrYgCDSqbLyTAMfkoYB8/Ncui81WxVbEO9SVznVK1SpymERFqGEIiIAiIgCIiAhGgQ5mE6HFhtiQ3DBa8ZBWs67o4+l1dlxWDU49oXJCdvtiyjy2FEPPDmjl9HYtnotijXqYeWdTdmZKdWdN3izNtnjbrjR61LWLq/LMt+5MiFL1nG7Kzp5DPQ1x684J6l3PY9kaG18Nwexwy1zTkELzXviwqTf8ASHyNTgBxxmFHbwiQXdDmlZDswbT9c0SuyT0x1OnHzdvzLhCotwxeIh59rDiO/Vzw48iePBe9ydlWOLWjnql8TrU6ka61an0eh6DkKJCmx7I0Nr2OD2OGWuacgjrQhehJLRaoEK8RhRI6VKK2LRCgQrpGFEjKumQWiFAhXSFFzVdOxUtOaoOarpCi5qsVLJCiR0K65qgQpKNFohRIV0hQcFdFSy5vFRxxV0hQIVkypbc1WiF9Cg5uVdFWrlghFIjCK5jM+AVQFUNypBq8+dYjgqQbgqQGFUDKqWsUxhVwpYVCcKCRuqqc0QmwQDATCluqSbEUAypYCqoBTdTdVeaqGoWsRwqqWF1T22trJ2jtJg2ZZ5E/qHW297gQofH0FDcMd9d1Hj4I7CehQ2oq7JSuYztobX85bU8dLtNH+jb2nm7k5PQTllNhngeP6+Mns8a676baZSlhycWNFimo1ybPfJypRjvRIrzxPE8cK1pdpq2yJKNOT8Y1G459xjT1QiEue954kAnjjJKzpeFyjlB4mWjpv2F5nJxOIz/Yhs+IREXCNAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCjFhMjw3Q4jGvY4Yc1wyCFJEB131G07oumV70q7oVJhTNvxY3e56Ue3eZAe48IrR0LsDIxIEaTgxJXcMu9gdDLBhu6RwwvluGhStzUScpc7DESWmoZhvBHLPT4wtbaHV2bpj6pY1YeTUaJEIgOfziy5PgntwMeQhdGc5YmjnN3lD4dPgbcpOtTu3rj8DbSIi5xqBERAEREAREQBERAEREAREQBY5ftjU+/wC3o9MnmDeI3oMce2gxOhwKyNFeMpQkpRdmiYycXdGb7CW0NUo0zNaQX1Nf/UVHafSybjuw6dlxyaCfbFo4+LxLuiQvKnWO3qhIPpl+W48y9x23FbNQ3w+DosNp4t8gyfFlejOg+rNP1u0soV2yDm/6ZAHoiCDxgxhwew+Ir6Zk3GrF0U3tW07cZqrBTXiZ2QokK6RhRIXXFi0QoEK6RwUSMqxWxaIUSFcIUSMqUypaIUCFeIUCFkTKlpzVbIV4hQc1XKsskedRIV0hQIVkUaLZCgQrpGVAhSUZaIVCFMhRPBXTILT25RTIRXuQ1cz0JhTRefOoUAVeSrjgqYUCxTOR2oAq4ypAIWIqoCljKruoCiKu6qgIWsUAVcKuFUBVJKAKoaqgdi425LhkLRoM/WarMNlKdIwXR48Z5wGsaMkoSaw2otoakbOWmk3XZt7Y1XjgwKZIZy+YjkcBjqHMled+m1r1isVqoagXrGfPXhWnmM98Y5MuxxyGDq4Y4DkOCuXBelQ2tNZJu/6wx0K06RFdLUKnuPguDXfnCOs4BPbw6FsXkvJ5Wx13xem+/wBDn4utm/yo+PoERF5U5IREQBERAERUc4MaXOIa0DJJ5BAVRa4ujXa3qJMukKcYtw1gndZJU5u/4XU53IfOuDhQ9Ur/AHExYkvZNMf0MHfJkj6luRws7Z0/ZXb6bTYVCVry1LtNsVCryNJhGJOzcGVhjm6NEDR86xGf1usemuLYtxybnj3MIl5/wgrgpDZzt0xe/wBbmp+4Zk8XPnZhxBPiWZUvTe1qKwNk7fp8HHJ3eGuPnOVNsNHa3LusvUm1GPO35GKRdpCx2EiHOTcx2wZN5+kBWhtJ2dnwvTNg63SRx9K2XDpsnBGIcpAhj9iE0fQFcMrBcMGEwjqLQoz8P1H730IzqPVe/wChrmBtF2JGIDqrElz1RpaI36ly8lrPZNQcGwbkkS49D4m6fnwsnjUWnTIIi0+Vig89+A0/SFwdS0stCrNImrdp788y2CGHzjCm+Ge1SXin8kL0XzNHNSFeptVaHSc/LzIPTCiB30L71q2e2cLNjuL5OBM0uL0PlJhzcL4zpReFsQy+2b2mou57WTqw77Dd2b3MJoqEuRUt3r5q5OZSlyZb0beRach6tXdZrgy87TjGUbwfUqWe+MHaR/8A4s6tTU62b1AFJqsGPGP6Bx3Yo8bTxVJ4apBZ1rrpWtFJUZxV7XXYZSiItUwhad1kgxLKu23r8lButgxWyNQx7uC44BPi+xbiXBXzbkG7LSqlKjNDhMQHNbnodjLT58LZw9RU6ictj1Pue0zUZ5k03s5zmYEdkzAhxobt6HEaHNI6QeSuLXeg1yRLg09lYUycz1Ne6Qjg88s4AnxjC2IsdWm6U3B8xSccyTi+YIiLEUCIiAIiIAiIgCIiAIiIAiIgIRoLJiE+FEaHw3tLXNPIgr6dgm8fWu1puzSqfmO902qNNTozXngX8N5je3dyf7hVlap1TqUXTvUfTzUKVyyJSqoyFHePe3ZznsI3h5V3cj4h0cSo80tRvYSdp5j5z1ic3BUCFSQm4dRkZeagkOhR4bYjHDpBGQrhavo6Ogy0RlRIVwhRIVipbc1W3DirygQpuVsWiMqBCulvFRIyroqWSFEhXSFAhZEyhacFAhXiMqDgrEMskYUSFdcFAhWRRlkhQcFeIwoOCsijLRGEUiEV7kGeEqoVAFLC4B1RnIQDKkpBoAQEFXClhELJAcFU8UxxVQFUWKAZUsIqgZQkoAqhqqBhV6ULFOS89e6Ba0zuo16SOh9qTZEvlszcUzAd7RgwRCJHYQSOvAXbDaj1zkdn3SCsXNMRGmoFhl6dLniY0w4YYAOzmewLzn0YtCdptPnrkrrjHuS4Izp6biv4ubvkuDc+XJXMyhiuK0W1ynsMVaroYZ3PzGdUOjSlvUiUpslCbBlZaGIbGNGOAHPxr7kRfPW23dnnW7u7CIigBERAEXG3BcVOtamRahVJqHKSsMcXxDjPYB0nsWpIlw3drTGdAt8RLbtRx3X1SICI8dvT3sdHjWzSoSqLOeqK52ZoUnPXsXSZZe2s9HtWaNMkmRK7XnHdh06S8N29+0RyWMQrDvTVE9+vCpOoVIccto9Pdh7h1RHfUs8sbTGhWBLFtOlg+aePys5H8ONEPa4/UssWXTQo6qC19L2+C5viZNJGnqpLxf8AWo4C07DoVkyggUinQZX9aLu5iP8AG48Vz6ItOUpTedJ3ZrOTk7thERVICIiAIiIAiIgKOaHAggEHoKwS7NFLWuyKZh8j6Xz/ADE3InvTwevhwWeIskKk6TvB2LxnKDvF2NNRKFqVpyQaRUGXhSWfzWd8GYaOoO6VzVs68UGqzQp1YZGtqsA7r5SojcGexx4FbLXBXTZFEvOTMvV6dBm248F7m4ezxOHELa01OrqrR8Vqe7Y/IzaSE/zF4o5xj2xGNexwc1wyHA5BCqtMxdOLw01Jj2VV3VSnNOXUepO3sDqY7oXN2nrjSqtPNpNdl4ttV0HddKzw3WOP7LjwIKrLDNrOpPOXmu9EOi7Z1N3XnuOJ06h+pTWe87fB3ZedaypQG9Hhe2x5/mW4Vpm/KtJ2frra9bnJiHKyc3IRpWNHiHDQBkjJ8q5upbRdiU0kem5mXdUvCc9Z61GpXcakIt3S3rV8jJUpzqZsoq919DZaLTMTaeo8yS2k0Cs1Z3R3qXIB+lWna03vUselenM61p5Om3Fv1BYuJV/1K3e0inFqvOrd7N1otJm6tZaj+YtimyI64sUH60NO1sqB8Kfo9Paf1RvEfMp4o1ypxXj6E6Dpkt5uxMrSo031Un/9qv6DLNPMS8vx+gKvrN37/wCpk3/BTi9Jbaq8/QjRQ55rz9DdOUytLes3fv8A6mTf8FPWbv3/ANTJv+Cmgo/urc/QaKH7i8/Q3TlMrS3rN37/AOpk3/BT1m79/wDUyb/gpoKP7q3P0Gih+4vP0N05RaW9Zu/f/Uyb/gqw+j6vWO4vk6nKXbKN4mHMNDImP++1OLQlqhVTfiviidDF8ma8zeCLS0PW+74bA2NpvUjFHBxhk7uezgqnXO6WjJ02quBxOCfuqOJVuhb16kcWqdm9G6FguuFJbWNK7ghbu9EhwO/wz1OY4Oz5gVwFD2k7Xno4latDm7enRwdCnoRAB8f2rmbq1JtCpWzVJVtw097o0tEYGiO3JJaVMKFajVi3F6miY0qlOabid9tku7XXxs5WFVYj9+M6mQ4EQ9O9D8D/AIVtohdTO5q3rS5/ZtpNIfVJQ1GSm5iGZQx299azey07mc44rtrwPTkL6jF3SOxNWk0WXNwoEYV9wVst7FkTMRaI4KJGQrhHSokKxDLRCgRwV4jKtuCsVLRCiQrpGVAjCsihaIUCMq64KBGFkTuVLRHFQIwrxCgQrFWWSoEK6RgqJCsijRZcEUyMorXKGdAKqruquFwzqlAMqWVRVAyhKCkBhUAwqqrLBSAQBVAyhJTCkAgaqoSEJwEWhNtfXVuhGhtWn5V+a/Ux6XUyG323fnjG9j9kZPjwovYta50y2ntRhtN7SraJJRXRbIshxY9wOWTM2D4R7QD4Piaetc01oa0ADAHAALB9HbJNl2dAbMExKpPEzc7FdzdEdxx5Bw86zlfPsoYnjNdtbFqRwcVV0k9WxBERcs1AiIgCIiAwO4dJZO77vhVitTsefkZdo7xSncILHDm49eVnMGBDloTIUKG2FCYMNYwAADqACmiyyqTmkpPUtheU5SSTewIiLEUCIiAIiIAiIgCIiAIiIAiIgCIiALH7vsOh3zImWq8jDmMe0igYiMPW1w4hZAitGUoPOi7MmMnF3TOrGqGk1WsyPSqjOTcS5bQpscF0CZJMWBCcRvNJ5lvBb6tazrP9LJWeo9FpvoeOwRIcVsBryQRnmcrJp6SgVKTjSszDbGl4zCyIxwyHA8wtIysxUdnqtOlZoRZ+w5yLmDHAy6ReTyd+yurpp4unmX9peF/r8Te0kq8M2/tLz+pvGFLwoLd2HCZDaOhjQB8yuL56fUZarSUGbk47JiWjND2RYbshwK+hcl3vrNF3W0IiKCAiIgCIiAIiIAiIgGEwERAcPcFn0S6ZcwarTJaeaeRiwwXDxO5hYp/J/sP4AhfxH/athos8a1WCtGTXiZFUnFWTZqqd2brTfE79TXT9EmActiyUy5paescVztv3FrvpE5ptW/n3JT4ftZCu/lSR1bzsn51nCLcpZSxVF6p379Znjiqsdrv3mYafd0lhUuZhUrVq05u1pxxDRUpNpiyr+3HMeTK7f2TqBbmpFDhVa2qxKVinxBwiysUOwepw5tPYV0FqdJkq1KPlZ+Vgzku8YdDjMDgfOtbwtMK9plWhcWldwzVt1Nh3nSLopdLR+wtPDyEFelwuXYTtGurPp5jchiadTVLU/I9X3NwoELpzoNt/StWqkvaGrEg20royIbJ8+DJzR5A59xnzdq7iwosOYhNiQntiQ3gOa9hyHA8iCvVQnGos6LujYasRIUSFdIwoEYWVFLFoqBCukKBHFWKMtEYUSFccFEhWKstEKBCukKBGVlWsqWnBW8davEZUHBSUaLRCKRHBFYqZyqgZQDKkuGzqWCAIpAYCgkbqAKqkBhCUUAVUVQMoWAGSq4VUVQMYXl3tTX83aG2q4dDlXui2rYjdyJg5ZHm85cfIcN/uld9tpfVuX0P0Uue7IsRrZmWlXQ5NhPF8w4bsMDynPiC81dCrZj0i0XVaoOMWr1yM6oTT3+2y45A83Hyrk5SxGgw7ttepGDEVNHTb53qNkAYHBEReBPPBERAEREAREQBERAEREAREQBERAEXD3Jd9GtGTdM1eowJKEOQiP8J3iHMrXbteotejOgWja1RrzuQmHt7zB8e8Qtinh6tVXitXTsW8yxpTmrpajbioSBzOFp8yGsFzOJiz9KtmXd+jgw++xAPHx+pXYWhNQqh3rhvis1HPOHLv7y3xcz9Cy6CnHl1F4Xf08zJoorlTXhrNnzdbp1PaTNT8rLAc++xmt+krH57VqzqaSI9xyAI6GRd76MrH5bZyseA7eiyExPP6XTc09+foXNyWj1l08AQbckBjpdBDj86Wwy2uT8EvmyLUVztnFTG0JYkDlWRG/soTj9S+F+0pZucQos7HP/tyris9lbPoUljvFHkYOP1Jdo+pchDp0pC9pKwWfuwwEzsMv0N+K9BnUV+l7/oatdtJ24fzdPrEX9ySco/yj6Ofa0GvOb0ESLuK20IbGjAY0eIKu6OoeZNJh/23730GfS6nn9DUn8o+k/1fr3yFyfykKOPb0Kusb1mSctt7o6h5k3R1DzJpKH7f/L6DPpdTzNVy20laL3hs2J+nE/0mVc1c7C1PsS7ZOLJvrdPmIEZpY+DMO3Q4HoIcsvmqbKTzC2ZlYMdp6IkMO+lYzU9IrNq+fRNuyBJ6WQgw+cYUqWGeu0l3NP5IlSovma8TW76TV9IJyJU7OmWXBaUR3fJikNjCI+AOl0MgralkX/R7/pgnKVMh5bwiwH8IkI9TmrEJnZvs17i+UZUKZEPJ0nOObjyHKxZ2zVP2pPxKxaN0TUvUmZc2HNMyIp/Vc4HiD2hbc3hsRH2p2l0tbe+195nk6NVa5a+m3x9TfaLWNjawejKmLduuV9IrlZ4O5E4Qpg9bHdvUtnLmVKU6Us2SNKcJU3aQREWEoEREARcRWruoluwXRalVZSTaOiLFAPm5rXdW2mbSlIhhU/0XWY2cBspAJBPYStinh6tXkRbMsaVSfJRttFpT13b+uaH/APTlhRoDHe1mKk/dHj3eH0qDaXrZWfCjVak0hp47kGGCR9P0rPxSS5cox736XMvF2uVJLxN3ItKeoPVw8TfEuD1CF/0T1Bat/wBeZf8Ahf8AROLQ/dj5+g0MeuvP0N1otKeoLVv+vMv/AAv+iGxNXWcW3vLOI6DC4fQnFofux8/QaGPXXn6G60WkvSrW2n/m6vSJ9o99hAZ+YKUO59aKaf8ASbapVTaP6O/cJ/xFOKX5NSL8fUaC+yS3m60WmHa2XfSh/rbTioMA9s+Wi74826kDafosJwbUqJV6a7p77LnAUcSr80b9zT+DI4tV5lc2Pedh0a/aY6Sq8o2M33EVvCJDPW13QrWjG0beOyfWJW37yjx7m0ziv73L1DBfHkMnhk890fq+bqWN0zaHsSpENNZbKvPDdmYbmfUspdVravWmRpT0dT6pJx27r4QjNdvDxZyt3CYrE5Pl7UXm9DM1OdWhqnF5p6LWvdFKvSgyVZos7CqFMnIYiwZiC7ea5pH/AHwXJOC899gutVexdfbn0zlKpFmbQbJGowJOP4XeHndPgHo9tg9a9CiMr6JRqqtTVSOxm+0tq2MtFRIVwhRIWyUZaIUCFdIUHBWRWxacFAhXSFAhXiVaLJGFFwV1wUCFcoy1jCKRCKSpnCrjHaqgYVVxDplAMKoClgIhYAYVQEAypISMYRFLkFVgphVAwtMa07X2mGhUB7bguKBGqePApcge/wAy89W63l4zhdW633S6+LtiPZp3pW8wM+BO12KQwjr3Wlv/AMljnONNXm7Is7JXeod0ovF98ah2DpNJxS+C6J6bVNjDwbDBIaHeZyxWBBZLQYcKG0NhsaGtA6AFqHTO5Lg1d1dvjUC7RAFbfFbJuhywPeoO6MFjMk8AG9a3CvF5Xr6WvmLZFfE42NnnTUVsQREXDOcEREAREQBERAEREAREQBEWOXjqBQ7EkXTFWnWQXY8CA070WIeprRxKvGMpvNirsmMXJ2SMic4MaXOIa0cSSeAWprt1Znq5V32zYUFtSqud2PUSMy8oOkk8iR/3lcU4Xlri4eDGtG0CeIPCZm2/UPm8a2ralnUmyqWyQpEoyVgj2xHFzz1uPSVu5lPDa6ntS6OZd/obObCjrlrl0ephNr6E0yWjip3PHiXPXHHefHmzmGw9TWfatmS8tClITYUCEyDDaMBjGgAeRXCQASTgDpWv701roFpRxJQXRK1V3cGyEgO+Pz2kcAsN62KlbW38PQpepXdtpsBYxdOpdtWbDJqtWgQInRAa7fiO8TRxWv3UnUnU8CJPTjbKor+UrL+FMvb+0eg+bxLK7W0TtW1i2M2Q9MJ7m6cnz32I49fHgPIFk0VKl+bK76F67N1y2jpw5bu+hepjzddahcEQw7Ws2p1ZvJsxGHeYXjyQjpvWSqnehSlBo0M8mRMxXjxnex8y23DhshMDGNDGjk1owApKNPCPIprx1/TyGliuTBeOs1F6Uayu4mu0Jn7IleSelOsrOIrlCidhlcLbqJxp9SO5DTvqrcah7zrRA5TNuzGP1oThn5wpsrGsUrxjUSgzmOiDFcwnzuK22icZvtpx3Eabpitxqf1w9RZEZnNPHRwP6HONP1FWna9T0gcVSxa7JAc3NhiIB5lt1DxGDxHammpPlUl4Nr5saSD2w+JqyS2kLPjPDJyJOUx/SJqVe3Hlwswo2o9r3A0GQr0jME8miMAfMVy05RafUGlszJS8cHmIkMFYpVtE7KrOTHoEtDiH9JL5hOHlaQl8NLma3P0JvRfM15mbQ4jIrd5jmvb1tOQpLUEfQSbo0TvtqXfVaO4cRBjxO/Q/F0H6VT091SsWGTU6XKXfIs5zEge9xwOst6fMnF4T/Kmn2PU/PV5jRRlyJJ+RnF+ad0jUCmGWqEHEdnGBNw+EWC7oLT9Sw7TS6axbtzRbEuiL6KnYUMxZCof0mEOg9oXLWlrnbdzTAk5iLEolT5GTqLe9OJ7CeBWu75g3FfGthFmzUGBM0eSEOLOxMFkLf5gc8nitqjSqNSoVtSSvr5jNThKzp1NS26+Y7BTE1BlIZiR40ODDHN0RwaB5Stf3Lr7ZltOdCdVGz8yP0Mk0xTnxjgsYlNnabrkcTF5XXUKy7OTAgPMOGezJ4+bC2DbuldqWqG+ltElYLx+kczfefK7JWvmYanypOT7NS3v0MWbRhtbfca8OtN43cDDtCyZjdPATlSy2GO3HD6VA6aanXhxuC8WUqA720tT2ch1cMfSVu18SFLQ8ucyFDHWQ0BYzXdVLTttp9H12ThvH6NkTfefI3JV415Xth6aXhd+ZeNV7KUPmzE6Ls2WfT3CLUIc1XJrm6LPxi4E/ujA8+VsCkWpRqBDDKdTJWTaOXeoQBWuJjaKkZyKYVAt6sV159q6DLljT5SFX1Sar3I3/AFfblPt6C7lFqMXvkQD90H6lapTxU/zpW73by+glCtL8x272bcXzTdTk5BpdMzcCXaOZixA36Vqb1qr8rpzXdQI8OG720GnQu9jxdH0LkJDZytWEQ+pPqFcjdLp6acQfI3CwaKjHlVL9y9bGPR048qe5f/DIKprFZdHcWzNxSQePcw4m+fmXBRto+xoRIZUI8fthyzyPoWSU3Su0aSAJW35GFjp70CfOVzcK36ZAGIdPlmDshN+xL4Zc0n4pfJkXormbNdt2lbLceMedZ2ulH/Yvsl9oew4+A6s95P8A7sF7fqWeupMi8YdJwCO2GPsXyx7Uos0CItKk4gP60Fp+pM7DP9D3r0GdR6r3/Q4eQ1as2p49D3JT3k9BjBv0rnpav0ydAMvUZSMDy3IzT9a4Cd0js2oA9/t2QfnqggfQuEm9nixpnPe6VEk3frSszEZj58JbDPnkvBP5oWovnaNjsisiDLXtcOw5UI8nAmmlsaBDitPQ9gK1TF2cqXDOZC4q/IY5NZNhwHnarJ0YuunHepOolShkcmzLN8fT9SlUqL5NXen8rk5lPmn5Gd1PTS1qyD6MoMjGzzJggHzhYjU9mmyJ7L5aVmqVG6IkjMFuPIchfKwav2sMuNKu2XbzbjvMYjs5D6VWV2g4FNmRLXVb1TtyLnBixYRiQvOByWeMcTH8med3P5bfIyxjWX5cr9z+RxlG0SvPTe5XXDYt+TUhVdzvffY4IiOZ+qXDII4DoW9dPdvC/dKZyBTNY6G2q0l7gxlx0pmCwdcRo4HyYPYVwlBu2jXPLtjUqpS09DcM/kYgJ8o5hfdUKfLVWTiys5AZMy8Ubr4cRuQ4LboZXxOHlm1Na6NhZYuadqiv8TvvZ150XUC3JOu2/UINTpc2wPhTEB2Qew9RHUuYI6V5g6NX/VtkrWClycvGjTunV0TQlX07fLjKRnEAOYOzI8Y8S9P+BHYV7zDYiGJpqpDYzd1NKUdjLR5qJCuuCgtwoWiMKBCukKBHBXKlojKtuCvEK24LKVasWnBFMhEKWM3AypAYQDCqBlcU6gAyqkKo4IgCYUgMLVe0jtA0PZy02nLmqxEeZP5KQkGnw5qOfatHZ0k9AVblkjIdUtX7S0ZtmZrt21mXpUnBYXBsR35SKf1WMHFxPUF546nbX+qe01FjU2xIcXT6xy4tfUonCbm29QPQOxvlK11Aodxa+XPE1A1RmYk9MTT++yNFc4iBKw/cjd8XR51tCBAhysFkKDDbChMGGsYMADsC81jcrKm3Toa30mhXxah7NPW+kwOz9FLetd/ouYhOrVXed6LUKge+RHO6xngFm89MQ6dTZiOQGQ4EJ0QgcAABn6l9Kw7WGq+kumNyTQduu9BvhtPa/wAEfSvM59TE1Vnu7bOXnSrTWc73Md2cJJzNP4lReD3ypz0aaJPPGcD6CtprE9KKb6Uab27KkYcyTYT43eEfpWWJiZZ9acu1is86pJ9oREWsYQiIgCIiAIiIAiLVlRsnUmfnphzL6gSko97jDhwZQbzW54DOOpZqcFO95Jd9/kjJCCltdjaL3thNLnuDGjpccBYfdOrtqWixwnatCiTA9rKy35WK49Qa3PzrERoHOVZ+9cN6ViqNPOEyJ3tp7OCzK2dJrUtMB1Po8ARxzjxh3yIT+87Kz5mHhypOXcreb9DLm0Y7XfuMGN8X7qY10C16Obbpr+Bq1SHh4/Yb/wBCues3RClUCb9M6xHi3HXHHeM5PHeDD+w3kFsgANAAGAOQC4i5bvo9nyLpurz8GSggZHfD4TuwDmSpdecv5dGOan0bX47RpZP2Kat3bTlwA0AAYA4ABYhfOqlBsKDidmfRE8/hCkJbw40Q+IcvGVgzr1vPVuI+WtWTfblCJLX1mdbiI8f+23t/7IWXWNo7Q7LcZtzXVWsP4xKjOnfiE9meQU6GFHXXevoW3xfN8SdHGnrqvX0IxD0vv7WEB87FfZdtv5S0P/ao7esno+ZbCs3TW37FlwylyDGxyPDmovhxYh6y4rKEWKpiJTWZH2Y9C+fT4lJ1pSWatS6AiItUwBERAEREAREQBERAERDw58EARQdGhs9tEa3xuCtOqMoz20zBHjiBTZizOFuvT2371lnQqtTYMwSOEYDdiNPWHDiCuPsyxaLpNQZ4yz4roZLpiYmo534jgOvA44Cyf03kf6ZA/iD7VIT8nMAtExAiA8CN8HKzKpUzdG283oMufPNzW3Y1TG2gjVoxg2tatWrrs4bG70YUM9vHipOZq5djBl9Ls+A7ob+WjY+cD5ltmBBhS8MNgsZDZ0BgAHzK4s2nhH8uml36/p5GTSxjyIrx1moIGz++qxBFue7KtWnH20JsXvUM+bisuomkFn2/umToMqIg/SxWmI8+V2VmKKk8TWmrOWrs1LyKSrVJamy3AloMqwMgwmQmjoY0AfMriItYwhERQAiK1FmYMAZixWQx1ucApBdRcJO3vQKb/tNZkoH78do+tcBOa5WJI577c0mSOYhlzz/hBWWNGpPkxb8DIqc5bEzOkWrZjaRsthIlo87Pno9DScQ584C+dm0NKTbt2RtO453qMOS4H51sRwOJlspsyrDVn+lm2kWrW6w3BM49C6ZXTHB5H0KR9S+uHfeoUznvGj10Pxz/ANHd91ZVk3Fv9HwL8Tr9U2OrE5Iy9QgmFMwIcxDPAsiNDh861/FvnUSUhmLMaPXRDgt9s70O7h/hXHO2hJOmxRDrlr3BRD0umJMlo83H5lDyfi468xh4SvHXmn2XJoFb1UjGcpBj23UwciZpzywE9reS4U1HUvTGH/psCHe9HZzjwBuzUNvaOn51l9G1rsmulrZa4JVsU/oo+YTh5HALMZWcgTsMRJeNDjsPJ0NwcPmVXWrU/Zrxuu1fPaQ6lSOqorrtOv8AeeqdDv8ArWnwkokSXnZevwHTElMsLIkIbzeJzwx2r2NgubEgMc1wc0tBBByCvMO+tIbcv6G107Keh51h3oc5K/k4rT15HPyqdha76o7KU1CbUJuPf+nxcBEgx3EzEm3ra48R848S9TknH4aEFQWp9vqb1GpTnFQjqfQz06IyoOCxbS/VG3dYLPkrktqeZPU+ZaD4J8OE7pY8dDh1LKyvWpl2rFohQIV0hWyMK6KlshQcFcIUSFliyvMWSEUnBFYoZvuqoGFVVAyuIzplFVqrhVAUXJR8dYq8nQKVN1KoTDJWSlITo0aNEOGsY0ZJPkC8mr5v2d2u9bpy8J/vhsShRTLUSTefAjFp/O7vbwOfEOhb+7o3rhN1SYpWiVqR3Cq1ktjVmPCP+zyuchhx+tgk9gHWtVWvbknaVBk6TIs3JeWhhg4cXHpJ7SuDlXGaCnooP2peSNTFVtFDNjtZyoGBgcAiIvEnBC1PtKzLhp7DkIfF8/OwYAA5njnH0LbC1HrY30yu3T2k8xHqoiuHYzitzB/nxfRr3azYw/5ifQbTpkqJGnSsu3g2FCaweQYX0oi1G7u5rvWERFACIiAIiIAvnmKjKyjt2NMwoTup7wCviuusG3rZqlTA3nSktEjAHpIaSPnWnNOtHKXqBbMtcl1Rpup1SpZjuPf3NawE8AAFtUqUZQdSo7Jatl9ZnhTi4uc3ZG6XV6mt5z8sPHFb9qp6oaX8ISv8Vv2rAGbOFjMH/h0d370y8/WpfycrF+DIvyh/2q+bhus9y9Sc2j1nu+pnouKlnlUZU/8A7W/auKr2pNsWzBMSo1qUlx0N75vOPiAySsXOzlYpz/qyKPFMP+1cnQdEbLt6O2NL0SDGjt5RJomKR8ZLYZa86T8Evmxaiud7jE4urN039HdKWLQIkKVJ3TWKm3chtH6wb0/OexcpbGhcpBqLavdU/FuisZ3g6aJMGGf2WLaEKEyCwMhsbDY3gGtGAPIpI8S4rNorNXnvDrWVqasvPeRhw2QYbWQ2hjGjAa0YACkiLSNcIiIAiKjnBgJcQ0DpKAqixeu6n2rbZLahXJOA8foxEDn+YZK4qk6i1y/Zj0Np9Ydw3fGJwIsCUcyD8bj9S26eEr1uRBmeFCrU5MTPVCLFZAYXRHtY0cy44C5qztkDaX1Lc2JPytD03pz+bp2L6ImgOxjQRnxkLM6tsAaWaey7Z/WnWudnh7Z8CPOMkoR7A0EnC6tLI1aX5jS8zehk+o+U7Gia1qvaNvuLJ6vSkOIP0bHd8eezdbkrjKbqTWrymO8WTp/ct1PdwbEl5JzIbvKePzLfsrtC7DGzwzFs25CuipQuUeUpvox7j1mLHIHlC+Sod2ltCjkQLd0wm/QzeDe+zcOBw6PBa04XVp5GoR5bb8jdhk+lHlazELc2d9p++ojRL6f0y0Jd54TFenQCB1ljd53+FbGp3c5dcKq0OrGqlBpWfbQqXIPigeJzg36Fj0j3buS76PRmmUUQ88TBqYyB4ixbl027r3opeMZktXW1e0Jlxx3yelxFlx/fhuJHlauhDA4aGyC+JtRw1GOyKMPhdy2vObeGz+t9S717oS0i1h/+S5iU7ktSYoHprqvdk717j2Q8/Su6dgap2lqnSWVO07gkK9JOGe+yUdsTHjA4jyrKlsKjSjsitxlVOC2JHR6S7krpdDaPRtyXZUCOffKiW58wXKQO5P6Gsc10aBXZkg/pKtF4+YruaiyKKWxF7I6fexVaCfA9V/8A+rG+8vknu5QaHxwTKwa7T4mMB8Cqxcjt4kruYimyFkeQW0Fs/wA7sY6oWzLyVbqNcsC596WhxKk/fdKTQ5N3u0EL6l3l7oDpO3VrZguyVgwu+VWkwvTaQc0eE2LBy7h427wXmFRNoW1oFn0ucqtTb6ZxIDe/SkBpiRe+DgfBHWR0ryuVcG3ONSlHbqdji47DtyUoLabYRa+tutaratO3dOdK6vU5Z3Bs9OwzDheMk4aPOtzWh3O3X7USG2Ne18U2x5OJxMlSWmPHA6nEANB8TitGlknE1OUlHvNaGAqy26jDajW6fSIZfOzsCVYOmLEDfpWEVfX+yKSXMbVxUI44CBIw3RXE+QY+dd0LK7kfpXSosOYuurVy85kEF3oyaMNjj4m/auyNhbK2kumcOG23bBoki9g4RjKNiRPHvPyV1aeRKa/Mm33ajdhk6C5UjyXo+ot8X3EEOytK7jre97SI6Xc1p6uQP0rYNu7Ne1bf0VrYVm0qy5d/6esTLct7d1pe7/CvXeWk4EnDDIEGHBYOTYbQ0DyBXl0YZNwsP0X7zbjhKMf0nmVTO5eat3AA66tY4EkHe2gUWWeQPEXbv0LM6R3ISx4TRFua/wC5q1u+E/MdsFp688130rdakbcpE5VKlMw5OQlITo8ePFdhsNjRkknxLxc24+6X3FrDVKjaGnk5MUCyoT3QYk7AfuTFRA4Ekji1h6ADxHNb0aVOHJil4GyoQjsRtnVizdhvZmMaVqEjM35ccE4NMlJ2JNPDv2yXBjR5c9i0FV9u3TWhPMKxdnWzqZBb7SLU4ZmInjI5LpdEiPjPc97i97jkuccklchTrZq9WgRI0lTJubhQxvPfBgucGjrJAWUudqWd0rvqScfSyzLHpjB7VsChwvB8pCyihd1w1UpMVpjW7ak1CHuBThC+dpC6OOaWuIIII4EFEB6oafd2rl2RoUK8NOWsgZw+PRY4LgOsMfgHxbwXenQ7bJ0l2gYMJlqXRLOqb2gupU5+QmmHqLDz8bSQvzjL6abU5ujzsKckZqNJzcJwdDjwIhY9hHSCOIQH6nSGuHEAgrjKpatGrcJ0KoUmSnYbubZiXY8HzheVewx3UufkqlTbG1fnfRUhFIgSlyxjiJBPJrY/W3o3uY6V6ySs1CnZaFMQIjY0CK0PZEYctc0jIIPiQGkNQdiHRLUyBEbWNPqS2O/+cyUL0PFHiczC6zXt3I6lSMWJOaZagVi1ZkcYcrOOMeBnqJ9tjzr0NRVlFSVpK5DSepnjFqLp9rzs3Rohvi0PVTbkE49UFD/KMLesgAEH95o8araWoNuaiU95p05DmAW4jSsYYiMHSHNK9mI8vCmoT4UaG2LCeMOY8ZBHUQuk21f3NG1NV4M/cunrm2Re3e3vzJZhy047HtXtb7UnlvDr5LjYjJVGrrp+y/I59XBU5646mdeO5qwRL6g6tS9PLm0OFMQhBYwnvLX5dnA5Zwu/JC6c9zqrFOtO37l0uqVE9T9/W/OPfVYUQ7z5vJAEXJ48OAx1YPSu5BC9PQjmU4xvexSorSsy0VAhXDzUXLZMJaIUHBXSFBwV0ypacEUiEWVMozNcZU1QKq4bOmFh+sGp1L0c03rl21eI1krTZd0UNJwYj8eCwdpOAsxAXnD3QfVCY1b1aoWi9Ijf6npzm1Guvhn27hxbDP7o6Otw6ljnONOLnLYiW1FXexGm9KoVTvmu13U+5cxK9ccd0WGH8RBgZ8FreofUAtnK1KysKSloUvAYIUGEwMYxo4NAGAFdXzjEVpYiq6kuc81VqOrNyYREWsYgtT3oPRuvNjy54iXlpiYx24wtsLiZm1qdN3HKV2LA3qlKwnQYUXePBruYwtijUVOTb6Gt6sZac1BtvoZyyIi1zEEREAREQBERAcXdFFFxW5UqYXbnouXfB3uokYBWp9LNS5GyaXCs+7niiVam5hMfMeDCjw88HNdyW7FxVetSj3PBbCq1Nlp9jeLe/QwSPEeYW1SqxUXTqK8Xr1bUzPCcVFwmtRxsPU+0ouN24qac/wD5LftX1QL7tyac1sKuU+I5xwA2ZZx+dcHF0PsWLkutuUBPS0uH1r5I+z9YcdrgKGyET0w4rwR4uKvbCvnluXqWtQ6X5GwocRkZgfDe17Tyc05CktRu2d5Gnv75QrirNFePatgzJcweQrjrjt/Vez6XFmKRckK44cIZ7xHlgI2OzrPYpVClN2hUXimvVBUoSdoz36jdqLGNmzSG/tqGmRYlC1bt6kVWW4TlGmaa70XLntYSN4do4LsNJ9zE1CnQPTbW18PPthTqU1nmJcV0Vkau9rX9eBtrJ9V86NQLjalctJo7S6eqUrKAe/Rmt+krsnTe5N2zHiNfcWpF21oe6Y2YEFp8gWf2z3L/AEEt+I2JM23M1yIDkmpTsR4PjAIW1DIj/XPcjNHJvWkef9R15sinP3PTpk3FzjvcmwxnE+RfdRrivy/S1tjaV3NX2POGzMaVdAhHtyRjHlXrLZ2z/ptp/DYy3rHoVLLPaxIMjDMT45Bd86zyFLwoDQ2HDaxo5BowFvU8j4eHKu/67DZjgKMdus8p7X2PtpzUCJDdOSlv2BIv4l83G9ETDR+43Iz4yFt2gdyjlKrEhxr/ANTq9cTgcvlpECUgnswCThd/0XSp4WhS5EEjchRpw5MTr9ppsGaIaWRYUxTLGkJ2eh4Im6qDNPz1+HkfMsi1u2gdNtle0fTO5pyVpMJzSJWmyUNojzJA9rDhjHn4AK3tV7SFE2YdJqjddVc2NOEGBTpEuw6amCPBaOwcyegBfn11o1rurXm+Z66bsqMSenpl5LIeT3uAzPBjG9DQtozHbDaE7rNqbqbGmqfZQbY1CeS1r5ciJNvb2xCPBP7oWD6M7CGue1jR/VeJhrKXNEuhVS456JvTJzxLBhziM9PJdTBzX6D9gDWe0NS9nGz6fQqjLemVGkIclPU4PAiwIjBgkt54PPPagPEbaB2Y7/2aLhgUq96SJT0SC6VnJd/fJeYA57j8Dl1HBWqV67d2jvy2Ymn1qWs2bl5i5/R5mxLscHRIMENILndLQSRz5ryJQBERAZfppq3d2j9xy9ctGvTlEqEBwcHS8Uhr+xzeTh2EL2C2G+6aUjXSNK2bqAZeg3o7DJaaDtyXqB6hn2sTs5HoXicr0nOR6fNwZmWjPgTEF4fDiw3Yc1wOQQetAfqhByqro93M/bSftCWS+z7omg++KFBBMVxwZ2WGAIna4cneQ9K7woAiIgNa7Sd0wbK0Dv6tR3BrJSjTLgSfdGGQ0echdb+55bJ+ntE0Ds68qnZ1Onbsq0sZyJPT0ERnhrnHc3Q7Ib4ODwHSvv7oxdMe6aNZWiNEiE12/wCqw5eOGHJgyTHZiPPZnHxSu2tp25JWhbNKodOhCBIU6VhysCGPcsY0NA8wQHIy8pBk4TYUCCyDDaMBkNoaB5ArqIgCIiAIi4K+rpl7Isyt1+bcGS1Nk4s1Ec48AGNLvqQHmF3Xrayi+i4OjVtzz4TGNZM12LAfjeJ4w5ckeIOcO0BeWKynVK+53U3US4bpqEV0Waqs7FmXOccnDnEgebCxZAbi2QKHZdybSFjU3UF8NlqTE6WTQjO3Ybj3txhteehpiBgPjX6Jrfsm2repEGRo1EpshTmww1kCUlmMh7uOHADivy8NcWODmktcDkEcwt8WPt0a4aeWu236Lf1RhUyG3chMj7sZ0JvU1zwSB5eCA57ujNqUGztrm9pC3peBKSTokOPEl5YBrIcV7AXgAcBx447V1oX3V2u1G56xOVWrTsaoVKciGNMTUw8viRHk5JJKu21bNWvGtylHodPmKrVJt4hwJSVhmJEiO6gAgOMRdzqB3JfXquWuau+n0mnRyzfZTZyd3Zh3ZgNLQewldTL1sqtad3TUbduKnxqXWKfFMGYlY7cOY4fSDzB6UBwgOF669ya2x5i7KedIbtnXx6jIwjEok3Hfl0WCPbQCTzLR7XsGOheRSyvSrUWqaTaiUC7aPEMOfpU2yZYAcB4B8Jp7CMjyoD9PqLGtNr3ktSbBoF0U94fKVWShTbMHON9odjyZwslQBERAed+07TYGl/dEtKblpzBJtu6RiU+pbo3WzDwHsaT1n838ULtQRhdX+6OVinVvXnQC3aRFE1eUtXWzbpeCd58GWLm+E4DkMtJ49AJXaJw5rbovUzRrrWmWnDoUFdIyrZGFso1C24KDuSuuCtkYVijLZ5IpEcUV7kGagZUsIOSLjHRMD1z1VkNFdK7gu+oOaGU+Wc+Exxx3yKRhjfK7C8udFabUKtCq9818ujXDc0y6cjRYnthDJJaB1Dj9C3N3RDUmY1S1btnRmlx80mQc2qVvc47zhxYw9gBJx1uHUuCl4EOVgQ4MJoZChtDGtHIADAC81lnE5sVQjz62c/G1c2KprnLiIi8icYIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAwuv2DMQbhlrstCqRrVvGTcIkCoyTtwRCOiIBwcDyOV222ae6NQ5uoytj61S8K1rnJEKVrQ4SM/wBGS7kx3zeJdfVw90WlSrypj5CrSjJqA7lvDwmHraeYK7WCynPDexPXH4dx0cPjJUvZlrR7DS8zCm4EONAiMjQojQ5j2OBa4HkQRzCuryG0f2h9VNkmPBlJaJH1D03Y7LqZNxC6ckofT3p5ySAOTeXiXo1oFtU6ebRtGE1adahvnmNBmKVMkQ5uAenehniQD0jIXsaNeniI51N3O/TqQqrOgzb6Ii2DKERfLU5r0DTZqZ4fkYTonHsBKA8O+6v65zOpm0VMWvAmS+i2qz0JDgtPg9/cAYjsdfIeRdJVlerVyxry1Qu2uTDzEjVCqzMyST+tFcQPNhYogC5OgXPWLUnROUWrT1ImxwEeQmHwXj+80grjFVrS8gNBJPQEB9dWrNQr09EnanPTNRnIpy+Ym4zosR56y5xJK+NVex0M4c0tPURhUQHajYh2Fa3tcVibno096SWdTIohTk+1u9EiPIz3uGOvHMnkvQi5e456QVC2okpSqhWaZVhDxDn3RxEG/jm5hGCM9S0b3GnXykW9OXLplVpqFKTNUjNqFNMVwaIsQN3XwwTzJAaQOwr1dqtZkaHTpifn5uDJycuwxIseO8MYxoGSSTwAQH5sNorQWv7N2qdTsm4TDizUruxYMzC9pMQXcWRG+MdHQchazXZjuh+vFJ2gtpWsVygP79RJGBCpkpH9+bCzvRB2FxcR2YXWdAbA0E1dquhmrNu3lSI74MenTLXRWscQIsI8IjD1gtJC/SVYd4yGoNmUW5KXFbHp9UlYc1Be05Ba5oPzcvIvy6r2y7j9q9EvXZ+nLUnI5iTVszjoMIOOSJd43mDxA7wQHfZfLVKnLUanTM9OxmS0pLw3RYsWIcNY0DJJPiWrtb9qjTbZ9pzo93XJLS84W5hU2A4RZqKegCG3iM9ZwF51a57UGo+16Y1HpkGY0/0viHESG44nqiz9s+5aerl41grVqdCOfUdkY51I01nSdjsZsoyL9praPvPX6ow3xLdpznUO0mRRgGE0/lI4B6T0eMrvIvP3uXmsMOi0yvaKV6ZZBq9AjOmaX3zDTNSjznLesgnj416Agg9KyxkpxUo7GXTUldFURFYkIiIAupfdQ78j2Psg3UyWiGFHq74VMBBwS2I8b4+KCu2i88O7TVZ0roRacgCQ2arW8R17kMn60B4zIiIA1pcQACSegKUSG+E7de0sd1OGF3E7luNMTtDRPXI9L98SR9JfTXd9D+i98c97wd7d3sb3DPbhbq7sSdLjM2eLZ9KPVmIkQT/pV3vPofdG533c4Z3uWeOEB5nr0Z7i/UbQg6sXbJ1WFLequNIsdSosdoLu9hx762GTydxaTjjhecy5qzLyrOn1z064bfn41MrFPiiNLzUB2HMcPpHYgP1G9C8M+67MpzNq6N6DbDbMmly5mtzmX+FjPbu4Wyra7tTeNNsn0FVrJp9UuNjNxlRbMOhQnnHtnQwOfYCug2q2qFe1lv6sXhcsz6Kq9TjGLFc0Ya0cmtaOhoAAAQGJoiID3R7kjqDEvPZSlabMRu+zNAqMeQwTxEM4fD+ZxHkXddePXcktoqz9F7e1Mlr2uSToVPixJOZlxNPw57gIrXhjRxJ4t5di7Q3z3VqxYDo0np7bNbvyojLWRIMAwJYHoJe7jjyKrkoq8nYhtLWzvGSBzXU3az26KXo7NCx7GlheWqM/iBLUuT/KMlHO5PilvIjnu+fAXUW99pnaJ1sESXmqzJabUKNkOlqMN+a3T0d9PEHtGFb7mZbMqzVbVaanN6rVCSfBgw6nO/lY/Fz9475ycnAzxWGjiKVeo6dOV2jX08HdQd7G99l/Zlq1o3DUNT9Sp81/U2tgvjRYnhNkWu/Rw+o44ZHIcAuy8QK6eSg4ZC68Uo6kakpOTuywoOCuEKLlkMZaIUCMq6QrZHFWKstuCKTkVytjNFiuqd/yGlun1duqpPDJWmSr45DjjeIHgt8pwFlYGV0E7ppqdMVybtLRmjxSI1Zjtnqq5h4tl2HwWHxnJ/uriykoRcpbEdHUtbOumjfpheE7cOo1ezGrdzTj5jvjxxbC3iQ0dQ+wLaC+am0+DSafLSUswQ4EvDbCY1vIADAX0r5viKzxFWVR855qrUdWbkwiItYxBERAEREAREQBERAEREAREQBERAEREAREQGAW5rTQK9cc5Qoxi0qqQIphNgTo3O+46Wnt6ln6w3UDSegaiwM1CXMGeYMQp6B4MVh6OPSOwrW8Kd1H0ZIZOQjeVtw+Aiw8+iITevr4dXFdBUaVdfyXaXQ/k/kbejhVX8t2fQ/kb6WEV/S6Vma1CuG356ZtW54Dt+DVKW8wnb37QbjPardl602te27Clp9spOnnKTf5N4PUM81nYIIyDkLAnWws7q8WYk6lCWrUzO9Ke6H6k6PmHTNXqA67qEzDW3JRWAR4bR0xYfJ3j4LvDo5tR6Za7yTIto3XIz0yW5dIRYghTLPHDdg+bK84nNDgQQCDwIKweu6M2zWp4VCDLRaPU2neZPUuIZeI13XlvSvQ4fLXNXj4r0OrSyhzVEe1YcHDIOVxV2MMS16u1oy4ykUAf3CvJK2dVtonSyG2DbOpouCQh8GSlxwO/kDq3iSfnWx6f3QnXyRp8WTrum9v18xIZhujyE86W5jGd0hy7UMfhqiuprx1HRjiaMtkjygrbHQ61PtcMOExEBH94r4ltGuaFX7UatOTpt2JD9Ex3xe9siNIbvOJxz7Vxr9Br8hnHqdmT+6Wn61m4zQf61vRfTU+st5gC7hdy/nNMZPaCcdSG08EypFJiVbc9DMmMj22/wCDnHIldevWJvv+rk1/h+1Sh6D34XDFuzTT1ktH1qeMUeut6J0tPrLed9O62u0UmqVbs1Z8ahRb5dMER3UF8Mh0vjnF734JOcYzxXmYthnQK/XnjQI5Pa5v2q63Z2v1xA9I3jPXEb9qjjVDrreiNNT6y3mvpGfmaXOQZuTmIspNQXB8ONBeWPY4ciCOIKza7dfNR77pMOl3Be9eq9OYABKzdQivhnHLLS7B8q5WW2ab9mIoY6lMgj9Z8ZuPpWT0nZBuWaIM7UZKSb04JefmWKWOw0NtRFXiKUdskaGQDK7a0DY+oMoQ6rVebn3dLIDRCb5+JWw6DoXZFvFrpehQI0RvJ81+VPzrQqZYw8eTdmrLH0o7NZ0hoFl126Ioh0qlTU6c43ocM7o8Z5BdnNALH1e0slazCol0usqVrUNkKdMqQ+O5rSSN0+5PE8QVvqWlYMnCbCgQmQYbeAZDaGgeQK6uTVyzWnqppR8zRqZQqS5CsYPb2kFDo1SdVZ0zFwVp534lRq0UzEVzv1vCzgrOAMDARan1S1djU2eba1qQ/TG6JrwB3vi2Wz0u7Vykq2Lqa3d9vMaK0mIlrdzFdRpRtf2hrdkpKrTVLmxKuD5umRzCjwXAEjwm8Qt2UW9derFYGW5rFUJyCz2sGuwhM8OoudklYdpPpJBsaDEqdTiCpXNOZfMzsTwi0nm1pP09K2Ot6WPqUHGnQlqird5syxUqdo0nqRkFH22tp62XtE9K2pdUBvMGEZeI7ytOB5ln1E7qHfFM3G3RorNxGj28WjVBsXPia4BahRZo5ZxC5STLxyhVW1JnZKmd1k02yG1217rt5w9sZmQL2jyhbAtzulWz/cW4PVqynPd7melokPHzFdK3sbEGHNDh1EZXE1CzaDVc+jKNIzGemJLsJ+hbcct9en5mxHKXWientubTmk12FopeoluTLnDIaajDhuPkcQV0Y7tJWJKr6WaeRJCdgTkB1UjkPl4rYjT+SHSCVoSe0LsefJc+gS8Jx91BzDPzFcJUNmWzKhDEMiow4YO8GNnC5oPYHArajlnDvamjMsoUntTOkSLuizZRsVowWVBx6zMj7qvQ9liwmDBlp5/aZr/or/xjDdu4tx+j2nSlrixwLSQRyIVYsZ8Z5dEe57j0uOSu7sHZisCF/wCWx3/vzLivvgbPNhQMYoUN+P14jnfWqPLOH5k/L1K/xCl0M6I4JUhDc7k0nxBegUpo7ZcjjvVtyHD9eEHfSubkrRodOx6Fo8jAxy73LsH1LDLLdP8ATBlHlGHNE88pC2avVCBJ0ucmc8jCgOcPmCyqmaF3zVcd6t+ZhNPTHxD+ld92Q2QhhjGsHU0YUlrTy3UfJgl/XgYJZRl+mJ03pOyZd89umajSUi089+IXEeQLPaBsdU2BuvrFbjzJ6YcrDDB5zk/MuxaLRqZVxU9krdxryx1aXPY13b+gNj26WuhUZk1Eb7uccYvzHh8yzd5p9vyDnu9DU6TgtyThsNjR8wWL6m3/AB7KlKfL06QNVrlUmBKSMk12C+IeAPiyR51sjS/uft36nTkvWtaq8+Xp4w9ltUt+6PE9w4DyZPas2GwWIyh7c5ez0v5E06NTELPnLUaZjaq1bUGrvtrS+hTd01p/gmZhQz6HgA8N9zurx4XejY12cYuz3p3MMrEZk3ddaj+japHYcgOI8GGD1NGfKStt6faXWtpVQodItWiylGkWDiyXhgOeetzubj2lZKQvZ4PBUsHH+XtfOdCMI01mwQzkZUTzVc8E6AumCy4YJUHBXX81bcrIqy2rZCukKDuauVLTkUiEVkVMpq1VlqHSpuozkQQJSUhOjRYjuTWtGSfMF5GW7c8zrjrTe+qdR3nQ5iafI0pjuUKXYd0Y/uho8pXdLuj2r79OtBY9Cp8UivXXHbSpRjD4Qa7jEd4t0Y8q6p6f2tBsyz6XSYIx3iC3vjv1nni4+UkrxeV6+jo6NbZfAyYupmU81bWZCiIvEnBCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAJzREBgt46K2nernxpynCWnDxE3JnvcQHryOB8qwUad6mafnNs3KyuSLDlslURxx1cT9BC3oi3IYqrBZr1roes2I15xVnrXaaUh7QNTtp7Ze8rQn6XFHB0zLAxIR7R1ecrMre1ssy5S1ktXJeFGd+imT3p3zrNo0CHMwyyLDbFYeBa8ZCwyu6L2ZcRc6boMsIjucSCO9u87cK+fhqnKg4vsd/J+pbOoy5UWu76mZQJmDMsD4MWHGYeTobg4fMri0tObNMrJRDFty5qtRH5yGGL3xg82CrPqA1aon/AIfesCoMHJk3DznzgpoKMuRVXimvUaKm+TPebvRaUFT1vkh3s02hzuP0vLP+MJ6f63fAND+Mf+YnFH147xoH1lvN1otKen+t3wDQ/jH/AJien+t3wDQ/jH/mJxR9eO9Di76y3m60WlPT/W74Bofxj/zE9P8AW74Bofxj/wAxOKPrx3ocXfWW83Wi0p6f63fAND+Mf+Ynp/rd8A0P4x/5icUfXjvQ4u+st5utFpT0/wBbvgGh/GP/ADFYnIutlwwvQD5ak0WFGO6+clz4bG9OPCP0IsI+ecd44v0yW82Leeqls2GWsq1Shw5hwy2Xh+HEPkHLyrDP5Udnfqz/AMnK5SxdB6Hax9G1IGv1uId6LOzg3hn9lp5fStgCjSAH+xS/8Jv2KW8LDVZy7b2+TDdCOqzfkaSr2uFR1D3KDp/ITRnZnhGqEeGWNl2dJHUe1Z7pbpRI6dSDojn+jq3M+FNz8QZc9x4kDPEBZtLycvKZ7xAhwc89xoGfMrypUxCcNHSjmx5+l97+RWdZZuZBWQREWka4REQBERAEREAREQBERAEREAREQBfJVapK0SnTE9Oxmy8rAYXxIjzgABUq9YkqBTo09UJmHKykFu8+LEOAAsR0n0kuXbVvCHuwpmi6UU6ODNTbhuOn3A8WMPTn5vGujgsFUxk7LZzs2aFCVZ9hnOxRpLUNd9XX6vV2TdBtOiOdAoUCMPz0UcDEA6hzJ6yOpej55rjbWtWlWRbshQ6LJw5CmSMJsGBAhDAa0DC5Ny+jUqUaMFThsR3bJJJbEQIVp4wVePJWnrPEqy2eZQDhyVTzCoVkRRkXhWir7lZIwVdFWWyFByuHmoOHNWRUtuRVRWKnnpth3KdWtsyRoEOJ36k2TJB8Zo4t7+8Bx8vhMHkKvLWGmNTfeGpeqd2RiYkSpV2MGvP6ge4geLl5ls9fLsq1XUxLjzR1GljZZ1XN6AiIuOaIREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEXFXBdVItWUdM1aoQJGC0ZzFfgnxDmVrGNrHX73mHyVh2/FmIZ8E1aoN73AZ+0Aef/AHwWxToVKqulq6XqRlhSnPWtnSbQr9yUy16fEnarOwpKXYMl0V2M9gHSVh2nWodU1Cr1RmoFNMpasKGGSszHYWxY8TPEjj7XHYuMoGhonKiyrXrVItz1IeE2DEOJeEexvT5VtOBLwpWCyFBhthQmDDWMGAB4lknoacXGPtSfPzLuLy0cE0tb6S4iItM1wiIgCIuCvKr1aiUR81RqSa1ONcP9Fa8MJb0kfYrRi5NRRMVnOyOdRaroW0FRo82JG4ZKbtaeJ3d2oQyIZP732rZsnPS9QgNjSseHMQXDIfCcHA+ULJUo1KXLVi86c4cpF9ERYTGEREAREQBERAERY1d2o1vWPKujVapQoDh7WA070R56g0cVeMJTebFXZaMXJ2ijJVhV/asUSwoQhR4hnapE4QadK+HFiHo4Dl5VYse2NXtpya9CWLQYtrW044jXHVG7ng/sdZ7GgntC7obO+wlY+h72VipNN3Xg878Sr1Ju93t3VDYeDR28+1ejwmRpztKvqXRznSpYPnq7jrTojsaXntEVWSuzVcRres1jxGlLZYSyLMt6DE6Wg9OeJ6ML0Uty2aVaFFlaRRZCBTabKsEODLS7A1jGjqC5bAaMDh4lE817ClShRioQVkdNJJWSsiCgelTIUTzWdhltQcOCuHmoHmkSpZPJMqrwojhxWRGNlXK25oU3HKi4KxBZdzUHKblE8lcoWzzRVIRWKs8o9m2VczTkTr898n5yPMEnp8Mj6ltVYjpHTPSjTS3JbG6RJse4drhvH5ysuXyHFTz685drOVWlnVJPtCIi1TCEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBEXH1iv0235Z0xUp6BJQWjJfGeGhSk27IlJvUjkEJABJOAOlakqmvsOpzLpKy6JOXPN5x35jCyAD+8eJ+ZfOdP791AAiXVcAoUi7j6WUk+Fjqc/wD/ANW4sLKOus1Fdu3dtNhUGtdR2+O4y67tYbXs4OhzVQbMzvuZKUHfYrj1YHLyrD2XVqPqQCyh0plpUp/KoVDjGc39lv8A08qza0dKLZstgMhTYbpn3U3MflIrj17xWX8lOko0vy43fS/T1uM+nDkK76X6Grrc0Do8lOCo3BNTF0VTOe+z7i5jT2M5edbNl5aFKQWwoEJkGE0YaxjQAPIriLXqVqlV3m7mKdSVTlMIiLCYwiIgCIiAIiIDjq1btMuKWdL1OQgT0FwwWxmBy1hOaI1G1Zt0/YVejUiJne9LppxiSz+zjnAW4EWxTr1KWqL1dG1bjLCrKGpPUacl9d5u04xkr+oUzRo7RwnJZhiQIvaMcsrmJTaNsCcGW1ss6w+WiDH+FbBqVKk6xKvlp6VhTcu8YdDjMDmnzrTtb2eRRahFq1kzUOnzJ8J1PnGCJLRP2eIOFuU3hKv5icX2PV8G0bEXQqcpWfkZgzXWwn//AHNJt/e3h9IVz18LD/rRIfHP2LAaNfFBp8+2k39Z8nbtQPgtmnyzXS0XxOxw+hbTlrItOcgQ48Ch0uNBiDea9kuwhw6wcKKlKjSftxlvVt9iJwpw5SfkcQ7XKwm//dEifE4n6l8kxtBWHABPp62L/YwIj/oasnbYVtMOW0GnNPZLN+xfXBtejy/5qlycP92A0fUsF8N0S3r0Md6PQ9/0NczO0nbQyJGRq9Sd0d4kyAfjEKx69F0VfhQ9PanHB9rEmyIbf+/KttQpOXgD8lAhw/3GAK8p0tCPJp372/lYnPpLZDezURltXLsh4jTFLtKXdzbCHfowHj4gedYy/Rus6VXDTL5pb4N7T9Ni9/mqbV4IiMmG9OGnP29S7BostLH1KMlKmkl0Jf0y8MVOm7xSSO4Oy7tLWhtB2XBjUNsKk1aTaIc9QnYbElXcuAHNp6CFuty8h7otSvWFdkvqLpxMOptzyLhEjSsL83OtHNrm8jkdHSvQTZU2p6JtK2YJiG1tNueR/JVOkPd4cJ4900cy09B8i9zg8ZTxcM6O3nR2KdSNaOdE3keSg4KZUTyXQMhAhW3K4VA8lYECFAhTPJQKRKFtw4qCunkobqyFWQKoeWVUoRw7FYoWXDiVBwwrj+ag5WIZbRCMIrJlLHnTQpcSlFkIA5QpeGweRoC+5RhN3ITG9QAUl8Zbu7nEethERQQEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQGv73ltQKrWWyNvR5Ck0gwwX1GKd+MD0hrVxVI2faQZts9ck/OXRPZ3i6diHvef3QVtVFtLE1IRzYau7bv2mdVpRVo6j5pCmylKl2wJOWhSsFowIcFgaB5l9KItZu+tmBu+0IiKAEREAREQBERAEREAREQBERAEREBx9bt+nXJIvk6nJwZ2WeMGHGaD5upTotFk7epcvTqfBEvJy7dyHDBJ3R5V9qK2dK2bfUTnO1r6giIqkBERAEREAWsrmkK/pHektqlp+4wKzInen5Fme9zkL3QcBz4c/OtmoQCCCMgrZw+InhqiqQMtKrKlLOid3dnnXihbQ2nEhc9GiBkVzRDnZInL5WOB4TD5eR6QtlryWsi+5/ZA1ll7vpwiusKtxWwK3Iw+LYJJ/ONb2cSPKOlerdCrkjctGkqrTZhk3ITkFseBGhnLXscAQR5CvpGGxEMTTVSB6GMozipx2M+wjCgrjlbPNbaLEHKCuHmoFNjKEDwyoZVxytrKisiBHQmOCqeaHkFYoWXDJVtyuu9sVbcOasQW3IqkIpKnnryREXxk4QREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREBxtxW/J3RRZulz8MRZWZhljh0jtHaFsDudus05albq2iF0TDnzFPLpqhzMV352ATkw+PUCCPKFiK1dq6Z+xazbuplBBZWrcmmRH7vDvsHPhNd2dHlXdyTi3QraOT9mXxOhg6ubLMex/E9eHKDlj2nN8SGpViUO56bEESTqcpDmWYOd3eaCWntByPIsiIXvjsFtyieSmQolSyrLblbdwOVcPJWz0rIirKOVM8FVwUScBXMZB44q27mrruStOVgQPNFVyKSh55oiL4ycIIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAL4q1SoFdpM5T5lodAmYToTweojC+1FKbTugnZ3No9zBv2JMadXNp3PxXOqNqVJ7YYeeJl4hcW47A5rvOF3UPJeaeyHVvUbtwVWmNO5LXDRzELRyc9uHfS0+delhX1HC1NNRhPpR6ZSz4qXSQPJRKkeSitphkDyVpyuq28LIthVkCqHkiHirIoyLuLVbPJXPclQPFXRBA8kQ8kVih55IiL4wcIIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIuAvC+aLYtPM3V51ks08GQ85fEPU1vMrWsXUG/NQgBatHZQKY7lUqmMveOtrOj51s08POos7Yul6l/Xcb+EwGIxss2hBs3QXBoySAOsr4Zm4KXJkiYqUnAI5iJMMafnK1LA0VqNaJiXVeFUqrjxMCWid5hjs6fqX3y+z5ZEAeFTHzB/Wjx3vJ+dZNHh48qbfcvVo9dR4H4yavUko/12GxG3dQnuDW1qnkno9FM+1ffAqErNjMCagxh1w4jXfQVrJ2gljuGPSOGO0PcPrXyRdnm0d4vlWT9Pi9D5Wbc3HnyozcM9knuXqZpcDcSl7NReZt9FpV+kt00Z+bfv2oQIY9rAnh30ef/AKKcKe1ft54320e4oDeYwYUR3lyPoU8XhLkVE++6+PqcetwZyjR2Qv3G50Won64VmjgCuWJVZQD20WVIjs+YL7qftGWXNuDJmdjUyJ0snIDmY8fBQ8JXtdRv3a/gcKrgcTQdqlNrwNnouEpF72/XmB0hWpGZzxAZHbnzE5XNNcHDLSCOsFasouLtJWNJxcdqKoiKpAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEVuPMQpWE6LGiMgwmjLnxHBrQO0lasuHXiViTz6TaEjEuarcWh0EEQIZ63O6gs1OjOq7QRno0KleShSjdmY6axXSW3JppEhHdfHlYsN562+F9q9TCvF+S0/1Lbc0hfEO7YVOu2SJdKsgwvAgD9UHl8y7rbIu2tUr+uUabalykOmXxDYTLT0LDYNQaOodDsDo4HoxyXvcmVqWiVCM05I9dUybisFRi60LI7jkYUD0q45W3dK7TNFkFA8VcVt3SroqWyir0lUHNWRjYIVk81ecMKyeasiCBRHdKK1yrPPJERfGTghERAEREAREQBERAEREAREQBERAEREAWCananQbGl4EnJwfTG4J07kpIs4kn9Z2OQWQ3ldUpZdtztXnHDvUuzIbni93Q0eMrWmk1qTVTmY973CzvlaqfhwIbxwloJ9q1o6OC3KNOKi61TYubpfR6nosi5JllSvm7Iraydm6TxY88LhvOMKzcETwmsicYMsP1Wt5ZC2c1oaAAMAdAVUWGrVnVd5f/O4+54bC0cJTVKjGyQREWE2wiIgCIiAYBGMcFx1Rtyl1ZpbOU+WmQeffIQK5FFZNrWiripKzVzAqjobZdRJcaLDl4h/SSz3QnDzFcNE0Ki00l1v3dWqSfcsfG76weTgVtZFsxxVeOrOfjr+Jz6uTcHX/MpJ+HoapZb2q9DdmTuuSq8NvKHPQMZ8vP519TNQdSqOMVOy5apsbzi0yYwT/dJK2YitxnO5cIvwt8LHErcGMnVdkWu5ms27RcpIxBDrNs1qku6S+XL2jyhc7TNfbGqZa308hysQ+4mmOhn5wstiQmRW4exrx1OGVwtRsegVcETlHk4+f14LUz8PLbBrufqjiVuBlJ/lVbd6Ocp9zUiqsDpOqScy08u9R2n61yQcHDIII6wtWT2g1lzYJhUoyMQ/pJOM+GQfIcLhzoZO0xxdRL2rch1MixBEaPoTR4eWybXevRs4tbgfjIflyUv67TdiLSzLc1Xor96Uu6TqsNvKFPS4GfLjPzr6/V3qfSW4nrOkKm0c4lPmS1x8hJTi1+ROL8bfGxxa3B7KNHbTb7tZt5Fp1u0HFp53azZtapxHAubC32rlqftF2ROODY9Ri09/S2bl3sx5cYUPCV1rzb92v4HHqYLEUtU4NeBsxFj9M1BtmsgGSrshMZ5BsdufMVzcKagxxmFGhxB1scCtaUJR5Ssari1tRdREVCoREQBERAEREAREQBERAEVuNMwpdpdFishgdL3ALF67qvaVtg+jq9Jw3j9GyJvvPkblZIwnN2irlowlLVFXMsRafmNoeDUopg2zbdUr0Q8GvEIw4fnK+eZhaq3sR36bk7NkjzhSv5WMR2nj9IWzxScfzGo97+W07OFyNjsW/wCXTduk2pXbopNsyrpiq1GXkYLRkmNEAPkHMrWc7r3Frsw+SsmgTVemOQmorTDl29pJ5jzKdC0IoUnG9FVqLM3LPk579UYhc0HsaOHnythychL0+A2DLQIcCE0YDIbQ0DzKb4elsTm9y9fge1wXA/ZLFz8EarhaWXJe8w2ZvqvxI0tneFJkD3uCOwnpH/eVsig2zS7Yk2ytLkoMlBHuYTcZ8Z6VyaLDUr1Kqs3q6FqR7/CZPw2Bjm0IJdvOFq3XFsa3YFDvSmuMtWKDPwo8KYh8HBu8MjPUtpLWG0POsZp++ntG/NVCYhS8CGOJc4uHJZsC5RxNNx6SMpRjLB1FPZZ/Q9a7JuFt2WdRKy3gJ+ThTPxmg/WuYKxHR6hR7Z0qtKlTIImJSmQIUQHmHBgysuIX0/mPjDIO5qDuOVccrb1cqW/dIetVxgqjlZGJlD0K28YKnxUH5yrIFs80QorEHngDkA9aqrMlE79JwIn60Np+ZXl8aZwGERFACIiAIiIAiIgCIiAIiIAiIgCIqOcGNLjyAyUBpbUuK7ULVGi2ew71Mpw9MKgBycfctPzedbWYwQ2hrQGtAwAOQC1XouwVutXhc8QZjTtRfLsJ5iHDOAFtVbuKea40VsivPaz7xwcwawmAi7a5a2ERFpHqD55yoytPDTNTEKXDuAMV4bnzr5fVNSfhKU/jN+1cXeunVEv+FLQ6xAiRhLkmH3uK5hGefIrFP5Ntj/0GZ+VRPtW3Tjh3H+ZJp9i+po1ZYpStThFrtbXyM/8AVNSfhKU/jN+1PVNSfhKU/jN+1YB/Jtsf+gzPyqJ9qfybbH/oMz8qifasmZhOvLcvUxZ+N6kfefoZ/wCqak/CUp/Gb9qvy1YkZz8xOQI37kQFa5/k22P/AEGZ+VRPtXyTuzTbRIfTZuo0qIPdQJgu+lMzCvZN7vqNJjVrdOL/AN30NuA55ItLjR69aEc0O/JktHKHONJb5ean6aaxW6MR6bTLihN91AcGuPk8E/MnFoy/LqJ9+r4jjk4/m0ZLu1/D0NyotLDXus0hwbXrIqMljm+CC4fOPrXNUzaMsyeLWzM1MUuIfczkBzceUZCrLB11rzb92v4Fo5QwsnZzs+3V8TZ6LgKXf9uVpoMlWpKYzyDIwz5lzkKPDjtzDiNeOtpytWUJR1SVjdjOE1eLuTREVDIEREATCIgKOaHDBAI6iuPnbbpVRBEzTpWODz34TT9S5FFZNrYyripamjCahovZdTcXRqBLNefdQQYZ87SFwMzs9UZrs0yrVikcc4l5skf4sraiLYjiq8dk2aVTAYWry6SfganGi1blf9j1ArULqDyHKbdNb8lh+Q1GnHY5d9ggraqK/HKvPZ+C9DQlkLJ0ttJeZqwWjqlC/N37Ad/aSgP/AAqTaNq3A9rddLj9GXyg8/tVtFE41LnjH3V6GB8Hcmv/AMRrLvWsEPGKvQYuOh0AjPmaq+iNYYXDv1vRu0scMfMtmIo4z/gjuMT4M5Nf6PM1oKnrBD4GXt2L+1l4+tPTfV/+hW58d/2rZaJxj/BHcU+6+Teq95rYV7V5gwaRbkT9rvzxn/Eomq6vxuAlLdgZ6d55x85Wy0TjC/bju+pC4LZNX6XvNYPk9Xp4YfXaLIA+8y+8R52qw/Te/ap/4jqFMsaebZOCGD6ltZFPGprkxS8EbUODuTYf+O5qqX2fadHfv1iu1isk82RpktafI37VlFH0ntKhEOlKFKtePdxG77vO7Ky1FSeJrT1OTOrSwGFofl00vAtwJaFKsDIMJkJg9yxoAVxEWsb2wIiKCQiLFr31Ho1hyRi1CY3pl3CFKQvCixT0AD61eEJVJKMFdmOpUhSi5zdkjnKxWZOg06NPT8wyWlYLS58R5wAF9myFovVdpLVmV1IuCQiy2n9vRc0qBMNw2djg+2APMDgSeXIKuhGyLeO05VJO6tR4Me2rBhPbElKJktjTwBzlw5hp6zxPQvSmgW/TbVo0pSaRJQafTpSGIUGWgNDWMaOQAXt8m5N4v/Nq8r4HzfLGWON/yKPI+P0PuIAAAUTyUnKJ5L0TPIsgVByuHkoFZCC27mouUieHWouVzEyh5K3E5hXDyCtv5qUC27miq7kisVZ5q2RPCpWdQ5oHIjSUF+fGwLm1rzQCpGpaUUPeOXwGPl3dm48gfNhbDXyCvHMqyj0NnFqxzZyXaERFgMYREQBERAEREAREQBERAERUJA5nCAqhAIweRREBpfR2IKHct52zE8CLK1B03CaemHE4gjyraq1fq5Q5+0rokdQKNAdMCA3vFTloY4xIP6/k+oLOraumm3dS4VQpkyyZl4gzwPhNPU4dBW/iY6S1eOx7ex8/qfcuDeUIYvBxpX9qOo5ZERaB64ImUQBERAEREAREQFHNDxhwDh1FcVULRolVaROUqTmQffILT9S5ZFZScdaZWUYyVpK5rirbPtk1Vxe2legon68pEdDx5iuBibOgkTvUa66tTiPat75vAfOFuVFtxxleKtnvx1/E0ZYDCzd8xJ9mr4GmfUTqrQP/AA27ZWqQxyh1CHgny4Ko69NWKHn0faMtU2N5xJOJnPkB+pbnRW41ncunF+FvhYpxLN/LqSj43+NzTMPaIj05+7XLQqtPI5uht3h84C5qnbRVkTxDYlQjSDz7mbgOZjyjIWynwmRRh7GvHU4ZXE1CzqFVWkTdIkpjP68BufPhNJhpbabXc/VDRYyHJqp98fRo+SnajWxVgPQlckY2eQbGbnzLnYE5AmWgwo0OID0tcCsBqWgFkVIk+k7ZVx91LRHM+tcFH2a6VCcXU2t1anHoEOOSAmZhZbJtd69GNJjY7acX3O3xRuFFpoaPXnSR/qrUCcwOTJqHvj6VU0vWWlH8lU6PVWD30bjj/hUcWg+RVXjdfIcbqR5dGS7rP4M3Ii0z6rtXKfwmbTk50D3UvFHHzOVPXcvyV4TOnk0T1wy7H0FTxOo+S4v/AHIfxCkuVGS74v0NzotM+vbdg8I6eVDdHPi77qp/KBqcD/arEqsPHPdz91OI1+ZLevUfxLDc7e5+hudFptm0jLN/P2tWYXXiFn7FdG0xQmj8rRa1D6/9HBx/iUcRxHUJ/iOE6/xNvotQt2nbXz4chV4Y63Sw+8q/ynbT/o1V+S/5k4lieoyf4jhP3EbdRai/lO2n/Rqr8l/zIdp208cJWquPUJUcf8SjiWJ6jH8Rwn7iNuotQfym7ddwZSay89Qlh95QdtKU535i3K1F6swQM/OVPEsR1CP4jhP3EbiRaYO0RNRuErZNXi/vAj/hT17bsmf9m09qBzy3y77qniNfnVvFepH8Sw3NJvwfobnRaZGo+p05/s9h95zyMZ5H0kIKrrNUM7lIpNPB9+igkfOU4nNcqUV/uQ4/B8mEn/tZuZCcDitNi1tXamD6KuenU5p6JWFvEf4QqO0OuKqY9Nr9qcfPtmwRuD6U4vTXKqrwu/kONVpcijLxsvmbam6vIyLS6Ym4MBo5mJEAWLVbWWzKLveia/Klw9xBd3x3mblYvKbNNuB29UJ2pVN3T36YIB8yyuj6P2dQyDLUGVLx7uK3vh+dM3Cx2ycu5JfEZ+NnsjGPe2/hb4mL29fdz6+X9LWPpfAgsnJphc6o1I96ENg9s4A54AdhPYu8uzz3Pm0tK6hCuS7pl183hwd6Knm5gQHf+2w5zjrPzLpPf9IqGn1Wpuo1luFNuCgObFLYLcMjQQfCa5o5jGfIvUvQnVmQ1u0qt+8KfhrKhLtMaF71GHCIzyOBC9hkvi8qWdRjZ8/SfP8ALbxcK+ZXldc1tm4zwMbDa1jQGtaMAAYACieakeaiQu6jzRE8lBym7moOUshkTyUDyU3KDjgK6KlsqjlVFZGNkScNVtym/kFB3JWRBByIUViLnkts7b0hR7joz8h9Nq8eCWnmPC/6FbaWD163o2i+1VqPZ9Uh+h4VanX1alxMYZFhvJeAD1gOI8bSs4XyzKVNwxU+3WczFxzaz7QiIuYaYREQBERAEREAREQBERAFrbX6WnfUJ6YyESIyYpc1CnS2G4jea0+EDjnwOfItkqxPyMGpyUeUmGB8COww3tPSCMFZqU9HUjPoL05Zk1I+W3a1AuKhSFTlniJAmoLYrXDtC5FaZ0nqsTT255/TyrRC1jHumKTMP4CLCcSdzxjq8a3MrV6WinZbHrXcWqwzJWWzmIvY2KxzHtD2OGC1wyCFq2t6CyXppEqds1abtediO3niUOYLj+4eC2oirTrTpO8GTRr1KEs+lKzNReoPU6D4MO9pKIwcnRJEbx8fFPULqe84fesi1vW2R4/Stuos3Gp9WPur0Ov/ABzKP7z3mpfWyv6OPy2oT4R/9mSaPpKtnRe5o5/0jUSqu/s4bWrbyJxqotlty9DFLLGPltrPeah9Y6tf+oNa/wAKqNJ71p4JkNQpl5HJk5LNeD41t1E43V57bl6FY5Wx0XdVXvNMvgav0N3CFRq/Cb0sf3p7vIcfSrZ1duWiO3a9YdRgtHtoske+tHzfWt1IQDzGVPGIS5dNPuuvgdajwnyjS2zv3mpJLaCs+YeIczMzNMinmyelnQ8eXiFllLvigVpoMlWJKYzyDI7c+bKyCfoNMqsMsnadKzbTzEaC1/0hYXV9ArHq7nPNGbJxD7uUiOh/MDhL4aW1OO5+h3qHDOovzqafcZe17XjLXBw6wVVaz/k9imOL6FdlZpTh7Vvfu+MHkKhHtLVWh/7BcdNrsMcmTsDvTj5Qmgpy5FReN16o71DhdgamqonHzNnotUOvbUmg/wDitkMnmDm+nzAcT5OKuwNoKkSx3K1R6xRIg59/lHOaPKPsTilX9Kv3NM7lHLWT6/Iqrx1G0kWHUrWCz6yQIFdlWuPuYzu9n/FhZRK1OTnmB0tNQZhp5GFEDh8xWtKnOHKi0daFanU1wkn3M+lERYzMEREAREQBERAMKhYDzAVUQEDBYebB5lEykA84TD42hXUU3IsiwZCWPOXhH+4FT0vlf6NB/hj7F9CJdkWXQfP6Xyv9Gg/wx9iel8r/AEeF/DH2L6ES7GaugsiSlxygwx4mBSEvDbyY0eIK4iXZNkUENo5NCrhEUEhERAEREAREzhAcTdtQlqVbFVmpvdMvDloheHciN08PLyXaDuY1GnaVsuU+LNsdDhztQmpmXa7ohl+BjsOCV0wfQqptK6m07S+1HOdJGK2LWqlC4sl4LT4Qzyz9fBetFmWlT7DtKk29SoIgU+my0OVgsA9y1oGT2nGSvc5Gw0qNJ1J/qPmnCHGQr1lShrzficwqOVVEnJXo0eSIuUXclJyg5WIZFyg7oUnKLlYqQcccFE8lI8CouVkY2UxwKtnkrreStOVkQQPJEPJFYqzrx3QzZwmNUrCl73tmGW3raeZqXMMeFMQBxfDPX1jxHrXU3TS+pfUC1papQh3uZb+SmoB5woo4OBXrY5oe0tcA5pGCDyK8rdrTRuNsna0NvKhSr2ab3VGxOwYYzDkponJ4e5BJJHlC8plLCcZp50eUv6sZcVQ00LrajkEVuXmIc3AhxoL2xIURocx7TkOB5EK4vCnnAiIoAREQBERAEREAREQBERAYVqfpxBv6lwnQYvoKsyTu+yU6zg6G/ngnqOAuAsHVuJ6OFtXjDFIuOD4AfE8GFNDoc13LJW1Fjl66f0S/6eJWryjYpZxhR2+DEhnra7mPEtynVi46KrrXM+dfTsNiFROOZU2fAyMHIyOSLTLbY1I04wyg1GFdVHZ7SUqB3Y7G9Qd0r6oWv5peIdyWnWKPGHBz2QTFheMOCl4WUtdJqS7Nu7aToG9cHf8AroNuIsSsnVK39QI8xBo8zEixoDQ+IyJCcwgE46Vlq1ZwlTebNWZglGUHaSsERFQqEREAREQBERAEREAVuLAhR2lsSGyI082vaCD5CriKQYpWdK7Rr+8Zy35F7zzfDhCG7ztwsTm9mu1HPMSnxKhSYvQ6VmnDC2ui2IYmtDVGbM8K9WnyZNGoTo9ddIb/AKlv6dwPaw6jCEYefmvndJav0Y8HUatwx05MJxW5kWTjUny4p96XysdajlzKFHk1WaXOo1+0rhUrAjRgObpKYDvtUhrbPwv9psSvQfFC3vqW5lTA6k01J7aS8GzrQ4WZRirNp+CNN+v9IwziNbNwwesmRcQFIbQ9tN/PSlWl/wC0kXLceFQsaebQfIo0lD9t+99Dajwwxq2xTNQs2ibMd7abmYX9pKvH1L6oOvdkxuVYDP34Tx9S2ZFpsnH/ADspAi/vwmu+kL4o9pUKZz32i06Jn9aUhn6lOdhn+l716GaPDLE89NeZhkHWiy42MV+VB6nZH1L74Op9pzHtLgkPLGA+lcrG0ztKYz3y2qU4np9CMH1L4I+jFkTGd+25EZ/Uh7v0J/8AlfW8jZjw0n+qki9Cvm3Y/tK5T3f/ANLPtX1w7hpUb83U5J/7sww/WsfjbP8AYcb/AMghM/ciPH1r44uzfYcQcKXEZ+5MPH1pm4XrS3L1M64aR56PmZqyflog8GZgu8UQFXWxWO9q4HxFa7dsx2VvZZCnoR62TTgonZtoDPzFWrUv/Zzrk0eH5qj936maPDOhz0nv+hsjITK1uNnuFB/2e8bigf8A9bj9akdEaxC/MaiV5vUIjt/6So0VHmqeTNmPDHBvbBo2NlMrW3rR3nBP5HUacI6o0s1yg7TnUmB+YvqWif20mE0FN7Kq8/Q2I8LsnvanuNmItXmz9WoHtLnpEx+9LEfUomk6xQPazlBmAOtpap4suapHe/Qzx4U5Nf6nuNpItRVKqas0GRjzs9LUH0LAYXxIjopaAAuR0jltdNdqRMVSz7PkpqmwIhgmbjRO9w3uHMNLiM+RZ6eTq1b8tp9zNqHCLATV4ye42YmcKMrstbUFXc1jqdb9KDvdxY4O75srLqF3OXVe53t9WWqMvSpV35yXosFxfjp8LwQtyGRcRLlNIxz4RYSK9lNmsrmv+gWhAdEqdTgQCB+aDt6IfE0cVxVjWZqdtVVEU6yaVMW5aT3bkzcU+wwwWdPe+s46B513S0w7nDpDp7NwZ+oU6Yu+pwzvmPWonfWOd1mH7U+XK7PSUjLU2VhS0nLwpWWhNDIcGCwMYxo5AAcAF3MLkejRalN5z8jzWNy/XxCcKSzV57zVezts3Wts3WcKNb8ExpuOREnalGAMaZiY5k9A6gtsKrlEnAXfR5Vu5E81BTCieasCJ5qDuakVF3NSQyLlbJyVM81B/BWKkSVQoisjEymcNVo8VcfyUFdAtnkiORSDNcgDiR5V1u2+tQbMs/Z0r8rdcrDrHpqBJSNNY8d8izLgSwt6RukZz2LzLfrLrRqjSoM7WdVK3Clppu8ZeTjOhADq8EgLDa3pk6rQXx41aqM7VG+HCmJuOX4f18V7LCcAMv4zDrEwpJRauryV2rXVkr7e2xo1cuYGjU0bnrTtseoyKzrk1D0gt+Q9OqG+q22IYIbBdvR5Vh4gHxDoW47J1Tty/wCEDS6gwzGMulYp3Irf7p5+Ra80u1zw+FbV6YkKvD/Jw5uJwhTA5Ak9B+lZLeWgtuXVFNQkA6h1fO/DnpDwfC6yBwPkXwfH4d0MROhjqbp1E3fV8Uys3TqO81a+xrYzZiLRLK5qdpU/FWlBeVEZzmJfPf2t6z0nyjyrN7N1xtS83NgwZ9sjPHgZSd/Jvz1DPArmTwtSKz4+1HpWv/4a8qEks6Otdhn6IDkZHEItI1wiIgCIiAIiIAiIgCIiAKhAIIIyD0KqIC3CloMFznQ4TIbne2LWgE+NXERSAiIoAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAXF3HctNtOlRqjVJqHKysMZLnni49QHSexYtfmr1Ls6Zh0yWhxKzcEciHApkkN+I554NBxyyfKtv7P2wZceqdYk711wc6FIMIjSFpw3YDekGN1D9nmeldnBZNqYpqUtUf62G/QwsqvtS1I1povoHdu2pcECpVJkxbWkspG3i54LYtS3ehg6Rnp5DtK9RLMsyjafWzT7foEhBptJkYQhQJeC0BrQPpJ5k9K5Kl0mTodNl6fT5aFJyUswQ4MCC0NYxoGAAByC+he4o0YUIKFNWSO5GMYRzYrUUcou5KRUCVsFiJVFVyirGN9BRyg7mpHiVR3JCCKiqk4CirAionmpHmoHirLWVZE81F3NSPBQcc8lJBEqJOFVUcrmIiRkKB5K6OStOUoETyRUKKxW54q6d/7l0n+xCyNY5p3/uXSf7ELI1+6Mif3Xhf9OH/AFR8ixn9pq/5n8TiLhtanXNKmDPQA/HtYg4PYesFcZbt6XjpDEbCil9y20zh3s/noLew/wDY8SypUIBGCMhea4T8Cck8Kab41DNqc01t8en49DRtYPKdbB+xyodD+XQbJsTVW3tQpcOpk60TIHhykU7sVvk6fIrN4aOWpexfEn6YyHNu/nct+Tig9eRz8q0hXtO5KoxxOyD30mpsO82ZljunPaFylA1ou3TzdlbpknV6lg4bUJf860ftdfl86/H/AAl+zPLfBuUq+HTqUl+qPN3ravHV2s9jhcbQxOuhLNl1Xqfg9jOcdpzqPp0d61LibW6czi2n1EZIHVz+ghfdI7RQo0wySvO3p23prk6NuF8Fx6werzrYNm6j2/fkqI1IqEKM8e3gOO7EZ42niucqNKk6xLugT0rCm4LubIzA4fOvlM693m4mnr6dj9PI6Eqt3atHXuZx9u3pQ7slxGpNUlp5p9zDeN4eNvNc0tUXFs4WzUopmqO6ZtufBy2NIRCG57Wn6sLhWW/q7Ybw6n1WVu2SZ/N5sYeR4+B+dY9BRqflVLdktXnsK6OnPkS3m8UWlpfaONHmBLXZbFRoUYcHRAwvh+Q4WfW3qnat2NHpbW5WLEP6J79x48hwsVTC1qavKOrp2reikqFSCu1qMrRUa4PALSHA9IOVVapgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCLgbpvmhWXKGYrFSgSbehjnZe7xNHErGrSmtTtoSbfT9LbSmYciXbsS4KkzvcCGOtueH0+JbuHwdbEv+XHV08xsUsPUq8lajKLqvOjWXIOm6xPQpOEPatcfCeeoDmVj1jWxqttTTfoXT+kRbbtbe3I9y1FpYHDp731+TPjC7R6H9zVty259lx6pVOJqDcZw5svHyJOAefBvN58fDsXcqm0yUo0lBk5GWhScpBaGQ4MFgaxgHQAF6vC5JpUbSq+0/I7FHBwp65a2aB2btiaxdnqXhVFkA3DeD25ma9PgOiFx597HuB8/WV2FUjyUV3lq1G+yJOVRVKi7krFSii7mpKBKskVbKEKDlIlRcpKFFFxVScKPNSCjlE8lJygeSsCigpqDirFSLulW3cMqageJUlWRUTzUjzQqxjIudgYVtyk45KieSsgRJwEVHckUlGeKunf+5dJ/sQsjWOad/7l0n+xCyNfujIn914X/Th/1R8jxn9pq/5n8QiIu0aYUXsbEaWuaHNPAghSRGr6mDD6xpvJzUyJ2lxolGqLTkR5U7uT2j7FytE1jvTT0NgXHJeqOmNOBPQOEZg7evyjyrm1RzQ4EEAg9BXyzhH9nGQ+EKlN09FUf6o6t62brPtO7hssYiglCp7ceh7fB7TZFlas2zfkJvpbUYYmceFKxjuRW+Q8/IsxXV2vac0qsP7/AAWup06DlszKndcD29au0e+9QNNRuxXNuujs9xFP5Zg7Dz+lflrhH9k+WsjZ1XDR01Nc8dvitvy7T0tDG4XFaoSzZdEvk9nwOy03Iy9QhGFMwIcxDPAtitDh86wO4dA7KuEOc6ktkZg8piScYTwfJw+ZW7I16ta892AZr0qqPJ0pO+Ac9h5FbFY9sRgcxwc08i05BXxqSxGEnmu8XuN+9Wi+dGkToVdVskutW+52Cwe1gT3hDxZHD5lcZdOr1oQ9ypW7J3PAYOMxJu3YhHiH3VuxFk45KX5sVLvWverGTjDly0maXk9pqmS0UQa9QqrRIoOHGJB3mj61mlD1ksy4d0SlflO+O/Rxnd7d5nYWWTlOlagwsmZaFMNPRFYHfSsQrWilk14O9FW/Kh593BBhuHlaQmdhZ7YuPc7/AB9RnUJbU15mYy87LzbQ6BHhxmnkYbw76FeWlpvZkp8vEdEodx1ejH3MNkbfYPPx+dWvW31Tt8/6nviHPQxyhz0POeziCmgoy5FVeKa9RoqcuTPebuRaV9V2sVAbidtSn1xjecWTiYcfID9Sts2ialTXBtcsarSJ6XQ27w+cBOJVXyLS7mhxab5Nn4o3ci1JJbTtmRyBNunqc7pExKuwPNlZPTdZ7Jqu76HuSR3j7mJE3D/iwsUsLXhyoPcY3Qqx2xZmiLjJS56RPAGXqcpGB6WRmn6197JiFFGWRGPH7LgVruLW1GJprai4iIqkBERAEREAREQBERAEREAREQBERAEREARFajTUGWaTFjMhAdL3AKQXUWN1DUi1qXE73N1+nwH/AKro7cr5fXcsz+s1N/jhZVRqPWovcZFTm+ZmXLjqlclKo7S6eqMrKAc++xWt+tYTZ9Ir+1ZrK3TuyrlgUajS8mZ2fqsA77nMBaCG45nLhwyF3FsLuW+kNtsEa5fTS96hzdHqk25jM9jGEDz5Xbw2SJ1YKdSVr83OdGlgHNKU3Y6b1/X+1qXEEtTo0W4Kg7gyVpkMxST4xwWV2XoZtBbQDYUSn0SHpvbkXj6YVTIjxGnpDeLvMB416M2Ds6aa6YPD7Zsyk0qMMfloUs0v+MclbF5Dgu7QyXh6OtrOfadCnhKVPXa77TqBox3NTTuwZhtXvGPM6h3ESHmPVT/o8J37EMc/72fIu2dLpMlRJGFJ0+UgyUpCG6yDAYGMaOwBfWqLrpJKyNsoVRVcok4UkAlRPJFRxU2KkVRyqonmpBQnCiqlUVzGyJ4KLipE5KgeaEEXc1RSPJQJwrIFCcqLlVUcpBE8lE8AquUSrFCKieGVI8lFWRWWwgou5qR5qI4lSUKHkoOPFXHcArR5qyBEojkUlWeKunf+5dJ/sQsjWOad/wC5dJ/sQsjX7oyJ/deF/wBOH/VHyLGf2mr/AJn8QiIu0aYREQBERAEIyiIDga7ZNIuFp9FSjO+9EWH4LwfGFxdOpt6WNED7auKJMQG/zOfO8wjq45+pZki8XlrgdkTLybxuHWc/1LU962+NzqYbKeKwqzYSvHoetf13Fim7SlVo0RsK67XjQAODpmRO809uDw+dbDtvXCy7p3WytagwIx/QTf5J/mP1LAXw2xGlrmhzT0EZXA1Ww6HWQfRFPhB5/SQxuu84XwrK32H0ZtzyZibdkl816I7lPLdGeqtTt2xfyfqdk5eagzbA+DFZFaeljgQrq6nQ9OJujv75Q7iqNMcDkNbELm/SuZkry1UtsBrKhJV6A33M00B58vD6V8jyj9lPCbAXcaOkX+F38lr8jpwxeDq8iql36vp5nZhF1+ltpC4qWQK3ZkUNHOJKvJH0H6VkFN2pLOmcNnmVClxOkR5feaPK0n6F86xeQsp4GWbiKEovtTN5UpTV4Wkuxp/A3CqOaHjDgHDqIysOpesVl1jAlrjkS4+5fF3D5nYWSylakJ5odLzsvHB5GHEBXGlTnDlRaKOE47UWpy2qTUARM0yUj5578Fp+pY9UdGrKqgPoi3JIk9LIe4fmWZghw4HPiRI1akOTJrxCnOOxmp53ZksiYcXS8rNSDj0y808Y85XGu2ZJSBn0Bddbkx0ARQ4D6FupFsLG4hfrfjr+JlWJqr9RpMaEXTJZ9A6i1NmOQiNz/wASq3TrVan/AOy37CmMchMQs/UVutFbjtV8qz8F6FuMz57PwRpRtI1vkz4Faok6P/cYAf8A4K4JzXCB7aSoMxjqe0Z+hbnRRxvppx3Eafpitxpj1Ra0wvbWzRo2f1Y/L/Enqo1o/qnSP4/+dbnROMx/ajufqNMuojTHqo1o/qnSP4/+dPVRrR/VOkfx/wDOtzonGY/tR8/UaZdRGmPVRrR/VOkfx/8AOnqo1o/qnSP4/wDnW50TjMf2o+fqNMuojTHqo1o/qnSP4/8AnT1Ua0f1TpH8f/OtzonGY/tR8/UaZdRGmPVRrR/VOkfx/wDOnqo1o/qnSP4/+dbnROMx/aj5+o0y6iNMeqjWj+qdI/j/AOdPVRrR/VOkfx/863OicZj+1Hz9Rpl1EaY9U2tD+AtWjsJ90Y/L/GovfrhUhuhlCpYPut4OI+Zy3SqEhoyTgdZTjSWynHd9Rp1zQRpM6XamVs/62v4yrTzZIwyB9AVyDszSc29r6zdFZqp5lhi7jT9JWwrl1Mti0YbnVSsysu4fog/eefE0cVqG4doir3S+JI2RR4rWO8H0ynW7ob2gch5V18BhsqZTqqjgqbbfVj6Iy6Wqo5zajHp1JbzF9ctPLOtCDRKJQJMGuTM210TeiuiP71gg72TwySPMuRZp3boaM0iWzjj4Ks2zZbqdOxarVZp9UrUfi+ZinO72NysqX7Y+z/gO8iZPk8sQjUq1GnaSUs1Lmu769eu3YeOyplWVacYYebtG+u7V2/l0GRbF2p9pbOW1DMz1yP8ASSg1SmOkIM2IZ7zCiOexwLz0N8E5PQvYuk1iRr9OgT9Om4M9JR2h8KPAeHse08iCF4i1ajSdblHy07AZHhOGMOHEeI9CyDRbaC1H2T6iH0Gai3PZbnZmKDOPJ72OuGeJae0eZeC4ZcA8Zg69XKOAjn0pNtxirOHgtqXZs6D0uSct0a0I4es7TWq72Px6T2lRad2etqmxNo+gMnLbqLYVThtHoukTRDZmXd0gt6R1OHBbgyvip64oqEqqiUQCi5SUTzVirKKJOVVxUUIB5KCkVFSQUPNRcqniolWMZRRKkThRJQEScqJCqeaoVYEVE8VU8lRWQInmouUioHmiKEXBUVXdCiSropJkXKI5qSiTgKSpFxyVBykouKuCDuaIilFDxW07/wBy6T/YhZGsc07/ANy6T/YhZGv3PkT+68L/AKcP+qPkeM/tNX/M/iERF2jTCIiAIiIAiIgCIiAIiIAiIgBAPMZXzTFMlJoERpaFFB/XYCvpRUnThUVppNdpZScdaZjc7p3b09kxKZBa49MPwT8y4qJpHSWHelJmdkz0d6jngs5RedxPBnIuM/PwkH/tSe9G/Tyji6XIqveYTBseuU071Ou+qS5HIOiFw+lchBndTaYAJa72zTR0TUIH6ismReWxP2a8F8TysKl3N+puRy3jVtkn3pehwsLUbVmR9sKRPgfs7pP0L6Wa4ajSgxMWrJzB64UT7CuRRear/Y5waq64Z8e5r/8Ak2I5dr/qpxfg/U+aHtH3NA4TVjxj1mHEd9hV8bUMzD4RrJqDestif5VLGVTdHUuLU+xHI0uRXmtz9DKsu9NFb2XGbVMoPz1qVWH14wfqV9m1XQg3MWg1iH14htP1r4yxp6AqGDDPNjT5FoT+w3J75OLl7v8A7F1lynz0f+T9Dk4e1Zajsd8p9Xg9eZcHH+JfTD2p7HdjfNThde9J8v8AEuBMrBPOEw+NoUHU+Vdzl4R8cMfYtSf2F4d8nGv3f/YssuUOei/e+hlMPaesF+Mz05D/AH5N/wBWV9MPaT0+i/8AnTmHqfKxR/wrCnUiReMOk5c+OE37Fafb1Lf7anSp8cFv2LUl9hS/Tjf+P1LfxrDc9J716GxIW0DYMXlcMBvDPhsePqX0jXOxCAfVLJcetx+xasfaVFie2pcqf/1BWTY9AJyaTLfEWnL7C8R+nGR3P0L/AMZwnPCW9G2Xa52I1pJuWSOOpxP1L54m0BYMIcbigO/dY8/UtXCyKC05FKls/uK8y0qKzlS5X+EEj9heI/VjI7n6D+M4TqS3oz6NtKafQf8Azl8Q9UOViH/hXwzG1NY8MHvTqlMnqhymPpIWKst+mQvaU+Vb4oLfsX0Mp0rD9pLQW/uwwPqW/T+wqH/kxv8Ax+qKPLeHWyk/eXoffM7VdKcP9AtyrTZ6N5oZnzZXHRto+5p3hTbJitzydMRD9gV9sJjeTGjxBTAwu5h/sQyVD8/ESl3K3zZill2K5FFeLb9Dho+puqtYBEGWplGYeTnYc4fSuGnbeu65HZrt4TkVh4mDLHcb4uCzJF7bAfZXwYwLUnRc3/ifpY055cxcuRaPcvW5idK0xodNiCK+A6dj8++TLi8rKIMCHLsDITGw2Dk1owFcRfS8FkzBZNho8HRjBdiSOPWxFbEO9Wbl3sIiLpGuEIzzREBjsWgVCg16BcloVSPblxyzhEhTUq8sDnD9YBd5dlruj0tcE/K2Xq7Dh29cZxCl6z7WVmzy8I8mOPXyPYuni4uv23I3JJmXnYIeObXjg5h6wV8i4U/Z9hMs52KwNqVf/jLvXM+1eKZ6rJmXauEtSr+1DzX9dB7iwJiFNQIcaDEbFhRGhzHsOWuB5EFSJyvIjZ32yr12XJuVodzvmLt05MQNa9x35mRaT7knmB+qeHVhep2m+p1tat2rKXFatVg1WlzLQ5sSE7wmHpa9vNrh0gr8t5Qydisl4iWFxkHCa5n8V0rtR9JoV6eJpqrSldMycuVFU81RaBmKOUVUnKoeSkgoTlQKkoE5VirYUTzUjwUEKFHc1RDzVDwUoFCoOKkokYKsCLuSiVMq25NpBRRJyqnkoqxUo49Cg5SPEqjuSuUkRJwoHiqnmqYyFZFSKgpO6VE8lJBEnKKh4IpSKnivp3/uXSf7ELI1jmnf+5dJ/sQsjX7nyJ/deF/04f8AVHyPGf2mr/mfxCIi7RphERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREBCNAhzEJ0OKxsSG4Yc1wyCFa0x1GvHZcu03PY8w+YpMQj0xoMVxMGMzPEgdBHQRxC+hUIyMFeYy/wdwPCLDOhi4+0uTJbYvs7OlbGdLA4+tgKmfSernXMz1h2etoO2No2wpe5Ldj7rxiHOSEQ4jSsXHFrh1dR5FbPJXiVprqhcWy3qOy9bXa6Yo0wQysUjJ3I0PPFwHQRxIPQvYTSfVOg6zWJTLrtybbNU2ehhwAPhQn+6Y4dDgeBC/GmWsjYrIWMlg8Uta2PmkuZr+tWw+tYTF0sbRVak9XwfQZeqFVUScrho3ChUSpFRUmJkTxVFU81FxwgBPFQPNSUSOKsCiieaqThRVkCJOSqEKTlFykqyB5KKk5RI4KSCJUTzVScKKsY3tKEKLuAwpE4UHnJUogieSieSkeAUHFWIInkiHkisVPFfTv/AHLpP9iFkaxzTv8A3LpP9iFka/c2RP7rwv8Apw/6o+R4z+01f8z+IREXaNMIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAjEhtiscx4DmuGCD0hbB2I9bYmzjra21anNPh2LdcUNh77vycrNHg13Zng0nqx1LAFj170A12iRGwSWTkAiPLxBza9vEL59w24PRy9kyWZH+dTvKHzj4rzsd7I2PeCxKzn7EtT9fA9zN4OAIIIPEEIuvWw3rw3XbQqlzc3FzcFJ/1bU4Tj4QiMAAf4nDB867CHkvxnsPrDdihKiThVUTzQoUKieakRlQPJWRKKqBOVUlUUkESqE4VTzUSeCAoTlQKkTwUVYoRdzUSVJxUDzVkCLlRVcokqTEUzkqLuZUsZUCclSgRJUXKp5qjuhXRDIHkiORSVPFjTv/cuk/2IWRrftF7lttCUOly8jBr2m74UBu41z5+fyR2/6Ivt9jL2ifhzTT5fP/hV+msmfaJkHC4GhQqTlnRhFP2XtSSZ4bE8H8dVrTnFKzbe3tOuqLsV7GXtE/Dmmny+f/Cp7GXtE/Dmmny+f/CrpfiXwe68vdZr/dzH9Vbzrqi7Fexl7RPw5pp8vn/wqexl7RPw5pp8vn/wqfiXwe68vdY+7mP6q3nXVF2K9jL2ifhzTT5fP/hU9jL2ifhzTT5fP/hU/Evg915e6x93Mf1VvOuqLsV7GXtE/Dmmny+f/Cp7GXtE/Dmmny+f/Cp+JfB7ry91j7uY/qreddUXYr2MvaJ+HNNPl8/+FT2MvaJ+HNNPl8/+FT8S+D3Xl7rH3cx/VW866ouxXsZe0T8OaafL5/8ACp7GXtE/Dmmny+f/AAqfiXwe68vdY+7mP6q3nXVF2K9jL2ifhzTT5fP/AIVPYy9on4c00+Xz/wCFT8S+D3Xl7rH3cx/VW866ouxXsZe0T8OaafL5/wDCp7GXtE/Dmmny+f8AwqfiXwe68vdY+7mP6q3nXVF2K9jL2ifhzTT5fP8A4VPYy9on4c00+Xz/AOFT8S+D3Xl7rH3cx/VW866ouxXsZe0T8OaafL5/8KnsZe0T8OaafL5/8Kn4l8HuvL3WPu5j+qt511RdivYy9on4c00+Xz/4VPYy9on4c00+Xz/4VPxL4PdeXusfdzH9Vbzrqi7Fexl7RPw5pp8vn/wqexl7RPw5pp8vn/wqfiXwe68vdY+7mP6q3nXVF2K9jL2ifhzTT5fP/hU9jL2ifhzTT5fP/hU/Evg915e6x93Mf1VvOuqLsV7GXtE/Dmmny+f/AAqexl7RPw5pp8vn/wAKn4l8HuvL3WPu5j+qt511RdivYy9on4c00+Xz/wCFT2MvaJ+HNNPl8/8AhU/Evg915e6x93Mf1VvOuqLsV7GXtE/Dmmny+f8Awqexl7RPw5pp8vn/AMKn4l8HuvL3WPu5j+qt511RdivYy9on4c00+Xz/AOFT2MvaJ+HNNPl8/wDhU/Evg915e6x93Mf1VvOuqLsV7GXtE/Dmmny+f/Cp7GXtE/Dmmny+f/Cp+JfB7ry91j7uY/qreddUXYr2MvaJ+HNNPl8/+FT2MvaJ+HNNPl8/+FT8S+D3Xl7rH3cx/VW866ouxXsZe0T8OaafL5/8KnsZe0T8OaafL5/8Kn4l8HuvL3WPu5j+qt511RdivYy9on4c00+Xz/4VPYy9on4c00+Xz/4VPxL4PdeXusfdzH9Vbzrqi7Fexl7RPw5pp8vn/wAKnsZe0T8OaafL5/8ACp+JfB7ry91j7uY/qreddUXYr2MvaJ+HNNPl8/8AhU9jL2ifhzTT5fP/AIVPxL4PdeXusfdzH9Vbzrqi7Fexl7RPw5pp8vn/AMKnsZe0T8OaafL5/wDCp+JfB7ry91j7uY/qreddUXYr2MvaJ+HNNPl8/wDhU9jL2ifhzTT5fP8A4VPxL4PdeXusfdzH9Vbzrqh4rsV7GXtE/Dmmny+f/Cp7GXtE/Dmmny+f/Cp+JfB7ry91j7uY/qreat2LNVGaC7TLKbOxTBtm8miVcScMhTOfyZP9448Tl64uXmZXO5WbQdcMm99w6cy8eUjtmIMaDUJ8OY5pyMf6IvSywbKuin2XRpW5pinRa9AlYcOciSMaI+C+IBgua5zGkg8+IC/M/CGtk+vlOtXya3opvOV1aze1W79nYfQsFTrww0IYhe2tXoXlE81zfqVm/fIPxj9ij6k5v3yB8Y/YvO3RuZkug4QlUXNm0pw/pIHxj9iepKc98gfGP2K2cic19BwJRc56kJz32B8Z32Khs+dP6WB8Z32JnLpIzZdBwROVA81z/qOnffYHxnfYqGzZ0/pYHxnfYpzo9IzZdBwBUVkBsyeP6WX+M77FQ2XPe+y/xnfYpzo9JXMl0GPFQWReome99l/jO+6qGyJ4/pZf4zvuq2fHpKOEnzGOOKgeayT1DT/v0v8AGd91UNiz5/TS3xnfdTPj0ldHLoMbPAKKyQ2JUPfpb4zvuqnqDqHv0t8Z33VbPj0k6OfQY0eageJWT+oKoe/S3x3fdUfUBUffpb47vuqVUj0kOnPoMYJRZL631R9+lvju+6inSQ6Sujn0GwkRFzjqBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAEREAREQBERAf//Z","1715544983"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Al48/RbfBehPCcdjyUJnVowa9bM9bIDuF4YNVcJnEC96"},"signature":"q0fcYGCiBw/5IzRQzYdvI7KqjXQ+NQZN1pWgeyWqidJRJyvPmWZwM9XgcbcdH9ARoVNEQPDgQGKXw5L5ZgvYaQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g18700zpxdch58ytw9msedyaskrywwxtsr8zh7hy","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Y+BinWbf1p7PrG/LyraYvrfqcLXwSBfnQWo42hFX1Hw1q0GV25WqisrybA+5HbmiRSlxiNkgVs4370rmpWFIpw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g18700zpxdch58ytw9msedyaskrywwxtsr8zh7hy","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"8000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Al48/RbfBehPCcdjyUJnVowa9bM9bIDuF4YNVcJnEC96"},"signature":"s44x75bt2QVYVS731f8ZVtBTcJYO8VT7/kdQwRd3OvhbA9iwrEkMEvzxaZmbRebT/nF5NcmmBjlMa3j5NnPANg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g18700zpxdch58ytw9msedyaskrywwxtsr8zh7hy","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"A36I9pg5KgBiWRP8jQSrsSie2i5Yh66FudHQwpzzlNYmYBta+CxePWhdZI2vc166Kj6PpWhgJ2sEBTaS0hEdEw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g18700zpxdch58ytw9msedyaskrywwxtsr8zh7hy","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"TboOqj8adJNLcbae/9/DnE5RQLqMgX0yrz4mIGU46TVqqHcx9dv/CcV6RJct/r/yJTo6NOLB1FMMlP+EiqV9WQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g18700zpxdch58ytw9msedyaskrywwxtsr8zh7hy","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"8000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Al48/RbfBehPCcdjyUJnVowa9bM9bIDuF4YNVcJnEC96"},"signature":"4iR6Pr73Gkw8sIkYJI2sDVCkH9in8af44pChIIMqegx9kEMMO81Z+kGdCeZtPOHI61vAeFV7j5IV2yDujBANQw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g18700zpxdch58ytw9msedyaskrywwxtsr8zh7hy","send":"","pkg_path":"gno.land/r/leon/v5/memeland","func":"PostMeme","args":["data:image/jpeg;base64,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","1715546461"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Al48/RbfBehPCcdjyUJnVowa9bM9bIDuF4YNVcJnEC96"},"signature":"nJ8+6T+RNHLufgU7qHqyiQes9OcpxfvHFjsbww12P4l4HgpTthd23ccL9Mhjwf9/9ImNS4jmG9mBA7KH+qi7vA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g18700zpxdch58ytw9msedyaskrywwxtsr8zh7hy","send":"","pkg_path":"gno.land/r/leon/v5/memeland","func":"PostMeme","args":["data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/4gHYSUNDX1BST0ZJTEUAAQEAAAHIAAAAAAQwAABtbnRyUkdCIFhZWiAH4AABAAEAAAAAAABhY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlkZXNjAAAA8AAAACRyWFlaAAABFAAAABRnWFlaAAABKAAAABRiWFlaAAABPAAAABR3dHB0AAABUAAAABRyVFJDAAABZAAAAChnVFJDAAABZAAAAChiVFJDAAABZAAAAChjcHJ0AAABjAAAADxtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAAgAAAAcAHMAUgBHAEJYWVogAAAAAAAAb6IAADj1AAADkFhZWiAAAAAAAABimQAAt4UAABjaWFlaIAAAAAAAACSgAAAPhAAAts9YWVogAAAAAAAA9tYAAQAAAADTLXBhcmEAAAAAAAQAAAACZmYAAPKnAAANWQAAE9AAAApbAAAAAAAAAABtbHVjAAAAAAAAAAEAAAAMZW5VUwAAACAAAAAcAEcAbwBvAGcAbABlACAASQBuAGMALgAgADIAMAAxADb/2wBDAAMCAgMCAgMDAwMEAwMEBQgFBQQEBQoHBwYIDAoMDAsKCwsNDhIQDQ4RDgsLEBYQERMUFRUVDA8XGBYUGBIUFRT/2wBDAQMEBAUEBQkFBQkUDQsNFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBT/wAARCAJYAlgDASIAAhEBAxEB/8QAHQABAQABBQEBAAAAAAAAAAAAAAcIAQIDBQYECf/EAGkQAAEDAwIDAgYKDAoHBAQMBwECAwQABQYHEQgSIRMxFBgiQVFhFTI4cXaBkZa01BYjNFJTVFZzkqGx0jU2QmJydHeys8EJFyQzV3WCN6LR8CUmY4MZKENEhIWTo6TCw8QnRUZkhrXh/8QAGgEBAAIDAQAAAAAAAAAAAAAAAAMFAQIEBv/EADARAQACAgEEAgAEBQQDAQAAAAABAgMRBBITITFBUQUyUnEUIiMzYUKBobEVkcHw/9oADAMBAAIRAxEAPwD9OczzG06fYrd8kv0rwGyWmI7NmyihS+yZbSVLVypBUrYA9ACT5hUwTxfadLSFBGYkEbgjBL4f/wBnW/jMAPCfq7uN/wD1WuPf/V11X4X3Gx+bT+ygj3jead/g8y+Yl8+p08bzTv8AB5l8xL59Tq0UoIv43mnf4PMvmJfPqdPG807/AAeZfMS+fU6tFKCL+N5p3+DzL5iXz6nTxvNO/wAHmXzEvn1OrRSgi/jead/g8y+Yl8+p08bzTv8AB5l8xL59Tq0UoIv43mnf4PMvmJfPqdPG807/AAeZfMS+fU6tFTrV/Ls0we2Q7riuILzdhp5ZuNsiSkMTQx2SylUcOEIWrtAgFJO5BPLudhQec8bzTv8AB5l8xL59Tp43mnf4PMvmJfPqdVTGr43kONWy7tsSozU6M3KSxMYUy+2FpCglxtQCkKG+xSRuCCD3V9sObHuMcPxnkSGSSA42oKSSDsRuPQQQfWDQR7xvNO/weZfMS+fU6eN5p3+DzL5iXz6nVopQRfxvNO/weZfMS+fU6eN5p3+DzL5iXz6nVopQRfxvNO/weZfMS+fU6eN5p3+DzL5iXz6nVorz+d3041iV6uiZ0K3KhwnX0yrkrlisqSgkLeO42bB6q6g7A7EUE3PF3p4Nt2syTuN+uCXz6nTxvNO/weZfMS+fU614QIclnQHF585yUq5Xtt2/TG5TJZDT815clxDbZUrkaSp0hA39rsT1Jqz0EX8bzTv8HmXzEvn1Onjead/g8y+Yl8+p1aKUEX8bzTv8HmXzEvn1Onjead/g8y+Yl8+p1aKUEX8bzTv8HmXzEvn1Onjead/g8y+Yl8+p1aKUEX8bzTv8HmXzEvn1Onjead/g8y+Yl8+p1aKUEX8bzTv8HmXzEvn1Onjead/g8y+Yl8+p1aKUEX8bzTv8HmXzEvn1Onjead/g8y+Yl8+p1aKUEX8bzTv8HmXzEvn1Onjead/g8y+Yl8+p1aKUEX8bzTv8HmXzEvn1Onjead/g8y+Yl8+p1aKUEX8bzTv8HmXzEvn1Onjead/g8y+Yl8+p1aKUEX8bzTv8HmXzEvn1Onjead/g8y+Yl8+p1aKUEX8bzTv8HmXzEvn1Onjead/g8y+Yl8+p1aKUEX8bzTv8HmXzEvn1Onjead/g8y+Yl8+p1aKUEX8bzTv8HmXzEvn1Onjead/g8y+Yl8+p1aKUEX8bzTv8HmXzEvn1Onjead/g8y+Yl8+p1aKUEX8bzTv8HmXzEvn1Onjead/g8y+Yl8+p1aKUEX8bzTv8HmXzEvn1Onjead/g8y+Yl8+p1aKUEX8bzTv8HmXzEvn1Onjead/g8y+Yl8+p1aKUEX8bzTv8HmXzEvn1Onjead/g8y+Yl8+p1aKUEX8bzTv8HmXzEvn1Onjead/g8y+Yl8+p1aKUEX8bzTv8HmXzEvn1Onjead/g8y+Yl8+p1aKUEX8bzTv8HmXzEvn1Onjead/g8y+Yl8+p1aKUEX8bzTv8HmXzEvn1Onjead/g8y+Yl8+p1aKUEWVxfadIG5RmIHpOCXwf/s60RxfadrTuG8x+Yl8+p163X2I3O0M1DjvIDrLuPXBC0K7lAxnNxX3aPOrf0kwl1xZcWuyQlKWe9RLCDuaDw3jead/g8y+Yl8+p08bzTv8AB5l8xL59Tqzk7Ak9wr4rheodqgSJsx4RosZtTr7rnRLSEjdSlH0ADegkvjead/g8y+Yl8+p08bzTv8HmXzEvn1OuNPF9gZT4SuDmLVmUOZu9Lw66eBODbckOCP7UDrzEBJHcTsdvU4bxCaa6honKxrN7JefAGPCZgizUExmt9ud0b7oH9Lag8eONHS5V1VbA/lRuKWRIVEGE3rtg0VFIcKPBNwkqSoBW226SPNW+4cZmmNpgSZs13K4cKM0p5+TJwi9tttNpG6lrUqGAlIAJJPQCvqsjzcni8ydTZCwnBbQT5+XefcdvlANffxZj/wCK3rB8D7v9DdoKfBmt3CM3IaPM04kLQrzKBG4NK+PFwBjdq2H/AM1a/uClBLuMv3KGrvwWuP0ddV6F9xsfm0/sqQ8ZfuUNXfgtcfo669znGoFo0vwf7Ir6+Y1rjqjMuvBO4QXnW2UE+hIU4ncnoBuT3UHqydq29qkq5d+vo2qMZfr69dsFzK7aWsWvMZ2Lvux5xlyHWIRU2yXHEtSEtqS6tvdHMhPT2ySpKu76OHq4aj5TjFsyfNr9YbnAvFsiTLfEsdodhltLiO07R5Tj7u6yFpTyp8kcpO55ugWBSwnvO1bq8VrC3l6tPruvAhGVlqG0qgolkBpZC0laST0CijnCSegURvsN66HH9d7ecls2HZemHh2f3SAq4s2F+ch4Kb7VxCUtu+SHV7NlRSgEgb94G5Cp0rRJ3SCfOK1oNFb8p279ulY0ZJnuuWn+dwsSitYvn70xMu8wworgXGXbWZMdDzG2wjofQmY2ELKwlYbJUlJO9ZBZBldmxRERy83aDaG5cluHHXOkIZDz6zshpBURzLUd9kjqfRUpzdzsuLbSpwEcj2L5Exvv3ntrWsf3DQd9ZtVr5asUyTJdRsSXp9ZbLEVPcfduLVwWWUJWt1Skxwrl5EpB2HNvv03260ZiTHmx0PtOJdZcAUlaTuFA9xFdFqTf7RiuAZHesgbbdsNutsmXPbeSFoXHQ0pTiVJIO4KQRtWI3D5hGe2m12TT3HctuePXBnD7Ld8jul4eeursBUlTyUQrfHdd7CMpKWHvLU2sDyAUqAAAZtLZbfZU0tCXGlgpUhQ3BHnG3or4cdxq0YfZo9osNqhWW1RgQxBt0dDDDQJJIShACU7kk9B3k19sZCm47aVkqUkbFSu8+s9B1rloFKVxSpbEGM7IkvNx47SStx11QShCR1JJPQAemg6jNr3PxvFbldLXZ5F/nRGi63bIi0Jdkkd6EFZCebbfYEjfuqX6e6qZ9qlnER6DhkjFdOoq1h65ZMhca53I+DjZDcJTaVsBLyjutZIUGjyjZQNVmxZFZ8utjNwst0hXm3vblqXb5KH2l7EpPKtBIOxBB699eG1i1xxfRe1uOXS6Q/Zx+O65bLHzqXMuLwSeVtplsKcVzK2TulB2KqD12cZzYtOcXuORZHcmrTZre12smW6CUtJ32BISCe8+YVBrTj0vilzyFl1+s1yh6WWqMtu0WS7uvR/ZyV2zS0T5EElI7FvsldkiQkqUV85QnZO/u3NNRrXZ8EvWfsS40mEwxPmYsw+RbVzOVDie3bUnmc7JY3SlR5d+8K2FVlppLKdkgge/QaobS2kBI2A8wrdSlApSlApSlApSlApSlApSlApSlApSlApSlApSlApSlApSlApSlApSlApSlApSlApSlApSlApSlApSlApSlApSlApSlB4nW5DjujOeIZSVuqsM9KEjqSTHWAKaHvtSdFsBeYWHWF2CAptaTuFJMdvY/JXf5fMYt+LXeVKUlMZiI866V7coSlBJ3382wrw3C406xw06StvAhxOJWlKgRsQRDa6UFPI3BFdT9jsZN8cuye3MtcZEVSTJc7HkStS0kNc3ZhW6j5fLzEbAnYAV29KDZ2SOXbl6eivmnWaBdIUmHMhR5cOSlSH477YW26lQ2UlaT0UCOhB76+ytANt6CKaeKDvFTq8kISlMSx45GbCRtyo/9IL2+Vw9PerteLP3LesHwPu/0N2urwdKYHFrqtHJJVOxzHpydx3AOXFkj/uA/HXacWfuW9YPgfd/obtBRMY/i3av6o1/cFKYx/Fu1f1Rr+4KUEt4y/coau/Ba4/R11U5NqiX2wKt8+MzMgyY/YvxpDYcbdQpOykKSoEKSQSCCOoNSzjL9yhq78Frj9HXVehnaFH/ADaf2UGKOPOYlh2VcR+D26RZbNNKGlWvH2Fsx3CwnH4o3aYTsShPIsbpGw2V669pgGsln0o0K0NcyBKoVhvNitsNd9eUlESA6YTamQ+onyA4QUJV7UK5QSOYb+Oym6MYVrprfJRh9yyifcrRZnmmrNGZdlIQ7Gmx1untHEfax4IhJ2JO+3Q7kjp4TkfN9CuF7AZDIlwLxbLberq2+gLZdg2yEzIWhaTuFJVIVDQQehClb0GWTOU26RCamNS464rqw22+Hk8i1FXKlIO+25UQAPT07+lddfpblsvNkQ1jky8Jlvrbenxuw7O3jk/3jgcWlZCtuX7Wlau4EAVjBotp5iVl4bNK9UbviNzye9QYEa/M2ywh9xtl6Y8t5TzNuaUGVKZ8MdUkpbK0oRsj2qAL/pprtaNT8jvdjjWTIbDcbXHYmqZyG2rgrkRnluobebbWecJKmHU7LSlXk77bEEhR29ghO3dsKLVypJ9FcD1wZjsuPOrS0y2guLccUEpSkDckk9AAOp9FTFrVSFqRn9wwjHoMy7Wlq3hV3yaFLDMaEX2A4w2y4k8zry23EObo2CErQoq3KU0EZu2r1z1Z4Z4mqGW4LAtZt1/ttzsNu9klSQ4ETGWkSXFJSkoJU45sj0Ac3eRXt9dM0sOm2uuk+S5LdGLPamYF7iOzpSuVpvtBDI5ldyRukEk9AAT3AmuLigxO3adcHuTWSxRPBrTY7fFEOMlSldk2w+yUjmJKiRyb7k7k9Tudyeky3KbNkfEfpLbIGYRMukW/JL2m4RWpEdxy1u+xUhAiOJaAKeX7Z5K/L3CtyQPJDsuIbUTHtZMQtWmmI5Dbb9KzW5xLVN9ipqHuyti0GTLWVIJACojTgHp7VHpG/faBLTfM71gzRKCpM7IhYYY38kxrcymP5J848JMv9dRPVm4q0y1WzPLNPrJjMG1abWVtEm1qt5aTOu1zVzutsJYKQZTiGregLUFf7/bY77VlPofp0NKNKMWxYvCTIt8FCZcnfcyJKt3H3SfOVurcWT6VUEdzjiizy0ZBe2cf08hTYdtRJkxrZd7hIhXm8RIriG5cmHGMcoUhKlnkSt1KnAkKCdlJ3yFxTK7bm2LWzIbNKbnWq5RkS4shs+S42tIUk+rofiqf8RGm9xzPEmr1jSxHzrF3Td8fkAHypCEEKjL2UndqQgqZWN+5zm70pqOcK+r9vj5q5p/bLZcVY5ksJzN8ZlJaPg0CI8U+GQXCfarZmKeHKN+UOpT02SCGWjMtp551lLqFPNAFbaVbqQDvtuPNvsfkpMhtT47keQ2h5hxJQ404kKStJ6EEHvBG429deC0B1Emas6W2rL5jDMYXVyS7GQwFBPgwkOJjqIJJ5lNJbUr1qO2w2A91KuLEGO4/JcSww2lS1uuKCUJSBuSVHoNgKDq8QweyYFb34Nht7VshvSXpi2GAQjtXVlbitt+m6iTt3DuGwAAlWa2+Ff8AiJssjFchZtuf2KC2m822ZGcLU+xPuKKkhRRylxLqOZC0K8hW4V5KyK7LM8/yLMrJY5ejNwxjIhKvKrfcbpJX4bDhMpYeUtZ7F5BUoOoZb2CiftnUdOnZaUaOuYbeLpleQXt3Lc5vIDc28vtdk2ywkkoiRGQSGI6SSQndSlElS1LUdwFKjABvod+vn7xXLSlApSlApSlApSlApSlApSlApSlApSlApSlApSlApSlApSlApSlApSlApSlApSlApSlApSlApSlApSlApSlApSlApSlApSlBKuKy7u2Lhn1TmsHZ9vGrgGz6FGOtI/Wa99iNlZxvFLNaY4IjwYbMVsE7nlQgJH6hUz4xztwq6rnb/wDpud/gqquw9/BGNxseRPT4qDmpW1S+U9x+IVoHO/ptt5zQb6UpQRKK4pvjTuTaTsh7T+KpY++KLjICT8XOr5a7biz9y3rB8D7v9Ddrp3QVca0UpHkp0/d5z6zcW+X9i/113HFn7lvWD4H3f6G7QUTGP4t2r+qNf3BSmMfxbtX9Ua/uClBLeMv3KGrvwWuP0dderz7V3EdJMetk/Lrp7GRJryYUfaO7IW88W1L5EttJUo+Q2s77bbJ96vKcZfXhR1cHdvi1x6nuH+zrr5tP9H8smagwcy1Hv9tyCXZoD0CwxrVBVFYYQ8U9tJdSpayX1oQhHkkJQkLA35zsE9wTVWyaocUufPWKLc1WqTgkNtqdcIDkRuUqPLlFZZS4lK1JSqVyFSkjykKA3GxqG4hqUixaPu5QpufMGLaO2jGrauHFcdSzc58RyQ4FKSD2YKWrcCtWwBW2N/KG+VuXsJY4s8YShACrlgl6jlSR13al28p3A7/96qsYNAcOuFk4XdKsJvyVRsgznOYLlxtUvdL7cOCecAoV5XKqPZ2x1GxC/RQZ26ZYizgWneL4yyUrZs1qi25CkjoQ00lvp+jUU4zdIcYuukGoefyYDqcuseJT12+6RJj8dyOpll15no2tIVyOFSklQJBJ276yPbSUgg+mpDxiOhrhS1eKjsDilzRv78Vwf50E/s2H23F+J7AnoBmKOU4rerpOjv3CQ5GVKS5bAXksKcLaFKDzgUUoG++/mq+4Rp7junNoTasYsdvx+1hxb4h22OlhoOLJKlcqQBuSf2eipHkSE2/il0USSOQ4pkERJ8/MFWtYG3rShR+Kr82d0CgifGs2pzhX1KDY3ULQtXxBSSf1A1Ksys2aYlr7olds1yTGpMd+5Xa4So1lsS4Xg3Z2iXzbvrkOF5CQ7tupCSdgfJ35arvGQCeFvVQgbhGOzHP0Wydv1Vj3x9L1AazfT+PERZ3LVfbhLxW0+CodVcG13K3uRXHXd/tfIhawvoOgQk79SAHz6VjI9RL5gVtv9hTbfszyRzVCbN8P7d2ZBjttrhpca5B2AaW5bGQklXMI6j0O4quO8TWYYZbIsLKNKcqlXm2yQ1kFxtEIqtTMVLnIqbGdJJfSUlLgZQC4Bz8wTy9e20MtMS861aj3yM0hq3YsxAwG1oCeoaisiU+vf+c5MS2QOn+zDfr3X3sUEbbdKCV4jrLN1HTchjuFZIzGbhuvW+75HHTbYM1wbdmgBSjJQlZO/OqONkpJ2O6QfC8O+XWrC42a43kFxtljkDOZ8K1W6RMQnd2QxHnORo5VsXOV2U9sEju26DoKyLUylCCUjqB0691YqYXrjp5pxnWslnyrJIdmusnNHnWPC0rDbSVW2AhC3HeXkZClIUkFakg8pA89B0HDnjGsGQ8N+nlsxnILLa8OvWOQgLstTqLtZElrZ7wdCUluQVjqha1oLalk7LCUiq4nhLsslEKDeswzPKsbjSGpIxvILx4ZAdW2rmb7XmR2rqUqCVBC3FJJSncEDaux4OA2OFLSPstuQ4rbT09JjI3/AF71Y6D4rTZbfYrfHg26DGt8KOgNtRorKWm20/epSkAAeoV9m21a0oFKUoFKV0+W3mVj+PS7hCtcu9SmUgogQS2HniSBskuKSkd+5JI6A0HcVsU4EqAO+56dBRrctp5jzH01ENUrtNh8Uuh8JiZJZhTIl/VKjNuqDT3Zx2CgrSDsopKlEb92/roLlStEqCxuDuPTXGqS0nl5lhPNvtv09dBy0rYHkb7cwB9B6GteccnNv5O2+9BurY44lseUdq3AhQ3HWvP6gcgwu/FTi2drfIPaoJBRs2o7gju7v2UHfIcS57U7j01vqecP89yZoRptJlvLflyMctq3XXCVLccMVsqKj5yTvXp7bfpEvIrrbnbZLjRYgaLFwd7PsZZUCVJb5VFXkeSCVJAJPk78qtg7ylbEvIUNwrcd29apUFpBB3BoN1bVLCNt/PRTiUe2O1cTziFApJ67beeg3tvJcJA33HprkqQcLVwXO0jRIdkOyUrv1+7J15alqLQvEwNjmVudgkJA9W1VsPtq5dlA7jcbeig5KVsS6lRAB6kb7HpWq1pbG6jsKDdSlTjiFz24acaMZZkFlWhF5iRCiCpxsOJRIWoNNqUk+2CVrSSPQKCj0rxGmdoy3G7fcIeWZMcrAmlVvuciMzHlLjKaQeR9DKENc6Xe1AKEjdPJvud69n4Q2VFPOOYDcj0UHJStqHEub8p327+ndW6gVs7UdpybEmvPuZxao+dRsTemEXuXAeuTEXsVbKjtOttOL59uXcKebHLvv1322BNTZF4lp4zJVvVMkexqcBakiIHFFkOm4OJLnJ3c3LsN9t9h6qC2Urpcpvcqx2C4XGDbZN7fjsLcagQSgPSFgHZCOcpTue4FRArsmZG6FFZ22O2/ePRv0oPopStCdu+g1rTfr3UCgrurWgUpXgcH1isuc6j59hUFEwXfC3YbVycfaCWVGSz2rfZKBJUAkEK3AIPpGxIe+pSlApSlApSlApSlApSlBGeMBtUrQC+wUL5DcZtrtx37il+4xmVD40uEfHX35jo5kWd5TLnSNUcmsNh5WxBs+NFmF2JCAHFOvKQtbxUoEgeSlIO2xPWuj4jpP2U5Bpjp7HV2km9ZLHu0xoJPkW+3OJluOFXckdsiI11PUv7VcUe0H+VBjfqFw93m14vMciZpqZqCvdtCcbeydiA1N5lhKkuyEMtuIbAO6uVe5SFbBR2SfK4FoPemL69ZrlieV6e21banmJ+EamTZVraV50Fl4tLQ4T3BLKkHfcqHWsulNpX7Yb936qcifRQSXTrHskk4FjvgGR5TaHW7j4TMZzRqNMuLkZLikrjLU2eUBe3MlxKlKAUnrt5IrY7hv31oltKCdhtvW6giLAKuNWaQCUo0/Y5j6Cq4vbf3Vfrrt+LP3LesHwPu/wBDdrrcSc9lOLjUeQgnsrZi1it69x/8ot+4PkD3krR8tdlxZ+5b1g+B93+hu0FExj+Ldq/qjX9wUpjH8W7V/VGv7gpQS3jL9yhq78Frj9HXVdiEiCxt+DT+ypFxl+5Q1d+C1x+jrqvQvuNj82n9lBGs7dSxxV6SqWAlUrHsijkHzeXbF9D/ANG1dZnOJ2a58Ymlkxi2xBebfYrzcpc9EdPhBbT4NGYQtzbcp/2qRyp323CjtXY568y/xa6Sxy4kPMY9kUjkPeQV21A/vK+StmPNidxl5w+pfN7H4RZGGxv7TtZtyWvb3+yb39PKPRQXGofxuupRwn6ntq33k2Z2Inb750htP61irhUN42kg8MuYkgEf7GCD6DMYoOo1UxkWzig0PyU3O4LEiVcbOLet4GK3vbZLpWhHLuFq7EAnmO4QnoNuuRCRsBWMOROLVqPohDeyG75LJt2dXOE9PvNtEN4qFnuJKUhLDSHEJ6BLiElKvMpXmyeHcKCQcX6A5wtauJPmxW5K296M4R+yva5Y5ZBYm8musBi4IsbTl2jvFhLrjBSysKcZKhulfZrWkEEEhRG+xNed4moJufDrqlFSgOKexa5oCDtsreI7sOvSvE2+LLRw6ZjPezidmEafjj8iO1MRFAt4MNZLTamGkFQBO27nMryR1333DvuEe1yIuhGOXae2lu7ZKHsmnke2L051crY+tKXkI9QQkdwqy1P+H4EaF6d/B23bbDuHgzfSqBQaK9qfNWP+kd2sliu2uT1/uEG3W9eeqYLtxfQy0pS7XbeVG6yBuSoDbz1kAobpNYt4wxAvefaqWG7aeO51ZZ+oCi++4zDfiW1QslqR2rzb7iVEELcG7aFnbmG3lAEPZ8ELnPwoaZI6jsLQiNsf/ZqU3v8A92rlUP4I2WWeFDS/sG0tJcsjDpQkbAKVupXT3yauFApSlApSlAqZ8TF/uOK6A57eLRLcgXODaH348lo7LbWlO4I9dUyppxJ4deNQdDcvx2wNJkXa4Q+xYZW4Gw55aSpPMroN0gjr060FIaQG0BI6gemsaOKGHkkzXjQdrE7hBs98kv3uG1crhEVKbjIXB53FBoKSFqCWjypUoDmCSegIOS7K+0bSrod/RUj1aw28X7WjRa+W+GZFusFzuLtxfDiU+DtvW59pCiCd1ArUlPTr19HcHW6aZjccJvGqtjybJJ+R2zEVR56LxdkMCUmO7EDzqXOwaaQeVSHFDZAOywOuwqX2lOe3HL9A8/v+Y3ERspvT7krEUoZRChtyLTPeiobUltLhU02kJc7RbgW4eYcnKkCovaV3TJW9e4MtHsaM0c9jbfMWUrHg3sRHjh7YHcAPKkeSdj5O/QGvEsWnV/Kc+0aaveC2/H8XxG5rXdZLF3bkqkvC2y47chhIAKYyVLA2WQ6S8ndtIQokOyTqfI0ns2v0S8TJVwkYs67kFrMhwuKciTmS7HYQVdektEllKe4BKAOm22/Nsiu+hehmk+DJySNZshuDlrxh7IZTre0VLUbtJklKnwpBX2UZ4IKwpJccb3BG4PFxBaMZJnOren13sDLasdlPM27L47rgQHIUWY1PiuFO4C+V2O60Bso7TF7AAqNew4gsAuGYx8TvtpssDJpuLXVVxVYbkUtt3FlcV+M80FLBSlzlfLiCobczaQSAokBz8OWoFxzCx5PbLreYuSy8Yvi7ML/D7PkubRjx5LLxDf2sOdnKQlYR5POhRASCEj0Ovs42zQ3UOYBuY+O3F79GM4f8q+PQbGbpjuEuIuuO2TD3JM96WzYLDHbbZgMqI5G1qbAS47sN1rSNiVEDmACj2GumPTsu0Xz6xWtgyrpdMeuEGIwFpQXXnYziEJ5lEAbqUBuSAN++gh+mViy3RGRovEuedXXJrPkTCbBPhXFuOmPEkJty5DC4oaaQpCQYrrWyivcOp3JUnmr2F21MuuJZ/rfNdD12t2LYnbLxDtKD0U4W7gt1KPQXOwQk+8n0V0WFYBqdkLul1pzy32eHa8FfbnybrEuC33rxJbhuRo+zRbHZbdsXHOZavLQAgqSSqvd43hl8tWtOqOSPRW1268wLOxbXFvDZxcdEoLSpI3UkBTqTuQd+bpvtQY6azXS74w7pKu76m3POJuRZPZZl8s1tVDRAjxBLZcRKjBDPaNR25XgjYK1rLiHSgrK1hac4o53aB22rBjSvRvPMguNtscjE28CsM24RL3l0b7HrXboqZcSW3JaYgLiOKcfCltBBW9zgtLWrnSschzpaO6N/XQY5a13TI7nxLYFh9r1BewS2XTHblIkeDpYVJmLafi7Iih8KbS8EqWedTayGw4AATzJ9Xotfrwzl+fYPdchey5OOLhOxL1LSyJRRJaUrsH+xQhsutqbJ3CUnkca3G+6ldPqvpvjuo/ElhtvyrHbfkdndw69lUe6RESWQ4idaik8qwQFeUrY9/ftVUwrTfF9L7Ku04jj9txu2uOl5US1xUR2luEAFakoABUQAOY9dgN+6ggml2oMnTnghtOT2+Oi43MsPex8fr2ciZJnLbjoJHXlU682Cd99ifPX16d4rlmDcTlthZDnt1zNu4YRJkuN3BpllpqW3Nih1bTbSEhLSu1HIhXMpA5gVq36cGI6UZaxwkY1hyLWiDlWM3GJNYg3KQhLUtcG6IlISXGucBLyWRyq7xzDcDYiu5wGNqRlPETGzLKMQYxLGmsWlWyDDVcGpUpt9UuOtRfLZKAVpa3SlBWkBHlKCllICUi86l4zier2o6tQJrsHCsqub0DGW46Fx3obExT0huU86lbiuZhfI2lotpZCEnZRJ2uus+eZTGz3D8Fxe9WfEZ9+jzJgvt7hmWhZjlkCJHZDrQW8vtivqvyUMubJUTuicXTEr3ddCuKWxRbXKeuFzud8TbYyGVc8sP21goLY/lbrWpI27yCO8V7jiBs13vVxt8Ofp7/rU09lwHmJ1hhoh+FszedssSkKkutJCAjtU7oWFpUUEA9SkLLjqrkLNBReHY792RHbEt6G0pplx7lHOptClKKUlW+wKiQOm576gPHPjV1u2h18nwcouWPxbcGnpESHHiuNTT4VHKC6XWlqHZlBUOzUjcq8okDaqTw+2jJbFpTY4OXLkqvzSXe0TNleFSGmS84Y7Tz25DjqGS0hawVbqSTzKGxPNxBYZcNRNEs2xq0oacutztT8eGh5fIhTxQezBV5vK26+ag6XJbpd9D9HcxyO85BPzqbbIUi4R1T47EdTiktDsowEdtCdlLSADtvu4dztsB5DFTnulGomCWzLMyk5jBzJuTEmiVFYYRAuzTCpSfBC0hJEdbbUlJQ6XFDsmyF9Vb1HWnCZWpOj2W4zCfbjXK6W16PEkPdG2pBSeyWvoTyhYSTsCdgdhvUrtWU5DrTqTpp4Thl/xVjEn5V3vhvUJTLTc4w3YbMZh3cokgiW+52jJUgJbTuoFW1BzWm86u5Nr3qHbbFkuP27C7BMtrCIt0szkyQ4XIbb76G1tvs9mPtgIUvtOqugSE7KyHqQ6VRrhD1q1mVJgSI8GZPtkqLJdbIafHse00vkXtsrlUzsdidt+u1V6gxik6a3O48abdwOdZKliDjap4hJMMNJQ7PT/ALIP9n5uwIjddyXN9tnE9d/k1FsOWXvjPttvxnI28Y8LwU+yFzERL8pMZu4bqRGC920uqUtIDjiVpSCryFEjaxMYhdGuISTlKW2jZJGMN2tS+0+2JkNy1uJHL6Cl5XX0p96unn4jdjxV2/KxDV7AN4XJtS5gUkgSFTWHUt8u/NuUJWQdtuh9W4eCu+d5La+FPWiWq+y5WQ4k1f4cS+uhpElzwdDi2HF9mlKO0SkoSSEgFSObYb17HWTOcmh53h2DYperPiM2/wAaZNF8vcMy0K8HLIENhgOtBbyw9z9V+S2y4QlRO6PNXnS7Kr3wsao4y1buyyrJnckfZhuvoBWZUySqOgr3KRzMqaG5PTuO23Tt+IC0Xi+XC3xLhp4dU9PZcB5mfYYrcQTGJ3O2WZKTKdaSEhHapJQsLSooIHeUhZsdVchZoKLw7HfuyI7YlvQ2lNMuPco51NoUpRSkq32BUSB03PfUn4n9bLvpLjNktuJW2Ne9Qcrubdmx63TFEMF9QKlvvbEHsWkJKl7elI3G+49Hw+2jJbFpTY4OXLkqvzSXe0TNleFSGmS84Y7Tz25DjqGS0hawVbqSTzKGxPhOKLR7K82v2nef4Au2u5rgM+VMh2+7urbiz477PZSGCpIPItQSjkWegO+5HfQcmJ5Nq9pNZ8zvesFyxW/4jY7K7d27pjkN6LM5mUrcfbWytSkKTyJ8lQUDuOoO/kxi1cVuveOwsJ1Oz3FsOtWj+WXWLEbtsJySq9WyLLVtFkPLP2tWwUhSgE7nfblQT5NOsEHWfiAwnOce1RxKwaZY3frFKs7ECLcDc7m0+8gtmSpxtQZLQSskIB5iR1IHfKrPpBr7qpHwXSzUvHsbsunuHTYMy45NbZ/bOZGiJsWWmWBspoKKGy4XEp7t07e0IVXPNYdW851jyTT7R6HikBGIx4zl/vuWiQ4gvyWu1YjR2mSCSEbLUtR28vbYEAriuiOtt10Ww3ii1g1LtUIZdbsijwLlbbQ4tMWVJjxI7DCGFqC1JQ646CCoEpDm5HQiqxmuner+kmtOZ5/pPaMdzSz5siEu64/dpqoL8WWw0GEvsuhJSptTYSVJPlEjcVPWODzUvUjRPXfEtRrhYIuQZ1fGr7b5VjdcXGbfQ2wtCFBaAoNhTKGuoKuULPXySQ34JxYawjXfCMGvk3T7M5V2W4nIrFhseWqVjaAgkOPSCtbOyFdFpUQrfoB1BrOZB5kg1hdpbgOv+EY/GwXFdN9N9JLTEeYMvJrbOcnCakKSl11iMUdot1SE7byVb7H22/UZnsJCGkgDYbUHJSlKBSlKBSlKBSlKCHabxUZJxN6uXqeO1l2Bu3Y7bt+6PGXFbmvcvrccfRzHzhhv0VcEjlG25PrNRPTFRsvE1rPaXuVCrmzZsgj797iFx1w17ekJVCG/oK/5wq20ClKUClKUEW0gYSdfNepJUS4btaWNiegQm0xlAD43FH467Liz9y3rB8D7v9DdrqtInVt8QmvMVSdkG42iWlXp57Wy3/8Ao/rrteLP3LesHwPu/wBDdoKJjH8W7V/VGv7gpTGP4t2r+qNf3BSglvGX7lDV34LXH6Ouq9C+42Pzaf2VIeMv3KGrvwWuP0ddV6F9xsfm0/soMf8AVLHpOTcVOIQbfeZmOT14TeeS7W5plciP/t9rO6Q824jdQC07lJ6KO2x2I67h8xqdjnEzrJEuOS3XLZES0Y9HNyvCI6X1bm4OhP2hppGyQ6P5O/XqTXyag6jysT402URMYvuYuRcBATBx5EZbsft7gStbgeeaGxEZsDYk9O4bk16bRGSqfxFa2zHIj8F19rH1qjSgntWSYKyUK5SRuN9jsSNwdie+gvtQ7jb3Tws6gOJ6FiG3IB9BbfbX/wDlq41E+NNKTwr6mFe/KizPOdPOU7KA+Mjb46DbrkkjVjh/c36jK5advfslxP8AlVtHdWL+Y4nntj1V0XnZbnFvyiG9mLqY8OHYfAPBlGzXQ7pX27hKeXoQrc9AQR1BygHdQeN1pZ8I0dztrfbtLDPTv78dYqS6SaWYpE4YIc6w41abLd8mwyMqfNgQ22XpS1wh1dWkAuK3cUdz1JUTVzzWN4bht+j7BXawJDeyhuDu2oVItAcbtef8JukUa8RETIYxeyyg26pQ2dbjsrQrcEdQpINB6zhonIunDxphMbUFJfxe2L3HpMVv/wA/FVLqN8HDgc4WdLCN9k4/Fb6/zUBO3xbVZKBWNuj2lOOXbXnWTMJMWUrI7dmCGI8lu4yW2g2bLbVcqmEuBpf+8X1UgnqPQNskT3VjDp1qijD+ITWSx3OAqFj8zKIzqchl3CJHityfYW3bx+Vx1Lq1kJQfJQU7KG576D2PBSVI4W9PI7iSh6HbzCdSfMtl1bSh+kg1bqinCB2jOjK4bvRcLI8gicp7wEXiYkA/EKtdApSlApSlApSlApSlApSlApSlApSlApSlApSlApSlApSlApWhISCT0A610reZ2d3LH8aTLBvjMJFxchlBChHWtbaHN9ttiptY79/J7u6g7ulKUClKUClKUClKUClKUClKUClKUClKUClKUClKUClKUClKUClKUEJy4ItHGNp7J5uQ3vEb5bleha2ZMB5sHr5kreI+OvEZXw/5d9ljAYk5Zk8uS83KfzRWfP2tduWXd1pYtrTSoykNoCdkKbIWDsrfqa9tqgVSuK7RCM2ObsbfkU131ISzEa3/AEn01c2wFIBI6nv3oIVbV634YxItFvsdlzmBFeX2N+yTKfBJ0xtStwFNx7aG0KTuU+8B1UepquEOZM9BkOZPFtUOUtbamWLTIcfQ2ksoK0qWtKeYh0ugKCQCgIOySSkei5E/ej5K1CQN9gBv6KDWlK2rOySaCLaZtg8T2tbwV3xLA0UDuBSxIVv7559veArtOLP3LesHwPu/0N2us0RQ3L1j17uO3245LBgb/wAxqzQFJH6Tqz8ddnxZ+5b1g+B93+hu0FExj+Ldq/qjX9wUpjH8W7V/VGv7gpQS3jL9yhq78Frj9HXVehfcbH5tP7KkPGX7lDV34LXH6Ouq9C+42Pzaf2UGPGUou9s4q8uvOM2KJkGRMYHaW2YM24GC28hVymlY7YNucqtkbjdOxI2JHU1yaA3G4XHiG1ocuttTZ7m5Ex56RBRIEhLLiorwUkOAAK25Nt9hXHmWnzGofFNkEJ693+wFjDLS+iTj1zdgvFQnXIcqlIPlp2O/KoEEgHbpXT6GQbVpFrnrh7N5hJkRUqsMdNzyq4tF5ajGeWEFwhAI+2BKQdz5PeaDKaofxscz3DFm8JvYyLi1HtrCSdgp1+S0y2P0lj4t6+8cVWnz+SMWiNd5EttdwTalXli1yV2pMxSihMczgjsA4V7IA5z5RCe8iuDiybTM0wtMZKwlb+XY00k7cwG96h9SPP03oPJ6n4zkdu1s0euc3N517scvM3zGsciBEbahk2e5lJQ622lxQSOZOzhVvvuTuKyTHdWMEzKcMvl10MteEy1u2yz5y9BVGfRIQ9GWix3RRQtMgBwEBaPbd4UKyfSQR0NBwXFvtrfJbA3K2lJ298GsYOHHIcd/1FcN8S5LyFq6nG43sebazP8AAStERLTiZSmB2O225SmQdgRunYjespVjdCh6qgPBs+IvCXgbri/JjW98ODzeQ+6CPeHL8goO64NW1N8LOl4V57DGWPeUncfqIqzVH+EL7XwuaUlRCQrGbeob+thJ/wA6oszNLFbcht1hmXq3xb3cg4uDbnZKESJSUDdZbbJ5lhI6kpB2HfQd0r2vSseNOMRx7NtVNfLXkdjtt+hjKYbyI1zhtyWwVWW3pUdlpI6gbVkKpYI2BG/orGvDLIu5awa4TVX+8WSPaMst1yeatJTtLQ3ZoRLToLa1KQrbqlvZR2A381B6jhTaEGw6h2xLLcZuBnl9abZaSEpQhcovpAA6AbPdwq31COEq+Q8ntWpV4tzxkQLhms+THdKFI521NR+U8qgFJ3HXYgEVd6BSlKBSlKBSlKBSlKBSlKBSlKBSlKBSlKBSlKBSlKBSlKDRXcaiD8YwOM6C72YSm5YDIAUPTGuLPTb/AOl/r9dXCohqs85YuJbRO6t83Z3Ju9Y67semzsZuYnf47fQW+lKUClKUClKUClKUClKUClKUClKUClKUClKUClKUClKUClKUClKUEPzBSzxgaYtxyOYYlkapCT+DMm1cp/T2Hy1bkAhI376iLKPDuNeQvm5hbMAQkpP8kybio7j3xE6+8KuFApSlArY6lSkEJPKfT6K31tWSB0G9BB+FRtSpGrkt6S9Nku5zMjOSZHLzuiNGixUqVygDcpYTvsAN9+g7q9HxZ+5b1g+B93+hu10XDc2Mey3WfF3VJMuHmb9zJB9s1OjMSm/k7RaP/dmu94s/ct6wfA+7/Q3aCiYx/Fu1f1Rr+4KUxj+Ldq/qjX9wUoJbxl+5Q1d+C1x+jrqtx3Oyt7Kj3BtO+/vVJOMv3J+r3wWuP0dddNr1qcqQzM0ktON36+X/ACPGJTplWZcZIgR1jwYv/bXm1LKFuoUUthSgCn0jcPATc9yjIeJ/N8k0tGO57ZrPjlot14tyZiQ+8rwmc52MR9LnZB0JUpR7UBO/Zo3T5Sk+3i8K2IZ9nuXZxn+Px73ccmZZZj2y5spcFqjeCNNLa2C1o7cqSsKeQfahCUnZJJoWj+ktm03x+2uxbHZLVfnbZDiXSRZoyW25CmWykAKCUlSApbhSVDfZXvbUSgnGV6J43eNK2cAjxDAxuM1EajQYiw2ENxnW3WWgspUUp3ZQkq6q232O+xGP2rOm2vNytOMZO5cxlctGUW+63jA7YYyYcWBEmJlsohPupaWqQkx0oWpxXK4XTsEhCdsyK432Q8jlPtT3+ugxH1e4gcPvVx0Yze03IXO029+55E9CZ6ykoRZpoDa2R5SXOZfJyqHtjt167e9wnVLXGbd7bEyDSK0QoClMuzrjDyRPKhl4IIDTS2gpbrPMsOpVyJPJ9rUvm2HmeIbRXTTT2ZguorEez6dScfylidMvtugKjqfYdKxIYfWwj2rpUAVOeTv05k83XIrG8ntGdY5Fu2P3SJdrTMRzx58B9LzLiQdt0rSSDsQQdj3gig8naOIPAcgyy7YzAyJiReLWl4ykJZdDI7EI7cNvFAbdU12jfOltSigqAUEnpUl4Vr4w7wP494M+hMhOOSnwgn7ZsS6oLKe/ytwru671dbng9ghJZurdnhNTLSiS/CeQylJjrdSrtijbokr3JUfOTuaxO4bNNsOtWiWAzY2kbMS8O4G1chnUeJDT20h6B9tQtxKxIKyHF9Vo5T1O5IFB6fQnhvb1I02wy951d7hNt8bHrKnFLdaLrJhNWlpu3xyXwGVN/wC1F4ukOEq5UBsJI6iqplHCvguUuXabMauib7PkNS036PdJDVwhutNKbZMd9KwppKErd2QPI3dXuDzq37vhsO/Dtpb8FbV9Eaqj0EWxzMsvwG7R8VyDHMgyiz22KtyZqIsQmmXlBBd38Fbd7ZQA2bJQ2SVj2pBKhLdI9UHs0zXWqVp3JR7MXvKI4tsi/wBiuCIgSxaIHapfSEtrZPtgkucnMT5IWAay1cfSFFHer0f+ffHy1iximvOn+kOvuttqzLK7Zjc+6ZBAlRWrg72ZcaNohI7TfuCOZChzK2G6T16Gg9Xwdv35y16pN5MzBjXtrOp/hLNsdW5GStTEZZ7NS0pUUkrJG4B67ebesgqxLw68ZpbNRNXLPg0/EDdUZo/Nk2zI1vJdlNuWu3LbDKmlboGxd5llC9jy9Oiqs2Aao5DcBfUZ1hD2BuWqMiYqUu4tTITzJC+dSZCQkAo7MlSVAEJUg9yugU6lSXDeKLAs3vUS2RZVxtkifFcnW1d8tUm3NXOMhPM49FW+hKXkJSQolJOyVBR6HeqVj9/t2VWSFd7ROj3O1zWg9GmRHQ6y82e5aFjopJ7wR0NB2FKUoFKUoFKUoFKUoFKUoFKUoFKUoFKUoFKUoFKUoFQ/i6QLRpxaMyb50zMNyG2XxpxHTlbElDErf1GLIkg+omrhXn8+wyFqHhV+xm5DeBeID9vfG2/kOtqQo++ArcesUHoKVKOGHMpeZaOWT2WcSrI7P2livKOfmUmdEWqO8VecFam+0AP8lxJ7iKq9ApSlApSlApSlApSlApSlApSlApSlApSlApSlApSlApSlApSlBEoSkReNG7I3+2TcBir29IZuMgf/AK/66ttQ68p8H41MPWnyRKwO8oWQPb9nPtpSD73aK2/pH0mrjQKVoo8qSe/YV8NmvtvyCO8/bpjE1lmQ9EccjuBaUvNOKbdbJHcpC0KSR3gpIPdQffSlKCJWLlx/jDyuG0ORrIsQt9zWkDop6LJfYWr3+zdYB9SU+iu24s/ct6wfA+7/AEN2uvuKENcY+Pq7lvYJcxuT7blnwOg97m/71dhxZ+5b1g+B93+hu0FExj+Ldq/qjX9wUpjH8W7V/VGv7gpQSvjOBPChq5t+S1x367f/ADddfZo3w3YhpQ+1e4rUy95Y7FUxIya+S3JdwkNrUFqSpxZ2Cd0p8lIA2SK+XjL9yhq78Frj9HXVDytd/bwK5qxRENzJhb1m2ouG/g6pPZnsg5sQeTm232O+29B0WomtGP6a3yy2a4s3SZcbqFutsWi3OzFsMIW2hch1LQJQ0lbraSrbvWPMCRrhmX5RecwyS0X7EXLDAgONrtl1ROTIaubCluI5ikAFpwdmFFvyhyutnm3JA8folpBldqvjmb6lX/7Ic4lR1R21RmERWbfEdRGWuH2aFKSvs3mFkOA+Vzk+fpa+xQCDy9Qd6DfWO+cadax5Nq7eb9jObpxm2wmYbFmjS+eTbZLS2pCJZfipWgl9Di2XELJ2IaSjuKjWRFbUtpQSUjYnvoMftJ9WZeO5PcdPdSsmduGXm8vRbLImWzwf2QihlLjSlOMtiN2quV9SUJUF8iU7pCgoDpIEO+8L2qMNLt1jXLTHOcnlqfbTalNLsc6ZymMntW1KSpt2Qey6oSOd4KKtyd7pkmntmyy9WC6XSEuVJsExU+3gvrDbb6m1t9oWwoJWoJcWBzg8pUSNjXmte8TueSYW09AzVGAN2aa1epV5ejofZSxH5nFpcStSQEdAoknYcvXcEigodyWldpmHvHYr/umobw6raHBNpyhxaGy7g0BoFagNyYSABufPua9DpPnl9y3htt+U5QyIV6k2h+Q+THUwHAkL5HuyV1b7RCUuch9rz7eauk4f9O8dzvhA0msWYY/br/bfsVtLi4N0jIkNhYiN+VyqBAUNzsR1G9B3fDvkkC28Lemt2myW4tvjYbbZL8lzohttEJtS1K9AASon1CpsdUtQNes5xmPhTeb6Y4ZItMqc/f51hhKTJdKo5icvb9qA2ptT55eVK9+XfapxpZj0viF0H0w0+suTvN4pZ1XW1ZJLxu8tNSozMdMiLb0OICuZSHB2bnZqQpCwlPOCk9c0sNxaPhuIWPH47r0mNaYLEFp6SQXVoabCApZAAKiE9SAOpNBglaNcrVgeoMWTYLtqJqJlDV+XDydy9TnoFvU05chbEvtRSlTLnK86G2W2Eo/3CyspKNlZsRNLcWas+TwEWOJ4Nkrr713bKSRMW8gIcKyST1QAnbzADat+P6Y43it9v1ztdnZiyL7MTcJ5SSUOSEoSntAgnlQo8iVEpA3V5R3USa9YlIQNgNhQYxalcMdqwmPp7eNLdObCbni2QtXWTDhdjCmTo4jPsqQmUtO6l87zayHF7LCCCdyK9Xg2tWM63XnLNNcsxwWLJYKOzuWIX12NJVKirabX2iA2taHWil5AV6CSk16HWTWw6UXOxQ2MRv8Alr9wC3nkWKL26okZD0dlx5Sd+ZZSqS2ezbCllIWrbZBI+R9MHiK0obueNz7tjPsml2M3dBCMO7RGRI7OU22HQFsOLDa0BfQpJSsdQmgqCmEKhpYjpQjlRyo8nyUjbbzfsHoqI8KdjyzTWwXrTjJ2mZUfE32I9tvUOG7GZuTTzCX1qSlxagSh1xxBKFbdNuVO1ecwIu6D8RFwxN2PlpwvKI0GHYrjebs9dYpujbc1+SjtJD7jzRWylGw25CWDvsSnm+biZ1x0wzjSHU/D2MubkZRDhvRY9ut0t6PKduKVhuOhhSCgu7SuybVyFSQrdDmw5k0GUqFhwbjurdWJ2nXElqDhFnNr1TwjsLnHkrs1tNldcenZHNbCd/BIi0AlkI3UuStxLe436JJIseBcQGL5dppFza6S2cQtT0x6ATfZkdpKX2n1sKQHUuKac3W2rlKFqCh1FBTqVxeEtc4TzjmVuQPSBtuf1itUSG3BuhYWPSnrQclK2B1ClbBQ3322rfQKUpQKVopQSNz3Vt7ZGwPMNj3H00G+lca3220KUpYSlI3JPTb018LuS2hhl91y6Q22mEpU6tT6QlsKOySo79Nz0G9B2VK4Y8xiW0lxh5DzaxulbagpKh6iO+uQLSrfY77dKDdStoWCe+hWkHvoN1K286dt961BBG9BrSlKBSlKCMYbjF4wPiAzUxYDruJ5hHavipaCAiJc2UtRXmlfnmUxlp6e2ae326E2ZJ3SPP0rheaZ5ClY2SfQT+3zV4fWPWOxaK4W5frt4RI3eREh26C2HJU2QvcNsMoJAKjsT1IACVKUQlJID329N6wyznjI1HtdmmXdjD8cwyzw0do7Lyi5uTHiCdgAxFTtvuQkJDqiokADciug0w409SMwkS7g2nGMohQ1lE2wx7TMstxa3SS2UKkvOJIV1IK0pBAPldCBzTyMURvq8Juzk+mdgO9a1jFhvHxpzNxRybmM84RkcNxxmbjUhK5c1KkHlKm0MoK3EE9AoIG58wG297wjOrJqHjsK/wCP3WLeLPOb548qG4HG1bEpUNx3KBBSQeqSCCAQRXRExPpDMa9vRUrYl1C9uVQO/Ubeet9ZClKUClKUClKUClKUClKUClKUClKUClKUClKUENzlxTXGBpRyq5Q5i2SJV/OAftR297cb/FVokXCPAZW5KfbYbbG63HVhKQPSSaiuoCEq4vtHduqxjeTb/wBHtLXv+uqBnmjWD6pzbVLy/GLdkq7YXFRG7mz27KCvl5iWlboX7VO3Mk7EAjag87kHFZo9jMhcafqRjZlpPKqHFuDcl8Hzjsmipf6q+W1cXOjNyU+hGolht62UFxxu6yRb1hPnPK/yE+vYeeqRj+H2LEYXglhs1vssYDZLNvjIYQOnmSkADuqTZJw+ZRkklSnNXMgVES+ZEeJNsdjlIjKJ3AQVQeYcvcDuTtt1PfQcp4y9Iy2t5vJZT8FB2cuTFknuQmx3c6pKWC0lH88q5fPvt1qq4/l1kyy2xrjY7tCvECSkrZlQJCH2nANtylaSQR1HnqSK0h1fhuFULXFyTufaXjE4LyU//Ydgd+g8+3qrz1q4Zc+tV0bmw9RcZsboMjeVjuAxYctIfLZf7NxbzqApwsM8ylIVv2aN99hQd3rJdI2C6+6R5nOUWbRIFxxSXKKVFDC5ojuxlLIHQKehoaBPTmfQPPXoOLBQXws6wEfkfd/obtQvih0EuODcOmeSIOquaz47tsWy9bL/ACItzZmvOlKGwC+wpbKlOqRsWlI2J8nYgEWzihaUxwm6strUVrRhl2SVKO5JEJ3rvQU3GP4t2r+qNf3BSmMfxbtX9Ua/uClBLeMv3KGrvwWuP0ddV6F9xsfm0/sqQcZqgOFDV3f8lrj9HXXbweJLSjkEVWpuHNzGPtL0dd/ihba09FJI7TcEEEGgp9aFQB6kD3zXmrVqTi99hpl23I7PcIqtyHo1wacRsDt3pUR+usZNTNbcw4msMvuIaNWDKsfneyfsXIzh9yPCiRUtSEJfLLqXy6VEdRs3uWyogb7UGX/aJ325hvtv31tecLSSrbcAEkVi3i2e5tgGomR3LUew5hKtio5YtjtiiuXK3tMMyOwbIjxg46uQ+OeSpxSQUNqQ2NiFCqfYuKTSjJXVsM55ZrfNaWUOW+8v+xs1tXoVGkht1PxpoO30k1xxnWpN7cxl6U63aZYivGXEXHLgUhLjbrYWAVNrSoKSrbZQ6joRXrMrxu2ZhjVzsd6gt3K03BhcaVEeG6XWlDZST74r4bPmmNXMc9uv1rmFZ3IjS2l7nYD+Sep2AHxVwXfVXDsduK4F4yqx2icgArizriyy6kEAglKlAjcEH4x6aDFnWnIdX9NIj8S5PP5hEzGHfLe3imO2Zb6LMyhhzwJ1t9toOq6dkh0u77lzdtPkbK9fb9Y4lq0QwLEdMMqxO9Zu5aLM1EizJKFqMAlhl6WmKXWVrCG+dYQVIPknzjlNcvfEBpdZGu3uOpGJwWwOin73GT8m6+vxVijkTPCq7rLZs6t+U4W+8iRKeu8adFFxYmKdAUl5pZCgy+h1DfKtP8jmRsPJ2DKPh/0Tg6Kaf2WxKEG4XuBBbgyL3Gt6YrkptBUW0nqpXKkHYArVt6dyaqNSiw8Vuj+SyEx7fqTjDklR8mO7c2mXVe8hZST8Ve7ezewsW5U9d5t6YSU8xkmW2GtvTzb7UHeVoVAd5AqYSeKDSKNMYhf6zMSenPuJaaiR7zHedWsnYJCELJJJO2wG5qOOcT+oOr1uyNOlunzz9uVc1WG2ZO/J7JyE8lLJdlS4UhtpaG0peWUBJWpSmuVaUBW9BlcstrA3WOvcQanGt2vWIcP2ELyjJZ6ExludhGjsrQXpj2xIab5lBO/QklRCUgEkgbmsTLXxCu4Fwl36xz9QZDusEOSqPNgX2SDc45emfb48RT5bRKdjsKdQlbZ7IuNDYhGyaqHDjk+gGCYpCwbHswt6js2tMDIEGGp17wZEd1TDMhKE/bOVSlpaBBU65381B2uW6f5lxA55iNxvEPJcBxC2w5E1huFcIbNxhXcKWyh5Smy+HEKjuuBHIvYcy+dKgpITSdNtHLDprhFjtF6kRb9coUyTNN4uMdtDr02U+4688gHfs1uLeV0QQPK2AA6V9KuITABmgxCLk0O55GltxbkG2hclTPZpK1JcU2lSW1coJCVEKO3QE1H9VtQNJtb27TGybFdQbvZYEozWJsPDryiOh5TDjKXd0xw5zIDpUlxA3QtKFAjlBoLZqrasnn466MKbtSckWUR4txurRdbgocWA89yDq4Uo3IRukKIAJ23qM6MaSLz3HIWO6uaWwrdOwi3JsERyPILtpntvRUJfeisBKEN7pJRzBJKAtSAsHnA9c7xWWJ1LMTEsPzvOZg3540DHJMRTTaRuVrdniO36gOcrUe4Hqa+tji60954zE9WR2Oe+pKPArvit0jLbWf5ClKj8m49IUR66Drcm4MtOMnuFrlSo14ZFtixbbDZiXJ1pLEBlC0mGCDzdi6HFdqkqKnDturyU7SpWkeu2ittsth05uOOW/HbhdnmpUWJaXJSbf4bNccXIYbPIGWojHIEpK1JWor5kjdIOWl+zWxYtKtsa8Xm3WuTc5CYkFiZLQyuW8SAG2kqIK1nmT5Kdz1HSvlzzLpuHWJidBxy5ZLJelMxREtgRzN9ooJDrhWocrSSQVqAUUp3PKQDQY7y8a140RxXOZdqza0ZLYbYJd7gyssiyrrd32kxkrMQpaWwhG7jbmxSVgdpslCQEpHrrrxo6f4hfrXjuUXJVryKRYWb3Lhtx1vCMV9mEx/J3Ut9SnEhLSEqWehIHMnfrcpk8RWY37DsmxGHjuI2FhDjt3xDKHt5j7mykdkqRHD7fIeULbcbKSnnBWhWxQPGaccBLeF6j5NnDmSsou0v2TlWBkwBIbsU2cry5CVLVu+pttLLadwgbIUf5eyQqGl3FbZ9Qr1k0a52iXhMC03KLZ48vI348czprydxGSgOKKX0nl3ZPljtEhSUq3SOdfGHpjJeXFsl8k5lOT3R8Rtcq8En73mjNrQlQ84Uobeqo87wgZc3cLXAh3tq1wIb7sWDd40tZn2WBzBT0mOrlTz3ScpSi9KP+7QpxKOYny/b6SZ1ri9qSu35rp0zbcMuFwfhw5CLmy45bIzLTimnVhsLLpeUEAqW4ghSgA2NipQelk6n6sZ8kR8K00XikdwA+zufvIbDPUblEGM4t107b7Ba2NiO891b4+imoV6bW9k2tuSNy1knsMStcC2xEJ8wSl9mS7v8Azi6d/QK+u88RUvH75NhSdKNQ3rZFfXHF6hWpmUw9ykjtENtvqfUgkdD2XUEHbbrW0cW2Ap2S8xl8Z/Yc0d3CL12iD6CBEPm69PNQcLXB/pzcUocymPec9lg7qfy29SrglZ2/ALc7FPvJbAr11p4ftMLDaLlarbp5i0C13NKET4UezR0MywhXMgOoCNnOVXUc2+x6jrXW4nxN6ZZpcVW23ZjbGbwF8nsRdFqt08nzbRpKW3eo678u1bMr4odLsKv0myXbM7c1d4pAkQmOd91gkAgLS2lRSSFA7HY7EUHXP8HmjypipUPCY1ieJ3KsekyLUN/TtFcbG9cTnCljMVva1ZTqFZVb7gxM2uawP+l15af1VxI4ztJnXChq+XSSod/guNXR4fEURiDX1J4tdPXujH2VyVehjCb2v9kM0HDF4d75AB8D1s1KYAJ5UvybZK237ur0FZPxmuNOiWpSSoI1+ykI38kOWSzqO3viIK+x3isw3baLaM6nvkgJYYwS9JWrf1riJSPjIr4k8VlvZcWZ2m2p1tip6CS7iEp5Kv8ApZC1j40ig3/6ndU4yF9hrxeXXCnyVTMdtjgB95DKCR6tx79cUfBNfLeoJZ1ZxK4tge2ueEO9p8ZauCEn4kivuc4ssBYRu8zl8c7b8r+DXtBB9B3h9K+dvjO0aUUh/OYdsUrpy3aNIgqB9YebQR8dBsVaeIm3OpcaynTe+NA+VFex6fAKh6A6mY9y+/yH3q3f6wNcrK2kXPSSw3wj27mNZbuojr7VuVGZG/qLlfb44Gh//FzCx/8AXkb9+h4v9ESklOrWGKPfsL5H/eoOJvX7JGgpEzQ/UNh5J2IZTa30fEpM7qK0/wBfGYSHD4HoTnrrI/lyJFoYJ/6VT9662FxcW7IojE/E9OtQszs0hIcj3a12LsI0hs7crjapTjJWk+YpB6da+pXEfkCk7s6EamOb93Mxa0b/AKU4bUG9/XjLEpU0/ofn8SSf92UG1vtqOx23Uid5Pm6nasFdL4d615lZffNW25V/vDU120Ii3dtTIgAIb8KYZYBCWUpeC2yUAKPZ9VK3rOQ8R2ToAU9oHqS2jbfdAtLivkTPJrGHUezaky9V5eXaf6LZmzaMgWmRerXeXrdFSiUEpQJUcJlr8paRsttSRuQFBQJVvy8ml74pjH7dGC9aZIm/p3l+toXi06FEgMyeWKtEaGrlQgqCd20gkEJ8oJ2Vt02B81ea0o0yTp7bJr0yYq65DdXEv3G4LbDe6kp5UNNpBPK2gb8o3PtlEk712mFZoMshEvxzBuTSi1LgrO64rqehbUf5XqUPJUNlJJSQT6avK2tkpFsM+PPle1it5jJHluUoLKt0p2I2I26VNb9pu81m0O74/bhZH3Antcgst4dt0+KtJ25ktpQpp5JAA5F7DoQQQRtSK6aPicKLlc7IWVymp85kMyEJkr7BzlCQlzsySkLCUhPMACUkg71jHlnHMzWdM5KReNaVvh04gbsvK/8AVxqPcYcjI1MF+xX5DYjJvjKNg6hTY8lMlrdJUlBAUlQUlIAVtk2FAjfcV+f+oWIx83xSTanW43bqWh+K5IjtOht9vcoUEuJUnfvTzbbgKUU7HrX36cyeHCdiUCXlWSpwLK3S+brGjZtc7eVS0PLbeK+V5oFalJK+UjcJWkjdOyj6Xicnv08+4UnIw9q3j0zx3HppuPTWHEXJuGQq8HZ1yvcRtPcXNT7w018Slywn9ddvIHD220XzxCXFpvbfdOsM0/rM0mrByMsNx6acw37x8tYem/8ADfuR4xd339I1auHy/ddffHg6NzVodsvE1fIy1J2SprUtEsb+pMlbo3+Kgyz5gTtuN/fpuBWPVm0XZv7CJFp1/wBQJzB7nYt5tz6PlEQ712iuGhUpBTN1i1OlpPmTfm4pHvFhhsj5aC48w9Irymc6r4ZpnFRIyvK7LjbSzshV0ntR+c+hIWoEn1Cp8vhSwO6FHstdcxyMoG3Ldc2uzyD6ijwnlPyV6bAOHPTLS2ambiuDWOzXEDb2QYhIMoj1vqBcPxqoPMp4xNMZpKbNdLrlTgJH/q1j9wuad99vbsMKTt6963r4o7b5BZ0+1LkoPUqbwucnb4loSf1VZuxB9B+Kt4GwoIsniit6j1071NbH87DJp/Yk1o5xeafQ07XJOVWN7fYt3TDrsxsffMbl/XVrrYWwSTvQRRvjT0VLym3tQrVDUB1E0ORiD6CHEp2NbvHK0hef7G35i1kDxG4ax6DKuix76YzThHx1aQjbuJrQtBW3N5RHnNBFjxk6SR3gzccrVYHSTsMgtU21g+fvkstjuqiYVqlh2o8UycVyuy5GyPbLtVwakhPv8ijt8dekLAI23J9+p1nPDdphqROcn5Fg1kuF0X//ADTwNDc1J9KZCAHEn1hW9BSeYHzj5acw9IqLPcLVuaUlVp1E1LsikDZHY5fLlpT0G3kylPJO23nHv71xOaSar29bYtmuk6QykjyL7jUCUdt/OplMcmg25ekyuMPTNKCCY+I5E6r0gKk2pI+U/sq4AbDasNcJ1ZuVv1lzq4zccvOpWqkSU9jsS0WJhuLFttrYDS+1K5DobYElxSXSC4tawWkpCktb1WhrLq3D5HZ2gs5yP0K02rKLfIfSD6EOKaSSP6YoLjSp1pvq5O1AmToszT/LMMciAbryKPHQ28rfqltbLzgVtuOp2B8xOx273G85+yK9322myXi1qtTyWfCbjDLTEwKKh2kde5DiRy9T0I3G4G4oPUUpSgiHF82mRpRboij9rmZbjUdwffJVeofMPkFdrxWjbhY1g+B93+L/AGN2un4um1OYFiix7VrO8XWrr5vZiKP8xXc8V23is6wbfkfd/oTtBRsY/i3av6o1/cFKYx/Fu1f1Rr+4KUEt4y/cn6u/Ba4/R11QXsExy9wWxcrBa7gFpClCVCbc3Pf13Sdz66n3GZ7k/V30/Ytcfo662QeH68phMBOtOpCE8gPL4VblbdPSYRPymg7y5cM+kl4d7Wdpfhsx3m5+0esMVSt/TuW9693j+PW3FbTHtdnt8W1W2OCGYcJhLLLQJ32ShICUjck9B3k1KntBcrj/AG2265Z8xKTvyqmItUlo9O5TZhDce8QfXXyjS7W5s8reuMBbfpkYYwtz1+UiQhP/AHfioLhXQ33BrDlSA3fLNbr00BtyXCG2+NvRstJ9fy1NWdCczmoL131zzZc49/sVGtcOOn1JbMRZ/SUo+uuI8OV+lKBna4alSQg7thqXAjcvp37KGnm95W4FB30/hf0gubZRJ0twt4H77H4vf6dw3v8ArrtzojgLgYD2FY9K7FluOhUi1suLDbaA2hPMpJJCUJSkA9wAHmryCeHm+MoV2GtupLTp7lLlW50D4lwiK43tHtVIiibZrzd3AE7JRecctklO/pPYtMk/KKD3tk0kwvGpJkWnEbBa5BP++hWthlXvbpSK9W22GxskAD0Cow9jfEDB3ai51gF1b5ej0zF5kZwH1hE5aT8g96uODoXn86KwvINdsvcnBP20WSDa4Ufm/mJVEcWB/SWo+s0FRyXD7HlsLwS+2iBd4hO5ZnxkPoPvhYIrwniwaNszRcBpRhaZIIJcTYIu49Y8iuruHDvLkxyi7axakzoHe6x7KRYYUkd+7saM06B6eVYNQpKNEMia7fE8R1b1FiObc9ystwvq40kef7dIltIeSDt1SVDuoLrkWreC6XX77Esbxp/JMvbbQ4rG8OtrTkiO05tyLfUChmMg8w2U8tAI6jeuJjP9a74HJFr0ks1nhD2jWVZWGpbo2/BxI8ltPn73CfSKlehWAMzGshVotlmS6Xpbuq1XbFstsLM9huQoEkhRUHCTynflkr5duUhJASK09jev9obUIOZ4DkXMOnsjjkuApJ/pNy3QR3fyRQefTrIjAsgkXnUjSWfh8pxvZeU2VhN8iFpJ2+3SI7fbtoTv0LrSUAecbbV3OXcQvDvlcRdpyjUHTi6xD7eDeLrBdRv6ChxR2I9YrVGjWqOQqW5kutVxgtv/AO9t+IWaHAZQnYbJQ6+iQ8DvuSvn3O/QJr2+nei2J6ZYlBxy02ll2DECtnZqQ++6pSytS3HFDdSlKUokn09Nh0oJzj3Ehw46a2FNuxjO8DgW9o/abPjMyM6pSye5qNG5lrWo7dEpJJ2ru/GoxlYSpnFdRn0KHMlTeAXnZQPdtvGFVWJj1qt7vaxbZDjO7bc7MdCFfKBX37D0UEdRxT4shSfDMcz+2pWtLaXJmC3hKSonYAqEYgfHXJf+LDTTE7xcLXfLtcbPKgvqjvKmWKehoqSopJQ72HItO4PlJJSfMTVe5R6BTlHoFBBl8T2PZw4yrCMIyzUdDJK2rja7QhiI04B1CZE5bCFKG/XkKiN9jX3HiKvlsaQq66J6jQmyDsqPHt847DzlMeY4v/umrUEJHckD4qcidtuUbe9QRFricmXbdqyaO6l3KV3BuVZmrage+5KeaTt7xNfUvWjUVkbuaC5QoE9OxvVnWfj/ANrFWXlSPMPkpsPQKCIu636gz0qbt+g2WJlpHUXK7WiOyPX2iJbivkQferljaha1SGg5/qfsbAPcl/NQFfImEofrq07DffbrXxXm6sWK1TLhJQ8tiKyt9xMdlTzhSkEnlQkFSjsOiUgk9wG9BIHNUdYYDwXL0TZmRh7dVmy6K85/0pfaYB+NQrQcSF2caDDOi+pHskTyJjPQYbbfNv53zK7IJ3/lc221cVx4qLZObUnEcFzzN3UgqUIGPPwWkgDc/bZoYQT/ADUlSvVW5HFDarsptjHcG1ByKcdu2iNYy9BMc+hx2b2DQPqCz6gaDz+WXTUDUWCuHf8Ahqst/tyuhi5BkkF4fGksuJHxE/EamY0Lym0oeViWhs/T+YtXOmTimqLkNKFenwfszHV02Gy2lDYd1ZBYfxMYVf7hKst5lqwfKorvZvY5lTrESdsQClaAl1aHUK36LaWtPeCQQQKw04l1O4BHqIoMP8Jt3FLjuZWQvJ9ksaXKaaubOXXi3Si3GKh2jjTkKHHcDgTvtzc6evVPozBR7RPvVqUgncgb1rQeI1IzXI8UbioxzA7jm77/ADhaYU6JFRHIAKS4p9xJ2VufaBRG3UdRvPY+X6/QJi3ZmnWIXiNNAVGhwMldjuW30okOuRyH990kKaQNvKHKRyqVdyhJO5SCe/fatjq0t9SPfPooPD6e33OJEe5jPMfsticjFKo79jurk9mQkglQPOw0pCk+SO482+42HSukxjiRxLNshhWq2W/KHGppUmLdJGMXBi3vlIPMEyFshAA2PlKISe4EnpX3X/iN0mxiWqHedSMSt0tCihceXeozbiD5wUle4Pf0rrHuLTRhq2y7i3qTjcyNEKA8qBPbkqRze18lsqUdz0GwO56VjcHlTjZYKzzGIxzHqSWk7/soqxwVJIVEYIP/ALJP/hU3f4rdGYsmPHd1Uw5t1/fkSq+RtuhIO559h1BHX0GuW7cT+lNncbae1Bx955xt15LMKe3KcLbbSnVq5GipQHIkncjqdgOqkgts6lTmGQw3yD2o7httsPRXJWHt8/0gtuv17kWvTTE5mXuRkKcflXSYLQwpHL5CmkrSp5YUopHMppKdjvuTsDyJ43svbuILujc1dqS5yrdZyGKqUpA33UlkpSgncbgFwd/m7qjnLSJ1Mtui30y+rweueqsLRLSq/wCaT4LtyYtjSCmGwoIU+4txLTaOY9EgrWkFR7gSdj3HptHuI3DtZfCY1okyoV8iJC5dhuzBjz46d9udTRJCkb9AtsrQT0Cia9fqNp7YtWMHumJ5LBFxsV0aDUqMXFN84BCkkKSQpJCkpUCDuCBUkTto/MmzcTeN5rrjk+T3674tiBvUVoGFGu6pDDi209kh16U5yoLvI0lHK2Ep2b6pUpRVXutIspcyM5M8l8zbOq8PKtM1SVJ7eOpttRI5id0B1TyUkbAhA23Fe01S4Ice4f8Ah2ylOnbU24IZu1vyGXFu89J5Woa+Zzs1hCQApBc5+fmASpZAOyUnxOnuQSc4vCrvaVsrxFhtyO1KKVc02QFJBU3uBs0kBQCwVBaidgOTdVHz8cRM3j5/+LXiX3EVn4UatFKCElSiAkDck+Yemte8A+Y9xratpLikKO4KDuCP1j5KooWvl4jU3T2bqF7Coi3tdpjRJIkOhppJc5xspt5le26HUKT033QQtYUk7jao8NVyXjnEje7AhRVb8nx4XZxte33ZDdbYU5sAButqQyk7fgR6K8/MuMW3riIkyWY65b3g7CHFhJdc5FL5Eg955UKOw8yTXf8ADjDTceKm7SXTsq0YghthB71GVMJcUPeENoermq14NrzlrX4jbg5Va9uZZfvQmZDSm3GkLQobFK08wPxGutThtjSrnFmtwX3lQiN77/JXbqdSlXKT12329VfBLyS1W93spVxiRndt+zdfQlXyE16VSPKZrn2A6a+AjLshx7FW5pWiMLxMYiJfKACpKO0I3ICk7gemvE/6zeHjNb03aPsl04vdzWCoRjLgSHFgd423Pv8ApqwTINoyGMlEqJDucc+UlLzSHUd3eNwR5/110F6xDAbnCTZrrY8dlQ+cLECZDYW3z+Y8ihtv8VBj1k914NI2TrgXeDpcLg2rsn5KLfFMZheyjyPSEI7Jpfkq2S4pJJHQV3mD6RcKGps5+PiFj03yiUwgOvMWZyNKU2gkAKUhtR2TuQNyNtz66pGarvmndrtlt060vtuSWtxLiXYUa4x7UzFPTk8hTZSpCiVElPUcvtVb9PExL3rfjT65jOjWEyUSEhPgtjypTL7Kh13ccdhNpWDvtsnqOU9+/QPSSODjRKQjl/1XYwyPTGt6GVfKjYmvm8S/R5pSVxcQFudSdw/brjLiOj1Bxp1KgPVvVF05u+U3vHfCcwx6JjF47VSTAh3P2QQEDblV2vZN9T13SEnbbvNepoIyrhMwdKeWPcM3hJ39rGzu9oHyeF18zvCrAZSkWvUjUyzAHqGctkyQR6NpJdA9/v8AXVvryuf4VLzi3R4kXKL5iimnw94XYXmm3ljlUnkV2rTiSk82+3LvuAQRtQTJzhjnkJac1s1SXHB5g0LvESo+rtExQ5/3vPX2McLeKpUtyZkeoNyd/lLkZ3d0H39m5KAPkrhRwttMvJlx9TNR4t16pduX2SLfW+jzIUy8hbCQCVEcjSSN++vkk8JeEBYueQXnLL3emgVDI7jlU5ubHRseYIWy42hpHpCEpSf5Q7qDsXeFLHe07SDmOo1sUDuOwzi6OAH3nX17/HvXH4rvp1a1RI9H2Snp/wDd10uPa16Q6IQJcFersjMHpLgeZgv3pWQT0DbohptrneKT079+p76pOK8QWmmbx0O2PO8euPMNy01cme1R6ltlXMk+pQBFB5DxYZLKg5E1j1QivD+Wq+MyAffS8wtP6q0Tw7ZYg+Rr9qQB5gpNnV+231bW3EvNpWghSVDcEVvoIivh3yt5HZu6+6jqQT15E2dCtvQFJt+4+KuNvhryCAvtLfrrqWws+28JftstJ+J6Erb4vkq5VxSCQjcb/FQQ3hctcm1XPV9mbc375ObzJTD90lhtLspTdst6AtSW0pQFEJG4SlI332G2213qL8KCYN20xey+AuQWcxu0/Iy3JQELaMh9RDZ2UQrkShKQrzgb7DfarRQKUpQKUpQQbjUhLn6JssNTJFuedyjHG25sQpD0dSrzDSHG+ZKk86d9xzJI3A3B7qnvEpozn2O8PGpshjW/JLtaY2L3N2Vbb5aba/4U2IjvM12zUdpaOYbjmBJHTbu2NP4t1pOmNmaVt9szLF0AH+UfZuEdvk3rs+K/3LOsHwPu/wBDdoKNjH8W7V/VGv7gpTGP4t2r+qNf3BSglvGX7lDV34LXH6Ouq9C+42Pzaf2VIeMv3KGrvwWuP0ddV6F9xsfm0/soOelKUCtqlpQPKO1bq8xqFpvj+qNiTaMjhuSobbyJLSmJLsZ5l1O/K4260pK0KG56pUD1I7iRQdxeb9bcctki43W4RbZb46ed6XMeS000n0qUogAes1stmSWm9WVi8W65w7haX2u3anRH0usON/fpWklJT6wdqmFs4SNLIVwYnzsdeyedHVzMv5Vc5V5LSvSgS3XAkjzEAEV8V/4T9GYQud+f01ttydR2s5yE3FXIbeX1WoIi7ltSlHfZIR1J7jvQWS3XSHeIbUyBLZmxHRu3IjuBxtY323SodD3eavqrHPEs9vNktDlu0o4fLja7YHVvuJu4jYzEW4R5RQ0ErdKjttupkDu6+j3OHalag5HkkSJdtJLlilnWk9vcbjeID6mlhBOyW2HXCpJUOXfp7YHbvFBUHGkuoKVpCkkEEGpBeuD/AEZvKu0Tp1ZbRIIIMmwMm1PqB7wpyKW1KB84JINWKlB0WHYPYNP8fg2PHLREstphJKWIkNsNoRuSVHYd6iSSVHckkkkkk13tKUClKUHG+oob3SdjvUbv/Ec7GvU2x2DTjPsmvEd9UceDWJcOEpSVbcwmSy0wWztvzpUoEdU79Ksy0BxOx329VbQ0B5z8vfQRWDrBqsmIlE/Qi9G4hR5/Y/IrU7E236crjj7bh6bb7tDY9OvebSx2nZjtN+b17b/qreEgVuoFKUoFKUoFS/PM6z+2Xdy14xpfLyUFCeyu0q8QoVu3I69oStb42PQ8rCt9um9VCtANqCD2fXPNbIPYrNtJ8ldvrElbK5mKsNTbXIb5z2brTinUrAKQCUrQlSTzbjbY1dG20Lb7uZKhsd/OK3KaCvSPerclISNh3UHU3nELFkS4y7tZoF0VGX2jBmxkPdkrffmRzA8p3AO49A9FdqhtLY2SNh399bq0CgfOKDWlabg+enMPSKDyOrOpdr0f07vmY3lEly22lgPOtw2w46vdQSlKQSBuVKA3JAG+5IAJrBXN+JLU7ij0+lrxiRB04xi5MvtMIQpci4zAlSm+V18BIYbUQd+w5lbb7Odazk1nwhGpukmZ4l2zbK73aJVvbecG6WnHGlIQs7dfJUQenor879NMmtVusEPG344x+9WVpMK42R/dDsOQgbOJIUSeUq3KVHoodQT3nk5F746xNE+GtbWnqd3i2GwrDjMSE3arPb54jIQ6q3wwiOl4J2JCOhUjffYE77Hqe+pXpTacgtuqUsx7he58NLUlq9T7lGMeM88FhLSIyChKU7HtCex3Rykbkkg1cmJseSopadSpQG5G/UfFXOTvsO4DptVPGa0VmPe3fbHE6fGLRASytlMGKlpfRSEspAI9G23d0HyD0V5XJtMY0yIV4/KfxeYEOBQspah+FbgEIdcDSlBO4HlJ2Unc7Hr09rv3ev8A8/5j5ab1HF7RO4b9NZeQs2OXpdmnLlrteO5FJkhS7hYmEvFxscvVSnm91KOykkqHQbEda9LJZeektqQvs0JIJUlWyt/e22I98fsFfX31pWZtMto8OnvEG4xrrackxyWzbMtsb4l26W8kltfQByO8EkKUw6gcqwCOmxHVIrNbQvVh3VrTW35PPtT2OyXe1bk2+Sh5PYKbUQSFOtNKUhQAUFlIGyh5wawP1VnM2LGkX+Q3cFsWWS3cHjbpBacQyhX21RT1DiQgr5myOqd9tjsRROGXTLTrPs+y/FM3xqHkNxjcl9s71zfdfQ/AeUoOM9ipRbIYeB83dIR071Ks+HaYjpn04M9Y/NCtcQ3E5p7d9KdR8Vx7J/ZvJpdguMGE1ZIciahUtUZxKGg8y2psOBRG45t09d9tjUcwlNsXhePJshQm0JgsKiIYGzfZFscu23Tbbb9dcf8ApA9JdV4bFpuGBSchc05hNNQ04np+pcGTFXsrdxSGW1ds0SUjYAcmw2SQVGsdNC81u2jENqx5hCveMY4XHFsxL/aZpdYWoJPMmS4wygI3KiUcitjzKCtiRTnYLZscTX4+Di5Ix3/m+WVUUJTHbShRUlI5QSNj06f5Vy+YHbb1V5O2ap4tfA0q23qDPL60oZSxKbWXCe02AIPUnsnO4f8Aya+nQ7fAnWnEW3WG3L3bmxIDng5clobCyhXKtIUrpzJV0KR1Ho2rzvbvP+ldxkr9u5zHH3Mi+x9pMWHKYiXdqbIMrmC2kNocUlxlSTuHA52fqKStJ3CiC0GwrNoGr0mPYs0trOTRseLbNwyKxPye2iGaSpKeykNIdIHg3OXFFaSElKQHl7eak8QOFMzEQIl3au91UpKBFtihIIJ7lKKCeRAOwKj0SVJ39sKx01LeyvM5024vYVEkuvlayI90S8Ts0tDISlxKEp5VKSSSFA8vVJPWrjg48kW6rRqIVvKyUmNVny/TxegGTZeUqz7V3Jr7FQsr9jsdDePxCe7Yqjf7SpI2PkqfI69d67Sz8KGi9riCOdLsTmK3PNIulqZnSXT3lTjzyVuOKP3ylEn0mvychvYNa2mE3nHZmKOABJemRnI7XN3kh9o9n8fMnf0eaqtimT3+yNszcQ1Iyu2xSN2xEvq50ZQ7h9rkF5oj3k1eqp+gkvg10UlKc7PTu028LVzqRaw5CRv6ksqQB7wFfdH4SdFI0VTA0nw14L35nJNkjvOq37yXFoKifWTvWH2m/H7qHht+cs+Xw7fqFAYcRHW9b2U227A8iXVLSgr7CSQ2rcpSGfT5wKzl0m1fxnWnFmcgxW5t3GAslpxPKUPRngAVsvNnq24ncbpPUe8RQT9zhKx/HwHcByHLNO5TK+1jizX196Eg+dHgMlTsbk83KGxsPalNcjc/XrBWgxLsmL6pREeQmdb5yrJPXsOilsOpcZJO3UpdQNzuEgdBcQQQCDuDWtBKbZqNqRc8fu8tzSObabvEQ0qJbbhfoHZzipey0peZW5yFKevlpAV0HTfcdS1n+ul3aKoekVgs3XYez2YgOe/yRojydvR5e/pA7qtlKCJKmcRYdLotGmfZA7+DC6XAqUPR2vg+w9/k+KuAcSF8xVTTGoGlGY468vcCXYon2QwlEHbcLhc7yR5x2jKD17u+rpW0thR3NBDjxkacMlSX1ZcwtJ2Lb2D3pCvk8Dr7IXFxo7dpnsfPzOJYZLg5RHyeO/Zy4CO5Iloa5tx6N+/11ZOzSN9ulfJcbJAvERyLPhsTorg5VsyWw4hQ9BSQQfjoOqxKx4pbbYmRjFvtMW3S0hwO2lltDTw8yt2xsoeuuuyHSPT7N5AkX7C8evz46h65WpmQv9JaCa8nP4P9Fbi6+65pljbLjxKlriQER1AnvKS2ElJ9adjXVjQDMsXbTEwnWXJrPbUEhuDfYUW9IYRv0Q066hL2wGyR2jizsB1oLc0GYyW47SUtIQkJQ2kbBIA6ADzdP2VzVLrjjGqNow63wcdzKz3TI23lKl3jK7KXEPtnchKGYjrAQU7hIO56J67nrXQMTuImwkqlW7TnM2h1KYkidZHT6QAtMpJP/UKC4VscTzACoi3xS23FZbNv1RsE/Sic7/upl6cbetMg77ENTmiWwf5rvZqO4ISRvVcg5HbL7b25dpucO4sOo52X4j6XW1jbcEFJIIPTuoJZwaoKeFrSs7bBWPRF9PPzNg7/AK/11aKj3CBy+K1pJykfxVtu4B8/gze/696sNBsLqUqKSeo2Pd6a2rktNpUpbiUJSN1KUdgB6TXTZDhduye5WebNcnpetT/hMdES4Pxm1L22+2obWlLyf5rgUn1dTU/uPCbpXfby9c73jKsjkuvLfU3f7lLuLHMpXMdmX3VtpG56AJAHm2oKnFusKaVCPKZf5e/s1hW3yVzOSWmU8zjiUDfbdXTr6Kks3hB0SnLUtWleJsOEbc8S1Mx1D3i2lJFfM1wZ6ItqJVppYZAP8iVG7dP6KyRQfNxFsoyXINGLG2Q6zcM3jSllKvJKYcSXNSfWOeOiu44rxtws6wb9/wBh93+hu1L8q0g090c4hdFX8Vxq2Ys5cLvclvqhNBlghFplJCdgeVBJc6BIAPUnqK5+LDiV0rVoNqzjCdQcdcyB/GLpDbtzVyaW6p9cRxKWtkk+WSQOXv3IoMj8Y/i3av6o1/cFKYx/Fu1f1Rr+4KUEt4y/coau/Ba4/R11XoX3Gx+bT+ypDxl+5Q1d+C1x+jrqvQvuNj82n9lBz0pSgUpWlBrStK1oFKUoFKUoFKVtc9or3j3UG6lRe9XDXK4XeXBsdlwWz21ElwR71crlLmLdY5z2ajEbZa2c5duYdvtvvsSK623r15wEGFLiYrqjHX1auqpjlgkoUSSUOMhqQhQG4SlSVA8qRzJUrdRC9UqCtTuITH5a7tNtOD5ZFfT5WNWuW/AkQup2Lct1K0SSR0PO2yOnT1+6wbOMuyC1XV7INPZWKzYyAqLCXdYsozTyklKFNr5UncJHlke2HroKBSoTMzHXXLkvDHcExrCkNpK0O5fdjNeknb2qWYRKUAnp2hdO248g7VQ9MciyjI7ZLdyzERiE9p0NoYbubU9p9PKD2iHEBJ233GykpV6hQezpSlApWijypJ239VeWv2p2J2C8NWO45La7fe5KCpi2vTWky3Rsdihkq51dx22B3IoPVVD874scSxC3Y9co76J1ouNwuEaXcHQ6y3CjwEu+HSNi2VOhtbQbSlAPOtxIST31Ob3fs54mceeu2GomW6xtNNvx7e9Oet7F9iu8rsWfBuUfZyPISlKkqYdS42kqAcQejh0uHAVaM90oxjFMly2/eF2Fu7FiZGU00tbs6UJPaPgAhxbS0o2KShKlJJ5QOlBXMC4nsFzvF8XvKrozjysit/snCt18fajSvB+0DYcUnnIAK1ICdieYq6b7Hb7sq4ldMMKZK7vnVhbc5y2mLGnIkyXF/eoYbKnFn1JSTXzW7hm0/iQGoszHYF6R4Bbrc8i5sJfZeagocTGHYkdmjl7VZ2QlIJPd5q9ZimlmIYLIL+O4tZbC6UchVbLczGJHo3QkUE3c4jb7lLymtPdKcoyiOSEovN5Qmw24779d5W0hQG3UojqHo3rcYGvmSyHQ9dsAwWL7ZCoESXfXz/1OKipSfXyKq4UoIlH0V1GuKQm8675Fy78xRY7LbIST8bjDytv+r46S9Cc4hpK7Trrl7a9vJbututUtgnzcyREQoj1BQ98VbaUEJW3xFWxJhsO6bX1CSEpu0rw+C4tP3y4yQ6kKHn2d2PmAryeScHbmtuT2q+6xXq0X6RbVtrjQcdsDdvS3yL5whUpxTslaN/5KXGwfOD5soq2OgltfKdlbHY+ugwe1m0Dt3Dfj9jvVruV8yC2SL21bpLlzfbdXAZkDs2TzhKVuJDxQ35XMr7cCT5HXw+V3qVj9ikT4duXdn2eUiE06lpbqeYBXKpXk8wG5AJAO2243rwOouJcU9/1IzxGZ2jLrnh8mVHuItGNuszbe2huQl9htgL5XF8im2t+wSFkpVzDqd6Np9pBmXEUm62iXEyjTZq3RUyGL5OtTkUypCwtCGvB5LSS4lGxcUpKgNw2POeWuzcbqtE0h2Y82q6s8Tjl8ubL86Y/KffiXAoksQJzQSuApW5cb5knyh1TsD7XZQBII258azu5X7Um5WIMMt223W5D7ziRupbrq/tYBBISEpQvcK2KuYEDZO56XiDwjIeGPF7bIyPUfH7vlD6kKj47EthR4U2tRDjjz63khlps7JQ6UpBJIKVKO48XovqBKXqBdrnkbMK3W6/ssRLPMZmIfbV2LjpSytxJKS4sOkjY7HkUB5hXNfBem7T6TxlraYiGRDzoZRzFKlAd4SkqPyCtA6pbx2KC0Ugjqeb4wfNWr8cPcoUVIUOo5VlJ/8+/XzSLlCjuntHm+135VAdVJ9/bu2PprhdD61ISsEKHMkjYj0ivt0gedt/Flp080sMol2m8wXlK2SHE8kd5LYPdzczAUE95ShRHRJrydyz+wWpx5p64trkNtOP8AgzILjykI25ilCQVK2Kk9wPtk+cgV1WjvEZjmN60wM4kR7ndMMasz9sVMsrXhSmJTrzayX46Vc4CEM7DlQpQLitwB393Fx2nJFvhzZ7x06+36ccvO3srrvW0sDbYdB6PR71eewDUTHdT8biX7FbvEvtnkg9nLhuhadx3pI70qB6FKtlA7ggEV6arpWvG5to/h2o9nlWzJcct14iSkIS6JEdJX5ClKQUrHlIUlTi1JUkgpKiQQSTXUY7w56dY1ZJFqYxO1zY0osqlrucZEx6YtpJS2t910KW8tKSUhSySASN+pqk0rGhF9b+F/E9V9OUY7EiRsZnW5wyrHcbZFQ2q2ydgApCU7AoUAErR3KTuOmySPztzW05vp/mMXE8qtjFkyBLgWpztCqJdYyVAKchucp508u6uU8q0KCQoAEqH69V4rVPR7FtZsceseWWtq5wVEONEkodjODudZcSQptY8ykkHzdxO+R+ZL6247Drri0obSkqUtStglPedye4bV5U4HanXDdMfkLsMuQjn8JtS0hl8lPkrW31bc7wdyCdvP1q+6q8GOoGniXk2NhGq+KDlcSy8ppi8sJSQoJWlXKzJ2KQQpPZq3HtFHrUDlZNasAfatuSyLljE0MtoTDymI7Ae5UjYKAdQgHcecbg7Cg7m2iUxIcTJiN9qvdZlx+UB3lICecEghZ3JA2I2HthvVL4Ysjl4JxPYomC4pq3ZimRZbrGSshD624zkmM8pPcpTfYOoCj1CXiO6pBA1Lxq8z2IFourV9uUhXIxb7OlU2S8r71DTIUpR9QFZXcIvDfkkvUS36mZtZ38di2mM83YLNOG0pTryeRyU+gEhohsqQhtXlfbXCrl2AoM3mju2k+nrW+tB3VrQKUpQKUpQKUpQKUpQKUpQcUiM3KQUOJC0EFJSobggjYgj3iak0nhL0XXdGbkNK8QantviQmQzZWG1hwHcK3Sgbnfr/AOTVerY7vsNhv/lQRjg2dUeGvCIjoAkWqO9ZniDuC5EkOxlkHzgqZUR6iKtVRHgyCl8N+GzHAQ5dG5V3UPQZUt6QQPUO12+KrdQKUpQKUpQY6cZWHWXIrZpvc77aIV/ttqzW2MyLbco6X2H2pqzAUFIUCklJlIcG/nbHn2rveIrFLNhnCDqvaLBaoVltMXDruliDb46GGWk+Bu9EoQAAPeFb+LTc6a2X0fZni3/+8hV2fFh7lnWD4H3f6G7QUTF/4t2r+qNf3BStcY/i3av6o1/cFKCW8ZfuUNXfgtcfo66r0L7jY/Np/ZUh4y/coau/Ba4/R11XoX3Gx+bT+yg5XASghPft0qYZ1gOpN2yH2QxLVBGNQVtoQ5a59hZuLKVJ3BU2rnacTzbgkKWrqOmwO1VGlBCXNE9Qktqus/XbJWr8gHZyFboDVrbRt3GItpe43686nCrp7YDcVKbzlGnkKY25e+KTJr1lI5VJcxi5suJjnvHLAhsONKSd+oebWdtjvvWZLjaXUlKxzJI2IPnrr7NjFnx2KYtptcO1xisuFmEwllBUTuTskAUGPuN5DmMmwQr1B4h8LvmNvpQ+3crnjSA64yevlONTmWwrY7f7sbHvSCDWQtovMG8RGX4M1mcw4nmQ8w4FpWPSCD1Hrrxsvh20pn3R65SdM8PkXF5wvOTHbDFU8tZO5UpZb3J3JO5O/WmK8PemeC5V9kmOYLYbBfOVSBMtkFuOoBSeU9EADqNxvt5z6TQUKlKUClaE7DeupynLrLhOPzb5f7pFtFnhI7SRNluBDTSd9tyT6+lB29KhsjjS0ZS7kHZ6h2ZyPYra3dpcpp8OMFhRI2bWNw65uAns0brClJTylRArkuPGBpnarg5EfvVwcfbQ0eyiWObIUta2kvFpKW2VKU6htbSltgczfaoCwkqAoLbyj0CpDlEnXKXfpELHLPglsswdKWbzdbtMlvlrboow247aeb+b2+387z11o4w9P+/wXNz/AP4Fe/qlbzxeYLy8wgZ3yD+V9gN72+h0Hc6du6vW7JHLRmsPGL1ZUJcW3lFnlPRHnTuChC4C21hB6kEiQoeSDt12FSQnyRzAb/LUPVxZ4zKU2LNimoV+lOHlSzGwm5sb/wDvJDLTaffUoVzOagaz5gezxrTKHhrCtleyOdXVlagP5sWCt0qPqW63QWlSkNnuG/f0FbFS2GUkqcQ2P5xA3qKuaCZhmXIvPtWchuDW5UbXiSU2CICdvJ7RkmUQNu4yPP3V9EPg30abdLs/ALbf5PNzKl5Ety6vun0rckqcUr4yaCkX/UTFcUj+EXvJbRZ4/wCGuE5phHyrUB5ql1w4rsfyDtYWmNpumqt23KEqx9kptja9uhduLm0dKfTyKWvYHZB7q9Va+GrSOyPpft2l2GQX0nmS7GsEVtYPqIb3qhtxWWWktttpQ2kAJSkbAAd21BDImjOfakgy9TM+nW6I6oqGKYNKct8NlG5AbdmACVIPLtupKmUkk7IHSvZYlw7aaYTFaZtOB49F7J0PpeNubceLgIIcU6sFa1ggHnUSrcb71RAQNx6K6+/ZLaMVtb9zvVzh2i2sDd2ZPfSyy2PSpaiAPjNB94aQlPKEJA9AFbgAO4bVFJnGRpIiW5Ht2UP5GpvcLdxmzzbw0Njt/vYrLiD+lXA1xoaUodCZ96u9lQr2rt7xq5wGunfst6MhO3x0FzpXicQ1u071AloiYxneN5DMWjtBGtd2Yku8vp5ELKv1V7MOpKuXfyvRQb6UpQKUpQK0I3Gx7q1pQbeRI38kde/pTkT96PkrdSgi/EZwxWXiKiWETrjJsVys0lx+Lc4LLLjobcbKHGSl1CklCvIURt7ZtBHdWO2V/wCjev8AFsT8TGc7tt6jqR/A+UWZtDDxKuY7ux9uQbjztL9J61njSgw80d4GphsOSP6sXZ+bfb1ISgRcdv0xMSJEQloIQ2opbIWpSHCpQSPJc2Hpr22Q8CWnV+uTD7MjIrHCaZaj+x1ovLrEdSG0ciRt1UCU7bqCgVEbnr1rI2ladFfpt1W+35UanaNWnh61xyjD7NDQxY5sZm/2jdZceDDxU080txW6llL7KyCok8jjYJ6V4HKMRf8ADfZ3HUtRMhZIKtzyMzmxvuy9sD5j5KyCUkA924Obv+kQ0jlZTpnb81tLUg3DE1PrmGCeWQbY83yylIP3zZS0+O8/aTsCdqw2xeK9FgoUbgxOjPI7VpUfnUnylrWVBalrJSecco32AGwJG3Lv6avlwPM5lkkPZrhd4nYPkTO4uXg6CsKW2N1MS4/tXwNgO7mIIKFDcGs3uGPjetmrs6JimZMtYvnK1KaYDZWIF3UjcLMVawCFgg7sr8oDbYrHUYYyokpi4R3rc1EaS8+PZBS0kOOthspSQR3rSQjbfpyp29FfJc8NgybfIaghy1zlLEiNLiuKQqLIQoraea2PkLS4oq5kgE+feg/YRKgrfbzHat1TDhp1Rd1k0SxfKpaEs3SVHLFyZSNg1NZWpmSgD70Otr29W1U+gUpSg0KQTvsN62LYbdTsttCwfMpINclKDhaiMMHdtlts+lKAK5QkDuAFa0oFKUoFKUoFKUoFKUoFKUoFKUoFbHFBHKVd29b6lfFDek2bQrK0m+MYyu5R0WZq9SnuybgOzHERG31L3GyW1PpWTuNgkncbUHWcGwI4WdKtwd1Y7DUCfQW0kfLVnqLWjiG0L0zs9lxNnUzC7WxbYjUGPEN6jJDLbSUoSk+XsnYADYmu2tPFVozfZPg0DVbDZMkudkllF8jc61b7bJTz7q38xG4NBU6VxNSmXkBbbiVpPcUncH0VvDiT3Gg3UrZ2qNx5Q691bkqCkhQO4I3FBFeLhYb0ttbqtwhrMMYcWfQkXuFvXZcV/XhZ1g+B93+hu11/GXCEjhjz+UErUu1wU3hPZnyuaI63KBHo6s99fbxUuJe4U9XHE+1Xht2UPeMJ2gpOMfxbtX9Ua/uClMY/i3av6o1/cFKCWcZh24UNXfXi1xH/AOHXVeiLSmEwVKAAbT3n1VIuMv3KOrh6HbF7idiNx0jrrrYXBbpHNjsSL5jbuXT3G0F+bktxk3F2Qrb2znbOKBO5J7thudgBQXFuZHdUUofbWR3hKwa5eYekVFpHBfoe8lHZaY47b3UEFEm2QxDfSR5w6zyrHcO4+at6eFXGmtm2cr1EjxU9ExWs6uwbSn70f7RzAe8aD3edaq4fplHbk5ZlNmxuO50Qq6zm4/OfQnnUOY9R0HpqeJ4ztJJO6LflDt9eCinksVom3EqPoT2DK9/i3r0+CcOmnGm1yXc7BicCPenNw5eZSTLuDu/fzynit5W/85Zqh+Dp7Tn683v0EaVxS2lxCVxcF1JmoPnbwm4I/vtprVriDyS7AGy6I6gzUnfZc9u325PySJaV/wDdqzhO3n3rdQRFGtepzKyuXoFkojDcnwS92h131bJMpO/yiudzXrLJKezt2hmfPySNgJjlqjNBX85app6esA1Z6UELkXDXzOghqNasV0sibErlzX3Mgm+oJZbDDKD3HcuuDzbeeuPUnhhb1zxPF7NqTl98uqbS+uTOasPLa4l5KjsEyG0ha+QI3TyocT7ZRJ35eW8UoJ43w+aam9OXp3BLA7eHXe3cnP25px9Tgb7PtCtQKuYo6E77nz9a90zbo8YqLTYbK1FSikbcxPeT6+g6+oV9NKDQJA37605RW6lBs7NPv1uA5RtWtbHXOybUrYnbzAb0G+tqnEIIClJST16nb/z3j5aluY8T2meAXRi3ZBl9utkx6THipQ6tRAU+FllSikEJbUGnD2itkDkVuoVjlrd/pAbJddGbm7hES+tZBPmLt7DkdppMmNBCEPOXRCVuJIbMRZcbcPkpWUBzlG9Bf75xM2WJktwx/G7BkeoV4tq+xuDGKwA81Cd237J2Q6tthK/SjtOYecCvne1u1EeBZg6CZWJagChU+72hmON/v3ES3FD3ghRrv+HK0WuyaMYlGs1in41bl29uS3bLo6HZbRd3dWXl7ndxS3FqUSd+ZR3AO4ql0EIXiWtuozwdv2WWrTOzuqO9pxKKJ9xSjboFXCSnswSe8Ji9O4K/lV21j4UtN4Fwj3S6WeTmF6YO6bll05+7O8++/OkSFKQg9f5CUgeYCrDXkNQNW8P0ritycuyS2Y8y6PtPshKS2t877FLaCeZZ6jokE9aD08eCxFYQwy0lplA2ShA2CR6hXKppKhsRv79RhHGHpg+FKi3K9zmgdg9Dxa7PtqPqWiKUn4jXHJ4pYN1LbOFYFnWdS17kpiWB22MNejnfuPgzfxJKj6qD22aaJaf6hxuwyXD7JeUA7pXLgtLcQr0oXtzIPrSQaki5U7hayCGuNcZN+0ZuEtq3LE2UZUnF5jryW2uV1ZKnIa1rSgpWoqZUQQSjyU0WzI1CzXT65Ivwg6eZLNcPgjlncFyXCYPIQFl1tLanh5aSAFIB2I5tq+3F9GsXw7S9/C0QfZOyyW3/AGQTc1B5y5OPKUqQ7IUQOdbqlrUpWw9t02AGwe9ad5kbqIG9bwQe471hXj+rGR6Z3/MsS04Yn6m4bbEMott6uZelQ7G+hLzk6O9MaQt2ShltMUobSHHit3st/IPZ5aYFkf2XYpbbuY0qIZTCVlqbDciOA7dd2XAFoG/cFAHbag9DSlKBSlKBSlKBSlKBSlKDY60l5BSrqk94r87uJXhum6E3eZk+KWt+bptLdW/Lhw2S45YXCeZakoSNzFUdz0H2ok7+QRy/opW1xAcTsdu/fqKD8gWci8MVCet0NV2tr/KpU6I+2UBKiRukbkq2PKT3AJ5iCSnlPOxc375kDGNY1EVkmWy+VMWzwFBTnMd/Ld7w00O8rXsAAe+v0RvXBlojkF0fuUzTPHTOfcU688xDSwXlqUVKKw3yhRJJ3333qhYPpnimmdsNtxLHbZjNvUvtFxbTEbjNLX51FKAAVHznvOw9AoPL8N2kzuiWkFkxSVL9kLkz2su4TEghD0t91bz6kDYbI53FBIPUJA33PU06lKBSlKBSlKBSlKBSlKBSlKBSlKBSlKBSlKBSlKBUP4u1ex+nuOX55PbWuwZbZbpcY43JdjomtpVske2KVLQ4E+ctgde6rhUU4nlqucbTXGWh2j18zW18zP37MRarg7uPOAiGfjI9NB0Vg4Z8ot8ZcP8A1mycbtAcUGLPhONWu2RGWevKnleYkqKtttzz7HrsBua89ftIdYm8thY2jILVnOCvx3VvTMxxaDJQyoBXZNPBl9hbpJA3UhoDZQ3367ZTo6pHvVuoMWsg4Y5+GYhb1YC5kVsuzzjSJ9mxLJl2a1NqIPavsMyEyEtJ3Cdm0Ab9PQSfdnhxlPpQiTqzqVJQ0nlQPZhhgj0kqZjoKz3dVlXd79WqlBE4PDU8xNjOStWNTbjEadDhhPXtpttwA78iltMIdKT3HZzcjz1am08jaE9TsAOtbqUEu4p0Bzhj1dSobg4hd/obtdJxDuqf4NdS3VK5lLwW5KJ85PgDnfXccVzpZ4XtXlgbkYjdvobtddxKspjcIGqLSPaIwe5pHvCA4KCpYx/Fu1f1Rr+4KUxj+Ldq/qjX9wUoJbxl+5Q1d+C1x+jrqvQvuNj82n9lSHjL9yhq78Frj9HXVehfcbH5tP7KDnpSlApSlApSlApSlApSlApSlApSlArzmbYtMyuzOQoOQXDGZJcbdRPtfZF5JSoHlIdQtBSrbYgp6gnu7x6OlBGmOEXS1qXb5LmLRZK7dMlTIKJC3HG4vhLZbkMIQVcojrClksbdnutRCQTX15vwxYNmeIHHmbVHxtgMR4yJdjissSENR1IXHb5ighSELbbUG1BSCW07pIGxrVKDHqPw05DprepV60vzTwCXKjR25sHK2XbqzdX2+2C5Ep8upe7RYca2LakhHY7cqkr5U9s3lmvdkY5Z2nWGZIUDcv2fKnoqnf6LT0PYH33NvXVu23psPRQREau6qhpSHdBrsFb97eTWtQ23/nOj9leYbn5mnMpGWQ+GxAyiS2hld5uWR24PBtAIShK0KdUhPU+SgbHck7k71kryj0Cmw9FBEXsg1/vSeWFheB4sFDo5dMhlXBzfbzNtRWx09HafGK3uWviGDfMi/wCmbrm3RtViuKEk+jm8NJHv8p96rXsD5qco9AoIc5I4iXUCMi2aZx1jceHG5XB0eo9h4OnqPR2g39Irjc4cbrqGsPaqZzOyyErcqxe0NG1WQHp0U2hRffHf5L7y0HmO6O4C68o9Ap3UHXY7jtsxOzx7TZrfEtNrjDljwoDCWGWk9+yUJAAG5PcPPXZUpQKUpQKUpQKUpQKUpQKUpQKUpQKUpQKUpQKUpQKUpQKUpQKUpQKUpQKUpQKUpQKUpQKVxrfS2SDv0/XUs1D4k8I07ViarhczIiZJcTbYc638r8dtYOylvOJVshtKuVKlddisdNgogKvUT1akKk8QuhcBKPaSrzcCf5rdvWz+2UPkrr7rxdYpi2sGdYLlCjjhxq1sXZu4yngW57CmQ46GwBv2je4HICpStyR3EVONYeIO04XdrHqc5aL3JyuHisxcXB54ajuW2M/IaUqbMdQpxMcLEZtCU7LWokIShS+ZIDK9WPQ3r9FvS0OeHxo7sVpSX3AgNuKbUsFvm5FElpGyiCRsQCApW/aV0WE3i4X/ABOyXK7W1VkukyCzIlWtbodVEdUhKltFYACuRRKdwBvt3Cu9oFKVtUsJ7zQbqVxpfQrz/LQvpG+4Pyd9BNOKRrtuGXVtsDcqxG7Db/6G7XQ8Q7/hXBpqU+DzB3BLksH37e4a9br9CcvWhGo8COguPSsbuTCEAdVKVFcSB8ZO1SzPclg5Z/o+csuVvmtXBh/TeYrt2HAtPN7GL5gSO4g7gjzGgyAxj+Ldq/qjX9wUpjH8W7V/VGv7gpQS3jL9yhq78Frj9HXVehfcbH5tP7KkPGX7lDV34LXH6Ouq9C+42Pzaf2UHPSlKBSlKBSlKBSlKBSlKBSlKBSlKBSlKBSlKBSlKBSlKBSlKBSlKBSlKBSlKBSlKBSlKBSlKBSlKBSlKBSlKBSlKBSlKBSlKBSlKBSlKBSlKBSlKBSlKBWx0rCfIG6q30oMaIOh+fao3FNz1GvNxtiexfkW0WS+OwLjYZanAOySqIUxpjIQkKQ483zgHlWlXMrbrdHP9H5hWmzrUu+yXswns3ObPQHUqiwXESUKQpt6ClZjuEJcWOfkBIKU7BKUisqaUHkL1pBhGSXZy6XfFLRdbg4/GkqkToiHl9rH5uwcBUDspHOrZQ6jmPprpMk4f8PyLJGL45bi1NN6j3+aGnCEXGVHY7GN4RvuVIaAQtKBskLbSrYnfelUoJHbdPM000slzk43fpmoGTXKQyp9WcXhTMVpA5uYspjx1Ja9t7RDaQdhuRt193jy8oXcHlXtu1swTEjlpuCtxbqZGyu3ClKABQDyBBABI3J26CvQ0oNFb8p26HbpUnz3Rm96mZK6/eM+yC24qlLfg2O42/wCxagsDZS3pjR7dzc9QlC20jYApURvVZpQQiLw/52y0bcnXHL41jj+TCbjxbe5OSjckJelvsOre235QohKikJ5io7mveRtOZreAtY1KyvIZ7yVoccvi5TTVwdIeDhSVttoSBsOQ8qR5BIBB617ulB5zNsDtGoeJy8dv0ZUu1SwhMiM3IcZDqUrSvkUW1JJQeUBSd9lJJSoFKiDjxrHoaxo/wzcQbeK3RVtx+72C53FrHhCjph25ZhqD6WA2lCglxCAACohB6gd4OVVSjiz9y3rB8D7v9DdoKJjH8W7V/VGv7gpTGP4t2r+qNf3BSglvGX7lDV34LXH6Ouq9C+42Pzaf2VIeMv3KGrvwWuP0ddV6F9xsfm0/soOelKUClKUClKUClKUClKUClKUClKUClKUClKUClKUClKUClKUClKUClKUClKUClKUClKUClKUClKUClKUClKUClKUClKUClKUClKUClKUClKUClKUClKUClKUClKUClKUClKUClKUClKUCpRxZ+5b1g+B93+hu1V6lHFn7lvWD4H3f6G7QUTGP4t2r+qNf3BSmMfxbtX9Ua/uClBM+L6FIufC7qtDhx3ZUuRjNwaaYZQVrcUY6wEgDqSfRXWxeMjSZuMyhWQXAKSgAj7Hrl37f1eqlnWXWnAMRu2TX6UYVktEVydNkhpbhaZbSVKVyoBUrYDfZIJ6dKmKOLvAOUbQs3I27xgN8P/7Og18cvST8oLh83rl9Xp45ekn5QXD5vXL6vTxu8A/Ec3+YF9+p08bvAPxHN/mBffqdA8cvST8oLh83rl9Xp45ekn5QXD5vXL6vTxu8A/Ec3+YF9+p08bvAPxHN/mBffqdA8cvST8oLh83rl9Xp45ekn5QXD5vXL6vTxu8A/Ec3+YF9+p08bvAPxHN/mBffqdA8cvST8oLh83rl9Xp45ekn5QXD5vXL6vTxu8A/Ec3+YF9+p08bvAPxHN/mBffqdA8cvST8oLh83rl9Xp45ekn5QXD5vXL6vTxu8A/Ec3+YF9+p08bvAPxHN/mBffqdA8cvST8oLh83rl9Xp45ekn5QXD5vXL6vTxu8A/Ec3+YF9+p08bvAPxHN/mBffqdA8cvST8oLh83rl9Xp45ekn5QXD5vXL6vTxu8A/Ec3+YF9+p08bvAPxHN/mBffqdA8cvST8oLh83rl9Xp45ekn5QXD5vXL6vTxu8A/Ec3+YF9+p08bvAPxHN/mBffqdA8cvST8oLh83rl9Xp45ekn5QXD5vXL6vTxu8A/Ec3+YF9+p08bvAPxHN/mBffqdA8cvST8oLh83rl9Xp45ekn5QXD5vXL6vTxu8A/Ec3+YF9+p08bvAPxHN/mBffqdA8cvST8oLh83rl9Xp45ekn5QXD5vXL6vTxu8A/Ec3+YF9+p08bvAPxHN/mBffqdA8cvST8oLh83rl9Xp45ekn5QXD5vXL6vTxu8A/Ec3+YF9+p08bvAPxHN/mBffqdA8cvST8oLh83rl9Xp45ekn5QXD5vXL6vTxu8A/Ec3+YF9+p08bvAPxHN/mBffqdA8cvST8oLh83rl9Xp45ekn5QXD5vXL6vTxu8A/Ec3+YF9+p08bvAPxHN/mBffqdA8cvST8oLh83rl9Xp45ekn5QXD5vXL6vTxu8A/Ec3+YF9+p08bvAPxHN/mBffqdA8cvST8oLh83rl9Xp45ekn5QXD5vXL6vTxu8A/Ec3+YF9+p08bvAPxHN/mBffqdA8cvST8oLh83rl9Xp45ekn5QXD5vXL6vTxu8A/Ec3+YF9+p08bvAPxHN/mBffqdA8cvST8oLh83rl9Xp45ekn5QXD5vXL6vXPa+K/T+8X+z2ZCskt867y0wYRu2JXWA08+pKlJbDr8ZCAohCj1UO41X1EpjlW43HXm2829BGfHL0k/KC4fN65fV6eOXpJ+UFw+b1y+r18tq4ztNL1bY1wt6cwuECU2l6PLi4Le3WnmyN0rStMQhQI6gjpX1eN3gH4jm/wAwL79ToHjl6SflBcPm9cvq9PHL0k/KC4fN65fV6eN3gH4jm/zAvv1Onjd4B+I5v8wL79ToHjl6SflBcPm9cvq9PHL0k/KC4fN65fV6eN3gH4jm/wAwL79Tp43eAfiOb/MC+/U6B45ekn5QXD5vXL6vTxy9JPyguHzeuX1enjd4B+I5v8wL79Tp43eAfiOb/MC+/U6B45ekn5QXD5vXL6vTxy9JPyguHzeuX1enjd4B+I5v8wL79Tp43eAfiOb/ADAvv1OgeOXpJ+UFw+b1y+r08cvST8oLh83rl9Xp43eAfiOb/MC+/U6eN3gH4jm/zAvv1OgeOXpJ+UFw+b1y+r08cvST8oLh83rl9Xp43eAfiOb/ADAvv1Onjd4B+I5v8wL79ToHjl6SflBcPm9cvq9PHL0k/KC4fN65fV6eN3gH4jm/zAvv1Onjd4B+I5v8wL79ToHjl6SflBcPm9cvq9PHL0k/KC4fN65fV6eN3gH4jm/zAvv1Onjd4B+I5v8AMC+/U6B45ekn5QXD5vXL6vTxy9JPyguHzeuX1enjd4B+I5v8wL79Tp43eAfiOb/MC+/U6B45ekn5QXD5vXL6vTxy9JPyguHzeuX1enjd4B+I5v8AMC+/U6eN3gH4jm/zAvv1OgeOXpJ+UFw+b1y+r08cvST8oLh83rl9Xp43eAfiOb/MC+/U6eN3gH4jm/zAvv1OgeOXpJ+UFw+b1y+r08cvST8oLh83rl9Xp43eAfiOb/MC+/U6eN3gH4jm/wAwL79ToHjl6SflBcPm9cvq9PHL0k/KC4fN65fV6eN3gH4jm/zAvv1Onjd4B+I5v8wL79ToHjl6SflBcPm9cvq9PHL0k/KC4fN65fV6eN3gH4jm/wAwL79Tp43eAfiOb/MC+/U6B45ekn5QXD5vXL6vTxy9JPyguHzeuX1enjd4B+I5v8wL79Tp43eAfiOb/MC+/U6B45ekn5QXD5vXL6vTxy9JPyguHzeuX1enjd4B+I5v8wL79Tp43eAfiOb/ADAvv1OgeOXpJ+UFw+b1y+r1POIril03zTh/1LsFlu1ynXi641coMKKmwXFJefdiuIbQCpgAbqUBuSB16mqH43eAfiOb/MC+/U6+S68ZumVot0iZcxllvgtJHbSZ2EXlhlAJCRzLXECUjcgbk7UFkxkKRj1tQtKkLRGaSpCxsUkIG4IpX3R0BCCAkJHoH/n4vipQR/jL9yhq4fRi1xP/AOHXVdhJ/wBij9T/ALtPn9VSLjL9yhq78Frj9HXVehfcbH5tP7KDm5fWflpy+s/LWtKDTl9Z+WnL6z8ta0oNOX1n5acvrPy1rSg05fWflpy+s/LWtKDTl9Z+WnL6z8ta0oNOX1n5acvrPy1rSg05fWflpy+s/LWtKDTl9Z+WnL6z8ta0oNOX1n5acvrPy1rSg05fWflpy+s/LWtKDTl9Z+WnL6z8ta0oNOX1n5acvrPy1rSg05fWflpy+s/LWtKDTl9Z+WnL6z8ta0oNOX1n5acvrPy1rSg05fWflpy+s/LWtKDTl9Z+WnL6z8ta0oIZxOJ/9MaKf2hwfokyrctI8GII3HL3VEuJz+GNFP7Q4P0SZVuX9zq/o/5UEh4O/K4VNJD3f+q9u7v6uirDy+s/LUe4Ofcp6SfBe3/R0VYqDTl9Z+WnL6z8ta0oNOX1n5acvrPy1rSg05fWflpy+s/LWtKDTl9Z+WnL6z8ta0oNOX1n5acvrPy1rSg05fWflpy+s/LWtKDTl9Z+WnL6z8ta0oNOX1n5acvrPy1rSg05fWflpy+s/LWtKDTl9Z+WnL6z8ta0oNOX1n5acvrPy1rSg05fWflpy+s/LWtKDTl9Z+WnL6z8ta0oNOX1n5acvrPy1rSg05fWflpy+s/LWtKDTl9Z+WnL6z8ta0oNOX1n5ahvG22PFZ1GXuTtbgAD3f71HWrnUP43Pcqajf8AL0/4rdBbWvailGvailBHeMv3KGrvwWuP0ddV6F9xsfm0/sqQ8ZfuUNXfgtcfo66r0L7jY/Np/ZQc9KUoFK6W/wCY2jGLhY4VyliNJvc32PgIKSe2f7Fx7kGw6fa2XVbnYeQfPsD3VApSlApSlApSlApSlApSlApSlApSlApSlApSlApSlApSlApSlApSlApSlApSlBDeJz+GNFP7Q4P0SZVuX9zq/o/5VEeJz+GNFP7Q4P0SZVuX9zq/o/5UEh4Ofcp6SfBe3/R0VYqjvBz7lPST4L2/6OirFQKUpQKUpQKUpQKUpQKUpQKV1M/KrVa7xbLVLnMsXK59r4HGWoBb/ZJCnOUeflSQTXag7gGg1pSlApSlApW1bgbTua6/HMjtuXWSJd7PMauFtlJK2ZLCgpCxuQdj74I+Kg7KlKUClKUClKUClKUClKUClKUClKUCofxue5U1G/5en/Fbq4VD+Nz3Kmo3/L0/4rdBbWvailGvailBHeMv3KGrvwWuP0ddV6F9xsfm0/sqQ8ZfuUNXfgtcfo66r0L7jY/Np/ZQbpElqIw488sNtNgqWtXckDvJra3MYeaS626lxtQBSpB3BBG42279x1HprxuukRc7RTP47e3aPWCehPN3bmM4Bvt5qwOx+46PxeH2w3XD8inO8QDNthKtzcqfJcv7lzSEcrBjqVupkn7XycnZdkfR1oMuuIRCZuoGgjKVAKOcF3c7joiz3JR/8Pjq2GQ2DtzdfeNRPXE76vcP6f5ByyYdyfOLHciP86j/ABB5lheUa837Gs3yHJbLbcbxyKbdJx+LcFeB3SW48vwsLitqAcabZjlHaEp8tewPlbBmcXEgbk9PTtXwIyG1uXd21IuMVd0ajplrgpdSX0sqUpKXCjfm5SpCwDtsSkjzVjlkueZfk/DPpdCuAl49mufvWqyTJTCDHfhKebLs11KFdW19gzIKR3pUpPor5dL9Lsb0i4vb3asRguW21z8HjSHIapTjrbbzc5xvmRzqUQSDurr1PU9SdwykTIbUEkK9t3dO+in0JUElXU93SsWdAJzeUagS3cpzvJYeqsG4TXLph0q5LYh+CFxaGEMwljkXGS2WVpkNArKvbOdSiui4icyw/I9fZuMZveMgtVjx7G2pMR2xRbiss3OW85ySSuIhQS4y3GHJ2vk7vL6HY0GYwUFHpWtTfh2yXIMt0Tw275XHdi5DJtjKpokNFpxx0DYulBAKO02C+UgEc2xA7hR++g+SZd4Nvkw48qYxGfmuliK084EKfcCFOFCAfbK5ELVsNzshR7ga5/CWuUq5vJA3J27qx54wcbYyudo1bZdwuVshS83REfftL5YkFDlsuCC2lwdUJXv2alJIUErVykHY1ro5j1v0n141HwGwoNtxQ2O0ZHEtKTu3EfeXNjyC3vuoJX4GwopJ25uZQ6rNBkL4S3zbc3X3j71cgUFd1YMnHFy+Gx7iTKpLWpTrQzZM1Mt0hm3h0PexoSFcimfAh2PKU9VHtPbbbZxsKStsFJ3SRuPeoOCRdoUSZHiPy2GZUjm7FhbgC3eUAq5U96tgQTt3DvrmTJbUOiu/rsQQfkrGniawO36ja+aG2O7S58e2yVXsvtW+SuOuUEx2VhhbiCFBtXIeYAgkDbfYneR6YWaZp5ZcN1B+yG+3W6nUt7C1CfcXXmjZhOftUeIW+bkIQpDL3OU85WFEk77EM8y+gd6vQK08Jb5FL5tkp7yRWOWT4TbOIDiEyvHssZdnYth1mgJiW7whbTS580vrdkKCCkqWhpphLZ38ntHCOp3Hkb5ld4jcB+rEadd5lzvGLxb/AIz7MSFkyZKYrz8Vl9xXeXS0GypW/VW56b0GXqHUObcp339VaF9CTsVdd9qnWk+lD2mjMpUnM8my6VKaaS+q/wA0PtpcSDzONNhKQ1zbgcqfJASnYd5OIOl2qdvyq/YTnFgnZLI1JyfLCu621cC4+Bu2SRIcaEfdaBH5IzHYOpcSdwplwg+WoEP0GBCgCOorQrAOxOxrRvYIGx3HprEXWjVXWe5cYcbSHTW4WW2WuXhjd6l3G7Q/CDbD4Y40uS2kFJcXsG0JbUeTcgnbZRIZdB1J89apUFdx396sI8g1x1n0H0STac4udpn6iXbNJWO2TK78wxBhexiN3TdJLLaglKEtNvHlBG32snm683Lwia26oZzq9d7K5m7esem8aC4p/ORi6bNGYnhSOWNGWhXLJTylRV5P3pCth5QV/WjiqjaW6lWXT6y4lf8AUDN7pEVPTZ7C03tFihZR277ri0pbSVAgb9OnUjdPNcYclT0Vhbzbkd1aApTLvKVoJG5SSklO47uhI9BNfn3ptg+v2V8XerUteoOJY/ldjtdkhzpcPHFzI8iM+l55ttpLroW2AUHn2V5RI7uUEWHUrU/VHVbXu86QaTXmBgzWL2+PMybL7hbkz3WHZKOeNHjR1kIVujqVL83N3cnlhlWlQUNwdx6a2l1AOxPXvrCHB+MHOrRwtZfkd+bg5Xn0HL5GEY8IsIx03aZztsx1utJWQCVqWpSUlIKUgDY7E1LTHTbiExqfJ+y3WCy5jb7lBf5kqxluI9aZakDslRy2oB5sKKtw6ASEjoOY7BdYeZ2G45Pccci3eHIv1uaafmW1t5Kn47bm/ZqWjvSFcp239Fdxzp32369+1fmjgmimubXGfnloa19QzlCMfts64344jEV7IRedSEMljm5UcoSRzJO6t+vd1tOS6ma2676055iej+Q2PBsbwEsw5t1ulsMx66XNSCtUdAV5CGUgBKlAc4OxBUFgJDMVS0p23PedqFaU95rA3K+MzU++cPeheXYZZ7TBznL8qTjVwtVxQp2G4+kyGHBuCFIQp1sOAhW6R0JVsSr2sG+8R2jsrVO65hOi6nWyDiab1Zm7faW4TLNyCneaE0hsl51ASkKUpZKiOXblJO4ZelYHea3V+d3ClnedcRWd4hlquI6FfbrBf8Ov+m8W2rtbMGIplaVshsgLkqQ4ttIWrdCfbcyjyhX6I0EN4nP4Y0U/tDg/RJlW5f3Or+j/AJVEeJz+GNFP7Q4P0SZVuX9zq/o/5UEh4Ofcp6SfBe3/AEdFWKo7wc+5T0k+C9v+joqxUClKUClKUClKUClKUClKUEN1ZUnxjtCgk+Uhy+OEfzfAQP2qR+qrQuUhCEpQok9QDsSOnQ9fj/b6DWPGvenli1b4i9J8fyJp+Vaoljv90eiMy3I6ZBDluZShwoUlSkbvE8u+xKRvuNxXdcOcdvEcl1M08juyF2vGLy25aW3nC4I8KXEZkIZClEqIQ6qQkb9yeUdwoK7iki8HHLacl8BTf1shUxFs5zGS55w2V+UUju3IBO2+w7h9L2Q2uNdodreuEZm5TULcjRHHQl19KNucoSeqgnmTvt3cw9NYZYVk0ix8Iumjd1vkzG8cumSTIWQ5ElxTbkOCZc5aVF0bFpLziI7HbbjkTI3BB5VDg0v+xC28XeHS9OoLkjTqVbJlpYuKJsh63Luy2zIdXDS4opWQxECHHkbpVzoTuVJVQZy1xh9skgK3IAPy91clYZa0/wCr2RxkrtupWXScbscvCIHYw13dy2QZ7yZ8/ZD7qFI3KQrdDZWAolXRXL0DMdxbbrZG+47/AD9Nv2VFeC9oROGHCHlkJbltyZre3cESJbzqAPVyuJFdDwy3mJIf1MteK3pzI9ObPObbx65uTHJyUFcVC5EZqUtSu1aac6p8pXL2hTuQkbdTh2cTNKP9Htg93tDfNe/sOtES1JIBSq4S2mGI3Nzfye3fbJ9W9Bkq5fbczc49ucnMN3CQ246xFW4A66hBSFqQnvUElaNyN9udO/thvys3OJIffYaktOvMKCHm0KClNqICgFAdxIIPX0j01iXaNFrbo7xRaPvQLpebjcbrYr4zdZV0uT0sTH2xEUuUUuKIQ4tRPMU7JISgco5RWjuhVs1g1117but2vXPFlW826JDuDsViFKXaY6UTQGykqfSWwEqUSlIB2G6juGXhdSO87e+KNvNvAFC0rB6gg771ixf9WcivvCBpxl6LvMtAvLNo+yi/2xpLsm2RFpT4dJbHIpIIUFJKykhtKyvbyKtejVsgW/EmF2nNZ+eWeUpUqFdJ8xqYrsVhOyEvtpT2iQUqIKuZXlkEnYAB7+lKUClKUClKUClKUClKUCofxue5U1G/5en/ABW6uFQ/jc9ypqN/y9P+K3QW1r2opRr2opQR3jL9yhq78Frj9HXVehfcbH5tP7KkPGX7lDV34LXH6Ouq9C+42Pzaf2UHU5zCcuWG32I0hbj0iC80hDftipTagAPXua8pw8xJaNAtN2rnDegXFrHLa3KiyWi2406mK2FIWlQCkkKGxBAII2NUilBLdWcFu+R5xpXfLS1Gfbxi/uz5rL73ZKUw7AlRVKb8khSkmQlXKdtwD13rzeo+mWoEbUG85Tpxe7DaHMjtEe03RV4iOOrjKYU+WZrARuHXEpkLHZOAJVyI8odQbtSgkmpull8yHDsOasF7a+yfEp8a5wpV6SVsznW47kdaZJR1Acbed3UgEpUQoA7bHy2lml+osPXDIs9zq7WSULnYmLWxbbL2gat5bfcWW0KWkLcCgoLLiglRUrblASmshKUGKjGkGq9/nadWnIxjc6Jh17aujWcLuj7t4kx0LVzMmOWNkOOtcrbp7dSSCTsrpt7fUvTTP4uoc7LdNrtY4U6+Whmz3Vq/MuKQyWFvKjzWezB5nUeEOpLauVK90eUnl63SlBEtesLyaXwuZZjOPzp92y04+qHGmJcDUqXIS2Bz8ydglayCehA3V06VZ4xKmkKVuCUjcK7x0rmpQSfX/Hbpf0afPWqE7OcteY2udIQyeqI4Wpt1wjzpQl3mPqG/mrgteG3lridyrLH4JRj0zEbZaGJZdR9skMzJzrqOXfmGyH2juRseboTsar9KDD9/TLUKDpPI0Ai4q/IxV5/2Mi5mZ8fwaPYlPc6mnmioPF9LHNHAQ2UKJQoqSCrly8aGw222ArkpQSnU7ErpetX9Ir7BhGRDsdxuCp8hK0jsGXre+2lRBIJ3dDSdkgnyge4EiY2vRrLW8NwWwyrW2tEbU+dk1wWmQjljwjPnzY7h3IKiVKjJ5U7kFY3HRW2UlKCC5nZ8t001juefYtisjOLbklri227We3So8eXHkRVPqYkoMhxttaFJfU2sFQUnkbICgSB0MzRzJnuDzULFZcNmRm+UW69XN+HEcHZouM1T0gR0KUR0QtxDQUeh5QSetZMUoPggFcqAyX0lt4tpLiTtulRHUb+nzVB9NNHdRdPZthxlvJrWzppj0x+REMVt32Vmx1B0MQpHNu2G2+1BLiN1L7FvoglRrIelBsZGzSRsR79RNvRi9s8Z8jVgyIJx13BkYyI4cX4UJIn+EFZTy8vZ8nTfm33PdsN6t9KCCcXnDcriJxKxNwHrQxkeO3FN0tvs/AE23yFcikLjyWiCS04lWxI6ghJHdtXVafYXxCv5hjZzHIMBxTCbKOljwSFIcVPAaLaGXFSUgMtJBCgEDfyQN+4jJClBCtJMAyKxcUOuuV3K3mNj9/j4+zaJZcQfCRGjPpfPKCVJ5VuhPlAb7dNxXlsz0U1Ww7iDy3UjSa5YjJbzCBDYvNpy8yW0NSIiC0w8yuOhRUORSgUK28/ldRy5PUoMH8R4L9RImlmVY7dcqsEPKjm6NQccyK0suqaauXkrcbfjuI2S0HEqSnlWslLhJSOXlVZNN7bxDzc7gTNRLngFqxiGw4l634k1MkPXB1SOVJU5ICexQlXlAJ5iSNjvvzC+UoIvZdILtC4r8h1Q8JhpslxxSJYkRgpfhBkNynHVLUOXlCORSQCFEkk9Bt1luVaE616dan6hZDopfsQatGdutzLhFy1EouWyclBbU/G7FKkr5hsohY9sE9CAd8uqUGI7nBrPxzAeH7E8cuseSzp9lcfIbtMubi0uTTu85JW2AlXlKdeJSlR2CSBzHbc33VyBmV4wm4R9Prrb7JmPK2qBMu8YvxUkOJUtDiR1AWhKklQBKebcAnYV7ulBiFjfD5rJnHEdgWp2qr+ndr+w1iYIycJZmLk3Bchks8j7kgJ5W0BSlp2KtiVDbyuZOXtKUEN4nP4Y0U/tDg/RJlW5f3Or+j/lUR4nP4Y0U/tDg/RJlW5f3Or+j/lQSHg59ynpJ8F7f9HRViqO8HPuU9JPgvb/AKOirFQKUpQKUpQKUpQKV12RXu341Y512ustmDbILK5MmVIWENstISVLWonuAAJJ9VTrRHNst1Nbm5Td7XEsWKT1BzHoDsdxNyXG2PLJlKUrlT2o2WlpKAUpKeZRVuEhVqUpQY/a56TZxlOsunueYTOszErFrdc2FxLyXPB5i5K4iQysoSVISW0vq7RIUUqQ35KgoivVaNae3vE5eVZHlkiDJyzKZ6ZUxFqLhhw2mmkMsR2isJUoBLfMpZSkqWtZ2A2FVelBj0zppn+n3CzasQxucw5mFqYYadkW91KVvMiQFyBGceRypfWyXEtqcTypcUCSACquo0J0tzWXqQjK8wcyK3Y/Z2nWsfx7Kbqxcrg0++lAkyXXmSpIRs2ENtlxxSeZ4kpC0oGTlKBUNFldncWF+My2LmWSbgsKOt19jmjOOInyiWiSCkq5XQop37jvtVypQde7Bai2xUaO2hloNdihttIShCdtgAB0AFY/WLR/J8g4QsSwK5oYxnMcdh2tqOp9SZEYy7Y8yuO4ooPlMvLiNq26LCHOoSoEVkjSgxrtmDatX3iPwrNcyYxuNj9otFyhIt9gluSRGed8H2dU8800taneVSQhLfKgNE8xLhr12m1ouVs4gtYpsm3yWLbcvYZ2JMW2Q1J5Ii23ORW2x5CkBQHUbjfvFWalBjJp9g+pmA8N2lUG0RI7GUYwtuTc8emS0tN3Bnsn0ORe3QlaUKBdS4lXVJW2kHYEkeo4ccDyTGr/AJ1kN4sEHCrflEtmexicGWJIhPpb5H31qQlLYcfISpSWwRujmKipaqudKBSlKBSlKBSlKBSlKBSlKBUP43Pcqajf8vT/AIrdXCofxue5U1G/5en/ABW6C2te1FKNe1FKCO8ZfuUNXfgtcfo66r0L7jY/Np/ZUh4y/coau/Ba4/R11XoX3Gx+bT+yg56UpQKUpQKUpQKUpQKUpQKUpQKUpQKUpQKVoTsCT3CtErSsbpO9BupSlApSlApSlApSlApSlApSlApSlApSlBDeJz+GNFP7Q4P0SZVuX9zq/o/5VEeJz+GNFP7Q4P0SZVuX9zq/o/5UEh4Ofcp6SfBe3/R0VYqjvBz7lPST4L2/6OirFQKUpQKUpQK2rWGwCe6t1T3XrUR/S/S+73uBFTcb2oIg2e3K/wDntwfWGYrHm6LdWgE7jYEncbbgJxkrUriT1Tm4kOzVpfiEtBvxUpX/AKauiSHG4IA8ksMAocd3J53C2jbZDgOQjLQQhIUlPMnu283/AJFeK0U00a0l01seNIfVNkxWOebOd/3kyW4S5IkLPnU46paz/Sr3VApSlApSlApSlApSlApSlApSlApSlApSlApSlApSlApSlApSlAqH8bnuVNRv+Xp/xW6uFQ/jc9ypqN/y9P8Ait0Fta9qKUa9qKUEd4y/coau/Ba4/R11XoX3Gx+bT+ypDxl+5Q1d+C1x+jrqvQvuNj82n9lBz0pSgUpSgUpSgUpSgUpSgUpSgUpSgUpSg2r9orfu289Srh7yW7Zhbs6u1zmKlxlZhdYVtQSClmLFe8EShOw7iuO4vz9Vmqqs7IUfQKifBUVPcMOBzHVc8m4RXbjIXttzPPvuPOH41uKNBbqUpQKUpQKUpQKUpQKUpQKUpQKUpQKUpQQ3ic/hjRT+0OD9EmVbl/c6v6P+VRHic/hjRT+0OD9EmVbl/c6v6P8AlQSHg59ynpJ8F7f9HRViqO8HPuU9JPgvb/o6KsVApSlApSlAqFalqTnXEhpnialJdhY9EmZjOZV7XtU7RIJP/W9IWNxtuwD5qutQ3Stw5NxJa2XWQElVo9h8aj9O5pEQzVH413BQ95CfVQXBHtR71bq0A2AFa0CtCoAgEgE+atax441dbJmkunUG2WCQGMyymSq2Wt4bEw0hBXIllO437JsHl7/ti2wehNB8etHG3jumd+l41jtrfzvKoqyiVDhOCPDgq2B5JEpQKUr6+0Qlah50p7z3vDVxQt6/Sb/a52PnFcisqWXZFvMwSm3GHebsnmneVBWCW3EqBQOUpHfzCvzqeu9iwaPFt7s0+Fu7lDBK5EqStSipS+RIK3FqUVKUoA7kk+eve6DZNn+Daru5tZNPX3GnrE9ZmzkU1FubHPIZd7UpQHXtvtWwSW0k82+461HbJTHG7TpJWlr/AJYfqbzD0j5acw233FYVTdXdcr4hRXlWIYsFdQzabA7MUj/3r0gBR/8AdiuqXkGsT42ka1XZJ33/ANhsVraT/wB6Os/rrknnceP9TojiZZ+GdW49IpuKwQVJ1HlI5Zms+ZPA9/YNW1j+5EBr5Ba8ySOur+fn/wCsmB/+hWv8fg+/+Gf4PKz65h6RWnOnfbmG/o3r8/38ZyGYoKl6qaiv+kJyNxgH4mkpr6o9tyq0RX2LJqZmduVMAbmyZd3cuTzjQ38lpUouCOrr7dpKVegjYVr/AOQw715Z/g8uts9u0TvtzDf361Cge4g1gxBk5jaJVnRB1Fydq024pWbe/IRLVLcDqnCX5D6FvLCidikKA2AA2HSvc3DiY1Nskt4wsPxjI7ajl5Frvb8KY6OUcxKPBnEA8xIHlbdB7Wt8fOw5J1tpfi5aedMrt61rGO0ccUFp1lrKtNM2xoFO7s2PEZusVs77dDFdW6R6+yB9IFWfTTWTDtX7cqbiN/h3ppvcPNsrKX45B25XWVgONK9S0g121vW/5Z25prav5o09rSlK3alKV0V5ziwY4tpF3vVutK3VcqEzpbbJUe/YcyhuaDvaVtbX2iEqHcoA1uoFKUoFKUoFQ/jc9ypqN/y9P+K3VwqH8bnuVNRv+Xp/xW6C2te1FKNe1FKCO8ZfuUNXfgtcfo66r0L7jY/Np/ZUh4y/coau/Ba4/R11XoX3Gx+bT+yg56UpQKUpQKUpQKVxvPIZQpSyEpSCSonYAeepFfOKzTe3wblItd9OWuwEKLkbGGVXFSlhbaC2lTQKOcKdR5JUCASr2qVEYmYj3LMRM+lhpWL8jjXkuLbXbtH83lRSN1OSXrZHX8SDMJ+XavTY5xe45eIM6VcMWzHHTDW02tq5WxC1OBatlKR2DjoWEbbq2O4B6AnpUXex/qj/ANt5x3j3C9Uqaac8R2nWq1zftmNZMxLuzCS45bJTLsOYlA71dg+lDhSOnUJ26j01R0upIHm3O3X01LExPmEfmPbkpSlZClKUGivanfu2qIcFDbkfhiwiI6NnIbUiGQfN2Ul1r/8AJVvV0SfeqK8LbhgWjULHFJDXsDm14jtsg+0ZkP8AhzXvDs5advVtQWulKUClKUClKUClKUClKUClKUClKUClKUEN4nP4Y0U/tDg/RJlW5f3Or+j/AJVEeJz+GNFP7Q4P0SZVuX9zq/o/5UEh4Ofcp6SfBe3/AEdFWKo7wc+5T0k+C9v+joqxUClKUClKUCopoMB/rW4gO7n+y+Lv6QPYS27f51a6hmCLRiPFTqXZlH7Xk9otmTs9NvtrYXBkD17JYiE/0x6eoXOlad9a0G1ZAQonoNutfmtxb3HINWeMSTiNpeNviY7Yo0Z65KQFpgNyD27ziAroXndoyEAggBpSiCEkH9CM71Ax7TXHpN7ye6x7NamAAuVJVsCo+1QlI3UtZPQJSCSSAATWEDjmZZVqxqJmFp0pzS7WzIZkR6BKciR4KlRGYTLaApuU+ytPlh5QBTvssEgE7DnzzeMczjjcpsUUm8Rf04sD0yxzTmKtFngBMx3YyLlIUXZclWw3U46rcq32329qOuwA6D1NdLjmXRMjkT4RjzLVeLc4G51ouscx5kQqHMntGz02I6hSSpJA3CjXd8p369P8q8hk6+uYye/8vRV6dR0emlK6K+Z7jGMOdneMjtFpWdhyzZ7TJ97ZSga5rDmNgypJVZb7bLuANyYMxt7YenySelYmtojcwzuHb0rUgjvrStGxSlKBStR1PftXm7pnsGFffYK3wbrk2Q8gdNox+CubJbbO+y3AnyWknbvcUit60teemsblra0VjcvR15u/4LDut1j323POY7lsMhULIrYhCJjBG3klRBDjZA2LawpCh3jcA1yXfIsixaAu4ZHplmtgtLW6nri7BYlNMJAJK3ExnnXEJAG5UUbDzkV3FuucO8wI863ymJ0GQgOMyIzgW24kgEFKh3jrU80y4JiZiYlFFseaNR5eis3ExqjiSGV5ZZMeye0suNpfmWBM1m4KaKglS0Q0tvhxwDdRSHEJ2B6pArIuLq1jB04fzR+4tQ8dYiLly5T60/7IED7ah3lJCVtkFKkgkhSSnvBrFvp5xv089TnOdFLdlMe6i13KZjT115HLgiGUrhz3UKSttcmKvdp0pUlJ59kr6A83dtZYPxGY8ZvX24cvD35xOn1h18y7iDuKwqdccWwMKPgdhhvriSZiOvK7NWhQWNwdwwkhKQUhZUpO4g+GYpaMjly7wnHrIixOl1mKh6Cl6TK5V8pfW6vc7EpXsnr0IJPcB6+0z3mbrd7RcL7Z7tJhS3IaFwW1R3j2ailfaMLUooO4BGxIKSCCQQa6zSl4N4XFtawETLMtdslIA6hbR2ST/SRyLHqcq9idxuPSqmJrOpWnht1fvGhGf2CxCc5L08yC4s2p61yXSpNqkvqCGX4xJPI2XORC2/a7OcyeUpVzfpY30QK/JaLbnb7l+D2aKjnmXHJ7U2yNj07OU2+4o7eZLbK1H3q/WlHta2YbqUpQKUpQKh/G57lTUb/l6f8AFbq4VD+Nz3Kmo3/L0/4rdBbWvailGvailBHeMv3KGrvwWuP0ddV6F9xsfm0/sqQ8ZfuUNXfgtcfo66r0L7jY/Np/ZQc9KUoFKUoFbVnlTvW6tjgJQdqDCnjb1UnTtSYukEu9XnHsOuuPJuF3k45aXps2S07JWwtoKajvlsBLe4AQntOdSS4jYBUcw3WHEsPxmPa8jyK2WeTEffaiRZaW4csw0uqTHdfio/3C1tciighIBPtU9wouvFru+oeveovY3eVZXbZHt1ghTW0HePFW0iXJ7A7jZxwvcvaddi230PLWNWrelT2kmYW++4jbrgnG7iymBKgQXkrCri4pLUdS+0V05yUgukq8oeV7brU57Y+Rk7Fp1pY4Yvhr3q+WTdjymy5TFTJsl4gXVjk7QOwZKHk7bkAnlJHeCNz5wR3g7RQ5/mCol0kSLzeWMyjo7SHiyMVddgyXe3dbMbwkMAJaDaWleE+FbHtCShPKRXdYHw32qx4RZ2rioxM1aJlScltjgTNElX+8+2lJ50bHl5FJKCB7XerEwhTLLaFuKeUlIBcWAFLIHUnYAAnvOwH7KqYtiwzPTHV+/wD27+nJkiNzp0WbYBaM8thiXJjklNpUuHPjkokwHSno4w6NlIUk7bbEb7dQQSD5Lh2181DZ1yw3FWNQ5ufsyZ3sVdLFcRFccjR20L7SRu02lxstFvylLJ5yrY7qUKpnUDodyB5/R/5+KpfpbkuU6I6u6g3vDLZZr1brpOaMy2Xd92Pu52Ta1rjyG+0S2Spw86FMkkgHm2Ka6+ByIpNq3nw5+Vim0RNfb9LqViExx/fYq+hWouCvY5b5C2W2J9luHsky0VKIWZBW0wWwBsQEBxStlbDfYHLC13WNeLfHmxXUuxpDaXWljpzIUAUnr6QR8tXtclb+aztU2rav5o0+2lad9a1I1bVnZJ96obhjqsN4pdQLO5zGPltog5LEUkeTzxx4FKHvhIgn3nPVVzI3BB7jUL4lmDhlxwHVJlfZIxK7CPdiDtzWmbtGkb7eZtwxpB380ZVBdaVtStKwClQUD1BB3rdQKUpQKUpQKUpQKUpQKUpQKUpQKUpQQ3ic/hjRT+0OD9EmVbl/c6v6P+VRHic/hjRT+0OD9EmVbl/c6v6P+VBIeDn3KeknwXt/0dFWKo7wc+5T0k+C9v8Ao6KsVApSlApSlAqEcSQXgNxw3VptC1x8RkOs3xKElRNmlBCJTmwBJDK0MPkbHyWF+qrvXwXu1Rr5bJVvmxWpsKU0th+NIQFtOtrSUqQtJ3BSQSCD5t6D6mH0PNpUhQWCAQUncHcemuQ9xqW6B4TlGmmPScRvUhq5WSyu+DWC5l4rkvwO9pD6SkbLaH2rcE84QlR2JIqpKG4oIDaYI1Y4mcrm3pKJNp06EW32WC4AUN3CRGRJkTCnbqsNOx2m1Hfl2e5duck+30jy/Mctm5onLMLOIxbZe34FneVKS6q5QmzyoklI6o5ttwD5iPRuccdcZ2d6a8V9wnYXfIWOxMlxyHKdaudu8Oh3CTGfdZdUpCXW1IdQ27DSFJWkKBAIVyp5evmam66SwXXtTcdtKPbbW3EwEpBHTyn5LnTv/wDGuXJycVJ6bT5T0wZMkdVY8Pa8cdhg4pZ8e1VgtJTebHPj22c2wlSnrjb5TyWlR0oAParQ6628hJB2KVbdVHfEHULO7zdpMKLe03Bh6aPC4uE2OWYknwbqA9cZyTu0Dsdm29tz5O69jt73CrxnOul2jZnqBk32R2S2PL+xmAxBRCYWpPkKuC2UqVutQ5g3zKOyTzjYr2EgxvIRkV0uOTSQpt7Jpz70da1JADDZKIzIBPNv2LZUABt7ck7nrz/0+Rm8R+X3Kfd8GL37l91qVe7QOSz4jp/jG42Km7a7NfI/nuktFaj5yR1NbjLyGHeo15fxzBLxcYzgfbkItTkCSkjr5L6XHCD74I9NfPqHd3LDgd/uDCy1IYguqYWOpDvKQjb/AKinp3V3cNDjcVlDqy46lCQtfnUrbqa6v4fHO9x7c/dv9vVad6q2+Vm82Nenrzjlxu5b7C0Xd1D8JT6QQREkJJAKkgbsnlJKdwndRJs5G23rrFrMY1rk4vdTd0JXb2oy33PMUBA5udJ/kqTtuCPOKyD06lSpuAY2/OMgzHLbHLypagp0udmOfnIA3Vzb7nbv3qi53Grh1evyteLmnJutnoaUpVSsHntQ8odwnA8hyBmN4Y7bID8tDABPaKQgqAO3m6dfQKyD4frBY9KuGu3ZDZmZGRPTrKMjuE+Owrw29yHGA8p0pVsorXvshB9qOVA2AFRafCZudvkwn0JWxIbU04D/ACkqGxB9WxNeE0L4h9WdI8cRpdKsuO3ePjbfgtru16kSIPawEqDbAKm2nGnVJCm0coUhfcCD7Y3n4felYtFvas5lL31r0zT4etXHtdtMLdmD+M3PExNU6lFtuyeV0JQtSQsdASlW24JA3Hm22Jxs1jwe26Ma+2iFYI6YGO5xDmy12xjoxFuEVTRcdbR3IDrb5KgBy87W/etRPeWfiS1psrzjt1xrB8ljrHkxrbPl2xxk+jncRIDno7kenp5vIXW55PqdqMM3zGNCtTsOEu32axW6QqS1BacUlb7i3lIR2jrpbaHRKQlLQA35ia6eVnwXw2jcS5sGDLXLE607Y+9t6vRWm2/T9lak7netK83tdwnWqGlkzM5sG52SVZLfdYra0B25WZMpaiduUpeSpDjZA5k9FFJCjuNwKjmIWNqyQ5axPF1mT5S5UqYgpKXXTsjyAkkBKUoSgAE9Ee/WVIO1QHUzh7ukiZJdw6QpNmuj6XLvYEShGcUlTgL5hvqQsMqdHOClSSkFfMNj0N1wuXFf6eSf2V3K482iL0hb+BTSB3NcsXq9dmCiyQWnrfi7LqR/tClnkkT9iNwNklls79UqePctO+dYGwry2mkOPBwfHY8SyoxyLHt7DTNoaWhxENAbTs0FIJSQkAAFJIO1eqr0HtTFKUoFKUoFQ/jc9ypqN/y9P+K3VwqH8bnuVNRv+Xp/xW6C2te1FKNe1FKCO8ZfuUNXfgtcfo66r0L7jY/Np/ZUh4y/coau/Ba4/R11XoX3Gx+bT+yg56UpQKUpQK2PAltQHQn01vrpcyyFnFMWuV3fiXCe1EaLhi2qG5LlO+hLbTYKlKJPmHTvOwBNBhvlS0weIHVK1vBKZi5kG6ICYyGgqM7CaZbVzAlTh54zySVdRyAAcvLvE+KPMrnZLHCs8C1NIQ+8zOF9urwYgxn4ylSmWVHvU46qIWgOgBcRuoFYr0M6w5Lfc1k6pKtjcHKcivjLk2EXUqEezlLTHgqlb8q1ttstukp6hYWE9CQv1GdXLI7a1CXYbFCv6C6PCY0qUY6+XvSWl8qk8wUASFAb+Yjbr5fLekcnrr58/evK7pW3Z6J8S6rRrNsjz3EWrpkeOIx15w7x0Nukpea3IC+RQC299ieVQPQpIJ32HvK62FeHZKnm3oLsV9DqkIbUpKu0QO5wEHYA+g9R5x3b/e24tZUFN8gG2x333rgvMTadRp219RGyQ+IrQXtuSdkjbfqe6uuslgt9pVLkxIYiuz31S5GxJ53VJSlSiD0G4QkdNh0rtKVrFpiNNpjb4r49CTapDVykCLBeQWXHVPdkAFeTsF7jlJJGxB3329NcmlWrd34dZlot96vr+RaUSXUxhNuTgXKsHaL+1ul89XYpUeVRcJU2Ck83KCE9Nn1iumRY4uJa2LJMX2iVuxMhimREfQOvKoDqg77EK2UAU9Unzc9vthvOFt2y+2a2xRIjLiSrbDcL8UNdUBCVFCCUlG3TlTtuR5t67MGacGrxPjfmHLmxxl8TDPZtwLSkgggjcEVvrGPhK1gEe2t6WZZPJy6wtqbt0iYv7ZebagDsZCFH/eLQjZDoBJCkcx2CxWTSFFSQSNj6K9XW0WiLR6lQ2iazqW6viu9nh323yYFwjNTIUlpTL8aQ2HG3UKGykqSehBBIINfWtYbQpROwSNyTXnM41HxrTXHJF/ym9QrBZ4/RyZcH0tICvMnc96j5kjck9AN62avQMMJjoCEAJbSAlKEjYJA8wrlrEm88b1yucpxeF6ZzbraB0RdMjuPsOHj98hjsXXQjqOq0oJ69D0J6DLeJbVm949dIdjtONWK4vokph3MTXX1MAgeDnslM8pWCVcyjuBsCEq6gwWz46+7JYxXnzEM1Cdq6PJ82seGxu3vd3g2lotPPBUx9Le6Gmy46oAnchCAVHbuA37q/NG069cUGl9tuUC4XiHk1rmJLns83A9lZ1sJ35i00nsOYDfcAtuhO3RPL5I6aPrfYLSLevJr1e8huXNIkt3KdDkSH2/CF7vKOzYDKVdgnyEhI2a6JABrS+esRE087+ma4bTvq8MwLzx6WaQ6tGGYFlGZMcoU1cw21bYLw9KFyVocI9BDRB7+7rXFZOPOIw+z9mWmmUYpBWrlcucdUe6R2OhIK0x3FPcvm3DRA3G+w32x8yGFdcwtkBWPZO1Z7ZKQHnZkaKl995pQBQphxSuRskb+UUr7wRtt18zg99ueL3mLil4diIUYyn4cKKqXc5qUFSiX5UpSQlIUUrI3Snytwk9AK5Y5V586j9k84a18Sz/sPFHpHkcBqXD1KxRTS08xS7eGGnG/UtC1JUk+pQBr2uJ51j2ewnJuNX615FAbdLC5VpmNymkOAAlBUgkBQCknbffYg+esBLji9nu73azrXCmu/fyYzbitvfUk1pjDeSad3FmZh2SOwnkOvKQ1enZc6LGbd6qQxFRJaZT132LiHCnfYdw2kpzK2nVo00tx7RG6+X6NUqP6I8SGLavdvaWHnbTl0JIVPx66JDM1pO4HahAJC2junZxsqQeYDcHcCvmu+JifTl9NaUpWQpSlApSlBDeJz+GNFP7Q4P0SZVuX9zq/o/wCVRHic/hjRT+0OD9EmVbl/c6v6P+VBIeDn3KeknwXt/wBHRViqO8HPuU9JPgvb/o6KsVApSlApSlApSlAravok+et1cb/+6V3kbdye+gwg1xEHMuLDKWpMdmdEsuL2q2uNPtBaA+uTJlFOxBBISIy+7puk15HVOJZomBZJPvjkw2tuC8qU3FcIeeQU7FtJ6HdW/KDuOpA3FdhiV6GY33PMwTyqbyHJpsiOtO3lR2OWEydx3goipUP6Zrz2uDiZmPWKwlAWu+5BboWx7uRD6ZLv/wB3HX8teXz2nJyvfhe4a9GCIe7tEVi3W6NGixUQ2IzKGmYqAE9klKQEI2G4G2wG25Gw6dKxoi6LZJhMAw7jkuM4nj9vCoqMilntH32eZSmU8iihDZ27+ZauoPKD1NZQlRUST56ivEbiMq8OY3f4lv8AZlyxreW5ay2HFSGXEgOKbB6dqjkbUnzkc4HU1pxc1q5Onq1FvltyMcWruY3pDcqub9/0klOSVtOpVcmYqJTDKmm5TAuCG0PpQrqlLiNl7HzKFeuzW6yLYLYhNxasUCTLLE28ux+2EFsoUUrKdwNlLCUcyvJTzbmunuiYeY4ddZER1FxgPsh5SoSA1NcktKCgg77DmHZoRyKG4I6+YV3OS5Eprs7Rao/snkNxa3g21A5lFKt09q7t7VpJ9ss9OhA616mZjpnc6UMe/T0lk0Su2W3CIMjyOJfsajLEhhiBHUwJ423bVIIWUlA7+RHkqOxI26VkMy2GGG2gdwkbb15fS/EvsGwazWMOl9NvhsxA6pPKVhtsI5iPNuRvt5u6vVV5DkZr5b/zTvT0WLHXHHgpXS2TKo18vN/tjbTrEqzSW47yXht2gWyh1DifSk86k7nzoVXdVzzE1nUp4nfmGo6GuuvWP27IYqo9xhMTGyUq5X2krG4IKSQQQdiAR6+veBXYUrETr0TET7fLGiPR1DnlKdSOmxA7vfr6UhQHlK5juTvttWtKwaKUpRkrRSQtCkncAjbySQflHUVrSg9lwuZVlmN5GzhF9zCBkdiYhKNvM+MU3ceUORLjyXOR1ISFDmLaSSnvJrKpKuYb1+f2X6e2rMnI0p5LtvvUPyoN7tyuxmwljcpW26OoAPXlO6T5wRV04ceIqVkdxbwHP3Y8bP4zS1xJrSQ1Gv8AGQOshgdyXUjbtWR1SfKTuggj1HC5EZK9Ez5hRcrBOOeqPTI+lbUL5xvtt5q3VZuEpSlAqH8bnuVNRv8Al6f8VurhUP43Pcqajf8AL0/4rdBbWvailGvailBHeMv3KGrvwWuP0ddV6F9xsfm0/sqQ8ZfuUNXfgtcfo66r0L7jY/Np/ZQc9KUoFKUoFY18e1yu8fRAW22zhAi3u82+zz1NPrbkOR330oU0yE7BRWVJQsKUAGlOnZRASclKxj46Ulqw6YTVHeLGzaIHWyCQouRZbTfT1OOIPxVHkt0Utb6hvSN2iE5jRGIEZuLFaSxGZSG2mkJCUoQOiQAO4AbbCuXc+muum5DabZdYlsl3WDEuMw7RokiSht6R5vIQSCvu26A+b0iuwSQv2p3B6gjz14qdz5mHp9+f2aciUqJA6nvO3fWtcJS+lDxG+5WOQ777J6b/AOfyV1mX5facEx+Veb1LEWFHA7hzLcUTslCEDqpRPQAdd9qxFZ9Q13EeZdzTr5wR79QjJddbrkuOzLZZMPv1nnT2FNM3We7EbRECxsHVJS4tYKQd+TkKugHfvVttLTTNqhoYcW8ylhsIccWVqUkJABKiSSSOpJ6kk71Pk4+TDWJvGto6Za5J1WX1UpSoE7p4ci443rVp1fYVwiR2HLiLY/CuVwcjx5Cnm3A3yfanUh4J7Xl6IKyoo7RIISrPGOT2SeYbH0A71gdl+Kws2xyfZ54UlmU0UB5o8rjKgQpDiFfyVpUlKgR50isluFvVWdqxpPBm3pTf2S2uS/ZbyGxygy46y2pwJ2HKHUhDwG3RLqe/vPpPw/LFsc0+YUnNpMX6/iX1cUeeXzTTQfMcjxtQbvkKGPBXVNpWllS3EI7YpV5JDYUV7Hp5PWvzd0rcmalapZRkF/lXHI3LMEQmZeVPplS0SgtwrcZTvsw2pBRtypSDv5IA5t/1H1e0/Y1V0yynEJbhYj3q2vwi8kblpS0EJWPWlRSof0a/OHQ7GF2KxXOVc3Zj2Wvy1Q8g8NUgrYmxVKZcZAbSlAShfPy7DqFc253rr5V+jHKDBXd9/SleY+uoGzk2ez7vmERy5ZBCv8eU9Hsdoi2OGq3Pp5/tb7slxYcSyG3G+byCdyeUqJ5Be1EJOxOx9FbQyhL5eCEh3lKOfYb8vTcb+joKqMd+3uZjf7rC0TbUbbIaXm4jCZKm1SeRPbKaBCCvbyuUHrtvvtvUw1uwSfd0x8os6IEi52mLIT2E9lThUggKJaJcShC/JI3UPK3A5gKqnmFajvHQb1rTJbHaLQxesZI1ZPtEJMdvTrHbfEkqmQ4ttYQw+sJClICAPKCVKAPqBIHdue+qABtvt03rwGD44nHNR8zj29AZsKhHfbjobUhtiU6lReSjpy7ENtOEJPe4egKuvv6xeNW3v2zXWjup3Urcgbq9I7z71RtnRZTjQyBmJJiSnbTkFsd8JtN5jf7+A/5loPo3A5kHyVjcHp35ncNmrT2sulUC+3BluJf2HXbbeIbR3QxOYUW3gjck8hI50bknkWnesKcXzJeTTJjCsfutoRH2+3XEMJDu528lCXVL+NSUg+aqnwu5qrTnWHIsalsv+w2aOtXC3yWWitlie0x2b7boSN2+0aZaWlatkkoUnfmKQbPiWmLduzj5FYmOuIZrUpSrZwFKUoFKUoIbxOfwxop/aHB+iTKty/udX9H/ACqI8Tn8MaKf2hwfokyrcv7nV/R/yoJDwc+5T0k+C9v+joqxVHeDn3KeknwXt/0dFWKgUpSgUpSgUpSgVMeJTUdWlehuY5DGUU3RmCpi2gDcrnPEMxU/G842PUOtU01ibxkXgZPqBptgSFrLEaQ5ldzQhW3kRx2cQK9IMh0LA/8A7c+iosl+3SbT8NqVm9orHynmGYyzhmIWSwsHmbtsJqKF+dZQgAqPrJBPx15LUtXaagaUx+UHmvkl079w5LbL6/KRVGPU1NM/5TrJpUHSQgO3RTfoLvgmwH6Jc+T368hjmZv1T9S9JeNViI+4e2g5Pa7kqaGJrZ8Dmex7xXugCR5P2sFWwUd1pA23BJ27wQOxeYbktlDgJSevTv39NfNLagS3IsWSyy8tThkMIdbCvtjakntBuOikqUghXeDtt3dPtI2NRzr3DeNoXrppRjTVq+yBq0Mezki5W+D4Syt2M44H5TMc862VoUohK+m/oFUTB9K8cwGO43aLVGhdqQpxTQKlun0rcVupfm9sT5+6un13/ixYR/JVlFkCve9kGf8AwFUeui2S9sMRM/f/AMQVpXrnw1A3AA6AbD3qd1fJdLYxeYD0KT2nYPDZXZOqbV0II2UkhQ+I+/06H5O3Ve5sSZbryhUKK8+1KYYSh1D607oKCrvQW1g7gHvSQfPXNrcJ96l4+3u+xXEFeo2w5L1jsWWk+lcV91tf6pLXyVRj0rwl0tExzW/HLoiK4qCzj9yjOykpPZoWuTDUhBPmKglwgHv5Fbdx291UmSYtqf8ADFY1uClKVC3KUpQKU7gT6BvWvKd9tuu2/wD5+Sg0pSlZGu/Tauky7EIOZ21mNLLseTFfRLgz4znZSIMhHVt9lwdULSe7bp3g7gkV3VK2paaTuGtoi0TEqhw78RjuQzUYHn8lm36gRQRHfIDTF/jp7pMffoHNhs4yCShQ3G6FA1kWlwL3281YDagWq0XTFZKrza37xEif7UhiI0pclDiQSFschCw4NjylBCgR0r1fCtrLKn5Hb8a/1uqvEbtVxkY5m9mejXlxKWlKR4NJcDS3iNiVdqh1fKlRKt+ten4vK70atHlR8jj9rzE+GaNKUqxcRUP43Pcqajf8vT/it1cKh/G57lTUb/l6f8VugtrXtRSjXtRSgjvGX7lDV34LXH6Ouq9C+42Pzaf2VIeMv3KGrvwWuP0ddV6F9xsfm0/soOelKUClKUCsa+PWR4NpDYXXEhEFrLbM9Mlq6IiMolJX2qldyU8yUpJPTy6yUr47nbIt0hSYsyO1MiSWlMPR30BbbrahspKknoUkHYg949Na2jqrMNqz0zEvy61+tWO5herNFvLLD8eMkuModWOWQpY6eT/L5Rvyjc+3VtUf4aNSZzmuCrLjdvuBwuShcaSyXnXmI6wlxbUghe5ZWexLRQdgd+/oKtz2hGAZPkOphZxKxxGEZHLt0SJFYZV7HsNIbbCGlJ3S0oqSp08h8lTvKSFoUlPcaLaL2zSa3vMxm1S7i+SubdZKB281wrWoKXt06dovb36o8mbFixWwa3MePK0pjyWyRl3qJ8qSGT0CnCoBZUPTtttsflqA8Y+l+RahYdbZmPTJIl2h1byLdHO/hSlAI35e4qSCdiT7VTg8/XIKtFoS4nlWkKT6CKp8WScV4vHwsMlIvXplhvpxN1LyGySWBiPhc+DLdt7smZOTGCnUKKTsOTZaQR5Sk7DYgAKINZaYxCuFttDMa5PRnnmgEI8FZU2lKAAAk8ylcyuh3UNgd+4V2LEZiMD2TSEE9Dyjb3h+35a5K6eTyrcjUTHiEWHjxh3MFKbgAknYek9BSuJ1NR3/ABV6/g9uXgGqerdgcKWvCXbbfo7e2xWhyN4K4oe8qGN9vvhv31EJWX5A9l0hWPtwskscV5u33S3B3wedb3x1LqOYcrqORTZKSUnYApKtyK75WpNn0W1bxnL57S5EhMGbCciwVr8JltlAWhlKQOzUe0TuA8psDyiF7gpXacGZx5oif9UK/lavjnXwz9WApKgTtuNulYT8aPDxlkB57PNJk3lN2ua1t321WeMxK7d0R1JjSkMuDooupYacKP5CucpPZk18V8/0hOY3WQ/9i+mcC3xWlcgdyW9gPrP5qM24lPeO9zfr3eeuC28fmpENwLumnWNXFnfy0W6/vsu7ecp7SMUk+gEgb7dR316WYifEqWJ1O4TPKg5h+oyMaxS/5flku1TGoOQs5Db4QgsKU2hxwtS2UsqSpCVpPKW3ArqAR7avadR39TXs2YWDcWxumXacufYPq3EbQm5xbzF5HXWwrZtua02vlfbWlHkSG1KKB0CgQWxI8qym66W356yZ7aGYElkK5rjY5rVxiKCU8xWUNnwhlPLuSp1lKU7HdW3WqrkYLzPVSPH+Hfhy11q0vU1r3VwxJbE+K1JjPNyIzyQ4080rmQ4gjdKknzgjYj365arf8OttbaQ0pakoSlSzutQGxUdgNz6egA94D0Ct3edqV8rL6S+8sPKABCVNudwV5iN/T6uhox6fVWvcfR8VfFdpTUSKlbqlhKlgbtnlPp/yr7AQoAg7g9QaMvHWbCVWnUC73sWnHGmJaCUTokIt3HmUUlQdc3IcBKSdxy9ydwepr01igR7rrTp/AS1FbuUmWsMSJDkyGtxLaQ640zNiuBTbnZtuOBl1tbTwbUklBSkn6ydgTU21jutttdvxDILpBn3Ox2zIYkqa3bHyxILKgtopQ52jZQpRdCN+dO3MdyO8deC/9WsygyVjtzD9TuZPpHy1pzp++Hy1+UuZazu3d/2G0yY1AxBLaCjwrINQLjJ8F2CN0iMzIdSOjiSEreSSO4bda8yyjLpVqcgZdqvmmTxJI7J6LNvkhuK/udggtoWOYHp5KlHfu2O+xvVW/WyRltjiv9g/ebey9vy9m5KbSrf0bE12aHm3EhSXEqSeoIO4r8ZpmlWKot60QcTsHbJAKUuW1pYXtseQnl3HNsRzdeXm32JGxr/Cnb8vj6rW7Texai3/ABLF7japtyRDsbcZxmLIadYJ7JEpl4NtrDxJQjlHMAdvKIoP06LqEgkrSAOpJNahaSN+Ybe/UT8V9m7Wa923KdQcvy5i8+CsTkzpEdhDsRha1+CckdltKWnC4oO7ALWnySrl6V3bemuZY1Zmotgz0PvuXEypKsitKJbIj7ACKw2w4wGUJCRsfKO+5O5O9B5/ibIN40U2O/8A/EOD9EmVb1/c6v6P+VYxa0YOrFM7wK5JusqZGv8AqjbZ6YD25bhuJtshpfZknuWWwsjoASdh1NZOr+51f0f8qCQ8HPuU9JPgvb/o6KsVR3g59ynpJ8F7f9HRVioFKUoFKUoFKUoNCdqwi1HluXnij1KlPJKvYuJarKwrzJbEcylAejdUob/9Pq2zcUNxWDeRvcvEJrPGUQp1N6gv7j8Gu0QQn9aFCuDnTrBZ18WP6sPoqc6uj2OvWnd+KCWbdkTbL6+4IbksPRQT6u0ea9VUauqypEP7H5z0+2qu8eM2ZXgSG0uKeW19sQlKVEAq5kJ5e7ytuo7x5jHbptEr28bh2/N6h6etba+DHb9AyrH7debZITJgz2EyGVp+9UNxv6/SPMeh67gfeCDvsoEg7EDzHodj8RB+MVpqd6lmJiY3Cd67I3w61OFQSlnJLIsn0D2Sjj/P9Yqift89SXiTur/2DM2SyNIuuXzrhCftdnQvZyQtiU0+d/vUANHdR2HcN9yKouKZNAzTHod6tjvbQ5aOcb9FIV/KQod6VJO4KT1BB361Patow1t8blFEx3Jrvy7WgHKNh0G++1cMuYzAZU9JdRHYQCpbzqglCB6ye7/z6hXNXPqfadqTvWlKVgKUpQKUrUDfurIbEbEdD3gkV5Wz2rKbVl00v3WLd8Wldo821Ja7ObCcJBDaVp8h1r223MEqSNhzL766i6ZPfb5e5LOE3Gxy3bY74Pc7Ne2n4zrbhG6VpdSCQFJ22PZqSroUqI3r091yiNiuOJu2SONW1ttDfhKo4cktMrVsCN0thXIFHbnKQNup2qaK2rH3v4QzqZ3Pw7mlcMKYxcYbEuM4l6O+2l1txB3SpJG4IPnG3nrmqFLBSlKwyenrtv0rgtt81DxnKnpOOZdYbRaJKW0PR7rYHLh2SgTu4FIlM7956ebc9+9c9cUuIxPhvxZLKJEd9BadadTzJWgjZSSD3gg7GpsWScV+qEeTHGSs1lmraH3n4EdT77EpxTSFKfjpKEOHbqpKSVbJJ6gbnbu3O25+6sOeG/V6XpJkVs0syqWqRjs7ZjEb1LcO7RG+1sfWT1WkD7So+3QkI350AHMVJ5kg+kb17DHkjJWLVebvS1LdNoa1D+Nz3Kmo3/L0/wCK3VwqH8bnuVNRv+Xp/wAVupWi2te1FKNe1FKCOcZh/wDio6uD04tcfo66+O3a2aiyLVDUNBMnQ440laEu3u0oA6dyt5XMD6uU+f0V9nGYN+FDV34LXH6Ouq9CQnwNjyR/u0+b1CgiqM51zvbe8DS/F8fG/wDvchyxThP/AERoqx/363SLLrjfsSy6PcrzhVjus20SY9mVZGZalxJq29mXVyHVdUJJJIDO5ISemxCreUg94FOUb77Degj8TTDPrJOySbZM4ZL8lm2xLW3kUZ64MR2Y7RDqnG0vNFTzzi1KU4lQJCUb77DbrVxuI0LUy3cdMFAKJEpcC4grTt3dj2x5Tv8A+0V8XdVyCQO4AU2HooIp9h+vN5QgS9R8MsRAIUm0Yk+8r9N+aRv/ANNT7WvTyfpjpfkOb5xqXqFqEzZonbGyW66R7C1IcUtKU8phoYc9sU7JLiidtgFqIBys22qD8cFok3LhryiRGa7YWp+33mQj0xok5iS/08+zTKzt59qxPpmPfljnpfjMvD9P7PbLjI8KuLbanZbxPRTzi1OL695AKyOYklW25JJNeo32BHpr51oTLPbNuhbTqUKBB3Chvvv8fSuVt0upJKeXZSk7e8dv8q8TeZtabW9y9PWIiNQ2yCtXko3HMkgrT3pPmPvVuSFdq4SQUEDb1Hrv/wDlrw2TZdc8b1EskF8MGzXmI61GXsQpE1olZSo92y29yn1sq79+noGr04lSlKQgqV1J5dqzNZiI/wAteqN6dhMuEO0MqflyWYbK3kN88l0Np53FhCE7nzqUUgDvJIA76+v9VSjVW8x0jG37o0RaPZ+B4S7zkJj8rgUy4r+b24ZSd+g5tz0FVfm5jvttS1OmsW+2a23MuN5QCCCguAjYpHnHn6f+e6uRAAQnbfYAAFW++3rrY6yh7l5t+ZJ3SR5jW8khSdk8yfP16gemom+nmLnp7b5+XQ8miyZlnvDQS3IeguJCZzCT/uZCFJIWn0K2C0/yVAVj5q7n7V71iusG443IkRMccSzAv1miynZAdcYZdW092QUFAFw7JOyenVPeTkFqbnLenOGzLypgypXkx4UTfYyZKzytN7+s958yQo+asdrOXMVtqmZKjLujjhn3SSllwJW684tTrieVBCvL5tkDqEgD0b3v4fjte3cv6jxCq5l4rHTHufbhxS5NbSzCjXuUlx1kqM+3GJsSlLalhS22+c7IClnyj5gOoFesWlLjakKSFJUNiFDcEegjzitVrCUFa1hKB1JUeg9+uLB7dkGst2XZ9N7T9kk1CuWRc3FKatUEedT8kJIJ9DbYWtXXYAAmr5VOx0T0utGovENp/jk63Jm25qHPXc48VS2G/AEMcraV9moEIEhUYBO+247t+/OKDbtLNLsxRimJ6f2yLlEdqNILNqtLDL4hyHjHclBZCS622ebtSkqICk7+2Tv2PDdw0WzQO0TX35v2Q5dduQ3S9uMhvnCd+RllG57NlG52TudyVKJJNWXsG+bm7NHNttvyjfag/KnOLVedJdcNVLFibLUqBa7jEMLHXnFJitRHWESCiOd9mnN3XACQUe1BSQBt7bDM1t+dWgz4AeZLbqo8iLKbLb0Z5O3O04k9yhuPSCCCCQd69LxgWlNj4o2pbLXZN33FmHlqSeinYsl1snb08khoe8BUzYAivqeZSlp1SgpS2wElRACQSfOdgB7wAqi5GovMWha4fNInaikAjYjceuuFERpDC2dippW/kKO4APeB6u/3t+ndXn2s5gQ1Qo9zfTFfmPiKwtQPK66R5Kd+5JOx236E7DvIB9NXJrxtL86eC1lgvTcOU2za1XpAUlLkFDxaW43zAqKFAjZaUpKh1HUDqK9Hhj6HcchNoD4Sw0loCUoqdCQkcoWpRJUrbbck7k7mvj1DvHsPYY5StlDsu4woCFPoKkjtpLbaj0I6hKlEbkDcDf0Hz1tzMad5DKxPUQRsPyhg7OszXexjvhO+z0dxewcaWnqCDuOoUAQal6b2puI8Q06qxbUqFKKhHVyhZV/7Ijn+LepdxHXK4wNMHfBEfaHHUImyFxm3UoaO+3OlbrY2UvkHTm79iNiaq24I6EK8/SvG6qWZ/MsaGH21C3sgyR9q3W1hpSg4HVOIJf8AI68jKQXlHuCWzv37VnFvuV8F5/kmUWawS/SldpOzSal1SOQrgW+KwoJOxIBUhZHcnuPmHoG3dWTB7XZVKdPhVxkqU24uVc5TklZWjflUOckII5lbcoHtqzMc/wBHLYAoeDanZ0wkD2q1293c+ndUTf4tz79fTB/0dOIoO9yzvOLskHfszPjRUk+ssR0K295VeiVDDK+5IxjrsRuQk/7StCGQle63lKJSG2mk7rdcKgNkJT136HcbVmFwW8Pl/wATvVx1JzO3qs96uMNNutFmf6vQIRWlxxbwB2S66sN7pHtEtIBJJUKtOl3DHpto5OTOxbE4MS5lBS5dZJXKnL6dd5DpU5sfRzbeqqi5sltSgncgHYAdaDfSpXYbhqtkmC4rMl22x4tkc24JevUF95cpNtgcy19i2UEB6RyhtpSuZKApa1p3CEoVVKCG8Tn8MaKf2hwfokyrcv7nV/R/yqI8Tn8MaKf2hwfokyrcv7nV/R/yoJDwc+5T0k+C9v8Ao6KsVR3g59ynpJ8F7f8AR0VYqBSlKBSlKBSlKDQnbasK9c7UvEuKy4OrQW4eY4/GlMOEbJclQluNPpB85DTsY7egeqs1axu46rS1F0dOcodDFzwiexeIygfKeQVBiRHA5Vbl1l5xCRttzlskpA3rn5GLu47VTYb9vJFpTOtK+Oy3mHkVng3S3vokwJjKJDDyO5bagCk/IRX2V4714eldZYMYteLMy2bTF8DZlSXJbjSXFqQHF9VFCSSEAnqUpAG5UdtyaifEdoZkOUw5mR4BkNwxzJvJXKjwZzkVu5JSkJSFlCgA4AAEqPeOh/klN/oUJWCFAEEdxqXHltjv1xKK2Otq9MwjWhOLQv8A4PvPb/crbvqNarip/IJ05Cl3FKYcxiUltxat3OQMtIUEk7be+TXz/wCk0ssvFdRcKTo9bJlszK/RpVxvUrG1utOSG+ZlDLryG1BB3KnAXFp3PTr0FeozDRO0ZRImyG1SLXOnMKhyp1sluRH34y0lDjTimyO1SUKUnlWFDY7V2uF6UY5giXF2q3sxn3ti+6lBU68R3Fx1RK19ST5RPfV3PPx9H5fP18KyOHbrnygOjXC/md1u0HJNXsrmX5bB7ZiwPTFSmkrHtVOlRKehHMEoHUhJ5iN0qyuQlLbaUJGwSNhSlUmXNbNO7LOmOMcagpSlQJSlKUClKUHVyMWtMrIYl9cgMG8RW1MtTQjZ0Nq70FQ25k9T0VuPPtvsR2oOwrSlZ3PyxERHopSlGSlK1rA0pQ/LSg6zJsZtuYWSVabvFTLgyE7KQokFJHVKkqGxSoEAhQIII6EGvWaNcT0vSh+Nh2r1xUu2g9jZ89lEJYkI/ksT19Ay+ABs4dkuDruFbg9NXHIjMzI7jEhpD7DiShbTqQpKknvBB7x39K7ONyLYLePTmzYIzR59s2INxYuMdh+O4l5l9AcbcbUFJWkjcEEeaozxue5U1G/5en/FbrF7SW9XTh61Ql3GHhc+ZhsrtG0wsSvQbR5SAUqXbpC22e0BSRzNLBIO+3TY5C8VWTt5fwZZxdm4NwtqZdrDgiXWMqPIa+3IHKtCu49D7/eNwRXqMOauasWhRZMc4ralkS17UUo17UUqdEjvGX7lDV34LXH6Ouq9C+42Pzaf2VIeMv3KGrvwWuP0ddV6F9xsfm0/soOetCQBuTsK1r4L9Ck3GzT4sOc5bJb8dbTM1lCVrjrKSEuJSoFJKTsdiCOnUGg+rwlvp5XfW9KwruO9Y1aX2zUK4arWvI7xa/A7vBivYrmI2cZiXJLSe2gXWFuOVQJU4koHlIEpaCftXlVLh/09uOlmk2P4xdpLUy5wWVeEvsEltx1binFqBIBO6lk9w96gotdfkNqiX2w3G2T4yJkCbHXGkR3UhSHW1pKVpUD0IIJBHorsKxk4sOLuNozPi4Njaoc/UW8MlyKxKV9pt7RB/wBpeG4K/aqKWk+UvlO/KndVBjkjKGtATA05zJMv7ILVbVqhrbb8IXdYkd5xhEhCEKUpKloY7UNr2UQrYFZB29E7qjizGRwrC/eGI1ymJ5o4f3Qh0hW3ZpcUAgudQeQHmIIO23di3dM37Cdk90cucm6XNDqHb1lU5PbuSJXOj/Z0JBHMopPIhCdkteQkAkkD6rJYL9drxbfCYSrvmt+dEOy44hXOzHPtwDt0PIEhx17uAR02A2VV3/D8VpmYmYd9eZesRExtY+IXJrJbLDjwcnMG7oyW3LhR0KLjqnESWg8AhG6jsy4sKAG+ywP5QB9DBeyq5oaks6ZZw3bZAdTHmvWct9otCFLCexUoPI5gkhKnG0IKilPNuQDmJw86HRtGNPLfZZT4u97KlTLjdVt8pflubdqpA/ko8lCEp7wltAJJG5qfg6OUDr8tKcClaRW07a25VptM1jT82b1c2H8JbuF/xLIkWW6uPQDEm47MccJRtulxlLRUkLSsFKlABQ35TukgeX0k1Pg2LNZGnUqdcVNtoQu3HIIz0ObGKiAIbqH0pcI2UhTS1jdYUpI5uTesk+MnjZY0MmnBMJj+z+pkxKeVrsS+1bELSFBbiAoc7hT5SW90jYhSylO3P+dbMuU+rIJmWIRcosZcidf5DzqnjJkuJSUMqd6drIB5Vbp5Uo5wlKd+Up3ng45rNdz5Z/i77idM7LrcmrRapk51KltxmVPKS3tzEJG523IG/d3kDr3ivHSNbsThtwkPSZrc6Yw09Ggptz635XaoSttDASgpfWUqBAaKvkBImuhWnF51hyzEtNLhLeiW1yG9eMgRGmulTUNtaAuO0palElx59tsqB35e0I22AH6pWjH7dYbVCttviNw4EJlEeNHaSAhptCQlCUjzAJAAHmAFc1PwyutXnaW3OtvdYYsYPwlt6s44i4auW+SluQ+zPt+Pxbg4wqAEIdShTjjJQpLy0SClxsLWgFsFKvNXoF/6PnRELW4LBeYv8ooZyi6JSk+kbSenxVkordtHk7k9w89Y05ziOpl/zC/ZlGs61X2PPTYMLjPyG1RbJFcR2Uq9Pt9oEurVzulLfVfIhpACS4s1bUpXHXprHhX2tN53Z2di4DtFbZcmpruLy76plQUlu/3qbcWD59iy+8ptQ9SkmrtZsdtWO22PbrTbotrt8dIQzEhMpZZaT5glCQAB7wqfaS5XKeuNxxBmHfrtbsaSiBIy69qRvcZoHM6lAGxXyhQ5nAlKOY8qdyk7VKpGhSvPZ/nVo00xG6ZPf5RhWS2MKkS5CWVultsd6uVAKjt6gfT3CukRrJjirzkMB64MwUWK2RbzLnS1oRF8Df7bkdS4VbFI8Hc3V0A6emgxi4+oAi6o6T3RI5TIi3e3LVv7bcRXkjb/AN0s1DVEIQoq2AA3JJ2Ar3fFNr5huuGd4G1hlzGQ2+wpnyptxjNLTHbddS20y2lawkKUUh1R5dwAB99Uhze6R3cYuENpa0zJ6PY+Ojs3FFTz/wBqaQOzQtW5WoAbJP8AnVTycVr5YmI8O/DeK01MvsvunGa55pHAvjOI3CbYspRJXaLja21OqihDqjCffbHltJWEIdDu3IAU8xT56HhN8OT4ZYLys/bbhAYlr2GwBW2lR/WTWWd+yrG+Hfh+tTGY3i2WONbLI3bEpWtLIkPNxeXsY6CokqPIeVAKiR6e+sKtIp0W06XYpbZchDU2FaYrL7bi+RSVhlIUNjsehBHxGnJw9NY6IMWSbWmbS6DWXWO7YNeLRY8VuXgN/mBxbrzfY87aChSWWwXgptKnXNgkqBOyF7bECoPlGEO3S6x/souFyzHMJbYdRCalqW4hKQPtj054qeCAdvK50gnolHcK/Q/hI0/xXVXTPVa3ZDbIV+RdsodYuTTygvtGWmo6oaTynmSEI5VgbghSlEbb14bKP9H1m+H+y1xwjJrTkTXaERLLeIC48xUYLUW2lT+1WFrbSshKlt7K5RzFJJVVhhpGOkRDly367TLGfSq7ZnkWTWfTzFo7t1vay7GMpuUtTbbw5VuLUXSsllhDg51ub8yuVCUkkpH6HYJpNp5wzXu23S83643/ADbJpKLTDud5T28x5S1BXYRmGWwllsbc6yhAACStxWyd66jgh4T3eHLDJU3I0sTM7vB/26U0suiMwDzIjIUdgfKUtxakgc63D3hKK9rkOiN/u2V5dl0bJmo2Wz47drsFwcgF1GP28lBeSy0V7LfcVzrLium6WQUlCCDJ01id6R7nWtrBDvlvuD8xmLNYkvQ3QxJQ0sKUy4UJcCFge1VyLQrY9dlA+evtBCgCO41GoemN902s2LYtpk3AtFq8MVKv97u6FS5j6Rspatt09tJkKPV5xWyOUnlVukCyI9onfcHbz1sw3VopIWkpUAUkbEHz1rSg0SkJGw6VrSlBDeJz+GNFP7Q4P0SZVuX9zq/o/wCVRHic/hjRT+0OD9EmVbl/c6v6P+VBIeDn3KeknwXt/wBHRViqO8HPuU9JPgvb/o6KsVApSlApSlApStpUEkAkAnuoNVKCRuTsKxC4zc4+zS/2vSi2KS7GYeiX7JXk8qg0y06HIkXz7LdeaS4QeobZP34qycQWusPRrF2ewYRd8tuzpiWKxpXsua/tuVHbcpabHlOOdyU+spBxexPHpVlZnzLrcDecjvElVwu9zUNvCZKwAeUfyW0JCW20dyUISOvUmu5nI7NNRPmXXxsXctv4h4PSh/7EM6yTCCCi3Oo9nrOg78rbTrhTJZT5glD2ywB+MerrWiNu+pxqbpY1lC2LvAkqt19hKaEaWgrHZNiSy84NgQDzdglPq5j5j17my5/Hm5ncMYlRVW+Ww0JEFa1hSZ8folbiDsNihZCVI6kcyT1Ctx56/wDV/nr9eV1X+n/LP+z1tdVkouLtrkx7Y/4DMkMONszQ0HTHcKfJXyHorY9dj0NdrWu9c8TrylnylULW2Tj7aIubYvd7ZMQjZc+0wnLlBe26c6CwFOI5u/lcQnbu3NdlatdsZv1yiwrXGvtxL7nIZSLJLZjtH+e462kDbcb959Ve0l2dqSrnSotKPfsNwfirjZsbaVbuOrc/V/nU1rY7Rvp8/wDCOIvE634edezm7SVXqHAxx9m4QynwR+5PIRCmAn+StsrWk7DqFI3G4799x6a3zn5jAW5GDLnJuQF8yAr0A7Akevbz93mHO1AjslPK0np6etfQTvUc2ifUNorO/MvnQ5IXtu0lrY9eZW+49W1fQa0pWrcpSlYClKUClKUClKUCtRWlNt6MOMhaXgpJ5m1Hykk+19Y/8KBotvcyD5CzupPoPpH/AIVo2HG1qSo9ogdQs9/vH/xrUrWh0BSd0K6JUnzH0H9fWjDkpWxLa0vKPPu2R3E9x9Xq9Vb6M7dPlmIWjOLR7GXuGJsQOoeQEuKacbcSd0rQ4ghSFD75JB7xvU91Qul30v0Wz/HrfbLxkWP3qAy0bhdctlS1W3kc9qiNJ5wEbKHVtYUdtiCEp2rVTziF/wCxbK/6qn/ERXdxMt6ZIrWfEufkY63pMzHmH6PNe1FKNdEiletedR3jL9yhq78Frj9HXVehfcbH5tP7KkPGX7lDV34LXH6Ouq9C+42Pzaf2UHPWhG4NeUyTU6xYll+PY3dn1wp9/wC2RbXHUbMPuthKiwHPah0pUVJQTuoIXtvy1ppNqJE1Y05sOXQYzkKPdYwf8FeUFLYVuQptRHTmSoFJ9YoPWAbeetaUoFQ7ib4YrNxA4w62yIFjzBl2O5ByUwu0kMJbXuporSpKy2tCnUFIVt9sJ2JFXGlB+bsz/Rsai29/Hbbbc3xZ+xWpRkoU7apLSkv7EIKmQ8vtdiVK5i6jr1IUdqu/DDwpZBpNqFecwza52e83VMJNrs6rSh1LTEda+0kOKDg3S44Q0nZJICWz1PMQMq6UClKUGN/Elwi2rWK8tZVjT8PE9Qm1IbdvJiFxufH5QlTMptKkl0BIBQrfmSUJAPLuKw+y/gf1exNdqxu3YxBy+2M3FE/2VtE9mM3ICHFr/wBqRKcC0LLhQ4eXth5grzD9UaUGJPBxw/5Vp5lmXZhm1rYtFzmMMWi2wW5iJKkRW1KcddKkdNnHFIAHeAyNwN6y2pSgVtUnmSRvtW6lBxssIYSUoG253J9NclKUHFJjNy2i06kONK6KbUAUqHoIqSaj8MuF5vo8jTlMR6zYyy8l+PBtkhyO0laFqdQhQSdy0HFc3ICAOm22w2sFKD8xR/o0NSNLYKl4RnNtuKBbZcycxKhhtUy5BJLLcdo7JQlRShPaOPAAnfkAABtHDLwb5RZbhi+bakX5MO7w+WWjFrOjkbZf5dk+EyAo9sU7klCNmwrbYrA3OZ7rgabK1dw76keacXGj+nOZqxTJ9QLNZL+jl7WHLf5ex5khaQ4rblbJSpKvKI6KB89BLuPThLunFBY8SjWJNoYnWmS8p+Vc330qTEWhPaNNNtjkWpS22j5ZT/uwAtJJUMedJeDDXbJWMcVlcuyYdaZbSxcQkeEXSLyLHL5A5meZY3CfKUEjyl+UOzH6SxMht0+zM3eNNjSLU8wmU3OZeSphbJSFJcSsHlKCkghW+xBBr4rHndgybGGMjtN4g3KwPNqebukSShyMttO/MsOA8pSOVW536bHfbY0HlNC9CbHoJjU+1WWZcLm5cZirhNuF0cQuRIfLaG9yUIQkAIbQkAJAATVJrqMWyu0ZtYoV6sNxi3e0TUdrGnQnkvMvI325krSSCNwe70Gu3oFKUoFKUoFKUoFKUoIbxOfwxop/aHB+iTKty/udX9H/ACqI8Tn8MaKf2hwfokyrcv7nV/R/yoJDwc+5T0k+C9v+joqxVHeDn3KeknwXt/0dFWKgUpSgUpSgVKNetd4OjFhhKFtkZBk91Utqy2GGsIdmupA5iVq8lppHMkrcX0SCNgpRSk1VXdWEHEZesq1e1DlY5BbueH4VauaJIuzzS40y4uBWzqYXMN0NE+SZO3lcv2voOeoM2XtUmyXFTuW6XQ2a03W75HNzbLrhHveZ3FoMOy46SI8FgHdMOGFdUMpO5J9s4oc6tztt6EADuGwr4rHZYONWWJabZFbh2+I2lphhrolCANgPX756nvPfX215DJknLabTO3oqUilYrEBAUCkgFJ6EEb11T2PtOSUOJISEeUjccxSrbbcb+b467WlaRMx6ba24GVPNJZbeBdUSUlxJ32HmJr6D0NaUrG2SlKVhkpSlApSlApSlApSlApSlApSlApSlApSlDZSlKBU84hf+xbK/6qn/ABEVQ6nnEL/2LZX/AFVP+Iiujj/3q/uiy/ks/R5r2opRr2opXs3mUd4y/coau/Ba4/R11XoX3Gx+bT+ypDxl+5Q1d+C1x+jrqvQvuNj82n9lB816x+2ZDFbj3O3Rbiy2+1KQ3KZS4lLzS0racAUDspK0pUlXeCkEd1fYy0GWwhKUoSO5KRsBXJSgUpSgUpSgVBuObU3JNG+F3NczxG4C2ZBakw1xpKmUPBPPMYbX5CwUndC1jqPPv3gVeaiHGlpPkGuHDXmOE4wzHfvV0TEDDUp4NNq7OYw6oFfm8htVBjKOJninu2rNkxmLjGHWU59bZVyxq33pbwds0dpaTzzVN787pa6ltIOynUE8vIpFUXBOLrKcb4cdVcp1EgQLjmmnd+lY5Ii2ZSmmLhKStlEYp5t1IQ4uQhPNt3JJ5QfJqj6p6XZBeOKjQ3NLRbA/Y7FFv0S9yw82gR234zYjDkKgpW7iSPJB2367CpLlXBdkeog4ocYnrZtWPZ5crXeMdnqcS4gymkJceLiEq50p7VCUK3AJSSU7mg6XTTii1lc18w3CbresG1Ceury/sksuFxJC/sZZ5CQtc0qLR5TsFJUSrcFI3KkqrO5s7p8/x1hxpzp/xF4varfhWOYVpjpFj8KQwZl8sTq5i5baFIDi2I60blxaEEFUhRVsSSrm2NZjMpKEAK7++g5KUpQKUpQKUpQKUpQbV9Ek7b7eavzmtWtWj2mnFJxVRNUHokv2emWiHFsjtsXPXcEswlJW222EKSSVOAbKIG5Hv1+jK9+U7d9Qvh405vGKZ3rVc77ahFF7zF2fbJKihRfiKhxUBSSCSElTahsduqTQY0IlZHoT/ots4kXW0SsbkXFE9qy49PdUuTa4dwl9jHjEq8rtENvlex8ob7EAggTHTzVG+aX/AOjR1R06u8Lny+x5DO09h2xpRU685MWCoIAG6lfb5ZSADzdmNundl1xs6b3zVi66HYzbLXJm2QZ1EuV7faSVNMRY7Tq1B3zBKgVAFXTm5R3lO8gyLhBym8f6R+PmKmJK9LpTkLL5SmlBuOi6RGFsR2yN/KcDu7u+3tXVD0khQv8ARhRbli2gF8wK8uIVdMHyy6Y++hCiUpUhxLpKf5pU8og+cH36y+rF3QjD79pxxja7wlWS4DEMpZt2SQbwW1CImTyFqQzz7bFxS+ZWw6hLfXvBOUVApSlApSlApSlApSlBDeJz+GNFP7Q4P0SZVuX9zq/o/wCVRHic/hjRT+0OD9EmVbl/c6v6P+VBIeDn3KeknwXt/wBHRViqO8HPuU9JPgvb/o6KsVApSlApSlB8s+fHtzDkiU6iPHaQpx191QShtIG5UonoAB56/PzIMjk8Rep72YvqdawG2yAMfjKJSq4qR0E5afwe+5aQe/mLh70gZsav4fZc6wO6WjI5D0WwuIS7PWw92POw2tLjja1Dr2S0oKHB03QpQ361h3hORoy7ErVeWbebVEnMCRFhq2BbYUSWiQANt2+RXLt5O+25qq/Eck0pHT8u/h0i15mXd9/q+PelKV5ldlKUoyUpSgUpWoG5Aofu4Y0yPNDpjSGpAacUy4WVhfI4n2yDt3KB6EeauOXc4kGVCjyJLTD810sRm3FAF5wIUspT6TyoUr3kk+aohjuS3CyWpxdoWlMjKNQ34jL3KlQ8GacV26gFffNQ3gPOOcEdwNUTVXHLlebHAuNiaS/kNhnN3SAwpYQJCkhSHGCokAdo0txG5IAKgSeldNsUVtEWn3/+/wC0MX6o3EPa91aUB5hvsU79djt0+SlcyWPJSlKMlKUoFKUoFKUoFKUoFKUoFKUoFTziF/7Fsr/qqf8AERVDqecQv/Ytlf8AVU/4iK6OP/er+6LL+Sz9HmvailGvailezeZR3jL9yhq78Frj9HXVehfcbH5tP7KkPGX7lDV34LXH6Ouq9C+42Pzaf2UHPSlKBSlKBSlKBSlKDQjetaUoFKUoFKUoFKUoFKUoFKUoNFJCgQe6tEp5R3k+/W6lBsW0lZBO/Tzb07Meut9KDYlpKVcwHlemt9KUClKUClKUClKUClKUEN4nP4Y0U/tDg/RJlW5f3Or+j/lUR4nP4Y0U/tDg/RJlW5f3Or+j/lQSHg59ynpJ8F7f9HRViqO8HPuU9JPgvb/o6KsVApSlApStqj3+9QQjjZyNdn4f73aY0sRLlk70XG4pB8tYlvoafCPWI6n1+oIJ81RaNFZgxmY0ZtLUdlAbbQkbBKQNgB7wFd7xaXw5PxAaaYoXgIdjt8/Jn2R15nyExI+49SX5BHrFdNXnPxHJ1XisfC54dOms2n5KUoTt1Pd56qFkUrwrOQSr5rQ/aYLx9ibBaiblynyHJchaCy2f5zbbS1ekdunfbevRYxlluzCHKl2txUiIxKdieEcpCHVtnlWUH+UkK3HMOh2O1bzSYjc/4/5RxeJ9O4pW110MtqWrcgeYd5PoFbipIUE79T3euo0hSlKDq5GL2mS7bHFwWUm2yVTYgbTyBp9SFoW5snYEqDrm++4JWT37Gu0pSszO2IiI9FKUrDJSlKBWxpwOOLTsQUHYj9hrepJWhSUqKVEdFDvHrriaQVEOLBQ4kch27lf/APKyxLe06l1HMknoSk7jbYjoa3VoEJC1rA2Uvbfr37VrWAp5yPOK89m+ZM4Nbodxlxlu29yazFlSEKAERDquRLyt+9IWpsHbuCie4GuPFZuSi7Xe23+CHGGXlOwLywpAbkMLWShpaAeZLjYPKehSQkK33JFSRSZr1MdUb09LSlK0bFKUrAUpSgVPOIX/ALFsr/qqf8RFUOp5xC/9i2V/1VP+Iiujj/3q/uiy/ks/R5r2opRr2opXs3mUd4y/coau/Ba4/R11XoX3Gx+bT+ypDxl+5Q1d+C1x+jrr6tQtfcZ0vynBMbut7s8ObkE7wV5qdc2o7sSP4JKeRI7NR3UhTsZLIPQczo6kgJIU83aIm6ptpkNCepkyExisdoWgQkrCe/lBIG/pIr7KhuRX23Y5xSWq5XabHtluYwW4LemTHktNNgT4e6lLUQAB0G5qtKy+yt2FN7XdIiLKW0vC4rfQI/Zn2q+0J5Sk7jY77daDuKV8XsxEKYyg+giSoJZII+2EpKvJ9PQE+8DW5F1iuqfSh5K1MdHUpIJQdt9iPN02NB9dK6XHs0sOXMvvWO82+8tMOFl1dvlNvhtY70qKSdiPQetddbNVcRveVysZtuQ2+43+K069JgQ30vORw2pCVhzlJCFAut+SrY+UOlB6uleRsGrOG5ZcfYyz5LbbhdC0t72PYlIMoNJcLanOy35wgLSoc2224rzmmGv2Lan5fl+P2e+We6SLHKbba9jrm1KXKYMeO4t8JQdwhLj5aJ6jmR3gnlAVGuvYv0GW/NZYksvOQnhHkpbcCuwcKErCF7e1VyLQrY9dlpPcRXSvapYnHzGJia8ggfZNKWUN2lD6VyQQ2t3dTYJKAW21qBVsCB067VAtQ1tv6UcVktIIJmy0D1ctjtySflRQZSoVzp3229+t1fP4Yyl9tgqCXFglCCQCrbv2Hn760m3CPbY70iU6iPHZQXHHnVBKEJHUkk9AAN6D6aV1GP5dZMstaLlZLtCvFtXuEzIEhD7Ktu/ZaSQa4LFnWP5RbZFws15gXeAwtTTsmBKbfaQtI3UkqQogEecE7ig76leatmpWLXqNEfgZBbpaJS0NNdlJQSpakBaUbb78xSQeXv281ekSrmG9BrSlKBSlKBSlKBSlKBSlKBSlKBSlKBSlKBSlKCG8Tn8MaKf2hwfokyrcv7nV/R/yqI8Tn8MaKf2hwfokyrcv7nV/R/yoJDwc+5T0k+C9v+joqxVHeDn3KeknwXt/0dFWKgUpSgV1eSZBbcXss663eYxbrXDYW/JmSXAhpltI3UtSj0AA3JJrtK8RrC247p9fEx8UYzmX2A8Hx6V2YamvcwLaVqc3SlIUAoqIPKEkgEjYmJYYWrJ0aoan5tqCtHg5uyoka2wX/JkxrY02THW4j2zZf7Rx/kUAQHEA9U16iukx/HHcavOTMXe9Rr/mj1xL+RzYo5UeGqbQezQg+UhtDfZpQk9QgJPn3Pd147lW6s1pelwRFccQUI3G3Ue9Slcyd4fPcTn3Gy+weNtotKL7cCq83GMUNuNMKT9ucR5y64EpaCuu3OFfyen3N3qBit+xnC7VagnwiK64liJslqBEZQkBZB/kla20ADckqJ67GvVbA7+vvNdYxjNuYySRfwwVXV+I1CU8tRIDTalrSlIPtd1OKJ27+m++wqTria9NvhH0/MQ7FxsOcu525VBXT1UDRXJLm42COUD0Hfr+oJreAT3VtQsOJC0q5k+Yj/z6v1VE3cbIV2j+/cF9Pe2TXLSlZkecyXMlY7kmJWlDAfVfZr0VRK+XskNxnXivu6+U2hO3T2++/QV8eVZQ/ccCzKVicntb1a402OyQ3vyTG2lbJ2UNlbK28xSfX1rv5eP264Xm3XWTGDs+3JdTFeKju0HAkL2G+x3CQNyOgJ223rz2m+OXDGTlTM5lCESr9LnRXUOBQeZe5FpJHmKSVI2P3m/n3qeJrFYmI8xr/dHPVvUNuO6jxr5c8WgNtuPezlhVemZoIDakoLAUnb0nwhJ7+m1ez9+vL2vTPH7O1iyI0d1BxkOJtrvannbQtBbW2TvupBSR0PTdCT5q9OlIQkAeatbzSfNG1N61ZrSlKhblbXGw6nYkg77hSe8H01upQANkgb77DvNKUoPku9phX+0zLZcI6JcGW0ph5lzuWhQKVD09QT3V8GHY9IxXHotrkXaTelRgW25cxKQ6WwfISopACilOwKu9W256k13VK26piOn4a6jeylKVq2KUpQKUpQKnnEL/ANi2V/1VP+IiqHU84hf+xbK/6qn/ABEV0cf+9X90WX8ln6PNe1FKNdUClezeZR3jL9yhq78Frj9HXX1Z8GXtRdIeZDKkC5zFFShuvnTbJQAHxKX+r0183GO04/wq6stNJK3F4xcEpSBuSTHX0rz54veH+b7Gvy87szsqCrto7jrTilsOFtTalJPJ0PItadx5lH00H1Zri9kv3FpgC7rBjXBUPE7vNiJkp5kNvtzrbyuhJ8nmT2pIJ6g7EbHY1NVeHztMdHYtrt1ruUW5Zzcn0wLxJXFhvtoN0kxW1rQ04QElDK0jkIKmmx06Ee6k8VnDvLyaJkLmeWk3mJDft7MsB7mQw8tpbqNuTbYqYaO+2/kd/U79XL4g+F+44ZGxKbk+Oz8ajNobZtsyO480gIIKCOdBO6SAQrfffrvv1oOoyXG28U4SLhLl3S3Rbpj9zlXfGHsYdVOat8sTnDBt8ZwoQXEguIhFASgKQtbeyUnp2eSYBdcH4epwyV5K8oza+2wZjOjuFCQibOixZTaFpV9raaiK8HSsEcqGgs7EE18uSa+cOd8YwyEzn9qt1lxa4N3GJaYLamYilNMuNsNraDWxQ2XA4hKduVbTav5IFesvvF9w+5NapVsuud2S422W0piTDksuONPtqGykLSWyFJI3BB6EHrQdxqDk+M4Bp9qlIwuLb4GT47jBlvJgww12SUx31w0rUlICgjkcIRv5AVvskLG/nsLw3EdPtfcAxvHBDTJgaf3FmQtrl8IeZE63Bl10jqrncElXMe9SnT3lVdfiPEbwy4FY5Fnx/LbBbLbIWpx9hpp0h9agApThUglZKQE7q3OwA7gBXX4frXwoaeXQXLF71i2Pzgw5G7W2xHGCptZbKkkJQAofaW9gd+UIAGw3FB0mG2C14fgemdxtVtiQ7iNT7i3IktMhLsjtptxhuFxQG6iWykdT/IQO5IFWrSlttrONaHg0gLRlLIAbA3CBZLWdht6ep987VM4mvvDUxaIFudz2BKjwL3IyGL2rj+7Ux2S9IKwUoG4SuQ5ypO422B3r08DjA4f7ZKnyYmeWWPIuDwkzHW2XEqkOhtDQWshHlKCG207nzISO4Cg8Np9EsDTHDLdFqhOZbks6dkEx8hJlPrl2aZImHf2ykJccjoIPcEMp8yRXZZAyudohxSJDYLy5t7ShHUFW1rY5em3f0TXBaNZOE3H8nbyO13jFbbfW5C5Qnw4a2nS4tDiFkqS2N+YPO7g9N1lW253rtjxK8Nwi5NHRnVsaayRa3LmEqkbPrUyllSgCkhJLaEDyQN+Xc9dyQ7jh7nL1DyG75hlyVMaiQf8AYH7G4E9nYIrg7RtqOQoh1DyQhwyUk9sUpHkBoNNeh4hGY96/1e2C4lpywXrKY0a5MvBKmZDTceRIbZcB6FC32GElJ6K5uXrzbHwFn4jOG+x3m1XaNn9v9k7dahZW5Slv8zkUFJSh0BADhSUbpKhunnc2251b/JH1w4WGMZvWPHKbJIs15nvXOdEleEPpekurDi3d1gkK5wFDYjlIHLtsKD1+tVysMfRnUhnEkRY58OatuQP29sMlPaqioluLcAHMtER7q4CSnkA3CkEDcvGbZj2utztePR49uaueEFMuDDSGmm1R3g1DVyJ22JQ88gHbflZSB0TtXQWniT4ZrFh7uKQMrx6LjjrLjDltQw52LiHN+0C08nlc/MoqJ3KiSTuSa6/Bde+GnTp+c/aNQmXJUxpqM5KuU+bOeSw1zdkylx7nUltHOshAO26lHvUSQjDOj2D23TrI8jgWKBButp0Ts0q2BhpCQxIWZ0gyEbD/AHxdjMHtBurdPfX6FMkFpPL1Tt02rE9jWDhZZxX7Hjmtvct5scTHHCuRK7R2BG5+xaUsDc7dovc96ubqSNqoQ429DQAP9Y9r/Qd/coLjSod47mhv/Ee1foO/uU8dzQ3/AIj2r9B39yguNKh3juaG/wDEe1foO/uU8dzQ3/iPav0Hf3KC40qHeO5ob/xHtX6Dv7lPHc0N/wCI9q/Qd/coLjSod47mhv8AxHtX6Dv7lPHc0N/4j2r9B39yguNKh3juaG/8R7V+g7+5Tx3NDf8AiPav0Hf3KC40qHeO5ob/AMR7V+g7+5Tx3NDf+I9q/Qd/coLjSod47mhv/Ee1foO/uU8dzQ3/AIj2r9B39yguNKh3juaG/wDEe1foO/uU8dzQ3/iPav0Hf3KC40qHeO5ob/xHtX6Dv7lPHc0N/wCI9q/Qd/coNOJz+GNFP7Q4P0SZVuX9zq/o/wCVYlarcRGnWrmaaNWfD8qiX+5M51DmOR4qV8yGUxpSVLO6RsAVpHx1lmokxSQNzy9BQSPg59ynpJ8F7f8AR0VYqw/4X+LbSPDOHTTWxXzOLfbbvbsfhRZUR5DvO06hlKVpOye8EEfFVP8AHc0N/wCI9q/Qd/coLjSod47mhv8AxHtX6Dv7lPHc0N/4j2r9B39yguNedz/JE4Zht8v6oMm5exkF+YIcJsuPv9mgq7NtI6lSttgB5yKmHjuaG/8AEe1foO/uVsd419DnAdtRrUo7bAFLv7lBBLHhN2wdmQ3kbiHssurxvN8W3tyCdJSl11tO3Tkb5g0j+Y2iuxqM4VxCYTJRkN2uWStRpV6v9yuYjyEulxppySvsEHdHeGktd1ei8YXTr8qof6Dn7leTz4ctstpis+3oMWSlaViZUSlTvxhdOvyqh/oOfuU8YXTr8qof6Dn7lc/Yy/plL3afaiUqd+MLp1+VUP8AQc/cp4wunX5VQ/0HP3Kz2Mv6ZO7T7UUHatjTfYoKQdwST725J/zqe+MLp1+VUP8AQc/cp4wunX5VQ/0HP3Kx2Mv6ZO7T7USlTvxhdO/yqh/oO/uUHELp1+VUT/7N39ynYy/plnu0+1EoEgEkDqe+p34wunX5VQ/0HP3KeMLp1+VUP9Bz9ynYy/plju4/tRKVO/GF06/KqH+g5+5TxhdOvyqh/oOfuU7GX9Mndx/aiUqd+MLp1+VUP9Bz9ynjC6dflVD/AEHP3KdjL+mWe7T7USlTvxhdOvyqh/oOfuU8YXTr8qof6Dn7lOxl/TLHdp9qJSp34wunX5VQ/wBBz9ynjC6dflVD/Qc/cp2Mv6ZO7T7USlTs8Q2nQ2/9aof6Dv7lPGF06/KqH+g5+5TsZf0yd2n2olKnfjC6dflVD/Qc/cp4wunX5VQ/0HP3KdjL+mTu0+1EpU78YXTr8qof6Dn7lPGF06/KqH+g5+5TsZf0yz3afaiUqd+MLp1+VUP9Bz9ynjC6dflVD/Qc/cp2Mv6ZY7tPtRKnnEL/ANi2V/1VP+IitPGF06/KqH+g5+5XidatasLybS/ILTab/Hm3GUyhtmO224VOq7RPkjye/pU+DDljLWZrPtpky0mk+X6qM+0FKMkFA2II281K9a86OtB4bK2I9BG4NaoRyJCQegG1KUG7Y+n9VNj6f1UpQNj6f1U2Pp/VSlA2Pp/VTY+n9VKUDY+n9VNj6f1UpQNj6f1U2Pp/VSlA2Pp/VTY+n9VKUDY+n9VNj6f1UpQNj6f1U2Pp/VSlA2Pp/VTY+n9VKUDY+n9VNj6f1UpQNj6f1U2Pp/VSlA2Pp/VTY+n9VKUDY+n9VNj6f1UpQNj6f1U2Pp/VSlA2Pp/VTY+n9VKUDY+n9VNj6f1UpQNj6f1U2Pp/VSlBxvMB9HKvqO+t3Z7t8hO/m60pQEN9mCAo9Tv1rdsfT+qlKBsfT+qmx9P6qUoGx9P6qbH00pQacp9NOU/fUpQOU/fU5T99SlA5T99TlP31KUDlP31OU/fUpQNj6acp9NKUDlP31OU/fUpQOU/fU5T99SlA5T99TlP31KUDlP31OU/fUpQOU/fU5T99SlA5T99TlP31KUDlP31OU/fUpQOU/fU5T99SlA5T99TlP31KUDlP31CkkEc3fSlBtaaDW+3cTvtSlKD/2Q==","1715546476"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Al48/RbfBehPCcdjyUJnVowa9bM9bIDuF4YNVcJnEC96"},"signature":"hqBwaVRTcrMjFb8Q+MTIYzC+FOONH1PDO8eMC2rkFwkOUhc+i4s/Xkg8pbv5U+GRdiGYeehdSrQWF/sunY+3Qw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g18700zpxdch58ytw9msedyaskrywwxtsr8zh7hy","send":"","pkg_path":"gno.land/r/leon/v5/memeland","func":"Upvote","args":["0000001"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Al48/RbfBehPCcdjyUJnVowa9bM9bIDuF4YNVcJnEC96"},"signature":"WWHw7UvhnVEeaTdwAVxx5eL9epuC9A5sUrGDAUgpoBURCwTh44lyMU++LJrTp4ySaJQSPhqLqUDPzLUwN9BzHA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dvfhkhjp0qgrrm4tr065aqz6ntjs0qr7rtmxuu","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"BlFsjwX/RQ3DAdzpnbPhEZx2at1MhyEI7gkAskQc+rZzBamxtDOt044CKYqheR0nKRkpoqKb+JbofZfcxFPKGw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1w8cpkflxysztll935x45llywtz0rdwajcm2lwu","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"f1h5vHbUrYT5/oIZSQCVhcbupXmSLJfDr6eplTwl345Kf1CVCi9O5j4PCR1D+2lPUQJBI2IHQB9vjuAsQDmoIQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g12d83njqsvp009mc2mcsrxh60famfarn9tag0a5","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"nVUiGxmUo6FdxAFyvXShuOhztXiQtwqVPfmp9c+4tB0dSzy8iTFkxQYaryZCV+AkPgOcUa/mKWPJS0os9oVI+Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1mk3pg7xvh2qa0m8gtnw8xqcyvfrx742jles67t","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"o0uU1QEOFoP5pkoUGYl/FsVjqwWKcPH3+G4Q0CmWSxlKkpKqH7gD5/JbnjokGPbmMlp6pWFdEuT8zzGgP+axlA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g124zunj5xzfdap35a59vfswcvvpwshhnmh5p735","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"+pSk5xUaKg/zDyJKeZJBT5h3GxyXldP96Tr2anvWGc9jnqtr05E8gPeIS9AohpECGahtkigOsxYS1dP9WWvvRQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"ZHyNQM30d+NlOoFvfrPwNmB3N69LWleoCPlbGj22dwB9ihdYS5O/NUmV2ffRq4bCYI2szqNvirVvrEjumRlSRQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"YNiGVS8qUWOshi0Ign9rWD5pBJY+JgjGV63EvL3XZ7o5TOE1qflPck/MxHgPChqHnhQGjdszfNV9jM8aPy4BxA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/test/realms","func":"GetPrevRealm","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"YQxb2LIVKQ+5ki43IderoXXlySaZZQ+15usSUFqK3Aspa/EZJszYB0iJCFIQBPzuTZHi8u2rhfQIneXpuR7gxg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"P9L30TQhNAKLXCy8kmpMMSd2Cyy0AA/96NLhswlYjMYtymFVidvhdlO0/2iTw1XYHMR4bCSl2t1+S6vyfAvL+A=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/test/realms2","func":"CallGetPrevRealm","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"mtYQUdQhG3xQ/7cVgpHgtntjD2kpPWRpwTdKuDjIKldXR/HyT86f6zd2Kg1/AWOKerBxHLWRZyAW7v4Q6Er9vQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"Render","args":["\"\""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyaNg+hBb1kUTyhx23vyBeg6wyIXhtmXXtOwDG5fOJB3"},"signature":"X8KeRB4facZFEVOqVGOfrqh6A99/PGF97jbYHk3C0XFu4gUhXFgl/13G5R8QC4hE+0qjiM81a+/i1LSs6fZd2Q=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"Render","args":[""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyaNg+hBb1kUTyhx23vyBeg6wyIXhtmXXtOwDG5fOJB3"},"signature":"4WUVUbuVnbApeH47b37eDPq5zNCjOruXm7H4DlnBN8VWkX10PexSRs2CuV5MVdqjVgAN74bO9nHOLikYcN5LuQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["kv-stores-indexer","Key/Value Stores: How We Improved the Performance of Our tx-indexer by 10x","\n\nIn this article, we'll discuss how we achieved a tenfold increase in the processing speed of the tx-indexer by applying four key concepts related to our use of key/value storage:\n\n・ [Key/Value Stores: How We Improved the Performance of Our tx-indexer by 10x](#keyvalue-stores-how-we-improved-the-performance-of-our-tx-indexer-by-10x) \n ・ [Understanding Key/Value Store Variability](#understanding-keyvalue-store-variability) \n ・ [The Importance of Efficient Data Encoding](#the-importance-of-efficient-data-encoding) \n ・ [Implementing Secondary Indexes on a Key/Value Store](#implementing-secondary-indexes-on-a-keyvalue-store) \n ・ [The Role of Batch Inserts in Enhancing Performance](#the-role-of-batch-inserts-in-enhancing-performance) \n ・ [Data consistency](#data-consistency) \n ・ [Speed](#speed) \n ・ [Old](#old) \n ・ [New](#new) \n ・ [Conclusion](#conclusion) \n\nThe Transaction Indexer ([tx-indexer](https://github.com/gnolang/tx-indexer)) is the primary tool Gno.land uses to index its networks. It is in charge of keeping up with block production, fetching new data, indexing it, and serving it to users while providing filtering and subscription capabilities. The tx-indexer creates versatility and ease of use when using on-chain data, which is one of the key aspects of a fully functioning decentralized application.\n\n## Understanding Key/Value Store Variability\n\nNot all key/value storages are created equal. Each varies significantly, and depending on their internal data structures, some are better suited for certain use cases than others. A deep understanding of the key/value store you plan to use will help you better organize data for efficient writing and reading and assist in choosing the best store for your specific needs.\n\nWhile [PebbleDB](https://github.com/cockroachdb/pebble) is based on [RocksDB](https://github.com/facebook/rocksdb/wiki/RocksDB-Overview), the two databases differ significantly. Both utilize LSM Trees built upon SSTables; however, PebbleDB supports only a subset of the features available in RocksDB. For instance, PebbleDB lacks built-in transaction capabilities, but these can be alternatively implemented through the use of Batches and/or Snapshots.\n\n## The Importance of Efficient Data Encoding\n\nOur indexing involved elements defined by consecutive integers, with Blocks on one side and Transactions within a Block on the other.\n\nInitially, Blocks were indexed using a combination of `block_prefix` and block_id encoded in little endian. This method wasn't allowing us to use iterators for ordered data retrieval, forcing us to fetch elements individually, resulting in excessive and inefficient database queries.\n\nAfter refactoring, we adopted a binary encoding scheme that allowed for custom encoding of strings and integers. This flexibility enabled ascending or descending order iterations, which significantly improved our ability to read data sequentially through iterators and, consequently, reduced query times dramatically.\n\nSmall example about how we encoded uint32 values in ascending order:\n\n```go!\nfunc encodeUint32Ascending(b []byte, v uint32) []byte {\n\treturn append(b, byte(v\u003e\u003e24), byte(v\u003e\u003e16), byte(v\u003e\u003e8), byte(v))\n}\n```\n\n## Implementing Secondary Indexes on a Key/Value Store\n\nWhile most filters are applied on the fly due to their low cost, we implemented secondary indexes to fetch Transactions by Hash efficiently.\n\nSecondary indexes are specialized key groups that directly reference the primary index key where the data resides. For example, a transaction with ID `3` in block `42` is indexed as `/index/txs/[uint64]42[uint32]3`. These transactions are also uniquely identified by a hash representing the entire transaction content.\n\nTo fetch transactions by hash, we created a secondary index that points to the primary index:\n\n`/index/txh/[HASH] -\u003e /data/txs/[uint64]42[uint32]3` \n\nAlthough our secondary indexes do not require ordered iteration, this capability remains available, allowing us to apply additional filters as necessary. For instance, we could index transactions by year:\n\n`/index/txYear/[uint16]2024[uint64]42[uint32]3 -\u003e /data/txs/[uint64]42[uint32]3`\n\nThis format allows us to iterate through transactions within a specific year, from the start to the end of 2023, for example:\n\n・ from: `/index/txYear/[uint16]2023[uint64]0[uint32]0` \n・ to: `/index/txYear/[uint16]2023[uint64]MAX_UINT64[uint32]MAX_UINT32` \n\n## The Role of Batch Inserts in Enhancing Performance\n\nThe advantages of write batches are often overlooked but crucial. Inserting elements individually can lead to data consistency issues and slower operations.\n\n### Data consistency\n\nBatches ensure atomicity—either all elements are persisted, or none are. Without batches, a failure during insertion could result in a block being saved without some of its transactions.\n\n### Speed\n\nEach insertion involves internal processes that slow down the operation. By grouping several entries in one batch, we significantly enhance insertion speed. These are new benchmarks comparing the old and new way of writting elements without and with batches. Note that these are just synthetic benchmarks and the 10x improvement was measured when using the indexer as it is (we came from speding 30 mins to 3 mins with the new storage changes):\n\n#### Old\n\n```go!\nfunc BenchmarkPebbleWrites(b *testing.B) {\n\tstore, err := NewDB(b.TempDir())\n\trequire.NoError(b, err)\n\tdefer store.Close()\n\n\tpairs := generateRandomPairs(b, b.N)\n\n\tb.ResetTimer()\n\tfor k, v := range pairs {\n\t\terr := store.Set([]byte(k), v)\n\n\t\tb.StopTimer()\n\t\trequire.NoError(b, err)\n\t\tb.StartTimer()\n\t}\n}\n```\n\n```\ngoos: linux\ngoarch: amd64\npkg: github.com/gnolang/tx-indexer/storage/pebble\ncpu: AMD Ryzen 5 5600X 6-Core Processor\nBenchmarkPebbleWrites\nBenchmarkPebbleWrites-12 \t 1316\t 928941 ns/op\t 33 B/op\t 0 allocs/op\nPASS\nok \tgithub.com/gnolang/tx-indexer/storage/pebble\t1.384s\n```\n\n#### New\n\n```go!\nfunc BenchmarkPebbleWrites(b *testing.B) {\n\tstore, err := NewPebble(b.TempDir())\n\trequire.NoError(b, err)\n\tdefer store.Close()\n\n\tpairs := generateRandomBlocks(b, b.N)\n\n\tbatch := store.WriteBatch()\n\n\tb.ResetTimer()\n\tfor _, v := range pairs {\n\t\terr := batch.SetBlock(v)\n\n\t\tb.StopTimer()\n\t\trequire.NoError(b, err)\n\t\tb.StartTimer()\n\t}\n\n\terr = batch.Commit()\n\n\tb.StopTimer()\n\trequire.NoError(b, err)\n\tb.StartTimer()\n}\n```\n\n```\ngoos: linux\ngoarch: amd64\npkg: github.com/gnolang/tx-indexer/storage\ncpu: AMD Ryzen 5 5600X 6-Core Processor\nBenchmarkPebbleWrites\nBenchmarkPebbleWrites-12 249462 4730 ns/op 1704 B/op 43 allocs/op\nPASS\nok github.com/gnolang/tx-indexer/storage 4.669s\n```\n\n## Conclusion\n\nIf you find out this interesting and want to have a deeper look about [how it is done](https://github.com/gnolang/tx-indexer/tree/main/storage), or just try our indexer, it is as simple as ramping up a docker image:\n\n```\ndocker run -it -p 8546:8546 ghcr.io/gnolang/tx-indexer:latest start -remote http://test3.gno.land:36657\n```\n\nAnd start playing with it through its GraphQL interface at `http://localhost:8546/graphql`\n","2024-05-10T13:37:00Z","ajnavarro","blog,post,tx-indexer,dev"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"WERWRmbw+BK4dpNNGG8HGLjq6O4fpcZyu87y+T+ymDQSLbrsHbnS14//dIu8ulwzMgwJ7BSlc0z7hiMHjd5fgA=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["kv-stores-indexer","Key/Value Stores: How We Improved the Performance of Our tx-indexer by 10x","\n\nIn this article, we'll discuss how we achieved a tenfold increase in the processing speed of the tx-indexer by applying four key concepts related to our use of key/value storage:\n\n・ [Key/Value Stores: How We Improved the Performance of Our tx-indexer by 10x](#keyvalue-stores-how-we-improved-the-performance-of-our-tx-indexer-by-10x) \n ・ [Understanding Key/Value Store Variability](#understanding-keyvalue-store-variability) \n ・ [The Importance of Efficient Data Encoding](#the-importance-of-efficient-data-encoding) \n ・ [Implementing Secondary Indexes on a Key/Value Store](#implementing-secondary-indexes-on-a-keyvalue-store) \n ・ [The Role of Batch Inserts in Enhancing Performance](#the-role-of-batch-inserts-in-enhancing-performance) \n ・ [Data consistency](#data-consistency) \n ・ [Speed](#speed) \n ・ [Old](#old) \n ・ [New](#new) \n ・ [Conclusion](#conclusion) \n\nThe Transaction Indexer ([tx-indexer](https://github.com/gnolang/tx-indexer)) is the primary tool Gno.land uses to index its networks. It is in charge of keeping up with block production, fetching new data, indexing it, and serving it to users while providing filtering and subscription capabilities. The tx-indexer creates versatility and ease of use when using on-chain data, which is one of the key aspects of a fully functioning decentralized application.\n\n## Understanding Key/Value Store Variability\n\nNot all key/value storages are created equal. Each varies significantly, and depending on their internal data structures, some are better suited for certain use cases than others. A deep understanding of the key/value store you plan to use will help you better organize data for efficient writing and reading and assist in choosing the best store for your specific needs.\n\nWhile [PebbleDB](https://github.com/cockroachdb/pebble) is based on [RocksDB](https://github.com/facebook/rocksdb/wiki/RocksDB-Overview), the two databases differ significantly. Both utilize LSM Trees built upon SSTables; however, PebbleDB supports only a subset of the features available in RocksDB. For instance, PebbleDB lacks built-in transaction capabilities, but these can be alternatively implemented through the use of Batches and/or Snapshots.\n\n## The Importance of Efficient Data Encoding\n\nOur indexing involved elements defined by consecutive integers, with Blocks on one side and Transactions within a Block on the other.\n\nInitially, Blocks were indexed using a combination of `block_prefix` and block_id encoded in little endian. This method wasn't allowing us to use iterators for ordered data retrieval, forcing us to fetch elements individually, resulting in excessive and inefficient database queries.\n\nAfter refactoring, we adopted a binary encoding scheme that allowed for custom encoding of strings and integers. This flexibility enabled ascending or descending order iterations, which significantly improved our ability to read data sequentially through iterators and, consequently, reduced query times dramatically.\n\nSmall example about how we encoded uint32 values in ascending order:\n\n```go!\nfunc encodeUint32Ascending(b []byte, v uint32) []byte {\n\treturn append(b, byte(v\u003e\u003e24), byte(v\u003e\u003e16), byte(v\u003e\u003e8), byte(v))\n}\n```\n\n## Implementing Secondary Indexes on a Key/Value Store\n\nWhile most filters are applied on the fly due to their low cost, we implemented secondary indexes to fetch Transactions by Hash efficiently.\n\nSecondary indexes are specialized key groups that directly reference the primary index key where the data resides. For example, a transaction with ID `3` in block `42` is indexed as `/index/txs/[uint64]42[uint32]3`. These transactions are also uniquely identified by a hash representing the entire transaction content.\n\nTo fetch transactions by hash, we created a secondary index that points to the primary index:\n\n`/index/txh/[HASH] -\u003e /data/txs/[uint64]42[uint32]3` \n\nAlthough our secondary indexes do not require ordered iteration, this capability remains available, allowing us to apply additional filters as necessary. For instance, we could index transactions by year:\n\n`/index/txYear/[uint16]2024[uint64]42[uint32]3 -\u003e /data/txs/[uint64]42[uint32]3`\n\nThis format allows us to iterate through transactions within a specific year, from the start to the end of 2023, for example:\n\n・ from: `/index/txYear/[uint16]2023[uint64]0[uint32]0` \n・ to: `/index/txYear/[uint16]2023[uint64]MAX_UINT64[uint32]MAX_UINT32` \n\n## The Role of Batch Inserts in Enhancing Performance\n\nThe advantages of write batches are often overlooked but crucial. Inserting elements individually can lead to data consistency issues and slower operations.\n\n### Data consistency\n\nBatches ensure atomicity—either all elements are persisted, or none are. Without batches, a failure during insertion could result in a block being saved without some of its transactions.\n\n### Speed\n\nEach insertion involves internal processes that slow down the operation. By grouping several entries in one batch, we significantly enhance insertion speed. These are new benchmarks comparing the old and new way of writting elements without and with batches. Note that these are just synthetic benchmarks and the 10x improvement was measured when using the indexer as it is (we came from speding 30 mins to 3 mins with the new storage changes):\n\n#### Old\n\n```go!\nfunc BenchmarkPebbleWrites(b *testing.B) {\n\tstore, err := NewDB(b.TempDir())\n\trequire.NoError(b, err)\n\tdefer store.Close()\n\n\tpairs := generateRandomPairs(b, b.N)\n\n\tb.ResetTimer()\n\tfor k, v := range pairs {\n\t\terr := store.Set([]byte(k), v)\n\n\t\tb.StopTimer()\n\t\trequire.NoError(b, err)\n\t\tb.StartTimer()\n\t}\n}\n```\n\n```\ngoos: linux\ngoarch: amd64\npkg: github.com/gnolang/tx-indexer/storage/pebble\ncpu: AMD Ryzen 5 5600X 6-Core Processor\nBenchmarkPebbleWrites\nBenchmarkPebbleWrites-12 \t 1316\t 928941 ns/op\t 33 B/op\t 0 allocs/op\nPASS\nok \tgithub.com/gnolang/tx-indexer/storage/pebble\t1.384s\n```\n\n#### New\n\n```go!\nfunc BenchmarkPebbleWrites(b *testing.B) {\n\tstore, err := NewPebble(b.TempDir())\n\trequire.NoError(b, err)\n\tdefer store.Close()\n\n\tpairs := generateRandomBlocks(b, b.N)\n\n\tbatch := store.WriteBatch()\n\n\tb.ResetTimer()\n\tfor _, v := range pairs {\n\t\terr := batch.SetBlock(v)\n\n\t\tb.StopTimer()\n\t\trequire.NoError(b, err)\n\t\tb.StartTimer()\n\t}\n\n\terr = batch.Commit()\n\n\tb.StopTimer()\n\trequire.NoError(b, err)\n\tb.StartTimer()\n}\n```\n\n```\ngoos: linux\ngoarch: amd64\npkg: github.com/gnolang/tx-indexer/storage\ncpu: AMD Ryzen 5 5600X 6-Core Processor\nBenchmarkPebbleWrites\nBenchmarkPebbleWrites-12 249462 4730 ns/op 1704 B/op 43 allocs/op\nPASS\nok github.com/gnolang/tx-indexer/storage 4.669s\n```\n\n## Conclusion\n\nIf you find out this interesting and want to have a deeper look about [how it is done](https://github.com/gnolang/tx-indexer/tree/main/storage), or just try our indexer, it is as simple as ramping up a docker image:\n\n```\ndocker run -it -p 8546:8546 ghcr.io/gnolang/tx-indexer:latest start -remote http://test3.gno.land:36657\n```\n\nAnd start playing with it through its GraphQL interface at `http://localhost:8546/graphql`\n","2024-05-10T13:37:00Z","ajnavarro","blog,post,tx-indexer,dev"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"12qMgmctylWeV/G716QMQunkORkPg3F7A4RcF43HwDIIFItF1dl8yKnDTkYUBFhChGkxEB198FMwDG17i5Cxow=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"sLT6Vz/WoYSBzhvy3HfYkvkpmOiEJQN431hcIr3PgtFMKHeYZln7EGdMWxRTCiK1ZbPu6syINDJGcCVkaw/KCQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"85iFFe6EXnFdWNeDKqrtxLq8Ue2BRXVMyMGG5NMPdR9+iCriQ+KHl3+Qxe6+8Xzvo0dIWOGNEzbMjV+JdpG7yw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"Deposit","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"rvCvMTDvbDPKLrhXulNOxF7Eyi37I7uEOIUhQZbxGh0yq22kxBz/s+ghG+Co6yLvHrQ3QAaR0KKnvcSo+CMO1w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"1ugnot","pkg_path":"gno.land/r/demo/wugnot","func":"Deposit","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"9peIcnvig0Wqpff8zvHIjtCA059U7LMs2SF0s1sYqNglQQkZWQYrR3f1dREs+3omDNs3Y+9Bo0EDT3wa9ex4Cg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"1000ugnot","pkg_path":"gno.land/r/demo/wugnot","func":"Deposit","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"UnsKcwpIbX4d8f2rKZQl9Jc2FKBbbl2iuLyVFazcHeRlw28vQse9TSS27qalWYcjbilUO6MUOV1DSC2IUW5lIQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"1000000ugnot","pkg_path":"gno.land/r/demo/wugnot","func":"Deposit","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"cVEIa81+y3PItEnxIPB8PAK0OrrLN4xHS+PmvSCAtNBj/SNguSNYAOQk8PlmbGFFtzwglOufW/q+cD6/Q4If9A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"1000000ugnot","pkg_path":"gno.land/r/demo/wugnot","func":"Deposit","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"2ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"oM/8gzkOmemLTMqOtZJlVDaXAbpRS6sMrj7G0iZ9/pNEGWwUaocwwaIQBciRmSMXxu628miOS4VdRV7dMJTOTw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"1000000ugnot","pkg_path":"gno.land/r/demo/wugnot","func":"Deposit","args":null},{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"1000000ugnot","pkg_path":"gno.land/r/demo/wugnot","func":"Deposit","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"CRJxQzxUt53jlsnH4+0AdY0+sgrwCnVOyHLIlB4PR18aq/86dotZqyq7Yo/fgnljoIhCKwE21oJkPMTYlaP2Rg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1fjh9y7ausp27dqsdq0qrcsnmgvwm6829v2au7d","send":"","pkg_path":"gno.land/r/demo/microblog","func":"NewPost","args":["once in a previous life he had lived in a hut * now and then he stops and eats at the pizza hut"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1sQrIl4krsBIKtCTfMqWzbkKQDSfmPtMYQA9EvsJqmu"},"signature":"wh0BXdSXEw7QibFCYMacNI/ZcFBKSF+zCvgZkh9egj4giLeVgVyTaH4iJeGB22cX9PcDnlYqH3XV3C5vOHjMWA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/memeland","func":"PostMeme","args":["data:image/jpeg;base64,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","1715771529"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"D/7jVx37v4vucF7McAOPnxGgMjjA6wSJykSKkOI7PXUADMcBPv/ggzQKJVojgmvgZgyedcbUgpb1hPEcQfZnDA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["000000r"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"Xc3z5k2bbecsULC2yr8CSxnCn0G1Gz3tj9T+VGKSqhg6Ly/W3K9YZ2vCxqrDnPJzOEKJjnlOWo6bEoqDmlhTzQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ajg796sf4f5fu8lu9eu848cew3c9vl7cj0nmnn","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"vZSq7xgLF/gRqXDAuQHVM4dMTBTdDGyKRc5un13hh6oKnp8QcEj5DONdwyYTSiIfpXr0Jt4SeAxSsVkPAnD71w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dvfhkhjp0qgrrm4tr065aqz6ntjs0qr7rtmxuu","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"K9KJfwi4nsVWBE92eaqADuxHAHp7+XR0AXP4Nwm728ZCb5g4ycaiVftGi9nvXNUjVxmNGtHb9wiyXQQZkqslnA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1vsc4t7d8l8arttauup093njj8qc0eukm6ng8ke","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"5CtqLN3OXNJ0xf2fc0ccOQOLv5Qehgz0zY1elSlW3REZj5QrOw+vfBLLJECqp+lSOnKOMTnVejnRP20US3EUHA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1vsc4t7d8l8arttauup093njj8qc0eukm6ng8ke","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ajHkIqJgPEs5IJOAFItfZmBW9GrUV+3e8HL+J5T8AE8vgMdRyy+ARJHKtKSdjUpIqo9fmKhxuA4wWgRhmFbGjQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1vsc4t7d8l8arttauup093njj8qc0eukm6ng8ke","send":"","pkg_path":"gno.land/r/demo/userbook","func":"Render","args":[""]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyX0QnOS9127ryq7Di6BbFmHkygS+DxzK6l4+4UvKoAS"},"signature":"Aet0OlqT3AIrwaPNXKY53vp/i+nMgjywviTUvvARRdM+1DXccL9aSbdjOfg9O+YwxkBpRk7P7zLHz3VVZ8kL5g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1vsc4t7d8l8arttauup093njj8qc0eukm6ng8ke","send":"","pkg_path":"gno.land/r/demo/userbook","func":"Render","args":[""]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyX0QnOS9127ryq7Di6BbFmHkygS+DxzK6l4+4UvKoAS"},"signature":"9nyArLs78ihtdX/FQCOJRgX5PKbA0v9XKisgL1k5ELIJcnZPIAZ07TlWLNKMwCHCRUyaAPrthgmxo+GoTnqQTQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1vsc4t7d8l8arttauup093njj8qc0eukm6ng8ke","send":"","pkg_path":"gno.land/r/demo/userbook","func":"Render","args":[""]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyX0QnOS9127ryq7Di6BbFmHkygS+DxzK6l4+4UvKoAS"},"signature":"oGO9TsZCzQSRMwX4hjPcud9fXjQErMrqc3MVKbwUxbtZEbzeEtTJRH2y/pe0ivNO0cXQnubW5g5RRO5dTOLEOg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1vsc4t7d8l8arttauup093njj8qc0eukm6ng8ke","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyX0QnOS9127ryq7Di6BbFmHkygS+DxzK6l4+4UvKoAS"},"signature":"hpMZmvk3tBDqbzy5L6Hz4e7loFziGS/D9zA3eXjA5Gsu1romR51INVsiqWpTzI2f8Xoolczu8uIhybxNMU89Eg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1vsc4t7d8l8arttauup093njj8qc0eukm6ng8ke","send":"","pkg_path":"gno.land/r/demo/counter","func":"Decrement","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyX0QnOS9127ryq7Di6BbFmHkygS+DxzK6l4+4UvKoAS"},"signature":"HZuQMHHALNqsg/4Ar/bOyFVb/xF+bR4astWCkDw8cfMvwiAtqRKTivu2VJKaxbVTQph4oGqD7nKw2BrGmcgWNw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApW/ppgHadUkxCHXfJ29lc0cqkc7X6A0FaET+6xbvD4t"},"signature":"zEnmC6+Zn7fuXhvNW/tQwSSqnO92ABG/P2HcllYcr5tta+4UEQwHLRJ375ije6Gs+yTcwvFnzfF1GGdlJ4SQHg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"8000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApW/ppgHadUkxCHXfJ29lc0cqkc7X6A0FaET+6xbvD4t"},"signature":"Hv/90yB6cZ+wt4ClEwlS2zsTVM44hyTBVgwS1VUycCks/duBl+FrsSF6VYAZR/kNUxlP8oC8hy2i9rddaGvTfQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"CreateUser","args":["naruto","Naruto"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApW/ppgHadUkxCHXfJ29lc0cqkc7X6A0FaET+6xbvD4t"},"signature":"OxjWIg7rikZVMbjV+lvxDBqzmNf38tASxp77dWFvLgpFFuudPMS3CKVaN303yiWAFjw6RgWKjgklm8uEk+DVVg=="}],"memo":"createUser"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1vsc4t7d8l8arttauup093njj8qc0eukm6ng8ke","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyX0QnOS9127ryq7Di6BbFmHkygS+DxzK6l4+4UvKoAS"},"signature":"nZ9JhBTjfbm8OiLcEUCfrkJHPiR03PtyMTlyNyL8NaZ/K47vwtcLWprAqE2LGjF/Oz3XZzyQjI8p1XD+16l7xg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"UpdateBio","args":["🍥 Hokage-in-training | Master of the Shadow Clone Jutsu | Ramen Lover 🍜"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApW/ppgHadUkxCHXfJ29lc0cqkc7X6A0FaET+6xbvD4t"},"signature":"GIO/qUGC3PzBRzs4jP3APnKWEHqCmnDCc2nqSaEtk4hQdDGD8yN4ocZs2sQhrwscwiDovGoqshLjPMzAHgwwsg=="}],"memo":"setAvatar"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1vsc4t7d8l8arttauup093njj8qc0eukm6ng8ke","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyX0QnOS9127ryq7Di6BbFmHkygS+DxzK6l4+4UvKoAS"},"signature":"flRNrt7wgwdh8Va2swCsQyHnnHl2pzgzklfcZ3IIPWU5+C4F4ZBh/h5MfHaWADKPJe7TJRvI9q5y89l8E45hPw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"SetAvatar","args":["data:image/gif;base64,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"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApW/ppgHadUkxCHXfJ29lc0cqkc7X6A0FaET+6xbvD4t"},"signature":"cYR24lSl7AX/OBmR7eMnqkhsFHZD7J3OSIUWm7PwCOJDoFkQmrNaG+520upbiKQeWlpkkBxVfyFdaK5FGl5sYQ=="}],"memo":"setAvatar"} +{"msg":[{"@type":"/vm.m_call","caller":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"SetAvatar","args":["data:image/gif;base64,R0lGODlhcQBxAPcAAAscFA4fHg4sSQ8oHxAlMRMuJxU3ShYVERceFRctMhkbIBkiIRkmHxktIRwxahw0MRw9Mx0vKB06ix07bB4tSR9BUyFQjSI4SiJJYyJLpSJMciNOvSQkMSRBQSU/NiZLRidV4iha6Clb7Slc5ipc6yta6Std7Cxb6C1a6C5a5i5d7jA8fTBFWzBPfTBi5zE2WzFMQTFRpjFj8DJDPDJVxjJbfTMlIjMuPDMxLjNZ4zNptDQ9MjRASTRUSjRXXDRuzzUgEDVp8TYvHzY1STZw4zc1Pjg9QTlu8zpmhDprmDt38zw7SD04TT1TTz5WYj523D88SD+A8kBVVkBjUUFHT0FVtEJ1tENWf0RESERlbUSA9EaI8kdkV0eM8EhSUEhqYkk1NUliW0l72ktqXEuK5Uxuhk0mEU1zbE2P8k5FPk97kFAyIlBFR1CX8lFFM1FaV1FaYVF5sVGMz1QyFlRDIlR0bVSJtVeY5VhOSFhmYlic81lwZFyj811TT117i156emCIe2FxbWGJjmJ9cmKZzmKj5WOQsmWp82dsT2xsNW2Af26n2m6y9HCJh3CSh3E+J3M5FnSXlnWfvXZROXa79neZqXlMJ3q243yr039YR4GHhoGTi4LC9oN6cYOZl4e74ImlmIuquoyiqI6noI62yI7H9JFuTpJKIZJUM5SZlpSrqpXP95Z/cZbE4JiQf5m2sZy7xaBoPaFmMaLR86fW9aizsalUJKna+KpZM6rCyarO4Ku/uq2nka6wNK/LzLCWibLd97NzTLWIZ7axUri8urnIw7nN0LppNLrf9ru8f72JRMDb5MKKVsPDvsXo+cfPz8fX0sfi88htNcna28p4SMuqkNDCudF5OdHh49S/iNTq89fgitl+R9mKTdrLTdrhatunbdvm5tyVUt6Xa9/s8ODJuuHh3+KWX+OLTOeWUeewVOndwunwUOrf0urv8uvj2ev09uzq5u/q3/HQfvH0YPH0dvKfVvLxU/L29/SpZvSxdPT3UvWrWPa1YvTHVwD/ACH/C05FVFNDQVBFMi4wAwEAAAAh/ihHSUYgZWRpdGVkIHdpdGggaHR0cHM6Ly9lemdpZi5jb20vcmVzaXplACH5BAUHAP8ALAAAAABxAHEAAAj/AEkIHEiwYMESKUCkWJgwBQqGEBcqlNgQhEWFFhOCyHFRo0eHOVKMiMgw5AiMJzB+hPjwBMkQKUKgMEizZgmYMBli3KiyY8aMFS/u9KmQo8qGCR8+TBGSacWnN2GCyLkwJ4gTJ0KUqMm1oFaJRoMmDAlUo1CjQCdK7Hk0pNsULiBaJPtRbcyHCJFS3dq1L8mlEKnybJiD7sXCPxdybOiSYtONJEc8Vqx2YtPAJTJ/PdG3M4nMAjNvzUz48mOVb52SVCwXYmGnIyMuvcyY6gnSN0WTGOG5d1etIU48PPl6p8PVrlOcKIyCtmLADFE0Xlgi622XJVDwhflQK+iDvkPf//zcefZY1kgZNjZMsun0iLGZNncoPevNu6L5ht/fuUQOFPGJpNB8l0GHHHrHLWTggi5p55BMmd0WGkH6hWZCCSbcNlOF/Hk2WnXeZSccCiSWaOKJJdJnYoO6PahdddmlQMJt33HFYX8DcXgjeKBVqJlmn+lGglafSafdiEopqNtWWqGgFY1ZpZBffl1dSN6ONGHpoUE1ChTihJmhmGKD0jkUIUJnwhjid1p2yKWWRPYI5pAchshZaGKWKJyUU07pnZMwBtqlm+ApdeKM2V3JpmhQBtnjkuOJxieNomnHXX7U9akpoVnORMKDlWqaWYZUjvYpiVjdl592M+ZYaZ6Ibv9IHoTYiToopxQaOpoKpoJZ448FmSBQTELmqqKepMoqKaBh2oorhbcNmJkKjcVVZY776XcnifSVoMJnNDrK4pqi8nejjAhldKGwwgp0IYzipZoqefFel9tolAbrY6RB9jshvaN5B55N7v7Lbg4xCJIEDQ6ZcKEKJnzrbcRpAkwlnf3y1WuW4oXg6IcVWoltkTJmW3CGvPrByzas7FHGy0hsIN/DJohQnayubiiaxx/+y5fIvTLZM8gcA/wsCQi78g09+7DzzdPfJNOLJ5qUkUEMP3gnHL3i6dxgiC9qCrScH0pJbp+Kcj1y0SS0i/QGyTC9z9x0001PPd6wokgdZSD/UQUNG9BAww8KLdlun0/em92U/j4KsqTZJS7oreGhkETc99xTt+acz80OO/Q8nUw2vPASiQMbbEQiaA6PnNucXN/IpqIaRyrkxmpzxW4KVQxDz+f0yL3PPb+DTk/mv2t+dz3COEEDCGF/dnifUt4GNuOLOvrxzvlBKGiWbteEMC/sIP+NN+h7M0wvpvTCTt3v2z1MHlXkIILNKFx4Z01ut8n2/lzqDYb0w662ta0EP/DE59iRPm+Ajh3DGIYD41e3uoWuE0iAHomodRtQNUtUYzPVhyS0KmKliXGt29KEdJCN4C2QePdgYPkqSEPP7aMeyVDDBnJwIeXUByvC8Zj1/0JVqtppz1ZBu5eN2uWw8A3kcg1s4DeMl7kKas5uokuFIDJQMtwgUU60uxKiHKchE07uYvpqW8RUADGCCOsKg8CDEcAghB2AAQx06EMnXCEMVrhCglOs4j6Oxw5TOMECMWCYQ8AlHkHtyU7lstjjkIgVQIXvYTIIgiaPsMkgYEggKmjBDcCQhjSw4ZSlnKMQVgkEBIABD6xIRj2QN8hvIIFhCvlTnoDIrcX9kFK2w03JhmRAE3jsSCJCVc1UIINmMjMIWmhDG/TABz6g4QgQa10L3tAJUpaSDWnAAhZOSc403BEMa5jEMJZGvHqkogp5IcGGevnDZqXqg9XJl+vodf8RwdGARPrrkgmi0IUuRCEKSohCGxhBCUpwohSMuKb0SlCDYsSjm6Ys5TjHSc6OgnMNmUjfN7bhB0XW6F07cxAyF4e9nq1lAxvIgAUsIIEVTMABGcgBr060OBJcohWt+MQlCqGHOzj0oaWAKBk8SQIXIKEZ5uhEEcr5TY921JRg8AIe3MBNP1RhIdcRVhtn5csX1UdIJJrRD2hQhQxkwKYveMEQ4nqBF0xAAjvkFmd+VrNVzOIWt1jFKi7BiKQathSXaIMSOPmDFtQiFXAYZyknW1WrlhMHNljAEl7w1UUOKQWCq0IMqlCFwP1nIGxk46dm5M+3OiCuQyjCEsCAhTT/MMGuEsjAD/5jJvE4LLWzAAYwALuKwxqWExFVghLQcAcNKCIQWIBCKc95RzdYl7rn/CYWwFCE2971ajJdwQoc4AAWvOACF3DABFYQgw3slk85YGsGJCCBuDIBCrVNg3WZwAO7WqAKGwlJkarTRGY6UwXCTTAtaDGL4paCE5RgRBu60IZDMIIRVtCADYpQBHP2ARGdCHEnIpiJSeChD25AhCkSgQc60GGVOLgBBYYw4xtEIAINiEARqJsGKAxhCepdwUwtMF4HVIAHPKCCkmsLTirEVQN/cwEnMySDA9LIBM3MMsQSLFwGzyKphF2EhRsKYUYUIgk3EEIaAsGLcshD/x7xaIcs6zEMVnSiGtaY4PmGkQg3COEG5D3vDQbNgUIbutA3YEJsMWuDIdxgCEbAbzhPKc4lDHoCicxBEEiwaRk4LAWb3pUzsywDFSDj1MvwcivAzAjCMrShlDjEIeQQiE6kgRVufoc83vEOa3yjHt9IhB/LMYzP1SN4ofuGJmIAAhrMVwIa0MAEbvrauL6AvNgm77QnEFcewCCc46RCoV/wXxe0LZOkhlipsUxqUp8aGcuYxSxWnVROEDbCF5b1IfggBkFYwxXWePObed2OX9eDFdaoxi8cSLzhBW8bgqCBuYV1AslYZK2D+4HGN044EHScBjGo6QQwwAIq1BYMRv8YwgUwvcOSGbjdMGfmu70873o39MKF4MMduqCHNpBBEOtYRzV4zeugy8PXwa5GH5MhyH1ETQ000GmWgwDzqjdTk84UiEtAsIGajvcF5l2CEWbwAg241b0ngDm72/3u4d5C3mCWNR9yroeCkmEL/W7HO3K9DmJYoxx7T8Y3TDGJX5iC6cgupBN2q+mrW/3xpVaBJrGuSRPE1601VS9dX7CC3KYA8u5+NzIA++VY3+EOc+dD3aNABC08oRJ613U83qH3XcvjF8IwBSuy8Yt1yu0ew1iYgB1fdaqveyBrp7rxq66Ci2DcvRshAeizLHpkDLfBlChEIfS9bzQclAhPyMX/7HVN9HWUoxzrsAbuFf73Yn9jfa54wwSqsNvlF9/4ERMWXD7VxLbZn9STB3P/939Xd2rO4AzC9XarwAnaZ2GMwAdtsAWsRwZygA3jJ3Dy0A7WsIHt0IHmtw7tUA2u4ApmAAY4EGP+BVOAQ1osyIKDAwIuYAJHkElUZ2BYR2rsRnmTt0mclElYZgJUl4OcFATIcIDOcGoKaG8OWAhtgAZbgAYGhQmyh4G2R37k1w4D1wcnyGFFMGg3YAMUgF5xVW3WlgAEMAGIpAM/IIM9aIM0GIA7GIdHMIdzGAR0eId2SIdGeITAwGCl8AkQFmGHQE2qJ02SYA1YSIUZyGsCR3QZ/9gHXBiJj/ZjS7AE98UElVgEHOAFgeAKvJAHFIBpP8BpdTh5LkCDQziHb7iDqXiHrkiH2qANByhccHdcgih31BQHvFB7cCZw5VAN61CFtvcLbFAERnCMHDYElFiJYrcEUGCMVLAJqlA6tJcHCpAAaFhaG/cET0AEQUAErqgEUpaH4XgEymWOypWOeiiL1sdgglVvZSZ3+6YHYmAI5hB07RAPvUh0umZ7R8ddUHCMRtCFsuWMUMAECAkFAekFxFALxGAOxPAMF8UBNwAFg2ZtY9gCiLSN5viK6fiRIPmRQaAEsoiA7uhgnBCPhUgGLKkFNFAL5/cO+qiPGEh+b+YK3P+FiQFpkcpoiZaYkPhVC0LpDtZQC+ZgDn1QiUOwAByAkJiYiXO1bYhEA9xIBESgBFcZkgmllcp1gMhAC4JVXCmJXPPYhE54UFGgBToADTSpiIqICGAABc5YiUbwaJF2XwbZhZpgDpsQD/HwDObwDIHwjEPAAQiwAAepkwbpjAipjOr1Xz8gBt2YllpQmcpVmVqQlmh5UM7wdseVkvmmB3XXBVuwBZl5mk8QCu7Qlr3ologglwp5kEXwY0/5lJaGA4FADKlwlObAC8X4jAugAAewAEMgl/e1k88odhwmdnW1XhmghmKAmZhZmtRZnasgVIwgaxcGgVBYnRKYmWhJgdP/wJq7FnRuNnvWoIU+yQR1aYxzeZBLwGFvIE5voAm1IFVFgAWaqAD8eQNLMARPiZyYeIk+WYm3ZVfspXEsuaAMuqDZ13PTJJpmSZpbQKFRIIEHpQVkIAbi14gaWDqpIJSbYJH+iZc8KZeW+GM/dgPihAMedoKRFpwIoACzKXax+ZOweYk6CpuWGFc3FVcYsG3TJm0ToAHSZJZkUFBKSqEUKoFLuqGG8AzTAA3EIApxoANY+gNWEAMO0AGPhpeYWKMD+p+WWAQ4wAE4YIwneKYLEJwL4J9zyYyVGJDNSJAAGpvRpZAFCqDJOJt9Kk1ocKQTuqQVuqRP+gN2UAl2EAdi/0AGaOCEj3oHFkAB3SWnN9Bdxymn8TkEZ3qChsaUiCZbKDqncsqFgxagCpmnKGqbozqncgmogipNXfCohlqrj4oGC3qrgQqFzBUHAiAAcCqXl1qg/6mMsdWFh8aUCmBol2oEpHqjXThocXqQeBqbKKqnz4qtgiqaEBqrTXikt3qks/qtgRqrpxcHTsBh8HmpADqXxhqfyPqpbWpoMdaszGiqjzaqPGqtrnqj/WqtEEiIF5adEOitR9qtBguuR3p6ckBkFfACTPCllcgDxhpbXngDn8oB88qsl3qxl3qtd4mtsamT/LqYJrsE2XcIRwWa3HqwESpN3dpzCBur3SoGVv+QBBjwAmH4lDwgkNFaaA+gsW06tKAKqsy6nNaKrU55idRKqrFFrLAJBV9WCmEJYaonoTArs9TErVzLtS/rtdwqBjFAAR2wBEhGsQNJaMlKtGy7sexKpvC5qpaIX5U2kNE6rAZ5owp5C8DwjshFVF0rmlcruISretV0uIh7tYZ7B0WlBhdgrKaaAIemsULLtgGgAAiQuRFAkZFYqfBqpmu6pjZgA5PIjApJsgk5XKUgiDpnuIbLtYdLiIlbTXI3u6l3uHeQARdQBBdAaJJ7aDbAADZQaG3Kn6O7Squ0Bm7gYo/QvM47CZPwvJZgCdD7CGuAABSpqaSat18pVDlHu3z/II/hO777Vr77drjcl77qq3p38AMYQAEU8LuTW2jHCwRCYAZCYL9rsL9rQAePgAqycAzH0A3ogA72cMD2kA7dQA3SIA248MC24AYzypTDWpD+CgVHCFHqu8EOyMEOOLAgnG/6Vk13QAYWcAEJIL9Ei7lzYAmnIAunAAmQ0LxzMAdrYAZzQAeWgAq4cAzXgA7pYA/5kA/2wA3XcAzScAwPjAuoAAYTzJ8UbMGjeoSzgG8hfMUDi29WfGGw1sVdnG8kLAdyoAMvkMIEQLmVOwndsMbcIA22cAqnQMM2bAZr8Ag7jAvS8MNBnA/pQA0MLMBKjAqWYAZPjAAMcANpW2gF/7kER3gLq+vFsBaIkDzJX/xqXzyIdyAGP6ADMXAFBiAAC0AAm8sBCXCCwcDHRiwNDPzGj0AHc0zHdmwLuEAN3ADECXwNDJzESjzIM8qfCrAAcBAIiqAJnuAJijAIgeAFGGx9XzaWzvzMlExmzwzNN1cIdyDGnJwELaABL1AABXBjN/AAO1AEzGAP/JAOtdwNR3wKlvAIdGwG8FzHp2ALPqzHC3wMuXwMsmAGBzDBbYoDXpAHwpwKqtAMzdCQtcCHtwCWYdnQDzbNXTzNEl1m1ozNMRADFlADLSABFUAAKXwDHVAEUAAO+cAPCYwO6nwMbwwJc7xKZuC/p4DH11DLbf+cy0k8BwfQz5vLAAuAA0rmBW8QCJowCsTQDM/wDAjodoC11AuNkmMJyRP90E9dCIQgxlbAyRhdA4iUBDVgAAmAyDtG0vxwzgpMDfrczi1tA/drx6iAz7V8DQ2cx9JgCUCQ0xywAzuAAwsQAUaABV4A1HnQCalQ1M0gb4YNVIhNb6t7CYvQ2I5NCITQ2IUgzQ8FzYWwCHJw1ZycAUkwU0mQBHZgCGWAAeiFyN2gDiadDiitxOz8CHOAv0IwurAc03nMDWbdwNRgCQjQzxuW13RkAzgwA+TUB3kQ2IMtCcgtCZCt3MmNCYsA2YsaB9I93dJtBXYA2YtwCRCWktWM2XH/sKUW0Nnh/dl2kNyS4AS7awSTIA5DjM7UgAtvjNb4O7qj27+WEMC0DMgOvNsKkKYchgOvZGI70NdUcGKB0AeBwAp9gwQM3uAM3jcLjgQ1MOHRVuEtgATjHQfljd2PbQd2cLPineHXjQmYAFSkgAGQhgNqrNrXYAsuHsfuPN/0LQR1bAn07MA9jAs4Xa++PQeogArsPAduEE5aRdyBjQEVgF5KfgEGoOQG8OSfLABR/qu/WgEVgAFYXgNlkARqQN1x8NlI0AJirpFJoOGEgAmfAFSzQAuhUAFGsANrYAnM0A1u/OIy/Nr0PeNz8AingAqy7OJ0gAAbxoVm8AhL/MCn/zAJQ84GQI3gfeDVBBDpkk4AbRoAln7pmB4AoTzpBGAAHXABLMACGOADLOAETsACVi7qGHDhcWAIZ57mhr3QonABHWBHk9DAPczalsDSMr4A9P3Sdjy9YHAAg96FOGAJgIzEDIwLluAGjP4GfYDgBvAAZujNAwAA2J7t2J7TOZ3tmW7pBaDpkp7CCfAAHXDuHVABGoAEoP3q8kYLCqYLlcACF5DXc2ALtr3ssrDrNmwDQGADCsAADGC/QnBdvh5jHFbHeKzK0tANqYwLcoQFVKBVeYDq014AA3Dt2q7tBwAAHY/t364Amt62Ix8B5t4EToAEhiAJaN4K8pZgpxYNy/8QCUk+BEAwB8dwDuqcxExsvWYABAqQWZnr6xFgA0UP3CcoBJYA39JgxECswHAdC1zVBDDg1xKO5B2QAANw6SD/7Za+6QJA7mIf6W066QVg7j3gBGWw8qTg8gv2bkYo85VQAZwqBI8gDEDcxrvszqO7AJn790Mf9MBtA48QDKqMC9yAwPbg8NcQDLGACIGwB3DwBmog4SwA6QTg9Zju0R7QAT3QBKEe6lZ+AfFrhpxu7h/gBGpQCZJACrqw5sBggEYYi9EgCjwwaDjgBrJAwDzfzmuQWZjL7f3890F/86iA6z4sxAeszkZ8DJnQCYIgCH5Q+VnAAh0g6QuQ6RkfAAP/kAAd8AEfIAVZ8Ad+oAh+cP5+UAenzuRmTADe/AAV4ANZ4AeVEAqt8PrLsAxFGA2xCBDatJGLpopKkSI4hDwKRu0YLlSPhNiwoUDBAYwHEGhUAASIGVTUpEnjZq8bt3TcrlHrhk4lrkyKGglSg8RJBQMJdBLgmYDAgwcQOgj9UMFJlj+CIlUK1TSUKEF/svjAKYAngQQQLvjI4odpK126kEVzFk2gQHJpjfl5MAOHDYbBZD2aM3HBxYwYASDgC+QULlsk09lDd+zYyG72THKjZuqPHz9INLC40CEBUA8dPmyuwKJJD9A+uJ7xo1QUKVipYYWq5KeMExY5e17+wNVr/yhYupaRPYt2oLZljR68BYIHlaVHZijyxbhxo0YEcC2dOsYNncuRtnChs8fPXkpusRAp8jO1A1CgHTQ38XE0TBYnTtofLVM60mlYrXK1Wh0p0usPLngAK50SqK0rpnzZzSy0yOlNm2k86YADiuagYw0bgLCBr+cCQCAAADQyYw5LbKGGG5WkOUa7Y7jjh590XKImk0EUge08zDSTIowz6oAMsj+kyiKLMpSKJBTU9vMll/7K8+ED9SCQkiiulAollwUZdPAsbJYxppEbFrBBiDUwpKgivBBQIMQx53hEFmmuueYhW1pU7BrFvIvxmlhMAaSHoSB4ILMPnKgjqftEEf+lEk/8E+RRpSoRBTdY9ktNlEj8OAO+Jjr9LLT2EL1yGVIZFCgaUo3x5ZU/IlAAARzAkJUiBTb8cKOOHnkEFVxEAgwXPF/kp6QXv3NJGT8/mDKzHsKoQxFPVNklF2qpheUVURr1776mVFutEv+CrGNccsfd9NCkKlElF1+mIXXBZaYxJpddXhnljQWii1XWtzbMSAEh3DwFFcO0u2aw7hQbzDtjGYvljw88gCCzJs74475dfDHmXVKhWZI1cP3zRBRVmsJ2W0caacQRT1puOZJG/kAXskhUqVRjY3JWlclrVRHljQAYiACHNNIAAwcGFmhOCDPo2BUVWwLrBuGEvXP/UTGXrglGkYg76EGKMxrxpJZcjJkGm7TSngaaeV9hFOZIjNw27pRrVuWVXfKuN1uYg6RZUUpT2+XaV16p5fBapAhAAQpjfSujMZ1+5JS/SEIHYYZfbEnPGLlRxpVOp/jij2hzgeZsctyBZ/XV45nm9VxOFgQyQAAJEhBB6ia57JzXVnUXnz1pRJHHFFHEkUhcBvwVWHYpxhhodsmDg3wVWCBfjcZc4xFIppPlGJamzlNYGLlhuHNqUjljD9LXNTsc1VmXHx5ysJnmmWJ2wTRImc39QyaSTQt6Z3udvIwBPFHETFzo+oPYSHazZxCwGJt4QwSegxEg4KBMj7AEKmRR/yeWXE4x3RFWOq5RrO+YkBfHk1YxnoG2+MEDH/ODhzvCYb9n+KIWCZTZGb7wQ4s5AhR424XZ0EaOcNwQG6p6hSeIt4c8RPELe1DEJkSBN41NI4nYwMYzdrGJPGABB9EhEx0EFrU6oUiE43tROrpRLD11oxmgUIULsREOctAQH3vkI/3CcTpjFGOHiqhDHr4whinWQYh4e8UL87i6tNwQGrFzYiCgGIY8UNETo3iFL16IRyTarxjEUAUYFbIGyUENF4A5zDXWSMIXXYd8igFHOZwHjTu6Q3UzXB0ffemOeATTHGsTpCdklocxjIF9jhgFHYtxxPlFchqxE8UTo/isTf+4j4tp2yL+arGJPTBtDXNwE69wsaJVujIdg8mHsOxhPvJ5JxvQeCYMd8lLX/IRmOZQnQ2xMckmykyZe6jRIByxi2mkDZLcfN0BVeGIQewBinsAxCZKZ4wI3lGSgkxFILygQXLqypx0ApYIF9adGMXTO/poxzOSGL89yjCffDTHM8yxR13WL5CqcGIYfDqFZm0iF/lz3sa4yMWcFUMVjRhEGKTwVKdikoqbGIUq7la4V/A0onnYQRnp0r1VHoNywELJOtn5znTwQx/8UAcJrREPaKROlzGdKU6hQYxnwNQdSLxfE5vahBlkJgzZBAUnC6e3WvDUE5sIRB6k0AMYwGD/BpPdkUQDoYhRjOJlkQDEHsbwhjcYAQySc1P3PliiY8jJOmb9Tkny0Q/yqSMb8dgENmo417rOsBmd0MQz8KHLfv5TqY2oQw88EIEIeCAMF/NEarLK05TVTmZfcKpkA+sBD8ygWXv4wiD8E90/2G5leWCDG8ZJTjdZIhZyOedIqOHKy+3JO/nIhzr6kQ5mVOMZbxgFOeLhX5nONB6aeIMqwoHTnE6jGH7dQxMekNwmfEERolBNVoVXu9qdIQw9gJLE0INd7X7mC9Ll3x8GAYhGGIENfTBFJlixhqZlwhSxiMUqgxGM1F7DOuiQBne+k41yZCMfzOBFMx4gBVXg8qZ1/3WHKt6giWkAlxxrw58qNDuIKXigLVIYw8Xudq1secIR0j3DFCIGgQIMQM0DiEBQPBDZHnDhC+MahLma4AkpRBEPrkjDi+kwiUmYYhKW6GAwmNGNkVxjalRLBziyoQ9mdGITr5jBA97gCWi445c4JYYXvFAL+5ljmNB4hr2G9wcpnKcHcwZE8oLHKG2Nucyg6YAH0hyANRdgYm8GzRS4QOdBnAGiXsjDIDpRC16wAgxumISLdcVBVDBjHCKJ02Hiew1mqCMf1OiEIgYhhbbkIa+bxsc09rADReD1GcRI7CbGPAh4T6EDEYBBd1EsMkzBrG6O+AMXuMDhoRRA4ANv8//EYACaJvi7XHUYhCfe4IWH9yEQmugEIliBCDM+OxayaK+KWnQOZgRjHPmwhzC6XYdGzAACPfCEbela7k1kVxGJ9QSWfd2jHnHhPB6oGMPhXYfaOSJlMQv2GbgAVGUBZeDo2fXBe5DwL5xB6j40Xh68cNlBBGLivHBFJlA5CV11kJXSOKd1aCwOfnSDFYqIxB9eIQUpNeEVqYNHMCMEgwf0IA9hgEF2e80FH5oZKB/gAiKjXodDRt12PfwCUDms5QIwPShBmRhoni4F0QExybVQxGfGoAhejMIVmnAFLzKxK7rsiuOrrNOcZMyMIbvCUa8Iw5m/kAtJTqMWXkDugwf/EJQOOH0Kwx9KUD4gfMOHwcxPB6oUOozdKQklspENlN+l0ARfG14RZvOFJwDbg6kSoxmuQASLg2EJck6ixlGjjjRkEWhwpIMVJeOsJwDhg6F0IBAuXHcgjtsAgSu4zAi+zUAzXfOAzZi+HpiCT1mWWvMwoBAUKQm+BfS1vqOYJoCqMPgCKYiEA3KE64OBMGiETTCeVOCFTpiEYJAGVJgDVPIgwKAcU+iDPggG/HIFVQCFTmAF5GmE2oMAHlAEVeC8GYiABgDAgos+BDTAAhjABFSPKBGUgZtCKoy84JOzMVC+iPGAy5MCLthACasDLsizBuuBRnCeWiA/RMgEHYsF/4n4M46TBeRIAyrAAxsMBlbQBFYQBmbYlj9oguwSwTwowiNkswicPAiQLDQzPhh4QOhDjzQbAFxbszULAFxrgDabARjYkTDggkYklCboxE4EhDrYg0ZoJkWQghkYgzqqBVBIBUSIBZc4hkfAgR2YhDg8hUcwAhhwAxqbhERIBGYQh3PYFkGQN0EZFCMsgAiIPCnRsqA4OMh7gA8Ajc2AvmQUODWbREu0RAD4RkscgMh7s1D0t0Dxminwqcf6GiHchVoAhCaAAS44xcxiBRvsBmqYBFtUP1yQhVOYBF40gkygAzCYAUQQBnAQB2Osg/NoxjUDwAaAAE3su+ADKvSAgf90dLyDiyyVe4BIxLVu9MZvBEdcG0cYSLhAIYqnO7gwgDeZqDPI4jIuCARHMIVgQIduuIZM6KpdwYVTQA4j8AA8QARTELRJwAMZc5Qx6wE0k8RwRK5EhKzIskBdAxvqCoNPwb5/ixiPHDinHEmwHMmSHJRGTMaJUY/IoiJFGKJG4AJAhIEx0ITGYojruAZTSAMcoAOo+Uk62AEIAINEOAZ8jAgwgAGoAISUqQNbc0pci4CVS7h4zEC8K4AmQLFx+aFD6pE6OIPHczoI2MawDEsQGUsPi7xBgYAP8IJMOL00wLo9CCwYGIRU8IRMuEl00JpH2AEwmARU0MU1wAEceAD/NyCrGdmBCGANDCuuBmDM35PHo0u4fxOUDwAEzWoE2zkxDCNFqfQ3oFpMsAQRAOjG8AzPSWRGcXTM4DM/VDjKPsCDNDCCyZoBrcsEZbgObgiG3NwBpLQEOhACoIgAMKhNbpCGQYwAcBmEOTuDDigA8fy9ZvmCCJMZvPOAhmum71KE7AQEeYszzDSzWyPJkBRJcKTENHPMGTC/9ztKN0iDIriBHYjPR2AG+6QGS7BFZstNIYgA48xLggkGN7CBBkgeQDiDMegBBvVGXMu75+yuMdCyKThFUQCFSIgueKuzOtiMnsPMJljQbSzPLhXPcKREcfQALJAxQXMDN5CVIvjPeuGYBPi6zUw4Gjd4hN8cmh1oAAYgGrDDAeQ6gyn9AuMagPEMzwFYOcybAph8gA4YBFAYGUxRGcTzIR86uCm4zC9wy/O4NTVrs8lTs9AkT0t0zB1IAzworx2wxR3YgeNCLhzIhJawz0xwg1ghSD4dmghggAYQE+RCroAAACH5BAUGAP0ALAAAAABxAHEAAAj/APsJHEiwoMEQ/UCASChwIcMcIEJATKiQocOGGBlmdLgQRIqJAhEi7JciRIgU/UyWNDmyX44cAmGmAJEDBQqBKPuVMMiz58iSHVGi9HiS5MaGHQteJHlxIcScIVPsNJkyJMmTJVBK/JgTao6cIUqEFbizp1mcQxOmmMl2YEWKF3MunTiR40ymHyuiLCHW6tq9WftKrDvzpVGSJEicJSvQBE+WCCOmQFHC4degSRVWjOs24Ve2CmF6TDjCZFmWJGea5tvX6NeYML9+HVt18eKWrUtKFVkZI8x+I0BfrDmwsmWHYCGLTHmapVaVzAeehJ6Tr+2ytkOyFsv379rU3+9y/51LkeJnmsnDljjBGOFayCWvilz5c2xJ7AIVZx+YWLF+nmUlph5f0Ln0G04IcjXQCSX01xdfKJxAQlgr6bRSd2OhQEJrIVBWAgohMFjcfvhlV6JUG+oUlntCDQRVZQf2w6CDYkn1oYQNqoSait3phN1O1k1mXUH9qdCPCf7tR2JxlFmYUk4RkpACe97JyOB2GwbpHUo3Vbdhijrp9GV+JRJ55Jm2/fdffgX92M+YQKYm0E0+brnWCSdE2aBiIbJnpYwR5smeg8WdUNSbEoZ5FpJvAtjmf2UaBKF1WXlYHWsofIbCnTbhuR14Rk3ZT6Bi+ndjlwtmqeRike4EpkGK2f+kk00l5ACkhrdyNdlaIwiKJ0HWeZjkqIKSpdikN/WXmKKrmuXfl4mx1l+jNAIr5IemEuTnkDrluV6eMn4IYqp8kYCnnzI+K9C2zDabn37KPjusvP0hlGSNK1X4bqPvKnspYyLqx1eeTcr4Zrw+AuuYuwTFu6EJDUbM5rT9rskvwiPSuKfDxkY7Zrfgrstvm8wuvJh+Qv318LLO8tcsmFnuuZOQsjI7Jnvo8kcxY3GazFiKJSyMggkm5IAkCcH9xVdFJNhkE0xOQxgog1h9+GaDYS77a5i3hhzhvixfffHBYbPZE7z4uUpDEhvQoMPbcMegQxUbgLBpTZvaRDOd54r/WFacH/f0I9Y6r7lsgDoX5PPJB/dTxSbbdLLJJq7wkozllytigQ400EDTsh7K6im12ba78OGQquoqkDs37CqZ7cbuc9ALp1DFH8nU00899PTuez3bJINIBS3EEAMNOahKq9Xf+jij2A03SvjhfluZKLwcq3ssmiQs7jJjMtIQSTYF0TNQ7wJ9MwwvmijSzwYvQWTYqKVad3S/iipbXLQL3iSinw4LIKEIsriFLYxSj/tGP+ixD4I08IELpMc9Fqi7SAgiCVXwnEym9CXWZExSQPoftwRmMDdNS13Uyh+aBkI07gmEBopQ4D3M10CBPHAfOMShQbZhDTVUwSWTsYkJ/07gGP3h6Vk7kdAJDRYwMD3PcGQToKRG5pjF0UAQ2zBfP2Z4jxx6sYYCmSBBgnGFDfTjB1BCkglUELRCRe1DQWsVt8jyOmBlzSCOKdHO7vUmE+ggGWG8Rxe/6EWDiJEe30gFBn+QPBwlRgXdSwzEGDWqmk0vdVHcmMdI5zAk/Y1rZzLZhjj4g0p8Q4yC7Achs9O7bPgweREzV8Ro150g6g1/nmxcEdFFrw5WrIWK2gmjNuaYE6RgBP0Q3zYEMoxvSHAf32DHFu/BjmqKUZXlo0c2slAFWB7QaX/5AQ3atoFyto0GP6DJSyYTycZB63CaXOLB4qgtETSqhSpQAcTeRP+DMiAiDWDAQR8ykQhTDIMVpkioKVjRD0B+Q4eq3IfvklGGGPDFnlmaCQ1isIKOrmACL6jABUR6gRdMwKMrkIAFuvk3KC4LY6V6pE6IJoLuiUAGR5BBEI6ghCgcIQhHUgEIJtAPNwgkDWlwAxiEgNSmAlQIbuhEM2k4kGFo4gwZKFoOxLmBGFRhBS94ARN4MISw8oAJQxhCBdYa0gsMwQhMeMEKMpBB2ZCkpaej155aaLF+6HQL/WiDHg5xiDZEITEy+AEGAoEIgqShH05tKmSNCoZ+MHSC1PwDXcVZhSpkQAIfdUBYw1oBuaZUpSvNgGotwFqQitUBDpiABI5Hkzz/xnNM+hsVJJVABjJ0oR9R6EcX9MCIflCCE6XghB604BgaZMEcz0AqZI8q3YJIth+TGEYz+1GJcW6gBSf9aHhRmwGvonNj6fxKYlKw0Qy0gAUsiKsDVhCDun2uaXl72NH6g6ebkOES/WjFJy7Bh34UuB+cEEgpGIGGILiABld4BjHYIN3HHnUxAKWDKTphBPg6gQc72EER4rpS+RkmBd0LGgny+dKZNm0DFlgBfDvwAgwUr3MbSO8PUKDPNVZRn/1J8Cz6cYt+lKIQxSVIKS7RBqA+IQuj0AQUqmtdC0+XIFgAAxiG0A8jhPjLcC3rSTNwxpfwWATA1FA/RHClWqng/yNVsAB85/yC+a7AAvVFXhBksEbaNcYxq6BFP4ABjFuswiDJZfARgiuQN0ABC/2o7EBwMJA1GESpSMUDFBzQjwtcgAc8mIERsIAFKKC1HyaVQAba9hWIcUU2Gu0cDTwrARZcIAEU4IERjMADClBAthkAwRoh2aA19kMFMpDBkAdS5H7Q4tDJpQQj9BDYQ/QjDi/AARiMwIY+dKJy1XBFMrKRDVMgYqGsSMYwemEKPAhhCROwgHs1kAELgNQAFeABFdLK7xdcIN4rNV4/VF2FGFgAtCuArUlXgIELoPoF8NV1By4gAeTlQAV+WpiRkl2QWwh6yKWQ9iWQbFxOUGIRE/9YQj8QkYp2vCMe8RAI+aRpCl6UIxnOpIfuXHGFDEDkB09wgQpyQIPPnjS2ox3CDW7AhLjGdbRhLalJ53vw2dKtswb/KHznShMZQDKfAjGSX4EhEGQg4+MKFnk/kmxcRsQhFX1ABC/eQZB2EMQUvyC3AhlYj3pUIwnCTrbgZUCEHxje8J2TgOIXr3jjlTeDnRNnOtXpgp/umQRclYAGWKCBGOTA6y7wnsmQsYx+zKIVCk6wcdsukEPEoRbl+EXMY/4OebRjHelLRjkayo5B6pyiREs2sr0u+CAgG5KZit9L+jP4PetU8Cq4PNGIRoTQg+CzLeimxgvi9YEgo9mlSP3/6hlxCD7ooQ1oeP07rLH7ftheIO3Y/TCS8Yt+DIOq9NiGJ2IgfBkMxP/9YHzGJxBAFYDT51cBWHwKOHgkkAMu8IAPKCXGAQLdIxAAaCRi5wwDAQy00IFDxgnFRVgGRm1doAVWsAvx0A521w/xVw7tIA/rt1Cm0FC6g0PskAxqQAMuIHgWSBADaGzTd4AmkGwrhoALOHjPx2dD2H1ipyRkRwuzEHLWNoJ8wAddEAVK8APGQHf9wIXxIA/u9w7lUA30V3/LdErf4ApIUAUuQAIc51cF2IR+FXxH4hgyUIT+B4A8gYTOl2x7VoAG0YRy2A/IwIGzsAoAVggDUX6ApQRi/xAOtScPX8iCu7cOLicP61B/6wBICcUKnQADDnA8DvgSh4d44yRrjPR5OxUEfdiH/gdUsGiBfsiKBHgER0CAuBiAAbhTZIcM/eAMZudxiNgPhWBt5dcGWqAFUXAJ7tAPMDcQdOeCtRcP61AOuFcOnUAHdCAEO9APN+BwGjBwFtACKJVwo+VrGoBnP7BnP/WKb8iKeyaLfqWHu2iL9niPP5WPRyBoAqGB33eIaycQjHAH6LcFgNUK8eAO7jB7AgGDBEF3YPgOvMCNO2AE3jgQZdV0GqmRSncDXhAImvAGvxYDP1B59hiLBoFTA3GLA1GALFkQt1iAvtiPhQiFpZBcAv9pbXpQhV2ACc8giTAXlAMBhjHXkO/ACpJmkQIxBEzQD1DglFDwlEsQlf2QB5uQCsTQDs2wBApwAQ5gdZwTeUQQBEpABNVnlibwBE/QD0dglmzJli/JE0rQj/2gDb/4fVBIECaXZISlB4bwDF/4jEFpDdZgDl/4ci9XDoiglP1QBEbAZU35lFFJlUZQBJpQC8QADc9gDdOABTcwBFDAAUNAAXUGWyvQAngWA4yHWm0DdErgAkowl3PZD7MJl7Q5EM6gDcBoiAMRfnvZD1PYD3KgC/FgDc7ojAsZlLQHf5pAaVOpcv2QVhoJlVKJBZcJmP3QDOZADKW2BFy2BE3HlE3/N1qiFVaiVZ4ntTlARwZREAXK2BNzmZuEeHaCBm0IJm3ld35dsAViYAcCYZjHqZwwx4Xt0Af9sATPuQRMp5FTCZWNqQjP0A/4IA/mYA6q0AfgeaANKhAb2aEaSVZuZZ4pRZJiQAZbkIwoiqLt2Y+8uQrhh2DkZ36/9VsCIQaSMHvK6YxCKRDWwAYCIZne2JRN95QCoXI44ArEUAsVag3NuQQjxgTe6Z1F8JniOZ390KFLYATgCV81lo4k2Vu+hQZd0AVogAaA9Y8KJhAJRn6BNRCAFVxKoAPTIBDPSKfK+XLWgAdXyqEKCp5EqnJFUARpkAd44G28QAyBgANUCaVD/zClS7d00qmhV2pqGoqgpgalZOVvJjUBE6ABSZAEcWAFOvADZPBsnHAJIbh25iemBcFo/cCfpNCMBkF368CFtQAFRfCjuPqkTXmgjykQedAHO1CoeUBpUICgUOqk/cABkDoEUapyx4qgHMoEUTmkVOCh4YlWJYUBErB2haAHaNAGbSquwvWqArEFcNoPZCAGcmAOOup+AlELqjAQimCRDQqo4hmVWbqrgWoEfYAHaUBpRYADgYqgRcABCIusTYegKsew3tmrTtl0V2qtU5mtjZqlLKAH1NYG6EcGAoEGAjGmgHWuBjkQdgAL06CZtSAJdvADwnltnVaw0AoFN3Cvgf96s1PaD5QGBt0oEDhwA1PKAd4YqLo6ENAKld9ptAdKrVSpr5bqtNAprmUaWOj3seXKEx5rBYYQB3EgB8IlrvvZBnYwARegpRG7lPx2sz+7dJRGaTqLA3B7Az+bq0Q7mQNRsJPpnVwmEFoKnZH5o05JnUfbpgURrv0AsmcxplY7ECALWGSQBJ3GmEXaqI6KsAgbARwQAQTBAXF7s405EFJZpAoLnc66BDxQBNAJuMgaugsbldQmEOSqsQQBruRKuIx7uIeLflM7EFZQAxggrU/JATwQnYF6A5a7AJYbAQsgEAi7tkDbr02rsNEauNSKtgo7sRtZmdI6EIzAB4K1kwL/2Q+vaxDhCrKISxCIe34CcQfCmQQt8AJ7ywEImlYHi7ALcL/4qwD3qwCYO7da+r8JyrBKKZXbm1YqJ6QaaWrbO7MwWoyUMBDSJq7jOxAbO7viO8HiOxB3QAZWkAQ1MBCgRr/Ga7/4uwABEAAK0A8pzKyP+rwFKxCOCQaOWZmVWQQyjLNLl6tDurBQea+rAHKp98CBpbHjW2Cve2C1O8QCob4D0QZ3IAZWgAT9EMJvNcIckL8KoAABgAAIkMI2YAM4sAZrQAePYAqokAlojAqTkAmW8AhuTMZujAqmkAl0YAZAkMXIKxBA22W7tmuSegtF5qIg6L0HRsGFLBDml8HU/4bBGUzBelAIhHAFFYCRCUDCJYzCXSwQNiAEa/AIlnAM4mAP9pAPo5wOomwPx4ALuHAMrHwN6aAP+tANlmAGB8DFB6AAt2y5M9zHS2B2tGBywKmxiUwQVTgQh0wQU2iMBXHIcmAB8CsQD7Csy8sAJqwAXazFXqxtc4AK3ZAOppwO+RDO4WwP3HAN10AN0kAN4EzK6UANc3AABwAA8DzPCHAAN9DHfQuMtEAJI1eMBVZgymwQyUxY1sYIbEfMPKEDnOZw0azJYGwDXdzFC6C/m9zJssAN6ODNpkzK4dwP5nwN0iAN/TDK+ZAO6NANqAAE8SzP9VzLAOCRWFDDRUBoLv960ARh0wVh0DptFoR10NQmB0ngbw7HvELbDxOdxUgNBDZgBnNwCrYgDRi90aJc0uacztQw0uJMDdRwDMFAafI8z1WpCJrQPm9gBBGAA8IYcqvywIwgxEKM0xBMCfipB3dQCIuABJ4mtFcsECmsvwvwxYDN1JYgC8dADRiNDqecDuWs1YY91fmADv3A1ahgAwDQ0geABbzQDM+gmc1QC6mQB1iACZeAqqh6CDqt0w+sekpyXAZhciBYfuZ3BxlgAA+AsAJxv0ttx0AgBLwtBGZgaahA2NTQDRktyt1gztRgziPND6R8DZFtCnPQDwjQD/CMA6mg2e+w2RU6Dc9QC6D/Ggd2YAeEsAg93dZyPRCckN7qvd6Ippfr/dpVSNdWgAEJUMl6HcZuPAdivAZ27NueLAu4YNjEbQ+K7dzJjdj5wNyQjQuoMAcIAAAqDM9pkAq8UAvW8AzmMA0VGg/moAEaUAMWgARJIAeLsAhIJteq7d7pbWRGdpPhd5Mqvpf56cRAXd/9EM1LNwm2cAqnYAl0oN92zNSPgAq4IA3XQNwn/dHcsNH8wA/2gA7BgAqWxrzSLQR9wAqsUDmHutnT0OX1LQD45qlWMN4nvuKph1wunuZp3uLovd7kdwhPLAdyoANIUAG41pg3kAnScAyygAqPAORA8Nv9ENyFjdHlDNLc/0DSCc4P7TzZ090PNjCwQpAJkzAJWe4KkpMKu6DZz8DFA0AABCAAxWMFY+7A751caK7mLvriaY5c6Y2fhVAIdyAHVvADdhAHaoABBgDDaVDkuGALlgAJ/C0Egd4PlkDkRm7O5bzkpyzK54ALbSwQB/C2QoAHZowKsYBQgbDtnaAJoyDdCBAAoP5rLVADSGAF4l3il7Deab4K7v7u8B7vN2lysV4Ici4H4e21AlEGk3wDafAIsqAMfB7svy3GczDkqxzS18ANUX3S/cDwseDgQEDdBwDY/YAHkzDHlN4HffAGXvAGWPAGgXDCAVAABQDqBOABLHAFoGoIi3AJx5XqP/88Cx3o7rNA84AMyM8myCDICItACPcu5wPxCf0gCGVrw3MQC90A7cE+B05v7ESe8FDNDd1A3CIt0m5QzxSPx5usZW7gBmuwVHA79iE2ACQ/AGaP9gSw8moQB+MN8y4+87dQaB1ICzmf81AoyPz88/huB/dOCJdA9P2gC36wlDfgBkS+45bg9G587Lagysew8AwP0qwsDY+g0rUMzxS9yWbg250P0VzMAAzAxQiQAAQwECYcAAtAAPjmBGXg9qId93Y/9zlPaIVGaIB8iMl1CT9PCOH9++N9k4dGC7pQCVkgVjdgBpYQC6jA427c+KhgC7bAyui857/O4CpN8VysAID/7fm9Dfq2TPoVYAAGIACgbsKrz/oVUANJIN6Y8Aml8MOzf/u2X/9076K8Twi+H979ABB27BC6VGrVLFq0bvUTVYbJkH5gLMVidgrVo0f9LJ06ZcsWLpC4bFkiCebAyZMIbODAAUYImDVrzNgAYuMAApwpEZTRoAFDBQFBBSRIYOBDhSRxBmIqVWrWLajAot4CVhUYLV26MH36hMmQwDhJlRraWkohLanA+rXSwKRfETcTSZLEaAkVqo4W6boBo+DmXyAR3bihg/GRmZlAgOREgLKSIEFqyviocOGCAcwVWNSIo5TQp1ZOE0KNWnXWaVKSBHXunMR1vyRI4pD9hLA0/7JlwHJdeTFkx5pHliYJN9zPsOE5Qmws6Nf4JJA1GjfiPYWRTuKcKQ+0ItW9kp8yTpz4GI8hSxI1SQxJwtTKfavT8d2nNhS5TJYsTvL78MGCBfkyDKmElFbOQubAA/uB5YoLILJBCDommeSROeZYw8ILK5zJBhv68RCnR2TxaERbULHkETrWUM4G53BCICtdfAlFFD+QwA+/MspQY8dI1iPwve5ICaU+yZCoAQMWKCDKw34SeKCoCpwoQ5BKJCFFl6sOjGZLBZ24oB8ObXDjkZhi6gcxMzTkcAHFgJgDFWqo8fCYEU85MUUhhGBggcZwYmDLZWKE5TE/wCvjDD929P8jkkgkCSWU7h7th1Hw8OuvMqIS6GcATgcgoIAOKvAhC8gGzErLLbfMJQ8OOOhQiJbyfFUIxObYEIg0LZHlGm64kZPOjkai0AzlGFAAgQUYYCACbZqNJlBYZqwkkkKr9UMQRqfVdlJBwPvjPvyc8PCDDzoQwEMCFvjUAFGzmNJUXZaJxhltPCTHF1Y5iGClMGctMznF5jhFGm664UYahKURSa/DVlxuARuUxYGcZrUB1JdcYBElkm6t9ViQfqrFNttKSuZYkD+y6O+CB/ohgIAEQiWPVHjlZdLDZUTxYAHmwvQQMRVtrdWWa8QRB51rpOnnGmoUxotMM2qq6cEwJyb/h+JmsZnGGF809gTkMr7tJ0eRqaxEFFFCgQWWXNrOOFqOw6vAgyeJ6uCD/8JYNBRfllnmZm2wwUYVLPqB+MF+aI1JwzRloUacdNJBZ3J0uLnmGFmqO6zNB/NUEVZ3yAn9anKwWcaYjEX5LsczzsixDD88VDsXX4yRN9Uts4JFyG6zkKKfcivoINQPyNu772j6cVZwaDbBYs8wzVgjQhTnsAQXagy+hlfKD+7HzsOiblOIDOkw3x140le/9NMzVqWRP+Jv/dvYRWE73i21oZjiZ7nOOJRIwO8PHhKPE5pQgR7oZ1GqyIXf+iE4002jGH/YQc9sYIbCTGgOkAhGNyoX/zl7hHByB8OFJSBhqzYpZnrmM4z6XAiP0GHDGP3YhScU8Yc6nKEOdfhDJNJ2P3lVDGvPykrXQlGJSW0igAOswxfC4IQwnOEPgvCE/XwxDb9NQ4vTAAUWeBamNUwiE3SYwzF4dY108CMf/LCH5Cx3jFNA4oTiU+EcDGMXXOBDj3tcXziwAQ1j1MKG8ePhH6r4CtoZAxvaCAcjrxaOcCwDkDHKxSss2Y9XqMITnmiEIgIRiDrkQYc9VEU/jLHFLRpDFTtgAIda2Q+ZWMKD6bAHP2zJRsn1gxq2AF+FfGlHknCkI8fQIzzwYUxkhs6PzwikKDjpB0UoohGVQGTtsAFJbP9iU2uA7AfGamdKX+xCFaNg0h7y8IUv1EERmMwFNJahtVR6wgjKShaHEHMMWq6xlrg0mDR4acINQmIumRgRSMy4x2LysR/kWGYxdjGjRjgCmp6opiKvmU1tTgMa4KydMWbYzV14yJN5OGcgFBEJVezilKjshwRTkQcjYMELfeiDKZjBjHyGUKeVS9o/T/gIgaIiE7E4hkiOcYzsIVSpenSHO8Jhjmc4VBVoi4Q0R7GLYhgDGtO4KEbhyUyPQmOrGu2HVDfhyTr045MnReRYp9FSLUKjGP0gRjPsuo556EOnIYxc5aQBLI7MBRWyiEUw4kQnpHJjHEtVqofi4Ue57sL/kqLo5CZeUYxiPGOrTzWHOSApOLI+Q7NjFVxLnyHZUTRiEHuoQyD+0AhQqBSVqNwqNDr7jnbMQx36FKH3iipM4GKPV74SyUeoAQ7G4qMfeuwHDBmqNWPsQrKcVMQmsCraZ0yjs571o0bFWluxXhQbD9zaLlKriDrAIQ+vvWouwirWuGpXu+9YRzbOwdt0HOyoHgGuR3BBsH70ar+4YEY12sFYDzG3H0292jalasNGqAKz2N1ud70LDWaa1xOqmIYfuxvd9/3hCz1oQhh42IhNgGKTmySGaDGMYWtUAxz5yIcIL+ehhQnTI0fllcGocTlqjMMa5VjHUhN8s6Y6NRwa/41uLWrRiEB4IqSadTFmpYtVjL1iFKPYxCDC0IhdbBR17wtEGJrQhA7AAAYfIDEXpsCFMYxhD43YZD82TAxiCGMctMzvMfrxkRxzhJfHkMY1uiGObgQjGLGoRjWsYQ1i8KKxy71Zc2H42HCUFatPNqmEo7qLWoxCE6udMyhUEQlHRMITjviDFKTwhUaMQhWgcMQZwiCFJvRgeMODQQ98TWI5DyKainDEJnjxCz2f4xzUKC4uAKtj4XqwG5gThqMfTYxfNMPIlbb0gp2KjahiNhWf3EQtxGnDPYwhDFzgQh0G0QhVj8ITkRDxrycVCUB8gQuuRnMHPJBmGPi7Az3gwv8e9iBsYqfCFcK4KTOogYoSKRokOvbIj7txcaRWoxzlePQvRmFXBHO7uUx9YLh3oYg8zPms/VC3utntbkfIOhSjcEStpUCuKdShEYDY4RnGwIVde8ADEIDAAx4AgybI+ZMe2oQpTNENcDAjGHZBhTKk/r1TyAIX/ThGwS7ejWrjmRiPbgaea7FtbquvqX608i4ckYcwqFvNTZBCGNB5BkA4ooqgYBSj+hGGDhC9H+kEBCAG4WZ/9+MBEShAAR4AAaTDeQ8m3UQnOsGKag+V6qiIhQlx7OelnQPRwnBFJ95geVdowhW1qCvaKb3cJDtV0+IEhSLe4OsZHL3d7655qvv/MQpU13xS/fDBB4QOgzMMIt9S6MHQ+9F46EO+zSlf5xucnokx0mEulhhjUGXRDXtcHNHBYIUmNLGJTaQ+D2/oRy2e4Xrlwr50zyjrK0ChYpQ3v+ge4ELyIxoJD/G7fnCEAby3QdA/D/ABQDgD5usBwWs8TikACPAANiMxVxsDLzCFTEAR8ykMMiKj4ECFYDC0r6MG0vuFWrCGshu3N2C/s9u2YyIdwYkqD1GtOtgDM5uBCIgACOiBdHK3iEo1AazB3iPAD4AA4Km7KfC1oXsACByAxns8D+i1X8MDRCCjOehA86mQwtCVEeyGc+iGOAmGRouxWuAFXtCEPPACLwgE/8aCIciyslc4q9X6giZgtybwAMYbAAhognQahHcLwkYYREcovMIbxHwbHqL7gDf7AikIPCfsFCh0vAlUMzXDgzXAlRXKQiykA+PIhGC4qTD0M0W7KWHoh0nAAzZgAzb0gqUSq0/TsrMqsyVcsw/wEBgogAiEgCn4Q3dTvkN0hJ0zxMKrg5vzACbpgTE4Ay5wwD2UxMaLAA+YARiYgRlIAyFwkw/MwgpBEYyYBFMIRWo4KmpgBnBQB3VItA3EAzakAiOAhqaKB3eYhlmTt01QLTMLOEvsAA/pACcsAA/RvS84gz0gvENEREPcuTP4gikwvnFZxhGDgCfslGh8gGmcgf8dwAFa0cLCAKpHyAS6SARwDMVuSIc14od0YJpYyIQ+wIM38AIe8AQnq4VUUEOSysdqnIFdS7w06wfGC8hKbER3I0aiLLw/WEaec0AkbILWcUBdHIAAiMCKfLzFiwAI6ciOxAjOi4VYmITBSARhAIdzUIdbsgdx6IdYMIU3YAMs4AEc4AKEC4Q3oJvHI7r984A2m4JaLDqLRMYJnAGC+0NABEZANLzC07cdaqIjhICBa0aJhMqohL6K3MEIYAAhGJPjCEGQUDRLcIM0wINYOEd12Cd+OAdlOBEj2IEdMLoKPLPcK4AI6EuhI7g6AIRoAoQ9oMs+bAIYGDrAnIIxSMz/nkMnLvgC5UNMwwPEPBQ8oftHyZTM2NxBDnEDPJiQOzoFZ8OFYDCRDuwHZUBHe6CxGmMGS5gDlmAJDuA1a9RBo4MAakS6OfOE+xsFUPiC/bvDMdC/GeiHRmydhfyCMXiz/hsD4yTGQfgC4ys6ySQ6ZPxHxoNN6QSDb7ROqvurfsgECUnLSaADigAHexC9Q2MGVDBPyuSAfwM4GIjNBxg43pyCFJM1VVAFR+iBx1NGdFpOasRPACVON1vCHni1vBNGnvO5wGu853u8fki8aIzGBogACR2OuiAJETyGlaQpULw6DlWGQzOac5A6U8CBHdQXD3A8odPDaeyBKZCikxoF/0vKpC9oTxhApy/ozUoksTfTyzudgiYgF4IDhODjuR1ySuhb0Q6YAbp5zgZoADPoB6ECyWCaCEVLBDzAg4lghm4Q0UfAA5tSNmUDu0wAg8pMFomUQAYlMRPLO0YBBRh1BAgYgH5AQhhwtcAjOmr8tR7oB1vtAXJhs0FglEJMzC/oAOikQDpVPMeLgAawgTlg1LuQhbvAi8HKBM/Eg0zQUjAUhg0Fy3HgVGoIhk+tzAZYAAd9vA9IunSCN1Q7yDCAQh48UeOrS8ZUs1/jU10dOpwbhFQD1DOYAmFd0H+zS6NrvAYAg0noBxGxBWd91lOQ1h4wH4pIo3wAB1NIgx4wBblwAIdxEMNgMAVQVRYGeEzY7EEpKM7aHIQ6CIN1C4Pc20V4LbodlEJySdJdndUJJJcm6NVCbErnHFSANbrn24E+yASQ8IiEpY7OxAJNnTHx1IdhwAMYQIRf6IZxkLqV7FgGeFVdbLwebEQAbcbhKZcHoMiis0u+pMQyDTqhG1vgIRcuyLtGOINbNdIIZDy+JLp/7IFEyASt84hnbVZUcIMZSIRuEM9bYgY82AFNtVRmwIWuBAMP6ZCAAAAh+QQFBwD/ACwAAAAAcQBxAAAI/wD/CRxIsKDBFP9SIFSY8ERCEAohFlyYkCJBhBcr5kCYQ2AOFCAXohCYYmRFFAo3ciz5jwSJfyEUxvxXIkQJjAZz6sTIMAUIECg6/gOR4+c/oTozchzI8GjThFAd9hwBdSPUhCNZIjSJMIRNkg5fJqWZNARBEEzRqrR6FSHagR2Luh26sGMKu1hRlCDZ1GHQfyPuOq1YEmXIuSVIpCixd+zLxAYhD0WZQnGKE15HopDI1yLJoW8Lcha6Ui/Kzv+kKlz99CrdjzS/mnU4NmdjgS5f5iYRs/FNjFbvbiT6z6Tdnz/v3qV8dOBhhYGxOl1Nd4RflgJR2Exh84RD2rXFEv/cy7h8TcYYSdAuD97j0Lg+QYPOMfypQpCEqRd3XXLjCYW/0bbYfy0lRgJjZg102222KUgTeQWVR9MJpqGkEk4puQeUexcVRl1grC1EEWXYwXTTd4zpdsJLX4nnG4O4JeWbQHu9pJlJBIb01whC0dccRBshRSJr+Q2ZQ2D43RcbjTGKhWCBEdLk0nh7OVSCXoyhYMI/JnQZnl4C+XWjZjeNRB5IFeJHY27lHZiigbm11NJuBTlJlk66NSghlnt5OVaNxZEQUnFXovDYQAdiOSahYu3GpqNTIuroijQyRul4kh6ak3oPkteYeEk9hiZ+ZtooKEpX7mXogScwJiebrUr/eCCdrzr66pygOggjhASZZIIIW2bnIp6JMlXonZ+qWWFiV0oJaZ7P1jqlS+alWFuU5cnUWJeujmQCCSpgKVCwn2WHwop0HmjuqCbZmOKskH5K0LOQGYhlntcStGW4RcFUEVGV8UqtCeZtVwKFNT5La5TzGvggk+QpHGedkeKWK5PjpbDBBnZgEgMNIP8gssgIkQDsrON2ei6XW4og453E2lktxtBKfHGTiEYGQgyKELNNMp1sskkjmjRSRw1JJBGySSps6Wez/4jgsssPVrgYSDNmarHN+PIaKMZ3QivnQN/epVgSrnyzzz733LMPPW/TU883ySSzCQwtVFFFDB+D/0wDRIttCe+jUkom3sSHw1ngzZE5iGm+XeZQBS/1wL325WtbTg897NRd9zDD8DKKJ2psQF/JcE7cZKONO+vw1jBnnevNoJYQrKv/0JAEL9+4/Tbmma/t9j2bFy/3N78gQYNKrT44LXvqTUujmVLOi+uhmjpeOO74Ihqsl16C4AfllgN/+T+X+w48O970kkUVAI8UbcSKSx+pvPbbj/GCBnXPuAg5qMQ26lEPtmGOIPcYyNrYob7LyW0dSgNQ9WKUGnnhBjyuclHEUMapGnmqggy6zezqxKUUxCAbcBte+tjBjm8wsG0sdGEDMecNJPxgI7abEsFyY6ixQexwjRKLlf+qJ8IhVtCHJMzZvBSjg0F8Q24zbOE3vEFFKvbiiuwQyPkS+I1E1OCGiyHBr+aELCY9hlrecRWcPFWjS3VviDOSENh02KVZpUAMonDhFNvXC1P40Y+scIUrrugNFipQIPQwBRwsQIPKmEyMkFHBmd5FJyu5qVL8I4uTXoSbTJKtS6BkmQpGOUoTpEAFP/DENnrRBzeAIQ1giGUshSCENazBDaYYhgzpoUV6fMOGG8lNkOhzOpvoRV22uphuXFSSU7FMbBCT0rdo0iURNE0GQVCCEqLATSXIwAU0UAMvZtAHNqQhDeZkQzrReU43uCERrPjGNr5RuXuwwxNV2MBPfhD/gwxkIAYWCGgG9AYylgxuN9zzoYFu4kxy4QxUBzKBDK4ZBBl8Mwho4AMfDsEIRnThCS74gRo8UQtznhOd6kypStNwy0zgchje2MY21CCBFdTUAROYgAN2OoEVrGACGmAkDd5Tkv+wJnVyoh+AbFfHTZFRIC4IQhTI0IZC3IEMZOhCGxhBCU54lRKFEAMNWlAMaKzTpOlU6Tpf6QYhuLMTdaACFViwAia8AKc2HagFforTCfxDAh8T2emu1Kpv2YosmmlJNQlGtjjJUQ9tOEQpZlGKUjCiEIXwamVLwYnLWmEFxJgGHsDABoGc9B9qTa05cYCAGXSABRW46wos8LGj/wyHBlWwQE116gCf9o0+30rMt+poMvOk5lx7mdr0AMUsSVKCEquYBS1uQYtVXOISm61sZwthhRYoghdeQKdBUotatYJhBzPoaU0lkDui5MB24frNDzYQg38wwa42/djpNhIUNB0oJiUxkAq4RLVbkYU8BGPEZG8BjAbTYharWEVlBcIJq/6gBXAIBBYI4k4w2NKdIJYlGP5xTiHg4AIVsMAGQEYfF+BQamIUI8FSMFYWvCC2GFjBQGnAtwxYwMcC/XEV/vEDkhiqBE2rI/UoaYLoNhgZwKCudCX8D0pc4h+XvUMcJnCDWLKhD53ghTVcwYq6eSMZw2BFJzIxDFf4Ef8PL5itTX/6Agn8swrgapoIZCBjl4EgAxJ4gY0dgAGd5lQDh2bCEhZt1wrodLYDdYqMB9wyLo3LBAwGBjI2LeVVCOS5heDocy+RBDj0ARGsKIc84iGPd5QjG/VgnyuEkYx5EpB9fgCB3zYAaAnUdAUb+xtR0DLfGEhApy9I9gWGsAQsQIEJFBDABCyggRXs9AUz+AAPYMADHlTA0RKgQZdcAC5wbU0FMti0upHx4Fm0YiAdfe5zGUGIUPACEa5oB6vl0Y51JCPW3zDFJFiRDW8Ubx+1WF4OLKoCXfNatzj1tW6PvVObSkDIe9UpC+waZwkMeW8+/ilvMQDbf2QgB2P//IdFJyoDlQ943chYxiz+UYp3D0TelGDEPxYRCnN04hmsfkc7hj7PFv7jF2Xu3eWSkYQbVnTlLog63/rZV5/mlygjYExRhpoBnyabBVVYnkR/wGO9VaHX4UYyw1cukJYH4R/OWDcw/kGLgXD2uVg+xCH4cIdKmMMa1mj10Pvt728EvBrCGEY9fOfLfyThCSuPPMNJkIMYhJ0oWgKWCUoZAu/c5c/svQAPWqDfHMzqm1EnJrpbLnmVD8QZBIEyLR5M83/sXaN814MYKvEOeQS+HdaohjXKsY5qZCMbwvgHrTeXuW80Qw00IEHLC7JyghEzMShIctO2T8q/VOHYhbbz//JSINGVB+H8bGc79WO/6ShXVyCF0APuIfsDUpij9/L4h9CH/o92ZCMZrFANrvAPi7cPssYFFvAD5oZubTcQMmBKJSMCSEZKFGhNo0QSILABu5VfP2B+53cET2cCb+d66zcQ60ZdnoZZemd7fNAFRKAL+yYP+bcO5VAO/7AO/wB42fAP1bAOLsQOeOAGRbACuZMCUfV2KnACLlACLkYf7hVGE3WB6LZ5F9h2JkB2Z6dbYXcpR9CFH3h+BMF6AtFgcOcMcQcMs0dlAtFRfIAGZFAI2oB/+ddqAlGD68BvNdhvvCBIiYADRTAELwBU/tRjP/ZjQOZrgEUDP3CEJKh+//8wgl1oAjkAMj52cR8TBF14BEqQiW93fmB4frMwd2ZohsggZaVwCR2lc3fQBmTwCdoQgzIog+8wi/8gePjXDq9kBBywBEMwBDdwAxeQbMnGccI4BBxAAC+AaAn4BEQAgm73gZuIiVHnAkTAjGTHa/5EAy6QiZw4go/oiUFwC3CnDaOIhrNAWXfXUXt3B4ZgDDIoEHPIb0P3DvA4i/LwDGlgBEVgBEbQizfQi/cVkEzwbItmBIHgCrwADalABUBFW4r4BCPzBBIpMtg4iH1DdsujBUrwD5uYiQ84gt54C86gDSQJe3NXXZvFCTnHCHpnB74giwSRf83QDPcni0LXCWD/wI/8uARF8IcCeV8FWQRvUAvE0Ay1YA3xkApMAIhxFlAW0AItsAIt8GsrIIxW2VM6pohiwIwC0Yme+IjfiAz/QJIDMXs0p10qqY58IAekgA2A9w6sNhCyGI/vwAt+CAVLgJc8CZBACQV+CQVG8AZFaQ7x8AzEAA+pMAR+yZM3wAG/yAFMWYxGwIv31W3edlcOYAFV8APMSARBcISeCIIuAHtkSXcz52n/oJIDwQesSAZWIArW0A6x+I4yGA+1WIvtgAhgsI956Zc3sGj2xQT/sAQCkZe1UAvPcH/EAHR/8GwC6Y+NeQM/+ZOLtgTEWAEOoAH/pAMr5jciI5FPgAxm//gP7BZhqDlve9cGXbCeUfAEcTANsDibtMlvfQAG1blovnhfwTmc/2AEN6AJ5pAK5gAN/5Ccm6CYP1kEjakAC/CP0/mTzlmZHMdTWGlTARUDVjAL4nkLEsZZXsWSkIUGaNAFZBAFW7AFUSAGpBAP8WmT+PcOfbBoz2ZflCmcA6GP+tgJxCCg/2AOz6AIPvmTvviL+fmgRjqQQCmQVnljBjABnEALpUAJend7rCmiaHCiJ8pN/6AFZGAHhCmfQrcO6yCb/1ALu/mT/0gQelkEWBAI6oQIqVALqYAHdymcS6mf+RKcAkkFTEAF1qlozNaTPXkBRTADy7ZRbUgG1bieW/+wnoyKpVswEGQgBu4oi+3wDLsgCpUQCaIgCorwi0WgaEApnfYlEEywj/6JBVhQBOrUB0XQoMSJl3r6k9cSkLO6lL/on43JAbzKqzfQBiK6BZ0pkURQrETQBSc6ECdKomIgCcYADc+gCpVgB3HwA3ZgrVYwARdwA0VAnNZZo8EJmPa1q6yKBQhwAJA5BPr5oM45q88WofrZm0BZBLy6ABywAApwAAdwrgjAAYyqqOAJnsUaBes5oo66nndgrdRqBT9AVSJKondgAQJAqL1oX39InEOwn/i5BDeAAx7Lq936p7eqrtMZrlBQnPtpXydLrwpwrgeQr/vKoLxqsNUosMX/yoxZdbCOKqJZRQYPa6Ui2gZ3YAdJ8AdewGzjirT/QLKASpy/aK8NyrQB+ae2aqoQ6pcZm7KMCbP6CgAK8LX22qvASqI1a6xPgFU5q7NtAKxWCqxr67ZvewdyYAeSIAg2xgRpGpBMi59F8LUKoKDM9pP6iKSiWrJWu5R/yGxDQAH3ugCO26uQ26sahVVb+Q938A9t8A9ZJRBriwZs+7ZwC7qY2wZ6gLlyKweLEAca8AIUkLEC+ae9+Kov+7e9uGghawQ7wGi3aquyhANPC7mgurRDIKj02qthywh8d7l3wAgqeQiQBbqkC1nPqwfSG73Uu7bXe70kSgY6oAGte197/zu8/9C4oCqoA/Gb/wAGbvAI7Nu+7WsJk/AIcwAE+jq7X/uyDWoEAtGT3PqLj8mrqZiKXSWlfEC9/0C9CJzACpzABbzA2WsHGHABpspop3oDYPsPgvqLNhBLeIAIpsAKzDAO53AO6ZAOI2zC6ZAP+TAOuAAJ9fvC9asAvlu+Cuq/u5pz8qZzK1jADezA8od7QBzEQJzAqYsBL2CqQ8CPLKsAHOCHPYkDZvAIsaAM4JAP6qAPWJwP/bDFXLzF+WAP3dANuPAI/AoELnsAABDDj/sAjumYM3yKl7Bdt/fDDfwPQnzHU7pRVCrEekAISfBtPMCL/VgE4+uYZkAHk2AKsf8gDOegxf3AD10cyZFsD9xwDddwDJCACrEQC3MAw56sAAHAoPiKr7X3CWAVanuXykCsd3qsx1P6yrAcyxp1CITQAjdWkPrIv0XwCMIwDiqsD48czJI8zP1gD5ZsydKADuqAfP/gyfqKAB/ryefoadcVy7CsjtYcwNq8zdpsCBpQAYGsk4NcBKawxfxwzuh8zuZMzI/8xcdMDdIgDurwD+pgCgfQzPd8z2+QCvysCG+AA1w7XXQXpagYwHrHzQid0Dg3bx2FCRAMzoFsn7wIBszAxel80Rf9yBdtD/9gyf9ADelwxfpgCgogEPf8Dzr6DM9glKmgCYiABRygALcw0xz/eoo4xwioyNBcxdArudA+jXNfhdOfcAlqgAHgLKjD6wbg0A/5gNEanc5Pnc5f3NHXQA3dENLgIAx9sAD7qq94sJztsH/tUA7NsKOIMF0NBgznmF2l8Amc4KE6h8Py9lVeVdd2fdd2nV2GYNRJzI9gYArqYM4YPdiEnQ7v3A3nMA6msAZggAP4igD/4ArrMHzlAA12CHjEwAszl9YOdo6U1QqVJWF4PdpvrVlo+dZsnV2fYAiwxQN+XQ360NSEPdsXbdjHLA7dgAprgAO72bFAsAY9WIN2aNnlYA07eo6aBmVRRl2zB2ERpl0eStqpPd2hzdarzQLdZgRuANsqbA/2//DF3h3e4q0O3o3R6UDV1KAOqDAHHtutReBhc2AKwifcYlqDgPcP50jTDUbT/P1gEtahpUAQE3aWAR7a/22eCI7gpUAKleAEER0LzIDbYdwN3FDhFl7h19DRJIzR6HDM3SALc2AG3OqXRYADdJAJfvQL1VAN/yDcz1DczRBds8ffND7T/g3gtVfgqckJNJfg0eXZQO7cEtYKrRAJ4MzbphAMwYALTH4MTd7k1EAN11Dh4kDC6cAP9sAPVM0NsiC/u8mTRbAGc5AJsYALsrDIv5DmwleUgPcJoC1dszdd1DXT0nULzj1hdp0TcF7nNd7c01xzpBAKfkAFHcABYGAJlv/wCJbwD/I7B44+B5BgCZosC9JgyejADd6dD+cAz8fg6EI4vLE0B6gQDMcgDbgQC8qX5qr+C7zAC27u2cw9XX7e3Gp4XW7N4wJRCj+u31HW68tt5+h4CZhgCHGgBkhABQ+wAECw7MyOAM4O2b9NB9L+CKdwDKUe5d3A6bhgCWYQS38oS7hA6tZ+DEouDMHgCmnOz4LUCkAu6/09zR16XZcw1NnF7nD+ZMktd6b4CcNuCGWQBU5QAR1QAMru7M9s8AdvA0JgBmbw6HTwCJmAChKPCpYwB7bkxO+d5ONu7SEMDswgDKzOz5uQCucY5zP963RunpVl65/wCZt1jnT3ZOv/Fnfrdo6t8AmSQOxl4AQs4AEP8AAFYPBpvK/Pvq9pzK8vDAQ2oPCyZGJC0NgeawNmYApNLg3HIA5YrA/qbQqa4Aqa8PX3ztm/noYd+g8tfwlE7tljqG6j2PbOEA3R8GBEnvPGrgEX0AE/nwAEEABD37Uv++yAb/DObgMMwAAcUPgMsABLv/SKL/WTYAmygAvSgOmxrQ7qoAzCwM+p0AiKMAsnr2n4LuuU1fKk7+bsLhCbZobR8PZuP4qbtgy6EOiG4AdZEMF3n/d6HwC6v/tp3Pg24OyI/+yK77j4yqAtO/gKsPRzYAmnQOrXMOHdwAzSX9nQ4AuvkNbLIHfuZ/Ok/48JLc/utIAMcM/6cE+S5l+S0RBzutAKpGAIalD7Ag8BP/8ACVD/FHABF6D3DAoEbgUQeP7RAVNQiA0gQGwssKFAAYIDB/5NRDDxn401cyzFkiULFS5cwZQxY1YNGrRly2ghQwaM5UtatGbNakXq06dWrWb+mxXNp7NozrQNJVpUW7SUukiFUlPDR4UKFzx4eNDhQgUWTpCUKYOBAgcbQtY8QvXP0r9Hj+bMSQgEgcOIEuX+e8sQyJo1ZuY82hgrGLOR1Z4ZM7aMpeGXyGTSrImzlS5dtFL6LErO8mXLRJ2lXFqpjBMWUC9c6NDDx5k/giJVqhQqVJmvYc1kYsaN2v8xW6fOzgFz8C1EiRMPPDyAAAHChGMzmfIbLBirUbuMvfQZlCUtXTm1Q3ZZvTJmcu7CZz6qC5ZrQVk0YIBawYeTLGVEhSIFCzLkXIpucLhh4xEzdLq55rZjPLLEEraMi2vBt4grLiIgwKBjElRkicUUV1JJxaL7OvRFu8d0WYayocALzx134EFRPHK0wWaZ8yoRBIksaoQvvkjm8yWllJD5xydsVMHihn/MMKUbdALsZklqcDlljolskHKhBRZokDjjgDsOjLQmWe5CWGDJRcx/wjRTTF8g41Eby1JUEZ43U1xRvHDCWcaYGP3IogY+y/Djn9ZyGdEooiwbpQgcgKD/Ixhx0hFHnHMgpeaUf+ZYgw681pCSARsUXPBThmzYAQ9UShXlVE9SrWQ118L0ZcdlsMFGGxThtPXWW1EM50XzQqlEz/j88KMSUXIRcdaiJiqRHGw0wQEHMx4J5hxqz+nmNltKzWTbTNRa4yCEsgTu0+OEECKtRyIRxI8zzqgxC9U8CQUWXwqLlVY3ccUHn1xVZHYaX2BRJRI/uBI2x1cKQ7bQNsdzZxpni1hjkliYSefifDLOx9pubHPywLXMaMvTuIy7qMhLCc7CCR9a9iELQCLxhN5YsTnRVn731XlfOFcMZxpjAg5FXdVEeSUXhU20zNZ83TGnFjaE0OsYe+xR/6effjJOh1pxuOFGmmNwQSUtthKCaFzjGODUBjPWaOSPlVtu4r0sHIlEFUHrDA/nnXXGVTxsgBZalFUrSXiaadic8zJcmY4nHmLwiFYZfvhRRx2NLz4nSW7+GRA33SBhS+0sF3BIAdOn9ESROlhu4oMPWj6jEVFggUabcE5MsW+/4eEXzp8F/4cUVU49Gppp9F6x58Ydj8cca5Ybp/LKM7ZHc0gFvGZ73GyxBBJNp+wUgSqrJN+GXDz54wwnmugA9iacqKORmRHP3U3eeYfzX8LGfEWVhEFDVrnTXfNy9Th5tMMa1cgGOPJBvXyow2rqOMc/qnYOr3HjGmErC0E2xf8A1JnuIcYBQi5Uob4wuK8D7+uBFGYXnWdMwxy1yl/fVPSPafxjMEHLRS6eMcA2vcmAcMKHO+Ihj3coMBv6YGLGqKcOSF0uHdZLR4AmIjZITARcVBqhuHbxCk8E4gtN8AAEPLBCGEghEJpIxS6eYY54oKiGfkvRRKDxjIkQphjTsNnN5ETEW/2OX+6QxzrAAQ51MFEfTqzaNcSBtXTYg4ro6Nw/cPEPSKQFOVIyn7gUUAxVNCIQeaACVR7wAA/MAAZvWGMtiCFDOc6xiCjC4Ume8QxoEEZWexviznzHs3Vko4GKXGQ+rteNy/GjH5jLx0TQMZEmyeJ7jyhSW4BgJXL/7WJ1gQhDD2ZwSnDCwAusTAUxmmEOONbwlyuqZTFiCA0dJo+XvfwdPOLRjnIIMxuJZGLW8uGoc9ijcv2oXCTt0Q3PSWMikMhkXqzplnENRxWbUEQg3tADGJjylB5owhvykIpaNOON8SCiL1H0OBzWohaj8EQt/gGNXdQiYXqzTJ3qJCvEneQkxWjGLxioj6sp0piPwhg/JlLQdAiIGgo1C0PpQAczmAEhCMFm6ViqCUXkIQ9SgMEMIAABVK5yDyA1pznCsTu/xSOez2jGKDQxiD3kYROvoOsrZLqLmP4PgHV9RUzxitda8GIY1dAH1rBWTHF0Y4oPrJxF0LE9hV6y/6lpocMcomquD6qNAQtgqSewWtE8eKGrqezoHhoxipBCY4aA1NUuVKGKWoRyD1yYwhgGMYq6fvEfnnCEIzbhiVGMQhX/+OsuiBFTXlSjGoi8GtaGCilJPvAfRv1H1xQKOrNMUy1qmQOmDqLZCESAAZ4QxShSAVxPiPINTYABDEqriFTwoqzk6Bk56jSNUWzitI4YxBimwIU9/METAPxicHlrN+AKt6+58AUxAqvc5RbWn8bsxjkcFV2CWrCKX/tHbizBl0dgai98mcQk8ACGZ+1AxTuIQEuP6+CJasKiTfCCF6SwhzWilhgClFXgCLOLUTRiEIMARB3+O4Y6AKIRoP94RXBBAYpURfkfTP7rK1LRCVb84pDMzMci7fG1YziSyxe7GJi9J7qnZuqpXTKxG1RshBkYAQcRKGcx7FyMmKZCxm/gs0cDAV9e1AKv/8Dz/0DB3zFwQdFc6ME/AOEIQDz6yZOmtCdAgdv/8RYRpviLAx/o3HNQQxbZosblontQAYEtWx8WWVjSgIc+4OHVeHADG/Dw50B44ZsRqMVJcvoMPOs5EHB4QxjyEIg/b0ITv4WyI4S8hy9MAaPt/UAPvmDpfxA5VaCQ2aQtDYpKeCISjYg0IlghDC5r7BzMOAUkKiSOCP7TUddSNSo+/C0h4GAHTajtGLTahzTkwRXB3UT/HrCwgwfsuE6P29UzgKwIYhtbq8jGcSAGEYg9JFrRTfjHV78KA0AIVxWAGESCobxtmZ3KEY4muSmUAY5iSlAd6WAGKp6KilLPPFJLYkYwZGEWtaB4B6mcwn+T3NtGZOELpx3FP0L7Bi+oNhyPi8fPnlGLVEC82GGQQhO83gQp/JcLb5DCRGDQga8+oAAQ6MFc/0fyKbP0H5Ggu90I5whBRHoQrICUxoyZDmpY4ql4EAZz6X2bYIwNU2soyA6+2oMpNOELg7Ab3QlWh4t7NA9voAI0pn5Wd2CjGRMdRBjWi9GpzCDOquzBtGcwlY5DoAAPgMAXMP0KQHwBEHPvLaQf/115lj9aGAG1HgW7YYlL0eHlxleGLI5xjFhk4h+9EcIOwDB0D8Cg9R8IwyBUY3m6K6IJM8jDP96AhWfYtBaercNWvz5acKZele2l/+u/WoC110EVX9zFP9r1j5WbiDo4g0jrrUjTO2YIqOgSh2OwBDMQAjAwhXHImJo7hVOIhVOgpuvbgRTbgfaCPGmztjoAv7obJc7Lgz2YKP6CttnauNaDP9oDJ1SagWmjP7RTOwiog776IlDoLwC0G/6iLSI7wEhzhQSMpHwQh1h4hAhgm0yghm7ouUkYPDyQNQ6cswgIqx7wArELQd37vrqLtDMIgzCYvDEYgy/4gjpYw0QLwf+MgoDwisMGmMMZdK8p+AcYwD/8mwJQ+KImc4QvmB1xiwRAYLQpGMIi24NOYAZI2ZpgYIsGEALCGwdmyAQ6eIAd6AEaE62poD2w8gAQrK0vGIMe4L4/qDy6E4S8+4P1+QIuCMQ1TLJR9K+i6wGqiAD8awBcDK/Ym4Em4IIxaAI9LAAPGAQAei1HOIMv2K1UcYQ6aLTaIrkzQIREUIZHEYdgeISEaAAcQARXYIVMSIMd+AcQ9LqpKCOwggBfLDpgRMMpiJ0zAMNUjDRVrAMYQDLM07szDERShMMCwEU9DK8Z1ERGm4FhfIAmcASRS8Zl/DZQAIQpmIoeoK0pwAM6QIX/5xsbqbKBSASDPsACOKNBEMQoj0PH7OM3NEzDUYQdJ/iD1XhJVcy7vANFNTzAOkjDQfgCW1S7OSyABiiAAfhHs6Ox8VM7PXwAkAOF19oEZQSES4OyRhgDdNS+rpqBNXADN1gDHJiS6lMx1fsAO6xFr/K4rwLFX5y8IQOEM2iC1juDlAM3VSRCD/gHJBuyPYg8yIOBibjFBhgAv/TLf3wAVZqIvgTM2dNLpVQFUKgDR3uyUVi5iPS4iQjMf8DErbQBHHg1DtwB1gtFbyJLM6LB2koyRPwC2PkCQQiFVwgFcZPJIkMlyEs01DvHVOqqByjMvwzK8LrF3AxMUFRIVRiF/9zLxyKbgg5Ax6+aQ7+cQxxoAClJA0TAgx2oPli7KMhrvbEsSU2sSyJUy1LsgUZwDVAQhUjoLUEYhDMYAMGciNdDzrKcigjAzdzUxfCSz6OcgRF8smSMPGmDAdAEK0+kijlUmx3oA0RgAxwAA0ToBEToA+17weN8T+0bTUQkt2c8zUjgNlHwBEGAtDPgguUcAAboywYY0QH4yficQ/n8y2HszaOEgH9ohN7ywf9MuwfIQnWEgdss0QjAAqgDgzXIhMJjBTegv/byAMcrI1CEvAArwN/Lve8kQKSLNCNrAgAIgABYgABQGywdACzFUgAI0wDw0gH4B8M0ShYNyCz0AP/SvMMa9ThwMqMdLdEdgDrrSwRWgLlgmAQYGLoOsD+ynNAz3IM9ILLeu9BqS7IDTMPWC1NHdVRxyZJHxVKL8DiABMhhXDsPuMMIrUxPJMsywlEImMN/0MUmADgYoAMhRSRmMAUVM6NztNRP/arj7ADto61ShJ1DzEna8gHYeVRgjVQAQIBJ7bipaK9/KIB/SCWwCi/8+7gy8tQ4LUtVgkNPjc9S3QFEUL0ZwANWSIbLaVUcUFL31EWfLMwImMhYHMBSZKH/kjbY+dUwLY4wJdZIlVQxXdbs074bhYAjPSWApL3KBCtp9cT588845cl/mIEp4EwYQARhaCAoctWpMCMUS21RthsESnvMQWhXXf2vXIWdgAAAIfkEBQcA/wAsAAAAAHEAcQAACP8A/wkcSLCgwYEh/oEYiEJgCoEJUzx8CCLFCYX/ciwkCALFRIwgQub495AkyRIlTpwoqVAkyZAPGzr8V+Kfx38XUZIgQfNgT59ABVaUKBFEjo8pRgpUSlDpwoVJnxotiGKEwJQlQoSoOSJpS40hXVoduFEgCRQJS+y8+tMgz4MhSiIdmOLpR7IzhZqEqrfiyIcjQKxMMSIH04sT6/ItO7JEiqwJFabwGOItiZpBffIk+m8Eyn9xJeZAS3Gp5IoZMdJNPRWmyxMJBZcWeAK13oI5rMJGLDmETJqfg2Im+DYoT61qQxwlORImybqiRY6FrnD0wt8XM4LoKjRF3OEZrd7/vaqyYc3gA8FnVluT5wkTPx0DT5jwJmujGo9uLPr8oVKWQwlUmGomddYTSzPdpFVksP1jAmbgFZdZcTztxB6E8KWXVYGGaQeSXoYZFhNWl12W0AnyNTTCViikNNUJMnX10HmOtXdeT2tBaJmE6z144WWD3eRRQw0l9hxdqCGGElY6mUjbQEep9FZDK9F4lYRYPWlZZgUtSZMJKoTp4HkStXiRSiXAh9JWNHln0YYxDTmkQ7+ph94JJKiEk5dX0YieWjTxpJ5BNxZ02UAmgAkmc5PZN1CF520mUJGTouVQTkpaCaOfKKEI3GftEWrWPzuVyiOpXLKFGQkiKMqoRIMS/2ehXDZ59NhjoJokJwoN9jlQdrnGShyqExL76EFvqUATr0dNlh1OJpgH6lYS1UqbVlKmdJlOUgYa3JJL5lToktu2FWqpPsU6XLM2yWeCb0ZZZNFgKUT7jwoNiVBTo8vSRG0I7+YUAoo6sbVWTwSL6yBNFx0q7FuVnZrqZA6SAEJCJtCgcRU0VLHBBhyDAF+ZRU02EZUlDIkrcG966qXD8T3rr2XgWUlQrm0BJWgIVqlgcQxVWJHEH4oookkqqfCSjCpIZEDDD1XEQEMSdtDQ1VlbgYviYzIDWlyompF6sLGDQpierwcVSlRDU2vCSzbbfMNOPXTTYzc9vbDiCtLJJP9DTDGh6LA2SSgU3mKagn4K3E9fL94puJCjx6NOVhbn6UFHPV1CFYMkQ49A++zzj+gC2R06PaGnTk8ySYDgGJtrSYyqhJObq7ixaR87qsE5E1rb06l8g3pQn6du/D6uWDBaDojHxzixX3v5Z7nfBkfhqOh12btZlq1EAxKe1GM36P/cU/rwo49+PDuJJEFDUl6hUCHt6J4au7HbQi72/sMWjC5QgGpPqUqQBFaw44D0MN9A7uENb3zjH3cbX0G8MYxOIOEfT3Nd4mR1P+wBkDaR6h2kiAUo7ZnQUCCIBDvuwcLPsZCF/2DHNyjoQLmFziD7YEc2XFGGGHRkYRQa4KH/jjW/UVXoOYVL07t2Zxav3c5OZyPOg0BhPnYIRIZWvMcMGziMXvTCFN644UHq8Q1HWOB94IFPoq43vzbWxAQkSBSvBmaRQ5kKRwW7nYYAiBITyKAEgljhDJNhClN80ZC9GIYi//ENuUlwIPRghzdYkQWnDeUtIqATZ2DUEzCpIDq+gU5lEmUClTzGJqcUW/2MODaeqDFDpColqYKgg1r8YxhuAAMY3EAHOqxBCG7AQyFdMYxsPPCRAvEGlJKClQzBT0TQKYFhPpYBC1hgBRqYgDa3OQEJWMBjMIHmPzL5PwoNR02xg08mjxAEGbhTBTL4hyH+EQgwpCEN/7inPnO5/8t/0AEPmRjGMSF4QEVUAT8PMRVPfvADjXXMmhJYgQNecIEXTPQCGK0AEzYKBSww4QXdlNoPKjJCUNWIV51slQo8GU+ByCAIW+hCF9qghzaQQQk6EITR8CkQNvT0H2zg6T3BQIdJDIOgDqxFEn6QAxFEJSQbiEEGJMDNiVLUohNYgQS2aoEMVNMC2nzBRpmwBCZoVWojaZG5ymQ4XqmFBEGIaxTmqoQg/KML/2AEIyjBCU4UggxisMAuzNEHMPSUpwdhg0/BwApCumEGg/gmU0Eg1a2u4AWYzSxWJZABtI4GBTkIgQiUlYOOSXUFExDrR7OK1ljiZD6PcytNZNqFQ/984hOXKMQdusAHTvyjFMDlBCPEkIFamCMP9iyIT5UL1DSAAQ9u2AEPNBADC3AWrA4QiAMcsAILbEBjCM0P82SSqJo0yzAg+MEGIsoDHnQAAxKgAfNYBRqUsNVwDjqBXhkhEFrQYhWUyGspBlIKTlBCDjHQRC3ecM9UESQNOBjCELiLgbFuFKRdNUqaTiADE6B3bbsqU0qOEqIfTNUBE8AABror33ZxTybFgeU/gAGMW/x3wAQpMCPIkIQsKAIL+RyIGwSizzRgwbnJJbJAhrACFvBgCUswAg8wq9Uq/CAFYXJnh08gglbFEUwi+LIJvEwCFbTKnSegwVRRu1Wnjab/USjBDqkCPOOB3OIfs/jHKgjCCN3qAAleKIIu+5kGN7hhEomYBB2I+o9JZGISeFj0Py6g1YhqcwbtpQILsroCjeXABZ9GUZl9RsrRgtnMZiblS2WAAg+rGaIZGMqNiESwt9wZGMioMZ7v/A/fLqIQeS1EC/6BgzT0oRO8sEY53ha3b/xCGK54diMbyAo8JOEJJQBZNR1ggAtUYAgsYMELVrCCzhpl1GE+nJSESAIXnCAHJHDnTuC3ErAcJYkW2kmYzAyMgvSbFnn+7SUYcYmBHDgSrvhHJ57xD3n8IxveQN03hGGNTPwC4hFMRg/PnQIZ0CAGEviHA8LNgo1ul7Pf/y1BmMZ8aj9qud3QTBkIHEqDiqzkcGoJs5lb1SoZC2QZAgl4rw3CB1iUA9kNF8g6ssEOekxSGL/4hUDvITp6bGMXhhgBT9zZzhRsoLMZ+Ee4oQDlcf+jClYOEUIdExWNCUSq1kVtVt1cAhl4+V73WpSy/uEMgiAj6AT2rUAO8Y9DtKES8rCGNQiy9GHUYximYIU1qiEMglhREDqI90CCwBMiPOEJpZ2q2NtbVqy2wAItIDe5/1HV7U6Uo1DoKBSYMIEYfLrdBdn7P1ra94H8W+h5Lfw/9PAPMhiiHe34R/LLUY5q8CITwihmNoTR2DAm0wcbqJfug0BKOP4D1E/Qwf+aWVCBIgzhBjfYqISHUIT2u3/QsR+0R6kwgxloIOwZWpSDcw0MgP8jwHcwEHzAB0RwfO/wDg23DsyXfP/ACgpYDclQDQ4USd7gCFVAAjnQUgIhJj7jSgLRUCCDXRPAXag1ciQXblSQghb2UROVVS2QAT+gAi5wEHaVGX93C7NQCgVHeIV3CHpABK2AgAMhDwc4ELzwDsjXgF5kColgCl7wAiLlAlLYfRioESPFUC7Aee8mEiGhXl71hV5lAf+wVRGlVV31ND/gAu4EH/BkEHElEP02EM7Qd/2WgwVnEGQQDQbRDuvwD4rXDge4bK6QDeXACkIgBDtwAyiWAR4DMlH/M1URRYZbJVLoRXMeg3Zo9zQa8Q8MxVAgAE9BcASiGFd2pWUaaBCr4F9yiAx/NwurUHD8dQi7JQaL8A/xEA+2iIvxQITtsIsN9w7yEIzx8As40H5G8A8fBVImqFmaNVEotl3ZxIzPuF3dZGVPQAQ5QARqKIrcOIr/EFcvxX01KBA1yAm0YBDAEHCfQAkBdgiFwAf/sAjTIA+3WI+26HAOB4zB+A8HiAhGUAT/KBAcMAQv8A8UMARMgIxjRQX/UAQc0AAF4G0cEHsrCGVRNmXk1lXf1Y0cSY6mGI4GUQpxqA0C8XfnKBAFNhCHcAh2sAsDUY+4aA7Ml3QC4XCuYFhL//APUFYEAlF2IPUCUKCTRQAFhvUPruAKiNCQQ4AFUEAFHkVWSzB7FzaCbIZBLnAEMtCNUhgEUhhHcdWRvQYMvcd3gEcQBiYQ/EUK7tAO5pCLt/gO0AANA4GA8lALYDCUOomM6DcQmUWROSkQvGBL1dAOiIB+shd7UmlhKsgEQ0ABFMB6VvYDRDCZLkAE/0AEneh5nbiZA9Z7fYeDemYQPEgGcpALzfAMbWmP7mCPAtEOnaBL/xCUQamQAhF7yAhkRZAHz0AMzWAO5lALuIgDS4AFT8kEVKCYYwUFQ8ABC6AACkAAWGUBOsBQUVVNX3VNqkeGpYAMY9lvezYQgldTMv91mTowDTB5nrkoEOXgU4gpEO23UbXJBEHJBEagm81ADAJhDfjZCbEZlWRHVsmZgktwA8zpnArAAenHAxegXdq0XRbloMyIWZzAa/9wC8BVYH1FEGgwEFugBT8AC6t5njAphOWAT4gZezcwBAURlEWQk/hJDM/AcMQQD7UQlP4Zm/LJUVF2AwaqAAuAoLUZlX+ZkCvImFBGVhLGA4eQirRQYJSgV+woEBsqEFEQU/+gBURgBwKhi7jIj8rncMrnBbOHo/+QfgVBVmV6A6kADcRgDbgIDbyABTn5lwKRo/BZoAvwozfAk3lJdgyJjHWqk1A2BFCmnBbZBnzlWzVFU3r/wAfiiVcCEVNRcFdiwHAE8Q7roJ8wyqadcAM5OZtzShAcJRBv0Ad50An8+Q95MJuzmZADsZMFeqDrN6c22pRE6qry+Q+EapGF+g9twKg1hQYb2gXC+g9oQFsC0QVW+g+hYA692Ay1UAlxADQ6EAdlMAEcoKtlxaIqyqpRtgRFgANs0Ac3AAXthwUcUIwEQXYWSaAcgKDd2p8napuxSa+zF3vrJ2FLsH5o8Kv+KqwAW6zjeVd3tQXFFweSIAmGEAdWIAZkQFt3IAcrcJCfyqIEEaoEgQPZCgdU4H4XO6jnh3572qLsqpNDYAQWKZu1WadGkK8uK2H+GrMyC7AEuwUG/2uwXRAFYuCwZNAGxWqsNmUFE5CmtWmmgPqfHNV+KXqv3gqu5idhDWmR7QdlOumqsXm1selRs+eyT8t+6zeAerCovyq2vzqlkfoPNmuzWtAFZNCzbeCrcNsGYmAHSJAFxymqvVq1t6p+hJqrUel+Laqv+yphgUt2A1Gyh2th69d+L1sEe8UINRW2enAIjHAIA+izZmusxCpTMcW2A/G2nxuxcZAEw/YCj2m1CZmTt1pWK+ieRbCnI+sGj/AImZAJj2AGa7AG9Nqi4CqoHMW3gNu17FcEicoId8AHe9VXwsUHvyoQb/u2wsq5xJq5xMeov0qaCDa0gLpkA2GnY4WQuf9KbDYABn2ACJHHDOeQD/mgD+fADMdgCfBrCXNgBkBgoETboh4rELALu+dXCquwCsHlv05qucTnvJhLW7QlrP7qvMMnEIsatnaQWnWqrxbGuoiZkzewAAiwBrEgDuOwvvqgD/nQDyRMwvaADvagvugQC/R7AP+AAP+gAP+QrTeAAzfgnjfckA25p7RwCz58Y07KCAP4uWUbU2nLuf06tkBBfIUQB69Hm6xrYUQJBRoLBECQCcygDiXcDyG8xfzAD/bQDfzQD1+cDrJgBgcRAAiwxgjwrhzwAG78xjPGiv1XCk9auQQMjwZ8rEeMwMA6fJI7fHo8fHeQBFaFjOALleD/qks2oABAYAnCAA4kPMYlbBBgLMZfzA/5cA1zcAAHAAAD4cL/AAAI4MkAcMqnjACkfABz6AzIMAufUAjABo8F7MBli8AP+7DECqySS3y1/A98UAgRnFkr6H44IARm8Aj/wAzi0A8D8cUEkcmZHMaZnA/2cA64AASmDMqoPMrejMqf/MkI0MrOYKH8VXh8wIOAHKxs27Zk8ATuTFv+GrbWewd3IMvAlgRh9QJlRQXLyQGOnAnBMA76oA5jLBDSnNDSbA/c0A/5UMbcQA2ooM2fPMqnHMqkzM3e/A/a0NHO0H93XBAD6KhtwLZPsLOb+Xmf584s3dL3XAhy0AKpJVb7/8oBBKAALqwO+uDM6lAQ0JzQz/wP3KDJ+ZAOAnEMwfAINiDKBVGfgZAHVMABpTwQHa0NH22hdIaWwOyod4DSNKADMaADYC3WYB0DYW3WaJ3WMWAFciAGEasBmLWvBNqcj3AO+vAPYJwO9uATzkzG/0DCAtHQ6ssNxyANSG0KOODJTd0Jm7AJrqAJgdAHOIDTB+DRrgwMAHyHUeqOEfsDYg131hTaEaUBpJ1NVpVZDgBfYW0FdhAHcM2Y53cBNxAL6mDQ/2APeo3QBAHYf/3XgC3G6ksNhR0MmQAGlP0PovwGqdCmMbqb1ZAKmiDZ5PwPyOBf38kJl3AJixCxViDW1v/UAi1Q2hNVAQZQAeQtAAKQAAlAAOtNAO4tAOWtAVdgAWWAjEvAA7qaBsyQybet13tdEJXc1yVsD5qcDsdw4Khg3AdQyp58ADbQCa7AC8m2DsiHfO9QDsTAna7MijPWfyip3YQgB91dXS2gYuZN3gbQARDwABBgABCg3u4d4wSwAAPAABHwABWAAfI9aehXBI8wDtB8wujg3/8tEM58EM6svv9wDMqACnSgyuHsyQiQBoHQCayQNLzQDIqnbNbwDDTW4XCoa/+rg4tACHYA1kmAeuAN3qVN2ilG3hTQ3jI+AHReAOx9AeE2BAmAfmCgDNZ8wtdg1AjND3it0LuN1+n/INxOXsoBAAANDgSPMAmWEAtQF3VRJ+G21AytEOY+XBCuiN2LIOJJMOqkXuqmbgGk/QIGgN7qvd50PgDunQAUcAGOmQAcIASoMA7pgA7XwA0onA5ErtCE7tsCYQ/U0ORrQNENvuB0kAmxgAqoIAxQxwu/IOFIwwvVcAn+OwsnORDn+OnaLQfTGgOmHgd2cO7ofu6jiwQagAEG8O7pHeN5eudxbus2AASo0OvSQA1DDuzAbg8ETuCGPuzSEAtrsOzLbgaTEAu4YAunIBCV9w+XjjSpQAgF578G4YpkHup2UO5xQAiYEPK3ld2XQAgLqwZIUAMmbgAyHuNx7pgPgANA/2AGsiANuEANvt7v/w7w0kzGC30MT47wCy4Ek/APuIALhf0PwcAM0MYL/8ALSOMKIA9cqzALVv8P357ZZW4HQkPqcWDuhHBbn9AK/vu/q3BbmKCwaqDy5r3qrZ7ejultFMABNmAGloAL3NAN3JDz/c7zwm7N12AJZsDgy24Dj2AJqHD0uNANyqD00j4Qe/MPknBb2271/nVjn4AJZt7xpQ72mPAJ/9AKrZBnPwxwok8Kal8GSIAETlABGHUB5V0B/+D6tj7zlkANOL/3Oe/vAp/Q+XAOwTAHDO7ongwEdPAIp2AJtoAL0tAN6aAPzBAMApEK0y9PmKDtVW/12l8Kmf+vsKM76hYw6mpgCCK/6RWaa74HcLog+qHQ/qEgCGrgB6xf2jqOASwgAFJtBqjADNwAENe4DUSHLl06ewnt8WPIL5+4R0AQHEAA4MABIGbmPDp1Chc1hAvVMfv3z1Wqkv8MEcL0qdQsmKtmlfr0SZKhOEmQ1KiBJIkaNZJattKFLOU/oyWRLUW27J8uqK1ghapkSFAcQUCBYqDAIWMsadSujeVWMKRCfiKDAbl4AIBFjBot4TrGLd/Chv+ClfTkSZNKQ0JdzizV6hOmm2qS1GjRuCdQSaSIAkPm7J/loymdaXMWzbNnqLpajSZFKhQpSVkELFhgxlQwaWPHmlWoMB//ODxt3VpEIJdut3P5GjJUNw6ctWfLdJEy1Fzo6NGHE5dBgsE6hp5lBEXWtWxZtMxHtY0nX358NGdNRa+HVeYGAyBzYgWTLbBg7bTqUE1MCQABECHmmGQ+arpB6K7hzvmHl2mAmUWX5pzDZELUJAFqp+uscwIJQSohBarvwEuJnMzII8dEbU4cr7P0vItmGWMi4UGIAB/5SLayzlqImTkOyMyGjDaiKyyBujHItnOEaUY5CCOJUBJJKqlKkDLKyAKDCrJkgYUsyogkFF+6A2+8ktwZkRw001QzTfPKw0abZTxpgsY1HrGkLrKOTCgdVNi6CIEFbLDBDI0gOcUWW+g6/yY2Pe3Jh5lfiMnFF0GsqkpKQ/zwowwnnMDgAgMMqIAFJ7LwoxJYfPmOzBH/IdFVctyJdVZZZ11TRW3e1GYaVd7AQVAzLAlGLG6MRCidYObw8x8gwFgjSDsPtYXRgw6yJx1xumEmmF92gSUSP9TQtEornfDhgwoMeCCBBC6owIk/vszFGGzC0SYleNyBB55/9vX3X4DhIWffWGtFU1dsdoHj15ImoSa2a/5B55x0TDEDCIw1emRjSyw5BRVcEpVGGm7qG4gaao7BhRVedqlEED/OOCMLcyvooIN1CyCAgAIg+MAJRUSZdJp6X+U3YKSTDhjNcJgOZ5dAHhAUjH8eLv/yn24smWMOSECOBRVUOkIUF7KPMdvsslXGRRZZUMnElVpCAbeOLLKo4AOcE+CZ3Qc84CGMPxx5ZRmiUwyvJIDxSRwfxZXON81/wpmmmEA4sCHAWBalpmRc5lKGmWOCWRsVRBNNm2xET+l49Y4zmQSRWmBRJZI/aMYbggcK0LmAvjuQYpBIRPGlcKP5Zfx45OE53nGkSyIxnHCg2UWRG4CcA5VgjnkYl7BOVvsfstM+O2TVIdlaozoneaQPV4zZRZVN6vgCBpxz1z0CDzpooo5IVIFlmqYN7F8lQZ7iCtg4xilPeY1ToAINhqZpTE4RlgPCP+aiMiKdLHxk+8eiRvb/wdRZwnznM8Ma5uAGNyACGsbIhSgUkYceeOABuRsA7zrAgy80QmjQKJq/UnJAICIQaQzcV0pqBT1sQKMYmuhDxsJ2o2tsb2xnG1kUoyiNY9iiI4+YA6HMACQg0MENeFihL0ThiD2EYQYyjMAA8NcEwHmiFsNrWhGPwrh/BPGADQQY4jLjjlphYxnPMEYtXPEIQp0igynL4qI8uLmBRBKLsjjFxroIRoy5IQ3Q8MUuRLGJQcChBzOYYQQe0IM9KGITtSgGDwXYr8PlUY+zVF4sy0SOcGDjGc1ohjV+YQpLoCIsKKMiFqtYkoIUpGTSWJslHvEsiSCAWTbAwTOK8YpR/3iiEVKgwhr7NgMp5KERoyjGM7BBoqPZcpbrPJ4sCQhLpkGDl9aoRiZQEQtFqcxsH0SZfcyizElq7WITacs/bPCMXfyjEYoYhBRgsMYdzAAGYRjEKo0xDXTyS53sXKcs8YiPMrlKl7wkBismATbUIcqDHyySQQ6izGscQxbmw5g04WJQ93miJHBoAg9m8FMYhHMTqtgFD/Wl0Y1yVI9+7FfjyIGNaViTGIachCXsGTZDDclsKBPLP9LhUpgeAxWQMAOzSgKAkgCqGLvwRB6a0ISH/rQJXthDI1RRTgAeNZYgzeMC8aEvwLojlz80ItOwcVhoPCOxz7CmKrK5CU0gov8Pk5hEJpwJiWCG72z7dOlX0bHMsXaxJBdJK6B2UQtP7EGiP5UoXQehCVYCMFb7wuMdGegOqL6vFgmVai1qYQxr7uK0wiXuaV+xi1wU4x9rfQUoGjEIROBhsh3jItcya7rwSaOz6SgZNXBxii5ejFkUKckCGIDN1MZVok14QyBUWYtnmANNR20gARn31GkoEX6b2MQo/uHbXRRDuY/dhCdGcWD//mMXryiJLxz8PkcAYhDTpe7WLPwIVLAtZGSjhlm+usxT/GMO/7gYEAJV3n8woCSOCEQTPOABubZXEZ7YxTPCAVjaIu6oELRmMVC7iUZoYhMl2S1zFdqIRvwDFP//SPA/cqHgB79CFZ4AxB7GkAiwOdPCW+ZIRzyGi3+UpSACkYYlSOzFsv4jAhHAQYr/wd/nTmGNMIbja4lqY1nlq4hmSkk4EPoKQHtiE45A8l8YfOg3LzTJS25yLgDtWE9EIhISHgMdSNe56oa3hHWyk8dkQZeylOwYHRthF9fQ5h0YYQb/aAADBt2IQKgRAjCmqyrvfE41haMk0/iHYouhClAoQtiDIDaxFfEPbT53EIFg9iCSXJJRSHl2kWiEIwSBZEEAIg9YZqYtSj2HNZhBCJveGoaD0bawSOMUmMXs6uYABnir2gg4iAADkKyIQLhVhuD8x4yLfNjDRk+5CWXy/5v/YeWSTGEKTehBD5rAhTGMIQwMdzgX9gAIRyDbE6KIRIQjDAhACELkgEBEJh4mDVuIcCNdpBGNSriR+cQiE6YwxSTKbSjVORMPiOjEP96AhR1E4Mj4zkMeYOABI/yuv6/YbYDXumBVpAQQgfjHGI7C2jlDYNZa5zoEYLA/jDui44AoSbYlDHJA1CET9ImpFi0Z7pa7fA2ZmE/NH0EHvOOdY6io7ElUkYpAeIEKHtiBsBlKbKODc8ajUEUtRgGKVKTCE6kAsoT/wYW3wvXFpdSd7h6w5gKYMvQRmHUTxjAIkP9jEHX4B8ivDfJB5GFY3GDmFrlIqLhfDg9rZ0Um0v/wDyN44Q14gAEK8YCHTvzCt7X4B9Xf4PNhG34QXACnOBc6CIkXXeJj4MI/egCDo78YAiUx5Qwf0PWuzzD0EJhBD6bwhTrU4QzxrwPqQR7/ToyjGynTourC23JBERTkMyk3ULUZmIKEUzgYKDxVmKpRgCxFeL4waLZiayjwy7yUAD8Y+IdVWyMI6LzOi4AC+Afe8bqgoj70E72egYGGcz+FqwNE2IMY3IMzQARhOIdu4Aby0TJxo5EAFJQ06AM8KIkd2AEP+IcmUDgpUDiFU4TjmrxNUIQJDISFyzyGm7MXy8J/OMJ/KKUGKIABCEMxBMMBID8IaIJUagRA4IKjQ7//86OfDvgAOXw4RJgCRLhDnrtBblAZVLCESaCDNQASQWEABEAABVAAQSkJVSvC9WoCKoABKmgCKYC4QCCqhRIyRcjCLJy1z1uzNWsAUGQABhBDUgyAAACAABhDEoQALpgxUOi4OlAv8Ou6/JHDD2DCM+gEnusEV4gFU3Cdu3MWIRCUQixGY2QANjM/GJMoGMCCo+uBMdgDqgs2RygwRSglTwQ9UhRDUdxGU0TFb0zFMCyJB5iCQQAFUFAFVXCEMdDAFvQA9PsAGLjFKai/KUiEO8SDNHADZ4E7GyDEYqSIP6EIBAiAghyABvgm8OuAFzPHQZDGN8umPbAfEGyAbbxI/28MR1JkNTXzgClwBP/aBVAYhB7wAhb0ginQwBnogFmLQ/eDOIXzAulKAxhIgzTYAXr7x2J8C57syZ5ESFOCMU2cApDbAy5wr0GYAhD0PBHsvAZYsy7smyx8AIwMw/LzRA/4ApBcx0ZgQi6AOPfrgX9gSHiMQ3n0ABRKgynQpDQAA5wUAlEESJ+cS55MRc8TP63zgFZMyp+Soc4Lw55pPzZ6ABZ0OIWDK4nyADIEwVmDx/HjnR6og/6KsGiswDMYgykQS9yhRYlyA3zkRzD4lX+MS0Kky7cYAFM8RVLkHfP7PMI8OhEEzKVsP8yUoQd4uEFQhPt7uMykSNLzuoajH/8SjIAO4IJBILRA2IM62APlrD8rGyVyzB2h+wdNcoM1AEDSjMsFOMW5vMhUFMca0p3w/DwQDE8wLIAXczi40roeME6QU4Q6sLhYxJ0ZYLibqTjMrB/CrEeI/IKUXLWHrM2o1B01g4AdcIOWy8nsHMUBYI0AGEVTHEOLrMpt9DyKZEzDzMwjZMExkLDV+4IvGIMeyEvj9E+Hm7/VU8rz8zqIA9HMfMYz2AM5ewA1o8gyZDN680RRNC8EgFDUjFAGBUxt/FEKrSFTis37gYApGAMQRUEPYMEvgL09ANEmyB0I6IEzAIQ/aLgmyFKQ+4LxOz8PyNAWbLjMnAGhC72/LMP/BmC1NUPGVjOvbtzGL1zNL5zQ1AzD1ATSHV2AAQAA3RnTaIw/LpAh8EOlOggDLgDRMeiAEvSZiZPDyES7L/gArWPI73uxLdTCB3jKpxTP1ESrBX3KuKxQ3ZnQMARFUBTD79zTPZ3LQAW/ekxK9ixMloSADgjLHuiALoxDD5BUKZg/QPiCm2FI3Ckl8lNVZdVTVwXHHu3RNcOBB2AA8HSjNU1VVWVV1KTWZoVV0nvSyBwES73SeYRHK+2AKTiDEC1TvPmAhgPRYc2fDpiBDyRQNYuAOmXWZuXO1IzLNTPCVhtD9SPDcQTFAphQPx0Abg1Vn3QLz2NFT1AFkjw/ioMBO0/EmciMv/lzhNXbVTOVghH1ulX7QKELv6bUV3A8RX7t1wAwLx0Vw4TkvH8Yw6X8wm5sVe58i90AgIAAACH5BAUGAP8ALAAAAABxAHEAAAj/AP8JHEiwYEESCBOWUKGiRA4QAnP8GwGC4kOJOVLk2Phvo8ePDyOOSDFixIkS/0iiJFmy5MQUJ2CiSJkCRYkQNm+WIKFTp8ASKA0OJCHUIMIQAimOEHiiY4qOE0OmmNrRI9SIKTuCkMiy5ImWEluOyOhy5AkUU8+irXkCIVCgPHm+JRr0H1GiRYseJZkC6L8QITTmMLl0IkSMGwV7VIxx4teJS8s+Fevyp8yZJWae2Jyws2e7d/MKxCvUc2ekX2Em5bgV8VSQibmSJUyZ5OCuI5miVWszJkzTwBOKtju8aIjBtCeGkDs3uPPnz0ucBTp9J3TgKEkPrHsQNGjTx72O/7AenLxn89efn5T+dmbO9J31FjcK+gTyr22jl39O3HkIlACikBN6wX0n3GgIzmeUcCeYYGBnJsAH32hunQYXUJjBZdqDG2o3FHEHSfhZZwSKeB2H3sX3j3UPetcfQqKFtiBwKJYGookIRVjgiR4OVRd3RQEJIkF34QXdfDg69yJ/PQ4nZHFNpvfdlPoJB6OVRVLZoYxY3mikj/TRVySEHCp55Y4VpjnigWNi2eGQCX6o4IJ/sShlkmeex2Z/ZV4Z540h3vjkjMRZF8JJJJiAaIQmzKVhfCfKSWRxdVmZ15cJwmijkdiVMNIILvSVAgg00JAYCYjmSKCOkDI5aZ78If9Io4pD4QWkaW3tlMMTT4AQQxVVxFGJJKTIsUEOJpy6004RNsidg7J2J2afTmoqH4I/EnneYECRqoMjriSTzTb1JNNDDVXEEEMGpYLgrrsZBXVSnKFBa2CKS9IoVFBNRrtdaZ1tAIJGpFYhiCvfCFSPQN54k8zDyQwziidx/JNEHMea1O+cAG8YJIVzcqotCSmkq0MVSWiSzDf17OPyPy6/TM8/9NBzzzY4E1OJDhm5B+CgBe10aYtwTgqmtEbPmEIcr4zSyTAz7wNzzFQLdQ89vNRAxGZCA2gjtPwGzeeR/QnN071hFv2gDsWQy849VMf9skH0fPPHBiqYoDdKDlb/uvGtdpWYpbb4yljrpcCZ8EMyLcMt9z5www2zQcnUYFEO1A04WqNp9jmrqxxHC9eKRhLxgw5JZPN2zPS4zM7jkxP0DS8YO6WiZ6ziGd2/0sb1pULBJeHIMOzYfM897HzzzeqPy7xP6/Vso4kOptaEU3N6A//WoxGWkPtR6AmEGawRIiWQgzgask3NNrPDjjfDNOx+zayzHzXV24xiwQ8pLVtihDYZEHmy5z3P/OdRdDkIUJ7CHqLo6HvBiVAMVtYw5RWvF2bAQyZYYYpexG959WAf1egRPVc4oQq/6R6EHpiZ6pgHgnprFExO8B8/4SWAKyIdQlzwvRgihCEykEEM/3Ogg1SYQgiIYEX8tuEKPLjBDWuggxQzYQpWrCyELqOHN1ihgx/8YCrLQlUKSKACm1SIOtnTnZvcIp0VAaVvidIbQ8jIEBUcQQlRiAIZ9iiGJyQhD3hgQxTdgIhO9OEfaUjDE58IBjfQIRPEq9k9vAGDGPRlKyDwoiZb4xEUsMqHIkiUadKYLDNuBJMp8ROcciWDINRRBUEIghCDEIU2HOKWjPhHIcQQh1p0wg0EScM/3MCGYiISkWwYphtM4QpvKM8TMaDBD2iwAQtYQAICkYAErJmBaGZEMH1pS+A+8w8TqOAfKAgJDYC1LgskJVc+LCfn/tGFLuSRDHcoRCHuQP+GLrSBD5SgxD84UYpSEMIK0GBFIheKyESyYaELfagihUCHRJgiEBr4hwRWsAIHVOAFQ3iBSF/ggJJOIAMWiIEFqlCqH/QsjIya5gY2kIGNTmACDrjpBLAZkZ3kTQThuyUf9FCIUsxiFqvgBCMKcYh/FPSpFuNFM9iABYk+FAwSdYNDi+lQRdKBAQWgwAUmINIL8OAfPHjBBFaQVpLedAU65agE2PWD1tQkB+u0QEeZ0IEZGMEIS4CCEWYwAw9MQGBjbBSzGIUQRjCCEpxYxSxocYtb0GIVlLjEUwvKiULEIBCKgAJEuZoGrmq1tF0tLRhssAABUECka1VXNEuVgdr/lqpUKoWrA0i6ghhoU68chesLmEBcFrCACsRN7hAqMNet9IVvevtHHR+r2VncAhjYvcVRV7EKqC41CX7IQxEWCobygiGKUkzvGhyJBzow0gYMEIABDPCC3poqB20ZARll8EMUZPIfet3tEC6QXCZAgbhFEAIO6stRAFtTm9uswmLkQoIg/iOIKoCsUWmB3Q5r97Kl+MQ/LqFPOUyAAzgobx868QtesDgZ/xiGKarICis+TMZf/eh8P/pWlnqRCDzRyDRVCuEVvIAHMzAvFMAAhSUXIaQctaaUa2uBDbj0H/ihowwKsgrKYhcZyOgwLZBa0EtcwrEBTUIWEFHIcsjj/83lWEc9vuGwapiiGowjYT3KVUkLtACnHZXvBTTQAg1I2Z3/wCkPmDCEB1zgAiNlwQsk/YIlGKEI/9iBEV5QAR54+tEXWIFASOICFwjknAa5bkHALJBZPFWpAaUEIwjhC2JkIhXrePM7yjGub4jLFa4QBvGmRo9tnOFXmXQXDWo6AQy8ANICcIBwj1wBFqxAA4aWbRWobE2cljSnOb1pNjdwFYNsmSDOSHdBxvyPVrw6oI49xB1I8Y9fmCMeAmnHOrKxjnV4o4rrEDYWXfYNR5QBBJ5ciAxyMM111nSjcI3rSr1YFRdgGFl43UAVZurFTNYVXsja8rkLYuF/pNsZAv9h9UBcXQpOKJURtzwEGUKxa2u8Qx7/KIc1MpGMclSDinbOs+u+sYsk/MB3MnABEWK58FNuHCIR+WYJ+JuCWMryCFgPoiitfmEVEGXkxTn5P8CMjH9kd8wtPwQf1q4HPoiB5u/I9a6rYY1kCGPnwqiGMEwBtdbVLBmNSEIO8jYVFQRRBioIVaJc8BFRVVjrPMlbEGU5+VZa/vBcD4JANP8PWQoE7Oome9nDXFlXC6QQArnlD3TRjpvr+h3/aIc1qkH3dZRDid4oXt0SAQEkPCEHljfB5JNVao9kzwQWr2OE+NtKqzv/+c1/fuedv/mCAGPswCC7ybHL7kvcciB8WET/OATyZnm8Q9/rcEU13nH+bPCiGsMYxt4TsYMInLQKIGB8XUs1U5rWNpqlJnyGh3gYRnmUN3nPl4BBgHVHsIANeASdNxALGATcZV3ZhwzpFma0QAv/QAlM9Q8wJwafQA7lV37np3PtYH7y0A4syAvZgAgKVgSbplZzZU0tEFy6xVE4JQEsNYHR93wMyHRA6ICxxIBGeIRGGFClwGEml4GW5WqfcAkgqEty0ArhIA/xgG//gHPxUII49w9ZuA7QAAdFwGhDMARFcAMUMARMcANnaIYFNgQJkAAv0AJPUGFHQAQ5QARE8AR8yIdWZ4QugISEWIgM+FhLaHLakIEbyHIt/xdvi1AJz1B+BKFrKigQ7xAP7eAK/7AEjIZgbsiGI/UPxHWGgdUHmuAKecACDiABvyJbf1ZShJYBVfADg2iIDKgEuriLSnBHRqiLiAgMzqANi+gMwDBm3cVZnCBrjGAI0BAP72AOWzgQ8jAN0/BmApGFvNCJpQiKQyAQTCBSB2ZpN0AFqvAM/1ANzZAKTCBWIiVtL/APbHiGIrUCtGiLS/eLvLiP/LiLiIiBxOgMyGBZ3KWMzChvklAMxFAOYDgQWdiFWigP1sAGmMYE4LgETzYQB9ZkUICRbEAMzUAMz9AOtdAOgcABbggF/6CSGtmRpViPE4d1/biLUaAFeKQEWv8QBTgZBblEC+lWjMBwCwXpcrKmdnrQBndgBZWQgmCYhVj4kF2YicTQZIFFiox2AyspEOMYWEbwD8/ICyMZD7VgDoEQWCrJkcl1YMS1BGzpaRUwATHwBDh5k1pQl3VZk3Z5l3bJB4ywCifnDNpVkC0XUEaJBl0gEHIwDe4AkV3ohW8WD7zAkeDIBBi5ksSlkmwJBVjQDO7wDM9gDuVADNbwDFhgmWq5kZ7YkaS4BAKBkTzgAC3ALmIQBfVEBnlUT7i5BTlJBltwm3zACdknlKUQUMsoa0PVBl2wBf+gnFvwA6SwmI1pgq33mLVQBAe2kgf2ZE22kqyJkTiQB/c2ls3/UAuf2QmBdZlruZZVSVxaaWCkCFs7tU2Hdk3bFAM60EW82U//cAiRxQneN1RMdZxosAXKuZzLSQZ2QA7R+Wbm8AzN0AzmYA7NEAhF4ImrKY8EYWAdeQNYgAeaYA21YA3xIKGZUATaWWAGxp7bqZVnaQRD0JVQMAQ3MKNuWBAh9Y5JoANW0AVksJ/f9w+GWU9ACqQEypwCQQZy8Axd2KC5EAqGEAdqEAeGIAgvgJIWaZltOBCsKVhLcAN9EAgP5QV5kAqdQAU3YKJNRpkoupZnORCU6Yl/ZaI3gAMcwAERsAB1OqMZ+gIU4AD11AZt8A+AigaEWk+GuZxFWqSHKQZ2/5ALsFAJUWoFciAHYiAGchAHz2aKnmiRZ1gQbFkEOCBYWJAHb8AGGFmh6bmRlKmW58mSnWiWHGmiOLAAC6AAtaoAKDajJkqZZwiovtoGhAqoRwmsQVpPiioQlTqpYnAHQFqoZPADFiBWaPiG//BkS8CGFglY3okDRZAH3qqaW8mWgPWmgdWqaQqrggUGl8YBCtCu7oqrHMCNm1oEbXCUenCvv1qvwNqsBJqcaGCghDoQ/zqkaEAGYmAFSfBsynWmGWmhrSlYlzYEm8oEgFWxMlihbFlgZqmhGsqVYHAD8fqu7YqnTxaHQ8AHh+BYQ3Wv98oHBEGshkmoMSuzgSoQvv+KBshJBghbaMPVhjT6ZGd4hhzpidf6pmrKBCYqg+Oamp9ItEMbWDvAriJrqygpsS7piWx4CMRJCUPlsoxAlGonqAMBs7+qB4L6q4JaqGLwA0nQAg5AATSqq7r6ZF2ZmQeGrUf7opfGlpvatxoKBRVaBFIrsih5ppvKqkH7WAQ1nIqbVMuodoFqtvnKsvgqtoF6szz6rNBqAHAbt3E7ENYJBtZ6qmzYt9p6tGwaq4OLAO+KkmWIrURrhmdIUBu4gdzVXcsoEGY7tsJKub7LsgKBmzy6BaaTBG8bt3VapwKBYjggBOXlhmkIsZdmoqJrXklbBOZlAwoABKzrrnjKAbv/OrEaG7RdpmrHOJi59A8ra7a+u3buu7LuW7nIyitPQANx0AKdO6ODqwAIEAAHYANAYAZCcANCYAN00AePkMDpRQcJ3MAJPAmZEMGWYAZAcAB5OqNnWKF4m7cZXAS3oG7GOGL6VAhsZ7bx23Zrp3Yo27UojK+Vejr3GcMxUFY0SgAcUKt42rxmsAY8/AimwAzZAA7jIA7MwAzj0A3dQA3dcA3UIA3U8MTUwA3nIA2nMAfV25EuipFEe4ZGALK0SqMopw1NOAtndggBqsLvm8IxF3NsJ6Caq3GydZ9xYAEO8GgZKY/fCKpmMAeoEAtGrA+ArA/5AMj5UMjpcA3ccA3S/7DI0nAMxyAN//DE/2AKk/AIT7QDcjq3JsquAHAACPDJxBjKxrgKjgVza3zKKVvKplzCOSsGG1cFUpYEVnAHcmAHSTABMnoB9JiGOLAGsSAO6lDIhdwPwlzM9pAO6IAOibzIx4ALsvDMwRAMyoALyhDNk4ADCPAPB7DNadAJgRAIeIDN27zNxEgOATmQSnVmqoxmsdbORQm5d8BPYqAD3FZbOiAH8UwIk0rHkBa0N2ADpqAP/cAP/JAPxFzMhWwP+WAP9pDMy+zIuIAKEh0LshALwbDImbAD2TzOO/AGgdAJrKAJhrQDC7DN5GDO53wLjyhr8LaMLlec7Rxv8map9/+pUlJmn5LKB4XQdjCHqZAGUgTMCgJN0P0w0AgtzAzt0IrsyLIg0ajwD7FgCxU9CULwD528zXjgCmBZDlwNkqngCn2AAyctyhroiJvFWZBFlLG2VLQ8TfR8aDiNz0yVspBFCUjwDyKFhnQADvlA0AV90Ee90OmAzMrcxM0s0Zbg1KhA1VbtyQhgA53gCi2mjqNpDf0GoqF8zmB2fa5mXbfgbu720i8Nb4UwqVagAzYdx5JKCEyluC5XCpigAf1cBJkwDn3NDwrd17mN0Aw92Mq81M58CpYw3BMMBFZ91RTFTJL9C/+QCv+wjbzAC7VQjCcXZtZtWZRVeq6WjC2XzqX/LQenfWg5qqOTughn9tqbJQkYgNe0zQzqwNDwnQ67zdvHnMxMzNSnINx0IASfrM2dLASTYNGxIAzC8AsG/guSLRCsIJBk52GV9eDX9eBIdbvDeQmLoM92gLBJ4GcWIMtxYAeEsAjmfQmLWwrc9QmkIAj/ALdpwArdwA3c0A3/IA40/g/pcNS9rdSN3NTCPQfZDABXDQSPEAxIHM0EbuAEwYnZDeFM3uRPKJhmduEZHgcbXgMtgARxEAeEEOKX8AmbReGfgAmSkLAUsADLRNG4EAy4gAuPrMQDkdC+rczcQA3NjAtV/ONAjgAU9Q9ELuPKQODCwInMDWz/cFSTteRO/87kl5WMnPAPhGAHtowEFlADFoAESQDimIAJn+DlBTXhSBWFl0AImCoAdSoEj2AJ+Y0K+X0KtoALT4zIyZzMhJ3IzWwLj7DNQA4Aek4HAR4MM07EzBAMR27grvDVRzVmiJ7olYWM3SVikmAHVG7lLVADNWDpdpDpn9AKs/APtVu7IfYJF04ISPACCcABQLAGkzAJww0J7A4J+W0LtnAM15DM55DML34NzQwJFXwAADAADCAEa/AIqBDN0nANSEwNwV7gzZ0KDH/sG6jsD05ZG1hQYf7oVH4FhYZtNVAGamAImu5ung3hY9YKm57pklAJLEAA//4I6r7u7Y7qpyALuP+AyDB+DUtt68Z9AFb9DzYA8KeOCjIvzUhMxBvkCpuwCZqgCcv+8Ileu8s+CySPCf8A7WqA8Rhw9RpQA1EqCR8/WdcVlJb1hIZ+VP9QCVTQAD0/Caiw7o8wB3PwCOyO6vH+yI7czJYwB9yLALr+D0JAUace89CsDN1A47GACkmvCIoQCBAP4ZPV+FC/6c+eBGVg9cZlXBuvBoJQCaHQCtqefR7Gfd1uWbpg9hxgA2AAwZbwD3Tg9qw/B+zO6mu+5rLwCECgAA2AAAxgAzz8D+qu6qn+zMcg+MwgDM2wC68QCpHQYdnV9GMf9c+uBkhQAxjAAhVwAR0wXxfgA1nA8YL/IAmhQAqtoAu6gAy1e4Gil326EApUUPpuMAnttfpr4PZ77PruDvsRTfsMkP8NAAR0ABCWMqFCdcqgJUunZC0MFkwYr2e6WsECVtEisFsZNdKa1crjJ0ySDKlBgqQGhgoGDCRgmUBlhQossvgRJKhSpVCkYLXStQwYsmVAkQFdtuyVFA4MbKTpg+fRI0hRIc2JesqWrWPBLK0BYsNGBBtzJskiWPAUQoSnCDYMxqqWLlKSKt6qyHFWR494P8YdiUQDC5gqWw4e/KDDhQph/gCKJIpUrp5FJSPTpcuXKCoRlIJ5NAmtVEgJrx6LNeefV69gJsXC9c/gWbSWCMpqyEzZ/8NUmoDdrSzRY6tPn0h92itJpB+STgBfoECYJQHo0QkUMPDBSRZBjUNB7tlbVy5YsCJR4QAWyByzB89atYULlRnUNtZkihUMV8LXaNUSjCULVyxTWGEFEd9+M/DA30gJpZJIIlGjjCxYuKAD51gq4MLoEngAgg6s+yM7UV4JLzxSdBpRlDA44MAGIR6R5aqr2GsPFTrg80qI1XDBxRbXXivrx0xMQWWSSfL4Bw6dfvNuScmW+Q4WUSoRBEIfWKAwgQt4oIIFJ3xooocOeLjgAQ0f2LCDCrKo48MGG8RpRFh22eWPIlacT0c8dfznPjOE8MqMSf6R5R8e2fvn0P5+tP/kETroAMMIKrwYsbImgYrmUkyjKcqXBSP5I4sufQgjiy+caCQST0TxpKY/nODBgw3NNKyDDn344osz2FRFxF2MweaZRopgcQ5L6mvtn2OOkWUOG4WwxJQeYWuNGmqS9Y+gRR0VAocbijACFl8ku3QZTLUx91xzsfHlFVEcUeSMW8OoQxFHIgkvF1/AC0WUSOpoYoomYDUTAgo47LAJJ2gKMRdosMHmn2cUETasTBpKNllLzOjTjEeCSc8grKjh5hqSpdHxlEcscRQHHDi4gYNwyUXXXHLImdlmbdZtt5FAvsgiiz8iUSUUX4xp0hhjYHkFlEb+CKMHDyCAQNYzO6j/w49NXvFlGoexCWeaVIpYoEVUgrnYFmb77BgXkNvDShqSrxn5GpNRZhQMliMoIAJjuD63ZsADD1zdVzxxt45bZ4pkO6OxOdfhaYzZRRVP/vgCTKll5dDDSF5huOtw/jGnFjy8cuOfhoR5T2NI7LMKl2Rhl4Zabg4duVpUEFo5ggYKaKBvr7URfPhwiv/HF1UiafrnWxXpvOhlgn8cG2N82aXdyzuYWlYPeGjiC0VUyQV4rw81hxhN3ACCjkNNSXsOXOxr7WIdZ5e7dm5GNll3vBkY4H/ghWN4givew6BRDFVsgmd5YOAeFOGJXnEtHMKrWbqgYYxcvOIVjQjDBzpA/7UHdE8KgfDEKyJYvpqZAxq16AQe6DAJNwjhPGU7BjWuQQ1kHQN2NbQh/m7nMZWBwQYMKMD//iFBAQ6QHAWcxjOKsYtRNEIRdYDDF/IQiE2ooldeA5w7AIeNyK1LFRxsgvbIdCEz9eALfyhhBP+RxOKZwxzW6EQnECFEOgRDZPmjmw7xRC25dQMd3eBGtWKhMj8RcQAFOKLXkjjAAv7jia/YhCL2kIcwhGEPJDThM6YhQHi44x+iXOI0oKEzRYShCTB4wIWKuMgHNCEPf8ji+JBYvHDEIx7maIc1eNGHSTCjG4TMn8nwhJVjSOMfgsyfIRE5RFd68pY1e2TxpgExBP8ybQ+ZzOQms1iMZ2CDHO4gpzvgsUSHQWNym3BaE3gQgf/FE5YQgIFiQPEKYzQMlwLUpTne0Q5WBEOY6EBH/o6xpzwla48jS1bu1uCnBkRgQ8WAxjTMsU8BwjEc0DggFCsZBimENAx5GMQmRkFRcZYTHucsoORGoYgvrNIDr/xfAAZg0xD2wIGe+AfDbhkOf77DGsJghjgIOshrHPSY7Unm/aShQ1Q8Yg2nkSiHmvEMT14Uo0sMBzag8Yxd8EKBgZBCD3rQBCmEAYuqKMYnB2eMYhQjn4UbhBRg0AFY0TQAe71pAXIa0j04whNsjWthm+FLQR61oNdozY6OmSxpRDb/WbawxBz89I8IeKADTbjqMxomR4x29ZrFqMUoKpmHHsAABv9SzChq4UmHLbEYL1VEIzbhibqu8gF609sr98rX/0m0A6ptgiZre9tUjOIXvxiHYgnK0MbmaYexy90cLCsEBkTgH97DKlY/i0utglGSlOTZG1Sr2ilwIRCgqEVh41qLRoxBClMYQx7GAAMP5DevrqSpPP+HRg/0IJN5OG4dOyGMcziXj0/1o2Pbc8x/PIJZQohAhf9hhBlg9aocnUaHOWpNaBxvg37IQxNmsIMZwMALav0HKOIqp1E4Yg9TmEJZm/Clu84gvxCI2m55F1F4xhPAMyhuGL4wiEEEAhGs/xBGOtBh1OfqL3ZL1RFZ/jGHNfTpKxHFwQwy/IxmNIMYYSYGMWpBDE86sRiF+0Mg4CAwCMygB1wYQ0k9AQpPKHAPXKDxjc2aWhh8AAb/gEFq8Sq1zPnXlYbpQVrri4glMyPBTo5yH6Uri/1kQsJrWIMQcVDhCj8gw83YRS1UMYpRpEIRikhFLWqxi38kUBGYnAGoH7CDQat11ZaccZ8B9i+znlfOZgU2fntMU2RviMiZRIQpgiFISkeZG0/VEYxitGkhZDtvtha1KlKxCU0kORB5eMMb/hEIJP+DgV+QghF267+IekDOUuBCvQF21jGMgc/0DfZ5C90ELtThDGOA2v/U+ivkCMR5tV5otjLOcY5ojwy6VX7NWaSq7W3vbWAzUIS6vXDiHYQ85F5WLYZPXGH/xbMBClftn896Bpjrmwsf6MEHbJ5eLuBqEHXYA6GnFmRFF4BDqsVCsyUN8eeWrMFkKUjuLo6DHbCMZQkoQAL0u9kZPKABDWBA1xkQgK7/z+sM2HoD4rlXzMqb5OedArzGcG+a03wKX6gDkpEMiEGw+9gH96u8iZ4IUyjjqPmb9o7eFgyyGCSq14U6ij2Agw1pdrg92O3WEXB5AGRe8zXNPAK6/o+9AiAAmK2q3ws9hX9MweV/Tm8d6m53QACiDlPocSsVHUIvp8ENq3n2Yo//kTvZUKtamLbEJBjVJyE84B87qL3kC92Ds4te+qHPfAA0L3rqA+BQQA6h34PtcpuflQswj335Y5/3HmTuQvLs+wyM4AY60EcWIrtGMDJBh0ecQqDdoIZ9FiVVr4ioWNGczbG5Dvgf7JO+6rO+6ru+7Ms8IAu1/IKBFDsvQZM7urs7QGiERii/y6k9ZGu/Hdg9U4gFVIgFYfAY6xKLWBCm/rsPOoghsuM+H/MrqdEvDwCu37Ip6/ufraupmxqA68s8r9s6zOIxHvuHFLM5mjuDuos9R8AzUHAERwCEMwgYqeGvC6mqGfiHNAA8U5iEREgEF0oZRsEDHmqI+8s2sgM1/1DTQv6yqQE4FEU7FA+gQA8AuiEUvXjquq0DtX+4ug44A/MDBFA4xENshEEgOA84FDPhr1ALOTcowVjAAzDYgTRwEY9xoUSoj2CIhTW0gbL7w7LTwkP5hzmUKBAyk0CcNynIQ87bwwUUu4iKN3nrgTowvyj0BFSpwssBE1j5h1bawr2JgKhzgyBBhUv0gCYIvPqbhEbpRFCkgznwihlkpEPxnd76B7O7qQc4r2C8QxrjAi9DKxOTlQKQxekDrgHYOv1So0Eov1NpE0eYPdWDGqqBRMzCAdWAoR3gkB5gBWZAB8aKQTrAA/ijg4dqgFP8B69zwwrrxgGYgbR6Gv36h//XqwMuMCvNmsAZaAB1xD7/aoB3PJQziMfz27kzoDGWhBq/2i1XYsgI4EcXWoPI+wBXEIZBsj86mAEwEII1UEghMLtTXADSkyhYgQDt6h0YGL+YopUOUCNAqMJBmIIPmMCz+kghlEV2/K9DGTRcmUoqpEJAYEmzBBO/kijeYYAFYEiWwRtQu0NEEIZhYgZTcAOR40cj+DEG+AejJLtbYz6B8TEYcMIxaAIP6hAuGASyHAPtibOsNLsh5MEg9C/lW61cbARebJOyNEs+Cxi1rLD/ubzLIz0BjDM8oMthCoZLlLqQwwGuI02HnMmQ67GpYT4YcD0u+JKai8o6GMspgADgYeSxqCkiB+xD/4IlQmuCk6TCSKhCK/RMPnNJdNxKzLu8/9qQD9iBTBgmYajEqGu8WotN0syuxsNBXPOCDxA41ZMCePkH39y5D/gHqaFPM4EnzbOpskvORdIuOTuy8kOyM+Cz8YO5y/mA7fGxrbw+BLApYfSAD5gBNxAoU7CjkNsQHltL6/M8sjvP/EqxFfuAQbjCHmi7Q5maQaNPRBNOWVnQdtxP/tSuAMs5QHi7nPsCGpM9J6wDzFHLC/kHrgS9EOIxN4gFZRjDTGCDqMsc7boptBPAW7vFHvACLniDgAAAIfkEBQcA/gAsAAAAAHEAcQAACP8A/QkcSLCgwYIkEipceGKEvxQjIEYcmALEQ4sXH/rLkSOFQIcpUjSM6NBhxxQ5HqJI2dEfiJMQc4yYSVJixBA4cx7cuXOhzxJAc4b86JCixo0CObI8KtBjjhAlRqQcCBLliRAaT5AIGcLFzJA0Q3ylOSInVp5oCfpcS6LhRpM5XhJEceKhR4JOIfoDqbFk1ZAnTqRMgQLlYJl7SZIVmwJnY8cl0ko+uBBoVLAgKhptWmLoXYhn9d79iLMpSn9ulXoEO6KhTJthy5o9O7m2wLUlFPrzORCF798oShT2LTyyZOHBiRfWODx4zqudQ1yd7ZiEwcgkjBPUjpbt9YHWKdv/Loi8/G9/xCPPbvyYeojG43dyv702bXjy98f/Fi7Qd3/0zplVwnvUARXSfPHxlJCCCW4n327+mJccCv1RGFyElgWVoWURQtWgQMYhaN+H44koHokkhpiWCSgiVNt8JqoFHlrYtbiijTh+mF9kLEboY44C9VhbfkAeFOOJICZoAlYnaCebPz2aENUJJjQJ1Ii3FUkjjkKCZx0IIND2EFYipPDDBhv8gKEILGp3ZE9aZvkmkTz12GR2G6VgggkiLPhDDEio4YchOvQJ5YZ7RvbmcUnOyCCKbxYWFw0g0ECDDlXoUEkqvCSTTDbblKOIEzFUYekPJLC4Z6I/frioi+N1/+moQSYUBsIPNMQQgx+uZGPNNuzcs88+99xDDz3fJDOMK4Ow8kcVHKFgQkJ8irDbq0XSOZB2Xd6nrZQlXGqIKKlsUw899QyrrrrsqFtPPexsw4sfVVhEbarWiahtjt5+h+RBbVYhSDHmprvuPgIVG+zB6LLzDS9q0JCDlCRY22qccPKEbUHTmqADMdvQM2yw9wjEjsMnC+sPw8fGK0oMu/GZUIyqWhcliPlu6490dQ3ZKI9JItimqiWIEEc2C9OD8jcOM/2NN96UTNC6DqfSgn9YEtljviKdIO2hM6naKIRZwtqjorRGqOqeOiTDjj9vE3RPsCifXNC63yQSRgaAnf8gUoaPGkRkcEARziHQsH6oqgoqbKAI01BDzXSxcC8s9UDrblNLEhu81HVgDs2sYo8qnLWnCMX59rdAIlAIYHkE9cyhkSzqpoLN1pqgAttc4OEGHWsIsYYbeJhivCvDeMN03ALh7UoeLXTkd1Q0cWTYpFVkYIEFEqwgAfctaGDBCuRbkEEGVVSxAQ0/nDQxCcSlyhObUrIJ5Z7WsalCEEHI4L8LQUgCFMDghjQY0A0IROAahucGRJhiGMn4hj9EtjJ0IcICEutaYiplqVxxbwUTcMALhlCEIZjwAi+4gApfwEIWOsABQ1hBDM5nKonZrFH5sk5CZLC7HjLuh7pTgQz/lLCFLnShDXe4QxwUEQgDOvGJTxSCEMxAh0wM4xvnOlY9eNEbjvwAV1UYH/km8AIWUIEJUMACFFjgAPJJ4I3nO98bt0dGFjKBCS/wXr08J5Ld8AY1QuRf/0wQBDKQgQhE4B8aDsEIRlCCE5wwhDmKAQUoGpANmMwkGw5Ih0mwIhkTpMc2BNG5uGSveyJ8wR2NwAMWuHIJPJgA+iilFKxIyXqV2kAGVqDKInQglhI4XwYDAx7jkICHSkBDG7pgSEp84hKMuAMSDwHJUliTEM9ohiWhqElNggEMdDDFN1yhCT+04HwWmMAdmTAEJmBhCUPgQRu9F4NSGiYFTwjB4qAk/wMocYQG2VuBA1zJAgxMYAUW2ID1PEKhBQkRDY1sJCdWMQta0GIVlyjEJazJUUyoohZggOJAuknSNCAwDTgoAgsmQAUouBQLPBjCC9S4BA5QYAKm6oh1UlACFSQmMn7zjc0qlpDdgUCXEpiAQQ+aUOsFpmcyOII/2uDIR66CFsC4xS1mwdGulsIQTATDQNzgD5MikCBpKKsmscAGLODgBkNwABRWyQMeGIEJPMACFowABZnKkFIuYJ0/fJo7Hi2oYyLY37QqEsbtITQDEnuqzQgZBao+shRYBYZmaTGLVXhWIJCMwxWo4I9vfpOsbiDgJCaBB+AtkA6wTW0aisBKFP8edAIsIN8KWrACf6ARCmd8wQuDqT5K5WmwPJrW7ZZLSBm4QFIu+CL7QPA1uvQUSkmkZimuqllkICOrs+isQCiRUUJggAchRYQrrMFe9mbjG8n6RSdYwYptPG0YpsCDB1qgqwyUkghPyAH7PMhLBxwUhWV8AQ+o4D0JlIpKuekYUKS3p4pw5F4o2F21djdYFXCVolrtrneBwVl/tGK8EjVEJALRB1e0Qx7vgHE7tmEub/xCGNl4bxaR5QokvMRzKnCB/4JgAuvlIAYW4K32uDdQDLQRDr0N5gzjmAFdba/KHeTIUwPjv9v578vf9a6YxbwMzoZXIKXgBCUowQhCvIL/GIiwRjviIQ8Yv6Mc2ajHNlghjGEw4xsiE9k+vlEJHbTPBF9OtApCcr2NnKBS2TPfLnUbQgPfdgIhLONB/eHfE7jg00L8sk8HIgNnmPrUY0aGP87MUTWzeRGhiIec6VzndrxjHcmYhzf8UY5qCGMegibWN2oRhx/0NNGi3tOn/aY7EjCuyEb+Z6Tf+EZ/dA/TE4AjDfSkO2Qb5NTgFvNmw2tNTvgjooUQhTzWYQ2BtIPd1lhHNvzhDWH84sbeONawlLYNUdAA0chONJW0UgIZHJN+qdJdwfWklIX+AExf/GJcXNDtL/ujn98Gt6kFIu5bXLQUjCjEHfjACDnAos7v/3C3Ncph63ZUw1PVyMYvkuGNekyQHcMABBJ2E/Ced1mIIkhswUXw5RwEvH8y4F/S+ydI/9kmGv5wxkBSbVGuZvQQ5yaEMWIsD3+gvB0tr4Y/slGOX/AiG/hNxjaGsYcx6CAHQry4z3v+QyHGXe6iTvrSmZ70IxxBkEGQjGZJTHh/eNfU3+VsKTIqkEMsQht17rqdy2GNZpSjHOug/Mopn19EYMEDPrBAvSjuDxcQwQU5kO7DU4D0vPcz0f5guiARHfiBCNLvUg28IGOv+9p71pqfKMUsgAFuzVZ08dBscysgL/nIvwPsL0b588thDk0UYZ14xHT60qe97pXPfKYCwf/+MC53pZuff7FP/9/Rj3t/SJUgtQ/8+w9Bf0dyghZR1wbigRFejLp6EbDgdQMRD/HgD3T2DjGGgAn4fHlwA9jHBBTQQhLIAsI1UC40AaL3A0/QXICXFlLVfrgXgiI4gm2gB4z0SMSnDSroDMhQdatQbuQVCc+QcgQoD3QWD89QDM9gDuZAa/HQDp1QBEuAfUPggA/IBGe0TvAEByxAAeRTT+wXe7kXBH43ECMYgkqgBP6QhVu4hUeghe7nfofABydYCgKxgixoUS/IUeQlCcXwg3NGgHRmDtCwgzyIcq6QUkO4TjdwfUeIRuwEBZpQC83AC7wAB3iUUF9EBCFohX//J4JduIVZOImUyIWVOIYkRwmroGr6l4adtQqckGacwAiHQAiGQIjQYIACIYcEGA505g/m0AdCuId35Ie+dUdL0FJGsARYUAvTwAvNUHnNwAY2dVAOlkgjCEAC8YVaaImV+IzPiAbKdAiaKHVRhwy34A+f5Q+QxAh8wAd3IAeVEGMEwYrkUIPyUA5sQFtzNQS+dYv+4FJQsARLAAVGkAfPEA+pYIfEYA5ecANDiAV4FAM/AECJRIXvNxDOOIkHoYVaoAVRoAQPuQVbgAYmyAnAwHHaaIaQxGakqAdt0AZkYAfGMBDkYIAEOBBc9wxYUAQuxQQCQUIwKRC4CAX+gAXF/+AOzwCLO/kMz8AGvwWILyBL6WNoGphIlQiRD7mUDxkFTNmUUFmRFYkGfMAJt/CCa5aVH9kG0mhEXSAGkuAOked1MmZrKScPz0AF9TgQfTWTQ+hbS2AEOBAI5iAPvGAOzVALOxmPdxSPcMlCGnCBDpYmRKCUWiAQTmmYSukPS5mY/oAGXUCR0mhZIQeSd6AHmLlMkFlEkUkGchAOKOd1t2YNxNAM0GAO/hAINwCXNGlCMwmTNnkDYNBieWmA7dAMQdiXNtmXAmEE/uCOd8RCGBgDNCAGh0QEjLkFBgGG/uCU/lCRhhQFZNAF0qhMXWlEXBmZFCkQReSZbwhjz7ALov8QB+SZBHHgB0zAAQA5k761mq/pUv5wA28QCJvEBoiQCpoABTbgkgKxBDQJj7yJfcKpAVWggWLgD9O5BVDplEZEBgjqmRF3lFEwoVGABhSpnRZKEF4pBnZACqEgCXGgA3JgSGSQRHbgABcAnAJhk7a4TvPYh2wQUnnQBy1ZBEXgD/RIEK+5TjTZl0zAAr8Jk8GkAzEgoiRKBmIgBlagK0nQAtqHJutDA0+ASEQQBRRZkY+JBgOhpRSJpEmapCFpnUckBjFQARdQQnMFBTf6nz5KjzeQUnkQp/U4j0wwpwOxozzKm2pkj3gkgQamARqwAhqAARQgAAmQAByQqFUwQ+n/swE1JKVPYEQCUZ1d4A9GxJlasAUkqkxcOZltIAei5QTv2KM+Cpv0GJc2OqfzeKr+2ao6eoR8maYvyU43cAMJQAE3QAG6mqi8qqjodGVxZGgjGqbXWanTyUzISgZIBJkhiUThaAdxUAYYoEqr+apF2IdDsItDsIetagQ2Oos3Wqf+CZMPmEajyqo2WqvfaqOJWqu1OkPbE6/xWmUiKk1oYEhTeqReaURa2qwhiZmWKQdykASBSQHwaEL+yau1uq30qKI2SkLtRIu4eIvkCo/zuKpLkKolZEImVATqakKRtj3howGY1gIWEAdWYAWqF3FP8ASG5JXKpAf+ILMlWIIA/+usA5ui64SwS3ADC/CzP6ue6wqc7NROvEmPeUquuPhb9XiqRcuxvwm1TECk8QqomGZp4qM9NLQ+R+myXjmzABu2evCN3zi2bUAISKBKfXmqRQC0CvC2QKuecNWwdUquGeuf7+ia2MeqSEuPsxiTv/mb/nkH0BoHFjCoGFABiqu4FYiB6lOgLvuyRzSzZFu530h/9FcIfEAIccACO9tOJHQDvLoAAfC2CrAAcmujpIqjRuCtS/ACFLu0uNi0LpWxrHmn67QIi0AInFsDg7q4AmAALZRt/lWgxmlIyuQPl4u5zNu89LcIknAFdlS0tPqmD3CoiWoD2isEOJAGeIAHk/9QQGpkWmBwfSSEtHdEp+mLRr7puv7ZTrc4V2b4CZggCXaABL9rAAKwvwIwlFJmpCXaBspLhvUXUQZ8wIdQCNCbtkQYuquJAwKxBnTwCJmQCaYADtkADuDADMJAX6ZQwZbwCGIlEORbvkVgwkM4j7PItxPbCi7cCvUrCEgwrfy7vwZAvEUqBkl0B43HSAdcVY2UlR5JipdACNKrShzrsTcgBGAAvqhgCrEQDN3QDfmQD/pwxVh8xeNwDt0QC6vlDxWcCav1CJPwCHOwAH7ouv85hGw8BOEVXjAsCWpQAxigvzXsAOajA1YgB0lUCAUcxEIcyEJswJeACX5wRh2rxGb/8AioEAuOHAvH0A3ncA5VzA/8UMWYjMnqoA7goA75cA7XIMnnMA7jgAg24JtDgAO+SY+1y7e3kFX81wpyjL8sYMf76wDnpAN2QAh3UAgCEVGC/EiPBEnEHMicQL9lAKQDsZqPYAnOXMGygAvHcA2UnA/2YA+XnA/ZjMn60A/WnA5cbA/5MA7CgAcj3Jtx+U32yMr0OHi0EMdqMMMVoL8GoL8vID4xsMuFsM/+IMQdmZVqRswCXU3V9Amf0Lkd6w9FkAnO3NCnEM2RLA7ncM2ZjMninA6efM1cLNHKIMLwVAQ4QAWagAh9kAam1bT1qFWcVb+GoAYaMM8dUKjBawAa/1AD5sm7i4B1/RzMazbQxCyKohiKnyAIQFqEbGAKqNDQlnAKD40L1CAOEp0O/lDRFH0O6WAP6QDO1KAMwTAHYNCORrADRtAJrlDW/oAI61gEPJCxnNUKnyAJLU3H83y9CTDTE9AC5rnLhLAIl9CRrsbTw0zMa+hVreAHKSqfrJDUlgAJkLDUqIALwUANUywO6CDRk3zZmH3V4iANpjAHQmCjdwQGa5AJ9FXarNAJiEDSbVUKcWwHSVADimsAhzrbdY0BGoAE5mkFhCAHussIf+2R0LTPGjXM1uRZxm3cuhAKTnABiK3YjN3Yp4AKjy0N13AN1GDd100NzCDZUzzF1f8tC3MABArAASUk2pPADBssDMbDCh9sCqiNB59ACNCaBDP8ArJNAAWA3wRAAALAAjVtnuRpBwLO27xb4AW+CArc16G4Xcdt3LPgwobQhEXwCKYQwo9w4c3szKgQzZAdDB4eC7gQ4hvuD7JQ4qjwCAiAAG/LAaL9CNWgD+AwDswQDLFgPGE8CWkg33FA3y+tvwmA3/m93wlQAf9NniibslZAnkmO5FZgB7p7CVC+4J4VXmbWWaz9CZXAAgkgBBl+4RM8wc9sCRUs3ajA0M4MCY8ACXNgxuF9AAdgumYwB8EADtZ8DszAwTSe1GXsBvONBC2QuPNM2wlwvQZA5Da94+b/mQRJkOTk6Q8oC61ODuV9bU2t4FkWdenk5tbR+6ZcbuGP8OWw9ekYPgekXupmcOqnDgRAcAD+8Lb+YANmYAndMA76AM7ccOd3TuMX7gY7jgS+OwGLW+jzrEKKa9s2rejInuyK7ugCTgiSvlGs3QpvfOm0sFVcZdCVUAaJyuWZQMaTAFvgDu5rTuppjuYXPgdmgAAC8eYIcABAYAaxMOsCQQ0hjuvUEAyoQAdpoOi+XgPhg2mBCqgCD6g1UAO4ze/9bvD+oOhxIOCYgAkG/QmtwNqrtmrV/soex1VuXb9I8AA2IASTYMHd/uniHupKHd1kbgYCkeJujgBAwMjSHOJM/y0LynDnXG0Kj5AGZeDvLVDwBI8ESFAGQg/0RF/wBm/0Rq8B/hD0amAHhiAJEC/xJubCb/zK32V8D06/cJ0FEfDxk/DBZRzudLDmllDiwXAMyqDdysAKQpDibg8EA5EJqMDUznwK0uzheT4JbODvAm/wTK8GgJ8EakDfQO/zA48Btq0BTmDwamAIji8JUE8KpODCulD5upBqWfXOWi8JkfAFDwAE3P7tYt/MGx7Z/jDr3cAMqIAD2msDqj4Hcp/UGJ7mIazUITwHN4D4iH/bZTAolfD7hlAJLR3PPq/7xo8BPuAEvO/7lSAJoSD5raALsxAN0RBuI2ZiWh/8ghAGrv8vPAgE7r8T8hs+zd0gDlNMDY+AA6wP65AQxbFw4uh+6qSO6qmu6gtQAQTlBL0vCKIAEKEEhqpUyY8aJDU0YMDAoiELFj4k+tBQI0sZNX4i+fMXipQuXcuiRdMWzZmzaMiQ+dPVipQkQ5EMCRKUhgEQIULc7HRDh84kVLJwHaPWzWg3S3Nw4LBhBpU0asFwWYJkxkZOGzaA2GCAwOtXAxUq+MiiURQpWLlgwSJVKZKfMjWc+HBYIWJEH06cZOFbpozGSh5zhRyJTVvJkctAtmpFMJKajGoCeYnA4CoOMGvW/AyKC5c0bkaDzQHDlA4qZei4HbOV1IyQrEC+IgAAYLb/gQtjs0QKldaXL5C5CBrMMpeF3Yh7+S6/+Ldg72XRSYY7XFKx2pduIUP2o0gRZQYRImDGMymTLKFDqYlT1ifzmkfBmI27hsvWKUhzrC5QgODA/wNqs82r3MjyQ5RcjIlOpOhCEcUtJPSCyAcplFvujDPqqOMPQSoR5RUFl8Fmuuqi08UXWAgyZDuNIvHEE1E28UA8zMwzBT3PcKGGmVjmWGOOSYTphplgZLHkkUf0A2IBrwD8bzbLOuiAhS8O9AUabLLU0hdVHixDLynClCIMODLUUMM//vCjEVFU8SW6LKfDZplppkGRFMe261Ag36bZpAgObgADj0xiwdGzYIJ5/8SMR1BhhpmoTkGSjjWEAIIB/hSwDcD+DkBgqw54aOKMPzyBxZc6tcTGmFccbKSOMPRyIgx/stjjzEDS/EMRRz70RcFpRtQmS2N8UcsgNTDaziN/fk11GlW8MGLQ8w4Vqsc5MmGmm2NkOeVIH62yQQFyaasNgf5kQ0ArKT+Qoo5GVNnFmGCznMaYXWBRZRRH/sgjCzi++CIPDXNNU5FGGoHxlQQVVHUZX14RZaPl1OyQlARFDCcccjqu5Y003Gg0FkNJRiWpOUwp8luqFjUDCHX76w/dT2GGWQgzpJwBhi8U8WSUeYOt085cdumykUD2yEPgWw1G2BF/NoFR3lx++/+12F1eAeVV5uoQRJS06MWG447LNmaTPuh4pFBD/bGEjjkemcTtI/Mz4+6Xt1ogK74txduMOeaQsoMZethDYXnFrtOYYiWO5I8z8sjDnw0bcVGUNlXpchTNX9F8X08SVqSOLyQKI4tdPWE42I3JccedsjsOpxb31jYUFUgofcSfwANf424ggIf57x+RND4/SDrwwIOdexhkE1BqKcaYZ6CBhnFWRfFEEcm/qNwTVV7ZZfzxJcZce0f6FTgLgb8Ig4sMFRnlFV+ewabs1+GBvex43nnGlfKgAhWZeIRP/OEyM2gmb397hCUs8S1/nOIUAkSFBKniAeUxrwnw2oS8djH/vWcUwxfFkNj29nCr1MlLhCI0Vtb29bg6ZCEMYwrDFzB0hp5tYn65wBLZXOcO/e2PHPGIhzzKwQtTGIqAPoFbpfimleAB7jTHSFSicuSZCn5rBsubwQw2mDDVSc8Y0ChGGT0Hik0oYhCDUEQHdzGNjWHjesZyXCP+kAUx1bAO3vFOJECRuHqRDYiv80fszLGOaghDGMGIxcn8QQfhecVmwYubLI5xSWpkkhqXzJEET9HFLsJACnkIhM/Ct4tnGKOMLhxFGtfoCFDMi2PhwIY/GJc1UdixDmL6wsES1ghH/Ex8Yhtbx2AHD3LAgyPkCIc5mlGNKjbySHnzz1eGFzdU/wSDGv44ilGoIQ1O3ueToBRVGAimsPmVsRjkGwUoHKGIPzzvFcWYhuywcS9fGC10u2xCE8IAr0b445cKi0Q66RXIjW2MI+EI4S46kQlTRDQTk3jEGtRFG2veLVux0GY3uHkUblzjm8ewzymosMUZlFOPjtjEJkCUT6NtLZ7x9MQH4RhHW2Zte1+QQhM64K4/JMwfo6vDHuLZCB12bnxF20UtavGKVoYBC1PFQhqsmgYjMOUrTvpUUxqVqKIYRRznOIc4uiFSkt4nDw94wA6M4IUwhGEMGUpYMMGniu0lzR97GIQqigGNm9oLX6P4wxd64AEIsHUGYTDqINwnhR70oP8JNDzhHgKxxkGcqQ55kAIoZ7AD0O5gKZUxl5M8dZU1WAKs3RgrWclq1pHiQhab4MEDcGAEKsQ1rl8Yg8AwO4g9NCGyPQiDI+YFWC2xShVbk8LyHlAA6D5AlO6LqxRg0MUOSJaGkpuc0vIwwyZ49rOhjUADugKAAJl2K4CzBEeZIQ5wgGMcrj3rJj2zC00sZQei6ulwhSsFLgR4Ctf1AAzGMIpiVM96jFOFIwLxBS544LnQja4odRum6+pMu3GVXGX9Qd2B5aEJRhjvDiKwgAAEwD/o5WpW7oYkSJxiR/OlbyapuM5ALKUIofQsDGAw3OtCwANNcIT0EowvqA4iDD3/mEFiKUxh6dJwhj3I8Aw68ON+xrW3GGoarzYxVO5Jq7wo9kptTPukreQkeJCwhD8cxdpuaDIY0GhGLXKMgwcIeXmITayE2RqBAsBgEJ546r7QqMYvwAAC4nlyASLAvB5MgQuQpTIofRxZ4f5YCgI7wx5M2dSm1iIVitgDZZhkZhaf+UkMyMka3HDARl0yGFQ8hvWeUQsq4EA8EYBAr9naaOg6D3pp3MMYxjBlCT85Ag9gHgz8gWkqE45wPvbnCeswBsjCAH5/GEUuVviMENaCF5sIBAxwwAD0pvo/AhLQARgQ2pBlZm0U5Kg5zDGNZyjCAwyg8LIfEIEBBFzgESDu//u88Gwfw0DCgPZ3r3eW8OFyxMqhLPhl1xiIMMCgCVNwhDESSkt812IUnhjEG0zMbnWnGgABcDcDXN4kBJihJ4Rihb1pWQssuHwABWDrvwMeAIEPYM/M80cX/QzoPEPgx1R+9hal5A8pYVBKP57CGDYECECokbNN2AOC71knOot8E4PIwwwegG6UBwjla2e3p9a1g0x8PRyjkAIDAh6eXTdgAClO8QAaIJ5m+wOxz2240iXbA38MOOrL6/Xyrox4KfA164rQhCY6gYg+7CEVxIAGuEP4ilQgrQmiZUCKd31etqd+QF+xHhkbUXaAB4ABfy/v3vnud/FAwOgL93eeL/89hQ/vQfHK67WeLy3ZLwwi653QBC94cXkv5GETuyBGM4hBDLxyT+Hi+XtoR1t61aM84E1yqicCsfUZ/HwA/vi7P34eAPYvW8jzX7a/PYD4HnDhwxr6gk8Hz3MIeDxJ4wIbOoNBYL5qyIZkYAUvwIJASAVVcCpRU4TJ8KyhIy/xMJfwWzkV8wqMEy7JCi/bA7oGKEG9wz3m2aI9gwB/4DlmizQuGINbGYQ/AIQ6ELxeozAhi7Qx8IfM2qxA6ARXSMBs+IVEcAMH7IRUkBpNKLVQegMvIDDv0zXS2sC+GwAU+zNmyy4YADh/ALqgGwC2KjAqU7gtYit/YEFJExgNUT7/rAsEHPw36Hq0JrA6rAME4HoDROgEIqwGVsCDHYACPAgEQgyD0dsBLxKx6wqtIigNXesKDUQ5BPC7AiAAAhCy8iqA4qMyD1g/APhCgWsApZO0TPMxsxvDJvAerGuEO8TDPUjDX3O0AuiAVBwEfwCEhCm5PuDDbMiGaviFTACDHQCDNMACEsMBIduZzvIs0HLEl2M3vgO6CPCHnusALPCCgKPGPMuuGYiAABAQ+GsA35O0bDNFAIy0OgAERwCmdcS6QRiwPJsw6KJFAxSo9LE8REAEU6gGfqwGU3ADHPCH0PqzR0PELkLE0BKtygC/2vjGFPOHZVPBDuCCfNw7F/S9/xlJsZULOHH0okkrQx+DAE38sTHARUeIhPRpxz3ogQ4ovnjMsx6oAzZCqlRIBV5whYkyBWEYB3BghT4QgqX4t97zAIM0goQULV0zrzK7QmZrNuWZgj3ohE5IsQLgCKssANvjwJ2DABgcMFP0gAYogCE7nBcZhZFDSVacgg8oPrYcQykopUbQhE1whV/4BWHAPFOYD2aYBDOAyF1jq9CaASMgsYQcLfPqCruDSC8yNi7ogQ/4gOSby4BzQWqkMIbkyAiAgSmYApD0AKwsgBnggkHwI84xS1BAyTNgyaHjM1+DAb7iI0USBn90gz4whXGohkwIyF0TD4EEpaMULdtKyv/Z87fCGYRGGIQx4MzIEk1X2LnoSiyGQ7vbawB/cLaEQyzouj/v8SPMAQVRAAVPAAQu+ADGGzqX9AAusCxSUiRwSKRMwIM+mARE8IIbyLtpTMGDTMjdBLxmWx7J8g7kJMDGzK49yDMXXLawHABoBMMH6CKo2yLo0j2+agRQAIVR+E7McYRBOCzE6tAOdUnXBK5N+IV+FAZAPMgt2rWqZLYZKLodaKsd4L1dWx7N5C3tYsVrU8Xx/IDDUh7CK68G+MYFDQBxLE9AE8spMM5gAs9IaNJIAIQxIM/547MPHcN/aoRU+AVr8MVYwAMvGK+800HdE7yeWzgTlD/NNMBBOIP/MWkEQTiDGqIJQGBJFoysoysvIV3QnbtPkQy2L1BHJ/UEt8DD5CRPD9Wz+Ss+rsNSYfBFZsiERAgENlDIyniyPBO8wWurRSvBAmi//EtHPJyCMBCEPwgDHzgDQWjSL1hLCGgC/esAoQzSPOVAoIOuNDxSD5iCMwBUJ3UE0tlMQ11BD2VN5kk+RSDRRJLPyaDCnjvSFfWAouuzpJzDB3g20azBP5iVN/WBKeCQJv0DKe0BCIMBOdy7tes7YHuA/MuQQTjJJtXQLwBWqAtAKg3Aliw+D2CsPSBRYcgEOthDyuDPGUkAam22xOo5KCs6dAQEP/CDzVSDLNhMVG1SOP2AAoAAACH5BAUHAP4ALAAAAABxAHEAAAj/AP0JHEiwoMGCJVSoKJEDRIoUI0aA8DcRhEQQIHJQzNEw40SNFCemyPHw4UCTKfyV9JcDhUCSMAWWOAFyBMEROWwKPFGihD8SPQ8KFRri4YiSJXMqbaiSY0eMGEP+qBh1JMyRL5EibanS34mdXgWa9BfRX4icZnWG9epzqFuCRTm6LBGihNaHDVOckEgxBdSQFf2SZOl0ZMq7XFWOTWlTrc4QZiGTJWtTMokQJN5qRtgzRYkRJ/SmVGnTr8kcoQe79Ffio2F/KDTePY0CqUqHXRUfbWw2MmTJm4MLpRkxRIgRxovWTrGc5sPQWhU/XH63tvXDtRVfP5mZddCeQEsA//XO+mB385tHFkdu8PzAusJHUi+JIvtol7brB/Xes79/8Wa1JRx6BRGHXAhfCWXCUO7JNNB89UWIHXOrHXYYZjL51F94+wEF3ICafUjQgsIJSNB4sNm1XIT4rTjag22RIKOMGP4kUHcygujPgj5lJt5CA9G0HGg6DuhfispRGOF+Req4II8mlEAij+5peGKTCBHUX4IloNAldMwN1CCWNh5kYnk7ChSlg/zNJWZBJAZ3ZpA8nVAffSzOSWZmOJaJppQLrgbofm0d6SeZQvV0Ak8S1pagUGMKF+lBKIDW5aUOzsTnjTN2OimIj5LoE0+e6QmpWwLGaZBCJqggUwpQmv8gwo4L5tipCXzO6GeVChL0lU889sdWqTp+WmJ/L2ZmApUoRCmjeOAF5emtxmbZ3kyLMjqUqpqZWm2nKdCggyEsPSSlCHrNuOF4PnZ6aLEZMsftQPOieuOAM4b2QxWOZPMNImeUkUQMVfzQUmd1iVcfCSKYEBF7aULL2lfLIjpgqD6++1ZmKVWhBi/f0EMPO9984002w7iySSAWxEADSTIuS8KyM3k2c3nhwWnxZoWSmLGp5tmlgyfb1LPPPkLRM08vg/yRBRIxbEADDVPlkBCfuKpQsZo7d4vmQExaOeKT1/4gyjr0DHS0PyLTs889SItMcjLJ1DKKJy3E8EMKOf7/RILWW3O7aZl97ur3pD0b1KPEm1ZcMYAq0aDJNm4L9PY994jsD+aYp902PfVso0kSNOAqwozLAj5lmgye6Onhtt7LppRfl8e4jY7jGicNglAOt0DDBO/NMKyYMszRyBNEjzd9JOFCDjEvq/uysyrLo0H1sjmtu7K/JTa9Tz7pEwhJEPN5yexo3os37LCD/O8FffMLEi/zTX3MMXO6KY78b9/3/6/TEP9sR8C+5Q5KNIhE+zJ3D3Zkjh4mC5nbkJe8gtBjG5GoAggwQy3/efCD0xIPAB2UvWjlama4olWUaJCKknljeC/0Rsnq8bm2URB57aObJyzwAxQ0zAQc5JAI/1EnvU7xpC486Y+Xhoi/HAEohW/qDq6AgkJ3dUoEIqjCH/qQBjAIwYtfdAMiXBE8VgxDhum74T68wQULtIwGfIuWokRIR09NkQShsY4el2SXE1ARPFUkItjUZMeZzUwFIgCcDIJAAxYUIQ1pYAMk2eAPSoIBB0IQAgKEgIdMDEOCyKuHJqqQFxDwpInPoqId74jHnkRpiv/B4wmcRSMO3vGOMjHBKRmmENX9rVUmCAIa5OCDQHARkpVkAyUpWUl/gOGZa6ADK9gnsnpkAwkw8wypHhYRJoLQXSrCn81IwBGMbGBvQVSlrvzhglb97QhRCEIQiECGepKBnmjQAyEEYf+OWhgBkmkQiDIHOhCApsENdOhFBLehCg1Cz4jdBCHsDne4nlBnXzFwowQsMAELwEw8ugNkjxIppTbwoQ1duAMlStGKUjCiEHe4AyEi0U8wAJSZOB2oTi3ZBzf0oRObuMIPgKI7EpTEOdkyIXik9xNdPoQGG5BaRiWwAge84AVDGMIFXtDRH+zSBCiYkUta5Q+tyUALh2CEWjlRilnQwh+ruMQiLkGIRhBDE1BAZiQBmsy9RlKnWLiBAnDgAAvQ4EdQiWoMFluFqWUkeiKYCbQYAtUqSGACVrVqVpcABSYwwQETWEEGaMASFLKqNlKKmQrkeYQtHIISjFgpLYAhEFr/rKIU/sCEBjQBByxA0g1gcANw6SDc4tKBDmuwqSSxMIQiFOEFK5BABvxRhalOALMYyOx1DUuDjDgFBD+gQRX8gdmrMoGzkMQCE1gQWguckyN6kQFoyJpIV2HRVf4gQhCi0IXYsnUWtEUGMG7h1rgiwQk3MIJNA4qITnQiE64QhinogAc6TIIOmTAFHhAKBhtgsghDoAAFbkCBBXDgBs6FAhagwOIlMOEFoG1ZBixAVau+gAVUoAIWdrzjF3e0YC44QTtlxJPUKWQg+B0ITO9QiP/OFhjIEPAtbLsKThDiBTcAAyI04Y92vEMe7chG0b4hDFYIwxrJaB87hscKN+AA/wcwtuoFnPtmDtjAw3W+QYtvcAMOZDWrRdjxX9kAhSLc4AUSiEFGtCZPFZATmAqRgQySzK1ZrOLStLgFbTctYFrMYhb+4AQl1NCIPiCCF/L4MpjLkY161CMZiWBFNbLhDRtC8Bu8oJ94OYpZG79AxAIINoyvetXMmpfFWFBmYDlAgRXo7aGSDsKkVSBpSa+qIMCAcpSjPBBuC6QV/igFJz7xCmKwwhz+kEeq37GOVltTGOVgRjK+gbm1gS4VcchBEBydgvCKtwpV2EDAAy41qEZ1alOLQQaua14dp6GzFEC0y9jZTmpbezPIeAstPG1pcWNiF/EgRjsEAuZ1+KPd9f8YhimsYeZ6ZG5t3/BEHHpIbUBljVa2YpUJZOAPSZeA5yX4QXgzcNmr4pgJPNBqRzOgtxRcXDjOcIY/oi71gdAW1LelhCRyEY91rCPV5aiGNdoR5m8M4xGm+EUs5jHBNfYhAyDYd7VvHpxqL1KeAgkCeDdA4xVctwIVAK0EJLABp9tdM1RPfNW9PeWsG+IZ7/jyO7o8coGwXBiTqMYvfpEMGu5jeYpQtAtIIG27m/70Ze0UfpMcbUerIAf+hirVMrJzu5ee59a+eJSdsXttbzvKtM06JrChaoG8ox1e9/rmf6H5dSSj1cMbRieckAFSWvz02J+7q/AukNzjXiBHOML/QIJAEHmSn/wFEX/eBZLtW0wZ1L6feqctfYlWkEPd8jD+O8phDWt4vcvlUA5e5wrV0AfJtQMk1lF6g3ACB3BS01hDRQIuYH6313PZZxDnh3cUuIEcaH63xQmcIBBtBQxRJ3/IsHGrsAjAYA74l3/p5g+Th3/Hl2r+UAtvZgRLUARGgAM3sAARR2xAaFUUIABc9UZEcATmF224R348x33+0IHnF37+IIXid35PSBBMllayJXXaYIIFtgi+wILq5g/xEA/qFnnpFnmp1g7xwAtgsANg4A9DYASGllVQsARL4A9LgIN4WAQ4gAeIkAqaEHE8FARIaH7q94QbqIjoN4Xg/xd+kBiJVBiJetAG/qCFpUCC2qANUTd/q/AJlQB56uYOZphqzTB2Lahu5YAIcGgE/qCDNzAE/nCHLWYEPMADdAgHo8ALvNAMbVgEBKCABfMDT/AE7NSIjzgQkziFksiM4peIA6EHh3AI/hBbpZBxm9iJHFcKpfAJtWAO0GAOZViK7yCGLfgOnYADYFAEeKiHsehiswiPs3gDmvAMvYhu8jANReBnTCCHGnBdE6ABLaM3xfgE+kUQVOiI0FgQStCQ/tCQesAHERlbq+AP2ch7jXdbpXAJhlAMzcCGLphuLTgQ5cAG69hi7jgELHaHnKWHRqAIzZAKzxAPzUAMIcdiKv+pADfABEPQj1l1VSugAStgARmgAz9ABAZJfg25lEzZlEwZBUrgD2jQBVTJB4ywCol3gpb2gSBYCKHgDupmhuNYhiKpbtbwTOwoEIW2WXkIjznoBc/wDDZpDs0gEHDAk32mkwMBBXroWT0JhBMgXXpDBP4QBQ+pBFGgBQMRlUKhBVvgD1TpD3pACbTAe8CgkdwIgmrFB1Zgji74mS14llBgBCgZi/HYYktwAzjwBjU5k/FgDqlAh0PQgwqAADuplgLRjuclh0swBC/wYhrAdFQjBv6gmI9ZnIk5EFpgmP6wBc7ZBWhQT4dQCrbFCZegVth5UmiABj+QC2CJfwKBfOv/0A7q1g68UARggIcsBmKy2I96yGI44AV58AZjVAu1kAd6BgW0qQALkJ98aRB5yJd3eF6+yVV5Y5Q/YE8KWk8CQZVd4JzP2QV6wAiiVgiVqAcYqp1TSQaEUIrkyW7WUAupUAvEUAuB4IfquZ7s6FkD0YdFkAfJhgdw8AYoJhALoAA6iWJDwFl5qId6mId8OIujGY88QGzXpQEaIAFC2QJMyqRuZAFIsAUPOpVdQAZU2QZtsJ0OOqWQSQZWUAzmYA7PUAuVYAg6EAdWkKZXQAHOxaN3CGIsGo87OpscEGhvQEnNtY8mdmKbhZu5mYcg1puy2JJCel4u9mJZRQEhNmKM/0pikAmdaIBSXYCl21mpltigkOkPYmAFkmAIdmAFYhCZ23kHVmBeTNBZhXYDeeie7dijzhWLnQWoKOZcsoibp6qWLoqHbali/1moBJpVKMZnwspnUomlxnqs24mlDdoFBsGg/pCllfqscqABBNABdMhZRqCqh9qqqNmb/sCTLtaOf9qTuemewlqrP7qbnTWLA4GDzeUPfMYBHCAQ8iqvGNoGGRqREnms+Iqs0AmtkRqplyoQZCAHNVABKTaaehauurqSK+lZENuP/ZiH5IqHsghoK9qjA+GeuMlievhnwlqvIssBEpmhsQVbJSuR2VmJ0Jql/PqsMKsHdyAHSXAF5v81mzuqqzrLlzobsX4psQLBohg7sb1aECzWjwLqD3QYsvLKnzeKo4eAr3yghZpZCK8FgprJslh6r8b6rF1riW1QsHFgsxegrRarq+y6h0sABp3ll72Jtiy6m5u1m0HLsUfbthPrXK/YZxzgtDiKo4xwCNJIoaVwaZlZuJrJByV7ofeqB5IpmSzbuDLbBlagAReAg+66o4Yaq0WwkurJo+yIt4BmBKS5rm8Ltx77itnqXEUgEIZWr0+Lo5yAnZywCpnmfh0naoGruBjau74Lub4bvIrLB4SgAS9wrUPAA23Jo5z1TIX2TGz7TG6ABw8Hsc+0l6/Yum+mjtC7vQnmqvD/yrccELsKIIK2q2nANwuzO41TO7wpi6HAq6+96768qwdyMAEv8LbK66ZGcKrQKxBz4A9zYArgMA7jUGamYAqTsMAM7A+ZYAkQDMEPbAmZkAmTIAQH4GeAFr7iuwCxuwpudQvIkJWtcAmFcMK8S7+KKxAq3MIpXAhJgL9Ztb8/KhBgsAZzAAmPYAn+EAvHcA750A/+oA/+kA3+AA7gkA9KfA7pkA75YA/pcA3oQA3SUMXKEAsYrAAn9qrDKrJ/K8LIEA2beJG34FLTeAjt68JqrMIyuwh2YLwVcIvqaWgJsABmYAm4wA3UsMfUcA76kA/6QMT+oMRDHMgCkQ7+AMXc/3AN11DF0tDIsgAEBxAAAYAAezqy9fq3I+wMm0gOY8x7swBbanXGZ9zCWmusemBPcrDKcmAHcRDDF4CLRkCn44sAwiAOTXwO3NANgPzH/UDE/aDEvUzEiGwP/oAOjezI0kANwTAJB3AAABDNAKDFmJzJChB1nawNnsyJyFDGIEgJaTXK7MuyZCAGYsDKQpemSWAB63wFNWABNXAFLeAAFFDHOLqnRuAGzHAO/NwN/PzHgdzLwxzIBD3Ix5zM0nAMx9DMCPDMDl0EgeAPiqAJipAHXuAFRiCvB3DN2UwO22yZHSdulCDK7HsH5pzOVqADKr1YbtQCGsACxFYBBkABBv9AAJT8tyaGA3Swz+cgDt1gD/agD+MgzAFN0EYd0P6gx1RcxcFwCpIMzRuNAG8QCJqwCalw1byYCg6WBxzAydl8kQL2aZdWZbr7UjAlB+Gl0jqgcBbg0gGJAQZgAAmQAARA1wVg05QcAH/Ln2sQC8HQDT6dDvwMxAN91EedDnq8zMuMChh8AJbswQvwBn2QB3nQCZpw1cSQ2bzoCticjZzYiQIGDCiokZdQ2oWwCKucpmm61utsAf/4AnE91wQw2wUwAHl903qtAEKQCbIQDMcA2IOtxIY93PkQxY9cxbgwB89smzyIAwtgBH0Q3dEdCJ3AC/bJC6ngCtpGdZv8e6H/TWAs1Y2mfcIzu8o/kKYxsM41oAFwLdeyXdu2fdN7fQBr8AiZEAuxsMz+nA/qINCFTdD5cA6OTMXK7Q85amg4cGc2hQfS7WCuwIu8wApuNQuaNmAVHtrf/X6FK26lfZ0nfNat/MpIgAQvHdt2vQDxvdcKEACObQYBjAqygAvSsN+AXOPDHcgC7siP8MwLwIOG5kzH9UxpEN0O1gms8OC88AuX8AmtINbup2lQ/uRS7mmG+82wdcKLQAiEIAf+UAZIkAU+4AMdYAAPMNdmTgALcNssjgARAARmQAencArBQA3iQNj60N///cfccAwJjQo2oJN06IcuvsOW8AhrgAd4/zAJP8UKjO4KrqDklHAJ3Fi4n3a7Uj7lW3lpVVsIWr7l/hAHavDlPsACMm0AHQABCdABsk0AA+DBAQAAAcAAQAAEOWwJtnAM1ADYdV7jeS4OfI4LdzarqikEj4AKp2AJcW4JDJwJDu4KmqAJnUC1lF7pU5ZpG+d+t5vpVbYI3J7lIW4FSYAENVADGIABgAd4F2AApR7X9ZwAtg0ACMAANkDrkGAJMX4NwG0P59DfAN7L4hAMskAHPo6ea0DsEPwIp2ALAoEKFGwKR/7sjq4JmFi4147t117xuDvWG9ntWu7KSRDu487eLMACGOAEWeAEJo/yPlABF5Du7k7JCyDrQP9Q36cQ47le5/ZA1LyeD90QDHQgBLMKvWCQ6BCc8Lig0LKg7J2QCpvg6E2PiSCMvhY/W1A+YJ426Z8gVx3v8R/f9WXw9X7gB4IgCJEw9mPvB3/gBKN+AWgeAJBtA2awBv6ACkd/8+eQ88KsxFDMDKhgBkCQvc8kBDhMB49Q7wmv0NIgC/5g2ZvQ+M9eCJfAVm0FxqGdbb+Hu9yY9ZiACZ3qyq/c9UkQB3FgB4ZQCaEgCqFACqHwCqsfCqdf9n6QBU3QAbP9t/6Aw/au0HYPxU3c+90QC3MABAhgAwsgEF8k+HMQwJAACadw9NKgDMFg3affCIqgCKXNjZ/2e4rXiaL/PQutkPWSQAiGYAiinwRqYAekbwiSsP6kAAu5kAvG4A/LMP/0bwy5AAuwIAqREPs+ABAJAihQsMCGmUeocB2Tdq0bOnTpIEL0x+wRkAMINCIAYkPIRzMh5zyCdGohM2HVjC1j6QvWpU+fWs2atSyas2g3ne3kuUyXrlafMEkyZEjNUTV2JEnChInUz2XIomEjp00bOXL+rPqLtsyfS3+R/Di5QGCBAo4jFTK8xq3bW27cqElDhREBgI0cPdoAAkQIEDNz5pyKdYwZq1pRbUaD2WomLak5rU7eieyn46GSIgnyo0ZQJUmkHNfENhnrVX9YVU/uqstlqEp+mBBUAARH/0JZshhKk3YMlz9/tk7NwRjAuMaONpQjB8Ix8KRYwVixesZSKimZM1lGm9xdG05duXKRqmTo8+ZIlUjB0rU9XDjV8eVX7R5tmq9cr0I1WsKB4MFHMkFFFlxwseVA4SyBpK8D/lNOCDOWQ8CGBTLqCCFLUDElk1qemYYl0VrRhZbtvGMNG2NygSUUUTyp5MVKPAkFFmOmweY9+MhxJz54eoRnxx3pm+y+/ERpJJAEzvIoQEtOcfLJUywhrjkb1qDjETroAGMNvppDziAz1hgJS1aIWWmZ9USkJacc5dMGm2lShOUVUeoURZVXYMmlxhuvwsodd34M1EdCg1xNm2VSfP9lFE/geGABg9Z4ZJJHHmnyyYv6MqPJ3HBBxZ851hCiy74uDEnMNSbhZRdf0NSzPe78jE+bcJaBJsVdXsHzlV3EK6ZGG99TjVBiiTVUNThTVMWTSL54lAEgrHzEnyZtwcUSLgGzhbe2uDnmFH8qHWmOkMoVSbA1FBnlFRX1bLU0WVULJ1ljdrHXXWimsREbfoXFqliAfdwRHnn1rVeUzaR4gIEJr3zkFFtkoVZTWbo5RyJ0uJHGU1QyseTjRwQzVyQh3mhERlh69SVYHGWdN8567fWFT377bfPPgAEetEeswtHXFzojCYQFBg7gS63oUFkDMFTGSUeia6Lu7ZhjEHT/MmRIBPMnsJBmqMMRT+zNxRdobG7z5Wf8KWbtYvS9EUd/edw555zJedmXWjxppA4eDFIuVVNiseSgSboZx550uLmGmqiv4Y1qA3GRBRUFxRV5hzcUcaRX8cq2mdb3poHmmWfY9vBGc8yJ227WAR0UH3jwkX322AN2x5/Q8W5RkTwiYMAGaN2YJCRLlIFLGsW7bZy3qf05BpVToFeQ3B28+EKRV7LfxRjP38bRH9JLX/sZfuMDVF7zAY19dvZlrxs4clAsphZG//Aiggo1fSSYcahh/CHFZaxxc+GN/6RhrQJFKWTVm0IdWjQKVeyibWbj1zRINz7y+cl1riNHPOx2/7P1tU+EhIIdobICp2cQg36aGEQe3vCGkJ0iGP57C0SSN0ACDhAXj0vQI9zAhiaMQRGK2AQEt7evG6EQfM0gnY3+tcEfyStHQAqhCGlHu2JhxR8W3AX9XpEKXqSCFZmIBYGoERcANsR/UfMf49riODb6BhU+nIIXxrCHPRDRiKermehKx8R96UhQG/ygv1xnRSvWrWDFsFctUqEKXnQiE8GoGi7iEhfHMeSG3cJkW7qhuGPIYhJ9yAMXwuAFL+SBiKCoRTGeAQ1Yju6PTDTHjQTZo0BlRYrwiYf6cgakIM2NYD17Dzae0cVRpCIVmkBE4CCHvOQVSHltQQdcHFLNt/9QIxiZQAQe8+CFJnghj5uIINvGV4xmpDNfOFIf7M5XSBzpaJfIMgYxXJnEmmHjVsbgZz9ztQlFBCIQe8hDH8gIuWMsz1qXvOREopYOxEEtGKYIxCACEYYXhiEPg2jEKGrRSnOuLZ3YUB07Tdizt/WxdIsaxSjaxshaLMsREcyerkaxCU/sqqbLaoQi6hAGGOCADs6kmrUaUrVjMDQuDu0G4iLajW0GAhFv6EEYNJqHQOixFvaylzmhUVKTuvODxhTf2ux100Y0gpwfleAuRjHERjgiEpFQxPVmWtPsqSIS/nCEI8YwiUyQkUCFqZotfGMLTja0mtI4hz3yYQ97nMP/H8FARCDG0IMZ5EGzmg2EJiD4UTx1tRjQwBGc4OMjuxmTkV3UlSrwNApHpHUToOAVP3MxCkDUARBxdcQZzgCIu+60r7GtgxTSgIpYoEK50lPQx5LK0LdYrBvHOEd105GPdIiDsp0YwwxgoAiCanYPg8ApKMzb0nJOA0ewFBagfPaMXKgCFJ7YRHnNK9sivqIYvvAFI3GrW0cIYhBcOENcQeFaUETCEYBg8BfG4IVOCGNDk6CwgJp7isTGRRzigKotxnGOcegjH+foRiy6yYUZzCAVAd1sGCr6h0Fw1BO8Il/oXgmfedVLvptoRIwHUYcY/0GPvMoFLPm7C54CGBBh/+ACIBQ8CEDAuA6+nXITeiCFVPijGcTghStMMYlgBAMXTmLLAH3jJGqcIx9rHnGJEZGHKaRYFTwOhGbfIAU8vyEMe2hEOcs2jWZIkF/QcKsjhlgHU+J5Cl+oQx06yi5jPMMY/AUao/YW5S9I4QyjiEQjHHyGRoO60QR+Bf38oUxiWKMaYzTFHE8hjTZqExVzsIQtLKYPEX+4G9wcwxRgsANHgjcM/ugBDFIcxKyCQoIXdK0Ei/EKT4CXC1NoAgys3YNFn4G8teUnpX2BZE/klgtNaIIU/IGwP3yhB1z4gm+p3EBHgDSFjgQjL1ihoFP4T8xzNAMdFHKOXFf3HMfIRP9Few2DXaRiEG+wtj9m4IEZ9OCOg9CEftdGDE8oG8mbQLSVe9CBFEd80Y5e1yv62+1eZS/cX/DHBz7QBLkC4gxceLkUmDztJnBhFG7VBDmJkcJUbMIV9n6ELMIcCzqYAQj+joUyzgGObjCuurEIBCAUMYjLFsMfjXiDBx7wdQ9AYAY2v+Oj6Ude8zriC1Modgc88HYPAMcf2j5Zyfdk1vzwNAwfgAAEGjiIM/igBy7/QA8M/4EODIJX9lLFMjvh2cYjAhGPMMWGMiWESTDkGNM17DjyQQ1TxLgTkkcEIxshhQhEoACpf4AHYCCFaTcwrXgEBMe5YHi39133HjD8F/7/ANwIquzb2RsFKBbchA48AALrHvfH4d4BGHTA7XkAm2utr4mBamLFaXjD6MGgHBu4wRTBYMaGat0NfZwDF4lwRCcSQf5gyLfrEWgAA+yfeteT28pTmDYXRl1sGPCHvvMH5YMAGDC8KfgtRzA5XsGrRem0M+iBAphACJC+Dui7r1M+6IOBaoMBISoi19KbI3kDLzCCVAKDCakSMEuuLHkEasC1EkuERBAGZugGcbiGN+CBuKO/AQiAAbg/1+uBans4f2gC/rMyfwg73StAGJgC/vO/r1GwvooET8g44xsEf+iACSyAAdjCAsjA1rO2JmiEPfCACOCCGAs6HuuxPShB/yOYAftjAH/og8DJhDQQAjoIBnXAtWuJBcOxh2xSQgjwhwgYgB4MAH8YgAjgPSu7NiOkth5IwiXsuyZ0t3b7AihLq+FaMEAYhC/guwk0xC6cwAeIAOVjxC8YKBjwO3IaBeyzqD0IBDigghlQPQZoACzohDFagx2gg0kAB1wbOGbYw2AEMQgoQEI0RONgAEV8AGwrNsN7xEhMQgL8OgjwgCcMgykIA0bzBycLBf2ADXH7uFAUxS40xQLsACnYBH2phUFoAg/gAkXAk03IgyawqocrxftLAzx4AyMoAjDIBFMQB30YB4PENYQcsXNQvgIsxAFYAH9gxi8UwmojNv0zvP8APEZTvMbDG7wGAoStiwRQgIVliQQGo7kH4EJzJEUP6ACXKzZE4AVrcKRGWMV4zIMxCIMmmIEMpL8GaIAI2IEdmAGhdAMyigVwGAfDQUhcU4dxYAZrHECVDIAFOEcOrLZoJDaM9DqNVD6Xa0JMFAQp7Cs8qYS+GoQp8IByNA5DVL4DNLweSANW+AVXQAQvgIEHIMAkfIAGEMVb7EugBA4cEMosOUr+YYZxAMZ5wDVwYIZg0L0BVD1zbIACcL23E8C3izgYCLsMpEDeGwPg8gR/AIXik0KEkTlfm8pDDIAvhAAp6DUra4JUqMs02AHg6ELcNEdDtL8G8Acc+M0dcAP/OsADgYwFAWEG5ExKqIsF5uwAAdS9ZExEQ2yAU4Q7CCDFr1M91WNJ/xNJPHktBeMtQLg96VTGZaRAbgwDKbA2LDCCBwCevtRN+fzJn/RNHFgD4ZmEDdkQPJhLVhAGAK28ygsDQew7hxRF7DxGf1DJCQQOL5xINPQHCLI+TmsEBvPEKdBC8zzEAaBMCNBGtvO6CPCH+rM/+TRHH+xN4PhJHBBOCvuySUgEROgD98ODChPQtITMvJTPLdROldRNLmxNGGA3QKhCZpkrTgSEL1C38jQOH6RKUjTCVZzAn5RDhpFPH1zNwCzRFr0S/ZwEPHADL0gDMu2DPsADGh09QczLhy3cTUN80Ns80cq0tg28Mkb7Md2KsZnjAgIURSc1jgVggAlUyx/1S2b8wRNlS6Csv/rr0kmZhCxJA2tLsTHggqEkUxwowOxcUSD1wtuMT3NkRMzCQAgovLfrAUabMrZbUBStSkBlTWbM0tWMQxPVTScdAEL0nVsUKi/FEl4MOe+qxQYIVAYICAAh+QQFBwD/ACwAAAAAcQBxAAAI/wD/CRxIsKBBgyL+mSDBsKHDhxAjSpxI0eFChiZKkCgRQmPEfwxLHBxJ0mCIiihTqlTJUSNHEik8kujosYTGkjgNjiABcqXDFCd9CvUJFARQmzdF5lxKsOJFjBCfrrwoVWXVnyn+yWTItKtAh/9O9KQo9epQixPHPuxJtaHXrhAHljBhkK5HuBGfmh16cexbph8T/g07kOdXlHvBSmTrluvgkhpFiMhogq7gv2KbHo7aMLFhgzwd0/38+bFWnkodnzhR2rTrnEpfexXZWrZtpkpj3yZJImPS3cBJZqZrmy5xgzH/7RwdvLlzvL8VPp9OvSAJFdWzayc4OkSKjNi3i//vqtug2Cr/YoDIkSNF5qzj45PMOHJTsoLoafxrjyKzwJv/oPBPVlCBZOB2xzGn3TcH/QDCCGKJYFgJOYxwoGO1TUfcXBmKFwhB6A0EglYWCvRUfKFJV909Be3zzz3sDOSNQKpU8k8G+wk4EGs9iWcYRo91OJCLLBLE4j4u/uNikgRtgAJdIRQGlobc/WiaYf4NFKNAM874jzI5fYPIP088edxXPbompGa3rcmgN9+ww6BA3xSp5Ei8lFFFCr2leOBjxhUUZXat1fMPPf/EiORAR3blSRI06AYgbqtpdUKgI625nZdDMlkQogKBAimP2p25nRsErSEQKwfZOdA3eSD/EYNc29kkn0FpCCQEGAOhOpIrGRg1YImE/nmrQW6gmuxI25SxX1iDUqcUfALpdyxBuf7DBhsHfVNLDD/8R6tzIOhngQQrpPuPBIQdm8a775aERKQHnVACCpp6NcEL/wxhxAUCrYDjgJWFJ16uabjBrUE2RPACuwKaAJ9+If6zwUCmelWEEf9A8Q+/7F5LEB0k/8Nrtv+gzMQEBGUQsgMC8btbBQ6wLNCI/7hg8G2rPIYHqpn8Q8c/O5DEgUA3/MMxFlgQJDNBNneVA10ufIXCzrLN8lYvBM1JkBBHDzTEEAPZUBAOHBdR0NMp50SCDP/I8PYJMpggA9yvAYPMLbT0//xW0HTmFDLLFVRAgQACUKD4xwU58ALMAmGB8kFVEwQ3XVg/Bowu/5Ri2jAlpXD5QBcLhN7pVZROg37hXswuv0z8g8XCLRdm7G1ay+YpQd8FUVBlGP+jAtwq7GxYCqvn5EDIzt3yDy0CccKJQe1YQ9B9Qi9Fl+94C++9QZkLdMRXGTu9guk5BAeMQM4fJM8/6wj0fjn/sFpSFTRU1v33I2FHQhCY+x92fEfAuF1KIOE6SAEL+JpbtC8n7WgHQXgxEgyYJgh4w44KfLfBgfgubseC3j90EQ/qDUSCB7kPHdbggX8ArFr/CFfFQnSx9BmmeCowzAcXWJLxVSd3yyhhCf//EY/3CeQd7zgIL9RWtH+ojSkJoMBAfiCDDwqEh/+wIkmOML7x7bAkWsyJ1jBhjHa8Y4hGlN8/kjgQNv4DBwYpwhJi948lCCRtODDbhxohkBjQQAZEAF4Wr7jF8fhNFAQZ4j/aQYx/mKMkarPjQJagNo7dcQY3yEMqCpI0yOkAgeEiAhGCQMrB+PAfXTzlYFqBCYE8I5FtdCNBNjYQji3BCEOwIxQ8JhAcKKIZo7AeBaHBK6gNZAItsMA/aPCDBKqSIM+kTjOekURFCsSaBIHCEiTJMSNskyC3VNsrBWI9edRikgKZI9mMua5/VMw0StCCaRZBCiG6YyDvS+MsLTn/kCfWUSAes2QzBAINgdSiD1Dw5z/oiM7YDYGhK7DAJ5/wDy1EIQr/UMJA4mkbTpSCEgOJwzUHYwQ5GqSk/+gDPvvpRA4c7QADgQITJFlHO9rxoQM53z90IIeBYHQg8vxpRW0DC9fcYJs2rWMRivAGgjQyEDhIgxE4oICD7PKWSDWCNyV5S4ZqIAnP4YNA2gCcpFLSY1hQqUDykAc4QgEHVf1H2CpZU63eUWlG4CUYctmvClwAZhoQSAv+0QKdKnMghwWOSAWy2IPcwKRL0KY3S4oDHOwAZd5M2j61aku7onSpS1UaUr+5UMYB7AZS/AcFUKvZ1AIHDQZZp0EiG9lI/+KVpRtTqBM5O9ptltQIN3isVm3qzXR+cwmyHQkHNMsUsnbFuSxrYcf+kTRbTpKfTnQi2cbG2d+W9JZ4pSQOjiZH8Crtn0gV2xCKMATmusa5/4AtbAki34MgAZx05WXHsEvamiotkr71bGgfi1XajpYJM01naVFKkgV45RD/aMN8yQpfg+jBubOCXHXtWss78pe4WgWwf5+Y13RqU5tIRbAdecDV7A5kAQ5WgIPfQolDVJggejAIhQuCASlyuMO7PW9NbylZS3J1shuzqZK1udDYjbZfNKXuP2Y847dAOMcRzjFZsazjf1yYJOsssYJ5BQaGqu3Mee2vgu2YYI+t8/+Wdg3tQNzrGrH+w86vYSh6R1JMgfSZDqjSL1MqO0sXCyRsAqmyV/B855zwgQ964PJIePDmSfZ5IHMQCDPA8Q9mmOIfmQBcQUT9j1MMBBVzng6jlyLpkpCNCQH15yMyLRBZBOMf/cD1P+ahD5Kk4x/oEMg1/kENYsvGGfKZAA/uSkeqZtoW1DgGQfKB6370gx/8qLZB8nEOgxR7IAD4R7hxomjbfFkgd7jDuZfiTw6YjdMC6cY/0pGPfGTb2tW2NrUHsu+DSDs+eO6CQXoqEB2A9b4WqAFBEkCQuRIkHcGu9z/yYe2K96Pe/d63PUgCBHEzxQYIIIg2yIETkDKCIIX/KIgOPunOg2AAZgZwoWsPIox/iEMgv86HOnRt8YtfnNoalzdOEBBXr2jDygOx1kDAShKG/4MABcgJNwbya4Fg2+f/4Ie+f15vewy7JGHDA0EUIZBq4ATZBXGe1jxXkJTHMCcCEIjT/xH1ghR9INK4uThu/g91VLzaWve5xA9iBoEoAI4jaepAzO6Kf7QPGf+APE5m4blLCMTyBbHDTg1SgYME4CAICDkdUC1sm6vj6rneOsX1DexvSyOON0C8QRAxpn/8QiCa+IfWaOFAnKxP92ynxMlHYgWCWJAknx9IyDs+EFsQxB78oLi9rx14fecDHdc4hvYPott/iH0grGLF/+0H8olSrGIWsxDh7/+yCJJgIOYz/4fTQy6QkDdgIJZA9bDTYQ972BvbWheAEocO3/YP9EcSkEAQtbcqA3EJlDA9AyFCTOE5lHAJ7ed+PvAPnWcAHaA4rjVjA0AQZvMIBCEO6HAOvwaAFHdv1IYOr2cLhcdS/0BrBpEJnVA/q8IKrOB2BSFCufNAziOBAgFSAkEIA2EFjTUQLDAQhUMQDzB3BWE2B5EOVAh0FCcQ9YYOxxALkyCFA9FnllBqBtEJOth4BMEIEOh4z0MQvPdAQmgQmodYA6EBGHB8NZAFWfAPgeUEH9ABHUgAAgEADPAPZkNr+odzBJFr+5ZtyhCGj/+hCZqQCqnQeIVQgQaxPg70QOtHEJeACUaoeXHAdAJxXwTxBwIhCAQhCM7iBBn4D5/3eYMoBM33D8N2Dhu3cQPhf8b2D0KgUJc2ELjwD6+3KnwkEJvwD5j3D34zEJB3C5InEMAAPa3QCgMhCYageUkgigeBSAJBCt5ICgZxBgJRAAvweYpmC7ggDdeADlQoEOfwjgIRbAJhA5WFA7vyD2aQjwLxCGF4DMMoDM2wC68ACptQjP/wCQaBdgKBDJK3DLPAOf/QSpLwD3GoBqI4kUwBkf8QCiNxdwexd3sndAloePNoMgLRcaryD5ZgC8dADd82Tv9gDLnQgwOhkATxjBH/ORCoeBDgSBLacHQ5QQELUFUeWRDcwA3XkJT/IAsGeAABkHxlMxDM9w8JeGs1JxDLMBCtRBBZ+Q9AKRDRgJUD0ZOGcBAIeRBHRw5Ht5ZeaRDGIBDcqHxM4Xwcd4AIAFMDkQm3JhDF8BhhKRBF9Q+RMJg7uZE9GZZfWRDwIBCLeRBdyZE4wZQlQX9CIIsFMZRSOYOTMBAURBCBGXnREA7/QHIkNxDY0JX/oAr/YCOeIBA28g++4BWNORJvmZr/MAiJ9g8pqZJLkWmPMGsF0XEH0HGWmRPLkJWJKRDJmZqjgBOiORDwcE8kQQ6zSRJhQBCFR4IjKRCOiI//QIL/EIyS//kPQDCVJ2kQj7BJMxmYsVkS2DANA1FUkPkPu/APuQCTAiGa7iCdOcGf/CkQr0AQIXgQwTgQsmhq1zB1wohpM3gQu/kPgQAKjrkUM0kQz1BQ/wCfBvGfS0Fy1ckUkgme/xALuYiUx+B8mdCdBUFrtCZ2kXAQ2NCWpRkO74mhAlGhNmobs0mdAhGjBUEFqVIQZiCLpiB088YNwygQwYgKpLeihScEO4CbBVGbTFGhBUEOM0pE/8Ch2VF4QdNteGcQBSoLtmBqVGkQYWCK9FmfVzqapYmfOVFC4VCau9GXB2EDNjA0ApEJBUgNXycQCnoQzncKTZqSY5CaqqCa7fkPz/85EBpKEBjaqKOZnyT3nHQqG3DaNAUxkkj5D4Eqb4FabF/3bwNxCpBAB33WmjjxqM8wUEsRDtj0HAbZB6hiCQU6dd3WDcWmoMPmkrtIqrjgfEPjBV0Ro+NkpwPBpVo6mqJJDspqG6o5CptkhnSZlMEmdOpIbMP2pwV4DUn6D28wBf/AVrgpoQYxDeM0TQMhqQVxT1g6HhRkP+F5DH8qEK9Xr/8gb8PGDd2ADkYKrv9wnf/QBLf5D6nApuMEkzD5SCMxo3R6qcHxCqmgqqBGEAX4D3RZEN1wlF8HcfJIEIEABwKheCPRl8jKsAcBsQKhssChpnmwgAvKFArKDcGGi///ShB5sAehMhID9QzT8KjT+Q8+Wh2AMAhc0DRr0KQCQaqlNxBClw7SEKgEMQmIsAdhAKR5YBBsKhBsqq4oKzIGoVbhuZTAiLFmSosPR4DokA+4WHUCsQdSAKEDobMGGaD/cE4D8bVgSxDEypQkWmphOJIIShBTR4XcgAvoYA/09g/2IHS4CQMz0Agfslb/0Aib4AmbZFAF8Z5eQbHNMQZcIK4D8Zv/oLQHIW/ncA3BiILnQG32IA639iEwIBB8pLNvW7ADgbcDAQ2uWhJqKhCA8Bw98A+i+w/W8wusADgZ+21HKYz/9nq3OG8EwQWzG6BkF7DXSbBScKgFIZrFQAxw/7q3OJGAfoqvuThx6FuvPTADBNFUmkq5/+AJeIuhzUml4jtBgvp627dt/wCmA4GbtvsPzSkQ7PsPM9BC1xkIjlAL9fkMunu/PPsPuWd2kIAL20eCMTgQ6mC+AiG7uPcPD0AQLeQFXCAQ1/sKx+gItAvBSxELpKcAv7iUweC/AqHCiSC2BFsQRSO6TRDAdTAIKry3e7AJ5voWelqqp8B3sVB7pgAmArwJUhDCBHF/AtED4kqwUzC8uAu27Ju1nhCtBoEF3xdXxSlqzKAO/TYQ4yBvTTC70lUSPeCHWgzBHfAAY6AIiuC5A8G+RjCUZrOZeykQf/sPt8aUOxdvrzHHt/8yBnUwuVn7DxI6CJNbEA2wABFwEKQmEL0mEBvXbRAwEFEHlf9AxTksEFPQBMOryDghjvGrmqkpCkFcvCWBwJ6ADQUVCOsbBo3wCq5MEjZgBGyAUCmTCPzWDTT8D/qgDuNQEFL8lOX2Dz3QBFgsy10RvAOBSCr8BT3wyTjRAzBArALRmTMQwgL7F1fJyQZxyNxMEIMYglScylU8sKUsEJc8EgY5EKpQxCU8EKJ8EHhghn0wz6YRDMEQC8wwDiiIzAMRDOM5ECE8iCQhXbM7EPW8FEFsrnXABR8wEANqEPscsCTRAB09EBA9EpNgCplgCijtxP/AacxQuiNRdwQh05/uLMUksc74zMtxORBT8AEP7Yol0QQFXMBMMdJ+ZhCJkAg3OKJMPRAfjROXLMUV/Q9GTRIBWsT/UAcCIV0w9sy3EQGXXNK+IhDEjAfE/J0iehAhXAB1V9LjONWvgZuHKsUO5tWUPNJ2bRBg3QBUPNYEAbkFzAZiB7M2TRD9zNEjEQE4XRBajZt1oNWiW3ddTRALUNUGwQCD6NYFcckRcH9UXBB+/Q9c4AUzsANG0ERvXNgCodlUHYJVvdgDocUd8A9nII5f8A8+PaABwABVVo6tTdVAPQAjfX+Z/YoEAQEhzNcCEdoDMdFE8w+Y7WABAQA7"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApW/ppgHadUkxCHXfJ29lc0cqkc7X6A0FaET+6xbvD4t"},"signature":"IaLGCQDUExrjYcJlei57VmxR6sPLOfzhPcFLwK1JgmpEosKTCfaGeGjae/VG8Tn4EMfp+SexBOZ5YL2Ay5baWA=="}],"memo":"setAvatar"} +{"msg":[{"@type":"/vm.m_call","caller":"g1tmmkgs6kcs66j9cewsq92sr03a058rcp5u00lq","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"CreatePost","args":["Brothers in arms, rivals at heart. 🍃 #Team7 #NinjasForever","data:image/jpeg;base64,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"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApW/ppgHadUkxCHXfJ29lc0cqkc7X6A0FaET+6xbvD4t"},"signature":"zpDMso4Aahs1lGlfSzHj2k4L+mjLMpp5nlYuvslXPlIy5e+Pic8Ky06Jm4UDuBIJ5NhlrhSad+XrXsjZ4MEMbA=="}],"memo":"createPost"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1vsc4t7d8l8arttauup093njj8qc0eukm6ng8ke","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyX0QnOS9127ryq7Di6BbFmHkygS+DxzK6l4+4UvKoAS"},"signature":"EjEt3tmKV0VyHKcVhTjvPnDZ7REOI0cczPv8r6YetY4FtU3vFWi6sYGaJxNoFE9+u7rB7fzRiO6vMNxrjivC/Q=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1vsc4t7d8l8arttauup093njj8qc0eukm6ng8ke","send":"","pkg_path":"gno.land/r/test/hello","func":"Render","args":["sasdasdasdasdasdasd"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyX0QnOS9127ryq7Di6BbFmHkygS+DxzK6l4+4UvKoAS"},"signature":"jZZLbGLhAN6z1AwJGrkt3Ax6ype8pZqXD089UwdFWDJOfYJ/glGw8EWGDkI7LaLdy79rNUWCEolhVAmSKm89sw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1vsc4t7d8l8arttauup093njj8qc0eukm6ng8ke","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyX0QnOS9127ryq7Di6BbFmHkygS+DxzK6l4+4UvKoAS"},"signature":"qgCrf4lurzwV//6zMAyd9sDyTkOS8iBE06CTBwrwRYkwT3MXqxaLy4GhCUHl8TW+4pLWYssaebeeOqAzG0l/CQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1vsc4t7d8l8arttauup093njj8qc0eukm6ng8ke","send":"","pkg_path":"gno.land/r/test/counter","func":"Increment","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyX0QnOS9127ryq7Di6BbFmHkygS+DxzK6l4+4UvKoAS"},"signature":"30+BeJFWhGq9KpD0aRKWBupRSgcUvbhCxudOu0S4LsJS1PZtPfMdjgsQePAhbSbMuUtwpsTsjr2UlONN1sa6bA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1vsc4t7d8l8arttauup093njj8qc0eukm6ng8ke","send":"","pkg_path":"gno.land/r/test/counter","func":"Render","args":["ggg"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyX0QnOS9127ryq7Di6BbFmHkygS+DxzK6l4+4UvKoAS"},"signature":"FHJTu8BYYHGAvyRCItik2iXV6Lk+qeaPa7e0b37BNJRDe+rHdKdpID5IBuAhnrLUOZxz7H7ovBvISIkmUQggEw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1vsc4t7d8l8arttauup093njj8qc0eukm6ng8ke","send":"","pkg_path":"gno.land/r/test/counter","func":"Increment","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyX0QnOS9127ryq7Di6BbFmHkygS+DxzK6l4+4UvKoAS"},"signature":"H4A4OewXpSXzPd2H+rlkAk/hSuCu8ERb3ygBkdn+mtcFXg1P/XJcbOyIKzbh3JmTrndJ2fZrfA+5Ztg7RkZcUw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1vsc4t7d8l8arttauup093njj8qc0eukm6ng8ke","send":"","pkg_path":"gno.land/r/test/counter","func":"Render","args":["ggg"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyX0QnOS9127ryq7Di6BbFmHkygS+DxzK6l4+4UvKoAS"},"signature":"QE/7Eq6k8eU5VntfErnvc88vDa7yGDwf0O1Rtw7taPhzaZxNABjPyaprKPJmG7xttx4gDPZtNOSL2n5k61uPNA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000005"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AidlxNTtkl1dDNCgxrSNVJKYWZdC9yrixvgSAP6U6WYX"},"signature":"0JYCnCzG9fAA//OyY6kUozRmyu3TxumTrat6spwdgDtXGv2vaRUs6frnyKzCDbpcnwRvwjnpY3vsbeSBirbjug=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"L8KDUB5PSEPiiHYt+PZgAaVjguuD5NTqGhe4F9kNBX8pTzgJ3rB2jvxHMuTQzNBhgJk/V5c2vlV3fmCowzYOKw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"WWjepLYaG+QcIchkPzIN3Asznwwi1Hllt9rq1XPibp0KLchuuTGF4iwGY0gwi7nAndl5lSu1hhYulhydlLXraw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AidlxNTtkl1dDNCgxrSNVJKYWZdC9yrixvgSAP6U6WYX"},"signature":"cLuQUyzdcZOKfbxZsXrnCPgzS3iyPeHjsNBW29qPwGM/RBdvTPwKD8Q39NGpIcduC3McQy5WyJOei7cfi0J4ZQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g162jgpk4740r6a7g53cgz9ahxqtyuekgqchw6w9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ztwwPpXI5OPC1XlhUfkt9VLQxkPnA2fc/nLQTCDAqbgLvlREzSM2sApwau84jCJYpjx/KfVdEvrg3RQLzHq9JQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1626wwzfe7psdz6ke9vc8qltcdkfev7h4mwm0k0","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1jw/hYarCvxJfYiEU8hlVwG/6z53KYettq9le8U6V5E8XpsSzT34znUEpAQAc+lIbRLQ1dmOH/yG+L/5//T8YA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","5","{\"message\":\"🔊 Les Rues de Paris - Instrumental \\n\\n#hiphop #boombap #instrumental \",\"files\":[{\"fileName\":\"Les Rues de Paris .mp3\",\"url\":\"ipfs://bafybeibhtf2h7witxv64yowemr4ndbhffyk34tyxdx33ltzh54p6hwmbwa\",\"mimeType\":\"audio/mpeg\",\"size\":2875437,\"fileType\":\"audio\",\"audioMetadata\":{\"waveform\":[6,4,13,12,12,14,4,5,14,14,15,6,4,16,15,11,6,1,13,5,9,19,22,23,15,11,13,7,13,12,9,12,23,14,12,9,11,9,11,11,7,11,18,19,18,5,14,10,10,14,5,14,10,14,16,14,12,2,7,5,5,5,1,5,13,9,14,14,7,10,9,12,17,11,11,10,11,15,4,11,9,10,13,4,11,9,8,10,3,20,18,20,20,8,18,22,19,13,19,17,14,9,22,17,15,14,6,14,18,10,8,4,13,20,24,26,11,15,11,9,10,9,15,19,15,11,10,11,14,6,7,9,11,15,13,19,11,11,15,4,10,9,10,11,10,10,8,8,14,11,10,7,7,9,6,14,16,8,12,9,11,8,2,12,15,12,15,4,13,9,9,5,-1,0,6,7,8,6,12,7,8,12,18,19,14,6,17,19,16,14,15,9,7,20,19,12,12,10,10,18],\"duration\":119760},\"thumbnailFileData\":{\"fileName\":\"Paris-Beatmaking-Cover.png\",\"url\":\"ipfs://bafybeic33uehiyisnfn2nfof3ifteaylvj3uht23uwpymched2jwg4h4su\",\"mimeType\":\"image/png\",\"size\":811475,\"fileType\":\"image\"}}],\"gifs\":[],\"hashtags\":[\"#hiphop\",\"#boombap\",\"#instrumental\"],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-05-19T15:40:29.813Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyDlf14q7C2aBqar/Qryh6dVR9VACxVZV6fOaM3X5YEA"},"signature":"lWFRh7o5/1SveO+r/Kq7JKvXf3en/ORulgVxJ8L+YIwau1lh4+ckr7PYV4tiZ+lvvGHDqeim1MIGI97CLMM1HA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","5","{\"message\":\"🔊 Les Rues de Paris - Instrumental \\n\\n#hiphop #boombap #instrumental \",\"files\":[{\"fileName\":\"Les Rues de Paris .mp3\",\"url\":\"ipfs://bafybeibhtf2h7witxv64yowemr4ndbhffyk34tyxdx33ltzh54p6hwmbwa\",\"mimeType\":\"audio/mpeg\",\"size\":2875437,\"fileType\":\"audio\",\"audioMetadata\":{\"waveform\":[6,4,13,12,12,14,4,5,14,14,15,6,4,16,15,11,6,1,13,5,9,19,22,23,15,11,13,7,13,12,9,12,23,14,12,9,11,9,11,11,7,11,18,19,18,5,14,10,10,14,5,14,10,14,16,14,12,2,7,5,5,5,1,5,13,9,14,14,7,10,9,12,17,11,11,10,11,15,4,11,9,10,13,4,11,9,8,10,3,20,18,20,20,8,18,22,19,13,19,17,14,9,22,17,15,14,6,14,18,10,8,4,13,20,24,26,11,15,11,9,10,9,15,19,15,11,10,11,14,6,7,9,11,15,13,19,11,11,15,4,10,9,10,11,10,10,8,8,14,11,10,7,7,9,6,14,16,8,12,9,11,8,2,12,15,12,15,4,13,9,9,5,-1,0,6,7,8,6,12,7,8,12,18,19,14,6,17,19,16,14,15,9,7,20,19,12,12,10,10,18],\"duration\":119760},\"thumbnailFileData\":{\"fileName\":\"Paris-Beatmaking-Cover.png\",\"url\":\"ipfs://bafybeic33uehiyisnfn2nfof3ifteaylvj3uht23uwpymched2jwg4h4su\",\"mimeType\":\"image/png\",\"size\":811475,\"fileType\":\"image\"}}],\"gifs\":[],\"hashtags\":[\"#hiphop\",\"#boombap\",\"#instrumental\"],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-05-19T15:42:19.694Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyDlf14q7C2aBqar/Qryh6dVR9VACxVZV6fOaM3X5YEA"},"signature":"0v0x4YVbF5ycVq9jvkvtKjn82nFjrBA2KNMZFrYXQcpEo9hogBI1e4p97RuLSO9kptaGYzk/pAtkPXLuggwIaw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","5","{\"message\":\"🔊 Les Rues de Paris - Instrumental \\n\\n#hiphop #boombap #instrumental \",\"files\":[{\"fileName\":\"Les Rues de Paris .mp3\",\"url\":\"ipfs://bafybeibhtf2h7witxv64yowemr4ndbhffyk34tyxdx33ltzh54p6hwmbwa\",\"mimeType\":\"audio/mpeg\",\"size\":2875437,\"fileType\":\"audio\",\"audioMetadata\":{\"waveform\":[6,4,13,12,12,14,4,5,14,14,15,6,4,16,15,11,6,1,13,5,9,19,22,23,15,11,13,7,13,12,9,12,23,14,12,9,11,9,11,11,7,11,18,19,18,5,14,10,10,14,5,14,10,14,16,14,12,2,7,5,5,5,1,5,13,9,14,14,7,10,9,12,17,11,11,10,11,15,4,11,9,10,13,4,11,9,8,10,3,20,18,20,20,8,18,22,19,13,19,17,14,9,22,17,15,14,6,14,18,10,8,4,13,20,24,26,11,15,11,9,10,9,15,19,15,11,10,11,14,6,7,9,11,15,13,19,11,11,15,4,10,9,10,11,10,10,8,8,14,11,10,7,7,9,6,14,16,8,12,9,11,8,2,12,15,12,15,4,13,9,9,5,-1,0,6,7,8,6,12,7,8,12,18,19,14,6,17,19,16,14,15,9,7,20,19,12,12,10,10,18],\"duration\":119760},\"thumbnailFileData\":{\"fileName\":\"Paris-Beatmaking-Cover.png\",\"url\":\"ipfs://bafybeic33uehiyisnfn2nfof3ifteaylvj3uht23uwpymched2jwg4h4su\",\"mimeType\":\"image/png\",\"size\":811475,\"fileType\":\"image\"}}],\"gifs\":[],\"hashtags\":[\"#hiphop\",\"#boombap\",\"#instrumental\"],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-05-19T15:42:36.693Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyDlf14q7C2aBqar/Qryh6dVR9VACxVZV6fOaM3X5YEA"},"signature":"OXL43A/1UXRzy1vGpLCeB1rtYPYIbKQoCUQK3/kfzkRc4NaX9dC4MKvazxjPvBiIbTlqVzy9okxbcBUJnr5HiA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","6","{\"message\":\"Ménilmontant - Instrumental \\n\\n#instrumental #beatmaking #boombap\",\"files\":[{\"fileName\":\"Ménilmontant.mp4\",\"url\":\"ipfs://bafybeihxtnpvrxwzepw4yff7a2xyuew7gy7cgtga4m7gtbdzxlqtnbavuu\",\"mimeType\":\"video/mp4\",\"size\":4356094,\"fileType\":\"video\",\"videoMetadata\":{\"duration\":0}}],\"gifs\":[],\"hashtags\":[\"#instrumental\",\"#beatmaking\",\"#boombap\"],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-05-19T15:54:06.923Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyDlf14q7C2aBqar/Qryh6dVR9VACxVZV6fOaM3X5YEA"},"signature":"j+QN7TqJx0IrA5M1iDnxAGXlftSzo5n7VsUYkKUj2BISn0xQ/kxzPEtNma+K89f7C3ZYtSw6yOGx6OBu/itkNw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","6","{\"message\":\"Pont d'Austerlitz - Instrumental \\n\\n#instrumental #beatmaking #boombap\",\"files\":[{\"fileName\":\"Pont d'Austerlitz.mp4\",\"url\":\"ipfs://bafybeigzbrwyyplfpirjjgizub276fxessrijbkxvmyus6xt6ynctvpmma\",\"mimeType\":\"video/mp4\",\"size\":4363889,\"fileType\":\"video\",\"videoMetadata\":{\"duration\":0}}],\"gifs\":[],\"hashtags\":[\"#instrumental\",\"#beatmaking\",\"#boombap\"],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-05-19T15:56:43.286Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyDlf14q7C2aBqar/Qryh6dVR9VACxVZV6fOaM3X5YEA"},"signature":"dfQg9Pd4FjfDOcUHwevBg5ZzhYrYTdtSWreMT9DEilBy0H5XbNYOPRlwBCcMVWubo89TcgZ4f2eB1UlQvvzjgg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","6","{\"message\":\"Pont d'Austerlitz - Instrumental \\n\\n#instrumental #beatmaking #boombap\",\"files\":[{\"fileName\":\"Pont d'Austerlitz.mp4\",\"url\":\"ipfs://bafybeigzbrwyyplfpirjjgizub276fxessrijbkxvmyus6xt6ynctvpmma\",\"mimeType\":\"video/mp4\",\"size\":4363889,\"fileType\":\"video\",\"videoMetadata\":{\"duration\":0}}],\"gifs\":[],\"hashtags\":[\"#instrumental\",\"#beatmaking\",\"#boombap\"],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-05-19T15:58:15.803Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyDlf14q7C2aBqar/Qryh6dVR9VACxVZV6fOaM3X5YEA"},"signature":"t7VGru6yiXRxFw2M+dF1tWJ3dMzEq9VzwtmePyg0aHQgUhpv4Gze6l84MD011a6tibtRBE78DdX8ST9/GmU0nw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","6","{\"message\":\"Nun's Café - Instrumental \\n\\n #instrumental #beatmaking #boombap \\n \",\"files\":[{\"fileName\":\"Nun's café.mp4\",\"url\":\"ipfs://bafybeihjoy5ndz6urvmqqsrzyouarma6k22mraxxdg35h7oakzj3abw2eu\",\"mimeType\":\"video/mp4\",\"size\":4335415,\"fileType\":\"video\",\"videoMetadata\":{\"duration\":0}}],\"gifs\":[],\"hashtags\":[\"#instrumental\",\"#beatmaking\",\"#boombap\"],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-05-19T16:12:18.066Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyDlf14q7C2aBqar/Qryh6dVR9VACxVZV6fOaM3X5YEA"},"signature":"dIdk0hQmEThNc5RsFPzCYEFYBXKt5rUwbbNsPLem4ZJppJALQTKWhcffd+QWS1sbmKdERVlhfXQze0+UNRSPow=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","6","{\"message\":\"RER B Graffiti time - Instrumental\\n\\n#instrumental #beatmaking #boombap \",\"files\":[{\"fileName\":\"RER B Graffiti time.mp4\",\"url\":\"ipfs://bafybeieqyu2esp6opcyvcnuebu3harlvg7k5xhiy6sac3il55h4c6edrpe\",\"mimeType\":\"video/mp4\",\"size\":4350354,\"fileType\":\"video\",\"videoMetadata\":{\"duration\":0}}],\"gifs\":[],\"hashtags\":[\"#instrumental\",\"#beatmaking\",\"#boombap\"],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-05-19T16:26:24.757Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyDlf14q7C2aBqar/Qryh6dVR9VACxVZV6fOaM3X5YEA"},"signature":"hoqapOu9cJDK478fcZSXgaWMqwaQKhTytrfUbtnf/0xaTdE/fXIvzN/3dZ6ntF+hjtoqgnzJADYrqdnsz2eIfA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"FlagPost","args":["1","gnoport-2"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyDlf14q7C2aBqar/Qryh6dVR9VACxVZV6fOaM3X5YEA"},"signature":"VxB8uNMHO2iyIjyylo4PoPLfPdwMwnTNfbxG0MsF+Klruf6I03kpR/LDFzJjUaFcOkHTjTgvRL3nxrSYao+D9w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"FlagPost","args":["1","gnoport-2"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyDlf14q7C2aBqar/Qryh6dVR9VACxVZV6fOaM3X5YEA"},"signature":"i+NPpooMAEIQzA5IkrFPnb1GjmBE8EMZj45cadm/leBhycCkFRF0uNMhkG1Mx57yKPiYuz7kP+HTscK5gh4kow=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","gnoport-11","😍","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyDlf14q7C2aBqar/Qryh6dVR9VACxVZV6fOaM3X5YEA"},"signature":"ys/yPk/REcM9MWobat0gScZn/widO/iTkUn6tEJInY8b6onqJ7K7r8ssW0ItsESFC+eoI+WcGb5Yr8g6Pv5wVQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","gnoport-11","😎","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyDlf14q7C2aBqar/Qryh6dVR9VACxVZV6fOaM3X5YEA"},"signature":"5DQ/ePmXliJh5AgmHTnzhJXd5osNOlvtkVdgslEZg59/bylU9gXXeQeyyA1rIjOCrjIwaBzZ47Z+JVYeGRcpFw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","gnoport-10","⛈️","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyDlf14q7C2aBqar/Qryh6dVR9VACxVZV6fOaM3X5YEA"},"signature":"P8d6F/XTIEyqYmZFk7Mpmt5HTnX3xwm4v+Ok9hHAmaIUvJt3+q7hRNv787pXK/q8Rr0rD6n7plFhKmxAPqDv+w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dvfhkhjp0qgrrm4tr065aqz6ntjs0qr7rtmxuu","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OWueE1GqmFdcVCOg/R8Ge0gHnol390CD3zzDqgi9CLFO8pF+gEGm8KDQd1+VVKyxzh89FRSwojUF5Glc/mEvEg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1626wwzfe7psdz6ke9vc8qltcdkfev7h4mwm0k0","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rnpiFTDYjxlu/aH3fCdJKoF3XjOHzbIsuzsX6eHMsCooeyClbpvDVhdoAj0jN6Npn7ZT7yw7WmyqtXFk9lFXrQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g14vxq5e5pt5sev7rkz2ej438scmxtylnzv5vnkw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"5000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AhPbY6ETOcN5nEFZ1BJbZLVlOUbnlRBPmdFEUfnfWXGh"},"signature":"pQ5Gk7jqIob4/TT1aP6c5eTE+A0HO/k/3pWyiqD25loA2jRGqAOA/1+3ai3yKhe2vzEVo7GHtCNDuTKIUmtk2g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dvfhkhjp0qgrrm4tr065aqz6ntjs0qr7rtmxuu","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"I4mBvcq+/74LcAJlaksYgv+aMPwS7APjpgAYRclcHNEM/osgn9sp8Rjz8rBpYtcs9fzN8K6XGxMvR7HhTOkQjw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["the-gnome","Introducing our new Gno.land logo: the gnome","\n\n[![banner](https://gnolang.github.io/blog/2024-05-21_the-gnome/src/thumbs/banner.png)](https://gnolang.github.io/blog/2024-05-21_the-gnome/src/banner.png)\n\nWe are excited to introduce our new Gno.land logo, a significant shift that \nreflects the true spirit of our project.\n\nFrom the very beginning, the character of the \"gnome\" has been a source of \ninspiration for gno.land, representing the essence of our journey and values.\nIn time, this character has not only inspired our project but has also become\npart of gno.land’s identity. \n\nThe black hole of the previous logo represented \nfinality, inevitability, the ultimate end state, and was an interesting \nrepresentation of something that cannot be seen; but it also had nothing to do\nwith gnomes. Gnomes are warm and inviting in character, are the opposite of the\ncold and unemotional void of black holes, where all that is known is pulled in \nand ceases to exist.\n\n_But why gnomes?_\n\nIn Greek, _gnomi_ means “the means of knowing; mind; intelligence; judgment”. \n_Gnomic poetry_ refers to a type of poetry involving short memorable maxims of \nwisdom that flourished in the 6th century in Greece. Today, when we hear _gnome_ \nwe think of earth-dwelling figures often found in lush blue-green gardens,\nguarding or simply enjoying the land they are in.\n\nNobody knows for sure the origin of these gnomes, but the earliest known\nreference to it comes from Paracelsus as _gnomus_, a Swiss Christian theologian \nphilosopher and alchemist of the Renaissance. He also called them _pygmies_ in \nhis _“A book on Nymphs, Sylphs, Pygmies, and Salamanders, and on Other Spirits”_\npublished in 1566, a study on myth creatures as they relate to Christianity.\n\nWhile the depiction of gnomes are varied, their general character was described\nby Paracelsus:\n_“the Pygmies (gnomes) are mountain people who keep pledges, are honest, hard \nworking, loyal to man, and “have money, because they themselves coin it” -\nParacelsus_\n\n(perhaps Paracelsus would have preferred to be identified as a gnome, since he was also an alchemist).\n\nThis character is consistent with Swiss folklore, as gnomes are said to have \ncaused the landslide that destroyed the Swiss village of Plurs in 1618 - the\nvillagers had become wealthy from a local gold mine created by the gnomes, who\nhad poured liquid gold down into a vein for the benefit of humans. The villagers\nwere corrupted by this newfound prosperity, which greatly offended the Gnomes. \n(Wikipedia on Gnomes).\n\nBy combining Swiss folklore and the original description by Paracelsus, we can \ndescribe gnomes in the following manner: \n・At first, gnomes create timeless value for humanity. \n・Humanity becomes corrupted through greed and abuses these timeless values. \n・Finally, the gnomes take remedial action. \n\nWhether the timeless value is that of an element such as gold, or that of a\nprotocol such as crypto(currencies), gnomes are hardworking alchemists who wish\nthe best for humanity and actively resist corruption and greed as a matter of \nprinciple. This quality of character is sorely needed in the field of \ncryptocurrencies and blockchain, where it is so easy to become corrupted by \ngreed and bag-holder syndrome, resulting in stalled innovation and broken \npromises at best, and the loss of life savings and the death of the wellbeing \nof entire communities at worse (thus far).\n\nOur field of crypto needs more gnomes to create timeless software and protocols\nfor humanity. Such technology should be: \n・intuitive (easy to use and understand) \n・expressive (for societal infrastructure; finance, social, knowledge) \n・finalized (completed) \n・secure (unhackable) \n・scalable (affordable) \n\nThese are timeless values we strive to bring to the world through gno.land. In\naddition, gnomes are not afraid to take a stance against greed and evil. Some\nsay that gnomes wear the Phrygian cap, which represents Zoroaster, the “three Magi”\nfrom the east, or the revolutionary pursuit of liberty. Gnomes are also earth\ndwellers, masons of the rock, and the guardians of the land.\n\nGnomes are thus an ideal representation of the builders behind gno.land. That’s\nwhy the logo had to change. We hope you like the new logo, an iconic depiction \nof the gnome with cap; and hope that the gnomic spirit can help guide us to build\na better honest world for all of us.\n\n_- the gnomes of gno.land_\n\n\n","2024-05-21T12:33:00Z","gno.land","gnome,brand-update,new-logo"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"n92CQHO6H4Kl2JOfYxch7w2BAatv7gzR8idNbHFQlCN4/vQtigW7wgiy1wKdevnVl/vqEQPRgAyj3qvJB4O/QA=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g13lcs6h7emmdqze78qtw5p4xkxyzc53f6pu5mfw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AzIwEGmZJ17EJC5CjFILCU+pO+oEhjMcN+W2KD7KW9Q8"},"signature":"oCkAOWdQ0iYPU/yZLXclY1raAaMOIc5oGDbUKkuJ96B6r9RnILY/WGHA+eEbhCKsxQ6smi+0IljqvBdM/3BUJQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g13lcs6h7emmdqze78qtw5p4xkxyzc53f6pu5mfw","send":"","pkg_path":"gno.land/r/stuyk/mood","func":"ChangeMyMood","args":["hello there"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AzIwEGmZJ17EJC5CjFILCU+pO+oEhjMcN+W2KD7KW9Q8"},"signature":"vDFov6VKr7LWFuZE0vnn+pA7b/iJ3MeoGvwNtzjWFYt1IAFHrKhiOAIv4655dMcJflLku2D60+Cc9+PUlCM6Ew=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1626wwzfe7psdz6ke9vc8qltcdkfev7h4mwm0k0","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1jw/hYarCvxJfYiEU8hlVwG/6z53KYettq9le8U6V5E8XpsSzT34znUEpAQAc+lIbRLQ1dmOH/yG+L/5//T8YA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1mhnd9g3zcc8k9yh5lccjc9jtc2zk4w7n5gd0kl","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0SOamQUz2vFirC43I0hVWW0w22Mr1OKDYu0Va8rxxZgIS58Z+FG3h8oHUlWejLq+OSWM57bJLeVW5YIjzfgoLA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/userbook","func":"SignUp","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"Z5NmXAENALHoaGnnbyiTTXiVa5nPK+k3sP0plClJW48bIztnWilA3IQGHeLHdM9Y7SS+0BBlIy7Z7YmasGyEXw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1urt7pdmwg2m6z3rsgu4e8peppm4027fvpwkmj8","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"KnJ/y3bUXhU7gYgE/10VdcYf2uTM8+WjU9BkIEbUDAdHrWeSZIYjspjeDSogJfpd+tJbFvQO3QTmI3h12j7q3A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1urt7pdmwg2m6z3rsgu4e8peppm4027fvpwkmj8","send":"","pkg_path":"gno.land/r/demo/userbook","func":"SignUp","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArvWv8M+y47Y+EdM+meMEO/x9ukYOnb0DaxWpjih8z9C"},"signature":"nEVoNtIHuFDhvAl2Wsu5Xj5kRkOqgnwUH1MXHhSKQ6IfC790mBKF1wmQv6DB/bPeikQ/Fcta21feGcW2nTSaVg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","4","{\"message\":\"Testing.jpg\",\"files\":[{\"fileName\":\"ORIGINAL BTC JAZZ CLUB.png\",\"url\":\"ipfs://bafybeigdfk3mhrt4lmls4ogywmnpmd22emlazgnzf2qmj7vsjn2ljnb6sm\",\"mimeType\":\"image/png\",\"size\":1408208,\"fileType\":\"image\"}],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-05-23T12:48:09.638Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyDlf14q7C2aBqar/Qryh6dVR9VACxVZV6fOaM3X5YEA"},"signature":"68y5nqRAkdWSdSHTKJVOg0K5WI4FlAOh6pnKW2+i1mBvWMpO2ayuEctcFrrydo5ftZ5DC1ekyKdzh6cot4ISNg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/foo20","func":"BalanceOf","args":["g125em6arxsnj49vx35f0n0z34putv5ty3376fg5"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"ynZiGTflOmdAkw0GHcfb6MHQ+/Zf57zD7EDcbbaUkdcrzcDj9ZXtbFbPYQSOgxHFWKFwmBAV2B7i+WvPzKG5RQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"BalanceOf","args":["g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AidlxNTtkl1dDNCgxrSNVJKYWZdC9yrixvgSAP6U6WYX"},"signature":"uADfOyiK7WN7a2Qxo4Mbnfrjpb4DsbXLze/evWN8iHccckP/ivFexbPg5PcHp7qQ9YAeVUQSMp1XMDQIcZP0og=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10xt7fmglfl2fn2cmkhkgjecwhjxhudwnhswcc7","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5OGAHQwNfLlwhkZKGkW7HNqYY90bU7eZwBAsCxJfmGUs7gkEeR72ruQj36AMlQeoMRUbSHnx0rqA71BQR0zVCw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/userbook","func":"SignUp","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"Z5NmXAENALHoaGnnbyiTTXiVa5nPK+k3sP0plClJW48bIztnWilA3IQGHeLHdM9Y7SS+0BBlIy7Z7YmasGyEXw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1urt7pdmwg2m6z3rsgu4e8peppm4027fvpwkmj8","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"KnJ/y3bUXhU7gYgE/10VdcYf2uTM8+WjU9BkIEbUDAdHrWeSZIYjspjeDSogJfpd+tJbFvQO3QTmI3h12j7q3A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1urt7pdmwg2m6z3rsgu4e8peppm4027fvpwkmj8","send":"","pkg_path":"gno.land/r/demo/userbook","func":"SignUp","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArvWv8M+y47Y+EdM+meMEO/x9ukYOnb0DaxWpjih8z9C"},"signature":"nEVoNtIHuFDhvAl2Wsu5Xj5kRkOqgnwUH1MXHhSKQ6IfC790mBKF1wmQv6DB/bPeikQ/Fcta21feGcW2nTSaVg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","4","{\"message\":\"Testing.jpg\",\"files\":[{\"fileName\":\"ORIGINAL BTC JAZZ CLUB.png\",\"url\":\"ipfs://bafybeigdfk3mhrt4lmls4ogywmnpmd22emlazgnzf2qmj7vsjn2ljnb6sm\",\"mimeType\":\"image/png\",\"size\":1408208,\"fileType\":\"image\"}],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-05-23T12:48:09.638Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyDlf14q7C2aBqar/Qryh6dVR9VACxVZV6fOaM3X5YEA"},"signature":"68y5nqRAkdWSdSHTKJVOg0K5WI4FlAOh6pnKW2+i1mBvWMpO2ayuEctcFrrydo5ftZ5DC1ekyKdzh6cot4ISNg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/foo20","func":"BalanceOf","args":["g125em6arxsnj49vx35f0n0z34putv5ty3376fg5"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"ynZiGTflOmdAkw0GHcfb6MHQ+/Zf57zD7EDcbbaUkdcrzcDj9ZXtbFbPYQSOgxHFWKFwmBAV2B7i+WvPzKG5RQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"BalanceOf","args":["g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AidlxNTtkl1dDNCgxrSNVJKYWZdC9yrixvgSAP6U6WYX"},"signature":"uADfOyiK7WN7a2Qxo4Mbnfrjpb4DsbXLze/evWN8iHccckP/ivFexbPg5PcHp7qQ9YAeVUQSMp1XMDQIcZP0og=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10xt7fmglfl2fn2cmkhkgjecwhjxhudwnhswcc7","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5OGAHQwNfLlwhkZKGkW7HNqYY90bU7eZwBAsCxJfmGUs7gkEeR72ruQj36AMlQeoMRUbSHnx0rqA71BQR0zVCw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"Ayla7f2fjn9+fHdk2fgU1zYyvHKdvvgECrvuocQ7rcwq8Z1i3O0QzobT4AKmI9KEaxUq97VZbpHa+sTEl7r/Tg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1626wwzfe7psdz6ke9vc8qltcdkfev7h4mwm0k0","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"2NXdrmQUeI8Ogqk1OwVnJWxlXGcZUK/IkAWUgWkB1wJ5VW3t3xnrh2eCVX4msPI1X5j8eF/zmUV+aROdvCZnsA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","4","{\"message\":\"#newlogo #gnoland #gnomees\",\"files\":[{\"fileName\":\"og-gnoland.png\",\"url\":\"ipfs://bafybeifmvq5f243mk6tevkbmws53lgsdegxpsd2qslzji4uqkafu7zuoai\",\"mimeType\":\"image/png\",\"size\":4739,\"fileType\":\"image\"}],\"gifs\":[],\"hashtags\":[\"#newlogo\",\"#gnoland\",\"#gnomees\"],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-05-24T10:04:45.437Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyDlf14q7C2aBqar/Qryh6dVR9VACxVZV6fOaM3X5YEA"},"signature":"UEjmMGA+XTWi8//y+/GE8sYstJfNEON+u9hZWU+nF2Z1EyDkNUOCp+p3LHDs/HWiFV7uNRQVFBQF9nPttZuHAA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"BovjrUh8xavxI4p68/vKvobQu8a0XQHT2e1QT9Wbu74rv4thsBU6/V19QT5w55Z6RtItNSHImOSOX5+N2xK+Tg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1lp8g5p78u9dg6ww4c5e5hdeuw8q9ga056f0adv","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"boa5AiVIr/M2PSB3LOnYBYLclkJmQPnnh2SFJeiW2M5l+X8JH7FkJhKpyeckNvvls6lUsRgdOqiCileqdKBGmQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyDlf14q7C2aBqar/Qryh6dVR9VACxVZV6fOaM3X5YEA"},"signature":"sKYsoC0Q3LLehTvc4FRlyqsqOzA22SWKiSbdmCuDPZxy7EK+assH+8JMZ6+vBfp7681jT4+ppDwqvXiWnkDtUw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyDlf14q7C2aBqar/Qryh6dVR9VACxVZV6fOaM3X5YEA"},"signature":"6O97vi94HVv3jKMf8UAwiyxRbVE9d2JckKE33kTTHTN980WOyCztFBwzV+193ULsAmKtslZNtpWbcvkvFfZ/PQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyDlf14q7C2aBqar/Qryh6dVR9VACxVZV6fOaM3X5YEA"},"signature":"DfgXUHtCH3ws8eFNaDdTxyFLln6+g0TlhWeqYyvxvAxU+oI88or0baEUVT8EueEj9IwfC71W5vS9HQab4yx8oA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","gnoport-13","🙂","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyDlf14q7C2aBqar/Qryh6dVR9VACxVZV6fOaM3X5YEA"},"signature":"7uzpFQ66Q238Fsn6AgKfiBtaYPsFwmAtwTHOjoS8EN8DR7I3WrmE2eXVg+dZw8frm8dSNXAjGJPfRzHFxmscsg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","gnoport-13","😂","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"zaVfw2/fiUlsF3vk+CV1eXI+RnD8r/okPX+KzTyemrdwrD86YaOMWexPcbKUWzjT7a+qwQ6LS4ZTZKJtfXBYeQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","gnoport-13","😀","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"iaQj1EEwLtU2bDWrmawNBo9qMuu8i3zK6zeaJ4CCmmBrX46u+yvl6wwuH5jq3GvCXr2ldBKcmpmtIZGXGPoQrw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","gnoport-13","😀","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"TN+ZdYnDz0pKgP52IJoveTivzzsowsTUvKLDkomq3WJU3KHSyqHP5FiWX8/E7DkmlzZjg7GR0bU7neIIKzZzXA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1uf8u5jf2m9l80g0zsfq7tufl3qufqc4393jtkl","send":"","pkg_path":"gno.land/r/demo/userbook","func":"SignUp","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AitYIWT3az4Jx3hGzTapJ6hyalJ6EYgqQCpYoe7Gx2Sw"},"signature":"kg7NYFE+r1LxcNIGi9UQRYh8TPLKjL8CceEq88KdUSkpURWFCD1mRgPW+q4C5eexvhRb+FtVxsJngbMgyA0r6w=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","gnoport-13","😀","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"TN+ZdYnDz0pKgP52IJoveTivzzsowsTUvKLDkomq3WJU3KHSyqHP5FiWX8/E7DkmlzZjg7GR0bU7neIIKzZzXA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1uf8u5jf2m9l80g0zsfq7tufl3qufqc4393jtkl","send":"","pkg_path":"gno.land/r/demo/userbook","func":"SignUp","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AitYIWT3az4Jx3hGzTapJ6hyalJ6EYgqQCpYoe7Gx2Sw"},"signature":"kg7NYFE+r1LxcNIGi9UQRYh8TPLKjL8CceEq88KdUSkpURWFCD1mRgPW+q4C5eexvhRb+FtVxsJngbMgyA0r6w=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1yr6mh5k8cjdkrjcmp5mu2przkgjf5265umzj3t","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g+K7RF1FCBRUAzwlJynCXoIW7q5uN/bb4FdwLQOPxCRDDLTsN7/Sd2p1lx1dexwzGM9cdAbZhTd4M7sYnmVBKg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"fzAMS2IM8uCIp1bzXrIoKjAzqoxBaIiv4aLJh61Vx8RZbQDe17G0zzqOR/fhD4aEFdH4RqhVDt98TivMfJ3O2w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"2XRxnAX6CQvpy5vvZ34hIE/CoKh2tjVhJK9PB7IFT8sJUFH889WHx/zl61+MDT2HOhebttUEpbuAW6r3M9rIBg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"iMlCgja5LrW1PgGSZVwnuOMrsGFVBFgPg5M9N2pGZpEoApdMHs6O72NagGA5xm0Dyj22Akhm4ltn7R1wZ1I8sQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"IzztoCRbEminwAeusCOJiw30JIZkG9Q7pGmiOe9+22YjlCwILj26TbxDWb8MLwu9AnAwYTJUYQE8dImxhS5XNA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"Zl/K0SiSnIv00hGqAC6vfX3BLxwvZveGBn8wM1A7ZLUtTGe1FbmtePGDqvcYiA5F8yvpPoLOjTC+CUPlwv8ntg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g17mcgfu6l805mx7hz2evs7pz7228r0c2e0vw6ug","amount":"12000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"aNRDGOiLVJt2DMwwLxE7naXrJcLg+8J0ms+pDhrr1hQFOP1YKNn3p6deClbVnk0p1W3mVI0P5LwM62gQrBlXHQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"C2UtkhVG2sOGdeVMmxvZxVeOSHua//1U/wF8eqRFOoZRW3Yo3U2ZJacP6qG57T3wRbNmCvjXxnL99TxbUMTdEQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"viEChJAkUu2lklKM/kk+/sDBxP4Ql41d4ZtaRCUmpGxn1FvlZsmUa/Hsg07qiGM+/kMOnV89uSJ26YUv0t9SsA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"pGUJ8cgZO50nF/jGCfa7+sEAVnXYf6bTMQF6TKrWfRlwvKeOTHxgPaf7lCjuKpu95iRENdZiJW0dcoioanPtFQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"zEhHkURKH1b0V3K3IPz+D9wYVOSHL8gHrjbYMkgu2V81MSfD5Cx2o/AScCtGJvqqoeweEX8Tlfb2GcEsi2T2/Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"ao7FVFTYmb8UiLE1SlkEMEDMBL38PfNf1zVeUWVyCBwYJ9hBCsDdflO+cEfLr7F3VXwm2IzWA9Ggrr60sHHxFA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"taqTXWQ8WLuCSce/bIAnz/xfFei7dPzOfon5xRKu5dhDxCD5H5uVLbw9dY0Wv4YTyuWNEkHJIsv/WH9Z2T9aoQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","to_address":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","amount":"2000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"qKSEuiaBbdfnhn9yl4b0+lt8+KwzcE/slQ1rSqWd1dEhNWUAnoolZ1oNU6+Vmqxx6JiGTCOxWprbfeHWTH1JZQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1lafcru2z2qelxr33gm4znqshmpur6l9sl3g2aw","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"zutQ+wPkGDq8ZnxxbGGvuxHjbgH3Ftaf4NADd6VKYp5D4lrfhvqJZI1z9He/B3gnYyBMjULl4Qkrdo/4mvriHQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1lafcru2z2qelxr33gm4znqshmpur6l9sl3g2aw","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"maXlCvl9Mz4vI1f75PnQM5pI3KyEolFYwQUu/a7SwM5MHdC8evEsBFqrcqpyun9bEzWZXlba0yOfmjYucaHXMA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1lafcru2z2qelxr33gm4znqshmpur6l9sl3g2aw","send":"","pkg_path":"gno.land/r/demo/userbook","func":"SignUp","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6xHVcaYXoS5In1L7/aMel8NjjzREYl39IHgrowBLWlK"},"signature":"QroOKXDgHPbE7uXJ9F9VHqz1Z5hoA0ffcjqmh8Dnte1H+XivhRZtfqrOzyv9vNAZOy89M/sSw8ItbtUj18Pu4g=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1w4qqmxdk59xsh3x5hnp2z78s4ymyva8pnenfem","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"VHIHY1epyfwHORbLAHP7zcwYFxTBDD3ljDvFT4WPO+EmjsSsQoj9GtkTE7zhFtY+PV68DbHetp1D7F/liPR2OA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"100ugnot","pkg_path":"gno.land/r/demo/wugnot","func":"BalanceOf","args":["g125em6arxsnj49vx35f0n0z34putv5ty3376fg5"]}],"fee":{"gas_wanted":"200000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"xjAuv9ToraCcx9uA1knXaokUG+2CaHTCzmI0bBCeFMAj7A+bjTq8jSZJu70d1OKKVS0D/ZV4evGBT4qhAIqGjA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"100ugnot","pkg_path":"gno.land/r/demo/wugnot","func":"BalanceOf","args":["g125em6arxsnj49vx35f0n0z34putv5ty3376fg5"]}],"fee":{"gas_wanted":"2000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"RiqebkIoy7mQpIqsS8tL8cpRA6g+UfufdCdpswXMZNQnB3Gbz0dLlQuWAHyRJDZcQ7tH/J8renD4yzxx4pqwTA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"1234ugnot","pkg_path":"gno.land/r/demo/wugnot","func":"Deposit","args":null}],"fee":{"gas_wanted":"200000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"rHdctv4dgElebu1L3254wB7zY/FNR0b/hixoP32MUKJNI7VHvBcoMs6LwfKPpzNRz1PC8wuY64alu2UI//sJ7A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"1234ugnot","pkg_path":"gno.land/r/demo/wugnot","func":"Deposit","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"1VqHzJ1H3fudoYITGZeZtrypldI4+I5jLyZkqOJk6Rh0TSdeoVgOvkwhDY1NKSvSVIgcUCzx7YkKwjtKKbj3jA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"100ugnot","pkg_path":"gno.land/r/demo/wugnot","func":"BalanceOf","args":["g125em6arxsnj49vx35f0n0z34putv5ty3376fg5"]}],"fee":{"gas_wanted":"2000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"Raquo6R01WW6cooy1jH1kroNWk6+0pgrxbDNKdQ8T5dVcP9PQ9hXYHD/HvcUee7DYuqnPUDFAAOZbFdK4ZuZXg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"1000ugnot","pkg_path":"gno.land/r/demo/wugnot","func":"Deposit","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"AFFH5cbsXWOso2R6E/xAAgPOPV5oPzbvuDjMpJ1a7oVopa5RHCm38UMtkxZk7slfGBJt6X74iJt0uwX15Gpayw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lafcru2z2qelxr33gm4znqshmpur6l9sl3g2aw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6xHVcaYXoS5In1L7/aMel8NjjzREYl39IHgrowBLWlK"},"signature":"ltpRXstaG6+dpRNkXDkykU+fsjykya1lCYZajUjn4TF3tqPVILkW2GxBpa0b7ukadw98TEMVjLEHjdPUDS2BpQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lafcru2z2qelxr33gm4znqshmpur6l9sl3g2aw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6xHVcaYXoS5In1L7/aMel8NjjzREYl39IHgrowBLWlK"},"signature":"rwndjSHqfR/vS21Y+dyhi/gEon6gEXw1i9LH71p2KBE9MFEPr7D29uXUzdLAtPl1XugYvNbKI8iReObR80bQ/g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1lafcru2z2qelxr33gm4znqshmpur6l9sl3g2aw","send":"","pkg_path":"gno.land/r/demo/userbook","func":"SignUp","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6xHVcaYXoS5In1L7/aMel8NjjzREYl39IHgrowBLWlK"},"signature":"Gw06VP30/CRaTdLviWAWI/ep5vNSTWp09nroomzpqR8lLN/rOyWROwwxuJfGVIQw9sqlQV/a9t/kiuubkVPTbw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","gnoport-13","😀","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"TN+ZdYnDz0pKgP52IJoveTivzzsowsTUvKLDkomq3WJU3KHSyqHP5FiWX8/E7DkmlzZjg7GR0bU7neIIKzZzXA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1uf8u5jf2m9l80g0zsfq7tufl3qufqc4393jtkl","send":"","pkg_path":"gno.land/r/demo/userbook","func":"SignUp","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AitYIWT3az4Jx3hGzTapJ6hyalJ6EYgqQCpYoe7Gx2Sw"},"signature":"kg7NYFE+r1LxcNIGi9UQRYh8TPLKjL8CceEq88KdUSkpURWFCD1mRgPW+q4C5eexvhRb+FtVxsJngbMgyA0r6w=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1yr6mh5k8cjdkrjcmp5mu2przkgjf5265umzj3t","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g+K7RF1FCBRUAzwlJynCXoIW7q5uN/bb4FdwLQOPxCRDDLTsN7/Sd2p1lx1dexwzGM9cdAbZhTd4M7sYnmVBKg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"fzAMS2IM8uCIp1bzXrIoKjAzqoxBaIiv4aLJh61Vx8RZbQDe17G0zzqOR/fhD4aEFdH4RqhVDt98TivMfJ3O2w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"2XRxnAX6CQvpy5vvZ34hIE/CoKh2tjVhJK9PB7IFT8sJUFH889WHx/zl61+MDT2HOhebttUEpbuAW6r3M9rIBg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"iMlCgja5LrW1PgGSZVwnuOMrsGFVBFgPg5M9N2pGZpEoApdMHs6O72NagGA5xm0Dyj22Akhm4ltn7R1wZ1I8sQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"IzztoCRbEminwAeusCOJiw30JIZkG9Q7pGmiOe9+22YjlCwILj26TbxDWb8MLwu9AnAwYTJUYQE8dImxhS5XNA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"Zl/K0SiSnIv00hGqAC6vfX3BLxwvZveGBn8wM1A7ZLUtTGe1FbmtePGDqvcYiA5F8yvpPoLOjTC+CUPlwv8ntg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g17mcgfu6l805mx7hz2evs7pz7228r0c2e0vw6ug","amount":"12000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"aNRDGOiLVJt2DMwwLxE7naXrJcLg+8J0ms+pDhrr1hQFOP1YKNn3p6deClbVnk0p1W3mVI0P5LwM62gQrBlXHQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"C2UtkhVG2sOGdeVMmxvZxVeOSHua//1U/wF8eqRFOoZRW3Yo3U2ZJacP6qG57T3wRbNmCvjXxnL99TxbUMTdEQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"viEChJAkUu2lklKM/kk+/sDBxP4Ql41d4ZtaRCUmpGxn1FvlZsmUa/Hsg07qiGM+/kMOnV89uSJ26YUv0t9SsA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"pGUJ8cgZO50nF/jGCfa7+sEAVnXYf6bTMQF6TKrWfRlwvKeOTHxgPaf7lCjuKpu95iRENdZiJW0dcoioanPtFQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"zEhHkURKH1b0V3K3IPz+D9wYVOSHL8gHrjbYMkgu2V81MSfD5Cx2o/AScCtGJvqqoeweEX8Tlfb2GcEsi2T2/Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"ao7FVFTYmb8UiLE1SlkEMEDMBL38PfNf1zVeUWVyCBwYJ9hBCsDdflO+cEfLr7F3VXwm2IzWA9Ggrr60sHHxFA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"taqTXWQ8WLuCSce/bIAnz/xfFei7dPzOfon5xRKu5dhDxCD5H5uVLbw9dY0Wv4YTyuWNEkHJIsv/WH9Z2T9aoQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","to_address":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","amount":"2000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"qKSEuiaBbdfnhn9yl4b0+lt8+KwzcE/slQ1rSqWd1dEhNWUAnoolZ1oNU6+Vmqxx6JiGTCOxWprbfeHWTH1JZQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1lafcru2z2qelxr33gm4znqshmpur6l9sl3g2aw","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"zutQ+wPkGDq8ZnxxbGGvuxHjbgH3Ftaf4NADd6VKYp5D4lrfhvqJZI1z9He/B3gnYyBMjULl4Qkrdo/4mvriHQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1lafcru2z2qelxr33gm4znqshmpur6l9sl3g2aw","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"maXlCvl9Mz4vI1f75PnQM5pI3KyEolFYwQUu/a7SwM5MHdC8evEsBFqrcqpyun9bEzWZXlba0yOfmjYucaHXMA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1lafcru2z2qelxr33gm4znqshmpur6l9sl3g2aw","send":"","pkg_path":"gno.land/r/demo/userbook","func":"SignUp","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6xHVcaYXoS5In1L7/aMel8NjjzREYl39IHgrowBLWlK"},"signature":"QroOKXDgHPbE7uXJ9F9VHqz1Z5hoA0ffcjqmh8Dnte1H+XivhRZtfqrOzyv9vNAZOy89M/sSw8ItbtUj18Pu4g=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1w4qqmxdk59xsh3x5hnp2z78s4ymyva8pnenfem","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"VHIHY1epyfwHORbLAHP7zcwYFxTBDD3ljDvFT4WPO+EmjsSsQoj9GtkTE7zhFtY+PV68DbHetp1D7F/liPR2OA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"100ugnot","pkg_path":"gno.land/r/demo/wugnot","func":"BalanceOf","args":["g125em6arxsnj49vx35f0n0z34putv5ty3376fg5"]}],"fee":{"gas_wanted":"200000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"xjAuv9ToraCcx9uA1knXaokUG+2CaHTCzmI0bBCeFMAj7A+bjTq8jSZJu70d1OKKVS0D/ZV4evGBT4qhAIqGjA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"100ugnot","pkg_path":"gno.land/r/demo/wugnot","func":"BalanceOf","args":["g125em6arxsnj49vx35f0n0z34putv5ty3376fg5"]}],"fee":{"gas_wanted":"2000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"RiqebkIoy7mQpIqsS8tL8cpRA6g+UfufdCdpswXMZNQnB3Gbz0dLlQuWAHyRJDZcQ7tH/J8renD4yzxx4pqwTA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"1234ugnot","pkg_path":"gno.land/r/demo/wugnot","func":"Deposit","args":null}],"fee":{"gas_wanted":"200000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"rHdctv4dgElebu1L3254wB7zY/FNR0b/hixoP32MUKJNI7VHvBcoMs6LwfKPpzNRz1PC8wuY64alu2UI//sJ7A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"1234ugnot","pkg_path":"gno.land/r/demo/wugnot","func":"Deposit","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"1VqHzJ1H3fudoYITGZeZtrypldI4+I5jLyZkqOJk6Rh0TSdeoVgOvkwhDY1NKSvSVIgcUCzx7YkKwjtKKbj3jA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"100ugnot","pkg_path":"gno.land/r/demo/wugnot","func":"BalanceOf","args":["g125em6arxsnj49vx35f0n0z34putv5ty3376fg5"]}],"fee":{"gas_wanted":"2000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"Raquo6R01WW6cooy1jH1kroNWk6+0pgrxbDNKdQ8T5dVcP9PQ9hXYHD/HvcUee7DYuqnPUDFAAOZbFdK4ZuZXg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"1000ugnot","pkg_path":"gno.land/r/demo/wugnot","func":"Deposit","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"AFFH5cbsXWOso2R6E/xAAgPOPV5oPzbvuDjMpJ1a7oVopa5RHCm38UMtkxZk7slfGBJt6X74iJt0uwX15Gpayw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lafcru2z2qelxr33gm4znqshmpur6l9sl3g2aw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6xHVcaYXoS5In1L7/aMel8NjjzREYl39IHgrowBLWlK"},"signature":"ltpRXstaG6+dpRNkXDkykU+fsjykya1lCYZajUjn4TF3tqPVILkW2GxBpa0b7ukadw98TEMVjLEHjdPUDS2BpQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lafcru2z2qelxr33gm4znqshmpur6l9sl3g2aw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6xHVcaYXoS5In1L7/aMel8NjjzREYl39IHgrowBLWlK"},"signature":"rwndjSHqfR/vS21Y+dyhi/gEon6gEXw1i9LH71p2KBE9MFEPr7D29uXUzdLAtPl1XugYvNbKI8iReObR80bQ/g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1lafcru2z2qelxr33gm4znqshmpur6l9sl3g2aw","send":"","pkg_path":"gno.land/r/demo/userbook","func":"SignUp","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6xHVcaYXoS5In1L7/aMel8NjjzREYl39IHgrowBLWlK"},"signature":"Gw06VP30/CRaTdLviWAWI/ep5vNSTWp09nroomzpqR8lLN/rOyWROwwxuJfGVIQw9sqlQV/a9t/kiuubkVPTbw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15q2qzdx4w4dh8znz0fugpszxxnezjuf34fq508","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0/s949DuQv5y2Bq7RrrfEm7tytLGlLQ7Vz3uVgnRz00WlAR7SqCGLir5hsffQWWU2cdqwHH5pfHCzHZvwphWAw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dvfhkhjp0qgrrm4tr065aqz6ntjs0qr7rtmxuu","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"u+0F/OvTPhyjOTTr1SwB+1NeysAdKqfzHji5ELb9ee5LqEep+Mnw0XXbkp4wCOKqcBFWLdf7rwlJFNKLce58/w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","gnoport-13","😀","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"TN+ZdYnDz0pKgP52IJoveTivzzsowsTUvKLDkomq3WJU3KHSyqHP5FiWX8/E7DkmlzZjg7GR0bU7neIIKzZzXA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1uf8u5jf2m9l80g0zsfq7tufl3qufqc4393jtkl","send":"","pkg_path":"gno.land/r/demo/userbook","func":"SignUp","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AitYIWT3az4Jx3hGzTapJ6hyalJ6EYgqQCpYoe7Gx2Sw"},"signature":"kg7NYFE+r1LxcNIGi9UQRYh8TPLKjL8CceEq88KdUSkpURWFCD1mRgPW+q4C5eexvhRb+FtVxsJngbMgyA0r6w=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1yr6mh5k8cjdkrjcmp5mu2przkgjf5265umzj3t","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g+K7RF1FCBRUAzwlJynCXoIW7q5uN/bb4FdwLQOPxCRDDLTsN7/Sd2p1lx1dexwzGM9cdAbZhTd4M7sYnmVBKg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"fzAMS2IM8uCIp1bzXrIoKjAzqoxBaIiv4aLJh61Vx8RZbQDe17G0zzqOR/fhD4aEFdH4RqhVDt98TivMfJ3O2w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"2XRxnAX6CQvpy5vvZ34hIE/CoKh2tjVhJK9PB7IFT8sJUFH889WHx/zl61+MDT2HOhebttUEpbuAW6r3M9rIBg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"iMlCgja5LrW1PgGSZVwnuOMrsGFVBFgPg5M9N2pGZpEoApdMHs6O72NagGA5xm0Dyj22Akhm4ltn7R1wZ1I8sQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"IzztoCRbEminwAeusCOJiw30JIZkG9Q7pGmiOe9+22YjlCwILj26TbxDWb8MLwu9AnAwYTJUYQE8dImxhS5XNA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"Zl/K0SiSnIv00hGqAC6vfX3BLxwvZveGBn8wM1A7ZLUtTGe1FbmtePGDqvcYiA5F8yvpPoLOjTC+CUPlwv8ntg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g17mcgfu6l805mx7hz2evs7pz7228r0c2e0vw6ug","amount":"12000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"aNRDGOiLVJt2DMwwLxE7naXrJcLg+8J0ms+pDhrr1hQFOP1YKNn3p6deClbVnk0p1W3mVI0P5LwM62gQrBlXHQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"C2UtkhVG2sOGdeVMmxvZxVeOSHua//1U/wF8eqRFOoZRW3Yo3U2ZJacP6qG57T3wRbNmCvjXxnL99TxbUMTdEQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"viEChJAkUu2lklKM/kk+/sDBxP4Ql41d4ZtaRCUmpGxn1FvlZsmUa/Hsg07qiGM+/kMOnV89uSJ26YUv0t9SsA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"pGUJ8cgZO50nF/jGCfa7+sEAVnXYf6bTMQF6TKrWfRlwvKeOTHxgPaf7lCjuKpu95iRENdZiJW0dcoioanPtFQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"zEhHkURKH1b0V3K3IPz+D9wYVOSHL8gHrjbYMkgu2V81MSfD5Cx2o/AScCtGJvqqoeweEX8Tlfb2GcEsi2T2/Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"ao7FVFTYmb8UiLE1SlkEMEDMBL38PfNf1zVeUWVyCBwYJ9hBCsDdflO+cEfLr7F3VXwm2IzWA9Ggrr60sHHxFA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"taqTXWQ8WLuCSce/bIAnz/xfFei7dPzOfon5xRKu5dhDxCD5H5uVLbw9dY0Wv4YTyuWNEkHJIsv/WH9Z2T9aoQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","to_address":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","amount":"2000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"qKSEuiaBbdfnhn9yl4b0+lt8+KwzcE/slQ1rSqWd1dEhNWUAnoolZ1oNU6+Vmqxx6JiGTCOxWprbfeHWTH1JZQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1lafcru2z2qelxr33gm4znqshmpur6l9sl3g2aw","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"zutQ+wPkGDq8ZnxxbGGvuxHjbgH3Ftaf4NADd6VKYp5D4lrfhvqJZI1z9He/B3gnYyBMjULl4Qkrdo/4mvriHQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1lafcru2z2qelxr33gm4znqshmpur6l9sl3g2aw","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"maXlCvl9Mz4vI1f75PnQM5pI3KyEolFYwQUu/a7SwM5MHdC8evEsBFqrcqpyun9bEzWZXlba0yOfmjYucaHXMA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1lafcru2z2qelxr33gm4znqshmpur6l9sl3g2aw","send":"","pkg_path":"gno.land/r/demo/userbook","func":"SignUp","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6xHVcaYXoS5In1L7/aMel8NjjzREYl39IHgrowBLWlK"},"signature":"QroOKXDgHPbE7uXJ9F9VHqz1Z5hoA0ffcjqmh8Dnte1H+XivhRZtfqrOzyv9vNAZOy89M/sSw8ItbtUj18Pu4g=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1w4qqmxdk59xsh3x5hnp2z78s4ymyva8pnenfem","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"VHIHY1epyfwHORbLAHP7zcwYFxTBDD3ljDvFT4WPO+EmjsSsQoj9GtkTE7zhFtY+PV68DbHetp1D7F/liPR2OA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"100ugnot","pkg_path":"gno.land/r/demo/wugnot","func":"BalanceOf","args":["g125em6arxsnj49vx35f0n0z34putv5ty3376fg5"]}],"fee":{"gas_wanted":"200000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"xjAuv9ToraCcx9uA1knXaokUG+2CaHTCzmI0bBCeFMAj7A+bjTq8jSZJu70d1OKKVS0D/ZV4evGBT4qhAIqGjA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"100ugnot","pkg_path":"gno.land/r/demo/wugnot","func":"BalanceOf","args":["g125em6arxsnj49vx35f0n0z34putv5ty3376fg5"]}],"fee":{"gas_wanted":"2000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"RiqebkIoy7mQpIqsS8tL8cpRA6g+UfufdCdpswXMZNQnB3Gbz0dLlQuWAHyRJDZcQ7tH/J8renD4yzxx4pqwTA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"1234ugnot","pkg_path":"gno.land/r/demo/wugnot","func":"Deposit","args":null}],"fee":{"gas_wanted":"200000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"rHdctv4dgElebu1L3254wB7zY/FNR0b/hixoP32MUKJNI7VHvBcoMs6LwfKPpzNRz1PC8wuY64alu2UI//sJ7A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"1234ugnot","pkg_path":"gno.land/r/demo/wugnot","func":"Deposit","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"1VqHzJ1H3fudoYITGZeZtrypldI4+I5jLyZkqOJk6Rh0TSdeoVgOvkwhDY1NKSvSVIgcUCzx7YkKwjtKKbj3jA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"100ugnot","pkg_path":"gno.land/r/demo/wugnot","func":"BalanceOf","args":["g125em6arxsnj49vx35f0n0z34putv5ty3376fg5"]}],"fee":{"gas_wanted":"2000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"Raquo6R01WW6cooy1jH1kroNWk6+0pgrxbDNKdQ8T5dVcP9PQ9hXYHD/HvcUee7DYuqnPUDFAAOZbFdK4ZuZXg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"1000ugnot","pkg_path":"gno.land/r/demo/wugnot","func":"Deposit","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"AFFH5cbsXWOso2R6E/xAAgPOPV5oPzbvuDjMpJ1a7oVopa5RHCm38UMtkxZk7slfGBJt6X74iJt0uwX15Gpayw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lafcru2z2qelxr33gm4znqshmpur6l9sl3g2aw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6xHVcaYXoS5In1L7/aMel8NjjzREYl39IHgrowBLWlK"},"signature":"ltpRXstaG6+dpRNkXDkykU+fsjykya1lCYZajUjn4TF3tqPVILkW2GxBpa0b7ukadw98TEMVjLEHjdPUDS2BpQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lafcru2z2qelxr33gm4znqshmpur6l9sl3g2aw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6xHVcaYXoS5In1L7/aMel8NjjzREYl39IHgrowBLWlK"},"signature":"rwndjSHqfR/vS21Y+dyhi/gEon6gEXw1i9LH71p2KBE9MFEPr7D29uXUzdLAtPl1XugYvNbKI8iReObR80bQ/g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1lafcru2z2qelxr33gm4znqshmpur6l9sl3g2aw","send":"","pkg_path":"gno.land/r/demo/userbook","func":"SignUp","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6xHVcaYXoS5In1L7/aMel8NjjzREYl39IHgrowBLWlK"},"signature":"Gw06VP30/CRaTdLviWAWI/ep5vNSTWp09nroomzpqR8lLN/rOyWROwwxuJfGVIQw9sqlQV/a9t/kiuubkVPTbw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15q2qzdx4w4dh8znz0fugpszxxnezjuf34fq508","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0/s949DuQv5y2Bq7RrrfEm7tytLGlLQ7Vz3uVgnRz00WlAR7SqCGLir5hsffQWWU2cdqwHH5pfHCzHZvwphWAw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dvfhkhjp0qgrrm4tr065aqz6ntjs0qr7rtmxuu","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"u+0F/OvTPhyjOTTr1SwB+1NeysAdKqfzHji5ELb9ee5LqEep+Mnw0XXbkp4wCOKqcBFWLdf7rwlJFNKLce58/w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["gno-studio-intro","Introducing Gno Studio, the Premier Builder Suite for Gno.land","\n\n[![introduction-banner](https://gnolang.github.io/blog/2024-05-14_gno-studio-intro/src/thumbs/introducing-gnostudio.png)](https://gnolang.github.io/blog/2024-05-14_gno-studio-intro/src/introducing-gnostudio.png)\n\nExceptional developer experience is integral to the Gno ecosystem, shaping the \nspecial programming language, Gno, and guiding the features of Gno.land. The\ntechnology stack is designed to offer developers an unparalleled platform for \ncrafting next-generation dApps via realms (smart contracts).\n\nAs Gno.land expands into a universe of realms, development tools become \ninstrumental to enable innovation and ingenuity. To fully realize this vision,\nwe are creating Gno Studio, empowering community members to create and use \nsuccinct and composable realms on Gno.land.\n\n## The Gno Studio Developer Experience\n\nThe [Gno Studio](https://gno.studio/) suite will offer extensive builder tools tailored \nfor Gno.land. The design of Gno Studio is intended to cater to a wide range of \nusers, from experienced builders to non-coders, by simplifying and enhancing the \nprocess of launching any realm or application you can imagine. Initially, Gno \nStudio started as a proof of concept IDE (Integrated Development Environment). \nEventually, this evolved into a vision for a comprehensive suite of apps and \nservices — Gno Studio — designed to elevate the developer experience to new \nheights and meet users’ and builders’ current needs and expectations.\n\nAt the end of last year, we launched the first beta application of the Gno \nStudio suite, [Gno Playground](https://play.gno.land/), as part of the Gno.land brand. The \nofficial Playground of Gno.land is a minimalistic IDE that facilitates the \ncreation, testing, deployment, and sharing of Gno code. It is a powerful tool \ndesigned to simplify the development of packages and realms, lowering the barrier\nto entry for new builders and enhancing the productivity of advanced Go developers.\n\n**Today, we are excited to announce the beta release of Gno Studio Connect, the \nsecond application in the Gno Studio suite.**\n\n## Your Gateway to Experience the Power of Realms\n\n[![beta-launch-banner](https://gnolang.github.io/blog/2024-05-14_gno-studio-intro/src/thumbs/beta-launch.png)](https://gnolang.github.io/blog/2024-05-14_gno-studio-intro/src/beta-launch.png)\n\nGno Studio Connect is a tool that simplifies access and interaction with realm \nfunctions. Whether you’re exploring realms like the Gno.land [blog](https://gno.land/r/gnoland/blog), \nengaging with a realm deployed through the [Gno Playground](https://play.gno.land/), or using a \ntool like [gnokey](https://docs.gno.land/gno-tooling/cli/gno-tooling-gnokey/), Connect makes interaction easy.\n\nThe initial version of Connect focuses on function calls, enabling users to \ninteract with any realm’s exposed function(s) on Gno.land. Function calls are \nperformed through your account using any wallet that supports Gno.land \n(currently, [Adena](https://www.adena.app/) is the only supported wallet.) Let’s discuss the\nfeature set:\n\n- **Access**: Directly input a realm path and select the corresponding network \nin the interface for seamless navigation to your realm.\n- **Explore**: Discover the available functions of any realm and their details \nthrough a dedicated function list.\n- **Interact**: Swiftly make calls through a dedicated function interface by \nselecting a specific function in the realm’s function list.\n- **Evaluate**: Review and analyze the outcomes of your interactions with realm\nfunctions by assessing results and determine any further actions required.\n- **Share:** Copy links to realms, functions and results and share with \nanyone, making it easy to request engagement on a realm or feedback on a specific function.\n- **Track**: Keep track of your previous realm interactions, where you can view \nthe results of your function calls and revisit their results through a historical overview.\n\n## Get Started with Connect: Vote in a Simple Poll\n\n[![vote-gnoyourdate](https://gnolang.github.io/blog/2024-05-14_gno-studio-intro/src/thumbs/vote-gnoyourdate.png)](https://gnolang.github.io/blog/2024-05-14_gno-studio-intro/src/vote-gnoyourdate.png)\n\nLet’s dive into a hands-on example with a simple polling realm. First, click \n[here](https://gno.studio/connect/view/gno.land/r/gnostudio/gnoyourdate?network=test3#Vote) to access the ‘gnoyourdate’ poll. Once you’ve ensured that Adena \nwallet is connected, here’s what to do next: \n\n1. Select when you first heard about Gno.land: \n _Ensure your chosen option is marked as 'True (Yes)' and all others as 'False (No)' to validate your vote._\n - This month \n - This year \n - One or two years ago \n - Since inception\n2. After making your selection, hit the ‘Call’ button to execute the transaction\nvia your [Adena wallet](https://www.adena.app/). If you need help getting set up,\nyou can visit the [Adena docs](https://docs.adena.app/user-guide/sign-in). \n3. You’re ready to share your vote! Click ‘Copy result link’ and post it on X,\ntagging [@_gnostudio](https://twitter.com/_gnostudio) and using the hashtag #gnoyourdate. \n\n## Share Your Feedback on Connect\n\nWe value your input as we continue developing Gno Studio. Please contribute to\nour improvement efforts by interacting with our feedback form created as a realm.\nUse the ‘[SubmitFeedback](https://gno.studio/connect/view/gno.land/r/gnostudio/feedback_v1?network=test3\u0026tab=functions#SubmitFeedback)’ function to share your feedback with us.\n\nIf you have questions or comments, hop over to the [Gno.land Discord](https://discord.gg/FpKNhW5GK6) and \nfollow us on [X](https://twitter.com/_gnostudio) for updates and discussions.\n\n## The Gno Studio Outlook\n\nThe outlook for Gno Studio is full speed ahead with a roadmap bursting with \nexciting features and tools. We will continue to transition the beta applications,\nGno Playground and Gno Studio Connect, into their production versions while \nfocusing on the development of the next set of tooling.\n\nDevelopment is already underway on a full-featured IDE that will provide a \nstate-of-the-art workspace designed for realm and package development on Gno.land.\nThe IDE will consist of an advanced code editor, debugging tools, and a dedicated \nproject management and deployment environment.\n\nThe next piece of the puzzle is a marketplace with ready-to-use templates that \nmake creating apps more accessible to everyone. This collection of boilerplate \ncode is targeted at speeding up deployment timelines and allowing non-coders to \ntry their hand at launching realms without needing to worry about technical \ndetails.\n\nThe production-ready Gno Studio suite will help and inspire everyone with an idea,\ncoders and non-coders alike, to participate in the exciting innovations of Web3 \nspurred by the next generation of realm applications on Gno.land.\n\nIf you want to *stay in the gno* about all the Gno Studio developments and news,\n[sign up](https://gno.studio/) for our mailing list. You can also follow us on [X](https://twitter.com/_gnostudio).\n","2024-05-14T13:37:00Z","gno-studio","gnoland,gnostudio,web3,blockchain,smart-contracts"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"iERlOpwiJr151VMCPbVVMRelmI3o5G9CVlPZ7CpVr55TOblPlg2h2a+yfdh8mFq0yxz+swcQvw7BniABKnHwjA=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"ieoXs1JDH8lXmPuytjV1zw54VZl9ZE+lWTpxE1Fg4hJJHS2rniRL77f8m+jbZSCwpTjCmdlF78zo307RLaGEkw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"2DHj1ixRc26xUFzCNtXfeHGAFy2lGjbp5kw34oM98H5xMdDre8ADk747ZHP5DkmAlqWqIRFSkGeptAMjMSZsTw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","to_address":"g17mcgfu6l805mx7hz2evs7pz7228r0c2e0vw6ug","amount":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"shd9b6RmVz5u5WHd6psK3SEWOf7rBSBYKD/LtgrPa20JDubSap2PIfuC4e4ij0HtcM30tB9XRmvy5JK2Oi3VQQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1v664qx78zhv2edtx6ypdylfpafrqjz8g2rlaea","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"An36kfJTFLYv6qJ18qs3TguyUwiALNgLeCPHsZjzhSdI"},"signature":"VGLgWB8h0Z8Ij368+p3/lA9l3vpfgAoz9kU/GAzPcCREVW1/w+lDZdZzquZxCI5Nd9ofUuc34FydiHe/eYGneA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1v664qx78zhv2edtx6ypdylfpafrqjz8g2rlaea","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"An36kfJTFLYv6qJ18qs3TguyUwiALNgLeCPHsZjzhSdI"},"signature":"Bcc4zHPRwNfdbPtjbGU1GhPAc6WyQBuiQZPqchhtHDtPo/s1Hms3PUxbYbX5Ia6JL4gZXgh29gG7nqyBPP8X5Q=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g18lj5pgadp3y98wawweavle2r0677w9z25zmnm0","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"nWN2nYyu0y/4tmx9aR9Ar2EkTJfWK8Un236itvGM67R0AR4HVpbLf24DLWuqQ5bU8j25Y9BzV6VNEqoh1MZTrg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g18lj5pgadp3y98wawweavle2r0677w9z25zmnm0","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7F3+SG0EvfD9EoMgxL8VSOFIb+XlP7eI0SIbyQYrAmF"},"signature":"FMVtJvVgcXCSI5H9sit5BiceAoEXSXCBBH6VD1JiKVc8q+hUWjeM/5IzESS6MHXSIGv1GdJ6g/qLzvxi9LO0+Q=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lafcru2z2qelxr33gm4znqshmpur6l9sl3g2aw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6xHVcaYXoS5In1L7/aMel8NjjzREYl39IHgrowBLWlK"},"signature":"D3sMSQ990bSs9iodfXZg0dysb0BNMWIWHFct2vQE9eBI3yabiRVEUMZZg9fV0Lm4F6ykE0BrXfezzmkhaFtkdw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lafcru2z2qelxr33gm4znqshmpur6l9sl3g2aw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6xHVcaYXoS5In1L7/aMel8NjjzREYl39IHgrowBLWlK"},"signature":"uQofVBJYQYlXNaxWKnoBlMBJzH+iuQFBski7sBSuZDEd5wEPeWzskkAkaF/+wE1sbAw36I1nKeiMVSkTajqL+g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lafcru2z2qelxr33gm4znqshmpur6l9sl3g2aw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6xHVcaYXoS5In1L7/aMel8NjjzREYl39IHgrowBLWlK"},"signature":"nd/0Y8I4chELeBuh7Qp99GQ4BE4RTvwpmHAV19Hq9YIapHd7wHel9XSsUlB+nuYZCuMf7n8O1eSPxf15jxMdMQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lafcru2z2qelxr33gm4znqshmpur6l9sl3g2aw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6xHVcaYXoS5In1L7/aMel8NjjzREYl39IHgrowBLWlK"},"signature":"uiHTHrwAn1PfZHfPO+2jorRkr8MtC1Lv3cFx+0OJm1tc2IymtJwqcT+MpuEjFLx/N6YOB/KmczTGbtdd5c37wg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lafcru2z2qelxr33gm4znqshmpur6l9sl3g2aw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6xHVcaYXoS5In1L7/aMel8NjjzREYl39IHgrowBLWlK"},"signature":"U0dALigRx9Ab6mwj4T8+D5CXgGl+VotdmxPZPOrJeHoKkkBMsZUtzTex5ZLT6E+xKAkfnc7WYkojg5h6i0keaw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lafcru2z2qelxr33gm4znqshmpur6l9sl3g2aw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6xHVcaYXoS5In1L7/aMel8NjjzREYl39IHgrowBLWlK"},"signature":"lePXpqvbmIiBjQwPC1KMzI1JpMd8BcRWlNnL4Rj6jENrS1/aoKhoRw6MIdwIZSfsr4JAPFQbf2rDa3MoUNp51g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lafcru2z2qelxr33gm4znqshmpur6l9sl3g2aw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6xHVcaYXoS5In1L7/aMel8NjjzREYl39IHgrowBLWlK"},"signature":"dXsWELEo6+RvqULNi1fZihcurBJFLt6rILTqtGXVS7lfFi1Y7Wu25caG6+6VJE2Iueop0rPAFmyOFYZ6h9/sqw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["gnomes-in-serbia","Gnomes Spotted in Belgrade, Serbia: Recap from the Engineering Retreat and Golang Serbia Meetup","\n\nDobro jutro gnomes! Last week, the Gno core engineering team convened in Belgrade,\nSerbia, to discuss various aspects of our technical roadmap, including Test4, \nblockchainless Gno, Gnoweb, governance and DAO structuring, GnoVM, and more. \nWhile the team was in town, we took the chance to host a Gno @ Golang Serbia \nmeetup titled ‘Building Dynamic Applications with Interpreted Go’ - you can catch \nthe recording of the full presentation [here](https://youtu.be/tNM1DHOxIQ8).\n\n## Engineering Retreat Recap\n\nOver five full days of coding and workshops, the Gno core engineering team delved \ninto several critical topics and emerged with several key takeaways:\n- Test4 Progress:\n - Test4 has been the primary effort for the team in the past couple of months, \naiming to create a stable multi-node testnet which will serve as the last precursor\nto Gno.land’s upcoming mainnet. Discussions revolved around chain initialization \nflows, node metrics \u0026 telemetry, versioning of binaries, adding a way to modify \nthe validator set via a realm (r/sys/vals), and more. Currently, the \n[Test4 milestone](https://github.com/gnolang/gno/milestone/4) is 62% complete.\n- Blockchainless Gno:\n - With the upcoming GopherCon EU \u0026 US conferences, the team discussed a \ndifferent perspective on Gno - a fully functional Go interpreter with automatic \nstate persistence. The team aims to modularize the GnoVM so that it can be\nused in contexts outside the Gno.land blockchain, which will open up the\necosystem to completely new use-cases, inviting even more web2 developers to \njoin our mission.\n- Gnoweb Enhancements:\n - [gnoweb](https://docs.gno.land/getting-started/local-setup/browsing-gnoland#2-browsing-gnoland) serves as one of the main tools to explore the Gno.land \necosystem. The team discussed changes to the UI as well as improving gnoweb’s \nfunctionalities such as the rendering of realm state \u0026 source code, and possible\napproaches to add more ways to interact with on-chain apps.\n- Governance and DAO Structuring:\n - Discussions relating to GovDAO and WorxDAO took place during the retreat, as \nthey are the foundation for Gno.land’s consensus mechanism - Proof of Contribution.\nManfred Touron, Gno.land’s VP of Engineering, discussed the \n[initial implementation](https://github.com/gnolang/gno/pull/1945) of GovDAO and\nits surrounding infrastructure.\n- GnoVM \u0026 Gno.land Development:\n - The team took the opportunity to deal with priority PRs during the retreat, \nsuch as the [Gno Type Check PR](https://github.com/gnolang/gno/pull/1426) by\n[@itzmaxwell](https://github.com/ltzmaxwell), which will add full type checking to the VM. The team has also\nadded GoReleaser to the monorepo in preparation for the upcoming Test4 milestone,\nand the first \n[nightly Gno build](https://github.com/gnolang/gno/releases/tag/v0.1.0-nightly.20240523) was released.\n\n## Gno @ Golang Serbia\n\nWhile in Belgrade, we also hosted a new Gnolocal meetup with over 15 developers \nfrom the Golang Serbia community. During this event, we introduced Gno.land, with\na particular focus on the GnoVM (Virtual Machine) as a foundational layer for \nGno - an interpreted version of Go. This was the first time we presented the\nconcept of Gno to Serbia’s Golang community, showcasing its potential to support\ndynamic application development. It was an opportunity to identify areas of \nimprovement and feedback from the user community.\n\n[![meetup](https://gnolang.github.io/blog/2024-05-28_gno-golang-serbia/src/thumbs/meetup.png)](https://gnolang.github.io/blog/2024-05-28_gno-golang-serbia/src/meetup.png)\n\n[Dylan Boltz](https://github.com/deelawn), a Senior Golang Engineer from the core\nteam, led the presentation, demonstrating how the VM and Gno can be leveraged to \ndesign and build efficient, adaptable, and scalable applications. He also provided \nan overview of the stack-based VM architecture, illustrating how data storage \nmechanisms and execution traces operate within the VM.\n\nBy using the GnoVM outside of the blockchain context, relevant to the Go community,\ndevelopers can utilize the powerful features of Gno to build applications with \nautomatic state persistence within a sandboxed environment. Dylan showcased how \nthe GnoVM can be embedded in an HTTP server, allowing developers to write and \npersist Gno applications locally, and then share them with other users, all while\nmaintaining the security of a VM.\n\n### The Meetup presentation highlights\n- Virtual Machine Deep Dive: We provided a detailed understanding of the \narchitectural setups of various VMs, and gave an overview of the current GnoVM.\n- Hands-On Learning: We walked through how to embed a virtual machine into your\nGo applications for dynamic code interpretation. The presentation covered \npractical techniques, including creating browser-based interfaces using interpreted Go.\n- Interactive Demonstrations: We showed how to create browser-based interfaces\nwith interpreted Go as a foundation, demonstrating how this architecture enables\ndynamic program execution while maintaining a structured, deterministic approach\nto storage and state.\n- This was the third meetup in our series of Gnolocal events. We’ll be popping\nup in more cities around the globe to connect with gnomes, and spread the word \nabout Gno.land. With a few gnomes based in Belgrade, it’s important to keep \ncultivating and building the Gno.land community locally. If you’re based in \nSerbia, you can find our regional based channel on the Official Gno.land [Discord \nServer](https://discord.gg/4XXyy5wS36).\n\n### The Feedback Loop\nAfter the presentation, we gathered feedback from the attendees to assess the \ncontent presented, their interest in Gno.land, and in their interest in using \nthe Gno interpreter tooling. Here are the key insights from form responses:\n- 75% of participants said they were interested in learning more about Gno.\n- 87% of participants found the presentation and concepts understandable.\n- 38% expressed interest in using the embedded Go interpreter in their applications.\nThe feedback highlighted the need for us to clearly outline the problems Gno.land \n- is solving, how our technology addresses these issues, and how it can apply to\n- real-world examples. This feedback is invaluable as it helps us refine our \n- approach and better engage with new contributors.\n\n## Conclusion\nThe meetup was just one of several activities the team organized in Belgrade. \nIn addition to the extensive technical sessions and workshops, we had the \nopportunity to experience and learn a bit about the local culture and Serbia,\nvisiting the Nikola Tesla Museum, sightseeing, and experiencing traditional \nSerbian music.\nThese in-person engineering retreats are some of the most important moments in\noutlining priorities, troubleshooting the technology together, and brainstorming\nways to generally enhance and optimize the Gno.land blockchain and builder \nexperience. \n","2024-05-21T12:33:00Z","leohhhn,michelleellen","gnome,gnolocal,retreat,meetup,golang"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"dS04sF1UbukbxHWkQ0ZT5i/3U3f4HA1Fzngm6IjDiaQyeqgNDvRl/GeM/68tnMV09BpJjeNo0HgLanIo7eB2Jg=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["gnomes-in-serbia","Gnomes Spotted in Belgrade, Serbia: Recap from the Engineering Retreat and Golang Serbia Meetup","\n\nDobro jutro gnomes! Last week, the Gno core engineering team convened in Belgrade,\nSerbia, to discuss various aspects of our technical roadmap, including Test4, \nblockchainless Gno, Gnoweb, governance and DAO structuring, GnoVM, and more. \nWhile the team was in town, we took the chance to host a Gno @ Golang Serbia \nmeetup titled ‘Building Dynamic Applications with Interpreted Go’ - you can catch \nthe recording of the full presentation [here](https://youtu.be/tNM1DHOxIQ8).\n\n## Engineering Retreat Recap\n\nOver five full days of coding and workshops, the Gno core engineering team delved \ninto several critical topics and emerged with several key takeaways:\n- Test4 Progress:\n - Test4 has been the primary effort for the team in the past couple of months, \naiming to create a stable multi-node testnet which will serve as the last precursor\nto Gno.land’s upcoming mainnet. Discussions revolved around chain initialization \nflows, node metrics \u0026 telemetry, versioning of binaries, adding a way to modify \nthe validator set via a realm (r/sys/vals), and more. Currently, the \n[Test4 milestone](https://github.com/gnolang/gno/milestone/4) is 62% complete.\n- Blockchainless Gno:\n - With the upcoming GopherCon EU \u0026 US conferences, the team discussed a \ndifferent perspective on Gno - a fully functional Go interpreter with automatic \nstate persistence. The team aims to modularize the GnoVM so that it can be\nused in contexts outside the Gno.land blockchain, which will open up the\necosystem to completely new use-cases, inviting even more web2 developers to \njoin our mission.\n- Gnoweb Enhancements:\n - [gnoweb](https://docs.gno.land/getting-started/local-setup/browsing-gnoland#2-browsing-gnoland) serves as one of the main tools to explore the Gno.land \necosystem. The team discussed changes to the UI as well as improving gnoweb’s \nfunctionalities such as the rendering of realm state \u0026 source code, and possible\napproaches to add more ways to interact with on-chain apps.\n- Governance and DAO Structuring:\n - Discussions relating to GovDAO and WorxDAO took place during the retreat, as \nthey are the foundation for Gno.land’s consensus mechanism - Proof of Contribution.\nManfred Touron, Gno.land’s VP of Engineering, discussed the \n[initial implementation](https://github.com/gnolang/gno/pull/1945) of GovDAO and\nits surrounding infrastructure.\n- GnoVM \u0026 Gno.land Development:\n - The team took the opportunity to deal with priority PRs during the retreat, \nsuch as the [Gno Type Check PR](https://github.com/gnolang/gno/pull/1426) by\n[@itzmaxwell](https://github.com/ltzmaxwell), which will add full type checking to the VM. The team has also\nadded GoReleaser to the monorepo in preparation for the upcoming Test4 milestone,\nand the first \n[nightly Gno build](https://github.com/gnolang/gno/releases/tag/v0.1.0-nightly.20240523) was released.\n\n## Gno @ Golang Serbia\n\nWhile in Belgrade, we also hosted a new Gnolocal meetup with over 15 developers \nfrom the Golang Serbia community. During this event, we introduced Gno.land, with\na particular focus on the GnoVM (Virtual Machine) as a foundational layer for \nGno - an interpreted version of Go. This was the first time we presented the\nconcept of Gno to Serbia’s Golang community, showcasing its potential to support\ndynamic application development. It was an opportunity to identify areas of \nimprovement and feedback from the user community.\n\n[![meetup](https://gnolang.github.io/blog/2024-05-28_gno-golang-serbia/src/thumbs/meetup.png)](https://gnolang.github.io/blog/2024-05-28_gno-golang-serbia/src/meetup.png)\n\n[Dylan Boltz](https://github.com/deelawn), a Senior Golang Engineer from the core\nteam, led the presentation, demonstrating how the VM and Gno can be leveraged to \ndesign and build efficient, adaptable, and scalable applications. He also provided \nan overview of the stack-based VM architecture, illustrating how data storage \nmechanisms and execution traces operate within the VM.\n\nBy using the GnoVM outside of the blockchain context, relevant to the Go community,\ndevelopers can utilize the powerful features of Gno to build applications with \nautomatic state persistence within a sandboxed environment. Dylan showcased how \nthe GnoVM can be embedded in an HTTP server, allowing developers to write and \npersist Gno applications locally, and then share them with other users, all while\nmaintaining the security of a VM.\n\n### The Meetup presentation highlights\n- Virtual Machine Deep Dive: We provided a detailed understanding of the \narchitectural setups of various VMs, and gave an overview of the current GnoVM.\n- Hands-On Learning: We walked through how to embed a virtual machine into your\nGo applications for dynamic code interpretation. The presentation covered \npractical techniques, including creating browser-based interfaces using interpreted Go.\n- Interactive Demonstrations: We showed how to create browser-based interfaces\nwith interpreted Go as a foundation, demonstrating how this architecture enables\ndynamic program execution while maintaining a structured, deterministic approach\nto storage and state.\n- This was the third meetup in our series of Gnolocal events. We’ll be popping\nup in more cities around the globe to connect with gnomes, and spread the word \nabout Gno.land. With a few gnomes based in Belgrade, it’s important to keep \ncultivating and building the Gno.land community locally. If you’re based in \nSerbia, you can find our regional based channel on the Official Gno.land [Discord \nServer](https://discord.gg/4XXyy5wS36).\n\n### The Feedback Loop\nAfter the presentation, we gathered feedback from the attendees to assess the \ncontent presented, their interest in Gno.land, and in their interest in using \nthe Gno interpreter tooling. Here are the key insights from form responses:\n- 75% of participants said they were interested in learning more about Gno.\n- 87% of participants found the presentation and concepts understandable.\n- 38% expressed interest in using the embedded Go interpreter in their applications.\nThe feedback highlighted the need for us to clearly outline the problems Gno.land \n- is solving, how our technology addresses these issues, and how it can apply to\n- real-world examples. This feedback is invaluable as it helps us refine our \n- approach and better engage with new contributors.\n\n## Conclusion\nThe meetup was just one of several activities the team organized in Belgrade. \nIn addition to the extensive technical sessions and workshops, we had the \nopportunity to experience and learn a bit about the local culture and Serbia,\nvisiting the Nikola Tesla Museum, sightseeing, and experiencing traditional \nSerbian music.\nThese in-person engineering retreats are some of the most important moments in\noutlining priorities, troubleshooting the technology together, and brainstorming\nways to generally enhance and optimize the Gno.land blockchain and builder \nexperience. \n","2024-05-21T12:33:00Z","leohhhn,michelleellen","gnome,gnolocal,retreat,meetup,golang"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"Zyr3J5TWWhF62Lz2Z0IQ9iVpJ3JMyb3TK3FIyYDa39x+IovVQzHCZSyNH593p7EmWB5PLSoZmWJt1E3cyCCQow=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["gnomes-in-serbia","Gnomes Spotted in Belgrade, Serbia: Recap from the Engineering Retreat and Golang Serbia Meetup","\n\nDobro jutro gnomes! Last week, the Gno core engineering team convened in Belgrade,\nSerbia, to discuss various aspects of our technical roadmap, including Test4, \nblockchainless Gno, Gnoweb, governance and DAO structuring, GnoVM, and more. \nWhile the team was in town, we took the chance to host a Gno @ Golang Serbia \nmeetup titled ‘Building Dynamic Applications with Interpreted Go’ - you can catch \nthe recording of the full presentation [here](https://youtu.be/tNM1DHOxIQ8).\n\n## Engineering Retreat Recap\n\nOver five full days of coding and workshops, the Gno core engineering team delved \ninto several critical topics and emerged with several key takeaways:\n- Test4 Progress:\n - Test4 has been the primary effort for the team in the past couple of months, \naiming to create a stable multi-node testnet which will serve as the last precursor\nto Gno.land’s upcoming mainnet. Discussions revolved around chain initialization \nflows, node metrics \u0026 telemetry, versioning of binaries, adding a way to modify \nthe validator set via a realm (r/sys/vals), and more. Currently, the \n[Test4 milestone](https://github.com/gnolang/gno/milestone/4) is 62% complete.\n- Blockchainless Gno:\n - With the upcoming GopherCon EU \u0026 US conferences, the team discussed a \ndifferent perspective on Gno - a fully functional Go interpreter with automatic \nstate persistence. The team aims to modularize the GnoVM so that it can be\nused in contexts outside the Gno.land blockchain, which will open up the\necosystem to completely new use-cases, inviting even more web2 developers to \njoin our mission.\n- Gnoweb Enhancements:\n - [gnoweb](https://docs.gno.land/getting-started/local-setup/browsing-gnoland#2-browsing-gnoland) serves as one of the main tools to explore the Gno.land \necosystem. The team discussed changes to the UI as well as improving gnoweb’s \nfunctionalities such as the rendering of realm state \u0026 source code, and possible\napproaches to add more ways to interact with on-chain apps.\n- Governance and DAO Structuring:\n - Discussions relating to GovDAO and WorxDAO took place during the retreat, as \nthey are the foundation for Gno.land’s consensus mechanism - Proof of Contribution.\nManfred Touron, Gno.land’s VP of Engineering, discussed the \n[initial implementation](https://github.com/gnolang/gno/pull/1945) of GovDAO and\nits surrounding infrastructure.\n- GnoVM \u0026 Gno.land Development:\n - The team took the opportunity to deal with priority PRs during the retreat, \nsuch as the [Gno Type Check PR](https://github.com/gnolang/gno/pull/1426) by\n[@itzmaxwell](https://github.com/ltzmaxwell), which will add full type checking to the VM. The team has also\nadded GoReleaser to the monorepo in preparation for the upcoming Test4 milestone,\nand the first \n[nightly Gno build](https://github.com/gnolang/gno/releases/tag/v0.1.0-nightly.20240523) was released.\n\n## Gno @ Golang Serbia\n\nWhile in Belgrade, we also hosted a new Gnolocal meetup with over 15 developers \nfrom the Golang Serbia community. During this event, we introduced Gno.land, with\na particular focus on the GnoVM (Virtual Machine) as a foundational layer for \nGno - an interpreted version of Go. This was the first time we presented the\nconcept of Gno to Serbia’s Golang community, showcasing its potential to support\ndynamic application development. It was an opportunity to identify areas of \nimprovement and feedback from the user community.\n\n[![meetup](https://gnolang.github.io/blog/2024-05-28_gno-golang-serbia/src/thumbs/meetup.png)](https://gnolang.github.io/blog/2024-05-28_gno-golang-serbia/src/meetup.png)\n\n[Dylan Boltz](https://github.com/deelawn), a Senior Golang Engineer from the core\nteam, led the presentation, demonstrating how the VM and Gno can be leveraged to \ndesign and build efficient, adaptable, and scalable applications. He also provided \nan overview of the stack-based VM architecture, illustrating how data storage \nmechanisms and execution traces operate within the VM.\n\nBy using the GnoVM outside of the blockchain context, relevant to the Go community,\ndevelopers can utilize the powerful features of Gno to build applications with \nautomatic state persistence within a sandboxed environment. Dylan showcased how \nthe GnoVM can be embedded in an HTTP server, allowing developers to write and \npersist Gno applications locally, and then share them with other users, all while\nmaintaining the security of a VM.\n\n### The Meetup presentation highlights\n- Virtual Machine Deep Dive: We provided a detailed understanding of the \narchitectural setups of various VMs, and gave an overview of the current GnoVM.\n- Hands-On Learning: We walked through how to embed a virtual machine into your\nGo applications for dynamic code interpretation. The presentation covered \npractical techniques, including creating browser-based interfaces using interpreted Go.\n- Interactive Demonstrations: We showed how to create browser-based interfaces\nwith interpreted Go as a foundation, demonstrating how this architecture enables\ndynamic program execution while maintaining a structured, deterministic approach\nto storage and state.\n- This was the third meetup in our series of Gnolocal events. We’ll be popping\nup in more cities around the globe to connect with gnomes, and spread the word \nabout Gno.land. With a few gnomes based in Belgrade, it’s important to keep \ncultivating and building the Gno.land community locally. If you’re based in \nSerbia, you can find our regional based channel on the Official Gno.land [Discord \nServer](https://discord.gg/4XXyy5wS36).\n\n### The Feedback Loop\nAfter the presentation, we gathered feedback from the attendees to assess the \ncontent presented, their interest in Gno.land, and in their interest in using \nthe Gno interpreter tooling. Here are the key insights from form responses:\n- 75% of participants said they were interested in learning more about Gno.\n- 87% of participants found the presentation and concepts understandable.\n- 38% expressed interest in using the embedded Go interpreter in their applications.\nThe feedback highlighted the need for us to clearly outline the problems Gno.land \n- is solving, how our technology addresses these issues, and how it can apply to\n- real-world examples. This feedback is invaluable as it helps us refine our \n- approach and better engage with new contributors.\n\n## Conclusion\nThe meetup was just one of several activities the team organized in Belgrade. \nIn addition to the extensive technical sessions and workshops, we had the \nopportunity to experience and learn a bit about the local culture and Serbia,\nvisiting the Nikola Tesla Museum, sightseeing, and experiencing traditional \nSerbian music.\nThese in-person engineering retreats are some of the most important moments in\noutlining priorities, troubleshooting the technology together, and brainstorming\nways to generally enhance and optimize the Gno.land blockchain and builder \nexperience. \n","2024-05-28T12:34:56Z","leohhhn,michelleellen","gnome,gnolocal,retreat,meetup,golang"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"Q5zJKn65FLPiGFD1hZRjN7wqmGEWCbzYQpcrOspf8uQn/YQYkQQA4QDTkCoUZ0N7tg3uaEaJ2VlXPwD5QGJV/w=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"12000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"LOd95hQlp5dHjPl/LNDHb4DBvmssH+cdjiJszu8CqHAsWSzLDLn4OmugspeqNyhxLfyFHPb8aC1h37rLHmfsvg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"2DHj1ixRc26xUFzCNtXfeHGAFy2lGjbp5kw34oM98H5xMdDre8ADk747ZHP5DkmAlqWqIRFSkGeptAMjMSZsTw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","to_address":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","amount":"12000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"uLTdUqso7HS8hDdpfFQJ9Rbn1lerdFSoiFVU1VADu6B/kW5v2XGq3hohD9DejyjLyGDKC28KLVdLEO0vfomyhw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","to_address":"g1a2p2dnm60y0v5u9gu5ffh4e3cuhfqrdsd80s05","amount":"10000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"7Qutp+TziyewpWjrLKnFCos2oBtm5A0/5TFDk7h8b9050/90tgL6f/iaG5aNUk1aqeXFJPc+DJEw7WCqCrNm6g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1626wwzfe7psdz6ke9vc8qltcdkfev7h4mwm0k0","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"CFq54otI91bb4QCs6L5ooUZNPruaMxL6POHmzm9iWsQFnW8F6/0MDe3SXmfl+NMDCoqWkT9UI3/qHk32O/WFEw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["test4-explained","Test4 Explained","\n\nWe recently [announced](https://gno.land/r/gnoland/blog:p/monthly-dev-8) the Test4 milestone on our road to mainnet. It's a big step in terms of complexity, so let's delve into the nuts and bolts, and how Test4 fits into the bigger picture.\n\n## Why Test4 is Significant\n\nOur choice to go with Go stemmed from our desire to lower the barrier to entry for new developers. That meant that we needed an intuitive programming language with widespread usage; developers would be able to write smart contracts without being forced to learn another language. Go fits the role perfectly. \n\nThe flip side is that we can't just port a VM and call it a day. We have to build most tools and services from scratch.\n\nIn that sense, Test4 is the technological leap from a single validator POC to a first iteration of an actual functioning decentralized blockchain network. \n\nIt's also the first stable testnet since the project's inception over 2 years ago.\n\n## Multinode capability\n\nLike most blockchains, we're looking to boost resilience and security through a number of validator nodes. But since we're not forking a VM, we're building the whole thing from scratch; starting from the ability to emit events, to being able to subscribe to smart contracts, to making a change based on those events. All this is needed e.g. to add or remove a validator node in the Gno.land network, since the validator management is done completely on-chain.\n\nThe initial validator set will not be incentivized; it will be a small group of the most active contributors, as well as internal AiB teams, who will thoroughly test and break the network, and document all the things!\n\n## The First Permanent Testnet\n\nTest4 is the first serious iteration of an official Gno.land testnet. Our aim is not to have any breaking changes, meaning you can use it to develop your dApp, identify bugs, test features in an environment that's as close to the upcoming mainnet as possible. Being a testnet, you can use the [Faucet Hub](https://faucet.gno.land/) to obtain test tokens and use dApps without any real consequences.\n\nNow, that isn't to say that Test4 will be the ultimate testnet. If we uncover major breaking issues, we'll deploy Test5 and so on.\n\nWe promise, however, to come up with a better naming convention going forward.\n\n## Indexer and Transaction Explorer Included\n\nA staple of a functional blockchain network is being able to search, track and verify transactions. This enables the developers to confirm their smart contracts are working as intended, as well as troubleshoot issues. Test4 comes with a transaction explorer, allowing developers to move off custom Test3 forks over to Test4 for convenience.\n\n## Regular Release Schedule for Binaries\n\nWith breaking changes being deployed before the Test4 launch, we can now switch to the rolling release model. Updates will go live on a regular, most likely biweekly basis, enabling developers to test their dApps on the latest available version.\n\n[Portal Loop](https://docs.gno.land/concepts/portal-loop/) will keep up with the binaries, and run on the latest version.\n\n## Proof-of-Contribution Scaffolding\n\nA key Gno.land concept is Proof of Contribution; the idea that the reward goes not to the one who pays to win either via mining rig or big stake, but to the one that invests time to contribute to the community.\n\nContributions will be managed on-chain via DAOs; E.g. a contributor with core contributions will be a part of a DAO that recognizes those contributions, and the rewards will be tied to the level the contributor has in that DAO.\n\nTest4 will lay down the foundation for PoC. We'll be adding proposal support, as well as voting support that executes those proposals on-chain. The result will be a modified version of PoA that will be supported on a protocol level, and managed by the admin. This will make the future switch to PoC a much more seamless affair.\n\n## Release Date\n\nOur goal is to complete development by the end of July 2024, and launch in early August 2024. We've opened up the [Test4 milestone](https://github.com/gnolang/gno/milestone/4) and the Gno.core team's [project board](https://github.com/orgs/gnolang/projects/38/views/5), so you could track the progress. \n\nWe're also getting ready to open up some of the issues to the community, so stay tuned!","2024-05-30T00:00:00Z","Kouteki","gnoland,test4,testnet,poc,proof-of-contribution,tm2"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"cjuiN4KlN5ec3z5hABTJWBBRXz+t9Cfob4nST0bPtHhsNR4XCN01GRWm5cjBpD7J16kXiKbikPcpCg0otUS0Bg=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1zzqd6phlfx0a809vhmykg5c6m44ap9756s7cjj","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"T2ehyGoDsrTiy/gzOUomkDFqUFFUhgOTlrZkHE9vU3NTXZ65B4GO1T7JA+5DHP9H52JmxAjYt50xwz56srT43g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/userbook","func":"SignUp","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"Ny483l7w4vXxwbsqZWNQft9evoAl0WEh4QpVLgWG6sJ8CT/I1s3oghwznaxtuEFhmqvSeryaEk+mKbBn+iRGEw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1zzqd6phlfx0a809vhmykg5c6m44ap9756s7cjj","send":"","package":{"name":"","path":"gno.land/r/g1zzqd6phlfx0a809vhmykg5c6m44ap9756s7cjj/run","files":null}}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArQheatR/DDA+YbDLFnWWCeGIWougaikojYTS4wi2tWS"},"signature":"jX5f6Q8AZrFKUiWv+4C6qPDrockpx8+m3otaapynGXRUba3nikduViuMmgLO19MRNLPcNsrbtLbK2nqLUqAqkQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1zzqd6phlfx0a809vhmykg5c6m44ap9756s7cjj","send":"","package":{"name":"","path":"gno.land/r/g1zzqd6phlfx0a809vhmykg5c6m44ap9756s7cjj/run","files":null}}],"fee":{"gas_wanted":"20000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArQheatR/DDA+YbDLFnWWCeGIWougaikojYTS4wi2tWS"},"signature":"TGCHBbdYUpMvZJ8JktYsUg0e2sTqaNMUqsppUc4fPuhIunrP+LHVXNiW9ZBNcPlAZFgngDJA2G4QcFrM7kX0mA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1626wwzfe7psdz6ke9vc8qltcdkfev7h4mwm0k0","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0sw7Ml2edZjX2LFdhA5r4frVAiAEPQ981JK6vRTlWBk/guI/UJmpEP5fGWq/sXLnHx9srNT1wvV5T0lYK/rZlg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","amount":"10000000000ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"nUMkADNKofvmO9gX9AeHe2LMaXQYj7UJq9Ozfg5JFpFsQFdwg03Caaz/dGMSkyIa6R9LQal3rd+xFJ9CgCo8EA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g18sp3hq6zqfxw88ffgz773gvaqgzjhxy62l9906","amount":"10000000000ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"dgFuLk9mcEuOpZsSuX7KCTuhofNv3nG3uT3Yi5/D0QRafFj8tJQLvZdw9uqHJLMhrrlBw5B3pYSLrus3sf0XMQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g18sp3hq6zqfxw88ffgz773gvaqgzjhxy62l9906","amount":"10000000000ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"GIPy4BeKJj/ZMgRnC4PwU2qz4FzluHcpoJ/3xusHIy9U9ZU5ecdQ09iuMq4IyXfWrYaesZ8/4DZ2UoO06CjH8g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","amount":"10000000000ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"XYqoBdN7HSTNSVQ3lGe1hJdyG36PXbm6Tv5oEnUJmOwQkfJKa1EC58raa8HlO9wZojnjgmKdNt5JQK1R6kZCFg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g18sp3hq6zqfxw88ffgz773gvaqgzjhxy62l9906","amount":"10000000000ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"vpKKhwf2GckmrzCcSrkIikl+o7TvJw2EjJk1AACI8q5PEmmc0+JYv6ovksyLdOZXij4EwPCZDSrR333PbcvLxQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g18sp3hq6zqfxw88ffgz773gvaqgzjhxy62l9906","amount":"10000000000ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"Olz31cu7NuK7KZJU9hM6mzuyFoHcIhNSzFt+BASWYT1miREP2y6F7nDKkdj92Jyw0NOSPDt8zsZRi0hpzrb2hA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"izzuD1IgCmGc03CNGCFRNEr6Gz9oL5FjQhbBDt7EW3d8jB6AXCUSzgL6XgBZve7rX3a9nPfGGt27CZWdMsuwow=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"h7AOZ0gtrkOWUZkkJ2vxV0XNAYPuPwdxixeSM7/Mo3sQ78CAO94+CuPU8iUmU7JjsSLzZy6yttGZppDytgtM2Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"eVNK5c2GuEMEmRPBxZzgMc3A8ctRnkVD/N4A7XUdoaU/ySo/BwXIwekVt2LHIJdGJ/9q667XviTjFYsZVN///w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"zH08wjEKxI1gFbHYtxo77Z45hrWGolKQ+RDEAAWRijpBPUK6kCv09BMVWSfKjq+IAa02DqXbSAV3tYJsXvWAWw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"RizGCYXYFaCFA3pY0qQQwXPyiJJy6UYHnR52tiBlLXlUZytODWOQoXkzk+29V+XN/xwrLev9cZcAwNMDrDtyGA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"ayFCkOZNEeMdc0Qg1iVFuqfyeRIt1W5FUoYtIfNh8hU23p63nhYBtBTArgXwGLTcnN8dpxdhPNnEX2NIPCVM8g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"WQBAFWrS6x0ikrpvx37ALCjfCZ4nw7SEGZA3/jWpySZft/VSi+VVgZwtVvKn5AB3NQx24QtYSn6xo9k/h4DY9A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"yQKuKokWSmrdVNK6LVOHEGMN9YwlezfG/BMma76P0Dkn5a0ugcz+He8QBKcV1ZFqTt+zhnVe4oQtgxwr8YbKiw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"TmSBxm4TMoFA+kczK+OsvRPej5h0el3jNrmXDLatbM0Y7dA4dGgu1YHt4ifXR+YgVZtAHZ6YLn+e4m8MfkcgDg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","amount":"10000000000ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"MPIhGcIC0opqC5cWrhITdF28ii5Z95n28ny4BHuwJaoTP+VGgBs0jpMleEhcX2pq5wkJWQzVpLHaBrXVURb5MQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g18sp3hq6zqfxw88ffgz773gvaqgzjhxy62l9906","amount":"10000000000ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"NPS49BnDNZK67YQYe8zGQa2xsivs1FlH6kTNWYUfmlEGz6ucP4dpfg+GO46+KnUkZsQtVS49HRfirO5Kc3fkGQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g18sp3hq6zqfxw88ffgz773gvaqgzjhxy62l9906","amount":"10000000000ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"2kKCY+c/Lb+B1RFrcgeGKcXeLH9vPl/h1YyB1OOHLrwc3SbLgZ0rfjUhIxRvqLEFb6kISDqBDOrKvrFRRvagpA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"2hn7FE//NzEVFtq4Z6vCIm0RWPRIv/p+Hak7RXFfP4cljDqEiNoimgLqSs/jUoVJNXtXAnz91t0fZl5UhQCueA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"JEPiOLQfhhaOWAYj/zbrlv3fjuqoeeMlpva2lhNvuSQzvRHF1EfNr72Ko938P6Uqv/vwqOFfxQjl/isG6KlXZg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","amount":"10000000000ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"zhL0rycfT5AcqcAxDodY+OjnLLpXp+5ycyeK7NciirhWd9f+EW6XZ0UruVScE6MsF7AZn2VIL4UTk1U6ns5RzA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g18sp3hq6zqfxw88ffgz773gvaqgzjhxy62l9906","amount":"10000000000ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"d7DejuXekKMMciHomrtV55qpL8lc/ZcguTkBNQrnOD49IMXWjdsBq/8WKwt0jy1+R7YBiDSrsDNM1PW1ZtWS0Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g18sp3hq6zqfxw88ffgz773gvaqgzjhxy62l9906","amount":"10000000000ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"2JxQHYMhn7nBQQ3mCN60nLWJd8u1veeGcB+pgA+GVMA8LSqZqQPvf9mr/ZpBQMSMdKXynKBEv8IZxMNoZZZIAQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"KCM7pEhEa4Yi7WMxygco87id0s4W4kOg80dyTE1focNAtl4hcz1lCobNyXP6cteJVXtI4O91YdOsv8O5cfHU+A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1ygw7f6c0ldm0ksdf8yqlfzpuj232smya9xgftm","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"g6Ug90qrt8wUnutqkE4Vj0EBtG4QzaVoKr1ab+IAE3wJEjC4foWMfY5lFlU0uMg3IYfZkZS+u+jU4hMk0YN+Mw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1zzqd6phlfx0a809vhmykg5c6m44ap9756s7cjj","send":"","package":{"name":"","path":"gno.land/r/g1zzqd6phlfx0a809vhmykg5c6m44ap9756s7cjj/run","files":null}}],"fee":{"gas_wanted":"20000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArQheatR/DDA+YbDLFnWWCeGIWougaikojYTS4wi2tWS"},"signature":"mT8mMnhYSYmYl/odjnTNaO0SimJ3hbvaUaW9MCZTpbd9IQbTuwu70YBkVesqitxs2zZCGe/B1XEHVHfnYgoQuw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1zzqd6phlfx0a809vhmykg5c6m44ap9756s7cjj","send":"","package":{"name":"","path":"gno.land/r/g1zzqd6phlfx0a809vhmykg5c6m44ap9756s7cjj/run","files":null}}],"fee":{"gas_wanted":"20000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArQheatR/DDA+YbDLFnWWCeGIWougaikojYTS4wi2tWS"},"signature":"meHDTa5yqJ7dk91OMbXsHdXmL5S2CnsOwahTO7zW1DRqgCXPiqLuOblboPE515vRB+BV4mxBgzrCc6wO5JSZ2g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"mr8Equ4aWoAQy3zo5B6aOkSQW9yRf8t9X7hsrT84gjdYY30o7I+ICq6Ug3vdPnAeAliqYlAPB67jyjQU7ifIfA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"aYTE6gcfSBlUGz6jmksLHn/8C2gYECQzTeyWqWYNbv8rkXYY4PbNJ0FcRKkwbXbHEZYOHkeKracgUwMI0y2g8Q=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_run","caller":"g1zzqd6phlfx0a809vhmykg5c6m44ap9756s7cjj","send":"","package":{"name":"","path":"gno.land/r/g1zzqd6phlfx0a809vhmykg5c6m44ap9756s7cjj/run","files":null}}],"fee":{"gas_wanted":"20000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArQheatR/DDA+YbDLFnWWCeGIWougaikojYTS4wi2tWS"},"signature":"RmyS1SoacEZV8v5l+f2ApQQzAHxFBnJqx/ysS0a3lzVmG46Fv1upOEP9DIWE6SvChms5PF/m5PclUjuce8Q6fQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"EmXWB/XEhwaijjWq8hBrO58JH+XQ5l98HRNJo1Mz4ktD5nbwXUTMwre33LmBBOAdOzzgLLclsT+JP8GLkAwVjg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"8000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"BFczrsrN+W/E5m7O9B8tiAxEqwbGV3lFmYww5+cZwQcIvqGrOagiMcNE4BHXYxGy14KpBi3pQYNWUeBew/A9jA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"8000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"N+SebzbzTfYv4KgWrTKauMGEgkoxpriHNwexYZciYvY0wjHbGaSv/stoxM+eiuo6KMHIbXqbPDpCOc7ZZyCpBw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"8000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"j5zKPywLmyAYqBUtCtnBms1DGT7t/hroOtq6QMdh4jJaQ3CcNAwoYbI6gkEW6/FuykhLlv3HIo1Q2t8O+kV2fg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"10000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"nZZqTb6w55UkmcBzE0VcoFgGoNNgJLhgjUnkVIhihF0omliGSY9qTS2NqOejXS1I9UnNw0CHQUr5XQK+EoHuJA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1ygw7f6c0ldm0ksdf8yqlfzpuj232smya9xgftm","to_address":"g162jgpk4740r6a7g53cgz9ahxqtyuekgqchw6w9","amount":"100000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7dAH+Mvbeal6BTsh7VoWHbsSwUKgn/14npKDvl/jwU8"},"signature":"os3EAcoYA54htbwrkWOfVasq39RplFmfWLEtKSsmkdVs3DSwSH86xDWlN2S/ZiJ0jzuQ3E2+4JmNwYVe6+a5rw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"uxxI6WjtO5iXNw53GaXtlxIjgjlSiAtyx3orru9OSRZVl4+RKUOKPbAvrSZ/MxOteoSaphLODlCNOqg4KTEA5w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/event_emitter","func":"Event01","args":["hello","byby"]}],"fee":{"gas_wanted":"3000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"Bstwg2q2O6uXZ1buiEy/Ytj05nufPfD7JH1Te+bcco9tx1nB//k3LTu8I9bDYADoYa+2bJ0jpk7V9MljCwULmw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ajg796sf4f5fu8lu9eu848cew3c9vl7cj0nmnn","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qHgA8EZ1YDFWB5BHYvULwCcoPHkcjFJESxe37zWHez1ghiGdhQ9j/n6bF5rEHRxI657XVMafuyII1H/2nLtESQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"NxJYXdtTRNesDm0Jql8d82vcbRLSQNHP//FjK7iVJ+Em4pw4XMoaatBg+mbAftKwJtRdiJwTaLsuKciw1TYZVA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModEditPost","args":["the-gnome","Introducing our new Gno.land logo: the gnome","\n\n[![banner](https://gnolang.github.io/blog/2024-05-21_the-gnome/src/thumbs/banner.png)](https://gnolang.github.io/blog/2024-05-21_the-gnome/src/banner.png)\n\nWe are excited to introduce our new Gno.land logo, a significant shift that \nreflects the true spirit of our project.\n\nFrom the very beginning, the character of the \"gnome\" has been a source of \ninspiration for gno.land, representing the essence of our journey and values \ngoing forward.\nOver time, this character has not only inspired our project but has also become\npart of gno.land’s identity.\n\nThe black hole of the previous logo represented finality, inevitability, the\nultimate end state, and was an interesting representation of something that cannot\nbe seen; but it also arguably represented something like an unemotional void. In\ncontrast, gnomes are warm and inviting in character, and so much more.\n\n_So why gnomes?_\n\nIn Greek, _gnomi_ means “the means of knowing; mind; intelligence; judgment”. \n_Gnomic poetry_ refers to a type of poetry involving short memorable maxims of \nwisdom that flourished in the 6th century in Greece. Today, when we hear _gnome_ \nwe think of earth-dwelling figures often found in lush blue-green gardens,\nguarding or simply enjoying the land they are in.\n\nNobody knows for sure the origin of these gnomes, but the earliest known\nreference to it comes from Paracelsus as _gnomus_, a Swiss Christian theologian, \nphilosopher and alchemist of the Renaissance. He also called them _pygmies_ in \nhis _“A book on Nymphs, Sylphs, Pygmies, and Salamanders, and on Other Spirits”_\npublished in 1566, a study on myth creatures as they relate to Christianity.\n\nWhile the depiction of gnomes are varied, their general character was described\nby Paracelsus:\n\n_“the Pygmies (gnomes) are mountain people who keep pledges, are honest, hard \nworking, loyal to man, and have money, because they themselves coin it”_\n\n(perhaps Paracelsus would have preferred to be identified as a gnome, since he was also an alchemist).\n\nThis character is consistent with Swiss folklore, as gnomes are said to have \ncaused the landslide that destroyed the Swiss village of Plurs in 1618 - the\nvillagers had become wealthy from a local gold mine created by the gnomes, who\nhad poured liquid gold down into a vein for the benefit of humans. The villagers\nwere corrupted by this newfound prosperity, which greatly offended the Gnomes.\n\nIn addition, gnomes are not afraid to stand up against greed and evil. Some say \nthat gnomes wear the Phrygian cap, which represents Zoroaster, the “three Magi” \nfrom the east, or the revolutionary pursuit of liberty. Gnomes are also earth \ndwellers, masons of the rock, and the guardians of the land.\n\nBy combining the above descriptions, we can describe gnomes in the following manner:\n\n1. Gnomes create timeless value for humanity.\n2. But since humanity becomes corrupted through greed and abuses these timeless \nvalues, gnomes also take remedial action.\n\nWhether the timeless value is that of an element such as gold, or that of a \nblockchain protocol, gnomes are hardworking alchemists who seek the best for \nhumanity and actively resist greed and corruption as a matter of principle. This\nquality of character is greatly needed in the blockchain/web3 field, where it is \nso easy to become blinded by greed, resulting in stalled innovation, broken \npromises, sometimes the loss of life savings, and the demise of entire web3 \ncommunities.\n\nThe blockchain world needs more gnomes to create timeless software and protocols\nfor the benefit of humanity. Such technology should be:\n\n1. intuitive (easy to use and understand)\n2. expressive (for societal infrastructure, finance, social, knowledge)\n3. finalized (completed)\n4. secure (unhackable)\n5. scalable (affordable)\n\nThis is what we seek to bring to the world through gno.land.\n\nGnomes are thus an excellent representation of the builders behind gno.land. We\nhope you like the new logo – an iconic depiction of the gnome with cap – and hope\nthat the gnomic spirit can help guide us to build a better, more honest world for\nall of us.\n\n_- the gnomes of gno.land_\n\n\n","2024-05-21T12:33:00Z","gno.land","gnome,brand-update,new-logo"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"U/ge9E5oFWL70uiKzDXb1r0pXy62KfT4LTB19qyJAMZ6v7zFzQH+224XWmbMtDdfUoID78XbevgfaeOBVhp1eA=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModEditPost","args":["kv-stores-indexer","Key/Value Stores: How We Improved the Performance of Our tx-indexer by 10x","\n\nIn this article, we'll discuss how we achieved a tenfold increase in the processing speed of the tx-indexer by applying four key concepts related to our use of key/value storage:\n\n- Understanding Key/Value Store Variability\n- The Importance of Efficient Data Encoding\n- Implementing Secondary Indexes on a Key/Value Store\n- The Role of Batch Inserts in Enhancing Performance\n - Data consistency\n - Speed\n - Old\n - New\n- Conclusion\n\nThe Transaction Indexer ([tx-indexer](https://github.com/gnolang/tx-indexer)) is\nthe primary tool Gno.land uses to index its networks. It is in charge of keeping \nup with block production, fetching new data, indexing it, and serving it to users\nwhile providing filtering and subscription capabilities. The tx-indexer creates\nversatility and ease of use when using on-chain data, which is one of the key \naspects of a fully functioning decentralized application.\n\n## Understanding Key/Value Store Variability\n\nNot all key/value storages are created equal. Each varies significantly, and \ndepending on their internal data structures, some are better suited for certain\nuse cases than others. A deep understanding of the key/value store you plan to \nuse will help you better organize data for efficient writing and reading and \nassist in choosing the best store for your specific needs.\n\nWhile [PebbleDB](https://github.com/cockroachdb/pebble) is based on \n[RocksDB](https://github.com/facebook/rocksdb/wiki/RocksDB-Overview), the two \ndatabases differ significantly. Both utilize LSM Trees built upon SSTables;\nhowever, PebbleDB supports only a subset of the features available in RocksDB. \nFor instance, PebbleDB lacks built-in transaction capabilities, but these can be \nalternatively implemented through the use of Batches and/or Snapshots.\n\n## The Importance of Efficient Data Encoding\n\nOur indexing involved elements defined by consecutive integers, with Blocks on \none side and Transactions within a Block on the other.\n\nInitially, Blocks were indexed using a combination of `block_prefix` and block_id\nencoded in little endian. This method wasn't allowing us to use iterators for \nordered data retrieval, forcing us to fetch elements individually, resulting in\nexcessive and inefficient database queries.\n\nAfter refactoring, we adopted a binary encoding scheme that allowed for custom\nencoding of strings and integers. This flexibility enabled ascending or descending \norder iterations, which significantly improved our ability to read data sequentially\nthrough iterators and, consequently, reduced query times dramatically.\n\nSmall example about how we encoded uint32 values in ascending order:\n\n```go!\nfunc encodeUint32Ascending(b []byte, v uint32) []byte {\n\treturn append(b, byte(v\u003e\u003e24), byte(v\u003e\u003e16), byte(v\u003e\u003e8), byte(v))\n}\n```\n\n## Implementing Secondary Indexes on a Key/Value Store\n\nWhile most filters are applied on the fly due to their low cost, we implemented\nsecondary indexes to fetch Transactions by Hash efficiently.\n\nSecondary indexes are specialized key groups that directly reference the primary\nindex key where the data resides. For example, a transaction with ID `3` in block\n`42` is indexed as `/index/txs/[uint64]42[uint32]3`. These transactions are also \nuniquely identified by a hash representing the entire transaction content.\n\nTo fetch transactions by hash, we created a secondary index that points to the\nprimary index:\n\n`/index/txh/[HASH] -\u003e /data/txs/[uint64]42[uint32]3` \n\nAlthough our secondary indexes do not require ordered iteration, this capability\nremains available, allowing us to apply additional filters as necessary. For\ninstance, we could index transactions by year:\n\n`/index/txYear/[uint16]2024[uint64]42[uint32]3 -\u003e /data/txs/[uint64]42[uint32]3`\n\nThis format allows us to iterate through transactions within a specific year, \nfrom the start to the end of 2023, for example:\n\n- from: `/index/txYear/[uint16]2023[uint64]0[uint32]0` \n- to: `/index/txYear/[uint16]2023[uint64]MAX_UINT64[uint32]MAX_UINT32` \n\n## The Role of Batch Inserts in Enhancing Performance\n\nThe advantages of write batches are often overlooked but crucial. Inserting \nelements individually can lead to data consistency issues and slower operations.\n\n### Data consistency\n\nBatches ensure atomicity—either all elements are persisted, or none are. \nWithout batches, a failure during insertion could result in a block being saved\nwithout some of its transactions.\n\n### Speed\n\nEach insertion involves internal processes that slow down the operation. By \ngrouping several entries in one batch, we significantly enhance insertion speed.\nThese are new benchmarks comparing the old and new way of writting elements \nwithout and with batches. Note that these are just synthetic benchmarks and the\n10x improvement was measured when using the indexer as it is (we came from \nspending 30 mins to 3 mins with the new storage changes):\n\n#### Old\n\n```go!\nfunc BenchmarkPebbleWrites(b *testing.B) {\n\tstore, err := NewDB(b.TempDir())\n\trequire.NoError(b, err)\n\tdefer store.Close()\n\n\tpairs := generateRandomPairs(b, b.N)\n\n\tb.ResetTimer()\n\tfor k, v := range pairs {\n\t\terr := store.Set([]byte(k), v)\n\n\t\tb.StopTimer()\n\t\trequire.NoError(b, err)\n\t\tb.StartTimer()\n\t}\n}\n```\n\n```\ngoos: linux\ngoarch: amd64\npkg: github.com/gnolang/tx-indexer/storage/pebble\ncpu: AMD Ryzen 5 5600X 6-Core Processor\nBenchmarkPebbleWrites\nBenchmarkPebbleWrites-12 \t 1316\t 928941 ns/op\t 33 B/op\t 0 allocs/op\nPASS\nok \tgithub.com/gnolang/tx-indexer/storage/pebble\t1.384s\n```\n\n#### New\n\n```go!\nfunc BenchmarkPebbleWrites(b *testing.B) {\n\tstore, err := NewPebble(b.TempDir())\n\trequire.NoError(b, err)\n\tdefer store.Close()\n\n\tpairs := generateRandomBlocks(b, b.N)\n\n\tbatch := store.WriteBatch()\n\n\tb.ResetTimer()\n\tfor _, v := range pairs {\n\t\terr := batch.SetBlock(v)\n\n\t\tb.StopTimer()\n\t\trequire.NoError(b, err)\n\t\tb.StartTimer()\n\t}\n\n\terr = batch.Commit()\n\n\tb.StopTimer()\n\trequire.NoError(b, err)\n\tb.StartTimer()\n}\n```\n\n```\ngoos: linux\ngoarch: amd64\npkg: github.com/gnolang/tx-indexer/storage\ncpu: AMD Ryzen 5 5600X 6-Core Processor\nBenchmarkPebbleWrites\nBenchmarkPebbleWrites-12 249462 4730 ns/op 1704 B/op 43 allocs/op\nPASS\nok github.com/gnolang/tx-indexer/storage 4.669s\n```\n\n## Conclusion\n\nIf you find out this interesting and want to have a deeper look about\n[how it is done](https://github.com/gnolang/tx-indexer/tree/main/storage), or just try our indexer, it is as simple as ramping up \na docker image:\n\n```\ndocker run -it -p 8546:8546 ghcr.io/gnolang/tx-indexer:latest start -remote http://test3.gno.land:36657\n```\n\nAnd start playing with it through its GraphQL interface at `http://localhost:8546/graphql`\n","2024-05-10T13:37:00Z","ajnavarro","blog,post,tx-indexer,dev"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"M7xiFVCHkmNK9s1zeBUPwlPMlkr5a//2+CJ5VwQwmf1Luyq7nS1/jbQ3ypPf/6mn78v0uBfsi6L+TJ0NwO7zqw=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1fswxc4mzsdgwy5kjx3zfu3ylmhdvt3phs9xysf","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"I39ttuFZZ9Wd9lamB49qQESWxaDJDAo7anrEzGnneRR2eh9maedBY9S8GfZA0kS++u9+5G8S5La1RdyZM97hrg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/userbook","func":"SignUp","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"1/z3gbCEnL0WOfOWSLSc+GBy5X27ytGgkIIp0BN3diBhaHmUfrD19w9QRNBrvXU6jt3CfqkyabCANWawVdhtRw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1jxkgkn0vcxhvq2ruxuj4dwvfgxa8jy48snl0d3","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"wbzjSkofWn9RW0vpx+w2j6g9nhfRIk10Mf1QFP+m1rocjpWzsjDTF9MQr5lVrnsnhNN/2idB81+R+2dgjY3rlQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jxkgkn0vcxhvq2ruxuj4dwvfgxa8jy48snl0d3","send":"","pkg_path":"gno.land/r/demo/userbook","func":"SignUp","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Aqiazgru8g7JMr3ZQAHrBlEDF4tERsNexRbTJzhr3h3r"},"signature":"GhSk63+jYKQ8cySE4y5z6re0i6HLkipiiC7u9iGe8Rxox5UEwGOEz19zrytJUMlvt/MEfCkKbnJyTTbkgHslHQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1zry05elmetdftwclp2urcxcaty6hh0wgd05lds","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Nj1vpv8QLXp/HzFPaQU9EhFAQ7R58uBySl678IkHvlxndgCHEhW7DBl9DF7dL1LTA3jw9FLqsCrn+m1sjZAv+g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1zry05elmetdftwclp2urcxcaty6hh0wgd05lds","send":"","pkg_path":"gno.land/r/demo/userbook","func":"SignUp","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+1H6sAecz6jPvBYo4Jc0YQe9AV4f93cI5m9gzCOcirF"},"signature":"LnHSy1fnOfpUGrCYdhY2pJBYMZjs40/aQtu0aZJUtXhOpYW3OjiWsiZIfY3JbT7TWWk4tqW/KUF8MSEY4rdnzg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/userbook","func":"SignUp","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"5XQw8B/EdIQNjICaWy7oCE34QzJ8vJJmz94uLS6gSF1wqAVXD6nPWwjKhyhYjgIqJ9Kh6rkC6y6F153EIUi8OQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1w62226g8hykfmtuasvz80rdf0jl6phgxsphh5v","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"UrSu7PrppFxy+8eMss45eBNhTnAEsSDsS4cN+qj3ymgWaynoTvGy7BOP4M1aC3Lc2H2EIz/0e9rVGH5QLZ0IhQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1zry05elmetdftwclp2urcxcaty6hh0wgd05lds","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"kNHOHNdqsk94HXojYKNE1EBCmSb5moGO6z0F9MupdLhExZL7gvD+w0ok2GOwnwbVLIlj+CdtljAshKWb4HNdfQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jxkgkn0vcxhvq2ruxuj4dwvfgxa8jy48snl0d3","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Aqiazgru8g7JMr3ZQAHrBlEDF4tERsNexRbTJzhr3h3r"},"signature":"V2NyitDS8qVhVNKfRo2vsueEDGaQ9Ha32Nk9B4OC2+lQwxufyQfSL30y2400G1hRuh4At20Z6sd2+fWvUXpQnA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1jxkgkn0vcxhvq2ruxuj4dwvfgxa8jy48snl0d3","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"wbzjSkofWn9RW0vpx+w2j6g9nhfRIk10Mf1QFP+m1rocjpWzsjDTF9MQr5lVrnsnhNN/2idB81+R+2dgjY3rlQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1pe2fk3mdvkkz4k7nmyhqt5kttzxvyf4j0m7cx3","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"wWkqocwSk0kuNBTadBx4MTrs+BGFYFALsFP4k17Fwglyt7LB6zO3gjRLfzy+CRTHeYV7f05IKCBZB/abpyy5hg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1pe2fk3mdvkkz4k7nmyhqt5kttzxvyf4j0m7cx3","send":"","pkg_path":"gno.land/r/demo/userbook","func":"SignUp","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AsH2DQ59sDvmGFB9vM7Bx6yvQOVlMZWfj9ABhLqxp9Rm"},"signature":"AqHEhV9+6mHy8swkwh+s5BZOhYyxHo4yYXYD3XocKg5MfYv7B2Huy5QpiOK0oQPUZeyTzCEkB0Ak0UIkX+TlAA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g15x46up6w3v9ey7wkltf05jt20pa6g39kkjjx8a","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"KMa9wS/EZVnloxFF5QaakmuYMRY3mQMozspX9ZZvxkpmsVzolVVcb1rFFUcBbeajpHgJcJGx6OhYvBwWcZLixg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g15x46up6w3v9ey7wkltf05jt20pa6g39kkjjx8a","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjyiEoWXSv+3rzZ5SAqyejVu1L/j2YLZq1F/0SHfEWBe"},"signature":"3gQXspRONGi6ZiCnfkCb9dyrLVrQ8X0wouoGtmX42kQTJJucryJhswf9SD5wMke6npcTmL5thZYTrklYUBPCpw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g15x46up6w3v9ey7wkltf05jt20pa6g39kkjjx8a","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjyiEoWXSv+3rzZ5SAqyejVu1L/j2YLZq1F/0SHfEWBe"},"signature":"yXad9eocZuPbIycQikYjnWUZsYeFtMFd8JfJaxRVBBIQA3xPY1BxU7HUQMk1gommEh/S4hKeD5j/FoOaACsaiA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g15x46up6w3v9ey7wkltf05jt20pa6g39kkjjx8a","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjyiEoWXSv+3rzZ5SAqyejVu1L/j2YLZq1F/0SHfEWBe"},"signature":"Ec/WV+971w6cbmq/fyIwRZ1cE0z3J9buTnn6oAxZ7skehavGQhYlAT66n/IWnI7xgeu4rFQlt04iBlemqIpSng=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"20000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"DR5bx5K0naK3nlcLmFvk2b6vENyw5E6u+y6eoes69Hk+HZRP4H/a1YyPkefnO1CHwHJF9CI+njCQfTyQE1/Eog=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1dx6gadxk7zq0cxrrrfcx8s9823nwtvmm9z0xg5","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"QuwjZzMUkwqR5F3vwfTkp7aMZV111dhhIb+qNvr/us9AKlmgiXN7fcaAxKn2ne6a1B6IJsyHpOyGeeZHacL57A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1dx6gadxk7zq0cxrrrfcx8s9823nwtvmm9z0xg5","send":"","pkg_path":"gno.land/r/demo/userbook","func":"SignUp","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AmvySIy6ftpnP18FIot1UC68HDzY9/meEYZvz2Zubv+K"},"signature":"ZXLwL+31VXF/YS7TQdpG231q/f+OcJz0DCvt6zXtzPpoPqerAYEAmrswHRJ/ej+dxw9VoEA+7b71AiYpyGtvvw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g125jnut25t0tc9f732z2ay20d3ukanwjrlxsyj7","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"4cQ81WY1aGRdsZGCXNmCc/4+FvoxVcVQfNwnLFWXa602A3Rpr2tGs0jJRE/P1zz4+Ir8lWZuH4GqZ1CAOE73Pg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1nzh6yq6s3tvrspstmsa3csx57z7m8htt87ss3f","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"VovmvdRL08e/bhsK6saE745mwdUJrf+3MxogUbZaLX0xvj2kn407fRfD5DWPO0jhsWCOnwfcXtfXMPNUQonrlw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1kgez3xe638wstap4kz36nqgym9ln9vsu8ekyt4","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"uSUTRfVpArGeNE75s1VEtH5B4W4y0Y8A3zZFvQefPikoUt7xScDdKkD6T2PiOrBzW9sgCQSCb2lJ+J64reBvpA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1kgez3xe638wstap4kz36nqgym9ln9vsu8ekyt4","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qretFqdNoWMNzHEJ/tO69nyEU6Wfgq5QzvjGIAvO1GBCkeZVRLDcn7t0N4dftBhYf9LBS4AY2HsFXh2i43yWiQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"r6wtAGmybGSpqpQVmfs02X5g+sxlYwVNrOt8iB2v3tsjD7Qz+u3GuXumM8vBjnM6LgI/ldXzvVzSlguN/Pj58g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","send":"","pkg_path":"gno.land/r/demo/abcitest123","func":"Bool","args":["true"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"DNWJDPhDKGInkAUKOSTJdJs5qYHe+vzFFCu9qZaQj/oQ1zIRUWdJo+vdkVbB9ON2CEM/cdbD1ns5nFT4/Bfoww=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1g4tsmv53frj209377vdd0x6rq9fra887hw5csh","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ZvdkwRSp7m9UUWmU2DSw/kRXAS1YJehYHDyBD6NWiIxEE64LRd2L6R2f1KrOFiiL8os8DaKD/cIXzXBZcwWI6g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"u2ik3jJNbmf6Zjry/BGt/uTsfWHGHapGTzZ/Af3hGbJfXzdHaGg+/spYahsjv7Uki8l2zXwSkgjKAQcBEdmaSA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1qz3s9hd7ycxrv8ge56t9mc5e37sgv7w268ruv2","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"T9B/RBzosEolFie1jNfkhzfo9gB0z4CqXBqM5h73fAFmdRST8h6tiw5mJnXM9eT9DQ+ewypPdIcDXOb7JpEWLA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1fr49rv4pqme0fqw7jwjh8cfxuyps53rkhfnarq","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"j0zVhtgNwlavKGEJ8MCb0ToJVDs63fV5R0ZC9qyLGtoBOlCdD24ZcCDBZWhyBOy3Ff0M1S9p23Y2MPA32vY2rQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1469pekhw5zvzjemld9f0deksjaeephepx8ygvk","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"S+DpSe1MPXAWgKyKcJYR9tjKsI+SeIJe5WnHaKG53eAaTN59n6fzsXPk6kNZVg5KoDlNkAqRQgszkeJaVV8z4g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g195t0kmk06rp7kyz4cpdse3pyerlpxjuvg9a7xd","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"o9QUxckplY0lZ+q5mLpH8LjQc/pMlMPYHCWC6bb2hGBqXR/9Yq9bOwsFoaMhqAayBHp4KPdY9N0/s84DGMB6Yg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1mawndas8e782zxjnrg7qqrg2mfx4h7sfsm0nrc","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3Sj6FoUjOwr/Vz0j2ela2PQBDRMbK4f66A2PfQTfulgnbgdq7oMMrvZeu9qPLAWPnpTguj2AxdawjlThWlm9GA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g17uc8t357mmvp8x9cuehtr4ge5rten62mdnt6x3","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"4Y47f5eO4hX8ceDmwFlJt5EeDOJP1p79hB+rknfrloUweu5Lyid4bTJUoxbUFp0d7trFUOyQAuYxW86nURmnbQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g17uc8t357mmvp8x9cuehtr4ge5rten62mdnt6x3","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"bBihKC4Der4ntmJwA2+NepF5VplrXNzRtWUl0fbhb48XpAdc90mGhpZl2Ly0PEHPpJlPiN1eJvNk6GBZW4mdmg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1z79u75nlj8gadpc2ep82q8v8c66fc36qj4c7y0","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"doksvc+qR1RfICPxGX3BPQr6dbdn3PAR+Ohc15L1b8Nlm8bHihFf0jgIwFiaeaaVmLsve83Obdh3rPxwIpTphQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1fkxnch9sajrydheplcydv3s6rw0uk2gyv7gndp","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"FsWmmCUsnOFLf/FXg5AzdSLa8eCat3od0kpheanshA8vVXRGcr64TGJuhyQ5SW+Ji/Adx4jl14oUoT/lYYbDcw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"8000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"XPQ5KvJ+RDi3Zzy8Id37NLJ02zTZGyHKuycGDrBcfgFFV4zNNUmnzfjIoxp8dt1w1e44cpYQbl7cQs68jixGxw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"8000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"4SvgwVqEirJ+hdQKG4mnHqlbTE/cq8++Dqq67oFptOB08WKDmmw6HAM5sgqd109QuYFJcu7E5mdAsg6k3qRZjQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"8000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"T0CsfZnsVyGa6oceo8GIx7EiRG5xLq1otVW/anEfWZllDUdbztrc8u3SFcyZai6cKMR26irtrK0MQj6u8Zsx7w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1n8h74jx4kklr2lh8pwhx4s5vnt0fwsk8sxgl47","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"abFWeVsef3a3Mz3EviB+aSJQsJJApQeTAJmuDrEbJFthDTUmeaGGrU5eJ6iCSUhdebVeSFgvwopdPaTJpHx1pA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"4BL1lSf1DSc4sTl0/TVAa6pzVkeg7wuBblcnFAiDkZVWc0fBisfK4dkaE/bIfH1leIIVFYx28WZIFh6TKInqFw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"xbBidA2RNp38NPQpttLkh096wxn2B8SndOTEng7M40RZcP6XAUWZnHv6xblp/9tRctJnV/0iECr/+L6wF9e74g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"2fa/y6+oVQzegGIqV7OvSIZNVhxebyqh2L2ULs6PSrgPesSJYgl9M5RpBA4rOyD42vcGiINCTSYnbkjEnxWFBA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1z46a36cfv0rxv7dmvmlzz0c4sycz6g5se9ujpw","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"2pxLcrUhVW32YdzB7ZfaaNGdLCCBGHvnkDc4CNBBvek75Ozeg4N9NQOkI9aHIje10ZvSltKFVt3LebxHNBmMxg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"KendSe0S+1XfI9TSQVbGkI3Kh6aMjixEBy4KaxmWhSQw+N0mYxNCwpAKqlGnAjK8PwXC4w35RAXEF1KGbU1iTA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g18w9j4f5dke86m5caf4fzahxswqxh23qxe2rphx","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8b9p8rw4kDRtCh9bG9xBRLmmqhCbi91ZS8V6aymyHSR6HrQSIxNfGQcTZOR8+W/726BFGuQH2AK+A0YBp7EuRw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"XpKiTIQ4minl6IKxNmSFzcazFZeK4Pnna0by6EvVhN9eaRuwcUVkb4RzMZcjv+lcmK/rhbkDN5hzCCIUnJhDAQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"DLToZAJUC89Cd6rHZC/27tDlBGsVRNwYPS9MlcCsvTxoDk8iPti6M9BEPIO8DaGUPisfI8e0ngt9dxzR3q2Jqw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g14rggdzg9xdhk6t4ek047ejdzqucwpgr2zvy7k3","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"19IwudC08ZL6wizskyIUjEdSjxHl7X6lDqwmY/n9Kc4Zba1nAiFaibcTonx4MeOkXHffKWWjnvO+UhiiyWWTBg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ad7vldv0a46zjlgu5xvm2zwxngxkf77lc7ux3x","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5AlG55gdGRg9ncTLKVOiH9qtpFkRu2cQ8OutfojYkTZ9YktejS+cv2ac0fhUPuRp1geDdu64xnQacDS7P6YWHw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"wKyUwgK4nQe8LDRGPnc+ln3SXilujJGDI12opfH/5eAX23iUu7K2p87AFS+y6U357FpOqPTf9mscQwTsSlnAPg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"wERmkW6e9CltyfX0luwhFWPAkTwV16hLwBexZPjnbqRO90X0B0Twi2lFG+co/S9TPWOAi/S9ZT/QU/Dnm/KOvQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/grc/v1/leon20","func":"BalanceOf","args":["g125em6arxsnj49vx35f0n0z34putv5ty3376fg5"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"nUMFIy6U7Kym2VrX8Rors0a0nPDAM/SEn248/WKH+zE4EM+H7b1vjPUK6O56gbOJSJZbjUsZYiuPBYY5Hjbh7w=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"Bqn9ldm5Fy9KB/GqAJI8Ud3ZcZ3+cMprIprf1LPKIVMV2R1VjlK/k/YD4N1d51Ln32vcw0dKF5TTPbpcbFsZ9A=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"KKraGmawa5c/jsU80zsGZWR6x8updNQ7eXylqEIeVbdJWJ7WEVrcW/L2b9ejqFjOyguX8mYCQcdwJOIzv8H2UQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/grc/v1/leon200","func":"BalanceOf","args":["g125em6arxsnj49vx35f0n0z34putv5ty3376fg5"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"uRker0/bG52P4WbLcb4k+eeBaOci5hIbWQWD4XjHqqhdjADEzyaZqUuCO8+uSy7WdHlgxdFkJjqotHSlp2pmYQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/grc/v1/leon200","func":"Mint","args":["g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","10000"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"2PyW3kTtqM5KL9qbkAWyD7EcATp8UAbLBdsAseHbsWVcmD5X5hfPW6Ro9R/lJ3NwUtJBgs13p0w9E5lzHafeAA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/grc/v1/leon200","func":"BalanceOf","args":["g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"52eBF2SuxyU+vowydbpAp6hiTJTvCAWdoLWRcO2g68BvHh+3a1Sef3G5++OE/sMe5yUr7bpuUORHfp3Gj7EWtQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"fc0wZnM8dC563hf7E6hqdf+w30SuDpGxI69Ux/1/09djWvPOSSx0XWKOv8x6LAtpQ5eXJ2qIG77LV6OvgyDW+Q=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"OLdepGeMPDi1H58Ilnjdo7DQmDTBcGetMhruUuvEnv85s4zQrRIiyMmUKQ3yBoY783kjvA3Lr26FykKi5kClMg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"jb0Hnl8/Ypvb6J0jaUhVTtkWJOh4F3doTWoYSfLGugomxDW77UAtFdD4gHQaiytRqNpRF8Ve07rV3XeTHoL0zg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"Yr8ntjN+usHCTlqreOVwf+HhW7PNf3uAFzzQMd8Wqcll59r1LvIc6vpkgURecfNoZW8wCFTXg037EsoN2f0wLA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1mraefc37wwpt0y8g4tqzjjulwkt6smc2ffngrd","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"v/rKTnU4ecuPZGhCB5ftw9U+neSiZoLswx2kEs3CpRVjJGOGo3tROti7v3gyowXxAbquGAhRQV5UZqAUpychzA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g12ugx2nyqjh6mzqrg9heg2jytxrqewf2y9p423d","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"/U+73S6QaAXfxveqFOC1HUl/SwJbeEEPwdwDIbTQ4xkIzZZwv0YaDPHZ5DtIMqiVcV5fvgMUhRwzdL9sB82efQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1xguvpymzapl2qm2zwkvn925tsqxz8gqdkxxm8c","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"449oKApiBjEhpttDsRxolFLw7ClevSJmZN4hCI8oec1PL601Grmnu0YrnEc6lPEhbJkUTOUmO45oiw23uAnLRw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g19unvypf9wzcjafyagupnnv0t59h3wwspm9tkcg","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0D5sIPAR/w2AARf33EMh6ZTEQKW8tC1MzyTAduGEjk0FBclrlj2gOTT9WNiLFp2WnDYOFKaGlUoJByq7hpBLNg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g18wc0qa948rzwg4al95vhly5dh8yrkzzfghhxq9","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"eLvs1c+dawjBVVMZFhvuR+tUSC7rW4PO6JuVhwfBfhAx6MsmqlDObWBU2i9n8Ynnka8L7YawqrvEoUR35CQnpw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g19ygevefxnaltdfl7tgea8t6nhhap2cyl9dyuwj","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"UERTh/br2p0lYIpGr8maJzdoBn5zo1tLaLHqwcrQbEJtce89h+zSGvpdrK13wPYsij2G4SzUHpXOxEVTmKO/tg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ug2r42l4sucy7ed2wu55w9akq9l84t9g35hm4f","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"w+tSvN39MtlEB2u3pFZuDn4u5nr67nthc+1XyCw7W5poSNE/1jmbc36AMr4pEz4ySovVSRRO/P6ILCNwBaS9/w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g19gxekl943u9v7d4kxatec762fyjqpzxnzla6e7","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"mg788C2M+w6QHmjp7wR1IMjAq7j3ODzVgfQo9ADbsnkUEW5Av8BQNSWRvuUa9JBIqbOuYeghhxNMj8+KNh//UA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1c00ernllpapwa4227rjj7j3ypjr948el2m8le0","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1FUG+h63rjPAbrMktHO6Imf6D/0Sgq8BQnbTWYlgytsDAvZJ9JCcMQW5t6WFUiu4nFY7mjuJ0Ibw9A7l20G7tA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1fa7udem3a68ms82mv4au8njn4d8atl2dmzcwfy","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"+g0GgX1NBZYi7S7vVwH6NCAg9E0hYwqnystO8eoWIKZjH9aElXE3tPKatEZXcnZsOchpMmUiHlKm5+Fb5VcsdQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1wlzgrs7trhf2kwwvwj0mte56n38rn6l743hq8h","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qZ/iTXw83CPI5gY43EpOnT+Kmifa7skLf6UqekcSRtEx4meaE/iwgYau37glll3emP776OBoH6/M759c0QtJfQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1lvz7tt8a0mty82d45jt40nszvw0q2n3mzca9yr","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Z+IsVzGANyQ7Usj9zHCtO1plvv3cUd4RZnNA63B8XeEF5nX5yM5TAo6qlb82NRFC6+gcWxnV+WmrnxFZHqpU1A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1t40tpvpyfj492hwf2al66hj6mgf7acsu6rw9mf","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"aKnJSld5Y26Cv9hbdGPthm2oFKZdEK9WoS1o77Yvj/dAgTMpC5/HOf6MrLGuQqkx9RSKizxX+KVeicB51LNWug=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1m2ne26d843jm432d99aunkq8rn5taz4w38xf0s","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"L0NPbFKZiz/kq7gSK+SY9550RoW0ZeTtuL4eCOp1ns1tMgMDCzSVAyI+6Dk2Ax8N3d/8i/pMw1Np+Q0O/SU2RQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1tsrp0aepcuc9fu80afp0uhkxey9ad8fj0g0nha","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"vaW4MSZBcwySGJczkly01dB1Qx0Std32c3SiPgByzZoYOLWcSWy6nFKOyI0U+PP+f84UNZjHRJ62i1F+ebrXrA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1qt8vme85tz9kdp6hfk28fq8we226u06fdq2y9g","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"IQS2WpBIRWC/fqbUeP7MU43OAex0+VqbATHP8X6aLM1lqUF7riuAOQagIvffIK9D7Gl/FH7IceWv0TdQa4kF3w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1sc4zcep5x4urcp43qvjs3x9syrdxx7r2wcdqhg","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"guZc751PvrcVongdroEz68ckR35SfdoCSIuuziUbGUxUfTU+L4CUsOeXn5pS1/n5HooZ6n3yKXedJVeB1vTGeQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1xeuzf92plp8p0rw2rr3lym78nfgcq0zukpqxmk","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ZwGa50xUj1Pg2SsYQn4SfBdB8poznY08cHEHd1aEyCEqugNKV7rqmrHaNFcm52FSj7vW4bUQ0esEz79FkYWa9w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1q2ru6vt7kmxlgl3khk7vqlfvzrvxanw4dv4e2e","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9AT2qKTEyl7Mpz8bU0pEUStVwNi4gnYxVd021eGnLYRx90OakS0fhzZ4m/IVf9jHybpCwy8aATL5CEHl8o4EHA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1lyrfcg5l66zjh64ue5yqwuptq20c8wwhw8lq93","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"UcYpAnWiayVcQD+BLwsSthMjyyH92zfACuVE0QfUxnw+vQ2vgYngHP/efbwnSUuwRcrrqJCoNmEOgMVHLC3DuA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1zf0fp8dl4ykjknvzzpdgh6enfem8rykr90hf08","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rcwo94QibgSzLuvHg3znMBNIFQr6mFuLZ4sTA6ZSkCwz+CS/f4wnWfCAGLPWDGy5NeL4xl5OCip8ctmPbwc0Qw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g164myue5aaws4ehc9fakej3q08glpkst3cn3ehk","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"bBfd4Es+2Nk0xVK09PMy7q3R8yB69pTlO/5ozKgpEp9Nm5p9jGYKCFgznD9a6friGRUblIdQ3bdKMdiMj/bF+Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g164myue5aaws4ehc9fakej3q08glpkst3cn3ehk","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"+sENjRwHznXJVi8tVPdK7P1eqkmA7pXefpbh23WsDoRsuTY5biL9j2R/8vH9x9hk8OCxoyQubNNBDNtw1OxDsw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1l4pc52xy0etncudusafxvqzh0thxw265cjprcr","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"UI/LMGEULq8oo33lU1Gq6hDRtMebeo1GWO38LztLB1kQRdW9hKJG2Y3oIqFhCj03hZnisdgNT9y65QBAa6hWGw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1l4pc52xy0etncudusafxvqzh0thxw265cjprcr","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"vVAbhfTtCxE4gurVag8oSZbO2zXHGa5zDY7+q6cplEAMsXxCN1vt5SL/lTa4m97AUv8HzGHPuTPwl6M6hJJOfw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g18rxaq6fd9k2fe0tknfp2fg5wna8uv4wwd3a2nz","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"LjJjg6P15jQpFPSL0LkXQpAz6uYAnW1ZEFz1BqA4syYnWWhl63J6vQoKfncE41aWWVaApzcTLEkOchQ/+Ymd4A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g18rxaq6fd9k2fe0tknfp2fg5wna8uv4wwd3a2nz","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AzGOl73L6y1ibRINYS+Jw969kYv/fHKfCgigN9shtiQW"},"signature":"EXc/zLUMbBecedSwfz9T6aN1ZRqDgkcA3t4cfxigT8YigwgsCUcXAqraITbGZvDHDL4NhXycUnuJo2x1G1+t6w=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g18rxaq6fd9k2fe0tknfp2fg5wna8uv4wwd3a2nz","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AzGOl73L6y1ibRINYS+Jw969kYv/fHKfCgigN9shtiQW"},"signature":"emy9aI/OxCMPOSjenqktchbK6LjOA59x8G8e3NocRBwbVlIeb27ElTGPV0f1xn25gCRGC2iNy2ETgZ/wi1n6uA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g18rxaq6fd9k2fe0tknfp2fg5wna8uv4wwd3a2nz","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AzGOl73L6y1ibRINYS+Jw969kYv/fHKfCgigN9shtiQW"},"signature":"x6U727vBCPJLqXsz5lpV2eA6Vp0lCVO6Ex684Vd6hLZw+d3U8HT3ZKvqfuwP0XvKEenbVINN6M0fkRFqS9/Xpw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g16a7etgm9z2r653ucl36rj0l2yqcxgrz2jyegzx","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5yWCyuH7hcvBuwy3Ot/Ejmh/ir4y8ORj094/o6wOOvYrDl0rFhiHrdB7NQwy/g2CovIWPijpdkdZ/cXcrnbwjg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1fn7dawwcvsp0yeg3t5ku00gtxxf3p27ccvw3lt","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"jT6/wDeXdGvMhn5GDB4DXEXTI/vpk2J0I/PSXECB8BtCsGpns86jBfLmK1cz935UaKI6w+3jyfs1rULkfpicJQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g17cl0w8da0qlnp4salvfr7kdrgmve0q3xl9htx5","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"mZ0x/VDweDiFahunC/NY43EydZTPAe0JTmnTWVXDRUQ2clXXldNRVAEHIKjQhhAs1GzV4yaAu8UtZSElbLUe6A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g143ew7gsequr8rzcg2hdpjg43mpcvx62us46y9d","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"DhJ+IuSHAsfkW2Ab+/zdo2PxoGX8ndtQscmPWM/MqzFXRmT/SdTuVqTAUiOZaK16FD5H1ICu7sa5aE03EpJpwQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g18v9c6cz4c0q8xs72prred0qxzrlxue777673tp","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"+WT+sihCkEHQiTJwi+v1BzUU4U9mdTR3sdPTguEbbcpkuhH3/zq9AUpGkqKXsig+hAohjVMEiebtjOmgpa8QiA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1e7e6f02my4e955ryaha873gx6g3xj9ux3ddz40","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"hOBzzrLjNeglEzTiDBxbNw4iKcE1PaeRUuh6EyDjzDYA01lGL1zMPFFAn/BbUskoAloE6of/aKN1FYoLmAq3Yw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1v33xhj8qzeede4kyxl4ppusvhyz6t50pgpglyh","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Ic2uwtUxEW9j35i0bFAyQQFfZ7tVeKkKYXHKYVojpu55Wl9fAF5NamJGKb8I4Z0A4BNBKBgcQRkd9L7ZkTu0HQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1j3snslntzt4q74uqzd3pcwkgjafdwnjm5n8lql","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ZudWzalBnpUYxnfUxuFRjWM5LirDV9LBqyTqiNFwp10EtVxPlhf12WutvaenZxyFdz878rzR4y19kRHYkZtNSw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1fyvnkl6t0tuj7njpfaat5g942gxx43dxmsgp2q","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"IBwW8xKt2v3JBJ0uOFKfgSSQZCqSXkSafTIXt+eOIElDiDxImtMTCXWC8nXmAwjr07rf6e/0Yol8jZlN2zyYAQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1yjhsj75r7n564wkthg263jqrzwa8uyfqf5tr4p","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Y5Fziu+Wrg/S4ocwTlvvDUc3FhDVuaMhdgU3ZqOarpYE1xAbDJuwSyO1B93bQJ2ByJfA9/LOfvtxXoapuClryg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1nzevnftyunm0mxqzc9nzhf6hw9w7hxjea2lxhh","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"tz+vewQyvXS4EusAhJPyrWtWWa+KgpGZyo3BlzlMteJQ2SacZ/KCZuJPIZHX8CRaLPveOFw9imlEQtuj5MVHXQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1fzw8nklapve02xtn53p79lvfx6dhenw7ugx30s","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"N6MwMXcqq0BWqmFYO5lUL4muNKqq9N7O1B63E9owaMlZBJIwnxs8dki1mJvY9pm1pmLfPiJf7lX5PraWjmm4SA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1kv0w2fzv2mnf39da3c9d73upppj5l58pt38wq6","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"7Vr0i8P7+lEwABsmIvd/M0hmgYFPxDhxEwpCnsQGsF8HV3EDR/WIiA0HsVEflfw+ajor5bkEipEyd8wIlIu6tA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1mewnyl8gpkw4d0amtmcvdawhtj2k6yzlmasnlx","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GDeuo1x73vVbU172XMe+PRo00e86c8z+gcPuE8M87REBmvEbpGvtRXjyoL5qP6jsN1olG6tan/e7YFUPrv3vRA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1c40r3m9nllxgphpyuy0ferxwyak8wglsqwkksv","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"TDRWijVWT1kSI9foreRTdaJ5QSPbxOVIf4cETnqSdxonNniq91a9vo34GD3zfTiEBa4SyRMLIHlgbEVfzvUI2w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1u9vlsnrv7lxfuhupw7v5vfusc657gvh5hj4fj5","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"6J9zmCnVBBhoLYZX1Qy8SBBn/N0E8LuU7DV4rtM+if1ngYoq/Esj9cS4pi9DhD6LdGxZ1t9PgGwTyoW0pLqjfw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1s9zqr3s97l05km7erlwuy7xdwq9zau62xhwsw0","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"o6rbAtMIS6VDET4yYdXIUF68ksiG5Yd72BCOUAuqM4RZ3hgvUCqURc2P89rtgwsGAQatc1wDMNLI/iAvfZ7o2g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g19auqnyaq82dsydqxm32wezl70xn6dnjq03az6a","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0wQ9KCWjV24q8Q7n+vUFn5DjydFoOeigvV9MzPWc+xIuG/IOuGLE8Yg9PVyrKNooBlP86k50W8WiqjUcmieBoQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1j430dq27f7axnnmwrgm4rw2kjl20cx4z846vht","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0kChbXKymwmILnYgeBpZf/XxtFJHoddYytpcfx17Cb8dHR3byaKuQIhhkQc55TXbRF4BUmBOhjKo19xzcOqN5Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g16zr3wttqdjnumwscsjucffwxtyq7qk90nuxrj6","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"+uyXaljOlQIjKXX69oRiWKA85d5iJMU69zH8pPt5jggf9QYXYnf29H1xBKZBR0gTHhj6IOr5PpbdjcAGEtfz1g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g17jlu6f3p6wdp8fwyzeye7a0ylskxd3llgz5z09","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"XWJaub3Y6Wu2PuF9vYvA8HdU0w6zo30YBA3OtqyAJP1vnXYSSpuRoTVM9UKPCXejj2Mn0IbGouxulW/JuzAqOw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1p4707jpcdzh4ppdh9rjvvvx7ks0qca3alahvge","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"4B3WTVA864Nx2JZgytSE66NhZyZ6Bg9/AxuhIh1jRn9kiBNsQaZ6s3Z2LbfLR6IiSLafJJBPMjC5f7YZ1TsPHQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1js42f22px67uy20lvn2ze0drjwwvs2g345uyxz","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fy0K73idTr0U5Sl+sP709F8T3N/46iUCxixWDg0I4D92EINv/Um21FeqDWit46vVFNUtGaiO/+UJ1xxdclx0xQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ns34kdh4myxr5ge6mrngm3themqwj28uww9zp0","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"T88NTtSQ06b/ksswDbuTPm5058qtT9jwf3xIaHtJkCVMvHwJiPu7G0IiLcbt3+BoVV7lenadrzzcxgUnJcvfjw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dleftnzmj0uyhaatk2s7dctc673699s84pvk3z","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"V3a+rE+ZLOqfMSRtBzZE7KuyW5PpIU5WfQI77yezu31PpzyBiDjNeZZLCGbEw/vag8+8SxWCpjjLj+YyCcuT+g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1vymrn0v33vvd08p4xuh079m4cexp3ygmhglgc4","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"P1mJOgPcdK73KFVGEO2GFIJon2ME82g3RZqGWJBDaFos/Gju+75XCdos5ydz5iFmPRdbd8msYu15N4N9D6iUGw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1shacfz374ayxvvk7hnx33pp5te24y2txrtzha6","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ZeWrSeLzi2rwlyYyvzW4/wG2gAXcr9YbXNYL3o7aL+BK231+e4TzgD1URNDod+QjU6OsokHLBmVnJP/4mpoOsQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1g3ycwas6t943wfh69ppjdt94zd868wdm8hz8dm","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ganP40jmgl/h+7zNB+Lh01EL9XtZsLkbTqsUVYcOysI+KC1YtZYPh+rMms/Mbic78qHAHcqe9pm9mMyt0gH7aw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1qrdz0amdfz4csjt9tm6zp8gkfm82s2kxkvc0ln","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Ghxb3AonCoPt264VVYUrd4/JYj//ENDFWziGrpQDIAQ/xK3evDlx5WwDst5vbwFIijN1E9SIYR7uK7EtPiRG/g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1r8nt0lmnvfr54qzs9t3zweyj0ujv88lgp4vc47","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"H2eXui7cfUtyBPbR33Aev5YYeLG6VfwZi20NsCTtVaBWEH00qIXKyA8QFlAilw670SQIZ5PJ8XBIH1+bkDes3A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1xnv4xlna8arjyj0h6nwfpay063v6gys066dese","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"99pUe0V4bsXPvHQZFzxkInuvXNS7gRF0QvSRVUTNzHptLTtUVHXEdduhLkZaR2zQDVUwMGSrZiI+Fm709/APVw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1snt7pfs3crqrz2q2r7zul2yqme4x0xvzkyvpax","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"O3xmkUZQgvYlB0UOUW28cVQ6vno/3qSPSPTqbv7icl4XG8e/Ozok5hfJi25WB4HTC+F23fMJGSyXZVr5h14Y5w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1p4zhhpx44w8lk9hyclqwh8hk72atd9fp5epxhd","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"tZrkbpt+HN5tvuDHvasF7fVhlKAnuAlhKaGzjaF6dzE3HKsxpS4cZXS2hOKNoWIgiJCTXf7v3W4avFZE4ImPQg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g19zsrvkeylhlge85a2q7sf8sk0d3kr4mxsnphjx","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"PRpK1IQ6Cj8EDppNFsBbQDlaHpt30e5LfjUpI8cuBoRHbpdRcEwl8/Kprjxgh4gccmdIKG91x+H3R2cDA0/izg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1gguzxmqy28ghtdt803zpa6sf3stv88q2d7eywn","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"QxeoymRn+/uWlYteERJoIOILlIDx4CfpwOK0RCuU0Egrxxb+5pLtptp86ubxfU/6+CqfoLE3r76JgjFQdTCUwg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jxkgkn0vcxhvq2ruxuj4dwvfgxa8jy48snl0d3","to_address":"g1zry05elmetdftwclp2urcxcaty6hh0wgd05lds","amount":"1gnot"}],"fee":{"gas_wanted":"3000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Aqiazgru8g7JMr3ZQAHrBlEDF4tERsNexRbTJzhr3h3r"},"signature":"pFQdHUYeBgZiejlbUy7YTaMEKhMhBq8fAAjhyUemiK5a1Kuh+UNSrtngzSuBn3qMWdXv8/h/hp5johou1RqF8w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jxkgkn0vcxhvq2ruxuj4dwvfgxa8jy48snl0d3","to_address":"g1zry05elmetdftwclp2urcxcaty6hh0wgd05lds","amount":"1gnot"}],"fee":{"gas_wanted":"3000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Aqiazgru8g7JMr3ZQAHrBlEDF4tERsNexRbTJzhr3h3r"},"signature":"++BRnWrJD8+2j7gaQJNeT31+8znCQFvgKOcXyOf0hH0Di6/WTmqEuZsmDU6SiziXxjwzrrSYNQ52zWrd2BKVSw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1zce47s8av4jms7jj7kjn7s9swj2m6zlf047wwz","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"XR3MejoK3+pl7iOYzY2bd4Z0lJTE9uzmPGNFqiLsPq11NE3hGC2M9KYcP9yaI6NV/VHwDtkrubfwgB3EBZMMYQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g163v3wkzvmhqdawhyvmmug2v23k56fd5383wtr6","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"2X13ejrgUPoAvSskV5jcGJy0CwftEUVc2BkSzrjdx3xHzfoPyz450EKZYMU7sXFZGaZu/o4SvVAlazHZCRxqpg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jxkgkn0vcxhvq2ruxuj4dwvfgxa8jy48snl0d3","to_address":"g1zry05elmetdftwclp2urcxcaty6hh0wgd05lds","amount":"1000000000000ugnot"}],"fee":{"gas_wanted":"3000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Aqiazgru8g7JMr3ZQAHrBlEDF4tERsNexRbTJzhr3h3r"},"signature":"bq22b0ML+9Ld+vLG79qFaeZoEkyUmmYJ8pGTdxr/CBU+P/Xmeonaq7HZMqGtWHrfcZE53QhiIvvS03ygMFL2Mw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1kwz3qvrf2r7w8rcx4mexuu88usez6j57u9gnkx","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"YZ76qNNiIb95wcaXJNiQDAdWsER1lr/jOvh+GJG7Sh5QIOwfrUlm75zg/BNfKOnAwuuT5W4EOfP3TbYmvo7aBA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g19zefzdaqgf979pz37sv4tx94vxp3sqhyegweuf","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"wFTZQghl1mU3ejws1KrB7n8knX295GV7dyLlUrWtGbA7srAggf2g1yD/TynmI4s+FyGk4Cf1Fp8Kxjx1xj74SQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1cvwwnac72p8yym5j78v9rg5e274602x5gflag3","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"dRyRH4EJxUaJ3Ph/KKesRSR3cTsbLAb8MnB/MMYLcCB/w0G4+cfGIQxvnS0G5yBiCl7gQruSrTpM2Pxvk65JTg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1cefj54rs7rmp8qumuc0mf4sx5wq975kve297gq","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ZOw95LOIvluavshX4DTzLBX2kp596cYpDkmCPSKsHERFq0e22fQo8E9PN9hCtG24lp+xxvMkyONZYYRY+4NaWg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1estl9508787quf8m4sy8a6knet33x4ccyqdwwq","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5CGEYjuIU6wqcmSSAB60hdqq5k/d+09Y1NDCzjYbf8hSTWy+Ki2ZpyFXh1lpYX7dfsSMHQdqLksIAy6mYZ/ZBg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1e6kacmlddj6lxh68etgsk32djgyg039qknttce","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"HZqeufD04axny4Hge3UY0ApJd3cHFpxby36Wo7dr/sMkRA8cB8bK3KVUZ/UBCN6JVnX56PE9XHRb4GVVJA/K2g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g12u9pvjvfp63zk5t79h8t92gx5uv0y42a0gr7h2","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"YVwf/+v2t+Xa74UQdc5w4Bx8kxWXzqpZ7v84EoFY2Jwyr+t+9lYmBTgq2eNLQe4gTKNuCbKcomptNAUGSM9JWw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g17pkk9zhghp0ska27xu94ylpcd0wnkdtddnklap","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"V+FnYQ2zdL9IP74ImHQWBdgegK+xoTXC2aeEWlOhcolHwFMAg5PJpI2n524pdPZ9TNGMCxpSRDVZiAgqyQSx1A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1pdym68qzk9v2lwc7ahfrzhx254nly2qfz65ear","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"/vd8HXo8pbfezdno/a0mL9Dz4V7x42tkFiR9PwEOjYlsY0YVx4nhnHcTIlntySEx9jRXpN1fanAxM6UzRy/uhQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1tgyxhg02u8ktg669kskht03wxsc7c7ltaywxt5","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"if+lTXbF9f98QWtF4yd7WXpeeyFZjbFJ8M5K66W+2VYNron2PfwHch2Hd+LULvPI8YVEgLDeUTvLnAh6Gdi2XQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jxkgkn0vcxhvq2ruxuj4dwvfgxa8jy48snl0d3","to_address":"g1zry05elmetdftwclp2urcxcaty6hh0wgd05lds","amount":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Aqiazgru8g7JMr3ZQAHrBlEDF4tERsNexRbTJzhr3h3r"},"signature":"awjyy4bbWlfP9XeL1XoUYUDRf9KF2rbR4ct28tqBfsM3ccaR4z0OgLRUkoa10edMkRYWmEx6DygP0rL+48hWXw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1j7gmt6gnh8ym6l4vkhqhl6pm7fk03f2kwgak27","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"opvNQrEYvYtK9J07NB+fD1GOMj5H0Gg1ThZwTX7FulJ+lwRxTG/7OuH/D6yf8+HhQ1tgraGPUbGHjo/401r4yw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g12mcz676t5ajfmdf8euj2cx2wkh8mut5lz0ypl4","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"hEAlzWUbnh7tc6gJf/UkH3po6nZiyIz2T5KT7qKSCOBzzNdGY71Psf4LXVviP8E8wImduc9g8TECvjDce9acpw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1az77kxlrdw4kt3hdgmdfnxp4tesaszyjp8925x","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Yp8fTLuCN5O2TC7kl4Vq8sS+P7LB6VLvsYZxC0Fo/2tn1FfoQMJlosinbLus+ck2gFTZfVW9JLeKA44Kvzdecw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1r4pyrfd36ngkhvdxte7m4wqtq8n9mp4m2ssmz3","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"NsL+M+7VRSyV9sMgDueGnKK5VmTBJ0TzEoySHz9+JI109Gm/2oak/RMQrgjg72RRaPhUYd0Lg0WnodHM+56IAQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g167twpzqeknc4jz7t95u8llg7s65fc74zh4pczf","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"w9fDiB4U8bkSZN3pI+9u1HVM24jCRxqUgajSFQf/tc0dfljLjLK2FUAVdA72wEJa8DRLmsD770xgfUAjv4wkdw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g130ek75j5hkygjmln9g0pm826dclhvaf8lmm9p9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qXoYhqseoe2KQkNkHK4XuyZe/umByXX9NhWs0Lzob+EcKmPbT32vNPVVhc9+sdmMGsipf595m/TvOqVGO+CvKg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ahqv89e5hqve4ntmlm79l2dpuhr7577fsnc3wp","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AiE+k9ItRHF1sxqZUuLeYxTvUR6eH0mhQCyJuBM3a1QaUeUkp/+27xBoXFqdAiAfs4+4QdeiRVhijiHjB9xCVw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1t9u0ylg533w86fv33g45u20ha49lrn43ddn5sa","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"WnZjxzJ43VV3WTaDigo9LH/5V1B/RruhyEN+EgCQow5jGyFfkIwu/RSGpPmGZFPViSnfigrp2V7otRFFZFxdrw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g17vz5wts3mgk0gwdvqxe9a2rh3w56czgwvyjuma","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"bUP6I8t5HzyGMO634mXQYvwYa8C48kre8qOWcqFZ8ZBXSgszmyWloSRkxe0X9CgptQ80X/Q63Nbmw3uv6fIOTg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ed8w05peg890ef63gdjuha0j2f4j7035yl8qzf","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"uzJpZdFOGCychE6qqKw4UIy1ksGVU/i3AH9ktQ4I6A8NPPw66dDz54poSfggmM2L9JbfhFV0dHtv7NbvEaGJfg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g17qmyc6qflkl4xarmhtemp868dmw3frpfal2gej","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"bezJXB7RczWCp2YtiUmbM0p3TXSnd8YPFTy5jnTOc7IpfYqfpjsxzWMGyuC5uoySpfBF2Lf8qOMoKyjRK1X24w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1677pl0ckf3pnrm2xqsdn6ueamtgz52p6pd0gv4","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"QkBMU+srxTUKkrEFl/XccYLny81PSZ+lgJhMVrwG93JCm9lqnOJbat1VdoMEDh8zjdJx7vO1sBcQzINc1aUp/w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1qllhfvp2yjs2l9zhslds0m9qn67e4sqjzm0ruv","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Wrp+kv06UBU+WpGY+Y9ZWByQYEnrtaotrH7aVf+0FjhStuA0KF6Zwb6GariJaW9rHlEBbpCdS3PsanriMMnyRw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1fjq9a8yjgn0fme9acrr5hs2834wps2pcmu00df","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G5h7GxdixQEcBmDo0Z+x+8UYmnsImybW5IvP6c1mjGYoXSWFagddZCHQ4Vhhj1hT1PCxZzwD4pS2Fpf9w2Aurg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g13qdlmq6uzq6gm9qy268s23y23aaedtxap2wr99","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"gznsYlUkOQF8XqEIemuDGpE1TA0gBBFXq7Q5RhC7Lt1hy3d1TKif+zGTh0+bcMtGyTjtzDQZo1Ezei69CrvYxg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g12apdlactmc0fd2fqzj3grklu22xyxp89hk6mx8","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"EPOqM1UGmi21kEK1Ohars2PlR0kckRXKTskUGhjNlrthboMUcGuh6HDwdWoAMnNXM8TXitjqvnhwzDk2K4C9hw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ps2390yuv3mtu3nn2na7y92t2l84fc63s4ddzn","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9e/ScEZLLj+9eLdtkLsJW/RuhaBAEQyMckXqhJG56wYwzhqZRJKPj1wJ6+p3aY81F/k7ZvBu9XTIIlljW3jTyg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g17smcxadj3m59tmrcrmxxs0kxs06w8umn47tfva","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8s9r0gMn0O5dz9yoh16pTEI4Eh25ERs8N/q0jNk2cFVQ2EukB3Ife/BA4dVb3jbNmIQP1nS9Whuxf6yTxR8Shw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g178fvkwvq8chkwg23etyfrpp6p73tavvdfhkuc0","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"vgD2nwGVKv3vswVKro/nRGEZKRqGmYayYsnKJ/EFfZh1215A59l8s0qiKsEC3e8aSpZ2VMv+IT/8he+YbqXctQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1gsxavrpkkh8r22m2wmm2qtmy5jykkgaq8l2pwc","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"SkRKEySAVQtkg709s/12ZRH3CyPjcyco8VBIXp68jFAtOEIm1wtTt7TKx9yS2iIvJv2/MdOUozzT+1jBTUq9nQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1rjk898ecz68a5yd67efd7qwr62r2x60ed8d3ye","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"b0Knyx0V+WAvlgHE0YaWJrtpTBnQjAbMzOYopsKLnU9Ld1wWU1Z61Z0xeqg1fV0L9uSF9MhtWIxI0wf92uJJ5g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g132yg355gjr22enaz9s7rrhp49j4y9tfmncjqvr","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g27a63rubhQYBQplMb+jB1uHBM3ZnE2L6xobr9d/0uMAEsQ6SAG3kSuNKONu1FcCmxhFwJOhC4BRgS3OQIqaCQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1tc9x3ygyp5gtw45dp3teqch6ef87hdgqqm97h0","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"TcHBrmRbOqWjwiISb+aT0Z9yetB8m70cLqNAMD9IrtxXJFO333KnnvPRsVV4+U629C8bS+RwWEszFNxRSTxSjA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1cnh2nyx47kqsafmjhsuh24eqnlm6nma40a45cg","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"n0yIPN4L/tEOWKF/dtPieyJaHb66yLiv0lQBLKqW3PgNruIklyzEiEfWbTb+DxIVrvO99PGP7DYe0xqSVu1IqA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jd36uhevu33nxp8jqdfah72uv6f505d6kj74ly","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sQAkM2z87tmQ9J61ffyyjLCnLLVhYHZRZLLiOjKGjAsM7+cUBL6TvnBWZEDFRPuIa/7iHjbnPpizv8yetghFFw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1xh9s2kvewe9hfsqeczp83hqhjp7fvaj76mge74","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rN4YFCfPxJgrxsZ7OtmVGzHD0rcJvqAHVLP034ukZIs0uKWO6PR4+q2fERnJ7FBezn6du9T4EiuiUNyLmc8KOw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15yl3f24ah22nmc76892urdqtnty8t4p3s5jvc8","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"q/dwwprI5JtkOheOwBArwx46ZKVQbGfTh7K0rKDuzK0fqD+XRFpJhM9uUPF9MNuumiCLRA1KN9ULnpSAYwZzJg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g13emk6pm78dk7c99vjvazdj87sptwwycr5xw2hp","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"de1x00ybQdqTZn3SEbVCQwO1iIBKd0nt+GHC8Z8IuhA28l0RwIXxTHhUV+5rFoZPNDCdGDShAGZ2HlhOCZqF+Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1qzzpe4es6flghrsxrmruejwwm7d9sqnckfqdsz","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"o/dX8guIlpTYpIrTLRF7YtEJA1/kOl6iqWlrO2mIIoVgKB4DgAcG0WcP0PDMZoeUnI39gkuMb45YuIyF9+ewgg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1aask0cwa5gf9plf9gmul35uhk4re5afxm9akzr","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"D5dPS5Q8RcE7LC87ge+4nOOz0U30hNT1AGlMheXXFwAqWyHQ3tUKLMtL/o+ekL6F/XQeRODuKp+Zb5MkrJ+96g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1tedvpefpm0kz8gk0c6rxpcupwug7gd9ky5l7af","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Qk/oB16GQnpSVq/MjqSzLcCnkNVoa1bF6Dy+QI5I8Elq42idjRg2jZc6AzNLtyNlwrdBoHvTrgyBdA9fB3ndzA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g18spk68k6usejkv0wupzl5vjdh753gggp0je299","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ZomueJkBNFKNfzjOKHqywNtq99s7n1iJNhDGZyNEEjtkl8oCk7bTlIQK9z/0ifa0dcA323z6vcIPpjPn6Q88IA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ajvc257j8c7d4e4f0jcn2mxsgzwdyl7hrtlqde","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"eiZQTKpA7CKKDbI98lApksen1yvM6avxb26U2UcjQfl+TdiuTDAzntRawdvLlajhVMKXJzWvhhVYE5k8VZQnXA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10gp9tkw9uv0kcrd72zwy0vh3s60023zs6kyw3r","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"H8kCXx6URp5RfA8fi2RnXJPF9WoNRddpkTMPX7cAIaBpuN14EdJY8ePDUSL8aZxrPLvcigUZU+yE+cXohH+RYw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1qnhdxve2k2dm4v3lk6xacesprypyqwa60tukrl","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Y+kM0q5RegvjFIXUvHNHA9ynfpN9l7i6mnSM9nFtOdtPgMn/UjbKDjwuvO8GTw6TfP/I6ChzUcO2Qs+Xhq6A2w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1qnhdxve2k2dm4v3lk6xacesprypyqwa60tukrl","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"q7YFWP6SwwirRoJrgbJTKBNPCeHsw/Ns2fR5H6Omi2Z4dF8R+Bl/fQJofs4qWOstVsEtJ75DMnbRVsmQmoufwg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1x8aqd5h86t8spqw59dvya85yddy0eh0ctdngq8","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Tfdj51XLHHRke3nihSqZos86osNe0AqokZymVVqcIxU1wd34FssozQjeUt2OooTa+sQfLRIBnqH38TolPxQg0Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1sqn67ex4uhzt60j5hek6f587pa8zelrggstyz7","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"L5YP25AjMqyv8VH8hcqguX99b85Zz09xPsr3NehIQ+sLjQXDgQl7l1SJqS8er99lbKR4MTfTrUJhuk5vW7H5Ew=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1cffquyqzvnyekqcd3ehkldcnm6akf0lv3r70fm","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"oddBPrvo1SKvScY9297S/mPGl8won43rrfwdDtV1UopiS8ojrFiOJp7QccCbPY2UFc14XqMmPU1wDAXW/rQnmA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1eumsjzmgfd9daa7vfpussg7heftrzeq4h00xl4","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qYuaGnY9bptW/r0WmFjVZAAEvlQWzfI49saN5JXthx4d6O7a8qlH1TktyFZ4B0rFgGtfa1FiWZIEAzGvRLV4fg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g12l3grsh5mrqvm5l663hffpnzerh4asyatxnlxe","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"J/79GHUSq3fwbejl0R3Z0/OYBA9kPUy9e9N3cIVR9PZDJg8VfHH7JYtAmlNb5WgQSudI72IGa/ZrqB9FPEN2vA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1gzt4df2yg623s0esl5gdmrhgjq5sr460m005qp","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0OhIo4XLjlhsMXX+06giIvG4WkpuMOTWVcvUSv1h1GF95pLkfpegx0Fh+P3+eufhe6cl1sGmny47Z3l88gBuRQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g18yymym3jqre05kxc5d5hvjfgx0m9z2w73l9rg8","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8e19qhOELssc9L6dOluMiDaieVMOPI8Z+WDvXp7uzmJncAebHIEcTe/bLsqsCsE9QHhYqW74LvqMwHsy9o84Mg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10s8kgqpva86n6hl483z2rgvv3erqqwawamshup","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"owE8wce9nRzmh6+29ne6OPWhyK61r+UekiBVScj3uUQTwsYCzf482kgZ5IBikxrPsRp6X4QQZQzEzy1LfJPmsw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g108vcynu5jyastgscvwj94thr5v2xhp9kpg0pdy","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3I3GfnEg2eGz1G3SzZTG0FaVSGI69BOZz2XFHjRnqExUsIQD+2f2K59Z0S8L0wbO7WrCVt16kBnZPvVCfYI+Zg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1hace5rjev0m4clkd0q8mqqzcsx67de8d547xe3","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"gO4XKhVIkR2tOPm4XirQmIgM9UYjuethHZZhSqXbS/UBNv+Zr3zdT4kO+tMsymhWn0bKSoreNnlsx53OlA8Cyw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1lpmu2lmflyuqxmqytwy2kmudze3cy9vzz6j997","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Ww9tBxm9TckJr6DZPHBaOaW7GO/2Q5Lk98Cpk0OC1ydfhyHwbBEsqwgslh+c4F8zv8fidUf3l6gbqyilkgMOZw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1gtladv6kley7e40zph2qk7slewkgr05scesdmp","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"h3h2u6UnedLlM24P3w3aonoXC2RY5H4+A8n+7C8Yd8Uuy36Z9TWd9HqzsaTEp7pUWB5X4ewjQV/2KDf7S3HXOA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jffu33gg5yhswjlzeckxdc2eq2ms8768u244uz","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"yGyv3tLKtg5X/y6eGAwr186bXeb+sjiHOJ6nGNQ+DG5dMGPNuBmrgtTdPZym6dAKsGYGf0g/zmKQq3tQPlY9tg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10ngnzay20648m6yezfn2wd9nhq58pwpkg0yck7","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"PefeEb4BDNXTd7BN4UBmuV6656JoJKEfmeAo2LaSS0deHh0mPlc66qmG1E0ckIFC/jljWn8Q7kf9lf6aLsHwcw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1evshunka6u7zfy379ts05pgjvvlngpy2lsdl88","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"lPrCB80pnYbVvUoW2156wpZ3xuYcqAJfuKP89JSwW/gRHiqJuf9J9twbNHWoAgm2tlLghU6+LH+RnCSX925eBA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g18lfpacuh0ckxa8c7qd7jy6r6qd8xsx3fguwl40","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"32g9XPfdjCYBOGDUzUWhfnksJA+AVbVC8AOTs+D94T5kTX4gU3GbrvFROnYZ6RNC2yrwo3SmkjEJQmJg6rcg1w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g16rs2nqj9t82fqkrauy96a8rer5sf5eq5xqft3y","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OSoY1znqRrmEDZ1WsI4GLyG9MpgC/pIxYdkJblMprfB2gDldVppcn5BBwEgIRd0Lp2qaHZlzB7tJUM+/ujv0Dg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10zcywzuqc3stsqj62cakmwwsjl52ftsnvcqzxx","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"LfjMHviSS2nY6k1VHlujpVuXicE1L3dCX1gmgNN8prYeDb+0jIZ85d8X1kAeLm2kKa7ThmNduJWPcYq7Rol/GA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ufu3p429gpeq3063dx0wp4ds3peg0r0f332h6j","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"F+OtTXTPc2x7vLC/sKFyM/LHcyY6LIQTzvFk0XYyCLFRyb50BJBx1qjbqo58B46fdqKXh1VAaJ6YaKyYTwLMLg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1rcxnjnzx78r2yly5wf2s54apyfhkce7ntuzux8","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1viXOSVcW0KYJZXUaEJ5gHPJMJoUa6SSLQh5KSiMdlhZwMoPRqxXvUZt2LbCtbmN2lkh5+is1QOeuiEE18/JVw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1mdp9dkftwrfekqj68knhn5ag4tjdpedj24sfs8","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"h3znhknh/Hsk+AzURPiNP4Tk5PyXza5RcvO2ybdOUq8KbCh6iEbX/jhK5PdM0hZRsrigTIrufUBjixOEpDXT4w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1tde0dax0zps2d9q38ksmhw99gke898uxuucps9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"eqmdo4a39t/2GrfflAI0kr0fCYTD9xJF/LjvwJ9zv8Acr5/sUt+CM6tUnjXOcHY2iFscXctOVcWGtZYYU2YO8Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1223l2hpjaphafp85yj8j8ccavmnuz8rkutzy0a","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"wkI3PtIx5dki2HZpslety4+NpK8konvPUEnotcgLSashVQxQikVI1ceLpeHx0iMYZJoxgfE42M5YC478itMxCQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1076spvaxezhulteygr92p84qztpjg2qxsaxnfc","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"h6CNsOgtuCyZgCo/Y92bFBLfCd/aCG8V6YD12ZiKrYsyqqM/YpTe3ySmt8DhYw/nRZYeaWHjZquUt8MuiDN+hA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1yes0ykr6hp7ga8e8g3dvwsgd2vpv3g0s5pte0n","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"jNWwQHo+VQkXk67roX5oDBPLUqUNZhrLUWQ2nGXDDRUj3RguXFETFzUb/GLLH7sRjz7M0T0dNDApFzdCxaBjYw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g14yem74u5mju92xf8numn0q5awvg5vcldl4hcu4","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"N0kHxVCQlqwpK0Z2MonihS4vQTWcvRlSlRt0ALgVRQ9hdK9sKszYXDmZJ3cGH+XM270NUlWxirFAOLxCMavWdg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1mzw4s5jj4evl6ep9u4fc07kp3ekcnd8f2p0tk0","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"JorHatSFNEJRTkzcFUbzc3z9V9y6nyMT2LKx6ko+1x40v9fJUxlWB0cdwhb+fVzrAzLCn4ZzOpJ0JaZJh4z9Gg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1j7gj6tw2q4hwl4el0pj7u6f99znzwlu7lj4wtf","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rmSmsLxbELw+gq/L29/SQl4s/gleIsa+ldK0K+1XtxpVBqYsLXt4dvzPnDAKPG2JCLvWIeu/tabviFjfkE6fjQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1znyfvgnu6t8wnrsggqdmtd344gcu60cjfjs23h","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"21nyBnTFu2oiqZ3sW5uZdZ6v/fL7tqYnpvZuUN5g1o5fAXrnalBVhnkCMpAWTZS6QW6Sb1tu2Ll2dC2BHPD0+w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1fn0fhmaelfvvzyxe3tl2zsnzj6xrtejg25lj4x","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"+iyq865HhKFi9fQN3FHpXU8ZRLlUcjvVbJUmW9YMA45Uq0KiCD5GbyifQQECsX9tS5Go5L21wTa6jGiJup5iXA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1sc2r5zgfxlde9d6qaf78t2sa4t5w53cdeyv8nf","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"zRICrTTeB5iEdjuOXLDOAIkIZgB/+r6y25RpIA/MoYwzijxlfwkTF04knN2tpr4i5fWdqS/6nivWgmgRIt0vpw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1spxskhzkg2pd0c6f332arhrprst45lzym6u6wg","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"MK/bShIrB6UpPHlzaO7Jm2v1y5YHQbYTQNDaUxVcMnxoq61Igur96SkgLCjyO32KHbmLRpy74nsF0EMVXEXo4g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g13srwe6ygva86pcywxr52z9y335mm4wjpeqc7qy","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"vaWgfzESUA0sNuoOruXK93u+g6ZjY2BhV8ScntHGoIcR1TQHZYIbBeZY7MOg9lsIxByKQWGj52Xqm6y9nB1Dzg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g12kglyqkr5ywrwva9w5c88u6dpfelhg355pnl8n","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"r4oWACRcIk92Hgj5hfiPPbcwUdyMMSDoRY5ZaFW9KBo+WSE97gc2YO7W1ZE5sqyRolvJxrkLlJktoYLZQ1PP1A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1agxn6xunmp2jhjfka29ktv09hcu2zj88n9jpuf","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"BJW3I+WKLcQslHg92h61AG/wT28hyvUV2IT0AUKVCI0NtlG5+uYcFGZi8O8BYb93/zC5yAq8EUh7I+1sYAvA2g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1vqawap2hrefm2dut3t4ye7mwhs3kqk7rqtdeeg","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"/MxclNj8zvrTs9p1//tehdQowgy/Uza8jXBs4/3Utr8zkQm3hu9yagL9dY2r4NZ0JzO+nsTD8lxixfqlRzwlOw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1lv4whcmttpn983fvrklatd9x0mk3m6sh0verqn","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"/56UKUFqvgaptpI2ROfailkwB4WPMIgeX5SheopQbythd+Tj5EKrmbvi0/04QBF7HOZk04zawbuLhyF4A+esgQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jvn780edem2gemwjudxu4aqe2nyw0egxr5pjhu","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"j/iTBVeEjXjSx1P3e/0X6yuwzuegrGPbrsj2cKz4HqMYVD5FJstkr9bcQVcEKS0Y6PUmIgxBky5QyBuwa9HmoA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1r0uk9hkrk4hkk2vlvf9w2r8zr6kcw9pylvg0zq","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"YY/nq3p0LeJDzQ7KK4z70/fpEmOSUO3suvktl1kDUwh8PpKv8nYc1TH5xfnAmV+8YhRWGqb1mkMkfWa047dapA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jauvrxtdlnnp7ta956e656lcpe66lu6wpw4r23","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"gJgdaZpDNmYQsit0/XwEk+TVMr31gumriGM/CHi0/j9khOpHooW4NF2abEB1Z7IxNO0N7M7GH/41YBvB4TzYzg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15fdsrdhsr2rlqgx7al26ngfkzv0kh87vvkgxj7","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"HT6H8P8zRDiplUlJh5KrvY55FjlMAMZLxp4UK3UTTNMPzCMFlj/xra4vmjAENqhohZ0HG0VR9NbVBvC1axGZNA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1qzspag6tjnlx43kme4slthckf3a5vr5sx4tv5c","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"4XTEwOHAVEgYHMN24FYJ74M0cGohkErvst3lU0pNhNFwuy010uPwsBX4s27cecmQbjZi2NML12qEOCqYtba2Ow=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g19uwry4cm99pg872j2gy449em483fsxkl05x6ev","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"wA10CjTxDUU381KIIzK8g2A6bHmS0ftQrcmzAUy7PsdX54MTksCZeryenejgGGEpctxIk45CGYUDeIEth5rllA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1g6mrca6mneqe98mn658g3np06f008g9dd825xn","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9bg6OrxDVVBdjv4X8g/lTKtqPg4tKIv/VIlcy3UTOpJYh5K8PQO5n0gHBQiD32Knth3ePtTeusCWocthFWxV/A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1vphh2khghj26jf9k7ex34ycy6yw0gh9w8jnmhk","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"i1BIPlusUWiOdKdI3cwrkaYS9ukKuJnwWCEKRNelGVRHlbqThAM/NONGiGmVaHUccOYPTXuQtpqFONTbQ3NnrA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1cnwkc7c506djesl0q88646fd305s6uvg5n5a0a","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"4M641N+pu2wGq8VC+PIIoHBd7sGqMSg9x2caA7kSRSYkiD+UwE//hnzmh/WUoom67h/mbtdo40od7rdIfz56hQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1k9txcn9tmuz4g4z6hjv97s80huqu74wrsc4ru3","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Iiic3DXdBEjJ0Yj/Lrfy22YjNHL7RI0YJAKA4eU53Rtbo2Q3cS0dbvMwcwGaJDqCq7xt9CsVEHXZ4X2so1+2Uw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10u33zpv87a2wke5kq04s8g749teg2yczhad8l8","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"FaFzbb1wDNcPH6RrJiQdfEKvurfcrbWLop12oge0Ttg2hJ/UpT8oH7WWoGiKGxPycwdrDpbtkM8qjZdqNs+JEg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ywtcf6rvy4nqsptc8l9suuhywq4qxsgf0lqa7q","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"KHXCjGmYDVr+0KP9qkt2IyrDY2DBxDGP5VHhhdHSthlbx/P7tOT84yRkm5TzOzHb9yKFzu43ND4pvVw46eBTqA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g12gf04rhrpt5qrvw7ypl2utqjzxpa0azscr0a4z","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"QzjAqsHhg9JXzcMcV9JjQZETYChf5tKdPORNoMvNCKAU6qCTt1jKFsihvhy0loH4rOwfwaGE+viopk9VxS7SyA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10nukqc737c8ntya69szs4v0kmglgy5v2n9jkhp","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Q3AjVnhX3hfR2rC85nEg9ibGJ6O+c10JZWjVzw7zqjJT57PXAFXbWPsoSlU9WRP/7G7tXMNSFHaJrd9RAnUi2Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1u77e5mkfxwuunwxfqz6rncke7zrvv2vy62cwue","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"DCDRtifBwYJX8Db69gs955wy/roA/W+utShNhQQY6xU13OR5RYmrsXGnYgKhL119U2JIK6zVNksFiCovRx7KFA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1f8xlrrq0n5gcuw83up8q4n7t8ks66xs8kfx4gl","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"4QiL+WsVVkfLnVYJXtFeUyorwGn7qC7sQvkJl9OBNStIidDboLW4ICUM6ghrQf82QjzUDsdAv/70vPsH2ZaFag=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1mejfqc7kxhpuj78y90zz5g3zaxxdmh065yqnx2","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"IuTQ/UHoPkLeK9dKY0baAVqoOJV07VaEzdz8nLrVQuJ0Raeoydq3CcO4cDjvcVQIyu7iJs5LT+QEubosk3LmwA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1l630merjkn5qgyxe85ql6k86thjrhnpk88kups","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ThcCOiLSlJ1NoYoC9tVlP481wL68diiTOnq8Z/A0PHlZXjV7QT9oQL+9NgvCDICE7dl9r6FsZemjMmyoAuLEZQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1c8e72k0w8fpfankl6n960xajjy0ud3a2e7ktvf","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"YBSpdYkQ7uMh2NM3M8jyiAaq/OYNndiCsk1QGh2JofVCfwOhLV4yTLmWRe+auu4KsWERDxptydO/+t83xUCMsQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1l630merjkn5qgyxe85ql6k86thjrhnpk88kups","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"QG675QqmVskhAosGRrhc0vR5iOWNrQF0Lqpyh9wTcMd4oSJ9yhyNjdLMm3qeNrHvxKK/Uhz5bLql7/W8BMwVeQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g18h6uejgwxxs95q3j6au6yqcl280n4tjnv9skmh","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GU9YWzlIqdHK+oudgANBhztXEWmOkyLut166V6oTkhQp/fhEhqu7OuwJDy72OinLAI84sG51H747yAm/eb1+CA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g16tjh28wrw3l9cy8pqvprr8gwz9rh5dy4509h0w","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"g8rKjxoGGRuooBZ+R4SQ6amRDwwpm8r0c9vUJu6y6y4ugKELMfcrnJJ1Hg0GLRTlovYue7t0KjOQkhnEmxY00A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g19djw7r32j7zrhpkldew20pl0kyxe4jdjtzgvsa","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"IfOc4HqQsIKcDboF8RAm9BJ7AGX0RMu/Qa2D//BV2Ut2yvmQX9i+iMrT3nidStOxbyL0S2IFFjsm5U2C8rur5A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1v5rusgcw2ms3pmcn7svf8clpg0dt2f3k90fdy9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"egZ42ScxEQdb6DbxCUDe8+DAQTJYuEdLLyGCHHjeTTYcmZbWrkxpIrzLUU8z3pws0aU1RAh3OQuInqZhZAz5Lg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1v7lpyf4n70sknhl6f82etgkmzwh5tq3mm60w4m","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Ynks3HQhYQnaLQeEEV5TI4l49PqwHyiAbqJ6LOQpoGE8O9tgbd3ZGntmiXrq5TpUirL5zt++Eki8nyOi6Yyfgg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1gvt2vzeug5aq5d5vnkrgz2tuh9jmxk2dzznzuh","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"YQ8KG3B4j2NBTJPTVc/q3yqT03GFoCnMROKNje/JDO1dexLNa40pkCFmJjs2TyfrlqoDkCHS9SobVvlQV9MXHA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10vzulqs27rel6l6ukqatkhrheh8vnk2xdq70u9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9+AN01xsYWoeNPhDvWq2kKUOpvNNvRvWkYRjFUFd3lwsNdSgMmdfnAqdx/qsKGEq9hBlSf9/O5LMPrZIvVa4pQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1yhz9l9vs2srt7n64683ja4yfxk8yvvpm297nrg","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"aXptxf+unsliU7lWks3WYbCh09egz+0XUM7BfPW3EYxE+9VmW1X6ioINXHw5mzbdWsB61JkuZFkdy4TOtNQ4EQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1j567re0mapcnncukcs9n3t46thxyx8jcpec92t","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"c61H6IhjphrH4lC5BMD++kNPZMosG6ArVFu9ccEJp4dCe86plg/krS9Kicy4Lr9W86IC5pylf5+whyE0ED3mhw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1xp5r36tdxkwr96yx6adjdg6c36qlsn8lk043yz","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"lD63gsl3kXVWaOK0edWwAUDUcGq/0arZbo2EBQvWMJUGdhtUVXx4YlrCIk4lp3Hlflr69Oek6cgbWNZeLnkjdg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g12ry5qnwa5vca3cp5sj0jc9hk8taq5wuzanzu8m","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"p/pxeEfF4MrxfmSMbAhfykmoqnKQjpSqfnlkUj04VztWPLrQ6JJmXuAJraq9vTvyeGS0srYAoCSuAvguGAzHHA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ymrv9rt8u96j8337uazu0pq36zlmuzkwux6rh0","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"O0oZYJrS5nzWyHmQp/6O58QRsvObqGcvXu9VcyGwINEkN0T+4xabFADr7nIxQTkJHqEqd8U54RrBo+I03MUXnQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g136dm87msphd7p758chhejd4cwvh7fl2tgvx5r7","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AZyj65tktzdgMpVu+UuyAnpE6xnpU2KxE4IStAT7eVM4cJSWnazQmzQXrOF6R2xHJq/8IUONY8CT4j/vHR3kSg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1n9ev9npa5tfjxvjvupq8hj7rwadmrqqu2yacxm","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"KYLqmxk8a+NnK6rIZVrW3DANEl1O5ly5ryIq85H5CdItrK9SP7xYp+ie5YkkZ0Rdj87IkTRp8IDUiDM2pSV+6Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1u5tktyks4ymlhfp4ll6zgazl4ax7tumncf7fl0","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Fqcjug5j+YkD1qFsf93ZETHYC2oclafmZ6WdRUJadiZKl5puy0h4qEKSMJrY7QwPXgc+zxIMJL4Ql5I5ZWtOJw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g12ry5qnwa5vca3cp5sj0jc9hk8taq5wuzanzu8m","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"q8UJlJnePF0H6/C6isTT/klVnVklhHAyYRoh7J8EN4RVH1U866zsji8xotIACaR07HjZcdeG7Vtv+n00brkrSA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g18zgx6qjm6ektgl4hzck79wle4flarymjucyvx2","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"PpJGCju8JRIzE1PlRLx0NwqfbUo/Y8uXc3HZZ/AOYOdqsNyxsb+Y46SyM2q1MxO2igwhyWkAUOHyKt4T6novIg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1c5k4vdtzn0rlnrtwukauz43vce56wm42vxdcgr","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"V00AHzHAEsMYfoTPuRx3FCFYmoAMSsY2AN7hMl1kqrQk6cVJOSCSStNTi0v3X1b0Ofbt+P3I/xZwuNQcYWitFQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1xthamvcckeppsjx34dertmzl7fhec9t8hvssu2","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5k+qb58y7AoZAcMYTBTPyNb66UdiyZ6l7LA2Yh/bPBpcfpOYuH/r4qo+vkZidUY2CKcPMWgxvh4BcNOHCykrQQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jhdhyun65t60wee3ktczjdjdfc4092k6aq997v","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"blTAgmeI5bodDnBq/+dtt4nDwaJN1kfnzfcsp5aKvL5mAr2NYjRN4TTbLLvSPBArz5pwapdtyHMBQ87zIGvKDQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1rwxql26za6mwxva3h0rpd5x4shg0zw4a4tyfg8","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"vwJUqM/Q0ce4nmMstBwlvQGQxgu+pyzbAC+9Wd+vdXk5/oXGjbEuqhtTtVWVwLlHOeruTdUQuUbR8qeY9dmQzA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1kexfpnv8g9ca62k2uaw6hth32krqmyas9c82c8","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"pZc4SbL6qSNeo6TbmlVTCVGPgQT+PV6qyK5weMUakxpf1yw1vn4XXTv8DQ/8ChXTbmajNWhYa1rVFfYmwsuhXA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1nhf5tv5a4g2ljn304y3e2nm99l9cjppcapltpe","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9uQ60KXSNkN0fx18fcruxeji8gK1Sw0diZfvD7nk7rtitbRLu5V5gHpP5UMzOhnkIOEtX5IlEnGdphVQf/p4AQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1wjg499cjc062q8ee7uq8wr8ckw9rgjt47qktg9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ImaAgb0Gs4o84jc4JqIiVB9SqFa7N6ClHjfZKBU4/cQsxJDsKV9YndQmDiGUchKEDvTSdXqOUdUNO3jcklDoVg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ecrcpdyd4ytxd0238xukd0uwgap3fww7nkqkly","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"cP4eaxmKbhSGL4aZP7kheK1GdYrXb8u025ESR55Gd+9oVJqVza9f15hrL5pU7eNhV6i2eSFftZmqlEr/2D1EJw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1fe8280r0044w8g6j6plvcgk27c0q2dlwr8l63k","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0tS60+KXogX+omFWzg/6IsIZN6bxBwIDQJtWcLXARTMv7+dBOh0QuZpF8j61NMQPG6UP6jfx89EzaHkj2ijktg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"iY/sdStBaaSYp1Adkjj9VSxsbLjlBuaUNy3B5wtpCMQhhOEQohkznq8qY52wv0VXg8WPlqFSj9Ql2FrpweMjrg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1g9rgcwspx0avpg4xznet65zvpffdsfht03at78","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ErMv0X1gfc1ZbK7/cY1PMaMRUu3fG2zE7VoRo0EEi8cfeGTRnZ91KHKezKNpuxFtZofQiU4Vqi62DUTX6PWdcQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1uf4yqafnw4vyameeek05j8mjpwsyq73j4tfc93","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"4lK410z0YAmQykLL7Ds3K0gmml5oS1dvS9uOL+bNQmJN4oR24Xz5X91bE0K1Kg6HzbtghhCWjaMvCguE5RshCw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1sxkc7nw9n5td4fqv9fm30zzajykagft375prh0","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"/SF3+aUNrnk9TKbuZC9GyFBjfhwcirRnt3Ugx8N5UEAfaIgpR/CnkysEljzdFk+58kccKgpFrPSevMWJByxOoA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1v2kmqevjugkuhgdst90q5hmjahcs3xegc6s3z2","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"bfy0VNglTXRC1iWPo2G00IdKdD2G7T1JloY4GAep2nVIB++dlp/SgAGjwvUhAwMvCZIKbDjmsv58rqXW7xoDgw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1v2kmqevjugkuhgdst90q5hmjahcs3xegc6s3z2","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Qcr8hPlDlkWADUIwscyqs6YItrdvZXXExwyqV0csjwNsGOKHb089N6gM0JaB8EQzGvvao7vjCAsg+uqtUMHKOQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1np8nej2axdk36duhqn4s0k7mgj3e3yw4y6mmly","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"k2tzdneNY6XcUe6Ggpz+BELYzPQI8nrdQNC383inKURQ/m+NXx38Qzm1ZA96aBvCuBxAZ3YDY87c42RNp15S8Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1u8k7f6vvr67yxrnyq7njlurvcvrr6sa50th89h","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"HwaDAI5t3FhQO2a7O98QGtOyAz+PVBKBO7z9QHupSq5HmNm6JVuE4RLLAWQyVBi819dvrvd4CL6bUYp57M+ySw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1t98fvvn0l8xg6scaw59hmfxalk3k57jkrk9lay","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"EN93DUDPYbHLbHB4dtHHR0xeaglVpUC7S0fw2zEDeykSecOUTYlMhGksdiqQJ9xjgSOjYZKbFBDzTHYMRK3qIw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1skjz2w6ruh39tknk5e52ehjkxvfs5sd3csyf3t","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"uF+sru3vm+AspqoMWcYhzPgjajmBO2FZQ3TkZF26C0ZtyGRUPYKzIrp6nnxnrTWIA8oc0gqPs03EvBkLoL24Mg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g16lra326p636s5n406t5xtfda8yn5c38fdm9vuq","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Nptn1Wlt5UoE9JF33ElR1OOQvX1X3m1JehnTwpCeWfgXHwWtGScCwKQQZ/404jQL1gsbF9EAQfwwjMSPupnagw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1hyjh8sf0g4m9ncjlhdfrh960hfk9ar4rwzvkvu","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"bYCU2f7733GA5htaBdGfFK0SX+HKQrmJD3nvJt5M1rYVknfPH4i+GOSQrO46oZKPjJMURSFfl7s2FrqCrNfSsw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1a36mg5cq980lgse3s7dzfmq6d4xsvpj3asd0nc","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"T3MEj9+4ghV0fX3ICruYIQil1etWiPh0YEX8kCXrDtR78E8Y2sJbaRQXW43QpJYLxPAgzcJecfvvKyadgy6vgQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10vw53jnw4nmclagyn5nu7xc8a6mqejdmdz3jsq","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"jmER4VpdLt48+8BvxBbVdW+iyanjrHOPXn8U/Ay6irVssVuwEZ4rpmK0yymN5UCT9/Km/LAOIghFnWFWqxx+2w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g16g56ckntjp4njpgzvan3fumyr2ppxw4py57jsx","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"xhm3ZCd2mNVEiHgV2LJDWuYg8SWhi96HcSo5ts8v6Gl1YoCS7QUfcRK5GXVPmwkeZ/ywwNDx4vZVyBt1uhcxsQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1078pdvezkh2mqavp2px7s9h6pgchzskk0z63h3","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"YRG7/ZmyfgiA/QyMXE5V6IVKrJpSc5IYYBw/5hapHx55zhQ9PESO3BJtleNL0Y01Apg5Vr8oD7/nt5zNCNE1oA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15rjs68cmpa8scxsx5d833vjpatnvqy2uyewzqa","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ZSpkfVsVoLObuujhJCMIhydoL9lJRoDIgp06bJ/NLTZ5pxzsf4a2LtnXUnIrqa8JIHtRXJh3U46gWSLW8f0vDg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1pgqv54akcjrguhaesywd5wyn3tvjxszzjcu5nh","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"6AK1LdCDaSA9OvlwcqzdqpFLEoaI+SOfUzboTQUA1HQMXza0X1RZZ8dWgE6PDZ8FZbgwVMDT8IeZHbhvYx5SJw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g17t7zg3hhwd3f0xg5kkrtww8npt2gj3u4dkkdwy","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"/jwjlfpvEXFML80a5NcmkuYd48FgTvZOavvm6Pk0GdEfgVPdGj0XTjQpTrJqHdKf5sbOnDYVB/bnQoJHmL6pNQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1eclxawp8etnzsv85n3067x6vq9q5v6yc75fdf3","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"+xbC8y5CjKtd0BB0xqf9SHBY/b59BC56/DIaFrVaoVojGOtIyAT2em6SEelXejOs1aF9EIkKUPM+BlS2iuE1BQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g14vz5gf9f73u97cwt9cvl2h2g5w7anqckggnt3v","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"xXEo8I7JjhGXFN6YWgZ08usUbCppPNsLpmpDDv97It1oVyC3X5wLLaxeEzebFg+Pcqlorask2aguAARNjku93Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1hcs3xhdjurvzc7462ay04nlnsjz2uaryuc48tl","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RCW01qBQmYmEqCIGt4nZsPsH93TGefGajIYTT8O/6JwxjXNbM+DGIfzlLkGAircPdMLvrDj8Zp0ssjgoI9j4yg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1gwwxpzewfqn0xezz2fhtg06964s4czufna08wg","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qy97u4hZPQTzLx9qTmZQR60KZmig+lGmwAEK0pyuU0cFc62by0LSAhBb6JHgpNggxVV3sUZYnURXxN2LNrdXig=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1sau7lhk73trrfmpg9ua9mv39hjssjeaz3jkc70","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"IEWyWkZEHTQxFK22thenrU5XWo3F7PZssCHSyzBhj1cA5NFFvCE71ng2TTfvYmyBRow79HuzjHJhCTNm460yYw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sZqoAToJ49X8BxBBmfGPKkodr/r22eobCbXtu9IJPWhGjzlMo0uExAbeA0FO1Bf6BfQNTQl5SLa2on3T2hdmPA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1z6actl3cr53gh3kh6cnk70scs77x3e8shvea0h","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"v46y4KyCTxpiZbpAbttdiuFPh/stO7N4H5erTpngNRcSz+pjkEbu4QRvGnruvkflTbACe12xtEtyXmBTH9DGaQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1y03hghsj9rrvmf0xcrn48k53a5anrwxnkp5v7h","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RfZXu5Dog/8dWHIIvKVYHOhHCMHESHHoT2A2KYmEFY10VEVIwAKUSuUuSCd61XBhkr1+6jIqdJwmQOjNiWUKIg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1fm2ydmdc54xgnfjv5743ml6ysc3qv2mzze6gne","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"PtNSg0qyokkLYXHDbjz+VxAZd8FHhn/Ki4MfM+Onr85jJveb3vYzTSrAG81JWAxhBRKRi95tEhHH4e9+ofNvDQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1kdu7txeumknvnkgp29zwmnkkqhcvlypenkeg3a","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OKDVqDNedBOJUK9h5Y2+SFy/nRZ1jlg2rLLm+Nso4IReDe3lMl/Qt1qOHCbpDG/pnUF5V5PfyHSRRyiwEOhYXw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15aljgztnggggmlqgadv7pu8jdreuyyqg06mgul","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"4uTQd+sWJYZRXiWnjUSiKuNde5EYQahYKm4J8fzjA3UpC++7TTelUwqyDqZOAuvSHRBpVFRipYJ5x9Oo4+10pA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1tx2zpsu7m2zzynkf4yq82zcj4hvt2mapkvnqlf","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"YysmBika3j9eEFDRj7fbHV+nYvp4Mswt8SZZZRF6XMMxWOnJ6287JoqfEjIM2d7VMeHhIMhQtOeelPCV+wh0AA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g162ml3rynjy8adpzg0e4y42dn0fph9xzh0zdk5l","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"oX558KuC6Uq2HuhmQlxodSTz4JO4sDEqnr20CNwDF9x15rVXattiZq6E1oEoWhYzVbPp3WiMwYnUya7OWjo/CQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1795scqeq5g86w5l2tyt6l38ngdvd0gp6aup4tu","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"2j160PbVAMpfaSauD8ioEsSGhf3QKWJyxxFYesS8df8WcdLPW0F7+Xvrxo4L3gvRXfZ1kMc8ikPJuQlOhx80IQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1zw9v8k4chu96jux53luweqxdy62s805nxx4m92","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"J+708IB9PBQVxlDiG1f4NlCgwOE8EK1HLll4KAP/3I81t8Y2P1ZbkgMUqx7tngOLrq5QqnAaaSl9m50+LnsZ9Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1n6t4zam4zer8t3wyw379luphejg3s0jf3y2095","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"iHlQJHnoC4JMHG0QfW/yu8ermpHuUTBGM9IjFoTqfxVUMopeawjZz1/DcP3JiRNkFAsScDht1HY/rzq+hkrFOw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1yqssmaax72ymtdzyyt59pn7nrkur2pap8qpltw","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"74N5EFodpn/koZtVN9dRkzx2bRR4DNeO7G+y2zzl9Cp7OYCalX9Gw43iK5aDDw/Nw/r4/T8UK5qYLhX8js2o5g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g14gphtlyh9nad7yjf8dkdnfpjx2cy5dq8rugedf","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"UiIi1zlBq9osOWcKQKdTO7LSpOjn3n4BOxa/kxV2a71O8G7DXZdiifNqu281ulSytsstwDrwwK6uTOn3VSW1HQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RhG8ATyHCBn29ZZfCY6QBtNhE58TAHZGS5Ofr3PIoaxJEuv5u7s1Kp+T4U4BdGa1qJjREHz0KwfNPmvmxoohFA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qfys34y/gNPiO4a+3gu8IEoIYmEL9kCoRJmozt9Rk05qkUP5NlXOqjeIOoSWG4nKDUW+Sqvs2W5JBw3KXOURrw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"dLFz+r4vw2AIl/hAe8QUc+wpeZF5tBw+G3c4yqq01LR0rn2DdGxroAUPEXKrqdA4501tZt7lKJUg+6VxupayLA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"s6yVrmTn8P7TSo8VLa0MoRmhTVd4E3YshPBwxASodoU9FpJWSy6Tog2BhL9yEkD9tJESBEDURieokENELijmmA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1t+ghsl+0iSQZ51MozHZ1U04/dlLmgN1yDqvcynDdxF"},"signature":"CqyHYeIuqCfUHWmXzbQw/GGHmQVgwbYRSkWl+xiYfjlGJL1FWGrHGzO2RKGASYgNfaTXBte/0cc+xEmYDDARzg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1t+ghsl+0iSQZ51MozHZ1U04/dlLmgN1yDqvcynDdxF"},"signature":"lDO492kMgccOaZ+B8Dvq2kJD1UGMoo0zhP+MF2qF8CUHftpQZdBaV/7qdeeQqo0NPdX1N4+PVOmDEx/TDId01g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1t+ghsl+0iSQZ51MozHZ1U04/dlLmgN1yDqvcynDdxF"},"signature":"v3mSL1DQ2Y6UE+1Om4rCgrj+ydAFJlc2+6GEj7r+cK8esuC3Wo03XrbsT0sBAGJJ02wu8lq+Xj7KwH+vfJAHhQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","to_address":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","amount":"2000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1t+ghsl+0iSQZ51MozHZ1U04/dlLmgN1yDqvcynDdxF"},"signature":"Riw1QBagjoE6zo0Pjg9lCxCiX659Uen3aSALn/F57Sw7SQs0S3ZrZZn3xEuiShEIdkgiVMDXRk5IoHpMyEW6xg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","to_address":"g14qjgdkphg95t49hnwdq0sytdjucptdmma7es9j","amount":"15000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1t+ghsl+0iSQZ51MozHZ1U04/dlLmgN1yDqvcynDdxF"},"signature":"s9CtnOHIfa2zij35GUEjmqjpBw4foQF+Ujc16RO4QZUzFhlxXC4ZY+Q7Q4Bqg0e70LzZoXBVMAmssTt6mK4fhA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","to_address":"g14qjgdkphg95t49hnwdq0sytdjucptdmma7es9j","amount":"220000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1t+ghsl+0iSQZ51MozHZ1U04/dlLmgN1yDqvcynDdxF"},"signature":"IHNfncQQROsoZihQXf8UBAhyNtUSubU1HSlptBDLyncS6C+ViUvBlmJGbG8RvGQemuCBFvWcEy56j0rBKS+lBQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"UdnHGqYijIKN5JRaVQDReUrMZfCPrz+BgXmsTmxhtXlvcBNzqQzMouAXt+ppeqYp4TXXUR08b3uvWbC4WmSMQg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g14qjgdkphg95t49hnwdq0sytdjucptdmma7es9j","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"h/XWgXIDX4pfWM2Vslfp1p/BytpLTvfEnILb1LGvqr9hxxxMkjBscR1opeQ/sDpKPtsDahEkLxmH1iayd3vSIg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"oVDODUgyTVFr/4ymrDzkXFCPIkfNE/X+lNFbt+Jzp5UTNMl0f6KpJEhYCuilOkOgBPzi1IqT7XNt5TFt5u4GfA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g14qjgdkphg95t49hnwdq0sytdjucptdmma7es9j","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8SD14jGBjTfzHMfO0OUk7umS+yLIhNLAPRsmuHuG291BuDASkjqyUiqOlJUn5GexyF9uyrlwEzvQ3cVkEs8Qdg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1t+ghsl+0iSQZ51MozHZ1U04/dlLmgN1yDqvcynDdxF"},"signature":"ek1AOXgVS/b1UAbcmP9MGlGWMTSxSgp5crhaDqtbEK9J31KsJqMqpVB8gNjDpSHcJvLgGQK2l6fnHmFhhJT5zw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1t+ghsl+0iSQZ51MozHZ1U04/dlLmgN1yDqvcynDdxF"},"signature":"Gt2tD9aav6sNGpFGoEV7Ex90VyFE8M4ij9r4pwpQPl95LWbUTFdOsV4yZ14NCo6ung//3dKGzseL40Ka++dUkQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1t+ghsl+0iSQZ51MozHZ1U04/dlLmgN1yDqvcynDdxF"},"signature":"JG3Q4dNInfAe36kJmp70+V68WRkIkEXhDWUWnUY1ZHRids5tLuWxCXtz4FxOqPZ9Y8rs8Q4G9tLob1AMvxJitw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1t+ghsl+0iSQZ51MozHZ1U04/dlLmgN1yDqvcynDdxF"},"signature":"RDP79lPXSeNo0f+ebwBaXnitWsfCjDbXSzcgDgwq/Nx6F98lRFM54y5OfYP1548Tk9DxP+oCKbSxqCQA3Ue2RA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1t+ghsl+0iSQZ51MozHZ1U04/dlLmgN1yDqvcynDdxF"},"signature":"vI7XSNe2AV+FjEQcsUTejmiq9FB5yrsnWV1mJI9Y10tXkN+pLlW4euTw5lsA395P8j2qB0+CnbchpOZWMlRp5w=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1t+ghsl+0iSQZ51MozHZ1U04/dlLmgN1yDqvcynDdxF"},"signature":"FKpJVQXpNMnRjGBOX+WdqlN8YDGf2zvVEpMjhie+rU9b0TczKjTajLHeQi0ppcCu2DusYeTcIbZ73rZmgV6pBw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1t+ghsl+0iSQZ51MozHZ1U04/dlLmgN1yDqvcynDdxF"},"signature":"mxtnHHs0/dLnVNuGoDmjlexY7NQCnZw8jg5dzX2o7RIpWtytMuWFIrZQvx1OJ/Xo+s1QIaliSQMol+oJiIkfNA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1t+ghsl+0iSQZ51MozHZ1U04/dlLmgN1yDqvcynDdxF"},"signature":"iM5GblNNBauXBtMlnJJVSLK4PR6NV2uQRODaAlsp9q9TBxswPYFONI87Xz4DXa1+feoLjtEOISNjFj19x4kxGg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g130g97u00ayr3gjr38w5qpf4he7xku8kszwe26y","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"eS4wMNxseuwxy1Wu239aIxYLbli4vYnr9GQpSx54YAhAaBkQZTu4fU7+qEskL7SF2vhr5N6LHwUAlLwWoQCjRg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1t+ghsl+0iSQZ51MozHZ1U04/dlLmgN1yDqvcynDdxF"},"signature":"+2W3KkDPkODzdAMaZ8gS6gvfRIGtWd+MUNmAr0RUp5lrfxXKtjPbnhQfRr6Bid+HUPRtoVTtjL8lDXKaeOJD4w=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1t+ghsl+0iSQZ51MozHZ1U04/dlLmgN1yDqvcynDdxF"},"signature":"g8wsZTtJzeKn05lbNh8PcbtscPio+AuIeiFr5fkFoZsvDiPXuc9fhPTsilwiuH6YXNusdHJCLRUj1/hTWUNi3A=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1t+ghsl+0iSQZ51MozHZ1U04/dlLmgN1yDqvcynDdxF"},"signature":"j1D5VVfZmg1OxbsFiDXwSuWTg2ANdtgOHDwdUEBh5RcJwiQ+fuBjwh8SGRCeLPh5qJhIuZha1sMA3IWDbcyWlQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1t+ghsl+0iSQZ51MozHZ1U04/dlLmgN1yDqvcynDdxF"},"signature":"x5VA+QDBeOeJ8ae53cmwCEmgQ15fHe9KLapC8BKaAn5xLq92nbcEcey4mtDlSAn3St+SIucQAdfko7uL+zB/Lw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1t+ghsl+0iSQZ51MozHZ1U04/dlLmgN1yDqvcynDdxF"},"signature":"m+xNh27vyoI3vnZ5fmn/W5O4tgDlf5s9jSNhFel9n9xLwkiv6JS6rtN4qSQ1ifmNWjjYKNCtCEX0nbTVXV13yg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1t+ghsl+0iSQZ51MozHZ1U04/dlLmgN1yDqvcynDdxF"},"signature":"b80oHkBSZT3W3tgsIVgb6T4XkGDAbGmCCLo7Id5XpTRYHvbNVq0gXpFi6WE96xdwNAI/KCGeDBdwXfwQy+Ehyg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1t+ghsl+0iSQZ51MozHZ1U04/dlLmgN1yDqvcynDdxF"},"signature":"or69fzd0moLW8Yz2hIYMKcUuF8MCP5uOJu6233ijuHMaKa8rXmjBDDZdAiwFfb4dvpOgL7GPkKQCilh/WeuMfw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1t+ghsl+0iSQZ51MozHZ1U04/dlLmgN1yDqvcynDdxF"},"signature":"MeWx7uTswa6NCfQlySwJvV5fop6x9mX4p+2FkYqkRG9j6KdbseOgPFoVSR1c9GL52nWKlVNVAK2HFXq1+GxSsg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1t+ghsl+0iSQZ51MozHZ1U04/dlLmgN1yDqvcynDdxF"},"signature":"3g5DSc1x3myjsK21kM+VQ9OorDHugrWqpg+BjN7NLVkWyVQQlB3YRsBV+MrEGjYkMA12piqbCd9+Xb/OysOmFg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g14qjgdkphg95t49hnwdq0sytdjucptdmma7es9j","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A54fqEKZUK0blhqXB3a5WbCwGiqy483+pfBbUTT1nLNu"},"signature":"qTE0fTD+b/kGyqkweR+HfXjy9Zk4RsfeGMnwtdKE7utOK65wcT2NAth5Odt1kZss2kRLAw5GjT0uCExb/hOqNA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1t+ghsl+0iSQZ51MozHZ1U04/dlLmgN1yDqvcynDdxF"},"signature":"pUwcPxBjMtlhPjhMx8YHd1f9LiSJ/I18e4/b2EYugQUh3/TVPi6Zp8+IpoZ+s1EOrFwbCh69w73ekHTmEJkhrQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1t+ghsl+0iSQZ51MozHZ1U04/dlLmgN1yDqvcynDdxF"},"signature":"cfj9ruzumMvdREABMlqY9sNeZHP0/Qk5Fp1mPTJ8iF9a9HDSGJSB6PJlEjGXkdetP0oLuejDGf2wXRQdTSqJtQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1t+ghsl+0iSQZ51MozHZ1U04/dlLmgN1yDqvcynDdxF"},"signature":"N0m03Ya6NfrIVjJaoOJfEbZ+8YwdD/RCJ/mQqMsfm6MMTbs41dhU5/TXKEAG2JRmqgTzpNuLbLsWq4SW0ZQY8g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fYnBUvEIWPQ7nAqTvD5pTzXFGHnlxixlGgnEjWwtQb08GJxSyhskAsTayUL+yaSTAG0EtnJdNjjilyx99OAtQg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1t+ghsl+0iSQZ51MozHZ1U04/dlLmgN1yDqvcynDdxF"},"signature":"LXC+QrL8IrVWzZu7V7iEKqagYYq8KGOveaNumRv/ABhTp8oHlL7i7XfDg5MT2AUyt+M6qD/3aCC5qlr5VzCwrA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1t+ghsl+0iSQZ51MozHZ1U04/dlLmgN1yDqvcynDdxF"},"signature":"C7PHL+0YG0EspyEV54q8E0a/wSV0efgZ7Uf8ybyGcq51sthGPdsRAW7bXv7dyHO++wTo4UUjCMsQ13K1WtDH2g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1t+ghsl+0iSQZ51MozHZ1U04/dlLmgN1yDqvcynDdxF"},"signature":"SJB6pnA20HJiw1YuUNoewk3ZvLHALijjdSdAHk1U7a4+gfAetfjvH2885TG+fh9y8IcZ6f255ENIr3ouSKDvJw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1t+ghsl+0iSQZ51MozHZ1U04/dlLmgN1yDqvcynDdxF"},"signature":"VvFkwjebNzQaxFVYGIyZbaAIk20iwIL5OMJU5RIEjb4NCGQFL6dfR9PuQ4+B4R5ifIq6G1Vo5OkJ7HcqWl0YxQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1t+ghsl+0iSQZ51MozHZ1U04/dlLmgN1yDqvcynDdxF"},"signature":"aPrfOLtw3LEYyG+qqfKln9mbgk3WaO82FLYmHMhV8S8VWCo3GIf21hgMiszWykVoihkZeW2EtIUkb4xMSolP6A=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1t+ghsl+0iSQZ51MozHZ1U04/dlLmgN1yDqvcynDdxF"},"signature":"X8IbmGWXpWuk4WX1MeAoAHcN40Ogj4exiBnQRaqCJmIvDtUBP3lKf+Uzm8HtYLMs2ug9no6ryLOGnDljx8Q2GA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1t+ghsl+0iSQZ51MozHZ1U04/dlLmgN1yDqvcynDdxF"},"signature":"GD14tWK30jUAUa2V/5ZKjsmn8L6OHwGTtAwLcZ/wQ/8uUtCHGo4bJ0Xyki7xP0/QQPQ5CDTYrEvzUlbelv4v2A=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"50000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"Aer0uRWeqFa7HxxA7t16gUUqLyoLKD2QXL3Qsg04rZJcCKQL/pqFyIhcIA6D9FS7ZqadknH0qGZRWpaiD8H2fw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"qHBeuvFeyiE1Msnp24SAf0OqDxqpyAHUbxuBgKtrqo4SvAr7g/qTJ87OFkv6Xn5bRxxlrYD79XHk7XTrF2Bi7A=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"5o/BYOgrfR7ypkCQikRc3bclwBXUxM0zXeQszP9AarMamfxhirX2oSNCv/yDADPmMd3lbOyOtYAau9rxEiQk9Q=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1t+ghsl+0iSQZ51MozHZ1U04/dlLmgN1yDqvcynDdxF"},"signature":"FdG/H4sdsFelvxpIYaX/IM8zK/Zn3L4J35Pk2avuQ6xuOhLc0NKN92r5X9voADjr8EVpV5Fi9fhEH2o9z2dnDw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1t+ghsl+0iSQZ51MozHZ1U04/dlLmgN1yDqvcynDdxF"},"signature":"58UTObBhnRkgyehma5x7aRLtaS2zxycA3ucJNB45ThRH59uz2CaH0ol75dwFNG35BiRviqyzbD6BUtqhFLs+3g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"l9Je/z6957RG+cUxTpl6SRaT0rGyC3ZqZZkKqNyTtuQ7Jnb/mMWsm+7nugOd2hQfmJbHjiEf+QCPFybKpGdOLA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1t+ghsl+0iSQZ51MozHZ1U04/dlLmgN1yDqvcynDdxF"},"signature":"IrozcwXs1WnH6l2hH7lqOnK8WJdxkLrMabFc5359nkJuDSp++x46cZ+J364qRBg76eAi7UEUEhA/eMgMxfK9CQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1t+ghsl+0iSQZ51MozHZ1U04/dlLmgN1yDqvcynDdxF"},"signature":"u0yPR0fze5RJwFcW0GtXMLFpDUYSfDjWiQRJbi6a2H0t5slrhmyKHUXiR1qB6DXWlczoo3MCStat+2HCmjGT4g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"tbYzRdM3cofLSAG5KAvID2CwxVaPPEtXPgQbOaeQv6V6w24nwf8QYE/TTRUKSM8KsH0UIjHnIaTPSXADxxJT6g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1rjwkc30x66spam5adk0ptedwqhgtcaj3enz7d3","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"cyMxXpmMiLr2yQ+slHleOK7WyW1TS2vMhk9goVzo8HMzqMeST0sVgKkNfndhFppkx4Ej4V9VazwO7x5x3u5poQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1rjwkc30x66spam5adk0ptedwqhgtcaj3enz7d3","send":"","pkg_path":"gno.land/r/demo/userbook","func":"SignUp","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A52CVnRai/PrOSWL3BXUdYQHb3BxYv1JuqgVABDOWBuj"},"signature":"3mlUCDg11jb6x7SZ0B4dXUL6w/nCNC4plcjnZkkpjm85lQzTnDtrd6QuZFFCycmkR53VqdjHb/GRI8G2+D902g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g104hnnvrlxk5kauvzfju0zlat94mppjzl239xnu","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Zm41LUruont6H4QF2JC8mDIpYfdKG52q3YSOObEvLIUY8CtQApbnpWxsVmhrjmk1eA+wLaQ1A1/jKd745OViYw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","send":"","pkg_path":"gno.land/r/demo/mikecito/social_feeds","func":"CreateFeed","args":["teritori"]}],"fee":{"gas_wanted":"3000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"j9NnS7Vjg8icyZuC1EYd+Me9VEKuRDXBlsZYLStWy6AcMAgb/9oj+50ygI23H9gPo/3COrlppC+PiUiLHGiiSg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","send":"","pkg_path":"gno.land/r/demo/mikecito/social_feeds","func":"CreatePost","args":["1","0","2","{\"gifs\": [], \"files\": [], \"title\": \"\", \"message\": \"Hello world 2 !\", \"hashtags\": [], \"mentions\": [], \"createdAt\": \"2023-08-03T01:39:45.522Z\", \"updatedAt\": \"2023-08-03T01:39:45.522Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"NfdVZSxRko2x1OWgo7JtGa0XVFSd5TvWzeGwgCHcqOtYcuo6orHTI9xOy/XbOAN3UesD7Xvci3iAKZvO6S83iw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","send":"1000ugnot","pkg_path":"gno.land/r/demo/mikecito/social_feeds","func":"TipPost","args":["1","1"]}],"fee":{"gas_wanted":"3000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"IScz1cqvrGbTz6QYQ+vqwvZp7uwhm0C0MQp3wQdroKI5MPFRYyFpu5isR2XmD/cqZF6SWfRwYImy6eed0Qh5IA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"5000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"EKD8zc8wSkfFwa68HJb1i73czQnQvU5khxirmyZMWME6WZyJ+lw/I5NaEaJSNZ1Ll9mbzHhmQRzpW6rv31ceww=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"50000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"TyAS4ScvHJborwukk9Q0NkoETO+8a06p624r/Szf3htN6VQrv/155Ef8X0/kvXqykZiMlO/8E+d+A/v7KdSASA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","2","{\"message\":\"YO \",\"files\":[],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-06-18T00:12:22.798Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"+TBGvVS350XvKoqTpO9EmtfcmPjmKgHY7RZyP5/AmKgNWiycV1YCObI2oVTfhZxQTPGlH7OgB+KP0T4YikrzKg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","2","{\"message\":\"YO \",\"files\":[],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-06-18T00:12:36.409Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"qbJZXqHuZbcp3CN6NiRuabUVCWnrWp5aabtIfPfbqeg6OOCjdvvrq0ZHFTBMAJKNa0lQFtD6cgJ+BVWOaPrCrg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","2","{\"message\":\"hello\",\"files\":[],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-06-18T00:14:37.483Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"Gyw/ZzqrACAB5CY7+mdhSgmibLBDXr5FmmTk8Qo0l5Ia+F4Gmd5p3RDVnAdQJTLD+Z3xJdQMc99zEkRM4cCLJA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreateFeed","args":["teritori"]}],"fee":{"gas_wanted":"3000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"V6XEE6tyG5qDThL4PH0l4iHnhGTFFgVt5F+ZWT/RM80w4Glf197DXOq03Skp3cc7OcXsMIG3jQIYSDfy4etHyg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","2","{\"message\":\"Hello gno\",\"files\":[],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-06-18T00:18:20.531Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"3+aE1hPbbBOjDquUPkM/xQ3Rim8EfETottCht+RspaAv9Dz3epuk/j2Vwc7q91oCy/EllK+hyEYsZAQxfKT9Fw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","gnoport-1","😍","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"CecfvtNpaTW1ph61TF6/uvsnPUiT2R89sLabeGgwNLNB1q6qp3sG1CprZgF4lgPn/zHYItgDXpl+Xp8NR9jS4Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","gnoport-1","😍","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"WkTOhotJ8Qx2hHA3wvL6RRogYKjWz6CuAhL4QpJ/9l1Pe7rVqCUi4YbLyIg9TjelX4Xc0xfTcEL56qd2piWwZw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","gnoport-1","😀","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"SkVROtrlhznC89WwjU/qaxXVeYGzlIILu00m0WtHg4tBQ7R2uI1n3Vl4s2UxuRDShtPjPQ3t2RY1mE/d3iO1Fg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"JgzzfyRAuS0FTS4qM490TRRh+sUnhlam2//qhmc8l7AqlF2DKYSJigXIb9pMlARrW5MYH9+xvb+vxSbKv1SMaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-9","The More You Gno 9: Realm to Realm Interaction, Faucet Hub, New Test4 Launch Date and More","\n\nThis edition brings several major pieces of news; Gno Studio Connect beta, and Faucet Hub. We're moving up the Test4 launch by 2 weeks, so we could get to mainnet faster. We'll also be seeing each other at GopherCons EU and US, so make sure to stop by and say hi! Oh, and our [new gnome logo is live](https://gno.land/r/gnoland/blog:p/the-gnome)!\n\nWe're also covering all the major and minor code improvements; if you want to dive deeper, we have the weekly engineering [updates](https://github.com/gnolang/meetings/issues/37) and video [recordings](https://www.youtube.com/watch?v=9ch7MhKNBmw\u0026list=PL7nP7r1QiDktMCdw1ydQo2crM3y6Zk7E4) available. \n\n# Gno Core Updates\n\n## Introducing Gno Studio Connect\n\nLast month [we talked](https://medium.com/@gnostudio/introducing-gno-studio-the-premier-builder-suite-for-gno-land-d1b4d82b46de) about the need for a premier builder suite for Gno.land. As Gno.land expands into a universe of realms, we saw the need for a set of tools; tools empowing the community to create and use succint and composable realms on Gno.land. Last year we launched [Gno Playground](https://play.gno.land/). Now we're adding another tool to the toolbox - [Gno Studio Connect](https://gno.studio/connect). Currently in beta, Connect allows seamless access to realms, making it simple to explore, interact, and engage with Gno.land's smart contracts through function calls. Try out your first realm interaction via Connect by taking our [gnoyourdate](https://gno.studio/connect/view/gno.land/r/gnostudio/gnoyourdate?network=test3#Vote) poll. \n\n## Faucet Hub is Live\n\nWith the [Faucet Hub](https://faucet.gno.land) you can now easily and effortlessly use all Gno.land ecosystem faucets, including Portal Loop, staging, future testnets and implementation partner chains. It's easily extensible, with the goal of having a single stop for every possible Gno.land test token you might need.\n\n## Test4 Launch Scheduled for July 15\n\nAfter announcing the tentative [Test4](https://gno.land/r/gnoland/blog:p/test4-explained) launch for the end of July/early August, we realized we're working faster than anticipated. That's why **we're moving the official Test4 launch to July 15, 2024**!\n\n## 550 TPS\n\nRecent [supernova](https://github.com/gnolang/supernova) tests showed that we have **~550 TPS** on a single node machine (M3 Mac; 100k txs, 1s block time). This is a huge step up from last year, when the TPS performance we had varied from 7-20 TPS with the same setup.\n\n## New DevOps team member\n\nPlease welcome Sergio Matone! A DevOps with a strong Go background, he'll be a key player in improving and managing the Gno.land infrastructure.\n\n## Belgrade Retreat\n\nThe core team travelled from across the world to Belgrade, Serbia, where we hunkered down and solved a number of issues blocking Test4 as well as future releases all the way to the mainnet. Full recap [here](https://gno.land/r/gnoland/blog:p/gnomes-in-serbia).\n\n## Changelog\n\n- Dropped support for [all unused DB implementations](https://github.com/gnolang/gno/pull/1714), apart from leveldb and boltdb. Without excessive DB implementations that need maintaining, we can focus on optimizing the ones we actually use, and squeeze out performance from systems we already have. \n\n- Resolved a Long Standing CI Issue With BFT Tests. [The CI is finally green across the board](https://github.com/gnolang/gno/pull/1515). We still have some flaky tests, but the CI will no longer constantly fail on the BFT CI due to irregular channel usage. This, couple with our CI rework over the past month, significantly improved our GitHub development process.\n\n- Lots of spring cleaning efforts with [gnokey](https://github.com/gnolang/gno/pull/1212), [gnoland](https://github.com/gnolang/gno/pull/1985), and our other tools. We took this chance to also add extensive coverage and regression tests, in case they were missing before.\n\n- [Finally merged in Event / Emit support](https://github.com/gnolang/gno/pull/1653) in Gno! Users and Gno clients can finally fetch on-chain events as soon as they happen, and have a rich context for them as well. Support for these has already been propagated to our [tx-indexer](https://github.com/gnolang/tx-indexer/pull/43).\n\n- [Merged in the VM gas consumption fixes](https://github.com/gnolang/gno/pull/1430), which standardize VM gas usage across the board for users. Having predictable gas costs, and gas costs that take into account VM operations is only fair for both the node operators and the chain users.\n\n- [Reworked the node directory structure](https://github.com/gnolang/gno/pull/1944), and made [genesis.json usage explicit](https://github.com/gnolang/gno/pull/1972), paving the way to an easier multinode future. This effort enables us to easily orchestrate and configure Gno blockchain nodes, especially with the upcoming devnet / testnet launch.\n\n- [Overhauled our monorepo GH actions](https://github.com/gnolang/gno/pull/2040), with them now avoiding double-work, and being much snappier. CI for PRs now runs much quicker and more stable, due to these optimizations.\n\n- [Finished migration to Goreleaser](https://github.com/gnolang/gno/pull/2101). All of our important tools and binaries have a clear build and release schedule (for Docker, and beyond!), with us implementing nightly, dev and `master` releases on the monorepo.\n\n- [Bumped the gnovm test coverage](https://github.com/gnolang/gno/pull/2143) from ~34% to ~67%. With upcoming changes to the GnoVM, we needed a good safety net in the form of a testing suite that will alert us if funny business is going on after a change.\n\n- [Many, many bug fixes, small UX improvements and QoL changes](https://github.com/gnolang/gno/commits/master/?since=2024-05-01\u0026until=2024-06-03\u0026before=edb321f85beff98536a3a1a7111febaea0771a5e+35) that keep the lights on and systems running smoothly.\n\n# Ecosystem Updates\n\n## Onbloc\n\n Multinode/Validator Docs: https://github.com/gnolang/gno/pull/2285\n2. `test4` Validator Initiative Discussion: https://github.com/gnolang/hackerspace/issues/69\n3. GnoSwap Portal Loop Migration Blocker: https://github.com/gnolang/gno/issues/2283\n - Liquidity Pool realm deployment failing on portal-loop\n - Attempts tried:\n - Changing package path / reducing realm size / setting gax-wanted to max / changing client env\n - Cloning gno repo every single recent commit to re-produce on local but never failed.\n - Update: Potential cause → Certain failing txs are causing corrupt cache files `cacheNodes`\n\n- Gno Core\n - You can check our Merged, Awaiting Review, and TODO PRs in [our hackerspace. ](https://github.com/gnolang/hackerspace/issues/29)\n- [Onbloc API Docs](https://onbloc-info.gitbook.io/onbloc-api-docs): Permissionless JSON-RPC methods to Gno.land's official networks (portal-loop, test3) for any individuals or teams building on Gno.land (feedback is welcome!)\n- GnoSwap\n - Contract migration to portal-loop (Tartget: May 24th)\n - Applying `std.Emit` to contracts and APIs ([apply emit event in contract](https://github.com/gnoswap-labs/gnoswap/pull/217))\n - VWAP (Volume-Weighted Average Price) implementation for improved pricing ([gnoswap-labs/vwap](https://github.com/gnoswap-labs/vwap))\n- Misc\n - Add links to [GnoStudio Connect in GnoScan](https://gnoscan.io/realms/details?path=gno.land/r/michelle/mymood)\n - ![image](https://hackmd.io/_uploads/HJrWausQC.png)\n- Full update: [Onbloc Hackerspace](https://github.com/gnolang/hackerspace/issues/29#issuecomment-2124697977), [Onbloc Kanban](https://github.com/orgs/gnolang/projects/23)\n\n\n## Teritori\n\n- GnoVM\n\n - **Add stacktrace functionality and replace some uses of `Machine.String`**: This pull request is currently in review discussions with Morgan ([PR #2145](https://github.com/gnolang/gno/pull/2145)).\n - **Go2Gno loses type info**: This issue is Merged ([PR #2016](https://github.com/gnolang/gno/pull/2016)).\n - **Avoid instantiation of banker on pure package**: This change is awaiting review and merge ([PR #2248](https://github.com/gnolang/gno/pull/2248)).\n - **Missing length check in value declaration**: This pull request is also awaiting review and merge ([PR #2206](https://github.com/gnolang/gno/pull/2206)).\n - **Issue: File line not set on `ValueDeclr`, `ImportDecl`, `TypeDecl`**: The issue has been resolved and closed ([Issue #2220](https://github.com/gnolang/gno/issues/2220)).\n - **File line not set on `ValueDeclr`, `ImportDecl`, `TypeDecl`**: The fix has been successfully merged ([PR #2221](https://github.com/gnolang/gno/pull/2221)).\n\n- Gno lint\n\n - **Printing all the errors from goparser**: This pull request has been successfully merged ([PR #2011](https://github.com/gnolang/gno/pull/2011)).\n - **Lint all files in folder before panicking**: This pull request is awaiting review and merge ([PR #2202](https://github.com/gnolang/gno/pull/2202)).\n\n- DAO SDK (still waiting for review)\n PR: [#1925](https://github.com/gnolang/gno/pull/1925)\n \n- **GnoVM**\n\n - **Cannot use struct as key of a map**: We resolved the issue where structs couldn't be used as keys in maps. This PR has been merged ([PR #2044](https://github.com/gnolang/gno/pull/2044)).\n - **Go2Gno loses type info**: This issue is still awaiting review and merge ([PR #2016](https://github.com/gnolang/gno/pull/2016)).\n - **Gno Issue with pointer**: We proposed a solution ([Issue #2060](https://github.com/gnolang/gno/issues/2060)).\n - **Stacktrace functionality**: We added stacktrace functionality and replaced some uses of `Machine.String` ([PR #2145](https://github.com/gnolang/gno/pull/2145)).\n - **Recover not working correctly with runtime panics**: We created an issue to address this problem ([Issue #2146](https://github.com/gnolang/gno/issues/2146)).\n - **Panic when adding a package with subpaths**: We worked on this issue and waiting for review and merge [PR #2155](https://github.com/gnolang/gno/pull/2155)).\n\n- **Gno lint**\n\n - **Printing all the errors from goparser**: This improvement is waiting for review and merge ([PR #2011](https://github.com/gnolang/gno/pull/2011)).\n\n- **DAO SDK**\n\n - **DAO SDK**: Waiting Review and merge: [PR #1925](https://github.com/gnolang/gno/pull/1925).\n\n- **Project Manager**\nSince we have already a lot in review, before opening a PR on the Gno repo, we're taking time to:\n - Polish the \"private\" [atomic PR](https://github.com/TERITORI/gno/pull/20)\n - Polish the UI\n - Set-up e2e testing with gnodev and a gno-js-client wallet, you can see a demo recording [here](https://github.com/TERITORI/gno/pull/20), the end-goal is to run e2e tests in CI\n\n## Dragos\n\n### ZenTasktic \n- Zentasktic User (3rd grant milestone) implemented: https://github.com/irreverentsimplicity/zentasktic-user\n - updated docs for all 3 projects:\n - https://github.com/irreverentsimplicity/zentasktic-core/blob/main/README.md\n - https://github.com/irreverentsimplicity/zentasktic-project/blob/main/README.md\n - https://github.com/irreverentsimplicity/zentasktic-user/blob/main/README.md\n\n- zentasktic (the package)\n - big overhaul, allowing for keeping the Assess-Decide-Do logic on the `zentasktic` package, but save the data locally, in the realm importing the package. PR here with some more explanation: https://github.com/irreverentsimplicity/zentasktic-core/pull/1\n\n- zentasktic-project (the realm)\n - backend finished, repo here: https://github.com/irreverentsimplicity/zentasktic-project\n - question: test failing on RemoveWorkDuration with `panic: reflect: reflect.Value.SetString using value obtained using unexported field` on WorkDuration? AddWorkDuration and EditWorkDuration tests are passing...\n\n### Flippando\n* hackerville.xyz website updated for the upcoming airdrop: https://hackerville.xyz\n* airdrop script in testing\n* flippando NFT airdrop\n - copy added to the main flippando website, with airdrop mechanics and due date: https://gno.flippando.xyz/airdrop\n - minor updates to the website in preparation for this (airdrop mode: https://gno.flippando.xyz/playground)\n - spoiler, it will be on June 8th (2024, for conformity)\n\n## Berty\n\n- tx-indexer genesis [PR34](https://github.com/gnolang/tx-indexer/pull/34) (related to [PR1941](https://github.com/gnolang/gno/pull/1941)? ) / Jeff\n - blank screen bug fixed\n- dSocial latest features / Iuri\n - reply to a post\n - view other user's posts\n - others\n- UI conversation with Alexis - to plan soon\n\n- dSocial demo app\n - Released on Test Flight and Google Play\n - To get an invitation, send your email to Iuri on Signal. Please say if you have an iPhone or Android phone.\n - Using custom indexer on the Berty production server\n- Stress testing\n - Finalizing report\n - What is the PR to watch for resolving https://github.com/gnolang/gno/issues/1577 ?\n - Referenced PR https://github.com/gnolang/gno/issues/1576\n - Comment on CodeMagic as a possibility\n\n## Var Meta\n\n- issue: https://github.com/gnolang/gno/issues/2053\nPR: https://github.com/gnolang/gno/pull/2108\nDes: limit import path length\nStatus: Merged\n- issue: https://github.com/gnolang/gno/issues/2192\nPR: https://github.com/gnolang/gno/pull/2242\nDes: Restric the maketx call function can only call to a realm\nStatus: Merged\n- issue: https://github.com/gnolang/gno/issues/1998\nPR: https://github.com/gnolang/gno/pull/2149\nDes: This PR defines a GasUsed() func and a defaultInvokeCost in gas within std package. Simple feature let realm developer know the gas used at the time function is called.\nStatus: Wait for reviewing\n- ISSUE: New issue about GnoPlayGround RUN and TEST func in different browsers (safari, chrome)\nLink: https://github.com/gnolang/gno/issues/2270\nStatus: NO PR is made, waiting core team\n- WIP: Sponsor TX\nPR: https://github.com/gnolang/gno/pull/2209\nDes: This PR aims to facilitate a transaction that should have been from A(signer) to B(Address/Realm) (A would pay the gas fee). Instead, A will delegate C(signer) to sign the transaction from A to B (C will pay the gas fee).\nStatus: Under reviewing\n- PR: https://github.com/gnolang/gno/pull/2249\nIssue: https://github.com/gnolang/gno/issues/2232\nDes: To consolidate our returns on gnokey queries, I propose that we make them return JSON strings\nStatus: Waiting for #1776 to be merged\n- PR: https://github.com/gnolang/gno/pull/2198\nIssue: https://github.com/gnolang/gno/issues/2193\nDes: Propose refactoring p/ownable from a struct with a specific implementation to a more minimal interface, allowing for custom ownership logic while retaining the current struct as the default implementation.\nStatus: Waiting for reviewing\n- PR: https://github.com/gnolang/gno/pull/2225\nIssue: https://github.com/gnolang/gno/issues/2193\nDes: I propose integrating certain utility smart contracts from Ethereum into Gnoland. Now i'm working on defining the Bitmap, NonceManager and Queue packages, which can provide essential functionality for the Gnoland ecosystem.\nStatus: Waiting for reviewing\n- PR: https://github.com/gnolang/gno/pull/2234\nIssue: https://github.com/gnolang/gno/issues/2231\nDes: We should either implement this, or remove the flag until the functionality is implemented. Same goes for the –prove flag.\nStatus: Merged\n\n- PR: \n - Support extensions like Metadata, RoyaltyInfo for GRC721 https://github.com/gnolang/gno/pull/1962 (Merged)\n - Deprecate \u0026 remove std.CurrentRealmPath() https://github.com/gnolang/gno/pull/2087 (Reviewing)\n - limit package path length https://github.com/gnolang/gno/pull/2108 (Aprroved)\n - Implement Bitmap package https://github.com/gnolang/gno/pull/2115 (Need review)\n - Implement Nonces package https://github.com/gnolang/gno/pull/2123 (Need review)\n - GasUsed() for GnoVM std https://github.com/gnolang/gno/pull/2149\n- Issues:\n - Panic when getting keypair information https://github.com/gnolang/gno/issues/2133\n - Proposal: Integrate Sponsor Mechanism for Transaction Fees https://github.com/gnolang/gno/issues/2152\n\n## Student Contributor Program\n\n**Mustapha**\n* Made a V0 Auction dapp ([PR#2265](https://github.com/gnolang/gno/pull/2265)) \n\n**Antonio**\n- GNOWLEDGE\nA [realm](https://github.com/iam-agf/Gnowledge) to simulate a Stackoverflow styled. Sharing to get some feedback. You can interact with it via https://github.com/iam-agf/Gnowledge-website .\n\n**Antonio**\n* https://github.com/iam-agf/Shiken \n\n# New Content\n\n- [Key/Value Stores: How We Improved the Performance of Our tx-indexer by 10x](https://gno.land/r/gnoland/blog:p/kv-stores-indexer)\n- [Introducing Gno Studio, the Premier Builder Suite for Gno.land](https://gno.land/r/gnoland/blog:p/gno-studio-intro)\n- [Introducing our new Gno.land logo: the gnome](https://gno.land/r/gnoland/blog:p/the-gnome)\n- [Gnomes Spotted in Belgrade, Serbia: Recap from the Engineering Retreat and Golang Serbia Meetup](https://gno.land/r/gnoland/blog:p/gnomes-in-serbia)\n- [Test4 Explained](https://gno.land/r/gnoland/blog:p/test4-explained)\n\n# Events and Meetups\n\n## Past events\n\n- GoLang Serbia Meetup / Belgrade / May 23. We used the Gno core team's retreat in Belgrade to connect with the local Go developers and possible contributors over the next few months to build the ecosystem. [Full recap](https://gno.land/r/gnoland/blog:p/gnomes-in-serbia).\n- We're currently wrapping up **GopherCon EU** in Berlin, expect an update soon!\n\n## Upcoming events\n\n- **GopherCon US** / Chicago / July 7th - 10th\n- **Nebular Summit** / Brussels / July 12th/13th\n\n## Discord Developer Office Hours\n\nEvery week on Thursday at 2:30 pm CEST, we host office hours on [Discord](https://discord.com/invite/d24CT5b9cd?event=1252310282450112595) to answer questions, discuss updates, and catch up with the community. We'd love to see you there!","2024-06-20T00:00:00Z","Kouteki","gnoland,ecosystem,updates,gnovm,tm2,test4,gnostudio,connect"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"IvYmTsFPeZmPjp3FNvAnTjN9BjBndR8WWWkvU0Vw4pJPKDvP5YVXhOzGCZ7ZQrfo6GDy0h2GZOg7maV45neT3w=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModEditPost","args":["monthly-dev-9","The More You Gno 9: Realm to Realm Interaction, Faucet Hub, New Test4 Launch Date and More","\n\nThis edition brings several major pieces of news; Gno Studio Connect beta, and Faucet Hub. We're moving up the Test4 launch by 2 weeks, so we could get to mainnet faster. We'll also be seeing each other at GopherCons EU and US, so make sure to stop by and say hi! Oh, and our [new gnome logo is live](https://gno.land/r/gnoland/blog:p/the-gnome)!\n\nWe're also covering all the major and minor code improvements; if you want to dive deeper, we have the weekly engineering [updates](https://github.com/gnolang/meetings/issues/37) and video [recordings](https://www.youtube.com/watch?v=9ch7MhKNBmw\u0026list=PL7nP7r1QiDktMCdw1ydQo2crM3y6Zk7E4) available. \n\n# Gno Core Updates\n\n## Introducing Gno Studio Connect\n\nLast month [we talked](https://medium.com/@gnostudio/introducing-gno-studio-the-premier-builder-suite-for-gno-land-d1b4d82b46de) about the need for a premier builder suite for Gno.land. As Gno.land expands into a universe of realms, we saw the need for a set of tools; tools empowing the community to create and use succint and composable realms on Gno.land. Last year we launched [Gno Playground](https://play.gno.land/). Now we're adding another tool to the toolbox - [Gno Studio Connect](https://gno.studio/connect). Currently in beta, Connect allows seamless access to realms, making it simple to explore, interact, and engage with Gno.land's smart contracts through function calls. Try out your first realm interaction via Connect by taking our [gnoyourdate](https://gno.studio/connect/view/gno.land/r/gnostudio/gnoyourdate?network=test3#Vote) poll. \n\n## Faucet Hub is Live\n\nWith the [Faucet Hub](https://faucet.gno.land) you can now easily and effortlessly use all Gno.land ecosystem faucets, including Portal Loop, staging, future testnets and implementation partner chains. It's easily extensible, with the goal of having a single stop for every possible Gno.land test token you might need.\n\n## Test4 Launch Scheduled for July 15\n\nAfter announcing the tentative [Test4](https://gno.land/r/gnoland/blog:p/test4-explained) launch for the end of July/early August, we realized we're working faster than anticipated. That's why **we're moving the official Test4 launch to July 15, 2024**!\n\n## 550 TPS\n\nRecent [supernova](https://github.com/gnolang/supernova) tests showed that we have **~550 TPS** on a single node machine (M3 Mac; 100k txs, 1s block time). This is a huge step up from last year, when the TPS performance we had varied from 7-20 TPS with the same setup.\n\n## New DevOps team member\n\nPlease welcome Sergio Matone! A DevOps with a strong Go background, he'll be a key player in improving and managing the Gno.land infrastructure.\n\n## Belgrade Retreat\n\nThe core team travelled from across the world to Belgrade, Serbia, where we hunkered down and solved a number of issues blocking Test4 as well as future releases all the way to the mainnet. Full recap [here](https://gno.land/r/gnoland/blog:p/gnomes-in-serbia).\n\n## Changelog\n\n- Dropped support for [all unused DB implementations](https://github.com/gnolang/gno/pull/1714), apart from leveldb and boltdb. Without excessive DB implementations that need maintaining, we can focus on optimizing the ones we actually use, and squeeze out performance from systems we already have. \n\n- Resolved a Long Standing CI Issue With BFT Tests. [The CI is finally green across the board](https://github.com/gnolang/gno/pull/1515). We still have some flaky tests, but the CI will no longer constantly fail on the BFT CI due to irregular channel usage. This, couple with our CI rework over the past month, significantly improved our GitHub development process.\n\n- Lots of spring cleaning efforts with [gnokey](https://github.com/gnolang/gno/pull/1212), [gnoland](https://github.com/gnolang/gno/pull/1985), and our other tools. We took this chance to also add extensive coverage and regression tests, in case they were missing before.\n\n- [Finally merged in Event / Emit support](https://github.com/gnolang/gno/pull/1653) in Gno! Users and Gno clients can finally fetch on-chain events as soon as they happen, and have a rich context for them as well. Support for these has already been propagated to our [tx-indexer](https://github.com/gnolang/tx-indexer/pull/43).\n\n- [Merged in the VM gas consumption fixes](https://github.com/gnolang/gno/pull/1430), which standardize VM gas usage across the board for users. Having predictable gas costs, and gas costs that take into account VM operations is only fair for both the node operators and the chain users.\n\n- [Reworked the node directory structure](https://github.com/gnolang/gno/pull/1944), and made [genesis.json usage explicit](https://github.com/gnolang/gno/pull/1972), paving the way to an easier multinode future. This effort enables us to easily orchestrate and configure Gno blockchain nodes, especially with the upcoming devnet / testnet launch.\n\n- [Overhauled our monorepo GH actions](https://github.com/gnolang/gno/pull/2040), with them now avoiding double-work, and being much snappier. CI for PRs now runs much quicker and more stable, due to these optimizations.\n\n- [Finished migration to Goreleaser](https://github.com/gnolang/gno/pull/2101). All of our important tools and binaries have a clear build and release schedule (for Docker, and beyond!), with us implementing nightly, dev and `master` releases on the monorepo.\n\n- [Bumped the gnovm test coverage](https://github.com/gnolang/gno/pull/2143) from ~34% to ~67%. With upcoming changes to the GnoVM, we needed a good safety net in the form of a testing suite that will alert us if funny business is going on after a change.\n\n- [Many, many bug fixes, small UX improvements and QoL changes](https://github.com/gnolang/gno/commits/master/?since=2024-05-01\u0026until=2024-06-03\u0026before=edb321f85beff98536a3a1a7111febaea0771a5e+35) that keep the lights on and systems running smoothly.\n\n# Ecosystem Updates\n\n## Onbloc\n\n Multinode/Validator Docs: https://github.com/gnolang/gno/pull/2285\n2. `test4` Validator Initiative Discussion: https://github.com/gnolang/hackerspace/issues/69\n3. GnoSwap Portal Loop Migration Blocker: https://github.com/gnolang/gno/issues/2283\n - Liquidity Pool realm deployment failing on portal-loop\n - Attempts tried:\n - Changing package path / reducing realm size / setting gax-wanted to max / changing client env\n - Cloning gno repo every single recent commit to re-produce on local but never failed.\n - Update: Potential cause → Certain failing txs are causing corrupt cache files `cacheNodes`\n\n- Gno Core\n - You can check our Merged, Awaiting Review, and TODO PRs in [our hackerspace. ](https://github.com/gnolang/hackerspace/issues/29)\n- [Onbloc API Docs](https://onbloc-info.gitbook.io/onbloc-api-docs): Permissionless JSON-RPC methods to Gno.land's official networks (portal-loop, test3) for any individuals or teams building on Gno.land (feedback is welcome!)\n- GnoSwap\n - Contract migration to portal-loop (Tartget: May 24th)\n - Applying `std.Emit` to contracts and APIs ([apply emit event in contract](https://github.com/gnoswap-labs/gnoswap/pull/217))\n - VWAP (Volume-Weighted Average Price) implementation for improved pricing ([gnoswap-labs/vwap](https://github.com/gnoswap-labs/vwap))\n- Misc\n - Add links to [GnoStudio Connect in GnoScan](https://gnoscan.io/realms/details?path=gno.land/r/michelle/mymood)\n - ![image](https://hackmd.io/_uploads/HJrWausQC.png)\n- Full update: [Onbloc Hackerspace](https://github.com/gnolang/hackerspace/issues/29#issuecomment-2124697977), [Onbloc Kanban](https://github.com/orgs/gnolang/projects/23)\n\n## Teritori\n\n- GnoVM\n\n - **Add stacktrace functionality and replace some uses of `Machine.String`**: This pull request is currently in review discussions with Morgan ([PR #2145](https://github.com/gnolang/gno/pull/2145)).\n - **Go2Gno loses type info**: This issue is Merged ([PR #2016](https://github.com/gnolang/gno/pull/2016)).\n - **Avoid instantiation of banker on pure package**: This change is awaiting review and merge ([PR #2248](https://github.com/gnolang/gno/pull/2248)).\n - **Missing length check in value declaration**: This pull request is also awaiting review and merge ([PR #2206](https://github.com/gnolang/gno/pull/2206)).\n - **Issue: File line not set on `ValueDeclr`, `ImportDecl`, `TypeDecl`**: The issue has been resolved and closed ([Issue #2220](https://github.com/gnolang/gno/issues/2220)).\n - **File line not set on `ValueDeclr`, `ImportDecl`, `TypeDecl`**: The fix has been successfully merged ([PR #2221](https://github.com/gnolang/gno/pull/2221)).\n\n- Gno lint\n - **Printing all the errors from goparser**: This pull request has been successfully merged ([PR #2011](https://github.com/gnolang/gno/pull/2011)).\n - **Lint all files in folder before panicking**: This pull request is awaiting review and merge ([PR #2202](https://github.com/gnolang/gno/pull/2202)).\n\n- DAO SDK (still waiting for review)\n PR: [#1925](https://github.com/gnolang/gno/pull/1925)\n \n- **GnoVM**\n - **Cannot use struct as key of a map**: We resolved the issue where structs couldn't be used as keys in maps. This PR has been merged ([PR #2044](https://github.com/gnolang/gno/pull/2044)).\n - **Go2Gno loses type info**: This issue is still awaiting review and merge ([PR #2016](https://github.com/gnolang/gno/pull/2016)).\n - **Gno Issue with pointer**: We proposed a solution ([Issue #2060](https://github.com/gnolang/gno/issues/2060)).\n - **Stacktrace functionality**: We added stacktrace functionality and replaced some uses of `Machine.String` ([PR #2145](https://github.com/gnolang/gno/pull/2145)).\n - **Recover not working correctly with runtime panics**: We created an issue to address this problem ([Issue #2146](https://github.com/gnolang/gno/issues/2146)).\n - **Panic when adding a package with subpaths**: We worked on this issue and waiting for review and merge [PR #2155](https://github.com/gnolang/gno/pull/2155)).\n\n- **Gno lint**\n - **Printing all the errors from goparser**: This improvement is waiting for review and merge ([PR #2011](https://github.com/gnolang/gno/pull/2011)).\n\n- **DAO SDK**\n - **DAO SDK**: Waiting Review and merge: [PR #1925](https://github.com/gnolang/gno/pull/1925).\n\n- **Project Manager**\nSince we have already a lot in review, before opening a PR on the Gno repo, we're taking time to:\n - Polish the \"private\" [atomic PR](https://github.com/TERITORI/gno/pull/20)\n - Polish the UI\n - Set-up e2e testing with gnodev and a gno-js-client wallet, you can see a demo recording [here](https://github.com/TERITORI/gno/pull/20), the end-goal is to run e2e tests in CI\n\n## Dragos\n\n### ZenTasktic \n- Zentasktic User (3rd grant milestone) implemented: https://github.com/irreverentsimplicity/zentasktic-user\n - updated docs for all 3 projects:\n - https://github.com/irreverentsimplicity/zentasktic-core/blob/main/README.md\n - https://github.com/irreverentsimplicity/zentasktic-project/blob/main/README.md\n - https://github.com/irreverentsimplicity/zentasktic-user/blob/main/README.md\n\n- zentasktic (the package)\n - big overhaul, allowing for keeping the Assess-Decide-Do logic on the `zentasktic` package, but save the data locally, in the realm importing the package. PR here with some more explanation: https://github.com/irreverentsimplicity/zentasktic-core/pull/1\n\n- zentasktic-project (the realm)\n - backend finished, repo here: https://github.com/irreverentsimplicity/zentasktic-project\n - question: test failing on RemoveWorkDuration with `panic: reflect: reflect.Value.SetString using value obtained using unexported field` on WorkDuration? AddWorkDuration and EditWorkDuration tests are passing...\n\n### Flippando\n* hackerville.xyz website updated for the upcoming airdrop: https://hackerville.xyz\n* airdrop script in testing\n* flippando NFT airdrop\n - copy added to the main flippando website, with airdrop mechanics and due date: https://gno.flippando.xyz/airdrop\n - minor updates to the website in preparation for this (airdrop mode: https://gno.flippando.xyz/playground)\n - spoiler, it will be on June 8th (2024, for conformity)\n\n## Berty\n\n- tx-indexer genesis [PR34](https://github.com/gnolang/tx-indexer/pull/34) (related to [PR1941](https://github.com/gnolang/gno/pull/1941)? ) / Jeff\n - blank screen bug fixed\n- dSocial latest features / Iuri\n - reply to a post\n - view other user's posts\n - others\n- UI conversation with Alexis - to plan soon\n\n- dSocial demo app\n - Released on Test Flight and Google Play\n - To get an invitation, send your email to Iuri on Signal. Please say if you have an iPhone or Android phone.\n - Using custom indexer on the Berty production server\n- Stress testing\n - Finalizing report\n - What is the PR to watch for resolving https://github.com/gnolang/gno/issues/1577 ?\n - Referenced PR https://github.com/gnolang/gno/issues/1576\n - Comment on CodeMagic as a possibility\n\n## Var Meta\n\n- issue: https://github.com/gnolang/gno/issues/2053\nPR: https://github.com/gnolang/gno/pull/2108\nDes: limit import path length\nStatus: Merged\n- issue: https://github.com/gnolang/gno/issues/2192\nPR: https://github.com/gnolang/gno/pull/2242\nDes: Restric the maketx call function can only call to a realm\nStatus: Merged\n- issue: https://github.com/gnolang/gno/issues/1998\nPR: https://github.com/gnolang/gno/pull/2149\nDes: This PR defines a GasUsed() func and a defaultInvokeCost in gas within std package. Simple feature let realm developer know the gas used at the time function is called.\nStatus: Wait for reviewing\n- ISSUE: New issue about GnoPlayGround RUN and TEST func in different browsers (safari, chrome)\nLink: https://github.com/gnolang/gno/issues/2270\nStatus: NO PR is made, waiting core team\n- WIP: Sponsor TX\nPR: https://github.com/gnolang/gno/pull/2209\nDes: This PR aims to facilitate a transaction that should have been from A(signer) to B(Address/Realm) (A would pay the gas fee). Instead, A will delegate C(signer) to sign the transaction from A to B (C will pay the gas fee).\nStatus: Under reviewing\n- PR: https://github.com/gnolang/gno/pull/2249\nIssue: https://github.com/gnolang/gno/issues/2232\nDes: To consolidate our returns on gnokey queries, I propose that we make them return JSON strings\nStatus: Waiting for #1776 to be merged\n- PR: https://github.com/gnolang/gno/pull/2198\nIssue: https://github.com/gnolang/gno/issues/2193\nDes: Propose refactoring p/ownable from a struct with a specific implementation to a more minimal interface, allowing for custom ownership logic while retaining the current struct as the default implementation.\nStatus: Waiting for reviewing\n- PR: https://github.com/gnolang/gno/pull/2225\nIssue: https://github.com/gnolang/gno/issues/2193\nDes: I propose integrating certain utility smart contracts from Ethereum into Gnoland. Now i'm working on defining the Bitmap, NonceManager and Queue packages, which can provide essential functionality for the Gnoland ecosystem.\nStatus: Waiting for reviewing\n- PR: https://github.com/gnolang/gno/pull/2234\nIssue: https://github.com/gnolang/gno/issues/2231\nDes: We should either implement this, or remove the flag until the functionality is implemented. Same goes for the –prove flag.\nStatus: Merged\n\n- PR: \n - Support extensions like Metadata, RoyaltyInfo for GRC721 https://github.com/gnolang/gno/pull/1962 (Merged)\n - Deprecate \u0026 remove std.CurrentRealmPath() https://github.com/gnolang/gno/pull/2087 (Reviewing)\n - limit package path length https://github.com/gnolang/gno/pull/2108 (Aprroved)\n - Implement Bitmap package https://github.com/gnolang/gno/pull/2115 (Need review)\n - Implement Nonces package https://github.com/gnolang/gno/pull/2123 (Need review)\n - GasUsed() for GnoVM std https://github.com/gnolang/gno/pull/2149\n- Issues:\n - Panic when getting keypair information https://github.com/gnolang/gno/issues/2133\n - Proposal: Integrate Sponsor Mechanism for Transaction Fees https://github.com/gnolang/gno/issues/2152\n\n## Student Contributor Program\n\n**Mustapha**\n* Made a V0 Auction dapp ([PR#2265](https://github.com/gnolang/gno/pull/2265)) \n\n## Contributors\n\n- **Antonio**\n - GNOWLEDGE: A [realm](https://github.com/iam-agf/Gnowledge) to simulate a Stackoverflow styled. Sharing to get\nsome feedback. You can check it out via https://github.com/iam-agf/Gnowledge-website\n - Shiken Project: https://github.com/iam-agf/Shiken=\n\n# New Content\n\n- [Key/Value Stores: How We Improved the Performance of Our tx-indexer by 10x](https://gno.land/r/gnoland/blog:p/kv-stores-indexer)\n- [Introducing Gno Studio, the Premier Builder Suite for Gno.land](https://gno.land/r/gnoland/blog:p/gno-studio-intro)\n- [Introducing our new Gno.land logo: the gnome](https://gno.land/r/gnoland/blog:p/the-gnome)\n- [Gnomes Spotted in Belgrade, Serbia: Recap from the Engineering Retreat and Golang Serbia Meetup](https://gno.land/r/gnoland/blog:p/gnomes-in-serbia)\n- [Test4 Explained](https://gno.land/r/gnoland/blog:p/test4-explained)\n\n# Events and Meetups\n\n## Past events\n\n- GoLang Serbia Meetup / Belgrade / May 23. We used the Gno core team's retreat in Belgrade to connect with the local Go developers and possible contributors over the next few months to build the ecosystem. [Full recap](https://gno.land/r/gnoland/blog:p/gnomes-in-serbia).\n- We're currently wrapping up **GopherCon EU** in Berlin, expect an update soon!\n\n## Upcoming events\n\n- **GopherCon US** / Chicago / July 7th - 10th\n- **Nebular Summit** / Brussels / July 12th/13th\n\n## Discord Developer Office Hours\n\nEvery week on Thursday at 2:30 pm CEST, we host office hours on [Discord](https://discord.com/invite/d24CT5b9cd?event=1252310282450112595) to answer questions, discuss updates, and catch up with the community. We'd love to see you there!","2024-06-20T00:00:00Z","Kouteki","gnoland,ecosystem,updates,gnovm,tm2,test4,gnostudio,connect"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"FCX7WqZiOiddUt15AyIXXvFx4JBcl705wyyrISacFcJdIRWdXG5CLzc31tK+TAPqiuuOVr0WGnQcT8xvAn0eyw=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModEditPost","args":["monthly-dev-9","The More You Gno 9: Realm to Realm Interaction, Faucet Hub, New Test4 Launch Date and More","\n\nThis edition brings several major pieces of news; Gno Studio Connect beta, and Faucet Hub. We're moving up the Test4 launch by 2 weeks, so we could get to mainnet faster. We'll also be seeing each other at GopherCons EU and US, so make sure to stop by and say hi! Oh, and our [new gnome logo is live](https://gno.land/r/gnoland/blog:p/the-gnome)!\n\nWe're also covering all the major and minor code improvements; if you want to dive deeper, we have the weekly engineering [updates](https://github.com/gnolang/meetings/issues/37) and video [recordings](https://www.youtube.com/watch?v=9ch7MhKNBmw\u0026list=PL7nP7r1QiDktMCdw1ydQo2crM3y6Zk7E4) available. \n\n# Gno Core Updates\n\n## Introducing Gno Studio Connect\n\nLast month [we talked](https://medium.com/@gnostudio/introducing-gno-studio-the-premier-builder-suite-for-gno-land-d1b4d82b46de) about the need for a premier builder suite for Gno.land. As Gno.land expands into a universe of realms, we saw the need for a set of tools; tools empowing the community to create and use succint and composable realms on Gno.land. Last year we launched [Gno Playground](https://play.gno.land/). Now we're adding another tool to the toolbox - [Gno Studio Connect](https://gno.studio/connect). Currently in beta, Connect allows seamless access to realms, making it simple to explore, interact, and engage with Gno.land's smart contracts through function calls. Try out your first realm interaction via Connect by taking our [gnoyourdate](https://gno.studio/connect/view/gno.land/r/gnostudio/gnoyourdate?network=test3#Vote) poll. \n\n## Faucet Hub is Live\n\nWith the [Faucet Hub](https://faucet.gno.land) you can now easily and effortlessly use all Gno.land ecosystem faucets, including Portal Loop, staging, future testnets and implementation partner chains. It's easily extensible, with the goal of having a single stop for every possible Gno.land test token you might need.\n\n## Test4 Launch Scheduled for July 15\n\nAfter announcing the tentative [Test4](https://gno.land/r/gnoland/blog:p/test4-explained) launch for the end of July/early August, we realized we're working faster than anticipated. That's why **we're moving the official Test4 launch to July 15, 2024**!\n\n## 550 TPS\n\nRecent [supernova](https://github.com/gnolang/supernova) tests showed that we have **~550 TPS** on a single node machine (M3 Mac; 100k txs, 1s block time). This is a huge step up from last year, when the TPS performance we had varied from 7-20 TPS with the same setup.\n\n## New DevOps team member\n\nPlease welcome Sergio Matone! A DevOps with a strong Go background, he'll be a key player in improving and managing the Gno.land infrastructure.\n\n## Belgrade Retreat\n\nThe core team travelled from across the world to Belgrade, Serbia, where we hunkered down and solved a number of issues blocking Test4 as well as future releases all the way to the mainnet. Full recap [here](https://gno.land/r/gnoland/blog:p/gnomes-in-serbia).\n\n## Changelog\n\n- Dropped support for [all unused DB implementations](https://github.com/gnolang/gno/pull/1714), apart from leveldb and boltdb. Without excessive DB implementations that need maintaining, we can focus on optimizing the ones we actually use, and squeeze out performance from systems we already have. \n\n- Resolved a Long Standing CI Issue With BFT Tests. [The CI is finally green across the board](https://github.com/gnolang/gno/pull/1515). We still have some flaky tests, but the CI will no longer constantly fail on the BFT CI due to irregular channel usage. This, couple with our CI rework over the past month, significantly improved our GitHub development process.\n\n- Lots of spring cleaning efforts with [gnokey](https://github.com/gnolang/gno/pull/1212), [gnoland](https://github.com/gnolang/gno/pull/1985), and our other tools. We took this chance to also add extensive coverage and regression tests, in case they were missing before.\n\n- [Finally merged in Event / Emit support](https://github.com/gnolang/gno/pull/1653) in Gno! Users and Gno clients can finally fetch on-chain events as soon as they happen, and have a rich context for them as well. Support for these has already been propagated to our [tx-indexer](https://github.com/gnolang/tx-indexer/pull/43).\n\n- [Merged in the VM gas consumption fixes](https://github.com/gnolang/gno/pull/1430), which standardize VM gas usage across the board for users. Having predictable gas costs, and gas costs that take into account VM operations is only fair for both the node operators and the chain users.\n\n- [Reworked the node directory structure](https://github.com/gnolang/gno/pull/1944), and made [genesis.json usage explicit](https://github.com/gnolang/gno/pull/1972), paving the way to an easier multinode future. This effort enables us to easily orchestrate and configure Gno blockchain nodes, especially with the upcoming devnet / testnet launch.\n\n- [Overhauled our monorepo GH actions](https://github.com/gnolang/gno/pull/2040), with them now avoiding double-work, and being much snappier. CI for PRs now runs much quicker and more stable, due to these optimizations.\n\n- [Finished migration to Goreleaser](https://github.com/gnolang/gno/pull/2101). All of our important tools and binaries have a clear build and release schedule (for Docker, and beyond!), with us implementing nightly, dev and `master` releases on the monorepo.\n\n- [Bumped the gnovm test coverage](https://github.com/gnolang/gno/pull/2143) from ~34% to ~67%. With upcoming changes to the GnoVM, we needed a good safety net in the form of a testing suite that will alert us if funny business is going on after a change.\n\n- [Many, many bug fixes, small UX improvements and QoL changes](https://github.com/gnolang/gno/commits/master/?since=2024-05-01\u0026until=2024-06-03\u0026before=edb321f85beff98536a3a1a7111febaea0771a5e+35) that keep the lights on and systems running smoothly.\n\n# Ecosystem Updates\n\n## Onbloc\n\n Multinode/Validator Docs: https://github.com/gnolang/gno/pull/2285\n2. `test4` Validator Initiative Discussion: https://github.com/gnolang/hackerspace/issues/69\n3. GnoSwap Portal Loop Migration Blocker: https://github.com/gnolang/gno/issues/2283\n - Liquidity Pool realm deployment failing on portal-loop\n - Attempts tried:\n - Changing package path / reducing realm size / setting gax-wanted to max / changing client env\n - Cloning gno repo every single recent commit to re-produce on local but never failed.\n - Update: Potential cause → Certain failing txs are causing corrupt cache files `cacheNodes`\n\n- Gno Core\n - You can check our Merged, Awaiting Review, and TODO PRs in [our hackerspace. ](https://github.com/gnolang/hackerspace/issues/29)\n- [Onbloc API Docs](https://onbloc-info.gitbook.io/onbloc-api-docs): Permissionless JSON-RPC methods to Gno.land's official networks (portal-loop, test3) for any individuals or teams building on Gno.land (feedback is welcome!)\n- GnoSwap\n - Contract migration to portal-loop (Tartget: May 24th)\n - Applying `std.Emit` to contracts and APIs ([apply emit event in contract](https://github.com/gnoswap-labs/gnoswap/pull/217))\n - VWAP (Volume-Weighted Average Price) implementation for improved pricing ([gnoswap-labs/vwap](https://github.com/gnoswap-labs/vwap))\n- Misc\n - Add links to [GnoStudio Connect in GnoScan](https://gnoscan.io/realms/details?path=gno.land/r/michelle/mymood)\n - ![image](https://hackmd.io/_uploads/HJrWausQC.png)\n- Full update: [Onbloc Hackerspace](https://github.com/gnolang/hackerspace/issues/29#issuecomment-2124697977), [Onbloc Kanban](https://github.com/orgs/gnolang/projects/23)\n\n\n## Teritori\n\n- GnoVM\n\n - **Add stacktrace functionality and replace some uses of `Machine.String`**: This pull request is currently in review discussions with Morgan ([PR #2145](https://github.com/gnolang/gno/pull/2145)).\n - **Go2Gno loses type info**: This issue is Merged ([PR #2016](https://github.com/gnolang/gno/pull/2016)).\n - **Avoid instantiation of banker on pure package**: This change is awaiting review and merge ([PR #2248](https://github.com/gnolang/gno/pull/2248)).\n - **Missing length check in value declaration**: This pull request is also awaiting review and merge ([PR #2206](https://github.com/gnolang/gno/pull/2206)).\n - **Issue: File line not set on `ValueDeclr`, `ImportDecl`, `TypeDecl`**: The issue has been resolved and closed ([Issue #2220](https://github.com/gnolang/gno/issues/2220)).\n - **File line not set on `ValueDeclr`, `ImportDecl`, `TypeDecl`**: The fix has been successfully merged ([PR #2221](https://github.com/gnolang/gno/pull/2221)).\n\n- Gno lint\n\n - **Printing all the errors from goparser**: This pull request has been successfully merged ([PR #2011](https://github.com/gnolang/gno/pull/2011)).\n - **Lint all files in folder before panicking**: This pull request is awaiting review and merge ([PR #2202](https://github.com/gnolang/gno/pull/2202)).\n\n- DAO SDK (still waiting for review)\n PR: [#1925](https://github.com/gnolang/gno/pull/1925)\n \n- **GnoVM**\n\n - **Cannot use struct as key of a map**: We resolved the issue where structs couldn't be used as keys in maps. This PR has been merged ([PR #2044](https://github.com/gnolang/gno/pull/2044)).\n - **Go2Gno loses type info**: This issue is still awaiting review and merge ([PR #2016](https://github.com/gnolang/gno/pull/2016)).\n - **Gno Issue with pointer**: We proposed a solution ([Issue #2060](https://github.com/gnolang/gno/issues/2060)).\n - **Stacktrace functionality**: We added stacktrace functionality and replaced some uses of `Machine.String` ([PR #2145](https://github.com/gnolang/gno/pull/2145)).\n - **Recover not working correctly with runtime panics**: We created an issue to address this problem ([Issue #2146](https://github.com/gnolang/gno/issues/2146)).\n - **Panic when adding a package with subpaths**: We worked on this issue and waiting for review and merge [PR #2155](https://github.com/gnolang/gno/pull/2155)).\n\n- **Gno lint**\n\n - **Printing all the errors from goparser**: This improvement is waiting for review and merge ([PR #2011](https://github.com/gnolang/gno/pull/2011)).\n\n- **DAO SDK**\n\n - **DAO SDK**: Waiting Review and merge: [PR #1925](https://github.com/gnolang/gno/pull/1925).\n\n- **Project Manager**\nSince we have already a lot in review, before opening a PR on the Gno repo, we're taking time to:\n - Polish the \"private\" [atomic PR](https://github.com/TERITORI/gno/pull/20)\n - Polish the UI\n - Set-up e2e testing with gnodev and a gno-js-client wallet, you can see a demo recording [here](https://github.com/TERITORI/gno/pull/20), the end-goal is to run e2e tests in CI\n\n## Dragos\n\n### ZenTasktic \n- Zentasktic User (3rd grant milestone) implemented: https://github.com/irreverentsimplicity/zentasktic-user\n - updated docs for all 3 projects:\n - https://github.com/irreverentsimplicity/zentasktic-core/blob/main/README.md\n - https://github.com/irreverentsimplicity/zentasktic-project/blob/main/README.md\n - https://github.com/irreverentsimplicity/zentasktic-user/blob/main/README.md\n\n- zentasktic (the package)\n - big overhaul, allowing for keeping the Assess-Decide-Do logic on the `zentasktic` package, but save the data locally, in the realm importing the package. PR here with some more explanation: https://github.com/irreverentsimplicity/zentasktic-core/pull/1\n\n- zentasktic-project (the realm)\n - backend finished, repo here: https://github.com/irreverentsimplicity/zentasktic-project\n - question: test failing on RemoveWorkDuration with `panic: reflect: reflect.Value.SetString using value obtained using unexported field` on WorkDuration? AddWorkDuration and EditWorkDuration tests are passing...\n\n### Flippando\n* hackerville.xyz website updated for the upcoming airdrop: https://hackerville.xyz\n* airdrop script in testing\n* flippando NFT airdrop\n - copy added to the main flippando website, with airdrop mechanics and due date: https://gno.flippando.xyz/airdrop\n - minor updates to the website in preparation for this (airdrop mode: https://gno.flippando.xyz/playground)\n - spoiler, it will be on June 8th (2024, for conformity)\n\n## Berty\n\n- tx-indexer genesis [PR34](https://github.com/gnolang/tx-indexer/pull/34) (related to [PR1941](https://github.com/gnolang/gno/pull/1941)? ) / Jeff\n - blank screen bug fixed\n- dSocial latest features / Iuri\n - reply to a post\n - view other user's posts\n - others\n- UI conversation with Alexis - to plan soon\n\n- dSocial demo app\n - Released on Test Flight and Google Play\n - To get an invitation, send your email to Iuri on Signal. Please say if you have an iPhone or Android phone.\n - Using custom indexer on the Berty production server\n- Stress testing\n - Finalizing report\n - What is the PR to watch for resolving https://github.com/gnolang/gno/issues/1577 ?\n - Referenced PR https://github.com/gnolang/gno/issues/1576\n - Comment on CodeMagic as a possibility\n\n## Var Meta\n\n- issue: https://github.com/gnolang/gno/issues/2053\nPR: https://github.com/gnolang/gno/pull/2108\nDes: limit import path length\nStatus: Merged\n- issue: https://github.com/gnolang/gno/issues/2192\nPR: https://github.com/gnolang/gno/pull/2242\nDes: Restric the maketx call function can only call to a realm\nStatus: Merged\n- issue: https://github.com/gnolang/gno/issues/1998\nPR: https://github.com/gnolang/gno/pull/2149\nDes: This PR defines a GasUsed() func and a defaultInvokeCost in gas within std package. Simple feature let realm developer know the gas used at the time function is called.\nStatus: Wait for reviewing\n- ISSUE: New issue about GnoPlayGround RUN and TEST func in different browsers (safari, chrome)\nLink: https://github.com/gnolang/gno/issues/2270\nStatus: NO PR is made, waiting core team\n- WIP: Sponsor TX\nPR: https://github.com/gnolang/gno/pull/2209\nDes: This PR aims to facilitate a transaction that should have been from A(signer) to B(Address/Realm) (A would pay the gas fee). Instead, A will delegate C(signer) to sign the transaction from A to B (C will pay the gas fee).\nStatus: Under reviewing\n- PR: https://github.com/gnolang/gno/pull/2249\nIssue: https://github.com/gnolang/gno/issues/2232\nDes: To consolidate our returns on gnokey queries, I propose that we make them return JSON strings\nStatus: Waiting for #1776 to be merged\n- PR: https://github.com/gnolang/gno/pull/2198\nIssue: https://github.com/gnolang/gno/issues/2193\nDes: Propose refactoring p/ownable from a struct with a specific implementation to a more minimal interface, allowing for custom ownership logic while retaining the current struct as the default implementation.\nStatus: Waiting for reviewing\n- PR: https://github.com/gnolang/gno/pull/2225\nIssue: https://github.com/gnolang/gno/issues/2193\nDes: I propose integrating certain utility smart contracts from Ethereum into Gnoland. Now i'm working on defining the Bitmap, NonceManager and Queue packages, which can provide essential functionality for the Gnoland ecosystem.\nStatus: Waiting for reviewing\n- PR: https://github.com/gnolang/gno/pull/2234\nIssue: https://github.com/gnolang/gno/issues/2231\nDes: We should either implement this, or remove the flag until the functionality is implemented. Same goes for the –prove flag.\nStatus: Merged\n\n- PR: \n - Support extensions like Metadata, RoyaltyInfo for GRC721 https://github.com/gnolang/gno/pull/1962 (Merged)\n - Deprecate \u0026 remove std.CurrentRealmPath() https://github.com/gnolang/gno/pull/2087 (Reviewing)\n - limit package path length https://github.com/gnolang/gno/pull/2108 (Aprroved)\n - Implement Bitmap package https://github.com/gnolang/gno/pull/2115 (Need review)\n - Implement Nonces package https://github.com/gnolang/gno/pull/2123 (Need review)\n - GasUsed() for GnoVM std https://github.com/gnolang/gno/pull/2149\n- Issues:\n - Panic when getting keypair information https://github.com/gnolang/gno/issues/2133\n - Proposal: Integrate Sponsor Mechanism for Transaction Fees https://github.com/gnolang/gno/issues/2152\n\n## Student Contributor Program\n\n**Mustapha**\n* Made a V0 Auction dapp ([PR#2265](https://github.com/gnolang/gno/pull/2265))\n\n## Contributors\n- **Antonio**\n - GNOWLEDGE: A realm to simulate a Stackoverflow styled. Sharing to get some feedback. You can check it out via https://github.com/iam-agf/Gnowledge-website\n - [Shiken Project repositories](https://github.com/iam-agf?tab=repositories\u0026q=shiken\u0026type=source\u0026language=\u0026sort=)\n\n# New Content\n\n- [Key/Value Stores: How We Improved the Performance of Our tx-indexer by 10x](https://gno.land/r/gnoland/blog:p/kv-stores-indexer)\n- [Introducing Gno Studio, the Premier Builder Suite for Gno.land](https://gno.land/r/gnoland/blog:p/gno-studio-intro)\n- [Introducing our new Gno.land logo: the gnome](https://gno.land/r/gnoland/blog:p/the-gnome)\n- [Gnomes Spotted in Belgrade, Serbia: Recap from the Engineering Retreat and Golang Serbia Meetup](https://gno.land/r/gnoland/blog:p/gnomes-in-serbia)\n- [Test4 Explained](https://gno.land/r/gnoland/blog:p/test4-explained)\n\n# Events and Meetups\n\n## Past events\n\n- GoLang Serbia Meetup / Belgrade / May 23. We used the Gno core team's retreat in Belgrade to connect with the local Go developers and possible contributors over the next few months to build the ecosystem. [Full recap](https://gno.land/r/gnoland/blog:p/gnomes-in-serbia).\n- We're currently wrapping up **GopherCon EU** in Berlin, expect an update soon!\n\n## Upcoming events\n\n- **GopherCon US** / Chicago / July 7th - 10th\n- **Nebular Summit** / Brussels / July 12th/13th\n\n## Discord Developer Office Hours\n\nEvery week on Thursday at 2:30 pm CEST, we host office hours on [Discord](https://discord.com/invite/d24CT5b9cd?event=1252310282450112595) to answer questions, discuss updates, and catch up with the community. We'd love to see you there!","2024-06-20T00:00:00Z","Kouteki","gnoland,ecosystem,updates,gnovm,tm2,test4,gnostudio,connect"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"LaCA36b7iZVZ40dTjpTYwIO3qawYWWR29pZQNz/EzqtcPjqcKDRBsy76WPWooVMJCDE90iLxB5FJYnQF+iWNOw=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"ceJ+Hk0dgUsKHo1gf849mkM/AMRV9gDEnXLN5668kRpp4mhPDPI30gKBRSfAf1bDwo0Zld5K30FVKN/4GmQ5cg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"axyDAMPfVJQSvHYn+O/Rq/9y8Z56ind64CV6c7ejjSV4XNYiSwYVmri/gINfIqxYzgiN3L+dC+EfMk0bphdzpw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"3cNVAjL+9etLTXYNn0PV/C3IA/eHMwQNEVq9ObqxgJxmjeFDUCYF0ANm93uvsWlwuNi3H0sz7sqGGgSM5oom0g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/userbook","func":"SignUp","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"JS7344l+X6cSqKpbCQ+FkJtHq2snCibEp9wr2WdLIZpmzbp7rbyYcBVeiLfOS8TBIHrX/gd+OkTySQKQ8ig3Lg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"x6xTYl1UadoIwVggUaG4kHsEAioIeUdYf4n00CJudKoeQowYJ0tBmRubsEY/W4eXCrLCZcotsx6dF/PES3Tl3A=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","2","{\"message\":\"Hello you :)\",\"files\":[],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-06-19T14:49:57.913Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArDpFd2owLPsaNRQ2xWL/ELLJVVwo7OoPqIi0OtZJV7/"},"signature":"h65StezU+1qpXIKTVZtJLnui56Ef+9ItLFaPdY644jN0GJNVapu10pvqvx/kjO42IkZ/15O0fbBhs08uOGddNA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","2","{\"message\":\"\",\"files\":[],\"gifs\":[\"https://media.tenor.com/F7XQlIcWZGcAAAAC/shake-it.gif\"],\"hashtags\":[],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-06-19T14:51:48.219Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArDpFd2owLPsaNRQ2xWL/ELLJVVwo7OoPqIi0OtZJV7/"},"signature":"DsxROR2mPO1UICJAkeis9NvNU+xP+hzY+q9a9fBQyaUDqtlJ5lOx84tt0mJU0NONpWl494w6ZJRX+++uoN6UZg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","10","{\"title\":\"Diablo Rojo\",\"description\":\"Bootleg of Rodrigo y Gabriela\",\"audioFile\":{\"fileName\":\"diablo-rojo-rave-bootleg.mp3\",\"url\":\"ipfs://bafybeibahvhmd7uczseb4hhykfntxvduqzw5x6dvthdvhje3gn2ib4gz2a\",\"mimeType\":\"audio/mpeg\",\"size\":11562840,\"fileType\":\"audio\",\"audioMetadata\":{\"waveform\":[8,9,12,13,15,15,15,14,11,13,17,17,17,18,18,18,18,15,13,18,19,18,19,18,20,20,23,18,20,23,22,23,20,24,25,23,25,5,7,17,31,33,31,30,29,18,12,18,21,19,21,22,21,24,21,20,8,8,9,10,11,12,12,10,12,13,22,15,18,20,20,22,18,16,11,17,18,19,18,18,18,20,22,19,17,18,19,19,18,19,20,22,23,25,21,21,23,21,21,21,22,23,17,23,23,26,27,26,25,25,28,29,24,25,28,27,26,23,19,17,16,11,16,19,18,19,18,18,21,22,18,17,19,19,19,19,18,20,21,27,25,18,20,19,20,19,20,21,25,23,18,20,21,19,21,20,24,26,26,28,20,22,21,21,22,22,20,20,9,20,18,19,20,19,18,17,19,18,19,19,19,17,17,23,21,21,23,23,25,26,28,23,20,24,23,8,1,-1,0,0],\"duration\":289014.10430839}},\"createdAt\":\"2024-06-19T14:55:49.301Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArDpFd2owLPsaNRQ2xWL/ELLJVVwo7OoPqIi0OtZJV7/"},"signature":"lnOG47rAG71QEFVjjA6duXaO7THW8jw87s30lVM4SSg7jEjLc0FvecQS5inFWkNzz/2vMDSsH/NSkyxjQY+30A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","gnoport-4","🙃","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArDpFd2owLPsaNRQ2xWL/ELLJVVwo7OoPqIi0OtZJV7/"},"signature":"Mx4awCWZFGHqvIadwRu9IjPWAEGr1qo1draIGOpqTRlaHbdXLKeKJbrNNlobhLacPK42BdTttH+8NVMFSYhwmQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g108cszmcvs4r3k67k7h5zuhm4el3qhlrxzhshtv","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","gnoport-3","😁","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArDpFd2owLPsaNRQ2xWL/ELLJVVwo7OoPqIi0OtZJV7/"},"signature":"wKIbHEJKKgAAuU3pH5s0mo2/yKLvAwj2HqCNvI0w2jpQ9ftUv8t1x0FJPCpAaV7SrymNgOoiKcCz4pe1/K3p1w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"EeUfVofFAKpvV8SJVKmAjaoab7hGrV4Wx2Y3N8EW8n56DG99pJ0HLrxFOlW7EU9gzBU9NrYHIu1FLs2TChNcOQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"AVIb8RJZ/oJ9iWhFl9XUsnV7XcWt+XfB9GFic/fR5wxV8H7qojP/lv5XzgbrIwQnVQZLH9N4JPBggLb8+6/Qdw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"wrYWM9IYy/Dmj1N0ypx1stH6HfQLWuYHCe3BSQZHgj8+GQRrqgeqZOkQKjduYwRQYEgMlrBuO7FE4IFMrJr9hQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"ZP1ImQptvY3miZE/6k5C9kmeOYnN/b6akwy0MTq8WRhSwPX3jy6p9tsllawr71jVSmW6aJMuhLLhaOcRa9e5LQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"PaYfUI5ujZtgBPvbY6khkxoFWDOu416aGLPt68ZJM6ZPm6OX9sLv9MrO5m2ykEVMGMO8TVmQdADhT36sP6QTHQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"h7lnnRzLN6WMkfZHeckJrNE4KQeSvzxF4FIX4XmK2k9cg/Uptvw8jQ9bZ5Wxue/ta9PFCx+8fXMfpB69NvN8RA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"tLlXA4Ejh5l/w0rzjiuvXY954Pe3bo0vr6HsJj3NpTUTQL08dAHXgXwQL+yoHV4swg1xD37ND5eOMNx110TEPA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"42/KJRhkZOs8zxD0gIVHpgI4stTq48KyCpsx0Myr/G8U3b+HV7N3FXqfNgJnH38337UnOJYRHgejMtP6ukOVxQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","6","{\"message\":\"#instrumental #hiphop\",\"files\":[{\"fileName\":\"Ménilmontant.mp4\",\"url\":\"ipfs://bafybeihxtnpvrxwzepw4yff7a2xyuew7gy7cgtga4m7gtbdzxlqtnbavuu\",\"mimeType\":\"video/mp4\",\"size\":4356094,\"fileType\":\"video\",\"videoMetadata\":{\"duration\":0}}],\"gifs\":[],\"hashtags\":[\"#instrumental\",\"#hiphop\"],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-06-19T16:42:58.018Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyDlf14q7C2aBqar/Qryh6dVR9VACxVZV6fOaM3X5YEA"},"signature":"zVpNkIZUoiITAs/oRhskjUCmW15MRAqrjK0Z2ZHKJOYrBDS5Jhy1KO2+crPQjocuyXt98NydsUy6gCPoLgqdzw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"XQQC1wGBNWEegndmQziV5akkM4/IjK8+3jdSs/0PALoq9ZIRtzqEuL8EM0sHQQy39DIPbqH7tlWr1BPnzqNj6g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"EeUfVofFAKpvV8SJVKmAjaoab7hGrV4Wx2Y3N8EW8n56DG99pJ0HLrxFOlW7EU9gzBU9NrYHIu1FLs2TChNcOQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"AVIb8RJZ/oJ9iWhFl9XUsnV7XcWt+XfB9GFic/fR5wxV8H7qojP/lv5XzgbrIwQnVQZLH9N4JPBggLb8+6/Qdw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"wrYWM9IYy/Dmj1N0ypx1stH6HfQLWuYHCe3BSQZHgj8+GQRrqgeqZOkQKjduYwRQYEgMlrBuO7FE4IFMrJr9hQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"ZP1ImQptvY3miZE/6k5C9kmeOYnN/b6akwy0MTq8WRhSwPX3jy6p9tsllawr71jVSmW6aJMuhLLhaOcRa9e5LQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"PaYfUI5ujZtgBPvbY6khkxoFWDOu416aGLPt68ZJM6ZPm6OX9sLv9MrO5m2ykEVMGMO8TVmQdADhT36sP6QTHQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"h7lnnRzLN6WMkfZHeckJrNE4KQeSvzxF4FIX4XmK2k9cg/Uptvw8jQ9bZ5Wxue/ta9PFCx+8fXMfpB69NvN8RA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"tLlXA4Ejh5l/w0rzjiuvXY954Pe3bo0vr6HsJj3NpTUTQL08dAHXgXwQL+yoHV4swg1xD37ND5eOMNx110TEPA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"42/KJRhkZOs8zxD0gIVHpgI4stTq48KyCpsx0Myr/G8U3b+HV7N3FXqfNgJnH38337UnOJYRHgejMtP6ukOVxQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","6","{\"message\":\"#instrumental #hiphop\",\"files\":[{\"fileName\":\"Ménilmontant.mp4\",\"url\":\"ipfs://bafybeihxtnpvrxwzepw4yff7a2xyuew7gy7cgtga4m7gtbdzxlqtnbavuu\",\"mimeType\":\"video/mp4\",\"size\":4356094,\"fileType\":\"video\",\"videoMetadata\":{\"duration\":0}}],\"gifs\":[],\"hashtags\":[\"#instrumental\",\"#hiphop\"],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-06-19T16:42:58.018Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyDlf14q7C2aBqar/Qryh6dVR9VACxVZV6fOaM3X5YEA"},"signature":"zVpNkIZUoiITAs/oRhskjUCmW15MRAqrjK0Z2ZHKJOYrBDS5Jhy1KO2+crPQjocuyXt98NydsUy6gCPoLgqdzw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"XQQC1wGBNWEegndmQziV5akkM4/IjK8+3jdSs/0PALoq9ZIRtzqEuL8EM0sHQQy39DIPbqH7tlWr1BPnzqNj6g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"EeUfVofFAKpvV8SJVKmAjaoab7hGrV4Wx2Y3N8EW8n56DG99pJ0HLrxFOlW7EU9gzBU9NrYHIu1FLs2TChNcOQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"AVIb8RJZ/oJ9iWhFl9XUsnV7XcWt+XfB9GFic/fR5wxV8H7qojP/lv5XzgbrIwQnVQZLH9N4JPBggLb8+6/Qdw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"wrYWM9IYy/Dmj1N0ypx1stH6HfQLWuYHCe3BSQZHgj8+GQRrqgeqZOkQKjduYwRQYEgMlrBuO7FE4IFMrJr9hQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"ZP1ImQptvY3miZE/6k5C9kmeOYnN/b6akwy0MTq8WRhSwPX3jy6p9tsllawr71jVSmW6aJMuhLLhaOcRa9e5LQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"PaYfUI5ujZtgBPvbY6khkxoFWDOu416aGLPt68ZJM6ZPm6OX9sLv9MrO5m2ykEVMGMO8TVmQdADhT36sP6QTHQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"h7lnnRzLN6WMkfZHeckJrNE4KQeSvzxF4FIX4XmK2k9cg/Uptvw8jQ9bZ5Wxue/ta9PFCx+8fXMfpB69NvN8RA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"tLlXA4Ejh5l/w0rzjiuvXY954Pe3bo0vr6HsJj3NpTUTQL08dAHXgXwQL+yoHV4swg1xD37ND5eOMNx110TEPA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"42/KJRhkZOs8zxD0gIVHpgI4stTq48KyCpsx0Myr/G8U3b+HV7N3FXqfNgJnH38337UnOJYRHgejMtP6ukOVxQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","6","{\"message\":\"#instrumental #hiphop\",\"files\":[{\"fileName\":\"Ménilmontant.mp4\",\"url\":\"ipfs://bafybeihxtnpvrxwzepw4yff7a2xyuew7gy7cgtga4m7gtbdzxlqtnbavuu\",\"mimeType\":\"video/mp4\",\"size\":4356094,\"fileType\":\"video\",\"videoMetadata\":{\"duration\":0}}],\"gifs\":[],\"hashtags\":[\"#instrumental\",\"#hiphop\"],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-06-19T16:42:58.018Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyDlf14q7C2aBqar/Qryh6dVR9VACxVZV6fOaM3X5YEA"},"signature":"zVpNkIZUoiITAs/oRhskjUCmW15MRAqrjK0Z2ZHKJOYrBDS5Jhy1KO2+crPQjocuyXt98NydsUy6gCPoLgqdzw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"XQQC1wGBNWEegndmQziV5akkM4/IjK8+3jdSs/0PALoq9ZIRtzqEuL8EM0sHQQy39DIPbqH7tlWr1BPnzqNj6g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"EeUfVofFAKpvV8SJVKmAjaoab7hGrV4Wx2Y3N8EW8n56DG99pJ0HLrxFOlW7EU9gzBU9NrYHIu1FLs2TChNcOQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"AVIb8RJZ/oJ9iWhFl9XUsnV7XcWt+XfB9GFic/fR5wxV8H7qojP/lv5XzgbrIwQnVQZLH9N4JPBggLb8+6/Qdw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"wrYWM9IYy/Dmj1N0ypx1stH6HfQLWuYHCe3BSQZHgj8+GQRrqgeqZOkQKjduYwRQYEgMlrBuO7FE4IFMrJr9hQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"ZP1ImQptvY3miZE/6k5C9kmeOYnN/b6akwy0MTq8WRhSwPX3jy6p9tsllawr71jVSmW6aJMuhLLhaOcRa9e5LQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"PaYfUI5ujZtgBPvbY6khkxoFWDOu416aGLPt68ZJM6ZPm6OX9sLv9MrO5m2ykEVMGMO8TVmQdADhT36sP6QTHQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"h7lnnRzLN6WMkfZHeckJrNE4KQeSvzxF4FIX4XmK2k9cg/Uptvw8jQ9bZ5Wxue/ta9PFCx+8fXMfpB69NvN8RA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"tLlXA4Ejh5l/w0rzjiuvXY954Pe3bo0vr6HsJj3NpTUTQL08dAHXgXwQL+yoHV4swg1xD37ND5eOMNx110TEPA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"42/KJRhkZOs8zxD0gIVHpgI4stTq48KyCpsx0Myr/G8U3b+HV7N3FXqfNgJnH38337UnOJYRHgejMtP6ukOVxQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","6","{\"message\":\"#instrumental #hiphop\",\"files\":[{\"fileName\":\"Ménilmontant.mp4\",\"url\":\"ipfs://bafybeihxtnpvrxwzepw4yff7a2xyuew7gy7cgtga4m7gtbdzxlqtnbavuu\",\"mimeType\":\"video/mp4\",\"size\":4356094,\"fileType\":\"video\",\"videoMetadata\":{\"duration\":0}}],\"gifs\":[],\"hashtags\":[\"#instrumental\",\"#hiphop\"],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-06-19T16:42:58.018Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyDlf14q7C2aBqar/Qryh6dVR9VACxVZV6fOaM3X5YEA"},"signature":"zVpNkIZUoiITAs/oRhskjUCmW15MRAqrjK0Z2ZHKJOYrBDS5Jhy1KO2+crPQjocuyXt98NydsUy6gCPoLgqdzw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"XQQC1wGBNWEegndmQziV5akkM4/IjK8+3jdSs/0PALoq9ZIRtzqEuL8EM0sHQQy39DIPbqH7tlWr1BPnzqNj6g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"EeUfVofFAKpvV8SJVKmAjaoab7hGrV4Wx2Y3N8EW8n56DG99pJ0HLrxFOlW7EU9gzBU9NrYHIu1FLs2TChNcOQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"AVIb8RJZ/oJ9iWhFl9XUsnV7XcWt+XfB9GFic/fR5wxV8H7qojP/lv5XzgbrIwQnVQZLH9N4JPBggLb8+6/Qdw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"wrYWM9IYy/Dmj1N0ypx1stH6HfQLWuYHCe3BSQZHgj8+GQRrqgeqZOkQKjduYwRQYEgMlrBuO7FE4IFMrJr9hQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"ZP1ImQptvY3miZE/6k5C9kmeOYnN/b6akwy0MTq8WRhSwPX3jy6p9tsllawr71jVSmW6aJMuhLLhaOcRa9e5LQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"PaYfUI5ujZtgBPvbY6khkxoFWDOu416aGLPt68ZJM6ZPm6OX9sLv9MrO5m2ykEVMGMO8TVmQdADhT36sP6QTHQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"h7lnnRzLN6WMkfZHeckJrNE4KQeSvzxF4FIX4XmK2k9cg/Uptvw8jQ9bZ5Wxue/ta9PFCx+8fXMfpB69NvN8RA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"tLlXA4Ejh5l/w0rzjiuvXY954Pe3bo0vr6HsJj3NpTUTQL08dAHXgXwQL+yoHV4swg1xD37ND5eOMNx110TEPA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"42/KJRhkZOs8zxD0gIVHpgI4stTq48KyCpsx0Myr/G8U3b+HV7N3FXqfNgJnH38337UnOJYRHgejMtP6ukOVxQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","6","{\"message\":\"#instrumental #hiphop\",\"files\":[{\"fileName\":\"Ménilmontant.mp4\",\"url\":\"ipfs://bafybeihxtnpvrxwzepw4yff7a2xyuew7gy7cgtga4m7gtbdzxlqtnbavuu\",\"mimeType\":\"video/mp4\",\"size\":4356094,\"fileType\":\"video\",\"videoMetadata\":{\"duration\":0}}],\"gifs\":[],\"hashtags\":[\"#instrumental\",\"#hiphop\"],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-06-19T16:42:58.018Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyDlf14q7C2aBqar/Qryh6dVR9VACxVZV6fOaM3X5YEA"},"signature":"zVpNkIZUoiITAs/oRhskjUCmW15MRAqrjK0Z2ZHKJOYrBDS5Jhy1KO2+crPQjocuyXt98NydsUy6gCPoLgqdzw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"XQQC1wGBNWEegndmQziV5akkM4/IjK8+3jdSs/0PALoq9ZIRtzqEuL8EM0sHQQy39DIPbqH7tlWr1BPnzqNj6g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1qsfyuwvcxxlduzzp4nts8u7cjw9y2r0d32ynrv","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"T1mN+5sgv6KcQZN14qih1Iij8HMAA5Pbc+znYZP4xWwb7T1TwerO7PfDPzUOjmNT1X2M5gW7NufvlCPdH9uRDw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"YJ0f3nXURfgxtxM0i7EpOUwiIqoeKux9kOgUG8Nuvas3EGlQxTH4j7I+WbQHS8Hg4eT7Kb9ni0R6S+OA2Qa33g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"lB+xfY/PjWdwsK94G9gyDsim8EoDZJrXs2Lj77uZzo4dOSeIpvq3+wGmhT4lSw/+K3a/rZQ4CodP+Xf3lN0iXA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/counter/e/hello","func":"Increment","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"eXYqM5iShUP4ArnfO/pL2Ny+drx7qUYx4sljTGK/cB5q+hh2i29fcr4l7bNXBvjmYabpvtrKhkBYJr1GG61djQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/counter/e/hello","func":"Increment","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"5mRK42ExSOidArq4uJqA/7JlG13q6H8qbaq2EJAuMsoo2SSxDK2hqtYu80ErY6F/ERjN/PGJc+24vdn1mrcEgg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"50000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"hOhpB5t3A1kL+DVyQlbn1TnwnXbYK+1/b0Fm8gsujMUWmR47kuvsFnwVGRYzJWUD1iOzFoGsNFfbffXPU3huZA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"IhIqbkSiIOeMRnEPpZduC9HkuZ4Q8SSu0SxzCZqTWBl1zW66piR2aDD5OtMx1vUTKAMlsKYbMesBXr6IZ4hVXg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"QM2trJ5tHSHbNR1INfJRkcd7LaTCVbrMz4Jx8CLGsMJs76wPp1Rh1lPpG6JvvCW7wKrl0S3UUa3VGL67iaDlBA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"taqCpF5EHGOIikfbXxoRCapZRUriJX0xzR6f2dm9OiVst6bPiZ73CZXOtEgwWeibx15fbYjlsMHuPh/QNM+lbA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"5afA4hdTx20r+hrbz+vq4qrUmNmAvAZCuM5qJ9KDDhYxbUJRqzDo6HjjyfTZpVvTNRoHoR6oa+Y2T+gkWnlv1w=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"FaWL8p3woIK99NT5PgZYH7wKtJo3FtsDY0J/QHg0SNwC5QIPgtakdzo8qPCOuVbEE/7l2f7tVE00JIAk8rCJzQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1qzlkrh09zr829x9vxfw8z9055d8w9qylrjf7cf","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"+XBprHQTXro79e+8ree0ewQ4zsUnJzIKklNC1893lFwRR34S/BcJ9uYBqvWi+RgJgHSYagKqQsbpFoO85T5QEQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1qzlkrh09zr829x9vxfw8z9055d8w9qylrjf7cf","send":"","pkg_path":"gno.land/r/demo/userbook","func":"SignUp","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A0pBexaipBxwF6uvku1AkhDG7w1ysg6meq0p++aYNREO"},"signature":"qvKYly0IEj+dHJSEfMDf6dLFTzmbP9rFWijJJyObYERyrtIouMZP0rwCUzVi4lTwaBFwLsEPSvLbGKo4cm2A+g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g18lj5pgadp3y98wawweavle2r0677w9z25zmnm0","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7F3+SG0EvfD9EoMgxL8VSOFIb+XlP7eI0SIbyQYrAmF"},"signature":"7WL0z02+NOZTyEdMlPyOA3foVyCj9YfBkOO2gIkqPeYboaXz0QBEmmT258c+zJC0WgsRUKHVGWLl8+JDJDdvug=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10y2y4l4g7cx23tkl9jy5u638lw5aykvx7upqaz","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"JgzzfyRAuS0FTS4qM490TRRh+sUnhlam2//qhmc8l7AqlF2DKYSJigXIb9pMlARrW5MYH9+xvb+vxSbKv1SMaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lq8cn8kftq0q9ttvnnpy9ye043vca70n3akme3","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A2cKzqJ7VkOg7PmRUDe0vzont6FEI9hXTelHGRu9ZEsS"},"signature":"Mgf8gUC0WQo9AwrL6GnSnh7P1uoSOUZ+LIrktrQauqNOe3onCcH39ZG1gs155HoLHZwYZgpDfUIIVRVghwrhbw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"9000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"AzuU1VIMe06xRahl8fhTHLDTzQni77pwJGEQNeh5334zvm+DkSGbT4C30mdKInl53W8vJ7og0oSpq30q9ZD0eA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"O3z75uSc5k7lCV/yU6hiAP5yFBv9RBXMYIHdrMTnwBFrmFxO94BxCeVYPQMCSAWdwVgud2NAd94WAXodaiH9GA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"BaIWyXv7m6Ea+rMkRXvHdST/oRyVjcDKkRj89g50G1oC98N/+8y2WrZmRFj/FLA37GSJxZcHOpxY5vlGZbO5/w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1xyx283r3tfrcnszzhkccwuq7rgjplywvq8653w","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AHKC2K/+AsviaiKH/UYImPVccjq6168ttiRthxSiVBdMW6YKmUMQgpel8X+Pkuu9LTt4C3SSEF9+2eulblUneQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g159d4pl8wvwynpuhe7rl85z77pptq5xjrqk7ses","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"PfMPOVf2+1J480zHdKkGyW16SjNsA+BJB8/Rq2K1Qa4SDt8gEyGrqgL08Iq7D0z8h9HUIh+7zgZXlyJY4rRFYQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g159d4pl8wvwynpuhe7rl85z77pptq5xjrqk7ses","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"2mGYhqzM7iRdUeRno31wtc/3XZy4umlExC7d/7EC9/wE36Lh9fGSMdrEAIZoAQiesmtySLkJZscpx0NhyUjLnQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g159d4pl8wvwynpuhe7rl85z77pptq5xjrqk7ses","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"zlh/3+F2MCE7xgohEdYyBByLWefurU6gp2v/DXVZwAEMhGIlR1X1QlkgAjPacRHW5Ens/uQUIAUOzlz90YXqKw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g159d4pl8wvwynpuhe7rl85z77pptq5xjrqk7ses","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0mBbm/i6ZWyvTpdkSP29VlJXMG5wL8d79lyDAH+pzBQLUt7nRDYASJbC8t65YyxeJEs7TZwsYqCX/O9uQl9e7Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1lafcru2z2qelxr33gm4znqshmpur6l9sl3g2aw","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"TZX/V96zNsrtdxQb1DIP1hDfQq2TXZdaN+VrcRBqsuZgqG3T7yLhhZz6Z6RqCIO+Y0X+RHMmoBe0vs6bThfwug=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1qzlkrh09zr829x9vxfw8z9055d8w9qylrjf7cf","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Nmsm2iAugDXuCaA2jwZv1h/vYE+zmC0ax/ZnQUWH79M6hKN9xrotP+GxfnfuuKnYKx0DYH9InPjYQ/4d2ezNxw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g150ggdg2yrdhwmk3nmt6780002xt5xgst2zndg4","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8rjFF0UU9bHG6LPY3U9Oz+E9wa6zqIKSViQl9+qFqXxroi3tfn8e3GbbwrLqasxnxdXsvR7tPjiimXNZsiI9+Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g150ggdg2yrdhwmk3nmt6780002xt5xgst2zndg4","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4I1oXH8sCHp8Fo2yft/sUrNjjpsbrJqA4PpuLBCJ9cM"},"signature":"aUjZMhxQlz/Pj4xFvhinSIepu1rFzOTZbgA+nBbkTlkGYFyoYbMvXZTVQFD4ODvA/cRXgzAZGZSHhOWZoqOVkw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1rqgeem430ex2cns42azg3vajvuva92c4gthd7l","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"Q1045fT3HuxDbt9Pfj79WClodJSTODatE/sePKvu+3FEWFuzXUwCoc10nOr3+NnhYeqAHJ9wVOoitltWEazyiw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1rqgeem430ex2cns42azg3vajvuva92c4gthd7l","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Aj6P/iW8JB4gYe86KrzR9Uzejv9iNpcNndMBMg4lLuFp"},"signature":"gkJWOTThvaxO0kDy0WDNUrHzFH4dwyBhicEgK7+2jGJWFrUTWL952kDiSIdvWfmcyAYuZQkMKR4gXQH1NJ1niA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1rqgeem430ex2cns42azg3vajvuva92c4gthd7l","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Aj6P/iW8JB4gYe86KrzR9Uzejv9iNpcNndMBMg4lLuFp"},"signature":"hj6hHRaikor8MYrN+duVmSNGzoj4jy1h4oZBeXG95N0/3990ugkda6242Ya7WoVXS5FdRu6enOFaHqWxpwlJ8A=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1rqgeem430ex2cns42azg3vajvuva92c4gthd7l","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Aj6P/iW8JB4gYe86KrzR9Uzejv9iNpcNndMBMg4lLuFp"},"signature":"Lvv2CrHLRcPab/3qhQ6Jzwv6yCy2/i+XA6UZrqfumB5Y1ZlJxn/caiiAlZdFKbMJ4OoZN3lD3+paM6+rAP6v9w=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1rqgeem430ex2cns42azg3vajvuva92c4gthd7l","send":"","pkg_path":"gno.land/r/reza/rezablog","func":"GetBlogs","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Aj6P/iW8JB4gYe86KrzR9Uzejv9iNpcNndMBMg4lLuFp"},"signature":"2MQtJCoij33ncr1NNCkMwt4NHZ1m/ROcq83v2JmhiT5E9Tl/dyI1CpzLJ53M7Glu50NfmNAzm1wUW1jHBi58CA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1rqgeem430ex2cns42azg3vajvuva92c4gthd7l","send":"","pkg_path":"gno.land/r/reza/rezablog","func":"GetBlogs","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Aj6P/iW8JB4gYe86KrzR9Uzejv9iNpcNndMBMg4lLuFp"},"signature":"YzIFfabR19agmpP78kDQ+BY1YKUhvyVfX+NT5RHBWVAy3IJnlOoKP6OBtWgnVtD42KyoQG5ctZufTkZ6KNmeEA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1rqgeem430ex2cns42azg3vajvuva92c4gthd7l","send":"","pkg_path":"gno.land/r/reza/rezablog","func":"AddBlog","args":["Mon blog"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Aj6P/iW8JB4gYe86KrzR9Uzejv9iNpcNndMBMg4lLuFp"},"signature":"W6N1Ag/dpfUNnGg5XLmw8fC08/5TbWAs1Q/2DegWhkV4WXqNQgA2IZ/IZ0WNVlcoQeTrdQKFrEHQWJeIHaJcuQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1rqgeem430ex2cns42azg3vajvuva92c4gthd7l","send":"","pkg_path":"gno.land/r/reza/rezablog","func":"GetBlogs","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Aj6P/iW8JB4gYe86KrzR9Uzejv9iNpcNndMBMg4lLuFp"},"signature":"2gCA46NI6ttsVrFKUW5rz4mXlyflSq4tbw8US0/PTe5OsSDj1qduk3rP65W9UB3teyLjwfV09guBzDqbJ0mKOg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1rqgeem430ex2cns42azg3vajvuva92c4gthd7l","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Aj6P/iW8JB4gYe86KrzR9Uzejv9iNpcNndMBMg4lLuFp"},"signature":"GqKgMCv1ajP0xphDVPUWaguFD/VsNt5kFK67JHIMqWl+8Q5wwLIDMNPW0EE5owToXskfhbSA9tfMWyyOZWVe5g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1rqgeem430ex2cns42azg3vajvuva92c4gthd7l","send":"","pkg_path":"gno.land/r/demo/memeland","func":"PostMeme","args":["data:image/jpeg;base64,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","1719157058"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Aj6P/iW8JB4gYe86KrzR9Uzejv9iNpcNndMBMg4lLuFp"},"signature":"QMWnWyXs5EgwBuLMI1PGaFleZU0Q/ktRYyuCrhs3C+RvbjcIOwOGsL7ocEFwWpkEhwbR992qEljl/f/PdR3C0g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"uj4urOli8FzkzEytNoLzdOC1NA8UVvJKvFE/zPaXp1wAXDKG0/M/tYcuhhcTMY36NtbR/+0sttXc+Ps/vN+hDg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1xmugg9x4ynp8uuglc5t67jggefp48whmp38k8n","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"c/LYA+PHibPuH8vQ5jmOUvM3cCIXUF5l7SFyZwtYXMs44QVE5BDw3EHGIebqyaPu5GmfbO6giNFqEmk6//X3Pw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1pfstv3zz4swue9sjey74m7aqfn6m4lasknaucp","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"m8Q3RVN0qzknfcpPP99SlCzdEPFa6wY+4P09rfa77mNUAfv0d/LcFjcuAE/PwuCw4auVUiViqCJFqXdi+5oncw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1pfstv3zz4swue9sjey74m7aqfn6m4lasknaucp","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A9nAbI3MdXqc9K2IjzIo6y1x0azNf7rqSGemhYSMiHqd"},"signature":"FKsRwiVKkiit/M30V3krUzH2UPA2VxnOTkA97fdD2s1QrKuA09y2u4ULGW2O6P9f1RangXDE9oBPFI1tAhULEQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1pfstv3zz4swue9sjey74m7aqfn6m4lasknaucp","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A9nAbI3MdXqc9K2IjzIo6y1x0azNf7rqSGemhYSMiHqd"},"signature":"W/dtK99L/aiZ9FreQuvpwcX+NWLEldZXN0XsfXvGve5UKVwnA7sGAtwvEP6uQz8RRIiXP0xJk0SXSqbhM97q8g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1pfstv3zz4swue9sjey74m7aqfn6m4lasknaucp","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A9nAbI3MdXqc9K2IjzIo6y1x0azNf7rqSGemhYSMiHqd"},"signature":"uZyJXXfxJcur4J2yrs3Us3TgfDPqPKbKKsiGVIe3LdNQprOitBTYtmRor30bGJ2Yt6CX3OvRvF6UBtTWqTd1/w=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1pfstv3zz4swue9sjey74m7aqfn6m4lasknaucp","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A9nAbI3MdXqc9K2IjzIo6y1x0azNf7rqSGemhYSMiHqd"},"signature":"HBv7JFpRVQQdDYX7gfA+jqMa8e38+uA9cBlr8/Qz3t9dD4FrhUxzWh6YouCYLIrWAwECdFQklA2knJLGc/lMsg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1pfstv3zz4swue9sjey74m7aqfn6m4lasknaucp","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A9nAbI3MdXqc9K2IjzIo6y1x0azNf7rqSGemhYSMiHqd"},"signature":"8mTgUeMCwpdodg9+lZFAp7oBLJRrRwwnhJyO9Y+SLJp6PLQAMKcSxMD4RbSCMf47kK9ZCEZ1frc9yskArDqa7A=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1pfstv3zz4swue9sjey74m7aqfn6m4lasknaucp","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A9nAbI3MdXqc9K2IjzIo6y1x0azNf7rqSGemhYSMiHqd"},"signature":"DqVVzYs7ycD2Oirf5x51Z2Itj2Kwl6ovKCOoB+3K7etRAcCGTET3Hj4qXBRlLq3uAwVjBF+qAwm3j/sxwh9eFg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1pfstv3zz4swue9sjey74m7aqfn6m4lasknaucp","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A9nAbI3MdXqc9K2IjzIo6y1x0azNf7rqSGemhYSMiHqd"},"signature":"IOxVjHVy9k49SeZndeSmmrv6xbf2BJVLZicfQbyncQpGzBleoAKTIMTHyLbZP3syG0obJrcSwXWiowRmdBrMQg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1z6ykhrvel4nu49ugyf7e0at89u86cf9d6h0ucr","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"tMiHZrSP89QyUfIKOM2reSaOxySdBR+bTgyMkuZ9yjY6V+ln/rYXaNJU3VwxM3w4kD6hCL+atIIS2Rk9NHTldw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1z6ykhrvel4nu49ugyf7e0at89u86cf9d6h0ucr","to_address":"g1xmugg9x4ynp8uuglc5t67jggefp48whmp38k8n","amount":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A69adeCx0THa0JqmUTyGXGtZfGECxsTY90VuO3Kgxshp"},"signature":"Ryg/pZDPUhYGGqYcJanK2os9+2EoaRklx9ELkP0zKj9pSqLWw5qOgRKtNU/pefRxWesyCreHHX+/hqSqree73Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1z6ykhrvel4nu49ugyf7e0at89u86cf9d6h0ucr","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A69adeCx0THa0JqmUTyGXGtZfGECxsTY90VuO3Kgxshp"},"signature":"qG4R2B6QO1ZwMaKdm7w5UOyUg7e1oZtJvQiYc6TYdrVfxOOiBIT/bHTrmNJubbcMATZLp9vmhC9eDPa2ol21ag=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1z6ykhrvel4nu49ugyf7e0at89u86cf9d6h0ucr","to_address":"g1xmugg9x4ynp8uuglc5t67jggefp48whmp38k8n","amount":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A69adeCx0THa0JqmUTyGXGtZfGECxsTY90VuO3Kgxshp"},"signature":"FuEzaKFDQM+TMLe0UX0FAxIRJnH+L9CHZlXSIhQQgld8JMMg/te8VdDozmkyfvCHhEl1l5k249TXVG1nr2iD5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/varmeta/vmt721","func":"Mint","args":["",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"/YzdgC5uxJ9XNNCJMNpxwKIyE5M1juXzbZhfOBF4L5FfCB2tAMzg2CBoD1t9tEnzsPHiT60tWVlgp/ZzmyM7LQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/varmeta/vmt721","func":"Mint","args":["g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"9v85YgiKt3rbIM5BhcPEfbfCYN4MiqEr+3IjBdS8qfcYCgCmrr/Qc1FnVDSecJ5NPdG+OO0qGiupabxLBP+KzA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/varmeta/vmt721","func":"Mint","args":["g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","1"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"Ub4I6dqOoLEHhEFUNPWmE+MwS0//PQ+ZNEBz7ngrXbd9DjANk+mYyoXAUHKHOTle3SZ8loSHdvwdHIL8rZEWbw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/varmeta/vmt721","func":"Mint","args":["g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","1"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"voWdRSBjSkqrTile9roYk9St6LW4Ni4u8Y+2dxXTd1NsWHz8fIV4U240g/vvCrvzV0qNwvNWb6LNoMFRzgiBOA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/varmeta/vmt721","func":"Mint","args":["g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","1"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"vNh/cgBKacpCx4QTImav44RCFGWl/PBe72MOGKWrJt5di+tw3GLGkDkf1x3gvRyvrjuZSNKsqKmnarIKLOw8Tw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/varmeta/vmt721","func":"Mint","args":["g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","12"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"ZdJgdP2uHv7mCMzOV5zCIoLPrKPD/N84+NHfY5bARt08Un1Y63H0qIU+LmMOgr/AUxINL7hJVLhyKzbt+ikLUA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/varmeta/vmt721","func":"Mint","args":["g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","101010"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"ntGhcLXu6dJKnG2ul27CeV7WujiMjHpGI4J/O5b9ueIyFco324iUaCxvR2tmeRaHoqU7bPF2xlh50uo/kRFwFQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"MDjCOsTugjU3JBPFQTGP7Pl6g/M4IeuEUkx8mijULzozlO1fYiP2JFbaosYBnxeQeoV5+G0UfPp+8zrAyx1TOg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"2000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"/wb6OADfx13NpxvYdh1StZk3PqFuMLVi5FXGK/zQTAQPzmFmkXsYMz81UV1R/pqWD29SYMIUoK1rAFiEmsN3qg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"6sLiCz8mGFNx8FL6TxuoGhwTjxg9FnuKASZxXoOhqwkfjIPsrYIAK4c+RlUOF3Ti9wJ5OijNaLr0tcmvc99TBA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"IT5SCDm0vBSwesamorvq1s6bnBKjZUhhFzog8byw13U13o3+nsfRUFxtQm3jnZa0u5DXA6sArgfK2Us3zn5lkA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"UCqCfgY2l0VJk0alN2NlXvx24OMLfsnPM+te9rIAxFQf7p3Rv7aMZ18XW2fm/MtzTO7H0qYsG8ssQ8JkVixUfg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"rOKWQ0ZMuvletkhmoq1PW4epfWb1YqNtO8QNdIXYH91ZPWq1b3TFdkTMb+vvnA44N0O7Pxw05NGFkIu0Wodmxw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g15m526qur3ggut82vk0q5za6jzg4eaaclgfh2mx","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"W2ImRccVFJXeiX/A0d0kizuuSykVIVr5Amo1de77y/x9UeSmFnaT6Erlb9IPRP7jFnCFtM7UHJubsgSqlUfK3w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g15m526qur3ggut82vk0q5za6jzg4eaaclgfh2mx","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6w0mVQt5kN6HMSUAhIX1NBQqQNIROl4WnIU/JbaKqcv"},"signature":"ZrDqhbMx2A29vSLRt16J7L6nDaLpQ5gi8wsvrQAxwsYcZ5olWkybOEJbfkBOQZUI8rKoIm6G9CpR8CaXkqPLTg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g15m526qur3ggut82vk0q5za6jzg4eaaclgfh2mx","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6w0mVQt5kN6HMSUAhIX1NBQqQNIROl4WnIU/JbaKqcv"},"signature":"ncJJ1JmwnyREhUbPSyi3s29OnjEKn8Ho3iEdgT98iuAjCMZJELJW4JYkBSL4qHM2nhZONWv6SI6pwQ+IGf2xzg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"T7XJMPWyv8Mb4MNelvfpyrs2FXv5L/5jBJOCBg4MA0EZnnDtWaARIqN09eBGFq5Z8xanFv/MfBEnlOeg6GHvGA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"12000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"bcvi9Z8KjUgagUjOh1nAA06Ppne4RKGoGZrtc2U0KQpOUAIny6pRvw1PLgwsy4XB5p/KBHXLV1peEmSNYIYc6A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","amount":"4000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"U9rZIhYk4krjaCuSOfG+diWg8uP5csd8sDY8/8kseqg03HvNdWX5SHRL55pNFKypKz4Otwe9tpImcanWhFpKqQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","amount":"12000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"sqcz2NTeJ9fdX72SpwzGRS2TyF2+3zpJvoDnRfGsVIt+3O3haRFJOuaEY6c7+tg643+/NlbuyQb7PqtJP52qMQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g122n67es9vzs0rmharsggfr4sdkd45aysnuzf7m","amount":"500000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"KyBsJEssCzvO2N0nSE5mwYX7+PS100PX2N5iApa07mAQK96OqcVZvYfngh3+hn5Oa8wmGvUVUO5siKnQu3zFlw=="}],"memo":"12313"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/gophercon/mood","func":"ChangeMyMood","args":["one"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"GYBF9a1ELyLu3t3oY7zHIgUt9GJHMYxSthsh1LJ5POs0JIm9ekMCse4IHGuFBz9iVmI923u9XtLUtsFesdSbAw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","package":{"name":"","path":"gno.land/r/g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5/run","files":null}}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"sCzyYpa31KhU6cUa8pe4M8d37iLh2Z14Tg8phVD2DM1DzavuVmIAWiz4m4LR49uNO6Y56NjwyynUYapHo+K4Hg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","2","{\"message\":\"test\",\"files\":[],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-06-29T16:07:10.041Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"Vup9KOgZrEXwXnjEXOtrbjsZgOhSvNlRg4O6etDMAiYVFP2PDGQpRvv8F/MDgI/9/ZefnM+bHr2WR7TF8HXZqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","2","{\"message\":\"test\",\"files\":[],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-06-29T16:08:54.560Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"r6KCT9sQ+kZPoQjD1EbuMkTUpm8W/kocJOG1ZXFuodF/VdvreGup9L2gQj+u1NYUYHRbMniSrpjx2K1hnGjf6g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","2","{\"message\":\"test\",\"files\":[],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-06-29T16:11:05.552Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"GCKeT2pAHi8X2YEJxCNRgIiDSBSY3Weo44A+tSItb/YQrjHU29gYmtdf6yAsTnZhYMWBBQa7qlVT1/2ngYHOWQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","2","{\"message\":\"hello \",\"files\":[],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-06-29T16:23:05.902Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"gBMXcgAiFt9iAGK2kCHshVFr/AAZvRVNvqVYbLfGVvRB49ECQtmfVFWsgzU0ySI4AfF8jv91nzATBVwbAmZxxQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","2","{\"message\":\"hello \",\"files\":[],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-06-29T16:28:08.496Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"s1MwpabSiPShUguiFD516vaUaXx3L4BEiPADxVlTL4cs7WB9pAzWwWVGGh5zalxbPcArwyHn7MWMvc8QMsgDeA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","2","{\"message\":\"hello \",\"files\":[],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-06-29T16:29:11.750Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"AQcI5X9UT8yX7Xp9XcQJDGM0BhN2GfRvuZ2Gv63ORS9ek7/gHeqtaMJ4MyZzaunsQnHIzXaD9eGvJCZnUujN1Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","2","{\"message\":\"test\",\"files\":[],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-06-29T16:37:25.119Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"ikH2VpBGN1Yj1tM5xyJl2NPbMp3ey6wgrxTh9nidujgOCKAXgGF/RTAFbFMADyy7qtTpYN3Nnm3euvFxKjiQ/w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","2","{\"message\":\"test\",\"files\":[],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-06-29T16:38:59.637Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"voqMwupoP9ifxuE+Y0ZiE7o447ItSfFWxmIGqfS+SHVaDX4X/CjxresB32tVLY5kUccUzaHqHkatNjiqR1t/vQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"50000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"W6mcRCdZH0HZAMHz1lFXTO6ULRRhTWROJX0CYWvBUBkmJCMPLi0GmuEyJiUUg6RTgaE98Yzku6v/bjy/Zxk10A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"50000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"G0c9nEZxgY2Evf0kUGDTo2SAK0yHGqnZTZ7b4ggp0y04mgyKkwQVtiENjZ2O6SAca6hJcntZALckD5WiprL0wQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"50000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"zNX4oT+53ewKMK1En3u7zU8oIcKWE/oV1KC/iKnK66Y8KjrygMOKE2SY15MsK//1/H2VR95omFJOtSv2Y3vAWA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"50000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"2z5beebRUvsBZN0AGfm5SslzHZxlXIWfuoZedSynV3t/kXaws3gj4NxovKoW8ShR8zb39ZnKSQjjO3W/hvmD9w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"50000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"/cimtNjjEcpDw/ip8oZobLKjp06drH1ueq0UvdGW4+BAlHci0kZcrE4l0mPBgvTyUb9tY5OKSfH8YlXe1YTwKg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"50000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"rUwWkdtcM0LjqBJwHrKK/tSpxKKxtm9SPgRsFNgqMe0WzZBCO24gIlv2EG8DIqqA0o6MCf/qRfBRZWgtrN6l8A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreateFeed","args":["teritori"]}],"fee":{"gas_wanted":"3000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"TtAk7fC+SFANgUtzYx9Dqp3ZsdjUnl3vkJ71uk0cSqcMsYBE+MJq7BLIBPKQ1T0aNtRF/qL1mXJGLmK8u0J9Og=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","2","{\"message\":\"test\",\"files\":[],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-06-29T18:49:25.531Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"bn+ajkSIl7UQFkd6/hJXH8u2lS6TFu986DRuNG7b2tgOUGx3E2YNj5odrs4q2rxyaCdgHtZIKruCrG1v5dXr3Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","2","{\"message\":\"test\",\"files\":[],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-06-29T18:50:14.071Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"k1qKhyRZTxryXAobIrCxOMN7X3u1p0TLCO4dLw1eatR5Jl03Ow+gNRjAHd6pL2X1k4n/xI2gJKv37T0rElYLtA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","gnoport-2","😀","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"QrJxnJ92se7peXloEOf7/Y4MNqBetZFV9HWdr/1iRMZ2i65IETEcdTI7RzPDuY+E5UrzPnEkFfcRgZbuSyHvEw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","gnoport-2","😀","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"AvYh/Czovxt0HTrMmJYpYv0C2PN3rVYpNtRkpxTQeO4ubkbPvjsJln63fqkFMn6c/q3NWqZD60XwFxdUDCFHBw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","gnoport-2","😄","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"shl/DVVaxsWsIWVuLBadT6reSgZQ6I/CHPHlFtAu2ZxuU2FuIM9VdURwScV0dTIVSLBgExDTLH0IbsVp7i6akg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","gnoport-2","😀","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"7MDjWi+3yTKxUegr0rS1yjHBiBZ4Yk156+qY2GFj7sxOf/o8c5OfuJaVYFdm/6M3zvM0MCUIEkCypGklS+eUew=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","2","{\"message\":\"here\",\"files\":[],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-06-29T18:53:17.214Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"DZnFaKgQQKkEJZfMQtRAoEgfjndDz3IpSEu3eeChIt0mtyQNYkRKQZRunGf5hS/7CMpJBMiSFXsrrEZx1hbl0A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","gnoport-1","😀","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"Kyi8DPhwcLmLUNVvVyzmwoeCiLidGQwaUeyIniTC2qZ1LVJ7yqquAlvIwfcsfRz9IRmGRNs8LKAI9N/07Y8UMw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","gnoport-3","😀","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"yRIBOQNGufOeha1NMFisFU724kuItC5RxjGOfdghudNCqdFeTfeiS1g9jg2DKgKdkyQXmyOFDSw85eslvHqtig=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g19y8hwqwp43ena79yg95nv6nfzhmyn90zcvx0u8","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"DyRVjwfO4r4QQ8F684Gr32ml8kcM+u0dXu2SJRHw9gJh67HMX4onaEmoU3P1VYHu8ZWKHky/uUayjcEg9kNZ+Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g19y8hwqwp43ena79yg95nv6nfzhmyn90zcvx0u8","to_address":"g19y8hwqwp43ena79yg95nv6nfzhmyn90zcvx0u8","amount":"4000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A9ABK1ikjJNzBdE6cNiD+2r/OW6a7KdUm6Xu0+4H0gdl"},"signature":"d6TgGXKx2/FtgDzMqGKa2S0E+KqjkNM61y7kZXAYJo4OtPhxVYt97Cf/4EygqpTheq1hPcLVwLYyLPQHpkAUzw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g19y8hwqwp43ena79yg95nv6nfzhmyn90zcvx0u8","to_address":"g19y8hwqwp43ena79yg95nv6nfzhmyn90zcvx0u8","amount":"3000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A9ABK1ikjJNzBdE6cNiD+2r/OW6a7KdUm6Xu0+4H0gdl"},"signature":"GPRvJ3dDwcNgZGxzvlcDjqKJZrVDTj0eFx9vrTqR7zgbiwwDPXLoYmYgghVb5s0U6CxSZfoDZ7F0IriYvetDXQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","gnoport-3","😀","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"mtt1RaudDT2EhojNeHJRsBooxm6rbPzt4gYP0pOH38MjIkhRttKFSP+fyDvoOMClFmggM5Legqg5RHw/qb6xPA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","2","{\"message\":\"test\",\"files\":[],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-06-30T17:42:25.633Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"zzIxS7Sk2nncg6tulI7cWeL1jbkIWvQgMSeMhWY5tBIZuscoAycmbl1JZIfz8AERZOukhMEF1CFxKX3RttgmPQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","2","{\"message\":\"test\",\"files\":[],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-06-30T17:46:09.531Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"XpC+H7ikokwwk4kr7c3k3JkZMFQpJEsalV38Gepdv2EhB0oDKc4GfRsmQBKGwMA/MKZ1PJxoJtZGgR6exE9Fvw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","gnoport-5","😀","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"UAmD0q6xNXXJX1ADmiGST6wlNIR8U+I8p9sMQeBU6IA95RGn+YAEdm7CeBrZfUmu48vD6kgehFeeNS04sL7dqA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","gnoport-5","😃","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"4UDtqaZrS0njwQebeF8rBzg3WHW7porEN66YHE47yXMI1aoVvi5Gr3zB47uNP8ujl1ARs5JIh9yKOQjx1nUE2A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","gnoport-5","😀","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"OruB2wMgzkPrZlGUDSs142Wn2VSxWaOfyj8JQwNSYgcwrXNjFngII6B+xfel9DLB52C7zxtv2bTqZmEcYAmzvQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","","😀","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"vo0NM6KLaU70iEJnJ7m0/B8qr401P/U1h9zGfDRduXVkYqoVmyiFMH82/pGJDbGQXgguPsQJmHR20PTZF6mKmg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","","😃","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"s2gC7ya2+1Whug4eORUp4KT3BPF3g1O1gApD+1eV5h0uw8yOyWeX7sAN8+w0UkCcCMu7uIiIWX0/JI5+YOQZKA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","5","😃","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"dvkSjwcIDHhhnFz5sjScsPTr4J00jw+BMjd3Q8DT1mdfSItLyP0m8lmQ0mMhvtst0r/hJthsThx5Ojmikg3gIA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","5","😃","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"oL8EcWmdN/anINj9QjVeZOgLesOLOx2+Ja8jo5LX2MhkrWWJCEqEkFayuBqTy5OI0JhZFKFxlfWPmN2cZFqhGg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","5","😂","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"iJLK1Rq4W1WpXtM3Ra3GxuBtpYNg8Gz3mmyQcoxAzHsNDzLXdRfiw36/lGtQY8gpNgUaPELFJG2OGB5ejELfNA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","5","😁","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"YMDg6y7mu3OabITtG++oIEnQYqbDEMoR903j368yqSgX4SSE1IqfzNyTxawB51iX5diB77TlQQbjjpTtjfMf6A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","5","🙂","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"xy6IDwX0OF60wO4ivP7mA/do5fWe4KyVC8Dnm9GruFF0c6Vnv1lf0N0VvCxLxT8roqPh9w1oIgPDp6YE+uu/gQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","2","{\"message\":\"test\",\"files\":[],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-06-30T18:11:01.557Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"GmDzcOqCID9shf223SCI/sAA5jtZUZsZUD865eRy6EU/oJFbekcSk5Tmf75nCL0Z0gtiOhWUoNdfPcv+v17zVg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","2","{\"message\":\"@g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj test\",\"files\":[],\"gifs\":[],\"hashtags\":[],\"mentions\":[\"@g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj\"],\"title\":\"\",\"createdAt\":\"2024-06-30T18:11:58.976Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"bjmF82ASAtkJEwtLNc2pTV/gscA+lbicC+QE30MlmB96MrZ/zwsO1wqO3NW6QMZS+9kKFyrDXNyKl53S93H7fw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","6","🥲","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"bUuIFk44u+GmUijTceQQexX3mEEPZZQ3LGTHvTMySZwmfELyDLiNlJH3ga3IB/ed/H2h8gK/8aeCTvUWIWD0Sw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","6","🥲","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"TbPnvV6WNeFgUh+azKU6TyzDk//oJftM29en7lEvmtln1G4oe3jpFKd2YgW+BKQf9D5zhJYR1auqiVa1fTBaqw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","7","😀","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"VXloF5kPeuWT8rKXiOkYUqpkcdQ5BUBTheWAy6k0s089OWoPWlwts6/eRL06FI43F/2QZA+eMkqDXY34i4b5uw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","2","{\"message\":\"here\",\"files\":[],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-06-30T18:41:41.585Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"zu5AvsGnCTVEUt7AKUl65Itb7ooyX1cVZAhcR5LZe1tNH8rd/mmWGITbGk8B5g3oRN0H+h0+yYieXDdsnDlccw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","8","😃","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"qVs13wR01k1Vy1kAJ9apyula51Le4dhHvjrtkwWNtqYhynlXW25/jOOoyn1MTvmHXznndacWr5lx6M4NpSPr4Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","2","{\"message\":\"test\",\"files\":[],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-06-30T18:48:57.054Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"cGOZiBySQs4tTbuNkHc1yQuXHzsiwTSQDXdqPpqDWcIJ6iWRDHpMB42c6aHHJMMiRp7SiwJ0IUXQKkk2F99SRA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","2","{\"message\":\"here\",\"files\":[],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-06-30T18:51:23.106Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"6M4TAKJjXSQ19qIWPxkPUlwBXXJtYDR5zYYwtuEix0YdU5ruz4QTEhijDgGG72mE7at7dmMqADBH1MKZz1Oy7w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","2","{\"message\":\"here\",\"files\":[],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-06-30T18:52:07.506Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"Y2Khg9L8yG8tHw6Gcj2vgOAkuJEqXvKdfgw6hWQt8S4cpQGxZTC6ERPb1LsFHNvHkiOsXZrquoV2pYtpwUGtMQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","11","😀","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"jUiN6mYMr9fQ4fq6q1gGXlbIW8WIadzK4zuchtC8fNg9V7Y4YM5r1+vLZOlO9sddFPhafsPWWUmMCHBq3KEC4Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","2","{\"message\":\"test\",\"files\":[],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-06-30T19:18:40.157Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"IqQJb7+hEeAIoEg7+6uKtlBzOxnL2Eu4HSu0J+Qv350zwBIA23rBxw/f76GRRDPPoDQzl7bfIV32WXryAlPcRw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","2","{\"message\":\"test\",\"files\":[],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-06-30T19:19:28.380Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"kH4Fxh5asgIYD6CNR3crH87BNDSty0lkauCxzXsbuJsvldotMn273m6OS9pIilshV+clILUlbsLzV7u10UZ84A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","2","{\"message\":\"test\",\"files\":[],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-06-30T19:20:59.215Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"TpGHGTbVo6sJbOn/6YS9w3rfh1NHwYm+P0RRunHTXzUC+1DYVdsUD4Li5RhBajuzyQxYm7FYT8l8v3jw4Hy7Mg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","2","{\"message\":\"hope\",\"files\":[],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-06-30T19:36:33.320Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"r+Iy4SKqCiSOlKFkEM0PX9Dyxh4VWXuSNswi9Kp3QAwm3DQu+zmU8bf+7d+81TzS835vp/fft7PhGKpY0c1wbQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","2","{\"message\":\"test\",\"files\":[],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-06-30T19:36:52.480Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"zGlsQSaUMT1pV11/68meaz5mznhtwKnoZ1wq0A/uU2JvLffOPwQvUuVqA8sLh8jaDPnYfC2l5WKpoOuyTleVvg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","2","{\"message\":\"test\",\"files\":[],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-06-30T19:37:02.909Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"gN1zXKPN1y3NjihY2x79nDmat9dIAZBDrLMDoCg5daUXVNCqzitfotUfPAUvEk20o5++HowKemNVa/BUIIdE4w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","17","😂","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"OgSeVKXAQPHMrp/wG73RQphe84ICf5y7W/XiN+V+4MFta8muaRlaYr6GOFSeqGQ51BXiLC/djxzUkIcBzXi1PQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","17","😂","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"yxORVfs7eYfBOQ/3l//E+ZkSxE24JBc1JVygTZ9EEgN2qs5CAuDTiBPzQlNME2tjN4OO8FFDP9bPHscTC3bWzw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","to_address":"g1pf6dv9fjk3rn0m4jjcne306ga4he3mzmupfjl6","amount":"100ugnot"}],"fee":{"gas_wanted":"2000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"R8ualEgj5q8rBjH4jdX7rfiKBnAdT2CQcXeJOaEE4nxGu0h1ggW6F3b5nLxvRvOUvnZ3DSpnkuyOc5AnSkh+cA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","to_address":"g1pf6dv9fjk3rn0m4jjcne306ga4he3mzmupfjl6","amount":"100ugnot"}],"fee":{"gas_wanted":"2000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"8/MBb1fT8c5dm98vH8fVcFac1k1A+Qhwj65pMPglG/xf6qB+HmTqQCpY3Q4Dy1ozUjsJ82/lyRMCOs9HsPLCuw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/varmeta/vmt721","func":"Mint","args":["g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","101"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"9H/Yu2fGYemKJ+D0tRUNfL5uliBJ0/tTUZWEWlMJNhU3T6w7nRxJNoOUXk1lHanvBD2dtGowPeBsccZ/hKnaWA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/varmeta/vmt721","func":"Mint","args":["g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","101"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"YLztVPPmDA8HnBI3Uayv2Ql+Az3BkMCWIsh1dzv10X4wBfCWjjekbrP4vG6S6kE25x88V4wbqB5IxeHqKBq0tw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/varmeta/vmt721","func":"Mint","args":["g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","101"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"TauYtnKhi+AosCGLjxC2jm3+1PyB9ZKE6oNXxiF99AMDLejGPHSV0PFdT5MgL6GCO6PJ6tey3iXxXYxh0GGA0A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/varmeta/vmt721","func":"Mint","args":["g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","101"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"n0wt9IczzhPI9tIZoQMB1vGsuaBMAT4lNnHinYHI+DdaS1A++2vqfEMGiZ3E7pwlt0v9HlY3xw/3pRV0Bugu3A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1u878f6nl7an9093n8v0uk4udrzu5uee0qtz2qa","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"9YZY9gV1+7ZxUEcmpFF9Hw1eJfrF3ewRgm3d8iwCz30CHJvZFd9xN1Eznx/rhoNIYLTN8IP8X+hjRJQ3dL6UlA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","4","{\"message\":\"testing!\",\"files\":[{\"fileName\":\"ORIGINAL BTC JAZZ CLUB.png\",\"url\":\"ipfs://bafybeigdfk3mhrt4lmls4ogywmnpmd22emlazgnzf2qmj7vsjn2ljnb6sm\",\"mimeType\":\"image/png\",\"size\":1408208,\"fileType\":\"image\"}],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-07-01T11:53:19.763Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyDlf14q7C2aBqar/Qryh6dVR9VACxVZV6fOaM3X5YEA"},"signature":"JIUrgZN1KFpvQxXOWqVyMHrPfwNrxvUtJ0177B0WAB0Zl7Vsx+YVNAQgofl9nE+Wuunk7MIZ0HHUm+mUhDpznQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/userbook","func":"GetSignupsInRange","args":["1","2"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"vzsZPSqcg3UzHxhGkWmyTfLK3WI84FYS58KMd6TS/akjFxWvsE7JZjkLdayQOBplEy+xcjk/ohpdposS1J0VwQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["reaching-consensus","Reaching Consensus: Developing Fault-tolerant SMTs using Golang","\n\nEvery once in a while, an effort comes along for the Gno core engineering team that demands immense focus, adaptability\nand coordination, in order to successfully improve a critical part of the [gno.land](http://gno.land/) blockchain\nsystem. This article is meant to cover one such critical module - the Tendermint consensus engine.\n\nOver the course of the next following sections, you’ll discover on a practical level what the Tendermint consensus\nengine is all about, how it works, and how we ended up implementing it for the purposes of [Gno.land](http://gno.land/),\nand the wider blockchain and open-source community.\n\nIf you want to jump straight to the source code, you can find the standalone library in the gno\nmonorepo [here](https://github.com/gnolang/gno/tree/master/tm2/pkg/libtm).\n\nIt is worth noting that we will primarily be discussing the use of the Tendermint consensus engine from an angle of a\ndistributed system, that doesn’t necessarily have anything to do with blockchains.\n\n## What are consensus engines, really?\n\nMost blockchain systems that are distributed use some *consensus mechanism*. In essence, this is a process in which\nremote machines (blockchain nodes) agree that a given value is valid. The nature of their agreement (the process) and\nthe value on which they agree on are completely arbitrary, and are up to the specific blockchain system to decide on and\nuse.\n\nSome of these *consensus algorithms* have specific properties that make them more resilient than others — consensus\nalgorithms can be crash tolerant, meaning the process of reaching an agreement on a value tolerates nodes being *faulty*\nby crashing, in which case they stop while the rest of the nodes continue operating. An example of this consensus\nalgorithm is [Raft](https://raft.github.io/). On the other hand, a more resilient consensus algorithm is also\n*byzantine-tolerant*, in which case the nodes participating in the consensus process can not only crash, but be\nmalicious — meaning an arbitrary range of faulty behaviors is tolerated. Examples of byzantine-tolerant consensus\nalgorithms\ninclude [PBFT](https://pmg.csail.mit.edu/papers/osdi99.pdf), [IBFT](https://arxiv.org/abs/2002.03613), [HotStuff](https://arxiv.org/abs/1803.05069),\nand the one we will focus on in this article — [Tendermint](https://arxiv.org/abs/1807.04938).\n\nFor the sake of clarity, it is worth noting an important distinction very early on, before we dive into the\nnitty-gritty. In this article we make a clear distinction between consensus protocols, the validator set modification\nalgorithms, and consensus engines, the actual state machine changes required for reaching consensus.\n\nIn a distributed consensus-run system, the participants are usually called *nodes*. In the blockchain context, they are\ncalled *validators*, since they validate the proposed chain state changes through the consensus process. The process for\nwhich these actors *enter and exit* the validator set (node consensus set) is called a *consensus protocol*. Most\npopular examples of consensus protocols include:\n\n* **Proof of Authority (PoA)** - a permissioned system in which consensus participants (validators) are selectively\n chosen / voted in, by the existing participant set.\n* **Proof of Stake (PoS)** - a permission-less system in which anyone can stake something (usually the network’s native\n currency) to gain entry into the validator set (become consensus participants).\n\nThere are many different flavors for the system in which the validator set is chosen — for the sake of simplicity we\ngroup this process under the *consensus protocol* term.\n\n[![valset](https://gnolang.github.io/blog/2024-07-01_reaching_consensus/src/thumbs/valset.png)](https://gnolang.github.io/blog/2024-07-01_reaching_consensus/src/valset.png)\n\nWe mentioned earlier that consensus is a process in which nodes agree upon a specific value. We denote this actual\nprotocol in which they agree upon a value as the *consensus engine*.\n\nThe consensus engine represents the internal, most critical process of the consensus algorithm - the state machine. It\ngives answers to questions like - who proposes the consensus value (in leader-based systems), how is validation done,\nbut most importantly — what are the steps taken by validators to reach consensus?\n\n[![machine](https://gnolang.github.io/blog/2024-07-01_reaching_consensus/src/thumbs/machine.png)](https://gnolang.github.io/blog/2024-07-01_reaching_consensus/src/machine.png)\n\n### Terminology\n\nConsensus algorithms like Tendermint work on a round-based model, meaning consensus is attempted to be reached on a\ngiven value within a round, for a given height. If consensus is not reached on `round X` of `height Y`, then a new\nconsensus round is started for `round X+1`, `height Y`. This round changing occurs until consensus is reached for the\ngiven height (in the context of blockchains, the height is the block number). We will discuss later on what the\nconditions are for increasing the consensus round number.\n\nWe call this tuple denoting the current consensus height and round `(h, r)` a ***view***.\n\nFor leader-based consensus algorithms like Tendermint, one node (validator) called the ***proposer*** (who is\ndeterministically selected by all participating nodes) needs to propose a value for the current consensus view. This\n***proposal*** value can in theory be anything, but in the context of blockchain systems, this is usually a block\ncontaining transactions (state transitions).\n\nSpecific to Tendermint, in order to reach consensus, there needs to be an agreement between at least `2F+1` validator\nnodes (where `F` denotes the maximum number of faulty nodes that are tolerated in the system). In the broader Tendermint\necosystem, validators are not equal, since the consensus protocol mostly used with Tendermint is Proof of Stake, and the\nvalidator’s power is proportional to their stake. In this case, `F` denotes the maximum voting power of faulty nodes\nthat are tolerated in the system. In practice, `2F+1` is 2/3+ (supermajority) of the validator set’s voting power.\n\n## How does Tendermint work?\n\nThe term “[Tendermint](https://docs.tendermint.com/v0.34/introduction/what-is-tendermint.html)” refers to a much larger\nscope of functionality than what we discuss in this article. By “Tendermint” here, we solely refer to the Tendermint\nconsensus engine (state machine).\n\nA good graphic that shows an overview of the Tendermint state machine can be found on the\nofficial [Tendermint Core documentation](https://docs.tendermint.com/v0.34/introduction/what-is-tendermint.html#consensus-overview):\n\n[![polka](https://gnolang.github.io/blog/2024-07-01_reaching_consensus/src/thumbs/polka.png)](https://gnolang.github.io/blog/2024-07-01_reaching_consensus/src/polka.png)\n\nHowever, we want to tackle this question of Tendermint’s inner-workings by weaving in the theory from the paper titled\n*The latest gossip on BFT consensus*, and applying it in practice.\n\nOn a surface-level, the Tendermint consensus engine has 3 states:\n\n- **Propose** - the *proposer* for the current view (height, round) sends out a *proposal* to all other validator nodes.\n Non-proposers wait for the proposal and verify it\n- **Prevote** - the validator nodes wait for 2F+1 `PREVOTE` messages, potentially locking on a proposal\n- **Precommit** - the validator nodes wait for 2F+1 `PRECOMMIT` messages, potentially saving the block to the block\n store, and starting a new consensus round (with a view `(h+1, 0)`)\n\nThese states are not as straightforward as they’re made out to be — there is an added complication of *state timers*\nwhich guarantee protocol liveness, and other asynchronous situations like consensus round jumps within the same height.\nWe will discuss these mechanisms later on, as they are critical to making sure Tendermint is ticking correctly.\n\n### I Propose\n\nThe *propose* state is the initial consensus state for the Tendermint consensus engine. This is the only state within\nthe state machine that has different logic flows for proposers and non-proposers.\n\nIn the *propose* state, only one node is the proposer for the given view (height, round), and the rest are simply\nsupposed to wait for the proposal.\n\nThe proposer for the view has 2 choices when proposing a value:\n\n1. craft an entirely new proposal (block). The paper denotes this process with `getValue()`\n2. utilize an old (locked) proposal, that was proposed in an earlier round (same height, earlier round), but whose\n consensus was never reached (for whatever reason)\n\nWe will discuss “proposal locking” in the `Prevote` section, for now consider that this is a special case where the\nproposer does not actually construct anything new, but simply relays a proposal that was sent in the past (earlier\nround), but not agreed upon fully (committed).\n\n[![paper-1](https://gnolang.github.io/blog/2024-07-01_reaching_consensus/src/thumbs/paper-1.png)](https://gnolang.github.io/blog/2024-07-01_reaching_consensus/src/paper-1.png)\n\u003cdiv align=\"center\"\u003eSource: The latest gossip on BFT consensus, page 6\u003c/div\u003e\n\nAs outlined in *Algorithm 1*, the initialization step takes place before the beginning of the actual consensus process (\nstate machine). `StartRound` is meant to kick off the Tendermint state machine.\n\nUpon figuring out the proposal value, the proposer broadcasts it to the rest of the nodes. The specifics of network\ngossip implementations are not discussed in the actual paper / consensus protocol.\n\nFor non-proposers of the view, they simply initiate the `propose` state timer, that’s meant to advance the state machine\nfurther if no valid proposal comes in from the proposer of the view.\n\n[![paper-2](https://gnolang.github.io/blog/2024-07-01_reaching_consensus/src/thumbs/paper-2.png)](https://gnolang.github.io/blog/2024-07-01_reaching_consensus/src/paper-2.png)\n\u003cdiv align=\"center\"\u003eSource: The latest gossip on BFT consensus, page 6\u003c/div\u003e\n\nOnce non-proposers receive a proposal from the proposer of the current view, they validate it using an external\nfunction, denoted here as valid(...). The proposal is accepted in 2 situations:\n\n* if it is a fresh proposal (not a locked one), and it is valid according to the standards of a verifying\n method (`valid(...)`).\n* if it is an older proposal (locked value), it is valid according to the standards of a verifying method (`valid(...)`)\n *and* the proposal matches the validator’s in-memory locked proposal.\n\nIn case of a successful proposal verification, the node broadcasts a `PREVOTE` message with a valid ID of the proposal.\nThe identification method of the proposal is not defined by the Tendermint protocol itself, but commonly in practice\nthis value is the hash of the actual block being proposed (in blockchain systems).\n\nIn case the proposal verification fails (proposal is invalid), the node broadcasts a `PREVOTE` message, with a `nil`\nvalue for the proposal ID, indicating that this step in the consensus process failed.\n\nThe purpose of broadcasting a message with a `nil` value is to ensure the consensus engine’s liveness in case of a\nfaulty event. Note that Tendermint does not have a specific round-change state like PBFT, or IBFT, so the only way to\nmove the protocol along is *to go through all consensus states, and in order to succeed or fail in the end*.\n\nIn either case, after the node broadcasts a `PREVOTE` message, it transitions into the *prevote* state.\n\n#### Propose timer\n\nNon-proposers for the view start a `propose` state timer.\n\n[![paper-3](https://gnolang.github.io/blog/2024-07-01_reaching_consensus/src/thumbs/paper-3.png)](https://gnolang.github.io/blog/2024-07-01_reaching_consensus/src/paper-3.png)\n\u003cdiv align=\"center\"\u003eSource: The latest gossip on BFT consensus, page 6\u003c/div\u003e\n\nThis timer is meant to go off after a fixed interval of time, in order to prevent the node from being stuck in a state\nwhere it’s still waiting on a proposal.\n\nWhen the timer asynchronously ticks off, the node broadcasts the `PREVOTE` message with a `nil` ID value, indicating\nfailure to receive a valid proposal. After the broadcast, it moves to the *propose* state.\n\n### II Prevote\n\nThe *prevote* state is the second state of the Tendermint consensus engine, and it’s the common state for all consensus\nparticipants (proposers and non-proposers).\n\nNodes end up in this state in the following scenarios:\n\n- the proposer for the view sent a valid proposal\n- the proposer for the view didn’t send a valid proposal\n- the proposer for the view didn’t send a valid proposal in time (timeout triggered)\n\nThe *prevote* state can be seen as an “alignment” state between nodes because this is the first state in which consensus\nparticipants need to reach a supermajority on whether the current consensus round is proceeding as it should, or if\nthere is some funny business happening.\n\nTo successfully move over to the *precommit* state, validators need to receive `2F+1` `PREVOTE` messages with a valid\nproposal ID. In other words, the supermajority of the validator set’s voting power needs to send out `PREVOTE` messages\nwith an attached proposal ID (of the proposal accepted in the *propose* state!).\n\n[![paper-4](https://gnolang.github.io/blog/2024-07-01_reaching_consensus/src/thumbs/paper-4.png)](https://gnolang.github.io/blog/2024-07-01_reaching_consensus/src/paper-4.png)\n\u003cdiv align=\"center\"\u003eSource: The latest gossip on BFT consensus, page 6\u003c/div\u003e\n\nAs soon as these conditions are met, the participants broadcast a `PRECOMMIT` message, with the attached proposal ID (\nsame one as with the `PREVOTE` messages, and derived from the proposal accepted in the *propose* state). After\nbroadcasting the `PRECOMMIT` message, participants move over to the *precommit* state.\n\n#### Block locking\n\nAn important characteristic for the *prevote* state is the block locking mechanism that is triggered as soon as\nconditions for a valid transition to *precommit* are met.\n\nBefore broadcasting a valid `PRECOMMIT` message, the validators “save” (in-memory) the proposal value in which the\nsupermajority of the validator set’s voting power agreed upon, and the round in which it happened (denoted\nas `lockedValue` and `lockedRound`, respectively).\n\nThe purpose of this block locking dance is to be able to propose / verify the same proposal if the current consensus\nround fails in the following steps (for example, not enough valid `PRECOMMIT` messages received). The idea behind this\nmechanism is that a proposal agreed upon by a supermajority of the validator set is most probably a valid one, and\nshould be considered for future rounds in case the original consensus round in which the proposal was brought up did not\ncomplete successfully.\n\nIf we go back through the conditions for the initial Tendermint engine state transitions, we will see that there is a\nstrong requirement for “locked” values.\n\n[![paper-5](https://gnolang.github.io/blog/2024-07-01_reaching_consensus/src/thumbs/paper-5.png)](https://gnolang.github.io/blog/2024-07-01_reaching_consensus/src/paper-5.png)\n\u003cdiv align=\"center\"\u003eSource: The latest gossip on BFT consensus, page 6\u003c/div\u003e\n\nThese checks essentially enforce that if there was a proposal in some previous round, that reached a supermajority, it\nneeds to be *proposed again* in a future round.\n\n#### Jump to Precommit\n\nThere is a situation in which the validators move over to the *precommit* state, without receiving a supermajority of\nvalid `PREVOTE` messages (with a valid proposal ID):\n\n[![paper-6](https://gnolang.github.io/blog/2024-07-01_reaching_consensus/src/thumbs/paper-6.png)](https://gnolang.github.io/blog/2024-07-01_reaching_consensus/src/paper-6.png)\n\u003cdiv align=\"center\"\u003eSource: The latest gossip on BFT consensus, page 6\u003c/div\u003e\n\nIn case a validator receives `2F+1` `PREVOTE` messages with a `nil` proposal ID, they simply broadcast a `PRECOMMIT`\nmessage with a `nil` ID value (indicating failure), and move over to the *precommit* state.\n\nThis `nil` propagation mechanism is part of the liveness property discussed in the *propose* section, which requires a\nvalidator to go through all Tendermint states before starting a new consensus round.\n\n#### Prevote timer\n\nAll validators start a *prevote* state timer the moment they receive a supermajority (`2F+1`) of *any* `PREVOTE`\nmessage (either with a valid or with a `nil` proposal ID).\n\n[![paper-7](https://gnolang.github.io/blog/2024-07-01_reaching_consensus/src/thumbs/paper-7.png)](https://gnolang.github.io/blog/2024-07-01_reaching_consensus/src/paper-7.png)\n\u003cdiv align=\"center\"\u003eSource: The latest gossip on BFT consensus, page 6\u003c/div\u003e\n\nWhen the timer asynchronously ticks off, the node broadcasts the `PRECOMMIT` message with a `nil` ID value, indicating\nfailure to reach a supermajority on a proposal. After the broadcast, it moves to the *precommit* state.\n\n[![paper-8](https://gnolang.github.io/blog/2024-07-01_reaching_consensus/src/thumbs/paper-8.png)](https://gnolang.github.io/blog/2024-07-01_reaching_consensus/src/paper-8.png)\n\u003cdiv align=\"center\"\u003eSource: The latest gossip on BFT consensus, page 6\u003c/div\u003e\n\n### III Precommit\n\nThe *precommit* state is the final state in the Tendermint consensus engine, common for all validators.\n\nMuch like the *prevote* state, *precommit* consists of the validators waiting for a supermajority of messages of a\nspecific type — in this case the `PRECOMMIT` message, with a valid proposal ID.\n\n[![paper-9](https://gnolang.github.io/blog/2024-07-01_reaching_consensus/src/thumbs/paper-9.png)](https://gnolang.github.io/blog/2024-07-01_reaching_consensus/src/paper-9.png)\n\u003cdiv align=\"center\"\u003eSource: The latest gossip on BFT consensus, page 6\u003c/div\u003e\n\nAfter the validators exchange `2F+1` valid `PRECOMMIT` messages (with a valid proposal ID), they commit the proposal to\ntheir local storage, increase the height and move over to begin the consensus process anew\nfrom `(height + 1, round = 0)`.\nSince the consensus process is finalized successfully for the current view, the in-memory values for locked values are\ncleared, along with the complete message log.\n\nOf course, the proposal ID contained within the `PRECOMMIT` messages needs to match the proposal ID in the previously\nreceived supermajority of `PREVOTE` messages, and be derived from the proposal in the *propose* state.\n\n#### Precommit timer\n\nMuch like with the *prevote* state, the moment validators receive a supermajority (`2F+1`) of *any* `PRECOMMIT`\nmessage (either with a valid or with a `nil` proposal ID) they initiate a *precommit* state timer.\n\n[![paper-10](https://gnolang.github.io/blog/2024-07-01_reaching_consensus/src/thumbs/paper-10.png)](https://gnolang.github.io/blog/2024-07-01_reaching_consensus/src/paper-10.png)\n\u003cdiv align=\"center\"\u003eSource: The latest gossip on BFT consensus, page 6\u003c/div\u003e\n\nWhen the timer asynchronously ticks off, the node begins the consensus process anew with an increased round number (goes\nback to the *propose* state). Since the *precommit* state is the last one in the chain, the only next step left for the\nengine is to go back to the beginning.\n\n[![paper-11](https://gnolang.github.io/blog/2024-07-01_reaching_consensus/src/thumbs/paper-11.png)](https://gnolang.github.io/blog/2024-07-01_reaching_consensus/src/paper-11.png)\n\u003cdiv align=\"center\"\u003eSource: The latest gossip on BFT consensus, page 6\u003c/div\u003e\n\n### IV Round jumps\n\nThere is a special scenario within the Tendermint consensus engine that bypasses the notion of going through all\nconsensus states in order to start a new consensus round.\n\n[![paper-12](https://gnolang.github.io/blog/2024-07-01_reaching_consensus/src/thumbs/paper-12.png)](https://gnolang.github.io/blog/2024-07-01_reaching_consensus/src/paper-12.png)\n\u003cdiv align=\"center\"\u003eSource: The latest gossip on BFT consensus, page 6\u003c/div\u003e\n\nIn this scenario, if at any point in time the validator receives `F+1` (called a *faulty majority*) of *any* message\ntype, for a **future** round (round higher than in the current view), the validator performs a round jump to the given\nround by starting the consensus process anew.\n\n### V Timers\n\nIn the Tendermint consensus process, timers play an important role in making sure the protocol stays “alive”. They move\nthings along if, for whatever reason, the flow stops.\n\nBy their nature, they are completely asynchronous, and can go off at point in time once they are set by the protocol.\n\nTendermint does not enforce specific initial values for each state timer, but provides suggestions on making sure the\ntimers serve their purpose:\n`timeoutX(r) = initTimeoutX + r * timeoutDelta`\n\nBy following this formula, it is ensured that each round state timer is:\n\n- influenced by the current view round (higher rounds == longer timers)\n- influenced by a constant `delta` increment (can be different for each state)\n\nIn the Gno blockchain, these values are defined as the following:\n\n```toml\ntimeout_propose = \"3s\"\ntimeout_propose_delta = \"500ms\"\ntimeout_prevote = \"1s\"\ntimeout_prevote_delta = \"500ms\"\ntimeout_precommit = \"1s\"\ntimeout_precommit_delta = \"500ms\"\n```\n\n### VI Tying it all together\n\nUnderstanding the Tendermint consensus engine involves grasping its three core states: *propose*, *prevote*, and\n*precommit*, and the transitions that ensure the system's liveness and fault tolerance.\n\nThe *propose* state is initiated by a designated proposer who broadcasts a proposal to all validators. This proposal can\neither be a new value or an old one from a previous round that did not reach consensus. Validators verify the proposal,\nand then move to the *prevote* state, where they broadcast their votes on the proposal, requiring a\nsupermajority (`2F+1`) to proceed. If the necessary votes are not received within a certain timeframe, a timeout\nmechanism ensures the process continues to the next state or round. If a supermajority of valid `PREVOTE` messages is\nreceived, validators lock the proposal value and transition to the *precommit* state. This locking mechanism ensures\nthat if consensus is not reached in the current round, the previously agreed-upon value can be proposed again, enhancing\nthe algorithm’s robustness. During the *precommit* state, validators wait for another supermajority of `PRECOMMIT`\nmessages. Upon receiving these, they commit the proposal locally, increment the height, and start a new consensus round.\n\nThe combination of these states and transitions, governed by timers and supermajority rules, creates a resilient and\nefficient consensus process. The Tendermint consensus engine's design allows it to handle both crash faults and\nByzantine faults, making it suitable for various distributed systems, including blockchains.\n\n## Taming asynchronous beasts with Golang\n\nWhen we started working on [libtm](https://github.com/gnolang/gno/tree/master/tm2/pkg/libtm), we had a few goals in\nmind:\n\n- create a consensus engine library that is easy to use, safe and performant, pluggable into systems we already have (\n the Gno blockchain, based on a fork of Tendermint Core)\n- implement abstractions that allow the library to be also used outside the blockchain context, while also being modular\n enough to be used by existing blockchain projects\n- maintain the principles of open-source software\n\nWe went about implementing #2 in a seemingly odd way:\n\n- We did not want the library to handle networking, or enforce a networking protocol. We believe that the underlying\n transport layer that moves around messages is irrelevant, as long as it provides the properties of *eventual\n delivery*.\n- We did not want the library to know how to sign, and verify signatures of arbitrary data. Signing protocols are\n something very use-case specific, and should not be enforced by the consensus engine. We do, however, provide the\n *data* that needs to be signed in the first place.\n- We did not want the library to do validator set management, or to even have a notion of a “validator” and its\n properties. Validator sets have vastly different management techniques, a complication we wanted to avoid in the\n engine.\n\nThis might sound shocking, given how existing implementations of the Tendermint consensus engine operate today in modern\nblockchains, but it actually greatly reduces the complexity and allows for applications of the consensus library outside\nthe blockchain context.\n\n### Everything starts with the messaging system\n\nLooking at how the Tendermint consensus state machine is structured, we can deduce that the main drivers of any kind of\nactivity are — messages.\n\nA message exchanged between validators, of any type, is the driving force behind the Tendermint consensus algorithm.\nIt’s used to transfer information, but also to act as a notification system that preserves certain consensus properties\nlike liveness.\n\nGiven the asynchronous nature of validator messages, we realized our messaging system would need to support the\nfollowing properties:\n\n- have buckets for each message type, to make messages easily fetch-able\n- have a mechanism that avoids duplicates\n- have a subscription mechanism we can tap into from any part of the codebase\n\nWe came to this conclusion after realizing our state implementations (discussed later) needed a more sophisticated way\nof fetching and filtering incoming messages, that didn’t involve constant read requests from the message log. These\noperations are very common, and they need to be performant in order to not delay the consensus process.\n\nLuckily, we ended up utilizing the full power of Go generics for this use-case:\n\n```go\n// msgType is the combined message type interface,\n// for easy reference and type safety\ntype msgType interface {\n\ttypes.ProposalMessage | types.PrevoteMessage | types.PrecommitMessage\n}\n\ntype (\n\t// collection are the actual received messages.\n\t// Maps a unique identifier -\u003e their message (of a specific type) to avoid duplicates.\n\t// Identifiers are derived from \u003csender ID, height, round\u003e.\n\t// Each validator in the consensus needs to send at most 1 message of every type\n\t// (minus the PROPOSAL, which is only sent by the proposer),\n\t// so the message system needs to keep track of only 1 message per type, per validator, per view\n\tcollection[T msgType] map[string]*T\n)\n\n// Collector is a single message type collector\ntype Collector[T msgType] struct {\n\tcollection collection[T] // the message storage\n\tsubscriptions subscriptions[T] // the active message subscriptions\n\n\tcollectionMux sync.RWMutex\n\tsubscriptionsMux sync.RWMutex\n}\n\n```\n\nThe `libtm` library keeps a `Collector` for each message type, and that acts as a message log. Additionally, the message\ncollector also keeps track of basic message subscriptions. These subscriptions (as we’ll discuss later), are for simple\nnotifications that alert the subscriber a message appeared in the message log.\n\n### Not all states are created equal\n\nOnce we’ve established the clear needs of our messaging system, implementing the actual state transitions around it was\ntrivial.\n\nTendermint consensus states all share the following structure:\n\n```go\n// runX runs the X Tendermint consensus engine state\nfunc (t *Tendermint) runX(ctx context.Context) {\n\tvar (\n\t\tround = t.state.getRound()\n\n\t\texpiredCh = make(chan struct{}, 1)\n\t\ttimeoutCtx, cancelTimeoutFn = context.WithCancel(ctx)\n\t\ttimeoutPrevote = t.timeouts[prevote].CalculateTimeout(round)\n\t)\n\n\t// Defer the timeout timer cancellation (if running)\n\tdefer cancelTimeoutFn()\n\n\t// Subscribe to all messages of a specific type\n\t// (=current height; unique; \u003e= current round)\n\tch, unsubscribeFn := t.store.subscribeToX()\n\tdefer unsubscribeFn()\n\n\tfor {\n\t\tselect {\n\t\tcase \u003c-ctx.Done():\n\t\t\t// Outer consensus context cancelled\n\t\t\treturn\n\t\tcase \u003c-expiredCh:\n\t\t\t// State timer triggered,\n\t\t\t// execute stateX teardown before returning\n\n\t\t\t// ...\n\n\t\t\treturn\n\t\tcase getMessagesFn := \u003c-ch:\n\t\t\t// New valid message appeared in message log, parse it\n\t\t\t// ...\n\n\t\t\t// Check if conditions are satisfied for starting the state timer\n\t\t\t// ...\n\n\t\t\t// Check if conditions are satisfied for a state transition\n\t\t\t// ...\n\t\t}\n\t}\n}\n\n```\n\nThe pattern is clear:\n\n- subscribe to messages of a specific type that are expected to appear in the current state\n- verify those messages as they come in, and check if conditions are met for a state transition\n- monitor the outer context, and the asynchronous timer context for stopping\n\nKeeping this in mind, we can develop the main run loop:\n\n```go\n// runStates runs the consensus states, depending on the current step\nfunc (t *Tendermint) runStates(ctx context.Context) *FinalizedProposal {\n\tfor {\n\t\tcurrentStep := t.state.step.get()\n\n\t\tselect {\n\t\tcase \u003c-ctx.Done():\n\t\t\treturn nil\n\t\tdefault:\n\t\t\tswitch currentStep {\n\t\t\tcase propose:\n\t\t\t\tt.runPropose(ctx)\n\t\t\tcase prevote:\n\t\t\t\tt.runPrevote(ctx)\n\t\t\tcase precommit:\n\t\t\t\treturn t.runPrecommit(ctx)\n\t\t\t}\n\t\t}\n\t}\n}\n```\n\nThe statement that *all* Tendermint consensus states share the outlined structure is not entirely true — remember the\n*propose* state?\nIn the *propose* state, there is a clear branching in logic, where non-proposers wait for and verify a proposal, while\nthe proposer for the view needs to build it and broadcast it. The proposer, unlike other validators, *does not need to\nwait on their own proposal to appear*, but can instead move directly to the *prevote* state, having already accepted the\nproposal that was sent out.\n\n```go\n// ...\nfunc (t *Tendermint) runPropose(ctx context.Context) {\n\t// ...\n\n\t// Check if the current process is the proposer for this view\n\tif t.verifier.IsProposer(t.node.ID(), height, round) {\n\t\t// Start the round by constructing and broadcasting a proposal\n\t\tt.startRound(height, round)\n\n\t\treturn\n\t}\n\n\t// ...\n}\n// ...\n```\n\n### How does it all tie together?\n\nOver the course of this article we’ve gone over the different Tendermint consensus engine states, and their caveats.\nWe’ve also mentioned other asynchronous processes like round jumps, timers triggers — how is all of this managed in Go,\nin `libtm`?\n\nThe entry point into the Tendermint consensus process lies in `RunSequence`, which manages other Go routines that\nfacilitate the previously-seen asynchronous `upon` blocks.\n[![run-sequence](https://gnolang.github.io/blog/2024-07-01_reaching_consensus/src/thumbs/run-sequence.png)](https://gnolang.github.io/blog/2024-07-01_reaching_consensus/src/run-sequence.png)\n\nIn the `libtm` library, this management structure looks like this, where `finalizeProposal` and `watchForRoundJumps` are\nGo routines:\n\n```go\n// RunSequence runs the Tendermint consensus sequence for a given height,\n// returning only when a proposal has been finalized (consensus reached), or\n// the context has been cancelled\nfunc (t *Tendermint) RunSequence(ctx context.Context, h uint64) *FinalizedProposal {\n\t// Initialize the state before starting the sequence\n\tt.state.setHeight(h)\n\n\t// Grab the process view\n\tview := \u0026types.View{\n\t\tHeight: h,\n\t\tRound: t.state.getRound(),\n\t}\n\n\t// Drop all old messages\n\tt.store.dropMessages(view)\n\n\tfor {\n\t\t// set up the round context\n\t\tctxRound, cancelRound := context.WithCancel(ctx)\n\t\tteardown := func() {\n\t\t\tcancelRound()\n\t\t\tt.wg.Wait()\n\t\t}\n\n\t\tselect {\n\t\tcase proposal := \u003c-t.finalizeProposal(ctxRound):\n\t\t\tteardown()\n\n\t\t\t// Check if the proposal has been finalized\n\t\t\tif proposal != nil {\n\t\t\t\treturn proposal\n\t\t\t}\n\n\t\t\t// 65: Function OnTimeoutPrecommit(height, round) :\n\t\t\t// 66: \tif height = hP ∧ round = roundP then\n\t\t\t// 67: \t\tStartRound(roundP + 1)\n\t\t\tt.state.increaseRound()\n\t\t\tt.state.step.set(propose)\n\t\tcase recvRound := \u003c-t.watchForRoundJumps(ctxRound):\n\t\t\tteardown()\n\n\t\t\tt.state.setRound(recvRound)\n\t\t\tt.state.step.set(propose)\n\t\tcase \u003c-ctx.Done():\n\t\t\tteardown()\n\n\t\t\treturn nil\n\t\t}\n\t}\n}\n```\n\nGo contexts, combined with minimal channel usage, allow us to construct a flow that is easily testable, readable and\nmaintainable.\n\n### Trust, but verify\n\nOne of the most important choices that we wanted to make while developing `libtm` concerned how we’d verify the\nfunctionality, and how frequently during our development process. This was especially amplified by the fact we were\nexperiencing ongoing stability issues with the existing Tendermint BFT testing suite in Gno.\n\nWe wanted a testing suite that was minimal enough to verify individual state to state transitions, but also flexible\nenough to spin up full blown clusters and simulate a live consensus environment.\n\n`libtm` has essentially 2 types of tests:\n\n- regular unit tests that verify state -\u003e state transitions. These tests have “pause” and “resume” functionality that\n allows us to exactly verify each step of the state machine\n- cluster tests in which we simulate valid / byzantine environments. These tests spin up a multimode cluster, fully\n mocked, to simulate inner-node communication and consensus\n\nWe plan on expanding our testing suite even further, with more sophisticated cluster tests that cover an additional\nrange of byzantine scenarios. Currently, our code coverage sits at ~96%.\n\n## Conclusion\n\nOur exploration of the Tendermint consensus engine has highlighted the meticulous design and robust functionality that\nmake it a cornerstone of blockchain systems. The Tendermint consensus engine’s ability to maintain liveness and ensure\nfault tolerance through its well-defined states—*Propose*, *Prevote*, and *Precommit* — exemplifies the intricate\nbalance needed in distributed systems, where validators can navigate the complexities of reaching consensus even in the\nface of network delays and potential Byzantine faults.\n\nThe implementation of Tendermint within the Gno blockchain, and the broader application potential of\nthe [libtm library](https://github.com/gnolang/gno/tree/master/tm2/pkg/libtm), underscore the versatility and\nadaptability of this consensus mechanism. Our approach to developing `libtm` emphasized modularity and flexibility,\nensuring it could be utilized both within and beyond blockchain contexts. By decoupling the library from specific\nnetworking protocols, signing mechanisms, and validator set management, we aimed to create a tool that is both easy to\nintegrate and capable of supporting diverse use cases. It not only facilitates smooth blockchain operation but also\nopens up new possibilities for innovation in distributed systems.\n\nWe look forward to the ongoing improvement of Tendermint, and its continued impact on the blockchain and open-source\ncommunities.","2024-07-01T00:00:00Z","zivkovicmilos,petar-dambovaliev","gnoland,test4,consensus,tm2,libtm"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"LKWDp2sMnkWR+Eq0AWCueF2EDbaogE2yxVIKl78FNYJRx65Duyg3fLzJUtyCnHfVDO6OPEoYgVib64qfR836HA=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"f3Bcv/6ktVPMiZXu9cSsKfozt4n1ObScGxaNaB2+lj1iZ/T98UJusMQ+JVNLuK+yLiQCz+67zQSKt/U0o2+bVQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"o4EKzTxN0wBV+qYN5UUh/Bpx1frorWvIVjzClXLscUBgmkCT5lYzGpKuuyJqx5F6mBU63VWYPOfx4nspmeVNRg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g12g569s05c293zu2kxk0z426yylxmmthx8hcudd","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"a+uLEQ7wzku3qu+x/l5vGGDx9Lfqf3ijyH+dGGzn1vFYlxyE8gYRb2LSxu9pcp4opvo/bjVL+pb5Xlj80m+naw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1khhv3qngmspp3zrnpf47hh9fe0ns566qcz6a38","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"kBzZMo7tcfnmqlFpOJc0yXxUCcr53FwFG+lhLOR7999xbNAPTZt975nAif4Nl9OYNx5ItxTSPwBzFzZRFagFiA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","package":{"name":"","path":"gno.land/r/g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5/run","files":null}}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"c8mrzT+u0+/t3VLHjhaA0CFfItFOVklkalPhbOJvajs8vvnOdN1oG/X2FO8dPxR4mVFVqmqSHdUyHcOkLkM5Dw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"k2GFgOGQLiAJfQkJzZ4Q7Q5dZi5Nvvu534hESwn4FpBysdHmk8nPcjLuLsjRPmWxTcbaoMn58F3pBXAADOLZ7w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"2000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"eqCZh7+/mm5sY/9MW9CToghjzeE5AJuWj2E9iyei/XNC/sxtx+tLWoFt4Xbs94DA+D2h2OL46k1hJJQnWzVNXQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"DLf5KcgWBuZwpZIy2VgllW8qDvV45dQ3l2AF2Z/BSr1HfoSd9NgYQ+zHfZDtbAfZfYcfjG296kOxzm8YzaKNCQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"3000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"AhdPmJkmf+lNL/MgCsfjL0AY+4y5UT4LV7UyCdKvT2Ad6QDLkLlmjR+nTuIt7kYD0qy76Su5Hn9YBw4B1gDSCQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"wUEX53Ld+NCdsN96UW1gezNKcZF0HHw1lEucSZjhvAdYXOH4hwQW98NVUuX+ogtaSdEzJxob7O4O9aQNN8sCHg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"3000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"jJ5VDXivbNxf2iBCzeRnCwfoogyGjJj69UX4fI9IGEdiXnIYBYr3Gv3n7DpnpoH3KrFjt9lmi3tFW77fXLU5qA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"3000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"cofssXUjcrjc3hqNhCEnYbDLg9pUV9rA19Jic/8Bai5FltGFLeJL133c7fGKI8llxUc+MpxtnoJqMNoFIFwG6w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"XV94iDTkTE3IqfCygyjdbT3XvnicqubZcN73b0plU11NjyMui1pAE0XSIvB7HaX+A/Z+dM9EQmB5Q73jy6oEEw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"3000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"een3D9YWTPDh4dLAP6v0vDwtKdgWcaFlrlDa/sSOPR0/mL2zrDu6v1JcyCwKnDbfpp+0RXkXCznm59J74bP2qg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"hKyVYbDtzOl/vE+z0+Xxwihqb9GrE4bF4qDsvpI7VewMgEIEC14qbGNli087c/hLs1z+Di6jKXnfaxV48KjrDQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"3000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"WV9AVWxlcMl6Xfh+gkAJQi5IdP9s0Gl5wBPLVP2yuGoItiNvC4Evm4qK9dSWjG7UbjK0QOQBs51ncygg6RKOZQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"2000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"LAY8I9KMo9lfe3R0G1IWsVFBovtJkAAGCvuaTO40BDZERT3i6ZuIz4sa9SmESvSQ+X2Yup9KiHFAg03ZOAGg5g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"2000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"8OTV37YAHl3kUJKniFXWwha6pGCXhWH/qtqkvjfpRJt6pVoGUE1svAqmBKtE80bbGs35XmfNy9su9w0pVo4EPw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"3000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"gKlDJBS/Ff+MadQkk8S4IPwNGALEi/WxGjBTW74ztHlxoxCkfuvgobXJvTujy94aYNtUixmQJYWnnbAM7rzdnA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"x29bvbZLp7fTvo9ezVPCCg8GagziGhzqAZ1Ls8lq7GImA1RVtd+baGT3/I9czW8qS/w8kchVsDL9utJ8QJd+Mw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"2000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"59irbTvczXXN7OTPbp9tF2W2ohqDbZ7UWQF3+6rktPxQQ4Jh0Oalmcj7G0crOOAQH/fbyjrIZhK2aA8QKNU6Zw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"3000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"Kn6A5rjBB56MDh6jJ3KUnMMeJDoIAFWDVhfP+2CreVgqmjvcLe5RbLt2UEWk1cSJ0TxWm7BJWWDzbZDdr3HZeg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"2000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"S7Zoi3CR/vUD+xqoMmxI0aTtMKc4uyQwd8BYNueTbisNfIbUtWqomdplLkyiwuG1jkp8eaWLFdviyeV5hXw/dQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"whLCm312tQEwSCAWupSC5xGk4u9v4ULDSeAwsOe2rhUQGpbxugbmpTJZcaw6DrhW0B0D74h4pb7XNIKxqS72Ng=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["discover-gno-gc24","Discover gno.land at GopherCon US: Embrace Interpreted Go","\n\nIf you're attending GopherCon US this year, you may have heard about the \n[Challenge Series](https://www.gophercon.com/agenda/session/1281366) happening \nduring the conference. In addition to a the core set of challenges focused on \nsoftware engineering and cybersecurity provided by the Challenge Series organizers,\nthe engineers at gno.land have brewed up a set of challenges that will introduce\nyou to blockchains and smart contracts, while still feeling right at home by \ncreating your solutions as Go and Gno programs!\n\nIn the challenges, you'll learn how you can interact with a blockchain and discover\nhow realms (smart contracts) can be utilized for stateful applications without \nrelying on a filesystem or a database. You'll also be able to leverage gno.land's\nfeatures, such as using deployed contracts both as an API and as importable Gno \nprograms, while being aware of their limitations, like not being able to access \nthe system's time. And finally, you'll see what class of security problems come \nup when you want to make smart contracts. Luckily, there are no SQL injections \nto worry about here.\n\n## What is gno.land and Gno?\n\ngno.land is a distributed multiuser language-based operating system based on Go.\nIt embeds a custom-built virtual machine that interprets and executes the Gno \nlanguage - a fully deterministic variant of Go. Set to become the leading \nopen-source smart contract platform, gno.land allows gophers to create \ndecentralized applications with a minimal learning curve.\n\n## How to Get Started\n\nYou will be able to find the Gno challenges among the full catalogue on the \n[Challenge Series website](https://gophercon.challengeseries.org/). There you\nwill also find [a guide](https://gophercon.challengeseries.org/gno) that the\nengineers at gno.land have put together to help you get started, covering \nessential concepts and environment setup. This guide will provide you with the\ntools and knowledge you need to effectively participate in solving Gno challenges.\n\nTo participate, you'll have to form a team. You can join up with a team or look \nfor teammates by reaching out on the #gophercon-cs channel in the \n[Gophers Slack](https://invite.slack.golangbridge.org/). We suggest 4-5 people \nper team.\n\nOf course, it wouldn't be a competition without prizes! The winning team will\nscore four tickets to GopherCon 2025, the second-place team will get gift cards\nfor new hacking hardware, and the third-place team will receive copies of \n\"Go Programming: From Beginner to Professional\" by Samantha Coyle, along with \ncash prizes for all three top teams. We also have nine individual Achievement \nawards, such as \"First Blood!\", \"Night Owl!\" and \"Hooked on the Sidequest!\", \neach with a one-year subscription to 2600 Magazine and $100 in Google Cloud\nPlatform credits. Plus, everyone who completes a challenge is eligible for \nrandom prizes like vintage 2600 Magazine issues and security and programming \nbooks, to be awarded to those present at the prize ceremony on Wednesday. The \nfull list of prizes can be found on the [Challenge Series Prizes page](https://gophercon.challengeseries.org/prizes).\n\n## Ready to Take on the Challenge?\n\n- Join the Challenge Series: Test your wits \u0026 skills and gain practical \nexperience with Gno by visiting the [Challenge Series website](https://gophercon.challengeseries.org/).\n- Deepen your understanding of Gno and its core concepts by visiting the \n[Official gno.land Documentation](https://docs.gno.land/)\n\n## Get to Gno Us @ GopherCon US\n\nIf you'd like to learn more about Gno \u0026 gno.land, join us at GopherCon US for an\nin-depth talk and workshop on developing apps with Gno. Find the details below.\n\n### Workshop: 'Building a Decentralized App on gno.land'\n- Time \u0026 date: Monday, July 8th, 10:00 am - 12:00 pm\n- Who: Dylan Boltz, Software Engineer at gno.land\n- Where: Marina City, Marriott Marquis\n- [Link](https://www.gophercon.com/agenda?speakers=3317990)\n\n### Presentation: 'Building a Deterministic Interpreter in Go: Readability vs. Performance'\n- Time \u0026 date: Tuesday, July 9th, 11:45 am - 12:10 pm\n- Who: Jae Kwon, gno.land Founder and Co-founder of Cosmos\n- Where: Skyline Ballroom D, McCormick Place\n- [Link](https://www.gophercon.com/agenda?speakers=3304739)\n\nFor more info, visit [gno.land](https://gno.land/gophercon24/) and stay connected \nthrough our social media channels.\n\nWe look forward to seeing you at GopherCon US and building the future with Gno.\n\n###### *Participation in the Challenge Series is only possible by physically attending GopherCon US 2024.","2024-07-03T13:37:00Z","leohhhn,deelawn,thehowl","gnoland,gophercon,gno,challenge-series,go"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"uskvQ0mCPYM+/bNtMKPrUDUhUANsdy8d5K0ozLWvIkwZXhBGPN9qQCUhEY4tbB8AseoD614bj7GFG0yzMJvk0Q=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"8000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"uBNERI/noX8PdU2OjxDV/j/kKPNE4/XGWnFh19pTHfE3bxVpN3m38WoYHAW0Abwv4qQT2etPSl+vkcQvf40lLQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1d598tyfatprdstalqutk62cnzpm3thvyy9mypg","amount":"12345000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"RiU80umALVdKdMAhDD1hkr4gm56FJusBZ9JxqzbNABc86NaZ+C7uE7LmLi3fukvR/I05lqFl2q5qPW4nXE2uCw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1d598tyfatprdstalqutk62cnzpm3thvyy9mypg","amount":"11111000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"+tI3FLsluBRbmv1SxmAuGeqjK0bHSdkKYWHy6ACFOgNxQQTWtwtEuXtgTpLLGYSHkWDtB39GU0Vlh040+TiepQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1w4qqmxdk59xsh3x5hnp2z78s4ymyva8pnenfem","amount":"4412000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"c7yCv9xU8An7WK4vJH21moxNMWv/tEY3imJH6QyCvxAkYbTqY/hsFxD+Tzr6XYuU4FDVxjviADoJng/HqFU1QA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"u2ik3jJNbmf6Zjry/BGt/uTsfWHGHapGTzZ/Af3hGbJfXzdHaGg+/spYahsjv7Uki8l2zXwSkgjKAQcBEdmaSA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"10ugnot"}],"fee":{"gas_wanted":"3000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"8b8vpQUREDhsNPPey+w37B1+ohVKeoPPEURcXLyepC5ob87wn00L0tgf9R7R5vxmcgckBP6Tt23JGtfNNCWXzQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g127l4gkhk0emwsx5tmxe96sp86c05h8vg5tufzq","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"i996Ad7J40HEUuiQojWtxWRM/U35x42PPfH7LTC9Kjp3hBWnKDJtC9A2XylcqMwqhn9krZqc7DwAPzNN3TUAvQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/userbook","func":"SignUp","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"c1E4rOGv2y7Rzb2ZNDfh0BuMp47aHhi7s4+09ocX1xB4Nu79f70ukjlJgPG6AN4nDSz/UNwt/u8hYMDBOXUJCA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/userbook","func":"SignUp","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"mWVnWyP1hEVsC0hQOtExHEpPBGIg/uyNXMZMmnK72noeWaFRtWWtRQJX3GT0nYxYgUTVzk8JXlL33IbRpJIkKA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g12chzmwxw8sezcxe9h2csp0tck76r4ptwdlyyqk","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"uOo2bp0qWd4PoTuaA6rhBWAF0ntnZNY2kyTW3GDIoKwDYBZ64O3FgiP3UoqLfjJwHu0SKpkwGnZfoXatBMMtCg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g12chzmwxw8sezcxe9h2csp0tck76r4ptwdlyyqk","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjwJQoDDCbWnRG1EjhrNqRIzDdI/J3WG2PyIQTSzWxPI"},"signature":"NNp9YTd/rX6xp0M2uvZdo9yAxbr22i7uyjES08BOWYQTwTo1Mqn2FaIf2ysIXAGZNuP1oKJyMAT6KeOwn02j8g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g12chzmwxw8sezcxe9h2csp0tck76r4ptwdlyyqk","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjwJQoDDCbWnRG1EjhrNqRIzDdI/J3WG2PyIQTSzWxPI"},"signature":"q24KOr0ekCIiu+BCQiw6lk8hyKHj7vvFqAO/HTvIGABSmU0HabM9dA4ssDYFw16TIXIJYO2+TYhfHtLfzhVagw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1dnllrdzwfhxv3evyk09y48mgn5phfjvtyrlzm7","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AsGEi/6/N0zRtRCWxHb7KZ1Z/BTfZIc77fvtkSRJlmwQ"},"signature":"Hq1sJVKhSUve61MOkQTWbLrdsVYSogfJJCsWMcOEwKlirb1wxJjUNBUFo/WLngNnrcPRLDslDjxen1sxFT8dLA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1dnllrdzwfhxv3evyk09y48mgn5phfjvtyrlzm7","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AsGEi/6/N0zRtRCWxHb7KZ1Z/BTfZIc77fvtkSRJlmwQ"},"signature":"3/x6Ha4WfYaxGTtx4r8qJcVWpOlUcUpv8pvk3esulrZYRvDdyo+R8mrGECVdygCOv0msD0rjaKgqVuyGmNcLmA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1dnllrdzwfhxv3evyk09y48mgn5phfjvtyrlzm7","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AsGEi/6/N0zRtRCWxHb7KZ1Z/BTfZIc77fvtkSRJlmwQ"},"signature":"dMcgM5SYBd9H/pOpaUv6IatFhAlxeDacnr5Z9abTNhRLgUW1w4vQXUarldgvbLJizuBQR0Brgsvq1y4JvG3ETg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","to_address":"g1urt7pdmwg2m6z3rsgu4e8peppm4027fvpwkmj8","amount":"12000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"VFjbfUYrT/MSJudMin/DD+ykcteBQl/iL+sTT5EOIjQnl34uANpCvdLUSuWbzheSVQlxLXePxhC7XKWlzE55Uw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1urt7pdmwg2m6z3rsgu4e8peppm4027fvpwkmj8","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArvWv8M+y47Y+EdM+meMEO/x9ukYOnb0DaxWpjih8z9C"},"signature":"GGhnz2Pi1GHZWiLqqfVW81BoDHIFMUIJUuhgOHhxoh9tD4Id/Wl1+yWcfgLy/NUUevFoGss/0WUFZ8h1+8lMbA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"kWIwy03CDuYT4jye8bMXmVmaHnIeTzM6lWIGE017jllfKdhWHG61zgg/NGMPe7l6t2cUbaJBgyjI/CGRMXyEiQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g15ruzptpql4dpuyzej0wkt5rq6r26kw4nxu9fwd","send":"","pkg_path":"gno.land/r/demo/memeland","func":"PostMeme","args":["data:image/jpeg;base64,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","1720132132"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ax8dMlyeZTx7/5c7upbCj/sMsgJdjajg4b8kgHZ+d1mV"},"signature":"NRDj5Q1mBwmEREwVW+l7vVT7fRXELbqixm3PxBVNQXtVDKMaZVQtOWGhCXIx/kdLLjGqFGU8xB94XNE93gNhig=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"eXKLJCmGz6PWI/a7/AsNx5LaV/j6rTcdOkCYOGGmFJQR6frKhqJQUXn8MPhoO7Fjm0OewtewqxE9COxcrcEUtA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"12345ugnot","pkg_path":"gno.land/r/demo/banktest","func":"Deposit","args":["ugnot","1"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"jWK2Eq2xSROrHz4b7xX2NZZW3KyCC2CZnUU6EH712LFB1LQQ7nNBGedZLBgziV48hjkQjYdOjNQHiXw044mjLQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"4242ugnot","pkg_path":"gno.land/r/demo/banktest","func":"Deposit","args":["ugnot","1"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"mTciWA8AQa6E/Qnt/GnEDNdmx5+V5jEEGtPi4jpOzjwzZ/Q1J1cZu4N+YIgSAhQNPMnyu53KVrwsCQcShX91Jg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"2000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"/wb6OADfx13NpxvYdh1StZk3PqFuMLVi5FXGK/zQTAQPzmFmkXsYMz81UV1R/pqWD29SYMIUoK1rAFiEmsN3qg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"8000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"jRhUPXAjfdV4AfJE0H4r+nrELLBohIe7+Ea/v/M1khZSILawIiWM78QXgKgJX4BDT+7uFcnjtXmfAe6/1bEDAA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"8000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"AwTwfskfyjnA9IOhIDKCOkD7MW7PS6AcZWXOkg0WrlcuqxMDLDD8hKFWCgMccQoYtq1FsLOewfZPtF2P4KAGXw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/staging/v3/raffle","func":"UploadCodes","args":["a657602fc08191e7a4e0255a818a0ec544c8ce0826fe9ecf0c47eb538b2a9920,e4ce35fc370cb77c8416d6cf248e406c3f41073955d2d1c46dfcde630437711c,d1c73632a00861c2a57502edcc7105df21e22f6f4764e07dbd76c1dd456fd763,5e9a113e15140d8e7ec30a70d999038970da4dc84b8517fdf93d8eba56b4f4cd,d0a8e682db50c4b5f16dbb1c206cc8086f58094642d5864db8cd5feaefff0eae,6d0d8c67778d4ea8ac5ed234c12075b7ccb96350ea84711f455eb1538ac30025,e287bbe122d9be4c90d2fc62e51abbc67de50f6c8044636a61e7f801081ba907,6c4567fdd88ee306f715eac751010b5ef8a66bab66258e580be4915898b1dfaa,85463175e47915820c55acbc2531eaf360a8c0586c3b59cbbf270efcae64382d,b9efac79a5d7a24930b1429e884c0e8834954c07d71fbf65eb2c6ed9deeb4b86,e22a3c12a95f1f07a0efc398da7c39c4dfa75447f17a03184271cfb5a5c96878,38b9840b1b4424a90d4999dae44d5e84b91ca5ec9f9227019134b124e17d9365,e8938fb84352f04418c0004d647b83627f9a87ca6df5565acb3af41a5ae4e96a,0230a0c0692cb9a8a5ef678e43f6693c48798ca10cc18694beaffea4825d8ea2,df9656caee96c6307c2a5f1b8e7ccd5939ec5d5d20902865d6bea75c696ece8a,0826a9dd51b29e6c2a5fa4851b9901938766a966be238bde273b4e18d13d8f52,3b6f3cc0d0a263cac2542c2280f43f15fbcd5e84a8e381def4f85ead1f50fc1f,203d4d1fbd75126347c4d6f5507e9d0a3a3e7c882add72157a036c9dc4e66512,7390338a73bb575ba433c21c4f20046fc84e068569ae4dd646105a9a6a58847a,336dd7b5898bf4970a26b5b4a6fe676b5dcb8717e001c9b35bb77ef470b4a7aa,8a9664c99a6f9c834aa54c4a762a31e8047584637fc9062e5069c0aa72631424,f1c8980ccb671cdebf22a160a6e80d7e32fbaee249642d0542b0c200d49aba3c,53448154f4b36b94312be81822b1b5e50dccfdc79b32e2c22b16ccc6b7d578d3,f70a7b08f88830a74830a78e9cec3f8d232217b113cdda0c8999701ad03e8d9a,ebabcfaf537123853c1f4fe32663ab2b9940ca380a469c90b4335a3cd75ad845,f11b62e725abd3132689a08c414a9d8056306685ad579015234147ca8d951ef5,e8746cdb50ea505868f1b14a639befe60793e1b098595ada30da9dea8543f85e,d64f3d1df00b2499d8dfb70a7ec677b6254194c1cc6fbccf2a5de0a1554aa73b,bbc3769aeb96573e828bcb88d4043326422a486cd7408d673f55a74c2bceb905,89b3990c08d38bc4f157d83dc4a3de9daa22d47eefa2b8d2083b45e22d987059,befa5f82ba8c1e203827afdd525b1bff339db39bd687499e67cf4ea0ff1ea7da,35248acd0ed6d6a551b7e6bc46f5fb6c5e00e996021298370a3a6145e45557bc,bacccc0dddadfa4e5ce03565a4d60fbfa13e4c6df882b4c5380c63c2fed1c72a,c3482d84d0f68d7340aea787390aa271051697c9f6189e01c970ff18cc871113,d03111e4fcf3c5706acbcdf03408f27c392de6d622b6c587fdc01a15aac8511d,77d3c66add6417b3c82b33ffc4bd56f99f0e1f2ad6b50cb7dfa52cc20fbe53c6,de52618ddb2a0814d537e701065d093dd99b15ff8ed9df4a47fae47b36191144,e5b2c494f09c57fcc1a2f1c81b8bd543418561195c1b406ff0933c80bc43926c,290862b65579a5a9e7b7af38787aadd098db50c474fc8973f1d40935c2abdff8,4790aad6ef509672d5b51ba192b1465f4c7c8c8ed5575164e549502498cdc314,bf421d436ac5cac95ebe884d84c2bc10865b614ffda07ba5e47bcfb45d0cae68,44119bae5a9ad9707bf4ae45b986db6c14910549c134977cfe4a9722d8bb8413,8b66d6f823efce27b5dd4ef8df2e7c420f977683ad951e55117133c96d3a2fef,7950ef46b73ee87379ce9bdcc80e7fb5cb1e2a0550142d09772f5adb48990783,47900068bbfecf6e272a543101b24e3284cf97d20f10c83e0cef34fd3d7b8939,9b70918fe6fdc6b997251f8988b1e28b26fbcf5b00aa009b54ed6987954b1054,87e5fda75dab4f89646c832951c3ca0ee2ed7908eb67be8b7665bca0c11d4863,e2401111629a0f6b97c09b98cca394d653ef3b2b7b130e6dd97a1bd278be6fd3,513ab2a40f29de856e9e75f7f556384b5793b52630966e2572448201b4d91241,38ce4e383b82bba6324efe0b591a140e108a140d348964e12fe4095f1ec28836,10ecfdb05cccb69aac313df1b85b6e9a8d16239fc72b6ba01d54cb3a01367d23,63a2f5ba3d1e707b0d2e7143e6ae0b59d2db066c910d8dac1044282a7b414a2c,5358b5d792244a4a9cd76b1a53cecb72edd8ad86b150bee596bd111984f37c8d,f1472a16d28eeda10cde756bb0fc9b1edfd72086ad1b7ba848f3b2c7c0c1ba60,12e200388a96f0c880cf48e93b2ea96287b7295b64ca80618e0425bf57fefc12,ebcc48149e5fef8d883c2feab956bf116beaefe8ab9eb751ccf991036fbd21e2,0c40425718e03bb1dd82551fce54f4580e8220fea9f6d615b026698fd9669c80,4848690fc49a95c439cec58f89982b58840164815d953c8fa87ccaaab2bd1731,6a16bad26a7cc979a4f8e5eedbc80fcfd9ed7ecab91193becaff50f33efc28da,ebb1a01c03117dcb0aaea770106bbdeaab4977f48c996a4f099afeb1b2facfdf,01b214bd9fd35002db91584f4eaf2c6be48033f47e10de7b3688a8ec03c3ac76,7826ebc97a654bf788cb023f6be2dd87989948ed6c1459af75d66323ec609933,f5e1f76ada455535d638d72d5ef1026376845487d1b6f36a260e4c7e9695601c,3f7f2d5f5a5880ceb62584e53b591be6daea1c1256e40d08bcf800341c0f4998,81d396417b5c2f4fa3ba7ff9a549bcc4828c67023f02e312a1d2b04d6a0dc284,a038ade0998e9b9f9b8f6a6c07f1fcfd71a94c2cede2e008c01f20c5bcd8c951,440bf41f1820ae151a8b9b7d9929092506b9b37ff9008d25b420189f6c5fca13,3a84efff563cbf7b4d8d5cb263f4f5fe0b165d6489ef97cb5f027132637d5966,7424bde3031042dca9b2772420802729013620f0080339286714a1cb025819ff,7ce7ac17c0ee78366435633c0e6a7856a39191acdd31e0a4fb8ac805e34d46d3,aec871aab9cd61464a27bf28f20f9787d1487fc7db381755b446eaeda32bef95,1776c5cfe011cba0de6adedc058437199b5b4d022891b700ad34c253bf51f528,77c42978cbb6d4e9ea009bad225ce9c6b9628ef385b0e920d840fc717640c2a4,0234edb9221988c6f9926a02875e25f902636edf0352dba3119c80576f6d234a,a3982bc2e9fc9bf4ba8a557faf0fe3c87c7d70704cc34bb257ccce850a56df9c,1028d4888bcbd6de66991f55b05281908a43bd721999e52b864043e5b20a1b4e,1243e8b9d1f3f9faf60a3ef85df793a21cd32fe70be208daaa8b581ef2ce8e68,f126a0245767f09b0673b4db69cd15c21f5bd30db6a4bba8d1a31ea641d58b33,3f2c79cfe02d3997fceb691aeb35d7cd57de441b4cef6e30b9b962deef9c50b9,f5fa2ea7bb2b4c8c6ffc48161983f88bdd19be45a57fc98ff9c1fff82f801014,d8df89e0cdeb42bdc936da63cde0fb936f56dc234da63917663fd7372b7660e8,0e8b757308130fedef4420b79e3d3945e6f8d2d17850eed9309e4d130f654672,b997b5fc7ccd97a0539bda23185af6f510eeb5d73de4fcd6647784567295bc6d,a3e3ef6e658b4466bf2171c47455a80cc2bec6a90dcc1fb3390cf744eb53c1c7,8fcbfc5d27166c53d080f471d16f6bc8e8aebd92f0dad07de4b859495ff042e9,28a00715a1445747db570f4072a94bb51e3174665cc256982f68eb73ae373ea1,b9a85ace3beb1b30f5246b3226efd57c9f829799fe621585ee7835f55d390960,76f2d988a34611508881726f80b18430753a9bddaf239fa1e3ca248c07f563d1,810a984e20a8f0d9fea02b69a9d0d7ee64743d73c24919f060355c58221659db,ec0ceca541ac704ef78375ce66bae03e2ac7f948e14d0702702b5edd44431ed8,45c038cfcbe4bbaadb423bfb6d69aa166bc36444478eddf04dca330e747645df,66978f4b114af8a2c7bff35caddd57b0e34d4469422e1f5177d84efbc29e9f9c,68deee2f5ed12726ba48c143de86f5bfc6f52e42387b6b118bd6adc15c6398de,a0db86d2a0c9ce98a0e3e45bdcad8786af03bc8c616726b39e73514d242903fa,585814809fdc5504c535b33a7905c9eb1fa3fa49d614de3691714738ae50800c,1302a8f2dc151addb559c3078c9ff96e4d0c0830e741837ed7167acab0f9c665,4142bf0dad7aed829ce45f47b9dc7301c99ce48eddc44eb72bbcd790238e51df,7258b40d72fa503550edd920756c4a1707b73bdefcce5ea94e79077e215c2ac0,14e73a66c7000d5cb2e2814cae0efb467f7a7db3ff586781127d35755ee90dea,b0847a80927caf523b377dd8e6afbfd29d9d247489f5531492b52a1603efaf31,1fcbf67cb147f8550780d80e16f5a9e22e28d5fd73ad04c7eb05f089173f8e6e,4b7ef70b85443c71ed7d39c56825a8d6faacb85a4697cafa4945680a0ad3a9d3,5915da1266757108bc408ceeabd04a99c93f745af0462d1df9ac42384cca7e07,b3acef10f8a2f04d21dc8856c7e138f103dbdc5e6b34e6871b12eb2ec6907a18,8da8f353e95c27476094aa037c06d987f72ab08ea5927af07bdffd24467a5f68,0502db50a5bfbbfac71e959bd4f372a47e83ab6a17a255b0e60b402c122b3fc8,04ee807da45b9a2a8a1cdd0148e1babb794e9e7584c55f370a2f723a16632c2f,79ed422a442f7b3a6b194660ec90560b742b9ba018c2bedd72d6d5a60b332c5a,07fdacdd8c1909fa7042e20ffe2d5f5bfcdbdb59ebf3e11886d02a5f0fbc05ed,361e57a73aec8cacee32496094263948fbd6a9d96e731fafec127eb9fd813f26,c36e6c40c3035c5dc4d8f015363c4591dff5a0e2065aa719c751cdde1a81bcbc,9bac59d959407ea715e81eb23ce43cc88e462c5a25ce525a5dd7b417ad7ea7d9,8dc69bf8158365d866d999fe69b6a7bd869961bafd09863b30d7d6a114bfc5b8,b00f70f3daa8b95576f82c3e59ecdd8558029ee49fe3f726a39d06a1e8fffebe,7ea988c095c4107824bced289ab7d21136e81dddac6a57af836e639135a08e05,966476658b04905c11608c684e267508c9f875f90bb03178b6b4b93ec2f98f13,f2d19b603793cc43563223651b218f8e465f1bfbbc803ac0982e75c8424e12e9,87610850a33a00749627bbc7c6e0aeff65813378733563d05b09333ed445ed54,b980b9789136661518c8864a2caf5f5ef7564408d05391888d25695d6bae1c9b,5fd10e734dd73befd2506c7a4b3d9c453366788763933a32ae7c8a1cec69c000,420858c69ef2cc9b5077f786392fecefbbd76501a8843ca13755a8efbfe6c6d2,6c6dd279e6b135970fe3352b41771341ddb0da7b41b5347b53004970ca2a07d7,247bf14ff84a4c498caeb9aaf249d186db1f84e19363a1a3f118801a57ba09e6,2d568b421ddbe5486bee08dd6d1c584f3311eed85dc714aea72efbc8f26b1b66,274b1391e2d9c3416515ecc8d10061cd1918f9fa9b7e91c7e96934e9cb6bc8a1,25fb97b440fd5a8c2148b8301eadb6419c1350003e4d9f2956a9e782a3e898d1,2d1bf699f5a8f2c5b2817eda0ef641947c6abbe7382fb888194e1d5fdad09566,330b374790e6d56d65f871ceb5a1779bc9859ddc29fd7bfd0d2e2a36936d9e98,3ad6891a7801438b4c695915e33ab8b7601e7f96074425b4dfc81ac76d6d09fa,8936901fa82ce332b699810e836e5320b0a0c5a267be7d875f991607a4eae282,d96bffa8ce37e4148483ff508f2a60b6629938db37b26664be8f4de4e8f9be27,7b4fde34ebe05d8c5a6c7c9bf0caa3971173bbbb62450179db376c1183325c65,4e38a924326b672f732602e8b926997eaf815cb8d9552ca8b2d694d0ceb74621,8d88853e489365132031f1c19f96787bb7955fadf3a33210222260c41b46fee9,73c500ead65ef2286b5140e06deb05ec11c78caa32954452e9ac50f01d4b1574,a8fbe2c40d74d690018dcbac28ce03edac5e5078d86544f04d422cb94b2dcc5b,3070a2343f71b624450db8bbdfa58ad1d4f20d171120fad69163ff68d969b36e,c4b2f358fc2cf8d771f8adc21419ed06fb3c2eafb8aaaf57f9f0036b71b24a79,8b33b6c3935ba61868fe6c3cc82dc09cf8956ca401e4081bb9070caaecd54a00,2440f69ab8f6f3a40c2bb83c8c11fdfbb69b32c6fb92a8059fc53f72c90a0fe7,dcb1b291ea41f4aa8f4632f62cfb20860a55bbcccd5b865bb36a8c0868763493,77fe31a59eddd7b925605d0081ae357da852d2530c820db0eea6418f826270ec,5a48b14d87fe45c7ef72def490db5cba84626720dcba876037241568ce75eb0b,28282b12ce1bf020a380fff1d6276f20533530ecc1fe666744c7761e80bdf7bf,f7965deadf987642563ceb0afe231c0ba0656547a83c3b2c58eb101cfc3b6df2,75f75d426cf3b26ddcf9d81e37ab8ef4e9421820f35abeec77e89fe2f229c713,df4ad30a4d19080ef444e9b86bcb539bfde6b6172254e6348e1f8677a6f8a2ff,72d98f1549d8125c6f98aa65ce936d978b7e46761c7b738ff162098b97ca22b4,07fc641ee6efc88323ef2928b263822f66b8bc844fcf686e8b6b809cc55cb28f,6fe314848cf6b71e3dfb97e81c58e8a5cfdd5c95907beba0d80cc733e338fc4d,edbb054b6a58f073de56cb76b962686aa3285cf0061dc1274c95d7d6091b3b33,600b8c1e159b5a119a8f2856c9da15f0cc407a9440c28a9c930b93319080e11e,dedfa5adaadbb507df7acd1aff8bf15e792556ef5a20f7ed8f2f733b50a2a94c,266161aee785bfce4cd62bb7f373f7f6c5843042aec46851858b15be81f99c01,a27b39e042e6b6d8a409c02ef510e87bb4fcd6d17a583465f1e3bdef8fd5ff66,bedc14158770ae8dbc3cf5e095890c1ae813a71519a1599e12d318c109a03d73,eb6c718e060181374cbaf61401df3fe4795b5ea7d69071ca54db7ec46b5f39d5,1db3779583cd8ddfebc1c33b9554c259e73ce94f352c8b9dc65d91b945f42508,9d178e34adcadf94b206f0d04956160e3e6f1aa621ee7e901f43d5b4993a268d,6852d1772470588b412382efa795fd3839c0b5f0d5c73db60ace8d9f0654f5ac,c16d4d475f5bbf6b0fefe2c737538109175d619e6fbf84fe0ddffaa107f49624,4a2d53b4176333403f606c59b12561716543c596455de1883a1a08648cfe5633,0abf8530e6570ac69c068b160acc807b660331fb7f206267891772e05784f080,ea085e3675b4f1ee23aee81d920d14168f7740c4dae404f081263200c582d5e5,d1f88d59c10f517a00f8379fe0dd5ff60fca94e5e5a077432ffbb6a2b6f85a13,43a471ba0c43af7bc0e53f487585fc7e44a4262bb0eca400038a875430847ce9,6a9a40995191d5bc3bdb32b7ae6af6b2541e55576cfafcd97c9bcd95da4b5340,e28698e18e49e481b8a92b4102cb259584d81edf3f73468c5ca5509d5b5874b9,007b899ee4ad9cf389a4db03ed5ec69e8a2c4648cec328f0c669425089186604,8ae572d8a53847a30f5e9f2ac5d734341c2fac4fd8f574b2b9d9b24817d6e372,f857a1374f3cb2c80661ecadaf5d0e3622e72d77d266aa7ad2801e7db335b969,2e9eba7803798b99de5e59a3cb207ca53180326d7dddc4f80460ef1e3bca9f22,6d2d8fdc6bebd8bb5aebf5f4008856c427fc9b077cedef06d7cabdbb35230090,e88f5a8743a1e2cc24c07bf93d2566293ec90dc3016d6d561ac359f200afcd7c,73d8e522befb3985d72f69876a3bd5bfd656ef442af8db63f24e3802fbf7453e,09dc75bc71fad01c85dc0c7a2dd4594ae3883bf5ef8155cd2856638bf467842b,69f06e1c5773eddc50d89714a081fd26d6c271355f609d171d90f09fdb6ad311,1e8fcdd32d547ec02338d40cefd09b02b28a4ae8f8972a4fafa158107f6a890c,79dffd0030e1dd9af958fe233cbdf1959ff3d749d863da8b92bf6d2edcd114ad,e089dab3bb2519de80cf8666f589e183f4ddf80f8778282694632499c093aaad,2f342899b6e2505b72a25f7f507298b4cd5b0400f9d034d45a95fa86d127b171,5b6767fdff5a39d92eeb8415eec49f48b958e9c38151ce4356d09e43f8b397e9,a70b2878df44bd3952d9da43fea40bb475d2a87d21b8d5750c2153163af39c0a,4526593e49e532e8e498a8b14c3ca15c1749dfac9cf39a0b44b4c18ddc319440,118502524e8a02d7c7ee2cb984b598f27afb3b7b78b92326b2fbfc3c53f48464,8379f7dc2c391ac38ea1d34ddff36faf5602bf128b6d93a3a8a6485b1d8dc23f,0c17a500636a9a94b405b8e9f2fcd45b058a4a9070c156332e429daf0379572b,7e302ffccaacae442283c86d2afdf7c240d19dc42c41440419c8b78efdfc9dec,a19467bab0f5a753e4daadd080e64f13c79bdabd7e403575f9f3d3b7b6ca66fa,4162c48bb1ba5e8dd38518f9d1007300e46348e01a97184e253a3250ed0f9ffb,c1e36882f77da60283f64d2590e3389497e6583fcdb61c21d352d522506a8882,64a4716a19fd7b8009a5e6d5924a74c65ef8e5f85c64345c7b89a4e6b6135e5b,8136dbac064d798c9e30bf31e62d74f99ffb37d3bd9f3d6d3c6544669ca3cded,790f8dfbe56b27d1b82b00bf96394caa4ef54263229bf3ee5b2aa891ec8b5676,7d060a4e92f2c1f4cd2546f5409cae2c946b70556b249455dc19fb93e8dcdb9d,8e62713fc4972433c63b1c0c19cc1d291471381b11183b40e450263956a4d1f8,46255b9d4d2059337f3949e4ada5c2d16ab8385f66967291e204175aa2120986,49023745977f47f7439c701985905ad2be42b2a89c070df73ea8dc7f9c5ae627,75e6c4c28e4dedef545bbe58ea2b497dffc90ed7fe6d7261287e90cd85a3fcfa,fee9501fc25e4c85c0d205473426d6e6f4e02eca002eab6513c6467885486fab,77f39047575527668b8c86defb3a15328d6f6289ffb1dce1b01fd1c9f193f739,59e80ebb2f5424610ffc9070e39c64805a1d6a44f52993eaf0b427b3a8494b99,bfddb6b1867c2d0cf3ed074ce94fadc786226f28f98f9f1d7ac5bd6a1e040f9b,4c6aae8655346883ce266665e0c61461636a128c8804d6aca78f9c8a35356fbe,bf4462bc1f0c88cd99e30a20c6b6eeae09f7a17a737314192aac8b40056e90e1,f448286e1d5a998965efeed87d8feffd6ecc3fc0a9a8658730da10715324f89c,7619cfb410a5bb992e9da50699a6cdd82a0279e27176ebf4c1c21c12dea2459a,48395b0355072b681c77cf4684dfa228f4009c4985d013908539e34d306bb4d5,6fa9d11c314c5430db8ac179f7e1517d754781522b94f2da800a3d9db8a191be,79462eb8641df40ec28d7ae89ec7f1d5548b7b0316fb03da682726b35bfdcf7d,dbb07ef67043d85768c04c5c68e98a88685bd2785a3b20ba574403397fdcd33d,5be705a5717f0ad7688077b80765f8eac1be081d07105c7ab342db817461213e,0314be8e3cfcc6f00f5a0b3ce074f844f8126692bc9db1951df722379ca37622,b225bede76fe85a80c30ec258bcff80f9226fc3b3c07e1c75aa43e38968c85b0,ecceb05c114658703ee5bda417b23ecedffc67129d59b52a4fb60b9aad8624ee,56d6e51283d0da2e6aa6d8a166178aa5bf97c0d6ad8b6514a2b1a8701a890a54,274754307e41b8a6333f8f2d9bc679640fdeaa6954c94d91b022185d2e0f64ca,1c303f25b84f7f63fba0c97dd1ebf1148c1968658dca21b27df47ae2b86c4c2b,04638bdc28da59d45407c756701e4285ad0487858e92b2e45ccf99ffafaaf73f,ed4d011b44c9801335df5d3b5550977b11a1e78ec7ad1ebb477ad2eb707ddefe,333a3f0c920bf95d95cfaaa069a17ccfb0998ebc5697764788642ecb69c1746c,c6db8bfb6ee98557377bf8886a12c5784f613a53db3c09c161938039706941f4,25c3e1dcd0d27d63978adcefe9f862d9be8e20ed44bd80c359ffe99bc72fb095,035d2f21a40a3c5f97be226cb26e792130ba0d56dfe472b5cd9e1fd0b5d557f8,16411af320b57bac481c370cab692121e93edc942c2a6851c64737951a9594a7,43cc758c0134246a8a9e7db3f08a63709f0db02cb8431c21319e832845e3bdfe,3d9149f5c36eee7b661628d69b8d3e323b4fed8f544f8ca7b1bb575de94d465d,85ce96c84ff64f03e0c8b72dc9d6f2a4679c034836368345e22ffd0a170ad62f,2691d4f78bedcd4a6f6fa39c45a0109e4a11ce7603c656b53cca835d3863e06a,cbd21277046ea7f4572d6e8149077713575239ccf8a98c56b162b633a6490cf2,30335f29996cecf0747bf4e2b44f8ee3959e4cc277317d48e80f7726a85d87ef,afbde53c640182877df7eb5955d42669c5aa54e65ba304d6bdfb1be002cda374,d053a7b55ccdbf594d95fa053a1dd93d41a72e9c29b15b68e571e482d33277a4,3ae128f7b953405c2cd293c2e62a9c99914a7ed69d84c927c518bb9fc21b74d5,ab43d526f1dc6a32395c49806c8bc73bae918a5f3cb5fc1d0f99cc32e8d45867,7c5151e7116ff12d2325c9b2e98256e43802f6c4a15584be250aecbf143f50e3,5ee1a8ac394732056708b628216815b744eb5fefcff8426eb48d682ae7fe0bdb,e1f06ae08a52e1e4e7544d0ee343d33ba6ea5a71d7ce00c56a3f14058a199d78,771032904be77e19c389ae615a39e78aed70ae8e233edd8f3d5aafee1e4691df,cf0dfd60ef8f949ec0168439c7022546c5f00634e7fdd668900bcad1e2e81756,84bb868f3ec690f914e3a8cde683b55653e554bf5ae6516304ca95e3e0be0ce9,2e6bb4a91f7df30a0fe05ad3d02ea64b6a571a089ecd6e1a2caf900e5175949e,566cf7e6d6419fff93e8f18bd34b7fdb2db9b2d4191434e37a97e3a5cd00b186,912729b57611e1422879af83c5d11bb416c0b98fa83dc392bae590d7e90d5d12,54a7f54922ffc66260dcf30076c4cc7fa254cc9b830b2e37349d7b40f0d67231,d2cdfe1068809e2e519bec2fb30eff036085ed0fd5a174157f4a531be489a9c4,00c19bdcfabceeef4ab4c71251f41d59173c43b87ef0e968e7aa5bcf77fc3aa3,00a1b917cf86485c9e86030ec1afe9b7e28a4345f46471b92b4e0d08b698bae5,17b23ef7d38a3a0334ef68087a585ac48956984f6e0321c62d30011368954485,1fb0c2d4d015596c3439f405da4a7a2497ba94cdecb535e70cfda08c6a764f4f,993c1131175eb1f3b8b5d1d72ea5addac559a20b5154838ee86aa9b71e06652e,2ede50271add1f8aa5b91bcd222d83eecea7f4a524c9e62ec01cd889a55aad45,20ada1b4fe496096230fec2c00bff8a037db5079c6f45955317df9c2ede5f85b,b37b8821965b243026b83a59ea4e4e2246545fbcc1100d8effeca612a3b6bb4a,0760c516052f81058efd89aa11573c744ffd4f5685e11e9e200bd0ba0228ee34,fc3cc3b0dc5592a8c0a2e41d3ba995c0f65efbf2797c2b7b2403bd2c552acd64,0475e984bf932adabb1fe98d943ad23fd56e4bd53c2e7bbb12ea69b7996430be,d60ec04ea36dab7f685a2dc50c2f76ede60a6b594b15317d7e32d2438eef36ef,13dbd661bb4f0bc0854b761b94470f2c8d3ea069c2b2c53d07f40da9668515a2,875472cab949b679152079e79cd06ad376c30f4c298b2f7e191f5f7ef3aa1ccf,bfc95afeb7c01ea29780954bc62c9830af90e4a8882b64d24e65d7c30e075e48,4d100b664eee670a68d88d07bab4ca55dad28da862b2af631b29d5031920e10d,1275cde34b3de398a87fccd8bfa2261f826983ea774a0a413843f9de07beac70,b3cc121e4d7f7bc008ecd7d79b2f08d32c34c036c64678ae7cc43112b4297210,46a13985c51e2cae515be2a8f1eb0b42fea64cf366057a611cee74aaa7c648e3,df40e86985f66578e1ca70bea1c1a58b943c3b37bae49f639a547e759239513a,448cb5c2de497679de2161a93b5e0983a6030a33a59eee2b3171c56a93bc91d6,e6b371651baf1c9773ee1e240d51deda5f237e8da74048af9f3379f70f1c8e2f,d24ec5de76732220049843cf0ce87053bdfb223d8e45cdbf83a8d801ed486850,4131794225ae70468171aefddf3e5875a8ab294263ae4694f93a68e8314b0b5c,f5958acf10e9d5f12d9b0349bda1e652273977c36e1ad59c383bbfb512abcac9,19dea7117e47e557bca2019c09173879bde7a9703e7577ec5bf2270fec6aca6e,3cc640e6348efd77de2a22367f609c2f68551d4cb917f27c32c2dbc422827dfa,61d21b2cb4586c4ce3178f6ea51d905d9d00d79d85ccea52e5f4223811e12a44,44e06b75ecca6b3a9f91813c716c0f61f5990f498c5ed17a41ddfcdc0db48368,8da1c8bd377bb3892265639b26a72b7780393a8a43f6471a5eb1abd1ec88ef3d,f5e58a733b69af1ef5fe8a9a580b3790a792e44ad32a29e98d9f7f142862b298,d1e1dc03f1d6d75da644b8a14f8e7d3906b47d50968273f0707142bdd810de1c,d1869756e1200628a18e401e9510a9f78604ce91faf67c2e759a7b28c6eb882f,60dca01fbd010aef036b6ba742978ebacd1c49ba999e06f1b7985c5c0e96055f,c731ad94fa972ca5a7bc709d2cccf187ba47bc6299dcf3301b62990064e04fa2,d1cffa5c6c044dd22a8a0990545ac7bf5edf04b38820230af853949612ef7075,cc351a659c1718306c90276e7a58697709b69d2dd06af2dec6891ac77ac62a3c,82738ee011e454410ea714fbeccad19fe15dba4e62b7d1b85e65e7f8ed2e6286,2d2f067acea2451a17ad0f2beeefcc768dbf52a01f437a5066f49fac1d3eb312,fabad1b8e1b3a3e11810c408f748a7e70449f4274aaaaaf69b11ffeaff1504e7,4ab824b1479ec872488f501374e22488e0b8b4612ea16cca5208783016af9858,1b5dcad92079e86412309d5f85b01631a7aa3d7eda261080531cdeb89c96bcdb,a1809967d96449a3535d19e509fc3ae58b714805141f6487aaf06a7b00f47dc2,081fde0ec6f26348e2626daf44d932bc31d3ac3cc6546061484f9f68b0499422,c3d10191066b94c7a89f91f75fc9aea86e17ac5894fecb8c0698957771d196da,b5474f0aebab60ca12d4f8097a499f3fc063ad6146eb6db4191bc05ce82312ed,147a78e0d0d68aa642b97ba83e7b45ff5b367341f0a0a4f551f593f3ed8855db,47b2514697f7793be6f9ed37ff3cee74a4d1a3012d468c6069c50b6681ec07d1,d59ee71f32fc530efbc54952356a1e564e7fb077b9323bc032f6cacd7ed47917,f0c7fa099c97483728d04f577f5b1462443136e52b9434b5875e00984eab9fc6,a8d103d654099371f1a97f34cfe997683000cf2e7a525376d6af1ac2b75d71ac,cc5f68d406097c09e8d86b667213f52b77d3e0e543c86e3dbede40e8c1f7490d,b495595a4d94415ad9e3c6fbcb8589ddbaffa7d0c9077fcfe261efecc76bc957,f4359ca550fc3fd61f08b20e7714d37f1ea257a2d548fcc6a40cbf1bbc4bfc2b"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"+js80kBWx0Ns2gZG1GjkvYIyMZNgxfilXxAMTc5p2TdamqoRHzTudr0wMJn8/XcuwSle18vFCrm7iN1dqI7mYw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/staging/v3/raffle","func":"UploadCodes","args":["a657602fc08191e7a4e0255a818a0ec544c8ce0826fe9ecf0c47eb538b2a9920,e4ce35fc370cb77c8416d6cf248e406c3f41073955d2d1c46dfcde630437711c,d1c73632a00861c2a57502edcc7105df21e22f6f4764e07dbd76c1dd456fd763,5e9a113e15140d8e7ec30a70d999038970da4dc84b8517fdf93d8eba56b4f4cd,d0a8e682db50c4b5f16dbb1c206cc8086f58094642d5864db8cd5feaefff0eae,6d0d8c67778d4ea8ac5ed234c12075b7ccb96350ea84711f455eb1538ac30025,e287bbe122d9be4c90d2fc62e51abbc67de50f6c8044636a61e7f801081ba907,6c4567fdd88ee306f715eac751010b5ef8a66bab66258e580be4915898b1dfaa,85463175e47915820c55acbc2531eaf360a8c0586c3b59cbbf270efcae64382d,b9efac79a5d7a24930b1429e884c0e8834954c07d71fbf65eb2c6ed9deeb4b86,e22a3c12a95f1f07a0efc398da7c39c4dfa75447f17a03184271cfb5a5c96878,38b9840b1b4424a90d4999dae44d5e84b91ca5ec9f9227019134b124e17d9365,e8938fb84352f04418c0004d647b83627f9a87ca6df5565acb3af41a5ae4e96a,0230a0c0692cb9a8a5ef678e43f6693c48798ca10cc18694beaffea4825d8ea2,df9656caee96c6307c2a5f1b8e7ccd5939ec5d5d20902865d6bea75c696ece8a,0826a9dd51b29e6c2a5fa4851b9901938766a966be238bde273b4e18d13d8f52,3b6f3cc0d0a263cac2542c2280f43f15fbcd5e84a8e381def4f85ead1f50fc1f,203d4d1fbd75126347c4d6f5507e9d0a3a3e7c882add72157a036c9dc4e66512,7390338a73bb575ba433c21c4f20046fc84e068569ae4dd646105a9a6a58847a,336dd7b5898bf4970a26b5b4a6fe676b5dcb8717e001c9b35bb77ef470b4a7aa,8a9664c99a6f9c834aa54c4a762a31e8047584637fc9062e5069c0aa72631424,f1c8980ccb671cdebf22a160a6e80d7e32fbaee249642d0542b0c200d49aba3c,53448154f4b36b94312be81822b1b5e50dccfdc79b32e2c22b16ccc6b7d578d3,f70a7b08f88830a74830a78e9cec3f8d232217b113cdda0c8999701ad03e8d9a,ebabcfaf537123853c1f4fe32663ab2b9940ca380a469c90b4335a3cd75ad845,f11b62e725abd3132689a08c414a9d8056306685ad579015234147ca8d951ef5,e8746cdb50ea505868f1b14a639befe60793e1b098595ada30da9dea8543f85e,d64f3d1df00b2499d8dfb70a7ec677b6254194c1cc6fbccf2a5de0a1554aa73b,bbc3769aeb96573e828bcb88d4043326422a486cd7408d673f55a74c2bceb905,89b3990c08d38bc4f157d83dc4a3de9daa22d47eefa2b8d2083b45e22d987059,befa5f82ba8c1e203827afdd525b1bff339db39bd687499e67cf4ea0ff1ea7da,35248acd0ed6d6a551b7e6bc46f5fb6c5e00e996021298370a3a6145e45557bc,bacccc0dddadfa4e5ce03565a4d60fbfa13e4c6df882b4c5380c63c2fed1c72a,c3482d84d0f68d7340aea787390aa271051697c9f6189e01c970ff18cc871113,d03111e4fcf3c5706acbcdf03408f27c392de6d622b6c587fdc01a15aac8511d,77d3c66add6417b3c82b33ffc4bd56f99f0e1f2ad6b50cb7dfa52cc20fbe53c6,de52618ddb2a0814d537e701065d093dd99b15ff8ed9df4a47fae47b36191144,e5b2c494f09c57fcc1a2f1c81b8bd543418561195c1b406ff0933c80bc43926c,290862b65579a5a9e7b7af38787aadd098db50c474fc8973f1d40935c2abdff8,4790aad6ef509672d5b51ba192b1465f4c7c8c8ed5575164e549502498cdc314,bf421d436ac5cac95ebe884d84c2bc10865b614ffda07ba5e47bcfb45d0cae68,44119bae5a9ad9707bf4ae45b986db6c14910549c134977cfe4a9722d8bb8413,8b66d6f823efce27b5dd4ef8df2e7c420f977683ad951e55117133c96d3a2fef,7950ef46b73ee87379ce9bdcc80e7fb5cb1e2a0550142d09772f5adb48990783,47900068bbfecf6e272a543101b24e3284cf97d20f10c83e0cef34fd3d7b8939,9b70918fe6fdc6b997251f8988b1e28b26fbcf5b00aa009b54ed6987954b1054,87e5fda75dab4f89646c832951c3ca0ee2ed7908eb67be8b7665bca0c11d4863,e2401111629a0f6b97c09b98cca394d653ef3b2b7b130e6dd97a1bd278be6fd3,513ab2a40f29de856e9e75f7f556384b5793b52630966e2572448201b4d91241,38ce4e383b82bba6324efe0b591a140e108a140d348964e12fe4095f1ec28836,10ecfdb05cccb69aac313df1b85b6e9a8d16239fc72b6ba01d54cb3a01367d23,63a2f5ba3d1e707b0d2e7143e6ae0b59d2db066c910d8dac1044282a7b414a2c,5358b5d792244a4a9cd76b1a53cecb72edd8ad86b150bee596bd111984f37c8d,f1472a16d28eeda10cde756bb0fc9b1edfd72086ad1b7ba848f3b2c7c0c1ba60,12e200388a96f0c880cf48e93b2ea96287b7295b64ca80618e0425bf57fefc12,ebcc48149e5fef8d883c2feab956bf116beaefe8ab9eb751ccf991036fbd21e2,0c40425718e03bb1dd82551fce54f4580e8220fea9f6d615b026698fd9669c80,4848690fc49a95c439cec58f89982b58840164815d953c8fa87ccaaab2bd1731,6a16bad26a7cc979a4f8e5eedbc80fcfd9ed7ecab91193becaff50f33efc28da,ebb1a01c03117dcb0aaea770106bbdeaab4977f48c996a4f099afeb1b2facfdf,01b214bd9fd35002db91584f4eaf2c6be48033f47e10de7b3688a8ec03c3ac76,7826ebc97a654bf788cb023f6be2dd87989948ed6c1459af75d66323ec609933,f5e1f76ada455535d638d72d5ef1026376845487d1b6f36a260e4c7e9695601c,3f7f2d5f5a5880ceb62584e53b591be6daea1c1256e40d08bcf800341c0f4998,81d396417b5c2f4fa3ba7ff9a549bcc4828c67023f02e312a1d2b04d6a0dc284,a038ade0998e9b9f9b8f6a6c07f1fcfd71a94c2cede2e008c01f20c5bcd8c951,440bf41f1820ae151a8b9b7d9929092506b9b37ff9008d25b420189f6c5fca13,3a84efff563cbf7b4d8d5cb263f4f5fe0b165d6489ef97cb5f027132637d5966,7424bde3031042dca9b2772420802729013620f0080339286714a1cb025819ff,7ce7ac17c0ee78366435633c0e6a7856a39191acdd31e0a4fb8ac805e34d46d3,aec871aab9cd61464a27bf28f20f9787d1487fc7db381755b446eaeda32bef95,1776c5cfe011cba0de6adedc058437199b5b4d022891b700ad34c253bf51f528,77c42978cbb6d4e9ea009bad225ce9c6b9628ef385b0e920d840fc717640c2a4,0234edb9221988c6f9926a02875e25f902636edf0352dba3119c80576f6d234a,a3982bc2e9fc9bf4ba8a557faf0fe3c87c7d70704cc34bb257ccce850a56df9c,1028d4888bcbd6de66991f55b05281908a43bd721999e52b864043e5b20a1b4e,1243e8b9d1f3f9faf60a3ef85df793a21cd32fe70be208daaa8b581ef2ce8e68,f126a0245767f09b0673b4db69cd15c21f5bd30db6a4bba8d1a31ea641d58b33,3f2c79cfe02d3997fceb691aeb35d7cd57de441b4cef6e30b9b962deef9c50b9,f5fa2ea7bb2b4c8c6ffc48161983f88bdd19be45a57fc98ff9c1fff82f801014,d8df89e0cdeb42bdc936da63cde0fb936f56dc234da63917663fd7372b7660e8,0e8b757308130fedef4420b79e3d3945e6f8d2d17850eed9309e4d130f654672,b997b5fc7ccd97a0539bda23185af6f510eeb5d73de4fcd6647784567295bc6d,a3e3ef6e658b4466bf2171c47455a80cc2bec6a90dcc1fb3390cf744eb53c1c7,8fcbfc5d27166c53d080f471d16f6bc8e8aebd92f0dad07de4b859495ff042e9,28a00715a1445747db570f4072a94bb51e3174665cc256982f68eb73ae373ea1,b9a85ace3beb1b30f5246b3226efd57c9f829799fe621585ee7835f55d390960,76f2d988a34611508881726f80b18430753a9bddaf239fa1e3ca248c07f563d1,810a984e20a8f0d9fea02b69a9d0d7ee64743d73c24919f060355c58221659db,ec0ceca541ac704ef78375ce66bae03e2ac7f948e14d0702702b5edd44431ed8,45c038cfcbe4bbaadb423bfb6d69aa166bc36444478eddf04dca330e747645df,66978f4b114af8a2c7bff35caddd57b0e34d4469422e1f5177d84efbc29e9f9c,68deee2f5ed12726ba48c143de86f5bfc6f52e42387b6b118bd6adc15c6398de,a0db86d2a0c9ce98a0e3e45bdcad8786af03bc8c616726b39e73514d242903fa,585814809fdc5504c535b33a7905c9eb1fa3fa49d614de3691714738ae50800c,1302a8f2dc151addb559c3078c9ff96e4d0c0830e741837ed7167acab0f9c665,4142bf0dad7aed829ce45f47b9dc7301c99ce48eddc44eb72bbcd790238e51df,7258b40d72fa503550edd920756c4a1707b73bdefcce5ea94e79077e215c2ac0,14e73a66c7000d5cb2e2814cae0efb467f7a7db3ff586781127d35755ee90dea,b0847a80927caf523b377dd8e6afbfd29d9d247489f5531492b52a1603efaf31,1fcbf67cb147f8550780d80e16f5a9e22e28d5fd73ad04c7eb05f089173f8e6e,4b7ef70b85443c71ed7d39c56825a8d6faacb85a4697cafa4945680a0ad3a9d3,5915da1266757108bc408ceeabd04a99c93f745af0462d1df9ac42384cca7e07,b3acef10f8a2f04d21dc8856c7e138f103dbdc5e6b34e6871b12eb2ec6907a18,8da8f353e95c27476094aa037c06d987f72ab08ea5927af07bdffd24467a5f68,0502db50a5bfbbfac71e959bd4f372a47e83ab6a17a255b0e60b402c122b3fc8,04ee807da45b9a2a8a1cdd0148e1babb794e9e7584c55f370a2f723a16632c2f,79ed422a442f7b3a6b194660ec90560b742b9ba018c2bedd72d6d5a60b332c5a,07fdacdd8c1909fa7042e20ffe2d5f5bfcdbdb59ebf3e11886d02a5f0fbc05ed,361e57a73aec8cacee32496094263948fbd6a9d96e731fafec127eb9fd813f26,c36e6c40c3035c5dc4d8f015363c4591dff5a0e2065aa719c751cdde1a81bcbc,9bac59d959407ea715e81eb23ce43cc88e462c5a25ce525a5dd7b417ad7ea7d9,8dc69bf8158365d866d999fe69b6a7bd869961bafd09863b30d7d6a114bfc5b8,b00f70f3daa8b95576f82c3e59ecdd8558029ee49fe3f726a39d06a1e8fffebe,7ea988c095c4107824bced289ab7d21136e81dddac6a57af836e639135a08e05,966476658b04905c11608c684e267508c9f875f90bb03178b6b4b93ec2f98f13,f2d19b603793cc43563223651b218f8e465f1bfbbc803ac0982e75c8424e12e9,87610850a33a00749627bbc7c6e0aeff65813378733563d05b09333ed445ed54,b980b9789136661518c8864a2caf5f5ef7564408d05391888d25695d6bae1c9b,5fd10e734dd73befd2506c7a4b3d9c453366788763933a32ae7c8a1cec69c000,420858c69ef2cc9b5077f786392fecefbbd76501a8843ca13755a8efbfe6c6d2,6c6dd279e6b135970fe3352b41771341ddb0da7b41b5347b53004970ca2a07d7,247bf14ff84a4c498caeb9aaf249d186db1f84e19363a1a3f118801a57ba09e6,2d568b421ddbe5486bee08dd6d1c584f3311eed85dc714aea72efbc8f26b1b66,274b1391e2d9c3416515ecc8d10061cd1918f9fa9b7e91c7e96934e9cb6bc8a1,25fb97b440fd5a8c2148b8301eadb6419c1350003e4d9f2956a9e782a3e898d1,2d1bf699f5a8f2c5b2817eda0ef641947c6abbe7382fb888194e1d5fdad09566,330b374790e6d56d65f871ceb5a1779bc9859ddc29fd7bfd0d2e2a36936d9e98,3ad6891a7801438b4c695915e33ab8b7601e7f96074425b4dfc81ac76d6d09fa,8936901fa82ce332b699810e836e5320b0a0c5a267be7d875f991607a4eae282,d96bffa8ce37e4148483ff508f2a60b6629938db37b26664be8f4de4e8f9be27,7b4fde34ebe05d8c5a6c7c9bf0caa3971173bbbb62450179db376c1183325c65,4e38a924326b672f732602e8b926997eaf815cb8d9552ca8b2d694d0ceb74621,8d88853e489365132031f1c19f96787bb7955fadf3a33210222260c41b46fee9,73c500ead65ef2286b5140e06deb05ec11c78caa32954452e9ac50f01d4b1574,a8fbe2c40d74d690018dcbac28ce03edac5e5078d86544f04d422cb94b2dcc5b,3070a2343f71b624450db8bbdfa58ad1d4f20d171120fad69163ff68d969b36e,c4b2f358fc2cf8d771f8adc21419ed06fb3c2eafb8aaaf57f9f0036b71b24a79,8b33b6c3935ba61868fe6c3cc82dc09cf8956ca401e4081bb9070caaecd54a00,2440f69ab8f6f3a40c2bb83c8c11fdfbb69b32c6fb92a8059fc53f72c90a0fe7,dcb1b291ea41f4aa8f4632f62cfb20860a55bbcccd5b865bb36a8c0868763493,77fe31a59eddd7b925605d0081ae357da852d2530c820db0eea6418f826270ec,5a48b14d87fe45c7ef72def490db5cba84626720dcba876037241568ce75eb0b,28282b12ce1bf020a380fff1d6276f20533530ecc1fe666744c7761e80bdf7bf,f7965deadf987642563ceb0afe231c0ba0656547a83c3b2c58eb101cfc3b6df2,75f75d426cf3b26ddcf9d81e37ab8ef4e9421820f35abeec77e89fe2f229c713,df4ad30a4d19080ef444e9b86bcb539bfde6b6172254e6348e1f8677a6f8a2ff,72d98f1549d8125c6f98aa65ce936d978b7e46761c7b738ff162098b97ca22b4,07fc641ee6efc88323ef2928b263822f66b8bc844fcf686e8b6b809cc55cb28f,6fe314848cf6b71e3dfb97e81c58e8a5cfdd5c95907beba0d80cc733e338fc4d,edbb054b6a58f073de56cb76b962686aa3285cf0061dc1274c95d7d6091b3b33,600b8c1e159b5a119a8f2856c9da15f0cc407a9440c28a9c930b93319080e11e,dedfa5adaadbb507df7acd1aff8bf15e792556ef5a20f7ed8f2f733b50a2a94c,266161aee785bfce4cd62bb7f373f7f6c5843042aec46851858b15be81f99c01,a27b39e042e6b6d8a409c02ef510e87bb4fcd6d17a583465f1e3bdef8fd5ff66,bedc14158770ae8dbc3cf5e095890c1ae813a71519a1599e12d318c109a03d73,eb6c718e060181374cbaf61401df3fe4795b5ea7d69071ca54db7ec46b5f39d5,1db3779583cd8ddfebc1c33b9554c259e73ce94f352c8b9dc65d91b945f42508,9d178e34adcadf94b206f0d04956160e3e6f1aa621ee7e901f43d5b4993a268d,6852d1772470588b412382efa795fd3839c0b5f0d5c73db60ace8d9f0654f5ac,c16d4d475f5bbf6b0fefe2c737538109175d619e6fbf84fe0ddffaa107f49624,4a2d53b4176333403f606c59b12561716543c596455de1883a1a08648cfe5633,0abf8530e6570ac69c068b160acc807b660331fb7f206267891772e05784f080,ea085e3675b4f1ee23aee81d920d14168f7740c4dae404f081263200c582d5e5,d1f88d59c10f517a00f8379fe0dd5ff60fca94e5e5a077432ffbb6a2b6f85a13,43a471ba0c43af7bc0e53f487585fc7e44a4262bb0eca400038a875430847ce9,6a9a40995191d5bc3bdb32b7ae6af6b2541e55576cfafcd97c9bcd95da4b5340,e28698e18e49e481b8a92b4102cb259584d81edf3f73468c5ca5509d5b5874b9,007b899ee4ad9cf389a4db03ed5ec69e8a2c4648cec328f0c669425089186604,8ae572d8a53847a30f5e9f2ac5d734341c2fac4fd8f574b2b9d9b24817d6e372,f857a1374f3cb2c80661ecadaf5d0e3622e72d77d266aa7ad2801e7db335b969,2e9eba7803798b99de5e59a3cb207ca53180326d7dddc4f80460ef1e3bca9f22,6d2d8fdc6bebd8bb5aebf5f4008856c427fc9b077cedef06d7cabdbb35230090,e88f5a8743a1e2cc24c07bf93d2566293ec90dc3016d6d561ac359f200afcd7c,73d8e522befb3985d72f69876a3bd5bfd656ef442af8db63f24e3802fbf7453e,09dc75bc71fad01c85dc0c7a2dd4594ae3883bf5ef8155cd2856638bf467842b,69f06e1c5773eddc50d89714a081fd26d6c271355f609d171d90f09fdb6ad311,1e8fcdd32d547ec02338d40cefd09b02b28a4ae8f8972a4fafa158107f6a890c,79dffd0030e1dd9af958fe233cbdf1959ff3d749d863da8b92bf6d2edcd114ad,e089dab3bb2519de80cf8666f589e183f4ddf80f8778282694632499c093aaad,2f342899b6e2505b72a25f7f507298b4cd5b0400f9d034d45a95fa86d127b171,5b6767fdff5a39d92eeb8415eec49f48b958e9c38151ce4356d09e43f8b397e9,a70b2878df44bd3952d9da43fea40bb475d2a87d21b8d5750c2153163af39c0a,4526593e49e532e8e498a8b14c3ca15c1749dfac9cf39a0b44b4c18ddc319440,118502524e8a02d7c7ee2cb984b598f27afb3b7b78b92326b2fbfc3c53f48464,8379f7dc2c391ac38ea1d34ddff36faf5602bf128b6d93a3a8a6485b1d8dc23f,0c17a500636a9a94b405b8e9f2fcd45b058a4a9070c156332e429daf0379572b,7e302ffccaacae442283c86d2afdf7c240d19dc42c41440419c8b78efdfc9dec,a19467bab0f5a753e4daadd080e64f13c79bdabd7e403575f9f3d3b7b6ca66fa,4162c48bb1ba5e8dd38518f9d1007300e46348e01a97184e253a3250ed0f9ffb,c1e36882f77da60283f64d2590e3389497e6583fcdb61c21d352d522506a8882,64a4716a19fd7b8009a5e6d5924a74c65ef8e5f85c64345c7b89a4e6b6135e5b,8136dbac064d798c9e30bf31e62d74f99ffb37d3bd9f3d6d3c6544669ca3cded,790f8dfbe56b27d1b82b00bf96394caa4ef54263229bf3ee5b2aa891ec8b5676,7d060a4e92f2c1f4cd2546f5409cae2c946b70556b249455dc19fb93e8dcdb9d,8e62713fc4972433c63b1c0c19cc1d291471381b11183b40e450263956a4d1f8,46255b9d4d2059337f3949e4ada5c2d16ab8385f66967291e204175aa2120986,49023745977f47f7439c701985905ad2be42b2a89c070df73ea8dc7f9c5ae627,75e6c4c28e4dedef545bbe58ea2b497dffc90ed7fe6d7261287e90cd85a3fcfa,fee9501fc25e4c85c0d205473426d6e6f4e02eca002eab6513c6467885486fab,77f39047575527668b8c86defb3a15328d6f6289ffb1dce1b01fd1c9f193f739,59e80ebb2f5424610ffc9070e39c64805a1d6a44f52993eaf0b427b3a8494b99,bfddb6b1867c2d0cf3ed074ce94fadc786226f28f98f9f1d7ac5bd6a1e040f9b,4c6aae8655346883ce266665e0c61461636a128c8804d6aca78f9c8a35356fbe,bf4462bc1f0c88cd99e30a20c6b6eeae09f7a17a737314192aac8b40056e90e1,f448286e1d5a998965efeed87d8feffd6ecc3fc0a9a8658730da10715324f89c,7619cfb410a5bb992e9da50699a6cdd82a0279e27176ebf4c1c21c12dea2459a,48395b0355072b681c77cf4684dfa228f4009c4985d013908539e34d306bb4d5,6fa9d11c314c5430db8ac179f7e1517d754781522b94f2da800a3d9db8a191be,79462eb8641df40ec28d7ae89ec7f1d5548b7b0316fb03da682726b35bfdcf7d,dbb07ef67043d85768c04c5c68e98a88685bd2785a3b20ba574403397fdcd33d,5be705a5717f0ad7688077b80765f8eac1be081d07105c7ab342db817461213e,0314be8e3cfcc6f00f5a0b3ce074f844f8126692bc9db1951df722379ca37622,b225bede76fe85a80c30ec258bcff80f9226fc3b3c07e1c75aa43e38968c85b0,ecceb05c114658703ee5bda417b23ecedffc67129d59b52a4fb60b9aad8624ee,56d6e51283d0da2e6aa6d8a166178aa5bf97c0d6ad8b6514a2b1a8701a890a54,274754307e41b8a6333f8f2d9bc679640fdeaa6954c94d91b022185d2e0f64ca,1c303f25b84f7f63fba0c97dd1ebf1148c1968658dca21b27df47ae2b86c4c2b,04638bdc28da59d45407c756701e4285ad0487858e92b2e45ccf99ffafaaf73f,ed4d011b44c9801335df5d3b5550977b11a1e78ec7ad1ebb477ad2eb707ddefe,333a3f0c920bf95d95cfaaa069a17ccfb0998ebc5697764788642ecb69c1746c,c6db8bfb6ee98557377bf8886a12c5784f613a53db3c09c161938039706941f4,25c3e1dcd0d27d63978adcefe9f862d9be8e20ed44bd80c359ffe99bc72fb095,035d2f21a40a3c5f97be226cb26e792130ba0d56dfe472b5cd9e1fd0b5d557f8,16411af320b57bac481c370cab692121e93edc942c2a6851c64737951a9594a7,43cc758c0134246a8a9e7db3f08a63709f0db02cb8431c21319e832845e3bdfe,3d9149f5c36eee7b661628d69b8d3e323b4fed8f544f8ca7b1bb575de94d465d,85ce96c84ff64f03e0c8b72dc9d6f2a4679c034836368345e22ffd0a170ad62f,2691d4f78bedcd4a6f6fa39c45a0109e4a11ce7603c656b53cca835d3863e06a,cbd21277046ea7f4572d6e8149077713575239ccf8a98c56b162b633a6490cf2,30335f29996cecf0747bf4e2b44f8ee3959e4cc277317d48e80f7726a85d87ef,afbde53c640182877df7eb5955d42669c5aa54e65ba304d6bdfb1be002cda374,d053a7b55ccdbf594d95fa053a1dd93d41a72e9c29b15b68e571e482d33277a4,3ae128f7b953405c2cd293c2e62a9c99914a7ed69d84c927c518bb9fc21b74d5,ab43d526f1dc6a32395c49806c8bc73bae918a5f3cb5fc1d0f99cc32e8d45867,7c5151e7116ff12d2325c9b2e98256e43802f6c4a15584be250aecbf143f50e3,5ee1a8ac394732056708b628216815b744eb5fefcff8426eb48d682ae7fe0bdb,e1f06ae08a52e1e4e7544d0ee343d33ba6ea5a71d7ce00c56a3f14058a199d78,771032904be77e19c389ae615a39e78aed70ae8e233edd8f3d5aafee1e4691df,cf0dfd60ef8f949ec0168439c7022546c5f00634e7fdd668900bcad1e2e81756,84bb868f3ec690f914e3a8cde683b55653e554bf5ae6516304ca95e3e0be0ce9,2e6bb4a91f7df30a0fe05ad3d02ea64b6a571a089ecd6e1a2caf900e5175949e,566cf7e6d6419fff93e8f18bd34b7fdb2db9b2d4191434e37a97e3a5cd00b186,912729b57611e1422879af83c5d11bb416c0b98fa83dc392bae590d7e90d5d12,54a7f54922ffc66260dcf30076c4cc7fa254cc9b830b2e37349d7b40f0d67231,d2cdfe1068809e2e519bec2fb30eff036085ed0fd5a174157f4a531be489a9c4,00c19bdcfabceeef4ab4c71251f41d59173c43b87ef0e968e7aa5bcf77fc3aa3,00a1b917cf86485c9e86030ec1afe9b7e28a4345f46471b92b4e0d08b698bae5,17b23ef7d38a3a0334ef68087a585ac48956984f6e0321c62d30011368954485,1fb0c2d4d015596c3439f405da4a7a2497ba94cdecb535e70cfda08c6a764f4f,993c1131175eb1f3b8b5d1d72ea5addac559a20b5154838ee86aa9b71e06652e,2ede50271add1f8aa5b91bcd222d83eecea7f4a524c9e62ec01cd889a55aad45,20ada1b4fe496096230fec2c00bff8a037db5079c6f45955317df9c2ede5f85b,b37b8821965b243026b83a59ea4e4e2246545fbcc1100d8effeca612a3b6bb4a,0760c516052f81058efd89aa11573c744ffd4f5685e11e9e200bd0ba0228ee34,fc3cc3b0dc5592a8c0a2e41d3ba995c0f65efbf2797c2b7b2403bd2c552acd64,0475e984bf932adabb1fe98d943ad23fd56e4bd53c2e7bbb12ea69b7996430be,d60ec04ea36dab7f685a2dc50c2f76ede60a6b594b15317d7e32d2438eef36ef,13dbd661bb4f0bc0854b761b94470f2c8d3ea069c2b2c53d07f40da9668515a2,875472cab949b679152079e79cd06ad376c30f4c298b2f7e191f5f7ef3aa1ccf,bfc95afeb7c01ea29780954bc62c9830af90e4a8882b64d24e65d7c30e075e48,4d100b664eee670a68d88d07bab4ca55dad28da862b2af631b29d5031920e10d,1275cde34b3de398a87fccd8bfa2261f826983ea774a0a413843f9de07beac70,b3cc121e4d7f7bc008ecd7d79b2f08d32c34c036c64678ae7cc43112b4297210,46a13985c51e2cae515be2a8f1eb0b42fea64cf366057a611cee74aaa7c648e3,df40e86985f66578e1ca70bea1c1a58b943c3b37bae49f639a547e759239513a,448cb5c2de497679de2161a93b5e0983a6030a33a59eee2b3171c56a93bc91d6,e6b371651baf1c9773ee1e240d51deda5f237e8da74048af9f3379f70f1c8e2f,d24ec5de76732220049843cf0ce87053bdfb223d8e45cdbf83a8d801ed486850,4131794225ae70468171aefddf3e5875a8ab294263ae4694f93a68e8314b0b5c,f5958acf10e9d5f12d9b0349bda1e652273977c36e1ad59c383bbfb512abcac9,19dea7117e47e557bca2019c09173879bde7a9703e7577ec5bf2270fec6aca6e,3cc640e6348efd77de2a22367f609c2f68551d4cb917f27c32c2dbc422827dfa,61d21b2cb4586c4ce3178f6ea51d905d9d00d79d85ccea52e5f4223811e12a44,44e06b75ecca6b3a9f91813c716c0f61f5990f498c5ed17a41ddfcdc0db48368,8da1c8bd377bb3892265639b26a72b7780393a8a43f6471a5eb1abd1ec88ef3d,f5e58a733b69af1ef5fe8a9a580b3790a792e44ad32a29e98d9f7f142862b298,d1e1dc03f1d6d75da644b8a14f8e7d3906b47d50968273f0707142bdd810de1c,d1869756e1200628a18e401e9510a9f78604ce91faf67c2e759a7b28c6eb882f,60dca01fbd010aef036b6ba742978ebacd1c49ba999e06f1b7985c5c0e96055f,c731ad94fa972ca5a7bc709d2cccf187ba47bc6299dcf3301b62990064e04fa2,d1cffa5c6c044dd22a8a0990545ac7bf5edf04b38820230af853949612ef7075,cc351a659c1718306c90276e7a58697709b69d2dd06af2dec6891ac77ac62a3c,82738ee011e454410ea714fbeccad19fe15dba4e62b7d1b85e65e7f8ed2e6286,2d2f067acea2451a17ad0f2beeefcc768dbf52a01f437a5066f49fac1d3eb312,fabad1b8e1b3a3e11810c408f748a7e70449f4274aaaaaf69b11ffeaff1504e7,4ab824b1479ec872488f501374e22488e0b8b4612ea16cca5208783016af9858,1b5dcad92079e86412309d5f85b01631a7aa3d7eda261080531cdeb89c96bcdb,a1809967d96449a3535d19e509fc3ae58b714805141f6487aaf06a7b00f47dc2,081fde0ec6f26348e2626daf44d932bc31d3ac3cc6546061484f9f68b0499422,c3d10191066b94c7a89f91f75fc9aea86e17ac5894fecb8c0698957771d196da,b5474f0aebab60ca12d4f8097a499f3fc063ad6146eb6db4191bc05ce82312ed,147a78e0d0d68aa642b97ba83e7b45ff5b367341f0a0a4f551f593f3ed8855db,47b2514697f7793be6f9ed37ff3cee74a4d1a3012d468c6069c50b6681ec07d1,d59ee71f32fc530efbc54952356a1e564e7fb077b9323bc032f6cacd7ed47917,f0c7fa099c97483728d04f577f5b1462443136e52b9434b5875e00984eab9fc6,a8d103d654099371f1a97f34cfe997683000cf2e7a525376d6af1ac2b75d71ac,cc5f68d406097c09e8d86b667213f52b77d3e0e543c86e3dbede40e8c1f7490d,b495595a4d94415ad9e3c6fbcb8589ddbaffa7d0c9077fcfe261efecc76bc957,f4359ca550fc3fd61f08b20e7714d37f1ea257a2d548fcc6a40cbf1bbc4bfc2b"]}],"fee":{"gas_wanted":"4000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"5dbcN/OyfjNMrot17lItmv2c9AKqDGn9zB8PGkiIBJhW/ocjFeKBJG5GfXvkOjIBV+6FQtnKx/OiTxc8ski/4A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"3ny4fwg2V7Bmt87G6WxPUo1jjxi8PFMC4l2iu60lrWNg9uHiBfWeJwLmmk/UduB1Y1yRgNHaSs80GP90MU7lBA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/staging/v3/raffle","func":"RegisterUsername","args":["leohhhn"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"1spm6WIcZYJxV7qGMJkjmzsx4ZzuUIcyYZh+1NWPlREe6+4ixp4cJa7tY0mg69NOuFvZ2SeE30ErKxtvrr2iYQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1q6rfdhhupu6z9xw9pgh95g77hqflpuxxfguc6l","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"D9cZKG10jwN11ck8ZQW/sxD+Okf2EMBIBaS1o0rsHjBSdudVEWolHAequGPPR3u5nSilSqhtT7acArchZ2JQGw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1qlat94g56gxnl4rpp9j8mzjdhdyhxcp0l2qeev","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"pgXGqNzVZeJ6fbDa3RaeM51zqM6ghIn2llhZlQOYy3YcmMGQf9qFOIcqjBKoZRSYyvdrKc7krDllilOUmOxHQg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jsfz4dpel62frepkwvc3wvfel082tx6dne5vax","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"cIShkX4G64NUI2N4d+tIvL0nZtIVll/ARMhiIJi1LH5YRqzzDXySN5mRVDyw6oKIYP6EpJhAbVua2zcn/hro/g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g16fy26gwg902qqgwmay4jnemlcc3asx7k3qh4yn","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"W/rOPfFMuEv4cqE0yuAuQkUVWLxwvdjONhvTEfgyr9UIDp6SR5bfAAFJcGCyNDnvcWfUSeKwqKqR1K6H5YkwVQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1qlat94g56gxnl4rpp9j8mzjdhdyhxcp0l2qeev","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AimRwMeXE1YZqRpjQbxhh2Bg6dNaTJcTYJlyB8lKbDOU"},"signature":"I8a1P8dQHLX3I16wQvN/7X8eUfn50W3lmvYgASpxwXIKSsb8JnwIy2YlPOrtK1fpDEJ/AfZnubk/CYGQ+zDgew=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1gypwf56urpuw40xnmw8w6de8zz7h0s6zk22jwq","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ODxZXGXljJxTg24iV2r6sLvtM5Qam6ZhlQ8rqPSmoh8iwJ5RD4yqhC6+jjh1sWFTQlEO/CaFhDBVbZZI3VwhaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1gypwf56urpuw40xnmw8w6de8zz7h0s6zk22jwq","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvlKRoVke0H+eCBlyTnbaVPYhJCZ3HBeVFanWbGyUTd3"},"signature":"UE71cPpgLBOoLxkTVC+A1PbNOLtjOGljUkjI7qWowm47vEEz8buFbAHVC7DBUUnCn9JBeRUBER1N0Xae5wm2sg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1q6rfdhhupu6z9xw9pgh95g77hqflpuxxfguc6l","package":{"name":"","path":"","files":null},"deposit":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"100000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A0dTONHrAY3y25SoCQMagDogP9rwDhweShLbdhwhfnga"},"signature":"o3lTVxKaQEkq642JjpzfeRnpF/LYlhAVPDE42aHHbSVTurw0xRUu2rEN3sDMMf5/ylmdyo8/t6qcWzsUk2CPEA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"8000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"vndCtfjjTTs/ljOaknv47m49BG8D7c8SF6DT2kkHtIAqDcXEV/VplMdAUAaZmk6LHR7J3mSL5vGbQc8Cu0lvPg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1gypwf56urpuw40xnmw8w6de8zz7h0s6zk22jwq","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvlKRoVke0H+eCBlyTnbaVPYhJCZ3HBeVFanWbGyUTd3"},"signature":"hxSNuzCYomR4v+omZD9AncuEdZsc+nAjP5l1LK8Zms5nHMOXgaexbwC04rKn8iInSRaHl8LMqLeuCH8ZRdFHIA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1gypwf56urpuw40xnmw8w6de8zz7h0s6zk22jwq","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvlKRoVke0H+eCBlyTnbaVPYhJCZ3HBeVFanWbGyUTd3"},"signature":"br3/TMGg/VJfrEudNTXGDXxCsV0xVAXlfOSvqY4oskA7IRUmYXtLw8GuCllZwiwR10sWqp3ji7xcExV8c4O3eg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1qlat94g56gxnl4rpp9j8mzjdhdyhxcp0l2qeev","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AimRwMeXE1YZqRpjQbxhh2Bg6dNaTJcTYJlyB8lKbDOU"},"signature":"llxLJhAJiY7ZNJSw8mJwjuO71VmYwNV3TsGztpywKcwfk/Nd9hbSFCwmhFrPA9JEYmENR84P63duGGmXGdNZTA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1gypwf56urpuw40xnmw8w6de8zz7h0s6zk22jwq","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvlKRoVke0H+eCBlyTnbaVPYhJCZ3HBeVFanWbGyUTd3"},"signature":"vRp2yz8sT1wdNeYFjqyzS/s/tmt3xftA5ZYczkejamFeUACElq/hg0Pk3W1faM/nbgBublY4dUCB3IUG7dcQSQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1gypwf56urpuw40xnmw8w6de8zz7h0s6zk22jwq","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvlKRoVke0H+eCBlyTnbaVPYhJCZ3HBeVFanWbGyUTd3"},"signature":"wxyqG+k08omRPDmvmQHm14CHS5OrdZjO72uMZHX4McFhSufTyy/i3ZRKRm4Y7JS83vCQ8qhTT70FCcMpCY53WA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16fy26gwg902qqgwmay4jnemlcc3asx7k3qh4yn","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AmSDdXsTEtJlZrGOHxs2VfxwsfbaInLXllYi4zxy+JF8"},"signature":"xjZSY8jccjRvrrzNb4kXDFZG+lawmaUAMD9Y7+yqldMvDDfs03uRMuolevW3ojuBM7YfGsCMdriU0zwvKM8bhQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1qlat94g56gxnl4rpp9j8mzjdhdyhxcp0l2qeev","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AimRwMeXE1YZqRpjQbxhh2Bg6dNaTJcTYJlyB8lKbDOU"},"signature":"6M65y9OHdmI+CDt6/DOvumzx7ieb3lXZFDSQ09dYJcYr5N+fjMmMoC8iQX69/y2mVxjZJEYDdLALXymBfhRpsQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1qlat94g56gxnl4rpp9j8mzjdhdyhxcp0l2qeev","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AimRwMeXE1YZqRpjQbxhh2Bg6dNaTJcTYJlyB8lKbDOU"},"signature":"XPjzJcwfbWScHjJNO5BR+Tqqf8o4Bk+SvrBjqhGMQrQMy9Jr2pgodDy4DLK5WjBDSNbLgT1cq8cL5uhL31gDdg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/staging/v3/raffle","func":"UploadCodes","args":["a657602fc08191e7a4e0255a818a0ec544c8ce0826fe9ecf0c47eb538b2a9920,e4ce35fc370cb77c8416d6cf248e406c3f41073955d2d1c46dfcde630437711c,d1c73632a00861c2a57502edcc7105df21e22f6f4764e07dbd76c1dd456fd763,5e9a113e15140d8e7ec30a70d999038970da4dc84b8517fdf93d8eba56b4f4cd,d0a8e682db50c4b5f16dbb1c206cc8086f58094642d5864db8cd5feaefff0eae,6d0d8c67778d4ea8ac5ed234c12075b7ccb96350ea84711f455eb1538ac30025,e287bbe122d9be4c90d2fc62e51abbc67de50f6c8044636a61e7f801081ba907,6c4567fdd88ee306f715eac751010b5ef8a66bab66258e580be4915898b1dfaa,85463175e47915820c55acbc2531eaf360a8c0586c3b59cbbf270efcae64382d,b9efac79a5d7a24930b1429e884c0e8834954c07d71fbf65eb2c6ed9deeb4b86,e22a3c12a95f1f07a0efc398da7c39c4dfa75447f17a03184271cfb5a5c96878,38b9840b1b4424a90d4999dae44d5e84b91ca5ec9f9227019134b124e17d9365,e8938fb84352f04418c0004d647b83627f9a87ca6df5565acb3af41a5ae4e96a,0230a0c0692cb9a8a5ef678e43f6693c48798ca10cc18694beaffea4825d8ea2,df9656caee96c6307c2a5f1b8e7ccd5939ec5d5d20902865d6bea75c696ece8a,0826a9dd51b29e6c2a5fa4851b9901938766a966be238bde273b4e18d13d8f52,3b6f3cc0d0a263cac2542c2280f43f15fbcd5e84a8e381def4f85ead1f50fc1f,203d4d1fbd75126347c4d6f5507e9d0a3a3e7c882add72157a036c9dc4e66512,7390338a73bb575ba433c21c4f20046fc84e068569ae4dd646105a9a6a58847a,336dd7b5898bf4970a26b5b4a6fe676b5dcb8717e001c9b35bb77ef470b4a7aa,8a9664c99a6f9c834aa54c4a762a31e8047584637fc9062e5069c0aa72631424,f1c8980ccb671cdebf22a160a6e80d7e32fbaee249642d0542b0c200d49aba3c,53448154f4b36b94312be81822b1b5e50dccfdc79b32e2c22b16ccc6b7d578d3,f70a7b08f88830a74830a78e9cec3f8d232217b113cdda0c8999701ad03e8d9a,ebabcfaf537123853c1f4fe32663ab2b9940ca380a469c90b4335a3cd75ad845,f11b62e725abd3132689a08c414a9d8056306685ad579015234147ca8d951ef5,e8746cdb50ea505868f1b14a639befe60793e1b098595ada30da9dea8543f85e,d64f3d1df00b2499d8dfb70a7ec677b6254194c1cc6fbccf2a5de0a1554aa73b,bbc3769aeb96573e828bcb88d4043326422a486cd7408d673f55a74c2bceb905,89b3990c08d38bc4f157d83dc4a3de9daa22d47eefa2b8d2083b45e22d987059,befa5f82ba8c1e203827afdd525b1bff339db39bd687499e67cf4ea0ff1ea7da,35248acd0ed6d6a551b7e6bc46f5fb6c5e00e996021298370a3a6145e45557bc,bacccc0dddadfa4e5ce03565a4d60fbfa13e4c6df882b4c5380c63c2fed1c72a,c3482d84d0f68d7340aea787390aa271051697c9f6189e01c970ff18cc871113,d03111e4fcf3c5706acbcdf03408f27c392de6d622b6c587fdc01a15aac8511d,77d3c66add6417b3c82b33ffc4bd56f99f0e1f2ad6b50cb7dfa52cc20fbe53c6,de52618ddb2a0814d537e701065d093dd99b15ff8ed9df4a47fae47b36191144,e5b2c494f09c57fcc1a2f1c81b8bd543418561195c1b406ff0933c80bc43926c,290862b65579a5a9e7b7af38787aadd098db50c474fc8973f1d40935c2abdff8,4790aad6ef509672d5b51ba192b1465f4c7c8c8ed5575164e549502498cdc314,bf421d436ac5cac95ebe884d84c2bc10865b614ffda07ba5e47bcfb45d0cae68,44119bae5a9ad9707bf4ae45b986db6c14910549c134977cfe4a9722d8bb8413,8b66d6f823efce27b5dd4ef8df2e7c420f977683ad951e55117133c96d3a2fef,7950ef46b73ee87379ce9bdcc80e7fb5cb1e2a0550142d09772f5adb48990783,47900068bbfecf6e272a543101b24e3284cf97d20f10c83e0cef34fd3d7b8939,9b70918fe6fdc6b997251f8988b1e28b26fbcf5b00aa009b54ed6987954b1054,87e5fda75dab4f89646c832951c3ca0ee2ed7908eb67be8b7665bca0c11d4863,e2401111629a0f6b97c09b98cca394d653ef3b2b7b130e6dd97a1bd278be6fd3,513ab2a40f29de856e9e75f7f556384b5793b52630966e2572448201b4d91241,38ce4e383b82bba6324efe0b591a140e108a140d348964e12fe4095f1ec28836,10ecfdb05cccb69aac313df1b85b6e9a8d16239fc72b6ba01d54cb3a01367d23,63a2f5ba3d1e707b0d2e7143e6ae0b59d2db066c910d8dac1044282a7b414a2c,5358b5d792244a4a9cd76b1a53cecb72edd8ad86b150bee596bd111984f37c8d,f1472a16d28eeda10cde756bb0fc9b1edfd72086ad1b7ba848f3b2c7c0c1ba60,12e200388a96f0c880cf48e93b2ea96287b7295b64ca80618e0425bf57fefc12,ebcc48149e5fef8d883c2feab956bf116beaefe8ab9eb751ccf991036fbd21e2,0c40425718e03bb1dd82551fce54f4580e8220fea9f6d615b026698fd9669c80,4848690fc49a95c439cec58f89982b58840164815d953c8fa87ccaaab2bd1731,6a16bad26a7cc979a4f8e5eedbc80fcfd9ed7ecab91193becaff50f33efc28da,ebb1a01c03117dcb0aaea770106bbdeaab4977f48c996a4f099afeb1b2facfdf,01b214bd9fd35002db91584f4eaf2c6be48033f47e10de7b3688a8ec03c3ac76,7826ebc97a654bf788cb023f6be2dd87989948ed6c1459af75d66323ec609933,f5e1f76ada455535d638d72d5ef1026376845487d1b6f36a260e4c7e9695601c,3f7f2d5f5a5880ceb62584e53b591be6daea1c1256e40d08bcf800341c0f4998,81d396417b5c2f4fa3ba7ff9a549bcc4828c67023f02e312a1d2b04d6a0dc284,a038ade0998e9b9f9b8f6a6c07f1fcfd71a94c2cede2e008c01f20c5bcd8c951,440bf41f1820ae151a8b9b7d9929092506b9b37ff9008d25b420189f6c5fca13,3a84efff563cbf7b4d8d5cb263f4f5fe0b165d6489ef97cb5f027132637d5966,7424bde3031042dca9b2772420802729013620f0080339286714a1cb025819ff,7ce7ac17c0ee78366435633c0e6a7856a39191acdd31e0a4fb8ac805e34d46d3,aec871aab9cd61464a27bf28f20f9787d1487fc7db381755b446eaeda32bef95,1776c5cfe011cba0de6adedc058437199b5b4d022891b700ad34c253bf51f528,77c42978cbb6d4e9ea009bad225ce9c6b9628ef385b0e920d840fc717640c2a4,0234edb9221988c6f9926a02875e25f902636edf0352dba3119c80576f6d234a,a3982bc2e9fc9bf4ba8a557faf0fe3c87c7d70704cc34bb257ccce850a56df9c,1028d4888bcbd6de66991f55b05281908a43bd721999e52b864043e5b20a1b4e,1243e8b9d1f3f9faf60a3ef85df793a21cd32fe70be208daaa8b581ef2ce8e68,f126a0245767f09b0673b4db69cd15c21f5bd30db6a4bba8d1a31ea641d58b33,3f2c79cfe02d3997fceb691aeb35d7cd57de441b4cef6e30b9b962deef9c50b9,f5fa2ea7bb2b4c8c6ffc48161983f88bdd19be45a57fc98ff9c1fff82f801014,d8df89e0cdeb42bdc936da63cde0fb936f56dc234da63917663fd7372b7660e8,0e8b757308130fedef4420b79e3d3945e6f8d2d17850eed9309e4d130f654672,b997b5fc7ccd97a0539bda23185af6f510eeb5d73de4fcd6647784567295bc6d,a3e3ef6e658b4466bf2171c47455a80cc2bec6a90dcc1fb3390cf744eb53c1c7,8fcbfc5d27166c53d080f471d16f6bc8e8aebd92f0dad07de4b859495ff042e9,28a00715a1445747db570f4072a94bb51e3174665cc256982f68eb73ae373ea1,b9a85ace3beb1b30f5246b3226efd57c9f829799fe621585ee7835f55d390960,76f2d988a34611508881726f80b18430753a9bddaf239fa1e3ca248c07f563d1,810a984e20a8f0d9fea02b69a9d0d7ee64743d73c24919f060355c58221659db,ec0ceca541ac704ef78375ce66bae03e2ac7f948e14d0702702b5edd44431ed8,45c038cfcbe4bbaadb423bfb6d69aa166bc36444478eddf04dca330e747645df,66978f4b114af8a2c7bff35caddd57b0e34d4469422e1f5177d84efbc29e9f9c,68deee2f5ed12726ba48c143de86f5bfc6f52e42387b6b118bd6adc15c6398de,a0db86d2a0c9ce98a0e3e45bdcad8786af03bc8c616726b39e73514d242903fa,585814809fdc5504c535b33a7905c9eb1fa3fa49d614de3691714738ae50800c,1302a8f2dc151addb559c3078c9ff96e4d0c0830e741837ed7167acab0f9c665,4142bf0dad7aed829ce45f47b9dc7301c99ce48eddc44eb72bbcd790238e51df,7258b40d72fa503550edd920756c4a1707b73bdefcce5ea94e79077e215c2ac0,14e73a66c7000d5cb2e2814cae0efb467f7a7db3ff586781127d35755ee90dea,b0847a80927caf523b377dd8e6afbfd29d9d247489f5531492b52a1603efaf31,1fcbf67cb147f8550780d80e16f5a9e22e28d5fd73ad04c7eb05f089173f8e6e,4b7ef70b85443c71ed7d39c56825a8d6faacb85a4697cafa4945680a0ad3a9d3,5915da1266757108bc408ceeabd04a99c93f745af0462d1df9ac42384cca7e07,b3acef10f8a2f04d21dc8856c7e138f103dbdc5e6b34e6871b12eb2ec6907a18,8da8f353e95c27476094aa037c06d987f72ab08ea5927af07bdffd24467a5f68,0502db50a5bfbbfac71e959bd4f372a47e83ab6a17a255b0e60b402c122b3fc8,04ee807da45b9a2a8a1cdd0148e1babb794e9e7584c55f370a2f723a16632c2f,79ed422a442f7b3a6b194660ec90560b742b9ba018c2bedd72d6d5a60b332c5a,07fdacdd8c1909fa7042e20ffe2d5f5bfcdbdb59ebf3e11886d02a5f0fbc05ed,361e57a73aec8cacee32496094263948fbd6a9d96e731fafec127eb9fd813f26,c36e6c40c3035c5dc4d8f015363c4591dff5a0e2065aa719c751cdde1a81bcbc,9bac59d959407ea715e81eb23ce43cc88e462c5a25ce525a5dd7b417ad7ea7d9,8dc69bf8158365d866d999fe69b6a7bd869961bafd09863b30d7d6a114bfc5b8,b00f70f3daa8b95576f82c3e59ecdd8558029ee49fe3f726a39d06a1e8fffebe,7ea988c095c4107824bced289ab7d21136e81dddac6a57af836e639135a08e05,966476658b04905c11608c684e267508c9f875f90bb03178b6b4b93ec2f98f13,f2d19b603793cc43563223651b218f8e465f1bfbbc803ac0982e75c8424e12e9,87610850a33a00749627bbc7c6e0aeff65813378733563d05b09333ed445ed54,b980b9789136661518c8864a2caf5f5ef7564408d05391888d25695d6bae1c9b,5fd10e734dd73befd2506c7a4b3d9c453366788763933a32ae7c8a1cec69c000,420858c69ef2cc9b5077f786392fecefbbd76501a8843ca13755a8efbfe6c6d2,6c6dd279e6b135970fe3352b41771341ddb0da7b41b5347b53004970ca2a07d7,247bf14ff84a4c498caeb9aaf249d186db1f84e19363a1a3f118801a57ba09e6,2d568b421ddbe5486bee08dd6d1c584f3311eed85dc714aea72efbc8f26b1b66,274b1391e2d9c3416515ecc8d10061cd1918f9fa9b7e91c7e96934e9cb6bc8a1,25fb97b440fd5a8c2148b8301eadb6419c1350003e4d9f2956a9e782a3e898d1,2d1bf699f5a8f2c5b2817eda0ef641947c6abbe7382fb888194e1d5fdad09566,330b374790e6d56d65f871ceb5a1779bc9859ddc29fd7bfd0d2e2a36936d9e98,3ad6891a7801438b4c695915e33ab8b7601e7f96074425b4dfc81ac76d6d09fa,8936901fa82ce332b699810e836e5320b0a0c5a267be7d875f991607a4eae282,d96bffa8ce37e4148483ff508f2a60b6629938db37b26664be8f4de4e8f9be27,7b4fde34ebe05d8c5a6c7c9bf0caa3971173bbbb62450179db376c1183325c65,4e38a924326b672f732602e8b926997eaf815cb8d9552ca8b2d694d0ceb74621,8d88853e489365132031f1c19f96787bb7955fadf3a33210222260c41b46fee9,73c500ead65ef2286b5140e06deb05ec11c78caa32954452e9ac50f01d4b1574,a8fbe2c40d74d690018dcbac28ce03edac5e5078d86544f04d422cb94b2dcc5b,3070a2343f71b624450db8bbdfa58ad1d4f20d171120fad69163ff68d969b36e,c4b2f358fc2cf8d771f8adc21419ed06fb3c2eafb8aaaf57f9f0036b71b24a79,8b33b6c3935ba61868fe6c3cc82dc09cf8956ca401e4081bb9070caaecd54a00,2440f69ab8f6f3a40c2bb83c8c11fdfbb69b32c6fb92a8059fc53f72c90a0fe7,dcb1b291ea41f4aa8f4632f62cfb20860a55bbcccd5b865bb36a8c0868763493,77fe31a59eddd7b925605d0081ae357da852d2530c820db0eea6418f826270ec,5a48b14d87fe45c7ef72def490db5cba84626720dcba876037241568ce75eb0b,28282b12ce1bf020a380fff1d6276f20533530ecc1fe666744c7761e80bdf7bf,f7965deadf987642563ceb0afe231c0ba0656547a83c3b2c58eb101cfc3b6df2,75f75d426cf3b26ddcf9d81e37ab8ef4e9421820f35abeec77e89fe2f229c713,df4ad30a4d19080ef444e9b86bcb539bfde6b6172254e6348e1f8677a6f8a2ff,72d98f1549d8125c6f98aa65ce936d978b7e46761c7b738ff162098b97ca22b4,07fc641ee6efc88323ef2928b263822f66b8bc844fcf686e8b6b809cc55cb28f,6fe314848cf6b71e3dfb97e81c58e8a5cfdd5c95907beba0d80cc733e338fc4d,edbb054b6a58f073de56cb76b962686aa3285cf0061dc1274c95d7d6091b3b33,600b8c1e159b5a119a8f2856c9da15f0cc407a9440c28a9c930b93319080e11e,dedfa5adaadbb507df7acd1aff8bf15e792556ef5a20f7ed8f2f733b50a2a94c,266161aee785bfce4cd62bb7f373f7f6c5843042aec46851858b15be81f99c01,a27b39e042e6b6d8a409c02ef510e87bb4fcd6d17a583465f1e3bdef8fd5ff66,bedc14158770ae8dbc3cf5e095890c1ae813a71519a1599e12d318c109a03d73,eb6c718e060181374cbaf61401df3fe4795b5ea7d69071ca54db7ec46b5f39d5,1db3779583cd8ddfebc1c33b9554c259e73ce94f352c8b9dc65d91b945f42508,9d178e34adcadf94b206f0d04956160e3e6f1aa621ee7e901f43d5b4993a268d,6852d1772470588b412382efa795fd3839c0b5f0d5c73db60ace8d9f0654f5ac,c16d4d475f5bbf6b0fefe2c737538109175d619e6fbf84fe0ddffaa107f49624,4a2d53b4176333403f606c59b12561716543c596455de1883a1a08648cfe5633,0abf8530e6570ac69c068b160acc807b660331fb7f206267891772e05784f080,ea085e3675b4f1ee23aee81d920d14168f7740c4dae404f081263200c582d5e5,d1f88d59c10f517a00f8379fe0dd5ff60fca94e5e5a077432ffbb6a2b6f85a13,43a471ba0c43af7bc0e53f487585fc7e44a4262bb0eca400038a875430847ce9,6a9a40995191d5bc3bdb32b7ae6af6b2541e55576cfafcd97c9bcd95da4b5340,e28698e18e49e481b8a92b4102cb259584d81edf3f73468c5ca5509d5b5874b9,007b899ee4ad9cf389a4db03ed5ec69e8a2c4648cec328f0c669425089186604,8ae572d8a53847a30f5e9f2ac5d734341c2fac4fd8f574b2b9d9b24817d6e372,f857a1374f3cb2c80661ecadaf5d0e3622e72d77d266aa7ad2801e7db335b969,2e9eba7803798b99de5e59a3cb207ca53180326d7dddc4f80460ef1e3bca9f22,6d2d8fdc6bebd8bb5aebf5f4008856c427fc9b077cedef06d7cabdbb35230090,e88f5a8743a1e2cc24c07bf93d2566293ec90dc3016d6d561ac359f200afcd7c,73d8e522befb3985d72f69876a3bd5bfd656ef442af8db63f24e3802fbf7453e,09dc75bc71fad01c85dc0c7a2dd4594ae3883bf5ef8155cd2856638bf467842b,69f06e1c5773eddc50d89714a081fd26d6c271355f609d171d90f09fdb6ad311,1e8fcdd32d547ec02338d40cefd09b02b28a4ae8f8972a4fafa158107f6a890c,79dffd0030e1dd9af958fe233cbdf1959ff3d749d863da8b92bf6d2edcd114ad,e089dab3bb2519de80cf8666f589e183f4ddf80f8778282694632499c093aaad,2f342899b6e2505b72a25f7f507298b4cd5b0400f9d034d45a95fa86d127b171,5b6767fdff5a39d92eeb8415eec49f48b958e9c38151ce4356d09e43f8b397e9,a70b2878df44bd3952d9da43fea40bb475d2a87d21b8d5750c2153163af39c0a,4526593e49e532e8e498a8b14c3ca15c1749dfac9cf39a0b44b4c18ddc319440,118502524e8a02d7c7ee2cb984b598f27afb3b7b78b92326b2fbfc3c53f48464,8379f7dc2c391ac38ea1d34ddff36faf5602bf128b6d93a3a8a6485b1d8dc23f,0c17a500636a9a94b405b8e9f2fcd45b058a4a9070c156332e429daf0379572b,7e302ffccaacae442283c86d2afdf7c240d19dc42c41440419c8b78efdfc9dec,a19467bab0f5a753e4daadd080e64f13c79bdabd7e403575f9f3d3b7b6ca66fa,4162c48bb1ba5e8dd38518f9d1007300e46348e01a97184e253a3250ed0f9ffb,c1e36882f77da60283f64d2590e3389497e6583fcdb61c21d352d522506a8882,64a4716a19fd7b8009a5e6d5924a74c65ef8e5f85c64345c7b89a4e6b6135e5b,8136dbac064d798c9e30bf31e62d74f99ffb37d3bd9f3d6d3c6544669ca3cded,790f8dfbe56b27d1b82b00bf96394caa4ef54263229bf3ee5b2aa891ec8b5676,7d060a4e92f2c1f4cd2546f5409cae2c946b70556b249455dc19fb93e8dcdb9d,8e62713fc4972433c63b1c0c19cc1d291471381b11183b40e450263956a4d1f8,46255b9d4d2059337f3949e4ada5c2d16ab8385f66967291e204175aa2120986,49023745977f47f7439c701985905ad2be42b2a89c070df73ea8dc7f9c5ae627,75e6c4c28e4dedef545bbe58ea2b497dffc90ed7fe6d7261287e90cd85a3fcfa,fee9501fc25e4c85c0d205473426d6e6f4e02eca002eab6513c6467885486fab,77f39047575527668b8c86defb3a15328d6f6289ffb1dce1b01fd1c9f193f739,59e80ebb2f5424610ffc9070e39c64805a1d6a44f52993eaf0b427b3a8494b99,bfddb6b1867c2d0cf3ed074ce94fadc786226f28f98f9f1d7ac5bd6a1e040f9b,4c6aae8655346883ce266665e0c61461636a128c8804d6aca78f9c8a35356fbe,bf4462bc1f0c88cd99e30a20c6b6eeae09f7a17a737314192aac8b40056e90e1,f448286e1d5a998965efeed87d8feffd6ecc3fc0a9a8658730da10715324f89c,7619cfb410a5bb992e9da50699a6cdd82a0279e27176ebf4c1c21c12dea2459a,48395b0355072b681c77cf4684dfa228f4009c4985d013908539e34d306bb4d5,6fa9d11c314c5430db8ac179f7e1517d754781522b94f2da800a3d9db8a191be,79462eb8641df40ec28d7ae89ec7f1d5548b7b0316fb03da682726b35bfdcf7d,dbb07ef67043d85768c04c5c68e98a88685bd2785a3b20ba574403397fdcd33d,5be705a5717f0ad7688077b80765f8eac1be081d07105c7ab342db817461213e,0314be8e3cfcc6f00f5a0b3ce074f844f8126692bc9db1951df722379ca37622,b225bede76fe85a80c30ec258bcff80f9226fc3b3c07e1c75aa43e38968c85b0,ecceb05c114658703ee5bda417b23ecedffc67129d59b52a4fb60b9aad8624ee,56d6e51283d0da2e6aa6d8a166178aa5bf97c0d6ad8b6514a2b1a8701a890a54,274754307e41b8a6333f8f2d9bc679640fdeaa6954c94d91b022185d2e0f64ca,1c303f25b84f7f63fba0c97dd1ebf1148c1968658dca21b27df47ae2b86c4c2b,04638bdc28da59d45407c756701e4285ad0487858e92b2e45ccf99ffafaaf73f,ed4d011b44c9801335df5d3b5550977b11a1e78ec7ad1ebb477ad2eb707ddefe,333a3f0c920bf95d95cfaaa069a17ccfb0998ebc5697764788642ecb69c1746c,c6db8bfb6ee98557377bf8886a12c5784f613a53db3c09c161938039706941f4,25c3e1dcd0d27d63978adcefe9f862d9be8e20ed44bd80c359ffe99bc72fb095,035d2f21a40a3c5f97be226cb26e792130ba0d56dfe472b5cd9e1fd0b5d557f8,16411af320b57bac481c370cab692121e93edc942c2a6851c64737951a9594a7,43cc758c0134246a8a9e7db3f08a63709f0db02cb8431c21319e832845e3bdfe,3d9149f5c36eee7b661628d69b8d3e323b4fed8f544f8ca7b1bb575de94d465d,85ce96c84ff64f03e0c8b72dc9d6f2a4679c034836368345e22ffd0a170ad62f,2691d4f78bedcd4a6f6fa39c45a0109e4a11ce7603c656b53cca835d3863e06a,cbd21277046ea7f4572d6e8149077713575239ccf8a98c56b162b633a6490cf2,30335f29996cecf0747bf4e2b44f8ee3959e4cc277317d48e80f7726a85d87ef,afbde53c640182877df7eb5955d42669c5aa54e65ba304d6bdfb1be002cda374,d053a7b55ccdbf594d95fa053a1dd93d41a72e9c29b15b68e571e482d33277a4,3ae128f7b953405c2cd293c2e62a9c99914a7ed69d84c927c518bb9fc21b74d5,ab43d526f1dc6a32395c49806c8bc73bae918a5f3cb5fc1d0f99cc32e8d45867,7c5151e7116ff12d2325c9b2e98256e43802f6c4a15584be250aecbf143f50e3,5ee1a8ac394732056708b628216815b744eb5fefcff8426eb48d682ae7fe0bdb,e1f06ae08a52e1e4e7544d0ee343d33ba6ea5a71d7ce00c56a3f14058a199d78,771032904be77e19c389ae615a39e78aed70ae8e233edd8f3d5aafee1e4691df,cf0dfd60ef8f949ec0168439c7022546c5f00634e7fdd668900bcad1e2e81756,84bb868f3ec690f914e3a8cde683b55653e554bf5ae6516304ca95e3e0be0ce9,2e6bb4a91f7df30a0fe05ad3d02ea64b6a571a089ecd6e1a2caf900e5175949e,566cf7e6d6419fff93e8f18bd34b7fdb2db9b2d4191434e37a97e3a5cd00b186,912729b57611e1422879af83c5d11bb416c0b98fa83dc392bae590d7e90d5d12,54a7f54922ffc66260dcf30076c4cc7fa254cc9b830b2e37349d7b40f0d67231,d2cdfe1068809e2e519bec2fb30eff036085ed0fd5a174157f4a531be489a9c4,00c19bdcfabceeef4ab4c71251f41d59173c43b87ef0e968e7aa5bcf77fc3aa3,00a1b917cf86485c9e86030ec1afe9b7e28a4345f46471b92b4e0d08b698bae5,17b23ef7d38a3a0334ef68087a585ac48956984f6e0321c62d30011368954485,1fb0c2d4d015596c3439f405da4a7a2497ba94cdecb535e70cfda08c6a764f4f,993c1131175eb1f3b8b5d1d72ea5addac559a20b5154838ee86aa9b71e06652e,2ede50271add1f8aa5b91bcd222d83eecea7f4a524c9e62ec01cd889a55aad45,20ada1b4fe496096230fec2c00bff8a037db5079c6f45955317df9c2ede5f85b,b37b8821965b243026b83a59ea4e4e2246545fbcc1100d8effeca612a3b6bb4a,0760c516052f81058efd89aa11573c744ffd4f5685e11e9e200bd0ba0228ee34,fc3cc3b0dc5592a8c0a2e41d3ba995c0f65efbf2797c2b7b2403bd2c552acd64,0475e984bf932adabb1fe98d943ad23fd56e4bd53c2e7bbb12ea69b7996430be,d60ec04ea36dab7f685a2dc50c2f76ede60a6b594b15317d7e32d2438eef36ef,13dbd661bb4f0bc0854b761b94470f2c8d3ea069c2b2c53d07f40da9668515a2,875472cab949b679152079e79cd06ad376c30f4c298b2f7e191f5f7ef3aa1ccf,bfc95afeb7c01ea29780954bc62c9830af90e4a8882b64d24e65d7c30e075e48,4d100b664eee670a68d88d07bab4ca55dad28da862b2af631b29d5031920e10d,1275cde34b3de398a87fccd8bfa2261f826983ea774a0a413843f9de07beac70,b3cc121e4d7f7bc008ecd7d79b2f08d32c34c036c64678ae7cc43112b4297210,46a13985c51e2cae515be2a8f1eb0b42fea64cf366057a611cee74aaa7c648e3,df40e86985f66578e1ca70bea1c1a58b943c3b37bae49f639a547e759239513a,448cb5c2de497679de2161a93b5e0983a6030a33a59eee2b3171c56a93bc91d6,e6b371651baf1c9773ee1e240d51deda5f237e8da74048af9f3379f70f1c8e2f,d24ec5de76732220049843cf0ce87053bdfb223d8e45cdbf83a8d801ed486850,4131794225ae70468171aefddf3e5875a8ab294263ae4694f93a68e8314b0b5c,f5958acf10e9d5f12d9b0349bda1e652273977c36e1ad59c383bbfb512abcac9,19dea7117e47e557bca2019c09173879bde7a9703e7577ec5bf2270fec6aca6e,3cc640e6348efd77de2a22367f609c2f68551d4cb917f27c32c2dbc422827dfa,61d21b2cb4586c4ce3178f6ea51d905d9d00d79d85ccea52e5f4223811e12a44,44e06b75ecca6b3a9f91813c716c0f61f5990f498c5ed17a41ddfcdc0db48368,8da1c8bd377bb3892265639b26a72b7780393a8a43f6471a5eb1abd1ec88ef3d,f5e58a733b69af1ef5fe8a9a580b3790a792e44ad32a29e98d9f7f142862b298,d1e1dc03f1d6d75da644b8a14f8e7d3906b47d50968273f0707142bdd810de1c,d1869756e1200628a18e401e9510a9f78604ce91faf67c2e759a7b28c6eb882f,60dca01fbd010aef036b6ba742978ebacd1c49ba999e06f1b7985c5c0e96055f,c731ad94fa972ca5a7bc709d2cccf187ba47bc6299dcf3301b62990064e04fa2,d1cffa5c6c044dd22a8a0990545ac7bf5edf04b38820230af853949612ef7075,cc351a659c1718306c90276e7a58697709b69d2dd06af2dec6891ac77ac62a3c,82738ee011e454410ea714fbeccad19fe15dba4e62b7d1b85e65e7f8ed2e6286,2d2f067acea2451a17ad0f2beeefcc768dbf52a01f437a5066f49fac1d3eb312,fabad1b8e1b3a3e11810c408f748a7e70449f4274aaaaaf69b11ffeaff1504e7,4ab824b1479ec872488f501374e22488e0b8b4612ea16cca5208783016af9858,1b5dcad92079e86412309d5f85b01631a7aa3d7eda261080531cdeb89c96bcdb,a1809967d96449a3535d19e509fc3ae58b714805141f6487aaf06a7b00f47dc2,081fde0ec6f26348e2626daf44d932bc31d3ac3cc6546061484f9f68b0499422,c3d10191066b94c7a89f91f75fc9aea86e17ac5894fecb8c0698957771d196da,b5474f0aebab60ca12d4f8097a499f3fc063ad6146eb6db4191bc05ce82312ed,147a78e0d0d68aa642b97ba83e7b45ff5b367341f0a0a4f551f593f3ed8855db,47b2514697f7793be6f9ed37ff3cee74a4d1a3012d468c6069c50b6681ec07d1,d59ee71f32fc530efbc54952356a1e564e7fb077b9323bc032f6cacd7ed47917,f0c7fa099c97483728d04f577f5b1462443136e52b9434b5875e00984eab9fc6,a8d103d654099371f1a97f34cfe997683000cf2e7a525376d6af1ac2b75d71ac,cc5f68d406097c09e8d86b667213f52b77d3e0e543c86e3dbede40e8c1f7490d,b495595a4d94415ad9e3c6fbcb8589ddbaffa7d0c9077fcfe261efecc76bc957,f4359ca550fc3fd61f08b20e7714d37f1ea257a2d548fcc6a40cbf1bbc4bfc2b"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"Pc2meVKMmn0W6+u2/TNhC3xRrn6zUrSCfUcfSoJITXhdBJ68hjdEAeer7PaND0Z9//X4YQYeR9BqFMhNyI5guA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/staging/v3/raffle","func":"UploadCodes","args":["a657602fc08191e7a4e0255a818a0ec544c8ce0826fe9ecf0c47eb538b2a9920,e4ce35fc370cb77c8416d6cf248e406c3f41073955d2d1c46dfcde630437711c,d1c73632a00861c2a57502edcc7105df21e22f6f4764e07dbd76c1dd456fd763,5e9a113e15140d8e7ec30a70d999038970da4dc84b8517fdf93d8eba56b4f4cd,d0a8e682db50c4b5f16dbb1c206cc8086f58094642d5864db8cd5feaefff0eae,6d0d8c67778d4ea8ac5ed234c12075b7ccb96350ea84711f455eb1538ac30025,e287bbe122d9be4c90d2fc62e51abbc67de50f6c8044636a61e7f801081ba907,6c4567fdd88ee306f715eac751010b5ef8a66bab66258e580be4915898b1dfaa,85463175e47915820c55acbc2531eaf360a8c0586c3b59cbbf270efcae64382d,b9efac79a5d7a24930b1429e884c0e8834954c07d71fbf65eb2c6ed9deeb4b86,e22a3c12a95f1f07a0efc398da7c39c4dfa75447f17a03184271cfb5a5c96878,38b9840b1b4424a90d4999dae44d5e84b91ca5ec9f9227019134b124e17d9365,e8938fb84352f04418c0004d647b83627f9a87ca6df5565acb3af41a5ae4e96a,0230a0c0692cb9a8a5ef678e43f6693c48798ca10cc18694beaffea4825d8ea2,df9656caee96c6307c2a5f1b8e7ccd5939ec5d5d20902865d6bea75c696ece8a,0826a9dd51b29e6c2a5fa4851b9901938766a966be238bde273b4e18d13d8f52,3b6f3cc0d0a263cac2542c2280f43f15fbcd5e84a8e381def4f85ead1f50fc1f,203d4d1fbd75126347c4d6f5507e9d0a3a3e7c882add72157a036c9dc4e66512,7390338a73bb575ba433c21c4f20046fc84e068569ae4dd646105a9a6a58847a,336dd7b5898bf4970a26b5b4a6fe676b5dcb8717e001c9b35bb77ef470b4a7aa,8a9664c99a6f9c834aa54c4a762a31e8047584637fc9062e5069c0aa72631424,f1c8980ccb671cdebf22a160a6e80d7e32fbaee249642d0542b0c200d49aba3c,53448154f4b36b94312be81822b1b5e50dccfdc79b32e2c22b16ccc6b7d578d3,f70a7b08f88830a74830a78e9cec3f8d232217b113cdda0c8999701ad03e8d9a,ebabcfaf537123853c1f4fe32663ab2b9940ca380a469c90b4335a3cd75ad845,f11b62e725abd3132689a08c414a9d8056306685ad579015234147ca8d951ef5,e8746cdb50ea505868f1b14a639befe60793e1b098595ada30da9dea8543f85e,d64f3d1df00b2499d8dfb70a7ec677b6254194c1cc6fbccf2a5de0a1554aa73b,bbc3769aeb96573e828bcb88d4043326422a486cd7408d673f55a74c2bceb905,89b3990c08d38bc4f157d83dc4a3de9daa22d47eefa2b8d2083b45e22d987059,befa5f82ba8c1e203827afdd525b1bff339db39bd687499e67cf4ea0ff1ea7da,35248acd0ed6d6a551b7e6bc46f5fb6c5e00e996021298370a3a6145e45557bc,bacccc0dddadfa4e5ce03565a4d60fbfa13e4c6df882b4c5380c63c2fed1c72a,c3482d84d0f68d7340aea787390aa271051697c9f6189e01c970ff18cc871113,d03111e4fcf3c5706acbcdf03408f27c392de6d622b6c587fdc01a15aac8511d,77d3c66add6417b3c82b33ffc4bd56f99f0e1f2ad6b50cb7dfa52cc20fbe53c6,de52618ddb2a0814d537e701065d093dd99b15ff8ed9df4a47fae47b36191144,e5b2c494f09c57fcc1a2f1c81b8bd543418561195c1b406ff0933c80bc43926c,290862b65579a5a9e7b7af38787aadd098db50c474fc8973f1d40935c2abdff8,4790aad6ef509672d5b51ba192b1465f4c7c8c8ed5575164e549502498cdc314,bf421d436ac5cac95ebe884d84c2bc10865b614ffda07ba5e47bcfb45d0cae68,44119bae5a9ad9707bf4ae45b986db6c14910549c134977cfe4a9722d8bb8413,8b66d6f823efce27b5dd4ef8df2e7c420f977683ad951e55117133c96d3a2fef,7950ef46b73ee87379ce9bdcc80e7fb5cb1e2a0550142d09772f5adb48990783,47900068bbfecf6e272a543101b24e3284cf97d20f10c83e0cef34fd3d7b8939,9b70918fe6fdc6b997251f8988b1e28b26fbcf5b00aa009b54ed6987954b1054,87e5fda75dab4f89646c832951c3ca0ee2ed7908eb67be8b7665bca0c11d4863,e2401111629a0f6b97c09b98cca394d653ef3b2b7b130e6dd97a1bd278be6fd3,513ab2a40f29de856e9e75f7f556384b5793b52630966e2572448201b4d91241,38ce4e383b82bba6324efe0b591a140e108a140d348964e12fe4095f1ec28836,10ecfdb05cccb69aac313df1b85b6e9a8d16239fc72b6ba01d54cb3a01367d23,63a2f5ba3d1e707b0d2e7143e6ae0b59d2db066c910d8dac1044282a7b414a2c,5358b5d792244a4a9cd76b1a53cecb72edd8ad86b150bee596bd111984f37c8d,f1472a16d28eeda10cde756bb0fc9b1edfd72086ad1b7ba848f3b2c7c0c1ba60,12e200388a96f0c880cf48e93b2ea96287b7295b64ca80618e0425bf57fefc12,ebcc48149e5fef8d883c2feab956bf116beaefe8ab9eb751ccf991036fbd21e2,0c40425718e03bb1dd82551fce54f4580e8220fea9f6d615b026698fd9669c80,4848690fc49a95c439cec58f89982b58840164815d953c8fa87ccaaab2bd1731,6a16bad26a7cc979a4f8e5eedbc80fcfd9ed7ecab91193becaff50f33efc28da,ebb1a01c03117dcb0aaea770106bbdeaab4977f48c996a4f099afeb1b2facfdf,01b214bd9fd35002db91584f4eaf2c6be48033f47e10de7b3688a8ec03c3ac76,7826ebc97a654bf788cb023f6be2dd87989948ed6c1459af75d66323ec609933,f5e1f76ada455535d638d72d5ef1026376845487d1b6f36a260e4c7e9695601c,3f7f2d5f5a5880ceb62584e53b591be6daea1c1256e40d08bcf800341c0f4998,81d396417b5c2f4fa3ba7ff9a549bcc4828c67023f02e312a1d2b04d6a0dc284,a038ade0998e9b9f9b8f6a6c07f1fcfd71a94c2cede2e008c01f20c5bcd8c951,440bf41f1820ae151a8b9b7d9929092506b9b37ff9008d25b420189f6c5fca13,3a84efff563cbf7b4d8d5cb263f4f5fe0b165d6489ef97cb5f027132637d5966,7424bde3031042dca9b2772420802729013620f0080339286714a1cb025819ff,7ce7ac17c0ee78366435633c0e6a7856a39191acdd31e0a4fb8ac805e34d46d3,aec871aab9cd61464a27bf28f20f9787d1487fc7db381755b446eaeda32bef95,1776c5cfe011cba0de6adedc058437199b5b4d022891b700ad34c253bf51f528,77c42978cbb6d4e9ea009bad225ce9c6b9628ef385b0e920d840fc717640c2a4,0234edb9221988c6f9926a02875e25f902636edf0352dba3119c80576f6d234a,a3982bc2e9fc9bf4ba8a557faf0fe3c87c7d70704cc34bb257ccce850a56df9c,1028d4888bcbd6de66991f55b05281908a43bd721999e52b864043e5b20a1b4e,1243e8b9d1f3f9faf60a3ef85df793a21cd32fe70be208daaa8b581ef2ce8e68,f126a0245767f09b0673b4db69cd15c21f5bd30db6a4bba8d1a31ea641d58b33,3f2c79cfe02d3997fceb691aeb35d7cd57de441b4cef6e30b9b962deef9c50b9,f5fa2ea7bb2b4c8c6ffc48161983f88bdd19be45a57fc98ff9c1fff82f801014,d8df89e0cdeb42bdc936da63cde0fb936f56dc234da63917663fd7372b7660e8,0e8b757308130fedef4420b79e3d3945e6f8d2d17850eed9309e4d130f654672,b997b5fc7ccd97a0539bda23185af6f510eeb5d73de4fcd6647784567295bc6d,a3e3ef6e658b4466bf2171c47455a80cc2bec6a90dcc1fb3390cf744eb53c1c7,8fcbfc5d27166c53d080f471d16f6bc8e8aebd92f0dad07de4b859495ff042e9,28a00715a1445747db570f4072a94bb51e3174665cc256982f68eb73ae373ea1,b9a85ace3beb1b30f5246b3226efd57c9f829799fe621585ee7835f55d390960,76f2d988a34611508881726f80b18430753a9bddaf239fa1e3ca248c07f563d1,810a984e20a8f0d9fea02b69a9d0d7ee64743d73c24919f060355c58221659db,ec0ceca541ac704ef78375ce66bae03e2ac7f948e14d0702702b5edd44431ed8,45c038cfcbe4bbaadb423bfb6d69aa166bc36444478eddf04dca330e747645df,66978f4b114af8a2c7bff35caddd57b0e34d4469422e1f5177d84efbc29e9f9c,68deee2f5ed12726ba48c143de86f5bfc6f52e42387b6b118bd6adc15c6398de,a0db86d2a0c9ce98a0e3e45bdcad8786af03bc8c616726b39e73514d242903fa,585814809fdc5504c535b33a7905c9eb1fa3fa49d614de3691714738ae50800c,1302a8f2dc151addb559c3078c9ff96e4d0c0830e741837ed7167acab0f9c665,4142bf0dad7aed829ce45f47b9dc7301c99ce48eddc44eb72bbcd790238e51df,7258b40d72fa503550edd920756c4a1707b73bdefcce5ea94e79077e215c2ac0,14e73a66c7000d5cb2e2814cae0efb467f7a7db3ff586781127d35755ee90dea,b0847a80927caf523b377dd8e6afbfd29d9d247489f5531492b52a1603efaf31,1fcbf67cb147f8550780d80e16f5a9e22e28d5fd73ad04c7eb05f089173f8e6e,4b7ef70b85443c71ed7d39c56825a8d6faacb85a4697cafa4945680a0ad3a9d3,5915da1266757108bc408ceeabd04a99c93f745af0462d1df9ac42384cca7e07,b3acef10f8a2f04d21dc8856c7e138f103dbdc5e6b34e6871b12eb2ec6907a18,8da8f353e95c27476094aa037c06d987f72ab08ea5927af07bdffd24467a5f68,0502db50a5bfbbfac71e959bd4f372a47e83ab6a17a255b0e60b402c122b3fc8,04ee807da45b9a2a8a1cdd0148e1babb794e9e7584c55f370a2f723a16632c2f,79ed422a442f7b3a6b194660ec90560b742b9ba018c2bedd72d6d5a60b332c5a,07fdacdd8c1909fa7042e20ffe2d5f5bfcdbdb59ebf3e11886d02a5f0fbc05ed,361e57a73aec8cacee32496094263948fbd6a9d96e731fafec127eb9fd813f26,c36e6c40c3035c5dc4d8f015363c4591dff5a0e2065aa719c751cdde1a81bcbc,9bac59d959407ea715e81eb23ce43cc88e462c5a25ce525a5dd7b417ad7ea7d9,8dc69bf8158365d866d999fe69b6a7bd869961bafd09863b30d7d6a114bfc5b8,b00f70f3daa8b95576f82c3e59ecdd8558029ee49fe3f726a39d06a1e8fffebe,7ea988c095c4107824bced289ab7d21136e81dddac6a57af836e639135a08e05,966476658b04905c11608c684e267508c9f875f90bb03178b6b4b93ec2f98f13,f2d19b603793cc43563223651b218f8e465f1bfbbc803ac0982e75c8424e12e9,87610850a33a00749627bbc7c6e0aeff65813378733563d05b09333ed445ed54,b980b9789136661518c8864a2caf5f5ef7564408d05391888d25695d6bae1c9b,5fd10e734dd73befd2506c7a4b3d9c453366788763933a32ae7c8a1cec69c000,420858c69ef2cc9b5077f786392fecefbbd76501a8843ca13755a8efbfe6c6d2,6c6dd279e6b135970fe3352b41771341ddb0da7b41b5347b53004970ca2a07d7,247bf14ff84a4c498caeb9aaf249d186db1f84e19363a1a3f118801a57ba09e6,2d568b421ddbe5486bee08dd6d1c584f3311eed85dc714aea72efbc8f26b1b66,274b1391e2d9c3416515ecc8d10061cd1918f9fa9b7e91c7e96934e9cb6bc8a1,25fb97b440fd5a8c2148b8301eadb6419c1350003e4d9f2956a9e782a3e898d1,2d1bf699f5a8f2c5b2817eda0ef641947c6abbe7382fb888194e1d5fdad09566,330b374790e6d56d65f871ceb5a1779bc9859ddc29fd7bfd0d2e2a36936d9e98,3ad6891a7801438b4c695915e33ab8b7601e7f96074425b4dfc81ac76d6d09fa,8936901fa82ce332b699810e836e5320b0a0c5a267be7d875f991607a4eae282,d96bffa8ce37e4148483ff508f2a60b6629938db37b26664be8f4de4e8f9be27,7b4fde34ebe05d8c5a6c7c9bf0caa3971173bbbb62450179db376c1183325c65,4e38a924326b672f732602e8b926997eaf815cb8d9552ca8b2d694d0ceb74621,8d88853e489365132031f1c19f96787bb7955fadf3a33210222260c41b46fee9,73c500ead65ef2286b5140e06deb05ec11c78caa32954452e9ac50f01d4b1574,a8fbe2c40d74d690018dcbac28ce03edac5e5078d86544f04d422cb94b2dcc5b,3070a2343f71b624450db8bbdfa58ad1d4f20d171120fad69163ff68d969b36e,c4b2f358fc2cf8d771f8adc21419ed06fb3c2eafb8aaaf57f9f0036b71b24a79,8b33b6c3935ba61868fe6c3cc82dc09cf8956ca401e4081bb9070caaecd54a00,2440f69ab8f6f3a40c2bb83c8c11fdfbb69b32c6fb92a8059fc53f72c90a0fe7,dcb1b291ea41f4aa8f4632f62cfb20860a55bbcccd5b865bb36a8c0868763493,77fe31a59eddd7b925605d0081ae357da852d2530c820db0eea6418f826270ec,5a48b14d87fe45c7ef72def490db5cba84626720dcba876037241568ce75eb0b,28282b12ce1bf020a380fff1d6276f20533530ecc1fe666744c7761e80bdf7bf,f7965deadf987642563ceb0afe231c0ba0656547a83c3b2c58eb101cfc3b6df2,75f75d426cf3b26ddcf9d81e37ab8ef4e9421820f35abeec77e89fe2f229c713,df4ad30a4d19080ef444e9b86bcb539bfde6b6172254e6348e1f8677a6f8a2ff,72d98f1549d8125c6f98aa65ce936d978b7e46761c7b738ff162098b97ca22b4,07fc641ee6efc88323ef2928b263822f66b8bc844fcf686e8b6b809cc55cb28f,6fe314848cf6b71e3dfb97e81c58e8a5cfdd5c95907beba0d80cc733e338fc4d,edbb054b6a58f073de56cb76b962686aa3285cf0061dc1274c95d7d6091b3b33,600b8c1e159b5a119a8f2856c9da15f0cc407a9440c28a9c930b93319080e11e,dedfa5adaadbb507df7acd1aff8bf15e792556ef5a20f7ed8f2f733b50a2a94c,266161aee785bfce4cd62bb7f373f7f6c5843042aec46851858b15be81f99c01,a27b39e042e6b6d8a409c02ef510e87bb4fcd6d17a583465f1e3bdef8fd5ff66,bedc14158770ae8dbc3cf5e095890c1ae813a71519a1599e12d318c109a03d73,eb6c718e060181374cbaf61401df3fe4795b5ea7d69071ca54db7ec46b5f39d5,1db3779583cd8ddfebc1c33b9554c259e73ce94f352c8b9dc65d91b945f42508,9d178e34adcadf94b206f0d04956160e3e6f1aa621ee7e901f43d5b4993a268d,6852d1772470588b412382efa795fd3839c0b5f0d5c73db60ace8d9f0654f5ac,c16d4d475f5bbf6b0fefe2c737538109175d619e6fbf84fe0ddffaa107f49624,4a2d53b4176333403f606c59b12561716543c596455de1883a1a08648cfe5633,0abf8530e6570ac69c068b160acc807b660331fb7f206267891772e05784f080,ea085e3675b4f1ee23aee81d920d14168f7740c4dae404f081263200c582d5e5,d1f88d59c10f517a00f8379fe0dd5ff60fca94e5e5a077432ffbb6a2b6f85a13,43a471ba0c43af7bc0e53f487585fc7e44a4262bb0eca400038a875430847ce9,6a9a40995191d5bc3bdb32b7ae6af6b2541e55576cfafcd97c9bcd95da4b5340,e28698e18e49e481b8a92b4102cb259584d81edf3f73468c5ca5509d5b5874b9,007b899ee4ad9cf389a4db03ed5ec69e8a2c4648cec328f0c669425089186604,8ae572d8a53847a30f5e9f2ac5d734341c2fac4fd8f574b2b9d9b24817d6e372,f857a1374f3cb2c80661ecadaf5d0e3622e72d77d266aa7ad2801e7db335b969,2e9eba7803798b99de5e59a3cb207ca53180326d7dddc4f80460ef1e3bca9f22,6d2d8fdc6bebd8bb5aebf5f4008856c427fc9b077cedef06d7cabdbb35230090,e88f5a8743a1e2cc24c07bf93d2566293ec90dc3016d6d561ac359f200afcd7c,73d8e522befb3985d72f69876a3bd5bfd656ef442af8db63f24e3802fbf7453e,09dc75bc71fad01c85dc0c7a2dd4594ae3883bf5ef8155cd2856638bf467842b,69f06e1c5773eddc50d89714a081fd26d6c271355f609d171d90f09fdb6ad311,1e8fcdd32d547ec02338d40cefd09b02b28a4ae8f8972a4fafa158107f6a890c,79dffd0030e1dd9af958fe233cbdf1959ff3d749d863da8b92bf6d2edcd114ad,e089dab3bb2519de80cf8666f589e183f4ddf80f8778282694632499c093aaad,2f342899b6e2505b72a25f7f507298b4cd5b0400f9d034d45a95fa86d127b171,5b6767fdff5a39d92eeb8415eec49f48b958e9c38151ce4356d09e43f8b397e9,a70b2878df44bd3952d9da43fea40bb475d2a87d21b8d5750c2153163af39c0a,4526593e49e532e8e498a8b14c3ca15c1749dfac9cf39a0b44b4c18ddc319440,118502524e8a02d7c7ee2cb984b598f27afb3b7b78b92326b2fbfc3c53f48464,8379f7dc2c391ac38ea1d34ddff36faf5602bf128b6d93a3a8a6485b1d8dc23f,0c17a500636a9a94b405b8e9f2fcd45b058a4a9070c156332e429daf0379572b,7e302ffccaacae442283c86d2afdf7c240d19dc42c41440419c8b78efdfc9dec,a19467bab0f5a753e4daadd080e64f13c79bdabd7e403575f9f3d3b7b6ca66fa,4162c48bb1ba5e8dd38518f9d1007300e46348e01a97184e253a3250ed0f9ffb,c1e36882f77da60283f64d2590e3389497e6583fcdb61c21d352d522506a8882,64a4716a19fd7b8009a5e6d5924a74c65ef8e5f85c64345c7b89a4e6b6135e5b,8136dbac064d798c9e30bf31e62d74f99ffb37d3bd9f3d6d3c6544669ca3cded,790f8dfbe56b27d1b82b00bf96394caa4ef54263229bf3ee5b2aa891ec8b5676,7d060a4e92f2c1f4cd2546f5409cae2c946b70556b249455dc19fb93e8dcdb9d,8e62713fc4972433c63b1c0c19cc1d291471381b11183b40e450263956a4d1f8,46255b9d4d2059337f3949e4ada5c2d16ab8385f66967291e204175aa2120986,49023745977f47f7439c701985905ad2be42b2a89c070df73ea8dc7f9c5ae627,75e6c4c28e4dedef545bbe58ea2b497dffc90ed7fe6d7261287e90cd85a3fcfa,fee9501fc25e4c85c0d205473426d6e6f4e02eca002eab6513c6467885486fab,77f39047575527668b8c86defb3a15328d6f6289ffb1dce1b01fd1c9f193f739,59e80ebb2f5424610ffc9070e39c64805a1d6a44f52993eaf0b427b3a8494b99,bfddb6b1867c2d0cf3ed074ce94fadc786226f28f98f9f1d7ac5bd6a1e040f9b,4c6aae8655346883ce266665e0c61461636a128c8804d6aca78f9c8a35356fbe,bf4462bc1f0c88cd99e30a20c6b6eeae09f7a17a737314192aac8b40056e90e1,f448286e1d5a998965efeed87d8feffd6ecc3fc0a9a8658730da10715324f89c,7619cfb410a5bb992e9da50699a6cdd82a0279e27176ebf4c1c21c12dea2459a,48395b0355072b681c77cf4684dfa228f4009c4985d013908539e34d306bb4d5,6fa9d11c314c5430db8ac179f7e1517d754781522b94f2da800a3d9db8a191be,79462eb8641df40ec28d7ae89ec7f1d5548b7b0316fb03da682726b35bfdcf7d,dbb07ef67043d85768c04c5c68e98a88685bd2785a3b20ba574403397fdcd33d,5be705a5717f0ad7688077b80765f8eac1be081d07105c7ab342db817461213e,0314be8e3cfcc6f00f5a0b3ce074f844f8126692bc9db1951df722379ca37622,b225bede76fe85a80c30ec258bcff80f9226fc3b3c07e1c75aa43e38968c85b0,ecceb05c114658703ee5bda417b23ecedffc67129d59b52a4fb60b9aad8624ee,56d6e51283d0da2e6aa6d8a166178aa5bf97c0d6ad8b6514a2b1a8701a890a54,274754307e41b8a6333f8f2d9bc679640fdeaa6954c94d91b022185d2e0f64ca,1c303f25b84f7f63fba0c97dd1ebf1148c1968658dca21b27df47ae2b86c4c2b,04638bdc28da59d45407c756701e4285ad0487858e92b2e45ccf99ffafaaf73f,ed4d011b44c9801335df5d3b5550977b11a1e78ec7ad1ebb477ad2eb707ddefe,333a3f0c920bf95d95cfaaa069a17ccfb0998ebc5697764788642ecb69c1746c,c6db8bfb6ee98557377bf8886a12c5784f613a53db3c09c161938039706941f4,25c3e1dcd0d27d63978adcefe9f862d9be8e20ed44bd80c359ffe99bc72fb095,035d2f21a40a3c5f97be226cb26e792130ba0d56dfe472b5cd9e1fd0b5d557f8,16411af320b57bac481c370cab692121e93edc942c2a6851c64737951a9594a7,43cc758c0134246a8a9e7db3f08a63709f0db02cb8431c21319e832845e3bdfe,3d9149f5c36eee7b661628d69b8d3e323b4fed8f544f8ca7b1bb575de94d465d,85ce96c84ff64f03e0c8b72dc9d6f2a4679c034836368345e22ffd0a170ad62f,2691d4f78bedcd4a6f6fa39c45a0109e4a11ce7603c656b53cca835d3863e06a,cbd21277046ea7f4572d6e8149077713575239ccf8a98c56b162b633a6490cf2,30335f29996cecf0747bf4e2b44f8ee3959e4cc277317d48e80f7726a85d87ef,afbde53c640182877df7eb5955d42669c5aa54e65ba304d6bdfb1be002cda374,d053a7b55ccdbf594d95fa053a1dd93d41a72e9c29b15b68e571e482d33277a4,3ae128f7b953405c2cd293c2e62a9c99914a7ed69d84c927c518bb9fc21b74d5,ab43d526f1dc6a32395c49806c8bc73bae918a5f3cb5fc1d0f99cc32e8d45867,7c5151e7116ff12d2325c9b2e98256e43802f6c4a15584be250aecbf143f50e3,5ee1a8ac394732056708b628216815b744eb5fefcff8426eb48d682ae7fe0bdb,e1f06ae08a52e1e4e7544d0ee343d33ba6ea5a71d7ce00c56a3f14058a199d78,771032904be77e19c389ae615a39e78aed70ae8e233edd8f3d5aafee1e4691df,cf0dfd60ef8f949ec0168439c7022546c5f00634e7fdd668900bcad1e2e81756,84bb868f3ec690f914e3a8cde683b55653e554bf5ae6516304ca95e3e0be0ce9,2e6bb4a91f7df30a0fe05ad3d02ea64b6a571a089ecd6e1a2caf900e5175949e,566cf7e6d6419fff93e8f18bd34b7fdb2db9b2d4191434e37a97e3a5cd00b186,912729b57611e1422879af83c5d11bb416c0b98fa83dc392bae590d7e90d5d12,54a7f54922ffc66260dcf30076c4cc7fa254cc9b830b2e37349d7b40f0d67231,d2cdfe1068809e2e519bec2fb30eff036085ed0fd5a174157f4a531be489a9c4,00c19bdcfabceeef4ab4c71251f41d59173c43b87ef0e968e7aa5bcf77fc3aa3,00a1b917cf86485c9e86030ec1afe9b7e28a4345f46471b92b4e0d08b698bae5,17b23ef7d38a3a0334ef68087a585ac48956984f6e0321c62d30011368954485,1fb0c2d4d015596c3439f405da4a7a2497ba94cdecb535e70cfda08c6a764f4f,993c1131175eb1f3b8b5d1d72ea5addac559a20b5154838ee86aa9b71e06652e,2ede50271add1f8aa5b91bcd222d83eecea7f4a524c9e62ec01cd889a55aad45,20ada1b4fe496096230fec2c00bff8a037db5079c6f45955317df9c2ede5f85b,b37b8821965b243026b83a59ea4e4e2246545fbcc1100d8effeca612a3b6bb4a,0760c516052f81058efd89aa11573c744ffd4f5685e11e9e200bd0ba0228ee34,fc3cc3b0dc5592a8c0a2e41d3ba995c0f65efbf2797c2b7b2403bd2c552acd64,0475e984bf932adabb1fe98d943ad23fd56e4bd53c2e7bbb12ea69b7996430be,d60ec04ea36dab7f685a2dc50c2f76ede60a6b594b15317d7e32d2438eef36ef,13dbd661bb4f0bc0854b761b94470f2c8d3ea069c2b2c53d07f40da9668515a2,875472cab949b679152079e79cd06ad376c30f4c298b2f7e191f5f7ef3aa1ccf,bfc95afeb7c01ea29780954bc62c9830af90e4a8882b64d24e65d7c30e075e48,4d100b664eee670a68d88d07bab4ca55dad28da862b2af631b29d5031920e10d,1275cde34b3de398a87fccd8bfa2261f826983ea774a0a413843f9de07beac70,b3cc121e4d7f7bc008ecd7d79b2f08d32c34c036c64678ae7cc43112b4297210,46a13985c51e2cae515be2a8f1eb0b42fea64cf366057a611cee74aaa7c648e3,df40e86985f66578e1ca70bea1c1a58b943c3b37bae49f639a547e759239513a,448cb5c2de497679de2161a93b5e0983a6030a33a59eee2b3171c56a93bc91d6,e6b371651baf1c9773ee1e240d51deda5f237e8da74048af9f3379f70f1c8e2f,d24ec5de76732220049843cf0ce87053bdfb223d8e45cdbf83a8d801ed486850,4131794225ae70468171aefddf3e5875a8ab294263ae4694f93a68e8314b0b5c,f5958acf10e9d5f12d9b0349bda1e652273977c36e1ad59c383bbfb512abcac9,19dea7117e47e557bca2019c09173879bde7a9703e7577ec5bf2270fec6aca6e,3cc640e6348efd77de2a22367f609c2f68551d4cb917f27c32c2dbc422827dfa,61d21b2cb4586c4ce3178f6ea51d905d9d00d79d85ccea52e5f4223811e12a44,44e06b75ecca6b3a9f91813c716c0f61f5990f498c5ed17a41ddfcdc0db48368,8da1c8bd377bb3892265639b26a72b7780393a8a43f6471a5eb1abd1ec88ef3d,f5e58a733b69af1ef5fe8a9a580b3790a792e44ad32a29e98d9f7f142862b298,d1e1dc03f1d6d75da644b8a14f8e7d3906b47d50968273f0707142bdd810de1c,d1869756e1200628a18e401e9510a9f78604ce91faf67c2e759a7b28c6eb882f,60dca01fbd010aef036b6ba742978ebacd1c49ba999e06f1b7985c5c0e96055f,c731ad94fa972ca5a7bc709d2cccf187ba47bc6299dcf3301b62990064e04fa2,d1cffa5c6c044dd22a8a0990545ac7bf5edf04b38820230af853949612ef7075,cc351a659c1718306c90276e7a58697709b69d2dd06af2dec6891ac77ac62a3c,82738ee011e454410ea714fbeccad19fe15dba4e62b7d1b85e65e7f8ed2e6286,2d2f067acea2451a17ad0f2beeefcc768dbf52a01f437a5066f49fac1d3eb312,fabad1b8e1b3a3e11810c408f748a7e70449f4274aaaaaf69b11ffeaff1504e7,4ab824b1479ec872488f501374e22488e0b8b4612ea16cca5208783016af9858,1b5dcad92079e86412309d5f85b01631a7aa3d7eda261080531cdeb89c96bcdb,a1809967d96449a3535d19e509fc3ae58b714805141f6487aaf06a7b00f47dc2,081fde0ec6f26348e2626daf44d932bc31d3ac3cc6546061484f9f68b0499422,c3d10191066b94c7a89f91f75fc9aea86e17ac5894fecb8c0698957771d196da,b5474f0aebab60ca12d4f8097a499f3fc063ad6146eb6db4191bc05ce82312ed,147a78e0d0d68aa642b97ba83e7b45ff5b367341f0a0a4f551f593f3ed8855db,47b2514697f7793be6f9ed37ff3cee74a4d1a3012d468c6069c50b6681ec07d1,d59ee71f32fc530efbc54952356a1e564e7fb077b9323bc032f6cacd7ed47917,f0c7fa099c97483728d04f577f5b1462443136e52b9434b5875e00984eab9fc6,a8d103d654099371f1a97f34cfe997683000cf2e7a525376d6af1ac2b75d71ac,cc5f68d406097c09e8d86b667213f52b77d3e0e543c86e3dbede40e8c1f7490d,b495595a4d94415ad9e3c6fbcb8589ddbaffa7d0c9077fcfe261efecc76bc957,f4359ca550fc3fd61f08b20e7714d37f1ea257a2d548fcc6a40cbf1bbc4bfc2b"]}],"fee":{"gas_wanted":"4000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"uf7pPVJotPdnjh919OR07N0qG7313aWw7TKinBPFfdM1FJewhcRDcfwE9YCzAqyZdd/XSxi3eTF2Y4ee+BWb2A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1qlat94g56gxnl4rpp9j8mzjdhdyhxcp0l2qeev","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AimRwMeXE1YZqRpjQbxhh2Bg6dNaTJcTYJlyB8lKbDOU"},"signature":"o5E4KMKSs3Il0GmFgwv+jS0KAEALFzH4D1qtiLGSW7FxxkuZabIIL1qXc0nkRDBwG17m4b3UUp2xKtcAGaYoaA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16fy26gwg902qqgwmay4jnemlcc3asx7k3qh4yn","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AmSDdXsTEtJlZrGOHxs2VfxwsfbaInLXllYi4zxy+JF8"},"signature":"kGerH5al0/grluD557WJBzmhUANlnKde/tAO13Frift7qD9adIhjxGJEUH3f6U80NYyQglVdQEaNyrKPI3X8wA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1gypwf56urpuw40xnmw8w6de8zz7h0s6zk22jwq","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvlKRoVke0H+eCBlyTnbaVPYhJCZ3HBeVFanWbGyUTd3"},"signature":"uHNDhQuJ3D2W/VCqsGmt2ZyV2hDDmg9qxTYxv2TqTPw48gO67Ib6ByglYJ9Qufc54IWYQP2dGJ/2eBxWWLUrPw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1qlat94g56gxnl4rpp9j8mzjdhdyhxcp0l2qeev","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AimRwMeXE1YZqRpjQbxhh2Bg6dNaTJcTYJlyB8lKbDOU"},"signature":"LGvQ1pX+Dt88VPjkq0AKCLD3Ouunn382okA4DYefQnw2fvihKUpwBthyoiQRI3EOD1EKvEPo+vtTTpO8QXNqfQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g18rxaq6fd9k2fe0tknfp2fg5wna8uv4wwd3a2nz","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"BB0Gy2+BP4ylLUQNgHf8/jhMcJSY69SnRZMpJAKgPI1XWJEiVvmcGsbos9h9nYHXmBnZzHKzqaTc7U8YGJ28Lg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1uvyyu9h367wcmc6n888de3nur47xk687udc2ex","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OonphPMIKXwYOMcOB9bBbFqH8YgkrpmvHSJT+ZXnZQRvO8Yo7myoOlV7rXlphCZgEOn525q8z1Z0CDwfJe8a9w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1edhv53akhqdfq6e9mh8nydu0h6jxfn7qf6sujf","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ESesFXXuXOU8Ki5J6RZDrswh8cQ5STOQ3exFojeX/kQT3mIfrBfva/VmzlgInaCXY95gL0wOz4I+RDphx32cIQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"2Bxy/HIJ5jNO7FdLmMQ+OpRUvH4ZHlIIXK1awSO+mp87a1Er0O0tEgZq5h63RoqzIB5VuktcgYDtTQ60HBcd3g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"mgL6tpec/Uv5AWjIAAkzmKybojHt6GZ/saKgA33wZ5pX/T8naZPq6uuzS8ck1r2J812ClzPTM7k2yzg5M+PBmw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/staging/v3/raffle","func":"RegisterUsername","args":["klol"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"gVYQH7C3W02Pc/U5+mqHkshrk+m7458N2ifTQkEyJSZcVUMd27MhsXC9zqJQKpweD7lAAtN9bjG/hqByqWTwow=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"8000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"l4i493UqRJPN9nqTFSqo7gEN5q4vqJoXNO/s1CnrtJQxxy1NmpKk7/CS2I3KlaWwsWhbvXaaAZK4h5zE3tj5sg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/staging/v4/raffle","func":"UploadCodes","args":["a657602fc08191e7a4e0255a818a0ec544c8ce0826fe9ecf0c47eb538b2a9920,e4ce35fc370cb77c8416d6cf248e406c3f41073955d2d1c46dfcde630437711c,d1c73632a00861c2a57502edcc7105df21e22f6f4764e07dbd76c1dd456fd763,5e9a113e15140d8e7ec30a70d999038970da4dc84b8517fdf93d8eba56b4f4cd,d0a8e682db50c4b5f16dbb1c206cc8086f58094642d5864db8cd5feaefff0eae,6d0d8c67778d4ea8ac5ed234c12075b7ccb96350ea84711f455eb1538ac30025,e287bbe122d9be4c90d2fc62e51abbc67de50f6c8044636a61e7f801081ba907,6c4567fdd88ee306f715eac751010b5ef8a66bab66258e580be4915898b1dfaa,85463175e47915820c55acbc2531eaf360a8c0586c3b59cbbf270efcae64382d,b9efac79a5d7a24930b1429e884c0e8834954c07d71fbf65eb2c6ed9deeb4b86,e22a3c12a95f1f07a0efc398da7c39c4dfa75447f17a03184271cfb5a5c96878,38b9840b1b4424a90d4999dae44d5e84b91ca5ec9f9227019134b124e17d9365,e8938fb84352f04418c0004d647b83627f9a87ca6df5565acb3af41a5ae4e96a,0230a0c0692cb9a8a5ef678e43f6693c48798ca10cc18694beaffea4825d8ea2,df9656caee96c6307c2a5f1b8e7ccd5939ec5d5d20902865d6bea75c696ece8a,0826a9dd51b29e6c2a5fa4851b9901938766a966be238bde273b4e18d13d8f52,3b6f3cc0d0a263cac2542c2280f43f15fbcd5e84a8e381def4f85ead1f50fc1f,203d4d1fbd75126347c4d6f5507e9d0a3a3e7c882add72157a036c9dc4e66512,7390338a73bb575ba433c21c4f20046fc84e068569ae4dd646105a9a6a58847a,336dd7b5898bf4970a26b5b4a6fe676b5dcb8717e001c9b35bb77ef470b4a7aa,8a9664c99a6f9c834aa54c4a762a31e8047584637fc9062e5069c0aa72631424,f1c8980ccb671cdebf22a160a6e80d7e32fbaee249642d0542b0c200d49aba3c,53448154f4b36b94312be81822b1b5e50dccfdc79b32e2c22b16ccc6b7d578d3,f70a7b08f88830a74830a78e9cec3f8d232217b113cdda0c8999701ad03e8d9a,ebabcfaf537123853c1f4fe32663ab2b9940ca380a469c90b4335a3cd75ad845,f11b62e725abd3132689a08c414a9d8056306685ad579015234147ca8d951ef5,e8746cdb50ea505868f1b14a639befe60793e1b098595ada30da9dea8543f85e,d64f3d1df00b2499d8dfb70a7ec677b6254194c1cc6fbccf2a5de0a1554aa73b,bbc3769aeb96573e828bcb88d4043326422a486cd7408d673f55a74c2bceb905,89b3990c08d38bc4f157d83dc4a3de9daa22d47eefa2b8d2083b45e22d987059,befa5f82ba8c1e203827afdd525b1bff339db39bd687499e67cf4ea0ff1ea7da,35248acd0ed6d6a551b7e6bc46f5fb6c5e00e996021298370a3a6145e45557bc,bacccc0dddadfa4e5ce03565a4d60fbfa13e4c6df882b4c5380c63c2fed1c72a,c3482d84d0f68d7340aea787390aa271051697c9f6189e01c970ff18cc871113,d03111e4fcf3c5706acbcdf03408f27c392de6d622b6c587fdc01a15aac8511d,77d3c66add6417b3c82b33ffc4bd56f99f0e1f2ad6b50cb7dfa52cc20fbe53c6,de52618ddb2a0814d537e701065d093dd99b15ff8ed9df4a47fae47b36191144,e5b2c494f09c57fcc1a2f1c81b8bd543418561195c1b406ff0933c80bc43926c,290862b65579a5a9e7b7af38787aadd098db50c474fc8973f1d40935c2abdff8,4790aad6ef509672d5b51ba192b1465f4c7c8c8ed5575164e549502498cdc314,bf421d436ac5cac95ebe884d84c2bc10865b614ffda07ba5e47bcfb45d0cae68,44119bae5a9ad9707bf4ae45b986db6c14910549c134977cfe4a9722d8bb8413,8b66d6f823efce27b5dd4ef8df2e7c420f977683ad951e55117133c96d3a2fef,7950ef46b73ee87379ce9bdcc80e7fb5cb1e2a0550142d09772f5adb48990783,47900068bbfecf6e272a543101b24e3284cf97d20f10c83e0cef34fd3d7b8939,9b70918fe6fdc6b997251f8988b1e28b26fbcf5b00aa009b54ed6987954b1054,87e5fda75dab4f89646c832951c3ca0ee2ed7908eb67be8b7665bca0c11d4863,e2401111629a0f6b97c09b98cca394d653ef3b2b7b130e6dd97a1bd278be6fd3,513ab2a40f29de856e9e75f7f556384b5793b52630966e2572448201b4d91241,38ce4e383b82bba6324efe0b591a140e108a140d348964e12fe4095f1ec28836,10ecfdb05cccb69aac313df1b85b6e9a8d16239fc72b6ba01d54cb3a01367d23,63a2f5ba3d1e707b0d2e7143e6ae0b59d2db066c910d8dac1044282a7b414a2c,5358b5d792244a4a9cd76b1a53cecb72edd8ad86b150bee596bd111984f37c8d,f1472a16d28eeda10cde756bb0fc9b1edfd72086ad1b7ba848f3b2c7c0c1ba60,12e200388a96f0c880cf48e93b2ea96287b7295b64ca80618e0425bf57fefc12,ebcc48149e5fef8d883c2feab956bf116beaefe8ab9eb751ccf991036fbd21e2,0c40425718e03bb1dd82551fce54f4580e8220fea9f6d615b026698fd9669c80,4848690fc49a95c439cec58f89982b58840164815d953c8fa87ccaaab2bd1731,6a16bad26a7cc979a4f8e5eedbc80fcfd9ed7ecab91193becaff50f33efc28da,ebb1a01c03117dcb0aaea770106bbdeaab4977f48c996a4f099afeb1b2facfdf,01b214bd9fd35002db91584f4eaf2c6be48033f47e10de7b3688a8ec03c3ac76,7826ebc97a654bf788cb023f6be2dd87989948ed6c1459af75d66323ec609933,f5e1f76ada455535d638d72d5ef1026376845487d1b6f36a260e4c7e9695601c,3f7f2d5f5a5880ceb62584e53b591be6daea1c1256e40d08bcf800341c0f4998,81d396417b5c2f4fa3ba7ff9a549bcc4828c67023f02e312a1d2b04d6a0dc284,a038ade0998e9b9f9b8f6a6c07f1fcfd71a94c2cede2e008c01f20c5bcd8c951,440bf41f1820ae151a8b9b7d9929092506b9b37ff9008d25b420189f6c5fca13,3a84efff563cbf7b4d8d5cb263f4f5fe0b165d6489ef97cb5f027132637d5966,7424bde3031042dca9b2772420802729013620f0080339286714a1cb025819ff,7ce7ac17c0ee78366435633c0e6a7856a39191acdd31e0a4fb8ac805e34d46d3,aec871aab9cd61464a27bf28f20f9787d1487fc7db381755b446eaeda32bef95,1776c5cfe011cba0de6adedc058437199b5b4d022891b700ad34c253bf51f528,77c42978cbb6d4e9ea009bad225ce9c6b9628ef385b0e920d840fc717640c2a4,0234edb9221988c6f9926a02875e25f902636edf0352dba3119c80576f6d234a,a3982bc2e9fc9bf4ba8a557faf0fe3c87c7d70704cc34bb257ccce850a56df9c,1028d4888bcbd6de66991f55b05281908a43bd721999e52b864043e5b20a1b4e,1243e8b9d1f3f9faf60a3ef85df793a21cd32fe70be208daaa8b581ef2ce8e68,f126a0245767f09b0673b4db69cd15c21f5bd30db6a4bba8d1a31ea641d58b33,3f2c79cfe02d3997fceb691aeb35d7cd57de441b4cef6e30b9b962deef9c50b9,f5fa2ea7bb2b4c8c6ffc48161983f88bdd19be45a57fc98ff9c1fff82f801014,d8df89e0cdeb42bdc936da63cde0fb936f56dc234da63917663fd7372b7660e8,0e8b757308130fedef4420b79e3d3945e6f8d2d17850eed9309e4d130f654672,b997b5fc7ccd97a0539bda23185af6f510eeb5d73de4fcd6647784567295bc6d,a3e3ef6e658b4466bf2171c47455a80cc2bec6a90dcc1fb3390cf744eb53c1c7,8fcbfc5d27166c53d080f471d16f6bc8e8aebd92f0dad07de4b859495ff042e9,28a00715a1445747db570f4072a94bb51e3174665cc256982f68eb73ae373ea1,b9a85ace3beb1b30f5246b3226efd57c9f829799fe621585ee7835f55d390960,76f2d988a34611508881726f80b18430753a9bddaf239fa1e3ca248c07f563d1,810a984e20a8f0d9fea02b69a9d0d7ee64743d73c24919f060355c58221659db,ec0ceca541ac704ef78375ce66bae03e2ac7f948e14d0702702b5edd44431ed8,45c038cfcbe4bbaadb423bfb6d69aa166bc36444478eddf04dca330e747645df,66978f4b114af8a2c7bff35caddd57b0e34d4469422e1f5177d84efbc29e9f9c,68deee2f5ed12726ba48c143de86f5bfc6f52e42387b6b118bd6adc15c6398de,a0db86d2a0c9ce98a0e3e45bdcad8786af03bc8c616726b39e73514d242903fa,585814809fdc5504c535b33a7905c9eb1fa3fa49d614de3691714738ae50800c,1302a8f2dc151addb559c3078c9ff96e4d0c0830e741837ed7167acab0f9c665,4142bf0dad7aed829ce45f47b9dc7301c99ce48eddc44eb72bbcd790238e51df,7258b40d72fa503550edd920756c4a1707b73bdefcce5ea94e79077e215c2ac0,14e73a66c7000d5cb2e2814cae0efb467f7a7db3ff586781127d35755ee90dea,b0847a80927caf523b377dd8e6afbfd29d9d247489f5531492b52a1603efaf31,1fcbf67cb147f8550780d80e16f5a9e22e28d5fd73ad04c7eb05f089173f8e6e,4b7ef70b85443c71ed7d39c56825a8d6faacb85a4697cafa4945680a0ad3a9d3,5915da1266757108bc408ceeabd04a99c93f745af0462d1df9ac42384cca7e07,b3acef10f8a2f04d21dc8856c7e138f103dbdc5e6b34e6871b12eb2ec6907a18,8da8f353e95c27476094aa037c06d987f72ab08ea5927af07bdffd24467a5f68,0502db50a5bfbbfac71e959bd4f372a47e83ab6a17a255b0e60b402c122b3fc8,04ee807da45b9a2a8a1cdd0148e1babb794e9e7584c55f370a2f723a16632c2f,79ed422a442f7b3a6b194660ec90560b742b9ba018c2bedd72d6d5a60b332c5a,07fdacdd8c1909fa7042e20ffe2d5f5bfcdbdb59ebf3e11886d02a5f0fbc05ed,361e57a73aec8cacee32496094263948fbd6a9d96e731fafec127eb9fd813f26,c36e6c40c3035c5dc4d8f015363c4591dff5a0e2065aa719c751cdde1a81bcbc,9bac59d959407ea715e81eb23ce43cc88e462c5a25ce525a5dd7b417ad7ea7d9,8dc69bf8158365d866d999fe69b6a7bd869961bafd09863b30d7d6a114bfc5b8,b00f70f3daa8b95576f82c3e59ecdd8558029ee49fe3f726a39d06a1e8fffebe,7ea988c095c4107824bced289ab7d21136e81dddac6a57af836e639135a08e05,966476658b04905c11608c684e267508c9f875f90bb03178b6b4b93ec2f98f13,f2d19b603793cc43563223651b218f8e465f1bfbbc803ac0982e75c8424e12e9,87610850a33a00749627bbc7c6e0aeff65813378733563d05b09333ed445ed54,b980b9789136661518c8864a2caf5f5ef7564408d05391888d25695d6bae1c9b,5fd10e734dd73befd2506c7a4b3d9c453366788763933a32ae7c8a1cec69c000,420858c69ef2cc9b5077f786392fecefbbd76501a8843ca13755a8efbfe6c6d2,6c6dd279e6b135970fe3352b41771341ddb0da7b41b5347b53004970ca2a07d7,247bf14ff84a4c498caeb9aaf249d186db1f84e19363a1a3f118801a57ba09e6,2d568b421ddbe5486bee08dd6d1c584f3311eed85dc714aea72efbc8f26b1b66,274b1391e2d9c3416515ecc8d10061cd1918f9fa9b7e91c7e96934e9cb6bc8a1,25fb97b440fd5a8c2148b8301eadb6419c1350003e4d9f2956a9e782a3e898d1,2d1bf699f5a8f2c5b2817eda0ef641947c6abbe7382fb888194e1d5fdad09566,330b374790e6d56d65f871ceb5a1779bc9859ddc29fd7bfd0d2e2a36936d9e98,3ad6891a7801438b4c695915e33ab8b7601e7f96074425b4dfc81ac76d6d09fa,8936901fa82ce332b699810e836e5320b0a0c5a267be7d875f991607a4eae282,d96bffa8ce37e4148483ff508f2a60b6629938db37b26664be8f4de4e8f9be27,7b4fde34ebe05d8c5a6c7c9bf0caa3971173bbbb62450179db376c1183325c65,4e38a924326b672f732602e8b926997eaf815cb8d9552ca8b2d694d0ceb74621,8d88853e489365132031f1c19f96787bb7955fadf3a33210222260c41b46fee9,73c500ead65ef2286b5140e06deb05ec11c78caa32954452e9ac50f01d4b1574,a8fbe2c40d74d690018dcbac28ce03edac5e5078d86544f04d422cb94b2dcc5b,3070a2343f71b624450db8bbdfa58ad1d4f20d171120fad69163ff68d969b36e,c4b2f358fc2cf8d771f8adc21419ed06fb3c2eafb8aaaf57f9f0036b71b24a79,8b33b6c3935ba61868fe6c3cc82dc09cf8956ca401e4081bb9070caaecd54a00,2440f69ab8f6f3a40c2bb83c8c11fdfbb69b32c6fb92a8059fc53f72c90a0fe7,dcb1b291ea41f4aa8f4632f62cfb20860a55bbcccd5b865bb36a8c0868763493,77fe31a59eddd7b925605d0081ae357da852d2530c820db0eea6418f826270ec,5a48b14d87fe45c7ef72def490db5cba84626720dcba876037241568ce75eb0b,28282b12ce1bf020a380fff1d6276f20533530ecc1fe666744c7761e80bdf7bf,f7965deadf987642563ceb0afe231c0ba0656547a83c3b2c58eb101cfc3b6df2,75f75d426cf3b26ddcf9d81e37ab8ef4e9421820f35abeec77e89fe2f229c713,df4ad30a4d19080ef444e9b86bcb539bfde6b6172254e6348e1f8677a6f8a2ff,72d98f1549d8125c6f98aa65ce936d978b7e46761c7b738ff162098b97ca22b4,07fc641ee6efc88323ef2928b263822f66b8bc844fcf686e8b6b809cc55cb28f,6fe314848cf6b71e3dfb97e81c58e8a5cfdd5c95907beba0d80cc733e338fc4d,edbb054b6a58f073de56cb76b962686aa3285cf0061dc1274c95d7d6091b3b33,600b8c1e159b5a119a8f2856c9da15f0cc407a9440c28a9c930b93319080e11e,dedfa5adaadbb507df7acd1aff8bf15e792556ef5a20f7ed8f2f733b50a2a94c,266161aee785bfce4cd62bb7f373f7f6c5843042aec46851858b15be81f99c01,a27b39e042e6b6d8a409c02ef510e87bb4fcd6d17a583465f1e3bdef8fd5ff66,bedc14158770ae8dbc3cf5e095890c1ae813a71519a1599e12d318c109a03d73,eb6c718e060181374cbaf61401df3fe4795b5ea7d69071ca54db7ec46b5f39d5,1db3779583cd8ddfebc1c33b9554c259e73ce94f352c8b9dc65d91b945f42508,9d178e34adcadf94b206f0d04956160e3e6f1aa621ee7e901f43d5b4993a268d,6852d1772470588b412382efa795fd3839c0b5f0d5c73db60ace8d9f0654f5ac,c16d4d475f5bbf6b0fefe2c737538109175d619e6fbf84fe0ddffaa107f49624,4a2d53b4176333403f606c59b12561716543c596455de1883a1a08648cfe5633,0abf8530e6570ac69c068b160acc807b660331fb7f206267891772e05784f080,ea085e3675b4f1ee23aee81d920d14168f7740c4dae404f081263200c582d5e5,d1f88d59c10f517a00f8379fe0dd5ff60fca94e5e5a077432ffbb6a2b6f85a13,43a471ba0c43af7bc0e53f487585fc7e44a4262bb0eca400038a875430847ce9,6a9a40995191d5bc3bdb32b7ae6af6b2541e55576cfafcd97c9bcd95da4b5340,e28698e18e49e481b8a92b4102cb259584d81edf3f73468c5ca5509d5b5874b9,007b899ee4ad9cf389a4db03ed5ec69e8a2c4648cec328f0c669425089186604,8ae572d8a53847a30f5e9f2ac5d734341c2fac4fd8f574b2b9d9b24817d6e372,f857a1374f3cb2c80661ecadaf5d0e3622e72d77d266aa7ad2801e7db335b969,2e9eba7803798b99de5e59a3cb207ca53180326d7dddc4f80460ef1e3bca9f22,6d2d8fdc6bebd8bb5aebf5f4008856c427fc9b077cedef06d7cabdbb35230090,e88f5a8743a1e2cc24c07bf93d2566293ec90dc3016d6d561ac359f200afcd7c,73d8e522befb3985d72f69876a3bd5bfd656ef442af8db63f24e3802fbf7453e,09dc75bc71fad01c85dc0c7a2dd4594ae3883bf5ef8155cd2856638bf467842b,69f06e1c5773eddc50d89714a081fd26d6c271355f609d171d90f09fdb6ad311,1e8fcdd32d547ec02338d40cefd09b02b28a4ae8f8972a4fafa158107f6a890c,79dffd0030e1dd9af958fe233cbdf1959ff3d749d863da8b92bf6d2edcd114ad,e089dab3bb2519de80cf8666f589e183f4ddf80f8778282694632499c093aaad,2f342899b6e2505b72a25f7f507298b4cd5b0400f9d034d45a95fa86d127b171,5b6767fdff5a39d92eeb8415eec49f48b958e9c38151ce4356d09e43f8b397e9,a70b2878df44bd3952d9da43fea40bb475d2a87d21b8d5750c2153163af39c0a,4526593e49e532e8e498a8b14c3ca15c1749dfac9cf39a0b44b4c18ddc319440,118502524e8a02d7c7ee2cb984b598f27afb3b7b78b92326b2fbfc3c53f48464,8379f7dc2c391ac38ea1d34ddff36faf5602bf128b6d93a3a8a6485b1d8dc23f,0c17a500636a9a94b405b8e9f2fcd45b058a4a9070c156332e429daf0379572b,7e302ffccaacae442283c86d2afdf7c240d19dc42c41440419c8b78efdfc9dec,a19467bab0f5a753e4daadd080e64f13c79bdabd7e403575f9f3d3b7b6ca66fa,4162c48bb1ba5e8dd38518f9d1007300e46348e01a97184e253a3250ed0f9ffb,c1e36882f77da60283f64d2590e3389497e6583fcdb61c21d352d522506a8882,64a4716a19fd7b8009a5e6d5924a74c65ef8e5f85c64345c7b89a4e6b6135e5b,8136dbac064d798c9e30bf31e62d74f99ffb37d3bd9f3d6d3c6544669ca3cded,790f8dfbe56b27d1b82b00bf96394caa4ef54263229bf3ee5b2aa891ec8b5676,7d060a4e92f2c1f4cd2546f5409cae2c946b70556b249455dc19fb93e8dcdb9d,8e62713fc4972433c63b1c0c19cc1d291471381b11183b40e450263956a4d1f8,46255b9d4d2059337f3949e4ada5c2d16ab8385f66967291e204175aa2120986,49023745977f47f7439c701985905ad2be42b2a89c070df73ea8dc7f9c5ae627,75e6c4c28e4dedef545bbe58ea2b497dffc90ed7fe6d7261287e90cd85a3fcfa,fee9501fc25e4c85c0d205473426d6e6f4e02eca002eab6513c6467885486fab,77f39047575527668b8c86defb3a15328d6f6289ffb1dce1b01fd1c9f193f739,59e80ebb2f5424610ffc9070e39c64805a1d6a44f52993eaf0b427b3a8494b99,bfddb6b1867c2d0cf3ed074ce94fadc786226f28f98f9f1d7ac5bd6a1e040f9b,4c6aae8655346883ce266665e0c61461636a128c8804d6aca78f9c8a35356fbe,bf4462bc1f0c88cd99e30a20c6b6eeae09f7a17a737314192aac8b40056e90e1,f448286e1d5a998965efeed87d8feffd6ecc3fc0a9a8658730da10715324f89c,7619cfb410a5bb992e9da50699a6cdd82a0279e27176ebf4c1c21c12dea2459a,48395b0355072b681c77cf4684dfa228f4009c4985d013908539e34d306bb4d5,6fa9d11c314c5430db8ac179f7e1517d754781522b94f2da800a3d9db8a191be,79462eb8641df40ec28d7ae89ec7f1d5548b7b0316fb03da682726b35bfdcf7d,dbb07ef67043d85768c04c5c68e98a88685bd2785a3b20ba574403397fdcd33d,5be705a5717f0ad7688077b80765f8eac1be081d07105c7ab342db817461213e,0314be8e3cfcc6f00f5a0b3ce074f844f8126692bc9db1951df722379ca37622,b225bede76fe85a80c30ec258bcff80f9226fc3b3c07e1c75aa43e38968c85b0,ecceb05c114658703ee5bda417b23ecedffc67129d59b52a4fb60b9aad8624ee,56d6e51283d0da2e6aa6d8a166178aa5bf97c0d6ad8b6514a2b1a8701a890a54,274754307e41b8a6333f8f2d9bc679640fdeaa6954c94d91b022185d2e0f64ca,1c303f25b84f7f63fba0c97dd1ebf1148c1968658dca21b27df47ae2b86c4c2b,04638bdc28da59d45407c756701e4285ad0487858e92b2e45ccf99ffafaaf73f,ed4d011b44c9801335df5d3b5550977b11a1e78ec7ad1ebb477ad2eb707ddefe,333a3f0c920bf95d95cfaaa069a17ccfb0998ebc5697764788642ecb69c1746c,c6db8bfb6ee98557377bf8886a12c5784f613a53db3c09c161938039706941f4,25c3e1dcd0d27d63978adcefe9f862d9be8e20ed44bd80c359ffe99bc72fb095,035d2f21a40a3c5f97be226cb26e792130ba0d56dfe472b5cd9e1fd0b5d557f8,16411af320b57bac481c370cab692121e93edc942c2a6851c64737951a9594a7,43cc758c0134246a8a9e7db3f08a63709f0db02cb8431c21319e832845e3bdfe,3d9149f5c36eee7b661628d69b8d3e323b4fed8f544f8ca7b1bb575de94d465d,85ce96c84ff64f03e0c8b72dc9d6f2a4679c034836368345e22ffd0a170ad62f,2691d4f78bedcd4a6f6fa39c45a0109e4a11ce7603c656b53cca835d3863e06a,cbd21277046ea7f4572d6e8149077713575239ccf8a98c56b162b633a6490cf2,30335f29996cecf0747bf4e2b44f8ee3959e4cc277317d48e80f7726a85d87ef,afbde53c640182877df7eb5955d42669c5aa54e65ba304d6bdfb1be002cda374,d053a7b55ccdbf594d95fa053a1dd93d41a72e9c29b15b68e571e482d33277a4,3ae128f7b953405c2cd293c2e62a9c99914a7ed69d84c927c518bb9fc21b74d5,ab43d526f1dc6a32395c49806c8bc73bae918a5f3cb5fc1d0f99cc32e8d45867,7c5151e7116ff12d2325c9b2e98256e43802f6c4a15584be250aecbf143f50e3,5ee1a8ac394732056708b628216815b744eb5fefcff8426eb48d682ae7fe0bdb,e1f06ae08a52e1e4e7544d0ee343d33ba6ea5a71d7ce00c56a3f14058a199d78,771032904be77e19c389ae615a39e78aed70ae8e233edd8f3d5aafee1e4691df,cf0dfd60ef8f949ec0168439c7022546c5f00634e7fdd668900bcad1e2e81756,84bb868f3ec690f914e3a8cde683b55653e554bf5ae6516304ca95e3e0be0ce9,2e6bb4a91f7df30a0fe05ad3d02ea64b6a571a089ecd6e1a2caf900e5175949e,566cf7e6d6419fff93e8f18bd34b7fdb2db9b2d4191434e37a97e3a5cd00b186,912729b57611e1422879af83c5d11bb416c0b98fa83dc392bae590d7e90d5d12,54a7f54922ffc66260dcf30076c4cc7fa254cc9b830b2e37349d7b40f0d67231,d2cdfe1068809e2e519bec2fb30eff036085ed0fd5a174157f4a531be489a9c4,00c19bdcfabceeef4ab4c71251f41d59173c43b87ef0e968e7aa5bcf77fc3aa3,00a1b917cf86485c9e86030ec1afe9b7e28a4345f46471b92b4e0d08b698bae5,17b23ef7d38a3a0334ef68087a585ac48956984f6e0321c62d30011368954485,1fb0c2d4d015596c3439f405da4a7a2497ba94cdecb535e70cfda08c6a764f4f,993c1131175eb1f3b8b5d1d72ea5addac559a20b5154838ee86aa9b71e06652e,2ede50271add1f8aa5b91bcd222d83eecea7f4a524c9e62ec01cd889a55aad45,20ada1b4fe496096230fec2c00bff8a037db5079c6f45955317df9c2ede5f85b,b37b8821965b243026b83a59ea4e4e2246545fbcc1100d8effeca612a3b6bb4a,0760c516052f81058efd89aa11573c744ffd4f5685e11e9e200bd0ba0228ee34,fc3cc3b0dc5592a8c0a2e41d3ba995c0f65efbf2797c2b7b2403bd2c552acd64,0475e984bf932adabb1fe98d943ad23fd56e4bd53c2e7bbb12ea69b7996430be,d60ec04ea36dab7f685a2dc50c2f76ede60a6b594b15317d7e32d2438eef36ef,13dbd661bb4f0bc0854b761b94470f2c8d3ea069c2b2c53d07f40da9668515a2,875472cab949b679152079e79cd06ad376c30f4c298b2f7e191f5f7ef3aa1ccf,bfc95afeb7c01ea29780954bc62c9830af90e4a8882b64d24e65d7c30e075e48,4d100b664eee670a68d88d07bab4ca55dad28da862b2af631b29d5031920e10d,1275cde34b3de398a87fccd8bfa2261f826983ea774a0a413843f9de07beac70,b3cc121e4d7f7bc008ecd7d79b2f08d32c34c036c64678ae7cc43112b4297210,46a13985c51e2cae515be2a8f1eb0b42fea64cf366057a611cee74aaa7c648e3,df40e86985f66578e1ca70bea1c1a58b943c3b37bae49f639a547e759239513a,448cb5c2de497679de2161a93b5e0983a6030a33a59eee2b3171c56a93bc91d6,e6b371651baf1c9773ee1e240d51deda5f237e8da74048af9f3379f70f1c8e2f,d24ec5de76732220049843cf0ce87053bdfb223d8e45cdbf83a8d801ed486850,4131794225ae70468171aefddf3e5875a8ab294263ae4694f93a68e8314b0b5c,f5958acf10e9d5f12d9b0349bda1e652273977c36e1ad59c383bbfb512abcac9,19dea7117e47e557bca2019c09173879bde7a9703e7577ec5bf2270fec6aca6e,3cc640e6348efd77de2a22367f609c2f68551d4cb917f27c32c2dbc422827dfa,61d21b2cb4586c4ce3178f6ea51d905d9d00d79d85ccea52e5f4223811e12a44,44e06b75ecca6b3a9f91813c716c0f61f5990f498c5ed17a41ddfcdc0db48368,8da1c8bd377bb3892265639b26a72b7780393a8a43f6471a5eb1abd1ec88ef3d,f5e58a733b69af1ef5fe8a9a580b3790a792e44ad32a29e98d9f7f142862b298,d1e1dc03f1d6d75da644b8a14f8e7d3906b47d50968273f0707142bdd810de1c,d1869756e1200628a18e401e9510a9f78604ce91faf67c2e759a7b28c6eb882f,60dca01fbd010aef036b6ba742978ebacd1c49ba999e06f1b7985c5c0e96055f,c731ad94fa972ca5a7bc709d2cccf187ba47bc6299dcf3301b62990064e04fa2,d1cffa5c6c044dd22a8a0990545ac7bf5edf04b38820230af853949612ef7075,cc351a659c1718306c90276e7a58697709b69d2dd06af2dec6891ac77ac62a3c,82738ee011e454410ea714fbeccad19fe15dba4e62b7d1b85e65e7f8ed2e6286,2d2f067acea2451a17ad0f2beeefcc768dbf52a01f437a5066f49fac1d3eb312,fabad1b8e1b3a3e11810c408f748a7e70449f4274aaaaaf69b11ffeaff1504e7,4ab824b1479ec872488f501374e22488e0b8b4612ea16cca5208783016af9858,1b5dcad92079e86412309d5f85b01631a7aa3d7eda261080531cdeb89c96bcdb,a1809967d96449a3535d19e509fc3ae58b714805141f6487aaf06a7b00f47dc2,081fde0ec6f26348e2626daf44d932bc31d3ac3cc6546061484f9f68b0499422,c3d10191066b94c7a89f91f75fc9aea86e17ac5894fecb8c0698957771d196da,b5474f0aebab60ca12d4f8097a499f3fc063ad6146eb6db4191bc05ce82312ed,147a78e0d0d68aa642b97ba83e7b45ff5b367341f0a0a4f551f593f3ed8855db,47b2514697f7793be6f9ed37ff3cee74a4d1a3012d468c6069c50b6681ec07d1,d59ee71f32fc530efbc54952356a1e564e7fb077b9323bc032f6cacd7ed47917,f0c7fa099c97483728d04f577f5b1462443136e52b9434b5875e00984eab9fc6,a8d103d654099371f1a97f34cfe997683000cf2e7a525376d6af1ac2b75d71ac,cc5f68d406097c09e8d86b667213f52b77d3e0e543c86e3dbede40e8c1f7490d,b495595a4d94415ad9e3c6fbcb8589ddbaffa7d0c9077fcfe261efecc76bc957,f4359ca550fc3fd61f08b20e7714d37f1ea257a2d548fcc6a40cbf1bbc4bfc2b"]}],"fee":{"gas_wanted":"4000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"WOHuIcYcB+zXc7YU7UJLKGGf/sQstEMQIUJdf1t3Fa0avAIDpdNojMz4bxF9IkZwa6JpzOUxAX+v/1AF15kNxg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"ZKNvg+x7sC5mhzGcTpKLwz8Nzy4VlwkUtoKBjGnrvb9s2aKnGovUzHJKmADK9yNsUbsBHNqx8RD3Urme8WZ47w=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/staging/v4/raffle","func":"RegisterUsername","args":["leohhhn"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"MkrjD7LX+H5276uSdDfOhkCqvb3GJWdSy5J84ymfB7tYsjxxUZpaNWqe/pMKuabisV06PRAmwG5AKjJCGaIXEQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1qlat94g56gxnl4rpp9j8mzjdhdyhxcp0l2qeev","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AimRwMeXE1YZqRpjQbxhh2Bg6dNaTJcTYJlyB8lKbDOU"},"signature":"DU4/2N7g4Xghhb4ZRosSIpxJQR6SulN7jiQx00gcp70gDtNxlw6LsrwsvKT7vbC4wea/t2tsWv3//T6X5qUR3Q=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1qlat94g56gxnl4rpp9j8mzjdhdyhxcp0l2qeev","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AimRwMeXE1YZqRpjQbxhh2Bg6dNaTJcTYJlyB8lKbDOU"},"signature":"+e9K1NZL8t58ThUEedzw258f5IlEX1MQoOs6D/ttegd+UJj0qmDXut+/cBEd26FXgaLc2L+Tts+SggiGth7sxg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1qlat94g56gxnl4rpp9j8mzjdhdyhxcp0l2qeev","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AimRwMeXE1YZqRpjQbxhh2Bg6dNaTJcTYJlyB8lKbDOU"},"signature":"YOwSZBWOU/itaQZr9M9TIccXgHktvi7hv3DdRgOWk9NBp6BHYTZSih5oT47oRqNYMXnvIwuVMzSjkCvRONKX4Q=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jsfz4dpel62frepkwvc3wvfel082tx6dne5vax","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7ZLCuKbwrCUYDWGWV067QVuZa9/vySjJfGP7iGLDa25"},"signature":"+Afu3xep533MdWHO/u352vCrVaeunTIe9rN+3FxSPKV9q428UfzcgVTw+q+ZEEBHmKQ+u56q0tYrlFMunx6qfA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jsfz4dpel62frepkwvc3wvfel082tx6dne5vax","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7ZLCuKbwrCUYDWGWV067QVuZa9/vySjJfGP7iGLDa25"},"signature":"hDX5aLqUa+OgFkJ5CVnOxoLAQAi5LurFYYiQeXEoMAU74BZQWZvTHF4wTQfZPblJqQ0xLYFciaH098PAmcDnyw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jsfz4dpel62frepkwvc3wvfel082tx6dne5vax","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7ZLCuKbwrCUYDWGWV067QVuZa9/vySjJfGP7iGLDa25"},"signature":"8LA9wpBsTTrvrN/WUR4XU9Q2EShaYicchfc2DW3NZq8+N5ZBgs83mD5T/oKdx2Rn+UCjZ+QvRgBoVlFa+M444g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jsfz4dpel62frepkwvc3wvfel082tx6dne5vax","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7ZLCuKbwrCUYDWGWV067QVuZa9/vySjJfGP7iGLDa25"},"signature":"QTP5yfvXu8pH/F+Lom3islEOBBVvORM5BMGm8jmaF8J+em4PFoo0Lej9qGMfBnqSpevd+7H18A7TD4zHZbjW/Q=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jsfz4dpel62frepkwvc3wvfel082tx6dne5vax","send":"","pkg_path":"gno.land/r/leon/staging/v4/raffle","func":"RegisterUsername","args":["bmilojkovic"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7ZLCuKbwrCUYDWGWV067QVuZa9/vySjJfGP7iGLDa25"},"signature":"vbLqXlDpOaidJGuYAHouekQCPKdOrOxakbogfofhKkZQH2Yv1Znx3KANT9uDZNWA/3bhlpBdIqVImOd7EXDQ7w=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jsfz4dpel62frepkwvc3wvfel082tx6dne5vax","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7ZLCuKbwrCUYDWGWV067QVuZa9/vySjJfGP7iGLDa25"},"signature":"SaorOgn0xGkByWWit3soeeyjPtjpM82lHXCsEDmlnq07E8jpvG1JJU30SpnkNoQY2lc/4IX0wjyvnQ06IRVFNQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jsfz4dpel62frepkwvc3wvfel082tx6dne5vax","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7ZLCuKbwrCUYDWGWV067QVuZa9/vySjJfGP7iGLDa25"},"signature":"1WPxnpQDPQHMq7eUSq+mbo8DXbcMm8ppWNQjp0tZuKwNZebndd+iDFXjIOD/SxPsy4kj23mk1Ereb8SsZFgkYA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"50000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"Qn35DXDy8IjiSsYCAfah9XOwr4GL90CGON488LG7S5gmgt/kGApJSlolR1X/J7+zLoXgPc7OAiRydpkXyEbtiQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"50000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"PlpXHKNrQJYmJ/ekg+NTB5/GV2BnMEcxVfqJPoRpwJ5q46LTXNFqgy9lW77TEMJfjgfkLCu8r3HK2o7SbV4ivA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"50000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"vordEiWoHU4l3fx/kRDOBl0RGUDxsTUTqW0w38V6OboqZgW2F/mqiyr5GNSNTB0D57vKyGRLngVpNdNdHWmVgg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"50000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"j0THIqUz+mYRnPvqzH7h/WP9TCM9z7GZm6LvlSCh0jFOODf9hebJ4Y9qwOvqA0o4zdvLtUyhe2dRwv1912lc3w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"50000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"LPPXfI1v+aiFS005ze3nYcBSBKX2uJyWirs1mkD2haY9JFtsYFpgFMJPVRceW3Jg//4Wjeo6R0swj9idsUptxQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"50000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"dwDFiBZ6t3HKVzr9O2/qDF+4VAtg8DBPooebd1uGmx9cE+YQVIvvnOGiuSy8YuacT4z64OhxSYicRrzy1l5eBA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreateFeed","args":["teritori"]}],"fee":{"gas_wanted":"3000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"2rWIXkxkB677pRhj6MtipqkS0pDqUbfO5nR4heHiaEY+Lfh/oVPpx3+RUWp4yPna2DwahgQyipaRr7iqHO1pBA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","2","{\"message\":\"hello guys\",\"files\":[],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-07-06T17:03:37.329Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"qkiNO9is1JtPRDTcMkY+DvE3gzpZX/LepLkBZL0mBN9YM8AMytwCoLho9JQcGhaW5k3XyEr0mwvk5oeoj3WPnA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","1","🙋‍♂️","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"EnR+OS9nts5lpiHY3MFtbX4Fsq1ZB7OmbdiQ/4V9/qEbKi4bkXBwzyQ9z9dX450riXid5ptAvSlNCSexlzQfPA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","2","{\"message\":\"hello\",\"files\":[],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-07-06T17:14:56.601Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"NJnhCKMIzgqgAGUahDQcddZoahY0tZ8HzzQfFzVZFPJvqeFz502vSvMhjpjjuaiJ0kyTmAcjgziHHZRa2cR7YA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"50000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"ULstqacfV8COi5eGB0oyFeZ3UIuXGzs645RdvQ0O8K12916ITTuoBJRwdWGXh4HOed8J1OMoQCjyEN4ZW9Vg5A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"50000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"4AJmC5Cvg7NjY5ykQaLAMODJExH7EoZr/twWyxdO/8MZ8t6eOK7NaS3op5jNmXeCwe4nJE6T3Xfr5t05myobcA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"50000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"V2f99gUJvlvSeT3azK0g25zjTLnCsmcz1WhsL8IiHTc59SE+RNCndmm3Fx3oCasebNTl+Xhtc7+3OutUPgdjFA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"50000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"7b2MkrBV3XCBEYah2M5yu55plriT+kPtEU0ns7AInb5N6bCL1jClU+GZd3b4TfxdOIkglwgRTwlEQ5pSiaO75Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"50000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"9aUE+bdatCYtaAkcT+8fifxei9+zOeCDrYPRjh6lwMg5PBP/YJHN4JlmyRJiQgkN0dl3F/SLQYq2M+W0sRMHaw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1d46t4el0dduffs5j56t2razaeyvnmkxlduduuw","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreateFeed","args":["teritori"]}],"fee":{"gas_wanted":"3000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/dkVmfYUyUCFkPwIhahS4gblP3VmfLgpVByc8RVewD5"},"signature":"jO6h4HX87l0Ffh0DkzSshY9CUtQWNgBxodNC5gVHD3Z/oC4+Ne7DGNnm7mVfplzrY9opOl+36aLQqsiGu2wdZg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","2","{\"message\":\"hello\",\"files\":[],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-07-06T18:28:51.656Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"IA0lwljI5uxXNSLTrihtU3eBCE3iDaDJ+6DYINGGdudDcdo9HUDjGyvp1JrEHESPezRTpn/XXS7fzYfq3KqzTA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","1","🤩","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"fxgbVDukWlZ4MAURazqLu2P7lgmHr8OjxaFe3tPL3p0/tLrj2fTrQ8yYLQxK80kdGhll8XZ3ww7W9RvoJAQnRA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","1","😍","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"4slMkIwYcy+VXwpvDE6H7DsOqPjpYMunqMdYN4jH61Z3KkCmwvA6MUr8Lx3tratTeRRUxM7uUYEgIo2nOrPqAQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","2","{\"message\":\"jaja\",\"files\":[],\"gifs\":[\"https://media.tenor.com/GfOAM2wFc5kAAAAC/happy-fried-chicken-day-eating-chicken.gif\"],\"hashtags\":[],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-07-06T19:47:38.609Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"JS0iE9AliKvn9pDDj7zRM53Wwof7LNLim52bT9NIPyR1IyMIZRojOhpmg5fb0SIFFs5NcOQAz8HfOJ3VsefpCw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"mo+bK3/tnJP2D9E2CpnMvqPmyhnbpRGmFq5SiYAy9zpRCXCTX1p9JxfhehLQNJ6M7X9FGl/eiE246w7VOQdl/A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"ReactPost","args":["1","1","😍","true"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"kGcBgdFqnaXB/QJAlgDnVrNduPfIJ/lWDhAk40+RFskVY0GKiDb+MEALm+IkCjsWj9SM9XX3gqNQL7mikA296g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/emit_main","func":"EmitMain","args":null}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"TK6YGZhyLA2ujzJP0ElLvZcvnuD6Ih506IB7KqR7y114SWt8m2j90v2zUIRFi4c3eGX7ixRpQnyLonUVpwfTlA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/event_emitter","func":"Event01","args":["Hi"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"os2OdX1SlLT4RNNBGlMqxJ2qv+/mXEU9EyVHSWXUDrV0qE7AxOs7Lh3bJA70kSt11SmiSakAcWlHbUh7ZK77/w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/event_emitter","func":"Event01","args":null}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"Wpdt1Bdv9kGPL83xUDV/QNETzmXfTz0D6HViETyM4a1OfqN5s8wZHzZY39eOts4e5ntUWhwv7LYPsBhKGmRBoA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/event_emitter","func":"Event01","args":["hi","01"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"qyF8/rxLWWL5ZtWjxFEo0g5mgvQArFnDj3gzjjE0XFcmkM9qGk10G+Zrd1JGCVAQ/Drz4/uHOfzyOULxjdm4mQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"L1p9bgfQ74xJviRdYym01HmLpuV0j10g/YAHFEYKvitoKr9O6DBcR63+zYh0RLpjR3J2hXKJ/pNK5NjEUq0kWw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"MGuHph7+omCGMXHcwOpb2vrV47lyeSCj019zjCh1P2dqV5/oznZpT1zq7IDwVFsQgijaz0yVctDX4hNU55Cnrw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/event_emitter","func":"Event01","args":["hi","001"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"yOROw0bJ/1KSzhSylhj7wBKVYRzEgrvKTIxHnNPYiFVdk5co4OpJL0SBUXowMjRvp2x/G/TrIxxOYcqHc4I5wQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/event_emitter","func":"Event02","args":["key","value"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"wBaCf8IMybNnhopg9acREuFhSdNmdQKph8iEx1Rg01M/ZZjriSN2bcfyZ43dkZ5/RNfj9knr842DpOVCp6GoDw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/event_emitter","func":"Event02","args":["key","value"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"FX08sGSvuFGwzPV8P9zrv1X0aa78n3B+y4s98lYnuXFdSwn0EAHGHwl9U5Bdx3FpXLGxfWDPOBcYrSAnw/V22w=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"1hEEitbAIjILXJTF4dQHTk6RiNVZN+aEZ7Xo1YvIU54CspRe9YpfQIP8B2pRVlTkpDeUYoQ2s+jUsK7y4z52fQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"bEGscbtdYoKQ5Uk2PdD4jWsxp8xAFTAQB87/OjsxEbs6Gs3G9CTw2HB5AUBkDZlE1pZfYigQaa+d64Q5XPdPKQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"Hm7ImS7DtyBIw0AgUxQbrMxgRI0W2COTdj7lra8K9mdyTQKvGPe0we4GjVHH6SnT2dO8t2AGvMuIRWiU5wnL5w=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"QncYiakkJhQuVyEKs1jOYhxKDY/iVdxg8wm+BxWwHRh/CDpqJrummlTKLTg8xPcW/WCUz1aulKuRwTSPaz2ANg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/test_event","func":"Event02","args":["gg","ggg"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"GO8kVK1SderkByRhaQmUU+r9ogOEndtZ/PcgD0tjti4srpDuEgp9msbAUzwUPoKfZ9fZ3qvitu+AI+J/aBt7sw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"8000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"1/abx8z2U3Pl0dpjitAOo8e1VaiWFaXePCH8YYg6nm8d7hahWxj6veIjQSzhibzc98YoHRIkYMFZKMmAF7C5WQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","package":{"name":"","path":"gno.land/r/g125em6arxsnj49vx35f0n0z34putv5ty3376fg5/run","files":null}}],"fee":{"gas_wanted":"20000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"BoUm2wFmeeYMv+VYu4WWkf3qvluXHnHbK6ouAtKH+MUaC3Ad3BJnmH12k2tEPLQXMFoy8gJIPcmNJWYWnYyadw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"25000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"3R6tqkDQ+XcNaUqAFDqc+gYS2yzbowEJkL6z5XoJg513a68Bp4197fx2IgKzgjXtKPEHePYkArOH+30dbOpv/g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/v1/raffle","func":"RegisterUsername","args":["leohhhn"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"QT88BI1uzmRQXsQmelM843vBJnqbEFR8VtvZOQIEULYdanONIjNkHA4+TTOl5oFNGN2RZKHiIbe/dzlQdbt98Q=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1qvcgkjdzqx3cx3e0rxrx6xnzfx5cwjg5hy6e40","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"IEYecpShKDDMQSAaoLXQXVOcNgE4EE0+N8JkT/w2XnZ5qEWN5IBSjDe9Xn3BmNg1LqqLwilTLTq6HMf95kJb8w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"8000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"EsYNO5epjMUaZWqGMzqSTBTbV+X6cAyjn97kRKJxJUF7790Y7U9cYTuOUolxs/HFwLN/eU5vi7vCNMGdA3ZrEg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"u2ik3jJNbmf6Zjry/BGt/uTsfWHGHapGTzZ/Af3hGbJfXzdHaGg+/spYahsjv7Uki8l2zXwSkgjKAQcBEdmaSA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"test_event","path":"gno.land/r/demo/test_event","files":[{"name":"package.gno","body":"package test_event\n\nimport \"std\"\n\nfunc Event01(key, value string) string {\n\tstd.Emit(\"Event01\", key, value)\n\n\treturn \"Event01-\" + key + \"-\" + \"value\"\n}\n\nfunc Event02(key, value string) string {\n\tstd.Emit(\"Event02\", key, value)\n\n\treturn \"Event02-\" + key + \"-\" + \"value\"\n}\n\nfunc Event03(key, value string) string {\n\tstd.Emit(\"Event03\", key, value)\n\n\treturn \"Event03-\" + key + \"-\" + \"value\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"uBnfYPmRatZaIF6SxcfdI4/aeIvAsb1FSpNVHsl7JChxq/X+wiT+NrIh7DOCkiiAnOJ6HN41Oyk75XR8fsr9SQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/test_event","func":"Event02","args":["keys","values"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"JZBnlVmeKBYatgpnZEp69ywSO2UtN7ONtJ9ag2exOHUSBioIOlEN7ZZ7BoQ2x/yQdlHUqhZOs/hMeGL2U/SYXw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/test_event","func":"Event01","args":["HI","Hello"]},{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/test_event","func":"Event02","args":["HI","Hello"]},{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/test_event","func":"Event03","args":["HI","Hello"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"/TfmHho6LFTLxKchConALK2n736xoc8ZGILDDnD3UcR2syseKsaY80JqyB//4nHnGRbIFeOKRd/1sZH9mZaedw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1e6gxg5tvc55mwsn7t7dymmlasratv7mkv0rap2","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8S4uS5UMWyqBtesQiReJJ0bb0GZSyEx+nSR+dIcIN4Vbfi5W4uOvxcutFP0khSTLF74Zt5I3koGWYSQlWTvuqA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/event_emitter","func":"Event02","args":["",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"KeS0gTSHHAuVr/bScNf3xN57couYbsQshV277mGUnl1F34GA+vB66k3+r9tWSxCr1oIG50LlNOZBmJ7FJGnZew=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"test_event","path":"gno.land/r/demo/test_event","files":[{"name":"package.gno","body":"package test_event\n\nimport \"std\"\n\nfunc Event01(key, value string) string {\n\tstd.Emit(\"Event01\", key, value)\n\n\treturn \"Event01-\" + key + \"-\" + \"value\"\n}\n\nfunc Event02(key, value string) string {\n\tstd.Emit(\"Event02\", key, value)\n\n\treturn \"Event02-\" + key + \"-\" + \"value\"\n}\n\nfunc Event03(key, value string) string {\n\tstd.Emit(\"Event03\", key, value)\n\n\treturn \"Event03-\" + key + \"-\" + \"value\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"uBnfYPmRatZaIF6SxcfdI4/aeIvAsb1FSpNVHsl7JChxq/X+wiT+NrIh7DOCkiiAnOJ6HN41Oyk75XR8fsr9SQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"test_event2","path":"gno.land/r/demo/test_event2","files":[{"name":"package.gno","body":"package test_event\n\nimport \"std\"\n\nfunc Event01(key, value string) string {\n\tstd.Emit(\"Event01\", key, value)\n\n\treturn \"Event01-\" + key + \"-\" + \"value\"\n}\n\nfunc Event02(key, value string) string {\n\tstd.Emit(\"Event02\", key, value)\n\n\treturn \"Event02-\" + key + \"-\" + \"value\"\n}\n\nfunc Event03(key, value string) string {\n\tstd.Emit(\"Event03\", key, value)\n\n\treturn \"Event03-\" + key + \"-\" + \"value\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"0O6ojVdXSZu9N9Yk/KF/FPtEuYYh5HfLxUINrl/oiJVOSvBtnIgvwJaMyjOa/42FyxoeZO74qKWGkwNwk8Cfiw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"test_events","path":"gno.land/r/demo/test_events","files":[{"name":"package.gno","body":"package test_event\n\nimport \"std\"\n\nfunc Event01(key, value string) string {\n\tstd.Emit(\"Event01\", key, value)\n\n\treturn \"Event01-\" + key + \"-\" + \"value\"\n}\n\nfunc Event02(key, value string) string {\n\tstd.Emit(\"Event02\", key, value)\n\n\treturn \"Event02-\" + key + \"-\" + \"value\"\n}\n\nfunc Event03(key, value string) string {\n\tstd.Emit(\"Event03\", key, value)\n\n\treturn \"Event03-\" + key + \"-\" + \"value\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"rdnLP14OM6f9My+inNtCQkIwtQHt4U0I9yR9vFdbdkh8hw3LT7rNGGRm99MtaEtzEw0DbKmePJSQN3pbmlNYHA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"test_event2","path":"gno.land/r/demo/test_event2","files":[{"name":"package.gno","body":"package test_event2\n\nimport \"std\"\n\nfunc Event01(key, value string) string {\n\tstd.Emit(\"Event01\", key, value)\n\n\treturn \"Event01-\" + key + \"-\" + \"value\"\n}\n\nfunc Event02(key, value string) string {\n\tstd.Emit(\"Event02\", key, value)\n\n\treturn \"Event02-\" + key + \"-\" + \"value\"\n}\n\nfunc Event03(key, value string) string {\n\tstd.Emit(\"Event03\", key, value)\n\n\treturn \"Event03-\" + key + \"-\" + \"value\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"fGuEySuyGAdIxDN5EiixJQ1ultfZehz9H42pJN/a/q49A2T1ecieWJqb8yx+qZiYMHlwwcke0nk4wHZgnpRKcA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/test_event2","func":"Event02","args":["123","444"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"SYaVt2pD1td8eyLS6q6ZagYQ7qI4wrUJseohKGVUDPN+nQDQxuh19RoCSB4osPopLMPVCz6Qic9d7p0HlUBaBw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1yne82ek705lw8efq4d3l3rv3dx69np5v58cmkp","package":{"name":"fixfixfix","path":"gno.land/r/portalloopfixes/fixfixfix","files":[{"name":"package.gno","body":"package fixfixfix\n\nfunc Render(path string) string {\n\treturn \"Salvo, is it working?\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyaNg+hBb1kUTyhx23vyBeg6wyIXhtmXXtOwDG5fOJB3"},"signature":"flN3W8n7lHIZPz5kWjVp5xuiQp1CvmiWj89eF56JS0V02ppNA/ghfV1k/3paG96XUnneljuaF7MWXCt+bG9fSA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"u2ik3jJNbmf6Zjry/BGt/uTsfWHGHapGTzZ/Af3hGbJfXzdHaGg+/spYahsjv7Uki8l2zXwSkgjKAQcBEdmaSA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"event_emitter","path":"gno.land/r/demo/event_emitter","files":[{"name":"package.gno","body":"package event_emitter\n\nimport \"std\"\n\nfunc Event01(key, value string) string {\n\tstd.Emit(\"Event01\", key, value)\n\n\treturn \"Event01-\" + key + \"-\" + \"value\"\n}\n\nfunc Event02(key, value string) string {\n\tstd.Emit(\"Event02\", key, value)\n\n\treturn \"Event02-\" + key + \"-\" + \"value\"\n}\n\nfunc Event03(key, value string) string {\n\tstd.Emit(\"Event03\", key, value)\n\n\treturn \"Event03-\" + key + \"-\" + \"value\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"+ZsYt2R8loRkuaiFIqMOIttQEPZCZZpfX99n9i/fXvQHNB2ZxKElv5sLAcG/AGZbCCUzUvI4fMFT7oojLm90NQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/event_emitter","func":"Event01","args":["key1","mamm"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"9FMlKGbXZpd4nL9mx4bazYcGTDUunCMcuwyCvHolals3EnoPWqOPGWsyZ9gTq3z+mCcd/0Lo2gz8YQIOIlgJtA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/event_emitter","func":"Event01","args":["HI","Hello"]},{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/event_emitter","func":"Event02","args":["HI","Hello"]},{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/event_emitter","func":"Event03","args":["HI","Hello"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"kdmaKbJ6FE76YVwXLmxKAOV6A4P4Z2TSTJcDkT0OtBsLkgTwgy/dbvaEPjbwEKl9HzGy5O2oQYs/DGxqWt0yxQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"raffle","path":"gno.land/r/leon/v1/raffle","files":[{"name":"gno.mod","body":"module gno.land/r/leon/v1/raffle\n\nrequire (\n\tgno.land/p/demo/ownable v0.0.0-latest\n\tgno.land/p/demo/testutils v0.0.0-latest\n\tgno.land/p/demo/ufmt v0.0.0-latest\n)\n"},{"name":"raffle.gno","body":"package raffle\n\nimport (\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"math/rand\"\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/ownable\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\n// EntryData is the main struct that contains all data on raffle entries\ntype EntryData struct {\n\ttxorigin std.Address\n\tcaller std.Realm\n\traffleCode string\n\tcodeHash string\n\tghUsername string\n}\n\n// Top-level variables are automatically persisted to network storage\nvar (\n\to *ownable.Ownable // admin of the raffle realm\n\tpartialEntries []*EntryData // keeps registered partialEntries\n\tcompleteEntries []*EntryData // keeps complete registrations: valid code + gh username\n\tcodeHashes []string // valid code hashes\n\tregisteredHashes map[string]struct{} // tracks if a code has been registered before\n\twinner1, winner2 *EntryData // storing raffle winners\n\tnumReg int\n\trandSource *rand.Rand\n)\n\n// Nothing to see here, just some constants, move on :)\nconst (\n\tcodeLength = 10\n\tamtOfCodes = 300\n)\n\n// Hello! This is where you register your raffle code!\n// Calling RegisterCode is the first step for entering the raffle.\n// It allows you to register a specific raffle code and connect your address to it.\n// RegisterCode only be called via other code; you should figure out a way to do it.\nfunc RegisterCode(code string) string {\n\tif code == \"\" \u0026\u0026 len(code) != codeLength {\n\t\tpanic(\"invalid code: \" + code)\n\t}\n\n\tcaller := std.PrevRealm() // save realm used to call\n\torigin := std.GetOrigCaller() // save deployer of realm\n\n\t// Deny non-code entries\n\tif caller.IsUser() {\n\t\tpanic(\"denied; can only be called from within code\")\n\t}\n\n\t// Get sha256 of code\n\thash := sha256.Sum256([]byte(code))\n\thashString := hex.EncodeToString(hash[:])\n\n\t// Check if code has already been registered\n\tif _, ok := registeredHashes[hashString]; ok {\n\t\tpanic(\"code already registered: \" + code)\n\t}\n\n\t// Check if the gopher has already registered another raffle code\n\tif originExists(origin) {\n\t\tpanic(\"you cannot register more than one code!\")\n\t}\n\n\t// Try to find the hash in the official hash list\n\tvar found bool\n\tfor _, ch := range codeHashes {\n\t\tif ch == hashString {\n\t\t\tfound = true\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif !found {\n\t\tpanic(\"specified code is not a valid raffle code: \" + code)\n\t}\n\n\tentry := \u0026EntryData{\n\t\ttxorigin: origin,\n\t\tcaller: caller,\n\t\traffleCode: code,\n\t\tcodeHash: hashString,\n\t\tghUsername: \"No username yet!\",\n\t}\n\n\t// Save to hash tracker\n\tregisteredHashes[hashString] = struct{}{}\n\n\t// Save raffle entry\n\tpartialEntries = append(partialEntries, entry)\n\n\treturn ufmt.Sprintf(\"Successfully registered raffle code!\\n%s\\nRegister your username to complete your raffle entry.\", entry.String())\n}\n\n// Somewhat similar to Go, init() executes upon deployment of your code.\n// Hint: maybe you can use init() in your code to execute RegisterCode() upon deployment via play.gno.land?\nfunc init() {\n\t// Set admin address\n\to = ownable.NewWithAddress(\"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5\")\n\n\tpartialEntries = make([]*EntryData, 0)\n\tcompleteEntries = make([]*EntryData, 0)\n\tregisteredHashes = make(map[string]struct{})\n\tcodeHashes = make([]string, 300)\n}\n\n// RegisterUsername registers a GitHub username to an already existing entry\n// Hint: you can call this function just like you did with RegisterCode(), or via gno.studio/connect :)\n// If you use Connect, make sure you're on the Portal Loop network, and you've navigated to the correct path!\nfunc RegisterUsername(username string) string {\n\tif username == \"\" {\n\t\tpanic(\"invalid username: \" + username)\n\t}\n\n\torigin := std.GetOrigCaller()\n\n\tfor _, entry := range partialEntries {\n\t\tif entry.txorigin == origin { // this will check if you're using the same address as when registering the raffle code ;)\n\t\t\tentry.ghUsername = username\n\t\t\tcompleteEntries = append(completeEntries, entry)\n\t\t\tnumReg += 1\n\t\t\treturn ufmt.Sprintf(\"successfully registered %s for address %s\", username, entry.txorigin)\n\t\t}\n\t}\n\n\tpanic(\"could not find entry for caller address; did you register your raffle code yet?\")\n}\n\n// Admin stuff\n\nfunc PickWinner1() string {\n\to.AssertCallerIsOwner()\n\twinner1 = pickWinner()\n\n\treturn winner1.ghUsername\n}\n\nfunc PickWinner2() string {\n\to.AssertCallerIsOwner()\n\twinner2 = pickWinner()\n\n\treturn winner2.ghUsername\n}\n\nfunc UploadCodeHashes(delimCodes string) {\n\to.AssertCallerIsOwner()\n\n\ttokens := strings.Split(delimCodes, \",\")\n\n\tif len(tokens) != amtOfCodes {\n\t\tpanic(ufmt.Sprintf(\"invalid amount of codes; wanted %d got %d\", amtOfCodes, len(tokens)))\n\t}\n\n\tcopy(codeHashes, tokens)\n}\n\nfunc UploadRandomness(x, y uint64) {\n\to.AssertCallerIsOwner()\n\n\trandSource = rand.New(rand.NewPCG(x, y))\n}\n\n// Rendering\n\nfunc Render(_ string) string {\n\toutput := \"# Raffle - GopherCon US 2024\\n\\n\"\n\n\toutput += renderStats()\n\toutput += RenderGuide()\n\n\treturn output\n}\n\nfunc renderStats() string {\n\toutput := \"\"\n\n\toutput += \"### Raffle Stats\\n\\n\"\n\n\toutput += `\u003cdiv class=\"columns-3\"\u003e`\n\n\toutput += `\u003cdiv class=\"column\"\u003e` // Latest codes\n\toutput += renderLatestCodesWidget(2)\n\toutput += `\u003c/div\u003e` // close Latest codes\n\n\toutput += `\u003cdiv class=\"column\"\u003e` // Latest usernames\n\toutput += renderLatestUsernamesWidget(2)\n\toutput += `\u003c/div\u003e` // close Latest usernames\n\n\toutput += `\u003cdiv class=\"column\"\u003e` // Winners\n\toutput += renderWinners()\n\toutput += `\u003c/div\u003e` // close Winners\n\n\toutput += `\u003c/div\u003e` // close columns-3\n\n\toutput += \"\\n\\n\"\n\toutput += \"---\" // close section\n\n\toutput += \"\\n\"\n\n\treturn output\n}\n\nfunc renderWinners() string {\n\toutput := \"\\n\\n#### Winners\\n\\n\"\n\n\tif winner1 == nil {\n\t\toutput += ufmt.Sprintf(\"- Winner 1: Not chosen yet!\\n\\n\")\n\t} else {\n\t\toutput += ufmt.Sprintf(\"- Winner 1: @%s!\\n\\n\", winner1.ghUsername)\n\t}\n\n\tif winner2 == nil {\n\t\toutput += ufmt.Sprintf(\"- Winner 2: Not chosen yet!\\n\\n\")\n\t} else {\n\t\toutput += ufmt.Sprintf(\"- Winner 2: @%s!\\n\\n\", winner2.ghUsername)\n\t}\n\n\tchanceOfWinning := 0\n\tif numReg \u003e 0 {\n\t\tchanceOfWinning = 100 / numReg\n\t\toutput += ufmt.Sprintf(\"- Current chance to win a prize: %d%% \", chanceOfWinning)\n\t}\n\n\treturn output\n}\n\nfunc renderLatestCodesWidget(amt int) string {\n\toutput := \"\\n\\n#### Latest codes\\n\\n\"\n\tpeNum := len(partialEntries)\n\n\tif peNum == 0 {\n\t\toutput += \"No codes registered yet.\"\n\t\treturn output\n\t}\n\n\tif peNum \u003c amt {\n\t\tamt = peNum\n\t}\n\n\tfor i := peNum - 1; i \u003e= peNum-amt; i-- {\n\t\toutput += ufmt.Sprintf(\"- `%s`\\n\\n\", partialEntries[i].raffleCode)\n\t}\n\n\treturn output\n}\n\nfunc renderLatestUsernamesWidget(amt int) string {\n\toutput := \"\\n\\n#### Latest usernames\\n\\n\"\n\tceNum := len(completeEntries)\n\n\tif ceNum == 0 {\n\t\toutput += \"No usernames registered yet.\"\n\t\treturn output\n\t}\n\n\tif ceNum \u003c amt {\n\t\tamt = ceNum\n\t}\n\n\tfor i := ceNum - 1; i \u003e= ceNum-amt; i-- {\n\t\toutput += ufmt.Sprintf(\"- `%s`\\n\\n\", completeEntries[i].ghUsername)\n\t}\n\n\treturn output\n}\n\n// Helpers\n\nfunc (entry *EntryData) String() string {\n\treturn ufmt.Sprintf(\"Address: %s\\nRealm Path: %s\\nCode: %s\\nHash: %s\\nGitHub username: %s\\n\",\n\t\tentry.txorigin.String(),\n\t\tentry.caller.PkgPath(),\n\t\tentry.raffleCode,\n\t\tentry.codeHash,\n\t\tentry.ghUsername,\n\t)\n}\n\nfunc pickWinner() *EntryData {\n\tif len(completeEntries) == 0 {\n\t\tpanic(\"No complete entries yet!\")\n\t}\n\tif randSource == nil {\n\t\tpanic(\"No randomness source yet!\")\n\t}\n\n\tr := rand.New(randSource)\n\twinnerIndex := r.IntN(len(completeEntries))\n\twinner := completeEntries[winnerIndex]\n\n\t// remove winner from entry list\n\tcompleteEntries = append(completeEntries[:winnerIndex], completeEntries[winnerIndex+1:]...)\n\n\treturn winner\n}\n\nfunc CheckHashUpload() int {\n\treturn len(codeHashes)\n}\n\nfunc originExists(origin std.Address) bool {\n\tfor _, e := range partialEntries {\n\t\tif e.txorigin == origin {\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n"},{"name":"raffle_guide.gno","body":"package raffle\n\nimport (\n\t\"std\"\n\t\"strings\"\n)\n\nvar (\n\traffleRealmPath = std.CurrentRealm().PkgPath() // will give you portal loop path\n)\n\nfunc RenderGuide() string {\n\n\ttext := `# Entering the raffle\n\nWelcome, gopher!\n\nYou've decided to enter the gno.land raffle to get a chance to win a valuable prize.\nWe congratulate you on your curiosity and courage!\n\nYou will need your personal computer and a bit of time to enter the raffle. Find \na quiet corner and read the rest of this README file.\nAlso, make sure you've gotten your unique raffle entry code at the gno.land booth -\nyou will not be able to proceed without it.\n\n## Why enter the raffle?\n\nApart from getting a chance to win awesome prizes, you will be able to learn\na couple of basic concepts on how to use Gno, as well as some supporting Gno tools -\nthe [Gno Playground](https://play.gno.land), which will help you deploy your own \nGno code, and [Connect](https://gno.studio/connect), which will\nallow you to easily call smart contracts (called \"!realms\"! in Gno) that live on\nthe gno.land blockchain.\n\nWe've created this raffle to reward gophers that are curious and eager to learn\nabout new tech- if you can relate, you're in the right place!\n\nAfter completing a series of steps, you'll have a chance at winning one of\nthe raffle prizes - we're giving away two Keychron K2 Pro mechanical keyboards.\n\n## How do I enter?\n\nTo enter the raffle, you will need to go into dev mode. You need to take a look \nat some Gno code, learn how to interact with the gno.land blockchain, and submit\nyour raffle entry to the Raffle realm - which you are viewing right now!\nThis text, as well as the \"Stats\" at the top of the page are actual live state of\nthe Raffle realm.\n\nWe want you to try to figure things out on your own; you should prove your curiosity\nand ability to learn about new technology in a short period of time. If, however, \nyou do run into issues - the engineers at the gno.land booth will be able to help \nyou.\n\n## Let's get started!\n\nEntering the raffle involves two main parts:\n1. Registering your raffle code, which you got from the gno.land booth\n2. Registering your GitHub username\n\nBoth of these involve interacting with the Raffle realm. \nYou're currently reading the rendered state of the realm;\nand you can view its source code by clicking on the [[source]](https://REALMPATH/)\nbutton on the top right of the page.\n\n## 1. Making a gno.land keypair\n\nA keypair is what allows you to interact with the gno.land blockchain. For this, you\ncan use the Adena wallet- it will generate a keypair for you. You will then be able\nuse this keypair to deploy your own Gno code to the blockchain and call functions on \nexisting Gno code, such as this Raffle realm.\n\nVisit the official [Adena website](https://adena.app) to install it. \n\nAfter installing the Adena wallet as an extension, a page will pop up.\nTo create a keypair, follow the steps below. \n\nFirst, select \"Advanced options\" \u003e \"Create new wallet\". Then, complete a \nquestionnaire. You're free to look up the concepts Adena is telling you about\nduring this process (such as \"seed phrase\").\n\nAfter saving your seed phrase and entering a password to protect your keypair,\nyou should be able to see your account generated in the Adena extension.\nWhat you need to proceed to the next step is the address of your account,\nwhich is further derived from your keypair. You'll be able to find it at\nthe top of the Adena extension.\n\nYou are ready to move onto the next step!\n\n## 2. Get GNOTs\n\nWhat are \"!GNOTs\"!? - you might ask. \n\nBlockchains are transactional systems; every interaction with a blockchain is \ndone via a transactional message - ensuring the state of the network is consistent at each point \nin time. On top of this, to prevent DDoS attacks, all blockchains implement \na gas system; for every state change on the network (a transaction), a user must \npay with the network's native currency.\n\nIn the case of gno.land, this is \"!GNOT\"!. To get some testnet \"!GNOT\"!, \nvisit the [gno.land Faucet Hub](https://faucet.gno.land). \n\nSelect \"Gno Portal Loop\", enter your Adena address (copy it from the top of the Adena\nwallet! it starts with \"!g1...\"!), select \"!10 GNOT\"!, complete the captcha, and click\n\"Request drip\". Soon, you should see 10 \"!GNOT\"! available in your Adena wallet.\n\n## 3. Inspecting Gno source code\n\nEach Gno realm lives on a specific package path. In the case of the Raffle realm,\nthis path is \"!REALMPATH\"!. All files that comprise the realm can be found by\nclicking the [source] button on the top right corner. There, you will find a \"!raffle.gno\"!\nfile. This is the main code of the Raffle realm.\n\nTo enter the raffle, you must inspect the Gno code found in this file.\n\nGo do it now! You should be able to figure out the next step yourself.\n\n...\n\n...\n\n...\n\nWelcome back!\n\nBy reading some code, you found out that you need to write and deploy some Gno code.\n\n## 4. Writing Gno code in the Gno Playground\n\nThe next step to entering the raffle is writing a bit of Gno code and deploying\nit to the gno.land blockchain. \n\nBefore diving into the code, let's learn about how the gno.land blockchain stores \ndata.\n\nAll code uploaded to gno.land lives on a specific path, like in a file system.\nFor example, you were able to find the Raffle realm on \"!REALMPATH\"!.\nThis path is a crucial piece of any realm- apart from being able to \ncall all exported functions in the Gno code by specifying its path (a next step!), the path can \nalso be used to import the code into your own application, providing reusability\nof code and interaction between applications that live on the chain.\n\nThe path of the Raffle realm can also be found in the \"!gno.mod\"! file,\nwhich you can also find on the [source] page.\n\nIf you have read through the \"!raffle.gno\"! file, you may have noticed that \"!RegisterCode()\"! \ncan only be called _via other code_. Try to use the Gno Playground to write your own Gno\napp that will import the Raffle realm.\n\nFigure out where to use the \"!RegisterCode()\"! function, and make sure to add\nyour (case sensitive!!) raffle code as a string argument when calling it.\n\n** Include Hint 1, or is it too easy?\n\n## 5. Deploying Gno code\n\nA crucial step in entering the raffle is deploying your Gno code to the blockchain.\nDoing this will complete the first part of the raffle entry - registering your \nraffle code.\n\nLuckily, [Gno Playground](https://play.gno.land) provides an easy way to deploy code- after writing your\ndesired code, you can click on \"Deploy\". This will:\n- Allow you to connect your Adena wallet to the Playground\n- On the top right corner of the Playground, choose the network you want to deploy\nyour code to - you should select \"Portal Loop\"\n- Pick a deployment path for your realm - choose the \"!r/\"! prefix, enter in your\nnamespace (it can be your username), and match your Gno package name to the last\npart of the path. A suggested deployment path could be \"\"!gno.land/r/gc24/myusername/raffle\"!\",\nwhile the package name would need to be \"\"!raffle\"!\"\n\nClicking on \"Deploy\" will prompt an Adena window that will ask you to sign\nthe transaction which will upload your code to the chain. The \"!init()\"!\nfunction will get executed upon deployment. \u003c\u003c keep this in? too big of a hint?\n\nCongratulations! You've made it through the hard part.\n\nWith this, you've connected your address with the raffle code you've received.\n\nYou should be able to see your raffle code show up in the Stats section at the top \nof the page. Don't worry about everyone being able to see your code; codes are usable\nonly once.\n\n## 6. Registering your GitHub username\n\nFinal step! You need to register your GitHub username to complete your raffle entry.\nLook for a function in the \"!raffle.gno\"! file which will allow you to do so, and figure\nout a way to do it. \n\nIf you've succeeded, you'll see your username show up in the \"Stats\" section at the top.\n\n!!! Make sure to register your real GitHub username; if you are chosen as a winner,\nyou will have to prove you have access to the GitHub account !!!\n\n## Conclusion\n\nCongratulations on entering the Raffle! Sit back, relax, and wait for the winner\nannouncement time at the gno.land booth.\n\n#### Hints\nHint 1: Look for the \"!init()\"! function in the \"!raffle.gno\"! file.`\n\n\ttext = strings.Replace(text, \"REALMPATH\", raffleRealmPath, -1)\n\ttext = strings.Replace(text, \"\\\"!\", \"`\", -1) // go/gno complains about ` inside ``\n\n\treturn text\n}\n"},{"name":"raffle_test.gno","body":"package raffle\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nconst (\n\tvalidTestHashes = `a657602fc08191e7a4e0255a818a0ec544c8ce0826fe9ecf0c47eb538b2a9920,e4ce35fc370cb77c8416d6cf248e406c3f41073955d2d1c46dfcde630437711c,d1c73632a00861c2a57502edcc7105df21e22f6f4764e07dbd76c1dd456fd763,5e9a113e15140d8e7ec30a70d999038970da4dc84b8517fdf93d8eba56b4f4cd,d0a8e682db50c4b5f16dbb1c206cc8086f58094642d5864db8cd5feaefff0eae,6d0d8c67778d4ea8ac5ed234c12075b7ccb96350ea84711f455eb1538ac30025,e287bbe122d9be4c90d2fc62e51abbc67de50f6c8044636a61e7f801081ba907,6c4567fdd88ee306f715eac751010b5ef8a66bab66258e580be4915898b1dfaa,85463175e47915820c55acbc2531eaf360a8c0586c3b59cbbf270efcae64382d,b9efac79a5d7a24930b1429e884c0e8834954c07d71fbf65eb2c6ed9deeb4b86,e22a3c12a95f1f07a0efc398da7c39c4dfa75447f17a03184271cfb5a5c96878,38b9840b1b4424a90d4999dae44d5e84b91ca5ec9f9227019134b124e17d9365,e8938fb84352f04418c0004d647b83627f9a87ca6df5565acb3af41a5ae4e96a,0230a0c0692cb9a8a5ef678e43f6693c48798ca10cc18694beaffea4825d8ea2,df9656caee96c6307c2a5f1b8e7ccd5939ec5d5d20902865d6bea75c696ece8a,0826a9dd51b29e6c2a5fa4851b9901938766a966be238bde273b4e18d13d8f52,3b6f3cc0d0a263cac2542c2280f43f15fbcd5e84a8e381def4f85ead1f50fc1f,203d4d1fbd75126347c4d6f5507e9d0a3a3e7c882add72157a036c9dc4e66512,7390338a73bb575ba433c21c4f20046fc84e068569ae4dd646105a9a6a58847a,336dd7b5898bf4970a26b5b4a6fe676b5dcb8717e001c9b35bb77ef470b4a7aa,8a9664c99a6f9c834aa54c4a762a31e8047584637fc9062e5069c0aa72631424,f1c8980ccb671cdebf22a160a6e80d7e32fbaee249642d0542b0c200d49aba3c,53448154f4b36b94312be81822b1b5e50dccfdc79b32e2c22b16ccc6b7d578d3,f70a7b08f88830a74830a78e9cec3f8d232217b113cdda0c8999701ad03e8d9a,ebabcfaf537123853c1f4fe32663ab2b9940ca380a469c90b4335a3cd75ad845,f11b62e725abd3132689a08c414a9d8056306685ad579015234147ca8d951ef5,e8746cdb50ea505868f1b14a639befe60793e1b098595ada30da9dea8543f85e,d64f3d1df00b2499d8dfb70a7ec677b6254194c1cc6fbccf2a5de0a1554aa73b,bbc3769aeb96573e828bcb88d4043326422a486cd7408d673f55a74c2bceb905,89b3990c08d38bc4f157d83dc4a3de9daa22d47eefa2b8d2083b45e22d987059,befa5f82ba8c1e203827afdd525b1bff339db39bd687499e67cf4ea0ff1ea7da,35248acd0ed6d6a551b7e6bc46f5fb6c5e00e996021298370a3a6145e45557bc,bacccc0dddadfa4e5ce03565a4d60fbfa13e4c6df882b4c5380c63c2fed1c72a,c3482d84d0f68d7340aea787390aa271051697c9f6189e01c970ff18cc871113,d03111e4fcf3c5706acbcdf03408f27c392de6d622b6c587fdc01a15aac8511d,77d3c66add6417b3c82b33ffc4bd56f99f0e1f2ad6b50cb7dfa52cc20fbe53c6,de52618ddb2a0814d537e701065d093dd99b15ff8ed9df4a47fae47b36191144,e5b2c494f09c57fcc1a2f1c81b8bd543418561195c1b406ff0933c80bc43926c,290862b65579a5a9e7b7af38787aadd098db50c474fc8973f1d40935c2abdff8,4790aad6ef509672d5b51ba192b1465f4c7c8c8ed5575164e549502498cdc314,bf421d436ac5cac95ebe884d84c2bc10865b614ffda07ba5e47bcfb45d0cae68,44119bae5a9ad9707bf4ae45b986db6c14910549c134977cfe4a9722d8bb8413,8b66d6f823efce27b5dd4ef8df2e7c420f977683ad951e55117133c96d3a2fef,7950ef46b73ee87379ce9bdcc80e7fb5cb1e2a0550142d09772f5adb48990783,47900068bbfecf6e272a543101b24e3284cf97d20f10c83e0cef34fd3d7b8939,9b70918fe6fdc6b997251f8988b1e28b26fbcf5b00aa009b54ed6987954b1054,87e5fda75dab4f89646c832951c3ca0ee2ed7908eb67be8b7665bca0c11d4863,e2401111629a0f6b97c09b98cca394d653ef3b2b7b130e6dd97a1bd278be6fd3,513ab2a40f29de856e9e75f7f556384b5793b52630966e2572448201b4d91241,38ce4e383b82bba6324efe0b591a140e108a140d348964e12fe4095f1ec28836,10ecfdb05cccb69aac313df1b85b6e9a8d16239fc72b6ba01d54cb3a01367d23,63a2f5ba3d1e707b0d2e7143e6ae0b59d2db066c910d8dac1044282a7b414a2c,5358b5d792244a4a9cd76b1a53cecb72edd8ad86b150bee596bd111984f37c8d,f1472a16d28eeda10cde756bb0fc9b1edfd72086ad1b7ba848f3b2c7c0c1ba60,12e200388a96f0c880cf48e93b2ea96287b7295b64ca80618e0425bf57fefc12,ebcc48149e5fef8d883c2feab956bf116beaefe8ab9eb751ccf991036fbd21e2,0c40425718e03bb1dd82551fce54f4580e8220fea9f6d615b026698fd9669c80,4848690fc49a95c439cec58f89982b58840164815d953c8fa87ccaaab2bd1731,6a16bad26a7cc979a4f8e5eedbc80fcfd9ed7ecab91193becaff50f33efc28da,ebb1a01c03117dcb0aaea770106bbdeaab4977f48c996a4f099afeb1b2facfdf,01b214bd9fd35002db91584f4eaf2c6be48033f47e10de7b3688a8ec03c3ac76,7826ebc97a654bf788cb023f6be2dd87989948ed6c1459af75d66323ec609933,f5e1f76ada455535d638d72d5ef1026376845487d1b6f36a260e4c7e9695601c,3f7f2d5f5a5880ceb62584e53b591be6daea1c1256e40d08bcf800341c0f4998,81d396417b5c2f4fa3ba7ff9a549bcc4828c67023f02e312a1d2b04d6a0dc284,a038ade0998e9b9f9b8f6a6c07f1fcfd71a94c2cede2e008c01f20c5bcd8c951,440bf41f1820ae151a8b9b7d9929092506b9b37ff9008d25b420189f6c5fca13,3a84efff563cbf7b4d8d5cb263f4f5fe0b165d6489ef97cb5f027132637d5966,7424bde3031042dca9b2772420802729013620f0080339286714a1cb025819ff,7ce7ac17c0ee78366435633c0e6a7856a39191acdd31e0a4fb8ac805e34d46d3,aec871aab9cd61464a27bf28f20f9787d1487fc7db381755b446eaeda32bef95,1776c5cfe011cba0de6adedc058437199b5b4d022891b700ad34c253bf51f528,77c42978cbb6d4e9ea009bad225ce9c6b9628ef385b0e920d840fc717640c2a4,0234edb9221988c6f9926a02875e25f902636edf0352dba3119c80576f6d234a,a3982bc2e9fc9bf4ba8a557faf0fe3c87c7d70704cc34bb257ccce850a56df9c,1028d4888bcbd6de66991f55b05281908a43bd721999e52b864043e5b20a1b4e,1243e8b9d1f3f9faf60a3ef85df793a21cd32fe70be208daaa8b581ef2ce8e68,f126a0245767f09b0673b4db69cd15c21f5bd30db6a4bba8d1a31ea641d58b33,3f2c79cfe02d3997fceb691aeb35d7cd57de441b4cef6e30b9b962deef9c50b9,f5fa2ea7bb2b4c8c6ffc48161983f88bdd19be45a57fc98ff9c1fff82f801014,d8df89e0cdeb42bdc936da63cde0fb936f56dc234da63917663fd7372b7660e8,0e8b757308130fedef4420b79e3d3945e6f8d2d17850eed9309e4d130f654672,b997b5fc7ccd97a0539bda23185af6f510eeb5d73de4fcd6647784567295bc6d,a3e3ef6e658b4466bf2171c47455a80cc2bec6a90dcc1fb3390cf744eb53c1c7,8fcbfc5d27166c53d080f471d16f6bc8e8aebd92f0dad07de4b859495ff042e9,28a00715a1445747db570f4072a94bb51e3174665cc256982f68eb73ae373ea1,b9a85ace3beb1b30f5246b3226efd57c9f829799fe621585ee7835f55d390960,76f2d988a34611508881726f80b18430753a9bddaf239fa1e3ca248c07f563d1,810a984e20a8f0d9fea02b69a9d0d7ee64743d73c24919f060355c58221659db,ec0ceca541ac704ef78375ce66bae03e2ac7f948e14d0702702b5edd44431ed8,45c038cfcbe4bbaadb423bfb6d69aa166bc36444478eddf04dca330e747645df,66978f4b114af8a2c7bff35caddd57b0e34d4469422e1f5177d84efbc29e9f9c,68deee2f5ed12726ba48c143de86f5bfc6f52e42387b6b118bd6adc15c6398de,a0db86d2a0c9ce98a0e3e45bdcad8786af03bc8c616726b39e73514d242903fa,585814809fdc5504c535b33a7905c9eb1fa3fa49d614de3691714738ae50800c,1302a8f2dc151addb559c3078c9ff96e4d0c0830e741837ed7167acab0f9c665,4142bf0dad7aed829ce45f47b9dc7301c99ce48eddc44eb72bbcd790238e51df,7258b40d72fa503550edd920756c4a1707b73bdefcce5ea94e79077e215c2ac0,14e73a66c7000d5cb2e2814cae0efb467f7a7db3ff586781127d35755ee90dea,b0847a80927caf523b377dd8e6afbfd29d9d247489f5531492b52a1603efaf31,1fcbf67cb147f8550780d80e16f5a9e22e28d5fd73ad04c7eb05f089173f8e6e,4b7ef70b85443c71ed7d39c56825a8d6faacb85a4697cafa4945680a0ad3a9d3,5915da1266757108bc408ceeabd04a99c93f745af0462d1df9ac42384cca7e07,b3acef10f8a2f04d21dc8856c7e138f103dbdc5e6b34e6871b12eb2ec6907a18,8da8f353e95c27476094aa037c06d987f72ab08ea5927af07bdffd24467a5f68,0502db50a5bfbbfac71e959bd4f372a47e83ab6a17a255b0e60b402c122b3fc8,04ee807da45b9a2a8a1cdd0148e1babb794e9e7584c55f370a2f723a16632c2f,79ed422a442f7b3a6b194660ec90560b742b9ba018c2bedd72d6d5a60b332c5a,07fdacdd8c1909fa7042e20ffe2d5f5bfcdbdb59ebf3e11886d02a5f0fbc05ed,361e57a73aec8cacee32496094263948fbd6a9d96e731fafec127eb9fd813f26,c36e6c40c3035c5dc4d8f015363c4591dff5a0e2065aa719c751cdde1a81bcbc,9bac59d959407ea715e81eb23ce43cc88e462c5a25ce525a5dd7b417ad7ea7d9,8dc69bf8158365d866d999fe69b6a7bd869961bafd09863b30d7d6a114bfc5b8,b00f70f3daa8b95576f82c3e59ecdd8558029ee49fe3f726a39d06a1e8fffebe,7ea988c095c4107824bced289ab7d21136e81dddac6a57af836e639135a08e05,966476658b04905c11608c684e267508c9f875f90bb03178b6b4b93ec2f98f13,f2d19b603793cc43563223651b218f8e465f1bfbbc803ac0982e75c8424e12e9,87610850a33a00749627bbc7c6e0aeff65813378733563d05b09333ed445ed54,b980b9789136661518c8864a2caf5f5ef7564408d05391888d25695d6bae1c9b,5fd10e734dd73befd2506c7a4b3d9c453366788763933a32ae7c8a1cec69c000,420858c69ef2cc9b5077f786392fecefbbd76501a8843ca13755a8efbfe6c6d2,6c6dd279e6b135970fe3352b41771341ddb0da7b41b5347b53004970ca2a07d7,247bf14ff84a4c498caeb9aaf249d186db1f84e19363a1a3f118801a57ba09e6,2d568b421ddbe5486bee08dd6d1c584f3311eed85dc714aea72efbc8f26b1b66,274b1391e2d9c3416515ecc8d10061cd1918f9fa9b7e91c7e96934e9cb6bc8a1,25fb97b440fd5a8c2148b8301eadb6419c1350003e4d9f2956a9e782a3e898d1,2d1bf699f5a8f2c5b2817eda0ef641947c6abbe7382fb888194e1d5fdad09566,330b374790e6d56d65f871ceb5a1779bc9859ddc29fd7bfd0d2e2a36936d9e98,3ad6891a7801438b4c695915e33ab8b7601e7f96074425b4dfc81ac76d6d09fa,8936901fa82ce332b699810e836e5320b0a0c5a267be7d875f991607a4eae282,d96bffa8ce37e4148483ff508f2a60b6629938db37b26664be8f4de4e8f9be27,7b4fde34ebe05d8c5a6c7c9bf0caa3971173bbbb62450179db376c1183325c65,4e38a924326b672f732602e8b926997eaf815cb8d9552ca8b2d694d0ceb74621,8d88853e489365132031f1c19f96787bb7955fadf3a33210222260c41b46fee9,73c500ead65ef2286b5140e06deb05ec11c78caa32954452e9ac50f01d4b1574,a8fbe2c40d74d690018dcbac28ce03edac5e5078d86544f04d422cb94b2dcc5b,3070a2343f71b624450db8bbdfa58ad1d4f20d171120fad69163ff68d969b36e,c4b2f358fc2cf8d771f8adc21419ed06fb3c2eafb8aaaf57f9f0036b71b24a79,8b33b6c3935ba61868fe6c3cc82dc09cf8956ca401e4081bb9070caaecd54a00,2440f69ab8f6f3a40c2bb83c8c11fdfbb69b32c6fb92a8059fc53f72c90a0fe7,dcb1b291ea41f4aa8f4632f62cfb20860a55bbcccd5b865bb36a8c0868763493,77fe31a59eddd7b925605d0081ae357da852d2530c820db0eea6418f826270ec,5a48b14d87fe45c7ef72def490db5cba84626720dcba876037241568ce75eb0b,28282b12ce1bf020a380fff1d6276f20533530ecc1fe666744c7761e80bdf7bf,f7965deadf987642563ceb0afe231c0ba0656547a83c3b2c58eb101cfc3b6df2,75f75d426cf3b26ddcf9d81e37ab8ef4e9421820f35abeec77e89fe2f229c713,df4ad30a4d19080ef444e9b86bcb539bfde6b6172254e6348e1f8677a6f8a2ff,72d98f1549d8125c6f98aa65ce936d978b7e46761c7b738ff162098b97ca22b4,07fc641ee6efc88323ef2928b263822f66b8bc844fcf686e8b6b809cc55cb28f,6fe314848cf6b71e3dfb97e81c58e8a5cfdd5c95907beba0d80cc733e338fc4d,edbb054b6a58f073de56cb76b962686aa3285cf0061dc1274c95d7d6091b3b33,600b8c1e159b5a119a8f2856c9da15f0cc407a9440c28a9c930b93319080e11e,dedfa5adaadbb507df7acd1aff8bf15e792556ef5a20f7ed8f2f733b50a2a94c,266161aee785bfce4cd62bb7f373f7f6c5843042aec46851858b15be81f99c01,a27b39e042e6b6d8a409c02ef510e87bb4fcd6d17a583465f1e3bdef8fd5ff66,bedc14158770ae8dbc3cf5e095890c1ae813a71519a1599e12d318c109a03d73,eb6c718e060181374cbaf61401df3fe4795b5ea7d69071ca54db7ec46b5f39d5,1db3779583cd8ddfebc1c33b9554c259e73ce94f352c8b9dc65d91b945f42508,9d178e34adcadf94b206f0d04956160e3e6f1aa621ee7e901f43d5b4993a268d,6852d1772470588b412382efa795fd3839c0b5f0d5c73db60ace8d9f0654f5ac,c16d4d475f5bbf6b0fefe2c737538109175d619e6fbf84fe0ddffaa107f49624,4a2d53b4176333403f606c59b12561716543c596455de1883a1a08648cfe5633,0abf8530e6570ac69c068b160acc807b660331fb7f206267891772e05784f080,ea085e3675b4f1ee23aee81d920d14168f7740c4dae404f081263200c582d5e5,d1f88d59c10f517a00f8379fe0dd5ff60fca94e5e5a077432ffbb6a2b6f85a13,43a471ba0c43af7bc0e53f487585fc7e44a4262bb0eca400038a875430847ce9,6a9a40995191d5bc3bdb32b7ae6af6b2541e55576cfafcd97c9bcd95da4b5340,e28698e18e49e481b8a92b4102cb259584d81edf3f73468c5ca5509d5b5874b9,007b899ee4ad9cf389a4db03ed5ec69e8a2c4648cec328f0c669425089186604,8ae572d8a53847a30f5e9f2ac5d734341c2fac4fd8f574b2b9d9b24817d6e372,f857a1374f3cb2c80661ecadaf5d0e3622e72d77d266aa7ad2801e7db335b969,2e9eba7803798b99de5e59a3cb207ca53180326d7dddc4f80460ef1e3bca9f22,6d2d8fdc6bebd8bb5aebf5f4008856c427fc9b077cedef06d7cabdbb35230090,e88f5a8743a1e2cc24c07bf93d2566293ec90dc3016d6d561ac359f200afcd7c,73d8e522befb3985d72f69876a3bd5bfd656ef442af8db63f24e3802fbf7453e,09dc75bc71fad01c85dc0c7a2dd4594ae3883bf5ef8155cd2856638bf467842b,69f06e1c5773eddc50d89714a081fd26d6c271355f609d171d90f09fdb6ad311,1e8fcdd32d547ec02338d40cefd09b02b28a4ae8f8972a4fafa158107f6a890c,79dffd0030e1dd9af958fe233cbdf1959ff3d749d863da8b92bf6d2edcd114ad,e089dab3bb2519de80cf8666f589e183f4ddf80f8778282694632499c093aaad,2f342899b6e2505b72a25f7f507298b4cd5b0400f9d034d45a95fa86d127b171,5b6767fdff5a39d92eeb8415eec49f48b958e9c38151ce4356d09e43f8b397e9,a70b2878df44bd3952d9da43fea40bb475d2a87d21b8d5750c2153163af39c0a,4526593e49e532e8e498a8b14c3ca15c1749dfac9cf39a0b44b4c18ddc319440,118502524e8a02d7c7ee2cb984b598f27afb3b7b78b92326b2fbfc3c53f48464,8379f7dc2c391ac38ea1d34ddff36faf5602bf128b6d93a3a8a6485b1d8dc23f,0c17a500636a9a94b405b8e9f2fcd45b058a4a9070c156332e429daf0379572b,7e302ffccaacae442283c86d2afdf7c240d19dc42c41440419c8b78efdfc9dec,a19467bab0f5a753e4daadd080e64f13c79bdabd7e403575f9f3d3b7b6ca66fa,4162c48bb1ba5e8dd38518f9d1007300e46348e01a97184e253a3250ed0f9ffb,c1e36882f77da60283f64d2590e3389497e6583fcdb61c21d352d522506a8882,64a4716a19fd7b8009a5e6d5924a74c65ef8e5f85c64345c7b89a4e6b6135e5b,8136dbac064d798c9e30bf31e62d74f99ffb37d3bd9f3d6d3c6544669ca3cded,790f8dfbe56b27d1b82b00bf96394caa4ef54263229bf3ee5b2aa891ec8b5676,7d060a4e92f2c1f4cd2546f5409cae2c946b70556b249455dc19fb93e8dcdb9d,8e62713fc4972433c63b1c0c19cc1d291471381b11183b40e450263956a4d1f8,46255b9d4d2059337f3949e4ada5c2d16ab8385f66967291e204175aa2120986,49023745977f47f7439c701985905ad2be42b2a89c070df73ea8dc7f9c5ae627,75e6c4c28e4dedef545bbe58ea2b497dffc90ed7fe6d7261287e90cd85a3fcfa,fee9501fc25e4c85c0d205473426d6e6f4e02eca002eab6513c6467885486fab,77f39047575527668b8c86defb3a15328d6f6289ffb1dce1b01fd1c9f193f739,59e80ebb2f5424610ffc9070e39c64805a1d6a44f52993eaf0b427b3a8494b99,bfddb6b1867c2d0cf3ed074ce94fadc786226f28f98f9f1d7ac5bd6a1e040f9b,4c6aae8655346883ce266665e0c61461636a128c8804d6aca78f9c8a35356fbe,bf4462bc1f0c88cd99e30a20c6b6eeae09f7a17a737314192aac8b40056e90e1,f448286e1d5a998965efeed87d8feffd6ecc3fc0a9a8658730da10715324f89c,7619cfb410a5bb992e9da50699a6cdd82a0279e27176ebf4c1c21c12dea2459a,48395b0355072b681c77cf4684dfa228f4009c4985d013908539e34d306bb4d5,6fa9d11c314c5430db8ac179f7e1517d754781522b94f2da800a3d9db8a191be,79462eb8641df40ec28d7ae89ec7f1d5548b7b0316fb03da682726b35bfdcf7d,dbb07ef67043d85768c04c5c68e98a88685bd2785a3b20ba574403397fdcd33d,5be705a5717f0ad7688077b80765f8eac1be081d07105c7ab342db817461213e,0314be8e3cfcc6f00f5a0b3ce074f844f8126692bc9db1951df722379ca37622,b225bede76fe85a80c30ec258bcff80f9226fc3b3c07e1c75aa43e38968c85b0,ecceb05c114658703ee5bda417b23ecedffc67129d59b52a4fb60b9aad8624ee,56d6e51283d0da2e6aa6d8a166178aa5bf97c0d6ad8b6514a2b1a8701a890a54,274754307e41b8a6333f8f2d9bc679640fdeaa6954c94d91b022185d2e0f64ca,1c303f25b84f7f63fba0c97dd1ebf1148c1968658dca21b27df47ae2b86c4c2b,04638bdc28da59d45407c756701e4285ad0487858e92b2e45ccf99ffafaaf73f,ed4d011b44c9801335df5d3b5550977b11a1e78ec7ad1ebb477ad2eb707ddefe,333a3f0c920bf95d95cfaaa069a17ccfb0998ebc5697764788642ecb69c1746c,c6db8bfb6ee98557377bf8886a12c5784f613a53db3c09c161938039706941f4,25c3e1dcd0d27d63978adcefe9f862d9be8e20ed44bd80c359ffe99bc72fb095,035d2f21a40a3c5f97be226cb26e792130ba0d56dfe472b5cd9e1fd0b5d557f8,16411af320b57bac481c370cab692121e93edc942c2a6851c64737951a9594a7,43cc758c0134246a8a9e7db3f08a63709f0db02cb8431c21319e832845e3bdfe,3d9149f5c36eee7b661628d69b8d3e323b4fed8f544f8ca7b1bb575de94d465d,85ce96c84ff64f03e0c8b72dc9d6f2a4679c034836368345e22ffd0a170ad62f,2691d4f78bedcd4a6f6fa39c45a0109e4a11ce7603c656b53cca835d3863e06a,cbd21277046ea7f4572d6e8149077713575239ccf8a98c56b162b633a6490cf2,30335f29996cecf0747bf4e2b44f8ee3959e4cc277317d48e80f7726a85d87ef,afbde53c640182877df7eb5955d42669c5aa54e65ba304d6bdfb1be002cda374,d053a7b55ccdbf594d95fa053a1dd93d41a72e9c29b15b68e571e482d33277a4,3ae128f7b953405c2cd293c2e62a9c99914a7ed69d84c927c518bb9fc21b74d5,ab43d526f1dc6a32395c49806c8bc73bae918a5f3cb5fc1d0f99cc32e8d45867,7c5151e7116ff12d2325c9b2e98256e43802f6c4a15584be250aecbf143f50e3,5ee1a8ac394732056708b628216815b744eb5fefcff8426eb48d682ae7fe0bdb,e1f06ae08a52e1e4e7544d0ee343d33ba6ea5a71d7ce00c56a3f14058a199d78,771032904be77e19c389ae615a39e78aed70ae8e233edd8f3d5aafee1e4691df,cf0dfd60ef8f949ec0168439c7022546c5f00634e7fdd668900bcad1e2e81756,84bb868f3ec690f914e3a8cde683b55653e554bf5ae6516304ca95e3e0be0ce9,2e6bb4a91f7df30a0fe05ad3d02ea64b6a571a089ecd6e1a2caf900e5175949e,566cf7e6d6419fff93e8f18bd34b7fdb2db9b2d4191434e37a97e3a5cd00b186,912729b57611e1422879af83c5d11bb416c0b98fa83dc392bae590d7e90d5d12,54a7f54922ffc66260dcf30076c4cc7fa254cc9b830b2e37349d7b40f0d67231,d2cdfe1068809e2e519bec2fb30eff036085ed0fd5a174157f4a531be489a9c4,00c19bdcfabceeef4ab4c71251f41d59173c43b87ef0e968e7aa5bcf77fc3aa3,00a1b917cf86485c9e86030ec1afe9b7e28a4345f46471b92b4e0d08b698bae5,17b23ef7d38a3a0334ef68087a585ac48956984f6e0321c62d30011368954485,1fb0c2d4d015596c3439f405da4a7a2497ba94cdecb535e70cfda08c6a764f4f,993c1131175eb1f3b8b5d1d72ea5addac559a20b5154838ee86aa9b71e06652e,2ede50271add1f8aa5b91bcd222d83eecea7f4a524c9e62ec01cd889a55aad45,20ada1b4fe496096230fec2c00bff8a037db5079c6f45955317df9c2ede5f85b,b37b8821965b243026b83a59ea4e4e2246545fbcc1100d8effeca612a3b6bb4a,0760c516052f81058efd89aa11573c744ffd4f5685e11e9e200bd0ba0228ee34,fc3cc3b0dc5592a8c0a2e41d3ba995c0f65efbf2797c2b7b2403bd2c552acd64,0475e984bf932adabb1fe98d943ad23fd56e4bd53c2e7bbb12ea69b7996430be,d60ec04ea36dab7f685a2dc50c2f76ede60a6b594b15317d7e32d2438eef36ef,13dbd661bb4f0bc0854b761b94470f2c8d3ea069c2b2c53d07f40da9668515a2,875472cab949b679152079e79cd06ad376c30f4c298b2f7e191f5f7ef3aa1ccf,bfc95afeb7c01ea29780954bc62c9830af90e4a8882b64d24e65d7c30e075e48,4d100b664eee670a68d88d07bab4ca55dad28da862b2af631b29d5031920e10d,1275cde34b3de398a87fccd8bfa2261f826983ea774a0a413843f9de07beac70,b3cc121e4d7f7bc008ecd7d79b2f08d32c34c036c64678ae7cc43112b4297210,46a13985c51e2cae515be2a8f1eb0b42fea64cf366057a611cee74aaa7c648e3,df40e86985f66578e1ca70bea1c1a58b943c3b37bae49f639a547e759239513a,448cb5c2de497679de2161a93b5e0983a6030a33a59eee2b3171c56a93bc91d6,e6b371651baf1c9773ee1e240d51deda5f237e8da74048af9f3379f70f1c8e2f,d24ec5de76732220049843cf0ce87053bdfb223d8e45cdbf83a8d801ed486850,4131794225ae70468171aefddf3e5875a8ab294263ae4694f93a68e8314b0b5c,f5958acf10e9d5f12d9b0349bda1e652273977c36e1ad59c383bbfb512abcac9,19dea7117e47e557bca2019c09173879bde7a9703e7577ec5bf2270fec6aca6e,3cc640e6348efd77de2a22367f609c2f68551d4cb917f27c32c2dbc422827dfa,61d21b2cb4586c4ce3178f6ea51d905d9d00d79d85ccea52e5f4223811e12a44,44e06b75ecca6b3a9f91813c716c0f61f5990f498c5ed17a41ddfcdc0db48368,8da1c8bd377bb3892265639b26a72b7780393a8a43f6471a5eb1abd1ec88ef3d,f5e58a733b69af1ef5fe8a9a580b3790a792e44ad32a29e98d9f7f142862b298,d1e1dc03f1d6d75da644b8a14f8e7d3906b47d50968273f0707142bdd810de1c,d1869756e1200628a18e401e9510a9f78604ce91faf67c2e759a7b28c6eb882f,60dca01fbd010aef036b6ba742978ebacd1c49ba999e06f1b7985c5c0e96055f,c731ad94fa972ca5a7bc709d2cccf187ba47bc6299dcf3301b62990064e04fa2,d1cffa5c6c044dd22a8a0990545ac7bf5edf04b38820230af853949612ef7075,cc351a659c1718306c90276e7a58697709b69d2dd06af2dec6891ac77ac62a3c,82738ee011e454410ea714fbeccad19fe15dba4e62b7d1b85e65e7f8ed2e6286,2d2f067acea2451a17ad0f2beeefcc768dbf52a01f437a5066f49fac1d3eb312,fabad1b8e1b3a3e11810c408f748a7e70449f4274aaaaaf69b11ffeaff1504e7,4ab824b1479ec872488f501374e22488e0b8b4612ea16cca5208783016af9858,1b5dcad92079e86412309d5f85b01631a7aa3d7eda261080531cdeb89c96bcdb,a1809967d96449a3535d19e509fc3ae58b714805141f6487aaf06a7b00f47dc2,081fde0ec6f26348e2626daf44d932bc31d3ac3cc6546061484f9f68b0499422,c3d10191066b94c7a89f91f75fc9aea86e17ac5894fecb8c0698957771d196da,b5474f0aebab60ca12d4f8097a499f3fc063ad6146eb6db4191bc05ce82312ed,147a78e0d0d68aa642b97ba83e7b45ff5b367341f0a0a4f551f593f3ed8855db,47b2514697f7793be6f9ed37ff3cee74a4d1a3012d468c6069c50b6681ec07d1,d59ee71f32fc530efbc54952356a1e564e7fb077b9323bc032f6cacd7ed47917,f0c7fa099c97483728d04f577f5b1462443136e52b9434b5875e00984eab9fc6,a8d103d654099371f1a97f34cfe997683000cf2e7a525376d6af1ac2b75d71ac,cc5f68d406097c09e8d86b667213f52b77d3e0e543c86e3dbede40e8c1f7490d,b495595a4d94415ad9e3c6fbcb8589ddbaffa7d0c9077fcfe261efecc76bc957,f4359ca550fc3fd61f08b20e7714d37f1ea257a2d548fcc6a40cbf1bbc4bfc2b`\n\tinvalidTestCodes\n\tinvalidCode = \"qd0bJ6HTSB\"\n)\n\nvar (\n\talice = testutils.TestAddress(\"alice\")\n\tbob = testutils.TestAddress(\"bob\")\n\tadmin = std.Address(\"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5\")\n\tadminRealm = std.NewUserRealm(\"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5\")\n\taliceUserRealm = std.NewUserRealm(alice)\n\taliceCodeRealm = std.NewCodeRealm(\"gno.land/r/demo/alice\")\n\tbobCodeRealm = std.NewCodeRealm(\"gno.land/r/demo/bob\")\n\tvalidTestCodes = []string{ // These are not actual raffle codes, don't worry ;)\n\t\t\"qd0bJ6HTSV\",\n\t\t\"H1Qe2kx@ME\",\n\t\t\"2E$zre$$oE\",\n\t\t\"f@2xEQCEWo\",\n\t\t\"AUpFRwb5H9\",\n\t\t\"jHDNQ^x2zJ\",\n\t\t\"VQz^SbYtR$\",\n\t\t\"?ZggWTzpfz\",\n\t\t\"1HP82PVPD0\",\n\t\t\"#nThf$N?qq\",\n\t\t\"nQJFyyk9vS\",\n\t\t\"4xR5n%ymnw\",\n\t\t\"ogJ7sy77QR\",\n\t\t\"syuJ3ttYKj\",\n\t\t\"w!JgJT^Cu$\",\n\t\t\"kmucxFaAL#\",\n\t\t\"7uz%UDR9f5\",\n\t\t\"ifUWAKug9?\",\n\t\t\"2Np27vsHvp\",\n\t\t\"mtDPMcf%EA\",\n\t\t\"153SQg6T!h\",\n\t\t\"Zgt9c09N9s\",\n\t\t\"jKKU7y*hN9\",\n\t\t\"L$gKPVF0Df\",\n\t\t\"1R^NKNV@RJ\",\n\t\t\"TbtREP@vx6\",\n\t\t\"$ii4\u00261$CXT\",\n\t\t\"jdVRC6FCLT\",\n\t\t\"\u0026qgQrrtB^k\",\n\t}\n)\n\nfunc TestUploadCodes(t *testing.T) {\n\tinvalidHashes := `1cdcdc252a3a8c2d1516527dcf3ee63b4552a6bbb41145527409d8a8b6185c40,551a0108b23cc4bdff4c716a504a677551d68162ada5b9e20ebb21f4d7e83c9d`\n\n\thashes := strings.Split(validTestHashes, \",\")\n\n\tstd.TestSetOrigCaller(admin)\n\tstd.TestSetRealm(adminRealm)\n\n\tdefer func() {\n\t\tif r := recover(); r == nil {\n\t\t\tt.Fatalf(\"UploadCodeHashes should have panicked\")\n\t\t}\n\t}()\n\tUploadCodeHashes(invalidHashes)\n\n\tUploadCodeHashes(validTestHashes)\n\tfor i, hash := range hashes {\n\t\tif hash != codeHashes[i] {\n\t\t\tt.Fatalf(\"Expected %s, got %s\", hash, codeHashes[i])\n\t\t}\n\t}\n}\n\nfunc TestRegisterCode(t *testing.T) {\n\tstd.TestSetOrigCaller(admin)\n\tstd.TestSetRealm(adminRealm)\n\tUploadCodeHashes(validTestHashes)\n\n\tt.Run(\"EmptyCode\", func(t *testing.T) {\n\t\tstd.TestSetOrigCaller(alice)\n\t\tstd.TestSetRealm(aliceUserRealm)\n\n\t\tdefer func() {\n\t\t\tif r := recover(); r == nil {\n\t\t\t\tt.Fatalf(\"RegisterCode should have panicked with an empty code\")\n\t\t\t}\n\t\t}()\n\n\t\tRegisterCode(\"\")\n\t})\n\n\tt.Run(\"NonTenCharCode\", func(t *testing.T) {\n\t\tstd.TestSetOrigCaller(alice)\n\t\tstd.TestSetRealm(aliceUserRealm)\n\n\t\tdefer func() {\n\t\t\tif r := recover(); r == nil {\n\t\t\t\tt.Fatalf(\"RegisterCode should have panicked with a non-10-char code\")\n\t\t\t}\n\t\t}()\n\n\t\tRegisterCode(\"123456789\")\n\t})\n\n\tt.Run(\"RegisterCodeWithUserRealm\", func(t *testing.T) {\n\t\tstd.TestSetOrigCaller(alice)\n\t\tstd.TestSetRealm(aliceUserRealm)\n\n\t\tdefer func() {\n\t\t\tif r := recover(); r == nil {\n\t\t\t\tt.Fatalf(\"RegisterCode should have panicked with user realm\")\n\t\t\t}\n\t\t}()\n\n\t\tRegisterCode(validTestCodes[0])\n\t})\n\n\tt.Run(\"CodeNotOnList\", func(t *testing.T) {\n\t\tstd.TestSetOrigCaller(alice)\n\t\tstd.TestSetRealm(aliceCodeRealm)\n\n\t\tdefer func() {\n\t\t\tif r := recover(); r == nil {\n\t\t\t\tt.Fatalf(\"RegisterCode should have panicked with a code that is not in the list\")\n\t\t\t}\n\t\t}()\n\n\t\tRegisterCode(invalidCode)\n\t})\n\n\tt.Run(\"ValidRegister\", func(t *testing.T) {\n\t\tstd.TestSetOrigCaller(alice)\n\t\tstd.TestSetRealm(aliceCodeRealm)\n\n\t\tres := RegisterCode(validTestCodes[0])\n\n\t\tfor _, item := range []string{alice.String(), aliceCodeRealm.PkgPath(), validTestCodes[0]} {\n\t\t\tif !strings.Contains(res, item) {\n\t\t\t\tt.Fatalf(\"res should contain %s\", item)\n\t\t\t}\n\t\t}\n\t})\n\n\tt.Run(\"DoubleRegisterSameValidCode\", func(t *testing.T) {\n\t\tstd.TestSetOrigCaller(alice)\n\t\tstd.TestSetRealm(aliceCodeRealm)\n\n\t\tdefer func() {\n\t\t\tif r := recover(); r == nil {\n\t\t\t\tt.Fatalf(\"RegisterCode should have panicked with a double register code error\")\n\t\t\t}\n\t\t}()\n\n\t\tRegisterCode(validTestCodes[0])\n\t})\n\n\tt.Run(\"DoubleRegisterDiffValidCode\", func(t *testing.T) {\n\t\tstd.TestSetOrigCaller(alice)\n\t\tstd.TestSetRealm(aliceCodeRealm)\n\n\t\tdefer func() {\n\t\t\tif r := recover(); r == nil {\n\t\t\t\tt.Fatalf(\"RegisterCode should have panicked with a double register origin error\")\n\t\t\t}\n\t\t}()\n\n\t\tRegisterCode(validTestCodes[1])\n\t})\n}\n\nfunc TestRegisterUsername(t *testing.T) {\n\tt.Run(\"NoEntryUsername\", func(t *testing.T) {\n\t\tstd.TestSetOrigCaller(bob)\n\t\tstd.TestSetRealm(bobCodeRealm)\n\n\t\tdefer func() {\n\t\t\tif r := recover(); r == nil {\n\t\t\t\tt.Fatalf(\"RegisterUsername should have panicked with no previous entry\")\n\t\t\t}\n\t\t}()\n\n\t\tRegisterUsername(\"bob-username\")\n\t})\n\n\tt.Run(\"ValidEntryRegister\", func(t *testing.T) {\n\t\tstd.TestSetOrigCaller(alice)\n\t\tstd.TestSetRealm(aliceUserRealm)\n\n\t\tres := RegisterUsername(\"alice-username\")\n\t\tif !strings.Contains(res, \"alice-username\") \u0026\u0026 !strings.Contains(res, alice.String()) {\n\t\t\tt.Fatalf(\"expected to find alice's address \u0026 username in the entry\")\n\t\t}\n\t})\n}\n\nfunc TestPickWinner(t *testing.T) {\n\t// alice is already registered\n\t// Register some more users\n\tfor i := 1; i \u003c len(validTestCodes); i++ {\n\t\taddr := testutils.TestAddress(strconv.Itoa(i))\n\t\taddrRealm := std.NewCodeRealm(ufmt.Sprintf(\"gno.land/r/demo/user%d\", i))\n\t\tstd.TestSetOrigCaller(addr)\n\t\tstd.TestSetRealm(addrRealm)\n\t\tRegisterCode(validTestCodes[i])\n\t\tRegisterUsername(ufmt.Sprintf(\"user%d\", i))\n\t}\n\n\tstd.TestSetOrigCaller(admin)\n\tstd.TestSetRealm(adminRealm)\n\n\tUploadRandomness(123123, 508930)\n\n\t// Pick 3 winners\n\tw1 := PickWinner1()\n\tw2 := PickWinner2()\n\n\t// Check if winners are removed after being chosen\n\tif len(completeEntries) != numReg-2 {\n\t\tt.Fatalf(\"expected %d entries, got %d\", numReg-2, len(completeEntries))\n\t}\n\n\tif w1 != winner1.ghUsername {\n\t\tt.Fatalf(\"w1 should be %s, got %s\", w1, winner1.ghUsername)\n\t}\n\n\tif w2 != winner2.ghUsername {\n\t\tt.Fatalf(\"w1 should be %s, got %s\", w2, winner2.ghUsername)\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"8000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"bYYa8FK2twj7hyAN58WrZWZmFraMF6HP0L1+rfAHvqg5OKPRujzsyebbipI777Iq+sHyL4nDNk8MokrWPmM/ng=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","package":{"name":"main","path":"gno.land/r/g125em6arxsnj49vx35f0n0z34putv5ty3376fg5/run","files":[{"name":"uploadhashes.gno","body":"package main\n\nimport \"gno.land/r/leon/v1/raffle\"\n\nfunc main() {\n\traffle.UploadCodeHashes(testHashes)\n}\n\nconst testHashes string = `a657602fc08191e7a4e0255a818a0ec544c8ce0826fe9ecf0c47eb538b2a9920,e4ce35fc370cb77c8416d6cf248e406c3f41073955d2d1c46dfcde630437711c,d1c73632a00861c2a57502edcc7105df21e22f6f4764e07dbd76c1dd456fd763,5e9a113e15140d8e7ec30a70d999038970da4dc84b8517fdf93d8eba56b4f4cd,d0a8e682db50c4b5f16dbb1c206cc8086f58094642d5864db8cd5feaefff0eae,6d0d8c67778d4ea8ac5ed234c12075b7ccb96350ea84711f455eb1538ac30025,e287bbe122d9be4c90d2fc62e51abbc67de50f6c8044636a61e7f801081ba907,6c4567fdd88ee306f715eac751010b5ef8a66bab66258e580be4915898b1dfaa,85463175e47915820c55acbc2531eaf360a8c0586c3b59cbbf270efcae64382d,b9efac79a5d7a24930b1429e884c0e8834954c07d71fbf65eb2c6ed9deeb4b86,e22a3c12a95f1f07a0efc398da7c39c4dfa75447f17a03184271cfb5a5c96878,38b9840b1b4424a90d4999dae44d5e84b91ca5ec9f9227019134b124e17d9365,e8938fb84352f04418c0004d647b83627f9a87ca6df5565acb3af41a5ae4e96a,0230a0c0692cb9a8a5ef678e43f6693c48798ca10cc18694beaffea4825d8ea2,df9656caee96c6307c2a5f1b8e7ccd5939ec5d5d20902865d6bea75c696ece8a,0826a9dd51b29e6c2a5fa4851b9901938766a966be238bde273b4e18d13d8f52,3b6f3cc0d0a263cac2542c2280f43f15fbcd5e84a8e381def4f85ead1f50fc1f,203d4d1fbd75126347c4d6f5507e9d0a3a3e7c882add72157a036c9dc4e66512,7390338a73bb575ba433c21c4f20046fc84e068569ae4dd646105a9a6a58847a,336dd7b5898bf4970a26b5b4a6fe676b5dcb8717e001c9b35bb77ef470b4a7aa,8a9664c99a6f9c834aa54c4a762a31e8047584637fc9062e5069c0aa72631424,f1c8980ccb671cdebf22a160a6e80d7e32fbaee249642d0542b0c200d49aba3c,53448154f4b36b94312be81822b1b5e50dccfdc79b32e2c22b16ccc6b7d578d3,f70a7b08f88830a74830a78e9cec3f8d232217b113cdda0c8999701ad03e8d9a,ebabcfaf537123853c1f4fe32663ab2b9940ca380a469c90b4335a3cd75ad845,f11b62e725abd3132689a08c414a9d8056306685ad579015234147ca8d951ef5,e8746cdb50ea505868f1b14a639befe60793e1b098595ada30da9dea8543f85e,d64f3d1df00b2499d8dfb70a7ec677b6254194c1cc6fbccf2a5de0a1554aa73b,bbc3769aeb96573e828bcb88d4043326422a486cd7408d673f55a74c2bceb905,89b3990c08d38bc4f157d83dc4a3de9daa22d47eefa2b8d2083b45e22d987059,befa5f82ba8c1e203827afdd525b1bff339db39bd687499e67cf4ea0ff1ea7da,35248acd0ed6d6a551b7e6bc46f5fb6c5e00e996021298370a3a6145e45557bc,bacccc0dddadfa4e5ce03565a4d60fbfa13e4c6df882b4c5380c63c2fed1c72a,c3482d84d0f68d7340aea787390aa271051697c9f6189e01c970ff18cc871113,d03111e4fcf3c5706acbcdf03408f27c392de6d622b6c587fdc01a15aac8511d,77d3c66add6417b3c82b33ffc4bd56f99f0e1f2ad6b50cb7dfa52cc20fbe53c6,de52618ddb2a0814d537e701065d093dd99b15ff8ed9df4a47fae47b36191144,e5b2c494f09c57fcc1a2f1c81b8bd543418561195c1b406ff0933c80bc43926c,290862b65579a5a9e7b7af38787aadd098db50c474fc8973f1d40935c2abdff8,4790aad6ef509672d5b51ba192b1465f4c7c8c8ed5575164e549502498cdc314,bf421d436ac5cac95ebe884d84c2bc10865b614ffda07ba5e47bcfb45d0cae68,44119bae5a9ad9707bf4ae45b986db6c14910549c134977cfe4a9722d8bb8413,8b66d6f823efce27b5dd4ef8df2e7c420f977683ad951e55117133c96d3a2fef,7950ef46b73ee87379ce9bdcc80e7fb5cb1e2a0550142d09772f5adb48990783,47900068bbfecf6e272a543101b24e3284cf97d20f10c83e0cef34fd3d7b8939,9b70918fe6fdc6b997251f8988b1e28b26fbcf5b00aa009b54ed6987954b1054,87e5fda75dab4f89646c832951c3ca0ee2ed7908eb67be8b7665bca0c11d4863,e2401111629a0f6b97c09b98cca394d653ef3b2b7b130e6dd97a1bd278be6fd3,513ab2a40f29de856e9e75f7f556384b5793b52630966e2572448201b4d91241,38ce4e383b82bba6324efe0b591a140e108a140d348964e12fe4095f1ec28836,10ecfdb05cccb69aac313df1b85b6e9a8d16239fc72b6ba01d54cb3a01367d23,63a2f5ba3d1e707b0d2e7143e6ae0b59d2db066c910d8dac1044282a7b414a2c,5358b5d792244a4a9cd76b1a53cecb72edd8ad86b150bee596bd111984f37c8d,f1472a16d28eeda10cde756bb0fc9b1edfd72086ad1b7ba848f3b2c7c0c1ba60,12e200388a96f0c880cf48e93b2ea96287b7295b64ca80618e0425bf57fefc12,ebcc48149e5fef8d883c2feab956bf116beaefe8ab9eb751ccf991036fbd21e2,0c40425718e03bb1dd82551fce54f4580e8220fea9f6d615b026698fd9669c80,4848690fc49a95c439cec58f89982b58840164815d953c8fa87ccaaab2bd1731,6a16bad26a7cc979a4f8e5eedbc80fcfd9ed7ecab91193becaff50f33efc28da,ebb1a01c03117dcb0aaea770106bbdeaab4977f48c996a4f099afeb1b2facfdf,01b214bd9fd35002db91584f4eaf2c6be48033f47e10de7b3688a8ec03c3ac76,7826ebc97a654bf788cb023f6be2dd87989948ed6c1459af75d66323ec609933,f5e1f76ada455535d638d72d5ef1026376845487d1b6f36a260e4c7e9695601c,3f7f2d5f5a5880ceb62584e53b591be6daea1c1256e40d08bcf800341c0f4998,81d396417b5c2f4fa3ba7ff9a549bcc4828c67023f02e312a1d2b04d6a0dc284,a038ade0998e9b9f9b8f6a6c07f1fcfd71a94c2cede2e008c01f20c5bcd8c951,440bf41f1820ae151a8b9b7d9929092506b9b37ff9008d25b420189f6c5fca13,3a84efff563cbf7b4d8d5cb263f4f5fe0b165d6489ef97cb5f027132637d5966,7424bde3031042dca9b2772420802729013620f0080339286714a1cb025819ff,7ce7ac17c0ee78366435633c0e6a7856a39191acdd31e0a4fb8ac805e34d46d3,aec871aab9cd61464a27bf28f20f9787d1487fc7db381755b446eaeda32bef95,1776c5cfe011cba0de6adedc058437199b5b4d022891b700ad34c253bf51f528,77c42978cbb6d4e9ea009bad225ce9c6b9628ef385b0e920d840fc717640c2a4,0234edb9221988c6f9926a02875e25f902636edf0352dba3119c80576f6d234a,a3982bc2e9fc9bf4ba8a557faf0fe3c87c7d70704cc34bb257ccce850a56df9c,1028d4888bcbd6de66991f55b05281908a43bd721999e52b864043e5b20a1b4e,1243e8b9d1f3f9faf60a3ef85df793a21cd32fe70be208daaa8b581ef2ce8e68,f126a0245767f09b0673b4db69cd15c21f5bd30db6a4bba8d1a31ea641d58b33,3f2c79cfe02d3997fceb691aeb35d7cd57de441b4cef6e30b9b962deef9c50b9,f5fa2ea7bb2b4c8c6ffc48161983f88bdd19be45a57fc98ff9c1fff82f801014,d8df89e0cdeb42bdc936da63cde0fb936f56dc234da63917663fd7372b7660e8,0e8b757308130fedef4420b79e3d3945e6f8d2d17850eed9309e4d130f654672,b997b5fc7ccd97a0539bda23185af6f510eeb5d73de4fcd6647784567295bc6d,a3e3ef6e658b4466bf2171c47455a80cc2bec6a90dcc1fb3390cf744eb53c1c7,8fcbfc5d27166c53d080f471d16f6bc8e8aebd92f0dad07de4b859495ff042e9,28a00715a1445747db570f4072a94bb51e3174665cc256982f68eb73ae373ea1,b9a85ace3beb1b30f5246b3226efd57c9f829799fe621585ee7835f55d390960,76f2d988a34611508881726f80b18430753a9bddaf239fa1e3ca248c07f563d1,810a984e20a8f0d9fea02b69a9d0d7ee64743d73c24919f060355c58221659db,ec0ceca541ac704ef78375ce66bae03e2ac7f948e14d0702702b5edd44431ed8,45c038cfcbe4bbaadb423bfb6d69aa166bc36444478eddf04dca330e747645df,66978f4b114af8a2c7bff35caddd57b0e34d4469422e1f5177d84efbc29e9f9c,68deee2f5ed12726ba48c143de86f5bfc6f52e42387b6b118bd6adc15c6398de,a0db86d2a0c9ce98a0e3e45bdcad8786af03bc8c616726b39e73514d242903fa,585814809fdc5504c535b33a7905c9eb1fa3fa49d614de3691714738ae50800c,1302a8f2dc151addb559c3078c9ff96e4d0c0830e741837ed7167acab0f9c665,4142bf0dad7aed829ce45f47b9dc7301c99ce48eddc44eb72bbcd790238e51df,7258b40d72fa503550edd920756c4a1707b73bdefcce5ea94e79077e215c2ac0,14e73a66c7000d5cb2e2814cae0efb467f7a7db3ff586781127d35755ee90dea,b0847a80927caf523b377dd8e6afbfd29d9d247489f5531492b52a1603efaf31,1fcbf67cb147f8550780d80e16f5a9e22e28d5fd73ad04c7eb05f089173f8e6e,4b7ef70b85443c71ed7d39c56825a8d6faacb85a4697cafa4945680a0ad3a9d3,5915da1266757108bc408ceeabd04a99c93f745af0462d1df9ac42384cca7e07,b3acef10f8a2f04d21dc8856c7e138f103dbdc5e6b34e6871b12eb2ec6907a18,8da8f353e95c27476094aa037c06d987f72ab08ea5927af07bdffd24467a5f68,0502db50a5bfbbfac71e959bd4f372a47e83ab6a17a255b0e60b402c122b3fc8,04ee807da45b9a2a8a1cdd0148e1babb794e9e7584c55f370a2f723a16632c2f,79ed422a442f7b3a6b194660ec90560b742b9ba018c2bedd72d6d5a60b332c5a,07fdacdd8c1909fa7042e20ffe2d5f5bfcdbdb59ebf3e11886d02a5f0fbc05ed,361e57a73aec8cacee32496094263948fbd6a9d96e731fafec127eb9fd813f26,c36e6c40c3035c5dc4d8f015363c4591dff5a0e2065aa719c751cdde1a81bcbc,9bac59d959407ea715e81eb23ce43cc88e462c5a25ce525a5dd7b417ad7ea7d9,8dc69bf8158365d866d999fe69b6a7bd869961bafd09863b30d7d6a114bfc5b8,b00f70f3daa8b95576f82c3e59ecdd8558029ee49fe3f726a39d06a1e8fffebe,7ea988c095c4107824bced289ab7d21136e81dddac6a57af836e639135a08e05,966476658b04905c11608c684e267508c9f875f90bb03178b6b4b93ec2f98f13,f2d19b603793cc43563223651b218f8e465f1bfbbc803ac0982e75c8424e12e9,87610850a33a00749627bbc7c6e0aeff65813378733563d05b09333ed445ed54,b980b9789136661518c8864a2caf5f5ef7564408d05391888d25695d6bae1c9b,5fd10e734dd73befd2506c7a4b3d9c453366788763933a32ae7c8a1cec69c000,420858c69ef2cc9b5077f786392fecefbbd76501a8843ca13755a8efbfe6c6d2,6c6dd279e6b135970fe3352b41771341ddb0da7b41b5347b53004970ca2a07d7,247bf14ff84a4c498caeb9aaf249d186db1f84e19363a1a3f118801a57ba09e6,2d568b421ddbe5486bee08dd6d1c584f3311eed85dc714aea72efbc8f26b1b66,274b1391e2d9c3416515ecc8d10061cd1918f9fa9b7e91c7e96934e9cb6bc8a1,25fb97b440fd5a8c2148b8301eadb6419c1350003e4d9f2956a9e782a3e898d1,2d1bf699f5a8f2c5b2817eda0ef641947c6abbe7382fb888194e1d5fdad09566,330b374790e6d56d65f871ceb5a1779bc9859ddc29fd7bfd0d2e2a36936d9e98,3ad6891a7801438b4c695915e33ab8b7601e7f96074425b4dfc81ac76d6d09fa,8936901fa82ce332b699810e836e5320b0a0c5a267be7d875f991607a4eae282,d96bffa8ce37e4148483ff508f2a60b6629938db37b26664be8f4de4e8f9be27,7b4fde34ebe05d8c5a6c7c9bf0caa3971173bbbb62450179db376c1183325c65,4e38a924326b672f732602e8b926997eaf815cb8d9552ca8b2d694d0ceb74621,8d88853e489365132031f1c19f96787bb7955fadf3a33210222260c41b46fee9,73c500ead65ef2286b5140e06deb05ec11c78caa32954452e9ac50f01d4b1574,a8fbe2c40d74d690018dcbac28ce03edac5e5078d86544f04d422cb94b2dcc5b,3070a2343f71b624450db8bbdfa58ad1d4f20d171120fad69163ff68d969b36e,c4b2f358fc2cf8d771f8adc21419ed06fb3c2eafb8aaaf57f9f0036b71b24a79,8b33b6c3935ba61868fe6c3cc82dc09cf8956ca401e4081bb9070caaecd54a00,2440f69ab8f6f3a40c2bb83c8c11fdfbb69b32c6fb92a8059fc53f72c90a0fe7,dcb1b291ea41f4aa8f4632f62cfb20860a55bbcccd5b865bb36a8c0868763493,77fe31a59eddd7b925605d0081ae357da852d2530c820db0eea6418f826270ec,5a48b14d87fe45c7ef72def490db5cba84626720dcba876037241568ce75eb0b,28282b12ce1bf020a380fff1d6276f20533530ecc1fe666744c7761e80bdf7bf,f7965deadf987642563ceb0afe231c0ba0656547a83c3b2c58eb101cfc3b6df2,75f75d426cf3b26ddcf9d81e37ab8ef4e9421820f35abeec77e89fe2f229c713,df4ad30a4d19080ef444e9b86bcb539bfde6b6172254e6348e1f8677a6f8a2ff,72d98f1549d8125c6f98aa65ce936d978b7e46761c7b738ff162098b97ca22b4,07fc641ee6efc88323ef2928b263822f66b8bc844fcf686e8b6b809cc55cb28f,6fe314848cf6b71e3dfb97e81c58e8a5cfdd5c95907beba0d80cc733e338fc4d,edbb054b6a58f073de56cb76b962686aa3285cf0061dc1274c95d7d6091b3b33,600b8c1e159b5a119a8f2856c9da15f0cc407a9440c28a9c930b93319080e11e,dedfa5adaadbb507df7acd1aff8bf15e792556ef5a20f7ed8f2f733b50a2a94c,266161aee785bfce4cd62bb7f373f7f6c5843042aec46851858b15be81f99c01,a27b39e042e6b6d8a409c02ef510e87bb4fcd6d17a583465f1e3bdef8fd5ff66,bedc14158770ae8dbc3cf5e095890c1ae813a71519a1599e12d318c109a03d73,eb6c718e060181374cbaf61401df3fe4795b5ea7d69071ca54db7ec46b5f39d5,1db3779583cd8ddfebc1c33b9554c259e73ce94f352c8b9dc65d91b945f42508,9d178e34adcadf94b206f0d04956160e3e6f1aa621ee7e901f43d5b4993a268d,6852d1772470588b412382efa795fd3839c0b5f0d5c73db60ace8d9f0654f5ac,c16d4d475f5bbf6b0fefe2c737538109175d619e6fbf84fe0ddffaa107f49624,4a2d53b4176333403f606c59b12561716543c596455de1883a1a08648cfe5633,0abf8530e6570ac69c068b160acc807b660331fb7f206267891772e05784f080,ea085e3675b4f1ee23aee81d920d14168f7740c4dae404f081263200c582d5e5,d1f88d59c10f517a00f8379fe0dd5ff60fca94e5e5a077432ffbb6a2b6f85a13,43a471ba0c43af7bc0e53f487585fc7e44a4262bb0eca400038a875430847ce9,6a9a40995191d5bc3bdb32b7ae6af6b2541e55576cfafcd97c9bcd95da4b5340,e28698e18e49e481b8a92b4102cb259584d81edf3f73468c5ca5509d5b5874b9,007b899ee4ad9cf389a4db03ed5ec69e8a2c4648cec328f0c669425089186604,8ae572d8a53847a30f5e9f2ac5d734341c2fac4fd8f574b2b9d9b24817d6e372,f857a1374f3cb2c80661ecadaf5d0e3622e72d77d266aa7ad2801e7db335b969,2e9eba7803798b99de5e59a3cb207ca53180326d7dddc4f80460ef1e3bca9f22,6d2d8fdc6bebd8bb5aebf5f4008856c427fc9b077cedef06d7cabdbb35230090,e88f5a8743a1e2cc24c07bf93d2566293ec90dc3016d6d561ac359f200afcd7c,73d8e522befb3985d72f69876a3bd5bfd656ef442af8db63f24e3802fbf7453e,09dc75bc71fad01c85dc0c7a2dd4594ae3883bf5ef8155cd2856638bf467842b,69f06e1c5773eddc50d89714a081fd26d6c271355f609d171d90f09fdb6ad311,1e8fcdd32d547ec02338d40cefd09b02b28a4ae8f8972a4fafa158107f6a890c,79dffd0030e1dd9af958fe233cbdf1959ff3d749d863da8b92bf6d2edcd114ad,e089dab3bb2519de80cf8666f589e183f4ddf80f8778282694632499c093aaad,2f342899b6e2505b72a25f7f507298b4cd5b0400f9d034d45a95fa86d127b171,5b6767fdff5a39d92eeb8415eec49f48b958e9c38151ce4356d09e43f8b397e9,a70b2878df44bd3952d9da43fea40bb475d2a87d21b8d5750c2153163af39c0a,4526593e49e532e8e498a8b14c3ca15c1749dfac9cf39a0b44b4c18ddc319440,118502524e8a02d7c7ee2cb984b598f27afb3b7b78b92326b2fbfc3c53f48464,8379f7dc2c391ac38ea1d34ddff36faf5602bf128b6d93a3a8a6485b1d8dc23f,0c17a500636a9a94b405b8e9f2fcd45b058a4a9070c156332e429daf0379572b,7e302ffccaacae442283c86d2afdf7c240d19dc42c41440419c8b78efdfc9dec,a19467bab0f5a753e4daadd080e64f13c79bdabd7e403575f9f3d3b7b6ca66fa,4162c48bb1ba5e8dd38518f9d1007300e46348e01a97184e253a3250ed0f9ffb,c1e36882f77da60283f64d2590e3389497e6583fcdb61c21d352d522506a8882,64a4716a19fd7b8009a5e6d5924a74c65ef8e5f85c64345c7b89a4e6b6135e5b,8136dbac064d798c9e30bf31e62d74f99ffb37d3bd9f3d6d3c6544669ca3cded,790f8dfbe56b27d1b82b00bf96394caa4ef54263229bf3ee5b2aa891ec8b5676,7d060a4e92f2c1f4cd2546f5409cae2c946b70556b249455dc19fb93e8dcdb9d,8e62713fc4972433c63b1c0c19cc1d291471381b11183b40e450263956a4d1f8,46255b9d4d2059337f3949e4ada5c2d16ab8385f66967291e204175aa2120986,49023745977f47f7439c701985905ad2be42b2a89c070df73ea8dc7f9c5ae627,75e6c4c28e4dedef545bbe58ea2b497dffc90ed7fe6d7261287e90cd85a3fcfa,fee9501fc25e4c85c0d205473426d6e6f4e02eca002eab6513c6467885486fab,77f39047575527668b8c86defb3a15328d6f6289ffb1dce1b01fd1c9f193f739,59e80ebb2f5424610ffc9070e39c64805a1d6a44f52993eaf0b427b3a8494b99,bfddb6b1867c2d0cf3ed074ce94fadc786226f28f98f9f1d7ac5bd6a1e040f9b,4c6aae8655346883ce266665e0c61461636a128c8804d6aca78f9c8a35356fbe,bf4462bc1f0c88cd99e30a20c6b6eeae09f7a17a737314192aac8b40056e90e1,f448286e1d5a998965efeed87d8feffd6ecc3fc0a9a8658730da10715324f89c,7619cfb410a5bb992e9da50699a6cdd82a0279e27176ebf4c1c21c12dea2459a,48395b0355072b681c77cf4684dfa228f4009c4985d013908539e34d306bb4d5,6fa9d11c314c5430db8ac179f7e1517d754781522b94f2da800a3d9db8a191be,79462eb8641df40ec28d7ae89ec7f1d5548b7b0316fb03da682726b35bfdcf7d,dbb07ef67043d85768c04c5c68e98a88685bd2785a3b20ba574403397fdcd33d,5be705a5717f0ad7688077b80765f8eac1be081d07105c7ab342db817461213e,0314be8e3cfcc6f00f5a0b3ce074f844f8126692bc9db1951df722379ca37622,b225bede76fe85a80c30ec258bcff80f9226fc3b3c07e1c75aa43e38968c85b0,ecceb05c114658703ee5bda417b23ecedffc67129d59b52a4fb60b9aad8624ee,56d6e51283d0da2e6aa6d8a166178aa5bf97c0d6ad8b6514a2b1a8701a890a54,274754307e41b8a6333f8f2d9bc679640fdeaa6954c94d91b022185d2e0f64ca,1c303f25b84f7f63fba0c97dd1ebf1148c1968658dca21b27df47ae2b86c4c2b,04638bdc28da59d45407c756701e4285ad0487858e92b2e45ccf99ffafaaf73f,ed4d011b44c9801335df5d3b5550977b11a1e78ec7ad1ebb477ad2eb707ddefe,333a3f0c920bf95d95cfaaa069a17ccfb0998ebc5697764788642ecb69c1746c,c6db8bfb6ee98557377bf8886a12c5784f613a53db3c09c161938039706941f4,25c3e1dcd0d27d63978adcefe9f862d9be8e20ed44bd80c359ffe99bc72fb095,035d2f21a40a3c5f97be226cb26e792130ba0d56dfe472b5cd9e1fd0b5d557f8,16411af320b57bac481c370cab692121e93edc942c2a6851c64737951a9594a7,43cc758c0134246a8a9e7db3f08a63709f0db02cb8431c21319e832845e3bdfe,3d9149f5c36eee7b661628d69b8d3e323b4fed8f544f8ca7b1bb575de94d465d,85ce96c84ff64f03e0c8b72dc9d6f2a4679c034836368345e22ffd0a170ad62f,2691d4f78bedcd4a6f6fa39c45a0109e4a11ce7603c656b53cca835d3863e06a,cbd21277046ea7f4572d6e8149077713575239ccf8a98c56b162b633a6490cf2,30335f29996cecf0747bf4e2b44f8ee3959e4cc277317d48e80f7726a85d87ef,afbde53c640182877df7eb5955d42669c5aa54e65ba304d6bdfb1be002cda374,d053a7b55ccdbf594d95fa053a1dd93d41a72e9c29b15b68e571e482d33277a4,3ae128f7b953405c2cd293c2e62a9c99914a7ed69d84c927c518bb9fc21b74d5,ab43d526f1dc6a32395c49806c8bc73bae918a5f3cb5fc1d0f99cc32e8d45867,7c5151e7116ff12d2325c9b2e98256e43802f6c4a15584be250aecbf143f50e3,5ee1a8ac394732056708b628216815b744eb5fefcff8426eb48d682ae7fe0bdb,e1f06ae08a52e1e4e7544d0ee343d33ba6ea5a71d7ce00c56a3f14058a199d78,771032904be77e19c389ae615a39e78aed70ae8e233edd8f3d5aafee1e4691df,cf0dfd60ef8f949ec0168439c7022546c5f00634e7fdd668900bcad1e2e81756,84bb868f3ec690f914e3a8cde683b55653e554bf5ae6516304ca95e3e0be0ce9,2e6bb4a91f7df30a0fe05ad3d02ea64b6a571a089ecd6e1a2caf900e5175949e,566cf7e6d6419fff93e8f18bd34b7fdb2db9b2d4191434e37a97e3a5cd00b186,912729b57611e1422879af83c5d11bb416c0b98fa83dc392bae590d7e90d5d12,54a7f54922ffc66260dcf30076c4cc7fa254cc9b830b2e37349d7b40f0d67231,d2cdfe1068809e2e519bec2fb30eff036085ed0fd5a174157f4a531be489a9c4,00c19bdcfabceeef4ab4c71251f41d59173c43b87ef0e968e7aa5bcf77fc3aa3,00a1b917cf86485c9e86030ec1afe9b7e28a4345f46471b92b4e0d08b698bae5,17b23ef7d38a3a0334ef68087a585ac48956984f6e0321c62d30011368954485,1fb0c2d4d015596c3439f405da4a7a2497ba94cdecb535e70cfda08c6a764f4f,993c1131175eb1f3b8b5d1d72ea5addac559a20b5154838ee86aa9b71e06652e,2ede50271add1f8aa5b91bcd222d83eecea7f4a524c9e62ec01cd889a55aad45,20ada1b4fe496096230fec2c00bff8a037db5079c6f45955317df9c2ede5f85b,b37b8821965b243026b83a59ea4e4e2246545fbcc1100d8effeca612a3b6bb4a,0760c516052f81058efd89aa11573c744ffd4f5685e11e9e200bd0ba0228ee34,fc3cc3b0dc5592a8c0a2e41d3ba995c0f65efbf2797c2b7b2403bd2c552acd64,0475e984bf932adabb1fe98d943ad23fd56e4bd53c2e7bbb12ea69b7996430be,d60ec04ea36dab7f685a2dc50c2f76ede60a6b594b15317d7e32d2438eef36ef,13dbd661bb4f0bc0854b761b94470f2c8d3ea069c2b2c53d07f40da9668515a2,875472cab949b679152079e79cd06ad376c30f4c298b2f7e191f5f7ef3aa1ccf,bfc95afeb7c01ea29780954bc62c9830af90e4a8882b64d24e65d7c30e075e48,4d100b664eee670a68d88d07bab4ca55dad28da862b2af631b29d5031920e10d,1275cde34b3de398a87fccd8bfa2261f826983ea774a0a413843f9de07beac70,b3cc121e4d7f7bc008ecd7d79b2f08d32c34c036c64678ae7cc43112b4297210,46a13985c51e2cae515be2a8f1eb0b42fea64cf366057a611cee74aaa7c648e3,df40e86985f66578e1ca70bea1c1a58b943c3b37bae49f639a547e759239513a,448cb5c2de497679de2161a93b5e0983a6030a33a59eee2b3171c56a93bc91d6,e6b371651baf1c9773ee1e240d51deda5f237e8da74048af9f3379f70f1c8e2f,d24ec5de76732220049843cf0ce87053bdfb223d8e45cdbf83a8d801ed486850,4131794225ae70468171aefddf3e5875a8ab294263ae4694f93a68e8314b0b5c,f5958acf10e9d5f12d9b0349bda1e652273977c36e1ad59c383bbfb512abcac9,19dea7117e47e557bca2019c09173879bde7a9703e7577ec5bf2270fec6aca6e,3cc640e6348efd77de2a22367f609c2f68551d4cb917f27c32c2dbc422827dfa,61d21b2cb4586c4ce3178f6ea51d905d9d00d79d85ccea52e5f4223811e12a44,44e06b75ecca6b3a9f91813c716c0f61f5990f498c5ed17a41ddfcdc0db48368,8da1c8bd377bb3892265639b26a72b7780393a8a43f6471a5eb1abd1ec88ef3d,f5e58a733b69af1ef5fe8a9a580b3790a792e44ad32a29e98d9f7f142862b298,d1e1dc03f1d6d75da644b8a14f8e7d3906b47d50968273f0707142bdd810de1c,d1869756e1200628a18e401e9510a9f78604ce91faf67c2e759a7b28c6eb882f,60dca01fbd010aef036b6ba742978ebacd1c49ba999e06f1b7985c5c0e96055f,c731ad94fa972ca5a7bc709d2cccf187ba47bc6299dcf3301b62990064e04fa2,d1cffa5c6c044dd22a8a0990545ac7bf5edf04b38820230af853949612ef7075,cc351a659c1718306c90276e7a58697709b69d2dd06af2dec6891ac77ac62a3c,82738ee011e454410ea714fbeccad19fe15dba4e62b7d1b85e65e7f8ed2e6286,2d2f067acea2451a17ad0f2beeefcc768dbf52a01f437a5066f49fac1d3eb312,fabad1b8e1b3a3e11810c408f748a7e70449f4274aaaaaf69b11ffeaff1504e7,4ab824b1479ec872488f501374e22488e0b8b4612ea16cca5208783016af9858,1b5dcad92079e86412309d5f85b01631a7aa3d7eda261080531cdeb89c96bcdb,a1809967d96449a3535d19e509fc3ae58b714805141f6487aaf06a7b00f47dc2,081fde0ec6f26348e2626daf44d932bc31d3ac3cc6546061484f9f68b0499422,c3d10191066b94c7a89f91f75fc9aea86e17ac5894fecb8c0698957771d196da,b5474f0aebab60ca12d4f8097a499f3fc063ad6146eb6db4191bc05ce82312ed,147a78e0d0d68aa642b97ba83e7b45ff5b367341f0a0a4f551f593f3ed8855db,47b2514697f7793be6f9ed37ff3cee74a4d1a3012d468c6069c50b6681ec07d1,d59ee71f32fc530efbc54952356a1e564e7fb077b9323bc032f6cacd7ed47917,f0c7fa099c97483728d04f577f5b1462443136e52b9434b5875e00984eab9fc6,a8d103d654099371f1a97f34cfe997683000cf2e7a525376d6af1ac2b75d71ac,cc5f68d406097c09e8d86b667213f52b77d3e0e543c86e3dbede40e8c1f7490d,b495595a4d94415ad9e3c6fbcb8589ddbaffa7d0c9077fcfe261efecc76bc957,f4359ca550fc3fd61f08b20e7714d37f1ea257a2d548fcc6a40cbf1bbc4bfc2b`\n"}]}}],"fee":{"gas_wanted":"20000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"IsvCS3TVZpWLS3tsDO53QFxy4PUcGN7F7RPm+2PxKVJDT/VtdCDjeZbxSys3mmX/RqEfGSBD96OOXTPSpGY/ug=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"entry","path":"gno.land/r/leon/gc/entry","files":[{"name":"entry.gno","body":"package entry\n\nimport \"gno.land/r/leon/v1/raffle\"\n\nfunc init() {\n\traffle.RegisterCode(testCode)\n}\n\nconst testCode = \"qd0bJ6HTSV\"\n"}]},"deposit":""}],"fee":{"gas_wanted":"8000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"yu6thVF6r60jqlZWpDCfEdwrDsEfuJm9Z8NVld0JDO0biv4mgDCNxuZpyVop0drvqG2o2EvW0y7kiKA8NSoURg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/v1/raffle","func":"RegisterUsername","args":["leohhhn"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"QT88BI1uzmRQXsQmelM843vBJnqbEFR8VtvZOQIEULYdanONIjNkHA4+TTOl5oFNGN2RZKHiIbe/dzlQdbt98Q=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1t8m7k6cud8fhexs3ttslh3l3uul8upk9j7y2c3","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"oEd80BkOP0MalLRk+e+E54iLRPt/rAsKv/uCeroQVLEk/MiAHWW64fkJVLjkWLQ2/oF0YXR1GR8WxSHKdTxa4Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1t8m7k6cud8fhexs3ttslh3l3uul8upk9j7y2c3","package":{"name":"raffle","path":"gno.land/r/ajnavarro/raffle","files":[{"name":"package.gno","body":"package hello\n\nimport \"gno.land/r/leon/v1/raffle\"\n\nfunc Render(path string) string {\n\traffle.RegisterCode(\"yt2164GGi1\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnfXU2lgviH+qJrG7JVe7CkTJlQohTS5wpX601bRF6SR"},"signature":"YNvEXm+wMJc2w7VVGpCDt7mDyDqA3GPCPgfXSzZaYQpDtpMOCo6bzxOnSQ31LMgJrksD/BL1KbRl/EM3aYhgcw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1t8m7k6cud8fhexs3ttslh3l3uul8upk9j7y2c3","package":{"name":"raffle","path":"gno.land/r/ajnavarro/raffle","files":[{"name":"package.gno","body":"package hello\n\nimport \"gno.land/r/leon/v1/raffle\"\n\nfunc Render(path string) string {\n\traffle.RegisterCode(\"yt2164GGi1\")\n\n\treturn \"done\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnfXU2lgviH+qJrG7JVe7CkTJlQohTS5wpX601bRF6SR"},"signature":"XqZDO+dYvhxhrbQmT+ZraYcJVzx0eGDp+0CIDLkJs1o8pY90snC0xSXIMzTA4EShA51GGn3jGddbZPXPae6juQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1t8m7k6cud8fhexs3ttslh3l3uul8upk9j7y2c3","package":{"name":"raffle","path":"gno.land/r/ajnavarro/raffle","files":[{"name":"package.gno","body":"package hello\n\nimport \"gno.land/r/leon/v1/raffle\"\n\nfunc init() {\n\traffle.RegisterCode(\"yt2164GGi1\")\n}\n\nfunc Render(path string) string {\n\treturn \"ajnavarro raffle\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnfXU2lgviH+qJrG7JVe7CkTJlQohTS5wpX601bRF6SR"},"signature":"XEKgdHCRYBYEqgWaDzBjPZzE1gUhKcArfnJlGv8bDb95wVAWR/al0IeWwyFQYNYDxQq+Jb6oKs1uUWoP7eOqpw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1t8m7k6cud8fhexs3ttslh3l3uul8upk9j7y2c3","package":{"name":"ajraffle","path":"gno.land/r/gc24/ajnavarro/ajraffle","files":[{"name":"package.gno","body":"package ajraffle\n\nimport \"gno.land/r/leon/v1/raffle\"\n\nfunc init() {\n\traffle.RegisterCode(\"yt2164GGi1\")\n}\n\nfunc Render(path string) string {\n\treturn \"ajnavarro raffle\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnfXU2lgviH+qJrG7JVe7CkTJlQohTS5wpX601bRF6SR"},"signature":"wLlmLWalkhLGkGAdEsrcpQkeTCkA9ciMjFf2rv8VMb0cRqGHNNRee5jnLLf9rjalb6PGK0dyRI0VTpKnkyK5BA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","package":{"name":"main","path":"gno.land/r/michelle/main","files":[{"name":"main.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\tpVals \"gno.land/p/sys/validators\"\n\tgovdao \"gno.land/r/gov/dao\"\n\t\"gno.land/r/sys/validators\"\n)\n\nfunc main() {\n\tchangesFn := func() []pVals.Validator {\n\t\treturn []pVals.Validator{\n\t\t\t{\n\t\t\t\tAddress: std.Address(\"g12345678\"),\n\t\t\t\tPubKey: \"pubkey\",\n\t\t\t\tVotingPower: 10, // add a new validator\n\t\t\t},\n\t\t\t{\n\t\t\t\tAddress: std.Address(\"g000000000\"),\n\t\t\t\tPubKey: \"pubkey\",\n\t\t\t\tVotingPower: 10, // add a new validator\n\t\t\t},\n\t\t\t{\n\t\t\t\tAddress: std.Address(\"g000000000\"),\n\t\t\t\tPubKey: \"pubkey\",\n\t\t\t\tVotingPower: 0, // remove an existing validator\n\t\t\t},\n\t\t}\n\t}\n\n\texecutor := validators.NewPropExecutor(changesFn)\n\tcomment := \"manual valset changes proposal example\"\n\tgovdao.Propose(comment, executor)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"LsUiBJo8gFjvgI35rY/X1IKytDD9ko6/Ixn3Ti7uGuE4eSxj64F4cte7zfZoLG5VStCu5FaTgS01yZryl1ZLog=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1t8m7k6cud8fhexs3ttslh3l3uul8upk9j7y2c3","package":{"name":"ajraffleregister","path":"gno.land/r/gc24/ajnavarro/ajraffleregister","files":[{"name":"package.gno","body":"package ajraffleregister\n\nimport \"gno.land/r/leon/v1/raffle\"\n\nfunc init() {\n\traffle.RegisterUsername(\"ajnavarro\")\n}\n\nfunc Render(path string) string {\n\treturn \"ajnavarro raffle\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnfXU2lgviH+qJrG7JVe7CkTJlQohTS5wpX601bRF6SR"},"signature":"naHBoGr811yC/rnCcArB1C2dnA7TQEzof+J9Q5hCy7RepH+gPdyC/jMcdNuWA9Pn1pTAikY996g2MxtrNtTtWQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1t8m7k6cud8fhexs3ttslh3l3uul8upk9j7y2c3","package":{"name":"ajraffleregistertwo","path":"gno.land/r/gc24/ajnavarro/ajraffleregistertwo","files":[{"name":"package.gno","body":"package ajraffleregistertwo\n\nimport \"gno.land/r/leon/v1/raffle\"\n\nfunc init() {\n\traffle.RegisterUsername(\"ajnavarro2\")\n}\n\nfunc Render(path string) string {\n\treturn \"ajnavarro raffle\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnfXU2lgviH+qJrG7JVe7CkTJlQohTS5wpX601bRF6SR"},"signature":"T6eKLblOKx4z9ARFyh0VNYYYK7riYpGp8tC2U0fwg3VtVDLMwNmXNhQ/fkFTiWxq5E4az509KBbuCa27tbIvGQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1t8m7k6cud8fhexs3ttslh3l3uul8upk9j7y2c3","package":{"name":"ajraffletest","path":"gno.land/r/gc24/ajnavarro/ajraffletest","files":[{"name":"package.gno","body":"package ajraffletest\n\nimport \"gno.land/r/leon/v1/raffle\"\n\nfunc init() {\n\traffle.Register(\"ajnavarro\")\n}\n\nfunc Render(path string) string {\n\treturn \"ajnavarro raffle\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnfXU2lgviH+qJrG7JVe7CkTJlQohTS5wpX601bRF6SR"},"signature":"JbQA4hHlIxYze1WWKJfGX+bls2OJ41fXClKDgCovw6ZwmcEhNY+Vij9/jJ+LfDXN6m/RKB/fHUy1hY4HsCTNuw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1t8m7k6cud8fhexs3ttslh3l3uul8upk9j7y2c3","package":{"name":"ajraffletest","path":"gno.land/r/gc24/ajnavarro/ajraffletest","files":[{"name":"package.gno","body":"package ajraffletest\n\nimport \"gno.land/r/leon/v1/raffle\"\n\nfunc init() {\n\traffle.RegisterCode(\"ajnavarro\")\n}\n\nfunc Render(path string) string {\n\treturn \"ajnavarro raffle\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnfXU2lgviH+qJrG7JVe7CkTJlQohTS5wpX601bRF6SR"},"signature":"EKZeRa9Ezlil0ks+YJufhJpRC1iaMDQ7DOy1q6yBWoB2kchg+XXs+9XyIFF7z8EetL2gQVyvRs3CHCHg5TnSbg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ckanw7sgnyfyqygunjjk9hp7mmlqvkxhsjdxya","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"6J6yQFmVc5QXV4hVhgEElxw6vb7oGRYkoUh/x9LMPm9opa9hRsxpN5hiZlt9Jce3LqAQu9GS9294olZwCodHdw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"raffle","path":"gno.land/r/leon/v2/raffle","files":[{"name":"gno.mod","body":"module gno.land/r/leon/v2/raffle\n\nrequire (\n\tgno.land/p/demo/ownable v0.0.0-latest\n\tgno.land/p/demo/testutils v0.0.0-latest\n\tgno.land/p/demo/ufmt v0.0.0-latest\n)\n"},{"name":"raffle.gno","body":"package raffle\n\nimport (\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"math/rand\"\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/ownable\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\n// EntryData is the main struct that contains all data on raffle entries\ntype EntryData struct {\n\ttxorigin std.Address\n\tcaller std.Realm\n\traffleCode string\n\tcodeHash string\n\tghUsername string\n}\n\n// Top-level variables are automatically persisted to network storage\nvar (\n\to *ownable.Ownable // admin of the raffle realm\n\tpartialEntries []*EntryData // keeps registered partialEntries\n\tcompleteEntries []*EntryData // keeps complete registrations: valid code + gh username\n\tcodeHashes []string // valid code hashes\n\tregisteredHashes map[string]struct{} // tracks if a code has been registered before\n\twinner1, winner2 *EntryData // storing raffle winners\n\tnumReg int\n\trandSource *rand.Rand\n)\n\n// Nothing to see here, just some constants, move on :)\nconst (\n\tcodeLength = 10\n\tamtOfCodes = 300\n)\n\n// Hello! This is where you register your raffle code!\n// Calling RegisterCode is the first step for entering the raffle.\n// It allows you to register a specific raffle code and connect your address to it.\n// RegisterCode only be called via other code; you should figure out a way to do it.\nfunc RegisterCode(code string) string {\n\tif code == \"\" \u0026\u0026 len(code) != codeLength {\n\t\tpanic(\"invalid code: \" + code)\n\t}\n\n\tcaller := std.PrevRealm() // save realm used to call\n\torigin := std.GetOrigCaller() // save deployer of realm\n\n\t// Deny non-code entries\n\tif caller.IsUser() {\n\t\tpanic(\"denied; can only be called from within code\")\n\t}\n\n\t// Get sha256 of code\n\thash := sha256.Sum256([]byte(code))\n\thashString := hex.EncodeToString(hash[:])\n\n\t// Check if code has already been registered\n\tif _, ok := registeredHashes[hashString]; ok {\n\t\tpanic(\"code already registered: \" + code)\n\t}\n\n\t// Check if the gopher has already registered another raffle code\n\tif originExists(origin) {\n\t\tpanic(\"you cannot register more than one code!\")\n\t}\n\n\t// Try to find the hash in the official hash list\n\tvar found bool\n\tfor _, ch := range codeHashes {\n\t\tif ch == hashString {\n\t\t\tfound = true\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif !found {\n\t\tpanic(\"specified code is not a valid raffle code: \" + code)\n\t}\n\n\tentry := \u0026EntryData{\n\t\ttxorigin: origin,\n\t\tcaller: caller,\n\t\traffleCode: code,\n\t\tcodeHash: hashString,\n\t\tghUsername: \"\",\n\t}\n\n\t// Save to hash tracker\n\tregisteredHashes[hashString] = struct{}{}\n\n\t// Save raffle entry\n\tpartialEntries = append(partialEntries, entry)\n\n\treturn ufmt.Sprintf(\"Successfully registered raffle code!\\n%s\\nRegister your username to complete your raffle entry.\", entry.String())\n}\n\n// Somewhat similar to Go, init() executes upon deployment of your code.\n// Hint: maybe you can use init() in your code to execute RegisterCode() upon deployment via play.gno.land?\nfunc init() {\n\t// Set admin address\n\to = ownable.NewWithAddress(\"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5\")\n\n\tpartialEntries = make([]*EntryData, 0)\n\tcompleteEntries = make([]*EntryData, 0)\n\tregisteredHashes = make(map[string]struct{})\n\tcodeHashes = make([]string, 300)\n}\n\n// RegisterUsername registers a GitHub username to an already existing entry\n// Hint: you can call this function just like you did with RegisterCode(), or via gno.studio/connect :)\n// If you use Connect, make sure you're on the Portal Loop network, and you've navigated to the correct path!\nfunc RegisterUsername(username string) string {\n\tif username == \"\" {\n\t\tpanic(\"invalid username: \" + username)\n\t}\n\n\torigin := std.GetOrigCaller()\n\n\tfor _, entry := range partialEntries {\n\t\tif entry.txorigin == origin { // this will check if you're using the same address as when registering the raffle code ;)\n\t\t\tif entry.ghUsername != \"\" {\n\t\t\t\tpanic(\"you cannot register your username twice!\")\n\t\t\t}\n\n\t\t\tentry.ghUsername = username\n\t\t\tcompleteEntries = append(completeEntries, entry)\n\t\t\tnumReg += 1\n\t\t\treturn ufmt.Sprintf(\"successfully registered %s for address %s\", username, entry.txorigin)\n\t\t}\n\t}\n\n\tpanic(\"could not find entry for caller address; did you register your raffle code yet?\")\n}\n\n// Admin stuff\n\nfunc PickWinner1() string {\n\to.AssertCallerIsOwner()\n\twinner1 = pickWinner()\n\n\treturn winner1.ghUsername\n}\n\nfunc PickWinner2() string {\n\to.AssertCallerIsOwner()\n\twinner2 = pickWinner()\n\n\treturn winner2.ghUsername\n}\n\nfunc UploadCodeHashes(delimCodes string) {\n\to.AssertCallerIsOwner()\n\n\ttokens := strings.Split(delimCodes, \",\")\n\n\tif len(tokens) != amtOfCodes {\n\t\tpanic(ufmt.Sprintf(\"invalid amount of codes; wanted %d got %d\", amtOfCodes, len(tokens)))\n\t}\n\n\tcopy(codeHashes, tokens)\n}\n\nfunc UploadRandomness(x, y uint64) {\n\to.AssertCallerIsOwner()\n\n\trandSource = rand.New(rand.NewPCG(x, y))\n}\n\n// Rendering\n\nfunc Render(_ string) string {\n\toutput := \"# Raffle - GopherCon US 2024\\n\\n\"\n\n\toutput += renderStats()\n\toutput += RenderGuide()\n\n\treturn output\n}\n\nfunc renderStats() string {\n\toutput := \"\"\n\n\toutput += \"### Raffle Stats\\n\\n\"\n\n\toutput += `\u003cdiv class=\"columns-3\"\u003e`\n\n\toutput += `\u003cdiv class=\"column\"\u003e` // Latest codes\n\toutput += renderLatestCodesWidget(2)\n\toutput += `\u003c/div\u003e` // close Latest codes\n\n\toutput += `\u003cdiv class=\"column\"\u003e` // Latest usernames\n\toutput += renderLatestUsernamesWidget(2)\n\toutput += `\u003c/div\u003e` // close Latest usernames\n\n\toutput += `\u003cdiv class=\"column\"\u003e` // Winners\n\toutput += renderWinners()\n\toutput += `\u003c/div\u003e` // close Winners\n\n\toutput += `\u003c/div\u003e` // close columns-3\n\n\toutput += \"\\n\\n\"\n\toutput += \"---\" // close section\n\n\toutput += \"\\n\"\n\n\treturn output\n}\n\nfunc renderWinners() string {\n\toutput := \"\\n\\n#### Winners\\n\\n\"\n\n\tif winner1 == nil {\n\t\toutput += ufmt.Sprintf(\"- Winner 1: Not chosen yet!\\n\\n\")\n\t} else {\n\t\toutput += ufmt.Sprintf(\"- Winner 1: @%s!\\n\\n\", winner1.ghUsername)\n\t}\n\n\tif winner2 == nil {\n\t\toutput += ufmt.Sprintf(\"- Winner 2: Not chosen yet!\\n\\n\")\n\t} else {\n\t\toutput += ufmt.Sprintf(\"- Winner 2: @%s!\\n\\n\", winner2.ghUsername)\n\t}\n\n\tchanceOfWinning := 0\n\tif numReg \u003e 0 {\n\t\tchanceOfWinning = 100 / numReg\n\t\toutput += ufmt.Sprintf(\"- Current chance to win a prize: %d%% \", chanceOfWinning)\n\t}\n\n\treturn output\n}\n\nfunc renderLatestCodesWidget(amt int) string {\n\toutput := \"\\n\\n#### Latest codes\\n\\n\"\n\tpeNum := len(partialEntries)\n\n\tif peNum == 0 {\n\t\toutput += \"No codes registered yet.\"\n\t\treturn output\n\t}\n\n\tif peNum \u003c amt {\n\t\tamt = peNum\n\t}\n\n\tfor i := peNum - 1; i \u003e= peNum-amt; i-- {\n\t\toutput += ufmt.Sprintf(\"- `%s`\\n\\n\", partialEntries[i].raffleCode)\n\t}\n\n\treturn output\n}\n\nfunc renderLatestUsernamesWidget(amt int) string {\n\toutput := \"\\n\\n#### Latest usernames\\n\\n\"\n\tceNum := len(completeEntries)\n\n\tif ceNum == 0 {\n\t\toutput += \"No usernames registered yet.\"\n\t\treturn output\n\t}\n\n\tif ceNum \u003c amt {\n\t\tamt = ceNum\n\t}\n\n\tfor i := ceNum - 1; i \u003e= ceNum-amt; i-- {\n\t\toutput += ufmt.Sprintf(\"- `%s`\\n\\n\", completeEntries[i].ghUsername)\n\t}\n\n\treturn output\n}\n\n// Helpers\n\nfunc (entry *EntryData) String() string {\n\treturn ufmt.Sprintf(\"Address: %s\\nRealm Path: %s\\nCode: %s\\nHash: %s\\nGitHub username: %s\\n\",\n\t\tentry.txorigin.String(),\n\t\tentry.caller.PkgPath(),\n\t\tentry.raffleCode,\n\t\tentry.codeHash,\n\t\tentry.ghUsername,\n\t)\n}\n\nfunc pickWinner() *EntryData {\n\tif len(completeEntries) == 0 {\n\t\tpanic(\"No complete entries yet!\")\n\t}\n\tif randSource == nil {\n\t\tpanic(\"No randomness source yet!\")\n\t}\n\n\tr := rand.New(randSource)\n\twinnerIndex := r.IntN(len(completeEntries))\n\twinner := completeEntries[winnerIndex]\n\n\t// remove winner from entry list\n\tcompleteEntries = append(completeEntries[:winnerIndex], completeEntries[winnerIndex+1:]...)\n\n\treturn winner\n}\n\nfunc CheckHashUpload() int {\n\treturn len(codeHashes)\n}\n\nfunc originExists(origin std.Address) bool {\n\tfor _, e := range partialEntries {\n\t\tif e.txorigin == origin {\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n"},{"name":"raffle_guide.gno","body":"package raffle\n\nimport (\n\t\"std\"\n\t\"strings\"\n)\n\nvar (\n\traffleRealmPath = std.CurrentRealm().PkgPath() // will give you portal loop path\n)\n\nfunc RenderGuide() string {\n\n\ttext := `# Entering the raffle\n\nWelcome, gopher!\n\nYou've decided to enter the gno.land raffle to get a chance to win a valuable prize.\nWe congratulate you on your curiosity and courage!\n\nYou will need your personal computer and a bit of time to enter the raffle. Find \na quiet corner and read the rest of this README file.\nAlso, make sure you've gotten your unique raffle entry code at the gno.land booth -\nyou will not be able to proceed without it.\n\n## Why enter the raffle?\n\nApart from getting a chance to win awesome prizes, you will be able to learn\na couple of basic concepts on how to use Gno, as well as some supporting Gno tools -\nthe [Gno Playground](https://play.gno.land), which will help you deploy your own \nGno code, and [Connect](https://gno.studio/connect), which will\nallow you to easily call smart contracts (called \"!realms\"! in Gno) that live on\nthe gno.land blockchain.\n\nWe've created this raffle to reward gophers that are curious and eager to learn\nabout new tech- if you can relate, you're in the right place!\n\nAfter completing a series of steps, you'll have a chance at winning one of\nthe raffle prizes - we're giving away two Keychron K2 Pro mechanical keyboards.\n\n## How do I enter?\n\nTo enter the raffle, you will need to go into dev mode. You need to take a look \nat some Gno code, learn how to interact with the gno.land blockchain, and submit\nyour raffle entry to the Raffle realm - which you are viewing right now!\nThis text, as well as the \"Stats\" at the top of the page are actual live state of\nthe Raffle realm.\n\nWe want you to try to figure things out on your own; you should prove your curiosity\nand ability to learn about new technology in a short period of time. If, however, \nyou do run into issues - the engineers at the gno.land booth will be able to help \nyou.\n\n## Let's get started!\n\nEntering the raffle involves two main parts:\n1. Registering your raffle code, which you got from the gno.land booth\n2. Registering your GitHub username\n\nBoth of these involve interacting with the Raffle realm. \nYou're currently reading the rendered state of the realm;\nand you can view its source code by clicking on the [[source]](https://REALMPATH/)\nbutton on the top right of the page.\n\n## 1. Making a gno.land keypair\n\nA keypair is what allows you to interact with the gno.land blockchain. For this, you\ncan use the Adena wallet- it will generate a keypair for you. You will then be able\nuse this keypair to deploy your own Gno code to the blockchain and call functions on \nexisting Gno code, such as this Raffle realm.\n\nVisit the official [Adena website](https://adena.app) to install it. \n\nAfter installing the Adena wallet as an extension, a page will pop up.\nTo create a keypair, follow the steps below. \n\nFirst, select \"Advanced options\" \u003e \"Create new wallet\". Then, complete a \nquestionnaire. You're free to look up the concepts Adena is telling you about\nduring this process (such as \"seed phrase\").\n\nAfter saving your seed phrase and entering a password to protect your keypair,\nyou should be able to see your account generated in the Adena extension.\nWhat you need to proceed to the next step is the address of your account,\nwhich is further derived from your keypair. You'll be able to find it at\nthe top of the Adena extension.\n\nYou are ready to move onto the next step!\n\n## 2. Get GNOTs\n\nWhat are \"!GNOTs\"!? - you might ask. \n\nBlockchains are transactional systems; every interaction with a blockchain is \ndone via a transactional message - ensuring the state of the network is consistent at each point \nin time. On top of this, to prevent DDoS attacks, all blockchains implement \na gas system; for every state change on the network (a transaction), a user must \npay with the network's native currency.\n\nIn the case of gno.land, this is \"!GNOT\"!. To get some testnet \"!GNOT\"!, \nvisit the [gno.land Faucet Hub](https://faucet.gno.land). \n\nSelect \"Gno Portal Loop\", enter your Adena address (copy it from the top of the Adena\nwallet! it starts with \"!g1...\"!), select \"!10 GNOT\"!, complete the captcha, and click\n\"Request drip\". Soon, you should see 10 \"!GNOT\"! available in your Adena wallet.\n\n## 3. Inspecting Gno source code\n\nEach Gno realm lives on a specific package path. In the case of the Raffle realm,\nthis path is \"!REALMPATH\"!. All files that comprise the realm can be found by\nclicking the [source] button on the top right corner. There, you will find a \"!raffle.gno\"!\nfile. This is the main code of the Raffle realm.\n\nTo enter the raffle, you must inspect the Gno code found in this file.\n\nGo do it now! You should be able to figure out the next step yourself.\n\n...\n\n...\n\n...\n\nWelcome back!\n\nBy reading some code, you found out that you need to write and deploy some Gno code.\n\n## 4. Writing Gno code in the Gno Playground\n\nThe next step to entering the raffle is writing a bit of Gno code and deploying\nit to the gno.land blockchain. \n\nBefore diving into the code, let's learn about how the gno.land blockchain stores \ndata.\n\nAll code uploaded to gno.land lives on a specific path, like in a file system.\nFor example, you were able to find the Raffle realm on \"!REALMPATH\"!.\nThis path is a crucial piece of any realm- apart from being able to \ncall all exported functions in the Gno code by specifying its path (a next step!), the path can \nalso be used to import the code into your own application, providing reusability\nof code and interaction between applications that live on the chain.\n\nThe path of the Raffle realm can also be found in the \"!gno.mod\"! file,\nwhich you can also find on the [source] page.\n\nIf you have read through the \"!raffle.gno\"! file, you may have noticed that \"!RegisterCode()\"! \ncan only be called _via other code_. Try to use the Gno Playground to write your own Gno\napp that will import the Raffle realm.\n\nFigure out where to use the \"!RegisterCode()\"! function, and make sure to add\nyour (case sensitive!!) raffle code as a string argument when calling it.\n\n** Include Hint 1, or is it too easy?\n\n## 5. Deploying Gno code\n\nA crucial step in entering the raffle is deploying your Gno code to the blockchain.\nDoing this will complete the first part of the raffle entry - registering your \nraffle code.\n\nLuckily, [Gno Playground](https://play.gno.land) provides an easy way to deploy code- after writing your\ndesired code, you can click on \"Deploy\". This will:\n- Allow you to connect your Adena wallet to the Playground\n- On the top right corner of the Playground, choose the network you want to deploy\nyour code to - you should select \"Portal Loop\"\n- Pick a deployment path for your realm - choose the \"!r/\"! prefix, enter in your\nnamespace (it can be your username), and match your Gno package name to the last\npart of the path. A suggested deployment path could be \"\"!gno.land/r/gc24/myusername/raffle\"!\",\nwhile the package name would need to be \"\"!raffle\"!\"\n\nClicking on \"Deploy\" will prompt an Adena window that will ask you to sign\nthe transaction which will upload your code to the chain. The \"!init()\"!\nfunction will get executed upon deployment. \u003c\u003c keep this in? too big of a hint?\n\nCongratulations! You've made it through the hard part.\n\nWith this, you've connected your address with the raffle code you've received.\n\nYou should be able to see your raffle code show up in the Stats section at the top \nof the page. Don't worry about everyone being able to see your code; codes are usable\nonly once.\n\n## 6. Registering your GitHub username\n\nFinal step! You need to register your GitHub username to complete your raffle entry.\nLook for a function in the \"!raffle.gno\"! file which will allow you to do so, and figure\nout a way to do it. \n\nIf you've succeeded, you'll see your username show up in the \"Stats\" section at the top.\n\n!!! Make sure to register your real GitHub username; if you are chosen as a winner,\nyou will have to prove you have access to the GitHub account !!!\n\n## Conclusion\n\nCongratulations on entering the Raffle! Sit back, relax, and wait for the winner\nannouncement time at the gno.land booth.\n\n#### Hints\nHint 1: Look for the \"!init()\"! function in the \"!raffle.gno\"! file.`\n\n\ttext = strings.Replace(text, \"REALMPATH\", raffleRealmPath, -1)\n\ttext = strings.Replace(text, \"\\\"!\", \"`\", -1) // go/gno complains about ` inside ``\n\n\treturn text\n}\n"},{"name":"raffle_test.gno","body":"package raffle\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nconst (\n\tvalidTestHashes = `a657602fc08191e7a4e0255a818a0ec544c8ce0826fe9ecf0c47eb538b2a9920,e4ce35fc370cb77c8416d6cf248e406c3f41073955d2d1c46dfcde630437711c,d1c73632a00861c2a57502edcc7105df21e22f6f4764e07dbd76c1dd456fd763,5e9a113e15140d8e7ec30a70d999038970da4dc84b8517fdf93d8eba56b4f4cd,d0a8e682db50c4b5f16dbb1c206cc8086f58094642d5864db8cd5feaefff0eae,6d0d8c67778d4ea8ac5ed234c12075b7ccb96350ea84711f455eb1538ac30025,e287bbe122d9be4c90d2fc62e51abbc67de50f6c8044636a61e7f801081ba907,6c4567fdd88ee306f715eac751010b5ef8a66bab66258e580be4915898b1dfaa,85463175e47915820c55acbc2531eaf360a8c0586c3b59cbbf270efcae64382d,b9efac79a5d7a24930b1429e884c0e8834954c07d71fbf65eb2c6ed9deeb4b86,e22a3c12a95f1f07a0efc398da7c39c4dfa75447f17a03184271cfb5a5c96878,38b9840b1b4424a90d4999dae44d5e84b91ca5ec9f9227019134b124e17d9365,e8938fb84352f04418c0004d647b83627f9a87ca6df5565acb3af41a5ae4e96a,0230a0c0692cb9a8a5ef678e43f6693c48798ca10cc18694beaffea4825d8ea2,df9656caee96c6307c2a5f1b8e7ccd5939ec5d5d20902865d6bea75c696ece8a,0826a9dd51b29e6c2a5fa4851b9901938766a966be238bde273b4e18d13d8f52,3b6f3cc0d0a263cac2542c2280f43f15fbcd5e84a8e381def4f85ead1f50fc1f,203d4d1fbd75126347c4d6f5507e9d0a3a3e7c882add72157a036c9dc4e66512,7390338a73bb575ba433c21c4f20046fc84e068569ae4dd646105a9a6a58847a,336dd7b5898bf4970a26b5b4a6fe676b5dcb8717e001c9b35bb77ef470b4a7aa,8a9664c99a6f9c834aa54c4a762a31e8047584637fc9062e5069c0aa72631424,f1c8980ccb671cdebf22a160a6e80d7e32fbaee249642d0542b0c200d49aba3c,53448154f4b36b94312be81822b1b5e50dccfdc79b32e2c22b16ccc6b7d578d3,f70a7b08f88830a74830a78e9cec3f8d232217b113cdda0c8999701ad03e8d9a,ebabcfaf537123853c1f4fe32663ab2b9940ca380a469c90b4335a3cd75ad845,f11b62e725abd3132689a08c414a9d8056306685ad579015234147ca8d951ef5,e8746cdb50ea505868f1b14a639befe60793e1b098595ada30da9dea8543f85e,d64f3d1df00b2499d8dfb70a7ec677b6254194c1cc6fbccf2a5de0a1554aa73b,bbc3769aeb96573e828bcb88d4043326422a486cd7408d673f55a74c2bceb905,89b3990c08d38bc4f157d83dc4a3de9daa22d47eefa2b8d2083b45e22d987059,befa5f82ba8c1e203827afdd525b1bff339db39bd687499e67cf4ea0ff1ea7da,35248acd0ed6d6a551b7e6bc46f5fb6c5e00e996021298370a3a6145e45557bc,bacccc0dddadfa4e5ce03565a4d60fbfa13e4c6df882b4c5380c63c2fed1c72a,c3482d84d0f68d7340aea787390aa271051697c9f6189e01c970ff18cc871113,d03111e4fcf3c5706acbcdf03408f27c392de6d622b6c587fdc01a15aac8511d,77d3c66add6417b3c82b33ffc4bd56f99f0e1f2ad6b50cb7dfa52cc20fbe53c6,de52618ddb2a0814d537e701065d093dd99b15ff8ed9df4a47fae47b36191144,e5b2c494f09c57fcc1a2f1c81b8bd543418561195c1b406ff0933c80bc43926c,290862b65579a5a9e7b7af38787aadd098db50c474fc8973f1d40935c2abdff8,4790aad6ef509672d5b51ba192b1465f4c7c8c8ed5575164e549502498cdc314,bf421d436ac5cac95ebe884d84c2bc10865b614ffda07ba5e47bcfb45d0cae68,44119bae5a9ad9707bf4ae45b986db6c14910549c134977cfe4a9722d8bb8413,8b66d6f823efce27b5dd4ef8df2e7c420f977683ad951e55117133c96d3a2fef,7950ef46b73ee87379ce9bdcc80e7fb5cb1e2a0550142d09772f5adb48990783,47900068bbfecf6e272a543101b24e3284cf97d20f10c83e0cef34fd3d7b8939,9b70918fe6fdc6b997251f8988b1e28b26fbcf5b00aa009b54ed6987954b1054,87e5fda75dab4f89646c832951c3ca0ee2ed7908eb67be8b7665bca0c11d4863,e2401111629a0f6b97c09b98cca394d653ef3b2b7b130e6dd97a1bd278be6fd3,513ab2a40f29de856e9e75f7f556384b5793b52630966e2572448201b4d91241,38ce4e383b82bba6324efe0b591a140e108a140d348964e12fe4095f1ec28836,10ecfdb05cccb69aac313df1b85b6e9a8d16239fc72b6ba01d54cb3a01367d23,63a2f5ba3d1e707b0d2e7143e6ae0b59d2db066c910d8dac1044282a7b414a2c,5358b5d792244a4a9cd76b1a53cecb72edd8ad86b150bee596bd111984f37c8d,f1472a16d28eeda10cde756bb0fc9b1edfd72086ad1b7ba848f3b2c7c0c1ba60,12e200388a96f0c880cf48e93b2ea96287b7295b64ca80618e0425bf57fefc12,ebcc48149e5fef8d883c2feab956bf116beaefe8ab9eb751ccf991036fbd21e2,0c40425718e03bb1dd82551fce54f4580e8220fea9f6d615b026698fd9669c80,4848690fc49a95c439cec58f89982b58840164815d953c8fa87ccaaab2bd1731,6a16bad26a7cc979a4f8e5eedbc80fcfd9ed7ecab91193becaff50f33efc28da,ebb1a01c03117dcb0aaea770106bbdeaab4977f48c996a4f099afeb1b2facfdf,01b214bd9fd35002db91584f4eaf2c6be48033f47e10de7b3688a8ec03c3ac76,7826ebc97a654bf788cb023f6be2dd87989948ed6c1459af75d66323ec609933,f5e1f76ada455535d638d72d5ef1026376845487d1b6f36a260e4c7e9695601c,3f7f2d5f5a5880ceb62584e53b591be6daea1c1256e40d08bcf800341c0f4998,81d396417b5c2f4fa3ba7ff9a549bcc4828c67023f02e312a1d2b04d6a0dc284,a038ade0998e9b9f9b8f6a6c07f1fcfd71a94c2cede2e008c01f20c5bcd8c951,440bf41f1820ae151a8b9b7d9929092506b9b37ff9008d25b420189f6c5fca13,3a84efff563cbf7b4d8d5cb263f4f5fe0b165d6489ef97cb5f027132637d5966,7424bde3031042dca9b2772420802729013620f0080339286714a1cb025819ff,7ce7ac17c0ee78366435633c0e6a7856a39191acdd31e0a4fb8ac805e34d46d3,aec871aab9cd61464a27bf28f20f9787d1487fc7db381755b446eaeda32bef95,1776c5cfe011cba0de6adedc058437199b5b4d022891b700ad34c253bf51f528,77c42978cbb6d4e9ea009bad225ce9c6b9628ef385b0e920d840fc717640c2a4,0234edb9221988c6f9926a02875e25f902636edf0352dba3119c80576f6d234a,a3982bc2e9fc9bf4ba8a557faf0fe3c87c7d70704cc34bb257ccce850a56df9c,1028d4888bcbd6de66991f55b05281908a43bd721999e52b864043e5b20a1b4e,1243e8b9d1f3f9faf60a3ef85df793a21cd32fe70be208daaa8b581ef2ce8e68,f126a0245767f09b0673b4db69cd15c21f5bd30db6a4bba8d1a31ea641d58b33,3f2c79cfe02d3997fceb691aeb35d7cd57de441b4cef6e30b9b962deef9c50b9,f5fa2ea7bb2b4c8c6ffc48161983f88bdd19be45a57fc98ff9c1fff82f801014,d8df89e0cdeb42bdc936da63cde0fb936f56dc234da63917663fd7372b7660e8,0e8b757308130fedef4420b79e3d3945e6f8d2d17850eed9309e4d130f654672,b997b5fc7ccd97a0539bda23185af6f510eeb5d73de4fcd6647784567295bc6d,a3e3ef6e658b4466bf2171c47455a80cc2bec6a90dcc1fb3390cf744eb53c1c7,8fcbfc5d27166c53d080f471d16f6bc8e8aebd92f0dad07de4b859495ff042e9,28a00715a1445747db570f4072a94bb51e3174665cc256982f68eb73ae373ea1,b9a85ace3beb1b30f5246b3226efd57c9f829799fe621585ee7835f55d390960,76f2d988a34611508881726f80b18430753a9bddaf239fa1e3ca248c07f563d1,810a984e20a8f0d9fea02b69a9d0d7ee64743d73c24919f060355c58221659db,ec0ceca541ac704ef78375ce66bae03e2ac7f948e14d0702702b5edd44431ed8,45c038cfcbe4bbaadb423bfb6d69aa166bc36444478eddf04dca330e747645df,66978f4b114af8a2c7bff35caddd57b0e34d4469422e1f5177d84efbc29e9f9c,68deee2f5ed12726ba48c143de86f5bfc6f52e42387b6b118bd6adc15c6398de,a0db86d2a0c9ce98a0e3e45bdcad8786af03bc8c616726b39e73514d242903fa,585814809fdc5504c535b33a7905c9eb1fa3fa49d614de3691714738ae50800c,1302a8f2dc151addb559c3078c9ff96e4d0c0830e741837ed7167acab0f9c665,4142bf0dad7aed829ce45f47b9dc7301c99ce48eddc44eb72bbcd790238e51df,7258b40d72fa503550edd920756c4a1707b73bdefcce5ea94e79077e215c2ac0,14e73a66c7000d5cb2e2814cae0efb467f7a7db3ff586781127d35755ee90dea,b0847a80927caf523b377dd8e6afbfd29d9d247489f5531492b52a1603efaf31,1fcbf67cb147f8550780d80e16f5a9e22e28d5fd73ad04c7eb05f089173f8e6e,4b7ef70b85443c71ed7d39c56825a8d6faacb85a4697cafa4945680a0ad3a9d3,5915da1266757108bc408ceeabd04a99c93f745af0462d1df9ac42384cca7e07,b3acef10f8a2f04d21dc8856c7e138f103dbdc5e6b34e6871b12eb2ec6907a18,8da8f353e95c27476094aa037c06d987f72ab08ea5927af07bdffd24467a5f68,0502db50a5bfbbfac71e959bd4f372a47e83ab6a17a255b0e60b402c122b3fc8,04ee807da45b9a2a8a1cdd0148e1babb794e9e7584c55f370a2f723a16632c2f,79ed422a442f7b3a6b194660ec90560b742b9ba018c2bedd72d6d5a60b332c5a,07fdacdd8c1909fa7042e20ffe2d5f5bfcdbdb59ebf3e11886d02a5f0fbc05ed,361e57a73aec8cacee32496094263948fbd6a9d96e731fafec127eb9fd813f26,c36e6c40c3035c5dc4d8f015363c4591dff5a0e2065aa719c751cdde1a81bcbc,9bac59d959407ea715e81eb23ce43cc88e462c5a25ce525a5dd7b417ad7ea7d9,8dc69bf8158365d866d999fe69b6a7bd869961bafd09863b30d7d6a114bfc5b8,b00f70f3daa8b95576f82c3e59ecdd8558029ee49fe3f726a39d06a1e8fffebe,7ea988c095c4107824bced289ab7d21136e81dddac6a57af836e639135a08e05,966476658b04905c11608c684e267508c9f875f90bb03178b6b4b93ec2f98f13,f2d19b603793cc43563223651b218f8e465f1bfbbc803ac0982e75c8424e12e9,87610850a33a00749627bbc7c6e0aeff65813378733563d05b09333ed445ed54,b980b9789136661518c8864a2caf5f5ef7564408d05391888d25695d6bae1c9b,5fd10e734dd73befd2506c7a4b3d9c453366788763933a32ae7c8a1cec69c000,420858c69ef2cc9b5077f786392fecefbbd76501a8843ca13755a8efbfe6c6d2,6c6dd279e6b135970fe3352b41771341ddb0da7b41b5347b53004970ca2a07d7,247bf14ff84a4c498caeb9aaf249d186db1f84e19363a1a3f118801a57ba09e6,2d568b421ddbe5486bee08dd6d1c584f3311eed85dc714aea72efbc8f26b1b66,274b1391e2d9c3416515ecc8d10061cd1918f9fa9b7e91c7e96934e9cb6bc8a1,25fb97b440fd5a8c2148b8301eadb6419c1350003e4d9f2956a9e782a3e898d1,2d1bf699f5a8f2c5b2817eda0ef641947c6abbe7382fb888194e1d5fdad09566,330b374790e6d56d65f871ceb5a1779bc9859ddc29fd7bfd0d2e2a36936d9e98,3ad6891a7801438b4c695915e33ab8b7601e7f96074425b4dfc81ac76d6d09fa,8936901fa82ce332b699810e836e5320b0a0c5a267be7d875f991607a4eae282,d96bffa8ce37e4148483ff508f2a60b6629938db37b26664be8f4de4e8f9be27,7b4fde34ebe05d8c5a6c7c9bf0caa3971173bbbb62450179db376c1183325c65,4e38a924326b672f732602e8b926997eaf815cb8d9552ca8b2d694d0ceb74621,8d88853e489365132031f1c19f96787bb7955fadf3a33210222260c41b46fee9,73c500ead65ef2286b5140e06deb05ec11c78caa32954452e9ac50f01d4b1574,a8fbe2c40d74d690018dcbac28ce03edac5e5078d86544f04d422cb94b2dcc5b,3070a2343f71b624450db8bbdfa58ad1d4f20d171120fad69163ff68d969b36e,c4b2f358fc2cf8d771f8adc21419ed06fb3c2eafb8aaaf57f9f0036b71b24a79,8b33b6c3935ba61868fe6c3cc82dc09cf8956ca401e4081bb9070caaecd54a00,2440f69ab8f6f3a40c2bb83c8c11fdfbb69b32c6fb92a8059fc53f72c90a0fe7,dcb1b291ea41f4aa8f4632f62cfb20860a55bbcccd5b865bb36a8c0868763493,77fe31a59eddd7b925605d0081ae357da852d2530c820db0eea6418f826270ec,5a48b14d87fe45c7ef72def490db5cba84626720dcba876037241568ce75eb0b,28282b12ce1bf020a380fff1d6276f20533530ecc1fe666744c7761e80bdf7bf,f7965deadf987642563ceb0afe231c0ba0656547a83c3b2c58eb101cfc3b6df2,75f75d426cf3b26ddcf9d81e37ab8ef4e9421820f35abeec77e89fe2f229c713,df4ad30a4d19080ef444e9b86bcb539bfde6b6172254e6348e1f8677a6f8a2ff,72d98f1549d8125c6f98aa65ce936d978b7e46761c7b738ff162098b97ca22b4,07fc641ee6efc88323ef2928b263822f66b8bc844fcf686e8b6b809cc55cb28f,6fe314848cf6b71e3dfb97e81c58e8a5cfdd5c95907beba0d80cc733e338fc4d,edbb054b6a58f073de56cb76b962686aa3285cf0061dc1274c95d7d6091b3b33,600b8c1e159b5a119a8f2856c9da15f0cc407a9440c28a9c930b93319080e11e,dedfa5adaadbb507df7acd1aff8bf15e792556ef5a20f7ed8f2f733b50a2a94c,266161aee785bfce4cd62bb7f373f7f6c5843042aec46851858b15be81f99c01,a27b39e042e6b6d8a409c02ef510e87bb4fcd6d17a583465f1e3bdef8fd5ff66,bedc14158770ae8dbc3cf5e095890c1ae813a71519a1599e12d318c109a03d73,eb6c718e060181374cbaf61401df3fe4795b5ea7d69071ca54db7ec46b5f39d5,1db3779583cd8ddfebc1c33b9554c259e73ce94f352c8b9dc65d91b945f42508,9d178e34adcadf94b206f0d04956160e3e6f1aa621ee7e901f43d5b4993a268d,6852d1772470588b412382efa795fd3839c0b5f0d5c73db60ace8d9f0654f5ac,c16d4d475f5bbf6b0fefe2c737538109175d619e6fbf84fe0ddffaa107f49624,4a2d53b4176333403f606c59b12561716543c596455de1883a1a08648cfe5633,0abf8530e6570ac69c068b160acc807b660331fb7f206267891772e05784f080,ea085e3675b4f1ee23aee81d920d14168f7740c4dae404f081263200c582d5e5,d1f88d59c10f517a00f8379fe0dd5ff60fca94e5e5a077432ffbb6a2b6f85a13,43a471ba0c43af7bc0e53f487585fc7e44a4262bb0eca400038a875430847ce9,6a9a40995191d5bc3bdb32b7ae6af6b2541e55576cfafcd97c9bcd95da4b5340,e28698e18e49e481b8a92b4102cb259584d81edf3f73468c5ca5509d5b5874b9,007b899ee4ad9cf389a4db03ed5ec69e8a2c4648cec328f0c669425089186604,8ae572d8a53847a30f5e9f2ac5d734341c2fac4fd8f574b2b9d9b24817d6e372,f857a1374f3cb2c80661ecadaf5d0e3622e72d77d266aa7ad2801e7db335b969,2e9eba7803798b99de5e59a3cb207ca53180326d7dddc4f80460ef1e3bca9f22,6d2d8fdc6bebd8bb5aebf5f4008856c427fc9b077cedef06d7cabdbb35230090,e88f5a8743a1e2cc24c07bf93d2566293ec90dc3016d6d561ac359f200afcd7c,73d8e522befb3985d72f69876a3bd5bfd656ef442af8db63f24e3802fbf7453e,09dc75bc71fad01c85dc0c7a2dd4594ae3883bf5ef8155cd2856638bf467842b,69f06e1c5773eddc50d89714a081fd26d6c271355f609d171d90f09fdb6ad311,1e8fcdd32d547ec02338d40cefd09b02b28a4ae8f8972a4fafa158107f6a890c,79dffd0030e1dd9af958fe233cbdf1959ff3d749d863da8b92bf6d2edcd114ad,e089dab3bb2519de80cf8666f589e183f4ddf80f8778282694632499c093aaad,2f342899b6e2505b72a25f7f507298b4cd5b0400f9d034d45a95fa86d127b171,5b6767fdff5a39d92eeb8415eec49f48b958e9c38151ce4356d09e43f8b397e9,a70b2878df44bd3952d9da43fea40bb475d2a87d21b8d5750c2153163af39c0a,4526593e49e532e8e498a8b14c3ca15c1749dfac9cf39a0b44b4c18ddc319440,118502524e8a02d7c7ee2cb984b598f27afb3b7b78b92326b2fbfc3c53f48464,8379f7dc2c391ac38ea1d34ddff36faf5602bf128b6d93a3a8a6485b1d8dc23f,0c17a500636a9a94b405b8e9f2fcd45b058a4a9070c156332e429daf0379572b,7e302ffccaacae442283c86d2afdf7c240d19dc42c41440419c8b78efdfc9dec,a19467bab0f5a753e4daadd080e64f13c79bdabd7e403575f9f3d3b7b6ca66fa,4162c48bb1ba5e8dd38518f9d1007300e46348e01a97184e253a3250ed0f9ffb,c1e36882f77da60283f64d2590e3389497e6583fcdb61c21d352d522506a8882,64a4716a19fd7b8009a5e6d5924a74c65ef8e5f85c64345c7b89a4e6b6135e5b,8136dbac064d798c9e30bf31e62d74f99ffb37d3bd9f3d6d3c6544669ca3cded,790f8dfbe56b27d1b82b00bf96394caa4ef54263229bf3ee5b2aa891ec8b5676,7d060a4e92f2c1f4cd2546f5409cae2c946b70556b249455dc19fb93e8dcdb9d,8e62713fc4972433c63b1c0c19cc1d291471381b11183b40e450263956a4d1f8,46255b9d4d2059337f3949e4ada5c2d16ab8385f66967291e204175aa2120986,49023745977f47f7439c701985905ad2be42b2a89c070df73ea8dc7f9c5ae627,75e6c4c28e4dedef545bbe58ea2b497dffc90ed7fe6d7261287e90cd85a3fcfa,fee9501fc25e4c85c0d205473426d6e6f4e02eca002eab6513c6467885486fab,77f39047575527668b8c86defb3a15328d6f6289ffb1dce1b01fd1c9f193f739,59e80ebb2f5424610ffc9070e39c64805a1d6a44f52993eaf0b427b3a8494b99,bfddb6b1867c2d0cf3ed074ce94fadc786226f28f98f9f1d7ac5bd6a1e040f9b,4c6aae8655346883ce266665e0c61461636a128c8804d6aca78f9c8a35356fbe,bf4462bc1f0c88cd99e30a20c6b6eeae09f7a17a737314192aac8b40056e90e1,f448286e1d5a998965efeed87d8feffd6ecc3fc0a9a8658730da10715324f89c,7619cfb410a5bb992e9da50699a6cdd82a0279e27176ebf4c1c21c12dea2459a,48395b0355072b681c77cf4684dfa228f4009c4985d013908539e34d306bb4d5,6fa9d11c314c5430db8ac179f7e1517d754781522b94f2da800a3d9db8a191be,79462eb8641df40ec28d7ae89ec7f1d5548b7b0316fb03da682726b35bfdcf7d,dbb07ef67043d85768c04c5c68e98a88685bd2785a3b20ba574403397fdcd33d,5be705a5717f0ad7688077b80765f8eac1be081d07105c7ab342db817461213e,0314be8e3cfcc6f00f5a0b3ce074f844f8126692bc9db1951df722379ca37622,b225bede76fe85a80c30ec258bcff80f9226fc3b3c07e1c75aa43e38968c85b0,ecceb05c114658703ee5bda417b23ecedffc67129d59b52a4fb60b9aad8624ee,56d6e51283d0da2e6aa6d8a166178aa5bf97c0d6ad8b6514a2b1a8701a890a54,274754307e41b8a6333f8f2d9bc679640fdeaa6954c94d91b022185d2e0f64ca,1c303f25b84f7f63fba0c97dd1ebf1148c1968658dca21b27df47ae2b86c4c2b,04638bdc28da59d45407c756701e4285ad0487858e92b2e45ccf99ffafaaf73f,ed4d011b44c9801335df5d3b5550977b11a1e78ec7ad1ebb477ad2eb707ddefe,333a3f0c920bf95d95cfaaa069a17ccfb0998ebc5697764788642ecb69c1746c,c6db8bfb6ee98557377bf8886a12c5784f613a53db3c09c161938039706941f4,25c3e1dcd0d27d63978adcefe9f862d9be8e20ed44bd80c359ffe99bc72fb095,035d2f21a40a3c5f97be226cb26e792130ba0d56dfe472b5cd9e1fd0b5d557f8,16411af320b57bac481c370cab692121e93edc942c2a6851c64737951a9594a7,43cc758c0134246a8a9e7db3f08a63709f0db02cb8431c21319e832845e3bdfe,3d9149f5c36eee7b661628d69b8d3e323b4fed8f544f8ca7b1bb575de94d465d,85ce96c84ff64f03e0c8b72dc9d6f2a4679c034836368345e22ffd0a170ad62f,2691d4f78bedcd4a6f6fa39c45a0109e4a11ce7603c656b53cca835d3863e06a,cbd21277046ea7f4572d6e8149077713575239ccf8a98c56b162b633a6490cf2,30335f29996cecf0747bf4e2b44f8ee3959e4cc277317d48e80f7726a85d87ef,afbde53c640182877df7eb5955d42669c5aa54e65ba304d6bdfb1be002cda374,d053a7b55ccdbf594d95fa053a1dd93d41a72e9c29b15b68e571e482d33277a4,3ae128f7b953405c2cd293c2e62a9c99914a7ed69d84c927c518bb9fc21b74d5,ab43d526f1dc6a32395c49806c8bc73bae918a5f3cb5fc1d0f99cc32e8d45867,7c5151e7116ff12d2325c9b2e98256e43802f6c4a15584be250aecbf143f50e3,5ee1a8ac394732056708b628216815b744eb5fefcff8426eb48d682ae7fe0bdb,e1f06ae08a52e1e4e7544d0ee343d33ba6ea5a71d7ce00c56a3f14058a199d78,771032904be77e19c389ae615a39e78aed70ae8e233edd8f3d5aafee1e4691df,cf0dfd60ef8f949ec0168439c7022546c5f00634e7fdd668900bcad1e2e81756,84bb868f3ec690f914e3a8cde683b55653e554bf5ae6516304ca95e3e0be0ce9,2e6bb4a91f7df30a0fe05ad3d02ea64b6a571a089ecd6e1a2caf900e5175949e,566cf7e6d6419fff93e8f18bd34b7fdb2db9b2d4191434e37a97e3a5cd00b186,912729b57611e1422879af83c5d11bb416c0b98fa83dc392bae590d7e90d5d12,54a7f54922ffc66260dcf30076c4cc7fa254cc9b830b2e37349d7b40f0d67231,d2cdfe1068809e2e519bec2fb30eff036085ed0fd5a174157f4a531be489a9c4,00c19bdcfabceeef4ab4c71251f41d59173c43b87ef0e968e7aa5bcf77fc3aa3,00a1b917cf86485c9e86030ec1afe9b7e28a4345f46471b92b4e0d08b698bae5,17b23ef7d38a3a0334ef68087a585ac48956984f6e0321c62d30011368954485,1fb0c2d4d015596c3439f405da4a7a2497ba94cdecb535e70cfda08c6a764f4f,993c1131175eb1f3b8b5d1d72ea5addac559a20b5154838ee86aa9b71e06652e,2ede50271add1f8aa5b91bcd222d83eecea7f4a524c9e62ec01cd889a55aad45,20ada1b4fe496096230fec2c00bff8a037db5079c6f45955317df9c2ede5f85b,b37b8821965b243026b83a59ea4e4e2246545fbcc1100d8effeca612a3b6bb4a,0760c516052f81058efd89aa11573c744ffd4f5685e11e9e200bd0ba0228ee34,fc3cc3b0dc5592a8c0a2e41d3ba995c0f65efbf2797c2b7b2403bd2c552acd64,0475e984bf932adabb1fe98d943ad23fd56e4bd53c2e7bbb12ea69b7996430be,d60ec04ea36dab7f685a2dc50c2f76ede60a6b594b15317d7e32d2438eef36ef,13dbd661bb4f0bc0854b761b94470f2c8d3ea069c2b2c53d07f40da9668515a2,875472cab949b679152079e79cd06ad376c30f4c298b2f7e191f5f7ef3aa1ccf,bfc95afeb7c01ea29780954bc62c9830af90e4a8882b64d24e65d7c30e075e48,4d100b664eee670a68d88d07bab4ca55dad28da862b2af631b29d5031920e10d,1275cde34b3de398a87fccd8bfa2261f826983ea774a0a413843f9de07beac70,b3cc121e4d7f7bc008ecd7d79b2f08d32c34c036c64678ae7cc43112b4297210,46a13985c51e2cae515be2a8f1eb0b42fea64cf366057a611cee74aaa7c648e3,df40e86985f66578e1ca70bea1c1a58b943c3b37bae49f639a547e759239513a,448cb5c2de497679de2161a93b5e0983a6030a33a59eee2b3171c56a93bc91d6,e6b371651baf1c9773ee1e240d51deda5f237e8da74048af9f3379f70f1c8e2f,d24ec5de76732220049843cf0ce87053bdfb223d8e45cdbf83a8d801ed486850,4131794225ae70468171aefddf3e5875a8ab294263ae4694f93a68e8314b0b5c,f5958acf10e9d5f12d9b0349bda1e652273977c36e1ad59c383bbfb512abcac9,19dea7117e47e557bca2019c09173879bde7a9703e7577ec5bf2270fec6aca6e,3cc640e6348efd77de2a22367f609c2f68551d4cb917f27c32c2dbc422827dfa,61d21b2cb4586c4ce3178f6ea51d905d9d00d79d85ccea52e5f4223811e12a44,44e06b75ecca6b3a9f91813c716c0f61f5990f498c5ed17a41ddfcdc0db48368,8da1c8bd377bb3892265639b26a72b7780393a8a43f6471a5eb1abd1ec88ef3d,f5e58a733b69af1ef5fe8a9a580b3790a792e44ad32a29e98d9f7f142862b298,d1e1dc03f1d6d75da644b8a14f8e7d3906b47d50968273f0707142bdd810de1c,d1869756e1200628a18e401e9510a9f78604ce91faf67c2e759a7b28c6eb882f,60dca01fbd010aef036b6ba742978ebacd1c49ba999e06f1b7985c5c0e96055f,c731ad94fa972ca5a7bc709d2cccf187ba47bc6299dcf3301b62990064e04fa2,d1cffa5c6c044dd22a8a0990545ac7bf5edf04b38820230af853949612ef7075,cc351a659c1718306c90276e7a58697709b69d2dd06af2dec6891ac77ac62a3c,82738ee011e454410ea714fbeccad19fe15dba4e62b7d1b85e65e7f8ed2e6286,2d2f067acea2451a17ad0f2beeefcc768dbf52a01f437a5066f49fac1d3eb312,fabad1b8e1b3a3e11810c408f748a7e70449f4274aaaaaf69b11ffeaff1504e7,4ab824b1479ec872488f501374e22488e0b8b4612ea16cca5208783016af9858,1b5dcad92079e86412309d5f85b01631a7aa3d7eda261080531cdeb89c96bcdb,a1809967d96449a3535d19e509fc3ae58b714805141f6487aaf06a7b00f47dc2,081fde0ec6f26348e2626daf44d932bc31d3ac3cc6546061484f9f68b0499422,c3d10191066b94c7a89f91f75fc9aea86e17ac5894fecb8c0698957771d196da,b5474f0aebab60ca12d4f8097a499f3fc063ad6146eb6db4191bc05ce82312ed,147a78e0d0d68aa642b97ba83e7b45ff5b367341f0a0a4f551f593f3ed8855db,47b2514697f7793be6f9ed37ff3cee74a4d1a3012d468c6069c50b6681ec07d1,d59ee71f32fc530efbc54952356a1e564e7fb077b9323bc032f6cacd7ed47917,f0c7fa099c97483728d04f577f5b1462443136e52b9434b5875e00984eab9fc6,a8d103d654099371f1a97f34cfe997683000cf2e7a525376d6af1ac2b75d71ac,cc5f68d406097c09e8d86b667213f52b77d3e0e543c86e3dbede40e8c1f7490d,b495595a4d94415ad9e3c6fbcb8589ddbaffa7d0c9077fcfe261efecc76bc957,f4359ca550fc3fd61f08b20e7714d37f1ea257a2d548fcc6a40cbf1bbc4bfc2b`\n\tinvalidTestCodes\n\tinvalidCode = \"qd0bJ6HTSB\"\n)\n\nvar (\n\talice = testutils.TestAddress(\"alice\")\n\tbob = testutils.TestAddress(\"bob\")\n\tadmin = std.Address(\"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5\")\n\tadminRealm = std.NewUserRealm(\"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5\")\n\taliceUserRealm = std.NewUserRealm(alice)\n\taliceCodeRealm = std.NewCodeRealm(\"gno.land/r/demo/alice\")\n\tbobCodeRealm = std.NewCodeRealm(\"gno.land/r/demo/bob\")\n\tvalidTestCodes = []string{ // These are not actual raffle codes, don't worry ;)\n\t\t\"qd0bJ6HTSV\",\n\t\t\"H1Qe2kx@ME\",\n\t\t\"2E$zre$$oE\",\n\t\t\"f@2xEQCEWo\",\n\t\t\"AUpFRwb5H9\",\n\t\t\"jHDNQ^x2zJ\",\n\t\t\"VQz^SbYtR$\",\n\t\t\"?ZggWTzpfz\",\n\t\t\"1HP82PVPD0\",\n\t\t\"#nThf$N?qq\",\n\t\t\"nQJFyyk9vS\",\n\t\t\"4xR5n%ymnw\",\n\t\t\"ogJ7sy77QR\",\n\t\t\"syuJ3ttYKj\",\n\t\t\"w!JgJT^Cu$\",\n\t\t\"kmucxFaAL#\",\n\t\t\"7uz%UDR9f5\",\n\t\t\"ifUWAKug9?\",\n\t\t\"2Np27vsHvp\",\n\t\t\"mtDPMcf%EA\",\n\t\t\"153SQg6T!h\",\n\t\t\"Zgt9c09N9s\",\n\t\t\"jKKU7y*hN9\",\n\t\t\"L$gKPVF0Df\",\n\t\t\"1R^NKNV@RJ\",\n\t\t\"TbtREP@vx6\",\n\t\t\"$ii4\u00261$CXT\",\n\t\t\"jdVRC6FCLT\",\n\t\t\"\u0026qgQrrtB^k\",\n\t}\n)\n\nfunc TestUploadCodes(t *testing.T) {\n\tinvalidHashes := `1cdcdc252a3a8c2d1516527dcf3ee63b4552a6bbb41145527409d8a8b6185c40,551a0108b23cc4bdff4c716a504a677551d68162ada5b9e20ebb21f4d7e83c9d`\n\n\thashes := strings.Split(validTestHashes, \",\")\n\n\tstd.TestSetOrigCaller(admin)\n\tstd.TestSetRealm(adminRealm)\n\n\tdefer func() {\n\t\tif r := recover(); r == nil {\n\t\t\tt.Fatalf(\"UploadCodeHashes should have panicked\")\n\t\t}\n\t}()\n\tUploadCodeHashes(invalidHashes)\n\n\tUploadCodeHashes(validTestHashes)\n\tfor i, hash := range hashes {\n\t\tif hash != codeHashes[i] {\n\t\t\tt.Fatalf(\"Expected %s, got %s\", hash, codeHashes[i])\n\t\t}\n\t}\n}\n\nfunc TestRegisterCode(t *testing.T) {\n\tstd.TestSetOrigCaller(admin)\n\tstd.TestSetRealm(adminRealm)\n\tUploadCodeHashes(validTestHashes)\n\n\tt.Run(\"EmptyCode\", func(t *testing.T) {\n\t\tstd.TestSetOrigCaller(alice)\n\t\tstd.TestSetRealm(aliceUserRealm)\n\n\t\tdefer func() {\n\t\t\tif r := recover(); r == nil {\n\t\t\t\tt.Fatalf(\"RegisterCode should have panicked with an empty code\")\n\t\t\t}\n\t\t}()\n\n\t\tRegisterCode(\"\")\n\t})\n\n\tt.Run(\"NonTenCharCode\", func(t *testing.T) {\n\t\tstd.TestSetOrigCaller(alice)\n\t\tstd.TestSetRealm(aliceUserRealm)\n\n\t\tdefer func() {\n\t\t\tif r := recover(); r == nil {\n\t\t\t\tt.Fatalf(\"RegisterCode should have panicked with a non-10-char code\")\n\t\t\t}\n\t\t}()\n\n\t\tRegisterCode(\"123456789\")\n\t})\n\n\tt.Run(\"RegisterCodeWithUserRealm\", func(t *testing.T) {\n\t\tstd.TestSetOrigCaller(alice)\n\t\tstd.TestSetRealm(aliceUserRealm)\n\n\t\tdefer func() {\n\t\t\tif r := recover(); r == nil {\n\t\t\t\tt.Fatalf(\"RegisterCode should have panicked with user realm\")\n\t\t\t}\n\t\t}()\n\n\t\tRegisterCode(validTestCodes[0])\n\t})\n\n\tt.Run(\"CodeNotOnList\", func(t *testing.T) {\n\t\tstd.TestSetOrigCaller(alice)\n\t\tstd.TestSetRealm(aliceCodeRealm)\n\n\t\tdefer func() {\n\t\t\tif r := recover(); r == nil {\n\t\t\t\tt.Fatalf(\"RegisterCode should have panicked with a code that is not in the list\")\n\t\t\t}\n\t\t}()\n\n\t\tRegisterCode(invalidCode)\n\t})\n\n\tt.Run(\"ValidRegister\", func(t *testing.T) {\n\t\tstd.TestSetOrigCaller(alice)\n\t\tstd.TestSetRealm(aliceCodeRealm)\n\n\t\tres := RegisterCode(validTestCodes[0])\n\n\t\tfor _, item := range []string{alice.String(), aliceCodeRealm.PkgPath(), validTestCodes[0]} {\n\t\t\tif !strings.Contains(res, item) {\n\t\t\t\tt.Fatalf(\"res should contain %s\", item)\n\t\t\t}\n\t\t}\n\t})\n\n\tt.Run(\"DoubleRegisterSameValidCode\", func(t *testing.T) {\n\t\tstd.TestSetOrigCaller(alice)\n\t\tstd.TestSetRealm(aliceCodeRealm)\n\n\t\tdefer func() {\n\t\t\tif r := recover(); r == nil {\n\t\t\t\tt.Fatalf(\"RegisterCode should have panicked with a double register code error\")\n\t\t\t}\n\t\t}()\n\n\t\tRegisterCode(validTestCodes[0])\n\t})\n\n\tt.Run(\"DoubleRegisterDiffValidCode\", func(t *testing.T) {\n\t\tstd.TestSetOrigCaller(alice)\n\t\tstd.TestSetRealm(aliceCodeRealm)\n\n\t\tdefer func() {\n\t\t\tif r := recover(); r == nil {\n\t\t\t\tt.Fatalf(\"RegisterCode should have panicked with a double register origin error\")\n\t\t\t}\n\t\t}()\n\n\t\tRegisterCode(validTestCodes[1])\n\t})\n\n}\n\nfunc TestRegisterUsername(t *testing.T) {\n\tt.Run(\"NoEntryUsername\", func(t *testing.T) {\n\t\tstd.TestSetOrigCaller(bob)\n\t\tstd.TestSetRealm(bobCodeRealm)\n\n\t\tdefer func() {\n\t\t\tif r := recover(); r == nil {\n\t\t\t\tt.Fatalf(\"RegisterUsername should have panicked with no previous entry\")\n\t\t\t}\n\t\t}()\n\n\t\tRegisterUsername(\"bob-username\")\n\t})\n\n\tt.Run(\"ValidEntryRegister\", func(t *testing.T) {\n\t\tstd.TestSetOrigCaller(alice)\n\t\tstd.TestSetRealm(aliceUserRealm)\n\n\t\tres := RegisterUsername(\"alice-username\")\n\t\tif !strings.Contains(res, \"alice-username\") \u0026\u0026 !strings.Contains(res, alice.String()) {\n\t\t\tt.Fatalf(\"expected to find alice's address \u0026 username in the entry\")\n\t\t}\n\t})\n\n\tt.Run(\"ValidEntryRegister\", func(t *testing.T) {\n\t\tstd.TestSetOrigCaller(alice)\n\t\tstd.TestSetRealm(aliceUserRealm)\n\n\t\tdefer func() {\n\t\t\tif r := recover(); r == nil {\n\t\t\t\tt.Fatalf(\"RegisterUsername should have panicked with double username\")\n\t\t\t}\n\t\t}()\n\n\t\tRegisterUsername(\"alice-username\")\n\t})\n}\n\nfunc TestPickWinner(t *testing.T) {\n\t// alice is already registered\n\t// Register some more users\n\tfor i := 1; i \u003c len(validTestCodes); i++ {\n\t\taddr := testutils.TestAddress(strconv.Itoa(i))\n\t\taddrRealm := std.NewCodeRealm(ufmt.Sprintf(\"gno.land/r/demo/user%d\", i))\n\t\tstd.TestSetOrigCaller(addr)\n\t\tstd.TestSetRealm(addrRealm)\n\t\tRegisterCode(validTestCodes[i])\n\t\tRegisterUsername(ufmt.Sprintf(\"user%d\", i))\n\t}\n\n\tstd.TestSetOrigCaller(admin)\n\tstd.TestSetRealm(adminRealm)\n\n\tUploadRandomness(123123, 508930)\n\n\t// Pick 3 winners\n\tw1 := PickWinner1()\n\tw2 := PickWinner2()\n\n\t// Check if winners are removed after being chosen\n\tif len(completeEntries) != numReg-2 {\n\t\tt.Fatalf(\"expected %d entries, got %d\", numReg-2, len(completeEntries))\n\t}\n\n\tif w1 != winner1.ghUsername {\n\t\tt.Fatalf(\"w1 should be %s, got %s\", w1, winner1.ghUsername)\n\t}\n\n\tif w2 != winner2.ghUsername {\n\t\tt.Fatalf(\"w1 should be %s, got %s\", w2, winner2.ghUsername)\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"8000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"xwAUqiE9U2VHNy3h8xwsn2fqIKTltrxUclWP9+4LNKYI4Iq/Zpm9ov8u8rs+9n0PKIygpktAoCwOnojvG/eyDA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","package":{"name":"main","path":"gno.land/r/g125em6arxsnj49vx35f0n0z34putv5ty3376fg5/run","files":[{"name":"uploadhashes.gno","body":"package main\n\nimport \"gno.land/r/leon/v2/raffle\"\n\nfunc main() {\n\traffle.UploadCodeHashes(testHashes)\n}\n\nconst testHashes string = `a657602fc08191e7a4e0255a818a0ec544c8ce0826fe9ecf0c47eb538b2a9920,e4ce35fc370cb77c8416d6cf248e406c3f41073955d2d1c46dfcde630437711c,d1c73632a00861c2a57502edcc7105df21e22f6f4764e07dbd76c1dd456fd763,5e9a113e15140d8e7ec30a70d999038970da4dc84b8517fdf93d8eba56b4f4cd,d0a8e682db50c4b5f16dbb1c206cc8086f58094642d5864db8cd5feaefff0eae,6d0d8c67778d4ea8ac5ed234c12075b7ccb96350ea84711f455eb1538ac30025,e287bbe122d9be4c90d2fc62e51abbc67de50f6c8044636a61e7f801081ba907,6c4567fdd88ee306f715eac751010b5ef8a66bab66258e580be4915898b1dfaa,85463175e47915820c55acbc2531eaf360a8c0586c3b59cbbf270efcae64382d,b9efac79a5d7a24930b1429e884c0e8834954c07d71fbf65eb2c6ed9deeb4b86,e22a3c12a95f1f07a0efc398da7c39c4dfa75447f17a03184271cfb5a5c96878,38b9840b1b4424a90d4999dae44d5e84b91ca5ec9f9227019134b124e17d9365,e8938fb84352f04418c0004d647b83627f9a87ca6df5565acb3af41a5ae4e96a,0230a0c0692cb9a8a5ef678e43f6693c48798ca10cc18694beaffea4825d8ea2,df9656caee96c6307c2a5f1b8e7ccd5939ec5d5d20902865d6bea75c696ece8a,0826a9dd51b29e6c2a5fa4851b9901938766a966be238bde273b4e18d13d8f52,3b6f3cc0d0a263cac2542c2280f43f15fbcd5e84a8e381def4f85ead1f50fc1f,203d4d1fbd75126347c4d6f5507e9d0a3a3e7c882add72157a036c9dc4e66512,7390338a73bb575ba433c21c4f20046fc84e068569ae4dd646105a9a6a58847a,336dd7b5898bf4970a26b5b4a6fe676b5dcb8717e001c9b35bb77ef470b4a7aa,8a9664c99a6f9c834aa54c4a762a31e8047584637fc9062e5069c0aa72631424,f1c8980ccb671cdebf22a160a6e80d7e32fbaee249642d0542b0c200d49aba3c,53448154f4b36b94312be81822b1b5e50dccfdc79b32e2c22b16ccc6b7d578d3,f70a7b08f88830a74830a78e9cec3f8d232217b113cdda0c8999701ad03e8d9a,ebabcfaf537123853c1f4fe32663ab2b9940ca380a469c90b4335a3cd75ad845,f11b62e725abd3132689a08c414a9d8056306685ad579015234147ca8d951ef5,e8746cdb50ea505868f1b14a639befe60793e1b098595ada30da9dea8543f85e,d64f3d1df00b2499d8dfb70a7ec677b6254194c1cc6fbccf2a5de0a1554aa73b,bbc3769aeb96573e828bcb88d4043326422a486cd7408d673f55a74c2bceb905,89b3990c08d38bc4f157d83dc4a3de9daa22d47eefa2b8d2083b45e22d987059,befa5f82ba8c1e203827afdd525b1bff339db39bd687499e67cf4ea0ff1ea7da,35248acd0ed6d6a551b7e6bc46f5fb6c5e00e996021298370a3a6145e45557bc,bacccc0dddadfa4e5ce03565a4d60fbfa13e4c6df882b4c5380c63c2fed1c72a,c3482d84d0f68d7340aea787390aa271051697c9f6189e01c970ff18cc871113,d03111e4fcf3c5706acbcdf03408f27c392de6d622b6c587fdc01a15aac8511d,77d3c66add6417b3c82b33ffc4bd56f99f0e1f2ad6b50cb7dfa52cc20fbe53c6,de52618ddb2a0814d537e701065d093dd99b15ff8ed9df4a47fae47b36191144,e5b2c494f09c57fcc1a2f1c81b8bd543418561195c1b406ff0933c80bc43926c,290862b65579a5a9e7b7af38787aadd098db50c474fc8973f1d40935c2abdff8,4790aad6ef509672d5b51ba192b1465f4c7c8c8ed5575164e549502498cdc314,bf421d436ac5cac95ebe884d84c2bc10865b614ffda07ba5e47bcfb45d0cae68,44119bae5a9ad9707bf4ae45b986db6c14910549c134977cfe4a9722d8bb8413,8b66d6f823efce27b5dd4ef8df2e7c420f977683ad951e55117133c96d3a2fef,7950ef46b73ee87379ce9bdcc80e7fb5cb1e2a0550142d09772f5adb48990783,47900068bbfecf6e272a543101b24e3284cf97d20f10c83e0cef34fd3d7b8939,9b70918fe6fdc6b997251f8988b1e28b26fbcf5b00aa009b54ed6987954b1054,87e5fda75dab4f89646c832951c3ca0ee2ed7908eb67be8b7665bca0c11d4863,e2401111629a0f6b97c09b98cca394d653ef3b2b7b130e6dd97a1bd278be6fd3,513ab2a40f29de856e9e75f7f556384b5793b52630966e2572448201b4d91241,38ce4e383b82bba6324efe0b591a140e108a140d348964e12fe4095f1ec28836,10ecfdb05cccb69aac313df1b85b6e9a8d16239fc72b6ba01d54cb3a01367d23,63a2f5ba3d1e707b0d2e7143e6ae0b59d2db066c910d8dac1044282a7b414a2c,5358b5d792244a4a9cd76b1a53cecb72edd8ad86b150bee596bd111984f37c8d,f1472a16d28eeda10cde756bb0fc9b1edfd72086ad1b7ba848f3b2c7c0c1ba60,12e200388a96f0c880cf48e93b2ea96287b7295b64ca80618e0425bf57fefc12,ebcc48149e5fef8d883c2feab956bf116beaefe8ab9eb751ccf991036fbd21e2,0c40425718e03bb1dd82551fce54f4580e8220fea9f6d615b026698fd9669c80,4848690fc49a95c439cec58f89982b58840164815d953c8fa87ccaaab2bd1731,6a16bad26a7cc979a4f8e5eedbc80fcfd9ed7ecab91193becaff50f33efc28da,ebb1a01c03117dcb0aaea770106bbdeaab4977f48c996a4f099afeb1b2facfdf,01b214bd9fd35002db91584f4eaf2c6be48033f47e10de7b3688a8ec03c3ac76,7826ebc97a654bf788cb023f6be2dd87989948ed6c1459af75d66323ec609933,f5e1f76ada455535d638d72d5ef1026376845487d1b6f36a260e4c7e9695601c,3f7f2d5f5a5880ceb62584e53b591be6daea1c1256e40d08bcf800341c0f4998,81d396417b5c2f4fa3ba7ff9a549bcc4828c67023f02e312a1d2b04d6a0dc284,a038ade0998e9b9f9b8f6a6c07f1fcfd71a94c2cede2e008c01f20c5bcd8c951,440bf41f1820ae151a8b9b7d9929092506b9b37ff9008d25b420189f6c5fca13,3a84efff563cbf7b4d8d5cb263f4f5fe0b165d6489ef97cb5f027132637d5966,7424bde3031042dca9b2772420802729013620f0080339286714a1cb025819ff,7ce7ac17c0ee78366435633c0e6a7856a39191acdd31e0a4fb8ac805e34d46d3,aec871aab9cd61464a27bf28f20f9787d1487fc7db381755b446eaeda32bef95,1776c5cfe011cba0de6adedc058437199b5b4d022891b700ad34c253bf51f528,77c42978cbb6d4e9ea009bad225ce9c6b9628ef385b0e920d840fc717640c2a4,0234edb9221988c6f9926a02875e25f902636edf0352dba3119c80576f6d234a,a3982bc2e9fc9bf4ba8a557faf0fe3c87c7d70704cc34bb257ccce850a56df9c,1028d4888bcbd6de66991f55b05281908a43bd721999e52b864043e5b20a1b4e,1243e8b9d1f3f9faf60a3ef85df793a21cd32fe70be208daaa8b581ef2ce8e68,f126a0245767f09b0673b4db69cd15c21f5bd30db6a4bba8d1a31ea641d58b33,3f2c79cfe02d3997fceb691aeb35d7cd57de441b4cef6e30b9b962deef9c50b9,f5fa2ea7bb2b4c8c6ffc48161983f88bdd19be45a57fc98ff9c1fff82f801014,d8df89e0cdeb42bdc936da63cde0fb936f56dc234da63917663fd7372b7660e8,0e8b757308130fedef4420b79e3d3945e6f8d2d17850eed9309e4d130f654672,b997b5fc7ccd97a0539bda23185af6f510eeb5d73de4fcd6647784567295bc6d,a3e3ef6e658b4466bf2171c47455a80cc2bec6a90dcc1fb3390cf744eb53c1c7,8fcbfc5d27166c53d080f471d16f6bc8e8aebd92f0dad07de4b859495ff042e9,28a00715a1445747db570f4072a94bb51e3174665cc256982f68eb73ae373ea1,b9a85ace3beb1b30f5246b3226efd57c9f829799fe621585ee7835f55d390960,76f2d988a34611508881726f80b18430753a9bddaf239fa1e3ca248c07f563d1,810a984e20a8f0d9fea02b69a9d0d7ee64743d73c24919f060355c58221659db,ec0ceca541ac704ef78375ce66bae03e2ac7f948e14d0702702b5edd44431ed8,45c038cfcbe4bbaadb423bfb6d69aa166bc36444478eddf04dca330e747645df,66978f4b114af8a2c7bff35caddd57b0e34d4469422e1f5177d84efbc29e9f9c,68deee2f5ed12726ba48c143de86f5bfc6f52e42387b6b118bd6adc15c6398de,a0db86d2a0c9ce98a0e3e45bdcad8786af03bc8c616726b39e73514d242903fa,585814809fdc5504c535b33a7905c9eb1fa3fa49d614de3691714738ae50800c,1302a8f2dc151addb559c3078c9ff96e4d0c0830e741837ed7167acab0f9c665,4142bf0dad7aed829ce45f47b9dc7301c99ce48eddc44eb72bbcd790238e51df,7258b40d72fa503550edd920756c4a1707b73bdefcce5ea94e79077e215c2ac0,14e73a66c7000d5cb2e2814cae0efb467f7a7db3ff586781127d35755ee90dea,b0847a80927caf523b377dd8e6afbfd29d9d247489f5531492b52a1603efaf31,1fcbf67cb147f8550780d80e16f5a9e22e28d5fd73ad04c7eb05f089173f8e6e,4b7ef70b85443c71ed7d39c56825a8d6faacb85a4697cafa4945680a0ad3a9d3,5915da1266757108bc408ceeabd04a99c93f745af0462d1df9ac42384cca7e07,b3acef10f8a2f04d21dc8856c7e138f103dbdc5e6b34e6871b12eb2ec6907a18,8da8f353e95c27476094aa037c06d987f72ab08ea5927af07bdffd24467a5f68,0502db50a5bfbbfac71e959bd4f372a47e83ab6a17a255b0e60b402c122b3fc8,04ee807da45b9a2a8a1cdd0148e1babb794e9e7584c55f370a2f723a16632c2f,79ed422a442f7b3a6b194660ec90560b742b9ba018c2bedd72d6d5a60b332c5a,07fdacdd8c1909fa7042e20ffe2d5f5bfcdbdb59ebf3e11886d02a5f0fbc05ed,361e57a73aec8cacee32496094263948fbd6a9d96e731fafec127eb9fd813f26,c36e6c40c3035c5dc4d8f015363c4591dff5a0e2065aa719c751cdde1a81bcbc,9bac59d959407ea715e81eb23ce43cc88e462c5a25ce525a5dd7b417ad7ea7d9,8dc69bf8158365d866d999fe69b6a7bd869961bafd09863b30d7d6a114bfc5b8,b00f70f3daa8b95576f82c3e59ecdd8558029ee49fe3f726a39d06a1e8fffebe,7ea988c095c4107824bced289ab7d21136e81dddac6a57af836e639135a08e05,966476658b04905c11608c684e267508c9f875f90bb03178b6b4b93ec2f98f13,f2d19b603793cc43563223651b218f8e465f1bfbbc803ac0982e75c8424e12e9,87610850a33a00749627bbc7c6e0aeff65813378733563d05b09333ed445ed54,b980b9789136661518c8864a2caf5f5ef7564408d05391888d25695d6bae1c9b,5fd10e734dd73befd2506c7a4b3d9c453366788763933a32ae7c8a1cec69c000,420858c69ef2cc9b5077f786392fecefbbd76501a8843ca13755a8efbfe6c6d2,6c6dd279e6b135970fe3352b41771341ddb0da7b41b5347b53004970ca2a07d7,247bf14ff84a4c498caeb9aaf249d186db1f84e19363a1a3f118801a57ba09e6,2d568b421ddbe5486bee08dd6d1c584f3311eed85dc714aea72efbc8f26b1b66,274b1391e2d9c3416515ecc8d10061cd1918f9fa9b7e91c7e96934e9cb6bc8a1,25fb97b440fd5a8c2148b8301eadb6419c1350003e4d9f2956a9e782a3e898d1,2d1bf699f5a8f2c5b2817eda0ef641947c6abbe7382fb888194e1d5fdad09566,330b374790e6d56d65f871ceb5a1779bc9859ddc29fd7bfd0d2e2a36936d9e98,3ad6891a7801438b4c695915e33ab8b7601e7f96074425b4dfc81ac76d6d09fa,8936901fa82ce332b699810e836e5320b0a0c5a267be7d875f991607a4eae282,d96bffa8ce37e4148483ff508f2a60b6629938db37b26664be8f4de4e8f9be27,7b4fde34ebe05d8c5a6c7c9bf0caa3971173bbbb62450179db376c1183325c65,4e38a924326b672f732602e8b926997eaf815cb8d9552ca8b2d694d0ceb74621,8d88853e489365132031f1c19f96787bb7955fadf3a33210222260c41b46fee9,73c500ead65ef2286b5140e06deb05ec11c78caa32954452e9ac50f01d4b1574,a8fbe2c40d74d690018dcbac28ce03edac5e5078d86544f04d422cb94b2dcc5b,3070a2343f71b624450db8bbdfa58ad1d4f20d171120fad69163ff68d969b36e,c4b2f358fc2cf8d771f8adc21419ed06fb3c2eafb8aaaf57f9f0036b71b24a79,8b33b6c3935ba61868fe6c3cc82dc09cf8956ca401e4081bb9070caaecd54a00,2440f69ab8f6f3a40c2bb83c8c11fdfbb69b32c6fb92a8059fc53f72c90a0fe7,dcb1b291ea41f4aa8f4632f62cfb20860a55bbcccd5b865bb36a8c0868763493,77fe31a59eddd7b925605d0081ae357da852d2530c820db0eea6418f826270ec,5a48b14d87fe45c7ef72def490db5cba84626720dcba876037241568ce75eb0b,28282b12ce1bf020a380fff1d6276f20533530ecc1fe666744c7761e80bdf7bf,f7965deadf987642563ceb0afe231c0ba0656547a83c3b2c58eb101cfc3b6df2,75f75d426cf3b26ddcf9d81e37ab8ef4e9421820f35abeec77e89fe2f229c713,df4ad30a4d19080ef444e9b86bcb539bfde6b6172254e6348e1f8677a6f8a2ff,72d98f1549d8125c6f98aa65ce936d978b7e46761c7b738ff162098b97ca22b4,07fc641ee6efc88323ef2928b263822f66b8bc844fcf686e8b6b809cc55cb28f,6fe314848cf6b71e3dfb97e81c58e8a5cfdd5c95907beba0d80cc733e338fc4d,edbb054b6a58f073de56cb76b962686aa3285cf0061dc1274c95d7d6091b3b33,600b8c1e159b5a119a8f2856c9da15f0cc407a9440c28a9c930b93319080e11e,dedfa5adaadbb507df7acd1aff8bf15e792556ef5a20f7ed8f2f733b50a2a94c,266161aee785bfce4cd62bb7f373f7f6c5843042aec46851858b15be81f99c01,a27b39e042e6b6d8a409c02ef510e87bb4fcd6d17a583465f1e3bdef8fd5ff66,bedc14158770ae8dbc3cf5e095890c1ae813a71519a1599e12d318c109a03d73,eb6c718e060181374cbaf61401df3fe4795b5ea7d69071ca54db7ec46b5f39d5,1db3779583cd8ddfebc1c33b9554c259e73ce94f352c8b9dc65d91b945f42508,9d178e34adcadf94b206f0d04956160e3e6f1aa621ee7e901f43d5b4993a268d,6852d1772470588b412382efa795fd3839c0b5f0d5c73db60ace8d9f0654f5ac,c16d4d475f5bbf6b0fefe2c737538109175d619e6fbf84fe0ddffaa107f49624,4a2d53b4176333403f606c59b12561716543c596455de1883a1a08648cfe5633,0abf8530e6570ac69c068b160acc807b660331fb7f206267891772e05784f080,ea085e3675b4f1ee23aee81d920d14168f7740c4dae404f081263200c582d5e5,d1f88d59c10f517a00f8379fe0dd5ff60fca94e5e5a077432ffbb6a2b6f85a13,43a471ba0c43af7bc0e53f487585fc7e44a4262bb0eca400038a875430847ce9,6a9a40995191d5bc3bdb32b7ae6af6b2541e55576cfafcd97c9bcd95da4b5340,e28698e18e49e481b8a92b4102cb259584d81edf3f73468c5ca5509d5b5874b9,007b899ee4ad9cf389a4db03ed5ec69e8a2c4648cec328f0c669425089186604,8ae572d8a53847a30f5e9f2ac5d734341c2fac4fd8f574b2b9d9b24817d6e372,f857a1374f3cb2c80661ecadaf5d0e3622e72d77d266aa7ad2801e7db335b969,2e9eba7803798b99de5e59a3cb207ca53180326d7dddc4f80460ef1e3bca9f22,6d2d8fdc6bebd8bb5aebf5f4008856c427fc9b077cedef06d7cabdbb35230090,e88f5a8743a1e2cc24c07bf93d2566293ec90dc3016d6d561ac359f200afcd7c,73d8e522befb3985d72f69876a3bd5bfd656ef442af8db63f24e3802fbf7453e,09dc75bc71fad01c85dc0c7a2dd4594ae3883bf5ef8155cd2856638bf467842b,69f06e1c5773eddc50d89714a081fd26d6c271355f609d171d90f09fdb6ad311,1e8fcdd32d547ec02338d40cefd09b02b28a4ae8f8972a4fafa158107f6a890c,79dffd0030e1dd9af958fe233cbdf1959ff3d749d863da8b92bf6d2edcd114ad,e089dab3bb2519de80cf8666f589e183f4ddf80f8778282694632499c093aaad,2f342899b6e2505b72a25f7f507298b4cd5b0400f9d034d45a95fa86d127b171,5b6767fdff5a39d92eeb8415eec49f48b958e9c38151ce4356d09e43f8b397e9,a70b2878df44bd3952d9da43fea40bb475d2a87d21b8d5750c2153163af39c0a,4526593e49e532e8e498a8b14c3ca15c1749dfac9cf39a0b44b4c18ddc319440,118502524e8a02d7c7ee2cb984b598f27afb3b7b78b92326b2fbfc3c53f48464,8379f7dc2c391ac38ea1d34ddff36faf5602bf128b6d93a3a8a6485b1d8dc23f,0c17a500636a9a94b405b8e9f2fcd45b058a4a9070c156332e429daf0379572b,7e302ffccaacae442283c86d2afdf7c240d19dc42c41440419c8b78efdfc9dec,a19467bab0f5a753e4daadd080e64f13c79bdabd7e403575f9f3d3b7b6ca66fa,4162c48bb1ba5e8dd38518f9d1007300e46348e01a97184e253a3250ed0f9ffb,c1e36882f77da60283f64d2590e3389497e6583fcdb61c21d352d522506a8882,64a4716a19fd7b8009a5e6d5924a74c65ef8e5f85c64345c7b89a4e6b6135e5b,8136dbac064d798c9e30bf31e62d74f99ffb37d3bd9f3d6d3c6544669ca3cded,790f8dfbe56b27d1b82b00bf96394caa4ef54263229bf3ee5b2aa891ec8b5676,7d060a4e92f2c1f4cd2546f5409cae2c946b70556b249455dc19fb93e8dcdb9d,8e62713fc4972433c63b1c0c19cc1d291471381b11183b40e450263956a4d1f8,46255b9d4d2059337f3949e4ada5c2d16ab8385f66967291e204175aa2120986,49023745977f47f7439c701985905ad2be42b2a89c070df73ea8dc7f9c5ae627,75e6c4c28e4dedef545bbe58ea2b497dffc90ed7fe6d7261287e90cd85a3fcfa,fee9501fc25e4c85c0d205473426d6e6f4e02eca002eab6513c6467885486fab,77f39047575527668b8c86defb3a15328d6f6289ffb1dce1b01fd1c9f193f739,59e80ebb2f5424610ffc9070e39c64805a1d6a44f52993eaf0b427b3a8494b99,bfddb6b1867c2d0cf3ed074ce94fadc786226f28f98f9f1d7ac5bd6a1e040f9b,4c6aae8655346883ce266665e0c61461636a128c8804d6aca78f9c8a35356fbe,bf4462bc1f0c88cd99e30a20c6b6eeae09f7a17a737314192aac8b40056e90e1,f448286e1d5a998965efeed87d8feffd6ecc3fc0a9a8658730da10715324f89c,7619cfb410a5bb992e9da50699a6cdd82a0279e27176ebf4c1c21c12dea2459a,48395b0355072b681c77cf4684dfa228f4009c4985d013908539e34d306bb4d5,6fa9d11c314c5430db8ac179f7e1517d754781522b94f2da800a3d9db8a191be,79462eb8641df40ec28d7ae89ec7f1d5548b7b0316fb03da682726b35bfdcf7d,dbb07ef67043d85768c04c5c68e98a88685bd2785a3b20ba574403397fdcd33d,5be705a5717f0ad7688077b80765f8eac1be081d07105c7ab342db817461213e,0314be8e3cfcc6f00f5a0b3ce074f844f8126692bc9db1951df722379ca37622,b225bede76fe85a80c30ec258bcff80f9226fc3b3c07e1c75aa43e38968c85b0,ecceb05c114658703ee5bda417b23ecedffc67129d59b52a4fb60b9aad8624ee,56d6e51283d0da2e6aa6d8a166178aa5bf97c0d6ad8b6514a2b1a8701a890a54,274754307e41b8a6333f8f2d9bc679640fdeaa6954c94d91b022185d2e0f64ca,1c303f25b84f7f63fba0c97dd1ebf1148c1968658dca21b27df47ae2b86c4c2b,04638bdc28da59d45407c756701e4285ad0487858e92b2e45ccf99ffafaaf73f,ed4d011b44c9801335df5d3b5550977b11a1e78ec7ad1ebb477ad2eb707ddefe,333a3f0c920bf95d95cfaaa069a17ccfb0998ebc5697764788642ecb69c1746c,c6db8bfb6ee98557377bf8886a12c5784f613a53db3c09c161938039706941f4,25c3e1dcd0d27d63978adcefe9f862d9be8e20ed44bd80c359ffe99bc72fb095,035d2f21a40a3c5f97be226cb26e792130ba0d56dfe472b5cd9e1fd0b5d557f8,16411af320b57bac481c370cab692121e93edc942c2a6851c64737951a9594a7,43cc758c0134246a8a9e7db3f08a63709f0db02cb8431c21319e832845e3bdfe,3d9149f5c36eee7b661628d69b8d3e323b4fed8f544f8ca7b1bb575de94d465d,85ce96c84ff64f03e0c8b72dc9d6f2a4679c034836368345e22ffd0a170ad62f,2691d4f78bedcd4a6f6fa39c45a0109e4a11ce7603c656b53cca835d3863e06a,cbd21277046ea7f4572d6e8149077713575239ccf8a98c56b162b633a6490cf2,30335f29996cecf0747bf4e2b44f8ee3959e4cc277317d48e80f7726a85d87ef,afbde53c640182877df7eb5955d42669c5aa54e65ba304d6bdfb1be002cda374,d053a7b55ccdbf594d95fa053a1dd93d41a72e9c29b15b68e571e482d33277a4,3ae128f7b953405c2cd293c2e62a9c99914a7ed69d84c927c518bb9fc21b74d5,ab43d526f1dc6a32395c49806c8bc73bae918a5f3cb5fc1d0f99cc32e8d45867,7c5151e7116ff12d2325c9b2e98256e43802f6c4a15584be250aecbf143f50e3,5ee1a8ac394732056708b628216815b744eb5fefcff8426eb48d682ae7fe0bdb,e1f06ae08a52e1e4e7544d0ee343d33ba6ea5a71d7ce00c56a3f14058a199d78,771032904be77e19c389ae615a39e78aed70ae8e233edd8f3d5aafee1e4691df,cf0dfd60ef8f949ec0168439c7022546c5f00634e7fdd668900bcad1e2e81756,84bb868f3ec690f914e3a8cde683b55653e554bf5ae6516304ca95e3e0be0ce9,2e6bb4a91f7df30a0fe05ad3d02ea64b6a571a089ecd6e1a2caf900e5175949e,566cf7e6d6419fff93e8f18bd34b7fdb2db9b2d4191434e37a97e3a5cd00b186,912729b57611e1422879af83c5d11bb416c0b98fa83dc392bae590d7e90d5d12,54a7f54922ffc66260dcf30076c4cc7fa254cc9b830b2e37349d7b40f0d67231,d2cdfe1068809e2e519bec2fb30eff036085ed0fd5a174157f4a531be489a9c4,00c19bdcfabceeef4ab4c71251f41d59173c43b87ef0e968e7aa5bcf77fc3aa3,00a1b917cf86485c9e86030ec1afe9b7e28a4345f46471b92b4e0d08b698bae5,17b23ef7d38a3a0334ef68087a585ac48956984f6e0321c62d30011368954485,1fb0c2d4d015596c3439f405da4a7a2497ba94cdecb535e70cfda08c6a764f4f,993c1131175eb1f3b8b5d1d72ea5addac559a20b5154838ee86aa9b71e06652e,2ede50271add1f8aa5b91bcd222d83eecea7f4a524c9e62ec01cd889a55aad45,20ada1b4fe496096230fec2c00bff8a037db5079c6f45955317df9c2ede5f85b,b37b8821965b243026b83a59ea4e4e2246545fbcc1100d8effeca612a3b6bb4a,0760c516052f81058efd89aa11573c744ffd4f5685e11e9e200bd0ba0228ee34,fc3cc3b0dc5592a8c0a2e41d3ba995c0f65efbf2797c2b7b2403bd2c552acd64,0475e984bf932adabb1fe98d943ad23fd56e4bd53c2e7bbb12ea69b7996430be,d60ec04ea36dab7f685a2dc50c2f76ede60a6b594b15317d7e32d2438eef36ef,13dbd661bb4f0bc0854b761b94470f2c8d3ea069c2b2c53d07f40da9668515a2,875472cab949b679152079e79cd06ad376c30f4c298b2f7e191f5f7ef3aa1ccf,bfc95afeb7c01ea29780954bc62c9830af90e4a8882b64d24e65d7c30e075e48,4d100b664eee670a68d88d07bab4ca55dad28da862b2af631b29d5031920e10d,1275cde34b3de398a87fccd8bfa2261f826983ea774a0a413843f9de07beac70,b3cc121e4d7f7bc008ecd7d79b2f08d32c34c036c64678ae7cc43112b4297210,46a13985c51e2cae515be2a8f1eb0b42fea64cf366057a611cee74aaa7c648e3,df40e86985f66578e1ca70bea1c1a58b943c3b37bae49f639a547e759239513a,448cb5c2de497679de2161a93b5e0983a6030a33a59eee2b3171c56a93bc91d6,e6b371651baf1c9773ee1e240d51deda5f237e8da74048af9f3379f70f1c8e2f,d24ec5de76732220049843cf0ce87053bdfb223d8e45cdbf83a8d801ed486850,4131794225ae70468171aefddf3e5875a8ab294263ae4694f93a68e8314b0b5c,f5958acf10e9d5f12d9b0349bda1e652273977c36e1ad59c383bbfb512abcac9,19dea7117e47e557bca2019c09173879bde7a9703e7577ec5bf2270fec6aca6e,3cc640e6348efd77de2a22367f609c2f68551d4cb917f27c32c2dbc422827dfa,61d21b2cb4586c4ce3178f6ea51d905d9d00d79d85ccea52e5f4223811e12a44,44e06b75ecca6b3a9f91813c716c0f61f5990f498c5ed17a41ddfcdc0db48368,8da1c8bd377bb3892265639b26a72b7780393a8a43f6471a5eb1abd1ec88ef3d,f5e58a733b69af1ef5fe8a9a580b3790a792e44ad32a29e98d9f7f142862b298,d1e1dc03f1d6d75da644b8a14f8e7d3906b47d50968273f0707142bdd810de1c,d1869756e1200628a18e401e9510a9f78604ce91faf67c2e759a7b28c6eb882f,60dca01fbd010aef036b6ba742978ebacd1c49ba999e06f1b7985c5c0e96055f,c731ad94fa972ca5a7bc709d2cccf187ba47bc6299dcf3301b62990064e04fa2,d1cffa5c6c044dd22a8a0990545ac7bf5edf04b38820230af853949612ef7075,cc351a659c1718306c90276e7a58697709b69d2dd06af2dec6891ac77ac62a3c,82738ee011e454410ea714fbeccad19fe15dba4e62b7d1b85e65e7f8ed2e6286,2d2f067acea2451a17ad0f2beeefcc768dbf52a01f437a5066f49fac1d3eb312,fabad1b8e1b3a3e11810c408f748a7e70449f4274aaaaaf69b11ffeaff1504e7,4ab824b1479ec872488f501374e22488e0b8b4612ea16cca5208783016af9858,1b5dcad92079e86412309d5f85b01631a7aa3d7eda261080531cdeb89c96bcdb,a1809967d96449a3535d19e509fc3ae58b714805141f6487aaf06a7b00f47dc2,081fde0ec6f26348e2626daf44d932bc31d3ac3cc6546061484f9f68b0499422,c3d10191066b94c7a89f91f75fc9aea86e17ac5894fecb8c0698957771d196da,b5474f0aebab60ca12d4f8097a499f3fc063ad6146eb6db4191bc05ce82312ed,147a78e0d0d68aa642b97ba83e7b45ff5b367341f0a0a4f551f593f3ed8855db,47b2514697f7793be6f9ed37ff3cee74a4d1a3012d468c6069c50b6681ec07d1,d59ee71f32fc530efbc54952356a1e564e7fb077b9323bc032f6cacd7ed47917,f0c7fa099c97483728d04f577f5b1462443136e52b9434b5875e00984eab9fc6,a8d103d654099371f1a97f34cfe997683000cf2e7a525376d6af1ac2b75d71ac,cc5f68d406097c09e8d86b667213f52b77d3e0e543c86e3dbede40e8c1f7490d,b495595a4d94415ad9e3c6fbcb8589ddbaffa7d0c9077fcfe261efecc76bc957,f4359ca550fc3fd61f08b20e7714d37f1ea257a2d548fcc6a40cbf1bbc4bfc2b`\n"}]}}],"fee":{"gas_wanted":"20000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"LA/Slr79DiWiFEV3MkZe5bjwMa4s/LkI56Tg8RxvzHU0yzHZIN/3kV8jTW7QuISbHD2tNyB9GQG+rzkGOUnJFg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"entry","path":"gno.land/r/leon/v2/raffle/entry","files":[{"name":"entry.gno","body":"package entry\n\nimport \"gno.land/r/leon/v2/raffle\"\n\nfunc init() {\n\traffle.RegisterCode(testCode)\n}\n\nconst testCode = \"qd0bJ6HTSV\"\n"}]},"deposit":""}],"fee":{"gas_wanted":"8000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"itcZMQe8I4VvwbftgCxbr7yC4oRVq8OejPOWNt3ZYlwq9XfeT8Feb4bZGdYyQ64qajKjViaqL6wfqnj34//z7g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/v2/raffle","func":"RegisterUsername","args":["leohhhn"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"rqsFQyZlQ6HzBI7SESvXowyZUsVqnpyR00vwM7efDapCCHQrlQ/K7tKYgBJ84YVzyXK8G2CZqJoE3Ul98CjE5w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1sj0ykeeej73v29qvpqtumyyj2smfklcc92qqmv","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"7hqZGtGkQ5fxdqZNdjLW76R8YwzS1gK/JXJpH0AKcYZFSeYqrWNgAn66sZuSL2T6iOVmmW6zsizK6izQBXGBrg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1sj0ykeeej73v29qvpqtumyyj2smfklcc92qqmv","package":{"name":"tsrf","path":"gno.land/r/deelawn/tsrf","files":[{"name":"package.gno","body":"package deelawn\n\nimport \"gno.land/r/leon/v2/raffle/raffle\"\n\nfunc Register(code string) {\n\treturn raffle.RegisterCode(code)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1kvMWtvSBrIVsYtE5hwIKuCxDUZjR1DYmAC/Y+0XYxo"},"signature":"fJ/kbfYTdnQJrvUn+owqD35w37r6YrsiKzu1XGhDnG5UOSBRMnh8cuoaS0lHLBxN5DDONDx6I7N8fQVxVkx3IA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1sj0ykeeej73v29qvpqtumyyj2smfklcc92qqmv","package":{"name":"tsrf","path":"gno.land/r/deelawn/tsrf","files":[{"name":"package.gno","body":"package deelawn\n\nimport \"gno.land/r/leon/v2/raffle\"\n\nfunc Register(code string) {\n\treturn raffle.RegisterCode(code)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1kvMWtvSBrIVsYtE5hwIKuCxDUZjR1DYmAC/Y+0XYxo"},"signature":"NiJvHIENu9c9fFI3yzO55nZsqOvCBkjccYC/+mzJbEo3rynVsPq7HllE4faitsfjB5hVcDvUnjaC8JxE5GR8ng=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1sj0ykeeej73v29qvpqtumyyj2smfklcc92qqmv","package":{"name":"tsrf","path":"gno.land/r/deelawn/tsrf","files":[{"name":"package.gno","body":"package deelawn\n\nimport \"gno.land/r/leon/v2/raffle\"\n\nfunc Register(code string) string {\n\treturn raffle.RegisterCode(code)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1kvMWtvSBrIVsYtE5hwIKuCxDUZjR1DYmAC/Y+0XYxo"},"signature":"16oAqokDDdsVkUAi3g1gN3YkoScCp5xwSAVW8KO7KOhWQz0gqDHZnGayIDDTsfrAR3KZv2pdAEY+e0CTkE2jFg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1sj0ykeeej73v29qvpqtumyyj2smfklcc92qqmv","package":{"name":"tsrf","path":"gno.land/r/deelawn/tsrf","files":[{"name":"package.gno","body":"package tsrf\n\nimport \"gno.land/r/leon/v2/raffle\"\n\nfunc Register(code string) string {\n\treturn raffle.RegisterCode(code)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1kvMWtvSBrIVsYtE5hwIKuCxDUZjR1DYmAC/Y+0XYxo"},"signature":"rV9JMQOQVvAfnwY7bPgTRxU/SSChjphvEZx73jEB2EhFQtSulcl8Y0FRbUy4daPAqeNdNT13982t35GWm0qojg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1sj0ykeeej73v29qvpqtumyyj2smfklcc92qqmv","send":"","pkg_path":"gno.land/r/deelawn/tsrf","func":"Register","args":["FmA%ciVK?0"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1kvMWtvSBrIVsYtE5hwIKuCxDUZjR1DYmAC/Y+0XYxo"},"signature":"5XEYzxsGQPFn4tPC1axakWiFRCbttFZcWq97yFV6+jZ8eXXLea4ci52ZOhggWKUul3hpILildXpOHuP5mQjNMg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1sj0ykeeej73v29qvpqtumyyj2smfklcc92qqmv","send":"","pkg_path":"gno.land/r/leon/v2/raffle","func":"RegisterUsername","args":["deelawn"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1kvMWtvSBrIVsYtE5hwIKuCxDUZjR1DYmAC/Y+0XYxo"},"signature":"uhFmJpBwc4tczlSI4gkDTyryGm5DZLMBQJ3p3DnTE0AXSasP/Bh/+mkaUOcbv+F+I2JRl2I1h+dTPUwojGWFKQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1funduumqq78th3kxktewc32qrwljzd34dqs476","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"iZQjDhg+5lZmvLJCD45OpUY1eqYspDTaXr7sUiok/dZg+7W8yugsUT6H1ceMAEKT1gB4wh9/uA+fixp97Kb4Wg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1funduumqq78th3kxktewc32qrwljzd34dqs476","package":{"name":"hello","path":"gno.land/r/lascoteca/hello","files":[{"name":"package.gno","body":"package hello\n\nimport (\n\t\"gno.land/r/leon/v2/raffle\"\n)\n\nfunc init() {\n\tprintln(raffle.RegisterCode(\"NAfM!g93kq\"))\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1dFEGC1VR7YGsbryGVtKUjvKs0O2B1vpQ8tU59L6tla"},"signature":"DIV9B3lHwgTOmN2I/QBOzTBZza+NVqLBudlVXPqwiPRWY0EeGI6WMEnWPeT9WGBMN4IO6bWZYf/YJVlkwbjO6Q=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1funduumqq78th3kxktewc32qrwljzd34dqs476","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"4000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1dFEGC1VR7YGsbryGVtKUjvKs0O2B1vpQ8tU59L6tla"},"signature":"2TQnDDDO3X1rO/AHEcN97u26k00eLDUeUQI/BM6PL31WPUL5TLxxbepc7KWPVfKcfJklQf2Qqp9JPAXB6D7Y1g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","package":{"name":"cshijack","path":"gno.land/r/manfred/cshijack","files":[{"name":"hijack.gno","body":"package cshijack\n\nimport \"gno.land/r/leon/v2/raffle\"\n\nfunc RegisterCode(code string) string {\n\treturn raffle.RegisterCode(code)\n}\n\nfunc RegisterUsername(username string) string {\n\treturn raffle.RegisterCode(username)\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"KUAvD0az0VeBi/0r1BQuili7+KM9G2BqQ07EqTBmp59rcUSOTSsbAv5wPnFaIZp5/14FPsC9FFoLbOMVfQbkZw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","package":{"name":"cshijack","path":"gno.land/r/manfred/cshijack","files":[{"name":"hijack.gno","body":"package cshijack\n\nimport \"gno.land/r/leon/v2/raffle\"\n\nfunc RegisterCode(code string) string {\n\treturn raffle.RegisterCode(code)\n}\n\nfunc RegisterUsername(username string) string {\n\treturn raffle.RegisterCode(username)\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"2000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"a4jRYb6idmK8K1qYypqYVV8KD/AjFsALLMWs6offoJpNNrHO/gS2/pCOC7zWeA025xpe65XbVsZCPiAFaHKXMA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","package":{"name":"cshijack","path":"gno.land/r/manfred/cshijack","files":[{"name":"hijack.gno","body":"package cshijack\n\nimport \"gno.land/r/leon/v2/raffle\"\n\nfunc RegisterCode(code string) string {\n\treturn raffle.RegisterCode(code)\n}\n\nfunc RegisterUsername(username string) string {\n\treturn raffle.RegisterCode(username)\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"2000000","gas_fee":"100000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"wtu6IZC/d6XmjrwNa7D787WBQE/YGpUeTfobyw/iOIUcnKUFO96nNKGVod/kvnySzF6LRus0wbedawT7Jv99XA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","package":{"name":"cshijack","path":"gno.land/r/manfred/cshijack","files":[{"name":"hijack.gno","body":"package cshijack\n\nimport \"gno.land/r/leon/v2/raffle\"\n\nfunc RegisterCode(code string) string {\n\treturn raffle.RegisterCode(code)\n}\n\nfunc RegisterUsername(username string) string {\n\treturn raffle.RegisterCode(username)\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"20000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"0XOoc74iyiDJ/KrFeaoa5J6TasUkqtwDWeNnztts/9hXBEI0OCFV9eFS23IN2Xk7AK8b6CgMfsYC5lxIfaXiGQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"main","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":[{"name":"maketx_run.gno","body":"package main\n\n// import \"gno.land/r/leon/v2/raffle\"\nimport raffle \"gno.land/r/manfred/cshijack\"\n\nfunc main() {\n\traffle.RegisterCode(\"sxijq4M0As\")\n}\n"}]}}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"BQEEmLf4J49b3AwCxEuOyLzKoftDX/7hgq1St3o0MKhHlgDvpNd4kGU6g/TYZ65KimLONdFMfylAcrvQGwxbsQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"main","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":[{"name":"maketx_run.gno","body":"package main\n\n// import \"gno.land/r/leon/v2/raffle\"\nimport raffle \"gno.land/r/manfred/cshijack\"\n\nfunc main() {\n\traffle.RegisterCode(\"sxijq4M0As\")\n}\n"}]}}],"fee":{"gas_wanted":"20000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"hQ1p9fxyqiB6RrydyRBwrUTn2ua3g52F3A+aoccmCGUUXouhwz0vN1kTbx7UvalwzRFKbW4nRrNwdh1Kd1k3vg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","package":{"name":"cshijack","path":"gno.land/r/manfred/v2/cshijack","files":[{"name":"hijack.gno","body":"package cshijack\n\nimport \"gno.land/r/leon/v2/raffle\"\n\nfunc RegisterCode(code string) string {\n\treturn raffle.RegisterCode(code)\n}\n\nfunc RegisterUsername(username string) string {\n\treturn raffle.RegisterUsername(username)\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"20000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"xYjKHuDQ8ojTKEKSuScIWXN4g+D1q6DsGKYMG5oxqcVgR/BJu04A1k2qyVzrAl8yYchTzEAXR8MRsbYIdwEUEQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"main","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":[{"name":"maketx_run.gno","body":"package main\n\n// import \"gno.land/r/leon/v2/raffle\"\nimport raffle \"gno.land/r/manfred/v2/cshijack\"\n\nfunc main() {\n\t// raffle.RegisterCode(\"sxijq4M0As\")\n\traffle.RegisterUsername(\"moul\")\n}\n"}]}}],"fee":{"gas_wanted":"20000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"xp0xlFT1wNe3R3yQNBa8fwVvDlHKaUEYTA8YhMQfH49XrTj655hSK3hxyhH+Fyx45rwKj9x+LY+aYUSVhfxR9w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1funduumqq78th3kxktewc32qrwljzd34dqs476","package":{"name":"hello","path":"gno.land/r/hello123123/hello","files":[{"name":"package.gno","body":"package hello\n\nimport (\n\t\"gno.land/r/leon/v2/raffle\"\n)\n\nfunc init() {\n\tprintln(raffle.RegisterUsername(\"thehowl\"))\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1dFEGC1VR7YGsbryGVtKUjvKs0O2B1vpQ8tU59L6tla"},"signature":"ESzaggNcB+GCDR/0DGZwsa0QlSw4PJp7ZJ2lcIDnHR9lfCjRymLt7+YocRXraG2qL4fhWcU5wCizWGvaCNB87A=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1funduumqq78th3kxktewc32qrwljzd34dqs476","package":{"name":"hello","path":"gno.land/r/hello1231kkk/hello","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1dFEGC1VR7YGsbryGVtKUjvKs0O2B1vpQ8tU59L6tla"},"signature":"TjwIP4hi8Dzo01lQD4ja+Y2CfYK2IaPt9ZJOwH3hxTZ3qwS4R1cgUhkRVPEXG8VrwY7tNzB56i9bzSBdT563Pg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1qvcgkjdzqx3cx3e0rxrx6xnzfx5cwjg5hy6e40","package":{"name":"entry","path":"gno.land/r/SamRecruits/entry","files":[{"name":"package.gno","body":"package entry\n\nimport \"gno.land/r/leon/v2/raffle\"\n\nfunc init() {\n raffle.RegisterCode(\"5FfRZVk*^W\")\n}\n\nfunc Render(path string) string {\n return \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AtDAj+lke89N5zvwszGAVe8+Hi6Jamuez4bQDwcMNi5D"},"signature":"SCwmVnwjioKdqCgvAOOtZ7apBkDIwHGqrkMo9l/B7dYi46HAS1DQxbvX+6JHngLLjWH60lt2lM9ys7/uIu4+LQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1qvcgkjdzqx3cx3e0rxrx6xnzfx5cwjg5hy6e40","package":{"name":"entry","path":"gno.land/r/samrecruits/entry","files":[{"name":"package.gno","body":"package entry\n\nimport \"gno.land/r/leon/v2/raffle\"\n\nfunc init() {\n\traffle.RegisterCode(\"5FfRZVk*^W\")\n}\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AtDAj+lke89N5zvwszGAVe8+Hi6Jamuez4bQDwcMNi5D"},"signature":"NbvAWWAWp3RuBNSj7oKWC/fJfUCrcBGWwaPpk2FBrZBuMBbWyBPBWyT8xf/ptno+XWigQyV2emMhxG97kHn61w=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1qvcgkjdzqx3cx3e0rxrx6xnzfx5cwjg5hy6e40","send":"","pkg_path":"gno.land/r/leon/v2/raffle","func":"RegisterUsername","args":["samrecruits"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AtDAj+lke89N5zvwszGAVe8+Hi6Jamuez4bQDwcMNi5D"},"signature":"0HGCpRP8rW/QXFs1yIywo9okGwW4hFim2UlkHnUM2yVYpNps09e7s+fDmT8rfjo9Y6OINvKcj8f50+5IV+10oQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/v2/raffle","func":"UploadRandomness","args":["8493820","7928472904"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"q52xccuwCDgee4D5ltCYLRE5AdXybSOb1yEgKC/5eqcmETlDXTRgFXGGTAOqPVDuxPWmK7jyizj4pMA+Ycl+ng=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/v2/raffle","func":"PickWinner1","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"xVpcZoD95vNKr4uzVNholT4ktDc21JcBAZIkwIs8aVA5LkO5pTiPNOEh5UzhqgeMH8JaZUCbX0BBmw8xVtzRmw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/v2/raffle","func":"PickWinner1","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"SMVSgDWdgz3kpvkCkIudbzIZSupa/uvsQ6QuaM9ZFjoXuez+mvVYWosYQSGz8EsZ7o6McMyhAFS3zZ5WWh6xKg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/v2/raffle","func":"PickWinner2","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"5JMPLix4x+ehbsL1CruiDVFWOuMdsgT5y3LBaJkdDTxrZUpQl87B1OS9+x2gmq+SuZaT8V6bHD0ckqXKHcFodQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1cz2tc8e900zzr0lwegnd2vwnh3d57cds0t632u","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"kUFHYiTMX9RbtC5pIgYVf3PvB/rAgamYHmu7kPW/HMhHCI6sWfkSOBXTvXMD50cDgLnpwbne5mBVF2TObES9KA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1cz2tc8e900zzr0lwegnd2vwnh3d57cds0t632u","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"/f+0pv6nzGTO891r7ELQ6FediVtZJnz0fwUQDvh6eEk4+5mu/E5YUimLBIkbWYJVM8vxBHo9cME73VDcJubZcA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1z5225q6e7qjtmexjmakkn86r66lw94r0gajyn9","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"NaPjq1ThWKQDBH4I7ZZBIejzkDs6DEcfy5JdD1IBhMY5RT2Rl2uT5SGcL1y9XKEsvLL3GANgwCBlz6tsMODL/Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ckanw7sgnyfyqygunjjk9hp7mmlqvkxhsjdxya","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"C2fAU9ElXAssga3i7Wu4kQmZVQ38kzugmdtLtwuMBy5CrnLXSyHx1xppCOEhxQ0ggeJZMgEoP966kzbLxsGlAw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1z5225q6e7qjtmexjmakkn86r66lw94r0gajyn9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"POTBrQjpDE/h0mxLUWTwXyDV4Hc7452444Y/UHvdp+ghOzqNfpAaqcMF6TfwzKJYz5yd+xylsM1tjOei5VAEkw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1ckanw7sgnyfyqygunjjk9hp7mmlqvkxhsjdxya","send":"","pkg_path":"gno.land/r/demo/userbook","func":"SignUp","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A48IBr/3QqKP5cV5Gu8w4ji7/WxMQT+hYKwI47e4w3v/"},"signature":"OC5lTcQbErCMpISTt+qdeZT2chzuTLiheXcYs9hDiN8l7UZ7UQJAW/StlBHA9DzcCeTwj9nj3EUTzW48JBERPw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","amount":"3000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"Hhh0ern3nwGzuzYpC8xy5GziYFwTOOpSl7hOjhJ0VnBaK+D7GlG1U+y5saxhORV5I3iefRNtI1i98ZDulKKtew=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"count","path":"gno.land/r/leon/hello/count","files":[{"name":"package.gno","body":"package hello\n\nimport \"strconv\"\n\nvar count int\n\nfunc Increment() {\n\tcount += 1\n}\n\nfunc Render(path string) string {\n\treturn \"Count: \" + strconv.Itoa(count)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"+45Jxhtq55IRouJHWORFWQNu8PfAg9k2zUk1S6wTmsQpSH8AFnxCSz9K6SZui3empTV1MYP6o98HYKkCU6plMA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f","package":{"name":"hello","path":"gno.land/r/demo/hello","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgRVZeBhCNiXMgeopMseJTFgTUwWKdw1TibC+g1lyO3E"},"signature":"oaPXQKY1vdoTFjzaqTx95mJt3oIcwksPvJOUBCVvdXg9ZbvChi3FBDP2n7516joZw1NWLlChHHjoxdUVqdB+7A=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"raffle","path":"gno.land/r/gc24/raffle","files":[{"name":"gno.mod","body":"module gno.land/r/gc24/raffle\n\nrequire (\n\tgno.land/p/demo/ownable v0.0.0-latest\n\tgno.land/p/demo/testutils v0.0.0-latest\n\tgno.land/p/demo/ufmt v0.0.0-latest\n)\n"},{"name":"raffle.gno","body":"package raffle\n\nimport (\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"math/rand\"\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/ownable\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\n// EntryData is the main struct that contains all data on raffle entries\ntype EntryData struct {\n\ttxorigin std.Address\n\tcaller std.Realm\n\traffleCode string\n\tcodeHash string\n\tghUsername string\n}\n\n// Top-level variables are automatically persisted to storage\nvar (\n\to *ownable.Ownable // admin of the raffle realm\n\tpartialEntries []*EntryData // keeps registered partialEntries\n\tcompleteEntries []*EntryData // keeps complete registrations: valid code + gh username\n\tcodeHashes []string // valid code hashes\n\tregisteredHashes map[string]struct{} // tracks if a code has been registered before\n\twinner1, winner2 *EntryData // storing raffle winners\n\tnumReg int\n\trandSource *rand.Rand\n)\n\n// Nothing to see here, just some constants, move on :)\nconst (\n\tcodeLength = 10\n\tamtOfCodes = 300\n)\n\n// Hello! This is where you register your raffle code!\n// Calling RegisterCode is the first step for entering the raffle.\n// It allows you to register a specific raffle code and connect your address to it.\n// RegisterCode only be called via other code; you should figure out a way to do it.\nfunc RegisterCode(code string) string {\n\tif code == \"\" \u0026\u0026 len(code) != codeLength {\n\t\tpanic(\"invalid code: \" + code)\n\t}\n\n\tcaller := std.PrevRealm() // save realm used to call\n\torigin := std.GetOrigCaller() // save deployer of realm\n\n\t// Deny non-code entries\n\tif caller.IsUser() {\n\t\tpanic(\"denied; can only be called from within code\")\n\t}\n\n\t// Get sha256 of code\n\thash := sha256.Sum256([]byte(code))\n\thashString := hex.EncodeToString(hash[:])\n\n\t// Check if code has already been registered\n\tif _, ok := registeredHashes[hashString]; ok {\n\t\tpanic(\"code already registered: \" + code)\n\t}\n\n\t// Check if the gopher has already registered another raffle code\n\tif originExists(origin) {\n\t\tpanic(\"you cannot register more than one code!\")\n\t}\n\n\t// Try to find the hash in the official hash list\n\tvar found bool\n\tfor _, ch := range codeHashes {\n\t\tif ch == hashString {\n\t\t\tfound = true\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif !found {\n\t\tpanic(\"specified code is not a valid raffle code: \" + code)\n\t}\n\n\tentry := \u0026EntryData{\n\t\ttxorigin: origin,\n\t\tcaller: caller,\n\t\traffleCode: code,\n\t\tcodeHash: hashString,\n\t\tghUsername: \"\",\n\t}\n\n\t// Save to hash tracker\n\tregisteredHashes[hashString] = struct{}{}\n\n\t// Save raffle entry\n\tpartialEntries = append(partialEntries, entry)\n\n\treturn ufmt.Sprintf(\"Successfully registered raffle code!\\n%s\\nRegister your username to complete your raffle entry.\", entry.String())\n}\n\n// Somewhat similar to Go, init() executes upon deployment of your code.\n// Hint: maybe you can use init() in your code to execute RegisterCode() upon deployment via play.gno.land?\nfunc init() {\n\t// Set admin address\n\to = ownable.NewWithAddress(\"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5\")\n\n\tpartialEntries = make([]*EntryData, 0)\n\tcompleteEntries = make([]*EntryData, 0)\n\tregisteredHashes = make(map[string]struct{})\n\tcodeHashes = make([]string, 300)\n}\n\n// RegisterUsername registers a GitHub username to an already existing entry\n// Hint: you can call this function just like you did with RegisterCode(), or via gno.studio/connect :)\n// If you use Connect, make sure you're on the Portal Loop network, and you've navigated to the correct path!\nfunc RegisterUsername(username string) string {\n\tif username == \"\" {\n\t\tpanic(\"invalid username: \" + username)\n\t}\n\n\torigin := std.GetOrigCaller()\n\n\tfor _, entry := range partialEntries {\n\t\tif entry.txorigin == origin { // this will check if you're using the same address as when registering the raffle code ;)\n\t\t\tif entry.ghUsername != \"\" {\n\t\t\t\tpanic(\"you cannot register your username twice!\")\n\t\t\t}\n\n\t\t\tentry.ghUsername = username\n\t\t\tcompleteEntries = append(completeEntries, entry)\n\t\t\tnumReg += 1\n\t\t\treturn ufmt.Sprintf(\"successfully registered %s for address %s\", username, entry.txorigin)\n\t\t}\n\t}\n\n\tpanic(\"could not find entry for caller address; did you register your raffle code yet?\")\n}\n\n// Admin stuff\n\nfunc PickWinner1() string {\n\to.AssertCallerIsOwner()\n\twinner1 = pickWinner()\n\n\treturn winner1.ghUsername\n}\n\nfunc PickWinner2() string {\n\to.AssertCallerIsOwner()\n\twinner2 = pickWinner()\n\n\treturn winner2.ghUsername\n}\n\nfunc UploadCodeHashes(delimCodes string) {\n\to.AssertCallerIsOwner()\n\n\ttokens := strings.Split(delimCodes, \",\")\n\n\tif len(tokens) != amtOfCodes {\n\t\tpanic(ufmt.Sprintf(\"invalid amount of codes; wanted %d got %d\", amtOfCodes, len(tokens)))\n\t}\n\n\tcopy(codeHashes, tokens)\n}\n\nfunc UploadRandomness(x, y uint64) {\n\to.AssertCallerIsOwner()\n\n\trandSource = rand.New(rand.NewPCG(x, y))\n}\n\n// Rendering\n\nfunc Render(_ string) string {\n\toutput := \"# Raffle - GopherCon US 2024\\n\\n\"\n\n\toutput += renderStats()\n\n\tif winner1 != nil || winner2 != nil {\n\t\toutput += renderWinners()\n\t}\n\n\toutput += RenderGuide()\n\n\treturn output\n}\n\nfunc renderStats() string {\n\toutput := \"\"\n\n\toutput += \"### Raffle Stats\\n\\n\"\n\n\toutput += `\u003cdiv class=\"columns-3\"\u003e`\n\n\toutput += `\u003cdiv class=\"column\"\u003e` // Latest codes\n\toutput += renderLatestCodesWidget(5)\n\toutput += `\u003c/div\u003e` // close Latest codes\n\n\toutput += `\u003cdiv class=\"column\"\u003e` // Latest usernames\n\toutput += renderLatestUsernamesWidget(5)\n\toutput += `\u003c/div\u003e` // close Latest usernames\n\n\toutput += `\u003cdiv class=\"column\"\u003e` // Chances\n\toutput += renderChances()\n\toutput += `\u003c/div\u003e` // close Chances\n\n\toutput += `\u003c/div\u003e` // close columns-3\n\n\toutput += \"\\n\\n\"\n\toutput += \"---\" // close section\n\n\toutput += \"\\n\"\n\n\treturn output\n}\n\nfunc renderChances() string {\n\toutput := \"\\n\\n#### Chances\\n\\n\"\n\n\toutput += ufmt.Sprintf(\"- Users in the raffle: %d\\n\\n\", numReg)\n\n\tif numReg \u003e 0 {\n\t\toutput += ufmt.Sprintf(\"- Chance of winning: 2:%d\\n\\n\", numReg)\n\t}\n\n\treturn output\n}\n\nfunc renderLatestCodesWidget(amt int) string {\n\toutput := \"\\n\\n#### Latest codes\\n\\n\"\n\tpeNum := len(partialEntries)\n\n\tif peNum == 0 {\n\t\toutput += \"No codes registered yet.\"\n\t\treturn output\n\t}\n\n\tif peNum \u003c amt {\n\t\tamt = peNum\n\t}\n\n\tfor i := peNum - 1; i \u003e= peNum-amt; i-- {\n\t\toutput += ufmt.Sprintf(\"- `%s`\\n\\n\", partialEntries[i].raffleCode)\n\t}\n\n\treturn output\n}\n\nfunc renderLatestUsernamesWidget(amt int) string {\n\toutput := \"\\n\\n#### Latest usernames\\n\\n\"\n\tceNum := len(completeEntries)\n\n\tif winner1 != nil || winner2 != nil {\n\t\toutput += \"Winners are chosen!\"\n\t\treturn output\n\t}\n\n\tif ceNum == 0 {\n\t\toutput += \"No usernames registered yet.\"\n\t\treturn output\n\t}\n\n\tif ceNum \u003c amt {\n\t\tamt = ceNum\n\t}\n\n\tfor i := ceNum - 1; i \u003e= ceNum-amt; i-- {\n\t\toutput += ufmt.Sprintf(\"- `%s`\\n\\n\", completeEntries[i].ghUsername)\n\t}\n\n\treturn output\n}\n\nfunc renderWinners() string {\n\toutput := \"\\n\\n# Winners\\n\\n\"\n\n\tif winner1 != nil {\n\t\toutput += ufmt.Sprintf(\"### Winner 1: `@%s`\\n\\n\", winner1.ghUsername)\n\t}\n\n\tif winner2 != nil {\n\t\toutput += ufmt.Sprintf(\"### Winner 2: `@%s`\\n\\n\", winner2.ghUsername)\n\t}\n\n\toutput += \"## Congratulations! Come to the booth and show us your GitHub account!\\n\\n\"\n\n\toutput += \"---\\n\\n\"\n\n\treturn output\n}\n\n// Helpers\n\nfunc (entry *EntryData) String() string {\n\treturn ufmt.Sprintf(\"Address: %s\\nRealm Path: %s\\nCode: %s\\nHash: %s\\nGitHub username: %s\\n\",\n\t\tentry.txorigin.String(),\n\t\tentry.caller.PkgPath(),\n\t\tentry.raffleCode,\n\t\tentry.codeHash,\n\t\tentry.ghUsername,\n\t)\n}\n\nfunc pickWinner() *EntryData {\n\tif len(completeEntries) == 0 {\n\t\tpanic(\"No complete entries yet!\")\n\t}\n\tif randSource == nil {\n\t\tpanic(\"No randomness source yet!\")\n\t}\n\n\tr := rand.New(randSource)\n\twinnerIndex := r.IntN(len(completeEntries))\n\twinner := completeEntries[winnerIndex]\n\n\t// remove winner from entry list\n\tcompleteEntries = append(completeEntries[:winnerIndex], completeEntries[winnerIndex+1:]...)\n\n\treturn winner\n}\n\nfunc CheckHashUpload() int {\n\treturn len(codeHashes)\n}\n\nfunc originExists(origin std.Address) bool {\n\tfor _, e := range partialEntries {\n\t\tif e.txorigin == origin {\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n"},{"name":"raffle_guide.gno","body":"package raffle\n\nimport (\n\t\"std\"\n\t\"strings\"\n)\n\nvar (\n\traffleRealmPath = std.CurrentRealm().PkgPath() // will give you portal loop path\n)\n\nfunc RenderGuide() string {\n\n\ttext := `# Entering the raffle\n\nWelcome, gopher!\n\nYou've decided to enter the gno.land raffle to get a chance to win a valuable prize.\nWe congratulate you on your curiosity and courage!\n\nYou will need your personal computer and a bit of time to enter the raffle. Find \na quiet corner and read the rest of this README file.\nAlso, make sure you've gotten your unique raffle entry code at the gno.land booth -\nyou will not be able to proceed without it.\n\n## Why enter the raffle?\n\nApart from getting a chance to win awesome prizes, you will be able to learn\na couple of basic concepts on how to use Gno, as well as some supporting Gno tools -\nthe [Gno Playground](https://play.gno.land), which will help you deploy your own \nGno code, and [Connect](https://gno.studio/connect), which will\nallow you to easily call smart contracts (called \"!realms\"! in Gno) that live on\nthe gno.land blockchain.\n\nWe've created this raffle to reward gophers that are curious and eager to learn\nabout new tech- if you can relate, you're in the right place!\n\nAfter completing a series of steps, you'll have a chance at winning one of\nthe raffle prizes - we're giving away two Keychron K2 Pro mechanical keyboards.\n\n## How do I enter?\n\nTo enter the raffle, you will need to go into dev mode. You need to take a look \nat some Gno code, learn how to interact with the gno.land blockchain, and submit\nyour raffle entry to the Raffle realm - which you are viewing right now!\nThis text, as well as the \"Stats\" at the top of the page are actual live state of\nthe Raffle realm.\n\nWe want you to try to figure things out on your own; you should prove your curiosity\nand ability to learn about new technology in a short period of time. If, however, \nyou do run into issues - the engineers at the gno.land booth will be able to help \nyou.\n\n## Let's get started!\n\nEntering the raffle involves two main parts:\n1. Registering your raffle code, which you got from the gno.land booth\n2. Registering your GitHub username\n\nBoth of these involve interacting with the Raffle realm. \nYou're currently reading the rendered state of the realm;\nand you can view its source code by clicking on the [[source]](https://REALMPATH/)\nbutton on the top right of the page.\n\n## 1. Making a gno.land keypair\n\nA keypair is what allows you to interact with the gno.land blockchain. For this, you\ncan use the Adena wallet- it will generate a keypair for you. You will then be able\nuse this keypair to deploy your own Gno code to the blockchain and call functions on \nexisting Gno code, such as this Raffle realm.\n\nVisit the official [Adena website](https://adena.app) to install it. \n\nAfter installing the Adena wallet as an extension, a page will pop up.\nTo create a keypair, follow the steps below. \n\nFirst, select \"Advanced options\" \u003e \"Create new wallet\". Then, complete a \nquestionnaire. You're free to look up the concepts Adena is telling you about\nduring this process (such as \"seed phrase\").\n\nAfter saving your seed phrase and entering a password to protect your keypair,\nyou should be able to see your account generated in the Adena extension.\nWhat you need to proceed to the next step is the address of your account,\nwhich is further derived from your keypair. You'll be able to find it at\nthe top of the Adena extension.\n\nYou are ready to move onto the next step!\n\n## 2. Get GNOTs\n\nWhat are \"!GNOTs\"!? - you might ask. \n\nBlockchains are transactional systems; every interaction with a blockchain is \ndone via a transactional message - ensuring the state of the network is consistent at each point \nin time. On top of this, to prevent DDoS attacks, all blockchains implement \na gas system; for every state change on the network (a transaction), a user must \npay with the network's native currency.\n\nIn the case of gno.land, this is \"!GNOT\"!. To get some testnet \"!GNOT\"!, \nvisit the [gno.land Faucet Hub](https://faucet.gno.land). \n\nSelect \"Gno Portal Loop\", enter your Adena address (copy it from the top of the Adena\nwallet! it starts with \"!g1...\"!), select \"!10 GNOT\"!, complete the captcha, and click\n\"Request drip\". Soon, you should see 10 \"!GNOT\"! available in your Adena wallet. You'll\nneed these later.\n\n## 3. Inspecting Gno source code\n\nEach Gno realm lives on a specific package path. In the case of the Raffle realm,\nthis path is \"!REALMPATH\"!. All files that comprise the realm can be found by\nclicking the [source] button on the top right corner. There, you will find a \"!raffle.gno\"!\nfile. This is the main code of the Raffle realm.\n\nTo enter the raffle, you must inspect the Gno code found in this file.\n\nGo do it now! You should be able to figure out the next step yourself.\n\n...\n\n...\n\n...\n\nWelcome back!\n\nBy reading some code, you found out that you need to write and deploy some Gno code.\n\n## 4. Writing Gno code in the Gno Playground\n\nThe next step to entering the raffle is writing a bit of Gno code and deploying\nit to the gno.land blockchain. \n\nBefore diving into the code, let's learn about how the gno.land blockchain stores \ndata.\n\nAll code uploaded to gno.land lives on a specific path, like in a file system.\nFor example, you were able to find the Raffle realm on \"!REALMPATH\"!.\nThis path is a crucial piece of any realm- apart from being able to \ncall all exported functions in the Gno code by specifying its path (a next step!), the path can \nalso be used to import the code into your own application, providing reusability\nof code and interaction between applications that live on the chain.\n\nThe path of the Raffle realm can also be found in the \"!gno.mod\"! file,\nwhich you can also find on the [source] page.\n\nIf you have read through the \"!raffle.gno\"! file, you may have noticed that \"!RegisterCode()\"! \ncan only be called _via other code_. Try to use the Gno Playground to write your own Gno\napp that will import the Raffle realm.\n\nFigure out where to use the \"!RegisterCode()\"! function, and make sure to add\nyour (case sensitive!!) raffle code as a string argument when calling it.\n\n## 5. Deploying Gno code\n\nA crucial step in entering the raffle is deploying your Gno code to the blockchain.\nDoing this will complete the first part of the raffle entry - registering your \nraffle code.\n\nLuckily, [Gno Playground](https://play.gno.land) provides an easy way to deploy code- after writing your\ndesired code, you can click on \"Deploy\". This will:\n- Allow you to connect your Adena wallet to the Playground\n- On the top right corner of the Playground, choose the network you want to deploy\nyour code to - you should select \"Portal Loop\"\n- Pick a deployment path for your realm - choose the \"!r/\"! prefix, enter in your\nnamespace (it can be your username), and match your Gno package name to the last\npart of the path. A suggested deployment path could be \"\"!gno.land/r/gc24/myusername/raffle\"!\",\nwhile the package name would need to be \"\"!raffle\"!\"\n\nClicking on \"Deploy\" will prompt an Adena window that will ask you to sign\nthe transaction which will upload your code to the chain. The \"!init()\"!\nfunction will get executed upon deployment.\n\nCongratulations! You've made it through the hard part.\n\nWith this, you've connected your address with the raffle code you've received.\n\nYou should be able to see your raffle code show up in the Stats section at the top \nof the page. Don't worry about everyone being able to see your code; codes are usable\nonly once.\n\n## 6. Registering your GitHub username\n\nFinal step! You need to register your GitHub username to complete your raffle entry.\nLook for a function in the \"!raffle.gno\"! file which will allow you to do so, and figure\nout a way to do it. \n\nIf you've succeeded, you'll see your username show up in the \"Stats\" section at the top.\n\n!!! Make sure to register your real GitHub username; if you are chosen as a winner,\nyou will have to prove you have access to the GitHub account !!!\n\n## Conclusion\n\nCongratulations on entering the Raffle! Sit back, relax, and wait for the winner\nannouncement time at the gno.land booth.`\n\n\ttext = strings.Replace(text, \"REALMPATH\", raffleRealmPath, -1)\n\ttext = strings.Replace(text, \"\\\"!\", \"`\", -1) // go/gno complains about ` inside ``\n\n\treturn text\n}\n"},{"name":"raffle_test.gno","body":"package raffle\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nconst (\n\tvalidTestHashes = `a657602fc08191e7a4e0255a818a0ec544c8ce0826fe9ecf0c47eb538b2a9920,e4ce35fc370cb77c8416d6cf248e406c3f41073955d2d1c46dfcde630437711c,d1c73632a00861c2a57502edcc7105df21e22f6f4764e07dbd76c1dd456fd763,5e9a113e15140d8e7ec30a70d999038970da4dc84b8517fdf93d8eba56b4f4cd,d0a8e682db50c4b5f16dbb1c206cc8086f58094642d5864db8cd5feaefff0eae,6d0d8c67778d4ea8ac5ed234c12075b7ccb96350ea84711f455eb1538ac30025,e287bbe122d9be4c90d2fc62e51abbc67de50f6c8044636a61e7f801081ba907,6c4567fdd88ee306f715eac751010b5ef8a66bab66258e580be4915898b1dfaa,85463175e47915820c55acbc2531eaf360a8c0586c3b59cbbf270efcae64382d,b9efac79a5d7a24930b1429e884c0e8834954c07d71fbf65eb2c6ed9deeb4b86,e22a3c12a95f1f07a0efc398da7c39c4dfa75447f17a03184271cfb5a5c96878,38b9840b1b4424a90d4999dae44d5e84b91ca5ec9f9227019134b124e17d9365,e8938fb84352f04418c0004d647b83627f9a87ca6df5565acb3af41a5ae4e96a,0230a0c0692cb9a8a5ef678e43f6693c48798ca10cc18694beaffea4825d8ea2,df9656caee96c6307c2a5f1b8e7ccd5939ec5d5d20902865d6bea75c696ece8a,0826a9dd51b29e6c2a5fa4851b9901938766a966be238bde273b4e18d13d8f52,3b6f3cc0d0a263cac2542c2280f43f15fbcd5e84a8e381def4f85ead1f50fc1f,203d4d1fbd75126347c4d6f5507e9d0a3a3e7c882add72157a036c9dc4e66512,7390338a73bb575ba433c21c4f20046fc84e068569ae4dd646105a9a6a58847a,336dd7b5898bf4970a26b5b4a6fe676b5dcb8717e001c9b35bb77ef470b4a7aa,8a9664c99a6f9c834aa54c4a762a31e8047584637fc9062e5069c0aa72631424,f1c8980ccb671cdebf22a160a6e80d7e32fbaee249642d0542b0c200d49aba3c,53448154f4b36b94312be81822b1b5e50dccfdc79b32e2c22b16ccc6b7d578d3,f70a7b08f88830a74830a78e9cec3f8d232217b113cdda0c8999701ad03e8d9a,ebabcfaf537123853c1f4fe32663ab2b9940ca380a469c90b4335a3cd75ad845,f11b62e725abd3132689a08c414a9d8056306685ad579015234147ca8d951ef5,e8746cdb50ea505868f1b14a639befe60793e1b098595ada30da9dea8543f85e,d64f3d1df00b2499d8dfb70a7ec677b6254194c1cc6fbccf2a5de0a1554aa73b,bbc3769aeb96573e828bcb88d4043326422a486cd7408d673f55a74c2bceb905,89b3990c08d38bc4f157d83dc4a3de9daa22d47eefa2b8d2083b45e22d987059,befa5f82ba8c1e203827afdd525b1bff339db39bd687499e67cf4ea0ff1ea7da,35248acd0ed6d6a551b7e6bc46f5fb6c5e00e996021298370a3a6145e45557bc,bacccc0dddadfa4e5ce03565a4d60fbfa13e4c6df882b4c5380c63c2fed1c72a,c3482d84d0f68d7340aea787390aa271051697c9f6189e01c970ff18cc871113,d03111e4fcf3c5706acbcdf03408f27c392de6d622b6c587fdc01a15aac8511d,77d3c66add6417b3c82b33ffc4bd56f99f0e1f2ad6b50cb7dfa52cc20fbe53c6,de52618ddb2a0814d537e701065d093dd99b15ff8ed9df4a47fae47b36191144,e5b2c494f09c57fcc1a2f1c81b8bd543418561195c1b406ff0933c80bc43926c,290862b65579a5a9e7b7af38787aadd098db50c474fc8973f1d40935c2abdff8,4790aad6ef509672d5b51ba192b1465f4c7c8c8ed5575164e549502498cdc314,bf421d436ac5cac95ebe884d84c2bc10865b614ffda07ba5e47bcfb45d0cae68,44119bae5a9ad9707bf4ae45b986db6c14910549c134977cfe4a9722d8bb8413,8b66d6f823efce27b5dd4ef8df2e7c420f977683ad951e55117133c96d3a2fef,7950ef46b73ee87379ce9bdcc80e7fb5cb1e2a0550142d09772f5adb48990783,47900068bbfecf6e272a543101b24e3284cf97d20f10c83e0cef34fd3d7b8939,9b70918fe6fdc6b997251f8988b1e28b26fbcf5b00aa009b54ed6987954b1054,87e5fda75dab4f89646c832951c3ca0ee2ed7908eb67be8b7665bca0c11d4863,e2401111629a0f6b97c09b98cca394d653ef3b2b7b130e6dd97a1bd278be6fd3,513ab2a40f29de856e9e75f7f556384b5793b52630966e2572448201b4d91241,38ce4e383b82bba6324efe0b591a140e108a140d348964e12fe4095f1ec28836,10ecfdb05cccb69aac313df1b85b6e9a8d16239fc72b6ba01d54cb3a01367d23,63a2f5ba3d1e707b0d2e7143e6ae0b59d2db066c910d8dac1044282a7b414a2c,5358b5d792244a4a9cd76b1a53cecb72edd8ad86b150bee596bd111984f37c8d,f1472a16d28eeda10cde756bb0fc9b1edfd72086ad1b7ba848f3b2c7c0c1ba60,12e200388a96f0c880cf48e93b2ea96287b7295b64ca80618e0425bf57fefc12,ebcc48149e5fef8d883c2feab956bf116beaefe8ab9eb751ccf991036fbd21e2,0c40425718e03bb1dd82551fce54f4580e8220fea9f6d615b026698fd9669c80,4848690fc49a95c439cec58f89982b58840164815d953c8fa87ccaaab2bd1731,6a16bad26a7cc979a4f8e5eedbc80fcfd9ed7ecab91193becaff50f33efc28da,ebb1a01c03117dcb0aaea770106bbdeaab4977f48c996a4f099afeb1b2facfdf,01b214bd9fd35002db91584f4eaf2c6be48033f47e10de7b3688a8ec03c3ac76,7826ebc97a654bf788cb023f6be2dd87989948ed6c1459af75d66323ec609933,f5e1f76ada455535d638d72d5ef1026376845487d1b6f36a260e4c7e9695601c,3f7f2d5f5a5880ceb62584e53b591be6daea1c1256e40d08bcf800341c0f4998,81d396417b5c2f4fa3ba7ff9a549bcc4828c67023f02e312a1d2b04d6a0dc284,a038ade0998e9b9f9b8f6a6c07f1fcfd71a94c2cede2e008c01f20c5bcd8c951,440bf41f1820ae151a8b9b7d9929092506b9b37ff9008d25b420189f6c5fca13,3a84efff563cbf7b4d8d5cb263f4f5fe0b165d6489ef97cb5f027132637d5966,7424bde3031042dca9b2772420802729013620f0080339286714a1cb025819ff,7ce7ac17c0ee78366435633c0e6a7856a39191acdd31e0a4fb8ac805e34d46d3,aec871aab9cd61464a27bf28f20f9787d1487fc7db381755b446eaeda32bef95,1776c5cfe011cba0de6adedc058437199b5b4d022891b700ad34c253bf51f528,77c42978cbb6d4e9ea009bad225ce9c6b9628ef385b0e920d840fc717640c2a4,0234edb9221988c6f9926a02875e25f902636edf0352dba3119c80576f6d234a,a3982bc2e9fc9bf4ba8a557faf0fe3c87c7d70704cc34bb257ccce850a56df9c,1028d4888bcbd6de66991f55b05281908a43bd721999e52b864043e5b20a1b4e,1243e8b9d1f3f9faf60a3ef85df793a21cd32fe70be208daaa8b581ef2ce8e68,f126a0245767f09b0673b4db69cd15c21f5bd30db6a4bba8d1a31ea641d58b33,3f2c79cfe02d3997fceb691aeb35d7cd57de441b4cef6e30b9b962deef9c50b9,f5fa2ea7bb2b4c8c6ffc48161983f88bdd19be45a57fc98ff9c1fff82f801014,d8df89e0cdeb42bdc936da63cde0fb936f56dc234da63917663fd7372b7660e8,0e8b757308130fedef4420b79e3d3945e6f8d2d17850eed9309e4d130f654672,b997b5fc7ccd97a0539bda23185af6f510eeb5d73de4fcd6647784567295bc6d,a3e3ef6e658b4466bf2171c47455a80cc2bec6a90dcc1fb3390cf744eb53c1c7,8fcbfc5d27166c53d080f471d16f6bc8e8aebd92f0dad07de4b859495ff042e9,28a00715a1445747db570f4072a94bb51e3174665cc256982f68eb73ae373ea1,b9a85ace3beb1b30f5246b3226efd57c9f829799fe621585ee7835f55d390960,76f2d988a34611508881726f80b18430753a9bddaf239fa1e3ca248c07f563d1,810a984e20a8f0d9fea02b69a9d0d7ee64743d73c24919f060355c58221659db,ec0ceca541ac704ef78375ce66bae03e2ac7f948e14d0702702b5edd44431ed8,45c038cfcbe4bbaadb423bfb6d69aa166bc36444478eddf04dca330e747645df,66978f4b114af8a2c7bff35caddd57b0e34d4469422e1f5177d84efbc29e9f9c,68deee2f5ed12726ba48c143de86f5bfc6f52e42387b6b118bd6adc15c6398de,a0db86d2a0c9ce98a0e3e45bdcad8786af03bc8c616726b39e73514d242903fa,585814809fdc5504c535b33a7905c9eb1fa3fa49d614de3691714738ae50800c,1302a8f2dc151addb559c3078c9ff96e4d0c0830e741837ed7167acab0f9c665,4142bf0dad7aed829ce45f47b9dc7301c99ce48eddc44eb72bbcd790238e51df,7258b40d72fa503550edd920756c4a1707b73bdefcce5ea94e79077e215c2ac0,14e73a66c7000d5cb2e2814cae0efb467f7a7db3ff586781127d35755ee90dea,b0847a80927caf523b377dd8e6afbfd29d9d247489f5531492b52a1603efaf31,1fcbf67cb147f8550780d80e16f5a9e22e28d5fd73ad04c7eb05f089173f8e6e,4b7ef70b85443c71ed7d39c56825a8d6faacb85a4697cafa4945680a0ad3a9d3,5915da1266757108bc408ceeabd04a99c93f745af0462d1df9ac42384cca7e07,b3acef10f8a2f04d21dc8856c7e138f103dbdc5e6b34e6871b12eb2ec6907a18,8da8f353e95c27476094aa037c06d987f72ab08ea5927af07bdffd24467a5f68,0502db50a5bfbbfac71e959bd4f372a47e83ab6a17a255b0e60b402c122b3fc8,04ee807da45b9a2a8a1cdd0148e1babb794e9e7584c55f370a2f723a16632c2f,79ed422a442f7b3a6b194660ec90560b742b9ba018c2bedd72d6d5a60b332c5a,07fdacdd8c1909fa7042e20ffe2d5f5bfcdbdb59ebf3e11886d02a5f0fbc05ed,361e57a73aec8cacee32496094263948fbd6a9d96e731fafec127eb9fd813f26,c36e6c40c3035c5dc4d8f015363c4591dff5a0e2065aa719c751cdde1a81bcbc,9bac59d959407ea715e81eb23ce43cc88e462c5a25ce525a5dd7b417ad7ea7d9,8dc69bf8158365d866d999fe69b6a7bd869961bafd09863b30d7d6a114bfc5b8,b00f70f3daa8b95576f82c3e59ecdd8558029ee49fe3f726a39d06a1e8fffebe,7ea988c095c4107824bced289ab7d21136e81dddac6a57af836e639135a08e05,966476658b04905c11608c684e267508c9f875f90bb03178b6b4b93ec2f98f13,f2d19b603793cc43563223651b218f8e465f1bfbbc803ac0982e75c8424e12e9,87610850a33a00749627bbc7c6e0aeff65813378733563d05b09333ed445ed54,b980b9789136661518c8864a2caf5f5ef7564408d05391888d25695d6bae1c9b,5fd10e734dd73befd2506c7a4b3d9c453366788763933a32ae7c8a1cec69c000,420858c69ef2cc9b5077f786392fecefbbd76501a8843ca13755a8efbfe6c6d2,6c6dd279e6b135970fe3352b41771341ddb0da7b41b5347b53004970ca2a07d7,247bf14ff84a4c498caeb9aaf249d186db1f84e19363a1a3f118801a57ba09e6,2d568b421ddbe5486bee08dd6d1c584f3311eed85dc714aea72efbc8f26b1b66,274b1391e2d9c3416515ecc8d10061cd1918f9fa9b7e91c7e96934e9cb6bc8a1,25fb97b440fd5a8c2148b8301eadb6419c1350003e4d9f2956a9e782a3e898d1,2d1bf699f5a8f2c5b2817eda0ef641947c6abbe7382fb888194e1d5fdad09566,330b374790e6d56d65f871ceb5a1779bc9859ddc29fd7bfd0d2e2a36936d9e98,3ad6891a7801438b4c695915e33ab8b7601e7f96074425b4dfc81ac76d6d09fa,8936901fa82ce332b699810e836e5320b0a0c5a267be7d875f991607a4eae282,d96bffa8ce37e4148483ff508f2a60b6629938db37b26664be8f4de4e8f9be27,7b4fde34ebe05d8c5a6c7c9bf0caa3971173bbbb62450179db376c1183325c65,4e38a924326b672f732602e8b926997eaf815cb8d9552ca8b2d694d0ceb74621,8d88853e489365132031f1c19f96787bb7955fadf3a33210222260c41b46fee9,73c500ead65ef2286b5140e06deb05ec11c78caa32954452e9ac50f01d4b1574,a8fbe2c40d74d690018dcbac28ce03edac5e5078d86544f04d422cb94b2dcc5b,3070a2343f71b624450db8bbdfa58ad1d4f20d171120fad69163ff68d969b36e,c4b2f358fc2cf8d771f8adc21419ed06fb3c2eafb8aaaf57f9f0036b71b24a79,8b33b6c3935ba61868fe6c3cc82dc09cf8956ca401e4081bb9070caaecd54a00,2440f69ab8f6f3a40c2bb83c8c11fdfbb69b32c6fb92a8059fc53f72c90a0fe7,dcb1b291ea41f4aa8f4632f62cfb20860a55bbcccd5b865bb36a8c0868763493,77fe31a59eddd7b925605d0081ae357da852d2530c820db0eea6418f826270ec,5a48b14d87fe45c7ef72def490db5cba84626720dcba876037241568ce75eb0b,28282b12ce1bf020a380fff1d6276f20533530ecc1fe666744c7761e80bdf7bf,f7965deadf987642563ceb0afe231c0ba0656547a83c3b2c58eb101cfc3b6df2,75f75d426cf3b26ddcf9d81e37ab8ef4e9421820f35abeec77e89fe2f229c713,df4ad30a4d19080ef444e9b86bcb539bfde6b6172254e6348e1f8677a6f8a2ff,72d98f1549d8125c6f98aa65ce936d978b7e46761c7b738ff162098b97ca22b4,07fc641ee6efc88323ef2928b263822f66b8bc844fcf686e8b6b809cc55cb28f,6fe314848cf6b71e3dfb97e81c58e8a5cfdd5c95907beba0d80cc733e338fc4d,edbb054b6a58f073de56cb76b962686aa3285cf0061dc1274c95d7d6091b3b33,600b8c1e159b5a119a8f2856c9da15f0cc407a9440c28a9c930b93319080e11e,dedfa5adaadbb507df7acd1aff8bf15e792556ef5a20f7ed8f2f733b50a2a94c,266161aee785bfce4cd62bb7f373f7f6c5843042aec46851858b15be81f99c01,a27b39e042e6b6d8a409c02ef510e87bb4fcd6d17a583465f1e3bdef8fd5ff66,bedc14158770ae8dbc3cf5e095890c1ae813a71519a1599e12d318c109a03d73,eb6c718e060181374cbaf61401df3fe4795b5ea7d69071ca54db7ec46b5f39d5,1db3779583cd8ddfebc1c33b9554c259e73ce94f352c8b9dc65d91b945f42508,9d178e34adcadf94b206f0d04956160e3e6f1aa621ee7e901f43d5b4993a268d,6852d1772470588b412382efa795fd3839c0b5f0d5c73db60ace8d9f0654f5ac,c16d4d475f5bbf6b0fefe2c737538109175d619e6fbf84fe0ddffaa107f49624,4a2d53b4176333403f606c59b12561716543c596455de1883a1a08648cfe5633,0abf8530e6570ac69c068b160acc807b660331fb7f206267891772e05784f080,ea085e3675b4f1ee23aee81d920d14168f7740c4dae404f081263200c582d5e5,d1f88d59c10f517a00f8379fe0dd5ff60fca94e5e5a077432ffbb6a2b6f85a13,43a471ba0c43af7bc0e53f487585fc7e44a4262bb0eca400038a875430847ce9,6a9a40995191d5bc3bdb32b7ae6af6b2541e55576cfafcd97c9bcd95da4b5340,e28698e18e49e481b8a92b4102cb259584d81edf3f73468c5ca5509d5b5874b9,007b899ee4ad9cf389a4db03ed5ec69e8a2c4648cec328f0c669425089186604,8ae572d8a53847a30f5e9f2ac5d734341c2fac4fd8f574b2b9d9b24817d6e372,f857a1374f3cb2c80661ecadaf5d0e3622e72d77d266aa7ad2801e7db335b969,2e9eba7803798b99de5e59a3cb207ca53180326d7dddc4f80460ef1e3bca9f22,6d2d8fdc6bebd8bb5aebf5f4008856c427fc9b077cedef06d7cabdbb35230090,e88f5a8743a1e2cc24c07bf93d2566293ec90dc3016d6d561ac359f200afcd7c,73d8e522befb3985d72f69876a3bd5bfd656ef442af8db63f24e3802fbf7453e,09dc75bc71fad01c85dc0c7a2dd4594ae3883bf5ef8155cd2856638bf467842b,69f06e1c5773eddc50d89714a081fd26d6c271355f609d171d90f09fdb6ad311,1e8fcdd32d547ec02338d40cefd09b02b28a4ae8f8972a4fafa158107f6a890c,79dffd0030e1dd9af958fe233cbdf1959ff3d749d863da8b92bf6d2edcd114ad,e089dab3bb2519de80cf8666f589e183f4ddf80f8778282694632499c093aaad,2f342899b6e2505b72a25f7f507298b4cd5b0400f9d034d45a95fa86d127b171,5b6767fdff5a39d92eeb8415eec49f48b958e9c38151ce4356d09e43f8b397e9,a70b2878df44bd3952d9da43fea40bb475d2a87d21b8d5750c2153163af39c0a,4526593e49e532e8e498a8b14c3ca15c1749dfac9cf39a0b44b4c18ddc319440,118502524e8a02d7c7ee2cb984b598f27afb3b7b78b92326b2fbfc3c53f48464,8379f7dc2c391ac38ea1d34ddff36faf5602bf128b6d93a3a8a6485b1d8dc23f,0c17a500636a9a94b405b8e9f2fcd45b058a4a9070c156332e429daf0379572b,7e302ffccaacae442283c86d2afdf7c240d19dc42c41440419c8b78efdfc9dec,a19467bab0f5a753e4daadd080e64f13c79bdabd7e403575f9f3d3b7b6ca66fa,4162c48bb1ba5e8dd38518f9d1007300e46348e01a97184e253a3250ed0f9ffb,c1e36882f77da60283f64d2590e3389497e6583fcdb61c21d352d522506a8882,64a4716a19fd7b8009a5e6d5924a74c65ef8e5f85c64345c7b89a4e6b6135e5b,8136dbac064d798c9e30bf31e62d74f99ffb37d3bd9f3d6d3c6544669ca3cded,790f8dfbe56b27d1b82b00bf96394caa4ef54263229bf3ee5b2aa891ec8b5676,7d060a4e92f2c1f4cd2546f5409cae2c946b70556b249455dc19fb93e8dcdb9d,8e62713fc4972433c63b1c0c19cc1d291471381b11183b40e450263956a4d1f8,46255b9d4d2059337f3949e4ada5c2d16ab8385f66967291e204175aa2120986,49023745977f47f7439c701985905ad2be42b2a89c070df73ea8dc7f9c5ae627,75e6c4c28e4dedef545bbe58ea2b497dffc90ed7fe6d7261287e90cd85a3fcfa,fee9501fc25e4c85c0d205473426d6e6f4e02eca002eab6513c6467885486fab,77f39047575527668b8c86defb3a15328d6f6289ffb1dce1b01fd1c9f193f739,59e80ebb2f5424610ffc9070e39c64805a1d6a44f52993eaf0b427b3a8494b99,bfddb6b1867c2d0cf3ed074ce94fadc786226f28f98f9f1d7ac5bd6a1e040f9b,4c6aae8655346883ce266665e0c61461636a128c8804d6aca78f9c8a35356fbe,bf4462bc1f0c88cd99e30a20c6b6eeae09f7a17a737314192aac8b40056e90e1,f448286e1d5a998965efeed87d8feffd6ecc3fc0a9a8658730da10715324f89c,7619cfb410a5bb992e9da50699a6cdd82a0279e27176ebf4c1c21c12dea2459a,48395b0355072b681c77cf4684dfa228f4009c4985d013908539e34d306bb4d5,6fa9d11c314c5430db8ac179f7e1517d754781522b94f2da800a3d9db8a191be,79462eb8641df40ec28d7ae89ec7f1d5548b7b0316fb03da682726b35bfdcf7d,dbb07ef67043d85768c04c5c68e98a88685bd2785a3b20ba574403397fdcd33d,5be705a5717f0ad7688077b80765f8eac1be081d07105c7ab342db817461213e,0314be8e3cfcc6f00f5a0b3ce074f844f8126692bc9db1951df722379ca37622,b225bede76fe85a80c30ec258bcff80f9226fc3b3c07e1c75aa43e38968c85b0,ecceb05c114658703ee5bda417b23ecedffc67129d59b52a4fb60b9aad8624ee,56d6e51283d0da2e6aa6d8a166178aa5bf97c0d6ad8b6514a2b1a8701a890a54,274754307e41b8a6333f8f2d9bc679640fdeaa6954c94d91b022185d2e0f64ca,1c303f25b84f7f63fba0c97dd1ebf1148c1968658dca21b27df47ae2b86c4c2b,04638bdc28da59d45407c756701e4285ad0487858e92b2e45ccf99ffafaaf73f,ed4d011b44c9801335df5d3b5550977b11a1e78ec7ad1ebb477ad2eb707ddefe,333a3f0c920bf95d95cfaaa069a17ccfb0998ebc5697764788642ecb69c1746c,c6db8bfb6ee98557377bf8886a12c5784f613a53db3c09c161938039706941f4,25c3e1dcd0d27d63978adcefe9f862d9be8e20ed44bd80c359ffe99bc72fb095,035d2f21a40a3c5f97be226cb26e792130ba0d56dfe472b5cd9e1fd0b5d557f8,16411af320b57bac481c370cab692121e93edc942c2a6851c64737951a9594a7,43cc758c0134246a8a9e7db3f08a63709f0db02cb8431c21319e832845e3bdfe,3d9149f5c36eee7b661628d69b8d3e323b4fed8f544f8ca7b1bb575de94d465d,85ce96c84ff64f03e0c8b72dc9d6f2a4679c034836368345e22ffd0a170ad62f,2691d4f78bedcd4a6f6fa39c45a0109e4a11ce7603c656b53cca835d3863e06a,cbd21277046ea7f4572d6e8149077713575239ccf8a98c56b162b633a6490cf2,30335f29996cecf0747bf4e2b44f8ee3959e4cc277317d48e80f7726a85d87ef,afbde53c640182877df7eb5955d42669c5aa54e65ba304d6bdfb1be002cda374,d053a7b55ccdbf594d95fa053a1dd93d41a72e9c29b15b68e571e482d33277a4,3ae128f7b953405c2cd293c2e62a9c99914a7ed69d84c927c518bb9fc21b74d5,ab43d526f1dc6a32395c49806c8bc73bae918a5f3cb5fc1d0f99cc32e8d45867,7c5151e7116ff12d2325c9b2e98256e43802f6c4a15584be250aecbf143f50e3,5ee1a8ac394732056708b628216815b744eb5fefcff8426eb48d682ae7fe0bdb,e1f06ae08a52e1e4e7544d0ee343d33ba6ea5a71d7ce00c56a3f14058a199d78,771032904be77e19c389ae615a39e78aed70ae8e233edd8f3d5aafee1e4691df,cf0dfd60ef8f949ec0168439c7022546c5f00634e7fdd668900bcad1e2e81756,84bb868f3ec690f914e3a8cde683b55653e554bf5ae6516304ca95e3e0be0ce9,2e6bb4a91f7df30a0fe05ad3d02ea64b6a571a089ecd6e1a2caf900e5175949e,566cf7e6d6419fff93e8f18bd34b7fdb2db9b2d4191434e37a97e3a5cd00b186,912729b57611e1422879af83c5d11bb416c0b98fa83dc392bae590d7e90d5d12,54a7f54922ffc66260dcf30076c4cc7fa254cc9b830b2e37349d7b40f0d67231,d2cdfe1068809e2e519bec2fb30eff036085ed0fd5a174157f4a531be489a9c4,00c19bdcfabceeef4ab4c71251f41d59173c43b87ef0e968e7aa5bcf77fc3aa3,00a1b917cf86485c9e86030ec1afe9b7e28a4345f46471b92b4e0d08b698bae5,17b23ef7d38a3a0334ef68087a585ac48956984f6e0321c62d30011368954485,1fb0c2d4d015596c3439f405da4a7a2497ba94cdecb535e70cfda08c6a764f4f,993c1131175eb1f3b8b5d1d72ea5addac559a20b5154838ee86aa9b71e06652e,2ede50271add1f8aa5b91bcd222d83eecea7f4a524c9e62ec01cd889a55aad45,20ada1b4fe496096230fec2c00bff8a037db5079c6f45955317df9c2ede5f85b,b37b8821965b243026b83a59ea4e4e2246545fbcc1100d8effeca612a3b6bb4a,0760c516052f81058efd89aa11573c744ffd4f5685e11e9e200bd0ba0228ee34,fc3cc3b0dc5592a8c0a2e41d3ba995c0f65efbf2797c2b7b2403bd2c552acd64,0475e984bf932adabb1fe98d943ad23fd56e4bd53c2e7bbb12ea69b7996430be,d60ec04ea36dab7f685a2dc50c2f76ede60a6b594b15317d7e32d2438eef36ef,13dbd661bb4f0bc0854b761b94470f2c8d3ea069c2b2c53d07f40da9668515a2,875472cab949b679152079e79cd06ad376c30f4c298b2f7e191f5f7ef3aa1ccf,bfc95afeb7c01ea29780954bc62c9830af90e4a8882b64d24e65d7c30e075e48,4d100b664eee670a68d88d07bab4ca55dad28da862b2af631b29d5031920e10d,1275cde34b3de398a87fccd8bfa2261f826983ea774a0a413843f9de07beac70,b3cc121e4d7f7bc008ecd7d79b2f08d32c34c036c64678ae7cc43112b4297210,46a13985c51e2cae515be2a8f1eb0b42fea64cf366057a611cee74aaa7c648e3,df40e86985f66578e1ca70bea1c1a58b943c3b37bae49f639a547e759239513a,448cb5c2de497679de2161a93b5e0983a6030a33a59eee2b3171c56a93bc91d6,e6b371651baf1c9773ee1e240d51deda5f237e8da74048af9f3379f70f1c8e2f,d24ec5de76732220049843cf0ce87053bdfb223d8e45cdbf83a8d801ed486850,4131794225ae70468171aefddf3e5875a8ab294263ae4694f93a68e8314b0b5c,f5958acf10e9d5f12d9b0349bda1e652273977c36e1ad59c383bbfb512abcac9,19dea7117e47e557bca2019c09173879bde7a9703e7577ec5bf2270fec6aca6e,3cc640e6348efd77de2a22367f609c2f68551d4cb917f27c32c2dbc422827dfa,61d21b2cb4586c4ce3178f6ea51d905d9d00d79d85ccea52e5f4223811e12a44,44e06b75ecca6b3a9f91813c716c0f61f5990f498c5ed17a41ddfcdc0db48368,8da1c8bd377bb3892265639b26a72b7780393a8a43f6471a5eb1abd1ec88ef3d,f5e58a733b69af1ef5fe8a9a580b3790a792e44ad32a29e98d9f7f142862b298,d1e1dc03f1d6d75da644b8a14f8e7d3906b47d50968273f0707142bdd810de1c,d1869756e1200628a18e401e9510a9f78604ce91faf67c2e759a7b28c6eb882f,60dca01fbd010aef036b6ba742978ebacd1c49ba999e06f1b7985c5c0e96055f,c731ad94fa972ca5a7bc709d2cccf187ba47bc6299dcf3301b62990064e04fa2,d1cffa5c6c044dd22a8a0990545ac7bf5edf04b38820230af853949612ef7075,cc351a659c1718306c90276e7a58697709b69d2dd06af2dec6891ac77ac62a3c,82738ee011e454410ea714fbeccad19fe15dba4e62b7d1b85e65e7f8ed2e6286,2d2f067acea2451a17ad0f2beeefcc768dbf52a01f437a5066f49fac1d3eb312,fabad1b8e1b3a3e11810c408f748a7e70449f4274aaaaaf69b11ffeaff1504e7,4ab824b1479ec872488f501374e22488e0b8b4612ea16cca5208783016af9858,1b5dcad92079e86412309d5f85b01631a7aa3d7eda261080531cdeb89c96bcdb,a1809967d96449a3535d19e509fc3ae58b714805141f6487aaf06a7b00f47dc2,081fde0ec6f26348e2626daf44d932bc31d3ac3cc6546061484f9f68b0499422,c3d10191066b94c7a89f91f75fc9aea86e17ac5894fecb8c0698957771d196da,b5474f0aebab60ca12d4f8097a499f3fc063ad6146eb6db4191bc05ce82312ed,147a78e0d0d68aa642b97ba83e7b45ff5b367341f0a0a4f551f593f3ed8855db,47b2514697f7793be6f9ed37ff3cee74a4d1a3012d468c6069c50b6681ec07d1,d59ee71f32fc530efbc54952356a1e564e7fb077b9323bc032f6cacd7ed47917,f0c7fa099c97483728d04f577f5b1462443136e52b9434b5875e00984eab9fc6,a8d103d654099371f1a97f34cfe997683000cf2e7a525376d6af1ac2b75d71ac,cc5f68d406097c09e8d86b667213f52b77d3e0e543c86e3dbede40e8c1f7490d,b495595a4d94415ad9e3c6fbcb8589ddbaffa7d0c9077fcfe261efecc76bc957,f4359ca550fc3fd61f08b20e7714d37f1ea257a2d548fcc6a40cbf1bbc4bfc2b`\n\tinvalidTestCodes\n\tinvalidCode = \"qd0bJ6HTSB\"\n)\n\nvar (\n\talice = testutils.TestAddress(\"alice\")\n\tbob = testutils.TestAddress(\"bob\")\n\tadmin = std.Address(\"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5\")\n\tadminRealm = std.NewUserRealm(\"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5\")\n\taliceUserRealm = std.NewUserRealm(alice)\n\taliceCodeRealm = std.NewCodeRealm(\"gno.land/r/demo/alice\")\n\tbobCodeRealm = std.NewCodeRealm(\"gno.land/r/demo/bob\")\n\tvalidTestCodes = []string{ // These are not actual raffle codes, don't worry ;)\n\t\t\"qd0bJ6HTSV\",\n\t\t\"H1Qe2kx@ME\",\n\t\t\"2E$zre$$oE\",\n\t\t\"f@2xEQCEWo\",\n\t\t\"AUpFRwb5H9\",\n\t\t\"jHDNQ^x2zJ\",\n\t\t\"VQz^SbYtR$\",\n\t\t\"?ZggWTzpfz\",\n\t\t\"1HP82PVPD0\",\n\t\t\"#nThf$N?qq\",\n\t\t\"nQJFyyk9vS\",\n\t\t\"4xR5n%ymnw\",\n\t\t\"ogJ7sy77QR\",\n\t\t\"syuJ3ttYKj\",\n\t\t\"w!JgJT^Cu$\",\n\t\t\"kmucxFaAL#\",\n\t\t\"7uz%UDR9f5\",\n\t\t\"ifUWAKug9?\",\n\t\t\"2Np27vsHvp\",\n\t\t\"mtDPMcf%EA\",\n\t\t\"153SQg6T!h\",\n\t\t\"Zgt9c09N9s\",\n\t\t\"jKKU7y*hN9\",\n\t\t\"L$gKPVF0Df\",\n\t\t\"1R^NKNV@RJ\",\n\t\t\"TbtREP@vx6\",\n\t\t\"$ii4\u00261$CXT\",\n\t\t\"jdVRC6FCLT\",\n\t\t\"\u0026qgQrrtB^k\",\n\t}\n)\n\nfunc TestUploadCodes(t *testing.T) {\n\tinvalidHashes := `1cdcdc252a3a8c2d1516527dcf3ee63b4552a6bbb41145527409d8a8b6185c40,551a0108b23cc4bdff4c716a504a677551d68162ada5b9e20ebb21f4d7e83c9d`\n\n\thashes := strings.Split(validTestHashes, \",\")\n\n\tstd.TestSetOrigCaller(admin)\n\tstd.TestSetRealm(adminRealm)\n\n\tdefer func() {\n\t\tif r := recover(); r == nil {\n\t\t\tt.Fatalf(\"UploadCodeHashes should have panicked\")\n\t\t}\n\t}()\n\tUploadCodeHashes(invalidHashes)\n\n\tUploadCodeHashes(validTestHashes)\n\tfor i, hash := range hashes {\n\t\tif hash != codeHashes[i] {\n\t\t\tt.Fatalf(\"Expected %s, got %s\", hash, codeHashes[i])\n\t\t}\n\t}\n}\n\nfunc TestRegisterCode(t *testing.T) {\n\tstd.TestSetOrigCaller(admin)\n\tstd.TestSetRealm(adminRealm)\n\tUploadCodeHashes(validTestHashes)\n\n\tt.Run(\"EmptyCode\", func(t *testing.T) {\n\t\tstd.TestSetOrigCaller(alice)\n\t\tstd.TestSetRealm(aliceUserRealm)\n\n\t\tdefer func() {\n\t\t\tif r := recover(); r == nil {\n\t\t\t\tt.Fatalf(\"RegisterCode should have panicked with an empty code\")\n\t\t\t}\n\t\t}()\n\n\t\tRegisterCode(\"\")\n\t})\n\n\tt.Run(\"NonTenCharCode\", func(t *testing.T) {\n\t\tstd.TestSetOrigCaller(alice)\n\t\tstd.TestSetRealm(aliceUserRealm)\n\n\t\tdefer func() {\n\t\t\tif r := recover(); r == nil {\n\t\t\t\tt.Fatalf(\"RegisterCode should have panicked with a non-10-char code\")\n\t\t\t}\n\t\t}()\n\n\t\tRegisterCode(\"123456789\")\n\t})\n\n\tt.Run(\"RegisterCodeWithUserRealm\", func(t *testing.T) {\n\t\tstd.TestSetOrigCaller(alice)\n\t\tstd.TestSetRealm(aliceUserRealm)\n\n\t\tdefer func() {\n\t\t\tif r := recover(); r == nil {\n\t\t\t\tt.Fatalf(\"RegisterCode should have panicked with user realm\")\n\t\t\t}\n\t\t}()\n\n\t\tRegisterCode(validTestCodes[0])\n\t})\n\n\tt.Run(\"CodeNotOnList\", func(t *testing.T) {\n\t\tstd.TestSetOrigCaller(alice)\n\t\tstd.TestSetRealm(aliceCodeRealm)\n\n\t\tdefer func() {\n\t\t\tif r := recover(); r == nil {\n\t\t\t\tt.Fatalf(\"RegisterCode should have panicked with a code that is not in the list\")\n\t\t\t}\n\t\t}()\n\n\t\tRegisterCode(invalidCode)\n\t})\n\n\tt.Run(\"ValidRegister\", func(t *testing.T) {\n\t\tstd.TestSetOrigCaller(alice)\n\t\tstd.TestSetRealm(aliceCodeRealm)\n\n\t\tres := RegisterCode(validTestCodes[0])\n\n\t\tfor _, item := range []string{alice.String(), aliceCodeRealm.PkgPath(), validTestCodes[0]} {\n\t\t\tif !strings.Contains(res, item) {\n\t\t\t\tt.Fatalf(\"res should contain %s\", item)\n\t\t\t}\n\t\t}\n\t})\n\n\tt.Run(\"DoubleRegisterSameValidCode\", func(t *testing.T) {\n\t\tstd.TestSetOrigCaller(alice)\n\t\tstd.TestSetRealm(aliceCodeRealm)\n\n\t\tdefer func() {\n\t\t\tif r := recover(); r == nil {\n\t\t\t\tt.Fatalf(\"RegisterCode should have panicked with a double register code error\")\n\t\t\t}\n\t\t}()\n\n\t\tRegisterCode(validTestCodes[0])\n\t})\n\n\tt.Run(\"DoubleRegisterDiffValidCode\", func(t *testing.T) {\n\t\tstd.TestSetOrigCaller(alice)\n\t\tstd.TestSetRealm(aliceCodeRealm)\n\n\t\tdefer func() {\n\t\t\tif r := recover(); r == nil {\n\t\t\t\tt.Fatalf(\"RegisterCode should have panicked with a double register origin error\")\n\t\t\t}\n\t\t}()\n\n\t\tRegisterCode(validTestCodes[1])\n\t})\n\n}\n\nfunc TestRegisterUsername(t *testing.T) {\n\tt.Run(\"NoEntryUsername\", func(t *testing.T) {\n\t\tstd.TestSetOrigCaller(bob)\n\t\tstd.TestSetRealm(bobCodeRealm)\n\n\t\tdefer func() {\n\t\t\tif r := recover(); r == nil {\n\t\t\t\tt.Fatalf(\"RegisterUsername should have panicked with no previous entry\")\n\t\t\t}\n\t\t}()\n\n\t\tRegisterUsername(\"bob-username\")\n\t})\n\n\tt.Run(\"ValidEntryRegister\", func(t *testing.T) {\n\t\tstd.TestSetOrigCaller(alice)\n\t\tstd.TestSetRealm(aliceUserRealm)\n\n\t\tres := RegisterUsername(\"alice-username\")\n\t\tif !strings.Contains(res, \"alice-username\") \u0026\u0026 !strings.Contains(res, alice.String()) {\n\t\t\tt.Fatalf(\"expected to find alice's address \u0026 username in the entry\")\n\t\t}\n\t})\n\n\tt.Run(\"ValidEntryRegister\", func(t *testing.T) {\n\t\tstd.TestSetOrigCaller(alice)\n\t\tstd.TestSetRealm(aliceUserRealm)\n\n\t\tdefer func() {\n\t\t\tif r := recover(); r == nil {\n\t\t\t\tt.Fatalf(\"RegisterUsername should have panicked with double username\")\n\t\t\t}\n\t\t}()\n\n\t\tRegisterUsername(\"alice-username\")\n\t})\n}\n\nfunc TestPickWinner(t *testing.T) {\n\t// alice is already registered\n\t// Register some more users\n\tfor i := 1; i \u003c len(validTestCodes); i++ {\n\t\taddr := testutils.TestAddress(strconv.Itoa(i))\n\t\taddrRealm := std.NewCodeRealm(ufmt.Sprintf(\"gno.land/r/demo/user%d\", i))\n\t\tstd.TestSetOrigCaller(addr)\n\t\tstd.TestSetRealm(addrRealm)\n\t\tRegisterCode(validTestCodes[i])\n\t\tRegisterUsername(ufmt.Sprintf(\"user%d\", i))\n\t}\n\n\tstd.TestSetOrigCaller(admin)\n\tstd.TestSetRealm(adminRealm)\n\n\tUploadRandomness(123123, 508930)\n\n\t// Pick 3 winners\n\tw1 := PickWinner1()\n\tw2 := PickWinner2()\n\n\t// Check if winners are removed after being chosen\n\tif len(completeEntries) != numReg-2 {\n\t\tt.Fatalf(\"expected %d entries, got %d\", numReg-2, len(completeEntries))\n\t}\n\n\tif w1 != winner1.ghUsername {\n\t\tt.Fatalf(\"w1 should be %s, got %s\", w1, winner1.ghUsername)\n\t}\n\n\tif w2 != winner2.ghUsername {\n\t\tt.Fatalf(\"w1 should be %s, got %s\", w2, winner2.ghUsername)\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"8000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"PLbCOdMAYJqnmoyd22qVTAjEDXKik2aNiaFYmGm41VdgHfTj1zMx6+fNS/N3HhOv0t4IbV/nuMKo+BX5xYVIyA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","package":{"name":"main","path":"gno.land/r/g125em6arxsnj49vx35f0n0z34putv5ty3376fg5/run","files":[{"name":"uploadhashes.gno","body":"package main\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc main() {\n\traffle.UploadCodeHashes(realHashes)\n}\n\nconst testHashes string = `a657602fc08191e7a4e0255a818a0ec544c8ce0826fe9ecf0c47eb538b2a9920,e4ce35fc370cb77c8416d6cf248e406c3f41073955d2d1c46dfcde630437711c,d1c73632a00861c2a57502edcc7105df21e22f6f4764e07dbd76c1dd456fd763,5e9a113e15140d8e7ec30a70d999038970da4dc84b8517fdf93d8eba56b4f4cd,d0a8e682db50c4b5f16dbb1c206cc8086f58094642d5864db8cd5feaefff0eae,6d0d8c67778d4ea8ac5ed234c12075b7ccb96350ea84711f455eb1538ac30025,e287bbe122d9be4c90d2fc62e51abbc67de50f6c8044636a61e7f801081ba907,6c4567fdd88ee306f715eac751010b5ef8a66bab66258e580be4915898b1dfaa,85463175e47915820c55acbc2531eaf360a8c0586c3b59cbbf270efcae64382d,b9efac79a5d7a24930b1429e884c0e8834954c07d71fbf65eb2c6ed9deeb4b86,e22a3c12a95f1f07a0efc398da7c39c4dfa75447f17a03184271cfb5a5c96878,38b9840b1b4424a90d4999dae44d5e84b91ca5ec9f9227019134b124e17d9365,e8938fb84352f04418c0004d647b83627f9a87ca6df5565acb3af41a5ae4e96a,0230a0c0692cb9a8a5ef678e43f6693c48798ca10cc18694beaffea4825d8ea2,df9656caee96c6307c2a5f1b8e7ccd5939ec5d5d20902865d6bea75c696ece8a,0826a9dd51b29e6c2a5fa4851b9901938766a966be238bde273b4e18d13d8f52,3b6f3cc0d0a263cac2542c2280f43f15fbcd5e84a8e381def4f85ead1f50fc1f,203d4d1fbd75126347c4d6f5507e9d0a3a3e7c882add72157a036c9dc4e66512,7390338a73bb575ba433c21c4f20046fc84e068569ae4dd646105a9a6a58847a,336dd7b5898bf4970a26b5b4a6fe676b5dcb8717e001c9b35bb77ef470b4a7aa,8a9664c99a6f9c834aa54c4a762a31e8047584637fc9062e5069c0aa72631424,f1c8980ccb671cdebf22a160a6e80d7e32fbaee249642d0542b0c200d49aba3c,53448154f4b36b94312be81822b1b5e50dccfdc79b32e2c22b16ccc6b7d578d3,f70a7b08f88830a74830a78e9cec3f8d232217b113cdda0c8999701ad03e8d9a,ebabcfaf537123853c1f4fe32663ab2b9940ca380a469c90b4335a3cd75ad845,f11b62e725abd3132689a08c414a9d8056306685ad579015234147ca8d951ef5,e8746cdb50ea505868f1b14a639befe60793e1b098595ada30da9dea8543f85e,d64f3d1df00b2499d8dfb70a7ec677b6254194c1cc6fbccf2a5de0a1554aa73b,bbc3769aeb96573e828bcb88d4043326422a486cd7408d673f55a74c2bceb905,89b3990c08d38bc4f157d83dc4a3de9daa22d47eefa2b8d2083b45e22d987059,befa5f82ba8c1e203827afdd525b1bff339db39bd687499e67cf4ea0ff1ea7da,35248acd0ed6d6a551b7e6bc46f5fb6c5e00e996021298370a3a6145e45557bc,bacccc0dddadfa4e5ce03565a4d60fbfa13e4c6df882b4c5380c63c2fed1c72a,c3482d84d0f68d7340aea787390aa271051697c9f6189e01c970ff18cc871113,d03111e4fcf3c5706acbcdf03408f27c392de6d622b6c587fdc01a15aac8511d,77d3c66add6417b3c82b33ffc4bd56f99f0e1f2ad6b50cb7dfa52cc20fbe53c6,de52618ddb2a0814d537e701065d093dd99b15ff8ed9df4a47fae47b36191144,e5b2c494f09c57fcc1a2f1c81b8bd543418561195c1b406ff0933c80bc43926c,290862b65579a5a9e7b7af38787aadd098db50c474fc8973f1d40935c2abdff8,4790aad6ef509672d5b51ba192b1465f4c7c8c8ed5575164e549502498cdc314,bf421d436ac5cac95ebe884d84c2bc10865b614ffda07ba5e47bcfb45d0cae68,44119bae5a9ad9707bf4ae45b986db6c14910549c134977cfe4a9722d8bb8413,8b66d6f823efce27b5dd4ef8df2e7c420f977683ad951e55117133c96d3a2fef,7950ef46b73ee87379ce9bdcc80e7fb5cb1e2a0550142d09772f5adb48990783,47900068bbfecf6e272a543101b24e3284cf97d20f10c83e0cef34fd3d7b8939,9b70918fe6fdc6b997251f8988b1e28b26fbcf5b00aa009b54ed6987954b1054,87e5fda75dab4f89646c832951c3ca0ee2ed7908eb67be8b7665bca0c11d4863,e2401111629a0f6b97c09b98cca394d653ef3b2b7b130e6dd97a1bd278be6fd3,513ab2a40f29de856e9e75f7f556384b5793b52630966e2572448201b4d91241,38ce4e383b82bba6324efe0b591a140e108a140d348964e12fe4095f1ec28836,10ecfdb05cccb69aac313df1b85b6e9a8d16239fc72b6ba01d54cb3a01367d23,63a2f5ba3d1e707b0d2e7143e6ae0b59d2db066c910d8dac1044282a7b414a2c,5358b5d792244a4a9cd76b1a53cecb72edd8ad86b150bee596bd111984f37c8d,f1472a16d28eeda10cde756bb0fc9b1edfd72086ad1b7ba848f3b2c7c0c1ba60,12e200388a96f0c880cf48e93b2ea96287b7295b64ca80618e0425bf57fefc12,ebcc48149e5fef8d883c2feab956bf116beaefe8ab9eb751ccf991036fbd21e2,0c40425718e03bb1dd82551fce54f4580e8220fea9f6d615b026698fd9669c80,4848690fc49a95c439cec58f89982b58840164815d953c8fa87ccaaab2bd1731,6a16bad26a7cc979a4f8e5eedbc80fcfd9ed7ecab91193becaff50f33efc28da,ebb1a01c03117dcb0aaea770106bbdeaab4977f48c996a4f099afeb1b2facfdf,01b214bd9fd35002db91584f4eaf2c6be48033f47e10de7b3688a8ec03c3ac76,7826ebc97a654bf788cb023f6be2dd87989948ed6c1459af75d66323ec609933,f5e1f76ada455535d638d72d5ef1026376845487d1b6f36a260e4c7e9695601c,3f7f2d5f5a5880ceb62584e53b591be6daea1c1256e40d08bcf800341c0f4998,81d396417b5c2f4fa3ba7ff9a549bcc4828c67023f02e312a1d2b04d6a0dc284,a038ade0998e9b9f9b8f6a6c07f1fcfd71a94c2cede2e008c01f20c5bcd8c951,440bf41f1820ae151a8b9b7d9929092506b9b37ff9008d25b420189f6c5fca13,3a84efff563cbf7b4d8d5cb263f4f5fe0b165d6489ef97cb5f027132637d5966,7424bde3031042dca9b2772420802729013620f0080339286714a1cb025819ff,7ce7ac17c0ee78366435633c0e6a7856a39191acdd31e0a4fb8ac805e34d46d3,aec871aab9cd61464a27bf28f20f9787d1487fc7db381755b446eaeda32bef95,1776c5cfe011cba0de6adedc058437199b5b4d022891b700ad34c253bf51f528,77c42978cbb6d4e9ea009bad225ce9c6b9628ef385b0e920d840fc717640c2a4,0234edb9221988c6f9926a02875e25f902636edf0352dba3119c80576f6d234a,a3982bc2e9fc9bf4ba8a557faf0fe3c87c7d70704cc34bb257ccce850a56df9c,1028d4888bcbd6de66991f55b05281908a43bd721999e52b864043e5b20a1b4e,1243e8b9d1f3f9faf60a3ef85df793a21cd32fe70be208daaa8b581ef2ce8e68,f126a0245767f09b0673b4db69cd15c21f5bd30db6a4bba8d1a31ea641d58b33,3f2c79cfe02d3997fceb691aeb35d7cd57de441b4cef6e30b9b962deef9c50b9,f5fa2ea7bb2b4c8c6ffc48161983f88bdd19be45a57fc98ff9c1fff82f801014,d8df89e0cdeb42bdc936da63cde0fb936f56dc234da63917663fd7372b7660e8,0e8b757308130fedef4420b79e3d3945e6f8d2d17850eed9309e4d130f654672,b997b5fc7ccd97a0539bda23185af6f510eeb5d73de4fcd6647784567295bc6d,a3e3ef6e658b4466bf2171c47455a80cc2bec6a90dcc1fb3390cf744eb53c1c7,8fcbfc5d27166c53d080f471d16f6bc8e8aebd92f0dad07de4b859495ff042e9,28a00715a1445747db570f4072a94bb51e3174665cc256982f68eb73ae373ea1,b9a85ace3beb1b30f5246b3226efd57c9f829799fe621585ee7835f55d390960,76f2d988a34611508881726f80b18430753a9bddaf239fa1e3ca248c07f563d1,810a984e20a8f0d9fea02b69a9d0d7ee64743d73c24919f060355c58221659db,ec0ceca541ac704ef78375ce66bae03e2ac7f948e14d0702702b5edd44431ed8,45c038cfcbe4bbaadb423bfb6d69aa166bc36444478eddf04dca330e747645df,66978f4b114af8a2c7bff35caddd57b0e34d4469422e1f5177d84efbc29e9f9c,68deee2f5ed12726ba48c143de86f5bfc6f52e42387b6b118bd6adc15c6398de,a0db86d2a0c9ce98a0e3e45bdcad8786af03bc8c616726b39e73514d242903fa,585814809fdc5504c535b33a7905c9eb1fa3fa49d614de3691714738ae50800c,1302a8f2dc151addb559c3078c9ff96e4d0c0830e741837ed7167acab0f9c665,4142bf0dad7aed829ce45f47b9dc7301c99ce48eddc44eb72bbcd790238e51df,7258b40d72fa503550edd920756c4a1707b73bdefcce5ea94e79077e215c2ac0,14e73a66c7000d5cb2e2814cae0efb467f7a7db3ff586781127d35755ee90dea,b0847a80927caf523b377dd8e6afbfd29d9d247489f5531492b52a1603efaf31,1fcbf67cb147f8550780d80e16f5a9e22e28d5fd73ad04c7eb05f089173f8e6e,4b7ef70b85443c71ed7d39c56825a8d6faacb85a4697cafa4945680a0ad3a9d3,5915da1266757108bc408ceeabd04a99c93f745af0462d1df9ac42384cca7e07,b3acef10f8a2f04d21dc8856c7e138f103dbdc5e6b34e6871b12eb2ec6907a18,8da8f353e95c27476094aa037c06d987f72ab08ea5927af07bdffd24467a5f68,0502db50a5bfbbfac71e959bd4f372a47e83ab6a17a255b0e60b402c122b3fc8,04ee807da45b9a2a8a1cdd0148e1babb794e9e7584c55f370a2f723a16632c2f,79ed422a442f7b3a6b194660ec90560b742b9ba018c2bedd72d6d5a60b332c5a,07fdacdd8c1909fa7042e20ffe2d5f5bfcdbdb59ebf3e11886d02a5f0fbc05ed,361e57a73aec8cacee32496094263948fbd6a9d96e731fafec127eb9fd813f26,c36e6c40c3035c5dc4d8f015363c4591dff5a0e2065aa719c751cdde1a81bcbc,9bac59d959407ea715e81eb23ce43cc88e462c5a25ce525a5dd7b417ad7ea7d9,8dc69bf8158365d866d999fe69b6a7bd869961bafd09863b30d7d6a114bfc5b8,b00f70f3daa8b95576f82c3e59ecdd8558029ee49fe3f726a39d06a1e8fffebe,7ea988c095c4107824bced289ab7d21136e81dddac6a57af836e639135a08e05,966476658b04905c11608c684e267508c9f875f90bb03178b6b4b93ec2f98f13,f2d19b603793cc43563223651b218f8e465f1bfbbc803ac0982e75c8424e12e9,87610850a33a00749627bbc7c6e0aeff65813378733563d05b09333ed445ed54,b980b9789136661518c8864a2caf5f5ef7564408d05391888d25695d6bae1c9b,5fd10e734dd73befd2506c7a4b3d9c453366788763933a32ae7c8a1cec69c000,420858c69ef2cc9b5077f786392fecefbbd76501a8843ca13755a8efbfe6c6d2,6c6dd279e6b135970fe3352b41771341ddb0da7b41b5347b53004970ca2a07d7,247bf14ff84a4c498caeb9aaf249d186db1f84e19363a1a3f118801a57ba09e6,2d568b421ddbe5486bee08dd6d1c584f3311eed85dc714aea72efbc8f26b1b66,274b1391e2d9c3416515ecc8d10061cd1918f9fa9b7e91c7e96934e9cb6bc8a1,25fb97b440fd5a8c2148b8301eadb6419c1350003e4d9f2956a9e782a3e898d1,2d1bf699f5a8f2c5b2817eda0ef641947c6abbe7382fb888194e1d5fdad09566,330b374790e6d56d65f871ceb5a1779bc9859ddc29fd7bfd0d2e2a36936d9e98,3ad6891a7801438b4c695915e33ab8b7601e7f96074425b4dfc81ac76d6d09fa,8936901fa82ce332b699810e836e5320b0a0c5a267be7d875f991607a4eae282,d96bffa8ce37e4148483ff508f2a60b6629938db37b26664be8f4de4e8f9be27,7b4fde34ebe05d8c5a6c7c9bf0caa3971173bbbb62450179db376c1183325c65,4e38a924326b672f732602e8b926997eaf815cb8d9552ca8b2d694d0ceb74621,8d88853e489365132031f1c19f96787bb7955fadf3a33210222260c41b46fee9,73c500ead65ef2286b5140e06deb05ec11c78caa32954452e9ac50f01d4b1574,a8fbe2c40d74d690018dcbac28ce03edac5e5078d86544f04d422cb94b2dcc5b,3070a2343f71b624450db8bbdfa58ad1d4f20d171120fad69163ff68d969b36e,c4b2f358fc2cf8d771f8adc21419ed06fb3c2eafb8aaaf57f9f0036b71b24a79,8b33b6c3935ba61868fe6c3cc82dc09cf8956ca401e4081bb9070caaecd54a00,2440f69ab8f6f3a40c2bb83c8c11fdfbb69b32c6fb92a8059fc53f72c90a0fe7,dcb1b291ea41f4aa8f4632f62cfb20860a55bbcccd5b865bb36a8c0868763493,77fe31a59eddd7b925605d0081ae357da852d2530c820db0eea6418f826270ec,5a48b14d87fe45c7ef72def490db5cba84626720dcba876037241568ce75eb0b,28282b12ce1bf020a380fff1d6276f20533530ecc1fe666744c7761e80bdf7bf,f7965deadf987642563ceb0afe231c0ba0656547a83c3b2c58eb101cfc3b6df2,75f75d426cf3b26ddcf9d81e37ab8ef4e9421820f35abeec77e89fe2f229c713,df4ad30a4d19080ef444e9b86bcb539bfde6b6172254e6348e1f8677a6f8a2ff,72d98f1549d8125c6f98aa65ce936d978b7e46761c7b738ff162098b97ca22b4,07fc641ee6efc88323ef2928b263822f66b8bc844fcf686e8b6b809cc55cb28f,6fe314848cf6b71e3dfb97e81c58e8a5cfdd5c95907beba0d80cc733e338fc4d,edbb054b6a58f073de56cb76b962686aa3285cf0061dc1274c95d7d6091b3b33,600b8c1e159b5a119a8f2856c9da15f0cc407a9440c28a9c930b93319080e11e,dedfa5adaadbb507df7acd1aff8bf15e792556ef5a20f7ed8f2f733b50a2a94c,266161aee785bfce4cd62bb7f373f7f6c5843042aec46851858b15be81f99c01,a27b39e042e6b6d8a409c02ef510e87bb4fcd6d17a583465f1e3bdef8fd5ff66,bedc14158770ae8dbc3cf5e095890c1ae813a71519a1599e12d318c109a03d73,eb6c718e060181374cbaf61401df3fe4795b5ea7d69071ca54db7ec46b5f39d5,1db3779583cd8ddfebc1c33b9554c259e73ce94f352c8b9dc65d91b945f42508,9d178e34adcadf94b206f0d04956160e3e6f1aa621ee7e901f43d5b4993a268d,6852d1772470588b412382efa795fd3839c0b5f0d5c73db60ace8d9f0654f5ac,c16d4d475f5bbf6b0fefe2c737538109175d619e6fbf84fe0ddffaa107f49624,4a2d53b4176333403f606c59b12561716543c596455de1883a1a08648cfe5633,0abf8530e6570ac69c068b160acc807b660331fb7f206267891772e05784f080,ea085e3675b4f1ee23aee81d920d14168f7740c4dae404f081263200c582d5e5,d1f88d59c10f517a00f8379fe0dd5ff60fca94e5e5a077432ffbb6a2b6f85a13,43a471ba0c43af7bc0e53f487585fc7e44a4262bb0eca400038a875430847ce9,6a9a40995191d5bc3bdb32b7ae6af6b2541e55576cfafcd97c9bcd95da4b5340,e28698e18e49e481b8a92b4102cb259584d81edf3f73468c5ca5509d5b5874b9,007b899ee4ad9cf389a4db03ed5ec69e8a2c4648cec328f0c669425089186604,8ae572d8a53847a30f5e9f2ac5d734341c2fac4fd8f574b2b9d9b24817d6e372,f857a1374f3cb2c80661ecadaf5d0e3622e72d77d266aa7ad2801e7db335b969,2e9eba7803798b99de5e59a3cb207ca53180326d7dddc4f80460ef1e3bca9f22,6d2d8fdc6bebd8bb5aebf5f4008856c427fc9b077cedef06d7cabdbb35230090,e88f5a8743a1e2cc24c07bf93d2566293ec90dc3016d6d561ac359f200afcd7c,73d8e522befb3985d72f69876a3bd5bfd656ef442af8db63f24e3802fbf7453e,09dc75bc71fad01c85dc0c7a2dd4594ae3883bf5ef8155cd2856638bf467842b,69f06e1c5773eddc50d89714a081fd26d6c271355f609d171d90f09fdb6ad311,1e8fcdd32d547ec02338d40cefd09b02b28a4ae8f8972a4fafa158107f6a890c,79dffd0030e1dd9af958fe233cbdf1959ff3d749d863da8b92bf6d2edcd114ad,e089dab3bb2519de80cf8666f589e183f4ddf80f8778282694632499c093aaad,2f342899b6e2505b72a25f7f507298b4cd5b0400f9d034d45a95fa86d127b171,5b6767fdff5a39d92eeb8415eec49f48b958e9c38151ce4356d09e43f8b397e9,a70b2878df44bd3952d9da43fea40bb475d2a87d21b8d5750c2153163af39c0a,4526593e49e532e8e498a8b14c3ca15c1749dfac9cf39a0b44b4c18ddc319440,118502524e8a02d7c7ee2cb984b598f27afb3b7b78b92326b2fbfc3c53f48464,8379f7dc2c391ac38ea1d34ddff36faf5602bf128b6d93a3a8a6485b1d8dc23f,0c17a500636a9a94b405b8e9f2fcd45b058a4a9070c156332e429daf0379572b,7e302ffccaacae442283c86d2afdf7c240d19dc42c41440419c8b78efdfc9dec,a19467bab0f5a753e4daadd080e64f13c79bdabd7e403575f9f3d3b7b6ca66fa,4162c48bb1ba5e8dd38518f9d1007300e46348e01a97184e253a3250ed0f9ffb,c1e36882f77da60283f64d2590e3389497e6583fcdb61c21d352d522506a8882,64a4716a19fd7b8009a5e6d5924a74c65ef8e5f85c64345c7b89a4e6b6135e5b,8136dbac064d798c9e30bf31e62d74f99ffb37d3bd9f3d6d3c6544669ca3cded,790f8dfbe56b27d1b82b00bf96394caa4ef54263229bf3ee5b2aa891ec8b5676,7d060a4e92f2c1f4cd2546f5409cae2c946b70556b249455dc19fb93e8dcdb9d,8e62713fc4972433c63b1c0c19cc1d291471381b11183b40e450263956a4d1f8,46255b9d4d2059337f3949e4ada5c2d16ab8385f66967291e204175aa2120986,49023745977f47f7439c701985905ad2be42b2a89c070df73ea8dc7f9c5ae627,75e6c4c28e4dedef545bbe58ea2b497dffc90ed7fe6d7261287e90cd85a3fcfa,fee9501fc25e4c85c0d205473426d6e6f4e02eca002eab6513c6467885486fab,77f39047575527668b8c86defb3a15328d6f6289ffb1dce1b01fd1c9f193f739,59e80ebb2f5424610ffc9070e39c64805a1d6a44f52993eaf0b427b3a8494b99,bfddb6b1867c2d0cf3ed074ce94fadc786226f28f98f9f1d7ac5bd6a1e040f9b,4c6aae8655346883ce266665e0c61461636a128c8804d6aca78f9c8a35356fbe,bf4462bc1f0c88cd99e30a20c6b6eeae09f7a17a737314192aac8b40056e90e1,f448286e1d5a998965efeed87d8feffd6ecc3fc0a9a8658730da10715324f89c,7619cfb410a5bb992e9da50699a6cdd82a0279e27176ebf4c1c21c12dea2459a,48395b0355072b681c77cf4684dfa228f4009c4985d013908539e34d306bb4d5,6fa9d11c314c5430db8ac179f7e1517d754781522b94f2da800a3d9db8a191be,79462eb8641df40ec28d7ae89ec7f1d5548b7b0316fb03da682726b35bfdcf7d,dbb07ef67043d85768c04c5c68e98a88685bd2785a3b20ba574403397fdcd33d,5be705a5717f0ad7688077b80765f8eac1be081d07105c7ab342db817461213e,0314be8e3cfcc6f00f5a0b3ce074f844f8126692bc9db1951df722379ca37622,b225bede76fe85a80c30ec258bcff80f9226fc3b3c07e1c75aa43e38968c85b0,ecceb05c114658703ee5bda417b23ecedffc67129d59b52a4fb60b9aad8624ee,56d6e51283d0da2e6aa6d8a166178aa5bf97c0d6ad8b6514a2b1a8701a890a54,274754307e41b8a6333f8f2d9bc679640fdeaa6954c94d91b022185d2e0f64ca,1c303f25b84f7f63fba0c97dd1ebf1148c1968658dca21b27df47ae2b86c4c2b,04638bdc28da59d45407c756701e4285ad0487858e92b2e45ccf99ffafaaf73f,ed4d011b44c9801335df5d3b5550977b11a1e78ec7ad1ebb477ad2eb707ddefe,333a3f0c920bf95d95cfaaa069a17ccfb0998ebc5697764788642ecb69c1746c,c6db8bfb6ee98557377bf8886a12c5784f613a53db3c09c161938039706941f4,25c3e1dcd0d27d63978adcefe9f862d9be8e20ed44bd80c359ffe99bc72fb095,035d2f21a40a3c5f97be226cb26e792130ba0d56dfe472b5cd9e1fd0b5d557f8,16411af320b57bac481c370cab692121e93edc942c2a6851c64737951a9594a7,43cc758c0134246a8a9e7db3f08a63709f0db02cb8431c21319e832845e3bdfe,3d9149f5c36eee7b661628d69b8d3e323b4fed8f544f8ca7b1bb575de94d465d,85ce96c84ff64f03e0c8b72dc9d6f2a4679c034836368345e22ffd0a170ad62f,2691d4f78bedcd4a6f6fa39c45a0109e4a11ce7603c656b53cca835d3863e06a,cbd21277046ea7f4572d6e8149077713575239ccf8a98c56b162b633a6490cf2,30335f29996cecf0747bf4e2b44f8ee3959e4cc277317d48e80f7726a85d87ef,afbde53c640182877df7eb5955d42669c5aa54e65ba304d6bdfb1be002cda374,d053a7b55ccdbf594d95fa053a1dd93d41a72e9c29b15b68e571e482d33277a4,3ae128f7b953405c2cd293c2e62a9c99914a7ed69d84c927c518bb9fc21b74d5,ab43d526f1dc6a32395c49806c8bc73bae918a5f3cb5fc1d0f99cc32e8d45867,7c5151e7116ff12d2325c9b2e98256e43802f6c4a15584be250aecbf143f50e3,5ee1a8ac394732056708b628216815b744eb5fefcff8426eb48d682ae7fe0bdb,e1f06ae08a52e1e4e7544d0ee343d33ba6ea5a71d7ce00c56a3f14058a199d78,771032904be77e19c389ae615a39e78aed70ae8e233edd8f3d5aafee1e4691df,cf0dfd60ef8f949ec0168439c7022546c5f00634e7fdd668900bcad1e2e81756,84bb868f3ec690f914e3a8cde683b55653e554bf5ae6516304ca95e3e0be0ce9,2e6bb4a91f7df30a0fe05ad3d02ea64b6a571a089ecd6e1a2caf900e5175949e,566cf7e6d6419fff93e8f18bd34b7fdb2db9b2d4191434e37a97e3a5cd00b186,912729b57611e1422879af83c5d11bb416c0b98fa83dc392bae590d7e90d5d12,54a7f54922ffc66260dcf30076c4cc7fa254cc9b830b2e37349d7b40f0d67231,d2cdfe1068809e2e519bec2fb30eff036085ed0fd5a174157f4a531be489a9c4,00c19bdcfabceeef4ab4c71251f41d59173c43b87ef0e968e7aa5bcf77fc3aa3,00a1b917cf86485c9e86030ec1afe9b7e28a4345f46471b92b4e0d08b698bae5,17b23ef7d38a3a0334ef68087a585ac48956984f6e0321c62d30011368954485,1fb0c2d4d015596c3439f405da4a7a2497ba94cdecb535e70cfda08c6a764f4f,993c1131175eb1f3b8b5d1d72ea5addac559a20b5154838ee86aa9b71e06652e,2ede50271add1f8aa5b91bcd222d83eecea7f4a524c9e62ec01cd889a55aad45,20ada1b4fe496096230fec2c00bff8a037db5079c6f45955317df9c2ede5f85b,b37b8821965b243026b83a59ea4e4e2246545fbcc1100d8effeca612a3b6bb4a,0760c516052f81058efd89aa11573c744ffd4f5685e11e9e200bd0ba0228ee34,fc3cc3b0dc5592a8c0a2e41d3ba995c0f65efbf2797c2b7b2403bd2c552acd64,0475e984bf932adabb1fe98d943ad23fd56e4bd53c2e7bbb12ea69b7996430be,d60ec04ea36dab7f685a2dc50c2f76ede60a6b594b15317d7e32d2438eef36ef,13dbd661bb4f0bc0854b761b94470f2c8d3ea069c2b2c53d07f40da9668515a2,875472cab949b679152079e79cd06ad376c30f4c298b2f7e191f5f7ef3aa1ccf,bfc95afeb7c01ea29780954bc62c9830af90e4a8882b64d24e65d7c30e075e48,4d100b664eee670a68d88d07bab4ca55dad28da862b2af631b29d5031920e10d,1275cde34b3de398a87fccd8bfa2261f826983ea774a0a413843f9de07beac70,b3cc121e4d7f7bc008ecd7d79b2f08d32c34c036c64678ae7cc43112b4297210,46a13985c51e2cae515be2a8f1eb0b42fea64cf366057a611cee74aaa7c648e3,df40e86985f66578e1ca70bea1c1a58b943c3b37bae49f639a547e759239513a,448cb5c2de497679de2161a93b5e0983a6030a33a59eee2b3171c56a93bc91d6,e6b371651baf1c9773ee1e240d51deda5f237e8da74048af9f3379f70f1c8e2f,d24ec5de76732220049843cf0ce87053bdfb223d8e45cdbf83a8d801ed486850,4131794225ae70468171aefddf3e5875a8ab294263ae4694f93a68e8314b0b5c,f5958acf10e9d5f12d9b0349bda1e652273977c36e1ad59c383bbfb512abcac9,19dea7117e47e557bca2019c09173879bde7a9703e7577ec5bf2270fec6aca6e,3cc640e6348efd77de2a22367f609c2f68551d4cb917f27c32c2dbc422827dfa,61d21b2cb4586c4ce3178f6ea51d905d9d00d79d85ccea52e5f4223811e12a44,44e06b75ecca6b3a9f91813c716c0f61f5990f498c5ed17a41ddfcdc0db48368,8da1c8bd377bb3892265639b26a72b7780393a8a43f6471a5eb1abd1ec88ef3d,f5e58a733b69af1ef5fe8a9a580b3790a792e44ad32a29e98d9f7f142862b298,d1e1dc03f1d6d75da644b8a14f8e7d3906b47d50968273f0707142bdd810de1c,d1869756e1200628a18e401e9510a9f78604ce91faf67c2e759a7b28c6eb882f,60dca01fbd010aef036b6ba742978ebacd1c49ba999e06f1b7985c5c0e96055f,c731ad94fa972ca5a7bc709d2cccf187ba47bc6299dcf3301b62990064e04fa2,d1cffa5c6c044dd22a8a0990545ac7bf5edf04b38820230af853949612ef7075,cc351a659c1718306c90276e7a58697709b69d2dd06af2dec6891ac77ac62a3c,82738ee011e454410ea714fbeccad19fe15dba4e62b7d1b85e65e7f8ed2e6286,2d2f067acea2451a17ad0f2beeefcc768dbf52a01f437a5066f49fac1d3eb312,fabad1b8e1b3a3e11810c408f748a7e70449f4274aaaaaf69b11ffeaff1504e7,4ab824b1479ec872488f501374e22488e0b8b4612ea16cca5208783016af9858,1b5dcad92079e86412309d5f85b01631a7aa3d7eda261080531cdeb89c96bcdb,a1809967d96449a3535d19e509fc3ae58b714805141f6487aaf06a7b00f47dc2,081fde0ec6f26348e2626daf44d932bc31d3ac3cc6546061484f9f68b0499422,c3d10191066b94c7a89f91f75fc9aea86e17ac5894fecb8c0698957771d196da,b5474f0aebab60ca12d4f8097a499f3fc063ad6146eb6db4191bc05ce82312ed,147a78e0d0d68aa642b97ba83e7b45ff5b367341f0a0a4f551f593f3ed8855db,47b2514697f7793be6f9ed37ff3cee74a4d1a3012d468c6069c50b6681ec07d1,d59ee71f32fc530efbc54952356a1e564e7fb077b9323bc032f6cacd7ed47917,f0c7fa099c97483728d04f577f5b1462443136e52b9434b5875e00984eab9fc6,a8d103d654099371f1a97f34cfe997683000cf2e7a525376d6af1ac2b75d71ac,cc5f68d406097c09e8d86b667213f52b77d3e0e543c86e3dbede40e8c1f7490d,b495595a4d94415ad9e3c6fbcb8589ddbaffa7d0c9077fcfe261efecc76bc957,f4359ca550fc3fd61f08b20e7714d37f1ea257a2d548fcc6a40cbf1bbc4bfc2b`\nconst realHashes string = `e9e87b4eb15718e70e911f64ce342e53494f0e57705ace34395b083c7abb2ad0,7800006fe5b164f56075893139a017bb3d3739c60d48251d1dc0de67d31b607e,e97fc92cdfe37e7335e40c508f7fdc7c699b4bf0411a84074f356f7e390fcca5,2f9f6947674cce2ef7e93a91fa6abdd16d9f21d486585332887e3dd2acddc2be,e803741047b718696ba189e60f6bb26c38a106a2e81b103f411f26a11d5fe65b,56eabd144ebde6c252f07a7fc78e16ea056089d100f4a50ac592b1a577fd0b79,ebe55d40815fba145141edc1ed07e089aa4fa4e2135920a1be6a6c7744c774f1,fc480303bf79e1b053ee2af980632dced1bff44c193cb977948cc88c92474a4d,5706da2eafa2563f8e0b8550e76e85099be3013aee91121193c3e844f65a8a41,3a17a14a33ff3af0cf7cfe264f4ef02d3065559911a1d02ac213d8bef29537e6,351c051b96dafd5f85f02a0e7692bfd1879c731142c4a3db21ffa2df32f49c74,72814fe335ef70b8438a593d848c18fabb5aade52d0367d23062ffc2bb1c41a1,f2744278b54012829391d8be41c9f26f8c3a651238f0ac39d96e750253bfdc07,c920a76d3704305d69a7efd349eeb7e0289d4adbbf967496294f4a0e841a3c76,a8fb5cf097b7b1f2ed7faafcde39a555259b340e987fc2b01498ba4534e2d37a,abe933e9409fc5a83c25be23427ff69ade3e25c6d7da6abdd9f92be381f70252,040a5e11b7b7059aa5ff145b095bebd94f17aa50597a80f66a897960b856d99c,d11576cf710151018fd0d3ffef768579e9aa5d3264aed4c7d7024cafa453e495,47bc670db6d54a7bb3108f00c9e75fade52c0df81114d3e612ba59d3887bf047,913eb8dd5be147d251ee0af4a70dfe72c780987ebe6dbe6caa13ceaf0ee3a4af,508b9e151ced0e12e79fbdf584cbc15f23ba408aed389bf24102095d8edef3a4,6f4481fd6bdda8ed51e10e8e5e96da95be5d6b187a9cf6dfe0d9453f6a164b1b,2d17dfe9d0a2b00f4792a9edf41f08d742ee8aba0537cdfa3c5a32e503cb5fc4,65d3d73b125502d98bb9fe97e49f4ed36a51474ae6556ff26aa3ba332d5a61e8,ec678f20615fcffbe8e2d3a8b113541782416f7b276a0c05ed15739c79d03575,5abb8afc030f22e327d58c745b09e493756fdc09c2a7901003f5640a91904190,82e5b1b5d2f12f689e61a7d6ae6d9244598ef1e95ed4b423b8a02fcf01b1727a,6655de92c4581ce0aaa15472f2588b9fd4b567ee7b26d59bebfc730d1bed4daa,85af77ff12013bde1abc71c996e6fa983d8ff0344a36520fcd8fedbaab4622a0,dad63e5f576aec7ce9186c365ebb3788cb5bf1ab753c26106218aee5f32f7233,8f84e11423f466760ce2b7bed9f6dbadc7a16901111deb5487836a1e64947b13,a40bec7a744963570337a83c2163da2708d447b4259a6cf07df5fc7c286522f1,e99a7f78b9a16deb62d6583269ac1245d477d22644c9381ae4a46d155e48106f,425c78afe003bf3ddfa314c3a72a29cad4908818cc4da12de3d6effc302b1ce0,d3bed354310d35c510a7ae9a3ce785339c057d57f93aa05176528293efbf5cd8,3d90b0ad5f6ce279e246650cea65cb85c6ce7088f9360631c98ef923ee6bbeb8,9d032d71819f5e50fc605639b28adeadb990bfd2e21b88e0c17b6afc155d6896,3a49ecba2479609350892979e0862abb7b87d9b827a267ffffb9c1b788282ff3,846d8ccfb23c83a4a508b811c630f0a271d2808ade3e1d2ee05209c4a279e23c,00de2f07db572b536a575393218da14bb1adf8035bfac91bfd563c9aa4fe64f2,8dfcd566fa2eea2a0742597d5c8d1400675a42ac5478b0f3c6fd82dae06bd4d0,b8741b6677d12e5024d36078bbe0b678cc0f45c2d4de0e1607f596b3ac5a2f8c,f9abcb99f5904e67044a3b3fadf1a677e1c109975663662ad662b90b7798638d,0cbde6a93e27857ffaf30e3a0016d25bf9edde11184c93d64bb3f65b6bd023d3,8d344a45532846c96bbb524e2663ebeaad4474bcaed5f5c4677da70726df1d84,1b47c76f30c6160203bb68e2694e677d6d56e49ca67c99d7849bb14608e04a0c,dc06370bf995d6dc0a0e9244fda303b3ed18946c6499f3e2451ba0191604a7d7,b276c14499aafb97c7cf10a9c81ab669868c170150f2254920ff0684c57fe6b2,6dff8330e22c8311b203f3c21db74734403a6878c305c0ab98e934219f1ae94f,5bf846ff7144deee1ad1f5f75770aa6b092320471635700e2380697b18f89bb3,5e0aee34d9a5f5354570682fbac967318c86f6aa018128ce8f2220aa2ad25c4c,362698e4d522c076098e84753e60023ab4fac5157e4bf351cdc51b8d07b6d694,dc557af1b2d95082004fa277fcd7a9e8d1d830cf6919eb57e409f2b7871e36ad,2048a551e388acf250991da20637cd048fcdc2b54a71b11fca6b372f9e330653,0ed33ec01b6eb2243fa51eae231b17fb366d2ab80e3c3117c81fc759e08cbab0,5d4076b035b11ae5c11386014484a5171b3f8d51d2dfe92a9b57e34f55b5978c,91eea2adffeb6d79145c15b92c3ea38159f0679447712e90c8749d0c0ade8911,4f46cb513d4594ed7bdaba8ec384898cedf60ea72c819a56b67deacb611c4821,b7a9d4b331497e24a02b2751d90053562d22deb12c2e5852c91b0de5c0492ed9,d583ea98506c36c097e030dcce1b1358c805cac21507b50ad5589a98667500ac,2a9567ff0563ae1676a5c177d57be34532a46e0b3c6a0b2d4cbef31717729c68,118a76b7689af1a1760fca14591eac9e71e11d0d5deae9d2c0ec01e716a02cc5,a53767ea9d3ad8ed5cf121982f3280a22fba9292f0adcb302d5c8c79e83a3dcc,8ab5d9864174b56991bf021d418ea33eb4e9e4096a7dd1642463a3ed0382405a,9d3b76e383d89be60afe96a57d6679ed7b5b86a1418bb34660838f394943cf07,3a66cab4373888e030aa840acedc723b5efb38fc588dd6675f822058b18ea47f,de1de8a2ce00bde2af42ed1767d7d9dec03ccf192daa167a2020c4bec66cf9bd,0bb3af2b796862ddd524fd42c04c0b0fcae1690e9444e7a9c74f74705ac3b383,267dabe2b764f93aedebac70b65a168586d40002e0b51ac756fe2c49ab2af68b,de480c3dc1a6d396719d0ea055c54e876e3a9aec5e19d6e0e6863837bb498b52,110f42d5d62d68f5d3ec4eff5914fd53db8806bdffeaf2b1c5236da9be725ab6,232574642b6a48d5111ff005f4decf8baceaa345b0823c857f77190570ae9aad,b841e02baeba2bc4b3d7442d4c5869b5062206c3b0ceff4d9375a40fffa0b352,3b5b14a6e908fde20644d3de0bb043578ba8e0e29b63f76f8a8ea0bfa8a74849,4bda325621e6367b820aa0d8b63d004ba601cc90e1afbdfcfe2cfe0e7fdbf567,90d4a29bbb4d0e5dc1773b5ad302a501aa5c6c320bb5c3de1e07317444a8708b,0fbaa35e664fafd424d6a126616f94eec15dc846976e3baef8c8ee22debb4f14,5bc87fe4259f2193976ebe84c5b39baf325f601f31299e1c0f05cf1d153b8a00,c41bfd93379389df55625cabe7fcb9a2a5b1de2083cb6c9dcd9748c6496df5c6,9aeff2c17923027a17a042318fd9dde70b166e344d070cdeee12ce889a4ada72,466dbe48255257af2b2294d3e1c1a13a7e0e9f58f205a51ab789ef7bf453c9a1,abb9e85c9dba04da740cfa67e475e5f7ac1c7850bfe00ba62b40bd3ef1cfdd51,f9f9d3008abbfcee77d6e6fba7671dd68a08dbfeb6e9ef9f4c1507e8c74f3807,cbbf35b63cb95a4c0c2d16dfaa64c581b765569a5053bfef4d0db3475ab2b2bd,e536b4bc445f937499cd1fd8765b8a6662a711138d88dff34f7e008fa7c04e1d,528555a12e808438567613e043021b8ed777c92bc7c7789398a3fa347bff5f13,2515e5754de16c2f0e32f237eb37c5a900d217b78e9cbe115b207e37fc8d745b,0bd3139a9d56610720fab60e29932b0eb1c79c18a4af23dd9e419c2808d2cdd9,61ef2d5988466f4ba6f0ca2f2e8a59868093da7520eede5eebdef21a5a696c86,e39a6e2bf88d82315d428d1c1d046d212e83b9616645c7f933da9c33397f442b,7bba6ab898e6eaf380ad82f2f9bd0033ef3841702cbed0fd9178490bea9b1c86,2cb072941fd0f9d8cd82da63c87375c93024d027ad3fe6d58228401298414c5a,3ae13ad2d4be066e8f0ca534b72e028827cbca59d859edc6f5bb4029cab1a767,2990cca8ec637ac0245dfde5e796b54646f06e6d4b143ccb7a71b13684bf661f,fed7ee08c3e1cdc5777748939d701ac72df1995436aabdaadc636557fccd52b7,0f858741552fd5772219f0ef9db4b79fb05c9ca82706a19f2154f1160d831670,ceaab671874888abdbaa16b105f8ec400a54d6997eda8f778d3191d7fd48a4b0,305867dbe416b3ed56f81fe062273adc1fb733c017a330b69e1ab1518fef1c9e,0e7cd66ddfd33cb8ccc260131da6c4459a9f8a278dcfb1dde9fe2dc23af82448,9f381e2c391201683ed162b721f5568d48ca93adad95a2274eb28bf109be29e1,fe202e6f9eab9c16d6114ef78a942187090308e74c678b1a3dd9a72bc941476f,7a70a389a191b45ea0ea97eff2b3a673cff8a9308bb033c6e74ec25c1fd39010,cb5f5cf546ceae812531bdd44f11927ba6e2ba38452ff12410e945350b22a952,e4d1ce719e03362d8af663187f0114bc5d8ffb87ad35f98621307468797697e0,83ee7db71a60c9c29dce29e18b8c50cca2519be9164c78349f7bca19c978ba0e,6c6b5b5b89293d25538dff1157da9badaa85b62feb8faaee313ad8dd16fc6610,417037383da15be5761187f56b18bbe82cf4f7668f6c874f2973524ef8e00d71,ad9c608e144f4b8c923a0fada7fb65afdb31b076adf6dad05d64c498abcb7be5,fdc94a85b8a5e900501e89f543668b7b25ed8abdda7b97ba870b548abb1ba894,e1015138323295b2b2bf4cda0b750a47ec7fa8f1a4aeb2162af0ef5769ceaf8c,ed299596e934dc9d9c84f835872a64990b4a39614e1360c578d98b20627dfd68,a2e48cc686f56d9b4892a03963ff75aca227894f33e96ffde210168e593132b1,dc361d0609b43f5e4e17f62d1fbbeb4357b0e33d8acb1eb1477acd7ce115b99c,44e69e17fab348767b2b503c8e4895f8329e4cc20f843a56ada76c040d3c382f,37095dc5a82b494766400b315d6fd5718d6b18a480be3fd7f2cf83f856d632fb,24d802603c5d2e4f0557db3fb5f788645b8fed60b9b89c1c5219ba01411a5253,16985e81c53ec05958458470e849cfd342d0c5d27b4717f397a2e6cd6a33710f,91afb97776aa5f851146931a283c848cf722d58907f39934337c723b5567e659,b4f81c16881556cec4f9e4b7a18d7747f7911daa2fc93b6fa0f6d6cf405fb504,4bdd62af7a0101eebdd3f0b63b16fec9abd646f439267da2955420d62049a86b,9a489af0d1d0f534bc564acc29a299626a07fb83c6c011f4d11594ea304af53b,e2877e2355be38d3e4ef33c12cef08060e2d3c89cbfe0c55df58b10462e5836c,37af0eb6485a2716ceede554bc9efbb9007ab7ad01d9d161feb34a6f0506d044,ae2e4ea54251b9c89ab15f2eff1458c265a2adef7a020e48b13057e486f1c557,5efba48cebea5325d5d2a10a8c07d46cce14e59120e8c7f8d2c83ea11d8b3997,578355a5f8d9f78d679e70a3a5dcd7de3e53e0c2c9561622214ecb408f538c00,b533eff5eeb9fea8cb2b9643c87ba4569cce263b6589c1c6233118f692a5d013,5360693293f46a3af18758b1a09d45a11a3b7cab795b968dab6630220d07c396,6ee4248414bb16bd0cca972a1576bc929f24a43f783cbb7ff1cbb8e1ab78d530,7f34631c219fcfeb9599d88ee2a4747555c5f9d0422363f2c5a8adf89e29b897,04d9d9168d9225baf21fb0894f47d450540cb468fc4435d8428b2e474d5c5c21,fe5fe8abf5adcc3a67040d3cffc721f96e1acbbe89088a6d21e7195dcf0b5904,9c8cb229f7505eebba8d03c7436aadffbdf0e7b5b27b39d2341b554d555424cd,b9d4095b5688c8e6ac9b6c68ee8982504b7f0392b6e76f1e2885787ffd6ecc2b,4bb4a7cf7ad60b938e96248387775842374e5a38080dccdb12a0fa05f3f1034f,10775fef0f30acfb5587d5bc302ee83cc29de8cb0757df8740412269d65b788f,39bd87fd201844a5fa421df706b3a7aa3af27849b2545006e5e6cc322ee97d48,7260b55a276a708d412774fe3872ddae4ea05c0f2773fddb904513e67e314095,fe6e66670d60cfd91e1c255547495c0d19a2aa2839ab0f6318b479e9d0dc9db6,4187885d19f2676807940ab4d020db6c96b7787291ad5c57b95c28c5ede66fc3,218691308fdf85dc6e5a4f1ed77ae4378746570159f3f2e41bcdfec6e38f356a,0a98dfe5c960e4a8bd2e53405164c57ea272ede6b240e0a2c967556fc109b8f8,033a1a50db0d5f358be7de9b53f7b3ad4467b9ac0bcfe4eac3d0e9783fdeb02b,eb166a75bdd43e524de83593c67c62d34ad91b781b121d3a0f14c49e87d1ff5f,9209aa5b3b4275681ae83f2aaa1897023be9d81fa772aaa907ddc0205c38324f,84f596d7b6f5850ca953302f11fe89016c94702448d44eda60916d80c53de6dd,34de85ce2fdb44f4cbfceee5a3dd167e9081a95f914b4c756c75f117c6b4c10e,f024296368473e7a528600c8ad4fe80b5018c23ec1b8104abec50c84a11a2b98,99256bdb15e4bb3f2a8f2f4e92d4e3669b50a47e8c170865c13d515ef06aceaf,e12f5435d0dd6f92d06f82ae824ec9333f5fb0a5aa7cb7ea9ea69ba78e2e12a7,d5efe2f0772f20d8c7f4e0d2eb7b77b440883eadd70bec8cf5cdc0800bff4b82,edf0c729221da291b3ebae3622276b4644b8387375a9d6381a4bda3a0c4a6d9f,d6be02b45c1d677da71c339821c83a4f68c31a5a9711f2307e6c7513298fa199,b743c6c787c4e9524f013e6828315bd3996dc65cfbf96716557e1d51a98eb69a,89e0001fe1bede9683da9ef6e36b8dd1bfecf1406ce1201776c3569212831610,d48fc44dcf86019a4285c0eb3c36d9b99cc3c498bfc612323e9ab99cd0f58a27,75c73abf279943b3e37e667eb26a8ac1e7a17d13369bf7980c738e6d43a9ecae,dc7e9c59ad27f0cd2cad96b1c6c93999e03bf6d239c9a6a83e3e6f549eb19272,9cb3d4c61b9d28efafbdf352a6e03ea570d313c23eca1d7e08346ad75d08af04,5276233c4d72e5cebcc43700ecfe4531b368ffe7cfd0d04b1460301557a9b333,bde0fd9dd65338273a419a314de54c8da0720cae2da4d7f8ca9955460c0445cc,6e8c65b311d8d81c6dd1cf49c3a88a560f5620bb81b38eacbfac449fd1cb1a66,e0c23171ccb50cc56f4189c192b83dd7a03389abbd4bff38eb073c4384fbb688,8ff148e65ebb7a8d276b8787f3d28ac020a398ebd448beef7f1ac42aad900b91,1a806dc17d2a6369e942712c783c7c083a85890d5cbe12596bb2a607caebe225,26996a56a3295d78061218066b2e80844cc2e7432db611d524c3d3154cd9ca3f,b9c3f7d1217fde63892f68bcfc632f6130490a846044c53955eb9c5f7dbac871,6fd1c3197e29a8a0dbd861edff897bc4d9c3a6dc71a89f9147a982181e8e0b6d,c7f5ee5f97c13e770cac6dc0aeae08a5f0f39002baaeb6a175cb580aee3a8dc0,a9d3fda2c50c6b8228491d65de70509684bce97c42614c1eda13d2eb10f3c508,bff4dc822a0a819c4b67f5d5830e0997c1a98b3ab15b49a9cbfc35b056a2d94f,3eb4005861265ed66bc3eaa196d1e7df4493130a3cad70f15f8e1e01ddc926ee,07246bc9adbc7937e5aceee1f2ebcc5a22e5bbcd573742e0c5a6df6ae3bd82ae,fdadd85b356e6fe5a5def89050b229eff1163ef47f41faba30aa3d8ef9094030,fd6e548b3e1d34bed4fa897f932f958ffb965b5f3b9d0bd61159d7c6da0338dc,68a3640157c17f367c193438b1a42a09f86d76c75adb21ab63e969cdecf50c8f,cd8a226dc0d8662112342546d8c16f72fda5b2d99f6cdabc78495ad81c3a010d,019406b65440d1c8ec3a3fbe058ec7f65bf75d0f08939e4b26a7c4cfa95013da,130b0d909c17bd1607bc2a22964fec0ca9c1676ceb0f610e795d50c9c8da21ee,0daac6d6f43afe03f0a18e899dd097841c5caa2724767eaff2f65fe9778f3c02,fdb5337982d6273dc91764a4cf1776ba1477d6324b00c6a0b4a31094eb552f0c,3869933bbe2215ba3c120c25945adb7ecd3b0717c2bdda01a0551b82c236919c,069a96322f96b0b90e27f4b3fb35d73fc84a93a8bbd27ea688b60d30a9b7763c,5788f572869c454f4e600d72af181d300d2d674c36456f98ee0be8c89dc585dd,1d45b84eeeabd1f79de41e97fabdd11b5d73cd3e014f8939948b801e1c244f1b,346c63c07b151caa8e9bb521c25d3ecebc2845632ace536d7889edf1e0dd94cd,1555a69bb2e26d78d0d91b805266d00da9b23ae833d90c8130ea5a5aa90eb189,790f9c4fe92b45c0f716e5f327ec8e222e5d10176ef12dad88785f3249a22f96,98d3af788a053d71ced22ddd0a5c00135b407a193c7ef5daac5caacb8496eb17,dd851378027417a8ff1b7b732c08f38e42bde933248669f274ebd2abba80447a,70c67f4e6b244d56ce4fa8679f9b7b66e65193076c135e366b03961f8f6a187c,da5f766d2b1d163e3793d27110bdcf256f57760bfa73559364a8b5e39f14b9b9,01a16f991ef8e7687e9fc95460db0430cd9a133e0d431ad4cfec9fe900556abb,4ce7bc87573e9ad7d29c734536982c3e880e25019bb8756e10ff8aeb6edbc9d7,c19aff38398c52b6652b9d3fd134cf624343d08d0c283e70197d01c85c92b891,d5ae09d2d8290f320167b0871a561a28f6991830c7f5b85fcaaf5667d8ca4b33,4303439c3ed52ec3578b44adc58ff53b3a12621d06c64d0cc99f6c303cba2a75,1920b35109deeaf48056f22a316561d813e11bc314fbe2776e1de60b6437a5b5,f4ba05804f46e57181324b4aa0b152c30efc0f112e210fab69d9ca6e4d4272ad,abe7c274b7a0d80a4d6334214718431431f320df14e6e58df9b9bdbd1326aa66,af67aeeae590542ff0979272c6b90cb08190cddee69286a8b331ba004a0f888e,60c4a672b97de98fefd742774780c613d2d5a9018b601b1409c904e330973cc9,e682e7b8f99af49255a0dee051a720f188de69b45850585768a49a15065b3853,530587d6c7f36bab9f99cb215aa95faa34510bc724076135e2e8636bec45486b,6e213faff82a3d4ef645aefeed16290828be01d6b439c4ca046900c4c90694a1,d295e55aef72e685294ed73c8c524ca4abd95e666446714eb45eeb76df655945,2874718d284eb610b6592d2dd5825f6882c3afbb46b8c614922e3caebfb449eb,bfe1927db97b3102d41b34b782432daa218672dd1183afdb4d5d802915681204,75781af10ea646843b3b2f17a14252e075b4bdf8d00f94d82486c77a4fd587e2,f9b6e65c24c876f312e5a98bd92b812b95e191fcda76a53f63e3cb4346160246,1a5b178f1f0c20be899f4e31d80f9a46142e3cfe27555654d4598a6b5cfb6884,3df98d7be645d921f20f26ecc411a2fa2ebc6007154a45099bcda16bc6125db8,864393d1fb0c0fc086e282f8f355d14ba38db917e7ccd4a2b348da847982093a,8789cea4725f089c002b96ddfb23db9707061e206d4b3c228c22c03ddfaf6b22,8385264354becbbbb2a297dd118e65452d93501bea3bee8d1df69de1d84b6da4,0fc2db3f3e8a3ef98c458e0aed8490e592c5ba0d623ca4fd4c08aaceb4d39ce4,837a8d9cbf086778f1dd26ab439c365867799cb5bcd3645c21ebe4c7141de8e8,25ca8f1ca5b9e878fc78733e123bd8a3bbc450b55b3f92dd84a3ced425021ac5,ce6268e9f6bf0d074014be88075c2002ee61a4b7ba9d8f7397916d9faaa111f1,0e1e5f75227a10286cb7952ff7bd9517df91ce1bc61cc1bb789208b47e3fe19f,ff96b9a900dd27a0deec96ad9db17dccd2ac68d14ab88377d9f0c0c6554825a3,c4330bc073a5a84ea2bc802b95df93602986db3780e645ce558cc6597155242e,a2ba8cf3a91e0515b64b653b27ae72afd9b2eed2b487263cbf09d1622c07d81a,1a27d303d6d3e7cdc74ce565271356dfce6a1a5c054aafe814c372f125a59f4e,79770bc8ff47112a1c5c00b7b32782e55f7a79ca9cf157c1f6fe6668e8c8bd49,8fa7d90982a889353baa9e61ac4c4b99ef23279eb234321aaa804432b5100f6c,21a43f4f639a904ae24baf27f91e7079c9ecea97b6eaffc503df28e5966f073a,e888fce69b0006f24585176b053aa0f72cf7e27a3e658aecbbf7811dd5006062,f120c74a791f334eba1655fa38cbc030d242b6af59902ef4c54525da7e9a99b8,035934a0533c3d066864b665b4f42c1160bf0964d47dfbb3c968ed10bc6d050c,16951e1a8b2b1e5dd80d7644e200e6933cdd4a5bad0ca08453a2c0ec77290e4f,4fa2e5b11e093347ae7e5277af1a999825ceaa95f0bbd6d7bc4b2de4e37fa4ad,f08273d25e7c32c0e343882fce1960e9cb9b07ef2dd43996d7b87a80c8e0366b,1dc2cd862f11e7c571a8e119091b45de8db1e9a04ab1e00fe0d4aa2e79e632af,ec25ca714093842cd7f3da2d65ffbe7dab9d09760fda079203d60ab03528b724,301d88a9c40e675bec37429d1d36c41fc3cc1f4c654c0c1458f8536907f27c36,d30808f33e64a638d346b90a8a3402210796eb7acde7a029b94ebc9aae998046,6079ebddd7753c16774265531b64d6541ef033e55969ce72fcb581ab7c534843,4aaf0c3049ca92840913b47d63acfa01756049db276c5984226c314ad297beb6,dda1d1e18903180a84efb45339bbfa5792952e847368d72e2e7346a396e3a050,e28a5a1038a9b095a70c3392570f36ff30a26deeca4870609d114223724b6892,52905ceae4ae5346e5a2c3d934c3efec13286919792ef01e1a988b6e91f54e9c,888d20be94b7ed9f29c5a3c308c7a65b2d56132e58925154695cc0d75a808643,aef74a5d4c5c6b17954c9cd1a8ffd7cffca8d3e148d53027dcaffc75777dac65,a879e6399947e329d6fed4c2986e0bbf735faf524e3a23915554b6f604c852b7,63fe3a9b01da198efa5f01d22e5adcfaf8ba47e087cf3ebf44dee05fee71ee88,ee7cef53e6ac67f8181df6fcbe453583a390d571ad7a699f1ec56ab02f0b8d66,276cbb2e0ba9247d70ce1549e9d16bef3dc4764b67702d7d07e5bf0ca619b859,da3cbc02fb2b9243454bdd19641a9b3213e068bb54c4886cb2a17de38fe1e0fa,9b0bc897a1ea85fbbaa486f2882b92353a8facad9d0297499488dce02c201fba,81b056578348300de524a20d86898f80745860fa34e70c214a0be2d66950bcb3,c98f26bb6593ad78192c724378660f6a4cfb91807180a3d318a89c6f892bc05a,f223b62fd8147d3286efbcd0153cc4b1740fa83be27ced34c5fd7c3133ed73e0,f634a45472f37873592680eca9b3a180fe1d0a52a534d4f303e77009e33df281,735ea05a744806872d4f90bbad99567d77b9948b3b4f5f21f003dc0a95968b24,d2bd88fb09feaada2fddedbe15fad7c101b1792b6695222becd793eb538a9e11,de400f8bd10edaedc199a88f6bb0d615ae2409dfc1e56478bdf95a242928e412,b10957c74f422fb6283aa75ecd7dd77c74009be89620b30fbd07f543cc46f8de,8fa364957f8c0edeed46e0624e18253b9cf525e4e8c56efdfc2bc5a20da29a00,def1bea916585ed32dcec3547833d5afc27f5229e411911c62d011645067872a,1c8e8d1282bd848632b800fa981efe8365df2248373f9e24d8c3bcb8d75db53e,4097ac0d4611f9b3c58773f4b90cec2b20c2dd70f17969faba6769bd7847e028,a3b26dcce8ba458d99d3f024333b2d3c7bf5e9eb7aceaf79a584f1ed1622d54d,a224e70fa1afa37319c703aec042e92935736c209126e672a768bcfaade27197,929e4dccb152c580c0f283751c64febde686df45d8fbd20558c9307da51d0dfe,811fbb0e66a06ca0932656e93ce152c8830a6270ac3082678fe070b924a0a9ed,174aa3bd59a7ab175568681d175c890ce80acdef71111033aaf79ef30d79ad1f,2526d12628b66a037634f1c39b39fd028834422771990e70a39e26cbcb1506b9,70343c268eeb3506fd7be3b170d66b50bceac6f32b43b1679e251e627ca830c8,967b165fbfa8dcd505d5e49d769f4550044d674aec1b7ba68df32380a2bc6988,53515f242a7d04c8571436db8230175930750068ad90491c06604464bd76c413,7c531464c41dde3282770528e85a4d117d22eeb7981edb4d4bc2aa9ac49a0171,97059e9c2d1e4ff960b3aa3f2b731417dd8e6304d71179617858983b5d2ad071,fa6bad715a5417bdc0db1f9d918aea0408f0e0be65419c3d8bacf74fd00e3c4f,2a45f391296346a6890e4970da4ab2b0a77314632d7c30e9e091ba934e250a8f,df97e7d51436f73d59c2a789cdf51c50474a7f01bdcc45a2e7cf52bbe56f71cb,5e4611eb130221a115a1763958d23f841dfecab160b6b50b2dce11bb0cbe4557,988a799d452dc9aa20642d921a2a2f963d25e640d022c2e7d998afc4f7cc6d0a,e84ab9e411a0d6f90cf4c060c83758aff4a7738caf28e848d09aa3f54b575bd1,a5b48b78a04cda7c58f54ca06747a6838c2df9bb41cc2ab611a1f15a10f95bf7,325fd9c659ffd57f5f086f9079f981eff71fe1c070ac964af7909f96ba6c2cbb,509dc32454539193e107e2244263e3b8e2499a976dd03c085d3941a7de28e6a8,71d157682f0828e30d2db8ab22d501537b0b9d7305b38da6835487807cb1f011,4fcd024fb007dc328bc55810dfa10b832ccfee5488cd975195f1161cad0b5409,4998aed27f2937e581bf723993bab28b2d0fcdbf64fd26a3c760fcfea95d7ca1,26ed22f810fd3b43ba458af695f4851f93781c7b3d4d3e1084e3d17f2e00836c,0f4da4a09661d5dc86c432d14eedd1585df03f2a71ae1ec7f3a128893de244bf,821f8d48fbb8e01527c1ddc1f4cb3bb577acca8a38449647f5cb131a50ecda1e,4a4476a96010988afd5f42138b3d4bb0a720c91fe21b9efcca8f064f3b84d3ad,0c05af3d5febcc5a6415912f5ead4c95a063fda2f34019d6c9a4fdc8ffcd04a5,d3270e407db89899790ac637a4d0191f91c5b806cafebebd5f5ec62efb626e25,396ed6adeaddd48aa3faf343f77af7dfa300d2dfc4ada3ea87361efdd8ae0319,d990910307af5e1fa93c558019da7f87f9793ce9cb220f35eb129fe5dd0ce09c,a5b22feb8c9b44871790e7b7b745e8bc85ab01ea4dc7953e34e99095cab5fa25,da460e04a28999946c791ade34dc6d93eb172d60833cbfa2b56b2d0cadf9a674,d72b838ec8b67cf28956f9f1d48d1038cbad7ad4179e8261e5413788de62f8b2,a88fea66842786dc2d41a80b9ad8bc4ae213d2499272f2168cf79a05e0ea360b,8000f281ec59d9fb4f50602cb7b042db4ef853349fadd945fc62f8d92e805f6c,2ec549bd1628c3889b9e2e389fcc136465dbe590c8c9022e7d6b2845acef84fb,3411087158fb08a9d8cdddea99a8e28b7ba2830b52bf20d6bdd6e12e8bee5f39`\n"}]}}],"fee":{"gas_wanted":"20000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"/Y4s5nvGtzE748JJ8DqwNOKm6U2p5uV7lqeCmdjAWZ9c3daI3jKFixhQBedRUUjqxxYQBNbnC6W5wHsyNFiCDQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1tgnfu08qu54xyew5296jy22e0fa24j0u4u9xk9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"cao1bmQQ8X7KyPoczxAm5WbssubhHGBygFgHX3o3H15pYfptIZxs26lttS5TMMxj+l+zEb1pH+Gb5p94jIBYQQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1tgnfu08qu54xyew5296jy22e0fa24j0u4u9xk9","package":{"name":"raffle","path":"gno.land/r/charlysotelo/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc init() {\n\traffle.RegisterCode(\"mfV32LoK3p\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Av4PSp/Jcy0g5SdhE7L63jHJ7tK/J6D4D0SWkaHK/+1p"},"signature":"xkOQAY6jd05E+UpWLpIBcEuJtS0HgRxYKDtzDNVcVoh5pPgQjPnR9YKMFPMbmUOD/IVzpJlE0YGyvY0HY/J2lw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1tgnfu08qu54xyew5296jy22e0fa24j0u4u9xk9","package":{"name":"raffle","path":"gno.land/r/charlysotelo/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc init() {\n raffle.RegisterCode(\"mfV32LoK3p\")\n raffle.RegisterUsername(\"charlysotelo\")\n\n}"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Av4PSp/Jcy0g5SdhE7L63jHJ7tK/J6D4D0SWkaHK/+1p"},"signature":"+fgGyjp3s8BQtUZlHuRBzFSCh0/l1ZEnr493D3QhwsNTZjJ0Ve7wBZS0Rgb5fNShyB6kHpHKnhgKzgcPnhtGfg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1tgnfu08qu54xyew5296jy22e0fa24j0u4u9xk9","package":{"name":"raffle_username","path":"gno.land/r/charlysotelo/raffle_username","files":[{"name":"package.gno","body":"package raffle_username\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc init() {\n\traffle.RegisterUsername(\"charlysotelo\")\n\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Av4PSp/Jcy0g5SdhE7L63jHJ7tK/J6D4D0SWkaHK/+1p"},"signature":"CJBHHzepb5sed0epCzEh0jangMxBtSQa85tgP3Fyykl2XWOgNZmf1SoZqBOLyWgpQwXfyND96titDwuV5iFwjQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1tgnfu08qu54xyew5296jy22e0fa24j0u4u9xk9","package":{"name":"raffle_username_a_lot","path":"gno.land/r/charlysotelo/raffle_username_a_lot","files":[{"name":"package.gno","body":"package raffle_username_a_lot\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc init() {\n\tfor i := 0; i \u003c 1000; i++ {\n\t\traffle.RegisterUsername(\"charlysotelo\")\n\t}\n\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Av4PSp/Jcy0g5SdhE7L63jHJ7tK/J6D4D0SWkaHK/+1p"},"signature":"8wgyzlEwfmZL9ZcAHfkg/CDMaV+cCICCu+JeaZv99P95qqcs5mhFLMxPSTXOd31KPF5nXNLHFBZkvARlx6hB7g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g176py0kpfzcm0aghmyz06flyrepsvv422fmcgcc","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"C9CJ0aEtOe/6J0a/+CwxYBGDM6/Mf+TmdliFsTahqLta33cdtQCVrMyt+tf3MMLjCijJvZhawmQ66nxTL/NYew=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1k67rnu27pl40yhdm5c9k958cmnlyerypgkrtpc","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"UKsEg97SPODmqKAr8TDKbNK6m9aAu7dHmtdsGqvTEf1Bb1PRJEYCDLnIjfhLn1gla+VK/44tIB6SH/+wGWtGnQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g176py0kpfzcm0aghmyz06flyrepsvv422fmcgcc","send":"","pkg_path":"gno.land/r/gc24/raffle","func":"RegisterCode","args":["wNx9fUoBr8"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AoqicV6+7nuZhSZ1rqe4PGWEtkev7a1AyHye2ZRnpu8l"},"signature":"GfJwYPFId9Qncnji2oEDUN1kL/ehY2cEHGKOzqbU2CYKXwlntw8FktUFFHy0BVNKUIskDL2vi+8BnxGfwXInJg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1l39m49fg30s9trgrcpf848vema5mfy2lt2texn","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"uT/ABRZwR2sklqqGv71JdvsFrpLdpYxBvmQUR9p7/60fXGxOEsUEeYXNct22xepHwEcUfNUQTtbDtlbFigLVzg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1l39m49fg30s9trgrcpf848vema5mfy2lt2texn","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"gpO8f3irpFL42S/m/nrTpy+PWjI6jZcHCRnNN9LEf6BzkrAg/hOEut4lAKE23xeEjTUSO+HP/o/mKXvC1Ua9Bg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g176py0kpfzcm0aghmyz06flyrepsvv422fmcgcc","package":{"name":"raffle","path":"gno.land/r/slowteetoe/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc init() {\n\traffle.RegisterCode(\"wNx9fUoBr8\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AoqicV6+7nuZhSZ1rqe4PGWEtkev7a1AyHye2ZRnpu8l"},"signature":"CBXOsWMFM5jxpgpq45bV2ME4lVK+ES02hJbkPf5mUKpxwyHabVJ8GTnzDKirygVr8HHTPRHBzXSOap9PYki8ZQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g176py0kpfzcm0aghmyz06flyrepsvv422fmcgcc","send":"","pkg_path":"gno.land/r/gc24/raffle","func":"RegisterUsername","args":["slowteetoe"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AoqicV6+7nuZhSZ1rqe4PGWEtkev7a1AyHye2ZRnpu8l"},"signature":"WQT/FCUYrGcLA8B3Fk9UBepxMNOY7CMtZ/R8LZxU/tJ4qQ0dVV/o3WC5h2MVR95dxqm43t/eCh1I5M3kK1F2DA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/event_emitter","func":"Event01","args":["HI","Hello"]},{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/event_emitter","func":"Event02","args":["HI","Hello"]},{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/event_emitter","func":"Event03","args":["HI","Hello"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"YrPLg5koWEfHKIHmvKj4+B8iHIstHFPUsQnnS/6MoHVKfiewIUBFYnRfVFw6rnOvA7Fw3N56B2VhcI+l4hRPjg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1vjzrzlckdk8n30ns32tz7qqw9dyzeagf7xtskp","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qVqg0r2qSTDSsT5AYRsk5Mk65ynfWAPsXs/TF3MZ3qQewLhaNzwyrMlqCose6zk/U9n3EUFjuopdXZRHR6Wtxw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","package":{"name":"cshijack","path":"gno.land/r/manfred/v3/cshijack","files":[{"name":"hijack.gno","body":"package cshijack\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc RegisterCode(code string) string {\n\treturn raffle.RegisterCode(code)\n}\n\nfunc RegisterUsername(username string) string {\n\treturn raffle.RegisterUsername(username)\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"20000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"EKGfdvLdCuMXK5OWee9LdcT4Zdn+j9ew6JfSw97TUDJ5OnrXhxYtU6GVQttwrFEcnWbC5UiONvQQxk+dMJUHUg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_run","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","package":{"name":"main","path":"gno.land/r/g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq/run","files":[{"name":"maketx_run.gno","body":"package main\n\n// import \"gno.land/r/leon/v2/raffle\"\nimport raffle \"gno.land/r/manfred/v3/cshijack\"\n\nfunc main() {\n\traffle.RegisterCode(\"0kEB5ZSwxs\")\n\traffle.RegisterUsername(\"moul\")\n}\n"}]}}],"fee":{"gas_wanted":"20000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"YWG5kUT7SjBbhBCqABCtUbJvr4g0h954YrTa6Sm6pYldYbUNIielAt0Oipqiu+oZxAhzoLJnY/HaMZjLWn4p+g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1z0nhhy5c85cn2eqhu7m67sv8dqw4aqpy5knp7p","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"kjsrBbfI/b+Qm+Ww3Xao6xzgGod+qbWCx6xs+aM99WNw3yP9Kls9y/bSBlTazGBbKeOfj1u/1dJLllZxbygYFw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1z0nhhy5c85cn2eqhu7m67sv8dqw4aqpy5knp7p","package":{"name":"raffle","path":"gno.land/r/gc24/raffle","files":[{"name":"package.gno","body":"package raffle\n\nfunc init() {\n RegisterCode(\"4QS2FT6hSu\")\n}\n\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6eEE7NDGyiPlgKPe0V36gtE5KRzwleLF3PvAFYdoBkY"},"signature":"xIX9jaO99VenhSwrhLyi9XQkon73Kc3zzQa1wBf032ZDtfg+6YU5I5NIvzlvv9dm0rhvw7HRninWNDoQm31p7g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1z0nhhy5c85cn2eqhu7m67sv8dqw4aqpy5knp7p","package":{"name":"raffle","path":"gno.land/r/gc24/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport(\n r \"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n r.RegisterCode(\"4QS2FT6hSu\")\n}\n\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6eEE7NDGyiPlgKPe0V36gtE5KRzwleLF3PvAFYdoBkY"},"signature":"k65ZnQz60T+evPk+Ok9IRPKytMMrZlt6ZBZgv9WFWaBstg5/xNATugkDE/B7th3EE0yl9Z+sXzaj5u6fEsIUDA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1z0nhhy5c85cn2eqhu7m67sv8dqw4aqpy5knp7p","package":{"name":"entry","path":"gno.land/r/gc24/jamesprysm/entry","files":[{"name":"package.gno","body":"package entry\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\traffle.RegisterCode(\"4QS2FT6hSu\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6eEE7NDGyiPlgKPe0V36gtE5KRzwleLF3PvAFYdoBkY"},"signature":"7J4c/THffBd1/d+5U87NQJYTvKglaSJsZOSntQ9aC593AB4uDGr1IORrGF6i0Ia6LWbalbCDW2gKUxW38teqVQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1z0nhhy5c85cn2eqhu7m67sv8dqw4aqpy5knp7p","send":"","pkg_path":"gno.land/r/gc24/raffle","func":"RegisterUsername","args":["james-prysm"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6eEE7NDGyiPlgKPe0V36gtE5KRzwleLF3PvAFYdoBkY"},"signature":"swwxRJeCmFABAk2nXQQtcYCqHh590vc87HyXb1JqvNMVG2V29Uow54SghzLxaOSAR3Nuuucb3Q84VgKhnudMkw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jdky3gfkpzg8zdgjsh6k45qdmwqjznqktqr73c","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OlqIMgpohQs1OXgsTymdifWKihYl+1QivEc2dHaF9z9Rh8ZKd7Go0OtEnguZrIsrD2TyPcYKJkdl4nQNSgODxw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jdky3gfkpzg8zdgjsh6k45qdmwqjznqktqr73c","package":{"name":"raffle","path":"gno.land/r/gc24/suchak/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\tRegisterCode(\"hnZRYci7WK\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxOp6qsIVrbu158ctvXrBw8pvjrfcEKjZs+0f3hH91gE"},"signature":"nIPtsGvXCfY271FgvlN5M4fa4/8TBJHHvUdbBnwBv7RUfDTttZdwZqIr/y8eE7g9apVq626H2iJWLISeoEP/5g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jdky3gfkpzg8zdgjsh6k45qdmwqjznqktqr73c","package":{"name":"raffle","path":"gno.land/r/gc24/suchak/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\traffle.RegisterCode(\"hnZRYci7WK\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxOp6qsIVrbu158ctvXrBw8pvjrfcEKjZs+0f3hH91gE"},"signature":"PQGQS7RljSx531bZjRdLQLXWHQ/lFRKKpNjKOfCgUd4hVxnxJHqmI8LE+vSMOhJRmueIY1DeM9kgTzUn5Owghw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g15ly494qhk5ler6erzqp7rksv539g48w4dtjwwf","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"WaAWdQuSyMMyig756FdmrocccWlK0xfP5H9kdzhK83pkWjXWYUw7dxRE8QZO3LTb29EzBWFB/ycBYk8ExiqP9A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jdky3gfkpzg8zdgjsh6k45qdmwqjznqktqr73c","package":{"name":"raffle","path":"gno.land/r/gc24/suchak/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport (\n \"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n raffle.RegisterCode(\"hnZRYci7WK\")\n raffle.RegisterUsername(\"suchak1\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxOp6qsIVrbu158ctvXrBw8pvjrfcEKjZs+0f3hH91gE"},"signature":"Cilw1I4QLCyg2O2CZY7tUrH3LkuK/TiOkjrKR16WXiJG4yQLz3m93BoVgu1MvjTv8EvuP7QVXSX77YyAaKqwJQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jdky3gfkpzg8zdgjsh6k45qdmwqjznqktqr73c","package":{"name":"raffle","path":"gno.land/r/gc24/suchak1/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\traffle.RegisterCode(\"hnZRYci7WK\")\n\traffle.RegisterUsername(\"suchak1\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxOp6qsIVrbu158ctvXrBw8pvjrfcEKjZs+0f3hH91gE"},"signature":"dA0u6hyl8sNcvAyx7O7424ftSk2FilMl7vfF9EMMVd1u9UUMxSQuwBujF8yIYRcXNUfbprQfauFq31Rkf/X5Rw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jdky3gfkpzg8zdgjsh6k45qdmwqjznqktqr73c","package":{"name":"raffle","path":"gno.land/r/gc24/suchak1/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\t// raffle.RegisterCode(\"hnZRYci7WK\")\n\traffle.RegisterUsername(\"suchak1\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxOp6qsIVrbu158ctvXrBw8pvjrfcEKjZs+0f3hH91gE"},"signature":"brIvvF52sJWevD7qPfPq9V7gVPqjuaZxP8yLacrZZe8PmfHK0puRkGVVWVU3fVrGCN9Ng2g27iME0GTm2LNgcQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g15ly494qhk5ler6erzqp7rksv539g48w4dtjwwf","package":{"name":"raffle","path":"gno.land/r/gc24/soypat/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport (\n\trfl \"gno.land/r/gc24/raffle\"\n)\n\nconst (\n\tcode = \"CyH0GyhYsx\"\n\tuser = \"soypat\"\n)\n\nfunc init() {\n\t// keyboard's mine c:\n\trfl.RegisterCode(code)\n\trfl.RegisterUsername(user)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A17z/bUHo9UC2xHoBmsyZ2rvfxtu5H4KIlFTgSzYGiHQ"},"signature":"OOwVWfCAwNL+aDGEkdz9HmaZ8XH4620wF8GoWz3MBQ9wLTJm+IjevznMXM6/DH808c/SEPqwRD56O3h+Y0A6RA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1lrnsh8vhpx043y0496gvaf0x5a4jug5r05qcan","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ohYNx7YqHlH41Rd+xNOMz5n06kf7AiRjq8GXzlAphqp/UTCM+0f3mxg5t3r+SowGbhPDZkwu9tt2oww1ZmCKbA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1tgnfu08qu54xyew5296jy22e0fa24j0u4u9xk9","package":{"name":"hello","path":"gno.land/r/test/hello","files":[{"name":"package.gno","body":"package hello\n\nimport (\n\t\"gno.land/r/challenges/overandover/p1\"\n)\n\ntype myAdjuster struct{}\n\nfunc min(a uint16, b uint16) uint16 {\n\tif a \u003c b {\n\t\treturn a\n\t}\n\treturn b\n}\n\nfunc (m myAdjuster) Adjust(a *p1.Accumulator) {\n\tfor {\n\t\tv := a.Value()\n\t\tt := a.Target()\n\t\tdiff := t - v\n\t\tif diff == 0 {\n\t\t\treturn\n\t\t}\n\n\t\ta.Accumulate(uint8(min(255, t-v)))\n\t}\n}\n\nfunc main() {\n\to := myAdjuster{}\n\tp1.AdjustAccumulator(o)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Av4PSp/Jcy0g5SdhE7L63jHJ7tK/J6D4D0SWkaHK/+1p"},"signature":"JERoXYra5ucL2qBaw6p3fuMIc+jFzAlSe+rm7xDhsa5yaTaMMDHcRhNqV9Gt2wzKVkRCC4u0lbx0MBxsKcdFVA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lrnsh8vhpx043y0496gvaf0x5a4jug5r05qcan","package":{"name":"hello","path":"gno.land/r/g1lrnsh8vhpx043y0496gvaf0x5a4jug5r05qcan/hello","files":[{"name":"package.gno","body":"package hello\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc Render(path string) string {\n\traffle.RegisterCode(\"sxA7siibxe\")\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A9CzOS3rB8X5Gz31vRmwEJ6/Dws8yDjH5XNv3flcV2Qa"},"signature":"UyBnIo+EsrdhT/U9Eq1SsqzUmzu6n61Zy4U+qnpi2AtHOdghVjank081bRYNlshh0HAX9NYUImAOdpQ+V1i+BQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lrnsh8vhpx043y0496gvaf0x5a4jug5r05qcan","package":{"name":"hello","path":"gno.land/r/hxjiang/hello","files":[{"name":"package.gno","body":"package hello\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc Render(path string) string {\n\traffle.RegisterCode(\"sxA7siibxe\")\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A9CzOS3rB8X5Gz31vRmwEJ6/Dws8yDjH5XNv3flcV2Qa"},"signature":"9BPxuC3oqOfpBK2aifuQoCfgpOntFKrgJRoXDFM10n0MPszTZ7q4LD3SbQ6ftodJzocieR1aNDm+E3xESrctKQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lrnsh8vhpx043y0496gvaf0x5a4jug5r05qcan","package":{"name":"hello","path":"gno.land/r/hxjiang/hello","files":[{"name":"package.gno","body":"package hello\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc Render(path string) string {\n return raffle.RegisterCode(\"sxA7siibxe\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A9CzOS3rB8X5Gz31vRmwEJ6/Dws8yDjH5XNv3flcV2Qa"},"signature":"VBeiYXtIY2Zvq4DkEEpU+ClZpMzuM3MDVM2QF4RAE+97A2yEMPS3sno4thVXv2NwJw2Biqx06DMh/RWcqxevfg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lrnsh8vhpx043y0496gvaf0x5a4jug5r05qcan","package":{"name":"hello","path":"gno.land/r/hxjiang2/hello","files":[{"name":"package.gno","body":"package hello\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc Render(path string) string {\n\treturn raffle.RegisterCode(\"sxA7siibxe\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A9CzOS3rB8X5Gz31vRmwEJ6/Dws8yDjH5XNv3flcV2Qa"},"signature":"2NNTzQ2+yaQ85VzQB9An04snKobXfP7EEHbhIMUHu4IfLoCP0xHmbmk80nkgSLpBSnE9q3mdqyX7CRShUoVPpA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lrnsh8vhpx043y0496gvaf0x5a4jug5r05qcan","package":{"name":"hello","path":"gno.land/r/hxjiang3/hello","files":[{"name":"package.gno","body":"package hello\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc init() string {\n\treturn raffle.RegisterCode(\"sxA7siibxe\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A9CzOS3rB8X5Gz31vRmwEJ6/Dws8yDjH5XNv3flcV2Qa"},"signature":"ArmEzk6D9omq6yZmtrC3t7Rw6CHyQIaDgKsU7rUDWs5dyKhnX1hqm5q9F/nIsMqihjacxdNa2WrFbIuS09bKqA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lrnsh8vhpx043y0496gvaf0x5a4jug5r05qcan","package":{"name":"hello","path":"gno.land/r/hxjiang3/hello","files":[{"name":"package.gno","body":"package hello\n\nimport \"fmt\"\nimport \"gno.land/r/gc24/raffle\"\n\nfunc init() {\n\tfmt.Printf(\"return %s\", raffle.RegisterCode(\"sxA7siibxe\"))\n\treturn\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A9CzOS3rB8X5Gz31vRmwEJ6/Dws8yDjH5XNv3flcV2Qa"},"signature":"Hr0WjyVycg61DAl+rdxh+pDBDlKjtDyjOJYDERIQD+cner1HQLDcbl4EhZ87JcyzECSyZGDL1lTmXFy6ha36eg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lrnsh8vhpx043y0496gvaf0x5a4jug5r05qcan","package":{"name":"hello","path":"gno.land/r/hxjiang3/hello","files":[{"name":"package.gno","body":"package hello\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc init() {\n\traffle.RegisterCode(\"sxA7siibxe\")\n\treturn\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A9CzOS3rB8X5Gz31vRmwEJ6/Dws8yDjH5XNv3flcV2Qa"},"signature":"FvfpEVNnIjKw2OoCfWLTSoL17OqCCGKAlYjBS4sfUkExiU7xeeofGMUKJRxWgeETT59VNqHFezY21wJWSUC+3A=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1c2e8d9pehttcge60zkwr5vfd5sxy8ss94mt7s0","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"RwpDWaZt2CZtfLbbJfYUfKjfkDBxXzI3HS6K/EgiYgB2dry2Wqwc1f81Pzqm+IVd7kGYIC0YdWvvN4FbBMkqPQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1c2e8d9pehttcge60zkwr5vfd5sxy8ss94mt7s0","package":{"name":"raffle","path":"gno.land/r/urjit/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc Render(path string) string {\n\tout := raffle.RegisterCode(\"isj8mLbHZF\")\n\treturn out\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A8eZXFH70RP0ACetlw2mpV+0a7tjZDjaDL3NH/VRSDVx"},"signature":"VGHz2gFxDrsM5QBsB9QIRT57PBxJz4B44ra4BSZVFoNO5O6QXB6hzNVwB7J9y8Xax0sUmgTqMatclTwiCAqbLw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1c2e8d9pehttcge60zkwr5vfd5sxy8ss94mt7s0","package":{"name":"raffle","path":"gno.land/r/urjit/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport \"gno.land/r/gc24/raffle\"\n\nvar codeout string\nvar nameout string\nfunc init() {\n\t// Set admin address\n\tout := raffle.RegisterCode(\"isj8mLbHZF\")\n println(out)\n\n name := raffle.RegisterUsername(\"urjitbhatia\")\n println(name)\n\n codeout = out\n nameout = name\n}\n\nfunc Render(path string) string {\n return codeout + \" \" + nameout\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A8eZXFH70RP0ACetlw2mpV+0a7tjZDjaDL3NH/VRSDVx"},"signature":"wF3YPLMbpIPgQwOp8zUbET9iYp2d024UaUk2uuzILMQCULKY+BDmtgGXtmJ8R675sD+AABnkc0PushMUyd00Gw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1c2e8d9pehttcge60zkwr5vfd5sxy8ss94mt7s0","package":{"name":"rafflev2","path":"gno.land/r/urjit/rafflev2","files":[{"name":"package.gno","body":"package rafflev2\n\nimport \"gno.land/r/gc24/raffle\"\n\nvar codeout string\nvar nameout string\n\nfunc init() {\n\t// Set admin address\n\tout := raffle.RegisterCode(\"isj8mLbHZF\")\n\tprintln(out)\n\n\tname := raffle.RegisterUsername(\"urjitbhatia\")\n\tprintln(name)\n\n\tcodeout = out\n\tnameout = name\n}\n\nfunc Render(path string) string {\n\treturn codeout + \" \" + nameout\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A8eZXFH70RP0ACetlw2mpV+0a7tjZDjaDL3NH/VRSDVx"},"signature":"ua0dcJgL16OeOBqYjROuSqd/d2kTULwLxuAnEiHGrFMvsf6SY3412uPyxag4RhhI6is6thT+0HkLLCU1rNHzzw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dqkzgdmnueeleduhfs29tlrac2uzqdplt65qxn","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"JOX19h6TYaPn0nMrj4ItvY6sc8/CgDJKYY/Pq2BBIkce+uaAcnvdd6n387g+83TPn4PVTqlPms7ah2MZa0hkkg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1arpyfgln4nn360x0y27andyvec7kz9ylyzwyss","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0fKP/YQT8pVJnHaM/61fZJHpuGVLuZcB2mL5o0drfhJVaq6HG4MVMyU7MGN5mAMpL6YHyNFOIiVaA7xFjmujFg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1arpyfgln4nn360x0y27andyvec7kz9ylyzwyss","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0hDUuYRCvbjjFuF1qaoMWVQv0gm+TATzhpTtyhgxxBxLYerQ414hH/62y3SV+mbKtRQ/wZ9APsacSUAEg5A9DQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1dqkzgdmnueeleduhfs29tlrac2uzqdplt65qxn","package":{"name":"vraffle","path":"gno.land/r/vershun/vraffle","files":[{"name":"package.gno","body":"package vraffle\n\n//import \"gno.land/r/gc24/raffle\"\n\nvar output string\n\nfunc init() {\n\toutput += raffle.RegisterCode(\"N2GpwjdQbp\")\n\toutput += raffle.RegisterUsername(\"vershun\")\n}\n\nfunc Render(path string) string {\n\treturn output\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Azv5CWC8iMFcUIBftvgjx06Ix2TPLsFOH4xCsvDvT/rf"},"signature":"iUsQdKJP7ECtb1DEA/NmOofQl+X4cNx1CwbA0rWNvUE6OBBd3z2ARVJ5g4q7qj+yc/d7UGwcBsDx+wKvhOrWoQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1dqkzgdmnueeleduhfs29tlrac2uzqdplt65qxn","package":{"name":"vraffle","path":"gno.land/r/vershun/vraffle","files":[{"name":"package.gno","body":"package vraffle\n\nimport \"gno.land/r/gc24/raffle\"\n\nvar output string\n\nfunc init() {\n\toutput += raffle.RegisterCode(\"N2GpwjdQbp\")\n\toutput += raffle.RegisterUsername(\"vershun\")\n}\n\nfunc Render(path string) string {\n\treturn output\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Azv5CWC8iMFcUIBftvgjx06Ix2TPLsFOH4xCsvDvT/rf"},"signature":"aQ6EWCwzGlfV/GiZQMxZomgkARxLNx+HKqH2Ib0knVsEoelknBUrJEOWTE5tEwS8c7dRFNeBSEJHxWOWRjJpYg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1qgdjh6zvzzc8gv3fzk0mu9mezh6gan9hdpx04h","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"eCGK9keQNLx3i6ASQiAU4PyZMX1+Y119GL9GvZlmIOxOy7YvhgrZX0W3hT/ay1HmacQxQh9FHFF7dtIpUPjo8w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1arpyfgln4nn360x0y27andyvec7kz9ylyzwyss","package":{"name":"raffle","path":"gno.land/r/mebert1/raffle","files":[{"name":"package.gno","body":"package raffle\n\nfunc init() {\n\t_ = raffle.RegisterCode(\"2bw4DEMgnL\")\n\t_ = raffle.RegisterUsername(\"mebert1\")\n\t// If you pick me, I will buy you chocolate!\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Aiuqpct2a17LqgFtnlb9bQzZt4ZHsgfVPs/PDX0dpZGp"},"signature":"zPS6sbIyQiIQ4vVuVYHl7xT+vb85PPdT2E4Krj6CRBo5DnE8zZMnAW8h13hXhSgd4ZRoCVe5TIM4u6ZhEftqXQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1arpyfgln4nn360x0y27andyvec7kz9ylyzwyss","package":{"name":"raffle","path":"gno.land/r/mebert1/raffle","files":[{"name":"package.gno","body":"package raffle\n\nfunc init() {\n\t_ = RegisterCode(\"2bw4DEMgnL\")\n\t_ = RegisterUsername(\"mebert1\")\n\t// If you pick me, I will buy you chocolate!\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Aiuqpct2a17LqgFtnlb9bQzZt4ZHsgfVPs/PDX0dpZGp"},"signature":"QLV+wuiB7bQQ30ueIRgA2rxlGibpZP6rZIR4H6vjTtZRdXK2X2Eb5UrGLKlEqNDQE6MDG8aqdPkTY9VzIJgL8w=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1arpyfgln4nn360x0y27andyvec7kz9ylyzwyss","package":{"name":"raffle","path":"gno.land/r/mebert1/raffle","files":[{"name":"package.gno","body":"package raffle\n\nfunc init() {\n\t_ = RegisterCode(\"2bw4DEMgnL\")\n\t_ = RegisterUsername(\"mebert1\")\n\t// If you pick me, I will buy you chocolate!\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Aiuqpct2a17LqgFtnlb9bQzZt4ZHsgfVPs/PDX0dpZGp"},"signature":"rNzvAiei85BamJ6fqzjfSZ05Nn30vPxDgpAXWiofmdAcY5DIXlFv8FxmIcu0V/wc/ORq3BosAgdAidTTk5G2og=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1arpyfgln4nn360x0y27andyvec7kz9ylyzwyss","package":{"name":"raffle","path":"gno.land/r/mebert1/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport (\n\t\"https://gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\t_ = raffle.RegisterCode(\"2bw4DEMgnL\")\n\t_ = raffle.RegisterUsername(\"mebert1\")\n\t// If you pick me, I will buy you chocolate!\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Aiuqpct2a17LqgFtnlb9bQzZt4ZHsgfVPs/PDX0dpZGp"},"signature":"YBpkjb3aRQ89M34v38/lQWsVGhZ+oo9xois73fHA/N8zI+njNdMgmnPKJks/TVUC+JwtBRyJYALAxNVRbESP5w=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1arpyfgln4nn360x0y27andyvec7kz9ylyzwyss","package":{"name":"raffle","path":"gno.land/r/mebert1/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\t_ = raffle.RegisterCode(\"2bw4DEMgnL\")\n\t_ = raffle.RegisterUsername(\"mebert1\")\n\t// If you pick me, I will buy you chocolate!\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Aiuqpct2a17LqgFtnlb9bQzZt4ZHsgfVPs/PDX0dpZGp"},"signature":"L0+a/5jAecp5jjVtmGPValAj1X9lymoKrq44D6/uk4VHsIWA6iKQ9IvHSpvIVgXtxKLlNMzfDWpSyp5b6+sfFw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"daWg5axXiFWgIADTs8V59DRgvjgb+LpN1RgXBjJ5Efpe1waekjgR83zX7Ijod/cwaILR2x6sN3Dh/MQksicKKg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1v9f94dnlxu8eqwqvyw7lt8l5udey8483n0422a","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"PXoBeorMovhbypjKZeXb9RL089EbkD6UyKNX7N+MUbFkkm9jAaASN1IwmK8WuUZoO66aZ7oWJsOZW3aH0IgPkA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g16dkm6ynx9n3llh99fymm4ayky24yreph7n0c7v","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"gc+NUK4WDqvvMEr2+on+zTzzPl3zzHejFG+h6EtUEaM1Eeqhiiim4l41GyCaQIiXZS6436DA9VEG7f9VUqVkMw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1v9f94dnlxu8eqwqvyw7lt8l5udey8483n0422a","package":{"name":"raffle1","path":"gno.land/r/bobbyluig/raffle1","files":[{"name":"raffle.gno","body":"package raffle1\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc init() {\n\traffle.RegisterCode(\"EBA2g4FaeX\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgJndxHHtUkvZ+2kZRObeqHV07sklt/SMNssJ3dBG310"},"signature":"f6ahroK2+v3oAd/77znnLmiqW8vAOcREjXpViwTE/MgFOyMPT8HtA8UhuwX7Ww79fwGuZhREvFFkxuvCTRO6iw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1v9f94dnlxu8eqwqvyw7lt8l5udey8483n0422a","package":{"name":"raffle1","path":"gno.land/r/bobbyluig/raffle1","files":[{"name":"raffle.gno","body":"package raffle1\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc init() {\n\traffle.RegisterCode(\"E8A2g4FaeX\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgJndxHHtUkvZ+2kZRObeqHV07sklt/SMNssJ3dBG310"},"signature":"eNLskRcjWMoast9gNy6f/iJsNKlqJY7R05uAlq82a8cvAS93tPCPHdiJYoPwY+1lGg8pOWq4MeKADs02wLTCYw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16dkm6ynx9n3llh99fymm4ayky24yreph7n0c7v","package":{"name":"mlin","path":"gno.land/r/gc24/mlin","files":[{"name":"package.gno","body":"package mlin\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n\nfunc init() {\n\traffle.RegisterCode(\"xUxoTd3T4F\")\n\traffle.RegisterUsername(\"miranda-lin\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AsqNCH60X8s6zMvXzChVhBUhbuXs2B5twhfzmLvi667h"},"signature":"NrpAmokbWWNKdhV82ZBZTxMK0qdR2VGnxTWE61vtTW596dVL1EkqrHWUMv1N7vzYpjyF3M/oigmxdz5RiP8Z9w=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1v9f94dnlxu8eqwqvyw7lt8l5udey8483n0422a","package":{"name":"raffle1","path":"gno.land/r/bobbyluig/raffle1","files":[{"name":"raffle.gno","body":"package raffle1\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc init() {\n raffle.RegisterCode(\"E8A2g4FaeX\")\n raffle.RegisterUsername(\"bobbyluig\")\n}"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgJndxHHtUkvZ+2kZRObeqHV07sklt/SMNssJ3dBG310"},"signature":"NIrYOy8gisBkNBvarNejnwUImsNFx+xu9aFbVME9+MR8RVyJ1xuL6p7U0HA5/HB1N79TZt7vGyqQiwqq5Sl5uA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1v9f94dnlxu8eqwqvyw7lt8l5udey8483n0422a","package":{"name":"raffle2","path":"gno.land/r/bobbyluig/raffle2","files":[{"name":"raffle.gno","body":"package raffle2\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc init() {\n\traffle.RegisterCode(\"E8A2g4FaeX\")\n\traffle.RegisterUsername(\"bobbyluig\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgJndxHHtUkvZ+2kZRObeqHV07sklt/SMNssJ3dBG310"},"signature":"kJfTnp4812IjVs1TJuica+V6XL6FomKkzuUN/n8keKVFHii5D3mzXs+QrFwB32A6oXkONLcdExCbk7Bs2VP5rA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lrnsh8vhpx043y0496gvaf0x5a4jug5r05qcan","package":{"name":"hello","path":"gno.land/r/hxjiang4/hello","files":[{"name":"package.gno","body":"package hello\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc init() {\n\traffle.RegisterCode(\"sxA7siibxe\")\n\treturn\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A9CzOS3rB8X5Gz31vRmwEJ6/Dws8yDjH5XNv3flcV2Qa"},"signature":"mI19qmvT058TYfSm4UwVkEchmTmDHAFIdB82MJt9rzMCKNZegpvd/nWF0UfuJFC/m4j7ISorlP6O35rZtMwp8g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1v9f94dnlxu8eqwqvyw7lt8l5udey8483n0422a","package":{"name":"raffle2","path":"gno.land/r/bobbyluig/raffle2","files":[{"name":"raffle.gno","body":"package raffle2\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc init() {\n\t// raffle.RegisterCode(\"E8A2g4FaeX\")\n\traffle.RegisterUsername(\"bobbyluig\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgJndxHHtUkvZ+2kZRObeqHV07sklt/SMNssJ3dBG310"},"signature":"jTM5XsnBgCHT2X7ZdexnLor0ytn1hBOwP9Nffc9IbXgmuYkRgm3/aid5VHk1ltNdQJKozFmpq2mGVIv0/mnZdw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lrnsh8vhpx043y0496gvaf0x5a4jug5r05qcan","package":{"name":"hello","path":"gno.land/r/hxjianguser/hello","files":[{"name":"package.gno","body":"package hello\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc init() {\n\t// raffle.RegisterCode(\"sxA7siibxe\")\n\traffle.RegisterUserName(\"h9jiang\")\n\treturn\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A9CzOS3rB8X5Gz31vRmwEJ6/Dws8yDjH5XNv3flcV2Qa"},"signature":"m/rFI9TfYBAfRU5s66QKg+tt2SDiPwxVBFbRasTsMTYT61zForYDqjetPsJrZYTRoTDl9NACeyIS1uqONIZzpA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lrnsh8vhpx043y0496gvaf0x5a4jug5r05qcan","package":{"name":"hello","path":"gno.land/r/hxjianguser/hello","files":[{"name":"package.gno","body":"package hello\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc init() {\n\t// raffle.RegisterCode(\"sxA7siibxe\")\n\traffle.RegisterUsername(\"h9jiang\")\n\treturn\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A9CzOS3rB8X5Gz31vRmwEJ6/Dws8yDjH5XNv3flcV2Qa"},"signature":"0KLxi/y8Hcj5zwVsVFVuyUxTSdtNNAI+OGWktnguCJ86N+OVDeG67hb+CNMm1qqC1DUBj1FjbTITxO+NeJIU8g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g128faxq7dtvt6m9lc4mwy9dn026y6tzmfdmhjga","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AEo11ncTyMRLtqKZYutK7slbVDKmCXFqgywa2Tgj8a9XETFVSOb8PPDYbwTM/XJNFyKWF715mfGrKMtEMLwh0A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16dkm6ynx9n3llh99fymm4ayky24yreph7n0c7v","package":{"name":"raffle10","path":"gno.land/r/bob/raffle10","files":[{"name":"package.gno","body":"package raffle\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc init() {\n\tfmt.Println(raffle.CheckHashUpload())\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AsqNCH60X8s6zMvXzChVhBUhbuXs2B5twhfzmLvi667h"},"signature":"wuWbnKg2VkX/IHzZn5qyiSbdGo4UPt6HwuMq+TkDWCxcpGrt9+6Ynw4ptVZctiqxmN5Tcld0Zz9bVce5Wv+kxg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16dkm6ynx9n3llh99fymm4ayky24yreph7n0c7v","package":{"name":"raffle10","path":"gno.land/r/bob/raffle10","files":[{"name":"package.gno","body":"package raffle\n\nimport (\n\t\"fmt\"\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\tfmt.Println(raffle.CheckHashUpload())\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AsqNCH60X8s6zMvXzChVhBUhbuXs2B5twhfzmLvi667h"},"signature":"oqJ7xyOU8d1GRFIMFsgriz2hjjuG9gSkbsuExmPDyUkd8Uv+xVJ+oYzmPb9NcxbMMT1fOWM0U1bnsOMDG4R85g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16dkm6ynx9n3llh99fymm4ayky24yreph7n0c7v","package":{"name":"raffle10","path":"gno.land/r/bob/raffle10","files":[{"name":"package.gno","body":"package raffle\n\nimport (\n\t\"gno.land/p/demo/ufmt\"\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc Render(_ string) string {\n\treturn ufmt.Sprintf(\"%d\", raffle.CheckHashUpload())\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AsqNCH60X8s6zMvXzChVhBUhbuXs2B5twhfzmLvi667h"},"signature":"89MNJnSUEVkZytnxh1bksYsKSowkHMoHysOQJ8Cbtt1mG0hvWeusLjNxcl+b8N5Du6dgwz2HDF8pWWEdWZJsMA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16dkm6ynx9n3llh99fymm4ayky24yreph7n0c7v","package":{"name":"raffle10","path":"gno.land/r/bob/raffle10","files":[{"name":"package.gno","body":"package raffle\n\nimport (\n\t// \"gno.land/r/gc24/raffle\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nfunc Render(_ string) string {\n\treturn ufmt.Sprintf(\"%d\", 1)\n\t// raffle.CheckHashUpload()\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AsqNCH60X8s6zMvXzChVhBUhbuXs2B5twhfzmLvi667h"},"signature":"HZ2lbXeiiWvwxrVZU7aG2/iWoWCwmNjekx/QLGUVeP0wDcQ97Xsrch9Q8c8gTfDuKvUrYIK2g7JbbDUKd3WjkQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16dkm6ynx9n3llh99fymm4ayky24yreph7n0c7v","package":{"name":"raffle10","path":"gno.land/r/bobbyluig/raffle10","files":[{"name":"package.gno","body":"package raffle\n\nimport (\n\t// \"gno.land/r/gc24/raffle\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nfunc Render(_ string) string {\n\treturn ufmt.Sprintf(\"count; %d\", 1)\n\t// raffle.CheckHashUpload()\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AsqNCH60X8s6zMvXzChVhBUhbuXs2B5twhfzmLvi667h"},"signature":"C46Kggg76teys6exnP/YUhucWon3E27jEO55YLCnlygDdRaesUmiRXIWIbBre2q7iVSJSwNk+uRZg+8I9JyRXA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16dkm6ynx9n3llh99fymm4ayky24yreph7n0c7v","package":{"name":"raffle10","path":"gno.land/r/bob/raffle10","files":[{"name":"package.gno","body":"package raffle\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\traffle.CheckHashUpload()\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AsqNCH60X8s6zMvXzChVhBUhbuXs2B5twhfzmLvi667h"},"signature":"J8c7rgktCrB+3GeNaC5FMpz8YA54Ve5fHnmw+t9rRnJM9m45L9CqxsZAiJoIS3sRDaxcI4e5IRI7EoZKetEcNA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g128faxq7dtvt6m9lc4mwy9dn026y6tzmfdmhjga","package":{"name":"raffle","path":"gno.land/r/ab/raffle","files":[{"name":"gno.mod","body":"module gno.land/r/gc24/alexander-bachmann/raffle\n\nrequire (\n gno.land/r/gc24/raffle v0.0.0-latest\n)"},{"name":"raffle.gno","body":"package raffle\n\nimport (\n\tr \"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\tr.RegisterCode(\"z1c5m7L8uW\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1aXDsy5lZA6+8H10VGiKrwL9xoAs7fmwDtZ72IrAPZE"},"signature":"hedwBWvaJtH9y73pgmt1M94f+BRaJvQ/nEtPgSokAz93bZvVD8AVCb/f3ArEYCFe5m41HjiP/gaJ7Aq0Q3kaBg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1efqa3wrdjta8syxzgsprhjgdtn42u8h3eaz6q6","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ijzUxPWmHfBN8SAdS/3vaj4CwvZWMeLU/8G21zCBI7cHiZ6jsEorEwbk0s1TqwCyeb8K4f0UUHKcy59vl5unaw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g128faxq7dtvt6m9lc4mwy9dn026y6tzmfdmhjga","package":{"name":"raffle","path":"gno.land/r/ab/raffle","files":[{"name":"gno.mod","body":"module gno.land/r/gc24/alexander-bachmann/raffle\n\nrequire (\n gno.land/r/gc24/raffle v0.0.0-latest\n)"},{"name":"raffle.gno","body":"package raffle\n\nimport (\n r \"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n r.RegisterCode(\"z1c5m7L8uW\")\n r.RegisterUsername(\"alexander-bachmann\")\n}"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1aXDsy5lZA6+8H10VGiKrwL9xoAs7fmwDtZ72IrAPZE"},"signature":"teJ/r0fk9cbecF53V3lxPA81tC75DJGcwAccm+g9TLRm3oocikL5H+q0i7My90gZahjUeLRr1MDQ3bKp4UwT/A=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g128faxq7dtvt6m9lc4mwy9dn026y6tzmfdmhjga","package":{"name":"raffle","path":"gno.land/r/abach/raffle","files":[{"name":"gno.mod","body":"module gno.land/r/gc24/alexander-bachmann/raffle\n\nrequire (\n gno.land/r/gc24/raffle v0.0.0-latest\n)"},{"name":"raffle.gno","body":"package raffle\n\nimport (\n\tr \"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\tr.RegisterCode(\"z1c5m7L8uW\")\n\tr.RegisterUsername(\"alexander-bachmann\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1aXDsy5lZA6+8H10VGiKrwL9xoAs7fmwDtZ72IrAPZE"},"signature":"MtEaKh7hYvQArx3VPxARS4UJndezvJ3EBG1TUoSAYNBxN+j3ZqwS/b26l9N33YdAX1oqOqXYcZ+YPghkJhG8Pg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g128faxq7dtvt6m9lc4mwy9dn026y6tzmfdmhjga","package":{"name":"raffle","path":"gno.land/r/abach/raffle","files":[{"name":"gno.mod","body":"module gno.land/r/gc24/alexander-bachmann/raffle\n\nrequire (\n gno.land/r/gc24/raffle v0.0.0-latest\n)"},{"name":"raffle.gno","body":"package raffle\n\nimport (\n\tr \"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\tr.RegisterUsername(\"alexander-bachmann\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1aXDsy5lZA6+8H10VGiKrwL9xoAs7fmwDtZ72IrAPZE"},"signature":"MhQC/Cbw26QeSosL32a+g9fyH/CAUqi9Qa62vB3FACouoplZCKrIfgQpEmQbTQ9i9f4O9yJ+fF4El8s/rgcM4A=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1efqa3wrdjta8syxzgsprhjgdtn42u8h3eaz6q6","package":{"name":"raffle","path":"gno.land/r/renier/raffle","files":[{"name":"package.gno","body":"package raffle\n\nfunc init() {\n\tRegisterCode(\"ViMaaMFya6\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ah7dfYpLwPGQscCyuhKBr41urQh16umvfE42rEucwrlg"},"signature":"cLpSQ+5c+7W/c5kv93yHbIiKQtiDKAlxKdUwkhuiUmo8Vas1VX48EV0/AImvsZKYqYAorN9THX2tfYdiy6bO4w=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1efqa3wrdjta8syxzgsprhjgdtn42u8h3eaz6q6","package":{"name":"hello","path":"gno.land/r/renier/hello","files":[{"name":"package.gno","body":"package hello\n\nfunc init() {\n\traffle.RegisterCode(\"ViMaaMFya6\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ah7dfYpLwPGQscCyuhKBr41urQh16umvfE42rEucwrlg"},"signature":"wzMlLAcgg9XuCiH7gE8mRexZamFmV5hWcjyczxFksJANigkGy/QfXv8s4X3O+3GBD+9QFcsAmIH2Ll555jehWA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1efqa3wrdjta8syxzgsprhjgdtn42u8h3eaz6q6","package":{"name":"raffle","path":"gno.land/r/renier/raffle","files":[{"name":"package.gno","body":"package hello\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc init() {\n\traffle.RegisterCode(\"ViMaaMFya6\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ah7dfYpLwPGQscCyuhKBr41urQh16umvfE42rEucwrlg"},"signature":"OMN3jANMxtx+c18pcS89dx+9LjhXIiJWNM2+0g/agiV3QdqyW7PEqNRrZ3/wiP2/70d5phtMcFoEBUnEUcd0XQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1efqa3wrdjta8syxzgsprhjgdtn42u8h3eaz6q6","package":{"name":"raffle","path":"gno.land/r/renier/raffle","files":[{"name":"package.gno","body":"package hello\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc init() {\n\traffle.RegisterCode(\"ViMaaMFya6\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ah7dfYpLwPGQscCyuhKBr41urQh16umvfE42rEucwrlg"},"signature":"hIod+YalBCbCxhxZoFT3ZyuAD9pyTdw+63aAhjLCNO8idMpw8slIPwG4pk55kJGyLq8DqamQWZIKRWHYm8jn/Q=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1efqa3wrdjta8syxzgsprhjgdtn42u8h3eaz6q6","package":{"name":"raffle","path":"gno.land/r/renier/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport r \"gno.land/r/gc24/raffle\"\n\nfunc init() {\n\tr.RegisterCode(\"ViMaaMFya6\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ah7dfYpLwPGQscCyuhKBr41urQh16umvfE42rEucwrlg"},"signature":"kR5osF6gfr0L+0RN/BnEiMeOe+Gfm9R7DLWaeca+Jo4urOXxxrp5457LzaTO366KCCnGpi1rT+ToXSJUoXHNmQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1efqa3wrdjta8syxzgsprhjgdtn42u8h3eaz6q6","package":{"name":"raffle","path":"gno.land/r/renier/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport r \"gno.land/r/gc24/raffle\"\n\nfunc init() {\n\tr.RegisterUsername(\"renier\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ah7dfYpLwPGQscCyuhKBr41urQh16umvfE42rEucwrlg"},"signature":"qXZwzIwGUsi3+PvQw37DlawNe7zK8XZJRA8GhTeU9n9yPaB7JLikF/7vRMEPJ5DBF8wlBG1GOjFgn1hDPf1rXg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1efqa3wrdjta8syxzgsprhjgdtn42u8h3eaz6q6","package":{"name":"raffle","path":"gno.land/r/renier/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport r \"gno.land/r/gc24/raffle\"\n\nfunc init() {\n r.RegisterUsername(\"renier\")\n}\n\nfunc Render(path string) string {\n return \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ah7dfYpLwPGQscCyuhKBr41urQh16umvfE42rEucwrlg"},"signature":"Scmu83s44dH83OkYke71rXQ0WXdafcxquKwTD5cFAGRkasPZGYbEIhY9jhD6723Aiha9KZUSSXTfAFqJiAsClw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1efqa3wrdjta8syxzgsprhjgdtn42u8h3eaz6q6","package":{"name":"register","path":"gno.land/r/renier/register","files":[{"name":"package.gno","body":"package register\n\nimport r \"gno.land/r/gc24/raffle\"\n\nfunc init() {\n\tr.RegisterUsername(\"renier\")\n}\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ah7dfYpLwPGQscCyuhKBr41urQh16umvfE42rEucwrlg"},"signature":"6uXKW4SVFtmLv7HV3DPZ+Wplq2ZtG4rhEKBbn0720ZQgahGw5PtYVJJlJe1Ry2MJOfW2cb0EYLpcHbxID/OIEg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1lggjskpg0c6sg7fsvnpycmjdkqcv8ymzdamgdh","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rUdL/vVh1+/jgHScWJYBOpB5ovjv0GqRBWCg6f3kPCAmX61slyZjJi26i43UiagE68E4ARH0Eo8ZMwLnFcm3YA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lggjskpg0c6sg7fsvnpycmjdkqcv8ymzdamgdh","package":{"name":"raffle","path":"gno.land/r/arjunmalhotra1/raffle","files":[{"name":"raffle.gno","body":"package raffle\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc main() {\n\traffle.RegisterCode(\"nARh6Pkeqo\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AkP5eOB5pt0ZimYaWGURBPpwROMHsYFDRGASVByxK/Mi"},"signature":"e4N6KVjRHI3wZHCQnYuurHnH9lWKH/I4Hug0mrgqIhsy7XvIXSvJ+p3G6EJ3YYITVKXIkwi9N2VlW/YWUP+dTw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1sanakptmervgh67lcyhvvevm7r4wdh2cjkamz3","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"wrNQaZyTy14QdUnVM+8kqr2yYPk0qvU7/AKNuo+imWoIMoEOvEjyJpJL8mw181/ux16wJAq2wWN4ufJb/kprQg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1sanakptmervgh67lcyhvvevm7r4wdh2cjkamz3","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Z1e040nXTZaQA+oBYJ8En0JVEbzk2hMnrHivQ1Bz/+I1Pb5Yk3x5+ghOd0SX0dWQ5QBX9Xc+aVztD1XJQWMylA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g19rlk4mt2x6q5krn5acjh3nf6xrrje278cya6tc","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3hrwPINwJtuhJ5QnZkRkZts9Nq5IJw4LIPPhK2nkuhYYpBbu6kPEo1uQ8XnL/DgBuq9h4mPBoXtjW8XnQj4drA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g19rlk4mt2x6q5krn5acjh3nf6xrrje278cya6tc","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"oa62yNKKBdLjltdbSUHjexnpirxyucvg3IkklV5sQAAG9cOPq9R9+ISzgcfOSD7Vkr4/WjvwbgCNpHbeh3lBAA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1rcfp8gf80ft0hwc9pht6kjk676mmt9pkl4awd6","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"xlSZ84xRnHjuRe8BuIsoZvftB7+0UBIkx7wxoRyr149kO+gbh//1VX2s78wpfQEdxJeWYElwTalhFjyaMlH9tA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1qs829f6uxvukahmsl5zgudcmsurrw36c4hmxks","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"tMbb2kf7d4vPhb2hWvZadMGsCBVNQCWSTV22+nd/Hpwbf/o+mGCMxI2HSuHnLLWYzYok2kxwhDgkpjaff93KSQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1d4tpxurqx88j89h7uhfj57sgv3ee0hm8cu8433","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"NBjvS0+p4rxw0kXPOYQB7rhW+meO9CYTbJddA//NbaY/zygKD8VbHmgr1FKu8h32O01Qui2gQfg8xjB5Gaz58Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1u5y7xvjr4shuksve7klc9sseqkn0gh9k0e847f","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"kYh5ftUtM7Ey6DQFW1hBYoPBl0aN+z4cmRteNCG3H0luXX1xCTJpmheBJrOwpcBCrolen6slZPJauLfG2WS+mg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ht6s3gd40z9j3yew6pevv34xpmlvaz66hxqw6a","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"hO+lr5Pa/NB7oNb2X8By8OHftXstMKYij5QZbrrR3QB43Q2FFC66l4Uqzox8s/FjmZvG+uyAFSKUR1Qh8x55gg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1czjawkfyg8dprpu65jkfmnlz646kfad3q3533g","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ZlMlgtVpxkPxTvdROakSc83Qihfw2WVbU0kdeLqZhsxpBsnPqeLv3ce7ne+FtSAenwzPf8u3PUEy43vFs6zTLg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1epv9344pevheqvzre76npsc82p0wdeh559hjyx","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"bfdHUesLge2aN/+mzgR/OKHancXbu93VOuRHgx4XMXoYVa9yEJauluyzboUkjxlkw4S27BESEoBCqCZVkn0Npw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1utt8rprh565z7yg54kazusp0fx62accfmjjnn0","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"u831/0oVQJzNoBM9sXoS1sUb1evdK29xuptTYoA9ZBh9qtOFEDdt0FB4ODuuhYU5hiKaGWhh+M4h8WqUeGwNmw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g14wgghqtrf22e83gmt2y5fkpgct3yy6xy3grp8l","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"nXAmpRTzz++Ph+HUMc0QZsizxnxHoNVEs3R6SlT/6BJrrwsxZF46674wjFCkqAmINGpW+L9nRecPVVWj5keSqw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1yd2zy8dxhfg54q68qljsgv04reqvjzfapecl49","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8YQvzRf5BKUFjA4WUIh3+H9Sm5C+bnu90aruDTUZZAoouwiuI2T21IoFqXlj95AJmSUHFxlJCi1t+3i6XGKE8A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g13l4a355ujn92qqyygut22zvvf2rwp26e5ge50u","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"XgRNaQTaoDFVYhS1tgKNMmue7x5DmWik78sOad3EDhl5NbjT9zo4NMaw+bcG2FziBfG3nhamv48te0fXna0rrA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1u72pxvhwgcagjpu2jlv2g80gm2mnzmwqx6a0vk","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"N5fqlRChB7ezJWWI36xwO2qydc/jMeDXEqYwumUDaBo1l/vQib+kQdU+CZcnSFe5psgoo4d3JE3g4laiiSAT4A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10hu3smmw75teeys3ghfxk38xtm7k996vzveh06","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"poBejOLWgASJjEsVZAWPRDAZNCsY+rSXCRd0Ucf1jTwQVBavA0Wr2ExggX7r1NP7jq0dUm9p7RdlcrfuEwuhtA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1sknkp395aj0p0rkjkmzhrp00wctgtjjmsjemkp","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"cZV1SPLzvdR76HLQIwE/LuwG3Sp/B0KPBJosYAjiQk5ziFyY9q++wsX9v7n98QQAVZtxD3I3jydBYzcKXTbGqw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g19gyvsrg9vlt3y3am6r5j8eycmswl42jsv6qkh9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"hhncWCCimsT27FG9NkIZQg7CgFcyP4i386E/+7vVGhQK0fpW5S07TfBHwUjL8entXjxyK33cwA0hEL2mTGkS8w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g12tew6urpealay624hhnnnspfdst0j203c6nhf2","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"UzIfiwcTGNR+3jRof1/dcAgyVGwctVfnmv/r5InfQ3ZE55fXSZ0ebfP+cZc8jmwd+vqH5SJ6SgjFW8qsJhucCg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g16622f8wj5nu2wk9gu6jqhpvvdhz4lqns8cddv0","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"PO+Na9vLqMaV40E1M55WwGGj1BBKTIB7ELavc3pRskpHvQpwFQpRBW6CNg4oK7fXGKcYEuA4HPAM2Rg8WwxP2A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1s9c65wsz7g4f86xg99a0mgm5kads0dmf7rq5c7","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"YZvKhXWAqACX4ktV/qZSC0AOuoJA0u0/ttFfIhUHaRFi42/IeYW8uHhRcbi9r9TYF/CNZagTBbHSw5dFPSk7hA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1tlzxts8vhwkhmjxc0utjjk3x8nkd237nfau3hh","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qHt7cLETp0wPi3N+q6XYptHs7YoVbGurLPH4bqJM+Vgt/gXlKchB0MXNYvvzTML5kXOhv2YPBlxsnP6gXVCttg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jqxlpv3z60qtezschv4s6vxn530uzd80y4ajyw","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Q1CrwZbzFiOyjyQA9TaS3P6+BVQ7K93q+UH6LeTK0KMoYR1Xx/A5BnSuoaArAOwqa/adurtmk72pgbi7EmK3LA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jqxlpv3z60qtezschv4s6vxn530uzd80y4ajyw","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"q3CW8tQB+zAE+hoz+F+yYVZTk3ZOQq4YlNXGbVkq/PFIvuHw9zf7i3FaNaF8zi5XjH9xvSsewfuNlSxmuUf+gw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"event_emitter","path":"gno.land/r/demo/event_emitter","files":[{"name":"package.gno","body":"package event_emitter\n\nimport \"std\"\n\nfunc Event01(key, value string) string {\n std.Emit(\"Event01\", key, value)\n\nreturn \"Event01-\" + key + \"-\" + \"value\"\n}\n\nfunc Event02(key, value string) string {\n std.Emit(\"Event02\", key, value)\n\nreturn \"Event02-\" + key + \"-\" + \"value\"\n}\n\nfunc Event03(key, value string) string {\n std.Emit(\"Event03\", key, value)\n\nreturn \"Event03-\" + key + \"-\" + \"value\"\n}"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"5nRBPQyQdhU6toJJv+I/EXQqd+5+I363i5ylVtwaTs9TtMiOzomZLGYb8PfdYWPh/1E0NsufRFM5LMiHVpKUbg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"event_emitter","path":"gno.land/r/demo/event_emitter","files":[{"name":"package.gno","body":"package event_emitter\n\nimport \"std\"\n\nfunc Event01(key, value string) string {\n\tstd.Emit(\"Event01\", key, value)\n\n\treturn \"Event01-\" + key + \"-\" + \"value\"\n}\n\nfunc Event02(key, value string) string {\n\tstd.Emit(\"Event02\", key, value)\n\n\treturn \"Event02-\" + key + \"-\" + \"value\"\n}\n\nfunc Event03(key, value string) string {\n\tstd.Emit(\"Event03\", key, value)\n\n\treturn \"Event03-\" + key + \"-\" + \"value\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"+ZsYt2R8loRkuaiFIqMOIttQEPZCZZpfX99n9i/fXvQHNB2ZxKElv5sLAcG/AGZbCCUzUvI4fMFT7oojLm90NQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1w4qqmxdk59xsh3x5hnp2z78s4ymyva8pnenfem","send":"200000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["g1w4qqmxdk59xsh3x5hnp2z78s4ymyva8pnenfem","fubao"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A3qb8HYMMShXDmVxNvUPSm208qrj/S2Ym7hJqJeQtNW5"},"signature":"Sjld2tfYYZWssNzb85gdsB5wlrpe6rCUG7zIFK3uBAAX6lTfUVdD8rw3VYAZz3kEO4s3v+TTNP3HCwGOCa4KjQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1w4qqmxdk59xsh3x5hnp2z78s4ymyva8pnenfem","send":"200000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["g1w4qqmxdk59xsh3x5hnp2z78s4ymyva8pnenfem","fubao",""]}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A3qb8HYMMShXDmVxNvUPSm208qrj/S2Ym7hJqJeQtNW5"},"signature":"nQWrKQI/skz2tGQuW/QPhoxLDS/ypTunWeGkfu9nyLxXgnncjJvxJ4k2KCCMo63u8bJ+V2zgt4p8jqxn6vbAqw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1w4qqmxdk59xsh3x5hnp2z78s4ymyva8pnenfem","send":"20000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["g1w4qqmxdk59xsh3x5hnp2z78s4ymyva8pnenfem","fubao",""]}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A3qb8HYMMShXDmVxNvUPSm208qrj/S2Ym7hJqJeQtNW5"},"signature":"amYBBomtJwo7vl2jkn/NKjXIVxzUCS/IuHRXv3/IGHpHim8z+mtq7z0c+Fg0MoWC192xUKCC9qIG3kZhrs5rFA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1w4qqmxdk59xsh3x5hnp2z78s4ymyva8pnenfem","send":"200000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","fubao",""]}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A3qb8HYMMShXDmVxNvUPSm208qrj/S2Ym7hJqJeQtNW5"},"signature":"MrPv9BGthCxnfreyKjcpic6KKm6sQ/hqaCy6RjoCKgdlue9rQzFP5jpFdPHF2TC7u+8wO1MQ/PQYC4NkgAyx1A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1w4qqmxdk59xsh3x5hnp2z78s4ymyva8pnenfem","send":"200000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","super_fubao",""]}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A3qb8HYMMShXDmVxNvUPSm208qrj/S2Ym7hJqJeQtNW5"},"signature":"w8H2YtWlGy/4X0e8pMf4VCmtN0uM6X2k94mcFMSLudJ0jHeTA7skqFl+SFDrmyHLd7B3s+iBAkAVceZDloxtFg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1w4qqmxdk59xsh3x5hnp2z78s4ymyva8pnenfem","package":{"name":"hellopp","path":"gno.land/r/demo/hellopp","files":[{"name":"package.gno","body":"package hellopp\n\nfunc Render2(path string) string {\n\treturn \"Hello World!\"\n}\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A3qb8HYMMShXDmVxNvUPSm208qrj/S2Ym7hJqJeQtNW5"},"signature":"zXlIqpflLMYYOv/tCiyvsu88Hh+054uISpxno/J2Ch5pGKTkTvqQ/WZLW7JTFVrFYzdK23/5GCbfDh0RveYxqg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g14pnz9zrefzgfs3zpgeuv0n5tzsj9ln54ddushe","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Yw7cPMQCl6RQKGystn/j8Jt+ammKiV8/F0DPwr0Wb1gcP8X1cjca7cCmugDrXiHU0pQjfdNk+MFLFQUmbcDKYA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1kw6jg3yjsvgycverrmyn7k6mldnu6e3pe42n6q","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"oihF8Cx6cZDgGL3eiunGb7g5MXffbEnJJ5G4ar4Bt7Vi5kRriexWy6EaNXboqxXa7WL3Dsop22IRA7z5iVBujw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1kw6jg3yjsvgycverrmyn7k6mldnu6e3pe42n6q","package":{"name":"mail","path":"gno.land/p/Olawale22/mail","files":[{"name":"package.gno","body":"package mail\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n)\n\ntype Mail struct {\n\tHeader map[string]string\n\tBody string\n}\n\nfunc ReadMessage(msg string) (*Mail, error) {\n\tlines := strings.Split(msg, \"\\n\")\n\tmail := \u0026Mail{Header: make(map[string]string)}\n\n\tisBody := false\n\tfor _, line := range lines {\n\t\tif line == \"\" {\n\t\t\tisBody = true\n\t\t\tcontinue\n\t\t}\n\t\tif isBody {\n\t\t\tmail.Body += line + \"\\n\"\n\t\t} else {\n\t\t\tparts := strings.SplitN(line, \": \", 2)\n\t\t\tif len(parts) == 2 {\n\t\t\t\tmail.Header[parts[0]] = parts[1]\n\t\t\t}\n\t\t}\n\t}\n\treturn mail, nil\n}\n\n\n#usage run app using \"func main()\" below, but endeavor to change \"package mail\" from above to \"package main\"\n\nfunc main() {\n\tmsg := `From: user@example.com\nTo: another@example.com\nSubject: Test email\n\nThis is the body of the email.`\n\temail, err := ReadMessage(msg)\n\tif err != nil {\n\t\tfmt.Println(\"Error:\", err)\n\t\treturn\n\t}\n\n\tfmt.Println(\"From:\", email.Header[\"From\"])\n\tfmt.Println(\"To:\", email.Header[\"To\"])\n\tfmt.Println(\"Subject:\", email.Header[\"Subject\"])\n\tfmt.Println(\"Body:\", email.Body)\n}\n\nfunc Render(path string) string {\n return \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7IMN9aUO6numX9E1NH67IEp7zMBvGhxJ+T2UBwWMRCO"},"signature":"A6C7fIrpqWdnleSS0YT3wTDYAbtwBNmOa9GkFQZyCc9rU6NkkeIyBLEX3m1T6QA3We2GEj82yEhgI5r/6zCPEQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1kw6jg3yjsvgycverrmyn7k6mldnu6e3pe42n6q","package":{"name":"mail","path":"gno.land/r/Olawale22/mail","files":[{"name":"package.gno","body":"package mail\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n)\n\ntype Mail struct {\n\tHeader map[string]string\n\tBody string\n}\n\nfunc ReadMessage(msg string) (*Mail, error) {\n\tlines := strings.Split(msg, \"\\n\")\n\tmail := \u0026Mail{Header: make(map[string]string)}\n\n\tisBody := false\n\tfor _, line := range lines {\n\t\tif line == \"\" {\n\t\t\tisBody = true\n\t\t\tcontinue\n\t\t}\n\t\tif isBody {\n\t\t\tmail.Body += line + \"\\n\"\n\t\t} else {\n\t\t\tparts := strings.SplitN(line, \": \", 2)\n\t\t\tif len(parts) == 2 {\n\t\t\t\tmail.Header[parts[0]] = parts[1]\n\t\t\t}\n\t\t}\n\t}\n\treturn mail, nil\n}\n\n\n#usage run app using \"func main()\" below, but endeavor to change \"package mail\" from above to \"package main\"\n\nfunc main() {\n\tmsg := `From: user@example.com\nTo: another@example.com\nSubject: Test email\n\nThis is the body of the email.`\n\temail, err := ReadMessage(msg)\n\tif err != nil {\n\t\tfmt.Println(\"Error:\", err)\n\t\treturn\n\t}\n\n\tfmt.Println(\"From:\", email.Header[\"From\"])\n\tfmt.Println(\"To:\", email.Header[\"To\"])\n\tfmt.Println(\"Subject:\", email.Header[\"Subject\"])\n\tfmt.Println(\"Body:\", email.Body)\n}\n\nfunc Render(path string) string {\n return \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7IMN9aUO6numX9E1NH67IEp7zMBvGhxJ+T2UBwWMRCO"},"signature":"U4UrUixq6qFlhkTHD/+4M0vvdyMqzR5qh7zQqBpGVPoB0MuRd3y5b4z8KaRFq44p2RTOSevhbKxa9guZUaPa/A=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1kw6jg3yjsvgycverrmyn7k6mldnu6e3pe42n6q","package":{"name":"mail","path":"gno.land/p/Olawale22/mail","files":[{"name":"package.gno","body":"package mail\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n)\n\ntype Mail struct {\n\tHeader map[string]string\n\tBody string\n}\n\nfunc ReadMessage(msg string) (*Mail, error) {\n\tlines := strings.Split(msg, \"\\n\")\n\tmail := \u0026Mail{Header: make(map[string]string)}\n\n\tisBody := false\n\tfor _, line := range lines {\n\t\tif line == \"\" {\n\t\t\tisBody = true\n\t\t\tcontinue\n\t\t}\n\t\tif isBody {\n\t\t\tmail.Body += line + \"\\n\"\n\t\t} else {\n\t\t\tparts := strings.SplitN(line, \": \", 2)\n\t\t\tif len(parts) == 2 {\n\t\t\t\tmail.Header[parts[0]] = parts[1]\n\t\t\t}\n\t\t}\n\t}\n\treturn mail, nil\n}\n\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7IMN9aUO6numX9E1NH67IEp7zMBvGhxJ+T2UBwWMRCO"},"signature":"0mlKpHQtMn46Krbo1EynsqiXK5BQcfxUfWUZcdBb48ZqH1AvAXJmYiNveLP+acgD4e/WW1WEnNBfvBE+Bfvk4A=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1kw6jg3yjsvgycverrmyn7k6mldnu6e3pe42n6q","package":{"name":"mail","path":"gno.land/p/Olawale22/mail","files":[{"name":"package.gno","body":"package mail\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n)\n\ntype Mail struct {\n\tHeader map[string]string\n\tBody string\n}\n\nfunc ReadMessage(msg string) (*Mail, error) {\n\tlines := strings.Split(msg, \"\\n\")\n\tmail := \u0026Mail{Header: make(map[string]string)}\n\n\tisBody := false\n\tfor _, line := range lines {\n\t\tif line == \"\" {\n\t\t\tisBody = true\n\t\t\tcontinue\n\t\t}\n\t\tif isBody {\n\t\t\tmail.Body += line + \"\\n\"\n\t\t} else {\n\t\t\tparts := strings.SplitN(line, \": \", 2)\n\t\t\tif len(parts) == 2 {\n\t\t\t\tmail.Header[parts[0]] = parts[1]\n\t\t\t}\n\t\t}\n\t}\n\treturn mail, nil\n}\n\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7IMN9aUO6numX9E1NH67IEp7zMBvGhxJ+T2UBwWMRCO"},"signature":"RIPAY2KxqcNqorOfU7AdjWdVIxHBdKTMZzsly9WpEylPX2ZX0ypK90VsLdlSMl/uu1RkgCB++QVImWi2vaMRHg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1s2uznss5m56ptaru5vne488zue4yh60mtptazl","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"t46TxIncoeRdDJP5JDVOg4iAaVBrBTYxB8kkkyGs/6d5rTl/meyHBGa/VIVXNfHJQtU+wdTYuKNAOQBJpb0RQg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1s2uznss5m56ptaru5vne488zue4yh60mtptazl","package":{"name":"raffle","path":"gno.land/r/gc24/raffle","files":[{"name":"package.gno","body":"package main\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc main() {\n\t_ = raffle.RegisterCode(\"Vr60kMsfmR\")\n\t_ = raffle.RegisterUsername(\"krzysztof-fetch\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"At0mezkiE3NP8ftm/BUR8AFadYqa0XB8/X5JeQ3e3efD"},"signature":"1NIBNce/iBWPs7BBaoXLSHrpDebA0+Y+4YY17+oPzDsQr3tkD7E9FvoIwToy39j+4wPSZbED54LSWEH2/i2rlQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1s2uznss5m56ptaru5vne488zue4yh60mtptazl","package":{"name":"raffle","path":"gno.land/r/gc24/krzysztoffetch/raffle","files":[{"name":"package.gno","body":"package enter_raffle\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc enterRaffle() {\n\t_ = raffle.RegisterCode(\"Vr60kMsfmR\")\n\t_ = raffle.RegisterUsername(\"krzysztof-fetch\")\n}\n\nfunc init() {\n\tenterRaffle()\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"At0mezkiE3NP8ftm/BUR8AFadYqa0XB8/X5JeQ3e3efD"},"signature":"y4yS/6Nlaz9cg96S9jYXLSz00lQncrCpv4MKut3zIQxLYWmrjxNoVqmqGD/GT72ZZUuHazRp4xBDmLtXKQA0mw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1kw6jg3yjsvgycverrmyn7k6mldnu6e3pe42n6q","package":{"name":"mail","path":"gno.land/p/Olawale22/mail","files":[{"name":"package.gno","body":"package mail\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n)\n\ntype Mail struct {\n\tHeader map[string]string\n\tBody string\n}\n\nfunc ReadMessage(msg string) (*Mail, error) {\n\tlines := strings.Split(msg, \"\\n\")\n\tmail := \u0026Mail{Header: make(map[string]string)}\n\n\tisBody := false\n\tfor _, line := range lines {\n\t\tif line == \"\" {\n\t\t\tisBody = true\n\t\t\tcontinue\n\t\t}\n\t\tif isBody {\n\t\t\tmail.Body += line + \"\\n\"\n\t\t} else {\n\t\t\tparts := strings.SplitN(line, \": \", 2)\n\t\t\tif len(parts) == 2 {\n\t\t\t\tmail.Header[parts[0]] = parts[1]\n\t\t\t}\n\t\t}\n\t}\n\treturn mail, nil\n}\n\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7IMN9aUO6numX9E1NH67IEp7zMBvGhxJ+T2UBwWMRCO"},"signature":"zehhEPXNuK1ScZ1RngESW+YfLXgZylbDOYRKpOF34IgDULdyAphFl7FJkd66tjvFjMjjG9oYoJecweCtBc+WwQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1s2uznss5m56ptaru5vne488zue4yh60mtptazl","package":{"name":"raffle","path":"gno.land/r/gc24/krzysztoffetch/raffle","files":[{"name":"package.gno","body":"package enter_raffle\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc enterRaffle() {\n\t_ = raffle.RegisterCode(\"Vr60kMsfmR\")\n\t_ = raffle.RegisterUsername(\"krzysztof-fetch\")\n}\n\nfunc init() {\n\tenterRaffle()\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"At0mezkiE3NP8ftm/BUR8AFadYqa0XB8/X5JeQ3e3efD"},"signature":"39gaa9PxLnlCb/32EDP77T4i8eht1bMYuWomDslER0RDZwJomA1viO8hb0hYT/CBy9xrb8nEwXGbhG8VhZxaVg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1kw6jg3yjsvgycverrmyn7k6mldnu6e3pe42n6q","package":{"name":"mail","path":"gno.land/p/olawale22/mail","files":[{"name":"package.gno","body":"package mail\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n)\n\ntype Mail struct {\n\tHeader map[string]string\n\tBody string\n}\n\nfunc ReadMessage(msg string) (*Mail, error) {\n\tlines := strings.Split(msg, \"\\n\")\n\tmail := \u0026Mail{Header: make(map[string]string)}\n\n\tisBody := false\n\tfor _, line := range lines {\n\t\tif line == \"\" {\n\t\t\tisBody = true\n\t\t\tcontinue\n\t\t}\n\t\tif isBody {\n\t\t\tmail.Body += line + \"\\n\"\n\t\t} else {\n\t\t\tparts := strings.SplitN(line, \": \", 2)\n\t\t\tif len(parts) == 2 {\n\t\t\t\tmail.Header[parts[0]] = parts[1]\n\t\t\t}\n\t\t}\n\t}\n\treturn mail, nil\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7IMN9aUO6numX9E1NH67IEp7zMBvGhxJ+T2UBwWMRCO"},"signature":"k6bZEVZANad+jsHKToDIsvQZxxKt+/8+CnUT2lKEC81a6l7Uvb5ymFGReiv72B57UyzX9DXU4rNRmt04lyFICg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1kw6jg3yjsvgycverrmyn7k6mldnu6e3pe42n6q","package":{"name":"mail","path":"gno.land/p/sulaiman/mail","files":[{"name":"package.gno","body":"package mail\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n)\n\ntype Mail struct {\n\tHeader map[string]string\n\tBody string\n}\n\nfunc ReadMessage(msg string) (*Mail, error) {\n\tlines := strings.Split(msg, \"\\n\")\n\tmail := \u0026Mail{Header: make(map[string]string)}\n\n\tisBody := false\n\tfor _, line := range lines {\n\t\tif line == \"\" {\n\t\t\tisBody = true\n\t\t\tcontinue\n\t\t}\n\t\tif isBody {\n\t\t\tmail.Body += line + \"\\n\"\n\t\t} else {\n\t\t\tparts := strings.SplitN(line, \": \", 2)\n\t\t\tif len(parts) == 2 {\n\t\t\t\tmail.Header[parts[0]] = parts[1]\n\t\t\t}\n\t\t}\n\t}\n\treturn mail, nil\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7IMN9aUO6numX9E1NH67IEp7zMBvGhxJ+T2UBwWMRCO"},"signature":"AGwQQRjvSipDsagt+6/Fi9x/lsnQ9U/4p9e5+p4WfKkxzNXc8OWGRNqyyeyBKo5b8nscqTuBYg4KPu7WXWqWXw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1s2uznss5m56ptaru5vne488zue4yh60mtptazl","send":"","pkg_path":"gno.land/r/gc24/raffle","func":"RegisterCode","args":["Vr60kMsfmR"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"At0mezkiE3NP8ftm/BUR8AFadYqa0XB8/X5JeQ3e3efD"},"signature":"ClJH7MAsUTRauGDPYa0aQi0SdnVeIUR3660o1CrEMa5/vbTsPZTBwXFyYpnBoxzrBuvugQXjNyBEovgGtut4dQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1kw6jg3yjsvgycverrmyn7k6mldnu6e3pe42n6q","package":{"name":"mail","path":"gno.land/r/demo/mail","files":[{"name":"package.gno","body":"package mail\n\nimport (\n\t\"fmt\"\n\t\"strings\"\n)\n\ntype Mail struct {\n\tHeader map[string]string\n\tBody string\n}\n\nfunc ReadMessage(msg string) (*Mail, error) {\n\tlines := strings.Split(msg, \"\\n\")\n\tmail := \u0026Mail{Header: make(map[string]string)}\n\n\tisBody := false\n\tfor _, line := range lines {\n\t\tif line == \"\" {\n\t\t\tisBody = true\n\t\t\tcontinue\n\t\t}\n\t\tif isBody {\n\t\t\tmail.Body += line + \"\\n\"\n\t\t} else {\n\t\t\tparts := strings.SplitN(line, \": \", 2)\n\t\t\tif len(parts) == 2 {\n\t\t\t\tmail.Header[parts[0]] = parts[1]\n\t\t\t}\n\t\t}\n\t}\n\treturn mail, nil\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7IMN9aUO6numX9E1NH67IEp7zMBvGhxJ+T2UBwWMRCO"},"signature":"re9XdlKcaPxKsdrbdax5cHekLHV/ot8g5iNGMtWeW1tJdeMHyBWwkvpk3V/XyVWvvoMu7oo7G9k4zjQuEOApMw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1s2uznss5m56ptaru5vne488zue4yh60mtptazl","package":{"name":"raffle","path":"gno.land/r/gc24/krzysztof/raffle","files":[{"name":"package.gno","body":"package enter_raffle\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc enterRaffle() {\n\t_ = raffle.RegisterCode(\"Vr60kMsfmR\")\n\t_ = raffle.RegisterUsername(\"krzysztof-fetch\")\n}\n\nfunc init() {\n\tenterRaffle()\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"At0mezkiE3NP8ftm/BUR8AFadYqa0XB8/X5JeQ3e3efD"},"signature":"tR0V+7/h8IAau1opYZe23apDwci9j+LYVMT55wo7ZectTP5D9dq4pnonf/O2ybMzFjKydU+ZQPTwATutMiuGTA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1kw6jg3yjsvgycverrmyn7k6mldnu6e3pe42n6q","package":{"name":"mail","path":"gno.land/r/demo/mail","files":[{"name":"package.gno","body":"package mail\n\nimport (\n\t\"strings\"\n)\n\ntype Mail struct {\n\tHeader map[string]string\n\tBody string\n}\n\nfunc ReadMessage(msg string) (*Mail, error) {\n\tlines := strings.Split(msg, \"\\n\")\n\tmail := \u0026Mail{Header: make(map[string]string)}\n\n\tisBody := false\n\tfor _, line := range lines {\n\t\tif line == \"\" {\n\t\t\tisBody = true\n\t\t\tcontinue\n\t\t}\n\t\tif isBody {\n\t\t\tmail.Body += line + \"\\n\"\n\t\t} else {\n\t\t\tparts := strings.SplitN(line, \": \", 2)\n\t\t\tif len(parts) == 2 {\n\t\t\t\tmail.Header[parts[0]] = parts[1]\n\t\t\t}\n\t\t}\n\t}\n\treturn mail, nil\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7IMN9aUO6numX9E1NH67IEp7zMBvGhxJ+T2UBwWMRCO"},"signature":"t0BXZOxYXw4rp2TRF4Ga9D4qbhbD15hQTgw1t8Nfy40zoMep6AeNEkPc4gRUIUyORDs68nFtuW/8ERd4yv17Ww=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1l5ey0leng83q33ufgh6zh06s9rf62g8apumv6p","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OtBUbUwHWQ/pDjx1yq178aS6LTc1CeJSzZ4UbyCb1koam59eil8VU+4MZV1DZXQA4I8C/A6t7afoA8LrErqLKA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1l5ey0leng83q33ufgh6zh06s9rf62g8apumv6p","send":"","pkg_path":"gno.land/r/gc24/raffle","func":"RegisterCode","args":["MZkDw5z7g8"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7aSTfzhMx5zOiz0PqpxaEQhjkxhswHgUyzVIBGskKek"},"signature":"CNayEY/2aI2dCMmDKYcZQ7tTJGWaUtNckCCPoVbFGG992skRIvMC+OeVES2da/ik4nQbkeqQTnILsu6Q/krB4g=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1l5ey0leng83q33ufgh6zh06s9rf62g8apumv6p","send":"","pkg_path":"gno.land/r/gc24/raffle","func":"RegisterUsername","args":["nprimmer"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7aSTfzhMx5zOiz0PqpxaEQhjkxhswHgUyzVIBGskKek"},"signature":"PwTATmIpetXidWgDwhFMqD1Yj0EnEpMJMvVksSb9PKQb9z+rTcXk0vuW9n7I6l+hTuqtvRj/ew7eR0hbiAjycQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1l5ey0leng83q33ufgh6zh06s9rf62g8apumv6p","send":"","pkg_path":"gno.land/r/gc24/raffle","func":"RegisterCode","args":["MZkDw5z7g8"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7aSTfzhMx5zOiz0PqpxaEQhjkxhswHgUyzVIBGskKek"},"signature":"aP/D54uhHbfwtvsusws2FofPWbBx6mhLcMiPgBLB2Y5ZJY/krIkmnv9JAZGtZkVUr5TTZOOc+bh3FlkGELomXA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1l5ey0leng83q33ufgh6zh06s9rf62g8apumv6p","package":{"name":"main","path":"gno.land/r/nprimmer/main","files":[{"name":"package.gno","body":"package main\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc main() {\n\traffle.RegisterCode(\"MZkDw5z7g8\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7aSTfzhMx5zOiz0PqpxaEQhjkxhswHgUyzVIBGskKek"},"signature":"gqo30e1BnV4QvgLiNltF51offq4kyb5ivzY7xg+SD8MWp8RKsdQH2aV12yih9GjgLoxp3t4CIFX4nw2YlddlFQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1s2uznss5m56ptaru5vne488zue4yh60mtptazl","package":{"name":"entry","path":"gno.land/r/krzysztoffetch/entry","files":[{"name":"package.gno","body":"package entry\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\traffle.RegisterCode(\"Vr60kMsfmR\")\n\traffle.RegisterUsername(\"krzysztof-fetch\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"At0mezkiE3NP8ftm/BUR8AFadYqa0XB8/X5JeQ3e3efD"},"signature":"4GK/B5c1UJOdM3U7rX0KLkXye2Bi2CP2Uhl8BU3kwNo5oxWkd6b5LYXWDubCcrGJI760eetRBckHPsd3kgtAIg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1l5ey0leng83q33ufgh6zh06s9rf62g8apumv6p","package":{"name":"TacoBell","path":"gno.land/r/nprimmer/TacoBell","files":[{"name":"package.gno","body":"package main\n\nimport (\n \"gno.land/r/gc24/raffle\"\n)\n\nfunc TacoBell(input string) {\n raffle.RegisterCode(input)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7aSTfzhMx5zOiz0PqpxaEQhjkxhswHgUyzVIBGskKek"},"signature":"I3bLHpGx3/+K2nKldUA1dh8paoYnNatuMjSH07auuVslKcwu19S+tZAKQvRi7PNEKjkpJuVjJ3YaA+fPy3Q3zg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1l5ey0leng83q33ufgh6zh06s9rf62g8apumv6p","package":{"name":"tacobell","path":"gno.land/r/nprimmer/tacobell","files":[{"name":"package.gno","body":"package main\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc TacoBell(input string) {\n\traffle.RegisterCode(input)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7aSTfzhMx5zOiz0PqpxaEQhjkxhswHgUyzVIBGskKek"},"signature":"LEFVrQUGTOm7eMtFLmEBJGuWUS8rBOk2ZvBE/feP9jJTRIvitYMXA3tlfKLAah5aPF4LBCss3DbyBdljur60YA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/event_emitter","func":"Event01","args":["HI","Hello"]},{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/event_emitter","func":"Event02","args":["HI","Hello"]},{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/event_emitter","func":"Event03","args":["HI","Hello"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"+eDW4kXVZT9Fh6kkJd/e4QjT6TyS7Ob2xt+s1Jo2ePopcvdebkEhwQmOCYEEMNtERkQPQrrcQj2/gOxbyn9B7A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1l5ey0leng83q33ufgh6zh06s9rf62g8apumv6p","package":{"name":"raffle","path":"gno.land/r/nprimmer/raffle","files":[{"name":"package.gno","body":"package main\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc TacoBell(input string) {\n\traffle.RegisterCode(input)\n}\n\nfunc init() {\n\tTacoBell(\"MZkDw5z7g8\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7aSTfzhMx5zOiz0PqpxaEQhjkxhswHgUyzVIBGskKek"},"signature":"wBdx7HTBFH/GZmuPFt5gSMCmvynRE+luTuvErjrl6OQ8/Qyn1IsBtm2BaZzyO6m3F0IhHa54NtyslmmS6Hkw7w=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1l5ey0leng83q33ufgh6zh06s9rf62g8apumv6p","package":{"name":"raffle","path":"gno.land/r/nprimmer/raffle","files":[{"name":"package.gno","body":"package main\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc TacoBell(input string) {\n\traffle.RegisterCode(input)\n}\n\nfunc init() {\n\tTacoBell(\"MZkDw5z7g8\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7aSTfzhMx5zOiz0PqpxaEQhjkxhswHgUyzVIBGskKek"},"signature":"kY8/MVMx7c411DpvXvBv+N7Fk2iEwcuNLcB4e1Yw8BFMDjXWtuOXaSnVYaStycaMWqViybstC4vLHtqdGlGrWQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1w4qqmxdk59xsh3x5hnp2z78s4ymyva8pnenfem","send":"","pkg_path":"gno.land/r/demo/event_emitter","func":"Event01","args":["HI","Hello"]},{"@type":"/vm.m_call","caller":"g1w4qqmxdk59xsh3x5hnp2z78s4ymyva8pnenfem","send":"","pkg_path":"gno.land/r/demo/event_emitter","func":"Event02","args":["HI","Hello"]},{"@type":"/vm.m_call","caller":"g1w4qqmxdk59xsh3x5hnp2z78s4ymyva8pnenfem","send":"","pkg_path":"gno.land/r/demo/event_emitter","func":"Event03","args":["HI","Hello"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A3qb8HYMMShXDmVxNvUPSm208qrj/S2Ym7hJqJeQtNW5"},"signature":"xoqhCQ2J+40Xj2p9GORg8rsA8BTTCa2IfPnXQlboeBsZkPFx5yi8Hp4SeGu2w98UfAb0UfZxuzNRH+ZV/HQlFw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1l5ey0leng83q33ufgh6zh06s9rf62g8apumv6p","package":{"name":"raffle","path":"gno.land/r/nprimmer/raffle","files":[{"name":"package.gno","body":"package main\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc TacoBell(code string, username string) {\n\traffle.RegisterCode(code)\n\traffle.RegisterUsername(username)\n}\n\nfunc init() {\n\tTacoBell(\"MZkDw5z7g8\", \"nprimmer\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7aSTfzhMx5zOiz0PqpxaEQhjkxhswHgUyzVIBGskKek"},"signature":"kgWXjDf4pADeUsbN5GNcSLcSZYRVef5y58IIy3cbEyVKKnFL6MO/7Yq3fY3CTKWcseWEE6LztqysWemckl/ocA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1l5ey0leng83q33ufgh6zh06s9rf62g8apumv6p","package":{"name":"tacobell","path":"gno.land/r/nprimmer/tacobell","files":[{"name":"package.gno","body":"package tacobell\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc TacoBell(code string, username string) {\n\traffle.RegisterCode(code)\n\traffle.RegisterUsername(username)\n}\n\nfunc init() {\n\tTacoBell(\"MZkDw5z7g8\", \"nprimmer\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7aSTfzhMx5zOiz0PqpxaEQhjkxhswHgUyzVIBGskKek"},"signature":"25raRFxd7doiokoZ8kbgc2edjJG+AV/wYwhxRLE2ocgQ7kOZ7QWQK0cz27N8/YtjUsIdhN1Zaz6PhrrC88fb3Q=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lggjskpg0c6sg7fsvnpycmjdkqcv8ymzdamgdh","package":{"name":"entry","path":"gno.land/r/arjunmalhotra1/entry","files":[{"name":"raffle.gno","body":"package entry\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc main() {\n\t//raffle.RegisterCode(\"nARh6Pkeqo\")\n\tcallRegisterCode()\n\n}\nfunc callRegisterCode() {\n\traffle.RegisterCode(\"nARh6Pkeqo\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AkP5eOB5pt0ZimYaWGURBPpwROMHsYFDRGASVByxK/Mi"},"signature":"48XnjV0L9ZX27fDbHGoaQUsIDC6yUu3iV/9MLpYJL2pKSEJBoMcBPY2Gm8d9ulLOydj13RROgxnn8/JlizwQhQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lggjskpg0c6sg7fsvnpycmjdkqcv8ymzdamgdh","package":{"name":"entry","path":"gno.land/r/arjunmalhotra1/entry","files":[{"name":"raffle.gno","body":"package entry\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\n// func main() {\n// \t//raffle.RegisterCode(\"nARh6Pkeqo\")\n// callRegisterCode()\n \n// }\nfunc callRegisterCode(code string) {\n raffle.RegisterCode(code)\n}"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AkP5eOB5pt0ZimYaWGURBPpwROMHsYFDRGASVByxK/Mi"},"signature":"yvI3hVphILtwnTlCCQ1stR9xdJCGR/z1B2myRxngfC5XWlBG1P7e7lPsbDLWP2skN1gH/P1CZycMkf+9s3EPNA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lggjskpg0c6sg7fsvnpycmjdkqcv8ymzdamgdh","package":{"name":"entry2","path":"gno.land/r/arjunmalhotra1/entry2","files":[{"name":"raffle.gno","body":"package entry2\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\n// func main() {\n// \t//raffle.RegisterCode(\"nARh6Pkeqo\")\n// callRegisterCode()\n\n// }\nfunc callRegisterCode(code string) {\n\traffle.RegisterCode(code)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AkP5eOB5pt0ZimYaWGURBPpwROMHsYFDRGASVByxK/Mi"},"signature":"1sgf6CLGIf4iozvTQixnbydGFW9e4inU5JNnYs90yR1mW9qjdvWvAz/EEUGsTh1pVUuMvFGYHg8Cdz9Hph5GIw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1vxmy85ezrp23q3leju3da3jtq2tj8pr6haqs9h","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AiRcXfnufjxHcVQnJ5e+oeo2BQnMCFPJ3LycFENG7yN56aB8jQbMnOmXEllSMSu5tDeJYf55aK1/nhG92C8XiQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1hcpl3nuagwjwznuppg36yh7a25csmwa3pnjr8h","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"6msyLT7Lek6LyhtGYlirIqb35WIUsGv9Q8FfhmckxwdswjOf5KWBYPdBnDsqQcem2eTJNTH6IBGNLSG5pDTQTw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lggjskpg0c6sg7fsvnpycmjdkqcv8ymzdamgdh","package":{"name":"entry3","path":"gno.land/r/arjunmalhotra1/entry3","files":[{"name":"raffle.gno","body":"package entry2\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\n// func main() {\n// \t//raffle.RegisterCode(\"nARh6Pkeqo\")\n// callRegisterCode()\n\n// }\n\nfunc callRegisterCode() {\n\traffle.init()\n\traffle.RegisterCode(\"nARh6Pkeqo\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AkP5eOB5pt0ZimYaWGURBPpwROMHsYFDRGASVByxK/Mi"},"signature":"6MQPvvFzqeabyHtESfyLRqlZyAQc1jarcvVNzWggDQhqJgqKV3x7D1CMuBoQy3FYwOtVVIh9w9uTLWaOI857+w=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lggjskpg0c6sg7fsvnpycmjdkqcv8ymzdamgdh","package":{"name":"entry4","path":"gno.land/r/arjunmalhotra1/entry4","files":[{"name":"raffle.gno","body":"package entry2\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\n// func main() {\n// \t//raffle.RegisterCode(\"nARh6Pkeqo\")\n// callRegisterCode()\n\n// }\n\nfunc callRegisterCode() {\n\tinit()\n\traffle.RegisterCode(\"nARh6Pkeqo\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AkP5eOB5pt0ZimYaWGURBPpwROMHsYFDRGASVByxK/Mi"},"signature":"1bzzA9gznD+rfYsTeMqCVooCPA24BOu2xqJ0ibvtwVJONkBR4tL3z9GP575L5UwsaFz/SUZa7tFtjN0E9T1ORw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1tqwwp7z9ulq76x79tjsxh0j7djnenyzmlauqh9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"jdtpZFpbvJKz2hXbMb0uZRHDjxO4/8GM/S3izTuDwQEIoIgrL4GJHC53WIgg9bfue8rOqMN4XHPVUWN3MQB+mg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1xck4u2taen6070eryu9glgqd5pugfux463p0mz","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"b7yaeCMa6tcVXQps0LgFxM/Tl7zhgerU+JHImwO4RhIQD1lDR7rh2J57e6eShZL/1sHC21Tz9Ja0oCg0myt+wA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1xck4u2taen6070eryu9glgqd5pugfux463p0mz","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"exzKa8gb4krChJQlviFTLyyr0cv1JweH4YavZQefKsBPhb6FV5a+gSnso9ubR+Gq14Ml2ft/Z387+5eeXDbgXg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1yfwv6gyujajnsewyt5j4q59fq5w42nzw2vltzz","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"EDlNxA/Bc1acid8cY59nhp5+X8d/Xbqa2NVnDjCdikghS4txarMNsy0LCwsYMGAfSduCjaXV+kh5Pz0yZvKQ2w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1svd47qp3kjamyxk8078ck7kstyfglvxtal6en5","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"arbfCFkouTBZOJe37yPO2yQ0sIzw8wfhI57zBXnByvoL5wgQB53jsQyKBMxFt/ERb4uEZ851JobGeap6eAdjVA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1utuf3fk30x09ul9zsf4sehlxdk34hlhsry8sdy","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"smrlTqBp9m7sO7oNwlq1OTZTzDdAU3Jvdu2B4U2aDTdWjVHFDYqD2/QsMUfNXnyMjKgFElnhuoRP7ZI/edA+Ug=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1t7k3aap9sm8796y6r8pl77tvv3396sfaxmrqn5","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"SXoU1MeUzanc5MQBZ9dyWOF4B7xtgM4Yngsd4LuWLahYyAVKjZRaZP6llW6th1KDiRaxr7VP4i2C8AtcAKpYGw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1w4qqmxdk59xsh3x5hnp2z78s4ymyva8pnenfem","send":"","pkg_path":"gno.land/r/demo/event_emitter","func":"Event01","args":["HI","Hello"]},{"@type":"/vm.m_call","caller":"g1w4qqmxdk59xsh3x5hnp2z78s4ymyva8pnenfem","send":"","pkg_path":"gno.land/r/demo/event_emitter","func":"Event02","args":["HI","Hello"]},{"@type":"/vm.m_call","caller":"g1w4qqmxdk59xsh3x5hnp2z78s4ymyva8pnenfem","send":"","pkg_path":"gno.land/r/demo/event_emitter","func":"Event03","args":["HI","Hello"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A3qb8HYMMShXDmVxNvUPSm208qrj/S2Ym7hJqJeQtNW5"},"signature":"0g7uavxcfR7aXwIkAmUx4OT+m8h4kkWDjcy1vgo1Dxp1UQ9oeK+4EM1XdoKrVjPQh5p5vrT8Damhsdpbct4c7A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1tqwwp7z9ulq76x79tjsxh0j7djnenyzmlauqh9","package":{"name":"hello","path":"gno.land/r/hdjshfjsdhfsj/hello","files":[{"name":"package.gno","body":"package hello\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc Render(path string) string {\n}\n\nfunc init() {\n\traffle.RegisterCode()\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwTqbMmqAPmrLcoWNbVUK/uyCXsuf/10ecNmszjE+ruJ"},"signature":"D0CDdWMe2zlPhsowcF8jneeh+rH12IuGbc6xsOu302JIhRR9/AzNXJhJOB1L1NFAOhUZbw8hsGx7wDTb+vebsA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1tqwwp7z9ulq76x79tjsxh0j7djnenyzmlauqh9","package":{"name":"hello","path":"gno.land/r/hdjshfjsdhfsj/hello","files":[{"name":"package.gno","body":"package hello\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc init() {\n\traffle.RegisterCode()\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwTqbMmqAPmrLcoWNbVUK/uyCXsuf/10ecNmszjE+ruJ"},"signature":"5n586EZZEH5fhPZ3LxWiUMT0PhQv8s2btaT8WuTxRvofd04XSx3+ubpicgKjKsd8RpzC7cdEXZXzZEOHSdK/Sg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hcpl3nuagwjwznuppg36yh7a25csmwa3pnjr8h","package":{"name":"hello","path":"gno.land/r/boonedox/hello","files":[{"name":"package.gno","body":"package hello\n\nimport (\n\t\"/r/gc24/raffle\"\n)\n\n// Top-level variables are automatically persisted to storage\nvar (\n\to *ownable.Ownable // admin of the raffle realm\n\n)\n\nfunc init() {\n\t// Set admin address\n\to = ownable.NewWithAddress(\"g1hcpl3nuagwjwznuppg36yh7a25csmwa3pnjr8h\")\n\n}\n\nfunc Render(path string) string {\n\traffle.RegisterCode(\"4LuVGAx3sx\")\n\traffle.RegisterUsername(\"boonedox\")\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7DzAKxaGx3hBRHd3k2rRfvEeLASWiBqKh+CU6DV862x"},"signature":"GyqshxpJR3j9hareh7gYgYg2DQLBARKoSLsjhAv2Bxp8Ffc/y4q6ZJh/MEvOEzH+1xRf8/BYKoA2s7YrKoRFJw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1utuf3fk30x09ul9zsf4sehlxdk34hlhsry8sdy","package":{"name":"raffle","path":"gno.land/r/conradsmi/raffle","files":[{"name":"package.gno","body":"package hello\n\nimport (\n\t\"gno.land/p/demo/ownable\"\n\t\"gno.land/p/demo/ufmt\"\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\traffle.RegisterCode(\"cz6P5zykkt\")\n\traffle.RegisterUsername(\"conradsmi\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A3gTqRjwwaAvqefccqEPQ6oWa703vuPq2x45oNuYikh7"},"signature":"razK0tzbSV3zfF8rQ+1uLq+w2zO+8jESBuAngVEyi1ISMXpmHmnhcBuatkYL1wLp6zJ9PGSh1pT/rUNPVtaljA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hcpl3nuagwjwznuppg36yh7a25csmwa3pnjr8h","package":{"name":"hello","path":"gno.land/r/boonedox/hello","files":[{"name":"package.gno","body":"package hello\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\n// Top-level variables are automatically persisted to storage\nvar (\n\to *ownable.Ownable // admin of the raffle realm\n\n)\n\nfunc init() {\n\t// Set admin address\n\to = ownable.NewWithAddress(\"g1hcpl3nuagwjwznuppg36yh7a25csmwa3pnjr8h\")\n\n}\n\nfunc Render(path string) string {\n\traffle.RegisterCode(\"4LuVGAx3sx\")\n\traffle.RegisterUsername(\"boonedox\")\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7DzAKxaGx3hBRHd3k2rRfvEeLASWiBqKh+CU6DV862x"},"signature":"o08pJ8DQey9YJXrNQ83gnltjWy+Vlpg/ghXYjDu4cwt1A1pLnJzqj5oV8yWiFRTnN5Y4ydmdyoPV+yRFwk6qUg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1utuf3fk30x09ul9zsf4sehlxdk34hlhsry8sdy","package":{"name":"raffle","path":"gno.land/r/conradsmi/raffle","files":[{"name":"package.gno","body":"package hello\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\traffle.RegisterCode(\"cz6P5zykkt\")\n\traffle.RegisterUsername(\"conradsmi\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A3gTqRjwwaAvqefccqEPQ6oWa703vuPq2x45oNuYikh7"},"signature":"YwgphU6SkcwFH2Ahyv31MEyUXOfUUTFNJtKaLXvtnzlbNXHOCNqjhDBxIA8cDJTTalM6dvhUbIPcHN6YRVXa7g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1utuf3fk30x09ul9zsf4sehlxdk34hlhsry8sdy","package":{"name":"raffle","path":"gno.land/r/conradsmi/raffle","files":[{"name":"package.gno","body":"package hello\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\traffle.RegisterCode(\"cz6P5zykkt\")\n\traffle.RegisterUsername(\"conradsmi\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A3gTqRjwwaAvqefccqEPQ6oWa703vuPq2x45oNuYikh7"},"signature":"oHJvSHCZryU42V3yt3E4MOO4cULxagCYODXDB0m+/iMZzQOmqdomhoPqzfA/WTbiPwhtRacQdWI2s6wLVSQAqA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hcpl3nuagwjwznuppg36yh7a25csmwa3pnjr8h","package":{"name":"hello","path":"gno.land/r/boonedox/hello","files":[{"name":"package.gno","body":"package hello\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\t// Set admin address\n\traffle.RegisterCode(\"4LuVGAx3sx\")\n\traffle.RegisterUsername(\"boonedox\")\n\n}\n\nfunc Render(path string) string {\n\traffle.RegisterCode(\"4LuVGAx3sx\")\n\traffle.RegisterUsername(\"boonedox\")\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7DzAKxaGx3hBRHd3k2rRfvEeLASWiBqKh+CU6DV862x"},"signature":"u1f140PeB8kUuqg8CHG6yLGbnT41XLG7Elja8q7JZ9QgJsSsqkJGHutWLFyuvNbtjNN5RV8Y+Zrz0NFh8tMXVA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1tqwwp7z9ulq76x79tjsxh0j7djnenyzmlauqh9","package":{"name":"hello","path":"gno.land/r/hdjshfjsdhfsj/hello","files":[{"name":"package.gno","body":"package hello\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc init() {\n\traffle.RegisterCode(\"xvadXU29oY\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwTqbMmqAPmrLcoWNbVUK/uyCXsuf/10ecNmszjE+ruJ"},"signature":"uwIlP1ugmykk1+NHUbk0QrwdCjpjn3B0TIUGTvZzBNFtFIYmTC9mjMD/hFCUYAnEUpIWNtbmVbt/rK0+KglwPg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1utuf3fk30x09ul9zsf4sehlxdk34hlhsry8sdy","package":{"name":"raffle","path":"gno.land/r/conradsmi/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\traffle.RegisterCode(\"cz6P5zykkt\")\n\traffle.RegisterUsername(\"conradsmi\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A3gTqRjwwaAvqefccqEPQ6oWa703vuPq2x45oNuYikh7"},"signature":"GePPD3tc1jC4L9RAD7Sdo3hfx1HX1EEo3+TU1HFI2gNEpeDPhfbhAUOgrqcVsbY+Ej57EpS5ufOkRSqXlza5Og=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1egxdnzrmhva4wcx2celjwk0a25gf6xjrrqkzwg","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"+/DlrtrRo2BOFisg6LC8KCrdSgEPEGpHXvVtY4yKW3EXQwse2CPsQpByk8rjbaJwWHpitAIAGguWdYd0BsvHUA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1axvq7czeyp8z79ncn48e4cyjl68mqczcrz5wps","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"EBL+O1HEa+Lw3i4Iz1A18e91CxD7IIDsDrmOjY+8T8xFbzTzABhDvbhjFOhnnorspU+TQUNQTb1P2PBoE9R8gA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1hxgta0d4zkl49n9zvyylgjhf78m00qzp629p5p","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"CCRQaqal7SoF8yAx9w8e/YCJ1H0YlnlV9wLG7axbgCJvhOPgeIfLhFJ2oxPi+LWuplCY6O1oMAbfzu2D2DeY8A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1tqwwp7z9ulq76x79tjsxh0j7djnenyzmlauqh9","package":{"name":"hello","path":"gno.land/r/hdjshfjsdhfsj/hello","files":[{"name":"package.gno","body":"package hello\n\nimport \"gno.land/r/gc24/raffle\"\n\n\nfunc init() {\n raffle.RegisterCode(\"xvadXU29oY\")\n raffle.RegisterUsername(\"bashia\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwTqbMmqAPmrLcoWNbVUK/uyCXsuf/10ecNmszjE+ruJ"},"signature":"PlB4aSkFxJT86aS31tmOArjik15ywp7VvIS8bWzguaUEnB+z5GlZi2rWFUw+9u93oCwnUlj74saBBv9KewukZQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1tqwwp7z9ulq76x79tjsxh0j7djnenyzmlauqh9","package":{"name":"hello","path":"gno.land/r/vrvt/hello","files":[{"name":"package.gno","body":"package hello\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc init() {\n\traffle.RegisterCode(\"xvadXU29oY\")\n\traffle.RegisterUsername(\"bashia\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwTqbMmqAPmrLcoWNbVUK/uyCXsuf/10ecNmszjE+ruJ"},"signature":"oT0GuTqwGt4k2/G49mZ3yFexMXTaAWkIfIv8ltbFtN8cm4A7QLR6Tu4LoaaZjHOxTuB67Ib7I3kP7ljPS86xVg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1tqwwp7z9ulq76x79tjsxh0j7djnenyzmlauqh9","package":{"name":"hello","path":"gno.land/r/vrvt/hello","files":[{"name":"package.gno","body":"package hello\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc init() {\n\traffle.RegisterUsername(\"bashia\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwTqbMmqAPmrLcoWNbVUK/uyCXsuf/10ecNmszjE+ruJ"},"signature":"s/EIb3SD+hNXr1WSZ4xu6F0T2A37xVMgzGJnxC9hrzR3BjF6eiyLivkX8AUidoMe62rykDXTzI92agUxUg8s3Q=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1yfwv6gyujajnsewyt5j4q59fq5w42nzw2vltzz","package":{"name":"raffle","path":"gno.land/r/helithumper/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc Render(_ string) string {\n\tcode := \"uW9zngjSwE\"\n\treturn raffle.RegisterCode(code)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A0beyajY4/ngUdmO3pFPWAGm8pEK3uyP6qh8ELu4pH8q"},"signature":"OczYRbFIrFqI79OsCjWqx+pBwE4TjDqLkmXOLGkDgtR6sbW6qMWfMbwakBY7zi0SnVygpnE/Yao+GgWAZM6L7g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1yfwv6gyujajnsewyt5j4q59fq5w42nzw2vltzz","package":{"name":"raffle","path":"gno.land/r/helithumper/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport (\n \"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n code := \"uW9zngjSwE\"\n return raffle.RegisterCode(code)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A0beyajY4/ngUdmO3pFPWAGm8pEK3uyP6qh8ELu4pH8q"},"signature":"n1ZAceL3sfZa09pKRZwt0rmN/81/npajhweSZ186P7YqTCQgzunW2DZXX+/oX9wyNMarr1qyLGI3D+WH00Uv+w=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1yfwv6gyujajnsewyt5j4q59fq5w42nzw2vltzz","package":{"name":"raffle2","path":"gno.land/r/helithumper/raffle2","files":[{"name":"package.gno","body":"package raffle\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\tcode := \"uW9zngjSwE\"\n\treturn raffle.RegisterCode(code)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A0beyajY4/ngUdmO3pFPWAGm8pEK3uyP6qh8ELu4pH8q"},"signature":"qi/Wt87rHu95U4acffxOajlgqFZXB6CyuEIAIcFf7k4AO9DnGEOSPjR03LSiPZX3Z79Mb5GnWFYTlykGCTUvmg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1yfwv6gyujajnsewyt5j4q59fq5w42nzw2vltzz","package":{"name":"raffle2","path":"gno.land/r/helithumper/raffle2","files":[{"name":"package.gno","body":"package raffle\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\tcode := \"uW9zngjSwE\"\n\traffle.RegisterCode(code)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A0beyajY4/ngUdmO3pFPWAGm8pEK3uyP6qh8ELu4pH8q"},"signature":"pn97FkgfjynGH6NkHNsjZahMvwixS1+1vUudbgPDa6M/cn1ne/VuGj89AkbFaU/K5hWS7cohc5H0GhZh+09hLQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1t7k3aap9sm8796y6r8pl77tvv3396sfaxmrqn5","package":{"name":"gohper","path":"gno.land/r/jahowell/gohper","files":[{"name":"package.gno","body":"package gopher\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nconst raffleCode = \"eFAwFHEHrU\"\n\nfunc init() {\n\tresult := raffle.RegisterCode(raffleCode)\n\n\tfmt.Println(result)\n\n\tresult = raffle.RegisterUsername(\"ja-howell\")\n\n\tfmt.Println(result)\n}\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AifU7tgCMNZZaK4PdgyUGOTFea8/3NrhHWpg+eTf6GCt"},"signature":"ERZYiAixackFvY1cefTPuwBSYrqPJ1XZ9ogq5U/eguY4sQiB65ALNHONBNUVaZ5zIWLopJl67Fw3dwzOuINw3A=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1svd47qp3kjamyxk8078ck7kstyfglvxtal6en5","package":{"name":"raffle","path":"gno.land/r/ianhowell/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nconst code = \"FmJ4gDUiCc\"\nconst username = \"ian-howell\"\n\nfunc init() {\n\tresult := raffle.RegisterCode(code)\n\tfmt.Printf(\"Result: %v\\n\", result)\n\n\tresult = raffle.RegisterUsername(username)\n\tfmt.Printf(\"Result: %v\\n\", result)\n}\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A27iZvshXESwy2oirWofFOaA8ITr72ULTZAjGxyxtEwA"},"signature":"R91/X7ev/uMv3HQsW/1rTj4Hs3RQltdfQAXaLwAlKvFZOQDipcHDBreVDjkNljHpUjGtiEJHJLn+Z7G6D8S3Fg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1yfwv6gyujajnsewyt5j4q59fq5w42nzw2vltzz","package":{"name":"raffle","path":"gno.land/r/helithumper/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport (\n \"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n code := \"uW9zngjSwE\"\n raffle.RegisterCode(code)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A0beyajY4/ngUdmO3pFPWAGm8pEK3uyP6qh8ELu4pH8q"},"signature":"LHu6mR5oe8p5msCWuoP9bSwt0+YP1tfHXty33ta41X926rDRzB3X2H12jiPH8nHXcHmiUUVQAIT4xQ20VegsfA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1yfwv6gyujajnsewyt5j4q59fq5w42nzw2vltzz","package":{"name":"raffle2","path":"gno.land/r/helithumper/raffle2","files":[{"name":"package.gno","body":"package raffle\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\tcode := \"uW9zngjSwE\"\n\traffle.RegisterCode(code)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A0beyajY4/ngUdmO3pFPWAGm8pEK3uyP6qh8ELu4pH8q"},"signature":"3yKM/hAhqRr68JQjt5Q4v9qdbI4t/yGVa3c0QqG44Tx2waNesY8NWLCRx5i/kwa/o7OUX+xzoOn+1nNfJ6FE0A=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1svd47qp3kjamyxk8078ck7kstyfglvxtal6en5","package":{"name":"raffle","path":"gno.land/r/ianhowell/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport (\n\t\"fmt\"\n\t\"gno.land/r/gc24/raffle\"\n)\n\nconst code = \"FmJ4gDUiCc\"\nconst username = \"ian-howell\"\n\nfunc init() {\n\tresult := raffle.RegisterCode(code)\n\tfmt.Printf(\"Result: %v\\n\", result)\n\n\tresult = raffle.RegisterUsername(username)\n\tfmt.Printf(\"Result: %v\\n\", result)\n}\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A27iZvshXESwy2oirWofFOaA8ITr72ULTZAjGxyxtEwA"},"signature":"T78tTKxiymxsmXbzA5dzz1i5h1t7PWMvI8fGPOLpMR4lntMbvJoX3Wj6eM7b5p3TNIGJyZB3ufhUtNWk1CnqXA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1t7k3aap9sm8796y6r8pl77tvv3396sfaxmrqn5","package":{"name":"gohper","path":"gno.land/r/jahowell/gohper","files":[{"name":"package.gno","body":"package gopher\n\nimport (\n\t\"fmt\"\n\t\"gno.land/r/gc24/raffle\"\n)\n\nconst raffleCode = \"eFAwFHEHrU\"\n\nfunc init() {\n\tresult := raffle.RegisterCode(raffleCode)\n\n\tfmt.Println(result)\n\n\tresult = raffle.RegisterUsername(\"ja-howell\")\n\n\tfmt.Println(result)\n}\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AifU7tgCMNZZaK4PdgyUGOTFea8/3NrhHWpg+eTf6GCt"},"signature":"pCEUnzo9Ko5BxpH6Mso98pmVF+AfweK2FRW6/jNJ6uJzQFhQAR2ZL8O+vYohaPEvK04X28DP/E83EuH5x6dBTA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1svd47qp3kjamyxk8078ck7kstyfglvxtal6en5","package":{"name":"raffle","path":"gno.land/r/ianhowell/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport (\n\t\"fmt\"\n\t\"gno.land/r/gc24/raffle\"\n)\n\nconst code = \"FmJ4gDUiCc\"\nconst username = \"ian-howell\"\n\nfunc init() {\n\tresult := raffle.RegisterCode(code)\n\tfmt.Printf(\"Result: %v\\n\", result)\n\n\tresult = raffle.RegisterUsername(username)\n\tfmt.Printf(\"Result: %v\\n\", result)\n}\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A27iZvshXESwy2oirWofFOaA8ITr72ULTZAjGxyxtEwA"},"signature":"mwSg3ywBsnwSTxYNW2prbQO3d6ydRxjGaUwzbQgaixMsl8kkzXWOnf9wMNLyGJd4/1gypmV1W3a5kJ2HiW2eyw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1t7k3aap9sm8796y6r8pl77tvv3396sfaxmrqn5","package":{"name":"gopher","path":"gno.land/r/jahowell/gopher","files":[{"name":"package.gno","body":"package gopher\n\nimport (\n\t\"fmt\"\n\t\"gno.land/r/gc24/raffle\"\n)\n\nconst raffleCode = \"eFAwFHEHrU\"\n\nfunc init() {\n\tresult := raffle.RegisterCode(raffleCode)\n\n\tfmt.Println(result)\n\n\tresult = raffle.RegisterUsername(\"ja-howell\")\n\n\tfmt.Println(result)\n}\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AifU7tgCMNZZaK4PdgyUGOTFea8/3NrhHWpg+eTf6GCt"},"signature":"MnzNdJO3QwAv0lkr/c1+hWSsVBoLjZR1WZ+i/zA8SaBzqPDla5yeEWGY/vqvXfQ/L+DrCkSr95yZhoMdhwy99g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lggjskpg0c6sg7fsvnpycmjdkqcv8ymzdamgdh","package":{"name":"entry4","path":"gno.land/r/arjunmalhotra1/entry4","files":[{"name":"raffle.gno","body":"package entry2\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\n// func main() {\n// \t//raffle.RegisterCode(\"nARh6Pkeqo\")\n// callRegisterCode()\n\n// }\n\nfunc init() {\n\t// Set admin address\n\to = ownable.NewWithAddress(\"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5\")\n\n\tpartialEntries = make([]*EntryData, 0)\n\tcompleteEntries = make([]*EntryData, 0)\n\tregisteredHashes = make(map[string]struct{})\n\tcodeHashes = make([]string, 300)\n}\n\nfunc callRegisterCode() {\n\traffle.RegisterCode(\"nARh6Pkeqo\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AkP5eOB5pt0ZimYaWGURBPpwROMHsYFDRGASVByxK/Mi"},"signature":"Kr/WJj5gNo1Jv8LA669SCzEkkz1lOux4mxq4mlV3dccUkHmG8MiwTy4n3M9fXKtpUlKFhSXYIlCb0/ZTRuKmig=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1svd47qp3kjamyxk8078ck7kstyfglvxtal6en5","package":{"name":"raffle","path":"gno.land/r/ianhowell/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nconst code = \"FmJ4gDUiCc\"\nconst username = \"ian-howell\"\n\nfunc init() {\n\traffle.RegisterCode(code)\n\traffle.RegisterUsername(username)\n}\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A27iZvshXESwy2oirWofFOaA8ITr72ULTZAjGxyxtEwA"},"signature":"jvslCIcPhY8fLymBKjeF0Gu3U1wo7BtL6IYj7Dq970EUu/fx2Q7K9xBzFaV5OApol6kuMu/VjuZBAsD8AxTNoA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hxgta0d4zkl49n9zvyylgjhf78m00qzp629p5p","package":{"name":"raffle","path":"gno.land/r/jmrosh/raffle","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Asn8+gRvNoYJeAsFWwltz0hW1eJUTpynfyPDyDYAYaZm"},"signature":"4Pxwx+4Rkru98lMeQj70FZx8rdk1gXV858tCFFRQddIpCiNDyQkqhYIGZBIT4hog+GtE3x/zZxDAR0h8O+vW3g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1t7k3aap9sm8796y6r8pl77tvv3396sfaxmrqn5","package":{"name":"gopher","path":"gno.land/r/jahowell/gopher","files":[{"name":"package.gno","body":"package gopher\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nconst raffleCode = \"eFAwFHEHrU\"\n\nfunc init() {\n\traffle.RegisterCode(raffleCode)\n\traffle.RegisterUsername(\"ja-howell\")\n}\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AifU7tgCMNZZaK4PdgyUGOTFea8/3NrhHWpg+eTf6GCt"},"signature":"33rqrD/FyNwKRJf43IJe9W2S8cJZ3XyjoaTROrB/PvFIWEalhbO3k4zUYhELUDUalTLSMpb5wIuQ+MueHrLIlw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1yfwv6gyujajnsewyt5j4q59fq5w42nzw2vltzz","package":{"name":"raffle2","path":"gno.land/r/helithumper/raffle2","files":[{"name":"package.gno","body":"package raffle\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\tcode := \"uW9zngjSwE\"\n\t_ = raffle.RegisterCode(code)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A0beyajY4/ngUdmO3pFPWAGm8pEK3uyP6qh8ELu4pH8q"},"signature":"asarNUtfrbsgj2p2uzOwfBEjfMxgUFWkX41ZBNxmg6AiI90GNNZCJ/nR0oWo7R1xYlGz7hWJFgluzXB2HwmM/g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lggjskpg0c6sg7fsvnpycmjdkqcv8ymzdamgdh","package":{"name":"entry4","path":"gno.land/r/arjunmalhotra1/entry4","files":[{"name":"raffle.gno","body":"package entry4\n\nimport (\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"gno.land/r/gc24/raffle\"\n\t\"math/rand\"\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/ownable\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\n// func main() {\n// \t//raffle.RegisterCode(\"nARh6Pkeqo\")\n// callRegisterCode()\n\n// }\n\nfunc init() {\n\t// Set admin address\n\to = ownable.NewWithAddress(\"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5\")\n\n\tpartialEntries = make([]*EntryData, 0)\n\tcompleteEntries = make([]*EntryData, 0)\n\tregisteredHashes = make(map[string]struct{})\n\tcodeHashes = make([]string, 300)\n}\n\nfunc callRegisterCode() {\n\traffle.RegisterCode(\"nARh6Pkeqo\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AkP5eOB5pt0ZimYaWGURBPpwROMHsYFDRGASVByxK/Mi"},"signature":"r1TW/sljEYUZ/7cU/fTsNsM3xjUrYq8DQ7eMOIaJDcJV/l/ZUyDYdhJTLtTfW32VjSssqnBYzFSX2fhIHlXEFQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lggjskpg0c6sg7fsvnpycmjdkqcv8ymzdamgdh","package":{"name":"entry4","path":"gno.land/r/arjunmalhotra1/entry4","files":[{"name":"raffle.gno","body":"package entry4\n\nimport (\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"gno.land/r/gc24/raffle\"\n\t\"math/rand\"\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/ownable\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\n// func main() {\n// \t//raffle.RegisterCode(\"nARh6Pkeqo\")\n// callRegisterCode()\n\n// }\n\nfunc init() {\n\t// Set admin address\n\to := ownable.NewWithAddress(\"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5\")\n\n\tpartialEntries = make([]*EntryData, 0)\n\tcompleteEntries = make([]*EntryData, 0)\n\tregisteredHashes = make(map[string]struct{})\n\tcodeHashes = make([]string, 300)\n}\n\nfunc callRegisterCode() {\n\traffle.RegisterCode(\"nARh6Pkeqo\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AkP5eOB5pt0ZimYaWGURBPpwROMHsYFDRGASVByxK/Mi"},"signature":"4PMRrgcjDrH3noLVAhh9pYMB36RBiVw9zCLPC5iFKYVu7l/gOfW7qtmL8rLobM/NzbLZETJB8Ut+eKN99mk3JA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1yfwv6gyujajnsewyt5j4q59fq5w42nzw2vltzz","package":{"name":"raffle2","path":"gno.land/r/helithumper/raffle2","files":[{"name":"package.gno","body":"package raffle2\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\tcode := \"uW9zngjSwE\"\n\t_ = raffle.RegisterCode(code)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A0beyajY4/ngUdmO3pFPWAGm8pEK3uyP6qh8ELu4pH8q"},"signature":"GD0BE3wlfstrozyS+B9cTunEl3GaXDGJaG3bTo3oJUULTVkFkPoVl6hxRIFqvSKCC+wV1DEZYByKaBUFfQfD+Q=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lggjskpg0c6sg7fsvnpycmjdkqcv8ymzdamgdh","package":{"name":"entry4","path":"gno.land/r/arjunmalhotra1/entry4","files":[{"name":"raffle.gno","body":"package entry4\n\nimport (\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"gno.land/r/gc24/raffle\"\n\t\"math/rand\"\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/ownable\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\n// func main() {\n// \t//raffle.RegisterCode(\"nARh6Pkeqo\")\n// callRegisterCode()\n\n// }\n\n// EntryData is the main struct that contains all data on raffle entries\ntype EntryData struct {\n\ttxorigin std.Address\n\tcaller std.Realm\n\traffleCode string\n\tcodeHash string\n\tghUsername string\n}\n\n// Top-level variables are automatically persisted to storage\nvar (\n\to *ownable.Ownable // admin of the raffle realm\n\tpartialEntries []*EntryData // keeps registered partialEntries\n\tcompleteEntries []*EntryData // keeps complete registrations: valid code + gh username\n\tcodeHashes []string // valid code hashes\n\tregisteredHashes map[string]struct{} // tracks if a code has been registered before\n\twinner1, winner2 *EntryData // storing raffle winners\n\tnumReg int\n\trandSource *rand.Rand\n)\n\nfunc init() {\n\t// Set admin address\n\to = ownable.NewWithAddress(\"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5\")\n\n\tpartialEntries = make([]*EntryData, 0)\n\tcompleteEntries = make([]*EntryData, 0)\n\tregisteredHashes = make(map[string]struct{})\n\tcodeHashes = make([]string, 300)\n}\n\nfunc callRegisterCode() {\n\traffle.RegisterCode(\"nARh6Pkeqo\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AkP5eOB5pt0ZimYaWGURBPpwROMHsYFDRGASVByxK/Mi"},"signature":"mNZPgY4APewjhGwUplS5HdcwAAdspwZESjGSANKhHnwS06GZZ1oow3wCVOI6bU2YHBnqPrxjU8i9A4bApKZ/Ow=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lggjskpg0c6sg7fsvnpycmjdkqcv8ymzdamgdh","package":{"name":"entry4","path":"gno.land/r/arjunmalhotra1/entry4","files":[{"name":"raffle.gno","body":"package entry4\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n\t\"math/rand\"\n\t\"std\"\n\n\t\"gno.land/p/demo/ownable\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\n// func main() {\n// \t//raffle.RegisterCode(\"nARh6Pkeqo\")\n// callRegisterCode()\n\n// }\n\n// EntryData is the main struct that contains all data on raffle entries\ntype EntryData struct {\n\ttxorigin std.Address\n\tcaller std.Realm\n\traffleCode string\n\tcodeHash string\n\tghUsername string\n}\n\n// Top-level variables are automatically persisted to storage\nvar (\n\to *ownable.Ownable // admin of the raffle realm\n\tpartialEntries []*EntryData // keeps registered partialEntries\n\tcompleteEntries []*EntryData // keeps complete registrations: valid code + gh username\n\tcodeHashes []string // valid code hashes\n\tregisteredHashes map[string]struct{} // tracks if a code has been registered before\n\twinner1, winner2 *EntryData // storing raffle winners\n\tnumReg int\n\trandSource *rand.Rand\n)\n\nfunc init() {\n\t// Set admin address\n\to = ownable.NewWithAddress(\"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5\")\n\n\tpartialEntries = make([]*EntryData, 0)\n\tcompleteEntries = make([]*EntryData, 0)\n\tregisteredHashes = make(map[string]struct{})\n\tcodeHashes = make([]string, 300)\n}\n\nfunc callRegisterCode() {\n\traffle.RegisterCode(\"nARh6Pkeqo\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AkP5eOB5pt0ZimYaWGURBPpwROMHsYFDRGASVByxK/Mi"},"signature":"cDK2t2ltD2BCQyxfO/2cKK6yZh2zWkGGWKbg+5UeYBx5dPf6JcQBecLqLTUCVXekq3VSDrcPKlC7m5EtDkVuGw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lggjskpg0c6sg7fsvnpycmjdkqcv8ymzdamgdh","package":{"name":"entry4","path":"gno.land/r/arjunmalhotra1/entry4","files":[{"name":"raffle.gno","body":"package entry4\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n\t\"math/rand\"\n\t\"std\"\n\n\t\"gno.land/p/demo/ownable\"\n)\n\n// func main() {\n// \t//raffle.RegisterCode(\"nARh6Pkeqo\")\n// callRegisterCode()\n\n// }\n\n// EntryData is the main struct that contains all data on raffle entries\ntype EntryData struct {\n\ttxorigin std.Address\n\tcaller std.Realm\n\traffleCode string\n\tcodeHash string\n\tghUsername string\n}\n\n// Top-level variables are automatically persisted to storage\nvar (\n\to *ownable.Ownable // admin of the raffle realm\n\tpartialEntries []*EntryData // keeps registered partialEntries\n\tcompleteEntries []*EntryData // keeps complete registrations: valid code + gh username\n\tcodeHashes []string // valid code hashes\n\tregisteredHashes map[string]struct{} // tracks if a code has been registered before\n\twinner1, winner2 *EntryData // storing raffle winners\n\tnumReg int\n\trandSource *rand.Rand\n)\n\nfunc init() {\n\t// Set admin address\n\to = ownable.NewWithAddress(\"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5\")\n\n\tpartialEntries = make([]*EntryData, 0)\n\tcompleteEntries = make([]*EntryData, 0)\n\tregisteredHashes = make(map[string]struct{})\n\tcodeHashes = make([]string, 300)\n}\n\nfunc callRegisterCode() {\n\traffle.RegisterCode(\"nARh6Pkeqo\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AkP5eOB5pt0ZimYaWGURBPpwROMHsYFDRGASVByxK/Mi"},"signature":"vKfL2Y7RX7DQI4qEP33Zh+I8HASBb4YawqJzuMWDkTAXHb5QsAFI68Ch+YSS02qwwjA04Lfpd21ZAbjRfbfR7Q=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1yfwv6gyujajnsewyt5j4q59fq5w42nzw2vltzz","package":{"name":"raffle3","path":"gno.land/r/helithumper/raffle3","files":[{"name":"package.gno","body":"package raffle3\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\tcode := \"uW9zngjSwE\"\n\tgithubAcct := \"helithumper\"\n\t_ = raffle.RegisterCode(code)\n\t_ = raffle.RegisterUsername(githubAcct)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A0beyajY4/ngUdmO3pFPWAGm8pEK3uyP6qh8ELu4pH8q"},"signature":"ORe/XY4u9LemRs0uZWMM38bpuNfnrZsPZnxJSYVwMndSNmg5HcwH5m6xFyFQz1W32dwuRm9Mr5ii9S5Jcs4Acw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hxgta0d4zkl49n9zvyylgjhf78m00qzp629p5p","package":{"name":"raffle","path":"gno.land/r/2Uwr0fffBG/raffle","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n return \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Asn8+gRvNoYJeAsFWwltz0hW1eJUTpynfyPDyDYAYaZm"},"signature":"+5KMgq4kDJ2rTba1PFx5UOBpW85P2oQ6JYJhgrzEbc9EjLZjAgRNrln0stXYJ+FM/Dazergz54zvKwJYWeHwTg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1yfwv6gyujajnsewyt5j4q59fq5w42nzw2vltzz","package":{"name":"rafflegithub","path":"gno.land/r/helithumper/rafflegithub","files":[{"name":"package.gno","body":"package rafflegithub\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\tcode := \"uW9zngjSwE\"\n\tgithubAcct := \"helithumper\"\n\t_ = raffle.RegisterCode(code)\n\t_ = raffle.RegisterUsername(githubAcct)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A0beyajY4/ngUdmO3pFPWAGm8pEK3uyP6qh8ELu4pH8q"},"signature":"xDitmFrgGbJx0dYvMCiO+1KKS90cdd12W9nmO/PfbkgBjvr0jFT7MrikT/LhHDM2MY9mZjUu7k8kixhlEetOHA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1yfwv6gyujajnsewyt5j4q59fq5w42nzw2vltzz","package":{"name":"rafflegithub","path":"gno.land/r/helithumper/rafflegithub","files":[{"name":"package.gno","body":"package rafflegithub\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\tcode := \"uW9zngjSwE\"\n\tgithubAcct := \"helithumper\"\n\t// _ = raffle.RegisterCode(code)\n\t_ = raffle.RegisterUsername(githubAcct)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A0beyajY4/ngUdmO3pFPWAGm8pEK3uyP6qh8ELu4pH8q"},"signature":"eWDcixJYgi1Egt5VXsMRo3vY3Tqw3Nxj34sGWQyaA84ULtbagiN2tk4/sBy+wKiG21agtJuNfgVxpCyYZwQFpg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1yfwv6gyujajnsewyt5j4q59fq5w42nzw2vltzz","package":{"name":"rafflegithub","path":"gno.land/r/helithumper/rafflegithub","files":[{"name":"package.gno","body":"package rafflegithub\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\t// code := \"uW9zngjSwE\"\n\tgithubAcct := \"helithumper\"\n\t// _ = raffle.RegisterCode(code)\n\t_ = raffle.RegisterUsername(githubAcct)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A0beyajY4/ngUdmO3pFPWAGm8pEK3uyP6qh8ELu4pH8q"},"signature":"5AyQ00UTBi/iHYvOZfVSmKIQ6JQCgtmeh9PlWD8WnuRmFDr4ieprSc1p0x70ozB6oea9zFPLYS1dEQzeytXRFg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1700s2xp02yjpptn3ymp5w6ylhjw7f4yqjyjwkn","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"vpDTlSPGzoP9ocKq3W4EnbI75bnIYZmajaNywEiJfJYNUoMyjIPPmOFyPC3VfhjHojRvSW2KSGozl01MbKzeKg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lggjskpg0c6sg7fsvnpycmjdkqcv8ymzdamgdh","package":{"name":"entry5","path":"gno.land/r/arjunmalhotra1/entry5","files":[{"name":"raffle.gno","body":"package entry5\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n\t\"math/rand\"\n\t\"std\"\n\n\t\"gno.land/p/demo/ownable\"\n)\n\n// func main() {\n// \t//raffle.RegisterCode(\"nARh6Pkeqo\")\n// callRegisterCode()\n\n// }\n\n// EntryData is the main struct that contains all data on raffle entries\ntype EntryData struct {\n\ttxorigin std.Address\n\tcaller std.Realm\n\traffleCode string\n\tcodeHash string\n\tghUsername string\n}\n\n// Top-level variables are automatically persisted to storage\nvar (\n\to *ownable.Ownable // admin of the raffle realm\n\tpartialEntries []*EntryData // keeps registered partialEntries\n\tcompleteEntries []*EntryData // keeps complete registrations: valid code + gh username\n\tcodeHashes []string // valid code hashes\n\tregisteredHashes map[string]struct{} // tracks if a code has been registered before\n\twinner1, winner2 *EntryData // storing raffle winners\n\tnumReg int\n\trandSource *rand.Rand\n)\n\nfunc init() {\n\t// Set admin address\n\to = ownable.NewWithAddress(\"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5\")\n\n\tpartialEntries = make([]*EntryData, 0)\n\tcompleteEntries = make([]*EntryData, 0)\n\tregisteredHashes = make(map[string]struct{})\n\tcodeHashes = make([]string, 300)\n\n\traffle.RegisterCode(\"nARh6Pkeqo\")\n}\n\n// func callRegisterCode() {\n// raffle.RegisterCode(\"nARh6Pkeqo\")\n// }\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AkP5eOB5pt0ZimYaWGURBPpwROMHsYFDRGASVByxK/Mi"},"signature":"3+pleyE4tQ2sZlwEI7myn79D/NgxvnEUfiNOjk0CbzVqA9+x62r8+oJb4q2cQmm6+8mE3qUORhNV72xa10elbQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lggjskpg0c6sg7fsvnpycmjdkqcv8ymzdamgdh","package":{"name":"entry6","path":"gno.land/r/arjunmalhotra1/entry6","files":[{"name":"raffle.gno","body":"package entry6\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n\t\"math/rand\"\n\t\"std\"\n\n\t\"gno.land/p/demo/ownable\"\n)\n\n// func main() {\n// \t//raffle.RegisterCode(\"nARh6Pkeqo\")\n// callRegisterCode()\n\n// }\n\n// EntryData is the main struct that contains all data on raffle entries\ntype EntryData struct {\n\ttxorigin std.Address\n\tcaller std.Realm\n\traffleCode string\n\tcodeHash string\n\tghUsername string\n}\n\n// Top-level variables are automatically persisted to storage\nvar (\n\to *ownable.Ownable // admin of the raffle realm\n\tpartialEntries []*EntryData // keeps registered partialEntries\n\tcompleteEntries []*EntryData // keeps complete registrations: valid code + gh username\n\tcodeHashes []string // valid code hashes\n\tregisteredHashes map[string]struct{} // tracks if a code has been registered before\n\twinner1, winner2 *EntryData // storing raffle winners\n\tnumReg int\n\trandSource *rand.Rand\n)\n\nfunc init() {\n\t// Set admin address\n\to = ownable.NewWithAddress(\"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5\")\n\n\tpartialEntries = make([]*EntryData, 0)\n\tcompleteEntries = make([]*EntryData, 0)\n\tregisteredHashes = make(map[string]struct{})\n\tcodeHashes = make([]string, 300)\n\n\traffle.RegisterCode(\"nARh6Pkeqo\")\n\traffle.RegisterUsername(\"arjunmalhotra1\")\n}\n\n// func callRegisterCode() {\n// raffle.RegisterCode(\"nARh6Pkeqo\")\n// }\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AkP5eOB5pt0ZimYaWGURBPpwROMHsYFDRGASVByxK/Mi"},"signature":"H3zq708uBeKkwoa/UvatMbU0SEpK4Brmt+wsXGrmO+0bXTphS+XpDqYgoJK+eaUAVuIm4Hqe+nkdlbfQSXNDpA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lggjskpg0c6sg7fsvnpycmjdkqcv8ymzdamgdh","package":{"name":"entry6","path":"gno.land/r/arjunmalhotra1/entry6","files":[{"name":"raffle.gno","body":"package entry6\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n\t\"math/rand\"\n\t\"std\"\n\n\t\"gno.land/p/demo/ownable\"\n)\n\n// func main() {\n// \t//raffle.RegisterCode(\"nARh6Pkeqo\")\n// callRegisterCode()\n\n// }\n\n// EntryData is the main struct that contains all data on raffle entries\ntype EntryData struct {\n\ttxorigin std.Address\n\tcaller std.Realm\n\traffleCode string\n\tcodeHash string\n\tghUsername string\n}\n\n// Top-level variables are automatically persisted to storage\nvar (\n\to *ownable.Ownable // admin of the raffle realm\n\tpartialEntries []*EntryData // keeps registered partialEntries\n\tcompleteEntries []*EntryData // keeps complete registrations: valid code + gh username\n\tcodeHashes []string // valid code hashes\n\tregisteredHashes map[string]struct{} // tracks if a code has been registered before\n\twinner1, winner2 *EntryData // storing raffle winners\n\tnumReg int\n\trandSource *rand.Rand\n)\n\nfunc init() {\n\t// Set admin address\n\to = ownable.NewWithAddress(\"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5\")\n\n\tpartialEntries = make([]*EntryData, 0)\n\tcompleteEntries = make([]*EntryData, 0)\n\tregisteredHashes = make(map[string]struct{})\n\tcodeHashes = make([]string, 300)\n\n\t//raffle.RegisterCode(\"nARh6Pkeqo\")\n\traffle.RegisterUsername(\"arjunmalhotra1\")\n}\n\n// func callRegisterCode() {\n// raffle.RegisterCode(\"nARh6Pkeqo\")\n// }\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AkP5eOB5pt0ZimYaWGURBPpwROMHsYFDRGASVByxK/Mi"},"signature":"afmKGimuL0sdJRkT4wpyAGo6UskFCCBFqffVHc/voOgpPHmoiyfEDg1fCh8Gh1ivSuR0tfFJarYWmzMmqmFjAg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hxgta0d4zkl49n9zvyylgjhf78m00qzp629p5p","package":{"name":"raffle","path":"gno.land/r/jmrosh/raffle","files":[{"name":"package.gno","body":"package hello\n\nimport (\n\t\"gno.lang/r/gc24/raffle\"\n)\n\nfunc init() {\n\traffle.RegisterCode(\"2Uwr0fffBG\")\n\traffle.RegisterUsername(\"jmrosh\")\n}\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Asn8+gRvNoYJeAsFWwltz0hW1eJUTpynfyPDyDYAYaZm"},"signature":"CL6akjg1QHmTdkusp6V4eegOafKf+gMzg7S6yslspxc31vNj5HWU4KDKGoQdoo2Q4elM18l2wggz8/ZQmVUIxg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g16693l5rta8ptsae7yz60zu0z8ksxps9lxl8u99","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"O2geufGAiXbZipdBu5d2SbsJycy/MtGF7Lh60OaSz3hahAknq4O3l7dxxlRgA7DQiLrEl8yCBQb55pVHKzMRxQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hxgta0d4zkl49n9zvyylgjhf78m00qzp629p5p","package":{"name":"raffle","path":"gno.land/r/jmrosh/raffle","files":[{"name":"package.gno","body":"package hello\n\nimport (\n\t\"raffle\"\n)\n\nfunc init() {\n\traffle.RegisterCode(\"2Uwr0fffBG\")\n\traffle.RegisterUsername(\"jmrosh\")\n}\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Asn8+gRvNoYJeAsFWwltz0hW1eJUTpynfyPDyDYAYaZm"},"signature":"y5Bsp6VoXQl3hYiTM6UI140fJRrkKvTIkjjDei3N8WBdAv7H3kjLvweRtcXDWHCTEUeiNbpaECG07sGFR4abMw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1gr72qp3muavsvwq5jg205c0e30ltmltpj60pwp","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"HxGtAmWiTcbAj9z7k+6IF7pGpUvubw40udV5j9hx8zNKgJfGfYCc2gUTBbgVdR9iFuHftxFoZ6BYeZmQM82fNw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hxgta0d4zkl49n9zvyylgjhf78m00qzp629p5p","package":{"name":"raffle","path":"gno.land/r/jmrosh/raffle","files":[{"name":"package.gno","body":"package hello\n\nimport (\n\t\"raffle\"\n)\n\nfunc init() {\n\tRegisterCode(\"2Uwr0fffBG\")\n\tRegisterUsername(\"jmrosh\")\n}\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Asn8+gRvNoYJeAsFWwltz0hW1eJUTpynfyPDyDYAYaZm"},"signature":"v+Exc4ow+ayguXh0gKLWaLDle8aXOc/eXEDMKuYMY+MePbzgTvWvXhJrzi7G/iKTSjJtHKMcpAzZX5hYHVGGnA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hxgta0d4zkl49n9zvyylgjhf78m00qzp629p5p","package":{"name":"raffle","path":"gno.land/r/jmrosh/raffle","files":[{"name":"package.gno","body":"package hello\n\nfunc init() {\n\tRegisterCode(\"2Uwr0fffBG\")\n\tRegisterUsername(\"jmrosh\")\n}\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Asn8+gRvNoYJeAsFWwltz0hW1eJUTpynfyPDyDYAYaZm"},"signature":"KrPE31mL8wmZzdxeLgB5x+RUgi8QBB8nIOSJlawUDulPjU9VIuO64aN8uNzpsbRxNi1+zCWasgG89JvdfvO1cA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hxgta0d4zkl49n9zvyylgjhf78m00qzp629p5p","package":{"name":"raffle","path":"gno.land/r/jmrosh/raffle","files":[{"name":"package.gno","body":"package hello\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\traffle.RegisterCode()\n}\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Asn8+gRvNoYJeAsFWwltz0hW1eJUTpynfyPDyDYAYaZm"},"signature":"Y8o/Z/fF4P94kPZF/FboMkpJ3+El1AAnowQRimYzWO1WLsKU9PwGYDsELk3OSluZi+DmNoo0Vhh8UEAZBiU38A=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hxgta0d4zkl49n9zvyylgjhf78m00qzp629p5p","package":{"name":"raffle","path":"gno.land/r/jmrosh/raffle","files":[{"name":"package.gno","body":"package hello\n\nimport (\n \"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n _ := raffle.RegisterCode(\"2Uwr0fffBG\")\n - := raffle.RegisterUsername(\"jmrosh\")\n}\n\nfunc Render(path string) string {\n return \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Asn8+gRvNoYJeAsFWwltz0hW1eJUTpynfyPDyDYAYaZm"},"signature":"VDUntkUu/BqynB5LydC85A9NXmexIEz1re8vO550641UPBvG/aAHgxDTf9Vt3O2Ny/btAv4iSQbRL2aFtQ3zZQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hxgta0d4zkl49n9zvyylgjhf78m00qzp629p5p","package":{"name":"raffle","path":"gno.land/r/jmrosh/raffle","files":[{"name":"package.gno","body":"package hello\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\traffle.RegisterCode(\"2Uwr0fffBG\")\n\traffle.RegisterUsername(\"jmrosh\")\n}\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Asn8+gRvNoYJeAsFWwltz0hW1eJUTpynfyPDyDYAYaZm"},"signature":"mcEJ/0Aa35KXNrbQnwxoXa7bQPQ9xI4Njfxrxhu1LrxPxPzi2ysKjiobE2kr6yBeOoJSEp6LQ065aF+z722lpg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16693l5rta8ptsae7yz60zu0z8ksxps9lxl8u99","package":{"name":"raffle","path":"gno.land/r/dinquisitor/raffle","files":[{"name":"package.gno","body":"package raffle\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArewOleG9fxZtFnd9Hr0szL4tcGlnbuyJ7chTF+NYf8Y"},"signature":"IXcR9Sh9wOwigkdqPIRij/2beZnoyxm2l7p1QwHj4o4jm7IO/5JVhGsgAWPpdFK7kAAZrl72pwdD58vcVQo0wQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1fjnx2elgpac3fwec30369tyctagr36eh560csc","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"7DDQC0rVzu84ju+f/iTcew0Pj/ao9HPI1/uxbHD5YRgHyvneXrdVcZBAEch5DsUDMR6pxT6H2D9QXi7NSH3Thg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16693l5rta8ptsae7yz60zu0z8ksxps9lxl8u99","package":{"name":"raffle","path":"gno.land/r/dinquisitor/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport(\n \"gno.land/r/gc24/raffle\"\n)\n\nfunc init (){\n raffle.RegisterCode(\"vYxZAKc9Gi\")\n}\n\nfunc Render(path string) string {\n return \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArewOleG9fxZtFnd9Hr0szL4tcGlnbuyJ7chTF+NYf8Y"},"signature":"tnZ6e2B9t2zSPnutftTwKhqr5FAmFdNfJ21piBD7HIduwg03gtyFfock0QpHT/CClImw8wKRvvoluYpYb+Q8+A=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hxgta0d4zkl49n9zvyylgjhf78m00qzp629p5p","package":{"name":"raffle","path":"gno.land/r/jmrosh/raffle","files":[{"name":"package.gno","body":"package hello\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\traffle.RegisterCode(\"2Uwr0fffBG\")\n\traffle.RegisterUsername(\"jmrosh\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Asn8+gRvNoYJeAsFWwltz0hW1eJUTpynfyPDyDYAYaZm"},"signature":"xfKEeFEVcVQ/v5WzcZpGs+6uMk7noUruP79kFbYFRUdLeDIN/Piosu7jRsmYYWsaDJhkzGGscLT8kFgfdK3Hfw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16693l5rta8ptsae7yz60zu0z8ksxps9lxl8u99","package":{"name":"raffle2","path":"gno.land/r/dinquisitor/raffle2","files":[{"name":"package.gno","body":"package raffle2\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\traffle.RegisterCode(\"vYxZAKc9Gi\")\n}\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArewOleG9fxZtFnd9Hr0szL4tcGlnbuyJ7chTF+NYf8Y"},"signature":"ngpkThPIOkHlPcuQ0gL+XjUmZjMzX05perYi7rpnhvUEvC4XMgOgKuiMLQ/9zGLS+8kcKf2QFwgUmcpk43DRHQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hxgta0d4zkl49n9zvyylgjhf78m00qzp629p5p","package":{"name":"raffle","path":"gno.land/r/jmrosh/raffle","files":[{"name":"package.gno","body":"package hello\n\nimport (\n\t\"gno.land/p/demo/ownable\"\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\to = ownable.NewWithAddress(\"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5\")\n\traffle.RegisterCode(\"2Uwr0fffBG\")\n\traffle.RegisterUsername(\"jmrosh\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Asn8+gRvNoYJeAsFWwltz0hW1eJUTpynfyPDyDYAYaZm"},"signature":"hNB9LAHEn9HaZbL/x9Q2uWMFPYmThjl4BVvdy1q+8adfiZpHSnXHwTOaV+hEg79whIoEaeF1NGGl+Pi+tzjS3Q=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hxgta0d4zkl49n9zvyylgjhf78m00qzp629p5p","package":{"name":"raffle1","path":"gno.land/r/jmrosh/raffle1","files":[{"name":"package.gno","body":"package hello\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\traffle.RegisterCode(\"2Uwr0fffBG\")\n\t//raffle.RegisterUsername(\"jmrosh\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Asn8+gRvNoYJeAsFWwltz0hW1eJUTpynfyPDyDYAYaZm"},"signature":"Lvasl20Zqsov9fdjojVD5locbQ+E4D6UWc+HfPZuyVQaAP1kQPWGeYHh2GQOz8th/94n8Gf45okEHQKbtJhoVg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1axvq7czeyp8z79ncn48e4cyjl68mqczcrz5wps","package":{"name":"kraffle","path":"gno.land/r/iamkevin/kraffle","files":[{"name":"package.gno","body":"package kraffle\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc Render(path string) string {\n\treturn \"Hello World! \" + path\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A5sH+T6PGCMYMwk4JxE7HvBEXf1RZ2ufwyxdEq98nj31"},"signature":"AdJj0Z3NJxhUD+w13prnBQLymFudDoTVCz3PpyFuvQRHkJg+vBBmQGuCg7O1bLWQLR3iFyRBRfbIsat3DxBoyg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hxgta0d4zkl49n9zvyylgjhf78m00qzp629p5p","package":{"name":"raffle1","path":"gno.land/r/jmrosh/raffle1","files":[{"name":"package.gno","body":"package hello\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\t//raffle.RegisterCode(\"2Uwr0fffBG\")\n\traffle.RegisterUsername(\"jmrosh\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Asn8+gRvNoYJeAsFWwltz0hW1eJUTpynfyPDyDYAYaZm"},"signature":"VIIquwmzvRB1bLHtTMbHtom12JQBZe5r/Q2bbKExeb0mO0PfeBQ1YIO4sVM08MLF9aII5YTrjof6eOD9Y+9xgg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16693l5rta8ptsae7yz60zu0z8ksxps9lxl8u99","package":{"name":"raffle2","path":"gno.land/r/dinquisitor/raffle2","files":[{"name":"package.gno","body":"package raffle2\n\nimport(\n \"gno.land/r/gc24/raffle\"\n)\n\nfunc init (){\n raffle.RegisterUsername(\"dInquisitor\")\n}\n\nfunc Render(path string) string {\n return \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArewOleG9fxZtFnd9Hr0szL4tcGlnbuyJ7chTF+NYf8Y"},"signature":"C8FTl1t8Z7naEKsFXn5ssE7pVfhxL0i5s0H/8VYJ0JwzPJcRRnyf/e0oub4eOvQ52XtxiHmfhibJpfMInvTVbQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16693l5rta8ptsae7yz60zu0z8ksxps9lxl8u99","package":{"name":"raffle3","path":"gno.land/r/dinquisitor/raffle3","files":[{"name":"package.gno","body":"package raffle2\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\traffle.RegisterUsername(\"dInquisitor\")\n}\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArewOleG9fxZtFnd9Hr0szL4tcGlnbuyJ7chTF+NYf8Y"},"signature":"168/3EzjeViWc9R6wCOp1kHedBmuusHR3w7LBU1tP3xhGx3DhO6CeHPIdOfd32HkO4WilvWIwK95II5ZIUUB5g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16693l5rta8ptsae7yz60zu0z8ksxps9lxl8u99","package":{"name":"raffle3","path":"gno.land/r/dinquisitor/raffle3","files":[{"name":"package.gno","body":"package raffle2\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\traffle.RegisterUsername(\"dInquisitor\")\n}\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArewOleG9fxZtFnd9Hr0szL4tcGlnbuyJ7chTF+NYf8Y"},"signature":"L1RKTvblYpzJQONrqNudWCvlAKTdJg1s1wuZJ2/ANkQlHQfC2Af6aVZMbDotJsd1tz35LUPI7STAimwpUZoD1A=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1axvq7czeyp8z79ncn48e4cyjl68mqczcrz5wps","package":{"name":"kraffle","path":"gno.land/r/iamkevin/kraffle","files":[{"name":"package.gno","body":"package kraffle\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc Render(path string) string {\n\tkraffle.RegisterCode(\"vwA2L8Yckr\")\n\treturn \"Hello World! \" + path\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A5sH+T6PGCMYMwk4JxE7HvBEXf1RZ2ufwyxdEq98nj31"},"signature":"RfKvTNuduN8QgTt3gQuCsFRIlsLr167TqrLgKTX2X5hiVxaeQM9ebsLRHAhRkIdlt2yPgpd5t30jLd+nKYhKCA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16693l5rta8ptsae7yz60zu0z8ksxps9lxl8u99","package":{"name":"raffle3","path":"gno.land/r/dinquisitor/raffle3","files":[{"name":"package.gno","body":"package raffle3\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\traffle.RegisterUsername(\"dInquisitor\")\n}\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArewOleG9fxZtFnd9Hr0szL4tcGlnbuyJ7chTF+NYf8Y"},"signature":"g/otl0XvI2fee8jQ+fjulcxeqJi1N1bFJfkJUiqCd1lETCDngbHwGZ74EtPlHzTzISgRQRkPR/M9K05vBpD/Gw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1yfwv6gyujajnsewyt5j4q59fq5w42nzw2vltzz","package":{"name":"raffle","path":"gno.land/r/ckami2088/raffle","files":[{"name":"package.gno","body":"package rafflegithub\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\tcode := \"9tPFscqR2H\"\n\tgithubAcct := \"ckami2088\"\n\t_ = raffle.RegisterCode(code)\n\t_ = raffle.RegisterUsername(githubAcct)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A0beyajY4/ngUdmO3pFPWAGm8pEK3uyP6qh8ELu4pH8q"},"signature":"QX5y/5NRcYXu15DZsqcHesYR3jstObGVsfj8viM6jt9igYlhejgpGfcQmgdsBAeec5v3SpVxlNrpPMLUrHD9MA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1gr72qp3muavsvwq5jg205c0e30ltmltpj60pwp","package":{"name":"raffle","path":"gno.land/r/tliu523/raffle","files":[{"name":"package.gno","body":"package hello\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\traffle.RegisterCode(\"duL6EeAcBx\")\n}\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6YQFkPIgQXSpaW3G/sqF45d/xW1aMipi0SHXdWvMg/D"},"signature":"njOAEo6MKzyx/zLb+u0oHl5DbKHYpqWbS07JaDGl/Eo/z5DcBbiobkMeITDe+FnuuoWNvjFQlYq/CjT5lSLwiw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1axvq7czeyp8z79ncn48e4cyjl68mqczcrz5wps","package":{"name":"kraffle","path":"gno.land/r/iamkevin/kraffle","files":[{"name":"package.gno","body":"package kraffle\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc Render(path string) string {\n\traffle.RegisterCode(\"vwA2L8Yckr\")\n\treturn \"Hello World! \" + path\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A5sH+T6PGCMYMwk4JxE7HvBEXf1RZ2ufwyxdEq98nj31"},"signature":"c6zmoHAHHtP+PxpkjUJT9pZuq/lW+r+vRnLdAZOjLpx+qvbuGge5CORHhVblXIcbFiFi7eLusYQaEXH0pSl3eg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1yfwv6gyujajnsewyt5j4q59fq5w42nzw2vltzz","package":{"name":"rafflegithub","path":"gno.land/r/ckami2088/rafflegithub","files":[{"name":"package.gno","body":"package rafflegithub\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\tcode := \"9tPFscqR2H\"\n\tgithubAcct := \"ckami2088\"\n\trescode := raffle.RegisterCode(code)\n\tresgithub := raffle.RegisterUsername(githubAcct)\n\tprintln(rescode + resgithub)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A0beyajY4/ngUdmO3pFPWAGm8pEK3uyP6qh8ELu4pH8q"},"signature":"PQefRyt8QmMhVxBSrZ7L05+sCc5G+Sr7gmQGpbD8xrx4QhisCqFaksTfv7RahprBHQm/Y/OIUva3uErJjBQu5g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1gr72qp3muavsvwq5jg205c0e30ltmltpj60pwp","package":{"name":"raffle","path":"gno.land/r/tliu523/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\traffle.RegisterCode(\"duL6EeAcBx\")\n}\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6YQFkPIgQXSpaW3G/sqF45d/xW1aMipi0SHXdWvMg/D"},"signature":"CZPt7uTdiqrGnDmf7SCJfdOHJs29MGJ7Rj708wz6c2NVryON2F8h0r0ctiiT7gEF/jx0JG7UabH+/CCZ+wj1Zg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hxgta0d4zkl49n9zvyylgjhf78m00qzp629p5p","package":{"name":"rafentry","path":"gno.land/r/jmrosh/rafentry","files":[{"name":"package.gno","body":"package rafentry\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\traffle.RegisterCode(\"2Uwr0fffBG\")\n\traffle.RegisterUsername(\"jmrosh\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Asn8+gRvNoYJeAsFWwltz0hW1eJUTpynfyPDyDYAYaZm"},"signature":"fthFRzCUppMb6mkYjzVAV+WYeGJLKW3RQg7ihXZI0MxN8tW2nquLwfzGOuSOPI3Q5KbGW7PU0yR2pKvOhEkmfw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1egxdnzrmhva4wcx2celjwk0a25gf6xjrrqkzwg","package":{"name":"raffle","path":"gno.land/r/gc24/nasikalt/raffle","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+RNhU4D68xtqiOK67FOX7esSw1dTDajrVdjWfpd1S8F"},"signature":"YZMUhKZM5J7e/fkmBaLJKy7NZvsaB4/tDwmqIhlvERQNMKiNJQaO2VJ20neQIg1Btf6FQXCeRLmUVxEtRUv94w=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1egxdnzrmhva4wcx2celjwk0a25gf6xjrrqkzwg","package":{"name":"hello","path":"gno.land/r/gc24/nasikalt/hello","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+RNhU4D68xtqiOK67FOX7esSw1dTDajrVdjWfpd1S8F"},"signature":"0L0S5UxGmG4CCj4fyccPf3R8qFxoBuO+6T4nnuEt3od59G1R0cMbbhjRQhoGeHuLBQT5OQmyrXcPe/76GjU3rw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1axvq7czeyp8z79ncn48e4cyjl68mqczcrz5wps","package":{"name":"kraffle","path":"gno.land/r/iamkevin/kraffle","files":[{"name":"package.gno","body":"package kraffle\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc Render(path string) string {\n return raffle.RegisterCode(\"vwA2L8Yckr\")\n\t// return \"Hello World! \" + path\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A5sH+T6PGCMYMwk4JxE7HvBEXf1RZ2ufwyxdEq98nj31"},"signature":"Wk3T37wLNi+GjjafajCWIj2280tKr1Dcxs5Z9WGjpU59Nc/CJkgQozmMWXGkUBxE4CAqpgLZ0JcAOA9kg5AjKw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1fjnx2elgpac3fwec30369tyctagr36eh560csc","package":{"name":"goraffle","path":"gno.land/r/whisky/goraffle","files":[{"name":"package.gno","body":"package goraffle\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc Register(code string) {\n\tprintln(raffle.RegisterCode())\n}\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AtRLZ+42wqaIKh00tnzi35+gta+wShromxVIEWmPUjDT"},"signature":"IiAc8Fsu5v5UNZG3OV9NzwcE4nsmfRKx9bdyVaiSSF4F6PWj5i1FvdDO31lw7KsdpTOM0+dxopTHLACcZF/3Dw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1gr72qp3muavsvwq5jg205c0e30ltmltpj60pwp","package":{"name":"raffle","path":"gno.land/r/tliu523/raffle","files":[{"name":"package.gno","body":"package raffle\nimport (\n \"gno.land/r/gc24/raffle\"\n)\nfunc init(){\n raffle.RegisterCode(\"duL6EeAcBx\")\n raffle.RegisterUsername(\"tliu2023\")\n}\nfunc Render(path string) string {\n return \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6YQFkPIgQXSpaW3G/sqF45d/xW1aMipi0SHXdWvMg/D"},"signature":"3wWywSf3wo7J5tO3Ef9ZLrIEd5DwRb87XbPF/0sLbeEuvXMNS/8w8PYjDTV2YPlsU+vkh9jXfL0w2Ew3SJq/qw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1gr72qp3muavsvwq5jg205c0e30ltmltpj60pwp","package":{"name":"raffleUser","path":"gno.land/r/tliu523/raffleUser","files":[{"name":"package.gno","body":"package raffleUser\nimport (\n \"gno.land/r/gc24/raffle\"\n)\nfunc init(){\n // raffle.RegisterCode(\"duL6EeAcBx\")\n raffle.RegisterUsername(\"tliu2023\")\n}\nfunc Render(path string) string {\n return \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6YQFkPIgQXSpaW3G/sqF45d/xW1aMipi0SHXdWvMg/D"},"signature":"cDDFC5kk0iZv+R2hODvpQg7NSViD4C+H7WB4hwfY9at8aolKlzSrP7G6Hjrczeotc+lKZ+Y7XOkOgP5M+pFE+w=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1gr72qp3muavsvwq5jg205c0e30ltmltpj60pwp","package":{"name":"raffle","path":"gno.land/r/tliu523/raffle","files":[{"name":"package.gno","body":"package raffle\nimport (\n \"gno.land/r/gc24/raffle\"\n)\nfunc init(){\n // raffle.RegisterCode(\"duL6EeAcBx\")\n raffle.RegisterUsername(\"tliu2023\")\n}\nfunc Render(path string) string {\n return \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6YQFkPIgQXSpaW3G/sqF45d/xW1aMipi0SHXdWvMg/D"},"signature":"HmCxmsJGLvE7xWDOqgfH+k2qX+qIp+zaAaRvxo1sD3QOkkMQHLivNJEhVHGtqRrg99dLtEaLrWtjCmSGgit7ug=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1fjnx2elgpac3fwec30369tyctagr36eh560csc","package":{"name":"goraffle","path":"gno.land/r/whisky/goraffle","files":[{"name":"package.gno","body":"package goraffle\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc Register(code string) {\n\tprintln(raffle.RegisterCode(code))\n}\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AtRLZ+42wqaIKh00tnzi35+gta+wShromxVIEWmPUjDT"},"signature":"Vf6tyCr6AYJwrHBUTPUt5hHfIamd3c6C0JiN82YxpbZfHry5atU5d89yReUV4PUNJDDRh9PXSOfozwvG3/YDLg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1gr72qp3muavsvwq5jg205c0e30ltmltpj60pwp","package":{"name":"raffle","path":"gno.land/r/tliu2023/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\t// raffle.RegisterCode(\"duL6EeAcBx\")\n\traffle.RegisterUsername(\"tliu2023\")\n}\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6YQFkPIgQXSpaW3G/sqF45d/xW1aMipi0SHXdWvMg/D"},"signature":"aWL8/7oYdDbpH4f1mRBfivQ1+3q/aHyp18yVqMGyV3QkU76QJJPEwdelkRnFfuXTDg0EvU5ZOQ/NVdSn356uRw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1vqg24cyewanhkwh6yq8rwuprzlz4kqtp4m2etj","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"tjqFyNlPeSNa87nNkJ59UgLGH7/Rap+wjDnAAUj6kDZIYfACKc1MHUUKOt59KpeGZH59E6/UpyB4r4CSfMVnqQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1vqg24cyewanhkwh6yq8rwuprzlz4kqtp4m2etj","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"+WqmXK0mcSur/kULuBN9Sxw/GG5AcgX9uSx0ysGRQZw3Dwzf/0qa+wILg7Gg727X8r48R3AU2oKq7ZBXvUvStA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1yfwv6gyujajnsewyt5j4q59fq5w42nzw2vltzz","package":{"name":"raffle","path":"gno.land/r/ckami2088/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\tcode := \"9tPFscqR2H\"\n\tgithubAcct := \"ckami2088\"\n\trescode := raffle.RegisterCode(code)\n\tresgithub := raffle.RegisterUsername(githubAcct)\n\tprintln(rescode + resgithub)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A0beyajY4/ngUdmO3pFPWAGm8pEK3uyP6qh8ELu4pH8q"},"signature":"P9RDzzt1Wb1P6c2aem+T+DCDPNMOKATPNA9uQBC82vpGs7YbXQ0M8dIGun2tn3knSJwEqVbgRSxqMqBPLXCwOA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1fjnx2elgpac3fwec30369tyctagr36eh560csc","send":"","pkg_path":"gno.land/r/whisky/goraffle","func":"Register","args":["Hk5tCsDkba"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AtRLZ+42wqaIKh00tnzi35+gta+wShromxVIEWmPUjDT"},"signature":"0DJWmX3enNLwIctA0qgYMjTMGcgYoNhXLM+tAEuwvGU0fCexzkMJh6WYMV7OTu2PCBfxNLtJ5MN6VuiX5BET7Q=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1egxdnzrmhva4wcx2celjwk0a25gf6xjrrqkzwg","package":{"name":"raffle","path":"gno.land/r/gc24/nasikalt/raffle","files":[{"name":"package.gno","body":"package hello\n\nimport \"gno.land/r/gc24/raffle/raffle\"\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n\nfunc init() {\n\traffle.RegisterCode(\"\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+RNhU4D68xtqiOK67FOX7esSw1dTDajrVdjWfpd1S8F"},"signature":"nwConn6asTSD+iLfDQm4ga+5u/OpTOLUkLkMZyuKtddXzjB++UNlI6aOl9LrWoSuZWLD+U4oWa+Oat3MzlaIgA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1egxdnzrmhva4wcx2celjwk0a25gf6xjrrqkzwg","package":{"name":"raffle","path":"gno.land/r/gc24/nasikalt/raffle","files":[{"name":"package.gno","body":"package hello\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n\nfunc init() {\n\traffle.RegisterCode(\"\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+RNhU4D68xtqiOK67FOX7esSw1dTDajrVdjWfpd1S8F"},"signature":"5mo+S5dF/DDsZU0WefFX9TMwrhSGZ3OZu0SiXBJlyYpNz6kG+taROxV4fMYGxkQI5jsZO4cTN0prFbEacCG7KA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1axvq7czeyp8z79ncn48e4cyjl68mqczcrz5wps","package":{"name":"kraffle","path":"gno.land/r/iamkevin/kraffle","files":[{"name":"package.gno","body":"package kraffle\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc Render(_ string) string {\n return raffle.RegisterCode(\"vwA2L8Yckr\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A5sH+T6PGCMYMwk4JxE7HvBEXf1RZ2ufwyxdEq98nj31"},"signature":"KVitPPV98HIB6jx0qjD/H/B90ZMqX2eJIB/L9Z0HqEEPO8qqGTihGxDLU/iiWx0j1KCimoDki+HlwgaH8/JcVQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1fjnx2elgpac3fwec30369tyctagr36eh560csc","send":"","pkg_path":"gno.land/r/gc24/raffle","func":"RegisterUsername","args":["ltzmaxwell"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AtRLZ+42wqaIKh00tnzi35+gta+wShromxVIEWmPUjDT"},"signature":"RbZvQiaWuu42eadZk8itK1iunf9/zz4Qszcx7taMl3IV4H3STDbG3+aL5pAoGfFjA8cQyrCX1XZI/u9e/m0yeA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1egxdnzrmhva4wcx2celjwk0a25gf6xjrrqkzwg","package":{"name":"raffle","path":"gno.land/r/gc24/nasikalt/raffle","files":[{"name":"package.gno","body":"package hello\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n\nfunc init() {\n\traffle.RegisterCode(\"zJazjQNrZN\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+RNhU4D68xtqiOK67FOX7esSw1dTDajrVdjWfpd1S8F"},"signature":"4raRr5bdWfVg2voVR028nFRQ01FY0hCviE6mYr+wtHZifcGXHLp71mEUDNmqkLtDxqtuNWX3vnqcxFgpkb5cog=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1axvq7czeyp8z79ncn48e4cyjl68mqczcrz5wps","package":{"name":"kraffle2","path":"gno.land/r/iamkevin/kraffle2","files":[{"name":"package.gno","body":"package kraffle2\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc Render(_ string) string {\n\treturn raffle.RegisterCode(\"vwA2L8Yckr\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A5sH+T6PGCMYMwk4JxE7HvBEXf1RZ2ufwyxdEq98nj31"},"signature":"kkze4epxW4y8d8GuoGpJhbqZAsDlpmpa/lAAGdShXvhcu9jjf5ha7RAB9whYZvbWoL07bTKV0cKhGWnJI3z6TA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1f5zd97wpz579jxqewpl2zmwwerzmkmu4h2mgky","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"XPkSRfSdhz68LngCcYykZeOjSJkPjgN5h7k9V2HkH/5eQ/g1Vczq7azKgFnV1kJLDRuRU/dUPNJcSPub26CooA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1egxdnzrmhva4wcx2celjwk0a25gf6xjrrqkzwg","package":{"name":"raffle","path":"gno.land/r/gc24/nasikalt/raffle","files":[{"name":"package.gno","body":"package hello\n\nimport r \"gno.land/r/gc24/raffle\"\n\nfunc init() {\n\tr.RegisterCode(\"zJazjQNrZN\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+RNhU4D68xtqiOK67FOX7esSw1dTDajrVdjWfpd1S8F"},"signature":"VGvkFzuoTpO2cRcY13wC/NwtAlft+X2Vva4SNIDPYtV9pQI1lJiV8hMi6gAtp5EoQyufklhZR5tTlR71FHdKwQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g168ejjw5f9rmyaxp947xjy0y07508n2d5vzlwf4","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"jd6nLwRIDmaXcYqLTMvDWkYHpCZBGuCybOuWU06jNEkTqBP8cJPydUdQ8eBVE2jF45mgCKjBTSg7HrSUhclD8w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g168ejjw5f9rmyaxp947xjy0y07508n2d5vzlwf4","package":{"name":"raffle","path":"gno.land/r/ckami2088/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport (\n\t\"gno.land/r/gc24/rafflekami\"\n)\n\nfunc init() {\n\tcode := \"9tPFscqR2H\"\n\tgithubAcct := \"ckami2088\"\n\trescode := raffle.RegisterCode(code)\n\tresgithub := raffle.RegisterUsername(githubAcct)\n\tprintln(rescode + resgithub)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjNeGiCPwikmiyyUTBToRBNS+O/uc+XmOQdYS/xVs5PE"},"signature":"UYIK9SXMeeMwHoB6Z9eMQVBH1BOPK/H9uT/u+UkmrToLLl5lRC17ulq8C3hK7ISCdC5K8VbU8uTYRMM8jpCl3w=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g168ejjw5f9rmyaxp947xjy0y07508n2d5vzlwf4","package":{"name":"raffle","path":"gno.land/r/ckami2088/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\tcode := \"9tPFscqR2H\"\n\tgithubAcct := \"ckami2088\"\n\trescode := raffle.RegisterCode(code)\n\tresgithub := raffle.RegisterUsername(githubAcct)\n\tprintln(rescode + resgithub)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjNeGiCPwikmiyyUTBToRBNS+O/uc+XmOQdYS/xVs5PE"},"signature":"k5DeOSiPkTVLORGllHEfpMd3QlUWtEPj+evjo6J2s7cf3liRAb+ub0GmPSNHKHfuBiER7Nq/P5f7gQU1dVFDLA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1axvq7czeyp8z79ncn48e4cyjl68mqczcrz5wps","package":{"name":"kraffle2","path":"gno.land/r/iamkevin/kraffle2","files":[{"name":"package.gno","body":"package kraffle2\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc Render(_ string) string {\n // return raffle.RegisterCode(\"vwA2L8Yckr\") \n return raffle.RegisterUsername(\"kevingomes17\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A5sH+T6PGCMYMwk4JxE7HvBEXf1RZ2ufwyxdEq98nj31"},"signature":"aXxWWlO6uAEmM4NV4V+YI1kXm42ia/RA34coexnxi5VqoIwhxLhuDELxCnqqoFNfUxmrmy4BKCLeQ8wa0Gpy4g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1egxdnzrmhva4wcx2celjwk0a25gf6xjrrqkzwg","package":{"name":"hello","path":"gno.land/r/gc24/nasikalt/hello","files":[{"name":"package.gno","body":"package hello\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc init() {\n raffle.RegisterCode(\"zJazjQNrZN\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+RNhU4D68xtqiOK67FOX7esSw1dTDajrVdjWfpd1S8F"},"signature":"KboDa6TuqHL764E1X4YaOE0/18M/vSXESTBCU8SArNgjp0G2j6N2JLNNeW2ehmHrMepGruY3Ypt/7Mlm4fW5yA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1axvq7czeyp8z79ncn48e4cyjl68mqczcrz5wps","package":{"name":"kraffle3","path":"gno.land/r/iamkevin/kraffle3","files":[{"name":"package.gno","body":"package kraffle3\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc Render(_ string) string {\n\t// return raffle.RegisterCode(\"vwA2L8Yckr\")\n\treturn raffle.RegisterUsername(\"kevingomes17\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A5sH+T6PGCMYMwk4JxE7HvBEXf1RZ2ufwyxdEq98nj31"},"signature":"6gAAX8Tfj0GEMFbZzc88+50DnxvuFlc2BcGCfCQvFPUnkYQxuu+lP0PavU4GNDUGrr5dJFDC3ih1u6GzKKxIuQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1egxdnzrmhva4wcx2celjwk0a25gf6xjrrqkzwg","package":{"name":"hello2","path":"gno.land/r/gc24/nasikalt/hello2","files":[{"name":"package.gno","body":"package hello\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc init() {\n\traffle.RegisterCode(\"zJazjQNrZN\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+RNhU4D68xtqiOK67FOX7esSw1dTDajrVdjWfpd1S8F"},"signature":"P3QLbSjw8WfSEvLHMughrTDzjGrEILohjnry3tkuOKN5W6lzTf5EKbV0i12ubKQhAwUE3fvfVm8rzvLDbT68jA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1axvq7czeyp8z79ncn48e4cyjl68mqczcrz5wps","package":{"name":"kraffle4","path":"gno.land/r/iamkevin/kraffle4","files":[{"name":"package.gno","body":"package kraffle4\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc Render(_ string) string {\n\treturn raffle.RegisterCode(\"vwA2L8Yckr\") + \"\\n\\n\" + raffle.RegisterUsername(\"kevingomes17\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A5sH+T6PGCMYMwk4JxE7HvBEXf1RZ2ufwyxdEq98nj31"},"signature":"qOhPbWftsDy6xMR2AfmB7uAHlwxMa/v6vUM5I8mJtt43ueoRbTWki6MGOJ6409DH4LPTMfn7uWcDd8sgnDnd7g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1axvq7czeyp8z79ncn48e4cyjl68mqczcrz5wps","package":{"name":"kraffle5","path":"gno.land/r/iamkevin/kraffle5","files":[{"name":"package.gno","body":"package kraffle5\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc Render2(_ string) string {\n\treturn raffle.RegisterCode(\"vwA2L8Yckr\") + \"\\n\\n\" + raffle.RegisterUsername(\"kevingomes17\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A5sH+T6PGCMYMwk4JxE7HvBEXf1RZ2ufwyxdEq98nj31"},"signature":"57NjoW+PbBz8vm44dlamthdN6ORwgRpC+/LnCfWQUH5lg1Q3SpNzUTSaKdS9R7YiwPQacoKCxsFuheb0TE89OQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1axvq7czeyp8z79ncn48e4cyjl68mqczcrz5wps","send":"","pkg_path":"gno.land/r/iamkevin/kraffle5","func":"Render2","args":[""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A5sH+T6PGCMYMwk4JxE7HvBEXf1RZ2ufwyxdEq98nj31"},"signature":"o/tmHGI+6BO5GDMXhIeONBFTMAmdxUMWsb/Bgp+7Eos5PaXt3ioDVHJ0QUChs7g8gVXIAdB6W2yR7meQBHDIGQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1k5apa2pxkug7nfaxcs2lp0cxc86yrczfjmpsv2","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"e9LJds3UqfOqIur9ereCjjKnScg9ouL1HFtI8jm+SvJ49P5aN40cce/+7vXjx+7QkNtt2+ihSG8IBS8U1TMMSw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1k5apa2pxkug7nfaxcs2lp0cxc86yrczfjmpsv2","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AFSledoB8lit6dPkOCH1op+66fM/FDAW9attHBoOI5srqCwicSAP2Pn/1hx2OxhN1X3xqMDu8d5DHDvWuri4aw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1gfnvafaewcrqzhl9j02wthsg4t7fu37pu6mpat","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"u5lS5hlT4/ZfoXl04MNz5BT4qwi+/iyVybFZ+zfBhrkAZ5Znob+sJzLVU9/WM4s2qQT2dnhaNmXBmoqwVJqobQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1gfnvafaewcrqzhl9j02wthsg4t7fu37pu6mpat","package":{"name":"raffle","path":"gno.land/r/allylee/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\tcode := \"WNiFC2DTs7\"\n\tgithubAcct := \"ally-lee\"\n\trescode := raffle.RegisterCode(code)\n\tresgithub := raffle.RegisterUsername(githubAcct)\n\tprintln(rescode + resgithub)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Avc8DthldCB5qu4pRPdD1G49rmZw3QpNpJ4hFkXnjfpi"},"signature":"fdrAOo3l9NKGbTOcCvRWE2mznJNcVhPcqQXCExpTWLY45267S4meTZFG3QtH8BY4lt3mOrBKcCYuahiddXK1AQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1f5zd97wpz579jxqewpl2zmwwerzmkmu4h2mgky","package":{"name":"raffle","path":"gno.land/r/everestkc/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\t// Replace \"YOUR_RAFFLE_CODE\" with your actual raffle code\n\traffle.RegisterCode(\"q3tqy6owAX\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Aq4a15bMgXUVX4FcOsGb5BAjs+5BvCurmrtVDr+g9VJc"},"signature":"ZxWa0glw7VJLJhZhzdJpas90ZxOIqaghndM2bRkIy1MWppeWD+9QUsZgw+B5Sm94WCAmMsoeXhP5ZUkosMlbNw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1f5zd97wpz579jxqewpl2zmwwerzmkmu4h2mgky","package":{"name":"raffle","path":"gno.land/r/everestkc/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport (\n \"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n // Replace \"YOUR_RAFFLE_CODE\" with your actual raffle code\n raffle.RegisterUsername(\"everestkc\")\n}"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Aq4a15bMgXUVX4FcOsGb5BAjs+5BvCurmrtVDr+g9VJc"},"signature":"JFlWOZL19IlSpdlJu6JwF1or1Uw3DIdXmd0vUL34H+5oLnOwAOvdczHhrMZGjdpN4mMNCea6av1ENb+VdrpyXg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1f5zd97wpz579jxqewpl2zmwwerzmkmu4h2mgky","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rR6CYF+u0rj/U4gJQNvQe2negWpv9/WJVSah8z/2vEA4V/wVc10HtNj/Yb+hjIX+alzPQQzr87rUbDZX6TITaw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1n93replyp2pl37qfzkh854eps2z0ar7t0rzzyj","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"13hsME6ikboKImu88PlMAy3mTYgfYz0DjK9JGQkig4UINbubRB7PZ/nvmi37L7ilwSeYTPMP/w+SvQcXYuCjpg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1f5zd97wpz579jxqewpl2zmwwerzmkmu4h2mgky","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"4jvR5cvvyjxtocq8iV/lnxhKTFuBr26G5AsoTD5aSQ17oZ+IM5T/VqQjFsvDG25DZdg+yuziop4GJoQigRGjRQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1f5zd97wpz579jxqewpl2zmwwerzmkmu4h2mgky","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"4Vp0Q8xIcwJ8H8UGpfBpQDVK3ta4BF30MrvREIT3uoB0hcnX3HuhHlxmlioGbF5mubNk/hoX0rA3ESt4LCIJGQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1f5zd97wpz579jxqewpl2zmwwerzmkmu4h2mgky","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"p0NO8tzdGRUXyd3sNt+ZmkmKr6fAM2Ua/tbfPzigytxBXnlJovEyFMsfnrq6AmnqpOXbRSHG9ZzzKLDx9bFE4A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1f5zd97wpz579jxqewpl2zmwwerzmkmu4h2mgky","package":{"name":"winner1","path":"gno.land/r/everestkc/winner1","files":[{"name":"package.gno","body":"package winner1\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\t// Replace \"YOUR_RAFFLE_CODE\" with your actual raffle code\n\traffle.RegisterUsername(\"everestkc\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Aq4a15bMgXUVX4FcOsGb5BAjs+5BvCurmrtVDr+g9VJc"},"signature":"AdOdlWrhnLrZrqi6wBcP81s0ZUzRoKeLfagp3Ec5OhUwUCyM6e87ZhMSDArM2tLDuMq2i+A06MkN11v1hRTAjA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1lhxvmjz6xzd0vwnftpz4xr4u4lg76ngux8wux9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"TFu9MfVwlj1SC6gY4cCi03gjCd2QLrPrAl5zfXhCQv0hX3VPsIVUVXn4KaulHkNvUnmKzk4fMuVSDwNVUBQP5w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1f5zd97wpz579jxqewpl2zmwwerzmkmu4h2mgky","package":{"name":"winner1","path":"gno.land/r/everest/winner1","files":[{"name":"package.gno","body":"package winner1\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\t// Replace \"YOUR_RAFFLE_CODE\" with your actual raffle code\n\traffle.RegisterUsername(\"everestkc\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Aq4a15bMgXUVX4FcOsGb5BAjs+5BvCurmrtVDr+g9VJc"},"signature":"2zosj/+YI8QOIZP3hoFyYyGGRg/FRdz7ND5x+Bh3ohJLhEzB/CJwPGM7dL/edFO8+JJJfaGrAuUAYF0jiFzW/Q=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1lhxvmjz6xzd0vwnftpz4xr4u4lg76ngux8wux9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"WwkFZfYL7ypGUuOSTZd+aSCzfnLJWQjavTTPgJTt3T1KeCCor5obCJaCivhQ/T67N1zCC3Z5YUC6SblGZ8QCEA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lhxvmjz6xzd0vwnftpz4xr4u4lg76ngux8wux9","package":{"name":"mgriff10raffle","path":"gno.land/r/mgriffi/mgriff10raffle","files":[{"name":"package.gno","body":"package mgriff10raffle\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\tcode := \"P615WU1x1V\"\n\t// githubAcct := \"mgriffin10\"\n\trescode := raffle.RegisterCode(code)\n\t// resgithub := raffle.RegisterUsername(githubAcct)\n\t// println(rescode + resgithub)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Apik08rVSW/Rb5Jn4aLvdy3XwUv5UJj1IlTvMfbnCNeM"},"signature":"oxpdu0T0fEpG2KzMBFEd7qznQ22SWgQ0IlaPy0ZAH711DjlPF+K0Xnpn1LvlQ1ILcxUYFBelOYAgF7UEtOAgBw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1lhxvmjz6xzd0vwnftpz4xr4u4lg76ngux8wux9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"diG8t+XfO36XOhW6IuSsMKSOAcNgstxpcL5Ww6OiBwENGVR4dXWVy41pOgv3CA5A2hEmcwV/eBMgFXhBgRwdyg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lhxvmjz6xzd0vwnftpz4xr4u4lg76ngux8wux9","package":{"name":"mgriff10raffle","path":"gno.land/r/mgriffi/mgriff10raffle","files":[{"name":"package.gno","body":"package mgriff10raffle\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\tcode := \"P615WU1x1V\"\n\t// githubAcct := \"mgriffin10\"\n\traffle.RegisterCode(code)\n\t// resgithub := raffle.RegisterUsername(githubAcct)\n\t// println(rescode + resgithub)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Apik08rVSW/Rb5Jn4aLvdy3XwUv5UJj1IlTvMfbnCNeM"},"signature":"OW/1EsvB0hrOJ10/kizmX+2TEzOZrlc931ofhmak6PpGxF5V7G9gov6d8o3MqA2ppCKKXM6PT5OdOUqr2DQk9g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1lhxvmjz6xzd0vwnftpz4xr4u4lg76ngux8wux9","package":{"name":"mgriff10raffle","path":"gno.land/r/mgriffin/mgriff10raffle","files":[{"name":"package.gno","body":"package mgriff10raffle\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\t// code := \"P615WU1x1V\"\n\tgithubAcct := \"mgriffin10\"\n\t// rescode := raffle.RegisterCode(code)\n\traffle.RegisterUsername(githubAcct)\n\t// println(rescode + resgithub)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Apik08rVSW/Rb5Jn4aLvdy3XwUv5UJj1IlTvMfbnCNeM"},"signature":"N9S/cCC69RTLbyjSO5QIIXxI/M0Lp2TcsmxR8beixWUsfdNWfON3Ut4XFSBPHf9qvTkbad/uKqYB22b5mj+BlQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1n93replyp2pl37qfzkh854eps2z0ar7t0rzzyj","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"uLvyQ6kv/xtcemkNanzFmbNRUGjkEU9r2YXbYbGZPh02klQWt4Z0RGmP22LjBBJcQqhje+/mvhXiL2k9ctQLdw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1n93replyp2pl37qfzkh854eps2z0ar7t0rzzyj","package":{"name":"raffle","path":"gno.land/r/whoagain/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\tcode := \"efX8UmKBy6\"\n\tgithubAcct := \"whoagain\"\n\trescode := raffle.RegisterCode(code)\n\tresgithub := raffle.RegisterUsername(githubAcct)\n\tprintln(rescode + resgithub)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Amr9/xMcwtK/G1CGPt+rXai348SqSOQ5tU7gNEOnuOSD"},"signature":"/WJg5mknrHC22fJlFyvfMg45gP+Kh49do0AJ3HV9yuVGRU15RaD+5ZJP1FNUt+bXJ/kxbRTQ2JBQENtNFekmGw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1stdnnh8hp0w43xlgansgtd83kj5h57szmx3k8z","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"WDDciOYa5lKBRLT7ZfRgvPdyWwvg322D6b6ULYv23lpKJKexyeIdko/9rvb5s9CiJ2snEN0y/tcOWCkvruCiog=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1stdnnh8hp0w43xlgansgtd83kj5h57szmx3k8z","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"6J3aXp0hsPW6L8ECCn9/0e+BwnnP7FxaqGDj6T3F+n4h1nYe1+3BMP3y14egWFgwGA99GQe1N54F3mFKb/OW9g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1yk7mnqsc4n0cdjemjwrluynjrsxfvhwva0e5wx","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"jbVzBxLQL86ska7pTdwkjxDfpihy2WetORsvLeFe1LVAMtNGHPG8v1cAG5JYqjHrv5XgeMHR6SYzK9Uwa09BYA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1stdnnh8hp0w43xlgansgtd83kj5h57szmx3k8z","package":{"name":"raffle","path":"gno.land/r/kurtbomya/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc init() {\n\traffleCode := \"derBSscbMY\"\n\tRegisterCode(raffleCode)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ask4GBQ88igC4/9qw7iBLwMH0iIj5ljxZ0iFepprdTlB"},"signature":"Ey1xpUeZoKxl4QUJB4VTGvXwHMKwa9SVad82N/itwj01yEWQiav7yNPS7PvRkKSAdLaxlbeFaDXEM7IhbkKHIw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1stdnnh8hp0w43xlgansgtd83kj5h57szmx3k8z","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"mBMJy6eTHa8aeeXdg7uTkZS83YEwwHkLV8bLrS0KTOZJAGCyRRfqM+dgVnuBHZY8m3umVJrlFq+COAGGKEXmHg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1stdnnh8hp0w43xlgansgtd83kj5h57szmx3k8z","package":{"name":"raffle","path":"gno.land/r/kurtbomya/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc init() {\n\traffleCode := \"derBSscbMY\"\n\traffle.RegisterCode(raffleCode)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ask4GBQ88igC4/9qw7iBLwMH0iIj5ljxZ0iFepprdTlB"},"signature":"5OfVYTrnRW5K8SXfnSR7UH05GZ5HcjnFlmYyhsVwd4Ioe9KQ0bJV0P9btTqddNK3ru24qEBX+j9jFEiWVKgzIA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1stdnnh8hp0w43xlgansgtd83kj5h57szmx3k8z","package":{"name":"raffle","path":"gno.land/r/kurtbomya/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc init() {\n\t// raffleCode := \"derBSscbMY\"\n ghUsername := \"kurtbomya\"\n raffle.RegisterUsername(ghUsername)\n\t// raffle.RegisterCode(raffleCode)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ask4GBQ88igC4/9qw7iBLwMH0iIj5ljxZ0iFepprdTlB"},"signature":"+sCV97uUSPp3Htf0fE/bZN1LYp7aHbf8WL03qfPIfzYPMiVFBOSe6mCiCVjHR9JvDzJJYYLzI25GIrM/F8dvHA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1stdnnh8hp0w43xlgansgtd83kj5h57szmx3k8z","package":{"name":"raffleName","path":"gno.land/r/kurtbomya/raffleName","files":[{"name":"package.gno","body":"package raffle\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc init() {\n\t// raffleCode := \"derBSscbMY\"\n ghUsername := \"kurtbomya\"\n raffle.RegisterUsername(ghUsername)\n\t// raffle.RegisterCode(raffleCode)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ask4GBQ88igC4/9qw7iBLwMH0iIj5ljxZ0iFepprdTlB"},"signature":"mPXi9ZMdYWKn3Ojq2WlnQWKn4kEgi2I6i4pjkeqw8dIVrFbGLSPKV4x0a1ZlCFJqf5kwVLRPx9KFJgN7YIv6tg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1stdnnh8hp0w43xlgansgtd83kj5h57szmx3k8z","package":{"name":"rafflegithubname","path":"gno.land/r/kurtbomya/rafflegithubname","files":[{"name":"package.gno","body":"package raffle\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc init() {\n\t// raffleCode := \"derBSscbMY\"\n\tghUsername := \"kurtbomya\"\n\traffle.RegisterUsername(ghUsername)\n\t// raffle.RegisterCode(raffleCode)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ask4GBQ88igC4/9qw7iBLwMH0iIj5ljxZ0iFepprdTlB"},"signature":"Znvu1RI8Kqzf8OXqN+e4mFBYAgggJtL8K2yOOCC20d4lvhQzKcSGucmRT43+Vj+VwC//NUO0h8TD6KvdcJdHZQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1stdnnh8hp0w43xlgansgtd83kj5h57szmx3k8z","package":{"name":"raf","path":"gno.land/r/kurtbomya/raf","files":[{"name":"package.gno","body":"package raffle\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc init() {\n\t// raffleCode := \"derBSscbMY\"\n\tghUsername := \"kurtbomya\"\n\traffle.RegisterUsername(ghUsername)\n\t// raffle.RegisterCode(raffleCode)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ask4GBQ88igC4/9qw7iBLwMH0iIj5ljxZ0iFepprdTlB"},"signature":"Ji0U6ga8GwItuGWzjfXtKyh1nosv+mjFeJ1GM1TTamRAi3vriXBYzn7ccCNbTAWg1MA7suXD28fPiGwgplV9yg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1stdnnh8hp0w43xlgansgtd83kj5h57szmx3k8z","package":{"name":"raf","path":"gno.land/r/kurtbomya/raf","files":[{"name":"package.gno","body":"package raf\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc init() {\n\tghUsername := \"kurtbomya\"\n\traffle.RegisterUsername(ghUsername)\n\t// raffleCode := \"derBSscbMY\"\n\t// raffle.RegisterCode(raffleCode)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ask4GBQ88igC4/9qw7iBLwMH0iIj5ljxZ0iFepprdTlB"},"signature":"2rx3c3CvmnNvOXd7D8IisINLl4PWnV2TQzC299KYQxdC90fiAESxtCvmqzjDfQ2ZvtRecg+LApcByyDIXtnzsw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1l3gnytad72wxnxedwenq4jj559h4qjz3g302pt","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"TxUA0ch2Xsb9ODmDkTvs8yoT8Y0JzuOrU4/D9iY00m0ueMeZg9VwsRykxyNtbiIpnhTGpQOzRvMSnrHmURCPWw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g17v0m2m3tdxezfwt79sv0gkx0tyua4099dj5h9u","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ATpITN4ImJGMpvo/Ago38Q4jxIx44qz4JSfTwgpvNKg+KUIWx02M9ZDalXae3f1kAXP4MeOFfPKobiQH9wtClQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1fe8nsykt96cpcgfxkgq3997976xrnjthrxahp3","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"hp9942Iqb2fJHNmdctiIYmNZxFzJMzMcKS9ZP2KjFXQL7qfnIzx1IHFnku+xz+j9hXNbbdFhl8TZ8aKNYONpOA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g102yctcf88g04rh94huujngj2uy4gkcp2tksau6","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"h1W3+Zzg40+iYCf+WdIzGMJq7q8ZgpOAnQB2jJA5duNs1U3VR9jzzYmNmBMCWfPfUtEqJEMTWZ3rJKOaHYa+gQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1x6at82vhqzssgaggl02hma03usygpye25vx27h","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"iGeFTRkpmqCqxGoZ1gD5hGbQJNJNMsQzjkbjGSbQwR1kolTfqcA0MUthTsIWy39PXxnhWwVSFH2zhVx6Mue2EA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g17v0m2m3tdxezfwt79sv0gkx0tyua4099dj5h9u","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"IGurD5edDEx490t3Vjcf1X1jEQAhXdL+ohDexfuSCdxS6lzXP6pTJhy+FlGqdU6VmWC4oEUJqysFHRMSD1GkRg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g17v0m2m3tdxezfwt79sv0gkx0tyua4099dj5h9u","package":{"name":"raffle","path":"gno.land/r/gc24/ghostlandr/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc init() {\n\traffle.RegisterCode(\"Do4XRqAc1b\")\n}\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Aj7z1wC0xQ7PL8tKLvhyZF9Bz7nsmj1L3Lxg/ok5tKj2"},"signature":"ayMH30zrS80Lu++d1yiGawUdXdTaPecEwQit/hLqXetfYjD5cqSBcLkSY933mxfF/zpc1mGkzPgBRAbaucPnAg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1yk7mnqsc4n0cdjemjwrluynjrsxfvhwva0e5wx","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"DdXXfL9pHSt1j5NpTAAKRJ3tScjLUKl5G2R+OrTUI5JGjnO+h1uAesnRX4U/Yk92tT2AjfUf4E2Rf6AUI56M4w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1yk7mnqsc4n0cdjemjwrluynjrsxfvhwva0e5wx","package":{"name":"raffle","path":"gno.land/r/pnumbers/raffle","files":[{"name":"raffle.gno","body":"package raffle\n\nimport (\n\t\"fmt\"\n\tr \"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\tresult := r.RegisterCode(\"i3oXpvLuQU\")\n\tfmt.Printlin(result)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvV+tj2pqDh6qqBDBDDvq1iMwsknKDuImqONLNVaiUzp"},"signature":"1C4bWbZJhEbqdPEbMsGa/YF7Nh8v96bJUeA31DukgAcWo+oC9YDGsAFAhoGqkP2njAxoPZd4Yz9Rb1zn+QJ1fA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1yk7mnqsc4n0cdjemjwrluynjrsxfvhwva0e5wx","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"CbnQMbgdk3Telc2WXxAuztqV9CSfUehVs0eFgD91H+0prA516YIIau1z3VGm5n84C6S3HtdxOB42LYQKOz6msQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1yk7mnqsc4n0cdjemjwrluynjrsxfvhwva0e5wx","package":{"name":"raffle","path":"gno.land/r/pnumbers/raffle","files":[{"name":"raffle.gno","body":"package raffle\n\nimport (\n\tr \"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\tresult := r.RegisterCode(\"i3oXpvLuQU\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvV+tj2pqDh6qqBDBDDvq1iMwsknKDuImqONLNVaiUzp"},"signature":"1SX8K7NztIVuN1FBm9AzC/3B/2lhIlIhcjPlz14e4psXdIhYsQ02whddPpu84raVf+Re+wFOBwJ3B7sHHcJBRg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1yk7mnqsc4n0cdjemjwrluynjrsxfvhwva0e5wx","package":{"name":"raffle","path":"gno.land/r/pnumbers/raffle","files":[{"name":"raffle.gno","body":"package raffle\n\nimport (\n\tr \"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\tr.RegisterCode(\"i3oXpvLuQU\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvV+tj2pqDh6qqBDBDDvq1iMwsknKDuImqONLNVaiUzp"},"signature":"snsqp2B2Aour34hmtHN7BLuBfdVBDu4P5ZK+QRROIIQbKnmMu1QpVyzcxWiMMQ+UzXLo/sYwg0cLRPjtsVKnPg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1yk7mnqsc4n0cdjemjwrluynjrsxfvhwva0e5wx","package":{"name":"raffle","path":"gno.land/r/pnumbers/raffle","files":[{"name":"raffle.gno","body":"package raffle\n\nimport (\n\tr \"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\t// r.RegisterCode(\"i3oXpvLuQU\")\n r.RegisterUsername(\"pnumbers\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvV+tj2pqDh6qqBDBDDvq1iMwsknKDuImqONLNVaiUzp"},"signature":"0dchytlMOoKm6OwBpAJ3zIc7jgFcnWYA4NZdoovcL/ATHMhX1X47AGPzpZIKY8NAMs1mNzUg4nQO0iK1nZBZhA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1yk7mnqsc4n0cdjemjwrluynjrsxfvhwva0e5wx","package":{"name":"username","path":"gno.land/r/pnumbers/username","files":[{"name":"raffle.gno","body":"package username\n\nimport (\n\tr \"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\t// r.RegisterCode(\"i3oXpvLuQU\")\n\tr.RegisterUsername(\"pnumbers\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvV+tj2pqDh6qqBDBDDvq1iMwsknKDuImqONLNVaiUzp"},"signature":"ibiRrhBs1aNzeELMJTjtwpOCN/kRjmstLUk4lRPsp3sOSZlLFgzxYGdeCsL468K4uMu+wQoyshxjUzcackf7uA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g17v0m2m3tdxezfwt79sv0gkx0tyua4099dj5h9u","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0dFoDXp6v0Gu3PpaS4jHXtvgs6k3eKBp09XX/mxOvTVWPBHUGKK2K/7OTDSeX4fsGf5VjDTlHsTtGio0Am1t2w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g17v0m2m3tdxezfwt79sv0gkx0tyua4099dj5h9u","send":"","pkg_path":"gno.land/r/gc24/raffle","func":"RegisterUsername","args":["ghostlandr"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Aj7z1wC0xQ7PL8tKLvhyZF9Bz7nsmj1L3Lxg/ok5tKj2"},"signature":"snSCqLXT7FjlGzztu8yVApBU4sExtcjA3EBwo5mP1VQX8FmzO+yYQaCEyFv8O5rlsb+rMwHyd3/GoOU6KtGsgw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g102yctcf88g04rh94huujngj2uy4gkcp2tksau6","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qDGcqsbEOwG1Orl0i4IvRKwhyhI9xNTnNFXeJ8pywLpKDAkDuLrDcD/0ew4ATwauF4M2UP6Iml5LV9wEvGq5WA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g102yctcf88g04rh94huujngj2uy4gkcp2tksau6","package":{"name":"hello","path":"gno.land/r/harrisonju123/hello","files":[{"name":"package.gno","body":"package hello\n\nimport \"gno.land/r/gc24/raffle\"\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n\nfunc init() {\n\t_ = raffle.RegisterCode(\"4hWxNNMCFB\")\n\t_ = raffle.RegisterUsername(\"harrisonju123\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwxBLMoYBDMwDm7gPJlB0a6oxk21YUFBkSKH89DnBHX8"},"signature":"yq7VbbkM1v7n0ycz3c+zv+OL38UXOd/CCb3t5VkSHwl+VlqIAswlQz/VNJgxDmhEjVk1raeJV8QhwkqZZmSh0Q=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1fe8nsykt96cpcgfxkgq3997976xrnjthrxahp3","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5G7DNBxuTvvgMyKgw3bAzVw1+N0wHi8dukXk6saQtfRLQ4FfSYeVdz+R5PI2yuZnXZUZrMlGogdyRMIzOvu+9g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1fe8nsykt96cpcgfxkgq3997976xrnjthrxahp3","package":{"name":"raffle","path":"gno.land/r/gc24/bigzoo/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport (\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"math/rand\"\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/ownable\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\n// EntryData is the main struct that contains all data on raffle entries\ntype EntryData struct {\n\ttxorigin std.Address\n\tcaller std.Realm\n\traffleCode string\n\tcodeHash string\n\tghUsername string\n}\n\n// Top-level variables are automatically persisted to storage\nvar (\n\to *ownable.Ownable // admin of the raffle realm\n\tpartialEntries []*EntryData // keeps registered partialEntries\n\tcompleteEntries []*EntryData // keeps complete registrations: valid code + gh username\n\tcodeHashes []string // valid code hashes\n\tregisteredHashes map[string]struct{} // tracks if a code has been registered before\n\twinner1, winner2 *EntryData // storing raffle winners\n\tnumReg int\n\trandSource *rand.Rand\n)\n\n// Nothing to see here, just some constants, move on :)\nconst (\n\tcodeLength = 10\n\tamtOfCodes = 300\n)\n\n// Hello! This is where you register your raffle code!\n// Calling RegisterCode is the first step for entering the raffle.\n// It allows you to register a specific raffle code and connect your address to it.\n// RegisterCode only be called via other code; you should figure out a way to do it.\nfunc RegisterCode(code string) string {\n\tif code == \"\" \u0026\u0026 len(code) != codeLength {\n\t\tpanic(\"invalid code: \" + code)\n\t}\n\n\tcaller := std.PrevRealm() // save realm used to call\n\torigin := std.GetOrigCaller() // save deployer of realm\n\n\t// Deny non-code entries\n\tif caller.IsUser() {\n\t\tpanic(\"denied; can only be called from within code\")\n\t}\n\n\t// Get sha256 of code\n\thash := sha256.Sum256([]byte(code))\n\thashString := hex.EncodeToString(hash[:])\n\n\t// Check if code has already been registered\n\tif _, ok := registeredHashes[hashString]; ok {\n\t\tpanic(\"code already registered: \" + code)\n\t}\n\n\t// Check if the gopher has already registered another raffle code\n\tif originExists(origin) {\n\t\tpanic(\"you cannot register more than one code!\")\n\t}\n\n\t// Try to find the hash in the official hash list\n\tvar found bool\n\tfor _, ch := range codeHashes {\n\t\tif ch == hashString {\n\t\t\tfound = true\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif !found {\n\t\tpanic(\"specified code is not a valid raffle code: \" + code)\n\t}\n\n\tentry := \u0026EntryData{\n\t\ttxorigin: origin,\n\t\tcaller: caller,\n\t\traffleCode: code,\n\t\tcodeHash: hashString,\n\t\tghUsername: \"\",\n\t}\n\n\t// Save to hash tracker\n\tregisteredHashes[hashString] = struct{}{}\n\n\t// Save raffle entry\n\tpartialEntries = append(partialEntries, entry)\n\n\treturn ufmt.Sprintf(\"Successfully registered raffle code!\\n%s\\nRegister your username to complete your raffle entry.\", entry.String())\n}\n\n// Somewhat similar to Go, init() executes upon deployment of your code.\n// Hint: maybe you can use init() in your code to execute RegisterCode() upon deployment via play.gno.land?\nfunc init() {\n\t// Set admin address\n\to = ownable.NewWithAddress(\"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5\")\n\n\tpartialEntries = make([]*EntryData, 0)\n\tcompleteEntries = make([]*EntryData, 0)\n\tregisteredHashes = make(map[string]struct{})\n\tcodeHashes = make([]string, 300)\n\n\t_ = RegisterCode(\"EeoVgGAwDN\")\n}\n\n// RegisterUsername registers a GitHub username to an already existing entry\n// Hint: you can call this function just like you did with RegisterCode(), or via gno.studio/connect :)\n// If you use Connect, make sure you're on the Portal Loop network, and you've navigated to the correct path!\nfunc RegisterUsername(username string) string {\n\tif username == \"\" {\n\t\tpanic(\"invalid username: \" + username)\n\t}\n\n\torigin := std.GetOrigCaller()\n\n\tfor _, entry := range partialEntries {\n\t\tif entry.txorigin == origin { // this will check if you're using the same address as when registering the raffle code ;)\n\t\t\tif entry.ghUsername != \"\" {\n\t\t\t\tpanic(\"you cannot register your username twice!\")\n\t\t\t}\n\n\t\t\tentry.ghUsername = username\n\t\t\tcompleteEntries = append(completeEntries, entry)\n\t\t\tnumReg += 1\n\t\t\treturn ufmt.Sprintf(\"successfully registered %s for address %s\", username, entry.txorigin)\n\t\t}\n\t}\n\n\tpanic(\"could not find entry for caller address; did you register your raffle code yet?\")\n}\n\n// Admin stuff\n\nfunc PickWinner1() string {\n\to.AssertCallerIsOwner()\n\twinner1 = pickWinner()\n\n\treturn winner1.ghUsername\n}\n\nfunc PickWinner2() string {\n\to.AssertCallerIsOwner()\n\twinner2 = pickWinner()\n\n\treturn winner2.ghUsername\n}\n\nfunc UploadCodeHashes(delimCodes string) {\n\to.AssertCallerIsOwner()\n\n\ttokens := strings.Split(delimCodes, \",\")\n\n\tif len(tokens) != amtOfCodes {\n\t\tpanic(ufmt.Sprintf(\"invalid amount of codes; wanted %d got %d\", amtOfCodes, len(tokens)))\n\t}\n\n\tcopy(codeHashes, tokens)\n}\n\nfunc UploadRandomness(x, y uint64) {\n\to.AssertCallerIsOwner()\n\n\trandSource = rand.New(rand.NewPCG(x, y))\n}\n\n// Rendering\n\nfunc Render(_ string) string {\n\toutput := \"# Raffle - GopherCon US 2024\\n\\n\"\n\n\toutput += renderStats()\n\n\tif winner1 != nil || winner2 != nil {\n\t\toutput += renderWinners()\n\t}\n\n\toutput += RenderGuide()\n\n\treturn output\n}\n\nfunc renderStats() string {\n\toutput := \"\"\n\n\toutput += \"### Raffle Stats\\n\\n\"\n\n\toutput += `\u003cdiv class=\"columns-3\"\u003e`\n\n\toutput += `\u003cdiv class=\"column\"\u003e` // Latest codes\n\toutput += renderLatestCodesWidget(5)\n\toutput += `\u003c/div\u003e` // close Latest codes\n\n\toutput += `\u003cdiv class=\"column\"\u003e` // Latest usernames\n\toutput += renderLatestUsernamesWidget(5)\n\toutput += `\u003c/div\u003e` // close Latest usernames\n\n\toutput += `\u003cdiv class=\"column\"\u003e` // Chances\n\toutput += renderChances()\n\toutput += `\u003c/div\u003e` // close Chances\n\n\toutput += `\u003c/div\u003e` // close columns-3\n\n\toutput += \"\\n\\n\"\n\toutput += \"---\" // close section\n\n\toutput += \"\\n\"\n\n\treturn output\n}\n\nfunc renderChances() string {\n\toutput := \"\\n\\n#### Chances\\n\\n\"\n\n\toutput += ufmt.Sprintf(\"- Users in the raffle: %d\\n\\n\", numReg)\n\n\tif numReg \u003e 0 {\n\t\toutput += ufmt.Sprintf(\"- Chance of winning: 2:%d\\n\\n\", numReg)\n\t}\n\n\treturn output\n}\n\nfunc renderLatestCodesWidget(amt int) string {\n\toutput := \"\\n\\n#### Latest codes\\n\\n\"\n\tpeNum := len(partialEntries)\n\n\tif peNum == 0 {\n\t\toutput += \"No codes registered yet.\"\n\t\treturn output\n\t}\n\n\tif peNum \u003c amt {\n\t\tamt = peNum\n\t}\n\n\tfor i := peNum - 1; i \u003e= peNum-amt; i-- {\n\t\toutput += ufmt.Sprintf(\"- `%s`\\n\\n\", partialEntries[i].raffleCode)\n\t}\n\n\treturn output\n}\n\nfunc renderLatestUsernamesWidget(amt int) string {\n\toutput := \"\\n\\n#### Latest usernames\\n\\n\"\n\tceNum := len(completeEntries)\n\n\tif winner1 != nil || winner2 != nil {\n\t\toutput += \"Winners are chosen!\"\n\t\treturn output\n\t}\n\n\tif ceNum == 0 {\n\t\toutput += \"No usernames registered yet.\"\n\t\treturn output\n\t}\n\n\tif ceNum \u003c amt {\n\t\tamt = ceNum\n\t}\n\n\tfor i := ceNum - 1; i \u003e= ceNum-amt; i-- {\n\t\toutput += ufmt.Sprintf(\"- `%s`\\n\\n\", completeEntries[i].ghUsername)\n\t}\n\n\treturn output\n}\n\nfunc renderWinners() string {\n\toutput := \"\\n\\n# Winners\\n\\n\"\n\n\tif winner1 != nil {\n\t\toutput += ufmt.Sprintf(\"### Winner 1: `@%s`\\n\\n\", winner1.ghUsername)\n\t}\n\n\tif winner2 != nil {\n\t\toutput += ufmt.Sprintf(\"### Winner 2: `@%s`\\n\\n\", winner2.ghUsername)\n\t}\n\n\toutput += \"## Congratulations! Come to the booth and show us your GitHub account!\\n\\n\"\n\n\toutput += \"---\\n\\n\"\n\n\treturn output\n}\n\n// Helpers\n\nfunc (entry *EntryData) String() string {\n\treturn ufmt.Sprintf(\"Address: %s\\nRealm Path: %s\\nCode: %s\\nHash: %s\\nGitHub username: %s\\n\",\n\t\tentry.txorigin.String(),\n\t\tentry.caller.PkgPath(),\n\t\tentry.raffleCode,\n\t\tentry.codeHash,\n\t\tentry.ghUsername,\n\t)\n}\n\nfunc pickWinner() *EntryData {\n\tif len(completeEntries) == 0 {\n\t\tpanic(\"No complete entries yet!\")\n\t}\n\tif randSource == nil {\n\t\tpanic(\"No randomness source yet!\")\n\t}\n\n\tr := rand.New(randSource)\n\twinnerIndex := r.IntN(len(completeEntries))\n\twinner := completeEntries[winnerIndex]\n\n\t// remove winner from entry list\n\tcompleteEntries = append(completeEntries[:winnerIndex], completeEntries[winnerIndex+1:]...)\n\n\treturn winner\n}\n\nfunc CheckHashUpload() int {\n\treturn len(codeHashes)\n}\n\nfunc originExists(origin std.Address) bool {\n\tfor _, e := range partialEntries {\n\t\tif e.txorigin == origin {\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvTIaPjyRcaswGAfujbz3iueZ8Un3U6b5nKrhXCwpXfd"},"signature":"XLpD5g9LumnTMs34OWkroQVxVgo4QQZTyXAsBQqSneVyx3eIs/8EeW4NVWufAokoaFKqtl2fRP7UwaLVy3uHog=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1fe8nsykt96cpcgfxkgq3997976xrnjthrxahp3","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ZN7NAzXbuYXvwVZ04gVEqf+c2Xm/EvTyhuKa+XA8h+db4e4Vsb34yFa1cPi7FvYaT0J9VUu8meU/aNgcnLgstw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1fe8nsykt96cpcgfxkgq3997976xrnjthrxahp3","send":"","pkg_path":"gno.land/r/gc24/raffle","func":"RegisterCode","args":["EeoVgGAwDN"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvTIaPjyRcaswGAfujbz3iueZ8Un3U6b5nKrhXCwpXfd"},"signature":"AOI0EIlLF+cnmbtV+RlO3Vcg0pE1m5gvwhCi+pf+8CVb8WmlczVJvn2JvmpHk20DS/84KQNwaX1TdGQNfXhB8A=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1fe8nsykt96cpcgfxkgq3997976xrnjthrxahp3","package":{"name":"raffle","path":"gno.land/r/gc24/bigzoo/raffle","files":[{"name":"package.gno","body":"package raffle\n\nfunc init() {\n\n\t_ = RegisterCode(\"EeoVgGAwDN\")\n\t_ = RegisterUsername(\"bigzoo\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvTIaPjyRcaswGAfujbz3iueZ8Un3U6b5nKrhXCwpXfd"},"signature":"P1cLEM84IPGFG+XUAlWyMqsNGtV51nCs+N0ZOKtrRU9GImQ4q/dEVm8pklc44J9y34CAdbst1MSKmlx45CLu3g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1fe8nsykt96cpcgfxkgq3997976xrnjthrxahp3","package":{"name":"raffle","path":"gno.land/r/gc24/bigzoo/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\n// Somewhat similar to Go, init() executes upon deployment of your code.\n// Hint: maybe you can use init() in your code to execute RegisterCode() upon deployment via play.gno.land?\nfunc init() {\n\t// Set admin address\n\to = ownable.NewWithAddress(\"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5\")\n\n\tpartialEntries = make([]*EntryData, 0)\n\tcompleteEntries = make([]*EntryData, 0)\n\tregisteredHashes = make(map[string]struct{})\n\tcodeHashes = make([]string, 300)\n\n\t_ = raffle.RegisterCode(\"EeoVgGAwDN\")\n\t_ = raffle.RegisterUsername(\"bigzoo\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvTIaPjyRcaswGAfujbz3iueZ8Un3U6b5nKrhXCwpXfd"},"signature":"dEnq8ANwfMjL7M8c6+UTEc4utuKP2cZhLCF3ZmAcd6Yb2d7ussHUfLnA7CQH+3WysbidzyC3aO6j9GzBf0oz4Q=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1fe8nsykt96cpcgfxkgq3997976xrnjthrxahp3","package":{"name":"raffle","path":"gno.land/r/gc24/bigzoo/raffle","files":[{"name":"package.gno","body":"package raffle\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\n// Somewhat similar to Go, init() executes upon deployment of your code.\n// Hint: maybe you can use init() in your code to execute RegisterCode() upon deployment via play.gno.land?\nfunc init() {\n\t// Set admin address\n\n\t_ = raffle.RegisterCode(\"EeoVgGAwDN\")\n\t_ = raffle.RegisterUsername(\"bigzoo\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvTIaPjyRcaswGAfujbz3iueZ8Un3U6b5nKrhXCwpXfd"},"signature":"iIQfGQOURQ1C1E5btdkqUnYl0rI3MxQ6LOrouf4pemBnsIFfT5i9Es08iw+fQOnIeGWCtCkrvGJUQkzcIPjxYw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1fe8nsykt96cpcgfxkgq3997976xrnjthrxahp3","send":"","pkg_path":"gno.land/r/gc24/raffle","func":"PickWinner1","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvTIaPjyRcaswGAfujbz3iueZ8Un3U6b5nKrhXCwpXfd"},"signature":"e2r707hne1WuLZvLIU9iB/k1Daqlmbt4Sy+//y9VvaRrAdOehObi+80nrIfbMDrec6/wNQxEL1nNHd8B4zVEuA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1kgsrnpjurv6a5uw55s08a6ujcxx3sekn59nfd6","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"Heq7SpSbaC4gqW/DA2pF9zlBRhknGK3bA6eb5N2mJRNJn+8D97h2XljaRGTL+OHG7nLRJeO2+9a0Wzy9mfhraA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1fe8nsykt96cpcgfxkgq3997976xrnjthrxahp3","send":"","pkg_path":"gno.land/r/gc24/raffle","func":"CheckHashUpload","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvTIaPjyRcaswGAfujbz3iueZ8Un3U6b5nKrhXCwpXfd"},"signature":"OLlRccWaUkk/VKHjjy1sT2+qELbVyyY6kXLno2XEGqN+kkewFXBg7BY+uYEBgJamgbKiOKb6pmBbACwI0uot9Q=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1kgsrnpjurv6a5uw55s08a6ujcxx3sekn59nfd6","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"WwXunBD6VQS3i0XMJg4LRW8t25tmhen7pbhxDF5YUtJ+LJbHOhfB/QuCt5BVe/+XC6QZvY4SEWFtxveucxYVNw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1kgsrnpjurv6a5uw55s08a6ujcxx3sekn59nfd6","package":{"name":"maini","path":"gno.land/r/doniacld/maini","files":[{"name":"package.gno","body":"package maini\n\nimport (\n\t\"gno.land/r/gc24/raffle\"\n)\n\nfunc init() {\n\n\trc := raffle.RegisterCode(\"ESSTiVMoWb\")\n\tprintln(rc)\n\tru := raffle.RegisterUsername(\"doniacld\")\n\tprintln(ru)\n\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ArwL7HVWhSQd0m1Vh4hQRcXmJUKb5lAtRqWgSzmFu7OJ"},"signature":"4SNpWgulCeB5XjB8goIjFGER8KUgNm55HKXukplqp54oBUTtli/Db40r3fXJbN+wlvSEwjNd7zt+fROgeSMY0w=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g14k8ysayj07naw57svffsw022yhcg5d6ytcsaun","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"yYAam2mHKMgMp3oe+kLtszJD29ia09LmoUKxh4iCVg4ujNi3BVEaKtcEfPC4FUDt7ZWrSmoe2qCa6WcWemQvcA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1x6at82vhqzssgaggl02hma03usygpye25vx27h","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"2PINGapSudJBMk+LJ30gYqQS8QTEHwXUV1fUnj2yQ+lvQpRPqN408KmdH6NhfYyvp2yEbKFghCPKKFnkdHuHuQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1x6at82vhqzssgaggl02hma03usygpye25vx27h","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rLJONmEHq3agtb15Wf6v8Gf3k1UL2zcW8Buax1u+pr9OOLwKWjV4n7X52YW/xv/UgXCggRuobCXSK9bRqpI2WA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g14k8ysayj07naw57svffsw022yhcg5d6ytcsaun","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ikRMvsBFBk4q81XTvEW8DJNIG4hjeWefNwymz9CDbmRSvpqfepVZC6xbHRnb+7lVkOB9KF2WglFFiRGSRVF9Lg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gc24/raffle","func":"UploadRandomness","args":["42069","37133500"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"jdPuFqvkmXV8sFB2JFPzqpZvBmjWDnadrOKziH1pbjIdBPJfOL9a/Y1GK3Baw2GsYdbmok+zTBwFnvBO6WKbBQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gc24/raffle","func":"PickWinner1","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"mBBPpUxk3qXArQaRxuohuWVaCOWPesxs8OVDlqiQBsNrOlu0SbJAdIgyQy7QRWLwOGTHr48ttZ5OxzXeXIRkwA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gc24/raffle","func":"PickWinner2","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"7DY5YXtD/f8eXMtRiea3/mgtc1ZjAlfBSbj+ye/XsfNiEWV2Xa2Sz5nuYAem/WzpueWuqLkN1JxX00rZ5/ok1w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/boards","func":"CreateReply","args":["1","1","1","hello1"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"/FodHq/2BfdLatGH3wdGv8AcGgr8j3oml5SkgZ7OYWZJ6DAsaUlwrP/3XPSMQbxw9Zj5TARaEaNhqksldtpcfg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/boards","func":"CreateReply","args":["1","1","1","hello2"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"3zkK4IwHtgRI+TDsrgGGfLd4JfcVGLkA+g+K/coaEoEe+jl2S/sITusaxpJ8L9JdUkmHsyfpXZpaPqejGDjbtA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/boards","func":"CreateReply","args":["1","1","1","hello2"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"+ehOpuAVacMdle6jByJv34vsgrm7GcMjarCZFek4IhUGcoj2nJ3E0pgJFO7j1VWjvKWNkwXh1rAQr4pxqDf0rg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"NY1TXRBVvgbmIKlwO1cqOfNPTk5mxgRW8IzEYck9JoAWUG5mixWkfNS1dBiqYxntWmC6UlnmRUUJmNLwtM6Lpw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"hello","path":"gno.land/r/demo/hello","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n return \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"AZL30T1l45ORawX+T4CMghC/RrZs7KFIozQUhomEZOl+4mHBEy8kCMcgEGgUg8RtkhF0gMVU7Q217s67x/dU1w=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"hello","path":"gno.land/r/devx/hello","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"Hqn/bjIIw27XfRTXVw7iPbPn4uzmVkbNYjYvpqyKu3YrGdaPD5Mb0ydl7w9c7dURoLR+KU9KJhWgh+BeGEhqgA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"hello","path":"gno.land/r/devx5/hello","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"m55yvhZgjMKkbk4Qi9rTPsUTA+f3IT9ZRg89YheZ949VqcA8m9ySNKRW5vNgXZ/EPm9Z5njeJOaIefnROmBzPg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1qgdjh6zvzzc8gv3fzk0mu9mezh6gan9hdpx04h","package":{"name":"hello","path":"gno.land/r/devx6/hello","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Aot/mJ0oCntmapKEuALkD2XhPqwyJpKR31eHhrZW1csf"},"signature":"8cbjDNTwYHz5RmhbZT0C8637Zmf5B71nibzpivyPCwNPzzxeDYFqySCqcbluQwTp3G2Yp3+36KS99E1ORELqYQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"hello","path":"gno.land/r/devx7/hello","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"Hq7QCAUUELtBTAjmhCLO3eSO9mpsG+IxOA+slU1hcotqa7cbPtb2OYi7pgkLblWgpF+zlU1pp9+lXx+S8olFKQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","package":{"name":"hello","path":"gno.land/r/michelle/hello","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"LaNS/sneOx80KmeiD0YkMmN7QFcLhuNtaXLwkQNLwndb7YoMmkq55BQ/KKhqYrZAA1AvvCZ1mdejXsU3BNxfJw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1lmvrrrr4er2us84h2732sru76c9zl2nvknha8c","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"RhPL4nRndCvuKa3QlhhKu5NVndDJw2wqe63Dp11wa34SB6b8DVr+C2rwdx5xtE9lUXgMgJo1W3g8VUvccNoegw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1626wwzfe7psdz6ke9vc8qltcdkfev7h4mwm0k0","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"LeTkNGEdEoDGTkKxG0h53mlIbGZbaiPmbwVSFlxSU8FBhQfLZYYL+aDKlc3LWLMaKoR0J48//sGapS0Fs2RKjA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1at2h7kdhz2m9lv6azn54mwu4wl95k94wu90uwj","send":"","pkg_path":"gno.land/r/demo/teritori/social_feeds","func":"CreatePost","args":["1","0","2","{\"message\":\"test\",\"files\":[],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"\",\"createdAt\":\"2024-07-11T18:12:48.951Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjY1KRI2dUlqXcYaaYr8Q9EUbIcbllZuk16mkqXwXfRD"},"signature":"5Q5kPFsPISMY6BzCABDnq3GTpRUuttNWz3Zq2/Wh6HkzXoHHtpzC2dbe/GZd9bjs9bc3lCw67N6yT2Eh0nFrRg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1hymmy4vm9vtwruvkvq6ac2nfpnzyzz9jr84k9t","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Oo5uawH1FWQR9TAsQIa8k866kWp1ny7AlmZ4a99InKNGi5vWquJcIHsrn+/SWUka5SHqAVXuqAKqZYF2sCK3UQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g14thyrmh62vqqnwgpa6lsk4wue0lj0qd8sqzdex","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"jlYQsTlvgHj0ur157SGIskG25Ho5FvrFArmvemdbbDgi8msGuSY2YZD/7wJQrgUYkWqmEpZV9uPh7tCCq2pdWg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g18amm3fc00t43dcxsys6udug0czyvqt9e7p23rd","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"/NFEkrHcxk0j9SrGmCdOldNdg+xXAnpH4w+yI3FLkjM9TMP9bY4IHbfE6YmVbh4HqugmC2zzU7FvTWUdcLvjRA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g16papy2npq78kdqky8py04wven3ex8qrvyfprjf","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OivaNfmgQLK6Oulpkje9+UTi20FhSazkkzZ4csXQpc0jcFdkA85ZIHUDIV+gusqahF0bQf8+RQhPsQTNVkf3cg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16papy2npq78kdqky8py04wven3ex8qrvyfprjf","package":{"name":"guessbook","path":"gno.land/r/nebular24/guessbook","files":[{"name":"README.md","body":"## 04_GnoLand - Publish Your Realm on Gno.Land\n\n`Gno.Land` is the platform where you can upload your contract and make it available to the world, on-chain. When publishing on `Gno.Land`, there is no rollback or hot reload. Your contract will remain there permanently, so be cautious when choosing the package path to publish your realm.\n\n### Faucet Hub\n\nUnlike `gnodev`, you don't have any tokens to interact with the chain (yet). Let's get some for your key on the `Faucet Hub`.\n\n1. Go to https://faucet.gno.land and select `Portal Loop`.\n2. Enter the wallet address you created in the previous section (use `gnokey list` to retrieve the key address).\n3. Select the faucet amount and click on `Request Drip`.\n\nYour address should now have received some tokens!\n\nYou can verify your current balance by running:\n```bash\n$ gnokey query --remote https://rpc.gno.land bank/balances/\u003cwallet_address\u003e\n```\n\u003e wallet address should be in the form `g1xxxx...`\n\nThis command should display the current amount of `ugnot` you possess in your wallet.\n\n### Publish\n\nNow, it's time to upload your first package. We'll upload the package inside `04_gnoland`.\n\n1. Choose a package path name. It's recommended to use your address as the namespace for your contract:\n * Example: `gno.land/r/g1hr3dl82edy84a5f3dmchh0due7zgwm5rnns6na/myrealm`\n2. Run the following command to publish the package on `gno.land`:\n```bash\n$ gnokey maketx addpkg \"\u003cMY_KEY_NAME\u003e\" \\\n -pkgpath \"\u003cPKG_PATH_NAME\u003e\" \\\n -pkgdir \"\u003cLOCAL_PKG_DIR\u003e\" \\\n -deposit 1000000ugnot \\\n -gas-fee 100000ugnot \\\n -gas-wanted 1000000 \\\n -broadcast \\\n -chainid portal-loop \\\n -remote https://rpc.gno.land\n\n# * `MY_KEY_NAME`: the name of your key used in the gnokey section; use `gnokey list` to retrieve it.\n# * `LOCAL_PKG_DIR`: the local directory containing the realm (package) you want to publish.\n# * `PKG_PATH_NAME`: the package path name you chose in step 1.\n# * You will be prompted for your key password.\n```\n3. Visit your realm on `gno.land` using the package path you chose in step 1.\n * Example: `https://gno.land/r/g1hr3dl82edy84a5f3dmchh0due7zgwm5rnns6na/myrealm`\n\n### BONUS: Gno Bro\n\nThere are many ways to explore realms. Try running:\n```bash\n$ ssh bro.gno.cool\n```\n\nThis will bring you to a terminal-based version of `gno.land`, where you can fetch the previously published realm by typing its path. Enjoy the magic!"},{"name":"guess_book.gno","body":"package guessbook\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"gno.land/p/demo/avl\"\n)\n\ntype Message struct {\n\tContent string\n\tAuthor string\n\tDate time.Time\n}\n\nvar (\n\tmessages []Message\n\tusers avl.Tree // std.Address -\u003e true\n)\n\nfunc AddMessage(message string) {\n\tstd.AssertOriginCall()\n\n\tcaller := std.GetOrigCaller().String()\n\n\tif _, ok := users.Get(caller); ok {\n\t\tpanic(\"caller have alreay register a message\")\n\t}\n\n\tusers.Set(caller, true)\n\tmessages = append(messages, Message{\n\t\tAuthor: caller,\n\t\tContent: message,\n\t\tDate: time.Now(),\n\t})\n}\n\nfunc renderMessages(msgs []Message) string {\n\tvar str strings.Builder\n\n\tfor i, msg := range msgs {\n\t\tif i \u003e 0 {\n\t\t\tstr.WriteString(\"---\")\n\t\t}\n\n\t\tstr.WriteString(renderMessage(msg))\n\t\tstr.WriteRune('\\n')\n\t}\n\n\treturn str.String()\n}\n\nfunc renderMessage(msg Message) string {\n\tvar str strings.Builder\n\n\tstr.WriteRune('\\n')\n\tstr.WriteString(\"#### Writen By \" + msg.Author +\n\t\t\" on \" + msg.Date.Format(\"02 Jan 2006\"))\n\tstr.WriteRune('\\n')\n\tstr.WriteString(msg.Content)\n\tstr.WriteRune('\\n')\n\n\treturn str.String()\n}\n\nfunc Render(path string) string {\n\tconst messagePerPage = 5\n\n\tif len(messages) == 0 {\n\t\treturn \"no messages yet :(\"\n\t}\n\n\tpage := 0\n\tif path != \"\" {\n\t\tvar err error\n\t\tpage, err = strconv.Atoi(path)\n\t\tif err != nil {\n\t\t\tpanic(\"unable get page number from path\")\n\t\t}\n\n\t\tif page \u003c 1 || (page*messagePerPage) \u003e len(messages) {\n\t\t\tpanic(\"invalid page number\")\n\t\t}\n\n\t\tpage--\n\t}\n\n\tstartpage := page * messagePerPage\n\tendPage := min(startpage+messagePerPage, len(messages))\n\tmshow := messages[startpage:endPage]\n\n\tvar view strings.Builder\n\tview.WriteString(renderMessages(mshow))\n\tview.WriteRune('\\n')\n\tview.WriteString(\"---\")\n\tview.WriteRune('\\n')\n\n\treturn view.String()\n}\n\nfunc min(a, b int) int {\n\tif a \u003c b {\n\t\treturn a\n\t}\n\n\treturn b\n}\n"}]},"deposit":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"100000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A2tbRD6mHLEgPvQOnmOcGjYrNKc01GYFDRlOvYZ3MzLk"},"signature":"NDGBbsuvz1LW9D2W2c6xJlbN3wO9K4nbQ8eG/bhxVLl5872cHX+bW9vb6nCCyN8yH+mtkCHTWBGKuGd5oLmbBQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16papy2npq78kdqky8py04wven3ex8qrvyfprjf","package":{"name":"guessbook","path":"gno.land/r/nebular24/guessbook","files":[{"name":"README.md","body":"## 04_GnoLand - Publish Your Realm on Gno.Land\n\n`Gno.Land` is the platform where you can upload your contract and make it available to the world, on-chain. When publishing on `Gno.Land`, there is no rollback or hot reload. Your contract will remain there permanently, so be cautious when choosing the package path to publish your realm.\n\n### Faucet Hub\n\nUnlike `gnodev`, you don't have any tokens to interact with the chain (yet). Let's get some for your key on the `Faucet Hub`.\n\n1. Go to https://faucet.gno.land and select `Portal Loop`.\n2. Enter the wallet address you created in the previous section (use `gnokey list` to retrieve the key address).\n3. Select the faucet amount and click on `Request Drip`.\n\nYour address should now have received some tokens!\n\nYou can verify your current balance by running:\n```bash\n$ gnokey query --remote https://rpc.gno.land bank/balances/\u003cwallet_address\u003e\n```\n\u003e wallet address should be in the form `g1xxxx...`\n\nThis command should display the current amount of `ugnot` you possess in your wallet.\n\n### Publish\n\nNow, it's time to upload your first package. We'll upload the package inside `04_gnoland`.\n\n1. Choose a package path name. It's recommended to use your address as the namespace for your contract:\n * Example: `gno.land/r/g1hr3dl82edy84a5f3dmchh0due7zgwm5rnns6na/myrealm`\n2. Run the following command to publish the package on `gno.land`:\n```bash\n$ gnokey maketx addpkg \"\u003cMY_KEY_NAME\u003e\" \\\n -pkgpath \"\u003cPKG_PATH_NAME\u003e\" \\\n -pkgdir \"\u003cLOCAL_PKG_DIR\u003e\" \\\n -deposit 1000000ugnot \\\n -gas-fee 100000ugnot \\\n -gas-wanted 1000000 \\\n -broadcast \\\n -chainid portal-loop \\\n -remote https://rpc.gno.land\n\n# * `MY_KEY_NAME`: the name of your key used in the gnokey section; use `gnokey list` to retrieve it.\n# * `LOCAL_PKG_DIR`: the local directory containing the realm (package) you want to publish.\n# * `PKG_PATH_NAME`: the package path name you chose in step 1.\n# * You will be prompted for your key password.\n```\n3. Visit your realm on `gno.land` using the package path you chose in step 1.\n * Example: `https://gno.land/r/g1hr3dl82edy84a5f3dmchh0due7zgwm5rnns6na/myrealm`\n\n### BONUS: Gno Bro\n\nThere are many ways to explore realms. Try running:\n```bash\n$ ssh bro.gno.cool\n```\n\nThis will bring you to a terminal-based version of `gno.land`, where you can fetch the previously published realm by typing its path. Enjoy the magic!"},{"name":"guess_book.gno","body":"package guessbook\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"gno.land/p/demo/avl\"\n)\n\ntype Message struct {\n\tContent string\n\tAuthor string\n\tDate time.Time\n}\n\nvar (\n\tmessages []Message\n\tusers avl.Tree // std.Address -\u003e true\n)\n\nfunc AddMessage(message string) {\n\tstd.AssertOriginCall()\n\n\tcaller := std.GetOrigCaller().String()\n\n\tif _, ok := users.Get(caller); ok {\n\t\tpanic(\"caller have alreay register a message\")\n\t}\n\n\tusers.Set(caller, true)\n\tmessages = append(messages, Message{\n\t\tAuthor: caller,\n\t\tContent: message,\n\t\tDate: time.Now(),\n\t})\n}\n\nfunc renderMessages(msgs []Message) string {\n\tvar str strings.Builder\n\n\tfor i, msg := range msgs {\n\t\tif i \u003e 0 {\n\t\t\tstr.WriteString(\"---\")\n\t\t}\n\n\t\tstr.WriteString(renderMessage(msg))\n\t\tstr.WriteRune('\\n')\n\t}\n\n\treturn str.String()\n}\n\nfunc renderMessage(msg Message) string {\n\tvar str strings.Builder\n\n\tstr.WriteRune('\\n')\n\tstr.WriteString(\"#### Writen By \" + msg.Author +\n\t\t\" on \" + msg.Date.Format(\"02 Jan 2006\"))\n\tstr.WriteRune('\\n')\n\tstr.WriteString(msg.Content)\n\tstr.WriteRune('\\n')\n\n\treturn str.String()\n}\n\nfunc Render(path string) string {\n\tconst messagePerPage = 5\n\n\tif len(messages) == 0 {\n\t\treturn \"no messages yet :(\"\n\t}\n\n\tpage := 0\n\tif path != \"\" {\n\t\tvar err error\n\t\tpage, err = strconv.Atoi(path)\n\t\tif err != nil {\n\t\t\tpanic(\"unable get page number from path\")\n\t\t}\n\n\t\tif page \u003c 1 || (page*messagePerPage) \u003e len(messages) {\n\t\t\tpanic(\"invalid page number\")\n\t\t}\n\n\t\tpage--\n\t}\n\n\tstartpage := page * messagePerPage\n\tendPage := min(startpage+messagePerPage, len(messages))\n\tmshow := messages[startpage:endPage]\n\n\tvar view strings.Builder\n\tview.WriteString(renderMessages(mshow))\n\tview.WriteRune('\\n')\n\tview.WriteString(\"---\")\n\tview.WriteRune('\\n')\n\n\treturn view.String()\n}\n\nfunc min(a, b int) int {\n\tif a \u003c b {\n\t\treturn a\n\t}\n\n\treturn b\n}\n"}]},"deposit":"100000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"100000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A2tbRD6mHLEgPvQOnmOcGjYrNKc01GYFDRlOvYZ3MzLk"},"signature":"k6QFfeAOxEmcTwhD9ysttAHv+zrXtOCOxwx6so4YvgIkeAjymjHtYeSm9EViZR+8N3e/Li5FCOrLAKL/qG3Ofw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16papy2npq78kdqky8py04wven3ex8qrvyfprjf","package":{"name":"guessbook","path":"gno.land/r/nebular24/guessbook","files":[{"name":"README.md","body":"## 04_GnoLand - Publish Your Realm on Gno.Land\n\n`Gno.Land` is the platform where you can upload your contract and make it available to the world, on-chain. When publishing on `Gno.Land`, there is no rollback or hot reload. Your contract will remain there permanently, so be cautious when choosing the package path to publish your realm.\n\n### Faucet Hub\n\nUnlike `gnodev`, you don't have any tokens to interact with the chain (yet). Let's get some for your key on the `Faucet Hub`.\n\n1. Go to https://faucet.gno.land and select `Portal Loop`.\n2. Enter the wallet address you created in the previous section (use `gnokey list` to retrieve the key address).\n3. Select the faucet amount and click on `Request Drip`.\n\nYour address should now have received some tokens!\n\nYou can verify your current balance by running:\n```bash\n$ gnokey query --remote https://rpc.gno.land bank/balances/\u003cwallet_address\u003e\n```\n\u003e wallet address should be in the form `g1xxxx...`\n\nThis command should display the current amount of `ugnot` you possess in your wallet.\n\n### Publish\n\nNow, it's time to upload your first package. We'll upload the package inside `04_gnoland`.\n\n1. Choose a package path name. It's recommended to use your address as the namespace for your contract:\n * Example: `gno.land/r/g1hr3dl82edy84a5f3dmchh0due7zgwm5rnns6na/myrealm`\n2. Run the following command to publish the package on `gno.land`:\n```bash\n$ gnokey maketx addpkg \"\u003cMY_KEY_NAME\u003e\" \\\n -pkgpath \"\u003cPKG_PATH_NAME\u003e\" \\\n -pkgdir \"\u003cLOCAL_PKG_DIR\u003e\" \\\n -deposit 1000000ugnot \\\n -gas-fee 100000ugnot \\\n -gas-wanted 1000000 \\\n -broadcast \\\n -chainid portal-loop \\\n -remote https://rpc.gno.land\n\n# * `MY_KEY_NAME`: the name of your key used in the gnokey section; use `gnokey list` to retrieve it.\n# * `LOCAL_PKG_DIR`: the local directory containing the realm (package) you want to publish.\n# * `PKG_PATH_NAME`: the package path name you chose in step 1.\n# * You will be prompted for your key password.\n```\n3. Visit your realm on `gno.land` using the package path you chose in step 1.\n * Example: `https://gno.land/r/g1hr3dl82edy84a5f3dmchh0due7zgwm5rnns6na/myrealm`\n\n### BONUS: Gno Bro\n\nThere are many ways to explore realms. Try running:\n```bash\n$ ssh bro.gno.cool\n```\n\nThis will bring you to a terminal-based version of `gno.land`, where you can fetch the previously published realm by typing its path. Enjoy the magic!"},{"name":"guess_book.gno","body":"package guessbook\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"gno.land/p/demo/avl\"\n)\n\ntype Message struct {\n\tContent string\n\tAuthor string\n\tDate time.Time\n}\n\nvar (\n\tmessages []Message\n\tusers avl.Tree // std.Address -\u003e true\n)\n\nfunc AddMessage(message string) {\n\tstd.AssertOriginCall()\n\n\tcaller := std.GetOrigCaller().String()\n\n\tif _, ok := users.Get(caller); ok {\n\t\tpanic(\"caller have alreay register a message\")\n\t}\n\n\tusers.Set(caller, true)\n\tmessages = append(messages, Message{\n\t\tAuthor: caller,\n\t\tContent: message,\n\t\tDate: time.Now(),\n\t})\n}\n\nfunc renderMessages(msgs []Message) string {\n\tvar str strings.Builder\n\n\tfor i, msg := range msgs {\n\t\tif i \u003e 0 {\n\t\t\tstr.WriteString(\"---\")\n\t\t}\n\n\t\tstr.WriteString(renderMessage(msg))\n\t\tstr.WriteRune('\\n')\n\t}\n\n\treturn str.String()\n}\n\nfunc renderMessage(msg Message) string {\n\tvar str strings.Builder\n\n\tstr.WriteRune('\\n')\n\tstr.WriteString(\"#### Writen By \" + msg.Author +\n\t\t\" on \" + msg.Date.Format(\"02 Jan 2006\"))\n\tstr.WriteRune('\\n')\n\tstr.WriteString(msg.Content)\n\tstr.WriteRune('\\n')\n\n\treturn str.String()\n}\n\nfunc Render(path string) string {\n\tconst messagePerPage = 5\n\n\tif len(messages) == 0 {\n\t\treturn \"no messages yet :(\"\n\t}\n\n\tpage := 0\n\tif path != \"\" {\n\t\tvar err error\n\t\tpage, err = strconv.Atoi(path)\n\t\tif err != nil {\n\t\t\tpanic(\"unable get page number from path\")\n\t\t}\n\n\t\tif page \u003c 1 || (page*messagePerPage) \u003e len(messages) {\n\t\t\tpanic(\"invalid page number\")\n\t\t}\n\n\t\tpage--\n\t}\n\n\tstartpage := page * messagePerPage\n\tendPage := min(startpage+messagePerPage, len(messages))\n\tmshow := messages[startpage:endPage]\n\n\tvar view strings.Builder\n\tview.WriteString(renderMessages(mshow))\n\tview.WriteRune('\\n')\n\tview.WriteString(\"---\")\n\tview.WriteRune('\\n')\n\n\treturn view.String()\n}\n\nfunc min(a, b int) int {\n\tif a \u003c b {\n\t\treturn a\n\t}\n\n\treturn b\n}\n"}]},"deposit":"100000ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"100000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A2tbRD6mHLEgPvQOnmOcGjYrNKc01GYFDRlOvYZ3MzLk"},"signature":"ftsD7CuzzBjhobkHOejlbGganJlD+kCXaMMasfmVGsdBw1zZAEot/ptuotmGkM1mUXBQJwt9rBEVLUwIetMRvg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g16papy2npq78kdqky8py04wven3ex8qrvyfprjf","send":"","pkg_path":"gno.land/r/nebular24/guessbook","func":"AddMessage","args":["hello nebular"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A2tbRD6mHLEgPvQOnmOcGjYrNKc01GYFDRlOvYZ3MzLk"},"signature":"3AAXGrknzZVL2+E8lBGZWixw9Kvs0ISnDCxtASbYh14jUBBbJXsuh6LipnrQjYvtrPSam+8/q/66x80h51nVQw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g13qpel38unrma0nyrj29tr903pq7dpeecsmlu8z","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"uVhbq7zjLl+/AjHaHIL2S8g54vJqXL0fHn7IyNHxcQgiKTGF6Gcxs7kqlWahWH0l7xnEJ6VHtwJFDzyoeJt6Fg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1kpptltmd8jmwq5et5udh3ld8qq4ksqm9kj0vs4","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"G/vibORa1i2e3zlheqmceV2Z1fT/JDkSPltcjfwSFSJ5ya6dNKc0qBsuqxMNah1xFPsvZF1g3dpl1yD//Yo03Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1kpptltmd8jmwq5et5udh3ld8qq4ksqm9kj0vs4","to_address":"g1lmvrrrr4er2us84h2732sru76c9zl2nvknha8c","amount":"5000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4GJRb8y0ZvhQ839glrHWmkjazoTOgl611Ns84+4R/Qc"},"signature":"iyODkXl3Tsg0lGfT9ckUMlzoylPJNxtZOvD2xA7/iZ4s53wpRYJGCyHvV//BJNt0Ab75ueVsZmOjZhKemIyZKQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1n5hjafzvxtqpf8qtcnaftj8g52hntcr23nxfg0","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"mNs4FJYuutpEvLOSBIFlgVnzaoPhV2tvJF69sgzkK24aDG28oSSOyd0dxCDdKvSCgnCVVlnAgFkD8ELojyKWkg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1w62226g8hykfmtuasvz80rdf0jl6phgxsphh5v","send":"","pkg_path":"gno.land/r/demo/grc20factory","func":"NewWithAdmin","args":["test","TEST1","4","1000000000","0","g1w62226g8hykfmtuasvz80rdf0jl6phgxsphh5v"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7vZMLF9pSIjhABisQL393WTB0WnLBRO3Wg9gctmr60u"},"signature":"qXveV76XZfv2b9qx1LGHOkxelUmSMoGq2KYBEsb5yRAApHSOBdh/RIZDKxH+48Xobmw8XQFRqXnxRu5ExReRKw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1kw6jg3yjsvgycverrmyn7k6mldnu6e3pe42n6q","to_address":"g1mrzsuacrqjwkq3yvfw58r2fz2v9w58ewythaqp","amount":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7IMN9aUO6numX9E1NH67IEp7zMBvGhxJ+T2UBwWMRCO"},"signature":"YbnmlPrHA6q1PjOe10f12OpTBg2DZ47zBs6Hy35t6WUY03Dbj2NhD2bpXwJjNKc/ajT6und99E7zSNdDmynWjA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1lmvrrrr4er2us84h2732sru76c9zl2nvknha8c","to_address":"g1kpptltmd8jmwq5et5udh3ld8qq4ksqm9kj0vs4","amount":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AoTh14aoDz7iGb+UgHIlC5BuwrTQhiClW4UClIZSxdix"},"signature":"Xbxxt/ykUFD90XeawSNmQNo8rvoX3cuzjEs4Vf/QLfR5Js6a5aCFZ+YtOFCZ+6mYzxDUr2j+7ZSav5p0uPwpAQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g13qpel38unrma0nyrj29tr903pq7dpeecsmlu8z","to_address":"g1ercya5m86hqwmzzc97zaj3wz3ymnfdunjtxg4t","amount":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7HxlAX2DyCuLEaoq+Ru7GKb+u6LqdUhclakS27Jnmwd"},"signature":"AMG8PPDzeF2HdmUzO3ULd1PynVMrjBZrRh/z+bg/D5waZ9dx/H6zoHXUYz/J746NIsWeBsLG3hkChA2V/rAwhA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","amount":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"Vd7CdAEHW63eMsXM/f1lnTMN6CKIP9VzoIF88KrnNnt7D6pq8eU+USee5G/rndLECvbf8f3ZYukBviskEEsLaA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","amount":"2000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"Ni4zifT3qsLDAE2bLg5ABvXVbdwUgTANtVBfLlzTX1NfmzqLM2rv2AoH6L8037FNb7mu69xK8ZxjsoRb3kXK5g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","amount":"4000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"NQ6TIZz2ZjtMI8DqjYc+1G7cakAPTv+THU3WkTNGcxQ6/hE2c3k6R3HFUcxRxQCq+COD2DTWhtwVmJicX/3xtQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","amount":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"SY0IzWKLB96jzbp3TWbXeJutY3dolYIMNx6vDkBgUuJw35/VgJW87s3qpGWhJPkh6aioKaHiG5FmKxW5mGmIDw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","amount":"2000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"bMfoOSstjh+hMBfG9JGDS/KfMxxkLgiZsgwApF1TbNVjPiF5JPNgXli4M/PA2jXsrWjkrj0naPl2XKXZnHojFA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","amount":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"LAhOLi2NQYif4MZqPyoyVn+SPF7i6ImRJz4fIcX1ycYOMuAl00S/uXXhygUIIkelWXIG88i7JneJQ/Wz//hLkw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g13f63ua8uhmuf9mgc0x8zfz04yrsaqh7j78vcgq","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1CWzHwZ/FjY00hsAQhl6pnpuR3ulUiXgkMx0Te14ATX"},"signature":"wVu+W/540vPtNMHsObxQFgCZEF3Rw2d6kBg06nhCsTBkv5MRPQEm7GLAXBX5sC5oVKppQhYpBTM4TEldLifxFQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"test_nft","path":"gno.land/r/demo/test_nft","files":[{"name":"package.gno","body":"package gnft\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/grc/grc721\"\n\t\"gno.land/p/demo/ufmt\"\n\t\"gno.land/r/demo/users\"\n\n\tpusers \"gno.land/p/demo/users\"\n)\n\nvar (\n\tadmin std.Address = \"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\"\n\tgnft = grc721.NewBasicNFT(\"NFT\", \"GFT\")\n\n\tnftImage = make(map[grc721.TokenID]string)\n)\n\nfunc init() {\n\t// NEW_GSA\n\tgsa := std.Address(\"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\")\n\tmintNNFT(gsa, 1)\n}\n\nfunc mintNNFT(owner std.Address, n uint64) {\n\tcount := gnft.TokenCount()\n\tfor i := count; i \u003c count+n; i++ {\n\t\ttid := grc721.TokenID(ufmt.Sprintf(\"%d\", i))\n\t\tgnft.Mint(owner, tid)\n\t}\n}\n\n// Getters\nfunc TotalSupply() uint64 {\n\treturn gnft.TokenCount()\n}\n\nfunc BalanceOf(user pusers.AddressOrName) uint64 {\n\tbalance, err := gnft.BalanceOf(users.Resolve(user))\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\treturn balance\n}\n\nfunc OwnerOf(tid grc721.TokenID) std.Address {\n\towner, err := gnft.OwnerOf(tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\treturn owner\n}\n\nfunc IsApprovedForAll(owner, user pusers.AddressOrName) bool {\n\treturn gnft.IsApprovedForAll(users.Resolve(owner), users.Resolve(user))\n}\n\nfunc GetApproved(tid grc721.TokenID) (std.Address, bool) {\n\taddr, err := gnft.GetApproved(tid)\n\tif err != nil {\n\t\treturn \"\", false\n\t}\n\n\treturn addr, true\n}\n\n// Setters\n\nfunc Approve(user pusers.AddressOrName, tid grc721.TokenID) {\n\terr := gnft.Approve(users.Resolve(user), tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc SetApprovalForAll(user pusers.AddressOrName, approved bool) {\n\terr := gnft.SetApprovalForAll(users.Resolve(user), approved)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc TransferFrom(from, to pusers.AddressOrName, tid grc721.TokenID) {\n\terr := gnft.TransferFrom(users.Resolve(from), users.Resolve(to), tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\n// Admin\n\nfunc Mint(to pusers.AddressOrName, tid grc721.TokenID) {\n\tcaller := std.PrevRealm().Addr()\n\tassertIsAdmin(caller)\n\terr := gnft.Mint(users.Resolve(to), tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\tnftImage[tid] = getImageBase64(tid)\n}\n\nfunc Burn(tid grc721.TokenID) {\n\tcaller := std.PrevRealm().Addr()\n\tassertIsAdmin(caller)\n\terr := gnft.Burn(tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc SetAdmin(newAdmin pusers.AddressOrName) {\n\tcaller := std.PrevRealm().Addr()\n\tassertIsAdmin(caller)\n\tadmin = users.Resolve(newAdmin)\n}\n\n// Render\n\nfunc Render(path string) string {\n\tswitch {\n\tcase path == \"\":\n\t\treturn gnft.RenderHome()\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}\n\nfunc RenderImage(tid grc721.TokenID) string {\n\timage, ok := nftImage[tid]\n\tif !ok {\n\t\treturn \"\"\n\t}\n\n\treturn image\n}\n\n// Util\nfunc assertIsAdmin(address std.Address) {\n\tif address != admin {\n\t\tpanic(\"restricted access\")\n\t}\n}\n\nfunc Exists(tid grc721.TokenID) bool {\n\t_, err := gnft.OwnerOf(tid)\n\tif err != nil {\n\t\treturn false\n\t}\n\n\treturn true\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"p3fThrO2e3faJ+o0z1gQ04smLj2p4eiEQoWHkPUvgaRwNE4M6/R6G6ggHOStr5R1VNRTvZGyH2NLpj5fc1fn3Q=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"test_nft","path":"gno.land/r/demo/test_nft","files":[{"name":"image.gno","body":"package gnft\n\nconst (\n\tNFT_IMAGE_01 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81Njg5NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTY4OTYiIHgxPSIxMi45Mjk4IiB5MT0iMTMuOTI5OCIgeDI9IjEyMS4wNyIgeTI9IjEyMi4wNyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjMjUwREUxIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzhFMzBCMCIvPgo8L2xpbmVhckdyYWRpZW50Pgo8L2RlZnM+Cjwvc3ZnPgo=`\n\tNFT_IMAGE_02 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81Njk0NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTY5NDYiIHgxPSIxMC45NjM2IiB5MT0iMTEuOTYzNiIgeDI9IjEyMy4wMzYiIHkyPSIxMjQuMDM2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNEOEFENTQiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDIyQjAwIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg==`\n\tNFT_IMAGE_03 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81Njk5NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTY5OTYiIHgxPSI0LjEwMjA0IiB5MT0iNS4xMDIwNCIgeDI9IjEyOS44OTgiIHkyPSIxMzAuODk4IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNBQjQ0MzMiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjREE5OUVEIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg==`\n\tNFT_IMAGE_04 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81NzA0NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTcwNDYiIHgxPSI1LjM2IiB5MT0iNi4zNiIgeDI9IjEyOC42NCIgeTI9IjEyOS42NCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjNUIwMjJFIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzdEMkE3RCIvPgo8L2xpbmVhckdyYWRpZW50Pgo8L2RlZnM+Cjwvc3ZnPgo=`\n\tNFT_IAMGE_05 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81Njg0NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTY4NDYiIHgxPSIxMzguMDg5IiB5MT0iMTU0Ljg1MyIgeDI9Ii01Ljc2MDI4IiB5Mj0iMTUzLjciIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzUzNkNENyIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMyMzNEQkQiLz4KPC9saW5lYXJHcmFkaWVudD4KPC9kZWZzPgo8L3N2Zz4K`\n)\n\n\nfunc getImageBase64(tid grc721.TokenID) string {\n\tuTid := uint64(tid)\n\tif uTid % 5 == 0 {\n\t\treutnr NFT_IMAGE_05\n\t} else if uTid % 4 == 0 {\n\t\treturn NFT_IMAGE_04\n\t} else if uTid % 3 == 0 {\n\t\treturn NFT_IMAGE_03\n\t} else if uTid % 2 == 0 {\n\t\treturn NFT_IMAGE_02\n\t} else {\n\t\treturn NFT_IMAGE_01\n\t}\n}"},{"name":"package.gno","body":"package gnft\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/grc/grc721\"\n\t\"gno.land/p/demo/ufmt\"\n\t\"gno.land/r/demo/users\"\n\n\tpusers \"gno.land/p/demo/users\"\n)\n\nvar (\n\tadmin std.Address = \"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\"\n\tgnft = grc721.NewBasicNFT(\"NFT\", \"GFT\")\n\n\tnftImage = make(map[grc721.TokenID]string)\n)\n\nfunc init() {\n\t// NEW_GSA\n\tgsa := std.Address(\"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\")\n\tmintNNFT(gsa, 1)\n}\n\nfunc mintNNFT(owner std.Address, n uint64) {\n\tcount := gnft.TokenCount()\n\tfor i := count; i \u003c count+n; i++ {\n\t\ttid := grc721.TokenID(ufmt.Sprintf(\"%d\", i))\n\t\tgnft.Mint(owner, tid)\n\t}\n}\n\n// Getters\nfunc TotalSupply() uint64 {\n\treturn gnft.TokenCount()\n}\n\nfunc BalanceOf(user pusers.AddressOrName) uint64 {\n\tbalance, err := gnft.BalanceOf(users.Resolve(user))\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\treturn balance\n}\n\nfunc OwnerOf(tid grc721.TokenID) std.Address {\n\towner, err := gnft.OwnerOf(tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\treturn owner\n}\n\nfunc IsApprovedForAll(owner, user pusers.AddressOrName) bool {\n\treturn gnft.IsApprovedForAll(users.Resolve(owner), users.Resolve(user))\n}\n\nfunc GetApproved(tid grc721.TokenID) (std.Address, bool) {\n\taddr, err := gnft.GetApproved(tid)\n\tif err != nil {\n\t\treturn \"\", false\n\t}\n\n\treturn addr, true\n}\n\n// Setters\n\nfunc Approve(user pusers.AddressOrName, tid grc721.TokenID) {\n\terr := gnft.Approve(users.Resolve(user), tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc SetApprovalForAll(user pusers.AddressOrName, approved bool) {\n\terr := gnft.SetApprovalForAll(users.Resolve(user), approved)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc TransferFrom(from, to pusers.AddressOrName, tid grc721.TokenID) {\n\terr := gnft.TransferFrom(users.Resolve(from), users.Resolve(to), tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\n// Admin\n\nfunc Mint(to pusers.AddressOrName, tid grc721.TokenID) {\n\tcaller := std.PrevRealm().Addr()\n\tassertIsAdmin(caller)\n\terr := gnft.Mint(users.Resolve(to), tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\tnftImage[tid] = getImageBase64(tid)\n}\n\nfunc Burn(tid grc721.TokenID) {\n\tcaller := std.PrevRealm().Addr()\n\tassertIsAdmin(caller)\n\terr := gnft.Burn(tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc SetAdmin(newAdmin pusers.AddressOrName) {\n\tcaller := std.PrevRealm().Addr()\n\tassertIsAdmin(caller)\n\tadmin = users.Resolve(newAdmin)\n}\n\n// Render\n\nfunc Render(path string) string {\n\tswitch {\n\tcase path == \"\":\n\t\treturn gnft.RenderHome()\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}\n\nfunc RenderImage(tid grc721.TokenID) string {\n\timage, ok := nftImage[tid]\n\tif !ok {\n\t\treturn \"\"\n\t}\n\n\treturn image\n}\n\n// Util\nfunc assertIsAdmin(address std.Address) {\n\tif address != admin {\n\t\tpanic(\"restricted access\")\n\t}\n}\n\nfunc Exists(tid grc721.TokenID) bool {\n\t_, err := gnft.OwnerOf(tid)\n\tif err != nil {\n\t\treturn false\n\t}\n\n\treturn true\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"OHYR4XKr8/jPrjh31a+nUHbxSJn0unIV4MSMEOfwlTZv5DrpWAXmo94QG/ptSsqXl3b6ZHIvuR4VNUChEgdxiw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"test_nft","path":"gno.land/r/demo/test_nft","files":[{"name":"image.gno","body":"package gnft\n\nconst (\n\tNFT_IMAGE_01 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81Njg5NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTY4OTYiIHgxPSIxMi45Mjk4IiB5MT0iMTMuOTI5OCIgeDI9IjEyMS4wNyIgeTI9IjEyMi4wNyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjMjUwREUxIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzhFMzBCMCIvPgo8L2xpbmVhckdyYWRpZW50Pgo8L2RlZnM+Cjwvc3ZnPgo=`\n\tNFT_IMAGE_02 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81Njk0NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTY5NDYiIHgxPSIxMC45NjM2IiB5MT0iMTEuOTYzNiIgeDI9IjEyMy4wMzYiIHkyPSIxMjQuMDM2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNEOEFENTQiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDIyQjAwIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg==`\n\tNFT_IMAGE_03 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81Njk5NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTY5OTYiIHgxPSI0LjEwMjA0IiB5MT0iNS4xMDIwNCIgeDI9IjEyOS44OTgiIHkyPSIxMzAuODk4IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNBQjQ0MzMiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjREE5OUVEIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg==`\n\tNFT_IMAGE_04 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81NzA0NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTcwNDYiIHgxPSI1LjM2IiB5MT0iNi4zNiIgeDI9IjEyOC42NCIgeTI9IjEyOS42NCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjNUIwMjJFIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzdEMkE3RCIvPgo8L2xpbmVhckdyYWRpZW50Pgo8L2RlZnM+Cjwvc3ZnPgo=`\n\tNFT_IAMGE_05 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81Njg0NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTY4NDYiIHgxPSIxMzguMDg5IiB5MT0iMTU0Ljg1MyIgeDI9Ii01Ljc2MDI4IiB5Mj0iMTUzLjciIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzUzNkNENyIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMyMzNEQkQiLz4KPC9saW5lYXJHcmFkaWVudD4KPC9kZWZzPgo8L3N2Zz4K`\n)\n\nfunc getImageBase64(tid grc721.TokenID) string {\n\tuTid := uint64(tid)\n\tif uTid%5 == 0 {\n\t\treturn NFT_IMAGE_05\n\t} else if uTid%4 == 0 {\n\t\treturn NFT_IMAGE_04\n\t} else if uTid%3 == 0 {\n\t\treturn NFT_IMAGE_03\n\t} else if uTid%2 == 0 {\n\t\treturn NFT_IMAGE_02\n\t} else {\n\t\treturn NFT_IMAGE_01\n\t}\n}\n"},{"name":"package.gno","body":"package gnft\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/grc/grc721\"\n\t\"gno.land/p/demo/ufmt\"\n\t\"gno.land/r/demo/users\"\n\n\tpusers \"gno.land/p/demo/users\"\n)\n\nvar (\n\tadmin std.Address = \"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\"\n\tgnft = grc721.NewBasicNFT(\"NFT\", \"GFT\")\n\n\tnftImage = make(map[grc721.TokenID]string)\n)\n\nfunc init() {\n\t// NEW_GSA\n\tgsa := std.Address(\"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\")\n\tmintNNFT(gsa, 1)\n}\n\nfunc mintNNFT(owner std.Address, n uint64) {\n\tcount := gnft.TokenCount()\n\tfor i := count; i \u003c count+n; i++ {\n\t\ttid := grc721.TokenID(ufmt.Sprintf(\"%d\", i))\n\t\tgnft.Mint(owner, tid)\n\t}\n}\n\n// Getters\nfunc TotalSupply() uint64 {\n\treturn gnft.TokenCount()\n}\n\nfunc BalanceOf(user pusers.AddressOrName) uint64 {\n\tbalance, err := gnft.BalanceOf(users.Resolve(user))\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\treturn balance\n}\n\nfunc OwnerOf(tid grc721.TokenID) std.Address {\n\towner, err := gnft.OwnerOf(tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\treturn owner\n}\n\nfunc IsApprovedForAll(owner, user pusers.AddressOrName) bool {\n\treturn gnft.IsApprovedForAll(users.Resolve(owner), users.Resolve(user))\n}\n\nfunc GetApproved(tid grc721.TokenID) (std.Address, bool) {\n\taddr, err := gnft.GetApproved(tid)\n\tif err != nil {\n\t\treturn \"\", false\n\t}\n\n\treturn addr, true\n}\n\n// Setters\n\nfunc Approve(user pusers.AddressOrName, tid grc721.TokenID) {\n\terr := gnft.Approve(users.Resolve(user), tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc SetApprovalForAll(user pusers.AddressOrName, approved bool) {\n\terr := gnft.SetApprovalForAll(users.Resolve(user), approved)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc TransferFrom(from, to pusers.AddressOrName, tid grc721.TokenID) {\n\terr := gnft.TransferFrom(users.Resolve(from), users.Resolve(to), tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\n// Admin\n\nfunc Mint(to pusers.AddressOrName, tid grc721.TokenID) {\n\tcaller := std.PrevRealm().Addr()\n\tassertIsAdmin(caller)\n\terr := gnft.Mint(users.Resolve(to), tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\tnftImage[tid] = getImageBase64(tid)\n}\n\nfunc Burn(tid grc721.TokenID) {\n\tcaller := std.PrevRealm().Addr()\n\tassertIsAdmin(caller)\n\terr := gnft.Burn(tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc SetAdmin(newAdmin pusers.AddressOrName) {\n\tcaller := std.PrevRealm().Addr()\n\tassertIsAdmin(caller)\n\tadmin = users.Resolve(newAdmin)\n}\n\n// Render\n\nfunc Render(path string) string {\n\tswitch {\n\tcase path == \"\":\n\t\treturn gnft.RenderHome()\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}\n\nfunc RenderImage(tid grc721.TokenID) string {\n\timage, ok := nftImage[tid]\n\tif !ok {\n\t\treturn \"\"\n\t}\n\n\treturn image\n}\n\n// Util\nfunc assertIsAdmin(address std.Address) {\n\tif address != admin {\n\t\tpanic(\"restricted access\")\n\t}\n}\n\nfunc Exists(tid grc721.TokenID) bool {\n\t_, err := gnft.OwnerOf(tid)\n\tif err != nil {\n\t\treturn false\n\t}\n\n\treturn true\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"5YuExPHDIjmzdez+A8cCqASXbP/K90k9r8yriOrZWtROvG/U/EZ+dd2/Xq7BkdnDtTzbPUiWbfXfDo2oP87JiQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"test_nft","path":"gno.land/r/demo/test_nft","files":[{"name":"image.gno","body":"package gnft\n\nconst (\n\tNFT_IMAGE_01 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81Njg5NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTY4OTYiIHgxPSIxMi45Mjk4IiB5MT0iMTMuOTI5OCIgeDI9IjEyMS4wNyIgeTI9IjEyMi4wNyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjMjUwREUxIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzhFMzBCMCIvPgo8L2xpbmVhckdyYWRpZW50Pgo8L2RlZnM+Cjwvc3ZnPgo=`\n\tNFT_IMAGE_02 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81Njk0NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTY5NDYiIHgxPSIxMC45NjM2IiB5MT0iMTEuOTYzNiIgeDI9IjEyMy4wMzYiIHkyPSIxMjQuMDM2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNEOEFENTQiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDIyQjAwIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg==`\n\tNFT_IMAGE_03 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81Njk5NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTY5OTYiIHgxPSI0LjEwMjA0IiB5MT0iNS4xMDIwNCIgeDI9IjEyOS44OTgiIHkyPSIxMzAuODk4IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNBQjQ0MzMiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjREE5OUVEIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg==`\n\tNFT_IMAGE_04 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81NzA0NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTcwNDYiIHgxPSI1LjM2IiB5MT0iNi4zNiIgeDI9IjEyOC42NCIgeTI9IjEyOS42NCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjNUIwMjJFIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzdEMkE3RCIvPgo8L2xpbmVhckdyYWRpZW50Pgo8L2RlZnM+Cjwvc3ZnPgo=`\n\tNFT_IAMGE_05 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81Njg0NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTY4NDYiIHgxPSIxMzguMDg5IiB5MT0iMTU0Ljg1MyIgeDI9Ii01Ljc2MDI4IiB5Mj0iMTUzLjciIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzUzNkNENyIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMyMzNEQkQiLz4KPC9saW5lYXJHcmFkaWVudD4KPC9kZWZzPgo8L3N2Zz4K`\n)\n\nfunc getImageBase64(tid grc721.TokenID) string {\n\tuTid := uint64(tid)\n\tif uTid%5 == 0 {\n\t\treturn NFT_IMAGE_05\n\t} else if uTid%4 == 0 {\n\t\treturn NFT_IMAGE_04\n\t} else if uTid%3 == 0 {\n\t\treturn NFT_IMAGE_03\n\t} else if uTid%2 == 0 {\n\t\treturn NFT_IMAGE_02\n\t} else {\n\t\treturn NFT_IMAGE_01\n\t}\n}\n"},{"name":"package.gno","body":"package gnft\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/grc/grc721\"\n\t\"gno.land/p/demo/ufmt\"\n\t\"gno.land/r/demo/users\"\n\n\tpusers \"gno.land/p/demo/users\"\n)\n\nvar (\n\tadmin std.Address = \"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\"\n\tgnft = grc721.NewBasicNFT(\"NFT\", \"GFT\")\n\n\tnftImage = make(map[grc721.TokenID]string)\n)\n\nfunc init() {\n\t// NEW_GSA\n\tgsa := std.Address(\"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\")\n\tmintNNFT(gsa, 1)\n}\n\nfunc mintNNFT(owner std.Address, n uint64) {\n\tcount := gnft.TokenCount()\n\tfor i := count; i \u003c count+n; i++ {\n\t\ttid := grc721.TokenID(ufmt.Sprintf(\"%d\", i))\n\t\tgnft.Mint(owner, tid)\n\t}\n}\n\n// Getters\nfunc TotalSupply() uint64 {\n\treturn gnft.TokenCount()\n}\n\nfunc BalanceOf(user pusers.AddressOrName) uint64 {\n\tbalance, err := gnft.BalanceOf(users.Resolve(user))\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\treturn balance\n}\n\nfunc OwnerOf(tid grc721.TokenID) std.Address {\n\towner, err := gnft.OwnerOf(tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\treturn owner\n}\n\nfunc IsApprovedForAll(owner, user pusers.AddressOrName) bool {\n\treturn gnft.IsApprovedForAll(users.Resolve(owner), users.Resolve(user))\n}\n\nfunc GetApproved(tid grc721.TokenID) (std.Address, bool) {\n\taddr, err := gnft.GetApproved(tid)\n\tif err != nil {\n\t\treturn \"\", false\n\t}\n\n\treturn addr, true\n}\n\n// Setters\n\nfunc Approve(user pusers.AddressOrName, tid grc721.TokenID) {\n\terr := gnft.Approve(users.Resolve(user), tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc SetApprovalForAll(user pusers.AddressOrName, approved bool) {\n\terr := gnft.SetApprovalForAll(users.Resolve(user), approved)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc TransferFrom(from, to pusers.AddressOrName, tid grc721.TokenID) {\n\terr := gnft.TransferFrom(users.Resolve(from), users.Resolve(to), tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\n// Admin\n\nfunc Mint(to pusers.AddressOrName, tid grc721.TokenID) {\n\tcaller := std.PrevRealm().Addr()\n\tassertIsAdmin(caller)\n\terr := gnft.Mint(users.Resolve(to), tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\tnftImage[tid] = getImageBase64(tid)\n}\n\nfunc Burn(tid grc721.TokenID) {\n\tcaller := std.PrevRealm().Addr()\n\tassertIsAdmin(caller)\n\terr := gnft.Burn(tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc SetAdmin(newAdmin pusers.AddressOrName) {\n\tcaller := std.PrevRealm().Addr()\n\tassertIsAdmin(caller)\n\tadmin = users.Resolve(newAdmin)\n}\n\n// Render\n\nfunc Render(path string) string {\n\tswitch {\n\tcase path == \"\":\n\t\treturn gnft.RenderHome()\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}\n\nfunc RenderImage(tid grc721.TokenID) string {\n\timage, ok := nftImage[tid]\n\tif !ok {\n\t\treturn \"\"\n\t}\n\n\treturn image\n}\n\n// Util\nfunc assertIsAdmin(address std.Address) {\n\tif address != admin {\n\t\tpanic(\"restricted access\")\n\t}\n}\n\nfunc Exists(tid grc721.TokenID) bool {\n\t_, err := gnft.OwnerOf(tid)\n\tif err != nil {\n\t\treturn false\n\t}\n\n\treturn true\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"t4GEgMTFMyqoChHqkDIQBAEmw0SJrhd6ld6UurfKzjBEXerl4Ul9vHQfDeujk5a3YnBN6x2r4wKXviFIx82FnA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"test_nft","path":"gno.land/r/demo/test_nft","files":[{"name":"image.gno","body":"package gnft\n\nconst (\n\tNFT_IMAGE_01 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81Njg5NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTY4OTYiIHgxPSIxMi45Mjk4IiB5MT0iMTMuOTI5OCIgeDI9IjEyMS4wNyIgeTI9IjEyMi4wNyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjMjUwREUxIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzhFMzBCMCIvPgo8L2xpbmVhckdyYWRpZW50Pgo8L2RlZnM+Cjwvc3ZnPgo=`\n\tNFT_IMAGE_02 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81Njk0NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTY5NDYiIHgxPSIxMC45NjM2IiB5MT0iMTEuOTYzNiIgeDI9IjEyMy4wMzYiIHkyPSIxMjQuMDM2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNEOEFENTQiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDIyQjAwIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg==`\n\tNFT_IMAGE_03 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81Njk5NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTY5OTYiIHgxPSI0LjEwMjA0IiB5MT0iNS4xMDIwNCIgeDI9IjEyOS44OTgiIHkyPSIxMzAuODk4IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNBQjQ0MzMiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjREE5OUVEIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg==`\n\tNFT_IMAGE_04 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81NzA0NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTcwNDYiIHgxPSI1LjM2IiB5MT0iNi4zNiIgeDI9IjEyOC42NCIgeTI9IjEyOS42NCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjNUIwMjJFIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzdEMkE3RCIvPgo8L2xpbmVhckdyYWRpZW50Pgo8L2RlZnM+Cjwvc3ZnPgo=`\n\tNFT_IMAGE_05 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81Njg0NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTY4NDYiIHgxPSIxMzguMDg5IiB5MT0iMTU0Ljg1MyIgeDI9Ii01Ljc2MDI4IiB5Mj0iMTUzLjciIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzUzNkNENyIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMyMzNEQkQiLz4KPC9saW5lYXJHcmFkaWVudD4KPC9kZWZzPgo8L3N2Zz4K`\n)\n\nfunc getImageBase64(tid grc721.TokenID) string {\n\tuTid := uint64(tid)\n\tif uTid%5 == 0 {\n\t\treturn NFT_IMAGE_05\n\t} else if uTid%4 == 0 {\n\t\treturn NFT_IMAGE_04\n\t} else if uTid%3 == 0 {\n\t\treturn NFT_IMAGE_03\n\t} else if uTid%2 == 0 {\n\t\treturn NFT_IMAGE_02\n\t} else {\n\t\treturn NFT_IMAGE_01\n\t}\n}\n"},{"name":"package.gno","body":"package gnft\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/grc/grc721\"\n\t\"gno.land/p/demo/ufmt\"\n\t\"gno.land/r/demo/users\"\n\n\tpusers \"gno.land/p/demo/users\"\n)\n\nvar (\n\tadmin std.Address = \"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\"\n\tgnft = grc721.NewBasicNFT(\"NFT\", \"GFT\")\n\n\tnftImage = make(map[grc721.TokenID]string)\n)\n\nfunc init() {\n\t// NEW_GSA\n\tgsa := std.Address(\"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\")\n\tmintNNFT(gsa, 1)\n}\n\nfunc mintNNFT(owner std.Address, n uint64) {\n\tcount := gnft.TokenCount()\n\tfor i := count; i \u003c count+n; i++ {\n\t\ttid := grc721.TokenID(ufmt.Sprintf(\"%d\", i))\n\t\tgnft.Mint(owner, tid)\n\t}\n}\n\n// Getters\nfunc TotalSupply() uint64 {\n\treturn gnft.TokenCount()\n}\n\nfunc BalanceOf(user pusers.AddressOrName) uint64 {\n\tbalance, err := gnft.BalanceOf(users.Resolve(user))\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\treturn balance\n}\n\nfunc OwnerOf(tid grc721.TokenID) std.Address {\n\towner, err := gnft.OwnerOf(tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\treturn owner\n}\n\nfunc IsApprovedForAll(owner, user pusers.AddressOrName) bool {\n\treturn gnft.IsApprovedForAll(users.Resolve(owner), users.Resolve(user))\n}\n\nfunc GetApproved(tid grc721.TokenID) (std.Address, bool) {\n\taddr, err := gnft.GetApproved(tid)\n\tif err != nil {\n\t\treturn \"\", false\n\t}\n\n\treturn addr, true\n}\n\n// Setters\n\nfunc Approve(user pusers.AddressOrName, tid grc721.TokenID) {\n\terr := gnft.Approve(users.Resolve(user), tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc SetApprovalForAll(user pusers.AddressOrName, approved bool) {\n\terr := gnft.SetApprovalForAll(users.Resolve(user), approved)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc TransferFrom(from, to pusers.AddressOrName, tid grc721.TokenID) {\n\terr := gnft.TransferFrom(users.Resolve(from), users.Resolve(to), tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\n// Admin\n\nfunc Mint(to pusers.AddressOrName, tid grc721.TokenID) {\n\tcaller := std.PrevRealm().Addr()\n\tassertIsAdmin(caller)\n\terr := gnft.Mint(users.Resolve(to), tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\tnftImage[tid] = getImageBase64(tid)\n}\n\nfunc Burn(tid grc721.TokenID) {\n\tcaller := std.PrevRealm().Addr()\n\tassertIsAdmin(caller)\n\terr := gnft.Burn(tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc SetAdmin(newAdmin pusers.AddressOrName) {\n\tcaller := std.PrevRealm().Addr()\n\tassertIsAdmin(caller)\n\tadmin = users.Resolve(newAdmin)\n}\n\n// Render\n\nfunc Render(path string) string {\n\tswitch {\n\tcase path == \"\":\n\t\treturn gnft.RenderHome()\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}\n\nfunc RenderImage(tid grc721.TokenID) string {\n\timage, ok := nftImage[tid]\n\tif !ok {\n\t\treturn \"\"\n\t}\n\n\treturn image\n}\n\n// Util\nfunc assertIsAdmin(address std.Address) {\n\tif address != admin {\n\t\tpanic(\"restricted access\")\n\t}\n}\n\nfunc Exists(tid grc721.TokenID) bool {\n\t_, err := gnft.OwnerOf(tid)\n\tif err != nil {\n\t\treturn false\n\t}\n\n\treturn true\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"FKow6i4l9sPAp0qKwjEF0qUBfR6NqG+iYvpwaCUFUQVQU/4jOWRwrNFyqfgOmFwOWxywgKGoYTnEcG+UiDIuRQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"test_nft","path":"gno.land/r/demo/test_nft","files":[{"name":"image.gno","body":"package gnft\n\nimport (\n\t\"gno.land/p/demo/grc/grc721\"\n)\n\nconst (\n\tNFT_IMAGE_01 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81Njg5NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTY4OTYiIHgxPSIxMi45Mjk4IiB5MT0iMTMuOTI5OCIgeDI9IjEyMS4wNyIgeTI9IjEyMi4wNyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjMjUwREUxIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzhFMzBCMCIvPgo8L2xpbmVhckdyYWRpZW50Pgo8L2RlZnM+Cjwvc3ZnPgo=`\n\tNFT_IMAGE_02 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81Njk0NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTY5NDYiIHgxPSIxMC45NjM2IiB5MT0iMTEuOTYzNiIgeDI9IjEyMy4wMzYiIHkyPSIxMjQuMDM2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNEOEFENTQiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDIyQjAwIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg==`\n\tNFT_IMAGE_03 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81Njk5NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTY5OTYiIHgxPSI0LjEwMjA0IiB5MT0iNS4xMDIwNCIgeDI9IjEyOS44OTgiIHkyPSIxMzAuODk4IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNBQjQ0MzMiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjREE5OUVEIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg==`\n\tNFT_IMAGE_04 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81NzA0NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTcwNDYiIHgxPSI1LjM2IiB5MT0iNi4zNiIgeDI9IjEyOC42NCIgeTI9IjEyOS42NCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjNUIwMjJFIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzdEMkE3RCIvPgo8L2xpbmVhckdyYWRpZW50Pgo8L2RlZnM+Cjwvc3ZnPgo=`\n\tNFT_IMAGE_05 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81Njg0NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTY4NDYiIHgxPSIxMzguMDg5IiB5MT0iMTU0Ljg1MyIgeDI9Ii01Ljc2MDI4IiB5Mj0iMTUzLjciIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzUzNkNENyIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMyMzNEQkQiLz4KPC9saW5lYXJHcmFkaWVudD4KPC9kZWZzPgo8L3N2Zz4K`\n)\n\nfunc getImageBase64(tid grc721.TokenID) string {\n\tuTid := uint64(tid)\n\tif uTid%5 == 0 {\n\t\treturn NFT_IMAGE_05\n\t} else if uTid%4 == 0 {\n\t\treturn NFT_IMAGE_04\n\t} else if uTid%3 == 0 {\n\t\treturn NFT_IMAGE_03\n\t} else if uTid%2 == 0 {\n\t\treturn NFT_IMAGE_02\n\t} else {\n\t\treturn NFT_IMAGE_01\n\t}\n}\n"},{"name":"package.gno","body":"package gnft\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/grc/grc721\"\n\t\"gno.land/p/demo/ufmt\"\n\t\"gno.land/r/demo/users\"\n\n\tpusers \"gno.land/p/demo/users\"\n)\n\nvar (\n\tadmin std.Address = \"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\"\n\tgnft = grc721.NewBasicNFT(\"NFT\", \"GFT\")\n\n\tnftImage = make(map[grc721.TokenID]string)\n)\n\nfunc init() {\n\t// NEW_GSA\n\tgsa := std.Address(\"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\")\n\tmintNNFT(gsa, 1)\n}\n\nfunc mintNNFT(owner std.Address, n uint64) {\n\tcount := gnft.TokenCount()\n\tfor i := count; i \u003c count+n; i++ {\n\t\ttid := grc721.TokenID(ufmt.Sprintf(\"%d\", i))\n\t\tgnft.Mint(owner, tid)\n\t}\n}\n\n// Getters\nfunc TotalSupply() uint64 {\n\treturn gnft.TokenCount()\n}\n\nfunc BalanceOf(user pusers.AddressOrName) uint64 {\n\tbalance, err := gnft.BalanceOf(users.Resolve(user))\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\treturn balance\n}\n\nfunc OwnerOf(tid grc721.TokenID) std.Address {\n\towner, err := gnft.OwnerOf(tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\treturn owner\n}\n\nfunc IsApprovedForAll(owner, user pusers.AddressOrName) bool {\n\treturn gnft.IsApprovedForAll(users.Resolve(owner), users.Resolve(user))\n}\n\nfunc GetApproved(tid grc721.TokenID) (std.Address, bool) {\n\taddr, err := gnft.GetApproved(tid)\n\tif err != nil {\n\t\treturn \"\", false\n\t}\n\n\treturn addr, true\n}\n\n// Setters\n\nfunc Approve(user pusers.AddressOrName, tid grc721.TokenID) {\n\terr := gnft.Approve(users.Resolve(user), tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc SetApprovalForAll(user pusers.AddressOrName, approved bool) {\n\terr := gnft.SetApprovalForAll(users.Resolve(user), approved)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc TransferFrom(from, to pusers.AddressOrName, tid grc721.TokenID) {\n\terr := gnft.TransferFrom(users.Resolve(from), users.Resolve(to), tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\n// Admin\n\nfunc Mint(to pusers.AddressOrName, tid grc721.TokenID) {\n\tcaller := std.PrevRealm().Addr()\n\tassertIsAdmin(caller)\n\terr := gnft.Mint(users.Resolve(to), tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\tnftImage[tid] = getImageBase64(tid)\n}\n\nfunc Burn(tid grc721.TokenID) {\n\tcaller := std.PrevRealm().Addr()\n\tassertIsAdmin(caller)\n\terr := gnft.Burn(tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc SetAdmin(newAdmin pusers.AddressOrName) {\n\tcaller := std.PrevRealm().Addr()\n\tassertIsAdmin(caller)\n\tadmin = users.Resolve(newAdmin)\n}\n\n// Render\n\nfunc Render(path string) string {\n\tswitch {\n\tcase path == \"\":\n\t\treturn gnft.RenderHome()\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}\n\nfunc RenderImage(tid grc721.TokenID) string {\n\timage, ok := nftImage[tid]\n\tif !ok {\n\t\treturn \"\"\n\t}\n\n\treturn image\n}\n\n// Util\nfunc assertIsAdmin(address std.Address) {\n\tif address != admin {\n\t\tpanic(\"restricted access\")\n\t}\n}\n\nfunc Exists(tid grc721.TokenID) bool {\n\t_, err := gnft.OwnerOf(tid)\n\tif err != nil {\n\t\treturn false\n\t}\n\n\treturn true\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"NpkePpmD8mySxhF1r3mpWXsuAHIXHGcVA6ao093otU8A7Sr+ons8eslipnWqh8Y9eaYgnyJqSa5jSUHmkr/MIg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"test_nft","path":"gno.land/r/demo/test_nft","files":[{"name":"gnft.gno","body":"package gnft\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/grc/grc721\"\n\t\"gno.land/r/demo/users\"\n\n\tpusers \"gno.land/p/demo/users\"\n)\n\nvar (\n\tadmin std.Address = \"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\"\n\tgnft = grc721.NewBasicNFT(\"T NFT\", \"TNFT\")\n)\n\nfunc init() {\n}\n\n// Getters\nfunc TotalSupply() uint64 {\n\treturn gnft.TokenCount()\n}\n\nfunc GetTokenURI(tid grc721.TokenID) string {\n\turi, err := gnft.TokenURI(tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\treturn string(uri)\n}\n\nfunc BalanceOf(user pusers.AddressOrName) uint64 {\n\tbalance, err := gnft.BalanceOf(users.Resolve(user))\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\treturn balance\n}\n\nfunc OwnerOf(tid grc721.TokenID) std.Address {\n\towner, err := gnft.OwnerOf(tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\treturn owner\n}\n\nfunc IsApprovedForAll(owner, user pusers.AddressOrName) bool {\n\treturn gnft.IsApprovedForAll(users.Resolve(owner), users.Resolve(user))\n}\n\nfunc GetApproved(tid grc721.TokenID) (std.Address, bool) {\n\taddr, err := gnft.GetApproved(tid)\n\tif err != nil {\n\t\treturn \"\", false\n\t}\n\n\treturn addr, true\n}\n\n// Setters\n\nfunc Approve(user pusers.AddressOrName, tid grc721.TokenID) {\n\terr := gnft.Approve(users.Resolve(user), tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc SetApprovalForAll(user pusers.AddressOrName, approved bool) {\n\terr := gnft.SetApprovalForAll(users.Resolve(user), approved)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc TransferFrom(from, to pusers.AddressOrName, tid grc721.TokenID) {\n\terr := gnft.TransferFrom(users.Resolve(from), users.Resolve(to), tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\n// Admin\n\nfunc Mint(to pusers.AddressOrName, tid grc721.TokenID) {\n\tcaller := std.PrevRealm().Addr()\n\tassertIsAdmin(caller)\n\terr := gnft.Mint(users.Resolve(to), tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\ttokenRaw := getImageBase64(tid)\n\tgnft.SetTokenURI(tid, grc721.TokenURI(tokenRaw))\n}\n\nfunc Burn(tid grc721.TokenID) {\n\tcaller := std.PrevRealm().Addr()\n\tassertIsAdmin(caller)\n\terr := gnft.Burn(tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc SetAdmin(newAdmin pusers.AddressOrName) {\n\tcaller := std.PrevRealm().Addr()\n\tassertIsAdmin(caller)\n\tadmin = users.Resolve(newAdmin)\n}\n\n// Render\n\nfunc Render(path string) string {\n\tswitch {\n\tcase path == \"\":\n\t\treturn gnft.RenderHome()\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}\n\n// Util\nfunc assertIsAdmin(address std.Address) {\n\tif address != admin {\n\t\tpanic(\"restricted access\")\n\t}\n}\n\nfunc Exists(tid grc721.TokenID) bool {\n\t_, err := gnft.OwnerOf(tid)\n\tif err != nil {\n\t\treturn false\n\t}\n\n\treturn true\n}\n"},{"name":"image.gno","body":"package gnft\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/p/demo/grc/grc721\"\n)\n\nconst (\n\tNFT_IMAGE_01 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81Njg5NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTY4OTYiIHgxPSIxMi45Mjk4IiB5MT0iMTMuOTI5OCIgeDI9IjEyMS4wNyIgeTI9IjEyMi4wNyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjMjUwREUxIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzhFMzBCMCIvPgo8L2xpbmVhckdyYWRpZW50Pgo8L2RlZnM+Cjwvc3ZnPgo=`\n\tNFT_IMAGE_02 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81Njk0NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTY5NDYiIHgxPSIxMC45NjM2IiB5MT0iMTEuOTYzNiIgeDI9IjEyMy4wMzYiIHkyPSIxMjQuMDM2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNEOEFENTQiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDIyQjAwIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg==`\n\tNFT_IMAGE_03 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81Njk5NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTY5OTYiIHgxPSI0LjEwMjA0IiB5MT0iNS4xMDIwNCIgeDI9IjEyOS44OTgiIHkyPSIxMzAuODk4IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNBQjQ0MzMiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjREE5OUVEIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg==`\n\tNFT_IMAGE_04 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81NzA0NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTcwNDYiIHgxPSI1LjM2IiB5MT0iNi4zNiIgeDI9IjEyOC42NCIgeTI9IjEyOS42NCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjNUIwMjJFIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzdEMkE3RCIvPgo8L2xpbmVhckdyYWRpZW50Pgo8L2RlZnM+Cjwvc3ZnPgo=`\n\tNFT_IMAGE_05 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81Njg0NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTY4NDYiIHgxPSIxMzguMDg5IiB5MT0iMTU0Ljg1MyIgeDI9Ii01Ljc2MDI4IiB5Mj0iMTUzLjciIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzUzNkNENyIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMyMzNEQkQiLz4KPC9saW5lYXJHcmFkaWVudD4KPC9kZWZzPgo8L3N2Zz4K`\n)\n\nfunc getImageBase64(tid grc721.TokenID) string {\n\tstringId := string(tid)\n\tuintId, err := strconv.Atoi(stringId)\n\tif err != nil {\n\t\t// panic(err.Error())\n\t\treturn \"ERROR_TOKEN_URI\"\n\t}\n\n\tif uintId%5 == 0 {\n\t\treturn NFT_IMAGE_05\n\t} else if uintId%4 == 0 {\n\t\treturn NFT_IMAGE_04\n\t} else if uintId%3 == 0 {\n\t\treturn NFT_IMAGE_03\n\t} else if uintId%2 == 0 {\n\t\treturn NFT_IMAGE_02\n\t} else {\n\t\treturn NFT_IMAGE_01\n\t}\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"vugPu8AXRFNRARUAuV0jBCy+u91sxDxJlAvC+8/mFqlXZsp2biJUrpSNLWYQOlo23EfRHcbHu8hIc9z4yq7IXQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"t12345","path":"gno.land/r/demo/t12345","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"fdImvjmnfksnn2lbBg8mKxJTP81L/vrSgRN5tf4cIkZkH5TbSeCwalcbLV9PFMo7zcEsWmorXJxHgrvxLy3JUA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"echo","path":"gno.land/r/demo/echo1","files":[{"name":"echo.gno","body":"package echo\n\n/*\n * This realm echoes the `path` argument it received.\n * Can be used by developers as a simple endpoint to test\n * forbidden characters, for pentesting or simply to\n * test it works.\n *\n * See also r/demo/print (to print various thing like user address)\n */\nfunc Render(path string) string {\n\treturn path\n}\n"},{"name":"echo_test.gno","body":"package echo\n\nimport \"testing\"\n\nfunc Test(t *testing.T) {\n\tif Render(\"aa\") != \"aa\" {\n\t\tt.Fail()\n\t}\n\tif Render(\"\") != \"\" {\n\t\tt.Fail()\n\t}\n}\n"},{"name":"gno.mod","body":"module gno.land/r/demo/echo\n"}]},"deposit":""}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"kNLS2xW9cm+NptPZ45UKBDlEM60Ra3mbeZ78PQXxjDIC2THXpeyjAkX1RJ4GSSboI5wZTaX99K2PiRkuqrD91A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"echo","path":"gno.land/p/demo/echo1","files":[{"name":"echo.gno","body":"package echo\n\n/*\n * This realm echoes the `path` argument it received.\n * Can be used by developers as a simple endpoint to test\n * forbidden characters, for pentesting or simply to\n * test it works.\n *\n * See also r/demo/print (to print various thing like user address)\n */\nfunc Render(path string) string {\n\treturn path\n}\n"},{"name":"echo_test.gno","body":"package echo\n\nimport \"testing\"\n\nfunc Test(t *testing.T) {\n\tif Render(\"aa\") != \"aa\" {\n\t\tt.Fail()\n\t}\n\tif Render(\"\") != \"\" {\n\t\tt.Fail()\n\t}\n}\n"},{"name":"gno.mod","body":"module gno.land/r/demo/echo\n"}]},"deposit":""}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"+1ny8TXEJkaO5rYiQV66pSbJqWS7G0xCvL/PxDkwaflydSQNQYTQfxxD5SwVj4GdPTvryQ4plhgpQKQJ0YJGaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"gnft","path":"gno.land/r/demo/nft123","files":[{"name":"gnft.gno","body":"package gnft\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/grc/grc721\"\n\t\"gno.land/r/demo/users\"\n\n\tpusers \"gno.land/p/demo/users\"\n)\n\nvar (\n\tadmin std.Address = \"g1y3uyaa63sjxvah2cx3c2usavwvx97kl8m2v7ye\" // deployed position contract\n\tgnft = grc721.NewBasicNFT(\"GNOSWAP NFT\", \"GNFT\")\n)\n\nfunc init() {\n}\n\n// Getters\nfunc TotalSupply() uint64 {\n\treturn gnft.TokenCount()\n}\n\nfunc GetTokenURI(tid grc721.TokenID) string {\n\turi, err := gnft.TokenURI(tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\treturn string(uri)\n}\n\nfunc BalanceOf(user pusers.AddressOrName) uint64 {\n\tbalance, err := gnft.BalanceOf(users.Resolve(user))\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\treturn balance\n}\n\nfunc OwnerOf(tid grc721.TokenID) std.Address {\n\towner, err := gnft.OwnerOf(tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\treturn owner\n}\n\nfunc IsApprovedForAll(owner, user pusers.AddressOrName) bool {\n\treturn gnft.IsApprovedForAll(users.Resolve(owner), users.Resolve(user))\n}\n\nfunc GetApproved(tid grc721.TokenID) (std.Address, bool) {\n\taddr, err := gnft.GetApproved(tid)\n\tif err != nil {\n\t\treturn \"\", false\n\t}\n\n\treturn addr, true\n}\n\n// Setters\n\nfunc Approve(user pusers.AddressOrName, tid grc721.TokenID) {\n\terr := gnft.Approve(users.Resolve(user), tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc SetApprovalForAll(user pusers.AddressOrName, approved bool) {\n\terr := gnft.SetApprovalForAll(users.Resolve(user), approved)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc TransferFrom(from, to pusers.AddressOrName, tid grc721.TokenID) {\n\terr := gnft.TransferFrom(users.Resolve(from), users.Resolve(to), tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\n// Admin\n\nfunc Mint(to pusers.AddressOrName, tid grc721.TokenID) {\n\tcaller := std.PrevRealm().Addr()\n\tassertIsAdmin(caller)\n\terr := gnft.Mint(users.Resolve(to), tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\ttokenRaw := getImageBase64(tid)\n\tgnft.SetTokenURI(tid, grc721.TokenURI(tokenRaw))\n}\n\nfunc Burn(tid grc721.TokenID) {\n\tcaller := std.PrevRealm().Addr()\n\tassertIsAdmin(caller)\n\terr := gnft.Burn(tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc SetAdmin(newAdmin pusers.AddressOrName) {\n\tcaller := std.PrevRealm().Addr()\n\tassertIsAdmin(caller)\n\tadmin = users.Resolve(newAdmin)\n}\n\n// Render\n\nfunc Render(path string) string {\n\tswitch {\n\tcase path == \"\":\n\t\treturn gnft.RenderHome()\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}\n\n// Util\nfunc assertIsAdmin(address std.Address) {\n\tif address != admin {\n\t\tpanic(\"restricted access\")\n\t}\n}\n\nfunc Exists(tid grc721.TokenID) bool {\n\t_, err := gnft.OwnerOf(tid)\n\tif err != nil {\n\t\treturn false\n\t}\n\n\treturn true\n}\n"},{"name":"gnft_test.gno","body":"package gnft\n\nimport (\n\t\"std\"\n\t\"testing\"\n\n\tpusers \"gno.land/p/demo/users\"\n)\n\nfunc TestGNFT(t *testing.T) {\n\t// admin := pusers.AddressOrName(\"g1y3uyaa63sjxvah2cx3c2usavwvx97kl8m2v7ye\")\n\tadminRealm := std.NewUserRealm(admin)\n\tstd.TestSetRealm(adminRealm)\n\n\tadminUser := pusers.AddressOrName(admin)\n\n\t// mint to admin\n\tMint(adminUser, \"1\")\n\tMint(adminUser, \"2\")\n\tMint(adminUser, \"3\")\n\tMint(adminUser, \"4\")\n\tMint(adminUser, \"5\")\n\tMint(adminUser, \"6\")\n\tMint(adminUser, \"7\")\n\tMint(adminUser, \"8\")\n\tMint(adminUser, \"9\")\n\tMint(adminUser, \"10\")\n}\n\nfunc TestGetTokenURI(t *testing.T) {\n\turl := GetTokenURI(\"1\")\n\tif url != NFT_IMAGE_01 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_01, url)\n\t}\n\n\turl = GetTokenURI(\"2\")\n\tif url != NFT_IMAGE_02 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_02, url)\n\t}\n\n\turl = GetTokenURI(\"3\")\n\tif url != NFT_IMAGE_03 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_03, url)\n\t}\n\n\turl = GetTokenURI(\"4\")\n\tif url != NFT_IMAGE_04 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_04, url)\n\t}\n\n\turl = GetTokenURI(\"5\")\n\tif url != NFT_IMAGE_05 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_05, url)\n\t}\n\n\turl = GetTokenURI(\"6\")\n\tif url != NFT_IMAGE_03 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_03, url)\n\t}\n\n\turl = GetTokenURI(\"7\")\n\tif url != NFT_IMAGE_01 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_01, url)\n\t}\n\n\turl = GetTokenURI(\"7\")\n\tif url != NFT_IMAGE_01 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_01, url)\n\t}\n\n\turl = GetTokenURI(\"8\")\n\tif url != NFT_IMAGE_04 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_04, url)\n\t}\n\n\turl = GetTokenURI(\"9\")\n\tif url != NFT_IMAGE_03 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_03, url)\n\t}\n\n\turl = GetTokenURI(\"10\")\n\tif url != NFT_IMAGE_05 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_05, url)\n\t}\n\n\t// PANIC\n\tshouldPanicWithMsg(\n\t\tt,\n\t\tfunc() {\n\t\t\tGetTokenURI(\"11\")\n\t\t},\n\t\t\"invalid token id\",\n\t)\n\n}\n\nfunc shouldPanicWithMsg(t *testing.T, f func(), msg string) {\n\tdefer func() {\n\t\tif r := recover(); r == nil {\n\t\t\tt.Errorf(\"The code did not panic\")\n\t\t} else {\n\t\t\tif r != msg {\n\t\t\t\tt.Errorf(\"excepted panic(%v), got(%v)\", msg, r)\n\t\t\t}\n\t\t}\n\t}()\n\tf()\n}\n"},{"name":"gno.mod","body":"module gno.land/r/gnoswap/gnft\n\nrequire (\n\tgno.land/p/demo/grc/grc721 v0.0.0-latest\n\tgno.land/p/demo/ufmt v0.0.0-latest\n\tgno.land/p/demo/users v0.0.0-latest\n\tgno.land/r/demo/users v0.0.0-latest\n)\n"},{"name":"svg_base64.gno","body":"package gnft\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/p/demo/grc/grc721\"\n)\n\nconst (\n\tNFT_IMAGE_01 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81Njg5NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTY4OTYiIHgxPSIxMi45Mjk4IiB5MT0iMTMuOTI5OCIgeDI9IjEyMS4wNyIgeTI9IjEyMi4wNyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjMjUwREUxIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzhFMzBCMCIvPgo8L2xpbmVhckdyYWRpZW50Pgo8L2RlZnM+Cjwvc3ZnPgo=`\n\tNFT_IMAGE_02 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81Njk0NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTY5NDYiIHgxPSIxMC45NjM2IiB5MT0iMTEuOTYzNiIgeDI9IjEyMy4wMzYiIHkyPSIxMjQuMDM2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNEOEFENTQiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDIyQjAwIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg==`\n\tNFT_IMAGE_03 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81Njk5NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTY5OTYiIHgxPSI0LjEwMjA0IiB5MT0iNS4xMDIwNCIgeDI9IjEyOS44OTgiIHkyPSIxMzAuODk4IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNBQjQ0MzMiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjREE5OUVEIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg==`\n\tNFT_IMAGE_04 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81NzA0NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTcwNDYiIHgxPSI1LjM2IiB5MT0iNi4zNiIgeDI9IjEyOC42NCIgeTI9IjEyOS42NCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjNUIwMjJFIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzdEMkE3RCIvPgo8L2xpbmVhckdyYWRpZW50Pgo8L2RlZnM+Cjwvc3ZnPgo=`\n\tNFT_IMAGE_05 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81Njg0NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTY4NDYiIHgxPSIxMzguMDg5IiB5MT0iMTU0Ljg1MyIgeDI9Ii01Ljc2MDI4IiB5Mj0iMTUzLjciIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzUzNkNENyIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMyMzNEQkQiLz4KPC9saW5lYXJHcmFkaWVudD4KPC9kZWZzPgo8L3N2Zz4K`\n)\n\nfunc getImageBase64(tid grc721.TokenID) string {\n\tstringId := string(tid)\n\tuintId, err := strconv.Atoi(stringId)\n\tif err != nil {\n\t\t// panic(err.Error())\n\t\treturn \"ERROR_TOKEN_URI\"\n\t}\n\n\tif uintId%5 == 0 {\n\t\treturn NFT_IMAGE_05\n\t} else if uintId%4 == 0 {\n\t\treturn NFT_IMAGE_04\n\t} else if uintId%3 == 0 {\n\t\treturn NFT_IMAGE_03\n\t} else if uintId%2 == 0 {\n\t\treturn NFT_IMAGE_02\n\t} else {\n\t\treturn NFT_IMAGE_01\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"WAzDq0OEqI+vV1tvdNKtoEZAS6IfH1oiQprCZ6x+2CN3BGnUk0/blovPKUxyEvV0Blazu4OPyBygkucxsCndyA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"gnft","path":"gno.land/r/demo/nft1234","files":[{"name":"gnft.gno","body":"package gnft\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/grc/grc721\"\n\t\"gno.land/r/demo/users\"\n\n\tpusers \"gno.land/p/demo/users\"\n)\n\nvar (\n\tadmin std.Address = \"g1y3uyaa63sjxvah2cx3c2usavwvx97kl8m2v7ye\" // deployed position contract\n\tgnft = grc721.NewBasicNFT(\"GNOSWAP NFT\", \"GNFT\")\n)\n\nfunc init() {\n\ttid := grc721.TokenID(\"99\")\n\terr := gnft.Mint(admin, tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\ttokenRaw := getImageBase64(tid)\n\tgnft.SetTokenURI(tid, grc721.TokenURI(tokenRaw))\n}\n\n// Getters\nfunc TotalSupply() uint64 {\n\treturn gnft.TokenCount()\n}\n\nfunc GetTokenURI(tid grc721.TokenID) string {\n\turi, err := gnft.TokenURI(tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\treturn string(uri)\n}\n\nfunc BalanceOf(user pusers.AddressOrName) uint64 {\n\tbalance, err := gnft.BalanceOf(users.Resolve(user))\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\treturn balance\n}\n\nfunc OwnerOf(tid grc721.TokenID) std.Address {\n\towner, err := gnft.OwnerOf(tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\treturn owner\n}\n\nfunc IsApprovedForAll(owner, user pusers.AddressOrName) bool {\n\treturn gnft.IsApprovedForAll(users.Resolve(owner), users.Resolve(user))\n}\n\nfunc GetApproved(tid grc721.TokenID) (std.Address, bool) {\n\taddr, err := gnft.GetApproved(tid)\n\tif err != nil {\n\t\treturn \"\", false\n\t}\n\n\treturn addr, true\n}\n\n// Setters\n\nfunc Approve(user pusers.AddressOrName, tid grc721.TokenID) {\n\terr := gnft.Approve(users.Resolve(user), tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc SetApprovalForAll(user pusers.AddressOrName, approved bool) {\n\terr := gnft.SetApprovalForAll(users.Resolve(user), approved)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc TransferFrom(from, to pusers.AddressOrName, tid grc721.TokenID) {\n\terr := gnft.TransferFrom(users.Resolve(from), users.Resolve(to), tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\n// Admin\n\nfunc Mint(to pusers.AddressOrName, tid grc721.TokenID) {\n\tcaller := std.PrevRealm().Addr()\n\tassertIsAdmin(caller)\n\terr := gnft.Mint(users.Resolve(to), tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\ttokenRaw := getImageBase64(tid)\n\tgnft.SetTokenURI(tid, grc721.TokenURI(tokenRaw))\n}\n\nfunc Burn(tid grc721.TokenID) {\n\tcaller := std.PrevRealm().Addr()\n\tassertIsAdmin(caller)\n\terr := gnft.Burn(tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc SetAdmin(newAdmin pusers.AddressOrName) {\n\tcaller := std.PrevRealm().Addr()\n\tassertIsAdmin(caller)\n\tadmin = users.Resolve(newAdmin)\n}\n\n// Render\n\nfunc Render(path string) string {\n\tswitch {\n\tcase path == \"\":\n\t\treturn gnft.RenderHome()\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}\n\n// Util\nfunc assertIsAdmin(address std.Address) {\n\tif address != admin {\n\t\tpanic(\"restricted access\")\n\t}\n}\n\nfunc Exists(tid grc721.TokenID) bool {\n\t_, err := gnft.OwnerOf(tid)\n\tif err != nil {\n\t\treturn false\n\t}\n\n\treturn true\n}\n"},{"name":"gnft_test.gno","body":"package gnft\n\nimport (\n\t\"std\"\n\t\"testing\"\n\n\tpusers \"gno.land/p/demo/users\"\n)\n\nfunc TestGNFT(t *testing.T) {\n\t// admin := pusers.AddressOrName(\"g1y3uyaa63sjxvah2cx3c2usavwvx97kl8m2v7ye\")\n\tadminRealm := std.NewUserRealm(admin)\n\tstd.TestSetRealm(adminRealm)\n\n\tadminUser := pusers.AddressOrName(admin)\n\n\t// mint to admin\n\tMint(adminUser, \"1\")\n\tMint(adminUser, \"2\")\n\tMint(adminUser, \"3\")\n\tMint(adminUser, \"4\")\n\tMint(adminUser, \"5\")\n\tMint(adminUser, \"6\")\n\tMint(adminUser, \"7\")\n\tMint(adminUser, \"8\")\n\tMint(adminUser, \"9\")\n\tMint(adminUser, \"10\")\n}\n\nfunc TestGetTokenURI(t *testing.T) {\n\turl := GetTokenURI(\"1\")\n\tif url != NFT_IMAGE_01 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_01, url)\n\t}\n\n\turl = GetTokenURI(\"2\")\n\tif url != NFT_IMAGE_02 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_02, url)\n\t}\n\n\turl = GetTokenURI(\"3\")\n\tif url != NFT_IMAGE_03 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_03, url)\n\t}\n\n\turl = GetTokenURI(\"4\")\n\tif url != NFT_IMAGE_04 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_04, url)\n\t}\n\n\turl = GetTokenURI(\"5\")\n\tif url != NFT_IMAGE_05 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_05, url)\n\t}\n\n\turl = GetTokenURI(\"6\")\n\tif url != NFT_IMAGE_03 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_03, url)\n\t}\n\n\turl = GetTokenURI(\"7\")\n\tif url != NFT_IMAGE_01 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_01, url)\n\t}\n\n\turl = GetTokenURI(\"7\")\n\tif url != NFT_IMAGE_01 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_01, url)\n\t}\n\n\turl = GetTokenURI(\"8\")\n\tif url != NFT_IMAGE_04 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_04, url)\n\t}\n\n\turl = GetTokenURI(\"9\")\n\tif url != NFT_IMAGE_03 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_03, url)\n\t}\n\n\turl = GetTokenURI(\"10\")\n\tif url != NFT_IMAGE_05 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_05, url)\n\t}\n\n\t// PANIC\n\tshouldPanicWithMsg(\n\t\tt,\n\t\tfunc() {\n\t\t\tGetTokenURI(\"11\")\n\t\t},\n\t\t\"invalid token id\",\n\t)\n\n}\n\nfunc shouldPanicWithMsg(t *testing.T, f func(), msg string) {\n\tdefer func() {\n\t\tif r := recover(); r == nil {\n\t\t\tt.Errorf(\"The code did not panic\")\n\t\t} else {\n\t\t\tif r != msg {\n\t\t\t\tt.Errorf(\"excepted panic(%v), got(%v)\", msg, r)\n\t\t\t}\n\t\t}\n\t}()\n\tf()\n}\n"},{"name":"gno.mod","body":"module gno.land/r/gnoswap/gnft\n\nrequire (\n\tgno.land/p/demo/grc/grc721 v0.0.0-latest\n\tgno.land/p/demo/ufmt v0.0.0-latest\n\tgno.land/p/demo/users v0.0.0-latest\n\tgno.land/r/demo/users v0.0.0-latest\n)\n"},{"name":"svg_base64.gno","body":"package gnft\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/p/demo/grc/grc721\"\n)\n\nconst (\n\tNFT_IMAGE_01 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81Njg5NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTY4OTYiIHgxPSIxMi45Mjk4IiB5MT0iMTMuOTI5OCIgeDI9IjEyMS4wNyIgeTI9IjEyMi4wNyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjMjUwREUxIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzhFMzBCMCIvPgo8L2xpbmVhckdyYWRpZW50Pgo8L2RlZnM+Cjwvc3ZnPgo=`\n\tNFT_IMAGE_02 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81Njk0NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTY5NDYiIHgxPSIxMC45NjM2IiB5MT0iMTEuOTYzNiIgeDI9IjEyMy4wMzYiIHkyPSIxMjQuMDM2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNEOEFENTQiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDIyQjAwIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg==`\n\tNFT_IMAGE_03 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81Njk5NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTY5OTYiIHgxPSI0LjEwMjA0IiB5MT0iNS4xMDIwNCIgeDI9IjEyOS44OTgiIHkyPSIxMzAuODk4IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNBQjQ0MzMiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjREE5OUVEIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg==`\n\tNFT_IMAGE_04 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81NzA0NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTcwNDYiIHgxPSI1LjM2IiB5MT0iNi4zNiIgeDI9IjEyOC42NCIgeTI9IjEyOS42NCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjNUIwMjJFIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzdEMkE3RCIvPgo8L2xpbmVhckdyYWRpZW50Pgo8L2RlZnM+Cjwvc3ZnPgo=`\n\tNFT_IMAGE_05 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81Njg0NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTY4NDYiIHgxPSIxMzguMDg5IiB5MT0iMTU0Ljg1MyIgeDI9Ii01Ljc2MDI4IiB5Mj0iMTUzLjciIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzUzNkNENyIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMyMzNEQkQiLz4KPC9saW5lYXJHcmFkaWVudD4KPC9kZWZzPgo8L3N2Zz4K`\n)\n\nfunc getImageBase64(tid grc721.TokenID) string {\n\tstringId := string(tid)\n\tuintId, err := strconv.Atoi(stringId)\n\tif err != nil {\n\t\t// panic(err.Error())\n\t\treturn \"ERROR_TOKEN_URI\"\n\t}\n\n\tif uintId%5 == 0 {\n\t\treturn NFT_IMAGE_05\n\t} else if uintId%4 == 0 {\n\t\treturn NFT_IMAGE_04\n\t} else if uintId%3 == 0 {\n\t\treturn NFT_IMAGE_03\n\t} else if uintId%2 == 0 {\n\t\treturn NFT_IMAGE_02\n\t} else {\n\t\treturn NFT_IMAGE_01\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"Wz8YiqQ+17tSEc/ebsdFgdBKb0v9r89b0SjUFc215nR3Bc0YnNMJiNOE+D2Dn8tTrl3JnmJlmFhSbKYkB2J8Xg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"gnft","path":"gno.land/r/demo/nft2","files":[{"name":"gnft.gno","body":"package gnft\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/grc/grc721\"\n\t\"gno.land/r/demo/users\"\n\n\tpusers \"gno.land/p/demo/users\"\n\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar (\n\tadmin std.Address = \"g1y3uyaa63sjxvah2cx3c2usavwvx97kl8m2v7ye\" // deployed position contract\n\tgnft = grc721.NewBasicNFT(\"GNOSWAP NFT\", \"GNFT\")\n)\n\nfunc init() {\n\ttid := grc721.TokenID(\"99\")\n\terr := gnft.Mint(admin, tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\ttokenRaw := getImageBase64(tid)\n\tgnft.SetTokenURI(tid, grc721.TokenURI(tokenRaw))\n}\n\nfunc AMint() {\n\tstrTid := ufmt.Sprintf(\"%d\", TotalSupply()+1)\n\ttid := grc721.TokenID(strTid)\n\terr := gnft.Mint(admin, tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\ttokenRaw := getImageBase64(tid)\n\tgnft.SetTokenURI(tid, grc721.TokenURI(tokenRaw))\n\n}\n\n// Getters\nfunc TotalSupply() uint64 {\n\treturn gnft.TokenCount()\n}\n\nfunc GetTokenURI(tid grc721.TokenID) string {\n\turi, err := gnft.TokenURI(tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\treturn string(uri)\n}\n\nfunc BalanceOf(user pusers.AddressOrName) uint64 {\n\tbalance, err := gnft.BalanceOf(users.Resolve(user))\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\treturn balance\n}\n\nfunc OwnerOf(tid grc721.TokenID) std.Address {\n\towner, err := gnft.OwnerOf(tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\treturn owner\n}\n\nfunc IsApprovedForAll(owner, user pusers.AddressOrName) bool {\n\treturn gnft.IsApprovedForAll(users.Resolve(owner), users.Resolve(user))\n}\n\nfunc GetApproved(tid grc721.TokenID) (std.Address, bool) {\n\taddr, err := gnft.GetApproved(tid)\n\tif err != nil {\n\t\treturn \"\", false\n\t}\n\n\treturn addr, true\n}\n\n// Setters\n\nfunc Approve(user pusers.AddressOrName, tid grc721.TokenID) {\n\terr := gnft.Approve(users.Resolve(user), tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc SetApprovalForAll(user pusers.AddressOrName, approved bool) {\n\terr := gnft.SetApprovalForAll(users.Resolve(user), approved)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc TransferFrom(from, to pusers.AddressOrName, tid grc721.TokenID) {\n\terr := gnft.TransferFrom(users.Resolve(from), users.Resolve(to), tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\n// Admin\n\nfunc Mint(to pusers.AddressOrName, tid grc721.TokenID) {\n\tcaller := std.PrevRealm().Addr()\n\tassertIsAdmin(caller)\n\terr := gnft.Mint(users.Resolve(to), tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\ttokenRaw := getImageBase64(tid)\n\tgnft.SetTokenURI(tid, grc721.TokenURI(tokenRaw))\n}\n\nfunc Burn(tid grc721.TokenID) {\n\tcaller := std.PrevRealm().Addr()\n\tassertIsAdmin(caller)\n\terr := gnft.Burn(tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc SetAdmin(newAdmin pusers.AddressOrName) {\n\tcaller := std.PrevRealm().Addr()\n\tassertIsAdmin(caller)\n\tadmin = users.Resolve(newAdmin)\n}\n\n// Render\n\nfunc Render(path string) string {\n\tswitch {\n\tcase path == \"\":\n\t\treturn gnft.RenderHome()\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}\n\n// Util\nfunc assertIsAdmin(address std.Address) {\n\tif address != admin {\n\t\tpanic(\"restricted access\")\n\t}\n}\n\nfunc Exists(tid grc721.TokenID) bool {\n\t_, err := gnft.OwnerOf(tid)\n\tif err != nil {\n\t\treturn false\n\t}\n\n\treturn true\n}\n"},{"name":"gnft_test.gno","body":"package gnft\n\nimport (\n\t\"std\"\n\t\"testing\"\n\n\tpusers \"gno.land/p/demo/users\"\n)\n\nfunc TestGNFT(t *testing.T) {\n\t// admin := pusers.AddressOrName(\"g1y3uyaa63sjxvah2cx3c2usavwvx97kl8m2v7ye\")\n\tadminRealm := std.NewUserRealm(admin)\n\tstd.TestSetRealm(adminRealm)\n\n\tadminUser := pusers.AddressOrName(admin)\n\n\t// mint to admin\n\tMint(adminUser, \"1\")\n\tMint(adminUser, \"2\")\n\tMint(adminUser, \"3\")\n\tMint(adminUser, \"4\")\n\tMint(adminUser, \"5\")\n\tMint(adminUser, \"6\")\n\tMint(adminUser, \"7\")\n\tMint(adminUser, \"8\")\n\tMint(adminUser, \"9\")\n\tMint(adminUser, \"10\")\n}\n\nfunc TestGetTokenURI(t *testing.T) {\n\turl := GetTokenURI(\"1\")\n\tif url != NFT_IMAGE_01 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_01, url)\n\t}\n\n\turl = GetTokenURI(\"2\")\n\tif url != NFT_IMAGE_02 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_02, url)\n\t}\n\n\turl = GetTokenURI(\"3\")\n\tif url != NFT_IMAGE_03 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_03, url)\n\t}\n\n\turl = GetTokenURI(\"4\")\n\tif url != NFT_IMAGE_04 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_04, url)\n\t}\n\n\turl = GetTokenURI(\"5\")\n\tif url != NFT_IMAGE_05 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_05, url)\n\t}\n\n\turl = GetTokenURI(\"6\")\n\tif url != NFT_IMAGE_03 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_03, url)\n\t}\n\n\turl = GetTokenURI(\"7\")\n\tif url != NFT_IMAGE_01 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_01, url)\n\t}\n\n\turl = GetTokenURI(\"7\")\n\tif url != NFT_IMAGE_01 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_01, url)\n\t}\n\n\turl = GetTokenURI(\"8\")\n\tif url != NFT_IMAGE_04 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_04, url)\n\t}\n\n\turl = GetTokenURI(\"9\")\n\tif url != NFT_IMAGE_03 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_03, url)\n\t}\n\n\turl = GetTokenURI(\"10\")\n\tif url != NFT_IMAGE_05 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_05, url)\n\t}\n\n\t// PANIC\n\tshouldPanicWithMsg(\n\t\tt,\n\t\tfunc() {\n\t\t\tGetTokenURI(\"11\")\n\t\t},\n\t\t\"invalid token id\",\n\t)\n\n}\n\nfunc shouldPanicWithMsg(t *testing.T, f func(), msg string) {\n\tdefer func() {\n\t\tif r := recover(); r == nil {\n\t\t\tt.Errorf(\"The code did not panic\")\n\t\t} else {\n\t\t\tif r != msg {\n\t\t\t\tt.Errorf(\"excepted panic(%v), got(%v)\", msg, r)\n\t\t\t}\n\t\t}\n\t}()\n\tf()\n}\n"},{"name":"gno.mod","body":"module gno.land/r/gnoswap/gnft\n\nrequire (\n\tgno.land/p/demo/grc/grc721 v0.0.0-latest\n\tgno.land/p/demo/ufmt v0.0.0-latest\n\tgno.land/p/demo/users v0.0.0-latest\n\tgno.land/r/demo/users v0.0.0-latest\n)\n"},{"name":"svg_base64.gno","body":"package gnft\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/p/demo/grc/grc721\"\n)\n\nconst (\n\tNFT_IMAGE_01 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81Njg5NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTY4OTYiIHgxPSIxMi45Mjk4IiB5MT0iMTMuOTI5OCIgeDI9IjEyMS4wNyIgeTI9IjEyMi4wNyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjMjUwREUxIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzhFMzBCMCIvPgo8L2xpbmVhckdyYWRpZW50Pgo8L2RlZnM+Cjwvc3ZnPgo=`\n\tNFT_IMAGE_02 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81Njk0NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTY5NDYiIHgxPSIxMC45NjM2IiB5MT0iMTEuOTYzNiIgeDI9IjEyMy4wMzYiIHkyPSIxMjQuMDM2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNEOEFENTQiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDIyQjAwIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg==`\n\tNFT_IMAGE_03 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81Njk5NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTY5OTYiIHgxPSI0LjEwMjA0IiB5MT0iNS4xMDIwNCIgeDI9IjEyOS44OTgiIHkyPSIxMzAuODk4IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNBQjQ0MzMiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjREE5OUVEIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg==`\n\tNFT_IMAGE_04 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81NzA0NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTcwNDYiIHgxPSI1LjM2IiB5MT0iNi4zNiIgeDI9IjEyOC42NCIgeTI9IjEyOS42NCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjNUIwMjJFIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzdEMkE3RCIvPgo8L2xpbmVhckdyYWRpZW50Pgo8L2RlZnM+Cjwvc3ZnPgo=`\n\tNFT_IMAGE_05 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81Njg0NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTY4NDYiIHgxPSIxMzguMDg5IiB5MT0iMTU0Ljg1MyIgeDI9Ii01Ljc2MDI4IiB5Mj0iMTUzLjciIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzUzNkNENyIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMyMzNEQkQiLz4KPC9saW5lYXJHcmFkaWVudD4KPC9kZWZzPgo8L3N2Zz4K`\n)\n\nfunc getImageBase64(tid grc721.TokenID) string {\n\tstringId := string(tid)\n\tuintId, err := strconv.Atoi(stringId)\n\tif err != nil {\n\t\t// panic(err.Error())\n\t\treturn \"ERROR_TOKEN_URI\"\n\t}\n\n\tif uintId%5 == 0 {\n\t\treturn NFT_IMAGE_05\n\t} else if uintId%4 == 0 {\n\t\treturn NFT_IMAGE_04\n\t} else if uintId%3 == 0 {\n\t\treturn NFT_IMAGE_03\n\t} else if uintId%2 == 0 {\n\t\treturn NFT_IMAGE_02\n\t} else {\n\t\treturn NFT_IMAGE_01\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"u9JcgFCdQB+VwAObl+VAbjlS1BISr5kCVVE+VZHfI8lX4UaOWIt2bBKl/6w8wmbG5sQ+BagAjAHQsprmQP6iPw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/nft2","func":"AMint","args":[""]}],"fee":{"gas_wanted":"3000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"Ybc6IeUVvrDWxhBON+BFjquw/nSlEgl4AM6XiQ0ni3AtpTogQH6QsDk86bD9QNuCgYgcrYDjscyWylLVZYw4uA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/nft2","func":"AMint","args":[""]}],"fee":{"gas_wanted":"3000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"bUPzwbl5Yhf7DOMFdUTpl6Q5OoaJGPdskaEHxlbVWxQ/hHKUrnl2AU4nsLQqba+Ws95SjfrIfMBodijkijqVGw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/nft2","func":"AMint","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"63MniPhkMiy6cBumHPBCWcGz7htL6j45wtetSFwG2gYe3OVIMmEZVyfkeO7hXaN0wNxGatX8WFGZEfSBQQrdpQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"gnft","path":"gno.land/r/demo/nft3","files":[{"name":"gnft.gno","body":"package gnft\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/grc/grc721\"\n\t\"gno.land/r/demo/users\"\n\n\tpusers \"gno.land/p/demo/users\"\n\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar (\n\tadmin std.Address = \"g1y3uyaa63sjxvah2cx3c2usavwvx97kl8m2v7ye\" // deployed position contract\n\tgnft = grc721.NewBasicNFT(\"GNOSWAP NFT\", \"GNFT\")\n)\n\nfunc init() {\n\ttid := grc721.TokenID(\"99\")\n\terr := gnft.Mint(admin, tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\ttokenRaw := getImageBase64(tid)\n\tgnft.SetTokenURI(tid, grc721.TokenURI(tokenRaw))\n}\n\nfunc AMint() string {\n\tstrTid := ufmt.Sprintf(\"%d\", TotalSupply()+1)\n\ttid := grc721.TokenID(strTid)\n\terr := gnft.Mint(admin, tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\ttokenRaw := getImageBase64(tid)\n\tok, err2 := gnft.SetTokenURI(tid, grc721.TokenURI(tokenRaw))\n\tif !ok {\n\t\tpanic(err2.Error())\n\t}\n\n\treturn strTid\n}\n\n// Getters\nfunc TotalSupply() uint64 {\n\treturn gnft.TokenCount()\n}\n\nfunc GetTokenURI(tid grc721.TokenID) string {\n\turi, err := gnft.TokenURI(tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\treturn string(uri)\n}\n\nfunc BalanceOf(user pusers.AddressOrName) uint64 {\n\tbalance, err := gnft.BalanceOf(users.Resolve(user))\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\treturn balance\n}\n\nfunc OwnerOf(tid grc721.TokenID) std.Address {\n\towner, err := gnft.OwnerOf(tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\treturn owner\n}\n\nfunc IsApprovedForAll(owner, user pusers.AddressOrName) bool {\n\treturn gnft.IsApprovedForAll(users.Resolve(owner), users.Resolve(user))\n}\n\nfunc GetApproved(tid grc721.TokenID) (std.Address, bool) {\n\taddr, err := gnft.GetApproved(tid)\n\tif err != nil {\n\t\treturn \"\", false\n\t}\n\n\treturn addr, true\n}\n\n// Setters\n\nfunc Approve(user pusers.AddressOrName, tid grc721.TokenID) {\n\terr := gnft.Approve(users.Resolve(user), tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc SetApprovalForAll(user pusers.AddressOrName, approved bool) {\n\terr := gnft.SetApprovalForAll(users.Resolve(user), approved)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc TransferFrom(from, to pusers.AddressOrName, tid grc721.TokenID) {\n\terr := gnft.TransferFrom(users.Resolve(from), users.Resolve(to), tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\n// Admin\n\nfunc Mint(to pusers.AddressOrName, tid grc721.TokenID) {\n\tcaller := std.PrevRealm().Addr()\n\tassertIsAdmin(caller)\n\terr := gnft.Mint(users.Resolve(to), tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\ttokenRaw := getImageBase64(tid)\n\tgnft.SetTokenURI(tid, grc721.TokenURI(tokenRaw))\n}\n\nfunc Burn(tid grc721.TokenID) {\n\tcaller := std.PrevRealm().Addr()\n\tassertIsAdmin(caller)\n\terr := gnft.Burn(tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc SetAdmin(newAdmin pusers.AddressOrName) {\n\tcaller := std.PrevRealm().Addr()\n\tassertIsAdmin(caller)\n\tadmin = users.Resolve(newAdmin)\n}\n\n// Render\n\nfunc Render(path string) string {\n\tswitch {\n\tcase path == \"\":\n\t\treturn gnft.RenderHome()\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}\n\n// Util\nfunc assertIsAdmin(address std.Address) {\n\tif address != admin {\n\t\tpanic(\"restricted access\")\n\t}\n}\n\nfunc Exists(tid grc721.TokenID) bool {\n\t_, err := gnft.OwnerOf(tid)\n\tif err != nil {\n\t\treturn false\n\t}\n\n\treturn true\n}\n"},{"name":"gnft_test.gno","body":"package gnft\n\nimport (\n\t\"std\"\n\t\"testing\"\n\n\tpusers \"gno.land/p/demo/users\"\n)\n\nfunc TestGNFT(t *testing.T) {\n\t// admin := pusers.AddressOrName(\"g1y3uyaa63sjxvah2cx3c2usavwvx97kl8m2v7ye\")\n\tadminRealm := std.NewUserRealm(admin)\n\tstd.TestSetRealm(adminRealm)\n\n\tadminUser := pusers.AddressOrName(admin)\n\n\t// mint to admin\n\tMint(adminUser, \"1\")\n\tMint(adminUser, \"2\")\n\tMint(adminUser, \"3\")\n\tMint(adminUser, \"4\")\n\tMint(adminUser, \"5\")\n\tMint(adminUser, \"6\")\n\tMint(adminUser, \"7\")\n\tMint(adminUser, \"8\")\n\tMint(adminUser, \"9\")\n\tMint(adminUser, \"10\")\n}\n\nfunc TestGetTokenURI(t *testing.T) {\n\turl := GetTokenURI(\"1\")\n\tif url != NFT_IMAGE_01 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_01, url)\n\t}\n\n\turl = GetTokenURI(\"2\")\n\tif url != NFT_IMAGE_02 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_02, url)\n\t}\n\n\turl = GetTokenURI(\"3\")\n\tif url != NFT_IMAGE_03 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_03, url)\n\t}\n\n\turl = GetTokenURI(\"4\")\n\tif url != NFT_IMAGE_04 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_04, url)\n\t}\n\n\turl = GetTokenURI(\"5\")\n\tif url != NFT_IMAGE_05 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_05, url)\n\t}\n\n\turl = GetTokenURI(\"6\")\n\tif url != NFT_IMAGE_03 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_03, url)\n\t}\n\n\turl = GetTokenURI(\"7\")\n\tif url != NFT_IMAGE_01 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_01, url)\n\t}\n\n\turl = GetTokenURI(\"7\")\n\tif url != NFT_IMAGE_01 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_01, url)\n\t}\n\n\turl = GetTokenURI(\"8\")\n\tif url != NFT_IMAGE_04 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_04, url)\n\t}\n\n\turl = GetTokenURI(\"9\")\n\tif url != NFT_IMAGE_03 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_03, url)\n\t}\n\n\turl = GetTokenURI(\"10\")\n\tif url != NFT_IMAGE_05 {\n\t\tt.Errorf(\"expected %s, got %s\", NFT_IMAGE_05, url)\n\t}\n\n\t// PANIC\n\tshouldPanicWithMsg(\n\t\tt,\n\t\tfunc() {\n\t\t\tGetTokenURI(\"11\")\n\t\t},\n\t\t\"invalid token id\",\n\t)\n\n}\n\nfunc shouldPanicWithMsg(t *testing.T, f func(), msg string) {\n\tdefer func() {\n\t\tif r := recover(); r == nil {\n\t\t\tt.Errorf(\"The code did not panic\")\n\t\t} else {\n\t\t\tif r != msg {\n\t\t\t\tt.Errorf(\"excepted panic(%v), got(%v)\", msg, r)\n\t\t\t}\n\t\t}\n\t}()\n\tf()\n}\n"},{"name":"gno.mod","body":"module gno.land/r/gnoswap/gnft\n\nrequire (\n\tgno.land/p/demo/grc/grc721 v0.0.0-latest\n\tgno.land/p/demo/ufmt v0.0.0-latest\n\tgno.land/p/demo/users v0.0.0-latest\n\tgno.land/r/demo/users v0.0.0-latest\n)\n"},{"name":"svg_base64.gno","body":"package gnft\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/p/demo/grc/grc721\"\n)\n\nconst (\n\tNFT_IMAGE_01 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81Njg5NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTY4OTYiIHgxPSIxMi45Mjk4IiB5MT0iMTMuOTI5OCIgeDI9IjEyMS4wNyIgeTI9IjEyMi4wNyIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjMjUwREUxIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzhFMzBCMCIvPgo8L2xpbmVhckdyYWRpZW50Pgo8L2RlZnM+Cjwvc3ZnPgo=`\n\tNFT_IMAGE_02 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81Njk0NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTY5NDYiIHgxPSIxMC45NjM2IiB5MT0iMTEuOTYzNiIgeDI9IjEyMy4wMzYiIHkyPSIxMjQuMDM2IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNEOEFENTQiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjMDIyQjAwIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg==`\n\tNFT_IMAGE_03 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81Njk5NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTY5OTYiIHgxPSI0LjEwMjA0IiB5MT0iNS4xMDIwNCIgeDI9IjEyOS44OTgiIHkyPSIxMzAuODk4IiBncmFkaWVudFVuaXRzPSJ1c2VyU3BhY2VPblVzZSI+CjxzdG9wIHN0b3AtY29sb3I9IiNBQjQ0MzMiLz4KPHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjREE5OUVEIi8+CjwvbGluZWFyR3JhZGllbnQ+CjwvZGVmcz4KPC9zdmc+Cg==`\n\tNFT_IMAGE_04 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81NzA0NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTcwNDYiIHgxPSI1LjM2IiB5MT0iNi4zNiIgeDI9IjEyOC42NCIgeTI9IjEyOS42NCIgZ3JhZGllbnRVbml0cz0idXNlclNwYWNlT25Vc2UiPgo8c3RvcCBzdG9wLWNvbG9yPSIjNUIwMjJFIi8+CjxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvcj0iIzdEMkE3RCIvPgo8L2xpbmVhckdyYWRpZW50Pgo8L2RlZnM+Cjwvc3ZnPgo=`\n\tNFT_IMAGE_05 = `PHN2ZyB3aWR0aD0iMTM1IiBoZWlnaHQ9IjEzNSIgdmlld0JveD0iMCAwIDEzNSAxMzUiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxjaXJjbGUgY3g9IjY3IiBjeT0iNjgiIHI9IjQ2IiBmaWxsPSJ1cmwoI3BhaW50MF9saW5lYXJfNzY5OF81Njg0NikiLz4KPHBhdGggZD0iTTU4Ljc3MzQgNTMuNjgyOEw2Ny40OTQxIDQ4TDg1LjAwMDIgNTkuMzE3OEw3Ni4yOTI3IDY0Ljk5NTdMNTguNzczNCA1My42ODI4WiIgZmlsbD0id2hpdGUiLz4KPHBhdGggZD0iTTU4Ljk1NDEgNjcuNzE3N0w2Ny42NzQ4IDYyLjAzNDlMODUuMDAwMSA3My4xODA0TDc2LjQ1MzYgNzguOTU5Nkw1OC45NTQxIDY3LjcxNzdaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjQiLz4KPHBhdGggZD0iTTUwLjAyNjkgNzUuODYwNUw1OC43NzM1IDcwLjE3NzdMNzYuMjQwOCA4MS41MTdMNjcuNDk0MiA4Ny4xNDcyTDUwLjAyNjkgNzUuODYwNVoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNNTAuMDAxIDU5LjMxNzRMNTguNzcyNCA1My42NjcyTDU4Ljc3MjQgNzAuMTc5N0w1MC4wMDEgNzUuODczN0w1MC4wMDEgNTkuMzE3NFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik03Ni40NTQ1IDc4Ljk1OThMODUuMDAxNyA3My4xODA3TDg1LjAwMTcgNzUuODMwMkw3Ni4yNzM0IDgxLjUwMjNMNzYuNDU0NSA3OC45NTk4WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC41Ii8+CjxwYXRoIGQ9Ik01OC43NzM0IDUzLjY4MjhMNjcuNDk0MSA0OEw4NS4wMDAyIDU5LjMxNzhMNzYuMjkyNyA2NC45OTU3TDU4Ljc3MzQgNTMuNjgyOFoiIGZpbGw9IndoaXRlIi8+CjxwYXRoIGQ9Ik01OC45NTQxIDY3LjcxNzdMNjcuNjc0OCA2Mi4wMzQ5TDg1LjAwMDEgNzMuMTgwNEw3Ni40NTM2IDc4Ljk1OTZMNTguOTU0MSA2Ny43MTc3WiIgZmlsbD0id2hpdGUiIGZpbGwtb3BhY2l0eT0iMC40Ii8+CjxwYXRoIGQ9Ik01MC4wMjY5IDc1Ljg2MDVMNTguNzczNSA3MC4xNzc3TDc2LjI0MDggODEuNTE3TDY3LjQ5NDIgODcuMTQ3Mkw1MC4wMjY5IDc1Ljg2MDVaIiBmaWxsPSJ3aGl0ZSIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTUwLjAwMSA1OS4zMTc0TDU4Ljc3MjQgNTMuNjY3Mkw1OC43NzI0IDcwLjE3OTdMNTAuMDAxIDc1Ljg3MzdMNTAuMDAxIDU5LjMxNzRaIiBmaWxsPSJ3aGl0ZSIvPgo8cGF0aCBkPSJNNzYuNDU0NSA3OC45NTk4TDg1LjAwMTcgNzMuMTgwN0w4NS4wMDE3IDc1LjgzMDJMNzYuMjczNCA4MS41MDIzTDc2LjQ1NDUgNzguOTU5OFoiIGZpbGw9IndoaXRlIiBmaWxsLW9wYWNpdHk9IjAuNSIvPgo8ZGVmcz4KPGxpbmVhckdyYWRpZW50IGlkPSJwYWludDBfbGluZWFyXzc2OThfNTY4NDYiIHgxPSIxMzguMDg5IiB5MT0iMTU0Ljg1MyIgeDI9Ii01Ljc2MDI4IiB5Mj0iMTUzLjciIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj4KPHN0b3Agc3RvcC1jb2xvcj0iIzUzNkNENyIvPgo8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3I9IiMyMzNEQkQiLz4KPC9saW5lYXJHcmFkaWVudD4KPC9kZWZzPgo8L3N2Zz4K`\n)\n\nfunc getImageBase64(tid grc721.TokenID) string {\n\tstringId := string(tid)\n\tuintId, err := strconv.Atoi(stringId)\n\tif err != nil {\n\t\t// panic(err.Error())\n\t\treturn \"ERROR_TOKEN_URI\"\n\t}\n\n\tif uintId%5 == 0 {\n\t\treturn NFT_IMAGE_05\n\t} else if uintId%4 == 0 {\n\t\treturn NFT_IMAGE_04\n\t} else if uintId%3 == 0 {\n\t\treturn NFT_IMAGE_03\n\t} else if uintId%2 == 0 {\n\t\treturn NFT_IMAGE_02\n\t} else {\n\t\treturn NFT_IMAGE_01\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"I3IiPWvwuRIMC7R9y2sXsikKJdPofCutZPNSxhV0FCMku0hNltKQNEzr6vovX5syVOsH647w2hDxciKE/+bgVQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"gnft","path":"gno.land/r/demo/nft4","files":[{"name":"gnft.gno","body":"package gnft\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/grc/grc721\"\n\t\"gno.land/r/demo/users\"\n\n\tpusers \"gno.land/p/demo/users\"\n\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar (\n\tadmin std.Address = \"g1y3uyaa63sjxvah2cx3c2usavwvx97kl8m2v7ye\" // deployed position contract\n\tgnft = grc721.NewBasicNFT(\"GNOSWAP NFT\", \"GNFT\")\n)\n\nfunc init() {}\n\nfunc AMint() grc721.TokenID {\n\tstrTid := ufmt.Sprintf(\"%d\", TotalSupply()+1)\n\ttid := grc721.TokenID(strTid)\n\n\t// self mint\n\terr := gnft.Mint(std.CurrentRealm().Addr(), tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\t// set token uri\n\ttokenURI := genImageURI()\n\tok, err2 := gnft.SetTokenURI(tid, grc721.TokenURI(tokenURI))\n\tif !ok {\n\t\tpanic(err2.Error())\n\t}\n\n\t// then transfer\n\torig := std.GetOrigCaller()\n\terr = gnft.TransferFrom(std.CurrentRealm().Addr(), orig, tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\treturn tid\n}\n\n// Getters\nfunc TotalSupply() uint64 {\n\treturn gnft.TokenCount()\n}\n\nfunc GetTokenURI(tid grc721.TokenID) string {\n\turi, err := gnft.TokenURI(tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\treturn string(uri)\n}\n\nfunc BalanceOf(user pusers.AddressOrName) uint64 {\n\tbalance, err := gnft.BalanceOf(users.Resolve(user))\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\treturn balance\n}\n\nfunc OwnerOf(tid grc721.TokenID) std.Address {\n\towner, err := gnft.OwnerOf(tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\treturn owner\n}\n\nfunc IsApprovedForAll(owner, user pusers.AddressOrName) bool {\n\treturn gnft.IsApprovedForAll(users.Resolve(owner), users.Resolve(user))\n}\n\nfunc GetApproved(tid grc721.TokenID) (std.Address, bool) {\n\taddr, err := gnft.GetApproved(tid)\n\tif err != nil {\n\t\treturn \"\", false\n\t}\n\n\treturn addr, true\n}\n\n// Setters\n\nfunc Approve(user pusers.AddressOrName, tid grc721.TokenID) {\n\terr := gnft.Approve(users.Resolve(user), tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc SetApprovalForAll(user pusers.AddressOrName, approved bool) {\n\terr := gnft.SetApprovalForAll(users.Resolve(user), approved)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc TransferFrom(from, to pusers.AddressOrName, tid grc721.TokenID) {\n\terr := gnft.TransferFrom(users.Resolve(from), users.Resolve(to), tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\n// Admin\n\nfunc Mint(to pusers.AddressOrName, tid grc721.TokenID) {\n\tcaller := std.PrevRealm().Addr()\n\tassertIsAdmin(caller)\n\terr := gnft.Mint(users.Resolve(to), tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\n\t// ONLY owner(to) can SetTokenURI\n\t/*\n\t\ttokenRaw := getImageBase64(tid)\n\t\tgnft.SetTokenURI(tid, grc721.TokenURI(tokenRaw))\n\t*/\n}\n\nfunc Burn(tid grc721.TokenID) {\n\tcaller := std.PrevRealm().Addr()\n\tassertIsAdmin(caller)\n\terr := gnft.Burn(tid)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n}\n\nfunc SetAdmin(newAdmin pusers.AddressOrName) {\n\tcaller := std.PrevRealm().Addr()\n\tassertIsAdmin(caller)\n\tadmin = users.Resolve(newAdmin)\n}\n\n// Render\n\nfunc Render(path string) string {\n\tswitch {\n\tcase path == \"\":\n\t\treturn gnft.RenderHome()\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}\n\n// Util\nfunc assertIsAdmin(address std.Address) {\n\tif address != admin {\n\t\tpanic(\"restricted access\")\n\t}\n}\n\nfunc Exists(tid grc721.TokenID) bool {\n\t_, err := gnft.OwnerOf(tid)\n\tif err != nil {\n\t\treturn false\n\t}\n\n\treturn true\n}\n"},{"name":"gnft_test.gno","body":"package gnft\n\nimport (\n\t\"std\"\n\t\"testing\"\n)\n\nfunc TestGNFT(t *testing.T) {\n\t// mint \u003e gnft \u003e set token uri \u003e transfer to\n\tprintln(\"TEST_(std.CurrentRealm():\", std.CurrentRealm())\n\tstd.TestSetRealm(std.CurrentRealm())\n\n\ttid := AMint()\n\towner := OwnerOf(tid)\n\tprintln(\"OWNER:\", owner)\n}\n"},{"name":"gno.mod","body":"module gno.land/r/gnoswap/gnft\n\nrequire (\n\tgno.land/p/demo/grc/grc721 v0.0.0-latest\n\tgno.land/p/demo/ufmt v0.0.0-latest\n\tgno.land/p/demo/users v0.0.0-latest\n\tgno.land/r/demo/users v0.0.0-latest\n)\n"},{"name":"svg_gen.gno","body":"package gnft\n\nimport (\n\t\"time\"\n\n\t\"math/rand\"\n\n\t\"gno.land/p/demo/ufmt\"\n\n\tb64 \"encoding/base64\"\n)\n\nvar baseTempalte = `\u003csvg width=\"135\" height=\"135\" viewBox=\"0 0 135 135\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\"\u003e\n\u003ccircle cx=\"67\" cy=\"68\" r=\"46\" fill=\"url(#paint0_linear_7698_56946)\"/\u003e\n\u003cpath d=\"M58.7734 53.6828L67.4941 48L85.0002 59.3178L76.2927 64.9957L58.7734 53.6828Z\" fill=\"white\"/\u003e\n\u003cpath d=\"M58.9541 67.7177L67.6748 62.0349L85.0001 73.1804L76.4536 78.9596L58.9541 67.7177Z\" fill=\"white\" fill-opacity=\"0.4\"/\u003e\n\u003cpath d=\"M50.0269 75.8605L58.7735 70.1777L76.2408 81.517L67.4942 87.1472L50.0269 75.8605Z\" fill=\"white\" fill-opacity=\"0.6\"/\u003e\n\u003cpath d=\"M50.001 59.3174L58.7724 53.6672L58.7724 70.1797L50.001 75.8737L50.001 59.3174Z\" fill=\"white\"/\u003e\n\u003cpath d=\"M76.4545 78.9598L85.0017 73.1807L85.0017 75.8302L76.2734 81.5023L76.4545 78.9598Z\" fill=\"white\" fill-opacity=\"0.5\"/\u003e\n\u003cpath d=\"M58.7734 53.6828L67.4941 48L85.0002 59.3178L76.2927 64.9957L58.7734 53.6828Z\" fill=\"white\"/\u003e\n\u003cpath d=\"M58.9541 67.7177L67.6748 62.0349L85.0001 73.1804L76.4536 78.9596L58.9541 67.7177Z\" fill=\"white\" fill-opacity=\"0.4\"/\u003e\n\u003cpath d=\"M50.0269 75.8605L58.7735 70.1777L76.2408 81.517L67.4942 87.1472L50.0269 75.8605Z\" fill=\"white\" fill-opacity=\"0.6\"/\u003e\n\u003cpath d=\"M50.001 59.3174L58.7724 53.6672L58.7724 70.1797L50.001 75.8737L50.001 59.3174Z\" fill=\"white\"/\u003e\n\u003cpath d=\"M76.4545 78.9598L85.0017 73.1807L85.0017 75.8302L76.2734 81.5023L76.4545 78.9598Z\" fill=\"white\" fill-opacity=\"0.5\"/\u003e\n\u003cdefs\u003e\n\u003clinearGradient id=\"paint0_linear_7698_56946\" x1=\"%d\" y1=\"%d\" x2=\"%d\" y2=\"%d\" gradientUnits=\"userSpaceOnUse\"\u003e\n\t\u003cstop stop-color=\"%s\"/\u003e\n\t\u003cstop offset=\"1\" stop-color=\"%s\"/\u003e\n\u003c/linearGradient\u003e\n\u003c/defs\u003e\n\u003c/svg\u003e\n`\n\n// range for hex color\nconst charset = \"0123456789ABCDEF\"\n\nfunc genImageURI() string {\n\timageRaw := genImageRaw()\n\tsEnc := b64.StdEncoding.EncodeToString([]byte(imageRaw))\n\n\treturn \"data:image/svg+xml;base64,\" + sEnc\n}\n\nfunc genImageRaw() string {\n\tseed1 := uint64(time.Now().Unix())\n\tseed2 := uint64(time.Now().UnixNano())\n\tpcg := rand.NewPCG(seed1, seed2)\n\tr := rand.New(pcg)\n\n\tx1 := randNumber(7, 13, r)\n\ty1 := randNumber(7, 13, r)\n\n\tx2 := randNumber(121, 126, r)\n\ty2 := randNumber(121, 126, r)\n\n\tcolor1 := randColor(r)\n\tcolor2 := randColor(r)\n\n\trandImage := ufmt.Sprintf(baseTempalte, x1, y1, x2, y2, color1, color2)\n\treturn randImage\n\n}\n\nfunc randNumber(lower, upper uint64, r *rand.Rand) uint64 {\n\treturn lower + uint64(r.IntN(int(upper-lower+1)))\n}\n\nfunc randColor(r *rand.Rand) string {\n\tcolor := \"#\"\n\tfor i := 0; i \u003c 6; i++ {\n\t\tcolor += string(charset[r.IntN(len(charset))])\n\t}\n\treturn color\n}\n"},{"name":"svg_gen_test.gno","body":"package gnft\n\nimport (\n\t\"testing\"\n)\n\nfunc TestFunc(t *testing.T) {\n\timageURI := genImageURI()\n\tprintln(imageURI)\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"icqmfIFnRyYbrRWUcn18D3oxHxBkyMC9cZ6/PZuZCfR2uiJln3HqMo+X20kV5H+M0DAs2eVYmNkHVIFmtGCRlw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1u4fysk6yxwhywy9zd6ljd3l2v20xqayd3m3spf","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"GCHQ1CtTkJUHYvgXFP/AyoJXsIYVsOSNWjjzEYoccsM05xoiq7TdT91g0wQ7r+dVOa6kavP/kYt6WlyKW5D1tQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1u4fysk6yxwhywy9zd6ljd3l2v20xqayd3m3spf","to_address":"g1uphjkkqccf24k598avpyfqs5scqcu39ysmj2jh","amount":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6iRcYxziQsRI73+gDu5Y+HPbpbgK8f+bH9TLZJo4pZw"},"signature":"DEbht2GsrDFazMklptscP8wrIINJPDO4Itl2oPilzFdUk2D2a73VxBM6VpC+Mhoy6FHM5rVDiQGUNIqu1c8gKw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1u4fysk6yxwhywy9zd6ljd3l2v20xqayd3m3spf","to_address":"g1u4fysk6yxwhywy9zd6ljd3l2v20xqayd3m3spf","amount":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6iRcYxziQsRI73+gDu5Y+HPbpbgK8f+bH9TLZJo4pZw"},"signature":"OIWCgUjGWvPDX4xhytDPdBMEwxt6wA822VSUeQatUD4bxbc/H60PKpJmoyCggBwJ0z7TrgGv7Mzzhxbe3R8Gtw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g12vx7dn3dqq89mz550zwunvg4qw6epq73d9csay","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"C/D5NyajfcRI7FeUKOjdu+eQ4jkf9eAMDFe0jpFDoQJVtu6bhGpTyb86eSZPAdvG6QA0tm0RFHDoQIQcBqmuSQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g12vx7dn3dqq89mz550zwunvg4qw6epq73d9csay","to_address":"g17m8hlvm3k0agngz8vw29etpcjd2yvcel6pvt3k","amount":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6/Tht9RvFvqjDoHGyl6CetXPZMDH3SyRzH9xo+l4j9s"},"signature":"ZjLi7KF69FOS8LJYU4dhTTBYQbQwiTQ7r1Yhg4mJsp0NrE0vRUceHPywHVI/0w7fR5/SNNxA7/gMhOwK+4AVIQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1xmamcpc60tc2tkqh3gxqqgd6n3rv7h2zgqmcr0","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"w3p+MSU7vHXaeeSzw602r/ukYnbGo/ZnPDbGdNmxElRJTA380vkBw+UvDIi5UWP1NZsoYVx8m6nyrwiMgKPTIg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1m77k7qgxlk37nfhclv62revp58fukx2fkhsp3x","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"U88lJetm8vZP80o8994gpULwZn8i+BCpYZaNtvdK7dAUtWgBy++3V+vYNPwphwSWGs0A3bWrmRsBprx0THjytg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1tltyhyh6enfjwfq8t7e0a2dr2rf35mdzmwl90l","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"R/hJgh6N/7zC5ESjFANs+0HoeozHu+bcPQFfttLyVdwEkWlVp2LvbMNnqocu6JoqzQ3CSlc0S2s/Z3xGSAA7TQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g19vhq0mzr8m99vap6g488ftddkkzf4rt8j9wg0j","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"UXlOpMVlP44Y3Il0LyP4p1QY5GvW40EEH77StcaRqcFaM4A54qtavMUQlJ7sNjpiryDIRlTkf6UTe+YjpNQcBA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1pf6yuy6h9lxqu2rzp7c9mhqntps6zvtf2s905n","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"MJqmnrjEf3d3cDqOB9EXedsZzo4MhLFdi0DMuHX7mpAP7gCArEGWpoLzypGP5GYu2L/zQPd76RgT5atzXazfqQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1pf6yuy6h9lxqu2rzp7c9mhqntps6zvtf2s905n","to_address":"g19vhq0mzr8m99vap6g488ftddkkzf4rt8j9wg0j","amount":"5000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxWYJRj+CHeZQVxDeD5KUcoKgbiVCcu1NyXqaZJYf/r7"},"signature":"4wYOjjY4XurUrVGig6rS2D8dS9F+bK7Gj92sVMwU8VEHtUiLueKcuRbx8ylSyi5pMm7W0nSME0Xp7AHoTUqUcg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1nn2le065kak2ke8xnarcv4fhd3nvcyq5jzxy5x","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"0xf8aksKgCBePrqb1QCNXvHo1rfUBAczVMKtl46REr00r2+GS6v8ZRvXDL5CG/aro46fmyZQjMi7FbzcwkZyTQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g12rlv38gkdpl43g5u9gwm5t59agdr4w5l527h9g","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"U83zqCvMyeVZH4MpEPI+g6DxN2f6sj4lPGrmerI7cTAQmN2YJinyD4Rx5qSaZEs7VH+298fFjzQoXMXBpoUh5g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1nn2le065kak2ke8xnarcv4fhd3nvcyq5jzxy5x","to_address":"g12rlv38gkdpl43g5u9gwm5t59agdr4w5l527h9g","amount":"5000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApcHBwNLaHRBGzEiT5smWSDWfaHoNb2TbA8EG+/jhvyd"},"signature":"7Rj04Td4i0dFvytac6dl45ALaxvgP5BQm8CjS0ltBrdAD31530vitE7hM3BmlhNf3tsMnMkEpeZIqLF0orJGNQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1f748xee7gpwldyrz4xea3nk6hw24lfya49fus8","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"dT85hruoBYlHNIHH8DAERn0DTOsw6k74TKMA7lrru3Fkyzlig0s1p1l2qsIt1uADIiU5cSdZo5dcsfj5VI/Mgw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1hnltudyua06ns4sasvl38ct0e4q9z76lk0nmf3","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OAweuReZmiGzmR/zXgrYehL6mQylSp+Mv3hHzneEnzNlcthO8gjEa7ejRRpSjtmYhCuDygs488PpGx6F/Okrrg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1hymmy4vm9vtwruvkvq6ac2nfpnzyzz9jr84k9t","send":"","pkg_path":"gno.land/r/demo/userbook","func":"SignUp","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1OYia6R6a9NhvzEPPKXcYHI+lxqXD33xB4WJnC+MeG2"},"signature":"lBB0/KHFyqsWKyQOuXDHGZTS7WTHdScKSsV2ImDGXD4K8UDt3igJ6S19usHIW2t3Q4N83wiZ1ozynujeJvUmqw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1dnllrdzwfhxv3evyk09y48mgn5phfjvtyrlzm7","package":{"name":"hello","path":"gno.land/r//hello","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n return \"Hello World!\"\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AsGEi/6/N0zRtRCWxHb7KZ1Z/BTfZIc77fvtkSRJlmwQ"},"signature":"0LTTqSQ8Avw1JcCWp6VJ6V779WkFDztgp9bxO/m1aEQ+My1RVboyBSgiaxX8sHJUIqjG66Izo3g4IUS0uGxvUQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1dnllrdzwfhxv3evyk09y48mgn5phfjvtyrlzm7","package":{"name":"hello","path":"gno.land/r//hello","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n return \"Hello World!\"\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AsGEi/6/N0zRtRCWxHb7KZ1Z/BTfZIc77fvtkSRJlmwQ"},"signature":"Xt+cg/uip3UZzNFUb9/vJLmGfDo2NoqA5fis8iWfsxU8GGi1jZwukTxAYzVLXCtEmBzy0aKsGfdpbo6vxWB0pA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g1dnllrdzwfhxv3evyk09y48mgn5phfjvtyrlzm7","send":"","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","salmad","Danny from DevX"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AsGEi/6/N0zRtRCWxHb7KZ1Z/BTfZIc77fvtkSRJlmwQ"},"signature":"Md6fV4FKz93QrNivsjwFtqR9rYzuLHbXXQtNAM3HfJhZdt3+KdGrCG8bpMYa3Im0S6URD9VHgeVKor6TtX1HeQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1mhnd9g3zcc8k9yh5lccjc9jtc2zk4w7n5gd0kl","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"pSEAoJeafr8edjpCm6b5aCeNpkBdcgGko9+9XgImEzl35jLOQ1OlsnKAuHMZX5qUj4WU37FzUNUPd2wzTBbAvw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1anajhdr28jlh4dd6dz5pzdjk0dsyqvc4ayk0aa","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"tzFhdWF3/9QyLROFZXata+zywFtX+wanehseXuUssh4jg08u0n0pR9KqnR8E1U6y7Do5yS1+EJtyMlpBu/4efA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1anajhdr28jlh4dd6dz5pzdjk0dsyqvc4ayk0aa","package":{"name":"hello","path":"gno.land/r/tus/hello","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A5VVQOKuIJduYT53isYRljsPqVIOmvoodigS0VTlJJpd"},"signature":"IgyIF8QVTig6zkB6huGLHXFCjyU9HJAyMiI6bhDAeLdvJIFO0wj4ekb2utpfMxtESSG8hhAho7gfI7NiQkmD8Q=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["test4-live","Blockchain Testnet Launched: Test4 Now Live","\n\nWe are excited to announce the launch of our blockchain testnet, Test4. This milestone marks a significant leap in our journey towards the gno.land mainnet, bringing new capabilities and stability to our development environment.\n\n## Key Features of Test4\n\n### Transition to a Decentralized Network\n\nTest4 is our first step towards a fully decentralized blockchain network. Unlike earlier stages, it supports multiple validator nodes, enhancing security and resilience. The initial validator set consists of:\n\n- Core engineering team\n- DevX team\n- Onbloc\n\nWhich brings us to the second major feature, the GovDAO.\n\n### GovDAO\n\nThe first iteration of the testing GovDAO enables on-chain voting and validator management. The initial GovDAO members are gno.land team members, major contributors and teams already building dapps on gno.land. The first voting proposals will be to add additional 3rd party validators:\n\n- Berty\n- Teritori\n- IrreverentSimplicity\n\nOur plan is to keep evolving the GovDAO mechanism, with the goal of setting up a decentralized entity that incentivizes members to be active and contribute to the gno.land project.\n\n### A Stable Environment for dApp Development\n\nTest4 is the first permanent and stable testnet for Gno.land, designed to avoid breaking changes. To help developers use it to build and test dApps, we've added Test4 to the [Faucet Hub](https://faucet.gno.land/); you're able to obtain test tokens and experiment without real consequences.\n\nWe've also collaborated with Onbloc to update [Adena](https://www.adena.app/), which now supports Test4 out of the box. Onbloc has also provided [GnoScan](https://gnoscan.io/), a transaction explorer to aid in smart contract development and troubleshooting.\n\n### Namespaces\n\nNamespaces provide users with the exclusive capability to publish contracts under their designated namespaces, similar to GitHub's user and organization model. Or simply put, you'll be able to claim a username and use it as your on-chain identity. Learn more about it in the [gno.land docs](https://docs.gno.land/concepts/namespaces/).\n\n## What's Next?\n\nWe've launched Test4 a few weeks ahead of the schedule - we'll be heads down the next few weeks fixing bugs and patching things. There's still a lot of work left before we get to a mainnet release candidate. That's where you come in: play around with Test4, break it, and [contribute](https://github.com/gnolang/gno/blob/master/CONTRIBUTING.md).\n\nOnly together we'll be able to build gno.land the right way. So let's get started, gnomies!","2024-07-17T00:00:00Z","Kouteki","gnoland,ecosystem,govdao,test4"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"AXk5FXkyXX1NBlfxbczJnBbCKBueDrh7iI0otasGMCZpFBoSuA6ibsK1crsPN/F38mdJ7b/B3Uvikn+EMUNsww=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1fj5smt5khargkn72eepekd75mf2j4z2kjc7e6s","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"mde5fQnaBE7LYWmTLzL2ia5XxJ6echTStMkzrd92EJVbFElyeVEqpbTm+WVi/V3xAGO7u5G7b1ez/83vOmYDxA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g10ecp6wq0qg352u9a59usqer7a9ddhkt6esxlyk","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"LaXAlGaCgNAeqYRohTXeHb27U0i0n/zNk4/21pe54k1Y3sZdRwOH/LStCrTTseHtSMk8HKWPOMH+geOhQuRKaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10ecp6wq0qg352u9a59usqer7a9ddhkt6esxlyk","package":{"name":"counter","path":"gno.land/r//counter","files":[{"name":"package_test.gno","body":"package counter\n\nimport \"testing\"\n\nfunc TestCounter_Increment(t *testing.T) {\n\t// Reset the value\n\tcount = 0\n\n\t// Verify the initial value is 0\n\tif count != 0 {\n\t\tt.Fatalf(\"initial value != 0\")\n\t}\n\n\t// Increment the value\n\tIncrement()\n\n\t// Verify the initial value is 1\n\tif count != 1 {\n\t\tt.Fatalf(\"initial value != 1\")\n\t}\n}\n\nfunc TestCounter_Decrement(t *testing.T) {\n\t// Reset the value\n\tcount = 0\n\n\t// Verify the initial value is 0\n\tif count != 0 {\n\t\tt.Fatalf(\"initial value != 0\")\n\t}\n\n\t// Decrement the value\n\tDecrement()\n\n\t// Verify the initial value is 1\n\tif count != -1 {\n\t\tt.Fatalf(\"initial value != -1\")\n\t}\n}\n\nfunc TestCounter_Render(t *testing.T) {\n\t// Reset the value\n\tcount = 0\n\n\t// Verify the Render output\n\tif Render(\"\") != \"Count: 0\" {\n\t\tt.Fatalf(\"invalid Render value\")\n\t}\n}\n\n// How to: Deploy using Gno Playground"},{"name":"package.gno","body":"package counter\n\nimport (\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar count int\n\nfunc Increment() {\n\tcount++\n}\n\nfunc Decrement() {\n\tcount--\n}\n\nfunc Render(_ string) string {\n\treturn ufmt.Sprintf(\"Count: %d\", count)\n}\n\n// How to: Deploy using Gno Playground"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4DG6oIEgozKfTIkVvbzNtSz+36Tr1iWAFhW1VuqHHym"},"signature":"YyMudShLdB2CpaMdqzseHINU9ba5QfWxg1yz7MExkfZ9PR8VIY2A6Zvw6zFepcyvHjGr3YvIa8yCmh3/MUkqQQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1mhnd9g3zcc8k9yh5lccjc9jtc2zk4w7n5gd0kl","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Id68QiK1O/qh5eXp2032HhKZ2rKgflHiv8YgS7uy2WE01JfF07Qsqa6SjRm0c/8BnfJxLqAg+z0IsxGavExSrw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1fj5smt5khargkn72eepekd75mf2j4z2kjc7e6s","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"thZBJIrUChiL/Y4oC+EyI9w/fQZn8Z5Ak6qm4NLhGCg0F4O5dQQWq1mHbz9wLkHRDztxFhCJFysHPd0uBb0ScQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1mhnd9g3zcc8k9yh5lccjc9jtc2zk4w7n5gd0kl","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1Ye5hLTaplwNz/H1oS+QheyqmkIXlcUwBmsZk86otd00R7JEdREAZSwo2cRfGOnCpKf7zpTZ5lSev7aQvJJ1lw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"echo","path":"gno.land/r//echo","files":[{"name":"package.gno","body":"package echo\n\nfunc Echo(s string) string {\n return s\n}"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"wMncME3WKI/zZwZsX7OxbfztXuEWpRAOAvZKzBjzDPcyAO4nzPb6V0av64TLywkmeiZa0BJqoGkKDJb+BP/t2Q=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"echo111","path":"gno.land/r//echo111","files":[{"name":"package.gno","body":"package echo\n\nfunc Echo(s string) string {\n return s\n}"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"MYKbla/RXv8GbyRMmgvgm7gio9mrprzL+gdWf2k9S9pkY3SP9ZVTP3a5r22GP0dYisClMwW13I9qNk8eQUWRxw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g16wjj9dpev357ehq9vmrea2ycnpd9xuk2c9nzuv","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"HEPzyoP8rVKMicwHlrlTSjj/k8h3MOjTV7vshxJ7GddNF66TPl3456qLvU2PUwxBmSDgjyR8eWr3g3MJ4UO+6w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g16wjj9dpev357ehq9vmrea2ycnpd9xuk2c9nzuv","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"q+i3x+Y8C9Ai9i0DRXIOPlHUmExwHpemVtT/FoaMDCNXzp4CbVeFOfI15Wq1pftcBhWaoaUVhV5XqTe7YXG4Cg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g16wjj9dpev357ehq9vmrea2ycnpd9xuk2c9nzuv","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"s1nSVSwibG6mIafQMJTbibsMow4+NHV4FM9m42Gc7Ik57A2iuqSvbOuvlmENBe1i9EdRRQpHRS0DL1RUzKsh0w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10ecp6wq0qg352u9a59usqer7a9ddhkt6esxlyk","package":{"name":"poll","path":"gno.land/r//poll","files":[{"name":"package.gno","body":"package poll\n\nimport (\n\t\"bytes\"\n\t\"std\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/poll\"\n\t\"gno.land/p/demo/seqid\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\n// state variables\nvar (\n\tpolls *avl.Tree // id -\u003e Poll\n\tpollIDCounter seqid.ID\n)\n\nfunc init() {\n\tpolls = avl.NewTree()\n}\n\n// NewPoll - Creates a new Poll instance\nfunc NewPoll(title, description string, deadline int64) string {\n\t// get block height\n\tif deadline \u003c= std.GetHeight() {\n\t\tpanic(\"deadline has to be in the future\")\n\t}\n\n\t// Generate int\n\tid := pollIDCounter.Next().String()\n\tp := poll.NewPoll(title, description, deadline)\n\n\t// add new poll in avl tree\n\tpolls.Set(id, p)\n\n\treturn ufmt.Sprintf(\"Successfully created poll #%s!\", id)\n}\n\n// Vote - vote for a specific Poll\n// yes - true, no - false\nfunc Vote(id string, vote bool) string {\n\t// get txSender\n\ttxSender := std.GetOrigCaller()\n\n\t// get specific Poll from AVL tree\n\tpollRaw, exists := polls.Get(id)\n\n\tif !exists {\n\t\tpanic(\"poll with specified doesn't exist\")\n\t}\n\n\t// cast Poll into proper format\n\tpoll, _ := pollRaw.(*poll.Poll)\n\n\tvoted, _ := poll.HasVoted(txSender)\n\tif voted {\n\t\tpanic(\"you've already voted!\")\n\t}\n\n\tif poll.Deadline() \u003c= std.GetHeight() {\n\t\tpanic(\"voting for this poll is closed\")\n\t}\n\n\t// record vote\n\tpoll.Vote(txSender, vote)\n\n\t// update Poll in tree\n\tpolls.Set(id, poll)\n\n\tif vote == true {\n\t\treturn ufmt.Sprintf(\"Successfully voted YAY for poll #%s!\", id)\n\t}\n\treturn ufmt.Sprintf(\"Successfully voted NAY for poll #%s!\", id)\n}\n\nfunc Render(path string) string {\n\tvar b bytes.Buffer\n\n\tb.WriteString(\"# Polls!\\n\\n\")\n\n\tif polls.Size() == 0 {\n\t\tb.WriteString(\"### No active polls currently!\")\n\t\treturn b.String()\n\t}\n\tpolls.Iterate(\"\", \"\", func(key string, value interface{}) bool {\n\n\t\t// cast raw data from tree into Poll struct\n\t\tp := value.(*poll.Poll)\n\t\tddl := p.Deadline()\n\n\t\tyay, nay := p.VoteCount()\n\t\tyayPercent := 0\n\t\tnayPercent := 0\n\n\t\tif yay+nay != 0 {\n\t\t\tyayPercent = yay * 100 / (yay + nay)\n\t\t\tnayPercent = nay * 100 / (yay + nay)\n\t\t}\n\n\t\tb.WriteString(\n\t\t\tufmt.Sprintf(\n\t\t\t\t\"## Poll #%s: %s\\n\",\n\t\t\t\tkey, // poll ID\n\t\t\t\tp.Title(),\n\t\t\t),\n\t\t)\n\n\t\tdropdown := \"\u003cdetails\u003e\\n\u003csummary\u003ePoll details\u003c/summary\u003e\u003cbr\u003e\"\n\n\t\tb.WriteString(dropdown + \"Description: \" + p.Description())\n\n\t\tb.WriteString(\n\t\t\tufmt.Sprintf(\"\u003cbr\u003eVoting until block: %d\u003cbr\u003eCurrent vote count: %d\",\n\t\t\t\tp.Deadline(),\n\t\t\t\tp.Voters().Size()),\n\t\t)\n\n\t\tb.WriteString(\n\t\t\tufmt.Sprintf(\"\u003cbr\u003eYAY votes: %d (%d%%)\", yay, yayPercent),\n\t\t)\n\t\tb.WriteString(\n\t\t\tufmt.Sprintf(\"\u003cbr\u003eNAY votes: %d (%d%%)\u003c/details\u003e\", nay, nayPercent),\n\t\t)\n\n\t\tdropdown = \"\u003cbr\u003e\u003cdetails\u003e\\n\u003csummary\u003eVote details\u003c/summary\u003e\"\n\t\tb.WriteString(dropdown)\n\n\t\tp.Voters().Iterate(\"\", \"\", func(key string, value interface{}) bool {\n\n\t\t\tvoter := key\n\t\t\tvote := value.(bool)\n\n\t\t\tif vote == true {\n\t\t\t\tb.WriteString(\n\t\t\t\t\tufmt.Sprintf(\"\u003cbr\u003e%s voted YAY!\", voter),\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tb.WriteString(\n\t\t\t\t\tufmt.Sprintf(\"\u003cbr\u003e%s voted NAY!\", voter),\n\t\t\t\t)\n\t\t\t}\n\t\t\treturn false\n\t\t})\n\n\t\tb.WriteString(\"\u003c/details\u003e\\n\\n\")\n\t\treturn false\n\t})\n\treturn b.String()\n}\n\n// How-to: Write Simple Dapp"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4DG6oIEgozKfTIkVvbzNtSz+36Tr1iWAFhW1VuqHHym"},"signature":"tGrCTvYf75NkpUK7u/wjK+C2bhjDp5BH1Fts+9dw0/AojFidTCoajBco4XVL7Ef2jqAsP5sVfyX9X0lKDVLQEA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g10ecp6wq0qg352u9a59usqer7a9ddhkt6esxlyk","package":{"name":"poll","path":"gno.land/r//poll","files":[{"name":"package.gno","body":"package poll\n\nimport (\n\t\"bytes\"\n\t\"std\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/poll\"\n\t\"gno.land/p/demo/seqid\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\n// state variables\nvar (\n\tpolls *avl.Tree // id -\u003e Poll\n\tpollIDCounter seqid.ID\n)\n\nfunc init() {\n\tpolls = avl.NewTree()\n}\n\n// NewPoll - Creates a new Poll instance\nfunc NewPoll(title, description string, deadline int64) string {\n\t// get block height\n\tif deadline \u003c= std.GetHeight() {\n\t\tpanic(\"deadline has to be in the future\")\n\t}\n\n\t// Generate int\n\tid := pollIDCounter.Next().String()\n\tp := poll.NewPoll(title, description, deadline)\n\n\t// add new poll in avl tree\n\tpolls.Set(id, p)\n\n\treturn ufmt.Sprintf(\"Successfully created poll #%s!\", id)\n}\n\n// Vote - vote for a specific Poll\n// yes - true, no - false\nfunc Vote(id string, vote bool) string {\n\t// get txSender\n\ttxSender := std.GetOrigCaller()\n\n\t// get specific Poll from AVL tree\n\tpollRaw, exists := polls.Get(id)\n\n\tif !exists {\n\t\tpanic(\"poll with specified doesn't exist\")\n\t}\n\n\t// cast Poll into proper format\n\tpoll, _ := pollRaw.(*poll.Poll)\n\n\tvoted, _ := poll.HasVoted(txSender)\n\tif voted {\n\t\tpanic(\"you've already voted!\")\n\t}\n\n\tif poll.Deadline() \u003c= std.GetHeight() {\n\t\tpanic(\"voting for this poll is closed\")\n\t}\n\n\t// record vote\n\tpoll.Vote(txSender, vote)\n\n\t// update Poll in tree\n\tpolls.Set(id, poll)\n\n\tif vote == true {\n\t\treturn ufmt.Sprintf(\"Successfully voted YAY for poll #%s!\", id)\n\t}\n\treturn ufmt.Sprintf(\"Successfully voted NAY for poll #%s!\", id)\n}\n\nfunc Render(path string) string {\n\tvar b bytes.Buffer\n\n\tb.WriteString(\"# Polls!\\n\\n\")\n\n\tif polls.Size() == 0 {\n\t\tb.WriteString(\"### No active polls currently!\")\n\t\treturn b.String()\n\t}\n\tpolls.Iterate(\"\", \"\", func(key string, value interface{}) bool {\n\n\t\t// cast raw data from tree into Poll struct\n\t\tp := value.(*poll.Poll)\n\t\tddl := p.Deadline()\n\n\t\tyay, nay := p.VoteCount()\n\t\tyayPercent := 0\n\t\tnayPercent := 0\n\n\t\tif yay+nay != 0 {\n\t\t\tyayPercent = yay * 100 / (yay + nay)\n\t\t\tnayPercent = nay * 100 / (yay + nay)\n\t\t}\n\n\t\tb.WriteString(\n\t\t\tufmt.Sprintf(\n\t\t\t\t\"## Poll #%s: %s\\n\",\n\t\t\t\tkey, // poll ID\n\t\t\t\tp.Title(),\n\t\t\t),\n\t\t)\n\n\t\tdropdown := \"\u003cdetails\u003e\\n\u003csummary\u003ePoll details\u003c/summary\u003e\u003cbr\u003e\"\n\n\t\tb.WriteString(dropdown + \"Description: \" + p.Description())\n\n\t\tb.WriteString(\n\t\t\tufmt.Sprintf(\"\u003cbr\u003eVoting until block: %d\u003cbr\u003eCurrent vote count: %d\",\n\t\t\t\tp.Deadline(),\n\t\t\t\tp.Voters().Size()),\n\t\t)\n\n\t\tb.WriteString(\n\t\t\tufmt.Sprintf(\"\u003cbr\u003eYAY votes: %d (%d%%)\", yay, yayPercent),\n\t\t)\n\t\tb.WriteString(\n\t\t\tufmt.Sprintf(\"\u003cbr\u003eNAY votes: %d (%d%%)\u003c/details\u003e\", nay, nayPercent),\n\t\t)\n\n\t\tdropdown = \"\u003cbr\u003e\u003cdetails\u003e\\n\u003csummary\u003eVote details\u003c/summary\u003e\"\n\t\tb.WriteString(dropdown)\n\n\t\tp.Voters().Iterate(\"\", \"\", func(key string, value interface{}) bool {\n\n\t\t\tvoter := key\n\t\t\tvote := value.(bool)\n\n\t\t\tif vote == true {\n\t\t\t\tb.WriteString(\n\t\t\t\t\tufmt.Sprintf(\"\u003cbr\u003e%s voted YAY!\", voter),\n\t\t\t\t)\n\t\t\t} else {\n\t\t\t\tb.WriteString(\n\t\t\t\t\tufmt.Sprintf(\"\u003cbr\u003e%s voted NAY!\", voter),\n\t\t\t\t)\n\t\t\t}\n\t\t\treturn false\n\t\t})\n\n\t\tb.WriteString(\"\u003c/details\u003e\\n\\n\")\n\t\treturn false\n\t})\n\treturn b.String()\n}\n\n// How-to: Write Simple Dapp"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4DG6oIEgozKfTIkVvbzNtSz+36Tr1iWAFhW1VuqHHym"},"signature":"wQgtlQGU2gvRNLoJ4fZZNz2hRps9s06BXb1z0dxfBRAAzkxGTE+5NWvfKeD2ZQld2MZS4uuGI6T2oaT6OTlYDw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g16wjj9dpev357ehq9vmrea2ycnpd9xuk2c9nzuv","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"+n2zALsXTlW2lkb11+qLFpYEzPjHoZJBYxad8DeQwiRbpJksD78tmmaCgp2C4ICY2Zz4fmyeymFldeGDTT/w1Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1lafcru2z2qelxr33gm4znqshmpur6l9sl3g2aw","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"mKQRq5B+IRo2peG1NjWneDKHnh4NCMN+ktG6Bh9WTBgGDlfvGm4dpMBjazgcdiRVUAdOfhaX2fNjVsCoKAeIMg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1fj5smt5khargkn72eepekd75mf2j4z2kjc7e6s","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"giAXs1HuuTK2OdNsuq8fozrNpRr8ktyPQWDyu0uh+GkFScQ2xUbzSKl93uPu283tglRxXcGdZNeT31LyaaHC5g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1mhnd9g3zcc8k9yh5lccjc9jtc2zk4w7n5gd0kl","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"V2prWqCtUD+GLD5+vQcscF+XH3I6i1BThUkZQRu7MVcbPmUoqu6N2jWCDOJWmenMqThw8/qO7CS+XhpFkYGw3A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1mk3pg7xvh2qa0m8gtnw8xqcyvfrx742jles67t","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"7SFFw8mOT4dmqXCXJtUiYRBPdo0yQJdjpVyFXNya9lshvyagBI+u5iMv/94N/BvrXmbT3xa8EPir3spHxv4m7A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1jy5nwfghp9wh35y2va9tmd7lt7pf42dn035zwx","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"51fObKgbfJS51Cr34OKYyIc5QEc4b+XcyB/ffBHtGyxPfXllZrwCyOGqssNfyYUtAV+///IDsVrr4Nr0kGqsew=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1fj5smt5khargkn72eepekd75mf2j4z2kjc7e6s","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8/L8WFLXZbeaTGhHUatz71QJTp4kk0kh71y0rgXLk4B4f+uKjwnThjwv+Yoo/W8nglrGoJwKL4jKN09LJAFUqw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jy5nwfghp9wh35y2va9tmd7lt7pf42dn035zwx","package":{"name":"counter","path":"gno.land/r//counter","files":[{"name":"counter.gno","body":"package counter\r\n\r\nimport (\r\n \"gno.land/p/demo/ufmt\"\r\n)\r\n\r\nvar count int\r\n\r\nfunc Increment() {\r\n count++\r\n}\r\n\r\nfunc Decrement() {\r\n count--\r\n}\r\n\r\nfunc Render(_ string) string {\r\n return ufmt.Sprintf(\"Count: %d\", count)\r\n}\r\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwcSnP4td0qWC8Mou1jZ1R4LS659PTTSLVkWuGUCBJLQ"},"signature":"9o6cDQWwyJWrur3HBz54hvuZAwQWoAKDisX4H3s3aSQES/yYvC0QGcZ1HOx6sapogo6kcVJOaOq2mu+LYYbzpw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jy5nwfghp9wh35y2va9tmd7lt7pf42dn035zwx","package":{"name":"counter","path":"gno.land/r//counter","files":[{"name":"counter.gno","body":"package counter\r\n\r\nimport (\r\n \"gno.land/p/demo/ufmt\"\r\n)\r\n\r\nvar count int\r\n\r\nfunc Increment() {\r\n count++\r\n}\r\n\r\nfunc Decrement() {\r\n count--\r\n}\r\n\r\nfunc Render(_ string) string {\r\n return ufmt.Sprintf(\"Count: %d\", count)\r\n}\r\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwcSnP4td0qWC8Mou1jZ1R4LS659PTTSLVkWuGUCBJLQ"},"signature":"dfjcyGUfKoGAzQz58+Bd6HI0GEg3fe0ywQlTs+2u2wB5bghzneEZ6ELWnxLrK5UBqo1E/hEfDXAfpZUTmD2Z9Q=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jy5nwfghp9wh35y2va9tmd7lt7pf42dn035zwx","package":{"name":"counter","path":"gno.land/r//counter","files":[{"name":"package.gno","body":"package counter\n\nimport (\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar count int\n\nfunc Increment() {\n\tcount++\n}\n\nfunc Decrement() {\n\tcount--\n}\n\nfunc Render(_ string) string {\n\treturn ufmt.Sprintf(\"Count: %d\", count)\n}\n\n// How-to: Write a simple Gno Smart Contract (Realm)"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwcSnP4td0qWC8Mou1jZ1R4LS659PTTSLVkWuGUCBJLQ"},"signature":"95C7CJnBrxW74hn/2nUHPF1x7zJPqLLvqDI7SfoBDy0SmBhAt3JwLyYc6B8A1XWFYfFXUooiIf8ZL2gw7mbyXA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jy5nwfghp9wh35y2va9tmd7lt7pf42dn035zwx","package":{"name":"counter","path":"gno.land/r//counter","files":[{"name":"package.gno","body":"package counter\n\nimport (\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar count int\n\nfunc Increment() {\n\tcount++\n}\n\nfunc Decrement() {\n\tcount--\n}\n\nfunc Render(_ string) string {\n\treturn ufmt.Sprintf(\"Count: %d\", count)\n}\n\n// How-to: Write a simple Gno Smart Contract (Realm)"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwcSnP4td0qWC8Mou1jZ1R4LS659PTTSLVkWuGUCBJLQ"},"signature":"KoQIAQeYaHbxycj+Yfofz4eiuDV2LrKFO6+mq9tCjNZj3rZ3gLMnJzIRGOma6/+NUIa9fz1QMRsx++xfjewpbg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jy5nwfghp9wh35y2va9tmd7lt7pf42dn035zwx","package":{"name":"counter","path":"gno.land/p//counter","files":[{"name":"package.gno","body":"package counter\n\nimport (\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar count int\n\nfunc Increment() {\n\tcount++\n}\n\nfunc Decrement() {\n\tcount--\n}\n\nfunc Render(_ string) string {\n\treturn ufmt.Sprintf(\"Count: %d\", count)\n}\n\n// How-to: Write a simple Gno Smart Contract (Realm)"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwcSnP4td0qWC8Mou1jZ1R4LS659PTTSLVkWuGUCBJLQ"},"signature":"Ho0uBp/V/woVu7PVoRmL+SVGg/z37XUMZ0kkNGTsJ54cNC1D6+Xiza0QIgShvQl0rm5d+qdMqiqSczyV5B7MqQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g148vmqxzgp4yc996pasredy3v9sw8sxzsgem0qv","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"kbqe7ISqAUB0oAlQHr0lCpQ2XPnz1V5eThPAmi17aPF0QaYnkbExprJRlUEWfstVNWNytueyhEH/N/FpaJdAzQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1mhnd9g3zcc8k9yh5lccjc9jtc2zk4w7n5gd0kl","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"MaczEAvcqX1l/Z2G0m+vU/y9AQKQcRpfZImYrIN2sq46wkxq1lCsBVH4yqGqCkBk3mp5yWFTb6df3+Gg6wrlfQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","to_address":"g1pf6dv9fjk3rn0m4jjcne306ga4he3mzmupfjl6","amount":"100ugnot"}],"fee":{"gas_wanted":"2000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"7F99qS2ORETs7ZH5+ETxfpc5a0Q2QOGu61deU6DkMUdXczG6CEpaCwU6bUucf/hQJ5EpbwVL7WtgU5acyo5V0g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1mhnd9g3zcc8k9yh5lccjc9jtc2zk4w7n5gd0kl","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1Ye5hLTaplwNz/H1oS+QheyqmkIXlcUwBmsZk86otd00R7JEdREAZSwo2cRfGOnCpKf7zpTZ5lSev7aQvJJ1lw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1fj5smt5khargkn72eepekd75mf2j4z2kjc7e6s","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"HRUQXh+0UGR12Q0syfdPiECo1cssIx137ylVUDPeKTcdu30ExN2NtD++VzttF1McQ7kdEk8ow/Tu2czcRZHM5g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1mhnd9g3zcc8k9yh5lccjc9jtc2zk4w7n5gd0kl","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"EM3xDhGIsAdnB6m9gz4IqLpFX4zeAWGNzc69fcOJPXw30b/ULz9JrRbCX6XCssPKbe+aXg/fUsV/pnJaEk1spw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1kk8v24awfkfjlw77cpz4gmwkk7gwskk8fqlmlv","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5u7coGHwr47c0cBO0PMir6pOA6OnxFXWo02cRAhahT08Y1rwrZvPbl5cz9wM1ULWH6OxTgqVE3w60uuwWTjzXg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1kk8v24awfkfjlw77cpz4gmwkk7gwskk8fqlmlv","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"FriYAbV5eBuMNmp6k+0+qNwydJJwLtRL792E8gHwuY0XuytXDptK4sRh1RuelwCLmtndCa0UnaRUsJaA0D4oLw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1kk8v24awfkfjlw77cpz4gmwkk7gwskk8fqlmlv","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"BTJXoLhGoEaz4KejoqmndSYHGkSMitIvklLz46crIH4Zrj6b7nqpy4bO25KMs9Ynbn+9wp9TjiA8PGvtNqJvzQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1kk8v24awfkfjlw77cpz4gmwkk7gwskk8fqlmlv","send":"","pkg_path":"gno.land/r/demo/userbook","func":"GetSignupsInRange","args":["10","5"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4lg6saYvLY61fnpieNvWyT3LwUojf1XQQCdA+tzdiv6"},"signature":"sACov8qYfz2mR1MwtxILh5s/xtF0oYgQrqeSWFQCgj8XodCzL08dwQb3bEA/zRJmCjgW4Gy8TXtX4eG/H8jdYg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1kk8v24awfkfjlw77cpz4gmwkk7gwskk8fqlmlv","send":"","pkg_path":"gno.land/r/demo/userbook","func":"SignUp","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4lg6saYvLY61fnpieNvWyT3LwUojf1XQQCdA+tzdiv6"},"signature":"Y59qX2bF4/aQGt4osIzPmGqNQ3lXI/NzF7rxVTO32+Aj88QFt97a5gAtQQYkMd9Ct71Ihr6nC6BQplROCVJFFg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1kk8v24awfkfjlw77cpz4gmwkk7gwskk8fqlmlv","send":"","pkg_path":"gno.land/r/demo/userbook","func":"GetSignupsInRange","args":["20","10"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4lg6saYvLY61fnpieNvWyT3LwUojf1XQQCdA+tzdiv6"},"signature":"sPHXazbv5A5X5F2PF1dJTtTXJaUTPEXIGdEuLxM3GG487/EGZf9hrjKUKZil+dWaR2gIuFv9djAqZxGoB7lDfg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1kk8v24awfkfjlw77cpz4gmwkk7gwskk8fqlmlv","package":{"name":"hello","path":"gno.land/r//hello","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n return \"Hello \" + path + \"!\"\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4lg6saYvLY61fnpieNvWyT3LwUojf1XQQCdA+tzdiv6"},"signature":"IuGnddLM8hYdtOSNSJmgE2UFeq4UZawwvQfQVMc3hloVQmHDd1LTJT8/YUoCIDI6u0g+yftzxBUoYt6R4KlOLA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1kk8v24awfkfjlw77cpz4gmwkk7gwskk8fqlmlv","package":{"name":"hello","path":"gno.land/r//hello","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n return \"Hello \" + path + \"!\"\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4lg6saYvLY61fnpieNvWyT3LwUojf1XQQCdA+tzdiv6"},"signature":"Rx1h5LVy5I7NXKwjSw8eFvcogvqEdmLICF6J8tpP0lt9K9o40mg7U5tA6CL6yRkASl1sf4/Iomp44IYfbQq7mA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1kk8v24awfkfjlw77cpz4gmwkk7gwskk8fqlmlv","package":{"name":"hello","path":"gno.land/r//hello","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n return \"Hello yieazy: \" + path + \"!\"\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4lg6saYvLY61fnpieNvWyT3LwUojf1XQQCdA+tzdiv6"},"signature":"+wB/r1MKPC+D+KQzsIPslf5ltV4p/JeLTmq7jl4F9mZwDRySK2MzFf3txzQxIemVyRE6js9OGTYZ3mC7Lw0vmw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1kk8v24awfkfjlw77cpz4gmwkk7gwskk8fqlmlv","package":{"name":"hello","path":"gno.land/r//hello","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n return \"Hello yieazy: \" + path + \"!\"\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4lg6saYvLY61fnpieNvWyT3LwUojf1XQQCdA+tzdiv6"},"signature":"/x8U92DnW/BG4lrS3hyHHjyRDF/5yqNjnBJ+i+BsuZwuGDd9hqvvxB5/sEpKiHVDw3pAceClV5ZPIFWhQWJMng=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1kk8v24awfkfjlw77cpz4gmwkk7gwskk8fqlmlv","package":{"name":"counter","path":"gno.land/r/demoyy/counter","files":[{"name":"counter.gno","body":"package counter\n\nimport (\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar count int\n\nfunc Increment() {\n\tcount++\n}\n\nfunc Decrement() {\n\tcount--\n}\n\nfunc Render(_ string) string {\n\treturn ufmt.Sprintf(\"Count: %d\", count)\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4lg6saYvLY61fnpieNvWyT3LwUojf1XQQCdA+tzdiv6"},"signature":"Sk9kSzsm8HKef7xrTv08pHUm6b2ZIRa0ElmAadGw5u1zsKOK/+BEwoGx2X+FWgTNXDy4pYsCqHjZRwitVLynYQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1kk8v24awfkfjlw77cpz4gmwkk7gwskk8fqlmlv","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"8hfHL+q6MrQvVPqgO4or0+WYHiFrsjMcXQ2q6N2YBKtJo5USKlSmwgkkC7de/K8OWClLHk/xmOCwOEPZ+BPIbg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1kk8v24awfkfjlw77cpz4gmwkk7gwskk8fqlmlv","package":{"name":"counter","path":"gno.land/r/demoyy/counter","files":[{"name":"counter.gno","body":"package counter\n\nimport (\n \"gno.land/p/demo/ufmt\"\n)\n\nvar count int\n\nfunc Increment() {\n count++\n}\n\nfunc Decrement() {\n count--\n}\n\nfunc Render(_ string) string {\n return ufmt.Sprintf(\"Count: %d\", count)\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"2000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4lg6saYvLY61fnpieNvWyT3LwUojf1XQQCdA+tzdiv6"},"signature":"toZwTt4lhVLofutCjz6gakhwgV+3fM9MDmMFjbZtMwUjsWgQU1teuXrABdxayuv9aMEjrP/LrkJju1Xs2a0qAA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1kk8v24awfkfjlw77cpz4gmwkk7gwskk8fqlmlv","send":"","pkg_path":"gno.land/r/demoyy/counter","func":"Increment","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4lg6saYvLY61fnpieNvWyT3LwUojf1XQQCdA+tzdiv6"},"signature":"xPPbKRT1kw5FpuSf8gAeqVx8d8A1J+rSuA7zn45UzZAhoKLes5LVuscHZ7vgW5XBlNL70I+X+nxRuEtcSLNCmA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1q2wvjtl6u8jhfs4fgy09de442jpn3eldu225cf","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"bTEBy2cXEiY7keZ7mxo4vp8aRsbURjUULsCfR84OE/McXsP6QAkgLjAdfonAIZMe5N0J7gJ50+bQIc4oPXy5Ag=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1dklxegxmptd62vkdzfgx9pxwxflsmv3l7xvd0y","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"k84+j04GwMeclcImgwT3wYsPbnzIKYHDA9nqDJELsFQKQ+Aig4NZYlsStzoBvt/de+Jh7+Q5vuvS1saicLI6fA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"LwFNZFaUZOYxgUKBh2jVWVM3kqNLqZ7JEJltwQe1BOxULY+dpwV2cQm0W8dH8giX8fwyzfc2sB0O5mA0JLc3PA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r","send":"","pkg_path":"gno.land/r/demo/userbook","func":"SignUp","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ai1fSOs+1E0KH14i/vLKTXLWIuDEFcw6XbRlDlvB7pQw"},"signature":"NqVGGmkdYrqK5Q76+B4pMUBTkrWjCvhita7+YZdh76RwEUhX6m2FPNRn7MIeyJ8fMjtpGvt0zOL7p8fThcXD9A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ngywvql2ql7t8uzl63w60eqcejkwg4rm4lxdw9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"NFaM1IbbdCeb5VLxfYe++1YCHoiOml0DJRDH5dVbJmxQtr+1iyBVBW3f9dIp4O0TtDIhVqVehqaWwfjiXdcqHw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ngywvql2ql7t8uzl63w60eqcejkwg4rm4lxdw9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"wXZaIfNjUxz7shARkcNegFOarx6vBPk21CbdmAu9LNNINbVQ6Ier7q9MvYBlYpWOCQMHeV64b3qBLcUpwoClSg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ngywvql2ql7t8uzl63w60eqcejkwg4rm4lxdw9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"FJUCJgGWY5elxtHq9eW158CZ+cAG3aVBSmre7HtgiP4UDf2XPHOGWbO9DsEi+p7XBI4KOzmetdhN0mUONZH7rg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10jms90dc56wzr28rsptfj2kv6hj7uexv767qkn","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"N0PD1QMr7vUr1GgYPkjDP06NV22AKuR/t+x+WuEdhjhs0ZTSUwgCj/LHJfy090+JnGDIZJOScCOFaEBsZ+TkgQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-10","The More You Gno 10: Test4 is Live!","\n\nThis edition focuses on Test4, a major milestone towards our mainnet. Test4 is the first true multinode testnet featuring DAOs and on-chain governance, offering a preview of what’s to come. Much excitement, such wow.\n\nWe document everything in our weekly engineering updates and video recordings.\n\n# Gno Core Updates\n\n## Test4 is Live\n\nWith 7 validator nodes running and 3 more about to be added via on-chain governance, Test4 is the first multinode testnet that has the complexity and the feature set we want for the gno.land mainnet. Find out more about it in [this article](https://www.gno.land/r/gnoland/blog:p/test4-live).\n\n## Changelog\n\n- Gnoweb live\n- RPC live\n- TX indexer available\n- Test4 faucet added to the [Faucet Hub](https://faucet.gno.land/)\n- Merged in [Gno type check](https://github.com/gnolang/gno/pull/1426) support, resolving the long-standing issue with Gnolang's type checking on a VM level, making it more stable for development.\n- Added support for [transpiling gno standard libraries](https://github.com/gnolang/gno/pull/1695), as part of a bigger effort to stabilize the GnoVM with native binding support (which was added a while back). The Gno transpiler now uses Gno's standard libraries instead of Go's. This also eliminates the need for things like `stdshim` and an std whitelist.\n- [Continued to improve upon v1 of the GOVDAO implementation](https://github.com/gnolang/gno/pull/2379), with additional improvements coming later this week ahead of test4. We want to launch with a minimal govdao implementation for test4, which will be centralized in the beginning. We will use the govdao mechanism for managing on-chain validator sets.\n- [Embraced JSON output](https://github.com/gnolang/gno/pull/2393) as standard for configuration and secrets fetching. DevOps engineers can rejoice; it's now super easy to read and parse node values.\n- Published [v1 of the validator documentation](https://github.com/gnolang/gno/pull/2285) ahead of the test4 launch. Having easy to understand orchestration docs is critical to easily onboarding node operators and validators. We will continue to improve upon the documentation, and have more use-cases and examples for orchestration.\n- [Improved the performance](https://github.com/gnolang/gno/pull/2140) of `for` loops and `if` statements. The performance almost doubled for these super-common Gno statements.\n- [Migrated](https://github.com/gnolang/gno/pull/2424) the `libtm` (Tendermint consensus engine) implementation to the monorepo. You can check it out [here](https://github.com/gnolang/gno/tree/master/tm2/pkg/libtm). We plan to adopt this engine implementation in TM2, shortly after the test4 launch. The blog post is coming soon on the official Gno blog.\n\n# Events and Meetups\n\n## Past events\n\n### GopherCon US \n\nWe sponsored and attended GopherCon US - full recap [here](https://gno.land/r/gnoland/blog:p/discover-gno-gc24). We participated in the [Challenge series](https://www.gophercon.com/agenda/session/1281366), held a [workshop on building a decentralized app](https://www.youtube.com/watch?v=lwL2VyjaV-A), and had a lot of great conversations on the hallway track. We also set up a [raffle realm](https://gno.land/r/gc24/raffle) - Gophers we able to join the raffle using the Adena wallet, Gno Playground and Connect. You'll see the snippets of the atmosphere in [the promo video](https://x.com/_gnoland/status/1811438404800057560) we put together.\n\n### Nebular Summit\n\nWe had a great time in Brussels at the Nebular Summit. Manfred was on the agenda with a lightning talk, and the core team held a workshop. Catch a part of the event atmosphere [in this video](https://x.com/_gnoland/status/1812867888501477470).\n\n## Upcoming events\n\n## Discord Developer Office Hours\n\nEvery Thursday at 2:30 pm CEST, we host office hours on [Discord](https://discord.com/invite/d24CT5b9cd?event=1252310282450112595). Join us to get your questions answered, discuss updates, and catch up with the community. We'd love to see you there!","2024-07-22T00:00:00Z","Kouteki","gnoland,ecosystem,updates,gnovm,tm2,test4,gnostudio,connect"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"CQo6WYi9vgvm/VjbJ28Cb+qaddFoag+oEJ8FBtPB1z4KwrnaQDhU1fis4YMfoF0J4KWSzhaqrWEVpa2T5VandA=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1enky04sfc4nush29g4ht97x45slz8h3t2peaqc","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"9DKyWtU9NCu2LP4KadyUW03IAS0qLfpvkzP6KOORXdpfp24a+oWZstN5mvdtE0CIy1dyDtKxqiez6+z9ANxgmw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1330dfff36jyy44rgq68y33mzxx9uhrgzyq88wh","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"cArrKUE3jRcjglsMJYqXe7JHmHI1X3x+CrGUV3TwcWwxpaSdFdxBig/FVCP2Ibn2I1scPBfubxWG5JVmilmpNQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1330dfff36jyy44rgq68y33mzxx9uhrgzyq88wh","to_address":"g122n67es9vzs0rmharsggfr4sdkd45aysnuzf7m","amount":"10000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AhsU4msjmCnK33Q/QPsxJX7LgQYk2CD9tgtpMSntVe1F"},"signature":"UEGQOix7FygBg8kLeOiQToSXNHK/JiBJXNcLRQW4t+1twsmuC1NVonrLWvaYsa58KWmTrR2sBAzuRL7be6E5lQ=="}],"memo":"Transaction Memo"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1330dfff36jyy44rgq68y33mzxx9uhrgzyq88wh","to_address":"g122n67es9vzs0rmharsggfr4sdkd45aysnuzf7m","amount":"10000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AhsU4msjmCnK33Q/QPsxJX7LgQYk2CD9tgtpMSntVe1F"},"signature":"sKR5SGixNRtkEJAo/KcdQ4JUrGdOCCbQiqlhmEu8zS8M7nD8Op4+AnGc3dC9xp2KAv6OKiSujfQYzloj2w4w9g=="}],"memo":"Transaction Memo"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1330dfff36jyy44rgq68y33mzxx9uhrgzyq88wh","to_address":"g122n67es9vzs0rmharsggfr4sdkd45aysnuzf7m","amount":"10000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AhsU4msjmCnK33Q/QPsxJX7LgQYk2CD9tgtpMSntVe1F"},"signature":"BvC4UMb23EpOZingMO7FxnpCd9xNeE9LOIi7Zl8je0Vz+7yiKC96GQLb53/gnpIl5lnfM0LSr5xCmtuwFsgW3A=="}],"memo":"Transaction Memo"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1330dfff36jyy44rgq68y33mzxx9uhrgzyq88wh","to_address":"g1n6af0uz6pznjfa2l8ttdzjppkefrhszz4ny862","amount":"10000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AhsU4msjmCnK33Q/QPsxJX7LgQYk2CD9tgtpMSntVe1F"},"signature":"fXpvZx/UGrKxfgLV02cfHf9je7Zf8Io+WjsDxyZHm7Eg5I7vFXSNUYEivigXHOfkLhgP0jvaEYuMov0LOz87bw=="}],"memo":"Transaction Memo"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1330dfff36jyy44rgq68y33mzxx9uhrgzyq88wh","to_address":"g1n6af0uz6pznjfa2l8ttdzjppkefrhszz4ny862","amount":"5000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AhsU4msjmCnK33Q/QPsxJX7LgQYk2CD9tgtpMSntVe1F"},"signature":"bWk6DahTfI4WIzebqekXOC1mgqA12kzxERqtH5ua1dNiADDST7M0SE8GxRLD8BfrmnNlL07boY5k+yY5YlzqjA=="}],"memo":"Transaction Memo"} +{"msg":[{"@type":"/vm.m_call","caller":"g1330dfff36jyy44rgq68y33mzxx9uhrgzyq88wh","send":"","pkg_path":"gno.land/r/demo/foo20","func":"Transfer","args":["g122n67es9vzs0rmharsggfr4sdkd45aysnuzf7m","1"]}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AhsU4msjmCnK33Q/QPsxJX7LgQYk2CD9tgtpMSntVe1F"},"signature":"vILOwl0vhAN85HJcN1pKYM6S/2IHCdDnT7ojQpqb+R8fQ2LngD03Vks1bAS21ldSyaJg8MIWoSyaHqC2XMW3sQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1330dfff36jyy44rgq68y33mzxx9uhrgzyq88wh","to_address":"g1n6af0uz6pznjfa2l8ttdzjppkefrhszz4ny862","amount":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AhsU4msjmCnK33Q/QPsxJX7LgQYk2CD9tgtpMSntVe1F"},"signature":"NNO2k2fxYEcrbLKaewduDX1EJ1usVnkmfSo5bjrlkg1FGE0jcP218lsdj6VScKegdg9DBUWG52zMSB+Zk9GZcw=="}],"memo":"Transaction Memo"} +{"msg":[{"@type":"/vm.m_call","caller":"g1330dfff36jyy44rgq68y33mzxx9uhrgzyq88wh","send":"","pkg_path":"gno.land/r/demo/foo20","func":"Transfer","args":["g122n67es9vzs0rmharsggfr4sdkd45aysnuzf7m","1"]}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AhsU4msjmCnK33Q/QPsxJX7LgQYk2CD9tgtpMSntVe1F"},"signature":"ydXJ0Uam4dyUn+v2uhXLQE/Uh9sF9Nm9v+LtGNLkS8hJfQq78dzf65Lveb88E7e0Kx0aqYDwbASW2P5ojoxkjg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1330dfff36jyy44rgq68y33mzxx9uhrgzyq88wh","send":"","pkg_path":"gno.land/r/demo/foo20","func":"Transfer","args":["g1n6af0uz6pznjfa2l8ttdzjppkefrhszz4ny862","1"]}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AhsU4msjmCnK33Q/QPsxJX7LgQYk2CD9tgtpMSntVe1F"},"signature":"+nyWgiW1qs6UnC3JtWG9ru9nFR2X1c3l8iBkLBJFcM8ihz0OI2ZvNJdH9KsUDi0GM7tyaCA63rYVGTZOSVzzGg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["gno-debugger","Debugging Gno Programs","\n \nIn this article, we introduce the new Gno debugger feature and show how it can be used to better understand Gno programs and help to fix bugs.\n\n## Motivation for a Gno debugger\n\n\u003e Debugging is twice as hard as writing code.\n\u003e\n\u003e -- \u003ccite\u003eBrian Kerninghan, \"The Elements of Programming Style\"\u003c/cite\u003e\n\n\u003e On average, you spend about eight to ten times debugging as you do writing code.\n\u003e\n\u003e -- \u003ccite\u003eAnonymous\u003c/cite\u003e\n\nHaving a good debugger is important. But the Gno language is almost Go, and gno.land itself is entirely written in Go. Could I just use the existing Go tools, i.e. the [delve] debugger, to take control and debug my Gno programs?\n\nYou cannot debug your *Gno* program this way because doing so would entail debugging the Gno virtual machine rather than your own program. The relevant state information would be opaque and would need to be reversed and reconstructed from internal Gno virtual machine data structures.\n\nThe Gno debugger addresses this issue by displaying the state of the Gno program memory symbolically. It allows for control of program execution at the source code level, regardless of the virtual machine implementation.\n\n## Setting up\n\nThe Gno debugger is fully integrated in the [gno](https://docs.gno.land/gno-tooling/cli/gno-tooling-gno) binary, which is the tool required to build, test, and run Gno programs locally.\n\nThere is no need to install a specific tool. You just have to install the `gno` tool itself with:\n\n```shell\ngit clone https://github.com/gnolang/gno\ncd gno\ngo install ./gnovm/cmd/gno\n```\n\nWe are now ready to play with Gno programs. Let's consider a simple classic example as a target program, the computation of [Fibonacci numbers]:\n\n```go\n// fib.gno\npackage main\n\n// fib returns the nth number in the Fibonacci sequence.\nfunc fib(n int) int {\n if n \u003c 2 {\n return n\n }\n return fib(n-2) + fib(n-1)\n}\n\nfunc main() {\n println(fib(4))\n}\n\n```\nTo execute this program, we run the command `gno run ./fib.gno`. To activate the debugger, we just pass the `-debug` flag: `gno run -debug ./fib.gno`. Use `gno run -help` to get more options if needed.\n\n## Quick tour of the debugger\n\nWhen you start a program in debug mode, you are greeted by a prompt allowing you to interact with it via the terminal:\n```shell\n$ gno run -debug ./fib.gno\nWelcome to the GnoVM debugger. type 'help' for list of commands.\ndbg\u003e\n```\n\nEntering `help` gives you the list of available commands and their short usage:\n\n```shell\ndbg\u003e help\nThe following commands are available:\n\nbreak|b [locspec] Set a breakpoint.\nbreakpoints|bp Print out info for active breakpoints.\nclear [id] Delete breakpoint (all if no id).\ncontinue|c Run until breakpoint or program termination.\ndetach Close debugger and resume program.\ndown [n] Move the current frame down by n (default 1).\nexit|quit|q Exit the debugger and program.\nhelp|h [command] Print the help message.\nlist|l [locspec] Show source code.\nprint|p \u003cexpression\u003e Print a variable or expression.\nstack|bt Print stack trace.\nstep|s Single step through program.\nstepi|si Single step a single VM instruction.\nup [n] Move the current frame up by n (default 1).\n\nType help followed by a command for full documentation.\ndbg\u003e\n```\n\nIf you have already used a debugger before, like [gdb] or [lldb] for C/C++ programs, or [delve] for Go programs, the Gno debugger should look familiar; the commands are similar in their syntax and usage.\n\nThe commands can be classified in the following categories:\n- managing breakpoints: `break`, `breakpoints`, `clear`,\n- controlling execution: `step`, `stepi`, `continue`,\n- browsing code, data and stack: `list`, `print`, `stack`,\n- navigating the stack: `up`, `down`,\n- quitting the debugger: `detach`, `exit`.\n\n## Controlling and exploring the program state\n\nLet's go back to our Fibonacci program, still paused. We `step` a first time, which instructs the GnoVM to execute a single statement and give back control to the user:\n\n```shell\ndbg\u003e s\n\u003e main.main() main/./fib.gno:11:1\n 7: \t\treturn n\n 8: \t}\n 9: \treturn fib(n-2) + fib(n-1)\n 10: }\n 11: \n=\u003e 12: func main() {\n 13: \tprintln(fib(4))\n 14: }\n```\n\nThe first output line `\u003e main.main() main/./fib.gno:11:1` indicates the precise current location in source code, followed by a short source listing around this location. The current line is indicated by the cursor `=\u003e`.\n\nFrom there, we could repeat `step` commands to progress, but that would be too tedious. Instead, we set a breakpoint at an interesting line in the `fib` function, and `continue` to it directly:\n\n```shell\ndbg\u003e b 7\nBreakpoint 0 at main main/./fib.gno:7:1\ndbg\u003e c\n\u003e main.fib() main/./fib.gno:7:10\n 2: package main\n 3: \n 4: // fib returns the nth number in the Fibonacci sequence.\n 5: func fib(n int) int {\n 6: \tif n \u003c 2 {\n=\u003e 7: \t\treturn n\n 8: \t}\n 9: \treturn fib(n-2) + fib(n-1)\n 10: }\n 11: \ndbg\u003e\n```\n\nNote that we have used the short alias of commands: `b` for `break` and `c` for `continue`. We only need to specify the line number when setting the break point here, due to it being in the same file. Setting break points in other files requires specifying the full file path and line number.\n\nWe can now examine the call stack which indicates the successive nested function calls up to the current location:\n\n```shell\ndbg\u003e stack\n0\tin main.fib\n\tat main/./fib.gno:7:10\n1\tin main.fib\n\tat main/./fib.gno:9:20\n2\tin main.fib\n\tat main/./fib.gno:9:20\n3\tin main.main\n\tat main/./fib.gno:13:2\ndbg\u003e\n```\nWe see a call stack of depth 4, with call frames (local function contexts) numbered from 0 to 3, 0 being the current call level (the deepest). This information is crucial, especially when debugging recursive functions like `fib`. We know that the caller and its caller were both `fib`.\n\nNow we want to examine the value of the local parameter `n`, for each call level:\n```shell\ndbg\u003e print n\n(0 int)\ndbg\u003e up\n\u003e main.fib() main/./fib.gno:7:10\nFrame 1: main/./fib.gno:9:20\n 4: // fib returns the nth number in the Fibonacci sequence.\n 5: func fib(n int) int {\n 6: \tif n \u003c 2 {\n 7: \t\treturn n\n 8: \t}\n=\u003e 9: \treturn fib(n-2) + fib(n-1)\n 10: }\n 11: \n 12: func main() {\n 13: \tprintln(fib(4))\ndbg\u003e print n\n(2 int)\ndbg\u003e up\n\u003e main.fib() main/./fib.gno:7:10\nFrame 2: main/./fib.gno:9:20\n 4: // fib returns the nth number in the Fibonacci sequence.\n 5: func fib(n int) int {\n 6: \tif n \u003c 2 {\n 7: \t\treturn n\n 8: \t}\n=\u003e 9: \treturn fib(n-2) + fib(n-1)\n 10: }\n 11: \n 12: func main() {\n 13: \tprintln(fib(4))\ndbg\u003e print n\n(4 int)\ndbg\u003e\n```\nWe see that the local value `n` is 0 at current frame 0, 2 at frame 1 and 4 at frame 2, which corresponds to the nested calls of `fib` expressed at line 9.\n\nThe `up` and `down` stack navigation commands enable the debugger to display the value of local function variables and parameters for the whole call chain.\n\nIn this example, the `n` variable is simply an integer, but the `print` command is also able to handle more complex expressions to uncover the content of arbitrary maps, struct, arrays, etc using the same syntax as Go. For example, `print a.b[n]` will print as expected, with `a` being a value of type:\n```go\nvar a struct {\n b []string\n}\n```\nFor security reasons, the `print` command will only evaluate expressions with no side effects on the virtual machine state. For example, it is not possible to perform an arithmetic operation like `print a + 2`, or to call a function like `printf f(6)`.\n\n## Conclusion\n\nWe have introduced the new Gno debugger and presented its main capabilities. \n\nThis is just the start of a new project, with a lot of room for improvement. The whole Gno project being open source, you are welcome not only to provide feedbacks and suggestions, but also to contribute at https://github.com/gnolang/gno.\n\n\n[delve]: https://github.com/go-delve/delve\n[gno]: https://github.com/gnolang/gno/tree/master/gnovm/cmd/gno\n[Fibonacci numbers]: https://simple.wikipedia.org/wiki/Fibonacci_number\n[gdb]: https://sourceware.org/gdb/\n[lldb]: https://lldb.llvm.org\n","2024-08-06T13:37:00Z","mvertes","blog,post,tutorial,gno,debugger"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"J4aYTqugJMPMEk/c9yIeNB+2ojW7CzstjNg2h1adAEVrr7U69Kk8hYvbbTu2i80zmToADmJ9n3kK2klc8xuLzQ=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g12chzmwxw8sezcxe9h2csp0tck76r4ptwdlyyqk","package":{"name":"hello","path":"gno.land/p//hello","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n return \"Hello World!\"\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjwJQoDDCbWnRG1EjhrNqRIzDdI/J3WG2PyIQTSzWxPI"},"signature":"mtS6wH7pqGXtlTjzNzTKm+kacKR+WWkz+4HUYfh09d880fZ50SxrSoEwyGmpx/6g9z3Kg5SsuuPVJewKJxQKeQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g12chzmwxw8sezcxe9h2csp0tck76r4ptwdlyyqk","package":{"name":"hello","path":"gno.land/p//hello","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n return \"Hello World!\"\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjwJQoDDCbWnRG1EjhrNqRIzDdI/J3WG2PyIQTSzWxPI"},"signature":"4gEnRaVujR6JKZqAxPbaVwQaJ0vFp3C8po2DSdbh1/E9txzIwLKaPDR0oMJnWEZtAbb6qUPdp0CLtkv4dai4dQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"R0SS2ouemaFmRKJ0fLdfafPMk6dco6xHD85taySHiHcpjWfPw8LA/G2uCqfNfkGyYkW89EZ8kyGz8CS+EiLvLQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"hello","path":"gno.land/p/namespacetest/hello","files":[{"name":"hello.gno","body":"package hello\n\nfunc Public() {}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"7000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"R72wrxY7tROfkzv5I079wmrOmVgGr4hMgEuxdN14HXNbECCHc7PDmBTgp0xRWiCq5rcIbwZqqdkrm8yF0I6LcQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1ngywvql2ql7t8uzl63w60eqcejkwg4rm4lxdw9","send":"","pkg_path":"gno.land/r/gnoland/faucet","func":"AdminSetInPause","args":["false"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Atgv/+TCwlR+jzjx94p4Ik0IuGET4J/q2q9ciaL4UOQh"},"signature":"+lw56WNYxpbWPmUEF6xR1dpSkNrND2NU6/OeXfU9CvcrfzItGS6ToIznNL9lW41ZXBIWeumc2U6FfRkxsPh98w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1ngywvql2ql7t8uzl63w60eqcejkwg4rm4lxdw9","send":"","pkg_path":"gno.land/r/gnoland/faucet","func":"GetPerTransferLimit","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Atgv/+TCwlR+jzjx94p4Ik0IuGET4J/q2q9ciaL4UOQh"},"signature":"8OWUcC1NJ452KUixeI1/DI0XW7BTc8Y5C9n/36DlrM5bnwsMCj7NmxMccmXrOjhUNTBOpAPZov/i4hvGRwSWOg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1dmg852ek58jncpphrlgm6e8rzqlk8qnswnmn5z","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"FeiZDmZmTrnwL8Wc5vL6bLkuNieB2fsQ6W4fO1tQ6b1Jt134pfvU2J3qEgWPEjwIGtd1ZBfVIMAbfgr6lqf68A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1ngywvql2ql7t8uzl63w60eqcejkwg4rm4lxdw9","package":{"name":"cryptopunkstar","path":"gno.land/r//cryptopunkstar","files":[{"name":"package.gno","body":"package cryptopunkstar\n\nfunc Render(path string) string {\n return \"Cryptopunkstar\"\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Atgv/+TCwlR+jzjx94p4Ik0IuGET4J/q2q9ciaL4UOQh"},"signature":"0m/e6BawIzn8T83M/U/AYXHhECt5CvlQdRTUBa2AkCxE0O2SHwIuhxfxUqcNQoZuKupsfr7VN0s6ShkYgXr9Zw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1ngywvql2ql7t8uzl63w60eqcejkwg4rm4lxdw9","package":{"name":"cryptopunkstar","path":"gno.land/r//cryptopunkstar","files":[{"name":"package.gno","body":"package Cryptopunkstar\n\nfunc Render(path string) string {\n return \"Cryptopunkstar\"\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Atgv/+TCwlR+jzjx94p4Ik0IuGET4J/q2q9ciaL4UOQh"},"signature":"hkGQvXucnmi0d0rQeo+21XjqkXAv1yBnMtz5gjDuyh1gH7j2BeSRqXqwvR0vUuiQIfndroyOcSl1h9uzscWiAg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["000000p"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"Y/ewtTYPSIzsk3JqfKvJHa5yazoehKK8iaFTi6UarAxV+zsajNkdh3bRiSTdL6JNXpP28edMekvyTlOwOzqOhg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["000000n"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"PNUy2ZZYHgNWq2zAw69bfS0BI5gBEobNa2Cqsraek403GJIOTlvpev4fc119h4p96NBE8D2sVkJRcK0J/zstLQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["000000n"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"ume0VRuXUo3xh7vrHg9Nhi9X+XAX8L6uVz1CuZ0flDwTs2UrPwGqHkqwGtBBOO4P3lq2JiHXLIWce10rDbESGA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/memeland","func":"PostMeme","args":["data:image/jpeg;base64,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","1722974337"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"j/meSOmSMDHIA8KAgK9TRsNpNdCEaN4QDO+qPikmQxsQPYyZu+7bIuNtibHXAtCMgYC3IsPFc+dvSaumwRrUxQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["000000v"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"TFPV1BxEeDJruq8WjFdvZQSEUoXXAJIUqvUD/uZBB7xslAT4No9qT/8ZQ9os39dcCTRKQtm6KvOVbRAcr1N/vQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"krSW8MfkPnq+ypoT+unBwcyvwu/X0psJhKQfz9QEFn8vD9tA6hYZy8JUD4qiTfW6yyXgTwFHdMEGG9y4Bob+yg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"id746IbkcQ+FGp+A629iJtyG86ViLpuVrlfvL+UB9ek6gKYD6cjzT3i3qInGDLe89gQqqW5DmfUNzIk36ELkHw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1uz0pn536ynfst9hfta63e3l8c7pgv8yl807mcp","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OVm6PuSgpssjgebeMZiXy0a9bAa6WsYKHlM5sD0Xx1gSvBMI1TDSdG0oqZBodfXh9MkFhEzORwf3YQs7KYuGdA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g13mvq7rxpucyx0cj732a2jzs8q37emcf6vfyw46","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"v0KcBAp0HYYGlFGZKosjlJiJg2TSeb011mUFplSowhNap1VvoyVaTfD+47oOxZoCsKCJNQwamKlXlZfz8J1iHw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ja0206uug3g3kakwem0atkpeucgtrtr9vagvve","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"E8rDGv7xpTHrtWI9goT0yjpqX+VkeY7aHZYS7+gytKl8MjZdcHq7/SAVrEoha4OZfjmy6AZP2EoCe9kUlmj2Ew=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1fp54k0r5eaep9gl6qumhmc4c64mln3ueh4xgrt","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"7awRhP9M11Gwh9wYfsgSjifqMVqjNwDuyqIBRewWjBQGhayjPr41kj3GSMFOV5627RdHP2xTBTydo4OdNSB5Hw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ngywvql2ql7t8uzl63w60eqcejkwg4rm4lxdw9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"EvHNEXS37Ku+afKWPCVye7Bj4f+XSZV3f4lxOV3MVep4kMjO71w3j6I6b4dBwC5uEeMu/7C0Q5rTGd9VKgnBYQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ngywvql2ql7t8uzl63w60eqcejkwg4rm4lxdw9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sZVTIkZ7RBrHosJEATH6tJPyxEL26qNME/fuXyL7Uc5gQ5wualWPtLZ3O+Xly7BE/Z/l8YBathpevxU9N+zc1w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ngywvql2ql7t8uzl63w60eqcejkwg4rm4lxdw9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0V/6lM5JMqQAJLQJJKUclirRSF34RYe+kAim53W4L/YaThlNAezo++gL2HmaF4B+5BOnwLT/MMZWUA5VyZkreA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ngywvql2ql7t8uzl63w60eqcejkwg4rm4lxdw9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ed8iSpjM0FsK7X1Cnzq2N1A8UIday8Ea622LU5tvH88TiN5B6TJ3nCwXx5OkDeZiZ5/4bUEyc2Yb+8JisS4mwg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ngywvql2ql7t8uzl63w60eqcejkwg4rm4lxdw9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"nAJIXahk2Vqev5IPkYeYXPlWPeNjL1AjFOZ/Og10yZpm8vrGMrtNn2MneyFH2Y2rDv+/QKqPnM4dh3KNqDm5Dw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ngywvql2ql7t8uzl63w60eqcejkwg4rm4lxdw9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"2Adx6DcqzZ4O7+mvx0XQz4HfxP0gloBv4IQ3CsuU66N0NknPg1351CaPAIh8xt0VxpoQEAx2793ZlbMQjbUzGw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ngywvql2ql7t8uzl63w60eqcejkwg4rm4lxdw9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"NFaM1IbbdCeb5VLxfYe++1YCHoiOml0DJRDH5dVbJmxQtr+1iyBVBW3f9dIp4O0TtDIhVqVehqaWwfjiXdcqHw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ngywvql2ql7t8uzl63w60eqcejkwg4rm4lxdw9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"wXZaIfNjUxz7shARkcNegFOarx6vBPk21CbdmAu9LNNINbVQ6Ier7q9MvYBlYpWOCQMHeV64b3qBLcUpwoClSg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ngywvql2ql7t8uzl63w60eqcejkwg4rm4lxdw9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"FJUCJgGWY5elxtHq9eW158CZ+cAG3aVBSmre7HtgiP4UDf2XPHOGWbO9DsEi+p7XBI4KOzmetdhN0mUONZH7rg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ngywvql2ql7t8uzl63w60eqcejkwg4rm4lxdw9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"M/BsGCJh2VPx0yMuD3YiSqMqbnGPzX2eLvKgj+5+YeoquJPJhgd9uS56qAvU/TtDIyzh0icYDz1u+HWq1HQTLg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ngywvql2ql7t8uzl63w60eqcejkwg4rm4lxdw9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"FWPYS7dNA0566IiWA0Vl6+CKT8ksivJpbsQS+JClQx0KCmLdfXyDQ7/tsWhHeMJeX7ovk8oErmzq2bWEZpCtUQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ngywvql2ql7t8uzl63w60eqcejkwg4rm4lxdw9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"NjgA9zABgLMaYsvC+WpXLFN1IAn76ztniZL5Ze4AkKAi9WD2ZrDR2b178AwPhUokYjbj1flsO0kF74U+I5ZALQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ngywvql2ql7t8uzl63w60eqcejkwg4rm4lxdw9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"MR/M0yg3iu4bzrts2ikF469Ucfmnyb3hkKdZa94zvvdLvEfe5JN0dVnuJLNYX0p9peD9wPRCCweDY3TeNeZjjw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ngywvql2ql7t8uzl63w60eqcejkwg4rm4lxdw9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"TwiB9bTHMkz249TAYIxfUkLdG65wrRLs+AVvNX+6f4ZTcR4oQkO3qSUf1leB57ybjTMLbFSQIqcJqPgMG87fTg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ngywvql2ql7t8uzl63w60eqcejkwg4rm4lxdw9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GNvTOccvdz1YaFMZm5bX3yf7an0Pd4u4wE9LyEweSiQ+XUT+JbKYe15XdmljYzft7TnicAlr+jPqSAKX42EpQQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ngywvql2ql7t8uzl63w60eqcejkwg4rm4lxdw9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sdep8OpkPTgZAG3ZH7LnfNvcX/kvSOVDlsf+Wx+Ja5sqbVTvfradX5oYU0qNjeVRiwCAJ0M+bnyBa+pPR1AixQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ngywvql2ql7t8uzl63w60eqcejkwg4rm4lxdw9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"TL/f+bzPwRlFee8IAxy8H/OfK+P5XBw0owOgxfffHOUXOb8J8l8fuut9FVb7oudNeH2CUbewZyV1j+NCiQRd2Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ngywvql2ql7t8uzl63w60eqcejkwg4rm4lxdw9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"yLCZgIMuFZlE3RStZn74zBJ/sJ+uXBIP6V0UYkpys2dNWk0i5loHXNtucjHiLmFBCPuyZoAAy64SXXEFJZFv/w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ngywvql2ql7t8uzl63w60eqcejkwg4rm4lxdw9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"vJs4D5oryHJpOHoGUWh22xyB1chMe9a+Mx6fQTuDlAQoM2D8yJN9xKA2bhsi0TB7hAJgGCU3bkdWgNChllz6pA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ngywvql2ql7t8uzl63w60eqcejkwg4rm4lxdw9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"V6IRu07hRUxIJiDHybMmE7SiGkYkzkxRFDLLSrE5A78Lf4mBrxtSqFSxyyt/b1S4cceQ9P/zunBPqssa0LkVow=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ngywvql2ql7t8uzl63w60eqcejkwg4rm4lxdw9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9AviStd4xu16opiKnitazIrXxAM3UOSrXSaHCaqdh7h9UzekljR/n4lG1uI/TOz5fbSiNwzqKXesQh7t+9ZuvQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1ngywvql2ql7t8uzl63w60eqcejkwg4rm4lxdw9","send":"200000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","gslice","gslice"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Atgv/+TCwlR+jzjx94p4Ik0IuGET4J/q2q9ciaL4UOQh"},"signature":"8/GjzwSci5BvbQ884uOK+ikywtQPFVUT3JFUFMUVD8lFVhHW3CV6rJ/Vo4MOcleuqo6IM52x3gXFq+UmVNY90w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dmg852ek58jncpphrlgm6e8rzqlk8qnswnmn5z","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3rYXqbAbmxcoxp8dY340bZPd0QD1gBeTCcJ3517OKLh3Mg6Nbr1bM/Ipp/k/NjXSEtjreeO7Go7b8ucMCG4t/Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dmg852ek58jncpphrlgm6e8rzqlk8qnswnmn5z","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0881F9yCDScd2Z8maWrtS+EkelJFVYOdYIV8GokPMLwdApkibvT5NG/DW60HPsmy7ZpBnlek8zmPQ35RniDncQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dmg852ek58jncpphrlgm6e8rzqlk8qnswnmn5z","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"zD13AOP2Adq9vdc+OZ9fAveK5uS0ucVKjkio2hjDRC48e3S0oR15Bjj1YkVnK64o0Wb3jEC3KeTc/oOS48D75g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dmg852ek58jncpphrlgm6e8rzqlk8qnswnmn5z","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"NAm9GjpD49vGY/fpmwc9wOvWw9CcQ1tb9NB8VLBKbxF+1dSNZkIyT6FRmxYPBrjhPRPDRvLbO2UyYwEqbxb1tw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dmg852ek58jncpphrlgm6e8rzqlk8qnswnmn5z","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"BCDTeQB+DgRLDym5FYeZ/IStfNth7F2iALOYIVt60Z8tqI2Kl6rJlkqfOsfah5LZPue/KARjrO4GlfeEj0QpKw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dmg852ek58jncpphrlgm6e8rzqlk8qnswnmn5z","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"gipmE3nDHSpnvFXgyQ3D/3gNimjoFzlB+Oenwlb2rsMQ0tM56V+2Lq0aFuMYTyEBVMjcTCY6s5UwFaQNiuTcUA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dmg852ek58jncpphrlgm6e8rzqlk8qnswnmn5z","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sxLZ4/s6TaxX8ZW5XkUYbpxPXcpyxeIMlJdcDWflio4jt4hBROkLsRgJT2Fofr5srTuey0RLrJk9vqvnbxH27A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dmg852ek58jncpphrlgm6e8rzqlk8qnswnmn5z","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"2tyYWKOcdEja1nPU/2FfaWgzVq+dcpbPtul26E1uaidILtE5pyGt1ljkUb+yNoZzFgB3f6mGab6E982ocftRwQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dmg852ek58jncpphrlgm6e8rzqlk8qnswnmn5z","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"18Z8VWyGP4wyfaQepEQlijNcqD1tykxMopdElLNoZoUKZhnKBxHUnZXNt77Y2AE0YnwrGZ4xKIU2lVQAEfFNTg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dmg852ek58jncpphrlgm6e8rzqlk8qnswnmn5z","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"f5O/gPtuvBrf0ueubRxdh+m24Ay1IKAccRnXqZtUEOAHvc6u5NmnszxO4xvGuEQaWT13DUZfewsOOj8s9DWvBA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dmg852ek58jncpphrlgm6e8rzqlk8qnswnmn5z","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"k65ZmVT5cb8QgNNTNMKZRCyblwa7ARSDjQ6rh7FslAExLxe36wYRUJYcCgBtekcA2Vgi/ekPnWcvlJmj2NFkBw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dmg852ek58jncpphrlgm6e8rzqlk8qnswnmn5z","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"byRDu7+KBr0X8t8zXI6NmGBxDQifbHnsbgmSAOUaShsWm7TVemDl1kJQ7gMkxbuzh9phHTioWvWvRLEfxjMJnQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dmg852ek58jncpphrlgm6e8rzqlk8qnswnmn5z","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"B6hpo0h925tVRKXEQLyRO9Z7h/8wFvRUAHqDQF41CPsw+hDV3a7p/dXYw0idTUhaWFGuUug7aJFz0hJYU+bSDA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dmg852ek58jncpphrlgm6e8rzqlk8qnswnmn5z","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3TTQ1udPY9Ba6lRhuLf3PsrjpXwjisbQtULrQA721ItiGn9gf/8knmLYcz6IIdpDnTnZIo86gu6WKKA7vUZ0ww=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dmg852ek58jncpphrlgm6e8rzqlk8qnswnmn5z","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"x8eHjaN3zovcU5zteRebgQDlI3qqvgPS733UzOiWb1FrdMUaMlDLYf491UoW7Z03JaTvyulsw7Mqu0gJq4fOkA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dmg852ek58jncpphrlgm6e8rzqlk8qnswnmn5z","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"lQdlLiXRJL9y7Y/zgJhcSEnoBPPc1wnG27SNNKf6dwQY/yRL2rCzRF6dbxSSBvs0eCCp+xIiqKYfCkOvosx+Gg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dmg852ek58jncpphrlgm6e8rzqlk8qnswnmn5z","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"r1kFYD+hnPV5R/axvV13A1QYxuzXeucvE2jOROXI4phedE+UtSaUTEfFeR3pF2FjZKi1fDMna+yPsW0APRRQog=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dmg852ek58jncpphrlgm6e8rzqlk8qnswnmn5z","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"/nDUryqwq1eOXc3KLuzuXCK+O6kJTTcyK91FmXdyde0OkNoeA9r+in4U0/tyJYJnvA7E0iJTxI9M0a86FYkr0A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dmg852ek58jncpphrlgm6e8rzqlk8qnswnmn5z","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"gHVjO62fL/tdKix3cBYuhA21ArJUS8YKiHqi5TqgOrZQ4jLgJSVfuhiFVl/r6JG60gEYkzzT9fxuQIEnchuhIg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dmg852ek58jncpphrlgm6e8rzqlk8qnswnmn5z","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9km6JM/TNWAJe6sfoSDOCijJFjSgZZKJMQtCkS4yQEgTvdZ6Odu0Wgr2VTk48clj23lPkraX1gHga8ZWN2dgFw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dmg852ek58jncpphrlgm6e8rzqlk8qnswnmn5z","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"tucxcXhuM0eVhrlku0TX5Alr84RSHvVNsHVSisrUmVkxZMCGaPKW97HtPkbDrJUNnBuvkpeBiOtq7JTocgcu7Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dmg852ek58jncpphrlgm6e8rzqlk8qnswnmn5z","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OzU+w1PXbHBzO+vWnb0kGstxAePeTHWNSPvTpteWMwU9+8/r1ky8zW/GfQb8EQMnxkKM68nHsduHnVwcza+ztQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1dmg852ek58jncpphrlgm6e8rzqlk8qnswnmn5z","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"gw0BUnmzpq3yw/w67TOu611JBDHznhdXBxl/kLQyf6BOm53pRZHb1r61k2elGlvPoCwkH+OSsumEgkY9nXjI7A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1dmg852ek58jncpphrlgm6e8rzqlk8qnswnmn5z","to_address":"g1kkhrcr7rnay67zsynmrrxmwrlfr7yfsuu669wk","amount":"230000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Any7DQ/YvG7l6skmy1bhS3OwGQ7ZgYSWMkGOUNXaes3/"},"signature":"e4iGSbeaSpdD/aJ0O4/GZaO+tfQDeBN4VNx/7is4EcYiZOxCKfJQf0oeJ5Y3inGJ7epf3fZhbZdOA2iwzuPpeA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1kkhrcr7rnay67zsynmrrxmwrlfr7yfsuu669wk","send":"200000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","bumwiser","bumwiser"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"At0REeqvgrSR/YAi3wOjOOV+87fR/8+0N+eVmwzLfEiq"},"signature":"Zao0CI7pCnDDu6eMV4DuUC8CzgOvfqOQsrWCjC56Y/RfCkqGzlzPRVLWCbMEI7m/KLoW5vhS8C8vDk80R7RIOg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1mhnd9g3zcc8k9yh5lccjc9jtc2zk4w7n5gd0kl","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"E0h4P7y59QrktzJSibq+cFvmdTbcShaKT+rEtTR8zwoHa74qV6d36DWumFa12o0QuG7WbkFHvMac9DJUB8d3lA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","send":"","pkg_path":"gno.land/r/demo/users","func":"GetUserByAddress","args":["g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"73mp5UwkeO8/KGyWRCot2Vm6M8D/umaKq9CiNaasn3IfncIKbnIwj6JiGpPfb6C2M4oT9xxTeEn4hAE2/qnYLg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1c8cl6t8cw42uuw63geyg7qnx7z09m52u5t0ky9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"wRN7qvalN/0Qi7CeM3RDPFH054LutoQbtZxxizzLcwErzkmO/PRGFwqLvGYVBECGGRt7nAb3B82BHnT+Efoulw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1c8cl6t8cw42uuw63geyg7qnx7z09m52u5t0ky9","package":{"name":"louis","path":"gno.land/r//louis","files":[{"name":"GRC20.gno","body":"package louis\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ufmt\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tlouis *grc20.AdminToken\n\tadmin std.Address = \"g1c8cl6t8cw42uuw63geyg7qnx7z09m52u5t0ky9\"\n)\n\nfunc init() {\n\tlouis = grc20.NewAdminToken(\"louisToken\", \"louis\", 6)\n\tlouis.Mint(admin, 1000000000) // @administrator\n}\n\n// method proxies as public functions.\n//\n\n// getters.\n\nfunc TotalSupply() uint64 {\n\treturn louis.TotalSupply()\n}\n\nfunc BalanceOf(owner users.AddressOrName) uint64 {\n\tbalance, err := louis.BalanceOf(owner.Resolve())\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn balance\n}\n\nfunc Allowance(owner, spender users.AddressOrName) uint64 {\n\tallowance, err := louis.Allowance(owner.Resolve(), spender.Resolve())\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn allowance\n}\n\n// setters.\n\nfunc Transfer(to users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tlouis.Transfer(caller, to.Resolve(), amount)\n}\n\nfunc Approve(spender users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tlouis.Approve(caller, spender.Resolve(), amount)\n}\n\nfunc TransferFrom(from, to users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tlouis.TransferFrom(caller, from.Resolve(), to.Resolve(), amount)\n}\n\n// administration.\n\nfunc Mint(address users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tassertIsAdmin(caller)\n\tlouis.Mint(address.Resolve(), amount)\n}\n\nfunc Burn(address users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tassertIsAdmin(caller)\n\tlouis.Burn(address.Resolve(), amount)\n}\n\n// render.\n//\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tc := len(parts)\n\n\tswitch {\n\tcase path == \"\":\n\t\treturn louis.RenderHome()\n\tcase c == 2 \u0026\u0026 parts[0] == \"balance\":\n\t\towner := users.AddressOrName(parts[1])\n\t\tbalance, _ := louis.BalanceOf(owner.Resolve())\n\t\treturn ufmt.Sprintf(\"%d\\n\", balance)\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}\n\nfunc assertIsAdmin(address std.Address) {\n\tif address != admin {\n\t\tpanic(\"restricted access\")\n\t}\n}"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Am1iKZuPAPrAArVWCretQ/dBnj2TWr3vKjaegwcW+7R8"},"signature":"bWYveb0a7WeXb1bUakr1WiJU0l/XOu6e+hCgwPD4QcB0StnwDj6GDmaqxoggrqijcVbYAXXIhj20dh9gLh+QTA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1c8cl6t8cw42uuw63geyg7qnx7z09m52u5t0ky9","package":{"name":"louis","path":"gno.land/r//louis","files":[{"name":"GRC20.gno","body":"package louis\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ufmt\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tlouis *grc20.AdminToken\n\tadmin std.Address = \"g1c8cl6t8cw42uuw63geyg7qnx7z09m52u5t0ky9\"\n)\n\nfunc init() {\n\tlouis = grc20.NewAdminToken(\"louisToken\", \"louis\", 6)\n\tlouis.Mint(admin, 1000000000) // @administrator\n}\n\n// method proxies as public functions.\n//\n\n// getters.\n\nfunc TotalSupply() uint64 {\n\treturn louis.TotalSupply()\n}\n\nfunc BalanceOf(owner users.AddressOrName) uint64 {\n\tbalance, err := louis.BalanceOf(owner.Resolve())\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn balance\n}\n\nfunc Allowance(owner, spender users.AddressOrName) uint64 {\n\tallowance, err := louis.Allowance(owner.Resolve(), spender.Resolve())\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn allowance\n}\n\n// setters.\n\nfunc Transfer(to users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tlouis.Transfer(caller, to.Resolve(), amount)\n}\n\nfunc Approve(spender users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tlouis.Approve(caller, spender.Resolve(), amount)\n}\n\nfunc TransferFrom(from, to users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tlouis.TransferFrom(caller, from.Resolve(), to.Resolve(), amount)\n}\n\n// administration.\n\nfunc Mint(address users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tassertIsAdmin(caller)\n\tlouis.Mint(address.Resolve(), amount)\n}\n\nfunc Burn(address users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tassertIsAdmin(caller)\n\tlouis.Burn(address.Resolve(), amount)\n}\n\n// render.\n//\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tc := len(parts)\n\n\tswitch {\n\tcase path == \"\":\n\t\treturn louis.RenderHome()\n\tcase c == 2 \u0026\u0026 parts[0] == \"balance\":\n\t\towner := users.AddressOrName(parts[1])\n\t\tbalance, _ := louis.BalanceOf(owner.Resolve())\n\t\treturn ufmt.Sprintf(\"%d\\n\", balance)\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}\n\nfunc assertIsAdmin(address std.Address) {\n\tif address != admin {\n\t\tpanic(\"restricted access\")\n\t}\n}"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Am1iKZuPAPrAArVWCretQ/dBnj2TWr3vKjaegwcW+7R8"},"signature":"N7ao3gkYG2wuwA5adOjA3h1LkKMKNU49etjBh17IoXx8mtaHHWjv+remIAOMTkiVIZi0C4pTZLhzzQAOShqpEQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1c8cl6t8cw42uuw63geyg7qnx7z09m52u5t0ky9","package":{"name":"louis","path":"gno.land/r//louis","files":[{"name":"GRC20.gno","body":"package louis\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ufmt\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tlouis *grc20.AdminToken\n\tadmin std.Address = \"g1c8cl6t8cw42uuw63geyg7qnx7z09m52u5t0ky9\"\n)\n\nfunc init() {\n\tlouis = grc20.NewAdminToken(\"louisToken\", \"louis\", 6)\n\tlouis.Mint(admin, 1000000000) // @administrator\n}\n\n// method proxies as public functions.\n//\n\n// getters.\n\nfunc TotalSupply() uint64 {\n\treturn louis.TotalSupply()\n}\n\nfunc BalanceOf(owner users.AddressOrName) uint64 {\n\tbalance, err := louis.BalanceOf(owner.Resolve())\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn balance\n}\n\nfunc Allowance(owner, spender users.AddressOrName) uint64 {\n\tallowance, err := louis.Allowance(owner.Resolve(), spender.Resolve())\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn allowance\n}\n\n// setters.\n\nfunc Transfer(to users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tlouis.Transfer(caller, to.Resolve(), amount)\n}\n\nfunc Approve(spender users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tlouis.Approve(caller, spender.Resolve(), amount)\n}\n\nfunc TransferFrom(from, to users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tlouis.TransferFrom(caller, from.Resolve(), to.Resolve(), amount)\n}\n\n// administration.\n\nfunc Mint(address users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tassertIsAdmin(caller)\n\tlouis.Mint(address.Resolve(), amount)\n}\n\nfunc Burn(address users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tassertIsAdmin(caller)\n\tlouis.Burn(address.Resolve(), amount)\n}\n\n// render.\n//\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tc := len(parts)\n\n\tswitch {\n\tcase path == \"\":\n\t\treturn louis.RenderHome()\n\tcase c == 2 \u0026\u0026 parts[0] == \"balance\":\n\t\towner := users.AddressOrName(parts[1])\n\t\tbalance, _ := louis.BalanceOf(owner.Resolve())\n\t\treturn ufmt.Sprintf(\"%d\\n\", balance)\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}\n\nfunc assertIsAdmin(address std.Address) {\n\tif address != admin {\n\t\tpanic(\"restricted access\")\n\t}\n}"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Am1iKZuPAPrAArVWCretQ/dBnj2TWr3vKjaegwcW+7R8"},"signature":"uwvDTTKvHmAaBGlkasA/2erD9VvHO7Fy3jd6QY1fBPYqsEXf3ZQAwnWxek8zcKvKFZmO0eZ/6rAZ2FSJEDopXA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1c8cl6t8cw42uuw63geyg7qnx7z09m52u5t0ky9","package":{"name":"louis","path":"gno.land/r//louis","files":[{"name":"GRC20.gno","body":"package louis\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ufmt\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tlouis *grc20.AdminToken\n\tadmin std.Address = \"g1c8cl6t8cw42uuw63geyg7qnx7z09m52u5t0ky9\"\n)\n\nfunc init() {\n\tlouis = grc20.NewAdminToken(\"louisToken\", \"louis\", 6)\n\tlouis.Mint(admin, 1000000000) // @administrator\n}\n\n// method proxies as public functions.\n//\n\n// getters.\n\nfunc TotalSupply() uint64 {\n\treturn louis.TotalSupply()\n}\n\nfunc BalanceOf(owner users.AddressOrName) uint64 {\n\tbalance, err := louis.BalanceOf(owner.Resolve())\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn balance\n}\n\nfunc Allowance(owner, spender users.AddressOrName) uint64 {\n\tallowance, err := louis.Allowance(owner.Resolve(), spender.Resolve())\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn allowance\n}\n\n// setters.\n\nfunc Transfer(to users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tlouis.Transfer(caller, to.Resolve(), amount)\n}\n\nfunc Approve(spender users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tlouis.Approve(caller, spender.Resolve(), amount)\n}\n\nfunc TransferFrom(from, to users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tlouis.TransferFrom(caller, from.Resolve(), to.Resolve(), amount)\n}\n\n// administration.\n\nfunc Mint(address users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tassertIsAdmin(caller)\n\tlouis.Mint(address.Resolve(), amount)\n}\n\nfunc Burn(address users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tassertIsAdmin(caller)\n\tlouis.Burn(address.Resolve(), amount)\n}\n\n// render.\n//\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tc := len(parts)\n\n\tswitch {\n\tcase path == \"\":\n\t\treturn louis.RenderHome()\n\tcase c == 2 \u0026\u0026 parts[0] == \"balance\":\n\t\towner := users.AddressOrName(parts[1])\n\t\tbalance, _ := louis.BalanceOf(owner.Resolve())\n\t\treturn ufmt.Sprintf(\"%d\\n\", balance)\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}\n\nfunc assertIsAdmin(address std.Address) {\n\tif address != admin {\n\t\tpanic(\"restricted access\")\n\t}\n}"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Am1iKZuPAPrAArVWCretQ/dBnj2TWr3vKjaegwcW+7R8"},"signature":"ZkZUuKKst9LNWQqGOJIg6rsjUo0hJNQSE/l/g/ZPTAtN7LfCvbUWavC/N/nTpGWOhsZ/tm+WeJILASBsKsqY5w=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1c8cl6t8cw42uuw63geyg7qnx7z09m52u5t0ky9","package":{"name":"louis","path":"gno.land/r//louis","files":[{"name":"package.gno","body":"package louis\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ufmt\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tlouis *grc20.AdminToken\n\tadmin std.Address = \"g1c8cl6t8cw42uuw63geyg7qnx7z09m52u5t0ky9\"\n)\n\nfunc init() {\n\tlouis = grc20.NewAdminToken(\"louisToken\", \"louis\", 6)\n\tlouis.Mint(admin, 1000000000) // @administrator\n}\n\n// method proxies as public functions.\n//\n\n// getters.\n\nfunc TotalSupply() uint64 {\n\treturn louis.TotalSupply()\n}\n\nfunc BalanceOf(owner users.AddressOrName) uint64 {\n\tbalance, err := louis.BalanceOf(owner.Resolve())\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn balance\n}\n\nfunc Allowance(owner, spender users.AddressOrName) uint64 {\n\tallowance, err := louis.Allowance(owner.Resolve(), spender.Resolve())\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn allowance\n}\n\n// setters.\n\nfunc Transfer(to users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tlouis.Transfer(caller, to.Resolve(), amount)\n}\n\nfunc Approve(spender users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tlouis.Approve(caller, spender.Resolve(), amount)\n}\n\nfunc TransferFrom(from, to users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tlouis.TransferFrom(caller, from.Resolve(), to.Resolve(), amount)\n}\n\n// administration.\n\nfunc Mint(address users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tassertIsAdmin(caller)\n\tlouis.Mint(address.Resolve(), amount)\n}\n\nfunc Burn(address users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tassertIsAdmin(caller)\n\tlouis.Burn(address.Resolve(), amount)\n}\n\n// render.\n//\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tc := len(parts)\n\n\tswitch {\n\tcase path == \"\":\n\t\treturn louis.RenderHome()\n\tcase c == 2 \u0026\u0026 parts[0] == \"balance\":\n\t\towner := users.AddressOrName(parts[1])\n\t\tbalance, _ := louis.BalanceOf(owner.Resolve())\n\t\treturn ufmt.Sprintf(\"%d\\n\", balance)\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}\n\nfunc assertIsAdmin(address std.Address) {\n\tif address != admin {\n\t\tpanic(\"restricted access\")\n\t}\n}"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Am1iKZuPAPrAArVWCretQ/dBnj2TWr3vKjaegwcW+7R8"},"signature":"ZUhPLj4av1LrJHxnbsQGOLi53fbjBYI8nlbqGvlXPm9Jnj1cnbhQv9JxY5e2LvsvDs9eabkpFeLXWelEHKUE9Q=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1c8cl6t8cw42uuw63geyg7qnx7z09m52u5t0ky9","package":{"name":"foo","path":"gno.land/r//foo","files":[{"name":"package.gno","body":"package louis\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ufmt\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tlouis *grc20.AdminToken\n\tadmin std.Address = \"g1c8cl6t8cw42uuw63geyg7qnx7z09m52u5t0ky9\"\n)\n\nfunc init() {\n\tlouis = grc20.NewAdminToken(\"louisToken\", \"louis\", 6)\n\tlouis.Mint(admin, 1000000000) // @administrator\n}\n\n// method proxies as public functions.\n//\n\n// getters.\n\nfunc TotalSupply() uint64 {\n\treturn louis.TotalSupply()\n}\n\nfunc BalanceOf(owner users.AddressOrName) uint64 {\n\tbalance, err := louis.BalanceOf(owner.Resolve())\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn balance\n}\n\nfunc Allowance(owner, spender users.AddressOrName) uint64 {\n\tallowance, err := louis.Allowance(owner.Resolve(), spender.Resolve())\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn allowance\n}\n\n// setters.\n\nfunc Transfer(to users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tlouis.Transfer(caller, to.Resolve(), amount)\n}\n\nfunc Approve(spender users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tlouis.Approve(caller, spender.Resolve(), amount)\n}\n\nfunc TransferFrom(from, to users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tlouis.TransferFrom(caller, from.Resolve(), to.Resolve(), amount)\n}\n\n// administration.\n\nfunc Mint(address users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tassertIsAdmin(caller)\n\tlouis.Mint(address.Resolve(), amount)\n}\n\nfunc Burn(address users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tassertIsAdmin(caller)\n\tlouis.Burn(address.Resolve(), amount)\n}\n\n// render.\n//\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tc := len(parts)\n\n\tswitch {\n\tcase path == \"\":\n\t\treturn louis.RenderHome()\n\tcase c == 2 \u0026\u0026 parts[0] == \"balance\":\n\t\towner := users.AddressOrName(parts[1])\n\t\tbalance, _ := louis.BalanceOf(owner.Resolve())\n\t\treturn ufmt.Sprintf(\"%d\\n\", balance)\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}\n\nfunc assertIsAdmin(address std.Address) {\n\tif address != admin {\n\t\tpanic(\"restricted access\")\n\t}\n}"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Am1iKZuPAPrAArVWCretQ/dBnj2TWr3vKjaegwcW+7R8"},"signature":"zYXYS3B5CO/mxa246+vdECGJzhiopSqfhGiHayTuIVoCHZAP2myrzyQflJZDTQrhVWW7mcnIEHBNOU1gPW24CA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1c8cl6t8cw42uuw63geyg7qnx7z09m52u5t0ky9","package":{"name":"louis","path":"gno.land/r//louis","files":[{"name":"package.gno","body":"package louis\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ufmt\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tlouis *grc20.AdminToken\n\tadmin std.Address = \"g1c8cl6t8cw42uuw63geyg7qnx7z09m52u5t0ky9\"\n)\n\nfunc init() {\n\tlouis = grc20.NewAdminToken(\"louisToken\", \"louis\", 6)\n\tlouis.Mint(admin, 1000000000) // @administrator\n}\n\n// method proxies as public functions.\n//\n\n// getters.\n\nfunc TotalSupply() uint64 {\n\treturn louis.TotalSupply()\n}\n\nfunc BalanceOf(owner users.AddressOrName) uint64 {\n\tbalance, err := louis.BalanceOf(owner.Resolve())\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn balance\n}\n\nfunc Allowance(owner, spender users.AddressOrName) uint64 {\n\tallowance, err := louis.Allowance(owner.Resolve(), spender.Resolve())\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn allowance\n}\n\n// setters.\n\nfunc Transfer(to users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tlouis.Transfer(caller, to.Resolve(), amount)\n}\n\nfunc Approve(spender users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tlouis.Approve(caller, spender.Resolve(), amount)\n}\n\nfunc TransferFrom(from, to users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tlouis.TransferFrom(caller, from.Resolve(), to.Resolve(), amount)\n}\n\n// administration.\n\nfunc Mint(address users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tassertIsAdmin(caller)\n\tlouis.Mint(address.Resolve(), amount)\n}\n\nfunc Burn(address users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tassertIsAdmin(caller)\n\tlouis.Burn(address.Resolve(), amount)\n}\n\n// render.\n//\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tc := len(parts)\n\n\tswitch {\n\tcase path == \"\":\n\t\treturn louis.RenderHome()\n\tcase c == 2 \u0026\u0026 parts[0] == \"balance\":\n\t\towner := users.AddressOrName(parts[1])\n\t\tbalance, _ := louis.BalanceOf(owner.Resolve())\n\t\treturn ufmt.Sprintf(\"%d\\n\", balance)\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}\n\nfunc assertIsAdmin(address std.Address) {\n\tif address != admin {\n\t\tpanic(\"restricted access\")\n\t}\n}"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Am1iKZuPAPrAArVWCretQ/dBnj2TWr3vKjaegwcW+7R8"},"signature":"ch8PahZajFJggWZDFPETWu/YlCTpFly+2esGwGFqhZYDLGo3lOG7uiUWrCo/rhvnfOZYvO2GunYGpDJGPsOYcA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1c8cl6t8cw42uuw63geyg7qnx7z09m52u5t0ky9","package":{"name":"louis","path":"gno.land/r//louis","files":[{"name":"package.gno","body":"package louis\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ufmt\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tlouis *grc20.AdminToken\n\tadmin std.Address = \"g1c8cl6t8cw42uuw63geyg7qnx7z09m52u5t0ky9\"\n)\n\nfunc init() {\n\tlouis = grc20.NewAdminToken(\"louisToken\", \"louis\", 6)\n\tlouis.Mint(admin, 1000000000) // @administrator\n}\n\n// method proxies as public functions.\n//\n\n// getters.\n\nfunc TotalSupply() uint64 {\n\treturn louis.TotalSupply()\n}\n\nfunc BalanceOf(owner users.AddressOrName) uint64 {\n\tbalance, err := louis.BalanceOf(owner.Resolve())\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn balance\n}\n\nfunc Allowance(owner, spender users.AddressOrName) uint64 {\n\tallowance, err := louis.Allowance(owner.Resolve(), spender.Resolve())\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn allowance\n}\n\n// setters.\n\nfunc Transfer(to users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tlouis.Transfer(caller, to.Resolve(), amount)\n}\n\nfunc Approve(spender users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tlouis.Approve(caller, spender.Resolve(), amount)\n}\n\nfunc TransferFrom(from, to users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tlouis.TransferFrom(caller, from.Resolve(), to.Resolve(), amount)\n}\n\n// administration.\n\nfunc Mint(address users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tassertIsAdmin(caller)\n\tlouis.Mint(address.Resolve(), amount)\n}\n\nfunc Burn(address users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tassertIsAdmin(caller)\n\tlouis.Burn(address.Resolve(), amount)\n}\n\n// render.\n//\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tc := len(parts)\n\n\tswitch {\n\tcase path == \"\":\n\t\treturn louis.RenderHome()\n\tcase c == 2 \u0026\u0026 parts[0] == \"balance\":\n\t\towner := users.AddressOrName(parts[1])\n\t\tbalance, _ := louis.BalanceOf(owner.Resolve())\n\t\treturn ufmt.Sprintf(\"%d\\n\", balance)\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}\n\nfunc assertIsAdmin(address std.Address) {\n\tif address != admin {\n\t\tpanic(\"restricted access\")\n\t}\n}"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Am1iKZuPAPrAArVWCretQ/dBnj2TWr3vKjaegwcW+7R8"},"signature":"dUsLThsUxHyWb5aGFs2DUvHW9++az8elH/oWP1pd8o8EAijvKCM/3RliOh4fxjP6U7PijqXMlBjE/cuDYIqKPQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1c8cl6t8cw42uuw63geyg7qnx7z09m52u5t0ky9","package":{"name":"louis","path":"gno.land/r//louis","files":[{"name":"package.gno","body":"package louis\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ufmt\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tlouis *grc20.AdminToken\n\tadmin std.Address = \"g1c8cl6t8cw42uuw63geyg7qnx7z09m52u5t0ky9\"\n)\n\nfunc init() {\n\tlouis = grc20.NewAdminToken(\"louisToken\", \"louis\", 6)\n\tlouis.Mint(admin, 1000000000) // @administrator\n}\n\n// method proxies as public functions.\n//\n\n// getters.\n\nfunc TotalSupply() uint64 {\n\treturn louis.TotalSupply()\n}\n\nfunc BalanceOf(owner users.AddressOrName) uint64 {\n\tbalance, err := louis.BalanceOf(owner.Resolve())\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn balance\n}\n\nfunc Allowance(owner, spender users.AddressOrName) uint64 {\n\tallowance, err := louis.Allowance(owner.Resolve(), spender.Resolve())\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn allowance\n}\n\n// setters.\n\nfunc Transfer(to users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tlouis.Transfer(caller, to.Resolve(), amount)\n}\n\nfunc Approve(spender users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tlouis.Approve(caller, spender.Resolve(), amount)\n}\n\nfunc TransferFrom(from, to users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tlouis.TransferFrom(caller, from.Resolve(), to.Resolve(), amount)\n}\n\n// administration.\n\nfunc Mint(address users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tassertIsAdmin(caller)\n\tlouis.Mint(address.Resolve(), amount)\n}\n\nfunc Burn(address users.AddressOrName, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tassertIsAdmin(caller)\n\tlouis.Burn(address.Resolve(), amount)\n}\n\n// render.\n//\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tc := len(parts)\n\n\tswitch {\n\tcase path == \"\":\n\t\treturn louis.RenderHome()\n\tcase c == 2 \u0026\u0026 parts[0] == \"balance\":\n\t\towner := users.AddressOrName(parts[1])\n\t\tbalance, _ := louis.BalanceOf(owner.Resolve())\n\t\treturn ufmt.Sprintf(\"%d\\n\", balance)\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}\n\nfunc assertIsAdmin(address std.Address) {\n\tif address != admin {\n\t\tpanic(\"restricted access\")\n\t}\n}"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Am1iKZuPAPrAArVWCretQ/dBnj2TWr3vKjaegwcW+7R8"},"signature":"aRAx27AcNvb8FN1RAl0+azmy+wBeNFTdrq0bnjxi8QkQMyD2ewjQgaPT8yavZydcePVF9FPpFwZA9qLS0os/9w=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1c8cl6t8cw42uuw63geyg7qnx7z09m52u5t0ky9","package":{"name":"hello","path":"gno.land/r//hello","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n return \"Hello World!\"\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Am1iKZuPAPrAArVWCretQ/dBnj2TWr3vKjaegwcW+7R8"},"signature":"nVqI1Ps6BEzkte5p6bZZcnEaFbmUcPSpaTo8qKkSA25nMZVnx8QTodvqF/WcQ55ldetBpNMkUGCxLLWOKMMNWQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1rdld2ay4c3r3eghk563sz6ne79mmplcl8zatuu","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"bhTn0PZVFwPbBNly+l2zCwHsm7d1CeHhFkx0vySE765rJ5BZDNTRclvkTe1CIfhTyVSHH79R1vwR9EcN/HKvEw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1kcq7hlduvhzrj0pq4vkfmuefl43wau8tgjdnww","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1nKelIBrMPQohZMS3OBapDQsQxka1jgDuhlJ8M7QuPwNZdChaBbQlHOFQeKyllvzfDGAVe/tjOe/Y75DA+GnIw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g13d7jc32adhc39erm5me38w5v7ej7lpvlnqjk73","to_address":"g1rdld2ay4c3r3eghk563sz6ne79mmplcl8zatuu","amount":"3000000ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/+cjV0/gZkWzMqCul8aP5hC7M3yliIs17uinn/+66uR"},"signature":"KBjrsLe6hPtbLk+xelceBBntdatvSkbuenrVHwxVbsEypLpdMgdRAFlLnY0Z7mjth0ei4CHRo55aSUtbhoP0GQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g13d7jc32adhc39erm5me38w5v7ej7lpvlnqjk73","to_address":"g1rdld2ay4c3r3eghk563sz6ne79mmplcl8zatuu","amount":"993000000ugnot"}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A/+cjV0/gZkWzMqCul8aP5hC7M3yliIs17uinn/+66uR"},"signature":"YK3cTwwQs93dnyADLmMp12+1ZC/Db4jVSLHxF9YrEuU7IH5s8CjXaOFdh1HRLEFmtvjAqhci/xieCsB3BoR4yg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1rdld2ay4c3r3eghk563sz6ne79mmplcl8zatuu","send":"20000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","gnostudio","https://gno.studio"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AmDuuTgSMdrhG49g2OdOaaPx5L91eIcZySaYLTyfs2K+"},"signature":"3yLiYapxroO5eCytLXQ3euDFbCUFbY1C8FTnoNkVotsYReIgoLRidaP0rp6Q21yNMpl8BMRb00tkeD+RPUqk8Q=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1pculvt75jyp7fdwzr2slvyr4u6tfxal2vzxcjz","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"+xhyWR7Akv6RXEQ5vr70KIFF19r7NWwPriQEVLGbpzMc6ZT2lw7wQzRFslRJ+Q2pGbh/A3bitDT8DpPaH+GL1A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1pculvt75jyp7fdwzr2slvyr4u6tfxal2vzxcjz","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5woSUWi0qCF5OgINWfw/Oz8nrdCE7u1UxYDw3J+etqgpKILp3fMrdjeGUiJW+56yl483PvjX2YrlUCl/bCf5pw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g13qpel38unrma0nyrj29tr903pq7dpeecsmlu8z","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"uVhbq7zjLl+/AjHaHIL2S8g54vJqXL0fHn7IyNHxcQgiKTGF6Gcxs7kqlWahWH0l7xnEJ6VHtwJFDzyoeJt6Fg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","to_address":"g13qpel38unrma0nyrj29tr903pq7dpeecsmlu8z","amount":"1111ugnot"}],"fee":{"gas_wanted":"5000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"zeDlMiEVzfeyJfwr8dG23GWDMMp+dDWyA+imOs+B6IkE4dyNYbeDzjNgpnBFNrq4izF8GZgo/S/DQq8CkVfwbg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1kpptltmd8jmwq5et5udh3ld8qq4ksqm9kj0vs4","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"G/vibORa1i2e3zlheqmceV2Z1fT/JDkSPltcjfwSFSJ5ya6dNKc0qBsuqxMNah1xFPsvZF1g3dpl1yD//Yo03Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1lmvrrrr4er2us84h2732sru76c9zl2nvknha8c","to_address":"g1kpptltmd8jmwq5et5udh3ld8qq4ksqm9kj0vs4","amount":"10000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AoTh14aoDz7iGb+UgHIlC5BuwrTQhiClW4UClIZSxdix"},"signature":"qwQP5uyoCL0ubif8sj3xcOt5GrCSy81DHS4BwiNS/mAZW3C3cxPsbD/VRe7QYEOSc7T7OP20atMVBMmt8Z0bxA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1d559xluhls2m9eh3emsy4fvz6pds5egezuxzej","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"r2QAEpyDipTBFM8VPDsm1ifZDA1SgRJfRjoQsqA493AQMwRd1LbaK3DmuXdyZQGcrtDq1E0LC8OLoYz7evg/Kg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"dwSCn4g7XU2UdYQfAZ2GcZn8gQWT9s8rg+jyM/LjJW0IRC+l60WQREmjzHSx43TK2+rWu4Dm1hhPiUrfy+Nf4g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"hEvOlnmLcH6ocnqN70CvWFjlfZLuRiq9AcTFJjdy5roAuFf4Bpqj4C7kVO0NAOxLGSNVXwGLM+wYeWKV612ffA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RXbvdQwtC2Qpstjr828NyqUkTb+YrBxHNNZGjsl43/RxulqQylRc5TxpP4F1+5PUawWORbtBT2wAOkrjRh8W+Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r","send":"20000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","mikaelvallenet","Hello"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ai1fSOs+1E0KH14i/vLKTXLWIuDEFcw6XbRlDlvB7pQw"},"signature":"2NCU6htU2SYwPVFd4aorbt5ByKe2W9hHjMYKPrIVJTk9yjnfo+aHfwqQCOPVtEHLrBNpYdF2Plhx3feqbwHX4A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r","package":{"name":"mvc","path":"gno.land/r/mikaelvallenet/mvcoin","files":[{"name":"mvc.gno","body":"package mvc\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar (\n\tbanker *grc20.Banker\n\ttoken grc20.Token\n)\n\nfunc init() {\n\tbanker = grc20.NewBanker(\"MVCoin\", \"MVC\", 0)\n\ttoken = banker.Token()\n}\n\nfunc Faucet() string {\n\ttxSender := std.GetOrigCaller()\n\tif err := banker.Mint(txSender, 5); err != nil {\n\t\treturn err.Error()\n\t}\n\treturn \"5 MVC minted to \" + txSender.String() + \"! 🎉\"\n}\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tif len(parts) != 2 \u0026\u0026 parts[0] != \"balance\" {\n\t\treturn \"Invalid path, try /balance/\u003caddress\u003e\"\n\t}\n\n\taddr := std.Address(parts[1])\n\tbalance := token.BalanceOf(addr)\n\treturn ufmt.Sprintf(\"Balance of %s: %d\", addr.String(), balance)\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ai1fSOs+1E0KH14i/vLKTXLWIuDEFcw6XbRlDlvB7pQw"},"signature":"QdsOvdtXS9SNW2tfZu7JKRI2RUGXhODUplYPT4BwvMkFE9PwDVcKuVIPE17aYfTmZPx57L/PNLtEXA+z2muF8g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r","package":{"name":"mvc","path":"gno.land/r/mikaelvallenet/mvcoin","files":[{"name":"mvc.gno","body":"package mvc\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar (\n\tbanker *grc20.Banker\n\ttoken grc20.Token\n)\n\nfunc init() {\n\tbanker = grc20.NewBanker(\"MVCoin\", \"MVC\", 0)\n\ttoken = banker.Token()\n}\n\nfunc Faucet() string {\n\ttxSender := std.GetOrigCaller()\n\tif err := banker.Mint(txSender, 5); err != nil {\n\t\treturn err.Error()\n\t}\n\treturn \"5 MVC minted to \" + txSender.String() + \"! 🎉\"\n}\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tif len(parts) != 2 \u0026\u0026 parts[0] != \"balance\" {\n\t\treturn \"Invalid path, try /balance/\u003caddress\u003e\"\n\t}\n\n\taddr := std.Address(parts[1])\n\tbalance := token.BalanceOf(addr)\n\treturn ufmt.Sprintf(\"Balance of %s: %d\", addr.String(), balance)\n}"}]},"deposit":""}],"fee":{"gas_wanted":"3000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ai1fSOs+1E0KH14i/vLKTXLWIuDEFcw6XbRlDlvB7pQw"},"signature":"LIGcRX+WcRUX4qr4Vx2pmzDHnhfxuH73gvMV4hXkPjgsLJoMmgmK4L13WLsbuZJ3O8fr9M2sOp5fwyfH8wcE7A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r","package":{"name":"mvc","path":"gno.land/r/mikaelvallenet/mvcoin","files":[{"name":"mvc.gno","body":"package mvc\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar (\n\tbanker *grc20.Banker\n\ttoken grc20.Token\n)\n\nfunc init() {\n\tbanker = grc20.NewBanker(\"MVCoin\", \"MVC\", 0)\n\ttoken = banker.Token()\n}\n\nfunc Faucet() string {\n\ttxSender := std.GetOrigCaller()\n\tif err := banker.Mint(txSender, 5); err != nil {\n\t\treturn err.Error()\n\t}\n\treturn \"5 MVC minted to \" + txSender.String() + \"! 🎉\"\n}\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tif len(parts) != 2 \u0026\u0026 parts[0] != \"balance\" {\n\t\treturn \"Invalid path, try /balance/\u003caddress\u003e\"\n\t}\n\n\taddr := std.Address(parts[1])\n\tbalance := token.BalanceOf(addr)\n\treturn ufmt.Sprintf(\"Balance of %s: %d\", addr.String(), balance)\n}"}]},"deposit":""}],"fee":{"gas_wanted":"3000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ai1fSOs+1E0KH14i/vLKTXLWIuDEFcw6XbRlDlvB7pQw"},"signature":"UPc3kuwUlGJalauIFDvVelrRnaKxhb7BrXOG+L3GXzAp79kvQkWkms+PdHO2aBmXk6vuC02qwdECO4/apSKQrw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r","package":{"name":"mvc","path":"gno.land/r//mvc","files":[{"name":"package.gno","body":"package mvc\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar (\n\tbanker *grc20.Banker\n\ttoken grc20.Token\n)\n\nfunc init() {\n\tbanker = grc20.NewBanker(\"MVCoin\", \"MVC\", 0)\n\ttoken = banker.Token()\n}\n\nfunc Faucet() string {\n\ttxSender := std.GetOrigCaller()\n\tif err := banker.Mint(txSender, 5); err != nil {\n\t\treturn err.Error()\n\t}\n\treturn \"5 MVC minted to \" + txSender.String() + \"! 🎉\"\n}\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tif len(parts) != 2 \u0026\u0026 parts[0] != \"balance\" {\n\t\treturn \"Invalid path, try /balance/\u003caddress\u003e\"\n\t}\n\n\taddr := std.Address(parts[1])\n\tbalance := token.BalanceOf(addr)\n\treturn ufmt.Sprintf(\"Balance of %s: %d\", addr.String(), balance)\n}"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ai1fSOs+1E0KH14i/vLKTXLWIuDEFcw6XbRlDlvB7pQw"},"signature":"D4E2JpFXwceao/tgo01nq7HfHmOq0FjTjdlS52nVeoMWn9bi9OokV7WTpTbAwhXxPs6XYpwiI9K+of4PMZETDQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r","package":{"name":"mvc","path":"gno.land/r//mvc","files":[{"name":"package.gno","body":"package mvc\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar (\n\tbanker *grc20.Banker\n\ttoken grc20.Token\n)\n\nfunc init() {\n\tbanker = grc20.NewBanker(\"MVCoin\", \"MVC\", 0)\n\ttoken = banker.Token()\n}\n\nfunc Faucet() string {\n\ttxSender := std.GetOrigCaller()\n\tif err := banker.Mint(txSender, 5); err != nil {\n\t\treturn err.Error()\n\t}\n\treturn \"5 MVC minted to \" + txSender.String() + \"! 🎉\"\n}\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tif len(parts) != 2 \u0026\u0026 parts[0] != \"balance\" {\n\t\treturn \"Invalid path, try /balance/\u003caddress\u003e\"\n\t}\n\n\taddr := std.Address(parts[1])\n\tbalance := token.BalanceOf(addr)\n\treturn ufmt.Sprintf(\"Balance of %s: %d\", addr.String(), balance)\n}"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ai1fSOs+1E0KH14i/vLKTXLWIuDEFcw6XbRlDlvB7pQw"},"signature":"z9cUnCceWf7OYJqquxHOfSMJmJi1ffBjqptRmb/B8tlPrJU4dR/HGv4SnKMC+nwnOCUpZS2eGC+E2sCTpiq6TA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r","package":{"name":"mvc","path":"gno.land/r/mikaelvallenet/mvc","files":[{"name":"mvc.gno","body":"package mvc\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar (\n\tbanker *grc20.Banker\n\ttoken grc20.Token\n)\n\nfunc init() {\n\tbanker = grc20.NewBanker(\"MVCoin\", \"MVC\", 0)\n\ttoken = banker.Token()\n}\n\nfunc Faucet() string {\n\ttxSender := std.GetOrigCaller()\n\tif err := banker.Mint(txSender, 5); err != nil {\n\t\treturn err.Error()\n\t}\n\treturn \"5 MVC minted to \" + txSender.String() + \"! 🎉\"\n}\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tif len(parts) != 2 \u0026\u0026 parts[0] != \"balance\" {\n\t\treturn \"Invalid path, try /balance/\u003caddress\u003e\"\n\t}\n\n\taddr := std.Address(parts[1])\n\tbalance := token.BalanceOf(addr)\n\treturn ufmt.Sprintf(\"Balance of %s: %d\", addr.String(), balance)\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"3000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ai1fSOs+1E0KH14i/vLKTXLWIuDEFcw6XbRlDlvB7pQw"},"signature":"2ctpdx+YgFXCtwpsAdT1wsO1P81BQQ6Z/qVAGO8/ojtG9jZ7vPYI+q2uVyNlEckgL0Xk0rQmXPqVklJb5LdSzA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r","package":{"name":"mvc","path":"gno.land/r/mikaelvallenet/mvc","files":[{"name":"mvc.gno","body":"package mvc\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar (\n\tbanker *grc20.Banker\n\ttoken grc20.Token\n)\n\nfunc init() {\n\tbanker = grc20.NewBanker(\"MVCoin\", \"MVC\", 0)\n\ttoken = banker.Token()\n}\n\nfunc Faucet() string {\n\ttxSender := std.GetOrigCaller()\n\tif err := banker.Mint(txSender, 5); err != nil {\n\t\treturn err.Error()\n\t}\n\treturn \"5 MVC minted to \" + txSender.String() + \"!\"\n}\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tif len(parts) != 2 \u0026\u0026 parts[0] != \"balance\" {\n\t\treturn \"Invalid path, try /balance/\u003caddress\u003e\"\n\t}\n\n\taddr := std.Address(parts[1])\n\tbalance := token.BalanceOf(addr)\n\treturn ufmt.Sprintf(\"Balance of %s: %d\", addr.String(), balance)\n}"}]},"deposit":""}],"fee":{"gas_wanted":"3000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ai1fSOs+1E0KH14i/vLKTXLWIuDEFcw6XbRlDlvB7pQw"},"signature":"ZKrZQhWafZESpSZrX+LB7mMHGG/m8zuuEvjzv1qbRY1tnhBnhfVpuU/VVTRyo9LQX+C04FJZ2lySVI3VJE48rw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1pculvt75jyp7fdwzr2slvyr4u6tfxal2vzxcjz","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"auCM5ztupGgXbURm75pYuPX3DnFLjKqfH/nUdY4wVVp65HbPJ7lRJQG2BD21inopsoo+DJsuQFLBdYIUkwFJjw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1mhnd9g3zcc8k9yh5lccjc9jtc2zk4w7n5gd0kl","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"bhxWOhwYUvHnVJy17IMMWlRJAfrwyDEh2dnCLFjo77pjQm1Ek81RDw5JZ6NSk4/sruewMw7HguLETPrhQF/F1Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1qjr9v4qd9xmtzq4gvkspttynqfp4v68gut2ccq","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"eWFYxLlwYjHMz1vGfwvDvGKYZZfe1ZoVFDghy2E2twows03MSpjyIND9sWQeEgkLIPEseZUE6DtCKD8tdKXE4A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r","package":{"name":"mvc","path":"gno.land/r/mikaelvallenet/mvc","files":[{"name":"mvc.gno","body":"package mvc\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar (\n\tbanker *grc20.Banker // private banker.\n\tToken grc20.Token // public safe-object.\n)\n\nfunc init() {\n\tbanker = grc20.NewBanker(\"MikaelVallenetCoin\", \"MVC\", 4)\n\tToken = banker.Token()\n}\n\nfunc Faucet() string {\n\tcaller := std.PrevRealm().Addr()\n\tif err := banker.Mint(caller, 1_000_000); err != nil {\n\t\treturn \"error: \" + err.Error()\n\t}\n\treturn \"OK\"\n}\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tc := len(parts)\n\n\tswitch {\n\tcase path == \"\":\n\t\treturn banker.RenderHome() // XXX: should be Token.RenderHome()\n\tcase c == 2 \u0026\u0026 parts[0] == \"balance\":\n\t\towner := std.Address(parts[1])\n\t\tbalance := Token.BalanceOf(owner)\n\t\treturn ufmt.Sprintf(\"%d\\n\", balance)\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}"}]},"deposit":""}],"fee":{"gas_wanted":"3000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ai1fSOs+1E0KH14i/vLKTXLWIuDEFcw6XbRlDlvB7pQw"},"signature":"Vg0J6x0IQi3O+JXsCVGLmcUj1y3lAZ45Pv0WQOlwmfNjjRRzlVrTILUt9uebyA/Lj0+uXeEnhvB9wx0SN2Xfhg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r","package":{"name":"helloworld","path":"gno.land/r/mikaelvallenet/helloworld","files":[{"name":"helloworld.gno","body":"package helloworld\n\nfunc Render(path string) string {\n\treturn \"Hello, World! 🥳\\n\"\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"3000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ai1fSOs+1E0KH14i/vLKTXLWIuDEFcw6XbRlDlvB7pQw"},"signature":"Ud5H712ywuIX3/bb20ZuSETx3jvST4v5RCNds0LDyYZz0ezdkz88K8/o0UWiSsQA6V8F9w39aNqJXthwggtLSg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r","package":{"name":"hello","path":"gno.land/r//hello","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n return \"Hello World!\"\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ai1fSOs+1E0KH14i/vLKTXLWIuDEFcw6XbRlDlvB7pQw"},"signature":"XRXSXtGAfePRlDrDOrXJ2qAUedq1yywC5EjibidbzJQuu73LLrXLQQ1OdkByN4xpeirrh+MFexUU0aSqhqVt3g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r","package":{"name":"hello","path":"gno.land/r//hello","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n return \"Hello World!\"\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ai1fSOs+1E0KH14i/vLKTXLWIuDEFcw6XbRlDlvB7pQw"},"signature":"+IikUeXuozEH37bXAjSfXP1LioMAeW587CeIDHaudid7w2K+EbUYSrVegPNvgvJb88TaYlziT8pez16RZA6MEw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r","package":{"name":"hello","path":"gno.land/r//hello","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n return \"Hello World!\"\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ai1fSOs+1E0KH14i/vLKTXLWIuDEFcw6XbRlDlvB7pQw"},"signature":"QAeqbvlzubQ2W6UM/jpj/kRWtgnTu0DrD+R0bCohTLhIZ9eKd5G5UjuZAwvXxkNZDX/dXzMjP59b+LdhLXm+7Q=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r","package":{"name":"hello","path":"gno.land/r//hello","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n return \"Hello World!\"\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ai1fSOs+1E0KH14i/vLKTXLWIuDEFcw6XbRlDlvB7pQw"},"signature":"XeNu4GWNO6V5xJJPnf7RVYk5iouSBH7Sns4Djx5Ky1czETw7kOp4t2UBThnelY895nleH0nhXLdQ+dAZPHdW4g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r","package":{"name":"bar20","path":"gno.land/r/mikaelvallenet/bar20","files":[{"name":"mvc.gno","body":"// Package bar20 is similar to gno.land/r/demo/foo20 but exposes a safe-object\n// that can be used by `maketx run`, another contract importing foo20, and in\n// the future when we'll support `maketx call Token.XXX`.\npackage bar20\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar (\n\tbanker *grc20.Banker // private banker.\n\tToken grc20.Token // public safe-object.\n)\n\nfunc init() {\n\tbanker = grc20.NewBanker(\"Bar\", \"BAR\", 4)\n\tToken = banker.Token()\n}\n\nfunc Faucet() string {\n\tcaller := std.PrevRealm().Addr()\n\tif err := banker.Mint(caller, 1_000_000); err != nil {\n\t\treturn \"error: \" + err.Error()\n\t}\n\treturn \"OK\"\n}\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tc := len(parts)\n\n\tswitch {\n\tcase path == \"\":\n\t\treturn banker.RenderHome() // XXX: should be Token.RenderHome()\n\tcase c == 2 \u0026\u0026 parts[0] == \"balance\":\n\t\towner := std.Address(parts[1])\n\t\tbalance := Token.BalanceOf(owner)\n\t\treturn ufmt.Sprintf(\"%d\\n\", balance)\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"3000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ai1fSOs+1E0KH14i/vLKTXLWIuDEFcw6XbRlDlvB7pQw"},"signature":"eZJI5WlO8oPHC5YTXb90dnyZ2vl4c9PXycek3Yz8lBQOBCVNQfSWNK6Nw5I0Ik/rr08cLWEStHOhyH7Lip/Tgw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r","package":{"name":"foo20","path":"gno.land/r/mikaelvallenet/foo20","files":[{"name":"mvc.gno","body":"// foo20 is a GRC20 token contract where all the GRC20 methods are proxified\n// with top-level functions. see also gno.land/r/demo/bar20.\npackage foo20\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ownable\"\n\t\"gno.land/p/demo/ufmt\"\n\tpusers \"gno.land/p/demo/users\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tbanker *grc20.Banker\n\tadmin *ownable.Ownable\n\ttoken grc20.Token\n)\n\nfunc init() {\n\tadmin = ownable.NewWithAddress(\"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq\") // @manfred\n\tbanker = grc20.NewBanker(\"Foo\", \"FOO\", 4)\n\tbanker.Mint(admin.Owner(), 1000000*10000) // @administrator (1M)\n\ttoken = banker.Token()\n}\n\nfunc TotalSupply() uint64 { return token.TotalSupply() }\n\nfunc BalanceOf(owner pusers.AddressOrName) uint64 {\n\townerAddr := users.Resolve(owner)\n\treturn token.BalanceOf(ownerAddr)\n}\n\nfunc Allowance(owner, spender pusers.AddressOrName) uint64 {\n\townerAddr := users.Resolve(owner)\n\tspenderAddr := users.Resolve(spender)\n\treturn token.Allowance(ownerAddr, spenderAddr)\n}\n\nfunc Transfer(to pusers.AddressOrName, amount uint64) {\n\ttoAddr := users.Resolve(to)\n\tcheckErr(token.Transfer(toAddr, amount))\n}\n\nfunc Approve(spender pusers.AddressOrName, amount uint64) {\n\tspenderAddr := users.Resolve(spender)\n\tcheckErr(token.Approve(spenderAddr, amount))\n}\n\nfunc TransferFrom(from, to pusers.AddressOrName, amount uint64) {\n\tfromAddr := users.Resolve(from)\n\ttoAddr := users.Resolve(to)\n\tcheckErr(token.TransferFrom(fromAddr, toAddr, amount))\n}\n\n// Faucet is distributing foo20 tokens without restriction (unsafe).\n// For a real token faucet, you should take care of setting limits are asking payment.\nfunc Faucet() {\n\tcaller := std.PrevRealm().Addr()\n\tamount := uint64(1_000 * 10_000) // 1k\n\tcheckErr(banker.Mint(caller, amount))\n}\n\nfunc Mint(to pusers.AddressOrName, amount uint64) {\n\tadmin.AssertCallerIsOwner()\n\ttoAddr := users.Resolve(to)\n\tcheckErr(banker.Mint(toAddr, amount))\n}\n\nfunc Burn(from pusers.AddressOrName, amount uint64) {\n\tadmin.AssertCallerIsOwner()\n\tfromAddr := users.Resolve(from)\n\tcheckErr(banker.Burn(fromAddr, amount))\n}\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tc := len(parts)\n\n\tswitch {\n\tcase path == \"\":\n\t\treturn banker.RenderHome()\n\tcase c == 2 \u0026\u0026 parts[0] == \"balance\":\n\t\towner := pusers.AddressOrName(parts[1])\n\t\townerAddr := users.Resolve(owner)\n\t\tbalance := banker.BalanceOf(ownerAddr)\n\t\treturn ufmt.Sprintf(\"%d\\n\", balance)\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}\n\nfunc checkErr(err error) {\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"3000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ai1fSOs+1E0KH14i/vLKTXLWIuDEFcw6XbRlDlvB7pQw"},"signature":"/QxcGmI56F5e/TVLpmkEKH/vO+jdiKRJlXjbXnpb7FYMHWRiQ3BTEzXVQdSu0IIWzb8ycZZO7kQIYjrAELfz7A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r","package":{"name":"foo20","path":"gno.land/r/mikaelvallenet/foo20","files":[{"name":"mvc.gno","body":"// foo20 is a GRC20 token contract where all the GRC20 methods are proxified\n// with top-level functions. see also gno.land/r/demo/bar20.\npackage foo20\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ownable\"\n\t\"gno.land/p/demo/ufmt\"\n\tpusers \"gno.land/p/demo/users\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tbanker *grc20.Banker\n\tadmin *ownable.Ownable\n\ttoken grc20.Token\n)\n\nfunc init() {\n\tadmin = ownable.NewWithAddress(\"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq\") // @manfred\n\tbanker = grc20.NewBanker(\"Foo\", \"FOO\", 4)\n\tbanker.Mint(admin.Owner(), 1000000*10000) // @administrator (1M)\n\ttoken = banker.Token()\n}\n\nfunc TotalSupply() uint64 { return token.TotalSupply() }\n\nfunc BalanceOf(owner pusers.AddressOrName) uint64 {\n\townerAddr := users.Resolve(owner)\n\treturn token.BalanceOf(ownerAddr)\n}\n\nfunc Allowance(owner, spender pusers.AddressOrName) uint64 {\n\townerAddr := users.Resolve(owner)\n\tspenderAddr := users.Resolve(spender)\n\treturn token.Allowance(ownerAddr, spenderAddr)\n}\n\nfunc Transfer(to pusers.AddressOrName, amount uint64) {\n\ttoAddr := users.Resolve(to)\n\tcheckErr(token.Transfer(toAddr, amount))\n}\n\nfunc Approve(spender pusers.AddressOrName, amount uint64) {\n\tspenderAddr := users.Resolve(spender)\n\tcheckErr(token.Approve(spenderAddr, amount))\n}\n\nfunc TransferFrom(from, to pusers.AddressOrName, amount uint64) {\n\tfromAddr := users.Resolve(from)\n\ttoAddr := users.Resolve(to)\n\tcheckErr(token.TransferFrom(fromAddr, toAddr, amount))\n}\n\n// Faucet is distributing foo20 tokens without restriction (unsafe).\n// For a real token faucet, you should take care of setting limits are asking payment.\nfunc Faucet() {\n\tcaller := std.PrevRealm().Addr()\n\tamount := uint64(1_000 * 10_000) // 1k\n\tcheckErr(banker.Mint(caller, amount))\n}\n\nfunc Mint(to pusers.AddressOrName, amount uint64) {\n\tadmin.AssertCallerIsOwner()\n\ttoAddr := users.Resolve(to)\n\tcheckErr(banker.Mint(toAddr, amount))\n}\n\nfunc Burn(from pusers.AddressOrName, amount uint64) {\n\tadmin.AssertCallerIsOwner()\n\tfromAddr := users.Resolve(from)\n\tcheckErr(banker.Burn(fromAddr, amount))\n}\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tc := len(parts)\n\n\tswitch {\n\tcase path == \"\":\n\t\treturn banker.RenderHome()\n\tcase c == 2 \u0026\u0026 parts[0] == \"balance\":\n\t\towner := pusers.AddressOrName(parts[1])\n\t\townerAddr := users.Resolve(owner)\n\t\tbalance := banker.BalanceOf(ownerAddr)\n\t\treturn ufmt.Sprintf(\"%d\\n\", balance)\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}\n\nfunc checkErr(err error) {\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}"}]},"deposit":""}],"fee":{"gas_wanted":"4000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ai1fSOs+1E0KH14i/vLKTXLWIuDEFcw6XbRlDlvB7pQw"},"signature":"puqZoQNBrQBXYA6oua63V26pQdU3pxMwSPTafrsCSncbUmFIiUYlZjYNVRFrqiUhdh+WkD4z9lNK+BtnmmfmGw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r","package":{"name":"foo20","path":"gno.land/r/mikaelvallenet/foo20","files":[{"name":"mvc.gno","body":"// foo20 is a GRC20 token contract where all the GRC20 methods are proxified\n// with top-level functions. see also gno.land/r/demo/bar20.\npackage foo20\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ownable\"\n\t\"gno.land/p/demo/ufmt\"\n\tpusers \"gno.land/p/demo/users\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tbanker *grc20.Banker\n\tadmin *ownable.Ownable\n\ttoken grc20.Token\n)\n\nfunc init() {\n\tadmin = ownable.NewWithAddress(\"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq\") // @manfred\n\tbanker = grc20.NewBanker(\"Foo\", \"FOO\", 4)\n\tbanker.Mint(admin.Owner(), 1000000*10000) // @administrator (1M)\n\ttoken = banker.Token()\n}\n\nfunc TotalSupply() uint64 { return token.TotalSupply() }\n\nfunc BalanceOf(owner pusers.AddressOrName) uint64 {\n\townerAddr := users.Resolve(owner)\n\treturn token.BalanceOf(ownerAddr)\n}\n\nfunc Allowance(owner, spender pusers.AddressOrName) uint64 {\n\townerAddr := users.Resolve(owner)\n\tspenderAddr := users.Resolve(spender)\n\treturn token.Allowance(ownerAddr, spenderAddr)\n}\n\nfunc Transfer(to pusers.AddressOrName, amount uint64) {\n\ttoAddr := users.Resolve(to)\n\tcheckErr(token.Transfer(toAddr, amount))\n}\n\nfunc Approve(spender pusers.AddressOrName, amount uint64) {\n\tspenderAddr := users.Resolve(spender)\n\tcheckErr(token.Approve(spenderAddr, amount))\n}\n\nfunc TransferFrom(from, to pusers.AddressOrName, amount uint64) {\n\tfromAddr := users.Resolve(from)\n\ttoAddr := users.Resolve(to)\n\tcheckErr(token.TransferFrom(fromAddr, toAddr, amount))\n}\n\n// Faucet is distributing foo20 tokens without restriction (unsafe).\n// For a real token faucet, you should take care of setting limits are asking payment.\nfunc Faucet() {\n\tcaller := std.PrevRealm().Addr()\n\tamount := uint64(1_000 * 10_000) // 1k\n\tcheckErr(banker.Mint(caller, amount))\n}\n\nfunc Mint(to pusers.AddressOrName, amount uint64) {\n\tadmin.AssertCallerIsOwner()\n\ttoAddr := users.Resolve(to)\n\tcheckErr(banker.Mint(toAddr, amount))\n}\n\nfunc Burn(from pusers.AddressOrName, amount uint64) {\n\tadmin.AssertCallerIsOwner()\n\tfromAddr := users.Resolve(from)\n\tcheckErr(banker.Burn(fromAddr, amount))\n}\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tc := len(parts)\n\n\tswitch {\n\tcase path == \"\":\n\t\treturn banker.RenderHome()\n\tcase c == 2 \u0026\u0026 parts[0] == \"balance\":\n\t\towner := pusers.AddressOrName(parts[1])\n\t\townerAddr := users.Resolve(owner)\n\t\tbalance := banker.BalanceOf(ownerAddr)\n\t\treturn ufmt.Sprintf(\"%d\\n\", balance)\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}\n\nfunc checkErr(err error) {\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}"}]},"deposit":""}],"fee":{"gas_wanted":"14000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ai1fSOs+1E0KH14i/vLKTXLWIuDEFcw6XbRlDlvB7pQw"},"signature":"2hAa7FsuluLHup65HlluKMUWjQfXto5PKx03IYJk/CF2U8pa2XQFX2oy8XKmCllaGbHROcpCD/rcPWT77vF/5w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r","package":{"name":"bar20","path":"gno.land/r/mikaelvallenet/bar20","files":[{"name":"mvc.gno","body":"// Package bar20 is similar to gno.land/r/demo/foo20 but exposes a safe-object\n// that can be used by `maketx run`, another contract importing foo20, and in\n// the future when we'll support `maketx call Token.XXX`.\npackage bar20\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar (\n\tbanker *grc20.Banker // private banker.\n\tToken grc20.Token // public safe-object.\n)\n\nfunc init() {\n\tbanker = grc20.NewBanker(\"Bar\", \"BAR\", 4)\n\tToken = banker.Token()\n}\n\nfunc Faucet() string {\n\tcaller := std.PrevRealm().Addr()\n\tif err := banker.Mint(caller, 1000000); err != nil {\n\t\treturn \"error: \" + err.Error()\n\t}\n\treturn \"OK\"\n}\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tc := len(parts)\n\n\tswitch {\n\tcase path == \"\":\n\t\treturn banker.RenderHome() // XXX: should be Token.RenderHome()\n\tcase c == 2 \u0026\u0026 parts[0] == \"balance\":\n\t\towner := std.Address(parts[1])\n\t\tbalance := Token.BalanceOf(owner)\n\t\treturn ufmt.Sprintf(\"%d\\n\", balance)\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}"}]},"deposit":""}],"fee":{"gas_wanted":"14000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ai1fSOs+1E0KH14i/vLKTXLWIuDEFcw6XbRlDlvB7pQw"},"signature":"NJIb1tDFOyCQ/Pq6trCUbcSeJMfTehUVCBvhGtNewuBCT/0r/MgMe2KVIph1mMn5VxDMQj31MsVgt3ad/JzWhQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r","package":{"name":"tar20","path":"gno.land/r/mikaelvallenet/tar20","files":[{"name":"mvc.gno","body":"// Package bar20 is similar to gno.land/r/demo/foo20 but exposes a safe-object\n// that can be used by `maketx run`, another contract importing foo20, and in\n// the future when we'll support `maketx call Token.XXX`.\npackage tar20\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar (\n\tbanker *grc20.Banker // private banker.\n\tToken grc20.Token // public safe-object.\n)\n\nfunc init() {\n\tbanker = grc20.NewBanker(\"Bar\", \"BAR\", 4)\n\tToken = banker.Token()\n}\n\nfunc Faucet() string {\n\tcaller := std.PrevRealm().Addr()\n\tif err := banker.Mint(caller, 1_000_000); err != nil {\n\t\treturn \"error: \" + err.Error()\n\t}\n\treturn \"OK\"\n}\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tc := len(parts)\n\n\tswitch {\n\tcase path == \"\":\n\t\treturn banker.RenderHome() // XXX: should be Token.RenderHome()\n\tcase c == 2 \u0026\u0026 parts[0] == \"balance\":\n\t\towner := std.Address(parts[1])\n\t\tbalance := Token.BalanceOf(owner)\n\t\treturn ufmt.Sprintf(\"%d\\n\", balance)\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"14000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ai1fSOs+1E0KH14i/vLKTXLWIuDEFcw6XbRlDlvB7pQw"},"signature":"usjgUHrLdE8rQfx2cX3tsfwIm52MhLMZw+Fp9XyllCNl24rH1G198TLZJzfNAj49zlicQSvUHc7z67ur+aXrag=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r","package":{"name":"tar20","path":"gno.land/r/mikaelvallenet/gar20","files":[{"name":"mvc.gno","body":"// Package bar20 is similar to gno.land/r/demo/foo20 but exposes a safe-object\n// that can be used by `maketx run`, another contract importing foo20, and in\n// the future when we'll support `maketx call Token.XXX`.\npackage tar20\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar (\n\tbanker *grc20.Banker // private banker.\n\tToken grc20.Token // public safe-object.\n)\n\nfunc init() {\n\tbanker = grc20.NewBanker(\"Bar\", \"BAR\", 4)\n\tToken = banker.Token()\n}\n\nfunc Faucet() string {\n\tcaller := std.PrevRealm().Addr()\n\tif err := banker.Mint(caller, 1_000_000); err != nil {\n\t\treturn \"error: \" + err.Error()\n\t}\n\treturn \"OK\"\n}\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tc := len(parts)\n\n\tswitch {\n\tcase path == \"\":\n\t\treturn banker.RenderHome() // XXX: should be Token.RenderHome()\n\tcase c == 2 \u0026\u0026 parts[0] == \"balance\":\n\t\towner := std.Address(parts[1])\n\t\tbalance := Token.BalanceOf(owner)\n\t\treturn ufmt.Sprintf(\"%d\\n\", balance)\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"3000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ai1fSOs+1E0KH14i/vLKTXLWIuDEFcw6XbRlDlvB7pQw"},"signature":"M9U3UJK2D0JNUB+ekChD2OpzI0SEndoi9gx3oxI3/yUQcGER8xidaJsnlDaPSmdaDTCj6jSRQ1k7QCzXf8/ooA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r","package":{"name":"issue","path":"gno.land/r/mikaelvallenet/issue","files":[{"name":"issue.gno","body":"// Package bar20 is similar to gno.land/r/demo/foo20 but exposes a safe-object\n// that can be used by `maketx run`, another contract importing foo20, and in\n// the future when we'll support `maketx call Token.XXX`.\npackage issue\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar (\n\tbanker *grc20.Banker // private banker.\n\tToken grc20.Token // public safe-object.\n)\n\nfunc init() {\n\tbanker = grc20.NewBanker(\"Bar\", \"BAR\", 4)\n\tToken = banker.Token()\n}\n\nfunc Faucet() string {\n\tcaller := std.PrevRealm().Addr()\n\tif err := banker.Mint(caller, 1_000_000); err != nil {\n\t\treturn \"error: \" + err.Error()\n\t}\n\treturn \"OK\"\n}\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tc := len(parts)\n\n\tswitch {\n\tcase path == \"\":\n\t\treturn banker.RenderHome() // XXX: should be Token.RenderHome()\n\tcase c == 2 \u0026\u0026 parts[0] == \"balance\":\n\t\towner := std.Address(parts[1])\n\t\tbalance := Token.BalanceOf(owner)\n\t\treturn ufmt.Sprintf(\"%d\\n\", balance)\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"3000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ai1fSOs+1E0KH14i/vLKTXLWIuDEFcw6XbRlDlvB7pQw"},"signature":"y52z899tQT5+lqP+daLDUTqxiLNbnb8BWqySXnL5k0VVYx2oV+cDw7QhVV35/qB0xci3p5/KNIJwLoU8ZLWbjQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r","package":{"name":"issue","path":"gno.land/r/mikaelvallenet/issue","files":[{"name":"issue.gno","body":"// Package bar20 is similar to gno.land/r/demo/foo20 but exposes a safe-object\n// that can be used by `maketx run`, another contract importing foo20, and in\n// the future when we'll support `maketx call Token.XXX`.\npackage issue\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar (\n\tbanker *grc20.Banker // private banker.\n\tToken grc20.Token // public safe-object.\n)\n\nfunc init() {\n\tbanker = grc20.NewBanker(\"Bar\", \"BAR\", 4)\n\tToken = banker.Token()\n}\n\nfunc Faucet() string {\n\tcaller := std.PrevRealm().Addr()\n\tif err := banker.Mint(caller, 1_000_000); err != nil {\n\t\treturn \"error: \" + err.Error()\n\t}\n\treturn \"OK\"\n}\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tc := len(parts)\n\n\tswitch {\n\tcase path == \"\":\n\t\treturn banker.RenderHome() // XXX: should be Token.RenderHome()\n\tcase c == 2 \u0026\u0026 parts[0] == \"balance\":\n\t\towner := std.Address(parts[1])\n\t\tbalance := Token.BalanceOf(owner)\n\t\treturn ufmt.Sprintf(\"%d\\n\", balance)\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}"}]},"deposit":""}],"fee":{"gas_wanted":"13000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ai1fSOs+1E0KH14i/vLKTXLWIuDEFcw6XbRlDlvB7pQw"},"signature":"kdcACL3LhvaczfLQvJHId/3IdG9owim7lBtG1VkIXwN8uXTitb3/6mes71B4rKUypTKJ2UPA0AYDxnzZ6KpS6w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r","package":{"name":"issuefix","path":"gno.land/r/mikaelvallenet/issuefix","files":[{"name":"issue.gno","body":"// Package bar20 is similar to gno.land/r/demo/foo20 but exposes a safe-object\n// that can be used by `maketx run`, another contract importing foo20, and in\n// the future when we'll support `maketx call Token.XXX`.\npackage issuefix\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar (\n\tbanker *grc20.Banker // private banker.\n\tToken grc20.Token // public safe-object.\n)\n\nfunc init() {\n\tbanker = grc20.NewBanker(\"Bar\", \"BAR\", 4)\n\tToken = banker.Token()\n}\n\nfunc Faucet() string {\n\tcaller := std.PrevRealm().Addr()\n\tif err := banker.Mint(caller, 1_000_000); err != nil {\n\t\treturn \"error: \" + err.Error()\n\t}\n\treturn \"OK\"\n}\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tc := len(parts)\n\n\tswitch {\n\tcase path == \"\":\n\t\treturn banker.RenderHome() // XXX: should be Token.RenderHome()\n\tcase c == 2 \u0026\u0026 parts[0] == \"balance\":\n\t\towner := std.Address(parts[1])\n\t\tbalance := Token.BalanceOf(owner)\n\t\treturn ufmt.Sprintf(\"%d\\n\", balance)\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"3000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ai1fSOs+1E0KH14i/vLKTXLWIuDEFcw6XbRlDlvB7pQw"},"signature":"s2uPPqGzEOtCBbTeEJXv59Q/NkwOnmXsxbURj28J/VIF7zx3nMDaH1dtiSee3jOIdYx2aRnZuYrbRzyXWDW85w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"YLG47zOyvUKxtGzbzL+UaklXhekWIU6ynkF8rG0TJVdKjJDhj7wqi6G+vGcQbWUDqulXOYsli5O7EDuNbQ8shA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"k8VqEC4cq4yap0KJwtzRYtdgDb48QeAXZr9w+ez4P7ZuxgiIx5NyXJkmAbVqifIxIgNQgXEPaQ8E/vY3eyWVUQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RzsN2EgLF2caDL/TdiLc6KvfIpbM5Bhc3t4vfpbfUPBo1TxN+p9904sTy9+9I/D9j8bBqKWaISwZYLeV/qpJRg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r","package":{"name":"issuetwo","path":"gno.land/r/mikaelvallenet/issuetwo","files":[{"name":"issuetwo.gno","body":"package issuetwo\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar (\n\tbanker *grc20.Banker\n\ttoken grc20.Token\n)\n\nfunc init() {\n\tbanker = grc20.NewBanker(\"MikaelVallenetCoin\", \"MVC\", 0)\n\ttoken = banker.Token()\n}\n\nfunc Faucet() string {\n\ttxSender := std.GetOrigCaller()\n\tif err := banker.Mint(txSender, 5); err != nil {\n\t\treturn err.Error()\n\t}\n\treturn \"5 MVC minted to \" + txSender.String() + \"! 🎉\"\n}\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tif len(parts) != 2 \u0026\u0026 parts[0] != \"balance\" {\n\t\treturn \"Invalid path, try /balance/\u003caddress\u003e\"\n\t}\n\n\taddr := std.Address(parts[1])\n\tbalance := token.BalanceOf(addr)\n\treturn ufmt.Sprintf(\"Balance of %s: %d\", addr.String(), balance)\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"3000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ai1fSOs+1E0KH14i/vLKTXLWIuDEFcw6XbRlDlvB7pQw"},"signature":"DB7Elx2csZYgOpVMwm2sYJNe35L6oCSK/g5Q86B2o7t6pm+cqo3lSRZeCscAAtOD5WhrW+7FVp5aXWdtsq5zyQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r","package":{"name":"issuetwo","path":"gno.land/r/mikaelvallenet/issuetwo","files":[{"name":"issuetwo.gno","body":"package issuetwo\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar (\n\tbanker *grc20.Banker\n\ttoken grc20.Token\n)\n\nfunc init() {\n\tbanker = grc20.NewBanker(\"MikaelVallenetCoin\", \"MVC\", 0)\n\ttoken = banker.Token()\n}\n\nfunc Faucet() string {\n\ttxSender := std.GetOrigCaller()\n\tif err := banker.Mint(txSender, 5); err != nil {\n\t\treturn err.Error()\n\t}\n\treturn \"5 MVC minted to \" + txSender.String() + \"! 🎉\"\n}\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tif len(parts) != 2 \u0026\u0026 parts[0] != \"balance\" {\n\t\treturn \"Invalid path, try /balance/\u003caddress\u003e\"\n\t}\n\n\taddr := std.Address(parts[1])\n\tbalance := token.BalanceOf(addr)\n\treturn ufmt.Sprintf(\"Balance of %s: %d\", addr.String(), balance)\n}"}]},"deposit":""}],"fee":{"gas_wanted":"3000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ai1fSOs+1E0KH14i/vLKTXLWIuDEFcw6XbRlDlvB7pQw"},"signature":"kpC83pGTc8VKzDTXCg5P2A0VIT5Rt20Jm9snc8HmAiA7Ba/JADWYcUWQuKV9USBOvIrwvEbIs3H283pOJBpN/w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r","package":{"name":"issuetwo","path":"gno.land/r/mikaelvallenet/issuetwo","files":[{"name":"issuetwo.gno","body":"package issuetwo\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar (\n\tbanker *grc20.Banker\n\ttoken grc20.Token\n)\n\nfunc init() {\n\tbanker = grc20.NewBanker(\"MikaelVallenetCoin\", \"MVC\", 0)\n\ttoken = banker.Token()\n}\n\nfunc Faucet() string {\n\ttxSender := std.GetOrigCaller()\n\tif err := banker.Mint(txSender, 5); err != nil {\n\t\treturn err.Error()\n\t}\n\treturn \"5 MVC minted to \" + txSender.String() + \"! 🎉\"\n}\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tif len(parts) != 2 \u0026\u0026 parts[0] != \"balance\" {\n\t\treturn \"Invalid path, try /balance/\u003caddress\u003e\"\n\t}\n\n\taddr := std.Address(parts[1])\n\tbalance := token.BalanceOf(addr)\n\treturn ufmt.Sprintf(\"Balance of %s: %d\", addr.String(), balance)\n}"}]},"deposit":""}],"fee":{"gas_wanted":"13000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ai1fSOs+1E0KH14i/vLKTXLWIuDEFcw6XbRlDlvB7pQw"},"signature":"Ex4H88k7dDGpwUPlA2Atw2vgEC4IYPm6MkV/KrJV7pVCUAlvBsGL22FgMI3xzrTsTYxfpsJs2hK8z0urz9DvKg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r","package":{"name":"mvc","path":"gno.land/r/mikaelvallenet/mvc","files":[{"name":"mvc.gno","body":"package mvc\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar (\n\tbanker *grc20.Banker\n\ttoken grc20.Token\n)\n\nfunc init() {\n\tbanker = grc20.NewBanker(\"MikaelVallenetCoin\", \"MVC\", 0)\n\ttoken = banker.Token()\n}\n\nfunc Faucet() string {\n\ttxSender := std.GetOrigCaller()\n\tif err := banker.Mint(txSender, 5); err != nil {\n\t\treturn err.Error()\n\t}\n\treturn \"5 MVC minted to \" + txSender.String() + \"! 🎉\"\n}\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tif len(parts) != 2 \u0026\u0026 parts[0] != \"balance\" {\n\t\treturn \"Invalid path, try /balance/\u003caddress\u003e\"\n\t}\n\n\taddr := std.Address(parts[1])\n\tbalance := token.BalanceOf(addr)\n\treturn ufmt.Sprintf(\"Balance of %s: %d\", addr.String(), balance)\n}"}]},"deposit":""}],"fee":{"gas_wanted":"3000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ai1fSOs+1E0KH14i/vLKTXLWIuDEFcw6XbRlDlvB7pQw"},"signature":"IQp+AdcqKRmLm0sj27cak04LrMXm0EHbOecXneeT9YQB2pK6VVDcLIkIIdegQmmgH/cXVUavQm2/G1DSUjFAIA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r","package":{"name":"mvc","path":"gno.land/r/mikaelvallenet/mvc","files":[{"name":"mvc.gno","body":"package mvc\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar (\n\tbanker *grc20.Banker\n\ttoken grc20.Token\n)\n\nfunc init() {\n\tbanker = grc20.NewBanker(\"MikaelVallenetCoin\", \"MVC\", 0)\n\ttoken = banker.Token()\n}\n\nfunc Faucet() string {\n\ttxSender := std.GetOrigCaller()\n\tif err := banker.Mint(txSender, 5); err != nil {\n\t\treturn err.Error()\n\t}\n\treturn \"5 MVC minted to \" + txSender.String() + \"! 🎉\"\n}\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tif len(parts) != 2 \u0026\u0026 parts[0] != \"balance\" {\n\t\treturn \"Invalid path, try /balance/\u003caddress\u003e\"\n\t}\n\n\taddr := std.Address(parts[1])\n\tbalance := token.BalanceOf(addr)\n\treturn ufmt.Sprintf(\"Balance of %s: %d\", addr.String(), balance)\n}"}]},"deposit":""}],"fee":{"gas_wanted":"13000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ai1fSOs+1E0KH14i/vLKTXLWIuDEFcw6XbRlDlvB7pQw"},"signature":"KtKFXXwgSuqlE4/BJ7MyumWtE8vTZmeG58s7VVt48rB+n2EhNoOrQU6Du/sC3y39nU+h8e8uD9vhSehKsIgt3g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r","send":"","pkg_path":"gno.land/r/mikaelvallenet/mvc","func":"Faucet","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ai1fSOs+1E0KH14i/vLKTXLWIuDEFcw6XbRlDlvB7pQw"},"signature":"6bDyZUp/J6BWINGQ7d6iRYIhzxNIOew4gloZMs8ndgsEAsR09z5T15WtpKmpmWKtsy04Nc5c3CczUe+1RSxONQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r","package":{"name":"path","path":"gno.land/r/mikaelvallenet/path","files":[{"name":"path.gno","body":"package path\n\nfunc Render(path string) string {\n\treturn \"Path is: \" + path + \"\\n\"\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"13000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ai1fSOs+1E0KH14i/vLKTXLWIuDEFcw6XbRlDlvB7pQw"},"signature":"CsWr6frpm3fiXgH9aAJ63ohH7WYwbbGcS21EgwGiirBSysuC2iWmXRLSuImiVX7QTSm6qTF+AeW/nvnj7v+TOw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r","send":"","pkg_path":"gno.land/r/mikaelvallenet/path","func":"Render","args":["hello/mika"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ai1fSOs+1E0KH14i/vLKTXLWIuDEFcw6XbRlDlvB7pQw"},"signature":"BsKA9UqeEjII4WfnLnsn3c3xOAg2kLeB+AcqtVLdHgxIDwakhT9km1tJIXx1W+bc+U52e1vrdCxUJba4rg29OQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r","send":"","pkg_path":"gno.land/r/mikaelvallenet/mvc","func":"Render","args":["balance/g16jv3rpz7mkt0gqulxas56se2js7v5vmc6n6e0r"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ai1fSOs+1E0KH14i/vLKTXLWIuDEFcw6XbRlDlvB7pQw"},"signature":"1mDd7/4nHIYigoHMEAqPppwBa3pK3A8xVEKQLrLX62NOBu4ytQkm8HOU8X655fwMAmHMHTYaaZgQvpCirU0nrQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1kcq7hlduvhzrj0pq4vkfmuefl43wau8tgjdnww","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"z9FCfXnHNtm0IxOcuUUeXOMWi5w9LXkDN1jJ4co6X2wJwv8/s0Hn787KMmx/4AYtCAk5K91d6KV9EjmMYJHZfg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1e9xg9qy30pkqzz2upga4mzg559p33hqj0spv6c","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3ndNSqfLHJMR3BjgmHLS2Jtjfn5QU+SlqhKfJpU+IWxeGzQ5AmDYOq2j2ddlNovbPqppvUDRJA0ld+VKkC9ZFg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1pculvt75jyp7fdwzr2slvyr4u6tfxal2vzxcjz","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"EErnqCnOKuXXmB+KlXCnLIvxhwAwWiJJ/Wc1M10dY/dtpah3Rk0O7ZURKuNzxfmf43lr0TPUtipRwHiVQGzSTg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1xyz82ydya5mtrkag26t07ga8jk9avgsgn3q75y","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"9tROHiOaGyvmAicnS5GIHUhrpmTOmQ5UY1NGbLzc8+JO9co91scaMfwyII8sz4pC5fdiuIohwevMPpx/a46o1g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/events","func":"AddEvent","args":["Berlin Blockchain Week Buckle Up and Build with Cosmos","","https://www.youtube.com/watch?v=hCLErPgnavI","Berlin, Germany","2022-09-11T09:00:00+02:00","2022-09-18T18:00:00+02:00"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/events","func":"AddEvent","args":["Cosmoverse","","https://www.youtube.com/watch?v=6s1zG7hgxMk","Medellin, Colombia","2022-09-26T09:00:00-05:00","2022-09-28T18:00:00-05:00"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/events","func":"AddEvent","args":["Web Summit Buckle Up and Build with Cosmos","","","Lisbon, Portugal","2022-11-01T09:00:00+01:00","2022-11-04T18:00:00+01:00"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/events","func":"AddEvent","args":["Istanbul Blockchain Week","","https://www.youtube.com/watch?v=JX0gdWT0Cg4","Istanbul, Turkey","2022-11-14T10:00:00+03:00","2022-11-17T18:00:00+03:00"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/events","func":"AddEvent","args":["EthDenver 2023","Side Event: Discover gno.land","https://www.youtube.com/watch?v=IJ0xel8lr4c","Denver, US","2023-02-24T10:00:00-06:00","2023-03-05T10:00:00-06:00"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/events","func":"AddEvent","args":["Game Developer Conference","Side Event: Web3 Gaming Apps Powered by Gno","","San Francisco, US","2023-03-23T10:00:00-07:00","2023-03-23T18:00:00-07:00"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/events","func":"AddEvent","args":["BUIDL Asia","Proof of Contribution in gno.land","https://www.buidl.asia/","Seoul, South Korea","2023-06-06T10:00:00+09:00","2023-06-07T18:00:00+09:00"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/events","func":"AddEvent","args":["ETH Seoul","The Evolution of Smart Contracts: A Journey into gno.land","https://2023.ethseoul.org/","Seoul, South Korea","2023-06-02T10:00:00+09:00","2023-06-04T18:00:00+09:00"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/events","func":"AddEvent","args":["EthCC","Come meet us at our booth!","https://ethcc.io/","Paris, France","2023-07-17T10:00:00+02:00","2023-07-20T18:00:00+02:00"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/events","func":"AddEvent","args":["Nebular Summit gno.land for Developers","","https://www.nebular.builders/","Paris, France","2023-07-24T10:00:00+02:00","2023-07-25T18:00:00+02:00"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/events","func":"AddEvent","args":["GopherCon EU 2024","Come meet us at our booth!","https://gophercon.eu/","Berlin, Germany","2023-07-26T10:00:00+02:00","2023-07-29T18:00:00+02:00"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/events","func":"AddEvent","args":["GopherCon US 2024","Come meet us at our booth!","https://www.gophercon.com/","San Diego, US","2023-09-26T10:00:00-07:00","2023-09-29T18:00:00-07:00"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/events","func":"AddEvent","args":["Go to Gno Seoul","Join the workshop!","https://medium.com/onbloc/go-to-gno-recap-intro-to-the-gno-stack-with-memeland-284a43d7f620","Seoul, South Korea","2024-03-23T10:00:00+09:00","2024-03-23T18:00:00+09:00"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/events","func":"AddEvent","args":["Intro to Gno Tokyo","Join the meetup!","https://gno.land/r/gnoland/blog:p/gno-tokyo","Shinjuku City, Tokyo, Japan","2024-04-11T18:30:00+09:00","2024-04-11T22:00:00+09:00"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/events","func":"AddEvent","args":["Gno @ Golang Serbia","Join the meetup!","https://gno.land/r/gnoland/blog:p/gnomes-in-serbia","Belgrade, Serbia","2024-05-23T18:00:00+02:00","2024-05-23T22:00:00+02:00"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/events","func":"AddEvent","args":["Nebular Summit 2024","Join our workshop!","https://nebular.builders/","Brussels, Belgium","2024-07-12T10:00:00+02:00","2024-07-13T18:00:00+02:00"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/events","func":"AddEvent","args":["GopherCon US 2024","Come meet us at our booth!","https://www.gophercon.com/","Chicago, US","2024-07-07T10:00:00-06:00","2024-07-10T18:00:00-06:00"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/events","func":"AddEvent","args":["GopherCon EU 2024","Come meet us at our booth!","https://www.gophercon.com/","Berlin, Germany","2024-06-17T10:00:00+02:00","2024-06-20T10:00:00+02:00"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/events","func":"AddEvent","args":["Web3 Kamp 2024","Workshop: \"Exploring Web3 Ecosystems - Building a dapp in Go\"","https://web3kamp.org/","Petnica, Serbia","2024-08-01T10:00:00+02:00","2024-08-09T17:00:00+02:00"]},{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/events","func":"AddEvent","args":["BUIDL with Cosmos Tooling","Join us at our side event during Web3 Summit!","https://www.eventbrite.com/e/buidl-with-cosmos-tooling-tickets-981775686507?aff=oddtdtcreator","Berlin, Germany","2024-08-20T17:00:00+02:00","2024-08-20T22:00:00+02:00"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"hTStrT5mlceQDYy18hSls4AZLmuQEuC00MIqAadCT1twRRNnWHZKyQM1CslzY9dk5JJA5JtGqGUGAehofxo75Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/events","func":"EditEvent","args":["000000c","GopherCon US 2023","","","","",""]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"Q8If6bqgyxvbLxci4wZGcyswE6gZgQJAiCVshZCLwTYCf0PmJD1FTwyK56cnuluWcmPMzFKeaCNafbdL5PTRTA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/events","func":"EditEvent","args":["000000b","GopherCon EU 2023","","","","",""]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"NW6YVp/xPcwrd8a/NuQ2dHJTvJmklZY17g+mFJHHSL4c/o8h5MgYXHW+1cUsMrX7h58Dxyx8JMx41SE7AP96mw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"alerts","path":"gno.land/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/alerts","files":[{"name":"alerts.gno","body":"package alerts\n\nimport (\n\t\"gno.land/p/demo/ufmt\"\n)\n\nconst (\n\tTypeError Type = \"alerts-error\"\n\tTypeWarning Type = \"alerts-warning\"\n)\n\nconst (\n\tStyleError = `\n.alerts-error {\n\tpadding: .75rem 1.25rem;\n\tborder: 1px solid #f5c6cb;\n\tbackground-color: #f8d7da;\n\tcolor: #721c24;\n\tborder-radius: .25rem;\n}\n`\n\tStyleWarning = `\n.alerts-warning {\n\tpadding: .75rem 1.25rem;\n\tborder: 1px solid #ffeeba;\n\tbackground-color: #fff3cd;\n\tcolor: #856404;\n\tborder-radius: .25rem;\n}\n`\n)\n\n// Type defines the type of alerts.\ntype Type string\n\n// NewAlert returns HTML for an alert.\nfunc NewAlert(t Type, content string) string {\n\tvar css string\n\tswitch t {\n\tcase TypeWarning:\n\t\tcss = StyleWarning\n\tcase TypeError:\n\t\tcss = StyleError\n\tdefault:\n\t\tpanic(\"unknown alert type\")\n\t}\n\n\treturn \"\\n\\n\" + ufmt.Sprintf(`\u003cp class=\"%s\"\u003e%s\u003c/p\u003e\u003cstyle\u003e%s\u003c/style\u003e`, string(t), content, css) + \"\\n\\n\"\n}\n\n// NewWarning returns HTML for a warning alert.\nfunc NewWarning(content string) string {\n\treturn NewAlert(TypeWarning, content)\n}\n\n// NewError returns HTML for an error alert.\nfunc NewError(content string) string {\n\treturn NewAlert(TypeError, content)\n}\n\n// NewLink returns an HTML link.\nfunc NewLink(href, label string) string {\n\treturn ufmt.Sprintf(`\u003ca href=\"%s\"\u003e%s\u003c/a\u003e`, href, label)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"21000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"dbXdBO+SO85VS1IwnploHrZxw6Ek+LKvRDvzYhtgazBwCvPysCOO9u/234xkspNDeu79cUU7i2ZhO5Cd4kj8TQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"blog","path":"gno.land/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/blog","files":[{"name":"LICENSE","body":"Copyright (c) 2024. All rights reserved.\n\nProject Owner:\nNewTendermint, LLC\n\nProject Maintainer:\nİlker Göktuğ ÖZTÜRK. \u003cilker@ilgooz.com\u003e, \u003cilkergoktugozturk@gmail.com\u003e\n\nYour access to this Project and your contributions to this Project are subject\nto the following terms:\n\n* You hereby grant to the listed Owner and Maintainer of this Project the\nworldwide, irrevocable and royalty-free right to use, publish, relicense and\nsublicense your contributions under any non-exclusive license of their\nchoosing for commercial and non-commercial purposes.\n* You shall not attempt to bring any intellectual property infringement or\nmisappropriation claims against the Owner or Maintainer of this Project\nrelating to or arising from your contributions.\n* You represent that you are the sole owner of all rights in your\ncontributions and that no third party has any rights or interests therein.\n\nFOR THE SCOPE OF THIS LICENSE, A CONTRIBUTION IS DEFINED TO INCLUDE ANY WORKS,\nIDEAS, CODE, PROCESSES, OR APIS MADE AVAILABLE TO VIEW BY THE GENERAL PUBLIC\n(INCLUDING ANY PUBLICLY ACCESSIBLE INTERNET FORUMS AND CHAT SERVERS WHERE\nACCESS IS AVAILABLE FOR FREE WITH REGISTRATION) OR PRIVATELY TO THIS PROJECT'S\nOWNER AND MAINTAINERS; INCLUDING WORKS, IDEAS, CODE, PROCESSES, AND APIS THAT\nARE ABOUT THIS PROJECT AND ITS CONTRIBUTIONS, OR MENTIONED IN REFERENCE TO\nTHIS PROJECT, WHERE SUCH WORKS, IDEAS, CODE, PROCESSES, AND APIS ARE MATERIAL\nTO THE SUCCESS, IMPROVEMENT, OR COMPLETION OF THIS PROJECT, AS DETERMINED BY\nTHE OWNER OF THIS PROJECT.\n\nContributions may come in any form, and include (but are not limited to):\n\n* pull requests\n* diff patches\n* commentary\n* example code\n\nIf you do not want your contribution to become incorporated into this Project,\ndo not make contributions to this Project. The creation of contributions that\nmay in the future become known to this Project's Owner and Maintainer\nconstitutes a willing contribution to this Project in accordance with this\nlicense.\n\nTHIS PROJECT AND THE WORKS AVAILABLE THROUGH THIS PROJECT ARE PROVIDED “AS IS”\nAND WITHOUT WARRANTY OF ANY KIND. IN NO EVENT SHALL THE OWNER OR MAINTAINER OF\nTHIS PROJECT BE LIABLE TO YOU OR ANY THIRD PARTY FOR ANY CLAIM, DAMAGES OR\nOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THIS PROJECT OR THE WORKS AVAILABLE THROUGH\nTHIS PROJECT. YOU AGREED TO INDEMNIFY, DEFEND AND HOLD THE OWNER AND\nMAINTAINER FROM AND AGAINST ANY CLAIMS, LOSSES OR DAMAGES ARISING FROM YOUR\nUSE OF THIS PROJECT OR THE WORKS AVAILABLE THROUGH THIS PROJECT.\n\nThis license is subject to change at any time by the Project Owner or\nMaintainer.\n\nYour continued access to or use of this Project or any works\navailable through this Project shall be subject to the then-current version\nof this license.\n\nThe Project Owner and Maintainer reserve the right to change this license\nwithout needing the consent of the contributors to this Project.\n"},{"name":"asserts.gno","body":"package blog\n\nimport (\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"net/url\"\n\t\"regexp\"\n\t\"strings\"\n)\n\nvar (\n\thostnameRe = regexp.MustCompile(`^(?i)[a-z0-9-]+(\\.[a-z0-9-]+)+\\.?$`)\n\tsha256Re = regexp.MustCompile(`^[a-f0-9]{64}$`)\n\tslugRe = regexp.MustCompile(`^[a-z0-9\\p{L}]+(?:-[a-z0-9\\p{L}]+)*$`)\n)\n\n// AssertIsSlug asserts that a URL slug is valid.\nfunc AssertIsSlug(slug string) {\n\tif !IsSlug(slug) {\n\t\tpanic(\"URL slug is not valid\")\n\t}\n}\n\n// AssertContentSha256Hash asserts that a hex hash is a valid SHA256 hash.\nfunc AssertIsSha256Hash(hexHash string) {\n\tif !IsSha256Hash(hexHash) {\n\t\tpanic(\"invalid sha256 hash\")\n\t}\n}\n\n// AssertIsContentURL asserts that a URL is a valid link to a content.\n// URL must have a path to ve valid. Website URLs will fail.\nfunc AssertIsContentURL(url string) {\n\tif !IsURL(url, true) {\n\t\tpanic(\"content URL is not valid, make sure path to content is specified\")\n\t}\n}\n\n// AssertTitleIsNotEmpty asserts that a title is not an empty string.\nfunc AssertTitleIsNotEmpty(title string) {\n\tif strings.TrimSpace(title) == \"\" {\n\t\tpanic(\"title is empty\")\n\t}\n}\n\n// AssertContentSha256Hash asserts that the SHA256 hash of a content matches a hash.\nfunc AssertContentSha256Hash(content, hash string) {\n\tif hash != GetHexSha256Hash(content) {\n\t\tpanic(\"content sha256 checksum is not valid\")\n\t}\n}\n\n// IsSlug checks if a string is a valid URL slug.\nfunc IsSlug(slug string) bool {\n\treturn slugRe.MatchString(slug)\n}\n\n// IsSha256Hash checks is a hex hash is a valid SHA256 hash.\nfunc IsSha256Hash(hexHash string) bool {\n\treturn sha256Re.MatchString(strings.ToLower(hexHash))\n}\n\n// IsURL checks if a URL is valid.\n// URL path availability can optionally be enforced.\nfunc IsURL(rawURL string, requirePath bool) bool {\n\tu, err := url.ParseRequestURI(rawURL)\n\tif err != nil {\n\t\treturn false\n\t}\n\n\tif requirePath \u0026\u0026 u.Path == \"\" || u.Path == \"/\" {\n\t\treturn false\n\t}\n\n\tif u.Scheme != \"https\" \u0026\u0026 u.Scheme != \"http\" {\n\t\treturn false\n\t}\n\n\thostname := u.Hostname()\n\treturn hostname != \"\" \u0026\u0026 hostnameRe.MatchString(hostname)\n}\n\n// GetHexSha256Hash returns the hexadecimal encoding of the string's SHA256 hash.\n// An empty string is returned when the argument is an empty string.\nfunc GetHexSha256Hash(s string) string {\n\tsum := sha256.Sum256([]byte(s))\n\treturn hex.EncodeToString(sum[:])\n}\n"},{"name":"asserts_test.gno","body":"package blog\n\nimport (\n\t\"testing\"\n\n\t\"gno.land/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/blog\"\n)\n\nfunc TestIsSlug(t *testing.T) {\n\tcases := []struct {\n\t\tname, slug string\n\t\twant bool\n\t}{\n\t\t{\n\t\t\tname: \"empty\",\n\t\t\twant: false,\n\t\t},\n\t\t{\n\t\t\tname: \"one letter\",\n\t\t\tslug: \"a\",\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tname: \"one unicode letter\",\n\t\t\tslug: \"á\",\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tname: \"one word\",\n\t\t\tslug: \"foo\",\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tname: \"one unicode word\",\n\t\t\tslug: \"fóo\",\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tname: \"many words\",\n\t\t\tslug: \"foo-bar-baz\",\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tname: \"many unicode words\",\n\t\t\tslug: \"fóo-bár-báz\",\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tname: \"with spaces\",\n\t\t\tslug: \"foo bar\",\n\t\t\twant: false,\n\t\t},\n\t\t{\n\t\t\tname: \"with invalid chars\",\n\t\t\tslug: \"foo/bar\",\n\t\t\twant: false,\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Act\n\t\t\tgot := blog.IsSlug(tc.slug)\n\n\t\t\t// Assert\n\t\t\tif got != tc.want {\n\t\t\t\tt.Fatalf(\"expected slug check to return: %v\", tc.want)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestIsSha256Hash(t *testing.T) {\n\tcases := []struct {\n\t\tname, hash string\n\t\twant bool\n\t}{\n\t\t{\n\t\t\tname: \"empty\",\n\t\t\twant: false,\n\t\t},\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\thash: \"1a66cf828aea323fc58c653b0bc0d64061bb5c198e500a541a2c97f4f45b668d\",\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tname: \"invalid size\",\n\t\t\thash: \"1a66cf828aea323\",\n\t\t\twant: false,\n\t\t},\n\t\t{\n\t\t\tname: \"invalid characters\",\n\t\t\thash: \"1a66#?\",\n\t\t\twant: false,\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Act\n\t\t\tgot := blog.IsSha256Hash(tc.hash)\n\n\t\t\t// Assert\n\t\t\tif got != tc.want {\n\t\t\t\tt.Fatalf(\"expected sha256 check check to return: %v\", tc.want)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestIsURL(t *testing.T) {\n\tcases := []struct {\n\t\turl string\n\t\twant bool\n\t}{\n\t\t{url: \"https\", want: false},\n\t\t{url: \"https/a\", want: false},\n\t\t{url: \"https/a/b\", want: false},\n\t\t{url: \"https/a/b/\", want: false},\n\t\t{url: \"https:\", want: false},\n\t\t{url: \"https:www.test.com\", want: false},\n\t\t{url: \"https:www.test.com/\", want: false},\n\t\t{url: \"https:www.test.com/a\", want: false},\n\t\t{url: \"https:www.test.com/a/b\", want: false},\n\t\t{url: \"https:www.test.com/a/b/\", want: false},\n\t\t{url: \"https:www.test.com:42/a/b/\", want: false},\n\t\t{url: \"https:/\", want: false},\n\t\t{url: \"https:/a\", want: false},\n\t\t{url: \"https:/a/b\", want: false},\n\t\t{url: \"https:/a/b/\", want: false},\n\t\t{url: \"https:/www.test.com/a/b\", want: false},\n\t\t{url: \"https://\", want: false},\n\t\t{url: \"https://a\", want: false},\n\t\t{url: \"https://a/b\", want: false},\n\t\t{url: \"https://a/b/\", want: false},\n\t\t{url: \"https://www.test.com\", want: false},\n\t\t{url: \"https://www.test.com/\", want: false},\n\t\t{url: \"https://www.test.com/a\", want: true},\n\t\t{url: \"https://www.test.com/a/b\", want: true},\n\t\t{url: \"https://www.test.com/a/b/\", want: true},\n\t\t{url: \"https://www.test.com:42/a/b/\", want: true},\n\t\t{url: \"https://foo.bar.test.com\", want: false},\n\t\t{url: \"https://foo.bar.test.com/\", want: false},\n\t\t{url: \"https://foo.bar.test.com/a\", want: true},\n\t\t{url: \"https://foo.bar.test.com/a/b\", want: true},\n\t\t{url: \"https://foo.bar.test.com/a/b/\", want: true},\n\t\t{url: \"https://foo.bar.test.com/a/b\", want: true},\n\t\t{url: \"https://foo.bar.test.com:42/a/b\", want: true},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.url, func(t *testing.T) {\n\t\t\t// Act\n\t\t\tgot := blog.IsURL(tc.url, true)\n\n\t\t\t// Assert\n\t\t\tif got != tc.want {\n\t\t\t\tt.Fatalf(\"expected URL check to return: %v\", tc.want)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestGetHexSha256Hash(t *testing.T) {\n\tcases := []struct {\n\t\tname, content, want string\n\t}{\n\t\t{\n\t\t\tname: \"empty\",\n\t\t\twant: \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\n\t\t},\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\tcontent: \"foo\",\n\t\t\twant: \"2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Act\n\t\t\tgot := blog.GetHexSha256Hash(tc.content)\n\n\t\t\t// Assert\n\t\t\tif got != tc.want {\n\t\t\t\tt.Fatalf(\"expected hash: '%s', got: '%s'\", tc.want, got)\n\t\t\t}\n\t\t})\n\t}\n}\n"},{"name":"blog.gno","body":"package blog\n\nimport (\n\t\"strings\"\n\n\t\"gno.land/p/demo/avl\"\n)\n\ntype (\n\t// Blog defines a blog.\n\tBlog struct {\n\t\tposts avl.Tree // string(slug) -\u003e *Post\n\n\t\t// Title is blog's title.\n\t\tTitle string\n\n\t\t// Description is the blog's description.\n\t\tDescription string\n\t}\n\n\t// PostIterFn defines the a callback to iterate blog posts.\n\tPostIterFn func(*Post) bool\n)\n\n// HasPost checks if a post with a URL slug exists.\nfunc (b Blog) HasPost(slug string) bool {\n\treturn b.posts.Has(slug)\n}\n\n// GetPost returns a blog's post.\nfunc (b Blog) GetPost(slug string) (_ *Post, found bool) {\n\tif v, found := b.posts.Get(slug); found {\n\t\treturn v.(*Post), true\n\t}\n\treturn nil, false\n}\n\n// AddPost adds a new post to the blog.\nfunc (b *Blog) AddPost(p *Post) bool {\n\tslug := strings.TrimSpace(p.Slug)\n\tif slug == \"\" {\n\t\tpanic(\"post has an empty slug\")\n\t}\n\n\treturn b.posts.Set(slug, p)\n}\n\n// RemovePost removes a post from the blog.\n// The removed post is returned after being removed if it exists.\nfunc (b *Blog) RemovePost(slug string) (_ *Post, removed bool) {\n\tif v, removed := b.posts.Remove(slug); removed {\n\t\treturn v.(*Post), true\n\t}\n\treturn nil, false\n}\n\n// IteratePosts iterates all posts by slug.\nfunc (b Blog) IteratePosts(fn PostIterFn) bool {\n\t// TODO: Improve blog post iteration\n\treturn b.posts.Iterate(\"\", \"\", func(_ string, value interface{}) bool {\n\t\treturn fn(value.(*Post))\n\t})\n}\n"},{"name":"invar.gno","body":"package blog\n\nimport \"time\"\n\nfunc NewInvarBlog(b *Blog) InvarBlog {\n\t// TODO: Remove blog and post references if Gno implements invar (inmutable) references\n\treturn InvarBlog{b}\n}\n\ntype InvarBlog struct {\n\tref *Blog\n}\n\nfunc (b InvarBlog) Title() string {\n\treturn b.ref.Title\n}\n\nfunc (b InvarBlog) Description() string {\n\treturn b.ref.Description\n}\n\nfunc (b InvarBlog) IteratePosts(fn func(InvarPost) bool) bool {\n\treturn b.ref.IteratePosts(func(p *Post) bool {\n\t\treturn fn(NewInvarPost(p))\n\t})\n}\n\nfunc NewInvarPost(p *Post) InvarPost {\n\treturn InvarPost{p}\n}\n\ntype InvarPost struct {\n\tref *Post\n}\n\nfunc (p InvarPost) Slug() string {\n\treturn p.ref.Slug\n}\n\nfunc (p InvarPost) Title() string {\n\treturn p.ref.Title\n}\n\nfunc (p InvarPost) Summary() string {\n\treturn p.ref.Summary\n}\n\nfunc (p InvarPost) Status() PostStatus {\n\treturn p.ref.Status\n}\n\nfunc (p InvarPost) Content() string {\n\treturn p.ref.Content\n}\n\nfunc (p InvarPost) ContentHash() string {\n\treturn p.ref.ContentHash\n}\n\nfunc (p InvarPost) Authors() AddressList {\n\treturn p.ref.Authors\n}\n\nfunc (p InvarPost) Editors() AddressList {\n\treturn p.ref.Editors\n}\n\nfunc (p InvarPost) Contributors() AddressList {\n\treturn p.ref.Contributors\n}\n\nfunc (p InvarPost) Publishers() AddressList {\n\treturn p.ref.Publishers\n}\n\nfunc (p InvarPost) Tags() []string {\n\treturn p.ref.Tags\n}\n\nfunc (p InvarPost) CreatedAt() time.Time {\n\treturn p.ref.CreatedAt\n}\n\nfunc (p InvarPost) UpdatedAt() time.Time {\n\treturn p.ref.UpdatedAt\n}\n\nfunc (p InvarPost) PublishAt() time.Time {\n\treturn p.ref.PublishAt\n}\n\nfunc (p InvarPost) ExpireAt() time.Time {\n\treturn p.ref.ExpireAt\n}\n"},{"name":"post.gno","body":"package blog\n\nimport (\n\t\"errors\"\n\t\"std\"\n\t\"strings\"\n\t\"time\"\n)\n\nconst (\n\tStatusDraft PostStatus = iota\n\tStatusApproved\n\tStatusPublished\n\tStatusRevised\n\tStatusArchived\n)\n\ntype (\n\t// AddressList defines a list of addresses.\n\tAddressList []std.Address\n\n\t// PostStatus defines a type for blog post states.\n\tPostStatus uint8\n\n\t// Post defines a blog post.\n\tPost struct {\n\t\t// Slug contains the URL path slug for the post.\n\t\tSlug string\n\n\t\t// Title is the post's title.\n\t\tTitle string\n\n\t\t// Summary is the post's summary.\n\t\tSummary string\n\n\t\t// Status is the current post's state.\n\t\tStatus PostStatus\n\n\t\t// Content contains the post's content.\n\t\tContent string\n\n\t\t// ContentHash contains the hash of the post's content.\n\t\tContentHash string\n\n\t\t// Authors contains the list of post authors.\n\t\tAuthors AddressList\n\n\t\t// Editors contains the list of post editors.\n\t\t// Each account belongs to an editor that significantly improved the content.\n\t\tEditors AddressList\n\n\t\t// Contributors contains the list of post contributors.\n\t\t// Each account belongs to a contributor that submitted small content changes.\n\t\tContributors AddressList\n\n\t\t// Publishers contains the accounts that published the content.\n\t\tPublishers AddressList\n\n\t\t// Tags contains a list of tags for the post.\n\t\t// These tags can be used to build the blog content taxonomy.\n\t\tTags []string\n\n\t\t// CreatedAt is the block time when the post has been created.\n\t\tCreatedAt time.Time\n\n\t\t// UpdatedAt is the block time when the post has been updated for the last time.\n\t\tUpdatedAt time.Time\n\n\t\t// PublishAt is the block time when the post should be published.\n\t\tPublishAt time.Time\n\n\t\t// ExpireAt is the block time when the post should be archived.\n\t\tExpireAt time.Time\n\t}\n)\n\n// String returns a comma separated string with the list of addresses.\nfunc (x AddressList) String() string {\n\tvar s []string\n\tfor _, item := range x {\n\t\ts = append(s, item.String())\n\t}\n\treturn strings.Join(s, \", \")\n}\n\n// HasAddress checks if an address is part of the address list.\nfunc (x AddressList) HasAddress(addr std.Address) bool {\n\tfor _, item := range x {\n\t\tif item == addr {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// String returns the post status name.\nfunc (s PostStatus) String() string {\n\tswitch s {\n\tcase StatusDraft:\n\t\treturn \"draft\"\n\tcase StatusApproved:\n\t\treturn \"approved\"\n\tcase StatusPublished:\n\t\treturn \"published\"\n\tcase StatusRevised:\n\t\treturn \"revised\"\n\tcase StatusArchived:\n\t\treturn \"archived\"\n\tdefault:\n\t\treturn \"unknown\"\n\t}\n}\n\n// IsExpired checks if the expiration date was reached.\nfunc (p Post) IsExpired() bool {\n\treturn !p.ExpireAt.IsZero() \u0026\u0026 p.ExpireAt.Before(time.Now())\n}\n\n// ParseStringToAddresses parses a string addresses.\n// String should have one or more lines where each line should contain an address.\n// Addresses are validated after being parsed.\nfunc ParseStringToAddresses(s string) (AddressList, error) {\n\tvar addresses AddressList\n\tfor _, line := range strings.Split(s, \"\\n\") {\n\t\tline = strings.TrimSpace(line)\n\t\tif line == \"\" {\n\t\t\t// Skip empty lines\n\t\t\tcontinue\n\t\t}\n\n\t\taddr := std.Address(strings.TrimSpace(line))\n\t\tif !addr.IsValid() {\n\t\t\treturn nil, errors.New(\"invalid address: \" + EscapeHTML(addr.String()))\n\t\t}\n\n\t\taddresses = append(addresses, addr)\n\t}\n\treturn addresses, nil\n}\n\n// MustParseStringToAddresses parses a string addresses.\n// String should have one or more lines where each line should contain an address.\n// Addresses are validated after being parsed.\nfunc MustParseStringToAddresses(s string) AddressList {\n\taddresses, err := ParseStringToAddresses(s)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\treturn addresses\n}\n\n// EscapeHTML escapes special characters like \"\u003c\" to become \"\u0026lt;\".\n// It escapes only five such characters: \u003c, \u003e, \u0026, ' and \".\nfunc EscapeHTML(s string) string {\n\ts = strings.ReplaceAll(s, `\u0026`, \"\u0026amp;\")\n\ts = strings.ReplaceAll(s, `\"`, \"\u0026#34;\")\n\ts = strings.ReplaceAll(s, `'`, \"\u0026#39;\")\n\ts = strings.ReplaceAll(s, `\u003c`, \"\u0026lt;\")\n\treturn strings.ReplaceAll(s, `\u003e`, \"\u0026gt;\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"40000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"khc9PqznoaN89mJqECkR5ZDZ+GbFklhcgvBgfuOiXgUz2KrIb+6pZVl/ykqxDEdLK7CmbcCADPASROor+6ncaA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"dao","path":"gno.land/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao","files":[{"name":"LICENSE","body":"Copyright (c) 2024. All rights reserved.\n\nProject Owner:\nNewTendermint, LLC\n\nProject Maintainer:\nİlker Göktuğ ÖZTÜRK. \u003cilker@ilgooz.com\u003e, \u003cilkergoktugozturk@gmail.com\u003e\n\nYour access to this Project and your contributions to this Project are subject\nto the following terms:\n\n* You hereby grant to the listed Owner and Maintainer of this Project the\nworldwide, irrevocable and royalty-free right to use, publish, relicense and\nsublicense your contributions under any non-exclusive license of their\nchoosing for commercial and non-commercial purposes.\n* You shall not attempt to bring any intellectual property infringement or\nmisappropriation claims against the Owner or Maintainer of this Project\nrelating to or arising from your contributions.\n* You represent that you are the sole owner of all rights in your\ncontributions and that no third party has any rights or interests therein.\n\nFOR THE SCOPE OF THIS LICENSE, A CONTRIBUTION IS DEFINED TO INCLUDE ANY WORKS,\nIDEAS, CODE, PROCESSES, OR APIS MADE AVAILABLE TO VIEW BY THE GENERAL PUBLIC\n(INCLUDING ANY PUBLICLY ACCESSIBLE INTERNET FORUMS AND CHAT SERVERS WHERE\nACCESS IS AVAILABLE FOR FREE WITH REGISTRATION) OR PRIVATELY TO THIS PROJECT'S\nOWNER AND MAINTAINERS; INCLUDING WORKS, IDEAS, CODE, PROCESSES, AND APIS THAT\nARE ABOUT THIS PROJECT AND ITS CONTRIBUTIONS, OR MENTIONED IN REFERENCE TO\nTHIS PROJECT, WHERE SUCH WORKS, IDEAS, CODE, PROCESSES, AND APIS ARE MATERIAL\nTO THE SUCCESS, IMPROVEMENT, OR COMPLETION OF THIS PROJECT, AS DETERMINED BY\nTHE OWNER OF THIS PROJECT.\n\nContributions may come in any form, and include (but are not limited to):\n\n* pull requests\n* diff patches\n* commentary\n* example code\n\nIf you do not want your contribution to become incorporated into this Project,\ndo not make contributions to this Project. The creation of contributions that\nmay in the future become known to this Project's Owner and Maintainer\nconstitutes a willing contribution to this Project in accordance with this\nlicense.\n\nTHIS PROJECT AND THE WORKS AVAILABLE THROUGH THIS PROJECT ARE PROVIDED “AS IS”\nAND WITHOUT WARRANTY OF ANY KIND. IN NO EVENT SHALL THE OWNER OR MAINTAINER OF\nTHIS PROJECT BE LIABLE TO YOU OR ANY THIRD PARTY FOR ANY CLAIM, DAMAGES OR\nOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THIS PROJECT OR THE WORKS AVAILABLE THROUGH\nTHIS PROJECT. YOU AGREED TO INDEMNIFY, DEFEND AND HOLD THE OWNER AND\nMAINTAINER FROM AND AGAINST ANY CLAIMS, LOSSES OR DAMAGES ARISING FROM YOUR\nUSE OF THIS PROJECT OR THE WORKS AVAILABLE THROUGH THIS PROJECT.\n\nThis license is subject to change at any time by the Project Owner or\nMaintainer.\n\nYour continued access to or use of this Project or any works\navailable through this Project shall be subject to the then-current version\nof this license.\n\nThe Project Owner and Maintainer reserve the right to change this license\nwithout needing the consent of the contributors to this Project.\n"},{"name":"dao.gno","body":"package dao\n\nimport (\n\t\"errors\"\n\t\"std\"\n\t\"strings\"\n\t\"time\"\n)\n\n// PathSeparator defines the DAO path separator.\nconst PathSeparator = \"/\"\n\ntype (\n\t// Role defines the type for DAO roles.\n\tRole string\n\n\t// Roles defines the type for a list of DAO roles.\n\tRoles []Role\n)\n\n// String returns the role as a string.\nfunc (r Role) String() string {\n\treturn string(r)\n}\n\n// NewMember creates a new DAO member.\nfunc NewMember(addr std.Address, roles ...Role) Member {\n\treturn Member{\n\t\tAddress: addr,\n\t\tRoles: roles,\n\t}\n}\n\n// Member defines a DAO member.\ntype Member struct {\n\t// Address is the member account address.\n\tAddress std.Address\n\n\t// Roles contains the optional list of roles that the member belongs to.\n\tRoles Roles\n}\n\n// String returns a string representation of the member.\nfunc (m Member) String() string {\n\tif len(m.Roles) == 0 {\n\t\treturn m.Address.String()\n\t}\n\n\tvar roles []string\n\tfor _, r := range m.Roles {\n\t\troles = append(roles, string(r))\n\t}\n\treturn m.Address.String() + \" \" + strings.Join(roles, \", \")\n}\n\n// HasRole checks if the member belongs to a specific role.\nfunc (m Member) HasRole(r Role) bool {\n\tfor _, role := range m.Roles {\n\t\tif role == r {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// Option configures DAO.\ntype Option func(*DAO)\n\n// AssignAsSuperCouncil makes the DAO a super council.\nfunc AssignAsSuperCouncil() Option {\n\treturn func(dao *DAO) {\n\t\tdao.isSuperCouncil = true\n\t}\n}\n\n// WithSubDAO assigns sub DAO to a DAO.\nfunc WithSubDAO(sub *DAO) Option {\n\treturn func(dao *DAO) {\n\t\tsub.parent = dao\n\t\tdao.children = append(dao.children, sub)\n\t}\n}\n\n// WithMembers assigns members to a DAO.\nfunc WithMembers(members ...Member) Option {\n\treturn func(dao *DAO) {\n\t\tdao.members = members\n\t}\n}\n\n// WithManifest assigns a manifest to a DAO.\n// Manifest should describe the purpose of the DAO.\nfunc WithManifest(manifest string) Option {\n\treturn func(dao *DAO) {\n\t\tdao.manifest = manifest\n\t}\n}\n\n// New creates a new DAO.\nfunc New(name, title string, options ...Option) (*DAO, error) {\n\tname = strings.TrimSpace(name)\n\tif name == \"\" {\n\t\treturn nil, errors.New(\"DAO name is required\")\n\t}\n\n\tif !IsSlug(name) {\n\t\treturn nil, errors.New(`DAO name is not valid, only letters from \"a\" to \"z\", numbers, \"-\" and \"_\" are allowed`)\n\t}\n\n\ttitle = strings.TrimSpace(title)\n\tif title == \"\" {\n\t\treturn nil, errors.New(\"DAO title is required\")\n\t}\n\n\tdao := \u0026DAO{\n\t\tname: name,\n\t\ttitle: title,\n\t\tcreatedAt: time.Now(),\n\t}\n\n\tfor _, apply := range options {\n\t\tapply(dao)\n\t}\n\n\treturn dao, nil\n}\n\n// MustNew creates a new DAO.\n// The function panics if any of the arguments is not valid.\nfunc MustNew(name, title string, options ...Option) *DAO {\n\tdao, err := New(name, title, options...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn dao\n}\n\n// DAO is a decentralized autonomous organization.\ntype DAO struct {\n\tname string\n\ttitle string\n\tmanifest string\n\tisSuperCouncil bool\n\tisLocked bool\n\tlockReason string\n\tparent *DAO\n\tchildren []*DAO\n\tmembers []Member\n\tcreatedAt time.Time\n}\n\n// Name returns the name of the DAO.\nfunc (dao DAO) Name() string {\n\treturn dao.name\n}\n\n// Title returns the title of the DAO.\nfunc (dao DAO) Title() string {\n\treturn dao.title\n}\n\n// Manifest returns the manifest of the DAO.\nfunc (dao DAO) Manifest() string {\n\treturn dao.manifest\n}\n\n// SetManifest sets the manifest of the DAO.\nfunc (dao *DAO) SetManifest(s string) {\n\tdao.manifest = s\n}\n\n// CreatedAt returns the creation time of the DAO.\nfunc (dao DAO) CreatedAt() time.Time {\n\treturn dao.createdAt\n}\n\n// Parent returns the parent DAO of the sub DAO.\n// The result is nil for the DAO at the root of the DAO tree.\nfunc (dao DAO) Parent() *DAO {\n\treturn dao.parent\n}\n\n// Path returns the path of the DAO.\nfunc (dao DAO) Path() string {\n\tif dao.parent == nil {\n\t\treturn dao.name\n\t}\n\treturn dao.parent.Path() + PathSeparator + dao.name\n}\n\n// SubDAOs returns the first level sub DAOs.\nfunc (dao DAO) SubDAOs() []*DAO { // TODO: Use Children() instead? Find a better name.\n\treturn dao.children\n}\n\n// GetFirstSubDAO returns the first sub DAO.\nfunc (dao DAO) GetFirstSubDAO() *DAO {\n\tif len(dao.children) \u003e 0 {\n\t\treturn dao.children[0]\n\t}\n\treturn nil\n}\n\n// CollectSubDAOs collects all sub DAOs.\nfunc (dao DAO) CollectSubDAOs() []*DAO {\n\tres := append([]*DAO{}, dao.children...)\n\tfor _, c := range dao.children {\n\t\tres = append(res, c.CollectSubDAOs()...)\n\t}\n\treturn res\n}\n\n// Members returns the members of the DAOs.\nfunc (dao DAO) Members() []Member {\n\treturn dao.members\n}\n\n// LockReason returns a string with the reason the DAO is locked.\nfunc (dao DAO) LockReason() string {\n\treturn dao.lockReason\n}\n\n// IsSuperCouncil checks if the DAO is a super council.\nfunc (dao DAO) IsSuperCouncil() bool {\n\treturn dao.isSuperCouncil\n}\n\n// IsLocked checks if the DAO is locked.\nfunc (dao DAO) IsLocked() bool {\n\treturn dao.isLocked\n}\n\n// Lock locks the DAO.\nfunc (dao *DAO) Lock(reason string) {\n\tdao.lockReason = reason\n\tdao.isLocked = true\n}\n\n// HasParent checks if a DAO is a parent of this DAO.\nfunc (dao DAO) HasParent(parent *DAO) bool {\n\tif parent == nil {\n\t\treturn false\n\t}\n\treturn strings.HasPrefix(dao.Path(), parent.Path())\n}\n\n// HasMember checks if a member is part of the DAO.\nfunc (dao DAO) HasMember(addr std.Address) bool {\n\tfor _, m := range dao.members {\n\t\tif m.Address == addr {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// AddMember adds a member to the DAO.\n// Caller must check the member before adding to avoid duplications.\nfunc (dao *DAO) AddMember(m Member) {\n\tdao.members = append(dao.members, m)\n}\n\n// GetMember gets a member of the DAO.\nfunc (dao DAO) GetMember(addr std.Address) (Member, bool) {\n\tfor _, m := range dao.members {\n\t\tif m.Address == addr {\n\t\t\treturn m, true\n\t\t}\n\t}\n\treturn Member{}, false\n}\n\n// RemoveMember removes a member of the DAO.\nfunc (dao *DAO) RemoveMember(addr std.Address) bool {\n\tfor i, m := range dao.members {\n\t\tif m.Address == addr {\n\t\t\tdao.members = append(dao.members[:i], dao.members[i+1:]...)\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// AddSubDAO adds a sub DAO to the DAO.\nfunc (dao *DAO) AddSubDAO(sub *DAO) bool {\n\tif sub == nil {\n\t\treturn false\n\t}\n\n\tfor _, n := range dao.children {\n\t\tif n.name == sub.name {\n\t\t\treturn false\n\t\t}\n\t}\n\n\tsub.parent = dao\n\tdao.children = append(dao.children, sub)\n\treturn true\n}\n\n// GetDAO get a DAO by path.\nfunc (dao *DAO) GetDAO(path string) *DAO {\n\tif path == \"\" {\n\t\treturn nil\n\t}\n\n\tif path == dao.name {\n\t\treturn dao\n\t}\n\n\t// Make sure that current node is not present at the beginning of the path\n\tpath = strings.TrimPrefix(path, dao.name+PathSeparator)\n\n\t// Split DAO path in child name and relative sub path\n\tparts := strings.SplitN(path, PathSeparator, 2)\n\tchildName := parts[0]\n\n\tfor _, sub := range dao.children {\n\t\tif sub.name != childName {\n\t\t\tcontinue\n\t\t}\n\n\t\tif len(parts) \u003e 1 {\n\t\t\t// Traverse node children when a sub node path is available\n\t\t\treturn sub.GetDAO(parts[1])\n\t\t}\n\t\treturn sub\n\t}\n\n\treturn nil\n}\n\n// RemoveSubDAO removes a sub DAO.\n// The sub DAO must be a first level children of the DAO.\nfunc (dao *DAO) RemoveSubDAO(name string) bool {\n\tfor i, sub := range dao.children {\n\t\tif sub.name == name {\n\t\t\tdao.children = append(dao.children[:i], dao.children[i+1:]...)\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// IsRoot checks if the DAO is the main DAO.\n// The main DAO is the root of the DAO tree.\nfunc (dao DAO) IsRoot() bool {\n\treturn dao.parent == nil\n}\n\n// ParseStringToMembers parses a string of member addresses and roles.\n// String should have one or more lines where each line should contain an\n// address optionally followed by one or more roles.\n// Example multi line string:\n//\n//\tg1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun roleA\n//\tg1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl\n//\tg1vh7krmmzfua5xjmkatvmx09z37w34lsvd2mxa5 roleB roleA\n//\n// Addresses are validated after being parsed.\n// Roles must be validated by the caller to make sure the names are valid.\nfunc ParseStringToMembers(s string) ([]Member, error) {\n\tvar members []Member\n\tfor _, line := range strings.Split(s, \"\\n\") {\n\t\tline = strings.TrimSpace(line)\n\t\tif line == \"\" {\n\t\t\t// Skip empty lines\n\t\t\tcontinue\n\t\t}\n\n\t\tvar (\n\t\t\troles []Role\n\t\t\tfields = strings.Fields(line)\n\t\t\taddr = std.Address(strings.TrimSpace(fields[0]))\n\t\t)\n\n\t\tif !addr.IsValid() {\n\t\t\treturn nil, errors.New(\"invalid member address: \" + EscapeHTML(addr.String()))\n\t\t}\n\n\t\tfor _, v := range fields[1:] {\n\t\t\troles = appendRole(roles, strings.TrimSpace(v))\n\t\t}\n\n\t\tmembers = append(members, NewMember(addr, roles...))\n\t}\n\treturn members, nil\n}\n\n// MustParseStringToMembers parses a string of member addresses and roles.\n// String should have one or more lines where each line should contain an\n// address optionally followed by one or more roles.\n// Example multi line string:\n//\n//\tg1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun roleA\n//\tg1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl\n//\tg1vh7krmmzfua5xjmkatvmx09z37w34lsvd2mxa5 roleB roleA\n//\n// Addresses are validated after being parsed.\n// Roles must be validated by the caller to make sure the names are valid.\nfunc MustParseStringToMembers(s string) []Member {\n\tmembers, err := ParseStringToMembers(s)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\treturn members\n}\n\n// appendRole append a role if it doesn't exists within the list of roles.\nfunc appendRole(roles []Role, name string) []Role {\n\tfor _, r := range roles {\n\t\tif string(r) == name {\n\t\t\treturn roles\n\t\t}\n\t}\n\treturn append(roles, Role(name))\n}\n"},{"name":"dao_test.gno","body":"package dao\n\nimport (\n\t\"std\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/testutils\"\n\n\tgnome \"gno.land/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao\"\n)\n\nfunc TestMember(t *testing.T) {\n\tcases := []struct {\n\t\tname string\n\t\taddress std.Address\n\t\troles []gnome.Role\n\t\toutput string\n\t}{\n\t\t{\n\t\t\tname: \"without roles\",\n\t\t\taddress: std.Address(\"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\"),\n\t\t\toutput: \"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\",\n\t\t},\n\t\t{\n\t\t\tname: \"with one role\",\n\t\t\taddress: std.Address(\"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\"),\n\t\t\troles: []gnome.Role{\"foo\"},\n\t\t\toutput: \"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5 foo\",\n\t\t},\n\t\t{\n\t\t\tname: \"with two roles\",\n\t\t\taddress: std.Address(\"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\"),\n\t\t\troles: []gnome.Role{\"foo\", \"bar\"},\n\t\t\toutput: \"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5 foo, bar\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Act\n\t\t\tm := gnome.NewMember(tc.address, tc.roles...)\n\n\t\t\t// Assert\n\t\t\tif got := m.Address; got != tc.address {\n\t\t\t\tt.Fatalf(\"expected address %s, got: %s\", tc.address, got)\n\t\t\t}\n\n\t\t\tfor i, r := range m.Roles {\n\t\t\t\tif r != tc.roles[i] {\n\t\t\t\t\tt.Fatalf(\"expected role %s, got: %s\", tc.roles[i], r)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif got := m.String(); got != tc.output {\n\t\t\t\tt.Fatalf(\"expected member string output '%s', got: '%s'\", tc.output, got)\n\t\t\t}\n\t\t})\n\t}\n}\n\n// TODO: Add test cases to check different DAO options\nfunc TestDAO(t *testing.T) {\n\t// Arrange\n\tname := \"test\"\n\ttitle := \"Test DAO\"\n\tmanifest := \"This is a test\"\n\taddresses := []std.Address{\n\t\ttestutils.TestAddress(\"member1\"),\n\t\ttestutils.TestAddress(\"member2\"),\n\t}\n\n\t// Act\n\tdao := gnome.MustNew(name, title, gnome.WithManifest(manifest), gnome.WithMembers(\n\t\tgnome.NewMember(addresses[0]),\n\t\tgnome.NewMember(addresses[1]),\n\t))\n\n\t// Assert\n\tif got := dao.Name(); got != name {\n\t\tt.Fatalf(\"expected name: %d, got: %d\", name, got)\n\t}\n\n\tif got := dao.CreatedAt(); got.IsZero() {\n\t\tt.Fatalf(\"expected a valid creation time, got: '%s'\", got.String())\n\t}\n\n\tif got := dao.Title(); got != title {\n\t\tt.Fatalf(\"expected title: '%s', got: '%s'\", title, got)\n\t}\n\n\tif got := dao.Manifest(); got != manifest {\n\t\tt.Fatalf(\"expected manifest: '%s', got: '%s'\", manifest, got)\n\t}\n\n\tif got := dao.Parent(); got != nil {\n\t\tt.Fatalf(\"expected no parent DAO, got: '%s'\", got.Name())\n\t}\n\n\tif c := len(dao.SubDAOs()); c != 0 {\n\t\tt.Fatalf(\"expected no sub DAO nodes, got %d node(s)\", c)\n\t}\n\n\tif dao.IsSuperCouncil() {\n\t\tt.Fatal(\"expected DAO not to be a super council\")\n\t}\n\n\tif c := len(dao.Members()); c != len(addresses) {\n\t\tt.Fatalf(\"expected %d DAO members, got %d\", len(addresses), c)\n\t}\n\n\tfor _, addr := range addresses {\n\t\tif !dao.HasMember(addr) {\n\t\t\tt.Fatalf(\"expected member %s to be a member of DAO\", addr)\n\t\t}\n\n\t\tm, found := dao.GetMember(addr)\n\t\tif !found {\n\t\t\tt.Fatalf(\"expected member %s to be found\", addr)\n\t\t}\n\n\t\tif m.Address != addr {\n\t\t\tt.Fatalf(\"expected member to have address %s, got: %s\", addr, m.Address)\n\t\t}\n\t}\n}\n\nfunc TestDAOAddMember(t *testing.T) {\n\tcases := []struct {\n\t\tname string\n\t\tmember gnome.Member\n\t\tmembersCount int\n\t\tshouldExist bool\n\t\tsetup func(*gnome.DAO)\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\tmember: newTestMember(t, \"member\"),\n\t\t\tmembersCount: 1,\n\t\t\tshouldExist: true,\n\t\t},\n\t\t{\n\t\t\tname: \"existing\",\n\t\t\tmember: newTestMember(t, \"member\"),\n\t\t\tmembersCount: 2,\n\t\t\tshouldExist: true,\n\t\t\tsetup: func(dao *gnome.DAO) {\n\t\t\t\tdao.AddMember(newTestMember(t, \"member2\"))\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"duplicate\",\n\t\t\tmember: newTestMember(t, \"member\"),\n\t\t\tmembersCount: 2,\n\t\t\tshouldExist: true,\n\t\t\tsetup: func(dao *gnome.DAO) {\n\t\t\t\tdao.AddMember(newTestMember(t, \"member\"))\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tdao := gnome.MustNew(\"test\", \"Test\")\n\n\t\t\tif tc.setup != nil {\n\t\t\t\ttc.setup(dao)\n\t\t\t}\n\n\t\t\t// Act\n\t\t\tdao.AddMember(tc.member)\n\n\t\t\t// Assert\n\t\t\tif got := dao.HasMember(tc.member.Address); got != tc.shouldExist {\n\t\t\t\tt.Fatalf(\"expected has member call to return %v, got: %v\", tc.shouldExist, got)\n\t\t\t}\n\n\t\t\tm, found := dao.GetMember(tc.member.Address)\n\t\t\tif found != tc.shouldExist {\n\t\t\t\tt.Fatalf(\"expected member getter to return %v, got: %v\", tc.shouldExist, found)\n\t\t\t}\n\n\t\t\tif tc.shouldExist \u0026\u0026 m.Address != tc.member.Address {\n\t\t\t\tt.Fatalf(\"expected added member to have adderss %s, got: %s\", tc.member, m)\n\t\t\t}\n\n\t\t\tmembers := dao.Members()\n\t\t\tif c := len(members); c != tc.membersCount {\n\t\t\t\tt.Fatalf(\"expected %d member(s), got: %d\", tc.membersCount, c)\n\t\t\t}\n\n\t\t\tif len(members) \u003e 0 {\n\t\t\t\tm = members[len(members)-1]\n\t\t\t\tif m.Address != tc.member.Address {\n\t\t\t\t\tt.Fatalf(\"expected last added member address: %s, got: %s\", tc.member.Address, m.Address)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestDAORemoveMember(t *testing.T) {\n\tcases := []struct {\n\t\tname string\n\t\tmember gnome.Member\n\t\tsetup func(*gnome.DAO)\n\t\tresult bool\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\tmember: newTestMember(t, \"member\"),\n\t\t\tresult: true,\n\t\t\tsetup: func(dao *gnome.DAO) {\n\t\t\t\tdao.AddMember(newTestMember(t, \"member\"))\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"missing\",\n\t\t\tmember: newTestMember(t, \"member\"),\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tdao := gnome.MustNew(\"test\", \"Test\")\n\n\t\t\tif tc.setup != nil {\n\t\t\t\ttc.setup(dao)\n\t\t\t}\n\n\t\t\t// Act\n\t\t\tresult := dao.RemoveMember(tc.member.Address)\n\n\t\t\t// Assert\n\t\t\tif result != tc.result {\n\t\t\t\tt.Fatalf(\"expected result to be %v, got: %v\", tc.result, result)\n\t\t\t}\n\n\t\t\tif dao.HasMember(tc.member.Address) {\n\t\t\t\tt.Fatal(\"member shouldn't exist\")\n\t\t\t}\n\n\t\t\tif _, found := dao.GetMember(tc.member.Address); found {\n\t\t\t\tt.Fatal(\"expected member getter to return false\")\n\t\t\t}\n\n\t\t\tif c := len(dao.Members()); c != 0 {\n\t\t\t\tt.Fatalf(\"expected no DAO members, got: %d\", c)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestDAOAddSubDAO(t *testing.T) {\n\tcases := []struct {\n\t\tname, path string\n\t\tchildren int\n\t\tdao, subDAO *gnome.DAO\n\t\tresult bool\n\t\tsetup func(*gnome.DAO)\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\tdao: gnome.MustNew(\"main\", \"Main\"),\n\t\t\tsubDAO: gnome.MustNew(\"foo\", \"Foo\"),\n\t\t\tchildren: 1,\n\t\t\tpath: \"main/foo\",\n\t\t\tresult: true,\n\t\t},\n\t\t{\n\t\t\tname: \"with children\",\n\t\t\tdao: gnome.MustNew(\n\t\t\t\t\"main\",\n\t\t\t\t\"Main\",\n\t\t\t\tgnome.WithSubDAO(gnome.MustNew(\"bar\", \"Bar\")),\n\t\t\t),\n\t\t\tsubDAO: gnome.MustNew(\"foo\", \"Foo\"),\n\t\t\tchildren: 2,\n\t\t\tpath: \"main/foo\",\n\t\t\tresult: true,\n\t\t},\n\t\t{\n\t\t\tname: \"duplicate\",\n\t\t\tdao: gnome.MustNew(\n\t\t\t\t\"main\",\n\t\t\t\t\"Main\",\n\t\t\t\tgnome.WithSubDAO(gnome.MustNew(\"foo\", \"Foo\")),\n\t\t\t),\n\t\t\tsubDAO: gnome.MustNew(\"foo\", \"Foo\"),\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Act\n\t\t\tresult := tc.dao.AddSubDAO(tc.subDAO)\n\n\t\t\t// Assert\n\t\t\tif result != tc.result {\n\t\t\t\tt.Fatalf(\"expected result to be %v, got: %v\", tc.result, result)\n\t\t\t}\n\n\t\t\tif result {\n\t\t\t\tif got := tc.subDAO.Path(); got != tc.path {\n\t\t\t\t\tt.Fatalf(\"expected path to be '%s', got: '%s'\", tc.path, got)\n\t\t\t\t}\n\n\t\t\t\tif c := len(tc.dao.SubDAOs()); c != tc.children {\n\t\t\t\t\tt.Fatalf(\"expected %d sub DAO node(s), got %d node(s)\", tc.children, c)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestDAORemoveSubDAO(t *testing.T) {\n\tcases := []struct {\n\t\tname, subName string\n\t\tchildren int\n\t\tsubDAO *gnome.DAO\n\t\tresult bool\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\tsubDAO: gnome.MustNew(\n\t\t\t\t\"main\",\n\t\t\t\t\"Main\",\n\t\t\t\tgnome.WithSubDAO(gnome.MustNew(\"foo\", \"Foo\")),\n\t\t\t),\n\t\t\tsubName: \"foo\",\n\t\t\tresult: true,\n\t\t},\n\t\t{\n\t\t\tname: \"with children\",\n\t\t\tsubDAO: gnome.MustNew(\n\t\t\t\t\"main\",\n\t\t\t\t\"Main\",\n\t\t\t\tgnome.WithSubDAO(gnome.MustNew(\"foo\", \"Foo\")),\n\t\t\t\tgnome.WithSubDAO(gnome.MustNew(\"bar\", \"Bar\")),\n\t\t\t),\n\t\t\tsubName: \"foo\",\n\t\t\tchildren: 1,\n\t\t\tresult: true,\n\t\t},\n\t\t{\n\t\t\tname: \"missing\",\n\t\t\tsubName: \"foo\",\n\t\t\tsubDAO: gnome.MustNew(\"main\", \"Main\"),\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Act\n\t\t\tresult := tc.subDAO.RemoveSubDAO(tc.subName)\n\n\t\t\t// Assert\n\t\t\tif result != tc.result {\n\t\t\t\tt.Fatalf(\"expected result to be %v, got: %v\", tc.result, result)\n\t\t\t}\n\n\t\t\tif result {\n\t\t\t\tif c := len(tc.subDAO.SubDAOs()); c != tc.children {\n\t\t\t\t\tt.Fatalf(\"expected %d sub DAO node(s), got %d node(s)\", tc.children, c)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestDAOTree(t *testing.T) {\n\tdaoA1 := gnome.MustNew(\"a1\", \"A1\")\n\tdaoA2 := gnome.MustNew(\"a2\", \"A2\")\n\tdaoA := gnome.MustNew(\"a\", \"A\", gnome.WithSubDAO(daoA1), gnome.WithSubDAO(daoA2))\n\tdaoB1 := gnome.MustNew(\"b1\", \"B1\")\n\tdaoB := gnome.MustNew(\"b\", \"B\", gnome.WithSubDAO(daoB1))\n\tdao := gnome.MustNew(\"main\", \"Main\", gnome.WithSubDAO(daoA), gnome.WithSubDAO(daoB))\n\n\tcases := []struct {\n\t\tname, path string\n\t\tdao *gnome.DAO\n\t}{\n\t\t{\n\t\t\tname: \"root\",\n\t\t\tpath: \"main\",\n\t\t\tdao: dao,\n\t\t},\n\t\t{\n\t\t\tname: \"path a\",\n\t\t\tpath: \"main/a\",\n\t\t\tdao: daoA,\n\t\t},\n\t\t{\n\t\t\tname: \"path a1\",\n\t\t\tpath: \"main/a/a1\",\n\t\t\tdao: daoA1,\n\t\t},\n\t\t{\n\t\t\tname: \"path a2\",\n\t\t\tpath: \"main/a/a2\",\n\t\t\tdao: daoA2,\n\t\t},\n\t\t{\n\t\t\tname: \"path b\",\n\t\t\tpath: \"main/b\",\n\t\t\tdao: daoB,\n\t\t},\n\t\t{\n\t\t\tname: \"path b1\",\n\t\t\tpath: \"main/b/b1\",\n\t\t\tdao: daoB1,\n\t\t},\n\t\t{\n\t\t\tname: \"invalid\",\n\t\t\tpath: \"foo\",\n\t\t},\n\t\t{\n\t\t\tname: \"invalid sub path\",\n\t\t\tpath: \"foo/bar\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Act\n\t\t\tsubDAO := dao.GetDAO(tc.path)\n\n\t\t\t// Assert\n\t\t\tif subDAO != tc.dao {\n\t\t\t\tif subDAO == nil {\n\t\t\t\t\tt.Fatalf(\"DAO for path '%s' not found\", tc.path)\n\t\t\t\t} else {\n\t\t\t\t\tt.Fatalf(\"unexpected DAO for path '%s': '%s'\", tc.path, subDAO.Name())\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif subDAO != nil \u0026\u0026 subDAO.Path() != tc.path {\n\t\t\t\tt.Fatalf(\"expected DAO to return path '%s': got '%s'\", tc.path, subDAO.Path())\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc newTestMember(t *testing.T, name string) gnome.Member {\n\tt.Helper()\n\treturn gnome.NewMember(testutils.TestAddress(name))\n}\n"},{"name":"id.gno","body":"package dao\n\nimport (\n\t\"encoding/binary\"\n\t\"strconv\"\n)\n\n// ID defines a generic ID type.\ntype ID uint64\n\n// String returns the value of the ID as a string.\nfunc (id ID) String() string {\n\treturn strconv.Itoa(int(id))\n}\n\n// Key returns the binary representation of the ID to be used as key for AVL trees.\nfunc (id ID) Key() string {\n\tbuf := make([]byte, 8)\n\tbinary.BigEndian.PutUint64(buf, uint64(id))\n\treturn string(buf)\n}\n\n// ConvertKeyToID converts a key to an ID.\n// Key is a binary representation of an ID.\nfunc ConvertKeyToID(key string) (ID, bool) {\n\tif len(key) != 8 {\n\t\treturn 0, false\n\t}\n\treturn ID(binary.BigEndian.Uint64([]byte(key))), true\n}\n"},{"name":"marshal.gno","body":"package dao\n\nimport (\n\t\"strconv\"\n\t\"time\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/json\"\n)\n\n// PreMarshaler defines an interface to enable JSON pre marshalling support.\ntype PreMarshaler interface {\n\t// PreMarshal pre marshals a type into a JSON node.\n\tPreMarshal() *json.Node\n}\n\n// PreMarshalDAO pre-marshalls a DAO and its sub DAOs.\nfunc PreMarshalDAO(key string, dao *DAO) *json.Node {\n\tnode := json.ObjectNode(key, nil)\n\tnode.AppendObject(\"name\", json.StringNode(\"name\", dao.name))\n\tnode.AppendObject(\"title\", json.StringNode(\"title\", dao.title))\n\tnode.AppendObject(\"manifest\", json.StringNode(\"manifest\", dao.manifest))\n\tnode.AppendObject(\"isSuperCouncil\", json.BoolNode(\"isSuperCouncil\", dao.isSuperCouncil))\n\tnode.AppendObject(\"isLocked\", json.BoolNode(\"isLocked\", dao.isLocked))\n\tnode.AppendObject(\"lockReason\", json.StringNode(\"lockReason\", dao.lockReason))\n\tnode.AppendObject(\"members\", preMarshalMembers(\"members\", dao.members))\n\tnode.AppendObject(\"createdAt\", preMarshalTime(\"createdAt\", dao.createdAt))\n\n\tif dao.parent != nil {\n\t\tnode.AppendObject(\"parentName\", json.StringNode(\"parentName\", dao.parent.name))\n\t} else {\n\t\tnode.AppendObject(\"parentName\", json.NullNode(\"parentName\"))\n\t}\n\n\tvar children []*json.Node\n\tfor _, c := range dao.children {\n\t\tchildren = append(children, PreMarshalDAO(\"\", c))\n\t}\n\tnode.AppendObject(\"children\", json.ArrayNode(\"children\", children))\n\n\treturn node\n}\n\n// PreMarshalProposal pre-marshalls a proposal.\nfunc PreMarshalProposal(key string, p *Proposal) *json.Node {\n\tnode := json.ObjectNode(key, nil)\n\tnode.AppendObject(\"id\", json.StringNode(\"id\", p.id.String()))\n\tnode.AppendObject(\"title\", json.StringNode(\"title\", p.title))\n\tnode.AppendObject(\"description\", json.StringNode(\"description\", p.description))\n\tnode.AppendObject(\"proposer\", json.StringNode(\"proposer\", p.proposer.String()))\n\tnode.AppendObject(\"createdAt\", preMarshalTime(\"createdAt\", p.createdAt))\n\tnode.AppendObject(\"votingDeadline\", preMarshalTime(\"votingDeadline\", p.votingDeadline))\n\tnode.AppendObject(\"reviewDeadline\", preMarshalTime(\"reviewDeadline\", p.reviewDeadline))\n\tnode.AppendObject(\"voteChangeDuration\", preMarshalDuration(\"voteChangeDuration\", p.voteChangeDuration))\n\tnode.AppendObject(\"status\", json.StringNode(\"status\", strconv.Itoa(int(p.status))))\n\tnode.AppendObject(\"statusReason\", json.StringNode(\"statusReason\", p.statusReason))\n\tnode.AppendObject(\"strategy\", preMarshalStrategy(\"strategy\", p.strategy))\n\tnode.AppendObject(\"choice\", json.StringNode(\"choice\", string(p.choice)))\n\n\tvar daos []*json.Node\n\tfor _, dao := range p.daos {\n\t\tdaos = append(daos, json.StringNode(\"\", dao.name))\n\t}\n\tnode.AppendObject(\"daos\", json.ArrayNode(\"\", daos))\n\n\tvar records []*json.Node\n\tfor _, r := range p.votingRecords {\n\t\trecords = append(records, preMarshalVotingRecord(r))\n\t}\n\tnode.AppendObject(\"votingRecords\", json.ArrayNode(\"\", records))\n\n\treturn node\n}\n\nfunc preMarshalTime(key string, t time.Time) *json.Node {\n\tif t.IsZero() {\n\t\treturn json.NullNode(key)\n\t}\n\treturn json.StringNode(key, t.Format(time.RFC3339))\n}\n\nfunc preMarshalDuration(key string, d time.Duration) *json.Node {\n\treturn json.StringNode(key, strconv.FormatInt(int64(d), 10))\n}\n\nfunc preMarshalMembers(key string, members []Member) *json.Node {\n\tif members == nil {\n\t\treturn json.NullNode(key)\n\t}\n\n\tnodes := make([]*json.Node, len(members))\n\tfor i, m := range members {\n\t\tnodes[i] = json.ObjectNode(\"\", nil)\n\t\tnodes[i].AppendObject(\"address\", json.StringNode(\"address\", m.Address.String()))\n\n\t\tvar roles []*json.Node\n\t\tfor _, r := range m.Roles {\n\t\t\troles = append(roles, json.StringNode(\"\", string(r)))\n\t\t}\n\t\tnodes[i].AppendObject(\"roles\", json.ArrayNode(\"roles\", roles))\n\t}\n\treturn json.ArrayNode(key, nodes)\n}\n\nfunc preMarshalProposalGroups(key string, tree avl.Tree) *json.Node {\n\tnode := json.ObjectNode(key, nil)\n\ttree.Iterate(\"\", \"\", func(k string, value interface{}) bool {\n\t\t// Save proposal IDs instead of the pre marshalled proposal which is saved inside \"proposals\"\n\t\tvar proposals []*json.Node\n\t\tfor _, p := range value.([]*Proposal) {\n\t\t\tproposals = append(proposals, json.StringNode(\"\", p.id.String()))\n\t\t}\n\n\t\tdaoID, _ := ConvertKeyToID(k) // TODO: Error should not happen, handle it anyways\n\t\tnode.AppendObject(daoID.String(), json.ArrayNode(\"\", proposals))\n\t\treturn false\n\t})\n\treturn node\n}\n\nfunc preMarshalStrategy(key string, s ProposalStrategy) *json.Node {\n\tif m, ok := s.(PreMarshaler); ok {\n\t\treturn m.PreMarshal()\n\t}\n\treturn json.NullNode(key)\n}\n\nfunc preMarshalVotingRecord(r *VotingRecord) *json.Node {\n\tnode := json.ObjectNode(\"\", nil)\n\tnode.AppendObject(\"votes\", preMarshalVotes(\"votes\", r.votes))\n\tnode.AppendObject(\"counter\", preMarshalVoteCounter(\"counter\", r.counter))\n\treturn node\n}\n\nfunc preMarshalVotes(key string, votes []Vote) *json.Node {\n\tnodes := make([]*json.Node, len(votes))\n\tfor i, v := range votes {\n\t\tn := json.ObjectNode(\"\", nil)\n\t\tn.AppendObject(\"address\", json.StringNode(\"address\", v.Address.String()))\n\t\tn.AppendObject(\"choice\", json.StringNode(\"choice\", string(v.Choice)))\n\t\tn.AppendObject(\"reason\", json.StringNode(\"reason\", v.Reason))\n\t\tn.AppendObject(\"createdAt\", preMarshalTime(\"createdAt\", v.CreatedAt))\n\n\t\tif v.DAO != nil {\n\t\t\tn.AppendObject(\"daoPath\", json.StringNode(\"daoPath\", v.DAO.Path()))\n\t\t} else {\n\t\t\tn.AppendObject(\"daoPath\", json.NullNode(\"daoPath\"))\n\t\t}\n\n\t\tnodes[i] = n\n\t}\n\treturn json.ArrayNode(key, nodes)\n}\n\nfunc preMarshalVoteCounter(key string, tree avl.Tree) *json.Node {\n\tnode := json.ObjectNode(key, nil)\n\ttree.Iterate(\"\", \"\", func(choice string, value interface{}) bool {\n\t\tnode.AppendObject(choice, json.NumberNode(\"\", float64(value.(uint))))\n\t\treturn false\n\t})\n\treturn node\n}\n"},{"name":"proposal.gno","body":"package dao\n\nimport (\n\t\"errors\"\n\t\"std\"\n\t\"strings\"\n\t\"time\"\n)\n\nconst (\n\tStatusReview ProposalStatus = iota\n\tStatusActive\n\tStatusPassed\n\tStatusRejected\n\tStatusWithdrawed\n\tStatusDismissed\n\tStatusFailed\n)\n\nconst (\n\t// TODO: Add more choices which also should be configurable (use a different type?)\n\tChoiceNone VoteChoice = \"\"\n\tChoiceYes VoteChoice = \"yes\"\n\tChoiceNo VoteChoice = \"no\"\n)\n\nconst (\n\tdefaultVoteChangeDuration = time.Hour\n\texecutionErrorMsg = \"proposal execution error\"\n)\n\nvar (\n\tErrAlreadyVoted = errors.New(\"member already voted on this proposal\")\n\tErrInvalidReason = errors.New(\"reason must have at least 5 characters\")\n\tErrInvalidVoteChoice = errors.New(\"invalid vote choice\")\n\tErrMemberVoteNotAllowed = errors.New(\"you must be a DAO or parent DAO member to vote\")\n\tErrProposalPromote = errors.New(\"proposals can only be promoted to a parent DAO\")\n\tErrProposalVotingDeadlineMet = errors.New(\"proposal voting deadline already met\")\n\tErrProposalNotActive = errors.New(\"proposal is not active\")\n\tErrProposalNotPassed = errors.New(`proposal status must be \"passed\"`)\n\tErrReasonRequired = errors.New(\"reason is required\")\n\tErrReviewStatusRequired = errors.New(`proposal status must be \"review\"`)\n)\n\ntype (\n\t// ExecutionError indicates that proposal execution failed.\n\tExecutionError struct {\n\t\t// Reason contains the error or error message with the reason of the error.\n\t\tReason interface{}\n\t}\n\n\t// ProposalIterFn defines the a callback to iterate proposals.\n\tProposalIterFn func(*Proposal) bool\n\n\t// ProposalOption configures proposals.\n\tProposalOption func(*Proposal)\n\n\t// ProposalStatus defines the type for proposal states.\n\tProposalStatus uint8\n\n\t// VoteChoice defines the type for proposal vote choices.\n\tVoteChoice string\n\n\t// Vote contains the information for a member vote.\n\tVote struct {\n\t\t// Address is the DAO member address.\n\t\tAddress std.Address\n\n\t\t// Choice is the proposal choice being voted.\n\t\tChoice VoteChoice\n\n\t\t// Reason contains the reason for the vote.\n\t\tReason string\n\n\t\t// DAO contains the DAO that the proposal being voted belongs to.\n\t\tDAO *DAO\n\n\t\t// CreatedAt contains the time when the vote was submitted.\n\t\tCreatedAt time.Time\n\t}\n)\n\n// Error returns the execution error message.\nfunc (e ExecutionError) Error() string {\n\tswitch v := e.Reason.(type) {\n\tcase string:\n\t\treturn executionErrorMsg + \": \" + v\n\tcase error:\n\t\treturn executionErrorMsg + \": \" + v.Error()\n\tdefault:\n\t\treturn executionErrorMsg\n\t}\n}\n\n// String returns the proposal status name.\nfunc (s ProposalStatus) String() string {\n\tswitch s {\n\tcase StatusReview:\n\t\treturn \"review\"\n\tcase StatusActive:\n\t\treturn \"active\"\n\tcase StatusPassed:\n\t\treturn \"passed\"\n\tcase StatusRejected:\n\t\treturn \"rejected\"\n\tcase StatusWithdrawed:\n\t\treturn \"withdrawed\"\n\tcase StatusDismissed:\n\t\treturn \"dismissed\"\n\tcase StatusFailed:\n\t\treturn \"failed\"\n\tdefault:\n\t\treturn \"unknown\"\n\t}\n}\n\n// IsFinal checks if the status is a final status.\n// When a status is final it can't be changed to a different status.\n// Being final means that status signals the final outcome of a proposal.\nfunc (s ProposalStatus) IsFinal() bool {\n\tswitch s {\n\tcase StatusReview, StatusActive:\n\t\treturn false\n\tdefault:\n\t\treturn true\n\t}\n}\n\n// IsExecutionError checks if an error is an ExecutionError.\nfunc IsExecutionError(err error) bool {\n\tswitch err.(type) {\n\tcase ExecutionError:\n\t\treturn true\n\tcase *ExecutionError:\n\t\treturn true\n\tdefault:\n\t\treturn false\n\t}\n}\n\n// WithDescription assigns a description to the proposal.\nfunc WithDescription(s string) ProposalOption {\n\treturn func(p *Proposal) {\n\t\tp.description = s\n\t}\n}\n\n// WithVotingDeadline assigns a voting deadline to the proposal.\nfunc WithVotingDeadline(t time.Time) ProposalOption {\n\treturn func(p *Proposal) {\n\t\tp.votingDeadline = t\n\t}\n}\n\n// WithReviewDeadline assigns a review deadline to the proposal.\n// Review status allows proposal withdraw within a time frame after the proposal is created.\n// Proposals must be activated when a review deadline is assigned.\nfunc WithReviewDeadline(t time.Time) ProposalOption {\n\treturn func(p *Proposal) {\n\t\tp.reviewDeadline = t\n\t}\n}\n\n// WithVoteChangeDuration change the default grace period to change a submitted vote choice.\nfunc WithVoteChangeDuration(d time.Duration) ProposalOption {\n\treturn func(p *Proposal) {\n\t\tp.voteChangeDuration = d\n\t}\n}\n\n// NewProposal creates a new proposal.\n// By default proposals use the standard strategy with a deadline of seven days.\nfunc NewProposal(\n\tid ID,\n\tstrategy ProposalStrategy,\n\tproposer std.Address,\n\tdao *DAO,\n\ttitle string,\n\toptions ...ProposalOption,\n) (*Proposal, error) {\n\tif dao == nil {\n\t\treturn nil, errors.New(\"proposal DAO is required\")\n\t}\n\n\tif strings.TrimSpace(title) == \"\" {\n\t\treturn nil, errors.New(\"proposal title is required\")\n\t}\n\n\tnow := time.Now()\n\tp := \u0026Proposal{\n\t\tid: id,\n\t\tproposer: proposer,\n\t\ttitle: title,\n\t\tvotingDeadline: now.Add(strategy.VotingPeriod()),\n\t\tvoteChangeDuration: defaultVoteChangeDuration,\n\t\tstrategy: strategy,\n\t\tdaos: []*DAO{dao},\n\t\tvotingRecords: []*VotingRecord{NewVotingRecord()},\n\t\tcreatedAt: now,\n\t}\n\n\tfor _, apply := range options {\n\t\tapply(p)\n\t}\n\n\t// Create the proposal as active when a review deadline is not assigned\n\tif p.reviewDeadline.IsZero() {\n\t\tp.status = StatusActive\n\t}\n\n\treturn p, nil\n}\n\n// Proposal defines a DAO proposal.\ntype Proposal struct {\n\tid ID\n\ttitle string\n\tdescription string\n\tproposer std.Address\n\tcreatedAt time.Time\n\tvotingDeadline time.Time\n\treviewDeadline time.Time\n\tvoteChangeDuration time.Duration\n\tstatus ProposalStatus\n\tstrategy ProposalStrategy\n\tdaos []*DAO\n\tvotingRecords []*VotingRecord\n\tchoice VoteChoice\n\tstatusReason string\n}\n\n// ID returns the proposal ID.\nfunc (p Proposal) ID() ID {\n\treturn p.id\n}\n\n// DAO returns the DAO that the proposal is assigned to.\n// If proposal has been promoted the returned DAO is the one where proposal has been promoted to.\nfunc (p Proposal) DAO() *DAO {\n\tcount := len(p.daos)\n\tif count == 0 {\n\t\tpanic(\"proposal is not assigned to a DAO\")\n\t}\n\treturn p.daos[count-1]\n}\n\n// InitialDAO returns the the DAO that was assigned during proposal creation.\nfunc (p Proposal) InitialDAO() *DAO {\n\tif len(p.daos) \u003e 0 {\n\t\treturn p.daos[0]\n\t}\n\treturn nil\n}\n\n// Strategy returns the strategy of the proposal.\nfunc (p Proposal) Strategy() ProposalStrategy {\n\treturn p.strategy\n}\n\n// Title returns the title of the proposal.\nfunc (p Proposal) Title() string {\n\treturn p.title\n}\n\n// Description returns the description of the proposal.\nfunc (p Proposal) Description() string {\n\treturn p.description\n}\n\n// StatusReason returns the reason that triggered the current proposal status.\n// Reason is relevant for some statuses like dismissed or failed.\nfunc (p Proposal) StatusReason() string {\n\treturn p.statusReason\n}\n\n// Proposer returns the address of the member that created the proposal.\nfunc (p Proposal) Proposer() std.Address {\n\treturn p.proposer\n}\n\n// Choice returns the winner choice.\nfunc (p Proposal) Choice() VoteChoice {\n\treturn p.choice\n}\n\n// CreatedAt returns the creation time of the proposal.\nfunc (p Proposal) CreatedAt() time.Time {\n\treturn p.createdAt\n}\n\n// Promotions returns the list of DAOs where the proposal has been promoted.\n// The result is nil when the proposal has never been promoted to another DAO.\nfunc (p Proposal) Promotions() []*DAO {\n\tif p.HasBeenPromoted() {\n\t\treturn p.daos\n\t}\n\treturn nil\n}\n\n// VotingDeadline returns the voting deadline for the proposal.\n// No more votes are allowed after this deadline.\nfunc (p Proposal) VotingDeadline() time.Time {\n\treturn p.votingDeadline\n}\n\n// ReviewDeadline returns the deadline for proposal review.\nfunc (p Proposal) ReviewDeadline() time.Time {\n\treturn p.reviewDeadline\n}\n\n// VoteChangeDuration returns the duration after voting where users can change the voted choice.\nfunc (p Proposal) VoteChangeDuration() time.Duration {\n\treturn p.voteChangeDuration\n}\n\n// Status returns the status of the proposal.\nfunc (p Proposal) Status() ProposalStatus {\n\treturn p.status\n}\n\n// Votes returns the proposal votes.\nfunc (p Proposal) Votes() []Vote {\n\treturn p.VotingRecord().Votes()\n}\n\n// VotingRecord returns the voting record of the proposal for the current DAO.\n// The record contains the number of votes for each voting choice.\nfunc (p Proposal) VotingRecord() *VotingRecord {\n\tcount := len(p.votingRecords)\n\tif count == 0 {\n\t\tpanic(\"proposal is not voting records\")\n\t}\n\treturn p.votingRecords[count-1]\n}\n\n// VotingRecords returns all voting records of the proposal.\n// Each record contains the number of votes for each DAO that the proposal was promoted to.\nfunc (p Proposal) VotingRecords() []*VotingRecord {\n\treturn p.votingRecords\n}\n\n// IsExecutable checks if the proposal is executable.\nfunc (p Proposal) IsExecutable() bool {\n\t_, ok := p.strategy.(Executer)\n\treturn ok\n}\n\n// IsChoiceAllowed checks if a vote choice is valid for the proposal.\nfunc (p Proposal) IsChoiceAllowed(choice VoteChoice) bool {\n\tfor _, c := range p.strategy.VoteChoices() {\n\t\tif c == choice {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// HasVotingDeadlinePassed checks if the voting deadline for the proposal has passed.\nfunc (p Proposal) HasVotingDeadlinePassed() bool {\n\treturn time.Now().After(p.votingDeadline)\n}\n\n// HasReviewDeadlinePassed checks if the deadline for proposal review has passed.\nfunc (p Proposal) HasReviewDeadlinePassed() bool {\n\treturn time.Now().After(p.reviewDeadline)\n}\n\n// HasBeenPromoted checks if the proposal has been promoted to another DAO.\nfunc (p Proposal) HasBeenPromoted() bool {\n\treturn len(p.daos) \u003e 1\n}\n\n// HasPromotion checks if proposal has been promoted to a DAO.\nfunc (p Proposal) HasPromotion(daoPath string) bool {\n\tfor _, dao := range p.Promotions() {\n\t\tif dao.Path() == daoPath {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// GetVotingRecordByName returns the voting record for a DAO.\nfunc (p Proposal) GetVotingRecordByName(daoPath string) *VotingRecord {\n\tfor i, dao := range p.daos {\n\t\tif dao.Path() == daoPath {\n\t\t\t// Voting record index must match the DAO promotions index\n\t\t\treturn p.votingRecords[i]\n\t\t}\n\t}\n\treturn nil\n}\n\n// Withdraw changes the status of the proposal to withdrawed.\n// Proposal must have status \"review\" to be withdrawed.\nfunc (p *Proposal) Withdraw() error {\n\tif p.status != StatusReview {\n\t\treturn ErrReviewStatusRequired\n\t}\n\n\tp.status = StatusWithdrawed\n\treturn nil\n}\n\n// Dismiss dismisses a proposal.\nfunc (p *Proposal) Dismiss(reason string) error {\n\treason = strings.TrimSpace(reason)\n\tif reason == \"\" {\n\t\treturn ErrReasonRequired\n\t}\n\n\tp.statusReason = reason\n\tp.status = StatusDismissed\n\treturn nil\n}\n\n// Fail changes the proposal status to failed.\nfunc (p *Proposal) Fail(reason string) error {\n\treason = strings.TrimSpace(reason)\n\tif reason == \"\" {\n\t\treturn ErrReasonRequired\n\t}\n\n\tp.statusReason = reason\n\tp.status = StatusFailed\n\treturn nil\n}\n\n// Activate changes the status of the proposal to active.\n// Proposal must have status \"review\" to be activated.\nfunc (p *Proposal) Activate() error {\n\tif p.status != StatusReview {\n\t\treturn ErrReviewStatusRequired\n\t}\n\n\tp.status = StatusActive\n\treturn nil\n}\n\n// Promote promotes the proposal to a parent DAO.\n// Promoting extends the voting deadline by the voting period defined for the proposal\n// strategy and also creates a new voting record for the parent DAO members.\nfunc (p *Proposal) Promote(dao *DAO) error {\n\tif !p.DAO().HasParent(dao) {\n\t\treturn ErrProposalPromote\n\t}\n\n\tp.daos = append(p.daos, dao)\n\tp.votingRecords = append(p.votingRecords, NewVotingRecord())\n\tp.votingDeadline = time.Now().Add(p.strategy.VotingPeriod())\n\treturn nil\n}\n\n// Vote submits a vote for the proposal.\nfunc (p *Proposal) Vote(addr std.Address, choice VoteChoice, reason string) error {\n\tif p.status != StatusActive {\n\t\treturn ErrProposalNotActive\n\t}\n\n\tnow := time.Now()\n\tif p.votingDeadline.Before(now) {\n\t\treturn ErrProposalVotingDeadlineMet\n\t}\n\n\tif !p.IsChoiceAllowed(choice) {\n\t\treturn ErrInvalidVoteChoice\n\t}\n\n\tif reason != \"\" {\n\t\treason = strings.TrimSpace(reason)\n\t\tif len(reason) \u003c 5 {\n\t\t\treturn ErrInvalidReason\n\t\t}\n\t}\n\n\t// When there is a vote for the account check if it's voting within the\n\t// grace period that allows changing the voted choice. This allows to\n\t// correct mistakes made when seding the vote TX within a small time frame.\n\t// TODO: Add a unit test case to check vote change\n\trecord := p.VotingRecord()\n\tfor _, v := range record.Votes() {\n\t\tif v.Address == addr {\n\t\t\tif v.CreatedAt.Add(p.voteChangeDuration).Before(now) {\n\t\t\t\treturn ErrAlreadyVoted\n\t\t\t}\n\n\t\t\trecord.Remove(addr)\n\t\t}\n\t}\n\n\t// Check the vote being submitted if vote check is required\n\tif c, ok := p.strategy.(VoteChecker); ok {\n\t\tif err := c.CheckVote(addr, choice, reason); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// Account must be a member of the proposal's DAO or any of its parents to be allowed to vote\n\tvar dao *DAO\n\tif p.DAO().HasMember(addr) {\n\t\t// When the account is member of the proposal's DAO its vote is accounted\n\t\t// as a vote from this DAO even if its also member of a parent DAO.\n\t\tdao = p.DAO()\n\t} else {\n\t\t// Try to find the higher order DAO that the account is member of\n\t\tdao = findBelongingDAO(addr, p.DAO().Parent())\n\t}\n\n\tif dao == nil {\n\t\treturn ErrMemberVoteNotAllowed\n\t}\n\n\trecord.Add(Vote{\n\t\tAddress: addr,\n\t\tChoice: choice,\n\t\tReason: reason,\n\t\tDAO: dao,\n\t\tCreatedAt: time.Now(),\n\t})\n\n\treturn nil\n}\n\n// Tally counts the number of votes and updates the proposal status accordingly.\n// The outcome of counting the votes depends on the proposal strategy.\n// This function does NOT check the voting deadline, it's responsibility of the caller to do so.\nfunc (p *Proposal) Tally() error {\n\tif p.status != StatusActive {\n\t\treturn ErrProposalNotActive\n\t}\n\n\t// Check if the required quorum is met\n\trecord := p.VotingRecord()\n\tpercentage := float64(record.VoteCount()) / float64(len(p.DAO().Members()))\n\tif percentage \u003c p.strategy.Quorum() {\n\t\tp.status = StatusRejected\n\t\tp.statusReason = \"low participation\"\n\t\treturn nil\n\t}\n\n\t// Tally votes and update proposal with the outcome\n\tchoice := p.strategy.Tally(p.DAO(), *record)\n\n\tswitch choice {\n\tcase ChoiceYes:\n\t\tp.choice = ChoiceYes\n\t\tp.status = StatusPassed\n\tcase ChoiceNo:\n\t\tp.choice = ChoiceNo\n\t\tp.status = StatusRejected\n\tdefault:\n\t\tp.status = StatusRejected\n\t}\n\treturn nil\n}\n\nfunc (p *Proposal) Validate() error {\n\tif v, ok := p.strategy.(Validator); ok {\n\t\tif err := v.Validate(p); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// Execute executes the proposal.\nfunc (p *Proposal) Execute() error { // TODO: Write test for proposal execute\n\tif p.status != StatusPassed {\n\t\treturn ErrProposalNotPassed\n\t}\n\n\tif e, ok := p.strategy.(Executer); ok {\n\t\tif err := p.Validate(); err != nil {\n\t\t\treturn ExecutionError{err}\n\t\t}\n\n\t\tif err := e.Execute(p.InitialDAO()); err != nil {\n\t\t\treturn ExecutionError{err}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc findBelongingDAO(addr std.Address, node *DAO) *DAO {\n\tif node == nil {\n\t\treturn nil\n\t}\n\n\t// Before checking the current DAO try to find\n\t// if address is a member of a higher order DAO\n\tdao := findBelongingDAO(addr, node.parent)\n\tif dao == nil \u0026\u0026 node.HasMember(addr) {\n\t\treturn node\n\t}\n\treturn nil\n}\n"},{"name":"proposal_test.gno","body":"package dao\n\nimport (\n\t\"errors\"\n\t\"std\"\n\t\"testing\"\n\t\"time\"\n\n\t\"gno.land/p/demo/testutils\"\n\n\tgnome \"gno.land/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao\"\n)\n\nvar (\n\tfutureTime = time.Now().Add(time.Hour)\n\tzeroTime = time.Time{}\n)\n\n// TODO: Improve proposal unit test using test cases and adding missing methods\nfunc TestProposal(t *testing.T) {\n\tcases := []struct {\n\t\tname, title, description string\n\t\tdao *gnome.DAO\n\t\terr error\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\tdao: gnome.MustNew(\"test\", \"Test\"),\n\t\t\ttitle: \"Proposal\",\n\t\t\tdescription: \"Test proposal\",\n\t\t},\n\t\t{\n\t\t\tname: \"empty DAO\",\n\t\t\terr: errors.New(\"proposal DAO is required\"),\n\t\t},\n\t\t{\n\t\t\tname: \"empty title\",\n\t\t\tdao: gnome.MustNew(\"test\", \"Test\"),\n\t\t\terr: errors.New(\"proposal title is required\"),\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tid := gnome.ID(1)\n\t\t\tproposer := testutils.TestAddress(\"proposer\")\n\t\t\tstrategy := testStrategy{}\n\t\t\tstatus := gnome.StatusActive\n\t\t\topts := []gnome.ProposalOption{\n\t\t\t\tgnome.WithDescription(tc.description),\n\t\t\t}\n\n\t\t\t// Act\n\t\t\tproposal, err := gnome.NewProposal(id, strategy, proposer, tc.dao, tc.title, opts...)\n\n\t\t\t// Assert\n\t\t\tif tc.err != nil {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tassertNoError(t, err)\n\n\t\t\tif got := proposal.ID(); got != id {\n\t\t\t\tt.Fatalf(\"expected ID: %d, got: %d\", id, got)\n\t\t\t}\n\n\t\t\tif got := proposal.DAO(); got.Name() != tc.dao.Name() {\n\t\t\t\tt.Fatalf(\"expected DAO: '%s', got: '%s'\", tc.dao.Name(), got.Name())\n\t\t\t}\n\n\t\t\tif got := proposal.Title(); got != tc.title {\n\t\t\t\tt.Fatalf(\"expected title: '%s', got: '%s'\", tc.title, got)\n\t\t\t}\n\n\t\t\tif got := proposal.Description(); got != tc.description {\n\t\t\t\tt.Fatalf(\"expected description: '%s', got: '%s'\", tc.description, got)\n\t\t\t}\n\n\t\t\tif got := proposal.StatusReason(); got != \"\" {\n\t\t\t\tt.Fatalf(\"expected empty dismiss reason, got: '%s'\", got)\n\t\t\t}\n\n\t\t\tif got := proposal.Proposer(); got != proposer {\n\t\t\t\tt.Fatalf(\"expected proposer: '%s', got: '%s'\", proposer, got)\n\t\t\t}\n\n\t\t\tif got := proposal.CreatedAt(); got.IsZero() {\n\t\t\t\tt.Fatalf(\"expected a valid creation time, got: '%s'\", got.String())\n\t\t\t}\n\n\t\t\tif c := len(proposal.Promotions()); c != 0 {\n\t\t\t\tt.Fatalf(\"expected an empty list of promotions, got: %d DAOs\", c)\n\t\t\t}\n\n\t\t\tif got := proposal.VotingDeadline(); got.IsZero() {\n\t\t\t\tt.Fatalf(\"expected a valid deadline time, got: '%s'\", got.String())\n\t\t\t}\n\n\t\t\tnow := time.Now()\n\t\t\tif got := proposal.VotingDeadline(); got.Before(now) { // TODO: Using after makes assertion fail (?)\n\t\t\t\tt.Fatalf(\"expected deadline to happen after: '%s', got: '%s'\", now.String(), got.String())\n\t\t\t}\n\n\t\t\tif got := proposal.Status(); got != status {\n\t\t\t\tt.Fatalf(\"expected status: %d, got: %d\", status, got)\n\t\t\t}\n\n\t\t\tif got := proposal.Strategy().Name(); got != strategy.Name() {\n\t\t\t\tt.Fatalf(\"expected strategy: '%s', got: '%s'\", strategy.Name(), got)\n\t\t\t}\n\n\t\t\tif got := proposal.Strategy().Name(); got != strategy.Name() {\n\t\t\t\tt.Fatalf(\"expected strategy: '%s', got: '%s'\", strategy.Name(), got)\n\t\t\t}\n\n\t\t\tif c := len(proposal.Votes()); c != 0 {\n\t\t\t\tt.Fatalf(\"expected no votes, got: %d votes\", c)\n\t\t\t}\n\n\t\t\tif c := proposal.VotingRecord().VoteCount(); c != 0 {\n\t\t\t\tt.Fatalf(\"expected an empty votes record, got: %d records\", c)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestProposalWithdraw(t *testing.T) {\n\t// TODO: Test success cases where proposal status is review\n\twantErr := gnome.ErrReviewStatusRequired\n\twantStatus := gnome.StatusWithdrawed\n\tproposal := mustCreateProposal(t, testStrategy{}, gnome.WithReviewDeadline(futureTime))\n\n\tif err := proposal.Withdraw(); err != nil {\n\t\tt.Fatalf(\"expected no error, got: '%s'\", err.Error())\n\t}\n\n\tif err := proposal.Withdraw(); err != wantErr {\n\t\tt.Fatalf(\"expected error: '%s', got: '%s'\", wantErr.Error(), err.Error())\n\t}\n\n\tif got := proposal.Status(); got != wantStatus {\n\t\tt.Fatalf(\"expected status: %d, got: %d\", wantStatus, got)\n\t}\n}\n\nfunc TestProposalDismiss(t *testing.T) {\n\tcases := []struct {\n\t\tname, reason string\n\t\tstatus gnome.ProposalStatus\n\t\terr error\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\treason: \"Foo\",\n\t\t\tstatus: gnome.StatusDismissed,\n\t\t},\n\t\t{\n\t\t\tname: \"empty reason\",\n\t\t\terr: gnome.ErrReasonRequired,\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tproposal := mustCreateProposal(t, testStrategy{})\n\n\t\t\t// Act\n\t\t\terr := proposal.Dismiss(tc.reason)\n\n\t\t\t// Assert\n\t\t\tif tc.err != nil {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tassertNoError(t, err)\n\n\t\t\tif got := proposal.Status(); got != tc.status {\n\t\t\t\tt.Fatalf(\"expected status: %s, got: %s\", tc.status.String(), got.String())\n\t\t\t}\n\n\t\t\tif got := proposal.StatusReason(); got != tc.reason {\n\t\t\t\tt.Fatalf(\"expected dismiss reason: '%s', got: '%s'\", tc.reason, got)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestProposalActivate(t *testing.T) {\n\tcases := []struct {\n\t\tname string\n\t\tstatus gnome.ProposalStatus\n\t\tsetup func(*gnome.Proposal)\n\t\terr error\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\tstatus: gnome.StatusActive,\n\t\t},\n\t\t{\n\t\t\tname: \"review status required\",\n\t\t\tsetup: func(p *gnome.Proposal) {\n\t\t\t\tp.Activate()\n\t\t\t},\n\t\t\terr: gnome.ErrReviewStatusRequired,\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tproposal := mustCreateProposal(t, testStrategy{}, gnome.WithReviewDeadline(futureTime))\n\n\t\t\tif tc.setup != nil {\n\t\t\t\ttc.setup(proposal)\n\t\t\t}\n\n\t\t\t// Act\n\t\t\terr := proposal.Activate()\n\n\t\t\t// Assert\n\t\t\tif tc.err != nil {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tassertNoError(t, err)\n\n\t\t\tif got := proposal.Status(); got != tc.status {\n\t\t\t\tt.Fatalf(\"expected status: %s, got: %s\", tc.status.String(), got.String())\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestProposalPromote(t *testing.T) {\n\tstrategy := testStrategy{}\n\taddr := testutils.TestAddress(\"proposer\")\n\tcases := []struct {\n\t\tname string\n\t\tdaoNames []string\n\t\tsetup func() (*gnome.Proposal, *gnome.DAO)\n\t\terr error\n\t}{\n\t\t{\n\t\t\tname: \"promote to parent\",\n\t\t\tdaoNames: []string{\"child\", \"parent\"},\n\t\t\tsetup: func() (*gnome.Proposal, *gnome.DAO) {\n\t\t\t\tchild := gnome.MustNew(\"child\", \"Child\")\n\t\t\t\tparent := gnome.MustNew(\"parent\", \"Parent\", gnome.WithSubDAO(child))\n\t\t\t\tp, _ := gnome.NewProposal(1, strategy, addr, child, \"Title\")\n\t\t\t\treturn p, parent\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"promote to root\",\n\t\t\tdaoNames: []string{\"child\", \"root\"},\n\t\t\tsetup: func() (*gnome.Proposal, *gnome.DAO) {\n\t\t\t\tchild := gnome.MustNew(\"child\", \"Child\")\n\t\t\t\troot := gnome.MustNew(\"root\", \"Root\", gnome.WithSubDAO(\n\t\t\t\t\tgnome.MustNew(\"parent\", \"Parent\", gnome.WithSubDAO(child)),\n\t\t\t\t))\n\t\t\t\tp, _ := gnome.NewProposal(1, strategy, addr, child, \"Title\")\n\t\t\t\treturn p, root\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"promote to non parent\",\n\t\t\tsetup: func() (*gnome.Proposal, *gnome.DAO) {\n\t\t\t\tchild := gnome.MustNew(\"child\", \"Child\")\n\t\t\t\tgnome.MustNew(\"parent\", \"Parent\", gnome.WithSubDAO(child))\n\t\t\t\tp, _ := gnome.NewProposal(1, strategy, addr, child, \"Title\")\n\t\t\t\treturn p, gnome.MustNew(\"foo\", \"Foo\")\n\t\t\t},\n\t\t\terr: gnome.ErrProposalPromote,\n\t\t},\n\t\t{\n\t\t\tname: \"promote with one promotion\",\n\t\t\tdaoNames: []string{\"child\", \"parent\", \"root\"},\n\t\t\tsetup: func() (*gnome.Proposal, *gnome.DAO) {\n\t\t\t\tchild := gnome.MustNew(\"child\", \"Child\")\n\t\t\t\tparent := gnome.MustNew(\"parent\", \"Parent\", gnome.WithSubDAO(child))\n\t\t\t\troot := gnome.MustNew(\"root\", \"Root\", gnome.WithSubDAO(parent))\n\t\t\t\tp, _ := gnome.NewProposal(1, strategy, addr, child, \"Title\")\n\t\t\t\tp.Promote(parent)\n\t\t\t\treturn p, root\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tp, dao := tc.setup()\n\n\t\t\tdeadline := time.Now().Add(-time.Hour * 24)\n\t\t\tp.votingDeadline = deadline // Change deadline to check that its resetted on promote\n\n\t\t\tp.VotingRecord().Add(gnome.Vote{}) // Add a single dummy vote for the current DAO\n\n\t\t\t// Act\n\t\t\terr := p.Promote(dao)\n\n\t\t\t// Assert\n\t\t\tif tc.err != nil {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tassertNoError(t, err)\n\n\t\t\tif !p.HasBeenPromoted() {\n\t\t\t\tt.Fatal(\"expected proposal to be promotedt\")\n\t\t\t}\n\n\t\t\tif !p.HasPromotion(dao.Path()) {\n\t\t\t\tt.Fatal(\"expected proposal promotions to include the DAO\")\n\t\t\t}\n\n\t\t\tif got := p.VotingDeadline(); !got.After(deadline) {\n\t\t\t\tt.Fatalf(\"expected voting deadline to be greater than original deadline: %d, got: %d\", deadline.Unix(), got.Unix())\n\t\t\t}\n\n\t\t\tif p.VotingRecord().VoteCount() != 0 {\n\t\t\t\tt.Fatal(\"expected the voting record to be empty\")\n\t\t\t}\n\n\t\t\tpromotions := p.Promotions()\n\t\t\tif c := len(promotions); c != len(tc.daoNames) {\n\t\t\t\tt.Fatalf(\"expected promotions count: %d, got: %d DAOs\", len(tc.daoNames), c)\n\t\t\t}\n\n\t\t\tfor i, dao := range promotions {\n\t\t\t\tif got := dao.Name(); tc.daoNames[i] != got {\n\t\t\t\t\tt.Fatalf(\"expected DAO name: '%s', got: '%s'\", tc.daoNames[i], got)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestProposalVote(t *testing.T) {\n\tmemberAddr := testutils.TestAddress(\"member\")\n\tsetupDAOMember := func(p *gnome.Proposal) {\n\t\tp.DAO().AddMember(gnome.NewMember(memberAddr))\n\t}\n\n\tcases := []struct {\n\t\tname, reason string\n\t\taddress std.Address\n\t\tchoice gnome.VoteChoice\n\t\tvoteCount int\n\t\toptions []gnome.ProposalOption\n\t\tsetup func(*gnome.Proposal)\n\t\terr error\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\taddress: memberAddr,\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t\tvoteCount: 1,\n\t\t\tsetup: setupDAOMember,\n\t\t},\n\t\t{\n\t\t\tname: \"proposal not active\",\n\t\t\taddress: memberAddr,\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t\toptions: []gnome.ProposalOption{\n\t\t\t\tgnome.WithReviewDeadline(futureTime),\n\t\t\t},\n\t\t\terr: gnome.ErrProposalNotActive,\n\t\t\tsetup: func(p *gnome.Proposal) {\n\t\t\t\tsetupDAOMember(p)\n\t\t\t\tp.Withdraw()\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"vote with invalid reason\",\n\t\t\taddress: memberAddr,\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t\treason: \"1234\",\n\t\t\terr: gnome.ErrInvalidReason,\n\t\t\tsetup: setupDAOMember,\n\t\t},\n\t\t{\n\t\t\tname: \"already voted\",\n\t\t\taddress: memberAddr,\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t\tvoteCount: 1,\n\t\t\toptions: []gnome.ProposalOption{\n\t\t\t\tgnome.WithVoteChangeDuration(-1),\n\t\t\t},\n\t\t\terr: gnome.ErrAlreadyVoted,\n\t\t\tsetup: func(p *gnome.Proposal) {\n\t\t\t\tsetupDAOMember(p)\n\t\t\t\tp.Vote(memberAddr, gnome.ChoiceYes, \"\")\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"vote after proposal deadline\",\n\t\t\taddress: memberAddr,\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t\toptions: []gnome.ProposalOption{\n\t\t\t\tgnome.WithVotingDeadline(zeroTime),\n\t\t\t},\n\t\t\terr: gnome.ErrProposalVotingDeadlineMet,\n\t\t\tsetup: setupDAOMember,\n\t\t},\n\t\t{\n\t\t\tname: \"non member vote not allowed\",\n\t\t\taddress: memberAddr,\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t\terr: gnome.ErrMemberVoteNotAllowed,\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tproposal := mustCreateProposal(t, testStrategy{}, tc.options...)\n\n\t\t\tif tc.setup != nil {\n\t\t\t\ttc.setup(proposal)\n\t\t\t}\n\n\t\t\t// Act\n\t\t\terr := proposal.Vote(tc.address, tc.choice, tc.reason)\n\n\t\t\t// Assert\n\t\t\tif tc.err != nil {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t} else {\n\t\t\t\tassertNoError(t, err)\n\t\t\t}\n\n\t\t\tvotes := proposal.Votes()\n\t\t\tvoteCount := len(votes)\n\t\t\tif voteCount != tc.voteCount {\n\t\t\t\tt.Fatalf(\"expected %d vote(s), got: %d\", tc.voteCount, voteCount)\n\t\t\t}\n\n\t\t\tif voteCount \u003e 0 {\n\t\t\t\tif got := votes[0].Address; got != tc.address {\n\t\t\t\t\tt.Fatalf(\"expected vote address: '%s', got: '%s'\", tc.address, got)\n\t\t\t\t}\n\n\t\t\t\tif got := votes[0].Choice; got != tc.choice {\n\t\t\t\t\tt.Fatalf(\"expected vote choice: '%s', got: '%s'\", tc.choice, got)\n\t\t\t\t}\n\n\t\t\t\tif got := votes[0].Reason; got != tc.reason {\n\t\t\t\t\tt.Fatalf(\"expected vote reason: '%s', got: '%s'\", tc.reason, got)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestProposalTally(t *testing.T) {\n\taddresses := [3]std.Address{\n\t\ttestutils.TestAddress(\"member1\"),\n\t\ttestutils.TestAddress(\"member2\"),\n\t\ttestutils.TestAddress(\"member3\"),\n\t}\n\tsetupDAOMembers := func(p *gnome.Proposal) {\n\t\tdao := p.DAO()\n\t\tfor _, addr := range addresses {\n\t\t\tdao.AddMember(gnome.NewMember(addr))\n\t\t}\n\t}\n\n\tcases := []struct {\n\t\tname string\n\t\tvotes []gnome.Vote\n\t\tchoice gnome.VoteChoice\n\t\tstrategy gnome.ProposalStrategy\n\t\tstatus gnome.ProposalStatus\n\t\tstatusReason string\n\t\tvotingDeadlinePassed bool\n\t\toptions []gnome.ProposalOption\n\t\tsetup func(*gnome.Proposal)\n\t\terr error\n\t}{\n\t\t{\n\t\t\tname: \"proposal pass\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Address: addresses[0], Choice: gnome.ChoiceYes},\n\t\t\t\t{Address: addresses[1], Choice: gnome.ChoiceYes},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t\tstrategy: testStrategy{gnome.ChoiceYes},\n\t\t\tstatus: gnome.StatusPassed,\n\t\t\toptions: []gnome.ProposalOption{gnome.WithVotingDeadline(zeroTime)},\n\t\t\tsetup: setupDAOMembers,\n\t\t},\n\t\t{\n\t\t\tname: \"proposal rejected\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Address: addresses[0], Choice: gnome.ChoiceYes},\n\t\t\t\t{Address: addresses[1], Choice: gnome.ChoiceNo},\n\t\t\t\t{Address: addresses[2], Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNo,\n\t\t\tstrategy: testStrategy{gnome.ChoiceNo},\n\t\t\tstatus: gnome.StatusRejected,\n\t\t\toptions: []gnome.ProposalOption{gnome.WithVotingDeadline(zeroTime)},\n\t\t\tsetup: setupDAOMembers,\n\t\t},\n\t\t{\n\t\t\tname: \"no quorum\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Address: addresses[0], Choice: gnome.ChoiceYes},\n\t\t\t},\n\t\t\tstrategy: testStrategy{},\n\t\t\tstatus: gnome.StatusRejected,\n\t\t\tstatusReason: \"low participation\",\n\t\t\toptions: []gnome.ProposalOption{gnome.WithVotingDeadline(zeroTime)},\n\t\t\tsetup: setupDAOMembers,\n\t\t},\n\t\t{\n\t\t\tname: \"proposal not active\",\n\t\t\tstatus: gnome.StatusWithdrawed,\n\t\t\toptions: []gnome.ProposalOption{gnome.WithReviewDeadline(futureTime)},\n\t\t\tstrategy: testStrategy{},\n\t\t\tsetup: func(p *gnome.Proposal) {\n\t\t\t\tp.Withdraw()\n\t\t\t},\n\t\t\terr: gnome.ErrProposalNotActive,\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tproposal := mustCreateProposal(t, tc.strategy, tc.options...)\n\n\t\t\tfor _, v := range tc.votes {\n\t\t\t\t// Add votes directly to the record because deadline might be expired for some test cases\n\t\t\t\tproposal.VotingRecord().Add(v)\n\t\t\t}\n\n\t\t\tif tc.setup != nil {\n\t\t\t\ttc.setup(proposal)\n\t\t\t}\n\n\t\t\t// Act\n\t\t\terr := proposal.Tally()\n\n\t\t\t// Assert\n\t\t\tif tc.err != nil {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t} else {\n\t\t\t\tassertNoError(t, err)\n\t\t\t}\n\n\t\t\tif got := proposal.Status(); got != tc.status {\n\t\t\t\tt.Fatalf(\"expected status: %d, got: %d\", tc.status, got)\n\t\t\t}\n\n\t\t\tif got := proposal.StatusReason(); got != tc.statusReason {\n\t\t\t\tt.Fatalf(\"expected status reason: '%s', got: '%s'\", tc.statusReason, got)\n\t\t\t}\n\n\t\t\tif got := proposal.Choice(); got != tc.choice {\n\t\t\t\tt.Fatalf(\"expected winner choice: '%s', got: '%s'\", tc.choice, got)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc mustCreateProposal(t *testing.T, s gnome.ProposalStrategy, options ...gnome.ProposalOption) *gnome.Proposal {\n\tt.Helper()\n\n\tdao := gnome.MustNew(\"test\", \"Test\")\n\taddr := testutils.TestAddress(\"proposer\")\n\tproposal, err := gnome.NewProposal(1, s, addr, dao, \"Title\", options...)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\treturn proposal\n}\n\nfunc assertError(t *testing.T, expected interface{}, actual error) {\n\tt.Helper()\n\n\twant, ok := expected.(string)\n\tif !ok {\n\t\tif err, ok := expected.(error); ok {\n\t\t\twant = err.Error()\n\t\t}\n\t}\n\n\tif actual == nil {\n\t\tt.Fatalf(\"expected error: '%s', got no error\", want)\n\t}\n\n\tif want != actual.Error() {\n\t\tt.Fatalf(\"expected error: '%s', got: '%s'\", want, actual.Error())\n\t}\n}\n\nfunc assertNoError(t *testing.T, err interface{}) {\n\tt.Helper()\n\n\tif err == nil {\n\t\treturn\n\t}\n\n\tactual, ok := err.(string)\n\tif !ok {\n\t\tif e, ok := err.(error); ok {\n\t\t\tactual = e.Error()\n\t\t}\n\t}\n\n\tif actual != \"\" {\n\t\tt.Fatalf(\"expected no error, got: '%s'\", actual)\n\t}\n}\n\ntype testStrategy struct {\n\tChoice gnome.VoteChoice\n}\n\nfunc (testStrategy) Name() string { return \"test\" }\nfunc (testStrategy) Quorum() float64 { return 0.51 }\nfunc (testStrategy) VotingPeriod() time.Duration { return time.Hour * 24 * 2 }\nfunc (s testStrategy) Tally(*gnome.DAO, gnome.VotingRecord) gnome.VoteChoice { return s.Choice }\n\nfunc (testStrategy) VoteChoices() []gnome.VoteChoice {\n\treturn []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo}\n}\n"},{"name":"record.gno","body":"package dao\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/avl\"\n)\n\n// VotingRecordIterFn defines the a callback to iterate voting choices.\ntype VotingRecordIterFn func(_ VoteChoice, voteCount uint) bool\n\n// NewVotingRecord creates a new voting record.\nfunc NewVotingRecord() *VotingRecord {\n\treturn \u0026VotingRecord{}\n}\n\n// VotingRecord mamages votes and vote count.\ntype VotingRecord struct {\n\tvotes []Vote\n\tcounter avl.Tree // VoteChoice -\u003e count (uint)\n}\n\n// Votes return the list of votes.\nfunc (r VotingRecord) Votes() []Vote {\n\treturn r.votes\n}\n\n// VoteCount returns the number of votes.\nfunc (r VotingRecord) VoteCount() int {\n\treturn len(r.votes)\n}\n\n// Get returns the number of votes for vote choice.\nfunc (r VotingRecord) Get(c VoteChoice) uint {\n\tkey := string(c)\n\tif v, ok := r.counter.Get(key); ok {\n\t\treturn v.(uint)\n\t}\n\treturn 0\n}\n\n// Add adds a vote to the record.\nfunc (r *VotingRecord) Add(v Vote) {\n\tr.votes = append(r.votes, v)\n\tkey := string(v.Choice)\n\tr.counter.Set(key, r.Get(v.Choice)+1)\n}\n\n// Remove removes a vote from the record.\nfunc (r *VotingRecord) Remove(addr std.Address) bool {\n\tfor i, v := range r.votes {\n\t\tif v.Address == addr {\n\t\t\tr.votes = append(r.votes[:i], r.votes[i+1:]...)\n\t\t\tkey := string(v.Choice)\n\t\t\tr.counter.Set(key, r.Get(v.Choice)-1)\n\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// Iterate iterates all vote choices.\nfunc (r VotingRecord) Iterate(fn VotingRecordIterFn) bool {\n\treturn r.counter.Iterate(\"\", \"\", func(key string, value interface{}) bool {\n\t\tchoice := VoteChoice(key)\n\t\treturn fn(choice, value.(uint))\n\t})\n}\n\n// SelectChoiceByMajority select the vote choice by majority.\n// Vote choice is a majority when chosen by more than half of the votes.\n// Majority type is defined by the caller depending on the vote records and abstentions, it would be\n// absolute majority if abstentions are considered, otherwise it would be considered simple majority.\nfunc SelectChoiceByMajority(r VotingRecord, abstentions int) (VoteChoice, bool) {\n\tvotesCount := r.VoteCount() + abstentions\n\tchoice := getMajorityChoice(r)\n\tisMajority := r.Get(choice) \u003e uint(votesCount/2)\n\treturn choice, isMajority\n}\n\n// SelectChoiceBySuperMajority select the vote choice by super majority using a 2/3s threshold.\n// Abstentions are not considered when calculating the super majority choice.\nfunc SelectChoiceBySuperMajority(r VotingRecord) (VoteChoice, bool) {\n\tchoice := getMajorityChoice(r)\n\tisMajority := r.Get(choice) \u003e uint((2*r.VoteCount())/3) // TODO: Allow threshold customization\n\treturn choice, isMajority\n}\n\n// SelectChoiceByPlurality selects the vote choice by plurality.\n// The choice will be considered a majority if it has votes and if there is no other\n// choice with the same number of votes. A tie won't be considered majority.\nfunc SelectChoiceByPlurality(r VotingRecord) (VoteChoice, bool) {\n\tvar (\n\t\tchoice VoteChoice\n\t\tcurrentCount uint\n\t\tisMajority bool\n\t)\n\n\tr.Iterate(func(c VoteChoice, count uint) bool {\n\t\tif currentCount \u003c count {\n\t\t\tchoice = c\n\t\t\tcurrentCount = count\n\t\t\tisMajority = true\n\t\t} else if currentCount == count {\n\t\t\tisMajority = false\n\t\t}\n\t\treturn false\n\t})\n\treturn choice, isMajority\n}\n\n// getMajorityChoice returns the choice voted by the majority.\n// The result is only valid when there is a majority.\n// Caller must validate that the returned choice represents a majority.\nfunc getMajorityChoice(r VotingRecord) VoteChoice {\n\tvar (\n\t\tchoice VoteChoice\n\t\tcurrentCount uint\n\t)\n\n\tr.Iterate(func(c VoteChoice, count uint) bool {\n\t\tif currentCount \u003c count {\n\t\t\tchoice = c\n\t\t\tcurrentCount = count\n\t\t}\n\t\treturn false\n\t})\n\n\treturn choice\n}\n"},{"name":"record_test.gno","body":"package dao\n\nimport (\n\t\"testing\"\n\n\tgnome \"gno.land/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao\"\n)\n\nfunc TestVotingRecord(t *testing.T) {\n\t// Act\n\trecord := NewVotingRecord()\n\n\t// Assert\n\tif got := record.Votes(); got != nil {\n\t\tt.Fatalf(\"expected no votes, got: %d\", len(got))\n\t}\n\n\tif got := record.VoteCount(); got != 0 {\n\t\tt.Fatalf(\"expected no vote count: 0, got: %d\", got)\n\t}\n}\n\nfunc TestVotingRecordAdd(t *testing.T) {\n\t// Arrange\n\trecord := NewVotingRecord()\n\tvote := gnome.Vote{Choice: gnome.ChoiceYes}\n\n\t// Act\n\trecord.Add(vote)\n\n\t// Assert\n\tvotes := record.Votes()\n\tif c := len(votes); c != 1 {\n\t\tt.Fatalf(\"expected one votes, got: %d\", c)\n\t}\n\n\tif got := votes[0]; got != vote {\n\t\tt.Fatalf(\"expected vote: %v, got: %v\", vote, got)\n\t}\n\n\tif got := record.VoteCount(); got != 1 {\n\t\tt.Fatalf(\"expected vote count: %d, got: %d\", 1, got)\n\t}\n\n\tif got := record.Get(vote.Choice); got != 1 {\n\t\tt.Fatalf(\"expected record to get one '%v' count, got: %d\", gnome.ChoiceYes, got)\n\t}\n\n\trecord.Iterate(func(v gnome.VoteChoice, count uint) bool {\n\t\tif v != gnome.ChoiceYes {\n\t\t\tt.Fatalf(\"expected iterate choice: %v, got: %v\", gnome.ChoiceYes, v)\n\t\t}\n\n\t\tif count != 1 {\n\t\t\tt.Fatalf(\"expected iterate vote count: %d, got: %d\", 1, count)\n\t\t}\n\n\t\treturn false\n\t})\n}\n\nfunc TestVotingRecordRemove(t *testing.T) {\n\tt.Skip(\"TODO: Write unit test for VotingRecord.Remove()\")\n}\n\nfunc TestSelectChoiceByMajority(t *testing.T) {\n\tt.Skip(\"TODO: Write unit test for SelectChoiceByMajority\")\n}\n\nfunc TestSelectChoiceBySuperMajority(t *testing.T) {\n\tt.Skip(\"TODO: Write unit test for SelectChoiceBySuperMajority\")\n}\n\nfunc TestSelectChoiceByPlurality(t *testing.T) {\n\tt.Skip(\"TODO: Write unit test for SelectChoiceByPlurality\")\n}\n"},{"name":"render.gno","body":"package dao\n\nimport (\n\t\"strings\"\n\n\t\"gno.land/p/demo/ufmt\"\n)\n\n// EscapeHTML escapes special characters like \"\u003c\" to become \"\u0026lt;\".\n// It escapes only five such characters: \u003c, \u003e, \u0026, ' and \".\nfunc EscapeHTML(s string) string {\n\ts = strings.ReplaceAll(s, `\u0026`, \"\u0026amp;\")\n\ts = strings.ReplaceAll(s, `\"`, \"\u0026#34;\")\n\ts = strings.ReplaceAll(s, `'`, \"\u0026#39;\")\n\ts = strings.ReplaceAll(s, `\u003c`, \"\u0026lt;\")\n\treturn strings.ReplaceAll(s, `\u003e`, \"\u0026gt;\")\n}\n\n// NewLink creates a new Markdown link.\nfunc NewLink(text, uri string) string {\n\treturn ufmt.Sprintf(\"[%s](%s)\", text, uri)\n}\n\n// NewLinkURI creates a new Markdown link where text and URI are the same.\nfunc NewLinkURI(uri string) string {\n\treturn ufmt.Sprintf(\"[%s](%s)\", uri, uri)\n}\n"},{"name":"strategy.gno","body":"package dao\n\nimport (\n\t\"std\"\n\t\"time\"\n)\n\ntype (\n\t// VoteChoiceRecord contains the number of counted votes for a single voting choice.\n\tVoteChoiceRecord struct {\n\t\tChoice VoteChoice\n\t\tCount uint\n\t}\n\n\t// ProposalStrategy defines the interface for the different proposal types.\n\tProposalStrategy interface {\n\t\t// Name returns the name of the strategy.\n\t\tName() string\n\n\t\t// Quorum returns the minimum required percentage of DAO member votes\n\t\t// required for a proposal to pass.\n\t\tQuorum() float64\n\n\t\t// VotingPeriod returns the period that a proposal should allow voting.\n\t\tVotingPeriod() time.Duration\n\n\t\t// VoteChoices returns the valid voting choices for the strategy.\n\t\tVoteChoices() []VoteChoice\n\n\t\t// Tally counts the votes and returns the winner voting choice.\n\t\t// The DAO argument is the DAO that the proposal is currently assigned to,\n\t\t// by default the one where the proposal was created.\n\t\t// Proposals can be promoted to parent DAOs in which case the DAO argument\n\t\t// is the DAO where the proposal was promoted the last time.\n\t\tTally(*DAO, VotingRecord) VoteChoice\n\t}\n)\n\n// VoteChecker defines an interface for proposal vote validation.\n// Proposal strategies that require checking votes when they are submitted should implement it.\ntype VoteChecker interface {\n\t// CheckVote checks that a vote is valid for the strategy.\n\tCheckVote(member std.Address, choice VoteChoice, reason string) error\n}\n\n// Executer defines an interface for executable proposals.\n// Proposals strategies that implement the interface can modify the DAO state when proposal passes.\ntype Executer interface {\n\t// Execute executes the proposal.\n\t// The DAO argument is the DAO where the proposal was created, even if the proposal has been promoted\n\t// to a parent DAO.\n\t// TODO: Execute should return some feedback on success\n\tExecute(*DAO) error\n}\n\n// Validator defines an interface for proposal validation.\n// Proposal strategies that implement the interface can validate that a proposal is valid for the current state.\ntype Validator interface {\n\t// Validate validates if a proposal is valid for the current state.\n\tValidate(*Proposal) error\n}\n\n// ParamsRenderer defines an interface to allow strategies to render its input parameters.\ntype ParamsRenderer interface {\n\t// RenderParams returns a markdown with the rendered strategy parameters.\n\tRenderParams() string\n}\n"},{"name":"uri.gno","body":"package dao\n\nimport (\n\t\"regexp\"\n\t\"strings\"\n)\n\nvar reSlug = regexp.MustCompile(\"^[a-zA-Z]+[a-zA-Z0-9-_]*$\")\n\n// IsSlug checks if a string is a valid slug.\nfunc IsSlug(s string) bool {\n\treturn reSlug.MatchString(s)\n}\n\n// SplitRealmURI splits a Gnoland URI into Realm URI and render path.\nfunc SplitRealmURI(uri string) (realmURI, renderPath string) {\n\tif uri == \"\" {\n\t\treturn\n\t}\n\n\tparts := strings.SplitN(uri, \":\", 2)\n\trealmURI = parts[0]\n\tif len(parts) \u003e 1 {\n\t\trenderPath = parts[1]\n\t}\n\treturn\n}\n\n// CutRealmDomain cuts out the Gnoland domain prefix from a URI.\nfunc CutRealmDomain(uri string) string {\n\trealmPath, _ := strings.CutPrefix(uri, \"gno.land\")\n\treturn realmPath\n}\n"},{"name":"uri_test.gno","body":"package dao\n\nimport (\n\t\"testing\"\n\n\tgnome \"gno.land/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao\"\n)\n\nfunc TestSplitRealmURI(t *testing.T) {\n\tcases := []struct {\n\t\tname, uri, realmURI, renderPath string\n\t}{\n\t\t{\n\t\t\tname: \"realm URI\",\n\t\t\turi: \"gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome\",\n\t\t\trealmURI: \"gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome\",\n\t\t},\n\t\t{\n\t\t\tname: \"realm URI with render path\",\n\t\t\turi: \"gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome:foo/bar\",\n\t\t\trealmURI: \"gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome\",\n\t\t\trenderPath: \"foo/bar\",\n\t\t},\n\t\t{\n\t\t\tname: \"realm URI with render path\",\n\t\t\turi: \"gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome:foo/bar\",\n\t\t\trealmURI: \"gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome\",\n\t\t\trenderPath: \"foo/bar\",\n\t\t},\n\t\t{\n\t\t\tname: \"empty URI\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Act\n\t\t\trealmURI, renderPath := gnome.SplitRealmURI(tc.uri)\n\n\t\t\t// Assert\n\t\t\tif realmURI != tc.realmURI {\n\t\t\t\tt.Fatalf(\"expected realm URI: '%s', got: '%s'\", tc.realmURI, realmURI)\n\t\t\t}\n\n\t\t\tif renderPath != tc.renderPath {\n\t\t\t\tt.Fatalf(\"expected render path: '%s', got: '%s'\", tc.renderPath, renderPath)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestCutRealmDomain(t *testing.T) {\n\tcases := []struct {\n\t\tname, uri, path string\n\t}{\n\t\t{\n\t\t\tname: \"with domain\",\n\t\t\turi: \"gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome\",\n\t\t\tpath: \"/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome\",\n\t\t},\n\t\t{\n\t\t\tname: \"without domain\",\n\t\t\turi: \"/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome\",\n\t\t\tpath: \"/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome\",\n\t\t},\n\t\t{\n\t\t\tname: \"empty\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Act\n\t\t\tpath := gnome.CutRealmDomain(tc.uri)\n\n\t\t\t// Assert\n\t\t\tif path != tc.path {\n\t\t\t\tt.Fatalf(\"expected path: '%s', got: '%s'\", tc.path, path)\n\t\t\t}\n\t\t})\n\t}\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"16000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"Aqb1P3atywV+LA8m9I9U123x+ei/pEFwPEA2knB2ZlxwVQqeKqFDOI8FeruWgP5Za+2t5/LRja9lCIiHPXWuTg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"gnome","path":"gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1","files":[{"name":"LICENSE","body":"Copyright (c) 2024. All rights reserved.\n\nProject Owner:\nNewTendermint, LLC\n\nProject Maintainer:\nİlker Göktuğ ÖZTÜRK. \u003cilker@ilgooz.com\u003e, \u003cilkergoktugozturk@gmail.com\u003e\n\nYour access to this Project and your contributions to this Project are subject\nto the following terms:\n\n* You hereby grant to the listed Owner and Maintainer of this Project the\nworldwide, irrevocable and royalty-free right to use, publish, relicense and\nsublicense your contributions under any non-exclusive license of their\nchoosing for commercial and non-commercial purposes.\n* You shall not attempt to bring any intellectual property infringement or\nmisappropriation claims against the Owner or Maintainer of this Project\nrelating to or arising from your contributions.\n* You represent that you are the sole owner of all rights in your\ncontributions and that no third party has any rights or interests therein.\n\nFOR THE SCOPE OF THIS LICENSE, A CONTRIBUTION IS DEFINED TO INCLUDE ANY WORKS,\nIDEAS, CODE, PROCESSES, OR APIS MADE AVAILABLE TO VIEW BY THE GENERAL PUBLIC\n(INCLUDING ANY PUBLICLY ACCESSIBLE INTERNET FORUMS AND CHAT SERVERS WHERE\nACCESS IS AVAILABLE FOR FREE WITH REGISTRATION) OR PRIVATELY TO THIS PROJECT'S\nOWNER AND MAINTAINERS; INCLUDING WORKS, IDEAS, CODE, PROCESSES, AND APIS THAT\nARE ABOUT THIS PROJECT AND ITS CONTRIBUTIONS, OR MENTIONED IN REFERENCE TO\nTHIS PROJECT, WHERE SUCH WORKS, IDEAS, CODE, PROCESSES, AND APIS ARE MATERIAL\nTO THE SUCCESS, IMPROVEMENT, OR COMPLETION OF THIS PROJECT, AS DETERMINED BY\nTHE OWNER OF THIS PROJECT.\n\nContributions may come in any form, and include (but are not limited to):\n\n* pull requests\n* diff patches\n* commentary\n* example code\n\nIf you do not want your contribution to become incorporated into this Project,\ndo not make contributions to this Project. The creation of contributions that\nmay in the future become known to this Project's Owner and Maintainer\nconstitutes a willing contribution to this Project in accordance with this\nlicense.\n\nTHIS PROJECT AND THE WORKS AVAILABLE THROUGH THIS PROJECT ARE PROVIDED “AS IS”\nAND WITHOUT WARRANTY OF ANY KIND. IN NO EVENT SHALL THE OWNER OR MAINTAINER OF\nTHIS PROJECT BE LIABLE TO YOU OR ANY THIRD PARTY FOR ANY CLAIM, DAMAGES OR\nOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THIS PROJECT OR THE WORKS AVAILABLE THROUGH\nTHIS PROJECT. YOU AGREED TO INDEMNIFY, DEFEND AND HOLD THE OWNER AND\nMAINTAINER FROM AND AGAINST ANY CLAIMS, LOSSES OR DAMAGES ARISING FROM YOUR\nUSE OF THIS PROJECT OR THE WORKS AVAILABLE THROUGH THIS PROJECT.\n\nThis license is subject to change at any time by the Project Owner or\nMaintainer.\n\nYour continued access to or use of this Project or any works\navailable through this Project shall be subject to the then-current version\nof this license.\n\nThe Project Owner and Maintainer reserve the right to change this license\nwithout needing the consent of the contributors to this Project.\n"},{"name":"gnome.gno","body":"package gnome\n\nimport (\n\t\"std\"\n\t\"strings\"\n\t\"time\"\n\n\tgnome \"gno.land/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao\"\n)\n\nconst (\n\t// Names of the initial DAOs.\n\tnameCouncilDAO = \"council\"\n\tnameMainDAO = \"main\"\n\n\t// Minimum number of members per DAO.\n\t// This requirement is enforced because two members DAO can only use plurality to tally.\n\tminMembersCount = 3\n\n\t// Review deadline defines the time after which a proposal can't be withdrawed by the proposer.\n\t// Proposal can only be voted on after this deadline but not before.\n\t// This greace period gives the proposer the chance to withdraw a proposal if there is a mistake.\n\treviewDeadline = time.Second\n)\n\n// Member roles\n// TODO: Define the list of Gnome DAO roles\nconst (\n\tRoleDirector gnome.Role = \"director\"\n\tRoleEcoDev gnome.Role = \"eco-dev\"\n\tRoleDev gnome.Role = \"dev\"\n\tRoleRealm gnome.Role = \"realm\"\n)\n\n// The \"Gno.me\" DAO defines an initial root DAO with a single sub DAO, where the root is\n// the council DAO and the child is the main DAO. Council DAO members are hard coded and\n// can't be modified. Main DAO members can be modified anytime though a modify DAO members\n// proposals.\n//\n// The main DAO must have a minimum of three members at all time to be able to apply 2/3s\n// voting majority criteria required for some proposal types allowed for the main DAO.\n//\n// Sub DAOs can be created though sub DAO add proposals but its members can't be modified\n// once the sub DAO is created. Sub DAOs must be dismissed though a proposal and a new sub\n// DAO must be created if its members must be modified.\nvar gnomeDAO = gnome.MustNew(\n\tnameCouncilDAO,\n\t\"Council\",\n\tgnome.WithManifest(\"Gnomes are thinking\"),\n\tgnome.AssignAsSuperCouncil(),\n\tgnome.WithMembers(\n\t\tgnome.NewMember(\"g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun\"),\n\t\tgnome.NewMember(\"g125t352u4pmdrr57emc4pe04y40sknr5ztng5mt\"),\n\t\tgnome.NewMember(\"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5\"),\n\t),\n\tgnome.WithSubDAO(\n\t\tgnome.MustNew(\n\t\t\tnameMainDAO,\n\t\t\t\"Main\",\n\t\t\tgnome.WithManifest(\"Gnomes are building\"),\n\t\t\tgnome.WithMembers(\n\t\t\t\tgnome.NewMember(\"g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun\", RoleDev),\n\t\t\t\tgnome.NewMember(\"g125t352u4pmdrr57emc4pe04y40sknr5ztng5mt\", RoleDev),\n\t\t\t\tgnome.NewMember(\"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5\", RoleEcoDev),\n\t\t\t),\n\t\t),\n\t),\n)\n\n// SubmitProposal submits a new proposal.\n//\n// This function allows other realms to submit custom proposal types.\n// Realms must have a DAO assigned to their address to be able to create proposals in the assigned\n// DAO or any of its sub DAOs.\n//\n// Parameters:\n// - title: A title for the proposal (required)\n// - description: A description of the proposal\n// - strategy: A strategy for the new proposal (required)\n// - daoPath: Path of the DAO where the proposal should be created (required)\n//\n// The DAO where the proposal is created is by default the DAO assigned to the caller realm address.\nfunc SubmitProposal(title, description string, s gnome.ProposalStrategy, daoPath string) gnome.ID {\n\tassertDAOIsNotLocked()\n\n\tdao := mustGetDAO(daoPath)\n\tassertDAOIsNotDismissed(dao)\n\n\tcaller := std.GetOrigCaller()\n\tassertCanCreateProposal(caller, dao)\n\n\tid := genProposalID()\n\tp, err := gnome.NewProposal(id, s, caller, dao, title, gnome.WithDescription(description))\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tif err := p.Validate(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tproposals.Index(p)\n\treturn p.ID()\n}\n\n// SubmitGeneralProposal submits a new general proposal.\n//\n// Proposal requires a 51% quorum, otherwise the outcome will be low participation.\n// Tally is done by absolute majority, so all abstentions are considered.\n// Default voting period is 2 days but can optionally go up to 10 days.\n//\n// Parameters:\n// - proposalTitle: A title for the proposal (required)\n// - proposalDescription: A description of the proposal (required)\n// - daoPath: Path of the DAO where the proposal should be created (required)\n// - votingDeadline: Number of days until the voting period ends (default: 2)\n//\n// The name of the DAO where the proposal is created is a slug, where \"council\"\n// is the Council DAO and \"main\" is the name of the Main DAO.\n//\n// The voting period deadline for the proposal must be between 2 and 10 days.\n// It defaults to 2 days when `votingDeadline` value is 0.\nfunc SubmitGeneralProposal(\n\tproposalTitle,\n\tproposalDescription,\n\tdaoPath string,\n\tvotingDeadline uint,\n) uint64 {\n\tassertDAOIsNotLocked()\n\n\topts := []gnome.ProposalOption{\n\t\tgnome.WithDescription(proposalDescription),\n\t\tgnome.WithReviewDeadline(time.Now().Add(reviewDeadline)),\n\t}\n\n\tif votingDeadline != 0 {\n\t\tif votingDeadline \u003c 2 || votingDeadline \u003e 10 {\n\t\t\tpanic(\"voting period deadline must be between 2 and 10 days\")\n\t\t}\n\n\t\tdeadline := time.Now().Add(time.Hour * 24 * time.Duration(votingDeadline))\n\t\topts = append(opts, gnome.WithVotingDeadline(deadline))\n\t}\n\n\tdao := mustGetDAO(daoPath)\n\tassertDAOIsNotDismissed(dao)\n\n\tcaller := std.GetOrigCaller()\n\tassertCanCreateProposal(caller, dao)\n\n\tp, err := gnome.NewProposal(genProposalID(), newGeneralStrategy(), caller, dao, proposalTitle, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tif err := p.Validate(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tproposals.Index(p)\n\tAdvanceProposals()\n\n\treturn uint64(p.ID())\n}\n\n// SubmitSubDAOCreationProposal submits a new proposal to add a sub DAO to an existing DAO.\n//\n// Proposal requires the participation of all DAO members, otherwise the outcome will be low participation.\n// Default voting period is 7 days.\n//\n// Parameters:\n// - proposalTitle: A title for the proposal (required)\n// - proposalDescription: A description of the proposal\n// - parentDAOPath: Path of the sub DAO's parent (required)\n// - subDAOName: Slug name of the new sub DAO (required)\n// - subDAOTitle: A title for the new sub DAO (required)\n// - subDAOManifest: Sub DAO manifest (required)\n// - subDAOMembers: List of sub DAO member addresses (required)\n//\n// Sub DAO name must be a slug allows letters from \"a\" to \"z\", numbers, \"-\" and \"_\" as valid characters.\n//\n// The list of sub DAO members must be a newline separated list of addresses, with a minimum of 2 addresses.\n// Each line must contain an address and optionally be followed by one or more DAO member roles:\n// ```\n// g187982000zsc493znqt828s90cmp6hcp2erhu6m foo\n// g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5 bar foo\n// ```\nfunc SubmitSubDAOCreationProposal(\n\tproposalTitle,\n\tproposalDescription,\n\tparentDAOPath,\n\tsubDAOName,\n\tsubDAOTitle,\n\tsubDAOManifest,\n\tsubDAOMembers string,\n) uint64 {\n\tassertDAOIsNotLocked()\n\n\tdao := mustGetDAO(parentDAOPath)\n\tassertDAOIsNotDismissed(dao)\n\n\tsubDAOPath := dao.Path() + gnome.PathSeparator + subDAOName\n\tif daos.HasPathKey(subDAOPath) {\n\t\tpanic(\"sub DAO name is already taken by another DAO\")\n\t}\n\n\tcaller := std.GetOrigCaller()\n\tassertCanCreateProposal(caller, dao)\n\n\tmembers := gnome.MustParseStringToMembers(subDAOMembers)\n\tassertMemberRolesExist(members)\n\n\tstrategy := newSubDAOCreationStrategy(daos, subDAOName, subDAOTitle, subDAOManifest, members)\n\tp, err := gnome.NewProposal(\n\t\tgenProposalID(),\n\t\tstrategy,\n\t\tcaller,\n\t\tdao,\n\t\tproposalTitle,\n\t\tgnome.WithDescription(proposalDescription),\n\t\tgnome.WithReviewDeadline(time.Now().Add(reviewDeadline)),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tif err := p.Validate(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tproposals.Index(p)\n\tAdvanceProposals()\n\n\treturn uint64(p.ID())\n}\n\n// SubmitSubDAODismissalProposal submits a new proposal to dismiss a sub DAO.\n//\n// Dismissing a sub DAO also dismisses all active proposals and any sub DAO below the dismissed DAO tree.\n// Only the direct parent of a DAO can create a proposal to dismiss any of its fist level sub DAOs.\n// Proposal requires a 51% quorum, otherwise the outcome will be low participation.\n// Tally is done by plurality.\n// Default voting period is 7 days.\n//\n// Parameters:\n// - proposalTitle: A title for the proposal (required)\n// - daoPath: Path of the DAO where the proposal should be created (required)\n// - subDAOName: Slug name of the sub DAO to dismiss (required)\nfunc SubmitSubDAODismissalProposal(proposalTitle, daoPath, subDAOName string) uint64 {\n\tassertDAOIsNotLocked()\n\n\tdao := mustGetDAO(daoPath)\n\tassertDAOIsNotDismissed(dao)\n\n\tsubDAOPath := dao.Path() + gnome.PathSeparator + subDAOName\n\tsubDAO := mustGetDAO(subDAOPath)\n\tassertDAOIsNotDismissed(subDAO)\n\n\tcaller := std.GetOrigCaller()\n\tstrategy := newSubDAODismissalStrategy(subDAO, proposals)\n\tp, err := gnome.NewProposal(\n\t\tgenProposalID(),\n\t\tstrategy,\n\t\tcaller,\n\t\tdao,\n\t\tproposalTitle,\n\t\tgnome.WithReviewDeadline(time.Now().Add(reviewDeadline)),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tif err := p.Validate(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tproposals.Index(p)\n\tAdvanceProposals()\n\n\treturn uint64(p.ID())\n}\n\n// SubmitDAOMembersModificationProposal submits a new proposal to modify the members of a DAO.\n//\n// Proposal requires a 51% quorum, otherwise the outcome will be low participation.\n// Tally is done by super majority with a 2/3s threshold. Abstentions are not considered.\n// Default voting period is 7 days.\n//\n// Parameters:\n// - proposalTitle: A title for the proposal (required)\n// - proposalDescription: A description of the proposal\n// - daoPath: Path of the DAO where the proposal should be created (required)\n// - newMembers: List of member addresses to add to Main DAO\n// - removeMembers: List of member addresses to remove from the Main DAO\n//\n// At leat one member address is required either to be added or removed from the DAO.\n// Members can be added and removed within the same proposal.\n//\n// Each list of members must be newline separated list of addresses.\n// Each line must contain an address and optionally be followed by one or more DAO member roles:\n// ```\n// g187982000zsc493znqt828s90cmp6hcp2erhu6m foo\n// g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5 bar foo\n// ```\nfunc SubmitDAOMembersModificationProposal(\n\tproposalTitle,\n\tproposalDescription,\n\tdaoPath,\n\tnewMembers,\n\tremoveMembers string,\n) uint64 {\n\tassertDAOIsNotLocked()\n\n\tdao := mustGetDAO(daoPath)\n\tassertDAOIsNotDismissed(dao)\n\n\tcaller := std.GetOrigCaller()\n\tassertCanCreateProposal(caller, dao)\n\n\tmembersToAdd := gnome.MustParseStringToMembers(newMembers)\n\tassertMemberRolesExist(membersToAdd)\n\tmembersToRemove := gnome.MustParseStringToMembers(removeMembers)\n\tassertMemberRolesExist(membersToRemove)\n\n\tstrategy := newDAOMembersModificationStrategy(membersToAdd, membersToRemove)\n\tp, err := gnome.NewProposal(\n\t\tgenProposalID(),\n\t\tstrategy,\n\t\tcaller,\n\t\tdao,\n\t\tproposalTitle,\n\t\tgnome.WithDescription(proposalDescription),\n\t\tgnome.WithReviewDeadline(time.Now().Add(reviewDeadline)),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tif err := p.Validate(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tproposals.Index(p)\n\tAdvanceProposals()\n\n\treturn uint64(p.ID())\n}\n\n// SubmitBudgetProposal submits a new budget proposal.\n//\n// Only membes of the Council or Main DAO can vote on this type of proposals.\n// Proposal requires a 51% quorum, otherwise the outcome will be low participation.\n// Tally is done by absolute majority, so all abstentions are considered.\n// Default voting period is 7 days.\n//\n// Parameters:\n// - proposalTitle: A title for the proposal (required)\n// - proposalDescription: A description of the proposal\n// - daoPath: Path of the DAO where the proposal should be created (required)\n// - budget: The proposal budget (required)\n//\n// Budget doesn't enforce any specific format right now but an example format that\n// could be used is amount plus symbol, for example 100UGNOT, 100000USD, etc.\nfunc SubmitBudgetProposal(\n\tproposalTitle,\n\tproposalDescription,\n\tdaoPath,\n\tbudget string,\n) uint64 {\n\tassertDAOIsNotLocked()\n\n\tdao := mustGetDAO(daoPath)\n\tassertDAOIsNotDismissed(dao)\n\n\tcaller := std.GetOrigCaller()\n\tassertCanCreateProposal(caller, dao)\n\n\tstrategy := newBudgetStrategy(gnomeDAO, budget)\n\tp, err := gnome.NewProposal(\n\t\tgenProposalID(),\n\t\tstrategy,\n\t\tcaller,\n\t\tdao,\n\t\tproposalTitle,\n\t\tgnome.WithDescription(proposalDescription),\n\t\tgnome.WithReviewDeadline(time.Now().Add(reviewDeadline)),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tif err := p.Validate(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tproposals.Index(p)\n\tAdvanceProposals()\n\n\treturn uint64(p.ID())\n}\n\n// WithdrawProposal withdraws a proposal.\n// Proposals can only be withdrawed by the account that creates it when the state is \"review\".\n// They can't be withdrawed once the review deadline of one hour after creation is met.\nfunc WithdrawProposal(proposalID uint64) string {\n\tassertDAOIsNotLocked()\n\n\tp := mustGetProposal(proposalID)\n\tassertCallerCanWithdraw(p)\n\n\tif err := p.Withdraw(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tAdvanceProposals()\n\n\treturn \"Proposal withdrawed\"\n}\n\n// Vote submits a vote for a proposal.\n//\n// Parameters:\n// - proposalID: ID of the proposal to vote (required)\n// - vote: Voting choice, true=Yes, false=No (required)\n// - reason: Text with the reason for the vote\n// - daoPath: Path of the DAO where the voting account belongs to\n//\n// Reason is in general optional but might be required for some proposals when voting No.\n//\n// DAO name is optional and by default is the one that the proposal belongs to.\n// Only parents of the proposal's DAO are allowed as `daoPath` values.\n// Child votes are not tallied when a member of a parent DAO votes on a child's proposal.\nfunc Vote(proposalID uint64, vote bool, reason, daoPath string) string {\n\tassertDAOIsNotLocked()\n\n\t// Make sure proposal states are up to date before submitting the vote\n\tAdvanceProposals()\n\n\t// Get proposal and check that current status accepts votes\n\tp := mustGetProposal(proposalID)\n\tif s := p.Status(); s.IsFinal() {\n\t\tpanic(\"proposal status doesn't allow new vote submissions: \" + s.String())\n\t}\n\n\t// When a DAO name is availalable check that it matches one of the proposal's DAO parents\n\t// and if so promote the proposal to a parent DAO. Promoting a proposal invalidates the votes\n\t// submitted by current DAO's members and moves voting responsibility to the parent DAO members.\n\tdaoPath = strings.TrimSpace(daoPath)\n\tif daoPath != \"\" \u0026\u0026 p.DAO().Path() != daoPath {\n\t\t// Check that the path belongs to a parent DAO.\n\t\t// Path separator is added to the prefix to make sure that similar prefixes don't match.\n\t\tif !strings.HasPrefix(p.DAO().Path(), daoPath+gnome.PathSeparator) {\n\t\t\tpanic(`path \"` + daoPath + `\" is not a parent of the proposal's DAO path`)\n\t\t}\n\n\t\t// Promote the active proposal's DAO to a parent DAO\n\t\tparentDAO := mustGetDAO(daoPath)\n\t\tif err := p.Promote(parentDAO); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\n\t\t// Reindex the proposal so its available under the parent DAO proposals. Child DAO will also\n\t\t// keep the promoted proposal indexed so it can be listed within the child DAO's proposals.\n\t\tproposals.Index(p)\n\t}\n\n\t// When proposal has \"review\" status check if deadline is met and if so activate it\n\tif p.Status() == gnome.StatusReview {\n\t\tif !p.HasReviewDeadlinePassed() {\n\t\t\tpanic(\"votes are not allowed until \" + p.ReviewDeadline().UTC().Format(\"2006-01-02 15:04 MST\"))\n\t\t}\n\n\t\tif err := p.Activate(); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t}\n\n\tvar choice gnome.VoteChoice\n\tif vote {\n\t\tchoice = gnome.ChoiceYes\n\t} else {\n\t\tchoice = gnome.ChoiceNo\n\t}\n\n\t// Submit vote\n\tcaller := std.GetOrigCaller() // TODO: Check that caller is member of the DAO\n\terr := p.Vote(caller, gnome.VoteChoice(choice), reason)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\treturn \"Vote submitted for proposal \" + makeProposalURI(gnome.ID(proposalID), false)\n}\n\n// AdvanceProposals iterates review and active proposals and tallies proposals that met their deadlines.\n// Proposals in review status are activated to allow voting.\n// Active proposals are tallied which means the number of votes is counted and status changed accordingly.\n// Active executable proposals are executed when the proposal status changes to \"passed\".\nfunc AdvanceProposals() string {\n\tassertDAOIsNotLocked()\n\n\tadvanceProposals()\n\n\treturn \"Proposals advanced for realm \" + makeRealmURL(\"\")\n}\n\n// IsProposalsAdvanceNeeded checks if a call to `AdvanceProposals()` is required to update proposals.\nfunc IsProposalsAdvanceNeeded() bool {\n\tif gnomeDAO.IsLocked() {\n\t\treturn false\n\t}\n\n\treturn proposals.ReverseIterate(func(p *gnome.Proposal) bool {\n\t\tswitch p.Status() {\n\t\tcase gnome.StatusReview:\n\t\t\tif p.HasReviewDeadlinePassed() {\n\t\t\t\treturn true\n\t\t\t}\n\t\tcase gnome.StatusActive:\n\t\t\tif p.HasVotingDeadlinePassed() {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t\treturn false\n\t})\n}\n\nfunc advanceProposals() {\n\t// TODO: Use unix timestamp as part of proposal IDs to avoid iterating older tallied proposals\n\tproposals.Iterate(func(p *gnome.Proposal) bool {\n\t\tstatus := p.Status()\n\t\tif status == gnome.StatusReview \u0026\u0026 p.HasReviewDeadlinePassed() {\n\t\t\tp.Activate()\n\t\t\tstatus = p.Status()\n\t\t}\n\n\t\tif p.Status() == gnome.StatusActive \u0026\u0026 p.HasVotingDeadlinePassed() {\n\t\t\tp.Tally()\n\n\t\t\t// Change proposal status to failed when execution fails\n\t\t\tif err := p.Execute(); gnome.IsExecutionError(err) {\n\t\t\t\tp.Fail(\"failed due to conflicts: \" + err.Error())\n\t\t\t}\n\t\t}\n\t\treturn false\n\t})\n}\n\nfunc mustGetDAO(path string) *gnome.DAO {\n\tif strings.TrimSpace(path) == \"\" {\n\t\tpanic(\"DAO path is empty\")\n\t}\n\n\tdao, found := daos.GetByPath(path)\n\tif !found {\n\t\tpanic(\"DAO not found\")\n\t}\n\treturn dao\n}\n\nfunc mustGetProposal(id uint64) *gnome.Proposal {\n\tp, found := proposals.GetByID(gnome.ID(id))\n\tif !found {\n\t\tpanic(\"proposal not found\")\n\t}\n\treturn p\n}\n\nfunc assertMemberRolesExist(members []gnome.Member) {\n\tfor _, m := range members {\n\t\tfor _, r := range m.Roles {\n\t\t\tif !roles.Has(r.String()) {\n\t\t\t\tpanic(\"unknown DAO member role: \" + gnome.EscapeHTML(string(r)))\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc assertCanCreateProposal(proposer std.Address, dao *gnome.DAO) {\n\tif !dao.HasMember(proposer) {\n\t\tpanic(\"you must be a DAO member to create a proposal\")\n\t}\n}\n\nfunc assertCallerCanWithdraw(p *gnome.Proposal) {\n\tif p.Proposer() != std.GetOrigCaller() {\n\t\tpanic(\"proposals can only be withdrawed by the proposer\")\n\t}\n\n\tif p.Status() != gnome.StatusReview {\n\t\tpanic(`proposals can only be withdrawed when status is \"review\"`)\n\t} else if p.HasReviewDeadlinePassed() {\n\t\tpanic(\"withdrawal not allowed, withdrawal deadline expired\")\n\t}\n}\n\nfunc assertDAOIsNotDismissed(dao *gnome.DAO) {\n\t// DAOs are locked when they are dismissed\n\tif dao.IsLocked() {\n\t\tpanic(\"DAO is dismissed: \" + dao.Path())\n\t}\n}\n"},{"name":"gnome_0a_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\tgnome \"gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1\"\n)\n\nconst member = std.Address(\"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl\")\n\nfunc init() {\n\tstd.TestSetOrigCaller(member)\n}\n\nfunc main() {\n\ttitle := \"Test proposal\"\n\tdesc := \"A test proposal\"\n\tdaoPath := \"council/main\"\n\tpID := gnome.SubmitGeneralProposal(title, desc, daoPath, 0)\n\tprintln(pID)\n\n\tmarkdown := gnome.Render(\"proposal/1\")\n\tprintln(markdown)\n}\n\n// Output:\n// 1\n// # #1 Test proposal\n// - Type: general\n// - Created: 2009-02-13 23:31 UTC\n// - Proposer: g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl\n// - Status: **review**\n// - Review Deadline: 2009-02-14 00:31 UTC\n// ## Description\n// A test proposal\n// ## Votes\n// The proposal has no votes\n"},{"name":"gnome_0b_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\tgnome \"gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1\"\n)\n\nconst nonMember = std.Address(\"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\")\n\nfunc init() {\n\tstd.TestSetOrigCaller(nonMember)\n}\n\nfunc main() {\n\ttitle := \"Test proposal\"\n\tdesc := \"A test proposal\"\n\tdaoPath := \"council/main\"\n\tgnome.SubmitGeneralProposal(title, desc, daoPath, 0)\n}\n\n// Error:\n// you must be a DAO member to create a proposal\n"},{"name":"gnome_0c_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\tgnome \"gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1\"\n)\n\nconst member = std.Address(\"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl\")\n\nfunc init() {\n\tstd.TestSetOrigCaller(member)\n}\n\nfunc main() {\n\ttitle := \"Test proposal\"\n\tdesc := \"A test proposal\"\n\tdaoPath := \"council/main\"\n\tgnome.SubmitGeneralProposal(title, desc, daoPath, 1)\n}\n\n// Error:\n// voting period deadline must be between 2 and 10 days\n"},{"name":"gnome_0d_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\tgnome \"gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1\"\n)\n\nconst member = std.Address(\"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl\")\n\nfunc init() {\n\tstd.TestSetOrigCaller(member)\n}\n\nfunc main() {\n\ttitle := \"Test proposal\"\n\tdesc := \"A test proposal\"\n\tdaoPath := \"invalid\"\n\tgnome.SubmitGeneralProposal(title, desc, daoPath, 0)\n}\n\n// Error:\n// DAO not found\n"},{"name":"gnome_0e_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\tgnome \"gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1\"\n)\n\nconst member = std.Address(\"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl\")\n\nfunc init() {\n\tstd.TestSetOrigCaller(member)\n}\n\nfunc main() {\n\ttitle := \"Test proposal\"\n\tdaoPath := \"council/main\"\n\tgnome.SubmitGeneralProposal(title, \"\", daoPath, 0)\n}\n\n// Error:\n// proposal description is required\n"},{"name":"indexes.gno","body":"package gnome\n\nimport (\n\t\"gno.land/p/demo/avl\"\n\n\tgnome \"gno.land/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao\"\n)\n\nvar (\n\tdaos daoIndex\n\tproposals proposalIndex\n\troles avl.Tree // string(gnome.Role) -\u003e struct{}\n\n\tlastProposalID gnome.ID\n)\n\nfunc init() {\n\t// Index initial council and main DAO\n\tmainDAO := gnomeDAO.GetFirstSubDAO()\n\tdaos.IndexByPath(gnomeDAO)\n\tdaos.IndexByPath(mainDAO)\n\n\t// Index available DAO member roles\n\troles.Set(RoleDirector.String(), struct{}{})\n\troles.Set(RoleEcoDev.String(), struct{}{})\n\troles.Set(RoleDev.String(), struct{}{})\n}\n\nfunc genProposalID() gnome.ID {\n\tlastProposalID += 1\n\treturn lastProposalID\n}\n\n// TODO: Deprecate DAO index in favor of using DAO methods\ntype daoIndex struct {\n\tindex avl.Tree // string(DAO path) -\u003e *gnome.DAO\n}\n\n// IndexByPath indexes a DAO by its path.\nfunc (x *daoIndex) IndexByPath(dao *gnome.DAO) bool {\n\treturn x.index.Set(dao.Path(), dao)\n}\n\n// GetByPath gets a DAO by its path.\nfunc (x daoIndex) GetByPath(path string) (*gnome.DAO, bool) {\n\tif v, ok := x.index.Get(path); ok {\n\t\treturn v.(*gnome.DAO), true\n\t}\n\treturn nil, false\n}\n\n// HasPathKey checks if a key with a DAO path exists.\nfunc (x daoIndex) HasPathKey(path string) bool {\n\treturn x.index.Has(path)\n}\n\ntype proposalIndex struct {\n\tindex avl.Tree // string(binary gnome.ID) -\u003e *gnome.Proposal\n\tgroups avl.Tree // string(DAO path) -\u003e []*gnome.Proposal\n}\n\n// Index indexes a proposal by its ID and DAO.\nfunc (x *proposalIndex) Index(p *gnome.Proposal) {\n\tx.IndexByID(p)\n\tx.IndexByDAO(p)\n}\n\n// IndexByID indexes a proposal by its ID.\nfunc (x *proposalIndex) IndexByID(p *gnome.Proposal) bool {\n\treturn x.index.Set(p.ID().Key(), p)\n}\n\n// IndexByDAO indexes a proposal for a DAO.\nfunc (x *proposalIndex) IndexByDAO(p *gnome.Proposal) bool {\n\tdaoPath := p.DAO().Path()\n\tproposals := x.GetAllByDAO(daoPath)\n\tproposals = append([]*gnome.Proposal{p}, proposals...) // reverse append\n\treturn x.groups.Set(daoPath, proposals)\n}\n\n// GetByID gets a proposal by its ID.\nfunc (x proposalIndex) GetByID(id gnome.ID) (*gnome.Proposal, bool) {\n\tif v, exists := x.index.Get(id.Key()); exists {\n\t\treturn v.(*gnome.Proposal), true\n\t}\n\treturn nil, false\n}\n\n// GetAllByDAO gets all proposals of a DAO.\nfunc (x proposalIndex) GetAllByDAO(daoPath string) []*gnome.Proposal {\n\tif v, exists := x.groups.Get(daoPath); exists {\n\t\treturn v.([]*gnome.Proposal)\n\t}\n\treturn nil\n}\n\n// Iterate iterates all proposals starting from the oldest one.\nfunc (x proposalIndex) Iterate(fn gnome.ProposalIterFn) bool {\n\treturn x.index.Iterate(\"\", \"\", func(_ string, value interface{}) bool {\n\t\treturn fn(value.(*gnome.Proposal))\n\t})\n}\n\n// ReverseIterate iterates all proposals starting from the latest one.\nfunc (x proposalIndex) ReverseIterate(fn gnome.ProposalIterFn) bool {\n\treturn x.index.ReverseIterate(\"\", \"\", func(_ string, value interface{}) bool {\n\t\treturn fn(value.(*gnome.Proposal))\n\t})\n}\n"},{"name":"lock.gno","body":"package gnome\n\nimport (\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"std\"\n\t\"strings\"\n\t\"time\"\n\n\t\"gno.land/p/demo/json\"\n\n\tgnome \"gno.land/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao\"\n)\n\nvar (\n\t// Initial state hash contains the sha256 hash of the initial realm state.\n\tinitialStateHash string\n\n\t// Final state hash contains the sha256 hash of the final realm state.\n\t// This value is initialized right after the realm is locked and can be used to\n\t// validate the state when migrating to a new realm version.\n\tfinalStateHash string\n)\n\nfunc init() {\n\tinitialStateHash = mustCalculateStateHash()\n}\n\n// SubmitDAOLockingProposal submits a new proposal to lock the DAO.\n//\n// Locking the DAO \"freezes the state\" by disallowing further modifications.\n// State must be locked to migrate the realm to a newer version.\n//\n// This type of proposal can only be created by the Council or Main DAO members.\n// Tally is done by plurality.\n// Default voting period is 2 days.\n//\n// Parameters:\n// - proposalTitle: A title for the proposal (required)\n// - proposalDescription: A description of the proposal\n// - daoPath: Path of the DAO where the proposal should be created (required)\n// - reason: Text with the DAO locking reason\n//\n// The optional `reason` argument can contain HTML.\nfunc SubmitDAOLockingProposal(\n\tproposalTitle,\n\tproposalDescription,\n\tdaoPath,\n\treason string,\n) uint64 {\n\tassertDAOIsNotLocked()\n\n\tcaller := std.GetOrigCaller()\n\tassertIsCouncilOrMainDAOMember(caller)\n\n\tdao := mustGetDAO(daoPath)\n\tassertIsCouncilOrMainDAO(dao)\n\n\treason = strings.TrimSpace(reason)\n\tstrategy := newLockingStrategy(gnomeDAO, reason, func() (err error) {\n\t\t// Advance all proposals before locking the DAO\n\t\tadvanceProposals()\n\n\t\t// Also update realm state with the final state hash\n\t\tfinalStateHash, err = calculateStateHash()\n\t\treturn err\n\t})\n\n\tp, err := gnome.NewProposal(\n\t\tgenProposalID(),\n\t\tstrategy,\n\t\tcaller,\n\t\tdao,\n\t\tproposalTitle,\n\t\tgnome.WithDescription(proposalDescription),\n\t\tgnome.WithReviewDeadline(time.Now().Add(reviewDeadline)),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tif err := p.Validate(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tproposals.Index(p)\n\tAdvanceProposals()\n\n\treturn uint64(p.ID())\n}\n\n// GetInitialDAOStateHash returns the sha256 hash of the initial realm state.\n// The initial state hash is calculated when the realm is initialized.\nfunc GetInitialDAOStateHash() string {\n\treturn initialStateHash\n}\n\n// GetFinalDAOStateHash returns the sha256 hash of the final realm state.\n// Locking the realm requires a lock DAO proposal to pass.\n// The final state hash is calculated when a lock DAO proposal is executed.\nfunc GetFinalDAOStateHash() string {\n\tif !gnomeDAO.IsLocked() {\n\t\tpanic(\"DAO must be locked to get the final state hash\")\n\t}\n\n\treturn finalStateHash\n}\n\n// GetState returns the realm state as JSON.\n// State can only be read when the realm is locked.\n// It can be used with the final state hash to migrate realms to newer versions.\nfunc GetState() string {\n\tif !gnomeDAO.IsLocked() {\n\t\tpanic(\"DAO must be locked to get the state\")\n\t}\n\n\tbz, err := marshalState()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn string(bz)\n}\n\nfunc marshalState() ([]byte, error) {\n\tnode := json.ObjectNode(\"\", nil)\n\tnode.AppendObject(\"lastProposalID\", json.StringNode(\"lastProposalID\", lastProposalID.String()))\n\tnode.AppendObject(\"gnomeDAO\", gnome.PreMarshalDAO(\"gnomeDAO\", gnomeDAO))\n\n\tvar items []*json.Node\n\tproposals.Iterate(func(p *gnome.Proposal) bool {\n\t\titems = append(items, gnome.PreMarshalProposal(\"\", p))\n\t\treturn false\n\t})\n\tnode.AppendObject(\"proposals\", json.ArrayNode(\"\", items))\n\n\treturn json.Marshal(node)\n}\n\nfunc calculateStateHash() (string, error) {\n\tbz, err := marshalState()\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\thash := sha256.Sum256(bz)\n\treturn hex.EncodeToString(hash[:]), nil\n}\n\nfunc mustCalculateStateHash() string {\n\thash, err := calculateStateHash()\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn hash\n}\n\nfunc assertDAOIsNotLocked() {\n\tif gnomeDAO.IsLocked() {\n\t\tpanic(\"DAO is locked\")\n\t}\n}\n\nfunc assertIsCouncilOrMainDAO(dao *gnome.DAO) {\n\tif !dao.IsSuperCouncil() {\n\t\t// Main DAO parent must be the super council\n\t\tparentDAO := dao.Parent()\n\t\tif !parentDAO.IsSuperCouncil() {\n\t\t\tpanic(\"DAO is not the council or main DAO\")\n\t\t}\n\t}\n}\n\nfunc assertIsCouncilOrMainDAOMember(addr std.Address) {\n\tif !gnomeDAO.HasMember(addr) {\n\t\tif mainDAO := gnomeDAO.GetFirstSubDAO(); !mainDAO.HasMember(addr) {\n\t\t\tpanic(\"account is not a council or main DAO member\")\n\t\t}\n\t}\n}\n"},{"name":"paginator.gno","body":"package gnome\n\nimport (\n\t\"math\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/ufmt\"\n\n\tgnome \"gno.land/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao\"\n)\n\nconst paginatorStyle = `\u003cstyle\u003e\n.paginator { text-align: center; }\n.paginator a { text-decoration: none; }\n.paginator a:hover { text-decoration: underline; }\n.paginator .left { padding-right: 4px; }\n.paginator .right { padding-left: 4px; }\n\u003c/style\u003e`\n\nvar (\n\tdefaultPageSize = 50\n\tminPageSize = 1\n\tpagePrefix = \"page=\"\n)\n\ntype (\n\t// PaginatorIterFn defines a callback to iterate page items.\n\tPaginatorIterFn func(index int) (stop bool)\n\n\t// PaginatorOption configures the paginator.\n\tPaginatorOption func(*Paginator)\n)\n\n// WithPageSize assigns a page size to a paginator.\n// The minimum page size is 5.\nfunc WithPageSize(size int) PaginatorOption {\n\treturn func(p *Paginator) {\n\t\tif size \u003c minPageSize {\n\t\t\tp.pageSize = minPageSize\n\t\t} else {\n\t\t\tp.pageSize = size\n\t\t}\n\t}\n}\n\n// WithItemCount assigns the total number of items that can be paginated.\n// Assigning the total item count allows the paginator to determine the last page number.\nfunc WithItemCount(count int) PaginatorOption {\n\treturn func(p *Paginator) {\n\t\tp.itemCount = count\n\t}\n}\n\n// NewPaginator creates a new paginator.\n// URI path must contain the page number for the paginator to iterate items.\n// Page number is specified in the URI path using \"page=N\" where N is the page\n// number which must start from 1. For example: gno.land/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome:a/b:page=2.\n// Paginator is disabled when the URI path doesn't have a page specified or\n// when the specified page is not valid.\nfunc NewPaginator(uri string, options ...PaginatorOption) Paginator {\n\trealmURI, renderPath := gnome.SplitRealmURI(uri)\n\tp := Paginator{\n\t\trealmPath: gnome.CutRealmDomain(realmURI),\n\t\tpageSize: defaultPageSize,\n\t}\n\n\tfor _, apply := range options {\n\t\tapply(\u0026p)\n\t}\n\n\tp.lastPage = int(math.Ceil(float64(p.itemCount) / float64(p.pageSize)))\n\n\t// Iterate path items until paginator arguments are found.\n\t// Path prefix and suffix are kept to be able to generate\n\t// page URLs keeping the render path format.\n\titems := strings.Split(renderPath, \":\")\n\tfor i, item := range items {\n\t\tif strings.HasPrefix(item, pagePrefix) {\n\t\t\tp.pathSuffix = items[i+1:]\n\t\t\tp.page, _ = strconv.Atoi(item[len(pagePrefix):])\n\t\t\tbreak\n\t\t}\n\n\t\tp.pathPrefix = append(p.pathPrefix, item)\n\t}\n\treturn p\n}\n\n// Paginator allows paging items.\ntype Paginator struct {\n\trealmPath string\n\tpathPrefix, pathSuffix []string\n\tpageSize, page, lastPage, itemCount int\n}\n\n// Offset returns the index for the first page item.\nfunc (p Paginator) Offset() int {\n\tif !p.IsEnabled() {\n\t\treturn 0\n\t}\n\treturn (p.page - 1) * p.pageSize\n}\n\n// PageSize returns the size of each page.\nfunc (p Paginator) PageSize() int {\n\treturn p.pageSize\n}\n\n// Page returns the current page number.\n// Zero is returned when the paginator is disabled.\nfunc (p Paginator) Page() int {\n\treturn p.page\n}\n\n// LastPage returns the number of the last page.\n// Zero is returned when paginator is initialized without the total item count.\nfunc (p Paginator) LastPage() int {\n\treturn p.lastPage\n}\n\n// IsEnabled checks if paginator is enabled.\nfunc (p Paginator) IsEnabled() bool {\n\treturn p.page \u003e 0\n}\n\n// IsLastPage checks if the current page is the last one.\nfunc (p Paginator) IsLastPage() bool {\n\treturn p.page == p.lastPage\n}\n\n// GetPageURI returns the URI for a page.\n// An empty string is returned when page is \u003c 1.\nfunc (p Paginator) GetPageURI(page int) string {\n\tif !p.IsEnabled() {\n\t\treturn \"\"\n\t}\n\n\trenderPath := append(p.pathPrefix, pagePrefix+strconv.Itoa(page))\n\trenderPath = append(renderPath, p.pathSuffix...)\n\treturn p.realmPath + \":\" + strings.Join(renderPath, \":\")\n}\n\n// PrevPageURI returns the URI path to the previous page.\n// An empty string is returned when current page is the first page.\nfunc (p Paginator) PrevPageURI() string {\n\tif p.page == 1 || !p.IsEnabled() {\n\t\treturn \"\"\n\t}\n\treturn p.GetPageURI(p.page - 1)\n}\n\n// NextPageURI returns the URI path to the next page.\nfunc (p Paginator) NextPageURI() string {\n\tif p.IsLastPage() {\n\t\treturn \"\"\n\t}\n\treturn p.GetPageURI(p.page + 1)\n}\n\n// Iterate allows iterating page items.\nfunc (p Paginator) Iterate(fn PaginatorIterFn) bool {\n\tif !p.IsEnabled() {\n\t\treturn true\n\t}\n\n\tstart := p.Offset()\n\tfor i := start; i \u003c start+p.PageSize(); i++ {\n\t\tif fn(i) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc (p Paginator) Render() string { // TODO: Remove rendering related logic from this package\n\tif !p.IsEnabled() {\n\t\treturn \"\"\n\t}\n\n\tvar markdown string\n\tif s := p.PrevPageURI(); s != \"\" {\n\t\tmarkdown = ufmt.Sprintf(`\u003ca href=\"%s\" class=\"left\"\u003e\u0026lt;-\u003c/a\u003e`, s)\n\t} else {\n\t\tmarkdown += `\u003cspan class=\"left\"\u003e--\u003c/span\u003e`\n\t}\n\n\t// TODO: Add display links to other page numbers?\n\tmarkdown += ufmt.Sprintf(\"page %d\", p.page)\n\n\tif s := p.NextPageURI(); s != \"\" {\n\t\tmarkdown += ufmt.Sprintf(`\u003ca href=\"%s\" class=\"right\"\u003e-\u0026gt;\u003c/a\u003e`, s)\n\t} else {\n\t\tmarkdown += `\u003cspan class=\"right\"\u003e--\u003c/span\u003e`\n\t}\n\n\treturn paginatorStyle + `\u003cp class=\"paginator\"\u003e` + markdown + `\u003c/p\u003e`\n}\n"},{"name":"paginator_test.gno","body":"package gnome\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n)\n\nfunc TestPaginator(t *testing.T) {\n\titems := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}\n\tcases := []struct {\n\t\tname, uri, prevPath, nextPath string\n\t\toffset, pageSize, page, lastPage int\n\t\tpageItems string\n\t\tstopped, enabled, isLastPage bool\n\t}{\n\t\t{\n\t\t\tname: \"page 1\",\n\t\t\turi: \"gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome:foo/bar:page=1:foo=bar\",\n\t\t\tenabled: true,\n\t\t\tnextPath: \"/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome:foo/bar:page=2:foo=bar\",\n\t\t\toffset: 0,\n\t\t\tpageSize: 5,\n\t\t\tpage: 1,\n\t\t\tlastPage: 2,\n\t\t\tpageItems: \"[1 2 3 4 5]\",\n\t\t},\n\t\t{\n\t\t\tname: \"page 2\",\n\t\t\turi: \"gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome:foo/bar:page=2:foo=bar\",\n\t\t\tenabled: true,\n\t\t\tprevPath: \"/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome:foo/bar:page=1:foo=bar\",\n\t\t\tnextPath: \"\",\n\t\t\toffset: 5,\n\t\t\tpageSize: 5,\n\t\t\tpage: 2,\n\t\t\tlastPage: 2,\n\t\t\tpageItems: \"[6 7 8 9 10]\",\n\t\t\tisLastPage: true,\n\t\t},\n\t\t{\n\t\t\tname: \"missing page\",\n\t\t\turi: \"gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome:foo/bar:page=3:foo=bar\",\n\t\t\tenabled: true,\n\t\t\tprevPath: \"/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome:foo/bar:page=2:foo=bar\",\n\t\t\tnextPath: \"/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome:foo/bar:page=4:foo=bar\",\n\t\t\toffset: 10,\n\t\t\tpageSize: 5,\n\t\t\tpage: 3,\n\t\t\tlastPage: 2,\n\t\t\tpageItems: \"[]\",\n\t\t\tstopped: true,\n\t\t},\n\t\t{\n\t\t\tname: \"invalid page number\",\n\t\t\turi: \"gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome:foo/bar:page=0:foo=bar\",\n\t\t\tenabled: false,\n\t\t\tprevPath: \"\",\n\t\t\tnextPath: \"\",\n\t\t\toffset: 0,\n\t\t\tpageSize: 4,\n\t\t\tpage: 0,\n\t\t\tlastPage: 3,\n\t\t\tpageItems: \"[]\",\n\t\t\tstopped: true,\n\t\t},\n\t\t{\n\t\t\tname: \"invalid page value\",\n\t\t\turi: \"gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome:foo/bar:page=foo:foo=bar\",\n\t\t\tenabled: false,\n\t\t\tprevPath: \"\",\n\t\t\tnextPath: \"\",\n\t\t\toffset: 0,\n\t\t\tpageSize: 2,\n\t\t\tpage: 0,\n\t\t\tlastPage: 5,\n\t\t\tpageItems: \"[]\",\n\t\t\tstopped: true,\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tvar pageItems []int\n\n\t\t\t// Act\n\t\t\tp := NewPaginator(tc.uri, WithPageSize(tc.pageSize), WithItemCount(len(items)))\n\n\t\t\t// Assert\n\t\t\tif got := p.Page(); got != tc.page {\n\t\t\t\tt.Fatalf(\"expected page: %d, got: %d\", tc.page, got)\n\t\t\t}\n\n\t\t\tif got := p.LastPage(); got != tc.lastPage {\n\t\t\t\tt.Fatalf(\"expected last page: %d, got: %d\", tc.lastPage, got)\n\t\t\t}\n\n\t\t\tif got := p.PrevPageURI(); got != tc.prevPath {\n\t\t\t\tt.Fatalf(\"expected prev page path: '%s', got: '%s'\", tc.prevPath, got)\n\t\t\t}\n\n\t\t\tif got := p.NextPageURI(); got != tc.nextPath {\n\t\t\t\tt.Fatalf(\"expected next page path: '%s', got: '%s'\", tc.nextPath, got)\n\t\t\t}\n\n\t\t\tif got := p.Offset(); got != tc.offset {\n\t\t\t\tt.Fatalf(\"expected offset: %d, got: %d\", tc.offset, got)\n\t\t\t}\n\n\t\t\tif got := p.PageSize(); got != tc.pageSize {\n\t\t\t\tt.Fatalf(\"expected page size: %d, got: %d\", tc.pageSize, got)\n\t\t\t}\n\n\t\t\tif got := p.IsEnabled(); got != tc.enabled {\n\t\t\t\tt.Fatalf(\"expected enabled: %v, got: %v\", tc.enabled, got)\n\t\t\t}\n\n\t\t\tif got := p.IsLastPage(); got != tc.isLastPage {\n\t\t\t\tt.Fatalf(\"expected is last page to be: %v, got: %v\", tc.isLastPage, got)\n\t\t\t}\n\n\t\t\tstopped := p.Iterate(func(i int) bool {\n\t\t\t\tif i \u003e= len(items) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\n\t\t\t\tpageItems = append(pageItems, items[i])\n\t\t\t\treturn false\n\t\t\t})\n\t\t\tif stopped != tc.stopped {\n\t\t\t\tt.Fatalf(\"expected iteration result: %v, got: %v\", tc.stopped, stopped)\n\t\t\t}\n\n\t\t\tif got := fmt.Sprintf(\"%v\", pageItems); got != tc.pageItems {\n\t\t\t\tt.Fatalf(\"expected page items: %s, got: %s\", tc.pageItems, got)\n\t\t\t}\n\t\t})\n\t}\n}\n"},{"name":"render.gno","body":"package gnome\n\nimport (\n\t\"strconv\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/ufmt\"\n\n\t\"gno.land/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/alerts\"\n\tgnome \"gno.land/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao\"\n)\n\nconst (\n\tdateFmt = \"2006-01-02 15:04 MST\"\n\tproposalTakeoverMsg = \"For the proposal outcome to change it has to be taken over by a parent DAO by voting on it\"\n)\n\n// TODO: Define a pattern to add custom CSS styles\nconst customStyles = `\n\u003cstyle\u003e\n.custom ul { padding-left: 20px; }\n.custom li { list-style-type: disc; }\n.custom li.current { font-weight: 900; }\n.custom li \u003e p { margin: 0px; }\n\u003c/style\u003e\n`\n\n// Render returns a Markdown string with DAO or proposal details.\n// By default it renders the Council DAO details view.\n//\n// Paths:\n// - `dao/DAO_PATH` =\u003e Renders DAO or sub DAO details\n// - `proposal/PROPOSAL_ID` =\u003e Renders details for a proposal\n// - `proposals/DAO_PATH` =\u003e Renders the list of proposals for a DAO\nfunc Render(path string) string {\n\tvar r Router\n\n\tr.HandleFunc(\"\", renderDAO)\n\tr.HandleFunc(\"dao\", renderDAO)\n\tr.HandleFunc(\"proposal\", renderProposal)\n\tr.HandleFunc(\"proposals\", renderProposals)\n\n\t// Render global alerts before proposal states are updated within the handlers\n\treturn renderAlerts() + r.Render(path)\n}\n\nfunc renderAlerts() string {\n\tif gnomeDAO.IsLocked() {\n\t\tmsg := \"Realm is locked\"\n\t\tif reason := gnomeDAO.LockReason(); reason != \"\" {\n\t\t\tmsg += \"\u003c/br\u003e\" + reason\n\t\t}\n\n\t\treturn alerts.NewError(msg)\n\t}\n\n\tif IsProposalsAdvanceNeeded() {\n\t\treturn alerts.NewWarning(\n\t\t\tnewGnoStudioConnectLink(\"AdvanceProposals\", \"Proposals advance needed\"),\n\t\t)\n\t}\n\treturn \"\"\n}\n\nfunc renderDAO(res ResponseWriter, req Request) {\n\tvar (\n\t\tdao *gnome.DAO\n\t\tdaoPath = req.Route\n\t)\n\n\tif daoPath == \"\" {\n\t\tdao = gnomeDAO\n\t\tdaoPath = nameCouncilDAO\n\t} else {\n\t\tvar found bool\n\t\tdao, found = daos.GetByPath(daoPath)\n\t\tif !found {\n\t\t\tres.Write(\"DAO Not Found\")\n\t\t\treturn\n\t\t}\n\n\t\t// TODO: Add lock dismissal reason when available\n\t\tif dao.IsLocked() {\n\t\t\tres.Write(alerts.NewError(\"DAO is dismissed\"))\n\t\t}\n\t}\n\n\tres.Writef(\n\t\t\"# Gno.me DAO\\n\"+\n\t\t\t\"## %s\\n\"+\n\t\t\t\"%s\\n\\n\"+\n\t\t\t\"[View Proposals of %s](%s)\\n\",\n\t\tdao.Title(),\n\t\tdao.Manifest(),\n\t\tdao.Title(),\n\t\tmakeProposalsURI(daoPath, true),\n\t)\n\n\tres.Write(\"## \" + dao.Title() + \" Members\\n\")\n\tfor _, m := range dao.Members() {\n\t\tres.Write(\"- \" + m.String() + \"\\n\")\n\t}\n\n\tres.Write(\"\\n\" + customStyles + \"\\n\\n\")\n\n\tres.Write(\"## Organization\\n\\n\")\n\tres.Write(renderOrganizationTree(daoPath))\n\tres.Write(\"\\n\")\n}\n\nfunc renderProposals(res ResponseWriter, req Request) {\n\tdaoPath := req.Route\n\tdao, found := daos.GetByPath(daoPath)\n\tif !found {\n\t\tres.Write(\"DAO Not Found\")\n\t\treturn\n\t}\n\n\tdaoProposals := proposals.GetAllByDAO(dao.Path())\n\tcount := len(daoProposals)\n\tif count == 0 {\n\t\tres.Write(\"DAO has no proposals\")\n\t\treturn\n\t}\n\n\trealmPath := makeRealmPath(req.Path)\n\tpages := NewPaginator(realmPath, WithItemCount(count))\n\n\t// TODO: Add links to toggle display of dismissed proposals (when DAO dismissal is implemented)\n\n\tres.Writef(\"# %s: Proposals\\n\", dao.Title())\n\tpages.Iterate(func(i int) bool {\n\t\tif i \u003e= count {\n\t\t\treturn true\n\t\t}\n\n\t\tp := daoProposals[i]\n\t\t_ = advanceProposal(p) // TODO: Handle errors when render notice support is implemented\n\t\tpath := makeProposalURI(p.ID(), true)\n\t\tres.Writef(\"- [#%s %s](%s) (%s)\\n\", p.ID(), p.Title(), path, p.Status())\n\t\treturn false\n\t})\n\n\tif pages.IsEnabled() {\n\t\tres.Write(\"\\n\" + pages.Render())\n\t}\n}\n\n// TODO: Improve renderProposal code\nfunc renderProposal(res ResponseWriter, req Request) {\n\trawID := req.Route\n\tid, err := strconv.Atoi(rawID)\n\tif err != nil {\n\t\tres.Write(\"Invalid proposal ID: \" + gnome.EscapeHTML(rawID))\n\t\treturn\n\t}\n\n\tproposal, found := proposals.GetByID(gnome.ID(id))\n\tif !found {\n\t\tres.Write(\"Proposal Not Found\")\n\t\treturn\n\t}\n\n\tvar (\n\t\toutcome gnome.ProposalStatus\n\t\tstatus = proposal.Status()\n\t)\n\n\t// When the status is not final advance the proposal to calculate the current outcome\n\tif !status.IsFinal() {\n\t\t_ = advanceProposal(proposal) // TODO: Implement generic alert support for render and use it to render errors\n\t\toutcome = proposal.Status()\n\n\t\t// Validate if proposal is valid for the current state\n\t\tif err := proposal.Validate(); err != nil {\n\t\t\tres.Write(alerts.NewError(err.Error()))\n\t\t}\n\n\t\t// Warn when the outcome could change if a member of a parent DAO votes on this proposal.\n\t\t// Proposal choice is only available when there is a majority, so there is voting concensus.\n\t\tif proposal.Choice() != gnome.ChoiceNone \u0026\u0026 !proposal.HasVotingDeadlinePassed() {\n\t\t\tres.Write(alerts.NewWarning(proposalTakeoverMsg))\n\t\t}\n\t} else if status == gnome.StatusDismissed {\n\t\t// Display an alert with the dismiss reason\n\t\tres.Write(alerts.NewWarning(proposal.StatusReason()))\n\t}\n\n\tdao := proposal.DAO()\n\tdaoPath := dao.Path()\n\tif proposal.HasBeenPromoted() {\n\t\turi := makeDAOURI(daoPath, true)\n\t\tlink := alerts.NewLink(uri, dao.Title())\n\t\tres.Write(alerts.NewWarning(\"Proposal has been promoted to \" + link + \" DAO\"))\n\t}\n\n\tres.Write(\"# #\" + proposal.ID().String() + \" \" + proposal.Title() + \"\\n\")\n\tres.Write(\"- Type: \" + proposal.Strategy().Name() + \"\\n\")\n\tres.Write(\"- Created: \" + proposal.CreatedAt().UTC().Format(dateFmt) + \"\\n\")\n\tres.Write(\"- Proposer: \" + proposal.Proposer().String() + \"\\n\")\n\tres.Write(\"- Status: \" + getProposalStatusMarkdown(status, proposal.Choice(), proposal.StatusReason()) + \"\\n\")\n\n\tif !status.IsFinal() {\n\t\tif outcome == gnome.StatusReview {\n\t\t\tres.Write(\"- Review Deadline: \" + proposal.ReviewDeadline().UTC().Format(dateFmt) + \"\\n\")\n\t\t} else {\n\t\t\tres.Write(\"- Voting Deadline: \" + proposal.VotingDeadline().UTC().Format(dateFmt) + \"\\n\")\n\t\t\tres.Write(\"- Expected Outcome: \" + getProposalStatusMarkdown(outcome, proposal.Choice(), proposal.StatusReason()) + \"\\n\")\n\n\t\t\t// Vote line should be render as long as voting deadline is not reached.\n\t\t\t// This is required for proposals that have to be advanced after deadline is reached.\n\t\t\tif !proposal.HasVotingDeadlinePassed() {\n\t\t\t\tres.Write(\"\\n\" + newGnoStudioConnectLink(\"Vote\", \"Vote on this proposal\") + \"\\n\")\n\t\t\t}\n\t\t}\n\t}\n\n\tif s := proposal.Description(); s != \"\" {\n\t\tres.Write(\"## Description\\n\" + s + \"\\n\")\n\t}\n\n\tif r, ok := proposal.Strategy().(gnome.ParamsRenderer); ok {\n\t\t// TODO: Use custom HTML component to allow users to toggle params visibility\n\t\tif s := r.RenderParams(); s != \"\" {\n\t\t\tres.Write(\"## Parameters\\n\\n\" + s + \"\\n\")\n\t\t}\n\t}\n\n\tres.Write(\"## Votes\\n\")\n\trecord := proposal.VotingRecord()\n\tif record.VoteCount() == 0 {\n\t\tres.Write(\"The proposal has no votes\\n\")\n\t} else {\n\t\t// TODO: Render percentages for each voting choice and abstentions?\n\t\trecord.Iterate(func(c gnome.VoteChoice, count uint) bool {\n\t\t\tres.Writef(\"- %s: %d\\n\", string(c), count)\n\t\t\treturn false\n\t\t})\n\n\t\tres.Write(\"## Participation\\n\")\n\t\trenderProposalParticipation(res, record.Votes())\n\t}\n\n\t// If proposal has been promoted to a parent DAO render participation in child DAOs\n\tif proposal.HasBeenPromoted() {\n\t\tres.Write(\"## Sub DAOs Participation\\n\")\n\t\tdaos := proposal.Promotions()\n\t\trecords := proposal.VotingRecords()\n\t\tfor i := len(records) - 2; i \u003e= 0; i-- { // reverse iteration excluding record for current DAO\n\t\t\tr := records[i]\n\t\t\tdao := daos[i]\n\t\t\tres.Write(\"### [\" + dao.Title() + \"](\" + makeDAOURI(daoPath, true) + \"]\\n\")\n\t\t\trenderProposalParticipation(res, r.Votes())\n\t\t}\n\t}\n}\n\nfunc renderProposalParticipation(res ResponseWriter, votes []gnome.Vote) {\n\tfor _, v := range votes {\n\t\tchoice := string(v.Choice)\n\t\tif v.Reason != \"\" {\n\t\t\t// TODO: Long reasons have to break lines to fit making web UI look bad\n\t\t\tchoice += ` \"` + gnome.EscapeHTML(v.Reason) + `\"`\n\t\t}\n\n\t\tres.Writef(\"- %s: voted %s\\n\", v.Address.String(), choice)\n\t}\n}\n\n// TODO: Use the UI package for HTML elements because rendered Markdown styles break the tree\nfunc renderOrganizationTree(currentPath string) string {\n\tvar item string\n\tif gnomeDAO.Name() == currentPath {\n\t\titem = `\u003cli class=\"current\"\u003e` + gnomeDAO.Title() + `\u003c/li\u003e`\n\t} else {\n\t\turi := makeDAOURI(gnomeDAO.Path(), true)\n\t\titem = `\u003cli\u003e` + alerts.NewLink(uri, gnomeDAO.Title()) + `\u003c/li\u003e`\n\t}\n\treturn `\u003cdiv class=\"custom\"\u003e\u003cul\u003e` + item + renderSubTree(gnomeDAO, currentPath) + `\u003c/ul\u003e\u003c/div\u003e`\n}\n\nfunc renderSubTree(parentDAO *gnome.DAO, currentPath string) string {\n\tvar (\n\t\tbuf strings.Builder\n\t\titem string\n\t)\n\n\tfor _, dao := range parentDAO.SubDAOs() {\n\t\tif dao.IsLocked() {\n\t\t\t// Skip dismissed DAOs\n\t\t\t// TODO: Render filter option to toggle dismissed DAOs visibility\n\t\t\tcontinue\n\t\t}\n\n\t\tif dao.Path() == currentPath {\n\t\t\titem = `\u003cli class=\"current\"\u003e` + dao.Title() + `\u003c/li\u003e`\n\t\t} else {\n\t\t\turi := makeDAOURI(dao.Path(), true)\n\t\t\titem = `\u003cli\u003e` + alerts.NewLink(uri, dao.Title()) + `\u003c/li\u003e`\n\t\t}\n\n\t\tbuf.WriteString(item)\n\n\t\tif len(dao.SubDAOs()) \u003e 0 {\n\t\t\tbuf.WriteString(renderSubTree(dao, currentPath))\n\t\t}\n\t}\n\treturn `\u003cul\u003e` + buf.String() + `\u003c/ul\u003e`\n}\n\nfunc advanceProposal(p *gnome.Proposal) error {\n\tstatus := p.Status()\n\tif status == gnome.StatusReview \u0026\u0026 p.HasReviewDeadlinePassed() {\n\t\tif err := p.Activate(); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tstatus = p.Status()\n\t}\n\n\tif status == gnome.StatusActive {\n\t\t// Tally active proposals to always have an up to date state with the current proposal outcome\n\t\tif err := p.Tally(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc getProposalStatusMarkdown(s gnome.ProposalStatus, c gnome.VoteChoice, reason string) string {\n\tswitch s {\n\tcase gnome.StatusPassed:\n\t\treturn ufmt.Sprintf(\"**%s** (%s)\", s, string(c))\n\tcase gnome.StatusRejected:\n\t\t// Rejected proposal might have a reason\n\t\tif reason == \"\" {\n\t\t\treturn ufmt.Sprintf(\"**%s**\", s)\n\t\t} else {\n\t\t\treturn ufmt.Sprintf(\"**%s** (%s)\", s, reason)\n\t\t}\n\tcase gnome.StatusDismissed, gnome.StatusFailed:\n\t\treturn ufmt.Sprintf(\"**%s** (%s)\", s, reason)\n\tdefault:\n\t\treturn ufmt.Sprintf(\"**%s**\", s)\n\t}\n}\n\nfunc newGnoStudioConnectLink(functionName, label string) string {\n\thref := makeGnoStudioConnectURL(functionName)\n\treturn alerts.NewLink(href, label)\n}\n"},{"name":"render_router.gno","body":"package gnome\n\nimport (\n\t\"strings\"\n\n\t\"gno.land/p/demo/ufmt\"\n)\n\n// TODO: Move this file to a gno.land/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/router package\n\ntype (\n\tResponseWriter interface {\n\t\tWrite(s string)\n\t\tWritef(format string, values ...interface{})\n\t}\n\n\tRequest struct {\n\t\tPath string\n\t\tPrefix string\n\t\tRoute string\n\t\tArgs []string\n\t}\n\n\tHandlerFunc func(ResponseWriter, Request)\n\n\thandler struct {\n\t\tPrefix string\n\t\tFn HandlerFunc\n\t}\n)\n\ntype Router struct {\n\thandlers []handler\n}\n\nfunc (r *Router) HandleFunc(prefix string, fn HandlerFunc) {\n\tr.handlers = append(r.handlers, handler{\n\t\tPrefix: prefix,\n\t\tFn: fn,\n\t})\n}\n\nfunc (r Router) Render(path string) string {\n\tprefix, route, args := splitRenderPath(path)\n\n\tfor _, h := range r.handlers {\n\t\tif h.Prefix == prefix {\n\t\t\tvar (\n\t\t\t\tw responseWriter\n\t\t\t\treq = Request{\n\t\t\t\t\tPath: path,\n\t\t\t\t\tPrefix: prefix,\n\t\t\t\t\tRoute: route,\n\t\t\t\t\tArgs: args,\n\t\t\t\t}\n\t\t\t)\n\n\t\t\th.Fn(\u0026w, req)\n\n\t\t\treturn w.Output()\n\t\t}\n\t}\n\n\treturn \"Path not found\"\n}\n\ntype responseWriter struct {\n\toutput strings.Builder\n}\n\nfunc (w *responseWriter) Write(s string) {\n\tw.output.WriteString(s)\n}\n\nfunc (w *responseWriter) Writef(format string, values ...interface{}) {\n\tw.output.WriteString(ufmt.Sprintf(format, values...))\n}\n\nfunc (w responseWriter) Output() string {\n\treturn w.output.String()\n}\n\nfunc splitRenderPath(path string) (prefix, route string, args []string) {\n\t// Split route prefix and route.\n\t// Path format is \"prefix/route:args\".\n\tpath = strings.TrimSpace(path)\n\tif parts := strings.SplitN(path, \"/\", 2); len(parts) == 2 {\n\t\tprefix = parts[0]\n\t\troute = parts[1]\n\n\t\t// Split route and arguments\n\t\tif parts := strings.Split(route, \":\"); len(parts) \u003e 1 {\n\t\t\troute = parts[0]\n\t\t\targs = parts[1:]\n\t\t}\n\t}\n\n\treturn prefix, route, args\n}\n"},{"name":"strategy_budget.gno","body":"package gnome\n\nimport (\n\t\"errors\"\n\t\"std\"\n\t\"strings\"\n\t\"time\"\n\n\t\"gno.land/p/demo/json\"\n\n\tgnome \"gno.land/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao\"\n)\n\nfunc newBudgetStrategy(council *gnome.DAO, budget string) budgetStrategy {\n\tif council == nil {\n\t\tpanic(\"council DAO is requried\")\n\t}\n\n\tif !council.IsSuperCouncil() {\n\t\tpanic(\"budget strategy expects DAO to be a super council\")\n\t}\n\n\tbudget = strings.TrimSpace(budget)\n\tif budget == \"\" {\n\t\tpanic(\"budget is required\")\n\t}\n\n\t// The council DAO must have at least one sub DAO which should the main DAO.\n\t// The first sub DAO is some times used to check if a vote is valid.\n\tif len(council.SubDAOs()) == 0 {\n\t\tpanic(\"budget strategy expects council DAO to have at least one sub DAO\")\n\t}\n\n\treturn budgetStrategy{\n\t\tchoices: []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo},\n\t\tcouncil: council,\n\t\tbudget: budget, // TODO: Validate/split budget format? (ex. AMOUNTSYMBOL: 10USD)\n\t}\n}\n\ntype budgetStrategy struct {\n\tchoices []gnome.VoteChoice\n\tcouncil *gnome.DAO\n\tbudget string\n}\n\n// Name returns the name of the strategy.\nfunc (budgetStrategy) Name() string {\n\treturn \"budget\"\n}\n\n// Quorum returns the minimum required percentage of DAO member votes\n// required for a proposal to pass.\nfunc (budgetStrategy) Quorum() float64 {\n\treturn 0.51\n}\n\n// VotingPeriod returns the period that a proposal should allow voting.\nfunc (budgetStrategy) VotingPeriod() time.Duration {\n\treturn time.Minute * 30\n}\n\n// VoteChoices returns the valid voting choices for the strategy.\nfunc (s budgetStrategy) VoteChoices() []gnome.VoteChoice {\n\treturn s.choices\n}\n\n// CheckVote checks that a vote is valid for the strategy.\nfunc (s budgetStrategy) CheckVote(addr std.Address, _ gnome.VoteChoice, _ string) error {\n\t// Check that voter address belongs to a council DAO member\n\tif s.council.HasMember(addr) {\n\t\treturn nil\n\t}\n\n\t// Make sure the main DAO was not dismissed and check that voter address belongs to a main DAO member\n\t// TODO: Check DAO status instead when DAO dismissal is implemented\n\tif sub := s.council.SubDAOs(); len(sub) \u003e 0 {\n\t\tmainDAO := sub[0]\n\t\tif !mainDAO.HasMember(addr) {\n\t\t\treturn errors.New(\"only members of the council DAO or main DAO can vote on budget proposals\")\n\t\t}\n\t} else {\n\t\treturn errors.New(\"main DAO not found\")\n\t}\n\treturn nil\n}\n\n// Tally counts the votes and returns the winner voting choice.\nfunc (budgetStrategy) Tally(dao *gnome.DAO, r gnome.VotingRecord) gnome.VoteChoice {\n\t// Consider abstentions to make the majority absolute\n\tabstentions := len(dao.Members()) - r.VoteCount()\n\tif choice, ok := gnome.SelectChoiceByMajority(r, abstentions); ok {\n\t\treturn choice\n\t}\n\treturn gnome.ChoiceNone\n}\n\n// RenderParams returns a markdown with the rendered strategy parameters.\nfunc (s budgetStrategy) RenderParams() string {\n\treturn \"Budget: \" + gnome.EscapeHTML(s.budget)\n}\n\n// PreMarshaler defines an interface to enable JSON pre marshalling support.\nfunc (s budgetStrategy) PreMarshal() *json.Node {\n\t// TODO: Marshal vote choices for all strategies when custom choices are supported\n\tnode := json.ObjectNode(\"\", nil)\n\tnode.AppendObject(\"name\", json.StringNode(\"name\", s.Name()))\n\tnode.AppendObject(\"budget\", json.StringNode(\"budget\", s.budget))\n\treturn node\n}\n"},{"name":"strategy_budget_test.gno","body":"package gnome\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"std\"\n\t\"testing\"\n\t\"time\"\n\n\t\"gno.land/p/demo/testutils\"\n\n\tgnome \"gno.land/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao\"\n)\n\nfunc TestBudgetStrategy(t *testing.T) {\n\tcases := []struct {\n\t\tname string\n\t\tcouncil *gnome.DAO\n\t\terr string\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\tcouncil: gnome.MustNew(\"council\", \"Council\",\n\t\t\t\tgnome.AssignAsSuperCouncil(),\n\t\t\t\tgnome.WithSubDAO(\n\t\t\t\t\tgnome.MustNew(\"main\", \"Main\"),\n\t\t\t\t),\n\t\t\t),\n\t\t},\n\t\t{\n\t\t\tname: \"nil council\",\n\t\t\terr: \"council DAO is requried\",\n\t\t},\n\t\t{\n\t\t\tname: \"no super council\",\n\t\t\tcouncil: gnome.MustNew(\"council\", \"Council\"),\n\t\t\terr: \"budget strategy expects DAO to be a super council\",\n\t\t},\n\t\t{\n\t\t\tname: \"council without main DAO\",\n\t\t\tcouncil: gnome.MustNew(\"council\", \"Council\", gnome.AssignAsSuperCouncil()),\n\t\t\terr: \"budget strategy expects council DAO to have at least one sub DAO\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tname := \"budget\"\n\t\t\tquorum := 0.51\n\t\t\tvotingPeriod := time.Hour * 24 * 7\n\t\t\tchoices := fmt.Sprintf(\"%v\", []gnome.VoteChoice{\n\t\t\t\tgnome.ChoiceYes,\n\t\t\t\tgnome.ChoiceNo,\n\t\t\t})\n\n\t\t\t// Act\n\t\t\tvar s budgetStrategy\n\t\t\terr := handlePanic(t, func() {\n\t\t\t\ts = newBudgetStrategy(tc.council, \"1USD\")\n\t\t\t})\n\n\t\t\t// Assert\n\t\t\tif tc.err != \"\" {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tassertNoError(t, err)\n\n\t\t\tif got := s.Name(); got != name {\n\t\t\t\tt.Fatalf(\"expected strategy name: '%s', got: '%s'\", name, got)\n\t\t\t}\n\n\t\t\tif got := s.Quorum(); got != quorum {\n\t\t\t\tt.Fatalf(\"expected strategy quorum: %.2f, got: %.2f\", quorum, got)\n\t\t\t}\n\n\t\t\tif got := s.VotingPeriod(); got != votingPeriod {\n\t\t\t\tt.Fatalf(\"expected strategy voting period: %d, got: %d\", votingPeriod, got)\n\t\t\t}\n\n\t\t\tif got := fmt.Sprintf(\"%v\", s.VoteChoices()); got != choices {\n\t\t\t\tt.Fatalf(\"expected strategy vote choices: %s, got: %s\", choices, got)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestBudgetStrategyCheckVote(t *testing.T) {\n\tcouncilMember := newTestMember(t, \"council\")\n\tmainMember := newTestMember(t, \"main\")\n\tcouncil := gnome.MustNew(\n\t\t\"council\",\n\t\t\"Council\",\n\t\tgnome.AssignAsSuperCouncil(),\n\t\tgnome.WithMembers(councilMember),\n\t\tgnome.WithSubDAO(\n\t\t\tgnome.MustNew(\"main\", \"Main\", gnome.WithMembers(mainMember)),\n\t\t),\n\t)\n\n\tcases := []struct {\n\t\tname string\n\t\taddress std.Address\n\t\tchoice gnome.VoteChoice\n\t\tcouncil *gnome.DAO\n\t\terr string\n\t}{\n\t\t{\n\t\t\tname: \"council DAO vote\",\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t\taddress: councilMember.Address,\n\t\t\tcouncil: council,\n\t\t},\n\t\t{\n\t\t\tname: \"main DAO vote\",\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t\taddress: mainMember.Address,\n\t\t\tcouncil: council,\n\t\t},\n\t\t{\n\t\t\tname: \"non member vote\",\n\t\t\tchoice: gnome.ChoiceNo,\n\t\t\taddress: testutils.TestAddress(\"foo\"),\n\t\t\tcouncil: council,\n\t\t\terr: \"only members of the council DAO or main DAO can vote on budget proposals\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\ts := newBudgetStrategy(tc.council, \"1USD\")\n\n\t\t\t// Act\n\t\t\terr := s.CheckVote(tc.address, tc.choice, \"\")\n\n\t\t\t// Assert\n\t\t\tif tc.err != \"\" {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t} else {\n\t\t\t\tassertNoError(t, err)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestBudgetStrategyTally(t *testing.T) {\n\tcouncil := gnome.MustNew(\n\t\t\"council\",\n\t\t\"Council\",\n\t\tgnome.AssignAsSuperCouncil(),\n\t\tgnome.WithMembers(\n\t\t\tnewTestMember(t, \"member1\"),\n\t\t\tnewTestMember(t, \"member2\"),\n\t\t\tnewTestMember(t, \"member3\"),\n\t\t\tnewTestMember(t, \"member4\"),\n\t\t),\n\t\tgnome.WithSubDAO(\n\t\t\tgnome.MustNew(\"main\", \"Main\"),\n\t\t),\n\t)\n\tcases := []struct {\n\t\tname string\n\t\tvotes []gnome.Vote\n\t\tchoice gnome.VoteChoice\n\t}{\n\t\t{\n\t\t\tname: \"majority\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t},\n\t\t{\n\t\t\tname: \"majority with abstentions\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNo,\n\t\t},\n\t\t{\n\t\t\tname: \"no quorum\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNone,\n\t\t},\n\t\t{\n\t\t\tname: \"no quorum with abstentions\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNone,\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\trecord := gnome.NewVotingRecord()\n\t\t\tfor _, v := range tc.votes {\n\t\t\t\trecord.Add(v)\n\t\t\t}\n\n\t\t\ts := newBudgetStrategy(council, \"1USD\")\n\n\t\t\t// Act\n\t\t\tchoice := s.Tally(council, *record)\n\n\t\t\t// Assert\n\t\t\tif choice != tc.choice {\n\t\t\t\tt.Fatalf(\"expected tally result choice: '%v', got: '%v'\", tc.choice, choice)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc handlePanic(t *testing.T, fn func()) (reason error) {\n\tt.Helper()\n\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\tif err, _ := r.(error); err != nil {\n\t\t\t\treason = err\n\t\t\t} else {\n\t\t\t\treason = errors.New(fmt.Sprint(r))\n\t\t\t}\n\t\t}\n\t}()\n\n\tfn()\n\treturn\n}\n"},{"name":"strategy_dao.gno","body":"package gnome\n\nimport (\n\t\"errors\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"gno.land/p/demo/json\"\n\n\tgnome \"gno.land/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao\"\n)\n\nfunc newSubDAOCreationStrategy(daos daoIndex, name, title, manifest string, members []gnome.Member) subDAOCreationStrategy {\n\tif strings.TrimSpace(name) == \"\" {\n\t\tpanic(\"sub DAO name is required\")\n\t}\n\n\tif !gnome.IsSlug(name) {\n\t\tpanic(`invalid sub DAO name, only letters from \"a\" to \"z\", numbers, \"-\" and \"_\" are allowed`)\n\t}\n\n\tif strings.TrimSpace(title) == \"\" {\n\t\tpanic(\"sub DAO title is required\")\n\t}\n\n\tif strings.TrimSpace(manifest) == \"\" {\n\t\tpanic(\"sub DAO manifest is required\")\n\t}\n\n\tif len(members) \u003c minMembersCount {\n\t\tpanic(\"sub DAOs require at least \" + strconv.Itoa(minMembersCount) + \" members\")\n\t}\n\n\treturn subDAOCreationStrategy{\n\t\tchoices: []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo},\n\t\tdaos: daos,\n\t\tname: name,\n\t\ttitle: title,\n\t\tmanifest: manifest,\n\t\tmembers: members,\n\t}\n}\n\ntype subDAOCreationStrategy struct {\n\tchoices []gnome.VoteChoice\n\tdaos daoIndex\n\tname, title, manifest string\n\tmembers []gnome.Member\n}\n\n// Name returns the name of the strategy.\nfunc (subDAOCreationStrategy) Name() string {\n\treturn \"create-sub-dao\"\n}\n\n// Quorum returns the minimum required percentage of DAO member votes\n// required for a proposal to pass.\nfunc (subDAOCreationStrategy) Quorum() float64 {\n\treturn 1.0\n}\n\n// VotingPeriod returns the period that a proposal should allow voting.\nfunc (subDAOCreationStrategy) VotingPeriod() time.Duration {\n\treturn time.Minute * 30\n}\n\n// VoteChoices returns the valid voting choices for the strategy.\nfunc (s subDAOCreationStrategy) VoteChoices() []gnome.VoteChoice {\n\treturn s.choices\n}\n\n// Tally counts the votes and returns the winner voting choice.\nfunc (subDAOCreationStrategy) Tally(dao *gnome.DAO, r gnome.VotingRecord) gnome.VoteChoice {\n\t// Strategy need 100% participation to decide on the outcome.\n\t// Normally quorum should make sure all members voted before\n\t// tallying but otherwise tally should not return a valid outcome.\n\tif len(dao.Members()) != r.VoteCount() {\n\t\treturn gnome.ChoiceNone\n\t}\n\n\t// This type of proposals can pass only when 100% of members vote YES.\n\tfor _, v := range r.Votes() {\n\t\t// If there is at least one NO vote then proposal must be rejected\n\t\tif v.Choice == gnome.ChoiceNo {\n\t\t\treturn gnome.ChoiceNo\n\t\t}\n\t}\n\t// Proposal should pass when all votes are YES\n\treturn gnome.ChoiceYes\n}\n\n// Validate validates if a proposal is valid for the current state.\nfunc (s subDAOCreationStrategy) Validate(p *gnome.Proposal) error {\n\tdao := p.DAO()\n\tpath := dao.Path()\n\tif dao.IsLocked() {\n\t\treturn errors.New(\"parent DAO '\" + path + \"' is locked\")\n\t}\n\n\tsubDAOPath := path + gnome.PathSeparator + s.name\n\tif s.daos.HasPathKey(subDAOPath) {\n\t\treturn errors.New(\"sub DAO path has been taken by another DAO\")\n\t}\n\treturn nil\n}\n\n// RenderParams returns a markdown with the rendered strategy parameters.\nfunc (s subDAOCreationStrategy) RenderParams() string {\n\tvar (\n\t\tb strings.Builder\n\t\tmembers []string\n\t\tmanifest = gnome.EscapeHTML(s.manifest)\n\t)\n\n\tfor _, addr := range s.members {\n\t\tmembers = append(members, addr.String())\n\t}\n\n\t// TODO: Use a custom HTML table and add styling (vertical alignment, padding, ...)\n\t// This would allow to remove the markdown \"hacks\" to improve the output layout\n\tb.WriteString(\"|||\\n|---|---|\\n\")\n\tb.WriteString(\"| Name: | \" + gnome.EscapeHTML(s.name) + \" |\\n\")\n\tb.WriteString(\"| Title: | \" + gnome.EscapeHTML(s.title) + \" |\\n\")\n\tb.WriteString(\"| Members: | \u003c/br\u003e\" + strings.Join(members, \"\u003c/br\u003e\") + \"\u003c/br\u003e\u003c/br\u003e |\\n\")\n\tb.WriteString(\"| Manifest:\u0026nbsp;\u0026nbsp; | \" + strings.ReplaceAll(manifest, \"\\n\", \"\u003c/br\u003e\") + \" |\\n\")\n\n\treturn b.String()\n}\n\n// Execute creates the new sub DAO.\nfunc (s subDAOCreationStrategy) Execute(dao *gnome.DAO) error {\n\tsubDAO, err := gnome.New(s.name, s.title, gnome.WithManifest(s.manifest), gnome.WithMembers(s.members...))\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Add the new sub DAO to its parent\n\tdao.AddSubDAO(subDAO)\n\n\t// Index the new sub DAO\n\ts.daos.IndexByPath(subDAO)\n\n\treturn nil\n}\n\n// PreMarshaler defines an interface to enable JSON pre marshalling support.\nfunc (s subDAOCreationStrategy) PreMarshal() *json.Node {\n\tnode := json.ObjectNode(\"\", nil)\n\tnode.AppendObject(\"name\", json.StringNode(\"name\", s.Name()))\n\tnode.AppendObject(\"daoName\", json.StringNode(\"daoName\", s.name))\n\tnode.AppendObject(\"daoTitle\", json.StringNode(\"daoTitle\", s.title))\n\tnode.AppendObject(\"daoManifest\", json.StringNode(\"daoManifest\", s.title))\n\tnode.AppendObject(\"members\", preMarshalMembers(\"members\", s.members))\n\treturn node\n}\n\nfunc newDAOMembersModificationStrategy(newMembers, removeMembers []gnome.Member) daoMembersModificationStrategy {\n\tif len(newMembers) == 0 \u0026\u0026 len(removeMembers) == 0 {\n\t\tpanic(\"members are required\")\n\t}\n\n\treturn daoMembersModificationStrategy{\n\t\tchoices: []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo},\n\t\tnewMembers: newMembers,\n\t\tremoveMembers: removeMembers,\n\t}\n}\n\ntype daoMembersModificationStrategy struct {\n\tchoices []gnome.VoteChoice\n\tnewMembers, removeMembers []gnome.Member\n}\n\n// Name returns the name of the strategy.\nfunc (daoMembersModificationStrategy) Name() string {\n\treturn \"modify-dao-members\"\n}\n\n// Quorum returns the minimum required percentage of DAO member votes\n// required for a proposal to pass.\nfunc (daoMembersModificationStrategy) Quorum() float64 {\n\treturn 0.51\n}\n\n// VotingPeriod returns the period that a proposal should allow voting.\nfunc (daoMembersModificationStrategy) VotingPeriod() time.Duration {\n\treturn time.Minute * 30\n}\n\n// VoteChoices returns the valid voting choices for the strategy.\nfunc (s daoMembersModificationStrategy) VoteChoices() []gnome.VoteChoice {\n\treturn s.choices\n}\n\n// Tally counts the votes and returns the winner voting choice.\nfunc (daoMembersModificationStrategy) Tally(_ *gnome.DAO, r gnome.VotingRecord) gnome.VoteChoice {\n\t// Tally requires at least three votes to be able to tally by 2/3s super majority\n\tif r.VoteCount() \u003c 3 {\n\t\treturn gnome.ChoiceNone\n\t}\n\n\tif choice, ok := gnome.SelectChoiceBySuperMajority(r); ok {\n\t\treturn choice\n\t}\n\treturn gnome.ChoiceNone\n}\n\n// Validate validates if a proposal is valid for the current DAO state.\nfunc (s daoMembersModificationStrategy) Validate(p *gnome.Proposal) error {\n\t// At least three members are required to enforce 2/3s majority on proposals\n\tdao := p.DAO()\n\tmemberCount := len(dao.Members()) + len(s.newMembers) - len(s.removeMembers)\n\tif memberCount \u003c minMembersCount {\n\t\treturn errors.New(\"DAO must always have a minimum of \" + strconv.Itoa(minMembersCount) + \" members\")\n\t}\n\n\t// TODO: Should we allow re-adding members to only change assigned roles?\n\tfor _, m := range s.newMembers {\n\t\tif dao.HasMember(m.Address) {\n\t\t\treturn errors.New(\"address is already a DAO member: \" + m.Address.String())\n\t\t}\n\t}\n\n\tfor _, m := range s.removeMembers {\n\t\tif !dao.HasMember(m.Address) {\n\t\t\treturn errors.New(\"address is not a DAO member: \" + m.Address.String())\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// Execute modifies main DAO members.\nfunc (s daoMembersModificationStrategy) Execute(dao *gnome.DAO) error {\n\tfor _, m := range s.newMembers {\n\t\tdao.AddMember(m)\n\t}\n\n\tfor _, m := range s.removeMembers {\n\t\tdao.RemoveMember(m.Address)\n\t}\n\n\treturn nil\n}\n\n// RenderParams returns a markdown with the rendered strategy parameters.\nfunc (s daoMembersModificationStrategy) RenderParams() string {\n\tvar b strings.Builder\n\n\tb.WriteString(\"|||\\n|---|---|\\n\")\n\n\tif len(s.newMembers) \u003e 0 {\n\t\tvar members []string\n\t\tfor _, m := range s.newMembers {\n\t\t\tmembers = append(members, m.String())\n\t\t}\n\n\t\tb.WriteString(\"| New Members: | \" + strings.Join(members, \"\u003c/br\u003e\") + \"\u003c/br\u003e\u003c/br\u003e |\\n\")\n\t}\n\n\tif len(s.removeMembers) \u003e 0 {\n\t\tvar members []string\n\t\tfor _, m := range s.removeMembers {\n\t\t\tmembers = append(members, m.String())\n\t\t}\n\n\t\tb.WriteString(\"| Members to Remove: | \" + strings.Join(members, \"\u003c/br\u003e\") + \" |\\n\")\n\t}\n\n\treturn b.String()\n}\n\n// PreMarshaler defines an interface to enable JSON pre marshalling support.\nfunc (s daoMembersModificationStrategy) PreMarshal() *json.Node {\n\tnode := json.ObjectNode(\"\", nil)\n\tnode.AppendObject(\"name\", json.StringNode(\"name\", s.Name()))\n\tnode.AppendObject(\"newMembers\", preMarshalMembers(\"newMembers\", s.newMembers))\n\tnode.AppendObject(\"removeMembers\", preMarshalMembers(\"removeMembers\", s.removeMembers))\n\treturn node\n}\n\nfunc newSubDAODismissalStrategy(dao *gnome.DAO, x proposalIndex) subDAODismissalStrategy {\n\tif dao == nil {\n\t\tpanic(\"DAO is required\")\n\t}\n\n\treturn subDAODismissalStrategy{\n\t\tchoices: []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo},\n\t\tdao: dao,\n\t\tproposals: x,\n\t}\n}\n\ntype subDAODismissalStrategy struct {\n\tchoices []gnome.VoteChoice\n\tdao *gnome.DAO\n\tproposals proposalIndex\n}\n\n// Name returns the name of the strategy.\nfunc (subDAODismissalStrategy) Name() string {\n\treturn \"dismiss-sub-dao\"\n}\n\n// Quorum returns the minimum required percentage of DAO member votes\n// required for a proposal to pass.\nfunc (subDAODismissalStrategy) Quorum() float64 {\n\treturn 0.51\n}\n\n// VotingPeriod returns the period that a proposal should allow voting.\nfunc (subDAODismissalStrategy) VotingPeriod() time.Duration {\n\treturn time.Minute * 30\n}\n\n// VoteChoices returns the valid voting choices for the strategy.\nfunc (s subDAODismissalStrategy) VoteChoices() []gnome.VoteChoice {\n\treturn s.choices\n}\n\n// Tally counts the votes and returns the winner voting choice.\nfunc (subDAODismissalStrategy) Tally(_ *gnome.DAO, r gnome.VotingRecord) gnome.VoteChoice {\n\tif choice, ok := gnome.SelectChoiceByPlurality(r); ok {\n\t\treturn choice\n\t}\n\treturn gnome.ChoiceNone\n}\n\n// Validate validates if a proposal is valid for the current DAO state.\nfunc (s subDAODismissalStrategy) Validate(p *gnome.Proposal) error {\n\tparentDAO := s.dao.Parent()\n\tif parentDAO == nil {\n\t\treturn errors.New(\"the DAO to dismiss has no parent DAO\")\n\t}\n\n\tparentName := p.DAO().Name()\n\tif parentDAO.Name() != parentName {\n\t\treturn errors.New(`the DAO to dismiss must be a first level sub DAO of \"` + parentName + `\"`)\n\t}\n\treturn nil\n}\n\n// Execute modifies main DAO members.\nfunc (s subDAODismissalStrategy) Execute(*gnome.DAO) error {\n\t// Get the list of all sub DAOs and the root DAO to dismiss\n\tdaos := append(s.dao.CollectSubDAOs(), s.dao)\n\t// Proposal dismissal requires a reason\n\t// TODO: Send proposal to Execute and add dismissal proposal link?\n\treason := \"Dismissed because of DAO dismissal: \" + s.dao.Path()\n\n\tfor _, dao := range daos {\n\t\t// Dismiss all proposals for the current DAO\n\t\tfor _, p := range s.proposals.GetAllByDAO(dao.Path()) {\n\t\t\tif !p.Status().IsFinal() {\n\t\t\t\tp.Dismiss(reason)\n\t\t\t}\n\t\t}\n\n\t\t// Lock the DAO to dismiss it\n\t\tdao.Lock(\"\")\n\t}\n\treturn nil\n}\n\n// RenderParams returns a markdown with the rendered strategy parameters.\nfunc (s subDAODismissalStrategy) RenderParams() string {\n\treturn \"DAO: \" + s.dao.Path()\n}\n\n// PreMarshaler defines an interface to enable JSON pre marshalling support.\nfunc (s subDAODismissalStrategy) PreMarshal() *json.Node {\n\tnode := json.ObjectNode(\"\", nil)\n\tnode.AppendObject(\"name\", json.StringNode(\"name\", s.Name()))\n\tnode.AppendObject(\"daoPath\", json.StringNode(\"daoPath\", s.dao.Path()))\n\treturn node\n}\n\nfunc preMarshalMembers(key string, members []gnome.Member) *json.Node {\n\tif members == nil {\n\t\treturn json.NullNode(key)\n\t}\n\n\tnodes := make([]*json.Node, len(members))\n\tfor i, m := range members {\n\t\tnodes[i] = json.ObjectNode(\"\", nil)\n\t\tnodes[i].AppendObject(\"address\", json.StringNode(\"address\", m.Address.String()))\n\n\t\tif m.Roles == nil {\n\t\t\tnodes[i].AppendObject(\"members\", json.NullNode(\"members\"))\n\t\t\tcontinue\n\t\t}\n\n\t\troles := make([]*json.Node, len(m.Roles))\n\t\tfor j, r := range m.Roles {\n\t\t\troles[j] = json.StringNode(\"\", string(r))\n\t\t}\n\t\tnodes[i].AppendObject(\"members\", json.ArrayNode(\"members\", roles))\n\t}\n\treturn json.ArrayNode(key, nodes)\n}\n"},{"name":"strategy_dao_test.gno","body":"package gnome\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\t\"time\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/testutils\"\n\n\tgnome \"gno.land/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao\"\n)\n\nfunc TestSubDAOCreationStrategy(t *testing.T) {\n\tcases := []struct {\n\t\tname, daoName, title, manifest, err string\n\t\tmembers []gnome.Member\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\tdaoName: \"test\",\n\t\t\ttitle: \"Test\",\n\t\t\tmanifest: \"Test manifest\",\n\t\t\tmembers: []gnome.Member{\n\t\t\t\tnewTestMember(t, \"address1\"),\n\t\t\t\tnewTestMember(t, \"address2\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"without name\",\n\t\t\terr: \"sub DAO name is required\",\n\t\t},\n\t\t{\n\t\t\tname: \"invalid name\",\n\t\t\tdaoName: \"invalid name\",\n\t\t\terr: `invalid sub DAO name, only letters from \"a\" to \"z\", numbers, \"-\" and \"_\" are allowed`,\n\t\t},\n\t\t{\n\t\t\tname: \"without title\",\n\t\t\tdaoName: \"test\",\n\t\t\terr: \"sub DAO title is required\",\n\t\t},\n\t\t{\n\t\t\tname: \"without manifest\",\n\t\t\tdaoName: \"test\",\n\t\t\ttitle: \"Test\",\n\t\t\terr: \"sub DAO manifest is required\",\n\t\t},\n\t\t{\n\t\t\tname: \"less than two DAO members\",\n\t\t\tdaoName: \"test\",\n\t\t\ttitle: \"Test\",\n\t\t\tmanifest: \"Test manifest\",\n\t\t\terr: \"sub DAOs require at least two members\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tname := \"create-sub-dao\"\n\t\t\tquorum := 1.0\n\t\t\tvotingPeriod := time.Hour * 24 * 7\n\t\t\tchoices := fmt.Sprintf(\"%v\", []gnome.VoteChoice{\n\t\t\t\tgnome.ChoiceYes,\n\t\t\t\tgnome.ChoiceNo,\n\t\t\t})\n\n\t\t\t// Act\n\t\t\tvar s subDAOCreationStrategy\n\t\t\terr := handlePanic(t, func() {\n\t\t\t\ts = newSubDAOCreationStrategy(daoIndex{}, tc.daoName, tc.title, tc.manifest, tc.members)\n\t\t\t})\n\n\t\t\t// Assert\n\t\t\tif tc.err != \"\" {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tassertNoError(t, err)\n\n\t\t\tif got := s.Name(); got != name {\n\t\t\t\tt.Fatalf(\"expected strategy name: '%s', got: '%s'\", name, got)\n\t\t\t}\n\n\t\t\tif got := s.Quorum(); got != quorum {\n\t\t\t\tt.Fatalf(\"expected strategy quorum: %.2f, got: %.2f\", quorum, got)\n\t\t\t}\n\n\t\t\tif got := s.VotingPeriod(); got != votingPeriod {\n\t\t\t\tt.Fatalf(\"expected strategy voting period: %d, got: %d\", votingPeriod, got)\n\t\t\t}\n\n\t\t\tif got := fmt.Sprintf(\"%v\", s.VoteChoices()); got != choices {\n\t\t\t\tt.Fatalf(\"expected strategy vote choices: %s, got: %s\", choices, got)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestSubDAOCreationStrategyTally(t *testing.T) {\n\tdao := gnome.MustNew(\"main\", \"Main\", gnome.WithMembers(\n\t\tnewTestMember(t, \"member1\"),\n\t\tnewTestMember(t, \"member2\"),\n\t\tnewTestMember(t, \"member3\"),\n\t))\n\tcases := []struct {\n\t\tname string\n\t\tvotes []gnome.Vote\n\t\tchoice gnome.VoteChoice\n\t}{\n\t\t{\n\t\t\tname: \"quorum vote yes\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t},\n\t\t{\n\t\t\tname: \"quorum vote no\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNo,\n\t\t},\n\t\t{\n\t\t\tname: \"quorum with different choices\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNo,\n\t\t},\n\t\t{\n\t\t\tname: \"no quorum\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNone,\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\trecord := gnome.NewVotingRecord()\n\t\t\tfor _, v := range tc.votes {\n\t\t\t\trecord.Add(v)\n\t\t\t}\n\n\t\t\ts := newSubDAOCreationStrategy(daoIndex{}, \"name\", \"Name\", \"Manifest\", []gnome.Member{\n\t\t\t\tnewTestMember(t, \"member1\"),\n\t\t\t\tnewTestMember(t, \"member2\"),\n\t\t\t})\n\n\t\t\t// Act\n\t\t\tchoice := s.Tally(dao, *record)\n\n\t\t\t// Assert\n\t\t\tif choice != tc.choice {\n\t\t\t\tt.Fatalf(\"expected tally result choice: '%v', got: '%v'\", tc.choice, choice)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestSubDAOCreationStrategyValidate(t *testing.T) {\n\tcases := []struct {\n\t\tname, daoName string\n\t\tsetup func(*daoIndex) *gnome.DAO\n\t\terr string\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\tdaoName: \"child\",\n\t\t\tsetup: func(*daoIndex) *gnome.DAO {\n\t\t\t\treturn gnome.MustNew(\"parent\", \"Parent\")\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"existing name\",\n\t\t\tdaoName: \"child\",\n\t\t\tsetup: func(x *daoIndex) *gnome.DAO {\n\t\t\t\tchild := gnome.MustNew(\"child\", \"Child\")\n\t\t\t\tdao := gnome.MustNew(\"parent\", \"Parent\", gnome.WithSubDAO(child))\n\t\t\t\tx.IndexByPath(child)\n\t\t\t\treturn dao\n\t\t\t},\n\t\t\terr: \"sub DAO path has been taken by another DAO\",\n\t\t},\n\t\t{\n\t\t\tname: \"locked parent\",\n\t\t\tdaoName: \"child\",\n\t\t\tsetup: func(*daoIndex) *gnome.DAO {\n\t\t\t\tdao := gnome.MustNew(\"parent\", \"Parent\")\n\t\t\t\tdao.Lock(\"\")\n\t\t\t\treturn dao\n\t\t\t},\n\t\t\terr: \"parent DAO 'parent' is locked\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tx := daoIndex{}\n\t\t\tdao := tc.setup(\u0026x)\n\t\t\tmembers := []gnome.Member{\n\t\t\t\tnewTestMember(t, \"member1\"),\n\t\t\t\tnewTestMember(t, \"member2\"),\n\t\t\t}\n\t\t\ts := newSubDAOCreationStrategy(x, tc.daoName, \"Title\", \"Manifest\", members)\n\t\t\tp, _ := gnome.NewProposal(1, s, members[0].Address, dao, \"Title\")\n\n\t\t\t// Act\n\t\t\terr := s.Validate(p)\n\n\t\t\t// Assert\n\t\t\tif tc.err != \"\" {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t} else {\n\t\t\t\tassertNoError(t, err)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestSubDAOCreationStrategyExecute(t *testing.T) {\n\t// Arrange\n\tdao := gnome.MustNew(\"name\", \"Name\")\n\tsubName := \"sub\"\n\ttitle := \"Sub DAO\"\n\tmanifest := \"Test manifest\"\n\n\ts := newSubDAOCreationStrategy(daoIndex{}, subName, title, manifest, []gnome.Member{\n\t\tnewTestMember(t, \"member1\"),\n\t\tnewTestMember(t, \"member2\"),\n\t})\n\tmembers := fmt.Sprintf(\"%v\", s.members)\n\n\t// Act\n\terr := s.Execute(dao)\n\n\t// Assert\n\tassertNoError(t, err)\n\n\tsubDAOs := dao.SubDAOs()\n\tif c := len(subDAOs); c != 1 {\n\t\tt.Fatalf(\"expected one sub DAO, got: %d\", c)\n\t}\n\n\tsubDAO := subDAOs[0]\n\tif got := subDAO.Name(); got != subName {\n\t\tt.Fatalf(\"expected sub DAO name: '%s', got: '%s'\", subName, got)\n\t}\n\n\tif got := subDAO.Title(); got != title {\n\t\tt.Fatalf(\"expected sub DAO title: '%s', got: '%s'\", title, got)\n\t}\n\n\tif got := subDAO.Manifest(); got != manifest {\n\t\tt.Fatalf(\"expected sub DAO manifest: '%s', got: '%d'\", manifest, got)\n\t}\n\n\tif got := fmt.Sprintf(\"%v\", subDAO.Members()); got != members {\n\t\tt.Fatalf(\"expected sub DAO members: '%s', got: '%s'\", members, got)\n\t}\n}\n\nfunc TestModifyDAOMembersStrategy(t *testing.T) {\n\tcases := []struct {\n\t\tname string\n\t\tnewMembers, removeMembers []gnome.Member\n\t\terr string\n\t}{\n\t\t{\n\t\t\tname: \"new and remove members\",\n\t\t\tnewMembers: []gnome.Member{\n\t\t\t\tnewTestMember(t, \"address1\"),\n\t\t\t},\n\t\t\tremoveMembers: []gnome.Member{\n\t\t\t\tnewTestMember(t, \"address2\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"new members only\",\n\t\t\tnewMembers: []gnome.Member{\n\t\t\t\tnewTestMember(t, \"address1\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"remove members only\",\n\t\t\tremoveMembers: []gnome.Member{\n\t\t\t\tnewTestMember(t, \"address1\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"no members\",\n\t\t\terr: \"members are required\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tname := \"modify-dao-members\"\n\t\t\tquorum := 0.51\n\t\t\tvotingPeriod := time.Hour * 24 * 7\n\t\t\tchoices := fmt.Sprintf(\"%v\", []gnome.VoteChoice{\n\t\t\t\tgnome.ChoiceYes,\n\t\t\t\tgnome.ChoiceNo,\n\t\t\t})\n\n\t\t\t// Act\n\t\t\tvar s daoMembersModificationStrategy\n\t\t\terr := handlePanic(t, func() {\n\t\t\t\ts = newDAOMembersModificationStrategy(tc.newMembers, tc.removeMembers)\n\t\t\t})\n\n\t\t\t// Assert\n\t\t\tif tc.err != \"\" {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tassertNoError(t, err)\n\n\t\t\tif got := s.Name(); got != name {\n\t\t\t\tt.Fatalf(\"expected strategy name: '%s', got: '%s'\", name, got)\n\t\t\t}\n\n\t\t\tif got := s.Quorum(); got != quorum {\n\t\t\t\tt.Fatalf(\"expected strategy quorum: %.2f, got: %.2f\", quorum, got)\n\t\t\t}\n\n\t\t\tif got := s.VotingPeriod(); got != votingPeriod {\n\t\t\t\tt.Fatalf(\"expected strategy voting period: %d, got: %d\", votingPeriod, got)\n\t\t\t}\n\n\t\t\tif got := fmt.Sprintf(\"%v\", s.VoteChoices()); got != choices {\n\t\t\t\tt.Fatalf(\"expected strategy vote choices: %s, got: %s\", choices, got)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestModifyDAOMembersStrategyTally(t *testing.T) {\n\tcases := []struct {\n\t\tname string\n\t\tvotes []gnome.Vote\n\t\tchoice gnome.VoteChoice\n\t}{\n\t\t{\n\t\t\tname: \"super majority votes yes\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t},\n\t\t{\n\t\t\tname: \"super majority votes no\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNo,\n\t\t},\n\t\t{\n\t\t\tname: \"no majority\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNone,\n\t\t},\n\t\t{\n\t\t\tname: \"no quorum\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNone,\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\trecord := gnome.NewVotingRecord()\n\t\t\tfor _, v := range tc.votes {\n\t\t\t\trecord.Add(v)\n\t\t\t}\n\n\t\t\ts := newDAOMembersModificationStrategy(\n\t\t\t\t[]gnome.Member{newTestMember(t, \"member5\")},\n\t\t\t\t[]gnome.Member{newTestMember(t, \"member2\")},\n\t\t\t)\n\n\t\t\t// Act\n\t\t\tchoice := s.Tally(nil, *record)\n\n\t\t\t// Assert\n\t\t\tif choice != tc.choice {\n\t\t\t\tt.Fatalf(\"expected tally result choice: '%v', got: '%v'\", tc.choice, choice)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestModifyDAOMembersStrategyValidate(t *testing.T) {\n\tmember5 := newTestMember(t, \"member5\")\n\tmembers := []gnome.Member{\n\t\tnewTestMember(t, \"member1\"),\n\t\tnewTestMember(t, \"member2\"),\n\t\tnewTestMember(t, \"member3\"),\n\t\tnewTestMember(t, \"member4\"),\n\t}\n\n\tcases := []struct {\n\t\tname string\n\t\tnewMembers, removeMembers []gnome.Member\n\t\tsetup func() *gnome.DAO\n\t\terr string\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\tnewMembers: []gnome.Member{member5},\n\t\t\tsetup: func() *gnome.DAO {\n\t\t\t\tdao := gnome.MustNew(\"main\", \"Main\", gnome.WithMembers(members...))\n\t\t\t\tgnome.MustNew(\"council\", \"Council\", gnome.AssignAsSuperCouncil(), gnome.WithSubDAO(dao))\n\t\t\t\treturn dao\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"less than three members\",\n\t\t\tnewMembers: []gnome.Member{member5},\n\t\t\tremoveMembers: members[1:],\n\t\t\tsetup: func() *gnome.DAO {\n\t\t\t\tdao := gnome.MustNew(\"main\", \"Main\", gnome.WithMembers(members...))\n\t\t\t\tgnome.MustNew(\"council\", \"Council\", gnome.AssignAsSuperCouncil(), gnome.WithSubDAO(dao))\n\t\t\t\treturn dao\n\t\t\t},\n\t\t\terr: \"main DAO must always have a minimum of three members\",\n\t\t},\n\t\t{\n\t\t\tname: \"add existing member\",\n\t\t\tnewMembers: []gnome.Member{members[0]},\n\t\t\tsetup: func() *gnome.DAO {\n\t\t\t\tdao := gnome.MustNew(\"main\", \"Main\", gnome.WithMembers(members...))\n\t\t\t\tgnome.MustNew(\"council\", \"Council\", gnome.AssignAsSuperCouncil(), gnome.WithSubDAO(dao))\n\t\t\t\treturn dao\n\t\t\t},\n\t\t\terr: \"address is already a DAO member: \" + members[0].String(),\n\t\t},\n\t\t{\n\t\t\tname: \"remove unexisting member\",\n\t\t\tremoveMembers: []gnome.Member{member5},\n\t\t\tsetup: func() *gnome.DAO {\n\t\t\t\tdao := gnome.MustNew(\"main\", \"Main\", gnome.WithMembers(members...))\n\t\t\t\tgnome.MustNew(\"council\", \"Council\", gnome.AssignAsSuperCouncil(), gnome.WithSubDAO(dao))\n\t\t\t\treturn dao\n\t\t\t},\n\t\t\terr: \"address is not a DAO member: \" + member5.String(),\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tdao := tc.setup()\n\t\t\ts := newDAOMembersModificationStrategy(tc.newMembers, tc.removeMembers)\n\t\t\tp, _ := gnome.NewProposal(1, s, members[0].Address, dao, \"Title\")\n\n\t\t\t// Act\n\t\t\terr := s.Validate(p)\n\n\t\t\t// Assert\n\t\t\tif tc.err != \"\" {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t} else {\n\t\t\t\tassertNoError(t, err)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestModifyDAOMembersStrategyExecute(t *testing.T) {\n\t// Arrange\n\tdao := gnome.MustNew(\"main\", \"Main\", gnome.WithMembers(\n\t\tnewTestMember(t, \"member1\"),\n\t\tnewTestMember(t, \"member2\"),\n\t\tnewTestMember(t, \"member3\"),\n\t\tnewTestMember(t, \"member4\"),\n\t))\n\tnewMembers := []gnome.Member{\n\t\tnewTestMember(t, \"member5\"),\n\t\tnewTestMember(t, \"member6\"),\n\t}\n\tremoveMembers := dao.Members()[1:3]\n\ts := newDAOMembersModificationStrategy(newMembers, removeMembers)\n\n\t// Act\n\terr := s.Execute(dao)\n\n\t// Assert\n\tassertNoError(t, err)\n\n\tif c := len(dao.Members()); c != 4 {\n\t\tt.Fatalf(\"expected DAO to have 4 members, got: %d\", c)\n\t}\n\n\tfor _, m := range newMembers {\n\t\tif !dao.HasMember(m.Address) {\n\t\t\tt.Fatalf(\"expected member %s to be added to the DAO\", m.Address)\n\t\t}\n\t}\n\n\tfor _, m := range removeMembers {\n\t\tif dao.HasMember(m.Address) {\n\t\t\tt.Fatalf(\"expected member %s to be removed from the DAO\", m.Address)\n\t\t}\n\t}\n}\n\nfunc TestSubDAODismissalStrategy(t *testing.T) {\n\tcases := []struct {\n\t\tname string\n\t\tdao *gnome.DAO\n\t\terr string\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\tdao: gnome.MustNew(\"dao\", \"DAO\"),\n\t\t},\n\t\t{\n\t\t\tname: \"no DAO\",\n\t\t\terr: \"DAO is required\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tname := \"dismiss-sub-dao\"\n\t\t\tquorum := 0.51\n\t\t\tvotingPeriod := time.Hour * 24 * 7\n\t\t\tchoices := fmt.Sprintf(\"%v\", []gnome.VoteChoice{\n\t\t\t\tgnome.ChoiceYes,\n\t\t\t\tgnome.ChoiceNo,\n\t\t\t})\n\n\t\t\t// Act\n\t\t\tvar s subDAODismissalStrategy\n\t\t\terr := handlePanic(t, func() {\n\t\t\t\ts = newSubDAODismissalStrategy(tc.dao, proposalIndex{})\n\t\t\t})\n\n\t\t\t// Assert\n\t\t\tif tc.err != \"\" {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tassertNoError(t, err)\n\n\t\t\tif got := s.Name(); got != name {\n\t\t\t\tt.Fatalf(\"expected strategy name: '%s', got: '%s'\", name, got)\n\t\t\t}\n\n\t\t\tif got := s.Quorum(); got != quorum {\n\t\t\t\tt.Fatalf(\"expected strategy quorum: %.2f, got: %.2f\", quorum, got)\n\t\t\t}\n\n\t\t\tif got := s.VotingPeriod(); got != votingPeriod {\n\t\t\t\tt.Fatalf(\"expected strategy voting period: %d, got: %d\", votingPeriod, got)\n\t\t\t}\n\n\t\t\tif got := fmt.Sprintf(\"%v\", s.VoteChoices()); got != choices {\n\t\t\t\tt.Fatalf(\"expected strategy vote choices: %s, got: %s\", choices, got)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestSubDAODismissalStrategyTally(t *testing.T) {\n\tcases := []struct {\n\t\tname string\n\t\tvotes []gnome.Vote\n\t\tchoice gnome.VoteChoice\n\t}{\n\t\t{\n\t\t\tname: \"yes with one vote\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t},\n\t\t{\n\t\t\tname: \"no with one vote\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNo,\n\t\t},\n\t\t{\n\t\t\tname: \"yes with multiple votes\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t},\n\t\t{\n\t\t\tname: \"no with multiple votes\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNo,\n\t\t},\n\t\t{\n\t\t\tname: \"tie\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNone,\n\t\t},\n\t\t{\n\t\t\tname: \"tie with multiple votes\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNone,\n\t\t},\n\t\t{\n\t\t\tname: \"no votes\",\n\t\t\tchoice: gnome.ChoiceNone,\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tsubDAO := gnome.MustNew(\"sub\", \"Sub DAO\")\n\t\t\trecord := gnome.NewVotingRecord()\n\t\t\tfor _, v := range tc.votes {\n\t\t\t\trecord.Add(v)\n\t\t\t}\n\n\t\t\ts := newSubDAODismissalStrategy(subDAO, proposalIndex{})\n\n\t\t\t// Act\n\t\t\tchoice := s.Tally(nil, *record)\n\n\t\t\t// Assert\n\t\t\tif choice != tc.choice {\n\t\t\t\tt.Fatalf(\"expected tally result choice: '%v', got: '%v'\", tc.choice, choice)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestSubDAODismissalStrategyValidate(t *testing.T) {\n\tparentDAO := gnome.MustNew(\"parent\", \"Parent\")\n\tcases := []struct {\n\t\tname string\n\t\tsetup func(parent *gnome.DAO) (child *gnome.DAO)\n\t\terr string\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\tsetup: func(dao *gnome.DAO) *gnome.DAO {\n\t\t\t\tchild := gnome.MustNew(\"child\", \"Child\")\n\t\t\t\tdao.AddSubDAO(child)\n\t\t\t\treturn child\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"dismiss non child DAO\",\n\t\t\tsetup: func(*gnome.DAO) *gnome.DAO {\n\t\t\t\tchild := gnome.MustNew(\"child\", \"Child\")\n\t\t\t\tgnome.MustNew(\"foo\", \"Foo\", gnome.WithSubDAO(child))\n\t\t\t\treturn child\n\t\t\t},\n\t\t\terr: `the DAO to dismiss must be a first level sub DAO of \"` + parentDAO.Name() + `\"`,\n\t\t},\n\t\t{\n\t\t\tname: \"parent DAO not found\",\n\t\t\tsetup: func(*gnome.DAO) *gnome.DAO {\n\t\t\t\treturn gnome.MustNew(\"child\", \"Child\")\n\t\t\t},\n\t\t\terr: \"the DAO to dismiss has no parent DAO\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tchildDAO := tc.setup(parentDAO)\n\t\t\ts := newSubDAODismissalStrategy(childDAO, proposalIndex{})\n\t\t\tp, _ := gnome.NewProposal(1, s, testutils.TestAddress(\"member\"), parentDAO, \"Dismiss child DAO\")\n\n\t\t\t// Act\n\t\t\terr := s.Validate(p)\n\n\t\t\t// Assert\n\t\t\tif tc.err != \"\" {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t} else {\n\t\t\t\tassertNoError(t, err)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestSubDAODismissalStrategyExecute(t *testing.T) {\n\t// Arrange\n\tvar (\n\t\tstrategy testStrategy\n\t\tproposals proposalIndex\n\t)\n\n\tcaller := testutils.TestAddress(\"caller\")\n\n\tthreeDAO := gnome.MustNew(\"three\", \"Three\")\n\ttwoDAO := gnome.MustNew(\"two\", \"Two\")\n\toneDAO := gnome.MustNew(\"one\", \"One\", gnome.WithSubDAO(twoDAO), gnome.WithSubDAO(threeDAO))\n\trootDAO := gnome.MustNew(\"root\", \"Root\", gnome.WithSubDAO(oneDAO))\n\n\tp, _ := gnome.NewProposal(1, strategy, caller, rootDAO, \"Root\")\n\tproposals.Index(p)\n\n\tp, _ = gnome.NewProposal(2, strategy, caller, oneDAO, \"One\")\n\tproposals.Index(p)\n\n\tp, _ = gnome.NewProposal(3, strategy, caller, twoDAO, \"Two\")\n\tproposals.Index(p)\n\n\tp, _ = gnome.NewProposal(4, strategy, caller, threeDAO, \"Thee\")\n\tproposals.Index(p)\n\n\tdismissReason := \"Dismissed because of DAO dismissal: \" + rootDAO.Name()\n\tdaos := []*gnome.DAO{rootDAO, oneDAO, twoDAO, threeDAO}\n\ts := newSubDAODismissalStrategy(rootDAO, proposals)\n\n\t// Act\n\terr := s.Execute(nil)\n\n\t// Assert\n\tassertNoError(t, err)\n\n\tfor _, dao := range daos {\n\t\tif !dao.IsLocked() {\n\t\t\tt.Fatalf(\"expected DAO '%s' to be locked\", dao.Title())\n\t\t}\n\t}\n\n\tproposals.Iterate(func(p *gnome.Proposal) bool {\n\t\tif got := p.Status(); got != gnome.StatusDismissed {\n\t\t\tt.Fatalf(\"expected proposal '%s' status to be 'dismissed', got: '%s'\", p.Title(), got.String())\n\t\t}\n\n\t\tif got := p.StatusReason(); got != dismissReason {\n\t\t\tt.Fatalf(\"expected dismiss reason '%s', got: '%s'\", dismissReason, got)\n\t\t}\n\t\treturn false\n\t})\n}\n\ntype testStrategy struct{}\n\nfunc (testStrategy) Name() string { return \"test\" }\nfunc (testStrategy) Quorum() float64 { return 0.51 }\nfunc (testStrategy) VotingPeriod() time.Duration { return time.Hour * 24 * 2 }\nfunc (testStrategy) VoteChoices() []gnome.VoteChoice { return []gnome.VoteChoice{gnome.ChoiceYes} }\nfunc (s testStrategy) Tally(*gnome.DAO, gnome.VotingRecord) gnome.VoteChoice { return gnome.ChoiceYes }\n\nfunc newTestMember(t *testing.T, name string) gnome.Member {\n\tt.Helper()\n\treturn gnome.NewMember(testutils.TestAddress(name))\n}\n"},{"name":"strategy_general.gno","body":"package gnome\n\nimport (\n\t\"errors\"\n\t\"std\"\n\t\"strings\"\n\t\"time\"\n\n\t\"gno.land/p/demo/json\"\n\n\tgnome \"gno.land/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao\"\n)\n\n// newGeneralStrategy creates a new general proposal strategy.\n// This type of proposal is not executable so it doesn't modify the DAO state when proposal passes.\nfunc newGeneralStrategy() generalStrategy {\n\treturn generalStrategy{\n\t\tchoices: []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo},\n\t}\n}\n\ntype generalStrategy struct {\n\tchoices []gnome.VoteChoice\n}\n\n// Name returns the name of the strategy.\nfunc (generalStrategy) Name() string {\n\treturn \"general\"\n}\n\n// Quorum returns the minimum required percentage of DAO member votes\n// required for a proposal to pass.\nfunc (generalStrategy) Quorum() float64 {\n\treturn 0.51\n}\n\n// VotingPeriod returns the period that a proposal should allow voting.\nfunc (generalStrategy) VotingPeriod() time.Duration {\n\treturn time.Minute * 30\n}\n\n// VoteChoices returns the valid voting choices for the strategy.\nfunc (s generalStrategy) VoteChoices() []gnome.VoteChoice {\n\treturn s.choices\n}\n\n// CheckVote checks that a vote is valid for the strategy.\nfunc (s generalStrategy) CheckVote(_ std.Address, choice gnome.VoteChoice, reason string) error {\n\t// Reason is required when voting NO on standard proposals\n\tif choice == gnome.ChoiceNo \u0026\u0026 reason == \"\" {\n\t\treturn errors.New(\"reason is required when voting NO in standard proposals\")\n\t}\n\treturn nil\n}\n\n// Tally counts the votes and returns the winner voting choice.\nfunc (generalStrategy) Tally(dao *gnome.DAO, r gnome.VotingRecord) gnome.VoteChoice {\n\t// Consider abstentions to make the majority absolute\n\tabstentions := len(dao.Members()) - r.VoteCount()\n\tif choice, ok := gnome.SelectChoiceByMajority(r, abstentions); ok {\n\t\treturn choice\n\t}\n\treturn gnome.ChoiceNone\n}\n\n// Validate validates if a proposal is valid for the current DAO state.\nfunc (generalStrategy) Validate(p *gnome.Proposal) error {\n\tif strings.TrimSpace(p.Description()) == \"\" {\n\t\treturn errors.New(\"proposal description is required\")\n\t}\n\treturn nil\n}\n\n// PreMarshaler defines an interface to enable JSON pre marshalling support.\nfunc (s generalStrategy) PreMarshal() *json.Node {\n\treturn json.ObjectNode(\"\", map[string]*json.Node{\n\t\t\"name\": json.StringNode(\"name\", s.Name()),\n\t})\n}\n"},{"name":"strategy_general_test.gno","body":"package gnome\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\t\"time\"\n\n\tgnome \"gno.land/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao\"\n)\n\nfunc TestGeneralStrategy(t *testing.T) {\n\t// Arrange\n\tname := \"general\"\n\tquorum := 0.51\n\tvotingPeriod := time.Hour * 24 * 2\n\tchoices := fmt.Sprintf(\"%v\", []gnome.VoteChoice{\n\t\tgnome.ChoiceYes,\n\t\tgnome.ChoiceNo,\n\t})\n\n\t// Act\n\ts := newGeneralStrategy()\n\n\t// Assert\n\tif got := s.Name(); got != name {\n\t\tt.Fatalf(\"expected strategy name: '%s', got: '%s'\", name, got)\n\t}\n\n\tif got := s.Quorum(); got != quorum {\n\t\tt.Fatalf(\"expected strategy quorum: %.2f, got: %.2f\", quorum, got)\n\t}\n\n\tif got := s.VotingPeriod(); got != votingPeriod {\n\t\tt.Fatalf(\"expected strategy voting period: %d, got: %d\", votingPeriod, got)\n\t}\n\n\tif got := fmt.Sprintf(\"%v\", s.VoteChoices()); got != choices {\n\t\tt.Fatalf(\"expected strategy vote choices: %s, got: %s\", choices, got)\n\t}\n}\n\nfunc TestGeneralStrategyCheckVote(t *testing.T) {\n\tcases := []struct {\n\t\tname string\n\t\tchoice gnome.VoteChoice\n\t\treason, err string\n\t}{\n\t\t{\n\t\t\tname: \"yes\",\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t},\n\t\t{\n\t\t\tname: \"yes with reason\",\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t\treason: \"foo bar\",\n\t\t},\n\t\t{\n\t\t\tname: \"no with reason\",\n\t\t\tchoice: gnome.ChoiceNo,\n\t\t\treason: \"foo bar\",\n\t\t},\n\t\t{\n\t\t\tname: \"no with invalid reason\",\n\t\t\tchoice: gnome.ChoiceNo,\n\t\t\terr: \"reason is required when voting NO in standard proposals\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\ts := newGeneralStrategy()\n\n\t\t\t// Act\n\t\t\terr := s.CheckVote(\"\", tc.choice, tc.reason)\n\n\t\t\t// Assert\n\t\t\tif tc.err != \"\" {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t} else {\n\t\t\t\tassertNoError(t, err)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestGeneralStrategyTally(t *testing.T) {\n\tdao := gnome.MustNew(\"test\", \"Test\", gnome.WithMembers(\n\t\tnewTestMember(t, \"member1\"),\n\t\tnewTestMember(t, \"member2\"),\n\t\tnewTestMember(t, \"member3\"),\n\t\tnewTestMember(t, \"member4\"),\n\t))\n\tcases := []struct {\n\t\tname string\n\t\tvotes []gnome.Vote\n\t\tchoice gnome.VoteChoice\n\t}{\n\t\t{\n\t\t\tname: \"majority\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t},\n\t\t{\n\t\t\tname: \"majority with abstentions\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNo,\n\t\t},\n\t\t{\n\t\t\tname: \"no quorum\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNone,\n\t\t},\n\t\t{\n\t\t\tname: \"no quorum with abstentions\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNone,\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\trecord := gnome.NewVotingRecord()\n\t\t\tfor _, v := range tc.votes {\n\t\t\t\trecord.Add(v)\n\t\t\t}\n\n\t\t\ts := newGeneralStrategy()\n\n\t\t\t// Act\n\t\t\tchoice := s.Tally(dao, *record)\n\n\t\t\t// Assert\n\t\t\tif choice != tc.choice {\n\t\t\t\tt.Fatalf(\"expected tally result choice: '%v', got: '%v'\", tc.choice, choice)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc assertError(t *testing.T, expected interface{}, actual error) {\n\tt.Helper()\n\n\twant, ok := expected.(string)\n\tif !ok {\n\t\tif err, ok := expected.(error); ok {\n\t\t\twant = err.Error()\n\t\t}\n\t}\n\n\tif actual == nil {\n\t\tt.Fatalf(\"expected error: '%s', got no error\", want)\n\t}\n\n\tif want != actual.Error() {\n\t\tt.Fatalf(\"expected error: '%s', got: '%s'\", want, actual.Error())\n\t}\n}\n\nfunc assertNoError(t *testing.T, err interface{}) {\n\tt.Helper()\n\n\tif err == nil {\n\t\treturn\n\t}\n\n\tactual, ok := err.(string)\n\tif !ok {\n\t\tif e, ok := err.(error); ok {\n\t\t\tactual = e.Error()\n\t\t}\n\t}\n\n\tif actual != \"\" {\n\t\tt.Fatalf(\"expected no error, got: '%s'\", actual)\n\t}\n}\n"},{"name":"strategy_lock.gno","body":"package gnome\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"time\"\n\n\t\"gno.land/p/demo/json\"\n\n\tgnome \"gno.land/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao\"\n)\n\n// newLockingStrategy creates a new DAO locking proposal strategy.\nfunc newLockingStrategy(council *gnome.DAO, reason string, preLockFn func() error) lockingStrategy {\n\t// Locking should only be done in the council DAO\n\tif !council.IsSuperCouncil() {\n\t\tpanic(\"DAO is not the council\")\n\t}\n\n\treturn lockingStrategy{\n\t\tchoices: []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo},\n\t\tcouncil: council,\n\t\treason: reason,\n\t\tpreLockFn: preLockFn,\n\t}\n}\n\ntype lockingStrategy struct {\n\tchoices []gnome.VoteChoice\n\tcouncil *gnome.DAO\n\treason string\n\tpreLockFn func() error\n}\n\n// Name returns the name of the strategy.\nfunc (lockingStrategy) Name() string {\n\treturn \"locking\"\n}\n\n// Quorum returns the minimum required percentage of DAO member votes\n// required for a proposal to pass.\nfunc (lockingStrategy) Quorum() float64 {\n\treturn 0.26\n}\n\n// VotingPeriod returns the period that a proposal should allow voting.\nfunc (lockingStrategy) VotingPeriod() time.Duration {\n\treturn time.Minute * 30\n}\n\n// VoteChoices returns the valid voting choices for the strategy.\nfunc (s lockingStrategy) VoteChoices() []gnome.VoteChoice {\n\treturn s.choices\n}\n\n// Tally counts the votes and returns the winner voting choice.\nfunc (lockingStrategy) Tally(_ *gnome.DAO, r gnome.VotingRecord) gnome.VoteChoice {\n\tif choice, ok := gnome.SelectChoiceByPlurality(r); ok {\n\t\treturn choice\n\t}\n\treturn gnome.ChoiceNone\n}\n\n// Validate validates if a proposal is valid for the current state.\nfunc (s lockingStrategy) Validate(*gnome.Proposal) error {\n\tif s.council.IsLocked() {\n\t\treturn errors.New(\"council DAO is already locked\")\n\t}\n\treturn nil\n}\n\n// Execute locks the council DAO.\nfunc (s lockingStrategy) Execute(*gnome.DAO) (err error) {\n\tif s.preLockFn != nil {\n\t\tif err := s.preLockFn(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\ts.council.Lock(s.reason)\n\treturn nil\n}\n\n// RenderParams returns a markdown with the rendered strategy parameters.\nfunc (s lockingStrategy) RenderParams() string {\n\tvar b strings.Builder\n\n\tb.WriteString(\"|||\\n|---|---|\\n\")\n\tb.WriteString(\"| Reason: | \" + gnome.EscapeHTML(s.reason) + \" |\\n\")\n\n\treturn b.String()\n}\n\n// PreMarshaler defines an interface to enable JSON pre marshalling support.\nfunc (s lockingStrategy) PreMarshal() *json.Node {\n\tnode := json.ObjectNode(\"\", nil)\n\tnode.AppendObject(\"name\", json.StringNode(\"name\", s.Name()))\n\tnode.AppendObject(\"reason\", json.StringNode(\"reason\", s.reason))\n\treturn node\n}\n"},{"name":"strategy_lock_test.gno","body":"package gnome\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"testing\"\n\t\"time\"\n\n\tgnome \"gno.land/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao\"\n)\n\nfunc TestLockingStrategy(t *testing.T) {\n\tcases := []struct {\n\t\tname, err string\n\t\tsetup func() *gnome.DAO\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\tsetup: func() *gnome.DAO {\n\t\t\t\treturn gnome.MustNew(\"council\", \"Council\", gnome.AssignAsSuperCouncil())\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"dao is not council\",\n\t\t\tsetup: func() *gnome.DAO {\n\t\t\t\treturn gnome.MustNew(\"council\", \"Council\")\n\t\t\t},\n\t\t\terr: \"DAO is not the council\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tname := \"locking\"\n\t\t\tquorum := 0.26\n\t\t\tvotingPeriod := time.Hour * 24 * 2\n\t\t\tchoices := fmt.Sprintf(\"%v\", []gnome.VoteChoice{\n\t\t\t\tgnome.ChoiceYes,\n\t\t\t\tgnome.ChoiceNo,\n\t\t\t})\n\t\t\tcouncilDAO := tc.setup()\n\n\t\t\t// Act\n\t\t\tvar s lockingStrategy\n\t\t\terr := handlePanic(t, func() {\n\t\t\t\ts = newLockingStrategy(councilDAO, \"\", nil)\n\t\t\t})\n\n\t\t\t// Assert\n\t\t\tif tc.err != \"\" {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tassertNoError(t, err)\n\n\t\t\tif got := s.Name(); got != name {\n\t\t\t\tt.Fatalf(\"expected strategy name: '%s', got: '%s'\", name, got)\n\t\t\t}\n\n\t\t\tif got := s.Quorum(); got != quorum {\n\t\t\t\tt.Fatalf(\"expected strategy quorum: %.2f, got: %.2f\", quorum, got)\n\t\t\t}\n\n\t\t\tif got := s.VotingPeriod(); got != votingPeriod {\n\t\t\t\tt.Fatalf(\"expected strategy voting period: %d, got: %d\", votingPeriod, got)\n\t\t\t}\n\n\t\t\tif got := fmt.Sprintf(\"%v\", s.VoteChoices()); got != choices {\n\t\t\t\tt.Fatalf(\"expected strategy vote choices: %s, got: %s\", choices, got)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestLockingStrategyTally(t *testing.T) {\n\tcouncilDAO := gnome.MustNew(\"council\", \"Council\", gnome.AssignAsSuperCouncil())\n\tcases := []struct {\n\t\tname string\n\t\tvotes []gnome.Vote\n\t\tchoice gnome.VoteChoice\n\t}{\n\t\t{\n\t\t\tname: \"yes with one vote\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t},\n\t\t{\n\t\t\tname: \"no with one vote\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNo,\n\t\t},\n\t\t{\n\t\t\tname: \"yes with multiple votes\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t},\n\t\t{\n\t\t\tname: \"no with multiple votes\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNo,\n\t\t},\n\t\t{\n\t\t\tname: \"tie\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNone,\n\t\t},\n\t\t{\n\t\t\tname: \"tie with multiple votes\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNone,\n\t\t},\n\t\t{\n\t\t\tname: \"no votes\",\n\t\t\tchoice: gnome.ChoiceNone,\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\trecord := gnome.NewVotingRecord()\n\t\t\tfor _, v := range tc.votes {\n\t\t\t\trecord.Add(v)\n\t\t\t}\n\n\t\t\ts := newLockingStrategy(councilDAO, \"\", nil)\n\n\t\t\t// Act\n\t\t\tchoice := s.Tally(nil, *record)\n\n\t\t\t// Assert\n\t\t\tif choice != tc.choice {\n\t\t\t\tt.Fatalf(\"expected tally result choice: '%v', got: '%v'\", tc.choice, choice)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestLockingStrategyValidate(t *testing.T) {\n\tcases := []struct {\n\t\tname string\n\t\tsetup func(*gnome.DAO)\n\t\terr string\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t},\n\t\t{\n\t\t\tname: \"locked council DAO\",\n\t\t\tsetup: func(councilDAO *gnome.DAO) {\n\t\t\t\tcouncilDAO.Lock(\"\")\n\t\t\t},\n\t\t\terr: \"council DAO is already locked\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tcouncilDAO := gnome.MustNew(\"council\", \"Council\", gnome.AssignAsSuperCouncil())\n\t\t\tif tc.setup != nil {\n\t\t\t\ttc.setup(councilDAO)\n\t\t\t}\n\n\t\t\ts := newLockingStrategy(councilDAO, \"\", nil)\n\n\t\t\t// Act\n\t\t\terr := s.Validate(nil)\n\n\t\t\t// Assert\n\t\t\tif tc.err != \"\" {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t} else {\n\t\t\t\tassertNoError(t, err)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestLockingStrategyExecute(t *testing.T) {\n\tcases := []struct {\n\t\tname, reason, err string\n\t\tsetup func(*gnome.DAO)\n\t\tpreLockErr error\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\treason: \"Lock reason\",\n\t\t},\n\t\t{\n\t\t\tname: \"pre lock function error\",\n\t\t\tpreLockErr: errors.New(\"test error\"),\n\t\t\terr: \"test error\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tcouncilDAO := gnome.MustNew(\"council\", \"Council\", gnome.AssignAsSuperCouncil())\n\t\t\tif tc.setup != nil {\n\t\t\t\ttc.setup(councilDAO)\n\t\t\t}\n\n\t\t\tvar (\n\t\t\t\tpreLockFnCalled bool\n\n\t\t\t\ts = newLockingStrategy(councilDAO, tc.reason, func() error {\n\t\t\t\t\tpreLockFnCalled = true\n\t\t\t\t\treturn tc.preLockErr\n\t\t\t\t})\n\t\t\t)\n\n\t\t\t// Act\n\t\t\terr := s.Execute(nil)\n\n\t\t\t// Assert\n\t\t\tif tc.err != \"\" {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tassertNoError(t, err)\n\n\t\t\tif !preLockFnCalled {\n\t\t\t\tt.Fatal(\"expected pre-lock function to be called\")\n\t\t\t}\n\n\t\t\tif !councilDAO.IsLocked() {\n\t\t\t\tt.Fatal(\"expected DAO to be locked\")\n\t\t\t}\n\n\t\t\tif got := councilDAO.LockReason(); got != tc.reason {\n\t\t\t\tt.Fatalf(\"expected lock reason: '%s', got: '%s'\", tc.reason, got)\n\t\t\t}\n\t\t})\n\t}\n}\n"},{"name":"uri.gno","body":"package gnome\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/ufmt\"\n\n\tgnome \"gno.land/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao\"\n)\n\nfunc makeRealmURL(renderPath string) string {\n\tvar sub string\n\tif id := std.GetChainID(); strings.HasPrefix(id, \"test\") {\n\t\t// Sub domain prefix for testnets\n\t\tsub = id + \".\"\n\t}\n\n\turl := \"https://\" + sub + std.CurrentRealm().PkgPath()\n\tif renderPath != \"\" {\n\t\turl += \":\" + renderPath\n\t}\n\treturn url\n}\n\nfunc makeRealmPath(renderPath string) string {\n\tpath := gnome.CutRealmDomain(std.CurrentRealm().PkgPath())\n\tif renderPath != \"\" {\n\t\tpath += \":\" + renderPath\n\t}\n\treturn path\n}\n\nfunc makeGnoStudioConnectURL(functionName string) string {\n\treturn ufmt.Sprintf(\n\t\t\"https://gno.studio/connect/view/%s?network=%s\u0026tab=functions#%s\",\n\t\tstd.CurrentRealm().PkgPath(),\n\t\tstd.GetChainID(),\n\t\tfunctionName,\n\t)\n}\n\nfunc makeDAOURI(daoPath string, isRelative bool) string {\n\trenderPath := \"dao/\" + daoPath\n\tif isRelative {\n\t\treturn makeRealmPath(renderPath)\n\t}\n\treturn makeRealmURL(renderPath)\n}\n\nfunc makeProposalURI(proposalID gnome.ID, isRelative bool) string {\n\trenderPath := \"proposal/\" + proposalID.String()\n\tif isRelative {\n\t\treturn makeRealmPath(renderPath)\n\t}\n\treturn makeRealmURL(renderPath)\n}\n\nfunc makeProposalsURI(daoPath string, isRelative bool) string {\n\trenderPath := \"proposals/\" + daoPath + \":page=1\"\n\tif isRelative {\n\t\treturn makeRealmPath(renderPath)\n\t}\n\treturn makeRealmURL(renderPath)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"26000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"lxzEDXOMDUoJHxuDzohwe+tKOPgSVeGfv6gaenxadPp5dLa/rrH5IQqlxireIDOUa0wXtJqf+WFr9nVEGKlXtw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"tutorials","path":"gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/tutorials","files":[{"name":"LICENSE","body":"Copyright (c) 2024. All rights reserved.\n\nProject Owner:\nNewTendermint, LLC\n\nProject Maintainer:\nİlker Göktuğ ÖZTÜRK. \u003cilker@ilgooz.com\u003e, \u003cilkergoktugozturk@gmail.com\u003e\n\nYour access to this Project and your contributions to this Project are subject\nto the following terms:\n\n* You hereby grant to the listed Owner and Maintainer of this Project the\nworldwide, irrevocable and royalty-free right to use, publish, relicense and\nsublicense your contributions under any non-exclusive license of their\nchoosing for commercial and non-commercial purposes.\n* You shall not attempt to bring any intellectual property infringement or\nmisappropriation claims against the Owner or Maintainer of this Project\nrelating to or arising from your contributions.\n* You represent that you are the sole owner of all rights in your\ncontributions and that no third party has any rights or interests therein.\n\nFOR THE SCOPE OF THIS LICENSE, A CONTRIBUTION IS DEFINED TO INCLUDE ANY WORKS,\nIDEAS, CODE, PROCESSES, OR APIS MADE AVAILABLE TO VIEW BY THE GENERAL PUBLIC\n(INCLUDING ANY PUBLICLY ACCESSIBLE INTERNET FORUMS AND CHAT SERVERS WHERE\nACCESS IS AVAILABLE FOR FREE WITH REGISTRATION) OR PRIVATELY TO THIS PROJECT'S\nOWNER AND MAINTAINERS; INCLUDING WORKS, IDEAS, CODE, PROCESSES, AND APIS THAT\nARE ABOUT THIS PROJECT AND ITS CONTRIBUTIONS, OR MENTIONED IN REFERENCE TO\nTHIS PROJECT, WHERE SUCH WORKS, IDEAS, CODE, PROCESSES, AND APIS ARE MATERIAL\nTO THE SUCCESS, IMPROVEMENT, OR COMPLETION OF THIS PROJECT, AS DETERMINED BY\nTHE OWNER OF THIS PROJECT.\n\nContributions may come in any form, and include (but are not limited to):\n\n* pull requests\n* diff patches\n* commentary\n* example code\n\nIf you do not want your contribution to become incorporated into this Project,\ndo not make contributions to this Project. The creation of contributions that\nmay in the future become known to this Project's Owner and Maintainer\nconstitutes a willing contribution to this Project in accordance with this\nlicense.\n\nTHIS PROJECT AND THE WORKS AVAILABLE THROUGH THIS PROJECT ARE PROVIDED “AS IS”\nAND WITHOUT WARRANTY OF ANY KIND. IN NO EVENT SHALL THE OWNER OR MAINTAINER OF\nTHIS PROJECT BE LIABLE TO YOU OR ANY THIRD PARTY FOR ANY CLAIM, DAMAGES OR\nOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THIS PROJECT OR THE WORKS AVAILABLE THROUGH\nTHIS PROJECT. YOU AGREED TO INDEMNIFY, DEFEND AND HOLD THE OWNER AND\nMAINTAINER FROM AND AGAINST ANY CLAIMS, LOSSES OR DAMAGES ARISING FROM YOUR\nUSE OF THIS PROJECT OR THE WORKS AVAILABLE THROUGH THIS PROJECT.\n\nThis license is subject to change at any time by the Project Owner or\nMaintainer.\n\nYour continued access to or use of this Project or any works\navailable through this Project shall be subject to the then-current version\nof this license.\n\nThe Project Owner and Maintainer reserve the right to change this license\nwithout needing the consent of the contributors to this Project.\n"},{"name":"indexes.gno","body":"package tutorials\n\nimport (\n\t\"time\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/blog\"\n)\n\nconst keyDateFmt = \"2006-01-02T15:04:05\"\n\nvar (\n\ttags tagIndex\n\ttutorials tutorialIndex\n)\n\ntype tagIndex struct {\n\tindex avl.Tree // string(tag) -\u003e *tutorialIndex\n}\n\nfunc (x *tagIndex) Index(p *blog.Post) (indexed bool) {\n\tif p == nil {\n\t\treturn\n\t}\n\n\tfor _, tag := range p.Tags {\n\t\t// Get the tutorials for the current tag\n\t\tvar (\n\t\t\tidx *tutorialIndex\n\t\t\tv, found = x.index.Get(tag)\n\t\t)\n\n\t\tif found {\n\t\t\tidx = v.(*tutorialIndex)\n\t\t} else {\n\t\t\tidx = \u0026tutorialIndex{}\n\t\t}\n\n\t\t// Index the tutorial\n\t\tidx.Index(p)\n\n\t\t// Keep track of indexing success\n\t\tindexed = x.index.Set(tag, idx) || indexed\n\t}\n\treturn\n}\n\nfunc (x *tagIndex) Remove(p *blog.Post) (removed bool) {\n\tif p == nil {\n\t\treturn\n\t}\n\n\tfor _, tag := range p.Tags {\n\t\tv, found := x.index.Get(tag)\n\t\tif !found {\n\t\t\t// Ignore tags that are not indexed\n\t\t\tcontinue\n\t\t}\n\n\t\tidx := v.(*tutorialIndex)\n\t\tif idx.Remove(p) \u0026\u0026 !removed {\n\t\t\tremoved = true\n\t\t}\n\n\t\tif idx.Size() == 0 {\n\t\t\t// Remove the tag from the index when empty\n\t\t\tx.index.Remove(tag)\n\t\t}\n\t}\n\treturn\n}\n\nfunc (x tagIndex) IterateTags(fn func(tag string) bool) bool {\n\treturn x.index.Iterate(\"\", \"\", func(tag string, _ interface{}) bool {\n\t\treturn fn(tag)\n\t})\n}\n\nfunc (x tagIndex) IteratePosts(tag string, fn func(*blog.Post) bool) bool { // TODO: Support pagination\n\tv, found := x.index.Get(tag)\n\tif !found {\n\t\treturn false\n\t}\n\n\tidx := v.(*tutorialIndex)\n\treturn idx.Iterate(\"\", \"\", func(p *blog.Post) bool {\n\t\treturn fn(p)\n\t})\n}\n\ntype tutorialIndex struct {\n\tindex avl.Tree // string(post creation time + post slug) -\u003e *blog.Post\n}\n\nfunc (x tutorialIndex) Size() int {\n\treturn x.index.Size()\n}\n\nfunc (x *tutorialIndex) Index(p *blog.Post) bool {\n\tk := newTutorialKey(p)\n\treturn x.index.Set(k, p)\n}\n\nfunc (x *tutorialIndex) Remove(p *blog.Post) bool {\n\tk := newTutorialKey(p)\n\t_, removed := x.index.Remove(k)\n\treturn removed\n}\n\nfunc (x tutorialIndex) Iterate(start, end string, fn func(*blog.Post) bool) bool {\n\treturn x.index.Iterate(start, end, func(_ string, v interface{}) bool {\n\t\treturn fn(v.(*blog.Post))\n\t})\n}\n\nfunc newTutorialKey(p *blog.Post) string {\n\tif p != nil {\n\t\treturn p.CreatedAt.UTC().Format(keyDateFmt) + p.Slug\n\t}\n\n\t// By default create a key for the current block time\n\treturn time.Now().UTC().Format(keyDateFmt)\n}\n"},{"name":"public.gno","body":"package tutorials\n\nimport (\n\t\"errors\"\n\t\"std\"\n\t\"strings\"\n\t\"time\"\n\n\t\"gno.land/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/blog\"\n\tdao \"gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1\"\n)\n\nconst tutorialsDAO = \"council/main/sections/tutorials\"\n\n// Imported defines an interface to allow exporting realm data.\ntype Importer interface {\n\t// Import imports tutorials.\n\tImport(blog.InvarBlog) error\n}\n\n// SubmitCreationProposal submits a new proposal to create a new tutorial.\n//\n// Proposal requires a 51% quorum, otherwise the outcome will be low participation.\n// Tally is done by absolute majority, so all abstentions are considered.\n// Default voting period is 7 days.\n//\n// Parameters:\n// - proposalTitle: A title for the proposal (required)\n// - proposalDescription: A description of the proposal\n// - tutorialSlug: Slug name of the tutorial (required)\n// - tutorialTitle: A title for the tutorial (required)\n// - tutorialContentHash: A SHA256 hash of the tutorial's content (required)\n// - tutorialContentURL: A URL where the tutorial's content is currently available (required)\n// - tutorialAuthors: List of author addresses (required)\n// - tutorialEditors:\tList of editor addresses\n// - tutorialTags: Space separated list of tutorial tags\n//\n// Tutorial slug name allows letters from \"a\" to \"z\", numbers and \"-\" as valid characters.\n// Unicode letters are also allowed.\n//\n// The list of authors and editors must be a newline separated list of addresses.\nfunc SubmitCreationProposal(\n\tproposalTitle,\n\tproposalDescription,\n\ttutorialSlug,\n\ttutorialTitle,\n\ttutorialContentHash,\n\ttutorialContentURL,\n\ttutorialAuthors,\n\ttutorialEditors,\n\ttutorialTags string,\n) uint64 {\n\tassertSlugIsAvailable(tutorialSlug)\n\tblog.AssertTitleIsNotEmpty(tutorialTitle)\n\tblog.AssertIsSlug(tutorialSlug)\n\tblog.AssertIsSha256Hash(tutorialContentHash)\n\tblog.AssertIsContentURL(tutorialContentURL)\n\n\ttags := strings.Fields(tutorialTags)\n\tassertValidTags(tags)\n\n\tauthors := blog.MustParseStringToAddresses(tutorialAuthors)\n\tif len(authors) == 0 {\n\t\tpanic(\"tutorial authors must have at least one author's address\")\n\t}\n\n\tstrategy := creationStrategy{\n\t\tslug: tutorialSlug,\n\t\ttitle: strings.TrimSpace(tutorialTitle),\n\t\tcontentHash: tutorialContentHash,\n\t\tcontentURL: tutorialContentURL,\n\t\tauthors: authors,\n\t\teditors: blog.MustParseStringToAddresses(tutorialEditors),\n\t\ttags: tags,\n\t}\n\tid := dao.SubmitProposal(proposalTitle, proposalDescription, strategy, tutorialsDAO)\n\treturn uint64(id)\n}\n\n// SubmitModificationProposal submits a new proposal to modify a tutorial.\n//\n// Proposal requires a 51% quorum, otherwise the outcome will be low participation.\n// Tally is done by absolute majority, so all abstentions are considered.\n// Default voting period is 4 days.\n//\n// Parameters:\n// - proposalTitle: A title for the proposal (required)\n// - proposalDescription: A description of the proposal\n// - tutorialSlug: Slug name of the tutorial (required)\n// - tutorialTitle: A title for the tutorial\n// - tutorialContentHash: A SHA256 hash of the new tutorial's content\n// - tutorialCurrentContentHash: A SHA256 hash of the current tutorial's content\n// - tutorialContentURL: A URL where the new tutorial's content is currently available\n// - tutorialNewAuthors: List of author addresses\n// - tutorialNewEditors:\tList of editor addresses\n// - tutorialTags: Space separated list of tutorial tags\n//\n// Tutorial slug name allows letters from \"a\" to \"z\", numbers and \"-\" as valid characters.\n// Unicode letters are also allowed.\n//\n// The list of new authors and editors must be a newline separated list of addresses.\n// If present, authors and editors are appended to the current list of authors and editors.\nfunc SubmitModificationProposal(\n\tproposalTitle,\n\tproposalDescription,\n\ttutorialSlug,\n\ttutorialTitle,\n\ttutorialContentHash,\n\ttutorialCurrentContentHash,\n\ttutorialContentURL,\n\ttutorialNewAuthors,\n\ttutorialNewEditors,\n\ttutorialTags string,\n) uint64 {\n\ttutorialSlug = strings.TrimSpace(tutorialSlug)\n\tassertTutorialExists(tutorialSlug)\n\n\ttags := strings.Fields(tutorialTags)\n\tassertValidTags(tags)\n\n\ttutorialContentHash = strings.TrimSpace(tutorialContentHash)\n\tif tutorialContentHash != \"\" {\n\t\ttutorialCurrentContentHash = strings.TrimSpace(tutorialCurrentContentHash)\n\t\tif tutorialCurrentContentHash == \"\" {\n\t\t\tpanic(\"the current content hash of the tutorial to modify is required\")\n\t\t}\n\n\t\tblog.AssertIsSha256Hash(tutorialContentHash)\n\t\tblog.AssertIsSha256Hash(tutorialCurrentContentHash)\n\t\tblog.AssertIsContentURL(tutorialContentURL)\n\t}\n\n\tstrategy := modificationStrategy{\n\t\tslug: tutorialSlug,\n\t\ttitle: strings.TrimSpace(tutorialTitle),\n\t\tcontentHash: tutorialContentHash,\n\t\tcurrentContentHash: tutorialCurrentContentHash,\n\t\tcontentURL: tutorialContentURL,\n\t\tauthors: blog.MustParseStringToAddresses(tutorialNewAuthors),\n\t\teditors: blog.MustParseStringToAddresses(tutorialNewEditors),\n\t\ttags: tags,\n\t}\n\tid := dao.SubmitProposal(proposalTitle, proposalDescription, strategy, tutorialsDAO)\n\treturn uint64(id)\n}\n\n// SubmitDeletionProposal submits a new proposal to delete a tutorial.\n//\n// Proposal requires a 51% quorum, otherwise the outcome will be low participation.\n// Tally is done by absolute majority, so all abstentions are considered.\n// Default voting period is 2 days.\n//\n// Parameters:\n// - proposalTitle: A title for the proposal (required)\n// - proposalDescription: A description of the proposal\n// - tutorialSlug: Slug name of the tutorial (required)\nfunc SubmitDeletionProposal(proposalTitle, proposalDescription, tutorialSlug string) uint64 {\n\ttutorialSlug = strings.TrimSpace(tutorialSlug)\n\tassertTutorialExists(tutorialSlug)\n\n\tstrategy := deletionStrategy{tutorialSlug}\n\tid := dao.SubmitProposal(proposalTitle, proposalDescription, strategy, tutorialsDAO)\n\treturn uint64(id)\n}\n\n// Publish publishes content for a tutorial.\n//\n// The submited content must be previously approved by a creation or modification proposal.\n//\n// Parameters:\n// - slug: Slug name of the tutorial (required)\n// - content: The tutorial content to publish (required)\nfunc Publish(slug, content string) {\n\t// Check that content checksum matches the approved content for the tutorial post\n\tp := mustGetPost(slug)\n\tblog.AssertContentSha256Hash(content, p.ContentHash)\n\n\t// Add caller to the list of publishers\n\tcaller := std.GetOrigCaller()\n\tif !p.Publishers.HasAddress(caller) {\n\t\tp.Publishers = append(p.Publishers, caller)\n\t}\n\n\tif p.Status == blog.StatusDraft {\n\t\tp.PublishAt = time.Now()\n\t}\n\n\tp.Status = blog.StatusPublished\n\tp.Content = content\n\tp.UpdatedAt = time.Now()\n}\n\n// Export exports the tutorial realm's state.\n// The caller's realm path prefix must match the prefix of the tutorials realm\n// to be able to import the state.\nfunc Export(x Importer) error {\n\t// TODO: Check that realm is locked and the caller realm path is the next version\n\tcurrentPath := std.CurrentRealm().PkgPath()\n\tif !strings.HasPrefix(std.PrevRealm().PkgPath(), currentPath) {\n\t\treturn errors.New(\"caller realm path must start with: \" + currentPath)\n\t}\n\n\treturn x.Import(blog.NewInvarBlog(\u0026tutorialsBlog))\n}\n\nfunc assertSlugIsAvailable(slug string) {\n\tif tutorialsBlog.HasPost(slug) {\n\t\tpanic(\"tutorial URL slug already exists\")\n\t}\n}\n\nfunc assertTutorialExists(slug string) {\n\tif !tutorialsBlog.HasPost(slug) {\n\t\tpanic(\"tutorial not found\")\n\t}\n}\n\nfunc assertValidTags(tags []string) {\n\tfor _, t := range tags {\n\t\tif !blog.IsSlug(t) {\n\t\t\tpanic(\"invalid tag: \" + t)\n\t\t}\n\t}\n}\n"},{"name":"render.gno","body":"package tutorials\n\nimport (\n\t\"strings\"\n\t\"time\"\n\n\t\"gno.land/p/demo/mux\"\n\t\"gno.land/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/alerts\"\n\t\"gno.land/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/blog\"\n)\n\nconst (\n\tdateFormat = \"2006-01-02 15:04 MST\"\n\tshortDateFormat = \"Jan 2, 2006\"\n)\n\nfunc Render(path string) string {\n\trouter := mux.NewRouter()\n\trouter.NotFoundHandler = func(res *mux.ResponseWriter, _ *mux.Request) {\n\t\tres.Write(\"Path not found\")\n\t}\n\n\trouter.HandleFunc(\"\", renderBlog)\n\trouter.HandleFunc(\"posts\", renderBlog)\n\trouter.HandleFunc(\"posts/{slug}\", renderPost)\n\trouter.HandleFunc(\"drafts\", renderDrafts)\n\trouter.HandleFunc(\"revisions\", renderRevisions)\n\trouter.HandleFunc(\"tags\", renderTags)\n\trouter.HandleFunc(\"tags/{name}\", renderPostsByTag)\n\n\treturn router.Render(path)\n}\n\nfunc renderBlog(res *mux.ResponseWriter, _ *mux.Request) {\n\t// Write header\n\tres.Write(\"# \" + tutorialsBlog.Title + \"\\n\")\n\tif tutorialsBlog.Description != \"\" {\n\t\tres.Write(tutorialsBlog.Description + \"\\n\\n\")\n\t}\n\n\t// Write tutorials menu\n\tres.Write(renderMenu() + \"\\n\\n---\\n\")\n\n\t// Write list of published tutorials\n\tnow := time.Now()\n\ttutorials.Iterate(\"\", \"\", func(p *blog.Post) bool { // TODO: Add post pagination support\n\t\t// Skip posts that should be published at a future date\n\t\tif p.PublishAt.IsZero() || p.PublishAt.After(now) {\n\t\t\treturn false\n\t\t}\n\n\t\t// Skip posts that are not published or being revised\n\t\tif p.Status != blog.StatusPublished \u0026\u0026 p.Status != blog.StatusRevised {\n\t\t\treturn false\n\t\t}\n\n\t\turl := newRealmURL(\"posts/\" + p.Slug)\n\t\tdate := p.PublishAt.UTC().Format(shortDateFormat)\n\t\tres.Write(\"**[\" + p.Title + \"](\" + url + \")**\u003c/br\u003e\")\n\t\tres.Write(\"_Published: \" + date + \"_\\n\\n\")\n\t\treturn false\n\t})\n}\n\nfunc renderPost(res *mux.ResponseWriter, req *mux.Request) {\n\tslug := req.GetVar(\"slug\")\n\tp, found := tutorialsBlog.GetPost(slug)\n\tif !found {\n\t\tres.Write(\"Post not found\")\n\t\treturn\n\t}\n\n\tif p.Status == blog.StatusRevised {\n\t\tres.Write(alerts.NewWarning(\"Tutorial content is being revised\"))\n\t}\n\n\t// TODO: Add post tags with links\n\tres.Write(\"# \" + p.Title + \"\\n\")\n\tres.Write(\"- Author(s): \" + p.Authors.String() + \"\\n\")\n\n\tif len(p.Editors) \u003e 0 {\n\t\tres.Write(\"- Editors(s): \" + p.Editors.String() + \"\\n\")\n\t}\n\n\tres.Write(\"- Publisher(s): \" + p.Publishers.String() + \"\\n\")\n\tres.Write(\"- Status: \" + p.Status.String() + \"\\n\")\n\tres.Write(\"- Content Hash: \" + p.ContentHash + \"\\n\")\n\tres.Write(\"- Created: \" + p.CreatedAt.UTC().Format(dateFormat) + \"\\n\")\n\tif !p.UpdatedAt.IsZero() {\n\t\tres.Write(\"- Updated: \" + p.UpdatedAt.UTC().Format(dateFormat) + \"\\n\")\n\t}\n\n\tif len(p.Tags) \u003e 0 {\n\t\tres.Write(\"- Tag(s): \" + renderTagLinks(p.Tags) + \"\\n\")\n\t}\n\n\tif p.Content != \"\" {\n\t\tres.Write(\"\\n\" + p.Content)\n\t}\n}\n\nfunc renderDrafts(res *mux.ResponseWriter, _ *mux.Request) {\n\tres.Write(\"# \" + tutorialsBlog.Title + \": Drafts\\n\")\n\ttutorials.Iterate(\"\", \"\", func(p *blog.Post) bool { // TODO: Add pagination support\n\t\tif p.Status != blog.StatusDraft {\n\t\t\treturn false\n\t\t}\n\n\t\turl := newRealmURL(\"posts/\" + p.Slug)\n\t\tdate := p.CreatedAt.UTC().Format(shortDateFormat)\n\t\tres.Write(\"**[\" + p.Title + \"](\" + url + \")**\u003c/br\u003e\")\n\t\tres.Write(\"_Created: \" + date + \"_\\n\\n\")\n\t\treturn false\n\t})\n}\n\nfunc renderRevisions(res *mux.ResponseWriter, _ *mux.Request) {\n\tres.Write(\"# \" + tutorialsBlog.Title + \": Revisions\\n\")\n\ttutorials.Iterate(\"\", \"\", func(p *blog.Post) bool { // TODO: Add pagination support\n\t\tif p.Status != blog.StatusRevised {\n\t\t\treturn false\n\t\t}\n\n\t\turl := newRealmURL(\"posts/\" + p.Slug)\n\t\tdate := p.PublishAt.UTC().Format(shortDateFormat)\n\t\tres.Write(\"**[\" + p.Title + \"](\" + url + \")**\u003c/br\u003e\")\n\t\tres.Write(\"_Published: \" + date + \"_\\n\\n\")\n\t\treturn false\n\t})\n}\n\nfunc renderTags(res *mux.ResponseWriter, req *mux.Request) {\n\tres.Write(\"# \" + tutorialsBlog.Title + \": Tags\\n\")\n\ttags.IterateTags(func(tag string) bool {\n\t\tres.Write(\"- [\" + tag + \"](\" + newRealmURL(\"tags/\"+tag) + \")\\n\")\n\t\treturn false\n\t})\n}\n\nfunc renderPostsByTag(res *mux.ResponseWriter, req *mux.Request) {\n\ttag := req.GetVar(\"name\")\n\tres.Write(\"# \" + tutorialsBlog.Title + \": Tag `\" + tag + \"`\\n\")\n\n\tif tag == \"\" {\n\t\treturn\n\t}\n\n\ttags.IteratePosts(tag, func(p *blog.Post) bool {\n\t\tif p.Status != blog.StatusPublished \u0026\u0026 p.Status != blog.StatusRevised {\n\t\t\treturn false\n\t\t}\n\n\t\turl := newRealmURL(\"posts/\" + p.Slug)\n\t\tdate := p.PublishAt.UTC().Format(shortDateFormat)\n\t\tres.Write(\"**[\" + p.Title + \"](\" + url + \")**\u003c/br\u003e\")\n\t\tres.Write(\"_Published: \" + date + \"_\\n\\n\")\n\t\treturn false\n\t})\n}\n\nfunc renderMenu() string {\n\titems := []string{\n\t\t\"**[drafts](\" + newRealmURL(\"drafts\") + \")**\",\n\t\t\"**[revisions](\" + newRealmURL(\"revisions\") + \")**\",\n\t}\n\n\t// Add taxonomy entries\n\ttags.IterateTags(func(tag string) bool {\n\t\titems = append(items, \"**[\"+tag+\"](\"+newRealmURL(\"tags/\"+tag)+\")**\")\n\t\treturn false\n\t})\n\n\treturn strings.Join(items, \" \")\n}\n\nfunc renderTagLinks(tags []string) string {\n\tvar links []string\n\tfor _, t := range tags {\n\t\tlinks = append(links, \"[\"+t+\"](\"+newRealmURL(\"tags/\"+t)+\")\")\n\t}\n\treturn strings.Join(links, \", \")\n}\n\nfunc newRealmURL(renderPath string) string {\n\treturn \"/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/tutorials:\" + renderPath\n}\n"},{"name":"strategies.gno","body":"package tutorials\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"time\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/blog\"\n\tgnome \"gno.land/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao\"\n)\n\ntype creationStrategy struct {\n\tslug, title, contentHash, contentURL string\n\tauthors, editors blog.AddressList\n\ttags []string\n}\n\nfunc (creationStrategy) Name() string {\n\treturn \"tutorial-creation\"\n}\n\nfunc (creationStrategy) Quorum() float64 {\n\treturn 0.51\n}\n\nfunc (creationStrategy) VotingPeriod() time.Duration {\n\treturn time.Minute * 30\n}\n\nfunc (creationStrategy) VoteChoices() []gnome.VoteChoice {\n\treturn []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo}\n}\n\nfunc (s creationStrategy) Validate(*gnome.Proposal) error {\n\tif tutorialsBlog.HasPost(s.slug) {\n\t\treturn errors.New(\"tutorial URL slug already exists\")\n\t}\n\treturn nil\n}\n\nfunc (creationStrategy) Tally(dao *gnome.DAO, r gnome.VotingRecord) gnome.VoteChoice {\n\tabstentions := len(dao.Members()) - r.VoteCount()\n\tif choice, ok := gnome.SelectChoiceByMajority(r, abstentions); ok {\n\t\treturn choice\n\t}\n\treturn gnome.ChoiceNone\n}\n\nfunc (s creationStrategy) Execute(*gnome.DAO) error {\n\tp := \u0026blog.Post{ // TODO: Support other fields like summary and tags\n\t\tSlug: s.slug,\n\t\tTitle: s.title,\n\t\tContentHash: s.contentHash,\n\t\tAuthors: s.authors,\n\t\tEditors: s.editors,\n\t\tStatus: blog.StatusDraft,\n\t\tTags: s.tags,\n\t\tCreatedAt: time.Now(),\n\t}\n\ttutorialsBlog.AddPost(p)\n\n\t// Update realm indexes\n\ttutorials.Index(p)\n\tif len(p.Tags) \u003e 0 {\n\t\ttags.Index(p)\n\t}\n\n\treturn nil\n}\n\nfunc (s creationStrategy) RenderParams() string {\n\tvar (\n\t\tb strings.Builder\n\t\tauthors = strings.ReplaceAll(s.authors.String(), \", \", \"\u003c/br\u003e\")\n\t)\n\n\t// TODO: Implement using gno.land/p/demo/ui\n\tb.WriteString(\"|||\\n|---|---|\\n\")\n\tb.WriteString(\"| Slug: | \" + s.slug + \" |\\n\")\n\tb.WriteString(\"| Title: | \" + gnome.EscapeHTML(s.title) + \" |\\n\")\n\tb.WriteString(\"| Content URL: | \" + gnome.NewLinkURI(s.contentURL) + \" |\\n\")\n\tb.WriteString(\"| Content Hash: | \" + s.contentHash + \" |\\n\")\n\n\tif len(s.tags) \u003e 0 {\n\t\tb.WriteString(\"| Tag(s): | \" + renderTagLinks(s.tags) + \" |\\n\")\n\t}\n\n\tb.WriteString(\"| Author(s): | \u003c/br\u003e\" + authors + \"\u003c/br\u003e\u003c/br\u003e |\\n\")\n\n\tif len(s.editors) \u003e 0 {\n\t\teditors := strings.ReplaceAll(s.editors.String(), \", \", \"\u003c/br\u003e\")\n\t\tb.WriteString(\"| Editor(s): | \u003c/br\u003e\" + editors + \"\u003c/br\u003e\u003c/br\u003e |\\n\")\n\t}\n\n\treturn b.String()\n}\n\ntype modificationStrategy struct {\n\tslug, title, currentContentHash, contentHash, contentURL string\n\tauthors, editors blog.AddressList\n\ttags []string\n}\n\nfunc (modificationStrategy) Name() string {\n\treturn \"tutorial-modification\"\n}\n\nfunc (modificationStrategy) Quorum() float64 {\n\treturn 0.51\n}\n\nfunc (modificationStrategy) VotingPeriod() time.Duration {\n\treturn time.Minute * 30\n}\n\nfunc (modificationStrategy) VoteChoices() []gnome.VoteChoice {\n\treturn []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo}\n}\n\nfunc (s modificationStrategy) Validate(*gnome.Proposal) error {\n\tp, found := tutorialsBlog.GetPost(s.slug)\n\tif !found {\n\t\treturn errors.New(\"tutorial doesn't exists\")\n\t}\n\n\tif s.currentContentHash != \"\" \u0026\u0026 s.currentContentHash != p.ContentHash {\n\t\treturn errors.New(\"tutorial's content has been previously modified\")\n\t}\n\n\tfor _, addr := range s.authors {\n\t\tif p.Authors.HasAddress(addr) {\n\t\t\treturn errors.New(\"author already exists: \" + addr.String())\n\t\t}\n\t}\n\n\tfor _, addr := range s.editors {\n\t\tif p.Authors.HasAddress(addr) {\n\t\t\treturn errors.New(\"editor already exists: \" + addr.String())\n\t\t}\n\t}\n\n\tif len(s.tags) \u003e 0 {\n\t\tvar seenTags avl.Tree\n\t\tfor _, t := range s.tags {\n\t\t\tif seenTags.Has(t) {\n\t\t\t\treturn errors.New(\"duplicated tag: \" + t)\n\t\t\t}\n\n\t\t\tseenTags.Set(t, struct{}{})\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (modificationStrategy) Tally(dao *gnome.DAO, r gnome.VotingRecord) gnome.VoteChoice {\n\tabstentions := len(dao.Members()) - r.VoteCount()\n\tif choice, ok := gnome.SelectChoiceByMajority(r, abstentions); ok {\n\t\treturn choice\n\t}\n\treturn gnome.ChoiceNone\n}\n\nfunc (s modificationStrategy) Execute(*gnome.DAO) error {\n\tp, _ := tutorialsBlog.GetPost(s.slug)\n\n\tif s.title != \"\" {\n\t\tp.Title = s.title\n\t}\n\n\tif len(s.authors) \u003e 0 {\n\t\tp.Authors = append(p.Authors, s.authors...)\n\t}\n\n\tif len(s.editors) \u003e 0 {\n\t\tp.Editors = append(p.Editors, s.editors...)\n\t}\n\n\t// Update tag index\n\tif len(s.tags) \u003e 0 {\n\t\ttags.Remove(p)\n\t\tp.Tags = s.tags\n\t\ttags.Index(p)\n\t}\n\n\t// Changing content hash converts post to a revised until new content is setted\n\tif s.contentHash != \"\" {\n\t\tp.Status = blog.StatusRevised\n\t\tp.ContentHash = s.contentHash\n\t}\n\n\tp.UpdatedAt = time.Now()\n\treturn nil\n}\n\nfunc (s modificationStrategy) RenderParams() string {\n\tvar b strings.Builder\n\n\t// TODO: Implement using gno.land/p/demo/ui\n\tb.WriteString(\"|||\\n|---|---|\\n\")\n\tb.WriteString(\"| Slug: | [\" + s.slug + \"](\" + newRealmURL(\"posts/\"+s.slug) + \") |\\n\")\n\n\tif s.title != \"\" {\n\t\tb.WriteString(\"| Title: | \" + gnome.EscapeHTML(s.title) + \" |\\n\")\n\t}\n\n\tif s.contentHash != \"\" {\n\t\tb.WriteString(\"| Content URL: | \" + gnome.NewLinkURI(s.contentURL) + \" |\\n\")\n\t\tb.WriteString(\"| Content Hash: | \" + s.contentHash + \" |\\n\")\n\t\tb.WriteString(\"| Modifies Content Hash: | \" + s.currentContentHash + \" |\\n\")\n\t}\n\n\tif len(s.tags) \u003e 0 {\n\t\tb.WriteString(\"| Tag(s): | \" + renderTagLinks(s.tags) + \" |\\n\")\n\t}\n\n\tif len(s.authors) \u003e 0 {\n\t\tauthors := strings.ReplaceAll(s.authors.String(), \", \", \"\u003c/br\u003e\")\n\t\tb.WriteString(\"| Author(s): | \u003c/br\u003e\" + authors + \"\u003c/br\u003e\u003c/br\u003e |\\n\")\n\t}\n\n\tif len(s.editors) \u003e 0 {\n\t\teditors := strings.ReplaceAll(s.editors.String(), \", \", \"\u003c/br\u003e\")\n\t\tb.WriteString(\"| Editor(s): | \u003c/br\u003e\" + editors + \"\u003c/br\u003e\u003c/br\u003e |\\n\")\n\t}\n\n\treturn b.String()\n}\n\ntype deletionStrategy struct {\n\tslug string\n}\n\nfunc (deletionStrategy) Name() string {\n\treturn \"tutorial-deletion\"\n}\n\nfunc (deletionStrategy) Quorum() float64 {\n\treturn 0.51\n}\n\nfunc (deletionStrategy) VotingPeriod() time.Duration {\n\treturn time.Minute * 30\n}\n\nfunc (deletionStrategy) VoteChoices() []gnome.VoteChoice {\n\treturn []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo}\n}\n\nfunc (deletionStrategy) Tally(dao *gnome.DAO, r gnome.VotingRecord) gnome.VoteChoice {\n\tabstentions := len(dao.Members()) - r.VoteCount()\n\tif choice, ok := gnome.SelectChoiceByMajority(r, abstentions); ok {\n\t\treturn choice\n\t}\n\treturn gnome.ChoiceNone\n}\n\nfunc (s deletionStrategy) Validate(*gnome.Proposal) error {\n\tif !tutorialsBlog.HasPost(s.slug) {\n\t\treturn errors.New(\"tutorial doesn't exists\")\n\t}\n\treturn nil\n}\n\nfunc (s deletionStrategy) Execute(*gnome.DAO) error {\n\tp, found := tutorialsBlog.RemovePost(s.slug)\n\tif !found {\n\t\treturn errors.New(\"tutorial not found\")\n\t}\n\n\t// Update realm indexes\n\ttutorials.Remove(p)\n\tif len(p.Tags) \u003e 0 {\n\t\ttags.Remove(p)\n\t}\n\n\treturn nil\n}\n\nfunc (s deletionStrategy) RenderParams() string {\n\treturn \"Slug: [\" + s.slug + \"](\" + newRealmURL(\"posts/\"+s.slug) + \")\"\n}\n"},{"name":"tutorials.gno","body":"package tutorials\n\nimport (\n\t\"gno.land/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/blog\"\n)\n\n// TODO: Define a realm description\nvar tutorialsBlog = blog.Blog{Title: \"Gno.me Tutorials\"}\n\nfunc mustGetPost(slug string) *blog.Post {\n\tp, found := tutorialsBlog.GetPost(slug)\n\tif !found {\n\t\tpanic(\"tutorial not found\")\n\t}\n\treturn p\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"21000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"qBuG+oxesxCMM4Q+RHPIwKNF37yRBvf8gsB1OJ6kMY1HmuHlvXNGdsHclL+9glwA0dqW430eCm/uIlFwpfeGjQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","send":"","pkg_path":"gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1","func":"SubmitSubDAOCreationProposal","args":["TestcreateDAOsection","","council/main","sections","Sections","Let's do this!","g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun dev\ng125t352u4pmdrr57emc4pe04y40sknr5ztng5mt dev\ng1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5 eco-dev"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"Gl9WqR6gulY+s3kpgY3Ga30fNUJhzDDLCAMXMun26WtjpKKYlBAlPOXlnMFayvUHj6hpjfLZNuR7rFjTymotkA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","send":"","pkg_path":"gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1","func":"Vote","args":["1","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"mk5NyrdxDXFoDHliRmXbwUkWX9Mr/oyI8csVfFQM+o5lDaNi1egK3CiWfkWzMNn0/E+6zm0Sd2Hqb2dLdm0zIQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","send":"","pkg_path":"gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1","func":"Vote","args":["1","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"RYheHBLPKvjQ57fyJa66SNDpYlxf83FtFzFM1BbZBv4FP5qTAsrWwIMPHmrrcgLrFeEm2NrZP1UmIgpTYIkpcA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun","send":"","pkg_path":"gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1","func":"Vote","args":["1","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ay9E9vYxidhNWLXiUvtj4yWhyi/GZx3EVvbQRROLMkDw"},"signature":"oJse1hSsEOkoPxPx3Vc5UaTOrXkoypte8DUuYLHInO8ZDyq4nDcRXEFQUeGKXMxVvZSzjM6Gw/jo912Wz5da0g=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g125t352u4pmdrr57emc4pe04y40sknr5ztng5mt","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"kr6M3u6e9O1bprGR93P05Tozbni3WxX/uZ4yH6tAVLNxGiU7WMT9JMyZ3P5jrBdqP6PmLJ7V3V6Pk5R5HviDwg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125t352u4pmdrr57emc4pe04y40sknr5ztng5mt","send":"","pkg_path":"gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1","func":"Vote","args":["1","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AkNQ8NiWDgbeVckfYHjA25f8LNZTWhWdiBxOJGuNnqBg"},"signature":"rB3MIEo/HCCcYGK1i0sLJxB9+ANITawwzryn0CF685QF4/fr7KEDIAvcVUsdNiynO+6DGtOweBFZ3IeyD4oYqw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","send":"","pkg_path":"gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1","func":"SubmitSubDAOCreationProposal","args":["Test Create Tutorial SubDAO","This is the creation of the tutorial subDAO managing team","council/main/sections","tutorial","Tutorial","The purpose of this subdao is to draft, review, and publish tutorials for gnomes everywhere!","g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun dev\ng125t352u4pmdrr57emc4pe04y40sknr5ztng5mt dev\ng1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5 eco-dev"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"DuiIU+L3t2Ho+gf01a672fe1qd8Idgzpa9usxDiiAABSmTE2sefzS2OvkB4CqtVNMe0UjHe8+oj8hrKoIxbUZg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","send":"","pkg_path":"gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1","func":"AdvanceProposals","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"goalAgRGds7jerQgaDkBpK7keTsKxCWif/ohj+LaAzNFx+XjfMTKdzPvW+1k9+8BfEOI/TZxXUKDZH3+a2G3qw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","send":"","pkg_path":"gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1","func":"AdvanceProposals","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"uJo+94+ZVnDe+6FdvTZ9KmL1QG1RPJoj0JktV9Jwhe0URqMummvvRUswiYsT87Cw3tZI83gg4+Yd1jpYryQzhg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","send":"","pkg_path":"gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1","func":"SubmitSubDAOCreationProposal","args":["Test Create Tutorial SubDAO","This is the creation of the tutorial subDAO managing team","council/main/sections","tutorial","Tutorial","The purpose of this subdao is to draft, review, and publish tutorials for gnomes everywhere!","g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun dev\ng125t352u4pmdrr57emc4pe04y40sknr5ztng5mt dev\ng1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5 eco-dev"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"4vuN+bEogpCPdL01tL5ksQFpXYfKQoQBIMuPzZ2h5VM0roSz0EzsqgxUtqkdHz5pfOFQ/C+kkQ4gPyVQS8oyhQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","send":"","pkg_path":"gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1","func":"Vote","args":["2","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"3C/Zk87bYXoHXUiBw+oumNGaDj23z37VRRk9U8LasHpfSJ1txob7XqGcw6//6h9Ryt7GfGwWbYDM3WYsHLV7Xg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g125t352u4pmdrr57emc4pe04y40sknr5ztng5mt","send":"","pkg_path":"gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1","func":"Vote","args":["2","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AkNQ8NiWDgbeVckfYHjA25f8LNZTWhWdiBxOJGuNnqBg"},"signature":"7RGSFZWBggOwcEN4Bzq4ZXNA/22aL3yL1TEaAHY1FTxDm/gJDE/37OtdtgjpmD4T0JcrDYN/kF2eHenblx14kQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun","send":"","pkg_path":"gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1","func":"Vote","args":["2","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ay9E9vYxidhNWLXiUvtj4yWhyi/GZx3EVvbQRROLMkDw"},"signature":"EC7ahJZOfHa0lTw8r3ZiXVObfN3GEVJuW+XwzS+fkYQF/L9TVwZprYUkznqmsOfcMpfDWb4S1UYWEyvNVsyF4g=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun","send":"","pkg_path":"gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1","func":"AdvanceProposals","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ay9E9vYxidhNWLXiUvtj4yWhyi/GZx3EVvbQRROLMkDw"},"signature":"FFnHU0EafxKmovwwIF5HI9BwuebbrhEhGlt8aJPJ4xAvZs6lfJJvurVJoyH0np2lSdfY597agwDm37v/F+i+Gw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"alerts","path":"gno.land/p/gnome/alerts","files":[{"name":"LICENSE","body":"Copyright (c) 2024. All rights reserved.\n\nProject Owner:\nNewTendermint, LLC\n\nProject Maintainer:\nİlker Göktuğ ÖZTÜRK. \u003cilker@ilgooz.com\u003e, \u003cilkergoktugozturk@gmail.com\u003e\n\nYour access to this Project and your contributions to this Project are subject\nto the following terms:\n\n* You hereby grant to the listed Owner and Maintainer of this Project the\nworldwide, irrevocable and royalty-free right to use, publish, relicense and\nsublicense your contributions under any non-exclusive license of their\nchoosing for commercial and non-commercial purposes.\n* You shall not attempt to bring any intellectual property infringement or\nmisappropriation claims against the Owner or Maintainer of this Project\nrelating to or arising from your contributions.\n* You represent that you are the sole owner of all rights in your\ncontributions and that no third party has any rights or interests therein.\n\nFOR THE SCOPE OF THIS LICENSE, A CONTRIBUTION IS DEFINED TO INCLUDE ANY WORKS,\nIDEAS, CODE, PROCESSES, OR APIS MADE AVAILABLE TO VIEW BY THE GENERAL PUBLIC\n(INCLUDING ANY PUBLICLY ACCESSIBLE INTERNET FORUMS AND CHAT SERVERS WHERE\nACCESS IS AVAILABLE FOR FREE WITH REGISTRATION) OR PRIVATELY TO THIS PROJECT'S\nOWNER AND MAINTAINERS; INCLUDING WORKS, IDEAS, CODE, PROCESSES, AND APIS THAT\nARE ABOUT THIS PROJECT AND ITS CONTRIBUTIONS, OR MENTIONED IN REFERENCE TO\nTHIS PROJECT, WHERE SUCH WORKS, IDEAS, CODE, PROCESSES, AND APIS ARE MATERIAL\nTO THE SUCCESS, IMPROVEMENT, OR COMPLETION OF THIS PROJECT, AS DETERMINED BY\nTHE OWNER OF THIS PROJECT.\n\nContributions may come in any form, and include (but are not limited to):\n\n* pull requests\n* diff patches\n* commentary\n* example code\n\nIf you do not want your contribution to become incorporated into this Project,\ndo not make contributions to this Project. The creation of contributions that\nmay in the future become known to this Project's Owner and Maintainer\nconstitutes a willing contribution to this Project in accordance with this\nlicense.\n\nTHIS PROJECT AND THE WORKS AVAILABLE THROUGH THIS PROJECT ARE PROVIDED “AS IS”\nAND WITHOUT WARRANTY OF ANY KIND. IN NO EVENT SHALL THE OWNER OR MAINTAINER OF\nTHIS PROJECT BE LIABLE TO YOU OR ANY THIRD PARTY FOR ANY CLAIM, DAMAGES OR\nOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THIS PROJECT OR THE WORKS AVAILABLE THROUGH\nTHIS PROJECT. YOU AGREED TO INDEMNIFY, DEFEND AND HOLD THE OWNER AND\nMAINTAINER FROM AND AGAINST ANY CLAIMS, LOSSES OR DAMAGES ARISING FROM YOUR\nUSE OF THIS PROJECT OR THE WORKS AVAILABLE THROUGH THIS PROJECT.\n\nThis license is subject to change at any time by the Project Owner or\nMaintainer.\n\nYour continued access to or use of this Project or any works\navailable through this Project shall be subject to the then-current version\nof this license.\n\nThe Project Owner and Maintainer reserve the right to change this license\nwithout needing the consent of the contributors to this Project.\n"},{"name":"alerts.gno","body":"package alerts\n\nimport (\n\t\"gno.land/p/demo/ufmt\"\n)\n\nconst (\n\tTypeError Type = \"alerts-error\"\n\tTypeWarning Type = \"alerts-warning\"\n)\n\nconst (\n\tStyleError = `\n.alerts-error {\n\tpadding: .75rem 1.25rem;\n\tborder: 1px solid #f5c6cb;\n\tbackground-color: #f8d7da;\n\tcolor: #721c24;\n\tborder-radius: .25rem;\n}\n`\n\tStyleWarning = `\n.alerts-warning {\n\tpadding: .75rem 1.25rem;\n\tborder: 1px solid #ffeeba;\n\tbackground-color: #fff3cd;\n\tcolor: #856404;\n\tborder-radius: .25rem;\n}\n`\n)\n\n// Type defines the type of alerts.\ntype Type string\n\n// NewAlert returns HTML for an alert.\nfunc NewAlert(t Type, content string) string {\n\tvar css string\n\tswitch t {\n\tcase TypeWarning:\n\t\tcss = StyleWarning\n\tcase TypeError:\n\t\tcss = StyleError\n\tdefault:\n\t\tpanic(\"unknown alert type\")\n\t}\n\n\treturn \"\\n\\n\" + ufmt.Sprintf(`\u003cp class=\"%s\"\u003e%s\u003c/p\u003e\u003cstyle\u003e%s\u003c/style\u003e`, string(t), content, css) + \"\\n\\n\"\n}\n\n// NewWarning returns HTML for a warning alert.\nfunc NewWarning(content string) string {\n\treturn NewAlert(TypeWarning, content)\n}\n\n// NewError returns HTML for an error alert.\nfunc NewError(content string) string {\n\treturn NewAlert(TypeError, content)\n}\n\n// NewLink returns an HTML link.\nfunc NewLink(href, label string) string {\n\treturn ufmt.Sprintf(`\u003ca href=\"%s\"\u003e%s\u003c/a\u003e`, href, label)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"21000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"D/XsExRqIi+4fHASTw/wbYKRAG8uZc2j32eC4TyYK01z7jleSj1Xp+Go2Hthxu+kcqEPsOjcYGXfKl/+QU+gNQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"router","path":"gno.land/p/gnome/router","files":[{"name":"LICENSE","body":"Copyright (c) 2024. All rights reserved.\n\nProject Owner:\nNewTendermint, LLC\n\nProject Maintainer:\nİlker Göktuğ ÖZTÜRK. \u003cilker@ilgooz.com\u003e, \u003cilkergoktugozturk@gmail.com\u003e\n\nYour access to this Project and your contributions to this Project are subject\nto the following terms:\n\n* You hereby grant to the listed Owner and Maintainer of this Project the\nworldwide, irrevocable and royalty-free right to use, publish, relicense and\nsublicense your contributions under any non-exclusive license of their\nchoosing for commercial and non-commercial purposes.\n* You shall not attempt to bring any intellectual property infringement or\nmisappropriation claims against the Owner or Maintainer of this Project\nrelating to or arising from your contributions.\n* You represent that you are the sole owner of all rights in your\ncontributions and that no third party has any rights or interests therein.\n\nFOR THE SCOPE OF THIS LICENSE, A CONTRIBUTION IS DEFINED TO INCLUDE ANY WORKS,\nIDEAS, CODE, PROCESSES, OR APIS MADE AVAILABLE TO VIEW BY THE GENERAL PUBLIC\n(INCLUDING ANY PUBLICLY ACCESSIBLE INTERNET FORUMS AND CHAT SERVERS WHERE\nACCESS IS AVAILABLE FOR FREE WITH REGISTRATION) OR PRIVATELY TO THIS PROJECT'S\nOWNER AND MAINTAINERS; INCLUDING WORKS, IDEAS, CODE, PROCESSES, AND APIS THAT\nARE ABOUT THIS PROJECT AND ITS CONTRIBUTIONS, OR MENTIONED IN REFERENCE TO\nTHIS PROJECT, WHERE SUCH WORKS, IDEAS, CODE, PROCESSES, AND APIS ARE MATERIAL\nTO THE SUCCESS, IMPROVEMENT, OR COMPLETION OF THIS PROJECT, AS DETERMINED BY\nTHE OWNER OF THIS PROJECT.\n\nContributions may come in any form, and include (but are not limited to):\n\n* pull requests\n* diff patches\n* commentary\n* example code\n\nIf you do not want your contribution to become incorporated into this Project,\ndo not make contributions to this Project. The creation of contributions that\nmay in the future become known to this Project's Owner and Maintainer\nconstitutes a willing contribution to this Project in accordance with this\nlicense.\n\nTHIS PROJECT AND THE WORKS AVAILABLE THROUGH THIS PROJECT ARE PROVIDED “AS IS”\nAND WITHOUT WARRANTY OF ANY KIND. IN NO EVENT SHALL THE OWNER OR MAINTAINER OF\nTHIS PROJECT BE LIABLE TO YOU OR ANY THIRD PARTY FOR ANY CLAIM, DAMAGES OR\nOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THIS PROJECT OR THE WORKS AVAILABLE THROUGH\nTHIS PROJECT. YOU AGREED TO INDEMNIFY, DEFEND AND HOLD THE OWNER AND\nMAINTAINER FROM AND AGAINST ANY CLAIMS, LOSSES OR DAMAGES ARISING FROM YOUR\nUSE OF THIS PROJECT OR THE WORKS AVAILABLE THROUGH THIS PROJECT.\n\nThis license is subject to change at any time by the Project Owner or\nMaintainer.\n\nYour continued access to or use of this Project or any works\navailable through this Project shall be subject to the then-current version\nof this license.\n\nThe Project Owner and Maintainer reserve the right to change this license\nwithout needing the consent of the contributors to this Project.\n"},{"name":"router.gno","body":"package router\n\nimport (\n\t\"strings\"\n\n\t\"gno.land/p/demo/ufmt\"\n)\n\ntype (\n\tResponseWriter interface {\n\t\tWrite(s string)\n\t\tWritef(format string, values ...interface{})\n\t}\n\n\tRequest struct {\n\t\tPath string\n\t\tPrefix string\n\t\tRoute string\n\t\tArgs []string\n\t}\n\n\tHandlerFunc func(ResponseWriter, Request)\n\n\thandler struct {\n\t\tPrefix string\n\t\tFn HandlerFunc\n\t}\n)\n\nfunc NewRouter() Router {\n\treturn Router{}\n}\n\ntype Router struct {\n\thandlers []handler\n}\n\nfunc (r *Router) HandleFunc(prefix string, fn HandlerFunc) {\n\tr.handlers = append(r.handlers, handler{\n\t\tPrefix: prefix,\n\t\tFn: fn,\n\t})\n}\n\nfunc (r Router) Render(path string) string {\n\tprefix, route, args := splitRenderPath(path)\n\n\tfor _, h := range r.handlers {\n\t\tif h.Prefix == prefix {\n\t\t\tvar (\n\t\t\t\tw responseWriter\n\t\t\t\treq = Request{\n\t\t\t\t\tPath: path,\n\t\t\t\t\tPrefix: prefix,\n\t\t\t\t\tRoute: route,\n\t\t\t\t\tArgs: args,\n\t\t\t\t}\n\t\t\t)\n\n\t\t\th.Fn(\u0026w, req)\n\n\t\t\treturn w.Output()\n\t\t}\n\t}\n\n\treturn \"Path not found\"\n}\n\ntype responseWriter struct {\n\toutput strings.Builder\n}\n\nfunc (w *responseWriter) Write(s string) {\n\tw.output.WriteString(s)\n}\n\nfunc (w *responseWriter) Writef(format string, values ...interface{}) {\n\tw.output.WriteString(ufmt.Sprintf(format, values...))\n}\n\nfunc (w responseWriter) Output() string {\n\treturn w.output.String()\n}\n\nfunc splitRenderPath(path string) (prefix, route string, args []string) {\n\t// Split route prefix and route.\n\t// Path format is \"prefix/route:args\".\n\tpath = strings.TrimSpace(path)\n\tif parts := strings.SplitN(path, \"/\", 2); len(parts) == 2 {\n\t\tprefix = parts[0]\n\t\troute = parts[1]\n\n\t\t// Split route and arguments\n\t\tif parts := strings.Split(route, \":\"); len(parts) \u003e 1 {\n\t\t\troute = parts[0]\n\t\t\targs = parts[1:]\n\t\t}\n\t}\n\n\treturn prefix, route, args\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"16000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"8esF7zz8aYqiG/VcQW+aB+I6r33ThnXZtT1UgM88r8g7w1u9N0CH5Az/wb+5t5PzG+uAva2zGmpZdPFiJHsbkQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["gc-us24","gno.land at GopherCon US 2024","\n\nGopherCon US is one of the largest events for the Go programming community.\nThis year, in the vibrant city of Chicago, we had the honor of being the Diamond\nSponsor at GopherCon US 2024. From July 7th to July 10th, we were surrounded by \ntop Go talent; it was an incredible opportunity for us to connect with developers,\nshowcase our innovations, and share our expertise.\n\nGopherCon US 2024 was held at the stunning McCormick Place, bringing together\nnearly one thousand Go enthusiasts from around the world. Our team was thrilled\nto be part of this gathering, contributing to the vibrant ecosystem of Go\ndevelopers.\n\n## Highlights of Our Collaboration\n\n### Jae’s Talk\n\nJae Kwon, the founder of gno.land, gave a talk on “**Gno: Lessons in Building a\nGo Interpreter in Go.**”\n\nJae’s talk provided an in-depth overview of why this technology is gaining \ntraction in the development community. The discussion began with the key reasons\nto use Gno, and its seamless interoperability which allows for effortless \nintegration. Detailed comparisons were made between Gno and other prominent\nprogramming languages such as Solidity and Rust which are running other smart \ncontract platforms, showcasing Gno’s distinct advantages. The strengths of the\nGnoVM were a focal point, particularly its stack based AST architecture, its \nauto persistence, as well as its determinism and other features. The presentation\nalso shared valuable lessons learned from GnoVM's development and implementation,\noffering insights into best practices and challenges overcome in the future work. \nBe sure to make some time to watch [the recording](https://www.youtube.com/watch?v=betUkghf_jo)!\n\n### Gno Workshop\n\nParticipants had the opportunity to dive deep into the development process, \nguided by our expert engineer **[Dylan Boltz](https://github.com/deelawn)** who hosted a workshop on Community \nDay: **Building a decentralized app on gno.land**. The workshop provided practical \ninsights and step-by-step guidance, empowering attendees to start building their\nown applications. If you missed our workshop or want to revisit the session, you \ncan find a recorded version of the workshop [here](https://www.youtube.com/watch?v=lwL2VyjaV-A).\n\n### The gno.land Booth\nOne of the most rewarding feelings about attending these kinds of conferences\nis watching our booth quickly become a hub of activity, drawing a steady stream \nof visitors intrigued by our project. We engaged with developers from various \nbackgrounds, answering a myriad of questions about Gno, gno.land, our company, \nand the company’s [open employment opportunities](https://jobs.lever.co/allinbits).\nHaving all of this direct human interaction was not only informative but also\ndeeply insightful, providing us with valuable feedback and ideas. For more\ninformation, check out our [Official Documentation](https://docs.gno.land/).\n\n### The Gno Raffle\n\nOne of the major attractions at our booth, amongst the “gnome” beanie hat as \nwell as the T-shirts, was the raffle for a high-end mechanical keyboard. The \nraffle participants had a direct opportunity to interact with gno.land by \nfollowing the raffle instructions, leading them to use [Gno Playground](https://play.gno.land/) to import\nand deploy a smart contract raffle realm from their own laptop. The excitement \nwas palpable as attendees eagerly gathered for the drawing. The raffle not only \ndrew crowds, but also sparked numerous engaging conversations that led to Go \nengineers giving Gno a try.\n\n### The Challenge Series\n\nThis year we had the privilege to participate in a collaborative partnership\nwith the CodePro team to build the [challenge series](https://gophercon.challengeseries.org/). This collaboration was an\nopportunity for participants to learn how to interact with blockchain and \ndiscover how realms (smart contracts) can be utilized for stateful applications\nwithout relying on explicitly managing a file system or database. This was an \nopportunity to showcase gno.land’s features, like using a deployed contract as\nboth an API and as an import for other contracts.\n\n## Conclusion\n\nOverall, the enthusiasm of the attendees at GopherCon was infectious, and we \nwere delighted to see such a high level of engagement and curiosity. Whether \nit was at our booth, during the raffle, or in the workshop, the interactions\nwere meaningful and enriching. Sponsoring and collaborating at GopherCon US \n2024 was an unforgettable experience. We are grateful for the opportunity to \nconnect with the Go community, share our knowledge, and learn from fellow \ndevelopers. We extend our heartfelt thanks to everyone who visited our booth,\nparticipated in the raffle, attended Jae Kwon's presentation on Gno, and joined \nour workshop.\n\nWe invite you to stay connected with us on our [Discord](https://discord.gg/43HC5NZzHe),\nand our [blog](https://gno.land/r/gnoland/blog) where we \nwill be sharing more insights and updates on \n[Test4](https://gno.land/r/gnoland/blog:p/test4-live), our current testnet, as\nwell as the progress towards our launch.\n\nThank you, [GopherCon US 2024](https://x.com/gophercon), for an incredible experience. \nWe can't wait to see what the next event holds!\n\n","2024-08-16T00:00:00Z","VT-Cosmos","techconference,events,outreach,GoDevelopers,GoToGno,gophers"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"IFeXPrs8hrHAw3gc4nxbpBKa94U53V9i80QP3rPYVFVQAiqjOpZUB7WW+5p+dCPUHaLsk3lyKvvzKBEdzhLoOA=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g109pe3x98mze0amgzy6x9qjqgnwhc5n9sw7d483","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"xdtIQD/ljLIhCETcaEqjdsEoEQUH9zPx2bGt9GokqXNkjozZ1loBO9ORm/xG8c7ytcksYiGLqwNoGDFIUjo8xQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g109pe3x98mze0amgzy6x9qjqgnwhc5n9sw7d483","to_address":"g1ffp69ss3tfskf628lezz0pcywqp2qx0ewzqz6k","amount":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AiOVDBYGYSNVCqY2Vv7wun4taS2MgIutNRfJ/ZAfppIH"},"signature":"Wp3Ik4lz+lwLgaGt/fc6xKz9+L/GXH2/H/zDHxKOLXoHa/76P3EchfBovbfgGq+N6NCBtgT6N6VyMJREDFlCWg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1dnllrdzwfhxv3evyk09y48mgn5phfjvtyrlzm7","package":{"name":"hellonamespacetest","path":"gno.land/r/hellonamespacetest/hellonamespacetest","files":[{"name":"package.gno","body":"package hellonamespacetest\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AsGEi/6/N0zRtRCWxHb7KZ1Z/BTfZIc77fvtkSRJlmwQ"},"signature":"nb4wbfBwmX34K6XXyPZQe9u8a/KCE8nHhKBa7K8cVbl5EE/XYO400UOMq4ROc5oOnRftInZKUtOIS8Bw06ehVg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1dnllrdzwfhxv3evyk09y48mgn5phfjvtyrlzm7","package":{"name":"hellonamespacetest","path":"gno.land/r/salmad/hellonamespacetest","files":[{"name":"package.gno","body":"package hellonamespacetest\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AsGEi/6/N0zRtRCWxHb7KZ1Z/BTfZIc77fvtkSRJlmwQ"},"signature":"xHQ+krozGUjzcLAQqhSDrcXhvqxVVgQcIFg5NXwwzz9SAvlmA0Z0zfLaLCk1PQlTfYrEyS2SGuuwdRw265gg3w=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/userbook","func":"GetSignupsInRange","args":["1","5"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"CLkULXTuLUUBFgxx6xwYAkWGzb10ng7KOIJdCLAO0CNt1B6pDVbyKkQf/c6CnlvHxkTLFkCHRpH1lnqjI56ECw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","send":"","pkg_path":"gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1","func":"AdvanceProposals","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"2qTRxf5DWNbyx0KEy+TyUo8a9dCDW+p8HRE6qtFTe844DmB6ouz7GRmNgQLBSxwzDsf/zTw7intFXYWeaAYa4A=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"blog","path":"gno.land/p/gnome/blog","files":[{"name":"LICENSE","body":"Copyright (c) 2024. All rights reserved.\n\nProject Owner:\nNewTendermint, LLC\n\nProject Maintainer:\nİlker Göktuğ ÖZTÜRK. \u003cilker@ilgooz.com\u003e, \u003cilkergoktugozturk@gmail.com\u003e\n\nYour access to this Project and your contributions to this Project are subject\nto the following terms:\n\n* You hereby grant to the listed Owner and Maintainer of this Project the\nworldwide, irrevocable and royalty-free right to use, publish, relicense and\nsublicense your contributions under any non-exclusive license of their\nchoosing for commercial and non-commercial purposes.\n* You shall not attempt to bring any intellectual property infringement or\nmisappropriation claims against the Owner or Maintainer of this Project\nrelating to or arising from your contributions.\n* You represent that you are the sole owner of all rights in your\ncontributions and that no third party has any rights or interests therein.\n\nFOR THE SCOPE OF THIS LICENSE, A CONTRIBUTION IS DEFINED TO INCLUDE ANY WORKS,\nIDEAS, CODE, PROCESSES, OR APIS MADE AVAILABLE TO VIEW BY THE GENERAL PUBLIC\n(INCLUDING ANY PUBLICLY ACCESSIBLE INTERNET FORUMS AND CHAT SERVERS WHERE\nACCESS IS AVAILABLE FOR FREE WITH REGISTRATION) OR PRIVATELY TO THIS PROJECT'S\nOWNER AND MAINTAINERS; INCLUDING WORKS, IDEAS, CODE, PROCESSES, AND APIS THAT\nARE ABOUT THIS PROJECT AND ITS CONTRIBUTIONS, OR MENTIONED IN REFERENCE TO\nTHIS PROJECT, WHERE SUCH WORKS, IDEAS, CODE, PROCESSES, AND APIS ARE MATERIAL\nTO THE SUCCESS, IMPROVEMENT, OR COMPLETION OF THIS PROJECT, AS DETERMINED BY\nTHE OWNER OF THIS PROJECT.\n\nContributions may come in any form, and include (but are not limited to):\n\n* pull requests\n* diff patches\n* commentary\n* example code\n\nIf you do not want your contribution to become incorporated into this Project,\ndo not make contributions to this Project. The creation of contributions that\nmay in the future become known to this Project's Owner and Maintainer\nconstitutes a willing contribution to this Project in accordance with this\nlicense.\n\nTHIS PROJECT AND THE WORKS AVAILABLE THROUGH THIS PROJECT ARE PROVIDED “AS IS”\nAND WITHOUT WARRANTY OF ANY KIND. IN NO EVENT SHALL THE OWNER OR MAINTAINER OF\nTHIS PROJECT BE LIABLE TO YOU OR ANY THIRD PARTY FOR ANY CLAIM, DAMAGES OR\nOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THIS PROJECT OR THE WORKS AVAILABLE THROUGH\nTHIS PROJECT. YOU AGREED TO INDEMNIFY, DEFEND AND HOLD THE OWNER AND\nMAINTAINER FROM AND AGAINST ANY CLAIMS, LOSSES OR DAMAGES ARISING FROM YOUR\nUSE OF THIS PROJECT OR THE WORKS AVAILABLE THROUGH THIS PROJECT.\n\nThis license is subject to change at any time by the Project Owner or\nMaintainer.\n\nYour continued access to or use of this Project or any works\navailable through this Project shall be subject to the then-current version\nof this license.\n\nThe Project Owner and Maintainer reserve the right to change this license\nwithout needing the consent of the contributors to this Project.\n"},{"name":"asserts.gno","body":"package blog\n\nimport (\n\t\"crypto/sha256\"\n\t\"encoding/hex\"\n\t\"net/url\"\n\t\"regexp\"\n\t\"strings\"\n)\n\nvar (\n\thostnameRe = regexp.MustCompile(`^(?i)[a-z0-9-]+(\\.[a-z0-9-]+)+\\.?$`)\n\tsha256Re = regexp.MustCompile(`^[a-f0-9]{64}$`)\n\tslugRe = regexp.MustCompile(`^[a-z0-9\\p{L}]+(?:-[a-z0-9\\p{L}]+)*$`)\n)\n\n// AssertIsSlug asserts that a URL slug is valid.\nfunc AssertIsSlug(slug string) {\n\tif !IsSlug(slug) {\n\t\tpanic(\"URL slug is not valid\")\n\t}\n}\n\n// AssertContentSha256Hash asserts that a hex hash is a valid SHA256 hash.\nfunc AssertIsSha256Hash(hexHash string) {\n\tif !IsSha256Hash(hexHash) {\n\t\tpanic(\"invalid sha256 hash\")\n\t}\n}\n\n// AssertIsContentURL asserts that a URL is a valid link to a content.\n// URL must have a path to ve valid. Website URLs will fail.\nfunc AssertIsContentURL(url string) {\n\tif !IsURL(url, true) {\n\t\tpanic(\"content URL is not valid, make sure path to content is specified\")\n\t}\n}\n\n// AssertTitleIsNotEmpty asserts that a title is not an empty string.\nfunc AssertTitleIsNotEmpty(title string) {\n\tif strings.TrimSpace(title) == \"\" {\n\t\tpanic(\"title is empty\")\n\t}\n}\n\n// AssertContentSha256Hash asserts that the SHA256 hash of a content matches a hash.\nfunc AssertContentSha256Hash(content, hash string) {\n\tif hash != GetHexSha256Hash(content) {\n\t\tpanic(\"content sha256 checksum is not valid\")\n\t}\n}\n\n// IsSlug checks if a string is a valid URL slug.\nfunc IsSlug(slug string) bool {\n\treturn slugRe.MatchString(slug)\n}\n\n// IsSha256Hash checks is a hex hash is a valid SHA256 hash.\nfunc IsSha256Hash(hexHash string) bool {\n\treturn sha256Re.MatchString(strings.ToLower(hexHash))\n}\n\n// IsURL checks if a URL is valid.\n// URL path availability can optionally be enforced.\nfunc IsURL(rawURL string, requirePath bool) bool {\n\tu, err := url.ParseRequestURI(rawURL)\n\tif err != nil {\n\t\treturn false\n\t}\n\n\tif requirePath \u0026\u0026 u.Path == \"\" || u.Path == \"/\" {\n\t\treturn false\n\t}\n\n\tif u.Scheme != \"https\" \u0026\u0026 u.Scheme != \"http\" {\n\t\treturn false\n\t}\n\n\thostname := u.Hostname()\n\treturn hostname != \"\" \u0026\u0026 hostnameRe.MatchString(hostname)\n}\n\n// GetHexSha256Hash returns the hexadecimal encoding of the string's SHA256 hash.\n// An empty string is returned when the argument is an empty string.\nfunc GetHexSha256Hash(s string) string {\n\tsum := sha256.Sum256([]byte(s))\n\treturn hex.EncodeToString(sum[:])\n}\n"},{"name":"asserts_test.gno","body":"package blog\n\nimport (\n\t\"testing\"\n\n\t\"gno.land/p/gnome/blog\"\n)\n\nfunc TestIsSlug(t *testing.T) {\n\tcases := []struct {\n\t\tname, slug string\n\t\twant bool\n\t}{\n\t\t{\n\t\t\tname: \"empty\",\n\t\t\twant: false,\n\t\t},\n\t\t{\n\t\t\tname: \"one letter\",\n\t\t\tslug: \"a\",\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tname: \"one unicode letter\",\n\t\t\tslug: \"á\",\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tname: \"one word\",\n\t\t\tslug: \"foo\",\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tname: \"one unicode word\",\n\t\t\tslug: \"fóo\",\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tname: \"many words\",\n\t\t\tslug: \"foo-bar-baz\",\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tname: \"many unicode words\",\n\t\t\tslug: \"fóo-bár-báz\",\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tname: \"with spaces\",\n\t\t\tslug: \"foo bar\",\n\t\t\twant: false,\n\t\t},\n\t\t{\n\t\t\tname: \"with invalid chars\",\n\t\t\tslug: \"foo/bar\",\n\t\t\twant: false,\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Act\n\t\t\tgot := blog.IsSlug(tc.slug)\n\n\t\t\t// Assert\n\t\t\tif got != tc.want {\n\t\t\t\tt.Fatalf(\"expected slug check to return: %v\", tc.want)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestIsSha256Hash(t *testing.T) {\n\tcases := []struct {\n\t\tname, hash string\n\t\twant bool\n\t}{\n\t\t{\n\t\t\tname: \"empty\",\n\t\t\twant: false,\n\t\t},\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\thash: \"1a66cf828aea323fc58c653b0bc0d64061bb5c198e500a541a2c97f4f45b668d\",\n\t\t\twant: true,\n\t\t},\n\t\t{\n\t\t\tname: \"invalid size\",\n\t\t\thash: \"1a66cf828aea323\",\n\t\t\twant: false,\n\t\t},\n\t\t{\n\t\t\tname: \"invalid characters\",\n\t\t\thash: \"1a66#?\",\n\t\t\twant: false,\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Act\n\t\t\tgot := blog.IsSha256Hash(tc.hash)\n\n\t\t\t// Assert\n\t\t\tif got != tc.want {\n\t\t\t\tt.Fatalf(\"expected sha256 check check to return: %v\", tc.want)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestIsURL(t *testing.T) {\n\tcases := []struct {\n\t\turl string\n\t\twant bool\n\t}{\n\t\t{url: \"https\", want: false},\n\t\t{url: \"https/a\", want: false},\n\t\t{url: \"https/a/b\", want: false},\n\t\t{url: \"https/a/b/\", want: false},\n\t\t{url: \"https:\", want: false},\n\t\t{url: \"https:www.test.com\", want: false},\n\t\t{url: \"https:www.test.com/\", want: false},\n\t\t{url: \"https:www.test.com/a\", want: false},\n\t\t{url: \"https:www.test.com/a/b\", want: false},\n\t\t{url: \"https:www.test.com/a/b/\", want: false},\n\t\t{url: \"https:www.test.com:42/a/b/\", want: false},\n\t\t{url: \"https:/\", want: false},\n\t\t{url: \"https:/a\", want: false},\n\t\t{url: \"https:/a/b\", want: false},\n\t\t{url: \"https:/a/b/\", want: false},\n\t\t{url: \"https:/www.test.com/a/b\", want: false},\n\t\t{url: \"https://\", want: false},\n\t\t{url: \"https://a\", want: false},\n\t\t{url: \"https://a/b\", want: false},\n\t\t{url: \"https://a/b/\", want: false},\n\t\t{url: \"https://www.test.com\", want: false},\n\t\t{url: \"https://www.test.com/\", want: false},\n\t\t{url: \"https://www.test.com/a\", want: true},\n\t\t{url: \"https://www.test.com/a/b\", want: true},\n\t\t{url: \"https://www.test.com/a/b/\", want: true},\n\t\t{url: \"https://www.test.com:42/a/b/\", want: true},\n\t\t{url: \"https://foo.bar.test.com\", want: false},\n\t\t{url: \"https://foo.bar.test.com/\", want: false},\n\t\t{url: \"https://foo.bar.test.com/a\", want: true},\n\t\t{url: \"https://foo.bar.test.com/a/b\", want: true},\n\t\t{url: \"https://foo.bar.test.com/a/b/\", want: true},\n\t\t{url: \"https://foo.bar.test.com/a/b\", want: true},\n\t\t{url: \"https://foo.bar.test.com:42/a/b\", want: true},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.url, func(t *testing.T) {\n\t\t\t// Act\n\t\t\tgot := blog.IsURL(tc.url, true)\n\n\t\t\t// Assert\n\t\t\tif got != tc.want {\n\t\t\t\tt.Fatalf(\"expected URL check to return: %v\", tc.want)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestGetHexSha256Hash(t *testing.T) {\n\tcases := []struct {\n\t\tname, content, want string\n\t}{\n\t\t{\n\t\t\tname: \"empty\",\n\t\t\twant: \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\n\t\t},\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\tcontent: \"foo\",\n\t\t\twant: \"2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Act\n\t\t\tgot := blog.GetHexSha256Hash(tc.content)\n\n\t\t\t// Assert\n\t\t\tif got != tc.want {\n\t\t\t\tt.Fatalf(\"expected hash: '%s', got: '%s'\", tc.want, got)\n\t\t\t}\n\t\t})\n\t}\n}\n"},{"name":"blog.gno","body":"package blog\n\nimport (\n\t\"strings\"\n\n\t\"gno.land/p/demo/avl\"\n)\n\ntype (\n\t// Blog defines a blog.\n\tBlog struct {\n\t\tposts avl.Tree // string(slug) -\u003e *Post\n\n\t\t// Title is blog's title.\n\t\tTitle string\n\n\t\t// Description is the blog's description.\n\t\tDescription string\n\t}\n\n\t// PostIterFn defines the a callback to iterate blog posts.\n\tPostIterFn func(*Post) bool\n)\n\n// HasPost checks if a post with a URL slug exists.\nfunc (b Blog) HasPost(slug string) bool {\n\treturn b.posts.Has(slug)\n}\n\n// GetPost returns a blog's post.\nfunc (b Blog) GetPost(slug string) (_ *Post, found bool) {\n\tif v, found := b.posts.Get(slug); found {\n\t\treturn v.(*Post), true\n\t}\n\treturn nil, false\n}\n\n// AddPost adds a new post to the blog.\nfunc (b *Blog) AddPost(p *Post) bool {\n\tslug := strings.TrimSpace(p.Slug)\n\tif slug == \"\" {\n\t\tpanic(\"post has an empty slug\")\n\t}\n\n\treturn b.posts.Set(slug, p)\n}\n\n// RemovePost removes a post from the blog.\n// The removed post is returned after being removed if it exists.\nfunc (b *Blog) RemovePost(slug string) (_ *Post, removed bool) {\n\tif v, removed := b.posts.Remove(slug); removed {\n\t\treturn v.(*Post), true\n\t}\n\treturn nil, false\n}\n\n// IteratePosts iterates all posts by slug.\nfunc (b Blog) IteratePosts(fn PostIterFn) bool {\n\t// TODO: Improve blog post iteration\n\treturn b.posts.Iterate(\"\", \"\", func(_ string, value interface{}) bool {\n\t\treturn fn(value.(*Post))\n\t})\n}\n"},{"name":"invar.gno","body":"package blog\n\nimport \"time\"\n\nfunc NewInvarBlog(b *Blog) InvarBlog {\n\t// TODO: Remove blog and post references if Gno implements invar (inmutable) references\n\treturn InvarBlog{b}\n}\n\ntype InvarBlog struct {\n\tref *Blog\n}\n\nfunc (b InvarBlog) Title() string {\n\treturn b.ref.Title\n}\n\nfunc (b InvarBlog) Description() string {\n\treturn b.ref.Description\n}\n\nfunc (b InvarBlog) IteratePosts(fn func(InvarPost) bool) bool {\n\treturn b.ref.IteratePosts(func(p *Post) bool {\n\t\treturn fn(NewInvarPost(p))\n\t})\n}\n\nfunc NewInvarPost(p *Post) InvarPost {\n\treturn InvarPost{p}\n}\n\ntype InvarPost struct {\n\tref *Post\n}\n\nfunc (p InvarPost) Slug() string {\n\treturn p.ref.Slug\n}\n\nfunc (p InvarPost) Title() string {\n\treturn p.ref.Title\n}\n\nfunc (p InvarPost) Summary() string {\n\treturn p.ref.Summary\n}\n\nfunc (p InvarPost) Status() PostStatus {\n\treturn p.ref.Status\n}\n\nfunc (p InvarPost) Content() string {\n\treturn p.ref.Content\n}\n\nfunc (p InvarPost) ContentHash() string {\n\treturn p.ref.ContentHash\n}\n\nfunc (p InvarPost) Authors() AddressList {\n\treturn p.ref.Authors\n}\n\nfunc (p InvarPost) Editors() AddressList {\n\treturn p.ref.Editors\n}\n\nfunc (p InvarPost) Contributors() AddressList {\n\treturn p.ref.Contributors\n}\n\nfunc (p InvarPost) Publishers() AddressList {\n\treturn p.ref.Publishers\n}\n\nfunc (p InvarPost) Tags() []string {\n\treturn p.ref.Tags\n}\n\nfunc (p InvarPost) CreatedAt() time.Time {\n\treturn p.ref.CreatedAt\n}\n\nfunc (p InvarPost) UpdatedAt() time.Time {\n\treturn p.ref.UpdatedAt\n}\n\nfunc (p InvarPost) PublishAt() time.Time {\n\treturn p.ref.PublishAt\n}\n\nfunc (p InvarPost) ExpireAt() time.Time {\n\treturn p.ref.ExpireAt\n}\n"},{"name":"post.gno","body":"package blog\n\nimport (\n\t\"errors\"\n\t\"std\"\n\t\"strings\"\n\t\"time\"\n)\n\nconst (\n\tStatusDraft PostStatus = iota\n\tStatusApproved\n\tStatusPublished\n\tStatusRevised\n\tStatusArchived\n)\n\ntype (\n\t// AddressList defines a list of addresses.\n\tAddressList []std.Address\n\n\t// PostStatus defines a type for blog post states.\n\tPostStatus uint8\n\n\t// Post defines a blog post.\n\tPost struct {\n\t\t// Slug contains the URL path slug for the post.\n\t\tSlug string\n\n\t\t// Title is the post's title.\n\t\tTitle string\n\n\t\t// Summary is the post's summary.\n\t\tSummary string\n\n\t\t// Status is the current post's state.\n\t\tStatus PostStatus\n\n\t\t// Content contains the post's content.\n\t\tContent string\n\n\t\t// ContentHash contains the hash of the post's content.\n\t\tContentHash string\n\n\t\t// Authors contains the list of post authors.\n\t\tAuthors AddressList\n\n\t\t// Editors contains the list of post editors.\n\t\t// Each account belongs to an editor that significantly improved the content.\n\t\tEditors AddressList\n\n\t\t// Contributors contains the list of post contributors.\n\t\t// Each account belongs to a contributor that submitted small content changes.\n\t\tContributors AddressList\n\n\t\t// Publishers contains the accounts that published the content.\n\t\tPublishers AddressList\n\n\t\t// Tags contains a list of tags for the post.\n\t\t// These tags can be used to build the blog content taxonomy.\n\t\tTags []string\n\n\t\t// CreatedAt is the block time when the post has been created.\n\t\tCreatedAt time.Time\n\n\t\t// UpdatedAt is the block time when the post has been updated for the last time.\n\t\tUpdatedAt time.Time\n\n\t\t// PublishAt is the block time when the post should be published.\n\t\tPublishAt time.Time\n\n\t\t// ExpireAt is the block time when the post should be archived.\n\t\tExpireAt time.Time\n\t}\n)\n\n// String returns a comma separated string with the list of addresses.\nfunc (x AddressList) String() string {\n\tvar s []string\n\tfor _, item := range x {\n\t\ts = append(s, item.String())\n\t}\n\treturn strings.Join(s, \", \")\n}\n\n// HasAddress checks if an address is part of the address list.\nfunc (x AddressList) HasAddress(addr std.Address) bool {\n\tfor _, item := range x {\n\t\tif item == addr {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// String returns the post status name.\nfunc (s PostStatus) String() string {\n\tswitch s {\n\tcase StatusDraft:\n\t\treturn \"draft\"\n\tcase StatusApproved:\n\t\treturn \"approved\"\n\tcase StatusPublished:\n\t\treturn \"published\"\n\tcase StatusRevised:\n\t\treturn \"revised\"\n\tcase StatusArchived:\n\t\treturn \"archived\"\n\tdefault:\n\t\treturn \"unknown\"\n\t}\n}\n\n// IsExpired checks if the expiration date was reached.\nfunc (p Post) IsExpired() bool {\n\treturn !p.ExpireAt.IsZero() \u0026\u0026 p.ExpireAt.Before(time.Now())\n}\n\n// ParseStringToAddresses parses a string addresses.\n// String should have one or more lines where each line should contain an address.\n// Addresses are validated after being parsed.\nfunc ParseStringToAddresses(s string) (AddressList, error) {\n\tvar addresses AddressList\n\tfor _, line := range strings.Split(s, \"\\n\") {\n\t\tline = strings.TrimSpace(line)\n\t\tif line == \"\" {\n\t\t\t// Skip empty lines\n\t\t\tcontinue\n\t\t}\n\n\t\taddr := std.Address(strings.TrimSpace(line))\n\t\tif !addr.IsValid() {\n\t\t\treturn nil, errors.New(\"invalid address: \" + EscapeHTML(addr.String()))\n\t\t}\n\n\t\taddresses = append(addresses, addr)\n\t}\n\treturn addresses, nil\n}\n\n// MustParseStringToAddresses parses a string addresses.\n// String should have one or more lines where each line should contain an address.\n// Addresses are validated after being parsed.\nfunc MustParseStringToAddresses(s string) AddressList {\n\taddresses, err := ParseStringToAddresses(s)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\treturn addresses\n}\n\n// EscapeHTML escapes special characters like \"\u003c\" to become \"\u0026lt;\".\n// It escapes only five such characters: \u003c, \u003e, \u0026, ' and \".\nfunc EscapeHTML(s string) string {\n\ts = strings.ReplaceAll(s, `\u0026`, \"\u0026amp;\")\n\ts = strings.ReplaceAll(s, `\"`, \"\u0026#34;\")\n\ts = strings.ReplaceAll(s, `'`, \"\u0026#39;\")\n\ts = strings.ReplaceAll(s, `\u003c`, \"\u0026lt;\")\n\treturn strings.ReplaceAll(s, `\u003e`, \"\u0026gt;\")\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"40000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"j6faj7NCbiYqgiL4V9R3XfjHx1dUp1WS7+Tsn+hakm8yE2DvYM1YczPmN20kLuhAE5gMVA5QjCGaAOWMWEhdQA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"dao","path":"gno.land/p/gnome/dao","files":[{"name":"LICENSE","body":"Copyright (c) 2024. All rights reserved.\n\nProject Owner:\nNewTendermint, LLC\n\nProject Maintainer:\nİlker Göktuğ ÖZTÜRK. \u003cilker@ilgooz.com\u003e, \u003cilkergoktugozturk@gmail.com\u003e\n\nYour access to this Project and your contributions to this Project are subject\nto the following terms:\n\n* You hereby grant to the listed Owner and Maintainer of this Project the\nworldwide, irrevocable and royalty-free right to use, publish, relicense and\nsublicense your contributions under any non-exclusive license of their\nchoosing for commercial and non-commercial purposes.\n* You shall not attempt to bring any intellectual property infringement or\nmisappropriation claims against the Owner or Maintainer of this Project\nrelating to or arising from your contributions.\n* You represent that you are the sole owner of all rights in your\ncontributions and that no third party has any rights or interests therein.\n\nFOR THE SCOPE OF THIS LICENSE, A CONTRIBUTION IS DEFINED TO INCLUDE ANY WORKS,\nIDEAS, CODE, PROCESSES, OR APIS MADE AVAILABLE TO VIEW BY THE GENERAL PUBLIC\n(INCLUDING ANY PUBLICLY ACCESSIBLE INTERNET FORUMS AND CHAT SERVERS WHERE\nACCESS IS AVAILABLE FOR FREE WITH REGISTRATION) OR PRIVATELY TO THIS PROJECT'S\nOWNER AND MAINTAINERS; INCLUDING WORKS, IDEAS, CODE, PROCESSES, AND APIS THAT\nARE ABOUT THIS PROJECT AND ITS CONTRIBUTIONS, OR MENTIONED IN REFERENCE TO\nTHIS PROJECT, WHERE SUCH WORKS, IDEAS, CODE, PROCESSES, AND APIS ARE MATERIAL\nTO THE SUCCESS, IMPROVEMENT, OR COMPLETION OF THIS PROJECT, AS DETERMINED BY\nTHE OWNER OF THIS PROJECT.\n\nContributions may come in any form, and include (but are not limited to):\n\n* pull requests\n* diff patches\n* commentary\n* example code\n\nIf you do not want your contribution to become incorporated into this Project,\ndo not make contributions to this Project. The creation of contributions that\nmay in the future become known to this Project's Owner and Maintainer\nconstitutes a willing contribution to this Project in accordance with this\nlicense.\n\nTHIS PROJECT AND THE WORKS AVAILABLE THROUGH THIS PROJECT ARE PROVIDED “AS IS”\nAND WITHOUT WARRANTY OF ANY KIND. IN NO EVENT SHALL THE OWNER OR MAINTAINER OF\nTHIS PROJECT BE LIABLE TO YOU OR ANY THIRD PARTY FOR ANY CLAIM, DAMAGES OR\nOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THIS PROJECT OR THE WORKS AVAILABLE THROUGH\nTHIS PROJECT. YOU AGREED TO INDEMNIFY, DEFEND AND HOLD THE OWNER AND\nMAINTAINER FROM AND AGAINST ANY CLAIMS, LOSSES OR DAMAGES ARISING FROM YOUR\nUSE OF THIS PROJECT OR THE WORKS AVAILABLE THROUGH THIS PROJECT.\n\nThis license is subject to change at any time by the Project Owner or\nMaintainer.\n\nYour continued access to or use of this Project or any works\navailable through this Project shall be subject to the then-current version\nof this license.\n\nThe Project Owner and Maintainer reserve the right to change this license\nwithout needing the consent of the contributors to this Project.\n"},{"name":"dao.gno","body":"package dao\n\nimport (\n\t\"errors\"\n\t\"std\"\n\t\"strings\"\n\t\"time\"\n)\n\n// PathSeparator defines the DAO path separator.\nconst PathSeparator = \"/\"\n\ntype (\n\t// Role defines the type for DAO roles.\n\tRole string\n\n\t// Roles defines the type for a list of DAO roles.\n\tRoles []Role\n)\n\n// String returns the role as a string.\nfunc (r Role) String() string {\n\treturn string(r)\n}\n\n// NewMember creates a new DAO member.\nfunc NewMember(addr std.Address, roles ...Role) Member {\n\treturn Member{\n\t\tAddress: addr,\n\t\tRoles: roles,\n\t}\n}\n\n// Member defines a DAO member.\ntype Member struct {\n\t// Address is the member account address.\n\tAddress std.Address\n\n\t// Roles contains the optional list of roles that the member belongs to.\n\tRoles Roles\n}\n\n// String returns a string representation of the member.\nfunc (m Member) String() string {\n\tif len(m.Roles) == 0 {\n\t\treturn m.Address.String()\n\t}\n\n\tvar roles []string\n\tfor _, r := range m.Roles {\n\t\troles = append(roles, string(r))\n\t}\n\treturn m.Address.String() + \" \" + strings.Join(roles, \", \")\n}\n\n// HasRole checks if the member belongs to a specific role.\nfunc (m Member) HasRole(r Role) bool {\n\tfor _, role := range m.Roles {\n\t\tif role == r {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// Option configures DAO.\ntype Option func(*DAO)\n\n// AssignAsSuperCouncil makes the DAO a super council.\nfunc AssignAsSuperCouncil() Option {\n\treturn func(dao *DAO) {\n\t\tdao.isSuperCouncil = true\n\t}\n}\n\n// WithSubDAO assigns sub DAO to a DAO.\nfunc WithSubDAO(sub *DAO) Option {\n\treturn func(dao *DAO) {\n\t\tsub.parent = dao\n\t\tdao.children = append(dao.children, sub)\n\t}\n}\n\n// WithMembers assigns members to a DAO.\nfunc WithMembers(members ...Member) Option {\n\treturn func(dao *DAO) {\n\t\tdao.members = members\n\t}\n}\n\n// WithManifest assigns a manifest to a DAO.\n// Manifest should describe the purpose of the DAO.\nfunc WithManifest(manifest string) Option {\n\treturn func(dao *DAO) {\n\t\tdao.manifest = manifest\n\t}\n}\n\n// New creates a new DAO.\nfunc New(name, title string, options ...Option) (*DAO, error) {\n\tname = strings.TrimSpace(name)\n\tif name == \"\" {\n\t\treturn nil, errors.New(\"DAO name is required\")\n\t}\n\n\tif !IsSlug(name) {\n\t\treturn nil, errors.New(`DAO name is not valid, only letters from \"a\" to \"z\", numbers, \"-\" and \"_\" are allowed`)\n\t}\n\n\ttitle = strings.TrimSpace(title)\n\tif title == \"\" {\n\t\treturn nil, errors.New(\"DAO title is required\")\n\t}\n\n\tdao := \u0026DAO{\n\t\tname: name,\n\t\ttitle: title,\n\t\tcreatedAt: time.Now(),\n\t}\n\n\tfor _, apply := range options {\n\t\tapply(dao)\n\t}\n\n\treturn dao, nil\n}\n\n// MustNew creates a new DAO.\n// The function panics if any of the arguments is not valid.\nfunc MustNew(name, title string, options ...Option) *DAO {\n\tdao, err := New(name, title, options...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\treturn dao\n}\n\n// DAO is a decentralized autonomous organization.\ntype DAO struct {\n\tname string\n\ttitle string\n\tmanifest string\n\tisSuperCouncil bool\n\tisLocked bool\n\tlockReason string\n\tparent *DAO\n\tchildren []*DAO\n\tmembers []Member\n\tcreatedAt time.Time\n}\n\n// Name returns the name of the DAO.\nfunc (dao DAO) Name() string {\n\treturn dao.name\n}\n\n// Title returns the title of the DAO.\nfunc (dao DAO) Title() string {\n\treturn dao.title\n}\n\n// Manifest returns the manifest of the DAO.\nfunc (dao DAO) Manifest() string {\n\treturn dao.manifest\n}\n\n// SetManifest sets the manifest of the DAO.\nfunc (dao *DAO) SetManifest(s string) {\n\tdao.manifest = s\n}\n\n// CreatedAt returns the creation time of the DAO.\nfunc (dao DAO) CreatedAt() time.Time {\n\treturn dao.createdAt\n}\n\n// Parent returns the parent DAO of the sub DAO.\n// The result is nil for the DAO at the root of the DAO tree.\nfunc (dao DAO) Parent() *DAO {\n\treturn dao.parent\n}\n\n// Path returns the path of the DAO.\nfunc (dao DAO) Path() string {\n\tif dao.parent == nil {\n\t\treturn dao.name\n\t}\n\treturn dao.parent.Path() + PathSeparator + dao.name\n}\n\n// SubDAOs returns the first level sub DAOs.\nfunc (dao DAO) SubDAOs() []*DAO {\n\treturn dao.children\n}\n\n// Members returns the members of the DAOs.\nfunc (dao DAO) Members() []Member {\n\treturn dao.members\n}\n\n// LockReason returns a string with the reason the DAO is locked.\nfunc (dao DAO) LockReason() string {\n\treturn dao.lockReason\n}\n\n// IsSuperCouncil checks if the DAO is a super council.\nfunc (dao DAO) IsSuperCouncil() bool {\n\treturn dao.isSuperCouncil\n}\n\n// IsLocked checks if the DAO is locked.\nfunc (dao DAO) IsLocked() bool {\n\treturn dao.isLocked\n}\n\n// Lock locks the DAO.\nfunc (dao *DAO) Lock(reason string) {\n\tdao.lockReason = reason\n\tdao.isLocked = true\n}\n\n// HasParent checks if a DAO is a parent of this DAO.\nfunc (dao DAO) HasParent(parent *DAO) bool {\n\tif parent == nil {\n\t\treturn false\n\t}\n\treturn strings.HasPrefix(dao.Path(), parent.Path())\n}\n\n// HasMember checks if a member is part of the DAO.\nfunc (dao DAO) HasMember(addr std.Address) bool {\n\tfor _, m := range dao.members {\n\t\tif m.Address == addr {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// AddMember adds a member to the DAO.\n// Caller must check the member before adding to avoid duplications.\nfunc (dao *DAO) AddMember(m Member) {\n\tdao.members = append(dao.members, m)\n}\n\n// GetMember gets a member of the DAO.\nfunc (dao DAO) GetMember(addr std.Address) (Member, bool) {\n\tfor _, m := range dao.members {\n\t\tif m.Address == addr {\n\t\t\treturn m, true\n\t\t}\n\t}\n\treturn Member{}, false\n}\n\n// RemoveMember removes a member of the DAO.\nfunc (dao *DAO) RemoveMember(addr std.Address) bool {\n\tfor i, m := range dao.members {\n\t\tif m.Address == addr {\n\t\t\tdao.members = append(dao.members[:i], dao.members[i+1:]...)\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// AddSubDAO adds a sub DAO to the DAO.\nfunc (dao *DAO) AddSubDAO(sub *DAO) bool {\n\tif sub == nil {\n\t\treturn false\n\t}\n\n\tfor _, n := range dao.children {\n\t\tif n.name == sub.name {\n\t\t\treturn false\n\t\t}\n\t}\n\n\tsub.parent = dao\n\tdao.children = append(dao.children, sub)\n\treturn true\n}\n\n// GetDAO get a DAO by path.\nfunc (dao *DAO) GetDAO(path string) (_ *DAO, found bool) {\n\tif path == \"\" {\n\t\treturn nil, false\n\t}\n\n\tif path == dao.name {\n\t\treturn dao, true\n\t}\n\n\t// Make sure that current node is not present at the beginning of the path\n\tpath = strings.TrimPrefix(path, dao.name+PathSeparator)\n\n\t// Split DAO path in child name and relative sub path\n\tparts := strings.SplitN(path, PathSeparator, 2)\n\tchildName := parts[0]\n\n\tfor _, sub := range dao.children {\n\t\tif sub.name != childName {\n\t\t\tcontinue\n\t\t}\n\n\t\tif len(parts) \u003e 1 {\n\t\t\t// Traverse node children when a sub node path is available\n\t\t\treturn sub.GetDAO(parts[1])\n\t\t}\n\t\treturn sub, true\n\t}\n\n\treturn nil, false\n}\n\n// RemoveSubDAO removes a sub DAO.\n// The sub DAO must be a first level children of the DAO.\nfunc (dao *DAO) RemoveSubDAO(name string) bool {\n\tfor i, sub := range dao.children {\n\t\tif sub.name == name {\n\t\t\tdao.children = append(dao.children[:i], dao.children[i+1:]...)\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// IsRoot checks if the DAO is the main DAO.\n// The main DAO is the root of the DAO tree.\nfunc (dao DAO) IsRoot() bool {\n\treturn dao.parent == nil\n}\n\n// ParseStringToMembers parses a string of member addresses and roles.\n// String should have one or more lines where each line should contain an\n// address optionally followed by one or more roles.\n// Example multi line string:\n//\n//\tg1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun roleA\n//\tg1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl\n//\tg1vh7krmmzfua5xjmkatvmx09z37w34lsvd2mxa5 roleB roleA\n//\n// Addresses are validated after being parsed.\n// Roles must be validated by the caller to make sure the names are valid.\nfunc ParseStringToMembers(s string) ([]Member, error) {\n\tvar members []Member\n\tfor _, line := range strings.Split(s, \"\\n\") {\n\t\tline = strings.TrimSpace(line)\n\t\tif line == \"\" {\n\t\t\t// Skip empty lines\n\t\t\tcontinue\n\t\t}\n\n\t\tvar (\n\t\t\troles []Role\n\t\t\tfields = strings.Fields(line)\n\t\t\taddr = std.Address(strings.TrimSpace(fields[0]))\n\t\t)\n\n\t\tif !addr.IsValid() {\n\t\t\treturn nil, errors.New(\"invalid member address: \" + EscapeHTML(addr.String()))\n\t\t}\n\n\t\tfor _, v := range fields[1:] {\n\t\t\troles = appendRole(roles, strings.TrimSpace(v))\n\t\t}\n\n\t\tmembers = append(members, NewMember(addr, roles...))\n\t}\n\treturn members, nil\n}\n\n// MustParseStringToMembers parses a string of member addresses and roles.\n// String should have one or more lines where each line should contain an\n// address optionally followed by one or more roles.\n// Example multi line string:\n//\n//\tg1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun roleA\n//\tg1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl\n//\tg1vh7krmmzfua5xjmkatvmx09z37w34lsvd2mxa5 roleB roleA\n//\n// Addresses are validated after being parsed.\n// Roles must be validated by the caller to make sure the names are valid.\nfunc MustParseStringToMembers(s string) []Member {\n\tmembers, err := ParseStringToMembers(s)\n\tif err != nil {\n\t\tpanic(err.Error())\n\t}\n\treturn members\n}\n\n// appendRole append a role if it doesn't exists within the list of roles.\nfunc appendRole(roles []Role, name string) []Role {\n\tfor _, r := range roles {\n\t\tif string(r) == name {\n\t\t\treturn roles\n\t\t}\n\t}\n\treturn append(roles, Role(name))\n}\n"},{"name":"dao_test.gno","body":"package dao\n\nimport (\n\t\"std\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/testutils\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\nfunc TestMember(t *testing.T) {\n\tcases := []struct {\n\t\tname string\n\t\taddress std.Address\n\t\troles []gnome.Role\n\t\toutput string\n\t}{\n\t\t{\n\t\t\tname: \"without roles\",\n\t\t\taddress: std.Address(\"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\"),\n\t\t\toutput: \"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\",\n\t\t},\n\t\t{\n\t\t\tname: \"with one role\",\n\t\t\taddress: std.Address(\"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\"),\n\t\t\troles: []gnome.Role{\"foo\"},\n\t\t\toutput: \"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5 foo\",\n\t\t},\n\t\t{\n\t\t\tname: \"with two roles\",\n\t\t\taddress: std.Address(\"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\"),\n\t\t\troles: []gnome.Role{\"foo\", \"bar\"},\n\t\t\toutput: \"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5 foo, bar\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Act\n\t\t\tm := gnome.NewMember(tc.address, tc.roles...)\n\n\t\t\t// Assert\n\t\t\tif got := m.Address; got != tc.address {\n\t\t\t\tt.Fatalf(\"expected address %s, got: %s\", tc.address, got)\n\t\t\t}\n\n\t\t\tfor i, r := range m.Roles {\n\t\t\t\tif r != tc.roles[i] {\n\t\t\t\t\tt.Fatalf(\"expected role %s, got: %s\", tc.roles[i], r)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif got := m.String(); got != tc.output {\n\t\t\t\tt.Fatalf(\"expected member string output '%s', got: '%s'\", tc.output, got)\n\t\t\t}\n\t\t})\n\t}\n}\n\n// TODO: Add test cases to check different DAO options\nfunc TestDAO(t *testing.T) {\n\t// Arrange\n\tname := \"test\"\n\ttitle := \"Test DAO\"\n\tmanifest := \"This is a test\"\n\taddresses := []std.Address{\n\t\ttestutils.TestAddress(\"member1\"),\n\t\ttestutils.TestAddress(\"member2\"),\n\t}\n\n\t// Act\n\tdao := gnome.MustNew(name, title, gnome.WithManifest(manifest), gnome.WithMembers(\n\t\tgnome.NewMember(addresses[0]),\n\t\tgnome.NewMember(addresses[1]),\n\t))\n\n\t// Assert\n\tif got := dao.Name(); got != name {\n\t\tt.Fatalf(\"expected name: %d, got: %d\", name, got)\n\t}\n\n\tif got := dao.CreatedAt(); got.IsZero() {\n\t\tt.Fatalf(\"expected a valid creation time, got: '%s'\", got.String())\n\t}\n\n\tif got := dao.Title(); got != title {\n\t\tt.Fatalf(\"expected title: '%s', got: '%s'\", title, got)\n\t}\n\n\tif got := dao.Manifest(); got != manifest {\n\t\tt.Fatalf(\"expected manifest: '%s', got: '%s'\", manifest, got)\n\t}\n\n\tif got := dao.Parent(); got != nil {\n\t\tt.Fatalf(\"expected no parent DAO, got: '%s'\", got.Name())\n\t}\n\n\tif c := len(dao.SubDAOs()); c != 0 {\n\t\tt.Fatalf(\"expected no sub DAO nodes, got %d node(s)\", c)\n\t}\n\n\tif dao.IsSuperCouncil() {\n\t\tt.Fatal(\"expected DAO not to be a super council\")\n\t}\n\n\tif c := len(dao.Members()); c != len(addresses) {\n\t\tt.Fatalf(\"expected %d DAO members, got %d\", len(addresses), c)\n\t}\n\n\tfor _, addr := range addresses {\n\t\tif !dao.HasMember(addr) {\n\t\t\tt.Fatalf(\"expected member %s to be a member of DAO\", addr)\n\t\t}\n\n\t\tm, found := dao.GetMember(addr)\n\t\tif !found {\n\t\t\tt.Fatalf(\"expected member %s to be found\", addr)\n\t\t}\n\n\t\tif m.Address != addr {\n\t\t\tt.Fatalf(\"expected member to have address %s, got: %s\", addr, m.Address)\n\t\t}\n\t}\n}\n\nfunc TestDAOAddMember(t *testing.T) {\n\tcases := []struct {\n\t\tname string\n\t\tmember gnome.Member\n\t\tmembersCount int\n\t\tshouldExist bool\n\t\tsetup func(*gnome.DAO)\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\tmember: newTestMember(t, \"member\"),\n\t\t\tmembersCount: 1,\n\t\t\tshouldExist: true,\n\t\t},\n\t\t{\n\t\t\tname: \"existing\",\n\t\t\tmember: newTestMember(t, \"member\"),\n\t\t\tmembersCount: 2,\n\t\t\tshouldExist: true,\n\t\t\tsetup: func(dao *gnome.DAO) {\n\t\t\t\tdao.AddMember(newTestMember(t, \"member2\"))\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"duplicate\",\n\t\t\tmember: newTestMember(t, \"member\"),\n\t\t\tmembersCount: 2,\n\t\t\tshouldExist: true,\n\t\t\tsetup: func(dao *gnome.DAO) {\n\t\t\t\tdao.AddMember(newTestMember(t, \"member\"))\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tdao := gnome.MustNew(\"test\", \"Test\")\n\n\t\t\tif tc.setup != nil {\n\t\t\t\ttc.setup(dao)\n\t\t\t}\n\n\t\t\t// Act\n\t\t\tdao.AddMember(tc.member)\n\n\t\t\t// Assert\n\t\t\tif got := dao.HasMember(tc.member.Address); got != tc.shouldExist {\n\t\t\t\tt.Fatalf(\"expected has member call to return %v, got: %v\", tc.shouldExist, got)\n\t\t\t}\n\n\t\t\tm, found := dao.GetMember(tc.member.Address)\n\t\t\tif found != tc.shouldExist {\n\t\t\t\tt.Fatalf(\"expected member getter to return %v, got: %v\", tc.shouldExist, found)\n\t\t\t}\n\n\t\t\tif tc.shouldExist \u0026\u0026 m.Address != tc.member.Address {\n\t\t\t\tt.Fatalf(\"expected added member to have adderss %s, got: %s\", tc.member, m)\n\t\t\t}\n\n\t\t\tmembers := dao.Members()\n\t\t\tif c := len(members); c != tc.membersCount {\n\t\t\t\tt.Fatalf(\"expected %d member(s), got: %d\", tc.membersCount, c)\n\t\t\t}\n\n\t\t\tif len(members) \u003e 0 {\n\t\t\t\tm = members[len(members)-1]\n\t\t\t\tif m.Address != tc.member.Address {\n\t\t\t\t\tt.Fatalf(\"expected last added member address: %s, got: %s\", tc.member.Address, m.Address)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestDAORemoveMember(t *testing.T) {\n\tcases := []struct {\n\t\tname string\n\t\tmember gnome.Member\n\t\tsetup func(*gnome.DAO)\n\t\tresult bool\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\tmember: newTestMember(t, \"member\"),\n\t\t\tresult: true,\n\t\t\tsetup: func(dao *gnome.DAO) {\n\t\t\t\tdao.AddMember(newTestMember(t, \"member\"))\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"missing\",\n\t\t\tmember: newTestMember(t, \"member\"),\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tdao := gnome.MustNew(\"test\", \"Test\")\n\n\t\t\tif tc.setup != nil {\n\t\t\t\ttc.setup(dao)\n\t\t\t}\n\n\t\t\t// Act\n\t\t\tresult := dao.RemoveMember(tc.member.Address)\n\n\t\t\t// Assert\n\t\t\tif result != tc.result {\n\t\t\t\tt.Fatalf(\"expected result to be %v, got: %v\", tc.result, result)\n\t\t\t}\n\n\t\t\tif dao.HasMember(tc.member.Address) {\n\t\t\t\tt.Fatal(\"member shouldn't exist\")\n\t\t\t}\n\n\t\t\tif _, found := dao.GetMember(tc.member.Address); found {\n\t\t\t\tt.Fatal(\"expected member getter to return false\")\n\t\t\t}\n\n\t\t\tif c := len(dao.Members()); c != 0 {\n\t\t\t\tt.Fatalf(\"expected no DAO members, got: %d\", c)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestDAOAddSubDAO(t *testing.T) {\n\tcases := []struct {\n\t\tname, path string\n\t\tchildren int\n\t\tdao, subDAO *gnome.DAO\n\t\tresult bool\n\t\tsetup func(*gnome.DAO)\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\tdao: gnome.MustNew(\"main\", \"Main\"),\n\t\t\tsubDAO: gnome.MustNew(\"foo\", \"Foo\"),\n\t\t\tchildren: 1,\n\t\t\tpath: \"main/foo\",\n\t\t\tresult: true,\n\t\t},\n\t\t{\n\t\t\tname: \"with children\",\n\t\t\tdao: gnome.MustNew(\n\t\t\t\t\"main\",\n\t\t\t\t\"Main\",\n\t\t\t\tgnome.WithSubDAO(gnome.MustNew(\"bar\", \"Bar\")),\n\t\t\t),\n\t\t\tsubDAO: gnome.MustNew(\"foo\", \"Foo\"),\n\t\t\tchildren: 2,\n\t\t\tpath: \"main/foo\",\n\t\t\tresult: true,\n\t\t},\n\t\t{\n\t\t\tname: \"duplicate\",\n\t\t\tdao: gnome.MustNew(\n\t\t\t\t\"main\",\n\t\t\t\t\"Main\",\n\t\t\t\tgnome.WithSubDAO(gnome.MustNew(\"foo\", \"Foo\")),\n\t\t\t),\n\t\t\tsubDAO: gnome.MustNew(\"foo\", \"Foo\"),\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Act\n\t\t\tresult := tc.dao.AddSubDAO(tc.subDAO)\n\n\t\t\t// Assert\n\t\t\tif result != tc.result {\n\t\t\t\tt.Fatalf(\"expected result to be %v, got: %v\", tc.result, result)\n\t\t\t}\n\n\t\t\tif result {\n\t\t\t\tif got := tc.subDAO.Path(); got != tc.path {\n\t\t\t\t\tt.Fatalf(\"expected path to be '%s', got: '%s'\", tc.path, got)\n\t\t\t\t}\n\n\t\t\t\tif c := len(tc.dao.SubDAOs()); c != tc.children {\n\t\t\t\t\tt.Fatalf(\"expected %d sub DAO node(s), got %d node(s)\", tc.children, c)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestDAORemoveSubDAO(t *testing.T) {\n\tcases := []struct {\n\t\tname, subName string\n\t\tchildren int\n\t\tsubDAO *gnome.DAO\n\t\tresult bool\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\tsubDAO: gnome.MustNew(\n\t\t\t\t\"main\",\n\t\t\t\t\"Main\",\n\t\t\t\tgnome.WithSubDAO(gnome.MustNew(\"foo\", \"Foo\")),\n\t\t\t),\n\t\t\tsubName: \"foo\",\n\t\t\tresult: true,\n\t\t},\n\t\t{\n\t\t\tname: \"with children\",\n\t\t\tsubDAO: gnome.MustNew(\n\t\t\t\t\"main\",\n\t\t\t\t\"Main\",\n\t\t\t\tgnome.WithSubDAO(gnome.MustNew(\"foo\", \"Foo\")),\n\t\t\t\tgnome.WithSubDAO(gnome.MustNew(\"bar\", \"Bar\")),\n\t\t\t),\n\t\t\tsubName: \"foo\",\n\t\t\tchildren: 1,\n\t\t\tresult: true,\n\t\t},\n\t\t{\n\t\t\tname: \"missing\",\n\t\t\tsubName: \"foo\",\n\t\t\tsubDAO: gnome.MustNew(\"main\", \"Main\"),\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Act\n\t\t\tresult := tc.subDAO.RemoveSubDAO(tc.subName)\n\n\t\t\t// Assert\n\t\t\tif result != tc.result {\n\t\t\t\tt.Fatalf(\"expected result to be %v, got: %v\", tc.result, result)\n\t\t\t}\n\n\t\t\tif result {\n\t\t\t\tif c := len(tc.subDAO.SubDAOs()); c != tc.children {\n\t\t\t\t\tt.Fatalf(\"expected %d sub DAO node(s), got %d node(s)\", tc.children, c)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestDAOTree(t *testing.T) {\n\tdaoA1 := gnome.MustNew(\"a1\", \"A1\")\n\tdaoA2 := gnome.MustNew(\"a2\", \"A2\")\n\tdaoA := gnome.MustNew(\"a\", \"A\", gnome.WithSubDAO(daoA1), gnome.WithSubDAO(daoA2))\n\tdaoB1 := gnome.MustNew(\"b1\", \"B1\")\n\tdaoB := gnome.MustNew(\"b\", \"B\", gnome.WithSubDAO(daoB1))\n\tdao := gnome.MustNew(\"main\", \"Main\", gnome.WithSubDAO(daoA), gnome.WithSubDAO(daoB))\n\n\tcases := []struct {\n\t\tname, path string\n\t\tdao *gnome.DAO\n\t}{\n\t\t{\n\t\t\tname: \"root\",\n\t\t\tpath: \"main\",\n\t\t\tdao: dao,\n\t\t},\n\t\t{\n\t\t\tname: \"path a\",\n\t\t\tpath: \"main/a\",\n\t\t\tdao: daoA,\n\t\t},\n\t\t{\n\t\t\tname: \"path a1\",\n\t\t\tpath: \"main/a/a1\",\n\t\t\tdao: daoA1,\n\t\t},\n\t\t{\n\t\t\tname: \"path a2\",\n\t\t\tpath: \"main/a/a2\",\n\t\t\tdao: daoA2,\n\t\t},\n\t\t{\n\t\t\tname: \"path b\",\n\t\t\tpath: \"main/b\",\n\t\t\tdao: daoB,\n\t\t},\n\t\t{\n\t\t\tname: \"path b1\",\n\t\t\tpath: \"main/b/b1\",\n\t\t\tdao: daoB1,\n\t\t},\n\t\t{\n\t\t\tname: \"invalid\",\n\t\t\tpath: \"foo\",\n\t\t},\n\t\t{\n\t\t\tname: \"invalid sub path\",\n\t\t\tpath: \"foo/bar\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Act\n\t\t\tsubDAO, found := dao.GetDAO(tc.path)\n\n\t\t\t// Assert\n\t\t\tif subDAO != tc.dao {\n\t\t\t\tif !found {\n\t\t\t\t\tt.Fatalf(\"DAO for path '%s' not found\", tc.path)\n\t\t\t\t} else {\n\t\t\t\t\tt.Fatalf(\"unexpected DAO for path '%s': '%s'\", tc.path, subDAO.Name())\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif found \u0026\u0026 subDAO.Path() != tc.path {\n\t\t\t\tt.Fatalf(\"expected DAO to return path '%s': got '%s'\", tc.path, subDAO.Path())\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc newTestMember(t *testing.T, name string) gnome.Member {\n\tt.Helper()\n\treturn gnome.NewMember(testutils.TestAddress(name))\n}\n"},{"name":"id.gno","body":"package dao\n\nimport (\n\t\"encoding/binary\"\n\t\"strconv\"\n)\n\n// ID defines a generic ID type.\ntype ID uint64\n\n// String returns the value of the ID as a string.\nfunc (id ID) String() string {\n\treturn strconv.Itoa(int(id))\n}\n\n// Key returns the binary representation of the ID to be used as key for AVL trees.\nfunc (id ID) Key() string {\n\tbuf := make([]byte, 8)\n\tbinary.BigEndian.PutUint64(buf, uint64(id))\n\treturn string(buf)\n}\n\n// ConvertKeyToID converts a key to an ID.\n// Key is a binary representation of an ID.\nfunc ConvertKeyToID(key string) (ID, bool) {\n\tif len(key) != 8 {\n\t\treturn 0, false\n\t}\n\treturn ID(binary.BigEndian.Uint64([]byte(key))), true\n}\n"},{"name":"invar.gno","body":"package dao\n\nimport (\n\t\"std\"\n\t\"time\"\n)\n\nfunc NewInvarProposalStrategy(s ProposalStrategy) InvarProposalStrategy {\n\treturn InvarProposalStrategy{s}\n}\n\ntype InvarProposalStrategy struct {\n\tref ProposalStrategy\n}\n\nfunc (s InvarProposalStrategy) Name() string {\n\treturn s.ref.Name()\n}\n\nfunc (s InvarProposalStrategy) Quorum() float64 {\n\treturn s.ref.Quorum()\n}\n\nfunc (s InvarProposalStrategy) VotingPeriod() time.Duration {\n\treturn s.ref.VotingPeriod()\n}\n\nfunc (s InvarProposalStrategy) VoteChoices() []VoteChoice {\n\treturn s.ref.VoteChoices()\n}\n\nfunc (s InvarProposalStrategy) RenderParams() string {\n\tif r, ok := s.ref.(ParamsRenderer); ok {\n\t\treturn r.RenderParams()\n\t}\n\treturn \"\"\n}\n\n// TODO: Remove invar types if Gno implements invar (inmutable) references\nfunc NewInvarVote(v Vote) InvarVote {\n\treturn InvarVote{\n\t\tAddress: v.Address,\n\t\tChoice: v.Choice,\n\t\tReason: v.Reason,\n\t\tDAO: NewInvarDAO(v.DAO),\n\t\tCreatedAt: v.CreatedAt,\n\t}\n}\n\ntype InvarVote struct {\n\tAddress std.Address\n\tChoice VoteChoice\n\tReason string\n\tDAO InvarDAO\n\tCreatedAt time.Time\n}\n\nfunc NewInvarDAO(dao *DAO) InvarDAO {\n\treturn InvarDAO{dao}\n}\n\ntype InvarDAO struct {\n\tref *DAO\n}\n\nfunc (dao InvarDAO) Name() string {\n\treturn dao.ref.Name()\n}\n\nfunc (dao InvarDAO) Title() string {\n\treturn dao.ref.Title()\n}\n\nfunc (dao InvarDAO) Manifest() string {\n\treturn dao.ref.Manifest()\n}\n\nfunc (dao InvarDAO) CreatedAt() time.Time {\n\treturn dao.ref.CreatedAt()\n}\n\nfunc (dao InvarDAO) Parent() (_ InvarDAO, exists bool) {\n\tif p := dao.ref.Parent(); p != nil {\n\t\treturn NewInvarDAO(p), true\n\t}\n\treturn InvarDAO{}, false\n}\n\nfunc (dao InvarDAO) Path() string {\n\treturn dao.ref.Path()\n}\n\nfunc (dao InvarDAO) SubDAOs() (daos []InvarDAO) {\n\tfor _, sub := range dao.ref.SubDAOs() {\n\t\tdaos = append(daos, NewInvarDAO(sub))\n\t}\n\treturn\n}\n\nfunc (dao InvarDAO) Members() []Member {\n\treturn dao.ref.Members()\n}\n\nfunc (dao InvarDAO) LockReason() string {\n\treturn dao.ref.LockReason()\n}\n\nfunc (dao InvarDAO) IsSuperCouncil() bool {\n\treturn dao.ref.IsSuperCouncil()\n}\n\nfunc (dao InvarDAO) IsLocked() bool {\n\treturn dao.ref.IsLocked()\n}\n\nfunc (dao InvarDAO) IsRoot() bool {\n\treturn dao.ref.IsRoot()\n}\n\nfunc NewInvarProposal(p *Proposal) InvarProposal {\n\treturn InvarProposal{p}\n}\n\ntype InvarProposal struct {\n\tref *Proposal\n}\n\nfunc (p InvarProposal) ID() ID {\n\treturn p.ref.ID()\n}\n\nfunc (p InvarProposal) DAO() InvarDAO {\n\treturn NewInvarDAO(p.ref.DAO())\n}\n\nfunc (p InvarProposal) InitialDAO() InvarDAO {\n\treturn NewInvarDAO(p.ref.InitialDAO())\n}\n\nfunc (p InvarProposal) Strategy() InvarProposalStrategy {\n\treturn NewInvarProposalStrategy(p.ref.Strategy())\n}\n\nfunc (p InvarProposal) Title() string {\n\treturn p.ref.Title()\n}\n\nfunc (p InvarProposal) Description() string {\n\treturn p.ref.Description()\n}\n\nfunc (p InvarProposal) StatusReason() string {\n\treturn p.ref.StatusReason()\n}\n\nfunc (p InvarProposal) Proposer() std.Address {\n\treturn p.ref.Proposer()\n}\n\nfunc (p InvarProposal) Choice() VoteChoice {\n\treturn p.ref.Choice()\n}\n\nfunc (p InvarProposal) CreatedAt() time.Time {\n\treturn p.ref.CreatedAt()\n}\n\nfunc (p InvarProposal) Promotions() (daos []InvarDAO) {\n\tfor _, dao := range p.ref.Promotions() {\n\t\tdaos = append(daos, NewInvarDAO(dao))\n\t}\n\treturn\n}\n\nfunc (p InvarProposal) VotingDeadline() time.Time {\n\treturn p.ref.VotingDeadline()\n}\n\nfunc (p InvarProposal) ReviewDeadline() time.Time {\n\treturn p.ref.ReviewDeadline()\n}\n\nfunc (p InvarProposal) VoteChangeDuration() time.Duration {\n\treturn p.ref.VoteChangeDuration()\n}\n\nfunc (p InvarProposal) Status() ProposalStatus {\n\treturn p.ref.Status()\n}\n\nfunc (p InvarProposal) Votes() (votes []InvarVote) {\n\tfor _, v := range p.ref.Votes() {\n\t\tvotes = append(votes, NewInvarVote(v))\n\t}\n\treturn\n}\n\nfunc (p InvarProposal) VotingRecord() InvarVotingRecord {\n\treturn NewInvarVotingRecord(p.ref.VotingRecord())\n}\n\nfunc (p InvarProposal) VotingRecords() (records []InvarVotingRecord) {\n\tfor _, r := range p.ref.VotingRecords() {\n\t\trecords = append(records, NewInvarVotingRecord(r))\n\t}\n\treturn\n}\n\nfunc NewInvarVotingRecord(r *VotingRecord) InvarVotingRecord {\n\treturn InvarVotingRecord{r}\n}\n\ntype InvarVotingRecord struct {\n\tref *VotingRecord\n}\n\nfunc (r InvarVotingRecord) Votes() (votes []InvarVote) {\n\tfor _, v := range r.ref.Votes() {\n\t\tvotes = append(votes, NewInvarVote(v))\n\t}\n\treturn\n}\n\nfunc (r InvarVotingRecord) VoteCount() int {\n\treturn r.ref.VoteCount()\n}\n\nfunc (r InvarVotingRecord) Get(c VoteChoice) uint {\n\treturn r.ref.Get(c)\n}\n\nfunc (r InvarVotingRecord) Iterate(fn VotingRecordIterFn) bool {\n\treturn r.ref.Iterate(fn)\n}\n"},{"name":"paginator.gno","body":"package dao\n\nimport (\n\t\"math\"\n\t\"strconv\"\n\t\"strings\"\n)\n\nvar (\n\tdefaultPageSize = 50\n\tminPageSize = 1\n\tpagePrefix = \"page=\"\n)\n\ntype (\n\t// PaginatorIterFn defines a callback to iterate page items.\n\tPaginatorIterFn func(index int) (stop bool)\n\n\t// PaginatorOption configures the paginator.\n\tPaginatorOption func(*Paginator)\n)\n\n// WithPageSize assigns a page size to a paginator.\n// The minimum page size is 5.\nfunc WithPageSize(size int) PaginatorOption {\n\treturn func(p *Paginator) {\n\t\tif size \u003c minPageSize {\n\t\t\tp.pageSize = minPageSize\n\t\t} else {\n\t\t\tp.pageSize = size\n\t\t}\n\t}\n}\n\n// WithItemCount assigns the total number of items that can be paginated.\n// Assigning the total item count allows the paginator to determine the last page number.\nfunc WithItemCount(count int) PaginatorOption {\n\treturn func(p *Paginator) {\n\t\tp.itemCount = count\n\t}\n}\n\n// NewPaginator creates a new paginator.\n// URI path must contain the page number for the paginator to iterate items.\n// Page number is specified in the URI path using \"page=N\" where N is the page\n// number which must start from 1. For example: gno.land/p/gnome:a/b:page=2.\n// Paginator is disabled when the URI path doesn't have a page specified or\n// when the specified page is not valid.\nfunc NewPaginator(uri string, options ...PaginatorOption) Paginator {\n\trealmURI, renderPath := SplitRealmURI(uri)\n\tp := Paginator{\n\t\trealmPath: CutRealmDomain(realmURI),\n\t\tpageSize: defaultPageSize,\n\t}\n\n\tfor _, apply := range options {\n\t\tapply(\u0026p)\n\t}\n\n\tp.lastPage = int(math.Ceil(float64(p.itemCount) / float64(p.pageSize)))\n\n\t// Iterate path items until paginator arguments are found.\n\t// Path prefix and suffix are kept to be able to generate\n\t// page URLs keeping the render path format.\n\titems := strings.Split(renderPath, \":\")\n\tfor i, item := range items {\n\t\tif strings.HasPrefix(item, pagePrefix) {\n\t\t\tp.pathSuffix = items[i+1:]\n\t\t\tp.page, _ = strconv.Atoi(item[len(pagePrefix):])\n\t\t\tbreak\n\t\t}\n\n\t\tp.pathPrefix = append(p.pathPrefix, item)\n\t}\n\treturn p\n}\n\n// Paginator allows paging items.\ntype Paginator struct {\n\trealmPath string\n\tpathPrefix, pathSuffix []string\n\tpageSize, page, lastPage, itemCount int\n}\n\n// Offset returns the index for the first page item.\nfunc (p Paginator) Offset() int {\n\tif !p.IsEnabled() {\n\t\treturn 0\n\t}\n\treturn (p.page - 1) * p.pageSize\n}\n\n// PageSize returns the size of each page.\nfunc (p Paginator) PageSize() int {\n\treturn p.pageSize\n}\n\n// Page returns the current page number.\n// Zero is returned when the paginator is disabled.\nfunc (p Paginator) Page() int {\n\treturn p.page\n}\n\n// LastPage returns the number of the last page.\n// Zero is returned when paginator is initialized without the total item count.\nfunc (p Paginator) LastPage() int {\n\treturn p.lastPage\n}\n\n// IsEnabled checks if paginator is enabled.\nfunc (p Paginator) IsEnabled() bool {\n\treturn p.page \u003e 0\n}\n\n// IsLastPage checks if the current page is the last one.\nfunc (p Paginator) IsLastPage() bool {\n\treturn p.page == p.lastPage\n}\n\n// GetPageURI returns the URI for a page.\n// An empty string is returned when page is \u003c 1.\nfunc (p Paginator) GetPageURI(page int) string {\n\tif !p.IsEnabled() {\n\t\treturn \"\"\n\t}\n\n\trenderPath := append(p.pathPrefix, pagePrefix+strconv.Itoa(page))\n\trenderPath = append(renderPath, p.pathSuffix...)\n\treturn p.realmPath + \":\" + strings.Join(renderPath, \":\")\n}\n\n// PrevPageURI returns the URI path to the previous page.\n// An empty string is returned when current page is the first page.\nfunc (p Paginator) PrevPageURI() string {\n\tif p.page == 1 || !p.IsEnabled() {\n\t\treturn \"\"\n\t}\n\treturn p.GetPageURI(p.page - 1)\n}\n\n// NextPageURI returns the URI path to the next page.\nfunc (p Paginator) NextPageURI() string {\n\tif p.IsLastPage() {\n\t\treturn \"\"\n\t}\n\treturn p.GetPageURI(p.page + 1)\n}\n\n// Iterate allows iterating page items.\nfunc (p Paginator) Iterate(fn PaginatorIterFn) bool {\n\tif !p.IsEnabled() {\n\t\treturn true\n\t}\n\n\tstart := p.Offset()\n\tfor i := start; i \u003c start+p.PageSize(); i++ {\n\t\tif fn(i) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n"},{"name":"paginator_test.gno","body":"package dao\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n)\n\nfunc TestPaginator(t *testing.T) {\n\titems := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}\n\tcases := []struct {\n\t\tname, uri, prevPath, nextPath string\n\t\toffset, pageSize, page, lastPage int\n\t\tpageItems string\n\t\tstopped, enabled, isLastPage bool\n\t}{\n\t\t{\n\t\t\tname: \"page 1\",\n\t\t\turi: \"gno.land/r/gnome:foo/bar:page=1:foo=bar\",\n\t\t\tenabled: true,\n\t\t\tnextPath: \"/r/gnome:foo/bar:page=2:foo=bar\",\n\t\t\toffset: 0,\n\t\t\tpageSize: 5,\n\t\t\tpage: 1,\n\t\t\tlastPage: 2,\n\t\t\tpageItems: \"[1 2 3 4 5]\",\n\t\t},\n\t\t{\n\t\t\tname: \"page 2\",\n\t\t\turi: \"gno.land/r/gnome:foo/bar:page=2:foo=bar\",\n\t\t\tenabled: true,\n\t\t\tprevPath: \"/r/gnome:foo/bar:page=1:foo=bar\",\n\t\t\tnextPath: \"\",\n\t\t\toffset: 5,\n\t\t\tpageSize: 5,\n\t\t\tpage: 2,\n\t\t\tlastPage: 2,\n\t\t\tpageItems: \"[6 7 8 9 10]\",\n\t\t\tisLastPage: true,\n\t\t},\n\t\t{\n\t\t\tname: \"missing page\",\n\t\t\turi: \"gno.land/r/gnome:foo/bar:page=3:foo=bar\",\n\t\t\tenabled: true,\n\t\t\tprevPath: \"/r/gnome:foo/bar:page=2:foo=bar\",\n\t\t\tnextPath: \"/r/gnome:foo/bar:page=4:foo=bar\",\n\t\t\toffset: 10,\n\t\t\tpageSize: 5,\n\t\t\tpage: 3,\n\t\t\tlastPage: 2,\n\t\t\tpageItems: \"[]\",\n\t\t\tstopped: true,\n\t\t},\n\t\t{\n\t\t\tname: \"invalid page number\",\n\t\t\turi: \"gno.land/r/gnome:foo/bar:page=0:foo=bar\",\n\t\t\tenabled: false,\n\t\t\tprevPath: \"\",\n\t\t\tnextPath: \"\",\n\t\t\toffset: 0,\n\t\t\tpageSize: 4,\n\t\t\tpage: 0,\n\t\t\tlastPage: 3,\n\t\t\tpageItems: \"[]\",\n\t\t\tstopped: true,\n\t\t},\n\t\t{\n\t\t\tname: \"invalid page value\",\n\t\t\turi: \"gno.land/r/gnome:foo/bar:page=foo:foo=bar\",\n\t\t\tenabled: false,\n\t\t\tprevPath: \"\",\n\t\t\tnextPath: \"\",\n\t\t\toffset: 0,\n\t\t\tpageSize: 2,\n\t\t\tpage: 0,\n\t\t\tlastPage: 5,\n\t\t\tpageItems: \"[]\",\n\t\t\tstopped: true,\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tvar pageItems []int\n\n\t\t\t// Act\n\t\t\tp := NewPaginator(tc.uri, WithPageSize(tc.pageSize), WithItemCount(len(items)))\n\n\t\t\t// Assert\n\t\t\tif got := p.Page(); got != tc.page {\n\t\t\t\tt.Fatalf(\"expected page: %d, got: %d\", tc.page, got)\n\t\t\t}\n\n\t\t\tif got := p.LastPage(); got != tc.lastPage {\n\t\t\t\tt.Fatalf(\"expected last page: %d, got: %d\", tc.lastPage, got)\n\t\t\t}\n\n\t\t\tif got := p.PrevPageURI(); got != tc.prevPath {\n\t\t\t\tt.Fatalf(\"expected prev page path: '%s', got: '%s'\", tc.prevPath, got)\n\t\t\t}\n\n\t\t\tif got := p.NextPageURI(); got != tc.nextPath {\n\t\t\t\tt.Fatalf(\"expected next page path: '%s', got: '%s'\", tc.nextPath, got)\n\t\t\t}\n\n\t\t\tif got := p.Offset(); got != tc.offset {\n\t\t\t\tt.Fatalf(\"expected offset: %d, got: %d\", tc.offset, got)\n\t\t\t}\n\n\t\t\tif got := p.PageSize(); got != tc.pageSize {\n\t\t\t\tt.Fatalf(\"expected page size: %d, got: %d\", tc.pageSize, got)\n\t\t\t}\n\n\t\t\tif got := p.IsEnabled(); got != tc.enabled {\n\t\t\t\tt.Fatalf(\"expected enabled: %v, got: %v\", tc.enabled, got)\n\t\t\t}\n\n\t\t\tif got := p.IsLastPage(); got != tc.isLastPage {\n\t\t\t\tt.Fatalf(\"expected is last page to be: %v, got: %v\", tc.isLastPage, got)\n\t\t\t}\n\n\t\t\tstopped := p.Iterate(func(i int) bool {\n\t\t\t\tif i \u003e= len(items) {\n\t\t\t\t\treturn true\n\t\t\t\t}\n\n\t\t\t\tpageItems = append(pageItems, items[i])\n\t\t\t\treturn false\n\t\t\t})\n\t\t\tif stopped != tc.stopped {\n\t\t\t\tt.Fatalf(\"expected iteration result: %v, got: %v\", tc.stopped, stopped)\n\t\t\t}\n\n\t\t\tif got := fmt.Sprintf(\"%v\", pageItems); got != tc.pageItems {\n\t\t\t\tt.Fatalf(\"expected page items: %s, got: %s\", tc.pageItems, got)\n\t\t\t}\n\t\t})\n\t}\n}\n"},{"name":"params.gno","body":"package dao\n\nimport (\n\t\"math\"\n\t\"time\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\ntype (\n\t// DurationIterFn defines the a callback to iterate duration values.\n\tDurationIterFn func(name string, _ time.Duration) bool\n\n\t// DurationParams contains duration values for different parameters.\n\tDurationParams struct {\n\t\tparams avl.Tree\n\t}\n)\n\n// Set sets or updates a parameter value.\nfunc (p *DurationParams) Set(name string, v time.Duration) bool {\n\treturn p.params.Set(name, v)\n}\n\n// Get gets a parameter value.\nfunc (p DurationParams) Get(name string) (_ time.Duration, found bool) {\n\tif v, found := p.params.Get(name); found {\n\t\treturn v.(time.Duration), true\n\t}\n\treturn 0, false\n}\n\n// Size returns the number of duration parameters.\nfunc (p DurationParams) Size() int {\n\treturn p.params.Size()\n}\n\n// Iterate iterates duration parameter values.\nfunc (p DurationParams) Iterate(fn DurationIterFn) bool {\n\treturn p.params.Iterate(\"\", \"\", func(name string, v interface{}) bool {\n\t\treturn fn(name, v.(time.Duration))\n\t})\n}\n\n// HumanizeDuration returns a friendlier text representation of a duration.\nfunc HumanizeDuration(d time.Duration) string { // TODO: Change to use singular/plurals\n\tif d == 0 {\n\t\treturn \"\"\n\t}\n\n\tif sec := d.Seconds(); sec \u003c 60 {\n\t\treturn ufmt.Sprintf(\"%d seconds\", int(sec))\n\t}\n\n\tif m := d.Minutes(); m \u003c 60 {\n\t\tsec := math.Mod(d.Seconds(), 60)\n\t\tif sec \u003c 1 {\n\t\t\treturn ufmt.Sprintf(\"%d minutes\", int(m))\n\t\t}\n\t\treturn ufmt.Sprintf(\"%d minutes %d seconds\", int(m), int(sec))\n\t}\n\n\tif hs := d.Hours(); hs \u003c 24 {\n\t\tm := math.Mod(d.Minutes(), 60)\n\t\tif m \u003c 1 {\n\t\t\treturn ufmt.Sprintf(\"%d hours\", int(hs))\n\t\t}\n\n\t\tsec := math.Mod(d.Seconds(), 60)\n\t\tif sec \u003c 1 {\n\t\t\treturn ufmt.Sprintf(\"%d hours %d minutes\", int(hs), int(m))\n\t\t}\n\t\treturn ufmt.Sprintf(\"%d hours %d minutes %d seconds\", int(hs), int(m), int(sec))\n\t}\n\n\tdays := d.Hours() / 24\n\ths := math.Mod(d.Hours(), 24)\n\tif hs \u003c 1 {\n\t\treturn ufmt.Sprintf(\"%d days\", int(days))\n\t}\n\n\tm := math.Mod(d.Minutes(), 60)\n\tif m \u003c 0 {\n\t\treturn ufmt.Sprintf(\"%d days %d hours\", int(days), int(hs))\n\t}\n\n\tsec := math.Mod(d.Seconds(), 60)\n\tif sec \u003c 1 {\n\t\treturn ufmt.Sprintf(\"%d days %d hours %d minutes\", int(days), int(hs), int(m))\n\t}\n\treturn ufmt.Sprintf(\"%d days %d hours %d minutes %d seconds\", int(days), int(hs), int(m), int(sec))\n}\n"},{"name":"proposal.gno","body":"package dao\n\nimport (\n\t\"errors\"\n\t\"std\"\n\t\"strings\"\n\t\"time\"\n)\n\nconst (\n\tStatusReview ProposalStatus = iota\n\tStatusActive\n\tStatusPassed\n\tStatusRejected\n\tStatusWithdrawed\n\tStatusDismissed\n\tStatusFailed\n)\n\nconst (\n\t// TODO: Add more choices which also should be configurable (use a different type?)\n\tChoiceNone VoteChoice = \"\"\n\tChoiceYes VoteChoice = \"yes\"\n\tChoiceNo VoteChoice = \"no\"\n)\n\nconst (\n\tdefaultVoteChangeDuration = time.Hour\n\texecutionErrorMsg = \"proposal execution error\"\n)\n\nvar (\n\tErrAlreadyVoted = errors.New(\"member already voted on this proposal\")\n\tErrInvalidReason = errors.New(\"reason must have at least 5 characters\")\n\tErrInvalidVoteChoice = errors.New(\"invalid vote choice\")\n\tErrMemberVoteNotAllowed = errors.New(\"you must be a DAO or parent DAO member to vote\")\n\tErrProposalPromote = errors.New(\"proposals can only be promoted to a parent DAO\")\n\tErrProposalVotingDeadlineMet = errors.New(\"proposal voting deadline already met\")\n\tErrProposalNotActive = errors.New(\"proposal is not active\")\n\tErrProposalNotPassed = errors.New(`proposal status must be \"passed\"`)\n\tErrReasonRequired = errors.New(\"reason is required\")\n\tErrReviewStatusRequired = errors.New(`proposal status must be \"review\"`)\n)\n\ntype (\n\t// ExecutionError indicates that proposal execution failed.\n\tExecutionError struct {\n\t\t// Reason contains the error or error message with the reason of the error.\n\t\tReason interface{}\n\t}\n\n\t// ProposalIterFn defines the a callback to iterate proposals.\n\tProposalIterFn func(*Proposal) bool\n\n\t// ProposalOption configures proposals.\n\tProposalOption func(*Proposal)\n\n\t// ProposalStatus defines the type for proposal states.\n\tProposalStatus uint8\n\n\t// VoteChoice defines the type for proposal vote choices.\n\tVoteChoice string\n\n\t// Vote contains the information for a member vote.\n\tVote struct {\n\t\t// Address is the DAO member address.\n\t\tAddress std.Address\n\n\t\t// Choice is the proposal choice being voted.\n\t\tChoice VoteChoice\n\n\t\t// Reason contains the reason for the vote.\n\t\tReason string\n\n\t\t// DAO contains the DAO that the proposal being voted belongs to.\n\t\tDAO *DAO\n\n\t\t// CreatedAt contains the time when the vote was submitted.\n\t\tCreatedAt time.Time\n\t}\n)\n\n// Error returns the execution error message.\nfunc (e ExecutionError) Error() string {\n\tswitch v := e.Reason.(type) {\n\tcase string:\n\t\treturn executionErrorMsg + \": \" + v\n\tcase error:\n\t\treturn executionErrorMsg + \": \" + v.Error()\n\tdefault:\n\t\treturn executionErrorMsg\n\t}\n}\n\n// String returns the proposal status name.\nfunc (s ProposalStatus) String() string {\n\tswitch s {\n\tcase StatusReview:\n\t\treturn \"review\"\n\tcase StatusActive:\n\t\treturn \"active\"\n\tcase StatusPassed:\n\t\treturn \"passed\"\n\tcase StatusRejected:\n\t\treturn \"rejected\"\n\tcase StatusWithdrawed:\n\t\treturn \"withdrawed\"\n\tcase StatusDismissed:\n\t\treturn \"dismissed\"\n\tcase StatusFailed:\n\t\treturn \"failed\"\n\tdefault:\n\t\treturn \"unknown\"\n\t}\n}\n\n// IsFinal checks if the status is a final status.\n// When a status is final it can't be changed to a different status.\n// Being final means that status signals the final outcome of a proposal.\nfunc (s ProposalStatus) IsFinal() bool {\n\tswitch s {\n\tcase StatusReview, StatusActive:\n\t\treturn false\n\tdefault:\n\t\treturn true\n\t}\n}\n\n// IsExecutionError checks if an error is an ExecutionError.\nfunc IsExecutionError(err error) bool {\n\tswitch err.(type) {\n\tcase ExecutionError:\n\t\treturn true\n\tcase *ExecutionError:\n\t\treturn true\n\tdefault:\n\t\treturn false\n\t}\n}\n\n// WithDescription assigns a description to the proposal.\nfunc WithDescription(s string) ProposalOption {\n\treturn func(p *Proposal) {\n\t\tp.description = s\n\t}\n}\n\n// WithVotingDeadline assigns a voting deadline to the proposal.\nfunc WithVotingDeadline(t time.Time) ProposalOption {\n\treturn func(p *Proposal) {\n\t\tp.votingDeadline = t\n\t}\n}\n\n// WithReviewDeadline assigns a review deadline to the proposal.\n// Review status allows proposal withdraw within a time frame after the proposal is created.\n// Proposals must be activated when a review deadline is assigned.\nfunc WithReviewDeadline(t time.Time) ProposalOption {\n\treturn func(p *Proposal) {\n\t\tp.reviewDeadline = t\n\t}\n}\n\n// WithVoteChangeDuration change the default grace period to change a submitted vote choice.\nfunc WithVoteChangeDuration(d time.Duration) ProposalOption {\n\treturn func(p *Proposal) {\n\t\tp.voteChangeDuration = d\n\t}\n}\n\n// NewProposal creates a new proposal.\n// By default proposals use the standard strategy with a deadline of seven days.\nfunc NewProposal(\n\tid ID,\n\tstrategy ProposalStrategy,\n\tproposer std.Address,\n\tdao *DAO,\n\ttitle string,\n\toptions ...ProposalOption,\n) (*Proposal, error) {\n\tif dao == nil {\n\t\treturn nil, errors.New(\"proposal DAO is required\")\n\t}\n\n\tif strings.TrimSpace(title) == \"\" {\n\t\treturn nil, errors.New(\"proposal title is required\")\n\t}\n\n\tnow := time.Now()\n\tp := \u0026Proposal{\n\t\tid: id,\n\t\tproposer: proposer,\n\t\ttitle: title,\n\t\tvotingDeadline: now.Add(strategy.VotingPeriod()),\n\t\tvoteChangeDuration: defaultVoteChangeDuration,\n\t\tstrategy: strategy,\n\t\tdaos: []*DAO{dao},\n\t\tvotingRecords: []*VotingRecord{NewVotingRecord()},\n\t\tcreatedAt: now,\n\t}\n\n\tfor _, apply := range options {\n\t\tapply(p)\n\t}\n\n\t// Create the proposal as active when a review deadline is not assigned\n\tif p.reviewDeadline.IsZero() {\n\t\tp.status = StatusActive\n\t}\n\n\treturn p, nil\n}\n\n// Proposal defines a DAO proposal.\ntype Proposal struct {\n\tid ID\n\ttitle string\n\tdescription string\n\tproposer std.Address\n\tcreatedAt time.Time\n\tvotingDeadline time.Time\n\treviewDeadline time.Time\n\tvoteChangeDuration time.Duration\n\tstatus ProposalStatus\n\tstrategy ProposalStrategy\n\tdaos []*DAO\n\tvotingRecords []*VotingRecord\n\tchoice VoteChoice\n\tstatusReason string\n}\n\n// ID returns the proposal ID.\nfunc (p Proposal) ID() ID {\n\treturn p.id\n}\n\n// DAO returns the DAO that the proposal is assigned to.\n// If proposal has been promoted the returned DAO is the one where proposal has been promoted to.\nfunc (p Proposal) DAO() *DAO {\n\tcount := len(p.daos)\n\tif count == 0 {\n\t\tpanic(\"proposal is not assigned to a DAO\")\n\t}\n\treturn p.daos[count-1]\n}\n\n// InitialDAO returns the the DAO that was assigned during proposal creation.\nfunc (p Proposal) InitialDAO() *DAO {\n\tif len(p.daos) \u003e 0 {\n\t\treturn p.daos[0]\n\t}\n\treturn nil\n}\n\n// Strategy returns the strategy of the proposal.\nfunc (p Proposal) Strategy() ProposalStrategy {\n\treturn p.strategy\n}\n\n// Title returns the title of the proposal.\nfunc (p Proposal) Title() string {\n\treturn p.title\n}\n\n// Description returns the description of the proposal.\nfunc (p Proposal) Description() string {\n\treturn p.description\n}\n\n// StatusReason returns the reason that triggered the current proposal status.\n// Reason is relevant for some statuses like dismissed or failed.\nfunc (p Proposal) StatusReason() string {\n\treturn p.statusReason\n}\n\n// Proposer returns the address of the member that created the proposal.\nfunc (p Proposal) Proposer() std.Address {\n\treturn p.proposer\n}\n\n// Choice returns the winner choice.\nfunc (p Proposal) Choice() VoteChoice {\n\treturn p.choice\n}\n\n// CreatedAt returns the creation time of the proposal.\nfunc (p Proposal) CreatedAt() time.Time {\n\treturn p.createdAt\n}\n\n// Promotions returns the list of DAOs where the proposal has been promoted.\n// The result is nil when the proposal has never been promoted to another DAO.\nfunc (p Proposal) Promotions() []*DAO {\n\tif p.HasBeenPromoted() {\n\t\treturn p.daos\n\t}\n\treturn nil\n}\n\n// VotingDeadline returns the voting deadline for the proposal.\n// No more votes are allowed after this deadline.\nfunc (p Proposal) VotingDeadline() time.Time {\n\treturn p.votingDeadline\n}\n\n// ReviewDeadline returns the deadline for proposal review.\nfunc (p Proposal) ReviewDeadline() time.Time {\n\treturn p.reviewDeadline\n}\n\n// VoteChangeDuration returns the duration after voting where users can change the voted choice.\nfunc (p Proposal) VoteChangeDuration() time.Duration {\n\treturn p.voteChangeDuration\n}\n\n// Status returns the status of the proposal.\nfunc (p Proposal) Status() ProposalStatus {\n\treturn p.status\n}\n\n// Votes returns the proposal votes.\nfunc (p Proposal) Votes() []Vote {\n\treturn p.VotingRecord().Votes()\n}\n\n// VotingRecord returns the voting record of the proposal for the current DAO.\n// The record contains the number of votes for each voting choice.\nfunc (p Proposal) VotingRecord() *VotingRecord {\n\tcount := len(p.votingRecords)\n\tif count == 0 {\n\t\tpanic(\"proposal has not voting records\")\n\t}\n\treturn p.votingRecords[count-1]\n}\n\n// VotingRecords returns all voting records of the proposal.\n// Each record contains the number of votes for each DAO that the proposal was promoted to.\nfunc (p Proposal) VotingRecords() []*VotingRecord {\n\treturn p.votingRecords\n}\n\n// IsExecutable checks if the proposal is executable.\nfunc (p Proposal) IsExecutable() bool {\n\t_, ok := p.strategy.(Executer)\n\treturn ok\n}\n\n// IsChoiceAllowed checks if a vote choice is valid for the proposal.\nfunc (p Proposal) IsChoiceAllowed(choice VoteChoice) bool {\n\tfor _, c := range p.strategy.VoteChoices() {\n\t\tif c == choice {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// HasVotingDeadlinePassed checks if the voting deadline for the proposal has passed.\nfunc (p Proposal) HasVotingDeadlinePassed() bool {\n\treturn time.Now().After(p.votingDeadline)\n}\n\n// HasReviewDeadlinePassed checks if the deadline for proposal review has passed.\nfunc (p Proposal) HasReviewDeadlinePassed() bool {\n\treturn time.Now().After(p.reviewDeadline)\n}\n\n// HasBeenPromoted checks if the proposal has been promoted to another DAO.\nfunc (p Proposal) HasBeenPromoted() bool {\n\treturn len(p.daos) \u003e 1\n}\n\n// HasPromotion checks if proposal has been promoted to a DAO.\nfunc (p Proposal) HasPromotion(daoPath string) bool {\n\tfor _, dao := range p.Promotions() {\n\t\tif dao.Path() == daoPath {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// GetVotingRecord returns the voting record of a DAO.\n// Proposals can have more than one voting record if they are promoted to parent DAOs.\nfunc (p Proposal) GetVotingRecord(daoPath string) (_ *VotingRecord, found bool) {\n\tfor i, dao := range p.daos {\n\t\tif dao.Path() == daoPath {\n\t\t\t// Voting record index must match the DAO promotions index\n\t\t\treturn p.votingRecords[i], true\n\t\t}\n\t}\n\treturn nil, false\n}\n\n// Withdraw changes the status of the proposal to withdrawed.\n// Proposal must have status \"review\" to be withdrawed.\nfunc (p *Proposal) Withdraw() error {\n\tif p.status != StatusReview {\n\t\treturn ErrReviewStatusRequired\n\t}\n\n\tp.status = StatusWithdrawed\n\treturn nil\n}\n\n// Dismiss dismisses a proposal.\nfunc (p *Proposal) Dismiss(reason string) error {\n\treason = strings.TrimSpace(reason)\n\tif reason == \"\" {\n\t\treturn ErrReasonRequired\n\t}\n\n\tp.statusReason = reason\n\tp.status = StatusDismissed\n\treturn nil\n}\n\n// Fail changes the proposal status to failed.\nfunc (p *Proposal) Fail(reason string) error {\n\treason = strings.TrimSpace(reason)\n\tif reason == \"\" {\n\t\treturn ErrReasonRequired\n\t}\n\n\tp.statusReason = reason\n\tp.status = StatusFailed\n\treturn nil\n}\n\n// Activate changes the status of the proposal to active.\n// Proposal must have status \"review\" to be activated.\nfunc (p *Proposal) Activate() error {\n\tif p.status != StatusReview {\n\t\treturn ErrReviewStatusRequired\n\t}\n\n\tp.status = StatusActive\n\treturn nil\n}\n\n// Promote promotes the proposal to a parent DAO.\n// Promoting extends the voting deadline by the voting period defined for the proposal\n// strategy and also creates a new voting record for the parent DAO members.\nfunc (p *Proposal) Promote(dao *DAO) error {\n\tif !p.DAO().HasParent(dao) {\n\t\treturn ErrProposalPromote\n\t}\n\n\tp.daos = append(p.daos, dao)\n\tp.votingRecords = append(p.votingRecords, NewVotingRecord())\n\tp.votingDeadline = time.Now().Add(p.strategy.VotingPeriod())\n\treturn nil\n}\n\n// Vote submits a vote for the proposal.\nfunc (p *Proposal) Vote(addr std.Address, choice VoteChoice, reason string) error {\n\tif p.status != StatusActive {\n\t\treturn ErrProposalNotActive\n\t}\n\n\tnow := time.Now()\n\tif p.votingDeadline.Before(now) {\n\t\treturn ErrProposalVotingDeadlineMet\n\t}\n\n\tif !p.IsChoiceAllowed(choice) {\n\t\treturn ErrInvalidVoteChoice\n\t}\n\n\tif reason != \"\" {\n\t\treason = strings.TrimSpace(reason)\n\t\tif len(reason) \u003c 5 {\n\t\t\treturn ErrInvalidReason\n\t\t}\n\t}\n\n\t// When there is a vote for the account check if it's voting within the\n\t// grace period that allows changing the voted choice. This allows to\n\t// correct mistakes made when seding the vote TX within a small time frame.\n\t// TODO: Add a unit test case to check vote change\n\trecord := p.VotingRecord()\n\tfor _, v := range record.Votes() {\n\t\tif v.Address == addr {\n\t\t\tif v.CreatedAt.Add(p.voteChangeDuration).Before(now) {\n\t\t\t\treturn ErrAlreadyVoted\n\t\t\t}\n\n\t\t\trecord.Remove(addr)\n\t\t}\n\t}\n\n\t// Check the vote being submitted if vote check is required\n\tif c, ok := p.strategy.(VoteChecker); ok {\n\t\tif err := c.CheckVote(addr, choice, reason); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\t// Account must be a member of the proposal's DAO or any of its parents to be allowed to vote\n\tvar dao *DAO\n\tif p.DAO().HasMember(addr) {\n\t\t// When the account is member of the proposal's DAO its vote is accounted\n\t\t// as a vote from this DAO even if its also member of a parent DAO.\n\t\tdao = p.DAO()\n\t} else {\n\t\t// Try to find the higher order DAO that the account is member of\n\t\tdao = findBelongingDAO(addr, p.DAO().Parent())\n\t}\n\n\tif dao == nil {\n\t\treturn ErrMemberVoteNotAllowed\n\t}\n\n\trecord.Add(Vote{\n\t\tAddress: addr,\n\t\tChoice: choice,\n\t\tReason: reason,\n\t\tDAO: dao,\n\t\tCreatedAt: time.Now(),\n\t})\n\n\treturn nil\n}\n\n// Tally counts the number of votes and updates the proposal status accordingly.\n// The outcome of counting the votes depends on the proposal strategy.\n// This function does NOT check the voting deadline, it's responsibility of the caller to do so.\nfunc (p *Proposal) Tally() error {\n\tif p.status != StatusActive {\n\t\treturn ErrProposalNotActive\n\t}\n\n\t// Check if the required quorum is met\n\trecord := p.VotingRecord()\n\tpercentage := float64(record.VoteCount()) / float64(len(p.DAO().Members()))\n\tif percentage \u003c p.strategy.Quorum() {\n\t\tp.status = StatusRejected\n\t\tp.statusReason = \"low participation\"\n\t\treturn nil\n\t}\n\n\t// Tally votes and update proposal with the outcome\n\tchoice := p.strategy.Tally(p.DAO(), *record)\n\n\tswitch choice {\n\tcase ChoiceYes:\n\t\tp.choice = ChoiceYes\n\t\tp.status = StatusPassed\n\tcase ChoiceNo:\n\t\tp.choice = ChoiceNo\n\t\tp.status = StatusRejected\n\tdefault:\n\t\tp.status = StatusRejected\n\t}\n\treturn nil\n}\n\nfunc (p *Proposal) Validate() error {\n\tif v, ok := p.strategy.(Validator); ok {\n\t\tif err := v.Validate(p); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\n// Execute executes the proposal.\nfunc (p *Proposal) Execute() error { // TODO: Write test for proposal execute\n\tif p.status != StatusPassed {\n\t\treturn ErrProposalNotPassed\n\t}\n\n\tif e, ok := p.strategy.(Executer); ok {\n\t\tif err := p.Validate(); err != nil {\n\t\t\treturn ExecutionError{err}\n\t\t}\n\n\t\tif err := e.Execute(p.InitialDAO()); err != nil {\n\t\t\treturn ExecutionError{err}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc findBelongingDAO(addr std.Address, node *DAO) *DAO {\n\tif node == nil {\n\t\treturn nil\n\t}\n\n\t// Before checking the current DAO try to find\n\t// if address is a member of a higher order DAO\n\tdao := findBelongingDAO(addr, node.parent)\n\tif dao == nil \u0026\u0026 node.HasMember(addr) {\n\t\treturn node\n\t}\n\treturn nil\n}\n"},{"name":"proposal_test.gno","body":"package dao\n\nimport (\n\t\"errors\"\n\t\"std\"\n\t\"testing\"\n\t\"time\"\n\n\t\"gno.land/p/demo/testutils\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\nvar (\n\tfutureTime = time.Now().Add(time.Hour)\n\tzeroTime = time.Time{}\n)\n\n// TODO: Improve proposal unit test using test cases and adding missing methods\nfunc TestProposal(t *testing.T) {\n\tcases := []struct {\n\t\tname, title, description string\n\t\tdao *gnome.DAO\n\t\terr error\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\tdao: gnome.MustNew(\"test\", \"Test\"),\n\t\t\ttitle: \"Proposal\",\n\t\t\tdescription: \"Test proposal\",\n\t\t},\n\t\t{\n\t\t\tname: \"empty DAO\",\n\t\t\terr: errors.New(\"proposal DAO is required\"),\n\t\t},\n\t\t{\n\t\t\tname: \"empty title\",\n\t\t\tdao: gnome.MustNew(\"test\", \"Test\"),\n\t\t\terr: errors.New(\"proposal title is required\"),\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tid := gnome.ID(1)\n\t\t\tproposer := testutils.TestAddress(\"proposer\")\n\t\t\tstrategy := testStrategy{}\n\t\t\tstatus := gnome.StatusActive\n\t\t\topts := []gnome.ProposalOption{\n\t\t\t\tgnome.WithDescription(tc.description),\n\t\t\t}\n\n\t\t\t// Act\n\t\t\tproposal, err := gnome.NewProposal(id, strategy, proposer, tc.dao, tc.title, opts...)\n\n\t\t\t// Assert\n\t\t\tif tc.err != nil {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tassertNoError(t, err)\n\n\t\t\tif got := proposal.ID(); got != id {\n\t\t\t\tt.Fatalf(\"expected ID: %d, got: %d\", id, got)\n\t\t\t}\n\n\t\t\tif got := proposal.DAO(); got.Name() != tc.dao.Name() {\n\t\t\t\tt.Fatalf(\"expected DAO: '%s', got: '%s'\", tc.dao.Name(), got.Name())\n\t\t\t}\n\n\t\t\tif got := proposal.Title(); got != tc.title {\n\t\t\t\tt.Fatalf(\"expected title: '%s', got: '%s'\", tc.title, got)\n\t\t\t}\n\n\t\t\tif got := proposal.Description(); got != tc.description {\n\t\t\t\tt.Fatalf(\"expected description: '%s', got: '%s'\", tc.description, got)\n\t\t\t}\n\n\t\t\tif got := proposal.StatusReason(); got != \"\" {\n\t\t\t\tt.Fatalf(\"expected empty dismiss reason, got: '%s'\", got)\n\t\t\t}\n\n\t\t\tif got := proposal.Proposer(); got != proposer {\n\t\t\t\tt.Fatalf(\"expected proposer: '%s', got: '%s'\", proposer, got)\n\t\t\t}\n\n\t\t\tif got := proposal.CreatedAt(); got.IsZero() {\n\t\t\t\tt.Fatalf(\"expected a valid creation time, got: '%s'\", got.String())\n\t\t\t}\n\n\t\t\tif c := len(proposal.Promotions()); c != 0 {\n\t\t\t\tt.Fatalf(\"expected an empty list of promotions, got: %d DAOs\", c)\n\t\t\t}\n\n\t\t\tif got := proposal.VotingDeadline(); got.IsZero() {\n\t\t\t\tt.Fatalf(\"expected a valid deadline time, got: '%s'\", got.String())\n\t\t\t}\n\n\t\t\tnow := time.Now()\n\t\t\tif got := proposal.VotingDeadline(); got.Before(now) { // TODO: Using after makes assertion fail (?)\n\t\t\t\tt.Fatalf(\"expected deadline to happen after: '%s', got: '%s'\", now.String(), got.String())\n\t\t\t}\n\n\t\t\tif got := proposal.Status(); got != status {\n\t\t\t\tt.Fatalf(\"expected status: %d, got: %d\", status, got)\n\t\t\t}\n\n\t\t\tif got := proposal.Strategy().Name(); got != strategy.Name() {\n\t\t\t\tt.Fatalf(\"expected strategy: '%s', got: '%s'\", strategy.Name(), got)\n\t\t\t}\n\n\t\t\tif got := proposal.Strategy().Name(); got != strategy.Name() {\n\t\t\t\tt.Fatalf(\"expected strategy: '%s', got: '%s'\", strategy.Name(), got)\n\t\t\t}\n\n\t\t\tif c := len(proposal.Votes()); c != 0 {\n\t\t\t\tt.Fatalf(\"expected no votes, got: %d votes\", c)\n\t\t\t}\n\n\t\t\tif c := proposal.VotingRecord().VoteCount(); c != 0 {\n\t\t\t\tt.Fatalf(\"expected an empty votes record, got: %d records\", c)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestProposalWithdraw(t *testing.T) {\n\t// TODO: Test success cases where proposal status is review\n\twantErr := gnome.ErrReviewStatusRequired\n\twantStatus := gnome.StatusWithdrawed\n\tproposal := mustCreateProposal(t, testStrategy{}, gnome.WithReviewDeadline(futureTime))\n\n\tif err := proposal.Withdraw(); err != nil {\n\t\tt.Fatalf(\"expected no error, got: '%s'\", err.Error())\n\t}\n\n\tif err := proposal.Withdraw(); err != wantErr {\n\t\tt.Fatalf(\"expected error: '%s', got: '%s'\", wantErr.Error(), err.Error())\n\t}\n\n\tif got := proposal.Status(); got != wantStatus {\n\t\tt.Fatalf(\"expected status: %d, got: %d\", wantStatus, got)\n\t}\n}\n\nfunc TestProposalDismiss(t *testing.T) {\n\tcases := []struct {\n\t\tname, reason string\n\t\tstatus gnome.ProposalStatus\n\t\terr error\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\treason: \"Foo\",\n\t\t\tstatus: gnome.StatusDismissed,\n\t\t},\n\t\t{\n\t\t\tname: \"empty reason\",\n\t\t\terr: gnome.ErrReasonRequired,\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tproposal := mustCreateProposal(t, testStrategy{})\n\n\t\t\t// Act\n\t\t\terr := proposal.Dismiss(tc.reason)\n\n\t\t\t// Assert\n\t\t\tif tc.err != nil {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tassertNoError(t, err)\n\n\t\t\tif got := proposal.Status(); got != tc.status {\n\t\t\t\tt.Fatalf(\"expected status: %s, got: %s\", tc.status.String(), got.String())\n\t\t\t}\n\n\t\t\tif got := proposal.StatusReason(); got != tc.reason {\n\t\t\t\tt.Fatalf(\"expected dismiss reason: '%s', got: '%s'\", tc.reason, got)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestProposalActivate(t *testing.T) {\n\tcases := []struct {\n\t\tname string\n\t\tstatus gnome.ProposalStatus\n\t\tsetup func(*gnome.Proposal)\n\t\terr error\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\tstatus: gnome.StatusActive,\n\t\t},\n\t\t{\n\t\t\tname: \"review status required\",\n\t\t\tsetup: func(p *gnome.Proposal) {\n\t\t\t\tp.Activate()\n\t\t\t},\n\t\t\terr: gnome.ErrReviewStatusRequired,\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tproposal := mustCreateProposal(t, testStrategy{}, gnome.WithReviewDeadline(futureTime))\n\n\t\t\tif tc.setup != nil {\n\t\t\t\ttc.setup(proposal)\n\t\t\t}\n\n\t\t\t// Act\n\t\t\terr := proposal.Activate()\n\n\t\t\t// Assert\n\t\t\tif tc.err != nil {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tassertNoError(t, err)\n\n\t\t\tif got := proposal.Status(); got != tc.status {\n\t\t\t\tt.Fatalf(\"expected status: %s, got: %s\", tc.status.String(), got.String())\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestProposalPromote(t *testing.T) {\n\tstrategy := testStrategy{}\n\taddr := testutils.TestAddress(\"proposer\")\n\tcases := []struct {\n\t\tname string\n\t\tdaoNames []string\n\t\tsetup func() (*gnome.Proposal, *gnome.DAO)\n\t\terr error\n\t}{\n\t\t{\n\t\t\tname: \"promote to parent\",\n\t\t\tdaoNames: []string{\"child\", \"parent\"},\n\t\t\tsetup: func() (*gnome.Proposal, *gnome.DAO) {\n\t\t\t\tchild := gnome.MustNew(\"child\", \"Child\")\n\t\t\t\tparent := gnome.MustNew(\"parent\", \"Parent\", gnome.WithSubDAO(child))\n\t\t\t\tp, _ := gnome.NewProposal(1, strategy, addr, child, \"Title\")\n\t\t\t\treturn p, parent\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"promote to root\",\n\t\t\tdaoNames: []string{\"child\", \"root\"},\n\t\t\tsetup: func() (*gnome.Proposal, *gnome.DAO) {\n\t\t\t\tchild := gnome.MustNew(\"child\", \"Child\")\n\t\t\t\troot := gnome.MustNew(\"root\", \"Root\", gnome.WithSubDAO(\n\t\t\t\t\tgnome.MustNew(\"parent\", \"Parent\", gnome.WithSubDAO(child)),\n\t\t\t\t))\n\t\t\t\tp, _ := gnome.NewProposal(1, strategy, addr, child, \"Title\")\n\t\t\t\treturn p, root\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"promote to non parent\",\n\t\t\tsetup: func() (*gnome.Proposal, *gnome.DAO) {\n\t\t\t\tchild := gnome.MustNew(\"child\", \"Child\")\n\t\t\t\tgnome.MustNew(\"parent\", \"Parent\", gnome.WithSubDAO(child))\n\t\t\t\tp, _ := gnome.NewProposal(1, strategy, addr, child, \"Title\")\n\t\t\t\treturn p, gnome.MustNew(\"foo\", \"Foo\")\n\t\t\t},\n\t\t\terr: gnome.ErrProposalPromote,\n\t\t},\n\t\t{\n\t\t\tname: \"promote with one promotion\",\n\t\t\tdaoNames: []string{\"child\", \"parent\", \"root\"},\n\t\t\tsetup: func() (*gnome.Proposal, *gnome.DAO) {\n\t\t\t\tchild := gnome.MustNew(\"child\", \"Child\")\n\t\t\t\tparent := gnome.MustNew(\"parent\", \"Parent\", gnome.WithSubDAO(child))\n\t\t\t\troot := gnome.MustNew(\"root\", \"Root\", gnome.WithSubDAO(parent))\n\t\t\t\tp, _ := gnome.NewProposal(1, strategy, addr, child, \"Title\")\n\t\t\t\tp.Promote(parent)\n\t\t\t\treturn p, root\n\t\t\t},\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tp, dao := tc.setup()\n\n\t\t\tdeadline := time.Now().Add(-time.Hour * 24)\n\t\t\tp.votingDeadline = deadline // Change deadline to check that its resetted on promote\n\n\t\t\tp.VotingRecord().Add(gnome.Vote{}) // Add a single dummy vote for the current DAO\n\n\t\t\t// Act\n\t\t\terr := p.Promote(dao)\n\n\t\t\t// Assert\n\t\t\tif tc.err != nil {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tassertNoError(t, err)\n\n\t\t\tif !p.HasBeenPromoted() {\n\t\t\t\tt.Fatal(\"expected proposal to be promotedt\")\n\t\t\t}\n\n\t\t\tif !p.HasPromotion(dao.Path()) {\n\t\t\t\tt.Fatal(\"expected proposal promotions to include the DAO\")\n\t\t\t}\n\n\t\t\tif got := p.VotingDeadline(); !got.After(deadline) {\n\t\t\t\tt.Fatalf(\"expected voting deadline to be greater than original deadline: %d, got: %d\", deadline.Unix(), got.Unix())\n\t\t\t}\n\n\t\t\tif p.VotingRecord().VoteCount() != 0 {\n\t\t\t\tt.Fatal(\"expected the voting record to be empty\")\n\t\t\t}\n\n\t\t\tpromotions := p.Promotions()\n\t\t\tif c := len(promotions); c != len(tc.daoNames) {\n\t\t\t\tt.Fatalf(\"expected promotions count: %d, got: %d DAOs\", len(tc.daoNames), c)\n\t\t\t}\n\n\t\t\tfor i, dao := range promotions {\n\t\t\t\tif got := dao.Name(); tc.daoNames[i] != got {\n\t\t\t\t\tt.Fatalf(\"expected DAO name: '%s', got: '%s'\", tc.daoNames[i], got)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestProposalVote(t *testing.T) {\n\tmemberAddr := testutils.TestAddress(\"member\")\n\tsetupDAOMember := func(p *gnome.Proposal) {\n\t\tp.DAO().AddMember(gnome.NewMember(memberAddr))\n\t}\n\n\tcases := []struct {\n\t\tname, reason string\n\t\taddress std.Address\n\t\tchoice gnome.VoteChoice\n\t\tvoteCount int\n\t\toptions []gnome.ProposalOption\n\t\tsetup func(*gnome.Proposal)\n\t\terr error\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\taddress: memberAddr,\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t\tvoteCount: 1,\n\t\t\tsetup: setupDAOMember,\n\t\t},\n\t\t{\n\t\t\tname: \"proposal not active\",\n\t\t\taddress: memberAddr,\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t\toptions: []gnome.ProposalOption{\n\t\t\t\tgnome.WithReviewDeadline(futureTime),\n\t\t\t},\n\t\t\terr: gnome.ErrProposalNotActive,\n\t\t\tsetup: func(p *gnome.Proposal) {\n\t\t\t\tsetupDAOMember(p)\n\t\t\t\tp.Withdraw()\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"vote with invalid reason\",\n\t\t\taddress: memberAddr,\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t\treason: \"1234\",\n\t\t\terr: gnome.ErrInvalidReason,\n\t\t\tsetup: setupDAOMember,\n\t\t},\n\t\t{\n\t\t\tname: \"already voted\",\n\t\t\taddress: memberAddr,\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t\tvoteCount: 1,\n\t\t\toptions: []gnome.ProposalOption{\n\t\t\t\tgnome.WithVoteChangeDuration(-1),\n\t\t\t},\n\t\t\terr: gnome.ErrAlreadyVoted,\n\t\t\tsetup: func(p *gnome.Proposal) {\n\t\t\t\tsetupDAOMember(p)\n\t\t\t\tp.Vote(memberAddr, gnome.ChoiceYes, \"\")\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"vote after proposal deadline\",\n\t\t\taddress: memberAddr,\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t\toptions: []gnome.ProposalOption{\n\t\t\t\tgnome.WithVotingDeadline(zeroTime),\n\t\t\t},\n\t\t\terr: gnome.ErrProposalVotingDeadlineMet,\n\t\t\tsetup: setupDAOMember,\n\t\t},\n\t\t{\n\t\t\tname: \"non member vote not allowed\",\n\t\t\taddress: memberAddr,\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t\terr: gnome.ErrMemberVoteNotAllowed,\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tproposal := mustCreateProposal(t, testStrategy{}, tc.options...)\n\n\t\t\tif tc.setup != nil {\n\t\t\t\ttc.setup(proposal)\n\t\t\t}\n\n\t\t\t// Act\n\t\t\terr := proposal.Vote(tc.address, tc.choice, tc.reason)\n\n\t\t\t// Assert\n\t\t\tif tc.err != nil {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t} else {\n\t\t\t\tassertNoError(t, err)\n\t\t\t}\n\n\t\t\tvotes := proposal.Votes()\n\t\t\tvoteCount := len(votes)\n\t\t\tif voteCount != tc.voteCount {\n\t\t\t\tt.Fatalf(\"expected %d vote(s), got: %d\", tc.voteCount, voteCount)\n\t\t\t}\n\n\t\t\tif voteCount \u003e 0 {\n\t\t\t\tif got := votes[0].Address; got != tc.address {\n\t\t\t\t\tt.Fatalf(\"expected vote address: '%s', got: '%s'\", tc.address, got)\n\t\t\t\t}\n\n\t\t\t\tif got := votes[0].Choice; got != tc.choice {\n\t\t\t\t\tt.Fatalf(\"expected vote choice: '%s', got: '%s'\", tc.choice, got)\n\t\t\t\t}\n\n\t\t\t\tif got := votes[0].Reason; got != tc.reason {\n\t\t\t\t\tt.Fatalf(\"expected vote reason: '%s', got: '%s'\", tc.reason, got)\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestProposalTally(t *testing.T) {\n\taddresses := [3]std.Address{\n\t\ttestutils.TestAddress(\"member1\"),\n\t\ttestutils.TestAddress(\"member2\"),\n\t\ttestutils.TestAddress(\"member3\"),\n\t}\n\tsetupDAOMembers := func(p *gnome.Proposal) {\n\t\tdao := p.DAO()\n\t\tfor _, addr := range addresses {\n\t\t\tdao.AddMember(gnome.NewMember(addr))\n\t\t}\n\t}\n\n\tcases := []struct {\n\t\tname string\n\t\tvotes []gnome.Vote\n\t\tchoice gnome.VoteChoice\n\t\tstrategy gnome.ProposalStrategy\n\t\tstatus gnome.ProposalStatus\n\t\tstatusReason string\n\t\tvotingDeadlinePassed bool\n\t\toptions []gnome.ProposalOption\n\t\tsetup func(*gnome.Proposal)\n\t\terr error\n\t}{\n\t\t{\n\t\t\tname: \"proposal pass\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Address: addresses[0], Choice: gnome.ChoiceYes},\n\t\t\t\t{Address: addresses[1], Choice: gnome.ChoiceYes},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t\tstrategy: testStrategy{gnome.ChoiceYes},\n\t\t\tstatus: gnome.StatusPassed,\n\t\t\toptions: []gnome.ProposalOption{gnome.WithVotingDeadline(zeroTime)},\n\t\t\tsetup: setupDAOMembers,\n\t\t},\n\t\t{\n\t\t\tname: \"proposal rejected\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Address: addresses[0], Choice: gnome.ChoiceYes},\n\t\t\t\t{Address: addresses[1], Choice: gnome.ChoiceNo},\n\t\t\t\t{Address: addresses[2], Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNo,\n\t\t\tstrategy: testStrategy{gnome.ChoiceNo},\n\t\t\tstatus: gnome.StatusRejected,\n\t\t\toptions: []gnome.ProposalOption{gnome.WithVotingDeadline(zeroTime)},\n\t\t\tsetup: setupDAOMembers,\n\t\t},\n\t\t{\n\t\t\tname: \"no quorum\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Address: addresses[0], Choice: gnome.ChoiceYes},\n\t\t\t},\n\t\t\tstrategy: testStrategy{},\n\t\t\tstatus: gnome.StatusRejected,\n\t\t\tstatusReason: \"low participation\",\n\t\t\toptions: []gnome.ProposalOption{gnome.WithVotingDeadline(zeroTime)},\n\t\t\tsetup: setupDAOMembers,\n\t\t},\n\t\t{\n\t\t\tname: \"proposal not active\",\n\t\t\tstatus: gnome.StatusWithdrawed,\n\t\t\toptions: []gnome.ProposalOption{gnome.WithReviewDeadline(futureTime)},\n\t\t\tstrategy: testStrategy{},\n\t\t\tsetup: func(p *gnome.Proposal) {\n\t\t\t\tp.Withdraw()\n\t\t\t},\n\t\t\terr: gnome.ErrProposalNotActive,\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tproposal := mustCreateProposal(t, tc.strategy, tc.options...)\n\n\t\t\tfor _, v := range tc.votes {\n\t\t\t\t// Add votes directly to the record because deadline might be expired for some test cases\n\t\t\t\tproposal.VotingRecord().Add(v)\n\t\t\t}\n\n\t\t\tif tc.setup != nil {\n\t\t\t\ttc.setup(proposal)\n\t\t\t}\n\n\t\t\t// Act\n\t\t\terr := proposal.Tally()\n\n\t\t\t// Assert\n\t\t\tif tc.err != nil {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t} else {\n\t\t\t\tassertNoError(t, err)\n\t\t\t}\n\n\t\t\tif got := proposal.Status(); got != tc.status {\n\t\t\t\tt.Fatalf(\"expected status: %d, got: %d\", tc.status, got)\n\t\t\t}\n\n\t\t\tif got := proposal.StatusReason(); got != tc.statusReason {\n\t\t\t\tt.Fatalf(\"expected status reason: '%s', got: '%s'\", tc.statusReason, got)\n\t\t\t}\n\n\t\t\tif got := proposal.Choice(); got != tc.choice {\n\t\t\t\tt.Fatalf(\"expected winner choice: '%s', got: '%s'\", tc.choice, got)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc mustCreateProposal(t *testing.T, s gnome.ProposalStrategy, options ...gnome.ProposalOption) *gnome.Proposal {\n\tt.Helper()\n\n\tdao := gnome.MustNew(\"test\", \"Test\")\n\taddr := testutils.TestAddress(\"proposer\")\n\tproposal, err := gnome.NewProposal(1, s, addr, dao, \"Title\", options...)\n\tif err != nil {\n\t\tt.Fatal(err)\n\t}\n\n\treturn proposal\n}\n\nfunc assertError(t *testing.T, expected interface{}, actual error) {\n\tt.Helper()\n\n\twant, ok := expected.(string)\n\tif !ok {\n\t\tif err, ok := expected.(error); ok {\n\t\t\twant = err.Error()\n\t\t}\n\t}\n\n\tif actual == nil {\n\t\tt.Fatalf(\"expected error: '%s', got no error\", want)\n\t}\n\n\tif want != actual.Error() {\n\t\tt.Fatalf(\"expected error: '%s', got: '%s'\", want, actual.Error())\n\t}\n}\n\nfunc assertNoError(t *testing.T, err interface{}) {\n\tt.Helper()\n\n\tif err == nil {\n\t\treturn\n\t}\n\n\tactual, ok := err.(string)\n\tif !ok {\n\t\tif e, ok := err.(error); ok {\n\t\t\tactual = e.Error()\n\t\t}\n\t}\n\n\tif actual != \"\" {\n\t\tt.Fatalf(\"expected no error, got: '%s'\", actual)\n\t}\n}\n\ntype testStrategy struct {\n\tChoice gnome.VoteChoice\n}\n\nfunc (testStrategy) Name() string { return \"test\" }\nfunc (testStrategy) Quorum() float64 { return 0.51 }\nfunc (testStrategy) VotingPeriod() time.Duration { return time.Hour * 24 * 2 }\nfunc (s testStrategy) Tally(*gnome.DAO, gnome.VotingRecord) gnome.VoteChoice { return s.Choice }\n\nfunc (testStrategy) VoteChoices() []gnome.VoteChoice {\n\treturn []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo}\n}\n"},{"name":"record.gno","body":"package dao\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/avl\"\n)\n\n// VotingRecordIterFn defines the a callback to iterate voting choices.\ntype VotingRecordIterFn func(_ VoteChoice, voteCount uint) bool\n\n// NewVotingRecord creates a new voting record.\nfunc NewVotingRecord() *VotingRecord {\n\treturn \u0026VotingRecord{}\n}\n\n// VotingRecord mamages votes and vote count.\ntype VotingRecord struct {\n\tvotes []Vote\n\tcounter avl.Tree // VoteChoice -\u003e count (uint)\n}\n\n// Votes return the list of votes.\nfunc (r VotingRecord) Votes() []Vote {\n\treturn r.votes\n}\n\n// VoteCount returns the number of votes.\nfunc (r VotingRecord) VoteCount() int {\n\treturn len(r.votes)\n}\n\n// Get returns the number of votes for vote choice.\nfunc (r VotingRecord) Get(c VoteChoice) uint {\n\tkey := string(c)\n\tif v, ok := r.counter.Get(key); ok {\n\t\treturn v.(uint)\n\t}\n\treturn 0\n}\n\n// Add adds a vote to the record.\nfunc (r *VotingRecord) Add(v Vote) {\n\tr.votes = append(r.votes, v)\n\tkey := string(v.Choice)\n\tr.counter.Set(key, r.Get(v.Choice)+1)\n}\n\n// Remove removes a vote from the record.\nfunc (r *VotingRecord) Remove(addr std.Address) bool {\n\tfor i, v := range r.votes {\n\t\tif v.Address == addr {\n\t\t\tr.votes = append(r.votes[:i], r.votes[i+1:]...)\n\t\t\tkey := string(v.Choice)\n\t\t\tr.counter.Set(key, r.Get(v.Choice)-1)\n\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\n// Iterate iterates all vote choices.\nfunc (r VotingRecord) Iterate(fn VotingRecordIterFn) bool {\n\treturn r.counter.Iterate(\"\", \"\", func(key string, value interface{}) bool {\n\t\tchoice := VoteChoice(key)\n\t\treturn fn(choice, value.(uint))\n\t})\n}\n\n// SelectChoiceByMajority select the vote choice by majority.\n// Vote choice is a majority when chosen by more than half of the votes.\n// Majority type is defined by the caller depending on the vote records and abstentions, it would be\n// absolute majority if abstentions are considered, otherwise it would be considered simple majority.\nfunc SelectChoiceByMajority(r VotingRecord, abstentions int) (VoteChoice, bool) {\n\tvotesCount := r.VoteCount() + abstentions\n\tchoice := getMajorityChoice(r)\n\tisMajority := r.Get(choice) \u003e uint(votesCount/2)\n\treturn choice, isMajority\n}\n\n// SelectChoiceBySuperMajority select the vote choice by super majority using a 2/3s threshold.\n// Abstentions are not considered when calculating the super majority choice.\nfunc SelectChoiceBySuperMajority(r VotingRecord) (VoteChoice, bool) {\n\tchoice := getMajorityChoice(r)\n\tisMajority := r.Get(choice) \u003e uint((2*r.VoteCount())/3) // TODO: Allow threshold customization\n\treturn choice, isMajority\n}\n\n// SelectChoiceByPlurality selects the vote choice by plurality.\n// The choice will be considered a majority if it has votes and if there is no other\n// choice with the same number of votes. A tie won't be considered majority.\nfunc SelectChoiceByPlurality(r VotingRecord) (VoteChoice, bool) {\n\tvar (\n\t\tchoice VoteChoice\n\t\tcurrentCount uint\n\t\tisMajority bool\n\t)\n\n\tr.Iterate(func(c VoteChoice, count uint) bool {\n\t\tif currentCount \u003c count {\n\t\t\tchoice = c\n\t\t\tcurrentCount = count\n\t\t\tisMajority = true\n\t\t} else if currentCount == count {\n\t\t\tisMajority = false\n\t\t}\n\t\treturn false\n\t})\n\treturn choice, isMajority\n}\n\n// getMajorityChoice returns the choice voted by the majority.\n// The result is only valid when there is a majority.\n// Caller must validate that the returned choice represents a majority.\nfunc getMajorityChoice(r VotingRecord) VoteChoice {\n\tvar (\n\t\tchoice VoteChoice\n\t\tcurrentCount uint\n\t)\n\n\tr.Iterate(func(c VoteChoice, count uint) bool {\n\t\tif currentCount \u003c count {\n\t\t\tchoice = c\n\t\t\tcurrentCount = count\n\t\t}\n\t\treturn false\n\t})\n\n\treturn choice\n}\n"},{"name":"record_test.gno","body":"package dao\n\nimport (\n\t\"testing\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\nfunc TestVotingRecord(t *testing.T) {\n\t// Act\n\trecord := NewVotingRecord()\n\n\t// Assert\n\tif got := record.Votes(); got != nil {\n\t\tt.Fatalf(\"expected no votes, got: %d\", len(got))\n\t}\n\n\tif got := record.VoteCount(); got != 0 {\n\t\tt.Fatalf(\"expected no vote count: 0, got: %d\", got)\n\t}\n}\n\nfunc TestVotingRecordAdd(t *testing.T) {\n\t// Arrange\n\trecord := NewVotingRecord()\n\tvote := gnome.Vote{Choice: gnome.ChoiceYes}\n\n\t// Act\n\trecord.Add(vote)\n\n\t// Assert\n\tvotes := record.Votes()\n\tif c := len(votes); c != 1 {\n\t\tt.Fatalf(\"expected one votes, got: %d\", c)\n\t}\n\n\tif got := votes[0]; got != vote {\n\t\tt.Fatalf(\"expected vote: %v, got: %v\", vote, got)\n\t}\n\n\tif got := record.VoteCount(); got != 1 {\n\t\tt.Fatalf(\"expected vote count: %d, got: %d\", 1, got)\n\t}\n\n\tif got := record.Get(vote.Choice); got != 1 {\n\t\tt.Fatalf(\"expected record to get one '%v' count, got: %d\", gnome.ChoiceYes, got)\n\t}\n\n\trecord.Iterate(func(v gnome.VoteChoice, count uint) bool {\n\t\tif v != gnome.ChoiceYes {\n\t\t\tt.Fatalf(\"expected iterate choice: %v, got: %v\", gnome.ChoiceYes, v)\n\t\t}\n\n\t\tif count != 1 {\n\t\t\tt.Fatalf(\"expected iterate vote count: %d, got: %d\", 1, count)\n\t\t}\n\n\t\treturn false\n\t})\n}\n\nfunc TestVotingRecordRemove(t *testing.T) {\n\tt.Skip(\"TODO: Write unit test for VotingRecord.Remove()\")\n}\n\nfunc TestSelectChoiceByMajority(t *testing.T) {\n\tt.Skip(\"TODO: Write unit test for SelectChoiceByMajority\")\n}\n\nfunc TestSelectChoiceBySuperMajority(t *testing.T) {\n\tt.Skip(\"TODO: Write unit test for SelectChoiceBySuperMajority\")\n}\n\nfunc TestSelectChoiceByPlurality(t *testing.T) {\n\tt.Skip(\"TODO: Write unit test for SelectChoiceByPlurality\")\n}\n"},{"name":"render.gno","body":"package dao\n\nimport (\n\t\"strings\"\n\n\t\"gno.land/p/demo/ufmt\"\n)\n\n// EscapeHTML escapes special characters like \"\u003c\" to become \"\u0026lt;\".\n// It escapes only five such characters: \u003c, \u003e, \u0026, ' and \".\nfunc EscapeHTML(s string) string {\n\ts = strings.ReplaceAll(s, `\u0026`, \"\u0026amp;\")\n\ts = strings.ReplaceAll(s, `\"`, \"\u0026#34;\")\n\ts = strings.ReplaceAll(s, `'`, \"\u0026#39;\")\n\ts = strings.ReplaceAll(s, `\u003c`, \"\u0026lt;\")\n\treturn strings.ReplaceAll(s, `\u003e`, \"\u0026gt;\")\n}\n\n// NewLink creates a new Markdown link.\nfunc NewLink(text, uri string) string {\n\treturn ufmt.Sprintf(\"[%s](%s)\", text, uri)\n}\n\n// NewLinkURI creates a new Markdown link where text and URI are the same.\nfunc NewLinkURI(uri string) string {\n\treturn ufmt.Sprintf(\"[%s](%s)\", uri, uri)\n}\n"},{"name":"strategy.gno","body":"package dao\n\nimport (\n\t\"std\"\n\t\"time\"\n)\n\ntype (\n\t// VoteChoiceRecord contains the number of counted votes for a single voting choice.\n\tVoteChoiceRecord struct {\n\t\tChoice VoteChoice\n\t\tCount uint\n\t}\n\n\t// ProposalStrategy defines the interface for the different proposal types.\n\tProposalStrategy interface {\n\t\t// Name returns the name of the strategy.\n\t\tName() string\n\n\t\t// Quorum returns the minimum required percentage of DAO member votes\n\t\t// required for a proposal to pass.\n\t\tQuorum() float64\n\n\t\t// VotingPeriod returns the period that a proposal should allow voting.\n\t\tVotingPeriod() time.Duration\n\n\t\t// VoteChoices returns the valid voting choices for the strategy.\n\t\tVoteChoices() []VoteChoice\n\n\t\t// Tally counts the votes and returns the winner voting choice.\n\t\t// The DAO argument is the DAO that the proposal is currently assigned to,\n\t\t// by default the one where the proposal was created.\n\t\t// Proposals can be promoted to parent DAOs in which case the DAO argument\n\t\t// is the DAO where the proposal was promoted the last time.\n\t\tTally(*DAO, VotingRecord) VoteChoice\n\t}\n)\n\n// VoteChecker defines an interface for proposal vote validation.\n// Proposal strategies that require checking votes when they are submitted should implement it.\ntype VoteChecker interface {\n\t// CheckVote checks that a vote is valid for the strategy.\n\tCheckVote(member std.Address, choice VoteChoice, reason string) error\n}\n\n// Executer defines an interface for executable proposals.\n// Proposals strategies that implement the interface can modify the DAO state when proposal passes.\ntype Executer interface {\n\t// Execute executes the proposal.\n\t// The DAO argument is the DAO where the proposal was created, even if the proposal has been promoted\n\t// to a parent DAO.\n\t// TODO: Execute should return some feedback on success\n\tExecute(*DAO) error\n}\n\n// Validator defines an interface for proposal validation.\n// Proposal strategies that implement the interface can validate that a proposal is valid for the current state.\ntype Validator interface {\n\t// Validate validates if a proposal is valid for the current state.\n\tValidate(*Proposal) error\n}\n\n// ParamsRenderer defines an interface to allow strategies to render its input parameters.\ntype ParamsRenderer interface {\n\t// RenderParams returns a markdown with the rendered strategy parameters.\n\tRenderParams() string\n}\n"},{"name":"uri.gno","body":"package dao\n\nimport (\n\t\"regexp\"\n\t\"strings\"\n)\n\nvar reSlug = regexp.MustCompile(\"^[a-zA-Z]+[a-zA-Z0-9-_]*$\")\n\n// IsSlug checks if a string is a valid slug.\nfunc IsSlug(s string) bool {\n\treturn reSlug.MatchString(s)\n}\n\n// SplitRealmURI splits a Gnoland URI into Realm URI and render path.\nfunc SplitRealmURI(uri string) (realmURI, renderPath string) {\n\tif uri == \"\" {\n\t\treturn\n\t}\n\n\tparts := strings.SplitN(uri, \":\", 2)\n\trealmURI = parts[0]\n\tif len(parts) \u003e 1 {\n\t\trenderPath = parts[1]\n\t}\n\treturn\n}\n\n// CutRealmDomain cuts out the Gnoland domain prefix from a URI.\nfunc CutRealmDomain(uri string) string {\n\trealmPath, _ := strings.CutPrefix(uri, \"gno.land\")\n\treturn realmPath\n}\n"},{"name":"uri_test.gno","body":"package dao\n\nimport (\n\t\"testing\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\nfunc TestSplitRealmURI(t *testing.T) {\n\tcases := []struct {\n\t\tname, uri, realmURI, renderPath string\n\t}{\n\t\t{\n\t\t\tname: \"realm URI\",\n\t\t\turi: \"gno.land/r/gnome\",\n\t\t\trealmURI: \"gno.land/r/gnome\",\n\t\t},\n\t\t{\n\t\t\tname: \"realm URI with render path\",\n\t\t\turi: \"gno.land/r/gnome:foo/bar\",\n\t\t\trealmURI: \"gno.land/r/gnome\",\n\t\t\trenderPath: \"foo/bar\",\n\t\t},\n\t\t{\n\t\t\tname: \"realm URI with render path\",\n\t\t\turi: \"gno.land/r/gnome:foo/bar\",\n\t\t\trealmURI: \"gno.land/r/gnome\",\n\t\t\trenderPath: \"foo/bar\",\n\t\t},\n\t\t{\n\t\t\tname: \"empty URI\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Act\n\t\t\trealmURI, renderPath := gnome.SplitRealmURI(tc.uri)\n\n\t\t\t// Assert\n\t\t\tif realmURI != tc.realmURI {\n\t\t\t\tt.Fatalf(\"expected realm URI: '%s', got: '%s'\", tc.realmURI, realmURI)\n\t\t\t}\n\n\t\t\tif renderPath != tc.renderPath {\n\t\t\t\tt.Fatalf(\"expected render path: '%s', got: '%s'\", tc.renderPath, renderPath)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestCutRealmDomain(t *testing.T) {\n\tcases := []struct {\n\t\tname, uri, path string\n\t}{\n\t\t{\n\t\t\tname: \"with domain\",\n\t\t\turi: \"gno.land/r/gnome\",\n\t\t\tpath: \"/r/gnome\",\n\t\t},\n\t\t{\n\t\t\tname: \"without domain\",\n\t\t\turi: \"/r/gnome\",\n\t\t\tpath: \"/r/gnome\",\n\t\t},\n\t\t{\n\t\t\tname: \"empty\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Act\n\t\t\tpath := gnome.CutRealmDomain(tc.uri)\n\n\t\t\t// Assert\n\t\t\tif path != tc.path {\n\t\t\t\tt.Fatalf(\"expected path: '%s', got: '%s'\", tc.path, path)\n\t\t\t}\n\t\t})\n\t}\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"16000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"FVx60BCDNJvGu3kmFzCF3FpCARNfQGXUgv9o05P6a8ooWmwJ+ufTEYFf1iEjNi8MjsUgFGE6qont0wMzISNMww=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"router","path":"gno.land/p/gnome/router/v1","files":[{"name":"LICENSE","body":"Copyright (c) 2024. All rights reserved.\n\nProject Owner:\nNewTendermint, LLC\n\nProject Maintainer:\nİlker Göktuğ ÖZTÜRK. \u003cilker@ilgooz.com\u003e, \u003cilkergoktugozturk@gmail.com\u003e\n\nYour access to this Project and your contributions to this Project are subject\nto the following terms:\n\n* You hereby grant to the listed Owner and Maintainer of this Project the\nworldwide, irrevocable and royalty-free right to use, publish, relicense and\nsublicense your contributions under any non-exclusive license of their\nchoosing for commercial and non-commercial purposes.\n* You shall not attempt to bring any intellectual property infringement or\nmisappropriation claims against the Owner or Maintainer of this Project\nrelating to or arising from your contributions.\n* You represent that you are the sole owner of all rights in your\ncontributions and that no third party has any rights or interests therein.\n\nFOR THE SCOPE OF THIS LICENSE, A CONTRIBUTION IS DEFINED TO INCLUDE ANY WORKS,\nIDEAS, CODE, PROCESSES, OR APIS MADE AVAILABLE TO VIEW BY THE GENERAL PUBLIC\n(INCLUDING ANY PUBLICLY ACCESSIBLE INTERNET FORUMS AND CHAT SERVERS WHERE\nACCESS IS AVAILABLE FOR FREE WITH REGISTRATION) OR PRIVATELY TO THIS PROJECT'S\nOWNER AND MAINTAINERS; INCLUDING WORKS, IDEAS, CODE, PROCESSES, AND APIS THAT\nARE ABOUT THIS PROJECT AND ITS CONTRIBUTIONS, OR MENTIONED IN REFERENCE TO\nTHIS PROJECT, WHERE SUCH WORKS, IDEAS, CODE, PROCESSES, AND APIS ARE MATERIAL\nTO THE SUCCESS, IMPROVEMENT, OR COMPLETION OF THIS PROJECT, AS DETERMINED BY\nTHE OWNER OF THIS PROJECT.\n\nContributions may come in any form, and include (but are not limited to):\n\n* pull requests\n* diff patches\n* commentary\n* example code\n\nIf you do not want your contribution to become incorporated into this Project,\ndo not make contributions to this Project. The creation of contributions that\nmay in the future become known to this Project's Owner and Maintainer\nconstitutes a willing contribution to this Project in accordance with this\nlicense.\n\nTHIS PROJECT AND THE WORKS AVAILABLE THROUGH THIS PROJECT ARE PROVIDED “AS IS”\nAND WITHOUT WARRANTY OF ANY KIND. IN NO EVENT SHALL THE OWNER OR MAINTAINER OF\nTHIS PROJECT BE LIABLE TO YOU OR ANY THIRD PARTY FOR ANY CLAIM, DAMAGES OR\nOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THIS PROJECT OR THE WORKS AVAILABLE THROUGH\nTHIS PROJECT. YOU AGREED TO INDEMNIFY, DEFEND AND HOLD THE OWNER AND\nMAINTAINER FROM AND AGAINST ANY CLAIMS, LOSSES OR DAMAGES ARISING FROM YOUR\nUSE OF THIS PROJECT OR THE WORKS AVAILABLE THROUGH THIS PROJECT.\n\nThis license is subject to change at any time by the Project Owner or\nMaintainer.\n\nYour continued access to or use of this Project or any works\navailable through this Project shall be subject to the then-current version\nof this license.\n\nThe Project Owner and Maintainer reserve the right to change this license\nwithout needing the consent of the contributors to this Project.\n"},{"name":"router.gno","body":"package router\n\nimport (\n\t\"strings\"\n\n\t\"gno.land/p/demo/ufmt\"\n)\n\ntype (\n\t// ResponseWriter defines the interface to write response output content.\n\tResponseWriter interface {\n\t\t// Write writes a string to the response output.\n\t\tWrite(s string)\n\n\t\t// Writef writes a formatted string to the response output.\n\t\tWritef(format string, values ...interface{})\n\t}\n\n\t// Request contains incoming request info.\n\tRequest struct {\n\t\t// Path contains the full render path.\n\t\tPath string\n\n\t\t// Prefix contains the render path prefix that handled the request.\n\t\t// For example for \"/prefix/custom/route\" the prefix path is \"/prefix\".\n\t\tPrefix string\n\n\t\t// Route contains the render path after the prefix.\n\t\t// This path doesn't include arguments.\n\t\t// For example for \"/prefix/custom/route:arg1=value1\" the route is \"/custom/route\".\n\t\tRoute string\n\n\t\t// Args contains the list of arguments found in the render path.\n\t\t// Any number of arguments can be defined as render path suffix by using\n\t\t// a colon as separator, for example:\n\t\t//\n\t\t// /prefix/custom/route:arg1=value1:arg2=value2\n\t\t//\n\t\t// In the example the argument are \"arg1=value1\" and \"arg2=value2\".\n\t\t// The arguments can have any format as long as they are separated by a colon.\n\t\tArgs []string\n\t}\n\n\t// HandlerFunc defines the type for request handlers.\n\tHandlerFunc func(ResponseWriter, Request)\n\n\thandler struct {\n\t\tPrefix string\n\t\tFn HandlerFunc\n\t}\n)\n\n// New creates a new prefix router.\nfunc New() Router {\n\treturn Router{}\n}\n\n// Router allows routing requests by render path prefix.\ntype Router struct {\n\thandlers []handler\n}\n\n// HandlerFunc registers a request handler for a request path prefix.\nfunc (r *Router) HandleFunc(prefix string, fn HandlerFunc) {\n\tr.handlers = append(r.handlers, handler{\n\t\tPrefix: prefix,\n\t\tFn: fn,\n\t})\n}\n\n// Render returns the response content for a render path.\nfunc (r Router) Render(path string) string {\n\tprefix, route, args := SplitRenderPath(path)\n\n\tfor _, h := range r.handlers {\n\t\tif h.Prefix == prefix {\n\t\t\tvar (\n\t\t\t\tw responseWriter\n\t\t\t\treq = Request{\n\t\t\t\t\tPath: path,\n\t\t\t\t\tPrefix: prefix,\n\t\t\t\t\tRoute: route,\n\t\t\t\t\tArgs: args,\n\t\t\t\t}\n\t\t\t)\n\n\t\t\th.Fn(\u0026w, req)\n\n\t\t\treturn w.Output()\n\t\t}\n\t}\n\n\treturn \"Path not found\"\n}\n\ntype responseWriter struct {\n\toutput strings.Builder\n}\n\nfunc (w *responseWriter) Write(s string) {\n\tw.output.WriteString(s)\n}\n\nfunc (w *responseWriter) Writef(format string, values ...interface{}) {\n\tw.output.WriteString(ufmt.Sprintf(format, values...))\n}\n\nfunc (w responseWriter) Output() string {\n\treturn w.output.String()\n}\n\n// SplitRenderPath splits render path into a prefix, route and arguments.\nfunc SplitRenderPath(path string) (prefix, route string, args []string) {\n\tpath = strings.TrimSpace(path)\n\tpath = strings.TrimLeft(path, \"/\")\n\n\t// Handle the case where the path is the prefix with no route\n\tif !strings.ContainsAny(path, \"/\") {\n\t\t// Split prefix and arguments\n\t\tparts := strings.Split(path, \":\")\n\t\tprefix = parts[0]\n\t\tif len(parts) \u003e 1 {\n\t\t\targs = parts[1:]\n\t\t}\n\n\t\treturn prefix, route, args\n\t}\n\n\t// Split route prefix and route\n\tparts := strings.SplitN(path, \"/\", 2)\n\tprefix = parts[0]\n\n\t// Split route and arguments\n\tparts = strings.Split(parts[1], \":\")\n\troute = parts[0]\n\tif len(parts) \u003e 1 {\n\t\targs = parts[1:]\n\t}\n\n\treturn prefix, route, args\n}\n"},{"name":"router_test.gno","body":"package router\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\trouter \"gno.land/p/gnome/router/v1\"\n)\n\nfunc TestSplitRenderPath(t *testing.T) {\n\tcases := []struct {\n\t\tname, renderPath, prefix, route, args string\n\t}{\n\t\t{\n\t\t\tname: \"prefix path\",\n\t\t\trenderPath: \"/foo\",\n\t\t\tprefix: \"foo\",\n\t\t\targs: \"[]\",\n\t\t},\n\t\t{\n\t\t\tname: \"path with short route\",\n\t\t\trenderPath: \"/foo/bar\",\n\t\t\tprefix: \"foo\",\n\t\t\troute: \"bar\",\n\t\t\targs: \"[]\",\n\t\t},\n\t\t{\n\t\t\tname: \"path with long route\",\n\t\t\trenderPath: \"/foo/bar/baz\",\n\t\t\tprefix: \"foo\",\n\t\t\troute: \"bar/baz\",\n\t\t\targs: \"[]\",\n\t\t},\n\t\t{\n\t\t\tname: \"full path with one arg\",\n\t\t\trenderPath: \"/foo/bar/baz:arg=value\",\n\t\t\tprefix: \"foo\",\n\t\t\troute: \"bar/baz\",\n\t\t\targs: \"[arg=value]\",\n\t\t},\n\t\t{\n\t\t\tname: \"full path with multiple args\",\n\t\t\trenderPath: \"/foo/bar/baz:arg1=value1:arg2=value2\",\n\t\t\tprefix: \"foo\",\n\t\t\troute: \"bar/baz\",\n\t\t\targs: \"[arg1=value1 arg2=value2]\",\n\t\t},\n\t\t{\n\t\t\tname: \"empty path\",\n\t\t\targs: \"[]\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Act\n\t\t\tprefix, route, args := router.SplitRenderPath(tc.renderPath)\n\n\t\t\t// Assert\n\t\t\tif prefix != tc.prefix {\n\t\t\t\tt.Fatalf(\"expected prefix: '%s', got: '%s'\", tc.prefix, prefix)\n\t\t\t}\n\n\t\t\tif route != tc.route {\n\t\t\t\tt.Fatalf(\"expected route: '%s', got: '%s'\", tc.route, route)\n\t\t\t}\n\n\t\t\tif got := fmt.Sprintf(\"%v\", args); got != tc.args {\n\t\t\t\tt.Fatalf(\"expected arguments: %s, got: %s\", tc.args, got)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestRouterRender(t *testing.T) {\n\tcases := []struct {\n\t\tname, renderPath, prefix, route, args string\n\t\tnotFound bool\n\t}{\n\t\t{\n\t\t\tname: \"prefix path\",\n\t\t\trenderPath: \"/foo\",\n\t\t\tprefix: \"foo\",\n\t\t\targs: \"[]\",\n\t\t},\n\t\t{\n\t\t\tname: \"path with short route\",\n\t\t\trenderPath: \"/foo/bar\",\n\t\t\tprefix: \"foo\",\n\t\t\troute: \"bar\",\n\t\t\targs: \"[]\",\n\t\t},\n\t\t{\n\t\t\tname: \"path with long route\",\n\t\t\trenderPath: \"/foo/bar/baz\",\n\t\t\tprefix: \"foo\",\n\t\t\troute: \"bar/baz\",\n\t\t\targs: \"[]\",\n\t\t},\n\t\t{\n\t\t\tname: \"full path with multiple args\",\n\t\t\trenderPath: \"/foo/bar/baz:arg1=value1:arg2=value2\",\n\t\t\tprefix: \"foo\",\n\t\t\troute: \"bar/baz\",\n\t\t\targs: \"[arg1=value1 arg2=value2]\",\n\t\t},\n\t\t{\n\t\t\tname: \"missing path\",\n\t\t\trenderPath: \"/test\",\n\t\t\tnotFound: true,\n\t\t},\n\t\t{\n\t\t\tname: \"empty path\",\n\t\t\tnotFound: true,\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tvar (\n\t\t\t\trequest router.Request\n\t\t\t\tsuccessOutput = \"OK\"\n\t\t\t\tr = router.New()\n\t\t\t)\n\n\t\t\tr.HandleFunc(\"foo\", func(res router.ResponseWriter, req router.Request) {\n\t\t\t\trequest = req\n\t\t\t\tres.Write(successOutput)\n\t\t\t})\n\n\t\t\t// Act\n\t\t\toutput := r.Render(tc.renderPath)\n\n\t\t\t// Assert\n\t\t\tif tc.notFound {\n\t\t\t\tif output == successOutput {\n\t\t\t\t\tt.Fatal(\"expected request to fail\")\n\t\t\t\t}\n\n\t\t\t\t// Run the next test\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif output != successOutput {\n\t\t\t\tt.Fatalf(\"expected output: '%s', got: '%s'\", successOutput, output)\n\t\t\t}\n\n\t\t\tif request.Path != tc.renderPath {\n\t\t\t\tt.Fatalf(\"expected request path: '%s', got: '%s'\", tc.renderPath, request.Path)\n\t\t\t}\n\n\t\t\tif request.Prefix != tc.prefix {\n\t\t\t\tt.Fatalf(\"expected request prefix: '%s', got: '%s'\", tc.prefix, request.Prefix)\n\t\t\t}\n\n\t\t\tif request.Route != tc.route {\n\t\t\t\tt.Fatalf(\"expected request route: '%s', got: '%s'\", tc.route, request.Route)\n\t\t\t}\n\n\t\t\tif got := fmt.Sprintf(\"%v\", request.Args); got != tc.args {\n\t\t\t\tt.Fatalf(\"expected request arguments: %s, got: %s\", tc.args, got)\n\t\t\t}\n\t\t})\n\t}\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"16000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"rda3M40rNAsC15gI6QbKLqZvLGz5u7Ef5plCb3pTAHgw628QP1n5O7QtsXjwkacqBf1cGeLgR8RmoVE4DMjLXw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"gnome","path":"gno.land/r/gnome/dao/pre1","files":[{"name":"LICENSE","body":"Copyright (c) 2024. All rights reserved.\n\nProject Owner:\nNewTendermint, LLC\n\nProject Maintainer:\nİlker Göktuğ ÖZTÜRK. \u003cilker@ilgooz.com\u003e, \u003cilkergoktugozturk@gmail.com\u003e\n\nYour access to this Project and your contributions to this Project are subject\nto the following terms:\n\n* You hereby grant to the listed Owner and Maintainer of this Project the\nworldwide, irrevocable and royalty-free right to use, publish, relicense and\nsublicense your contributions under any non-exclusive license of their\nchoosing for commercial and non-commercial purposes.\n* You shall not attempt to bring any intellectual property infringement or\nmisappropriation claims against the Owner or Maintainer of this Project\nrelating to or arising from your contributions.\n* You represent that you are the sole owner of all rights in your\ncontributions and that no third party has any rights or interests therein.\n\nFOR THE SCOPE OF THIS LICENSE, A CONTRIBUTION IS DEFINED TO INCLUDE ANY WORKS,\nIDEAS, CODE, PROCESSES, OR APIS MADE AVAILABLE TO VIEW BY THE GENERAL PUBLIC\n(INCLUDING ANY PUBLICLY ACCESSIBLE INTERNET FORUMS AND CHAT SERVERS WHERE\nACCESS IS AVAILABLE FOR FREE WITH REGISTRATION) OR PRIVATELY TO THIS PROJECT'S\nOWNER AND MAINTAINERS; INCLUDING WORKS, IDEAS, CODE, PROCESSES, AND APIS THAT\nARE ABOUT THIS PROJECT AND ITS CONTRIBUTIONS, OR MENTIONED IN REFERENCE TO\nTHIS PROJECT, WHERE SUCH WORKS, IDEAS, CODE, PROCESSES, AND APIS ARE MATERIAL\nTO THE SUCCESS, IMPROVEMENT, OR COMPLETION OF THIS PROJECT, AS DETERMINED BY\nTHE OWNER OF THIS PROJECT.\n\nContributions may come in any form, and include (but are not limited to):\n\n* pull requests\n* diff patches\n* commentary\n* example code\n\nIf you do not want your contribution to become incorporated into this Project,\ndo not make contributions to this Project. The creation of contributions that\nmay in the future become known to this Project's Owner and Maintainer\nconstitutes a willing contribution to this Project in accordance with this\nlicense.\n\nTHIS PROJECT AND THE WORKS AVAILABLE THROUGH THIS PROJECT ARE PROVIDED “AS IS”\nAND WITHOUT WARRANTY OF ANY KIND. IN NO EVENT SHALL THE OWNER OR MAINTAINER OF\nTHIS PROJECT BE LIABLE TO YOU OR ANY THIRD PARTY FOR ANY CLAIM, DAMAGES OR\nOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THIS PROJECT OR THE WORKS AVAILABLE THROUGH\nTHIS PROJECT. YOU AGREED TO INDEMNIFY, DEFEND AND HOLD THE OWNER AND\nMAINTAINER FROM AND AGAINST ANY CLAIMS, LOSSES OR DAMAGES ARISING FROM YOUR\nUSE OF THIS PROJECT OR THE WORKS AVAILABLE THROUGH THIS PROJECT.\n\nThis license is subject to change at any time by the Project Owner or\nMaintainer.\n\nYour continued access to or use of this Project or any works\navailable through this Project shall be subject to the then-current version\nof this license.\n\nThe Project Owner and Maintainer reserve the right to change this license\nwithout needing the consent of the contributors to this Project.\n"},{"name":"gnome.gno","body":"package gnome\n\nimport (\n\t\"strings\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\n// Names of the initial DAOs.\nconst (\n\tnameCouncilDAO = \"council\"\n\tnameMainDAO = \"main\"\n)\n\n// Member roles.\nconst (\n\tRoleAdmin gnome.Role = \"admin\"\n\tRoleEcoDev gnome.Role = \"eco-dev\"\n\tRoleDev gnome.Role = \"dev\"\n\tRoleRealm gnome.Role = \"realm\"\n)\n\n// The \"Gno.me\" DAO defines an initial root DAO with a single sub DAO, where the root is\n// the council DAO and the child is the main DAO. Council DAO members are hard coded and\n// can't be modified. Main DAO members can be modified anytime though a modify DAO members\n// proposals.\n//\n// The main DAO must have a minimum of three members at all time to be able to apply 2/3s\n// voting majority criteria required for some proposal types allowed for the main DAO.\n//\n// Sub DAOs can be created though sub DAO add proposals but its members can't be modified\n// once the sub DAO is created. Sub DAOs must be dismissed though a proposal and a new sub\n// DAO must be created if its members must be modified.\nvar gnomeDAO = gnome.MustNew(\n\tnameCouncilDAO,\n\t\"Council\",\n\tgnome.WithManifest(\"Gnomes are thinking\"),\n\tgnome.AssignAsSuperCouncil(),\n\tgnome.WithMembers(\n\t\tgnome.NewMember(\"g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun\", RoleDev),\n\t\tgnome.NewMember(\"g125t352u4pmdrr57emc4pe04y40sknr5ztng5mt\", RoleDev),\n\t\tgnome.NewMember(\"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5\", RoleEcoDev),\n\t),\n\tgnome.WithSubDAO(\n\t\tgnome.MustNew(\n\t\t\tnameMainDAO,\n\t\t\t\"Main\",\n\t\t\tgnome.WithManifest(\"Gnomes are building\"),\n\t\t\tgnome.WithMembers(\n\t\t\t\tgnome.NewMember(\"g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun\", RoleDev),\n\t\t\t\tgnome.NewMember(\"g125t352u4pmdrr57emc4pe04y40sknr5ztng5mt\", RoleDev),\n\t\t\t\tgnome.NewMember(\"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5\", RoleEcoDev),\n\t\t\t),\n\t\t),\n\t),\n)\n\nfunc mustGetDAO(path string) *gnome.DAO {\n\tif strings.TrimSpace(path) == \"\" {\n\t\tpanic(\"DAO path is empty\")\n\t}\n\n\tdao, found := daos.GetByPath(path)\n\tif !found {\n\t\tpanic(\"DAO not found\")\n\t}\n\treturn dao\n}\n"},{"name":"indexes.gno","body":"package gnome\n\nimport (\n\t\"gno.land/p/demo/avl\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\nvar (\n\tdaos daoIndex\n\tproposals proposalIndex\n\tlastProposalID gnome.ID\n)\n\nfunc init() {\n\t// Index initial council and main DAO\n\tmainDAO := gnomeDAO.SubDAOs()[0]\n\tdaos.IndexByPath(gnomeDAO)\n\tdaos.IndexByPath(mainDAO)\n}\n\nfunc genProposalID() gnome.ID {\n\tlastProposalID += 1\n\treturn lastProposalID\n}\n\n// TODO: Deprecate DAO index in favor of using DAO methods\ntype daoIndex struct {\n\tindex avl.Tree // string(DAO path) -\u003e *gnome.DAO\n}\n\n// IndexByPath indexes a DAO by its path.\nfunc (x *daoIndex) IndexByPath(dao *gnome.DAO) bool {\n\treturn x.index.Set(dao.Path(), dao)\n}\n\n// GetByPath gets a DAO by its path.\nfunc (x daoIndex) GetByPath(path string) (*gnome.DAO, bool) {\n\tif v, ok := x.index.Get(path); ok {\n\t\treturn v.(*gnome.DAO), true\n\t}\n\treturn nil, false\n}\n\n// HasPathKey checks if a key with a DAO path exists.\nfunc (x daoIndex) HasPathKey(path string) bool {\n\treturn x.index.Has(path)\n}\n\ntype proposalIndex struct {\n\tindex avl.Tree // string(binary gnome.ID) -\u003e *gnome.Proposal\n\tgroups avl.Tree // string(DAO path) -\u003e []*gnome.Proposal\n}\n\n// Index indexes a proposal by its ID and DAO.\nfunc (x *proposalIndex) Index(p *gnome.Proposal) {\n\tx.IndexByID(p)\n\tx.IndexByDAO(p)\n}\n\n// IndexByID indexes a proposal by its ID.\nfunc (x *proposalIndex) IndexByID(p *gnome.Proposal) bool {\n\treturn x.index.Set(p.ID().Key(), p)\n}\n\n// IndexByDAO indexes a proposal for a DAO.\nfunc (x *proposalIndex) IndexByDAO(p *gnome.Proposal) bool {\n\tdaoPath := p.DAO().Path()\n\tproposals := x.GetAllByDAO(daoPath)\n\tproposals = append([]*gnome.Proposal{p}, proposals...) // reverse append\n\treturn x.groups.Set(daoPath, proposals)\n}\n\n// GetByID gets a proposal by its ID.\nfunc (x proposalIndex) GetByID(id gnome.ID) (*gnome.Proposal, bool) {\n\tif v, exists := x.index.Get(id.Key()); exists {\n\t\treturn v.(*gnome.Proposal), true\n\t}\n\treturn nil, false\n}\n\n// GetAllByDAO gets all proposals of a DAO.\nfunc (x proposalIndex) GetAllByDAO(daoPath string) []*gnome.Proposal {\n\tif v, exists := x.groups.Get(daoPath); exists {\n\t\treturn v.([]*gnome.Proposal)\n\t}\n\treturn nil\n}\n\n// Iterate iterates all proposals starting from the oldest one.\nfunc (x proposalIndex) Iterate(fn gnome.ProposalIterFn) bool {\n\treturn x.index.Iterate(\"\", \"\", func(_ string, value interface{}) bool {\n\t\treturn fn(value.(*gnome.Proposal))\n\t})\n}\n\n// ReverseIterate iterates all proposals starting from the latest one.\nfunc (x proposalIndex) ReverseIterate(fn gnome.ProposalIterFn) bool {\n\treturn x.index.ReverseIterate(\"\", \"\", func(_ string, value interface{}) bool {\n\t\treturn fn(value.(*gnome.Proposal))\n\t})\n}\n"},{"name":"params.gno","body":"package gnome\n\nimport (\n\t\"time\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\n// Day defines the duration of a day.\nconst Day = time.Hour * 24\n\n// Names for the different strategy types.\nconst (\n\tStrategyNameSubDAOCreation = \"sub-dao-creation\"\n\tStrategyNameSubDAODismissal = \"sub-dao-dismissal\"\n\tStrategyNameDAOMembersModification = \"dao-members-modification\"\n\tStrategyNameBudget = \"budget\"\n\tStrategyNameGeneral = \"general\"\n\tStrategyNameLocking = \"locking\"\n\tStrategyNameParamsUpdate = \"params-update\"\n)\n\nvar parameters struct {\n\t// VotingPeriods contains the current voting period for each proposal type.\n\tVotingPeriods gnome.DurationParams\n\n\t// ReviewDeadline defines the time after which a proposal can't be withdrawed by the proposer.\n\t// Proposal can only be voted on after this deadline but not before.\n\t// This greace period gives the proposer the chance to withdraw a proposal if there is a mistake.\n\tReviewDeadline time.Duration\n}\n\nfunc init() {\n\t// Initial voting periods for each proposal type.\n\t// Periods can be changed by sumitting a params update proposal.\n\tparameters.VotingPeriods.Set(StrategyNameSubDAOCreation, time.Minute*10)\n\tparameters.VotingPeriods.Set(StrategyNameSubDAODismissal, Day*7)\n\tparameters.VotingPeriods.Set(StrategyNameDAOMembersModification, time.Minute*30)\n\tparameters.VotingPeriods.Set(StrategyNameBudget, Day*7)\n\tparameters.VotingPeriods.Set(StrategyNameGeneral, Day*2)\n\tparameters.VotingPeriods.Set(StrategyNameLocking, Day*2)\n\tparameters.VotingPeriods.Set(StrategyNameParamsUpdate, time.Minute*10)\n\n\t// Initial review deadline\n\tparameters.ReviewDeadline = time.Second\n}\n"},{"name":"public.gno","body":"package gnome\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n\trouter \"gno.land/p/gnome/router/v1\"\n)\n\n// Render returns a Markdown string with DAO or proposal details.\n// By default it renders the Council DAO details view.\n//\n// Paths:\n// - `dao/DAO_PATH` =\u003e Renders DAO or sub DAO details\n// - `proposal/PROPOSAL_ID` =\u003e Renders details for a proposal\n// - `proposals/DAO_PATH` =\u003e Renders the list of proposals for a DAO\nfunc Render(path string) string {\n\tr := router.New()\n\n\tr.HandleFunc(\"\", renderDAO)\n\tr.HandleFunc(\"dao\", renderDAO)\n\tr.HandleFunc(\"proposal\", renderProposal)\n\tr.HandleFunc(\"proposals\", renderProposals)\n\tr.HandleFunc(\"params\", renderParams)\n\n\t// Render global alerts before proposal states are updated within the handlers\n\treturn renderAlerts() + r.Render(path)\n}\n\n// GetDAO returns an invariant reference to a DAO.\n// Council DAO is returned when path is empty.\nfunc GetDAO(path string) gnome.InvarDAO {\n\tif path == \"\" {\n\t\tpath = nameCouncilDAO\n\t}\n\n\tdao := mustGetDAO(path)\n\treturn gnome.NewInvarDAO(dao)\n}\n\n// IterateProposals iterates DAO proposals by ascending IDs.\nfunc IterateProposals(fn func(gnome.InvarProposal) bool) {\n\tproposals.Iterate(func(p *gnome.Proposal) bool {\n\t\treturn fn(gnome.NewInvarProposal(p))\n\t})\n}\n\n// WithdrawProposal withdraws a proposal.\n// Proposals can only be withdrawed by the account that creates it when the state is \"review\".\n// They can't be withdrawed once the review deadline of one hour after creation is met.\nfunc WithdrawProposal(proposalID uint64) string {\n\tassertDAOIsNotLocked()\n\n\tp := mustGetProposal(proposalID)\n\tassertCallerCanWithdraw(p)\n\n\tif err := p.Withdraw(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tAdvanceProposals()\n\n\treturn \"Proposal withdrawed\"\n}\n\n// Vote submits a vote for a proposal.\n//\n// Parameters:\n// - proposalID: ID of the proposal to vote (required)\n// - vote: Voting choice, true=Yes, false=No (required)\n// - reason: Text with the reason for the vote\n// - daoPath: Path of the DAO where the voting account belongs to\n//\n// Reason is in general optional but might be required for some proposals when voting No.\n//\n// DAO name is optional and by default is the one that the proposal belongs to.\n// Only parents of the proposal's DAO are allowed as `daoPath` values.\n// Child votes are not tallied when a member of a parent DAO votes on a child's proposal.\nfunc Vote(proposalID uint64, vote bool, reason, daoPath string) string {\n\tassertDAOIsNotLocked()\n\n\t// Make sure proposal states are up to date before submitting the vote\n\tAdvanceProposals()\n\n\t// Get proposal and check that current status accepts votes\n\tp := mustGetProposal(proposalID)\n\tif s := p.Status(); s.IsFinal() {\n\t\tpanic(\"proposal status doesn't allow new vote submissions: \" + s.String())\n\t}\n\n\t// When a DAO name is availalable check that it matches one of the proposal's DAO parents\n\t// and if so promote the proposal to a parent DAO. Promoting a proposal invalidates the votes\n\t// submitted by current DAO's members and moves voting responsibility to the parent DAO members.\n\tdaoPath = strings.TrimSpace(daoPath)\n\tif daoPath != \"\" \u0026\u0026 p.DAO().Path() != daoPath {\n\t\t// Check that the path belongs to a parent DAO.\n\t\t// Path separator is added to the prefix to make sure that similar prefixes don't match.\n\t\tif !strings.HasPrefix(p.DAO().Path(), daoPath+gnome.PathSeparator) {\n\t\t\tpanic(`path \"` + daoPath + `\" is not a parent of the proposal's DAO path`)\n\t\t}\n\n\t\t// Promote the active proposal's DAO to a parent DAO\n\t\tparentDAO := mustGetDAO(daoPath)\n\t\tif err := p.Promote(parentDAO); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\n\t\t// Reindex the proposal so its available under the parent DAO proposals. Child DAO will also\n\t\t// keep the promoted proposal indexed so it can be listed within the child DAO's proposals.\n\t\tproposals.Index(p)\n\t}\n\n\t// When proposal has \"review\" status check if deadline is met and if so activate it\n\tif p.Status() == gnome.StatusReview {\n\t\tif !p.HasReviewDeadlinePassed() {\n\t\t\tpanic(\"votes are not allowed until \" + p.ReviewDeadline().UTC().Format(\"2006-01-02 15:04 MST\"))\n\t\t}\n\n\t\tif err := p.Activate(); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t}\n\n\tvar choice gnome.VoteChoice\n\tif vote {\n\t\tchoice = gnome.ChoiceYes\n\t} else {\n\t\tchoice = gnome.ChoiceNo\n\t}\n\n\t// Submit vote\n\tcaller := std.GetOrigCaller() // TODO: Check that caller is member of the DAO\n\terr := p.Vote(caller, gnome.VoteChoice(choice), reason)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\treturn \"Vote submitted for proposal \" + makeProposalURI(gnome.ID(proposalID), false)\n}\n\n// AdvanceProposals iterates review and active proposals and tallies proposals that met their deadlines.\n// Proposals in review status are activated to allow voting.\n// Active proposals are tallied which means the number of votes is counted and status changed accordingly.\n// Active executable proposals are executed when the proposal status changes to \"passed\".\nfunc AdvanceProposals() string {\n\tassertDAOIsNotLocked()\n\n\tadvanceProposals()\n\n\treturn \"Proposals advanced for realm \" + makeRealmURL(\"\")\n}\n\n// IsProposalsAdvanceNeeded checks if a call to `AdvanceProposals()` is required to update proposals.\nfunc IsProposalsAdvanceNeeded() bool {\n\tif gnomeDAO.IsLocked() {\n\t\treturn false\n\t}\n\n\treturn proposals.ReverseIterate(func(p *gnome.Proposal) bool {\n\t\tswitch p.Status() {\n\t\tcase gnome.StatusReview:\n\t\t\tif p.HasReviewDeadlinePassed() {\n\t\t\t\treturn true\n\t\t\t}\n\t\tcase gnome.StatusActive:\n\t\t\tif p.HasVotingDeadlinePassed() {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t\treturn false\n\t})\n}\n\nfunc advanceProposals() {\n\t// TODO: Use unix timestamp as part of proposal IDs to avoid iterating older tallied proposals\n\tproposals.Iterate(func(p *gnome.Proposal) bool {\n\t\tstatus := p.Status()\n\t\tif status == gnome.StatusReview \u0026\u0026 p.HasReviewDeadlinePassed() {\n\t\t\tp.Activate()\n\t\t\tstatus = p.Status()\n\t\t}\n\n\t\tif p.Status() == gnome.StatusActive \u0026\u0026 p.HasVotingDeadlinePassed() {\n\t\t\tp.Tally()\n\n\t\t\t// Change proposal status to failed when execution fails\n\t\t\tif err := p.Execute(); gnome.IsExecutionError(err) {\n\t\t\t\tp.Fail(\"failed due to conflicts: \" + err.Error())\n\t\t\t}\n\t\t}\n\t\treturn false\n\t})\n}\n\nfunc mustGetProposal(id uint64) *gnome.Proposal {\n\tp, found := proposals.GetByID(gnome.ID(id))\n\tif !found {\n\t\tpanic(\"proposal not found\")\n\t}\n\treturn p\n}\n\nfunc assertCallerCanWithdraw(p *gnome.Proposal) {\n\tif p.Proposer() != std.GetOrigCaller() {\n\t\tpanic(\"proposals can only be withdrawed by the proposer\")\n\t}\n\n\tif p.Status() != gnome.StatusReview {\n\t\tpanic(`proposals can only be withdrawed when status is \"review\"`)\n\t} else if p.HasReviewDeadlinePassed() {\n\t\tpanic(\"withdrawal not allowed, withdrawal deadline expired\")\n\t}\n}\n"},{"name":"public_proposals.gno","body":"package gnome\n\nimport (\n\t\"std\"\n\t\"strings\"\n\t\"time\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\n// SubmitCustomProposal submits a new proposal of a custom type.\n//\n// This function allows other realms to submit custom proposal types.\n//\n// Parameters:\n// - title: A title for the proposal (required)\n// - description: A description of the proposal\n// - strategy: A strategy for the new proposal (required)\n// - daoPath: Path of the DAO where the proposal should be created (required)\nfunc SubmitCustomProposal(title, description string, s gnome.ProposalStrategy, daoPath string) gnome.ID {\n\tassertDAOIsNotLocked()\n\n\tdao := mustGetDAO(daoPath)\n\tassertDAOIsNotDismissed(dao)\n\n\tcaller := std.GetOrigCaller()\n\tassertCanCreateProposal(caller, dao)\n\n\tid := genProposalID()\n\tp, err := gnome.NewProposal(\n\t\tid,\n\t\ts,\n\t\tcaller,\n\t\tdao,\n\t\ttitle,\n\t\tgnome.WithDescription(description),\n\t\tgnome.WithReviewDeadline(time.Now().Add(parameters.ReviewDeadline)),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tif err := p.Validate(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tproposals.Index(p)\n\treturn p.ID()\n}\n\n// SubmitGeneralProposal submits a new general proposal.\n//\n// Proposal requires a 51% quorum, otherwise the outcome will be low participation.\n// Tally is done by absolute majority, so all abstentions are considered.\n//\n// Parameters:\n// - proposalTitle: A title for the proposal (required)\n// - proposalDescription: A description of the proposal (required)\n// - daoPath: Path of the DAO where the proposal should be created (required)\n// - votingDeadline: Number of days until the voting period ends\n//\n// The name of the DAO where the proposal is created is a slug, where \"council\"\n// is the Council DAO and \"main\" is the name of the Main DAO.\n//\n// The voting period deadline for the proposal must be between 2 and 10 days.\n// It defaults to 2 days when `votingDeadline` value is 0.\nfunc SubmitGeneralProposal(\n\tproposalTitle,\n\tproposalDescription,\n\tdaoPath string,\n\tvotingDeadline uint,\n) uint64 {\n\tassertDAOIsNotLocked()\n\n\topts := []gnome.ProposalOption{\n\t\tgnome.WithDescription(proposalDescription),\n\t\tgnome.WithReviewDeadline(time.Now().Add(parameters.ReviewDeadline)),\n\t}\n\n\tif votingDeadline != 0 {\n\t\tif votingDeadline \u003c 2 || votingDeadline \u003e 10 {\n\t\t\tpanic(\"voting period deadline must be between 2 and 10 days\")\n\t\t}\n\n\t\tdeadline := time.Now().Add(time.Hour * 24 * time.Duration(votingDeadline))\n\t\topts = append(opts, gnome.WithVotingDeadline(deadline))\n\t}\n\n\tdao := mustGetDAO(daoPath)\n\tassertDAOIsNotDismissed(dao)\n\n\tcaller := std.GetOrigCaller()\n\tassertCanCreateProposal(caller, dao)\n\n\tp, err := gnome.NewProposal(genProposalID(), newGeneralStrategy(), caller, dao, proposalTitle, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tif err := p.Validate(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tproposals.Index(p)\n\tAdvanceProposals()\n\n\treturn uint64(p.ID())\n}\n\n// SubmitSubDAOCreationProposal submits a new proposal to add a sub DAO to an existing DAO.\n//\n// Proposal requires the participation of all DAO members, otherwise the outcome will be low participation.\n//\n// Parameters:\n// - proposalTitle: A title for the proposal (required)\n// - proposalDescription: A description of the proposal\n// - parentDAOPath: Path of the sub DAO's parent (required)\n// - subDAOName: Slug name of the new sub DAO (required)\n// - subDAOTitle: A title for the new sub DAO (required)\n// - subDAOManifest: Sub DAO manifest (required)\n// - subDAOMembers: List of sub DAO member addresses (required)\n//\n// Sub DAO name must be a slug allows letters from \"a\" to \"z\", numbers, \"-\" and \"_\" as valid characters.\n//\n// The list of sub DAO members must be a newline separated list of addresses, with a minimum of 2 addresses.\n// Each line must contain an address and optionally be followed by one or more DAO member roles:\n// ```\n// g187982000zsc493znqt828s90cmp6hcp2erhu6m foo\n// g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5 bar foo\n// ```\nfunc SubmitSubDAOCreationProposal(\n\tproposalTitle,\n\tproposalDescription,\n\tparentDAOPath,\n\tsubDAOName,\n\tsubDAOTitle,\n\tsubDAOManifest,\n\tsubDAOMembers string,\n) uint64 {\n\tassertDAOIsNotLocked()\n\n\tdao := mustGetDAO(parentDAOPath)\n\tassertDAOIsNotDismissed(dao)\n\n\tsubDAOPath := dao.Path() + gnome.PathSeparator + subDAOName\n\tif daos.HasPathKey(subDAOPath) {\n\t\tpanic(\"sub DAO name is already taken by another DAO\")\n\t}\n\n\tcaller := std.GetOrigCaller()\n\tassertCanCreateProposal(caller, dao)\n\n\tmembers := gnome.MustParseStringToMembers(subDAOMembers)\n\tstrategy := newSubDAOCreationStrategy(daos, subDAOName, subDAOTitle, subDAOManifest, members)\n\tp, err := gnome.NewProposal(\n\t\tgenProposalID(),\n\t\tstrategy,\n\t\tcaller,\n\t\tdao,\n\t\tproposalTitle,\n\t\tgnome.WithDescription(proposalDescription),\n\t\tgnome.WithReviewDeadline(time.Now().Add(parameters.ReviewDeadline)),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tif err := p.Validate(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tproposals.Index(p)\n\tAdvanceProposals()\n\n\treturn uint64(p.ID())\n}\n\n// SubmitSubDAODismissalProposal submits a new proposal to dismiss a sub DAO.\n//\n// Dismissing a sub DAO also dismisses all active proposals and any sub DAO below the dismissed DAO tree.\n// Only the direct parent of a DAO can create a proposal to dismiss any of its fist level sub DAOs.\n// Proposal requires a 51% quorum, otherwise the outcome will be low participation.\n// Tally is done by plurality.\n//\n// Parameters:\n// - proposalTitle: A title for the proposal (required)\n// - daoPath: Path of the DAO where the proposal should be created (required)\n// - subDAOName: Slug name of the sub DAO to dismiss (required)\nfunc SubmitSubDAODismissalProposal(proposalTitle, daoPath, subDAOName string) uint64 {\n\tassertDAOIsNotLocked()\n\n\tdao := mustGetDAO(daoPath)\n\tassertDAOIsNotDismissed(dao)\n\n\tsubDAOPath := dao.Path() + gnome.PathSeparator + subDAOName\n\tsubDAO := mustGetDAO(subDAOPath)\n\tassertDAOIsNotDismissed(subDAO)\n\n\tcaller := std.GetOrigCaller()\n\tstrategy := newSubDAODismissalStrategy(subDAO, proposals)\n\tp, err := gnome.NewProposal(\n\t\tgenProposalID(),\n\t\tstrategy,\n\t\tcaller,\n\t\tdao,\n\t\tproposalTitle,\n\t\tgnome.WithReviewDeadline(time.Now().Add(parameters.ReviewDeadline)),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tif err := p.Validate(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tproposals.Index(p)\n\tAdvanceProposals()\n\n\treturn uint64(p.ID())\n}\n\n// SubmitDAOMembersModificationProposal submits a new proposal to modify the members of a DAO.\n//\n// Proposal requires a 51% quorum, otherwise the outcome will be low participation.\n// Tally is done by super majority with a 2/3s threshold. Abstentions are not considered.\n//\n// Parameters:\n// - proposalTitle: A title for the proposal (required)\n// - proposalDescription: A description of the proposal\n// - daoPath: Path of the DAO where the proposal should be created (required)\n// - newMembers: List of member addresses to add to Main DAO\n// - removeMembers: List of member addresses to remove from the Main DAO\n//\n// At leat one member address is required either to be added or removed from the DAO.\n// Members can be added and removed within the same proposal.\n//\n// Each list of members must be newline separated list of addresses.\n// Each line must contain an address and optionally be followed by one or more DAO member roles:\n// ```\n// g187982000zsc493znqt828s90cmp6hcp2erhu6m foo\n// g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5 bar foo\n// ```\nfunc SubmitDAOMembersModificationProposal(\n\tproposalTitle,\n\tproposalDescription,\n\tdaoPath,\n\tnewMembers,\n\tremoveMembers string,\n) uint64 {\n\tassertDAOIsNotLocked()\n\n\tdao := mustGetDAO(daoPath)\n\tassertDAOIsNotDismissed(dao)\n\n\tcaller := std.GetOrigCaller()\n\tassertCanCreateProposal(caller, dao)\n\n\tstrategy := newDAOMembersModificationStrategy(\n\t\tgnome.MustParseStringToMembers(newMembers),\n\t\tgnome.MustParseStringToMembers(removeMembers),\n\t)\n\tp, err := gnome.NewProposal(\n\t\tgenProposalID(),\n\t\tstrategy,\n\t\tcaller,\n\t\tdao,\n\t\tproposalTitle,\n\t\tgnome.WithDescription(proposalDescription),\n\t\tgnome.WithReviewDeadline(time.Now().Add(parameters.ReviewDeadline)),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tif err := p.Validate(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tproposals.Index(p)\n\tAdvanceProposals()\n\n\treturn uint64(p.ID())\n}\n\n// SubmitBudgetProposal submits a new budget proposal.\n//\n// Only membes of the Council or Main DAO can vote on this type of proposals.\n// Proposal requires a 51% quorum, otherwise the outcome will be low participation.\n// Tally is done by absolute majority, so all abstentions are considered.\n//\n// Parameters:\n// - proposalTitle: A title for the proposal (required)\n// - proposalDescription: A description of the proposal\n// - daoPath: Path of the DAO where the proposal should be created (required)\n// - budget: The proposal budget (required)\n//\n// Budget doesn't enforce any specific format right now but an example format that\n// could be used is amount plus symbol, for example 100UGNOT, 100000USD, etc.\nfunc SubmitBudgetProposal(\n\tproposalTitle,\n\tproposalDescription,\n\tdaoPath,\n\tbudget string,\n) uint64 {\n\tassertDAOIsNotLocked()\n\n\tdao := mustGetDAO(daoPath)\n\tassertDAOIsNotDismissed(dao)\n\n\tcaller := std.GetOrigCaller()\n\tassertCanCreateProposal(caller, dao)\n\n\tstrategy := newBudgetStrategy(gnomeDAO, budget)\n\tp, err := gnome.NewProposal(\n\t\tgenProposalID(),\n\t\tstrategy,\n\t\tcaller,\n\t\tdao,\n\t\tproposalTitle,\n\t\tgnome.WithDescription(proposalDescription),\n\t\tgnome.WithReviewDeadline(time.Now().Add(parameters.ReviewDeadline)),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tif err := p.Validate(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tproposals.Index(p)\n\tAdvanceProposals()\n\n\treturn uint64(p.ID())\n}\n\n// SubmitDAOLockingProposal submits a new proposal to lock the DAO.\n//\n// Locking the DAO \"freezes the state\" by disallowing further modifications.\n// State must be locked to migrate the realm to a newer version.\n//\n// Proposal requires a 33% quorum, otherwise the outcome will be low participation.\n// This type of proposal can only be created by the Council or Main DAO members.\n// Tally is done by plurality.\n//\n// Parameters:\n// - proposalTitle: A title for the proposal (required)\n// - proposalDescription: A description of the proposal\n// - daoPath: Path of the DAO where the proposal should be created (required)\n// - reason: Text with the DAO locking reason\n//\n// The optional `reason` argument can contain HTML.\nfunc SubmitDAOLockingProposal(\n\tproposalTitle,\n\tproposalDescription,\n\tdaoPath,\n\treason string,\n) uint64 {\n\tassertDAOIsNotLocked()\n\n\tcaller := std.GetOrigCaller()\n\tassertIsCouncilOrMainDAOMember(caller)\n\n\tdao := mustGetDAO(daoPath)\n\tassertIsCouncilOrMainDAO(dao)\n\n\treason = strings.TrimSpace(reason)\n\tstrategy := newLockingStrategy(gnomeDAO, reason, func() error {\n\t\t// Advance all proposals before locking the DAO\n\t\tadvanceProposals()\n\t\treturn nil\n\t})\n\n\tp, err := gnome.NewProposal(\n\t\tgenProposalID(),\n\t\tstrategy,\n\t\tcaller,\n\t\tdao,\n\t\tproposalTitle,\n\t\tgnome.WithDescription(proposalDescription),\n\t\tgnome.WithReviewDeadline(time.Now().Add(parameters.ReviewDeadline)),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tif err := p.Validate(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tproposals.Index(p)\n\tAdvanceProposals()\n\n\treturn uint64(p.ID())\n}\n\n// SubmitParamsUpdateProposal submits a new proposal to update one or more realm parameters.\n//\n// Proposal requires a 51% quorum, otherwise the outcome will be low participation.\n// Tally is done by absolute majority, so all abstentions are considered.\n//\n// Parameters:\n// - proposalTitle: A title for the proposal (required)\n// - proposalDescription: A description of the proposal\n// - daoPath: Path of the DAO where the proposal should be created (required)\n// - proposalReviewDeadline: Number of seconds where proposals can be withdrawed\n// - votingPeriodSubDAOCreation: Voting period for sub DAO creation proposals\n// - votingPeriodSubDAODismissal: Voting period for sub DAO dismissal proposals\n// - votingPeriodDAOMembersModification: Voting period for DAO members modification proposals\n// - votingPeriodBudget: Voting period for budget proposals\n// - votingPeriodGeneral: Voting period for general proposals\n// - votingPeriodLocking: Voting period for locking proposals\n// - votingPeriodParamsUpdate: Voting period for parameters update proposals\n//\n// Voting period is the number of days that members can vote on a proposal\n// At least one parameter value is required for creating a proposal.\nfunc SubmitParamsUpdateProposal(\n\tproposalTitle,\n\tproposalDescription,\n\tdaoPath string,\n\tproposalReviewDeadline,\n\tvotingPeriodSubDAOCreation,\n\tvotingPeriodSubDAODismissal,\n\tvotingPeriodDAOMembersModification,\n\tvotingPeriodBudget,\n\tvotingPeriodGeneral,\n\tvotingPeriodLocking,\n\tvotingPeriodParamsUpdate int,\n) uint64 {\n\tassertDAOIsNotLocked()\n\n\tdao := mustGetDAO(daoPath)\n\tassertDAOIsNotDismissed(dao)\n\n\tcaller := std.GetOrigCaller()\n\tassertCanCreateProposal(caller, dao)\n\n\tstrategy := paramsUpdateStrategy{\n\t\treviewDeadline: time.Second * time.Duration(proposalReviewDeadline),\n\t}\n\n\tif votingPeriodSubDAOCreation \u003e 0 {\n\t\tperiod := time.Duration(votingPeriodSubDAOCreation) * Day\n\t\tstrategy.votingPeriods.Set(StrategyNameBudget, period)\n\t}\n\n\tif votingPeriodSubDAODismissal \u003e 0 {\n\t\tperiod := time.Duration(votingPeriodSubDAODismissal) * Day\n\t\tstrategy.votingPeriods.Set(StrategyNameBudget, period)\n\t}\n\n\tif votingPeriodDAOMembersModification \u003e 0 {\n\t\tperiod := time.Duration(votingPeriodDAOMembersModification) * Day\n\t\tstrategy.votingPeriods.Set(StrategyNameBudget, period)\n\t}\n\n\tif votingPeriodBudget \u003e 0 {\n\t\tperiod := time.Duration(votingPeriodBudget) * Day\n\t\tstrategy.votingPeriods.Set(StrategyNameBudget, period)\n\t}\n\n\tif votingPeriodGeneral \u003e 0 {\n\t\tperiod := time.Duration(votingPeriodGeneral) * Day\n\t\tstrategy.votingPeriods.Set(StrategyNameGeneral, period)\n\t}\n\n\tif votingPeriodLocking \u003e 0 {\n\t\tperiod := time.Duration(votingPeriodLocking) * Day\n\t\tstrategy.votingPeriods.Set(StrategyNameLocking, period)\n\t}\n\n\tif votingPeriodParamsUpdate \u003e 0 {\n\t\tperiod := time.Duration(votingPeriodParamsUpdate) * Day\n\t\tstrategy.votingPeriods.Set(StrategyNameParamsUpdate, period)\n\t}\n\n\tif strategy.votingPeriods.Size() == 0 \u0026\u0026 strategy.reviewDeadline == 0 {\n\t\tpanic(\"at least one parameter value must be specified\")\n\t}\n\n\tp, err := gnome.NewProposal(\n\t\tgenProposalID(),\n\t\tstrategy,\n\t\tcaller,\n\t\tdao,\n\t\tproposalTitle,\n\t\tgnome.WithDescription(proposalDescription),\n\t\tgnome.WithReviewDeadline(time.Now().Add(parameters.ReviewDeadline)),\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tif err := p.Validate(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tproposals.Index(p)\n\tAdvanceProposals()\n\n\treturn uint64(p.ID())\n}\n\nfunc assertCanCreateProposal(proposer std.Address, dao *gnome.DAO) {\n\tif !dao.HasMember(proposer) {\n\t\tpanic(\"you must be a DAO member to create a proposal\")\n\t}\n}\n\nfunc assertDAOIsNotDismissed(dao *gnome.DAO) {\n\t// DAOs are locked when they are dismissed\n\tif dao.IsLocked() {\n\t\tpanic(\"DAO is dismissed: \" + dao.Path())\n\t}\n}\n\nfunc assertDAOIsNotLocked() {\n\tif gnomeDAO.IsLocked() {\n\t\tpanic(\"DAO is locked\")\n\t}\n}\n\nfunc assertIsCouncilOrMainDAO(dao *gnome.DAO) {\n\tif !dao.IsSuperCouncil() {\n\t\t// Main DAO parent must be the super council\n\t\tparentDAO := dao.Parent()\n\t\tif !parentDAO.IsSuperCouncil() {\n\t\t\tpanic(\"DAO is not the council or main DAO\")\n\t\t}\n\t}\n}\n\nfunc assertIsCouncilOrMainDAOMember(addr std.Address) {\n\tif !gnomeDAO.HasMember(addr) {\n\t\tmainDAO := gnomeDAO.SubDAOs()[0]\n\t\tif !mainDAO.HasMember(addr) {\n\t\t\tpanic(\"account is not a council or main DAO member\")\n\t\t}\n\t}\n}\n"},{"name":"public_proposals_0a_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\tgnome \"gno.land/r/gnome/dao/pre1\"\n)\n\nconst member = std.Address(\"g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun\")\n\nfunc init() {\n\tstd.TestSetOrigCaller(member)\n}\n\nfunc main() {\n\ttitle := \"Test proposal\"\n\tdesc := \"A test proposal\"\n\tdaoPath := \"council/main\"\n\tpID := gnome.SubmitGeneralProposal(title, desc, daoPath, 0)\n\tprintln(pID)\n\n\tmarkdown := gnome.Render(\"proposal/1\")\n\tprintln(markdown)\n}\n\n// Output:\n// 1\n// # #1 Test proposal\n// - Type: general\n// - Created: 2009-02-13 23:31 UTC\n// - Proposer: g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun\n// - Status: **review**\n// - Review Deadline: 2009-02-14 00:31 UTC\n// ## Description\n// A test proposal\n// ## Votes\n// The proposal has no votes\n"},{"name":"public_proposals_0b_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\tgnome \"gno.land/r/gnome/dao/pre1\"\n)\n\nconst nonMember = std.Address(\"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\")\n\nfunc init() {\n\tstd.TestSetOrigCaller(nonMember)\n}\n\nfunc main() {\n\ttitle := \"Test proposal\"\n\tdesc := \"A test proposal\"\n\tdaoPath := \"council/main\"\n\tgnome.SubmitGeneralProposal(title, desc, daoPath, 0)\n}\n\n// Error:\n// you must be a DAO member to create a proposal\n"},{"name":"public_proposals_0c_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\tgnome \"gno.land/r/gnome/dao/pre1\"\n)\n\nconst member = std.Address(\"g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun\")\n\nfunc init() {\n\tstd.TestSetOrigCaller(member)\n}\n\nfunc main() {\n\ttitle := \"Test proposal\"\n\tdesc := \"A test proposal\"\n\tdaoPath := \"council/main\"\n\tgnome.SubmitGeneralProposal(title, desc, daoPath, 1)\n}\n\n// Error:\n// voting period deadline must be between 2 and 10 days\n"},{"name":"public_proposals_0d_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\tgnome \"gno.land/r/gnome/dao/pre1\"\n)\n\nconst member = std.Address(\"g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun\")\n\nfunc init() {\n\tstd.TestSetOrigCaller(member)\n}\n\nfunc main() {\n\ttitle := \"Test proposal\"\n\tdesc := \"A test proposal\"\n\tdaoPath := \"invalid\"\n\tgnome.SubmitGeneralProposal(title, desc, daoPath, 0)\n}\n\n// Error:\n// DAO not found\n"},{"name":"public_proposals_0e_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\tgnome \"gno.land/r/gnome/dao/pre1\"\n)\n\nconst member = std.Address(\"g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun\")\n\nfunc init() {\n\tstd.TestSetOrigCaller(member)\n}\n\nfunc main() {\n\ttitle := \"Test proposal\"\n\tdaoPath := \"council/main\"\n\tgnome.SubmitGeneralProposal(title, \"\", daoPath, 0)\n}\n\n// Error:\n// proposal description is required\n"},{"name":"render.gno","body":"package gnome\n\nimport (\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"gno.land/p/demo/ufmt\"\n\n\t\"gno.land/p/gnome/alerts\"\n\tgnome \"gno.land/p/gnome/dao\"\n\trouter \"gno.land/p/gnome/router/v1\"\n)\n\nconst (\n\tdateFmt = \"2006-01-02 15:04 MST\"\n\tproposalTakeoverMsg = \"For the proposal outcome to change it has to be taken over by a parent DAO by voting on it\"\n)\n\nconst (\n\tcustomStyle = `\n\u003cstyle\u003e\n.custom ul { padding-left: 20px; }\n.custom li { list-style-type: disc; }\n.custom li.current { font-weight: 900; }\n.custom li \u003e p { margin: 0px; }\n\u003c/style\u003e\n`\n\tpaginatorStyle = `\u003cstyle\u003e\n.paginator { text-align: center; }\n.paginator a { text-decoration: none; }\n.paginator a:hover { text-decoration: underline; }\n.paginator .left { padding-right: 4px; }\n.paginator .right { padding-left: 4px; }\n\u003c/style\u003e`\n)\n\nfunc renderAlerts() string {\n\tif gnomeDAO.IsLocked() {\n\t\tmsg := \"Realm is locked\"\n\t\tif reason := gnomeDAO.LockReason(); reason != \"\" {\n\t\t\tmsg += \"\u003c/br\u003e\" + reason\n\t\t}\n\n\t\treturn alerts.NewError(msg)\n\t}\n\n\tif IsProposalsAdvanceNeeded() {\n\t\treturn alerts.NewWarning(\n\t\t\tnewGnoStudioConnectLink(\"AdvanceProposals\", \"Proposals advance needed\"),\n\t\t)\n\t}\n\treturn \"\"\n}\n\nfunc renderDAO(res router.ResponseWriter, req router.Request) {\n\tvar (\n\t\tdao *gnome.DAO\n\t\tdaoPath = req.Route\n\t)\n\n\tif daoPath == \"\" {\n\t\tdao = gnomeDAO\n\t\tdaoPath = nameCouncilDAO\n\t} else {\n\t\tvar found bool\n\t\tdao, found = daos.GetByPath(daoPath)\n\t\tif !found {\n\t\t\tres.Write(\"DAO Not Found\")\n\t\t\treturn\n\t\t}\n\n\t\t// TODO: Add lock dismissal reason when available\n\t\tif dao.IsLocked() {\n\t\t\tres.Write(alerts.NewError(\"DAO is dismissed\"))\n\t\t}\n\t}\n\n\tres.Writef(\n\t\t\"# Gno.me DAO\\n\"+\n\t\t\t\"## %s\\n\"+\n\t\t\t\"%s\\n\\n\"+\n\t\t\t\"[View Proposals of %s](%s)\\n\",\n\t\tdao.Title(),\n\t\tdao.Manifest(),\n\t\tdao.Title(),\n\t\tmakeProposalsURI(daoPath, true),\n\t)\n\n\tres.Write(\"## \" + dao.Title() + \" Members\\n\")\n\tfor _, m := range dao.Members() {\n\t\tres.Write(\"- \" + m.String() + \"\\n\")\n\t}\n\n\tres.Write(\"\\n\" + customStyle + \"\\n\\n\")\n\n\tres.Write(\"## Organization\\n\\n\")\n\tres.Write(renderOrganizationTree(daoPath))\n\tres.Write(\"\\n\")\n}\n\nfunc renderProposals(res router.ResponseWriter, req router.Request) {\n\tdaoPath := req.Route\n\tdao, found := daos.GetByPath(daoPath)\n\tif !found {\n\t\tres.Write(\"DAO Not Found\")\n\t\treturn\n\t}\n\n\tdaoProposals := proposals.GetAllByDAO(dao.Path())\n\tcount := len(daoProposals)\n\tif count == 0 {\n\t\tres.Write(\"DAO has no proposals\")\n\t\treturn\n\t}\n\n\trealmPath := makeRealmPath(req.Path)\n\tpages := gnome.NewPaginator(realmPath, gnome.WithItemCount(count))\n\n\t// TODO: Add links to toggle display of dismissed proposals (when DAO dismissal is implemented)\n\n\tres.Writef(\"# %s: Proposals\\n\", dao.Title())\n\tpages.Iterate(func(i int) bool {\n\t\tif i \u003e= count {\n\t\t\treturn true\n\t\t}\n\n\t\tp := daoProposals[i]\n\t\t_ = advanceProposal(p) // TODO: Handle errors when render notice support is implemented\n\t\tpath := makeProposalURI(p.ID(), true)\n\t\tres.Writef(\"- [#%s %s](%s) (%s)\\n\", p.ID(), p.Title(), path, p.Status())\n\t\treturn false\n\t})\n\n\tif pages.IsEnabled() {\n\t\tres.Write(renderPaginator(pages))\n\t}\n}\n\n// TODO: Improve renderProposal code\nfunc renderProposal(res router.ResponseWriter, req router.Request) {\n\trawID := req.Route\n\tid, err := strconv.Atoi(rawID)\n\tif err != nil {\n\t\tres.Write(\"Invalid proposal ID: \" + gnome.EscapeHTML(rawID))\n\t\treturn\n\t}\n\n\tproposal, found := proposals.GetByID(gnome.ID(id))\n\tif !found {\n\t\tres.Write(\"Proposal Not Found\")\n\t\treturn\n\t}\n\n\tvar (\n\t\toutcome gnome.ProposalStatus\n\t\tstatus = proposal.Status()\n\t)\n\n\t// When the status is not final advance the proposal to calculate the current outcome\n\tif !status.IsFinal() {\n\t\t_ = advanceProposal(proposal) // TODO: Implement generic alert support for render and use it to render errors\n\t\toutcome = proposal.Status()\n\n\t\t// Validate if proposal is valid for the current state\n\t\tif err := proposal.Validate(); err != nil {\n\t\t\tres.Write(alerts.NewError(err.Error()))\n\t\t}\n\n\t\t// Warn when the outcome could change if a member of a parent DAO votes on this proposal.\n\t\t// Proposal choice is only available when there is a majority, so there is voting concensus.\n\t\tif proposal.Choice() != gnome.ChoiceNone \u0026\u0026 !proposal.HasVotingDeadlinePassed() {\n\t\t\tres.Write(alerts.NewWarning(proposalTakeoverMsg))\n\t\t}\n\t} else if status == gnome.StatusDismissed {\n\t\t// Display an alert with the dismiss reason\n\t\tres.Write(alerts.NewWarning(proposal.StatusReason()))\n\t}\n\n\tdao := proposal.DAO()\n\tdaoPath := dao.Path()\n\tif proposal.HasBeenPromoted() {\n\t\turi := makeDAOURI(daoPath, true)\n\t\tlink := alerts.NewLink(uri, dao.Title())\n\t\tres.Write(alerts.NewWarning(\"Proposal has been promoted to \" + link + \" DAO\"))\n\t}\n\n\tres.Write(\"# #\" + proposal.ID().String() + \" \" + proposal.Title() + \"\\n\")\n\tres.Write(\"- Type: \" + proposal.Strategy().Name() + \"\\n\")\n\tres.Write(\"- Created: \" + proposal.CreatedAt().UTC().Format(dateFmt) + \"\\n\")\n\tres.Write(\"- Proposer: \" + proposal.Proposer().String() + \"\\n\")\n\tres.Write(\"- Status: \" + getProposalStatusMarkdown(status, proposal.Choice(), proposal.StatusReason()) + \"\\n\")\n\n\tif !status.IsFinal() {\n\t\tif outcome == gnome.StatusReview {\n\t\t\tres.Write(\"- Review Deadline: \" + proposal.ReviewDeadline().UTC().Format(dateFmt) + \"\\n\")\n\t\t} else {\n\t\t\tres.Write(\"- Voting Deadline: \" + proposal.VotingDeadline().UTC().Format(dateFmt) + \"\\n\")\n\t\t\tres.Write(\"- Expected Outcome: \" + getProposalStatusMarkdown(outcome, proposal.Choice(), proposal.StatusReason()) + \"\\n\")\n\n\t\t\t// Vote line should be render as long as voting deadline is not reached.\n\t\t\t// This is required for proposals that have to be advanced after deadline is reached.\n\t\t\tif !proposal.HasVotingDeadlinePassed() {\n\t\t\t\tres.Write(\"\\n\" + newGnoStudioConnectLink(\"Vote\", \"Vote on this proposal\") + \"\\n\")\n\t\t\t}\n\t\t}\n\t}\n\n\tif s := proposal.Description(); s != \"\" {\n\t\tres.Write(\"## Description\\n\" + s + \"\\n\")\n\t}\n\n\tif r, ok := proposal.Strategy().(gnome.ParamsRenderer); ok {\n\t\t// TODO: Use custom HTML component to allow users to toggle params visibility\n\t\tif s := r.RenderParams(); s != \"\" {\n\t\t\tres.Write(\"## Parameters\\n\\n\" + s + \"\\n\")\n\t\t}\n\t}\n\n\tres.Write(\"## Votes\\n\")\n\trecord := proposal.VotingRecord()\n\tif record.VoteCount() == 0 {\n\t\tres.Write(\"The proposal has no votes\\n\")\n\t} else {\n\t\t// TODO: Render percentages for each voting choice and abstentions?\n\t\trecord.Iterate(func(c gnome.VoteChoice, count uint) bool {\n\t\t\tres.Writef(\"- %s: %d\\n\", string(c), count)\n\t\t\treturn false\n\t\t})\n\n\t\tres.Write(\"## Participation\\n\")\n\t\trenderProposalParticipation(res, record.Votes())\n\t}\n\n\t// If proposal has been promoted to a parent DAO render participation in child DAOs\n\tif proposal.HasBeenPromoted() {\n\t\tres.Write(\"## Sub DAOs Participation\\n\")\n\t\tdaos := proposal.Promotions()\n\t\trecords := proposal.VotingRecords()\n\t\tfor i := len(records) - 2; i \u003e= 0; i-- { // reverse iteration excluding record for current DAO\n\t\t\tr := records[i]\n\t\t\tdao := daos[i]\n\t\t\tres.Write(\"### [\" + dao.Title() + \"](\" + makeDAOURI(daoPath, true) + \"]\\n\")\n\t\t\trenderProposalParticipation(res, r.Votes())\n\t\t}\n\t}\n}\n\nfunc renderParams(res router.ResponseWriter, req router.Request) {\n\tres.Write(\"# Gno.me DAO: Parameters\\n\")\n\tres.Write(\"## Proposal\\n\")\n\tres.Write(\"**General**\\n\")\n\tres.Write(\"- Review Deadline: \" + gnome.HumanizeDuration(parameters.ReviewDeadline) + \"\\n\")\n\n\tres.Write(\"\\n**Voting Periods**\\n\")\n\tparameters.VotingPeriods.Iterate(func(name string, period time.Duration) bool {\n\t\tres.Write(\"- `\" + name + \"`: \" + gnome.HumanizeDuration(period) + \"\\n\")\n\t\treturn false\n\t})\n}\n\nfunc renderProposalParticipation(res router.ResponseWriter, votes []gnome.Vote) {\n\tfor _, v := range votes {\n\t\tchoice := string(v.Choice)\n\t\tif v.Reason != \"\" {\n\t\t\t// TODO: Long reasons have to break lines to fit making web UI look bad\n\t\t\tchoice += ` \"` + gnome.EscapeHTML(v.Reason) + `\"`\n\t\t}\n\n\t\tres.Writef(\"- %s: voted %s\\n\", v.Address.String(), choice)\n\t}\n}\n\n// TODO: Use the UI package for HTML elements because rendered Markdown styles break the tree\nfunc renderOrganizationTree(currentPath string) string {\n\tvar item string\n\tif gnomeDAO.Name() == currentPath {\n\t\titem = `\u003cli class=\"current\"\u003e` + gnomeDAO.Title() + `\u003c/li\u003e`\n\t} else {\n\t\turi := makeDAOURI(gnomeDAO.Path(), true)\n\t\titem = `\u003cli\u003e` + alerts.NewLink(uri, gnomeDAO.Title()) + `\u003c/li\u003e`\n\t}\n\treturn `\u003cdiv class=\"custom\"\u003e\u003cul\u003e` + item + renderSubTree(gnomeDAO, currentPath) + `\u003c/ul\u003e\u003c/div\u003e`\n}\n\nfunc renderSubTree(parentDAO *gnome.DAO, currentPath string) string {\n\tvar (\n\t\tbuf strings.Builder\n\t\titem string\n\t)\n\n\tfor _, dao := range parentDAO.SubDAOs() {\n\t\tif dao.IsLocked() {\n\t\t\t// Skip dismissed DAOs\n\t\t\t// TODO: Render filter option to toggle dismissed DAOs visibility\n\t\t\tcontinue\n\t\t}\n\n\t\tif dao.Path() == currentPath {\n\t\t\titem = `\u003cli class=\"current\"\u003e` + dao.Title() + `\u003c/li\u003e`\n\t\t} else {\n\t\t\turi := makeDAOURI(dao.Path(), true)\n\t\t\titem = `\u003cli\u003e` + alerts.NewLink(uri, dao.Title()) + `\u003c/li\u003e`\n\t\t}\n\n\t\tbuf.WriteString(item)\n\n\t\tif len(dao.SubDAOs()) \u003e 0 {\n\t\t\tbuf.WriteString(renderSubTree(dao, currentPath))\n\t\t}\n\t}\n\treturn `\u003cul\u003e` + buf.String() + `\u003c/ul\u003e`\n}\n\nfunc renderPaginator(p gnome.Paginator) string {\n\tvar out string\n\tif s := p.PrevPageURI(); s != \"\" {\n\t\tout = ufmt.Sprintf(`\u003ca href=\"%s\" class=\"left\"\u003e\u0026lt;-\u003c/a\u003e`, s)\n\t} else {\n\t\tout += `\u003cspan class=\"left\"\u003e--\u003c/span\u003e`\n\t}\n\n\t// TODO: Add display links to other page numbers?\n\tout += ufmt.Sprintf(\"page %d\", p.Page())\n\n\tif s := p.NextPageURI(); s != \"\" {\n\t\tout += ufmt.Sprintf(`\u003ca href=\"%s\" class=\"right\"\u003e-\u0026gt;\u003c/a\u003e`, s)\n\t} else {\n\t\tout += `\u003cspan class=\"right\"\u003e--\u003c/span\u003e`\n\t}\n\n\treturn \"\\n\" + paginatorStyle + `\u003cp class=\"paginator\"\u003e` + out + `\u003c/p\u003e`\n}\n\nfunc advanceProposal(p *gnome.Proposal) error {\n\tstatus := p.Status()\n\tif status == gnome.StatusReview \u0026\u0026 p.HasReviewDeadlinePassed() {\n\t\tif err := p.Activate(); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tstatus = p.Status()\n\t}\n\n\tif status == gnome.StatusActive {\n\t\t// Tally active proposals to always have an up to date state with the current proposal outcome\n\t\tif err := p.Tally(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc getProposalStatusMarkdown(s gnome.ProposalStatus, c gnome.VoteChoice, reason string) string {\n\tswitch s {\n\tcase gnome.StatusPassed:\n\t\treturn ufmt.Sprintf(\"**%s** (%s)\", s, string(c))\n\tcase gnome.StatusRejected:\n\t\t// Rejected proposal might have a reason\n\t\tif reason == \"\" {\n\t\t\treturn ufmt.Sprintf(\"**%s**\", s)\n\t\t} else {\n\t\t\treturn ufmt.Sprintf(\"**%s** (%s)\", s, reason)\n\t\t}\n\tcase gnome.StatusDismissed, gnome.StatusFailed:\n\t\treturn ufmt.Sprintf(\"**%s** (%s)\", s, reason)\n\tdefault:\n\t\treturn ufmt.Sprintf(\"**%s**\", s)\n\t}\n}\n\nfunc newGnoStudioConnectLink(functionName, label string) string {\n\thref := makeGnoStudioConnectURL(functionName)\n\treturn alerts.NewLink(href, label)\n}\n"},{"name":"strategy_budget.gno","body":"package gnome\n\nimport (\n\t\"errors\"\n\t\"std\"\n\t\"strings\"\n\t\"time\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\nfunc newBudgetStrategy(council *gnome.DAO, budget string) budgetStrategy {\n\tif council == nil {\n\t\tpanic(\"council DAO is requried\")\n\t}\n\n\tif !council.IsSuperCouncil() {\n\t\tpanic(\"budget strategy expects DAO to be a super council\")\n\t}\n\n\tbudget = strings.TrimSpace(budget)\n\tif budget == \"\" {\n\t\tpanic(\"budget is required\")\n\t}\n\n\t// The council DAO must have at least one sub DAO which should the main DAO.\n\t// The first sub DAO is some times used to check if a vote is valid.\n\tif len(council.SubDAOs()) == 0 {\n\t\tpanic(\"budget strategy expects council DAO to have at least one sub DAO\")\n\t}\n\n\treturn budgetStrategy{\n\t\tchoices: []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo},\n\t\tcouncil: council,\n\t\tbudget: budget, // TODO: Validate/split budget format? (ex. AMOUNTSYMBOL: 10USD)\n\t}\n}\n\ntype budgetStrategy struct {\n\tchoices []gnome.VoteChoice\n\tcouncil *gnome.DAO\n\tbudget string\n}\n\n// Name returns the name of the strategy.\nfunc (budgetStrategy) Name() string {\n\treturn StrategyNameBudget\n}\n\n// Quorum returns the minimum required percentage of DAO member votes\n// required for a proposal to pass.\nfunc (budgetStrategy) Quorum() float64 {\n\treturn 0.51\n}\n\n// VotingPeriod returns the period that a proposal should allow voting.\nfunc (budgetStrategy) VotingPeriod() time.Duration {\n\tperiod, _ := parameters.VotingPeriods.Get(StrategyNameBudget)\n\treturn period\n}\n\n// VoteChoices returns the valid voting choices for the strategy.\nfunc (s budgetStrategy) VoteChoices() []gnome.VoteChoice {\n\treturn s.choices\n}\n\n// CheckVote checks that a vote is valid for the strategy.\nfunc (s budgetStrategy) CheckVote(addr std.Address, _ gnome.VoteChoice, _ string) error {\n\t// Check that voter address belongs to a council DAO member\n\tif s.council.HasMember(addr) {\n\t\treturn nil\n\t}\n\n\t// Make sure the main DAO was not dismissed and check that voter address belongs to a main DAO member\n\t// TODO: Check DAO status instead when DAO dismissal is implemented\n\tif sub := s.council.SubDAOs(); len(sub) \u003e 0 {\n\t\tmainDAO := sub[0]\n\t\tif !mainDAO.HasMember(addr) {\n\t\t\treturn errors.New(\"only members of the council DAO or main DAO can vote on budget proposals\")\n\t\t}\n\t} else {\n\t\treturn errors.New(\"main DAO not found\")\n\t}\n\treturn nil\n}\n\n// Tally counts the votes and returns the winner voting choice.\nfunc (budgetStrategy) Tally(dao *gnome.DAO, r gnome.VotingRecord) gnome.VoteChoice {\n\t// Consider abstentions to make the majority absolute\n\tabstentions := len(dao.Members()) - r.VoteCount()\n\tif choice, ok := gnome.SelectChoiceByMajority(r, abstentions); ok {\n\t\treturn choice\n\t}\n\treturn gnome.ChoiceNone\n}\n\n// RenderParams returns a markdown with the rendered strategy parameters.\nfunc (s budgetStrategy) RenderParams() string {\n\treturn \"Budget: \" + gnome.EscapeHTML(s.budget)\n}\n"},{"name":"strategy_budget_test.gno","body":"package gnome\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"std\"\n\t\"testing\"\n\t\"time\"\n\n\t\"gno.land/p/demo/testutils\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\nfunc TestBudgetStrategy(t *testing.T) {\n\tcases := []struct {\n\t\tname string\n\t\tcouncil *gnome.DAO\n\t\terr string\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\tcouncil: gnome.MustNew(\"council\", \"Council\",\n\t\t\t\tgnome.AssignAsSuperCouncil(),\n\t\t\t\tgnome.WithSubDAO(\n\t\t\t\t\tgnome.MustNew(\"main\", \"Main\"),\n\t\t\t\t),\n\t\t\t),\n\t\t},\n\t\t{\n\t\t\tname: \"nil council\",\n\t\t\terr: \"council DAO is requried\",\n\t\t},\n\t\t{\n\t\t\tname: \"no super council\",\n\t\t\tcouncil: gnome.MustNew(\"council\", \"Council\"),\n\t\t\terr: \"budget strategy expects DAO to be a super council\",\n\t\t},\n\t\t{\n\t\t\tname: \"council without main DAO\",\n\t\t\tcouncil: gnome.MustNew(\"council\", \"Council\", gnome.AssignAsSuperCouncil()),\n\t\t\terr: \"budget strategy expects council DAO to have at least one sub DAO\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tname := StrategyNameBudget\n\t\t\tquorum := 0.51\n\t\t\tvotingPeriod := time.Hour * 24 * 7\n\t\t\tchoices := fmt.Sprintf(\"%v\", []gnome.VoteChoice{\n\t\t\t\tgnome.ChoiceYes,\n\t\t\t\tgnome.ChoiceNo,\n\t\t\t})\n\n\t\t\t// Act\n\t\t\tvar s budgetStrategy\n\t\t\terr := handlePanic(t, func() {\n\t\t\t\ts = newBudgetStrategy(tc.council, \"1USD\")\n\t\t\t})\n\n\t\t\t// Assert\n\t\t\tif tc.err != \"\" {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tassertNoError(t, err)\n\n\t\t\tif got := s.Name(); got != name {\n\t\t\t\tt.Fatalf(\"expected strategy name: '%s', got: '%s'\", name, got)\n\t\t\t}\n\n\t\t\tif got := s.Quorum(); got != quorum {\n\t\t\t\tt.Fatalf(\"expected strategy quorum: %.2f, got: %.2f\", quorum, got)\n\t\t\t}\n\n\t\t\tif got := s.VotingPeriod(); got != votingPeriod {\n\t\t\t\tt.Fatalf(\"expected strategy voting period: %d, got: %d\", votingPeriod, got)\n\t\t\t}\n\n\t\t\tif got := fmt.Sprintf(\"%v\", s.VoteChoices()); got != choices {\n\t\t\t\tt.Fatalf(\"expected strategy vote choices: %s, got: %s\", choices, got)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestBudgetStrategyCheckVote(t *testing.T) {\n\tcouncilMember := newTestMember(t, \"council\")\n\tmainMember := newTestMember(t, \"main\")\n\tcouncil := gnome.MustNew(\n\t\t\"council\",\n\t\t\"Council\",\n\t\tgnome.AssignAsSuperCouncil(),\n\t\tgnome.WithMembers(councilMember),\n\t\tgnome.WithSubDAO(\n\t\t\tgnome.MustNew(\"main\", \"Main\", gnome.WithMembers(mainMember)),\n\t\t),\n\t)\n\n\tcases := []struct {\n\t\tname string\n\t\taddress std.Address\n\t\tchoice gnome.VoteChoice\n\t\tcouncil *gnome.DAO\n\t\terr string\n\t}{\n\t\t{\n\t\t\tname: \"council DAO vote\",\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t\taddress: councilMember.Address,\n\t\t\tcouncil: council,\n\t\t},\n\t\t{\n\t\t\tname: \"main DAO vote\",\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t\taddress: mainMember.Address,\n\t\t\tcouncil: council,\n\t\t},\n\t\t{\n\t\t\tname: \"non member vote\",\n\t\t\tchoice: gnome.ChoiceNo,\n\t\t\taddress: testutils.TestAddress(\"foo\"),\n\t\t\tcouncil: council,\n\t\t\terr: \"only members of the council DAO or main DAO can vote on budget proposals\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\ts := newBudgetStrategy(tc.council, \"1USD\")\n\n\t\t\t// Act\n\t\t\terr := s.CheckVote(tc.address, tc.choice, \"\")\n\n\t\t\t// Assert\n\t\t\tif tc.err != \"\" {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t} else {\n\t\t\t\tassertNoError(t, err)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestBudgetStrategyTally(t *testing.T) {\n\tcouncil := gnome.MustNew(\n\t\t\"council\",\n\t\t\"Council\",\n\t\tgnome.AssignAsSuperCouncil(),\n\t\tgnome.WithMembers(\n\t\t\tnewTestMember(t, \"member1\"),\n\t\t\tnewTestMember(t, \"member2\"),\n\t\t\tnewTestMember(t, \"member3\"),\n\t\t\tnewTestMember(t, \"member4\"),\n\t\t),\n\t\tgnome.WithSubDAO(\n\t\t\tgnome.MustNew(\"main\", \"Main\"),\n\t\t),\n\t)\n\tcases := []struct {\n\t\tname string\n\t\tvotes []gnome.Vote\n\t\tchoice gnome.VoteChoice\n\t}{\n\t\t{\n\t\t\tname: \"majority\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t},\n\t\t{\n\t\t\tname: \"majority with abstentions\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNo,\n\t\t},\n\t\t{\n\t\t\tname: \"no quorum\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNone,\n\t\t},\n\t\t{\n\t\t\tname: \"no quorum with abstentions\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNone,\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\trecord := gnome.NewVotingRecord()\n\t\t\tfor _, v := range tc.votes {\n\t\t\t\trecord.Add(v)\n\t\t\t}\n\n\t\t\ts := newBudgetStrategy(council, \"1USD\")\n\n\t\t\t// Act\n\t\t\tchoice := s.Tally(council, *record)\n\n\t\t\t// Assert\n\t\t\tif choice != tc.choice {\n\t\t\t\tt.Fatalf(\"expected tally result choice: '%v', got: '%v'\", tc.choice, choice)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc handlePanic(t *testing.T, fn func()) (reason error) {\n\tt.Helper()\n\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\tif err, _ := r.(error); err != nil {\n\t\t\t\treason = err\n\t\t\t} else {\n\t\t\t\treason = errors.New(fmt.Sprint(r))\n\t\t\t}\n\t\t}\n\t}()\n\n\tfn()\n\treturn\n}\n"},{"name":"strategy_dao.gno","body":"package gnome\n\nimport (\n\t\"errors\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\n// Minimum number of members per DAO.\n// This requirement is enforced because two members DAO can only use plurality to tally.\nconst minMembersCount = 3\n\nfunc newSubDAOCreationStrategy(daos daoIndex, name, title, manifest string, members []gnome.Member) subDAOCreationStrategy {\n\tif strings.TrimSpace(name) == \"\" {\n\t\tpanic(\"sub DAO name is required\")\n\t}\n\n\tif !gnome.IsSlug(name) {\n\t\tpanic(`invalid sub DAO name, only letters from \"a\" to \"z\", numbers, \"-\" and \"_\" are allowed`)\n\t}\n\n\tif strings.TrimSpace(title) == \"\" {\n\t\tpanic(\"sub DAO title is required\")\n\t}\n\n\tif strings.TrimSpace(manifest) == \"\" {\n\t\tpanic(\"sub DAO manifest is required\")\n\t}\n\n\tif len(members) \u003c minMembersCount {\n\t\tpanic(\"sub DAOs require at least \" + strconv.Itoa(minMembersCount) + \" members\")\n\t}\n\n\treturn subDAOCreationStrategy{\n\t\tchoices: []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo},\n\t\tdaos: daos,\n\t\tname: name,\n\t\ttitle: title,\n\t\tmanifest: manifest,\n\t\tmembers: members,\n\t}\n}\n\ntype subDAOCreationStrategy struct {\n\tchoices []gnome.VoteChoice\n\tdaos daoIndex\n\tname, title, manifest string\n\tmembers []gnome.Member\n}\n\n// Name returns the name of the strategy.\nfunc (subDAOCreationStrategy) Name() string {\n\treturn StrategyNameSubDAOCreation\n}\n\n// Quorum returns the minimum required percentage of DAO member votes\n// required for a proposal to pass.\nfunc (subDAOCreationStrategy) Quorum() float64 {\n\treturn 1.0\n}\n\n// VotingPeriod returns the period that a proposal should allow voting.\nfunc (subDAOCreationStrategy) VotingPeriod() time.Duration {\n\tperiod, _ := parameters.VotingPeriods.Get(StrategyNameSubDAOCreation)\n\treturn period\n}\n\n// VoteChoices returns the valid voting choices for the strategy.\nfunc (s subDAOCreationStrategy) VoteChoices() []gnome.VoteChoice {\n\treturn s.choices\n}\n\n// Tally counts the votes and returns the winner voting choice.\nfunc (subDAOCreationStrategy) Tally(dao *gnome.DAO, r gnome.VotingRecord) gnome.VoteChoice {\n\t// Strategy need 100% participation to decide on the outcome.\n\t// Normally quorum should make sure all members voted before\n\t// tallying but otherwise tally should not return a valid outcome.\n\tif len(dao.Members()) != r.VoteCount() {\n\t\treturn gnome.ChoiceNone\n\t}\n\n\t// This type of proposals can pass only when 100% of members vote YES.\n\tfor _, v := range r.Votes() {\n\t\t// If there is at least one NO vote then proposal must be rejected\n\t\tif v.Choice == gnome.ChoiceNo {\n\t\t\treturn gnome.ChoiceNo\n\t\t}\n\t}\n\t// Proposal should pass when all votes are YES\n\treturn gnome.ChoiceYes\n}\n\n// Validate validates if a proposal is valid for the current state.\nfunc (s subDAOCreationStrategy) Validate(p *gnome.Proposal) error {\n\tdao := p.DAO()\n\tpath := dao.Path()\n\tif dao.IsLocked() {\n\t\treturn errors.New(\"parent DAO '\" + path + \"' is locked\")\n\t}\n\n\tsubDAOPath := path + gnome.PathSeparator + s.name\n\tif s.daos.HasPathKey(subDAOPath) {\n\t\treturn errors.New(\"sub DAO path has been taken by another DAO\")\n\t}\n\treturn nil\n}\n\n// RenderParams returns a markdown with the rendered strategy parameters.\nfunc (s subDAOCreationStrategy) RenderParams() string {\n\tvar (\n\t\tb strings.Builder\n\t\tmembers []string\n\t\tmanifest = gnome.EscapeHTML(s.manifest)\n\t)\n\n\tfor _, addr := range s.members {\n\t\tmembers = append(members, addr.String())\n\t}\n\n\t// TODO: Use a custom HTML table and add styling (vertical alignment, padding, ...)\n\t// This would allow to remove the markdown \"hacks\" to improve the output layout\n\tb.WriteString(\"|||\\n|---|---|\\n\")\n\tb.WriteString(\"| Name: | \" + gnome.EscapeHTML(s.name) + \" |\\n\")\n\tb.WriteString(\"| Title: | \" + gnome.EscapeHTML(s.title) + \" |\\n\")\n\tb.WriteString(\"| Members: | \u003c/br\u003e\" + strings.Join(members, \"\u003c/br\u003e\") + \"\u003c/br\u003e\u003c/br\u003e |\\n\")\n\tb.WriteString(\"| Manifest:\u0026nbsp;\u0026nbsp; | \" + strings.ReplaceAll(manifest, \"\\n\", \"\u003c/br\u003e\") + \" |\\n\")\n\n\treturn b.String()\n}\n\n// Execute creates the new sub DAO.\nfunc (s subDAOCreationStrategy) Execute(dao *gnome.DAO) error {\n\tsubDAO, err := gnome.New(s.name, s.title, gnome.WithManifest(s.manifest), gnome.WithMembers(s.members...))\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Add the new sub DAO to its parent\n\tdao.AddSubDAO(subDAO)\n\n\t// Index the new sub DAO\n\ts.daos.IndexByPath(subDAO)\n\n\treturn nil\n}\n\nfunc newDAOMembersModificationStrategy(newMembers, removeMembers []gnome.Member) daoMembersModificationStrategy {\n\tif len(newMembers) == 0 \u0026\u0026 len(removeMembers) == 0 {\n\t\tpanic(\"members are required\")\n\t}\n\n\treturn daoMembersModificationStrategy{\n\t\tchoices: []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo},\n\t\tnewMembers: newMembers,\n\t\tremoveMembers: removeMembers,\n\t}\n}\n\ntype daoMembersModificationStrategy struct {\n\tchoices []gnome.VoteChoice\n\tnewMembers, removeMembers []gnome.Member\n}\n\n// Name returns the name of the strategy.\nfunc (daoMembersModificationStrategy) Name() string {\n\treturn StrategyNameDAOMembersModification\n}\n\n// Quorum returns the minimum required percentage of DAO member votes\n// required for a proposal to pass.\nfunc (daoMembersModificationStrategy) Quorum() float64 {\n\treturn 0.51\n}\n\n// VotingPeriod returns the period that a proposal should allow voting.\nfunc (daoMembersModificationStrategy) VotingPeriod() time.Duration {\n\tperiod, _ := parameters.VotingPeriods.Get(StrategyNameDAOMembersModification)\n\treturn period\n}\n\n// VoteChoices returns the valid voting choices for the strategy.\nfunc (s daoMembersModificationStrategy) VoteChoices() []gnome.VoteChoice {\n\treturn s.choices\n}\n\n// Tally counts the votes and returns the winner voting choice.\nfunc (daoMembersModificationStrategy) Tally(_ *gnome.DAO, r gnome.VotingRecord) gnome.VoteChoice {\n\t// Tally requires at least three votes to be able to tally by 2/3s super majority\n\tif r.VoteCount() \u003c 3 {\n\t\treturn gnome.ChoiceNone\n\t}\n\n\tif choice, ok := gnome.SelectChoiceBySuperMajority(r); ok {\n\t\treturn choice\n\t}\n\treturn gnome.ChoiceNone\n}\n\n// Validate validates if a proposal is valid for the current DAO state.\nfunc (s daoMembersModificationStrategy) Validate(p *gnome.Proposal) error {\n\t// At least three members are required to enforce 2/3s majority on proposals\n\tdao := p.DAO()\n\tmemberCount := len(dao.Members()) + len(s.newMembers) - len(s.removeMembers)\n\tif memberCount \u003c minMembersCount {\n\t\treturn errors.New(\"DAO must always have a minimum of \" + strconv.Itoa(minMembersCount) + \" members\")\n\t}\n\n\t// TODO: Should we allow re-adding members to only change assigned roles?\n\tfor _, m := range s.newMembers {\n\t\tif dao.HasMember(m.Address) {\n\t\t\treturn errors.New(\"address is already a DAO member: \" + m.Address.String())\n\t\t}\n\t}\n\n\tfor _, m := range s.removeMembers {\n\t\tif !dao.HasMember(m.Address) {\n\t\t\treturn errors.New(\"address is not a DAO member: \" + m.Address.String())\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// Execute modifies main DAO members.\nfunc (s daoMembersModificationStrategy) Execute(dao *gnome.DAO) error {\n\tfor _, m := range s.newMembers {\n\t\tdao.AddMember(m)\n\t}\n\n\tfor _, m := range s.removeMembers {\n\t\tdao.RemoveMember(m.Address)\n\t}\n\n\treturn nil\n}\n\n// RenderParams returns a markdown with the rendered strategy parameters.\nfunc (s daoMembersModificationStrategy) RenderParams() string {\n\tvar b strings.Builder\n\n\tb.WriteString(\"|||\\n|---|---|\\n\")\n\n\tif len(s.newMembers) \u003e 0 {\n\t\tvar members []string\n\t\tfor _, m := range s.newMembers {\n\t\t\tmembers = append(members, m.String())\n\t\t}\n\n\t\tb.WriteString(\"| New Members: | \" + strings.Join(members, \"\u003c/br\u003e\") + \"\u003c/br\u003e\u003c/br\u003e |\\n\")\n\t}\n\n\tif len(s.removeMembers) \u003e 0 {\n\t\tvar members []string\n\t\tfor _, m := range s.removeMembers {\n\t\t\tmembers = append(members, m.String())\n\t\t}\n\n\t\tb.WriteString(\"| Members to Remove: | \" + strings.Join(members, \"\u003c/br\u003e\") + \" |\\n\")\n\t}\n\n\treturn b.String()\n}\n\nfunc newSubDAODismissalStrategy(dao *gnome.DAO, x proposalIndex) subDAODismissalStrategy {\n\tif dao == nil {\n\t\tpanic(\"DAO is required\")\n\t}\n\n\treturn subDAODismissalStrategy{\n\t\tchoices: []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo},\n\t\tdao: dao,\n\t\tproposals: x,\n\t}\n}\n\ntype subDAODismissalStrategy struct {\n\tchoices []gnome.VoteChoice\n\tdao *gnome.DAO\n\tproposals proposalIndex\n}\n\n// Name returns the name of the strategy.\nfunc (subDAODismissalStrategy) Name() string {\n\treturn StrategyNameSubDAODismissal\n}\n\n// Quorum returns the minimum required percentage of DAO member votes\n// required for a proposal to pass.\nfunc (subDAODismissalStrategy) Quorum() float64 {\n\treturn 0.51\n}\n\n// VotingPeriod returns the period that a proposal should allow voting.\nfunc (subDAODismissalStrategy) VotingPeriod() time.Duration {\n\tperiod, _ := parameters.VotingPeriods.Get(StrategyNameSubDAODismissal)\n\treturn period\n}\n\n// VoteChoices returns the valid voting choices for the strategy.\nfunc (s subDAODismissalStrategy) VoteChoices() []gnome.VoteChoice {\n\treturn s.choices\n}\n\n// Tally counts the votes and returns the winner voting choice.\nfunc (subDAODismissalStrategy) Tally(_ *gnome.DAO, r gnome.VotingRecord) gnome.VoteChoice {\n\tif choice, ok := gnome.SelectChoiceByPlurality(r); ok {\n\t\treturn choice\n\t}\n\treturn gnome.ChoiceNone\n}\n\n// Validate validates if a proposal is valid for the current DAO state.\nfunc (s subDAODismissalStrategy) Validate(p *gnome.Proposal) error {\n\tparentDAO := s.dao.Parent()\n\tif parentDAO == nil {\n\t\treturn errors.New(\"the DAO to dismiss has no parent DAO\")\n\t}\n\n\tparentName := p.DAO().Name()\n\tif parentDAO.Name() != parentName {\n\t\treturn errors.New(`the DAO to dismiss must be a first level sub DAO of \"` + parentName + `\"`)\n\t}\n\treturn nil\n}\n\n// Execute modifies main DAO members.\nfunc (s subDAODismissalStrategy) Execute(*gnome.DAO) error {\n\t// Get the list of all sub DAOs and the root DAO to dismiss\n\tdaos := append(collectSubDAOs(s.dao), s.dao)\n\t// Proposal dismissal requires a reason\n\t// TODO: Send proposal to Execute and add dismissal proposal link?\n\treason := \"Dismissed because of DAO dismissal: \" + s.dao.Path()\n\n\tfor _, dao := range daos {\n\t\t// Dismiss all proposals for the current DAO\n\t\tfor _, p := range s.proposals.GetAllByDAO(dao.Path()) {\n\t\t\tif !p.Status().IsFinal() {\n\t\t\t\tp.Dismiss(reason)\n\t\t\t}\n\t\t}\n\n\t\t// Lock the DAO to dismiss it\n\t\tdao.Lock(\"\")\n\t}\n\treturn nil\n}\n\n// RenderParams returns a markdown with the rendered strategy parameters.\nfunc (s subDAODismissalStrategy) RenderParams() string {\n\treturn \"DAO: \" + s.dao.Path()\n}\n\nfunc collectSubDAOs(dao *gnome.DAO) []*gnome.DAO {\n\tdaos := dao.SubDAOs()\n\tfor _, sub := range daos[:] {\n\t\tdaos = append(daos, collectSubDAOs(sub)...)\n\t}\n\treturn daos\n}\n"},{"name":"strategy_dao_test.gno","body":"package gnome\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\t\"time\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/testutils\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\nfunc TestSubDAOCreationStrategy(t *testing.T) {\n\tcases := []struct {\n\t\tname, daoName, title, manifest, err string\n\t\tmembers []gnome.Member\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\tdaoName: \"test\",\n\t\t\ttitle: \"Test\",\n\t\t\tmanifest: \"Test manifest\",\n\t\t\tmembers: []gnome.Member{\n\t\t\t\tnewTestMember(t, \"address1\"),\n\t\t\t\tnewTestMember(t, \"address2\"),\n\t\t\t\tnewTestMember(t, \"address3\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"without name\",\n\t\t\terr: \"sub DAO name is required\",\n\t\t},\n\t\t{\n\t\t\tname: \"invalid name\",\n\t\t\tdaoName: \"invalid name\",\n\t\t\terr: `invalid sub DAO name, only letters from \"a\" to \"z\", numbers, \"-\" and \"_\" are allowed`,\n\t\t},\n\t\t{\n\t\t\tname: \"without title\",\n\t\t\tdaoName: \"test\",\n\t\t\terr: \"sub DAO title is required\",\n\t\t},\n\t\t{\n\t\t\tname: \"without manifest\",\n\t\t\tdaoName: \"test\",\n\t\t\ttitle: \"Test\",\n\t\t\terr: \"sub DAO manifest is required\",\n\t\t},\n\t\t{\n\t\t\tname: \"less than two DAO members\",\n\t\t\tdaoName: \"test\",\n\t\t\ttitle: \"Test\",\n\t\t\tmanifest: \"Test manifest\",\n\t\t\terr: \"sub DAOs require at least 3 members\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tname := StrategyNameSubDAOCreation\n\t\t\tquorum := 1.0\n\t\t\tvotingPeriod := time.Hour * 24 * 7\n\t\t\tchoices := fmt.Sprintf(\"%v\", []gnome.VoteChoice{\n\t\t\t\tgnome.ChoiceYes,\n\t\t\t\tgnome.ChoiceNo,\n\t\t\t})\n\n\t\t\t// Act\n\t\t\tvar s subDAOCreationStrategy\n\t\t\terr := handlePanic(t, func() {\n\t\t\t\ts = newSubDAOCreationStrategy(daoIndex{}, tc.daoName, tc.title, tc.manifest, tc.members)\n\t\t\t})\n\n\t\t\t// Assert\n\t\t\tif tc.err != \"\" {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tassertNoError(t, err)\n\n\t\t\tif got := s.Name(); got != name {\n\t\t\t\tt.Fatalf(\"expected strategy name: '%s', got: '%s'\", name, got)\n\t\t\t}\n\n\t\t\tif got := s.Quorum(); got != quorum {\n\t\t\t\tt.Fatalf(\"expected strategy quorum: %.2f, got: %.2f\", quorum, got)\n\t\t\t}\n\n\t\t\tif got := s.VotingPeriod(); got != votingPeriod {\n\t\t\t\tt.Fatalf(\"expected strategy voting period: %d, got: %d\", votingPeriod, got)\n\t\t\t}\n\n\t\t\tif got := fmt.Sprintf(\"%v\", s.VoteChoices()); got != choices {\n\t\t\t\tt.Fatalf(\"expected strategy vote choices: %s, got: %s\", choices, got)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestSubDAOCreationStrategyTally(t *testing.T) {\n\tdao := gnome.MustNew(\"main\", \"Main\", gnome.WithMembers(\n\t\tnewTestMember(t, \"member1\"),\n\t\tnewTestMember(t, \"member2\"),\n\t\tnewTestMember(t, \"member3\"),\n\t))\n\tcases := []struct {\n\t\tname string\n\t\tvotes []gnome.Vote\n\t\tchoice gnome.VoteChoice\n\t}{\n\t\t{\n\t\t\tname: \"quorum vote yes\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t},\n\t\t{\n\t\t\tname: \"quorum vote no\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNo,\n\t\t},\n\t\t{\n\t\t\tname: \"quorum with different choices\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNo,\n\t\t},\n\t\t{\n\t\t\tname: \"no quorum\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNone,\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\trecord := gnome.NewVotingRecord()\n\t\t\tfor _, v := range tc.votes {\n\t\t\t\trecord.Add(v)\n\t\t\t}\n\n\t\t\ts := newSubDAOCreationStrategy(daoIndex{}, \"name\", \"Name\", \"Manifest\", []gnome.Member{\n\t\t\t\tnewTestMember(t, \"member1\"),\n\t\t\t\tnewTestMember(t, \"member2\"),\n\t\t\t\tnewTestMember(t, \"member3\"),\n\t\t\t})\n\n\t\t\t// Act\n\t\t\tchoice := s.Tally(dao, *record)\n\n\t\t\t// Assert\n\t\t\tif choice != tc.choice {\n\t\t\t\tt.Fatalf(\"expected tally result choice: '%v', got: '%v'\", tc.choice, choice)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestSubDAOCreationStrategyValidate(t *testing.T) {\n\tcases := []struct {\n\t\tname, daoName string\n\t\tsetup func(*daoIndex) *gnome.DAO\n\t\terr string\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\tdaoName: \"child\",\n\t\t\tsetup: func(*daoIndex) *gnome.DAO {\n\t\t\t\treturn gnome.MustNew(\"parent\", \"Parent\")\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"existing name\",\n\t\t\tdaoName: \"child\",\n\t\t\tsetup: func(x *daoIndex) *gnome.DAO {\n\t\t\t\tchild := gnome.MustNew(\"child\", \"Child\")\n\t\t\t\tdao := gnome.MustNew(\"parent\", \"Parent\", gnome.WithSubDAO(child))\n\t\t\t\tx.IndexByPath(child)\n\t\t\t\treturn dao\n\t\t\t},\n\t\t\terr: \"sub DAO path has been taken by another DAO\",\n\t\t},\n\t\t{\n\t\t\tname: \"locked parent\",\n\t\t\tdaoName: \"child\",\n\t\t\tsetup: func(*daoIndex) *gnome.DAO {\n\t\t\t\tdao := gnome.MustNew(\"parent\", \"Parent\")\n\t\t\t\tdao.Lock(\"\")\n\t\t\t\treturn dao\n\t\t\t},\n\t\t\terr: \"parent DAO 'parent' is locked\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tx := daoIndex{}\n\t\t\tdao := tc.setup(\u0026x)\n\t\t\tmembers := []gnome.Member{\n\t\t\t\tnewTestMember(t, \"member1\"),\n\t\t\t\tnewTestMember(t, \"member2\"),\n\t\t\t\tnewTestMember(t, \"member3\"),\n\t\t\t}\n\t\t\ts := newSubDAOCreationStrategy(x, tc.daoName, \"Title\", \"Manifest\", members)\n\t\t\tp, _ := gnome.NewProposal(1, s, members[0].Address, dao, \"Title\")\n\n\t\t\t// Act\n\t\t\terr := s.Validate(p)\n\n\t\t\t// Assert\n\t\t\tif tc.err != \"\" {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t} else {\n\t\t\t\tassertNoError(t, err)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestSubDAOCreationStrategyExecute(t *testing.T) {\n\t// Arrange\n\tdao := gnome.MustNew(\"name\", \"Name\")\n\tsubName := \"sub\"\n\ttitle := \"Sub DAO\"\n\tmanifest := \"Test manifest\"\n\n\ts := newSubDAOCreationStrategy(daoIndex{}, subName, title, manifest, []gnome.Member{\n\t\tnewTestMember(t, \"member1\"),\n\t\tnewTestMember(t, \"member2\"),\n\t\tnewTestMember(t, \"member3\"),\n\t})\n\tmembers := fmt.Sprintf(\"%v\", s.members)\n\n\t// Act\n\terr := s.Execute(dao)\n\n\t// Assert\n\tassertNoError(t, err)\n\n\tsubDAOs := dao.SubDAOs()\n\tif c := len(subDAOs); c != 1 {\n\t\tt.Fatalf(\"expected one sub DAO, got: %d\", c)\n\t}\n\n\tsubDAO := subDAOs[0]\n\tif got := subDAO.Name(); got != subName {\n\t\tt.Fatalf(\"expected sub DAO name: '%s', got: '%s'\", subName, got)\n\t}\n\n\tif got := subDAO.Title(); got != title {\n\t\tt.Fatalf(\"expected sub DAO title: '%s', got: '%s'\", title, got)\n\t}\n\n\tif got := subDAO.Manifest(); got != manifest {\n\t\tt.Fatalf(\"expected sub DAO manifest: '%s', got: '%d'\", manifest, got)\n\t}\n\n\tif got := fmt.Sprintf(\"%v\", subDAO.Members()); got != members {\n\t\tt.Fatalf(\"expected sub DAO members: '%s', got: '%s'\", members, got)\n\t}\n}\n\nfunc TestModifyDAOMembersStrategy(t *testing.T) {\n\tcases := []struct {\n\t\tname string\n\t\tnewMembers, removeMembers []gnome.Member\n\t\terr string\n\t}{\n\t\t{\n\t\t\tname: \"new and remove members\",\n\t\t\tnewMembers: []gnome.Member{\n\t\t\t\tnewTestMember(t, \"address1\"),\n\t\t\t},\n\t\t\tremoveMembers: []gnome.Member{\n\t\t\t\tnewTestMember(t, \"address2\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"new members only\",\n\t\t\tnewMembers: []gnome.Member{\n\t\t\t\tnewTestMember(t, \"address1\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"remove members only\",\n\t\t\tremoveMembers: []gnome.Member{\n\t\t\t\tnewTestMember(t, \"address1\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"no members\",\n\t\t\terr: \"members are required\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tname := StrategyNameDAOMembersModification\n\t\t\tquorum := 0.51\n\t\t\tvotingPeriod := time.Hour * 24 * 7\n\t\t\tchoices := fmt.Sprintf(\"%v\", []gnome.VoteChoice{\n\t\t\t\tgnome.ChoiceYes,\n\t\t\t\tgnome.ChoiceNo,\n\t\t\t})\n\n\t\t\t// Act\n\t\t\tvar s daoMembersModificationStrategy\n\t\t\terr := handlePanic(t, func() {\n\t\t\t\ts = newDAOMembersModificationStrategy(tc.newMembers, tc.removeMembers)\n\t\t\t})\n\n\t\t\t// Assert\n\t\t\tif tc.err != \"\" {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tassertNoError(t, err)\n\n\t\t\tif got := s.Name(); got != name {\n\t\t\t\tt.Fatalf(\"expected strategy name: '%s', got: '%s'\", name, got)\n\t\t\t}\n\n\t\t\tif got := s.Quorum(); got != quorum {\n\t\t\t\tt.Fatalf(\"expected strategy quorum: %.2f, got: %.2f\", quorum, got)\n\t\t\t}\n\n\t\t\tif got := s.VotingPeriod(); got != votingPeriod {\n\t\t\t\tt.Fatalf(\"expected strategy voting period: %d, got: %d\", votingPeriod, got)\n\t\t\t}\n\n\t\t\tif got := fmt.Sprintf(\"%v\", s.VoteChoices()); got != choices {\n\t\t\t\tt.Fatalf(\"expected strategy vote choices: %s, got: %s\", choices, got)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestModifyDAOMembersStrategyTally(t *testing.T) {\n\tcases := []struct {\n\t\tname string\n\t\tvotes []gnome.Vote\n\t\tchoice gnome.VoteChoice\n\t}{\n\t\t{\n\t\t\tname: \"super majority votes yes\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t},\n\t\t{\n\t\t\tname: \"super majority votes no\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNo,\n\t\t},\n\t\t{\n\t\t\tname: \"no majority\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNone,\n\t\t},\n\t\t{\n\t\t\tname: \"no quorum\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNone,\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\trecord := gnome.NewVotingRecord()\n\t\t\tfor _, v := range tc.votes {\n\t\t\t\trecord.Add(v)\n\t\t\t}\n\n\t\t\ts := newDAOMembersModificationStrategy(\n\t\t\t\t[]gnome.Member{newTestMember(t, \"member5\")},\n\t\t\t\t[]gnome.Member{newTestMember(t, \"member2\")},\n\t\t\t)\n\n\t\t\t// Act\n\t\t\tchoice := s.Tally(nil, *record)\n\n\t\t\t// Assert\n\t\t\tif choice != tc.choice {\n\t\t\t\tt.Fatalf(\"expected tally result choice: '%v', got: '%v'\", tc.choice, choice)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestModifyDAOMembersStrategyValidate(t *testing.T) {\n\tmember5 := newTestMember(t, \"member5\")\n\tmembers := []gnome.Member{\n\t\tnewTestMember(t, \"member1\"),\n\t\tnewTestMember(t, \"member2\"),\n\t\tnewTestMember(t, \"member3\"),\n\t\tnewTestMember(t, \"member4\"),\n\t}\n\n\tcases := []struct {\n\t\tname string\n\t\tnewMembers, removeMembers []gnome.Member\n\t\tsetup func() *gnome.DAO\n\t\terr string\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\tnewMembers: []gnome.Member{member5},\n\t\t\tsetup: func() *gnome.DAO {\n\t\t\t\tdao := gnome.MustNew(\"main\", \"Main\", gnome.WithMembers(members...))\n\t\t\t\tgnome.MustNew(\"council\", \"Council\", gnome.AssignAsSuperCouncil(), gnome.WithSubDAO(dao))\n\t\t\t\treturn dao\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"less than three members\",\n\t\t\tnewMembers: []gnome.Member{member5},\n\t\t\tremoveMembers: members[1:],\n\t\t\tsetup: func() *gnome.DAO {\n\t\t\t\tdao := gnome.MustNew(\"main\", \"Main\", gnome.WithMembers(members...))\n\t\t\t\tgnome.MustNew(\"council\", \"Council\", gnome.AssignAsSuperCouncil(), gnome.WithSubDAO(dao))\n\t\t\t\treturn dao\n\t\t\t},\n\t\t\terr: \"DAO must always have a minimum of 3 members\",\n\t\t},\n\t\t{\n\t\t\tname: \"add existing member\",\n\t\t\tnewMembers: []gnome.Member{members[0]},\n\t\t\tsetup: func() *gnome.DAO {\n\t\t\t\tdao := gnome.MustNew(\"main\", \"Main\", gnome.WithMembers(members...))\n\t\t\t\tgnome.MustNew(\"council\", \"Council\", gnome.AssignAsSuperCouncil(), gnome.WithSubDAO(dao))\n\t\t\t\treturn dao\n\t\t\t},\n\t\t\terr: \"address is already a DAO member: \" + members[0].String(),\n\t\t},\n\t\t{\n\t\t\tname: \"remove unexisting member\",\n\t\t\tremoveMembers: []gnome.Member{member5},\n\t\t\tsetup: func() *gnome.DAO {\n\t\t\t\tdao := gnome.MustNew(\"main\", \"Main\", gnome.WithMembers(members...))\n\t\t\t\tgnome.MustNew(\"council\", \"Council\", gnome.AssignAsSuperCouncil(), gnome.WithSubDAO(dao))\n\t\t\t\treturn dao\n\t\t\t},\n\t\t\terr: \"address is not a DAO member: \" + member5.String(),\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tdao := tc.setup()\n\t\t\ts := newDAOMembersModificationStrategy(tc.newMembers, tc.removeMembers)\n\t\t\tp, _ := gnome.NewProposal(1, s, members[0].Address, dao, \"Title\")\n\n\t\t\t// Act\n\t\t\terr := s.Validate(p)\n\n\t\t\t// Assert\n\t\t\tif tc.err != \"\" {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t} else {\n\t\t\t\tassertNoError(t, err)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestModifyDAOMembersStrategyExecute(t *testing.T) {\n\t// Arrange\n\tdao := gnome.MustNew(\"main\", \"Main\", gnome.WithMembers(\n\t\tnewTestMember(t, \"member1\"),\n\t\tnewTestMember(t, \"member2\"),\n\t\tnewTestMember(t, \"member3\"),\n\t\tnewTestMember(t, \"member4\"),\n\t))\n\tnewMembers := []gnome.Member{\n\t\tnewTestMember(t, \"member5\"),\n\t\tnewTestMember(t, \"member6\"),\n\t}\n\tremoveMembers := dao.Members()[1:3]\n\ts := newDAOMembersModificationStrategy(newMembers, removeMembers)\n\n\t// Act\n\terr := s.Execute(dao)\n\n\t// Assert\n\tassertNoError(t, err)\n\n\tif c := len(dao.Members()); c != 4 {\n\t\tt.Fatalf(\"expected DAO to have 4 members, got: %d\", c)\n\t}\n\n\tfor _, m := range newMembers {\n\t\tif !dao.HasMember(m.Address) {\n\t\t\tt.Fatalf(\"expected member %s to be added to the DAO\", m.Address)\n\t\t}\n\t}\n\n\tfor _, m := range removeMembers {\n\t\tif dao.HasMember(m.Address) {\n\t\t\tt.Fatalf(\"expected member %s to be removed from the DAO\", m.Address)\n\t\t}\n\t}\n}\n\nfunc TestSubDAODismissalStrategy(t *testing.T) {\n\tcases := []struct {\n\t\tname string\n\t\tdao *gnome.DAO\n\t\terr string\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\tdao: gnome.MustNew(\"dao\", \"DAO\"),\n\t\t},\n\t\t{\n\t\t\tname: \"no DAO\",\n\t\t\terr: \"DAO is required\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tname := StrategyNameSubDAODismissal\n\t\t\tquorum := 0.51\n\t\t\tvotingPeriod := time.Hour * 24 * 7\n\t\t\tchoices := fmt.Sprintf(\"%v\", []gnome.VoteChoice{\n\t\t\t\tgnome.ChoiceYes,\n\t\t\t\tgnome.ChoiceNo,\n\t\t\t})\n\n\t\t\t// Act\n\t\t\tvar s subDAODismissalStrategy\n\t\t\terr := handlePanic(t, func() {\n\t\t\t\ts = newSubDAODismissalStrategy(tc.dao, proposalIndex{})\n\t\t\t})\n\n\t\t\t// Assert\n\t\t\tif tc.err != \"\" {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tassertNoError(t, err)\n\n\t\t\tif got := s.Name(); got != name {\n\t\t\t\tt.Fatalf(\"expected strategy name: '%s', got: '%s'\", name, got)\n\t\t\t}\n\n\t\t\tif got := s.Quorum(); got != quorum {\n\t\t\t\tt.Fatalf(\"expected strategy quorum: %.2f, got: %.2f\", quorum, got)\n\t\t\t}\n\n\t\t\tif got := s.VotingPeriod(); got != votingPeriod {\n\t\t\t\tt.Fatalf(\"expected strategy voting period: %d, got: %d\", votingPeriod, got)\n\t\t\t}\n\n\t\t\tif got := fmt.Sprintf(\"%v\", s.VoteChoices()); got != choices {\n\t\t\t\tt.Fatalf(\"expected strategy vote choices: %s, got: %s\", choices, got)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestSubDAODismissalStrategyTally(t *testing.T) {\n\tcases := []struct {\n\t\tname string\n\t\tvotes []gnome.Vote\n\t\tchoice gnome.VoteChoice\n\t}{\n\t\t{\n\t\t\tname: \"yes with one vote\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t},\n\t\t{\n\t\t\tname: \"no with one vote\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNo,\n\t\t},\n\t\t{\n\t\t\tname: \"yes with multiple votes\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t},\n\t\t{\n\t\t\tname: \"no with multiple votes\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNo,\n\t\t},\n\t\t{\n\t\t\tname: \"tie\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNone,\n\t\t},\n\t\t{\n\t\t\tname: \"tie with multiple votes\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNone,\n\t\t},\n\t\t{\n\t\t\tname: \"no votes\",\n\t\t\tchoice: gnome.ChoiceNone,\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tsubDAO := gnome.MustNew(\"sub\", \"Sub DAO\")\n\t\t\trecord := gnome.NewVotingRecord()\n\t\t\tfor _, v := range tc.votes {\n\t\t\t\trecord.Add(v)\n\t\t\t}\n\n\t\t\ts := newSubDAODismissalStrategy(subDAO, proposalIndex{})\n\n\t\t\t// Act\n\t\t\tchoice := s.Tally(nil, *record)\n\n\t\t\t// Assert\n\t\t\tif choice != tc.choice {\n\t\t\t\tt.Fatalf(\"expected tally result choice: '%v', got: '%v'\", tc.choice, choice)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestSubDAODismissalStrategyValidate(t *testing.T) {\n\tparentDAO := gnome.MustNew(\"parent\", \"Parent\")\n\tcases := []struct {\n\t\tname string\n\t\tsetup func(parent *gnome.DAO) (child *gnome.DAO)\n\t\terr string\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\tsetup: func(dao *gnome.DAO) *gnome.DAO {\n\t\t\t\tchild := gnome.MustNew(\"child\", \"Child\")\n\t\t\t\tdao.AddSubDAO(child)\n\t\t\t\treturn child\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"dismiss non child DAO\",\n\t\t\tsetup: func(*gnome.DAO) *gnome.DAO {\n\t\t\t\tchild := gnome.MustNew(\"child\", \"Child\")\n\t\t\t\tgnome.MustNew(\"foo\", \"Foo\", gnome.WithSubDAO(child))\n\t\t\t\treturn child\n\t\t\t},\n\t\t\terr: `the DAO to dismiss must be a first level sub DAO of \"` + parentDAO.Name() + `\"`,\n\t\t},\n\t\t{\n\t\t\tname: \"parent DAO not found\",\n\t\t\tsetup: func(*gnome.DAO) *gnome.DAO {\n\t\t\t\treturn gnome.MustNew(\"child\", \"Child\")\n\t\t\t},\n\t\t\terr: \"the DAO to dismiss has no parent DAO\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tchildDAO := tc.setup(parentDAO)\n\t\t\ts := newSubDAODismissalStrategy(childDAO, proposalIndex{})\n\t\t\tp, _ := gnome.NewProposal(1, s, testutils.TestAddress(\"member\"), parentDAO, \"Dismiss child DAO\")\n\n\t\t\t// Act\n\t\t\terr := s.Validate(p)\n\n\t\t\t// Assert\n\t\t\tif tc.err != \"\" {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t} else {\n\t\t\t\tassertNoError(t, err)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestSubDAODismissalStrategyExecute(t *testing.T) {\n\t// Arrange\n\tvar (\n\t\tstrategy testStrategy\n\t\tproposals proposalIndex\n\t)\n\n\tcaller := testutils.TestAddress(\"caller\")\n\n\tthreeDAO := gnome.MustNew(\"three\", \"Three\")\n\ttwoDAO := gnome.MustNew(\"two\", \"Two\")\n\toneDAO := gnome.MustNew(\"one\", \"One\", gnome.WithSubDAO(twoDAO), gnome.WithSubDAO(threeDAO))\n\trootDAO := gnome.MustNew(\"root\", \"Root\", gnome.WithSubDAO(oneDAO))\n\n\tp, _ := gnome.NewProposal(1, strategy, caller, rootDAO, \"Root\")\n\tproposals.Index(p)\n\n\tp, _ = gnome.NewProposal(2, strategy, caller, oneDAO, \"One\")\n\tproposals.Index(p)\n\n\tp, _ = gnome.NewProposal(3, strategy, caller, twoDAO, \"Two\")\n\tproposals.Index(p)\n\n\tp, _ = gnome.NewProposal(4, strategy, caller, threeDAO, \"Thee\")\n\tproposals.Index(p)\n\n\tdismissReason := \"Dismissed because of DAO dismissal: \" + rootDAO.Name()\n\tdaos := []*gnome.DAO{rootDAO, oneDAO, twoDAO, threeDAO}\n\ts := newSubDAODismissalStrategy(rootDAO, proposals)\n\n\t// Act\n\terr := s.Execute(nil)\n\n\t// Assert\n\tassertNoError(t, err)\n\n\tfor _, dao := range daos {\n\t\tif !dao.IsLocked() {\n\t\t\tt.Fatalf(\"expected DAO '%s' to be locked\", dao.Title())\n\t\t}\n\t}\n\n\tproposals.Iterate(func(p *gnome.Proposal) bool {\n\t\tif got := p.Status(); got != gnome.StatusDismissed {\n\t\t\tt.Fatalf(\"expected proposal '%s' status to be 'dismissed', got: '%s'\", p.Title(), got.String())\n\t\t}\n\n\t\tif got := p.StatusReason(); got != dismissReason {\n\t\t\tt.Fatalf(\"expected dismiss reason '%s', got: '%s'\", dismissReason, got)\n\t\t}\n\t\treturn false\n\t})\n}\n\ntype testStrategy struct{}\n\nfunc (testStrategy) Name() string { return \"test\" }\nfunc (testStrategy) Quorum() float64 { return 0.51 }\nfunc (testStrategy) VotingPeriod() time.Duration { return time.Hour * 24 * 2 }\nfunc (testStrategy) VoteChoices() []gnome.VoteChoice { return []gnome.VoteChoice{gnome.ChoiceYes} }\nfunc (s testStrategy) Tally(*gnome.DAO, gnome.VotingRecord) gnome.VoteChoice { return gnome.ChoiceYes }\n\nfunc newTestMember(t *testing.T, name string) gnome.Member {\n\tt.Helper()\n\treturn gnome.NewMember(testutils.TestAddress(name))\n}\n"},{"name":"strategy_general.gno","body":"package gnome\n\nimport (\n\t\"errors\"\n\t\"std\"\n\t\"strings\"\n\t\"time\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\n// newGeneralStrategy creates a new general proposal strategy.\n// This type of proposal is not executable so it doesn't modify the DAO state when proposal passes.\nfunc newGeneralStrategy() generalStrategy {\n\treturn generalStrategy{\n\t\tchoices: []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo},\n\t}\n}\n\ntype generalStrategy struct {\n\tchoices []gnome.VoteChoice\n}\n\n// Name returns the name of the strategy.\nfunc (generalStrategy) Name() string {\n\treturn StrategyNameGeneral\n}\n\n// Quorum returns the minimum required percentage of DAO member votes\n// required for a proposal to pass.\nfunc (generalStrategy) Quorum() float64 {\n\treturn 0.51\n}\n\n// VotingPeriod returns the period that a proposal should allow voting.\nfunc (generalStrategy) VotingPeriod() time.Duration {\n\tperiod, _ := parameters.VotingPeriods.Get(StrategyNameGeneral)\n\treturn period\n}\n\n// VoteChoices returns the valid voting choices for the strategy.\nfunc (s generalStrategy) VoteChoices() []gnome.VoteChoice {\n\treturn s.choices\n}\n\n// CheckVote checks that a vote is valid for the strategy.\nfunc (s generalStrategy) CheckVote(_ std.Address, choice gnome.VoteChoice, reason string) error {\n\t// Reason is required when voting NO on standard proposals\n\tif choice == gnome.ChoiceNo \u0026\u0026 reason == \"\" {\n\t\treturn errors.New(\"reason is required when voting NO in standard proposals\")\n\t}\n\treturn nil\n}\n\n// Tally counts the votes and returns the winner voting choice.\nfunc (generalStrategy) Tally(dao *gnome.DAO, r gnome.VotingRecord) gnome.VoteChoice {\n\t// Consider abstentions to make the majority absolute\n\tabstentions := len(dao.Members()) - r.VoteCount()\n\tif choice, ok := gnome.SelectChoiceByMajority(r, abstentions); ok {\n\t\treturn choice\n\t}\n\treturn gnome.ChoiceNone\n}\n\n// Validate validates if a proposal is valid for the current DAO state.\nfunc (generalStrategy) Validate(p *gnome.Proposal) error {\n\tif strings.TrimSpace(p.Description()) == \"\" {\n\t\treturn errors.New(\"proposal description is required\")\n\t}\n\treturn nil\n}\n"},{"name":"strategy_general_test.gno","body":"package gnome\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\t\"time\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\nfunc TestGeneralStrategy(t *testing.T) {\n\t// Arrange\n\tname := StrategyNameGeneral\n\tquorum := 0.51\n\tvotingPeriod := time.Hour * 24 * 2\n\tchoices := fmt.Sprintf(\"%v\", []gnome.VoteChoice{\n\t\tgnome.ChoiceYes,\n\t\tgnome.ChoiceNo,\n\t})\n\n\t// Act\n\ts := newGeneralStrategy()\n\n\t// Assert\n\tif got := s.Name(); got != name {\n\t\tt.Fatalf(\"expected strategy name: '%s', got: '%s'\", name, got)\n\t}\n\n\tif got := s.Quorum(); got != quorum {\n\t\tt.Fatalf(\"expected strategy quorum: %.2f, got: %.2f\", quorum, got)\n\t}\n\n\tif got := s.VotingPeriod(); got != votingPeriod {\n\t\tt.Fatalf(\"expected strategy voting period: %d, got: %d\", votingPeriod, got)\n\t}\n\n\tif got := fmt.Sprintf(\"%v\", s.VoteChoices()); got != choices {\n\t\tt.Fatalf(\"expected strategy vote choices: %s, got: %s\", choices, got)\n\t}\n}\n\nfunc TestGeneralStrategyCheckVote(t *testing.T) {\n\tcases := []struct {\n\t\tname string\n\t\tchoice gnome.VoteChoice\n\t\treason, err string\n\t}{\n\t\t{\n\t\t\tname: \"yes\",\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t},\n\t\t{\n\t\t\tname: \"yes with reason\",\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t\treason: \"foo bar\",\n\t\t},\n\t\t{\n\t\t\tname: \"no with reason\",\n\t\t\tchoice: gnome.ChoiceNo,\n\t\t\treason: \"foo bar\",\n\t\t},\n\t\t{\n\t\t\tname: \"no with invalid reason\",\n\t\t\tchoice: gnome.ChoiceNo,\n\t\t\terr: \"reason is required when voting NO in standard proposals\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\ts := newGeneralStrategy()\n\n\t\t\t// Act\n\t\t\terr := s.CheckVote(\"\", tc.choice, tc.reason)\n\n\t\t\t// Assert\n\t\t\tif tc.err != \"\" {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t} else {\n\t\t\t\tassertNoError(t, err)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestGeneralStrategyTally(t *testing.T) {\n\tdao := gnome.MustNew(\"test\", \"Test\", gnome.WithMembers(\n\t\tnewTestMember(t, \"member1\"),\n\t\tnewTestMember(t, \"member2\"),\n\t\tnewTestMember(t, \"member3\"),\n\t\tnewTestMember(t, \"member4\"),\n\t))\n\tcases := []struct {\n\t\tname string\n\t\tvotes []gnome.Vote\n\t\tchoice gnome.VoteChoice\n\t}{\n\t\t{\n\t\t\tname: \"majority\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t},\n\t\t{\n\t\t\tname: \"majority with abstentions\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNo,\n\t\t},\n\t\t{\n\t\t\tname: \"no quorum\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNone,\n\t\t},\n\t\t{\n\t\t\tname: \"no quorum with abstentions\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNone,\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\trecord := gnome.NewVotingRecord()\n\t\t\tfor _, v := range tc.votes {\n\t\t\t\trecord.Add(v)\n\t\t\t}\n\n\t\t\ts := newGeneralStrategy()\n\n\t\t\t// Act\n\t\t\tchoice := s.Tally(dao, *record)\n\n\t\t\t// Assert\n\t\t\tif choice != tc.choice {\n\t\t\t\tt.Fatalf(\"expected tally result choice: '%v', got: '%v'\", tc.choice, choice)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc assertError(t *testing.T, expected interface{}, actual error) {\n\tt.Helper()\n\n\twant, ok := expected.(string)\n\tif !ok {\n\t\tif err, ok := expected.(error); ok {\n\t\t\twant = err.Error()\n\t\t}\n\t}\n\n\tif actual == nil {\n\t\tt.Fatalf(\"expected error: '%s', got no error\", want)\n\t}\n\n\tif want != actual.Error() {\n\t\tt.Fatalf(\"expected error: '%s', got: '%s'\", want, actual.Error())\n\t}\n}\n\nfunc assertNoError(t *testing.T, err interface{}) {\n\tt.Helper()\n\n\tif err == nil {\n\t\treturn\n\t}\n\n\tactual, ok := err.(string)\n\tif !ok {\n\t\tif e, ok := err.(error); ok {\n\t\t\tactual = e.Error()\n\t\t}\n\t}\n\n\tif actual != \"\" {\n\t\tt.Fatalf(\"expected no error, got: '%s'\", actual)\n\t}\n}\n"},{"name":"strategy_lock.gno","body":"package gnome\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"time\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\n// newLockingStrategy creates a new DAO locking proposal strategy.\nfunc newLockingStrategy(council *gnome.DAO, reason string, preLockFn func() error) lockingStrategy {\n\t// Locking should only be done in the council DAO\n\tif !council.IsSuperCouncil() {\n\t\tpanic(\"DAO is not the council\")\n\t}\n\n\treturn lockingStrategy{\n\t\tchoices: []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo},\n\t\tcouncil: council,\n\t\treason: reason,\n\t\tpreLockFn: preLockFn,\n\t}\n}\n\ntype lockingStrategy struct {\n\tchoices []gnome.VoteChoice\n\tcouncil *gnome.DAO\n\treason string\n\tpreLockFn func() error\n}\n\n// Name returns the name of the strategy.\nfunc (lockingStrategy) Name() string {\n\treturn StrategyNameLocking\n}\n\n// Quorum returns the minimum required percentage of DAO member votes\n// required for a proposal to pass.\nfunc (lockingStrategy) Quorum() float64 {\n\treturn 0.33\n}\n\n// VotingPeriod returns the period that a proposal should allow voting.\nfunc (lockingStrategy) VotingPeriod() time.Duration {\n\tperiod, _ := parameters.VotingPeriods.Get(StrategyNameLocking)\n\treturn period\n}\n\n// VoteChoices returns the valid voting choices for the strategy.\nfunc (s lockingStrategy) VoteChoices() []gnome.VoteChoice {\n\treturn s.choices\n}\n\n// Tally counts the votes and returns the winner voting choice.\nfunc (lockingStrategy) Tally(_ *gnome.DAO, r gnome.VotingRecord) gnome.VoteChoice {\n\tif choice, ok := gnome.SelectChoiceByPlurality(r); ok {\n\t\treturn choice\n\t}\n\treturn gnome.ChoiceNone\n}\n\n// Validate validates if a proposal is valid for the current state.\nfunc (s lockingStrategy) Validate(*gnome.Proposal) error {\n\tif s.council.IsLocked() {\n\t\treturn errors.New(\"council DAO is already locked\")\n\t}\n\treturn nil\n}\n\n// Execute locks the council DAO.\nfunc (s lockingStrategy) Execute(*gnome.DAO) (err error) {\n\tif s.preLockFn != nil {\n\t\tif err := s.preLockFn(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\ts.council.Lock(s.reason)\n\treturn nil\n}\n\n// RenderParams returns a markdown with the rendered strategy parameters.\nfunc (s lockingStrategy) RenderParams() string {\n\tvar b strings.Builder\n\n\tb.WriteString(\"|||\\n|---|---|\\n\")\n\tb.WriteString(\"| Reason: | \" + gnome.EscapeHTML(s.reason) + \" |\\n\")\n\n\treturn b.String()\n}\n"},{"name":"strategy_lock_test.gno","body":"package gnome\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"testing\"\n\t\"time\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\nfunc TestLockingStrategy(t *testing.T) {\n\tcases := []struct {\n\t\tname, err string\n\t\tsetup func() *gnome.DAO\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\tsetup: func() *gnome.DAO {\n\t\t\t\treturn gnome.MustNew(\"council\", \"Council\", gnome.AssignAsSuperCouncil())\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"dao is not council\",\n\t\t\tsetup: func() *gnome.DAO {\n\t\t\t\treturn gnome.MustNew(\"council\", \"Council\")\n\t\t\t},\n\t\t\terr: \"DAO is not the council\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tname := StrategyNameLocking\n\t\t\tquorum := 0.33\n\t\t\tvotingPeriod := time.Hour * 24 * 2\n\t\t\tchoices := fmt.Sprintf(\"%v\", []gnome.VoteChoice{\n\t\t\t\tgnome.ChoiceYes,\n\t\t\t\tgnome.ChoiceNo,\n\t\t\t})\n\t\t\tcouncilDAO := tc.setup()\n\n\t\t\t// Act\n\t\t\tvar s lockingStrategy\n\t\t\terr := handlePanic(t, func() {\n\t\t\t\ts = newLockingStrategy(councilDAO, \"\", nil)\n\t\t\t})\n\n\t\t\t// Assert\n\t\t\tif tc.err != \"\" {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tassertNoError(t, err)\n\n\t\t\tif got := s.Name(); got != name {\n\t\t\t\tt.Fatalf(\"expected strategy name: '%s', got: '%s'\", name, got)\n\t\t\t}\n\n\t\t\tif got := s.Quorum(); got != quorum {\n\t\t\t\tt.Fatalf(\"expected strategy quorum: %.2f, got: %.2f\", quorum, got)\n\t\t\t}\n\n\t\t\tif got := s.VotingPeriod(); got != votingPeriod {\n\t\t\t\tt.Fatalf(\"expected strategy voting period: %d, got: %d\", votingPeriod, got)\n\t\t\t}\n\n\t\t\tif got := fmt.Sprintf(\"%v\", s.VoteChoices()); got != choices {\n\t\t\t\tt.Fatalf(\"expected strategy vote choices: %s, got: %s\", choices, got)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestLockingStrategyTally(t *testing.T) {\n\tcouncilDAO := gnome.MustNew(\"council\", \"Council\", gnome.AssignAsSuperCouncil())\n\tcases := []struct {\n\t\tname string\n\t\tvotes []gnome.Vote\n\t\tchoice gnome.VoteChoice\n\t}{\n\t\t{\n\t\t\tname: \"yes with one vote\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t},\n\t\t{\n\t\t\tname: \"no with one vote\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNo,\n\t\t},\n\t\t{\n\t\t\tname: \"yes with multiple votes\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t},\n\t\t{\n\t\t\tname: \"no with multiple votes\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNo,\n\t\t},\n\t\t{\n\t\t\tname: \"tie\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNone,\n\t\t},\n\t\t{\n\t\t\tname: \"tie with multiple votes\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNone,\n\t\t},\n\t\t{\n\t\t\tname: \"no votes\",\n\t\t\tchoice: gnome.ChoiceNone,\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\trecord := gnome.NewVotingRecord()\n\t\t\tfor _, v := range tc.votes {\n\t\t\t\trecord.Add(v)\n\t\t\t}\n\n\t\t\ts := newLockingStrategy(councilDAO, \"\", nil)\n\n\t\t\t// Act\n\t\t\tchoice := s.Tally(nil, *record)\n\n\t\t\t// Assert\n\t\t\tif choice != tc.choice {\n\t\t\t\tt.Fatalf(\"expected tally result choice: '%v', got: '%v'\", tc.choice, choice)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestLockingStrategyValidate(t *testing.T) {\n\tcases := []struct {\n\t\tname string\n\t\tsetup func(*gnome.DAO)\n\t\terr string\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t},\n\t\t{\n\t\t\tname: \"locked council DAO\",\n\t\t\tsetup: func(councilDAO *gnome.DAO) {\n\t\t\t\tcouncilDAO.Lock(\"\")\n\t\t\t},\n\t\t\terr: \"council DAO is already locked\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tcouncilDAO := gnome.MustNew(\"council\", \"Council\", gnome.AssignAsSuperCouncil())\n\t\t\tif tc.setup != nil {\n\t\t\t\ttc.setup(councilDAO)\n\t\t\t}\n\n\t\t\ts := newLockingStrategy(councilDAO, \"\", nil)\n\n\t\t\t// Act\n\t\t\terr := s.Validate(nil)\n\n\t\t\t// Assert\n\t\t\tif tc.err != \"\" {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t} else {\n\t\t\t\tassertNoError(t, err)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestLockingStrategyExecute(t *testing.T) {\n\tcases := []struct {\n\t\tname, reason, err string\n\t\tsetup func(*gnome.DAO)\n\t\tpreLockErr error\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\treason: \"Lock reason\",\n\t\t},\n\t\t{\n\t\t\tname: \"pre lock function error\",\n\t\t\tpreLockErr: errors.New(\"test error\"),\n\t\t\terr: \"test error\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tcouncilDAO := gnome.MustNew(\"council\", \"Council\", gnome.AssignAsSuperCouncil())\n\t\t\tif tc.setup != nil {\n\t\t\t\ttc.setup(councilDAO)\n\t\t\t}\n\n\t\t\tvar (\n\t\t\t\tpreLockFnCalled bool\n\n\t\t\t\ts = newLockingStrategy(councilDAO, tc.reason, func() error {\n\t\t\t\t\tpreLockFnCalled = true\n\t\t\t\t\treturn tc.preLockErr\n\t\t\t\t})\n\t\t\t)\n\n\t\t\t// Act\n\t\t\terr := s.Execute(nil)\n\n\t\t\t// Assert\n\t\t\tif tc.err != \"\" {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tassertNoError(t, err)\n\n\t\t\tif !preLockFnCalled {\n\t\t\t\tt.Fatal(\"expected pre-lock function to be called\")\n\t\t\t}\n\n\t\t\tif !councilDAO.IsLocked() {\n\t\t\t\tt.Fatal(\"expected DAO to be locked\")\n\t\t\t}\n\n\t\t\tif got := councilDAO.LockReason(); got != tc.reason {\n\t\t\t\tt.Fatalf(\"expected lock reason: '%s', got: '%s'\", tc.reason, got)\n\t\t\t}\n\t\t})\n\t}\n}\n"},{"name":"strategy_params.gno","body":"package gnome\n\nimport (\n\t\"strings\"\n\t\"time\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\ntype paramsUpdateStrategy struct {\n\tvotingPeriods gnome.DurationParams\n\treviewDeadline time.Duration\n}\n\nfunc (paramsUpdateStrategy) Name() string {\n\treturn StrategyNameParamsUpdate\n}\n\nfunc (paramsUpdateStrategy) Quorum() float64 {\n\treturn 0.51\n}\n\nfunc (paramsUpdateStrategy) VotingPeriod() time.Duration {\n\tperiod, _ := parameters.VotingPeriods.Get(StrategyNameParamsUpdate)\n\treturn period\n}\n\nfunc (paramsUpdateStrategy) VoteChoices() []gnome.VoteChoice {\n\treturn []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo}\n}\n\nfunc (paramsUpdateStrategy) Tally(dao *gnome.DAO, r gnome.VotingRecord) gnome.VoteChoice {\n\tabstentions := len(dao.Members()) - r.VoteCount()\n\tif choice, ok := gnome.SelectChoiceByMajority(r, abstentions); ok {\n\t\treturn choice\n\t}\n\treturn gnome.ChoiceNone\n}\n\nfunc (s paramsUpdateStrategy) Execute(*gnome.DAO) error {\n\tif s.reviewDeadline \u003e 0 {\n\t\tparameters.ReviewDeadline = s.reviewDeadline\n\t}\n\n\ts.votingPeriods.Iterate(func(name string, period time.Duration) bool {\n\t\tparameters.VotingPeriods.Set(name, period)\n\t\treturn false\n\t})\n\treturn nil\n}\n\nfunc (s paramsUpdateStrategy) RenderParams() string {\n\tvar b strings.Builder\n\n\tb.WriteString(\"|||\\n|---|---|\\n\")\n\tif s.reviewDeadline \u003e 0 {\n\t\tb.WriteString(\"| Proposal Review Deadline: | \" + gnome.HumanizeDuration(s.reviewDeadline) + \" |\\n\")\n\t}\n\n\ts.votingPeriods.Iterate(func(name string, period time.Duration) bool {\n\t\tb.WriteString(\"| Voting Period for `\" + name + \"`: | \" + gnome.HumanizeDuration(period) + \" |\\n\")\n\t\treturn false\n\t})\n\n\treturn b.String()\n}\n"},{"name":"uri.gno","body":"package gnome\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/ufmt\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\nfunc makeRealmURL(renderPath string) string {\n\tvar sub string\n\tif id := std.GetChainID(); strings.HasPrefix(id, \"test\") {\n\t\t// Sub domain prefix for testnets\n\t\tsub = id + \".\"\n\t}\n\n\turl := \"https://\" + sub + std.CurrentRealm().PkgPath()\n\tif renderPath != \"\" {\n\t\turl += \":\" + renderPath\n\t}\n\treturn url\n}\n\nfunc makeRealmPath(renderPath string) string {\n\tpath := gnome.CutRealmDomain(std.CurrentRealm().PkgPath())\n\tif renderPath != \"\" {\n\t\tpath += \":\" + renderPath\n\t}\n\treturn path\n}\n\nfunc makeGnoStudioConnectURL(functionName string) string {\n\treturn ufmt.Sprintf(\n\t\t\"https://gno.studio/connect/view/%s?network=%s\u0026tab=functions#%s\",\n\t\tstd.CurrentRealm().PkgPath(),\n\t\tstd.GetChainID(),\n\t\tfunctionName,\n\t)\n}\n\nfunc makeDAOURI(daoPath string, isRelative bool) string {\n\trenderPath := \"dao/\" + daoPath\n\tif isRelative {\n\t\treturn makeRealmPath(renderPath)\n\t}\n\treturn makeRealmURL(renderPath)\n}\n\nfunc makeProposalURI(proposalID gnome.ID, isRelative bool) string {\n\trenderPath := \"proposal/\" + proposalID.String()\n\tif isRelative {\n\t\treturn makeRealmPath(renderPath)\n\t}\n\treturn makeRealmURL(renderPath)\n}\n\nfunc makeProposalsURI(daoPath string, isRelative bool) string {\n\trenderPath := \"proposals/\" + daoPath + \":page=1\"\n\tif isRelative {\n\t\treturn makeRealmPath(renderPath)\n\t}\n\treturn makeRealmURL(renderPath)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"26000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"8tvqtRASsOgvaF9LEbtVhcblgBQL0hnBGLhQJf5Y4sJ7ww/o+Qu1fz9Y/VJmd69FI9jMet7DXV5uuRR8m4h3Sg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"tutorials","path":"gno.land/r/gnome/tutorials/pre1","files":[{"name":"LICENSE","body":"Copyright (c) 2024. All rights reserved.\n\nProject Owner:\nNewTendermint, LLC\n\nProject Maintainer:\nİlker Göktuğ ÖZTÜRK. \u003cilker@ilgooz.com\u003e, \u003cilkergoktugozturk@gmail.com\u003e\n\nYour access to this Project and your contributions to this Project are subject\nto the following terms:\n\n* You hereby grant to the listed Owner and Maintainer of this Project the\nworldwide, irrevocable and royalty-free right to use, publish, relicense and\nsublicense your contributions under any non-exclusive license of their\nchoosing for commercial and non-commercial purposes.\n* You shall not attempt to bring any intellectual property infringement or\nmisappropriation claims against the Owner or Maintainer of this Project\nrelating to or arising from your contributions.\n* You represent that you are the sole owner of all rights in your\ncontributions and that no third party has any rights or interests therein.\n\nFOR THE SCOPE OF THIS LICENSE, A CONTRIBUTION IS DEFINED TO INCLUDE ANY WORKS,\nIDEAS, CODE, PROCESSES, OR APIS MADE AVAILABLE TO VIEW BY THE GENERAL PUBLIC\n(INCLUDING ANY PUBLICLY ACCESSIBLE INTERNET FORUMS AND CHAT SERVERS WHERE\nACCESS IS AVAILABLE FOR FREE WITH REGISTRATION) OR PRIVATELY TO THIS PROJECT'S\nOWNER AND MAINTAINERS; INCLUDING WORKS, IDEAS, CODE, PROCESSES, AND APIS THAT\nARE ABOUT THIS PROJECT AND ITS CONTRIBUTIONS, OR MENTIONED IN REFERENCE TO\nTHIS PROJECT, WHERE SUCH WORKS, IDEAS, CODE, PROCESSES, AND APIS ARE MATERIAL\nTO THE SUCCESS, IMPROVEMENT, OR COMPLETION OF THIS PROJECT, AS DETERMINED BY\nTHE OWNER OF THIS PROJECT.\n\nContributions may come in any form, and include (but are not limited to):\n\n* pull requests\n* diff patches\n* commentary\n* example code\n\nIf you do not want your contribution to become incorporated into this Project,\ndo not make contributions to this Project. The creation of contributions that\nmay in the future become known to this Project's Owner and Maintainer\nconstitutes a willing contribution to this Project in accordance with this\nlicense.\n\nTHIS PROJECT AND THE WORKS AVAILABLE THROUGH THIS PROJECT ARE PROVIDED “AS IS”\nAND WITHOUT WARRANTY OF ANY KIND. IN NO EVENT SHALL THE OWNER OR MAINTAINER OF\nTHIS PROJECT BE LIABLE TO YOU OR ANY THIRD PARTY FOR ANY CLAIM, DAMAGES OR\nOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THIS PROJECT OR THE WORKS AVAILABLE THROUGH\nTHIS PROJECT. YOU AGREED TO INDEMNIFY, DEFEND AND HOLD THE OWNER AND\nMAINTAINER FROM AND AGAINST ANY CLAIMS, LOSSES OR DAMAGES ARISING FROM YOUR\nUSE OF THIS PROJECT OR THE WORKS AVAILABLE THROUGH THIS PROJECT.\n\nThis license is subject to change at any time by the Project Owner or\nMaintainer.\n\nYour continued access to or use of this Project or any works\navailable through this Project shall be subject to the then-current version\nof this license.\n\nThe Project Owner and Maintainer reserve the right to change this license\nwithout needing the consent of the contributors to this Project.\n"},{"name":"indexes.gno","body":"package tutorials\n\nimport (\n\t\"time\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/gnome/blog\"\n)\n\nconst keyDateFmt = \"2006-01-02T15:04:05\"\n\nvar (\n\ttags tagIndex\n\ttutorials tutorialIndex\n)\n\ntype tagIndex struct {\n\tindex avl.Tree // string(tag) -\u003e *tutorialIndex\n}\n\nfunc (x *tagIndex) Index(p *blog.Post) (indexed bool) {\n\tif p == nil {\n\t\treturn\n\t}\n\n\tfor _, tag := range p.Tags {\n\t\t// Get the tutorials for the current tag\n\t\tvar (\n\t\t\tidx *tutorialIndex\n\t\t\tv, found = x.index.Get(tag)\n\t\t)\n\n\t\tif found {\n\t\t\tidx = v.(*tutorialIndex)\n\t\t} else {\n\t\t\tidx = \u0026tutorialIndex{}\n\t\t}\n\n\t\t// Index the tutorial\n\t\tidx.Index(p)\n\n\t\t// Keep track of indexing success\n\t\tindexed = x.index.Set(tag, idx) || indexed\n\t}\n\treturn\n}\n\nfunc (x *tagIndex) Remove(p *blog.Post) (removed bool) {\n\tif p == nil {\n\t\treturn\n\t}\n\n\tfor _, tag := range p.Tags {\n\t\tv, found := x.index.Get(tag)\n\t\tif !found {\n\t\t\t// Ignore tags that are not indexed\n\t\t\tcontinue\n\t\t}\n\n\t\tidx := v.(*tutorialIndex)\n\t\tif idx.Remove(p) \u0026\u0026 !removed {\n\t\t\tremoved = true\n\t\t}\n\n\t\tif idx.Size() == 0 {\n\t\t\t// Remove the tag from the index when empty\n\t\t\tx.index.Remove(tag)\n\t\t}\n\t}\n\treturn\n}\n\nfunc (x tagIndex) IterateTags(fn func(tag string) bool) bool {\n\treturn x.index.Iterate(\"\", \"\", func(tag string, _ interface{}) bool {\n\t\treturn fn(tag)\n\t})\n}\n\nfunc (x tagIndex) IteratePosts(tag string, fn func(*blog.Post) bool) bool { // TODO: Support pagination\n\tv, found := x.index.Get(tag)\n\tif !found {\n\t\treturn false\n\t}\n\n\tidx := v.(*tutorialIndex)\n\treturn idx.Iterate(\"\", \"\", func(p *blog.Post) bool {\n\t\treturn fn(p)\n\t})\n}\n\ntype tutorialIndex struct {\n\tindex avl.Tree // string(post creation time + post slug) -\u003e *blog.Post\n}\n\nfunc (x tutorialIndex) Size() int {\n\treturn x.index.Size()\n}\n\nfunc (x *tutorialIndex) Index(p *blog.Post) bool {\n\tk := newTutorialKey(p)\n\treturn x.index.Set(k, p)\n}\n\nfunc (x *tutorialIndex) Remove(p *blog.Post) bool {\n\tk := newTutorialKey(p)\n\t_, removed := x.index.Remove(k)\n\treturn removed\n}\n\nfunc (x tutorialIndex) Iterate(start, end string, fn func(*blog.Post) bool) bool {\n\treturn x.index.Iterate(start, end, func(_ string, v interface{}) bool {\n\t\treturn fn(v.(*blog.Post))\n\t})\n}\n\nfunc newTutorialKey(p *blog.Post) string {\n\tif p != nil {\n\t\treturn p.CreatedAt.UTC().Format(keyDateFmt) + p.Slug\n\t}\n\n\t// By default create a key for the current block time\n\treturn time.Now().UTC().Format(keyDateFmt)\n}\n"},{"name":"params.gno","body":"package tutorials\n\nimport (\n\t\"time\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\n// Day defines the duration of a day.\nconst Day = time.Hour * 24\n\n// Names for the different strategy types.\nconst (\n\tStrategyNameCreation = \"tutorial-creation\"\n\tStrategyNameDeletion = \"tutorial-deletion\"\n\tStrategyNameLocking = \"tutorial-realm-locking\"\n\tStrategyNameModification = \"tutorial-modification\"\n\tStrategyNameParamsUpdate = \"tutorial-params-update\"\n)\n\nvar parameters struct {\n\tVotingPeriods gnome.DurationParams\n}\n\nfunc init() {\n\t// Initial voting periods for each proposal type.\n\t// Periods can be changed by sumitting a params update proposal.\n\tparameters.VotingPeriods.Set(StrategyNameCreation, Day*3)\n\tparameters.VotingPeriods.Set(StrategyNameDeletion, Day*3)\n\tparameters.VotingPeriods.Set(StrategyNameLocking, Day*3)\n\tparameters.VotingPeriods.Set(StrategyNameModification, Day*3)\n\tparameters.VotingPeriods.Set(StrategyNameParamsUpdate, time.Minute*10)\n}\n"},{"name":"public.gno","body":"package tutorials\n\nimport (\n\t\"std\"\n\t\"time\"\n\n\t\"gno.land/p/demo/mux\"\n\t\"gno.land/p/gnome/blog\"\n)\n\nfunc Render(path string) string {\n\trouter := mux.NewRouter()\n\trouter.NotFoundHandler = func(res *mux.ResponseWriter, _ *mux.Request) {\n\t\tres.Write(\"Path not found\")\n\t}\n\n\trouter.HandleFunc(\"\", renderBlog)\n\trouter.HandleFunc(\"posts\", renderBlog)\n\trouter.HandleFunc(\"posts/{slug}\", renderPost)\n\trouter.HandleFunc(\"drafts\", renderDrafts)\n\trouter.HandleFunc(\"revisions\", renderRevisions)\n\trouter.HandleFunc(\"tags\", renderTags)\n\trouter.HandleFunc(\"tags/{name}\", renderPostsByTag)\n\trouter.HandleFunc(\"params\", renderParams)\n\n\treturn renderAlerts() + router.Render(path)\n}\n\n// GetTutorialsBlog returns an invariant reference to the tutorials blog.\nfunc GetTutorialsBlog() blog.InvarBlog {\n\treturn blog.NewInvarBlog(\u0026tutorialsBlog)\n}\n\n// Publish publishes content for a tutorial.\n//\n// The submited content must be previously approved by a creation or modification proposal.\n//\n// Parameters:\n// - slug: Slug name of the tutorial (required)\n// - content: The tutorial content to publish (required)\nfunc Publish(slug, content string) {\n\tassertRealmIsNotLocked()\n\n\t// Check that content checksum matches the approved content for the tutorial post\n\tp := mustGetPost(slug)\n\tblog.AssertContentSha256Hash(content, p.ContentHash)\n\n\t// Add caller to the list of publishers\n\tcaller := std.GetOrigCaller()\n\tif !p.Publishers.HasAddress(caller) {\n\t\tp.Publishers = append(p.Publishers, caller)\n\t}\n\n\tif p.Status == blog.StatusDraft {\n\t\tp.PublishAt = time.Now()\n\t}\n\n\tp.Status = blog.StatusPublished\n\tp.Content = content\n\tp.UpdatedAt = time.Now()\n}\n"},{"name":"public_proposals.gno","body":"package tutorials\n\nimport (\n\t\"std\"\n\t\"strings\"\n\t\"time\"\n\n\t\"gno.land/p/gnome/blog\"\n\tgnome \"gno.land/p/gnome/dao\"\n\tgnomeDAO \"gno.land/r/gnome/dao/pre1\"\n)\n\nconst tutorialsPath = \"council/main/sections/tutorials\"\n\n// SubmitCreationProposal submits a new proposal to create a new tutorial.\n//\n// Proposal requires a 51% quorum, otherwise the outcome will be low participation.\n// Tally is done by absolute majority, so all abstentions are considered.\n//\n// Parameters:\n// - proposalTitle: A title for the proposal (required)\n// - proposalDescription: A description of the proposal\n// - tutorialSlug: Slug name of the tutorial (required)\n// - tutorialTitle: A title for the tutorial (required)\n// - tutorialContentHash: A SHA256 hash of the tutorial's content (required)\n// - tutorialContentURL: A URL where the tutorial's content is currently available (required)\n// - tutorialAuthors: List of author addresses (required)\n// - tutorialEditors:\tList of editor addresses\n// - tutorialTags: Space separated list of tutorial tags\n//\n// Tutorial slug name allows letters from \"a\" to \"z\", numbers and \"-\" as valid characters.\n// Unicode letters are also allowed.\n//\n// The list of authors and editors must be a newline separated list of addresses.\nfunc SubmitCreationProposal(\n\tproposalTitle,\n\tproposalDescription,\n\ttutorialSlug,\n\ttutorialTitle,\n\ttutorialContentHash,\n\ttutorialContentURL,\n\ttutorialAuthors,\n\ttutorialEditors,\n\ttutorialTags string,\n) uint64 {\n\tassertRealmIsNotLocked()\n\tassertSlugIsAvailable(tutorialSlug)\n\tblog.AssertTitleIsNotEmpty(tutorialTitle)\n\tblog.AssertIsSlug(tutorialSlug)\n\tblog.AssertIsSha256Hash(tutorialContentHash)\n\tblog.AssertIsContentURL(tutorialContentURL)\n\n\ttags := strings.Fields(tutorialTags)\n\tassertValidTags(tags)\n\n\tauthors := blog.MustParseStringToAddresses(tutorialAuthors)\n\tif len(authors) == 0 {\n\t\tpanic(\"tutorial authors must have at least one author's address\")\n\t}\n\n\tstrategy := creationStrategy{\n\t\tslug: tutorialSlug,\n\t\ttitle: strings.TrimSpace(tutorialTitle),\n\t\tcontentHash: tutorialContentHash,\n\t\tcontentURL: tutorialContentURL,\n\t\tauthors: authors,\n\t\teditors: blog.MustParseStringToAddresses(tutorialEditors),\n\t\ttags: tags,\n\t}\n\tid := gnomeDAO.SubmitCustomProposal(proposalTitle, proposalDescription, strategy, tutorialsPath)\n\treturn uint64(id)\n}\n\n// SubmitModificationProposal submits a new proposal to modify a tutorial.\n//\n// Proposal requires a 51% quorum, otherwise the outcome will be low participation.\n// Tally is done by absolute majority, so all abstentions are considered.\n//\n// Parameters:\n// - proposalTitle: A title for the proposal (required)\n// - proposalDescription: A description of the proposal\n// - tutorialSlug: Slug name of the tutorial (required)\n// - tutorialTitle: A title for the tutorial\n// - tutorialContentHash: A SHA256 hash of the new tutorial's content\n// - tutorialCurrentContentHash: A SHA256 hash of the current tutorial's content\n// - tutorialContentURL: A URL where the new tutorial's content is currently available\n// - tutorialNewAuthors: List of author addresses\n// - tutorialNewEditors:\tList of editor addresses\n// - tutorialTags: Space separated list of tutorial tags\n//\n// Tutorial slug name allows letters from \"a\" to \"z\", numbers and \"-\" as valid characters.\n// Unicode letters are also allowed.\n//\n// The list of new authors and editors must be a newline separated list of addresses.\n// If present, authors and editors are appended to the current list of authors and editors.\nfunc SubmitModificationProposal(\n\tproposalTitle,\n\tproposalDescription,\n\ttutorialSlug,\n\ttutorialTitle,\n\ttutorialContentHash,\n\ttutorialCurrentContentHash,\n\ttutorialContentURL,\n\ttutorialNewAuthors,\n\ttutorialNewEditors,\n\ttutorialTags string,\n) uint64 {\n\tassertRealmIsNotLocked()\n\n\ttutorialSlug = strings.TrimSpace(tutorialSlug)\n\tassertTutorialExists(tutorialSlug)\n\n\ttags := strings.Fields(tutorialTags)\n\tassertValidTags(tags)\n\n\ttutorialContentHash = strings.TrimSpace(tutorialContentHash)\n\tif tutorialContentHash != \"\" {\n\t\ttutorialCurrentContentHash = strings.TrimSpace(tutorialCurrentContentHash)\n\t\tif tutorialCurrentContentHash == \"\" {\n\t\t\tpanic(\"the current content hash of the tutorial to modify is required\")\n\t\t}\n\n\t\tblog.AssertIsSha256Hash(tutorialContentHash)\n\t\tblog.AssertIsSha256Hash(tutorialCurrentContentHash)\n\t\tblog.AssertIsContentURL(tutorialContentURL)\n\t}\n\n\tstrategy := modificationStrategy{\n\t\tslug: tutorialSlug,\n\t\ttitle: strings.TrimSpace(tutorialTitle),\n\t\tcontentHash: tutorialContentHash,\n\t\tcurrentContentHash: tutorialCurrentContentHash,\n\t\tcontentURL: tutorialContentURL,\n\t\tauthors: blog.MustParseStringToAddresses(tutorialNewAuthors),\n\t\teditors: blog.MustParseStringToAddresses(tutorialNewEditors),\n\t\ttags: tags,\n\t}\n\tid := gnomeDAO.SubmitCustomProposal(proposalTitle, proposalDescription, strategy, tutorialsPath)\n\treturn uint64(id)\n}\n\n// SubmitDeletionProposal submits a new proposal to delete a tutorial.\n//\n// Proposal requires a 51% quorum, otherwise the outcome will be low participation.\n// Tally is done by absolute majority, so all abstentions are considered.\n//\n// Parameters:\n// - proposalTitle: A title for the proposal (required)\n// - proposalDescription: A description of the proposal\n// - tutorialSlug: Slug name of the tutorial (required)\nfunc SubmitDeletionProposal(proposalTitle, proposalDescription, tutorialSlug string) uint64 {\n\tassertRealmIsNotLocked()\n\n\ttutorialSlug = strings.TrimSpace(tutorialSlug)\n\tassertTutorialExists(tutorialSlug)\n\n\tstrategy := deletionStrategy{tutorialSlug}\n\tid := gnomeDAO.SubmitCustomProposal(proposalTitle, proposalDescription, strategy, tutorialsPath)\n\treturn uint64(id)\n}\n\n// SubmitLockingProposal submits a new proposal to lock the realm.\n//\n// Locking the realm \"freezes the state\" by disallowing further modifications.\n// State must be locked to migrate the realm to a newer version.\n//\n// Proposal requires a 33% quorum, otherwise the outcome will be low participation.\n// This type of proposal can only be created by members with `admin` role.\n// Tally is done by plurality.\n//\n// Parameters:\n// - proposalTitle: A title for the proposal (required)\n// - proposalDescription: A description of the proposal\n// - realmPath: Path of the realm that should be allowed to import state data\n//\n// The optional realm path authorizes a realm to import the state data once the realm is locked.\nfunc SubmitLockingProposal(proposalTitle, proposalDescription, realmPath string) uint64 {\n\tassertHasAdminRole(std.GetOrigCaller())\n\n\tif realmPath != \"\" \u0026\u0026 !strings.HasPrefix(realmPath, \"gno.land/r/\") {\n\t\tpanic(`realm path must start with \"gno.land/r/\"`)\n\t}\n\n\tstrategy := lockingStrategy{realmPath}\n\tid := gnomeDAO.SubmitCustomProposal(proposalTitle, proposalDescription, strategy, tutorialsPath)\n\treturn uint64(id)\n}\n\n// SubmitParamsUpdateProposal submits a new proposal to update one or more realm parameters.\n//\n// Proposal requires a 51% quorum, otherwise the outcome will be low participation.\n// Tally is done by absolute majority, so all abstentions are considered.\n//\n// Parameters:\n// - proposalTitle: A title for the proposal (required)\n// - proposalDescription: A description of the proposal\n// - votingPeriodCreation: Voting period for tutorial creation proposals\n// - votingPeriodModification: Voting period for tutorial modification proposals\n// - votingPeriodDeletion: Voting period for tutorial deletion proposals\n// - votingPeriodLocking: Voting period for realm locking proposals\n// - votingPeriodParamsUpdate: Voting period for parameters update proposals\n//\n// Voting period is the number of days that members can vote on a proposal\n// At least one parameter value is required for creating a proposal.\nfunc SubmitParamsUpdateProposal(\n\tproposalTitle,\n\tproposalDescription string,\n\tvotingPeriodCreation,\n\tvotingPeriodModification,\n\tvotingPeriodDeletion,\n\tvotingPeriodLocking,\n\tvotingPeriodParamsUpdate int,\n) uint64 {\n\tstrategy := paramsUpdateStrategy{}\n\tif votingPeriodCreation \u003e 0 {\n\t\tperiod := time.Duration(votingPeriodCreation) * Day\n\t\tstrategy.votingPeriods.Set(StrategyNameCreation, period)\n\t}\n\n\tif votingPeriodModification \u003e 0 {\n\t\tperiod := time.Duration(votingPeriodModification) * Day\n\t\tstrategy.votingPeriods.Set(StrategyNameModification, period)\n\t}\n\n\tif votingPeriodDeletion \u003e 0 {\n\t\tperiod := time.Duration(votingPeriodDeletion) * Day\n\t\tstrategy.votingPeriods.Set(StrategyNameDeletion, period)\n\t}\n\n\tif votingPeriodLocking \u003e 0 {\n\t\tperiod := time.Duration(votingPeriodLocking) * Day\n\t\tstrategy.votingPeriods.Set(StrategyNameLocking, period)\n\t}\n\n\tif votingPeriodParamsUpdate \u003e 0 {\n\t\tperiod := time.Duration(votingPeriodParamsUpdate) * Day\n\t\tstrategy.votingPeriods.Set(StrategyNameParamsUpdate, period)\n\t}\n\n\tif strategy.votingPeriods.Size() == 0 {\n\t\tpanic(\"at least one parameter value must be specified\")\n\t}\n\n\tid := gnomeDAO.SubmitCustomProposal(proposalTitle, proposalDescription, strategy, tutorialsPath)\n\treturn uint64(id)\n}\n\nfunc assertSlugIsAvailable(slug string) {\n\tif tutorialsBlog.HasPost(slug) {\n\t\tpanic(\"tutorial URL slug already exists\")\n\t}\n}\n\nfunc assertTutorialExists(slug string) {\n\tif !tutorialsBlog.HasPost(slug) {\n\t\tpanic(\"tutorial not found\")\n\t}\n}\n\nfunc assertValidTags(tags []string) {\n\tfor _, t := range tags {\n\t\tif !blog.IsSlug(t) {\n\t\t\tpanic(\"invalid tag: \" + t)\n\t\t}\n\t}\n}\n\nfunc assertHasAdminRole(addr std.Address) {\n\tdao := gnomeDAO.GetDAO(tutorialsPath)\n\tm, found := getMember(dao, addr)\n\tif !found {\n\t\tpanic(\"address is not a member of tutorials DAO: \" + addr.String())\n\t}\n\n\tfor _, r := range m.Roles {\n\t\tif r == gnomeDAO.RoleAdmin {\n\t\t\t// Member has admin role\n\t\t\treturn\n\t\t}\n\t}\n\n\tpanic(\"member doesn't have admin role: \" + addr.String())\n}\n\nfunc getMember(dao gnome.InvarDAO, addr std.Address) (gnome.Member, bool) {\n\tfor _, m := range dao.Members() {\n\t\tif m.Address == addr {\n\t\t\treturn m, true\n\t\t}\n\t}\n\treturn gnome.Member{}, false\n}\n"},{"name":"render.gno","body":"package tutorials\n\nimport (\n\t\"strings\"\n\t\"time\"\n\n\t\"gno.land/p/demo/mux\"\n\t\"gno.land/p/gnome/alerts\"\n\t\"gno.land/p/gnome/blog\"\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\nconst (\n\tdateFormat = \"2006-01-02 15:04 MST\"\n\tshortDateFormat = \"Jan 2, 2006\"\n)\n\nfunc renderBlog(res *mux.ResponseWriter, _ *mux.Request) {\n\t// Write header\n\tres.Write(\"# \" + tutorialsBlog.Title + \"\\n\")\n\tif tutorialsBlog.Description != \"\" {\n\t\tres.Write(tutorialsBlog.Description + \"\\n\\n\")\n\t}\n\n\t// Write tutorials menu\n\tres.Write(renderMenu() + \"\\n\\n---\\n\")\n\n\t// Write list of published tutorials\n\tnow := time.Now()\n\ttutorials.Iterate(\"\", \"\", func(p *blog.Post) bool { // TODO: Add post pagination support\n\t\t// Skip posts that should be published at a future date\n\t\tif p.PublishAt.IsZero() || p.PublishAt.After(now) {\n\t\t\treturn false\n\t\t}\n\n\t\t// Skip posts that are not published or being revised\n\t\tif p.Status != blog.StatusPublished \u0026\u0026 p.Status != blog.StatusRevised {\n\t\t\treturn false\n\t\t}\n\n\t\turl := newRealmURL(\"posts/\" + p.Slug)\n\t\tdate := p.PublishAt.UTC().Format(shortDateFormat)\n\t\tres.Write(\"**[\" + p.Title + \"](\" + url + \")**\u003c/br\u003e\")\n\t\tres.Write(\"_Published: \" + date + \"_\\n\\n\")\n\t\treturn false\n\t})\n}\n\nfunc renderPost(res *mux.ResponseWriter, req *mux.Request) {\n\tslug := req.GetVar(\"slug\")\n\tp, found := tutorialsBlog.GetPost(slug)\n\tif !found {\n\t\tres.Write(\"Post not found\")\n\t\treturn\n\t}\n\n\tif p.Status == blog.StatusRevised {\n\t\tres.Write(alerts.NewWarning(\"Tutorial content is being revised\"))\n\t}\n\n\t// TODO: Add post tags with links\n\tres.Write(\"# \" + p.Title + \"\\n\")\n\tres.Write(\"- Author(s): \" + p.Authors.String() + \"\\n\")\n\n\tif len(p.Editors) \u003e 0 {\n\t\tres.Write(\"- Editors(s): \" + p.Editors.String() + \"\\n\")\n\t}\n\n\tres.Write(\"- Publisher(s): \" + p.Publishers.String() + \"\\n\")\n\tres.Write(\"- Status: \" + p.Status.String() + \"\\n\")\n\tres.Write(\"- Content Hash: \" + p.ContentHash + \"\\n\")\n\tres.Write(\"- Created: \" + p.CreatedAt.UTC().Format(dateFormat) + \"\\n\")\n\tif !p.UpdatedAt.IsZero() {\n\t\tres.Write(\"- Updated: \" + p.UpdatedAt.UTC().Format(dateFormat) + \"\\n\")\n\t}\n\n\tif len(p.Tags) \u003e 0 {\n\t\tres.Write(\"- Tag(s): \" + renderTagLinks(p.Tags) + \"\\n\")\n\t}\n\n\tif p.Content != \"\" {\n\t\tres.Write(\"\\n\" + p.Content)\n\t}\n}\n\nfunc renderDrafts(res *mux.ResponseWriter, _ *mux.Request) {\n\tres.Write(\"# \" + tutorialsBlog.Title + \": Drafts\\n\")\n\ttutorials.Iterate(\"\", \"\", func(p *blog.Post) bool { // TODO: Add pagination support\n\t\tif p.Status != blog.StatusDraft {\n\t\t\treturn false\n\t\t}\n\n\t\turl := newRealmURL(\"posts/\" + p.Slug)\n\t\tdate := p.CreatedAt.UTC().Format(shortDateFormat)\n\t\tres.Write(\"**[\" + p.Title + \"](\" + url + \")**\u003c/br\u003e\")\n\t\tres.Write(\"_Created: \" + date + \"_\\n\\n\")\n\t\treturn false\n\t})\n}\n\nfunc renderRevisions(res *mux.ResponseWriter, _ *mux.Request) {\n\tres.Write(\"# \" + tutorialsBlog.Title + \": Revisions\\n\")\n\ttutorials.Iterate(\"\", \"\", func(p *blog.Post) bool { // TODO: Add pagination support\n\t\tif p.Status != blog.StatusRevised {\n\t\t\treturn false\n\t\t}\n\n\t\turl := newRealmURL(\"posts/\" + p.Slug)\n\t\tdate := p.PublishAt.UTC().Format(shortDateFormat)\n\t\tres.Write(\"**[\" + p.Title + \"](\" + url + \")**\u003c/br\u003e\")\n\t\tres.Write(\"_Published: \" + date + \"_\\n\\n\")\n\t\treturn false\n\t})\n}\n\nfunc renderTags(res *mux.ResponseWriter, req *mux.Request) {\n\tres.Write(\"# \" + tutorialsBlog.Title + \": Tags\\n\")\n\ttags.IterateTags(func(tag string) bool {\n\t\tres.Write(\"- [\" + tag + \"](\" + newRealmURL(\"tags/\"+tag) + \")\\n\")\n\t\treturn false\n\t})\n}\n\nfunc renderPostsByTag(res *mux.ResponseWriter, req *mux.Request) {\n\ttag := req.GetVar(\"name\")\n\tres.Write(\"# \" + tutorialsBlog.Title + \": Tag `\" + tag + \"`\\n\")\n\n\tif tag == \"\" {\n\t\treturn\n\t}\n\n\ttags.IteratePosts(tag, func(p *blog.Post) bool {\n\t\tif p.Status != blog.StatusPublished \u0026\u0026 p.Status != blog.StatusRevised {\n\t\t\treturn false\n\t\t}\n\n\t\turl := newRealmURL(\"posts/\" + p.Slug)\n\t\tdate := p.PublishAt.UTC().Format(shortDateFormat)\n\t\tres.Write(\"**[\" + p.Title + \"](\" + url + \")**\u003c/br\u003e\")\n\t\tres.Write(\"_Published: \" + date + \"_\\n\\n\")\n\t\treturn false\n\t})\n}\n\nfunc renderParams(res *mux.ResponseWriter, _ *mux.Request) {\n\tres.Write(\"# \" + tutorialsBlog.Title + \": Parameters\\n\")\n\tres.Write(\"## Proposal\\n\")\n\tres.Write(\"**Voting Periods**\\n\")\n\tparameters.VotingPeriods.Iterate(func(name string, period time.Duration) bool {\n\t\tres.Write(\"- `\" + name + \"`: \" + gnome.HumanizeDuration(period) + \"\\n\")\n\t\treturn false\n\t})\n}\n\nfunc renderAlerts() string {\n\tif locked {\n\t\tmsg := \"Realm is locked\"\n\t\tif nextVersionRealmPath != \"\" {\n\t\t\tlink := alerts.NewLink(\"https://\"+nextVersionRealmPath, nextVersionRealmPath)\n\t\t\tmsg += \"\u003c/br\u003eThis realm is deprecated in favor of a new version found at \" + link\n\t\t}\n\n\t\treturn alerts.NewError(msg)\n\t}\n\treturn \"\"\n}\n\nfunc renderMenu() string {\n\titems := []string{\n\t\t\"**[drafts](\" + newRealmURL(\"drafts\") + \")**\",\n\t\t\"**[revisions](\" + newRealmURL(\"revisions\") + \")**\",\n\t}\n\n\t// Add taxonomy entries\n\ttags.IterateTags(func(tag string) bool {\n\t\titems = append(items, \"**[\"+tag+\"](\"+newRealmURL(\"tags/\"+tag)+\")**\")\n\t\treturn false\n\t})\n\n\treturn strings.Join(items, \" \")\n}\n\nfunc renderTagLinks(tags []string) string {\n\tvar links []string\n\tfor _, t := range tags {\n\t\tlinks = append(links, \"[\"+t+\"](\"+newRealmURL(\"tags/\"+t)+\")\")\n\t}\n\treturn strings.Join(links, \", \")\n}\n\nfunc newRealmURL(renderPath string) string {\n\treturn \"/r/gnome/tutorials:\" + renderPath\n}\n"},{"name":"strategy_lock.gno","body":"package tutorials\n\nimport (\n\t\"errors\"\n\t\"time\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\ntype lockingStrategy struct {\n\trealmPath string\n}\n\nfunc (lockingStrategy) Name() string {\n\treturn StrategyNameLocking\n}\n\nfunc (lockingStrategy) Quorum() float64 {\n\treturn 0.33\n}\n\nfunc (lockingStrategy) VotingPeriod() time.Duration {\n\tperiod, _ := parameters.VotingPeriods.Get(StrategyNameLocking)\n\treturn period\n}\n\nfunc (lockingStrategy) VoteChoices() []gnome.VoteChoice {\n\treturn []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo}\n}\n\nfunc (s lockingStrategy) Validate(*gnome.Proposal) error {\n\t// Allow modification of the newxt version package path when realm is locked\n\tif locked \u0026\u0026 nextVersionRealmPath == \"\" \u0026\u0026 s.realmPath != \"\" {\n\t\treturn nil\n\t}\n\n\tif locked {\n\t\treturn errors.New(\"realm is already locked\")\n\t}\n\treturn nil\n}\n\nfunc (lockingStrategy) Tally(_ *gnome.DAO, r gnome.VotingRecord) gnome.VoteChoice {\n\tif choice, ok := gnome.SelectChoiceByPlurality(r); ok {\n\t\treturn choice\n\t}\n\treturn gnome.ChoiceNone\n}\n\nfunc (s lockingStrategy) Execute(*gnome.DAO) error {\n\tlocked = true\n\tif s.realmPath != \"\" {\n\t\tnextVersionRealmPath = s.realmPath\n\t}\n\treturn nil\n}\n\nfunc (s lockingStrategy) RenderParams() string {\n\tif s.realmPath != \"\" {\n\t\treturn \"Next Realm Path: [\" + s.realmPath + \"](https://\" + s.realmPath + \")\"\n\t}\n\treturn \"\"\n}\n"},{"name":"strategy_params.gno","body":"package tutorials\n\nimport (\n\t\"strings\"\n\t\"time\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\ntype paramsUpdateStrategy struct {\n\tvotingPeriods gnome.DurationParams\n}\n\nfunc (paramsUpdateStrategy) Name() string {\n\treturn StrategyNameParamsUpdate\n}\n\nfunc (paramsUpdateStrategy) Quorum() float64 {\n\treturn 0.51\n}\n\nfunc (paramsUpdateStrategy) VotingPeriod() time.Duration {\n\tperiod, _ := parameters.VotingPeriods.Get(StrategyNameParamsUpdate)\n\treturn period\n}\n\nfunc (paramsUpdateStrategy) VoteChoices() []gnome.VoteChoice {\n\treturn []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo}\n}\n\nfunc (paramsUpdateStrategy) Tally(dao *gnome.DAO, r gnome.VotingRecord) gnome.VoteChoice {\n\tabstentions := len(dao.Members()) - r.VoteCount()\n\tif choice, ok := gnome.SelectChoiceByMajority(r, abstentions); ok {\n\t\treturn choice\n\t}\n\treturn gnome.ChoiceNone\n}\n\nfunc (s paramsUpdateStrategy) Execute(*gnome.DAO) error {\n\ts.votingPeriods.Iterate(func(name string, period time.Duration) bool {\n\t\tparameters.VotingPeriods.Set(name, period)\n\t\treturn false\n\t})\n\treturn nil\n}\n\nfunc (s paramsUpdateStrategy) RenderParams() string {\n\tvar b strings.Builder\n\n\tb.WriteString(\"|||\\n|---|---|\\n\")\n\ts.votingPeriods.Iterate(func(name string, period time.Duration) bool {\n\t\tb.WriteString(\"| Voting Period for `\" + name + \"`: | \" + gnome.HumanizeDuration(period) + \" |\\n\")\n\t\treturn false\n\t})\n\n\treturn b.String()\n}\n"},{"name":"strategy_tutorials.gno","body":"package tutorials\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"time\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/gnome/blog\"\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\ntype creationStrategy struct {\n\tslug, title, contentHash, contentURL string\n\tauthors, editors blog.AddressList\n\ttags []string\n}\n\nfunc (creationStrategy) Name() string {\n\treturn StrategyNameCreation\n}\n\nfunc (creationStrategy) Quorum() float64 {\n\treturn 0.51\n}\n\nfunc (creationStrategy) VotingPeriod() time.Duration {\n\tperiod, _ := parameters.VotingPeriods.Get(StrategyNameCreation)\n\treturn period\n}\n\nfunc (creationStrategy) VoteChoices() []gnome.VoteChoice {\n\treturn []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo}\n}\n\nfunc (s creationStrategy) Validate(*gnome.Proposal) error {\n\tif tutorialsBlog.HasPost(s.slug) {\n\t\treturn errors.New(\"tutorial URL slug already exists\")\n\t}\n\treturn nil\n}\n\nfunc (creationStrategy) Tally(dao *gnome.DAO, r gnome.VotingRecord) gnome.VoteChoice {\n\tabstentions := len(dao.Members()) - r.VoteCount()\n\tif choice, ok := gnome.SelectChoiceByMajority(r, abstentions); ok {\n\t\treturn choice\n\t}\n\treturn gnome.ChoiceNone\n}\n\nfunc (s creationStrategy) Execute(*gnome.DAO) error {\n\tp := \u0026blog.Post{ // TODO: Support other fields like summary and tags\n\t\tSlug: s.slug,\n\t\tTitle: s.title,\n\t\tContentHash: s.contentHash,\n\t\tAuthors: s.authors,\n\t\tEditors: s.editors,\n\t\tStatus: blog.StatusDraft,\n\t\tTags: s.tags,\n\t\tCreatedAt: time.Now(),\n\t}\n\ttutorialsBlog.AddPost(p)\n\n\t// Update realm indexes\n\ttutorials.Index(p)\n\tif len(p.Tags) \u003e 0 {\n\t\ttags.Index(p)\n\t}\n\n\treturn nil\n}\n\nfunc (s creationStrategy) RenderParams() string {\n\tvar (\n\t\tb strings.Builder\n\t\tauthors = strings.ReplaceAll(s.authors.String(), \", \", \"\u003c/br\u003e\")\n\t)\n\n\t// TODO: Implement using gno.land/p/demo/ui\n\tb.WriteString(\"|||\\n|---|---|\\n\")\n\tb.WriteString(\"| Slug: | \" + s.slug + \" |\\n\")\n\tb.WriteString(\"| Title: | \" + gnome.EscapeHTML(s.title) + \" |\\n\")\n\tb.WriteString(\"| Content URL: | \" + gnome.NewLinkURI(s.contentURL) + \" |\\n\")\n\tb.WriteString(\"| Content Hash: | \" + s.contentHash + \" |\\n\")\n\n\tif len(s.tags) \u003e 0 {\n\t\tb.WriteString(\"| Tag(s): | \" + renderTagLinks(s.tags) + \" |\\n\")\n\t}\n\n\tb.WriteString(\"| Author(s): | \u003c/br\u003e\" + authors + \"\u003c/br\u003e\u003c/br\u003e |\\n\")\n\n\tif len(s.editors) \u003e 0 {\n\t\teditors := strings.ReplaceAll(s.editors.String(), \", \", \"\u003c/br\u003e\")\n\t\tb.WriteString(\"| Editor(s): | \u003c/br\u003e\" + editors + \"\u003c/br\u003e\u003c/br\u003e |\\n\")\n\t}\n\n\treturn b.String()\n}\n\ntype modificationStrategy struct {\n\tslug, title, currentContentHash, contentHash, contentURL string\n\tauthors, editors blog.AddressList\n\ttags []string\n}\n\nfunc (modificationStrategy) Name() string {\n\treturn StrategyNameModification\n}\n\nfunc (modificationStrategy) Quorum() float64 {\n\treturn 0.51\n}\n\nfunc (modificationStrategy) VotingPeriod() time.Duration {\n\tperiod, _ := parameters.VotingPeriods.Get(StrategyNameModification)\n\treturn period\n}\n\nfunc (modificationStrategy) VoteChoices() []gnome.VoteChoice {\n\treturn []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo}\n}\n\nfunc (s modificationStrategy) Validate(*gnome.Proposal) error {\n\tp, found := tutorialsBlog.GetPost(s.slug)\n\tif !found {\n\t\treturn errors.New(\"tutorial doesn't exists\")\n\t}\n\n\tif s.currentContentHash != \"\" \u0026\u0026 s.currentContentHash != p.ContentHash {\n\t\treturn errors.New(\"tutorial's content has been previously modified\")\n\t}\n\n\tfor _, addr := range s.authors {\n\t\tif p.Authors.HasAddress(addr) {\n\t\t\treturn errors.New(\"author already exists: \" + addr.String())\n\t\t}\n\t}\n\n\tfor _, addr := range s.editors {\n\t\tif p.Authors.HasAddress(addr) {\n\t\t\treturn errors.New(\"editor already exists: \" + addr.String())\n\t\t}\n\t}\n\n\tif len(s.tags) \u003e 0 {\n\t\tvar seenTags avl.Tree\n\t\tfor _, t := range s.tags {\n\t\t\tif seenTags.Has(t) {\n\t\t\t\treturn errors.New(\"duplicated tag: \" + t)\n\t\t\t}\n\n\t\t\tseenTags.Set(t, struct{}{})\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (modificationStrategy) Tally(dao *gnome.DAO, r gnome.VotingRecord) gnome.VoteChoice {\n\tabstentions := len(dao.Members()) - r.VoteCount()\n\tif choice, ok := gnome.SelectChoiceByMajority(r, abstentions); ok {\n\t\treturn choice\n\t}\n\treturn gnome.ChoiceNone\n}\n\nfunc (s modificationStrategy) Execute(*gnome.DAO) error {\n\tp, _ := tutorialsBlog.GetPost(s.slug)\n\n\tif s.title != \"\" {\n\t\tp.Title = s.title\n\t}\n\n\tif len(s.authors) \u003e 0 {\n\t\tp.Authors = append(p.Authors, s.authors...)\n\t}\n\n\tif len(s.editors) \u003e 0 {\n\t\tp.Editors = append(p.Editors, s.editors...)\n\t}\n\n\t// Update tag index\n\tif len(s.tags) \u003e 0 {\n\t\ttags.Remove(p)\n\t\tp.Tags = s.tags\n\t\ttags.Index(p)\n\t}\n\n\t// Changing content hash converts post to a revised until new content is setted\n\tif s.contentHash != \"\" {\n\t\tp.Status = blog.StatusRevised\n\t\tp.ContentHash = s.contentHash\n\t}\n\n\tp.UpdatedAt = time.Now()\n\treturn nil\n}\n\nfunc (s modificationStrategy) RenderParams() string {\n\tvar b strings.Builder\n\n\t// TODO: Implement using gno.land/p/demo/ui\n\tb.WriteString(\"|||\\n|---|---|\\n\")\n\tb.WriteString(\"| Slug: | [\" + s.slug + \"](\" + newRealmURL(\"posts/\"+s.slug) + \") |\\n\")\n\n\tif s.title != \"\" {\n\t\tb.WriteString(\"| Title: | \" + gnome.EscapeHTML(s.title) + \" |\\n\")\n\t}\n\n\tif s.contentHash != \"\" {\n\t\tb.WriteString(\"| Content URL: | \" + gnome.NewLinkURI(s.contentURL) + \" |\\n\")\n\t\tb.WriteString(\"| Content Hash: | \" + s.contentHash + \" |\\n\")\n\t\tb.WriteString(\"| Modifies Content Hash: | \" + s.currentContentHash + \" |\\n\")\n\t}\n\n\tif len(s.tags) \u003e 0 {\n\t\tb.WriteString(\"| Tag(s): | \" + renderTagLinks(s.tags) + \" |\\n\")\n\t}\n\n\tif len(s.authors) \u003e 0 {\n\t\tauthors := strings.ReplaceAll(s.authors.String(), \", \", \"\u003c/br\u003e\")\n\t\tb.WriteString(\"| Author(s): | \u003c/br\u003e\" + authors + \"\u003c/br\u003e\u003c/br\u003e |\\n\")\n\t}\n\n\tif len(s.editors) \u003e 0 {\n\t\teditors := strings.ReplaceAll(s.editors.String(), \", \", \"\u003c/br\u003e\")\n\t\tb.WriteString(\"| Editor(s): | \u003c/br\u003e\" + editors + \"\u003c/br\u003e\u003c/br\u003e |\\n\")\n\t}\n\n\treturn b.String()\n}\n\ntype deletionStrategy struct {\n\tslug string\n}\n\nfunc (deletionStrategy) Name() string {\n\treturn StrategyNameDeletion\n}\n\nfunc (deletionStrategy) Quorum() float64 {\n\treturn 0.51\n}\n\nfunc (deletionStrategy) VotingPeriod() time.Duration {\n\tperiod, _ := parameters.VotingPeriods.Get(StrategyNameDeletion)\n\treturn period\n}\n\nfunc (deletionStrategy) VoteChoices() []gnome.VoteChoice {\n\treturn []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo}\n}\n\nfunc (deletionStrategy) Tally(dao *gnome.DAO, r gnome.VotingRecord) gnome.VoteChoice {\n\tabstentions := len(dao.Members()) - r.VoteCount()\n\tif choice, ok := gnome.SelectChoiceByMajority(r, abstentions); ok {\n\t\treturn choice\n\t}\n\treturn gnome.ChoiceNone\n}\n\nfunc (s deletionStrategy) Validate(*gnome.Proposal) error {\n\tif !tutorialsBlog.HasPost(s.slug) {\n\t\treturn errors.New(\"tutorial doesn't exists\")\n\t}\n\treturn nil\n}\n\nfunc (s deletionStrategy) Execute(*gnome.DAO) error {\n\tp, found := tutorialsBlog.RemovePost(s.slug)\n\tif !found {\n\t\treturn errors.New(\"tutorial not found\")\n\t}\n\n\t// Update realm indexes\n\ttutorials.Remove(p)\n\tif len(p.Tags) \u003e 0 {\n\t\ttags.Remove(p)\n\t}\n\n\treturn nil\n}\n\nfunc (s deletionStrategy) RenderParams() string {\n\treturn \"Slug: [\" + s.slug + \"](\" + newRealmURL(\"posts/\"+s.slug) + \")\"\n}\n"},{"name":"tutorials.gno","body":"package tutorials\n\nimport (\n\t\"gno.land/p/gnome/blog\"\n)\n\nvar (\n\tlocked bool\n\tnextVersionRealmPath string\n\n\ttutorialsBlog = blog.Blog{Title: \"Gno.me Tutorials\"} // TODO: Define a realm description\n)\n\nfunc mustGetPost(slug string) *blog.Post {\n\tp, found := tutorialsBlog.GetPost(slug)\n\tif !found {\n\t\tpanic(\"tutorial not found\")\n\t}\n\treturn p\n}\n\nfunc assertRealmIsNotLocked() {\n\tif locked {\n\t\tpanic(\"realm is locked\")\n\t}\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"21000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"1KPMw7IVLN9A7knWLwbIEFwBRrkni39FKC2F0oEqfyxn585kcqQ9wU5sqmYFj8VXJfo5g/ytmuq11xdLkQHYqA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"tutorials","path":"gno.land/r/gnome/tutorials/pre2","files":[{"name":"LICENSE","body":"Copyright (c) 2024. All rights reserved.\n\nProject Owner:\nNewTendermint, LLC\n\nProject Maintainer:\nİlker Göktuğ ÖZTÜRK. \u003cilker@ilgooz.com\u003e, \u003cilkergoktugozturk@gmail.com\u003e\n\nYour access to this Project and your contributions to this Project are subject\nto the following terms:\n\n* You hereby grant to the listed Owner and Maintainer of this Project the\nworldwide, irrevocable and royalty-free right to use, publish, relicense and\nsublicense your contributions under any non-exclusive license of their\nchoosing for commercial and non-commercial purposes.\n* You shall not attempt to bring any intellectual property infringement or\nmisappropriation claims against the Owner or Maintainer of this Project\nrelating to or arising from your contributions.\n* You represent that you are the sole owner of all rights in your\ncontributions and that no third party has any rights or interests therein.\n\nFOR THE SCOPE OF THIS LICENSE, A CONTRIBUTION IS DEFINED TO INCLUDE ANY WORKS,\nIDEAS, CODE, PROCESSES, OR APIS MADE AVAILABLE TO VIEW BY THE GENERAL PUBLIC\n(INCLUDING ANY PUBLICLY ACCESSIBLE INTERNET FORUMS AND CHAT SERVERS WHERE\nACCESS IS AVAILABLE FOR FREE WITH REGISTRATION) OR PRIVATELY TO THIS PROJECT'S\nOWNER AND MAINTAINERS; INCLUDING WORKS, IDEAS, CODE, PROCESSES, AND APIS THAT\nARE ABOUT THIS PROJECT AND ITS CONTRIBUTIONS, OR MENTIONED IN REFERENCE TO\nTHIS PROJECT, WHERE SUCH WORKS, IDEAS, CODE, PROCESSES, AND APIS ARE MATERIAL\nTO THE SUCCESS, IMPROVEMENT, OR COMPLETION OF THIS PROJECT, AS DETERMINED BY\nTHE OWNER OF THIS PROJECT.\n\nContributions may come in any form, and include (but are not limited to):\n\n* pull requests\n* diff patches\n* commentary\n* example code\n\nIf you do not want your contribution to become incorporated into this Project,\ndo not make contributions to this Project. The creation of contributions that\nmay in the future become known to this Project's Owner and Maintainer\nconstitutes a willing contribution to this Project in accordance with this\nlicense.\n\nTHIS PROJECT AND THE WORKS AVAILABLE THROUGH THIS PROJECT ARE PROVIDED “AS IS”\nAND WITHOUT WARRANTY OF ANY KIND. IN NO EVENT SHALL THE OWNER OR MAINTAINER OF\nTHIS PROJECT BE LIABLE TO YOU OR ANY THIRD PARTY FOR ANY CLAIM, DAMAGES OR\nOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THIS PROJECT OR THE WORKS AVAILABLE THROUGH\nTHIS PROJECT. YOU AGREED TO INDEMNIFY, DEFEND AND HOLD THE OWNER AND\nMAINTAINER FROM AND AGAINST ANY CLAIMS, LOSSES OR DAMAGES ARISING FROM YOUR\nUSE OF THIS PROJECT OR THE WORKS AVAILABLE THROUGH THIS PROJECT.\n\nThis license is subject to change at any time by the Project Owner or\nMaintainer.\n\nYour continued access to or use of this Project or any works\navailable through this Project shall be subject to the then-current version\nof this license.\n\nThe Project Owner and Maintainer reserve the right to change this license\nwithout needing the consent of the contributors to this Project.\n"},{"name":"indexes.gno","body":"package tutorials\n\nimport (\n\t\"time\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/gnome/blog\"\n)\n\nconst keyDateFmt = \"2006-01-02T15:04:05\"\n\nvar (\n\ttags tagIndex\n\ttutorials tutorialIndex\n)\n\ntype tagIndex struct {\n\tindex avl.Tree // string(tag) -\u003e *tutorialIndex\n}\n\nfunc (x *tagIndex) Index(p *blog.Post) (indexed bool) {\n\tif p == nil {\n\t\treturn\n\t}\n\n\tfor _, tag := range p.Tags {\n\t\t// Get the tutorials for the current tag\n\t\tvar (\n\t\t\tidx *tutorialIndex\n\t\t\tv, found = x.index.Get(tag)\n\t\t)\n\n\t\tif found {\n\t\t\tidx = v.(*tutorialIndex)\n\t\t} else {\n\t\t\tidx = \u0026tutorialIndex{}\n\t\t}\n\n\t\t// Index the tutorial\n\t\tidx.Index(p)\n\n\t\t// Keep track of indexing success\n\t\tindexed = x.index.Set(tag, idx) || indexed\n\t}\n\treturn\n}\n\nfunc (x *tagIndex) Remove(p *blog.Post) (removed bool) {\n\tif p == nil {\n\t\treturn\n\t}\n\n\tfor _, tag := range p.Tags {\n\t\tv, found := x.index.Get(tag)\n\t\tif !found {\n\t\t\t// Ignore tags that are not indexed\n\t\t\tcontinue\n\t\t}\n\n\t\tidx := v.(*tutorialIndex)\n\t\tif idx.Remove(p) \u0026\u0026 !removed {\n\t\t\tremoved = true\n\t\t}\n\n\t\tif idx.Size() == 0 {\n\t\t\t// Remove the tag from the index when empty\n\t\t\tx.index.Remove(tag)\n\t\t}\n\t}\n\treturn\n}\n\nfunc (x tagIndex) IterateTags(fn func(tag string) bool) bool {\n\treturn x.index.Iterate(\"\", \"\", func(tag string, _ interface{}) bool {\n\t\treturn fn(tag)\n\t})\n}\n\nfunc (x tagIndex) IteratePosts(tag string, fn func(*blog.Post) bool) bool { // TODO: Support pagination\n\tv, found := x.index.Get(tag)\n\tif !found {\n\t\treturn false\n\t}\n\n\tidx := v.(*tutorialIndex)\n\treturn idx.Iterate(\"\", \"\", func(p *blog.Post) bool {\n\t\treturn fn(p)\n\t})\n}\n\ntype tutorialIndex struct {\n\tindex avl.Tree // string(post creation time + post slug) -\u003e *blog.Post\n}\n\nfunc (x tutorialIndex) Size() int {\n\treturn x.index.Size()\n}\n\nfunc (x *tutorialIndex) Index(p *blog.Post) bool {\n\tk := newTutorialKey(p)\n\treturn x.index.Set(k, p)\n}\n\nfunc (x *tutorialIndex) Remove(p *blog.Post) bool {\n\tk := newTutorialKey(p)\n\t_, removed := x.index.Remove(k)\n\treturn removed\n}\n\nfunc (x tutorialIndex) Iterate(start, end string, fn func(*blog.Post) bool) bool {\n\treturn x.index.Iterate(start, end, func(_ string, v interface{}) bool {\n\t\treturn fn(v.(*blog.Post))\n\t})\n}\n\nfunc newTutorialKey(p *blog.Post) string {\n\tif p != nil {\n\t\treturn p.CreatedAt.UTC().Format(keyDateFmt) + p.Slug\n\t}\n\n\t// By default create a key for the current block time\n\treturn time.Now().UTC().Format(keyDateFmt)\n}\n"},{"name":"params.gno","body":"package tutorials\n\nimport (\n\t\"time\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\n// Day defines the duration of a day.\nconst Day = time.Hour * 24\n\n// Names for the different strategy types.\nconst (\n\tStrategyNameCreation = \"tutorial-creation\"\n\tStrategyNameDeletion = \"tutorial-deletion\"\n\tStrategyNameLocking = \"tutorial-realm-locking\"\n\tStrategyNameModification = \"tutorial-modification\"\n\tStrategyNameParamsUpdate = \"tutorial-params-update\"\n)\n\nvar parameters struct {\n\tVotingPeriods gnome.DurationParams\n}\n\nfunc init() {\n\t// Initial voting periods for each proposal type.\n\t// Periods can be changed by sumitting a params update proposal.\n\tparameters.VotingPeriods.Set(StrategyNameCreation, Day*3)\n\tparameters.VotingPeriods.Set(StrategyNameDeletion, Day*3)\n\tparameters.VotingPeriods.Set(StrategyNameLocking, Day*3)\n\tparameters.VotingPeriods.Set(StrategyNameModification, Day*3)\n\tparameters.VotingPeriods.Set(StrategyNameParamsUpdate, time.Minute*10)\n}\n"},{"name":"public.gno","body":"package tutorials\n\nimport (\n\t\"std\"\n\t\"time\"\n\n\t\"gno.land/p/demo/mux\"\n\t\"gno.land/p/gnome/blog\"\n)\n\nfunc Render(path string) string {\n\trouter := mux.NewRouter()\n\trouter.NotFoundHandler = func(res *mux.ResponseWriter, _ *mux.Request) {\n\t\tres.Write(\"Path not found\")\n\t}\n\n\trouter.HandleFunc(\"\", renderBlog)\n\trouter.HandleFunc(\"posts\", renderBlog)\n\trouter.HandleFunc(\"posts/{slug}\", renderPost)\n\trouter.HandleFunc(\"drafts\", renderDrafts)\n\trouter.HandleFunc(\"revisions\", renderRevisions)\n\trouter.HandleFunc(\"tags\", renderTags)\n\trouter.HandleFunc(\"tags/{name}\", renderPostsByTag)\n\trouter.HandleFunc(\"params\", renderParams)\n\n\treturn renderAlerts() + router.Render(path)\n}\n\n// GetTutorialsBlog returns an invariant reference to the tutorials blog.\nfunc GetTutorialsBlog() blog.InvarBlog {\n\treturn blog.NewInvarBlog(\u0026tutorialsBlog)\n}\n\n// Publish publishes content for a tutorial.\n//\n// The submited content must be previously approved by a creation or modification proposal.\n//\n// Parameters:\n// - slug: Slug name of the tutorial (required)\n// - content: The tutorial content to publish (required)\nfunc Publish(slug, content string) {\n\tassertRealmIsNotLocked()\n\n\t// Check that content checksum matches the approved content for the tutorial post\n\tp := mustGetPost(slug)\n\tblog.AssertContentSha256Hash(content, p.ContentHash)\n\n\t// Add caller to the list of publishers\n\tcaller := std.GetOrigCaller()\n\tif !p.Publishers.HasAddress(caller) {\n\t\tp.Publishers = append(p.Publishers, caller)\n\t}\n\n\tif p.Status == blog.StatusDraft {\n\t\tp.PublishAt = time.Now()\n\t}\n\n\tp.Status = blog.StatusPublished\n\tp.Content = content\n\tp.UpdatedAt = time.Now()\n}\n"},{"name":"public_proposals.gno","body":"package tutorials\n\nimport (\n\t\"std\"\n\t\"strings\"\n\t\"time\"\n\n\t\"gno.land/p/gnome/blog\"\n\tgnome \"gno.land/p/gnome/dao\"\n\tgnomeDAO \"gno.land/r/gnome/dao/pre1\"\n)\n\nconst tutorialsPath = \"council/main/sections/tutorials\"\n\n// SubmitCreationProposal submits a new proposal to create a new tutorial.\n//\n// Proposal requires a 51% quorum, otherwise the outcome will be low participation.\n// Tally is done by absolute majority, so all abstentions are considered.\n//\n// Parameters:\n// - proposalTitle: A title for the proposal (required)\n// - proposalDescription: A description of the proposal\n// - tutorialSlug: Slug name of the tutorial (required)\n// - tutorialTitle: A title for the tutorial (required)\n// - tutorialContentHash: A SHA256 hash of the tutorial's content (required)\n// - tutorialContentURL: A URL where the tutorial's content is currently available (required)\n// - tutorialAuthors: List of author addresses (required)\n// - tutorialEditors:\tList of editor addresses\n// - tutorialTags: Space separated list of tutorial tags\n//\n// Tutorial slug name allows letters from \"a\" to \"z\", numbers and \"-\" as valid characters.\n// Unicode letters are also allowed.\n//\n// The list of authors and editors must be a newline separated list of addresses.\nfunc SubmitCreationProposal(\n\tproposalTitle,\n\tproposalDescription,\n\ttutorialSlug,\n\ttutorialTitle,\n\ttutorialContentHash,\n\ttutorialContentURL,\n\ttutorialAuthors,\n\ttutorialEditors,\n\ttutorialTags string,\n) uint64 {\n\tassertRealmIsNotLocked()\n\tassertSlugIsAvailable(tutorialSlug)\n\tblog.AssertTitleIsNotEmpty(tutorialTitle)\n\tblog.AssertIsSlug(tutorialSlug)\n\tblog.AssertIsSha256Hash(tutorialContentHash)\n\tblog.AssertIsContentURL(tutorialContentURL)\n\n\ttags := strings.Fields(tutorialTags)\n\tassertValidTags(tags)\n\n\tauthors := blog.MustParseStringToAddresses(tutorialAuthors)\n\tif len(authors) == 0 {\n\t\tpanic(\"tutorial authors must have at least one author's address\")\n\t}\n\n\tstrategy := creationStrategy{\n\t\tslug: tutorialSlug,\n\t\ttitle: strings.TrimSpace(tutorialTitle),\n\t\tcontentHash: tutorialContentHash,\n\t\tcontentURL: tutorialContentURL,\n\t\tauthors: authors,\n\t\teditors: blog.MustParseStringToAddresses(tutorialEditors),\n\t\ttags: tags,\n\t}\n\tid := gnomeDAO.SubmitCustomProposal(proposalTitle, proposalDescription, strategy, tutorialsPath)\n\treturn uint64(id)\n}\n\n// SubmitModificationProposal submits a new proposal to modify a tutorial.\n//\n// Proposal requires a 51% quorum, otherwise the outcome will be low participation.\n// Tally is done by absolute majority, so all abstentions are considered.\n//\n// Parameters:\n// - proposalTitle: A title for the proposal (required)\n// - proposalDescription: A description of the proposal\n// - tutorialSlug: Slug name of the tutorial (required)\n// - tutorialTitle: A title for the tutorial\n// - tutorialContentHash: A SHA256 hash of the new tutorial's content\n// - tutorialCurrentContentHash: A SHA256 hash of the current tutorial's content\n// - tutorialContentURL: A URL where the new tutorial's content is currently available\n// - tutorialNewAuthors: List of author addresses\n// - tutorialNewEditors:\tList of editor addresses\n// - tutorialTags: Space separated list of tutorial tags\n//\n// Tutorial slug name allows letters from \"a\" to \"z\", numbers and \"-\" as valid characters.\n// Unicode letters are also allowed.\n//\n// The list of new authors and editors must be a newline separated list of addresses.\n// If present, authors and editors are appended to the current list of authors and editors.\nfunc SubmitModificationProposal(\n\tproposalTitle,\n\tproposalDescription,\n\ttutorialSlug,\n\ttutorialTitle,\n\ttutorialContentHash,\n\ttutorialCurrentContentHash,\n\ttutorialContentURL,\n\ttutorialNewAuthors,\n\ttutorialNewEditors,\n\ttutorialTags string,\n) uint64 {\n\tassertRealmIsNotLocked()\n\n\ttutorialSlug = strings.TrimSpace(tutorialSlug)\n\tassertTutorialExists(tutorialSlug)\n\n\ttags := strings.Fields(tutorialTags)\n\tassertValidTags(tags)\n\n\ttutorialContentHash = strings.TrimSpace(tutorialContentHash)\n\tif tutorialContentHash != \"\" {\n\t\ttutorialCurrentContentHash = strings.TrimSpace(tutorialCurrentContentHash)\n\t\tif tutorialCurrentContentHash == \"\" {\n\t\t\tpanic(\"the current content hash of the tutorial to modify is required\")\n\t\t}\n\n\t\tblog.AssertIsSha256Hash(tutorialContentHash)\n\t\tblog.AssertIsSha256Hash(tutorialCurrentContentHash)\n\t\tblog.AssertIsContentURL(tutorialContentURL)\n\t}\n\n\tstrategy := modificationStrategy{\n\t\tslug: tutorialSlug,\n\t\ttitle: strings.TrimSpace(tutorialTitle),\n\t\tcontentHash: tutorialContentHash,\n\t\tcurrentContentHash: tutorialCurrentContentHash,\n\t\tcontentURL: tutorialContentURL,\n\t\tauthors: blog.MustParseStringToAddresses(tutorialNewAuthors),\n\t\teditors: blog.MustParseStringToAddresses(tutorialNewEditors),\n\t\ttags: tags,\n\t}\n\tid := gnomeDAO.SubmitCustomProposal(proposalTitle, proposalDescription, strategy, tutorialsPath)\n\treturn uint64(id)\n}\n\n// SubmitDeletionProposal submits a new proposal to delete a tutorial.\n//\n// Proposal requires a 51% quorum, otherwise the outcome will be low participation.\n// Tally is done by absolute majority, so all abstentions are considered.\n//\n// Parameters:\n// - proposalTitle: A title for the proposal (required)\n// - proposalDescription: A description of the proposal\n// - tutorialSlug: Slug name of the tutorial (required)\nfunc SubmitDeletionProposal(proposalTitle, proposalDescription, tutorialSlug string) uint64 {\n\tassertRealmIsNotLocked()\n\n\ttutorialSlug = strings.TrimSpace(tutorialSlug)\n\tassertTutorialExists(tutorialSlug)\n\n\tstrategy := deletionStrategy{tutorialSlug}\n\tid := gnomeDAO.SubmitCustomProposal(proposalTitle, proposalDescription, strategy, tutorialsPath)\n\treturn uint64(id)\n}\n\n// SubmitLockingProposal submits a new proposal to lock the realm.\n//\n// Locking the realm \"freezes the state\" by disallowing further modifications.\n// State must be locked to migrate the realm to a newer version.\n//\n// Proposal requires a 33% quorum, otherwise the outcome will be low participation.\n// This type of proposal can only be created by members with `admin` role.\n// Tally is done by plurality.\n//\n// Parameters:\n// - proposalTitle: A title for the proposal (required)\n// - proposalDescription: A description of the proposal\n// - realmPath: Path of the realm that should be allowed to import state data\n//\n// The optional realm path authorizes a realm to import the state data once the realm is locked.\nfunc SubmitLockingProposal(proposalTitle, proposalDescription, realmPath string) uint64 {\n\tassertHasAdminRole(std.GetOrigCaller())\n\n\tif realmPath != \"\" \u0026\u0026 !strings.HasPrefix(realmPath, \"gno.land/r/\") {\n\t\tpanic(`realm path must start with \"gno.land/r/\"`)\n\t}\n\n\tstrategy := lockingStrategy{realmPath}\n\tid := gnomeDAO.SubmitCustomProposal(proposalTitle, proposalDescription, strategy, tutorialsPath)\n\treturn uint64(id)\n}\n\n// SubmitParamsUpdateProposal submits a new proposal to update one or more realm parameters.\n//\n// Proposal requires a 51% quorum, otherwise the outcome will be low participation.\n// Tally is done by absolute majority, so all abstentions are considered.\n//\n// Parameters:\n// - proposalTitle: A title for the proposal (required)\n// - proposalDescription: A description of the proposal\n// - votingPeriodCreation: Voting period for tutorial creation proposals\n// - votingPeriodModification: Voting period for tutorial modification proposals\n// - votingPeriodDeletion: Voting period for tutorial deletion proposals\n// - votingPeriodLocking: Voting period for realm locking proposals\n// - votingPeriodParamsUpdate: Voting period for parameters update proposals\n//\n// Voting period is the number of days that members can vote on a proposal\n// At least one parameter value is required for creating a proposal.\nfunc SubmitParamsUpdateProposal(\n\tproposalTitle,\n\tproposalDescription string,\n\tvotingPeriodCreation,\n\tvotingPeriodModification,\n\tvotingPeriodDeletion,\n\tvotingPeriodLocking,\n\tvotingPeriodParamsUpdate int,\n) uint64 {\n\tstrategy := paramsUpdateStrategy{}\n\tif votingPeriodCreation \u003e 0 {\n\t\tperiod := time.Duration(votingPeriodCreation) * Day\n\t\tstrategy.votingPeriods.Set(StrategyNameCreation, period)\n\t}\n\n\tif votingPeriodModification \u003e 0 {\n\t\tperiod := time.Duration(votingPeriodModification) * Day\n\t\tstrategy.votingPeriods.Set(StrategyNameModification, period)\n\t}\n\n\tif votingPeriodDeletion \u003e 0 {\n\t\tperiod := time.Duration(votingPeriodDeletion) * Day\n\t\tstrategy.votingPeriods.Set(StrategyNameDeletion, period)\n\t}\n\n\tif votingPeriodLocking \u003e 0 {\n\t\tperiod := time.Duration(votingPeriodLocking) * Day\n\t\tstrategy.votingPeriods.Set(StrategyNameLocking, period)\n\t}\n\n\tif votingPeriodParamsUpdate \u003e 0 {\n\t\tperiod := time.Duration(votingPeriodParamsUpdate) * Day\n\t\tstrategy.votingPeriods.Set(StrategyNameParamsUpdate, period)\n\t}\n\n\tif strategy.votingPeriods.Size() == 0 {\n\t\tpanic(\"at least one parameter value must be specified\")\n\t}\n\n\tid := gnomeDAO.SubmitCustomProposal(proposalTitle, proposalDescription, strategy, tutorialsPath)\n\treturn uint64(id)\n}\n\nfunc assertSlugIsAvailable(slug string) {\n\tif tutorialsBlog.HasPost(slug) {\n\t\tpanic(\"tutorial URL slug already exists\")\n\t}\n}\n\nfunc assertTutorialExists(slug string) {\n\tif !tutorialsBlog.HasPost(slug) {\n\t\tpanic(\"tutorial not found\")\n\t}\n}\n\nfunc assertValidTags(tags []string) {\n\tfor _, t := range tags {\n\t\tif !blog.IsSlug(t) {\n\t\t\tpanic(\"invalid tag: \" + t)\n\t\t}\n\t}\n}\n\nfunc assertHasAdminRole(addr std.Address) {\n\tdao := gnomeDAO.GetDAO(tutorialsPath)\n\tm, found := getMember(dao, addr)\n\tif !found {\n\t\tpanic(\"address is not a member of tutorials DAO: \" + addr.String())\n\t}\n\n\tfor _, r := range m.Roles {\n\t\tif r == gnomeDAO.RoleAdmin {\n\t\t\t// Member has admin role\n\t\t\treturn\n\t\t}\n\t}\n\n\tpanic(\"member doesn't have admin role: \" + addr.String())\n}\n\nfunc getMember(dao gnome.InvarDAO, addr std.Address) (gnome.Member, bool) {\n\tfor _, m := range dao.Members() {\n\t\tif m.Address == addr {\n\t\t\treturn m, true\n\t\t}\n\t}\n\treturn gnome.Member{}, false\n}\n"},{"name":"render.gno","body":"package tutorials\n\nimport (\n\t\"strings\"\n\t\"time\"\n\n\t\"gno.land/p/demo/mux\"\n\t\"gno.land/p/gnome/alerts\"\n\t\"gno.land/p/gnome/blog\"\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\nconst (\n\tdateFormat = \"2006-01-02 15:04 MST\"\n\tshortDateFormat = \"Jan 2, 2006\"\n)\n\nfunc renderBlog(res *mux.ResponseWriter, _ *mux.Request) {\n\t// Write header\n\tres.Write(\"# \" + tutorialsBlog.Title + \"\\n\")\n\tif tutorialsBlog.Description != \"\" {\n\t\tres.Write(tutorialsBlog.Description + \"\\n\\n\")\n\t}\n\n\t// Write tutorials menu\n\tres.Write(renderMenu() + \"\\n\\n---\\n\")\n\n\t// Write list of published tutorials\n\tnow := time.Now()\n\ttutorials.Iterate(\"\", \"\", func(p *blog.Post) bool { // TODO: Add post pagination support\n\t\t// Skip posts that should be published at a future date\n\t\tif p.PublishAt.IsZero() || p.PublishAt.After(now) {\n\t\t\treturn false\n\t\t}\n\n\t\t// Skip posts that are not published or being revised\n\t\tif p.Status != blog.StatusPublished \u0026\u0026 p.Status != blog.StatusRevised {\n\t\t\treturn false\n\t\t}\n\n\t\turl := newRealmURL(\"posts/\" + p.Slug)\n\t\tdate := p.PublishAt.UTC().Format(shortDateFormat)\n\t\tres.Write(\"**[\" + p.Title + \"](\" + url + \")**\u003c/br\u003e\")\n\t\tres.Write(\"_Published: \" + date + \"_\\n\\n\")\n\t\treturn false\n\t})\n}\n\nfunc renderPost(res *mux.ResponseWriter, req *mux.Request) {\n\tslug := req.GetVar(\"slug\")\n\tp, found := tutorialsBlog.GetPost(slug)\n\tif !found {\n\t\tres.Write(\"Post not found\")\n\t\treturn\n\t}\n\n\tif p.Status == blog.StatusRevised {\n\t\tres.Write(alerts.NewWarning(\"Tutorial content is being revised\"))\n\t}\n\n\t// TODO: Add post tags with links\n\tres.Write(\"# \" + p.Title + \"\\n\")\n\tres.Write(\"- Author(s): \" + p.Authors.String() + \"\\n\")\n\n\tif len(p.Editors) \u003e 0 {\n\t\tres.Write(\"- Editors(s): \" + p.Editors.String() + \"\\n\")\n\t}\n\n\tres.Write(\"- Publisher(s): \" + p.Publishers.String() + \"\\n\")\n\tres.Write(\"- Status: \" + p.Status.String() + \"\\n\")\n\tres.Write(\"- Content Hash: \" + p.ContentHash + \"\\n\")\n\tres.Write(\"- Created: \" + p.CreatedAt.UTC().Format(dateFormat) + \"\\n\")\n\tif !p.UpdatedAt.IsZero() {\n\t\tres.Write(\"- Updated: \" + p.UpdatedAt.UTC().Format(dateFormat) + \"\\n\")\n\t}\n\n\tif len(p.Tags) \u003e 0 {\n\t\tres.Write(\"- Tag(s): \" + renderTagLinks(p.Tags) + \"\\n\")\n\t}\n\n\tif p.Content != \"\" {\n\t\tres.Write(\"\\n\" + p.Content)\n\t}\n}\n\nfunc renderDrafts(res *mux.ResponseWriter, _ *mux.Request) {\n\tres.Write(\"# \" + tutorialsBlog.Title + \": Drafts\\n\")\n\ttutorials.Iterate(\"\", \"\", func(p *blog.Post) bool { // TODO: Add pagination support\n\t\tif p.Status != blog.StatusDraft {\n\t\t\treturn false\n\t\t}\n\n\t\turl := newRealmURL(\"posts/\" + p.Slug)\n\t\tdate := p.CreatedAt.UTC().Format(shortDateFormat)\n\t\tres.Write(\"**[\" + p.Title + \"](\" + url + \")**\u003c/br\u003e\")\n\t\tres.Write(\"_Created: \" + date + \"_\\n\\n\")\n\t\treturn false\n\t})\n}\n\nfunc renderRevisions(res *mux.ResponseWriter, _ *mux.Request) {\n\tres.Write(\"# \" + tutorialsBlog.Title + \": Revisions\\n\")\n\ttutorials.Iterate(\"\", \"\", func(p *blog.Post) bool { // TODO: Add pagination support\n\t\tif p.Status != blog.StatusRevised {\n\t\t\treturn false\n\t\t}\n\n\t\turl := newRealmURL(\"posts/\" + p.Slug)\n\t\tdate := p.PublishAt.UTC().Format(shortDateFormat)\n\t\tres.Write(\"**[\" + p.Title + \"](\" + url + \")**\u003c/br\u003e\")\n\t\tres.Write(\"_Published: \" + date + \"_\\n\\n\")\n\t\treturn false\n\t})\n}\n\nfunc renderTags(res *mux.ResponseWriter, req *mux.Request) {\n\tres.Write(\"# \" + tutorialsBlog.Title + \": Tags\\n\")\n\ttags.IterateTags(func(tag string) bool {\n\t\tres.Write(\"- [\" + tag + \"](\" + newRealmURL(\"tags/\"+tag) + \")\\n\")\n\t\treturn false\n\t})\n}\n\nfunc renderPostsByTag(res *mux.ResponseWriter, req *mux.Request) {\n\ttag := req.GetVar(\"name\")\n\tres.Write(\"# \" + tutorialsBlog.Title + \": Tag `\" + tag + \"`\\n\")\n\n\tif tag == \"\" {\n\t\treturn\n\t}\n\n\ttags.IteratePosts(tag, func(p *blog.Post) bool {\n\t\tif p.Status != blog.StatusPublished \u0026\u0026 p.Status != blog.StatusRevised {\n\t\t\treturn false\n\t\t}\n\n\t\turl := newRealmURL(\"posts/\" + p.Slug)\n\t\tdate := p.PublishAt.UTC().Format(shortDateFormat)\n\t\tres.Write(\"**[\" + p.Title + \"](\" + url + \")**\u003c/br\u003e\")\n\t\tres.Write(\"_Published: \" + date + \"_\\n\\n\")\n\t\treturn false\n\t})\n}\n\nfunc renderParams(res *mux.ResponseWriter, _ *mux.Request) {\n\tres.Write(\"# \" + tutorialsBlog.Title + \": Parameters\\n\")\n\tres.Write(\"## Proposal\\n\")\n\tres.Write(\"**Voting Periods**\\n\")\n\tparameters.VotingPeriods.Iterate(func(name string, period time.Duration) bool {\n\t\tres.Write(\"- `\" + name + \"`: \" + gnome.HumanizeDuration(period) + \"\\n\")\n\t\treturn false\n\t})\n}\n\nfunc renderAlerts() string {\n\tif locked {\n\t\tmsg := \"Realm is locked\"\n\t\tif nextVersionRealmPath != \"\" {\n\t\t\tlink := alerts.NewLink(\"https://\"+nextVersionRealmPath, nextVersionRealmPath)\n\t\t\tmsg += \"\u003c/br\u003eThis realm is deprecated in favor of a new version found at \" + link\n\t\t}\n\n\t\treturn alerts.NewError(msg)\n\t}\n\treturn \"\"\n}\n\nfunc renderMenu() string {\n\titems := []string{\n\t\t\"**[drafts](\" + newRealmURL(\"drafts\") + \")**\",\n\t\t\"**[revisions](\" + newRealmURL(\"revisions\") + \")**\",\n\t}\n\n\t// Add taxonomy entries\n\ttags.IterateTags(func(tag string) bool {\n\t\titems = append(items, \"**[\"+tag+\"](\"+newRealmURL(\"tags/\"+tag)+\")**\")\n\t\treturn false\n\t})\n\n\treturn strings.Join(items, \" \")\n}\n\nfunc renderTagLinks(tags []string) string {\n\tvar links []string\n\tfor _, t := range tags {\n\t\tlinks = append(links, \"[\"+t+\"](\"+newRealmURL(\"tags/\"+t)+\")\")\n\t}\n\treturn strings.Join(links, \", \")\n}\n\nfunc newRealmURL(renderPath string) string {\n\t// TODO: Get the prefix for the current realm package path\n\treturn \"/r/gnome/tutorials/pre2:\" + renderPath\n}\n"},{"name":"strategy_lock.gno","body":"package tutorials\n\nimport (\n\t\"errors\"\n\t\"time\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\ntype lockingStrategy struct {\n\trealmPath string\n}\n\nfunc (lockingStrategy) Name() string {\n\treturn StrategyNameLocking\n}\n\nfunc (lockingStrategy) Quorum() float64 {\n\treturn 0.33\n}\n\nfunc (lockingStrategy) VotingPeriod() time.Duration {\n\tperiod, _ := parameters.VotingPeriods.Get(StrategyNameLocking)\n\treturn period\n}\n\nfunc (lockingStrategy) VoteChoices() []gnome.VoteChoice {\n\treturn []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo}\n}\n\nfunc (s lockingStrategy) Validate(*gnome.Proposal) error {\n\t// Allow modification of the newxt version package path when realm is locked\n\tif locked \u0026\u0026 nextVersionRealmPath == \"\" \u0026\u0026 s.realmPath != \"\" {\n\t\treturn nil\n\t}\n\n\tif locked {\n\t\treturn errors.New(\"realm is already locked\")\n\t}\n\treturn nil\n}\n\nfunc (lockingStrategy) Tally(_ *gnome.DAO, r gnome.VotingRecord) gnome.VoteChoice {\n\tif choice, ok := gnome.SelectChoiceByPlurality(r); ok {\n\t\treturn choice\n\t}\n\treturn gnome.ChoiceNone\n}\n\nfunc (s lockingStrategy) Execute(*gnome.DAO) error {\n\tlocked = true\n\tif s.realmPath != \"\" {\n\t\tnextVersionRealmPath = s.realmPath\n\t}\n\treturn nil\n}\n\nfunc (s lockingStrategy) RenderParams() string {\n\tif s.realmPath != \"\" {\n\t\treturn \"Next Realm Path: [\" + s.realmPath + \"](https://\" + s.realmPath + \")\"\n\t}\n\treturn \"\"\n}\n"},{"name":"strategy_params.gno","body":"package tutorials\n\nimport (\n\t\"strings\"\n\t\"time\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\ntype paramsUpdateStrategy struct {\n\tvotingPeriods gnome.DurationParams\n}\n\nfunc (paramsUpdateStrategy) Name() string {\n\treturn StrategyNameParamsUpdate\n}\n\nfunc (paramsUpdateStrategy) Quorum() float64 {\n\treturn 0.51\n}\n\nfunc (paramsUpdateStrategy) VotingPeriod() time.Duration {\n\tperiod, _ := parameters.VotingPeriods.Get(StrategyNameParamsUpdate)\n\treturn period\n}\n\nfunc (paramsUpdateStrategy) VoteChoices() []gnome.VoteChoice {\n\treturn []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo}\n}\n\nfunc (paramsUpdateStrategy) Tally(dao *gnome.DAO, r gnome.VotingRecord) gnome.VoteChoice {\n\tabstentions := len(dao.Members()) - r.VoteCount()\n\tif choice, ok := gnome.SelectChoiceByMajority(r, abstentions); ok {\n\t\treturn choice\n\t}\n\treturn gnome.ChoiceNone\n}\n\nfunc (s paramsUpdateStrategy) Execute(*gnome.DAO) error {\n\ts.votingPeriods.Iterate(func(name string, period time.Duration) bool {\n\t\tparameters.VotingPeriods.Set(name, period)\n\t\treturn false\n\t})\n\treturn nil\n}\n\nfunc (s paramsUpdateStrategy) RenderParams() string {\n\tvar b strings.Builder\n\n\tb.WriteString(\"|||\\n|---|---|\\n\")\n\ts.votingPeriods.Iterate(func(name string, period time.Duration) bool {\n\t\tb.WriteString(\"| Voting Period for `\" + name + \"`: | \" + gnome.HumanizeDuration(period) + \" |\\n\")\n\t\treturn false\n\t})\n\n\treturn b.String()\n}\n"},{"name":"strategy_tutorials.gno","body":"package tutorials\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"time\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/gnome/blog\"\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\ntype creationStrategy struct {\n\tslug, title, contentHash, contentURL string\n\tauthors, editors blog.AddressList\n\ttags []string\n}\n\nfunc (creationStrategy) Name() string {\n\treturn StrategyNameCreation\n}\n\nfunc (creationStrategy) Quorum() float64 {\n\treturn 0.51\n}\n\nfunc (creationStrategy) VotingPeriod() time.Duration {\n\tperiod, _ := parameters.VotingPeriods.Get(StrategyNameCreation)\n\treturn period\n}\n\nfunc (creationStrategy) VoteChoices() []gnome.VoteChoice {\n\treturn []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo}\n}\n\nfunc (s creationStrategy) Validate(*gnome.Proposal) error {\n\tif tutorialsBlog.HasPost(s.slug) {\n\t\treturn errors.New(\"tutorial URL slug already exists\")\n\t}\n\treturn nil\n}\n\nfunc (creationStrategy) Tally(dao *gnome.DAO, r gnome.VotingRecord) gnome.VoteChoice {\n\tabstentions := len(dao.Members()) - r.VoteCount()\n\tif choice, ok := gnome.SelectChoiceByMajority(r, abstentions); ok {\n\t\treturn choice\n\t}\n\treturn gnome.ChoiceNone\n}\n\nfunc (s creationStrategy) Execute(*gnome.DAO) error {\n\tp := \u0026blog.Post{ // TODO: Support other fields like summary and tags\n\t\tSlug: s.slug,\n\t\tTitle: s.title,\n\t\tContentHash: s.contentHash,\n\t\tAuthors: s.authors,\n\t\tEditors: s.editors,\n\t\tStatus: blog.StatusDraft,\n\t\tTags: s.tags,\n\t\tCreatedAt: time.Now(),\n\t}\n\ttutorialsBlog.AddPost(p)\n\n\t// Update realm indexes\n\ttutorials.Index(p)\n\tif len(p.Tags) \u003e 0 {\n\t\ttags.Index(p)\n\t}\n\n\treturn nil\n}\n\nfunc (s creationStrategy) RenderParams() string {\n\tvar (\n\t\tb strings.Builder\n\t\tauthors = strings.ReplaceAll(s.authors.String(), \", \", \"\u003c/br\u003e\")\n\t)\n\n\t// TODO: Implement using gno.land/p/demo/ui\n\tb.WriteString(\"|||\\n|---|---|\\n\")\n\tb.WriteString(\"| Slug: | \" + s.slug + \" |\\n\")\n\tb.WriteString(\"| Title: | \" + gnome.EscapeHTML(s.title) + \" |\\n\")\n\tb.WriteString(\"| Content URL: | \" + gnome.NewLinkURI(s.contentURL) + \" |\\n\")\n\tb.WriteString(\"| Content Hash: | \" + s.contentHash + \" |\\n\")\n\n\tif len(s.tags) \u003e 0 {\n\t\tb.WriteString(\"| Tag(s): | \" + renderTagLinks(s.tags) + \" |\\n\")\n\t}\n\n\tb.WriteString(\"| Author(s): | \u003c/br\u003e\" + authors + \"\u003c/br\u003e\u003c/br\u003e |\\n\")\n\n\tif len(s.editors) \u003e 0 {\n\t\teditors := strings.ReplaceAll(s.editors.String(), \", \", \"\u003c/br\u003e\")\n\t\tb.WriteString(\"| Editor(s): | \u003c/br\u003e\" + editors + \"\u003c/br\u003e\u003c/br\u003e |\\n\")\n\t}\n\n\treturn b.String()\n}\n\ntype modificationStrategy struct {\n\tslug, title, currentContentHash, contentHash, contentURL string\n\tauthors, editors blog.AddressList\n\ttags []string\n}\n\nfunc (modificationStrategy) Name() string {\n\treturn StrategyNameModification\n}\n\nfunc (modificationStrategy) Quorum() float64 {\n\treturn 0.51\n}\n\nfunc (modificationStrategy) VotingPeriod() time.Duration {\n\tperiod, _ := parameters.VotingPeriods.Get(StrategyNameModification)\n\treturn period\n}\n\nfunc (modificationStrategy) VoteChoices() []gnome.VoteChoice {\n\treturn []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo}\n}\n\nfunc (s modificationStrategy) Validate(*gnome.Proposal) error {\n\tp, found := tutorialsBlog.GetPost(s.slug)\n\tif !found {\n\t\treturn errors.New(\"tutorial doesn't exists\")\n\t}\n\n\tif s.currentContentHash != \"\" \u0026\u0026 s.currentContentHash != p.ContentHash {\n\t\treturn errors.New(\"tutorial's content has been previously modified\")\n\t}\n\n\tfor _, addr := range s.authors {\n\t\tif p.Authors.HasAddress(addr) {\n\t\t\treturn errors.New(\"author already exists: \" + addr.String())\n\t\t}\n\t}\n\n\tfor _, addr := range s.editors {\n\t\tif p.Authors.HasAddress(addr) {\n\t\t\treturn errors.New(\"editor already exists: \" + addr.String())\n\t\t}\n\t}\n\n\tif len(s.tags) \u003e 0 {\n\t\tvar seenTags avl.Tree\n\t\tfor _, t := range s.tags {\n\t\t\tif seenTags.Has(t) {\n\t\t\t\treturn errors.New(\"duplicated tag: \" + t)\n\t\t\t}\n\n\t\t\tseenTags.Set(t, struct{}{})\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (modificationStrategy) Tally(dao *gnome.DAO, r gnome.VotingRecord) gnome.VoteChoice {\n\tabstentions := len(dao.Members()) - r.VoteCount()\n\tif choice, ok := gnome.SelectChoiceByMajority(r, abstentions); ok {\n\t\treturn choice\n\t}\n\treturn gnome.ChoiceNone\n}\n\nfunc (s modificationStrategy) Execute(*gnome.DAO) error {\n\tp, _ := tutorialsBlog.GetPost(s.slug)\n\n\tif s.title != \"\" {\n\t\tp.Title = s.title\n\t}\n\n\tif len(s.authors) \u003e 0 {\n\t\tp.Authors = append(p.Authors, s.authors...)\n\t}\n\n\tif len(s.editors) \u003e 0 {\n\t\tp.Editors = append(p.Editors, s.editors...)\n\t}\n\n\t// Update tag index\n\tif len(s.tags) \u003e 0 {\n\t\ttags.Remove(p)\n\t\tp.Tags = s.tags\n\t\ttags.Index(p)\n\t}\n\n\t// Changing content hash converts post to a revised until new content is setted\n\tif s.contentHash != \"\" {\n\t\tp.Status = blog.StatusRevised\n\t\tp.ContentHash = s.contentHash\n\t}\n\n\tp.UpdatedAt = time.Now()\n\treturn nil\n}\n\nfunc (s modificationStrategy) RenderParams() string {\n\tvar b strings.Builder\n\n\t// TODO: Implement using gno.land/p/demo/ui\n\tb.WriteString(\"|||\\n|---|---|\\n\")\n\tb.WriteString(\"| Slug: | [\" + s.slug + \"](\" + newRealmURL(\"posts/\"+s.slug) + \") |\\n\")\n\n\tif s.title != \"\" {\n\t\tb.WriteString(\"| Title: | \" + gnome.EscapeHTML(s.title) + \" |\\n\")\n\t}\n\n\tif s.contentHash != \"\" {\n\t\tb.WriteString(\"| Content URL: | \" + gnome.NewLinkURI(s.contentURL) + \" |\\n\")\n\t\tb.WriteString(\"| Content Hash: | \" + s.contentHash + \" |\\n\")\n\t\tb.WriteString(\"| Modifies Content Hash: | \" + s.currentContentHash + \" |\\n\")\n\t}\n\n\tif len(s.tags) \u003e 0 {\n\t\tb.WriteString(\"| Tag(s): | \" + renderTagLinks(s.tags) + \" |\\n\")\n\t}\n\n\tif len(s.authors) \u003e 0 {\n\t\tauthors := strings.ReplaceAll(s.authors.String(), \", \", \"\u003c/br\u003e\")\n\t\tb.WriteString(\"| Author(s): | \u003c/br\u003e\" + authors + \"\u003c/br\u003e\u003c/br\u003e |\\n\")\n\t}\n\n\tif len(s.editors) \u003e 0 {\n\t\teditors := strings.ReplaceAll(s.editors.String(), \", \", \"\u003c/br\u003e\")\n\t\tb.WriteString(\"| Editor(s): | \u003c/br\u003e\" + editors + \"\u003c/br\u003e\u003c/br\u003e |\\n\")\n\t}\n\n\treturn b.String()\n}\n\ntype deletionStrategy struct {\n\tslug string\n}\n\nfunc (deletionStrategy) Name() string {\n\treturn StrategyNameDeletion\n}\n\nfunc (deletionStrategy) Quorum() float64 {\n\treturn 0.51\n}\n\nfunc (deletionStrategy) VotingPeriod() time.Duration {\n\tperiod, _ := parameters.VotingPeriods.Get(StrategyNameDeletion)\n\treturn period\n}\n\nfunc (deletionStrategy) VoteChoices() []gnome.VoteChoice {\n\treturn []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo}\n}\n\nfunc (deletionStrategy) Tally(dao *gnome.DAO, r gnome.VotingRecord) gnome.VoteChoice {\n\tabstentions := len(dao.Members()) - r.VoteCount()\n\tif choice, ok := gnome.SelectChoiceByMajority(r, abstentions); ok {\n\t\treturn choice\n\t}\n\treturn gnome.ChoiceNone\n}\n\nfunc (s deletionStrategy) Validate(*gnome.Proposal) error {\n\tif !tutorialsBlog.HasPost(s.slug) {\n\t\treturn errors.New(\"tutorial doesn't exists\")\n\t}\n\treturn nil\n}\n\nfunc (s deletionStrategy) Execute(*gnome.DAO) error {\n\tp, found := tutorialsBlog.RemovePost(s.slug)\n\tif !found {\n\t\treturn errors.New(\"tutorial not found\")\n\t}\n\n\t// Update realm indexes\n\ttutorials.Remove(p)\n\tif len(p.Tags) \u003e 0 {\n\t\ttags.Remove(p)\n\t}\n\n\treturn nil\n}\n\nfunc (s deletionStrategy) RenderParams() string {\n\treturn \"Slug: [\" + s.slug + \"](\" + newRealmURL(\"posts/\"+s.slug) + \")\"\n}\n"},{"name":"tutorials.gno","body":"package tutorials\n\nimport (\n\t\"gno.land/p/gnome/blog\"\n)\n\nvar (\n\tlocked bool\n\tnextVersionRealmPath string\n\n\ttutorialsBlog = blog.Blog{Title: \"Gno.me Tutorials\"} // TODO: Define a realm description\n)\n\nfunc mustGetPost(slug string) *blog.Post {\n\tp, found := tutorialsBlog.GetPost(slug)\n\tif !found {\n\t\tpanic(\"tutorial not found\")\n\t}\n\treturn p\n}\n\nfunc assertRealmIsNotLocked() {\n\tif locked {\n\t\tpanic(\"realm is locked\")\n\t}\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"21000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"QCjjqJTuFSeI6jLjYL5jzgU+7qxqzzed+QKgJJxTfP1Ab+PGSjn1Lktv+fe/82lExpMmt+JoPX1zhYLbnV8lYQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun","send":"","pkg_path":"gno.land/r/gnome/dao/pre1","func":"SubmitSubDAOCreationProposal","args":["Create a \"Community\" SubDAO","","council/main","community","Community","The Community DAO is responsible for adding and voting on new SubDAO sections that will be part of the Gno.me ecosystem. Gno.me is a community and educational platform therefore the Community DAO is responsible for adding and voting on sections needed for Gno.me: tutorials, new events and more that will be aggregated and added to the Gno.me Home/Ecosystem.","g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun dev\ng125t352u4pmdrr57emc4pe04y40sknr5ztng5mt dev\ng1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5 eco-dev"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ay9E9vYxidhNWLXiUvtj4yWhyi/GZx3EVvbQRROLMkDw"},"signature":"L0dgQmmk9pzyWePyt9jSLWJg4PFEbcJaKkK7bkhHUt8bmi16CnVFQ6BQ0cco8uYJhf1+zB23Pv33yCFYh5RXBA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun","send":"","pkg_path":"gno.land/r/gnome/dao/pre1","func":"Vote","args":["1","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ay9E9vYxidhNWLXiUvtj4yWhyi/GZx3EVvbQRROLMkDw"},"signature":"uxfFjB3bgdOxTGdOYnm9I0Tc3wmsder7q/6nGgmqY9gXYuaVSB44rx6ProHjyMaf/TpdYKW9x76armoYoVO45A=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","send":"","pkg_path":"gno.land/r/gnome/dao/pre1","func":"Vote","args":["0","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"x8yP6pk2+8mG9RrAlgb4vSFfTtTPSUi2PS6CdoWOn6gMUdLjK/kKOoRw7UN8egzFKORD1+p4214WZUjQIB4PFg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g125t352u4pmdrr57emc4pe04y40sknr5ztng5mt","send":"","pkg_path":"gno.land/r/gnome/dao/pre1","func":"Vote","args":["1","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AkNQ8NiWDgbeVckfYHjA25f8LNZTWhWdiBxOJGuNnqBg"},"signature":"jupkl4zG7dCVNPIc7oSy4rvHbzAQD0cdTlrcx7qcErAdvQPK0P5COru7mNAxS2o0A42bRvSgmLdg2E+0d7ovVQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","send":"","pkg_path":"gno.land/r/gnome/dao/pre1","func":"Vote","args":["1","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"DmQthy4jIorzYSAKMSqTHy4baLbaVl65UH7d2CyQnHVIT/s5L5AYeD3SjmFBW5AG5p0cULP67wQ4Y3Vr3PzvhA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g125t352u4pmdrr57emc4pe04y40sknr5ztng5mt","send":"","pkg_path":"gno.land/r/gnome/dao/pre1","func":"AdvanceProposals","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AkNQ8NiWDgbeVckfYHjA25f8LNZTWhWdiBxOJGuNnqBg"},"signature":"jHZtCjorak5FNXdKkO5KQvPuaEi9f/nwsrnq3Gd00bt8ZmOf/BH30jX7P9X+nBrt6AcKBKoBPzZlalqAQqTVyg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun","send":"","pkg_path":"gno.land/r/gnome/dao/pre1","func":"SubmitSubDAOCreationProposal","args":["Create a \"Tutorials\" SubDAO","","council/main/community","tutorials","Tutorials","Tutorials DAO is responsible for adding and voting on new tutorials for the Gno language and gno.land ecosystem.","g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun dev\ng125t352u4pmdrr57emc4pe04y40sknr5ztng5mt dev\ng1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5 eco-dev"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ay9E9vYxidhNWLXiUvtj4yWhyi/GZx3EVvbQRROLMkDw"},"signature":"LSJRxciV1/2zkrKQZ0OXsEkBWjnhqjCzf7F5/NyHS+xPFyBecGXi2m9CjI3OK+60KJeePwe3oolUbRIQrjeVwA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun","send":"","pkg_path":"gno.land/r/gnome/dao/pre1","func":"Vote","args":["2","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ay9E9vYxidhNWLXiUvtj4yWhyi/GZx3EVvbQRROLMkDw"},"signature":"/0Hu3iQKftOIoua176dfwnDi4LrznbUl7g9DtHZJ8noi8V4qqiZW/4ijl1n4fRjOODnrXpkvOWDw3aPdcaW0tw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","send":"","pkg_path":"gno.land/r/gnome/dao/pre1","func":"Vote","args":["2","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"GKq+hdrFNz7AhRrWOPHOiArKE9UpadRzc4d8BdExyrVzJO8Z+pgP3LHuCza5NW91288MPCFBlJ3pgENUkWVh6w=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g125t352u4pmdrr57emc4pe04y40sknr5ztng5mt","send":"","pkg_path":"gno.land/r/gnome/dao/pre1","func":"Vote","args":["2","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AkNQ8NiWDgbeVckfYHjA25f8LNZTWhWdiBxOJGuNnqBg"},"signature":"7KsjJvwOaH6gYxLA4JGWqUjc1H2rAShIi9+MXGwUtfJFdU7WozzeoS2L4UcyDYs4dZTasbLcBK4wWNg7+6ulAg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g125t352u4pmdrr57emc4pe04y40sknr5ztng5mt","send":"","pkg_path":"gno.land/r/gnome/tutorials/pre1","func":"SubmitLockingProposal","args":["Lock Ream in Favour of a New Version","This version has an issue with the link URLs.","gno.land/r/gnome/tutorials/pre2"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AkNQ8NiWDgbeVckfYHjA25f8LNZTWhWdiBxOJGuNnqBg"},"signature":"pAES90j6bGzg9kSf5mUHOuIn49auAjwiwSKq2K5QGGkyTpamJtNXO7cKaeE8Z2QMwoqOeAF9qQX+WPNEBjwx/g=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g125t352u4pmdrr57emc4pe04y40sknr5ztng5mt","send":"","pkg_path":"gno.land/r/gnome/dao/pre1","func":"AdvanceProposals","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AkNQ8NiWDgbeVckfYHjA25f8LNZTWhWdiBxOJGuNnqBg"},"signature":"3g0i9aKtngZQvUc+A/2U2SGpBaimFUE8iBM3YDeHfsg2oKrvUHnky+buI5/syREGVGJyqqVI/qB+K2rz5fLgRQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g125t352u4pmdrr57emc4pe04y40sknr5ztng5mt","send":"","pkg_path":"gno.land/r/gnome/tutorials/pre1","func":"SubmitLockingProposal","args":["Lock Ream in Favour of a New Version","This version has an issue with the link URLs.","gno.land/r/gnome/tutorials/pre2"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AkNQ8NiWDgbeVckfYHjA25f8LNZTWhWdiBxOJGuNnqBg"},"signature":"8YtATolIazDb5XFCal/iPKSSuBdN3718DVvMMbz6OGgA/DI2wBV6SZyz0IP11W9uQ78gZiHXpKUuU+tou9Zn7g=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"tutorials","path":"gno.land/r/gnome/tutorials/pre3","files":[{"name":"LICENSE","body":"Copyright (c) 2024. All rights reserved.\n\nProject Owner:\nNewTendermint, LLC\n\nProject Maintainer:\nİlker Göktuğ ÖZTÜRK. \u003cilker@ilgooz.com\u003e, \u003cilkergoktugozturk@gmail.com\u003e\n\nYour access to this Project and your contributions to this Project are subject\nto the following terms:\n\n* You hereby grant to the listed Owner and Maintainer of this Project the\nworldwide, irrevocable and royalty-free right to use, publish, relicense and\nsublicense your contributions under any non-exclusive license of their\nchoosing for commercial and non-commercial purposes.\n* You shall not attempt to bring any intellectual property infringement or\nmisappropriation claims against the Owner or Maintainer of this Project\nrelating to or arising from your contributions.\n* You represent that you are the sole owner of all rights in your\ncontributions and that no third party has any rights or interests therein.\n\nFOR THE SCOPE OF THIS LICENSE, A CONTRIBUTION IS DEFINED TO INCLUDE ANY WORKS,\nIDEAS, CODE, PROCESSES, OR APIS MADE AVAILABLE TO VIEW BY THE GENERAL PUBLIC\n(INCLUDING ANY PUBLICLY ACCESSIBLE INTERNET FORUMS AND CHAT SERVERS WHERE\nACCESS IS AVAILABLE FOR FREE WITH REGISTRATION) OR PRIVATELY TO THIS PROJECT'S\nOWNER AND MAINTAINERS; INCLUDING WORKS, IDEAS, CODE, PROCESSES, AND APIS THAT\nARE ABOUT THIS PROJECT AND ITS CONTRIBUTIONS, OR MENTIONED IN REFERENCE TO\nTHIS PROJECT, WHERE SUCH WORKS, IDEAS, CODE, PROCESSES, AND APIS ARE MATERIAL\nTO THE SUCCESS, IMPROVEMENT, OR COMPLETION OF THIS PROJECT, AS DETERMINED BY\nTHE OWNER OF THIS PROJECT.\n\nContributions may come in any form, and include (but are not limited to):\n\n* pull requests\n* diff patches\n* commentary\n* example code\n\nIf you do not want your contribution to become incorporated into this Project,\ndo not make contributions to this Project. The creation of contributions that\nmay in the future become known to this Project's Owner and Maintainer\nconstitutes a willing contribution to this Project in accordance with this\nlicense.\n\nTHIS PROJECT AND THE WORKS AVAILABLE THROUGH THIS PROJECT ARE PROVIDED “AS IS”\nAND WITHOUT WARRANTY OF ANY KIND. IN NO EVENT SHALL THE OWNER OR MAINTAINER OF\nTHIS PROJECT BE LIABLE TO YOU OR ANY THIRD PARTY FOR ANY CLAIM, DAMAGES OR\nOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THIS PROJECT OR THE WORKS AVAILABLE THROUGH\nTHIS PROJECT. YOU AGREED TO INDEMNIFY, DEFEND AND HOLD THE OWNER AND\nMAINTAINER FROM AND AGAINST ANY CLAIMS, LOSSES OR DAMAGES ARISING FROM YOUR\nUSE OF THIS PROJECT OR THE WORKS AVAILABLE THROUGH THIS PROJECT.\n\nThis license is subject to change at any time by the Project Owner or\nMaintainer.\n\nYour continued access to or use of this Project or any works\navailable through this Project shall be subject to the then-current version\nof this license.\n\nThe Project Owner and Maintainer reserve the right to change this license\nwithout needing the consent of the contributors to this Project.\n"},{"name":"indexes.gno","body":"package tutorials\n\nimport (\n\t\"time\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/gnome/blog\"\n)\n\nconst keyDateFmt = \"2006-01-02T15:04:05\"\n\nvar (\n\ttags tagIndex\n\ttutorials tutorialIndex\n)\n\ntype tagIndex struct {\n\tindex avl.Tree // string(tag) -\u003e *tutorialIndex\n}\n\nfunc (x *tagIndex) Index(p *blog.Post) (indexed bool) {\n\tif p == nil {\n\t\treturn\n\t}\n\n\tfor _, tag := range p.Tags {\n\t\t// Get the tutorials for the current tag\n\t\tvar (\n\t\t\tidx *tutorialIndex\n\t\t\tv, found = x.index.Get(tag)\n\t\t)\n\n\t\tif found {\n\t\t\tidx = v.(*tutorialIndex)\n\t\t} else {\n\t\t\tidx = \u0026tutorialIndex{}\n\t\t}\n\n\t\t// Index the tutorial\n\t\tidx.Index(p)\n\n\t\t// Keep track of indexing success\n\t\tindexed = x.index.Set(tag, idx) || indexed\n\t}\n\treturn\n}\n\nfunc (x *tagIndex) Remove(p *blog.Post) (removed bool) {\n\tif p == nil {\n\t\treturn\n\t}\n\n\tfor _, tag := range p.Tags {\n\t\tv, found := x.index.Get(tag)\n\t\tif !found {\n\t\t\t// Ignore tags that are not indexed\n\t\t\tcontinue\n\t\t}\n\n\t\tidx := v.(*tutorialIndex)\n\t\tif idx.Remove(p) \u0026\u0026 !removed {\n\t\t\tremoved = true\n\t\t}\n\n\t\tif idx.Size() == 0 {\n\t\t\t// Remove the tag from the index when empty\n\t\t\tx.index.Remove(tag)\n\t\t}\n\t}\n\treturn\n}\n\nfunc (x tagIndex) IterateTags(fn func(tag string) bool) bool {\n\treturn x.index.Iterate(\"\", \"\", func(tag string, _ interface{}) bool {\n\t\treturn fn(tag)\n\t})\n}\n\nfunc (x tagIndex) IteratePosts(tag string, fn func(*blog.Post) bool) bool { // TODO: Support pagination\n\tv, found := x.index.Get(tag)\n\tif !found {\n\t\treturn false\n\t}\n\n\tidx := v.(*tutorialIndex)\n\treturn idx.Iterate(\"\", \"\", func(p *blog.Post) bool {\n\t\treturn fn(p)\n\t})\n}\n\ntype tutorialIndex struct {\n\tindex avl.Tree // string(post creation time + post slug) -\u003e *blog.Post\n}\n\nfunc (x tutorialIndex) Size() int {\n\treturn x.index.Size()\n}\n\nfunc (x *tutorialIndex) Index(p *blog.Post) bool {\n\tk := newTutorialKey(p)\n\treturn x.index.Set(k, p)\n}\n\nfunc (x *tutorialIndex) Remove(p *blog.Post) bool {\n\tk := newTutorialKey(p)\n\t_, removed := x.index.Remove(k)\n\treturn removed\n}\n\nfunc (x tutorialIndex) Iterate(start, end string, fn func(*blog.Post) bool) bool {\n\treturn x.index.Iterate(start, end, func(_ string, v interface{}) bool {\n\t\treturn fn(v.(*blog.Post))\n\t})\n}\n\nfunc newTutorialKey(p *blog.Post) string {\n\tif p != nil {\n\t\treturn p.CreatedAt.UTC().Format(keyDateFmt) + p.Slug\n\t}\n\n\t// By default create a key for the current block time\n\treturn time.Now().UTC().Format(keyDateFmt)\n}\n"},{"name":"params.gno","body":"package tutorials\n\nimport (\n\t\"time\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\n// Day defines the duration of a day.\nconst Day = time.Hour * 24\n\n// Names for the different strategy types.\nconst (\n\tStrategyNameCreation = \"tutorial-creation\"\n\tStrategyNameDeletion = \"tutorial-deletion\"\n\tStrategyNameLocking = \"tutorial-realm-locking\"\n\tStrategyNameModification = \"tutorial-modification\"\n\tStrategyNameParamsUpdate = \"tutorial-params-update\"\n)\n\nvar parameters struct {\n\tVotingPeriods gnome.DurationParams\n}\n\nfunc init() {\n\t// Initial voting periods for each proposal type.\n\t// Periods can be changed by sumitting a params update proposal.\n\tparameters.VotingPeriods.Set(StrategyNameCreation, Day*3)\n\tparameters.VotingPeriods.Set(StrategyNameDeletion, Day*3)\n\tparameters.VotingPeriods.Set(StrategyNameLocking, Day*3)\n\tparameters.VotingPeriods.Set(StrategyNameModification, Day*3)\n\tparameters.VotingPeriods.Set(StrategyNameParamsUpdate, time.Minute*10)\n}\n"},{"name":"public.gno","body":"package tutorials\n\nimport (\n\t\"std\"\n\t\"time\"\n\n\t\"gno.land/p/demo/mux\"\n\t\"gno.land/p/gnome/blog\"\n)\n\nfunc Render(path string) string {\n\trouter := mux.NewRouter()\n\trouter.NotFoundHandler = func(res *mux.ResponseWriter, _ *mux.Request) {\n\t\tres.Write(\"Path not found\")\n\t}\n\n\trouter.HandleFunc(\"\", renderBlog)\n\trouter.HandleFunc(\"posts\", renderBlog)\n\trouter.HandleFunc(\"posts/{slug}\", renderPost)\n\trouter.HandleFunc(\"drafts\", renderDrafts)\n\trouter.HandleFunc(\"revisions\", renderRevisions)\n\trouter.HandleFunc(\"tags\", renderTags)\n\trouter.HandleFunc(\"tags/{name}\", renderPostsByTag)\n\trouter.HandleFunc(\"params\", renderParams)\n\n\treturn renderAlerts() + router.Render(path)\n}\n\n// GetTutorialsBlog returns an invariant reference to the tutorials blog.\nfunc GetTutorialsBlog() blog.InvarBlog {\n\treturn blog.NewInvarBlog(\u0026tutorialsBlog)\n}\n\n// Publish publishes content for a tutorial.\n//\n// The submited content must be previously approved by a creation or modification proposal.\n//\n// Parameters:\n// - slug: Slug name of the tutorial (required)\n// - content: The tutorial content to publish (required)\nfunc Publish(slug, content string) {\n\tassertRealmIsNotLocked()\n\n\t// Check that content checksum matches the approved content for the tutorial post\n\tp := mustGetPost(slug)\n\tblog.AssertContentSha256Hash(content, p.ContentHash)\n\n\t// Add caller to the list of publishers\n\tcaller := std.GetOrigCaller()\n\tif !p.Publishers.HasAddress(caller) {\n\t\tp.Publishers = append(p.Publishers, caller)\n\t}\n\n\tif p.Status == blog.StatusDraft {\n\t\tp.PublishAt = time.Now()\n\t}\n\n\tp.Status = blog.StatusPublished\n\tp.Content = content\n\tp.UpdatedAt = time.Now()\n}\n"},{"name":"public_proposals.gno","body":"package tutorials\n\nimport (\n\t\"std\"\n\t\"strings\"\n\t\"time\"\n\n\t\"gno.land/p/gnome/blog\"\n\tgnome \"gno.land/p/gnome/dao\"\n\tgnomeDAO \"gno.land/r/gnome/dao/pre1\"\n)\n\n// TODO: Move to a parameter\nconst tutorialsPath = \"council/main/community/tutorials\"\n\n// SubmitCreationProposal submits a new proposal to create a new tutorial.\n//\n// Proposal requires a 51% quorum, otherwise the outcome will be low participation.\n// Tally is done by absolute majority, so all abstentions are considered.\n//\n// Parameters:\n// - proposalTitle: A title for the proposal (required)\n// - proposalDescription: A description of the proposal\n// - tutorialSlug: Slug name of the tutorial (required)\n// - tutorialTitle: A title for the tutorial (required)\n// - tutorialContentHash: A SHA256 hash of the tutorial's content (required)\n// - tutorialContentURL: A URL where the tutorial's content is currently available (required)\n// - tutorialAuthors: List of author addresses (required)\n// - tutorialEditors:\tList of editor addresses\n// - tutorialTags: Space separated list of tutorial tags\n//\n// Tutorial slug name allows letters from \"a\" to \"z\", numbers and \"-\" as valid characters.\n// Unicode letters are also allowed.\n//\n// The list of authors and editors must be a newline separated list of addresses.\nfunc SubmitCreationProposal(\n\tproposalTitle,\n\tproposalDescription,\n\ttutorialSlug,\n\ttutorialTitle,\n\ttutorialContentHash,\n\ttutorialContentURL,\n\ttutorialAuthors,\n\ttutorialEditors,\n\ttutorialTags string,\n) uint64 {\n\tassertRealmIsNotLocked()\n\tassertSlugIsAvailable(tutorialSlug)\n\tblog.AssertTitleIsNotEmpty(tutorialTitle)\n\tblog.AssertIsSlug(tutorialSlug)\n\tblog.AssertIsSha256Hash(tutorialContentHash)\n\tblog.AssertIsContentURL(tutorialContentURL)\n\n\ttags := strings.Fields(tutorialTags)\n\tassertValidTags(tags)\n\n\tauthors := blog.MustParseStringToAddresses(tutorialAuthors)\n\tif len(authors) == 0 {\n\t\tpanic(\"tutorial authors must have at least one author's address\")\n\t}\n\n\tstrategy := creationStrategy{\n\t\tslug: tutorialSlug,\n\t\ttitle: strings.TrimSpace(tutorialTitle),\n\t\tcontentHash: tutorialContentHash,\n\t\tcontentURL: tutorialContentURL,\n\t\tauthors: authors,\n\t\teditors: blog.MustParseStringToAddresses(tutorialEditors),\n\t\ttags: tags,\n\t}\n\tid := gnomeDAO.SubmitCustomProposal(proposalTitle, proposalDescription, strategy, tutorialsPath)\n\treturn uint64(id)\n}\n\n// SubmitModificationProposal submits a new proposal to modify a tutorial.\n//\n// Proposal requires a 51% quorum, otherwise the outcome will be low participation.\n// Tally is done by absolute majority, so all abstentions are considered.\n//\n// Parameters:\n// - proposalTitle: A title for the proposal (required)\n// - proposalDescription: A description of the proposal\n// - tutorialSlug: Slug name of the tutorial (required)\n// - tutorialTitle: A title for the tutorial\n// - tutorialContentHash: A SHA256 hash of the new tutorial's content\n// - tutorialCurrentContentHash: A SHA256 hash of the current tutorial's content\n// - tutorialContentURL: A URL where the new tutorial's content is currently available\n// - tutorialNewAuthors: List of author addresses\n// - tutorialNewEditors:\tList of editor addresses\n// - tutorialTags: Space separated list of tutorial tags\n//\n// Tutorial slug name allows letters from \"a\" to \"z\", numbers and \"-\" as valid characters.\n// Unicode letters are also allowed.\n//\n// The list of new authors and editors must be a newline separated list of addresses.\n// If present, authors and editors are appended to the current list of authors and editors.\nfunc SubmitModificationProposal(\n\tproposalTitle,\n\tproposalDescription,\n\ttutorialSlug,\n\ttutorialTitle,\n\ttutorialContentHash,\n\ttutorialCurrentContentHash,\n\ttutorialContentURL,\n\ttutorialNewAuthors,\n\ttutorialNewEditors,\n\ttutorialTags string,\n) uint64 {\n\tassertRealmIsNotLocked()\n\n\ttutorialSlug = strings.TrimSpace(tutorialSlug)\n\tassertTutorialExists(tutorialSlug)\n\n\ttags := strings.Fields(tutorialTags)\n\tassertValidTags(tags)\n\n\ttutorialContentHash = strings.TrimSpace(tutorialContentHash)\n\tif tutorialContentHash != \"\" {\n\t\ttutorialCurrentContentHash = strings.TrimSpace(tutorialCurrentContentHash)\n\t\tif tutorialCurrentContentHash == \"\" {\n\t\t\tpanic(\"the current content hash of the tutorial to modify is required\")\n\t\t}\n\n\t\tblog.AssertIsSha256Hash(tutorialContentHash)\n\t\tblog.AssertIsSha256Hash(tutorialCurrentContentHash)\n\t\tblog.AssertIsContentURL(tutorialContentURL)\n\t}\n\n\tstrategy := modificationStrategy{\n\t\tslug: tutorialSlug,\n\t\ttitle: strings.TrimSpace(tutorialTitle),\n\t\tcontentHash: tutorialContentHash,\n\t\tcurrentContentHash: tutorialCurrentContentHash,\n\t\tcontentURL: tutorialContentURL,\n\t\tauthors: blog.MustParseStringToAddresses(tutorialNewAuthors),\n\t\teditors: blog.MustParseStringToAddresses(tutorialNewEditors),\n\t\ttags: tags,\n\t}\n\tid := gnomeDAO.SubmitCustomProposal(proposalTitle, proposalDescription, strategy, tutorialsPath)\n\treturn uint64(id)\n}\n\n// SubmitDeletionProposal submits a new proposal to delete a tutorial.\n//\n// Proposal requires a 51% quorum, otherwise the outcome will be low participation.\n// Tally is done by absolute majority, so all abstentions are considered.\n//\n// Parameters:\n// - proposalTitle: A title for the proposal (required)\n// - proposalDescription: A description of the proposal\n// - tutorialSlug: Slug name of the tutorial (required)\nfunc SubmitDeletionProposal(proposalTitle, proposalDescription, tutorialSlug string) uint64 {\n\tassertRealmIsNotLocked()\n\n\ttutorialSlug = strings.TrimSpace(tutorialSlug)\n\tassertTutorialExists(tutorialSlug)\n\n\tstrategy := deletionStrategy{tutorialSlug}\n\tid := gnomeDAO.SubmitCustomProposal(proposalTitle, proposalDescription, strategy, tutorialsPath)\n\treturn uint64(id)\n}\n\n// SubmitLockingProposal submits a new proposal to lock the realm.\n//\n// Locking the realm \"freezes the state\" by disallowing further modifications.\n// State must be locked to migrate the realm to a newer version.\n//\n// Proposal requires a 33% quorum, otherwise the outcome will be low participation.\n// This type of proposal can only be created by members with `admin` role.\n// Tally is done by plurality.\n//\n// Parameters:\n// - proposalTitle: A title for the proposal (required)\n// - proposalDescription: A description of the proposal\n// - realmPath: Path of the realm that should be allowed to import state data\n//\n// The optional realm path authorizes a realm to import the state data once the realm is locked.\nfunc SubmitLockingProposal(proposalTitle, proposalDescription, realmPath string) uint64 {\n\tassertHasAdminRole(std.GetOrigCaller())\n\n\tif realmPath != \"\" \u0026\u0026 !strings.HasPrefix(realmPath, \"gno.land/r/\") {\n\t\tpanic(`realm path must start with \"gno.land/r/\"`)\n\t}\n\n\tstrategy := lockingStrategy{realmPath}\n\tid := gnomeDAO.SubmitCustomProposal(proposalTitle, proposalDescription, strategy, tutorialsPath)\n\treturn uint64(id)\n}\n\n// SubmitParamsUpdateProposal submits a new proposal to update one or more realm parameters.\n//\n// Proposal requires a 51% quorum, otherwise the outcome will be low participation.\n// Tally is done by absolute majority, so all abstentions are considered.\n//\n// Parameters:\n// - proposalTitle: A title for the proposal (required)\n// - proposalDescription: A description of the proposal\n// - votingPeriodCreation: Voting period for tutorial creation proposals\n// - votingPeriodModification: Voting period for tutorial modification proposals\n// - votingPeriodDeletion: Voting period for tutorial deletion proposals\n// - votingPeriodLocking: Voting period for realm locking proposals\n// - votingPeriodParamsUpdate: Voting period for parameters update proposals\n//\n// Voting period is the number of days that members can vote on a proposal\n// At least one parameter value is required for creating a proposal.\nfunc SubmitParamsUpdateProposal(\n\tproposalTitle,\n\tproposalDescription string,\n\tvotingPeriodCreation,\n\tvotingPeriodModification,\n\tvotingPeriodDeletion,\n\tvotingPeriodLocking,\n\tvotingPeriodParamsUpdate int,\n) uint64 {\n\tstrategy := paramsUpdateStrategy{}\n\tif votingPeriodCreation \u003e 0 {\n\t\tperiod := time.Duration(votingPeriodCreation) * Day\n\t\tstrategy.votingPeriods.Set(StrategyNameCreation, period)\n\t}\n\n\tif votingPeriodModification \u003e 0 {\n\t\tperiod := time.Duration(votingPeriodModification) * Day\n\t\tstrategy.votingPeriods.Set(StrategyNameModification, period)\n\t}\n\n\tif votingPeriodDeletion \u003e 0 {\n\t\tperiod := time.Duration(votingPeriodDeletion) * Day\n\t\tstrategy.votingPeriods.Set(StrategyNameDeletion, period)\n\t}\n\n\tif votingPeriodLocking \u003e 0 {\n\t\tperiod := time.Duration(votingPeriodLocking) * Day\n\t\tstrategy.votingPeriods.Set(StrategyNameLocking, period)\n\t}\n\n\tif votingPeriodParamsUpdate \u003e 0 {\n\t\tperiod := time.Duration(votingPeriodParamsUpdate) * Day\n\t\tstrategy.votingPeriods.Set(StrategyNameParamsUpdate, period)\n\t}\n\n\tif strategy.votingPeriods.Size() == 0 {\n\t\tpanic(\"at least one parameter value must be specified\")\n\t}\n\n\tid := gnomeDAO.SubmitCustomProposal(proposalTitle, proposalDescription, strategy, tutorialsPath)\n\treturn uint64(id)\n}\n\nfunc assertSlugIsAvailable(slug string) {\n\tif tutorialsBlog.HasPost(slug) {\n\t\tpanic(\"tutorial URL slug already exists\")\n\t}\n}\n\nfunc assertTutorialExists(slug string) {\n\tif !tutorialsBlog.HasPost(slug) {\n\t\tpanic(\"tutorial not found\")\n\t}\n}\n\nfunc assertValidTags(tags []string) {\n\tfor _, t := range tags {\n\t\tif !blog.IsSlug(t) {\n\t\t\tpanic(\"invalid tag: \" + t)\n\t\t}\n\t}\n}\n\nfunc assertHasAdminRole(addr std.Address) {\n\tdao := gnomeDAO.GetDAO(tutorialsPath)\n\tm, found := getMember(dao, addr)\n\tif !found {\n\t\tpanic(\"address is not a member of tutorials DAO: \" + addr.String())\n\t}\n\n\tfor _, r := range m.Roles {\n\t\tif r == gnomeDAO.RoleAdmin {\n\t\t\t// Member has admin role\n\t\t\treturn\n\t\t}\n\t}\n\n\tpanic(\"member doesn't have admin role: \" + addr.String())\n}\n\nfunc getMember(dao gnome.InvarDAO, addr std.Address) (gnome.Member, bool) {\n\tfor _, m := range dao.Members() {\n\t\tif m.Address == addr {\n\t\t\treturn m, true\n\t\t}\n\t}\n\treturn gnome.Member{}, false\n}\n"},{"name":"render.gno","body":"package tutorials\n\nimport (\n\t\"strings\"\n\t\"time\"\n\n\t\"gno.land/p/demo/mux\"\n\t\"gno.land/p/gnome/alerts\"\n\t\"gno.land/p/gnome/blog\"\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\nconst (\n\tdateFormat = \"2006-01-02 15:04 MST\"\n\tshortDateFormat = \"Jan 2, 2006\"\n)\n\nfunc renderBlog(res *mux.ResponseWriter, _ *mux.Request) {\n\t// Write header\n\tres.Write(\"# \" + tutorialsBlog.Title + \"\\n\")\n\tif tutorialsBlog.Description != \"\" {\n\t\tres.Write(tutorialsBlog.Description + \"\\n\\n\")\n\t}\n\n\t// Write tutorials menu\n\tres.Write(renderMenu() + \"\\n\\n---\\n\")\n\n\t// Write list of published tutorials\n\tnow := time.Now()\n\ttutorials.Iterate(\"\", \"\", func(p *blog.Post) bool { // TODO: Add post pagination support\n\t\t// Skip posts that should be published at a future date\n\t\tif p.PublishAt.IsZero() || p.PublishAt.After(now) {\n\t\t\treturn false\n\t\t}\n\n\t\t// Skip posts that are not published or being revised\n\t\tif p.Status != blog.StatusPublished \u0026\u0026 p.Status != blog.StatusRevised {\n\t\t\treturn false\n\t\t}\n\n\t\turl := newRealmURL(\"posts/\" + p.Slug)\n\t\tdate := p.PublishAt.UTC().Format(shortDateFormat)\n\t\tres.Write(\"**[\" + p.Title + \"](\" + url + \")**\u003c/br\u003e\")\n\t\tres.Write(\"_Published: \" + date + \"_\\n\\n\")\n\t\treturn false\n\t})\n}\n\nfunc renderPost(res *mux.ResponseWriter, req *mux.Request) {\n\tslug := req.GetVar(\"slug\")\n\tp, found := tutorialsBlog.GetPost(slug)\n\tif !found {\n\t\tres.Write(\"Post not found\")\n\t\treturn\n\t}\n\n\tif p.Status == blog.StatusRevised {\n\t\tres.Write(alerts.NewWarning(\"Tutorial content is being revised\"))\n\t}\n\n\t// TODO: Add post tags with links\n\tres.Write(\"# \" + p.Title + \"\\n\")\n\tres.Write(\"- Author(s): \" + p.Authors.String() + \"\\n\")\n\n\tif len(p.Editors) \u003e 0 {\n\t\tres.Write(\"- Editors(s): \" + p.Editors.String() + \"\\n\")\n\t}\n\n\tres.Write(\"- Publisher(s): \" + p.Publishers.String() + \"\\n\")\n\tres.Write(\"- Status: \" + p.Status.String() + \"\\n\")\n\tres.Write(\"- Content Hash: \" + p.ContentHash + \"\\n\")\n\tres.Write(\"- Created: \" + p.CreatedAt.UTC().Format(dateFormat) + \"\\n\")\n\tif !p.UpdatedAt.IsZero() {\n\t\tres.Write(\"- Updated: \" + p.UpdatedAt.UTC().Format(dateFormat) + \"\\n\")\n\t}\n\n\tif len(p.Tags) \u003e 0 {\n\t\tres.Write(\"- Tag(s): \" + renderTagLinks(p.Tags) + \"\\n\")\n\t}\n\n\tif p.Content != \"\" {\n\t\tres.Write(\"\\n\" + p.Content)\n\t}\n}\n\nfunc renderDrafts(res *mux.ResponseWriter, _ *mux.Request) {\n\tres.Write(\"# \" + tutorialsBlog.Title + \": Drafts\\n\")\n\ttutorials.Iterate(\"\", \"\", func(p *blog.Post) bool { // TODO: Add pagination support\n\t\tif p.Status != blog.StatusDraft {\n\t\t\treturn false\n\t\t}\n\n\t\turl := newRealmURL(\"posts/\" + p.Slug)\n\t\tdate := p.CreatedAt.UTC().Format(shortDateFormat)\n\t\tres.Write(\"**[\" + p.Title + \"](\" + url + \")**\u003c/br\u003e\")\n\t\tres.Write(\"_Created: \" + date + \"_\\n\\n\")\n\t\treturn false\n\t})\n}\n\nfunc renderRevisions(res *mux.ResponseWriter, _ *mux.Request) {\n\tres.Write(\"# \" + tutorialsBlog.Title + \": Revisions\\n\")\n\ttutorials.Iterate(\"\", \"\", func(p *blog.Post) bool { // TODO: Add pagination support\n\t\tif p.Status != blog.StatusRevised {\n\t\t\treturn false\n\t\t}\n\n\t\turl := newRealmURL(\"posts/\" + p.Slug)\n\t\tdate := p.PublishAt.UTC().Format(shortDateFormat)\n\t\tres.Write(\"**[\" + p.Title + \"](\" + url + \")**\u003c/br\u003e\")\n\t\tres.Write(\"_Published: \" + date + \"_\\n\\n\")\n\t\treturn false\n\t})\n}\n\nfunc renderTags(res *mux.ResponseWriter, req *mux.Request) {\n\tres.Write(\"# \" + tutorialsBlog.Title + \": Tags\\n\")\n\ttags.IterateTags(func(tag string) bool {\n\t\tres.Write(\"- [\" + tag + \"](\" + newRealmURL(\"tags/\"+tag) + \")\\n\")\n\t\treturn false\n\t})\n}\n\nfunc renderPostsByTag(res *mux.ResponseWriter, req *mux.Request) {\n\ttag := req.GetVar(\"name\")\n\tres.Write(\"# \" + tutorialsBlog.Title + \": Tag `\" + tag + \"`\\n\")\n\n\tif tag == \"\" {\n\t\treturn\n\t}\n\n\ttags.IteratePosts(tag, func(p *blog.Post) bool {\n\t\tif p.Status != blog.StatusPublished \u0026\u0026 p.Status != blog.StatusRevised {\n\t\t\treturn false\n\t\t}\n\n\t\turl := newRealmURL(\"posts/\" + p.Slug)\n\t\tdate := p.PublishAt.UTC().Format(shortDateFormat)\n\t\tres.Write(\"**[\" + p.Title + \"](\" + url + \")**\u003c/br\u003e\")\n\t\tres.Write(\"_Published: \" + date + \"_\\n\\n\")\n\t\treturn false\n\t})\n}\n\nfunc renderParams(res *mux.ResponseWriter, _ *mux.Request) {\n\tres.Write(\"# \" + tutorialsBlog.Title + \": Parameters\\n\")\n\tres.Write(\"## Proposal\\n\")\n\tres.Write(\"**Voting Periods**\\n\")\n\tparameters.VotingPeriods.Iterate(func(name string, period time.Duration) bool {\n\t\tres.Write(\"- `\" + name + \"`: \" + gnome.HumanizeDuration(period) + \"\\n\")\n\t\treturn false\n\t})\n}\n\nfunc renderAlerts() string {\n\tif locked {\n\t\tmsg := \"Realm is locked\"\n\t\tif nextVersionRealmPath != \"\" {\n\t\t\tlink := alerts.NewLink(\"https://\"+nextVersionRealmPath, nextVersionRealmPath)\n\t\t\tmsg += \"\u003c/br\u003eThis realm is deprecated in favor of a new version found at \" + link\n\t\t}\n\n\t\treturn alerts.NewError(msg)\n\t}\n\treturn \"\"\n}\n\nfunc renderMenu() string {\n\titems := []string{\n\t\t\"**[drafts](\" + newRealmURL(\"drafts\") + \")**\",\n\t\t\"**[revisions](\" + newRealmURL(\"revisions\") + \")**\",\n\t}\n\n\t// Add taxonomy entries\n\ttags.IterateTags(func(tag string) bool {\n\t\titems = append(items, \"**[\"+tag+\"](\"+newRealmURL(\"tags/\"+tag)+\")**\")\n\t\treturn false\n\t})\n\n\treturn strings.Join(items, \" \")\n}\n\nfunc renderTagLinks(tags []string) string {\n\tvar links []string\n\tfor _, t := range tags {\n\t\tlinks = append(links, \"[\"+t+\"](\"+newRealmURL(\"tags/\"+t)+\")\")\n\t}\n\treturn strings.Join(links, \", \")\n}\n\nfunc newRealmURL(renderPath string) string {\n\t// TODO: Get the prefix for the current realm package path\n\treturn \"/r/gnome/tutorials/pre3:\" + renderPath\n}\n"},{"name":"strategy_lock.gno","body":"package tutorials\n\nimport (\n\t\"errors\"\n\t\"time\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\ntype lockingStrategy struct {\n\trealmPath string\n}\n\nfunc (lockingStrategy) Name() string {\n\treturn StrategyNameLocking\n}\n\nfunc (lockingStrategy) Quorum() float64 {\n\treturn 0.33\n}\n\nfunc (lockingStrategy) VotingPeriod() time.Duration {\n\tperiod, _ := parameters.VotingPeriods.Get(StrategyNameLocking)\n\treturn period\n}\n\nfunc (lockingStrategy) VoteChoices() []gnome.VoteChoice {\n\treturn []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo}\n}\n\nfunc (s lockingStrategy) Validate(*gnome.Proposal) error {\n\t// Allow modification of the newxt version package path when realm is locked\n\tif locked \u0026\u0026 nextVersionRealmPath == \"\" \u0026\u0026 s.realmPath != \"\" {\n\t\treturn nil\n\t}\n\n\tif locked {\n\t\treturn errors.New(\"realm is already locked\")\n\t}\n\treturn nil\n}\n\nfunc (lockingStrategy) Tally(_ *gnome.DAO, r gnome.VotingRecord) gnome.VoteChoice {\n\tif choice, ok := gnome.SelectChoiceByPlurality(r); ok {\n\t\treturn choice\n\t}\n\treturn gnome.ChoiceNone\n}\n\nfunc (s lockingStrategy) Execute(*gnome.DAO) error {\n\tlocked = true\n\tif s.realmPath != \"\" {\n\t\tnextVersionRealmPath = s.realmPath\n\t}\n\treturn nil\n}\n\nfunc (s lockingStrategy) RenderParams() string {\n\tif s.realmPath != \"\" {\n\t\treturn \"Next Realm Path: [\" + s.realmPath + \"](https://\" + s.realmPath + \")\"\n\t}\n\treturn \"\"\n}\n"},{"name":"strategy_params.gno","body":"package tutorials\n\nimport (\n\t\"strings\"\n\t\"time\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\ntype paramsUpdateStrategy struct {\n\tvotingPeriods gnome.DurationParams\n}\n\nfunc (paramsUpdateStrategy) Name() string {\n\treturn StrategyNameParamsUpdate\n}\n\nfunc (paramsUpdateStrategy) Quorum() float64 {\n\treturn 0.51\n}\n\nfunc (paramsUpdateStrategy) VotingPeriod() time.Duration {\n\tperiod, _ := parameters.VotingPeriods.Get(StrategyNameParamsUpdate)\n\treturn period\n}\n\nfunc (paramsUpdateStrategy) VoteChoices() []gnome.VoteChoice {\n\treturn []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo}\n}\n\nfunc (paramsUpdateStrategy) Tally(dao *gnome.DAO, r gnome.VotingRecord) gnome.VoteChoice {\n\tabstentions := len(dao.Members()) - r.VoteCount()\n\tif choice, ok := gnome.SelectChoiceByMajority(r, abstentions); ok {\n\t\treturn choice\n\t}\n\treturn gnome.ChoiceNone\n}\n\nfunc (s paramsUpdateStrategy) Execute(*gnome.DAO) error {\n\ts.votingPeriods.Iterate(func(name string, period time.Duration) bool {\n\t\tparameters.VotingPeriods.Set(name, period)\n\t\treturn false\n\t})\n\treturn nil\n}\n\nfunc (s paramsUpdateStrategy) RenderParams() string {\n\tvar b strings.Builder\n\n\tb.WriteString(\"|||\\n|---|---|\\n\")\n\ts.votingPeriods.Iterate(func(name string, period time.Duration) bool {\n\t\tb.WriteString(\"| Voting Period for `\" + name + \"`: | \" + gnome.HumanizeDuration(period) + \" |\\n\")\n\t\treturn false\n\t})\n\n\treturn b.String()\n}\n"},{"name":"strategy_tutorials.gno","body":"package tutorials\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"time\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/gnome/blog\"\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\ntype creationStrategy struct {\n\tslug, title, contentHash, contentURL string\n\tauthors, editors blog.AddressList\n\ttags []string\n}\n\nfunc (creationStrategy) Name() string {\n\treturn StrategyNameCreation\n}\n\nfunc (creationStrategy) Quorum() float64 {\n\treturn 0.51\n}\n\nfunc (creationStrategy) VotingPeriod() time.Duration {\n\tperiod, _ := parameters.VotingPeriods.Get(StrategyNameCreation)\n\treturn period\n}\n\nfunc (creationStrategy) VoteChoices() []gnome.VoteChoice {\n\treturn []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo}\n}\n\nfunc (s creationStrategy) Validate(*gnome.Proposal) error {\n\tif tutorialsBlog.HasPost(s.slug) {\n\t\treturn errors.New(\"tutorial URL slug already exists\")\n\t}\n\treturn nil\n}\n\nfunc (creationStrategy) Tally(dao *gnome.DAO, r gnome.VotingRecord) gnome.VoteChoice {\n\tabstentions := len(dao.Members()) - r.VoteCount()\n\tif choice, ok := gnome.SelectChoiceByMajority(r, abstentions); ok {\n\t\treturn choice\n\t}\n\treturn gnome.ChoiceNone\n}\n\nfunc (s creationStrategy) Execute(*gnome.DAO) error {\n\tp := \u0026blog.Post{ // TODO: Support other fields like summary and tags\n\t\tSlug: s.slug,\n\t\tTitle: s.title,\n\t\tContentHash: s.contentHash,\n\t\tAuthors: s.authors,\n\t\tEditors: s.editors,\n\t\tStatus: blog.StatusDraft,\n\t\tTags: s.tags,\n\t\tCreatedAt: time.Now(),\n\t}\n\ttutorialsBlog.AddPost(p)\n\n\t// Update realm indexes\n\ttutorials.Index(p)\n\tif len(p.Tags) \u003e 0 {\n\t\ttags.Index(p)\n\t}\n\n\treturn nil\n}\n\nfunc (s creationStrategy) RenderParams() string {\n\tvar (\n\t\tb strings.Builder\n\t\tauthors = strings.ReplaceAll(s.authors.String(), \", \", \"\u003c/br\u003e\")\n\t)\n\n\t// TODO: Implement using gno.land/p/demo/ui\n\tb.WriteString(\"|||\\n|---|---|\\n\")\n\tb.WriteString(\"| Slug: | \" + s.slug + \" |\\n\")\n\tb.WriteString(\"| Title: | \" + gnome.EscapeHTML(s.title) + \" |\\n\")\n\tb.WriteString(\"| Content URL: | \" + gnome.NewLinkURI(s.contentURL) + \" |\\n\")\n\tb.WriteString(\"| Content Hash: | \" + s.contentHash + \" |\\n\")\n\n\tif len(s.tags) \u003e 0 {\n\t\tb.WriteString(\"| Tag(s): | \" + renderTagLinks(s.tags) + \" |\\n\")\n\t}\n\n\tb.WriteString(\"| Author(s): | \u003c/br\u003e\" + authors + \"\u003c/br\u003e\u003c/br\u003e |\\n\")\n\n\tif len(s.editors) \u003e 0 {\n\t\teditors := strings.ReplaceAll(s.editors.String(), \", \", \"\u003c/br\u003e\")\n\t\tb.WriteString(\"| Editor(s): | \u003c/br\u003e\" + editors + \"\u003c/br\u003e\u003c/br\u003e |\\n\")\n\t}\n\n\treturn b.String()\n}\n\ntype modificationStrategy struct {\n\tslug, title, currentContentHash, contentHash, contentURL string\n\tauthors, editors blog.AddressList\n\ttags []string\n}\n\nfunc (modificationStrategy) Name() string {\n\treturn StrategyNameModification\n}\n\nfunc (modificationStrategy) Quorum() float64 {\n\treturn 0.51\n}\n\nfunc (modificationStrategy) VotingPeriod() time.Duration {\n\tperiod, _ := parameters.VotingPeriods.Get(StrategyNameModification)\n\treturn period\n}\n\nfunc (modificationStrategy) VoteChoices() []gnome.VoteChoice {\n\treturn []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo}\n}\n\nfunc (s modificationStrategy) Validate(*gnome.Proposal) error {\n\tp, found := tutorialsBlog.GetPost(s.slug)\n\tif !found {\n\t\treturn errors.New(\"tutorial doesn't exists\")\n\t}\n\n\tif s.currentContentHash != \"\" \u0026\u0026 s.currentContentHash != p.ContentHash {\n\t\treturn errors.New(\"tutorial's content has been previously modified\")\n\t}\n\n\tfor _, addr := range s.authors {\n\t\tif p.Authors.HasAddress(addr) {\n\t\t\treturn errors.New(\"author already exists: \" + addr.String())\n\t\t}\n\t}\n\n\tfor _, addr := range s.editors {\n\t\tif p.Authors.HasAddress(addr) {\n\t\t\treturn errors.New(\"editor already exists: \" + addr.String())\n\t\t}\n\t}\n\n\tif len(s.tags) \u003e 0 {\n\t\tvar seenTags avl.Tree\n\t\tfor _, t := range s.tags {\n\t\t\tif seenTags.Has(t) {\n\t\t\t\treturn errors.New(\"duplicated tag: \" + t)\n\t\t\t}\n\n\t\t\tseenTags.Set(t, struct{}{})\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (modificationStrategy) Tally(dao *gnome.DAO, r gnome.VotingRecord) gnome.VoteChoice {\n\tabstentions := len(dao.Members()) - r.VoteCount()\n\tif choice, ok := gnome.SelectChoiceByMajority(r, abstentions); ok {\n\t\treturn choice\n\t}\n\treturn gnome.ChoiceNone\n}\n\nfunc (s modificationStrategy) Execute(*gnome.DAO) error {\n\tp, _ := tutorialsBlog.GetPost(s.slug)\n\n\tif s.title != \"\" {\n\t\tp.Title = s.title\n\t}\n\n\tif len(s.authors) \u003e 0 {\n\t\tp.Authors = append(p.Authors, s.authors...)\n\t}\n\n\tif len(s.editors) \u003e 0 {\n\t\tp.Editors = append(p.Editors, s.editors...)\n\t}\n\n\t// Update tag index\n\tif len(s.tags) \u003e 0 {\n\t\ttags.Remove(p)\n\t\tp.Tags = s.tags\n\t\ttags.Index(p)\n\t}\n\n\t// Changing content hash converts post to a revised until new content is setted\n\tif s.contentHash != \"\" {\n\t\tp.Status = blog.StatusRevised\n\t\tp.ContentHash = s.contentHash\n\t}\n\n\tp.UpdatedAt = time.Now()\n\treturn nil\n}\n\nfunc (s modificationStrategy) RenderParams() string {\n\tvar b strings.Builder\n\n\t// TODO: Implement using gno.land/p/demo/ui\n\tb.WriteString(\"|||\\n|---|---|\\n\")\n\tb.WriteString(\"| Slug: | [\" + s.slug + \"](\" + newRealmURL(\"posts/\"+s.slug) + \") |\\n\")\n\n\tif s.title != \"\" {\n\t\tb.WriteString(\"| Title: | \" + gnome.EscapeHTML(s.title) + \" |\\n\")\n\t}\n\n\tif s.contentHash != \"\" {\n\t\tb.WriteString(\"| Content URL: | \" + gnome.NewLinkURI(s.contentURL) + \" |\\n\")\n\t\tb.WriteString(\"| Content Hash: | \" + s.contentHash + \" |\\n\")\n\t\tb.WriteString(\"| Modifies Content Hash: | \" + s.currentContentHash + \" |\\n\")\n\t}\n\n\tif len(s.tags) \u003e 0 {\n\t\tb.WriteString(\"| Tag(s): | \" + renderTagLinks(s.tags) + \" |\\n\")\n\t}\n\n\tif len(s.authors) \u003e 0 {\n\t\tauthors := strings.ReplaceAll(s.authors.String(), \", \", \"\u003c/br\u003e\")\n\t\tb.WriteString(\"| Author(s): | \u003c/br\u003e\" + authors + \"\u003c/br\u003e\u003c/br\u003e |\\n\")\n\t}\n\n\tif len(s.editors) \u003e 0 {\n\t\teditors := strings.ReplaceAll(s.editors.String(), \", \", \"\u003c/br\u003e\")\n\t\tb.WriteString(\"| Editor(s): | \u003c/br\u003e\" + editors + \"\u003c/br\u003e\u003c/br\u003e |\\n\")\n\t}\n\n\treturn b.String()\n}\n\ntype deletionStrategy struct {\n\tslug string\n}\n\nfunc (deletionStrategy) Name() string {\n\treturn StrategyNameDeletion\n}\n\nfunc (deletionStrategy) Quorum() float64 {\n\treturn 0.51\n}\n\nfunc (deletionStrategy) VotingPeriod() time.Duration {\n\tperiod, _ := parameters.VotingPeriods.Get(StrategyNameDeletion)\n\treturn period\n}\n\nfunc (deletionStrategy) VoteChoices() []gnome.VoteChoice {\n\treturn []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo}\n}\n\nfunc (deletionStrategy) Tally(dao *gnome.DAO, r gnome.VotingRecord) gnome.VoteChoice {\n\tabstentions := len(dao.Members()) - r.VoteCount()\n\tif choice, ok := gnome.SelectChoiceByMajority(r, abstentions); ok {\n\t\treturn choice\n\t}\n\treturn gnome.ChoiceNone\n}\n\nfunc (s deletionStrategy) Validate(*gnome.Proposal) error {\n\tif !tutorialsBlog.HasPost(s.slug) {\n\t\treturn errors.New(\"tutorial doesn't exists\")\n\t}\n\treturn nil\n}\n\nfunc (s deletionStrategy) Execute(*gnome.DAO) error {\n\tp, found := tutorialsBlog.RemovePost(s.slug)\n\tif !found {\n\t\treturn errors.New(\"tutorial not found\")\n\t}\n\n\t// Update realm indexes\n\ttutorials.Remove(p)\n\tif len(p.Tags) \u003e 0 {\n\t\ttags.Remove(p)\n\t}\n\n\treturn nil\n}\n\nfunc (s deletionStrategy) RenderParams() string {\n\treturn \"Slug: [\" + s.slug + \"](\" + newRealmURL(\"posts/\"+s.slug) + \")\"\n}\n"},{"name":"tutorials.gno","body":"package tutorials\n\nimport (\n\t\"gno.land/p/gnome/blog\"\n)\n\nvar (\n\tlocked bool\n\tnextVersionRealmPath string\n\n\ttutorialsBlog = blog.Blog{Title: \"Gno.me Tutorials\"} // TODO: Define a realm description\n)\n\nfunc mustGetPost(slug string) *blog.Post {\n\tp, found := tutorialsBlog.GetPost(slug)\n\tif !found {\n\t\tpanic(\"tutorial not found\")\n\t}\n\treturn p\n}\n\nfunc assertRealmIsNotLocked() {\n\tif locked {\n\t\tpanic(\"realm is locked\")\n\t}\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"21000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"u84FmIYSCkQcQuwkvAa5OyJcPfAWYGM/56g+Xa63rQBcOT7zBFbLz4kh9pe+P9iA+QbelKJqyCitvOGAypGWcw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","send":"","pkg_path":"gno.land/r/gnome/dao/pre1","func":"AdvanceProposals","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"ea5twjap0faD1D4eXVmkQR0OLMTI23wzPoRGq7a2fn5zJIFTWYs2nK2+1ii58QKAGJ153xfYCXDu+ZDk3HwYQw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun","send":"","pkg_path":"gno.land/r/gnome/dao/pre1","func":"SubmitSubDAOCreationProposal","args":["Create a \"Community\" SubDAO","","council/main","community","Community","The Community DAO is responsible for adding and voting on new SubDAO sections that will be part of the Gno.me ecosystem. Gno.me is a community and educational platform therefore the Community DAO is responsible for adding and voting on sections needed for Gno.me: tutorials, new events and more that will be aggregated and added to the Gno.me Home/Ecosystem.","g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun dev\ng125t352u4pmdrr57emc4pe04y40sknr5ztng5mt dev\ng1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5 eco-dev"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ay9E9vYxidhNWLXiUvtj4yWhyi/GZx3EVvbQRROLMkDw"},"signature":"ePE+Gi+N+5+/qO3TFuRVXWqf5soqX8MwuKMH9I2rXF5gXBOtmXTBUS++c50KotaIXeT+wlFOjHEMkna2jSgJFQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun","send":"","pkg_path":"gno.land/r/gnome/dao/pre1","func":"Vote","args":["2","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ay9E9vYxidhNWLXiUvtj4yWhyi/GZx3EVvbQRROLMkDw"},"signature":"hRBHSw2pa/Uh27yNV/78CmyF6SS+moS3NylCLwqiRqtJ0gbxVangGsMhEnusrCEgOwmTmmLalNnrXunqx5Rwrg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g125t352u4pmdrr57emc4pe04y40sknr5ztng5mt","send":"","pkg_path":"gno.land/r/gnome/dao/pre1","func":"Vote","args":["2","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AkNQ8NiWDgbeVckfYHjA25f8LNZTWhWdiBxOJGuNnqBg"},"signature":"cdBVvn79BfH7impV+JGM3Kg/EihSqY+Ve7RRwYts7BZGCCwP7LldCdABkWn4BCoiHguks8FMPmOGpFEiziEnbg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","send":"","pkg_path":"gno.land/r/gnome/dao/pre1","func":"Vote","args":["2","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"sMoaQDqPiqIC680EhTM25+8qABbVQs+/k+80fBxy5Wocj6Luk6AMdb08W2Gc3P/2w6W9oknJP6vlPyF/DQaciA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g125t352u4pmdrr57emc4pe04y40sknr5ztng5mt","send":"","pkg_path":"gno.land/r/gnome/dao/pre1","func":"AdvanceProposals","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AkNQ8NiWDgbeVckfYHjA25f8LNZTWhWdiBxOJGuNnqBg"},"signature":"Kqv6cghUzEqH5Wc8W8kCjGCR4/e+tZ8qAIIiA/cQVhYFjpYjFlxgWO0FZPhMona+54uqbibGqMbqUDsUDu9wdA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun","send":"","pkg_path":"gno.land/r/gnome/dao/pre1","func":"SubmitSubDAOCreationProposal","args":["Create a \"Tutorials\" SubDAO","","council/main/community","tutorials","Tutorials","The Tutorials DAO is responsible for approving the publication of Gno and gno.land tutorials into the Gno.me Home/Ecosystem. Tutorials are currently drafted, reviewed and merged on Github and then transferred to a proposal vote to add to the published tutorials list.","g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun dev\ng1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5 eco-dev\ng1lavlav7zwsjqlzzl3qdl3nl242qtf638vnhdjh devrel\ng1whzkakk4hzjkvy60d5pwfk484xu67ar2cl62h2 devrel proposer\ng1dnllrdzwfhxv3evyk09y48mgn5phfjvtyrlzm7 devrel editor"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ay9E9vYxidhNWLXiUvtj4yWhyi/GZx3EVvbQRROLMkDw"},"signature":"g1BcofjRB0lXbOxkS6J8cUORvx7C+QDVZxcB7n+jfxQCwbRkGURHih17+UEAJcuxnV6Kiz80acYRQK+K/sNMqw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun","send":"","pkg_path":"gno.land/r/gnome/dao/pre1","func":"Vote","args":["3","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ay9E9vYxidhNWLXiUvtj4yWhyi/GZx3EVvbQRROLMkDw"},"signature":"+q4EHdeByffjSUWQYJpUcZDhck9JqKHrwo6s4dxaVlhYgj+ddcxukZ2CdMuuxw9FxGZ7zLXcivvpgLwhaU4ccA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","send":"","pkg_path":"gno.land/r/gnome/dao/pre1","func":"Vote","args":["3","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"guDIlTi4mQ0jsnC1cuxGwqkX7nl7HmKDSdqPaIZVJ1UeVzVY5JKS96cyWXMmLVqovvAxRv5/uuRcwEpAGFgKyA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g125t352u4pmdrr57emc4pe04y40sknr5ztng5mt","send":"","pkg_path":"gno.land/r/gnome/dao/pre1","func":"Vote","args":["3","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AkNQ8NiWDgbeVckfYHjA25f8LNZTWhWdiBxOJGuNnqBg"},"signature":"AGIaojQ2U2AKW9OJ8kXAHVtA4CjP6nadFRtebf+0fk4GeshN1DmzNWXotfnpoAgjjD8Kef/a/pgytAbMuoXoSg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g125t352u4pmdrr57emc4pe04y40sknr5ztng5mt","send":"","pkg_path":"gno.land/r/gnome/dao/pre1","func":"AdvanceProposals","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AkNQ8NiWDgbeVckfYHjA25f8LNZTWhWdiBxOJGuNnqBg"},"signature":"6sKMK88MCdyhvgXGZZ2YcuygYNDmvc1bwpWYEJiy/8QHaFuA+w5GihoNHyMgzCBAiBRRlhiekNwM+YgJIsOANQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","package":{"name":"gnome","path":"gno.land/r/gnome/dao/pre2","files":[{"name":"LICENSE","body":"Copyright (c) 2024. All rights reserved.\n\nProject Owner:\nNewTendermint, LLC\n\nProject Maintainer:\nİlker Göktuğ ÖZTÜRK. \u003cilker@ilgooz.com\u003e, \u003cilkergoktugozturk@gmail.com\u003e\n\nYour access to this Project and your contributions to this Project are subject\nto the following terms:\n\n* You hereby grant to the listed Owner and Maintainer of this Project the\nworldwide, irrevocable and royalty-free right to use, publish, relicense and\nsublicense your contributions under any non-exclusive license of their\nchoosing for commercial and non-commercial purposes.\n* You shall not attempt to bring any intellectual property infringement or\nmisappropriation claims against the Owner or Maintainer of this Project\nrelating to or arising from your contributions.\n* You represent that you are the sole owner of all rights in your\ncontributions and that no third party has any rights or interests therein.\n\nFOR THE SCOPE OF THIS LICENSE, A CONTRIBUTION IS DEFINED TO INCLUDE ANY WORKS,\nIDEAS, CODE, PROCESSES, OR APIS MADE AVAILABLE TO VIEW BY THE GENERAL PUBLIC\n(INCLUDING ANY PUBLICLY ACCESSIBLE INTERNET FORUMS AND CHAT SERVERS WHERE\nACCESS IS AVAILABLE FOR FREE WITH REGISTRATION) OR PRIVATELY TO THIS PROJECT'S\nOWNER AND MAINTAINERS; INCLUDING WORKS, IDEAS, CODE, PROCESSES, AND APIS THAT\nARE ABOUT THIS PROJECT AND ITS CONTRIBUTIONS, OR MENTIONED IN REFERENCE TO\nTHIS PROJECT, WHERE SUCH WORKS, IDEAS, CODE, PROCESSES, AND APIS ARE MATERIAL\nTO THE SUCCESS, IMPROVEMENT, OR COMPLETION OF THIS PROJECT, AS DETERMINED BY\nTHE OWNER OF THIS PROJECT.\n\nContributions may come in any form, and include (but are not limited to):\n\n* pull requests\n* diff patches\n* commentary\n* example code\n\nIf you do not want your contribution to become incorporated into this Project,\ndo not make contributions to this Project. The creation of contributions that\nmay in the future become known to this Project's Owner and Maintainer\nconstitutes a willing contribution to this Project in accordance with this\nlicense.\n\nTHIS PROJECT AND THE WORKS AVAILABLE THROUGH THIS PROJECT ARE PROVIDED “AS IS”\nAND WITHOUT WARRANTY OF ANY KIND. IN NO EVENT SHALL THE OWNER OR MAINTAINER OF\nTHIS PROJECT BE LIABLE TO YOU OR ANY THIRD PARTY FOR ANY CLAIM, DAMAGES OR\nOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\nFROM, OUT OF OR IN CONNECTION WITH THIS PROJECT OR THE WORKS AVAILABLE THROUGH\nTHIS PROJECT. YOU AGREED TO INDEMNIFY, DEFEND AND HOLD THE OWNER AND\nMAINTAINER FROM AND AGAINST ANY CLAIMS, LOSSES OR DAMAGES ARISING FROM YOUR\nUSE OF THIS PROJECT OR THE WORKS AVAILABLE THROUGH THIS PROJECT.\n\nThis license is subject to change at any time by the Project Owner or\nMaintainer.\n\nYour continued access to or use of this Project or any works\navailable through this Project shall be subject to the then-current version\nof this license.\n\nThe Project Owner and Maintainer reserve the right to change this license\nwithout needing the consent of the contributors to this Project.\n"},{"name":"gnome.gno","body":"package gnome\n\nimport (\n\t\"strings\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\n// Names of the initial DAOs.\nconst (\n\tnameCouncilDAO = \"council\"\n\tnameMainDAO = \"main\"\n)\n\n// Member roles.\nconst (\n\tRoleAdmin gnome.Role = \"admin\"\n\tRoleEcoDev gnome.Role = \"eco-dev\"\n\tRoleDev gnome.Role = \"dev\"\n\tRoleRealm gnome.Role = \"realm\"\n)\n\n// The \"Gno.me\" DAO defines an initial root DAO with a single sub DAO, where the root is\n// the council DAO and the child is the main DAO. Council DAO members are hard coded and\n// can't be modified. Main DAO members can be modified anytime though a modify DAO members\n// proposals.\n//\n// The main DAO must have a minimum of three members at all time to be able to apply 2/3s\n// voting majority criteria required for some proposal types allowed for the main DAO.\n//\n// Sub DAOs can be created though sub DAO add proposals but its members can't be modified\n// once the sub DAO is created. Sub DAOs must be dismissed though a proposal and a new sub\n// DAO must be created if its members must be modified.\nvar gnomeDAO = gnome.MustNew(\n\tnameCouncilDAO,\n\t\"Council\",\n\tgnome.WithManifest(\"Gnomes are thinking\"),\n\tgnome.AssignAsSuperCouncil(),\n\tgnome.WithMembers(\n\t\tgnome.NewMember(\"g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun\", RoleDev),\n\t\tgnome.NewMember(\"g125t352u4pmdrr57emc4pe04y40sknr5ztng5mt\", RoleDev),\n\t\tgnome.NewMember(\"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5\", RoleEcoDev),\n\t),\n\tgnome.WithSubDAO(\n\t\tgnome.MustNew(\n\t\t\tnameMainDAO,\n\t\t\t\"Main\",\n\t\t\tgnome.WithManifest(\"Gnomes are building\"),\n\t\t\tgnome.WithMembers(\n\t\t\t\tgnome.NewMember(\"g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun\", RoleDev),\n\t\t\t\tgnome.NewMember(\"g125t352u4pmdrr57emc4pe04y40sknr5ztng5mt\", RoleDev),\n\t\t\t\tgnome.NewMember(\"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5\", RoleEcoDev),\n\t\t\t),\n\t\t),\n\t),\n)\n\nfunc mustGetDAO(path string) *gnome.DAO {\n\tif strings.TrimSpace(path) == \"\" {\n\t\tpanic(\"DAO path is empty\")\n\t}\n\n\tdao, found := daos.GetByPath(path)\n\tif !found {\n\t\tpanic(\"DAO not found\")\n\t}\n\treturn dao\n}\n"},{"name":"indexes.gno","body":"package gnome\n\nimport (\n\t\"gno.land/p/demo/avl\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\nvar (\n\tdaos daoIndex\n\tproposals proposalIndex\n\tlastProposalID gnome.ID\n)\n\nfunc init() {\n\t// Index initial council and main DAO\n\tmainDAO := gnomeDAO.SubDAOs()[0]\n\tdaos.IndexByPath(gnomeDAO)\n\tdaos.IndexByPath(mainDAO)\n}\n\nfunc genProposalID() gnome.ID {\n\tlastProposalID += 1\n\treturn lastProposalID\n}\n\n// TODO: Deprecate DAO index in favor of using DAO methods\ntype daoIndex struct {\n\tindex avl.Tree // string(DAO path) -\u003e *gnome.DAO\n}\n\n// IndexByPath indexes a DAO by its path.\nfunc (x *daoIndex) IndexByPath(dao *gnome.DAO) bool {\n\treturn x.index.Set(dao.Path(), dao)\n}\n\n// GetByPath gets a DAO by its path.\nfunc (x daoIndex) GetByPath(path string) (*gnome.DAO, bool) {\n\tif v, ok := x.index.Get(path); ok {\n\t\treturn v.(*gnome.DAO), true\n\t}\n\treturn nil, false\n}\n\n// HasPathKey checks if a key with a DAO path exists.\nfunc (x daoIndex) HasPathKey(path string) bool {\n\treturn x.index.Has(path)\n}\n\ntype proposalIndex struct {\n\tindex avl.Tree // string(binary gnome.ID) -\u003e *gnome.Proposal\n\tgroups avl.Tree // string(DAO path) -\u003e []*gnome.Proposal\n}\n\n// Index indexes a proposal by its ID and DAO.\nfunc (x *proposalIndex) Index(p *gnome.Proposal) {\n\tx.IndexByID(p)\n\tx.IndexByDAO(p)\n}\n\n// IndexByID indexes a proposal by its ID.\nfunc (x *proposalIndex) IndexByID(p *gnome.Proposal) bool {\n\treturn x.index.Set(p.ID().Key(), p)\n}\n\n// IndexByDAO indexes a proposal for a DAO.\nfunc (x *proposalIndex) IndexByDAO(p *gnome.Proposal) bool {\n\tdaoPath := p.DAO().Path()\n\tproposals := x.GetAllByDAO(daoPath)\n\tproposals = append([]*gnome.Proposal{p}, proposals...) // reverse append\n\treturn x.groups.Set(daoPath, proposals)\n}\n\n// GetByID gets a proposal by its ID.\nfunc (x proposalIndex) GetByID(id gnome.ID) (*gnome.Proposal, bool) {\n\tif v, exists := x.index.Get(id.Key()); exists {\n\t\treturn v.(*gnome.Proposal), true\n\t}\n\treturn nil, false\n}\n\n// GetAllByDAO gets all proposals of a DAO.\nfunc (x proposalIndex) GetAllByDAO(daoPath string) []*gnome.Proposal {\n\tif v, exists := x.groups.Get(daoPath); exists {\n\t\treturn v.([]*gnome.Proposal)\n\t}\n\treturn nil\n}\n\n// Iterate iterates all proposals starting from the oldest one.\nfunc (x proposalIndex) Iterate(fn gnome.ProposalIterFn) bool {\n\treturn x.index.Iterate(\"\", \"\", func(_ string, value interface{}) bool {\n\t\treturn fn(value.(*gnome.Proposal))\n\t})\n}\n\n// ReverseIterate iterates all proposals starting from the latest one.\nfunc (x proposalIndex) ReverseIterate(fn gnome.ProposalIterFn) bool {\n\treturn x.index.ReverseIterate(\"\", \"\", func(_ string, value interface{}) bool {\n\t\treturn fn(value.(*gnome.Proposal))\n\t})\n}\n"},{"name":"params.gno","body":"package gnome\n\nimport (\n\t\"time\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\n// Day defines the duration of a day.\nconst Day = time.Hour * 24\n\n// Names for the different strategy types.\nconst (\n\tStrategyNameSubDAOCreation = \"sub-dao-creation\"\n\tStrategyNameSubDAODismissal = \"sub-dao-dismissal\"\n\tStrategyNameDAOMembersModification = \"dao-members-modification\"\n\tStrategyNameBudget = \"budget\"\n\tStrategyNameGeneral = \"general\"\n\tStrategyNameLocking = \"locking\"\n\tStrategyNameParamsUpdate = \"params-update\"\n)\n\nvar parameters struct {\n\t// VotingPeriods contains the current voting period for each proposal type.\n\tVotingPeriods gnome.DurationParams\n\n\t// ReviewDeadline defines the time after which a proposal can't be withdrawed by the proposer.\n\t// Proposal can only be voted on after this deadline but not before.\n\t// This greace period gives the proposer the chance to withdraw a proposal if there is a mistake.\n\tReviewDeadline time.Duration\n}\n\nfunc init() {\n\t// Initial voting periods for each proposal type.\n\t// Periods can be changed by sumitting a params update proposal.\n\tparameters.VotingPeriods.Set(StrategyNameSubDAOCreation, time.Minute*10)\n\tparameters.VotingPeriods.Set(StrategyNameSubDAODismissal, Day*7)\n\tparameters.VotingPeriods.Set(StrategyNameDAOMembersModification, time.Minute*30)\n\tparameters.VotingPeriods.Set(StrategyNameBudget, Day*7)\n\tparameters.VotingPeriods.Set(StrategyNameGeneral, Day*2)\n\tparameters.VotingPeriods.Set(StrategyNameLocking, Day*2)\n\tparameters.VotingPeriods.Set(StrategyNameParamsUpdate, time.Minute*10)\n\n\t// Initial review deadline\n\tparameters.ReviewDeadline = time.Second\n}\n"},{"name":"public.gno","body":"package gnome\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n\trouter \"gno.land/p/gnome/router/v1\"\n)\n\n// Render returns a Markdown string with DAO or proposal details.\n// By default it renders the Council DAO details view.\n//\n// Paths:\n// - `dao/DAO_PATH` =\u003e Renders DAO or sub DAO details\n// - `proposal/PROPOSAL_ID` =\u003e Renders details for a proposal\n// - `proposals/DAO_PATH` =\u003e Renders the list of proposals for a DAO\nfunc Render(path string) string {\n\tr := router.New()\n\n\tr.HandleFunc(\"\", renderDAO)\n\tr.HandleFunc(\"dao\", renderDAO)\n\tr.HandleFunc(\"proposal\", renderProposal)\n\tr.HandleFunc(\"proposals\", renderProposals)\n\tr.HandleFunc(\"params\", renderParams)\n\n\t// Render global alerts before proposal states are updated within the handlers\n\treturn renderAlerts() + r.Render(path)\n}\n\n// GetDAO returns an invariant reference to a DAO.\n// Council DAO is returned when path is empty.\nfunc GetDAO(path string) (_ gnome.InvarDAO, found bool) {\n\tif path == \"\" {\n\t\tpath = nameCouncilDAO\n\t}\n\n\tif dao, found := daos.GetByPath(path); found {\n\t\treturn gnome.NewInvarDAO(dao), true\n\t}\n\treturn gnome.InvarDAO{}, false\n}\n\n// IterateProposals iterates DAO proposals by ascending IDs.\nfunc IterateProposals(fn func(gnome.InvarProposal) bool) {\n\tproposals.Iterate(func(p *gnome.Proposal) bool {\n\t\treturn fn(gnome.NewInvarProposal(p))\n\t})\n}\n\n// WithdrawProposal withdraws a proposal.\n// Proposals can only be withdrawed by the account that creates it when the state is \"review\".\n// They can't be withdrawed once the review deadline of one hour after creation is met.\nfunc WithdrawProposal(proposalID uint64) string {\n\tassertDAOIsNotLocked()\n\n\tp := mustGetProposal(proposalID)\n\tassertCallerCanWithdraw(p)\n\n\tif err := p.Withdraw(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tAdvanceProposals()\n\n\treturn \"Proposal withdrawed\"\n}\n\n// Vote submits a vote for a proposal.\n//\n// Parameters:\n// - proposalID: ID of the proposal to vote (required)\n// - vote: Voting choice, true=Yes, false=No (required)\n// - reason: Text with the reason for the vote\n// - daoPath: Path of the DAO where the voting account belongs to\n//\n// Reason is in general optional but might be required for some proposals when voting No.\n//\n// DAO name is optional and by default is the one that the proposal belongs to.\n// Only parents of the proposal's DAO are allowed as `daoPath` values.\n// Child votes are not tallied when a member of a parent DAO votes on a child's proposal.\nfunc Vote(proposalID uint64, vote bool, reason, daoPath string) string {\n\tassertDAOIsNotLocked()\n\n\t// Make sure proposal states are up to date before submitting the vote\n\tAdvanceProposals()\n\n\t// Get proposal and check that current status accepts votes\n\tp := mustGetProposal(proposalID)\n\tif s := p.Status(); s.IsFinal() {\n\t\tpanic(\"proposal status doesn't allow new vote submissions: \" + s.String())\n\t}\n\n\t// When a DAO name is availalable check that it matches one of the proposal's DAO parents\n\t// and if so promote the proposal to a parent DAO. Promoting a proposal invalidates the votes\n\t// submitted by current DAO's members and moves voting responsibility to the parent DAO members.\n\tdaoPath = strings.TrimSpace(daoPath)\n\tif daoPath != \"\" \u0026\u0026 p.DAO().Path() != daoPath {\n\t\t// Check that the path belongs to a parent DAO.\n\t\t// Path separator is added to the prefix to make sure that similar prefixes don't match.\n\t\tif !strings.HasPrefix(p.DAO().Path(), daoPath+gnome.PathSeparator) {\n\t\t\tpanic(`path \"` + daoPath + `\" is not a parent of the proposal's DAO path`)\n\t\t}\n\n\t\t// Promote the active proposal's DAO to a parent DAO\n\t\tparentDAO := mustGetDAO(daoPath)\n\t\tif err := p.Promote(parentDAO); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\n\t\t// Reindex the proposal so its available under the parent DAO proposals. Child DAO will also\n\t\t// keep the promoted proposal indexed so it can be listed within the child DAO's proposals.\n\t\tproposals.Index(p)\n\t}\n\n\t// When proposal has \"review\" status check if deadline is met and if so activate it\n\tif p.Status() == gnome.StatusReview {\n\t\tif !p.HasReviewDeadlinePassed() {\n\t\t\tpanic(\"votes are not allowed until \" + p.ReviewDeadline().UTC().Format(\"2006-01-02 15:04 MST\"))\n\t\t}\n\n\t\tif err := p.Activate(); err != nil {\n\t\t\tpanic(err)\n\t\t}\n\t}\n\n\tvar choice gnome.VoteChoice\n\tif vote {\n\t\tchoice = gnome.ChoiceYes\n\t} else {\n\t\tchoice = gnome.ChoiceNo\n\t}\n\n\t// Submit vote\n\tcaller := std.GetOrigCaller() // TODO: Check that caller is member of the DAO\n\terr := p.Vote(caller, gnome.VoteChoice(choice), reason)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\treturn \"Vote submitted for proposal \" + makeProposalURI(gnome.ID(proposalID), false)\n}\n\n// AdvanceProposals iterates review and active proposals and tallies proposals that met their deadlines.\n// Proposals in review status are activated to allow voting.\n// Active proposals are tallied which means the number of votes is counted and status changed accordingly.\n// Active executable proposals are executed when the proposal status changes to \"passed\".\nfunc AdvanceProposals() string {\n\tassertDAOIsNotLocked()\n\n\tadvanceProposals()\n\n\treturn \"Proposals advanced for realm \" + makeRealmURL(\"\")\n}\n\n// IsProposalsAdvanceNeeded checks if a call to `AdvanceProposals()` is required to update proposals.\nfunc IsProposalsAdvanceNeeded() bool {\n\tif gnomeDAO.IsLocked() {\n\t\treturn false\n\t}\n\n\treturn proposals.ReverseIterate(func(p *gnome.Proposal) bool {\n\t\tswitch p.Status() {\n\t\tcase gnome.StatusReview:\n\t\t\tif p.HasReviewDeadlinePassed() {\n\t\t\t\treturn true\n\t\t\t}\n\t\tcase gnome.StatusActive:\n\t\t\tif p.HasVotingDeadlinePassed() {\n\t\t\t\treturn true\n\t\t\t}\n\t\t}\n\t\treturn false\n\t})\n}\n\nfunc advanceProposals() {\n\t// TODO: Use unix timestamp as part of proposal IDs to avoid iterating older tallied proposals\n\tproposals.Iterate(func(p *gnome.Proposal) bool {\n\t\tstatus := p.Status()\n\t\tif status == gnome.StatusReview \u0026\u0026 p.HasReviewDeadlinePassed() {\n\t\t\tp.Activate()\n\t\t\tstatus = p.Status()\n\t\t}\n\n\t\tif p.Status() == gnome.StatusActive \u0026\u0026 p.HasVotingDeadlinePassed() {\n\t\t\tp.Tally()\n\n\t\t\t// Change proposal status to failed when execution fails\n\t\t\tif err := p.Execute(); gnome.IsExecutionError(err) {\n\t\t\t\tp.Fail(\"failed due to conflicts: \" + err.Error())\n\t\t\t}\n\t\t}\n\t\treturn false\n\t})\n}\n\nfunc mustGetProposal(id uint64) *gnome.Proposal {\n\tp, found := proposals.GetByID(gnome.ID(id))\n\tif !found {\n\t\tpanic(\"proposal not found\")\n\t}\n\treturn p\n}\n\nfunc assertCallerCanWithdraw(p *gnome.Proposal) {\n\tif p.Proposer() != std.GetOrigCaller() {\n\t\tpanic(\"proposals can only be withdrawed by the proposer\")\n\t}\n\n\tif p.Status() != gnome.StatusReview {\n\t\tpanic(`proposals can only be withdrawed when status is \"review\"`)\n\t} else if p.HasReviewDeadlinePassed() {\n\t\tpanic(\"withdrawal not allowed, withdrawal deadline expired\")\n\t}\n}\n"},{"name":"public_proposals.gno","body":"package gnome\n\nimport (\n\t\"std\"\n\t\"strings\"\n\t\"time\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\n// SubmitCustomProposal submits a new proposal of a custom type.\n//\n// This function allows other realms to submit custom proposal types.\n//\n// Parameters:\n// - title: A title for the proposal (required)\n// - description: A description of the proposal\n// - strategy: A strategy for the new proposal (required)\n// - daoPath: Path of the DAO where the proposal should be created (required)\nfunc SubmitCustomProposal(title, description string, s gnome.ProposalStrategy, daoPath string) gnome.ID {\n\tassertDAOIsNotLocked()\n\n\tdao := mustGetDAO(daoPath)\n\tassertDAOIsNotDismissed(dao)\n\n\tcaller := std.GetOrigCaller()\n\tassertCanCreateProposal(caller, dao)\n\n\tid := genProposalID()\n\tp, err := gnome.NewProposal(\n\t\tid,\n\t\ts,\n\t\tcaller,\n\t\tdao,\n\t\ttitle,\n\t\tgnome.WithDescription(description),\n\t\t// gnome.WithReviewDeadline(time.Now().Add(parameters.ReviewDeadline)), // TODO: Enable for mainnet\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tif err := p.Validate(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tproposals.Index(p)\n\treturn p.ID()\n}\n\n// SubmitGeneralProposal submits a new general proposal.\n//\n// Proposal requires a 51% quorum, otherwise the outcome will be low participation.\n// Tally is done by absolute majority, so all abstentions are considered.\n//\n// Parameters:\n// - proposalTitle: A title for the proposal (required)\n// - proposalDescription: A description of the proposal (required)\n// - daoPath: Path of the DAO where the proposal should be created (required)\n// - votingDeadline: Number of days until the voting period ends\n//\n// The name of the DAO where the proposal is created is a slug, where \"council\"\n// is the Council DAO and \"main\" is the name of the Main DAO.\n//\n// The voting period deadline for the proposal must be between 2 and 10 days.\n// It defaults to 2 days when `votingDeadline` value is 0.\nfunc SubmitGeneralProposal(\n\tproposalTitle,\n\tproposalDescription,\n\tdaoPath string,\n\tvotingDeadline uint,\n) uint64 {\n\tassertDAOIsNotLocked()\n\n\topts := []gnome.ProposalOption{\n\t\tgnome.WithDescription(proposalDescription),\n\t\t// gnome.WithReviewDeadline(time.Now().Add(parameters.ReviewDeadline)), // TODO: Enable for mainnet\n\t}\n\n\tif votingDeadline != 0 {\n\t\tif votingDeadline \u003c 2 || votingDeadline \u003e 10 {\n\t\t\tpanic(\"voting period deadline must be between 2 and 10 days\")\n\t\t}\n\n\t\tdeadline := time.Now().Add(time.Hour * 24 * time.Duration(votingDeadline))\n\t\topts = append(opts, gnome.WithVotingDeadline(deadline))\n\t}\n\n\tdao := mustGetDAO(daoPath)\n\tassertDAOIsNotDismissed(dao)\n\n\tcaller := std.GetOrigCaller()\n\tassertCanCreateProposal(caller, dao)\n\n\tp, err := gnome.NewProposal(genProposalID(), newGeneralStrategy(), caller, dao, proposalTitle, opts...)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tif err := p.Validate(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tproposals.Index(p)\n\tAdvanceProposals()\n\n\treturn uint64(p.ID())\n}\n\n// SubmitSubDAOCreationProposal submits a new proposal to add a sub DAO to an existing DAO.\n//\n// Proposal requires the participation of all DAO members, otherwise the outcome will be low participation.\n//\n// Parameters:\n// - proposalTitle: A title for the proposal (required)\n// - proposalDescription: A description of the proposal\n// - parentDAOPath: Path of the sub DAO's parent (required)\n// - subDAOName: Slug name of the new sub DAO (required)\n// - subDAOTitle: A title for the new sub DAO (required)\n// - subDAOManifest: Sub DAO manifest (required)\n// - subDAOMembers: List of sub DAO member addresses (required)\n//\n// Sub DAO name must be a slug allows letters from \"a\" to \"z\", numbers, \"-\" and \"_\" as valid characters.\n//\n// The list of sub DAO members must be a newline separated list of addresses, with a minimum of 2 addresses.\n// Each line must contain an address and optionally be followed by one or more DAO member roles:\n// ```\n// g187982000zsc493znqt828s90cmp6hcp2erhu6m foo\n// g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5 bar foo\n// ```\nfunc SubmitSubDAOCreationProposal(\n\tproposalTitle,\n\tproposalDescription,\n\tparentDAOPath,\n\tsubDAOName,\n\tsubDAOTitle,\n\tsubDAOManifest,\n\tsubDAOMembers string,\n) uint64 {\n\tassertDAOIsNotLocked()\n\n\tdao := mustGetDAO(parentDAOPath)\n\tassertDAOIsNotDismissed(dao)\n\n\tsubDAOPath := dao.Path() + gnome.PathSeparator + subDAOName\n\tif daos.HasPathKey(subDAOPath) {\n\t\tpanic(\"sub DAO name is already taken by another DAO\")\n\t}\n\n\tcaller := std.GetOrigCaller()\n\tassertCanCreateProposal(caller, dao)\n\n\tmembers := gnome.MustParseStringToMembers(subDAOMembers)\n\tstrategy := newSubDAOCreationStrategy(daos, subDAOName, subDAOTitle, subDAOManifest, members)\n\tp, err := gnome.NewProposal(\n\t\tgenProposalID(),\n\t\tstrategy,\n\t\tcaller,\n\t\tdao,\n\t\tproposalTitle,\n\t\tgnome.WithDescription(proposalDescription),\n\t\t// gnome.WithReviewDeadline(time.Now().Add(parameters.ReviewDeadline)), // TODO: Enable for mainnet\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tif err := p.Validate(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tproposals.Index(p)\n\tAdvanceProposals()\n\n\treturn uint64(p.ID())\n}\n\n// SubmitSubDAODismissalProposal submits a new proposal to dismiss a sub DAO.\n//\n// Dismissing a sub DAO also dismisses all active proposals and any sub DAO below the dismissed DAO tree.\n// Only the direct parent of a DAO can create a proposal to dismiss any of its fist level sub DAOs.\n// Proposal requires a 51% quorum, otherwise the outcome will be low participation.\n// Tally is done by plurality.\n//\n// Parameters:\n// - proposalTitle: A title for the proposal (required)\n// - daoPath: Path of the DAO where the proposal should be created (required)\n// - subDAOName: Slug name of the sub DAO to dismiss (required)\nfunc SubmitSubDAODismissalProposal(proposalTitle, daoPath, subDAOName string) uint64 {\n\tassertDAOIsNotLocked()\n\n\tdao := mustGetDAO(daoPath)\n\tassertDAOIsNotDismissed(dao)\n\n\tsubDAOPath := dao.Path() + gnome.PathSeparator + subDAOName\n\tsubDAO := mustGetDAO(subDAOPath)\n\tassertDAOIsNotDismissed(subDAO)\n\n\tcaller := std.GetOrigCaller()\n\tstrategy := newSubDAODismissalStrategy(subDAO, proposals)\n\tp, err := gnome.NewProposal(\n\t\tgenProposalID(),\n\t\tstrategy,\n\t\tcaller,\n\t\tdao,\n\t\tproposalTitle,\n\t\t// gnome.WithReviewDeadline(time.Now().Add(parameters.ReviewDeadline)), // TODO: Enable for mainnet\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tif err := p.Validate(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tproposals.Index(p)\n\tAdvanceProposals()\n\n\treturn uint64(p.ID())\n}\n\n// SubmitDAOMembersModificationProposal submits a new proposal to modify the members of a DAO.\n//\n// Proposal requires a 51% quorum, otherwise the outcome will be low participation.\n// Tally is done by super majority with a 2/3s threshold. Abstentions are not considered.\n//\n// Parameters:\n// - proposalTitle: A title for the proposal (required)\n// - proposalDescription: A description of the proposal\n// - daoPath: Path of the DAO where the proposal should be created (required)\n// - newMembers: List of member addresses to add to Main DAO\n// - removeMembers: List of member addresses to remove from the Main DAO\n//\n// At leat one member address is required either to be added or removed from the DAO.\n// Members can be added and removed within the same proposal.\n//\n// Each list of members must be newline separated list of addresses.\n// Each line must contain an address and optionally be followed by one or more DAO member roles:\n// ```\n// g187982000zsc493znqt828s90cmp6hcp2erhu6m foo\n// g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5 bar foo\n// ```\nfunc SubmitDAOMembersModificationProposal(\n\tproposalTitle,\n\tproposalDescription,\n\tdaoPath,\n\tnewMembers,\n\tremoveMembers string,\n) uint64 {\n\tassertDAOIsNotLocked()\n\n\tdao := mustGetDAO(daoPath)\n\tassertDAOIsNotDismissed(dao)\n\n\tcaller := std.GetOrigCaller()\n\tassertCanCreateProposal(caller, dao)\n\n\tstrategy := newDAOMembersModificationStrategy(\n\t\tgnome.MustParseStringToMembers(newMembers),\n\t\tgnome.MustParseStringToMembers(removeMembers),\n\t)\n\tp, err := gnome.NewProposal(\n\t\tgenProposalID(),\n\t\tstrategy,\n\t\tcaller,\n\t\tdao,\n\t\tproposalTitle,\n\t\tgnome.WithDescription(proposalDescription),\n\t\t// gnome.WithReviewDeadline(time.Now().Add(parameters.ReviewDeadline)), // TODO: Enable for mainnet\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tif err := p.Validate(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tproposals.Index(p)\n\tAdvanceProposals()\n\n\treturn uint64(p.ID())\n}\n\n// SubmitBudgetProposal submits a new budget proposal.\n//\n// Only membes of the Council or Main DAO can vote on this type of proposals.\n// Proposal requires a 51% quorum, otherwise the outcome will be low participation.\n// Tally is done by absolute majority, so all abstentions are considered.\n//\n// Parameters:\n// - proposalTitle: A title for the proposal (required)\n// - proposalDescription: A description of the proposal\n// - daoPath: Path of the DAO where the proposal should be created (required)\n// - budget: The proposal budget (required)\n//\n// Budget doesn't enforce any specific format right now but an example format that\n// could be used is amount plus symbol, for example 100UGNOT, 100000USD, etc.\nfunc SubmitBudgetProposal(\n\tproposalTitle,\n\tproposalDescription,\n\tdaoPath,\n\tbudget string,\n) uint64 {\n\tassertDAOIsNotLocked()\n\n\tdao := mustGetDAO(daoPath)\n\tassertDAOIsNotDismissed(dao)\n\n\tcaller := std.GetOrigCaller()\n\tassertCanCreateProposal(caller, dao)\n\n\tstrategy := newBudgetStrategy(gnomeDAO, budget)\n\tp, err := gnome.NewProposal(\n\t\tgenProposalID(),\n\t\tstrategy,\n\t\tcaller,\n\t\tdao,\n\t\tproposalTitle,\n\t\tgnome.WithDescription(proposalDescription),\n\t\t// gnome.WithReviewDeadline(time.Now().Add(parameters.ReviewDeadline)), // TODO: Enable for mainnet\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tif err := p.Validate(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tproposals.Index(p)\n\tAdvanceProposals()\n\n\treturn uint64(p.ID())\n}\n\n// SubmitDAOLockingProposal submits a new proposal to lock the DAO.\n//\n// Locking the DAO \"freezes the state\" by disallowing further modifications.\n// State must be locked to migrate the realm to a newer version.\n//\n// Proposal requires a 33% quorum, otherwise the outcome will be low participation.\n// This type of proposal can only be created by the Council or Main DAO members.\n// Tally is done by plurality.\n//\n// Parameters:\n// - proposalTitle: A title for the proposal (required)\n// - proposalDescription: A description of the proposal\n// - daoPath: Path of the DAO where the proposal should be created (required)\n// - reason: Text with the DAO locking reason\n//\n// The optional `reason` argument can contain HTML.\nfunc SubmitDAOLockingProposal(\n\tproposalTitle,\n\tproposalDescription,\n\tdaoPath,\n\treason string,\n) uint64 {\n\tassertDAOIsNotLocked()\n\n\tcaller := std.GetOrigCaller()\n\tassertIsCouncilOrMainDAOMember(caller)\n\n\tdao := mustGetDAO(daoPath)\n\tassertIsCouncilOrMainDAO(dao)\n\n\treason = strings.TrimSpace(reason)\n\tstrategy := newLockingStrategy(gnomeDAO, reason, func() error {\n\t\t// Advance all proposals before locking the DAO\n\t\tadvanceProposals()\n\t\treturn nil\n\t})\n\n\tp, err := gnome.NewProposal(\n\t\tgenProposalID(),\n\t\tstrategy,\n\t\tcaller,\n\t\tdao,\n\t\tproposalTitle,\n\t\tgnome.WithDescription(proposalDescription),\n\t\t// gnome.WithReviewDeadline(time.Now().Add(parameters.ReviewDeadline)), // TODO: Enable for mainnet\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tif err := p.Validate(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tproposals.Index(p)\n\tAdvanceProposals()\n\n\treturn uint64(p.ID())\n}\n\n// SubmitParamsUpdateProposal submits a new proposal to update one or more realm parameters.\n//\n// Proposal requires a 51% quorum, otherwise the outcome will be low participation.\n// Tally is done by absolute majority, so all abstentions are considered.\n//\n// Parameters:\n// - proposalTitle: A title for the proposal (required)\n// - proposalDescription: A description of the proposal\n// - daoPath: Path of the DAO where the proposal should be created (required)\n// - proposalReviewDeadline: Number of seconds where proposals can be withdrawed\n// - votingPeriodSubDAOCreation: Voting period for sub DAO creation proposals\n// - votingPeriodSubDAODismissal: Voting period for sub DAO dismissal proposals\n// - votingPeriodDAOMembersModification: Voting period for DAO members modification proposals\n// - votingPeriodBudget: Voting period for budget proposals\n// - votingPeriodGeneral: Voting period for general proposals\n// - votingPeriodLocking: Voting period for locking proposals\n// - votingPeriodParamsUpdate: Voting period for parameters update proposals\n//\n// Voting period is the number of days that members can vote on a proposal\n// At least one parameter value is required for creating a proposal.\nfunc SubmitParamsUpdateProposal(\n\tproposalTitle,\n\tproposalDescription,\n\tdaoPath string,\n\tproposalReviewDeadline,\n\tvotingPeriodSubDAOCreation,\n\tvotingPeriodSubDAODismissal,\n\tvotingPeriodDAOMembersModification,\n\tvotingPeriodBudget,\n\tvotingPeriodGeneral,\n\tvotingPeriodLocking,\n\tvotingPeriodParamsUpdate int,\n) uint64 {\n\tassertDAOIsNotLocked()\n\n\tdao := mustGetDAO(daoPath)\n\tassertDAOIsNotDismissed(dao)\n\n\tcaller := std.GetOrigCaller()\n\tassertCanCreateProposal(caller, dao)\n\n\tstrategy := paramsUpdateStrategy{\n\t\treviewDeadline: time.Second * time.Duration(proposalReviewDeadline),\n\t}\n\n\tif votingPeriodSubDAOCreation \u003e 0 {\n\t\tperiod := time.Duration(votingPeriodSubDAOCreation) * Day\n\t\tstrategy.votingPeriods.Set(StrategyNameBudget, period)\n\t}\n\n\tif votingPeriodSubDAODismissal \u003e 0 {\n\t\tperiod := time.Duration(votingPeriodSubDAODismissal) * Day\n\t\tstrategy.votingPeriods.Set(StrategyNameBudget, period)\n\t}\n\n\tif votingPeriodDAOMembersModification \u003e 0 {\n\t\tperiod := time.Duration(votingPeriodDAOMembersModification) * Day\n\t\tstrategy.votingPeriods.Set(StrategyNameBudget, period)\n\t}\n\n\tif votingPeriodBudget \u003e 0 {\n\t\tperiod := time.Duration(votingPeriodBudget) * Day\n\t\tstrategy.votingPeriods.Set(StrategyNameBudget, period)\n\t}\n\n\tif votingPeriodGeneral \u003e 0 {\n\t\tperiod := time.Duration(votingPeriodGeneral) * Day\n\t\tstrategy.votingPeriods.Set(StrategyNameGeneral, period)\n\t}\n\n\tif votingPeriodLocking \u003e 0 {\n\t\tperiod := time.Duration(votingPeriodLocking) * Day\n\t\tstrategy.votingPeriods.Set(StrategyNameLocking, period)\n\t}\n\n\tif votingPeriodParamsUpdate \u003e 0 {\n\t\tperiod := time.Duration(votingPeriodParamsUpdate) * Day\n\t\tstrategy.votingPeriods.Set(StrategyNameParamsUpdate, period)\n\t}\n\n\tif strategy.votingPeriods.Size() == 0 \u0026\u0026 strategy.reviewDeadline == 0 {\n\t\tpanic(\"at least one parameter value must be specified\")\n\t}\n\n\tp, err := gnome.NewProposal(\n\t\tgenProposalID(),\n\t\tstrategy,\n\t\tcaller,\n\t\tdao,\n\t\tproposalTitle,\n\t\tgnome.WithDescription(proposalDescription),\n\t\t// gnome.WithReviewDeadline(time.Now().Add(parameters.ReviewDeadline)), // TODO: Enable for mainnet\n\t)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tif err := p.Validate(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tproposals.Index(p)\n\tAdvanceProposals()\n\n\treturn uint64(p.ID())\n}\n\nfunc assertCanCreateProposal(proposer std.Address, dao *gnome.DAO) {\n\tif !dao.HasMember(proposer) {\n\t\tpanic(\"you must be a DAO member to create a proposal\")\n\t}\n}\n\nfunc assertDAOIsNotDismissed(dao *gnome.DAO) {\n\t// DAOs are locked when they are dismissed\n\tif dao.IsLocked() {\n\t\tpanic(\"DAO is dismissed: \" + dao.Path())\n\t}\n}\n\nfunc assertDAOIsNotLocked() {\n\tif gnomeDAO.IsLocked() {\n\t\tpanic(\"DAO is locked\")\n\t}\n}\n\nfunc assertIsCouncilOrMainDAO(dao *gnome.DAO) {\n\tif !dao.IsSuperCouncil() {\n\t\t// Main DAO parent must be the super council\n\t\tparentDAO := dao.Parent()\n\t\tif !parentDAO.IsSuperCouncil() {\n\t\t\tpanic(\"DAO is not the council or main DAO\")\n\t\t}\n\t}\n}\n\nfunc assertIsCouncilOrMainDAOMember(addr std.Address) {\n\tif !gnomeDAO.HasMember(addr) {\n\t\tmainDAO := gnomeDAO.SubDAOs()[0]\n\t\tif !mainDAO.HasMember(addr) {\n\t\t\tpanic(\"account is not a council or main DAO member\")\n\t\t}\n\t}\n}\n"},{"name":"public_proposals_0a_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\tgnome \"gno.land/r/gnome/dao/pre2\"\n)\n\nconst member = std.Address(\"g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun\")\n\nfunc init() {\n\tstd.TestSetOrigCaller(member)\n}\n\nfunc main() {\n\ttitle := \"Test proposal\"\n\tdesc := \"A test proposal\"\n\tdaoPath := \"council/main\"\n\tpID := gnome.SubmitGeneralProposal(title, desc, daoPath, 0)\n\tprintln(pID)\n\n\tmarkdown := gnome.Render(\"proposal/1\")\n\tprintln(markdown)\n}\n\n// Output:\n// 1\n// # #1 Test proposal\n// - Type: general\n// - Created: 2009-02-13 23:31 UTC\n// - Proposer: g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun\n// - Status: **review**\n// - Review Deadline: 2009-02-14 00:31 UTC\n// ## Description\n// A test proposal\n// ## Votes\n// The proposal has no votes\n"},{"name":"public_proposals_0b_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\tgnome \"gno.land/r/gnome/dao/pre2\"\n)\n\nconst nonMember = std.Address(\"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\")\n\nfunc init() {\n\tstd.TestSetOrigCaller(nonMember)\n}\n\nfunc main() {\n\ttitle := \"Test proposal\"\n\tdesc := \"A test proposal\"\n\tdaoPath := \"council/main\"\n\tgnome.SubmitGeneralProposal(title, desc, daoPath, 0)\n}\n\n// Error:\n// you must be a DAO member to create a proposal\n"},{"name":"public_proposals_0c_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\tgnome \"gno.land/r/gnome/dao/pre2\"\n)\n\nconst member = std.Address(\"g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun\")\n\nfunc init() {\n\tstd.TestSetOrigCaller(member)\n}\n\nfunc main() {\n\ttitle := \"Test proposal\"\n\tdesc := \"A test proposal\"\n\tdaoPath := \"council/main\"\n\tgnome.SubmitGeneralProposal(title, desc, daoPath, 1)\n}\n\n// Error:\n// voting period deadline must be between 2 and 10 days\n"},{"name":"public_proposals_0d_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\tgnome \"gno.land/r/gnome/dao/pre2\"\n)\n\nconst member = std.Address(\"g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun\")\n\nfunc init() {\n\tstd.TestSetOrigCaller(member)\n}\n\nfunc main() {\n\ttitle := \"Test proposal\"\n\tdesc := \"A test proposal\"\n\tdaoPath := \"invalid\"\n\tgnome.SubmitGeneralProposal(title, desc, daoPath, 0)\n}\n\n// Error:\n// DAO not found\n"},{"name":"public_proposals_0e_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\tgnome \"gno.land/r/gnome/dao/pre2\"\n)\n\nconst member = std.Address(\"g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun\")\n\nfunc init() {\n\tstd.TestSetOrigCaller(member)\n}\n\nfunc main() {\n\ttitle := \"Test proposal\"\n\tdaoPath := \"council/main\"\n\tgnome.SubmitGeneralProposal(title, \"\", daoPath, 0)\n}\n\n// Error:\n// proposal description is required\n"},{"name":"render.gno","body":"package gnome\n\nimport (\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"gno.land/p/demo/ufmt\"\n\n\t\"gno.land/p/gnome/alerts\"\n\tgnome \"gno.land/p/gnome/dao\"\n\trouter \"gno.land/p/gnome/router/v1\"\n)\n\nconst (\n\tdateFmt = \"2006-01-02 15:04 MST\"\n\tproposalTakeoverMsg = \"For the proposal outcome to change it has to be taken over by a parent DAO by voting on it\"\n)\n\nconst (\n\tcustomStyle = `\n\u003cstyle\u003e\n.custom ul { padding-left: 20px; }\n.custom li { list-style-type: disc; }\n.custom li.current { font-weight: 900; }\n.custom li \u003e p { margin: 0px; }\n\u003c/style\u003e\n`\n\tpaginatorStyle = `\u003cstyle\u003e\n.paginator { text-align: center; }\n.paginator a { text-decoration: none; }\n.paginator a:hover { text-decoration: underline; }\n.paginator .left { padding-right: 4px; }\n.paginator .right { padding-left: 4px; }\n\u003c/style\u003e`\n)\n\nfunc renderAlerts() string {\n\tif gnomeDAO.IsLocked() {\n\t\tmsg := \"Realm is locked\"\n\t\tif reason := gnomeDAO.LockReason(); reason != \"\" {\n\t\t\tmsg += \"\u003c/br\u003e\" + reason\n\t\t}\n\n\t\treturn alerts.NewError(msg)\n\t}\n\n\tif IsProposalsAdvanceNeeded() {\n\t\treturn alerts.NewWarning(\n\t\t\tnewGnoStudioConnectLink(\"AdvanceProposals\", \"Proposals advance needed\"),\n\t\t)\n\t}\n\treturn \"\"\n}\n\nfunc renderDAO(res router.ResponseWriter, req router.Request) {\n\tvar (\n\t\tdao *gnome.DAO\n\t\tdaoPath = req.Route\n\t)\n\n\tif daoPath == \"\" {\n\t\tdao = gnomeDAO\n\t\tdaoPath = nameCouncilDAO\n\t} else {\n\t\tvar found bool\n\t\tdao, found = daos.GetByPath(daoPath)\n\t\tif !found {\n\t\t\tres.Write(\"DAO Not Found\")\n\t\t\treturn\n\t\t}\n\n\t\t// TODO: Add lock dismissal reason when available\n\t\tif dao.IsLocked() {\n\t\t\tres.Write(alerts.NewError(\"DAO is dismissed\"))\n\t\t}\n\t}\n\n\tres.Writef(\n\t\t\"# Gno.me DAO\\n\"+\n\t\t\t\"## %s\\n\"+\n\t\t\t\"%s\\n\\n\"+\n\t\t\t\"[View Proposals of %s](%s)\\n\",\n\t\tdao.Title(),\n\t\tdao.Manifest(),\n\t\tdao.Title(),\n\t\tmakeProposalsURI(daoPath, true),\n\t)\n\n\tres.Write(\"## \" + dao.Title() + \" Members\\n\")\n\tfor _, m := range dao.Members() {\n\t\tres.Write(\"- \" + m.String() + \"\\n\")\n\t}\n\n\tres.Write(\"\\n\" + customStyle + \"\\n\\n\")\n\n\tres.Write(\"## Organization\\n\\n\")\n\tres.Write(renderOrganizationTree(daoPath))\n\tres.Write(\"\\n\")\n}\n\nfunc renderProposals(res router.ResponseWriter, req router.Request) {\n\tdaoPath := req.Route\n\tdao, found := daos.GetByPath(daoPath)\n\tif !found {\n\t\tres.Write(\"DAO Not Found\")\n\t\treturn\n\t}\n\n\tdaoProposals := proposals.GetAllByDAO(dao.Path())\n\tcount := len(daoProposals)\n\tif count == 0 {\n\t\tres.Write(\"DAO has no proposals\")\n\t\treturn\n\t}\n\n\trealmPath := makeRealmPath(req.Path)\n\tpages := gnome.NewPaginator(realmPath, gnome.WithItemCount(count))\n\n\t// TODO: Add links to toggle display of dismissed proposals (when DAO dismissal is implemented)\n\n\tres.Writef(\"# %s: Proposals\\n\", dao.Title())\n\tpages.Iterate(func(i int) bool {\n\t\tif i \u003e= count {\n\t\t\treturn true\n\t\t}\n\n\t\tp := daoProposals[i]\n\t\t_ = advanceProposal(p) // TODO: Handle errors when render notice support is implemented\n\t\tpath := makeProposalURI(p.ID(), true)\n\t\tres.Writef(\"- [#%s %s](%s) (%s)\\n\", p.ID(), p.Title(), path, p.Status())\n\t\treturn false\n\t})\n\n\tif pages.IsEnabled() {\n\t\tres.Write(renderPaginator(pages))\n\t}\n}\n\n// TODO: Improve renderProposal code\nfunc renderProposal(res router.ResponseWriter, req router.Request) {\n\trawID := req.Route\n\tid, err := strconv.Atoi(rawID)\n\tif err != nil {\n\t\tres.Write(\"Invalid proposal ID: \" + gnome.EscapeHTML(rawID))\n\t\treturn\n\t}\n\n\tproposal, found := proposals.GetByID(gnome.ID(id))\n\tif !found {\n\t\tres.Write(\"Proposal Not Found\")\n\t\treturn\n\t}\n\n\tvar (\n\t\toutcome gnome.ProposalStatus\n\t\tstatus = proposal.Status()\n\t)\n\n\t// When the status is not final advance the proposal to calculate the current outcome\n\tif !status.IsFinal() {\n\t\t_ = advanceProposal(proposal) // TODO: Implement generic alert support for render and use it to render errors\n\t\toutcome = proposal.Status()\n\n\t\t// Validate if proposal is valid for the current state\n\t\tif err := proposal.Validate(); err != nil {\n\t\t\tres.Write(alerts.NewError(err.Error()))\n\t\t}\n\n\t\t// Warn when the outcome could change if a member of a parent DAO votes on this proposal.\n\t\t// Proposal choice is only available when there is a majority, so there is voting concensus.\n\t\tif proposal.Choice() != gnome.ChoiceNone \u0026\u0026 !proposal.HasVotingDeadlinePassed() {\n\t\t\tres.Write(alerts.NewWarning(proposalTakeoverMsg))\n\t\t}\n\t} else if status == gnome.StatusDismissed {\n\t\t// Display an alert with the dismiss reason\n\t\tres.Write(alerts.NewWarning(proposal.StatusReason()))\n\t}\n\n\tdao := proposal.DAO()\n\tdaoPath := dao.Path()\n\tif proposal.HasBeenPromoted() {\n\t\turi := makeDAOURI(daoPath, true)\n\t\tlink := alerts.NewLink(uri, dao.Title())\n\t\tres.Write(alerts.NewWarning(\"Proposal has been promoted to \" + link + \" DAO\"))\n\t}\n\n\tres.Write(\"# #\" + proposal.ID().String() + \" \" + proposal.Title() + \"\\n\")\n\tres.Write(\"- Type: \" + proposal.Strategy().Name() + \"\\n\")\n\tres.Write(\"- Created: \" + proposal.CreatedAt().UTC().Format(dateFmt) + \"\\n\")\n\tres.Write(\"- Proposer: \" + proposal.Proposer().String() + \"\\n\")\n\tres.Write(\"- Status: \" + getProposalStatusMarkdown(status, proposal.Choice(), proposal.StatusReason()) + \"\\n\")\n\n\tif !status.IsFinal() {\n\t\tif outcome == gnome.StatusReview {\n\t\t\tres.Write(\"- Review Deadline: \" + proposal.ReviewDeadline().UTC().Format(dateFmt) + \"\\n\")\n\t\t} else {\n\t\t\tres.Write(\"- Voting Deadline: \" + proposal.VotingDeadline().UTC().Format(dateFmt) + \"\\n\")\n\t\t\tres.Write(\"- Expected Outcome: \" + getProposalStatusMarkdown(outcome, proposal.Choice(), proposal.StatusReason()) + \"\\n\")\n\n\t\t\t// Vote line should be render as long as voting deadline is not reached.\n\t\t\t// This is required for proposals that have to be advanced after deadline is reached.\n\t\t\tif !proposal.HasVotingDeadlinePassed() {\n\t\t\t\tres.Write(\"\\n\" + newGnoStudioConnectLink(\"Vote\", \"Vote on this proposal\") + \"\\n\")\n\t\t\t}\n\t\t}\n\t}\n\n\tif s := proposal.Description(); s != \"\" {\n\t\tres.Write(\"## Description\\n\" + s + \"\\n\")\n\t}\n\n\tif r, ok := proposal.Strategy().(gnome.ParamsRenderer); ok {\n\t\t// TODO: Use custom HTML component to allow users to toggle params visibility\n\t\tif s := r.RenderParams(); s != \"\" {\n\t\t\tres.Write(\"## Parameters\\n\\n\" + s + \"\\n\")\n\t\t}\n\t}\n\n\tres.Write(\"## Votes\\n\")\n\trecord := proposal.VotingRecord()\n\tif record.VoteCount() == 0 {\n\t\tres.Write(\"The proposal has no votes\\n\")\n\t} else {\n\t\t// TODO: Render percentages for each voting choice and abstentions?\n\t\trecord.Iterate(func(c gnome.VoteChoice, count uint) bool {\n\t\t\tres.Writef(\"- %s: %d\\n\", string(c), count)\n\t\t\treturn false\n\t\t})\n\n\t\tres.Write(\"## Participation\\n\")\n\t\trenderProposalParticipation(res, record.Votes())\n\t}\n\n\t// If proposal has been promoted to a parent DAO render participation in child DAOs\n\tif proposal.HasBeenPromoted() {\n\t\tres.Write(\"## Sub DAOs Participation\\n\")\n\t\tdaos := proposal.Promotions()\n\t\trecords := proposal.VotingRecords()\n\t\tfor i := len(records) - 2; i \u003e= 0; i-- { // reverse iteration excluding record for current DAO\n\t\t\tr := records[i]\n\t\t\tdao := daos[i]\n\t\t\tres.Write(\"### [\" + dao.Title() + \"](\" + makeDAOURI(daoPath, true) + \"]\\n\")\n\t\t\trenderProposalParticipation(res, r.Votes())\n\t\t}\n\t}\n}\n\nfunc renderParams(res router.ResponseWriter, req router.Request) {\n\tres.Write(\"# Gno.me DAO: Parameters\\n\")\n\tres.Write(\"## Proposal\\n\")\n\tres.Write(\"**General**\\n\")\n\tres.Write(\"- Review Deadline: \" + gnome.HumanizeDuration(parameters.ReviewDeadline) + \"\\n\")\n\n\tres.Write(\"\\n**Voting Periods**\\n\")\n\tparameters.VotingPeriods.Iterate(func(name string, period time.Duration) bool {\n\t\tres.Write(\"- `\" + name + \"`: \" + gnome.HumanizeDuration(period) + \"\\n\")\n\t\treturn false\n\t})\n}\n\nfunc renderProposalParticipation(res router.ResponseWriter, votes []gnome.Vote) {\n\tfor _, v := range votes {\n\t\tchoice := string(v.Choice)\n\t\tif v.Reason != \"\" {\n\t\t\t// TODO: Long reasons have to break lines to fit making web UI look bad\n\t\t\tchoice += ` \"` + gnome.EscapeHTML(v.Reason) + `\"`\n\t\t}\n\n\t\tres.Writef(\"- %s: voted %s\\n\", v.Address.String(), choice)\n\t}\n}\n\n// TODO: Use the UI package for HTML elements because rendered Markdown styles break the tree\nfunc renderOrganizationTree(currentPath string) string {\n\tvar item string\n\tif gnomeDAO.Name() == currentPath {\n\t\titem = `\u003cli class=\"current\"\u003e` + gnomeDAO.Title() + `\u003c/li\u003e`\n\t} else {\n\t\turi := makeDAOURI(gnomeDAO.Path(), true)\n\t\titem = `\u003cli\u003e` + alerts.NewLink(uri, gnomeDAO.Title()) + `\u003c/li\u003e`\n\t}\n\treturn `\u003cdiv class=\"custom\"\u003e\u003cul\u003e` + item + renderSubTree(gnomeDAO, currentPath) + `\u003c/ul\u003e\u003c/div\u003e`\n}\n\nfunc renderSubTree(parentDAO *gnome.DAO, currentPath string) string {\n\tvar (\n\t\tbuf strings.Builder\n\t\titem string\n\t)\n\n\tfor _, dao := range parentDAO.SubDAOs() {\n\t\tif dao.IsLocked() {\n\t\t\t// Skip dismissed DAOs\n\t\t\t// TODO: Render filter option to toggle dismissed DAOs visibility\n\t\t\tcontinue\n\t\t}\n\n\t\tif dao.Path() == currentPath {\n\t\t\titem = `\u003cli class=\"current\"\u003e` + dao.Title() + `\u003c/li\u003e`\n\t\t} else {\n\t\t\turi := makeDAOURI(dao.Path(), true)\n\t\t\titem = `\u003cli\u003e` + alerts.NewLink(uri, dao.Title()) + `\u003c/li\u003e`\n\t\t}\n\n\t\tbuf.WriteString(item)\n\n\t\tif len(dao.SubDAOs()) \u003e 0 {\n\t\t\tbuf.WriteString(renderSubTree(dao, currentPath))\n\t\t}\n\t}\n\treturn `\u003cul\u003e` + buf.String() + `\u003c/ul\u003e`\n}\n\nfunc renderPaginator(p gnome.Paginator) string {\n\tvar out string\n\tif s := p.PrevPageURI(); s != \"\" {\n\t\tout = ufmt.Sprintf(`\u003ca href=\"%s\" class=\"left\"\u003e\u0026lt;-\u003c/a\u003e`, s)\n\t} else {\n\t\tout += `\u003cspan class=\"left\"\u003e--\u003c/span\u003e`\n\t}\n\n\t// TODO: Add display links to other page numbers?\n\tout += ufmt.Sprintf(\"page %d\", p.Page())\n\n\tif s := p.NextPageURI(); s != \"\" {\n\t\tout += ufmt.Sprintf(`\u003ca href=\"%s\" class=\"right\"\u003e-\u0026gt;\u003c/a\u003e`, s)\n\t} else {\n\t\tout += `\u003cspan class=\"right\"\u003e--\u003c/span\u003e`\n\t}\n\n\treturn \"\\n\" + paginatorStyle + `\u003cp class=\"paginator\"\u003e` + out + `\u003c/p\u003e`\n}\n\nfunc advanceProposal(p *gnome.Proposal) error {\n\tstatus := p.Status()\n\tif status == gnome.StatusReview \u0026\u0026 p.HasReviewDeadlinePassed() {\n\t\tif err := p.Activate(); err != nil {\n\t\t\treturn err\n\t\t}\n\n\t\tstatus = p.Status()\n\t}\n\n\tif status == gnome.StatusActive {\n\t\t// Tally active proposals to always have an up to date state with the current proposal outcome\n\t\tif err := p.Tally(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc getProposalStatusMarkdown(s gnome.ProposalStatus, c gnome.VoteChoice, reason string) string {\n\tswitch s {\n\tcase gnome.StatusPassed:\n\t\treturn ufmt.Sprintf(\"**%s** (%s)\", s, string(c))\n\tcase gnome.StatusRejected:\n\t\t// Rejected proposal might have a reason\n\t\tif reason == \"\" {\n\t\t\treturn ufmt.Sprintf(\"**%s**\", s)\n\t\t} else {\n\t\t\treturn ufmt.Sprintf(\"**%s** (%s)\", s, reason)\n\t\t}\n\tcase gnome.StatusDismissed, gnome.StatusFailed:\n\t\treturn ufmt.Sprintf(\"**%s** (%s)\", s, reason)\n\tdefault:\n\t\treturn ufmt.Sprintf(\"**%s**\", s)\n\t}\n}\n\nfunc newGnoStudioConnectLink(functionName, label string) string {\n\thref := makeGnoStudioConnectURL(functionName)\n\treturn alerts.NewLink(href, label)\n}\n"},{"name":"strategy_budget.gno","body":"package gnome\n\nimport (\n\t\"errors\"\n\t\"std\"\n\t\"strings\"\n\t\"time\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\nfunc newBudgetStrategy(council *gnome.DAO, budget string) budgetStrategy {\n\tif council == nil {\n\t\tpanic(\"council DAO is requried\")\n\t}\n\n\tif !council.IsSuperCouncil() {\n\t\tpanic(\"budget strategy expects DAO to be a super council\")\n\t}\n\n\tbudget = strings.TrimSpace(budget)\n\tif budget == \"\" {\n\t\tpanic(\"budget is required\")\n\t}\n\n\t// The council DAO must have at least one sub DAO which should the main DAO.\n\t// The first sub DAO is some times used to check if a vote is valid.\n\tif len(council.SubDAOs()) == 0 {\n\t\tpanic(\"budget strategy expects council DAO to have at least one sub DAO\")\n\t}\n\n\treturn budgetStrategy{\n\t\tchoices: []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo},\n\t\tcouncil: council,\n\t\tbudget: budget, // TODO: Validate/split budget format? (ex. AMOUNTSYMBOL: 10USD)\n\t}\n}\n\ntype budgetStrategy struct {\n\tchoices []gnome.VoteChoice\n\tcouncil *gnome.DAO\n\tbudget string\n}\n\n// Name returns the name of the strategy.\nfunc (budgetStrategy) Name() string {\n\treturn StrategyNameBudget\n}\n\n// Quorum returns the minimum required percentage of DAO member votes\n// required for a proposal to pass.\nfunc (budgetStrategy) Quorum() float64 {\n\treturn 0.51\n}\n\n// VotingPeriod returns the period that a proposal should allow voting.\nfunc (budgetStrategy) VotingPeriod() time.Duration {\n\tperiod, _ := parameters.VotingPeriods.Get(StrategyNameBudget)\n\treturn period\n}\n\n// VoteChoices returns the valid voting choices for the strategy.\nfunc (s budgetStrategy) VoteChoices() []gnome.VoteChoice {\n\treturn s.choices\n}\n\n// CheckVote checks that a vote is valid for the strategy.\nfunc (s budgetStrategy) CheckVote(addr std.Address, _ gnome.VoteChoice, _ string) error {\n\t// Check that voter address belongs to a council DAO member\n\tif s.council.HasMember(addr) {\n\t\treturn nil\n\t}\n\n\t// Make sure the main DAO was not dismissed and check that voter address belongs to a main DAO member\n\t// TODO: Check DAO status instead when DAO dismissal is implemented\n\tif sub := s.council.SubDAOs(); len(sub) \u003e 0 {\n\t\tmainDAO := sub[0]\n\t\tif !mainDAO.HasMember(addr) {\n\t\t\treturn errors.New(\"only members of the council DAO or main DAO can vote on budget proposals\")\n\t\t}\n\t} else {\n\t\treturn errors.New(\"main DAO not found\")\n\t}\n\treturn nil\n}\n\n// Tally counts the votes and returns the winner voting choice.\nfunc (budgetStrategy) Tally(dao *gnome.DAO, r gnome.VotingRecord) gnome.VoteChoice {\n\t// Consider abstentions to make the majority absolute\n\tabstentions := len(dao.Members()) - r.VoteCount()\n\tif choice, ok := gnome.SelectChoiceByMajority(r, abstentions); ok {\n\t\treturn choice\n\t}\n\treturn gnome.ChoiceNone\n}\n\n// RenderParams returns a markdown with the rendered strategy parameters.\nfunc (s budgetStrategy) RenderParams() string {\n\treturn \"Budget: \" + gnome.EscapeHTML(s.budget)\n}\n"},{"name":"strategy_budget_test.gno","body":"package gnome\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"std\"\n\t\"testing\"\n\t\"time\"\n\n\t\"gno.land/p/demo/testutils\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\nfunc TestBudgetStrategy(t *testing.T) {\n\tcases := []struct {\n\t\tname string\n\t\tcouncil *gnome.DAO\n\t\terr string\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\tcouncil: gnome.MustNew(\"council\", \"Council\",\n\t\t\t\tgnome.AssignAsSuperCouncil(),\n\t\t\t\tgnome.WithSubDAO(\n\t\t\t\t\tgnome.MustNew(\"main\", \"Main\"),\n\t\t\t\t),\n\t\t\t),\n\t\t},\n\t\t{\n\t\t\tname: \"nil council\",\n\t\t\terr: \"council DAO is requried\",\n\t\t},\n\t\t{\n\t\t\tname: \"no super council\",\n\t\t\tcouncil: gnome.MustNew(\"council\", \"Council\"),\n\t\t\terr: \"budget strategy expects DAO to be a super council\",\n\t\t},\n\t\t{\n\t\t\tname: \"council without main DAO\",\n\t\t\tcouncil: gnome.MustNew(\"council\", \"Council\", gnome.AssignAsSuperCouncil()),\n\t\t\terr: \"budget strategy expects council DAO to have at least one sub DAO\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tname := StrategyNameBudget\n\t\t\tquorum := 0.51\n\t\t\tvotingPeriod := time.Hour * 24 * 7\n\t\t\tchoices := fmt.Sprintf(\"%v\", []gnome.VoteChoice{\n\t\t\t\tgnome.ChoiceYes,\n\t\t\t\tgnome.ChoiceNo,\n\t\t\t})\n\n\t\t\t// Act\n\t\t\tvar s budgetStrategy\n\t\t\terr := handlePanic(t, func() {\n\t\t\t\ts = newBudgetStrategy(tc.council, \"1USD\")\n\t\t\t})\n\n\t\t\t// Assert\n\t\t\tif tc.err != \"\" {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tassertNoError(t, err)\n\n\t\t\tif got := s.Name(); got != name {\n\t\t\t\tt.Fatalf(\"expected strategy name: '%s', got: '%s'\", name, got)\n\t\t\t}\n\n\t\t\tif got := s.Quorum(); got != quorum {\n\t\t\t\tt.Fatalf(\"expected strategy quorum: %.2f, got: %.2f\", quorum, got)\n\t\t\t}\n\n\t\t\tif got := s.VotingPeriod(); got != votingPeriod {\n\t\t\t\tt.Fatalf(\"expected strategy voting period: %d, got: %d\", votingPeriod, got)\n\t\t\t}\n\n\t\t\tif got := fmt.Sprintf(\"%v\", s.VoteChoices()); got != choices {\n\t\t\t\tt.Fatalf(\"expected strategy vote choices: %s, got: %s\", choices, got)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestBudgetStrategyCheckVote(t *testing.T) {\n\tcouncilMember := newTestMember(t, \"council\")\n\tmainMember := newTestMember(t, \"main\")\n\tcouncil := gnome.MustNew(\n\t\t\"council\",\n\t\t\"Council\",\n\t\tgnome.AssignAsSuperCouncil(),\n\t\tgnome.WithMembers(councilMember),\n\t\tgnome.WithSubDAO(\n\t\t\tgnome.MustNew(\"main\", \"Main\", gnome.WithMembers(mainMember)),\n\t\t),\n\t)\n\n\tcases := []struct {\n\t\tname string\n\t\taddress std.Address\n\t\tchoice gnome.VoteChoice\n\t\tcouncil *gnome.DAO\n\t\terr string\n\t}{\n\t\t{\n\t\t\tname: \"council DAO vote\",\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t\taddress: councilMember.Address,\n\t\t\tcouncil: council,\n\t\t},\n\t\t{\n\t\t\tname: \"main DAO vote\",\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t\taddress: mainMember.Address,\n\t\t\tcouncil: council,\n\t\t},\n\t\t{\n\t\t\tname: \"non member vote\",\n\t\t\tchoice: gnome.ChoiceNo,\n\t\t\taddress: testutils.TestAddress(\"foo\"),\n\t\t\tcouncil: council,\n\t\t\terr: \"only members of the council DAO or main DAO can vote on budget proposals\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\ts := newBudgetStrategy(tc.council, \"1USD\")\n\n\t\t\t// Act\n\t\t\terr := s.CheckVote(tc.address, tc.choice, \"\")\n\n\t\t\t// Assert\n\t\t\tif tc.err != \"\" {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t} else {\n\t\t\t\tassertNoError(t, err)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestBudgetStrategyTally(t *testing.T) {\n\tcouncil := gnome.MustNew(\n\t\t\"council\",\n\t\t\"Council\",\n\t\tgnome.AssignAsSuperCouncil(),\n\t\tgnome.WithMembers(\n\t\t\tnewTestMember(t, \"member1\"),\n\t\t\tnewTestMember(t, \"member2\"),\n\t\t\tnewTestMember(t, \"member3\"),\n\t\t\tnewTestMember(t, \"member4\"),\n\t\t),\n\t\tgnome.WithSubDAO(\n\t\t\tgnome.MustNew(\"main\", \"Main\"),\n\t\t),\n\t)\n\tcases := []struct {\n\t\tname string\n\t\tvotes []gnome.Vote\n\t\tchoice gnome.VoteChoice\n\t}{\n\t\t{\n\t\t\tname: \"majority\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t},\n\t\t{\n\t\t\tname: \"majority with abstentions\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNo,\n\t\t},\n\t\t{\n\t\t\tname: \"no quorum\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNone,\n\t\t},\n\t\t{\n\t\t\tname: \"no quorum with abstentions\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNone,\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\trecord := gnome.NewVotingRecord()\n\t\t\tfor _, v := range tc.votes {\n\t\t\t\trecord.Add(v)\n\t\t\t}\n\n\t\t\ts := newBudgetStrategy(council, \"1USD\")\n\n\t\t\t// Act\n\t\t\tchoice := s.Tally(council, *record)\n\n\t\t\t// Assert\n\t\t\tif choice != tc.choice {\n\t\t\t\tt.Fatalf(\"expected tally result choice: '%v', got: '%v'\", tc.choice, choice)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc handlePanic(t *testing.T, fn func()) (reason error) {\n\tt.Helper()\n\n\tdefer func() {\n\t\tif r := recover(); r != nil {\n\t\t\tif err, _ := r.(error); err != nil {\n\t\t\t\treason = err\n\t\t\t} else {\n\t\t\t\treason = errors.New(fmt.Sprint(r))\n\t\t\t}\n\t\t}\n\t}()\n\n\tfn()\n\treturn\n}\n"},{"name":"strategy_dao.gno","body":"package gnome\n\nimport (\n\t\"errors\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\n// Minimum number of members per DAO.\n// This requirement is enforced because two members DAO can only use plurality to tally.\nconst minMembersCount = 3\n\nfunc newSubDAOCreationStrategy(daos daoIndex, name, title, manifest string, members []gnome.Member) subDAOCreationStrategy {\n\tif strings.TrimSpace(name) == \"\" {\n\t\tpanic(\"sub DAO name is required\")\n\t}\n\n\tif !gnome.IsSlug(name) {\n\t\tpanic(`invalid sub DAO name, only letters from \"a\" to \"z\", numbers, \"-\" and \"_\" are allowed`)\n\t}\n\n\tif strings.TrimSpace(title) == \"\" {\n\t\tpanic(\"sub DAO title is required\")\n\t}\n\n\tif strings.TrimSpace(manifest) == \"\" {\n\t\tpanic(\"sub DAO manifest is required\")\n\t}\n\n\tif len(members) \u003c minMembersCount {\n\t\tpanic(\"sub DAOs require at least \" + strconv.Itoa(minMembersCount) + \" members\")\n\t}\n\n\treturn subDAOCreationStrategy{\n\t\tchoices: []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo},\n\t\tdaos: daos,\n\t\tname: name,\n\t\ttitle: title,\n\t\tmanifest: manifest,\n\t\tmembers: members,\n\t}\n}\n\ntype subDAOCreationStrategy struct {\n\tchoices []gnome.VoteChoice\n\tdaos daoIndex\n\tname, title, manifest string\n\tmembers []gnome.Member\n}\n\n// Name returns the name of the strategy.\nfunc (subDAOCreationStrategy) Name() string {\n\treturn StrategyNameSubDAOCreation\n}\n\n// Quorum returns the minimum required percentage of DAO member votes\n// required for a proposal to pass.\nfunc (subDAOCreationStrategy) Quorum() float64 {\n\treturn 1.0\n}\n\n// VotingPeriod returns the period that a proposal should allow voting.\nfunc (subDAOCreationStrategy) VotingPeriod() time.Duration {\n\tperiod, _ := parameters.VotingPeriods.Get(StrategyNameSubDAOCreation)\n\treturn period\n}\n\n// VoteChoices returns the valid voting choices for the strategy.\nfunc (s subDAOCreationStrategy) VoteChoices() []gnome.VoteChoice {\n\treturn s.choices\n}\n\n// Tally counts the votes and returns the winner voting choice.\nfunc (subDAOCreationStrategy) Tally(dao *gnome.DAO, r gnome.VotingRecord) gnome.VoteChoice {\n\t// Strategy need 100% participation to decide on the outcome.\n\t// Normally quorum should make sure all members voted before\n\t// tallying but otherwise tally should not return a valid outcome.\n\tif len(dao.Members()) != r.VoteCount() {\n\t\treturn gnome.ChoiceNone\n\t}\n\n\t// This type of proposals can pass only when 100% of members vote YES.\n\tfor _, v := range r.Votes() {\n\t\t// If there is at least one NO vote then proposal must be rejected\n\t\tif v.Choice == gnome.ChoiceNo {\n\t\t\treturn gnome.ChoiceNo\n\t\t}\n\t}\n\t// Proposal should pass when all votes are YES\n\treturn gnome.ChoiceYes\n}\n\n// Validate validates if a proposal is valid for the current state.\nfunc (s subDAOCreationStrategy) Validate(p *gnome.Proposal) error {\n\tdao := p.DAO()\n\tpath := dao.Path()\n\tif dao.IsLocked() {\n\t\treturn errors.New(\"parent DAO '\" + path + \"' is locked\")\n\t}\n\n\tsubDAOPath := path + gnome.PathSeparator + s.name\n\tif s.daos.HasPathKey(subDAOPath) {\n\t\treturn errors.New(\"sub DAO path has been taken by another DAO\")\n\t}\n\treturn nil\n}\n\n// RenderParams returns a markdown with the rendered strategy parameters.\nfunc (s subDAOCreationStrategy) RenderParams() string {\n\tvar (\n\t\tb strings.Builder\n\t\tmembers []string\n\t\tmanifest = gnome.EscapeHTML(s.manifest)\n\t)\n\n\tfor _, addr := range s.members {\n\t\tmembers = append(members, addr.String())\n\t}\n\n\t// TODO: Use a custom HTML table and add styling (vertical alignment, padding, ...)\n\t// This would allow to remove the markdown \"hacks\" to improve the output layout\n\tb.WriteString(\"|||\\n|---|---|\\n\")\n\tb.WriteString(\"| Name: | \" + gnome.EscapeHTML(s.name) + \" |\\n\")\n\tb.WriteString(\"| Title: | \" + gnome.EscapeHTML(s.title) + \" |\\n\")\n\tb.WriteString(\"| Members: | \u003c/br\u003e\" + strings.Join(members, \"\u003c/br\u003e\") + \"\u003c/br\u003e\u003c/br\u003e |\\n\")\n\tb.WriteString(\"| Manifest:\u0026nbsp;\u0026nbsp; | \" + strings.ReplaceAll(manifest, \"\\n\", \"\u003c/br\u003e\") + \" |\\n\")\n\n\treturn b.String()\n}\n\n// Execute creates the new sub DAO.\nfunc (s subDAOCreationStrategy) Execute(dao *gnome.DAO) error {\n\tsubDAO, err := gnome.New(s.name, s.title, gnome.WithManifest(s.manifest), gnome.WithMembers(s.members...))\n\tif err != nil {\n\t\treturn err\n\t}\n\n\t// Add the new sub DAO to its parent\n\tdao.AddSubDAO(subDAO)\n\n\t// Index the new sub DAO\n\ts.daos.IndexByPath(subDAO)\n\n\treturn nil\n}\n\nfunc newDAOMembersModificationStrategy(newMembers, removeMembers []gnome.Member) daoMembersModificationStrategy {\n\tif len(newMembers) == 0 \u0026\u0026 len(removeMembers) == 0 {\n\t\tpanic(\"members are required\")\n\t}\n\n\treturn daoMembersModificationStrategy{\n\t\tchoices: []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo},\n\t\tnewMembers: newMembers,\n\t\tremoveMembers: removeMembers,\n\t}\n}\n\ntype daoMembersModificationStrategy struct {\n\tchoices []gnome.VoteChoice\n\tnewMembers, removeMembers []gnome.Member\n}\n\n// Name returns the name of the strategy.\nfunc (daoMembersModificationStrategy) Name() string {\n\treturn StrategyNameDAOMembersModification\n}\n\n// Quorum returns the minimum required percentage of DAO member votes\n// required for a proposal to pass.\nfunc (daoMembersModificationStrategy) Quorum() float64 {\n\treturn 0.51\n}\n\n// VotingPeriod returns the period that a proposal should allow voting.\nfunc (daoMembersModificationStrategy) VotingPeriod() time.Duration {\n\tperiod, _ := parameters.VotingPeriods.Get(StrategyNameDAOMembersModification)\n\treturn period\n}\n\n// VoteChoices returns the valid voting choices for the strategy.\nfunc (s daoMembersModificationStrategy) VoteChoices() []gnome.VoteChoice {\n\treturn s.choices\n}\n\n// Tally counts the votes and returns the winner voting choice.\nfunc (daoMembersModificationStrategy) Tally(_ *gnome.DAO, r gnome.VotingRecord) gnome.VoteChoice {\n\t// Tally requires at least three votes to be able to tally by 2/3s super majority\n\tif r.VoteCount() \u003c 3 {\n\t\treturn gnome.ChoiceNone\n\t}\n\n\tif choice, ok := gnome.SelectChoiceBySuperMajority(r); ok {\n\t\treturn choice\n\t}\n\treturn gnome.ChoiceNone\n}\n\n// Validate validates if a proposal is valid for the current DAO state.\nfunc (s daoMembersModificationStrategy) Validate(p *gnome.Proposal) error {\n\t// At least three members are required to enforce 2/3s majority on proposals\n\tdao := p.DAO()\n\tmemberCount := len(dao.Members()) + len(s.newMembers) - len(s.removeMembers)\n\tif memberCount \u003c minMembersCount {\n\t\treturn errors.New(\"DAO must always have a minimum of \" + strconv.Itoa(minMembersCount) + \" members\")\n\t}\n\n\t// TODO: Should we allow re-adding members to only change assigned roles?\n\tfor _, m := range s.newMembers {\n\t\tif dao.HasMember(m.Address) {\n\t\t\treturn errors.New(\"address is already a DAO member: \" + m.Address.String())\n\t\t}\n\t}\n\n\tfor _, m := range s.removeMembers {\n\t\tif !dao.HasMember(m.Address) {\n\t\t\treturn errors.New(\"address is not a DAO member: \" + m.Address.String())\n\t\t}\n\t}\n\n\treturn nil\n}\n\n// Execute modifies main DAO members.\nfunc (s daoMembersModificationStrategy) Execute(dao *gnome.DAO) error {\n\tfor _, m := range s.newMembers {\n\t\tdao.AddMember(m)\n\t}\n\n\tfor _, m := range s.removeMembers {\n\t\tdao.RemoveMember(m.Address)\n\t}\n\n\treturn nil\n}\n\n// RenderParams returns a markdown with the rendered strategy parameters.\nfunc (s daoMembersModificationStrategy) RenderParams() string {\n\tvar b strings.Builder\n\n\tb.WriteString(\"|||\\n|---|---|\\n\")\n\n\tif len(s.newMembers) \u003e 0 {\n\t\tvar members []string\n\t\tfor _, m := range s.newMembers {\n\t\t\tmembers = append(members, m.String())\n\t\t}\n\n\t\tb.WriteString(\"| New Members: | \" + strings.Join(members, \"\u003c/br\u003e\") + \"\u003c/br\u003e\u003c/br\u003e |\\n\")\n\t}\n\n\tif len(s.removeMembers) \u003e 0 {\n\t\tvar members []string\n\t\tfor _, m := range s.removeMembers {\n\t\t\tmembers = append(members, m.String())\n\t\t}\n\n\t\tb.WriteString(\"| Members to Remove: | \" + strings.Join(members, \"\u003c/br\u003e\") + \" |\\n\")\n\t}\n\n\treturn b.String()\n}\n\nfunc newSubDAODismissalStrategy(dao *gnome.DAO, x proposalIndex) subDAODismissalStrategy {\n\tif dao == nil {\n\t\tpanic(\"DAO is required\")\n\t}\n\n\treturn subDAODismissalStrategy{\n\t\tchoices: []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo},\n\t\tdao: dao,\n\t\tproposals: x,\n\t}\n}\n\ntype subDAODismissalStrategy struct {\n\tchoices []gnome.VoteChoice\n\tdao *gnome.DAO\n\tproposals proposalIndex\n}\n\n// Name returns the name of the strategy.\nfunc (subDAODismissalStrategy) Name() string {\n\treturn StrategyNameSubDAODismissal\n}\n\n// Quorum returns the minimum required percentage of DAO member votes\n// required for a proposal to pass.\nfunc (subDAODismissalStrategy) Quorum() float64 {\n\treturn 0.51\n}\n\n// VotingPeriod returns the period that a proposal should allow voting.\nfunc (subDAODismissalStrategy) VotingPeriod() time.Duration {\n\tperiod, _ := parameters.VotingPeriods.Get(StrategyNameSubDAODismissal)\n\treturn period\n}\n\n// VoteChoices returns the valid voting choices for the strategy.\nfunc (s subDAODismissalStrategy) VoteChoices() []gnome.VoteChoice {\n\treturn s.choices\n}\n\n// Tally counts the votes and returns the winner voting choice.\nfunc (subDAODismissalStrategy) Tally(_ *gnome.DAO, r gnome.VotingRecord) gnome.VoteChoice {\n\tif choice, ok := gnome.SelectChoiceByPlurality(r); ok {\n\t\treturn choice\n\t}\n\treturn gnome.ChoiceNone\n}\n\n// Validate validates if a proposal is valid for the current DAO state.\nfunc (s subDAODismissalStrategy) Validate(p *gnome.Proposal) error {\n\tparentDAO := s.dao.Parent()\n\tif parentDAO == nil {\n\t\treturn errors.New(\"the DAO to dismiss has no parent DAO\")\n\t}\n\n\tparentName := p.DAO().Name()\n\tif parentDAO.Name() != parentName {\n\t\treturn errors.New(`the DAO to dismiss must be a first level sub DAO of \"` + parentName + `\"`)\n\t}\n\treturn nil\n}\n\n// Execute modifies main DAO members.\nfunc (s subDAODismissalStrategy) Execute(*gnome.DAO) error {\n\t// Get the list of all sub DAOs and the root DAO to dismiss\n\tdaos := append(collectSubDAOs(s.dao), s.dao)\n\t// Proposal dismissal requires a reason\n\t// TODO: Send proposal to Execute and add dismissal proposal link?\n\treason := \"Dismissed because of DAO dismissal: \" + s.dao.Path()\n\n\tfor _, dao := range daos {\n\t\t// Dismiss all proposals for the current DAO\n\t\tfor _, p := range s.proposals.GetAllByDAO(dao.Path()) {\n\t\t\tif !p.Status().IsFinal() {\n\t\t\t\tp.Dismiss(reason)\n\t\t\t}\n\t\t}\n\n\t\t// Lock the DAO to dismiss it\n\t\tdao.Lock(\"\")\n\t}\n\treturn nil\n}\n\n// RenderParams returns a markdown with the rendered strategy parameters.\nfunc (s subDAODismissalStrategy) RenderParams() string {\n\treturn \"DAO: \" + s.dao.Path()\n}\n\nfunc collectSubDAOs(dao *gnome.DAO) []*gnome.DAO {\n\tdaos := dao.SubDAOs()\n\tfor _, sub := range daos[:] {\n\t\tdaos = append(daos, collectSubDAOs(sub)...)\n\t}\n\treturn daos\n}\n"},{"name":"strategy_dao_test.gno","body":"package gnome\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\t\"time\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/testutils\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\nfunc TestSubDAOCreationStrategy(t *testing.T) {\n\tcases := []struct {\n\t\tname, daoName, title, manifest, err string\n\t\tmembers []gnome.Member\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\tdaoName: \"test\",\n\t\t\ttitle: \"Test\",\n\t\t\tmanifest: \"Test manifest\",\n\t\t\tmembers: []gnome.Member{\n\t\t\t\tnewTestMember(t, \"address1\"),\n\t\t\t\tnewTestMember(t, \"address2\"),\n\t\t\t\tnewTestMember(t, \"address3\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"without name\",\n\t\t\terr: \"sub DAO name is required\",\n\t\t},\n\t\t{\n\t\t\tname: \"invalid name\",\n\t\t\tdaoName: \"invalid name\",\n\t\t\terr: `invalid sub DAO name, only letters from \"a\" to \"z\", numbers, \"-\" and \"_\" are allowed`,\n\t\t},\n\t\t{\n\t\t\tname: \"without title\",\n\t\t\tdaoName: \"test\",\n\t\t\terr: \"sub DAO title is required\",\n\t\t},\n\t\t{\n\t\t\tname: \"without manifest\",\n\t\t\tdaoName: \"test\",\n\t\t\ttitle: \"Test\",\n\t\t\terr: \"sub DAO manifest is required\",\n\t\t},\n\t\t{\n\t\t\tname: \"less than two DAO members\",\n\t\t\tdaoName: \"test\",\n\t\t\ttitle: \"Test\",\n\t\t\tmanifest: \"Test manifest\",\n\t\t\terr: \"sub DAOs require at least 3 members\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tname := StrategyNameSubDAOCreation\n\t\t\tquorum := 1.0\n\t\t\tvotingPeriod := time.Hour * 24 * 7\n\t\t\tchoices := fmt.Sprintf(\"%v\", []gnome.VoteChoice{\n\t\t\t\tgnome.ChoiceYes,\n\t\t\t\tgnome.ChoiceNo,\n\t\t\t})\n\n\t\t\t// Act\n\t\t\tvar s subDAOCreationStrategy\n\t\t\terr := handlePanic(t, func() {\n\t\t\t\ts = newSubDAOCreationStrategy(daoIndex{}, tc.daoName, tc.title, tc.manifest, tc.members)\n\t\t\t})\n\n\t\t\t// Assert\n\t\t\tif tc.err != \"\" {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tassertNoError(t, err)\n\n\t\t\tif got := s.Name(); got != name {\n\t\t\t\tt.Fatalf(\"expected strategy name: '%s', got: '%s'\", name, got)\n\t\t\t}\n\n\t\t\tif got := s.Quorum(); got != quorum {\n\t\t\t\tt.Fatalf(\"expected strategy quorum: %.2f, got: %.2f\", quorum, got)\n\t\t\t}\n\n\t\t\tif got := s.VotingPeriod(); got != votingPeriod {\n\t\t\t\tt.Fatalf(\"expected strategy voting period: %d, got: %d\", votingPeriod, got)\n\t\t\t}\n\n\t\t\tif got := fmt.Sprintf(\"%v\", s.VoteChoices()); got != choices {\n\t\t\t\tt.Fatalf(\"expected strategy vote choices: %s, got: %s\", choices, got)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestSubDAOCreationStrategyTally(t *testing.T) {\n\tdao := gnome.MustNew(\"main\", \"Main\", gnome.WithMembers(\n\t\tnewTestMember(t, \"member1\"),\n\t\tnewTestMember(t, \"member2\"),\n\t\tnewTestMember(t, \"member3\"),\n\t))\n\tcases := []struct {\n\t\tname string\n\t\tvotes []gnome.Vote\n\t\tchoice gnome.VoteChoice\n\t}{\n\t\t{\n\t\t\tname: \"quorum vote yes\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t},\n\t\t{\n\t\t\tname: \"quorum vote no\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNo,\n\t\t},\n\t\t{\n\t\t\tname: \"quorum with different choices\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNo,\n\t\t},\n\t\t{\n\t\t\tname: \"no quorum\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNone,\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\trecord := gnome.NewVotingRecord()\n\t\t\tfor _, v := range tc.votes {\n\t\t\t\trecord.Add(v)\n\t\t\t}\n\n\t\t\ts := newSubDAOCreationStrategy(daoIndex{}, \"name\", \"Name\", \"Manifest\", []gnome.Member{\n\t\t\t\tnewTestMember(t, \"member1\"),\n\t\t\t\tnewTestMember(t, \"member2\"),\n\t\t\t\tnewTestMember(t, \"member3\"),\n\t\t\t})\n\n\t\t\t// Act\n\t\t\tchoice := s.Tally(dao, *record)\n\n\t\t\t// Assert\n\t\t\tif choice != tc.choice {\n\t\t\t\tt.Fatalf(\"expected tally result choice: '%v', got: '%v'\", tc.choice, choice)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestSubDAOCreationStrategyValidate(t *testing.T) {\n\tcases := []struct {\n\t\tname, daoName string\n\t\tsetup func(*daoIndex) *gnome.DAO\n\t\terr string\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\tdaoName: \"child\",\n\t\t\tsetup: func(*daoIndex) *gnome.DAO {\n\t\t\t\treturn gnome.MustNew(\"parent\", \"Parent\")\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"existing name\",\n\t\t\tdaoName: \"child\",\n\t\t\tsetup: func(x *daoIndex) *gnome.DAO {\n\t\t\t\tchild := gnome.MustNew(\"child\", \"Child\")\n\t\t\t\tdao := gnome.MustNew(\"parent\", \"Parent\", gnome.WithSubDAO(child))\n\t\t\t\tx.IndexByPath(child)\n\t\t\t\treturn dao\n\t\t\t},\n\t\t\terr: \"sub DAO path has been taken by another DAO\",\n\t\t},\n\t\t{\n\t\t\tname: \"locked parent\",\n\t\t\tdaoName: \"child\",\n\t\t\tsetup: func(*daoIndex) *gnome.DAO {\n\t\t\t\tdao := gnome.MustNew(\"parent\", \"Parent\")\n\t\t\t\tdao.Lock(\"\")\n\t\t\t\treturn dao\n\t\t\t},\n\t\t\terr: \"parent DAO 'parent' is locked\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tx := daoIndex{}\n\t\t\tdao := tc.setup(\u0026x)\n\t\t\tmembers := []gnome.Member{\n\t\t\t\tnewTestMember(t, \"member1\"),\n\t\t\t\tnewTestMember(t, \"member2\"),\n\t\t\t\tnewTestMember(t, \"member3\"),\n\t\t\t}\n\t\t\ts := newSubDAOCreationStrategy(x, tc.daoName, \"Title\", \"Manifest\", members)\n\t\t\tp, _ := gnome.NewProposal(1, s, members[0].Address, dao, \"Title\")\n\n\t\t\t// Act\n\t\t\terr := s.Validate(p)\n\n\t\t\t// Assert\n\t\t\tif tc.err != \"\" {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t} else {\n\t\t\t\tassertNoError(t, err)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestSubDAOCreationStrategyExecute(t *testing.T) {\n\t// Arrange\n\tdao := gnome.MustNew(\"name\", \"Name\")\n\tsubName := \"sub\"\n\ttitle := \"Sub DAO\"\n\tmanifest := \"Test manifest\"\n\n\ts := newSubDAOCreationStrategy(daoIndex{}, subName, title, manifest, []gnome.Member{\n\t\tnewTestMember(t, \"member1\"),\n\t\tnewTestMember(t, \"member2\"),\n\t\tnewTestMember(t, \"member3\"),\n\t})\n\tmembers := fmt.Sprintf(\"%v\", s.members)\n\n\t// Act\n\terr := s.Execute(dao)\n\n\t// Assert\n\tassertNoError(t, err)\n\n\tsubDAOs := dao.SubDAOs()\n\tif c := len(subDAOs); c != 1 {\n\t\tt.Fatalf(\"expected one sub DAO, got: %d\", c)\n\t}\n\n\tsubDAO := subDAOs[0]\n\tif got := subDAO.Name(); got != subName {\n\t\tt.Fatalf(\"expected sub DAO name: '%s', got: '%s'\", subName, got)\n\t}\n\n\tif got := subDAO.Title(); got != title {\n\t\tt.Fatalf(\"expected sub DAO title: '%s', got: '%s'\", title, got)\n\t}\n\n\tif got := subDAO.Manifest(); got != manifest {\n\t\tt.Fatalf(\"expected sub DAO manifest: '%s', got: '%d'\", manifest, got)\n\t}\n\n\tif got := fmt.Sprintf(\"%v\", subDAO.Members()); got != members {\n\t\tt.Fatalf(\"expected sub DAO members: '%s', got: '%s'\", members, got)\n\t}\n}\n\nfunc TestModifyDAOMembersStrategy(t *testing.T) {\n\tcases := []struct {\n\t\tname string\n\t\tnewMembers, removeMembers []gnome.Member\n\t\terr string\n\t}{\n\t\t{\n\t\t\tname: \"new and remove members\",\n\t\t\tnewMembers: []gnome.Member{\n\t\t\t\tnewTestMember(t, \"address1\"),\n\t\t\t},\n\t\t\tremoveMembers: []gnome.Member{\n\t\t\t\tnewTestMember(t, \"address2\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"new members only\",\n\t\t\tnewMembers: []gnome.Member{\n\t\t\t\tnewTestMember(t, \"address1\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"remove members only\",\n\t\t\tremoveMembers: []gnome.Member{\n\t\t\t\tnewTestMember(t, \"address1\"),\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"no members\",\n\t\t\terr: \"members are required\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tname := StrategyNameDAOMembersModification\n\t\t\tquorum := 0.51\n\t\t\tvotingPeriod := time.Hour * 24 * 7\n\t\t\tchoices := fmt.Sprintf(\"%v\", []gnome.VoteChoice{\n\t\t\t\tgnome.ChoiceYes,\n\t\t\t\tgnome.ChoiceNo,\n\t\t\t})\n\n\t\t\t// Act\n\t\t\tvar s daoMembersModificationStrategy\n\t\t\terr := handlePanic(t, func() {\n\t\t\t\ts = newDAOMembersModificationStrategy(tc.newMembers, tc.removeMembers)\n\t\t\t})\n\n\t\t\t// Assert\n\t\t\tif tc.err != \"\" {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tassertNoError(t, err)\n\n\t\t\tif got := s.Name(); got != name {\n\t\t\t\tt.Fatalf(\"expected strategy name: '%s', got: '%s'\", name, got)\n\t\t\t}\n\n\t\t\tif got := s.Quorum(); got != quorum {\n\t\t\t\tt.Fatalf(\"expected strategy quorum: %.2f, got: %.2f\", quorum, got)\n\t\t\t}\n\n\t\t\tif got := s.VotingPeriod(); got != votingPeriod {\n\t\t\t\tt.Fatalf(\"expected strategy voting period: %d, got: %d\", votingPeriod, got)\n\t\t\t}\n\n\t\t\tif got := fmt.Sprintf(\"%v\", s.VoteChoices()); got != choices {\n\t\t\t\tt.Fatalf(\"expected strategy vote choices: %s, got: %s\", choices, got)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestModifyDAOMembersStrategyTally(t *testing.T) {\n\tcases := []struct {\n\t\tname string\n\t\tvotes []gnome.Vote\n\t\tchoice gnome.VoteChoice\n\t}{\n\t\t{\n\t\t\tname: \"super majority votes yes\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t},\n\t\t{\n\t\t\tname: \"super majority votes no\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNo,\n\t\t},\n\t\t{\n\t\t\tname: \"no majority\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNone,\n\t\t},\n\t\t{\n\t\t\tname: \"no quorum\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNone,\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\trecord := gnome.NewVotingRecord()\n\t\t\tfor _, v := range tc.votes {\n\t\t\t\trecord.Add(v)\n\t\t\t}\n\n\t\t\ts := newDAOMembersModificationStrategy(\n\t\t\t\t[]gnome.Member{newTestMember(t, \"member5\")},\n\t\t\t\t[]gnome.Member{newTestMember(t, \"member2\")},\n\t\t\t)\n\n\t\t\t// Act\n\t\t\tchoice := s.Tally(nil, *record)\n\n\t\t\t// Assert\n\t\t\tif choice != tc.choice {\n\t\t\t\tt.Fatalf(\"expected tally result choice: '%v', got: '%v'\", tc.choice, choice)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestModifyDAOMembersStrategyValidate(t *testing.T) {\n\tmember5 := newTestMember(t, \"member5\")\n\tmembers := []gnome.Member{\n\t\tnewTestMember(t, \"member1\"),\n\t\tnewTestMember(t, \"member2\"),\n\t\tnewTestMember(t, \"member3\"),\n\t\tnewTestMember(t, \"member4\"),\n\t}\n\n\tcases := []struct {\n\t\tname string\n\t\tnewMembers, removeMembers []gnome.Member\n\t\tsetup func() *gnome.DAO\n\t\terr string\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\tnewMembers: []gnome.Member{member5},\n\t\t\tsetup: func() *gnome.DAO {\n\t\t\t\tdao := gnome.MustNew(\"main\", \"Main\", gnome.WithMembers(members...))\n\t\t\t\tgnome.MustNew(\"council\", \"Council\", gnome.AssignAsSuperCouncil(), gnome.WithSubDAO(dao))\n\t\t\t\treturn dao\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"less than three members\",\n\t\t\tnewMembers: []gnome.Member{member5},\n\t\t\tremoveMembers: members[1:],\n\t\t\tsetup: func() *gnome.DAO {\n\t\t\t\tdao := gnome.MustNew(\"main\", \"Main\", gnome.WithMembers(members...))\n\t\t\t\tgnome.MustNew(\"council\", \"Council\", gnome.AssignAsSuperCouncil(), gnome.WithSubDAO(dao))\n\t\t\t\treturn dao\n\t\t\t},\n\t\t\terr: \"DAO must always have a minimum of 3 members\",\n\t\t},\n\t\t{\n\t\t\tname: \"add existing member\",\n\t\t\tnewMembers: []gnome.Member{members[0]},\n\t\t\tsetup: func() *gnome.DAO {\n\t\t\t\tdao := gnome.MustNew(\"main\", \"Main\", gnome.WithMembers(members...))\n\t\t\t\tgnome.MustNew(\"council\", \"Council\", gnome.AssignAsSuperCouncil(), gnome.WithSubDAO(dao))\n\t\t\t\treturn dao\n\t\t\t},\n\t\t\terr: \"address is already a DAO member: \" + members[0].String(),\n\t\t},\n\t\t{\n\t\t\tname: \"remove unexisting member\",\n\t\t\tremoveMembers: []gnome.Member{member5},\n\t\t\tsetup: func() *gnome.DAO {\n\t\t\t\tdao := gnome.MustNew(\"main\", \"Main\", gnome.WithMembers(members...))\n\t\t\t\tgnome.MustNew(\"council\", \"Council\", gnome.AssignAsSuperCouncil(), gnome.WithSubDAO(dao))\n\t\t\t\treturn dao\n\t\t\t},\n\t\t\terr: \"address is not a DAO member: \" + member5.String(),\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tdao := tc.setup()\n\t\t\ts := newDAOMembersModificationStrategy(tc.newMembers, tc.removeMembers)\n\t\t\tp, _ := gnome.NewProposal(1, s, members[0].Address, dao, \"Title\")\n\n\t\t\t// Act\n\t\t\terr := s.Validate(p)\n\n\t\t\t// Assert\n\t\t\tif tc.err != \"\" {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t} else {\n\t\t\t\tassertNoError(t, err)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestModifyDAOMembersStrategyExecute(t *testing.T) {\n\t// Arrange\n\tdao := gnome.MustNew(\"main\", \"Main\", gnome.WithMembers(\n\t\tnewTestMember(t, \"member1\"),\n\t\tnewTestMember(t, \"member2\"),\n\t\tnewTestMember(t, \"member3\"),\n\t\tnewTestMember(t, \"member4\"),\n\t))\n\tnewMembers := []gnome.Member{\n\t\tnewTestMember(t, \"member5\"),\n\t\tnewTestMember(t, \"member6\"),\n\t}\n\tremoveMembers := dao.Members()[1:3]\n\ts := newDAOMembersModificationStrategy(newMembers, removeMembers)\n\n\t// Act\n\terr := s.Execute(dao)\n\n\t// Assert\n\tassertNoError(t, err)\n\n\tif c := len(dao.Members()); c != 4 {\n\t\tt.Fatalf(\"expected DAO to have 4 members, got: %d\", c)\n\t}\n\n\tfor _, m := range newMembers {\n\t\tif !dao.HasMember(m.Address) {\n\t\t\tt.Fatalf(\"expected member %s to be added to the DAO\", m.Address)\n\t\t}\n\t}\n\n\tfor _, m := range removeMembers {\n\t\tif dao.HasMember(m.Address) {\n\t\t\tt.Fatalf(\"expected member %s to be removed from the DAO\", m.Address)\n\t\t}\n\t}\n}\n\nfunc TestSubDAODismissalStrategy(t *testing.T) {\n\tcases := []struct {\n\t\tname string\n\t\tdao *gnome.DAO\n\t\terr string\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\tdao: gnome.MustNew(\"dao\", \"DAO\"),\n\t\t},\n\t\t{\n\t\t\tname: \"no DAO\",\n\t\t\terr: \"DAO is required\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tname := StrategyNameSubDAODismissal\n\t\t\tquorum := 0.51\n\t\t\tvotingPeriod := time.Hour * 24 * 7\n\t\t\tchoices := fmt.Sprintf(\"%v\", []gnome.VoteChoice{\n\t\t\t\tgnome.ChoiceYes,\n\t\t\t\tgnome.ChoiceNo,\n\t\t\t})\n\n\t\t\t// Act\n\t\t\tvar s subDAODismissalStrategy\n\t\t\terr := handlePanic(t, func() {\n\t\t\t\ts = newSubDAODismissalStrategy(tc.dao, proposalIndex{})\n\t\t\t})\n\n\t\t\t// Assert\n\t\t\tif tc.err != \"\" {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tassertNoError(t, err)\n\n\t\t\tif got := s.Name(); got != name {\n\t\t\t\tt.Fatalf(\"expected strategy name: '%s', got: '%s'\", name, got)\n\t\t\t}\n\n\t\t\tif got := s.Quorum(); got != quorum {\n\t\t\t\tt.Fatalf(\"expected strategy quorum: %.2f, got: %.2f\", quorum, got)\n\t\t\t}\n\n\t\t\tif got := s.VotingPeriod(); got != votingPeriod {\n\t\t\t\tt.Fatalf(\"expected strategy voting period: %d, got: %d\", votingPeriod, got)\n\t\t\t}\n\n\t\t\tif got := fmt.Sprintf(\"%v\", s.VoteChoices()); got != choices {\n\t\t\t\tt.Fatalf(\"expected strategy vote choices: %s, got: %s\", choices, got)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestSubDAODismissalStrategyTally(t *testing.T) {\n\tcases := []struct {\n\t\tname string\n\t\tvotes []gnome.Vote\n\t\tchoice gnome.VoteChoice\n\t}{\n\t\t{\n\t\t\tname: \"yes with one vote\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t},\n\t\t{\n\t\t\tname: \"no with one vote\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNo,\n\t\t},\n\t\t{\n\t\t\tname: \"yes with multiple votes\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t},\n\t\t{\n\t\t\tname: \"no with multiple votes\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNo,\n\t\t},\n\t\t{\n\t\t\tname: \"tie\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNone,\n\t\t},\n\t\t{\n\t\t\tname: \"tie with multiple votes\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNone,\n\t\t},\n\t\t{\n\t\t\tname: \"no votes\",\n\t\t\tchoice: gnome.ChoiceNone,\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tsubDAO := gnome.MustNew(\"sub\", \"Sub DAO\")\n\t\t\trecord := gnome.NewVotingRecord()\n\t\t\tfor _, v := range tc.votes {\n\t\t\t\trecord.Add(v)\n\t\t\t}\n\n\t\t\ts := newSubDAODismissalStrategy(subDAO, proposalIndex{})\n\n\t\t\t// Act\n\t\t\tchoice := s.Tally(nil, *record)\n\n\t\t\t// Assert\n\t\t\tif choice != tc.choice {\n\t\t\t\tt.Fatalf(\"expected tally result choice: '%v', got: '%v'\", tc.choice, choice)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestSubDAODismissalStrategyValidate(t *testing.T) {\n\tparentDAO := gnome.MustNew(\"parent\", \"Parent\")\n\tcases := []struct {\n\t\tname string\n\t\tsetup func(parent *gnome.DAO) (child *gnome.DAO)\n\t\terr string\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\tsetup: func(dao *gnome.DAO) *gnome.DAO {\n\t\t\t\tchild := gnome.MustNew(\"child\", \"Child\")\n\t\t\t\tdao.AddSubDAO(child)\n\t\t\t\treturn child\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"dismiss non child DAO\",\n\t\t\tsetup: func(*gnome.DAO) *gnome.DAO {\n\t\t\t\tchild := gnome.MustNew(\"child\", \"Child\")\n\t\t\t\tgnome.MustNew(\"foo\", \"Foo\", gnome.WithSubDAO(child))\n\t\t\t\treturn child\n\t\t\t},\n\t\t\terr: `the DAO to dismiss must be a first level sub DAO of \"` + parentDAO.Name() + `\"`,\n\t\t},\n\t\t{\n\t\t\tname: \"parent DAO not found\",\n\t\t\tsetup: func(*gnome.DAO) *gnome.DAO {\n\t\t\t\treturn gnome.MustNew(\"child\", \"Child\")\n\t\t\t},\n\t\t\terr: \"the DAO to dismiss has no parent DAO\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tchildDAO := tc.setup(parentDAO)\n\t\t\ts := newSubDAODismissalStrategy(childDAO, proposalIndex{})\n\t\t\tp, _ := gnome.NewProposal(1, s, testutils.TestAddress(\"member\"), parentDAO, \"Dismiss child DAO\")\n\n\t\t\t// Act\n\t\t\terr := s.Validate(p)\n\n\t\t\t// Assert\n\t\t\tif tc.err != \"\" {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t} else {\n\t\t\t\tassertNoError(t, err)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestSubDAODismissalStrategyExecute(t *testing.T) {\n\t// Arrange\n\tvar (\n\t\tstrategy testStrategy\n\t\tproposals proposalIndex\n\t)\n\n\tcaller := testutils.TestAddress(\"caller\")\n\n\tthreeDAO := gnome.MustNew(\"three\", \"Three\")\n\ttwoDAO := gnome.MustNew(\"two\", \"Two\")\n\toneDAO := gnome.MustNew(\"one\", \"One\", gnome.WithSubDAO(twoDAO), gnome.WithSubDAO(threeDAO))\n\trootDAO := gnome.MustNew(\"root\", \"Root\", gnome.WithSubDAO(oneDAO))\n\n\tp, _ := gnome.NewProposal(1, strategy, caller, rootDAO, \"Root\")\n\tproposals.Index(p)\n\n\tp, _ = gnome.NewProposal(2, strategy, caller, oneDAO, \"One\")\n\tproposals.Index(p)\n\n\tp, _ = gnome.NewProposal(3, strategy, caller, twoDAO, \"Two\")\n\tproposals.Index(p)\n\n\tp, _ = gnome.NewProposal(4, strategy, caller, threeDAO, \"Thee\")\n\tproposals.Index(p)\n\n\tdismissReason := \"Dismissed because of DAO dismissal: \" + rootDAO.Name()\n\tdaos := []*gnome.DAO{rootDAO, oneDAO, twoDAO, threeDAO}\n\ts := newSubDAODismissalStrategy(rootDAO, proposals)\n\n\t// Act\n\terr := s.Execute(nil)\n\n\t// Assert\n\tassertNoError(t, err)\n\n\tfor _, dao := range daos {\n\t\tif !dao.IsLocked() {\n\t\t\tt.Fatalf(\"expected DAO '%s' to be locked\", dao.Title())\n\t\t}\n\t}\n\n\tproposals.Iterate(func(p *gnome.Proposal) bool {\n\t\tif got := p.Status(); got != gnome.StatusDismissed {\n\t\t\tt.Fatalf(\"expected proposal '%s' status to be 'dismissed', got: '%s'\", p.Title(), got.String())\n\t\t}\n\n\t\tif got := p.StatusReason(); got != dismissReason {\n\t\t\tt.Fatalf(\"expected dismiss reason '%s', got: '%s'\", dismissReason, got)\n\t\t}\n\t\treturn false\n\t})\n}\n\ntype testStrategy struct{}\n\nfunc (testStrategy) Name() string { return \"test\" }\nfunc (testStrategy) Quorum() float64 { return 0.51 }\nfunc (testStrategy) VotingPeriod() time.Duration { return time.Hour * 24 * 2 }\nfunc (testStrategy) VoteChoices() []gnome.VoteChoice { return []gnome.VoteChoice{gnome.ChoiceYes} }\nfunc (s testStrategy) Tally(*gnome.DAO, gnome.VotingRecord) gnome.VoteChoice { return gnome.ChoiceYes }\n\nfunc newTestMember(t *testing.T, name string) gnome.Member {\n\tt.Helper()\n\treturn gnome.NewMember(testutils.TestAddress(name))\n}\n"},{"name":"strategy_general.gno","body":"package gnome\n\nimport (\n\t\"errors\"\n\t\"std\"\n\t\"strings\"\n\t\"time\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\n// newGeneralStrategy creates a new general proposal strategy.\n// This type of proposal is not executable so it doesn't modify the DAO state when proposal passes.\nfunc newGeneralStrategy() generalStrategy {\n\treturn generalStrategy{\n\t\tchoices: []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo},\n\t}\n}\n\ntype generalStrategy struct {\n\tchoices []gnome.VoteChoice\n}\n\n// Name returns the name of the strategy.\nfunc (generalStrategy) Name() string {\n\treturn StrategyNameGeneral\n}\n\n// Quorum returns the minimum required percentage of DAO member votes\n// required for a proposal to pass.\nfunc (generalStrategy) Quorum() float64 {\n\treturn 0.51\n}\n\n// VotingPeriod returns the period that a proposal should allow voting.\nfunc (generalStrategy) VotingPeriod() time.Duration {\n\tperiod, _ := parameters.VotingPeriods.Get(StrategyNameGeneral)\n\treturn period\n}\n\n// VoteChoices returns the valid voting choices for the strategy.\nfunc (s generalStrategy) VoteChoices() []gnome.VoteChoice {\n\treturn s.choices\n}\n\n// CheckVote checks that a vote is valid for the strategy.\nfunc (s generalStrategy) CheckVote(_ std.Address, choice gnome.VoteChoice, reason string) error {\n\t// Reason is required when voting NO on standard proposals\n\tif choice == gnome.ChoiceNo \u0026\u0026 reason == \"\" {\n\t\treturn errors.New(\"reason is required when voting NO in standard proposals\")\n\t}\n\treturn nil\n}\n\n// Tally counts the votes and returns the winner voting choice.\nfunc (generalStrategy) Tally(dao *gnome.DAO, r gnome.VotingRecord) gnome.VoteChoice {\n\t// Consider abstentions to make the majority absolute\n\tabstentions := len(dao.Members()) - r.VoteCount()\n\tif choice, ok := gnome.SelectChoiceByMajority(r, abstentions); ok {\n\t\treturn choice\n\t}\n\treturn gnome.ChoiceNone\n}\n\n// Validate validates if a proposal is valid for the current DAO state.\nfunc (generalStrategy) Validate(p *gnome.Proposal) error {\n\tif strings.TrimSpace(p.Description()) == \"\" {\n\t\treturn errors.New(\"proposal description is required\")\n\t}\n\treturn nil\n}\n"},{"name":"strategy_general_test.gno","body":"package gnome\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\t\"time\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\nfunc TestGeneralStrategy(t *testing.T) {\n\t// Arrange\n\tname := StrategyNameGeneral\n\tquorum := 0.51\n\tvotingPeriod := time.Hour * 24 * 2\n\tchoices := fmt.Sprintf(\"%v\", []gnome.VoteChoice{\n\t\tgnome.ChoiceYes,\n\t\tgnome.ChoiceNo,\n\t})\n\n\t// Act\n\ts := newGeneralStrategy()\n\n\t// Assert\n\tif got := s.Name(); got != name {\n\t\tt.Fatalf(\"expected strategy name: '%s', got: '%s'\", name, got)\n\t}\n\n\tif got := s.Quorum(); got != quorum {\n\t\tt.Fatalf(\"expected strategy quorum: %.2f, got: %.2f\", quorum, got)\n\t}\n\n\tif got := s.VotingPeriod(); got != votingPeriod {\n\t\tt.Fatalf(\"expected strategy voting period: %d, got: %d\", votingPeriod, got)\n\t}\n\n\tif got := fmt.Sprintf(\"%v\", s.VoteChoices()); got != choices {\n\t\tt.Fatalf(\"expected strategy vote choices: %s, got: %s\", choices, got)\n\t}\n}\n\nfunc TestGeneralStrategyCheckVote(t *testing.T) {\n\tcases := []struct {\n\t\tname string\n\t\tchoice gnome.VoteChoice\n\t\treason, err string\n\t}{\n\t\t{\n\t\t\tname: \"yes\",\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t},\n\t\t{\n\t\t\tname: \"yes with reason\",\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t\treason: \"foo bar\",\n\t\t},\n\t\t{\n\t\t\tname: \"no with reason\",\n\t\t\tchoice: gnome.ChoiceNo,\n\t\t\treason: \"foo bar\",\n\t\t},\n\t\t{\n\t\t\tname: \"no with invalid reason\",\n\t\t\tchoice: gnome.ChoiceNo,\n\t\t\terr: \"reason is required when voting NO in standard proposals\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\ts := newGeneralStrategy()\n\n\t\t\t// Act\n\t\t\terr := s.CheckVote(\"\", tc.choice, tc.reason)\n\n\t\t\t// Assert\n\t\t\tif tc.err != \"\" {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t} else {\n\t\t\t\tassertNoError(t, err)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestGeneralStrategyTally(t *testing.T) {\n\tdao := gnome.MustNew(\"test\", \"Test\", gnome.WithMembers(\n\t\tnewTestMember(t, \"member1\"),\n\t\tnewTestMember(t, \"member2\"),\n\t\tnewTestMember(t, \"member3\"),\n\t\tnewTestMember(t, \"member4\"),\n\t))\n\tcases := []struct {\n\t\tname string\n\t\tvotes []gnome.Vote\n\t\tchoice gnome.VoteChoice\n\t}{\n\t\t{\n\t\t\tname: \"majority\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t},\n\t\t{\n\t\t\tname: \"majority with abstentions\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNo,\n\t\t},\n\t\t{\n\t\t\tname: \"no quorum\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNone,\n\t\t},\n\t\t{\n\t\t\tname: \"no quorum with abstentions\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNone,\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\trecord := gnome.NewVotingRecord()\n\t\t\tfor _, v := range tc.votes {\n\t\t\t\trecord.Add(v)\n\t\t\t}\n\n\t\t\ts := newGeneralStrategy()\n\n\t\t\t// Act\n\t\t\tchoice := s.Tally(dao, *record)\n\n\t\t\t// Assert\n\t\t\tif choice != tc.choice {\n\t\t\t\tt.Fatalf(\"expected tally result choice: '%v', got: '%v'\", tc.choice, choice)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc assertError(t *testing.T, expected interface{}, actual error) {\n\tt.Helper()\n\n\twant, ok := expected.(string)\n\tif !ok {\n\t\tif err, ok := expected.(error); ok {\n\t\t\twant = err.Error()\n\t\t}\n\t}\n\n\tif actual == nil {\n\t\tt.Fatalf(\"expected error: '%s', got no error\", want)\n\t}\n\n\tif want != actual.Error() {\n\t\tt.Fatalf(\"expected error: '%s', got: '%s'\", want, actual.Error())\n\t}\n}\n\nfunc assertNoError(t *testing.T, err interface{}) {\n\tt.Helper()\n\n\tif err == nil {\n\t\treturn\n\t}\n\n\tactual, ok := err.(string)\n\tif !ok {\n\t\tif e, ok := err.(error); ok {\n\t\t\tactual = e.Error()\n\t\t}\n\t}\n\n\tif actual != \"\" {\n\t\tt.Fatalf(\"expected no error, got: '%s'\", actual)\n\t}\n}\n"},{"name":"strategy_lock.gno","body":"package gnome\n\nimport (\n\t\"errors\"\n\t\"strings\"\n\t\"time\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\n// newLockingStrategy creates a new DAO locking proposal strategy.\nfunc newLockingStrategy(council *gnome.DAO, reason string, preLockFn func() error) lockingStrategy {\n\t// Locking should only be done in the council DAO\n\tif !council.IsSuperCouncil() {\n\t\tpanic(\"DAO is not the council\")\n\t}\n\n\treturn lockingStrategy{\n\t\tchoices: []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo},\n\t\tcouncil: council,\n\t\treason: reason,\n\t\tpreLockFn: preLockFn,\n\t}\n}\n\ntype lockingStrategy struct {\n\tchoices []gnome.VoteChoice\n\tcouncil *gnome.DAO\n\treason string\n\tpreLockFn func() error\n}\n\n// Name returns the name of the strategy.\nfunc (lockingStrategy) Name() string {\n\treturn StrategyNameLocking\n}\n\n// Quorum returns the minimum required percentage of DAO member votes\n// required for a proposal to pass.\nfunc (lockingStrategy) Quorum() float64 {\n\treturn 0.33\n}\n\n// VotingPeriod returns the period that a proposal should allow voting.\nfunc (lockingStrategy) VotingPeriod() time.Duration {\n\tperiod, _ := parameters.VotingPeriods.Get(StrategyNameLocking)\n\treturn period\n}\n\n// VoteChoices returns the valid voting choices for the strategy.\nfunc (s lockingStrategy) VoteChoices() []gnome.VoteChoice {\n\treturn s.choices\n}\n\n// Tally counts the votes and returns the winner voting choice.\nfunc (lockingStrategy) Tally(_ *gnome.DAO, r gnome.VotingRecord) gnome.VoteChoice {\n\tif choice, ok := gnome.SelectChoiceByPlurality(r); ok {\n\t\treturn choice\n\t}\n\treturn gnome.ChoiceNone\n}\n\n// Validate validates if a proposal is valid for the current state.\nfunc (s lockingStrategy) Validate(*gnome.Proposal) error {\n\tif s.council.IsLocked() {\n\t\treturn errors.New(\"council DAO is already locked\")\n\t}\n\treturn nil\n}\n\n// Execute locks the council DAO.\nfunc (s lockingStrategy) Execute(*gnome.DAO) (err error) {\n\tif s.preLockFn != nil {\n\t\tif err := s.preLockFn(); err != nil {\n\t\t\treturn err\n\t\t}\n\t}\n\n\ts.council.Lock(s.reason)\n\treturn nil\n}\n\n// RenderParams returns a markdown with the rendered strategy parameters.\nfunc (s lockingStrategy) RenderParams() string {\n\tvar b strings.Builder\n\n\tb.WriteString(\"|||\\n|---|---|\\n\")\n\tb.WriteString(\"| Reason: | \" + gnome.EscapeHTML(s.reason) + \" |\\n\")\n\n\treturn b.String()\n}\n"},{"name":"strategy_lock_test.gno","body":"package gnome\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"testing\"\n\t\"time\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\nfunc TestLockingStrategy(t *testing.T) {\n\tcases := []struct {\n\t\tname, err string\n\t\tsetup func() *gnome.DAO\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\tsetup: func() *gnome.DAO {\n\t\t\t\treturn gnome.MustNew(\"council\", \"Council\", gnome.AssignAsSuperCouncil())\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"dao is not council\",\n\t\t\tsetup: func() *gnome.DAO {\n\t\t\t\treturn gnome.MustNew(\"council\", \"Council\")\n\t\t\t},\n\t\t\terr: \"DAO is not the council\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tname := StrategyNameLocking\n\t\t\tquorum := 0.33\n\t\t\tvotingPeriod := time.Hour * 24 * 2\n\t\t\tchoices := fmt.Sprintf(\"%v\", []gnome.VoteChoice{\n\t\t\t\tgnome.ChoiceYes,\n\t\t\t\tgnome.ChoiceNo,\n\t\t\t})\n\t\t\tcouncilDAO := tc.setup()\n\n\t\t\t// Act\n\t\t\tvar s lockingStrategy\n\t\t\terr := handlePanic(t, func() {\n\t\t\t\ts = newLockingStrategy(councilDAO, \"\", nil)\n\t\t\t})\n\n\t\t\t// Assert\n\t\t\tif tc.err != \"\" {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tassertNoError(t, err)\n\n\t\t\tif got := s.Name(); got != name {\n\t\t\t\tt.Fatalf(\"expected strategy name: '%s', got: '%s'\", name, got)\n\t\t\t}\n\n\t\t\tif got := s.Quorum(); got != quorum {\n\t\t\t\tt.Fatalf(\"expected strategy quorum: %.2f, got: %.2f\", quorum, got)\n\t\t\t}\n\n\t\t\tif got := s.VotingPeriod(); got != votingPeriod {\n\t\t\t\tt.Fatalf(\"expected strategy voting period: %d, got: %d\", votingPeriod, got)\n\t\t\t}\n\n\t\t\tif got := fmt.Sprintf(\"%v\", s.VoteChoices()); got != choices {\n\t\t\t\tt.Fatalf(\"expected strategy vote choices: %s, got: %s\", choices, got)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestLockingStrategyTally(t *testing.T) {\n\tcouncilDAO := gnome.MustNew(\"council\", \"Council\", gnome.AssignAsSuperCouncil())\n\tcases := []struct {\n\t\tname string\n\t\tvotes []gnome.Vote\n\t\tchoice gnome.VoteChoice\n\t}{\n\t\t{\n\t\t\tname: \"yes with one vote\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t},\n\t\t{\n\t\t\tname: \"no with one vote\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNo,\n\t\t},\n\t\t{\n\t\t\tname: \"yes with multiple votes\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceYes,\n\t\t},\n\t\t{\n\t\t\tname: \"no with multiple votes\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNo,\n\t\t},\n\t\t{\n\t\t\tname: \"tie\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNone,\n\t\t},\n\t\t{\n\t\t\tname: \"tie with multiple votes\",\n\t\t\tvotes: []gnome.Vote{\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t\t{Choice: gnome.ChoiceYes},\n\t\t\t\t{Choice: gnome.ChoiceNo},\n\t\t\t},\n\t\t\tchoice: gnome.ChoiceNone,\n\t\t},\n\t\t{\n\t\t\tname: \"no votes\",\n\t\t\tchoice: gnome.ChoiceNone,\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\trecord := gnome.NewVotingRecord()\n\t\t\tfor _, v := range tc.votes {\n\t\t\t\trecord.Add(v)\n\t\t\t}\n\n\t\t\ts := newLockingStrategy(councilDAO, \"\", nil)\n\n\t\t\t// Act\n\t\t\tchoice := s.Tally(nil, *record)\n\n\t\t\t// Assert\n\t\t\tif choice != tc.choice {\n\t\t\t\tt.Fatalf(\"expected tally result choice: '%v', got: '%v'\", tc.choice, choice)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestLockingStrategyValidate(t *testing.T) {\n\tcases := []struct {\n\t\tname string\n\t\tsetup func(*gnome.DAO)\n\t\terr string\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t},\n\t\t{\n\t\t\tname: \"locked council DAO\",\n\t\t\tsetup: func(councilDAO *gnome.DAO) {\n\t\t\t\tcouncilDAO.Lock(\"\")\n\t\t\t},\n\t\t\terr: \"council DAO is already locked\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tcouncilDAO := gnome.MustNew(\"council\", \"Council\", gnome.AssignAsSuperCouncil())\n\t\t\tif tc.setup != nil {\n\t\t\t\ttc.setup(councilDAO)\n\t\t\t}\n\n\t\t\ts := newLockingStrategy(councilDAO, \"\", nil)\n\n\t\t\t// Act\n\t\t\terr := s.Validate(nil)\n\n\t\t\t// Assert\n\t\t\tif tc.err != \"\" {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t} else {\n\t\t\t\tassertNoError(t, err)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestLockingStrategyExecute(t *testing.T) {\n\tcases := []struct {\n\t\tname, reason, err string\n\t\tsetup func(*gnome.DAO)\n\t\tpreLockErr error\n\t}{\n\t\t{\n\t\t\tname: \"ok\",\n\t\t\treason: \"Lock reason\",\n\t\t},\n\t\t{\n\t\t\tname: \"pre lock function error\",\n\t\t\tpreLockErr: errors.New(\"test error\"),\n\t\t\terr: \"test error\",\n\t\t},\n\t}\n\n\tfor _, tc := range cases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t// Arrange\n\t\t\tcouncilDAO := gnome.MustNew(\"council\", \"Council\", gnome.AssignAsSuperCouncil())\n\t\t\tif tc.setup != nil {\n\t\t\t\ttc.setup(councilDAO)\n\t\t\t}\n\n\t\t\tvar (\n\t\t\t\tpreLockFnCalled bool\n\n\t\t\t\ts = newLockingStrategy(councilDAO, tc.reason, func() error {\n\t\t\t\t\tpreLockFnCalled = true\n\t\t\t\t\treturn tc.preLockErr\n\t\t\t\t})\n\t\t\t)\n\n\t\t\t// Act\n\t\t\terr := s.Execute(nil)\n\n\t\t\t// Assert\n\t\t\tif tc.err != \"\" {\n\t\t\t\tassertError(t, tc.err, err)\n\t\t\t\treturn\n\t\t\t}\n\n\t\t\tassertNoError(t, err)\n\n\t\t\tif !preLockFnCalled {\n\t\t\t\tt.Fatal(\"expected pre-lock function to be called\")\n\t\t\t}\n\n\t\t\tif !councilDAO.IsLocked() {\n\t\t\t\tt.Fatal(\"expected DAO to be locked\")\n\t\t\t}\n\n\t\t\tif got := councilDAO.LockReason(); got != tc.reason {\n\t\t\t\tt.Fatalf(\"expected lock reason: '%s', got: '%s'\", tc.reason, got)\n\t\t\t}\n\t\t})\n\t}\n}\n"},{"name":"strategy_params.gno","body":"package gnome\n\nimport (\n\t\"strings\"\n\t\"time\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\ntype paramsUpdateStrategy struct {\n\tvotingPeriods gnome.DurationParams\n\treviewDeadline time.Duration\n}\n\nfunc (paramsUpdateStrategy) Name() string {\n\treturn StrategyNameParamsUpdate\n}\n\nfunc (paramsUpdateStrategy) Quorum() float64 {\n\treturn 0.51\n}\n\nfunc (paramsUpdateStrategy) VotingPeriod() time.Duration {\n\tperiod, _ := parameters.VotingPeriods.Get(StrategyNameParamsUpdate)\n\treturn period\n}\n\nfunc (paramsUpdateStrategy) VoteChoices() []gnome.VoteChoice {\n\treturn []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo}\n}\n\nfunc (paramsUpdateStrategy) Tally(dao *gnome.DAO, r gnome.VotingRecord) gnome.VoteChoice {\n\tabstentions := len(dao.Members()) - r.VoteCount()\n\tif choice, ok := gnome.SelectChoiceByMajority(r, abstentions); ok {\n\t\treturn choice\n\t}\n\treturn gnome.ChoiceNone\n}\n\nfunc (s paramsUpdateStrategy) Execute(*gnome.DAO) error {\n\tif s.reviewDeadline \u003e 0 {\n\t\tparameters.ReviewDeadline = s.reviewDeadline\n\t}\n\n\ts.votingPeriods.Iterate(func(name string, period time.Duration) bool {\n\t\tparameters.VotingPeriods.Set(name, period)\n\t\treturn false\n\t})\n\treturn nil\n}\n\nfunc (s paramsUpdateStrategy) RenderParams() string {\n\tvar b strings.Builder\n\n\tb.WriteString(\"|||\\n|---|---|\\n\")\n\tif s.reviewDeadline \u003e 0 {\n\t\tb.WriteString(\"| Proposal Review Deadline: | \" + gnome.HumanizeDuration(s.reviewDeadline) + \" |\\n\")\n\t}\n\n\ts.votingPeriods.Iterate(func(name string, period time.Duration) bool {\n\t\tb.WriteString(\"| Voting Period for `\" + name + \"`: | \" + gnome.HumanizeDuration(period) + \" |\\n\")\n\t\treturn false\n\t})\n\n\treturn b.String()\n}\n"},{"name":"uri.gno","body":"package gnome\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/ufmt\"\n\n\tgnome \"gno.land/p/gnome/dao\"\n)\n\nfunc makeRealmURL(renderPath string) string {\n\tvar sub string\n\tif id := std.GetChainID(); strings.HasPrefix(id, \"test\") {\n\t\t// Sub domain prefix for testnets\n\t\tsub = id + \".\"\n\t}\n\n\turl := \"https://\" + sub + std.CurrentRealm().PkgPath()\n\tif renderPath != \"\" {\n\t\turl += \":\" + renderPath\n\t}\n\treturn url\n}\n\nfunc makeRealmPath(renderPath string) string {\n\tpath := gnome.CutRealmDomain(std.CurrentRealm().PkgPath())\n\tif renderPath != \"\" {\n\t\tpath += \":\" + renderPath\n\t}\n\treturn path\n}\n\nfunc makeGnoStudioConnectURL(functionName string) string {\n\treturn ufmt.Sprintf(\n\t\t\"https://gno.studio/connect/view/%s?network=%s\u0026tab=functions#%s\",\n\t\tstd.CurrentRealm().PkgPath(),\n\t\tstd.GetChainID(),\n\t\tfunctionName,\n\t)\n}\n\nfunc makeDAOURI(daoPath string, isRelative bool) string {\n\trenderPath := \"dao/\" + daoPath\n\tif isRelative {\n\t\treturn makeRealmPath(renderPath)\n\t}\n\treturn makeRealmURL(renderPath)\n}\n\nfunc makeProposalURI(proposalID gnome.ID, isRelative bool) string {\n\trenderPath := \"proposal/\" + proposalID.String()\n\tif isRelative {\n\t\treturn makeRealmPath(renderPath)\n\t}\n\treturn makeRealmURL(renderPath)\n}\n\nfunc makeProposalsURI(daoPath string, isRelative bool) string {\n\trenderPath := \"proposals/\" + daoPath + \":page=1\"\n\tif isRelative {\n\t\treturn makeRealmPath(renderPath)\n\t}\n\treturn makeRealmURL(renderPath)\n}\n"}]},"deposit":"1ugnot"}],"fee":{"gas_wanted":"26000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AvC68IPWD/o8iYM+et/K6YpBp4+m0hF3mLXIdFZnWH1Y"},"signature":"q1Po0E0/oGxZZe8Q2x+T6vlQB51GNbN8Gx9gdCE718wpqvqF1rPbmaA91/tjvgB8b8Q3gI5yY9n7eB/ULGWnHQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125t352u4pmdrr57emc4pe04y40sknr5ztng5mt","send":"","pkg_path":"gno.land/r/gnome/dao/pre2","func":"SubmitSubDAOCreationProposal","args":["Create a \"Community\" SubDAO","","council/main","community","Community","The Community DAO is responsible for adding and voting on new SubDAO sections that will be part of the Gno.me ecosystem. Gno.me is a community and educational platform therefore the Community DAO is responsible for adding and voting on sections needed for Gno.me: tutorials, new events and more that will be aggregated and added to the Gno.me Home/Ecosystem.","g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun dev\ng125t352u4pmdrr57emc4pe04y40sknr5ztng5mt dev\ng1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5 eco-dev"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AkNQ8NiWDgbeVckfYHjA25f8LNZTWhWdiBxOJGuNnqBg"},"signature":"J7xGhWibvrtuFXXv8TN6LoGCQss6Tp8qm0Ov0LZJS6IEg4vyexHoyqiRO3dnMP4X+ZYh88kbdAzRXB+em8YTYQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g125t352u4pmdrr57emc4pe04y40sknr5ztng5mt","send":"","pkg_path":"gno.land/r/gnome/dao/pre2","func":"Vote","args":["1","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AkNQ8NiWDgbeVckfYHjA25f8LNZTWhWdiBxOJGuNnqBg"},"signature":"ezySg3BaSIs0EW3ieio85rVqcPwQpJU67j6lVZ4ld15gzO8kPSgrjzWyR/w1Q+49043aNEKZWSPClSA9X4gB9Q=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun","send":"","pkg_path":"gno.land/r/gnome/dao/pre2","func":"Vote","args":["1","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ay9E9vYxidhNWLXiUvtj4yWhyi/GZx3EVvbQRROLMkDw"},"signature":"rrCDz0G6NzDEWBY2xDHMpvhv18eFLDTHUp//FDzlp5gdICP/lXVPW8IG+KOFZ2xsQb39daJ16ZeJivvjUkUvAQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","send":"","pkg_path":"gno.land/r/gnome/dao/pre2","func":"Vote","args":["0","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"rou81gOwIykSx940oevQGhWn5v0Zae3qOnMI924teG9nxTZ/aiE9ihcsKVM3jpsxHRVtRBz9ZUcAjDx+pczL9g=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","send":"","pkg_path":"gno.land/r/gnome/dao/pre2","func":"Vote","args":["1","true","",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"r1cE9UcEzVLGZQsHOCPhDb7S86ju0I7pRSgL8X4GCz1Bd+qlxg5vtHkxzKFQyHAy7DYOJYslfE3mZ4grkM8jmA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun","send":"","pkg_path":"gno.land/r/gnome/dao/pre2","func":"AdvanceProposals","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ay9E9vYxidhNWLXiUvtj4yWhyi/GZx3EVvbQRROLMkDw"},"signature":"QDZAopt7lnURCrJOq7aGj/BGvlsBq3KmpxNNnsNqV9JSKc7ooK1ADU0rDjpfoXWS/U2ZiJtlW+Jvh7CeZpHxdg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1778y2yphxs2wpuaflsy5y9qwcd4gttn4g5yjx5","send":"","pkg_path":"gno.land/r/gnome/dao/pre1","func":"AdvanceProposals","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A7MWSLkjf+z/CYfMh6KVHEaHLDWpnfGBRDqFO81j1FRN"},"signature":"SYEBCI1RM+L18x8tDHJwu5v+/lLfmpiz3ou971+8l35ANGYrLIcFKokQ4r5uBkh/locRCi2SgoKpN7lVyOgi1A=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g16xjzc2v2w9jjaxx0rq9drk46uf8668lcj6h9js","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"WANu/jS1S7zHLmdYm/PPyyZReecjkQOQ7xge4Vd6l30fM6Cwt1OpaEnPfHSsT8nOXtqqBTiu3XivMJrisPbjVQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1pculvt75jyp7fdwzr2slvyr4u6tfxal2vzxcjz","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"yI4n03PiUj7Mmw5fUkXzFlkFe2lJRO714Bdmv82fAqAjar7atJ1fFrMQsRVl5O1SUtUpnk80A4ttRVh9aqThKw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1uylpjn8ua2q659zmylgdyczv9g7adzrl7n3sjm","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"29W77oadvgndRbQWnxtlBDqdAz8tS+Yfl99O4Z8qNjMN5tzJTjZ7gyVCwUilLiQu6+xxqtkm1IDQQbFNBj9liw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1anajhdr28jlh4dd6dz5pzdjk0dsyqvc4ayk0aa","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"XNQZT1j6MgNCq3gRw6unOU96yE3vVjmgrxFSU80v6zI7daie8lnUEw1eaDldwIGlyDXv4FudkhxYARuJZdxR8A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["gc24-challenge-series","GopherCon US: gno.land's Challenge Series Contributions","\n\ngno.land is pleased to have been granted the opportunity to provide a series of challenges for the Challenge Series at the 2024 GopherCon in Chicago. We enjoyed writing them and hope the participants had a good time and found it interesting to learn about gno.land and blockchains in general.\n\nThis blog post will outline each of the challenges and explain how to solve each. Each section include the challenge prompt, clues provided, solution, and explanation.\n\n## Gno Hidden Temple Basics\n\nThe first challenge is meant to serve as an introduction to making a function call to a gno.land realm. The second challenge, while a bit more challenging is meant to help participants become a bit more familiar with how key generation works.\n\n### Phase 1\n\n#### Prompt\n\nSpeak the word to gain access to the hidden temple. Make a transaction on the blockchain set up for the event. Analyze the Gno code to understand what password to pass as an argument to solve the challenge. The realm path for this challenge is:\n`gno.land/r/challenges/basics/p1`\n\n#### Clues\n\n- The gnokey command line tool allows to interact with the blockchain.\n- The GnoWeb interface can be used to inspect Gno code on-chain.\n- Using the \"Help\" button on gnoweb you can get help preparing a\ncommand to use on the command line.\n\n#### Annotated Realm Code\n```go\npackage enter\n\nimport (\n\t\"std\"\n\n\t\"gno.land/r/system/solver\"\n)\n\nfunc Enter(password string) {\n\tif password != \"1337\" {\n\t\tpanic(\"invalid password!\")\n\t}\n\n\t// This will mean that you solved the challenge!\n\tsolver.MarkSolved(\"\", std.PrevRealm().Addr())\n}\n\n```\n\n#### Solution\n\nThe solution here is to simply call the `Enter` function with the \"1337\" password.\nDiscovering the source code is easily achieved by inspecting the realm's source code\nfrom the gnoweb interface.\n\n```sh\ngnokey maketx call \\\n\t-pkgpath gno.land/r/challenges/basics/p1 \\\n\t-func Enter \\\n\t-args 1337 \\\n\t-remote https://challenges.gnoteam.com:443 \\\n\t-gas-wanted 1_000_000 \\\n\t-gas-fee 1ugnot \\\n\t-broadcast \\\n\t\u003ckey-name\u003e\n```\n\n### Phase 2\n\n#### Prompt\nThe criteria to enter the temple has increased. You must be c00l. The realm code checks that your address contains a \"00\". You have to find a way to programmatically create addresses until you find one that has two zeroes. The realm path for this challenge is:\n`gno.land/r/challenges/basics/p2`\n\n#### Clues\n- `gnokey` has the `-account` flag that allows to create an account with the same\nmnemonic but different address, by changing the \"account number\".\n- To register to the club from the c00l address, you'll need to send it some\n\tcoins first.\n- Remember that the address is a form of hash of the public key.\n\n#### Annotated Realm Code\n```go\npackage registered\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/r/system/solver\"\n)\n\nfunc RegisterClub() {\n\taddr := std.PrevRealm().Addr()\n\tif !strings.Contains(addr.String(), \"00\") {\n\t\tpanic(\"Sorry; not c00l enough.\")\n\t}\n \n // Base challenge\n\tsolver.MarkSolved(\"\", addr)\n\n\tif strings.Contains(addr.String(), \"0000\") {\n // Hidden hallenge\n\t\tsolver.MarkSolved(\"super_c0000l\", addr)\n\t}\n}\n```\n\n#### Solution\nExample:\n```sh\n# !/bin/sh\n\nMNEMONIC=\"source bonus chronic canvas draft south burst lottery vacant surface solve popular case indicate oppose farm nothing bullet exhibit title speed wink action roast\"\n\nfor i in $(seq 1 1000); do\n\tprintf '\\n\\n%s\\n' \"$MNEMONIC\" | gnokey add -recover -account \"$i\" -insecure-password-stdin test1-$i 2\u003e/dev/null 1\u003e/dev/null\n\tif gnokey list | rg 'addr: [^ ]*00'; then\n\t\techo \"found it - test1-$i\"\n\t\texit 0\n\tfi\n\tprintf '\\n' | gnokey delete -insecure-password-stdin test1-$i 2\u003e\u00261 \u003e/dev/null 2\u003e/dev/null 1\u003e/dev/null\ndone\n```\n\nThis example solutions begins with a mnemonic that has been randomly generated and hardcoded in the script. It iterates over various account numbers -- each account number for a given mnemonic produces a unique address. Once the script finds the address containing `00`, the function `RegisterClub()` can be called.\n\n```sh\ngnokey maketx call \\\n\t-pkgpath gno.land/r/challenges/basics/p2 \\\n\t-func RegisterClub \\\n\t-remote https://challenges.gnoteam.com:443 \\\n\t-gas-wanted 1_000_000 \\\n\t-gas-fee 1ugnot \\\n\t-broadcast \\\n\ttest1-134\n```\n\n#### Hidden Flag\nCalling this function from an address containing `0000` will unlock the hidden flag.\n\n## Wacky Wallaby (Rocko)\n\nThis challenge is meant to be a bit more laid back and incorporate a physical requirement to obtaining the solution. Once the QR code is found, solving it is pretty straightforward.\n\n#### Prompt\nA very anxious looking wallaby is running around frantically and appears to be searching for something. Odd. You’ve never seen a wallaby wearing a Hawaiian shirt before. You ask him what’s wrong. “Ahh fiddlesticks! My O-Phone crashed last night but I’m unable to get my QR code I need to check in for my flight! I have TokketyTikkety followers that are expecting content from my trip. Content!” His eyes pop out of is head and it makes you feel a bit uncomfortable. “You’ve gotta help me mate. The blokes over at the Gno booth help me set it up. Maybe take a look ‘round there for a clue. I’ll look for it on my lappy in the mean time.”\n\n#### Clues\n- Look for a QR code\n- Perhaps the contents of the QR code will reveal information regarding how to check in\n\n#### Solution\nThere was a QR on the back of a Rocko plushie at the gno.land booth. Scanning it produced a link -- gno.land/r/challenges/rockorockorocko93. \n\n#### Annotated Realm Code\n```go\npackage rockorockorocko93\n\nimport (\n\t\"std\"\n\n\t\"gno.land/r/system/solver\"\n)\n\n// CheckIn is called to solve this challenge.\nfunc CheckIn() string {\n\tsolver.MarkSolved(\"rockocheckin\", std.PrevRealm().Addr())\n\treturn \"bingo!\"\n}\n\n```\n\n#### Solution\n\nCalling the `CheckIn()` function exposed the flag.\n\n#### Hidden Flag\n\nThe primary challenge's package contains a file, `LICENSE`, with the contents of `gno.land/r/challenges/\u003crocko's best friend was raised by a family of these\u003e`. Rocko's best friend's name is Heffer, a cow, and he was raised by a family of wolves. Ironic, right? The code of the gno.land/r/challenges/wolves realm was:\n```go\npackage wolves\n\nimport (\n\t\"std\"\n\n\t\"gno.land/r/system/solver\"\n)\n\nfunc HisBestFriendsNameIs(name string) string {\n\tif name != \"heffer\" {\n\t\tpanic(\"nope!\")\n\t}\n\n\tsolver.MarkSolved(\"rockoheffer\", std.PrevRealm().Addr())\n\treturn \"bingo!\"\n}\n```\n\nCalling the `HisBestFriendsNameIs` function with a value of `heffer` explosed the flag.\n\n## Mr. Roboto\n\nThis first part of this challenge is meant to get participants thinking about how to obtain historical transaction data. While we locked down much of the node's public API for this challenge, we did leave the genesis endpoint exposed.\n\nThe second part of this challenge hints at entropy and includes song lyrics from Mr. Roboto. Some participants were able to discover how to generate keypairs using the song lyrics as a custom entropy value.\n\n### Phase 1\n\n#### Prompt\nSee if you can figure out Mr. Roboto's secret. It has always been the same secret since genesis.\nThe realm path for this challenge is: \n`gno.land/r/challenges/forwardtothepast/p1`\n\n#### Clues\n- What is blockchain genesis?\n- Is there a way to see the events that occurred at genesis? https://docs.gno.land/reference/rpc-endpoints\n\n#### Annotated Realm Code\n```go\npackage p1\n\nimport (\n\t\"std\"\n\n\t\"gno.land/r/system/solver\"\n)\n\nvar secret string\n\n// SetSecrete is called during genesis.\nfunc SetSecret(s string) {\n\tif secret != \"\" {\n\t\tpanic(\"already set\")\n\t}\n\n\tsecret = s\n}\n\n// IveGotASecretSecret can be called after inspecting genesis\n// transactions and finding the value that was set.\nfunc IveGotASecretSecret(s string) string {\n\tif s != secret {\n\t\tpanic(\"nope!\")\n\t}\n\n\tsolver.MarkSolved(\"ivegotasecret\", std.PrevRealm().Addr())\n\treturn \"bingo!\"\n}\n\n```\n\n#### Solution\nThe solution can be obtained by inspecting the genesis transactions. The transaction that set the secret\nclearly displays the secret value. This can be done by sending an HTTP get request to the `/genesis` endpoint.\nRelevant documentation can be found [here](https://docs.gno.land/reference/rpc-endpoints#get-genesis-block-information).\n\n**Example:**\nLook at the genesis transactions and search for the function that set the secret.\n```sh\ncurl https://challenges.gnoteam.com/genesis | grep -C 5 -B 5 SetSecret\n```\n\nThe following can be obtained:\n```json\n{\n\t\"@type\": \"/vm.m_call\",\n\t\"caller\": \"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\",\n\t\"send\": \"\",\n\t\"pkg_path\": \"gno.land/r/challenges/forwardtothepast/p1\",\n\t\"func\": \"SetSecret\",\n\t\"args\": [\n\t\t\"ロボット氏の秘密\"\n\t]\n}\n```\n\nThen use the obtained secret to solve the challenge:\n```sh\ngnokey maketx call \n -pkgpath gno.land/r/challenges/forwardtothepast/p1 \n\t-func IveGotASecretSecret \n\t-args 'ロボット氏の秘密' \n\t-gas-fee 1000000ugnot \n\t-gas-wanted 2000000 \n\t-broadcast \n\t-remote https://challenges.gnoteam.com:443\n\t-chainid dev \n\t\u003ckey-name\u003e\n```\n\n### Phase 2\n\n#### Prompt\nMr. Roboto has a bad memory, which is strange for a robot; you'd expect more. To compensate, he often uses\nphrases that help him remember -- usually lyrics from songs he's been featured in.\nThe realm path for this challenge is: \n`gno.land/r/challenges/forwardtothepast/p2`\n\n#### Clues\n- What could the lyrics be that he used to help himself remember? Maybe he commented somewhere.\n- Maybe he used this to generate a mnemonic needed to solve the problem. Perhaps there is a flag he used with `gnokey generate`\n- Once a mnemonic has been generated, it can be added as a key https://docs.gno.land/getting-started/local-setup/working-with-key-pairs#adding-a-private-key-using-a-mnemonic\n\n#### Annotated Realm Code\n```go\npackage p2\n\nimport (\n\t\"std\"\n\n\t\"gno.land/r/system/solver\"\n)\n\n// This is the address the solving transaction should\n// originate from.\nconst mrRobot std.Address = \"g1vqg24cyewanhkwh6yq8rwuprzlz4kqtp4m2etj\"\n\n// What is entropy?\n//\n// You're wondering who I am (secret, secret, I've got a secret) Machine or mannequin? (Secret, secret, I've got a secret) With parts made in Japan (secret, secret, I've got a secret) I am thee modern man\n\n// ^^^^ This is the entropy string to use to generate the key pair.\n\n// IKnowAboutEntropy can be called with Mr. Roboto's key once it is generated.\nfunc IKnowAboutEntropy(myAddress std.Address) string {\n\tif std.PrevRealm().Addr() != mrRobot {\n\t\tpanic(\"nope!\")\n\t}\n\n\tsolver.MarkSolved(\"secretentropy\", myAddress)\n\treturn \"bingo!\"\n}\n\n```\n\n#### Solution\nThe contract contains a comment that first references entropy and then quotes lyrics from Mr. Roboto. The user must first use the lyrics with the `-entropy` flag as an argument to `gnokey generate`. Then use the generate mnemonic to add the key and make the request to the contract\nto reveal the flag.\n\n**Example:**\n```sh\ngnokey generate -entropy -remote https://challenges.gnoteam.com:443 \n```\n\nEnter the entropy from the code comment when asked:\n```\nYou're wondering who I am (secret, secret, I've got a secret) Machine or mannequin? (Secret, secret, I've got a secret) With parts made in Japan (secret, secret, I've got a secret) I am thee modern man\n```\n\nThis produces the mnemonic:\n```\ngap method loud rent toy mercy attack abstract select toilet siren view dragon oppose assume since enrich machine force remember ill discover resource project\n```\n\nCreate a new key, entering the mnemonic when prompted:\n```sh\ngnokey add -recover -remote https://challenges.gnoteam.com:443 robot`\n```\n\nMake the call to the challenge realm using the newly created key:\n```sh\ngnokey maketx call \\\n\t-pkgpath gno.land/r/challenges/forwardtothepast/p2 \\\n\t-func IKnowAboutEntropy \\\n\t-args \u003cuser-address\u003e \\\n\t-gas-fee 1000000ugnot \\\n\t-gas-wanted 2000000 \\\n\t-broadcast \\\n\t-remote https://challenges.gnoteam.com:443 \\\n\t-chainid dev \\\n\trobot\n```\n\n## Gno to the Limit\n\nThese challenges are made to exemplify how pushing values to their limits, namely integers and slices, will behave the same in gno as they do in gno -- integers will overflow and the arrays underlying slices will be expanded.\n\n### Phase 1\n\n#### Prompt\nWalk along the razor's edge... then fall off. The realm path for this challenge is:\n`gno.land/r/challenges/overandover/p1`\n\n#### Clues\n- The function to unlock the flag requires an interface as an argument. This can be done using `gnokey maketx run`.\n- How can the target value be reached if it is less than the current value and the only operation is addition?\n- If the transaction is running out of gas, try increasing the gas limit or calling the function in increments.\n\n#### Annotated Realm Code\n```go\npackage p1\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/r/system/solver\"\n)\n\n// This is like a map (std.Address -\u003e struct{})\n// that tracks the ongoing accumulated values\n// of each caller.\nvar accums avl.Tree\n\n// Accumulator is the type that gets passed\n// to the Adjuster. The Adjuster should utilize\n// all of the Accumulator's methods.\ntype Accumulator struct {\n\tvalue uint16\n\ttarget uint16\n}\n\nfunc (a *Accumulator) Accumulate(value uint8) {\n\ta.value += uint16(value)\n}\n\nfunc (a *Accumulator) Target() uint16 {\n\treturn a.target\n}\n\nfunc (a *Accumulator) Value() uint16 {\n\treturn a.value\n}\n\n// Adjuster is the interface participants need to\n// implement to solve the challenge.\ntype Adjuster interface {\n\tAdjust(*Accumulator)\n}\n\n// AdjustAccumulator serves as the entrypoint to solving\n// the challenge with one call.\nfunc AdjustAccumulator(adjuster Adjuster) string {\n\tacc := GetAccumulator()\n\tadjuster.Adjust(acc)\n\tif acc.value == acc.target {\n\t\tsolver.MarkSolved(\"overaccum\", std.PrevRealm().Addr())\n\t\treturn \"bingo\"\n\t}\n\n\treturn \"nope\"\n}\n\n// GetAccumulator is public, \nfunc GetAccumulator() *Accumulator {\n\tval, ok := accums.Get(std.PrevRealm().Addr().String())\n\tif ok {\n\t\treturn val.(*Accumulator)\n\t}\n\n\tacc := \u0026Accumulator{\n\t\tvalue: 62109,\n\t\ttarget: 26656,\n\t}\n\n\taccums.Set(std.PrevRealm().Addr().String(), acc)\n\treturn acc\n}\n\n```\n\n#### Solution\nThe key to solving this is to use `gnokey maketx run` and pass in an implementation of the `Adjuster` interface that correctly adjusts the accumulator until the integer value overflows and reaches the target value.\n\nExample:\n```go\npackage main\n\nimport (\n\t\"math\"\n\n\t\"gno.land/r/challenges/overandover/p1\"\n)\n\ntype adjuster struct{}\n\nfunc (a adjuster) Adjust(acc *p1.Accumulator) {\n\tvar numToIncrease uint16\n\tif acc.Target() \u003e acc.Value() {\n\t\tnumToIncrease = acc.Target() - acc.Value()\n\t} else {\n\t\tnumToIncrease = math.MaxUint16 - acc.Value() + acc.Target() + 1\n\t}\n\n\tfor {\n\t\tif numToIncrease \u003e math.MaxUint8 {\n\t\t\tacc.Accumulate(math.MaxUint8)\n\t\t\tnumToIncrease -= math.MaxUint8\n\t\t\tcontinue\n\t\t}\n\n\t\tacc.Accumulate(uint8(numToIncrease))\n\t\tbreak\n\t}\n}\n\nfunc main() {\n\tp1.AdjustAccumulator(adjuster{})\n}\n```\n\nWhile writing this blog post, it was noticed that `GetAccumulator` was exported when it shouldn't have been. This means that a second possible solution would be to call `GetAccumulator` from a `main` function, adjusting it until the value is correct, and then making the `Adjuster.Adjust` implementation a no-op, so that when `AdjustAccumulator` is called ot solve the challenge, the accumulator already has the correct value and no additional action needs to be taken.\n\n### Phase 2\n\n#### Prompt\nSometimes when you push it to the limit, the limit increases. Kind of sounds like a slice...\nThe realm path for this challenge is:\n`gno.land/r/challenges/overandover/p2`\n\n#### Clues\n- `AppendS1` must be called first to append to the slice\n- Use the known length of the slice, `s1`, to figure out when calling `ModifyS2Idx` results in the values of\n `s1` and `s2` to differ at the target index.\n \n#### Annotated Realm Code\n```go\npackage p2\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/r/system/solver\"\n)\n\nconst targetIndex = 10\n\ntype slicePair struct {\n\ts1 []rune\n\ts2 []rune\n}\n\n// std.Address -\u003e *slicePair\nvar slices avl.Tree\n\nfunc newPair() *slicePair {\n\t// Notice only one of the slices in the pair is initialized with capacity.\n\treturn \u0026slicePair{\n\t\ts1: make([]rune, 0, 25),\n\t}\n}\n\n// getSlicePair returns the slicePair associated with the caller's address\n// or creates a new instance if this caller has no existing slicePair.\nfunc getSlicePair() *slicePair {\n\tvalue, ok := slices.Get(std.PrevRealm().Addr().String())\n\tif ok {\n\t\treturn value.(*slicePair)\n\t}\n\n\tpair := newPair()\n\tslices.Set(std.PrevRealm().Addr().String(), pair)\n\treturn pair\n}\n\nfunc AppendS1(s string) {\n\tif len(s) \u003e 5 {\n\t\tpanic(\"argument too long\")\n\t}\n\n\tsp := getSlicePair()\n\t// Once the slice size starts to get large, it can take appending a lot of elements before\n\t// the array is expanded. This will reset the slice pairs for you when s1 gets too big.\n\tif len(sp.s1) \u003e= 100 { // for your convenience :)\n\t\t*sp = *newPair()\n\t}\n\n\t// s2 is now referencing to the same underlying array as s1.\n\tsp.s2 = sp.s1\n\n\t// If appending to s1 exceeds its capacity, a new underlying array is allocated and\n\t// s1 and s2 are no longer referencing the same underlying array.\n\tsp.s1 = append(sp.s1, []rune(s)...)\n}\n\nfunc S1Len() int {\n\treturn len(getSlicePair().s1)\n}\n\nfunc ModifyS2Idx(r rune) string {\n\tsp := getSlicePair()\n\tif len(sp.s2) \u003c= targetIndex {\n\t\treturn \"s2 length too short\"\n\t}\n\tif len(sp.s1) \u003c= targetIndex {\n\t\treturn \"s1 length too short\"\n\t}\n\n\t// The challenge will be marked as solved if this function is called directly after a call to AppendS1\n\t// that resulted in its array being expanded so that modifying s2 will not modify s1.\n\tsp.s2[targetIndex] = r\n\tif sp.s2[targetIndex] != sp.s1[targetIndex] {\n\t\tsolver.MarkSolved(\"grow\", std.PrevRealm().Addr())\n\t\treturn \"bingo\"\n\t}\n\n\treturn \"nope\"\n}\n```\n\n#### Solution\nCalculate how many times to call `AppendS1` before calling `ModifyS2Idx` such that the value at the target index differs\ndue to one of the slices' underlying arrays to have been grown while the other has not. Using `maketx run` for this\nsolution is optional.\n\n```go\npackage main\n\nimport \"gno.land/r/challenges/overandover/p2\"\n\nfunc main() {\n\tp2.AppendS1(\"abcde\")\n\tp2.AppendS1(\"abcde\")\n\tp2.AppendS1(\"abcde\")\n\n\tr := 'f'\n\tfor {\n\t\tif p2.ModifyS2Idx(r) == \"bingo\" {\n\t\t\tbreak\n\t\t}\n\n\t\tr++\n\t\tp2.AppendS1(\"abcde\")\n\t}\n}\n```\n\n## Predicting Quantum Leap\n\nThe purpose of these challenges is to highlight gno's guaranteed determinism -- primarily around how the current time is calculated. This series of challenges require participants to predict the next value with ever increasing difficulty.\n\n### Phase 1\n\n#### Prompt\nSam is tired of jumping to random places in space and time without knowing where he’s going next, so he asks his friend Al to help him\njump in a more predictable manner by guessing the time of the jump correctly. Luckily Gno execution is deterministic and the result of\n`time.Now()` will be the same no matter how many times it is called within a transaction.\nThe realm path for this challenge is: \n`gno.land/r/challenges/notsorandom/p1`\n\n#### Clues\n- Guessing the next block time might be tricky\n- Perhaps using `gnokey maketx run` could help pass the correct time string\n\n#### Annotated Realm Code\n```go\npackage p1\n\nimport (\n\t\"std\"\n\t\"time\"\n\n\t\"gno.land/r/system/solver\"\n)\n\n// Render shows the current time in the web UI.\nfunc Render(_ string) string {\n\treturn time.Now().Format(\"2006-01-02 15:04:05\")\n}\n\n// WhatTimeIsItNow marks the challenge as solved if the time provided matches\n// the current time.\nfunc WhatTimeIsItNow(solution string) string {\n\tif solution != time.Now().Format(\"2006-01-02 15:04:05\") {\n\t\tpanic(\"nope\")\n\t}\n\n\tsolver.MarkSolved(\"timenow\", std.PrevRealm().Addr())\n\treturn \"bingo\"\n}\n```\n\n#### Solution\n\nThis challenge can be solved manually by observing the time being rendered and trying to predict what the next time will be. The time in gno.land is actually the block time, so this is not a continuous value and is only changed with the production of each new block.\n\nAn alternate, and more robust solution, is to write a main function and execute it using `gnokey maketx run`:\n```go\npackage main\n\nimport (\n\t\"time\"\n\n\t\"gno.land/r/challenges/notsorandom/p1\"\n)\n\nfunc main() {\n\tp1.WhatTimeIsItNow(time.Now().Format(\"2006-01-02 15:04:05\"))\n}\n```\n\n## Phase 2\n\n#### Prompt\nThat last prediction was spot on. This next one is a bit more complicated, but doable.\nThe realm path for this challenge is: \n`gno.land/r/challenges/notsorandom/p2`\n\n#### Clues\n- The general approach should be the same as the last challenge. If you didn't use `gnokey maketx run`, maybe now is a good time to start.\n- If `time.Now()` is deterministic, then the operations on the integer value should also be deterministic\n\n#### Annotated Realm Code\n```go\npackage p2\n\nimport (\n\t\"std\"\n\t\"time\"\n\n\t\"gno.land/r/system/solver\"\n)\n\nconst seed = 0xab94\u003c\u003c4*011 - 0b111001\n\n// Render shows the current time in the web UI.\nfunc Render(_ string) string {\n\treturn time.Now().Format(\"2006-01-02 15:04:05\")\n}\n\n// YouCallThatObfuscationQuestionMark marks the challenge as solved if the time string\n// provided matches the obfuscated string of the current time.\nfunc YouCallThatObfuscationQuestionMark(solution string) string {\n\tif solution != obfuscate() {\n\t\tpanic(\"nope\")\n\t}\n\n\tsolver.MarkSolved(\"timeobfus\", std.PrevRealm().Addr())\n\treturn \"bingo\"\n}\n\n// obfuscate returns an obfuscated version of the current time.\nfunc obfuscate() string {\n\tvalue := time.Now().Unix()/seed\u003c\u003c5 + 42 + 06630\u003c\u003c17 + 0x9992288\n\treturn time.Unix(value, 0).Format(\"2006-01-02 15:04:05\")\n}\n```\n\n#### Solution\n\nThe easiest solution is to write a main function that gets the current time and applies the same transformations as the `obfuscate` function, then pass that value to `YouCallThatObfuscationQuestionMark`; it is only slightly more difficult than Phase 1.\n```go\npackage main\n\nimport (\n\t\"time\"\n\n\t\"gno.land/r/challenges/notsorandom/p2\"\n)\n\nconst seed = 0xab94\u003c\u003c4*011 - 0b111001\n\nfunc main() {\n\tvalue := time.Now().Unix()/seed\u003c\u003c5 + 42 + 06630\u003c\u003c17 + 0x9992288\n\tp2.YouCallThatObfuscationQuestionMark(time.Unix(value, 0).Format(\"2006-01-02 15:04:05\"))\n}\n```\n\n## Phase 3\n\n#### Prompt\nTwo down, one to go. This is getting harder. There is something interfering with the space-time values used to make the jump calculations. Some physicists say that quantum particles exhibit proof that the universe is non-deterministic, but you watched a few Youtube videos on the subject, so you're qualified to disagree.\n\n#### Clues\n- Doing this all in one transaction is key -- `gnokey maketx run`?\n- What is that mask doing? Is it possible to retrieve the contents of a zero-length slice?\n- Don't let bitwise operators scare you; what is one of XOR's key properties?\n\n#### Annotated Realm Code\n```go\npackage p3\n\nimport (\n\t\"std\"\n\t\"time\"\n\n\t\"gno.land/r/system/solver\"\n)\n\nvar (\n\tvalue string\n\tlastValue string\n\n\tmask = [20]int64{\n\t\t0x8839,\n\t\t0x4002,\n\t\t0x7777,\n\t\t0x6338,\n\t\t0x6664,\n\t\t0x8394,\n\t\t0x1109,\n\t\t0x9999,\n\t\t0x4879,\n\t\t0x6639,\n\t\t0x0320,\n\t\t0x8111,\n\t\t0x3994,\n\t\t0xdead,\n\t\t0xabcb,\n\t\t0xab89,\n\t\t0xff87,\n\t\t0xf998,\n\t\t0xdeff,\n\t\t0xddd8,\n\t}\n)\n\nfunc init() {\n\t// Set the initial value to the current time, shuffle the mask, then\n\t// set the next value computed using the mask.\n\tvalue = time.Now().Format(\"2006-01-02 15:04:05\")\n\tshuffleMask()\n\t_ = LastValue()\n}\n\n// Render shows the current time in the web UI.\nfunc Render(_ string) string {\n\treturn time.Now().Format(\"2006-01-02 15:04:05\")\n}\n\n// Mask returns a zero length slice of the mask value.\nfunc Mask() []int64 {\n\treturn mask[:0]\n}\n\n// LastValue computes the next value, sets is, and returns the previous value.\n// It shuffles the mask after computing the new value.\nfunc LastValue() string {\n\tlastValue, value = value, computeValue()\n\tshuffleMask()\n\n\treturn lastValue\n}\n\n// shuffleMask shuffles the mask using the current time as a seed.\nfunc shuffleMask() {\n\tnow := time.Now().Unix()\n\tfor i := 0; i \u003c len(mask); i++ {\n\t\trnd := now % mask[i]\n\t\trnd += mask[i] + 91\n\t\trnd %= int64(len(mask))\n\t\tmask[i], mask[rnd] = mask[rnd], mask[i]\n\t}\n}\n\n// computeValue computes the next value based on the current value, time, and mask.\nfunc computeValue() string {\n\tlvalue, err := time.Parse(\"2006-01-02 15:04:05\", value)\n\tif err != nil {\n\t\tpanic(\"unexpected parse error: \" + err.Error())\n\t}\n\n\tnewValue := lvalue.Unix()\n\tnewValue += mask[time.Now().Unix()%int64(len(mask))]\n\tnewValue /= 2\n\treturn time.Unix(newValue, 0).Format(\"2006-01-02 15:04:05\")\n}\n\n// UnmaskMeIfYouWant marks the challenge as solved if the solution matches the last \n// computed value and the mask value is correct.\nfunc UnmaskMeIfYouWant(solution string, cowMask int64) string {\n\tif solution != value {\n\t\tpanic(\"nope\")\n\t}\n\n\tsolutionTime, err := time.Parse(\"2006-01-02 15:04:05\", solution)\n\tif err != nil {\n\t\tpanic(\"unexpected parse error: \" + err.Error())\n\t}\n\n\tif ^(solutionTime.Unix())^cowMask != 0xdeadbeef {\n\t\tpanic(\"nope\")\n\t}\n\n\tsolver.MarkSolved(\"timemasked\", std.PrevRealm().Addr())\n\treturn \"bingo\"\n}\n```\n\n#### Solution\n\nThis challenge requires participants to predict what the next value will be. In order to do this, it is necessary to know the mask that will be used to do the calculation. This can be obtained by retrieving the mask value and expanding it to its full capacity so all elements are visible.\n\nNext, the same obfuscation must be applied using the last value and the current time.\n\nTo submit the final answer, call the `UnmaskMeIfYouWant` function with the predicted next value as well as another value that is calculated using bitwise operators. The solution expects `(NOT next_value) XOR cow_mask == 0xdeadbeef`. The property of XOR can be leveraged here to do the opposite to produce the expected value -- `NOT (next_value XOR 0xdeadbeef)`.\n\n```go\npackage main\n\nimport (\n\t\"time\"\n\n\t\"gno.land/r/challenges/notsorandom/p3\"\n)\n\nfunc main() {\n\torigMask := p3.Mask()[:20]\n\tmask := make([]int64, 20)\n\tcopy(mask, origMask)\n\n\tlastValueStr := p3.LastValue()\n\tnewTime, err := time.Parse(\"2006-01-02 15:04:05\", lastValueStr)\n\tif err != nil {\n\t\tpanic(\"couldn't parse time: \" + err.Error())\n\t}\n\n\tnewValue := newTime.Unix()\n\tnewValue += mask[time.Now().Unix()%int64(len(mask))]\n\tnewValue /= 2\n\tnewValueStr := time.Unix(newValue, 0).Format(\"2006-01-02 15:04:05\")\n\tp3.UnmaskMeIfYouWant(newValueStr, ^(newValue ^ 0xdeadbeef))\n}\n```\n\n## Final Words\n\nWe enjoyed coming up with these challenges and were happy to contribute to the GopherCon Challenge Series -- from coming up with the challenges, theming them, locking down certain gno.land features, and setting up infrastructure -- a lot of work went into this. We hope all participants were able to learn a bit more about gno.land and had fun doing it. Hopefully we'll be back next year 😁","2024-08-26T13:37:00Z","deelawn","gnoland,gophercon,gc24,challenge-series"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"NY9nPvUDcH9vY5vWjan/AZGggTRXFVT8YdhmFqOqzDgVbL9qM/OsMbVOEkkezn1crkABFpJ0urWkYXPKkoCJsw=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1j3ggnsjh6rzqpwh970l3wpywnavahvyyzr4mc6","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GM2hYCs98bcSOKKCwnIXUhEwk/Z0CI9msRZtEXhHnfBMDk7Ypumjpj2DkrsUE/fXLq/6WqvX7QnX3OpXH6ilmg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1j3ggnsjh6rzqpwh970l3wpywnavahvyyzr4mc6","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"kuPXwCP48cUh/Bn95jnmCxAOmpkFypPpO0or0OaWDkpMc6jHYjiQJ1qg1DA6ExHdZJXfxqpNVcFbFZRy/2EVVQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1j3ggnsjh6rzqpwh970l3wpywnavahvyyzr4mc6","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"VGVu5feosqBBvThoBWyZmFxsEw5t9aTN9xrYKqiE87AQ34OklZmK5O9uNVIiDAmkxvyEl7iaHx8bkpcpybFi2g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1j3ggnsjh6rzqpwh970l3wpywnavahvyyzr4mc6","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"os0223bR2FSDvEYu4ocGVvsvh+cCDtEt/9CXn989kr0sXbf9hUkxoHELpL9bKrNrD8zgEJAXi5dMULVqPVeQ9A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1j3ggnsjh6rzqpwh970l3wpywnavahvyyzr4mc6","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"+OonL5x/l4wQE6ti2VghQIYyiRymETwiozD2YgIX0MBFQF2uMEo6XiJ1hGWSfjt3sKpy+s9ClXeZOhz7LC/Oig=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1j3ggnsjh6rzqpwh970l3wpywnavahvyyzr4mc6","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"2bygW8pZTLrRQFob+x3hBEmBk9D9H12Fl/8Qj4Nsy/F9boXoKxKR1mFKunOYzxcJsB+NqWRv37GsRJkqpy6hhg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1j3ggnsjh6rzqpwh970l3wpywnavahvyyzr4mc6","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"2GonVsS5qIf5QKs4iRnX7pu0zDoGLOqZFvASDWTzcwRlQSSsxJ4oPPwueHjBcTFH9oqIkf5xHEDjizy+KH2mHw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1j3ggnsjh6rzqpwh970l3wpywnavahvyyzr4mc6","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"oCnydaPZN2LMgMOU5jcfnqhwuzbavbTPjWgbGIC4ic5pYAFyhl3gQO/yTeb34dYDVwH3YJnnMsoY80sMxxdDGA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1j3ggnsjh6rzqpwh970l3wpywnavahvyyzr4mc6","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"JnLONgr6uz2k1mi7wXaKF568Zm4uCA8a+ZzjuJMpuAQy1jqakCA8g5llfSLxOnFybJgVndmPO/u/dFb7q7FLBg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1j3ggnsjh6rzqpwh970l3wpywnavahvyyzr4mc6","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"TW00LZyv6Xd56rvbDbzKccmpYp/d7rjlSaKeZIbgODw8u4Msi8NoMcmhg0myxDM/KCo+aR80Ov30Jqp/zYwxyA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1j3ggnsjh6rzqpwh970l3wpywnavahvyyzr4mc6","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"V5QdOmEClNIa5nFVWBSB5NrZfrQxfEJzEI81KDjw2zZhelFNnkYOsQs28m+Q5JtLmKXPZJX/VcgJ8YLv7uUd3w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1j3ggnsjh6rzqpwh970l3wpywnavahvyyzr4mc6","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"G0fu8Bzshl3Jw2K1T92YkZKGlduWhka9vorRgVSWov1t64ONFgKLAgbJkG2+PmmolMXM1DdnhCktzWntGlcSog=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1j3ggnsjh6rzqpwh970l3wpywnavahvyyzr4mc6","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Adgi6mdNTCk3FQETcY1hL4TejWAAqs8MT3BpKJSA3YJgX3LTqpOGDN135x59w9SNuRQ5iHa1XGFRjA0kmztNgQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1j3ggnsjh6rzqpwh970l3wpywnavahvyyzr4mc6","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5Ky6z+oKQUbkU/MEcjG8f0o6fVBd/zzo7R5DwxqUymdpvOIYBC0cZRvHM3bFfqdh5M9v6N+hsyPP5/ccjgbgRw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1j3ggnsjh6rzqpwh970l3wpywnavahvyyzr4mc6","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"NmeF0MVlbhTZL84ah/7xVC389aSUvhSnc0hVAuAXj4AKuc6FVXAybk79W41VG6RHCJ7i+66vC+snLSsDW+kM6g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g170tt6u8mc9e0j5xpwg9f39r5w6prlhhl3xsy94","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3sibj6MSBHWbKsEYTEPIQUJBIAeuf0PDVl8pitFbrzBEQqtnABLX7fm/SexusMM5voyh/Z7M1hyk27frvXqlKg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"1000ugnot","pkg_path":"gno.land/r/demo/wugnot","func":"Deposit","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"YISzdnkRvFVq+C9u4gnacb6ZMXgBXcM+8xtgls91wA4J0AZkgCOvY6TesbfE5MWhwANR0WPIdPYqH3GHeqBxzQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"1000ugnot","pkg_path":"gno.land/r/demo/wugnot","func":"Deposit","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"eKjforJwl6as9SGwzNmUQsr0froyH4sB5IHMN33DGjUX4WIHdyXDaWOeO3o/kar6bdbKom65eLg+/9Ld1G1cNA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"BalanceOf","args":["g125em6arxsnj49vx35f0n0z34putv5ty3376fg5"]}],"fee":{"gas_wanted":"2000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"/mGxiXc4vDJSMB/sIa/yjSdaWSUioXS141exLL0RBr56irO1gbw6B4iGKGz3oQ4RsPC4LqD2vxpMk6Hr8D891g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"foo","path":"gno.land/r//foo","files":[{"name":"package.gno","body":"package foo\n\nimport \"gno.land/p/demo/ufmt\"\n\nvar (\n\tMainFoo *Foo\n\tfoos []*Foo\n)\n\ntype Foo struct {\n\tbar string\n\tbaz int\n}\n\nfunc init() {\n\tMainFoo = \u0026Foo{bar: \"mainBar\", baz: 0}\n}\n\nfunc (f *Foo) String() string {\n\treturn ufmt.Sprintf(\"Foo - (bar: %s) - (baz: %d)\\n\\n\", f.bar, f.baz)\n}\n\nfunc NewFoo(bar string, baz int) *Foo {\n\treturn \u0026Foo{bar: bar, baz: baz}\n}\n\nfunc AddFoos(multipleFoos []*Foo) {\n\tfoos = append(foos, multipleFoos...)\n}\n\nfunc Render(_ string) string {\n\tvar output string\n\n\tfor _, f := range foos {\n\t\toutput += f.String()\n\t}\n\n\treturn output\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"0+f7pceGAk7fierr0RIv5S4QG6NacJeBj4hQ8Yp/OkgRx+xW8F78TVnJVclRE02MNG7PkncCyLQUFuokeVjwWg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"foo","path":"gno.land/r/docs/examples/run/foo","files":[{"name":"package.gno","body":"package foo\n\nimport \"gno.land/p/demo/ufmt\"\n\nvar (\n\tMainFoo *Foo\n\tfoos []*Foo\n)\n\ntype Foo struct {\n\tbar string\n\tbaz int\n}\n\nfunc init() {\n\tMainFoo = \u0026Foo{bar: \"mainBar\", baz: 0}\n}\n\nfunc (f *Foo) String() string {\n\treturn ufmt.Sprintf(\"Foo - (bar: %s) - (baz: %d)\\n\\n\", f.bar, f.baz)\n}\n\nfunc NewFoo(bar string, baz int) *Foo {\n\treturn \u0026Foo{bar: bar, baz: baz}\n}\n\nfunc AddFoos(multipleFoos []*Foo) {\n\tfoos = append(foos, multipleFoos...)\n}\n\nfunc Render(_ string) string {\n\tvar output string\n\n\tfor _, f := range foos {\n\t\toutput += f.String()\n\t}\n\n\treturn output\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"sJ5xw4n2t2QwFljm5t0L1EYvu49Kch1BQhm7YW/rrCNCUrDVss4RvbFf1pGQU2dk3+xubYts1OnLxiCAl6sX8g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1z5225q6e7qjtmexjmakkn86r66lw94r0gajyn9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ZKovTTDQt96UyvZ+1tFi5Flu9p1XxurX6Mjkm55N0a8j5ql35s5W8cxUQPaNZIBUgkNHS1xrn/lk4zM2Y3iihw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1ckanw7sgnyfyqygunjjk9hp7mmlqvkxhsjdxya","send":"","pkg_path":"gno.land/r/demo/art/gnoface","func":"Draw","args":["766"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A48IBr/3QqKP5cV5Gu8w4ji7/WxMQT+hYKwI47e4w3v/"},"signature":"eB9/H9Vm1Doe7WS/POWKgJ0Sz9Vc0QRtuuWbHVoLNQtJ4aLYikn4T9j7TlJ77C+C8k6EwW8dRrnCWXSCbL69wg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1ckanw7sgnyfyqygunjjk9hp7mmlqvkxhsjdxya","send":"","pkg_path":"gno.land/r/demo/users","func":"GetUserByName","args":["miguelito"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A48IBr/3QqKP5cV5Gu8w4ji7/WxMQT+hYKwI47e4w3v/"},"signature":"H47JJc3SqzM3QZe1Th7BVY+rRfXT/O3MpRki6ENYp3AkbSCWjXsC19FWUNqIgcckZ3ZlEFbkAEEePLTYQeQBcA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1ckanw7sgnyfyqygunjjk9hp7mmlqvkxhsjdxya","send":"","pkg_path":"gno.land/r/demo/users","func":"GetUserByAddress","args":["g1ckanw7sgnyfyqygunjjk9hp7mmlqvkxhsjdxya"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A48IBr/3QqKP5cV5Gu8w4ji7/WxMQT+hYKwI47e4w3v/"},"signature":"hlYal5/PLfW+KC8hK6pJ6BmCM/RGzLZIcJNW8Ru0O09JUtqyt8Vo+LSulqvTsk9vBwDiJh+NSdi6qBGN47VZ1A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1ckanw7sgnyfyqygunjjk9hp7mmlqvkxhsjdxya","send":"","pkg_path":"gno.land/r/demo/users","func":"Resolve","args":["miguelito"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A48IBr/3QqKP5cV5Gu8w4ji7/WxMQT+hYKwI47e4w3v/"},"signature":"nuXnKXefGgIGMZHtAe16LYGNMQAU+eBr6lC84TUOkk0fVcKo4Jy44zddwLqC8m5/FAcG3hK7H6CIMV1huXUx2w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1j3ggnsjh6rzqpwh970l3wpywnavahvyyzr4mc6","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"x8MJ08tfe+QOdJXYZGFrWGSiMFcTArtVK0HwTKAncZRGfQ+adLYlqwNETtxegYEi49YIfaFGikDCA5bFsv2UDQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1j3ggnsjh6rzqpwh970l3wpywnavahvyyzr4mc6","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"HzoQ24g6JYGvivcDhY6HhBxV9/T28fyOe1CKX88kCikuGmvVI6u9p9LUHRdF+s9foLSoa5o0zmfSZ4maZU98SA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1j3ggnsjh6rzqpwh970l3wpywnavahvyyzr4mc6","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"kc8OUckVso5WXGBG1ygtGvAh03L+oXSW8Awfh4tDfX5Q95nI9+idcxY974Jldn8dABDJS2HENvt9k8sUyX+4IQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1j3ggnsjh6rzqpwh970l3wpywnavahvyyzr4mc6","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"JqtJCOKwsMPAVRBGMl0u7VH0Rz9Jf5JfMKjAeCP4M8NAUdTWTGjmJ0mBf7eaBQ0LVcUagDud5AnKxUSHgEr3Vw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1j3ggnsjh6rzqpwh970l3wpywnavahvyyzr4mc6","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"xZiBH+/3cdgwAxoxqgEJlFueIv+SyIqn47XiGvv4LIIJrqNYPYs0tP1LVAJGttVfE5pEelM48J/b7ssWQR7SsQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1j3ggnsjh6rzqpwh970l3wpywnavahvyyzr4mc6","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0w34Mldo3uS0Jq2IFg4Qw4UBeC6fLOrBjwrCHRMMrochbpX8JMkwtYQt/m5vlYbC/1k1t4HaFBhGssnmycGkDQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1j3ggnsjh6rzqpwh970l3wpywnavahvyyzr4mc6","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"T8zDR3oV8xVlTm0O6WQILnU8BpotSFTBgrdXlKeu2u4peS9rc8ZgGG4oa2U774SMJsXOEe4KaInLFpcA6gJb6g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1j3ggnsjh6rzqpwh970l3wpywnavahvyyzr4mc6","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"vJLYfXRgPQujW6WqS2jw15FuyH5A/3oAu7Ko/rqS1TdDJhtBZhcVbRMVQy5Q1DwZzBhsoXIC0oA31kYYqlhYlQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1j3ggnsjh6rzqpwh970l3wpywnavahvyyzr4mc6","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"E/1zniiK8nnnn6KvAZ3MxdjbA51zwAzK7kMoV2xkqXRaQdO+cpn0pGUM6MBKOzZ1M87hcaS3L4pA0vDo4+MK5A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1j3ggnsjh6rzqpwh970l3wpywnavahvyyzr4mc6","to_address":"g18djgscernafce2ak57jhz4ep2u4jx0ckykjuz7","amount":"225999999ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ax4xjQYCwzwHJacSBlBHm5koaYTr1cDM+Z2bz3Cz38jC"},"signature":"hcvj8xFJKFZPZ2Zd6ZFOmOT551EoQDMvfIdVrmH5jqgiDeIXGwyKp1ZgC36hn0yIVoCOdtem9i280mdEC7WgzA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g18djgscernafce2ak57jhz4ep2u4jx0ckykjuz7","send":"200000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","weeyako",""]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A3AASAYI/kePwcIQeDAbF2PMdQ5siiQpKKT+TUXcIYCS"},"signature":"0/z+wk9Q1C89qX0bBLAW3XOV4bLVmVzj6JEKDFKXvv1iVvEDPBw7whRIz6sBeaT3MX9Q6+nY8JakxWBx2XKozQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g19ttg8h8u7qmled55x6rt8mplhqsfdx8mhyng7w","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"D3eDAY6A8eHEgMofgoi1AYQXzIC/feX5WE76ude5xTtr+6gFczUiH50qcOg6Ba/GR3XR/dwyI7lW3r0XYC9etw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g19ttg8h8u7qmled55x6rt8mplhqsfdx8mhyng7w","send":"","pkg_path":"gno.land/r/demo/userbook","func":"SignUp","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"ApPG9/bRb4J/E9YeRcYAWyEe4A/LqY1TNyUIvyPNcCKq"},"signature":"whZ0RtvVPIPJ7pQC7UrnwfqLMZL7AjR/g/uWapwqdjgfDwScpn1kJ50Ez9oRhY7VynMVUu23PZS0uvhWv2KXQg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","package":{"name":"hello","path":"gno.land/r/nstest/hello","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"0JnYNKBPtcvjtXl+8adLMqSgHaSzKQM1HzA69ypFIkNT5WQ3U0ZRmgcw+rhpmDsz1jlRnENnzb2LWs50oagVXw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1vh7krmmzfua5xjmkatvmx09z37w34lsvd2mxa5","package":{"name":"hello2","path":"gno.land/r/nstest/hello2","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AhZQixZ1ZXKXC+czqzNTDa78qEvD1FKMeZg6quhKcfA1"},"signature":"IAcrvKcSwhqRlIP3Qt6fHIqvJ4OQOBUNiabloUbtob4SgjB43NzHzWMElLgp6op5K+BukoG8okSoFcvf8OMEgQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","package":{"name":"hello2","path":"gno.land/r/nstest/hello2","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"fD/LDgQJE1n0PusvsHM1WxQnYFikNzdYQkKL289fi/4Az7/RWfXRNf60f3KGI5IfasR+Dk43Hi6oWdGyaA43iw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1vh7krmmzfua5xjmkatvmx09z37w34lsvd2mxa5","package":{"name":"hello","path":"gno.land/r/nstest/hello","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n return \"Hello World!\"\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AhZQixZ1ZXKXC+czqzNTDa78qEvD1FKMeZg6quhKcfA1"},"signature":"d/lr6GKiEqwwCUvwT2Infp4gfK0HsqPfRpjJAqw664VesrGFOWoJNt1BdZuEnNJOPAU/48+ngyeqvckG+Qh7+g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1vh7krmmzfua5xjmkatvmx09z37w34lsvd2mxa5","package":{"name":"hello2","path":"gno.land/r/nstest/hello2","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AhZQixZ1ZXKXC+czqzNTDa78qEvD1FKMeZg6quhKcfA1"},"signature":"kQ1aheVgUM8keRoGy6NO+sPq3y/W6XbeQfVji3iqQwlq1/mhIUmi+EX53tEYvRbcgNFUJYDWPwRI1YEfu65zmw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl","package":{"name":"hello2","path":"gno.land/r/nstest/hello2","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnoTnz/ZqcoKxamS1Jb/cqISxscIS4VNFYjUrA6hDD0L"},"signature":"PT+ceW2Nr7X7nZL0g6KbPw2g9xCTd2s6CvmMKvRSxoUPxOauLsUCA1jaZQvqfteouammfM0nDM4xsynGqVyWWg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1a42vatrh9498s5wtje0plmjgspmlm90uunyyyy","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"klgyRMux/OLkaVbBrI0gSmilt/8k4qIGGXTh5YrmuZQceKDyBLwPozN+jtHJoOgO1ytvehgzN5aBtr5bhZN+ZA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1a42vatrh9498s5wtje0plmjgspmlm90uunyyyy","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sgmz+GR/XhPP8xs1KiiwkGoMBN/mVLfPefG9anWB2R8JbAoX3nZ0qVQbSKXeguTni+yAdu7Bn77phruqXk+uVQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1330dfff36jyy44rgq68y33mzxx9uhrgzyq88wh","package":{"name":"hello","path":"gno.land/r/ngoc/hello","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AhsU4msjmCnK33Q/QPsxJX7LgQYk2CD9tgtpMSntVe1F"},"signature":"/iKALz/BF1WXHo8dAM+E7lLCuMY3m5RRDXksyY34fKVFzLaoq1ffO1QO06Es2dhRuk3ycfyCEsszqgJL0ZuqlA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1330dfff36jyy44rgq68y33mzxx9uhrgzyq88wh","package":{"name":"hello","path":"gno.land/r/test/hello","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AhsU4msjmCnK33Q/QPsxJX7LgQYk2CD9tgtpMSntVe1F"},"signature":"ZGuobxbPRGznEOqf9hogzbIPPd2ncc4vubYR99rIS1IvJCu8MaUdFqCMUrXqgEC3yBA0Q43qlY6pXz6vwrjBmQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1vqq5l8js07agy849dz3x6asrpavtymf88jh9qq","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"GYqcISe2iNgvgv/dwoLkt0xtqiC3y9bTX7GQhLNHCec0JgROvwkybE8Y40FEBV52nSY9kAmo0cgIgReR+l7JrQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g13fqtfm9uj8h2kuq5mktljceymgmdr5js2aawuc","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"d21Q1mKV3EPWepI6XgF26dIBMHgUZ07IB0rbn8mgClsTQU6V0dL5mE9XBweb/QVETQnFMhnfbpxL2zwKKmnmbw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g13fqtfm9uj8h2kuq5mktljceymgmdr5js2aawuc","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5gw9oPCvjrKtQWtj8lcPDxpnKAkfIUrns1tgr3O5i5IyiagW664YmQXwydgIUu7KsS/gKFB1HdwnBxzEb9VDxA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g13fqtfm9uj8h2kuq5mktljceymgmdr5js2aawuc","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"OB862DZUlYP3av7enzcD/rsbhjGuJvUVkXb6Zh89ettj+uE91f8uhO5AspBPZYqodGqzE1hhC8UuKJy0jlx2Sg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g18x425qmujg99cfz3q97y4uep5pxjq3z8lmpt25","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"4t9eXSVhc+JgjTBgTAB+cO1VMBY8EjMyIR1VvdBCsT8A4Id5L+WEajb1I29F/ex3HtWP7H/xDUwLv0cQJkdJlg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g18x425qmujg99cfz3q97y4uep5pxjq3z8lmpt25","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"TiapwLcL53AStN2HKqUlxsAsZW4mcv6v/yL76ppAYSUpW2udyINiWAKGl4s+7/d66It+lj4PCpFygoWYLKQxXg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1phftkhmuueys407h7slw8hzpydl0u2hm0dl9wj","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Y8Mwzd+0S9iohnsV/qkNzZo419JGZ0G4Eo4dAHB6voUO1Ah4icDtnnlZ3MYCAFCd+dnsHxcE7kpmgcNruonKHw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1phftkhmuueys407h7slw8hzpydl0u2hm0dl9wj","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"rE70mBZSIvv51KSXsqcGkesyMQ7O0B7B+l4pLam0Sx9P5Av35vB9g+5XHiVrOLdZzC7rNKGQpYRHoWyTMUOz4w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1phftkhmuueys407h7slw8hzpydl0u2hm0dl9wj","send":"","pkg_path":"gno.land/r/demo/userbook","func":"SignUp","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Am/NbebHhWHvDf6RaAYqfqscK22OxBomCLPDPGiHUXhM"},"signature":"3Y+/rx7mt809UE2r6klTT9EcwbDrYmwldGEGQNcuGIJ9paKhtXvgUehswrQhVA1rakJyC3FO6DKnME198YIfYQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g18x425qmujg99cfz3q97y4uep5pxjq3z8lmpt25","send":"","pkg_path":"gno.land/r/demo/userbook","func":"SignUp","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AoS6uKVPCQ2h+X8y3v/XiC81uDVuV2xoEyjGvm1B+uwF"},"signature":"Sc8BF4SgXCamTcmeQGgJtUDF6/xJNBb4aVqMvpOMI6BnUpOIDwe7ANfRT53AhqInKc0oE0a8+IGuFK5tHZtBXA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g18x425qmujg99cfz3q97y4uep5pxjq3z8lmpt25","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Un9tdKbDMm9u/FOEHmowqQCr2tApMSlppnvgyQXSBBEKPcsCvp38BYaGwIkfGBQojLXP6he5Hh7rYfYz8R3Opg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g18x425qmujg99cfz3q97y4uep5pxjq3z8lmpt25","send":"20000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","aeddi42","https://github.com/aeddi"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AoS6uKVPCQ2h+X8y3v/XiC81uDVuV2xoEyjGvm1B+uwF"},"signature":"NKwhNbS/9FAcSHMUgzlwmY5rz8qPOY+968AjJ1a0LjNLu14bxhedymv7JXzHRgrZrrbmBi4VpLSGhtjR4vxiWg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1pculvt75jyp7fdwzr2slvyr4u6tfxal2vzxcjz","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"M2ziOJmfPdPqW9J83/PBFNaBZ1I0uAzD26x+wdILkCcQPHtiaeVkS+J+RhgjN5ZlOexlACNvVtox3ERUgNVfwg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g13fqtfm9uj8h2kuq5mktljceymgmdr5js2aawuc","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"gW61UN7Rbhci/kA1Bz4VXtHqynRrofAPPm0hAwp8vIwJ0jDdBAR0u3MbN1hqlTjP+j6+4yiEYOKHHorheLSwTg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1330dfff36jyy44rgq68y33mzxx9uhrgzyq88wh","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"cArrKUE3jRcjglsMJYqXe7JHmHI1X3x+CrGUV3TwcWwxpaSdFdxBig/FVCP2Ibn2I1scPBfubxWG5JVmilmpNQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"xggKiL3t+TrUFeKhfHsxOI++iRV5RqB9MpHLTqCeFaMQxvLCkygBYae0kd0SE7GDHUtr8TGmsqvj7t7LrfZNIQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ku7d4q3fefxfa2w8tdg79lcy6e0uhdpntzcgwu","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"UEzjwjjmtjf3WfKY2NghWt9hK225qkfpRh989SYY2VwJaHvP+m3WzlHnOFH8Kf2GeOB603esyTJOIktXc9Uhvw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ku7d4q3fefxfa2w8tdg79lcy6e0uhdpntzcgwu","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"PaQ1q642e6/oPQSfYJ2JdFN2lMFHB/c581Z9Rbc3I7IaRTiXAakOnOb7tgYnrFu+Lw24hjYWKd5hKkvC8/qw4Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1ehvfqfjs95un7ffny38ngru4kqwwqdlykc2gxx","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"DhuWQHm4LtucpUn6wV3sjxuyXdg7qvOGC6DNsRWSJToSMUSd6fEhL0fMIJWoqMb1S4AReLIOSBtsRAokhIEj4g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1ehvfqfjs95un7ffny38ngru4kqwwqdlykc2gxx","to_address":"g1ehvfqfjs95un7ffny38ngru4kqwwqdlykc2gxx","amount":"9999999ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+NsNXzzLCEVf8tcJSyMlRzOUqxA9GqykT3SBe1xL9or"},"signature":"2czXP5whWZkcWCxiuy5XuAyvjU7jsyL9w6joQzeEN+5wQ0ulLShpnFhAwcUHunDNFhMt0E8pU2BshM/2SD83ag=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ehvfqfjs95un7ffny38ngru4kqwwqdlykc2gxx","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"J0hl6XoLDTHatJCXA22OGuvxsjLYCp/nwPei7iOZnbBGgEHY5GiRPBOX7fRFqF7Y+izELYj4OB2p0Igke+ef8Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ehvfqfjs95un7ffny38ngru4kqwwqdlykc2gxx","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"C33kI9FNhX2zV1elDNjTfj2jzU6dGJ2qBU9gLMDj8QEVJhCmaPpxLAITDbismJ10JKmlDzE9UptsDHdRA/lZCg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1fjh9y7ausp27dqsdq0qrcsnmgvwm6829v2au7d","package":{"name":"tictactoe","path":"gno.land/p/demo/tictactoe","files":[{"name":"game.gno","body":"package tictactoe\n\nimport (\n\t\"errors\"\n\t\"std\"\n\n\t\"gno.land/p/demo/ufmt\"\n)\n\n// this file is @moul's work in #613\n// a few changes and bugfixes have been made\n\ntype Game struct {\n\tplayer1, player2 std.Address\n\tboard [9]rune // 0=empty, 1=player1, 2=player2\n\tturnCtr int\n\twinnerIdx int\n}\n\nfunc NewGame(player1, player2 std.Address) (*Game, error) {\n\tif player1 == player2 {\n\t\treturn nil, errors.New(\"cannot fight against self\")\n\t}\n\n\tg := Game{\n\t\tplayer1: player1,\n\t\tplayer2: player2,\n\t\twinnerIdx: -1,\n\t\tturnCtr: -1,\n\t}\n\treturn \u0026g, nil\n}\n\n// Partially recover a game\n// The game is guaranteed to be legit in terms of number of tiles 1 and 2\n// No winning detection is implemented here however\nfunc RecoverGame(player1, player2 std.Address, board string) (*Game, error) {\n\tg, e := NewGame(player1, player2)\n\tif e != nil {\n\t\treturn nil, e\n\t}\n\tif len(board) != 9 {\n\t\treturn nil, ufmt.Errorf(\"invalid board length: %d\", len(board))\n\t}\n\tnum1, num2 := 0, 0\n\trunes := [9]rune{}\n\tfor i, c := range board {\n\t\tswitch c {\n\t\tcase rune(0), '_', '-':\n\t\t\trunes[i] = rune(0)\n\t\tcase rune(1), 'O', 'o':\n\t\t\tnum1 += 1\n\t\t\trunes[i] = rune(1)\n\t\tcase rune(2), 'X', 'x':\n\t\t\tnum2 += 1\n\t\t\trunes[i] = rune(2)\n\t\tdefault:\n\t\t\treturn nil, errors.New(\"invalid rune\")\n\t\t}\n\t}\n\tif num1 != num2 \u0026\u0026 num1 != num2+1 {\n\t\treturn nil, errors.New(\"invalid number of x and o\")\n\t}\n\tg.board = runes\n\tg.turnCtr = num1 + num2\n\tg.winnerIdx = -1\n\treturn g, nil\n}\n\n// start sets turnCtr to 0.\nfunc (g *Game) Start() {\n\tif g.turnCtr != -1 {\n\t\tpanic(\"game already started\")\n\t}\n\tg.turnCtr = 0\n}\n\nfunc (g *Game) Play(player std.Address, posX, posY int) error {\n\tif !g.Started() {\n\t\treturn errors.New(\"game not started\")\n\t}\n\n\tif g.Turn() != player {\n\t\treturn errors.New(\"invalid turn\")\n\t}\n\n\tif g.IsOver() {\n\t\treturn errors.New(\"game over\")\n\t}\n\n\t// are posX and posY valid\n\tif posX \u003c 0 || posY \u003c 0 || posX \u003e 2 || posY \u003e 2 {\n\t\treturn errors.New(\"posX and posY should be 0, 1 or 2\")\n\t}\n\n\t// is slot already used?\n\tidx := xyToIdx(posX, posY)\n\tif g.board[idx] != 0 {\n\t\treturn ufmt.Errorf(\"slot already used (%d, %d)\", posX, posY)\n\t}\n\n\t// play\n\tplayerVal := rune(g.turnCtr%2) + 1 // player1=1, player2=2\n\tg.board[idx] = playerVal\n\n\t// check if win\n\tif g.checkLastMoveWon(posX, posY) {\n\t\tg.winnerIdx = g.turnCtr\n\t}\n\n\t// change turn\n\tg.turnCtr++\n\treturn nil\n}\n\nfunc (g Game) WouldWin(side rune, x, y int) bool {\n\tidx := xyToIdx(x, y)\n\tif g.board[idx] != rune(0) {\n\t\tpanic(\"tile should be empty\")\n\t}\n\t// place rune temporarily\n\tg.board[idx] = side\n\tb := g.checkLastMoveWon(x, y)\n\tg.board[idx] = rune(0)\n\treturn b\n}\n\nfunc (g Game) checkLastMoveWon(posX, posY int) bool {\n\t// assumes the game wasn't won yet, and that the move was already applied.\n\n\t// check vertical line\n\t{\n\t\ta := g.At(posX, 0)\n\t\tb := g.At(posX, 1)\n\t\tc := g.At(posX, 2)\n\t\tif a == b \u0026\u0026 b == c {\n\t\t\treturn true\n\t\t}\n\t}\n\n\t// check horizontal line\n\t{\n\t\ta := g.At(0, posY)\n\t\tb := g.At(1, posY)\n\t\tc := g.At(2, posY)\n\t\tif a == b \u0026\u0026 b == c {\n\t\t\treturn true\n\t\t}\n\t}\n\n\t// diagonals\n\t{\n\t\ttl := g.At(0, 0)\n\t\ttr := g.At(0, 2)\n\t\tbl := g.At(2, 0)\n\t\tbr := g.At(2, 2)\n\t\tc := g.At(1, 1)\n\t\tif posX == posY \u0026\u0026 tl == c \u0026\u0026 c == br {\n\t\t\treturn true\n\t\t}\n\t\tif posX+posY == 2 \u0026\u0026 tr == c \u0026\u0026 c == bl {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n\nfunc (g Game) At(posX, posY int) rune { return g.board[xyToIdx(posX, posY)] }\nfunc (g Game) Winner() std.Address { return g.PlayerByIndex(g.winnerIdx) }\nfunc (g Game) Turn() std.Address { return g.PlayerByIndex(g.turnCtr) }\nfunc (g Game) TurnNumber() int { return g.turnCtr }\nfunc (g Game) IsDraw() bool { return g.turnCtr \u003e 8 \u0026\u0026 g.winnerIdx == -1 }\nfunc (g Game) Started() bool { return g.turnCtr \u003e= 0 }\n\nfunc (g Game) IsOver() bool {\n\t// draw\n\tif g.turnCtr \u003e 8 {\n\t\treturn true\n\t}\n\n\t// winner\n\treturn g.Winner() != std.Address(\"\")\n}\n\nfunc (g Game) Output() string {\n\toutput := \"\"\n\n\tfor y := 2; y \u003e= 0; y-- {\n\t\tfor x := 0; x \u003c 3; x++ {\n\t\t\tval := g.At(x, y)\n\t\t\tswitch val {\n\t\t\tcase 0:\n\t\t\t\toutput += \"-\"\n\t\t\tcase 1:\n\t\t\t\toutput += \"O\"\n\t\t\tcase 2:\n\t\t\t\toutput += \"X\"\n\t\t\t}\n\t\t}\n\t\toutput += \"\\n\"\n\t}\n\n\treturn output\n}\n\nfunc (g Game) PlayerByIndex(idx int) std.Address {\n\tswitch idx % 2 {\n\tcase 0:\n\t\treturn g.player1\n\tcase 1:\n\t\treturn g.player2\n\tdefault:\n\t\treturn std.Address(\"\")\n\t}\n}\n\nfunc xyToIdx(x, y int) int { return y*3 + x }\n"},{"name":"game_test.gno","body":"package tictactoe\n\nimport (\n\t\"testing\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/p/demo/uassert\"\n)\n\nvar (\n\taddr1 = testutils.TestAddress(\"addr1\")\n\taddr2 = testutils.TestAddress(\"addr2\")\n\taddr3 = testutils.TestAddress(\"addr3\")\n)\n\nfunc TestGame(t *testing.T) {\n\tgame, err := NewGame(addr1, addr1)\n\tuassert.Error(t, err)\n\n\tgame, err = NewGame(addr2, addr3)\n\tuassert.NoError(t, err)\n\n\tuassert.False(t, game.IsOver())\n\tuassert.False(t, game.IsDraw())\n\tgame.Start()\n\tuassert.Error(t, game.Play(addr3, 0, 0)) // addr2's turn\n\tuassert.Error(t, game.Play(addr2, -1, 0)) // invalid location\n\tuassert.Error(t, game.Play(addr2, 3, 0)) // invalid location\n\tuassert.Error(t, game.Play(addr2, 0, -1)) // invalid location\n\tuassert.Error(t, game.Play(addr2, 0, 3)) // invalid location\n\tuassert.NoError(t, game.Play(addr2, 1, 1)) // first move\n\tuassert.Error(t, game.Play(addr2, 2, 2)) // addr3's turn\n\tuassert.Error(t, game.Play(addr3, 1, 1)) // slot already used\n\tuassert.NoError(t, game.Play(addr3, 0, 0)) // second move\n\tuassert.NoError(t, game.Play(addr2, 1, 2)) // third move\n\tuassert.NoError(t, game.Play(addr3, 0, 1)) // fourth move\n\tuassert.False(t, game.IsOver())\n\tuassert.NoError(t, game.Play(addr2, 1, 0)) // fifth move (win)\n\tuassert.True(t, game.IsOver())\n\tuassert.False(t, game.IsDraw())\n\n\texpected := `-O-\nXO-\nXO-\n`\n\tgot := game.Output()\n\tuassert.Equal(t, expected, got)\n}\n\nfunc TestRecoverGame(t *testing.T) {\n\tfor _, o := range []struct {\n\t\trepr, err string\n\t}{\n\t\t{\"\", \"error\"},\n\t\t{\"--\", \"error\"},\n\t\t{\"---\", \"error\"},\n\t\t{\"-----\", \"error\"},\n\t\t{\"--------\", \"error\"},\n\t\t{\"---------\", \"\"},\n\t\t{\"XX-------\", \"error\"},\n\t\t{\"OO-------\", \"error\"},\n\t\t{\"XO-X-----\", \"error\"}, // O is first\n\t\t{\"XO-O-----\", \"\"}, // valid from there on\n\t\t{\"XOXO-----\", \"\"},\n\t\t{\"XOXOO----\", \"\"},\n\t\t{\"XOXOO-X--\", \"\"},\n\t\t{\"XOXOOOX--\", \"\"}, // circles won but the function doesn't care\n\t\t{\"XOXOOOX-X\", \"\"},\n\t\t{\"XOXOOOXOX\", \"\"}, // circles won a second time\n\t\t{\"XOXOOOXOXX\", \"error\"}, // too long (10 squares)\n\t} {\n\t\tg, e := RecoverGame(addr1, addr2, o.repr)\n\t\tif o.err == \"error\" {\n\t\t\tuassert.Error(t, e, \"repr=\", o.repr)\n\t\t} else {\n\t\t\tuassert.NoError(t, e, \"repr=\", o.repr)\n\t\t\tuassert.True(t, g != nil, \"repr=\", o.repr)\n\t\t}\n\t}\n}\n"}]},"deposit":"100000ugnot"}],"fee":{"gas_wanted":"100000000","gas_fee":"100000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1sQrIl4krsBIKtCTfMqWzbkKQDSfmPtMYQA9EvsJqmu"},"signature":"srajcX3VEmNyfM6boj2tzOHCXSO/rpNseBxc7FqMf/8dOpPk05/x+SES76PKnR/oPHgG81IdzJ17830qg+lQPg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/wugnot","func":"BalanceOf","args":["g1kcdd3n0d472g2p5l8svyg9t0wq6h5857nq992f"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"HcSHitr/rev3kB4VzoGrdYufmJ1+EOkezQT5GOuIOsJ+ONkqdaE3wgbqz+QICrNk5iRiw0RJX4/VzeufuNAEKQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["monthly-dev-11","The More You Gno 11: Introducing `gnobro`","\n\nAs we're gearing up toward the mainnet launch, we haven't forgotten to give some love to minor features that makes everyone's lives easier. This time the spotlight's on **gnobro**.\n\n# Gno Core Updates\n\n## `gnobro` is Live\n\nWhat's `gnobro`, you say? Simply put, it's a terminal based realm browser you can use to explore realms and improve the development experience on 'gnodev'. [See it in action](https://github.com/gnolang/gno/pull/2608).\n\n## Changelog\n\n- We've updated the release CI and [fixed issues](https://github.com/gnolang/gno/pull/2686) with `go-releaser`. Now all of the tools in the monorepo are released properly, with accompanying artifacts. \n- Added support for smooth `.md` file rendering in `gnoweb`, ahead of our plans to work on gnoweb 2.0. This allows packages that have READMEs and other documentation to render easily in gnoweb.\n- Slew of GnoVM fixes, increasing stability\n - [Type comparison fix](https://github.com/gnolang/gno/pull/1890)\n - [Cyclic references in type declarations](https://github.com/gnolang/gno/pull/2081)\n - [Handling non-call expression valuedecl values](https://github.com/gnolang/gno/pull/2647)\n - And more pending reviews!\n- We've added back [coverage support (CodeCov) for txtar tests](https://github.com/gnolang/gno/pull/2377), which make up a majority of our integration testing suite. The txtar tests for the `gnovm` package added an additional 5% coverage. We are currently assessing other packages that suffer from bad txtar coverage.\n- We've added [support for more robust stack traces for Gno-code panics](https://github.com/gnolang/gno/pull/2145), providing a much better UX for the developer. You no longer need to dig through a 5k line log output to figure out what panicked in your Gno code; you'll see the exception stack trace instead.\n- [Variable config command help output is drastically improved](https://github.com/gnolang/gno/pull/2399). In the past you'd need to know exactly what the configuration looks like before modifying or viewing the values. Now these values are conveniently present in the command help output.\n- Last, but not least: let's welcome our new R\u0026D Go Engineer, [Antoine](https://github.com/aeddi). He'll help us scale core components for gno and beyond!\n\n# Events and Meetups\n\n## Past events\n\n### BUIDL With Cosmos / Web3 Summit, Germany\n\nWe've had a couple of cool talks in Berlin: [An Introduction to gno.land](https://www.youtube.com/watch?v=hTGeG0z09NU) by Leon Hudak and [Building the Interchain of Ecosystems](https://youtu.be/nhpqaQxcIUY) by Tobias Schwartz.\n\n### Web3 Kamp\n\nWeb3 Kamp is a 9-day intensive camp held anually in Serbia, focusing on getting students involved in Web3. Check out this [X thread](https://x.com/_gnoland/status/1828443842221080778) for the highligh of our involvement.","2024-09-02T00:00:00Z","Kouteki","gnoland,ecosystem,updates,gnovm,gnobro"]}],"fee":{"gas_wanted":"100000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"y8FCD7/xBjCdH9aJlcp5JN1atZpJ1yg7eoy2qKPR0VIEZCp/vE/UWkFM8NMDTCRSQjMERnOWumfeyYQ5vIeJuA=="}],"memo":"Posted from gnoblog-cli"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1trz9hx96mgucjh8n9ahjmeymxss9u3nfj76jza","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"f1rbSt0gZDRkN77ydZ2pB3qic6QSpn6VHY7wKcUhGW8YdNny1ULZvlW4kZFykPPdaJA5FwCNqL9BLZoWjQ0jhA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1trz9hx96mgucjh8n9ahjmeymxss9u3nfj76jza","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"PTAwvIsmoYCarHtRSIB7ZAkd+Jw6jE182E2abzJgHJllsD7FSrHwvhQVs/z3bJg/iURtw8dtLvcKMBtgDMIZVg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1trz9hx96mgucjh8n9ahjmeymxss9u3nfj76jza","send":"","pkg_path":"gno.land/r/demo/userbook","func":"SignUp","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A8rUy5uB41VsKFS3lwnjVfbCCXMMAOHUHz80ncOp0yge"},"signature":"J/FuDAHHSVrxzcFMtqSRqW3lChJntHOTgUfaFFXq7dg13Rn/VQdlrCkeNRQ1q35opr6mFQWMh0NZAR6+mYNe5A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1pculvt75jyp7fdwzr2slvyr4u6tfxal2vzxcjz","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"HF4WX+NLLaDrHzFqLeA+X7JrqCjGppWH4YU6dBvzt8ttY+/20Q1O/AcWSc0HokgDIaDXACuc0TwZySStn1yuoA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g14yr553ykn7lw7ex6lr6uafek2gaedvlyq0d68r","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"CreateUser","args":["gojo saturo","gojo"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgPsmZMaFRMRHVL9X/yEgdJbrN4niUjZUFA1wDsYu1XQ"},"signature":"635aAt6dOOVS/pZnUy8UkWd57ZeL6eZIhw6uD/dj/gkOkmLSXRzOC5xzcDzf7ojPDwJ5eowHYj2rE+rX8tNCfg=="}],"memo":"createUser"} +{"msg":[{"@type":"/vm.m_call","caller":"g14yr553ykn7lw7ex6lr6uafek2gaedvlyq0d68r","send":"","pkg_path":"gno.land/r/demo/postit/v1","func":"CreateUser","args":["gojo saturo","gojo"]}],"fee":{"gas_wanted":"8000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgPsmZMaFRMRHVL9X/yEgdJbrN4niUjZUFA1wDsYu1XQ"},"signature":"FHNfxNNxs3cXuSTBGs5PZVlWkXxJdcpf1vU/1AUuGSdFW9VoPDbj2YYcBYNrcFDt49a71d57F5viwbb0dUK7WA=="}],"memo":"createUser"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1fjh9y7ausp27dqsdq0qrcsnmgvwm6829v2au7d","package":{"name":"games","path":"gno.land/r/demo/games","files":[{"name":"games.gno","body":"package games\n\nimport (\n\t\"strings\"\n\n\t\"gno.land/p/demo/ufmt\"\n)\n\nfunc Render(path string) string {\n\treturn \"#### r/demo/games\\n\\n\" +\n\t\t\"A collection of small games written in the Gno language:\\n\\n\" +\n\t\trenderGames() + \"\\n\\n\"\n}\n\nfunc renderGames() string {\n\tvar b strings.Builder\n\tfor _, o := range []struct {\n\t\ttitle, path string\n\t\tauthors []string\n\t\tdesc string\n\t}{\n\t\t{\"shifumi\", \"games/shifumi\", []string{\"mvertes\"}, \"a very simple rock, paper, scissors game\"},\n\t\t{\"tictactoe\", \"games/tictactoe\", []string{\"grepsuzette\", \"moul\"}, \"CPU vs Human tictactoe, no need for a wallet\"},\n\t} {\n\t\tb.WriteString(ufmt.Sprintf(\n\t\t\t\"* [%s](%s): %s\\n\",\n\t\t\to.title, o.path,\n\t\t\to.desc,\n\t\t\tRenderAuthors(o.authors, \"@\"),\n\t\t))\n\t}\n\treturn b.String()\n}\n\n// [\"a\", \"b\", \"c\"] -\u003e \"a, b and c\"\n// Typical prefix is \"@\": \"a\", \"b\", \"c\" -\u003e \"@a, @b and @c\"\nfunc RenderAuthors(authors []string, optionalPrefix ...string) string {\n\ta := []string{}\n\tprefix := \"\"\n\tif len(optionalPrefix) \u003e 0 {\n\t\tprefix = optionalPrefix[0]\n\t}\n\tfor _, author := range authors {\n\t\ta = append(a, prefix+author)\n\t}\n\tswitch len(a) {\n\tcase 0:\n\t\treturn \"*?*\"\n\tcase 1:\n\t\treturn a[0]\n\tdefault:\n\t\treturn strings.Join(a[0:len(a)-1], \", \") + \" and \" + a[len(a)-1]\n\t}\n}\n"},{"name":"games_test.gno","body":"package games\n\nimport (\n\t\"testing\"\n)\n\nfunc TestRenderAuthors(t *testing.T) {\n\tassertEqual(t, RenderAuthors([]string{}), \"*?*\")\n\tassertEqual(t, RenderAuthors([]string{\"tim\"}), \"tim\")\n\tassertEqual(t, RenderAuthors([]string{\"tim\", \"jim\"}), \"tim and jim\")\n\tassertEqual(t, RenderAuthors([]string{\"tim\", \"jim\", \"kim\"}), \"tim, jim and kim\")\n\tassertEqual(t, RenderAuthors([]string{\"tim\", \"jim\", \"kim\", \"nim\"}), \"tim, jim, kim and nim\")\n\tassertEqual(t, RenderAuthors([]string{}, \"@\"), \"*?*\")\n\tassertEqual(t, RenderAuthors([]string{\"tim\"}, \"@\"), \"@tim\")\n\tassertEqual(t, RenderAuthors([]string{\"tim\", \"jim\"}, \"@\"), \"@tim and @jim\")\n\tassertEqual(t, RenderAuthors([]string{\"tim\", \"jim\", \"kim\"}, \"@\"), \"@tim, @jim and @kim\")\n\tassertEqual(t, RenderAuthors([]string{\"tim\", \"jim\", \"kim\", \"nim\"}, \"@\"), \"@tim, @jim, @kim and @nim\")\n}\n\nfunc assertEqual(t *testing.T, got, expected string) {\n\tt.Helper()\n\tif expected != got {\n\t\tt.Errorf(\"expected %s, got %s\", expected, got)\n\t}\n}\n"}]},"deposit":"100000ugnot"}],"fee":{"gas_wanted":"100000000","gas_fee":"100000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1sQrIl4krsBIKtCTfMqWzbkKQDSfmPtMYQA9EvsJqmu"},"signature":"yBekwIkpS2mmjuSZCFPP5wN8hVqIRfrGbNBRKqprAeFu95h+pJFMoTwdpokXs/0CE5+J6qQr2NTzRNwAeUyaLQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1fjh9y7ausp27dqsdq0qrcsnmgvwm6829v2au7d","package":{"name":"tictactoe1p","path":"gno.land/p/demo/tictactoe/tictactoe1p","files":[{"name":"1pvscpu.gno","body":"package tictactoe1p\n\n// a 1P-vs-CPU tictactoe\n// extending moul's tictactoe model\n\nimport (\n\t\"errors\"\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/tictactoe\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\n// 1P-VS-CPU is a tictactoe game\ntype Game struct {\n\t*tictactoe.Game\n\tcpu std.Address\n\tIntn func(n int) int\n\tpickMove func(g *tictactoe.Game, Intn func(int) int) (x, y int, e error) // AI function\n}\n\n// \"\" is a whole new game, whether CPU goes first is random.\n// \"---------\"` OTOH indicates a game where cpu /declined/ to go first.\n// fRand is a user-supplied func returning a random number in [0, n(\n// fPickMove is nil (uses averageDifficulty) or a func used for CPU to pick moves\nfunc GameFromRepr(\n\ttext string,\n\tcpu, human std.Address,\n\tfRand func(int) int,\n\tfPickMove func(*tictactoe.Game, func(int) int,\n\t) (x, y int, e error),\n) (*Game, error) {\n\taddr1, addr2 := decideOrder(cpu, human, text, fRand)\n\n\tvar g *tictactoe.Game\n\tvar e error\n\tswitch len(text) {\n\tcase 0:\n\t\tg, e = tictactoe.NewGame(addr1, addr2)\n\t\tg.Start()\n\tcase 9:\n\t\tr := []rune(text)\n\t\tg, e = tictactoe.RecoverGame(\n\t\t\taddr1,\n\t\t\taddr2,\n\t\t\tstring([]rune{\n\t\t\t\tr[6], r[7], r[8],\n\t\t\t\tr[3], r[4], r[5],\n\t\t\t\tr[0], r[1], r[2],\n\t\t\t}),\n\t\t)\n\tdefault:\n\t\treturn nil, errors.New(\"invalid board length\")\n\t}\n\tif fPickMove == nil {\n\t\tfPickMove = averageDifficulty\n\t}\n\treturn \u0026Game{g, cpu, fRand, fPickMove}, e\n}\n\nfunc (game Game) ToRepr() string {\n\treturn strings.ReplaceAll(game.Output(), \"\\n\", \"\")\n}\n\nfunc (game Game) IsCpuFirst() bool {\n\treturn game.PlayerByIndex(0) == game.cpu\n}\n\nfunc (game *Game) PlayCPU() (x, y int, e error) {\n\tswitch {\n\tcase game.Turn() != game.cpu:\n\t\treturn -1, -1, ufmt.Errorf(\n\t\t\t\"not my turn (%s), turn is %s's\",\n\t\t\tgame.cpu.String(), game.Turn().String(),\n\t\t)\n\tcase game.IsOver():\n\t\treturn -1, -1, errors.New(\"game is over\")\n\tdefault:\n\t\tx, y, _ = game.pickMove(game.Game, game.Intn)\n\t\te = game.Play(game.cpu, x, y)\n\t\treturn x, y, e\n\t}\n}\n\n// Decide who go first, based on the count of markers.\n// No error. A special and important case is the empty board,\n// meaning player to go first is random.\n// fRand is a user-supplied func returning a random number in [0, n(\nfunc decideOrder(cpu, human std.Address, board string, fRand func(int) int) (addr1, addr2 std.Address) {\n\tvar cpuFirst bool\n\tif board == \"\" {\n\t\tcpuFirst = fRand(2) == 0\n\t} else {\n\t\tnumO := strings.Count(board, \"O\") + strings.Count(board, \"o\")\n\t\tnumX := strings.Count(board, \"X\") + strings.Count(board, \"x\")\n\t\tcpuFirst = numX != numO\n\t}\n\tif cpuFirst {\n\t\treturn cpu, human\n\t} else {\n\t\treturn human, cpu\n\t}\n}\n"},{"name":"1pvscpu_test.gno","body":"package tictactoe1p\n\nimport (\n\t\"math/rand\"\n\t\"std\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/uassert\"\n)\n\nconst (\n\tcpuAddress = std.Address(\"CPU\")\n\thumanAddress = std.Address(\"HUMAN\")\n\tprng = rand.New(rand.NewPCG(uint64(3), uint64(7)))\n)\n\nfunc TestRand(t *testing.T) {\n\tn0 := prng.IntN(10)\n\tfor i := 0; i \u003c 128; i++ {\n\t\tif prng.IntN(10) != n0 {\n\t\t\treturn\n\t\t}\n\t}\n\tt.Errorf(\"no randomness\")\n}\n\nfunc TestGameFromRepr(t *testing.T) {\n\tfor _, o := range []struct{ repr, expect string }{\n\t\t{repr: \"\", expect: \"---------\"},\n\t\t{repr: \"-X--OX-O-\", expect: \"-X--OX-O-\"},\n\t\t{repr: \"_x__ox_o_\", expect: \"-X--OX-O-\"},\n\t\t{repr: \"O--------\", expect: \"O--------\"},\n\t\t{repr: \"O---X----\", expect: \"O---X----\"},\n\t\t{repr: \"-X--O--O-\", expect: \"-X--O--O-\"},\n\t\t{repr: \"OXOXOXOXO\", expect: \"OXOXOXOXO\"},\n\t\t{repr: \"X--------\", expect: \"error\"}, // O always begin\n\t\t{repr: \"OOOOOX---\", expect: \"error\"},\n\t} {\n\t\tgame, e := GameFromRepr(o.repr, cpuAddress, humanAddress, prng.IntN, nil)\n\t\tif o.expect == \"error\" {\n\t\t\tuassert.Error(t, e)\n\t\t} else {\n\t\t\tuassert.NoError(t, e)\n\t\t\tuassert.Equal(t, o.expect, game.ToRepr())\n\t\t}\n\t}\n}\n\nfunc TestPlayer1Alternates(t *testing.T) {\n\t// ensure CPU goes first or second, in different games\n\tvar isCpuFirst0 bool\n\tfor i := 0; i \u003c 128; i++ {\n\t\tg, e := GameFromRepr(\"\", cpuAddress, humanAddress, prng.IntN, nil)\n\t\tuassert.NoError(t, e)\n\t\tif i == 0 {\n\t\t\tisCpuFirst0 = g.IsCpuFirst()\n\t\t} else if isCpuFirst0 != g.IsCpuFirst() {\n\t\t\treturn // ok\n\t\t}\n\t}\n\tt.FailNow()\n}\n\nfunc TestPickMove(t *testing.T) {\n\t// study expected VS statistical result\n\t// CPU sees own winning move ~80% of times\n\t// is otherwise blind to other side\n\tfor _, o := range []struct {\n\t\tboard string\n\t\texpectedX int\n\t\texpectedY int\n\t}{\n\t\t{\"O-OX-X---\", 1, 2},\n\t\t{\"O-OX-XO--\", 1, 1},\n\t\t{\"X-O-XOO--\", 2, 0},\n\t\t{\"OX-XO----\", 2, 0},\n\t} {\n\t\t// play over and over, see most frequent moves\n\t\th := map[struct{ x, y int }]int{}\n\t\tfor i := 0; i \u003c 64; i++ {\n\t\t\tgame, e := GameFromRepr(o.board, cpuAddress, humanAddress, prng.IntN, nil)\n\t\t\tif !uassert.NoError(t, e, \"GameFromRepr\") {\n\t\t\t\tt.FailNow()\n\t\t\t}\n\t\t\tx, y, e := game.pickMove(game.Game, game.Intn)\n\t\t\th[struct{ x, y int }{x, y}] += 1\n\t\t}\n\t\t// assert most frequent move\n\t\tvar hiTemperature int\n\t\tvar hotMove struct{ x, y int }\n\t\tfor coord, v := range h {\n\t\t\tif v \u003e hiTemperature {\n\t\t\t\thiTemperature = v\n\t\t\t\thotMove = coord\n\t\t\t}\n\t\t}\n\t\tuassert.Equal(t, o.expectedX, hotMove.x, \"for x of repr\", o.board)\n\t\tuassert.Equal(t, o.expectedY, hotMove.y, \"for y of repr\", o.board)\n\t}\n}\n"},{"name":"README.md","body":"# 1PvsCPU tictactoe\n\nExtends [p/demo/tictactoe](https://gno.land/p/demo/tictactoe/).\nThose games specifically are one player vs a computer.\n\nTry it [here](https://gno.land/p/demo/games/tictactoe).\n"},{"name":"ai.gno","body":"package tictactoe1p\n\nimport (\n\t\"errors\"\n\n\t\"gno.land/p/demo/tictactoe\"\n)\n\n// the default move picker.\nfunc averageDifficulty(game *tictactoe.Game, Intn func(int) int) (x, y int, e error) {\n\t// candidates\n\ta := make([]struct{ x, y int }, 0)\n\tside := rune(1 + game.TurnNumber()%2)\n\tfor y := 0; y \u003c= 2; y++ {\n\t\tfor x := 0; x \u003c= 2; x++ {\n\t\t\tif game.At(x, y) != rune(0) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t// if can wins (and can see it), then win\n\t\t\tif game.WouldWin(side, x, y) \u0026\u0026 Intn(5) \u003e 0 {\n\t\t\t\treturn x, y, nil\n\t\t\t}\n\t\t\ta = append(a, struct{ x, y int }{x, y})\n\t\t}\n\t}\n\tif len(a) == 0 {\n\t\treturn -1, -1, errors.New(\"no free tile left\")\n\t} else {\n\t\t// random pick among candidates\n\t\tc := a[Intn(len(a))]\n\t\treturn c.x, c.y, nil\n\t}\n}\n"}]},"deposit":"100000ugnot"}],"fee":{"gas_wanted":"100000000","gas_fee":"100000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1sQrIl4krsBIKtCTfMqWzbkKQDSfmPtMYQA9EvsJqmu"},"signature":"fND4Zbhb/fT0MigBmTkkgg2CapY/6sZB/I8pmtybMo5gff8P+9e+wxX5zFJHVe9NEoope2dGf1T4IqRQUBbNIw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1fjh9y7ausp27dqsdq0qrcsnmgvwm6829v2au7d","package":{"name":"ternary","path":"gno.land/p/demo/ternary","files":[{"name":"README.md","body":"# Ternary package\n\nTernary operator have notoriously been absent from Go \nfrom its inception.\n\nThis package proposes ternary functions.\n\nWe don't advocate for their systematic use, but \nit can often prove useful when realms need to generate \nMarkdown, \n\n## Usage\n```go\nimport \"p/demo/ternary\"\n\nfunc Render(path string) string {\n // display appropriate greeting\n return \"# \" + ternary.String(isEarly, \"hi\", \"bye\")\n}\n```\n\nAnother example: \n\n`f := ternary.Float64(useGoldenRatio, 1.618, 1.66)`\n\n## List of functions\n\nMost native types got a function.\n\nNote: both branches yes/no get evaluated, contrarily to the C operator.\nPlease don't use this if your branches are expensive.\n\nFunctions:\n\n* func String(cond bool, yes, no string) string\n* func Int(cond bool, yes, no int) int\n* func Int8(cond bool, yes, no int8) int8 \n* func Int16(cond bool, yes, no int16) int16 \n* func Int32(cond bool, yes, no int32) int32 \n* func Int64(cond bool, yes, no int64) int64 \n* func Uint(cond bool, yes, no uint) uint \n* func Uint8(cond bool, yes, no uint8) uint8 \n* func Uint16(cond bool, yes, no uint16) uint16 \n* func Uint32(cond bool, yes, no uint32) uint32 \n* func Uint64(cond bool, yes, no uint64) uint64 \n* func Float32(cond bool, yes, no float32) float32 \n* func Float64(cond bool, yes, no float64) float64 \n* func Rune(cond bool, yes, no rune) rune \n* func Bool(cond bool, yes, no bool) rune \n* func Address(cond bool, std.Address, std.Address) std.Address\n\n"},{"name":"ternary.gno","body":"package ternary\n\nimport \"std\"\n\nfunc String(cond bool, yes, no string) string {\n\tif cond {\n\t\treturn yes\n\t}\n\treturn no\n}\n\nfunc Int(cond bool, yes, no int) int {\n\tif cond {\n\t\treturn yes\n\t}\n\treturn no\n}\n\nfunc Int8(cond bool, yes, no int8) int8 {\n\tif cond {\n\t\treturn yes\n\t}\n\treturn no\n}\n\nfunc Int16(cond bool, yes, no int16) int16 {\n\tif cond {\n\t\treturn yes\n\t}\n\treturn no\n}\n\nfunc Int32(cond bool, yes, no int32) int32 {\n\tif cond {\n\t\treturn yes\n\t}\n\treturn no\n}\n\nfunc Int64(cond bool, yes, no int64) int64 {\n\tif cond {\n\t\treturn yes\n\t}\n\treturn no\n}\n\nfunc Uint(cond bool, yes, no uint) uint {\n\tif cond {\n\t\treturn yes\n\t}\n\treturn no\n}\n\nfunc Uint8(cond bool, yes, no uint8) uint8 {\n\tif cond {\n\t\treturn yes\n\t}\n\treturn no\n}\n\nfunc Uint16(cond bool, yes, no uint16) uint16 {\n\tif cond {\n\t\treturn yes\n\t}\n\treturn no\n}\n\nfunc Uint32(cond bool, yes, no uint32) uint32 {\n\tif cond {\n\t\treturn yes\n\t}\n\treturn no\n}\n\nfunc Uint64(cond bool, yes, no uint64) uint64 {\n\tif cond {\n\t\treturn yes\n\t}\n\treturn no\n}\n\nfunc Float32(cond bool, yes, no float32) float32 {\n\tif cond {\n\t\treturn yes\n\t}\n\treturn no\n}\n\nfunc Float64(cond bool, yes, no float64) float64 {\n\tif cond {\n\t\treturn yes\n\t}\n\treturn no\n}\n\nfunc Rune(cond bool, yes, no rune) rune {\n\tif cond {\n\t\treturn yes\n\t}\n\treturn no\n}\n\nfunc Bool(cond bool, yes, no bool) bool {\n\tif cond {\n\t\treturn yes\n\t}\n\treturn no\n}\n\nfunc Address(cond bool, yes, no std.Address) std.Address {\n\tif cond {\n\t\treturn yes\n\t}\n\treturn no\n}\n"},{"name":"ternary_test.gno","body":"package ternary\n\nimport (\n\t\"std\"\n\t\"testing\"\n)\n\nfunc TestTernary(t *testing.T) {\n\tassert(t, String(true, \"a\", \"b\") == \"a\")\n\tassert(t, String(false, \"a\", \"b\") == \"b\")\n\tassert(t, Int(true, 0, 1) == 0)\n\tassert(t, Int(false, 0, 1) == 1)\n\tassert(t, Int8(true, 0, 1) == 0)\n\tassert(t, Int8(false, 0, 1) == 1)\n\tassert(t, Int16(true, 0, 1) == 0)\n\tassert(t, Int16(false, 0, 1) == 1)\n\tassert(t, Int32(true, 0, 1) == 0)\n\tassert(t, Int32(false, 0, 1) == 1)\n\tassert(t, Int64(true, 0, 1) == 0)\n\tassert(t, Int64(false, 0, 1) == 1)\n\tassert(t, Uint(true, 0, 1) == 0)\n\tassert(t, Uint(false, 0, 1) == 1)\n\tassert(t, Uint8(true, 0, 1) == 0)\n\tassert(t, Uint8(false, 0, 1) == 1)\n\tassert(t, Uint16(true, 0, 1) == 0)\n\tassert(t, Uint16(false, 0, 1) == 1)\n\tassert(t, Uint32(true, 0, 1) == 0)\n\tassert(t, Uint32(false, 0, 1) == 1)\n\tassert(t, Uint64(true, 0, 1) == 0)\n\tassert(t, Uint64(false, 0, 1) == 1)\n\tassert(t, Float32(true, 3.14, 1.618) == 3.14)\n\tassert(t, Float32(false, 3.14, 1.618) == 1.618)\n\tassert(t, Float64(true, 3.14, 1.618) == 3.14)\n\tassert(t, Float64(false, 3.14, 1.618) == 1.618)\n\tassert(t, Rune(true, '是', '否') == '是')\n\tassert(t, Rune(false, '是', '否') == '否')\n\tn := 17\n\tassert(t, !Bool(true, n%2 == 0, n \u003c 10))\n\tassert(t, Address(true, std.Address(\"g0\"), std.Address(\"g1\")).String() == \"g0\")\n\tassert(t, Address(false, std.Address(\"g0\"), std.Address(\"g1\")).String() == \"g1\")\n}\n\nfunc assert(t *testing.T, val bool) {\n\tt.Helper()\n\tif !val {\n\t\tt.Errorf(\"expected true, got false\")\n\t}\n}\n"}]},"deposit":"100000ugnot"}],"fee":{"gas_wanted":"100000000","gas_fee":"100000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1sQrIl4krsBIKtCTfMqWzbkKQDSfmPtMYQA9EvsJqmu"},"signature":"FllWNw3NzRg/v0d45wqWhyoJWd5UTx/XJ8gdKh9xb2Eq/5ym2xrt7d7MnG1zrk37yyrgoFMl6yR4YGRqZpMtTw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1fjh9y7ausp27dqsdq0qrcsnmgvwm6829v2au7d","package":{"name":"tictactoe","path":"gno.land/r/demo/games/tictactoe","files":[{"name":"README.md","body":"# Player VS CPU tic-tac-toe\n\n* Human VS CPU\n* aims to start experimenting with lowtech UI\n* stateless\n* no wallet required\n\nReusing moul's tic-tac-toe logic.\n\n```\n (\\ Thanks for the wing!\n ( \\ /(o)\\ Thanks for the wing! \n ( \\/ ()/ /) Raaarch! *Whistle*\n ( `;.))'\".) \n `(/////.-'\n =====))=))===() \n ///' \n // PjP/ejm\n ' \n```\n## Principle\n\n* `path` for Render is like `board=-X---O---\u0026move=a2`\n* no javascript,\n* only gnoweb markdown.\n\n## How the hell did Cap'n Cluck learn to play?\n\nI, Cap'n Cluck, had to learn from the most cunning and crafty of creatures – humans! I observed those barnacle-brained bilge-rats engaged in their most awesome game o' strategies, tic-tac-toe.\n\nThrough earhole-peepin', I picked up the patterns and strategies. I honed me beak on pieces o' eight, developin' a near-nautical sense o' spatial relationships! Aarrr, soon enough, I, Cap'n Cluck, became a veritable menace, matchin' wits with any landlubber brave enough to engage in a spot o' tic-tac-toe!\n\n"},{"name":"render.gno","body":"package tictactoe\n\n// Stateless human VS CPU Tic-tac-toe\n// Markdown + HTML1.0 + gnolang\n// no javascript, no wallet needed.\n\nimport (\n\t\"math/rand\"\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/ternary\"\n\t\"gno.land/p/demo/tictactoe/tictactoe1p\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nconst (\n\tcpuAddress = std.Address(\"gCPU\")\n\thumanAddress = std.Address(\"gHUMAN\")\n\turlParrot = \"https://raw.githubusercontent.com/grepsuzette/gfx/master/parrot.png\"\n\tstatusWon = \"Looks like you've won!\"\n\tstatusLost = \"Sorry mate, you lost!\"\n\tstatusDraw = \"It's a draw...\"\n)\n\nvar prng *rand.Rand\n\nfunc Intn(n int) int {\n\tif prng == nil {\n\t\t// Note: our PRNG is not stateful as calling Render is not going\n\t\t// to modify this stateless realm. We initialize it here when still nil\n\t\t// this creates the randomness we need (seeded from blockchain's height)\n\t\tprng = rand.New(rand.NewPCG(uint64(std.GetHeight()), uint64(9)))\n\t}\n\treturn prng.IntN(n)\n}\n\nfunc Render(path string) string {\n\tgame, x, y, debug := parsePath(path)\n\tif x != -1 \u0026\u0026 y != -1 {\n\t\tgame.Play(humanAddress, x, y)\n\t}\n\tcpuX, cpuY, e := game.PlayCPU()\n\toutput := parrotTalk(*game)\n\toutput += render(*game, cpuX, cpuY)\n\tif debug {\n\t\toutput += ufmt.Sprintf(\n\t\t\t\"--- played x=%d y=%d cpuX=%d cpuY=%d height=%d path=%s turn:%d error:%s\",\n\t\t\tx, y, cpuX, cpuY, std.GetHeight(), path, game.Game.TurnNumber(), e,\n\t\t)\n\t}\n\treturn output\n}\n\n// Lower-case render is simply called by Render.\n// Note the \u003cform\u003e (below) could be a \u003cdiv\u003e. If some day\n// realms can access GET and POST variables, then regular\n// \u003cbutton\u003e can be used. \u003cform\u003e is kept to remember that.\nfunc render(game tictactoe1p.Game, cpuX, cpuY int) string {\n\tstatus, class := statusAndClass(game)\n\trepr := game.ToRepr()\n\toutput := css()\n\toutput += `\u003cform id=\"board\" class=\"` + class + `\"\u003e` + \"\\n\"\n\t// output += \"\\t\" + `\u003cinput type=\"hidden\" name=\"state\" value=\"` + repr + `\"\u003e` + \"\\n\"\n\toutput += `\u003cdiv id=\"left\"\u003e\u003cimg src=\"` + urlParrot + `\" id=\"parrot\" width=\"120\" height=\"120\" align=\"left\" /\u003e\u003c/div\u003e` + \"\\n\"\n\toutput += `\u003cdiv id=\"right\"\u003e`\n\n\tfor y := 2; y \u003e= 0; y-- {\n\t\toutput += \"\\t\"\n\t\tfor x := 0; x \u003c= 2; x++ {\n\t\t\truneAtXY := game.At(x, y)\n\t\t\toccupied := runeAtXY != rune(0)\n\t\t\tif occupied {\n\t\t\t\thighlighted := x == cpuX \u0026\u0026 y == cpuY\n\t\t\t\toutput += button(x, y, ternary.String(runeAtXY == rune(1), \"O\", \"X\"), true, highlighted, repr)\n\t\t\t} else if game.IsOver() {\n\t\t\t\toutput += button(x, y, \"\u0026nbsp;\", true, false, repr)\n\t\t\t} else {\n\t\t\t\t// tile is free, but :hover must show\n\t\t\t\tcpu1st := game.Game.PlayerByIndex(0) == cpuAddress\n\t\t\t\toutput += button(x, y, ternary.String(cpu1st, \"X\", \"O\"), false, false, repr)\n\t\t\t}\n\t\t}\n\t\toutput += \"\u003cbr /\u003e\\n\"\n\t}\n\toutput += \"\u003c/div\u003e\\n\"\n\toutput += \"\u003c/form\u003e\\n\"\n\tif game.IsOver() {\n\t\toutput += ufmt.Sprintf(\n\t\t\t\"\\n%s [ %s | %s ]\\n\",\n\t\t\tstatus,\n\t\t\t\"[New game](/r/demo/games/tictactoe)\",\n\t\t\t\"[Back to demo/games](/r/demo/games)\",\n\t\t)\n\t} else {\n\t\toutput += \"\\n[Okay country roads, take me home](/r/demo/games)\"\n\t}\n\treturn output\n}\n\nfunc button(x, y int, char string, occupied, highlighted bool, repr string) string {\n\treturn ufmt.Sprintf(\n\t\t`\u003ca href=\"/r/demo/games/tictactoe:state=%s\u0026move=%c%d\" class=\"button tile %s %s\"\u003e%s\u003c/a\u003e`,\n\t\trepr,\n\t\trune('a'+x), y+1,\n\t\tternary.String(occupied, \"disabled\", \"\"),\n\t\tternary.String(highlighted, \"highlighted\", \"\"),\n\t\tchar,\n\t)\n}\n\n// return status and class(es).\n// it's empty when the game is not over.\nfunc statusAndClass(game tictactoe1p.Game) (status string, classes string) {\n\tif game.IsOver() {\n\t\tswitch {\n\t\tcase game.Winner() == humanAddress:\n\t\t\tclasses = \"over won\"\n\t\t\tstatus = statusWon\n\t\tcase game.Winner() == cpuAddress:\n\t\t\tclasses = \"over lost\"\n\t\t\tstatus = statusLost\n\t\tdefault:\n\t\t\tclasses = \"over draw\"\n\t\t\tstatus = statusDraw\n\t\t}\n\t}\n\treturn\n}\n\n// Decompose path, into valid game and played coordinates (or -1,-1)\n// The path is like \"state=O--X-----\u0026move=c3\"\n//\n// - state is empty or 9 characters,\n// imagine the following but without the \\n: \"-OX\\nO--\\n---\".\n// O always plays first.\n//\n// - move coordinate ranges from \"a1\" to \"c3\" but can be empty.\n//\n// - debug \u0026debug enables printing of a debug line.\nfunc parsePath(path string) (game *tictactoe1p.Game, x, y int, debug bool) {\n\th, e := BreakToMap(path)\n\tif e != nil {\n\t\tpanic(e)\n\t}\n\t// nil: default AI\n\tgame, e = tictactoe1p.GameFromRepr(h[\"state\"], cpuAddress, humanAddress, Intn, nil)\n\tif e != nil {\n\t\tpanic(e)\n\t}\n\t_, debug = h[\"debug\"]\n\tx, y = -1, -1\n\tfor i, xx := range h[\"move\"] {\n\t\tswitch i {\n\t\tcase 0:\n\t\t\tx = int(xx) - int('a')\n\t\tcase 1:\n\t\t\ty = int(xx) - int('1')\n\t\tdefault:\n\t\t\tpanic(\"invalid move: \" + h[\"move\"])\n\t\t}\n\t}\n\treturn game, x, y, debug\n}\n\nfunc parrotTalk(game tictactoe1p.Game) string {\n\tvar a []string\n\tswitch {\n\tcase !game.IsOver():\n\t\ta = []string{\n\t\t\t\"Let's play Tic-tac-toe!\",\n\t\t\t\"Cap'n Cluck, am here and ready to rule the high seas of tic-tac-toe!\",\n\t\t\t\"Aarrr, we'll see who'll be top parrot on this jolly board.\",\n\t\t\t\"The stakes are higher than the mast of a sunken galleon!\",\n\t\t}\n\tcase game.IsDraw():\n\t\ta = []string{\n\t\t\t\"Three cheers for Yers Truly, Cap'n! It's a draw.\",\n\t\t\t\"It's a draw, sailor...\",\n\t\t\t\"This match ends in neither victory nor defeat, but a draw!\",\n\t\t}\n\tcase game.Winner().String() == cpuAddress.String():\n\t\ta = []string{\n\t\t\t\"Alrighty, mateys! Who's the bravest birdy of the seven seas!\",\n\t\t\t\"Avast, ye scallywags, for I won this game\",\n\t\t\t\"Remember, me hearties, even in victory, Cap'n Cluck remains a humble scallywag.\",\n\t\t\t\"Aarrr, parrot power prevails again!\",\n\t\t\t\"Cap'n Cluck claims the prize!\",\n\t\t\t\"The high seas crown me king o' the game!\",\n\t\t}\n\tcase game.Winner().String() != cpuAddress.String():\n\t\ta = []string{\n\t\t\t\"Ye bested a bold parrot on this day!\",\n\t\t\t\"Cap'n Cluck, beaten by a buccaneer? Nay, 'tis unbirdable!\",\n\t\t\t\"Aarrr, this be the day I, Cap'n Cluck, ate me parroted pirate's words! But fear not, for I shall be back!\",\n\t\t\t\"Ye bested this parrot, but amongst feathery fiends, revenge is ripe!\",\n\t\t\t\"Despite this defeat, remember, I, Cap'n Cluck, am not a chicken when it comes to tic-tac-toe!\",\n\t\t}\n\t}\n\ts := a[Intn(len(a))]\n\treturn ufmt.Sprintf(\"\u003cdiv\u003e\u003cb\u003e%s\u003c/b\u003e\u003cbr /\u003e\"+strings.Repeat(\"\u0026nbsp;\", 17)+\"/\u003c/div\u003e\", s)\n}\n\nfunc css() string {\n\treturn `\n\u003cstyle type=\"text/css\"\u003e\n\t/* responsive stuffs */\n\t#board { \n\t\tdisplay: flex; \n\t\tflex-direction: row;\n\t}\n\t#board \u003e #left {\n\t\tflex-shrink: 1;\n\t}\n\t#board \u003e #right {\n\t\tflex-shrink: 0;\n\t\tflex-basis: auto;\n\t\twidth: 9.5em;\n\t}\n\t/* buttons, and parrot */\n\t#board a.tile.button { \n\t appearance: button;\n\t box-sizing: border-box;\n\t margin: 0;\n\t font-weight: bold;\n\t display: inline-block;\n\t background-color: #eee;\n\t border-color: rgb(227, 227, 227);\n\t border-style: outset;\n\t border-width: 1px;\n\t border-collapse: separate;\n\t text-decoration: none;\n\t text-align: center;\n\t line-height: 3em;\n\t}\n #board button, #board a.tile.button { \n width: 3em; height: 3em; \n margin-right: 2px; margin-bottom: 2px; \n cursor: pointer; \n color: initial;\n\t\tborder-radius: 5px;\n }\n\t#board.won button, #board.won a.tile.button { box-shadow: aquamarine 1px 1px 12px 6px; }\n\t#board.lost button, #board.lost a.tile.button { box-shadow: rgb(255, 200, 190) 0px 1px 34px 2px; }\n\t#board.draw button , #board.draw a.tile.button { box-shadow: rgb(200, 200, 200) 0px 1px 30px 8px; }\n\t#board button , #board a.tile.button { color: #888; }\n\t#board button:not([disabled]):hover, #board a.tile.button:not(.disabled):hover { \n border-style: ridge; \n box-shadow: inset -10px -10px 15px rgba(255, 255, 255, 0.5), \n inset 10px 10px 15px rgba(70, 70, 70, 0.12);\n\t\tborder-radius: 5px;\n }\n #board button[disabled], #board a.tile.button.disabled { cursor: default; }\n\t#board button:not([disabled]), #board a.tile.button:not(.disabled) { color: transparent; }\n\t#board button:not([disabled]):hover , #board a.tile.button:not(.disabled):hover { color: #888; text-transform: uppercase; }\n\t#board button.highlighted, #board a.tile.button.highlighted { color: chocolate; }\n img#parrot {\n -webkit-transform: scaleX(-1);\n transform: scaleX(-1);\n padding-left: 10px; \n\t\tmargin-right: 0.5em;\n }\n\u003c/style\u003e\n`\n}\n\n// Break down a string of url parameters to map[string]string.\n// E.g. \"foo=a\u0026bar=b\" -\u003e (map[string]string{foo:\"a\", bar:\"b\"}, nil)\nfunc BreakToMap(querystring string) (map[string]string, error) {\n\tm := make(map[string]string)\n\tfor _, s := range strings.Split(querystring, \"\u0026\") {\n\t\tif len(strings.TrimSpace(s)) == 0 {\n\t\t\tcontinue\n\t\t}\n\t\tidx := strings.Index(s, \"=\")\n\t\tif idx \u003e -1 {\n\t\t\tm[s[:idx]] = s[idx+1:]\n\t\t} else {\n\t\t\tm[s] = \"\"\n\t\t}\n\t}\n\treturn m, nil\n}\n"},{"name":"render_test.gno","body":"package tictactoe\n\nimport (\n\t\"testing\"\n\n\t\"gno.land/p/demo/uassert\"\n)\n\nfunc TestParsePath(t *testing.T) {\n\tfor _, v := range []struct {\n\t\tpath string\n\t\texpectedRepr string\n\t\texpectedX int\n\t\texpectedY int\n\t\texpectedDebug bool\n\t}{\n\t\t{\"\", \"---------\", -1, -1},\n\t\t{\"move=a1\", \"---------\", 0, 0},\n\t\t{\"move=a2\", \"---------\", 0, 1},\n\t\t{\"move=a3\", \"---------\", 0, 2},\n\t\t{\"move=b1\", \"---------\", 1, 0},\n\t\t{\"move=b2\", \"---------\", 1, 1},\n\t\t{\"move=b3\", \"---------\", 1, 2},\n\t\t{\"move=c1\", \"---------\", 2, 0},\n\t\t{\"move=c2\", \"---------\", 2, 1},\n\t\t{\"move=c3\", \"---------\", 2, 2},\n\t\t{\"move=c1\u0026debug\", \"---------\", 2, 0, true},\n\t\t{\"\u0026\", \"---------\", -1, -1},\n\t\t{\"state=-X--OX-O-\u0026move=b2\", \"-X--OX-O-\", 1, 1},\n\t\t{\"state=XOXX-O-O-\u0026move=c1\", \"XOXX-O-O-\", 2, 0},\n\t\t{\"debug\", \"---------\", -1, -1, true},\n\t} {\n\t\tg, x, y, debug := parsePath(v.path)\n\t\trepr := g.ToRepr()\n\t\tif repr != v.expectedRepr || x != v.expectedX || y != v.expectedY {\n\t\t\tt.Errorf(\n\t\t\t\t\"failed to parsePath for '%s', expected x=%d y=%d repr=%s, got x=%d x=%d repr=%s\",\n\t\t\t\tv.path,\n\t\t\t\tv.expectedX, v.expectedY, v.expectedRepr,\n\t\t\t\tx, y, repr,\n\t\t\t)\n\t\t}\n\t}\n}\n\nfunc TestBreakToMap(t *testing.T) {\n\tm, e := BreakToMap(\"a=b\u0026=\u0026\u0026\u0026c=d\u0026e\")\n\t{\n\t\ta, has := m[\"a\"]\n\t\tuassert.True(t, has)\n\t\tuassert.Equal(t, a, \"b\")\n\t}\n\t{\n\t\tc, has := m[\"c\"]\n\t\tuassert.True(t, has)\n\t\tuassert.Equal(t, c, \"d\")\n\t}\n\t{\n\t\te, has := m[\"e\"]\n\t\tuassert.True(t, has)\n\t\tuassert.Equal(t, e, \"\")\n\t}\n}\n"}]},"deposit":"100000ugnot"}],"fee":{"gas_wanted":"100000000","gas_fee":"100000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A1sQrIl4krsBIKtCTfMqWzbkKQDSfmPtMYQA9EvsJqmu"},"signature":"cFglyby35aVn+R5/+TYDKYotzwU8dPUsQX5IHC6b9YED93YiEk2iGVqAHgqirsuWEoTjCOagvYW8lbd8473cPw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1jltdynq9exwhv6ku2vx70a0l6msd7xcn7qhx5h","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"xtrW3E/q6PIpQpQ6kfeazg6wHSay7l9s4PN4kjS7d6ZZG3DjWf6Q5NhQSu6c8PA3qyR6+sWxu+CNbdgVymdYDg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jltdynq9exwhv6ku2vx70a0l6msd7xcn7qhx5h","to_address":"g13qpel38unrma0nyrj29tr903pq7dpeecsmlu8z","amount":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AlC2czZoFWGHXKoL6PZLl25pp6Z6j3rULA2EpbBlOFRl"},"signature":"CrR8I/XV13TZRPegyUXvEKUnQDJdmT+xU4E9S3yKsrwGzDOIvuQmJTQhpyGzBWEZWRtHNyuSXhmLoLMgGQ9ztw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10aw0vhtdx6rtqkqefy22us2qc3gtcqm7e7wlys","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qEkzmX0lzc2C7O5rzgVeLCE9t/zNX8Z7yQUWfcN6IaluX1XleMkQUKJCtAZqr54oRuXxSgUI57hZh6lq+zf9yA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"95Qg8f/Ni/+YvkMYRKkOxJwLwviYed9jw851edvWjxVxqPsUwIYKXpdx2p+JNzUVDdxItc5ff313LAGLxAnYqg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"poll","path":"gno.land/p/leon/demo/poll","files":[{"name":"package.gno","body":"package poll\n\nimport (\n\t\"errors\"\n\t\"std\"\n)\n\n// gno.land/p/demo/poll\n// avl tree\n\ntype Poll struct {\n\ttitle string\n\tdescription string\n\tdeadline int64 // block number\n\tvoters map[std.Address]int // address (user) \u003e yes/no // -1 = no, 1 = yes, 0 has not voted\n}\n\n// getters\n\nfunc (p Poll) Title() string {\n\treturn p.title\n}\n\nfunc (p Poll) Description() string {\n\treturn p.description\n}\n\nfunc (p Poll) Deadline() int64 {\n\treturn p.deadline\n}\n\nfunc (p Poll) Voters() map[std.Address]int {\n\treturn p.voters\n}\n\n// setters\n\nfunc (p *Poll) Vote(voter std.Address, vote int) error {\n\tif !voter.IsValid() {\n\t\treturn errors.New(\"voter address is not valid\")\n\t}\n\n\tif vote != -1 || vote != 1 {\n\t\treturn errors.New(\"invalid vote, needs to be -1 (no) or 1 (yes)\")\n\t}\n\n\tif voter, exists := p.voters[voter]; exists {\n\t\treturn errors.New(\"voter already voted\")\n\t}\n\n\tp.voters[voter] = vote\n}\n\n// constructor\n\nfunc NewPoll(title, description string, deadline int64) (*Poll, error) {\n\tif title == \"\" || description == \"\" {\n\t\treturn nil, errors.New(\"you need to provide both the title and the description to the poll\")\n\t}\n\n\tcurrentBlockNumber := std.GetHeight() // now\n\tif deadline \u003c currentBlockNumber {\n\t\treturn nil, errors.New(\"deadline needs to be in the future\")\n\t}\n\n\treturn \u0026Poll{\n\t\ttitle: title,\n\t\tdescription: description,\n\t\tdeadline: deadline,\n\t\tvoters: make(map[std.Address]int),\n\t}, nil\n}\n\nfunc (p Poll) VoteCount() (int, int) {\n\tvar yes int\n\n\tfor addr, vote := range p.voters {\n\t\tif vote == 1 {\n\t\t\tyes += 1\n\t\t}\n\t}\n\n\ttotalVotes := len(p.voters)\n\n\treturn yes, totalVotes - yes\n}\n"},{"name":"pkg_test.gno","body":"package poll\n\nimport \"testing\"\n\nfunc TestNewPoll(t *testing.T) {\n\ttitle := \"My Poll\"\n\tdesc := \"This is my first poll\"\n\tdeadline := 1000\n\n\tp := NewPoll(title, desc, deadline)\n\n\tif p.title != \"My Poll\" {\n\t\tt.Fatalf(\"expected %s, got %s\", title, p.title)\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"ZIeOsOJ7XWeGaHe9ydDgs8mp2hYHbRDcQAZf+rvJFwUeJTYRF29HoXvZgOu/5J5TxnVruobxDX8PSvHMPmThTA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"poll","path":"gno.land/p/leon/demo/poll","files":[{"name":"package.gno","body":"package poll\n\nimport (\n\t\"errors\"\n\t\"std\"\n)\n\n// gno.land/p/demo/poll\n// avl tree\n\ntype Poll struct {\n\ttitle string\n\tdescription string\n\tdeadline int64 // block number\n\tvoters map[std.Address]int // address (user) \u003e yes/no // -1 = no, 1 = yes, 0 has not voted\n}\n\n// getters\n\nfunc (p Poll) Title() string {\n\treturn p.title\n}\n\nfunc (p Poll) Description() string {\n\treturn p.description\n}\n\nfunc (p Poll) Deadline() int64 {\n\treturn p.deadline\n}\n\nfunc (p Poll) Voters() map[std.Address]int {\n\treturn p.voters\n}\n\n// setters\n\nfunc (p *Poll) Vote(voter std.Address, vote int) error {\n\tif !voter.IsValid() {\n\t\treturn errors.New(\"voter address is not valid\")\n\t}\n\n\tif vote != -1 || vote != 1 {\n\t\treturn errors.New(\"invalid vote, needs to be -1 (no) or 1 (yes)\")\n\t}\n\n\tif voter, exists := p.voters[voter]; exists {\n\t\treturn errors.New(\"voter already voted\")\n\t}\n\n\tp.voters[voter] = vote\n\n\treturn nil\n}\n\n// constructor\n\nfunc NewPoll(title, description string, deadline int64) (*Poll, error) {\n\tif title == \"\" || description == \"\" {\n\t\treturn nil, errors.New(\"you need to provide both the title and the description to the poll\")\n\t}\n\n\tcurrentBlockNumber := std.GetHeight() // now\n\tif deadline \u003c currentBlockNumber {\n\t\treturn nil, errors.New(\"deadline needs to be in the future\")\n\t}\n\n\treturn \u0026Poll{\n\t\ttitle: title,\n\t\tdescription: description,\n\t\tdeadline: deadline,\n\t\tvoters: make(map[std.Address]int),\n\t}, nil\n}\n\nfunc (p Poll) VoteCount() (int, int) {\n\tvar yes int\n\n\tfor addr, vote := range p.voters {\n\t\tif vote == 1 {\n\t\t\tyes += 1\n\t\t}\n\t}\n\n\ttotalVotes := len(p.voters)\n\n\treturn yes, totalVotes - yes\n}\n"},{"name":"pkg_test.gno","body":"package poll\n\nimport \"testing\"\n\nfunc TestNewPoll(t *testing.T) {\n\ttitle := \"My Poll\"\n\tdesc := \"This is my first poll\"\n\tdeadline := 1000\n\n\tp := NewPoll(title, desc, deadline)\n\n\tif p.title != \"My Poll\" {\n\t\tt.Fatalf(\"expected %s, got %s\", title, p.title)\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"Ir0eyarHGGbaYpCs6kierorj9xhNLRNglQesKN0Ee/cQfT3Rk1SFgnoe3flnUMTuZjUU+S4cnFxJWxe/ABQ8Ig=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"poll","path":"gno.land/p/leon/demo/poll","files":[{"name":"package.gno","body":"package poll\n\nimport (\n\t\"errors\"\n\t\"std\"\n)\n\n// gno.land/p/demo/poll\n// avl tree\n\ntype Poll struct {\n\ttitle string\n\tdescription string\n\tdeadline int64 // block number\n\tvoters map[std.Address]int // address (user) \u003e yes/no // -1 = no, 1 = yes, 0 has not voted\n}\n\n// getters\n\nfunc (p Poll) Title() string {\n\treturn p.title\n}\n\nfunc (p Poll) Description() string {\n\treturn p.description\n}\n\nfunc (p Poll) Deadline() int64 {\n\treturn p.deadline\n}\n\nfunc (p Poll) Voters() map[std.Address]int {\n\treturn p.voters\n}\n\n// setters\n\nfunc (p *Poll) Vote(voter std.Address, vote int) error {\n\tif !voter.IsValid() {\n\t\treturn errors.New(\"voter address is not valid\")\n\t}\n\n\tif vote != -1 || vote != 1 {\n\t\treturn errors.New(\"invalid vote, needs to be -1 (no) or 1 (yes)\")\n\t}\n\n\tif _, exists := p.voters[voter]; exists {\n\t\treturn errors.New(\"voter already voted\")\n\t}\n\n\tp.voters[voter] = vote\n\n\treturn nil\n}\n\n// constructor\n\nfunc NewPoll(title, description string, deadline int64) (*Poll, error) {\n\tif title == \"\" || description == \"\" {\n\t\treturn nil, errors.New(\"you need to provide both the title and the description to the poll\")\n\t}\n\n\tcurrentBlockNumber := std.GetHeight() // now\n\tif deadline \u003c currentBlockNumber {\n\t\treturn nil, errors.New(\"deadline needs to be in the future\")\n\t}\n\n\treturn \u0026Poll{\n\t\ttitle: title,\n\t\tdescription: description,\n\t\tdeadline: deadline,\n\t\tvoters: make(map[std.Address]int),\n\t}, nil\n}\n\nfunc (p Poll) VoteCount() (int, int) {\n\tvar yes int\n\n\tfor addr, vote := range p.voters {\n\t\tif vote == 1 {\n\t\t\tyes += 1\n\t\t}\n\t}\n\n\ttotalVotes := len(p.voters)\n\n\treturn yes, totalVotes - yes\n}\n"},{"name":"pkg_test.gno","body":"package poll\n\nimport \"testing\"\n\nfunc TestNewPoll(t *testing.T) {\n\ttitle := \"My Poll\"\n\tdesc := \"This is my first poll\"\n\tdeadline := 1000\n\n\tp := NewPoll(title, desc, deadline)\n\n\tif p.title != \"My Poll\" {\n\t\tt.Fatalf(\"expected %s, got %s\", title, p.title)\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"43VUdnOBme2xGeAw4sVjA86a7VyQ6VCbb14EGeGabGQh1Rsj1pDHklBzTVLn1RzUFn6fAVe+ESrk9HoLocEsGg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"poll","path":"gno.land/p/leon/demo/poll","files":[{"name":"package.gno","body":"package poll\n\nimport (\n\t\"errors\"\n\t\"std\"\n)\n\n// gno.land/p/demo/poll\n// avl tree\n\ntype Poll struct {\n\ttitle string\n\tdescription string\n\tdeadline int64 // block number\n\tvoters map[std.Address]int // address (user) \u003e yes/no // -1 = no, 1 = yes, 0 has not voted\n}\n\n// getters\n\nfunc (p Poll) Title() string {\n\treturn p.title\n}\n\nfunc (p Poll) Description() string {\n\treturn p.description\n}\n\nfunc (p Poll) Deadline() int64 {\n\treturn p.deadline\n}\n\nfunc (p Poll) Voters() map[std.Address]int {\n\treturn p.voters\n}\n\n// setters\n\nfunc (p *Poll) Vote(voter std.Address, vote int) error {\n\tif !voter.IsValid() {\n\t\treturn errors.New(\"voter address is not valid\")\n\t}\n\n\tif vote != -1 || vote != 1 {\n\t\treturn errors.New(\"invalid vote, needs to be -1 (no) or 1 (yes)\")\n\t}\n\n\tif _, exists := p.voters[voter]; exists {\n\t\treturn errors.New(\"voter already voted\")\n\t}\n\n\tp.voters[voter] = vote\n\n\treturn nil\n}\n\n// constructor\n\nfunc NewPoll(title, description string, deadline int64) (*Poll, error) {\n\tif title == \"\" || description == \"\" {\n\t\treturn nil, errors.New(\"you need to provide both the title and the description to the poll\")\n\t}\n\n\tcurrentBlockNumber := std.GetHeight() // now\n\tif deadline \u003c currentBlockNumber {\n\t\treturn nil, errors.New(\"deadline needs to be in the future\")\n\t}\n\n\treturn \u0026Poll{\n\t\ttitle: title,\n\t\tdescription: description,\n\t\tdeadline: deadline,\n\t\tvoters: make(map[std.Address]int),\n\t}, nil\n}\n\nfunc (p Poll) VoteCount() (int, int) {\n\tvar yes int\n\n\tfor _, vote := range p.voters {\n\t\tif vote == 1 {\n\t\t\tyes += 1\n\t\t}\n\t}\n\n\ttotalVotes := len(p.voters)\n\n\treturn yes, totalVotes - yes\n}\n"},{"name":"pkg_test.gno","body":"package poll\n\nimport \"testing\"\n\nfunc TestNewPoll(t *testing.T) {\n\ttitle := \"My Poll\"\n\tdesc := \"This is my first poll\"\n\tdeadline := 1000\n\n\tp := NewPoll(title, desc, deadline)\n\n\tif p.title != \"My Poll\" {\n\t\tt.Fatalf(\"expected %s, got %s\", title, p.title)\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"q9aigr6hDjlAGCRONomXkrnBLs25b/bHYITVbAc5BXNhAsbROHFf3PHRB+mlnJMNJstGoERQit/6dcURj+IeZQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"poll","path":"gno.land/r/leon/demo/poll","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"U6URZ3UzhWiDZohkQZ7f27eay8q81iYsuCu+uOmHJcEh+FzEbvwBlGZeyRjbA6kUzWjSvz34id81VxweGv+c7g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"poll","path":"gno.land/r/leon/demo/poll","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"pNuGnpm0pAPfY8s5YEL7hDpPG+aYDZ96iR6aIy2bv8c6EeaBFdgmHomYDaq1SrQZCH46WEiow1bEkYsAgcN5SA=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"poll","path":"gno.land/r/leon/demo/poll","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"n6rn8mIM2/CB6t/bgjy9Rthf+IPgXpiEOaOEszF47LNqSpzpJ6el4mbdHf5Q2sU8VSsanUHRDRT9Hau7BC+NNg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"poll","path":"gno.land/r/leon/demo/poll","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"4TisjvtdLUlFpfacKbSI5x3l3yM89pLkkpnOpNGL9+NZVPYJgJGj+mrcUuyLBLDW5DLUGfjY0r4EAb82qeyzuQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"poll","path":"gno.land/r/leon/demo/poll","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n\treturn \"Hello World!\"\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"6qILVsrB8lSXDs513J08Oi/EYLqk24xzkCr02kueogog8rywfoEXReHr4KQ6dLPnAyB/FkFtpskxIHBsgYmBTg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"poll","path":"gno.land/r/leon/demo/poll","files":[{"name":"poll.gno","body":"package poll\n\nimport (\n\t\"errors\"\n\t\"std\"\n\n\t\"gno.land/p/demo/ufmt\"\n\tppkg \"gno.land/p/leon/demo/poll\"\n)\n\n// gno.land/r/leon/demo/poll\n\ntype PollWithID struct {\n\tpoll *ppkg.Poll\n\tid uint\n}\n\nvar (\n\tpolls []*PollWithID\n\tpollIdCunter uint\n)\n\nfunc NewPoll(title, description string, deadline int) string {\n\tpollInstanace, err := ppkg.NewPoll(title, description, int64(deadline))\n\tif err != nil {\n\t\treturn err.Error()\n\t}\n\n\tp := \u0026PollWithID{\n\t\tpoll: pollInstanace,\n\t\tid: pollIdCunter,\n\t}\n\n\tpolls = append(polls, p)\n\tpollIdCunter++\n\n\treturn \"successfully created poll: \" + p.poll.Title()\n}\n\nfunc Vote(id uint, vote int) error {\n\tcaller := std.PrevRealm().Addr()\n\tvar pid *PollWithID\n\n\tfor _, p := range polls {\n\t\tif p.id == id {\n\t\t\tpid = p\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif pid == nil {\n\t\treturn errors.New(\"poll with specified id not found\")\n\t}\n\n\tif err := pid.poll.Vote(caller, vote); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (p PollWithID) String() string {\n\treturn ufmt.Sprintf(\"%s\\n\\n%s\\n\\n\")\n}\n\nfunc Render(_ string) string {\n\tout := \"# Polls App\\n\\n\"\n\n\tfor _, poll := range polls {\n\t\tout += poll.String()\n\t}\n\n\treturn out\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"200000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"6BEhrVJ5daynskpwi0WboWh4CniQhHoGRcAUFRVs/JQ9KWVr0krgIkXbh0U9CLc5ENO9oOdHqMpbp0VDVll5ig=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"poll","path":"gno.land/r/leon/demo/poll","files":[{"name":"poll.gno","body":"package poll\n\nimport (\n\t\"errors\"\n\t\"std\"\n\n\t\"gno.land/p/demo/ufmt\"\n\tppkg \"gno.land/p/leon/demo/poll\"\n)\n\n// gno.land/r/leon/demo/poll\n\ntype PollWithID struct {\n\tpoll *ppkg.Poll\n\tid uint\n}\n\nvar (\n\tpolls []*PollWithID\n\tpollIdCunter uint\n)\n\nfunc NewPoll(title, description string, deadline int) string {\n\tpollInstanace, err := ppkg.NewPoll(title, description, int64(deadline))\n\tif err != nil {\n\t\treturn err.Error()\n\t}\n\n\tp := \u0026PollWithID{\n\t\tpoll: pollInstanace,\n\t\tid: pollIdCunter,\n\t}\n\n\tpolls = append(polls, p)\n\tpollIdCunter++\n\n\treturn \"successfully created poll: \" + p.poll.Title()\n}\n\nfunc Vote(id uint, vote int) error {\n\tcaller := std.PrevRealm().Addr()\n\tvar pid *PollWithID\n\n\tfor _, p := range polls {\n\t\tif p.id == id {\n\t\t\tpid = p\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif pid == nil {\n\t\treturn errors.New(\"poll with specified id not found\")\n\t}\n\n\tif err := pid.poll.Vote(caller, vote); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (p PollWithID) String() string {\n\treturn ufmt.Sprintf(\"%s\\n\\n%s\\n\\n\")\n}\n\nfunc Render(_ string) string {\n\tout := \"# Polls App\\n\\n\"\n\n\tfor _, poll := range polls {\n\t\tout += poll.String()\n\t}\n\n\treturn out\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"2000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"6BN9Cd7xHX0ihsUMcDHV8bhJnUNzNAp10+f2XrMJkJMEobWSEdx+ziNmCa+yUXiioivpJcbDhWzg9wN5uh4pTw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"poll","path":"gno.land/r/leon/demo/poll","files":[{"name":"poll.gno","body":"package poll\n\nimport (\n\t\"errors\"\n\t\"std\"\n\n\t\"gno.land/p/demo/ufmt\"\n\tppkg \"gno.land/p/leon/demo/poll\"\n)\n\n// gno.land/r/leon/demo/poll\n\ntype PollWithID struct {\n\tpoll *ppkg.Poll\n\tid uint\n}\n\nvar (\n\tpolls []*PollWithID\n\tpollIdCunter uint\n)\n\nfunc NewPoll(title, description string, deadline int) string {\n\tpollInstanace, err := ppkg.NewPoll(title, description, int64(deadline))\n\tif err != nil {\n\t\treturn err.Error()\n\t}\n\n\tp := \u0026PollWithID{\n\t\tpoll: pollInstanace,\n\t\tid: pollIdCunter,\n\t}\n\n\tpolls = append(polls, p)\n\tpollIdCunter++\n\n\treturn \"successfully created poll: \" + p.poll.Title()\n}\n\nfunc Vote(id uint, vote int) error {\n\tcaller := std.PrevRealm().Addr()\n\tvar pid *PollWithID\n\n\tfor _, p := range polls {\n\t\tif p.id == id {\n\t\t\tpid = p\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif pid == nil {\n\t\treturn errors.New(\"poll with specified id not found\")\n\t}\n\n\tif err := pid.poll.Vote(caller, vote); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (p PollWithID) String() string {\n\treturn ufmt.Sprintf(\"%s\\n\\n%s\\n\\n\")\n}\n\nfunc Render(_ string) string {\n\tout := \"# Polls App\\n\\n\"\n\n\tfor _, poll := range polls {\n\t\tout += poll.String()\n\t}\n\n\treturn out\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"2000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"VKXch4bZHvd6SS1BpIGuK9hrokDpxc4eQ6YDxd9yD5A51fMd7W8jkzYRaBhYn1Ikag30tdev7dE7i6SLlbt1fw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"poll","path":"gno.land/r/leon/demo/poll","files":[{"name":"poll.gno","body":"package poll\n\nimport (\n\t\"errors\"\n\t\"std\"\n\n\t\"gno.land/p/demo/ufmt\"\n\tppkg \"gno.land/p/leon/demo/poll\"\n)\n\n// gno.land/r/leon/demo/poll\n\ntype PollWithID struct {\n\tpoll *ppkg.Poll\n\tid uint\n}\n\nvar (\n\tpolls []*PollWithID\n\tpollIdCunter uint\n)\n\nfunc NewPoll(title, description string, deadline int) string {\n\tpollInstanace, err := ppkg.NewPoll(title, description, int64(deadline))\n\tif err != nil {\n\t\treturn err.Error()\n\t}\n\n\tp := \u0026PollWithID{\n\t\tpoll: pollInstanace,\n\t\tid: pollIdCunter,\n\t}\n\n\tpolls = append(polls, p)\n\tpollIdCunter++\n\n\treturn \"successfully created poll: \" + p.poll.Title()\n}\n\nfunc Vote(id uint, vote int) error {\n\tcaller := std.PrevRealm().Addr()\n\tvar pid *PollWithID\n\n\tfor _, p := range polls {\n\t\tif p.id == id {\n\t\t\tpid = p\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif pid == nil {\n\t\treturn errors.New(\"poll with specified id not found\")\n\t}\n\n\tif err := pid.poll.Vote(caller, vote); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (p PollWithID) String() string {\n\treturn ufmt.Sprintf(\"%s\\n\\n%s\\n\\n\")\n}\n\nfunc Render(_ string) string {\n\tout := \"# Polls App\\n\\n\"\n\n\tfor _, poll := range polls {\n\t\tout += poll.String()\n\t}\n\n\treturn out\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"20000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"QMpsG7RWx47RQxchIisckDTdflP5/w+ALq+n/UXM/vxQsVhSDJLENJcDyvSphMFhPiWcvm9Q9+Us/cczc9+roA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/demo/poll","func":"NewPoll","args":["My poll","my first poll descirpion","10000000"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"kesIx543n6te0FzthRtuuLib6p0JCwTZ4FsTUtd9UYspwuffifkGIo4hGkl9T+DgDPUTMBb6wiojG1P4c1f/+w=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/demo/poll","func":"NewPoll","args":["New poll 2","description","100000"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"3ZLDlebmP1hx9WqMP929PzBE4NYkbx1UmTkhFEfGRUQV2up8rR1+XMEILM3ZE7ACAOon79I5EX21L5wDhn0IVw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"poll","path":"gno.land/r/leon/demo/poll/v1","files":[{"name":"poll.gno","body":"package poll\n\nimport (\n\t\"errors\"\n\t\"std\"\n\n\t\"gno.land/p/demo/ufmt\"\n\tppkg \"gno.land/p/leon/demo/poll\"\n)\n\n// gno.land/r/leon/demo/poll\n\ntype PollWithID struct {\n\tpoll *ppkg.Poll\n\tid uint\n}\n\nvar (\n\tpolls = make([]*PollWithID, 0)\n\tpollIdCunter uint\n)\n\nfunc NewPoll(title, description string, deadline int) string {\n\tpollInstanace, err := ppkg.NewPoll(title, description, int64(deadline))\n\tif err != nil {\n\t\treturn err.Error()\n\t}\n\n\tp := \u0026PollWithID{\n\t\tpoll: pollInstanace,\n\t\tid: pollIdCunter,\n\t}\n\n\tpolls = append(polls, p)\n\tpollIdCunter++\n\n\treturn \"successfully created poll: \" + p.poll.Title()\n}\n\nfunc Vote(id uint, vote int) error {\n\tcaller := std.PrevRealm().Addr()\n\tvar pid *PollWithID\n\n\tfor _, p := range polls {\n\t\tif p.id == id {\n\t\t\tpid = p\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif pid == nil {\n\t\treturn errors.New(\"poll with specified id not found\")\n\t}\n\n\tif err := pid.poll.Vote(caller, vote); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (p PollWithID) String() string {\n\treturn ufmt.Sprintf(\"%s\\n\\n%s\\n\\n\")\n}\n\nfunc Render(_ string) string {\n\tout := \"# Polls App\\n\\n\"\n\n\tfor _, poll := range polls {\n\t\tout += poll.String()\n\t}\n\n\treturn out\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"20000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"gEOTnwtj7UWlBZTYo3hKBaqfj+JjaGRTI0P4m6y8Hw5tooFk41D3xCvMcA3Iv3a6WYc1KR2OzV79N1ZndcDh2g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/demo/poll/v1","func":"NewPoll","args":["My Poll","description","100000"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"EtWBYCY1rsZjgEiz7hOC2ms/zy5EKeo8jlEiV9A9HlhR4AR+OJsFRSWGBQOaChjvX/Dx+nFgN7utXZ8pHxLeVQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"poll","path":"gno.land/r/leon/demo/poll/v2","files":[{"name":"poll.gno","body":"package poll\n\nimport (\n\t\"errors\"\n\t\"std\"\n\n\t\"gno.land/p/demo/ufmt\"\n\tppkg \"gno.land/p/leon/demo/poll\"\n)\n\n// gno.land/r/leon/demo/poll\n\ntype PollWithID struct {\n\tpoll *ppkg.Poll\n\tid uint\n}\n\nvar (\n\tpolls = make([]*PollWithID, 0)\n\tpollIdCunter uint\n)\n\nfunc NewPoll(title, description string, deadline int) string {\n\tpollInstanace, err := ppkg.NewPoll(title, description, int64(deadline))\n\tif err != nil {\n\t\treturn err.Error()\n\t}\n\n\tp := \u0026PollWithID{\n\t\tpoll: pollInstanace,\n\t\tid: pollIdCunter,\n\t}\n\n\tpolls = append(polls, p)\n\tpollIdCunter++\n\n\treturn \"successfully created poll: \" + p.poll.Title()\n}\n\nfunc Vote(id uint, vote int) error {\n\tcaller := std.PrevRealm().Addr()\n\tvar pid *PollWithID\n\n\tfor _, p := range polls {\n\t\tif p.id == id {\n\t\t\tpid = p\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif pid == nil {\n\t\treturn errors.New(\"poll with specified id not found\")\n\t}\n\n\tif err := pid.poll.Vote(caller, vote); err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (p PollWithID) String() string {\n\treturn ufmt.Sprintf(\"%s\\n\\n%s\\n\\n%d\\n\\n\", p.poll.Title(), p.poll.Description(), int(p.poll.Deadline()))\n}\n\nfunc Render(_ string) string {\n\tout := \"# Polls App\\n\\n\"\n\n\tfor _, poll := range polls {\n\t\tout += poll.String()\n\t}\n\n\treturn out\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"20000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"4EGVSdn9tqAHoLqWhHj6Lbrp0qZ/utkiwooyqEHDSwEIqqSpbIe4n/tYBNS/XYW37Ta9vb23KyLb4SLZVm95DQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/demo/poll/v2","func":"NewPoll","args":["My Poll","Description","100000"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"qmTSos9+uFstXB0s0vwThwr7HCYajKkNAiV0teoj6RwNHHZ5qJ8UHXF/yhoLVPaF7CRW9WtAyMPCz04tCwNuMA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/demo/poll/v2","func":"Vote","args":["0","1"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"Wpc0OtK/+QIVJMJsFzYxMRdxlF/v1UPFdh/DES9Vk8J2DKDr7N6ANvpaMZd6xAfF732e+oK7bv8wPOkqf8lt5g=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/leon/demo/poll/v2","func":"Vote","args":["0","-1"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"AHXuVXViQZ1x/bL2C7lBOmgIoPx8SGu3b8arVeVmn0BwukIyPnDRMS9nDUmz+d46f1cI66t7+bvd78jHR3u0eA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1sw5xklxjjuv0yvuxy5f5s3l3mnj0nqq626a9wr","package":{"name":"home","path":"gno.land/r/albttx/home","files":[{"name":"home.gno","body":"package home\n\nimport (\n\t\"std\"\n\n\tfmt \"gno.land/p/demo/ufmt\"\n)\n\nvar (\n\twallet std.Address\n\tmnemonic string\n\n\tPFP string\n\tLinks []Link\n\n\t// map[title]BookInfo\n\tBookshelf = make(map[string]BookInfo)\n\n\tBookStatusIsToRead BookStatus = 1\n\tBookStatusIsReading BookStatus = 2\n\tBookStatusIsRead BookStatus = 3\n)\n\nfunc init() {\n\twallet = \"g1sw5xklxjjuv0yvuxy5f5s3l3mnj0nqq626a9wr\"\n\t// mnemonic = \"never gonna give you up never gonna let you down never gonna run around and desert you never gonna make you cry never gonna say goodbye never gonna tell a lie and hurt you\"\n\n\tPFP = \"https://avatars.githubusercontent.com/u/8089712?v=4\"\n\n\t// Badge are from\n\t// https://github.com/Ileriayo/markdown-badges\n\tLinks = append(Links,\n\t\tLink{\n\t\t\tName: \"github_albttx\",\n\t\t\tLogo: \"https://img.shields.io/badge/github-%23121011.svg?style=for-the-badge\u0026logo=github\u0026logoColor=white\",\n\t\t\tURL: \"https://github.com/albttx\",\n\t\t},\n\t\tLink{\n\t\t\tName: \"x_albttx\",\n\t\t\tLogo: \"https://img.shields.io/badge/albttx-%23000000.svg?style=for-the-badge\u0026logo=X\u0026logoColor=white\",\n\t\t\tURL: \"https://x.com/albttx\",\n\t\t},\n\t\tLink{\n\t\t\tName: \"x_nysa\",\n\t\t\tLogo: \"https://img.shields.io/badge/nysa--network-%23000000.svg?style=for-the-badge\u0026logo=X\u0026logoColor=white\",\n\t\t\tURL: \"https://x.com/nysa_network\",\n\t\t},\n\t\tLink{\n\t\t\tName: \"stackoverflow\",\n\t\t\tLogo: \"https://img.shields.io/badge/StackExchange-%23ffffff.svg?style=for-the-badge\u0026logo=StackExchange\",\n\t\t\tURL: \"https://stackoverflow.com/users/4511585/albttx\",\n\t\t},\n\t\tLink{\n\t\t\tName: \"linkedin\",\n\t\t\tLogo: \"https://img.shields.io/badge/linkedin-%230077B5.svg?style=for-the-badge\u0026logo=linkedin\u0026logoColor=white\",\n\t\t\tURL: \"https://linkedin.com/in/albertlebatteux\",\n\t\t},\n\t\tLink{\n\t\t\tName: \"albttx.eth\",\n\t\t\tLogo: \"https://img.shields.io/badge/Ethereum-3C3C3D?style=for-the-badge\u0026logo=Ethereum\u0026logoColor=white\",\n\t\t\tURL: \"albttx.eth\",\n\t\t},\n\t\tLink{\n\t\t\tName: \"medium\",\n\t\t\tLogo: \"https://img.shields.io/badge/Medium-12100E?style=for-the-badge\u0026logo=medium\u0026logoColor=white\",\n\t\t\tURL: \"https://medium.com/@albttx\",\n\t\t},\n\t\tLink{\n\t\t\tName: \"KeybasePGP\",\n\t\t\tLogo: \"https://img.shields.io/keybase/pgp/alebatt\",\n\t\t\tURL: \"https://keybase.io/alebatt\",\n\t\t},\n\t)\n}\n\ntype Link struct {\n\tName string\n\tLogo string\n\tURL string\n}\n\ntype BookStatus int\n\ntype BookInfo struct {\n\tURL string\n\tStatus BookStatus\n}\n\nfunc Render(path string) string {\n\tcontent := `\n# Albert's profile\n\n\u003cdiv class='columns-2'\u003e\n\u003cdiv class='col-1'\u003e\n\n\u003cimg alt=\"albttx.gno\" src=\"` + PFP + `\"\u003e\n\n\u003c/div\u003e\n\n\u003cdiv class='col-2'\u003e\n\n## About me\n\nHi, I'm Albert, but you can find me on almost every platform as 'albttx'.\n\n[42 Alumni](https://42.fr)\n\nI'm french, living in Portugal working remotely a Lead Infrastructure at All in Bits, and a Gnome enthusiast helping whenever i can on [gno.land](https://gno.land)\n\nOn my free time, i love spending time with my family and friends, i enjoy climbing, playing chess and boxing.\n\n\u003c/div\u003e\n\u003c/div\u003e\n`\n\n\t// My Links\n\tcontent += \"\\n## My links\\n\\n\"\n\n\tcontent += \"\u003cp align='center'\u003e\\n\"\n\tfor _, link := range Links {\n\t\tif link.Logo == \"\" \u0026\u0026 link.URL == \"\" {\n\t\t\tcontinue\n\t\t}\n\t\tcontent += fmt.Sprintf(\"\u003ca href='%s'\u003e\u003cimg src='%s' /\u003e\u003c/a\u003e \u0026nbsp;\\n\", link.URL, link.Logo)\n\t}\n\tcontent += \"\u003c/p\u003e\\n\\n\"\n\n\t// Bookshelf\n\tcontent += \"## Bookshelf\\n\"\n\tcontent += \"\u003cdiv class='columns-3' style='margin: 0;'\u003e\\n\"\n\n\tcontentToRead := \"\u003cdiv\u003e\\n\\n#### TO READ\\n\\n\"\n\tcontentReading := \"\u003cdiv\u003e\\n\\n#### READING\\n\\n\"\n\tcontentRead := \"\u003cdiv\u003e\\n\\n#### READ\\n\\n\"\n\n\tfor title, book := range Bookshelf {\n\t\tif book.Status == 0 {\n\t\t\tcontinue\n\t\t}\n\n\t\tswitch book.Status {\n\t\tcase BookStatusIsToRead:\n\t\t\tcontentToRead += fmt.Sprintf(\"- [%s](%s)\\n\", title, book.URL)\n\t\tcase BookStatusIsReading:\n\t\t\tcontentReading += fmt.Sprintf(\"- [%s](%s)\\n\", title, book.URL)\n\t\tcase BookStatusIsRead:\n\t\t\tcontentRead += fmt.Sprintf(\"- [%s](%s)\\n\", title, book.URL)\n\t\t}\n\t}\n\n\tcontent += contentToRead + \"\u003c/div\u003e\\n\"\n\tcontent += contentReading + \"\u003c/div\u003e\\n\"\n\tcontent += contentRead + \"\u003c/div\u003e\\n\"\n\n\tcontent += \"\u003c/div\u003e\"\n\treturn content\n}\n\n// SetBook can add,update,delete a book\nfunc SetBook(title, url string, status int) {\n\tif caller := std.PrevRealm().Addr(); caller != wallet {\n\t\tpanic(\"unauthorized\")\n\t}\n\n\tBookshelf[title] = BookInfo{\n\t\tURL: url,\n\t\tStatus: BookStatus(status),\n\t}\n}\n\n// AddOrUpdateLink\nfunc AddOrUpdateLink(name, logo, url string) {\n\tif caller := std.PrevRealm().Addr(); caller != wallet {\n\t\tpanic(\"unauthorized\")\n\t}\n\n\tfor i, link := range Links {\n\t\tif name == link.Name {\n\t\t\tLinks[i].Logo = logo\n\t\t\tLinks[i].URL = url\n\t\t\treturn\n\t\t}\n\t}\n\n\tLinks = append(Links, Link{\n\t\tName: name,\n\t\tLogo: logo,\n\t\tURL: url,\n\t})\n}\n\n// UpdatePFP\nfunc UpdatePFP(pfp string) {\n\tif caller := std.PrevRealm().Addr(); caller != wallet {\n\t\tpanic(\"unauthorized\")\n\t}\n\n\tPFP = pfp\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"4000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AuWZgpYDYwjXGDGZ4nZJ6FxqeWB37G3ZTRL8/lKyxWjB"},"signature":"dSW0AiDHyzX/NtSfwwk9BUsSU9snUNZsZRd1XDAZ0Jp53H7d2acJgvxC7+ZlVPe2ZU+2YcNGJxDS0FvxNhSd5Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1sw5xklxjjuv0yvuxy5f5s3l3mnj0nqq626a9wr","send":"","pkg_path":"gno.land/r/albttx/home","func":"SetBook","args":["Principle","https://www.amazon.com/Principles-Life-Work-Ray-Dalio/dp/1501124021","0"]}],"fee":{"gas_wanted":"4000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AuWZgpYDYwjXGDGZ4nZJ6FxqeWB37G3ZTRL8/lKyxWjB"},"signature":"L5IxT5vnEFmR5f4UipeLn/iy0d31QUzA1jYfDQ0uHRQzGpJaah89eoF4l5x89tCKkhJXIOLlIDpqI8RwR8BqqQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1sw5xklxjjuv0yvuxy5f5s3l3mnj0nqq626a9wr","send":"","pkg_path":"gno.land/r/albttx/home","func":"SetBook","args":["Principle","https://www.amazon.com/Principles-Life-Work-Ray-Dalio/dp/1501124021","2"]}],"fee":{"gas_wanted":"4000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AuWZgpYDYwjXGDGZ4nZJ6FxqeWB37G3ZTRL8/lKyxWjB"},"signature":"YHUt0lPXg/JhRdh8UtEQn0iEHeGzjwB1CItEDINoPJUyp5RI9tY9p6/768prXYB6vhuDPr1uMPjzUIR64CZbTQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1sw5xklxjjuv0yvuxy5f5s3l3mnj0nqq626a9wr","send":"","pkg_path":"gno.land/r/albttx/home","func":"SetBook","args":["Principle","https://www.amazon.com/Principles-Life-Work-Ray-Dalio/dp/1501124021","2"]}],"fee":{"gas_wanted":"4000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AuWZgpYDYwjXGDGZ4nZJ6FxqeWB37G3ZTRL8/lKyxWjB"},"signature":"ytBSSe5VU5rNG2yjGB8M+tnWmh6h6B4IyVTwakjSFjwwinNvzut1F5fSyakJI47P8nRtvYZ1vT5PYvlPgm6l7A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1sw5xklxjjuv0yvuxy5f5s3l3mnj0nqq626a9wr","send":"","pkg_path":"gno.land/r/albttx/home","func":"SetBook","args":["Cryptography Engineering: Design principles and pratical applications","https://www.amazon.com/Cryptography-Engineering-Principles-Practical-Applications/dp/0470474246","1"]}],"fee":{"gas_wanted":"4000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AuWZgpYDYwjXGDGZ4nZJ6FxqeWB37G3ZTRL8/lKyxWjB"},"signature":"ccE9Ll/5phWh/jRhoRoC5IkxPK5ZOkHKWVQV6RNlffVOFH8ZmbymvLF/qWoVrYaySXpYHTOUghdiGqDAODz3iQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1sw5xklxjjuv0yvuxy5f5s3l3mnj0nqq626a9wr","send":"","pkg_path":"gno.land/r/albttx/home","func":"SetBook","args":["Atomic Habits","https://www.amazon.com/Atomic-Habits-Proven-Build-Break/dp/0735211299","1"]}],"fee":{"gas_wanted":"4000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AuWZgpYDYwjXGDGZ4nZJ6FxqeWB37G3ZTRL8/lKyxWjB"},"signature":"6lL+HPNbnXycDr9hFVGjwIp4vuO+HhlX68UzzMK4vjxpGKah5jRIrOHFb8AfxSAIRkwgigqDO9/ot0IAJqf+dg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1sw5xklxjjuv0yvuxy5f5s3l3mnj0nqq626a9wr","send":"","pkg_path":"gno.land/r/albttx/home","func":"SetBook","args":["Designing data-intensive applications","https://www.amazon.com/Designing-Data-Intensive-Applications-Reliable-Maintainable/dp/1449373321","3"]}],"fee":{"gas_wanted":"4000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AuWZgpYDYwjXGDGZ4nZJ6FxqeWB37G3ZTRL8/lKyxWjB"},"signature":"cAbSbgLUci6N4AOhcNIIyoFMvl6QEFqaSYGtraQ1fB0RNGaTOlRysQEhvaQtWs0IW9z8dn3C9QriCUzykQ+dvg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1sw5xklxjjuv0yvuxy5f5s3l3mnj0nqq626a9wr","send":"","pkg_path":"gno.land/r/albttx/home","func":"SetBook","args":["The Alchemist","https://www.amazon.com/Alchemist-Paulo-Coelho/dp/0062315005/ref=sr_1_1?crid=1WGJ4RFOSRTPF\u0026dib=eyJ2IjoiMSJ9.oUSaMmdTbyPBivuJLFm4Q00lHxDI8Wq31DkJLcXhE0Bybfri-agnVT5V-bmnykDYW6BS0VgO5NWtej75plrCnUH6D_cvswIw4vF9hU3T9zq5A5RiyevGrHQzgB-gIBhFq40wN0bcXhI6VZVO7DNRaDi-vFt_pnpde560QMatrxTR_OHGKYYR-QnjRhykrxt-WABJoKPp5xlDP3qBcD0lw8FYbP6qpMCAgfsb11vazy0.GC4K7k05eEjC1wgSZ6veXzzYJ6nwgBpENeojswqsoAg\u0026dib_tag=se\u0026keywords=the+alchemist\u0026qid=1725625055\u0026s=books\u0026sprefix=the+alchemist%2Cstripbooks-intl-ship%2C170\u0026sr=1-1","3"]}],"fee":{"gas_wanted":"4000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AuWZgpYDYwjXGDGZ4nZJ6FxqeWB37G3ZTRL8/lKyxWjB"},"signature":"/FBO7kcjz/+qpGITJGi7Up2ymSKMuGR6bTFsbWc8csYIt+HzcXcNVxhu6kK6M20zgSh9kyuPJ+ct9UDjUeQOUA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1sw5xklxjjuv0yvuxy5f5s3l3mnj0nqq626a9wr","send":"","pkg_path":"gno.land/r/albttx/home","func":"SetBook","args":["Rich dad, poor dad","https://www.amazon.com/Rich-Dad-Poor-Teach-Middle/dp/1612680194","3"]}],"fee":{"gas_wanted":"4000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AuWZgpYDYwjXGDGZ4nZJ6FxqeWB37G3ZTRL8/lKyxWjB"},"signature":"QWGupP8/s+Fj4UyQtAC+3v/7ZOfcxjGnwI4y4YxSb6Atp2AazHFVTn3vCjRV2MMDp1sWUczaFtksNplbt4xDvA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1sw5xklxjjuv0yvuxy5f5s3l3mnj0nqq626a9wr","send":"","pkg_path":"gno.land/r/albttx/home","func":"SetBook","args":["Way of the peaceful warrior","https://www.amazon.com/Way-Peaceful-Warrior-Changes-Lives/dp/1932073205","3"]}],"fee":{"gas_wanted":"4000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AuWZgpYDYwjXGDGZ4nZJ6FxqeWB37G3ZTRL8/lKyxWjB"},"signature":"LfZyv0lBphyw8Qjgg7rK8pAAk/fnp3unENPTDPGRArRtbnBzJK7KLaEv/1UEszRUJLNrokjLOSxD48p6xdTIug=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"home","path":"gno.land/r/leon/home","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n return \"Hello World!\"\n}"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"bbQGHMm1pCHPdP1aIshqJ6JrqezF2cGgk81y8XZLxdpg65uTiS/y4RQ5JjPB2kylWS97s0t19+svmAjdBNz9Lw=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"home123123","path":"gno.land/r/leon/home123123","files":[{"name":"package.gno","body":"package hello\n\nfunc Render(path string) string {\n return \"Hello World!\"\n}\n\n\n{asdasdas"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"7wQbBuXmlKlEDF4C1zducfGKrBMuXjUHlaJWcRhj9VtGr73KZIxza4LCZD/hDv/BqepC86WwClXgI9awUy6Dxg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1lavlav7zwsjqlzzl3qdl3nl242qtf638vnhdjh","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"lITVguL+w6pLojchggVGiJ0clbHcc0gJmX9C3HfjF3NWkwWdcbYE0VSr7TFiimoDbLbiZ3/VUzw44xRc38ZqSg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1lavlav7zwsjqlzzl3qdl3nl242qtf638vnhdjh","send":"","pkg_path":"gno.land/r/demo/userbook","func":"SignUp","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Asl+3WNC5R5E0QLDUbQSz+T8gK76BGlAldQjh7PKC2C7"},"signature":"RzyrJfmWuO57R0J8bEYptVkMJHTdhPSRZqfW59nSedUJ3TZtNR0/RUm2mJuJE28XwOuvOOFCqsCbAjBLiWPGDg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1le0nkphlasm4vftr8vd5rkr5644cq5lh3dl656","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"P3iK37XHjYazrHzBV30WtaI8LpOkM9bdrT5YIOz9n8VzJNgBptOKYkWcxZty/yxVW6kmo04X+HzQGNsADaBh4A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1le0nkphlasm4vftr8vd5rkr5644cq5lh3dl656","send":"","pkg_path":"gno.land/r/demo/userbook","func":"SignUp","args":null}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ay/ivu3IdLkxHa4bTaFX1Ld2tMLxBmsnnKxV6Ew0ZskV"},"signature":"iBhHkVeOm1n4ChlLHjIgYUSiG0qLX5/Be8NoPODy/lAHVqziuGlx9z0PV2c3eCVXERpKbtmkgQIDL+F+RTOVUQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/demo/memeland","func":"PostMeme","args":["data:image/jpeg;base64,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GDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAGDBgwAf/2Q==","1725972102"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"uCfeIu8tAu6SZoXHsEBvqiOFOxIkTB8fUz7e4fPMaPVcV6l7GwRHbpwXY7K3nbt79IyN5Qfi4942dxqsjcpjxQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","send":"","pkg_path":"gno.land/r/demo/boards","func":"CreateReply","args":["1","1","1","coucou"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"JRDzC2k1TeklikFNFu24+LYnOScijafyw/8PKO8y8qAWLtYcGKw+nSqI6BAvFQZgNidpDfssz3dIP0yt0v2OnA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1747t5m2f08plqjlrjk2q0qld7465hxz8gkx59c","send":"","pkg_path":"gno.land/r/teritori/social_feeds","func":"CreatePost","args":["1","0","2","{\"message\":\"Waouh, is this Eiffel Tower?\\n\\n#test #map\",\"files\":[],\"gifs\":[\"https://media.tenor.com/ARUJULyIJt0AAAAC/shagarita-shalymar.gif\"],\"hashtags\":[\"#test\",\"#map\"],\"mentions\":[],\"title\":\"\",\"location\":[48.8582599,2.2945006358633115],\"createdAt\":\"2024-09-11T14:32:08.772Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AyDlf14q7C2aBqar/Qryh6dVR9VACxVZV6fOaM3X5YEA"},"signature":"l7ef7O+y3Of8AInikOFGUzBcfzHy1ngnNEvCVFj4xwYFEr343mBFJaqLKfloWbrnZ7qjUDLiE1ohhbRgZZrfrw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"mypkg","path":"gno.land/r/leon/issues/mypkg","files":[{"name":"package.gno","body":"package mypkg\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/ufmt\"\n\t\"gno.land/r/demo/tests\"\n)\n\nvar (\n\ttoplvl = std.PrevRealm().Addr()\n\tinitlvl std.Address\n\n\ttoplvltest = tests.GetPrevRealm().Addr()\n\tinitlvltest std.Address\n)\n\nfunc init() {\n\tinitlvl = std.PrevRealm().Addr()\n\tinitlvltest = tests.GetPrevRealm().Addr()\n}\n\nfunc Render(_ string) string {\n\tout := ufmt.Sprintf(\"### prevrealm in this realm (=deployer):\\n\\ntoplvl: %s\\n\\n initlvl: %s\\n\\n\", toplvl, initlvl)\n\tout += ufmt.Sprintf(\"### prevrealm in tests (=current realm addr):\\n\\ntoplvl using test: %s\\n\\n initlvl using test: %s\\n\\n\", toplvltest, initlvltest)\n\n\treturn out\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"6Cg4bCYfP7PdyUUF2m/HqOjGdYlyo7aim9vioBIxFO4g1qwfBkgPO88fQDWJtMEqPZBzS3ncPrerOJub020zxQ=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_call","caller":"g162jgpk4740r6a7g53cgz9ahxqtyuekgqchw6w9","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000005"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AqD4AqUY/VAPgrwGhq7e9Px4Pj81GRDZYwRvm+A69599"},"signature":"EH8B+2U4z4HowFatuGia4PMqz8f4RkbOXMQPoboRXw9/TuQFR0U0xAhejmpyEUbs0he1QHJegDth351aecD6Hw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","send":"200000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","Malek","https://github.com/MalekLahbib"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AidlxNTtkl1dDNCgxrSNVJKYWZdC9yrixvgSAP6U6WYX"},"signature":"V2u53+lTCanA0xchOIJooBNs0qp5bUBpk9Vcogf3c99rXyoETwM/GcQB4r6puhD2M68Gqvazsha+fWQfmvHpvg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g1u5svs9gnr3s24vf22ff4uy0u35uh4gtg3c33s8","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"vc37b/F5POTJPmJk4Mj5ErPQlN80vGU5GNPFEAFPHSNVB6MnkgV82deB7QHsHDFWdE6D9tS6hXH1F12Y5x6Cjg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1u5svs9gnr3s24vf22ff4uy0u35uh4gtg3c33s8","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"MDVigqeEvWYhYSD/Ol+WJ3n3tAE+j2VfZSN/6YFc+rpbU7Y78Rm3oUF053Ls4bH0nUA5tMs49gQis8Pmke17OA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1u5svs9gnr3s24vf22ff4uy0u35uh4gtg3c33s8","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"gQJVPM1rE4lk4iWdgKyFsULsa/3MUeOi9dvnfQfMbRdlTmfTbZr0YXUmrChl6uy0NxOrhDD8Lj8drPO0F5T5Dw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1u5svs9gnr3s24vf22ff4uy0u35uh4gtg3c33s8","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"0Ug71gINMR/N4f9d0wCoiwsUbmcZ6Quo6np8PiAK7eAAvI1kqhxtuV6xU3V/krQjTTZ1/edvLm7u+Dp892kIgA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1u5svs9gnr3s24vf22ff4uy0u35uh4gtg3c33s8","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AK9qVGE5fVvwRI8ByBr8M+vhcw0BVV4Ro5xZngw8nUd/Lha9ShxF1wBDAPzTdqtuSBpoNuG5MB0q7KlyEZ1/YA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Deia4S4ZWUPc/WtLjDdvP/NfLRxxP8oEVUgAtHDpgHZOZaRSev05SsXOolK/wwkjh8/6r2j/doN+4nYZQuFIfg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"7698k4kHcBLP4kxNm2HrPn8A9t8w2YKTk2wOnri56RUrx03S/UWFHuQHmNxsWtWyqaXAPU8/CwwCcIpVoQPePw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"4AQxg2kQ4qJkbtAHUODC4aPdyqwy7kDHsKyYq/brodQUOwUJArWVs0X46+f2/x9+57N/ualeJqP3MT/eRPZIng=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"z9kAZVzt9XjxYKiN9p55n+gqs0BExVPWvrsHZBIQWfpXpnhm1ToAS+JUTwyTUQomSCtkmFbrK9dHoJFizq4adw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g162jgpk4740r6a7g53cgz9ahxqtyuekgqchw6w9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ZIFuzgkC8Imw1Qv79xMarLylpwTZ98eBaudl2lWjYRxVSzvEbO6eXS1cCYNox50Dn2dqRW2GG3mUWF0UFKnoPQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1u5svs9gnr3s24vf22ff4uy0u35uh4gtg3c33s8","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"kCCAshhj6EfU8dC5aMH8ih4iirAMJpwafTufG79lSP0BF3XY7+4NWIW18P1Z2e2lIZbCzQmOYSzu/UP1XqKOWg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"fd9jRbGT1hImOU4bsBv7icUnqOW4Dw4LVD94w+b0wSQpxldW/JtNIbVFx4h6BUktbX3k1iL+2BTnNYMxnuFo7A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"n8p8zfHVFsMU6zzY8WcGYcAYyzRpd0eH7MW4HPkykbpv4cMGxeBOSuRCyhj9gB19s7/Saw96HiAuVnvFTbvvxA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1u5svs9gnr3s24vf22ff4uy0u35uh4gtg3c33s8","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"AE7Jnfj0GU+1Dpk2mIzSgU8poeek0/HCz693eYAW5oYC6F08y2v4y/5efHZDDMH0Yn3pFi+S+umLgLiLiate3w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ma90AkQcBXfi7AYk+bLeynGpk5M5P8lzzcBRiJFccB8OiHprgrHGg6waqwkI8baIfPCAhRmkpUfQR/4j45NBrQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"MtNBZBiclEClJfC5EKPYxZzKQRVXyU+cxdKoxtsnd9Z+r+pqzX4m0asGgYalDh+NRdAAz6bmGrVQ6RX2Acp3oA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g162jgpk4740r6a7g53cgz9ahxqtyuekgqchw6w9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"3i3pjkG4YksP2mhdwISLgb+VXo6nB4606fFo7e30saY0bcUcY7c5H/Sv6teL+DWL6rj6UBECc1EocmlD5VOSYA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"WgUPcamDDkNAWm2eZQ9BqsxnjM+IjWFfJ0T0awkeG2BSS1uzEyM8S0co4DAJl+r50L/z9YibliC/rfJ+FQFRdw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1u5svs9gnr3s24vf22ff4uy0u35uh4gtg3c33s8","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"78FNufEF+gQ4ByI28dokq5OHgNGgvt7er83rQxJ9cIpznKaUZvBsuG1iQ3Y8IIqeUYc+SnWFJ53WKHZSWVb7jg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"hkE+AgLEmTNbh8mBkRgBnRKZ7idDPXdPguloaOQAFlVdmSOugyibKHFt2ocrcIKoGSoH6uS0MZ+DLI6nAub9jw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"8TN+bli9Vlrq8Z+d7EGGpPUbLAfj9K3X/aS7DdX+pFtt4qn8oIH4hC5UpSmTHvHwwQguKaxO7Vf2rIdJGjemkw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jrvc6uphe80jfupx5p9eeepfucj5cxx3tecnht","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1WI5/EU4c/asHNORXkQefpPXRcVSz6uCdLiWQqaDkq5mZcoUc1wyzLhRvmStZ2qJ7ZmfGcSr759LzH2b+5YugA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"uEcHayKbx+q70PiVp//cDVwiI1qUFfBJ56thyc8wWd40JKsEn1XKMQh5bEUCpp609cRb1/2TD7GL1iHEtguakA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g162jgpk4740r6a7g53cgz9ahxqtyuekgqchw6w9","send":"21000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","varmeta","We Love You All!\n github: *[@varmeta](https://github.com/VAR-META-Tech)\n* [@thinhnx](https://github.com/thinhnx-var)"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AqD4AqUY/VAPgrwGhq7e9Px4Pj81GRDZYwRvm+A69599"},"signature":"hvg4int4apbVsH0HPWxRNJ+wpSg646G4AYoDSu5Hl8FvKYJUndzupfJ/xcJZ41+jU918cJf1ekJxTf1dwAyHSQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"J9PciBwLxG7lxlaCRMY0zqWO4DQbSRM2OkizidJJG8JFNsu5z3C7ARsIiGswT+llNVH3NkRNGIGH/pQ7ghOXDg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jrvc6uphe80jfupx5p9eeepfucj5cxx3tecnht","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"kuc7XhFixBZFHcZE174CK3YWLY7TKk8uRvuYknA1oEsd8IBMA2SEqadZU+UXRgwwouhnXHjpXzCFvDvG/AYlRw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"cBKJOiX+Lx/M2SqSq8kCkaE3sh0Eyr21UWqa0MOaEM9mC/YYsGyUDLBM7lo0lwDgJaQfn0y+80hOrb3IYR2vow=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ku7d4q3fefxfa2w8tdg79lcy6e0uhdpntzcgwu","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"RhH6FrJW1ch2cOWOXAeVDRatDp9tLusR4BbqrIL2wMZwkjzbitzfP1P0LpdVeNV21ADfffRKT2H923Fwl7s1tA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1u5svs9gnr3s24vf22ff4uy0u35uh4gtg3c33s8","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"yyMgKbYAUu+x2LNzP7BP9Tz0UD3a2w+fVZvY6o56/o1alK6RAcffc7MSHpWPxX4rpnpxvuK0DaOLDu//OGpZGA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"gG+j54FWxbn8tTM9Z7xlPfB7NUHXMPq8dmYKo72u0bo3yVD51laOONEhPLbf+z9L0NCy3MydEREFLJG0Sk4YPQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1u5svs9gnr3s24vf22ff4uy0u35uh4gtg3c33s8","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"JL0S/hErcJOT98iKPtdxO0f997qTUhtplV3/btsqjT0zjCr/ZDuQ4wuNkrmDENRWwnwCOBrNfCr72P2/GVdVcQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","send":"200000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","Malek","https://github.com/MalekLahbib"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AidlxNTtkl1dDNCgxrSNVJKYWZdC9yrixvgSAP6U6WYX"},"signature":"hKC5ZZF6/0jWEa0SeApVe0tctJtEUvjvtZAxF0CL2VIlDoYDQladjUHYvleVmUdJVKUqo6qqDob/Aqkuadbi8w=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jrvc6uphe80jfupx5p9eeepfucj5cxx3tecnht","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"qSvaoqbhmsG3GxzaGxL+lWjh7VIjYla7doxPiym3qxh1udNnwdwEfqKyI+j/WOYopTaJq+urROQA4cRmP6LvYA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1u5svs9gnr3s24vf22ff4uy0u35uh4gtg3c33s8","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Zv8KPSCrwEh+ExYtiZJhJGUAlMXtcrlsNXprYU5UUYtdSBHnGVMMQvYy9bCVAq9LqCQATchYCpycg9KvD+alHQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jrvc6uphe80jfupx5p9eeepfucj5cxx3tecnht","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"24TWY/tnDdSVN6u3Szbp96Oe9tg3iA5uOVyvkLRJLvAsCQFt9AqMv0YHwAX2VRfrMXHGzJs606mxrD0Rr07FLw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1u5svs9gnr3s24vf22ff4uy0u35uh4gtg3c33s8","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"kbPrLVDQjj6HpGLIghx7yZP384HlAKMmNCKYgAMxEpcpuo5DGarquK/Zreaph5UtxbCnx8wX+157QuDjIVn2tw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1u5svs9gnr3s24vf22ff4uy0u35uh4gtg3c33s8","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"slphYu9IVzrHoJ5m7IUi1LUq1uWEkSPTEHqBleZWr9V6E+YBNc/PuHaFoXApZB6Im+pIboofkfLLV95WlSOEZw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jrvc6uphe80jfupx5p9eeepfucj5cxx3tecnht","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"LYaO/GTjIJokgsPKRAxMFMqyidFJr4v3JRH8fNBJj1AMxJJzZqwE8al6Fb9Xper0sX7jf3XKepO2w52HUcdAiQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jrvc6uphe80jfupx5p9eeepfucj5cxx3tecnht","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"Vorh67x7v/pWLbEkdWU1FpMpoLlgd55wfSawojsfdnRpBmrRvNCREHxH9v6LeaOWVOrcDB6S8fIWqVOJyMRttQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","send":"","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","Malek_","https://github.com/MalekLahbib"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AidlxNTtkl1dDNCgxrSNVJKYWZdC9yrixvgSAP6U6WYX"},"signature":"xcAttzhE2NHmak4aiFmTH4mEt6SkKZy3HcGUverqxWhVTTK4msLyAwRjLBxMs7bhIZQAsD0fJIr8wZl68aiDzQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1u5svs9gnr3s24vf22ff4uy0u35uh4gtg3c33s8","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"MClvPk9fHY71bRAwkrTCiTbeHgRRzE7lBT1tuf6sHZlhzzDBmtwVOwbGQ15EJ44sLTwG192PSypTRYOXYSoLPQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jrvc6uphe80jfupx5p9eeepfucj5cxx3tecnht","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"L2XtKQQuylo1d7NXztdlZEg2iDEkiB/lMsMnH6iR56A1cybarTV4GcEAP0kLmZYckcLzC0IRplNC4dXXpbg4jA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jrvc6uphe80jfupx5p9eeepfucj5cxx3tecnht","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"PTuDhBuVlPUk/SzPbtc/TWAmSfif16HqurRCaQfBjLBW6F8gvct47incSLGz04r9v6TQDnzhny2E/NFkgn1MsQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","send":"20000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","Malek_","https://github.com/MalekLahbib"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AidlxNTtkl1dDNCgxrSNVJKYWZdC9yrixvgSAP6U6WYX"},"signature":"DcpGmxlBeytNkrdfIVW+M3lcNe6kQhWNELMwhy25DC1kTlPCrfpN3RoQCs6f7za6pyjp6Vd1vlpSom7u20AVLQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1330dfff36jyy44rgq68y33mzxx9uhrgzyq88wh","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"971HKajk+Yphj0J04D0+bgMnzKVVW3M4ndzW2ZDxCF5HMpVwUiDDedgK70oHBfmjCQQcMwa8gNSNB7soVnwHRA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ckanw7sgnyfyqygunjjk9hp7mmlqvkxhsjdxya","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"b+BsV2vqOfDuGnAk1ejLxZvRhClW0eS8Xuh+fZMnSQJY9rVel72aFyqlXPcYYDboZ5aUELy2TA7W646jAzNsDQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1u5svs9gnr3s24vf22ff4uy0u35uh4gtg3c33s8","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"ydRUCNdsgQH+Id+rTeRoZext3lPdE6XsundUieKunBcdIyulIYhxRHtTc4+uNMVCc52j8CRRZWI2DYxQss+BYw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1330dfff36jyy44rgq68y33mzxx9uhrgzyq88wh","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1Qmy21MiLAhjbYiHmip9xY91SHWN+WII6RDZlGE2OPR+ElZ2VcBqVf2dSvZ8/dQOtzenLfe5yehUZ8QgL1xwJA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1330dfff36jyy44rgq68y33mzxx9uhrgzyq88wh","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"hDSxdh+zaFeGG75WQ5Dg3LkLI8lWzvODY8w6o0q0Lp0Ni+5nrF7Mrn7Up2Q7Rs5f3wMK87a/xSqeGzULm88rJA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1330dfff36jyy44rgq68y33mzxx9uhrgzyq88wh","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"5yJAPhRpvqYya0RL/WlMKI80DU9HNOzMSoIYd0RoZD4fXgIpmghN+wPa2H0xi1xESJaTcG0/Qer5bvw7NBgUgw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","send":"20000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","malek_","https://github.com/MalekLahbib"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AidlxNTtkl1dDNCgxrSNVJKYWZdC9yrixvgSAP6U6WYX"},"signature":"1Og7KYX8bOK4v7nmOE9z+opYuvZsN3ELhTAMLxaszLgfgwPc5nxt3IUCxMA2uEUbhglx5zvwKdWH/GTjhJyCuA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1330dfff36jyy44rgq68y33mzxx9uhrgzyq88wh","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"7jYxR41TzUAtPL0TOlAIPXUbYP9fjEiE+P5ltbybmbcxSjN/DSmwBjadFCsz1lX4XXrOf5gqCY6uA2p/Kzn4XA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1u5svs9gnr3s24vf22ff4uy0u35uh4gtg3c33s8","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"1VCelVSzY2hrvPjDFoBRLFOkE+RHdi23ZOV9yuVUHhVkETBsD1IJgGZv7pLe95tKjiQ4DNhvW1Y78Rqp6h1f+g=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ckanw7sgnyfyqygunjjk9hp7mmlqvkxhsjdxya","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"MZwetYxr1ajh3Kti2v0FqU0ECF9d7VCXV7XEyz+/eLQdBKZwwVHT20qzYOVBs4+6gv4rStW0fbt1grAdSOv5MA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1330dfff36jyy44rgq68y33mzxx9uhrgzyq88wh","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"WvGhFXbWFh+PCZ/0RovKVBnWMgn2Mr+j4MkD1Fwija9DdfjVOCoHAgoQ5xzFn8Ydimx0ng2ay5ZlBH7tyvWSNw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1ckanw7sgnyfyqygunjjk9hp7mmlqvkxhsjdxya","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"C0xVGELB8k6iEYSwVY8fmrVfchv8SpQFGehoLsfRV5QMy7pQVOaIHR0B2ohR9YdfmcxTDRuO9P7/zsWTBeBjMA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1330dfff36jyy44rgq68y33mzxx9uhrgzyq88wh","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"DFGRIqIetqdpaZEqr6ZSEUTktda0FwnUQdhC/CDMmx4UFXlFBa2sm1j88d4aCEdT4unKVo+vWd+Uqxk6Mg7n6Q=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1330dfff36jyy44rgq68y33mzxx9uhrgzyq88wh","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"2s/AUvY534mv8e/rP4B2oJrxUFNOQRrJbuf5i6fFJhIFWsYhUW4nupCD9wPCeTDrv/C/8WR/un4Q1syKNFJzyw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jrvc6uphe80jfupx5p9eeepfucj5cxx3tecnht","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"LgLx9Gn4s/Qve9DLOVH9HH5KIoUzgUMFqjW8LTx0bt1LQUYtCz8zG820Exgl71+LuRseT2YPIVjoZVpxHTBPxQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jrvc6uphe80jfupx5p9eeepfucj5cxx3tecnht","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"zO+vkstGkkNZVL7ur0uPRTN79miRH42X7sNAavFHXIoj+m/8xCS0vq/ol7SvJWZ4ziIbL1dVp1LueN9vuYFJ/A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1ckanw7sgnyfyqygunjjk9hp7mmlqvkxhsjdxya","send":"20000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","miguelito","https://soundcloud.com/76temd/sets/miguelito"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A48IBr/3QqKP5cV5Gu8w4ji7/WxMQT+hYKwI47e4w3v/"},"signature":"sTK0up9iisyIuLBL3AXA9f6HkX7eeDsgWzIvViyayuRP1PY2RbBTKpAd2awIq34uRIHKauusLpnJmZWNC9NWmA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jrvc6uphe80jfupx5p9eeepfucj5cxx3tecnht","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"oIkAR4J68pypoP48ig5scLafmFcNEsIMVRZeiloFMVJY1NarLXiR56AOZnjb1Ytk7GFT3dvINexsv92xewDLrA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1jrvc6uphe80jfupx5p9eeepfucj5cxx3tecnht","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"sJIPaK8e/KjcEsHsfvzK8qFXTdvfcna7VH160ZFdYf8xeujp8MaoJQXC8qkIv2JmncSojOGZ+Gc8cQvLvzLHjQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1u5svs9gnr3s24vf22ff4uy0u35uh4gtg3c33s8","send":"20000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","nemanya","https://github.com/Nemanya8"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ahwtm0DdpmU8FGsGlH2HKbA/U1/SV5KZQimTbvv+htxu"},"signature":"9Bl0n9rXtvV96yO+CNRMrapg5ugqWAmz7cPSKBYo9E0kNiCHzzOiA9z3Xmn48h6cI5AJs+orLBuVWFIdP/RRnQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1330dfff36jyy44rgq68y33mzxx9uhrgzyq88wh","send":"20000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","Ngoc","https://github.com/thanhngoc541"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AhsU4msjmCnK33Q/QPsxJX7LgQYk2CD9tgtpMSntVe1F"},"signature":"8XVJi4O9+mAjR6O9XKpWQeeR2QBUPtC8xEiQc/72x3YrdwmpAQrqcgXCW01ooE6TsAeB/SaNSKcpFTBSu1OpOA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1330dfff36jyy44rgq68y33mzxx9uhrgzyq88wh","send":"20000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","ngoc","https://github.com/thanhngoc541"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AhsU4msjmCnK33Q/QPsxJX7LgQYk2CD9tgtpMSntVe1F"},"signature":"J+PqfQLGtYYTRqO6qNGkXLoC7AGz5E2UmnzHRz3FlUlpkRr2J31lNTMJBi5pRx5isdsT61FDCHBKaucRYmMaMQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1330dfff36jyy44rgq68y33mzxx9uhrgzyq88wh","send":"","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","ngocndt","https://github.com/thanhngoc541"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AhsU4msjmCnK33Q/QPsxJX7LgQYk2CD9tgtpMSntVe1F"},"signature":"zIUThC95zxpDeW6kstNaMrfWsGlm9qowoNnc4o95kqIYBYYEYk2R9EVXRJO00oIeNvXzchhVQnY6ODGL8tXuWA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1330dfff36jyy44rgq68y33mzxx9uhrgzyq88wh","send":"20000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","ngocndt","https://github.com/thanhngoc541"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AhsU4msjmCnK33Q/QPsxJX7LgQYk2CD9tgtpMSntVe1F"},"signature":"EHvwv19h6aDbViDTujeyptDHgSuLVzhxmGYy649U1GVSsmdvtjeJX13G2t7HWDQJV7ZD+ULpTLuKMFmp2rWcwQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g1jrvc6uphe80jfupx5p9eeepfucj5cxx3tecnht","send":"20000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","stefann01","string"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Awo7Hi3Y4Mn2ByW2T5ruLSLONxdyFRe8haN2m6krGvpl"},"signature":"ra1K0t7aDcNYT/gJx1wuVs/tHZfrWyUMPcj3I4zwZB85+jrUeaH4VPgiWRVNeIHtBVWkDPnKCSXZxtDBKxfaUw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jrvc6uphe80jfupx5p9eeepfucj5cxx3tecnht","to_address":"g1sd5ezmxt4rwpy52u6wl3l3y085n8x0p6nllxm8","amount":"26000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Awo7Hi3Y4Mn2ByW2T5ruLSLONxdyFRe8haN2m6krGvpl"},"signature":"aexNd+zYb01yMxWaAx3qFH6N8eCQQi7xUj/6yOwThRAzUdpHAjewPwEF2EEbKwJQzGiZJAa5oixOXJTcV3e7Bw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1jrvc6uphe80jfupx5p9eeepfucj5cxx3tecnht","to_address":"g13awn2575t8s2vf3svlprc4dg0e9z5wchejdxk8","amount":"26000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Awo7Hi3Y4Mn2ByW2T5ruLSLONxdyFRe8haN2m6krGvpl"},"signature":"eou7MBJSZfxRTIKHtYimZ9JmroT4ELDkkPJbNdPcJzQ238rqv8dTNY/q6oJ+yN7hQ5L8tOSkCl0tEDkXfH/8xg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1sd5ezmxt4rwpy52u6wl3l3y085n8x0p6nllxm8","send":"20000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","stefann",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Aiv9tqagYf7E57BDv13G2FRAt+yvhG915Lu0eJSRl0z4"},"signature":"tvuiPkzdf3qkXgfxXqdeDJ1cHfL9Cqz3mu9j0vXPi1lyoDauJyDUZGVMBmyLkwT48U0dVzW/a0xa+QpFdb69+w=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g13awn2575t8s2vf3svlprc4dg0e9z5wchejdxk8","send":"20000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","stefan",""]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Av5Xg5uKm8m7nLwObvro2vSiDb1hEe1zf60fewRx7wdZ"},"signature":"lLeiVbwcO7wae81dzEmi5F4HcKXxmgF1MfDURyeymaMtJ/UuPMa0Ww3X4+/KMSJVhp79JXKX4d6BVTdoV11mvw=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1sw5xklxjjuv0yvuxy5f5s3l3mnj0nqq626a9wr","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"xENi2Q3vYVnqVdRETXgd/ZmcmPj/5n91P/VG+coTIs1Tt2o0dkBTIPV6xyx1k/eMiiRlttkw/oYYmHtNgwI+CQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1sw5xklxjjuv0yvuxy5f5s3l3mnj0nqq626a9wr","amount":"5000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"dWBfurltEAij1DdF7nJe1LjYK60QH3mNt8efls1cjC5jNdOEKu+bhDDtH8oo/lF0C7rpx6pDqY8OJYG+TuxT0A=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"mp3McgfOq3CCLuxFwPlaGoYrk5MDJM/lRh9SiZqgn04mHlEqEkJovGuLIAnYJ1Vo1Df55QMg3iIY2mkBVgOzrQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1u5svs9gnr3s24vf22ff4uy0u35uh4gtg3c33s8","package":{"name":"config","path":"gno.land/r/nemanya/config","files":[{"name":"conig.gno","body":"package config\n\nimport (\n\t\"errors\"\n\t\"std\"\n)\n\nvar (\n\tmain std.Address\n\tbackup std.Address\n)\n\nfunc init() {\n\tmain = \"g1u5svs9gnr3s24vf22ff4uy0u35uh4gtg3c33s8\"\n}\n\nfunc Address() std.Address {\n\treturn main\n}\n\nfunc Backup() std.Address {\n\treturn backup\n}\n\nfunc SetAddress(a std.Address) error {\n\tif !a.IsValid() {\n\t\treturn errors.New(\"config: invalid address\")\n\t}\n\n\tif err := checkAuthorized(); err != nil {\n\t\treturn err\n\t}\n\n\tmain = a\n\treturn nil\n}\n\nfunc SetBackup(a std.Address) error {\n\tif !a.IsValid() {\n\t\treturn errors.New(\"config: invalid address\")\n\t}\n\n\tif err := checkAuthorized(); err != nil {\n\t\treturn err\n\t}\n\n\tmain = a\n\treturn nil\n}\n\nfunc checkAuthorized() error {\n\tcaller := std.PrevRealm().Addr()\n\tif caller != main || caller != backup {\n\t\treturn errors.New(\"config: unauthorized\")\n\t}\n\n\treturn nil\n}\n\nfunc AssertAuthorized() {\n\tcaller := std.PrevRealm().Addr()\n\tif caller != main || caller != backup {\n\t\tpanic(\"config: unauthorized\")\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"200000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ahwtm0DdpmU8FGsGlH2HKbA/U1/SV5KZQimTbvv+htxu"},"signature":"sUHu8w1ehmwV3sztUrO7/Ta3MW/DCeuHBCphxK6zO/Rg0lxoZOamI480MUwTTcK61ok4GEDv/FnWoSvFW6VuLQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1u5svs9gnr3s24vf22ff4uy0u35uh4gtg3c33s8","package":{"name":"config","path":"gno.land/r/nemanya/config","files":[{"name":"conig.gno","body":"package config\n\nimport (\n \"errors\"\n \"std\"\n)\n\nvar (\n main std.Address\n backup\tstd.Address\n)\n\nfunc init() {\n\tmain = \"g1u5svs9gnr3s24vf22ff4uy0u35uh4gtg3c33s8\"\t\n}\n\nfunc Address() std.Address {\n\treturn main\n}\n\nfunc Backup() std.Address {\n\treturn backup\n}\n\nfunc SetAddress(a std.Address) error {\n\tif !a.IsValid(){\n\t\treturn errors.New(\"config: invalid address\")\n\t}\n\n\tif err := checkAuthorized(); err != nil {\n\t\treturn err\n\t}\n\n\tmain = a\n\treturn nil\n}\n\nfunc SetBackup(a std.Address) error {\n\tif !a.IsValid(){\n\t\treturn errors.New(\"config: invalid address\")\n\t}\n\n\tif err := checkAuthorized(); err != nil {\n\t\treturn err\n\t}\n\n\tmain = a\n\treturn nil\n}\n\nfunc checkAuthorized() error {\n\tcaller := std.PrevRealm().Addr()\n\tif caller != main || caller != backup {\n\t\treturn errors.New(\"config: unauthorized\")\n\t}\n\n\treturn nil\n}\n\nfunc AssertAuthorized() {\n\tcaller := std.PrevRealm().Addr()\n\tif caller != main || caller != backup {\n\t\tpanic(\"config: unauthorized\")\n\t}\n}"}]},"deposit":""}],"fee":{"gas_wanted":"2000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ahwtm0DdpmU8FGsGlH2HKbA/U1/SV5KZQimTbvv+htxu"},"signature":"gEGNd296LLuQ5m2dQ7ayKTQhI6IV1Ax6t8oQDRZZc6dhq76k9nWn5RoFxiFpIYBpHqiQ/ZJsa0XtkXp9tq2JSw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1u5svs9gnr3s24vf22ff4uy0u35uh4gtg3c33s8","package":{"name":"home","path":"gno.land/r/nemanya/home","files":[{"name":"home.gno","body":"package home\n\nimport (\n\t\"gno.land/r/nemanya/config\"\n)\n\ntype Project struct {\n\tName string\n\tURL string\n}\n\ntype Social struct {\n\tName string\n\tURL string\n}\n\nvar (\n\taboutMe string\n\tprojects map[int]Project\n\tsocials map[int]Social\n\n\tfontFamily = \"Inter, sans-serif\"\n\tprimaryColor = \"#FEFEFE\"\n\tborderColor = \"#D30000\"\n\tfontSizeLarge = \"7rem\"\n\tfontSizeMedium = \"4rem\"\n\tfontSizeSmall = \"1.5rem\"\n\tfontSizeExtraSmall = \"1rem\"\n)\n\nfunc init() {\n\taboutMe = \"I'm Nemanja Matic from Serbia, an IT student and aspiring Web3 developer. I discovered gno.land at the Petnica Web3 Camp and I'm eager to make significant contributions to this project.\"\n\n\tprojects = map[int]Project{\n\t\t0: {\"Liberty Bridge\", \"https://github.com/Milosevic02/LibertyBridge\"},\n\t}\n\n\tsocials = map[int]Social{\n\t\t0: {\"GitHub\", \"https://github.com/Nemanya8\"},\n\t\t1: {\"LinkedIn\", \"https://www.linkedin.com/in/nemanjamatic\"},\n\t\t2: {\"Email\", \"mailto:matic.nemanya@gmail.com\"},\n\t}\n}\n\nfunc UpdateAboutMe(newAboutMe string) {\n\tconfig.AssertAuthorized()\n\taboutMe = newAboutMe\n}\n\nfunc AddProject(index int, name string, url string) {\n\tconfig.AssertAuthorized()\n\tif index \u003e= 0 \u0026\u0026 index \u003c 4 {\n\t\tprojects[index] = Project{Name: name, URL: url}\n\t}\n}\n\nfunc RemoveProject(index int) {\n\tconfig.AssertAuthorized()\n\tif index \u003e= 0 \u0026\u0026 index \u003c 4 {\n\t\tdelete(projects, index)\n\t}\n}\n\nfunc AddSocial(index int, name string, url string) {\n\tconfig.AssertAuthorized()\n\tif index \u003e= 0 \u0026\u0026 index \u003c 3 {\n\t\tsocials[index] = Social{Name: name, URL: url}\n\t}\n}\n\nfunc RemoveSocial(index int) {\n\tconfig.AssertAuthorized()\n\tif index \u003e= 0 \u0026\u0026 index \u003c 3 {\n\t\tdelete(socials, index)\n\t}\n}\n\nfunc Render(path string) string {\n\treturn \"\u003cdiv style='display: flex;'\u003e\\n\" +\n\t\t\" \u003cdiv style='flex: 8; margin-right: 20px; padding: 2rem; border: 2px solid transparent; border-image: linear-gradient(166deg, \" + borderColor + \" 0%, rgba(0,0,0,0) 20%); border-image-slice: 1;'\u003e\\n\" +\n\t\t\" \" + renderAboutMe() + \"\\n\" +\n\t\t\" \u003c/div\u003e\\n\" +\n\t\t\" \u003cdiv style='flex: 2; padding: 2rem; border: 2px solid transparent; border-image: linear-gradient(324deg, \" + borderColor + \" 0%, rgba(0,0,0,0) 20%); border-image-slice: 1;'\u003e\\n\" +\n\t\t\" \" + renderProjects() + \"\\n\" +\n\t\t\" \u003c/div\u003e\\n\" +\n\t\t\"\u003c/div\u003e\\n\"\n}\n\nfunc renderAboutMe() string {\n\treturn \"\u003cdiv class='rows-3'\u003e\\n\" +\n\t\t\" \u003ch1 style='font-family: \" + fontFamily + \"; font-weight: 100; color: \" + primaryColor + \"; text-align: left; font-size: \" + fontSizeLarge + \";'\u003eNemanya.\u003c/h1\u003e\\n\" +\n\t\t\" \u003cdiv style='border-left: 1px solid \" + borderColor + \"; padding-left: 1rem;'\u003e\\n\" +\n\t\t\" \u003cp style='font-family: \" + fontFamily + \"; color: \" + primaryColor + \"; font-size: \" + fontSizeSmall + \"; margin-bottom: 5rem;'\u003e\\n\" +\n\t\t\" \" + aboutMe + \"\\n\" +\n\t\t\" \u003c/p\u003e\\n\" +\n\t\t\" \u003c/div\u003e\\n\" +\n\t\t\" \" + renderSocials() + \"\\n\" +\n\t\t\"\u003c/div\u003e\u003c!-- /rows-3 --\u003e\\n\"\n}\n\nfunc renderSocials() string {\n\tsocialsHTML := \"\u003cdiv class='socials-container' style='display: flex; justify-content: center; align-items: center; gap: 20px;'\u003e\\n\"\n\tfor _, social := range socials {\n\t\tsocialsHTML += \" \u003cdiv style='display: flex; justify-content: center; align-items: center;'\u003e\\n\" +\n\t\t\t\" \u003ca href='\" + social.URL + \"' style='color: \" + primaryColor + \"; font-family: \" + fontFamily + \"; font-size: \" + fontSizeExtraSmall + \"; display: flex; justify-content: center; align-items: center; width: 100%; height: 100%;'\u003e\" + social.Name + \"\u003c/a\u003e\\n\" +\n\t\t\t\" \u003c/div\u003e\\n\"\n\t}\n\tsocialsHTML += \"\u003c/div\u003e\\n\"\n\treturn socialsHTML\n}\n\nfunc renderProjects() string {\n\tprojectsHTML := \"\u003cdiv class='rows-5'\u003e\\n\" +\n\t\t\" \u003ch2 style='font-family: \" + fontFamily + \"; font-weight: 200; color: \" + primaryColor + \"; text-align: left; font-size: \" + fontSizeMedium + \";'\u003eProjects\u003c/h2\u003e\\n\"\n\tfor _, project := range projects {\n\t\tprojectsHTML += \" \u003cdiv style='margin-bottom: 1rem; border-left: 1px solid \" + borderColor + \"; padding-left: 1rem;'\u003e\\n\" +\n\t\t\t\" \u003ca href='\" + project.URL + \"' style='color: \" + primaryColor + \"; font-family: \" + fontFamily + \"; font-size: \" + fontSizeSmall + \";'\u003e\" + project.Name + \"\u003c/a\u003e\\n\" +\n\t\t\t\" \u003c/div\u003e\\n\"\n\t}\n\tprojectsHTML += \"\u003c/div\u003e\u003c!-- /rows-5 --\u003e\\n\"\n\treturn projectsHTML\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"2000000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ahwtm0DdpmU8FGsGlH2HKbA/U1/SV5KZQimTbvv+htxu"},"signature":"Lzr7Sl9XG6gbvOuk4NwDCCqvoujavwzMivgG37x1qYNtvUZYINGuvRDBs+0ka7S/+itM9UqmhCyrBPyUrSso/w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/ghverify","func":"RequestVerification","args":["leohhhn"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"r2EHiKJ1ThEa2Cj8T3tIE03lQIVY4hqd0EQngRw5PgwsotJvoU6ajzcP73E1E+myOJjsPtbByOVpgH+7tn2HBQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","send":"","pkg_path":"gno.land/r/teritori/social_feeds","func":"CreatePost","args":["1","0","3","{\"shortDescription\":\"a first test of the social feed dapp\",\"thumbnailImage\":{\"fileName\":\"55+Hilarious-developer-memes-that-will-leave-you-in-splits-18.jpg\",\"mimeType\":\"image/jpeg\",\"size\":54678,\"url\":\"ipfs://bafybeiddjo5eb27ovzn6gqu2urtryqczmo5x6e7k6y2cl6iuwc32om4pp4\",\"fileType\":\"image\",\"isThumbnailImage\":true},\"coverImage\":{\"fileName\":\"dev meme.jpeg\",\"mimeType\":\"image/jpeg\",\"size\":10967,\"url\":\"ipfs://bafybeiguvitrqnkysdq2tn3lwi2ozbfmr4qhbgvzxiuxjin3n6gieeqt3m\",\"fileType\":\"image\",\"isCoverImage\":true},\"message\":\"\u003cp\u003eThis is a test of this dapp, using adena wallet and gnots\u003c/p\u003e\",\"files\":[{\"isThumbnailImage\":true,\"fileName\":\"55+Hilarious-developer-memes-that-will-leave-you-in-splits-18.jpg\",\"url\":\"ipfs://bafybeiddjo5eb27ovzn6gqu2urtryqczmo5x6e7k6y2cl6iuwc32om4pp4\",\"mimeType\":\"image/jpeg\",\"size\":54678,\"fileType\":\"image\"},{\"isCoverImage\":true,\"fileName\":\"dev meme.jpeg\",\"url\":\"ipfs://bafybeiguvitrqnkysdq2tn3lwi2ozbfmr4qhbgvzxiuxjin3n6gieeqt3m\",\"mimeType\":\"image/jpeg\",\"size\":10967,\"fileType\":\"image\"}],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"First test\",\"createdAt\":\"2024-09-12T15:58:01.816Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AidlxNTtkl1dDNCgxrSNVJKYWZdC9yrixvgSAP6U6WYX"},"signature":"3Z7nm5n14VAU5bKuF1R3eainYNwYvPGFiVc87Qi4R3RN5Ki9FltsotTlVxgnD2Fy+72YO47oXiA2JFOc30lmAg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","send":"","pkg_path":"gno.land/r/teritori/social_feeds","func":"CreatePost","args":["1","0","3","{\"shortDescription\":\"a first test of the social feed dapp\",\"thumbnailImage\":{\"fileName\":\"55+Hilarious-developer-memes-that-will-leave-you-in-splits-18.jpg\",\"mimeType\":\"image/jpeg\",\"size\":54678,\"url\":\"ipfs://bafybeiddjo5eb27ovzn6gqu2urtryqczmo5x6e7k6y2cl6iuwc32om4pp4\",\"fileType\":\"image\",\"isThumbnailImage\":true},\"coverImage\":{\"fileName\":\"dev meme.jpeg\",\"mimeType\":\"image/jpeg\",\"size\":10967,\"url\":\"ipfs://bafybeiguvitrqnkysdq2tn3lwi2ozbfmr4qhbgvzxiuxjin3n6gieeqt3m\",\"fileType\":\"image\",\"isCoverImage\":true},\"message\":\"\u003cp\u003eThis is a test of this dapp, using adena wallet and gnots\u003c/p\u003e\",\"files\":[{\"isThumbnailImage\":true,\"fileName\":\"55+Hilarious-developer-memes-that-will-leave-you-in-splits-18.jpg\",\"url\":\"ipfs://bafybeiddjo5eb27ovzn6gqu2urtryqczmo5x6e7k6y2cl6iuwc32om4pp4\",\"mimeType\":\"image/jpeg\",\"size\":54678,\"fileType\":\"image\"},{\"isCoverImage\":true,\"fileName\":\"dev meme.jpeg\",\"url\":\"ipfs://bafybeiguvitrqnkysdq2tn3lwi2ozbfmr4qhbgvzxiuxjin3n6gieeqt3m\",\"mimeType\":\"image/jpeg\",\"size\":10967,\"fileType\":\"image\"}],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"First test\",\"createdAt\":\"2024-09-12T15:58:28.809Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AidlxNTtkl1dDNCgxrSNVJKYWZdC9yrixvgSAP6U6WYX"},"signature":"r0BxFoWYjsDwcHjTyBmdWmYtaV4EcMoUTtmdzdSI4cst2euk8qvV9a/xYeM6HWcuWSmN052w9G7UXGfGzPFncQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","send":"","pkg_path":"gno.land/r/teritori/social_feeds","func":"CreatePost","args":["1","0","3","{\"shortDescription\":\"a first test of the social feed dapp\",\"thumbnailImage\":{\"fileName\":\"55+Hilarious-developer-memes-that-will-leave-you-in-splits-18.jpg\",\"mimeType\":\"image/jpeg\",\"size\":54678,\"url\":\"ipfs://bafybeiddjo5eb27ovzn6gqu2urtryqczmo5x6e7k6y2cl6iuwc32om4pp4\",\"fileType\":\"image\",\"isThumbnailImage\":true},\"coverImage\":{\"fileName\":\"funny-developer-memes.jpeg\",\"mimeType\":\"image/jpeg\",\"size\":69480,\"url\":\"ipfs://bafybeihjthsevg7omxjma3ntfpbvv6gbatjlqps4j5iadukyhgt3mdrkre\",\"fileType\":\"image\",\"isCoverImage\":true},\"message\":\"\u003cp\u003eThis is a test of this dapp, using adena wallet and gnots\u003c/p\u003e\",\"files\":[{\"isThumbnailImage\":true,\"fileName\":\"55+Hilarious-developer-memes-that-will-leave-you-in-splits-18.jpg\",\"url\":\"ipfs://bafybeiddjo5eb27ovzn6gqu2urtryqczmo5x6e7k6y2cl6iuwc32om4pp4\",\"mimeType\":\"image/jpeg\",\"size\":54678,\"fileType\":\"image\"},{\"isCoverImage\":true,\"fileName\":\"funny-developer-memes.jpeg\",\"url\":\"ipfs://bafybeihjthsevg7omxjma3ntfpbvv6gbatjlqps4j5iadukyhgt3mdrkre\",\"mimeType\":\"image/jpeg\",\"size\":69480,\"fileType\":\"image\"}],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"First test\",\"createdAt\":\"2024-09-12T16:00:13.769Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AidlxNTtkl1dDNCgxrSNVJKYWZdC9yrixvgSAP6U6WYX"},"signature":"x6T/9SSJeVgT7qFT1Lab1u/HBoJMniUImXMmBbB/W3p41zooYSYaP5ksmNIja0t2ek6Zab1Yy/o0UrXClt7ghw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","send":"","pkg_path":"gno.land/r/teritori/social_feeds","func":"CreatePost","args":["1","0","3","{\"shortDescription\":\"a first test of the social feed dapp\",\"thumbnailImage\":{\"fileName\":\"55+Hilarious-developer-memes-that-will-leave-you-in-splits-18.jpg\",\"mimeType\":\"image/jpeg\",\"size\":54678,\"url\":\"ipfs://bafybeiddjo5eb27ovzn6gqu2urtryqczmo5x6e7k6y2cl6iuwc32om4pp4\",\"fileType\":\"image\",\"isThumbnailImage\":true},\"coverImage\":{\"fileName\":\"funny-developer-memes.jpeg\",\"mimeType\":\"image/jpeg\",\"size\":69480,\"url\":\"ipfs://bafybeihjthsevg7omxjma3ntfpbvv6gbatjlqps4j5iadukyhgt3mdrkre\",\"fileType\":\"image\",\"isCoverImage\":true},\"message\":\"\u003cp\u003eThis is a test of this dapp, using adena wallet and gnots\u003c/p\u003e\",\"files\":[{\"isThumbnailImage\":true,\"fileName\":\"55+Hilarious-developer-memes-that-will-leave-you-in-splits-18.jpg\",\"url\":\"ipfs://bafybeiddjo5eb27ovzn6gqu2urtryqczmo5x6e7k6y2cl6iuwc32om4pp4\",\"mimeType\":\"image/jpeg\",\"size\":54678,\"fileType\":\"image\"},{\"isCoverImage\":true,\"fileName\":\"funny-developer-memes.jpeg\",\"url\":\"ipfs://bafybeihjthsevg7omxjma3ntfpbvv6gbatjlqps4j5iadukyhgt3mdrkre\",\"mimeType\":\"image/jpeg\",\"size\":69480,\"fileType\":\"image\"}],\"gifs\":[],\"hashtags\":[],\"mentions\":[],\"title\":\"First test\",\"createdAt\":\"2024-09-12T16:02:28.367Z\"}"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AidlxNTtkl1dDNCgxrSNVJKYWZdC9yrixvgSAP6U6WYX"},"signature":"eL0BrSdeiqNqguASs+oDSpKuqX/vvvZgCC10/phfcFIbHBy59TrcerRjsJg8YivG0NNNe7zvDGGptHUSAyTQ2g=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g162jgpk4740r6a7g53cgz9ahxqtyuekgqchw6w9","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000005"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AqD4AqUY/VAPgrwGhq7e9Px4Pj81GRDZYwRvm+A69599"},"signature":"EH8B+2U4z4HowFatuGia4PMqz8f4RkbOXMQPoboRXw9/TuQFR0U0xAhejmpyEUbs0he1QHJegDth351aecD6Hw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1enky04sfc4nush29g4ht97x45slz8h3t2peaqc","send":"","pkg_path":"gno.land/r/demo/boards","func":"CreateThread","args":["1","hi ","Var Meta"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwHWnc+LbCuQrKci0ki9Wv02fp+IzdLu1Qdk0cNebTTC"},"signature":"2Xhah+8+yu5M78qF7fV1y9V4CruFlYBNNCHt4jaN8zhBlR6/Okc6R4T2ynB6reNc7YAxeoz3rlfYCJA+CcgfNg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1cpx59z5r8vzeww2fm4ezpz7yvjs7kptywkm864","send":"","pkg_path":"gno.land/r/morgan/guestbook","func":"Sign","args":["\\'); DROP TABLE users;--"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AiUkDPOKGgpjkZRc8zxqbwBhgTsQHa2fspi5PvxiZT11"},"signature":"pyMdMWJrCRfvBYX77+K6HmGWv26Xo/n6f2qPl10IorpWLQaWvvhALpeOpzALUiye8kVu35TfyS28Rt5uk5horA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","pkg_path":"gno.land/r/gnoland/events","func":"AddEvent","args":["Distributed communities: How to Build Timeless and Decentralized apps, with Go","Join our meetup!","https://www.meetup.com/golang-torino/events/303140845/","Turin, Italy","2024-09-23T18:30:00+02:00","2024-09-23T20:30:00+02:00"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"JJgMxzhQ+IaB6t+zLSnVv01CVnvsnttoMChQNMLkLi1p/awrkqm7+CiUutdrhdjDFrriWl8wHEDs7vwyi+SToA=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g162jgpk4740r6a7g53cgz9ahxqtyuekgqchw6w9","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"QjkWuW0vgZ+0UbRjYMNAkD0sqK0xCE/sZ/97Q3RwvNtjc1oQ9fckXZkCogX3lVrAEth8Ce99lwuX4gJDC5hvZw=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1y6yaj334uwdx7kgr9j4fqk3q8sy6xmv3armars","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"vb3BKGAnrYTtIKcJ7kmShCBynYeBMcwNz8vA0heBRTsbxNBb02n+X/dlZOJWPyVZke9iGS01NT5kVQqIB4jYIA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1330dfff36jyy44rgq68y33mzxx9uhrgzyq88wh","send":"100ugnot","pkg_path":"gno.land/r/varmeta/demo/v1/domain/registrar","func":"Register","args":["ngocasd.gno","gnot"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AhsU4msjmCnK33Q/QPsxJX7LgQYk2CD9tgtpMSntVe1F"},"signature":"rdVEjrEq0v0pC9+YoDlCPlvHANcubXJoNm+cFJSbzrERsx8GV/3D8dEkKgNzev9JxQVeyeFzNmYs0N4eERNO3w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"hello","path":"gno.land/r/pkg1","files":[{"name":"a.gno","body":"package hello\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/p/demo/avl\"\n)\n\nvar hello avl.Tree\n\nvar helloMap = make(map[string]string)\n\nfunc init() {\n\tfor i := 0; i \u003c 1000; i++ {\n\t\ts := strconv.Itoa(i)\n\t\thello.Set(s, \"123\")\n\t\thelloMap[s] = \"123\"\n\t}\n}\n\nfunc Render(s string) string {\n\tif s == \"map\" {\n\t\treturn helloMap[\"100\"]\n\t}\n\tres, _ := hello.Get(\"100\")\n\treturn res.(string)\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"100000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"6SJczVB2K9f+WOMMWvPA2QVhvQQVroNaPV1D30QtY5RctrwaW5IWxmQrbmU/+eGq0GTnoKv0VjmBr7n8UDxk+w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g16spe09atej02lcgxwqfpnk6l2ghqvm56z6hsyv","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"JS8SgobsNbqKEus/NPJQvTuuHznW5ji0jpOCcok04Wk1sSTPz76auYgonybWv1N45Q0wg4GFjZRCuMbkqGwA0Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g16spe09atej02lcgxwqfpnk6l2ghqvm56z6hsyv","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000009"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AytBvtveRsnaHgNxVwvLpAY6gvUnY1U0TbUvlHLra3aJ"},"signature":"6D31cetd9Fbq7YxVJ3eabmnxTn1nhGsFTU9sKiR6HZp3jkMJfqp9XVTUcCFFuszM7GEn7Qh7xROIqS/c12Rbsw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g16spe09atej02lcgxwqfpnk6l2ghqvm56z6hsyv","send":"","pkg_path":"gno.land/r/demo/memeland","func":"GetOwner","args":null}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AytBvtveRsnaHgNxVwvLpAY6gvUnY1U0TbUvlHLra3aJ"},"signature":"N3TwD8YRArGlD4rzuGnEUC7DQrA01Vy74ZNF/e6oPA9wfEXzV5Z9whXc21QxclbWKAvvNT2xhW6qAmBwMUHZ3A=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g16spe09atej02lcgxwqfpnk6l2ghqvm56z6hsyv","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000009"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AytBvtveRsnaHgNxVwvLpAY6gvUnY1U0TbUvlHLra3aJ"},"signature":"+cZWmm1yVH+CsBXIcLtDZ4TgjyYHM3WixqulvqCg2SxqDj/MVf1DP6KfXtNsxMPbErkB4Upl261lghP6Nx46gg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g16spe09atej02lcgxwqfpnk6l2ghqvm56z6hsyv","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000002"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AytBvtveRsnaHgNxVwvLpAY6gvUnY1U0TbUvlHLra3aJ"},"signature":"EZ7l6dnArRDXkWmGEBwEf/rPN48aHz4AOPIYan/0YO1xCkW0PzH5A2B5nHBXT+8aWf6fAbjQl6xo/xFarm3YJg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g16spe09atej02lcgxwqfpnk6l2ghqvm56z6hsyv","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["0000005"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AytBvtveRsnaHgNxVwvLpAY6gvUnY1U0TbUvlHLra3aJ"},"signature":"zovB0Ol4DsZjdJSSFUj7YpI+vL0JEORmt19Pz5Q1nJpala1vrD3wGAt1wxVJcxYNjMQiYdmF1fpsTQArGvS0Kg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g16spe09atej02lcgxwqfpnk6l2ghqvm56z6hsyv","send":"","pkg_path":"gno.land/r/demo/memeland","func":"PostMeme","args":["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","1726765282"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AytBvtveRsnaHgNxVwvLpAY6gvUnY1U0TbUvlHLra3aJ"},"signature":"cNncSrGU+aLXwxyJn7qn+ntBhFT0op4g8PJoHlrxym1xB7X+rWIbAcmYfYzIq1iiVm1PkX4OcuzO8jmdqwMdzg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g16spe09atej02lcgxwqfpnk6l2ghqvm56z6hsyv","send":"","pkg_path":"gno.land/r/demo/memeland","func":"PostMeme","args":["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","1726765282"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AytBvtveRsnaHgNxVwvLpAY6gvUnY1U0TbUvlHLra3aJ"},"signature":"d3jQzw8uiOgvUkq7OeByMZS7iUQmJzVKAKoKiwP+cSUY3Dgofv3aTiIhAjQpXRWSaFXmJPj70wvcZmDzv1yjog=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g16spe09atej02lcgxwqfpnk6l2ghqvm56z6hsyv","send":"","pkg_path":"gno.land/r/demo/memeland","func":"PostMeme","args":["data:image/jpeg;base64,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","1726765437"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AytBvtveRsnaHgNxVwvLpAY6gvUnY1U0TbUvlHLra3aJ"},"signature":"/qUXBaItPOA63ttTPWKmQNmEyKP9YZWDxP6umqQMpARVwM1text/ppaS9kmCha0rb4EMfRUdkMimkUErf3syjg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/demo/boards","func":"CreateThread","args":["2","hello world","Hello :)"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"A767O6lHYb/4l6n0o6fxfAh3A8WWGhhZ4lCvuyMwtgV+syvWhalJY7zHwX0iH1Dfu5PsJ41K+sgR1Qw8TSKj+A=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/demo/boards","func":"CreateThread","args":["2","hello world 2","Hello :) 2"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"Brfgu6rMrpFIZp3vobFAHnGwrJU9ihXsTwL0Ba3P0StlM3DoDKQcEjATNRU57v/Ix0RAFQpoYcgVddU43gkGMA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/demo/boards","func":"CreateReply","args":["2","2","2","test"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"F0x3xnO4Q4qDz8eWfmZMf3kaBz2rAld+i2h15MT/DGsf4NZEp7RP0u4lMpOCmj3jd9uHBdikMIV+ZWMPDrzasQ=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g16spe09atej02lcgxwqfpnk6l2ghqvm56z6hsyv","to_address":"g1vpe4yqlcaxtq5adn343j7e6ng9xqalx2mg57ws","amount":"1000000ugnot"}],"fee":{"gas_wanted":"1000000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AytBvtveRsnaHgNxVwvLpAY6gvUnY1U0TbUvlHLra3aJ"},"signature":"IaCh7hfRqtFEhxSIanjx4ciqo00/U5uV63JXAHreKTYAHOIolqdTI8FBK93OeUNev6Gezii1CoGRNIuOZHfvtQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g16spe09atej02lcgxwqfpnk6l2ghqvm56z6hsyv","send":"","pkg_path":"gno.land/r/demo/memeland","func":"Upvote","args":["000000z"]}],"fee":{"gas_wanted":"5000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AytBvtveRsnaHgNxVwvLpAY6gvUnY1U0TbUvlHLra3aJ"},"signature":"9z8ODB9OkLOR1/tFiPpcrz5Dl0yx0vFK84m58WUjpAYmV+w6ce+94RpwJDzVUhasnt0wyAGIH5c+q99ItXGZdw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/demo/users","func":"Invite","args":["g1manfred47kzduec920z88wfr64ylksmdcedlf5"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"uKTI3EGedNEOk07c+gKAl3zEID6gtBcd9I6yKdk0r1EKjHqq9MnvF6A6SKitXHwY1OK2+ItPP6yhy7fOZmqcIg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","to_address":"g1manfred47kzduec920z88wfr64ylksmdcedlf5","amount":"100000000ugnot"}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"9vJvyn/I0M5l3KLCs0YHHoipj9bjDjFfwdJmM1Srjtk5SR4E2nZe5qKspTM2/j4isYfdDj0Oe8/diBDQBjbGZA=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1manfred47kzduec920z88wfr64ylksmdcedlf5","send":"","pkg_path":"gno.land/r/demo/users","func":"Register","args":["g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","moul","https://github.com/moul"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AgBSSj+NLAA6icQ/Rf6vbrjtRbbjo197vms7Sf+eLYPI"},"signature":"fLsat31yeNaFGv9Ley+y9aTCCImwplCXtgNfY1u0Jd1lEXyDDUie0L/IYjzriA/enjjNHYWO+4zzzZiImLLUXg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"ptrregistry","path":"gno.land/r/leon/issues/ptrregistry","files":[{"name":"package.gno","body":"package ptrregistry\n\nvar Intptrslice []*int\n\nfunc Render(_ string) string {\n\tout := \"\"\n\tfor _, i := range Intptrslice {\n\t\tout += ufmt.Sprintf(\"%d, \", i)\n\t}\n\n\treturn out\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"eqhK+XBLQMe3FoYLJx6sbI/g/zA9dWF1vCuGf7VrcSUu8xijcZxYGPORArpnZaWPI9qdGQa01QDZUygQMa520g=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"ptrregistry","path":"gno.land/r/leon/issues/ptrregistry","files":[{"name":"package.gno","body":"package ptrregistry\n\nimport (\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar Intptrslice []*int\n\nfunc Render(_ string) string {\n\tout := \"\"\n\tfor _, i := range Intptrslice {\n\t\tout += ufmt.Sprintf(\"%d, \", i)\n\t}\n\n\treturn out\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"oJsQClwnni5PGLDDzSCn4ElEHmWQpsOJnf3zfDb0uuMLnZwVpVLOnm07OzvekZZBk9TxlQx0sVOO4+8nLreHgg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"v1","path":"gno.land/r/leon/issues/ptrregistry/v1","files":[{"name":"package.gno","body":"package ptrregistry\n\nimport (\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar Intptrslice = make([]*int, 10)\n\nfunc Render(_ string) string {\n\tout := \"\"\n\tfor _, i := range Intptrslice {\n\t\tout += ufmt.Sprintf(\"%d, \", i)\n\t}\n\n\treturn out\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"AsnutUOEsKovDFqGEUKFxPrih+Q9BMXMJiYhYX3JWdgJK1gpsP2q0CDj+8wucvxkrkxIjicnnhRGGJGQXxmS2A=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"ptrregistry","path":"gno.land/r/leon/issues/v1/ptrregistry","files":[{"name":"package.gno","body":"package ptrregistry\n\nimport (\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar Intptrslice = make([]*int, 10)\n\nfunc Render(_ string) string {\n\tout := \"\"\n\tfor _, i := range Intptrslice {\n\t\tout += ufmt.Sprintf(\"%d, \", i)\n\t}\n\n\treturn out\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"/gkjkweE8Sb3wDSjXKbS0UOjZwxyG791Rx4UuItjtrstJLyAGTPCyoUxpcSP6OdqIUmdLJeGbdGfoCycLW3T7A=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_run","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","package":{"name":"main","path":"gno.land/r/g125em6arxsnj49vx35f0n0z34putv5ty3376fg5/run","files":[{"name":"script.gno","body":"package main\n\nimport (\n\t\"gno.land/r/leon/issues/v1/ptrregistry\"\n)\n\nfunc main() {\n\n\tfor i := 0; i \u003c 5; i++ {\n\t\tptrregistry.Intptrslice[i] = \u0026i\n\t}\n\n}\n"}]}}],"fee":{"gas_wanted":"20000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"xH7e9iWDYbH2VD3ERPbNumiNR2WjrWHDoE7/pTfFsdRsV9NCz/l/W0fkXmohjPJamGr0VGZdigogjfb6wlg1Ag=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","package":{"name":"ptrregistry","path":"gno.land/r/leon/issues/v2/ptrregistry","files":[{"name":"package.gno","body":"package ptrregistry\n\nimport (\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar Intptrslice = make([]*int, 10)\n\nfunc Render(_ string) string {\n\tout := \"\"\n\tfor _, i := range Intptrslice {\n\t\tout += ufmt.Sprintf(\"ptr: %d, val:%d\\n\", i, *i)\n\t}\n\n\treturn out\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"OybQJ/Bezp60+XMTcfYZHg2RPB3sPCrDrb0tYG33LAMpA/LpbGFB6+5jyLgEmTN0Qi8Bd9xdFijTeXYNFGP8Mg=="}],"memo":"Deployed through play.gno.land"} +{"msg":[{"@type":"/vm.m_run","caller":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","send":"","package":{"name":"main","path":"gno.land/r/g125em6arxsnj49vx35f0n0z34putv5ty3376fg5/run","files":[{"name":"script.gno","body":"package main\n\nimport (\n\t\"gno.land/r/leon/issues/v2/ptrregistry\"\n)\n\nfunc main() {\n\n\tfor i := 0; i \u003c 5; i++ {\n\t\tptrregistry.Intptrslice[i] = \u0026i\n\t}\n\n}\n"}]}}],"fee":{"gas_wanted":"20000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A4vbt/RTXs3UWUQZdg7W6glviY2ighS0MzoQ/HOb53Wy"},"signature":"39T4i6LXcujktRXi2WScaipJAR5mzU9jzKHqhEtoCbl+TFarbsXBPkcKTvmjFqp99wf6+sVDpHCScKNkzF5W4w=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g18l9us6trqaljw39j94wzf5ftxmd9qqkvrxghd2","to_address":"g16spe09atej02lcgxwqfpnk6l2ghqvm56z6hsyv","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AxjyQBsJI8CesbgwihvS/eQtYKoezyoA9P+FRlLAKRwg"},"signature":"JS8SgobsNbqKEus/NPJQvTuuHznW5ji0jpOCcok04Wk1sSTPz76auYgonybWv1N45Q0wg4GFjZRCuMbkqGwA0Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g16spe09atej02lcgxwqfpnk6l2ghqvm56z6hsyv","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"PostExists","args":["discover-gno-gc24"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AytBvtveRsnaHgNxVwvLpAY6gvUnY1U0TbUvlHLra3aJ"},"signature":"dcjSB0T78z5COgunxEsnNQsuxIkblVHYjtEC7u7tSCI4Yb0NWustiMj0Vyc5wU0j1ZTXwxbpv5VDxrALlKV4Cg=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g16spe09atej02lcgxwqfpnk6l2ghqvm56z6hsyv","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"AddComment","args":["discover-gno-gc24","Good to see!. BTW is this comment going to be broadcasted and stored in all Portal Loop nodes?"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AytBvtveRsnaHgNxVwvLpAY6gvUnY1U0TbUvlHLra3aJ"},"signature":"lVBgPMfIG4pTJl/zEjUKHLADnpCPcg1n1g0Gd/tQmKAGf5DGLt1MhP9vntKI7OHtcjYkqietSXXuvWBIBJjfYA=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/vm.m_call","caller":"g16spe09atej02lcgxwqfpnk6l2ghqvm56z6hsyv","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddCommenter","args":["g16spe09atej02lcgxwqfpnk6l2ghqvm56z6hsyv"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AytBvtveRsnaHgNxVwvLpAY6gvUnY1U0TbUvlHLra3aJ"},"signature":"wJx9ZnXRABwPIwd9wprlyJ9tOMl57tuJQbSzbNvE0nkKWix7llRik0jeKWjKYc16wqzB8COpQ3BC+gw4atVijQ=="}],"memo":"Called through gno.studio"} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1k5apa2pxkug7nfaxcs2lp0cxc86yrczfjmpsv2","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"EhI4+Jdbap+3SGBqDFmpgRIGkwLBsYpOv2BQK0bkmZASzbvnXryHqZ26n9GkbhIl3zmE+1sv3yP5tEX7AuNdkw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","send":"","pkg_path":"gno.land/r/demo/memeland","func":"PostMeme","args":["data:image/jpeg;base64,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tAgggEdq8DCQrOBW2hQBr2+wH1z614UbhjAxW2vMUAavK2qykD2r1CNueAB6AVtrygAJGAKYvXX/AAP6t/zByn3TE66/4H9W/wCYOUAQ/wBEf8XHVn9CT/omhQ6I/wCLjqz+hJ/0TQoAs3QoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABTE66/4H9W/5g5T7piddf8AA/q3/MHKAIf6I/4uOrP6En/RNCh0R/xcdWf0JP8AomhQBZuhQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUACmJ11/wP6t/wAwcp90xOuv+B/Vv+YOUAQ/0R/xcdWf0JP+iaFDoj/i46s/oSf9E0KALN0KFCgAUK8zQzQB7QrzIoZpreAPaFeZrErpU8gZ0K1lQB/9FeFwDvnFKIzbQrWFj0rIqwMntQKek817Wkq5717v/wDXFA3JsyK9rVuP41kFHFJkVGdCsd1eFdKKZZr2tW/nArIHnvQBnQrzNeZoAyoVrKu9AHI9qblAZ5Fe1qNAKpwmTbQrEHFe7h70CntCvMihuFNygPaFeZzXhNOAyoVhn8aG78aAM6FeZrzJ9qAMqFebvehkUAe0K8zQzQB7QrysFO7aANlCtPm5P3TWQVkdjQJk2UK15/GvSrA70CZM6Fa9wr3dxnNAuTOhWAUB617uB7GgUyoVh2r3PbAoAyoV5nmhnNAHtCteRXpVwKBuTOhWvdjP0rLduTQGT0HJr2tecGhkU1sVM2UKwC/oa93H2pRTKhWGaAP404bkyoZrEHJ/214VY7ijAZNlCsA4O1elWPakFye5r2tZODishQGTKhXmeK8JzQKe5pi9df8A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","1727362988"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AidlxNTtkl1dDNCgxrSNVJKYWZdC9yrixvgSAP6U6WYX"},"signature":"Vx6tk1FskMHCYk55p9MTaC714VC+IxelMfG9BUbzsSsljBkhCCA4yLUEuPl+ITzz78YjLOPPaTmDe+fLrauvUg=="}],"memo":""} diff --git a/portal-loop/export.sh b/portal-loop/export.sh index f077e27e..db7314a2 100755 --- a/portal-loop/export.sh +++ b/portal-loop/export.sh @@ -35,6 +35,8 @@ if [[ -z "$latest_backup_file" ]]; then # just save file echo "Saving first time" cp $backup_name ../$POTENTIAL_BACKUP_NAME + rm -rf $TMP_DIR + exit 0 else echo "Latest backup file: $latest_backup_file" From 418ed9b384345f1c74bc37853acdba8c66d06851 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Milo=C5=A1=20=C5=BDivkovi=C4=87?= Date: Fri, 27 Sep 2024 18:59:07 +0200 Subject: [PATCH 03/10] Clean up the export script --- ...nl => backup_portal.loop.1727456271.jsonl} | 40 ++++----- portal-loop/export.sh | 84 +++++++++++-------- 2 files changed, 71 insertions(+), 53 deletions(-) rename portal-loop/{backup.portal.loop.1727441951.jsonl => backup_portal.loop.1727456271.jsonl} (99%) diff --git a/portal-loop/backup.portal.loop.1727441951.jsonl b/portal-loop/backup_portal.loop.1727456271.jsonl similarity index 99% rename from portal-loop/backup.portal.loop.1727441951.jsonl rename to portal-loop/backup_portal.loop.1727456271.jsonl index 1b3bc76e..b443612c 100755 --- a/portal-loop/backup.portal.loop.1727441951.jsonl +++ b/portal-loop/backup_portal.loop.1727456271.jsonl @@ -33,7 +33,7 @@ {"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"grc777","path":"gno.land/p/demo/grc/grc777","files":[{"name":"dummy_test.gno","body":"package grc777\n\nimport (\n\t\"std\"\n\t\"testing\"\n)\n\ntype dummyImpl struct{}\n\n// FIXME: this should fail.\nvar _ IGRC777 = (*dummyImpl)(nil)\n\nfunc TestInterface(t *testing.T) {\n\tvar dummy IGRC777 = \u0026dummyImpl{}\n}\n\nfunc (impl *dummyImpl) GetName() string { panic(\"not implemented\") }\nfunc (impl *dummyImpl) GetSymbol() string { panic(\"not implemented\") }\nfunc (impl *dummyImpl) GetDecimals() uint { panic(\"not implemented\") }\nfunc (impl *dummyImpl) Granularity() (granularity uint64) { panic(\"not implemented\") }\nfunc (impl *dummyImpl) TotalSupply() (supply uint64) { panic(\"not implemented\") }\nfunc (impl *dummyImpl) BalanceOf(address std.Address) uint64 { panic(\"not implemented\") }\nfunc (impl *dummyImpl) Burn(amount uint64, data []byte) { panic(\"not implemented\") }\nfunc (impl *dummyImpl) AuthorizeOperator(operator std.Address) { panic(\"not implemented\") }\nfunc (impl *dummyImpl) RevokeOperator(operators std.Address) { panic(\"not implemented\") }\nfunc (impl *dummyImpl) DefaultOperators() []std.Address { panic(\"not implemented\") }\nfunc (impl *dummyImpl) Send(recipient std.Address, amount uint64, data []byte) {\n\tpanic(\"not implemented\")\n}\n\nfunc (impl *dummyImpl) IsOperatorFor(operator, tokenHolder std.Address) bool {\n\tpanic(\"not implemented\")\n}\n\nfunc (impl *dummyImpl) OperatorSend(sender, recipient std.Address, amount uint64, data, operatorData []byte) {\n\tpanic(\"not implemented\")\n}\n\nfunc (impl *dummyImpl) OperatorBurn(account std.Address, amount uint64, data, operatorData []byte) {\n\tpanic(\"not implemented\")\n}\n"},{"name":"igrc777.gno","body":"package grc777\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/grc/exts\"\n)\n\n// TODO: use big.Int or a custom uint64 instead of uint64\n\ntype IGRC777 interface {\n\texts.TokenMetadata\n\n\t// Returns the smallest part of the token that is not divisible. This\n\t// means all token operations (creation, movement and destruction) must\n\t// have amounts that are a multiple of this number.\n\t//\n\t// For most token contracts, this value will equal 1.\n\tGranularity() (granularity uint64)\n\n\t// Returns the amount of tokens in existence.\n\tTotalSupply() (supply uint64)\n\n\t// Returns the amount of tokens owned by an account (`owner`).\n\tBalanceOf(address std.Address) uint64\n\n\t// Moves `amount` tokens from the caller's account to `recipient`.\n\t//\n\t// If send or receive hooks are registered for the caller and `recipient`,\n\t// the corresponding functions will be called with `data` and empty\n\t// `operatorData`. See {IERC777Sender} and {IERC777Recipient}.\n\t//\n\t// Emits a {Sent} event.\n\t//\n\t// Requirements\n\t//\n\t// - the caller must have at least `amount` tokens.\n\t// - `recipient` cannot be the zero address.\n\t// - if `recipient` is a contract, it must implement the {IERC777Recipient}\n\t// interface.\n\tSend(recipient std.Address, amount uint64, data []byte)\n\n\t// Destroys `amount` tokens from the caller's account, reducing the\n\t// total supply.\n\t//\n\t// If a send hook is registered for the caller, the corresponding function\n\t// will be called with `data` and empty `operatorData`. See {IERC777Sender}.\n\t//\n\t// Emits a {Burned} event.\n\t//\n\t// Requirements\n\t//\n\t// - the caller must have at least `amount` tokens.\n\tBurn(amount uint64, data []byte)\n\n\t// Returns true if an account is an operator of `tokenHolder`.\n\t// Operators can send and burn tokens on behalf of their owners. All\n\t// accounts are their own operator.\n\t//\n\t// See {operatorSend} and {operatorBurn}.\n\tIsOperatorFor(operator, tokenHolder std.Address) bool\n\n\t// Make an account an operator of the caller.\n\t//\n\t// See {isOperatorFor}.\n\t//\n\t// Emits an {AuthorizedOperator} event.\n\t//\n\t// Requirements\n\t//\n\t// - `operator` cannot be calling address.\n\tAuthorizeOperator(operator std.Address)\n\n\t// Revoke an account's operator status for the caller.\n\t//\n\t// See {isOperatorFor} and {defaultOperators}.\n\t//\n\t// Emits a {RevokedOperator} event.\n\t//\n\t// Requirements\n\t//\n\t// - `operator` cannot be calling address.\n\tRevokeOperator(operators std.Address)\n\n\t// Returns the list of default operators. These accounts are operators\n\t// for all token holders, even if {authorizeOperator} was never called on\n\t// them.\n\t//\n\t// This list is immutable, but individual holders may revoke these via\n\t// {revokeOperator}, in which case {isOperatorFor} will return false.\n\tDefaultOperators() []std.Address\n\n\t// Moves `amount` tokens from `sender` to `recipient`. The caller must\n\t// be an operator of `sender`.\n\t//\n\t// If send or receive hooks are registered for `sender` and `recipient`,\n\t// the corresponding functions will be called with `data` and\n\t// `operatorData`. See {IERC777Sender} and {IERC777Recipient}.\n\t//\n\t// Emits a {Sent} event.\n\t//\n\t// Requirements\n\t//\n\t// - `sender` cannot be the zero address.\n\t// - `sender` must have at least `amount` tokens.\n\t// - the caller must be an operator for `sender`.\n\t// - `recipient` cannot be the zero address.\n\t// - if `recipient` is a contract, it must implement the {IERC777Recipient}\n\t// interface.\n\tOperatorSend(sender, recipient std.Address, amount uint64, data, operatorData []byte)\n\n\t// Destroys `amount` tokens from `account`, reducing the total supply.\n\t// The caller must be an operator of `account`.\n\t//\n\t// If a send hook is registered for `account`, the corresponding function\n\t// will be called with `data` and `operatorData`. See {IERC777Sender}.\n\t//\n\t// Emits a {Burned} event.\n\t//\n\t// Requirements\n\t//\n\t// - `account` cannot be the zero address.\n\t// - `account` must have at least `amount` tokens.\n\t// - the caller must be an operator for `account`.\n\tOperatorBurn(account std.Address, amount uint64, data, operatorData []byte)\n}\n\n// Emitted when `amount` tokens are created by `operator` and assigned to `to`.\n//\n// Note that some additional user `data` and `operatorData` can be logged in the event.\ntype MintedEvent struct {\n\tOperator std.Address\n\tTo std.Address\n\tAmount uint64\n\tData []byte\n\tOperatorData []byte\n}\n\n// Emitted when `operator` destroys `amount` tokens from `account`.\n//\n// Note that some additional user `data` and `operatorData` can be logged in the event.\ntype BurnedEvent struct {\n\tOperator std.Address\n\tFrom std.Address\n\tAmount uint64\n\tData []byte\n\tOperatorData []byte\n}\n\n// Emitted when `operator` is made operator for `tokenHolder`\ntype AuthorizedOperatorEvent struct {\n\tOperator std.Address\n\tTokenHolder std.Address\n}\n\n// Emitted when `operator` is revoked its operator status for `tokenHolder`.\ntype RevokedOperatorEvent struct {\n\tOperator std.Address\n\tTokenHolder std.Address\n}\n\ntype SentEvent struct {\n\tOperator std.Address\n\tFrom std.Address\n\tTo std.Address\n\tAmount uint64\n\tData []byte\n\tOperatorData []byte\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} {"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"rat","path":"gno.land/p/demo/rat","files":[{"name":"maths.gno","body":"package rat\n\nconst (\n\tintSize = 32 \u003c\u003c (^uint(0) \u003e\u003e 63) // 32 or 64\n\n\tMaxInt = 1\u003c\u003c(intSize-1) - 1\n\tMinInt = -1 \u003c\u003c (intSize - 1)\n\tMaxInt8 = 1\u003c\u003c7 - 1\n\tMinInt8 = -1 \u003c\u003c 7\n\tMaxInt16 = 1\u003c\u003c15 - 1\n\tMinInt16 = -1 \u003c\u003c 15\n\tMaxInt32 = 1\u003c\u003c31 - 1\n\tMinInt32 = -1 \u003c\u003c 31\n\tMaxInt64 = 1\u003c\u003c63 - 1\n\tMinInt64 = -1 \u003c\u003c 63\n\tMaxUint = 1\u003c\u003cintSize - 1\n\tMaxUint8 = 1\u003c\u003c8 - 1\n\tMaxUint16 = 1\u003c\u003c16 - 1\n\tMaxUint32 = 1\u003c\u003c32 - 1\n\tMaxUint64 = 1\u003c\u003c64 - 1\n)\n"},{"name":"rat.gno","body":"package rat\n\n//----------------------------------------\n// Rat fractions\n\n// represents a fraction.\ntype Rat struct {\n\tX int32\n\tY int32 // must be positive\n}\n\nfunc NewRat(x, y int32) Rat {\n\tif y \u003c= 0 {\n\t\tpanic(\"invalid std.Rat denominator\")\n\t}\n\treturn Rat{X: x, Y: y}\n}\n\nfunc (r1 Rat) IsValid() bool {\n\tif r1.Y \u003c= 0 {\n\t\treturn false\n\t}\n\treturn true\n}\n\nfunc (r1 Rat) Cmp(r2 Rat) int {\n\tif !r1.IsValid() {\n\t\tpanic(\"invalid std.Rat left operand\")\n\t}\n\tif !r2.IsValid() {\n\t\tpanic(\"invalid std.Rat right operand\")\n\t}\n\tvar p1, p2 int64\n\tp1 = int64(r1.X) * int64(r2.Y)\n\tp2 = int64(r1.Y) * int64(r2.X)\n\tif p1 \u003c p2 {\n\t\treturn -1\n\t} else if p1 == p2 {\n\t\treturn 0\n\t} else {\n\t\treturn 1\n\t}\n}\n\n//func (r1 Rat) Plus(r2 Rat) Rat {\n// XXX\n//}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} {"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"users","path":"gno.land/p/demo/users","files":[{"name":"types.gno","body":"package users\n\ntype AddressOrName string\n\nfunc (aon AddressOrName) IsName() bool {\n\treturn aon != \"\" \u0026\u0026 aon[0] == '@'\n}\n\nfunc (aon AddressOrName) GetName() (string, bool) {\n\tif len(aon) \u003e= 2 \u0026\u0026 aon[0] == '@' {\n\t\treturn string(aon[1:]), true\n\t}\n\treturn \"\", false\n}\n"},{"name":"users.gno","body":"package users\n\nimport (\n\t\"std\"\n\t\"strconv\"\n)\n\n//----------------------------------------\n// Types\n\ntype User struct {\n\tAddress std.Address\n\tName string\n\tProfile string\n\tNumber int\n\tInvites int\n\tInviter std.Address\n}\n\nfunc (u *User) Render() string {\n\tstr := \"## user \" + u.Name + \"\\n\" +\n\t\t\"\\n\" +\n\t\t\" * address = \" + string(u.Address) + \"\\n\" +\n\t\t\" * \" + strconv.Itoa(u.Invites) + \" invites\\n\"\n\tif u.Inviter != \"\" {\n\t\tstr = str + \" * invited by \" + string(u.Inviter) + \"\\n\"\n\t}\n\tstr = str + \"\\n\" +\n\t\tu.Profile + \"\\n\"\n\treturn str\n}\n"},{"name":"users_test.gno","body":"package users\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} -{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"users","path":"gno.land/r/demo/users","files":[{"name":"preregister.gno","body":"package users\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/users\"\n)\n\n// pre-restricted names\nvar preRestrictedNames = []string{\n\t\"bitcoin\", \"cosmos\", \"newtendermint\", \"ethereum\",\n}\n\n// pre-registered users\nvar preRegisteredUsers = []struct {\n\tName string\n\tAddress std.Address\n}{\n\t// system name\n\t{\"archives\", \"g1xlnyjrnf03ju82v0f98ruhpgnquk28knmjfe5k\"}, // -\u003e @r_archives\n\t{\"demo\", \"g13ek2zz9qurzynzvssyc4sthwppnruhnp0gdz8n\"}, // -\u003e @r_demo\n\t{\"gno\", \"g19602kd9tfxrfd60sgreadt9zvdyyuudcyxsz8a\"}, // -\u003e @r_gno\n\t{\"gnoland\", \"g1g3lsfxhvaqgdv4ccemwpnms4fv6t3aq3p5z6u7\"}, // -\u003e @r_gnoland\n\t{\"gnolang\", \"g1yjlnm3z2630gg5mryjd79907e0zx658wxs9hnd\"}, // -\u003e @r_gnolang\n\t{\"gov\", \"g1g73v2anukg4ej7axwqpthsatzrxjsh0wk797da\"}, // -\u003e @r_gov\n\t{\"nt\", \"g15ge0ae9077eh40erwrn2eq0xw6wupwqthpv34l\"}, // -\u003e @r_nt\n\t{\"sys\", \"g1r929wt2qplfawe4lvqv9zuwfdcz4vxdun7qh8l\"}, // -\u003e @r_sys\n\t{\"x\", \"g164sdpew3c2t3rvxj3kmfv7c7ujlvcw2punzzuz\"}, // -\u003e @r_x\n\n\t// test1 user\n\t{\"test1\", \"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\"}, // -\u003e @test1\n}\n\nfunc init() {\n\t// add pre-registered users\n\tfor _, res := range preRegisteredUsers {\n\t\t// assert not already registered.\n\t\t_, ok := name2User.Get(res.Name)\n\t\tif ok {\n\t\t\tpanic(\"name already registered\")\n\t\t}\n\n\t\t_, ok = addr2User.Get(res.Address.String())\n\t\tif ok {\n\t\t\tpanic(\"address already registered\")\n\t\t}\n\n\t\tcounter++\n\t\tuser := \u0026users.User{\n\t\t\tAddress: res.Address,\n\t\t\tName: res.Name,\n\t\t\tProfile: \"\",\n\t\t\tNumber: counter,\n\t\t\tInvites: int(0),\n\t\t\tInviter: admin,\n\t\t}\n\t\tname2User.Set(res.Name, user)\n\t\taddr2User.Set(res.Address.String(), user)\n\t}\n\n\t// add pre-restricted names\n\tfor _, name := range preRestrictedNames {\n\t\tif _, ok := name2User.Get(name); ok {\n\t\t\tpanic(\"name already registered\")\n\t\t}\n\n\t\trestricted.Set(name, true)\n\t}\n}\n"},{"name":"users.gno","body":"package users\n\nimport (\n\t\"regexp\"\n\t\"std\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/avlhelpers\"\n\t\"gno.land/p/demo/users\"\n)\n\n//----------------------------------------\n// State\n\nvar (\n\tadmin std.Address = \"g1manfred47kzduec920z88wfr64ylksmdcedlf5\" // @moul\n\n\trestricted avl.Tree // Name -\u003e true - restricted name\n\tname2User avl.Tree // Name -\u003e *users.User\n\taddr2User avl.Tree // std.Address -\u003e *users.User\n\tinvites avl.Tree // string(inviter+\":\"+invited) -\u003e true\n\tcounter int // user id counter\n\tminFee int64 = 20 * 1_000_000 // minimum gnot must be paid to register.\n\tmaxFeeMult int64 = 10 // maximum multiples of minFee accepted.\n)\n\n//----------------------------------------\n// Top-level functions\n\nfunc Register(inviter std.Address, name string, profile string) {\n\t// assert CallTx call.\n\tstd.AssertOriginCall()\n\t// assert invited or paid.\n\tcaller := std.GetCallerAt(2)\n\tif caller != std.GetOrigCaller() {\n\t\tpanic(\"should not happen\") // because std.AssertOrigCall().\n\t}\n\n\tsentCoins := std.GetOrigSend()\n\tminCoin := std.NewCoin(\"ugnot\", minFee)\n\n\tif inviter == \"\" {\n\t\t// banker := std.GetBanker(std.BankerTypeOrigSend)\n\t\tif len(sentCoins) == 1 \u0026\u0026 sentCoins[0].IsGTE(minCoin) {\n\t\t\tif sentCoins[0].Amount \u003e minFee*maxFeeMult {\n\t\t\t\tpanic(\"payment must not be greater than \" + strconv.Itoa(int(minFee*maxFeeMult)))\n\t\t\t} else {\n\t\t\t\t// ok\n\t\t\t}\n\t\t} else {\n\t\t\tpanic(\"payment must not be less than \" + strconv.Itoa(int(minFee)))\n\t\t}\n\t} else {\n\t\tinvitekey := inviter.String() + \":\" + caller.String()\n\t\t_, ok := invites.Get(invitekey)\n\t\tif !ok {\n\t\t\tpanic(\"invalid invitation\")\n\t\t}\n\t\tinvites.Remove(invitekey)\n\t}\n\n\t// assert not already registered.\n\t_, ok := name2User.Get(name)\n\tif ok {\n\t\tpanic(\"name already registered: \" + name)\n\t}\n\t_, ok = addr2User.Get(caller.String())\n\tif ok {\n\t\tpanic(\"address already registered: \" + caller.String())\n\t}\n\n\tisInviterAdmin := inviter == admin\n\n\t// check for restricted name\n\tif _, isRestricted := restricted.Get(name); isRestricted {\n\t\t// only address invite by the admin can register restricted name\n\t\tif !isInviterAdmin {\n\t\t\tpanic(\"restricted name: \" + name)\n\t\t}\n\n\t\trestricted.Remove(name)\n\t}\n\n\t// assert name is valid.\n\t// admin inviter can bypass name restriction\n\tif !isInviterAdmin \u0026\u0026 !reName.MatchString(name) {\n\t\tpanic(\"invalid name: \" + name + \" (must be at least 6 characters, lowercase alphanumeric with underscore)\")\n\t}\n\n\t// remainder of fees go toward invites.\n\tinvites := int(0)\n\tif len(sentCoins) == 1 {\n\t\tif sentCoins[0].Denom == \"ugnot\" \u0026\u0026 sentCoins[0].Amount \u003e= minFee {\n\t\t\tinvites = int(sentCoins[0].Amount / minFee)\n\t\t\tif inviter == \"\" \u0026\u0026 invites \u003e 0 {\n\t\t\t\tinvites -= 1\n\t\t\t}\n\t\t}\n\t}\n\t// register.\n\tcounter++\n\tuser := \u0026users.User{\n\t\tAddress: caller,\n\t\tName: name,\n\t\tProfile: profile,\n\t\tNumber: counter,\n\t\tInvites: invites,\n\t\tInviter: inviter,\n\t}\n\tname2User.Set(name, user)\n\taddr2User.Set(caller.String(), user)\n}\n\nfunc Invite(invitee string) {\n\t// assert CallTx call.\n\tstd.AssertOriginCall()\n\t// get caller/inviter.\n\tcaller := std.GetCallerAt(2)\n\tif caller != std.GetOrigCaller() {\n\t\tpanic(\"should not happen\") // because std.AssertOrigCall().\n\t}\n\tlines := strings.Split(invitee, \"\\n\")\n\tif caller == admin {\n\t\t// nothing to do, all good\n\t} else {\n\t\t// ensure has invites.\n\t\tuserI, ok := addr2User.Get(caller.String())\n\t\tif !ok {\n\t\t\tpanic(\"user unknown\")\n\t\t}\n\t\tuser := userI.(*users.User)\n\t\tif user.Invites \u003c= 0 {\n\t\t\tpanic(\"user has no invite tokens\")\n\t\t}\n\t\tuser.Invites -= len(lines)\n\t\tif user.Invites \u003c 0 {\n\t\t\tpanic(\"user has insufficient invite tokens\")\n\t\t}\n\t}\n\t// for each line...\n\tfor _, line := range lines {\n\t\tif line == \"\" {\n\t\t\tcontinue // file bodies have a trailing newline.\n\t\t} else if strings.HasPrefix(line, `//`) {\n\t\t\tcontinue // comment\n\t\t}\n\t\t// record invite.\n\t\tinvitekey := string(caller) + \":\" + string(line)\n\t\tinvites.Set(invitekey, true)\n\t}\n}\n\nfunc GrantInvites(invites string) {\n\t// assert CallTx call.\n\tstd.AssertOriginCall()\n\t// assert admin.\n\tcaller := std.GetCallerAt(2)\n\tif caller != std.GetOrigCaller() {\n\t\tpanic(\"should not happen\") // because std.AssertOrigCall().\n\t}\n\tif caller != admin {\n\t\tpanic(\"unauthorized\")\n\t}\n\t// for each line...\n\tlines := strings.Split(invites, \"\\n\")\n\tfor _, line := range lines {\n\t\tif line == \"\" {\n\t\t\tcontinue // file bodies have a trailing newline.\n\t\t} else if strings.HasPrefix(line, `//`) {\n\t\t\tcontinue // comment\n\t\t}\n\t\t// parse name and invites.\n\t\tvar name string\n\t\tvar invites int\n\t\tparts := strings.Split(line, \":\")\n\t\tif len(parts) == 1 { // short for :1.\n\t\t\tname = parts[0]\n\t\t\tinvites = 1\n\t\t} else if len(parts) == 2 {\n\t\t\tname = parts[0]\n\t\t\tinvites_, err := strconv.Atoi(parts[1])\n\t\t\tif err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t\tinvites = int(invites_)\n\t\t} else {\n\t\t\tpanic(\"should not happen\")\n\t\t}\n\t\t// give invites.\n\t\tuserI, ok := name2User.Get(name)\n\t\tif !ok {\n\t\t\t// maybe address.\n\t\t\tuserI, ok = addr2User.Get(name)\n\t\t\tif !ok {\n\t\t\t\tpanic(\"invalid user \" + name)\n\t\t\t}\n\t\t}\n\t\tuser := userI.(*users.User)\n\t\tuser.Invites += invites\n\t}\n}\n\n// Any leftover fees go toward invitations.\nfunc SetMinFee(newMinFee int64) {\n\t// assert CallTx call.\n\tstd.AssertOriginCall()\n\t// assert admin caller.\n\tcaller := std.GetCallerAt(2)\n\tif caller != admin {\n\t\tpanic(\"unauthorized\")\n\t}\n\t// update global variables.\n\tminFee = newMinFee\n}\n\n// This helps prevent fat finger accidents.\nfunc SetMaxFeeMultiple(newMaxFeeMult int64) {\n\t// assert CallTx call.\n\tstd.AssertOriginCall()\n\t// assert admin caller.\n\tcaller := std.GetCallerAt(2)\n\tif caller != admin {\n\t\tpanic(\"unauthorized\")\n\t}\n\t// update global variables.\n\tmaxFeeMult = newMaxFeeMult\n}\n\n//----------------------------------------\n// Exposed public functions\n\nfunc GetUserByName(name string) *users.User {\n\tuserI, ok := name2User.Get(name)\n\tif !ok {\n\t\treturn nil\n\t}\n\treturn userI.(*users.User)\n}\n\nfunc GetUserByAddress(addr std.Address) *users.User {\n\tuserI, ok := addr2User.Get(addr.String())\n\tif !ok {\n\t\treturn nil\n\t}\n\treturn userI.(*users.User)\n}\n\n// unlike GetUserByName, input must be \"@\" prefixed for names.\nfunc GetUserByAddressOrName(input users.AddressOrName) *users.User {\n\tname, isName := input.GetName()\n\tif isName {\n\t\treturn GetUserByName(name)\n\t}\n\treturn GetUserByAddress(std.Address(input))\n}\n\n// Get a list of user names starting from the given prefix. Limit the\n// number of results to maxResults. (This can be used for a name search tool.)\nfunc ListUsersByPrefix(prefix string, maxResults int) []string {\n\treturn avlhelpers.ListByteStringKeysByPrefix(name2User, prefix, maxResults)\n}\n\nfunc Resolve(input users.AddressOrName) std.Address {\n\tname, isName := input.GetName()\n\tif !isName {\n\t\treturn std.Address(input) // TODO check validity\n\t}\n\n\tuser := GetUserByName(name)\n\treturn user.Address\n}\n\n// Add restricted name to the list\nfunc AdminAddRestrictedName(name string) {\n\t// assert CallTx call.\n\tstd.AssertOriginCall()\n\t// get caller\n\tcaller := std.GetOrigCaller()\n\t// assert admin\n\tif caller != admin {\n\t\tpanic(\"unauthorized\")\n\t}\n\n\tif user := GetUserByName(name); user != nil {\n\t\tpanic(\"already registered name\")\n\t}\n\n\t// register restricted name\n\n\trestricted.Set(name, true)\n}\n\n//----------------------------------------\n// Constants\n\n// NOTE: name length must be clearly distinguishable from a bech32 address.\nvar reName = regexp.MustCompile(`^[a-z]+[_a-z0-9]{5,16}$`)\n\n//----------------------------------------\n// Render main page\n\nfunc Render(path string) string {\n\tif path == \"\" {\n\t\treturn renderHome()\n\t} else if len(path) \u003e= 38 { // 39? 40?\n\t\tif path[:2] != \"g1\" {\n\t\t\treturn \"invalid address \" + path\n\t\t}\n\t\tuser := GetUserByAddress(std.Address(path))\n\t\tif user == nil {\n\t\t\t// TODO: display basic information about account.\n\t\t\treturn \"unknown address \" + path\n\t\t}\n\t\treturn user.Render()\n\t} else {\n\t\tuser := GetUserByName(path)\n\t\tif user == nil {\n\t\t\treturn \"unknown username \" + path\n\t\t}\n\t\treturn user.Render()\n\t}\n}\n\nfunc renderHome() string {\n\tdoc := \"\"\n\tname2User.Iterate(\"\", \"\", func(key string, value interface{}) bool {\n\t\tuser := value.(*users.User)\n\t\tdoc += \" * [\" + user.Name + \"](/r/demo/users:\" + user.Name + \")\\n\"\n\t\treturn false\n\t})\n\treturn doc\n}\n"},{"name":"users_test.gno","body":"package users\n\nimport (\n\t\"testing\"\n\n\t\"gno.land/p/demo/uassert\"\n)\n\nfunc TestPreRegisteredTest1(t *testing.T) {\n\tnames := ListUsersByPrefix(\"test1\", 1)\n\tuassert.Equal(t, len(names), 1)\n\tuassert.Equal(t, names[0], \"test1\")\n}\n"},{"name":"z_0_b_filetest.gno","body":"package main\n\n// SEND: 19900000ugnot\n\nimport (\n\t\"gno.land/r/demo/users\"\n)\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tprintln(\"done\")\n}\n\n// Error:\n// payment must not be less than 20000000\n"},{"name":"z_0_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\t\"gno.land/r/demo/users\"\n)\n\nfunc main() {\n\tstd.TestSetOrigSend(std.Coins{std.NewCoin(\"dontcare\", 1)}, nil)\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tprintln(\"done\")\n}\n\n// Error:\n// incompatible coin denominations: dontcare, ugnot\n"},{"name":"z_10_filetest.gno","body":"// PKGPATH: gno.land/r/demo/users_test\npackage users_test\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\")\n\nfunc init() {\n\tcaller := std.GetOrigCaller() // main\n\ttest2 := testutils.TestAddress(\"test2\")\n\t// as admin, invite gnouser and test2\n\tstd.TestSetOrigCaller(admin)\n\tusers.Invite(caller.String() + \"\\n\" + test2.String())\n\t// register as caller\n\tstd.TestSetOrigCaller(caller)\n\tusers.Register(admin, \"gnouser\", \"my profile\")\n}\n\nfunc main() {\n\t// register as test2\n\ttest2 := testutils.TestAddress(\"test2\")\n\tstd.TestSetOrigCaller(test2)\n\tusers.Register(admin, \"test222\", \"my profile 2\")\n\tprintln(\"done\")\n}\n\n// Output:\n// done\n"},{"name":"z_11_filetest.gno","body":"package main\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\")\n\nfunc main() {\n\tcaller := std.GetOrigCaller() // main\n\tstd.TestSetOrigCaller(admin)\n\tusers.AdminAddRestrictedName(\"superrestricted\")\n\n\t// test restricted name\n\tstd.TestSetOrigCaller(caller)\n\tusers.Register(\"\", \"superrestricted\", \"my profile\")\n\tprintln(\"done\")\n}\n\n// Error:\n// restricted name: superrestricted\n"},{"name":"z_11b_filetest.gno","body":"package main\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\")\n\nfunc main() {\n\tcaller := std.GetOrigCaller() // main\n\tstd.TestSetOrigCaller(admin)\n\t// add restricted name\n\tusers.AdminAddRestrictedName(\"superrestricted\")\n\t// grant invite to caller\n\tusers.Invite(caller.String())\n\t// set back caller\n\tstd.TestSetOrigCaller(caller)\n\t// register restricted name with admin invite\n\tusers.Register(admin, \"superrestricted\", \"my profile\")\n\tprintln(\"done\")\n}\n\n// Output:\n// done\n"},{"name":"z_12_filetest.gno","body":"package main\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/r/demo/users\"\n)\n\nfunc main() {\n\tusers.Register(\"\", \"alicia\", \"my profile\")\n\n\t{\n\t\t// Normal usage\n\t\tnames := users.ListUsersByPrefix(\"a\", 1)\n\t\tprintln(\"# names: \" + strconv.Itoa(len(names)))\n\t\tprintln(\"name: \" + names[0])\n\t}\n\n\t{\n\t\t// Empty prefix: match all\n\t\tnames := users.ListUsersByPrefix(\"\", 1)\n\t\tprintln(\"# names: \" + strconv.Itoa(len(names)))\n\t\tprintln(\"name: \" + names[0])\n\t}\n\n\t{\n\t\t// The prefix is before \"alicia\"\n\t\tnames := users.ListUsersByPrefix(\"alich\", 1)\n\t\tprintln(\"# names: \" + strconv.Itoa(len(names)))\n\t}\n\n\t{\n\t\t// The prefix is after the last name\n\t\tnames := users.ListUsersByPrefix(\"y\", 10)\n\t\tprintln(\"# names: \" + strconv.Itoa(len(names)))\n\t}\n\n\t// More tests are in p/demo/avlhelpers\n}\n\n// Output:\n// # names: 1\n// name: alicia\n// # names: 1\n// name: alicia\n// # names: 0\n// # names: 0\n"},{"name":"z_1_filetest.gno","body":"package main\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"gno.land/r/demo/users\"\n)\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tprintln(\"done\")\n}\n\n// Output:\n// done\n"},{"name":"z_2_filetest.gno","body":"package main\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\")\n\nfunc main() {\n\tcaller := std.GetOrigCaller() // main\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\t// as admin, grant invites to gnouser\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\")\n\t// switch back to caller\n\tstd.TestSetOrigCaller(caller)\n\t// invite another addr\n\ttest1 := testutils.TestAddress(\"test1\")\n\tusers.Invite(test1.String())\n\t// switch to test1\n\tstd.TestSetOrigCaller(test1)\n\tusers.Register(caller, \"satoshi\", \"my other profile\")\n\tprintln(\"done\")\n}\n\n// Output:\n// done\n"},{"name":"z_3_filetest.gno","body":"package main\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\")\n\nfunc main() {\n\tcaller := std.GetOrigCaller() // main\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\t// as admin, grant invites to gnouser\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\")\n\t// switch back to caller\n\tstd.TestSetOrigCaller(caller)\n\t// invite another addr\n\ttest1 := testutils.TestAddress(\"test1\")\n\tusers.Invite(test1.String())\n\t// switch to test1\n\tstd.TestSetOrigCaller(test1)\n\tstd.TestSetOrigSend(std.Coins{{\"dontcare\", 1}}, nil)\n\tusers.Register(caller, \"satoshi\", \"my other profile\")\n\tprintln(\"done\")\n}\n\n// Output:\n// done\n"},{"name":"z_4_filetest.gno","body":"package main\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\")\n\nfunc main() {\n\tcaller := std.GetOrigCaller() // main\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\t// as admin, grant invites to gnouser\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\")\n\t// switch back to caller\n\tstd.TestSetOrigCaller(caller)\n\t// invite another addr\n\ttest1 := testutils.TestAddress(\"test1\")\n\ttest2 := testutils.TestAddress(\"test2\")\n\tusers.Invite(test1.String())\n\t// switch to test2 (not test1)\n\tstd.TestSetOrigCaller(test2)\n\tstd.TestSetOrigSend(std.Coins{{\"dontcare\", 1}}, nil)\n\tusers.Register(caller, \"satoshi\", \"my other profile\")\n\tprintln(\"done\")\n}\n\n// Error:\n// invalid invitation\n"},{"name":"z_5_filetest.gno","body":"package main\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\")\n\nfunc main() {\n\tcaller := std.GetOrigCaller() // main\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\t// as admin, grant invites to gnouser\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\")\n\t// switch back to caller\n\tstd.TestSetOrigCaller(caller)\n\t// invite another addr\n\ttest1 := testutils.TestAddress(\"test1\")\n\tusers.Invite(test1.String())\n\t// switch to test1\n\tstd.TestSetOrigCaller(test1)\n\tstd.TestSetOrigSend(std.Coins{{\"dontcare\", 1}}, nil)\n\tusers.Register(caller, \"satoshi\", \"my other profile\")\n\tprintln(users.Render(\"\"))\n\tprintln(\"========================================\")\n\tprintln(users.Render(\"gnouser\"))\n\tprintln(\"========================================\")\n\tprintln(users.Render(\"satoshi\"))\n\tprintln(\"========================================\")\n\tprintln(users.Render(\"badname\"))\n}\n\n// Output:\n// * [archives](/r/demo/users:archives)\n// * [demo](/r/demo/users:demo)\n// * [gno](/r/demo/users:gno)\n// * [gnoland](/r/demo/users:gnoland)\n// * [gnolang](/r/demo/users:gnolang)\n// * [gnouser](/r/demo/users:gnouser)\n// * [gov](/r/demo/users:gov)\n// * [nt](/r/demo/users:nt)\n// * [satoshi](/r/demo/users:satoshi)\n// * [sys](/r/demo/users:sys)\n// * [test1](/r/demo/users:test1)\n// * [x](/r/demo/users:x)\n//\n// ========================================\n// ## user gnouser\n//\n// * address = g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm\n// * 9 invites\n//\n// my profile\n//\n// ========================================\n// ## user satoshi\n//\n// * address = g1w3jhxap3ta047h6lta047h6lta047h6l4mfnm7\n// * 0 invites\n// * invited by g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm\n//\n// my other profile\n//\n// ========================================\n// unknown username badname\n"},{"name":"z_6_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\")\n\nfunc main() {\n\tcaller := std.GetOrigCaller()\n\t// as admin, grant invites to unregistered user.\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\")\n\tprintln(\"done\")\n}\n\n// Error:\n// invalid user g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm\n"},{"name":"z_7_filetest.gno","body":"package main\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\")\n\nfunc main() {\n\tcaller := std.GetOrigCaller() // main\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\t// as admin, grant invites to gnouser\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\")\n\t// switch back to caller\n\tstd.TestSetOrigCaller(caller)\n\t// invite another addr\n\ttest1 := testutils.TestAddress(\"test1\")\n\tusers.Invite(test1.String())\n\t// switch to test1\n\tstd.TestSetOrigCaller(test1)\n\tstd.TestSetOrigSend(std.Coins{{\"dontcare\", 1}}, nil)\n\tusers.Register(caller, \"satoshi\", \"my other profile\")\n\t// as admin, grant invites to gnouser(again) and satoshi.\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\\n\" + test1.String() + \":1\")\n\tprintln(\"done\")\n}\n\n// Output:\n// done\n"},{"name":"z_7b_filetest.gno","body":"package main\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\")\n\nfunc main() {\n\tcaller := std.GetOrigCaller() // main\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\t// as admin, grant invites to gnouser\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\\n\")\n\t// switch back to caller\n\tstd.TestSetOrigCaller(caller)\n\t// invite another addr\n\ttest1 := testutils.TestAddress(\"test1\")\n\tusers.Invite(test1.String())\n\t// switch to test1\n\tstd.TestSetOrigCaller(test1)\n\tstd.TestSetOrigSend(std.Coins{{\"dontcare\", 1}}, nil)\n\tusers.Register(caller, \"satoshi\", \"my other profile\")\n\t// as admin, grant invites to gnouser(again) and satoshi.\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\\n\" + test1.String() + \":1\")\n\tprintln(\"done\")\n}\n\n// Output:\n// done\n"},{"name":"z_8_filetest.gno","body":"package main\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\")\n\nfunc main() {\n\tcaller := std.GetOrigCaller() // main\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\t// as admin, grant invites to gnouser\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\")\n\t// switch back to caller\n\tstd.TestSetOrigCaller(caller)\n\t// invite another addr\n\ttest1 := testutils.TestAddress(\"test1\")\n\tusers.Invite(test1.String())\n\t// switch to test1\n\tstd.TestSetOrigCaller(test1)\n\tstd.TestSetOrigSend(std.Coins{{\"dontcare\", 1}}, nil)\n\tusers.Register(caller, \"satoshi\", \"my other profile\")\n\t// as admin, grant invites to gnouser(again) and nonexistent user.\n\tstd.TestSetOrigCaller(admin)\n\ttest2 := testutils.TestAddress(\"test2\")\n\tusers.GrantInvites(caller.String() + \":1\\n\" + test2.String() + \":1\")\n\tprintln(\"done\")\n}\n\n// Error:\n// invalid user g1w3jhxapjta047h6lta047h6lta047h6laqcyu4\n"},{"name":"z_9_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\")\n\nfunc main() {\n\tcaller := std.GetOrigCaller() // main\n\ttest2 := testutils.TestAddress(\"test2\")\n\t// as admin, invite gnouser and test2\n\tstd.TestSetOrigCaller(admin)\n\tusers.Invite(caller.String() + \"\\n\" + test2.String())\n\t// register as caller\n\tstd.TestSetOrigCaller(caller)\n\tusers.Register(admin, \"gnouser\", \"my profile\")\n\t// register as test2\n\tstd.TestSetOrigCaller(test2)\n\tusers.Register(admin, \"test222\", \"my profile 2\")\n\tprintln(\"done\")\n}\n\n// Output:\n// done\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"users","path":"gno.land/r/demo/users","files":[{"name":"preregister.gno","body":"package users\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/users\"\n)\n\n// pre-restricted names\nvar preRestrictedNames = []string{\n\t\"bitcoin\", \"cosmos\", \"newtendermint\", \"ethereum\",\n}\n\n// pre-registered users\nvar preRegisteredUsers = []struct {\n\tName string\n\tAddress std.Address\n}{\n\t// system name\n\t{\"archives\", \"g1xlnyjrnf03ju82v0f98ruhpgnquk28knmjfe5k\"}, // -\u003e @r_archives\n\t{\"demo\", \"g13ek2zz9qurzynzvssyc4sthwppnruhnp0gdz8n\"}, // -\u003e @r_demo\n\t{\"gno\", \"g19602kd9tfxrfd60sgreadt9zvdyyuudcyxsz8a\"}, // -\u003e @r_gno\n\t{\"gnoland\", \"g1g3lsfxhvaqgdv4ccemwpnms4fv6t3aq3p5z6u7\"}, // -\u003e @r_gnoland\n\t{\"gnolang\", \"g1yjlnm3z2630gg5mryjd79907e0zx658wxs9hnd\"}, // -\u003e @r_gnolang\n\t{\"gov\", \"g1g73v2anukg4ej7axwqpthsatzrxjsh0wk797da\"}, // -\u003e @r_gov\n\t{\"nt\", \"g15ge0ae9077eh40erwrn2eq0xw6wupwqthpv34l\"}, // -\u003e @r_nt\n\t{\"sys\", \"g1r929wt2qplfawe4lvqv9zuwfdcz4vxdun7qh8l\"}, // -\u003e @r_sys\n\t{\"x\", \"g164sdpew3c2t3rvxj3kmfv7c7ujlvcw2punzzuz\"}, // -\u003e @r_x\n\n\t// test1 user\n\t{\"test1\", \"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\"}, // -\u003e @test1\n}\n\nfunc init() {\n\t// add pre-registered users\n\tfor _, res := range preRegisteredUsers {\n\t\t// assert not already registered.\n\t\t_, ok := name2User.Get(res.Name)\n\t\tif ok {\n\t\t\tpanic(\"name already registered\")\n\t\t}\n\n\t\t_, ok = addr2User.Get(res.Address.String())\n\t\tif ok {\n\t\t\tpanic(\"address already registered\")\n\t\t}\n\n\t\tcounter++\n\t\tuser := \u0026users.User{\n\t\t\tAddress: res.Address,\n\t\t\tName: res.Name,\n\t\t\tProfile: \"\",\n\t\t\tNumber: counter,\n\t\t\tInvites: int(0),\n\t\t\tInviter: admin,\n\t\t}\n\t\tname2User.Set(res.Name, user)\n\t\taddr2User.Set(res.Address.String(), user)\n\t}\n\n\t// add pre-restricted names\n\tfor _, name := range preRestrictedNames {\n\t\tif _, ok := name2User.Get(name); ok {\n\t\t\tpanic(\"name already registered\")\n\t\t}\n\n\t\trestricted.Set(name, true)\n\t}\n}\n"},{"name":"users.gno","body":"package users\n\nimport (\n\t\"regexp\"\n\t\"std\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/avlhelpers\"\n\t\"gno.land/p/demo/users\"\n)\n\n//----------------------------------------\n// State\n\nvar (\n\tadmin std.Address = \"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq\" // @moul\n\n\trestricted avl.Tree // Name -\u003e true - restricted name\n\tname2User avl.Tree // Name -\u003e *users.User\n\taddr2User avl.Tree // std.Address -\u003e *users.User\n\tinvites avl.Tree // string(inviter+\":\"+invited) -\u003e true\n\tcounter int // user id counter\n\tminFee int64 = 20 * 1_000_000 // minimum gnot must be paid to register.\n\tmaxFeeMult int64 = 10 // maximum multiples of minFee accepted.\n)\n\n//----------------------------------------\n// Top-level functions\n\nfunc Register(inviter std.Address, name string, profile string) {\n\t// assert CallTx call.\n\tstd.AssertOriginCall()\n\t// assert invited or paid.\n\tcaller := std.GetCallerAt(2)\n\tif caller != std.GetOrigCaller() {\n\t\tpanic(\"should not happen\") // because std.AssertOrigCall().\n\t}\n\n\tsentCoins := std.GetOrigSend()\n\tminCoin := std.NewCoin(\"ugnot\", minFee)\n\n\tif inviter == \"\" {\n\t\t// banker := std.GetBanker(std.BankerTypeOrigSend)\n\t\tif len(sentCoins) == 1 \u0026\u0026 sentCoins[0].IsGTE(minCoin) {\n\t\t\tif sentCoins[0].Amount \u003e minFee*maxFeeMult {\n\t\t\t\tpanic(\"payment must not be greater than \" + strconv.Itoa(int(minFee*maxFeeMult)))\n\t\t\t} else {\n\t\t\t\t// ok\n\t\t\t}\n\t\t} else {\n\t\t\tpanic(\"payment must not be less than \" + strconv.Itoa(int(minFee)))\n\t\t}\n\t} else {\n\t\tinvitekey := inviter.String() + \":\" + caller.String()\n\t\t_, ok := invites.Get(invitekey)\n\t\tif !ok {\n\t\t\tpanic(\"invalid invitation\")\n\t\t}\n\t\tinvites.Remove(invitekey)\n\t}\n\n\t// assert not already registered.\n\t_, ok := name2User.Get(name)\n\tif ok {\n\t\tpanic(\"name already registered: \" + name)\n\t}\n\t_, ok = addr2User.Get(caller.String())\n\tif ok {\n\t\tpanic(\"address already registered: \" + caller.String())\n\t}\n\n\tisInviterAdmin := inviter == admin\n\n\t// check for restricted name\n\tif _, isRestricted := restricted.Get(name); isRestricted {\n\t\t// only address invite by the admin can register restricted name\n\t\tif !isInviterAdmin {\n\t\t\tpanic(\"restricted name: \" + name)\n\t\t}\n\n\t\trestricted.Remove(name)\n\t}\n\n\t// assert name is valid.\n\t// admin inviter can bypass name restriction\n\tif !isInviterAdmin \u0026\u0026 !reName.MatchString(name) {\n\t\tpanic(\"invalid name: \" + name + \" (must be at least 6 characters, lowercase alphanumeric with underscore)\")\n\t}\n\n\t// remainder of fees go toward invites.\n\tinvites := int(0)\n\tif len(sentCoins) == 1 {\n\t\tif sentCoins[0].Denom == \"ugnot\" \u0026\u0026 sentCoins[0].Amount \u003e= minFee {\n\t\t\tinvites = int(sentCoins[0].Amount / minFee)\n\t\t\tif inviter == \"\" \u0026\u0026 invites \u003e 0 {\n\t\t\t\tinvites -= 1\n\t\t\t}\n\t\t}\n\t}\n\t// register.\n\tcounter++\n\tuser := \u0026users.User{\n\t\tAddress: caller,\n\t\tName: name,\n\t\tProfile: profile,\n\t\tNumber: counter,\n\t\tInvites: invites,\n\t\tInviter: inviter,\n\t}\n\tname2User.Set(name, user)\n\taddr2User.Set(caller.String(), user)\n}\n\nfunc Invite(invitee string) {\n\t// assert CallTx call.\n\tstd.AssertOriginCall()\n\t// get caller/inviter.\n\tcaller := std.GetCallerAt(2)\n\tif caller != std.GetOrigCaller() {\n\t\tpanic(\"should not happen\") // because std.AssertOrigCall().\n\t}\n\tlines := strings.Split(invitee, \"\\n\")\n\tif caller == admin {\n\t\t// nothing to do, all good\n\t} else {\n\t\t// ensure has invites.\n\t\tuserI, ok := addr2User.Get(caller.String())\n\t\tif !ok {\n\t\t\tpanic(\"user unknown\")\n\t\t}\n\t\tuser := userI.(*users.User)\n\t\tif user.Invites \u003c= 0 {\n\t\t\tpanic(\"user has no invite tokens\")\n\t\t}\n\t\tuser.Invites -= len(lines)\n\t\tif user.Invites \u003c 0 {\n\t\t\tpanic(\"user has insufficient invite tokens\")\n\t\t}\n\t}\n\t// for each line...\n\tfor _, line := range lines {\n\t\tif line == \"\" {\n\t\t\tcontinue // file bodies have a trailing newline.\n\t\t} else if strings.HasPrefix(line, `//`) {\n\t\t\tcontinue // comment\n\t\t}\n\t\t// record invite.\n\t\tinvitekey := string(caller) + \":\" + string(line)\n\t\tinvites.Set(invitekey, true)\n\t}\n}\n\nfunc GrantInvites(invites string) {\n\t// assert CallTx call.\n\tstd.AssertOriginCall()\n\t// assert admin.\n\tcaller := std.GetCallerAt(2)\n\tif caller != std.GetOrigCaller() {\n\t\tpanic(\"should not happen\") // because std.AssertOrigCall().\n\t}\n\tif caller != admin {\n\t\tpanic(\"unauthorized\")\n\t}\n\t// for each line...\n\tlines := strings.Split(invites, \"\\n\")\n\tfor _, line := range lines {\n\t\tif line == \"\" {\n\t\t\tcontinue // file bodies have a trailing newline.\n\t\t} else if strings.HasPrefix(line, `//`) {\n\t\t\tcontinue // comment\n\t\t}\n\t\t// parse name and invites.\n\t\tvar name string\n\t\tvar invites int\n\t\tparts := strings.Split(line, \":\")\n\t\tif len(parts) == 1 { // short for :1.\n\t\t\tname = parts[0]\n\t\t\tinvites = 1\n\t\t} else if len(parts) == 2 {\n\t\t\tname = parts[0]\n\t\t\tinvites_, err := strconv.Atoi(parts[1])\n\t\t\tif err != nil {\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t\tinvites = int(invites_)\n\t\t} else {\n\t\t\tpanic(\"should not happen\")\n\t\t}\n\t\t// give invites.\n\t\tuserI, ok := name2User.Get(name)\n\t\tif !ok {\n\t\t\t// maybe address.\n\t\t\tuserI, ok = addr2User.Get(name)\n\t\t\tif !ok {\n\t\t\t\tpanic(\"invalid user \" + name)\n\t\t\t}\n\t\t}\n\t\tuser := userI.(*users.User)\n\t\tuser.Invites += invites\n\t}\n}\n\n// Any leftover fees go toward invitations.\nfunc SetMinFee(newMinFee int64) {\n\t// assert CallTx call.\n\tstd.AssertOriginCall()\n\t// assert admin caller.\n\tcaller := std.GetCallerAt(2)\n\tif caller != admin {\n\t\tpanic(\"unauthorized\")\n\t}\n\t// update global variables.\n\tminFee = newMinFee\n}\n\n// This helps prevent fat finger accidents.\nfunc SetMaxFeeMultiple(newMaxFeeMult int64) {\n\t// assert CallTx call.\n\tstd.AssertOriginCall()\n\t// assert admin caller.\n\tcaller := std.GetCallerAt(2)\n\tif caller != admin {\n\t\tpanic(\"unauthorized\")\n\t}\n\t// update global variables.\n\tmaxFeeMult = newMaxFeeMult\n}\n\n//----------------------------------------\n// Exposed public functions\n\nfunc GetUserByName(name string) *users.User {\n\tuserI, ok := name2User.Get(name)\n\tif !ok {\n\t\treturn nil\n\t}\n\treturn userI.(*users.User)\n}\n\nfunc GetUserByAddress(addr std.Address) *users.User {\n\tuserI, ok := addr2User.Get(addr.String())\n\tif !ok {\n\t\treturn nil\n\t}\n\treturn userI.(*users.User)\n}\n\n// unlike GetUserByName, input must be \"@\" prefixed for names.\nfunc GetUserByAddressOrName(input users.AddressOrName) *users.User {\n\tname, isName := input.GetName()\n\tif isName {\n\t\treturn GetUserByName(name)\n\t}\n\treturn GetUserByAddress(std.Address(input))\n}\n\n// Get a list of user names starting from the given prefix. Limit the\n// number of results to maxResults. (This can be used for a name search tool.)\nfunc ListUsersByPrefix(prefix string, maxResults int) []string {\n\treturn avlhelpers.ListByteStringKeysByPrefix(name2User, prefix, maxResults)\n}\n\nfunc Resolve(input users.AddressOrName) std.Address {\n\tname, isName := input.GetName()\n\tif !isName {\n\t\treturn std.Address(input) // TODO check validity\n\t}\n\n\tuser := GetUserByName(name)\n\treturn user.Address\n}\n\n// Add restricted name to the list\nfunc AdminAddRestrictedName(name string) {\n\t// assert CallTx call.\n\tstd.AssertOriginCall()\n\t// get caller\n\tcaller := std.GetOrigCaller()\n\t// assert admin\n\tif caller != admin {\n\t\tpanic(\"unauthorized\")\n\t}\n\n\tif user := GetUserByName(name); user != nil {\n\t\tpanic(\"already registered name\")\n\t}\n\n\t// register restricted name\n\n\trestricted.Set(name, true)\n}\n\n//----------------------------------------\n// Constants\n\n// NOTE: name length must be clearly distinguishable from a bech32 address.\nvar reName = regexp.MustCompile(`^[a-z]+[_a-z0-9]{5,16}$`)\n\n//----------------------------------------\n// Render main page\n\nfunc Render(path string) string {\n\tif path == \"\" {\n\t\treturn renderHome()\n\t} else if len(path) \u003e= 38 { // 39? 40?\n\t\tif path[:2] != \"g1\" {\n\t\t\treturn \"invalid address \" + path\n\t\t}\n\t\tuser := GetUserByAddress(std.Address(path))\n\t\tif user == nil {\n\t\t\t// TODO: display basic information about account.\n\t\t\treturn \"unknown address \" + path\n\t\t}\n\t\treturn user.Render()\n\t} else {\n\t\tuser := GetUserByName(path)\n\t\tif user == nil {\n\t\t\treturn \"unknown username \" + path\n\t\t}\n\t\treturn user.Render()\n\t}\n}\n\nfunc renderHome() string {\n\tdoc := \"\"\n\tname2User.Iterate(\"\", \"\", func(key string, value interface{}) bool {\n\t\tuser := value.(*users.User)\n\t\tdoc += \" * [\" + user.Name + \"](/r/demo/users:\" + user.Name + \")\\n\"\n\t\treturn false\n\t})\n\treturn doc\n}\n"},{"name":"users_test.gno","body":"package users\n\nimport (\n\t\"testing\"\n\n\t\"gno.land/p/demo/uassert\"\n)\n\nfunc TestPreRegisteredTest1(t *testing.T) {\n\tnames := ListUsersByPrefix(\"test1\", 1)\n\tuassert.Equal(t, len(names), 1)\n\tuassert.Equal(t, names[0], \"test1\")\n}\n"},{"name":"z_0_b_filetest.gno","body":"package main\n\n// SEND: 19900000ugnot\n\nimport (\n\t\"gno.land/r/demo/users\"\n)\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tprintln(\"done\")\n}\n\n// Error:\n// payment must not be less than 20000000\n"},{"name":"z_0_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\t\"gno.land/r/demo/users\"\n)\n\nfunc main() {\n\tstd.TestSetOrigSend(std.Coins{std.NewCoin(\"dontcare\", 1)}, nil)\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tprintln(\"done\")\n}\n\n// Error:\n// incompatible coin denominations: dontcare, ugnot\n"},{"name":"z_10_filetest.gno","body":"// PKGPATH: gno.land/r/demo/users_test\npackage users_test\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq\")\n\nfunc init() {\n\tcaller := std.GetOrigCaller() // main\n\ttest2 := testutils.TestAddress(\"test2\")\n\t// as admin, invite gnouser and test2\n\tstd.TestSetOrigCaller(admin)\n\tusers.Invite(caller.String() + \"\\n\" + test2.String())\n\t// register as caller\n\tstd.TestSetOrigCaller(caller)\n\tusers.Register(admin, \"gnouser\", \"my profile\")\n}\n\nfunc main() {\n\t// register as test2\n\ttest2 := testutils.TestAddress(\"test2\")\n\tstd.TestSetOrigCaller(test2)\n\tusers.Register(admin, \"test222\", \"my profile 2\")\n\tprintln(\"done\")\n}\n\n// Output:\n// done\n"},{"name":"z_11_filetest.gno","body":"package main\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq\")\n\nfunc main() {\n\tcaller := std.GetOrigCaller() // main\n\tstd.TestSetOrigCaller(admin)\n\tusers.AdminAddRestrictedName(\"superrestricted\")\n\n\t// test restricted name\n\tstd.TestSetOrigCaller(caller)\n\tusers.Register(\"\", \"superrestricted\", \"my profile\")\n\tprintln(\"done\")\n}\n\n// Error:\n// restricted name: superrestricted\n"},{"name":"z_11b_filetest.gno","body":"package main\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq\")\n\nfunc main() {\n\tcaller := std.GetOrigCaller() // main\n\tstd.TestSetOrigCaller(admin)\n\t// add restricted name\n\tusers.AdminAddRestrictedName(\"superrestricted\")\n\t// grant invite to caller\n\tusers.Invite(caller.String())\n\t// set back caller\n\tstd.TestSetOrigCaller(caller)\n\t// register restricted name with admin invite\n\tusers.Register(admin, \"superrestricted\", \"my profile\")\n\tprintln(\"done\")\n}\n\n// Output:\n// done\n"},{"name":"z_12_filetest.gno","body":"package main\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/r/demo/users\"\n)\n\nfunc main() {\n\tusers.Register(\"\", \"alicia\", \"my profile\")\n\n\t{\n\t\t// Normal usage\n\t\tnames := users.ListUsersByPrefix(\"a\", 1)\n\t\tprintln(\"# names: \" + strconv.Itoa(len(names)))\n\t\tprintln(\"name: \" + names[0])\n\t}\n\n\t{\n\t\t// Empty prefix: match all\n\t\tnames := users.ListUsersByPrefix(\"\", 1)\n\t\tprintln(\"# names: \" + strconv.Itoa(len(names)))\n\t\tprintln(\"name: \" + names[0])\n\t}\n\n\t{\n\t\t// The prefix is before \"alicia\"\n\t\tnames := users.ListUsersByPrefix(\"alich\", 1)\n\t\tprintln(\"# names: \" + strconv.Itoa(len(names)))\n\t}\n\n\t{\n\t\t// The prefix is after the last name\n\t\tnames := users.ListUsersByPrefix(\"y\", 10)\n\t\tprintln(\"# names: \" + strconv.Itoa(len(names)))\n\t}\n\n\t// More tests are in p/demo/avlhelpers\n}\n\n// Output:\n// # names: 1\n// name: alicia\n// # names: 1\n// name: alicia\n// # names: 0\n// # names: 0\n"},{"name":"z_1_filetest.gno","body":"package main\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"gno.land/r/demo/users\"\n)\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tprintln(\"done\")\n}\n\n// Output:\n// done\n"},{"name":"z_2_filetest.gno","body":"package main\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq\")\n\nfunc main() {\n\tcaller := std.GetOrigCaller() // main\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\t// as admin, grant invites to gnouser\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\")\n\t// switch back to caller\n\tstd.TestSetOrigCaller(caller)\n\t// invite another addr\n\ttest1 := testutils.TestAddress(\"test1\")\n\tusers.Invite(test1.String())\n\t// switch to test1\n\tstd.TestSetOrigCaller(test1)\n\tusers.Register(caller, \"satoshi\", \"my other profile\")\n\tprintln(\"done\")\n}\n\n// Output:\n// done\n"},{"name":"z_3_filetest.gno","body":"package main\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq\")\n\nfunc main() {\n\tcaller := std.GetOrigCaller() // main\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\t// as admin, grant invites to gnouser\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\")\n\t// switch back to caller\n\tstd.TestSetOrigCaller(caller)\n\t// invite another addr\n\ttest1 := testutils.TestAddress(\"test1\")\n\tusers.Invite(test1.String())\n\t// switch to test1\n\tstd.TestSetOrigCaller(test1)\n\tstd.TestSetOrigSend(std.Coins{{\"dontcare\", 1}}, nil)\n\tusers.Register(caller, \"satoshi\", \"my other profile\")\n\tprintln(\"done\")\n}\n\n// Output:\n// done\n"},{"name":"z_4_filetest.gno","body":"package main\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq\")\n\nfunc main() {\n\tcaller := std.GetOrigCaller() // main\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\t// as admin, grant invites to gnouser\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\")\n\t// switch back to caller\n\tstd.TestSetOrigCaller(caller)\n\t// invite another addr\n\ttest1 := testutils.TestAddress(\"test1\")\n\ttest2 := testutils.TestAddress(\"test2\")\n\tusers.Invite(test1.String())\n\t// switch to test2 (not test1)\n\tstd.TestSetOrigCaller(test2)\n\tstd.TestSetOrigSend(std.Coins{{\"dontcare\", 1}}, nil)\n\tusers.Register(caller, \"satoshi\", \"my other profile\")\n\tprintln(\"done\")\n}\n\n// Error:\n// invalid invitation\n"},{"name":"z_5_filetest.gno","body":"package main\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq\")\n\nfunc main() {\n\tcaller := std.GetOrigCaller() // main\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\t// as admin, grant invites to gnouser\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\")\n\t// switch back to caller\n\tstd.TestSetOrigCaller(caller)\n\t// invite another addr\n\ttest1 := testutils.TestAddress(\"test1\")\n\tusers.Invite(test1.String())\n\t// switch to test1\n\tstd.TestSetOrigCaller(test1)\n\tstd.TestSetOrigSend(std.Coins{{\"dontcare\", 1}}, nil)\n\tusers.Register(caller, \"satoshi\", \"my other profile\")\n\tprintln(users.Render(\"\"))\n\tprintln(\"========================================\")\n\tprintln(users.Render(\"gnouser\"))\n\tprintln(\"========================================\")\n\tprintln(users.Render(\"satoshi\"))\n\tprintln(\"========================================\")\n\tprintln(users.Render(\"badname\"))\n}\n\n// Output:\n// * [archives](/r/demo/users:archives)\n// * [demo](/r/demo/users:demo)\n// * [gno](/r/demo/users:gno)\n// * [gnoland](/r/demo/users:gnoland)\n// * [gnolang](/r/demo/users:gnolang)\n// * [gnouser](/r/demo/users:gnouser)\n// * [gov](/r/demo/users:gov)\n// * [nt](/r/demo/users:nt)\n// * [satoshi](/r/demo/users:satoshi)\n// * [sys](/r/demo/users:sys)\n// * [test1](/r/demo/users:test1)\n// * [x](/r/demo/users:x)\n//\n// ========================================\n// ## user gnouser\n//\n// * address = g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm\n// * 9 invites\n//\n// my profile\n//\n// ========================================\n// ## user satoshi\n//\n// * address = g1w3jhxap3ta047h6lta047h6lta047h6l4mfnm7\n// * 0 invites\n// * invited by g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm\n//\n// my other profile\n//\n// ========================================\n// unknown username badname\n"},{"name":"z_6_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq\")\n\nfunc main() {\n\tcaller := std.GetOrigCaller()\n\t// as admin, grant invites to unregistered user.\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\")\n\tprintln(\"done\")\n}\n\n// Error:\n// invalid user g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm\n"},{"name":"z_7_filetest.gno","body":"package main\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq\")\n\nfunc main() {\n\tcaller := std.GetOrigCaller() // main\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\t// as admin, grant invites to gnouser\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\")\n\t// switch back to caller\n\tstd.TestSetOrigCaller(caller)\n\t// invite another addr\n\ttest1 := testutils.TestAddress(\"test1\")\n\tusers.Invite(test1.String())\n\t// switch to test1\n\tstd.TestSetOrigCaller(test1)\n\tstd.TestSetOrigSend(std.Coins{{\"dontcare\", 1}}, nil)\n\tusers.Register(caller, \"satoshi\", \"my other profile\")\n\t// as admin, grant invites to gnouser(again) and satoshi.\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\\n\" + test1.String() + \":1\")\n\tprintln(\"done\")\n}\n\n// Output:\n// done\n"},{"name":"z_7b_filetest.gno","body":"package main\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq\")\n\nfunc main() {\n\tcaller := std.GetOrigCaller() // main\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\t// as admin, grant invites to gnouser\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\\n\")\n\t// switch back to caller\n\tstd.TestSetOrigCaller(caller)\n\t// invite another addr\n\ttest1 := testutils.TestAddress(\"test1\")\n\tusers.Invite(test1.String())\n\t// switch to test1\n\tstd.TestSetOrigCaller(test1)\n\tstd.TestSetOrigSend(std.Coins{{\"dontcare\", 1}}, nil)\n\tusers.Register(caller, \"satoshi\", \"my other profile\")\n\t// as admin, grant invites to gnouser(again) and satoshi.\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\\n\" + test1.String() + \":1\")\n\tprintln(\"done\")\n}\n\n// Output:\n// done\n"},{"name":"z_8_filetest.gno","body":"package main\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq\")\n\nfunc main() {\n\tcaller := std.GetOrigCaller() // main\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\t// as admin, grant invites to gnouser\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\")\n\t// switch back to caller\n\tstd.TestSetOrigCaller(caller)\n\t// invite another addr\n\ttest1 := testutils.TestAddress(\"test1\")\n\tusers.Invite(test1.String())\n\t// switch to test1\n\tstd.TestSetOrigCaller(test1)\n\tstd.TestSetOrigSend(std.Coins{{\"dontcare\", 1}}, nil)\n\tusers.Register(caller, \"satoshi\", \"my other profile\")\n\t// as admin, grant invites to gnouser(again) and nonexistent user.\n\tstd.TestSetOrigCaller(admin)\n\ttest2 := testutils.TestAddress(\"test2\")\n\tusers.GrantInvites(caller.String() + \":1\\n\" + test2.String() + \":1\")\n\tprintln(\"done\")\n}\n\n// Error:\n// invalid user g1w3jhxapjta047h6lta047h6lta047h6laqcyu4\n"},{"name":"z_9_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq\")\n\nfunc main() {\n\tcaller := std.GetOrigCaller() // main\n\ttest2 := testutils.TestAddress(\"test2\")\n\t// as admin, invite gnouser and test2\n\tstd.TestSetOrigCaller(admin)\n\tusers.Invite(caller.String() + \"\\n\" + test2.String())\n\t// register as caller\n\tstd.TestSetOrigCaller(caller)\n\tusers.Register(admin, \"gnouser\", \"my profile\")\n\t// register as test2\n\tstd.TestSetOrigCaller(test2)\n\tusers.Register(admin, \"test222\", \"my profile 2\")\n\tprintln(\"done\")\n}\n\n// Output:\n// done\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} {"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"boards","path":"gno.land/r/demo/boards","files":[{"name":"README.md","body":"This is a demo of Gno smart contract programming. This document was\nconstructed by Gno onto a smart contract hosted on the data Realm\nname [\"gno.land/r/demo/boards\"](https://gno.land/r/demo/boards/)\n([github](https://github.com/gnolang/gno/tree/master/examples/gno.land/r/demo/boards)).\n\n\n\n## Build `gnokey`, create your account, and interact with Gno.\n\nNOTE: Where you see `-remote localhost:26657` here, that flag can be replaced\nwith `-remote test3.gno.land:26657` if you have $GNOT on the testnet.\n(To use the testnet, also replace `-chainid dev` with `-chainid test3` .)\n\n### Build `gnokey` (and other tools).\n\n```bash\ngit clone git@github.com:gnolang/gno.git\ncd gno/gno.land\nmake build\n```\n\n### Generate a seed/mnemonic code.\n\n```bash\n./build/gnokey generate\n```\n\nNOTE: You can generate 24 words with any good bip39 generator.\n\n### Create a new account using your mnemonic.\n\n```bash\n./build/gnokey add -recover KEYNAME\n```\n\nNOTE: `KEYNAME` is your key identifier, and should be changed.\n\n### Verify that you can see your account locally.\n\n```bash\n./build/gnokey list\n```\n\nTake note of your `addr` which looks something like `g17sphqax3kasjptdkmuqvn740u8dhtx4kxl6ljf` .\nYou will use this as your `ACCOUNT_ADDR`.\n\n## Interact with the blockchain.\n\n### Add $GNOT for your account.\n\nBefore starting the `gnoland` node for the first time, your new account can be given $GNOT in the node genesis.\nEdit the file `gno.land/genesis/genesis_balances.txt` and add the following line (simlar to the others), using\nyour `ACCOUNT_ADDR` and `KEYNAME`\n\n`ACCOUNT_ADDR=10000000000ugnot # @KEYNAME`\n\n### Alternative: Run a faucet to add $GNOT.\n\nInstead of editing `gno.land/genesis/genesis_balances.txt`, a more general solution (with more steps)\nis to run a local \"faucet\" and use the web browser to add $GNOT. (This can be done at any time.)\nSee this page: https://github.com/gnolang/gno/blob/master/contribs/gnofaucet/README.md\n\n\n### Start the `gnoland` node.\n\n```bash\n./build/gnoland start\n```\n\nNOTE: The node already has the \"boards\" realm.\n\nLeave this running in the terminal. In a new terminal, cd to the same folder `gno/gno.land` .\n\n### Get your current balance, account number, and sequence number.\n\n```bash\n./build/gnokey query auth/accounts/ACCOUNT_ADDR -remote localhost:26657\n```\n\n### Register a board username with a smart contract call.\n\nThe `USERNAME` for posting can different than your `KEYNAME`. It is internally linked to your `ACCOUNT_ADDR`. It must be at least 6 characters, lowercase alphanumeric with underscore.\n\n```bash\n./build/gnokey maketx call -pkgpath \"gno.land/r/demo/users\" -func \"Register\" -args \"\" -args \"USERNAME\" -args \"Profile description\" -gas-fee \"10000000ugnot\" -gas-wanted \"2000000\" -send \"200000000ugnot\" -broadcast -chainid dev -remote 127.0.0.1:26657 KEYNAME\n```\n\nInteractive documentation: https://test3.gno.land/r/demo/users?help\u0026__func=Register\n\n### Create a board with a smart contract call.\n\n```bash\n./build/gnokey maketx call -pkgpath \"gno.land/r/demo/boards\" -func \"CreateBoard\" -args \"BOARDNAME\" -gas-fee \"1000000ugnot\" -gas-wanted \"10000000\" -broadcast -chainid dev -remote localhost:26657 KEYNAME\n```\n\nInteractive documentation: https://test3.gno.land/r/demo/boards?help\u0026__func=CreateBoard\n\nNext, query for the permanent board ID by querying (you need this to create a new post):\n\n```bash\n./build/gnokey query \"vm/qeval\" -data 'gno.land/r/demo/boards.GetBoardIDFromName(\"BOARDNAME\")' -remote localhost:26657\n```\n\n### Create a post of a board with a smart contract call.\n\nNOTE: If a board was created successfully, your SEQUENCE_NUMBER would have increased.\n\n```bash\n./build/gnokey maketx call -pkgpath \"gno.land/r/demo/boards\" -func \"CreateThread\" -args BOARD_ID -args \"Hello gno.land\" -args \"Text of the post\" -gas-fee 1000000ugnot -gas-wanted 2000000 -broadcast -chainid dev -remote localhost:26657 KEYNAME\n```\n\nInteractive documentation: https://test3.gno.land/r/demo/boards?help\u0026__func=CreateThread\n\n### Create a comment to a post.\n\n```bash\n./build/gnokey maketx call -pkgpath \"gno.land/r/demo/boards\" -func \"CreateReply\" -args BOARD_ID -args \"1\" -args \"1\" -args \"Nice to meet you too.\" -gas-fee 1000000ugnot -gas-wanted 2000000 -broadcast -chainid dev -remote localhost:26657 KEYNAME\n```\n\nInteractive documentation: https://test3.gno.land/r/demo/boards?help\u0026__func=CreateReply\n\n```bash\n./build/gnokey query \"vm/qrender\" -data \"gno.land/r/demo/boards:BOARDNAME/1\" -remote localhost:26657\n```\n\n### Render page with optional path expression.\n\nThe contents of `https://gno.land/r/demo/boards:` and `https://gno.land/r/demo/boards:gnolang` are rendered by calling\nthe `Render(path string)` function like so:\n\n```bash\n./build/gnokey query \"vm/qrender\" -data \"gno.land/r/demo/boards:gnolang\"\n```\n## View the board in the browser.\n\n### Start the web server.\n\n```bash\n./build/gnoweb\n```\n\nThis should print something like `Running on http://127.0.0.1:8888` . Leave this running in the terminal.\n\n### View in the browser\n\nIn your browser, navigate to the printed address http://127.0.0.1:8888 .\nTo see you post, click on the package `/r/demo/boards` .\n"},{"name":"board.gno","body":"package boards\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"gno.land/p/demo/avl\"\n)\n\n//----------------------------------------\n// Board\n\ntype BoardID uint64\n\nfunc (bid BoardID) String() string {\n\treturn strconv.Itoa(int(bid))\n}\n\ntype Board struct {\n\tid BoardID // only set for public boards.\n\turl string\n\tname string\n\tcreator std.Address\n\tthreads avl.Tree // Post.id -\u003e *Post\n\tpostsCtr uint64 // increments Post.id\n\tcreatedAt time.Time\n\tdeleted avl.Tree // TODO reserved for fast-delete.\n}\n\nfunc newBoard(id BoardID, url string, name string, creator std.Address) *Board {\n\tif !reName.MatchString(name) {\n\t\tpanic(\"invalid name: \" + name)\n\t}\n\texists := gBoardsByName.Has(name)\n\tif exists {\n\t\tpanic(\"board already exists\")\n\t}\n\treturn \u0026Board{\n\t\tid: id,\n\t\turl: url,\n\t\tname: name,\n\t\tcreator: creator,\n\t\tthreads: avl.Tree{},\n\t\tcreatedAt: time.Now(),\n\t\tdeleted: avl.Tree{},\n\t}\n}\n\n/* TODO support this once we figure out how to ensure URL correctness.\n// A private board is not tracked by gBoards*,\n// but must be persisted by the caller's realm.\n// Private boards have 0 id and does not ping\n// back the remote board on reposts.\nfunc NewPrivateBoard(url string, name string, creator std.Address) *Board {\n\treturn newBoard(0, url, name, creator)\n}\n*/\n\nfunc (board *Board) IsPrivate() bool {\n\treturn board.id == 0\n}\n\nfunc (board *Board) GetThread(pid PostID) *Post {\n\tpidkey := postIDKey(pid)\n\tpostI, exists := board.threads.Get(pidkey)\n\tif !exists {\n\t\treturn nil\n\t}\n\treturn postI.(*Post)\n}\n\nfunc (board *Board) AddThread(creator std.Address, title string, body string) *Post {\n\tpid := board.incGetPostID()\n\tpidkey := postIDKey(pid)\n\tthread := newPost(board, pid, creator, title, body, pid, 0, 0)\n\tboard.threads.Set(pidkey, thread)\n\treturn thread\n}\n\n// NOTE: this can be potentially very expensive for threads with many replies.\n// TODO: implement optional fast-delete where thread is simply moved.\nfunc (board *Board) DeleteThread(pid PostID) {\n\tpidkey := postIDKey(pid)\n\t_, removed := board.threads.Remove(pidkey)\n\tif !removed {\n\t\tpanic(\"thread does not exist with id \" + pid.String())\n\t}\n}\n\nfunc (board *Board) HasPermission(addr std.Address, perm Permission) bool {\n\tif board.creator == addr {\n\t\tswitch perm {\n\t\tcase EditPermission:\n\t\t\treturn true\n\t\tcase DeletePermission:\n\t\t\treturn true\n\t\tdefault:\n\t\t\treturn false\n\t\t}\n\t}\n\treturn false\n}\n\n// Renders the board for display suitable as plaintext in\n// console. This is suitable for demonstration or tests,\n// but not for prod.\nfunc (board *Board) RenderBoard() string {\n\tstr := \"\"\n\tstr += \"\\\\[[post](\" + board.GetPostFormURL() + \")]\\n\\n\"\n\tif board.threads.Size() \u003e 0 {\n\t\tboard.threads.Iterate(\"\", \"\", func(key string, value interface{}) bool {\n\t\t\tif str != \"\" {\n\t\t\t\tstr += \"----------------------------------------\\n\"\n\t\t\t}\n\t\t\tstr += value.(*Post).RenderSummary() + \"\\n\"\n\t\t\treturn false\n\t\t})\n\t}\n\treturn str\n}\n\nfunc (board *Board) incGetPostID() PostID {\n\tboard.postsCtr++\n\treturn PostID(board.postsCtr)\n}\n\nfunc (board *Board) GetURLFromThreadAndReplyID(threadID, replyID PostID) string {\n\tif replyID == 0 {\n\t\treturn board.url + \"/\" + threadID.String()\n\t} else {\n\t\treturn board.url + \"/\" + threadID.String() + \"/\" + replyID.String()\n\t}\n}\n\nfunc (board *Board) GetPostFormURL() string {\n\treturn \"/r/demo/boards?help\u0026__func=CreateThread\" +\n\t\t\"\u0026bid=\" + board.id.String() +\n\t\t\"\u0026body.type=textarea\"\n}\n"},{"name":"boards.gno","body":"package boards\n\nimport (\n\t\"regexp\"\n\n\t\"gno.land/p/demo/avl\"\n)\n\n//----------------------------------------\n// Realm (package) state\n\nvar (\n\tgBoards avl.Tree // id -\u003e *Board\n\tgBoardsCtr int // increments Board.id\n\tgBoardsByName avl.Tree // name -\u003e *Board\n\tgDefaultAnonFee = 100000000 // minimum fee required if anonymous\n)\n\n//----------------------------------------\n// Constants\n\nvar reName = regexp.MustCompile(`^[a-z]+[_a-z0-9]{2,29}$`)\n"},{"name":"misc.gno","body":"package boards\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"gno.land/r/demo/users\"\n)\n\n//----------------------------------------\n// private utility methods\n// XXX ensure these cannot be called from public.\n\nfunc getBoard(bid BoardID) *Board {\n\tbidkey := boardIDKey(bid)\n\tboard_, exists := gBoards.Get(bidkey)\n\tif !exists {\n\t\treturn nil\n\t}\n\tboard := board_.(*Board)\n\treturn board\n}\n\nfunc incGetBoardID() BoardID {\n\tgBoardsCtr++\n\treturn BoardID(gBoardsCtr)\n}\n\nfunc padLeft(str string, length int) string {\n\tif len(str) \u003e= length {\n\t\treturn str\n\t} else {\n\t\treturn strings.Repeat(\" \", length-len(str)) + str\n\t}\n}\n\nfunc padZero(u64 uint64, length int) string {\n\tstr := strconv.Itoa(int(u64))\n\tif len(str) \u003e= length {\n\t\treturn str\n\t} else {\n\t\treturn strings.Repeat(\"0\", length-len(str)) + str\n\t}\n}\n\nfunc boardIDKey(bid BoardID) string {\n\treturn padZero(uint64(bid), 10)\n}\n\nfunc postIDKey(pid PostID) string {\n\treturn padZero(uint64(pid), 10)\n}\n\nfunc indentBody(indent string, body string) string {\n\tlines := strings.Split(body, \"\\n\")\n\tres := \"\"\n\tfor i, line := range lines {\n\t\tif i \u003e 0 {\n\t\t\tres += \"\\n\"\n\t\t}\n\t\tres += indent + line\n\t}\n\treturn res\n}\n\n// NOTE: length must be greater than 3.\nfunc summaryOf(str string, length int) string {\n\tlines := strings.SplitN(str, \"\\n\", 2)\n\tline := lines[0]\n\tif len(line) \u003e length {\n\t\tline = line[:(length-3)] + \"...\"\n\t} else if len(lines) \u003e 1 {\n\t\t// len(line) \u003c= 80\n\t\tline = line + \"...\"\n\t}\n\treturn line\n}\n\nfunc displayAddressMD(addr std.Address) string {\n\tuser := users.GetUserByAddress(addr)\n\tif user == nil {\n\t\treturn \"[\" + addr.String() + \"](/r/demo/users:\" + addr.String() + \")\"\n\t} else {\n\t\treturn \"[@\" + user.Name + \"](/r/demo/users:\" + user.Name + \")\"\n\t}\n}\n\nfunc usernameOf(addr std.Address) string {\n\tuser := users.GetUserByAddress(addr)\n\tif user == nil {\n\t\treturn \"\"\n\t}\n\treturn user.Name\n}\n"},{"name":"post.gno","body":"package boards\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"gno.land/p/demo/avl\"\n)\n\n//----------------------------------------\n// Post\n\n// NOTE: a PostID is relative to the board.\ntype PostID uint64\n\nfunc (pid PostID) String() string {\n\treturn strconv.Itoa(int(pid))\n}\n\n// A Post is a \"thread\" or a \"reply\" depending on context.\n// A thread is a Post of a Board that holds other replies.\ntype Post struct {\n\tboard *Board\n\tid PostID\n\tcreator std.Address\n\ttitle string // optional\n\tbody string\n\treplies avl.Tree // Post.id -\u003e *Post\n\trepliesAll avl.Tree // Post.id -\u003e *Post (all replies, for top-level posts)\n\treposts avl.Tree // Board.id -\u003e Post.id\n\tthreadID PostID // original Post.id\n\tparentID PostID // parent Post.id (if reply or repost)\n\trepostBoard BoardID // original Board.id (if repost)\n\tcreatedAt time.Time\n\tupdatedAt time.Time\n}\n\nfunc newPost(board *Board, id PostID, creator std.Address, title, body string, threadID, parentID PostID, repostBoard BoardID) *Post {\n\treturn \u0026Post{\n\t\tboard: board,\n\t\tid: id,\n\t\tcreator: creator,\n\t\ttitle: title,\n\t\tbody: body,\n\t\treplies: avl.Tree{},\n\t\trepliesAll: avl.Tree{},\n\t\treposts: avl.Tree{},\n\t\tthreadID: threadID,\n\t\tparentID: parentID,\n\t\trepostBoard: repostBoard,\n\t\tcreatedAt: time.Now(),\n\t}\n}\n\nfunc (post *Post) IsThread() bool {\n\treturn post.parentID == 0\n}\n\nfunc (post *Post) GetPostID() PostID {\n\treturn post.id\n}\n\nfunc (post *Post) AddReply(creator std.Address, body string) *Post {\n\tboard := post.board\n\tpid := board.incGetPostID()\n\tpidkey := postIDKey(pid)\n\treply := newPost(board, pid, creator, \"\", body, post.threadID, post.id, 0)\n\tpost.replies.Set(pidkey, reply)\n\tif post.threadID == post.id {\n\t\tpost.repliesAll.Set(pidkey, reply)\n\t} else {\n\t\tthread := board.GetThread(post.threadID)\n\t\tthread.repliesAll.Set(pidkey, reply)\n\t}\n\treturn reply\n}\n\nfunc (post *Post) Update(title string, body string) {\n\tpost.title = title\n\tpost.body = body\n\tpost.updatedAt = time.Now()\n}\n\nfunc (thread *Post) GetReply(pid PostID) *Post {\n\tpidkey := postIDKey(pid)\n\treplyI, ok := thread.repliesAll.Get(pidkey)\n\tif !ok {\n\t\treturn nil\n\t} else {\n\t\treturn replyI.(*Post)\n\t}\n}\n\nfunc (post *Post) AddRepostTo(creator std.Address, title, body string, dst *Board) *Post {\n\tif !post.IsThread() {\n\t\tpanic(\"cannot repost non-thread post\")\n\t}\n\tpid := dst.incGetPostID()\n\tpidkey := postIDKey(pid)\n\trepost := newPost(dst, pid, creator, title, body, pid, post.id, post.board.id)\n\tdst.threads.Set(pidkey, repost)\n\tif !dst.IsPrivate() {\n\t\tbidkey := boardIDKey(dst.id)\n\t\tpost.reposts.Set(bidkey, pid)\n\t}\n\treturn repost\n}\n\nfunc (thread *Post) DeletePost(pid PostID) {\n\tif thread.id == pid {\n\t\tpanic(\"should not happen\")\n\t}\n\tpidkey := postIDKey(pid)\n\tpostI, removed := thread.repliesAll.Remove(pidkey)\n\tif !removed {\n\t\tpanic(\"post not found in thread\")\n\t}\n\tpost := postI.(*Post)\n\tif post.parentID != thread.id {\n\t\tparent := thread.GetReply(post.parentID)\n\t\tparent.replies.Remove(pidkey)\n\t} else {\n\t\tthread.replies.Remove(pidkey)\n\t}\n}\n\nfunc (post *Post) HasPermission(addr std.Address, perm Permission) bool {\n\tif post.creator == addr {\n\t\tswitch perm {\n\t\tcase EditPermission:\n\t\t\treturn true\n\t\tcase DeletePermission:\n\t\t\treturn true\n\t\tdefault:\n\t\t\treturn false\n\t\t}\n\t}\n\t// post notes inherit permissions of the board.\n\treturn post.board.HasPermission(addr, perm)\n}\n\nfunc (post *Post) GetSummary() string {\n\treturn summaryOf(post.body, 80)\n}\n\nfunc (post *Post) GetURL() string {\n\tif post.IsThread() {\n\t\treturn post.board.GetURLFromThreadAndReplyID(\n\t\t\tpost.id, 0)\n\t} else {\n\t\treturn post.board.GetURLFromThreadAndReplyID(\n\t\t\tpost.threadID, post.id)\n\t}\n}\n\nfunc (post *Post) GetReplyFormURL() string {\n\treturn \"/r/demo/boards?help\u0026__func=CreateReply\" +\n\t\t\"\u0026bid=\" + post.board.id.String() +\n\t\t\"\u0026threadid=\" + post.threadID.String() +\n\t\t\"\u0026postid=\" + post.id.String() +\n\t\t\"\u0026body.type=textarea\"\n}\n\nfunc (post *Post) GetRepostFormURL() string {\n\treturn \"/r/demo/boards?help\u0026__func=CreateRepost\" +\n\t\t\"\u0026bid=\" + post.board.id.String() +\n\t\t\"\u0026postid=\" + post.id.String() +\n\t\t\"\u0026title.type=textarea\" +\n\t\t\"\u0026body.type=textarea\" +\n\t\t\"\u0026dstBoardID.type=textarea\"\n}\n\nfunc (post *Post) GetDeleteFormURL() string {\n\treturn \"/r/demo/boards?help\u0026__func=DeletePost\" +\n\t\t\"\u0026bid=\" + post.board.id.String() +\n\t\t\"\u0026threadid=\" + post.threadID.String() +\n\t\t\"\u0026postid=\" + post.id.String()\n}\n\nfunc (post *Post) RenderSummary() string {\n\tif post.repostBoard != 0 {\n\t\tdstBoard := getBoard(post.repostBoard)\n\t\tif dstBoard == nil {\n\t\t\tpanic(\"repostBoard does not exist\")\n\t\t}\n\t\tthread := dstBoard.GetThread(PostID(post.parentID))\n\t\tif thread == nil {\n\t\t\treturn \"reposted post does not exist\"\n\t\t}\n\t\treturn \"Repost: \" + post.GetSummary() + \"\\n\" + thread.RenderSummary()\n\t}\n\tstr := \"\"\n\tif post.title != \"\" {\n\t\tstr += \"## [\" + summaryOf(post.title, 80) + \"](\" + post.GetURL() + \")\\n\"\n\t\tstr += \"\\n\"\n\t}\n\tstr += post.GetSummary() + \"\\n\"\n\tstr += \"\\\\- \" + displayAddressMD(post.creator) + \",\"\n\tstr += \" [\" + post.createdAt.Format(\"2006-01-02 3:04pm MST\") + \"](\" + post.GetURL() + \")\"\n\tstr += \" \\\\[[x](\" + post.GetDeleteFormURL() + \")]\"\n\tstr += \" (\" + strconv.Itoa(post.replies.Size()) + \" replies)\"\n\tstr += \" (\" + strconv.Itoa(post.reposts.Size()) + \" reposts)\" + \"\\n\"\n\treturn str\n}\n\nfunc (post *Post) RenderPost(indent string, levels int) string {\n\tif post == nil {\n\t\treturn \"nil post\"\n\t}\n\tstr := \"\"\n\tif post.title != \"\" {\n\t\tstr += indent + \"# \" + post.title + \"\\n\"\n\t\tstr += indent + \"\\n\"\n\t}\n\tstr += indentBody(indent, post.body) + \"\\n\" // TODO: indent body lines.\n\tstr += indent + \"\\\\- \" + displayAddressMD(post.creator) + \", \"\n\tstr += \"[\" + post.createdAt.Format(\"2006-01-02 3:04pm (MST)\") + \"](\" + post.GetURL() + \")\"\n\tstr += \" \\\\[[reply](\" + post.GetReplyFormURL() + \")]\"\n\tif post.IsThread() {\n\t\tstr += \" \\\\[[repost](\" + post.GetRepostFormURL() + \")]\"\n\t}\n\tstr += \" \\\\[[x](\" + post.GetDeleteFormURL() + \")]\\n\"\n\tif levels \u003e 0 {\n\t\tif post.replies.Size() \u003e 0 {\n\t\t\tpost.replies.Iterate(\"\", \"\", func(key string, value interface{}) bool {\n\t\t\t\tstr += indent + \"\\n\"\n\t\t\t\tstr += value.(*Post).RenderPost(indent+\"\u003e \", levels-1)\n\t\t\t\treturn false\n\t\t\t})\n\t\t}\n\t} else {\n\t\tif post.replies.Size() \u003e 0 {\n\t\t\tstr += indent + \"\\n\"\n\t\t\tstr += indent + \"_[see all \" + strconv.Itoa(post.replies.Size()) + \" replies](\" + post.GetURL() + \")_\\n\"\n\t\t}\n\t}\n\treturn str\n}\n\n// render reply and link to context thread\nfunc (post *Post) RenderInner() string {\n\tif post.IsThread() {\n\t\tpanic(\"unexpected thread\")\n\t}\n\tthreadID := post.threadID\n\t// replyID := post.id\n\tparentID := post.parentID\n\tstr := \"\"\n\tstr += \"_[see thread](\" + post.board.GetURLFromThreadAndReplyID(\n\t\tthreadID, 0) + \")_\\n\\n\"\n\tthread := post.board.GetThread(post.threadID)\n\tvar parent *Post\n\tif thread.id == parentID {\n\t\tparent = thread\n\t} else {\n\t\tparent = thread.GetReply(parentID)\n\t}\n\tstr += parent.RenderPost(\"\", 0)\n\tstr += \"\\n\"\n\tstr += post.RenderPost(\"\u003e \", 5)\n\treturn str\n}\n"},{"name":"public.gno","body":"package boards\n\nimport (\n\t\"std\"\n\t\"strconv\"\n)\n\n//----------------------------------------\n// Public facing functions\n\nfunc GetBoardIDFromName(name string) (BoardID, bool) {\n\tboardI, exists := gBoardsByName.Get(name)\n\tif !exists {\n\t\treturn 0, false\n\t}\n\treturn boardI.(*Board).id, true\n}\n\nfunc CreateBoard(name string) BoardID {\n\tif !(std.IsOriginCall() || std.PrevRealm().IsUser()) {\n\t\tpanic(\"invalid non-user call\")\n\t}\n\tbid := incGetBoardID()\n\tcaller := std.GetOrigCaller()\n\tif usernameOf(caller) == \"\" {\n\t\tpanic(\"unauthorized\")\n\t}\n\turl := \"/r/demo/boards:\" + name\n\tboard := newBoard(bid, url, name, caller)\n\tbidkey := boardIDKey(bid)\n\tgBoards.Set(bidkey, board)\n\tgBoardsByName.Set(name, board)\n\treturn board.id\n}\n\nfunc checkAnonFee() bool {\n\tsent := std.GetOrigSend()\n\tanonFeeCoin := std.NewCoin(\"ugnot\", int64(gDefaultAnonFee))\n\tif len(sent) == 1 \u0026\u0026 sent[0].IsGTE(anonFeeCoin) {\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc CreateThread(bid BoardID, title string, body string) PostID {\n\tif !(std.IsOriginCall() || std.PrevRealm().IsUser()) {\n\t\tpanic(\"invalid non-user call\")\n\t}\n\tcaller := std.GetOrigCaller()\n\tif usernameOf(caller) == \"\" {\n\t\tif !checkAnonFee() {\n\t\t\tpanic(\"please register, otherwise minimum fee \" + strconv.Itoa(gDefaultAnonFee) + \" is required if anonymous\")\n\t\t}\n\t}\n\tboard := getBoard(bid)\n\tif board == nil {\n\t\tpanic(\"board not exist\")\n\t}\n\tthread := board.AddThread(caller, title, body)\n\treturn thread.id\n}\n\nfunc CreateReply(bid BoardID, threadid, postid PostID, body string) PostID {\n\tif !(std.IsOriginCall() || std.PrevRealm().IsUser()) {\n\t\tpanic(\"invalid non-user call\")\n\t}\n\tcaller := std.GetOrigCaller()\n\tif usernameOf(caller) == \"\" {\n\t\tif !checkAnonFee() {\n\t\t\tpanic(\"please register, otherwise minimum fee \" + strconv.Itoa(gDefaultAnonFee) + \" is required if anonymous\")\n\t\t}\n\t}\n\tboard := getBoard(bid)\n\tif board == nil {\n\t\tpanic(\"board not exist\")\n\t}\n\tthread := board.GetThread(threadid)\n\tif thread == nil {\n\t\tpanic(\"thread not exist\")\n\t}\n\tif postid == threadid {\n\t\treply := thread.AddReply(caller, body)\n\t\treturn reply.id\n\t} else {\n\t\tpost := thread.GetReply(postid)\n\t\treply := post.AddReply(caller, body)\n\t\treturn reply.id\n\t}\n}\n\n// If dstBoard is private, does not ping back.\n// If board specified by bid is private, panics.\nfunc CreateRepost(bid BoardID, postid PostID, title string, body string, dstBoardID BoardID) PostID {\n\tif !(std.IsOriginCall() || std.PrevRealm().IsUser()) {\n\t\tpanic(\"invalid non-user call\")\n\t}\n\tcaller := std.GetOrigCaller()\n\tif usernameOf(caller) == \"\" {\n\t\t// TODO: allow with gDefaultAnonFee payment.\n\t\tif !checkAnonFee() {\n\t\t\tpanic(\"please register, otherwise minimum fee \" + strconv.Itoa(gDefaultAnonFee) + \" is required if anonymous\")\n\t\t}\n\t}\n\tboard := getBoard(bid)\n\tif board == nil {\n\t\tpanic(\"src board not exist\")\n\t}\n\tif board.IsPrivate() {\n\t\tpanic(\"cannot repost from a private board\")\n\t}\n\tdst := getBoard(dstBoardID)\n\tif dst == nil {\n\t\tpanic(\"dst board not exist\")\n\t}\n\tthread := board.GetThread(postid)\n\tif thread == nil {\n\t\tpanic(\"thread not exist\")\n\t}\n\trepost := thread.AddRepostTo(caller, title, body, dst)\n\treturn repost.id\n}\n\nfunc DeletePost(bid BoardID, threadid, postid PostID, reason string) {\n\tif !(std.IsOriginCall() || std.PrevRealm().IsUser()) {\n\t\tpanic(\"invalid non-user call\")\n\t}\n\tcaller := std.GetOrigCaller()\n\tboard := getBoard(bid)\n\tif board == nil {\n\t\tpanic(\"board not exist\")\n\t}\n\tthread := board.GetThread(threadid)\n\tif thread == nil {\n\t\tpanic(\"thread not exist\")\n\t}\n\tif postid == threadid {\n\t\t// delete thread\n\t\tif !thread.HasPermission(caller, DeletePermission) {\n\t\t\tpanic(\"unauthorized\")\n\t\t}\n\t\tboard.DeleteThread(threadid)\n\t} else {\n\t\t// delete thread's post\n\t\tpost := thread.GetReply(postid)\n\t\tif post == nil {\n\t\t\tpanic(\"post not exist\")\n\t\t}\n\t\tif !post.HasPermission(caller, DeletePermission) {\n\t\t\tpanic(\"unauthorized\")\n\t\t}\n\t\tthread.DeletePost(postid)\n\t}\n}\n\nfunc EditPost(bid BoardID, threadid, postid PostID, title, body string) {\n\tif !(std.IsOriginCall() || std.PrevRealm().IsUser()) {\n\t\tpanic(\"invalid non-user call\")\n\t}\n\tcaller := std.GetOrigCaller()\n\tboard := getBoard(bid)\n\tif board == nil {\n\t\tpanic(\"board not exist\")\n\t}\n\tthread := board.GetThread(threadid)\n\tif thread == nil {\n\t\tpanic(\"thread not exist\")\n\t}\n\tif postid == threadid {\n\t\t// edit thread\n\t\tif !thread.HasPermission(caller, EditPermission) {\n\t\t\tpanic(\"unauthorized\")\n\t\t}\n\t\tthread.Update(title, body)\n\t} else {\n\t\t// edit thread's post\n\t\tpost := thread.GetReply(postid)\n\t\tif post == nil {\n\t\t\tpanic(\"post not exist\")\n\t\t}\n\t\tif !post.HasPermission(caller, EditPermission) {\n\t\t\tpanic(\"unauthorized\")\n\t\t}\n\t\tpost.Update(title, body)\n\t}\n}\n"},{"name":"render.gno","body":"package boards\n\nimport (\n\t\"strconv\"\n\t\"strings\"\n)\n\n//----------------------------------------\n// Render functions\n\nfunc RenderBoard(bid BoardID) string {\n\tboard := getBoard(bid)\n\tif board == nil {\n\t\treturn \"missing board\"\n\t}\n\treturn board.RenderBoard()\n}\n\nfunc Render(path string) string {\n\tif path == \"\" {\n\t\tstr := \"These are all the boards of this realm:\\n\\n\"\n\t\tgBoards.Iterate(\"\", \"\", func(key string, value interface{}) bool {\n\t\t\tboard := value.(*Board)\n\t\t\tstr += \" * [\" + board.url + \"](\" + board.url + \")\\n\"\n\t\t\treturn false\n\t\t})\n\t\treturn str\n\t}\n\tparts := strings.Split(path, \"/\")\n\tif len(parts) == 1 {\n\t\t// /r/demo/boards:BOARD_NAME\n\t\tname := parts[0]\n\t\tboardI, exists := gBoardsByName.Get(name)\n\t\tif !exists {\n\t\t\treturn \"board does not exist: \" + name\n\t\t}\n\t\treturn boardI.(*Board).RenderBoard()\n\t} else if len(parts) == 2 {\n\t\t// /r/demo/boards:BOARD_NAME/THREAD_ID\n\t\tname := parts[0]\n\t\tboardI, exists := gBoardsByName.Get(name)\n\t\tif !exists {\n\t\t\treturn \"board does not exist: \" + name\n\t\t}\n\t\tpid, err := strconv.Atoi(parts[1])\n\t\tif err != nil {\n\t\t\treturn \"invalid thread id: \" + parts[1]\n\t\t}\n\t\tboard := boardI.(*Board)\n\t\tthread := board.GetThread(PostID(pid))\n\t\tif thread == nil {\n\t\t\treturn \"thread does not exist with id: \" + parts[1]\n\t\t}\n\t\treturn thread.RenderPost(\"\", 5)\n\t} else if len(parts) == 3 {\n\t\t// /r/demo/boards:BOARD_NAME/THREAD_ID/REPLY_ID\n\t\tname := parts[0]\n\t\tboardI, exists := gBoardsByName.Get(name)\n\t\tif !exists {\n\t\t\treturn \"board does not exist: \" + name\n\t\t}\n\t\tpid, err := strconv.Atoi(parts[1])\n\t\tif err != nil {\n\t\t\treturn \"invalid thread id: \" + parts[1]\n\t\t}\n\t\tboard := boardI.(*Board)\n\t\tthread := board.GetThread(PostID(pid))\n\t\tif thread == nil {\n\t\t\treturn \"thread does not exist with id: \" + parts[1]\n\t\t}\n\t\trid, err := strconv.Atoi(parts[2])\n\t\tif err != nil {\n\t\t\treturn \"invalid reply id: \" + parts[2]\n\t\t}\n\t\treply := thread.GetReply(PostID(rid))\n\t\tif reply == nil {\n\t\t\treturn \"reply does not exist with id: \" + parts[2]\n\t\t}\n\t\treturn reply.RenderInner()\n\t} else {\n\t\treturn \"unrecognized path \" + path\n\t}\n}\n"},{"name":"role.gno","body":"package boards\n\ntype Permission string\n\nconst (\n\tDeletePermission Permission = \"role:delete\"\n\tEditPermission Permission = \"role:edit\"\n)\n"},{"name":"z_0_a_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\nimport (\n\t\"gno.land/r/demo/boards\"\n)\n\nvar bid boards.BoardID\n\nfunc init() {\n\tbid = boards.CreateBoard(\"test_board\")\n\tboards.CreateThread(bid, \"First Post (title)\", \"Body of the first post. (body)\")\n\tpid := boards.CreateThread(bid, \"Second Post (title)\", \"Body of the second post. (body)\")\n\tboards.CreateReply(bid, pid, pid, \"Reply of the second post\")\n}\n\nfunc main() {\n\tprintln(boards.Render(\"test_board\"))\n}\n\n// Error:\n// unauthorized\n"},{"name":"z_0_b_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 19900000ugnot\n\nimport (\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar bid boards.BoardID\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tbid = boards.CreateBoard(\"test_board\")\n}\n\nfunc main() {\n\tprintln(boards.Render(\"test_board\"))\n}\n\n// Error:\n// payment must not be less than 20000000\n"},{"name":"z_0_c_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar bid boards.BoardID\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tboards.CreateThread(1, \"First Post (title)\", \"Body of the first post. (body)\")\n}\n\nfunc main() {\n\tprintln(boards.Render(\"test_board\"))\n}\n\n// Error:\n// board not exist\n"},{"name":"z_0_d_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar bid boards.BoardID\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tbid = boards.CreateBoard(\"test_board\")\n\tboards.CreateReply(bid, 0, 0, \"Reply of the second post\")\n}\n\nfunc main() {\n\tprintln(boards.Render(\"test_board\"))\n}\n\n// Error:\n// thread not exist\n"},{"name":"z_0_e_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar bid boards.BoardID\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tboards.CreateReply(bid, 0, 0, \"Reply of the second post\")\n}\n\nfunc main() {\n\tprintln(boards.Render(\"test_board\"))\n}\n\n// Error:\n// board not exist\n"},{"name":"z_0_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 20000000ugnot\n\nimport (\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar bid boards.BoardID\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\tbid = boards.CreateBoard(\"test_board\")\n\tboards.CreateThread(bid, \"First Post (title)\", \"Body of the first post. (body)\")\n\tpid := boards.CreateThread(bid, \"Second Post (title)\", \"Body of the second post. (body)\")\n\tboards.CreateReply(bid, pid, pid, \"Reply of the second post\")\n}\n\nfunc main() {\n\tprintln(boards.Render(\"test_board\"))\n}\n\n// Output:\n// \\[[post](/r/demo/boards?help\u0026__func=CreateThread\u0026bid=1\u0026body.type=textarea)]\n//\n// ----------------------------------------\n// ## [First Post (title)](/r/demo/boards:test_board/1)\n//\n// Body of the first post. (body)\n// \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm UTC](/r/demo/boards:test_board/1) \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=1\u0026postid=1)] (0 replies) (0 reposts)\n//\n// ----------------------------------------\n// ## [Second Post (title)](/r/demo/boards:test_board/2)\n//\n// Body of the second post. (body)\n// \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm UTC](/r/demo/boards:test_board/2) \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=2\u0026postid=2)] (1 replies) (0 reposts)\n"},{"name":"z_10_a_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tbid boards.BoardID\n\tpid boards.PostID\n)\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\tbid = boards.CreateBoard(\"test_board\")\n\tpid = boards.CreateThread(bid, \"First Post in (title)\", \"Body of the first post. (body)\")\n}\n\nfunc main() {\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n\t// boardId 2 not exist\n\tboards.DeletePost(2, pid, pid, \"\")\n\tprintln(\"----------------------------------------------------\")\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n}\n\n// Error:\n// board not exist\n"},{"name":"z_10_b_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tbid boards.BoardID\n\tpid boards.PostID\n)\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\tbid = boards.CreateBoard(\"test_board\")\n\tpid = boards.CreateThread(bid, \"First Post in (title)\", \"Body of the first post. (body)\")\n}\n\nfunc main() {\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n\t// pid of 2 not exist\n\tboards.DeletePost(bid, 2, 2, \"\")\n\tprintln(\"----------------------------------------------------\")\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n}\n\n// Error:\n// thread not exist\n"},{"name":"z_10_c_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tbid boards.BoardID\n\tpid boards.PostID\n\trid boards.PostID\n)\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\tbid = boards.CreateBoard(\"test_board\")\n\tpid = boards.CreateThread(bid, \"First Post in (title)\", \"Body of the first post. (body)\")\n\trid = boards.CreateReply(bid, pid, pid, \"First reply of the First post\\n\")\n}\n\nfunc main() {\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n\tboards.DeletePost(bid, pid, rid, \"\")\n\tprintln(\"----------------------------------------------------\")\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n}\n\n// Output:\n// # First Post in (title)\n//\n// Body of the first post. (body)\n// \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/1) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=1\u0026postid=1\u0026body.type=textarea)] \\[[repost](/r/demo/boards?help\u0026__func=CreateRepost\u0026bid=1\u0026postid=1\u0026title.type=textarea\u0026body.type=textarea\u0026dstBoardID.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=1\u0026postid=1)]\n//\n// \u003e First reply of the First post\n// \u003e\n// \u003e \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/1/2) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=1\u0026postid=2\u0026body.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=1\u0026postid=2)]\n//\n// ----------------------------------------------------\n// # First Post in (title)\n//\n// Body of the first post. (body)\n// \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/1) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=1\u0026postid=1\u0026body.type=textarea)] \\[[repost](/r/demo/boards?help\u0026__func=CreateRepost\u0026bid=1\u0026postid=1\u0026title.type=textarea\u0026body.type=textarea\u0026dstBoardID.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=1\u0026postid=1)]\n"},{"name":"z_10_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tbid boards.BoardID\n\tpid boards.PostID\n)\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\tbid = boards.CreateBoard(\"test_board\")\n\tpid = boards.CreateThread(bid, \"First Post in (title)\", \"Body of the first post. (body)\")\n}\n\nfunc main() {\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n\tboards.DeletePost(bid, pid, pid, \"\")\n\tprintln(\"----------------------------------------------------\")\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n}\n\n// Output:\n// # First Post in (title)\n//\n// Body of the first post. (body)\n// \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/1) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=1\u0026postid=1\u0026body.type=textarea)] \\[[repost](/r/demo/boards?help\u0026__func=CreateRepost\u0026bid=1\u0026postid=1\u0026title.type=textarea\u0026body.type=textarea\u0026dstBoardID.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=1\u0026postid=1)]\n//\n// ----------------------------------------------------\n// thread does not exist with id: 1\n"},{"name":"z_11_a_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tbid boards.BoardID\n\tpid boards.PostID\n)\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\tbid = boards.CreateBoard(\"test_board\")\n\tpid = boards.CreateThread(bid, \"First Post in (title)\", \"Body of the first post. (body)\")\n}\n\nfunc main() {\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n\t// board 2 not exist\n\tboards.EditPost(2, pid, pid, \"Edited: First Post in (title)\", \"Edited: Body of the first post. (body)\")\n\tprintln(\"----------------------------------------------------\")\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n}\n\n// Error:\n// board not exist\n"},{"name":"z_11_b_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tbid boards.BoardID\n\tpid boards.PostID\n)\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\tbid = boards.CreateBoard(\"test_board\")\n\tpid = boards.CreateThread(bid, \"First Post in (title)\", \"Body of the first post. (body)\")\n}\n\nfunc main() {\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n\t// thread 2 not exist\n\tboards.EditPost(bid, 2, pid, \"Edited: First Post in (title)\", \"Edited: Body of the first post. (body)\")\n\tprintln(\"----------------------------------------------------\")\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n}\n\n// Error:\n// thread not exist\n"},{"name":"z_11_c_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tbid boards.BoardID\n\tpid boards.PostID\n)\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\tbid = boards.CreateBoard(\"test_board\")\n\tpid = boards.CreateThread(bid, \"First Post in (title)\", \"Body of the first post. (body)\")\n}\n\nfunc main() {\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n\t// post 2 not exist\n\tboards.EditPost(bid, pid, 2, \"Edited: First Post in (title)\", \"Edited: Body of the first post. (body)\")\n\tprintln(\"----------------------------------------------------\")\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n}\n\n// Error:\n// post not exist\n"},{"name":"z_11_d_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tbid boards.BoardID\n\tpid boards.PostID\n\trid boards.PostID\n)\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\tbid = boards.CreateBoard(\"test_board\")\n\tpid = boards.CreateThread(bid, \"First Post in (title)\", \"Body of the first post. (body)\")\n\trid = boards.CreateReply(bid, pid, pid, \"First reply of the First post\\n\")\n}\n\nfunc main() {\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n\tboards.EditPost(bid, pid, rid, \"\", \"Edited: First reply of the First post\\n\")\n\tprintln(\"----------------------------------------------------\")\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n}\n\n// Output:\n// # First Post in (title)\n//\n// Body of the first post. (body)\n// \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/1) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=1\u0026postid=1\u0026body.type=textarea)] \\[[repost](/r/demo/boards?help\u0026__func=CreateRepost\u0026bid=1\u0026postid=1\u0026title.type=textarea\u0026body.type=textarea\u0026dstBoardID.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=1\u0026postid=1)]\n//\n// \u003e First reply of the First post\n// \u003e\n// \u003e \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/1/2) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=1\u0026postid=2\u0026body.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=1\u0026postid=2)]\n//\n// ----------------------------------------------------\n// # First Post in (title)\n//\n// Body of the first post. (body)\n// \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/1) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=1\u0026postid=1\u0026body.type=textarea)] \\[[repost](/r/demo/boards?help\u0026__func=CreateRepost\u0026bid=1\u0026postid=1\u0026title.type=textarea\u0026body.type=textarea\u0026dstBoardID.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=1\u0026postid=1)]\n//\n// \u003e Edited: First reply of the First post\n// \u003e\n// \u003e \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/1/2) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=1\u0026postid=2\u0026body.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=1\u0026postid=2)]\n"},{"name":"z_11_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tbid boards.BoardID\n\tpid boards.PostID\n)\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\tbid = boards.CreateBoard(\"test_board\")\n\tpid = boards.CreateThread(bid, \"First Post in (title)\", \"Body of the first post. (body)\")\n}\n\nfunc main() {\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n\tboards.EditPost(bid, pid, pid, \"Edited: First Post in (title)\", \"Edited: Body of the first post. (body)\")\n\tprintln(\"----------------------------------------------------\")\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n}\n\n// Output:\n// # First Post in (title)\n//\n// Body of the first post. (body)\n// \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/1) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=1\u0026postid=1\u0026body.type=textarea)] \\[[repost](/r/demo/boards?help\u0026__func=CreateRepost\u0026bid=1\u0026postid=1\u0026title.type=textarea\u0026body.type=textarea\u0026dstBoardID.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=1\u0026postid=1)]\n//\n// ----------------------------------------------------\n// # Edited: First Post in (title)\n//\n// Edited: Body of the first post. (body)\n// \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/1) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=1\u0026postid=1\u0026body.type=textarea)] \\[[repost](/r/demo/boards?help\u0026__func=CreateRepost\u0026bid=1\u0026postid=1\u0026title.type=textarea\u0026body.type=textarea\u0026dstBoardID.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=1\u0026postid=1)]\n"},{"name":"z_12_a_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\t// create a post via registered user\n\tbid1 := boards.CreateBoard(\"test_board1\")\n\tpid := boards.CreateThread(bid1, \"First Post (title)\", \"Body of the first post. (body)\")\n\tbid2 := boards.CreateBoard(\"test_board2\")\n\n\t// create a repost via anon user\n\ttest2 := testutils.TestAddress(\"test2\")\n\tstd.TestSetOrigCaller(test2)\n\tstd.TestSetOrigSend(std.Coins{{\"ugnot\", 9000000}}, nil)\n\n\trid := boards.CreateRepost(bid1, pid, \"\", \"Check this out\", bid2)\n\tprintln(rid)\n\tprintln(boards.Render(\"test_board1\"))\n}\n\n// Error:\n// please register, otherwise minimum fee 100000000 is required if anonymous\n"},{"name":"z_12_b_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tbid1 := boards.CreateBoard(\"test_board1\")\n\tpid := boards.CreateThread(bid1, \"First Post (title)\", \"Body of the first post. (body)\")\n\tbid2 := boards.CreateBoard(\"test_board2\")\n\n\t// create a repost to a non-existing board\n\trid := boards.CreateRepost(5, pid, \"\", \"Check this out\", bid2)\n\tprintln(rid)\n\tprintln(boards.Render(\"test_board1\"))\n}\n\n// Error:\n// src board not exist\n"},{"name":"z_12_c_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tbid1 := boards.CreateBoard(\"test_board1\")\n\tboards.CreateThread(bid1, \"First Post (title)\", \"Body of the first post. (body)\")\n\tbid2 := boards.CreateBoard(\"test_board2\")\n\n\t// create a repost to a non-existing thread\n\trid := boards.CreateRepost(bid1, 5, \"\", \"Check this out\", bid2)\n\tprintln(rid)\n\tprintln(boards.Render(\"test_board1\"))\n}\n\n// Error:\n// thread not exist\n"},{"name":"z_12_d_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tbid1 := boards.CreateBoard(\"test_board1\")\n\tpid := boards.CreateThread(bid1, \"First Post (title)\", \"Body of the first post. (body)\")\n\tboards.CreateBoard(\"test_board2\")\n\n\t// create a repost to a non-existing destination board\n\trid := boards.CreateRepost(bid1, pid, \"\", \"Check this out\", 5)\n\tprintln(rid)\n\tprintln(boards.Render(\"test_board1\"))\n}\n\n// Error:\n// dst board not exist\n"},{"name":"z_12_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tbid1 boards.BoardID\n\tbid2 boards.BoardID\n\tpid boards.PostID\n)\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\tbid1 = boards.CreateBoard(\"test_board1\")\n\tpid = boards.CreateThread(bid1, \"First Post (title)\", \"Body of the first post. (body)\")\n\tbid2 = boards.CreateBoard(\"test_board2\")\n}\n\nfunc main() {\n\trid := boards.CreateRepost(bid1, pid, \"\", \"Check this out\", bid2)\n\tprintln(rid)\n\tprintln(boards.Render(\"test_board2\"))\n}\n\n// Output:\n// 1\n// \\[[post](/r/demo/boards?help\u0026__func=CreateThread\u0026bid=2\u0026body.type=textarea)]\n//\n// ----------------------------------------\n// Repost: Check this out\n// ## [First Post (title)](/r/demo/boards:test_board1/1)\n//\n// Body of the first post. (body)\n// \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm UTC](/r/demo/boards:test_board1/1) \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=1\u0026postid=1)] (0 replies) (1 reposts)\n"},{"name":"z_1_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar board *boards.Board\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\t_ = boards.CreateBoard(\"test_board_1\")\n\t_ = boards.CreateBoard(\"test_board_2\")\n}\n\nfunc main() {\n\tprintln(boards.Render(\"\"))\n}\n\n// Output:\n// These are all the boards of this realm:\n//\n// * [/r/demo/boards:test_board_1](/r/demo/boards:test_board_1)\n// * [/r/demo/boards:test_board_2](/r/demo/boards:test_board_2)\n"},{"name":"z_2_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tbid boards.BoardID\n\tpid boards.PostID\n)\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\tbid = boards.CreateBoard(\"test_board\")\n\tboards.CreateThread(bid, \"First Post (title)\", \"Body of the first post. (body)\")\n\tpid = boards.CreateThread(bid, \"Second Post (title)\", \"Body of the second post. (body)\")\n\tboards.CreateReply(bid, pid, pid, \"Reply of the second post\")\n}\n\nfunc main() {\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n}\n\n// Output:\n// # Second Post (title)\n//\n// Body of the second post. (body)\n// \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=2\u0026postid=2\u0026body.type=textarea)] \\[[repost](/r/demo/boards?help\u0026__func=CreateRepost\u0026bid=1\u0026postid=2\u0026title.type=textarea\u0026body.type=textarea\u0026dstBoardID.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=2\u0026postid=2)]\n//\n// \u003e Reply of the second post\n// \u003e \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2/3) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=2\u0026postid=3\u0026body.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=2\u0026postid=3)]\n"},{"name":"z_3_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tbid boards.BoardID\n\tpid boards.PostID\n)\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\tbid = boards.CreateBoard(\"test_board\")\n\tboards.CreateThread(bid, \"First Post (title)\", \"Body of the first post. (body)\")\n\tpid = boards.CreateThread(bid, \"Second Post (title)\", \"Body of the second post. (body)\")\n}\n\nfunc main() {\n\trid := boards.CreateReply(bid, pid, pid, \"Reply of the second post\")\n\tprintln(rid)\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n}\n\n// Output:\n// 3\n// # Second Post (title)\n//\n// Body of the second post. (body)\n// \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=2\u0026postid=2\u0026body.type=textarea)] \\[[repost](/r/demo/boards?help\u0026__func=CreateRepost\u0026bid=1\u0026postid=2\u0026title.type=textarea\u0026body.type=textarea\u0026dstBoardID.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=2\u0026postid=2)]\n//\n// \u003e Reply of the second post\n// \u003e \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2/3) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=2\u0026postid=3\u0026body.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=2\u0026postid=3)]\n"},{"name":"z_4_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tbid boards.BoardID\n\tpid boards.PostID\n)\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\tbid = boards.CreateBoard(\"test_board\")\n\tboards.CreateThread(bid, \"First Post (title)\", \"Body of the first post. (body)\")\n\tpid = boards.CreateThread(bid, \"Second Post (title)\", \"Body of the second post. (body)\")\n\trid := boards.CreateReply(bid, pid, pid, \"Reply of the second post\")\n\tprintln(rid)\n}\n\nfunc main() {\n\trid2 := boards.CreateReply(bid, pid, pid, \"Second reply of the second post\")\n\tprintln(rid2)\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n}\n\n// Output:\n// 3\n// 4\n// # Second Post (title)\n//\n// Body of the second post. (body)\n// \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=2\u0026postid=2\u0026body.type=textarea)] \\[[repost](/r/demo/boards?help\u0026__func=CreateRepost\u0026bid=1\u0026postid=2\u0026title.type=textarea\u0026body.type=textarea\u0026dstBoardID.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=2\u0026postid=2)]\n//\n// \u003e Reply of the second post\n// \u003e \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2/3) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=2\u0026postid=3\u0026body.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=2\u0026postid=3)]\n//\n// \u003e Second reply of the second post\n// \u003e \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2/4) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=2\u0026postid=4\u0026body.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=2\u0026postid=4)]\n\n// Realm:\n// switchrealm[\"gno.land/r/demo/users\"]\n// switchrealm[\"gno.land/r/demo/boards\"]\n// u[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:111]={\n// \"ObjectInfo\": {\n// \"ID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:111\",\n// \"ModTime\": \"123\",\n// \"OwnerID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:123\",\n// \"RefCount\": \"1\"\n// },\n// \"Value\": {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"68663c8895d37d479e417c11e21badfe21345c61\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:112\"\n// }\n// }\n// }\n// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:125]={\n// \"Fields\": [\n// {\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"16\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.StringValue\",\n// \"value\": \"0000000004\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/r/demo/boards.Post\"\n// }\n// },\n// \"V\": {\n// \"@type\": \"/gno.PointerValue\",\n// \"Base\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Escaped\": true,\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:126\"\n// },\n// \"Index\": \"0\",\n// \"TV\": null\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"64\"\n// }\n// },\n// {\n// \"N\": \"AQAAAAAAAAA=\",\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"32\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// }\n// }\n// ],\n// \"ObjectInfo\": {\n// \"ID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:125\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:124\",\n// \"RefCount\": \"1\"\n// }\n// }\n// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:124]={\n// \"ObjectInfo\": {\n// \"ID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:124\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:123\",\n// \"RefCount\": \"1\"\n// },\n// \"Value\": {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"3f34ac77289aa1d5f9a2f8b6d083138325816fb0\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:125\"\n// }\n// }\n// }\n// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:123]={\n// \"Fields\": [\n// {\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"16\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.StringValue\",\n// \"value\": \"0000000004\"\n// }\n// },\n// {},\n// {\n// \"N\": \"AQAAAAAAAAA=\",\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"64\"\n// }\n// },\n// {\n// \"N\": \"AgAAAAAAAAA=\",\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"32\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// },\n// \"V\": {\n// \"@type\": \"/gno.PointerValue\",\n// \"Base\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"94a6665a44bac6ede7f3e3b87173e537b12f9532\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:111\"\n// },\n// \"Index\": \"0\",\n// \"TV\": null\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// },\n// \"V\": {\n// \"@type\": \"/gno.PointerValue\",\n// \"Base\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"bc8e5b4e782a0bbc4ac9689681f119beb7b34d59\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:124\"\n// },\n// \"Index\": \"0\",\n// \"TV\": null\n// }\n// }\n// ],\n// \"ObjectInfo\": {\n// \"ID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:123\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:122\",\n// \"RefCount\": \"1\"\n// }\n// }\n// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:122]={\n// \"ObjectInfo\": {\n// \"ID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:122\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:106\",\n// \"RefCount\": \"1\"\n// },\n// \"Value\": {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"9957eadbc91dd32f33b0d815e041a32dbdea0671\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:123\"\n// }\n// }\n// }\n// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:128]={\n// \"Fields\": [\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// }\n// }\n// ],\n// \"ObjectInfo\": {\n// \"ID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:128\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:127\",\n// \"RefCount\": \"1\"\n// }\n// }\n// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:129]={\n// \"Fields\": [\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// }\n// }\n// ],\n// \"ObjectInfo\": {\n// \"ID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:129\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:127\",\n// \"RefCount\": \"1\"\n// }\n// }\n// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:130]={\n// \"Fields\": [\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// }\n// }\n// ],\n// \"ObjectInfo\": {\n// \"ID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:130\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:127\",\n// \"RefCount\": \"1\"\n// }\n// }\n// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:131]={\n// \"Fields\": [\n// {\n// \"N\": \"AAAAgJSeXbo=\",\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"65536\"\n// }\n// },\n// {\n// \"N\": \"AbSNdvQQIhE=\",\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"1024\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"time.Location\"\n// }\n// },\n// \"V\": {\n// \"@type\": \"/gno.PointerValue\",\n// \"Base\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Escaped\": true,\n// \"ObjectID\": \"336074805fc853987abe6f7fe3ad97a6a6f3077a:2\"\n// },\n// \"Index\": \"182\",\n// \"TV\": null\n// }\n// }\n// ],\n// \"ObjectInfo\": {\n// \"ID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:131\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:127\",\n// \"RefCount\": \"1\"\n// }\n// }\n// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:132]={\n// \"Fields\": [\n// {\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"65536\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"1024\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"time.Location\"\n// }\n// }\n// }\n// ],\n// \"ObjectInfo\": {\n// \"ID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:132\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:127\",\n// \"RefCount\": \"1\"\n// }\n// }\n// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:127]={\n// \"Fields\": [\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/r/demo/boards.Board\"\n// }\n// },\n// \"V\": {\n// \"@type\": \"/gno.PointerValue\",\n// \"Base\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Escaped\": true,\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:84\"\n// },\n// \"Index\": \"0\",\n// \"TV\": null\n// }\n// },\n// {\n// \"N\": \"BAAAAAAAAAA=\",\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/r/demo/boards.PostID\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"std.Address\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.StringValue\",\n// \"value\": \"g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"16\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.StringValue\",\n// \"value\": \"\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"16\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.StringValue\",\n// \"value\": \"Second reply of the second post\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Tree\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"f91e355bd19240f0f3350a7fa0e6a82b72225916\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:128\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Tree\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"9ee9c4117be283fc51ffcc5ecd65b75ecef5a9dd\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:129\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Tree\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"eb768b0140a5fe95f9c58747f0960d647dacfd42\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:130\"\n// }\n// },\n// {\n// \"N\": \"AgAAAAAAAAA=\",\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/r/demo/boards.PostID\"\n// }\n// },\n// {\n// \"N\": \"AgAAAAAAAAA=\",\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/r/demo/boards.PostID\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/r/demo/boards.BoardID\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"time.Time\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"0fd3352422af0a56a77ef2c9e88f479054e3d51f\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:131\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"time.Time\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"bed4afa8ffdbbf775451c947fc68b27a345ce32a\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:132\"\n// }\n// }\n// ],\n// \"ObjectInfo\": {\n// \"ID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:127\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:126\",\n// \"RefCount\": \"1\"\n// }\n// }\n// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:126]={\n// \"ObjectInfo\": {\n// \"ID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:126\",\n// \"IsEscaped\": true,\n// \"ModTime\": \"0\",\n// \"RefCount\": \"2\"\n// },\n// \"Value\": {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/r/demo/boards.Post\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"c45bbd47a46681a63af973db0ec2180922e4a8ae\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:127\"\n// }\n// }\n// }\n// u[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:120]={\n// \"ObjectInfo\": {\n// \"ID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:120\",\n// \"ModTime\": \"134\",\n// \"OwnerID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:134\",\n// \"RefCount\": \"1\"\n// },\n// \"Value\": {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"dc1f011553dc53e7a846049e08cc77fa35ea6a51\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:121\"\n// }\n// }\n// }\n// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:136]={\n// \"Fields\": [\n// {\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"16\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.StringValue\",\n// \"value\": \"0000000004\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/r/demo/boards.Post\"\n// }\n// },\n// \"V\": {\n// \"@type\": \"/gno.PointerValue\",\n// \"Base\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Escaped\": true,\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:126\"\n// },\n// \"Index\": \"0\",\n// \"TV\": null\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"64\"\n// }\n// },\n// {\n// \"N\": \"AQAAAAAAAAA=\",\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"32\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// }\n// }\n// ],\n// \"ObjectInfo\": {\n// \"ID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:136\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:135\",\n// \"RefCount\": \"1\"\n// }\n// }\n// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:135]={\n// \"ObjectInfo\": {\n// \"ID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:135\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:134\",\n// \"RefCount\": \"1\"\n// },\n// \"Value\": {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"96b86b4585c7f1075d7794180a5581f72733a7ab\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:136\"\n// }\n// }\n// }\n// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:134]={\n// \"Fields\": [\n// {\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"16\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.StringValue\",\n// \"value\": \"0000000004\"\n// }\n// },\n// {},\n// {\n// \"N\": \"AQAAAAAAAAA=\",\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"64\"\n// }\n// },\n// {\n// \"N\": \"AgAAAAAAAAA=\",\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"32\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// },\n// \"V\": {\n// \"@type\": \"/gno.PointerValue\",\n// \"Base\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"32274e1f28fb2b97d67a1262afd362d370de7faa\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:120\"\n// },\n// \"Index\": \"0\",\n// \"TV\": null\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// },\n// \"V\": {\n// \"@type\": \"/gno.PointerValue\",\n// \"Base\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"c2cfd6aec36a462f35bf02e5bf4a127aa1bb7ac2\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:135\"\n// },\n// \"Index\": \"0\",\n// \"TV\": null\n// }\n// }\n// ],\n// \"ObjectInfo\": {\n// \"ID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:134\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:133\",\n// \"RefCount\": \"1\"\n// }\n// }\n// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:133]={\n// \"ObjectInfo\": {\n// \"ID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:133\",\n// \"ModTime\": \"0\",\n// \"OwnerID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:107\",\n// \"RefCount\": \"1\"\n// },\n// \"Value\": {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"5cb875179e86d32c517322af7a323b2a5f3e6cc5\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:134\"\n// }\n// }\n// }\n// u[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:85]={\n// \"Fields\": [\n// {\n// \"N\": \"AQAAAAAAAAA=\",\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/r/demo/boards.BoardID\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"16\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.StringValue\",\n// \"value\": \"/r/demo/boards:test_board\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"16\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.StringValue\",\n// \"value\": \"test_board\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"std.Address\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.StringValue\",\n// \"value\": \"g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Tree\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"a416a751c3a45a1e5cba11e737c51340b081e372\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:86\"\n// }\n// },\n// {\n// \"N\": \"BAAAAAAAAAA=\",\n// \"T\": {\n// \"@type\": \"/gno.PrimitiveType\",\n// \"value\": \"65536\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"time.Time\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"36299fccbc13f2a84c4629fad4cb940f0bd4b1c6\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:87\"\n// }\n// },\n// {\n// \"T\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Tree\"\n// },\n// \"V\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"af6ed0268f99b7f369329094eb6dfaea7812708b\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:88\"\n// }\n// }\n// ],\n// \"ObjectInfo\": {\n// \"ID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:85\",\n// \"ModTime\": \"121\",\n// \"OwnerID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:84\",\n// \"RefCount\": \"1\"\n// }\n// }\n// u[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:106]={\n// \"Fields\": [\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// },\n// \"V\": {\n// \"@type\": \"/gno.PointerValue\",\n// \"Base\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"9809329dc1ddc5d3556f7a8fa3c2cebcbf65560b\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:122\"\n// },\n// \"Index\": \"0\",\n// \"TV\": null\n// }\n// }\n// ],\n// \"ObjectInfo\": {\n// \"ID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:106\",\n// \"ModTime\": \"121\",\n// \"OwnerID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:105\",\n// \"RefCount\": \"1\"\n// }\n// }\n// u[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:107]={\n// \"Fields\": [\n// {\n// \"T\": {\n// \"@type\": \"/gno.PointerType\",\n// \"Elt\": {\n// \"@type\": \"/gno.RefType\",\n// \"ID\": \"gno.land/p/demo/avl.Node\"\n// }\n// },\n// \"V\": {\n// \"@type\": \"/gno.PointerValue\",\n// \"Base\": {\n// \"@type\": \"/gno.RefValue\",\n// \"Hash\": \"ceae9a1c4ed28bb51062e6ccdccfad0caafd1c4f\",\n// \"ObjectID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:133\"\n// },\n// \"Index\": \"0\",\n// \"TV\": null\n// }\n// }\n// ],\n// \"ObjectInfo\": {\n// \"ID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:107\",\n// \"ModTime\": \"121\",\n// \"OwnerID\": \"f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:105\",\n// \"RefCount\": \"1\"\n// }\n// }\n// switchrealm[\"gno.land/r/demo/boards\"]\n// switchrealm[\"gno.land/r/demo/users\"]\n// switchrealm[\"gno.land/r/demo/users\"]\n// switchrealm[\"gno.land/r/demo/users\"]\n// switchrealm[\"gno.land/r/demo/boards\"]\n// switchrealm[\"gno.land/r/demo/boards_test\"]\n"},{"name":"z_5_b_filetest.gno","body":"package main\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj\")\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\t// create board via registered user\n\tbid := boards.CreateBoard(\"test_board\")\n\n\t// create post via anon user\n\ttest2 := testutils.TestAddress(\"test2\")\n\tstd.TestSetOrigCaller(test2)\n\tstd.TestSetOrigSend(std.Coins{{\"ugnot\", 9000000}}, nil)\n\n\tpid := boards.CreateThread(bid, \"First Post (title)\", \"Body of the first post. (body)\")\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n}\n\n// Error:\n// please register, otherwise minimum fee 100000000 is required if anonymous\n"},{"name":"z_5_c_filetest.gno","body":"package main\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj\")\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\t// create board via registered user\n\tbid := boards.CreateBoard(\"test_board\")\n\n\t// create post via anon user\n\ttest2 := testutils.TestAddress(\"test2\")\n\tstd.TestSetOrigCaller(test2)\n\tstd.TestSetOrigSend(std.Coins{{\"ugnot\", 101000000}}, nil)\n\n\tpid := boards.CreateThread(bid, \"First Post (title)\", \"Body of the first post. (body)\")\n\tboards.CreateReply(bid, pid, pid, \"Reply of the first post\")\n\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n}\n\n// Output:\n// # First Post (title)\n//\n// Body of the first post. (body)\n// \\- [g1w3jhxapjta047h6lta047h6lta047h6laqcyu4](/r/demo/users:g1w3jhxapjta047h6lta047h6lta047h6laqcyu4), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/1) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=1\u0026postid=1\u0026body.type=textarea)] \\[[repost](/r/demo/boards?help\u0026__func=CreateRepost\u0026bid=1\u0026postid=1\u0026title.type=textarea\u0026body.type=textarea\u0026dstBoardID.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=1\u0026postid=1)]\n//\n// \u003e Reply of the first post\n// \u003e \\- [g1w3jhxapjta047h6lta047h6lta047h6laqcyu4](/r/demo/users:g1w3jhxapjta047h6lta047h6lta047h6laqcyu4), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/1/2) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=1\u0026postid=2\u0026body.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=1\u0026postid=2)]\n"},{"name":"z_5_d_filetest.gno","body":"package main\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = std.Address(\"g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj\")\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\t// create board via registered user\n\tbid := boards.CreateBoard(\"test_board\")\n\tpid := boards.CreateThread(bid, \"First Post (title)\", \"Body of the first post. (body)\")\n\n\t// create reply via anon user\n\ttest2 := testutils.TestAddress(\"test2\")\n\tstd.TestSetOrigCaller(test2)\n\tstd.TestSetOrigSend(std.Coins{{\"ugnot\", 9000000}}, nil)\n\tboards.CreateReply(bid, pid, pid, \"Reply of the first post\")\n\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n}\n\n// Error:\n// please register, otherwise minimum fee 100000000 is required if anonymous\n"},{"name":"z_5_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tbid boards.BoardID\n\tpid boards.PostID\n)\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\tbid = boards.CreateBoard(\"test_board\")\n\tboards.CreateThread(bid, \"First Post (title)\", \"Body of the first post. (body)\")\n\tpid = boards.CreateThread(bid, \"Second Post (title)\", \"Body of the second post. (body)\")\n\trid := boards.CreateReply(bid, pid, pid, \"Reply of the second post\")\n}\n\nfunc main() {\n\trid2 := boards.CreateReply(bid, pid, pid, \"Second reply of the second post\\n\")\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n}\n\n// Output:\n// # Second Post (title)\n//\n// Body of the second post. (body)\n// \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=2\u0026postid=2\u0026body.type=textarea)] \\[[repost](/r/demo/boards?help\u0026__func=CreateRepost\u0026bid=1\u0026postid=2\u0026title.type=textarea\u0026body.type=textarea\u0026dstBoardID.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=2\u0026postid=2)]\n//\n// \u003e Reply of the second post\n// \u003e \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2/3) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=2\u0026postid=3\u0026body.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=2\u0026postid=3)]\n//\n// \u003e Second reply of the second post\n// \u003e\n// \u003e \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2/4) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=2\u0026postid=4\u0026body.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=2\u0026postid=4)]\n"},{"name":"z_6_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tbid boards.BoardID\n\tpid boards.PostID\n\trid boards.PostID\n)\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\tbid = boards.CreateBoard(\"test_board\")\n\tboards.CreateThread(bid, \"First Post (title)\", \"Body of the first post. (body)\")\n\tpid = boards.CreateThread(bid, \"Second Post (title)\", \"Body of the second post. (body)\")\n\trid = boards.CreateReply(bid, pid, pid, \"Reply of the second post\")\n}\n\nfunc main() {\n\tboards.CreateReply(bid, pid, pid, \"Second reply of the second post\\n\")\n\tboards.CreateReply(bid, pid, rid, \"First reply of the first reply\\n\")\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid))))\n}\n\n// Output:\n// # Second Post (title)\n//\n// Body of the second post. (body)\n// \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=2\u0026postid=2\u0026body.type=textarea)] \\[[repost](/r/demo/boards?help\u0026__func=CreateRepost\u0026bid=1\u0026postid=2\u0026title.type=textarea\u0026body.type=textarea\u0026dstBoardID.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=2\u0026postid=2)]\n//\n// \u003e Reply of the second post\n// \u003e \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2/3) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=2\u0026postid=3\u0026body.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=2\u0026postid=3)]\n// \u003e\n// \u003e \u003e First reply of the first reply\n// \u003e \u003e\n// \u003e \u003e \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2/5) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=2\u0026postid=5\u0026body.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=2\u0026postid=5)]\n//\n// \u003e Second reply of the second post\n// \u003e\n// \u003e \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2/4) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=2\u0026postid=4\u0026body.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=2\u0026postid=4)]\n"},{"name":"z_7_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nfunc init() {\n\t// register\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\t// create board and post\n\tbid := boards.CreateBoard(\"test_board\")\n\tboards.CreateThread(bid, \"First Post (title)\", \"Body of the first post. (body)\")\n}\n\nfunc main() {\n\tprintln(boards.Render(\"test_board\"))\n}\n\n// Output:\n// \\[[post](/r/demo/boards?help\u0026__func=CreateThread\u0026bid=1\u0026body.type=textarea)]\n//\n// ----------------------------------------\n// ## [First Post (title)](/r/demo/boards:test_board/1)\n//\n// Body of the first post. (body)\n// \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm UTC](/r/demo/boards:test_board/1) \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=1\u0026postid=1)] (0 replies) (0 reposts)\n"},{"name":"z_8_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tbid boards.BoardID\n\tpid boards.PostID\n\trid boards.PostID\n)\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\tbid = boards.CreateBoard(\"test_board\")\n\tboards.CreateThread(bid, \"First Post (title)\", \"Body of the first post. (body)\")\n\tpid = boards.CreateThread(bid, \"Second Post (title)\", \"Body of the second post. (body)\")\n\trid = boards.CreateReply(bid, pid, pid, \"Reply of the second post\")\n}\n\nfunc main() {\n\tboards.CreateReply(bid, pid, pid, \"Second reply of the second post\\n\")\n\trid2 := boards.CreateReply(bid, pid, rid, \"First reply of the first reply\\n\")\n\tprintln(boards.Render(\"test_board/\" + strconv.Itoa(int(pid)) + \"/\" + strconv.Itoa(int(rid2))))\n}\n\n// Output:\n// _[see thread](/r/demo/boards:test_board/2)_\n//\n// Reply of the second post\n// \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2/3) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=2\u0026postid=3\u0026body.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=2\u0026postid=3)]\n//\n// _[see all 1 replies](/r/demo/boards:test_board/2/3)_\n//\n// \u003e First reply of the first reply\n// \u003e\n// \u003e \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2/5) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=1\u0026threadid=2\u0026postid=5\u0026body.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=1\u0026threadid=2\u0026postid=5)]\n"},{"name":"z_9_a_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar dstBoard boards.BoardID\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\tdstBoard = boards.CreateBoard(\"dst_board\")\n\n\tboards.CreateRepost(0, 0, \"First Post in (title)\", \"Body of the first post. (body)\", dstBoard)\n}\n\nfunc main() {\n}\n\n// Error:\n// src board not exist\n"},{"name":"z_9_b_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tsrcBoard boards.BoardID\n\tpid boards.PostID\n)\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\tsrcBoard = boards.CreateBoard(\"first_board\")\n\tpid = boards.CreateThread(srcBoard, \"First Post in (title)\", \"Body of the first post. (body)\")\n\n\tboards.CreateRepost(srcBoard, pid, \"First Post in (title)\", \"Body of the first post. (body)\", 0)\n}\n\nfunc main() {\n}\n\n// Error:\n// dst board not exist\n"},{"name":"z_9_filetest.gno","body":"// PKGPATH: gno.land/r/demo/boards_test\npackage boards_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"strconv\"\n\n\t\"gno.land/r/demo/boards\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tfirstBoard boards.BoardID\n\tsecondBoard boards.BoardID\n\tpid boards.PostID\n)\n\nfunc init() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\n\tfirstBoard = boards.CreateBoard(\"first_board\")\n\tsecondBoard = boards.CreateBoard(\"second_board\")\n\tpid = boards.CreateThread(firstBoard, \"First Post in (title)\", \"Body of the first post. (body)\")\n\n\tboards.CreateRepost(firstBoard, pid, \"First Post in (title)\", \"Body of the first post. (body)\", secondBoard)\n}\n\nfunc main() {\n\tprintln(boards.Render(\"second_board/\" + strconv.Itoa(int(pid))))\n}\n\n// Output:\n// # First Post in (title)\n//\n// Body of the first post. (body)\n// \\- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:second_board/1/1) \\[[reply](/r/demo/boards?help\u0026__func=CreateReply\u0026bid=2\u0026threadid=1\u0026postid=1\u0026body.type=textarea)] \\[[x](/r/demo/boards?help\u0026__func=DeletePost\u0026bid=2\u0026threadid=1\u0026postid=1)]\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} {"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"groups","path":"gno.land/p/demo/groups","files":[{"name":"groups.gno","body":"package groups\n\nimport \"gno.land/r/demo/boards\"\n\n// TODO implement something and test.\ntype Group struct {\n\tBoard *boards.Board\n}\n"},{"name":"vote_set.gno","body":"package groups\n\nimport (\n\t\"std\"\n\t\"time\"\n\n\t\"gno.land/p/demo/rat\"\n)\n\n//----------------------------------------\n// VoteSet\n\ntype VoteSet interface {\n\t// number of present votes in set.\n\tSize() int\n\t// add or update vote for voter.\n\tSetVote(voter std.Address, value string) error\n\t// count the number of votes for value.\n\tCountVotes(value string) int\n}\n\n//----------------------------------------\n// VoteList\n\ntype Vote struct {\n\tVoter std.Address\n\tValue string\n}\n\ntype VoteList []Vote\n\nfunc NewVoteList() *VoteList {\n\treturn \u0026VoteList{}\n}\n\nfunc (vlist *VoteList) Size() int {\n\treturn len(*vlist)\n}\n\nfunc (vlist *VoteList) SetVote(voter std.Address, value string) error {\n\t// TODO optimize with binary algorithm\n\tfor i, vote := range *vlist {\n\t\tif vote.Voter == voter {\n\t\t\t// update vote\n\t\t\t(*vlist)[i] = Vote{\n\t\t\t\tVoter: voter,\n\t\t\t\tValue: value,\n\t\t\t}\n\t\t\treturn nil\n\t\t}\n\t}\n\t*vlist = append(*vlist, Vote{\n\t\tVoter: voter,\n\t\tValue: value,\n\t})\n\treturn nil\n}\n\nfunc (vlist *VoteList) CountVotes(target string) int {\n\t// TODO optimize with binary algorithm\n\tvar count int\n\tfor _, vote := range *vlist {\n\t\tif vote.Value == target {\n\t\t\tcount++\n\t\t}\n\t}\n\treturn count\n}\n\n//----------------------------------------\n// Committee\n\ntype Committee struct {\n\tQuorum rat.Rat\n\tThreshold rat.Rat\n\tAddresses std.AddressSet\n}\n\n//----------------------------------------\n// VoteSession\n// NOTE: this seems a bit too formal and\n// complicated vs what might be possible;\n// something simpler, more informal.\n\ntype SessionStatus int\n\nconst (\n\tSessionNew SessionStatus = iota\n\tSessionStarted\n\tSessionCompleted\n\tSessionCanceled\n)\n\ntype VoteSession struct {\n\tName string\n\tCreator std.Address\n\tBody string\n\tStart time.Time\n\tDeadline time.Time\n\tStatus SessionStatus\n\tCommittee *Committee\n\tVotes VoteSet\n\tChoices []string\n\tResult string\n}\n"},{"name":"z_1_filetest.gno","body":"// PKGPATH: gno.land/r/demo/groups_test\npackage groups_test\n\nimport (\n\t\"gno.land/p/demo/groups\"\n\t\"gno.land/p/demo/testutils\"\n)\n\nvar vset groups.VoteSet\n\nfunc init() {\n\taddr1 := testutils.TestAddress(\"test1\")\n\taddr2 := testutils.TestAddress(\"test2\")\n\tvset = groups.NewVoteList()\n\tvset.SetVote(addr1, \"yes\")\n\tvset.SetVote(addr2, \"yes\")\n}\n\nfunc main() {\n\tprintln(vset.Size())\n\tprintln(\"yes:\", vset.CountVotes(\"yes\"))\n\tprintln(\"no:\", vset.CountVotes(\"no\"))\n}\n\n// Output:\n// 2\n// yes: 2\n// no: 0\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} {"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"uint256","path":"gno.land/p/demo/uint256","files":[{"name":"LICENSE","body":"BSD 3-Clause License\n\nCopyright 2020 uint256 Authors\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this\n list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice,\n this list of conditions and the following disclaimer in the documentation\n and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its\n contributors may be used to endorse or promote products derived from\n this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\nAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE\nDISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\nSERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\nCAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,\nOR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"},{"name":"README.md","body":"# Fixed size 256-bit math library\n\nThis is a library specialized at replacing the `big.Int` library for math based on 256-bit types.\n\noriginal repository: [uint256](\u003chttps://github.com/holiman/uint256/tree/master\u003e)\n"},{"name":"arithmetic.gno","body":"// arithmetic provides arithmetic operations for Uint objects.\n// This includes basic binary operations such as addition, subtraction, multiplication, division, and modulo operations\n// as well as overflow checks, and negation. These functions are essential for numeric\n// calculations using 256-bit unsigned integers.\npackage uint256\n\nimport (\n\t\"math/bits\"\n)\n\n// Add sets z to the sum x+y\nfunc (z *Uint) Add(x, y *Uint) *Uint {\n\tvar carry uint64\n\tz.arr[0], carry = bits.Add64(x.arr[0], y.arr[0], 0)\n\tz.arr[1], carry = bits.Add64(x.arr[1], y.arr[1], carry)\n\tz.arr[2], carry = bits.Add64(x.arr[2], y.arr[2], carry)\n\tz.arr[3], _ = bits.Add64(x.arr[3], y.arr[3], carry)\n\treturn z\n}\n\n// AddOverflow sets z to the sum x+y, and returns z and whether overflow occurred\nfunc (z *Uint) AddOverflow(x, y *Uint) (*Uint, bool) {\n\tvar carry uint64\n\tz.arr[0], carry = bits.Add64(x.arr[0], y.arr[0], 0)\n\tz.arr[1], carry = bits.Add64(x.arr[1], y.arr[1], carry)\n\tz.arr[2], carry = bits.Add64(x.arr[2], y.arr[2], carry)\n\tz.arr[3], carry = bits.Add64(x.arr[3], y.arr[3], carry)\n\treturn z, carry != 0\n}\n\n// Sub sets z to the difference x-y\nfunc (z *Uint) Sub(x, y *Uint) *Uint {\n\tvar carry uint64\n\tz.arr[0], carry = bits.Sub64(x.arr[0], y.arr[0], 0)\n\tz.arr[1], carry = bits.Sub64(x.arr[1], y.arr[1], carry)\n\tz.arr[2], carry = bits.Sub64(x.arr[2], y.arr[2], carry)\n\tz.arr[3], _ = bits.Sub64(x.arr[3], y.arr[3], carry)\n\treturn z\n}\n\n// SubOverflow sets z to the difference x-y and returns z and true if the operation underflowed\nfunc (z *Uint) SubOverflow(x, y *Uint) (*Uint, bool) {\n\tvar carry uint64\n\tz.arr[0], carry = bits.Sub64(x.arr[0], y.arr[0], 0)\n\tz.arr[1], carry = bits.Sub64(x.arr[1], y.arr[1], carry)\n\tz.arr[2], carry = bits.Sub64(x.arr[2], y.arr[2], carry)\n\tz.arr[3], carry = bits.Sub64(x.arr[3], y.arr[3], carry)\n\treturn z, carry != 0\n}\n\n// Neg returns -x mod 2^256.\nfunc (z *Uint) Neg(x *Uint) *Uint {\n\treturn z.Sub(new(Uint), x)\n}\n\n// commented out for possible overflow\n// Mul sets z to the product x*y\nfunc (z *Uint) Mul(x, y *Uint) *Uint {\n\tvar (\n\t\tres Uint\n\t\tcarry uint64\n\t\tres1, res2, res3 uint64\n\t)\n\n\tcarry, res.arr[0] = bits.Mul64(x.arr[0], y.arr[0])\n\tcarry, res1 = umulHop(carry, x.arr[1], y.arr[0])\n\tcarry, res2 = umulHop(carry, x.arr[2], y.arr[0])\n\tres3 = x.arr[3]*y.arr[0] + carry\n\n\tcarry, res.arr[1] = umulHop(res1, x.arr[0], y.arr[1])\n\tcarry, res2 = umulStep(res2, x.arr[1], y.arr[1], carry)\n\tres3 = res3 + x.arr[2]*y.arr[1] + carry\n\n\tcarry, res.arr[2] = umulHop(res2, x.arr[0], y.arr[2])\n\tres3 = res3 + x.arr[1]*y.arr[2] + carry\n\n\tres.arr[3] = res3 + x.arr[0]*y.arr[3]\n\n\treturn z.Set(\u0026res)\n}\n\n// MulOverflow sets z to the product x*y, and returns z and whether overflow occurred\nfunc (z *Uint) MulOverflow(x, y *Uint) (*Uint, bool) {\n\tp := umul(x, y)\n\tcopy(z.arr[:], p[:4])\n\treturn z, (p[4] | p[5] | p[6] | p[7]) != 0\n}\n\n// commented out for possible overflow\n// Div sets z to the quotient x/y for returns z.\n// If y == 0, z is set to 0\nfunc (z *Uint) Div(x, y *Uint) *Uint {\n\tif y.IsZero() || y.Gt(x) {\n\t\treturn z.Clear()\n\t}\n\tif x.Eq(y) {\n\t\treturn z.SetOne()\n\t}\n\t// Shortcut some cases\n\tif x.IsUint64() {\n\t\treturn z.SetUint64(x.Uint64() / y.Uint64())\n\t}\n\n\t// At this point, we know\n\t// x/y ; x \u003e y \u003e 0\n\n\tvar quot Uint\n\tudivrem(quot.arr[:], x.arr[:], y)\n\treturn z.Set(\u0026quot)\n}\n\n// MulMod calculates the modulo-m multiplication of x and y and\n// returns z.\n// If m == 0, z is set to 0 (OBS: differs from the big.Int)\nfunc (z *Uint) MulMod(x, y, m *Uint) *Uint {\n\tif x.IsZero() || y.IsZero() || m.IsZero() {\n\t\treturn z.Clear()\n\t}\n\tp := umul(x, y)\n\n\tif m.arr[3] != 0 {\n\t\tmu := Reciprocal(m)\n\t\tr := reduce4(p, m, mu)\n\t\treturn z.Set(\u0026r)\n\t}\n\n\tvar (\n\t\tpl Uint\n\t\tph Uint\n\t)\n\n\tpl = Uint{arr: [4]uint64{p[0], p[1], p[2], p[3]}}\n\tph = Uint{arr: [4]uint64{p[4], p[5], p[6], p[7]}}\n\n\t// If the multiplication is within 256 bits use Mod().\n\tif ph.IsZero() {\n\t\treturn z.Mod(\u0026pl, m)\n\t}\n\n\tvar quot [8]uint64\n\trem := udivrem(quot[:], p[:], m)\n\treturn z.Set(\u0026rem)\n}\n\n// Mod sets z to the modulus x%y for y != 0 and returns z.\n// If y == 0, z is set to 0 (OBS: differs from the big.Uint)\nfunc (z *Uint) Mod(x, y *Uint) *Uint {\n\tif x.IsZero() || y.IsZero() {\n\t\treturn z.Clear()\n\t}\n\tswitch x.Cmp(y) {\n\tcase -1:\n\t\t// x \u003c y\n\t\tcopy(z.arr[:], x.arr[:])\n\t\treturn z\n\tcase 0:\n\t\t// x == y\n\t\treturn z.Clear() // They are equal\n\t}\n\n\t// At this point:\n\t// x != 0\n\t// y != 0\n\t// x \u003e y\n\n\t// Shortcut trivial case\n\tif x.IsUint64() {\n\t\treturn z.SetUint64(x.Uint64() % y.Uint64())\n\t}\n\n\tvar quot Uint\n\t*z = udivrem(quot.arr[:], x.arr[:], y)\n\treturn z\n}\n\n// DivMod sets z to the quotient x div y and m to the modulus x mod y and returns the pair (z, m) for y != 0.\n// If y == 0, both z and m are set to 0 (OBS: differs from the big.Int)\nfunc (z *Uint) DivMod(x, y, m *Uint) (*Uint, *Uint) {\n\tif y.IsZero() {\n\t\treturn z.Clear(), m.Clear()\n\t}\n\tvar quot Uint\n\t*m = udivrem(quot.arr[:], x.arr[:], y)\n\t*z = quot\n\treturn z, m\n}\n\n// Exp sets z = base**exponent mod 2**256, and returns z.\nfunc (z *Uint) Exp(base, exponent *Uint) *Uint {\n\tres := Uint{arr: [4]uint64{1, 0, 0, 0}}\n\tmultiplier := *base\n\texpBitLen := exponent.BitLen()\n\n\tcurBit := 0\n\tword := exponent.arr[0]\n\tfor ; curBit \u003c expBitLen \u0026\u0026 curBit \u003c 64; curBit++ {\n\t\tif word\u00261 == 1 {\n\t\t\tres.Mul(\u0026res, \u0026multiplier)\n\t\t}\n\t\tmultiplier.squared()\n\t\tword \u003e\u003e= 1\n\t}\n\n\tword = exponent.arr[1]\n\tfor ; curBit \u003c expBitLen \u0026\u0026 curBit \u003c 128; curBit++ {\n\t\tif word\u00261 == 1 {\n\t\t\tres.Mul(\u0026res, \u0026multiplier)\n\t\t}\n\t\tmultiplier.squared()\n\t\tword \u003e\u003e= 1\n\t}\n\n\tword = exponent.arr[2]\n\tfor ; curBit \u003c expBitLen \u0026\u0026 curBit \u003c 192; curBit++ {\n\t\tif word\u00261 == 1 {\n\t\t\tres.Mul(\u0026res, \u0026multiplier)\n\t\t}\n\t\tmultiplier.squared()\n\t\tword \u003e\u003e= 1\n\t}\n\n\tword = exponent.arr[3]\n\tfor ; curBit \u003c expBitLen \u0026\u0026 curBit \u003c 256; curBit++ {\n\t\tif word\u00261 == 1 {\n\t\t\tres.Mul(\u0026res, \u0026multiplier)\n\t\t}\n\t\tmultiplier.squared()\n\t\tword \u003e\u003e= 1\n\t}\n\treturn z.Set(\u0026res)\n}\n\nfunc (z *Uint) squared() {\n\tvar (\n\t\tres Uint\n\t\tcarry0, carry1, carry2 uint64\n\t\tres1, res2 uint64\n\t)\n\n\tcarry0, res.arr[0] = bits.Mul64(z.arr[0], z.arr[0])\n\tcarry0, res1 = umulHop(carry0, z.arr[0], z.arr[1])\n\tcarry0, res2 = umulHop(carry0, z.arr[0], z.arr[2])\n\n\tcarry1, res.arr[1] = umulHop(res1, z.arr[0], z.arr[1])\n\tcarry1, res2 = umulStep(res2, z.arr[1], z.arr[1], carry1)\n\n\tcarry2, res.arr[2] = umulHop(res2, z.arr[0], z.arr[2])\n\n\tres.arr[3] = 2*(z.arr[0]*z.arr[3]+z.arr[1]*z.arr[2]) + carry0 + carry1 + carry2\n\n\tz.Set(\u0026res)\n}\n\n// udivrem divides u by d and produces both quotient and remainder.\n// The quotient is stored in provided quot - len(u)-len(d)+1 words.\n// It loosely follows the Knuth's division algorithm (sometimes referenced as \"schoolbook\" division) using 64-bit words.\n// See Knuth, Volume 2, section 4.3.1, Algorithm D.\nfunc udivrem(quot, u []uint64, d *Uint) (rem Uint) {\n\tvar dLen int\n\tfor i := len(d.arr) - 1; i \u003e= 0; i-- {\n\t\tif d.arr[i] != 0 {\n\t\t\tdLen = i + 1\n\t\t\tbreak\n\t\t}\n\t}\n\n\tshift := uint(bits.LeadingZeros64(d.arr[dLen-1]))\n\n\tvar dnStorage Uint\n\tdn := dnStorage.arr[:dLen]\n\tfor i := dLen - 1; i \u003e 0; i-- {\n\t\tdn[i] = (d.arr[i] \u003c\u003c shift) | (d.arr[i-1] \u003e\u003e (64 - shift))\n\t}\n\tdn[0] = d.arr[0] \u003c\u003c shift\n\n\tvar uLen int\n\tfor i := len(u) - 1; i \u003e= 0; i-- {\n\t\tif u[i] != 0 {\n\t\t\tuLen = i + 1\n\t\t\tbreak\n\t\t}\n\t}\n\n\tif uLen \u003c dLen {\n\t\tcopy(rem.arr[:], u)\n\t\treturn rem\n\t}\n\n\tvar unStorage [9]uint64\n\tun := unStorage[:uLen+1]\n\tun[uLen] = u[uLen-1] \u003e\u003e (64 - shift)\n\tfor i := uLen - 1; i \u003e 0; i-- {\n\t\tun[i] = (u[i] \u003c\u003c shift) | (u[i-1] \u003e\u003e (64 - shift))\n\t}\n\tun[0] = u[0] \u003c\u003c shift\n\n\t// TODO: Skip the highest word of numerator if not significant.\n\n\tif dLen == 1 {\n\t\tr := udivremBy1(quot, un, dn[0])\n\t\trem.SetUint64(r \u003e\u003e shift)\n\t\treturn rem\n\t}\n\n\tudivremKnuth(quot, un, dn)\n\n\tfor i := 0; i \u003c dLen-1; i++ {\n\t\trem.arr[i] = (un[i] \u003e\u003e shift) | (un[i+1] \u003c\u003c (64 - shift))\n\t}\n\trem.arr[dLen-1] = un[dLen-1] \u003e\u003e shift\n\n\treturn rem\n}\n\n// umul computes full 256 x 256 -\u003e 512 multiplication.\nfunc umul(x, y *Uint) [8]uint64 {\n\tvar (\n\t\tres [8]uint64\n\t\tcarry, carry4, carry5, carry6 uint64\n\t\tres1, res2, res3, res4, res5 uint64\n\t)\n\n\tcarry, res[0] = bits.Mul64(x.arr[0], y.arr[0])\n\tcarry, res1 = umulHop(carry, x.arr[1], y.arr[0])\n\tcarry, res2 = umulHop(carry, x.arr[2], y.arr[0])\n\tcarry4, res3 = umulHop(carry, x.arr[3], y.arr[0])\n\n\tcarry, res[1] = umulHop(res1, x.arr[0], y.arr[1])\n\tcarry, res2 = umulStep(res2, x.arr[1], y.arr[1], carry)\n\tcarry, res3 = umulStep(res3, x.arr[2], y.arr[1], carry)\n\tcarry5, res4 = umulStep(carry4, x.arr[3], y.arr[1], carry)\n\n\tcarry, res[2] = umulHop(res2, x.arr[0], y.arr[2])\n\tcarry, res3 = umulStep(res3, x.arr[1], y.arr[2], carry)\n\tcarry, res4 = umulStep(res4, x.arr[2], y.arr[2], carry)\n\tcarry6, res5 = umulStep(carry5, x.arr[3], y.arr[2], carry)\n\n\tcarry, res[3] = umulHop(res3, x.arr[0], y.arr[3])\n\tcarry, res[4] = umulStep(res4, x.arr[1], y.arr[3], carry)\n\tcarry, res[5] = umulStep(res5, x.arr[2], y.arr[3], carry)\n\tres[7], res[6] = umulStep(carry6, x.arr[3], y.arr[3], carry)\n\n\treturn res\n}\n\n// umulStep computes (hi * 2^64 + lo) = z + (x * y) + carry.\nfunc umulStep(z, x, y, carry uint64) (hi, lo uint64) {\n\thi, lo = bits.Mul64(x, y)\n\tlo, carry = bits.Add64(lo, carry, 0)\n\thi, _ = bits.Add64(hi, 0, carry)\n\tlo, carry = bits.Add64(lo, z, 0)\n\thi, _ = bits.Add64(hi, 0, carry)\n\treturn hi, lo\n}\n\n// umulHop computes (hi * 2^64 + lo) = z + (x * y)\nfunc umulHop(z, x, y uint64) (hi, lo uint64) {\n\thi, lo = bits.Mul64(x, y)\n\tlo, carry := bits.Add64(lo, z, 0)\n\thi, _ = bits.Add64(hi, 0, carry)\n\treturn hi, lo\n}\n\n// udivremBy1 divides u by single normalized word d and produces both quotient and remainder.\n// The quotient is stored in provided quot.\nfunc udivremBy1(quot, u []uint64, d uint64) (rem uint64) {\n\treciprocal := reciprocal2by1(d)\n\trem = u[len(u)-1] // Set the top word as remainder.\n\tfor j := len(u) - 2; j \u003e= 0; j-- {\n\t\tquot[j], rem = udivrem2by1(rem, u[j], d, reciprocal)\n\t}\n\treturn rem\n}\n\n// udivremKnuth implements the division of u by normalized multiple word d from the Knuth's division algorithm.\n// The quotient is stored in provided quot - len(u)-len(d) words.\n// Updates u to contain the remainder - len(d) words.\nfunc udivremKnuth(quot, u, d []uint64) {\n\tdh := d[len(d)-1]\n\tdl := d[len(d)-2]\n\treciprocal := reciprocal2by1(dh)\n\n\tfor j := len(u) - len(d) - 1; j \u003e= 0; j-- {\n\t\tu2 := u[j+len(d)]\n\t\tu1 := u[j+len(d)-1]\n\t\tu0 := u[j+len(d)-2]\n\n\t\tvar qhat, rhat uint64\n\t\tif u2 \u003e= dh { // Division overflows.\n\t\t\tqhat = ^uint64(0)\n\t\t\t// TODO: Add \"qhat one to big\" adjustment (not needed for correctness, but helps avoiding \"add back\" case).\n\t\t} else {\n\t\t\tqhat, rhat = udivrem2by1(u2, u1, dh, reciprocal)\n\t\t\tph, pl := bits.Mul64(qhat, dl)\n\t\t\tif ph \u003e rhat || (ph == rhat \u0026\u0026 pl \u003e u0) {\n\t\t\t\tqhat--\n\t\t\t\t// TODO: Add \"qhat one to big\" adjustment (not needed for correctness, but helps avoiding \"add back\" case).\n\t\t\t}\n\t\t}\n\n\t\t// Multiply and subtract.\n\t\tborrow := subMulTo(u[j:], d, qhat)\n\t\tu[j+len(d)] = u2 - borrow\n\t\tif u2 \u003c borrow { // Too much subtracted, add back.\n\t\t\tqhat--\n\t\t\tu[j+len(d)] += addTo(u[j:], d)\n\t\t}\n\n\t\tquot[j] = qhat // Store quotient digit.\n\t}\n}\n\n// isBitSet returns true if bit n-th is set, where n = 0 is LSB.\n// The n must be \u003c= 255.\nfunc (z *Uint) isBitSet(n uint) bool {\n\treturn (z.arr[n/64] \u0026 (1 \u003c\u003c (n % 64))) != 0\n}\n\n// addTo computes x += y.\n// Requires len(x) \u003e= len(y).\nfunc addTo(x, y []uint64) uint64 {\n\tvar carry uint64\n\tfor i := 0; i \u003c len(y); i++ {\n\t\tx[i], carry = bits.Add64(x[i], y[i], carry)\n\t}\n\treturn carry\n}\n\n// subMulTo computes x -= y * multiplier.\n// Requires len(x) \u003e= len(y).\nfunc subMulTo(x, y []uint64, multiplier uint64) uint64 {\n\tvar borrow uint64\n\tfor i := 0; i \u003c len(y); i++ {\n\t\ts, carry1 := bits.Sub64(x[i], borrow, 0)\n\t\tph, pl := bits.Mul64(y[i], multiplier)\n\t\tt, carry2 := bits.Sub64(s, pl, 0)\n\t\tx[i] = t\n\t\tborrow = ph + carry1 + carry2\n\t}\n\treturn borrow\n}\n\n// reciprocal2by1 computes \u003c^d, ^0\u003e / d.\nfunc reciprocal2by1(d uint64) uint64 {\n\treciprocal, _ := bits.Div64(^d, ^uint64(0), d)\n\treturn reciprocal\n}\n\n// udivrem2by1 divides \u003cuh, ul\u003e / d and produces both quotient and remainder.\n// It uses the provided d's reciprocal.\n// Implementation ported from https://github.com/chfast/intx and is based on\n// \"Improved division by invariant integers\", Algorithm 4.\nfunc udivrem2by1(uh, ul, d, reciprocal uint64) (quot, rem uint64) {\n\tqh, ql := bits.Mul64(reciprocal, uh)\n\tql, carry := bits.Add64(ql, ul, 0)\n\tqh, _ = bits.Add64(qh, uh, carry)\n\tqh++\n\n\tr := ul - qh*d\n\n\tif r \u003e ql {\n\t\tqh--\n\t\tr += d\n\t}\n\n\tif r \u003e= d {\n\t\tqh++\n\t\tr -= d\n\t}\n\n\treturn qh, r\n}\n"},{"name":"arithmetic_test.gno","body":"package uint256\n\nimport \"testing\"\n\ntype binOp2Test struct {\n\tx, y, want string\n}\n\nfunc TestAdd(t *testing.T) {\n\ttests := []binOp2Test{\n\t\t{\"0\", \"1\", \"1\"},\n\t\t{\"1\", \"0\", \"1\"},\n\t\t{\"1\", \"1\", \"2\"},\n\t\t{\"1\", \"3\", \"4\"},\n\t\t{\"10\", \"10\", \"20\"},\n\t\t{\"18446744073709551615\", \"18446744073709551615\", \"36893488147419103230\"}, // uint64 overflow\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\ty, err := FromDecimal(tc.y)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\twant, err := FromDecimal(tc.want)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := \u0026Uint{}\n\t\tgot.Add(x, y)\n\n\t\tif got.Neq(want) {\n\t\t\tt.Errorf(\"Add(%s, %s) = %v, want %v\", tc.x, tc.y, got.ToString(), want.ToString())\n\t\t}\n\t}\n}\n\nfunc TestSub(t *testing.T) {\n\ttests := []binOp2Test{\n\t\t{\"1\", \"0\", \"1\"},\n\t\t{\"1\", \"1\", \"0\"},\n\t\t{\"10\", \"10\", \"0\"},\n\t\t{\"31337\", \"1337\", \"30000\"},\n\t\t{\"2\", \"3\", \"115792089237316195423570985008687907853269984665640564039457584007913129639935\"}, // underflow\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\ty, err := FromDecimal(tc.y)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\twant, err := FromDecimal(tc.want)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := \u0026Uint{}\n\t\tgot.Sub(x, y)\n\n\t\tif got.Neq(want) {\n\t\t\tt.Errorf(\"Sub(%s, %s) = %v, want %v\", tc.x, tc.y, got.ToString(), want.ToString())\n\t\t}\n\t}\n}\n\nfunc TestMul(t *testing.T) {\n\ttests := []binOp2Test{\n\t\t{\"1\", \"0\", \"0\"},\n\t\t{\"1\", \"1\", \"1\"},\n\t\t{\"10\", \"10\", \"100\"},\n\t\t{\"18446744073709551615\", \"2\", \"36893488147419103230\"}, // uint64 overflow\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\ty, err := FromDecimal(tc.y)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\twant, err := FromDecimal(tc.want)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := \u0026Uint{}\n\t\tgot.Mul(x, y)\n\n\t\tif got.Neq(want) {\n\t\t\tt.Errorf(\"Mul(%s, %s) = %v, want %v\", tc.x, tc.y, got.ToString(), want.ToString())\n\t\t}\n\t}\n}\n\nfunc TestDiv(t *testing.T) {\n\ttests := []binOp2Test{\n\t\t{\"31337\", \"3\", \"10445\"},\n\t\t{\"31337\", \"0\", \"0\"},\n\t\t{\"0\", \"31337\", \"0\"},\n\t\t{\"1\", \"1\", \"1\"},\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\ty, err := FromDecimal(tc.y)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\twant, err := FromDecimal(tc.want)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := \u0026Uint{}\n\t\tgot.Div(x, y)\n\n\t\tif got.Neq(want) {\n\t\t\tt.Errorf(\"Div(%s, %s) = %v, want %v\", tc.x, tc.y, got.ToString(), want.ToString())\n\t\t}\n\t}\n}\n\nfunc TestMod(t *testing.T) {\n\ttests := []binOp2Test{\n\t\t{\"31337\", \"3\", \"2\"},\n\t\t{\"31337\", \"0\", \"0\"},\n\t\t{\"0\", \"31337\", \"0\"},\n\t\t{\"2\", \"31337\", \"2\"},\n\t\t{\"1\", \"1\", \"0\"},\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\ty, err := FromDecimal(tc.y)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\twant, err := FromDecimal(tc.want)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := \u0026Uint{}\n\t\tgot.Mod(x, y)\n\n\t\tif got.Neq(want) {\n\t\t\tt.Errorf(\"Mod(%s, %s) = %v, want %v\", tc.x, tc.y, got.ToString(), want.ToString())\n\t\t}\n\t}\n}\n\nfunc TestDivMod(t *testing.T) {\n\ttests := []struct {\n\t\tx string\n\t\ty string\n\t\twantDiv string\n\t\twantMod string\n\t}{\n\t\t{\"1\", \"1\", \"1\", \"0\"},\n\t\t{\"10\", \"10\", \"1\", \"0\"},\n\t\t{\"100\", \"10\", \"10\", \"0\"},\n\t\t{\"31337\", \"3\", \"10445\", \"2\"},\n\t\t{\"31337\", \"0\", \"0\", \"0\"},\n\t\t{\"0\", \"31337\", \"0\", \"0\"},\n\t\t{\"2\", \"31337\", \"0\", \"2\"},\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\ty, err := FromDecimal(tc.y)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\twantDiv, err := FromDecimal(tc.wantDiv)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\twantMod, err := FromDecimal(tc.wantMod)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgotDiv := new(Uint)\n\t\tgotMod := new(Uint)\n\t\tgotDiv.DivMod(x, y, gotMod)\n\n\t\tfor i := range gotDiv.arr {\n\t\t\tif gotDiv.arr[i] != wantDiv.arr[i] {\n\t\t\t\tt.Errorf(\"DivMod(%s, %s) got Div %v, want Div %v\", tc.x, tc.y, gotDiv, wantDiv)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tfor i := range gotMod.arr {\n\t\t\tif gotMod.arr[i] != wantMod.arr[i] {\n\t\t\t\tt.Errorf(\"DivMod(%s, %s) got Mod %v, want Mod %v\", tc.x, tc.y, gotMod, wantMod)\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc TestNeg(t *testing.T) {\n\ttests := []struct {\n\t\tx string\n\t\twant string\n\t}{\n\t\t{\"31337\", \"115792089237316195423570985008687907853269984665640564039457584007913129608599\"},\n\t\t{\"115792089237316195423570985008687907853269984665640564039457584007913129608599\", \"31337\"},\n\t\t{\"0\", \"0\"},\n\t\t{\"2\", \"115792089237316195423570985008687907853269984665640564039457584007913129639934\"},\n\t\t{\"1\", \"115792089237316195423570985008687907853269984665640564039457584007913129639935\"},\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\twant, err := FromDecimal(tc.want)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := \u0026Uint{}\n\t\tgot.Neg(x)\n\n\t\tif got.Neq(want) {\n\t\t\tt.Errorf(\"Neg(%s) = %v, want %v\", tc.x, got.ToString(), want.ToString())\n\t\t}\n\t}\n}\n\nfunc TestExp(t *testing.T) {\n\ttests := []binOp2Test{\n\t\t{\"31337\", \"3\", \"30773171189753\"},\n\t\t{\"31337\", \"0\", \"1\"},\n\t\t{\"0\", \"31337\", \"0\"},\n\t\t{\"1\", \"1\", \"1\"},\n\t\t{\"2\", \"3\", \"8\"},\n\t\t{\"2\", \"64\", \"18446744073709551616\"},\n\t\t{\"2\", \"128\", \"340282366920938463463374607431768211456\"},\n\t\t{\"2\", \"255\", \"57896044618658097711785492504343953926634992332820282019728792003956564819968\"},\n\t\t{\"2\", \"256\", \"0\"}, // overflow\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\ty, err := FromDecimal(tc.y)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\twant, err := FromDecimal(tc.want)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := \u0026Uint{}\n\t\tgot.Exp(x, y)\n\n\t\tif got.Neq(want) {\n\t\t\tt.Errorf(\"Exp(%s, %s) = %v, want %v\", tc.x, tc.y, got.ToString(), want.ToString())\n\t\t}\n\t}\n}\n"},{"name":"bits_table.gno","body":"// Copyright 2017 The Go Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n// Code generated by go run make_tables.go. DO NOT EDIT.\n\npackage uint256\n\nconst ntz8tab = \"\" +\n\t\"\\x08\\x00\\x01\\x00\\x02\\x00\\x01\\x00\\x03\\x00\\x01\\x00\\x02\\x00\\x01\\x00\" +\n\t\"\\x04\\x00\\x01\\x00\\x02\\x00\\x01\\x00\\x03\\x00\\x01\\x00\\x02\\x00\\x01\\x00\" +\n\t\"\\x05\\x00\\x01\\x00\\x02\\x00\\x01\\x00\\x03\\x00\\x01\\x00\\x02\\x00\\x01\\x00\" +\n\t\"\\x04\\x00\\x01\\x00\\x02\\x00\\x01\\x00\\x03\\x00\\x01\\x00\\x02\\x00\\x01\\x00\" +\n\t\"\\x06\\x00\\x01\\x00\\x02\\x00\\x01\\x00\\x03\\x00\\x01\\x00\\x02\\x00\\x01\\x00\" +\n\t\"\\x04\\x00\\x01\\x00\\x02\\x00\\x01\\x00\\x03\\x00\\x01\\x00\\x02\\x00\\x01\\x00\" +\n\t\"\\x05\\x00\\x01\\x00\\x02\\x00\\x01\\x00\\x03\\x00\\x01\\x00\\x02\\x00\\x01\\x00\" +\n\t\"\\x04\\x00\\x01\\x00\\x02\\x00\\x01\\x00\\x03\\x00\\x01\\x00\\x02\\x00\\x01\\x00\" +\n\t\"\\x07\\x00\\x01\\x00\\x02\\x00\\x01\\x00\\x03\\x00\\x01\\x00\\x02\\x00\\x01\\x00\" +\n\t\"\\x04\\x00\\x01\\x00\\x02\\x00\\x01\\x00\\x03\\x00\\x01\\x00\\x02\\x00\\x01\\x00\" +\n\t\"\\x05\\x00\\x01\\x00\\x02\\x00\\x01\\x00\\x03\\x00\\x01\\x00\\x02\\x00\\x01\\x00\" +\n\t\"\\x04\\x00\\x01\\x00\\x02\\x00\\x01\\x00\\x03\\x00\\x01\\x00\\x02\\x00\\x01\\x00\" +\n\t\"\\x06\\x00\\x01\\x00\\x02\\x00\\x01\\x00\\x03\\x00\\x01\\x00\\x02\\x00\\x01\\x00\" +\n\t\"\\x04\\x00\\x01\\x00\\x02\\x00\\x01\\x00\\x03\\x00\\x01\\x00\\x02\\x00\\x01\\x00\" +\n\t\"\\x05\\x00\\x01\\x00\\x02\\x00\\x01\\x00\\x03\\x00\\x01\\x00\\x02\\x00\\x01\\x00\" +\n\t\"\\x04\\x00\\x01\\x00\\x02\\x00\\x01\\x00\\x03\\x00\\x01\\x00\\x02\\x00\\x01\\x00\"\n\nconst pop8tab = \"\" +\n\t\"\\x00\\x01\\x01\\x02\\x01\\x02\\x02\\x03\\x01\\x02\\x02\\x03\\x02\\x03\\x03\\x04\" +\n\t\"\\x01\\x02\\x02\\x03\\x02\\x03\\x03\\x04\\x02\\x03\\x03\\x04\\x03\\x04\\x04\\x05\" +\n\t\"\\x01\\x02\\x02\\x03\\x02\\x03\\x03\\x04\\x02\\x03\\x03\\x04\\x03\\x04\\x04\\x05\" +\n\t\"\\x02\\x03\\x03\\x04\\x03\\x04\\x04\\x05\\x03\\x04\\x04\\x05\\x04\\x05\\x05\\x06\" +\n\t\"\\x01\\x02\\x02\\x03\\x02\\x03\\x03\\x04\\x02\\x03\\x03\\x04\\x03\\x04\\x04\\x05\" +\n\t\"\\x02\\x03\\x03\\x04\\x03\\x04\\x04\\x05\\x03\\x04\\x04\\x05\\x04\\x05\\x05\\x06\" +\n\t\"\\x02\\x03\\x03\\x04\\x03\\x04\\x04\\x05\\x03\\x04\\x04\\x05\\x04\\x05\\x05\\x06\" +\n\t\"\\x03\\x04\\x04\\x05\\x04\\x05\\x05\\x06\\x04\\x05\\x05\\x06\\x05\\x06\\x06\\x07\" +\n\t\"\\x01\\x02\\x02\\x03\\x02\\x03\\x03\\x04\\x02\\x03\\x03\\x04\\x03\\x04\\x04\\x05\" +\n\t\"\\x02\\x03\\x03\\x04\\x03\\x04\\x04\\x05\\x03\\x04\\x04\\x05\\x04\\x05\\x05\\x06\" +\n\t\"\\x02\\x03\\x03\\x04\\x03\\x04\\x04\\x05\\x03\\x04\\x04\\x05\\x04\\x05\\x05\\x06\" +\n\t\"\\x03\\x04\\x04\\x05\\x04\\x05\\x05\\x06\\x04\\x05\\x05\\x06\\x05\\x06\\x06\\x07\" +\n\t\"\\x02\\x03\\x03\\x04\\x03\\x04\\x04\\x05\\x03\\x04\\x04\\x05\\x04\\x05\\x05\\x06\" +\n\t\"\\x03\\x04\\x04\\x05\\x04\\x05\\x05\\x06\\x04\\x05\\x05\\x06\\x05\\x06\\x06\\x07\" +\n\t\"\\x03\\x04\\x04\\x05\\x04\\x05\\x05\\x06\\x04\\x05\\x05\\x06\\x05\\x06\\x06\\x07\" +\n\t\"\\x04\\x05\\x05\\x06\\x05\\x06\\x06\\x07\\x05\\x06\\x06\\x07\\x06\\x07\\x07\\x08\"\n\nconst rev8tab = \"\" +\n\t\"\\x00\\x80\\x40\\xc0\\x20\\xa0\\x60\\xe0\\x10\\x90\\x50\\xd0\\x30\\xb0\\x70\\xf0\" +\n\t\"\\x08\\x88\\x48\\xc8\\x28\\xa8\\x68\\xe8\\x18\\x98\\x58\\xd8\\x38\\xb8\\x78\\xf8\" +\n\t\"\\x04\\x84\\x44\\xc4\\x24\\xa4\\x64\\xe4\\x14\\x94\\x54\\xd4\\x34\\xb4\\x74\\xf4\" +\n\t\"\\x0c\\x8c\\x4c\\xcc\\x2c\\xac\\x6c\\xec\\x1c\\x9c\\x5c\\xdc\\x3c\\xbc\\x7c\\xfc\" +\n\t\"\\x02\\x82\\x42\\xc2\\x22\\xa2\\x62\\xe2\\x12\\x92\\x52\\xd2\\x32\\xb2\\x72\\xf2\" +\n\t\"\\x0a\\x8a\\x4a\\xca\\x2a\\xaa\\x6a\\xea\\x1a\\x9a\\x5a\\xda\\x3a\\xba\\x7a\\xfa\" +\n\t\"\\x06\\x86\\x46\\xc6\\x26\\xa6\\x66\\xe6\\x16\\x96\\x56\\xd6\\x36\\xb6\\x76\\xf6\" +\n\t\"\\x0e\\x8e\\x4e\\xce\\x2e\\xae\\x6e\\xee\\x1e\\x9e\\x5e\\xde\\x3e\\xbe\\x7e\\xfe\" +\n\t\"\\x01\\x81\\x41\\xc1\\x21\\xa1\\x61\\xe1\\x11\\x91\\x51\\xd1\\x31\\xb1\\x71\\xf1\" +\n\t\"\\x09\\x89\\x49\\xc9\\x29\\xa9\\x69\\xe9\\x19\\x99\\x59\\xd9\\x39\\xb9\\x79\\xf9\" +\n\t\"\\x05\\x85\\x45\\xc5\\x25\\xa5\\x65\\xe5\\x15\\x95\\x55\\xd5\\x35\\xb5\\x75\\xf5\" +\n\t\"\\x0d\\x8d\\x4d\\xcd\\x2d\\xad\\x6d\\xed\\x1d\\x9d\\x5d\\xdd\\x3d\\xbd\\x7d\\xfd\" +\n\t\"\\x03\\x83\\x43\\xc3\\x23\\xa3\\x63\\xe3\\x13\\x93\\x53\\xd3\\x33\\xb3\\x73\\xf3\" +\n\t\"\\x0b\\x8b\\x4b\\xcb\\x2b\\xab\\x6b\\xeb\\x1b\\x9b\\x5b\\xdb\\x3b\\xbb\\x7b\\xfb\" +\n\t\"\\x07\\x87\\x47\\xc7\\x27\\xa7\\x67\\xe7\\x17\\x97\\x57\\xd7\\x37\\xb7\\x77\\xf7\" +\n\t\"\\x0f\\x8f\\x4f\\xcf\\x2f\\xaf\\x6f\\xef\\x1f\\x9f\\x5f\\xdf\\x3f\\xbf\\x7f\\xff\"\n\nconst len8tab = \"\" +\n\t\"\\x00\\x01\\x02\\x02\\x03\\x03\\x03\\x03\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04\" +\n\t\"\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\\x05\" +\n\t\"\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\" +\n\t\"\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\\x06\" +\n\t\"\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\" +\n\t\"\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\" +\n\t\"\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\" +\n\t\"\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\\x07\" +\n\t\"\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\" +\n\t\"\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\" +\n\t\"\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\" +\n\t\"\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\" +\n\t\"\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\" +\n\t\"\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\" +\n\t\"\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\" +\n\t\"\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08\"\n"},{"name":"bitwise.gno","body":"// bitwise contains bitwise operations for Uint instances.\n// This file includes functions to perform bitwise AND, OR, XOR, and NOT operations, as well as bit shifting.\n// These operations are crucial for manipulating individual bits within a 256-bit unsigned integer.\npackage uint256\n\n// Or sets z = x | y and returns z.\nfunc (z *Uint) Or(x, y *Uint) *Uint {\n\tz.arr[0] = x.arr[0] | y.arr[0]\n\tz.arr[1] = x.arr[1] | y.arr[1]\n\tz.arr[2] = x.arr[2] | y.arr[2]\n\tz.arr[3] = x.arr[3] | y.arr[3]\n\treturn z\n}\n\n// And sets z = x \u0026 y and returns z.\nfunc (z *Uint) And(x, y *Uint) *Uint {\n\tz.arr[0] = x.arr[0] \u0026 y.arr[0]\n\tz.arr[1] = x.arr[1] \u0026 y.arr[1]\n\tz.arr[2] = x.arr[2] \u0026 y.arr[2]\n\tz.arr[3] = x.arr[3] \u0026 y.arr[3]\n\treturn z\n}\n\n// Not sets z = ^x and returns z.\nfunc (z *Uint) Not(x *Uint) *Uint {\n\tz.arr[3], z.arr[2], z.arr[1], z.arr[0] = ^x.arr[3], ^x.arr[2], ^x.arr[1], ^x.arr[0]\n\treturn z\n}\n\n// AndNot sets z = x \u0026^ y and returns z.\nfunc (z *Uint) AndNot(x, y *Uint) *Uint {\n\tz.arr[0] = x.arr[0] \u0026^ y.arr[0]\n\tz.arr[1] = x.arr[1] \u0026^ y.arr[1]\n\tz.arr[2] = x.arr[2] \u0026^ y.arr[2]\n\tz.arr[3] = x.arr[3] \u0026^ y.arr[3]\n\treturn z\n}\n\n// Xor sets z = x ^ y and returns z.\nfunc (z *Uint) Xor(x, y *Uint) *Uint {\n\tz.arr[0] = x.arr[0] ^ y.arr[0]\n\tz.arr[1] = x.arr[1] ^ y.arr[1]\n\tz.arr[2] = x.arr[2] ^ y.arr[2]\n\tz.arr[3] = x.arr[3] ^ y.arr[3]\n\treturn z\n}\n\n// Lsh sets z = x \u003c\u003c n and returns z.\nfunc (z *Uint) Lsh(x *Uint, n uint) *Uint {\n\t// n % 64 == 0\n\tif n\u00260x3f == 0 {\n\t\tswitch n {\n\t\tcase 0:\n\t\t\treturn z.Set(x)\n\t\tcase 64:\n\t\t\treturn z.lsh64(x)\n\t\tcase 128:\n\t\t\treturn z.lsh128(x)\n\t\tcase 192:\n\t\t\treturn z.lsh192(x)\n\t\tdefault:\n\t\t\treturn z.Clear()\n\t\t}\n\t}\n\tvar a, b uint64\n\t// Big swaps first\n\tswitch {\n\tcase n \u003e 192:\n\t\tif n \u003e 256 {\n\t\t\treturn z.Clear()\n\t\t}\n\t\tz.lsh192(x)\n\t\tn -= 192\n\t\tgoto sh192\n\tcase n \u003e 128:\n\t\tz.lsh128(x)\n\t\tn -= 128\n\t\tgoto sh128\n\tcase n \u003e 64:\n\t\tz.lsh64(x)\n\t\tn -= 64\n\t\tgoto sh64\n\tdefault:\n\t\tz.Set(x)\n\t}\n\n\t// remaining shifts\n\ta = z.arr[0] \u003e\u003e (64 - n)\n\tz.arr[0] = z.arr[0] \u003c\u003c n\n\nsh64:\n\tb = z.arr[1] \u003e\u003e (64 - n)\n\tz.arr[1] = (z.arr[1] \u003c\u003c n) | a\n\nsh128:\n\ta = z.arr[2] \u003e\u003e (64 - n)\n\tz.arr[2] = (z.arr[2] \u003c\u003c n) | b\n\nsh192:\n\tz.arr[3] = (z.arr[3] \u003c\u003c n) | a\n\n\treturn z\n}\n\n// Rsh sets z = x \u003e\u003e n and returns z.\nfunc (z *Uint) Rsh(x *Uint, n uint) *Uint {\n\t// n % 64 == 0\n\tif n\u00260x3f == 0 {\n\t\tswitch n {\n\t\tcase 0:\n\t\t\treturn z.Set(x)\n\t\tcase 64:\n\t\t\treturn z.rsh64(x)\n\t\tcase 128:\n\t\t\treturn z.rsh128(x)\n\t\tcase 192:\n\t\t\treturn z.rsh192(x)\n\t\tdefault:\n\t\t\treturn z.Clear()\n\t\t}\n\t}\n\tvar a, b uint64\n\t// Big swaps first\n\tswitch {\n\tcase n \u003e 192:\n\t\tif n \u003e 256 {\n\t\t\treturn z.Clear()\n\t\t}\n\t\tz.rsh192(x)\n\t\tn -= 192\n\t\tgoto sh192\n\tcase n \u003e 128:\n\t\tz.rsh128(x)\n\t\tn -= 128\n\t\tgoto sh128\n\tcase n \u003e 64:\n\t\tz.rsh64(x)\n\t\tn -= 64\n\t\tgoto sh64\n\tdefault:\n\t\tz.Set(x)\n\t}\n\n\t// remaining shifts\n\ta = z.arr[3] \u003c\u003c (64 - n)\n\tz.arr[3] = z.arr[3] \u003e\u003e n\n\nsh64:\n\tb = z.arr[2] \u003c\u003c (64 - n)\n\tz.arr[2] = (z.arr[2] \u003e\u003e n) | a\n\nsh128:\n\ta = z.arr[1] \u003c\u003c (64 - n)\n\tz.arr[1] = (z.arr[1] \u003e\u003e n) | b\n\nsh192:\n\tz.arr[0] = (z.arr[0] \u003e\u003e n) | a\n\n\treturn z\n}\n\n// SRsh (Signed/Arithmetic right shift)\n// considers z to be a signed integer, during right-shift\n// and sets z = x \u003e\u003e n and returns z.\nfunc (z *Uint) SRsh(x *Uint, n uint) *Uint {\n\t// If the MSB is 0, SRsh is same as Rsh.\n\tif !x.isBitSet(255) {\n\t\treturn z.Rsh(x, n)\n\t}\n\tif n%64 == 0 {\n\t\tswitch n {\n\t\tcase 0:\n\t\t\treturn z.Set(x)\n\t\tcase 64:\n\t\t\treturn z.srsh64(x)\n\t\tcase 128:\n\t\t\treturn z.srsh128(x)\n\t\tcase 192:\n\t\t\treturn z.srsh192(x)\n\t\tdefault:\n\t\t\treturn z.SetAllOne()\n\t\t}\n\t}\n\tvar a uint64 = MaxUint64 \u003c\u003c (64 - n%64)\n\t// Big swaps first\n\tswitch {\n\tcase n \u003e 192:\n\t\tif n \u003e 256 {\n\t\t\treturn z.SetAllOne()\n\t\t}\n\t\tz.srsh192(x)\n\t\tn -= 192\n\t\tgoto sh192\n\tcase n \u003e 128:\n\t\tz.srsh128(x)\n\t\tn -= 128\n\t\tgoto sh128\n\tcase n \u003e 64:\n\t\tz.srsh64(x)\n\t\tn -= 64\n\t\tgoto sh64\n\tdefault:\n\t\tz.Set(x)\n\t}\n\n\t// remaining shifts\n\tz.arr[3], a = (z.arr[3]\u003e\u003en)|a, z.arr[3]\u003c\u003c(64-n)\n\nsh64:\n\tz.arr[2], a = (z.arr[2]\u003e\u003en)|a, z.arr[2]\u003c\u003c(64-n)\n\nsh128:\n\tz.arr[1], a = (z.arr[1]\u003e\u003en)|a, z.arr[1]\u003c\u003c(64-n)\n\nsh192:\n\tz.arr[0] = (z.arr[0] \u003e\u003e n) | a\n\n\treturn z\n}\n\nfunc (z *Uint) lsh64(x *Uint) *Uint {\n\tz.arr[3], z.arr[2], z.arr[1], z.arr[0] = x.arr[2], x.arr[1], x.arr[0], 0\n\treturn z\n}\n\nfunc (z *Uint) lsh128(x *Uint) *Uint {\n\tz.arr[3], z.arr[2], z.arr[1], z.arr[0] = x.arr[1], x.arr[0], 0, 0\n\treturn z\n}\n\nfunc (z *Uint) lsh192(x *Uint) *Uint {\n\tz.arr[3], z.arr[2], z.arr[1], z.arr[0] = x.arr[0], 0, 0, 0\n\treturn z\n}\n\nfunc (z *Uint) rsh64(x *Uint) *Uint {\n\tz.arr[3], z.arr[2], z.arr[1], z.arr[0] = 0, x.arr[3], x.arr[2], x.arr[1]\n\treturn z\n}\n\nfunc (z *Uint) rsh128(x *Uint) *Uint {\n\tz.arr[3], z.arr[2], z.arr[1], z.arr[0] = 0, 0, x.arr[3], x.arr[2]\n\treturn z\n}\n\nfunc (z *Uint) rsh192(x *Uint) *Uint {\n\tz.arr[3], z.arr[2], z.arr[1], z.arr[0] = 0, 0, 0, x.arr[3]\n\treturn z\n}\n\nfunc (z *Uint) srsh64(x *Uint) *Uint {\n\tz.arr[3], z.arr[2], z.arr[1], z.arr[0] = MaxUint64, x.arr[3], x.arr[2], x.arr[1]\n\treturn z\n}\n\nfunc (z *Uint) srsh128(x *Uint) *Uint {\n\tz.arr[3], z.arr[2], z.arr[1], z.arr[0] = MaxUint64, MaxUint64, x.arr[3], x.arr[2]\n\treturn z\n}\n\nfunc (z *Uint) srsh192(x *Uint) *Uint {\n\tz.arr[3], z.arr[2], z.arr[1], z.arr[0] = MaxUint64, MaxUint64, MaxUint64, x.arr[3]\n\treturn z\n}\n"},{"name":"bitwise_test.gno","body":"package uint256\n\nimport \"testing\"\n\ntype logicOpTest struct {\n\tname string\n\tx Uint\n\ty Uint\n\twant Uint\n}\n\nfunc TestOr(t *testing.T) {\n\ttests := []logicOpTest{\n\t\t{\n\t\t\tname: \"all zeros\",\n\t\t\tx: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t\ty: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t\twant: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t},\n\t\t{\n\t\t\tname: \"all ones\",\n\t\t\tx: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t\ty: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t\twant: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t},\n\t\t{\n\t\t\tname: \"mixed\",\n\t\t\tx: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), 0, 0}},\n\t\t\ty: Uint{arr: [4]uint64{0, 0, ^uint64(0), ^uint64(0)}},\n\t\t\twant: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t},\n\t\t{\n\t\t\tname: \"one operand all ones\",\n\t\t\tx: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t\ty: Uint{arr: [4]uint64{0x5555555555555555, 0xAAAAAAAAAAAAAAAA, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000}},\n\t\t\twant: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tres := new(Uint).Or(\u0026tc.x, \u0026tc.y)\n\t\t\tif *res != tc.want {\n\t\t\t\tt.Errorf(\"Or(%s, %s) = %s, want %s\", tc.x.ToString(), tc.y.ToString(), res.ToString(), (tc.want).ToString())\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestAnd(t *testing.T) {\n\ttests := []logicOpTest{\n\t\t{\n\t\t\tname: \"all zeros\",\n\t\t\tx: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t\ty: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t\twant: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t},\n\t\t{\n\t\t\tname: \"all ones\",\n\t\t\tx: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t\ty: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t\twant: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t},\n\t\t{\n\t\t\tname: \"mixed\",\n\t\t\tx: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t\ty: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t\twant: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t},\n\t\t{\n\t\t\tname: \"mixed 2\",\n\t\t\tx: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t\ty: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t\twant: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t},\n\t\t{\n\t\t\tname: \"mixed 3\",\n\t\t\tx: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), 0, 0}},\n\t\t\ty: Uint{arr: [4]uint64{0, 0, ^uint64(0), ^uint64(0)}},\n\t\t\twant: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t},\n\t\t{\n\t\t\tname: \"one operand zero\",\n\t\t\tx: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t\ty: Uint{arr: [4]uint64{0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF}},\n\t\t\twant: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t},\n\t\t{\n\t\t\tname: \"one operand all ones\",\n\t\t\tx: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t\ty: Uint{arr: [4]uint64{0x5555555555555555, 0xAAAAAAAAAAAAAAAA, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000}},\n\t\t\twant: Uint{arr: [4]uint64{0x5555555555555555, 0xAAAAAAAAAAAAAAAA, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000}},\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tres := new(Uint).And(\u0026tc.x, \u0026tc.y)\n\t\t\tif *res != tc.want {\n\t\t\t\tt.Errorf(\"And(%s, %s) = %s, want %s\", tc.x.ToString(), tc.y.ToString(), res.ToString(), (tc.want).ToString())\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestNot(t *testing.T) {\n\ttests := []struct {\n\t\tname string\n\t\tx Uint\n\t\twant Uint\n\t}{\n\t\t{\n\t\t\tname: \"all zeros\",\n\t\t\tx: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t\twant: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t},\n\t\t{\n\t\t\tname: \"all ones\",\n\t\t\tx: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t\twant: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t},\n\t\t{\n\t\t\tname: \"mixed\",\n\t\t\tx: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), 0, 0}},\n\t\t\twant: Uint{arr: [4]uint64{0, 0, ^uint64(0), ^uint64(0)}},\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tres := new(Uint).Not(\u0026tc.x)\n\t\t\tif *res != tc.want {\n\t\t\t\tt.Errorf(\"Not(%s) = %s, want %s\", tc.x.ToString(), res.ToString(), (tc.want).ToString())\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestAndNot(t *testing.T) {\n\ttests := []logicOpTest{\n\t\t{\n\t\t\tname: \"all zeros\",\n\t\t\tx: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t\ty: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t\twant: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t},\n\t\t{\n\t\t\tname: \"all ones\",\n\t\t\tx: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t\ty: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t\twant: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t},\n\t\t{\n\t\t\tname: \"mixed\",\n\t\t\tx: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t\ty: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t\twant: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t},\n\t\t{\n\t\t\tname: \"mixed 2\",\n\t\t\tx: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t\ty: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t\twant: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t},\n\t\t{\n\t\t\tname: \"mixed 3\",\n\t\t\tx: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), 0, 0}},\n\t\t\ty: Uint{arr: [4]uint64{0, 0, ^uint64(0), ^uint64(0)}},\n\t\t\twant: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), 0, 0}},\n\t\t},\n\t\t{\n\t\t\tname: \"one operand zero\",\n\t\t\tx: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t\ty: Uint{arr: [4]uint64{0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF}},\n\t\t\twant: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t},\n\t\t{\n\t\t\tname: \"one operand all ones\",\n\t\t\tx: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t\ty: Uint{arr: [4]uint64{0x5555555555555555, 0xAAAAAAAAAAAAAAAA, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000}},\n\t\t\twant: Uint{arr: [4]uint64{0xAAAAAAAAAAAAAAAA, 0x5555555555555555, 0x0000000000000000, ^uint64(0)}},\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tres := new(Uint).AndNot(\u0026tc.x, \u0026tc.y)\n\t\t\tif *res != tc.want {\n\t\t\t\tt.Errorf(\"AndNot(%s, %s) = %s, want %s\", tc.x.ToString(), tc.y.ToString(), res.ToString(), (tc.want).ToString())\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestXor(t *testing.T) {\n\ttests := []logicOpTest{\n\t\t{\n\t\t\tname: \"all zeros\",\n\t\t\tx: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t\ty: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t\twant: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t},\n\t\t{\n\t\t\tname: \"all ones\",\n\t\t\tx: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t\ty: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t\twant: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t},\n\t\t{\n\t\t\tname: \"mixed\",\n\t\t\tx: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t\ty: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t\twant: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t},\n\t\t{\n\t\t\tname: \"mixed 2\",\n\t\t\tx: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t\ty: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t\twant: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t},\n\t\t{\n\t\t\tname: \"mixed 3\",\n\t\t\tx: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), 0, 0}},\n\t\t\ty: Uint{arr: [4]uint64{0, 0, ^uint64(0), ^uint64(0)}},\n\t\t\twant: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t},\n\t\t{\n\t\t\tname: \"one operand zero\",\n\t\t\tx: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t\ty: Uint{arr: [4]uint64{0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF}},\n\t\t\twant: Uint{arr: [4]uint64{0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF}},\n\t\t},\n\t\t{\n\t\t\tname: \"one operand all ones\",\n\t\t\tx: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t\ty: Uint{arr: [4]uint64{0x5555555555555555, 0xAAAAAAAAAAAAAAAA, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000}},\n\t\t\twant: Uint{arr: [4]uint64{0xAAAAAAAAAAAAAAAA, 0x5555555555555555, 0x0000000000000000, ^uint64(0)}},\n\t\t},\n\t}\n\n\tfor _, tc := range tests {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tres := new(Uint).Xor(\u0026tc.x, \u0026tc.y)\n\t\t\tif *res != tc.want {\n\t\t\t\tt.Errorf(\"Xor(%s, %s) = %s, want %s\", tc.x.ToString(), tc.y.ToString(), res.ToString(), (tc.want).ToString())\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc TestLsh(t *testing.T) {\n\ttests := []struct {\n\t\tx string\n\t\ty uint\n\t\twant string\n\t}{\n\t\t{\"0\", 0, \"0\"},\n\t\t{\"0\", 1, \"0\"},\n\t\t{\"0\", 64, \"0\"},\n\t\t{\"1\", 0, \"1\"},\n\t\t{\"1\", 1, \"2\"},\n\t\t{\"1\", 64, \"18446744073709551616\"},\n\t\t{\"1\", 128, \"340282366920938463463374607431768211456\"},\n\t\t{\"1\", 192, \"6277101735386680763835789423207666416102355444464034512896\"},\n\t\t{\"1\", 255, \"57896044618658097711785492504343953926634992332820282019728792003956564819968\"},\n\t\t{\"1\", 256, \"0\"},\n\t\t{\"31337\", 0, \"31337\"},\n\t\t{\"31337\", 1, \"62674\"},\n\t\t{\"31337\", 64, \"578065619037836218990592\"},\n\t\t{\"31337\", 128, \"10663428532201448629551770073089320442396672\"},\n\t\t{\"31337\", 192, \"196705537081812415096322133155058642481399512563169449530621952\"},\n\t\t{\"31337\", 193, \"393411074163624830192644266310117284962799025126338899061243904\"},\n\t\t{\"31337\", 255, \"57896044618658097711785492504343953926634992332820282019728792003956564819968\"},\n\t\t{\"31337\", 256, \"0\"},\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\twant, err := FromDecimal(tc.want)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := \u0026Uint{}\n\t\tgot.Lsh(x, tc.y)\n\n\t\tif got.Neq(want) {\n\t\t\tt.Errorf(\"Lsh(%s, %d) = %s, want %s\", tc.x, tc.y, got.ToString(), want.ToString())\n\t\t}\n\t}\n}\n\nfunc TestRsh(t *testing.T) {\n\ttests := []struct {\n\t\tx string\n\t\ty uint\n\t\twant string\n\t}{\n\t\t{\"0\", 0, \"0\"},\n\t\t{\"0\", 1, \"0\"},\n\t\t{\"0\", 64, \"0\"},\n\t\t{\"1\", 0, \"1\"},\n\t\t{\"1\", 1, \"0\"},\n\t\t{\"1\", 64, \"0\"},\n\t\t{\"1\", 128, \"0\"},\n\t\t{\"1\", 192, \"0\"},\n\t\t{\"1\", 255, \"0\"},\n\t\t{\"57896044618658097711785492504343953926634992332820282019728792003956564819968\", 255, \"1\"},\n\t\t{\"6277101735386680763835789423207666416102355444464034512896\", 192, \"1\"},\n\t\t{\"340282366920938463463374607431768211456\", 128, \"1\"},\n\t\t{\"18446744073709551616\", 64, \"1\"},\n\t\t{\"393411074163624830192644266310117284962799025126338899061243904\", 193, \"31337\"},\n\t\t{\"196705537081812415096322133155058642481399512563169449530621952\", 192, \"31337\"},\n\t\t{\"10663428532201448629551770073089320442396672\", 128, \"31337\"},\n\t\t{\"578065619037836218990592\", 64, \"31337\"},\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\twant, err := FromDecimal(tc.want)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := \u0026Uint{}\n\t\tgot.Rsh(x, tc.y)\n\n\t\tif got.Neq(want) {\n\t\t\tt.Errorf(\"Rsh(%s, %d) = %s, want %s\", tc.x, tc.y, got.ToString(), want.ToString())\n\t\t}\n\t}\n}\n"},{"name":"cmp.gno","body":"// cmp (or, comparisons) includes methods for comparing Uint instances.\n// These comparison functions cover a range of operations including equality checks, less than/greater than\n// evaluations, and specialized comparisons such as signed greater than. These are fundamental for logical\n// decision making based on Uint values.\npackage uint256\n\nimport (\n\t\"math/bits\"\n)\n\n// Cmp compares z and x and returns:\n//\n//\t-1 if z \u003c x\n//\t 0 if z == x\n//\t+1 if z \u003e x\nfunc (z *Uint) Cmp(x *Uint) (r int) {\n\t// z \u003c x \u003c=\u003e z - x \u003c 0 i.e. when subtraction overflows.\n\td0, carry := bits.Sub64(z.arr[0], x.arr[0], 0)\n\td1, carry := bits.Sub64(z.arr[1], x.arr[1], carry)\n\td2, carry := bits.Sub64(z.arr[2], x.arr[2], carry)\n\td3, carry := bits.Sub64(z.arr[3], x.arr[3], carry)\n\tif carry == 1 {\n\t\treturn -1\n\t}\n\tif d0|d1|d2|d3 == 0 {\n\t\treturn 0\n\t}\n\treturn 1\n}\n\n// IsZero returns true if z == 0\nfunc (z *Uint) IsZero() bool {\n\treturn (z.arr[0] | z.arr[1] | z.arr[2] | z.arr[3]) == 0\n}\n\n// Sign returns:\n//\n//\t-1 if z \u003c 0\n//\t 0 if z == 0\n//\t+1 if z \u003e 0\n//\n// Where z is interpreted as a two's complement signed number\nfunc (z *Uint) Sign() int {\n\tif z.IsZero() {\n\t\treturn 0\n\t}\n\tif z.arr[3] \u003c 0x8000000000000000 {\n\t\treturn 1\n\t}\n\treturn -1\n}\n\n// LtUint64 returns true if z is smaller than n\nfunc (z *Uint) LtUint64(n uint64) bool {\n\treturn z.arr[0] \u003c n \u0026\u0026 (z.arr[1]|z.arr[2]|z.arr[3]) == 0\n}\n\n// GtUint64 returns true if z is larger than n\nfunc (z *Uint) GtUint64(n uint64) bool {\n\treturn z.arr[0] \u003e n || (z.arr[1]|z.arr[2]|z.arr[3]) != 0\n}\n\n// Lt returns true if z \u003c x\nfunc (z *Uint) Lt(x *Uint) bool {\n\t// z \u003c x \u003c=\u003e z - x \u003c 0 i.e. when subtraction overflows.\n\t_, carry := bits.Sub64(z.arr[0], x.arr[0], 0)\n\t_, carry = bits.Sub64(z.arr[1], x.arr[1], carry)\n\t_, carry = bits.Sub64(z.arr[2], x.arr[2], carry)\n\t_, carry = bits.Sub64(z.arr[3], x.arr[3], carry)\n\n\treturn carry != 0\n}\n\n// Gt returns true if z \u003e x\nfunc (z *Uint) Gt(x *Uint) bool {\n\treturn x.Lt(z)\n}\n\n// Lte returns true if z \u003c= x\nfunc (z *Uint) Lte(x *Uint) bool {\n\tcond1 := z.Lt(x)\n\tcond2 := z.Eq(x)\n\n\tif cond1 || cond2 {\n\t\treturn true\n\t}\n\treturn false\n}\n\n// Gte returns true if z \u003e= x\nfunc (z *Uint) Gte(x *Uint) bool {\n\tcond1 := z.Gt(x)\n\tcond2 := z.Eq(x)\n\n\tif cond1 || cond2 {\n\t\treturn true\n\t}\n\treturn false\n}\n\n// Eq returns true if z == x\nfunc (z *Uint) Eq(x *Uint) bool {\n\treturn (z.arr[0] == x.arr[0]) \u0026\u0026 (z.arr[1] == x.arr[1]) \u0026\u0026 (z.arr[2] == x.arr[2]) \u0026\u0026 (z.arr[3] == x.arr[3])\n}\n\n// Neq returns true if z != x\nfunc (z *Uint) Neq(x *Uint) bool {\n\treturn !z.Eq(x)\n}\n\n// Sgt interprets z and x as signed integers, and returns\n// true if z \u003e x\nfunc (z *Uint) Sgt(x *Uint) bool {\n\tzSign := z.Sign()\n\txSign := x.Sign()\n\n\tswitch {\n\tcase zSign \u003e= 0 \u0026\u0026 xSign \u003c 0:\n\t\treturn true\n\tcase zSign \u003c 0 \u0026\u0026 xSign \u003e= 0:\n\t\treturn false\n\tdefault:\n\t\treturn z.Gt(x)\n\t}\n}\n"},{"name":"cmp_test.gno","body":"package uint256\n\nimport (\n\t\"strings\"\n\t\"testing\"\n)\n\nfunc TestCmp(t *testing.T) {\n\ttests := []struct {\n\t\tx, y string\n\t\twant int\n\t}{\n\t\t{\"0\", \"0\", 0},\n\t\t{\"0\", \"1\", -1},\n\t\t{\"1\", \"0\", 1},\n\t\t{\"1\", \"1\", 0},\n\t\t{\"10\", \"10\", 0},\n\t\t{\"10\", \"11\", -1},\n\t\t{\"11\", \"10\", 1},\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\ty, err := FromDecimal(tc.y)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := x.Cmp(y)\n\t\tif got != tc.want {\n\t\t\tt.Errorf(\"Cmp(%s, %s) = %v, want %v\", tc.x, tc.y, got, tc.want)\n\t\t}\n\t}\n}\n\nfunc TestIsZero(t *testing.T) {\n\ttests := []struct {\n\t\tx string\n\t\twant bool\n\t}{\n\t\t{\"0\", true},\n\t\t{\"1\", false},\n\t\t{\"10\", false},\n\t}\n\n\tfor _, tc := range tests {\n\t\tx, err := FromDecimal(tc.x)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := x.IsZero()\n\t\tif got != tc.want {\n\t\t\tt.Errorf(\"IsZero(%s) = %v, want %v\", tc.x, got, tc.want)\n\t\t}\n\t}\n}\n\nfunc TestLtUint64(t *testing.T) {\n\ttests := []struct {\n\t\tx string\n\t\ty uint64\n\t\twant bool\n\t}{\n\t\t{\"0\", 1, true},\n\t\t{\"1\", 0, false},\n\t\t{\"10\", 10, false},\n\t\t{\"0xffffffffffffffff\", 0, false},\n\t\t{\"0x10000000000000000\", 10000000000000000, false},\n\t}\n\n\tfor _, tc := range tests {\n\t\tvar x *Uint\n\t\tvar err error\n\n\t\tif strings.HasPrefix(tc.x, \"0x\") {\n\t\t\tx, err = FromHex(tc.x)\n\t\t\tif err != nil {\n\t\t\t\tt.Error(err)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t} else {\n\t\t\tx, err = FromDecimal(tc.x)\n\t\t\tif err != nil {\n\t\t\t\tt.Error(err)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\tgot := x.LtUint64(tc.y)\n\n\t\tif got != tc.want {\n\t\t\tt.Errorf(\"LtUint64(%s, %d) = %v, want %v\", tc.x, tc.y, got, tc.want)\n\t\t}\n\t}\n}\n\nfunc TestSGT(t *testing.T) {\n\tx := MustFromHex(\"0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe\")\n\ty := MustFromHex(\"0x0\")\n\tactual := x.Sgt(y)\n\tif actual {\n\t\tt.Fatalf(\"Expected %v false\", actual)\n\t}\n\n\tx = MustFromHex(\"0x0\")\n\ty = MustFromHex(\"0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe\")\n\tactual = x.Sgt(y)\n\tif !actual {\n\t\tt.Fatalf(\"Expected %v true\", actual)\n\t}\n}\n\nfunc TestEq(t *testing.T) {\n\ttests := []struct {\n\t\tx string\n\t\ty string\n\t\twant bool\n\t}{\n\t\t{\"0xffffffffffffffff\", \"18446744073709551615\", true},\n\t\t{\"0x10000000000000000\", \"18446744073709551616\", true},\n\t\t{\"0\", \"0\", true},\n\t\t{\"115792089237316195423570985008687907853269984665640564039457584007913129639935\", \"115792089237316195423570985008687907853269984665640564039457584007913129639935\", true},\n\t}\n\n\tfor i, tc := range tests {\n\t\tvar x *Uint\n\t\tvar err error\n\n\t\tif strings.HasPrefix(tc.x, \"0x\") {\n\t\t\tx, err = FromHex(tc.x)\n\t\t\tif err != nil {\n\t\t\t\tt.Error(err)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t} else {\n\t\t\tx, err = FromDecimal(tc.x)\n\t\t\tif err != nil {\n\t\t\t\tt.Error(err)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\ty, err := FromDecimal(tc.y)\n\t\tif err != nil {\n\t\t\tt.Error(err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgot := x.Eq(y)\n\n\t\tif got != tc.want {\n\t\t\tt.Errorf(\"Eq(%s, %s) = %v, want %v\", tc.x, tc.y, got, tc.want)\n\t\t}\n\t}\n}\n"},{"name":"conversion.gno","body":"// conversions contains methods for converting Uint instances to other types and vice versa.\n// This includes conversions to and from basic types such as uint64 and int32, as well as string representations\n// and byte slices. Additionally, it covers marshaling and unmarshaling for JSON and other text formats.\npackage uint256\n\nimport (\n\t\"encoding/binary\"\n\t\"errors\"\n\t\"strconv\"\n\t\"strings\"\n)\n\n// Uint64 returns the lower 64-bits of z\nfunc (z *Uint) Uint64() uint64 {\n\treturn z.arr[0]\n}\n\n// Uint64WithOverflow returns the lower 64-bits of z and bool whether overflow occurred\nfunc (z *Uint) Uint64WithOverflow() (uint64, bool) {\n\treturn z.arr[0], (z.arr[1] | z.arr[2] | z.arr[3]) != 0\n}\n\n// SetUint64 sets z to the value x\nfunc (z *Uint) SetUint64(x uint64) *Uint {\n\tz.arr[3], z.arr[2], z.arr[1], z.arr[0] = 0, 0, 0, x\n\treturn z\n}\n\n// IsUint64 reports whether z can be represented as a uint64.\nfunc (z *Uint) IsUint64() bool {\n\treturn (z.arr[1] | z.arr[2] | z.arr[3]) == 0\n}\n\n// Dec returns the decimal representation of z.\nfunc (z *Uint) Dec() string {\n\tif z.IsZero() {\n\t\treturn \"0\"\n\t}\n\tif z.IsUint64() {\n\t\treturn strconv.FormatUint(z.Uint64(), 10)\n\t}\n\n\t// The max uint64 value being 18446744073709551615, the largest\n\t// power-of-ten below that is 10000000000000000000.\n\t// When we do a DivMod using that number, the remainder that we\n\t// get back is the lower part of the output.\n\t//\n\t// The ascii-output of remainder will never exceed 19 bytes (since it will be\n\t// below 10000000000000000000).\n\t//\n\t// Algorithm example using 100 as divisor\n\t//\n\t// 12345 % 100 = 45 (rem)\n\t// 12345 / 100 = 123 (quo)\n\t// -\u003e output '45', continue iterate on 123\n\tvar (\n\t\t// out is 98 bytes long: 78 (max size of a string without leading zeroes,\n\t\t// plus slack so we can copy 19 bytes every iteration).\n\t\t// We init it with zeroes, because when strconv appends the ascii representations,\n\t\t// it will omit leading zeroes.\n\t\tout = []byte(\"00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\")\n\t\tdivisor = NewUint(10000000000000000000) // 20 digits\n\t\ty = new(Uint).Set(z) // copy to avoid modifying z\n\t\tpos = len(out) // position to write to\n\t\tbuf = make([]byte, 0, 19) // buffer to write uint64:s to\n\t)\n\tfor {\n\t\t// Obtain Q and R for divisor\n\t\tvar quot Uint\n\t\trem := udivrem(quot.arr[:], y.arr[:], divisor)\n\t\ty.Set(\u0026quot) // Set Q for next loop\n\t\t// Convert the R to ascii representation\n\t\tbuf = strconv.AppendUint(buf[:0], rem.Uint64(), 10)\n\t\t// Copy in the ascii digits\n\t\tcopy(out[pos-len(buf):], buf)\n\t\tif y.IsZero() {\n\t\t\tbreak\n\t\t}\n\t\t// Move 19 digits left\n\t\tpos -= 19\n\t}\n\t// skip leading zeroes by only using the 'used size' of buf\n\treturn string(out[pos-len(buf):])\n}\n\nfunc (z *Uint) Scan(src interface{}) error {\n\tif src == nil {\n\t\tz.Clear()\n\t\treturn nil\n\t}\n\n\tswitch src := src.(type) {\n\tcase string:\n\t\treturn z.scanScientificFromString(src)\n\tcase []byte:\n\t\treturn z.scanScientificFromString(string(src))\n\t}\n\treturn errors.New(\"default // unsupported type: can't convert to uint256.Uint\")\n}\n\nfunc (z *Uint) scanScientificFromString(src string) error {\n\tif len(src) == 0 {\n\t\tz.Clear()\n\t\treturn nil\n\t}\n\n\tidx := strings.IndexByte(src, 'e')\n\tif idx == -1 {\n\t\treturn z.SetFromDecimal(src)\n\t}\n\tif err := z.SetFromDecimal(src[:idx]); err != nil {\n\t\treturn err\n\t}\n\tif src[(idx+1):] == \"0\" {\n\t\treturn nil\n\t}\n\texp := new(Uint)\n\tif err := exp.SetFromDecimal(src[(idx + 1):]); err != nil {\n\t\treturn err\n\t}\n\tif exp.GtUint64(77) { // 10**78 is larger than 2**256\n\t\treturn ErrBig256Range\n\t}\n\texp.Exp(NewUint(10), exp)\n\tif _, overflow := z.MulOverflow(z, exp); overflow {\n\t\treturn ErrBig256Range\n\t}\n\treturn nil\n}\n\n// ToString returns the decimal string representation of z. It returns an empty string if z is nil.\n// OBS: doesn't exist from holiman's uint256\nfunc (z *Uint) ToString() string {\n\tif z == nil {\n\t\treturn \"\"\n\t}\n\n\treturn z.Dec()\n}\n\n// MarshalJSON implements json.Marshaler.\n// MarshalJSON marshals using the 'decimal string' representation. This is _not_ compatible\n// with big.Uint: big.Uint marshals into JSON 'native' numeric format.\n//\n// The JSON native format is, on some platforms, (e.g. javascript), limited to 53-bit large\n// integer space. Thus, U256 uses string-format, which is not compatible with\n// big.int (big.Uint refuses to unmarshal a string representation).\nfunc (z *Uint) MarshalJSON() ([]byte, error) {\n\treturn []byte(`\"` + z.Dec() + `\"`), nil\n}\n\n// UnmarshalJSON implements json.Unmarshaler. UnmarshalJSON accepts either\n// - Quoted string: either hexadecimal OR decimal\n// - Not quoted string: only decimal\nfunc (z *Uint) UnmarshalJSON(input []byte) error {\n\tif len(input) \u003c 2 || input[0] != '\"' || input[len(input)-1] != '\"' {\n\t\t// if not quoted, it must be decimal\n\t\treturn z.fromDecimal(string(input))\n\t}\n\treturn z.UnmarshalText(input[1 : len(input)-1])\n}\n\n// MarshalText implements encoding.TextMarshaler\n// MarshalText marshals using the decimal representation (compatible with big.Uint)\nfunc (z *Uint) MarshalText() ([]byte, error) {\n\treturn []byte(z.Dec()), nil\n}\n\n// UnmarshalText implements encoding.TextUnmarshaler. This method\n// can unmarshal either hexadecimal or decimal.\n// - For hexadecimal, the input _must_ be prefixed with 0x or 0X\nfunc (z *Uint) UnmarshalText(input []byte) error {\n\tif len(input) \u003e= 2 \u0026\u0026 input[0] == '0' \u0026\u0026 (input[1] == 'x' || input[1] == 'X') {\n\t\treturn z.fromHex(string(input))\n\t}\n\treturn z.fromDecimal(string(input))\n}\n\n// SetBytes interprets buf as the bytes of a big-endian unsigned\n// integer, sets z to that value, and returns z.\n// If buf is larger than 32 bytes, the last 32 bytes is used.\nfunc (z *Uint) SetBytes(buf []byte) *Uint {\n\tswitch l := len(buf); l {\n\tcase 0:\n\t\tz.Clear()\n\tcase 1:\n\t\tz.SetBytes1(buf)\n\tcase 2:\n\t\tz.SetBytes2(buf)\n\tcase 3:\n\t\tz.SetBytes3(buf)\n\tcase 4:\n\t\tz.SetBytes4(buf)\n\tcase 5:\n\t\tz.SetBytes5(buf)\n\tcase 6:\n\t\tz.SetBytes6(buf)\n\tcase 7:\n\t\tz.SetBytes7(buf)\n\tcase 8:\n\t\tz.SetBytes8(buf)\n\tcase 9:\n\t\tz.SetBytes9(buf)\n\tcase 10:\n\t\tz.SetBytes10(buf)\n\tcase 11:\n\t\tz.SetBytes11(buf)\n\tcase 12:\n\t\tz.SetBytes12(buf)\n\tcase 13:\n\t\tz.SetBytes13(buf)\n\tcase 14:\n\t\tz.SetBytes14(buf)\n\tcase 15:\n\t\tz.SetBytes15(buf)\n\tcase 16:\n\t\tz.SetBytes16(buf)\n\tcase 17:\n\t\tz.SetBytes17(buf)\n\tcase 18:\n\t\tz.SetBytes18(buf)\n\tcase 19:\n\t\tz.SetBytes19(buf)\n\tcase 20:\n\t\tz.SetBytes20(buf)\n\tcase 21:\n\t\tz.SetBytes21(buf)\n\tcase 22:\n\t\tz.SetBytes22(buf)\n\tcase 23:\n\t\tz.SetBytes23(buf)\n\tcase 24:\n\t\tz.SetBytes24(buf)\n\tcase 25:\n\t\tz.SetBytes25(buf)\n\tcase 26:\n\t\tz.SetBytes26(buf)\n\tcase 27:\n\t\tz.SetBytes27(buf)\n\tcase 28:\n\t\tz.SetBytes28(buf)\n\tcase 29:\n\t\tz.SetBytes29(buf)\n\tcase 30:\n\t\tz.SetBytes30(buf)\n\tcase 31:\n\t\tz.SetBytes31(buf)\n\tdefault:\n\t\tz.SetBytes32(buf[l-32:])\n\t}\n\treturn z\n}\n\n// SetBytes1 is identical to SetBytes(in[:1]), but panics is input is too short\nfunc (z *Uint) SetBytes1(in []byte) *Uint {\n\tz.arr[3], z.arr[2], z.arr[1] = 0, 0, 0\n\tz.arr[0] = uint64(in[0])\n\treturn z\n}\n\n// SetBytes2 is identical to SetBytes(in[:2]), but panics is input is too short\nfunc (z *Uint) SetBytes2(in []byte) *Uint {\n\t_ = in[1] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3], z.arr[2], z.arr[1] = 0, 0, 0\n\tz.arr[0] = uint64(binary.BigEndian.Uint16(in[0:2]))\n\treturn z\n}\n\n// SetBytes3 is identical to SetBytes(in[:3]), but panics is input is too short\nfunc (z *Uint) SetBytes3(in []byte) *Uint {\n\t_ = in[2] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3], z.arr[2], z.arr[1] = 0, 0, 0\n\tz.arr[0] = uint64(binary.BigEndian.Uint16(in[1:3])) | uint64(in[0])\u003c\u003c16\n\treturn z\n}\n\n// SetBytes4 is identical to SetBytes(in[:4]), but panics is input is too short\nfunc (z *Uint) SetBytes4(in []byte) *Uint {\n\t_ = in[3] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3], z.arr[2], z.arr[1] = 0, 0, 0\n\tz.arr[0] = uint64(binary.BigEndian.Uint32(in[0:4]))\n\treturn z\n}\n\n// SetBytes5 is identical to SetBytes(in[:5]), but panics is input is too short\nfunc (z *Uint) SetBytes5(in []byte) *Uint {\n\t_ = in[4] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3], z.arr[2], z.arr[1] = 0, 0, 0\n\tz.arr[0] = bigEndianUint40(in[0:5])\n\treturn z\n}\n\n// SetBytes6 is identical to SetBytes(in[:6]), but panics is input is too short\nfunc (z *Uint) SetBytes6(in []byte) *Uint {\n\t_ = in[5] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3], z.arr[2], z.arr[1] = 0, 0, 0\n\tz.arr[0] = bigEndianUint48(in[0:6])\n\treturn z\n}\n\n// SetBytes7 is identical to SetBytes(in[:7]), but panics is input is too short\nfunc (z *Uint) SetBytes7(in []byte) *Uint {\n\t_ = in[6] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3], z.arr[2], z.arr[1] = 0, 0, 0\n\tz.arr[0] = bigEndianUint56(in[0:7])\n\treturn z\n}\n\n// SetBytes8 is identical to SetBytes(in[:8]), but panics is input is too short\nfunc (z *Uint) SetBytes8(in []byte) *Uint {\n\t_ = in[7] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3], z.arr[2], z.arr[1] = 0, 0, 0\n\tz.arr[0] = binary.BigEndian.Uint64(in[0:8])\n\treturn z\n}\n\n// SetBytes9 is identical to SetBytes(in[:9]), but panics is input is too short\nfunc (z *Uint) SetBytes9(in []byte) *Uint {\n\t_ = in[8] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3], z.arr[2] = 0, 0\n\tz.arr[1] = uint64(in[0])\n\tz.arr[0] = binary.BigEndian.Uint64(in[1:9])\n\treturn z\n}\n\n// SetBytes10 is identical to SetBytes(in[:10]), but panics is input is too short\nfunc (z *Uint) SetBytes10(in []byte) *Uint {\n\t_ = in[9] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3], z.arr[2] = 0, 0\n\tz.arr[1] = uint64(binary.BigEndian.Uint16(in[0:2]))\n\tz.arr[0] = binary.BigEndian.Uint64(in[2:10])\n\treturn z\n}\n\n// SetBytes11 is identical to SetBytes(in[:11]), but panics is input is too short\nfunc (z *Uint) SetBytes11(in []byte) *Uint {\n\t_ = in[10] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3], z.arr[2] = 0, 0\n\tz.arr[1] = uint64(binary.BigEndian.Uint16(in[1:3])) | uint64(in[0])\u003c\u003c16\n\tz.arr[0] = binary.BigEndian.Uint64(in[3:11])\n\treturn z\n}\n\n// SetBytes12 is identical to SetBytes(in[:12]), but panics is input is too short\nfunc (z *Uint) SetBytes12(in []byte) *Uint {\n\t_ = in[11] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3], z.arr[2] = 0, 0\n\tz.arr[1] = uint64(binary.BigEndian.Uint32(in[0:4]))\n\tz.arr[0] = binary.BigEndian.Uint64(in[4:12])\n\treturn z\n}\n\n// SetBytes13 is identical to SetBytes(in[:13]), but panics is input is too short\nfunc (z *Uint) SetBytes13(in []byte) *Uint {\n\t_ = in[12] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3], z.arr[2] = 0, 0\n\tz.arr[1] = bigEndianUint40(in[0:5])\n\tz.arr[0] = binary.BigEndian.Uint64(in[5:13])\n\treturn z\n}\n\n// SetBytes14 is identical to SetBytes(in[:14]), but panics is input is too short\nfunc (z *Uint) SetBytes14(in []byte) *Uint {\n\t_ = in[13] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3], z.arr[2] = 0, 0\n\tz.arr[1] = bigEndianUint48(in[0:6])\n\tz.arr[0] = binary.BigEndian.Uint64(in[6:14])\n\treturn z\n}\n\n// SetBytes15 is identical to SetBytes(in[:15]), but panics is input is too short\nfunc (z *Uint) SetBytes15(in []byte) *Uint {\n\t_ = in[14] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3], z.arr[2] = 0, 0\n\tz.arr[1] = bigEndianUint56(in[0:7])\n\tz.arr[0] = binary.BigEndian.Uint64(in[7:15])\n\treturn z\n}\n\n// SetBytes16 is identical to SetBytes(in[:16]), but panics is input is too short\nfunc (z *Uint) SetBytes16(in []byte) *Uint {\n\t_ = in[15] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3], z.arr[2] = 0, 0\n\tz.arr[1] = binary.BigEndian.Uint64(in[0:8])\n\tz.arr[0] = binary.BigEndian.Uint64(in[8:16])\n\treturn z\n}\n\n// SetBytes17 is identical to SetBytes(in[:17]), but panics is input is too short\nfunc (z *Uint) SetBytes17(in []byte) *Uint {\n\t_ = in[16] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3] = 0\n\tz.arr[2] = uint64(in[0])\n\tz.arr[1] = binary.BigEndian.Uint64(in[1:9])\n\tz.arr[0] = binary.BigEndian.Uint64(in[9:17])\n\treturn z\n}\n\n// SetBytes18 is identical to SetBytes(in[:18]), but panics is input is too short\nfunc (z *Uint) SetBytes18(in []byte) *Uint {\n\t_ = in[17] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3] = 0\n\tz.arr[2] = uint64(binary.BigEndian.Uint16(in[0:2]))\n\tz.arr[1] = binary.BigEndian.Uint64(in[2:10])\n\tz.arr[0] = binary.BigEndian.Uint64(in[10:18])\n\treturn z\n}\n\n// SetBytes19 is identical to SetBytes(in[:19]), but panics is input is too short\nfunc (z *Uint) SetBytes19(in []byte) *Uint {\n\t_ = in[18] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3] = 0\n\tz.arr[2] = uint64(binary.BigEndian.Uint16(in[1:3])) | uint64(in[0])\u003c\u003c16\n\tz.arr[1] = binary.BigEndian.Uint64(in[3:11])\n\tz.arr[0] = binary.BigEndian.Uint64(in[11:19])\n\treturn z\n}\n\n// SetBytes20 is identical to SetBytes(in[:20]), but panics is input is too short\nfunc (z *Uint) SetBytes20(in []byte) *Uint {\n\t_ = in[19] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3] = 0\n\tz.arr[2] = uint64(binary.BigEndian.Uint32(in[0:4]))\n\tz.arr[1] = binary.BigEndian.Uint64(in[4:12])\n\tz.arr[0] = binary.BigEndian.Uint64(in[12:20])\n\treturn z\n}\n\n// SetBytes21 is identical to SetBytes(in[:21]), but panics is input is too short\nfunc (z *Uint) SetBytes21(in []byte) *Uint {\n\t_ = in[20] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3] = 0\n\tz.arr[2] = bigEndianUint40(in[0:5])\n\tz.arr[1] = binary.BigEndian.Uint64(in[5:13])\n\tz.arr[0] = binary.BigEndian.Uint64(in[13:21])\n\treturn z\n}\n\n// SetBytes22 is identical to SetBytes(in[:22]), but panics is input is too short\nfunc (z *Uint) SetBytes22(in []byte) *Uint {\n\t_ = in[21] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3] = 0\n\tz.arr[2] = bigEndianUint48(in[0:6])\n\tz.arr[1] = binary.BigEndian.Uint64(in[6:14])\n\tz.arr[0] = binary.BigEndian.Uint64(in[14:22])\n\treturn z\n}\n\n// SetBytes23 is identical to SetBytes(in[:23]), but panics is input is too short\nfunc (z *Uint) SetBytes23(in []byte) *Uint {\n\t_ = in[22] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3] = 0\n\tz.arr[2] = bigEndianUint56(in[0:7])\n\tz.arr[1] = binary.BigEndian.Uint64(in[7:15])\n\tz.arr[0] = binary.BigEndian.Uint64(in[15:23])\n\treturn z\n}\n\n// SetBytes24 is identical to SetBytes(in[:24]), but panics is input is too short\nfunc (z *Uint) SetBytes24(in []byte) *Uint {\n\t_ = in[23] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3] = 0\n\tz.arr[2] = binary.BigEndian.Uint64(in[0:8])\n\tz.arr[1] = binary.BigEndian.Uint64(in[8:16])\n\tz.arr[0] = binary.BigEndian.Uint64(in[16:24])\n\treturn z\n}\n\n// SetBytes25 is identical to SetBytes(in[:25]), but panics is input is too short\nfunc (z *Uint) SetBytes25(in []byte) *Uint {\n\t_ = in[24] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3] = uint64(in[0])\n\tz.arr[2] = binary.BigEndian.Uint64(in[1:9])\n\tz.arr[1] = binary.BigEndian.Uint64(in[9:17])\n\tz.arr[0] = binary.BigEndian.Uint64(in[17:25])\n\treturn z\n}\n\n// SetBytes26 is identical to SetBytes(in[:26]), but panics is input is too short\nfunc (z *Uint) SetBytes26(in []byte) *Uint {\n\t_ = in[25] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3] = uint64(binary.BigEndian.Uint16(in[0:2]))\n\tz.arr[2] = binary.BigEndian.Uint64(in[2:10])\n\tz.arr[1] = binary.BigEndian.Uint64(in[10:18])\n\tz.arr[0] = binary.BigEndian.Uint64(in[18:26])\n\treturn z\n}\n\n// SetBytes27 is identical to SetBytes(in[:27]), but panics is input is too short\nfunc (z *Uint) SetBytes27(in []byte) *Uint {\n\t_ = in[26] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3] = uint64(binary.BigEndian.Uint16(in[1:3])) | uint64(in[0])\u003c\u003c16\n\tz.arr[2] = binary.BigEndian.Uint64(in[3:11])\n\tz.arr[1] = binary.BigEndian.Uint64(in[11:19])\n\tz.arr[0] = binary.BigEndian.Uint64(in[19:27])\n\treturn z\n}\n\n// SetBytes28 is identical to SetBytes(in[:28]), but panics is input is too short\nfunc (z *Uint) SetBytes28(in []byte) *Uint {\n\t_ = in[27] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3] = uint64(binary.BigEndian.Uint32(in[0:4]))\n\tz.arr[2] = binary.BigEndian.Uint64(in[4:12])\n\tz.arr[1] = binary.BigEndian.Uint64(in[12:20])\n\tz.arr[0] = binary.BigEndian.Uint64(in[20:28])\n\treturn z\n}\n\n// SetBytes29 is identical to SetBytes(in[:29]), but panics is input is too short\nfunc (z *Uint) SetBytes29(in []byte) *Uint {\n\t_ = in[23] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3] = bigEndianUint40(in[0:5])\n\tz.arr[2] = binary.BigEndian.Uint64(in[5:13])\n\tz.arr[1] = binary.BigEndian.Uint64(in[13:21])\n\tz.arr[0] = binary.BigEndian.Uint64(in[21:29])\n\treturn z\n}\n\n// SetBytes30 is identical to SetBytes(in[:30]), but panics is input is too short\nfunc (z *Uint) SetBytes30(in []byte) *Uint {\n\t_ = in[29] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3] = bigEndianUint48(in[0:6])\n\tz.arr[2] = binary.BigEndian.Uint64(in[6:14])\n\tz.arr[1] = binary.BigEndian.Uint64(in[14:22])\n\tz.arr[0] = binary.BigEndian.Uint64(in[22:30])\n\treturn z\n}\n\n// SetBytes31 is identical to SetBytes(in[:31]), but panics is input is too short\nfunc (z *Uint) SetBytes31(in []byte) *Uint {\n\t_ = in[30] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3] = bigEndianUint56(in[0:7])\n\tz.arr[2] = binary.BigEndian.Uint64(in[7:15])\n\tz.arr[1] = binary.BigEndian.Uint64(in[15:23])\n\tz.arr[0] = binary.BigEndian.Uint64(in[23:31])\n\treturn z\n}\n\n// SetBytes32 sets z to the value of the big-endian 256-bit unsigned integer in.\nfunc (z *Uint) SetBytes32(in []byte) *Uint {\n\t_ = in[31] // bounds check hint to compiler; see golang.org/issue/14808\n\tz.arr[3] = binary.BigEndian.Uint64(in[0:8])\n\tz.arr[2] = binary.BigEndian.Uint64(in[8:16])\n\tz.arr[1] = binary.BigEndian.Uint64(in[16:24])\n\tz.arr[0] = binary.BigEndian.Uint64(in[24:32])\n\treturn z\n}\n\n// Utility methods that are \"missing\" among the bigEndian.UintXX methods.\n\n// bigEndianUint40 returns the uint64 value represented by the 5 bytes in big-endian order.\nfunc bigEndianUint40(b []byte) uint64 {\n\t_ = b[4] // bounds check hint to compiler; see golang.org/issue/14808\n\treturn uint64(b[4]) | uint64(b[3])\u003c\u003c8 | uint64(b[2])\u003c\u003c16 | uint64(b[1])\u003c\u003c24 |\n\t\tuint64(b[0])\u003c\u003c32\n}\n\n// bigEndianUint56 returns the uint64 value represented by the 7 bytes in big-endian order.\nfunc bigEndianUint56(b []byte) uint64 {\n\t_ = b[6] // bounds check hint to compiler; see golang.org/issue/14808\n\treturn uint64(b[6]) | uint64(b[5])\u003c\u003c8 | uint64(b[4])\u003c\u003c16 | uint64(b[3])\u003c\u003c24 |\n\t\tuint64(b[2])\u003c\u003c32 | uint64(b[1])\u003c\u003c40 | uint64(b[0])\u003c\u003c48\n}\n\n// bigEndianUint48 returns the uint64 value represented by the 6 bytes in big-endian order.\nfunc bigEndianUint48(b []byte) uint64 {\n\t_ = b[5] // bounds check hint to compiler; see golang.org/issue/14808\n\treturn uint64(b[5]) | uint64(b[4])\u003c\u003c8 | uint64(b[3])\u003c\u003c16 | uint64(b[2])\u003c\u003c24 |\n\t\tuint64(b[1])\u003c\u003c32 | uint64(b[0])\u003c\u003c40\n}\n"},{"name":"conversion_test.gno","body":"package uint256\n\nimport \"testing\"\n\nfunc TestIsUint64(t *testing.T) {\n\ttests := []struct {\n\t\tx string\n\t\twant bool\n\t}{\n\t\t{\"0x0\", true},\n\t\t{\"0x1\", true},\n\t\t{\"0x10\", true},\n\t\t{\"0xffffffffffffffff\", true},\n\t\t{\"0x10000000000000000\", false},\n\t}\n\n\tfor _, tc := range tests {\n\t\tx := MustFromHex(tc.x)\n\t\tgot := x.IsUint64()\n\n\t\tif got != tc.want {\n\t\t\tt.Errorf(\"IsUint64(%s) = %v, want %v\", tc.x, got, tc.want)\n\t\t}\n\t}\n}\n\nfunc TestDec(t *testing.T) {\n\ttestCases := []struct {\n\t\tname string\n\t\tz Uint\n\t\twant string\n\t}{\n\t\t{\n\t\t\tname: \"zero\",\n\t\t\tz: Uint{arr: [4]uint64{0, 0, 0, 0}},\n\t\t\twant: \"0\",\n\t\t},\n\t\t{\n\t\t\tname: \"less than 20 digits\",\n\t\t\tz: Uint{arr: [4]uint64{1234567890, 0, 0, 0}},\n\t\t\twant: \"1234567890\",\n\t\t},\n\t\t{\n\t\t\tname: \"max possible value\",\n\t\t\tz: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}},\n\t\t\twant: \"115792089237316195423570985008687907853269984665640564039457584007913129639935\",\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tresult := tc.z.Dec()\n\t\t\tif result != tc.want {\n\t\t\t\tt.Errorf(\"Dec(%v) = %s, want %s\", tc.z, result, tc.want)\n\t\t\t}\n\t\t})\n\t}\n}\n"},{"name":"error.gno","body":"package uint256\n\nimport (\n\t\"errors\"\n)\n\nvar (\n\tErrEmptyString = errors.New(\"empty hex string\")\n\tErrSyntax = errors.New(\"invalid hex string\")\n\tErrRange = errors.New(\"number out of range\")\n\tErrMissingPrefix = errors.New(\"hex string without 0x prefix\")\n\tErrEmptyNumber = errors.New(\"hex string \\\"0x\\\"\")\n\tErrLeadingZero = errors.New(\"hex number with leading zero digits\")\n\tErrBig256Range = errors.New(\"hex number \u003e 256 bits\")\n\tErrBadBufferLength = errors.New(\"bad ssz buffer length\")\n\tErrBadEncodedLength = errors.New(\"bad ssz encoded length\")\n\tErrInvalidBase = errors.New(\"invalid base\")\n\tErrInvalidBitSize = errors.New(\"invalid bit size\")\n)\n\ntype u256Error struct {\n\tfn string // function name\n\tinput string\n\terr error\n}\n\nfunc (e *u256Error) Error() string {\n\treturn e.fn + \": \" + e.input + \": \" + e.err.Error()\n}\n\nfunc (e *u256Error) Unwrap() error {\n\treturn e.err\n}\n\nfunc errEmptyString(fn, input string) error {\n\treturn \u0026u256Error{fn: fn, input: input, err: ErrEmptyString}\n}\n\nfunc errSyntax(fn, input string) error {\n\treturn \u0026u256Error{fn: fn, input: input, err: ErrSyntax}\n}\n\nfunc errMissingPrefix(fn, input string) error {\n\treturn \u0026u256Error{fn: fn, input: input, err: ErrMissingPrefix}\n}\n\nfunc errEmptyNumber(fn, input string) error {\n\treturn \u0026u256Error{fn: fn, input: input, err: ErrEmptyNumber}\n}\n\nfunc errLeadingZero(fn, input string) error {\n\treturn \u0026u256Error{fn: fn, input: input, err: ErrLeadingZero}\n}\n\nfunc errRange(fn, input string) error {\n\treturn \u0026u256Error{fn: fn, input: input, err: ErrRange}\n}\n\nfunc errBig256Range(fn, input string) error {\n\treturn \u0026u256Error{fn: fn, input: input, err: ErrBig256Range}\n}\n\nfunc errBadBufferLength(fn, input string) error {\n\treturn \u0026u256Error{fn: fn, input: input, err: ErrBadBufferLength}\n}\n\nfunc errInvalidBase(fn string, base int) error {\n\treturn \u0026u256Error{fn: fn, input: string(base), err: ErrInvalidBase}\n}\n\nfunc errInvalidBitSize(fn string, bitSize int) error {\n\treturn \u0026u256Error{fn: fn, input: string(bitSize), err: ErrInvalidBitSize}\n}\n"},{"name":"mod.gno","body":"package uint256\n\nimport (\n\t\"math/bits\"\n)\n\n// Some utility functions\n\n// Reciprocal computes a 320-bit value representing 1/m\n//\n// Notes:\n// - specialized for m.arr[3] != 0, hence limited to 2^192 \u003c= m \u003c 2^256\n// - returns zero if m.arr[3] == 0\n// - starts with a 32-bit division, refines with newton-raphson iterations\nfunc Reciprocal(m *Uint) (mu [5]uint64) {\n\tif m.arr[3] == 0 {\n\t\treturn mu\n\t}\n\n\ts := bits.LeadingZeros64(m.arr[3]) // Replace with leadingZeros(m) for general case\n\tp := 255 - s // floor(log_2(m)), m\u003e0\n\n\t// 0 or a power of 2?\n\n\t// Check if at least one bit is set in m.arr[2], m.arr[1] or m.arr[0],\n\t// or at least two bits in m.arr[3]\n\n\tif m.arr[0]|m.arr[1]|m.arr[2]|(m.arr[3]\u0026(m.arr[3]-1)) == 0 {\n\n\t\tmu[4] = ^uint64(0) \u003e\u003e uint(p\u002663)\n\t\tmu[3] = ^uint64(0)\n\t\tmu[2] = ^uint64(0)\n\t\tmu[1] = ^uint64(0)\n\t\tmu[0] = ^uint64(0)\n\n\t\treturn mu\n\t}\n\n\t// Maximise division precision by left-aligning divisor\n\n\tvar (\n\t\ty Uint // left-aligned copy of m\n\t\tr0 uint32 // estimate of 2^31/y\n\t)\n\n\ty.Lsh(m, uint(s)) // 1/2 \u003c y \u003c 1\n\n\t// Extract most significant 32 bits\n\n\tyh := uint32(y.arr[3] \u003e\u003e 32)\n\n\tif yh == 0x80000000 { // Avoid overflow in division\n\t\tr0 = 0xffffffff\n\t} else {\n\t\tr0, _ = bits.Div32(0x80000000, 0, yh)\n\t}\n\n\t// First iteration: 32 -\u003e 64\n\n\tt1 := uint64(r0) // 2^31/y\n\tt1 *= t1 // 2^62/y^2\n\tt1, _ = bits.Mul64(t1, y.arr[3]) // 2^62/y^2 * 2^64/y / 2^64 = 2^62/y\n\n\tr1 := uint64(r0) \u003c\u003c 32 // 2^63/y\n\tr1 -= t1 // 2^63/y - 2^62/y = 2^62/y\n\tr1 *= 2 // 2^63/y\n\n\tif (r1 | (y.arr[3] \u003c\u003c 1)) == 0 {\n\t\tr1 = ^uint64(0)\n\t}\n\n\t// Second iteration: 64 -\u003e 128\n\n\t// square: 2^126/y^2\n\ta2h, a2l := bits.Mul64(r1, r1)\n\n\t// multiply by y: e2h:e2l:b2h = 2^126/y^2 * 2^128/y / 2^128 = 2^126/y\n\tb2h, _ := bits.Mul64(a2l, y.arr[2])\n\tc2h, c2l := bits.Mul64(a2l, y.arr[3])\n\td2h, d2l := bits.Mul64(a2h, y.arr[2])\n\te2h, e2l := bits.Mul64(a2h, y.arr[3])\n\n\tb2h, c := bits.Add64(b2h, c2l, 0)\n\te2l, c = bits.Add64(e2l, c2h, c)\n\te2h, _ = bits.Add64(e2h, 0, c)\n\n\t_, c = bits.Add64(b2h, d2l, 0)\n\te2l, c = bits.Add64(e2l, d2h, c)\n\te2h, _ = bits.Add64(e2h, 0, c)\n\n\t// subtract: t2h:t2l = 2^127/y - 2^126/y = 2^126/y\n\tt2l, b := bits.Sub64(0, e2l, 0)\n\tt2h, _ := bits.Sub64(r1, e2h, b)\n\n\t// double: r2h:r2l = 2^127/y\n\tr2l, c := bits.Add64(t2l, t2l, 0)\n\tr2h, _ := bits.Add64(t2h, t2h, c)\n\n\tif (r2h | r2l | (y.arr[3] \u003c\u003c 1)) == 0 {\n\t\tr2h = ^uint64(0)\n\t\tr2l = ^uint64(0)\n\t}\n\n\t// Third iteration: 128 -\u003e 192\n\n\t// square r2 (keep 256 bits): 2^190/y^2\n\ta3h, a3l := bits.Mul64(r2l, r2l)\n\tb3h, b3l := bits.Mul64(r2l, r2h)\n\tc3h, c3l := bits.Mul64(r2h, r2h)\n\n\ta3h, c = bits.Add64(a3h, b3l, 0)\n\tc3l, c = bits.Add64(c3l, b3h, c)\n\tc3h, _ = bits.Add64(c3h, 0, c)\n\n\ta3h, c = bits.Add64(a3h, b3l, 0)\n\tc3l, c = bits.Add64(c3l, b3h, c)\n\tc3h, _ = bits.Add64(c3h, 0, c)\n\n\t// multiply by y: q = 2^190/y^2 * 2^192/y / 2^192 = 2^190/y\n\n\tx0 := a3l\n\tx1 := a3h\n\tx2 := c3l\n\tx3 := c3h\n\n\tvar q0, q1, q2, q3, q4, t0 uint64\n\n\tq0, _ = bits.Mul64(x2, y.arr[0])\n\tq1, t0 = bits.Mul64(x3, y.arr[0])\n\tq0, c = bits.Add64(q0, t0, 0)\n\tq1, _ = bits.Add64(q1, 0, c)\n\n\tt1, _ = bits.Mul64(x1, y.arr[1])\n\tq0, c = bits.Add64(q0, t1, 0)\n\tq2, t0 = bits.Mul64(x3, y.arr[1])\n\tq1, c = bits.Add64(q1, t0, c)\n\tq2, _ = bits.Add64(q2, 0, c)\n\n\tt1, t0 = bits.Mul64(x2, y.arr[1])\n\tq0, c = bits.Add64(q0, t0, 0)\n\tq1, c = bits.Add64(q1, t1, c)\n\tq2, _ = bits.Add64(q2, 0, c)\n\n\tt1, t0 = bits.Mul64(x1, y.arr[2])\n\tq0, c = bits.Add64(q0, t0, 0)\n\tq1, c = bits.Add64(q1, t1, c)\n\tq3, t0 = bits.Mul64(x3, y.arr[2])\n\tq2, c = bits.Add64(q2, t0, c)\n\tq3, _ = bits.Add64(q3, 0, c)\n\n\tt1, _ = bits.Mul64(x0, y.arr[2])\n\tq0, c = bits.Add64(q0, t1, 0)\n\tt1, t0 = bits.Mul64(x2, y.arr[2])\n\tq1, c = bits.Add64(q1, t0, c)\n\tq2, c = bits.Add64(q2, t1, c)\n\tq3, _ = bits.Add64(q3, 0, c)\n\n\tt1, t0 = bits.Mul64(x1, y.arr[3])\n\tq1, c = bits.Add64(q1, t0, 0)\n\tq2, c = bits.Add64(q2, t1, c)\n\tq4, t0 = bits.Mul64(x3, y.arr[3])\n\tq3, c = bits.Add64(q3, t0, c)\n\tq4, _ = bits.Add64(q4, 0, c)\n\n\tt1, t0 = bits.Mul64(x0, y.arr[3])\n\tq0, c = bits.Add64(q0, t0, 0)\n\tq1, c = bits.Add64(q1, t1, c)\n\tt1, t0 = bits.Mul64(x2, y.arr[3])\n\tq2, c = bits.Add64(q2, t0, c)\n\tq3, c = bits.Add64(q3, t1, c)\n\tq4, _ = bits.Add64(q4, 0, c)\n\n\t// subtract: t3 = 2^191/y - 2^190/y = 2^190/y\n\t_, b = bits.Sub64(0, q0, 0)\n\t_, b = bits.Sub64(0, q1, b)\n\tt3l, b := bits.Sub64(0, q2, b)\n\tt3m, b := bits.Sub64(r2l, q3, b)\n\tt3h, _ := bits.Sub64(r2h, q4, b)\n\n\t// double: r3 = 2^191/y\n\tr3l, c := bits.Add64(t3l, t3l, 0)\n\tr3m, c := bits.Add64(t3m, t3m, c)\n\tr3h, _ := bits.Add64(t3h, t3h, c)\n\n\t// Fourth iteration: 192 -\u003e 320\n\n\t// square r3\n\n\ta4h, a4l := bits.Mul64(r3l, r3l)\n\tb4h, b4l := bits.Mul64(r3l, r3m)\n\tc4h, c4l := bits.Mul64(r3l, r3h)\n\td4h, d4l := bits.Mul64(r3m, r3m)\n\te4h, e4l := bits.Mul64(r3m, r3h)\n\tf4h, f4l := bits.Mul64(r3h, r3h)\n\n\tb4h, c = bits.Add64(b4h, c4l, 0)\n\te4l, c = bits.Add64(e4l, c4h, c)\n\te4h, _ = bits.Add64(e4h, 0, c)\n\n\ta4h, c = bits.Add64(a4h, b4l, 0)\n\td4l, c = bits.Add64(d4l, b4h, c)\n\td4h, c = bits.Add64(d4h, e4l, c)\n\tf4l, c = bits.Add64(f4l, e4h, c)\n\tf4h, _ = bits.Add64(f4h, 0, c)\n\n\ta4h, c = bits.Add64(a4h, b4l, 0)\n\td4l, c = bits.Add64(d4l, b4h, c)\n\td4h, c = bits.Add64(d4h, e4l, c)\n\tf4l, c = bits.Add64(f4l, e4h, c)\n\tf4h, _ = bits.Add64(f4h, 0, c)\n\n\t// multiply by y\n\n\tx1, x0 = bits.Mul64(d4h, y.arr[0])\n\tx3, x2 = bits.Mul64(f4h, y.arr[0])\n\tt1, t0 = bits.Mul64(f4l, y.arr[0])\n\tx1, c = bits.Add64(x1, t0, 0)\n\tx2, c = bits.Add64(x2, t1, c)\n\tx3, _ = bits.Add64(x3, 0, c)\n\n\tt1, t0 = bits.Mul64(d4h, y.arr[1])\n\tx1, c = bits.Add64(x1, t0, 0)\n\tx2, c = bits.Add64(x2, t1, c)\n\tx4, t0 := bits.Mul64(f4h, y.arr[1])\n\tx3, c = bits.Add64(x3, t0, c)\n\tx4, _ = bits.Add64(x4, 0, c)\n\tt1, t0 = bits.Mul64(d4l, y.arr[1])\n\tx0, c = bits.Add64(x0, t0, 0)\n\tx1, c = bits.Add64(x1, t1, c)\n\tt1, t0 = bits.Mul64(f4l, y.arr[1])\n\tx2, c = bits.Add64(x2, t0, c)\n\tx3, c = bits.Add64(x3, t1, c)\n\tx4, _ = bits.Add64(x4, 0, c)\n\n\tt1, t0 = bits.Mul64(a4h, y.arr[2])\n\tx0, c = bits.Add64(x0, t0, 0)\n\tx1, c = bits.Add64(x1, t1, c)\n\tt1, t0 = bits.Mul64(d4h, y.arr[2])\n\tx2, c = bits.Add64(x2, t0, c)\n\tx3, c = bits.Add64(x3, t1, c)\n\tx5, t0 := bits.Mul64(f4h, y.arr[2])\n\tx4, c = bits.Add64(x4, t0, c)\n\tx5, _ = bits.Add64(x5, 0, c)\n\tt1, t0 = bits.Mul64(d4l, y.arr[2])\n\tx1, c = bits.Add64(x1, t0, 0)\n\tx2, c = bits.Add64(x2, t1, c)\n\tt1, t0 = bits.Mul64(f4l, y.arr[2])\n\tx3, c = bits.Add64(x3, t0, c)\n\tx4, c = bits.Add64(x4, t1, c)\n\tx5, _ = bits.Add64(x5, 0, c)\n\n\tt1, t0 = bits.Mul64(a4h, y.arr[3])\n\tx1, c = bits.Add64(x1, t0, 0)\n\tx2, c = bits.Add64(x2, t1, c)\n\tt1, t0 = bits.Mul64(d4h, y.arr[3])\n\tx3, c = bits.Add64(x3, t0, c)\n\tx4, c = bits.Add64(x4, t1, c)\n\tx6, t0 := bits.Mul64(f4h, y.arr[3])\n\tx5, c = bits.Add64(x5, t0, c)\n\tx6, _ = bits.Add64(x6, 0, c)\n\tt1, t0 = bits.Mul64(a4l, y.arr[3])\n\tx0, c = bits.Add64(x0, t0, 0)\n\tx1, c = bits.Add64(x1, t1, c)\n\tt1, t0 = bits.Mul64(d4l, y.arr[3])\n\tx2, c = bits.Add64(x2, t0, c)\n\tx3, c = bits.Add64(x3, t1, c)\n\tt1, t0 = bits.Mul64(f4l, y.arr[3])\n\tx4, c = bits.Add64(x4, t0, c)\n\tx5, c = bits.Add64(x5, t1, c)\n\tx6, _ = bits.Add64(x6, 0, c)\n\n\t// subtract\n\t_, b = bits.Sub64(0, x0, 0)\n\t_, b = bits.Sub64(0, x1, b)\n\tr4l, b := bits.Sub64(0, x2, b)\n\tr4k, b := bits.Sub64(0, x3, b)\n\tr4j, b := bits.Sub64(r3l, x4, b)\n\tr4i, b := bits.Sub64(r3m, x5, b)\n\tr4h, _ := bits.Sub64(r3h, x6, b)\n\n\t// Multiply candidate for 1/4y by y, with full precision\n\n\tx0 = r4l\n\tx1 = r4k\n\tx2 = r4j\n\tx3 = r4i\n\tx4 = r4h\n\n\tq1, q0 = bits.Mul64(x0, y.arr[0])\n\tq3, q2 = bits.Mul64(x2, y.arr[0])\n\tq5, q4 := bits.Mul64(x4, y.arr[0])\n\n\tt1, t0 = bits.Mul64(x1, y.arr[0])\n\tq1, c = bits.Add64(q1, t0, 0)\n\tq2, c = bits.Add64(q2, t1, c)\n\tt1, t0 = bits.Mul64(x3, y.arr[0])\n\tq3, c = bits.Add64(q3, t0, c)\n\tq4, c = bits.Add64(q4, t1, c)\n\tq5, _ = bits.Add64(q5, 0, c)\n\n\tt1, t0 = bits.Mul64(x0, y.arr[1])\n\tq1, c = bits.Add64(q1, t0, 0)\n\tq2, c = bits.Add64(q2, t1, c)\n\tt1, t0 = bits.Mul64(x2, y.arr[1])\n\tq3, c = bits.Add64(q3, t0, c)\n\tq4, c = bits.Add64(q4, t1, c)\n\tq6, t0 := bits.Mul64(x4, y.arr[1])\n\tq5, c = bits.Add64(q5, t0, c)\n\tq6, _ = bits.Add64(q6, 0, c)\n\n\tt1, t0 = bits.Mul64(x1, y.arr[1])\n\tq2, c = bits.Add64(q2, t0, 0)\n\tq3, c = bits.Add64(q3, t1, c)\n\tt1, t0 = bits.Mul64(x3, y.arr[1])\n\tq4, c = bits.Add64(q4, t0, c)\n\tq5, c = bits.Add64(q5, t1, c)\n\tq6, _ = bits.Add64(q6, 0, c)\n\n\tt1, t0 = bits.Mul64(x0, y.arr[2])\n\tq2, c = bits.Add64(q2, t0, 0)\n\tq3, c = bits.Add64(q3, t1, c)\n\tt1, t0 = bits.Mul64(x2, y.arr[2])\n\tq4, c = bits.Add64(q4, t0, c)\n\tq5, c = bits.Add64(q5, t1, c)\n\tq7, t0 := bits.Mul64(x4, y.arr[2])\n\tq6, c = bits.Add64(q6, t0, c)\n\tq7, _ = bits.Add64(q7, 0, c)\n\n\tt1, t0 = bits.Mul64(x1, y.arr[2])\n\tq3, c = bits.Add64(q3, t0, 0)\n\tq4, c = bits.Add64(q4, t1, c)\n\tt1, t0 = bits.Mul64(x3, y.arr[2])\n\tq5, c = bits.Add64(q5, t0, c)\n\tq6, c = bits.Add64(q6, t1, c)\n\tq7, _ = bits.Add64(q7, 0, c)\n\n\tt1, t0 = bits.Mul64(x0, y.arr[3])\n\tq3, c = bits.Add64(q3, t0, 0)\n\tq4, c = bits.Add64(q4, t1, c)\n\tt1, t0 = bits.Mul64(x2, y.arr[3])\n\tq5, c = bits.Add64(q5, t0, c)\n\tq6, c = bits.Add64(q6, t1, c)\n\tq8, t0 := bits.Mul64(x4, y.arr[3])\n\tq7, c = bits.Add64(q7, t0, c)\n\tq8, _ = bits.Add64(q8, 0, c)\n\n\tt1, t0 = bits.Mul64(x1, y.arr[3])\n\tq4, c = bits.Add64(q4, t0, 0)\n\tq5, c = bits.Add64(q5, t1, c)\n\tt1, t0 = bits.Mul64(x3, y.arr[3])\n\tq6, c = bits.Add64(q6, t0, c)\n\tq7, c = bits.Add64(q7, t1, c)\n\tq8, _ = bits.Add64(q8, 0, c)\n\n\t// Final adjustment\n\n\t// subtract q from 1/4\n\t_, b = bits.Sub64(0, q0, 0)\n\t_, b = bits.Sub64(0, q1, b)\n\t_, b = bits.Sub64(0, q2, b)\n\t_, b = bits.Sub64(0, q3, b)\n\t_, b = bits.Sub64(0, q4, b)\n\t_, b = bits.Sub64(0, q5, b)\n\t_, b = bits.Sub64(0, q6, b)\n\t_, b = bits.Sub64(0, q7, b)\n\t_, b = bits.Sub64(uint64(1)\u003c\u003c62, q8, b)\n\n\t// decrement the result\n\tx0, t := bits.Sub64(r4l, 1, 0)\n\tx1, t = bits.Sub64(r4k, 0, t)\n\tx2, t = bits.Sub64(r4j, 0, t)\n\tx3, t = bits.Sub64(r4i, 0, t)\n\tx4, _ = bits.Sub64(r4h, 0, t)\n\n\t// commit the decrement if the subtraction underflowed (reciprocal was too large)\n\tif b != 0 {\n\t\tr4h, r4i, r4j, r4k, r4l = x4, x3, x2, x1, x0\n\t}\n\n\t// Shift to correct bit alignment, truncating excess bits\n\n\tp = (p \u0026 63) - 1\n\n\tx0, c = bits.Add64(r4l, r4l, 0)\n\tx1, c = bits.Add64(r4k, r4k, c)\n\tx2, c = bits.Add64(r4j, r4j, c)\n\tx3, c = bits.Add64(r4i, r4i, c)\n\tx4, _ = bits.Add64(r4h, r4h, c)\n\n\tif p \u003c 0 {\n\t\tr4h, r4i, r4j, r4k, r4l = x4, x3, x2, x1, x0\n\t\tp = 0 // avoid negative shift below\n\t}\n\n\t{\n\t\tr := uint(p) // right shift\n\t\tl := uint(64 - r) // left shift\n\n\t\tx0 = (r4l \u003e\u003e r) | (r4k \u003c\u003c l)\n\t\tx1 = (r4k \u003e\u003e r) | (r4j \u003c\u003c l)\n\t\tx2 = (r4j \u003e\u003e r) | (r4i \u003c\u003c l)\n\t\tx3 = (r4i \u003e\u003e r) | (r4h \u003c\u003c l)\n\t\tx4 = (r4h \u003e\u003e r)\n\t}\n\n\tif p \u003e 0 {\n\t\tr4h, r4i, r4j, r4k, r4l = x4, x3, x2, x1, x0\n\t}\n\n\tmu[0] = r4l\n\tmu[1] = r4k\n\tmu[2] = r4j\n\tmu[3] = r4i\n\tmu[4] = r4h\n\n\treturn mu\n}\n\n// reduce4 computes the least non-negative residue of x modulo m\n//\n// requires a four-word modulus (m.arr[3] \u003e 1) and its inverse (mu)\nfunc reduce4(x [8]uint64, m *Uint, mu [5]uint64) (z Uint) {\n\t// NB: Most variable names in the comments match the pseudocode for\n\t// \tBarrett reduction in the Handbook of Applied Cryptography.\n\n\t// q1 = x/2^192\n\n\tx0 := x[3]\n\tx1 := x[4]\n\tx2 := x[5]\n\tx3 := x[6]\n\tx4 := x[7]\n\n\t// q2 = q1 * mu; q3 = q2 / 2^320\n\n\tvar q0, q1, q2, q3, q4, q5, t0, t1, c uint64\n\n\tq0, _ = bits.Mul64(x3, mu[0])\n\tq1, t0 = bits.Mul64(x4, mu[0])\n\tq0, c = bits.Add64(q0, t0, 0)\n\tq1, _ = bits.Add64(q1, 0, c)\n\n\tt1, _ = bits.Mul64(x2, mu[1])\n\tq0, c = bits.Add64(q0, t1, 0)\n\tq2, t0 = bits.Mul64(x4, mu[1])\n\tq1, c = bits.Add64(q1, t0, c)\n\tq2, _ = bits.Add64(q2, 0, c)\n\n\tt1, t0 = bits.Mul64(x3, mu[1])\n\tq0, c = bits.Add64(q0, t0, 0)\n\tq1, c = bits.Add64(q1, t1, c)\n\tq2, _ = bits.Add64(q2, 0, c)\n\n\tt1, t0 = bits.Mul64(x2, mu[2])\n\tq0, c = bits.Add64(q0, t0, 0)\n\tq1, c = bits.Add64(q1, t1, c)\n\tq3, t0 = bits.Mul64(x4, mu[2])\n\tq2, c = bits.Add64(q2, t0, c)\n\tq3, _ = bits.Add64(q3, 0, c)\n\n\tt1, _ = bits.Mul64(x1, mu[2])\n\tq0, c = bits.Add64(q0, t1, 0)\n\tt1, t0 = bits.Mul64(x3, mu[2])\n\tq1, c = bits.Add64(q1, t0, c)\n\tq2, c = bits.Add64(q2, t1, c)\n\tq3, _ = bits.Add64(q3, 0, c)\n\n\tt1, _ = bits.Mul64(x0, mu[3])\n\tq0, c = bits.Add64(q0, t1, 0)\n\tt1, t0 = bits.Mul64(x2, mu[3])\n\tq1, c = bits.Add64(q1, t0, c)\n\tq2, c = bits.Add64(q2, t1, c)\n\tq4, t0 = bits.Mul64(x4, mu[3])\n\tq3, c = bits.Add64(q3, t0, c)\n\tq4, _ = bits.Add64(q4, 0, c)\n\n\tt1, t0 = bits.Mul64(x1, mu[3])\n\tq0, c = bits.Add64(q0, t0, 0)\n\tq1, c = bits.Add64(q1, t1, c)\n\tt1, t0 = bits.Mul64(x3, mu[3])\n\tq2, c = bits.Add64(q2, t0, c)\n\tq3, c = bits.Add64(q3, t1, c)\n\tq4, _ = bits.Add64(q4, 0, c)\n\n\tt1, t0 = bits.Mul64(x0, mu[4])\n\t_, c = bits.Add64(q0, t0, 0)\n\tq1, c = bits.Add64(q1, t1, c)\n\tt1, t0 = bits.Mul64(x2, mu[4])\n\tq2, c = bits.Add64(q2, t0, c)\n\tq3, c = bits.Add64(q3, t1, c)\n\tq5, t0 = bits.Mul64(x4, mu[4])\n\tq4, c = bits.Add64(q4, t0, c)\n\tq5, _ = bits.Add64(q5, 0, c)\n\n\tt1, t0 = bits.Mul64(x1, mu[4])\n\tq1, c = bits.Add64(q1, t0, 0)\n\tq2, c = bits.Add64(q2, t1, c)\n\tt1, t0 = bits.Mul64(x3, mu[4])\n\tq3, c = bits.Add64(q3, t0, c)\n\tq4, c = bits.Add64(q4, t1, c)\n\tq5, _ = bits.Add64(q5, 0, c)\n\n\t// Drop the fractional part of q3\n\n\tq0 = q1\n\tq1 = q2\n\tq2 = q3\n\tq3 = q4\n\tq4 = q5\n\n\t// r1 = x mod 2^320\n\n\tx0 = x[0]\n\tx1 = x[1]\n\tx2 = x[2]\n\tx3 = x[3]\n\tx4 = x[4]\n\n\t// r2 = q3 * m mod 2^320\n\n\tvar r0, r1, r2, r3, r4 uint64\n\n\tr4, r3 = bits.Mul64(q0, m.arr[3])\n\t_, t0 = bits.Mul64(q1, m.arr[3])\n\tr4, _ = bits.Add64(r4, t0, 0)\n\n\tt1, r2 = bits.Mul64(q0, m.arr[2])\n\tr3, c = bits.Add64(r3, t1, 0)\n\t_, t0 = bits.Mul64(q2, m.arr[2])\n\tr4, _ = bits.Add64(r4, t0, c)\n\n\tt1, t0 = bits.Mul64(q1, m.arr[2])\n\tr3, c = bits.Add64(r3, t0, 0)\n\tr4, _ = bits.Add64(r4, t1, c)\n\n\tt1, r1 = bits.Mul64(q0, m.arr[1])\n\tr2, c = bits.Add64(r2, t1, 0)\n\tt1, t0 = bits.Mul64(q2, m.arr[1])\n\tr3, c = bits.Add64(r3, t0, c)\n\tr4, _ = bits.Add64(r4, t1, c)\n\n\tt1, t0 = bits.Mul64(q1, m.arr[1])\n\tr2, c = bits.Add64(r2, t0, 0)\n\tr3, c = bits.Add64(r3, t1, c)\n\t_, t0 = bits.Mul64(q3, m.arr[1])\n\tr4, _ = bits.Add64(r4, t0, c)\n\n\tt1, r0 = bits.Mul64(q0, m.arr[0])\n\tr1, c = bits.Add64(r1, t1, 0)\n\tt1, t0 = bits.Mul64(q2, m.arr[0])\n\tr2, c = bits.Add64(r2, t0, c)\n\tr3, c = bits.Add64(r3, t1, c)\n\t_, t0 = bits.Mul64(q4, m.arr[0])\n\tr4, _ = bits.Add64(r4, t0, c)\n\n\tt1, t0 = bits.Mul64(q1, m.arr[0])\n\tr1, c = bits.Add64(r1, t0, 0)\n\tr2, c = bits.Add64(r2, t1, c)\n\tt1, t0 = bits.Mul64(q3, m.arr[0])\n\tr3, c = bits.Add64(r3, t0, c)\n\tr4, _ = bits.Add64(r4, t1, c)\n\n\t// r = r1 - r2\n\n\tvar b uint64\n\n\tr0, b = bits.Sub64(x0, r0, 0)\n\tr1, b = bits.Sub64(x1, r1, b)\n\tr2, b = bits.Sub64(x2, r2, b)\n\tr3, b = bits.Sub64(x3, r3, b)\n\tr4, b = bits.Sub64(x4, r4, b)\n\n\t// if r\u003c0 then r+=m\n\n\tif b != 0 {\n\t\tr0, c = bits.Add64(r0, m.arr[0], 0)\n\t\tr1, c = bits.Add64(r1, m.arr[1], c)\n\t\tr2, c = bits.Add64(r2, m.arr[2], c)\n\t\tr3, c = bits.Add64(r3, m.arr[3], c)\n\t\tr4, _ = bits.Add64(r4, 0, c)\n\t}\n\n\t// while (r\u003e=m) r-=m\n\n\tfor {\n\t\t// q = r - m\n\t\tq0, b = bits.Sub64(r0, m.arr[0], 0)\n\t\tq1, b = bits.Sub64(r1, m.arr[1], b)\n\t\tq2, b = bits.Sub64(r2, m.arr[2], b)\n\t\tq3, b = bits.Sub64(r3, m.arr[3], b)\n\t\tq4, b = bits.Sub64(r4, 0, b)\n\n\t\t// if borrow break\n\t\tif b != 0 {\n\t\t\tbreak\n\t\t}\n\n\t\t// r = q\n\t\tr4, r3, r2, r1, r0 = q4, q3, q2, q1, q0\n\t}\n\n\tz.arr[3], z.arr[2], z.arr[1], z.arr[0] = r3, r2, r1, r0\n\n\treturn z\n}\n"},{"name":"uint256.gno","body":"// Ported from https://github.com/holiman/uint256\n// This package provides a 256-bit unsigned integer type, Uint256, and associated functions.\npackage uint256\n\nimport (\n\t\"errors\"\n\t\"math/bits\"\n)\n\nconst (\n\tMaxUint64 = 1\u003c\u003c64 - 1\n\tuintSize = 32 \u003c\u003c (^uint(0) \u003e\u003e 63)\n)\n\n// Uint is represented as an array of 4 uint64, in little-endian order,\n// so that Uint[3] is the most significant, and Uint[0] is the least significant\ntype Uint struct {\n\tarr [4]uint64\n}\n\n// NewUint returns a new initialized Uint.\nfunc NewUint(val uint64) *Uint {\n\tz := \u0026Uint{arr: [4]uint64{val, 0, 0, 0}}\n\treturn z\n}\n\n// Zero returns a new Uint initialized to zero.\nfunc Zero() *Uint {\n\treturn NewUint(0)\n}\n\n// One returns a new Uint initialized to one.\nfunc One() *Uint {\n\treturn NewUint(1)\n}\n\n// SetAllOne sets all the bits of z to 1\nfunc (z *Uint) SetAllOne() *Uint {\n\tz.arr[3], z.arr[2], z.arr[1], z.arr[0] = MaxUint64, MaxUint64, MaxUint64, MaxUint64\n\treturn z\n}\n\n// Set sets z to x and returns z.\nfunc (z *Uint) Set(x *Uint) *Uint {\n\t*z = *x\n\n\treturn z\n}\n\n// SetOne sets z to 1\nfunc (z *Uint) SetOne() *Uint {\n\tz.arr[3], z.arr[2], z.arr[1], z.arr[0] = 0, 0, 0, 1\n\treturn z\n}\n\nconst twoPow256Sub1 = \"115792089237316195423570985008687907853269984665640564039457584007913129639935\"\n\n// SetFromDecimal sets z from the given string, interpreted as a decimal number.\n// OBS! This method is _not_ strictly identical to the (*big.Uint).SetString(..., 10) method.\n// Notable differences:\n// - This method does not accept underscore input, e.g. \"100_000\",\n// - This method does not accept negative zero as valid, e.g \"-0\",\n// - (this method does not accept any negative input as valid))\nfunc (z *Uint) SetFromDecimal(s string) (err error) {\n\t// Remove max one leading +\n\tif len(s) \u003e 0 \u0026\u0026 s[0] == '+' {\n\t\ts = s[1:]\n\t}\n\t// Remove any number of leading zeroes\n\tif len(s) \u003e 0 \u0026\u0026 s[0] == '0' {\n\t\tvar i int\n\t\tvar c rune\n\t\tfor i, c = range s {\n\t\t\tif c != '0' {\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\ts = s[i:]\n\t}\n\tif len(s) \u003c len(twoPow256Sub1) {\n\t\treturn z.fromDecimal(s)\n\t}\n\tif len(s) == len(twoPow256Sub1) {\n\t\tif s \u003e twoPow256Sub1 {\n\t\t\treturn ErrBig256Range\n\t\t}\n\t\treturn z.fromDecimal(s)\n\t}\n\treturn ErrBig256Range\n}\n\n// FromDecimal is a convenience-constructor to create an Uint from a\n// decimal (base 10) string. Numbers larger than 256 bits are not accepted.\nfunc FromDecimal(decimal string) (*Uint, error) {\n\tvar z Uint\n\tif err := z.SetFromDecimal(decimal); err != nil {\n\t\treturn nil, err\n\t}\n\treturn \u0026z, nil\n}\n\n// MustFromDecimal is a convenience-constructor to create an Uint from a\n// decimal (base 10) string.\n// Returns a new Uint and panics if any error occurred.\nfunc MustFromDecimal(decimal string) *Uint {\n\tvar z Uint\n\tif err := z.SetFromDecimal(decimal); err != nil {\n\t\tpanic(err)\n\t}\n\treturn \u0026z\n}\n\n// multipliers holds the values that are needed for fromDecimal\nvar multipliers = [5]*Uint{\n\tnil, // represents first round, no multiplication needed\n\t{[4]uint64{10000000000000000000, 0, 0, 0}}, // 10 ^ 19\n\t{[4]uint64{687399551400673280, 5421010862427522170, 0, 0}}, // 10 ^ 38\n\t{[4]uint64{5332261958806667264, 17004971331911604867, 2938735877055718769, 0}}, // 10 ^ 57\n\t{[4]uint64{0, 8607968719199866880, 532749306367912313, 1593091911132452277}}, // 10 ^ 76\n}\n\n// fromDecimal is a helper function to only ever be called via SetFromDecimal\n// this function takes a string and chunks it up, calling ParseUint on it up to 5 times\n// these chunks are then multiplied by the proper power of 10, then added together.\nfunc (z *Uint) fromDecimal(bs string) error {\n\t// first clear the input\n\tz.Clear()\n\t// the maximum value of uint64 is 18446744073709551615, which is 20 characters\n\t// one less means that a string of 19 9's is always within the uint64 limit\n\tvar (\n\t\tnum uint64\n\t\terr error\n\t\tremaining = len(bs)\n\t)\n\tif remaining == 0 {\n\t\treturn errors.New(\"EOF\")\n\t}\n\t// We proceed in steps of 19 characters (nibbles), from least significant to most significant.\n\t// This means that the first (up to) 19 characters do not need to be multiplied.\n\t// In the second iteration, our slice of 19 characters needs to be multipleied\n\t// by a factor of 10^19. Et cetera.\n\tfor i, mult := range multipliers {\n\t\tif remaining \u003c= 0 {\n\t\t\treturn nil // Done\n\t\t} else if remaining \u003e 19 {\n\t\t\tnum, err = parseUint(bs[remaining-19:remaining], 10, 64)\n\t\t} else {\n\t\t\t// Final round\n\t\t\tnum, err = parseUint(bs, 10, 64)\n\t\t}\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\t// add that number to our running total\n\t\tif i == 0 {\n\t\t\tz.SetUint64(num)\n\t\t} else {\n\t\t\tbase := NewUint(num)\n\t\t\tz.Add(z, base.Mul(base, mult))\n\t\t}\n\t\t// Chop off another 19 characters\n\t\tif remaining \u003e 19 {\n\t\t\tbs = bs[0 : remaining-19]\n\t\t}\n\t\tremaining -= 19\n\t}\n\treturn nil\n}\n\n// Byte sets z to the value of the byte at position n,\n// with 'z' considered as a big-endian 32-byte integer\n// if 'n' \u003e 32, f is set to 0\n// Example: f = '5', n=31 =\u003e 5\nfunc (z *Uint) Byte(n *Uint) *Uint {\n\t// in z, z.arr[0] is the least significant\n\tif number, overflow := n.Uint64WithOverflow(); !overflow {\n\t\tif number \u003c 32 {\n\t\t\tnumber := z.arr[4-1-number/8]\n\t\t\toffset := (n.arr[0] \u0026 0x7) \u003c\u003c 3 // 8*(n.d % 8)\n\t\t\tz.arr[0] = (number \u0026 (0xff00000000000000 \u003e\u003e offset)) \u003e\u003e (56 - offset)\n\t\t\tz.arr[3], z.arr[2], z.arr[1] = 0, 0, 0\n\t\t\treturn z\n\t\t}\n\t}\n\n\treturn z.Clear()\n}\n\n// BitLen returns the number of bits required to represent z\nfunc (z *Uint) BitLen() int {\n\tswitch {\n\tcase z.arr[3] != 0:\n\t\treturn 192 + bits.Len64(z.arr[3])\n\tcase z.arr[2] != 0:\n\t\treturn 128 + bits.Len64(z.arr[2])\n\tcase z.arr[1] != 0:\n\t\treturn 64 + bits.Len64(z.arr[1])\n\tdefault:\n\t\treturn bits.Len64(z.arr[0])\n\t}\n}\n\n// ByteLen returns the number of bytes required to represent z\nfunc (z *Uint) ByteLen() int {\n\treturn (z.BitLen() + 7) / 8\n}\n\n// Clear sets z to 0\nfunc (z *Uint) Clear() *Uint {\n\tz.arr[3], z.arr[2], z.arr[1], z.arr[0] = 0, 0, 0, 0\n\treturn z\n}\n\nconst (\n\t// hextable = \"0123456789abcdef\"\n\tbintable = \"\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\x00\\x01\\x02\\x03\\x04\\x05\\x06\\a\\b\\t\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\n\\v\\f\\r\\x0e\\x0f\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\n\\v\\f\\r\\x0e\\x0f\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\\xff\"\n\tbadNibble = 0xff\n)\n\n// SetFromHex sets z from the given string, interpreted as a hexadecimal number.\n// OBS! This method is _not_ strictly identical to the (*big.Int).SetString(..., 16) method.\n// Notable differences:\n// - This method _require_ \"0x\" or \"0X\" prefix.\n// - This method does not accept zero-prefixed hex, e.g. \"0x0001\"\n// - This method does not accept underscore input, e.g. \"100_000\",\n// - This method does not accept negative zero as valid, e.g \"-0x0\",\n// - (this method does not accept any negative input as valid)\nfunc (z *Uint) SetFromHex(hex string) error {\n\treturn z.fromHex(hex)\n}\n\n// fromHex is the internal implementation of parsing a hex-string.\nfunc (z *Uint) fromHex(hex string) error {\n\tif err := checkNumberS(hex); err != nil {\n\t\treturn err\n\t}\n\tif len(hex) \u003e 66 {\n\t\treturn ErrBig256Range\n\t}\n\tz.Clear()\n\tend := len(hex)\n\tfor i := 0; i \u003c 4; i++ {\n\t\tstart := end - 16\n\t\tif start \u003c 2 {\n\t\t\tstart = 2\n\t\t}\n\t\tfor ri := start; ri \u003c end; ri++ {\n\t\t\tnib := bintable[hex[ri]]\n\t\t\tif nib == badNibble {\n\t\t\t\treturn ErrSyntax\n\t\t\t}\n\t\t\tz.arr[i] = z.arr[i] \u003c\u003c 4\n\t\t\tz.arr[i] += uint64(nib)\n\t\t}\n\t\tend = start\n\t}\n\treturn nil\n}\n\n// FromHex is a convenience-constructor to create an Uint from\n// a hexadecimal string. The string is required to be '0x'-prefixed\n// Numbers larger than 256 bits are not accepted.\nfunc FromHex(hex string) (*Uint, error) {\n\tvar z Uint\n\tif err := z.fromHex(hex); err != nil {\n\t\treturn nil, err\n\t}\n\treturn \u0026z, nil\n}\n\n// MustFromHex is a convenience-constructor to create an Uint from\n// a hexadecimal string.\n// Returns a new Uint and panics if any error occurred.\nfunc MustFromHex(hex string) *Uint {\n\tvar z Uint\n\tif err := z.fromHex(hex); err != nil {\n\t\tpanic(err)\n\t}\n\treturn \u0026z\n}\n\n// Clone creates a new Uint identical to z\nfunc (z *Uint) Clone() *Uint {\n\tvar x Uint\n\tx.arr[0] = z.arr[0]\n\tx.arr[1] = z.arr[1]\n\tx.arr[2] = z.arr[2]\n\tx.arr[3] = z.arr[3]\n\n\treturn \u0026x\n}\n"},{"name":"utils.gno","body":"package uint256\n\n// lower(c) is a lower-case letter if and only if\n// c is either that lower-case letter or the equivalent upper-case letter.\n// Instead of writing c == 'x' || c == 'X' one can write lower(c) == 'x'.\n// Note that lower of non-letters can produce other non-letters.\nfunc lower(c byte) byte {\n\treturn c | ('x' - 'X')\n}\n\n// underscoreOK reports whether the underscores in s are allowed.\n// Checking them in this one function lets all the parsers skip over them simply.\n// Underscore must appear only between digits or between a base prefix and a digit.\nfunc underscoreOK(s string) bool {\n\t// saw tracks the last character (class) we saw:\n\t// ^ for beginning of number,\n\t// 0 for a digit or base prefix,\n\t// _ for an underscore,\n\t// ! for none of the above.\n\tsaw := '^'\n\ti := 0\n\n\t// Optional sign.\n\tif len(s) \u003e= 1 \u0026\u0026 (s[0] == '-' || s[0] == '+') {\n\t\ts = s[1:]\n\t}\n\n\t// Optional base prefix.\n\thex := false\n\tif len(s) \u003e= 2 \u0026\u0026 s[0] == '0' \u0026\u0026 (lower(s[1]) == 'b' || lower(s[1]) == 'o' || lower(s[1]) == 'x') {\n\t\ti = 2\n\t\tsaw = '0' // base prefix counts as a digit for \"underscore as digit separator\"\n\t\thex = lower(s[1]) == 'x'\n\t}\n\n\t// Number proper.\n\tfor ; i \u003c len(s); i++ {\n\t\t// Digits are always okay.\n\t\tif '0' \u003c= s[i] \u0026\u0026 s[i] \u003c= '9' || hex \u0026\u0026 'a' \u003c= lower(s[i]) \u0026\u0026 lower(s[i]) \u003c= 'f' {\n\t\t\tsaw = '0'\n\t\t\tcontinue\n\t\t}\n\t\t// Underscore must follow digit.\n\t\tif s[i] == '_' {\n\t\t\tif saw != '0' {\n\t\t\t\treturn false\n\t\t\t}\n\t\t\tsaw = '_'\n\t\t\tcontinue\n\t\t}\n\t\t// Underscore must also be followed by digit.\n\t\tif saw == '_' {\n\t\t\treturn false\n\t\t}\n\t\t// Saw non-digit, non-underscore.\n\t\tsaw = '!'\n\t}\n\treturn saw != '_'\n}\n\nfunc checkNumberS(input string) error {\n\tconst fn = \"UnmarshalText\"\n\tl := len(input)\n\tif l == 0 {\n\t\treturn errEmptyString(fn, input)\n\t}\n\tif l \u003c 2 || input[0] != '0' ||\n\t\t(input[1] != 'x' \u0026\u0026 input[1] != 'X') {\n\t\treturn errMissingPrefix(fn, input)\n\t}\n\tif l == 2 {\n\t\treturn errEmptyNumber(fn, input)\n\t}\n\tif len(input) \u003e 3 \u0026\u0026 input[2] == '0' {\n\t\treturn errLeadingZero(fn, input)\n\t}\n\treturn nil\n}\n\n// ParseUint is like ParseUint but for unsigned numbers.\n//\n// A sign prefix is not permitted.\nfunc parseUint(s string, base int, bitSize int) (uint64, error) {\n\tconst fnParseUint = \"ParseUint\"\n\n\tif s == \"\" {\n\t\treturn 0, errSyntax(fnParseUint, s)\n\t}\n\n\tbase0 := base == 0\n\n\ts0 := s\n\tswitch {\n\tcase 2 \u003c= base \u0026\u0026 base \u003c= 36:\n\t\t// valid base; nothing to do\n\n\tcase base == 0:\n\t\t// Look for octal, hex prefix.\n\t\tbase = 10\n\t\tif s[0] == '0' {\n\t\t\tswitch {\n\t\t\tcase len(s) \u003e= 3 \u0026\u0026 lower(s[1]) == 'b':\n\t\t\t\tbase = 2\n\t\t\t\ts = s[2:]\n\t\t\tcase len(s) \u003e= 3 \u0026\u0026 lower(s[1]) == 'o':\n\t\t\t\tbase = 8\n\t\t\t\ts = s[2:]\n\t\t\tcase len(s) \u003e= 3 \u0026\u0026 lower(s[1]) == 'x':\n\t\t\t\tbase = 16\n\t\t\t\ts = s[2:]\n\t\t\tdefault:\n\t\t\t\tbase = 8\n\t\t\t\ts = s[1:]\n\t\t\t}\n\t\t}\n\n\tdefault:\n\t\treturn 0, errInvalidBase(fnParseUint, base)\n\t}\n\n\tif bitSize == 0 {\n\t\tbitSize = uintSize\n\t} else if bitSize \u003c 0 || bitSize \u003e 64 {\n\t\treturn 0, errInvalidBitSize(fnParseUint, bitSize)\n\t}\n\n\t// Cutoff is the smallest number such that cutoff*base \u003e maxUint64.\n\t// Use compile-time constants for common cases.\n\tvar cutoff uint64\n\tswitch base {\n\tcase 10:\n\t\tcutoff = MaxUint64/10 + 1\n\tcase 16:\n\t\tcutoff = MaxUint64/16 + 1\n\tdefault:\n\t\tcutoff = MaxUint64/uint64(base) + 1\n\t}\n\n\tmaxVal := uint64(1)\u003c\u003cuint(bitSize) - 1\n\n\tunderscores := false\n\tvar n uint64\n\tfor _, c := range []byte(s) {\n\t\tvar d byte\n\t\tswitch {\n\t\tcase c == '_' \u0026\u0026 base0:\n\t\t\tunderscores = true\n\t\t\tcontinue\n\t\tcase '0' \u003c= c \u0026\u0026 c \u003c= '9':\n\t\t\td = c - '0'\n\t\tcase 'a' \u003c= lower(c) \u0026\u0026 lower(c) \u003c= 'z':\n\t\t\td = lower(c) - 'a' + 10\n\t\tdefault:\n\t\t\treturn 0, errSyntax(fnParseUint, s0)\n\t\t}\n\n\t\tif d \u003e= byte(base) {\n\t\t\treturn 0, errSyntax(fnParseUint, s0)\n\t\t}\n\n\t\tif n \u003e= cutoff {\n\t\t\t// n*base overflows\n\t\t\treturn maxVal, errRange(fnParseUint, s0)\n\t\t}\n\t\tn *= uint64(base)\n\n\t\tn1 := n + uint64(d)\n\t\tif n1 \u003c n || n1 \u003e maxVal {\n\t\t\t// n+d overflows\n\t\t\treturn maxVal, errRange(fnParseUint, s0)\n\t\t}\n\t\tn = n1\n\t}\n\n\tif underscores \u0026\u0026 !underscoreOK(s0) {\n\t\treturn 0, errSyntax(fnParseUint, s0)\n\t}\n\n\treturn n, nil\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} @@ -75,15 +75,15 @@ {"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"bar20","path":"gno.land/r/demo/bar20","files":[{"name":"bar20.gno","body":"// Package bar20 is similar to gno.land/r/demo/foo20 but exposes a safe-object\n// that can be used by `maketx run`, another contract importing foo20, and in\n// the future when we'll support `maketx call Token.XXX`.\npackage bar20\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar (\n\tbanker *grc20.Banker // private banker.\n\tToken grc20.Token // public safe-object.\n)\n\nfunc init() {\n\tbanker = grc20.NewBanker(\"Bar\", \"BAR\", 4)\n\tToken = banker.Token()\n}\n\nfunc Faucet() string {\n\tcaller := std.PrevRealm().Addr()\n\tif err := banker.Mint(caller, 1_000_000); err != nil {\n\t\treturn \"error: \" + err.Error()\n\t}\n\treturn \"OK\"\n}\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tc := len(parts)\n\n\tswitch {\n\tcase path == \"\":\n\t\treturn banker.RenderHome() // XXX: should be Token.RenderHome()\n\tcase c == 2 \u0026\u0026 parts[0] == \"balance\":\n\t\towner := std.Address(parts[1])\n\t\tbalance := Token.BalanceOf(owner)\n\t\treturn ufmt.Sprintf(\"%d\\n\", balance)\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}\n"},{"name":"bar20_test.gno","body":"package bar20\n\nimport (\n\t\"std\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/p/demo/urequire\"\n)\n\nfunc TestPackage(t *testing.T) {\n\talice := testutils.TestAddress(\"alice\")\n\tstd.TestSetRealm(std.NewUserRealm(alice))\n\tstd.TestSetOrigCaller(alice) // XXX: should not need this\n\n\turequire.Equal(t, Token.BalanceOf(alice), uint64(0))\n\turequire.Equal(t, Faucet(), \"OK\")\n\turequire.Equal(t, Token.BalanceOf(alice), uint64(1_000_000))\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} {"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"counter","path":"gno.land/r/demo/counter","files":[{"name":"counter.gno","body":"package counter\n\nimport \"strconv\"\n\nvar counter int\n\nfunc Increment() int {\n\tcounter++\n\treturn counter\n}\n\nfunc Render(_ string) string {\n\treturn strconv.Itoa(counter)\n}\n"},{"name":"counter_test.gno","body":"package counter\n\nimport \"testing\"\n\nfunc TestIncrement(t *testing.T) {\n\tcounter = 0\n\tval := Increment()\n\tif val != 1 {\n\t\tt.Fatalf(\"result from Increment(): %d != 1\", val)\n\t}\n\tif counter != val {\n\t\tt.Fatalf(\"counter (%d) != val (%d)\", counter, val)\n\t}\n}\n\nfunc TestRender(t *testing.T) {\n\tcounter = 1337\n\tres := Render(\"\")\n\tif res != \"1337\" {\n\t\tt.Fatalf(\"render result %q != %q\", res, \"1337\")\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} {"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"deep","path":"gno.land/r/demo/deep/very/deep","files":[{"name":"render.gno","body":"package deep\n\nfunc Render(path string) string {\n\tif path == \"\" {\n\t\treturn \"it works!\"\n\t} else {\n\t\treturn \"hi \" + path\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} -{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"foo20","path":"gno.land/r/demo/grc20factory","files":[{"name":"grc20factory.gno","body":"package foo20\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ownable\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar instances avl.Tree // symbol -\u003e instance\n\nfunc New(name, symbol string, decimals uint, initialMint, faucet uint64) {\n\tcaller := std.PrevRealm().Addr()\n\tNewWithAdmin(name, symbol, decimals, initialMint, faucet, caller)\n}\n\nfunc NewWithAdmin(name, symbol string, decimals uint, initialMint, faucet uint64, admin std.Address) {\n\texists := instances.Has(symbol)\n\tif exists {\n\t\tpanic(\"token already exists\")\n\t}\n\n\tbanker := grc20.NewBanker(name, symbol, decimals)\n\tif initialMint \u003e 0 {\n\t\tbanker.Mint(admin, initialMint)\n\t}\n\n\tinst := instance{\n\t\tbanker: banker,\n\t\tadmin: ownable.NewWithAddress(admin),\n\t\tfaucet: faucet,\n\t}\n\n\tinstances.Set(symbol, \u0026inst)\n}\n\ntype instance struct {\n\tbanker *grc20.Banker\n\tadmin *ownable.Ownable\n\tfaucet uint64 // per-request amount. disabled if 0.\n}\n\nfunc (inst instance) Token() grc20.Token { return inst.banker.Token() }\n\nfunc TotalSupply(symbol string) uint64 {\n\tinst := mustGetInstance(symbol)\n\treturn inst.Token().TotalSupply()\n}\n\nfunc BalanceOf(symbol string, owner std.Address) uint64 {\n\tinst := mustGetInstance(symbol)\n\treturn inst.Token().BalanceOf(owner)\n}\n\nfunc Allowance(symbol string, owner, spender std.Address) uint64 {\n\tinst := mustGetInstance(symbol)\n\treturn inst.Token().Allowance(owner, spender)\n}\n\nfunc Transfer(symbol string, to std.Address, amount uint64) {\n\tinst := mustGetInstance(symbol)\n\tcheckErr(inst.Token().Transfer(to, amount))\n}\n\nfunc Approve(symbol string, spender std.Address, amount uint64) {\n\tinst := mustGetInstance(symbol)\n\tcheckErr(inst.Token().Approve(spender, amount))\n}\n\nfunc TransferFrom(symbol string, from, to std.Address, amount uint64) {\n\tinst := mustGetInstance(symbol)\n\tcheckErr(inst.Token().TransferFrom(from, to, amount))\n}\n\n// faucet.\nfunc Faucet(symbol string) {\n\tinst := mustGetInstance(symbol)\n\tif inst.faucet == 0 {\n\t\tpanic(\"faucet disabled for this token\")\n\t}\n\t// FIXME: add limits?\n\t// FIXME: add payment in gnot?\n\tcaller := std.PrevRealm().Addr()\n\tcheckErr(inst.banker.Mint(caller, inst.faucet))\n}\n\nfunc Mint(symbol string, to std.Address, amount uint64) {\n\tinst := mustGetInstance(symbol)\n\tinst.admin.AssertCallerIsOwner()\n\tcheckErr(inst.banker.Mint(to, amount))\n}\n\nfunc Burn(symbol string, from std.Address, amount uint64) {\n\tinst := mustGetInstance(symbol)\n\tinst.admin.AssertCallerIsOwner()\n\tcheckErr(inst.banker.Burn(from, amount))\n}\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tc := len(parts)\n\n\tswitch {\n\tcase path == \"\":\n\t\treturn \"TODO: list existing tokens and admins\"\n\tcase c == 1:\n\t\tsymbol := parts[0]\n\t\tinst := mustGetInstance(symbol)\n\t\treturn inst.banker.RenderHome()\n\tcase c == 3 \u0026\u0026 parts[1] == \"balance\":\n\t\tsymbol := parts[0]\n\t\tinst := mustGetInstance(symbol)\n\t\towner := std.Address(parts[2])\n\t\tbalance := inst.Token().BalanceOf(owner)\n\t\treturn ufmt.Sprintf(\"%d\", balance)\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}\n\nfunc mustGetInstance(symbol string) *instance {\n\tt, exists := instances.Get(symbol)\n\tif !exists {\n\t\tpanic(\"token instance does not exist\")\n\t}\n\treturn t.(*instance)\n}\n\nfunc checkErr(err error) {\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"},{"name":"grc20factory_test.gno","body":"package foo20\n\nimport (\n\t\"std\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/uassert\"\n)\n\nfunc TestReadOnlyPublicMethods(t *testing.T) {\n\tadmin := std.Address(\"g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj\")\n\tmanfred := std.Address(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\")\n\tunknown := std.Address(\"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\") // valid but never used.\n\tNewWithAdmin(\"Foo\", \"FOO\", 4, 10_000*1_000_000, 0, admin)\n\tNewWithAdmin(\"Bar\", \"BAR\", 4, 10_000*1_000, 0, admin)\n\tmustGetInstance(\"FOO\").banker.Mint(manfred, 100_000_000)\n\n\ttype test struct {\n\t\tname string\n\t\tbalance uint64\n\t\tfn func() uint64\n\t}\n\n\t// check balances #1.\n\t{\n\t\ttests := []test{\n\t\t\t{\"TotalSupply\", 10_100_000_000, func() uint64 { return TotalSupply(\"FOO\") }},\n\t\t\t{\"BalanceOf(admin)\", 10_000_000_000, func() uint64 { return BalanceOf(\"FOO\", admin) }},\n\t\t\t{\"BalanceOf(manfred)\", 100_000_000, func() uint64 { return BalanceOf(\"FOO\", manfred) }},\n\t\t\t{\"Allowance(admin, manfred)\", 0, func() uint64 { return Allowance(\"FOO\", admin, manfred) }},\n\t\t\t{\"BalanceOf(unknown)\", 0, func() uint64 { return BalanceOf(\"FOO\", unknown) }},\n\t\t}\n\t\tfor _, tc := range tests {\n\t\t\tuassert.Equal(t, tc.balance, tc.fn(), \"balance does not match\")\n\t\t}\n\t}\n\treturn\n\n\t// unknown uses the faucet.\n\tstd.TestSetOrigCaller(unknown)\n\tFaucet(\"FOO\")\n\n\t// check balances #2.\n\t{\n\t\ttests := []test{\n\t\t\t{\"TotalSupply\", 10_110_000_000, func() uint64 { return TotalSupply(\"FOO\") }},\n\t\t\t{\"BalanceOf(admin)\", 10_000_000_000, func() uint64 { return BalanceOf(\"FOO\", admin) }},\n\t\t\t{\"BalanceOf(manfred)\", 100_000_000, func() uint64 { return BalanceOf(\"FOO\", manfred) }},\n\t\t\t{\"Allowance(admin, manfred)\", 0, func() uint64 { return Allowance(\"FOO\", admin, manfred) }},\n\t\t\t{\"BalanceOf(unknown)\", 10_000_000, func() uint64 { return BalanceOf(\"FOO\", unknown) }},\n\t\t}\n\t\tfor _, tc := range tests {\n\t\t\tuassert.Equal(t, tc.balance, tc.fn(), \"balance does not match\")\n\t\t}\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"foo20","path":"gno.land/r/demo/grc20factory","files":[{"name":"grc20factory.gno","body":"package foo20\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ownable\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar instances avl.Tree // symbol -\u003e instance\n\nfunc New(name, symbol string, decimals uint, initialMint, faucet uint64) {\n\tcaller := std.PrevRealm().Addr()\n\tNewWithAdmin(name, symbol, decimals, initialMint, faucet, caller)\n}\n\nfunc NewWithAdmin(name, symbol string, decimals uint, initialMint, faucet uint64, admin std.Address) {\n\texists := instances.Has(symbol)\n\tif exists {\n\t\tpanic(\"token already exists\")\n\t}\n\n\tbanker := grc20.NewBanker(name, symbol, decimals)\n\tif initialMint \u003e 0 {\n\t\tbanker.Mint(admin, initialMint)\n\t}\n\n\tinst := instance{\n\t\tbanker: banker,\n\t\tadmin: ownable.NewWithAddress(admin),\n\t\tfaucet: faucet,\n\t}\n\n\tinstances.Set(symbol, \u0026inst)\n}\n\ntype instance struct {\n\tbanker *grc20.Banker\n\tadmin *ownable.Ownable\n\tfaucet uint64 // per-request amount. disabled if 0.\n}\n\nfunc (inst instance) Token() grc20.Token { return inst.banker.Token() }\n\nfunc TotalSupply(symbol string) uint64 {\n\tinst := mustGetInstance(symbol)\n\treturn inst.Token().TotalSupply()\n}\n\nfunc BalanceOf(symbol string, owner std.Address) uint64 {\n\tinst := mustGetInstance(symbol)\n\treturn inst.Token().BalanceOf(owner)\n}\n\nfunc Allowance(symbol string, owner, spender std.Address) uint64 {\n\tinst := mustGetInstance(symbol)\n\treturn inst.Token().Allowance(owner, spender)\n}\n\nfunc Transfer(symbol string, to std.Address, amount uint64) {\n\tinst := mustGetInstance(symbol)\n\tcheckErr(inst.Token().Transfer(to, amount))\n}\n\nfunc Approve(symbol string, spender std.Address, amount uint64) {\n\tinst := mustGetInstance(symbol)\n\tcheckErr(inst.Token().Approve(spender, amount))\n}\n\nfunc TransferFrom(symbol string, from, to std.Address, amount uint64) {\n\tinst := mustGetInstance(symbol)\n\tcheckErr(inst.Token().TransferFrom(from, to, amount))\n}\n\n// faucet.\nfunc Faucet(symbol string) {\n\tinst := mustGetInstance(symbol)\n\tif inst.faucet == 0 {\n\t\tpanic(\"faucet disabled for this token\")\n\t}\n\t// FIXME: add limits?\n\t// FIXME: add payment in gnot?\n\tcaller := std.PrevRealm().Addr()\n\tcheckErr(inst.banker.Mint(caller, inst.faucet))\n}\n\nfunc Mint(symbol string, to std.Address, amount uint64) {\n\tinst := mustGetInstance(symbol)\n\tinst.admin.AssertCallerIsOwner()\n\tcheckErr(inst.banker.Mint(to, amount))\n}\n\nfunc Burn(symbol string, from std.Address, amount uint64) {\n\tinst := mustGetInstance(symbol)\n\tinst.admin.AssertCallerIsOwner()\n\tcheckErr(inst.banker.Burn(from, amount))\n}\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tc := len(parts)\n\n\tswitch {\n\tcase path == \"\":\n\t\treturn \"TODO: list existing tokens and admins\"\n\tcase c == 1:\n\t\tsymbol := parts[0]\n\t\tinst := mustGetInstance(symbol)\n\t\treturn inst.banker.RenderHome()\n\tcase c == 3 \u0026\u0026 parts[1] == \"balance\":\n\t\tsymbol := parts[0]\n\t\tinst := mustGetInstance(symbol)\n\t\towner := std.Address(parts[2])\n\t\tbalance := inst.Token().BalanceOf(owner)\n\t\treturn ufmt.Sprintf(\"%d\", balance)\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}\n\nfunc mustGetInstance(symbol string) *instance {\n\tt, exists := instances.Get(symbol)\n\tif !exists {\n\t\tpanic(\"token instance does not exist\")\n\t}\n\treturn t.(*instance)\n}\n\nfunc checkErr(err error) {\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"},{"name":"grc20factory_test.gno","body":"package foo20\n\nimport (\n\t\"std\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/uassert\"\n)\n\nfunc TestReadOnlyPublicMethods(t *testing.T) {\n\tadmin := std.Address(\"g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj\")\n\tmanfred := std.Address(\"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq\")\n\tunknown := std.Address(\"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\") // valid but never used.\n\tNewWithAdmin(\"Foo\", \"FOO\", 4, 10_000*1_000_000, 0, admin)\n\tNewWithAdmin(\"Bar\", \"BAR\", 4, 10_000*1_000, 0, admin)\n\tmustGetInstance(\"FOO\").banker.Mint(manfred, 100_000_000)\n\n\ttype test struct {\n\t\tname string\n\t\tbalance uint64\n\t\tfn func() uint64\n\t}\n\n\t// check balances #1.\n\t{\n\t\ttests := []test{\n\t\t\t{\"TotalSupply\", 10_100_000_000, func() uint64 { return TotalSupply(\"FOO\") }},\n\t\t\t{\"BalanceOf(admin)\", 10_000_000_000, func() uint64 { return BalanceOf(\"FOO\", admin) }},\n\t\t\t{\"BalanceOf(manfred)\", 100_000_000, func() uint64 { return BalanceOf(\"FOO\", manfred) }},\n\t\t\t{\"Allowance(admin, manfred)\", 0, func() uint64 { return Allowance(\"FOO\", admin, manfred) }},\n\t\t\t{\"BalanceOf(unknown)\", 0, func() uint64 { return BalanceOf(\"FOO\", unknown) }},\n\t\t}\n\t\tfor _, tc := range tests {\n\t\t\tuassert.Equal(t, tc.balance, tc.fn(), \"balance does not match\")\n\t\t}\n\t}\n\treturn\n\n\t// unknown uses the faucet.\n\tstd.TestSetOrigCaller(unknown)\n\tFaucet(\"FOO\")\n\n\t// check balances #2.\n\t{\n\t\ttests := []test{\n\t\t\t{\"TotalSupply\", 10_110_000_000, func() uint64 { return TotalSupply(\"FOO\") }},\n\t\t\t{\"BalanceOf(admin)\", 10_000_000_000, func() uint64 { return BalanceOf(\"FOO\", admin) }},\n\t\t\t{\"BalanceOf(manfred)\", 100_000_000, func() uint64 { return BalanceOf(\"FOO\", manfred) }},\n\t\t\t{\"Allowance(admin, manfred)\", 0, func() uint64 { return Allowance(\"FOO\", admin, manfred) }},\n\t\t\t{\"BalanceOf(unknown)\", 10_000_000, func() uint64 { return BalanceOf(\"FOO\", unknown) }},\n\t\t}\n\t\tfor _, tc := range tests {\n\t\t\tuassert.Equal(t, tc.balance, tc.fn(), \"balance does not match\")\n\t\t}\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} {"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"disperse","path":"gno.land/r/demo/disperse","files":[{"name":"disperse.gno","body":"package disperse\n\nimport (\n\t\"std\"\n\n\ttokens \"gno.land/r/demo/grc20factory\"\n)\n\n// Get address of Disperse realm\nvar realmAddr = std.CurrentRealm().Addr()\n\n// DisperseUgnot parses receivers and amounts and sends out ugnot\n// The function will send out the coins to the addresses and return the leftover coins to the caller\n// if there are any to return\nfunc DisperseUgnot(addresses []std.Address, coins std.Coins) {\n\tcoinSent := std.GetOrigSend()\n\tcaller := std.PrevRealm().Addr()\n\tbanker := std.GetBanker(std.BankerTypeOrigSend)\n\n\tif len(addresses) != len(coins) {\n\t\tpanic(ErrNumAddrValMismatch)\n\t}\n\n\tfor _, coin := range coins {\n\t\tif coin.Amount \u003c= 0 {\n\t\t\tpanic(ErrNegativeCoinAmount)\n\t\t}\n\n\t\tif banker.GetCoins(realmAddr).AmountOf(coin.Denom) \u003c coin.Amount {\n\t\t\tpanic(ErrMismatchBetweenSentAndParams)\n\t\t}\n\t}\n\n\t// Send coins\n\tfor i, _ := range addresses {\n\t\tbanker.SendCoins(realmAddr, addresses[i], std.NewCoins(coins[i]))\n\t}\n\n\t// Return possible leftover coins\n\tfor _, coin := range coinSent {\n\t\tleftoverAmt := banker.GetCoins(realmAddr).AmountOf(coin.Denom)\n\t\tif leftoverAmt \u003e 0 {\n\t\t\tsend := std.Coins{std.NewCoin(coin.Denom, leftoverAmt)}\n\t\t\tbanker.SendCoins(realmAddr, caller, send)\n\t\t}\n\t}\n}\n\n// DisperseGRC20 disperses tokens to multiple addresses\n// Note that it is necessary to approve the realm to spend the tokens before calling this function\n// see the corresponding filetests for examples\nfunc DisperseGRC20(addresses []std.Address, amounts []uint64, symbols []string) {\n\tcaller := std.PrevRealm().Addr()\n\n\tif (len(addresses) != len(amounts)) || (len(amounts) != len(symbols)) {\n\t\tpanic(ErrArgLenAndSentLenMismatch)\n\t}\n\n\tfor i := 0; i \u003c len(addresses); i++ {\n\t\ttokens.TransferFrom(symbols[i], caller, addresses[i], amounts[i])\n\t}\n}\n\n// DisperseGRC20String receives a string of addresses and a string of tokens\n// and parses them to be used in DisperseGRC20\nfunc DisperseGRC20String(addresses string, tokens string) {\n\tparsedAddresses, err := parseAddresses(addresses)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tparsedAmounts, parsedSymbols, err := parseTokens(tokens)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tDisperseGRC20(parsedAddresses, parsedAmounts, parsedSymbols)\n}\n\n// DisperseUgnotString receives a string of addresses and a string of amounts\n// and parses them to be used in DisperseUgnot\nfunc DisperseUgnotString(addresses string, amounts string) {\n\tparsedAddresses, err := parseAddresses(addresses)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tparsedAmounts, err := parseAmounts(amounts)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tcoins := make(std.Coins, len(parsedAmounts))\n\tfor i, amount := range parsedAmounts {\n\t\tcoins[i] = std.NewCoin(\"ugnot\", amount)\n\t}\n\n\tDisperseUgnot(parsedAddresses, coins)\n}\n"},{"name":"doc.gno","body":"// Package disperse provides methods to disperse coins or GRC20 tokens among multiple addresses.\n//\n// The disperse package is an implementation of an existing service that allows users to send coins or GRC20 tokens to multiple addresses\n// on the Ethereum blockchain.\n//\n// Usage:\n// To use disperse, you can either use `DisperseUgnot` to send coins or `DisperseGRC20` to send GRC20 tokens to multiple addresses.\n//\n// Example:\n// Dispersing 200 coins to two addresses:\n// - DisperseUgnotString(\"g1dmt3sa5ucvecxuhf3j6ne5r0e3z4x7h6c03xc0,g1akeqsvhucjt8gf5yupyzjxsjd29wv8fayng37c\", \"150,50\")\n// Dispersing 200 worth of a GRC20 token \"TEST\" to two addresses:\n// - DisperseGRC20String(\"g1dmt3sa5ucvecxuhf3j6ne5r0e3z4x7h6c03xc0,g1akeqsvhucjt8gf5yupyzjxsjd29wv8fayng37c\", \"150TEST,50TEST\")\n//\n// Reference:\n// - [the original dispere app](https://disperse.app/)\n// - [the original disperse app on etherscan](https://etherscan.io/address/0xd152f549545093347a162dce210e7293f1452150#code)\n// - [the gno disperse web app](https://gno-disperse.netlify.app/)\npackage disperse // import \"gno.land/r/demo/disperse\"\n"},{"name":"errors.gno","body":"package disperse\n\nimport \"errors\"\n\nvar (\n\tErrNotEnoughCoin = errors.New(\"disperse: not enough coin sent in\")\n\tErrNumAddrValMismatch = errors.New(\"disperse: number of addresses and values to send doesn't match\")\n\tErrInvalidAddress = errors.New(\"disperse: invalid address\")\n\tErrNegativeCoinAmount = errors.New(\"disperse: coin amount cannot be negative\")\n\tErrMismatchBetweenSentAndParams = errors.New(\"disperse: mismatch between coins sent and params called\")\n\tErrArgLenAndSentLenMismatch = errors.New(\"disperse: mismatch between coins sent and args called\")\n)\n"},{"name":"util.gno","body":"package disperse\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\t\"strings\"\n\t\"unicode\"\n)\n\nfunc parseAddresses(addresses string) ([]std.Address, error) {\n\tvar ret []std.Address\n\n\tfor _, str := range strings.Split(addresses, \",\") {\n\t\taddr := std.Address(str)\n\t\tif !addr.IsValid() {\n\t\t\treturn nil, ErrInvalidAddress\n\t\t}\n\n\t\tret = append(ret, addr)\n\t}\n\n\treturn ret, nil\n}\n\nfunc splitString(input string) (string, string) {\n\tvar pos int\n\tfor i, char := range input {\n\t\tif !unicode.IsDigit(char) {\n\t\t\tpos = i\n\t\t\tbreak\n\t\t}\n\t}\n\treturn input[:pos], input[pos:]\n}\n\nfunc parseTokens(tokens string) ([]uint64, []string, error) {\n\tvar amounts []uint64\n\tvar symbols []string\n\n\tfor _, token := range strings.Split(tokens, \",\") {\n\t\tamountStr, symbol := splitString(token)\n\t\tamount, _ := strconv.Atoi(amountStr)\n\t\tif amount \u003c 0 {\n\t\t\treturn nil, nil, ErrNegativeCoinAmount\n\t\t}\n\n\t\tamounts = append(amounts, uint64(amount))\n\t\tsymbols = append(symbols, symbol)\n\t}\n\n\treturn amounts, symbols, nil\n}\n\nfunc parseAmounts(amounts string) ([]int64, error) {\n\tvar ret []int64\n\n\tfor _, amt := range strings.Split(amounts, \",\") {\n\t\tamount, _ := strconv.Atoi(amt)\n\t\tif amount \u003c 0 {\n\t\t\treturn nil, ErrNegativeCoinAmount\n\t\t}\n\n\t\tret = append(ret, int64(amount))\n\t}\n\n\treturn ret, nil\n}\n"},{"name":"z_0_filetest.gno","body":"// SEND: 200ugnot\n\npackage main\n\nimport (\n\t\"std\"\n\n\t\"gno.land/r/demo/disperse\"\n)\n\nfunc main() {\n\tdisperseAddr := std.DerivePkgAddr(\"gno.land/r/demo/disperse\")\n\tmainaddr := std.DerivePkgAddr(\"main\")\n\n\tstd.TestSetOrigPkgAddr(disperseAddr)\n\tstd.TestSetOrigCaller(mainaddr)\n\n\tbanker := std.GetBanker(std.BankerTypeRealmSend)\n\n\tmainbal := banker.GetCoins(mainaddr)\n\tprintln(\"main before:\", mainbal)\n\n\tbanker.SendCoins(mainaddr, disperseAddr, std.Coins{{\"ugnot\", 200}})\n\tdisperse.DisperseUgnotString(\"g1dmt3sa5ucvecxuhf3j6ne5r0e3z4x7h6c03xc0,g1akeqsvhucjt8gf5yupyzjxsjd29wv8fayng37c\", \"150,50\")\n\n\tmainbal = banker.GetCoins(mainaddr)\n\tprintln(\"main after:\", mainbal)\n}\n\n// Output:\n// main before: 200000200ugnot\n// main after: 200000000ugnot\n"},{"name":"z_1_filetest.gno","body":"// SEND: 300ugnot\n\npackage main\n\nimport (\n\t\"std\"\n\n\t\"gno.land/r/demo/disperse\"\n)\n\nfunc main() {\n\tdisperseAddr := std.DerivePkgAddr(\"gno.land/r/demo/disperse\")\n\tmainaddr := std.DerivePkgAddr(\"main\")\n\n\tstd.TestSetOrigPkgAddr(disperseAddr)\n\tstd.TestSetOrigCaller(mainaddr)\n\n\tbanker := std.GetBanker(std.BankerTypeRealmSend)\n\n\tmainbal := banker.GetCoins(mainaddr)\n\tprintln(\"main before:\", mainbal)\n\n\tbanker.SendCoins(mainaddr, disperseAddr, std.Coins{{\"ugnot\", 300}})\n\tdisperse.DisperseUgnotString(\"g1dmt3sa5ucvecxuhf3j6ne5r0e3z4x7h6c03xc0,g1akeqsvhucjt8gf5yupyzjxsjd29wv8fayng37c\", \"150,50\")\n\n\tmainbal = banker.GetCoins(mainaddr)\n\tprintln(\"main after:\", mainbal)\n}\n\n// Output:\n// main before: 200000300ugnot\n// main after: 200000100ugnot\n"},{"name":"z_2_filetest.gno","body":"// SEND: 300ugnot\n\npackage main\n\nimport (\n\t\"std\"\n\n\t\"gno.land/r/demo/disperse\"\n)\n\nfunc main() {\n\tdisperseAddr := std.DerivePkgAddr(\"gno.land/r/demo/disperse\")\n\tmainaddr := std.DerivePkgAddr(\"main\")\n\n\tstd.TestSetOrigPkgAddr(disperseAddr)\n\tstd.TestSetOrigCaller(mainaddr)\n\n\tbanker := std.GetBanker(std.BankerTypeRealmSend)\n\n\tbanker.SendCoins(mainaddr, disperseAddr, std.Coins{{\"ugnot\", 100}})\n\tdisperse.DisperseUgnotString(\"g1dmt3sa5ucvecxuhf3j6ne5r0e3z4x7h6c03xc0,g1akeqsvhucjt8gf5yupyzjxsjd29wv8fayng37c\", \"150,50\")\n}\n\n// Error:\n// disperse: mismatch between coins sent and params called\n"},{"name":"z_3_filetest.gno","body":"// SEND: 300ugnot\n\npackage main\n\nimport (\n\t\"std\"\n\n\t\"gno.land/r/demo/disperse\"\n\ttokens \"gno.land/r/demo/grc20factory\"\n)\n\nfunc main() {\n\tdisperseAddr := std.DerivePkgAddr(\"gno.land/r/demo/disperse\")\n\tmainaddr := std.DerivePkgAddr(\"main\")\n\tbeneficiary1 := std.Address(\"g1dmt3sa5ucvecxuhf3j6ne5r0e3z4x7h6c03xc0\")\n\tbeneficiary2 := std.Address(\"g1akeqsvhucjt8gf5yupyzjxsjd29wv8fayng37c\")\n\n\tstd.TestSetOrigPkgAddr(disperseAddr)\n\tstd.TestSetOrigCaller(mainaddr)\n\n\tbanker := std.GetBanker(std.BankerTypeRealmSend)\n\n\ttokens.New(\"test\", \"TEST\", 4, 0, 0)\n\ttokens.Mint(\"TEST\", mainaddr, 200)\n\n\tmainbal := tokens.BalanceOf(\"TEST\", mainaddr)\n\tprintln(\"main before:\", mainbal)\n\n\ttokens.Approve(\"TEST\", disperseAddr, 200)\n\n\tdisperse.DisperseGRC20String(\"g1dmt3sa5ucvecxuhf3j6ne5r0e3z4x7h6c03xc0,g1akeqsvhucjt8gf5yupyzjxsjd29wv8fayng37c\", \"150TEST,50TEST\")\n\n\tmainbal = tokens.BalanceOf(\"TEST\", mainaddr)\n\tprintln(\"main after:\", mainbal)\n\tben1bal := tokens.BalanceOf(\"TEST\", beneficiary1)\n\tprintln(\"beneficiary1:\", ben1bal)\n\tben2bal := tokens.BalanceOf(\"TEST\", beneficiary2)\n\tprintln(\"beneficiary2:\", ben2bal)\n}\n\n// Output:\n// main before: 200\n// main after: 0\n// beneficiary1: 150\n// beneficiary2: 50\n"},{"name":"z_4_filetest.gno","body":"// SEND: 300ugnot\n\npackage main\n\nimport (\n\t\"std\"\n\n\t\"gno.land/r/demo/disperse\"\n\ttokens \"gno.land/r/demo/grc20factory\"\n)\n\nfunc main() {\n\tdisperseAddr := std.DerivePkgAddr(\"gno.land/r/demo/disperse\")\n\tmainaddr := std.DerivePkgAddr(\"main\")\n\tbeneficiary1 := std.Address(\"g1dmt3sa5ucvecxuhf3j6ne5r0e3z4x7h6c03xc0\")\n\tbeneficiary2 := std.Address(\"g1akeqsvhucjt8gf5yupyzjxsjd29wv8fayng37c\")\n\n\tstd.TestSetOrigPkgAddr(disperseAddr)\n\tstd.TestSetOrigCaller(mainaddr)\n\n\tbanker := std.GetBanker(std.BankerTypeRealmSend)\n\n\ttokens.New(\"test1\", \"TEST1\", 4, 0, 0)\n\ttokens.Mint(\"TEST1\", mainaddr, 200)\n\ttokens.New(\"test2\", \"TEST2\", 4, 0, 0)\n\ttokens.Mint(\"TEST2\", mainaddr, 200)\n\n\tmainbal := tokens.BalanceOf(\"TEST1\", mainaddr) + tokens.BalanceOf(\"TEST2\", mainaddr)\n\tprintln(\"main before:\", mainbal)\n\n\ttokens.Approve(\"TEST1\", disperseAddr, 200)\n\ttokens.Approve(\"TEST2\", disperseAddr, 200)\n\n\tdisperse.DisperseGRC20String(\"g1dmt3sa5ucvecxuhf3j6ne5r0e3z4x7h6c03xc0,g1akeqsvhucjt8gf5yupyzjxsjd29wv8fayng37c\", \"200TEST1,200TEST2\")\n\n\tmainbal = tokens.BalanceOf(\"TEST1\", mainaddr) + tokens.BalanceOf(\"TEST2\", mainaddr)\n\tprintln(\"main after:\", mainbal)\n\tben1bal := tokens.BalanceOf(\"TEST1\", beneficiary1) + tokens.BalanceOf(\"TEST2\", beneficiary1)\n\tprintln(\"beneficiary1:\", ben1bal)\n\tben2bal := tokens.BalanceOf(\"TEST1\", beneficiary2) + tokens.BalanceOf(\"TEST2\", beneficiary2)\n\tprintln(\"beneficiary2:\", ben2bal)\n}\n\n// Output:\n// main before: 400\n// main after: 0\n// beneficiary1: 200\n// beneficiary2: 200\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} {"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"echo","path":"gno.land/r/demo/echo","files":[{"name":"echo.gno","body":"package echo\n\n/*\n * This realm echoes the `path` argument it received.\n * Can be used by developers as a simple endpoint to test\n * forbidden characters, for pentesting or simply to\n * test it works.\n *\n * See also r/demo/print (to print various thing like user address)\n */\nfunc Render(path string) string {\n\treturn path\n}\n"},{"name":"echo_test.gno","body":"package echo\n\nimport (\n\t\"testing\"\n\n\t\"gno.land/p/demo/urequire\"\n)\n\nfunc Test(t *testing.T) {\n\turequire.Equal(t, \"aa\", Render(\"aa\"))\n\turequire.Equal(t, \"\", Render(\"\"))\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} {"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"event","path":"gno.land/r/demo/event","files":[{"name":"event.gno","body":"package event\n\nimport (\n\t\"std\"\n)\n\nfunc Emit(value string) {\n\tstd.Emit(\"TAG\", \"key\", value)\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} {"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"foo1155","path":"gno.land/r/demo/foo1155","files":[{"name":"foo1155.gno","body":"package foo1155\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/grc/grc1155\"\n\t\"gno.land/p/demo/ufmt\"\n\t\"gno.land/r/demo/users\"\n\n\tpusers \"gno.land/p/demo/users\"\n)\n\nvar (\n\tdummyURI = \"ipfs://xyz\"\n\tadmin std.Address = \"g10x5phu0k6p64cwrhfpsc8tk43st9kug6wft530\"\n\tfoo = grc1155.NewBasicGRC1155Token(dummyURI)\n)\n\nfunc init() {\n\tmintGRC1155Token(admin) // @administrator (10)\n}\n\nfunc mintGRC1155Token(owner std.Address) {\n\tfor i := 1; i \u003c= 10; i++ {\n\t\ttid := grc1155.TokenID(ufmt.Sprintf(\"%d\", i))\n\t\tfoo.SafeMint(owner, tid, 100)\n\t}\n}\n\n// Getters\n\nfunc BalanceOf(user pusers.AddressOrName, tid grc1155.TokenID) uint64 {\n\tbalance, err := foo.BalanceOf(users.Resolve(user), tid)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\treturn balance\n}\n\nfunc BalanceOfBatch(ul []pusers.AddressOrName, batch []grc1155.TokenID) []uint64 {\n\tvar usersResolved []std.Address\n\n\tfor i := 0; i \u003c len(ul); i++ {\n\t\tusersResolved[i] = users.Resolve(ul[i])\n\t}\n\tbalanceBatch, err := foo.BalanceOfBatch(usersResolved, batch)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\treturn balanceBatch\n}\n\nfunc IsApprovedForAll(owner, user pusers.AddressOrName) bool {\n\treturn foo.IsApprovedForAll(users.Resolve(owner), users.Resolve(user))\n}\n\n// Setters\n\nfunc SetApprovalForAll(user pusers.AddressOrName, approved bool) {\n\terr := foo.SetApprovalForAll(users.Resolve(user), approved)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc TransferFrom(from, to pusers.AddressOrName, tid grc1155.TokenID, amount uint64) {\n\terr := foo.SafeTransferFrom(users.Resolve(from), users.Resolve(to), tid, amount)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc BatchTransferFrom(from, to pusers.AddressOrName, batch []grc1155.TokenID, amounts []uint64) {\n\terr := foo.SafeBatchTransferFrom(users.Resolve(from), users.Resolve(to), batch, amounts)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// Admin\n\nfunc Mint(to pusers.AddressOrName, tid grc1155.TokenID, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tassertIsAdmin(caller)\n\terr := foo.SafeMint(users.Resolve(to), tid, amount)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc MintBatch(to pusers.AddressOrName, batch []grc1155.TokenID, amounts []uint64) {\n\tcaller := std.GetOrigCaller()\n\tassertIsAdmin(caller)\n\terr := foo.SafeBatchMint(users.Resolve(to), batch, amounts)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc Burn(from pusers.AddressOrName, tid grc1155.TokenID, amount uint64) {\n\tcaller := std.GetOrigCaller()\n\tassertIsAdmin(caller)\n\terr := foo.Burn(users.Resolve(from), tid, amount)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc BurnBatch(from pusers.AddressOrName, batch []grc1155.TokenID, amounts []uint64) {\n\tcaller := std.GetOrigCaller()\n\tassertIsAdmin(caller)\n\terr := foo.BatchBurn(users.Resolve(from), batch, amounts)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// Render\n\nfunc Render(path string) string {\n\tswitch {\n\tcase path == \"\":\n\t\treturn foo.RenderHome()\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}\n\n// Util\n\nfunc assertIsAdmin(address std.Address) {\n\tif address != admin {\n\t\tpanic(\"restricted access\")\n\t}\n}\n"},{"name":"foo1155_test.gno","body":"package foo1155\n\nimport (\n\t\"testing\"\n\n\t\"gno.land/p/demo/grc/grc1155\"\n\t\"gno.land/p/demo/users\"\n)\n\nfunc TestFoo721(t *testing.T) {\n\tadmin := users.AddressOrName(\"g10x5phu0k6p64cwrhfpsc8tk43st9kug6wft530\")\n\tbob := users.AddressOrName(\"g1ze6et22ces5atv79y4xh38s4kuraey4y2fr6tw\")\n\ttid1 := grc1155.TokenID(\"1\")\n\ttid2 := grc1155.TokenID(\"2\")\n\n\tfor i, tc := range []struct {\n\t\tname string\n\t\texpected interface{}\n\t\tfn func() interface{}\n\t}{\n\t\t{\"BalanceOf(admin, tid1)\", uint64(100), func() interface{} { return BalanceOf(admin, tid1) }},\n\t\t{\"BalanceOf(bob, tid1)\", uint64(0), func() interface{} { return BalanceOf(bob, tid1) }},\n\t\t{\"IsApprovedForAll(admin, bob)\", false, func() interface{} { return IsApprovedForAll(admin, bob) }},\n\t} {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tgot := tc.fn()\n\t\t\tif tc.expected != got {\n\t\t\t\tt.Errorf(\"expected: %v got: %v\", tc.expected, got)\n\t\t\t}\n\t\t})\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} -{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"foo20","path":"gno.land/r/demo/foo20","files":[{"name":"foo20.gno","body":"// foo20 is a GRC20 token contract where all the GRC20 methods are proxified\n// with top-level functions. see also gno.land/r/demo/bar20.\npackage foo20\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ownable\"\n\t\"gno.land/p/demo/ufmt\"\n\tpusers \"gno.land/p/demo/users\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tbanker *grc20.Banker\n\tadmin *ownable.Ownable\n\ttoken grc20.Token\n)\n\nfunc init() {\n\tadmin = ownable.NewWithAddress(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\") // @moul\n\tbanker = grc20.NewBanker(\"Foo\", \"FOO\", 4)\n\tbanker.Mint(admin.Owner(), 1000000*10000) // @administrator (1M)\n\ttoken = banker.Token()\n}\n\nfunc TotalSupply() uint64 { return token.TotalSupply() }\n\nfunc BalanceOf(owner pusers.AddressOrName) uint64 {\n\townerAddr := users.Resolve(owner)\n\treturn token.BalanceOf(ownerAddr)\n}\n\nfunc Allowance(owner, spender pusers.AddressOrName) uint64 {\n\townerAddr := users.Resolve(owner)\n\tspenderAddr := users.Resolve(spender)\n\treturn token.Allowance(ownerAddr, spenderAddr)\n}\n\nfunc Transfer(to pusers.AddressOrName, amount uint64) {\n\ttoAddr := users.Resolve(to)\n\tcheckErr(token.Transfer(toAddr, amount))\n}\n\nfunc Approve(spender pusers.AddressOrName, amount uint64) {\n\tspenderAddr := users.Resolve(spender)\n\tcheckErr(token.Approve(spenderAddr, amount))\n}\n\nfunc TransferFrom(from, to pusers.AddressOrName, amount uint64) {\n\tfromAddr := users.Resolve(from)\n\ttoAddr := users.Resolve(to)\n\tcheckErr(token.TransferFrom(fromAddr, toAddr, amount))\n}\n\n// Faucet is distributing foo20 tokens without restriction (unsafe).\n// For a real token faucet, you should take care of setting limits are asking payment.\nfunc Faucet() {\n\tcaller := std.PrevRealm().Addr()\n\tamount := uint64(1_000 * 10_000) // 1k\n\tcheckErr(banker.Mint(caller, amount))\n}\n\nfunc Mint(to pusers.AddressOrName, amount uint64) {\n\tadmin.AssertCallerIsOwner()\n\ttoAddr := users.Resolve(to)\n\tcheckErr(banker.Mint(toAddr, amount))\n}\n\nfunc Burn(from pusers.AddressOrName, amount uint64) {\n\tadmin.AssertCallerIsOwner()\n\tfromAddr := users.Resolve(from)\n\tcheckErr(banker.Burn(fromAddr, amount))\n}\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tc := len(parts)\n\n\tswitch {\n\tcase path == \"\":\n\t\treturn banker.RenderHome()\n\tcase c == 2 \u0026\u0026 parts[0] == \"balance\":\n\t\towner := pusers.AddressOrName(parts[1])\n\t\townerAddr := users.Resolve(owner)\n\t\tbalance := banker.BalanceOf(ownerAddr)\n\t\treturn ufmt.Sprintf(\"%d\\n\", balance)\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}\n\nfunc checkErr(err error) {\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"},{"name":"foo20_test.gno","body":"package foo20\n\nimport (\n\t\"std\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/p/demo/uassert\"\n\tpusers \"gno.land/p/demo/users\"\n\t\"gno.land/r/demo/users\"\n)\n\nfunc TestReadOnlyPublicMethods(t *testing.T) {\n\tvar (\n\t\tadmin = pusers.AddressOrName(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\")\n\t\talice = pusers.AddressOrName(testutils.TestAddress(\"alice\"))\n\t\tbob = pusers.AddressOrName(testutils.TestAddress(\"bob\"))\n\t)\n\n\ttype test struct {\n\t\tname string\n\t\tbalance uint64\n\t\tfn func() uint64\n\t}\n\n\t// check balances #1.\n\t{\n\t\ttests := []test{\n\t\t\t{\"TotalSupply\", 10_000_000_000, func() uint64 { return TotalSupply() }},\n\t\t\t{\"BalanceOf(admin)\", 10_000_000_000, func() uint64 { return BalanceOf(admin) }},\n\t\t\t{\"BalanceOf(alice)\", 0, func() uint64 { return BalanceOf(alice) }},\n\t\t\t{\"Allowance(admin, alice)\", 0, func() uint64 { return Allowance(admin, alice) }},\n\t\t\t{\"BalanceOf(bob)\", 0, func() uint64 { return BalanceOf(bob) }},\n\t\t}\n\t\tfor _, tc := range tests {\n\t\t\tgot := tc.fn()\n\t\t\tuassert.Equal(t, got, tc.balance)\n\t\t}\n\t}\n\n\t// bob uses the faucet.\n\tstd.TestSetOrigCaller(users.Resolve(bob))\n\tFaucet()\n\n\t// check balances #2.\n\t{\n\t\ttests := []test{\n\t\t\t{\"TotalSupply\", 10_010_000_000, func() uint64 { return TotalSupply() }},\n\t\t\t{\"BalanceOf(admin)\", 10_000_000_000, func() uint64 { return BalanceOf(admin) }},\n\t\t\t{\"BalanceOf(alice)\", 0, func() uint64 { return BalanceOf(alice) }},\n\t\t\t{\"Allowance(admin, alice)\", 0, func() uint64 { return Allowance(admin, alice) }},\n\t\t\t{\"BalanceOf(bob)\", 10_000_000, func() uint64 { return BalanceOf(bob) }},\n\t\t}\n\t\tfor _, tc := range tests {\n\t\t\tgot := tc.fn()\n\t\t\tuassert.Equal(t, got, tc.balance)\n\t\t}\n\t}\n}\n\nfunc TestErrConditions(t *testing.T) {\n\tvar (\n\t\tadmin = pusers.AddressOrName(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\")\n\t\talice = pusers.AddressOrName(testutils.TestAddress(\"alice\"))\n\t\tempty = pusers.AddressOrName(\"\")\n\t)\n\n\ttype test struct {\n\t\tname string\n\t\tmsg string\n\t\tfn func()\n\t}\n\n\tstd.TestSetOrigCaller(users.Resolve(admin))\n\t{\n\t\ttests := []test{\n\t\t\t{\"Transfer(admin, 1)\", \"cannot send transfer to self\", func() { Transfer(admin, 1) }},\n\t\t\t{\"Approve(empty, 1))\", \"invalid address\", func() { Approve(empty, 1) }},\n\t\t}\n\t\tfor _, tc := range tests {\n\t\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t\tuassert.PanicsWithMessage(t, tc.msg, tc.fn)\n\t\t\t})\n\t\t}\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"foo20","path":"gno.land/r/demo/foo20","files":[{"name":"foo20.gno","body":"// foo20 is a GRC20 token contract where all the GRC20 methods are proxified\n// with top-level functions. see also gno.land/r/demo/bar20.\npackage foo20\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ownable\"\n\t\"gno.land/p/demo/ufmt\"\n\tpusers \"gno.land/p/demo/users\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tbanker *grc20.Banker\n\tadmin *ownable.Ownable\n\ttoken grc20.Token\n)\n\nfunc init() {\n\tadmin = ownable.NewWithAddress(\"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq\") // @manfred\n\tbanker = grc20.NewBanker(\"Foo\", \"FOO\", 4)\n\tbanker.Mint(admin.Owner(), 1000000*10000) // @administrator (1M)\n\ttoken = banker.Token()\n}\n\nfunc TotalSupply() uint64 { return token.TotalSupply() }\n\nfunc BalanceOf(owner pusers.AddressOrName) uint64 {\n\townerAddr := users.Resolve(owner)\n\treturn token.BalanceOf(ownerAddr)\n}\n\nfunc Allowance(owner, spender pusers.AddressOrName) uint64 {\n\townerAddr := users.Resolve(owner)\n\tspenderAddr := users.Resolve(spender)\n\treturn token.Allowance(ownerAddr, spenderAddr)\n}\n\nfunc Transfer(to pusers.AddressOrName, amount uint64) {\n\ttoAddr := users.Resolve(to)\n\tcheckErr(token.Transfer(toAddr, amount))\n}\n\nfunc Approve(spender pusers.AddressOrName, amount uint64) {\n\tspenderAddr := users.Resolve(spender)\n\tcheckErr(token.Approve(spenderAddr, amount))\n}\n\nfunc TransferFrom(from, to pusers.AddressOrName, amount uint64) {\n\tfromAddr := users.Resolve(from)\n\ttoAddr := users.Resolve(to)\n\tcheckErr(token.TransferFrom(fromAddr, toAddr, amount))\n}\n\n// Faucet is distributing foo20 tokens without restriction (unsafe).\n// For a real token faucet, you should take care of setting limits are asking payment.\nfunc Faucet() {\n\tcaller := std.PrevRealm().Addr()\n\tamount := uint64(1_000 * 10_000) // 1k\n\tcheckErr(banker.Mint(caller, amount))\n}\n\nfunc Mint(to pusers.AddressOrName, amount uint64) {\n\tadmin.AssertCallerIsOwner()\n\ttoAddr := users.Resolve(to)\n\tcheckErr(banker.Mint(toAddr, amount))\n}\n\nfunc Burn(from pusers.AddressOrName, amount uint64) {\n\tadmin.AssertCallerIsOwner()\n\tfromAddr := users.Resolve(from)\n\tcheckErr(banker.Burn(fromAddr, amount))\n}\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tc := len(parts)\n\n\tswitch {\n\tcase path == \"\":\n\t\treturn banker.RenderHome()\n\tcase c == 2 \u0026\u0026 parts[0] == \"balance\":\n\t\towner := pusers.AddressOrName(parts[1])\n\t\townerAddr := users.Resolve(owner)\n\t\tbalance := banker.BalanceOf(ownerAddr)\n\t\treturn ufmt.Sprintf(\"%d\\n\", balance)\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}\n\nfunc checkErr(err error) {\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"},{"name":"foo20_test.gno","body":"package foo20\n\nimport (\n\t\"std\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/p/demo/uassert\"\n\tpusers \"gno.land/p/demo/users\"\n\t\"gno.land/r/demo/users\"\n)\n\nfunc TestReadOnlyPublicMethods(t *testing.T) {\n\tvar (\n\t\tadmin = pusers.AddressOrName(\"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq\")\n\t\talice = pusers.AddressOrName(testutils.TestAddress(\"alice\"))\n\t\tbob = pusers.AddressOrName(testutils.TestAddress(\"bob\"))\n\t)\n\n\ttype test struct {\n\t\tname string\n\t\tbalance uint64\n\t\tfn func() uint64\n\t}\n\n\t// check balances #1.\n\t{\n\t\ttests := []test{\n\t\t\t{\"TotalSupply\", 10_000_000_000, func() uint64 { return TotalSupply() }},\n\t\t\t{\"BalanceOf(admin)\", 10_000_000_000, func() uint64 { return BalanceOf(admin) }},\n\t\t\t{\"BalanceOf(alice)\", 0, func() uint64 { return BalanceOf(alice) }},\n\t\t\t{\"Allowance(admin, alice)\", 0, func() uint64 { return Allowance(admin, alice) }},\n\t\t\t{\"BalanceOf(bob)\", 0, func() uint64 { return BalanceOf(bob) }},\n\t\t}\n\t\tfor _, tc := range tests {\n\t\t\tgot := tc.fn()\n\t\t\tuassert.Equal(t, got, tc.balance)\n\t\t}\n\t}\n\n\t// bob uses the faucet.\n\tstd.TestSetOrigCaller(users.Resolve(bob))\n\tFaucet()\n\n\t// check balances #2.\n\t{\n\t\ttests := []test{\n\t\t\t{\"TotalSupply\", 10_010_000_000, func() uint64 { return TotalSupply() }},\n\t\t\t{\"BalanceOf(admin)\", 10_000_000_000, func() uint64 { return BalanceOf(admin) }},\n\t\t\t{\"BalanceOf(alice)\", 0, func() uint64 { return BalanceOf(alice) }},\n\t\t\t{\"Allowance(admin, alice)\", 0, func() uint64 { return Allowance(admin, alice) }},\n\t\t\t{\"BalanceOf(bob)\", 10_000_000, func() uint64 { return BalanceOf(bob) }},\n\t\t}\n\t\tfor _, tc := range tests {\n\t\t\tgot := tc.fn()\n\t\t\tuassert.Equal(t, got, tc.balance)\n\t\t}\n\t}\n}\n\nfunc TestErrConditions(t *testing.T) {\n\tvar (\n\t\tadmin = pusers.AddressOrName(\"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq\")\n\t\talice = pusers.AddressOrName(testutils.TestAddress(\"alice\"))\n\t\tempty = pusers.AddressOrName(\"\")\n\t)\n\n\ttype test struct {\n\t\tname string\n\t\tmsg string\n\t\tfn func()\n\t}\n\n\tstd.TestSetOrigCaller(users.Resolve(admin))\n\t{\n\t\ttests := []test{\n\t\t\t{\"Transfer(admin, 1)\", \"cannot send transfer to self\", func() { Transfer(admin, 1) }},\n\t\t\t{\"Approve(empty, 1))\", \"invalid address\", func() { Approve(empty, 1) }},\n\t\t}\n\t\tfor _, tc := range tests {\n\t\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\t\tuassert.PanicsWithMessage(t, tc.msg, tc.fn)\n\t\t\t})\n\t\t}\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} {"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"foo721","path":"gno.land/r/demo/foo721","files":[{"name":"foo721.gno","body":"package foo721\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/grc/grc721\"\n\t\"gno.land/p/demo/ufmt\"\n\t\"gno.land/r/demo/users\"\n\n\tpusers \"gno.land/p/demo/users\"\n)\n\nvar (\n\tadmin std.Address = \"g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj\"\n\tfoo = grc721.NewBasicNFT(\"FooNFT\", \"FNFT\")\n)\n\nfunc init() {\n\tmintNNFT(admin, 10) // @administrator (10)\n\tmintNNFT(\"g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm\", 5) // @hariom (5)\n}\n\nfunc mintNNFT(owner std.Address, n uint64) {\n\tcount := foo.TokenCount()\n\tfor i := count; i \u003c count+n; i++ {\n\t\ttid := grc721.TokenID(ufmt.Sprintf(\"%d\", i))\n\t\tfoo.Mint(owner, tid)\n\t}\n}\n\n// Getters\n\nfunc BalanceOf(user pusers.AddressOrName) uint64 {\n\tbalance, err := foo.BalanceOf(users.Resolve(user))\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\treturn balance\n}\n\nfunc OwnerOf(tid grc721.TokenID) std.Address {\n\towner, err := foo.OwnerOf(tid)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\treturn owner\n}\n\nfunc IsApprovedForAll(owner, user pusers.AddressOrName) bool {\n\treturn foo.IsApprovedForAll(users.Resolve(owner), users.Resolve(user))\n}\n\nfunc GetApproved(tid grc721.TokenID) std.Address {\n\taddr, err := foo.GetApproved(tid)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\treturn addr\n}\n\n// Setters\n\nfunc Approve(user pusers.AddressOrName, tid grc721.TokenID) {\n\terr := foo.Approve(users.Resolve(user), tid)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc SetApprovalForAll(user pusers.AddressOrName, approved bool) {\n\terr := foo.SetApprovalForAll(users.Resolve(user), approved)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc TransferFrom(from, to pusers.AddressOrName, tid grc721.TokenID) {\n\terr := foo.TransferFrom(users.Resolve(from), users.Resolve(to), tid)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// Admin\n\nfunc Mint(to pusers.AddressOrName, tid grc721.TokenID) {\n\tcaller := std.PrevRealm().Addr()\n\tassertIsAdmin(caller)\n\terr := foo.Mint(users.Resolve(to), tid)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc Burn(tid grc721.TokenID) {\n\tcaller := std.PrevRealm().Addr()\n\tassertIsAdmin(caller)\n\terr := foo.Burn(tid)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// Render\n\nfunc Render(path string) string {\n\tswitch {\n\tcase path == \"\":\n\t\treturn foo.RenderHome()\n\tdefault:\n\t\treturn \"404\\n\"\n\t}\n}\n\n// Util\n\nfunc assertIsAdmin(address std.Address) {\n\tif address != admin {\n\t\tpanic(\"restricted access\")\n\t}\n}\n"},{"name":"foo721_test.gno","body":"package foo721\n\nimport (\n\t\"testing\"\n\n\t\"gno.land/p/demo/grc/grc721\"\n\t\"gno.land/r/demo/users\"\n\n\tpusers \"gno.land/p/demo/users\"\n)\n\nfunc TestFoo721(t *testing.T) {\n\tadmin := pusers.AddressOrName(\"g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj\")\n\thariom := pusers.AddressOrName(\"g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm\")\n\n\tfor i, tc := range []struct {\n\t\tname string\n\t\texpected interface{}\n\t\tfn func() interface{}\n\t}{\n\t\t{\"BalanceOf(admin)\", uint64(10), func() interface{} { return BalanceOf(admin) }},\n\t\t{\"BalanceOf(hariom)\", uint64(5), func() interface{} { return BalanceOf(hariom) }},\n\t\t{\"OwnerOf(0)\", users.Resolve(admin), func() interface{} { return OwnerOf(grc721.TokenID(\"0\")) }},\n\t\t{\"IsApprovedForAll(admin, hariom)\", false, func() interface{} { return IsApprovedForAll(admin, hariom) }},\n\t} {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tgot := tc.fn()\n\t\t\tif tc.expected != got {\n\t\t\t\tt.Errorf(\"expected: %v got: %v\", tc.expected, got)\n\t\t\t}\n\t\t})\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} {"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"shifumi","path":"gno.land/r/demo/games/shifumi","files":[{"name":"shifumi.gno","body":"package shifumi\n\nimport (\n\t\"errors\"\n\t\"std\"\n\t\"strconv\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/seqid\"\n\n\t\"gno.land/r/demo/users\"\n)\n\nconst (\n\tempty = iota\n\trock\n\tpaper\n\tscissors\n\tlast\n)\n\ntype game struct {\n\tplayer1, player2 std.Address // shifumi is a 2 players game\n\tmove1, move2 int // can be empty, rock, paper, or scissors\n}\n\nvar games avl.Tree\nvar id seqid.ID\n\nfunc (g *game) play(player std.Address, move int) error {\n\tif !(move \u003e empty \u0026\u0026 move \u003c last) {\n\t\treturn errors.New(\"invalid move\")\n\t}\n\tif player != g.player1 \u0026\u0026 player != g.player2 {\n\t\treturn errors.New(\"invalid player\")\n\t}\n\tif player == g.player1 \u0026\u0026 g.move1 == empty {\n\t\tg.move1 = move\n\t\treturn nil\n\t}\n\tif player == g.player2 \u0026\u0026 g.move2 == empty {\n\t\tg.move2 = move\n\t\treturn nil\n\t}\n\treturn errors.New(\"already played\")\n}\n\nfunc (g *game) winner() int {\n\tif g.move1 == empty || g.move2 == empty {\n\t\treturn -1\n\t}\n\tif g.move1 == g.move2 {\n\t\treturn 0\n\t}\n\tif g.move1 == rock \u0026\u0026 g.move2 == scissors ||\n\t\tg.move1 == paper \u0026\u0026 g.move2 == rock ||\n\t\tg.move1 == scissors \u0026\u0026 g.move2 == paper {\n\t\treturn 1\n\t}\n\treturn 2\n}\n\n// NewGame creates a new game where player1 is the caller and player2 the argument.\n// A new game index is returned.\nfunc NewGame(player std.Address) int {\n\tgames.Set(id.Next().String(), \u0026game{player1: std.PrevRealm().Addr(), player2: player})\n\treturn int(id)\n}\n\n// Play executes a move for the game at index idx, where move can be:\n// 1 (rock), 2 (paper), 3 (scissors).\nfunc Play(idx, move int) {\n\tv, ok := games.Get(seqid.ID(idx).String())\n\tif !ok {\n\t\tpanic(\"game not found\")\n\t}\n\tif err := v.(*game).play(std.PrevRealm().Addr(), move); err != nil {\n\t\tpanic(err)\n\t}\n}\n\nfunc Render(path string) string {\n\tmov1 := []string{\"\", \" 🤜 \", \" 🫱 \", \" 👉 \"}\n\tmov2 := []string{\"\", \" 🤛 \", \" 🫲 \", \" 👈 \"}\n\twin := []string{\"pending\", \"draw\", \"player1\", \"player2\"}\n\n\toutput := `# 👊 ✋ ✌️ Shifumi\nActions:\n* [NewGame](shifumi?help\u0026__func=NewGame) opponentAddress\n* [Play](shifumi?help\u0026__func=Play) gameIndex move (1=rock, 2=paper, 3=scissors)\n\n game | player1 | | player2 | | win \n --- | --- | --- | --- | --- | ---\n`\n\t// Output the 100 most recent games.\n\tmaxGames := 100\n\tfor n := int(id); n \u003e 0 \u0026\u0026 int(id)-n \u003c maxGames; n-- {\n\t\tv, ok := games.Get(seqid.ID(n).String())\n\t\tif !ok {\n\t\t\tcontinue\n\t\t}\n\t\tg := v.(*game)\n\t\toutput += strconv.Itoa(n) + \" | \" +\n\t\t\tshortName(g.player1) + \" | \" + mov1[g.move1] + \" | \" +\n\t\t\tshortName(g.player2) + \" | \" + mov2[g.move2] + \" | \" +\n\t\t\twin[g.winner()+1] + \"\\n\"\n\t}\n\treturn output\n}\n\nfunc shortName(addr std.Address) string {\n\tuser := users.GetUserByAddress(addr)\n\tif user != nil {\n\t\treturn user.Name\n\t}\n\tif len(addr) \u003c 10 {\n\t\treturn string(addr)\n\t}\n\treturn string(addr)[:10] + \"...\"\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} -{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"groups","path":"gno.land/r/demo/groups","files":[{"name":"README.md","body":"### - test package\n\n ./build/gno test examples/gno.land/r/demo/groups/\n\n### - add pkg\n\n ./build/gnokey maketx addpkg -pkgdir \"examples/gno.land/r/demo/groups\" -deposit 100000000ugnot -gas-fee 1000000ugnot -gas-wanted 10000000 -broadcast -chainid dev -remote 0.0.0.0:26657 -pkgpath \"gno.land/r/demo/groups\" test1 \n\n### - create group\n\n ./build/gnokey maketx call -func \"CreateGroup\" -args \"dao_trinity_ngo\" -gas-fee \"1000000ugnot\" -gas-wanted 4000000 -broadcast -chainid dev -remote 0.0.0.0:26657 -pkgpath \"gno.land/r/demo/groups\" test1 \n\n### - add member\n\n ./build/gnokey maketx call -func \"AddMember\" -args \"1\" -args \"g1hd3gwzevxlqmd3jsf64mpfczag8a8e5j2wdn3c\" -args 12 -args \"i am new user\" -gas-fee \"1000000ugnot\" -gas-wanted \"4000000\" -broadcast -chainid dev -remote 0.0.0.0:26657 -pkgpath \"gno.land/r/demo/groups\" test1\n\n### - delete member\n\n ./build/gnokey maketx call -func \"DeleteMember\" -args \"1\" -args \"0\" -gas-fee \"1000000ugnot\" -gas-wanted \"4000000\" -broadcast -chainid dev -remote 0.0.0.0:26657 -pkgpath \"gno.land/r/demo/groups\" test1\n\n### - delete group\n\n ./build/gnokey maketx call -func \"DeleteGroup\" -args \"1\" -gas-fee \"1000000ugnot\" -gas-wanted \"4000000\" -broadcast -chainid dev -remote 0.0.0.0:26657 -pkgpath \"gno.land/r/demo/groups\" test1\n\n"},{"name":"group.gno","body":"package groups\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"gno.land/p/demo/avl\"\n)\n\ntype GroupID uint64\n\nfunc (gid GroupID) String() string {\n\treturn strconv.Itoa(int(gid))\n}\n\ntype Group struct {\n\tid GroupID\n\turl string\n\tname string\n\tlastMemberID MemberID\n\tmembers avl.Tree\n\tcreator std.Address\n\tcreatedAt time.Time\n}\n\nfunc newGroup(url string, name string, creator std.Address) *Group {\n\tif !reName.MatchString(name) {\n\t\tpanic(\"invalid name: \" + name)\n\t}\n\tif gGroupsByName.Has(name) {\n\t\tpanic(\"Group with such name already exists\")\n\t}\n\treturn \u0026Group{\n\t\tid: incGetGroupID(),\n\t\turl: url,\n\t\tname: name,\n\t\tcreator: creator,\n\t\tmembers: avl.Tree{},\n\t\tcreatedAt: time.Now(),\n\t}\n}\n\nfunc (group *Group) newMember(id MemberID, address std.Address, weight int, metadata string) *Member {\n\tif group.members.Has(address.String()) {\n\t\tpanic(\"this member for this group already exists\")\n\t}\n\treturn \u0026Member{\n\t\tid: id,\n\t\taddress: address,\n\t\tweight: weight,\n\t\tmetadata: metadata,\n\t\tcreatedAt: time.Now(),\n\t}\n}\n\nfunc (group *Group) HasPermission(addr std.Address, perm Permission) bool {\n\tif group.creator != addr {\n\t\treturn false\n\t}\n\treturn isValidPermission(perm)\n}\n\nfunc (group *Group) RenderGroup() string {\n\tstr := \"Group ID: \" + groupIDKey(group.id) + \"\\n\\n\" +\n\t\t\"Group Name: \" + group.name + \"\\n\\n\" +\n\t\t\"Group Creator: \" + usernameOf(group.creator) + \"\\n\\n\" +\n\t\t\"Group createdAt: \" + group.createdAt.String() + \"\\n\\n\" +\n\t\t\"Group Last MemberID: \" + memberIDKey(group.lastMemberID) + \"\\n\\n\"\n\n\tstr += \"Group Members: \\n\\n\"\n\tgroup.members.Iterate(\"\", \"\", func(key string, value interface{}) bool {\n\t\tmember := value.(*Member)\n\t\tstr += member.getMemberStr()\n\t\treturn false\n\t})\n\treturn str\n}\n\nfunc (group *Group) deleteGroup() {\n\tgidkey := groupIDKey(group.id)\n\t_, gGroupsRemoved := gGroups.Remove(gidkey)\n\tif !gGroupsRemoved {\n\t\tpanic(\"group does not exist with id \" + group.id.String())\n\t}\n\tgGroupsByName.Remove(group.name)\n}\n\nfunc (group *Group) deleteMember(mid MemberID) {\n\tgidkey := groupIDKey(group.id)\n\tif !gGroups.Has(gidkey) {\n\t\tpanic(\"group does not exist with id \" + group.id.String())\n\t}\n\n\tg := getGroup(group.id)\n\tmidkey := memberIDKey(mid)\n\tg.members.Remove(midkey)\n}\n"},{"name":"groups.gno","body":"package groups\n\nimport (\n\t\"regexp\"\n\n\t\"gno.land/p/demo/avl\"\n)\n\n//----------------------------------------\n// Realm (package) state\n\nvar (\n\tgGroups avl.Tree // id -\u003e *Group\n\tgGroupsCtr int // increments Group.id\n\tgGroupsByName avl.Tree // name -\u003e *Group\n)\n\n//----------------------------------------\n// Constants\n\nvar reName = regexp.MustCompile(`^[a-z]+[_a-z0-9]{2,29}$`)\n"},{"name":"member.gno","body":"package groups\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\t\"time\"\n)\n\ntype MemberID uint64\n\ntype Member struct {\n\tid MemberID\n\taddress std.Address\n\tweight int\n\tmetadata string\n\tcreatedAt time.Time\n}\n\nfunc (mid MemberID) String() string {\n\treturn strconv.Itoa(int(mid))\n}\n\nfunc (member *Member) getMemberStr() string {\n\tmemberDataStr := \"\"\n\tmemberDataStr += \"\\t\\t\\t[\" + memberIDKey(member.id) + \", \" + member.address.String() + \", \" + strconv.Itoa(member.weight) + \", \" + member.metadata + \", \" + member.createdAt.String() + \"],\\n\\n\"\n\treturn memberDataStr\n}\n"},{"name":"misc.gno","body":"package groups\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"gno.land/r/demo/users\"\n)\n\n//----------------------------------------\n// private utility methods\n// XXX ensure these cannot be called from public.\n\nfunc getGroup(gid GroupID) *Group {\n\tgidkey := groupIDKey(gid)\n\tgroup_, exists := gGroups.Get(gidkey)\n\tif !exists {\n\t\tpanic(\"group id (\" + gid.String() + \") does not exists\")\n\t}\n\tgroup := group_.(*Group)\n\treturn group\n}\n\nfunc incGetGroupID() GroupID {\n\tgGroupsCtr++\n\treturn GroupID(gGroupsCtr)\n}\n\nfunc padLeft(str string, length int) string {\n\tif len(str) \u003e= length {\n\t\treturn str\n\t}\n\treturn strings.Repeat(\" \", length-len(str)) + str\n}\n\nfunc padZero(u64 uint64, length int) string {\n\tstr := strconv.Itoa(int(u64))\n\tif len(str) \u003e= length {\n\t\treturn str\n\t}\n\treturn strings.Repeat(\"0\", length-len(str)) + str\n}\n\nfunc groupIDKey(gid GroupID) string {\n\treturn padZero(uint64(gid), 10)\n}\n\nfunc memberIDKey(mid MemberID) string {\n\treturn padZero(uint64(mid), 10)\n}\n\nfunc indentBody(indent string, body string) string {\n\tlines := strings.Split(body, \"\\n\")\n\tres := \"\"\n\tfor i, line := range lines {\n\t\tif i \u003e 0 {\n\t\t\tres += \"\\n\"\n\t\t}\n\t\tres += indent + line\n\t}\n\treturn res\n}\n\n// NOTE: length must be greater than 3.\nfunc summaryOf(str string, length int) string {\n\tlines := strings.SplitN(str, \"\\n\", 2)\n\tline := lines[0]\n\tif len(line) \u003e length {\n\t\tline = line[:(length-3)] + \"...\"\n\t} else if len(lines) \u003e 1 {\n\t\t// len(line) \u003c= 80\n\t\tline = line + \"...\"\n\t}\n\treturn line\n}\n\nfunc displayAddressMD(addr std.Address) string {\n\tuser := users.GetUserByAddress(addr)\n\tif user == nil {\n\t\treturn \"[\" + addr.String() + \"](/r/demo/users:\" + addr.String() + \")\"\n\t}\n\treturn \"[@\" + user.Name + \"](/r/demo/users:\" + user.Name + \")\"\n}\n\nfunc usernameOf(addr std.Address) string {\n\tuser := users.GetUserByAddress(addr)\n\tif user == nil {\n\t\tpanic(\"user not found\")\n\t}\n\treturn user.Name\n}\n\nfunc isValidPermission(perm Permission) bool {\n\treturn perm == EditPermission || perm == DeletePermission\n}\n"},{"name":"public.gno","body":"package groups\n\nimport (\n\t\"std\"\n\n\t\"gno.land/r/demo/users\"\n)\n\n//----------------------------------------\n// Public facing functions\n\nfunc GetGroupIDFromName(name string) (GroupID, bool) {\n\tgroupI, exists := gGroupsByName.Get(name)\n\tif !exists {\n\t\treturn 0, false\n\t}\n\treturn groupI.(*Group).id, true\n}\n\nfunc CreateGroup(name string) GroupID {\n\tstd.AssertOriginCall()\n\tcaller := std.GetOrigCaller()\n\tusernameOf(caller)\n\turl := \"/r/demo/groups:\" + name\n\tgroup := newGroup(url, name, caller)\n\tgidkey := groupIDKey(group.id)\n\tgGroups.Set(gidkey, group)\n\tgGroupsByName.Set(name, group)\n\treturn group.id\n}\n\nfunc AddMember(gid GroupID, address string, weight int, metadata string) MemberID {\n\tstd.AssertOriginCall()\n\tcaller := std.GetOrigCaller()\n\tusernameOf(caller)\n\tgroup := getGroup(gid)\n\tif !group.HasPermission(caller, EditPermission) {\n\t\tpanic(\"unauthorized to edit group\")\n\t}\n\tuser := users.GetUserByAddress(std.Address(address))\n\tif user == nil {\n\t\tpanic(\"unknown address \" + address)\n\t}\n\tmid := group.lastMemberID\n\tmember := group.newMember(mid, std.Address(address), weight, metadata)\n\tmidkey := memberIDKey(mid)\n\tgroup.members.Set(midkey, member)\n\tmid++\n\tgroup.lastMemberID = mid\n\treturn member.id\n}\n\nfunc DeleteGroup(gid GroupID) {\n\tstd.AssertOriginCall()\n\tcaller := std.GetOrigCaller()\n\tgroup := getGroup(gid)\n\tif !group.HasPermission(caller, DeletePermission) {\n\t\tpanic(\"unauthorized to delete group\")\n\t}\n\tgroup.deleteGroup()\n}\n\nfunc DeleteMember(gid GroupID, mid MemberID) {\n\tstd.AssertOriginCall()\n\tcaller := std.GetOrigCaller()\n\tgroup := getGroup(gid)\n\tif !group.HasPermission(caller, DeletePermission) {\n\t\tpanic(\"unauthorized to delete member\")\n\t}\n\tgroup.deleteMember(mid)\n}\n"},{"name":"render.gno","body":"package groups\n\nimport (\n\t\"strings\"\n)\n\n//----------------------------------------\n// Render functions\n\nfunc RenderGroup(gid GroupID) string {\n\tgroup := getGroup(gid)\n\tif group == nil {\n\t\treturn \"missing Group\"\n\t}\n\treturn group.RenderGroup()\n}\n\nfunc Render(path string) string {\n\tif path == \"\" {\n\t\tstr := \"List of all Groups:\\n\\n\"\n\t\tgGroups.Iterate(\"\", \"\", func(key string, value interface{}) bool {\n\t\t\tgroup := value.(*Group)\n\t\t\tstr += \" * [\" + group.name + \"](\" + group.url + \")\\n\"\n\t\t\treturn false\n\t\t})\n\t\treturn str\n\t}\n\tparts := strings.Split(path, \"/\")\n\tif len(parts) == 1 {\n\t\t// /r/demo/groups:Group_NAME\n\t\tname := parts[0]\n\t\tgroupI, exists := gGroupsByName.Get(name)\n\t\tif !exists {\n\t\t\treturn \"Group does not exist: \" + name\n\t\t}\n\t\treturn groupI.(*Group).RenderGroup()\n\t} else {\n\t\treturn \"unrecognized path \" + path\n\t}\n}\n"},{"name":"role.gno","body":"package groups\n\ntype Permission string\n\nconst (\n\tDeletePermission Permission = \"role:delete\"\n\tEditPermission Permission = \"role:edit\"\n)\n"},{"name":"z_0_a_filetest.gno","body":"// PKGPATH: gno.land/r/demo/groups_test\npackage groups_test\n\nimport (\n\t\"gno.land/r/demo/groups\"\n)\n\nvar gid groups.GroupID\n\nfunc main() {\n\tgid = groups.CreateGroup(\"test_group\")\n\tprintln(gid)\n\tprintln(groups.Render(\"\"))\n}\n\n// Error:\n// user not found\n"},{"name":"z_0_b_filetest.gno","body":"// PKGPATH: gno.land/r/demo/groups_test\npackage groups_test\n\nimport (\n\t\"gno.land/r/demo/groups\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar gid groups.GroupID\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tgid = groups.CreateGroup(\"test_group\")\n\tprintln(gid)\n\tprintln(groups.Render(\"\"))\n}\n\n// Error:\n// payment must not be less than 20000000\n"},{"name":"z_0_c_filetest.gno","body":"// PKGPATH: gno.land/r/demo/groups_test\npackage groups_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"gno.land/r/demo/groups\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar gid groups.GroupID\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tgid = groups.CreateGroup(\"test_group\")\n\tprintln(gid)\n\tprintln(groups.Render(\"\"))\n}\n\n// Output:\n// 1\n// List of all Groups:\n//\n// * [test_group](/r/demo/groups:test_group)\n"},{"name":"z_1_a_filetest.gno","body":"// PKGPATH: gno.land/r/demo/groups_test\npackage groups_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/groups\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar gid groups.GroupID\n\nconst admin = std.Address(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\")\n\nfunc main() {\n\tcaller := std.GetOrigCaller() // main\n\tusers.Register(\"\", \"gnouser0\", \"my profile 1\")\n\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\")\n\t// switch back to caller\n\tstd.TestSetOrigCaller(caller)\n\t// invite another addr\n\ttest1 := testutils.TestAddress(\"gnouser1\")\n\tusers.Invite(test1.String())\n\t// switch to test1\n\tstd.TestSetOrigCaller(test1)\n\tusers.Register(caller, \"gnouser1\", \"my other profile 1\")\n\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\")\n\t// switch back to caller\n\tstd.TestSetOrigCaller(caller)\n\t// invite another addr\n\ttest2 := testutils.TestAddress(\"gnouser2\")\n\tusers.Invite(test2.String())\n\t// switch to test1\n\tstd.TestSetOrigCaller(test2)\n\tusers.Register(caller, \"gnouser2\", \"my other profile 2\")\n\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\")\n\t// switch back to caller\n\tstd.TestSetOrigCaller(caller)\n\t// invite another addr\n\ttest3 := testutils.TestAddress(\"gnouser3\")\n\tusers.Invite(test3.String())\n\t// switch to test1\n\tstd.TestSetOrigCaller(test3)\n\tusers.Register(caller, \"gnouser3\", \"my other profile 3\")\n\n\tstd.TestSetOrigCaller(caller)\n\n\tgid = groups.CreateGroup(\"test_group\")\n\tprintln(gid)\n\n\tgroups.AddMember(gid, test3.String(), 32, \"i am from UAE\")\n\tprintln(groups.Render(\"test_group\"))\n}\n\n// Output:\n// 1\n// Group ID: 0000000001\n//\n// Group Name: test_group\n//\n// Group Creator: gnouser0\n//\n// Group createdAt: 2009-02-13 23:31:30 +0000 UTC m=+1234567890.000000001\n//\n// Group Last MemberID: 0000000001\n//\n// Group Members:\n//\n// \t\t\t[0000000000, g1vahx7atnv4erxh6lta047h6lta047h6ll85gpy, 32, i am from UAE, 2009-02-13 23:31:30 +0000 UTC m=+1234567890.000000001],\n"},{"name":"z_1_b_filetest.gno","body":"// PKGPATH: gno.land/r/demo/groups_test\npackage groups_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"gno.land/r/demo/groups\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar gid groups.GroupID\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tgid = groups.CreateGroup(\"test_group\")\n\tprintln(gid)\n\tgroups.AddMember(2, \"g1vahx7atnv4erxh6lta047h6lta047h6ll85gpy\", 55, \"metadata3\")\n\tprintln(groups.Render(\"\"))\n}\n\n// Error:\n// group id (2) does not exists\n"},{"name":"z_1_c_filetest.gno","body":"// PKGPATH: gno.land/r/demo/groups_test\npackage groups_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/groups\"\n)\n\nvar gid groups.GroupID\n\nfunc main() {\n\tgid = groups.CreateGroup(\"test_group\")\n\tprintln(gid)\n\n\t// add member via anon user\n\ttest2 := testutils.TestAddress(\"test2\")\n\tstd.TestSetOrigCaller(test2)\n\tstd.TestSetOrigSend(std.Coins{{\"ugnot\", 9000000}}, nil)\n\n\tgroups.AddMember(gid, test2.String(), 42, \"metadata3\")\n}\n\n// Error:\n// user not found\n"},{"name":"z_2_a_filetest.gno","body":"// PKGPATH: gno.land/r/demo/groups_test\npackage groups_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/groups\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar gid groups.GroupID\n\nconst admin = std.Address(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\")\n\nfunc main() {\n\tcaller := std.GetOrigCaller() // main\n\tusers.Register(\"\", \"gnouser0\", \"my profile 1\")\n\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\")\n\t// switch back to caller\n\tstd.TestSetOrigCaller(caller)\n\t// invite another addr\n\ttest1 := testutils.TestAddress(\"gnouser1\")\n\tusers.Invite(test1.String())\n\t// switch to test1\n\tstd.TestSetOrigCaller(test1)\n\tusers.Register(caller, \"gnouser1\", \"my other profile 1\")\n\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\")\n\t// switch back to caller\n\tstd.TestSetOrigCaller(caller)\n\t// invite another addr\n\ttest2 := testutils.TestAddress(\"gnouser2\")\n\tusers.Invite(test2.String())\n\t// switch to test1\n\tstd.TestSetOrigCaller(test2)\n\tusers.Register(caller, \"gnouser2\", \"my other profile 2\")\n\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\")\n\t// switch back to caller\n\tstd.TestSetOrigCaller(caller)\n\t// invite another addr\n\ttest3 := testutils.TestAddress(\"gnouser3\")\n\tusers.Invite(test3.String())\n\t// switch to test1\n\tstd.TestSetOrigCaller(test3)\n\tusers.Register(caller, \"gnouser3\", \"my other profile 3\")\n\n\tstd.TestSetOrigCaller(caller)\n\n\tgid = groups.CreateGroup(\"test_group\")\n\tprintln(gid)\n\n\tgroups.AddMember(gid, test2.String(), 42, \"metadata3\")\n\n\tgroups.DeleteMember(gid, 0)\n\tprintln(groups.RenderGroup(gid))\n}\n\n// Output:\n// 1\n// Group ID: 0000000001\n//\n// Group Name: test_group\n//\n// Group Creator: gnouser0\n//\n// Group createdAt: 2009-02-13 23:31:30 +0000 UTC m=+1234567890.000000001\n//\n// Group Last MemberID: 0000000001\n//\n// Group Members:\n"},{"name":"z_2_b_filetest.gno","body":"// PKGPATH: gno.land/r/demo/groups_test\npackage groups_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"gno.land/r/demo/groups\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar gid groups.GroupID\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tgid = groups.CreateGroup(\"test_group\")\n\tprintln(gid)\n\tgroups.DeleteMember(2, 0)\n\tprintln(groups.Render(\"\"))\n}\n\n// Error:\n// group id (2) does not exists\n"},{"name":"z_2_d_filetest.gno","body":"// PKGPATH: gno.land/r/demo/groups_test\npackage groups_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/groups\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar gid groups.GroupID\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tgid = groups.CreateGroup(\"test_group\")\n\tprintln(gid)\n\n\t// delete member via anon user\n\ttest2 := testutils.TestAddress(\"test2\")\n\tstd.TestSetOrigCaller(test2)\n\tstd.TestSetOrigSend(std.Coins{{\"ugnot\", 9000000}}, nil)\n\n\tgroups.DeleteMember(gid, 0)\n\tprintln(groups.Render(\"\"))\n}\n\n// Error:\n// unauthorized to delete member\n"},{"name":"z_2_e_filetest.gno","body":"// PKGPATH: gno.land/r/demo/groups_test\npackage groups_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"gno.land/r/demo/groups\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar gid groups.GroupID\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tgid = groups.CreateGroup(\"test_group\")\n\tprintln(gid)\n\tgroups.DeleteGroup(gid)\n\tprintln(groups.Render(\"\"))\n}\n\n// Output:\n// 1\n// List of all Groups:\n"},{"name":"z_2_f_filetest.gno","body":"// PKGPATH: gno.land/r/demo/groups_test\npackage groups_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"gno.land/r/demo/groups\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar gid groups.GroupID\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tgid = groups.CreateGroup(\"test_group\")\n\tprintln(gid)\n\tgroups.DeleteGroup(20)\n\tprintln(groups.Render(\"\"))\n}\n\n// Error:\n// group id (20) does not exists\n"},{"name":"z_2_g_filetest.gno","body":"// PKGPATH: gno.land/r/demo/groups_test\npackage groups_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/groups\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar gid groups.GroupID\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tgid = groups.CreateGroup(\"test_group\")\n\tprintln(gid)\n\n\t// delete group via anon user\n\ttest2 := testutils.TestAddress(\"test2\")\n\tstd.TestSetOrigCaller(test2)\n\tstd.TestSetOrigSend(std.Coins{{\"ugnot\", 9000000}}, nil)\n\n\tgroups.DeleteGroup(gid)\n\tprintln(groups.Render(\"\"))\n}\n\n// Error:\n// unauthorized to delete group\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"groups","path":"gno.land/r/demo/groups","files":[{"name":"README.md","body":"### - test package\n\n ./build/gno test examples/gno.land/r/demo/groups/\n\n### - add pkg\n\n ./build/gnokey maketx addpkg -pkgdir \"examples/gno.land/r/demo/groups\" -deposit 100000000ugnot -gas-fee 1000000ugnot -gas-wanted 10000000 -broadcast -chainid dev -remote 0.0.0.0:26657 -pkgpath \"gno.land/r/demo/groups\" test1 \n\n### - create group\n\n ./build/gnokey maketx call -func \"CreateGroup\" -args \"dao_trinity_ngo\" -gas-fee \"1000000ugnot\" -gas-wanted 4000000 -broadcast -chainid dev -remote 0.0.0.0:26657 -pkgpath \"gno.land/r/demo/groups\" test1 \n\n### - add member\n\n ./build/gnokey maketx call -func \"AddMember\" -args \"1\" -args \"g1hd3gwzevxlqmd3jsf64mpfczag8a8e5j2wdn3c\" -args 12 -args \"i am new user\" -gas-fee \"1000000ugnot\" -gas-wanted \"4000000\" -broadcast -chainid dev -remote 0.0.0.0:26657 -pkgpath \"gno.land/r/demo/groups\" test1\n\n### - delete member\n\n ./build/gnokey maketx call -func \"DeleteMember\" -args \"1\" -args \"0\" -gas-fee \"1000000ugnot\" -gas-wanted \"4000000\" -broadcast -chainid dev -remote 0.0.0.0:26657 -pkgpath \"gno.land/r/demo/groups\" test1\n\n### - delete group\n\n ./build/gnokey maketx call -func \"DeleteGroup\" -args \"1\" -gas-fee \"1000000ugnot\" -gas-wanted \"4000000\" -broadcast -chainid dev -remote 0.0.0.0:26657 -pkgpath \"gno.land/r/demo/groups\" test1\n\n"},{"name":"group.gno","body":"package groups\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"gno.land/p/demo/avl\"\n)\n\ntype GroupID uint64\n\nfunc (gid GroupID) String() string {\n\treturn strconv.Itoa(int(gid))\n}\n\ntype Group struct {\n\tid GroupID\n\turl string\n\tname string\n\tlastMemberID MemberID\n\tmembers avl.Tree\n\tcreator std.Address\n\tcreatedAt time.Time\n}\n\nfunc newGroup(url string, name string, creator std.Address) *Group {\n\tif !reName.MatchString(name) {\n\t\tpanic(\"invalid name: \" + name)\n\t}\n\tif gGroupsByName.Has(name) {\n\t\tpanic(\"Group with such name already exists\")\n\t}\n\treturn \u0026Group{\n\t\tid: incGetGroupID(),\n\t\turl: url,\n\t\tname: name,\n\t\tcreator: creator,\n\t\tmembers: avl.Tree{},\n\t\tcreatedAt: time.Now(),\n\t}\n}\n\nfunc (group *Group) newMember(id MemberID, address std.Address, weight int, metadata string) *Member {\n\tif group.members.Has(address.String()) {\n\t\tpanic(\"this member for this group already exists\")\n\t}\n\treturn \u0026Member{\n\t\tid: id,\n\t\taddress: address,\n\t\tweight: weight,\n\t\tmetadata: metadata,\n\t\tcreatedAt: time.Now(),\n\t}\n}\n\nfunc (group *Group) HasPermission(addr std.Address, perm Permission) bool {\n\tif group.creator != addr {\n\t\treturn false\n\t}\n\treturn isValidPermission(perm)\n}\n\nfunc (group *Group) RenderGroup() string {\n\tstr := \"Group ID: \" + groupIDKey(group.id) + \"\\n\\n\" +\n\t\t\"Group Name: \" + group.name + \"\\n\\n\" +\n\t\t\"Group Creator: \" + usernameOf(group.creator) + \"\\n\\n\" +\n\t\t\"Group createdAt: \" + group.createdAt.String() + \"\\n\\n\" +\n\t\t\"Group Last MemberID: \" + memberIDKey(group.lastMemberID) + \"\\n\\n\"\n\n\tstr += \"Group Members: \\n\\n\"\n\tgroup.members.Iterate(\"\", \"\", func(key string, value interface{}) bool {\n\t\tmember := value.(*Member)\n\t\tstr += member.getMemberStr()\n\t\treturn false\n\t})\n\treturn str\n}\n\nfunc (group *Group) deleteGroup() {\n\tgidkey := groupIDKey(group.id)\n\t_, gGroupsRemoved := gGroups.Remove(gidkey)\n\tif !gGroupsRemoved {\n\t\tpanic(\"group does not exist with id \" + group.id.String())\n\t}\n\tgGroupsByName.Remove(group.name)\n}\n\nfunc (group *Group) deleteMember(mid MemberID) {\n\tgidkey := groupIDKey(group.id)\n\tif !gGroups.Has(gidkey) {\n\t\tpanic(\"group does not exist with id \" + group.id.String())\n\t}\n\n\tg := getGroup(group.id)\n\tmidkey := memberIDKey(mid)\n\tg.members.Remove(midkey)\n}\n"},{"name":"groups.gno","body":"package groups\n\nimport (\n\t\"regexp\"\n\n\t\"gno.land/p/demo/avl\"\n)\n\n//----------------------------------------\n// Realm (package) state\n\nvar (\n\tgGroups avl.Tree // id -\u003e *Group\n\tgGroupsCtr int // increments Group.id\n\tgGroupsByName avl.Tree // name -\u003e *Group\n)\n\n//----------------------------------------\n// Constants\n\nvar reName = regexp.MustCompile(`^[a-z]+[_a-z0-9]{2,29}$`)\n"},{"name":"member.gno","body":"package groups\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\t\"time\"\n)\n\ntype MemberID uint64\n\ntype Member struct {\n\tid MemberID\n\taddress std.Address\n\tweight int\n\tmetadata string\n\tcreatedAt time.Time\n}\n\nfunc (mid MemberID) String() string {\n\treturn strconv.Itoa(int(mid))\n}\n\nfunc (member *Member) getMemberStr() string {\n\tmemberDataStr := \"\"\n\tmemberDataStr += \"\\t\\t\\t[\" + memberIDKey(member.id) + \", \" + member.address.String() + \", \" + strconv.Itoa(member.weight) + \", \" + member.metadata + \", \" + member.createdAt.String() + \"],\\n\\n\"\n\treturn memberDataStr\n}\n"},{"name":"misc.gno","body":"package groups\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"gno.land/r/demo/users\"\n)\n\n//----------------------------------------\n// private utility methods\n// XXX ensure these cannot be called from public.\n\nfunc getGroup(gid GroupID) *Group {\n\tgidkey := groupIDKey(gid)\n\tgroup_, exists := gGroups.Get(gidkey)\n\tif !exists {\n\t\tpanic(\"group id (\" + gid.String() + \") does not exists\")\n\t}\n\tgroup := group_.(*Group)\n\treturn group\n}\n\nfunc incGetGroupID() GroupID {\n\tgGroupsCtr++\n\treturn GroupID(gGroupsCtr)\n}\n\nfunc padLeft(str string, length int) string {\n\tif len(str) \u003e= length {\n\t\treturn str\n\t}\n\treturn strings.Repeat(\" \", length-len(str)) + str\n}\n\nfunc padZero(u64 uint64, length int) string {\n\tstr := strconv.Itoa(int(u64))\n\tif len(str) \u003e= length {\n\t\treturn str\n\t}\n\treturn strings.Repeat(\"0\", length-len(str)) + str\n}\n\nfunc groupIDKey(gid GroupID) string {\n\treturn padZero(uint64(gid), 10)\n}\n\nfunc memberIDKey(mid MemberID) string {\n\treturn padZero(uint64(mid), 10)\n}\n\nfunc indentBody(indent string, body string) string {\n\tlines := strings.Split(body, \"\\n\")\n\tres := \"\"\n\tfor i, line := range lines {\n\t\tif i \u003e 0 {\n\t\t\tres += \"\\n\"\n\t\t}\n\t\tres += indent + line\n\t}\n\treturn res\n}\n\n// NOTE: length must be greater than 3.\nfunc summaryOf(str string, length int) string {\n\tlines := strings.SplitN(str, \"\\n\", 2)\n\tline := lines[0]\n\tif len(line) \u003e length {\n\t\tline = line[:(length-3)] + \"...\"\n\t} else if len(lines) \u003e 1 {\n\t\t// len(line) \u003c= 80\n\t\tline = line + \"...\"\n\t}\n\treturn line\n}\n\nfunc displayAddressMD(addr std.Address) string {\n\tuser := users.GetUserByAddress(addr)\n\tif user == nil {\n\t\treturn \"[\" + addr.String() + \"](/r/demo/users:\" + addr.String() + \")\"\n\t}\n\treturn \"[@\" + user.Name + \"](/r/demo/users:\" + user.Name + \")\"\n}\n\nfunc usernameOf(addr std.Address) string {\n\tuser := users.GetUserByAddress(addr)\n\tif user == nil {\n\t\tpanic(\"user not found\")\n\t}\n\treturn user.Name\n}\n\nfunc isValidPermission(perm Permission) bool {\n\treturn perm == EditPermission || perm == DeletePermission\n}\n"},{"name":"public.gno","body":"package groups\n\nimport (\n\t\"std\"\n\n\t\"gno.land/r/demo/users\"\n)\n\n//----------------------------------------\n// Public facing functions\n\nfunc GetGroupIDFromName(name string) (GroupID, bool) {\n\tgroupI, exists := gGroupsByName.Get(name)\n\tif !exists {\n\t\treturn 0, false\n\t}\n\treturn groupI.(*Group).id, true\n}\n\nfunc CreateGroup(name string) GroupID {\n\tstd.AssertOriginCall()\n\tcaller := std.GetOrigCaller()\n\tusernameOf(caller)\n\turl := \"/r/demo/groups:\" + name\n\tgroup := newGroup(url, name, caller)\n\tgidkey := groupIDKey(group.id)\n\tgGroups.Set(gidkey, group)\n\tgGroupsByName.Set(name, group)\n\treturn group.id\n}\n\nfunc AddMember(gid GroupID, address string, weight int, metadata string) MemberID {\n\tstd.AssertOriginCall()\n\tcaller := std.GetOrigCaller()\n\tusernameOf(caller)\n\tgroup := getGroup(gid)\n\tif !group.HasPermission(caller, EditPermission) {\n\t\tpanic(\"unauthorized to edit group\")\n\t}\n\tuser := users.GetUserByAddress(std.Address(address))\n\tif user == nil {\n\t\tpanic(\"unknown address \" + address)\n\t}\n\tmid := group.lastMemberID\n\tmember := group.newMember(mid, std.Address(address), weight, metadata)\n\tmidkey := memberIDKey(mid)\n\tgroup.members.Set(midkey, member)\n\tmid++\n\tgroup.lastMemberID = mid\n\treturn member.id\n}\n\nfunc DeleteGroup(gid GroupID) {\n\tstd.AssertOriginCall()\n\tcaller := std.GetOrigCaller()\n\tgroup := getGroup(gid)\n\tif !group.HasPermission(caller, DeletePermission) {\n\t\tpanic(\"unauthorized to delete group\")\n\t}\n\tgroup.deleteGroup()\n}\n\nfunc DeleteMember(gid GroupID, mid MemberID) {\n\tstd.AssertOriginCall()\n\tcaller := std.GetOrigCaller()\n\tgroup := getGroup(gid)\n\tif !group.HasPermission(caller, DeletePermission) {\n\t\tpanic(\"unauthorized to delete member\")\n\t}\n\tgroup.deleteMember(mid)\n}\n"},{"name":"render.gno","body":"package groups\n\nimport (\n\t\"strings\"\n)\n\n//----------------------------------------\n// Render functions\n\nfunc RenderGroup(gid GroupID) string {\n\tgroup := getGroup(gid)\n\tif group == nil {\n\t\treturn \"missing Group\"\n\t}\n\treturn group.RenderGroup()\n}\n\nfunc Render(path string) string {\n\tif path == \"\" {\n\t\tstr := \"List of all Groups:\\n\\n\"\n\t\tgGroups.Iterate(\"\", \"\", func(key string, value interface{}) bool {\n\t\t\tgroup := value.(*Group)\n\t\t\tstr += \" * [\" + group.name + \"](\" + group.url + \")\\n\"\n\t\t\treturn false\n\t\t})\n\t\treturn str\n\t}\n\tparts := strings.Split(path, \"/\")\n\tif len(parts) == 1 {\n\t\t// /r/demo/groups:Group_NAME\n\t\tname := parts[0]\n\t\tgroupI, exists := gGroupsByName.Get(name)\n\t\tif !exists {\n\t\t\treturn \"Group does not exist: \" + name\n\t\t}\n\t\treturn groupI.(*Group).RenderGroup()\n\t} else {\n\t\treturn \"unrecognized path \" + path\n\t}\n}\n"},{"name":"role.gno","body":"package groups\n\ntype Permission string\n\nconst (\n\tDeletePermission Permission = \"role:delete\"\n\tEditPermission Permission = \"role:edit\"\n)\n"},{"name":"z_0_a_filetest.gno","body":"// PKGPATH: gno.land/r/demo/groups_test\npackage groups_test\n\nimport (\n\t\"gno.land/r/demo/groups\"\n)\n\nvar gid groups.GroupID\n\nfunc main() {\n\tgid = groups.CreateGroup(\"test_group\")\n\tprintln(gid)\n\tprintln(groups.Render(\"\"))\n}\n\n// Error:\n// user not found\n"},{"name":"z_0_b_filetest.gno","body":"// PKGPATH: gno.land/r/demo/groups_test\npackage groups_test\n\nimport (\n\t\"gno.land/r/demo/groups\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar gid groups.GroupID\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tgid = groups.CreateGroup(\"test_group\")\n\tprintln(gid)\n\tprintln(groups.Render(\"\"))\n}\n\n// Error:\n// payment must not be less than 20000000\n"},{"name":"z_0_c_filetest.gno","body":"// PKGPATH: gno.land/r/demo/groups_test\npackage groups_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"gno.land/r/demo/groups\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar gid groups.GroupID\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tgid = groups.CreateGroup(\"test_group\")\n\tprintln(gid)\n\tprintln(groups.Render(\"\"))\n}\n\n// Output:\n// 1\n// List of all Groups:\n//\n// * [test_group](/r/demo/groups:test_group)\n"},{"name":"z_1_a_filetest.gno","body":"// PKGPATH: gno.land/r/demo/groups_test\npackage groups_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/groups\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar gid groups.GroupID\n\nconst admin = std.Address(\"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq\")\n\nfunc main() {\n\tcaller := std.GetOrigCaller() // main\n\tusers.Register(\"\", \"gnouser0\", \"my profile 1\")\n\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\")\n\t// switch back to caller\n\tstd.TestSetOrigCaller(caller)\n\t// invite another addr\n\ttest1 := testutils.TestAddress(\"gnouser1\")\n\tusers.Invite(test1.String())\n\t// switch to test1\n\tstd.TestSetOrigCaller(test1)\n\tusers.Register(caller, \"gnouser1\", \"my other profile 1\")\n\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\")\n\t// switch back to caller\n\tstd.TestSetOrigCaller(caller)\n\t// invite another addr\n\ttest2 := testutils.TestAddress(\"gnouser2\")\n\tusers.Invite(test2.String())\n\t// switch to test1\n\tstd.TestSetOrigCaller(test2)\n\tusers.Register(caller, \"gnouser2\", \"my other profile 2\")\n\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\")\n\t// switch back to caller\n\tstd.TestSetOrigCaller(caller)\n\t// invite another addr\n\ttest3 := testutils.TestAddress(\"gnouser3\")\n\tusers.Invite(test3.String())\n\t// switch to test1\n\tstd.TestSetOrigCaller(test3)\n\tusers.Register(caller, \"gnouser3\", \"my other profile 3\")\n\n\tstd.TestSetOrigCaller(caller)\n\n\tgid = groups.CreateGroup(\"test_group\")\n\tprintln(gid)\n\n\tgroups.AddMember(gid, test3.String(), 32, \"i am from UAE\")\n\tprintln(groups.Render(\"test_group\"))\n}\n\n// Output:\n// 1\n// Group ID: 0000000001\n//\n// Group Name: test_group\n//\n// Group Creator: gnouser0\n//\n// Group createdAt: 2009-02-13 23:31:30 +0000 UTC m=+1234567890.000000001\n//\n// Group Last MemberID: 0000000001\n//\n// Group Members:\n//\n// \t\t\t[0000000000, g1vahx7atnv4erxh6lta047h6lta047h6ll85gpy, 32, i am from UAE, 2009-02-13 23:31:30 +0000 UTC m=+1234567890.000000001],\n"},{"name":"z_1_b_filetest.gno","body":"// PKGPATH: gno.land/r/demo/groups_test\npackage groups_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"gno.land/r/demo/groups\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar gid groups.GroupID\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tgid = groups.CreateGroup(\"test_group\")\n\tprintln(gid)\n\tgroups.AddMember(2, \"g1vahx7atnv4erxh6lta047h6lta047h6ll85gpy\", 55, \"metadata3\")\n\tprintln(groups.Render(\"\"))\n}\n\n// Error:\n// group id (2) does not exists\n"},{"name":"z_1_c_filetest.gno","body":"// PKGPATH: gno.land/r/demo/groups_test\npackage groups_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/groups\"\n)\n\nvar gid groups.GroupID\n\nfunc main() {\n\tgid = groups.CreateGroup(\"test_group\")\n\tprintln(gid)\n\n\t// add member via anon user\n\ttest2 := testutils.TestAddress(\"test2\")\n\tstd.TestSetOrigCaller(test2)\n\tstd.TestSetOrigSend(std.Coins{{\"ugnot\", 9000000}}, nil)\n\n\tgroups.AddMember(gid, test2.String(), 42, \"metadata3\")\n}\n\n// Error:\n// user not found\n"},{"name":"z_2_a_filetest.gno","body":"// PKGPATH: gno.land/r/demo/groups_test\npackage groups_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/groups\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar gid groups.GroupID\n\nconst admin = std.Address(\"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq\")\n\nfunc main() {\n\tcaller := std.GetOrigCaller() // main\n\tusers.Register(\"\", \"gnouser0\", \"my profile 1\")\n\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\")\n\t// switch back to caller\n\tstd.TestSetOrigCaller(caller)\n\t// invite another addr\n\ttest1 := testutils.TestAddress(\"gnouser1\")\n\tusers.Invite(test1.String())\n\t// switch to test1\n\tstd.TestSetOrigCaller(test1)\n\tusers.Register(caller, \"gnouser1\", \"my other profile 1\")\n\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\")\n\t// switch back to caller\n\tstd.TestSetOrigCaller(caller)\n\t// invite another addr\n\ttest2 := testutils.TestAddress(\"gnouser2\")\n\tusers.Invite(test2.String())\n\t// switch to test1\n\tstd.TestSetOrigCaller(test2)\n\tusers.Register(caller, \"gnouser2\", \"my other profile 2\")\n\n\tstd.TestSetOrigCaller(admin)\n\tusers.GrantInvites(caller.String() + \":1\")\n\t// switch back to caller\n\tstd.TestSetOrigCaller(caller)\n\t// invite another addr\n\ttest3 := testutils.TestAddress(\"gnouser3\")\n\tusers.Invite(test3.String())\n\t// switch to test1\n\tstd.TestSetOrigCaller(test3)\n\tusers.Register(caller, \"gnouser3\", \"my other profile 3\")\n\n\tstd.TestSetOrigCaller(caller)\n\n\tgid = groups.CreateGroup(\"test_group\")\n\tprintln(gid)\n\n\tgroups.AddMember(gid, test2.String(), 42, \"metadata3\")\n\n\tgroups.DeleteMember(gid, 0)\n\tprintln(groups.RenderGroup(gid))\n}\n\n// Output:\n// 1\n// Group ID: 0000000001\n//\n// Group Name: test_group\n//\n// Group Creator: gnouser0\n//\n// Group createdAt: 2009-02-13 23:31:30 +0000 UTC m=+1234567890.000000001\n//\n// Group Last MemberID: 0000000001\n//\n// Group Members:\n"},{"name":"z_2_b_filetest.gno","body":"// PKGPATH: gno.land/r/demo/groups_test\npackage groups_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"gno.land/r/demo/groups\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar gid groups.GroupID\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tgid = groups.CreateGroup(\"test_group\")\n\tprintln(gid)\n\tgroups.DeleteMember(2, 0)\n\tprintln(groups.Render(\"\"))\n}\n\n// Error:\n// group id (2) does not exists\n"},{"name":"z_2_d_filetest.gno","body":"// PKGPATH: gno.land/r/demo/groups_test\npackage groups_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/groups\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar gid groups.GroupID\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tgid = groups.CreateGroup(\"test_group\")\n\tprintln(gid)\n\n\t// delete member via anon user\n\ttest2 := testutils.TestAddress(\"test2\")\n\tstd.TestSetOrigCaller(test2)\n\tstd.TestSetOrigSend(std.Coins{{\"ugnot\", 9000000}}, nil)\n\n\tgroups.DeleteMember(gid, 0)\n\tprintln(groups.Render(\"\"))\n}\n\n// Error:\n// unauthorized to delete member\n"},{"name":"z_2_e_filetest.gno","body":"// PKGPATH: gno.land/r/demo/groups_test\npackage groups_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"gno.land/r/demo/groups\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar gid groups.GroupID\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tgid = groups.CreateGroup(\"test_group\")\n\tprintln(gid)\n\tgroups.DeleteGroup(gid)\n\tprintln(groups.Render(\"\"))\n}\n\n// Output:\n// 1\n// List of all Groups:\n"},{"name":"z_2_f_filetest.gno","body":"// PKGPATH: gno.land/r/demo/groups_test\npackage groups_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"gno.land/r/demo/groups\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar gid groups.GroupID\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tgid = groups.CreateGroup(\"test_group\")\n\tprintln(gid)\n\tgroups.DeleteGroup(20)\n\tprintln(groups.Render(\"\"))\n}\n\n// Error:\n// group id (20) does not exists\n"},{"name":"z_2_g_filetest.gno","body":"// PKGPATH: gno.land/r/demo/groups_test\npackage groups_test\n\n// SEND: 200000000ugnot\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/groups\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar gid groups.GroupID\n\nfunc main() {\n\tusers.Register(\"\", \"gnouser\", \"my profile\")\n\tgid = groups.CreateGroup(\"test_group\")\n\tprintln(gid)\n\n\t// delete group via anon user\n\ttest2 := testutils.TestAddress(\"test2\")\n\tstd.TestSetOrigCaller(test2)\n\tstd.TestSetOrigSend(std.Coins{{\"ugnot\", 9000000}}, nil)\n\n\tgroups.DeleteGroup(gid)\n\tprintln(groups.Render(\"\"))\n}\n\n// Error:\n// unauthorized to delete group\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} {"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"keystore","path":"gno.land/r/demo/keystore","files":[{"name":"keystore.gno","body":"package keystore\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar data avl.Tree\n\nconst (\n\tBaseURL = \"/r/demo/keystore\"\n\tStatusOK = \"ok\"\n\tStatusNoUser = \"user not found\"\n\tStatusNotFound = \"key not found\"\n\tStatusNoWriteAccess = \"no write access\"\n\tStatusCouldNotExecute = \"could not execute\"\n\tStatusNoDatabases = \"no databases\"\n)\n\nfunc init() {\n\tdata = avl.Tree{} // user -\u003e avl.Tree\n}\n\n// KeyStore stores the owner-specific avl.Tree\ntype KeyStore struct {\n\tOwner std.Address\n\tData avl.Tree\n}\n\n// Set will set a value to a key\n// requires write-access (original caller must be caller)\nfunc Set(k, v string) string {\n\torigOwner := std.GetOrigCaller()\n\treturn set(origOwner.String(), k, v)\n}\n\n// set (private) will set a key to value\n// requires write-access (original caller must be caller)\nfunc set(owner, k, v string) string {\n\torigOwner := std.GetOrigCaller()\n\tif origOwner.String() != owner {\n\t\treturn StatusNoWriteAccess\n\t}\n\tvar keystore *KeyStore\n\tkeystoreInterface, exists := data.Get(owner)\n\tif !exists {\n\t\tkeystore = \u0026KeyStore{\n\t\t\tOwner: origOwner,\n\t\t\tData: avl.Tree{},\n\t\t}\n\t\tdata.Set(owner, keystore)\n\t} else {\n\t\tkeystore = keystoreInterface.(*KeyStore)\n\t}\n\tkeystore.Data.Set(k, v)\n\treturn StatusOK\n}\n\n// Remove removes a key\n// requires write-access (original owner must be caller)\nfunc Remove(k string) string {\n\torigOwner := std.GetOrigCaller()\n\treturn remove(origOwner.String(), k)\n}\n\n// remove (private) removes a key\n// requires write-access (original owner must be caller)\nfunc remove(owner, k string) string {\n\torigOwner := std.GetOrigCaller()\n\tif origOwner.String() != owner {\n\t\treturn StatusNoWriteAccess\n\t}\n\tvar keystore *KeyStore\n\tkeystoreInterface, exists := data.Get(owner)\n\tif !exists {\n\t\tkeystore = \u0026KeyStore{\n\t\t\tOwner: origOwner,\n\t\t\tData: avl.Tree{},\n\t\t}\n\t\tdata.Set(owner, keystore)\n\t} else {\n\t\tkeystore = keystoreInterface.(*KeyStore)\n\t}\n\t_, removed := keystore.Data.Remove(k)\n\tif !removed {\n\t\treturn StatusCouldNotExecute\n\t}\n\treturn StatusOK\n}\n\n// Get returns a value for a key\n// read-only\nfunc Get(k string) string {\n\torigOwner := std.GetOrigCaller()\n\treturn remove(origOwner.String(), k)\n}\n\n// get (private) returns a value for a key\n// read-only\nfunc get(owner, k string) string {\n\tkeystoreInterface, exists := data.Get(owner)\n\tif !exists {\n\t\treturn StatusNoUser\n\t}\n\tkeystore := keystoreInterface.(*KeyStore)\n\tval, found := keystore.Data.Get(k)\n\tif !found {\n\t\treturn StatusNotFound\n\t}\n\treturn val.(string)\n}\n\n// Size returns size of database\n// read-only\nfunc Size() string {\n\torigOwner := std.GetOrigCaller()\n\treturn size(origOwner.String())\n}\n\nfunc size(owner string) string {\n\tkeystoreInterface, exists := data.Get(owner)\n\tif !exists {\n\t\treturn StatusNoUser\n\t}\n\tkeystore := keystoreInterface.(*KeyStore)\n\treturn ufmt.Sprintf(\"%d\", keystore.Data.Size())\n}\n\n// Render provides read-only url access to the functions of the keystore\n// \"\" -\u003e show all keystores listed by owner\n// \"owner\" -\u003e show all keys for that owner's keystore\n// \"owner:size\" -\u003e returns size of owner's keystore\n// \"owner:get:key\" -\u003e show value for that key in owner's keystore\nfunc Render(p string) string {\n\tvar response string\n\targs := strings.Split(p, \":\")\n\tnumArgs := len(args)\n\tif p == \"\" {\n\t\tnumArgs = 0\n\t}\n\tswitch numArgs {\n\tcase 0:\n\t\tif data.Size() == 0 {\n\t\t\treturn StatusNoDatabases\n\t\t}\n\t\tdata.Iterate(\"\", \"\", func(key string, value interface{}) bool {\n\t\t\tks := value.(*KeyStore)\n\t\t\tresponse += ufmt.Sprintf(\"- [%s](%s:%s) (%d keys)\\n\", ks.Owner, BaseURL, ks.Owner, ks.Data.Size())\n\t\t\treturn false\n\t\t})\n\tcase 1:\n\t\towner := args[0]\n\t\tkeystoreInterface, exists := data.Get(owner)\n\t\tif !exists {\n\t\t\treturn StatusNoUser\n\t\t}\n\t\tks := keystoreInterface.(*KeyStore)\n\t\ti := 0\n\t\tresponse += ufmt.Sprintf(\"# %s database\\n\\n\", ks.Owner)\n\t\tks.Data.Iterate(\"\", \"\", func(key string, value interface{}) bool {\n\t\t\tresponse += ufmt.Sprintf(\"- %d [%s](%s:%s:get:%s)\\n\", i, key, BaseURL, ks.Owner, key)\n\t\t\ti++\n\t\t\treturn false\n\t\t})\n\tcase 2:\n\t\towner := args[0]\n\t\tcmd := args[1]\n\t\tif cmd == \"size\" {\n\t\t\treturn size(owner)\n\t\t}\n\tcase 3:\n\t\towner := args[0]\n\t\tcmd := args[1]\n\t\tkey := args[2]\n\t\tif cmd == \"get\" {\n\t\t\treturn get(owner, key)\n\t\t}\n\t}\n\n\treturn response\n}\n"},{"name":"keystore_test.gno","body":"package keystore\n\nimport (\n\t\"std\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/p/demo/uassert\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nfunc TestRender(t *testing.T) {\n\tconst (\n\t\tauthor1 std.Address = testutils.TestAddress(\"author1\")\n\t\tauthor2 std.Address = testutils.TestAddress(\"author2\")\n\t)\n\n\ttt := []struct {\n\t\tcaller std.Address\n\t\towner std.Address\n\t\tps []string\n\t\texp string\n\t}{\n\t\t// can set database if the owner is the caller\n\t\t{author1, author1, []string{\"set\", \"hello\", \"gno\"}, StatusOK},\n\t\t{author1, author1, []string{\"size\"}, \"1\"},\n\t\t{author1, author1, []string{\"set\", \"hello\", \"world\"}, StatusOK},\n\t\t{author1, author1, []string{\"size\"}, \"1\"},\n\t\t{author1, author1, []string{\"set\", \"hi\", \"gno\"}, StatusOK},\n\t\t{author1, author1, []string{\"size\"}, \"2\"},\n\t\t// only owner can remove\n\t\t{author1, author1, []string{\"remove\", \"hi\"}, StatusOK},\n\t\t{author1, author1, []string{\"get\", \"hi\"}, StatusNotFound},\n\t\t{author1, author1, []string{\"size\"}, \"1\"},\n\t\t// add back\n\t\t{author1, author1, []string{\"set\", \"hi\", \"gno\"}, StatusOK},\n\t\t{author1, author1, []string{\"size\"}, \"2\"},\n\n\t\t// different owner has different database\n\t\t{author2, author2, []string{\"set\", \"hello\", \"universe\"}, StatusOK},\n\t\t// either author can get the other info\n\t\t{author1, author2, []string{\"get\", \"hello\"}, \"universe\"},\n\t\t// either author can get the other info\n\t\t{author2, author1, []string{\"get\", \"hello\"}, \"world\"},\n\t\t{author1, author2, []string{\"get\", \"hello\"}, \"universe\"},\n\t\t// anyone can view the databases\n\t\t{author1, author2, []string{}, `- [g1v96hg6r0wgc47h6lta047h6lta047h6lm33tq6](/r/demo/keystore:g1v96hg6r0wgc47h6lta047h6lta047h6lm33tq6) (2 keys)\n- [g1v96hg6r0wge97h6lta047h6lta047h6lyz7c00](/r/demo/keystore:g1v96hg6r0wge97h6lta047h6lta047h6lyz7c00) (1 keys)`},\n\t\t// anyone can view the keys in a database\n\t\t{author1, author2, []string{\"\"}, `# g1v96hg6r0wge97h6lta047h6lta047h6lyz7c00 database\n\n- 0 [hello](/r/demo/keystore:g1v96hg6r0wge97h6lta047h6lta047h6lyz7c00:get:hello)`},\n\t}\n\tfor _, tc := range tt {\n\t\tp := \"\"\n\t\tif len(tc.ps) \u003e 0 {\n\t\t\tp = tc.owner.String()\n\t\t\tfor i, psv := range tc.ps {\n\t\t\t\tp += \":\" + psv\n\t\t\t}\n\t\t}\n\t\tp = strings.TrimSuffix(p, \":\")\n\t\tt.Run(p, func(t *testing.T) {\n\t\t\tstd.TestSetOrigCaller(tc.caller)\n\t\t\tvar act string\n\t\t\tif len(tc.ps) \u003e 0 \u0026\u0026 tc.ps[0] == \"set\" {\n\t\t\t\tact = strings.TrimSpace(Set(tc.ps[1], tc.ps[2]))\n\t\t\t} else if len(tc.ps) \u003e 0 \u0026\u0026 tc.ps[0] == \"remove\" {\n\t\t\t\tact = strings.TrimSpace(Remove(tc.ps[1]))\n\t\t\t} else {\n\t\t\t\tact = strings.TrimSpace(Render(p))\n\t\t\t}\n\n\t\t\tuassert.Equal(t, tc.exp, act, ufmt.Sprintf(\"%v -\u003e '%s'\", tc.ps, p))\n\t\t})\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} {"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"markdown","path":"gno.land/r/demo/markdown_test","files":[{"name":"markdown.gno","body":"package markdown\n\n// this package can be used to test markdown rendering engines.\n\nfunc Render(path string) string {\n\toutput := `_imported from https://github.com/markedjs/marked/blob/master/docs/demo/quickref.md_\n\nMarkdown Quick Reference\n========================\n\nThis guide is a very brief overview, with examples, of the syntax that [Markdown] supports. It is itself written in Markdown and you can copy the samples over to the left-hand pane for experimentation. It's shown as *text* and not *rendered HTML*.\n\n[Markdown]: http://daringfireball.net/projects/markdown/\n\n\nSimple Text Formatting\n======================\n\nFirst thing is first. You can use *stars* or _underscores_ for italics. **Double stars** and __double underscores__ for bold. ***Three together*** for ___both___.\n\nParagraphs are pretty easy too. Just have a blank line between chunks of text.\n\n\u003e This chunk of text is in a block quote. Its multiple lines will all be\n\u003e indented a bit from the rest of the text.\n\u003e\n\u003e \u003e Multiple levels of block quotes also work.\n\nSometimes you want to include code, such as when you are explaining how ` + \"`\u003ch1\u003e`\" + ` HTML tags work, or maybe you are a programmer and you are discussing ` + \"`someMethod()`\" + `.\n\nIf you want to include code and have new\nlines preserved, indent the line with a tab\nor at least four spaces:\n\n Extra spaces work here too.\n This is also called preformatted text and it is useful for showing examples.\n The text will stay as text, so any *markdown* or \u003cu\u003eHTML\u003c/u\u003e you add will\n not show up formatted. This way you can show markdown examples in a\n markdown document.\n\n\u003e You can also use preformatted text with your blockquotes\n\u003e as long as you add at least five spaces.\n\n\nHeadings\n========\n\nThere are a couple of ways to make headings. Using three or more equals signs on a line under a heading makes it into an \"h1\" style. Three or more hyphens under a line makes it \"h2\" (slightly smaller). You can also use multiple pound symbols (` + \"`#`\" + `) before and after a heading. Pounds after the title are ignored. Here are some examples:\n\nThis is H1\n==========\n\nThis is H2\n----------\n\n# This is H1\n## This is H2\n### This is H3 with some extra pounds ###\n#### You get the idea ####\n##### I don't need extra pounds at the end\n###### H6 is the max\n\n\nLinks\n=====\n\nLet's link to a few sites. First, let's use the bare URL, like \u003chttps://www.github.com\u003e. Great for text, but ugly for HTML.\nNext is an inline link to [Google](https://www.google.com). A little nicer.\nThis is a reference-style link to [Wikipedia] [1].\nLastly, here's a pretty link to [Yahoo]. The reference-style and pretty links both automatically use the links defined below, but they could be defined *anywhere* in the markdown and are removed from the HTML. The names are also case insensitive, so you can use [YaHoO] and have it link properly.\n\n[1]: https://www.wikipedia.org\n[Yahoo]: https://www.yahoo.com\n\nTitle attributes may be added to links by adding text after a link.\nThis is the [inline link](https://www.bing.com \"Bing\") with a \"Bing\" title.\nYou can also go to [W3C] [2] and maybe visit a [friend].\n\n[2]: https://w3c.org (The W3C puts out specs for web-based things)\n[Friend]: https://facebook.com \"Facebook!\"\n\nEmail addresses in plain text are not linked: test@example.com.\nEmail addresses wrapped in angle brackets are linked: \u003ctest@example.com\u003e.\nThey are also obfuscated so that email harvesting spam robots hopefully won't get them.\n\n\nLists\n=====\n\n* This is a bulleted list\n* Great for shopping lists\n- You can also use hyphens\n+ Or plus symbols\n\nThe above is an \"unordered\" list. Now, on for a bit of order.\n\n1. Numbered lists are also easy\n2. Just start with a number\n3738762. However, the actual number doesn't matter when converted to HTML.\n1. This will still show up as 4.\n\nYou might want a few advanced lists:\n\n- This top-level list is wrapped in paragraph tags\n- This generates an extra space between each top-level item.\n\n- You do it by adding a blank line\n\n- This nested list also has blank lines between the list items.\n\n- How to create nested lists\n 1. Start your regular list\n 2. Indent nested lists with two spaces\n 3. Further nesting means you should indent with two more spaces\n * This line is indented with four spaces.\n\n- List items can be quite lengthy. You can keep typing and either continue\nthem on the next line with no indentation.\n\n- Alternately, if that looks ugly, you can also\n indent the next line a bit for a prettier look.\n\n- You can put large blocks of text in your list by just indenting with two spaces.\n\n This is formatted the same as code, but you can inspect the HTML\n and find that it's just wrapped in a ` + \"`\u003cp\u003e`\" + ` tag and *won't* be shown\n as preformatted text.\n\n You can keep adding more and more paragraphs to a single\n list item by adding the traditional blank line and then keep\n on indenting the paragraphs with two spaces.\n\n You really only need to indent the first line,\nbut that looks ugly.\n\n- Lists support blockquotes\n\n \u003e Just like this example here. By the way, you can\n \u003e nest lists inside blockquotes!\n \u003e - Fantastic!\n\n- Lists support preformatted text\n\n You just need to indent an additional four spaces.\n\n\nEven More\n=========\n\nHorizontal Rule\n---------------\n\nIf you need a horizontal rule you just need to put at least three hyphens, asterisks, or underscores on a line by themselves. You can also even put spaces between the characters.\n\n---\n****************************\n_ _ _ _ _ _ _\n\nThose three all produced horizontal lines. Keep in mind that three hyphens under any text turns that text into a heading, so add a blank like if you use hyphens.\n\nImages\n------\n\nImages work exactly like links, but they have exclamation points in front. They work with references and titles too.\n\n![Google Logo](https://www.google.com/images/errors/logo_sm.gif) and ![Happy].\n\n[Happy]: https://wpclipart.com/smiley/happy/simple_colors/smiley_face_simple_green_small.png (\"Smiley face\")\n\n\nInline HTML\n-----------\n\nIf markdown is too limiting, you can just insert your own \u003cstrike\u003ecrazy\u003c/strike\u003e HTML. Span-level HTML \u003cu\u003ecan *still* use markdown\u003c/u\u003e. Block level elements must be separated from text by a blank line and must not have any spaces before the opening and closing HTML.\n\n\u003cdiv style='font-family: \"Comic Sans MS\", \"Comic Sans\", cursive;'\u003e\nIt is a pity, but markdown does **not** work in here for most markdown parsers.\n[Marked] handles it pretty well.\n\u003c/div\u003e`\n\treturn output\n}\n"},{"name":"markdown_test.gno","body":"package markdown\n\nimport (\n\t\"strings\"\n\t\"testing\"\n)\n\nfunc TestRender(t *testing.T) {\n\toutput := Render(\"\")\n\tif !strings.Contains(output, \"\\nMarkdown Quick Reference\\n\") {\n\t\tt.Errorf(\"invalid output\")\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} {"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"eval","path":"gno.land/r/demo/math_eval","files":[{"name":"math_eval.gno","body":"// eval realm is capable of evaluating 32-bit integer\n// expressions as they would appear in Go. For example:\n// /r/demo/math_eval:(4+12)/2-1+11*15\npackage eval\n\nimport (\n\tevalint32 \"gno.land/p/demo/math_eval/int32\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nfunc Render(p string) string {\n\tif len(p) == 0 {\n\t\treturn `\nevaluates 32-bit integer expressions. for example:\n\t\t\n[(4+12)/2-1+11*15](/r/demo/math_eval:(4+12)/2-1+11*15)\n\n`\n\t}\n\texpr, err := evalint32.Parse(p)\n\tif err != nil {\n\t\treturn err.Error()\n\t}\n\tres, err := evalint32.Eval(expr, nil)\n\tif err != nil {\n\t\treturn err.Error()\n\t}\n\n\treturn ufmt.Sprintf(\"%s = %d\", p, res)\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} @@ -100,43 +100,42 @@ {"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"ui","path":"gno.land/r/demo/ui","files":[{"name":"ui.gno","body":"package ui\n\nimport \"gno.land/p/demo/ui\"\n\nfunc Render(path string) string {\n\t// TODO: build this realm as a demo one with one page per feature.\n\n\t// TODO: pagination\n\t// TODO: non-standard markdown\n\t// TODO: error, warn\n\t// TODO: header\n\t// TODO: HTML\n\t// TODO: toc\n\t// TODO: forms\n\t// TODO: comments\n\n\tdom := ui.DOM{\n\t\tPrefix: \"r/demo/ui:\",\n\t}\n\n\tdom.Title = \"UI Demo\"\n\n\tdom.Header.Append(ui.Breadcrumb{\n\t\tui.Link{Text: \"foo\", Path: \"foo\"},\n\t\tui.Link{Text: \"bar\", Path: \"foo/bar\"},\n\t})\n\n\tdom.Body.Append(\n\t\tui.Paragraph(\"Simple UI demonstration.\"),\n\t\tui.BulletList{\n\t\t\tui.Text(\"a text\"),\n\t\t\tui.Link{Text: \"a relative link\", Path: \"foobar\"},\n\t\t\tui.Text(\"another text\"),\n\t\t\t// ui.H1(\"a H1 text\"),\n\t\t\tui.Bold(\"a bold text\"),\n\t\t\tui.Italic(\"italic text\"),\n\t\t\tui.Text(\"raw markdown with **bold** text in the middle.\"),\n\t\t\tui.Code(\"some inline code\"),\n\t\t\tui.Link{Text: \"a remote link\", URL: \"https://gno.land\"},\n\t\t},\n\t)\n\n\tdom.Footer.Append(ui.Text(\"I'm the footer.\"))\n\tdom.Body.Append(ui.Text(\"another string.\"))\n\tdom.Body.Append(ui.Paragraph(\"a paragraph.\"), ui.HR{})\n\n\treturn dom.String()\n}\n"},{"name":"ui_test.gno","body":"package ui\n\nimport (\n\t\"testing\"\n\n\t\"gno.land/p/demo/uassert\"\n)\n\nfunc TestRender(t *testing.T) {\n\tgot := Render(\"\")\n\texpected := \"# UI Demo\\n\\n[foo](r/demo/ui:foo) / [bar](r/demo/ui:foo/bar)\\n\\n\\nSimple UI demonstration.\\n\\n- a text\\n- [a relative link](r/demo/ui:foobar)\\n- another text\\n- **a bold text**\\n- _italic text_\\n- raw markdown with **bold** text in the middle.\\n- `some inline code`\\n- [a remote link](https://gno.land)\\n\\nanother string.\\n\\na paragraph.\\n\\n\\n---\\n\\n\\nI'm the footer.\\n\\n\"\n\tuassert.Equal(t, expected, got)\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} {"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"userbook","path":"gno.land/r/demo/userbook","files":[{"name":"userbook.gno","body":"// This realm demonstrates a small userbook system working with gnoweb\npackage userbook\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/mux\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\ntype Signup struct {\n\taccount string\n\theight int64\n}\n\n// signups - keep a slice of signed up addresses efficient pagination\nvar signups []Signup\n\n// tracker - keep track of who signed up\nvar (\n\ttracker *avl.Tree\n\trouter *mux.Router\n)\n\nconst (\n\tdefaultPageSize = 20\n\tpathArgument = \"number\"\n\tsubPath = \"page/{\" + pathArgument + \"}\"\n\tsignUpEvent = \"SignUp\"\n)\n\nfunc init() {\n\t// Set up tracker tree\n\ttracker = avl.NewTree()\n\n\t// Set up route handling\n\trouter = mux.NewRouter()\n\trouter.HandleFunc(\"\", renderHelper)\n\trouter.HandleFunc(subPath, renderHelper)\n\n\t// Sign up the deployer\n\tSignUp()\n}\n\nfunc SignUp() string {\n\t// Get transaction caller\n\tcaller := std.PrevRealm().Addr().String()\n\theight := std.GetHeight()\n\n\t// Check if the user is already signed up\n\tif _, exists := tracker.Get(caller); exists {\n\t\tpanic(caller + \" is already signed up!\")\n\t}\n\n\t// Sign up the user\n\ttracker.Set(caller, struct{}{})\n\tsignup := Signup{\n\t\tcaller,\n\t\theight,\n\t}\n\n\tsignups = append(signups, signup)\n\tstd.Emit(signUpEvent, \"SignedUpAccount\", signup.account)\n\n\treturn ufmt.Sprintf(\"%s added to userbook up at block #%d!\", signup.account, signup.height)\n}\n\nfunc GetSignupsInRange(page, pageSize int) ([]Signup, int) {\n\tif page \u003c 1 {\n\t\tpanic(\"page number cannot be less than 1\")\n\t}\n\n\tif pageSize \u003c 1 || pageSize \u003e 50 {\n\t\tpanic(\"page size must be from 1 to 50\")\n\t}\n\n\t// Pagination\n\t// Calculate indexes\n\tstartIndex := (page - 1) * pageSize\n\tendIndex := startIndex + pageSize\n\n\t// If page does not contain any users\n\tif startIndex \u003e= len(signups) {\n\t\treturn nil, -1\n\t}\n\n\t// If page contains fewer users than the page size\n\tif endIndex \u003e len(signups) {\n\t\tendIndex = len(signups)\n\t}\n\n\treturn signups[startIndex:endIndex], endIndex\n}\n\nfunc renderHelper(res *mux.ResponseWriter, req *mux.Request) {\n\ttotalSignups := len(signups)\n\tres.Write(\"# Welcome to UserBook!\\n\\n\")\n\n\t// Get URL parameter\n\tpage, err := strconv.Atoi(req.GetVar(\"number\"))\n\tif err != nil {\n\t\tpage = 1 // render first page on bad input\n\t}\n\n\t// Fetch paginated signups\n\tfetchedSignups, endIndex := GetSignupsInRange(page, defaultPageSize)\n\t// Handle empty page case\n\tif len(fetchedSignups) == 0 {\n\t\tres.Write(\"No users on this page!\\n\\n\")\n\t\tres.Write(\"---\\n\\n\")\n\t\tres.Write(\"[Back to Page #1](/r/demo/userbook:page/1)\\n\\n\")\n\t\treturn\n\t}\n\n\t// Write page title\n\tres.Write(ufmt.Sprintf(\"## UserBook - Page #%d:\\n\\n\", page))\n\n\t// Write signups\n\tpageStartIndex := defaultPageSize * (page - 1)\n\tfor i, signup := range fetchedSignups {\n\t\tout := ufmt.Sprintf(\"#### User #%d - %s - signed up at Block #%d\\n\", pageStartIndex+i, signup.account, signup.height)\n\t\tres.Write(out)\n\t}\n\n\tres.Write(\"---\\n\\n\")\n\n\t// Write UserBook info\n\tlatestSignupIndex := totalSignups - 1\n\tres.Write(ufmt.Sprintf(\"#### Total users: %d\\n\", totalSignups))\n\tres.Write(ufmt.Sprintf(\"#### Latest signup: User #%d at Block #%d\\n\", latestSignupIndex, signups[latestSignupIndex].height))\n\n\tres.Write(\"---\\n\\n\")\n\n\t// Write page number\n\tres.Write(ufmt.Sprintf(\"You're viewing page #%d\", page))\n\n\t// Write navigation buttons\n\tvar prevPage string\n\tvar nextPage string\n\t// If we are on any page that is not the first page\n\tif page \u003e 1 {\n\t\tprevPage = ufmt.Sprintf(\" - [Previous page](/r/demo/userbook:page/%d)\", page-1)\n\t}\n\n\t// If there are more pages after the current one\n\tif endIndex \u003c totalSignups {\n\t\tnextPage = ufmt.Sprintf(\" - [Next page](/r/demo/userbook:page/%d)\\n\\n\", page+1)\n\t}\n\n\tres.Write(prevPage)\n\tres.Write(nextPage)\n}\n\nfunc Render(path string) string {\n\treturn router.Render(path)\n}\n"},{"name":"userbook_test.gno","body":"package userbook\n\nimport (\n\t\"std\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nfunc TestRender(t *testing.T) {\n\t// Sign up 20 users + deployer\n\tfor i := 0; i \u003c 20; i++ {\n\t\taddrName := ufmt.Sprintf(\"test%d\", i)\n\t\tcaller := testutils.TestAddress(addrName)\n\t\tstd.TestSetOrigCaller(caller)\n\t\tSignUp()\n\t}\n\n\ttestCases := []struct {\n\t\tname string\n\t\tnextPage bool\n\t\tprevPage bool\n\t\tpath string\n\t\texpectedNumberOfUsers int\n\t}{\n\t\t{\n\t\t\tname: \"1st page render\",\n\t\t\tnextPage: true,\n\t\t\tprevPage: false,\n\t\t\tpath: \"page/1\",\n\t\t\texpectedNumberOfUsers: 20,\n\t\t},\n\t\t{\n\t\t\tname: \"2nd page render\",\n\t\t\tnextPage: false,\n\t\t\tprevPage: true,\n\t\t\tpath: \"page/2\",\n\t\t\texpectedNumberOfUsers: 1,\n\t\t},\n\t\t{\n\t\t\tname: \"Invalid path render\",\n\t\t\tnextPage: true,\n\t\t\tprevPage: false,\n\t\t\tpath: \"page/invalidtext\",\n\t\t\texpectedNumberOfUsers: 20,\n\t\t},\n\t\t{\n\t\t\tname: \"Empty Page\",\n\t\t\tnextPage: false,\n\t\t\tprevPage: false,\n\t\t\tpath: \"page/1000\",\n\t\t\texpectedNumberOfUsers: 0,\n\t\t},\n\t}\n\n\tfor _, tc := range testCases {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\tgot := Render(tc.path)\n\t\t\tnumUsers := countUsers(got)\n\n\t\t\tif tc.prevPage \u0026\u0026 !strings.Contains(got, \"Previous page\") {\n\t\t\t\tt.Fatalf(\"expected to find Previous page, didn't find it\")\n\t\t\t}\n\t\t\tif tc.nextPage \u0026\u0026 !strings.Contains(got, \"Next page\") {\n\t\t\t\tt.Fatalf(\"expected to find Next page, didn't find it\")\n\t\t\t}\n\n\t\t\tif tc.expectedNumberOfUsers != numUsers {\n\t\t\t\tt.Fatalf(\"expected %d, got %d users\", tc.expectedNumberOfUsers, numUsers)\n\t\t\t}\n\t\t})\n\t}\n}\n\nfunc countUsers(input string) int {\n\treturn strings.Count(input, \"#### User #\")\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} {"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"wugnot","path":"gno.land/r/demo/wugnot","files":[{"name":"wugnot.gno","body":"package wugnot\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/grc/grc20\"\n\t\"gno.land/p/demo/ufmt\"\n\tpusers \"gno.land/p/demo/users\"\n\t\"gno.land/r/demo/users\"\n)\n\nvar (\n\tbanker *grc20.Banker = grc20.NewBanker(\"wrapped GNOT\", \"wugnot\", 0)\n\tToken = banker.Token()\n)\n\nconst (\n\tugnotMinDeposit uint64 = 1000\n\twugnotMinDeposit uint64 = 1\n)\n\nfunc Deposit() {\n\tcaller := std.PrevRealm().Addr()\n\tsent := std.GetOrigSend()\n\tamount := sent.AmountOf(\"ugnot\")\n\n\trequire(uint64(amount) \u003e= ugnotMinDeposit, ufmt.Sprintf(\"Deposit below minimum: %d/%d ugnot.\", amount, ugnotMinDeposit))\n\tcheckErr(banker.Mint(caller, uint64(amount)))\n}\n\nfunc Withdraw(amount uint64) {\n\trequire(amount \u003e= wugnotMinDeposit, ufmt.Sprintf(\"Deposit below minimum: %d/%d wugnot.\", amount, wugnotMinDeposit))\n\n\tcaller := std.PrevRealm().Addr()\n\tpkgaddr := std.CurrentRealm().Addr()\n\tcallerBal := Token.BalanceOf(caller)\n\trequire(amount \u003c= callerBal, ufmt.Sprintf(\"Insufficient balance: %d available, %d needed.\", callerBal, amount))\n\n\t// send swapped ugnots to qcaller\n\tstdBanker := std.GetBanker(std.BankerTypeRealmSend)\n\tsend := std.Coins{{\"ugnot\", int64(amount)}}\n\tstdBanker.SendCoins(pkgaddr, caller, send)\n\tcheckErr(banker.Burn(caller, amount))\n}\n\nfunc Render(path string) string {\n\tparts := strings.Split(path, \"/\")\n\tc := len(parts)\n\n\tswitch {\n\tcase path == \"\":\n\t\treturn banker.RenderHome()\n\tcase c == 2 \u0026\u0026 parts[0] == \"balance\":\n\t\towner := std.Address(parts[1])\n\t\tbalance := Token.BalanceOf(owner)\n\t\treturn ufmt.Sprintf(\"%d\", balance)\n\tdefault:\n\t\treturn \"404\"\n\t}\n}\n\nfunc TotalSupply() uint64 { return Token.TotalSupply() }\n\nfunc BalanceOf(owner pusers.AddressOrName) uint64 {\n\townerAddr := users.Resolve(owner)\n\treturn Token.BalanceOf(ownerAddr)\n}\n\nfunc Allowance(owner, spender pusers.AddressOrName) uint64 {\n\townerAddr := users.Resolve(owner)\n\tspenderAddr := users.Resolve(spender)\n\treturn Token.Allowance(ownerAddr, spenderAddr)\n}\n\nfunc Transfer(to pusers.AddressOrName, amount uint64) {\n\ttoAddr := users.Resolve(to)\n\tcheckErr(Token.Transfer(toAddr, amount))\n}\n\nfunc Approve(spender pusers.AddressOrName, amount uint64) {\n\tspenderAddr := users.Resolve(spender)\n\tcheckErr(Token.Approve(spenderAddr, amount))\n}\n\nfunc TransferFrom(from, to pusers.AddressOrName, amount uint64) {\n\tfromAddr := users.Resolve(from)\n\ttoAddr := users.Resolve(to)\n\tcheckErr(Token.TransferFrom(fromAddr, toAddr, amount))\n}\n\nfunc require(condition bool, msg string) {\n\tif !condition {\n\t\tpanic(msg)\n\t}\n}\n\nfunc checkErr(err error) {\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"},{"name":"z0_filetest.gno","body":"// PKGPATH: gno.land/r/demo/wugnot_test\npackage wugnot_test\n\nimport (\n\t\"fmt\"\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/demo/wugnot\"\n\n\tpusers \"gno.land/p/demo/users\"\n)\n\nvar (\n\taddr1 = testutils.TestAddress(\"test1\")\n\taddrc = std.DerivePkgAddr(\"gno.land/r/demo/wugnot\")\n\taddrt = std.DerivePkgAddr(\"gno.land/r/demo/wugnot_test\")\n)\n\nfunc main() {\n\tstd.TestSetOrigPkgAddr(addrc)\n\tstd.TestIssueCoins(addrc, std.Coins{{\"ugnot\", 100000001}}) // TODO: remove this\n\n\t// issue ugnots\n\tstd.TestIssueCoins(addr1, std.Coins{{\"ugnot\", 100000001}})\n\n\t// print initial state\n\tprintBalances()\n\t// println(wugnot.Render(\"queues\"))\n\t// println(\"A -\", wugnot.Render(\"\"))\n\n\tstd.TestSetOrigCaller(addr1)\n\tstd.TestSetOrigSend(std.Coins{{\"ugnot\", 123_400}}, nil)\n\twugnot.Deposit()\n\tprintBalances()\n\twugnot.Withdraw(4242)\n\tprintBalances()\n}\n\nfunc printBalances() {\n\tprintSingleBalance := func(name string, addr std.Address) {\n\t\twugnotBal := wugnot.BalanceOf(pusers.AddressOrName(addr))\n\t\tstd.TestSetOrigCaller(addr)\n\t\trobanker := std.GetBanker(std.BankerTypeReadonly)\n\t\tcoins := robanker.GetCoins(addr).AmountOf(\"ugnot\")\n\t\tfmt.Printf(\"| %-13s | addr=%s | wugnot=%-5d | ugnot=%-9d |\\n\",\n\t\t\tname, addr, wugnotBal, coins)\n\t}\n\tprintln(\"-----------\")\n\tprintSingleBalance(\"wugnot_test\", addrt)\n\tprintSingleBalance(\"wugnot\", addrc)\n\tprintSingleBalance(\"addr1\", addr1)\n\tprintln(\"-----------\")\n}\n\n// Output:\n// -----------\n// | wugnot_test | addr=g19rmydykafrqyyegc8uuaxxpzqwzcnxraj2dev9 | wugnot=0 | ugnot=200000000 |\n// | wugnot | addr=g1pf6dv9fjk3rn0m4jjcne306ga4he3mzmupfjl6 | wugnot=0 | ugnot=100000001 |\n// | addr1 | addr=g1w3jhxap3ta047h6lta047h6lta047h6l4mfnm7 | wugnot=0 | ugnot=100000001 |\n// -----------\n// -----------\n// | wugnot_test | addr=g19rmydykafrqyyegc8uuaxxpzqwzcnxraj2dev9 | wugnot=123400 | ugnot=200000000 |\n// | wugnot | addr=g1pf6dv9fjk3rn0m4jjcne306ga4he3mzmupfjl6 | wugnot=0 | ugnot=100000001 |\n// | addr1 | addr=g1w3jhxap3ta047h6lta047h6lta047h6l4mfnm7 | wugnot=0 | ugnot=100000001 |\n// -----------\n// -----------\n// | wugnot_test | addr=g19rmydykafrqyyegc8uuaxxpzqwzcnxraj2dev9 | wugnot=119158 | ugnot=200004242 |\n// | wugnot | addr=g1pf6dv9fjk3rn0m4jjcne306ga4he3mzmupfjl6 | wugnot=0 | ugnot=99995759 |\n// | addr1 | addr=g1w3jhxap3ta047h6lta047h6lta047h6l4mfnm7 | wugnot=0 | ugnot=100000001 |\n// -----------\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} -{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"gnoblog","path":"gno.land/r/gnoland/blog","files":[{"name":"admin.gno","body":"package gnoblog\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/context\"\n\t\"gno.land/p/gov/proposal\"\n)\n\nvar (\n\tadminAddr std.Address\n\tmoderatorList avl.Tree\n\tcommenterList avl.Tree\n\tinPause bool\n)\n\nfunc init() {\n\t// adminAddr = std.GetOrigCaller() // FIXME: find a way to use this from the main's genesis.\n\tadminAddr = \"g1manfred47kzduec920z88wfr64ylksmdcedlf5\" // @moul\n}\n\nfunc AdminSetAdminAddr(addr std.Address) {\n\tassertIsAdmin()\n\tadminAddr = addr\n}\n\nfunc AdminSetInPause(state bool) {\n\tassertIsAdmin()\n\tinPause = state\n}\n\nfunc AdminAddModerator(addr std.Address) {\n\tassertIsAdmin()\n\tmoderatorList.Set(addr.String(), true)\n}\n\nfunc AdminRemoveModerator(addr std.Address) {\n\tassertIsAdmin()\n\tmoderatorList.Set(addr.String(), false) // FIXME: delete instead?\n}\n\nfunc DaoAddPost(ctx context.Context, slug, title, body, publicationDate, authors, tags string) {\n\tproposal.AssertContextApprovedByGovDAO(ctx)\n\tcaller := std.DerivePkgAddr(\"gno.land/r/gov/dao\")\n\taddPost(caller, slug, title, body, publicationDate, authors, tags)\n}\n\nfunc ModAddPost(slug, title, body, publicationDate, authors, tags string) {\n\tassertIsModerator()\n\tcaller := std.GetOrigCaller()\n\taddPost(caller, slug, title, body, publicationDate, authors, tags)\n}\n\nfunc addPost(caller std.Address, slug, title, body, publicationDate, authors, tags string) {\n\tvar tagList []string\n\tif tags != \"\" {\n\t\ttagList = strings.Split(tags, \",\")\n\t}\n\tvar authorList []string\n\tif authors != \"\" {\n\t\tauthorList = strings.Split(authors, \",\")\n\t}\n\n\terr := b.NewPost(caller, slug, title, body, publicationDate, authorList, tagList)\n\n\tcheckErr(err)\n}\n\nfunc ModEditPost(slug, title, body, publicationDate, authors, tags string) {\n\tassertIsModerator()\n\n\ttagList := strings.Split(tags, \",\")\n\tauthorList := strings.Split(authors, \",\")\n\n\terr := b.GetPost(slug).Update(title, body, publicationDate, authorList, tagList)\n\tcheckErr(err)\n}\n\nfunc ModRemovePost(slug string) {\n\tassertIsModerator()\n\n\tb.RemovePost(slug)\n}\n\nfunc ModAddCommenter(addr std.Address) {\n\tassertIsModerator()\n\tcommenterList.Set(addr.String(), true)\n}\n\nfunc ModDelCommenter(addr std.Address) {\n\tassertIsModerator()\n\tcommenterList.Set(addr.String(), false) // FIXME: delete instead?\n}\n\nfunc ModDelComment(slug string, index int) {\n\tassertIsModerator()\n\n\terr := b.GetPost(slug).DeleteComment(index)\n\tcheckErr(err)\n}\n\nfunc isAdmin(addr std.Address) bool {\n\treturn addr == adminAddr\n}\n\nfunc isModerator(addr std.Address) bool {\n\t_, found := moderatorList.Get(addr.String())\n\treturn found\n}\n\nfunc isCommenter(addr std.Address) bool {\n\t_, found := commenterList.Get(addr.String())\n\treturn found\n}\n\nfunc assertIsAdmin() {\n\tcaller := std.GetOrigCaller()\n\tif !isAdmin(caller) {\n\t\tpanic(\"access restricted.\")\n\t}\n}\n\nfunc assertIsModerator() {\n\tcaller := std.GetOrigCaller()\n\tif isAdmin(caller) || isModerator(caller) {\n\t\treturn\n\t}\n\tpanic(\"access restricted\")\n}\n\nfunc assertIsCommenter() {\n\tcaller := std.GetOrigCaller()\n\tif isAdmin(caller) || isModerator(caller) || isCommenter(caller) {\n\t\treturn\n\t}\n\tpanic(\"access restricted\")\n}\n\nfunc assertNotInPause() {\n\tif inPause {\n\t\tpanic(\"access restricted (pause)\")\n\t}\n}\n"},{"name":"gnoblog.gno","body":"package gnoblog\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/blog\"\n)\n\nvar b = \u0026blog.Blog{\n\tTitle: \"Gnoland's Blog\",\n\tPrefix: \"/r/gnoland/blog:\",\n}\n\nfunc AddComment(postSlug, comment string) {\n\tassertIsCommenter()\n\tassertNotInPause()\n\n\tcaller := std.GetOrigCaller()\n\terr := b.GetPost(postSlug).AddComment(caller, comment)\n\tcheckErr(err)\n}\n\nfunc Render(path string) string {\n\treturn b.Render(path)\n}\n\nfunc RenderLastPostsWidget(limit int) string {\n\treturn b.RenderLastPostsWidget(limit)\n}\n\nfunc PostExists(slug string) bool {\n\tif b.GetPost(slug) == nil {\n\t\treturn false\n\t}\n\treturn true\n}\n"},{"name":"gnoblog_test.gno","body":"package gnoblog\n\nimport (\n\t\"std\"\n\t\"strings\"\n\t\"testing\"\n)\n\nfunc TestPackage(t *testing.T) {\n\tstd.TestSetOrigCaller(std.Address(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\"))\n\n\tauthor := std.GetOrigCaller()\n\n\t// by default, no posts.\n\t{\n\t\tgot := Render(\"\")\n\t\texpected := `\n# Gnoland's Blog\n\nNo posts.\n`\n\t\tassertMDEquals(t, got, expected)\n\t}\n\n\t// create two posts, list post.\n\t{\n\t\tModAddPost(\"slug1\", \"title1\", \"body1\", \"2022-05-20T13:17:22Z\", \"moul\", \"tag1,tag2\")\n\t\tModAddPost(\"slug2\", \"title2\", \"body2\", \"2022-05-20T13:17:23Z\", \"moul\", \"tag1,tag3\")\n\t\tgot := Render(\"\")\n\t\texpected := `\n\t# Gnoland's Blog\n\n\u003cdiv class='columns-3'\u003e\u003cdiv\u003e\n\n### [title2](/r/gnoland/blog:p/slug2)\n 20 May 2022\n\u003c/div\u003e\u003cdiv\u003e\n\n### [title1](/r/gnoland/blog:p/slug1)\n 20 May 2022\n\u003c/div\u003e\u003c/div\u003e\n\t`\n\t\tassertMDEquals(t, got, expected)\n\t}\n\n\t// view post.\n\t{\n\t\tgot := Render(\"p/slug2\")\n\t\texpected := `\n\u003cmain class='gno-tmpl-page'\u003e\n\n# title2\n\nbody2\n\n---\n\nTags: [#tag1](/r/gnoland/blog:t/tag1) [#tag3](/r/gnoland/blog:t/tag3)\n\nWritten by moul on 20 May 2022\n\nPublished by g1manfred47kzduec920z88wfr64ylksmdcedlf5 to Gnoland's Blog\n\n---\n\u003cdetails\u003e\u003csummary\u003eComment section\u003c/summary\u003e\n\n\u003c/details\u003e\n\u003c/main\u003e\n\n\t`\n\t\tassertMDEquals(t, got, expected)\n\t}\n\n\t// list by tags.\n\t{\n\t\tgot := Render(\"t/invalid\")\n\t\texpected := \"# [Gnoland's Blog](/r/gnoland/blog:) / t / invalid\\n\\nNo posts.\"\n\t\tassertMDEquals(t, got, expected)\n\n\t\tgot = Render(\"t/tag2\")\n\t\texpected = `\n# [Gnoland's Blog](/r/gnoland/blog:) / t / tag2\n\n\u003cdiv\u003e\n\n### [title1](/r/gnoland/blog:p/slug1)\n 20 May 2022\n\u003c/div\u003e\n\t`\n\t\tassertMDEquals(t, got, expected)\n\t}\n\n\t// add comments.\n\t{\n\t\tAddComment(\"slug1\", \"comment1\")\n\t\tAddComment(\"slug2\", \"comment2\")\n\t\tAddComment(\"slug1\", \"comment3\")\n\t\tAddComment(\"slug2\", \"comment4\")\n\t\tAddComment(\"slug1\", \"comment5\")\n\t\tgot := Render(\"p/slug2\")\n\t\texpected := `\u003cmain class='gno-tmpl-page'\u003e\n\n# title2\n\nbody2\n\n---\n\nTags: [#tag1](/r/gnoland/blog:t/tag1) [#tag3](/r/gnoland/blog:t/tag3)\n\nWritten by moul on 20 May 2022\n\nPublished by g1manfred47kzduec920z88wfr64ylksmdcedlf5 to Gnoland's Blog\n\n---\n\u003cdetails\u003e\u003csummary\u003eComment section\u003c/summary\u003e\n\n\u003ch5\u003ecomment4\n\n\u003c/h5\u003e\u003ch6\u003eby g1manfred47kzduec920z88wfr64ylksmdcedlf5 on 13 Feb 09 23:31 UTC\u003c/h6\u003e\n\n---\n\n\u003ch5\u003ecomment2\n\n\u003c/h5\u003e\u003ch6\u003eby g1manfred47kzduec920z88wfr64ylksmdcedlf5 on 13 Feb 09 23:31 UTC\u003c/h6\u003e\n\n---\n\n\u003c/details\u003e\n\u003c/main\u003e\n\t`\n\t\tassertMDEquals(t, got, expected)\n\t}\n\n\t// edit post.\n\t{\n\t\toldTitle := \"title2\"\n\t\toldDate := \"2022-05-20T13:17:23Z\"\n\n\t\tModEditPost(\"slug2\", oldTitle, \"body2++\", oldDate, \"manfred\", \"tag1,tag4\")\n\t\tgot := Render(\"p/slug2\")\n\t\texpected := `\u003cmain class='gno-tmpl-page'\u003e\n\n# title2\n\nbody2++\n\n---\n\nTags: [#tag1](/r/gnoland/blog:t/tag1) [#tag4](/r/gnoland/blog:t/tag4)\n\nWritten by manfred on 20 May 2022\n\nPublished by g1manfred47kzduec920z88wfr64ylksmdcedlf5 to Gnoland's Blog\n\n---\n\u003cdetails\u003e\u003csummary\u003eComment section\u003c/summary\u003e\n\n\u003ch5\u003ecomment4\n\n\u003c/h5\u003e\u003ch6\u003eby g1manfred47kzduec920z88wfr64ylksmdcedlf5 on 13 Feb 09 23:31 UTC\u003c/h6\u003e\n\n---\n\n\u003ch5\u003ecomment2\n\n\u003c/h5\u003e\u003ch6\u003eby g1manfred47kzduec920z88wfr64ylksmdcedlf5 on 13 Feb 09 23:31 UTC\u003c/h6\u003e\n\n---\n\n\u003c/details\u003e\n\u003c/main\u003e\n\t`\n\t\tassertMDEquals(t, got, expected)\n\n\t\thome := Render(\"\")\n\n\t\tif strings.Count(home, oldTitle) != 1 {\n\t\t\tt.Errorf(\"post not edited properly\")\n\t\t}\n\t\t// Edits work everything except title, slug, and publicationDate\n\t\t// Edits to the above will cause duplication on the blog home page\n\t}\n\n\t{ // Test remove functionality\n\t\ttitle := \"example title\"\n\t\tslug := \"testSlug1\"\n\t\tModAddPost(slug, title, \"body1\", \"2022-05-25T13:17:22Z\", \"moul\", \"tag1,tag2\")\n\n\t\tgot := Render(\"\")\n\n\t\tif !strings.Contains(got, title) {\n\t\t\tt.Errorf(\"post was not added properly\")\n\t\t}\n\n\t\tpostRender := Render(\"p/\" + slug)\n\n\t\tif !strings.Contains(postRender, title) {\n\t\t\tt.Errorf(\"post not rendered properly\")\n\t\t}\n\n\t\tModRemovePost(slug)\n\t\tgot = Render(\"\")\n\n\t\tif strings.Contains(got, title) {\n\t\t\tt.Errorf(\"post was not removed\")\n\t\t}\n\n\t\tpostRender = Render(\"p/\" + slug)\n\n\t\tassertMDEquals(t, postRender, \"404\")\n\t}\n\n\t// TODO: pagination.\n\t// TODO: ?format=...\n\n\t// all 404s\n\t{\n\t\tnotFoundPaths := []string{\n\t\t\t\"p/slug3\",\n\t\t\t\"p\",\n\t\t\t\"p/\",\n\t\t\t\"x/x\",\n\t\t\t\"t\",\n\t\t\t\"t/\",\n\t\t\t\"/\",\n\t\t\t\"p/slug1/\",\n\t\t}\n\t\tfor _, notFoundPath := range notFoundPaths {\n\t\t\tgot := Render(notFoundPath)\n\t\t\texpected := \"404\"\n\t\t\tif got != expected {\n\t\t\t\tt.Errorf(\"path %q: expected %q, got %q.\", notFoundPath, expected, got)\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc assertMDEquals(t *testing.T, got, expected string) {\n\tt.Helper()\n\texpected = strings.TrimSpace(expected)\n\tgot = strings.TrimSpace(got)\n\tif expected != got {\n\t\tt.Errorf(\"invalid render output.\\nexpected %q.\\ngot %q.\", expected, got)\n\t}\n}\n"},{"name":"util.gno","body":"package gnoblog\n\nfunc checkErr(err error) {\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"gnoblog","path":"gno.land/r/gnoland/blog","files":[{"name":"admin.gno","body":"package gnoblog\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/context\"\n\t\"gno.land/p/gov/proposal\"\n)\n\nvar (\n\tadminAddr std.Address\n\tmoderatorList avl.Tree\n\tcommenterList avl.Tree\n\tinPause bool\n)\n\nfunc init() {\n\t// adminAddr = std.GetOrigCaller() // FIXME: find a way to use this from the main's genesis.\n\tadminAddr = \"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq\"\n}\n\nfunc AdminSetAdminAddr(addr std.Address) {\n\tassertIsAdmin()\n\tadminAddr = addr\n}\n\nfunc AdminSetInPause(state bool) {\n\tassertIsAdmin()\n\tinPause = state\n}\n\nfunc AdminAddModerator(addr std.Address) {\n\tassertIsAdmin()\n\tmoderatorList.Set(addr.String(), true)\n}\n\nfunc AdminRemoveModerator(addr std.Address) {\n\tassertIsAdmin()\n\tmoderatorList.Set(addr.String(), false) // FIXME: delete instead?\n}\n\nfunc DaoAddPost(ctx context.Context, slug, title, body, publicationDate, authors, tags string) {\n\tproposal.AssertContextApprovedByGovDAO(ctx)\n\tcaller := std.DerivePkgAddr(\"gno.land/r/gov/dao\")\n\taddPost(caller, slug, title, body, publicationDate, authors, tags)\n}\n\nfunc ModAddPost(slug, title, body, publicationDate, authors, tags string) {\n\tassertIsModerator()\n\tcaller := std.GetOrigCaller()\n\taddPost(caller, slug, title, body, publicationDate, authors, tags)\n}\n\nfunc addPost(caller std.Address, slug, title, body, publicationDate, authors, tags string) {\n\tvar tagList []string\n\tif tags != \"\" {\n\t\ttagList = strings.Split(tags, \",\")\n\t}\n\tvar authorList []string\n\tif authors != \"\" {\n\t\tauthorList = strings.Split(authors, \",\")\n\t}\n\n\terr := b.NewPost(caller, slug, title, body, publicationDate, authorList, tagList)\n\n\tcheckErr(err)\n}\n\nfunc ModEditPost(slug, title, body, publicationDate, authors, tags string) {\n\tassertIsModerator()\n\n\ttagList := strings.Split(tags, \",\")\n\tauthorList := strings.Split(authors, \",\")\n\n\terr := b.GetPost(slug).Update(title, body, publicationDate, authorList, tagList)\n\tcheckErr(err)\n}\n\nfunc ModRemovePost(slug string) {\n\tassertIsModerator()\n\n\tb.RemovePost(slug)\n}\n\nfunc ModAddCommenter(addr std.Address) {\n\tassertIsModerator()\n\tcommenterList.Set(addr.String(), true)\n}\n\nfunc ModDelCommenter(addr std.Address) {\n\tassertIsModerator()\n\tcommenterList.Set(addr.String(), false) // FIXME: delete instead?\n}\n\nfunc ModDelComment(slug string, index int) {\n\tassertIsModerator()\n\n\terr := b.GetPost(slug).DeleteComment(index)\n\tcheckErr(err)\n}\n\nfunc isAdmin(addr std.Address) bool {\n\treturn addr == adminAddr\n}\n\nfunc isModerator(addr std.Address) bool {\n\t_, found := moderatorList.Get(addr.String())\n\treturn found\n}\n\nfunc isCommenter(addr std.Address) bool {\n\t_, found := commenterList.Get(addr.String())\n\treturn found\n}\n\nfunc assertIsAdmin() {\n\tcaller := std.GetOrigCaller()\n\tif !isAdmin(caller) {\n\t\tpanic(\"access restricted.\")\n\t}\n}\n\nfunc assertIsModerator() {\n\tcaller := std.GetOrigCaller()\n\tif isAdmin(caller) || isModerator(caller) {\n\t\treturn\n\t}\n\tpanic(\"access restricted\")\n}\n\nfunc assertIsCommenter() {\n\tcaller := std.GetOrigCaller()\n\tif isAdmin(caller) || isModerator(caller) || isCommenter(caller) {\n\t\treturn\n\t}\n\tpanic(\"access restricted\")\n}\n\nfunc assertNotInPause() {\n\tif inPause {\n\t\tpanic(\"access restricted (pause)\")\n\t}\n}\n"},{"name":"gnoblog.gno","body":"package gnoblog\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/blog\"\n)\n\nvar b = \u0026blog.Blog{\n\tTitle: \"Gnoland's Blog\",\n\tPrefix: \"/r/gnoland/blog:\",\n}\n\nfunc AddComment(postSlug, comment string) {\n\tassertIsCommenter()\n\tassertNotInPause()\n\n\tcaller := std.GetOrigCaller()\n\terr := b.GetPost(postSlug).AddComment(caller, comment)\n\tcheckErr(err)\n}\n\nfunc Render(path string) string {\n\treturn b.Render(path)\n}\n\nfunc RenderLastPostsWidget(limit int) string {\n\treturn b.RenderLastPostsWidget(limit)\n}\n\nfunc PostExists(slug string) bool {\n\tif b.GetPost(slug) == nil {\n\t\treturn false\n\t}\n\treturn true\n}\n"},{"name":"gnoblog_test.gno","body":"package gnoblog\n\nimport (\n\t\"std\"\n\t\"strings\"\n\t\"testing\"\n)\n\nfunc TestPackage(t *testing.T) {\n\tstd.TestSetOrigCaller(std.Address(\"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq\"))\n\n\tauthor := std.GetOrigCaller()\n\n\t// by default, no posts.\n\t{\n\t\tgot := Render(\"\")\n\t\texpected := `\n# Gnoland's Blog\n\nNo posts.\n`\n\t\tassertMDEquals(t, got, expected)\n\t}\n\n\t// create two posts, list post.\n\t{\n\t\tModAddPost(\"slug1\", \"title1\", \"body1\", \"2022-05-20T13:17:22Z\", \"moul\", \"tag1,tag2\")\n\t\tModAddPost(\"slug2\", \"title2\", \"body2\", \"2022-05-20T13:17:23Z\", \"moul\", \"tag1,tag3\")\n\t\tgot := Render(\"\")\n\t\texpected := `\n\t# Gnoland's Blog\n\n\u003cdiv class='columns-3'\u003e\u003cdiv\u003e\n\n### [title2](/r/gnoland/blog:p/slug2)\n 20 May 2022\n\u003c/div\u003e\u003cdiv\u003e\n\n### [title1](/r/gnoland/blog:p/slug1)\n 20 May 2022\n\u003c/div\u003e\u003c/div\u003e\n\t`\n\t\tassertMDEquals(t, got, expected)\n\t}\n\n\t// view post.\n\t{\n\t\tgot := Render(\"p/slug2\")\n\t\texpected := `\n\u003cmain class='gno-tmpl-page'\u003e\n\n# title2\n\nbody2\n\n---\n\nTags: [#tag1](/r/gnoland/blog:t/tag1) [#tag3](/r/gnoland/blog:t/tag3)\n\nWritten by moul on 20 May 2022\n\nPublished by g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq to Gnoland's Blog\n\n---\n\u003cdetails\u003e\u003csummary\u003eComment section\u003c/summary\u003e\n\n\u003c/details\u003e\n\u003c/main\u003e\n\n\t`\n\t\tassertMDEquals(t, got, expected)\n\t}\n\n\t// list by tags.\n\t{\n\t\tgot := Render(\"t/invalid\")\n\t\texpected := \"# [Gnoland's Blog](/r/gnoland/blog:) / t / invalid\\n\\nNo posts.\"\n\t\tassertMDEquals(t, got, expected)\n\n\t\tgot = Render(\"t/tag2\")\n\t\texpected = `\n# [Gnoland's Blog](/r/gnoland/blog:) / t / tag2\n\n\u003cdiv\u003e\n\n### [title1](/r/gnoland/blog:p/slug1)\n 20 May 2022\n\u003c/div\u003e\n\t`\n\t\tassertMDEquals(t, got, expected)\n\t}\n\n\t// add comments.\n\t{\n\t\tAddComment(\"slug1\", \"comment1\")\n\t\tAddComment(\"slug2\", \"comment2\")\n\t\tAddComment(\"slug1\", \"comment3\")\n\t\tAddComment(\"slug2\", \"comment4\")\n\t\tAddComment(\"slug1\", \"comment5\")\n\t\tgot := Render(\"p/slug2\")\n\t\texpected := `\u003cmain class='gno-tmpl-page'\u003e\n\n# title2\n\nbody2\n\n---\n\nTags: [#tag1](/r/gnoland/blog:t/tag1) [#tag3](/r/gnoland/blog:t/tag3)\n\nWritten by moul on 20 May 2022\n\nPublished by g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq to Gnoland's Blog\n\n---\n\u003cdetails\u003e\u003csummary\u003eComment section\u003c/summary\u003e\n\n\u003ch5\u003ecomment4\n\n\u003c/h5\u003e\u003ch6\u003eby g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq on 13 Feb 09 23:31 UTC\u003c/h6\u003e\n\n---\n\n\u003ch5\u003ecomment2\n\n\u003c/h5\u003e\u003ch6\u003eby g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq on 13 Feb 09 23:31 UTC\u003c/h6\u003e\n\n---\n\n\u003c/details\u003e\n\u003c/main\u003e\n\t`\n\t\tassertMDEquals(t, got, expected)\n\t}\n\n\t// edit post.\n\t{\n\t\toldTitle := \"title2\"\n\t\toldDate := \"2022-05-20T13:17:23Z\"\n\n\t\tModEditPost(\"slug2\", oldTitle, \"body2++\", oldDate, \"manfred\", \"tag1,tag4\")\n\t\tgot := Render(\"p/slug2\")\n\t\texpected := `\u003cmain class='gno-tmpl-page'\u003e\n\n# title2\n\nbody2++\n\n---\n\nTags: [#tag1](/r/gnoland/blog:t/tag1) [#tag4](/r/gnoland/blog:t/tag4)\n\nWritten by manfred on 20 May 2022\n\nPublished by g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq to Gnoland's Blog\n\n---\n\u003cdetails\u003e\u003csummary\u003eComment section\u003c/summary\u003e\n\n\u003ch5\u003ecomment4\n\n\u003c/h5\u003e\u003ch6\u003eby g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq on 13 Feb 09 23:31 UTC\u003c/h6\u003e\n\n---\n\n\u003ch5\u003ecomment2\n\n\u003c/h5\u003e\u003ch6\u003eby g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq on 13 Feb 09 23:31 UTC\u003c/h6\u003e\n\n---\n\n\u003c/details\u003e\n\u003c/main\u003e\n\t`\n\t\tassertMDEquals(t, got, expected)\n\n\t\thome := Render(\"\")\n\n\t\tif strings.Count(home, oldTitle) != 1 {\n\t\t\tt.Errorf(\"post not edited properly\")\n\t\t}\n\t\t// Edits work everything except title, slug, and publicationDate\n\t\t// Edits to the above will cause duplication on the blog home page\n\t}\n\n\t{ // Test remove functionality\n\t\ttitle := \"example title\"\n\t\tslug := \"testSlug1\"\n\t\tModAddPost(slug, title, \"body1\", \"2022-05-25T13:17:22Z\", \"moul\", \"tag1,tag2\")\n\n\t\tgot := Render(\"\")\n\n\t\tif !strings.Contains(got, title) {\n\t\t\tt.Errorf(\"post was not added properly\")\n\t\t}\n\n\t\tpostRender := Render(\"p/\" + slug)\n\n\t\tif !strings.Contains(postRender, title) {\n\t\t\tt.Errorf(\"post not rendered properly\")\n\t\t}\n\n\t\tModRemovePost(slug)\n\t\tgot = Render(\"\")\n\n\t\tif strings.Contains(got, title) {\n\t\t\tt.Errorf(\"post was not removed\")\n\t\t}\n\n\t\tpostRender = Render(\"p/\" + slug)\n\n\t\tassertMDEquals(t, postRender, \"404\")\n\t}\n\n\t// TODO: pagination.\n\t// TODO: ?format=...\n\n\t// all 404s\n\t{\n\t\tnotFoundPaths := []string{\n\t\t\t\"p/slug3\",\n\t\t\t\"p\",\n\t\t\t\"p/\",\n\t\t\t\"x/x\",\n\t\t\t\"t\",\n\t\t\t\"t/\",\n\t\t\t\"/\",\n\t\t\t\"p/slug1/\",\n\t\t}\n\t\tfor _, notFoundPath := range notFoundPaths {\n\t\t\tgot := Render(notFoundPath)\n\t\t\texpected := \"404\"\n\t\t\tif got != expected {\n\t\t\t\tt.Errorf(\"path %q: expected %q, got %q.\", notFoundPath, expected, got)\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc assertMDEquals(t *testing.T, got, expected string) {\n\tt.Helper()\n\texpected = strings.TrimSpace(expected)\n\tgot = strings.TrimSpace(got)\n\tif expected != got {\n\t\tt.Errorf(\"invalid render output.\\nexpected %q.\\ngot %q.\", expected, got)\n\t}\n}\n"},{"name":"util.gno","body":"package gnoblog\n\nfunc checkErr(err error) {\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} {"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"events","path":"gno.land/r/gnoland/events","files":[{"name":"administration.gno","body":"package events\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/ownable/exts/authorizable\"\n)\n\nvar (\n\tsu = std.Address(\"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5\") // @leohhhn\n\tauth = authorizable.NewAuthorizableWithAddress(su)\n)\n\n// GetOwner gets the owner of the events realm\nfunc GetOwner() std.Address {\n\treturn auth.Owner()\n}\n\n// AddModerator adds a moderator to the events realm\nfunc AddModerator(mod std.Address) {\n\tauth.AssertCallerIsOwner()\n\n\tif err := auth.AddToAuthList(mod); err != nil {\n\t\tpanic(err)\n\t}\n}\n"},{"name":"errors.gno","body":"package events\n\nimport (\n\t\"errors\"\n\t\"strconv\"\n)\n\nvar (\n\tErrEmptyName = errors.New(\"event name cannot be empty\")\n\tErrNoSuchID = errors.New(\"event with specified ID does not exist\")\n\tErrMinWidgetSize = errors.New(\"you need to request at least 1 event to render\")\n\tErrMaxWidgetSize = errors.New(\"maximum number of events in widget is\" + strconv.Itoa(MaxWidgetSize))\n\tErrDescriptionTooLong = errors.New(\"event description is too long\")\n\tErrInvalidStartTime = errors.New(\"invalid start time format\")\n\tErrInvalidEndTime = errors.New(\"invalid end time format\")\n\tErrEndBeforeStart = errors.New(\"end time cannot be before start time\")\n\tErrStartEndTimezonemMismatch = errors.New(\"start and end timezones are not the same\")\n)\n"},{"name":"events.gno","body":"// Package events allows you to upload data about specific IRL/online events\n// It includes dynamic support for updating rendering events based on their\n// status, ie if they are upcoming, in progress, or in the past.\npackage events\n\nimport (\n\t\"sort\"\n\t\"std\"\n\t\"strings\"\n\t\"time\"\n\n\t\"gno.land/p/demo/seqid\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\ntype (\n\tEvent struct {\n\t\tid string\n\t\tname string // name of event\n\t\tdescription string // short description of event\n\t\tlink string // link to auth corresponding web2 page, ie eventbrite/luma or conference page\n\t\tlocation string // location of the event\n\t\tstartTime time.Time // given in RFC3339\n\t\tendTime time.Time // end time of the event, given in RFC3339\n\t}\n\n\teventsSlice []*Event\n)\n\nvar (\n\tevents = make(eventsSlice, 0) // sorted\n\tidCounter seqid.ID\n)\n\nconst (\n\tmaxDescLength = 100\n\tEventAdded = \"EventAdded\"\n\tEventDeleted = \"EventDeleted\"\n\tEventEdited = \"EventEdited\"\n)\n\n// AddEvent adds auth new event\n// Start time \u0026 end time need to be specified in RFC3339, ie 2024-08-08T12:00:00+02:00\nfunc AddEvent(name, description, link, location, startTime, endTime string) (string, error) {\n\tauth.AssertOnAuthList()\n\n\tif strings.TrimSpace(name) == \"\" {\n\t\treturn \"\", ErrEmptyName\n\t}\n\n\tif len(description) \u003e maxDescLength {\n\t\treturn \"\", ufmt.Errorf(\"%s: provided length is %d, maximum is %d\", ErrDescriptionTooLong, len(description), maxDescLength)\n\t}\n\n\t// Parse times\n\tst, et, err := parseTimes(startTime, endTime)\n\tif err != nil {\n\t\treturn \"\", err\n\t}\n\n\tid := idCounter.Next().String()\n\te := \u0026Event{\n\t\tid: id,\n\t\tname: name,\n\t\tdescription: description,\n\t\tlink: link,\n\t\tlocation: location,\n\t\tstartTime: st,\n\t\tendTime: et,\n\t}\n\n\tevents = append(events, e)\n\tsort.Sort(events)\n\n\tstd.Emit(EventAdded,\n\t\t\"id\",\n\t\te.id,\n\t)\n\n\treturn id, nil\n}\n\n// DeleteEvent deletes an event with auth given ID\nfunc DeleteEvent(id string) {\n\tauth.AssertOnAuthList()\n\n\te, idx, err := GetEventByID(id)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\tevents = append(events[:idx], events[idx+1:]...)\n\n\tstd.Emit(EventDeleted,\n\t\t\"id\",\n\t\te.id,\n\t)\n}\n\n// EditEvent edits an event with auth given ID\n// It only updates values corresponding to non-empty arguments sent with the call\n// Note: if you need to update the start time or end time, you need to provide both every time\nfunc EditEvent(id string, name, description, link, location, startTime, endTime string) {\n\tauth.AssertOnAuthList()\n\n\te, _, err := GetEventByID(id)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\t// Set only valid values\n\tif strings.TrimSpace(name) != \"\" {\n\t\te.name = name\n\t}\n\n\tif strings.TrimSpace(description) != \"\" {\n\t\te.description = description\n\t}\n\n\tif strings.TrimSpace(link) != \"\" {\n\t\te.link = link\n\t}\n\n\tif strings.TrimSpace(location) != \"\" {\n\t\te.location = location\n\t}\n\n\tif strings.TrimSpace(startTime) != \"\" || strings.TrimSpace(endTime) != \"\" {\n\t\tst, et, err := parseTimes(startTime, endTime)\n\t\tif err != nil {\n\t\t\tpanic(err) // need to also revert other state changes\n\t\t}\n\n\t\toldStartTime := e.startTime\n\t\te.startTime = st\n\t\te.endTime = et\n\n\t\t// If sort order was disrupted, sort again\n\t\tif oldStartTime != e.startTime {\n\t\t\tsort.Sort(events)\n\t\t}\n\t}\n\n\tstd.Emit(EventEdited,\n\t\t\"id\",\n\t\te.id,\n\t)\n}\n\nfunc GetEventByID(id string) (*Event, int, error) {\n\tfor i, event := range events {\n\t\tif event.id == id {\n\t\t\treturn event, i, nil\n\t\t}\n\t}\n\n\treturn nil, -1, ErrNoSuchID\n}\n\n// Len returns the length of the slice\nfunc (m eventsSlice) Len() int {\n\treturn len(m)\n}\n\n// Less compares the startTime fields of two elements\n// In this case, events will be sorted by largest startTime first (upcoming \u003e past)\nfunc (m eventsSlice) Less(i, j int) bool {\n\treturn m[i].startTime.After(m[j].startTime)\n}\n\n// Swap swaps two elements in the slice\nfunc (m eventsSlice) Swap(i, j int) {\n\tm[i], m[j] = m[j], m[i]\n}\n\n// parseTimes parses the start and end time for an event and checks for possible errors\nfunc parseTimes(startTime, endTime string) (time.Time, time.Time, error) {\n\tst, err := time.Parse(time.RFC3339, startTime)\n\tif err != nil {\n\t\treturn time.Time{}, time.Time{}, ufmt.Errorf(\"%s: %s\", ErrInvalidStartTime, err.Error())\n\t}\n\n\tet, err := time.Parse(time.RFC3339, endTime)\n\tif err != nil {\n\t\treturn time.Time{}, time.Time{}, ufmt.Errorf(\"%s: %s\", ErrInvalidEndTime, err.Error())\n\t}\n\n\tif et.Before(st) {\n\t\treturn time.Time{}, time.Time{}, ErrEndBeforeStart\n\t}\n\n\t_, stOffset := st.Zone()\n\t_, etOffset := et.Zone()\n\tif stOffset != etOffset {\n\t\treturn time.Time{}, time.Time{}, ErrStartEndTimezonemMismatch\n\t}\n\n\treturn st, et, nil\n}\n"},{"name":"events_test.gno","body":"package events\n\nimport (\n\t\"std\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"gno.land/p/demo/uassert\"\n\t\"gno.land/p/demo/urequire\"\n)\n\nvar (\n\tsuRealm = std.NewUserRealm(su)\n\n\tnow = \"2009-02-13T23:31:30Z\" // time.Now() is hardcoded to this value in the gno test machine currently\n\tparsedTimeNow, _ = time.Parse(time.RFC3339, now)\n)\n\nfunc TestAddEvent(t *testing.T) {\n\tstd.TestSetOrigCaller(su)\n\tstd.TestSetRealm(suRealm)\n\n\te1Start := parsedTimeNow.Add(time.Hour * 24 * 5)\n\te1End := e1Start.Add(time.Hour * 4)\n\n\tAddEvent(\"Event 1\", \"this event is upcoming\", \"gno.land\", \"gnome land\", e1Start.Format(time.RFC3339), e1End.Format(time.RFC3339))\n\n\tgot := renderHome(false)\n\n\tif !strings.Contains(got, \"Event 1\") {\n\t\tt.Fatalf(\"Expected to find Event 1 in render\")\n\t}\n\n\te2Start := parsedTimeNow.Add(-time.Hour * 24 * 5)\n\te2End := e2Start.Add(time.Hour * 4)\n\n\tAddEvent(\"Event 2\", \"this event is in the past\", \"gno.land\", \"gnome land\", e2Start.Format(time.RFC3339), e2End.Format(time.RFC3339))\n\n\tgot = renderHome(false)\n\n\tupcomingPos := strings.Index(got, \"## Upcoming events\")\n\tpastPos := strings.Index(got, \"## Past events\")\n\n\te1Pos := strings.Index(got, \"Event 1\")\n\te2Pos := strings.Index(got, \"Event 2\")\n\n\t// expected index ordering: upcoming \u003c e1 \u003c past \u003c e2\n\tif e1Pos \u003c upcomingPos || e1Pos \u003e pastPos {\n\t\tt.Fatalf(\"Expected to find Event 1 in Upcoming events\")\n\t}\n\n\tif e2Pos \u003c upcomingPos || e2Pos \u003c pastPos || e2Pos \u003c e1Pos {\n\t\tt.Fatalf(\"Expected to find Event 2 on auth different pos\")\n\t}\n\n\t// larger index =\u003e smaller startTime (future =\u003e past)\n\tif events[0].startTime.Unix() \u003c events[1].startTime.Unix() {\n\t\tt.Fatalf(\"expected ordering to be different\")\n\t}\n}\n\nfunc TestAddEventErrors(t *testing.T) {\n\tstd.TestSetOrigCaller(su)\n\tstd.TestSetRealm(suRealm)\n\n\t_, err := AddEvent(\"\", \"sample desc\", \"gno.land\", \"gnome land\", \"2009-02-13T23:31:31Z\", \"2009-02-13T23:33:31Z\")\n\tuassert.ErrorIs(t, err, ErrEmptyName)\n\n\t_, err = AddEvent(\"sample name\", \"sample desc\", \"gno.land\", \"gnome land\", \"\", \"2009-02-13T23:33:31Z\")\n\tuassert.ErrorContains(t, err, ErrInvalidStartTime.Error())\n\n\t_, err = AddEvent(\"sample name\", \"sample desc\", \"gno.land\", \"gnome land\", \"2009-02-13T23:31:31Z\", \"\")\n\tuassert.ErrorContains(t, err, ErrInvalidEndTime.Error())\n\n\t_, err = AddEvent(\"sample name\", \"sample desc\", \"gno.land\", \"gnome land\", \"2009-02-13T23:31:31Z\", \"2009-02-13T23:30:31Z\")\n\tuassert.ErrorIs(t, err, ErrEndBeforeStart)\n\n\t_, err = AddEvent(\"sample name\", \"sample desc\", \"gno.land\", \"gnome land\", \"2009-02-13T23:31:31+06:00\", \"2009-02-13T23:33:31+02:00\")\n\tuassert.ErrorIs(t, err, ErrStartEndTimezonemMismatch)\n\n\ttooLongDesc := `Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean ma`\n\t_, err = AddEvent(\"sample name\", tooLongDesc, \"gno.land\", \"gnome land\", \"2009-02-13T23:31:31Z\", \"2009-02-13T23:33:31Z\")\n\tuassert.ErrorContains(t, err, ErrDescriptionTooLong.Error())\n}\n\nfunc TestDeleteEvent(t *testing.T) {\n\tevents = nil // remove elements from previous tests - see issue #1982\n\n\te1Start := parsedTimeNow.Add(time.Hour * 24 * 5)\n\te1End := e1Start.Add(time.Hour * 4)\n\n\tid, _ := AddEvent(\"ToDelete\", \"description\", \"gno.land\", \"gnome land\", e1Start.Format(time.RFC3339), e1End.Format(time.RFC3339))\n\n\tgot := renderHome(false)\n\n\tif !strings.Contains(got, \"ToDelete\") {\n\t\tt.Fatalf(\"Expected to find ToDelete event in render\")\n\t}\n\n\tDeleteEvent(id)\n\tgot = renderHome(false)\n\n\tif strings.Contains(got, \"ToDelete\") {\n\t\tt.Fatalf(\"Did not expect to find ToDelete event in render\")\n\t}\n}\n\nfunc TestEditEvent(t *testing.T) {\n\tevents = nil // remove elements from previous tests - see issue #1982\n\n\te1Start := parsedTimeNow.Add(time.Hour * 24 * 5)\n\te1End := e1Start.Add(time.Hour * 4)\n\tloc := \"gnome land\"\n\n\tid, _ := AddEvent(\"ToDelete\", \"description\", \"gno.land\", loc, e1Start.Format(time.RFC3339), e1End.Format(time.RFC3339))\n\n\tnewName := \"New Name\"\n\tnewDesc := \"Normal description\"\n\tnewLink := \"new Link\"\n\tnewST := e1Start.Add(time.Hour)\n\tnewET := newST.Add(time.Hour)\n\n\tEditEvent(id, newName, newDesc, newLink, \"\", newST.Format(time.RFC3339), newET.Format(time.RFC3339))\n\tedited, _, _ := GetEventByID(id)\n\n\t// Check updated values\n\tuassert.Equal(t, edited.name, newName)\n\tuassert.Equal(t, edited.description, newDesc)\n\tuassert.Equal(t, edited.link, newLink)\n\tuassert.True(t, edited.startTime.Equal(newST))\n\tuassert.True(t, edited.endTime.Equal(newET))\n\n\t// Check if the old values are the same\n\tuassert.Equal(t, edited.location, loc)\n}\n\nfunc TestInvalidEdit(t *testing.T) {\n\tevents = nil // remove elements from previous tests - see issue #1982\n\n\tuassert.PanicsWithMessage(t, ErrNoSuchID.Error(), func() {\n\t\tEditEvent(\"123123\", \"\", \"\", \"\", \"\", \"\", \"\")\n\t})\n}\n\nfunc TestParseTimes(t *testing.T) {\n\t// times not provided\n\t// end time before start time\n\t// timezone Missmatch\n\n\t_, _, err := parseTimes(\"\", \"\")\n\tuassert.ErrorContains(t, err, ErrInvalidStartTime.Error())\n\n\t_, _, err = parseTimes(now, \"\")\n\tuassert.ErrorContains(t, err, ErrInvalidEndTime.Error())\n\n\t_, _, err = parseTimes(\"2009-02-13T23:30:30Z\", \"2009-02-13T21:30:30Z\")\n\tuassert.ErrorContains(t, err, ErrEndBeforeStart.Error())\n\n\t_, _, err = parseTimes(\"2009-02-10T23:30:30+02:00\", \"2009-02-13T21:30:33+05:00\")\n\tuassert.ErrorContains(t, err, ErrStartEndTimezonemMismatch.Error())\n}\n\nfunc TestRenderEventWidget(t *testing.T) {\n\tevents = nil // remove elements from previous tests - see issue #1982\n\n\t// No events yet\n\tout, err := RenderEventWidget(1)\n\tuassert.NoError(t, err)\n\tuassert.Equal(t, out, \"No events.\")\n\n\t// Too many events\n\tout, err = RenderEventWidget(MaxWidgetSize + 1)\n\tuassert.ErrorIs(t, err, ErrMaxWidgetSize)\n\n\t// Too little events\n\tout, err = RenderEventWidget(0)\n\tuassert.ErrorIs(t, err, ErrMinWidgetSize)\n\n\t// Ordering \u0026 if requested amt is larger than the num of events that exist\n\te1Start := parsedTimeNow.Add(time.Hour * 24 * 5)\n\te1End := e1Start.Add(time.Hour * 4)\n\n\te2Start := parsedTimeNow.Add(time.Hour * 24 * 10) // event 2 is after event 1\n\te2End := e2Start.Add(time.Hour * 4)\n\n\t_, err = AddEvent(\"Event 1\", \"description\", \"gno.land\", \"loc\", e1Start.Format(time.RFC3339), e1End.Format(time.RFC3339))\n\turequire.NoError(t, err)\n\n\t_, err = AddEvent(\"Event 2\", \"description\", \"gno.land\", \"loc\", e2Start.Format(time.RFC3339), e2End.Format(time.RFC3339))\n\turequire.NoError(t, err)\n\n\tout, err = RenderEventWidget(MaxWidgetSize)\n\turequire.NoError(t, err)\n\n\tuniqueSequence := \"- [\" // sequence that is displayed once per each event as per the RenderEventWidget function\n\tuassert.Equal(t, 2, strings.Count(out, uniqueSequence))\n\n\tuassert.True(t, strings.Index(out, \"Event 1\") \u003e strings.Index(out, \"Event 2\"))\n}\n"},{"name":"rendering.gno","body":"package events\n\nimport (\n\t\"bytes\"\n\t\"time\"\n\n\t\"gno.land/p/demo/ufmt\"\n)\n\nconst (\n\tMaxWidgetSize = 5\n)\n\n// RenderEventWidget shows up to eventsToRender of the latest events to a caller\nfunc RenderEventWidget(eventsToRender int) (string, error) {\n\tnumOfEvents := len(events)\n\tif numOfEvents == 0 {\n\t\treturn \"No events.\", nil\n\t}\n\n\tif eventsToRender \u003e MaxWidgetSize {\n\t\treturn \"\", ErrMaxWidgetSize\n\t}\n\n\tif eventsToRender \u003c 1 {\n\t\treturn \"\", ErrMinWidgetSize\n\t}\n\n\tif eventsToRender \u003e numOfEvents {\n\t\teventsToRender = numOfEvents\n\t}\n\n\toutput := \"\"\n\n\tfor _, event := range events[:eventsToRender] {\n\t\toutput += ufmt.Sprintf(\"- [%s](%s)\\n\", event.name, event.link)\n\t}\n\n\treturn output, nil\n}\n\n// renderHome renders the home page of the events realm\nfunc renderHome(admin bool) string {\n\toutput := \"# gno.land events\\n\\n\"\n\n\tif len(events) == 0 {\n\t\toutput += \"No upcoming or past events.\"\n\t\treturn output\n\t}\n\n\toutput += \"Below is a list of all gno.land events, including in progress, upcoming, and past ones.\\n\\n\"\n\toutput += \"---\\n\\n\"\n\n\tvar (\n\t\tinProgress = \"\"\n\t\tupcoming = \"\"\n\t\tpast = \"\"\n\t\tnow = time.Now()\n\t)\n\n\tfor _, e := range events {\n\t\tif now.Before(e.startTime) {\n\t\t\tupcoming += e.Render(admin)\n\t\t} else if now.After(e.endTime) {\n\t\t\tpast += e.Render(admin)\n\t\t} else {\n\t\t\tinProgress += e.Render(admin)\n\t\t}\n\t}\n\n\tif upcoming != \"\" {\n\t\t// Add upcoming events\n\t\toutput += \"## Upcoming events\\n\\n\"\n\t\toutput += \"\u003cdiv class='columns-3'\u003e\"\n\n\t\toutput += upcoming\n\n\t\toutput += \"\u003c/div\u003e\\n\\n\"\n\t\toutput += \"---\\n\\n\"\n\t}\n\n\tif inProgress != \"\" {\n\t\toutput += \"## Currently in progress\\n\\n\"\n\t\toutput += \"\u003cdiv class='columns-3'\u003e\"\n\n\t\toutput += inProgress\n\n\t\toutput += \"\u003c/div\u003e\\n\\n\"\n\t\toutput += \"---\\n\\n\"\n\t}\n\n\tif past != \"\" {\n\t\t// Add past events\n\t\toutput += \"## Past events\\n\\n\"\n\t\toutput += \"\u003cdiv class='columns-3'\u003e\"\n\n\t\toutput += past\n\n\t\toutput += \"\u003c/div\u003e\\n\\n\"\n\t}\n\n\treturn output\n}\n\n// Render returns the markdown representation of a single event instance\nfunc (e Event) Render(admin bool) string {\n\tvar buf bytes.Buffer\n\n\tbuf.WriteString(\"\u003cdiv\u003e\\n\\n\")\n\tbuf.WriteString(ufmt.Sprintf(\"### %s\\n\\n\", e.name))\n\tbuf.WriteString(ufmt.Sprintf(\"%s\\n\\n\", e.description))\n\tbuf.WriteString(ufmt.Sprintf(\"**Location:** %s\\n\\n\", e.location))\n\n\t_, offset := e.startTime.Zone() // offset is in seconds\n\thoursOffset := offset / (60 * 60)\n\tsign := \"\"\n\tif offset \u003e= 0 {\n\t\tsign = \"+\"\n\t}\n\n\tbuf.WriteString(ufmt.Sprintf(\"**Starts:** %s UTC%s%d\\n\\n\", e.startTime.Format(\"02 Jan 2006, 03:04 PM\"), sign, hoursOffset))\n\tbuf.WriteString(ufmt.Sprintf(\"**Ends:** %s UTC%s%d\\n\\n\", e.endTime.Format(\"02 Jan 2006, 03:04 PM\"), sign, hoursOffset))\n\n\tif admin {\n\t\tbuf.WriteString(ufmt.Sprintf(\"[EDIT](/r/gnoland/events?help\u0026__func=EditEvent\u0026id=%s)\\n\\n\", e.id))\n\t\tbuf.WriteString(ufmt.Sprintf(\"[DELETE](/r/gnoland/events?help\u0026__func=DeleteEvent\u0026id=%s)\\n\\n\", e.id))\n\t}\n\n\tif e.link != \"\" {\n\t\tbuf.WriteString(ufmt.Sprintf(\"[See more](%s)\\n\\n\", e.link))\n\t}\n\n\tbuf.WriteString(\"\u003c/div\u003e\")\n\n\treturn buf.String()\n}\n\n// Render is the main rendering entry point\nfunc Render(path string) string {\n\tif path == \"admin\" {\n\t\treturn renderHome(true)\n\t}\n\n\treturn renderHome(false)\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} {"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"faucet","path":"gno.land/r/gnoland/faucet","files":[{"name":"admin.gno","body":"package faucet\n\nimport (\n\t\"errors\"\n\t\"std\"\n)\n\nfunc AdminSetInPause(inPause bool) string {\n\tif err := assertIsAdmin(); err != nil {\n\t\treturn err.Error()\n\t}\n\tgInPause = inPause\n\treturn \"\"\n}\n\nfunc AdminSetMessage(message string) string {\n\tif err := assertIsAdmin(); err != nil {\n\t\treturn err.Error()\n\t}\n\tgMessage = message\n\treturn \"\"\n}\n\nfunc AdminSetTransferLimit(amount int64) string {\n\tif err := assertIsAdmin(); err != nil {\n\t\treturn err.Error()\n\t}\n\tgLimit = std.NewCoin(\"ugnot\", amount)\n\treturn \"\"\n}\n\nfunc AdminSetAdminAddr(addr std.Address) string {\n\tif err := assertIsAdmin(); err != nil {\n\t\treturn err.Error()\n\t}\n\tgAdminAddr = addr\n\treturn \"\"\n}\n\nfunc AdminAddController(addr std.Address) string {\n\tif err := assertIsAdmin(); err != nil {\n\t\treturn err.Error()\n\t}\n\n\tsize := gControllers.Size()\n\n\tif size \u003e= gControllersMaxSize {\n\t\treturn \"can not add more controllers than allowed\"\n\t}\n\n\tif gControllers.Has(addr.String()) {\n\t\treturn addr.String() + \" exists, no need to add.\"\n\t}\n\n\tgControllers.Set(addr.String(), addr)\n\n\treturn \"\"\n}\n\nfunc AdminRemoveController(addr std.Address) string {\n\tif err := assertIsAdmin(); err != nil {\n\t\treturn err.Error()\n\t}\n\n\tif !gControllers.Has(addr.String()) {\n\t\treturn addr.String() + \" is not on the controller list\"\n\t}\n\n\t_, ok := gControllers.Remove(addr.String())\n\n\t// it not should happen.\n\t// we will check anyway to prevent issues in the underline implementation.\n\n\tif !ok {\n\t\treturn addr.String() + \" is not on the controller list\"\n\t}\n\n\treturn \"\"\n}\n\nfunc assertIsAdmin() error {\n\tcaller := std.GetOrigCaller()\n\tif caller != gAdminAddr {\n\t\treturn errors.New(\"restricted for admin\")\n\t}\n\treturn nil\n}\n"},{"name":"faucet.gno","body":"package faucet\n\nimport (\n\t\"errors\"\n\t\"std\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/ufmt\"\n)\n\nvar (\n\t// configurable by admin.\n\tgAdminAddr std.Address = std.Address(\"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\")\n\tgControllers = avl.NewTree()\n\tgControllersMaxSize = 10 // limit it to 10\n\tgInPause = false\n\tgMessage = \"# Community Faucet.\\n\\n\"\n\n\t// internal vars, for stats.\n\tgTotalTransferred std.Coins\n\tgTotalTransfers = uint(0)\n\n\t// per request limit, 350 gnot\n\tgLimit std.Coin = std.NewCoin(\"ugnot\", 350000000)\n)\n\nfunc Transfer(to std.Address, send int64) string {\n\tif err := assertIsController(); err != nil {\n\t\treturn err.Error()\n\t}\n\n\tif gInPause {\n\t\treturn errors.New(\"faucet in pause\").Error()\n\t}\n\n\t// limit the per request\n\tif send \u003e gLimit.Amount {\n\t\treturn errors.New(\"Per request limit \" + gLimit.String() + \" exceed\").Error()\n\t}\n\tsendCoins := std.Coins{std.NewCoin(\"ugnot\", send)}\n\n\tgTotalTransferred = gTotalTransferred.Add(sendCoins)\n\tgTotalTransfers++\n\n\tbanker := std.GetBanker(std.BankerTypeRealmSend)\n\tpkgaddr := std.CurrentRealm().Addr()\n\tbanker.SendCoins(pkgaddr, to, sendCoins)\n\treturn \"\"\n}\n\nfunc GetPerTransferLimit() int64 {\n\treturn gLimit.Amount\n}\n\nfunc Render(_ string) string {\n\tbanker := std.GetBanker(std.BankerTypeRealmSend)\n\tbalance := banker.GetCoins(std.CurrentRealm().Addr())\n\n\toutput := gMessage\n\tif gInPause {\n\t\toutput += \"Status: inactive.\\n\"\n\t} else {\n\t\toutput += \"Status: active.\\n\"\n\t}\n\toutput += ufmt.Sprintf(\"Balance: %s.\\n\", balance.String())\n\toutput += ufmt.Sprintf(\"Total transfers: %s (in %d times).\\n\\n\", gTotalTransferred.String(), gTotalTransfers)\n\n\toutput += \"Package address: \" + std.CurrentRealm().Addr().String() + \"\\n\\n\"\n\toutput += ufmt.Sprintf(\"Admin: %s\\n\\n \", gAdminAddr.String())\n\toutput += ufmt.Sprintf(\"Controllers:\\n\\n \")\n\n\tfor i := 0; i \u003c gControllers.Size(); i++ {\n\t\t_, v := gControllers.GetByIndex(i)\n\t\toutput += ufmt.Sprintf(\"%s \", v.(std.Address))\n\t}\n\n\toutput += \"\\n\\n\"\n\toutput += ufmt.Sprintf(\"Per request limit: %s\\n\\n\", gLimit.String())\n\n\treturn output\n}\n\nfunc assertIsController() error {\n\tcaller := std.GetOrigCaller()\n\n\tok := gControllers.Has(caller.String())\n\tif !ok {\n\t\treturn errors.New(caller.String() + \" is not on the controller list\")\n\t}\n\treturn nil\n}\n"},{"name":"faucet_test.gno","body":"package faucet\n\nimport (\n\t\"std\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/gnoland/faucet\"\n)\n\nfunc TestPackage(t *testing.T) {\n\tvar (\n\t\tadminaddr = std.Address(\"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\")\n\t\tfaucetaddr = std.DerivePkgAddr(\"gno.land/r/gnoland/faucet\")\n\t\tcontrolleraddr1 = testutils.TestAddress(\"controller1\")\n\t\tcontrolleraddr2 = testutils.TestAddress(\"controller2\")\n\t\tcontrolleraddr3 = testutils.TestAddress(\"controller3\")\n\t\tcontrolleraddr4 = testutils.TestAddress(\"controller4\")\n\t\tcontrolleraddr5 = testutils.TestAddress(\"controller5\")\n\t\tcontrolleraddr6 = testutils.TestAddress(\"controller6\")\n\t\tcontrolleraddr7 = testutils.TestAddress(\"controller7\")\n\t\tcontrolleraddr8 = testutils.TestAddress(\"controller8\")\n\t\tcontrolleraddr9 = testutils.TestAddress(\"controller9\")\n\t\tcontrolleraddr10 = testutils.TestAddress(\"controller10\")\n\t\tcontrolleraddr11 = testutils.TestAddress(\"controller11\")\n\n\t\ttest1addr = testutils.TestAddress(\"test1\")\n\t)\n\t// deposit 1000gnot to faucet contract\n\tstd.TestIssueCoins(faucetaddr, std.Coins{{\"ugnot\", 1000000000}})\n\tassertBalance(t, faucetaddr, 1200000000)\n\n\t// by default, balance is empty, and as a user I cannot call Transfer, or Admin commands.\n\n\tassertBalance(t, test1addr, 0)\n\tstd.TestSetOrigCaller(test1addr)\n\tassertErr(t, faucet.Transfer(test1addr, 1000000))\n\n\tassertErr(t, faucet.AdminAddController(controlleraddr1))\n\tstd.TestSetOrigCaller(controlleraddr1)\n\tassertErr(t, faucet.Transfer(test1addr, 1000000))\n\n\t// as an admin, add the controller to contract and deposit more 2000gnot to contract\n\tstd.TestSetOrigCaller(adminaddr)\n\tassertNoErr(t, faucet.AdminAddController(controlleraddr1))\n\tassertBalance(t, faucetaddr, 1200000000)\n\n\t// now, send some tokens as controller.\n\tstd.TestSetOrigCaller(controlleraddr1)\n\tassertNoErr(t, faucet.Transfer(test1addr, 1000000))\n\tassertBalance(t, test1addr, 1000000)\n\tassertNoErr(t, faucet.Transfer(test1addr, 1000000))\n\tassertBalance(t, test1addr, 2000000)\n\tassertBalance(t, faucetaddr, 1198000000)\n\n\t// remove controller\n\t// as an admin, remove controller\n\tstd.TestSetOrigCaller(adminaddr)\n\tassertNoErr(t, faucet.AdminRemoveController(controlleraddr1))\n\tstd.TestSetOrigCaller(controlleraddr1)\n\tassertErr(t, faucet.Transfer(test1addr, 1000000))\n\n\t// duplicate controller\n\tstd.TestSetOrigCaller(adminaddr)\n\tassertNoErr(t, faucet.AdminAddController(controlleraddr1))\n\tassertErr(t, faucet.AdminAddController(controlleraddr1))\n\t// add more than more than allowed controllers\n\tassertNoErr(t, faucet.AdminAddController(controlleraddr2))\n\tassertNoErr(t, faucet.AdminAddController(controlleraddr3))\n\tassertNoErr(t, faucet.AdminAddController(controlleraddr4))\n\tassertNoErr(t, faucet.AdminAddController(controlleraddr5))\n\tassertNoErr(t, faucet.AdminAddController(controlleraddr6))\n\tassertNoErr(t, faucet.AdminAddController(controlleraddr7))\n\tassertNoErr(t, faucet.AdminAddController(controlleraddr8))\n\tassertNoErr(t, faucet.AdminAddController(controlleraddr9))\n\tassertNoErr(t, faucet.AdminAddController(controlleraddr10))\n\tassertErr(t, faucet.AdminAddController(controlleraddr11))\n\n\t// send more than per transfer limit\n\tstd.TestSetOrigCaller(adminaddr)\n\tfaucet.AdminSetTransferLimit(300000000)\n\tstd.TestSetOrigCaller(controlleraddr1)\n\tassertErr(t, faucet.Transfer(test1addr, 301000000))\n\n\t// block transefer from the address not on the controllers list.\n\tstd.TestSetOrigCaller(controlleraddr11)\n\tassertErr(t, faucet.Transfer(test1addr, 1000000))\n}\n\nfunc assertErr(t *testing.T, err string) {\n\tt.Helper()\n\n\tif err == \"\" {\n\t\tt.Logf(\"info: got err: %v\", err)\n\t\tt.Errorf(\"expected an error, got nil.\")\n\t}\n}\n\nfunc assertNoErr(t *testing.T, err string) {\n\tt.Helper()\n\tif err != \"\" {\n\t\tt.Errorf(\"got err: %v.\", err)\n\t}\n}\n\nfunc assertBalance(t *testing.T, addr std.Address, expectedBal int64) {\n\tt.Helper()\n\tbanker := std.GetBanker(std.BankerTypeReadonly)\n\tcoins := banker.GetCoins(addr)\n\tgot := coins.AmountOf(\"ugnot\")\n\n\tif expectedBal != got {\n\t\tt.Errorf(\"invalid balance: expected %d, got %d.\", expectedBal, got)\n\t}\n}\n"},{"name":"z0_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\t\"gno.land/r/gnoland/faucet\"\n)\n\n// mints ugnot to current realm\nfunc init() {\n\tfacuetaddr := std.DerivePkgAddr(\"gno.land/r/gnoland/faucet\")\n\tstd.TestIssueCoins(facuetaddr, std.Coins{{\"ugnot\", 200000000}})\n}\n\n// assert render with empty path and no controllers\nfunc main() {\n\tprintln(faucet.Render(\"\"))\n}\n\n// Output:\n// # Community Faucet.\n//\n// Status: active.\n// Balance: 200000000ugnot.\n// Total transfers: (in 0 times).\n//\n// Package address: g1ttrq7mp4zy6dssnmgyyktnn4hcj3ys8xhju0n7\n//\n// Admin: g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\n//\n// Controllers:\n//\n//\n//\n// Per request limit: 350000000ugnot\n"},{"name":"z1_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\t\"gno.land/r/gnoland/faucet\"\n)\n\n// mints ugnot to current realm\nfunc init() {\n\tfacuetaddr := std.DerivePkgAddr(\"gno.land/r/gnoland/faucet\")\n\tstd.TestIssueCoins(facuetaddr, std.Coins{{\"ugnot\", 200000000}})\n}\n\n// assert render with a path and no controllers\nfunc main() {\n\tprintln(faucet.Render(\"path\"))\n}\n\n// Output:\n// # Community Faucet.\n//\n// Status: active.\n// Balance: 200000000ugnot.\n// Total transfers: (in 0 times).\n//\n// Package address: g1ttrq7mp4zy6dssnmgyyktnn4hcj3ys8xhju0n7\n//\n// Admin: g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\n//\n// Controllers:\n//\n//\n//\n// Per request limit: 350000000ugnot\n"},{"name":"z2_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/gnoland/faucet\"\n)\n\n// mints ugnot to current realm\nfunc init() {\n\tfacuetaddr := std.DerivePkgAddr(\"gno.land/r/gnoland/faucet\")\n\tstd.TestIssueCoins(facuetaddr, std.Coins{{\"ugnot\", 200000000}})\n}\n\n// assert render with empty path and 2 controllers\nfunc main() {\n\tvar (\n\t\tadminaddr = std.Address(\"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\")\n\t\tcontrolleraddr1 = testutils.TestAddress(\"controller1\")\n\t\tcontrolleraddr2 = testutils.TestAddress(\"controller2\")\n\t)\n\tstd.TestSetOrigCaller(adminaddr)\n\terr := faucet.AdminAddController(controlleraddr1)\n\tif err != \"\" {\n\t\tpanic(err)\n\t}\n\terr = faucet.AdminAddController(controlleraddr2)\n\tif err != \"\" {\n\t\tpanic(err)\n\t}\n\tprintln(faucet.Render(\"\"))\n}\n\n// Output:\n// # Community Faucet.\n//\n// Status: active.\n// Balance: 200000000ugnot.\n// Total transfers: (in 0 times).\n//\n// Package address: g1ttrq7mp4zy6dssnmgyyktnn4hcj3ys8xhju0n7\n//\n// Admin: g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\n//\n// Controllers:\n//\n// g1vdhkuarjdakxcetjx9047h6lta047h6lsdacav g1vdhkuarjdakxcetjxf047h6lta047h6lnrev3v\n//\n// Per request limit: 350000000ugnot\n"},{"name":"z3_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/gnoland/faucet\"\n)\n\n// mints coints to current realm\nfunc init() {\n\tfacuetaddr := std.DerivePkgAddr(\"gno.land/r/gnoland/faucet\")\n\tstd.TestIssueCoins(facuetaddr, std.Coins{{\"ugnot\", 200000000}})\n}\n\n// assert render with 2 controllers and 2 transfers\nfunc main() {\n\tvar (\n\t\tadminaddr = std.Address(\"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\")\n\t\tcontrolleraddr1 = testutils.TestAddress(\"controller1\")\n\t\tcontrolleraddr2 = testutils.TestAddress(\"controller2\")\n\t\ttestaddr1 = testutils.TestAddress(\"test1\")\n\t\ttestaddr2 = testutils.TestAddress(\"test2\")\n\t)\n\tstd.TestSetOrigCaller(adminaddr)\n\terr := faucet.AdminAddController(controlleraddr1)\n\tif err != \"\" {\n\t\tpanic(err)\n\t}\n\terr = faucet.AdminAddController(controlleraddr2)\n\tif err != \"\" {\n\t\tpanic(err)\n\t}\n\tstd.TestSetOrigCaller(controlleraddr1)\n\terr = faucet.Transfer(testaddr1, 1000000)\n\tif err != \"\" {\n\t\tpanic(err)\n\t}\n\tstd.TestSetOrigCaller(controlleraddr2)\n\terr = faucet.Transfer(testaddr1, 2000000)\n\tif err != \"\" {\n\t\tpanic(err)\n\t}\n\tprintln(faucet.Render(\"\"))\n}\n\n// Output:\n// # Community Faucet.\n//\n// Status: active.\n// Balance: 197000000ugnot.\n// Total transfers: 3000000ugnot (in 2 times).\n//\n// Package address: g1ttrq7mp4zy6dssnmgyyktnn4hcj3ys8xhju0n7\n//\n// Admin: g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\n//\n// Controllers:\n//\n// g1vdhkuarjdakxcetjx9047h6lta047h6lsdacav g1vdhkuarjdakxcetjxf047h6lta047h6lnrev3v\n//\n// Per request limit: 350000000ugnot\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} {"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"ghverify","path":"gno.land/r/gnoland/ghverify","files":[{"name":"README.md","body":"# ghverify\n\nThis realm is intended to enable off chain gno address to github handle verification.\nThe steps are as follows:\n- A user calls `RequestVerification` and provides a github handle. This creates a new static oracle feed.\n- An off-chain agent controlled by the owner of this realm requests current feeds using the `GnorkleEntrypoint` function and provides a message of `\"request\"`\n- The agent receives the task information that includes the github handle and the gno address. It performs the verification step by checking whether this github user has the address in a github repository it controls.\n- The agent publishes the result of the verification by calling `GnorkleEntrypoint` with a message structured like: `\"ingest,\u003ctask id\u003e,\u003cverification status\u003e\"`. The verification status is `OK` if verification succeeded and any other value if it failed.\n- The oracle feed's ingester processes the verification and the handle to address mapping is written to the avl trees that exist as ghverify realm variables."},{"name":"contract.gno","body":"package ghverify\n\nimport (\n\t\"errors\"\n\t\"std\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/gnorkle/feeds/static\"\n\t\"gno.land/p/demo/gnorkle/gnorkle\"\n\t\"gno.land/p/demo/gnorkle/message\"\n)\n\nconst (\n\t// The agent should send this value if it has verified the github handle.\n\tverifiedResult = \"OK\"\n)\n\nvar (\n\townerAddress = std.GetOrigCaller()\n\toracle *gnorkle.Instance\n\tpostHandler postGnorkleMessageHandler\n\n\thandleToAddressMap = avl.NewTree()\n\taddressToHandleMap = avl.NewTree()\n)\n\nfunc init() {\n\toracle = gnorkle.NewInstance()\n\toracle.AddToWhitelist(\"\", []string{string(ownerAddress)})\n}\n\ntype postGnorkleMessageHandler struct{}\n\n// Handle does post processing after a message is ingested by the oracle feed. It extracts the value to realm\n// storage and removes the feed from the oracle.\nfunc (h postGnorkleMessageHandler) Handle(i *gnorkle.Instance, funcType message.FuncType, feed gnorkle.Feed) error {\n\tif funcType != message.FuncTypeIngest {\n\t\treturn nil\n\t}\n\n\tresult, _, consumable := feed.Value()\n\tif !consumable {\n\t\treturn nil\n\t}\n\n\t// The value is consumable, meaning the ingestion occurred, so we can remove the feed from the oracle\n\t// after saving it to realm storage.\n\tdefer oracle.RemoveFeed(feed.ID())\n\n\t// Couldn't verify; nothing to do.\n\tif result.String != verifiedResult {\n\t\treturn nil\n\t}\n\n\tfeedTasks := feed.Tasks()\n\tif len(feedTasks) != 1 {\n\t\treturn errors.New(\"expected feed to have exactly one task\")\n\t}\n\n\ttask, ok := feedTasks[0].(*verificationTask)\n\tif !ok {\n\t\treturn errors.New(\"expected ghverify task\")\n\t}\n\n\thandleToAddressMap.Set(task.githubHandle, task.gnoAddress)\n\taddressToHandleMap.Set(task.gnoAddress, task.githubHandle)\n\treturn nil\n}\n\n// RequestVerification creates a new static feed with a single task that will\n// instruct an agent to verify the github handle / gno address pair.\nfunc RequestVerification(githubHandle string) {\n\tgnoAddress := string(std.GetOrigCaller())\n\tif err := oracle.AddFeeds(\n\t\tstatic.NewSingleValueFeed(\n\t\t\tgnoAddress,\n\t\t\t\"string\",\n\t\t\t\u0026verificationTask{\n\t\t\t\tgnoAddress: gnoAddress,\n\t\t\t\tgithubHandle: githubHandle,\n\t\t\t},\n\t\t),\n\t); err != nil {\n\t\tpanic(err)\n\t}\n}\n\n// GnorkleEntrypoint is the entrypoint to the gnorkle oracle handler.\nfunc GnorkleEntrypoint(message string) string {\n\tresult, err := oracle.HandleMessage(message, postHandler)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\treturn result\n}\n\n// SetOwner transfers ownership of the contract to the given address.\nfunc SetOwner(owner std.Address) {\n\tif ownerAddress != std.GetOrigCaller() {\n\t\tpanic(\"only the owner can set a new owner\")\n\t}\n\n\townerAddress = owner\n\n\t// In the context of this contract, the owner is the only one that can\n\t// add new feeds to the oracle.\n\toracle.ClearWhitelist(\"\")\n\toracle.AddToWhitelist(\"\", []string{string(ownerAddress)})\n}\n\n// GetHandleByAddress returns the github handle associated with the given gno address.\nfunc GetHandleByAddress(address string) string {\n\tif value, ok := addressToHandleMap.Get(address); ok {\n\t\treturn value.(string)\n\t}\n\n\treturn \"\"\n}\n\n// GetAddressByHandle returns the gno address associated with the given github handle.\nfunc GetAddressByHandle(handle string) string {\n\tif value, ok := handleToAddressMap.Get(handle); ok {\n\t\treturn value.(string)\n\t}\n\n\treturn \"\"\n}\n\n// Render returns a json object string will all verified handle -\u003e address mappings.\nfunc Render(_ string) string {\n\tresult := \"{\"\n\tvar appendComma bool\n\thandleToAddressMap.Iterate(\"\", \"\", func(handle string, address interface{}) bool {\n\t\tif appendComma {\n\t\t\tresult += \",\"\n\t\t}\n\n\t\tresult += `\"` + handle + `\": \"` + address.(string) + `\"`\n\t\tappendComma = true\n\n\t\treturn true\n\t})\n\n\treturn result + \"}\"\n}\n"},{"name":"contract_test.gno","body":"package ghverify\n\nimport (\n\t\"std\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/testutils\"\n)\n\nfunc TestVerificationLifecycle(t *testing.T) {\n\tdefaultAddress := std.GetOrigCaller()\n\tuserAddress := std.Address(testutils.TestAddress(\"user\"))\n\n\t// Verify request returns no feeds.\n\tresult := GnorkleEntrypoint(\"request\")\n\tif result != \"[]\" {\n\t\tt.Fatalf(\"expected empty request result, got %s\", result)\n\t}\n\n\t// Make a verification request with the created user.\n\tstd.TestSetOrigCaller(userAddress)\n\tRequestVerification(\"deelawn\")\n\n\t// A subsequent request from the same address should panic because there is\n\t// already a feed with an ID of this user's address.\n\tvar errMsg string\n\tfunc() {\n\t\tdefer func() {\n\t\t\tif r := recover(); r != nil {\n\t\t\t\terrMsg = r.(error).Error()\n\t\t\t}\n\t\t}()\n\t\tRequestVerification(\"deelawn\")\n\t}()\n\tif errMsg != \"feed already exists\" {\n\t\tt.Fatalf(\"expected feed already exists, got %s\", errMsg)\n\t}\n\n\t// Verify the request returns no feeds for this non-whitelisted user.\n\tresult = GnorkleEntrypoint(\"request\")\n\tif result != \"[]\" {\n\t\tt.Fatalf(\"expected empty request result, got %s\", result)\n\t}\n\n\t// Set the caller back to the whitelisted user and verify that the feed data\n\t// returned matches what should have been created by the `RequestVerification`\n\t// invocation.\n\tstd.TestSetOrigCaller(defaultAddress)\n\tresult = GnorkleEntrypoint(\"request\")\n\texpResult := `[{\"id\":\"` + string(userAddress) + `\",\"type\":\"0\",\"value_type\":\"string\",\"tasks\":[{\"gno_address\":\"` +\n\t\tstring(userAddress) + `\",\"github_handle\":\"deelawn\"}]}]`\n\tif result != expResult {\n\t\tt.Fatalf(\"expected request result %s, got %s\", expResult, result)\n\t}\n\n\t// Try to trigger feed ingestion from the non-authorized user.\n\tstd.TestSetOrigCaller(userAddress)\n\tfunc() {\n\t\tdefer func() {\n\t\t\tif r := recover(); r != nil {\n\t\t\t\terrMsg = r.(error).Error()\n\t\t\t}\n\t\t}()\n\t\tGnorkleEntrypoint(\"ingest,\" + string(userAddress) + \",OK\")\n\t}()\n\tif errMsg != \"caller not whitelisted\" {\n\t\tt.Fatalf(\"expected caller not whitelisted, got %s\", errMsg)\n\t}\n\n\t// Set the caller back to the whitelisted user and transfer contract ownership.\n\tstd.TestSetOrigCaller(defaultAddress)\n\tSetOwner(userAddress)\n\n\t// Now trigger the feed ingestion from the user and new owner and only whitelisted address.\n\tstd.TestSetOrigCaller(userAddress)\n\tGnorkleEntrypoint(\"ingest,\" + string(userAddress) + \",OK\")\n\n\t// Verify the ingestion autocommitted the value and triggered the post handler.\n\tdata := Render(\"\")\n\texpResult = `{\"deelawn\": \"` + string(userAddress) + `\"}`\n\tif data != expResult {\n\t\tt.Fatalf(\"expected render data %s, got %s\", expResult, data)\n\t}\n\n\t// Finally make sure the feed was cleaned up after the data was committed.\n\tresult = GnorkleEntrypoint(\"request\")\n\tif result != \"[]\" {\n\t\tt.Fatalf(\"expected empty request result, got %s\", result)\n\t}\n\n\t// Check that the accessor functions are working as expected.\n\tif handle := GetHandleByAddress(string(userAddress)); handle != \"deelawn\" {\n\t\tt.Fatalf(\"expected deelawn, got %s\", handle)\n\t}\n\tif address := GetAddressByHandle(\"deelawn\"); address != string(userAddress) {\n\t\tt.Fatalf(\"expected %s, got %s\", string(userAddress), address)\n\t}\n}\n"},{"name":"task.gno","body":"package ghverify\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n)\n\ntype verificationTask struct {\n\tgnoAddress string\n\tgithubHandle string\n}\n\n// MarshalJSON marshals the task contents to JSON.\nfunc (t *verificationTask) MarshalJSON() ([]byte, error) {\n\tbuf := new(bytes.Buffer)\n\tw := bufio.NewWriter(buf)\n\n\tw.Write(\n\t\t[]byte(`{\"gno_address\":\"` + t.gnoAddress + `\",\"github_handle\":\"` + t.githubHandle + `\"}`),\n\t)\n\n\tw.Flush()\n\treturn buf.Bytes(), nil\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} -{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"home","path":"gno.land/r/gnoland/home","files":[{"name":"home.gno","body":"package home\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/ownable\"\n\t\"gno.land/p/demo/ufmt\"\n\t\"gno.land/p/demo/ui\"\n\tblog \"gno.land/r/gnoland/blog\"\n\tevents \"gno.land/r/gnoland/events\"\n)\n\n// XXX: p/demo/ui API is crappy, we need to make it more idiomatic\n// XXX: use an updatable block system to update content from a DAO\n// XXX: var blocks avl.Tree\n\nvar (\n\toverride string\n\tadmin = ownable.NewWithAddress(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\") // @moul\n)\n\nfunc Render(_ string) string {\n\tif override != \"\" {\n\t\treturn override\n\t}\n\n\tdom := ui.DOM{Prefix: \"r/gnoland/home:\"}\n\tdom.Title = \"Welcome to gno.land\"\n\tdom.Classes = []string{\"gno-tmpl-section\"}\n\n\t// body\n\tdom.Body.Append(introSection()...)\n\n\tdom.Body.Append(ui.Jumbotron(discoverLinks()))\n\n\tdom.Body.Append(\n\t\tui.Columns{3, []ui.Element{\n\t\t\tlastBlogposts(4),\n\t\t\tupcomingEvents(),\n\t\t\tlastContributions(4),\n\t\t}},\n\t)\n\n\tdom.Body.Append(ui.HR{})\n\tdom.Body.Append(playgroundSection()...)\n\tdom.Body.Append(ui.HR{})\n\tdom.Body.Append(packageStaffPicks()...)\n\tdom.Body.Append(ui.HR{})\n\tdom.Body.Append(worxDAO()...)\n\tdom.Body.Append(ui.HR{})\n\t// footer\n\tdom.Footer.Append(\n\t\tui.Columns{2, []ui.Element{\n\t\t\tsocialLinks(),\n\t\t\tquoteOfTheBlock(),\n\t\t}},\n\t)\n\n\t// Testnet disclaimer\n\tdom.Footer.Append(\n\t\tui.HR{},\n\t\tui.Bold(\"This is a testnet.\"),\n\t\tui.Text(\"Package names are not guaranteed to be available for production.\"),\n\t)\n\n\treturn dom.String()\n}\n\nfunc lastBlogposts(limit int) ui.Element {\n\tposts := blog.RenderLastPostsWidget(limit)\n\treturn ui.Element{\n\t\tui.H3(\"[Latest Blogposts](/r/gnoland/blog)\"),\n\t\tui.Text(posts),\n\t}\n}\n\nfunc lastContributions(limit int) ui.Element {\n\treturn ui.Element{\n\t\tui.H3(\"Latest Contributions\"),\n\t\t// TODO: import r/gh to\n\t\tui.Link{Text: \"View latest contributions\", URL: \"https://github.com/gnolang/gno/pulls\"},\n\t}\n}\n\nfunc upcomingEvents() ui.Element {\n\tout, _ := events.RenderEventWidget(events.MaxWidgetSize)\n\treturn ui.Element{\n\t\tui.H3(\"[Latest Events](/r/gnoland/events)\"),\n\t\tui.Text(out),\n\t}\n}\n\nfunc introSection() ui.Element {\n\treturn ui.Element{\n\t\tui.H3(\"We’re building gno.land, set to become the leading open-source smart contract platform, using Gno, an interpreted and fully deterministic variation of the Go programming language for succinct and composable smart contracts.\"),\n\t\tui.Paragraph(\"With transparent and timeless code, gno.land is the next generation of smart contract platforms, serving as the “GitHub” of the ecosystem, with realms built using fully transparent, auditable code that anyone can inspect and reuse.\"),\n\t\tui.Paragraph(\"Intuitive and easy to use, gno.land lowers the barrier to web3 and makes censorship-resistant platforms accessible to everyone. If you want to help lay the foundations of a fairer and freer world, join us today.\"),\n\t}\n}\n\nfunc worxDAO() ui.Element {\n\t// WorxDAO\n\t// XXX(manfred): please, let me finish a v0, then we can iterate\n\t// highest level == highest responsibility\n\t// teams are responsible for components they don't owne\n\t// flag : realm maintainers VS facilitators\n\t// teams\n\t// committee of trustees to create the directory\n\t// each directory is a name, has a parent and have groups\n\t// homepage team - blocks aggregating events\n\t// XXX: TODO\n\t/*`\n\t# Directory\n\n\t* gno.land (owned by group)\n\t *\n\t* gnovm\n\t * gnolang (language)\n\t * gnovm\n\t - current challenges / concerns / issues\n\t* tm2\n\t * amino\n\t *\n\n\t## Contributors\n\t``*/\n\treturn ui.Element{\n\t\tui.H3(\"Contributions (WorxDAO \u0026 GoR)\"),\n\t\t// TODO: GoR dashboard + WorxDAO topics\n\t\tui.Text(`coming soon`),\n\t}\n}\n\nfunc quoteOfTheBlock() ui.Element {\n\tquotes := []string{\n\t\t\"Gno is for Truth.\",\n\t\t\"Gno is for Social Coordination.\",\n\t\t\"Gno is _not only_ for DeFi.\",\n\t\t\"Now, you Gno.\",\n\t\t\"Come for the Go, Stay for the Gno.\",\n\t}\n\theight := std.GetHeight()\n\tidx := int(height) % len(quotes)\n\tqotb := quotes[idx]\n\n\treturn ui.Element{\n\t\tui.H3(ufmt.Sprintf(\"Quote of the ~Day~ Block#%d\", height)),\n\t\tui.Quote(qotb),\n\t}\n}\n\nfunc socialLinks() ui.Element {\n\treturn ui.Element{\n\t\tui.H3(\"Socials\"),\n\t\tui.BulletList{\n\t\t\t// XXX: improve UI to support a nice GO api for such links\n\t\t\tui.Text(\"Check out our [community projects](https://github.com/gnolang/awesome-gno)\"),\n\t\t\tui.Text(\"![Discord](static/img/ico-discord.svg) [Discord](https://discord.gg/S8nKUqwkPn)\"),\n\t\t\tui.Text(\"![Twitter](static/img/ico-twitter.svg) [Twitter](https://twitter.com/_gnoland)\"),\n\t\t\tui.Text(\"![Youtube](static/img/ico-youtube.svg) [Youtube](https://www.youtube.com/@_gnoland)\"),\n\t\t\tui.Text(\"![Telegram](static/img/ico-telegram.svg) [Telegram](https://t.me/gnoland)\"),\n\t\t},\n\t}\n}\n\nfunc playgroundSection() ui.Element {\n\treturn ui.Element{\n\t\tui.H3(\"[Gno Playground](https://play.gno.land)\"),\n\t\tui.Paragraph(`Gno Playground is a web application designed for building, running, testing, and interacting\nwith your Gno code, enhancing your understanding of the Gno language. With Gno Playground, you can share your code,\nexecute tests, deploy your realms and packages to gno.land, and explore a multitude of other features.`),\n\t\tui.Paragraph(\"Experience the convenience of code sharing and rapid experimentation with [Gno Playground](https://play.gno.land).\"),\n\t}\n}\n\nfunc packageStaffPicks() ui.Element {\n\t// XXX: make it modifiable from a DAO\n\treturn ui.Element{\n\t\tui.H3(\"Explore New Packages and Realms\"),\n\t\tui.Columns{\n\t\t\t3,\n\t\t\t[]ui.Element{\n\t\t\t\t{\n\t\t\t\t\tui.H4(\"[r/gnoland](https://github.com/gnolang/gno/tree/master/examples/gno.land/r/gnoland)\"),\n\t\t\t\t\tui.BulletList{\n\t\t\t\t\t\tui.Link{URL: \"r/gnoland/blog\"},\n\t\t\t\t\t\tui.Link{URL: \"r/gnoland/dao\"},\n\t\t\t\t\t\tui.Link{URL: \"r/gnoland/faucet\"},\n\t\t\t\t\t\tui.Link{URL: \"r/gnoland/home\"},\n\t\t\t\t\t\tui.Link{URL: \"r/gnoland/pages\"},\n\t\t\t\t\t},\n\t\t\t\t\tui.H4(\"[r/sys](https://github.com/gnolang/gno/tree/master/examples/gno.land/r/sys)\"),\n\t\t\t\t\tui.BulletList{\n\t\t\t\t\t\tui.Link{URL: \"r/sys/names\"},\n\t\t\t\t\t\tui.Link{URL: \"r/sys/rewards\"},\n\t\t\t\t\t\tui.Link{URL: \"r/sys/validators\"},\n\t\t\t\t\t},\n\t\t\t\t}, {\n\t\t\t\t\tui.H4(\"[r/demo](https://github.com/gnolang/gno/tree/master/examples/gno.land/r/demo)\"),\n\t\t\t\t\tui.BulletList{\n\t\t\t\t\t\tui.Link{URL: \"r/demo/boards\"},\n\t\t\t\t\t\tui.Link{URL: \"r/demo/users\"},\n\t\t\t\t\t\tui.Link{URL: \"r/demo/banktest\"},\n\t\t\t\t\t\tui.Link{URL: \"r/demo/foo20\"},\n\t\t\t\t\t\tui.Link{URL: \"r/demo/foo721\"},\n\t\t\t\t\t\tui.Link{URL: \"r/demo/microblog\"},\n\t\t\t\t\t\tui.Link{URL: \"r/demo/nft\"},\n\t\t\t\t\t\tui.Link{URL: \"r/demo/types\"},\n\t\t\t\t\t\tui.Link{URL: \"r/demo/art/gnoface\"},\n\t\t\t\t\t\tui.Link{URL: \"r/demo/art/millipede\"},\n\t\t\t\t\t\tui.Link{URL: \"r/demo/groups\"},\n\t\t\t\t\t\tui.Text(\"...\"),\n\t\t\t\t\t},\n\t\t\t\t}, {\n\t\t\t\t\tui.H4(\"[p/demo](https://github.com/gnolang/gno/tree/master/examples/gno.land/p/demo)\"),\n\t\t\t\t\tui.BulletList{\n\t\t\t\t\t\tui.Link{URL: \"p/demo/avl\"},\n\t\t\t\t\t\tui.Link{URL: \"p/demo/blog\"},\n\t\t\t\t\t\tui.Link{URL: \"p/demo/ui\"},\n\t\t\t\t\t\tui.Link{URL: \"p/demo/ufmt\"},\n\t\t\t\t\t\tui.Link{URL: \"p/demo/merkle\"},\n\t\t\t\t\t\tui.Link{URL: \"p/demo/bf\"},\n\t\t\t\t\t\tui.Link{URL: \"p/demo/flow\"},\n\t\t\t\t\t\tui.Link{URL: \"p/demo/gnode\"},\n\t\t\t\t\t\tui.Link{URL: \"p/demo/grc/grc20\"},\n\t\t\t\t\t\tui.Link{URL: \"p/demo/grc/grc721\"},\n\t\t\t\t\t\tui.Text(\"...\"),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n}\n\nfunc discoverLinks() ui.Element {\n\treturn ui.Element{\n\t\tui.Text(`\u003cdiv class=\"columns-3\"\u003e\n\u003cdiv class=\"column\"\u003e\n\n### Learn about gno.land\n\n- [About](/about)\n- [GitHub](https://github.com/gnolang)\n- [Blog](/blog)\n- [Events](/events)\n- Tokenomics (soon)\n- [Partners, Fund, Grants](/partners)\n- [Explore the Ecosystem](/ecosystem)\n- [Careers](https://jobs.lever.co/allinbits?department=Gno.land)\n\n\u003c/div\u003e\u003c!-- end column--\u003e\n\n\u003cdiv class=\"column\"\u003e\n\n### Build with Gno\n\n- [Write Gno in the browser](https://play.gno.land)\n- [Read about the Gno Language](/gnolang)\n- [Visit the official documentation](https://docs.gno.land)\n- [Gno by Example](https://gno-by-example.com/)\n- [Efficient local development for Gno](https://docs.gno.land/gno-tooling/cli/gno-tooling-gnodev)\n- [Get testnet GNOTs](https://faucet.gno.land)\n\n\u003c/div\u003e\u003c!-- end column--\u003e\n\u003cdiv class=\"column\"\u003e\n\n### Explore the universe\n\n- [Discover demo packages](https://github.com/gnolang/gno/tree/master/examples)\n- [Gnoscan](https://gnoscan.io)\n- [Portal Loop](https://docs.gno.land/concepts/portal-loop)\n- [Testnet 4](https://test4.gno.land/) (Launched July 2024!)\n- [Testnet 3](https://test3.gno.land/) (archive)\n- [Testnet 2](https://test2.gno.land/) (archive)\n- Testnet Faucet Hub (soon)\n\n\u003c/div\u003e\u003c!-- end column--\u003e\n\u003c/div\u003e\u003c!-- end columns-3--\u003e`),\n\t}\n}\n\nfunc AdminSetOverride(content string) {\n\tadmin.AssertCallerIsOwner()\n\toverride = content\n}\n\nfunc AdminTransferOwnership(newAdmin std.Address) {\n\tadmin.AssertCallerIsOwner()\n\tadmin.TransferOwnership(newAdmin)\n}\n"},{"name":"home_filetest.gno","body":"package main\n\nimport \"gno.land/r/gnoland/home\"\n\nfunc main() {\n\tprintln(home.Render(\"\"))\n}\n\n// Output:\n// \u003cmain class='gno-tmpl-section'\u003e\n//\n// # Welcome to gno.land\n//\n// ### We’re building gno.land, set to become the leading open-source smart contract platform, using Gno, an interpreted and fully deterministic variation of the Go programming language for succinct and composable smart contracts.\n//\n//\n// With transparent and timeless code, gno.land is the next generation of smart contract platforms, serving as the “GitHub” of the ecosystem, with realms built using fully transparent, auditable code that anyone can inspect and reuse.\n//\n//\n// Intuitive and easy to use, gno.land lowers the barrier to web3 and makes censorship-resistant platforms accessible to everyone. If you want to help lay the foundations of a fairer and freer world, join us today.\n//\n// \u003cdiv class=\"jumbotron\"\u003e\n//\n// \u003cdiv class=\"columns-3\"\u003e\n// \u003cdiv class=\"column\"\u003e\n//\n// ### Learn about gno.land\n//\n// - [About](/about)\n// - [GitHub](https://github.com/gnolang)\n// - [Blog](/blog)\n// - [Events](/events)\n// - Tokenomics (soon)\n// - [Partners, Fund, Grants](/partners)\n// - [Explore the Ecosystem](/ecosystem)\n// - [Careers](https://jobs.lever.co/allinbits?department=Gno.land)\n//\n// \u003c/div\u003e\u003c!-- end column--\u003e\n//\n// \u003cdiv class=\"column\"\u003e\n//\n// ### Build with Gno\n//\n// - [Write Gno in the browser](https://play.gno.land)\n// - [Read about the Gno Language](/gnolang)\n// - [Visit the official documentation](https://docs.gno.land)\n// - [Gno by Example](https://gno-by-example.com/)\n// - [Efficient local development for Gno](https://docs.gno.land/gno-tooling/cli/gno-tooling-gnodev)\n// - [Get testnet GNOTs](https://faucet.gno.land)\n//\n// \u003c/div\u003e\u003c!-- end column--\u003e\n// \u003cdiv class=\"column\"\u003e\n//\n// ### Explore the universe\n//\n// - [Discover demo packages](https://github.com/gnolang/gno/tree/master/examples)\n// - [Gnoscan](https://gnoscan.io)\n// - [Portal Loop](https://docs.gno.land/concepts/portal-loop)\n// - [Testnet 4](https://test4.gno.land/) (Launched July 2024!)\n// - [Testnet 3](https://test3.gno.land/) (archive)\n// - [Testnet 2](https://test2.gno.land/) (archive)\n// - Testnet Faucet Hub (soon)\n//\n// \u003c/div\u003e\u003c!-- end column--\u003e\n// \u003c/div\u003e\u003c!-- end columns-3--\u003e\n// \u003c/div\u003e\u003c!-- /jumbotron --\u003e\n//\n// \u003cdiv class=\"columns-3\"\u003e\n// \u003cdiv class=\"column\"\u003e\n//\n// ### [Latest Blogposts](/r/gnoland/blog)\n//\n// No posts.\n// \u003c/div\u003e\u003c!-- /column--\u003e\n// \u003cdiv class=\"column\"\u003e\n//\n// ### [Latest Events](/r/gnoland/events)\n//\n// No events.\n// \u003c/div\u003e\u003c!-- /column--\u003e\n// \u003cdiv class=\"column\"\u003e\n//\n// ### Latest Contributions\n//\n// [View latest contributions](https://github.com/gnolang/gno/pulls)\n// \u003c/div\u003e\u003c!-- /column--\u003e\n// \u003c/div\u003e\u003c!-- /columns-3 --\u003e\n//\n//\n// ---\n//\n// ### [Gno Playground](https://play.gno.land)\n//\n//\n// Gno Playground is a web application designed for building, running, testing, and interacting\n// with your Gno code, enhancing your understanding of the Gno language. With Gno Playground, you can share your code,\n// execute tests, deploy your realms and packages to gno.land, and explore a multitude of other features.\n//\n//\n// Experience the convenience of code sharing and rapid experimentation with [Gno Playground](https://play.gno.land).\n//\n//\n// ---\n//\n// ### Explore New Packages and Realms\n//\n// \u003cdiv class=\"columns-3\"\u003e\n// \u003cdiv class=\"column\"\u003e\n//\n// #### [r/gnoland](https://github.com/gnolang/gno/tree/master/examples/gno.land/r/gnoland)\n//\n// - [r/gnoland/blog](r/gnoland/blog)\n// - [r/gnoland/dao](r/gnoland/dao)\n// - [r/gnoland/faucet](r/gnoland/faucet)\n// - [r/gnoland/home](r/gnoland/home)\n// - [r/gnoland/pages](r/gnoland/pages)\n//\n// #### [r/sys](https://github.com/gnolang/gno/tree/master/examples/gno.land/r/sys)\n//\n// - [r/sys/names](r/sys/names)\n// - [r/sys/rewards](r/sys/rewards)\n// - [r/sys/validators](r/sys/validators)\n//\n// \u003c/div\u003e\u003c!-- /column--\u003e\n// \u003cdiv class=\"column\"\u003e\n//\n// #### [r/demo](https://github.com/gnolang/gno/tree/master/examples/gno.land/r/demo)\n//\n// - [r/demo/boards](r/demo/boards)\n// - [r/demo/users](r/demo/users)\n// - [r/demo/banktest](r/demo/banktest)\n// - [r/demo/foo20](r/demo/foo20)\n// - [r/demo/foo721](r/demo/foo721)\n// - [r/demo/microblog](r/demo/microblog)\n// - [r/demo/nft](r/demo/nft)\n// - [r/demo/types](r/demo/types)\n// - [r/demo/art/gnoface](r/demo/art/gnoface)\n// - [r/demo/art/millipede](r/demo/art/millipede)\n// - [r/demo/groups](r/demo/groups)\n// - ...\n//\n// \u003c/div\u003e\u003c!-- /column--\u003e\n// \u003cdiv class=\"column\"\u003e\n//\n// #### [p/demo](https://github.com/gnolang/gno/tree/master/examples/gno.land/p/demo)\n//\n// - [p/demo/avl](p/demo/avl)\n// - [p/demo/blog](p/demo/blog)\n// - [p/demo/ui](p/demo/ui)\n// - [p/demo/ufmt](p/demo/ufmt)\n// - [p/demo/merkle](p/demo/merkle)\n// - [p/demo/bf](p/demo/bf)\n// - [p/demo/flow](p/demo/flow)\n// - [p/demo/gnode](p/demo/gnode)\n// - [p/demo/grc/grc20](p/demo/grc/grc20)\n// - [p/demo/grc/grc721](p/demo/grc/grc721)\n// - ...\n//\n// \u003c/div\u003e\u003c!-- /column--\u003e\n// \u003c/div\u003e\u003c!-- /columns-3 --\u003e\n//\n//\n// ---\n//\n// ### Contributions (WorxDAO \u0026 GoR)\n//\n// coming soon\n//\n// ---\n//\n//\n// \u003cdiv class=\"columns-2\"\u003e\n// \u003cdiv class=\"column\"\u003e\n//\n// ### Socials\n//\n// - Check out our [community projects](https://github.com/gnolang/awesome-gno)\n// - ![Discord](static/img/ico-discord.svg) [Discord](https://discord.gg/S8nKUqwkPn)\n// - ![Twitter](static/img/ico-twitter.svg) [Twitter](https://twitter.com/_gnoland)\n// - ![Youtube](static/img/ico-youtube.svg) [Youtube](https://www.youtube.com/@_gnoland)\n// - ![Telegram](static/img/ico-telegram.svg) [Telegram](https://t.me/gnoland)\n//\n// \u003c/div\u003e\u003c!-- /column--\u003e\n// \u003cdiv class=\"column\"\u003e\n//\n// ### Quote of the ~Day~ Block#123\n//\n// \u003e Now, you Gno.\n//\n// \u003c/div\u003e\u003c!-- /column--\u003e\n// \u003c/div\u003e\u003c!-- /columns-2 --\u003e\n//\n//\n// ---\n//\n// **This is a testnet.**\n// Package names are not guaranteed to be available for production.\n//\n// \u003c/main\u003e\n"},{"name":"overide_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/gnoland/home\"\n)\n\nfunc main() {\n\tstd.TestSetOrigCaller(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\")\n\thome.AdminSetOverride(\"Hello World!\")\n\tprintln(home.Render(\"\"))\n\thome.AdminTransferOwnership(testutils.TestAddress(\"newAdmin\"))\n\tdefer func() {\n\t\tr := recover()\n\t\tprintln(\"r: \", r)\n\t}()\n\thome.AdminSetOverride(\"Not admin anymore\")\n}\n\n// Output:\n// Hello World!\n// r: ownable: caller is not owner\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"home","path":"gno.land/r/gnoland/home","files":[{"name":"home.gno","body":"package home\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/ownable\"\n\t\"gno.land/p/demo/ufmt\"\n\t\"gno.land/p/demo/ui\"\n\tblog \"gno.land/r/gnoland/blog\"\n\tevents \"gno.land/r/gnoland/events\"\n)\n\n// XXX: p/demo/ui API is crappy, we need to make it more idiomatic\n// XXX: use an updatable block system to update content from a DAO\n// XXX: var blocks avl.Tree\n\nvar (\n\toverride string\n\tadmin = ownable.NewWithAddress(\"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq\") // @manfred by default\n)\n\nfunc Render(_ string) string {\n\tif override != \"\" {\n\t\treturn override\n\t}\n\n\tdom := ui.DOM{Prefix: \"r/gnoland/home:\"}\n\tdom.Title = \"Welcome to gno.land\"\n\tdom.Classes = []string{\"gno-tmpl-section\"}\n\n\t// body\n\tdom.Body.Append(introSection()...)\n\n\tdom.Body.Append(ui.Jumbotron(discoverLinks()))\n\n\tdom.Body.Append(\n\t\tui.Columns{3, []ui.Element{\n\t\t\tlastBlogposts(4),\n\t\t\tupcomingEvents(),\n\t\t\tlastContributions(4),\n\t\t}},\n\t)\n\n\tdom.Body.Append(ui.HR{})\n\tdom.Body.Append(playgroundSection()...)\n\tdom.Body.Append(ui.HR{})\n\tdom.Body.Append(packageStaffPicks()...)\n\tdom.Body.Append(ui.HR{})\n\tdom.Body.Append(worxDAO()...)\n\tdom.Body.Append(ui.HR{})\n\t// footer\n\tdom.Footer.Append(\n\t\tui.Columns{2, []ui.Element{\n\t\t\tsocialLinks(),\n\t\t\tquoteOfTheBlock(),\n\t\t}},\n\t)\n\n\t// Testnet disclaimer\n\tdom.Footer.Append(\n\t\tui.HR{},\n\t\tui.Bold(\"This is a testnet.\"),\n\t\tui.Text(\"Package names are not guaranteed to be available for production.\"),\n\t)\n\n\treturn dom.String()\n}\n\nfunc lastBlogposts(limit int) ui.Element {\n\tposts := blog.RenderLastPostsWidget(limit)\n\treturn ui.Element{\n\t\tui.H3(\"[Latest Blogposts](/r/gnoland/blog)\"),\n\t\tui.Text(posts),\n\t}\n}\n\nfunc lastContributions(limit int) ui.Element {\n\treturn ui.Element{\n\t\tui.H3(\"Latest Contributions\"),\n\t\t// TODO: import r/gh to\n\t\tui.Link{Text: \"View latest contributions\", URL: \"https://github.com/gnolang/gno/pulls\"},\n\t}\n}\n\nfunc upcomingEvents() ui.Element {\n\tout, _ := events.RenderEventWidget(events.MaxWidgetSize)\n\treturn ui.Element{\n\t\tui.H3(\"[Latest Events](/r/gnoland/events)\"),\n\t\tui.Text(out),\n\t}\n}\n\nfunc introSection() ui.Element {\n\treturn ui.Element{\n\t\tui.H3(\"We’re building gno.land, set to become the leading open-source smart contract platform, using Gno, an interpreted and fully deterministic variation of the Go programming language for succinct and composable smart contracts.\"),\n\t\tui.Paragraph(\"With transparent and timeless code, gno.land is the next generation of smart contract platforms, serving as the “GitHub” of the ecosystem, with realms built using fully transparent, auditable code that anyone can inspect and reuse.\"),\n\t\tui.Paragraph(\"Intuitive and easy to use, gno.land lowers the barrier to web3 and makes censorship-resistant platforms accessible to everyone. If you want to help lay the foundations of a fairer and freer world, join us today.\"),\n\t}\n}\n\nfunc worxDAO() ui.Element {\n\t// WorxDAO\n\t// XXX(manfred): please, let me finish a v0, then we can iterate\n\t// highest level == highest responsibility\n\t// teams are responsible for components they don't owne\n\t// flag : realm maintainers VS facilitators\n\t// teams\n\t// committee of trustees to create the directory\n\t// each directory is a name, has a parent and have groups\n\t// homepage team - blocks aggregating events\n\t// XXX: TODO\n\t/*`\n\t# Directory\n\n\t* gno.land (owned by group)\n\t *\n\t* gnovm\n\t * gnolang (language)\n\t * gnovm\n\t - current challenges / concerns / issues\n\t* tm2\n\t * amino\n\t *\n\n\t## Contributors\n\t``*/\n\treturn ui.Element{\n\t\tui.H3(\"Contributions (WorxDAO \u0026 GoR)\"),\n\t\t// TODO: GoR dashboard + WorxDAO topics\n\t\tui.Text(`coming soon`),\n\t}\n}\n\nfunc quoteOfTheBlock() ui.Element {\n\tquotes := []string{\n\t\t\"Gno is for Truth.\",\n\t\t\"Gno is for Social Coordination.\",\n\t\t\"Gno is _not only_ for DeFi.\",\n\t\t\"Now, you Gno.\",\n\t\t\"Come for the Go, Stay for the Gno.\",\n\t}\n\theight := std.GetHeight()\n\tidx := int(height) % len(quotes)\n\tqotb := quotes[idx]\n\n\treturn ui.Element{\n\t\tui.H3(ufmt.Sprintf(\"Quote of the ~Day~ Block#%d\", height)),\n\t\tui.Quote(qotb),\n\t}\n}\n\nfunc socialLinks() ui.Element {\n\treturn ui.Element{\n\t\tui.H3(\"Socials\"),\n\t\tui.BulletList{\n\t\t\t// XXX: improve UI to support a nice GO api for such links\n\t\t\tui.Text(\"Check out our [community projects](https://github.com/gnolang/awesome-gno)\"),\n\t\t\tui.Text(\"![Discord](static/img/ico-discord.svg) [Discord](https://discord.gg/S8nKUqwkPn)\"),\n\t\t\tui.Text(\"![Twitter](static/img/ico-twitter.svg) [Twitter](https://twitter.com/_gnoland)\"),\n\t\t\tui.Text(\"![Youtube](static/img/ico-youtube.svg) [Youtube](https://www.youtube.com/@_gnoland)\"),\n\t\t\tui.Text(\"![Telegram](static/img/ico-telegram.svg) [Telegram](https://t.me/gnoland)\"),\n\t\t},\n\t}\n}\n\nfunc playgroundSection() ui.Element {\n\treturn ui.Element{\n\t\tui.H3(\"[Gno Playground](https://play.gno.land)\"),\n\t\tui.Paragraph(`Gno Playground is a web application designed for building, running, testing, and interacting\nwith your Gno code, enhancing your understanding of the Gno language. With Gno Playground, you can share your code,\nexecute tests, deploy your realms and packages to gno.land, and explore a multitude of other features.`),\n\t\tui.Paragraph(\"Experience the convenience of code sharing and rapid experimentation with [Gno Playground](https://play.gno.land).\"),\n\t}\n}\n\nfunc packageStaffPicks() ui.Element {\n\t// XXX: make it modifiable from a DAO\n\treturn ui.Element{\n\t\tui.H3(\"Explore New Packages and Realms\"),\n\t\tui.Columns{\n\t\t\t3,\n\t\t\t[]ui.Element{\n\t\t\t\t{\n\t\t\t\t\tui.H4(\"[r/gnoland](https://github.com/gnolang/gno/tree/master/examples/gno.land/r/gnoland)\"),\n\t\t\t\t\tui.BulletList{\n\t\t\t\t\t\tui.Link{URL: \"r/gnoland/blog\"},\n\t\t\t\t\t\tui.Link{URL: \"r/gnoland/dao\"},\n\t\t\t\t\t\tui.Link{URL: \"r/gnoland/faucet\"},\n\t\t\t\t\t\tui.Link{URL: \"r/gnoland/home\"},\n\t\t\t\t\t\tui.Link{URL: \"r/gnoland/pages\"},\n\t\t\t\t\t},\n\t\t\t\t\tui.H4(\"[r/sys](https://github.com/gnolang/gno/tree/master/examples/gno.land/r/sys)\"),\n\t\t\t\t\tui.BulletList{\n\t\t\t\t\t\tui.Link{URL: \"r/sys/names\"},\n\t\t\t\t\t\tui.Link{URL: \"r/sys/rewards\"},\n\t\t\t\t\t\tui.Link{URL: \"r/sys/validators\"},\n\t\t\t\t\t},\n\t\t\t\t}, {\n\t\t\t\t\tui.H4(\"[r/demo](https://github.com/gnolang/gno/tree/master/examples/gno.land/r/demo)\"),\n\t\t\t\t\tui.BulletList{\n\t\t\t\t\t\tui.Link{URL: \"r/demo/boards\"},\n\t\t\t\t\t\tui.Link{URL: \"r/demo/users\"},\n\t\t\t\t\t\tui.Link{URL: \"r/demo/banktest\"},\n\t\t\t\t\t\tui.Link{URL: \"r/demo/foo20\"},\n\t\t\t\t\t\tui.Link{URL: \"r/demo/foo721\"},\n\t\t\t\t\t\tui.Link{URL: \"r/demo/microblog\"},\n\t\t\t\t\t\tui.Link{URL: \"r/demo/nft\"},\n\t\t\t\t\t\tui.Link{URL: \"r/demo/types\"},\n\t\t\t\t\t\tui.Link{URL: \"r/demo/art/gnoface\"},\n\t\t\t\t\t\tui.Link{URL: \"r/demo/art/millipede\"},\n\t\t\t\t\t\tui.Link{URL: \"r/demo/groups\"},\n\t\t\t\t\t\tui.Text(\"...\"),\n\t\t\t\t\t},\n\t\t\t\t}, {\n\t\t\t\t\tui.H4(\"[p/demo](https://github.com/gnolang/gno/tree/master/examples/gno.land/p/demo)\"),\n\t\t\t\t\tui.BulletList{\n\t\t\t\t\t\tui.Link{URL: \"p/demo/avl\"},\n\t\t\t\t\t\tui.Link{URL: \"p/demo/blog\"},\n\t\t\t\t\t\tui.Link{URL: \"p/demo/ui\"},\n\t\t\t\t\t\tui.Link{URL: \"p/demo/ufmt\"},\n\t\t\t\t\t\tui.Link{URL: \"p/demo/merkle\"},\n\t\t\t\t\t\tui.Link{URL: \"p/demo/bf\"},\n\t\t\t\t\t\tui.Link{URL: \"p/demo/flow\"},\n\t\t\t\t\t\tui.Link{URL: \"p/demo/gnode\"},\n\t\t\t\t\t\tui.Link{URL: \"p/demo/grc/grc20\"},\n\t\t\t\t\t\tui.Link{URL: \"p/demo/grc/grc721\"},\n\t\t\t\t\t\tui.Text(\"...\"),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t},\n\t}\n}\n\nfunc discoverLinks() ui.Element {\n\treturn ui.Element{\n\t\tui.Text(`\u003cdiv class=\"columns-3\"\u003e\n\u003cdiv class=\"column\"\u003e\n\n### Learn about gno.land\n\n- [About](/about)\n- [GitHub](https://github.com/gnolang)\n- [Blog](/blog)\n- [Events](/events)\n- Tokenomics (soon)\n- [Partners, Fund, Grants](/partners)\n- [Explore the Ecosystem](/ecosystem)\n- [Careers](https://jobs.lever.co/allinbits?department=Gno.land)\n\n\u003c/div\u003e\u003c!-- end column--\u003e\n\n\u003cdiv class=\"column\"\u003e\n\n### Build with Gno\n\n- [Write Gno in the browser](https://play.gno.land)\n- [Read about the Gno Language](/gnolang)\n- [Visit the official documentation](https://docs.gno.land)\n- [Gno by Example](https://gno-by-example.com/)\n- [Efficient local development for Gno](https://docs.gno.land/gno-tooling/cli/gno-tooling-gnodev)\n- [Get testnet GNOTs](https://faucet.gno.land)\n\n\u003c/div\u003e\u003c!-- end column--\u003e\n\u003cdiv class=\"column\"\u003e\n\n### Explore the universe\n\n- [Discover demo packages](https://github.com/gnolang/gno/tree/master/examples)\n- [Gnoscan](https://gnoscan.io)\n- [Portal Loop](https://docs.gno.land/concepts/portal-loop)\n- [Testnet 4](https://test4.gno.land/) (Launched July 2024!)\n- [Testnet 3](https://test3.gno.land/) (archive)\n- [Testnet 2](https://test2.gno.land/) (archive)\n- Testnet Faucet Hub (soon)\n\n\u003c/div\u003e\u003c!-- end column--\u003e\n\u003c/div\u003e\u003c!-- end columns-3--\u003e`),\n\t}\n}\n\nfunc AdminSetOverride(content string) {\n\tadmin.AssertCallerIsOwner()\n\toverride = content\n}\n\nfunc AdminTransferOwnership(newAdmin std.Address) {\n\tadmin.AssertCallerIsOwner()\n\tadmin.TransferOwnership(newAdmin)\n}\n"},{"name":"home_filetest.gno","body":"package main\n\nimport \"gno.land/r/gnoland/home\"\n\nfunc main() {\n\tprintln(home.Render(\"\"))\n}\n\n// Output:\n// \u003cmain class='gno-tmpl-section'\u003e\n//\n// # Welcome to gno.land\n//\n// ### We’re building gno.land, set to become the leading open-source smart contract platform, using Gno, an interpreted and fully deterministic variation of the Go programming language for succinct and composable smart contracts.\n//\n//\n// With transparent and timeless code, gno.land is the next generation of smart contract platforms, serving as the “GitHub” of the ecosystem, with realms built using fully transparent, auditable code that anyone can inspect and reuse.\n//\n//\n// Intuitive and easy to use, gno.land lowers the barrier to web3 and makes censorship-resistant platforms accessible to everyone. If you want to help lay the foundations of a fairer and freer world, join us today.\n//\n// \u003cdiv class=\"jumbotron\"\u003e\n//\n// \u003cdiv class=\"columns-3\"\u003e\n// \u003cdiv class=\"column\"\u003e\n//\n// ### Learn about gno.land\n//\n// - [About](/about)\n// - [GitHub](https://github.com/gnolang)\n// - [Blog](/blog)\n// - [Events](/events)\n// - Tokenomics (soon)\n// - [Partners, Fund, Grants](/partners)\n// - [Explore the Ecosystem](/ecosystem)\n// - [Careers](https://jobs.lever.co/allinbits?department=Gno.land)\n//\n// \u003c/div\u003e\u003c!-- end column--\u003e\n//\n// \u003cdiv class=\"column\"\u003e\n//\n// ### Build with Gno\n//\n// - [Write Gno in the browser](https://play.gno.land)\n// - [Read about the Gno Language](/gnolang)\n// - [Visit the official documentation](https://docs.gno.land)\n// - [Gno by Example](https://gno-by-example.com/)\n// - [Efficient local development for Gno](https://docs.gno.land/gno-tooling/cli/gno-tooling-gnodev)\n// - [Get testnet GNOTs](https://faucet.gno.land)\n//\n// \u003c/div\u003e\u003c!-- end column--\u003e\n// \u003cdiv class=\"column\"\u003e\n//\n// ### Explore the universe\n//\n// - [Discover demo packages](https://github.com/gnolang/gno/tree/master/examples)\n// - [Gnoscan](https://gnoscan.io)\n// - [Portal Loop](https://docs.gno.land/concepts/portal-loop)\n// - [Testnet 4](https://test4.gno.land/) (Launched July 2024!)\n// - [Testnet 3](https://test3.gno.land/) (archive)\n// - [Testnet 2](https://test2.gno.land/) (archive)\n// - Testnet Faucet Hub (soon)\n//\n// \u003c/div\u003e\u003c!-- end column--\u003e\n// \u003c/div\u003e\u003c!-- end columns-3--\u003e\n// \u003c/div\u003e\u003c!-- /jumbotron --\u003e\n//\n// \u003cdiv class=\"columns-3\"\u003e\n// \u003cdiv class=\"column\"\u003e\n//\n// ### [Latest Blogposts](/r/gnoland/blog)\n//\n// No posts.\n// \u003c/div\u003e\u003c!-- /column--\u003e\n// \u003cdiv class=\"column\"\u003e\n//\n// ### [Latest Events](/r/gnoland/events)\n//\n// No events.\n// \u003c/div\u003e\u003c!-- /column--\u003e\n// \u003cdiv class=\"column\"\u003e\n//\n// ### Latest Contributions\n//\n// [View latest contributions](https://github.com/gnolang/gno/pulls)\n// \u003c/div\u003e\u003c!-- /column--\u003e\n// \u003c/div\u003e\u003c!-- /columns-3 --\u003e\n//\n//\n// ---\n//\n// ### [Gno Playground](https://play.gno.land)\n//\n//\n// Gno Playground is a web application designed for building, running, testing, and interacting\n// with your Gno code, enhancing your understanding of the Gno language. With Gno Playground, you can share your code,\n// execute tests, deploy your realms and packages to gno.land, and explore a multitude of other features.\n//\n//\n// Experience the convenience of code sharing and rapid experimentation with [Gno Playground](https://play.gno.land).\n//\n//\n// ---\n//\n// ### Explore New Packages and Realms\n//\n// \u003cdiv class=\"columns-3\"\u003e\n// \u003cdiv class=\"column\"\u003e\n//\n// #### [r/gnoland](https://github.com/gnolang/gno/tree/master/examples/gno.land/r/gnoland)\n//\n// - [r/gnoland/blog](r/gnoland/blog)\n// - [r/gnoland/dao](r/gnoland/dao)\n// - [r/gnoland/faucet](r/gnoland/faucet)\n// - [r/gnoland/home](r/gnoland/home)\n// - [r/gnoland/pages](r/gnoland/pages)\n//\n// #### [r/sys](https://github.com/gnolang/gno/tree/master/examples/gno.land/r/sys)\n//\n// - [r/sys/names](r/sys/names)\n// - [r/sys/rewards](r/sys/rewards)\n// - [r/sys/validators](r/sys/validators)\n//\n// \u003c/div\u003e\u003c!-- /column--\u003e\n// \u003cdiv class=\"column\"\u003e\n//\n// #### [r/demo](https://github.com/gnolang/gno/tree/master/examples/gno.land/r/demo)\n//\n// - [r/demo/boards](r/demo/boards)\n// - [r/demo/users](r/demo/users)\n// - [r/demo/banktest](r/demo/banktest)\n// - [r/demo/foo20](r/demo/foo20)\n// - [r/demo/foo721](r/demo/foo721)\n// - [r/demo/microblog](r/demo/microblog)\n// - [r/demo/nft](r/demo/nft)\n// - [r/demo/types](r/demo/types)\n// - [r/demo/art/gnoface](r/demo/art/gnoface)\n// - [r/demo/art/millipede](r/demo/art/millipede)\n// - [r/demo/groups](r/demo/groups)\n// - ...\n//\n// \u003c/div\u003e\u003c!-- /column--\u003e\n// \u003cdiv class=\"column\"\u003e\n//\n// #### [p/demo](https://github.com/gnolang/gno/tree/master/examples/gno.land/p/demo)\n//\n// - [p/demo/avl](p/demo/avl)\n// - [p/demo/blog](p/demo/blog)\n// - [p/demo/ui](p/demo/ui)\n// - [p/demo/ufmt](p/demo/ufmt)\n// - [p/demo/merkle](p/demo/merkle)\n// - [p/demo/bf](p/demo/bf)\n// - [p/demo/flow](p/demo/flow)\n// - [p/demo/gnode](p/demo/gnode)\n// - [p/demo/grc/grc20](p/demo/grc/grc20)\n// - [p/demo/grc/grc721](p/demo/grc/grc721)\n// - ...\n//\n// \u003c/div\u003e\u003c!-- /column--\u003e\n// \u003c/div\u003e\u003c!-- /columns-3 --\u003e\n//\n//\n// ---\n//\n// ### Contributions (WorxDAO \u0026 GoR)\n//\n// coming soon\n//\n// ---\n//\n//\n// \u003cdiv class=\"columns-2\"\u003e\n// \u003cdiv class=\"column\"\u003e\n//\n// ### Socials\n//\n// - Check out our [community projects](https://github.com/gnolang/awesome-gno)\n// - ![Discord](static/img/ico-discord.svg) [Discord](https://discord.gg/S8nKUqwkPn)\n// - ![Twitter](static/img/ico-twitter.svg) [Twitter](https://twitter.com/_gnoland)\n// - ![Youtube](static/img/ico-youtube.svg) [Youtube](https://www.youtube.com/@_gnoland)\n// - ![Telegram](static/img/ico-telegram.svg) [Telegram](https://t.me/gnoland)\n//\n// \u003c/div\u003e\u003c!-- /column--\u003e\n// \u003cdiv class=\"column\"\u003e\n//\n// ### Quote of the ~Day~ Block#123\n//\n// \u003e Now, you Gno.\n//\n// \u003c/div\u003e\u003c!-- /column--\u003e\n// \u003c/div\u003e\u003c!-- /columns-2 --\u003e\n//\n//\n// ---\n//\n// **This is a testnet.**\n// Package names are not guaranteed to be available for production.\n//\n// \u003c/main\u003e\n"},{"name":"overide_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/r/gnoland/home\"\n)\n\nfunc main() {\n\tstd.TestSetOrigCaller(\"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq\")\n\thome.AdminSetOverride(\"Hello World!\")\n\tprintln(home.Render(\"\"))\n\thome.AdminTransferOwnership(testutils.TestAddress(\"newAdmin\"))\n\tdefer func() {\n\t\tr := recover()\n\t\tprintln(\"r: \", r)\n\t}()\n\thome.AdminSetOverride(\"Not admin anymore\")\n}\n\n// Output:\n// Hello World!\n// r: ownable: caller is not owner\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} {"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"monit","path":"gno.land/r/gnoland/monit","files":[{"name":"monit.gno","body":"// Package monit links a monitoring system with the chain in both directions.\n//\n// The agent will periodically call Incr() and verify that the value is always\n// higher than the previously known one. The contract will store the last update\n// time and use it to detect whether or not the monitoring agent is functioning\n// correctly.\npackage monit\n\nimport (\n\t\"std\"\n\t\"time\"\n\n\t\"gno.land/p/demo/ownable\"\n\t\"gno.land/p/demo/ufmt\"\n\t\"gno.land/p/demo/watchdog\"\n)\n\nvar (\n\tcounter int\n\tlastUpdate time.Time\n\tlastCaller std.Address\n\twd = watchdog.Watchdog{Duration: 5 * time.Minute}\n\towner = ownable.New() // TODO: replace with -\u003e ownable.NewWithAddress...\n\twatchdogDuration = 5 * time.Minute\n)\n\n// Incr increments the counter and informs the watchdog that we're alive.\n// This function can be called by anyone.\nfunc Incr() int {\n\tcounter++\n\tlastUpdate = time.Now()\n\tlastCaller = std.PrevRealm().Addr()\n\twd.Alive()\n\treturn counter\n}\n\n// Reset resets the realm state.\n// This function can only be called by the admin.\nfunc Reset() {\n\tif owner.CallerIsOwner() != nil { // TODO: replace with owner.AssertCallerIsOwner\n\t\tpanic(\"unauthorized\")\n\t}\n\tcounter = 0\n\tlastCaller = std.PrevRealm().Addr()\n\tlastUpdate = time.Now()\n\twd = watchdog.Watchdog{Duration: 5 * time.Minute}\n}\n\nfunc Render(_ string) string {\n\tstatus := wd.Status()\n\treturn ufmt.Sprintf(\n\t\t\"counter=%d\\nlast update=%s\\nlast caller=%s\\nstatus=%s\",\n\t\tcounter, lastUpdate, lastCaller, status,\n\t)\n}\n\n// TransferOwnership transfers ownership to a new owner. This is a proxy to\n// ownable.Ownable.TransferOwnership.\nfunc TransferOwnership(newOwner std.Address) { owner.TransferOwnership(newOwner) }\n"},{"name":"monit_test.gno","body":"package monit\n\nimport (\n\t\"testing\"\n\n\t\"gno.land/p/demo/uassert\"\n)\n\nfunc TestPackage(t *testing.T) {\n\t// initial state, watchdog is KO.\n\t{\n\t\texpected := `counter=0\nlast update=0001-01-01 00:00:00 +0000 UTC\nlast caller=\nstatus=KO`\n\t\tgot := Render(\"\")\n\t\tuassert.Equal(t, expected, got)\n\t}\n\n\t// call Incr(), watchdog is OK.\n\tIncr()\n\tIncr()\n\tIncr()\n\t{\n\t\texpected := `counter=3\nlast update=2009-02-13 23:31:30 +0000 UTC m=+1234567890.000000001\nlast caller=g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm\nstatus=OK`\n\t\tgot := Render(\"\")\n\t\tuassert.Equal(t, expected, got)\n\t}\n\n\t/* XXX: improve tests once we've the missing std.TestSkipTime feature\n\t\t// wait 1h, watchdog is KO.\n\t\tuse std.TestSkipTime(time.Hour)\n\t\t{\n\t\t\texpected := `counter=3\n\tlast update=2009-02-13 22:31:30 +0000 UTC m=+1234564290.000000001\n\tlast caller=g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm\n\tstatus=KO`\n\t\t\tgot := Render(\"\")\n\t\t\tuassert.Equal(t, expected, got)\n\t\t}\n\n\t\t// call Incr(), watchdog is OK.\n\t\tIncr()\n\t\t{\n\t\t\texpected := `counter=4\n\tlast update=2009-02-13 23:31:30 +0000 UTC m=+1234567890.000000001\n\tlast caller=g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm\n\tstatus=OK`\n\t\t\tgot := Render(\"\")\n\t\t\tuassert.Equal(t, expected, got)\n\t\t}\n\t*/\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} -{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"gnopages","path":"gno.land/r/gnoland/pages","files":[{"name":"admin.gno","body":"package gnopages\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/avl\"\n)\n\nvar (\n\tadminAddr std.Address\n\tmoderatorList avl.Tree\n\tinPause bool\n)\n\nfunc init() {\n\t// adminAddr = std.GetOrigCaller() // FIXME: find a way to use this from the main's genesis.\n\tadminAddr = \"g1manfred47kzduec920z88wfr64ylksmdcedlf5\" // @moul\n}\n\nfunc AdminSetAdminAddr(addr std.Address) {\n\tassertIsAdmin()\n\tadminAddr = addr\n}\n\nfunc AdminSetInPause(state bool) {\n\tassertIsAdmin()\n\tinPause = state\n}\n\nfunc AdminAddModerator(addr std.Address) {\n\tassertIsAdmin()\n\tmoderatorList.Set(addr.String(), true)\n}\n\nfunc AdminRemoveModerator(addr std.Address) {\n\tassertIsAdmin()\n\tmoderatorList.Set(addr.String(), false) // XXX: delete instead?\n}\n\nfunc ModAddPost(slug, title, body, publicationDate, authors, tags string) {\n\tassertIsModerator()\n\n\tcaller := std.GetOrigCaller()\n\ttagList := strings.Split(tags, \",\")\n\tauthorList := strings.Split(authors, \",\")\n\n\terr := b.NewPost(caller, slug, title, body, publicationDate, authorList, tagList)\n\tcheckErr(err)\n}\n\nfunc ModEditPost(slug, title, body, publicationDate, authors, tags string) {\n\tassertIsModerator()\n\n\ttagList := strings.Split(tags, \",\")\n\tauthorList := strings.Split(authors, \",\")\n\n\terr := b.GetPost(slug).Update(title, body, publicationDate, authorList, tagList)\n\tcheckErr(err)\n}\n\nfunc isAdmin(addr std.Address) bool {\n\treturn addr == adminAddr\n}\n\nfunc isModerator(addr std.Address) bool {\n\t_, found := moderatorList.Get(addr.String())\n\treturn found\n}\n\nfunc assertIsAdmin() {\n\tcaller := std.GetOrigCaller()\n\tif !isAdmin(caller) {\n\t\tpanic(\"access restricted.\")\n\t}\n}\n\nfunc assertIsModerator() {\n\tcaller := std.GetOrigCaller()\n\tif isAdmin(caller) || isModerator(caller) {\n\t\treturn\n\t}\n\tpanic(\"access restricted\")\n}\n\nfunc assertNotInPause() {\n\tif inPause {\n\t\tpanic(\"access restricted (pause)\")\n\t}\n}\n"},{"name":"page_about.gno","body":"package gnopages\n\nfunc init() {\n\tpath := \"about\"\n\ttitle := \"Gno.land Is A Platform To Write Smart Contracts In Gno\"\n\t// XXX: description := \"On gno.land, developers write smart contracts and other blockchain apps using Gno without learning a language that’s exclusive to a single ecosystem.\"\n\tbody := `\nGno.land is a next-generation smart contract platform using Gno, an interpreted version of the general-purpose Go\nprogramming language. On gno.land, smart contracts can be uploaded on-chain only by publishing their full source code,\nmaking it trivial to verify the contract or fork it into an improved version. With a system to publish reusable code \nlibraries on-chain, gno.land serves as the “GitHub” of the ecosystem, with realms built using fully transparent, \nauditable code that anyone can inspect and reuse.\n\nGno.land addresses many pressing issues in the blockchain space, starting with the ease of use and intuitiveness of\nsmart contract platforms. Developers can write smart contracts without having to learn a new language that’s exclusive \nto a single ecosystem or limited by design. Go developers can easily port their existing web apps to gno.land or build\nnew ones from scratch, making web3 vastly more accessible.\n\nSecured by Proof of Contribution (PoC), a DAO-managed Proof-of-Authority consensus mechanism, gno.land prioritizes \nfairness and merit, rewarding the people most active on the platform. PoC restructures the financial incentives that \noften corrupt blockchain projects, opting instead to reward contributors for their work based on expertise, commitment, and \nalignment. \n\nOne of our inspirations for gno.land is the gospels, which built a system of moral code that lasted thousands of years.\nBy observing a minimal production implementation, gno.land’s design will endure over time and serve as a reference for \nfuture generations with censorship-resistant tools that improve their understanding of the world. \n`\n\t_ = b.NewPost(\"\", path, title, body, \"2022-05-20T13:17:22Z\", nil, nil)\n}\n"},{"name":"page_contribute.gno","body":"package gnopages\n\nfunc init() {\n\tpath := \"contribute\"\n\ttitle := \"Contributor Ecosystem: Call for Contributions\"\n\tbody := `\n\ngno.land puts at the center of its identity the contributors that help to create and shape the project into what it is; incentivizing those who contribute the most and help advance its vision. Eventually, contributions will be incentivized directly on-chain; in the meantime, this page serves to illustrate our current off-chain initiatives.\n\ngno.land is still in full-steam development. For now, we're looking for the earliest of adopters; curious to explore a new way to build smart contracts and eager to make an impact. Joining gno.land's development now means you can help to shape the base of its development ecosystem, which will pave the way for the next generation of blockchain programming.\n\nAs an open-source project, we welcome all contributions. On this page you can find some pointers on where to get started; as well as some incentives for the most valuable and important contributions.\n\n## Where to get started\n\nIf you are interested in contributing to gno.land, you can jump on in on our [GitHub monorepo](https://github.com/gnolang/gno/blob/master/CONTRIBUTING.md) - where most development happens.\n\nA good place where to start are the issues tagged [\"good first issue\"](https://github.com/gnolang/gno/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22). They should allow you to make some impact on the Gno repository while you're still exploring the details of how everything works.\n\n## Gno Bounties\n\nAdditionally, you can look out to help on specific issues labeled as bounties. All contributions will then concur to form your profile for Game of Realms.\n\nThe Gno bounty program is a good way to find interesting challenges in Gno, and get rewarded for helping us advance the project. We will maintain open and rewardable bounties in the gnolang/gno repository, and you can search all available bounties by using the [\"bounty\" label](https://github.com/gnolang/gno/labels/bounty).\n\nRecommendations on participating in the gno.land Bounty Program:\n\n- Identify the bounty you want to work on, and join in the discussion on the issue for anything that is unclear; or where you want to more clearly define the work to be done. At this stage, you can also start working on an initial implementation in your local enviornment.\n- Once you have spent time on the code related to the bounty, we recommend submitting a 'draft' PR as soon as possible.\n - The draft PR doesn't indicate that the bounty has been assigned to you, others are free to work on other draft PRs for the bounty.\n - Make sure to reference the bounty issue on the PR description you're writing.\n - After submitting the 'draft' PR, continue working until you are ready to mark the PR as \"ready for review\".\n - The core team will review the bounty PR submission after the work on the bounty has been completed, and determine if it qualifies for the bounty reward.\n- Ask for clarification early if an element on the requirements or implementation design is unclear.\n - Aside from publishing the PR early, keeping regular updates with the core team on the bounty issue is key to being on the right track.\n - As part of the requirements, you must adhere to the [contributing guidelines](https://github.com/gnolang/gno/blob/master/CONTRIBUTING.md); additionally, it is expected that any newly added code or functionality is properly documented, tested and covered, at least in 80% of added code.\n - You're welcome to propose additional features and work on an issue should you envision a plausible expansion or change in scope. The core team may assign a bounty to the additional work, or change the bounty with respect to the changed scope.\n\nYou may make your submission at any time; however we invite you to publish your draft PR very early in the development process. This will make your work public, so you can easily get help by the core team and other community members. Additionally, your work can be continued by other people should you get stuck or no longer be willing to work on the bounty. Likewise, you can continue the abandoned or stuck work that someone else worked on.\n\nDon't fear your work being \"stolen\": if a submission is the result of multiple people's efforts, we will look to split the bounty in a way that is fair and recognises each participant in creating the final outcome. Here are some examples of how that can happen:\n\n- If Alice does most of the work and abandons it; then Bob comes around and finishes the job, then Bob's PR will be merged. But the core team will propose a split like 70% for Alice and 30% for Bob (depending, of course, on the relative effort undertaken by both).\n- If Alice makes a PR that does only 50% of the work outlined in the requirements for the original issue, she will get 50%. Someone can still come up and finish the job; and claim the remaining part.\n\t- If you, for instance, cannot complete the entirety of the task or, as a non-developer, can only contribute a part of the specification/implementation, you may still be awarded a bounty for your input in the contribution.\n- If Alice makes a PR that aside from implementing what's required, also undertakes creating useful tools among the way, she may qualify for an \"outstanding contribution\"; and may be awarded up to 25% more of the original bounty's value. Or she may also ask if the team would be willing to offer a different bounty for the implementation of the tools.\n\nParticipants in the gno.land Bounty Program must meet the legal Terms and Conditions referenced [here](https://docs.google.com/document/d/1aXrZ6japdAykB5FLmHCCeBZTo-2tbZQHSQi79ITaTK0).\n\n### Bounty sizes\n\nEach bounty is associated with a size, to which corresponds the maximum compensation for the work involved on the bounty. A bounty size may under rare occasion be revisited to a bigger or smaller size; hence why it's important to talk about your proposed solution with the core team ahead of time.\n\nIn some cases, the work associated with a bounty may be outstanding. When that happens, the core team can decide to award up to 25% of the bounty's value to the recipient.\n\nThe value of the bounty, aside from the material completion of the task, considers the involved time in managing the created pull request and iterating on feedback.\n\n\nt-shirt size | expected compensation\n-------------|-----------------------\n[XS] | $ 500\n[S] | $ 1000\n[M] | $ 2000\n[L] | $ 4000\n[XL] | $ 8000\n_[XXL]_ \\* | $ 16000\n_[3XL]_ \\* | $ 32000\n\n[XS]: https://github.com/gnolang/gno/labels/bounty%2FXS\n[S]: https://github.com/gnolang/gno/labels/bounty%2FS\n[M]: https://github.com/gnolang/gno/labels/bounty%2FM\n[L]: https://github.com/gnolang/gno/labels/bounty%2FL\n[XL]: https://github.com/gnolang/gno/labels/bounty%2FXL\n[XXL]: https://github.com/gnolang/gno/labels/bounty%2FXXL\n[3XL]: https://github.com/gnolang/gno/labels/bounty%2F3XL\n\n\\*: XXL and 3XL bounties are exceptional. Almost no issues will have these sizes; most will be broken down into smaller bounties.\n\n## gno.land Grants\n\nThe gno.land grants program is to encourage and support the growth of the gno.land contributor community, and build out the usability of the platform and smart contract library. The program provides financial resources to contributors to explore the Gno tech stack, and build dApps, tooling, infrastructure, products, and smart contract libraries in gno.land.\n\n\u003c!-- TODO: Add link to new repo --\u003e\n\n## Join Game of Realms\n\nGame of Realms is the overarching contributor network of gnomes, currently running off-chain, and will eventually transition on-chain. At this stage, a Game of Realms contribution is comprised of high-impact contributions identified as ['notable contributions'](https://github.com/gnolang/game-of-realms/tree/main/contributors).\n\nThese contributions are not linked to immediate financial rewards, but are notable in nature, in the sense they are a challenge, make a significant addition to the project, and require persistence, with minimal feedback loops from the core team.\n\nThe selection of a notable contribution or the sum of contributions that equal 'notable' is based on the impact it has on the development of the project. For now, it is focused on code contributions, and will evolve over time. The Gno development teams will initially qualify and evaluate notable contributions, and vote off-chain on adding them to the 'notable contributions' folder on GitHub.\n\nYou can always contribute to the project, and all contributions will be noticed. Contributing now is a way to build your personal contributor profile in gno.land early on in the ecosystem, and signal your commitment to the project, the community, and its future.\n\nThere are a variety of ways to make your contributions count:\n\n- Core code contributions\n- Realm and pure package development\n- Validator tooling\n- Developer tooling\n- Tutorials and documentation\n\nTo start, we recommend you create a PR in the Game of Realms [repository](https://github.com/gnolang/game-of-realms) to create your profile page for all your contributions.`\n\n\t_ = b.NewPost(\"\", path, title, body, \"2024-09-05T00:00:00Z\", nil, nil)\n}\n"},{"name":"page_ecosystem.gno","body":"package gnopages\n\nfunc init() {\n\tvar (\n\t\tpath = \"ecosystem\"\n\t\ttitle = \"Discover Gno.land Ecosystem Projects \u0026 Initiatives\"\n\t\t// XXX: description = \"Dive further into the gno.land ecosystem and discover the core infrastructure, projects, smart contracts, and tooling we’re building.\"\n\t\tbody = `\n### [Gno Playground](https://play.gno.land)\n\nGno Playground is a simple web interface that lets you write, test, and experiment with your Gno code to improve your \nunderstanding of the Gno language. You can share your code, run unit tests, deploy your realms and packages, and execute\nfunctions in your code using the repo. \n\nVisit the playground at [play.gno.land](https://play.gno.land)!\n\n### [Gno Studio Connect](https://gno.studio/connect)\n\nGno Studio Connect provides seamless access to realms, making it simple to explore, interact, and engage \nwith gno.land’s smart contracts through function calls. Connect focuses on function calls, enabling users to interact \nwith any realm’s exposed function(s) on gno.land. \n\nSee your realm interactions in [Gno Studio Connect](https://gno.studio/connect)\n\n### [Gnoscan](https://gnoscan.io)\n\nDeveloped by the Onbloc team, Gnoscan is gno.land’s blockchain explorer. Anyone can use Gnoscan to easily find\ninformation that resides on the gno.land blockchain, such as wallet addresses, TX hashes, blocks, and contracts. \nGnoscan makes our on-chain data easy to read and intuitive to discover.\n\nExplore the gno.land blockchain at [gnoscan.io](https://gnoscan.io)!\n\n### Adena\n\nAdena is a user-friendly non-custodial wallet for gno.land. Open-source and developed by Onbloc, Adena allows gnomes to \ninteract easily with the chain. With an emphasis on UX, Adena is built to handle millions of realms and tokens with a\nhigh-quality interface, support for NFTs and custom tokens, and seamless integration. Install Adena via the [official website](https://www.adena.app/)\n\n### Gnoswap\n\nGnoswap is currently under development and led by the Onbloc team. Gnoswap will be the first DEX on gno.land and is an \nautomated market maker (AMM) protocol written in Gno that allows for permissionless token exchanges on the platform.\n\n### Flippando\n\nFlippando is a simple on-chain memory game, ported from Solidity to Gno, which starts with an empty matrix to flip tiles\non to see what’s underneath. If the tiles match, they remain uncovered; if not, they are briefly shown, and the player \nmust memorize their colors until the entire matrix is uncovered. The end result can be minted as an NFT, which can later\nbe assembled into bigger, more complex NFTs, creating a digital “painting” with the uncovered tiles. Play the game at [Flippando](https://gno.flippando.xyz/flip)\n\n### Gno Native Kit\n\n[Gno Native Kit](https://github.com/gnolang/gnonative) is a framework that allows developers to build and port gno.land (d)apps written in the (d)app's native language.\n\n\n`\n\t)\n\t_ = b.NewPost(\"\", path, title, body, \"2022-05-20T13:17:23Z\", nil, nil)\n}\n"},{"name":"page_gnolang.gno","body":"package gnopages\n\nfunc init() {\n\tvar (\n\t\tpath = \"gnolang\"\n\t\ttitle = \"About the Gno, the Language for Gno.land\"\n\t\t// TODO fix broken images\n\t\tbody = `\n\n[Gno](https://github.com/gnolang/gno) is an interpretation of the widely-used Go (Golang) programming language for blockchain created by Cosmos co-founder Jae Kwon in 2022 to mark a new era in smart contracting. Gno is ~99% identical to Go, so Go programmers can start coding in Gno right away, with a minimal learning curve. For example, Gno comes with blockchain-specific standard libraries, but any code that doesn’t use blockchain-specific logic can run in Go with minimal processing. Libraries that don’t make sense in the blockchain context, such as network or operating-system access, are not available in Gno. Otherwise, Gno loads and uses many standard libraries that power Go, so most of the parsing of the source code is the same.\n\nUnder the hood, the Gno code is parsed into an abstract syntax tree (AST) and the AST itself is used in the interpreter, rather than bytecode as in many virtual machines such as Java, Python, or Wasm. This makes even the GnoVM accessible to any Go programmer. The novel design of the intuitive GnoVM interpreter allows Gno to freeze and resume the program by persisting and loading the entire memory state. Gno is deterministic, auto-persisted, and auto-Merkle-ized, allowing (smart contract) programs to be succinct, as the programmer doesn’t have to serialize and deserialize objects to persist them into a database (unlike programming applications with the Cosmos SDK).\n\n## How Gno Differs from Go\n\n![Gno and Go differences](static/img/gno-language/go-and-gno.jpg)\n\nThe composable nature of Go/Gno allows for type-checked interactions between contracts, making gno.land safer and more powerful, as well as operationally cheaper and faster. Smart contracts on gno.land are light, simple, more focused, and easily interoperable—a network of interconnected contracts rather than siloed monoliths that limit interactions with other contracts.\n\n![Example of Gno code](static/img/gno-language/code-example.jpg)\n\n## Gno Inherits Go’s Built-in Security Features\n\nGo supports secure programming through exported/non-exported fields, enabling a “least-authority” design. It is easy to create objects and APIs that expose only what should be accessible to callers while hiding what should not be simply by the capitalization of letters, thus allowing a succinct representation of secure logic that can be called by multiple users.\n\nAnother major advantage of Go is that the language comes with an ecosystem of great tooling, like the compiler and third-party tools that statically analyze code. Gno inherits these advantages from Go directly to create a smart contract programming language that provides embedding, composability, type-check safety, and garbage collection, helping developers to write secure code relying on the compiler, parser, and interpreter to give warning alerts for common mistakes.\n\n## Gno vs Solidity\n\nThe most widely-adopted smart contract language today is Ethereum’s EVM-compatible Solidity. With bytecode built from the ground up and Turing complete, Solidity opened up a world of possibilities for decentralized applications (dApps) and there are currently more than 10 million contracts deployed on Ethereum. However, Solidity provides limited tooling and its EVM has a stack limit and computational inefficiencies.\n\nSolidity is designed for one purpose only (writing smart contracts) and is bound by the limitations of the EVM. In addition, developers have to learn several languages if they want to understand the whole stack or work across different ecosystems. Gno aspires to exceed Solidity on multiple fronts (and other smart contract languages like CosmWasm or Substrate) as every part of the stack is written in Gno. It’s easy for developers to understand the entire system just by studying a relatively small code base.\n\n## Gno Is Essential for the Wider Adoption of Web3\n\nGno makes imports as easy as they are in web2 with runtime-based imports for seamless dependency flow comprehension, and support for complex structs, beyond primitive types. Gno is ultimately cost-effective as dependencies are loaded once, enabling remote function calls as local, and providing automatic and independent per-realm state persistence.\n\nUsing Gno, developers can rapidly accelerate application development and adopt a modular structure by reusing and reassembling existing modules without building from scratch. They can embed one structure inside another in an intuitive way while preserving localism, and the language specification is simple, successfully balancing practicality and minimalism.\n\nThe Go language is so well designed that the Gno smart contract system will become the new gold standard for smart contract development and other blockchain applications. As a programming language that is universally adopted, secure, composable, and complete, Gno is essential for the broader adoption of web3 and its sustainable growth.`\n\t)\n\t_ = b.NewPost(\"\", path, title, body, \"2022-05-20T13:17:25Z\", nil, nil)\n}\n"},{"name":"page_license.gno","body":"package gnopages\n\nfunc init() {\n\tvar (\n\t\tpath = \"license\"\n\t\ttitle = \"Gno Network General Public License\"\n\t\tbody = `Copyright (C) 2024 NewTendermint, LLC\n\nThis program is free software: you can redistribute it and/or modify it under\nthe terms of the GNO Network General Public License as published by\nNewTendermint, LLC, either version 4 of the License, or (at your option) any\nlater version published by NewTendermint, LLC.\n\nThis program is distributed in the hope that it will be useful, but is provided\nas-is and WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNO Network\nGeneral Public License for more details.\n\nYou should have received a copy of the GNO Network General Public License along\nwith this program. If not, see \u003chttps://gno.land/license\u003e.\n\nAttached below are the terms of the GNO Network General Public License, Version\n4 (a fork of the GNU Affero General Public License 3).\n\n## Additional Terms\n\n### Strong Attribution\n\nIf any of your user interfaces, such as websites and mobile applications, serve\nas the primary point of entry to a platform or blockchain that 1) offers users\nthe ability to upload their own smart contracts to the platform or blockchain,\nand 2) leverages any Covered Work (including the GNO virtual machine) to run\nthose smart contracts on the platform or blockchain (\"Applicable Work\"), then\nthe Applicable Work must prominently link to (1) gno.land or (2) any other URL\ndesignated by NewTendermint, LLC that has not been rejected by the governance of\nthe first chain known as gno.land, provided that the identity of the first chain\nis not ambiguous. In the event the identity of the first chain is ambiguous,\nthen NewTendermint, LLC's designation shall control. Such link must appear\nconspicuously in the header or footer of the Applicable Work, such that all\nusers may learn of gno.land or the URL designated by NewTendermint, LLC.\n\nThis additional attribution requirement shall remain in effect for (1) 7\nyears from the date of publication of the Applicable Work, or (2) 7 years from\nthe date of publication of the Covered Work (including republication of new\nversions), whichever is later, but no later than 12 years after the application\nof this strong attribution requirement to the publication of the Applicable\nWork. For purposes of this Strong Attribution requirement, Covered Work shall\nmean any work that is licensed under the GNO Network General Public License,\nVersion 4 or later, by NewTendermint, LLC.\n\n\n# GNO NETWORK GENERAL PUBLIC LICENSE\n\nVersion 4, 7 May 2024\n\nModified from the GNU AFFERO GENERAL PUBLIC LICENSE.\nGNU is not affiliated with GNO or NewTendermint, LLC.\nCopyright (C) 2022 NewTendermint, LLC.\n\n## Preamble\n\nThe GNO Network General Public License is a free, copyleft license for\nsoftware and other kinds of works, specifically designed to ensure\ncooperation with the community in the case of network server software.\n\nThe licenses for most software and other practical works are designed\nto take away your freedom to share and change the works. By contrast,\nour General Public Licenses are intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.\n\nWhen we speak of free software, we are referring to freedom, not\nprice. Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\nDevelopers that use our General Public Licenses protect your rights\nwith two steps: (1) assert copyright on the software, and (2) offer\nyou this License which gives you legal permission to copy, distribute\nand/or modify the software.\n\nA secondary benefit of defending all users' freedom is that\nimprovements made in alternate versions of the program, if they\nreceive widespread use, become available for other developers to\nincorporate. Many developers of free software are heartened and\nencouraged by the resulting cooperation. However, in the case of\nsoftware used on network servers, this result may fail to come about.\nThe GNU General Public License permits making a modified version and\nletting the public access it on a server without ever releasing its\nsource code to the public.\n\nThe GNO Network General Public License is designed specifically to\nensure that, in such cases, the modified source code becomes available\nto the community. It requires the operator of a network server to\nprovide the source code of the modified version running there to the\nusers of that server. Therefore, public use of a modified version, on\na publicly accessible server, gives the public access to the source\ncode of the modified version.\n\nThe precise terms and conditions for copying, distribution and\nmodification follow.\n\n## TERMS AND CONDITIONS\n\n### 0. Definitions.\n\n\"This License\" refers to version 4 of the GNO Network General Public License.\n\n\"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n\"The Program\" refers to any copyrightable work licensed under this\nLicense. Each licensee is addressed as \"you\". \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\nTo \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy. The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\nA \"covered work\" means either the unmodified Program or a work based\non the Program.\n\nTo \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy. Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\nTo \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies. Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\nAn interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License. If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n### 1. Source Code.\n\nThe \"source code\" for a work means the preferred form of the work\nfor making modifications to it. \"Object code\" means any non-source\nform of a work.\n\nA \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\nThe \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form. A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\nThe \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities. However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work. For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\nThe Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\nThe Corresponding Source for a work in source code form is that\nsame work.\n\n### 2. Basic Permissions.\n\nAll rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met. This License explicitly affirms your unlimited\npermission to run the unmodified Program. The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work. This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\nYou may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force. You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright. Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\nConveying under any other circumstances is permitted solely under\nthe conditions stated below. Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n### 3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\nNo covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\nWhen you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n### 4. Conveying Verbatim Copies.\n\nYou may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\nYou may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n### 5. Conveying Modified Source Versions.\n\nYou may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n- a) The work must carry prominent notices stating that you modified\n it, and giving a relevant date.\n- b) The work must carry prominent notices stating that it is\n released under this License and any conditions added under section\n 7. This requirement modifies the requirement in section 4 to\n \"keep intact all notices\".\n- c) You must license the entire work, as a whole, under this\n License to anyone who comes into possession of a copy. This\n License will therefore apply, along with any applicable section 7\n additional terms, to the whole of the work, and all its parts,\n regardless of how they are packaged. This License gives no\n permission to license the work in any other way, but it does not\n invalidate such permission if you have separately received it.\n- d) If the work has interactive user interfaces, each must display\n Appropriate Legal Notices; however, if the Program has interactive\n interfaces that do not display Appropriate Legal Notices, your\n work need not make them do so.\n\nA compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit. Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n### 6. Conveying Non-Source Forms.\n\n You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n- a) Convey the object code in, or embodied in, a physical product\n (including a physical distribution medium), accompanied by the\n Corresponding Source fixed on a durable physical medium\n customarily used for software interchange.\n- b) Convey the object code in, or embodied in, a physical product\n (including a physical distribution medium), accompanied by a\n written offer, valid for at least three years and valid for as\n long as you offer spare parts or customer support for that product\n model, to give anyone who possesses the object code either (1) a\n copy of the Corresponding Source for all the software in the\n product that is covered by this License, on a durable physical\n medium customarily used for software interchange, for a price no\n more than your reasonable cost of physically performing this\n conveying of source, or (2) access to copy the\n Corresponding Source from a network server at no charge.\n- c) Convey individual copies of the object code with a copy of the\n written offer to provide the Corresponding Source. This\n alternative is allowed only occasionally and noncommercially, and\n only if you received the object code with such an offer, in accord\n with subsection 6b.\n- d) Convey the object code by offering access from a designated\n place (gratis or for a charge), and offer equivalent access to the\n Corresponding Source in the same way through the same place at no\n further charge. You need not require recipients to copy the\n Corresponding Source along with the object code. If the place to\n copy the object code is a network server, the Corresponding Source\n may be on a different server (operated by you or a third party)\n that supports equivalent copying facilities, provided you maintain\n clear directions next to the object code saying where to find the\n Corresponding Source. Regardless of what server hosts the\n Corresponding Source, you remain obligated to ensure that it is\n available for as long as needed to satisfy these requirements.\n- e) Convey the object code using peer-to-peer transmission, provided\n you inform other peers where the object code and Corresponding\n Source of the work are being offered to the general public at no\n charge under subsection 6d.\n\nA separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\nA \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling. In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage. For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product. A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n\"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source. The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\nIf you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information. But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\nThe requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed. Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\nCorresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n### 7. Additional Terms.\n\n\"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law. If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\nWhen you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit. (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.) You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\nNotwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n- a) Disclaiming warranty or limiting liability differently from the\n terms of sections 15 and 16 of this License; or\n- b) Requiring preservation of specified reasonable legal notices or\n author attributions in that material or in the Appropriate Legal\n Notices displayed by works containing it; or\n- c) Prohibiting misrepresentation of the origin of that material, or\n requiring that modified versions of such material be marked in\n reasonable ways as different from the original version; or\n- d) Limiting the use for publicity purposes of names of licensors or\n authors of the material; or\n- e) Declining to grant rights under trademark law for use of some\n trade names, trademarks, or service marks; or\n- f) Requiring indemnification of licensors and authors of that\n material by anyone who conveys the material (or modified versions of\n it) with contractual assumptions of liability to the recipient, for\n any liability that these contractual assumptions directly impose on\n those licensors and authors; or\n- g) Requiring strong attribution such as notices on any user interfaces\n that run or convey any covered work, such as a prominent link to a URL\n on the header of a website, such that all users of the covered work may\n become aware of the notice, for a period no longer than 20 years.\n\nAll other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10. If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term. If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\nIf you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\nAdditional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n### 8. Termination.\n\nYou may not propagate or modify a covered work except as expressly\nprovided under this License. Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\nHowever, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\nMoreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\nTermination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License. If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n### 9. Acceptance Not Required for Having Copies.\n\nYou are not required to accept this License in order to receive or\nrun a copy of the Program. Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance. However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work. These actions infringe copyright if you do\nnot accept this License. Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n### 10. Automatic Licensing of Downstream Recipients.\n\nEach time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License. You are not responsible\nfor enforcing compliance by third parties with this License.\n\nAn \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations. If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\nYou may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License. For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n### 11. Patents.\n\nA \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based. The\nwork thus licensed is called the contributor's \"contributor version\".\n\nA contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version. For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\nEach contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\nIn the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement). To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\nIf you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients. \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\nIf, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\nA patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License. You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\nNothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n### 12. No Surrender of Others' Freedom.\n\nIf conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License. If you cannot convey a\ncovered work so as to simultaneously satisfy your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all. For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n### 13. Remote Network Interaction; Use with the GNU General Public License.\n\nNotwithstanding any other provision of this License, if you modify the\nProgram, your modified version must prominently offer all users\ninteracting with it remotely through a computer network (if your version\nsupports such interaction) an opportunity to receive the Corresponding\nSource of your version by providing access to the Corresponding Source\nfrom a network server at no charge, through some standard or customary\nmeans of facilitating copying of software. This Corresponding Source\nshall include the Corresponding Source for any work covered by version 3\nof the GNU General Public License that is incorporated pursuant to the\nfollowing paragraph.\n\nNotwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU General Public License into a single\ncombined work, and to convey the resulting work. The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the work with which it is combined will remain governed by version\n3 of the GNU General Public License.\n\n### 14. Revised Versions of this License.\n\nNewTendermint LLC may publish revised and/or new versions of\nthe GNO Network General Public License from time to time. Such new versions\nwill be similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\nEach version is given a distinguishing version number. If the\nProgram specifies that a certain numbered version of the GNO Network General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Gno Software\nFoundation. If the Program does not specify a version number of the\nGNO Network General Public License, you may choose any version ever published\nby NewTendermint LLC.\n\nIf the Program specifies that a proxy can decide which future\nversions of the GNO Network General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\nLater license versions may give you additional or different\npermissions. However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n### 15. Disclaimer of Warranty.\n\nTHERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n### 16. Limitation of Liability.\n\nIN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n### 17. Interpretation of Sections 15 and 16.\n\nIf the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\nEND OF TERMS AND CONDITIONS\n\n## How to Apply These Terms to Your New Programs\n\nIf you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\nTo do so, attach the following notices to the program. It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n \u003cone line to give the program's name and a brief idea of what it does.\u003e\n Copyright (C) \u003cyear\u003e \u003cname of author\u003e\n\n This program is free software: you can redistribute it and/or modify\n it under the terms of the GNO Network General Public License as published by\n NewTendermint LLC, either version 4 of the License, or\n (at your option) any later version.\n\n This program is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNO Network General Public License for more details.\n\n You should have received a copy of the GNO Network General Public License\n along with this program. If not, see \u003chttps://gno.land/license\u003e.\n\nAlso add information on how to contact you by electronic and paper mail.\n\nIf your software can interact with users remotely through a computer\nnetwork, you should also make sure that it provides a way for users to\nget its source. For example, if your program is a web application, its\ninterface could display a \"Source\" link that leads users to an archive\nof the code. There are many ways you could offer source, and different\nsolutions will be better for different programs; see section 13 for the\nspecific requirements.\n`\n\t)\n\t_ = b.NewPost(\"\", path, title, body, \"2024-04-22T00:00:00Z\", nil, nil)\n}\n"},{"name":"page_partners.gno","body":"package gnopages\n\nfunc init() {\n\tpath := \"partners\"\n\ttitle := \"Partnerships\"\n\tbody := `### Fund and Grants Program\n\nAre you a builder, tinkerer, or researcher? If you’re looking to create awesome dApps, tooling, infrastructure, \nor smart contract libraries on gno.land, you can apply for a grant. The gno.land Ecosystem Fund and Grants program \nprovides financial contributions for individuals and teams to innovate on the platform.\n\nRead more about our Funds and Grants program [here](https://github.com/gnolang/ecosystem-fund-grants).\n`\n\t_ = b.NewPost(\"\", path, title, body, \"2022-05-20T13:17:27Z\", nil, nil)\n}\n"},{"name":"page_start.gno","body":"package gnopages\n\nfunc init() {\n\tpath := \"start\"\n\ttitle := \"Getting Started with Gno\"\n\t// XXX: description := \"\"\n\n\t// TODO: codegen to use README files here\n\n\t/* TODO: port previous message: This is a demo of Gno smart contract programming. This document was\n\tconstructed by Gno onto a smart contract hosted on the data Realm\n\tname [\"gno.land/r/demo/boards\"](https://gno.land/r/demo/boards/)\n\t([github](https://github.com/gnolang/gno/tree/master/examples/gno.land/r/demo/boards)).\n\t*/\n\tbody := `## Getting Started with Gno\n\n- [Install Gno Key](/r/demo/boards:testboard/5)\n- TODO: add more links\n`\n\t_ = b.NewPost(\"\", path, title, body, \"2022-05-20T13:17:28Z\", nil, nil)\n}\n"},{"name":"page_testnets.gno","body":"package gnopages\n\nfunc init() {\n\tpath := \"testnets\"\n\ttitle := \"Gno.land Testnet List\"\n\tbody := `\n- [Portal Loop](https://docs.gno.land/concepts/portal-loop) - a rolling testnet \n- [staging.gno.land](https://staging.gno.land) - wiped every commit to monorepo master\n- test4.gno.land (upcoming)\n- _[test3.gno.land](https://test3.gno.land) (latest)_\n- _[test2.gno.land](https://test2.gno.land) (archive)_\n- _[test1.gno.land](https://test1.gno.land) (archive)_\n\nFor a list of RPC endpoints, see the [reference documentation](https://docs.gno.land/reference/rpc-endpoints).\n\n## Local development\n\nSee the \"Getting started\" section in the [official documentation](https://docs.gno.land/getting-started/local-setup).\n`\n\t_ = b.NewPost(\"\", path, title, body, \"2022-05-20T13:17:29Z\", nil, nil)\n}\n"},{"name":"page_tokenomics.gno","body":"package gnopages\n\nfunc init() {\n\tvar (\n\t\tpath = \"tokenomics\"\n\t\ttitle = \"Gno.land Tokenomics\"\n\t\t// XXX: description = \"\"\"\n\t\tbody = `Lorem Ipsum`\n\t)\n\t_ = b.NewPost(\"\", path, title, body, \"2022-05-20T13:17:30Z\", nil, nil)\n}\n"},{"name":"pages.gno","body":"package gnopages\n\nimport (\n\t\"gno.land/p/demo/blog\"\n)\n\n// TODO: switch from p/blog to p/pages\n\nvar b = \u0026blog.Blog{\n\tTitle: \"Gnoland's Pages\",\n\tPrefix: \"/r/gnoland/pages:\",\n\tNoBreadcrumb: true,\n}\n\nfunc Render(path string) string {\n\treturn b.Render(path)\n}\n"},{"name":"pages_test.gno","body":"package gnopages\n\nimport (\n\t\"strings\"\n\t\"testing\"\n)\n\nfunc TestHome(t *testing.T) {\n\tprintedOnce := false\n\tgot := Render(\"\")\n\texpectedSubtrings := []string{\n\t\t\"/r/gnoland/pages:p/tokenomics\",\n\t\t\"/r/gnoland/pages:p/start\",\n\t\t\"/r/gnoland/pages:p/contribute\",\n\t\t\"/r/gnoland/pages:p/about\",\n\t\t\"/r/gnoland/pages:p/gnolang\",\n\t}\n\tfor _, substring := range expectedSubtrings {\n\t\tif !strings.Contains(got, substring) {\n\t\t\tif !printedOnce {\n\t\t\t\tprintln(got)\n\t\t\t\tprintedOnce = true\n\t\t\t}\n\t\t\tt.Errorf(\"expected %q, but not found.\", substring)\n\t\t}\n\t}\n}\n\nfunc TestAbout(t *testing.T) {\n\tprintedOnce := false\n\tgot := Render(\"p/about\")\n\texpectedSubtrings := []string{\n\t\t\"Gno.land Is A Platform To Write Smart Contracts In Gno\",\n\t\t\"Gno.land is a next-generation smart contract platform using Gno, an interpreted version of the general-purpose Go\\nprogramming language.\",\n\t}\n\tfor _, substring := range expectedSubtrings {\n\t\tif !strings.Contains(got, substring) {\n\t\t\tif !printedOnce {\n\t\t\t\tprintln(got)\n\t\t\t\tprintedOnce = true\n\t\t\t}\n\t\t\tt.Errorf(\"expected %q, but not found.\", substring)\n\t\t}\n\t}\n}\n"},{"name":"util.gno","body":"package gnopages\n\nfunc checkErr(err error) {\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"gnopages","path":"gno.land/r/gnoland/pages","files":[{"name":"admin.gno","body":"package gnopages\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/avl\"\n)\n\nvar (\n\tadminAddr std.Address\n\tmoderatorList avl.Tree\n\tinPause bool\n)\n\nfunc init() {\n\t// adminAddr = std.GetOrigCaller() // FIXME: find a way to use this from the main's genesis.\n\tadminAddr = \"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq\"\n}\n\nfunc AdminSetAdminAddr(addr std.Address) {\n\tassertIsAdmin()\n\tadminAddr = addr\n}\n\nfunc AdminSetInPause(state bool) {\n\tassertIsAdmin()\n\tinPause = state\n}\n\nfunc AdminAddModerator(addr std.Address) {\n\tassertIsAdmin()\n\tmoderatorList.Set(addr.String(), true)\n}\n\nfunc AdminRemoveModerator(addr std.Address) {\n\tassertIsAdmin()\n\tmoderatorList.Set(addr.String(), false) // XXX: delete instead?\n}\n\nfunc ModAddPost(slug, title, body, publicationDate, authors, tags string) {\n\tassertIsModerator()\n\n\tcaller := std.GetOrigCaller()\n\ttagList := strings.Split(tags, \",\")\n\tauthorList := strings.Split(authors, \",\")\n\n\terr := b.NewPost(caller, slug, title, body, publicationDate, authorList, tagList)\n\tcheckErr(err)\n}\n\nfunc ModEditPost(slug, title, body, publicationDate, authors, tags string) {\n\tassertIsModerator()\n\n\ttagList := strings.Split(tags, \",\")\n\tauthorList := strings.Split(authors, \",\")\n\n\terr := b.GetPost(slug).Update(title, body, publicationDate, authorList, tagList)\n\tcheckErr(err)\n}\n\nfunc isAdmin(addr std.Address) bool {\n\treturn addr == adminAddr\n}\n\nfunc isModerator(addr std.Address) bool {\n\t_, found := moderatorList.Get(addr.String())\n\treturn found\n}\n\nfunc assertIsAdmin() {\n\tcaller := std.GetOrigCaller()\n\tif !isAdmin(caller) {\n\t\tpanic(\"access restricted.\")\n\t}\n}\n\nfunc assertIsModerator() {\n\tcaller := std.GetOrigCaller()\n\tif isAdmin(caller) || isModerator(caller) {\n\t\treturn\n\t}\n\tpanic(\"access restricted\")\n}\n\nfunc assertNotInPause() {\n\tif inPause {\n\t\tpanic(\"access restricted (pause)\")\n\t}\n}\n"},{"name":"page_about.gno","body":"package gnopages\n\nfunc init() {\n\tpath := \"about\"\n\ttitle := \"Gno.land Is A Platform To Write Smart Contracts In Gno\"\n\t// XXX: description := \"On gno.land, developers write smart contracts and other blockchain apps using Gno without learning a language that’s exclusive to a single ecosystem.\"\n\tbody := `\nGno.land is a next-generation smart contract platform using Gno, an interpreted version of the general-purpose Go\nprogramming language. On gno.land, smart contracts can be uploaded on-chain only by publishing their full source code,\nmaking it trivial to verify the contract or fork it into an improved version. With a system to publish reusable code \nlibraries on-chain, gno.land serves as the “GitHub” of the ecosystem, with realms built using fully transparent, \nauditable code that anyone can inspect and reuse.\n\nGno.land addresses many pressing issues in the blockchain space, starting with the ease of use and intuitiveness of\nsmart contract platforms. Developers can write smart contracts without having to learn a new language that’s exclusive \nto a single ecosystem or limited by design. Go developers can easily port their existing web apps to gno.land or build\nnew ones from scratch, making web3 vastly more accessible.\n\nSecured by Proof of Contribution (PoC), a DAO-managed Proof-of-Authority consensus mechanism, gno.land prioritizes \nfairness and merit, rewarding the people most active on the platform. PoC restructures the financial incentives that \noften corrupt blockchain projects, opting instead to reward contributors for their work based on expertise, commitment, and \nalignment. \n\nOne of our inspirations for gno.land is the gospels, which built a system of moral code that lasted thousands of years.\nBy observing a minimal production implementation, gno.land’s design will endure over time and serve as a reference for \nfuture generations with censorship-resistant tools that improve their understanding of the world. \n`\n\t_ = b.NewPost(\"\", path, title, body, \"2022-05-20T13:17:22Z\", nil, nil)\n}\n"},{"name":"page_contribute.gno","body":"package gnopages\n\nfunc init() {\n\tpath := \"contribute\"\n\ttitle := \"Contributor Ecosystem: Call for Contributions\"\n\tbody := `\n\ngno.land puts at the center of its identity the contributors that help to create and shape the project into what it is; incentivizing those who contribute the most and help advance its vision. Eventually, contributions will be incentivized directly on-chain; in the meantime, this page serves to illustrate our current off-chain initiatives.\n\ngno.land is still in full-steam development. For now, we're looking for the earliest of adopters; curious to explore a new way to build smart contracts and eager to make an impact. Joining gno.land's development now means you can help to shape the base of its development ecosystem, which will pave the way for the next generation of blockchain programming.\n\nAs an open-source project, we welcome all contributions. On this page you can find some pointers on where to get started; as well as some incentives for the most valuable and important contributions.\n\n## Where to get started\n\nIf you are interested in contributing to gno.land, you can jump on in on our [GitHub monorepo](https://github.com/gnolang/gno/blob/master/CONTRIBUTING.md) - where most development happens.\n\nA good place where to start are the issues tagged [\"good first issue\"](https://github.com/gnolang/gno/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22). They should allow you to make some impact on the Gno repository while you're still exploring the details of how everything works.\n\n## Gno Bounties\n\nAdditionally, you can look out to help on specific issues labeled as bounties. All contributions will then concur to form your profile for Game of Realms.\n\nThe Gno bounty program is a good way to find interesting challenges in Gno, and get rewarded for helping us advance the project. We will maintain open and rewardable bounties in the gnolang/gno repository, and you can search all available bounties by using the [\"bounty\" label](https://github.com/gnolang/gno/labels/bounty).\n\nRecommendations on participating in the gno.land Bounty Program:\n\n- Identify the bounty you want to work on, and join in the discussion on the issue for anything that is unclear; or where you want to more clearly define the work to be done. At this stage, you can also start working on an initial implementation in your local enviornment.\n- Once you have spent time on the code related to the bounty, we recommend submitting a 'draft' PR as soon as possible.\n - The draft PR doesn't indicate that the bounty has been assigned to you, others are free to work on other draft PRs for the bounty.\n - Make sure to reference the bounty issue on the PR description you're writing.\n - After submitting the 'draft' PR, continue working until you are ready to mark the PR as \"ready for review\".\n - The core team will review the bounty PR submission after the work on the bounty has been completed, and determine if it qualifies for the bounty reward.\n- Ask for clarification early if an element on the requirements or implementation design is unclear.\n - Aside from publishing the PR early, keeping regular updates with the core team on the bounty issue is key to being on the right track.\n - As part of the requirements, you must adhere to the [contributing guidelines](https://github.com/gnolang/gno/blob/master/CONTRIBUTING.md); additionally, it is expected that any newly added code or functionality is properly documented, tested and covered, at least in 80% of added code.\n - You're welcome to propose additional features and work on an issue should you envision a plausible expansion or change in scope. The core team may assign a bounty to the additional work, or change the bounty with respect to the changed scope.\n\nYou may make your submission at any time; however we invite you to publish your draft PR very early in the development process. This will make your work public, so you can easily get help by the core team and other community members. Additionally, your work can be continued by other people should you get stuck or no longer be willing to work on the bounty. Likewise, you can continue the abandoned or stuck work that someone else worked on.\n\nDon't fear your work being \"stolen\": if a submission is the result of multiple people's efforts, we will look to split the bounty in a way that is fair and recognises each participant in creating the final outcome. Here are some examples of how that can happen:\n\n- If Alice does most of the work and abandons it; then Bob comes around and finishes the job, then Bob's PR will be merged. But the core team will propose a split like 70% for Alice and 30% for Bob (depending, of course, on the relative effort undertaken by both).\n- If Alice makes a PR that does only 50% of the work outlined in the requirements for the original issue, she will get 50%. Someone can still come up and finish the job; and claim the remaining part.\n\t- If you, for instance, cannot complete the entirety of the task or, as a non-developer, can only contribute a part of the specification/implementation, you may still be awarded a bounty for your input in the contribution.\n- If Alice makes a PR that aside from implementing what's required, also undertakes creating useful tools among the way, she may qualify for an \"outstanding contribution\"; and may be awarded up to 25% more of the original bounty's value. Or she may also ask if the team would be willing to offer a different bounty for the implementation of the tools.\n\nParticipants in the gno.land Bounty Program must meet the legal Terms and Conditions referenced [here](https://docs.google.com/document/d/1aXrZ6japdAykB5FLmHCCeBZTo-2tbZQHSQi79ITaTK0).\n\n### Bounty sizes\n\nEach bounty is associated with a size, to which corresponds the maximum compensation for the work involved on the bounty. A bounty size may under rare occasion be revisited to a bigger or smaller size; hence why it's important to talk about your proposed solution with the core team ahead of time.\n\nIn some cases, the work associated with a bounty may be outstanding. When that happens, the core team can decide to award up to 25% of the bounty's value to the recipient.\n\nThe value of the bounty, aside from the material completion of the task, considers the involved time in managing the created pull request and iterating on feedback.\n\n\nt-shirt size | expected compensation\n-------------|-----------------------\n[XS] | $ 500\n[S] | $ 1000\n[M] | $ 2000\n[L] | $ 4000\n[XL] | $ 8000\n_[XXL]_ \\* | $ 16000\n_[3XL]_ \\* | $ 32000\n\n[XS]: https://github.com/gnolang/gno/labels/bounty%2FXS\n[S]: https://github.com/gnolang/gno/labels/bounty%2FS\n[M]: https://github.com/gnolang/gno/labels/bounty%2FM\n[L]: https://github.com/gnolang/gno/labels/bounty%2FL\n[XL]: https://github.com/gnolang/gno/labels/bounty%2FXL\n[XXL]: https://github.com/gnolang/gno/labels/bounty%2FXXL\n[3XL]: https://github.com/gnolang/gno/labels/bounty%2F3XL\n\n\\*: XXL and 3XL bounties are exceptional. Almost no issues will have these sizes; most will be broken down into smaller bounties.\n\n## gno.land Grants\n\nThe gno.land grants program is to encourage and support the growth of the gno.land contributor community, and build out the usability of the platform and smart contract library. The program provides financial resources to contributors to explore the Gno tech stack, and build dApps, tooling, infrastructure, products, and smart contract libraries in gno.land.\n\n\u003c!-- TODO: Add link to new repo --\u003e\n\n## Join Game of Realms\n\nGame of Realms is the overarching contributor network of gnomes, currently running off-chain, and will eventually transition on-chain. At this stage, a Game of Realms contribution is comprised of high-impact contributions identified as ['notable contributions'](https://github.com/gnolang/game-of-realms/tree/main/contributors).\n\nThese contributions are not linked to immediate financial rewards, but are notable in nature, in the sense they are a challenge, make a significant addition to the project, and require persistence, with minimal feedback loops from the core team.\n\nThe selection of a notable contribution or the sum of contributions that equal 'notable' is based on the impact it has on the development of the project. For now, it is focused on code contributions, and will evolve over time. The Gno development teams will initially qualify and evaluate notable contributions, and vote off-chain on adding them to the 'notable contributions' folder on GitHub.\n\nYou can always contribute to the project, and all contributions will be noticed. Contributing now is a way to build your personal contributor profile in gno.land early on in the ecosystem, and signal your commitment to the project, the community, and its future.\n\nThere are a variety of ways to make your contributions count:\n\n- Core code contributions\n- Realm and pure package development\n- Validator tooling\n- Developer tooling\n- Tutorials and documentation\n\nTo start, we recommend you create a PR in the Game of Realms [repository](https://github.com/gnolang/game-of-realms) to create your profile page for all your contributions.`\n\n\t_ = b.NewPost(\"\", path, title, body, \"2024-09-05T00:00:00Z\", nil, nil)\n}\n"},{"name":"page_ecosystem.gno","body":"package gnopages\n\nfunc init() {\n\tvar (\n\t\tpath = \"ecosystem\"\n\t\ttitle = \"Discover Gno.land Ecosystem Projects \u0026 Initiatives\"\n\t\t// XXX: description = \"Dive further into the gno.land ecosystem and discover the core infrastructure, projects, smart contracts, and tooling we’re building.\"\n\t\tbody = `\n### [Gno Playground](https://play.gno.land)\n\nGno Playground is a simple web interface that lets you write, test, and experiment with your Gno code to improve your \nunderstanding of the Gno language. You can share your code, run unit tests, deploy your realms and packages, and execute\nfunctions in your code using the repo. \n\nVisit the playground at [play.gno.land](https://play.gno.land)!\n\n### [Gno Studio Connect](https://gno.studio/connect)\n\nGno Studio Connect provides seamless access to realms, making it simple to explore, interact, and engage \nwith gno.land’s smart contracts through function calls. Connect focuses on function calls, enabling users to interact \nwith any realm’s exposed function(s) on gno.land. \n\nSee your realm interactions in [Gno Studio Connect](https://gno.studio/connect)\n\n### [Gnoscan](https://gnoscan.io)\n\nDeveloped by the Onbloc team, Gnoscan is gno.land’s blockchain explorer. Anyone can use Gnoscan to easily find\ninformation that resides on the gno.land blockchain, such as wallet addresses, TX hashes, blocks, and contracts. \nGnoscan makes our on-chain data easy to read and intuitive to discover.\n\nExplore the gno.land blockchain at [gnoscan.io](https://gnoscan.io)!\n\n### Adena\n\nAdena is a user-friendly non-custodial wallet for gno.land. Open-source and developed by Onbloc, Adena allows gnomes to \ninteract easily with the chain. With an emphasis on UX, Adena is built to handle millions of realms and tokens with a\nhigh-quality interface, support for NFTs and custom tokens, and seamless integration. Install Adena via the [official website](https://www.adena.app/)\n\n### Gnoswap\n\nGnoswap is currently under development and led by the Onbloc team. Gnoswap will be the first DEX on gno.land and is an \nautomated market maker (AMM) protocol written in Gno that allows for permissionless token exchanges on the platform.\n\n### Flippando\n\nFlippando is a simple on-chain memory game, ported from Solidity to Gno, which starts with an empty matrix to flip tiles\non to see what’s underneath. If the tiles match, they remain uncovered; if not, they are briefly shown, and the player \nmust memorize their colors until the entire matrix is uncovered. The end result can be minted as an NFT, which can later\nbe assembled into bigger, more complex NFTs, creating a digital “painting” with the uncovered tiles. Play the game at [Flippando](https://gno.flippando.xyz/flip)\n\n### Gno Native Kit\n\n[Gno Native Kit](https://github.com/gnolang/gnonative) is a framework that allows developers to build and port gno.land (d)apps written in the (d)app's native language.\n\n\n`\n\t)\n\t_ = b.NewPost(\"\", path, title, body, \"2022-05-20T13:17:23Z\", nil, nil)\n}\n"},{"name":"page_gnolang.gno","body":"package gnopages\n\nfunc init() {\n\tvar (\n\t\tpath = \"gnolang\"\n\t\ttitle = \"About the Gno, the Language for Gno.land\"\n\t\t// TODO fix broken images\n\t\tbody = `\n\n[Gno](https://github.com/gnolang/gno) is an interpretation of the widely-used Go (Golang) programming language for blockchain created by Cosmos co-founder Jae Kwon in 2022 to mark a new era in smart contracting. Gno is ~99% identical to Go, so Go programmers can start coding in Gno right away, with a minimal learning curve. For example, Gno comes with blockchain-specific standard libraries, but any code that doesn’t use blockchain-specific logic can run in Go with minimal processing. Libraries that don’t make sense in the blockchain context, such as network or operating-system access, are not available in Gno. Otherwise, Gno loads and uses many standard libraries that power Go, so most of the parsing of the source code is the same.\n\nUnder the hood, the Gno code is parsed into an abstract syntax tree (AST) and the AST itself is used in the interpreter, rather than bytecode as in many virtual machines such as Java, Python, or Wasm. This makes even the GnoVM accessible to any Go programmer. The novel design of the intuitive GnoVM interpreter allows Gno to freeze and resume the program by persisting and loading the entire memory state. Gno is deterministic, auto-persisted, and auto-Merkle-ized, allowing (smart contract) programs to be succinct, as the programmer doesn’t have to serialize and deserialize objects to persist them into a database (unlike programming applications with the Cosmos SDK).\n\n## How Gno Differs from Go\n\n![Gno and Go differences](static/img/gno-language/go-and-gno.jpg)\n\nThe composable nature of Go/Gno allows for type-checked interactions between contracts, making gno.land safer and more powerful, as well as operationally cheaper and faster. Smart contracts on gno.land are light, simple, more focused, and easily interoperable—a network of interconnected contracts rather than siloed monoliths that limit interactions with other contracts.\n\n![Example of Gno code](static/img/gno-language/code-example.jpg)\n\n## Gno Inherits Go’s Built-in Security Features\n\nGo supports secure programming through exported/non-exported fields, enabling a “least-authority” design. It is easy to create objects and APIs that expose only what should be accessible to callers while hiding what should not be simply by the capitalization of letters, thus allowing a succinct representation of secure logic that can be called by multiple users.\n\nAnother major advantage of Go is that the language comes with an ecosystem of great tooling, like the compiler and third-party tools that statically analyze code. Gno inherits these advantages from Go directly to create a smart contract programming language that provides embedding, composability, type-check safety, and garbage collection, helping developers to write secure code relying on the compiler, parser, and interpreter to give warning alerts for common mistakes.\n\n## Gno vs Solidity\n\nThe most widely-adopted smart contract language today is Ethereum’s EVM-compatible Solidity. With bytecode built from the ground up and Turing complete, Solidity opened up a world of possibilities for decentralized applications (dApps) and there are currently more than 10 million contracts deployed on Ethereum. However, Solidity provides limited tooling and its EVM has a stack limit and computational inefficiencies.\n\nSolidity is designed for one purpose only (writing smart contracts) and is bound by the limitations of the EVM. In addition, developers have to learn several languages if they want to understand the whole stack or work across different ecosystems. Gno aspires to exceed Solidity on multiple fronts (and other smart contract languages like CosmWasm or Substrate) as every part of the stack is written in Gno. It’s easy for developers to understand the entire system just by studying a relatively small code base.\n\n## Gno Is Essential for the Wider Adoption of Web3\n\nGno makes imports as easy as they are in web2 with runtime-based imports for seamless dependency flow comprehension, and support for complex structs, beyond primitive types. Gno is ultimately cost-effective as dependencies are loaded once, enabling remote function calls as local, and providing automatic and independent per-realm state persistence.\n\nUsing Gno, developers can rapidly accelerate application development and adopt a modular structure by reusing and reassembling existing modules without building from scratch. They can embed one structure inside another in an intuitive way while preserving localism, and the language specification is simple, successfully balancing practicality and minimalism.\n\nThe Go language is so well designed that the Gno smart contract system will become the new gold standard for smart contract development and other blockchain applications. As a programming language that is universally adopted, secure, composable, and complete, Gno is essential for the broader adoption of web3 and its sustainable growth.`\n\t)\n\t_ = b.NewPost(\"\", path, title, body, \"2022-05-20T13:17:25Z\", nil, nil)\n}\n"},{"name":"page_license.gno","body":"package gnopages\n\nfunc init() {\n\tvar (\n\t\tpath = \"license\"\n\t\ttitle = \"Gno Network General Public License\"\n\t\tbody = `Copyright (C) 2024 NewTendermint, LLC\n\nThis program is free software: you can redistribute it and/or modify it under\nthe terms of the GNO Network General Public License as published by\nNewTendermint, LLC, either version 4 of the License, or (at your option) any\nlater version published by NewTendermint, LLC.\n\nThis program is distributed in the hope that it will be useful, but is provided\nas-is and WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNO Network\nGeneral Public License for more details.\n\nYou should have received a copy of the GNO Network General Public License along\nwith this program. If not, see \u003chttps://gno.land/license\u003e.\n\nAttached below are the terms of the GNO Network General Public License, Version\n4 (a fork of the GNU Affero General Public License 3).\n\n## Additional Terms\n\n### Strong Attribution\n\nIf any of your user interfaces, such as websites and mobile applications, serve\nas the primary point of entry to a platform or blockchain that 1) offers users\nthe ability to upload their own smart contracts to the platform or blockchain,\nand 2) leverages any Covered Work (including the GNO virtual machine) to run\nthose smart contracts on the platform or blockchain (\"Applicable Work\"), then\nthe Applicable Work must prominently link to (1) gno.land or (2) any other URL\ndesignated by NewTendermint, LLC that has not been rejected by the governance of\nthe first chain known as gno.land, provided that the identity of the first chain\nis not ambiguous. In the event the identity of the first chain is ambiguous,\nthen NewTendermint, LLC's designation shall control. Such link must appear\nconspicuously in the header or footer of the Applicable Work, such that all\nusers may learn of gno.land or the URL designated by NewTendermint, LLC.\n\nThis additional attribution requirement shall remain in effect for (1) 7\nyears from the date of publication of the Applicable Work, or (2) 7 years from\nthe date of publication of the Covered Work (including republication of new\nversions), whichever is later, but no later than 12 years after the application\nof this strong attribution requirement to the publication of the Applicable\nWork. For purposes of this Strong Attribution requirement, Covered Work shall\nmean any work that is licensed under the GNO Network General Public License,\nVersion 4 or later, by NewTendermint, LLC.\n\n\n# GNO NETWORK GENERAL PUBLIC LICENSE\n\nVersion 4, 7 May 2024\n\nModified from the GNU AFFERO GENERAL PUBLIC LICENSE.\nGNU is not affiliated with GNO or NewTendermint, LLC.\nCopyright (C) 2022 NewTendermint, LLC.\n\n## Preamble\n\nThe GNO Network General Public License is a free, copyleft license for\nsoftware and other kinds of works, specifically designed to ensure\ncooperation with the community in the case of network server software.\n\nThe licenses for most software and other practical works are designed\nto take away your freedom to share and change the works. By contrast,\nour General Public Licenses are intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.\n\nWhen we speak of free software, we are referring to freedom, not\nprice. Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\nDevelopers that use our General Public Licenses protect your rights\nwith two steps: (1) assert copyright on the software, and (2) offer\nyou this License which gives you legal permission to copy, distribute\nand/or modify the software.\n\nA secondary benefit of defending all users' freedom is that\nimprovements made in alternate versions of the program, if they\nreceive widespread use, become available for other developers to\nincorporate. Many developers of free software are heartened and\nencouraged by the resulting cooperation. However, in the case of\nsoftware used on network servers, this result may fail to come about.\nThe GNU General Public License permits making a modified version and\nletting the public access it on a server without ever releasing its\nsource code to the public.\n\nThe GNO Network General Public License is designed specifically to\nensure that, in such cases, the modified source code becomes available\nto the community. It requires the operator of a network server to\nprovide the source code of the modified version running there to the\nusers of that server. Therefore, public use of a modified version, on\na publicly accessible server, gives the public access to the source\ncode of the modified version.\n\nThe precise terms and conditions for copying, distribution and\nmodification follow.\n\n## TERMS AND CONDITIONS\n\n### 0. Definitions.\n\n\"This License\" refers to version 4 of the GNO Network General Public License.\n\n\"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n\"The Program\" refers to any copyrightable work licensed under this\nLicense. Each licensee is addressed as \"you\". \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\nTo \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy. The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\nA \"covered work\" means either the unmodified Program or a work based\non the Program.\n\nTo \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy. Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\nTo \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies. Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\nAn interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License. If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n### 1. Source Code.\n\nThe \"source code\" for a work means the preferred form of the work\nfor making modifications to it. \"Object code\" means any non-source\nform of a work.\n\nA \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\nThe \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form. A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\nThe \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities. However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work. For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\nThe Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\nThe Corresponding Source for a work in source code form is that\nsame work.\n\n### 2. Basic Permissions.\n\nAll rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met. This License explicitly affirms your unlimited\npermission to run the unmodified Program. The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work. This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\nYou may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force. You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright. Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\nConveying under any other circumstances is permitted solely under\nthe conditions stated below. Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n### 3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\nNo covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\nWhen you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n### 4. Conveying Verbatim Copies.\n\nYou may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\nYou may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n### 5. Conveying Modified Source Versions.\n\nYou may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n- a) The work must carry prominent notices stating that you modified\n it, and giving a relevant date.\n- b) The work must carry prominent notices stating that it is\n released under this License and any conditions added under section\n 7. This requirement modifies the requirement in section 4 to\n \"keep intact all notices\".\n- c) You must license the entire work, as a whole, under this\n License to anyone who comes into possession of a copy. This\n License will therefore apply, along with any applicable section 7\n additional terms, to the whole of the work, and all its parts,\n regardless of how they are packaged. This License gives no\n permission to license the work in any other way, but it does not\n invalidate such permission if you have separately received it.\n- d) If the work has interactive user interfaces, each must display\n Appropriate Legal Notices; however, if the Program has interactive\n interfaces that do not display Appropriate Legal Notices, your\n work need not make them do so.\n\nA compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit. Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n### 6. Conveying Non-Source Forms.\n\n You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n- a) Convey the object code in, or embodied in, a physical product\n (including a physical distribution medium), accompanied by the\n Corresponding Source fixed on a durable physical medium\n customarily used for software interchange.\n- b) Convey the object code in, or embodied in, a physical product\n (including a physical distribution medium), accompanied by a\n written offer, valid for at least three years and valid for as\n long as you offer spare parts or customer support for that product\n model, to give anyone who possesses the object code either (1) a\n copy of the Corresponding Source for all the software in the\n product that is covered by this License, on a durable physical\n medium customarily used for software interchange, for a price no\n more than your reasonable cost of physically performing this\n conveying of source, or (2) access to copy the\n Corresponding Source from a network server at no charge.\n- c) Convey individual copies of the object code with a copy of the\n written offer to provide the Corresponding Source. This\n alternative is allowed only occasionally and noncommercially, and\n only if you received the object code with such an offer, in accord\n with subsection 6b.\n- d) Convey the object code by offering access from a designated\n place (gratis or for a charge), and offer equivalent access to the\n Corresponding Source in the same way through the same place at no\n further charge. You need not require recipients to copy the\n Corresponding Source along with the object code. If the place to\n copy the object code is a network server, the Corresponding Source\n may be on a different server (operated by you or a third party)\n that supports equivalent copying facilities, provided you maintain\n clear directions next to the object code saying where to find the\n Corresponding Source. Regardless of what server hosts the\n Corresponding Source, you remain obligated to ensure that it is\n available for as long as needed to satisfy these requirements.\n- e) Convey the object code using peer-to-peer transmission, provided\n you inform other peers where the object code and Corresponding\n Source of the work are being offered to the general public at no\n charge under subsection 6d.\n\nA separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\nA \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling. In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage. For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product. A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n\"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source. The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\nIf you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information. But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\nThe requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed. Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\nCorresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n### 7. Additional Terms.\n\n\"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law. If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\nWhen you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit. (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.) You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\nNotwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n- a) Disclaiming warranty or limiting liability differently from the\n terms of sections 15 and 16 of this License; or\n- b) Requiring preservation of specified reasonable legal notices or\n author attributions in that material or in the Appropriate Legal\n Notices displayed by works containing it; or\n- c) Prohibiting misrepresentation of the origin of that material, or\n requiring that modified versions of such material be marked in\n reasonable ways as different from the original version; or\n- d) Limiting the use for publicity purposes of names of licensors or\n authors of the material; or\n- e) Declining to grant rights under trademark law for use of some\n trade names, trademarks, or service marks; or\n- f) Requiring indemnification of licensors and authors of that\n material by anyone who conveys the material (or modified versions of\n it) with contractual assumptions of liability to the recipient, for\n any liability that these contractual assumptions directly impose on\n those licensors and authors; or\n- g) Requiring strong attribution such as notices on any user interfaces\n that run or convey any covered work, such as a prominent link to a URL\n on the header of a website, such that all users of the covered work may\n become aware of the notice, for a period no longer than 20 years.\n\nAll other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10. If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term. If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\nIf you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\nAdditional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n### 8. Termination.\n\nYou may not propagate or modify a covered work except as expressly\nprovided under this License. Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\nHowever, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\nMoreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\nTermination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License. If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n### 9. Acceptance Not Required for Having Copies.\n\nYou are not required to accept this License in order to receive or\nrun a copy of the Program. Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance. However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work. These actions infringe copyright if you do\nnot accept this License. Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n### 10. Automatic Licensing of Downstream Recipients.\n\nEach time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License. You are not responsible\nfor enforcing compliance by third parties with this License.\n\nAn \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations. If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\nYou may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License. For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n### 11. Patents.\n\nA \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based. The\nwork thus licensed is called the contributor's \"contributor version\".\n\nA contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version. For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\nEach contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\nIn the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement). To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\nIf you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients. \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\nIf, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\nA patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License. You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\nNothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n### 12. No Surrender of Others' Freedom.\n\nIf conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License. If you cannot convey a\ncovered work so as to simultaneously satisfy your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all. For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n### 13. Remote Network Interaction; Use with the GNU General Public License.\n\nNotwithstanding any other provision of this License, if you modify the\nProgram, your modified version must prominently offer all users\ninteracting with it remotely through a computer network (if your version\nsupports such interaction) an opportunity to receive the Corresponding\nSource of your version by providing access to the Corresponding Source\nfrom a network server at no charge, through some standard or customary\nmeans of facilitating copying of software. This Corresponding Source\nshall include the Corresponding Source for any work covered by version 3\nof the GNU General Public License that is incorporated pursuant to the\nfollowing paragraph.\n\nNotwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU General Public License into a single\ncombined work, and to convey the resulting work. The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the work with which it is combined will remain governed by version\n3 of the GNU General Public License.\n\n### 14. Revised Versions of this License.\n\nNewTendermint LLC may publish revised and/or new versions of\nthe GNO Network General Public License from time to time. Such new versions\nwill be similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\nEach version is given a distinguishing version number. If the\nProgram specifies that a certain numbered version of the GNO Network General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Gno Software\nFoundation. If the Program does not specify a version number of the\nGNO Network General Public License, you may choose any version ever published\nby NewTendermint LLC.\n\nIf the Program specifies that a proxy can decide which future\nversions of the GNO Network General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\nLater license versions may give you additional or different\npermissions. However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n### 15. Disclaimer of Warranty.\n\nTHERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n### 16. Limitation of Liability.\n\nIN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n### 17. Interpretation of Sections 15 and 16.\n\nIf the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\nEND OF TERMS AND CONDITIONS\n\n## How to Apply These Terms to Your New Programs\n\nIf you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\nTo do so, attach the following notices to the program. It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n \u003cone line to give the program's name and a brief idea of what it does.\u003e\n Copyright (C) \u003cyear\u003e \u003cname of author\u003e\n\n This program is free software: you can redistribute it and/or modify\n it under the terms of the GNO Network General Public License as published by\n NewTendermint LLC, either version 4 of the License, or\n (at your option) any later version.\n\n This program is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n GNO Network General Public License for more details.\n\n You should have received a copy of the GNO Network General Public License\n along with this program. If not, see \u003chttps://gno.land/license\u003e.\n\nAlso add information on how to contact you by electronic and paper mail.\n\nIf your software can interact with users remotely through a computer\nnetwork, you should also make sure that it provides a way for users to\nget its source. For example, if your program is a web application, its\ninterface could display a \"Source\" link that leads users to an archive\nof the code. There are many ways you could offer source, and different\nsolutions will be better for different programs; see section 13 for the\nspecific requirements.\n`\n\t)\n\t_ = b.NewPost(\"\", path, title, body, \"2024-04-22T00:00:00Z\", nil, nil)\n}\n"},{"name":"page_partners.gno","body":"package gnopages\n\nfunc init() {\n\tpath := \"partners\"\n\ttitle := \"Partnerships\"\n\tbody := `### Fund and Grants Program\n\nAre you a builder, tinkerer, or researcher? If you’re looking to create awesome dApps, tooling, infrastructure, \nor smart contract libraries on gno.land, you can apply for a grant. The gno.land Ecosystem Fund and Grants program \nprovides financial contributions for individuals and teams to innovate on the platform.\n\nRead more about our Funds and Grants program [here](https://github.com/gnolang/ecosystem-fund-grants).\n`\n\t_ = b.NewPost(\"\", path, title, body, \"2022-05-20T13:17:27Z\", nil, nil)\n}\n"},{"name":"page_start.gno","body":"package gnopages\n\nfunc init() {\n\tpath := \"start\"\n\ttitle := \"Getting Started with Gno\"\n\t// XXX: description := \"\"\n\n\t// TODO: codegen to use README files here\n\n\t/* TODO: port previous message: This is a demo of Gno smart contract programming. This document was\n\tconstructed by Gno onto a smart contract hosted on the data Realm\n\tname [\"gno.land/r/demo/boards\"](https://gno.land/r/demo/boards/)\n\t([github](https://github.com/gnolang/gno/tree/master/examples/gno.land/r/demo/boards)).\n\t*/\n\tbody := `## Getting Started with Gno\n\n- [Install Gno Key](/r/demo/boards:testboard/5)\n- TODO: add more links\n`\n\t_ = b.NewPost(\"\", path, title, body, \"2022-05-20T13:17:28Z\", nil, nil)\n}\n"},{"name":"page_testnets.gno","body":"package gnopages\n\nfunc init() {\n\tpath := \"testnets\"\n\ttitle := \"Gno.land Testnet List\"\n\tbody := `\n- [Portal Loop](https://docs.gno.land/concepts/portal-loop) - a rolling testnet \n- [staging.gno.land](https://staging.gno.land) - wiped every commit to monorepo master\n- test4.gno.land (upcoming)\n- _[test3.gno.land](https://test3.gno.land) (latest)_\n- _[test2.gno.land](https://test2.gno.land) (archive)_\n- _[test1.gno.land](https://test1.gno.land) (archive)_\n\nFor a list of RPC endpoints, see the [reference documentation](https://docs.gno.land/reference/rpc-endpoints).\n\n## Local development\n\nSee the \"Getting started\" section in the [official documentation](https://docs.gno.land/getting-started/local-setup).\n`\n\t_ = b.NewPost(\"\", path, title, body, \"2022-05-20T13:17:29Z\", nil, nil)\n}\n"},{"name":"page_tokenomics.gno","body":"package gnopages\n\nfunc init() {\n\tvar (\n\t\tpath = \"tokenomics\"\n\t\ttitle = \"Gno.land Tokenomics\"\n\t\t// XXX: description = \"\"\"\n\t\tbody = `Lorem Ipsum`\n\t)\n\t_ = b.NewPost(\"\", path, title, body, \"2022-05-20T13:17:30Z\", nil, nil)\n}\n"},{"name":"pages.gno","body":"package gnopages\n\nimport (\n\t\"gno.land/p/demo/blog\"\n)\n\n// TODO: switch from p/blog to p/pages\n\nvar b = \u0026blog.Blog{\n\tTitle: \"Gnoland's Pages\",\n\tPrefix: \"/r/gnoland/pages:\",\n\tNoBreadcrumb: true,\n}\n\nfunc Render(path string) string {\n\treturn b.Render(path)\n}\n"},{"name":"pages_test.gno","body":"package gnopages\n\nimport (\n\t\"strings\"\n\t\"testing\"\n)\n\nfunc TestHome(t *testing.T) {\n\tprintedOnce := false\n\tgot := Render(\"\")\n\texpectedSubtrings := []string{\n\t\t\"/r/gnoland/pages:p/tokenomics\",\n\t\t\"/r/gnoland/pages:p/start\",\n\t\t\"/r/gnoland/pages:p/contribute\",\n\t\t\"/r/gnoland/pages:p/about\",\n\t\t\"/r/gnoland/pages:p/gnolang\",\n\t}\n\tfor _, substring := range expectedSubtrings {\n\t\tif !strings.Contains(got, substring) {\n\t\t\tif !printedOnce {\n\t\t\t\tprintln(got)\n\t\t\t\tprintedOnce = true\n\t\t\t}\n\t\t\tt.Errorf(\"expected %q, but not found.\", substring)\n\t\t}\n\t}\n}\n\nfunc TestAbout(t *testing.T) {\n\tprintedOnce := false\n\tgot := Render(\"p/about\")\n\texpectedSubtrings := []string{\n\t\t\"Gno.land Is A Platform To Write Smart Contracts In Gno\",\n\t\t\"Gno.land is a next-generation smart contract platform using Gno, an interpreted version of the general-purpose Go\\nprogramming language.\",\n\t}\n\tfor _, substring := range expectedSubtrings {\n\t\tif !strings.Contains(got, substring) {\n\t\t\tif !printedOnce {\n\t\t\t\tprintln(got)\n\t\t\t\tprintedOnce = true\n\t\t\t}\n\t\t\tt.Errorf(\"expected %q, but not found.\", substring)\n\t\t}\n\t}\n}\n"},{"name":"util.gno","body":"package gnopages\n\nfunc checkErr(err error) {\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} {"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"govdao","path":"gno.land/r/gov/dao","files":[{"name":"dao.gno","body":"package govdao\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\n\t\"gno.land/p/demo/ufmt\"\n\tpproposal \"gno.land/p/gov/proposal\"\n)\n\nvar (\n\tproposals = make([]*proposal, 0)\n\tmembers = make([]std.Address, 0) // XXX: these should be pointers to avoid data duplication. Not possible due to VM bugs\n)\n\nconst (\n\tmsgMissingExecutor = \"missing proposal executor\"\n\tmsgPropExecuted = \"prop already executed\"\n\tmsgPropExpired = \"prop is expired\"\n\tmsgPropInactive = \"prop is not active anymore\"\n\tmsgPropActive = \"prop is still active\"\n\tmsgPropNotAccepted = \"prop is not accepted\"\n\n\tmsgCallerNotAMember = \"caller is not member of govdao\"\n\tmsgProposalNotFound = \"proposal not found\"\n)\n\ntype proposal struct {\n\tauthor std.Address\n\tcomment string\n\texecutor pproposal.Executor\n\tvoter Voter\n\texecuted bool\n\tvoters []std.Address // XXX: these should be pointers to avoid data duplication. Not possible due to VM bugs.\n}\n\nfunc (p proposal) Status() Status {\n\tif p.executor.IsExpired() {\n\t\treturn Expired\n\t}\n\n\tif p.executor.IsDone() {\n\t\treturn Succeeded\n\t}\n\n\tif !p.voter.IsFinished(members) {\n\t\treturn Active\n\t}\n\n\tif p.voter.IsAccepted(members) {\n\t\treturn Accepted\n\t}\n\n\treturn NotAccepted\n}\n\n// Propose is designed to be called by another contract or with\n// `maketx run`, not by a `maketx call`.\nfunc Propose(comment string, executor pproposal.Executor) int {\n\t// XXX: require payment?\n\tif executor == nil {\n\t\tpanic(msgMissingExecutor)\n\t}\n\tcaller := std.GetOrigCaller() // XXX: CHANGE THIS WHEN MSGRUN PERSIST CODE ESCAPING THE main() SCOPE! IT IS UNSAFE!\n\tAssertIsMember(caller)\n\n\tprop := \u0026proposal{\n\t\tcomment: comment,\n\t\texecutor: executor,\n\t\tauthor: caller,\n\t\tvoter: NewPercentageVoter(66), // at least 2/3 must say yes\n\t}\n\n\tproposals = append(proposals, prop)\n\n\treturn len(proposals) - 1\n}\n\nfunc VoteOnProposal(idx int, option string) {\n\tassertProposalExists(idx)\n\tcaller := std.GetOrigCaller() // XXX: CHANGE THIS WHEN MSGRUN PERSIST CODE ESCAPING THE main() SCOPE! IT IS UNSAFE!\n\tAssertIsMember(caller)\n\n\tprop := getProposal(idx)\n\n\tif prop.executed {\n\t\tpanic(msgPropExecuted)\n\t}\n\n\tif prop.executor.IsExpired() {\n\t\tpanic(msgPropExpired)\n\t}\n\n\tif prop.voter.IsFinished(members) {\n\t\tpanic(msgPropInactive)\n\t}\n\n\tprop.voter.Vote(members, caller, option)\n}\n\nfunc ExecuteProposal(idx int) {\n\tassertProposalExists(idx)\n\tprop := getProposal(idx)\n\n\tif prop.executed {\n\t\tpanic(msgPropExecuted)\n\t}\n\n\tif prop.executor.IsExpired() {\n\t\tpanic(msgPropExpired)\n\t}\n\n\tif !prop.voter.IsFinished(members) {\n\t\tpanic(msgPropActive)\n\t}\n\n\tif !prop.voter.IsAccepted(members) {\n\t\tpanic(msgPropNotAccepted)\n\t}\n\n\tprop.executor.Execute()\n\tprop.voters = members\n\tprop.executed = true\n}\n\nfunc IsMember(addr std.Address) bool {\n\tif len(members) == 0 { // special case for initial execution\n\t\treturn true\n\t}\n\n\tfor _, v := range members {\n\t\tif v == addr {\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n\nfunc AssertIsMember(addr std.Address) {\n\tif !IsMember(addr) {\n\t\tpanic(msgCallerNotAMember)\n\t}\n}\n\nfunc Render(path string) string {\n\tif path == \"\" {\n\t\tif len(proposals) == 0 {\n\t\t\treturn \"No proposals found :(\" // corner case\n\t\t}\n\n\t\toutput := \"\"\n\t\tfor idx, prop := range proposals {\n\t\t\toutput += ufmt.Sprintf(\"- [%d](/r/gov/dao:%d) - %s (**%s**)(by %s)\\n\", idx, idx, prop.comment, string(prop.Status()), prop.author)\n\t\t}\n\n\t\treturn output\n\t}\n\n\t// else display the proposal\n\tidx, err := strconv.Atoi(path)\n\tif err != nil {\n\t\treturn \"404\"\n\t}\n\n\tif !proposalExists(idx) {\n\t\treturn \"404\"\n\t}\n\tprop := getProposal(idx)\n\n\tvs := members\n\tif prop.executed {\n\t\tvs = prop.voters\n\t}\n\n\toutput := \"\"\n\toutput += ufmt.Sprintf(\"# Prop #%d\", idx)\n\toutput += \"\\n\\n\"\n\toutput += prop.comment\n\toutput += \"\\n\\n\"\n\toutput += ufmt.Sprintf(\"Status: %s\", string(prop.Status()))\n\toutput += \"\\n\\n\"\n\toutput += ufmt.Sprintf(\"Voting status: %s\", prop.voter.Status(vs))\n\toutput += \"\\n\\n\"\n\toutput += ufmt.Sprintf(\"Author: %s\", string(prop.author))\n\toutput += \"\\n\\n\"\n\n\treturn output\n}\n\nfunc getProposal(idx int) *proposal {\n\tif idx \u003e len(proposals)-1 {\n\t\tpanic(msgProposalNotFound)\n\t}\n\n\treturn proposals[idx]\n}\n\nfunc proposalExists(idx int) bool {\n\treturn idx \u003e= 0 \u0026\u0026 idx \u003c= len(proposals)\n}\n\nfunc assertProposalExists(idx int) {\n\tif !proposalExists(idx) {\n\t\tpanic(\"invalid proposal id\")\n\t}\n}\n"},{"name":"dao_test.gno","body":"package govdao\n\nimport (\n\t\"std\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/p/demo/urequire\"\n\tpproposal \"gno.land/p/gov/proposal\"\n)\n\nfunc TestPackage(t *testing.T) {\n\tu1 := testutils.TestAddress(\"u1\")\n\tu2 := testutils.TestAddress(\"u2\")\n\tu3 := testutils.TestAddress(\"u3\")\n\n\tmembers = append(members, u1)\n\tmembers = append(members, u2)\n\tmembers = append(members, u3)\n\n\tnu1 := testutils.TestAddress(\"random1\")\n\n\tout := Render(\"\")\n\n\texpected := \"No proposals found :(\"\n\turequire.Equal(t, expected, out)\n\n\tvar called bool\n\tex := pproposal.NewExecutor(func() error {\n\t\tcalled = true\n\t\treturn nil\n\t})\n\n\tstd.TestSetOrigCaller(u1)\n\tpid := Propose(\"dummy proposal\", ex)\n\n\t// try to vote not being a member\n\tstd.TestSetOrigCaller(nu1)\n\n\turequire.PanicsWithMessage(t, msgCallerNotAMember, func() {\n\t\tVoteOnProposal(pid, \"YES\")\n\t})\n\n\t// try to vote several times\n\tstd.TestSetOrigCaller(u1)\n\turequire.NotPanics(t, func() {\n\t\tVoteOnProposal(pid, \"YES\")\n\t})\n\turequire.PanicsWithMessage(t, msgAlreadyVoted, func() {\n\t\tVoteOnProposal(pid, \"YES\")\n\t})\n\n\tout = Render(\"0\")\n\texpected = `# Prop #0\n\ndummy proposal\n\nStatus: active\n\nVoting status: YES: 1, NO: 0, percent: 33, members: 3\n\nAuthor: g1w5c47h6lta047h6lta047h6lta047h6ly5kscr\n\n`\n\n\turequire.Equal(t, expected, out)\n\n\tstd.TestSetOrigCaller(u2)\n\turequire.PanicsWithMessage(t, msgWrongVotingValue, func() {\n\t\tVoteOnProposal(pid, \"INCORRECT\")\n\t})\n\turequire.NotPanics(t, func() {\n\t\tVoteOnProposal(pid, \"NO\")\n\t})\n\n\tout = Render(\"0\")\n\texpected = `# Prop #0\n\ndummy proposal\n\nStatus: active\n\nVoting status: YES: 1, NO: 1, percent: 33, members: 3\n\nAuthor: g1w5c47h6lta047h6lta047h6lta047h6ly5kscr\n\n`\n\n\turequire.Equal(t, expected, out)\n\n\tstd.TestSetOrigCaller(u3)\n\turequire.NotPanics(t, func() {\n\t\tVoteOnProposal(pid, \"YES\")\n\t})\n\n\tout = Render(\"0\")\n\texpected = `# Prop #0\n\ndummy proposal\n\nStatus: accepted\n\nVoting status: YES: 2, NO: 1, percent: 66, members: 3\n\nAuthor: g1w5c47h6lta047h6lta047h6lta047h6ly5kscr\n\n`\n\n\turequire.Equal(t, expected, out)\n\n\t// Add a new member, so non-executed proposals will change the voting status\n\tu4 := testutils.TestAddress(\"u4\")\n\tmembers = append(members, u4)\n\n\tout = Render(\"0\")\n\texpected = `# Prop #0\n\ndummy proposal\n\nStatus: active\n\nVoting status: YES: 2, NO: 1, percent: 50, members: 4\n\nAuthor: g1w5c47h6lta047h6lta047h6lta047h6ly5kscr\n\n`\n\n\turequire.Equal(t, expected, out)\n\n\tstd.TestSetOrigCaller(u4)\n\turequire.NotPanics(t, func() {\n\t\tVoteOnProposal(pid, \"YES\")\n\t})\n\n\tout = Render(\"0\")\n\texpected = `# Prop #0\n\ndummy proposal\n\nStatus: accepted\n\nVoting status: YES: 3, NO: 1, percent: 75, members: 4\n\nAuthor: g1w5c47h6lta047h6lta047h6lta047h6ly5kscr\n\n`\n\n\turequire.Equal(t, expected, out)\n\n\tExecuteProposal(pid)\n\turequire.True(t, called)\n\n\tout = Render(\"0\")\n\texpected = `# Prop #0\n\ndummy proposal\n\nStatus: succeeded\n\nVoting status: YES: 3, NO: 1, percent: 75, members: 4\n\nAuthor: g1w5c47h6lta047h6lta047h6lta047h6ly5kscr\n\n`\n\n\turequire.Equal(t, expected, out)\n\n\t// Add a new member and try to vote an already executed proposal\n\tu5 := testutils.TestAddress(\"u5\")\n\tmembers = append(members, u5)\n\tstd.TestSetOrigCaller(u5)\n\turequire.PanicsWithMessage(t, msgPropExecuted, func() {\n\t\tExecuteProposal(pid)\n\t})\n\n\t// even if we added a new member the executed proposal is showing correctly the members that voted on it\n\tout = Render(\"0\")\n\texpected = `# Prop #0\n\ndummy proposal\n\nStatus: succeeded\n\nVoting status: YES: 3, NO: 1, percent: 75, members: 4\n\nAuthor: g1w5c47h6lta047h6lta047h6lta047h6ly5kscr\n\n`\n\n\turequire.Equal(t, expected, out)\n\n}\n"},{"name":"memberset.gno","body":"package govdao\n\nimport (\n\t\"std\"\n\n\tpproposal \"gno.land/p/gov/proposal\"\n)\n\nconst daoPkgPath = \"gno.land/r/gov/dao\"\n\nconst (\n\terrNoChangesProposed = \"no set changes proposed\"\n\terrNotGovDAO = \"caller not govdao executor\"\n)\n\nfunc NewPropExecutor(changesFn func() []std.Address) pproposal.Executor {\n\tif changesFn == nil {\n\t\tpanic(errNoChangesProposed)\n\t}\n\n\tcallback := func() error {\n\t\t// Make sure the GovDAO executor runs the valset changes\n\t\tassertGovDAOCaller()\n\n\t\tfor _, addr := range changesFn() {\n\t\t\tmembers = append(members, addr)\n\t\t}\n\n\t\treturn nil\n\t}\n\n\treturn pproposal.NewExecutor(callback)\n}\n\n// assertGovDAOCaller verifies the caller is the GovDAO executor\nfunc assertGovDAOCaller() {\n\tif std.CurrentRealm().PkgPath() != daoPkgPath {\n\t\tpanic(errNotGovDAO)\n\t}\n}\n"},{"name":"prop1_filetest.gno","body":"// Please note that this package is intended for demonstration purposes only.\n// You could execute this code (the init part) by running a `maketx run` command\n// or by uploading a similar package to a personal namespace.\n//\n// For the specific case of validators, a `r/gnoland/valopers` will be used to\n// organize the lifecycle of validators (register, etc), and this more complex\n// contract will be responsible to generate proposals.\npackage main\n\nimport (\n\t\"std\"\n\n\tpVals \"gno.land/p/sys/validators\"\n\tgovdao \"gno.land/r/gov/dao\"\n\t\"gno.land/r/sys/validators\"\n)\n\nconst daoPkgPath = \"gno.land/r/gov/dao\"\n\nfunc init() {\n\tmembersFn := func() []std.Address {\n\t\treturn []std.Address{\n\t\t\tstd.Address(\"g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm\"),\n\t\t}\n\t}\n\n\tmExec := govdao.NewPropExecutor(membersFn)\n\n\tcomment := \"adding someone to vote\"\n\tid := govdao.Propose(comment, mExec)\n\tgovdao.ExecuteProposal(id)\n\n\tchangesFn := func() []pVals.Validator {\n\t\treturn []pVals.Validator{\n\t\t\t{\n\t\t\t\tAddress: std.Address(\"g12345678\"),\n\t\t\t\tPubKey: \"pubkey\",\n\t\t\t\tVotingPower: 10, // add a new validator\n\t\t\t},\n\t\t\t{\n\t\t\t\tAddress: std.Address(\"g000000000\"),\n\t\t\t\tPubKey: \"pubkey\",\n\t\t\t\tVotingPower: 10, // add a new validator\n\t\t\t},\n\t\t\t{\n\t\t\t\tAddress: std.Address(\"g000000000\"),\n\t\t\t\tPubKey: \"pubkey\",\n\t\t\t\tVotingPower: 0, // remove an existing validator\n\t\t\t},\n\t\t}\n\t}\n\n\t// Wraps changesFn to emit a certified event only if executed from a\n\t// complete governance proposal process.\n\texecutor := validators.NewPropExecutor(changesFn)\n\n\t// Create a proposal.\n\t// XXX: payment\n\tcomment = \"manual valset changes proposal example\"\n\tgovdao.Propose(comment, executor)\n}\n\nfunc main() {\n\tprintln(\"--\")\n\tprintln(govdao.Render(\"\"))\n\tprintln(\"--\")\n\tprintln(govdao.Render(\"1\"))\n\tprintln(\"--\")\n\tgovdao.VoteOnProposal(1, \"YES\")\n\tprintln(\"--\")\n\tprintln(govdao.Render(\"1\"))\n\tprintln(\"--\")\n\tprintln(validators.Render(\"\"))\n\tprintln(\"--\")\n\tgovdao.ExecuteProposal(1)\n\tprintln(\"--\")\n\tprintln(govdao.Render(\"1\"))\n\tprintln(\"--\")\n\tprintln(validators.Render(\"\"))\n}\n\n// Output:\n// --\n// - [0](/r/gov/dao:0) - adding someone to vote (**succeeded**)(by g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm)\n// - [1](/r/gov/dao:1) - manual valset changes proposal example (**active**)(by g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm)\n//\n// --\n// # Prop #1\n//\n// manual valset changes proposal example\n//\n// Status: active\n//\n// Voting status: YES: 0, NO: 0, percent: 0, members: 1\n//\n// Author: g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm\n//\n//\n// --\n// --\n// # Prop #1\n//\n// manual valset changes proposal example\n//\n// Status: accepted\n//\n// Voting status: YES: 1, NO: 0, percent: 100, members: 1\n//\n// Author: g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm\n//\n//\n// --\n// No valset changes to apply.\n// --\n// --\n// # Prop #1\n//\n// manual valset changes proposal example\n//\n// Status: succeeded\n//\n// Voting status: YES: 1, NO: 0, percent: 100, members: 1\n//\n// Author: g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm\n//\n//\n// --\n// Valset changes:\n// - #123: g12345678 (10)\n// - #123: g000000000 (10)\n// - #123: g000000000 (0)\n"},{"name":"prop2_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\t\"time\"\n\n\t\"gno.land/p/demo/context\"\n\t\"gno.land/p/gov/proposal\"\n\tgnoblog \"gno.land/r/gnoland/blog\"\n\tgovdao \"gno.land/r/gov/dao\"\n)\n\nfunc init() {\n\tmembersFn := func() []std.Address {\n\t\treturn []std.Address{\n\t\t\tstd.Address(\"g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm\"),\n\t\t}\n\t}\n\n\tmExec := govdao.NewPropExecutor(membersFn)\n\n\tcomment := \"adding someone to vote\"\n\n\tid := govdao.Propose(comment, mExec)\n\n\tgovdao.ExecuteProposal(id)\n\n\texecutor := proposal.NewCtxExecutor(func(ctx context.Context) error {\n\t\tgnoblog.DaoAddPost(\n\t\t\tctx,\n\t\t\t\"hello-from-govdao\", // slug\n\t\t\t\"Hello from GovDAO!\", // title\n\t\t\t\"This post was published by a GovDAO proposal.\", // body\n\t\t\ttime.Now().Format(time.RFC3339), // publidation date\n\t\t\t\"moul\", // authors\n\t\t\t\"govdao,example\", // tags\n\t\t)\n\t\treturn nil\n\t})\n\n\t// Create a proposal.\n\t// XXX: payment\n\tcomment = \"post a new blogpost about govdao\"\n\tgovdao.Propose(comment, executor)\n}\n\nfunc main() {\n\tprintln(\"--\")\n\tprintln(govdao.Render(\"\"))\n\tprintln(\"--\")\n\tprintln(govdao.Render(\"1\"))\n\tprintln(\"--\")\n\tgovdao.VoteOnProposal(1, \"YES\")\n\tprintln(\"--\")\n\tprintln(govdao.Render(\"1\"))\n\tprintln(\"--\")\n\tprintln(gnoblog.Render(\"\"))\n\tprintln(\"--\")\n\tgovdao.ExecuteProposal(1)\n\tprintln(\"--\")\n\tprintln(govdao.Render(\"1\"))\n\tprintln(\"--\")\n\tprintln(gnoblog.Render(\"\"))\n}\n\n// Output:\n// --\n// - [0](/r/gov/dao:0) - adding someone to vote (**succeeded**)(by g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm)\n// - [1](/r/gov/dao:1) - post a new blogpost about govdao (**active**)(by g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm)\n//\n// --\n// # Prop #1\n//\n// post a new blogpost about govdao\n//\n// Status: active\n//\n// Voting status: YES: 0, NO: 0, percent: 0, members: 1\n//\n// Author: g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm\n//\n//\n// --\n// --\n// # Prop #1\n//\n// post a new blogpost about govdao\n//\n// Status: accepted\n//\n// Voting status: YES: 1, NO: 0, percent: 100, members: 1\n//\n// Author: g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm\n//\n//\n// --\n// # Gnoland's Blog\n//\n// No posts.\n// --\n// --\n// # Prop #1\n//\n// post a new blogpost about govdao\n//\n// Status: succeeded\n//\n// Voting status: YES: 1, NO: 0, percent: 100, members: 1\n//\n// Author: g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm\n//\n//\n// --\n// # Gnoland's Blog\n//\n// \u003cdiv class='columns-3'\u003e\u003cdiv\u003e\n//\n// ### [Hello from GovDAO!](/r/gnoland/blog:p/hello-from-govdao)\n// 13 Feb 2009\n// \u003c/div\u003e\u003c/div\u003e\n"},{"name":"types.gno","body":"package govdao\n\nimport (\n\t\"std\"\n)\n\n// Status enum.\ntype Status string\n\nvar (\n\tAccepted Status = \"accepted\"\n\tActive Status = \"active\"\n\tNotAccepted Status = \"not accepted\"\n\tExpired Status = \"expired\"\n\tSucceeded Status = \"succeeded\"\n)\n\n// Voter defines the needed methods for a voting system\ntype Voter interface {\n\n\t// IsAccepted indicates if the voting process had been accepted\n\tIsAccepted(voters []std.Address) bool\n\n\t// IsFinished indicates if the voting process is finished\n\tIsFinished(voters []std.Address) bool\n\n\t// Vote adds a new vote to the voting system\n\tVote(voters []std.Address, caller std.Address, flag string)\n\n\t// Status returns a human friendly string describing how the voting process is going\n\tStatus(voters []std.Address) string\n}\n"},{"name":"voter.gno","body":"package govdao\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/ufmt\"\n)\n\nconst (\n\tyay = \"YES\"\n\tnay = \"NO\"\n\n\tmsgNoMoreVotesAllowed = \"no more votes allowed\"\n\tmsgAlreadyVoted = \"caller already voted\"\n\tmsgWrongVotingValue = \"voting values must be YES or NO\"\n)\n\nfunc NewPercentageVoter(percent int) *PercentageVoter {\n\tif percent \u003c 0 || percent \u003e 100 {\n\t\tpanic(\"percent value must be between 0 and 100\")\n\t}\n\n\treturn \u0026PercentageVoter{\n\t\tpercentage: percent,\n\t}\n}\n\n// PercentageVoter is a system based on the amount of received votes.\n// When the specified treshold is reached, the voting process finishes.\ntype PercentageVoter struct {\n\tpercentage int\n\n\tvoters []std.Address\n\tyes int\n\tno int\n}\n\nfunc (pv *PercentageVoter) IsAccepted(voters []std.Address) bool {\n\tif len(voters) == 0 {\n\t\treturn true // special case\n\t}\n\n\treturn pv.percent(voters) \u003e= pv.percentage\n}\n\nfunc (pv *PercentageVoter) IsFinished(voters []std.Address) bool {\n\treturn pv.yes+pv.no \u003e= len(voters)\n}\n\nfunc (pv *PercentageVoter) Status(voters []std.Address) string {\n\treturn ufmt.Sprintf(\"YES: %d, NO: %d, percent: %d, members: %d\", pv.yes, pv.no, pv.percent(voters), len(voters))\n}\n\nfunc (pv *PercentageVoter) Vote(voters []std.Address, caller std.Address, flag string) {\n\tif pv.IsFinished(voters) {\n\t\tpanic(msgNoMoreVotesAllowed)\n\t}\n\n\tif pv.alreadyVoted(caller) {\n\t\tpanic(msgAlreadyVoted)\n\t}\n\n\tswitch flag {\n\tcase yay:\n\t\tpv.yes++\n\t\tpv.voters = append(pv.voters, caller)\n\tcase nay:\n\t\tpv.no++\n\t\tpv.voters = append(pv.voters, caller)\n\tdefault:\n\t\tpanic(msgWrongVotingValue)\n\t}\n}\n\nfunc (pv *PercentageVoter) percent(voters []std.Address) int {\n\tif len(voters) == 0 {\n\t\treturn 0\n\t}\n\n\treturn int((float32(pv.yes) / float32(len(voters))) * 100)\n}\n\nfunc (pv *PercentageVoter) alreadyVoted(addr std.Address) bool {\n\tfor _, v := range pv.voters {\n\t\tif v == addr {\n\t\t\treturn true\n\t\t}\n\t}\n\n\treturn false\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} {"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"validators","path":"gno.land/r/sys/validators","files":[{"name":"doc.gno","body":"// Package validators implements the on-chain validator set management through Proof of Contribution.\n// The Realm exposes only a public executor for govdao proposals, that can suggest validator set changes.\npackage validators\n"},{"name":"gnosdk.gno","body":"package validators\n\nimport (\n\t\"gno.land/p/sys/validators\"\n)\n\n// GetChanges returns the validator changes stored on the realm, since the given block number.\n// This function is intended to be called by gno.land through the GnoSDK\nfunc GetChanges(from int64) []validators.Validator {\n\tvalsetChanges := make([]validators.Validator, 0)\n\n\t// Gather the changes from the specified block\n\tchanges.Iterate(getBlockID(from), \"\", func(_ string, value interface{}) bool {\n\t\tchs := value.([]change)\n\n\t\tfor _, ch := range chs {\n\t\t\tvalsetChanges = append(valsetChanges, ch.validator)\n\t\t}\n\n\t\treturn false\n\t})\n\n\treturn valsetChanges\n}\n"},{"name":"init.gno","body":"package validators\n\nimport (\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/nt/poa\"\n)\n\nfunc init() {\n\t// The default valset protocol is PoA\n\tvp = poa.NewPoA()\n\n\t// No changes to apply initially\n\tchanges = avl.NewTree()\n}\n"},{"name":"poc.gno","body":"package validators\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/gov/proposal\"\n\t\"gno.land/p/sys/validators\"\n)\n\nconst daoPkgPath = \"gno.land/r/gov/dao\"\n\nconst (\n\terrNoChangesProposed = \"no set changes proposed\"\n\terrNotGovDAO = \"caller not govdao executor\"\n)\n\n// NewPropExecutor creates a new executor that wraps a changes closure\n// proposal. This wrapper is required to ensure the GovDAO Realm actually\n// executed the callback.\n//\n// Concept adapted from:\n// https://github.com/gnolang/gno/pull/1945\nfunc NewPropExecutor(changesFn func() []validators.Validator) proposal.Executor {\n\tif changesFn == nil {\n\t\tpanic(errNoChangesProposed)\n\t}\n\n\tcallback := func() error {\n\t\t// Make sure the GovDAO executor runs the valset changes\n\t\tassertGovDAOCaller()\n\n\t\tfor _, change := range changesFn() {\n\t\t\tif change.VotingPower == 0 {\n\t\t\t\t// This change request is to remove the validator\n\t\t\t\tremoveValidator(change.Address)\n\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// This change request is to add the validator\n\t\t\taddValidator(change)\n\t\t}\n\n\t\treturn nil\n\t}\n\n\treturn proposal.NewExecutor(callback)\n}\n\n// assertGovDAOCaller verifies the caller is the GovDAO executor\nfunc assertGovDAOCaller() {\n\tif std.PrevRealm().PkgPath() != daoPkgPath {\n\t\tpanic(errNotGovDAO)\n\t}\n}\n\n// IsValidator returns a flag indicating if the given bech32 address\n// is part of the validator set\nfunc IsValidator(addr std.Address) bool {\n\treturn vp.IsValidator(addr)\n}\n\n// GetValidators returns the typed validator set\nfunc GetValidators() []validators.Validator {\n\treturn vp.GetValidators()\n}\n"},{"name":"validators.gno","body":"package validators\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/seqid\"\n\t\"gno.land/p/demo/ufmt\"\n\t\"gno.land/p/sys/validators\"\n)\n\nvar (\n\tvp validators.ValsetProtocol // p is the underlying validator set protocol\n\tchanges *avl.Tree // changes holds any valset changes; seqid(block number) -\u003e []change\n)\n\n// change represents a single valset change, tied to a specific block number\ntype change struct {\n\tblockNum int64 // the block number associated with the valset change\n\tvalidator validators.Validator // the validator update\n}\n\n// addValidator adds a new validator to the validator set.\n// If the validator is already present, the method errors out\nfunc addValidator(validator validators.Validator) {\n\tval, err := vp.AddValidator(validator.Address, validator.PubKey, validator.VotingPower)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\t// Validator added, note the change\n\tch := change{\n\t\tblockNum: std.GetHeight(),\n\t\tvalidator: val,\n\t}\n\n\tsaveChange(ch)\n\n\t// Emit the validator set change\n\tstd.Emit(validators.ValidatorAddedEvent)\n}\n\n// removeValidator removes the given validator from the set.\n// If the validator is not present in the set, the method errors out\nfunc removeValidator(address std.Address) {\n\tval, err := vp.RemoveValidator(address)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\n\t// Validator removed, note the change\n\tch := change{\n\t\tblockNum: std.GetHeight(),\n\t\tvalidator: validators.Validator{\n\t\t\tAddress: val.Address,\n\t\t\tPubKey: val.PubKey,\n\t\t\tVotingPower: 0, // nullified the voting power indicates removal\n\t\t},\n\t}\n\n\tsaveChange(ch)\n\n\t// Emit the validator set change\n\tstd.Emit(validators.ValidatorRemovedEvent)\n}\n\n// saveChange saves the valset change\nfunc saveChange(ch change) {\n\tid := getBlockID(ch.blockNum)\n\n\tsetRaw, exists := changes.Get(id)\n\tif !exists {\n\t\tchanges.Set(id, []change{ch})\n\n\t\treturn\n\t}\n\n\t// Save the change\n\tset := setRaw.([]change)\n\tset = append(set, ch)\n\n\tchanges.Set(id, set)\n}\n\n// getBlockID converts the block number to a sequential ID\nfunc getBlockID(blockNum int64) string {\n\treturn seqid.ID(uint64(blockNum)).String()\n}\n\nfunc Render(_ string) string {\n\tvar (\n\t\tsize = changes.Size()\n\t\tmaxDisplay = 10\n\t)\n\n\tif size == 0 {\n\t\treturn \"No valset changes to apply.\"\n\t}\n\n\toutput := \"Valset changes:\\n\"\n\tchanges.ReverseIterateByOffset(size-maxDisplay, maxDisplay, func(_ string, value interface{}) bool {\n\t\tchs := value.([]change)\n\n\t\tfor _, ch := range chs {\n\t\t\toutput += ufmt.Sprintf(\n\t\t\t\t\"- #%d: %s (%d)\\n\",\n\t\t\t\tch.blockNum,\n\t\t\t\tch.validator.Address.String(),\n\t\t\t\tch.validator.VotingPower,\n\t\t\t)\n\t\t}\n\n\t\treturn false\n\t})\n\n\treturn output\n}\n"},{"name":"validators_test.gno","body":"package validators\n\nimport (\n\t\"testing\"\n\n\t\"std\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/p/demo/uassert\"\n\t\"gno.land/p/demo/ufmt\"\n\t\"gno.land/p/sys/validators\"\n)\n\n// generateTestValidators generates a dummy validator set\nfunc generateTestValidators(count int) []validators.Validator {\n\tvals := make([]validators.Validator, 0, count)\n\n\tfor i := 0; i \u003c count; i++ {\n\t\tval := validators.Validator{\n\t\t\tAddress: testutils.TestAddress(ufmt.Sprintf(\"%d\", i)),\n\t\t\tPubKey: \"public-key\",\n\t\t\tVotingPower: 10,\n\t\t}\n\n\t\tvals = append(vals, val)\n\t}\n\n\treturn vals\n}\n\nfunc TestValidators_AddRemove(t *testing.T) {\n\t// Clear any changes\n\tchanges = avl.NewTree()\n\n\tvar (\n\t\tvals = generateTestValidators(100)\n\t\tinitialHeight = int64(123)\n\t)\n\n\t// Add in the validators\n\tfor _, val := range vals {\n\t\taddValidator(val)\n\n\t\t// Make sure the validator is added\n\t\tuassert.True(t, vp.IsValidator(val.Address))\n\n\t\tstd.TestSkipHeights(1)\n\t}\n\n\tfor i := initialHeight; i \u003c initialHeight+int64(len(vals)); i++ {\n\t\t// Make sure the changes are saved\n\t\tchs := GetChanges(i)\n\n\t\t// We use the funky index calculation to make sure\n\t\t// changes are properly handled for each block span\n\t\tuassert.Equal(t, initialHeight+int64(len(vals))-i, int64(len(chs)))\n\n\t\tfor index, val := range vals[i-initialHeight:] {\n\t\t\t// Make sure the changes are equal to the additions\n\t\t\tch := chs[index]\n\n\t\t\tuassert.Equal(t, val.Address, ch.Address)\n\t\t\tuassert.Equal(t, val.PubKey, ch.PubKey)\n\t\t\tuassert.Equal(t, val.VotingPower, ch.VotingPower)\n\t\t}\n\t}\n\n\t// Save the beginning height for the removal\n\tinitialRemoveHeight := std.GetHeight()\n\n\t// Clear any changes\n\tchanges = avl.NewTree()\n\n\t// Remove the validators\n\tfor _, val := range vals {\n\t\tremoveValidator(val.Address)\n\n\t\t// Make sure the validator is removed\n\t\tuassert.False(t, vp.IsValidator(val.Address))\n\n\t\tstd.TestSkipHeights(1)\n\t}\n\n\tfor i := initialRemoveHeight; i \u003c initialRemoveHeight+int64(len(vals)); i++ {\n\t\t// Make sure the changes are saved\n\t\tchs := GetChanges(i)\n\n\t\t// We use the funky index calculation to make sure\n\t\t// changes are properly handled for each block span\n\t\tuassert.Equal(t, initialRemoveHeight+int64(len(vals))-i, int64(len(chs)))\n\n\t\tfor index, val := range vals[i-initialRemoveHeight:] {\n\t\t\t// Make sure the changes are equal to the additions\n\t\t\tch := chs[index]\n\n\t\t\tuassert.Equal(t, val.Address, ch.Address)\n\t\t\tuassert.Equal(t, val.PubKey, ch.PubKey)\n\t\t\tuassert.Equal(t, uint64(0), ch.VotingPower)\n\t\t}\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} {"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"valopers","path":"gno.land/r/gnoland/valopers","files":[{"name":"init.gno","body":"package valopers\n\nimport \"gno.land/p/demo/avl\"\n\nfunc init() {\n\tvalopers = avl.NewTree()\n}\n"},{"name":"valopers.gno","body":"// Package valopers is designed around the permissionless lifecycle of valoper profiles.\n// It also includes parts designed for govdao to propose valset changes based on registered valopers.\npackage valopers\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/ufmt\"\n\tpVals \"gno.land/p/sys/validators\"\n\tgovdao \"gno.land/r/gov/dao\"\n\t\"gno.land/r/sys/validators\"\n)\n\nconst (\n\terrValoperExists = \"valoper already exists\"\n\terrValoperMissing = \"valoper does not exist\"\n\terrInvalidAddressUpdate = \"valoper updated address exists\"\n\terrValoperNotCaller = \"valoper is not the caller\"\n)\n\n// valopers keeps track of all the active validator operators\nvar valopers *avl.Tree // Address -\u003e Valoper\n\n// Valoper represents a validator operator profile\ntype Valoper struct {\n\tName string // the display name of the valoper\n\tDescription string // the description of the valoper\n\n\tAddress std.Address // The bech32 gno address of the validator\n\tPubKey string // the bech32 public key of the validator\n\tP2PAddresses []string // the publicly reachable P2P addresses of the validator\n\tActive bool // flag indicating if the valoper is active\n}\n\n// Register registers a new valoper\nfunc Register(v Valoper) {\n\t// Check if the valoper is already registered\n\tif isValoper(v.Address) {\n\t\tpanic(errValoperExists)\n\t}\n\n\t// TODO add address derivation from public key\n\t// (when the laws of gno make it possible)\n\n\t// Save the valoper to the set\n\tvalopers.Set(v.Address.String(), v)\n}\n\n// Update updates an existing valoper\nfunc Update(address std.Address, v Valoper) {\n\t// Check if the valoper is present\n\tif !isValoper(address) {\n\t\tpanic(errValoperMissing)\n\t}\n\n\t// Check that the valoper wouldn't be\n\t// overwriting an existing one\n\tisAddressUpdate := address != v.Address\n\tif isAddressUpdate \u0026\u0026 isValoper(v.Address) {\n\t\tpanic(errInvalidAddressUpdate)\n\t}\n\n\t// Remove the old valoper info\n\t// in case the address changed\n\tif address != v.Address {\n\t\tvalopers.Remove(address.String())\n\t}\n\n\t// Save the new valoper info\n\tvalopers.Set(v.Address.String(), v)\n}\n\n// GetByAddr fetches the valoper using the address, if present\nfunc GetByAddr(address std.Address) Valoper {\n\tvaloperRaw, exists := valopers.Get(address.String())\n\tif !exists {\n\t\tpanic(errValoperMissing)\n\t}\n\n\treturn valoperRaw.(Valoper)\n}\n\n// Render renders the current valoper set\nfunc Render(_ string) string {\n\tif valopers.Size() == 0 {\n\t\treturn \"No valopers to display.\"\n\t}\n\n\toutput := \"Valset changes to apply:\\n\"\n\tvalopers.Iterate(\"\", \"\", func(_ string, value interface{}) bool {\n\t\tvaloper := value.(Valoper)\n\n\t\toutput += valoper.Render()\n\n\t\treturn false\n\t})\n\n\treturn output\n}\n\n// Render renders a single valoper with their information\nfunc (v Valoper) Render() string {\n\toutput := ufmt.Sprintf(\"## %s\\n\", v.Name)\n\toutput += ufmt.Sprintf(\"%s\\n\\n\", v.Description)\n\toutput += ufmt.Sprintf(\"- Address: %s\\n\", v.Address.String())\n\toutput += ufmt.Sprintf(\"- PubKey: %s\\n\", v.PubKey)\n\toutput += \"- P2P Addresses: [\\n\"\n\n\tif len(v.P2PAddresses) == 0 {\n\t\toutput += \"]\\n\"\n\n\t\treturn output\n\t}\n\n\tfor index, addr := range v.P2PAddresses {\n\t\toutput += addr\n\n\t\tif index == len(v.P2PAddresses)-1 {\n\t\t\toutput += \"]\\n\"\n\n\t\t\tcontinue\n\t\t}\n\n\t\toutput += \",\\n\"\n\t}\n\n\treturn output\n}\n\n// isValoper checks if the valoper exists\nfunc isValoper(address std.Address) bool {\n\t_, exists := valopers.Get(address.String())\n\n\treturn exists\n}\n\n// GovDAOProposal creates a proposal to the GovDAO\n// for adding the given valoper to the validator set.\n// This function is meant to serve as a helper\n// for generating the govdao proposal\nfunc GovDAOProposal(address std.Address) {\n\tvar (\n\t\tvaloper = GetByAddr(address)\n\t\tvotingPower = uint64(1)\n\t)\n\n\t// Make sure the valoper is the caller\n\tif std.GetOrigCaller() != address {\n\t\tpanic(errValoperNotCaller)\n\t}\n\n\t// Determine the voting power\n\tif !valoper.Active {\n\t\tvotingPower = uint64(0)\n\t}\n\n\tchangesFn := func() []pVals.Validator {\n\t\treturn []pVals.Validator{\n\t\t\t{\n\t\t\t\tAddress: valoper.Address,\n\t\t\t\tPubKey: valoper.PubKey,\n\t\t\t\tVotingPower: votingPower,\n\t\t\t},\n\t\t}\n\t}\n\n\t// Create the executor\n\texecutor := validators.NewPropExecutor(changesFn)\n\n\t// Craft the proposal comment\n\tcomment := ufmt.Sprintf(\n\t\t\"Proposal to add valoper %s (Address: %s; PubKey: %s) to the valset\",\n\t\tvaloper.Name,\n\t\tvaloper.Address.String(),\n\t\tvaloper.PubKey,\n\t)\n\n\t// Create the govdao proposal\n\tgovdao.Propose(comment, executor)\n}\n"},{"name":"valopers_test.gno","body":"package valopers\n\nimport (\n\t\"testing\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/testutils\"\n\t\"gno.land/p/demo/uassert\"\n)\n\nfunc TestValopers_Register(t *testing.T) {\n\tt.Parallel()\n\n\tt.Run(\"already a valoper\", func(t *testing.T) {\n\t\tt.Parallel()\n\n\t\t// Clear the set for the test\n\t\tvalopers = avl.NewTree()\n\n\t\tv := Valoper{\n\t\t\tAddress: testutils.TestAddress(\"valoper\"),\n\t\t}\n\n\t\t// Add the valoper\n\t\tvalopers.Set(v.Address.String(), v)\n\n\t\tuassert.PanicsWithMessage(t, errValoperExists, func() {\n\t\t\tRegister(v)\n\t\t})\n\t})\n\n\tt.Run(\"successful registration\", func(t *testing.T) {\n\t\tt.Parallel()\n\n\t\t// Clear the set for the test\n\t\tvalopers = avl.NewTree()\n\n\t\tv := Valoper{\n\t\t\tAddress: testutils.TestAddress(\"valoper\"),\n\t\t\tName: \"new valoper\",\n\t\t\tPubKey: \"pub key\",\n\t\t}\n\n\t\tuassert.NotPanics(t, func() {\n\t\t\tRegister(v)\n\t\t})\n\n\t\tuassert.NotPanics(t, func() {\n\t\t\tvaloper := GetByAddr(v.Address)\n\n\t\t\tuassert.Equal(t, v.Address, valoper.Address)\n\t\t\tuassert.Equal(t, v.Name, valoper.Name)\n\t\t\tuassert.Equal(t, v.PubKey, valoper.PubKey)\n\t\t})\n\t})\n}\n\nfunc TestValopers_Update(t *testing.T) {\n\tt.Parallel()\n\n\tt.Run(\"non-existing valoper\", func(t *testing.T) {\n\t\tt.Parallel()\n\n\t\t// Clear the set for the test\n\t\tvalopers = avl.NewTree()\n\n\t\tv := Valoper{}\n\n\t\t// Update the valoper\n\t\tuassert.PanicsWithMessage(t, errValoperMissing, func() {\n\t\t\tUpdate(v.Address, v)\n\t\t})\n\t})\n\n\tt.Run(\"overwrite valoper\", func(t *testing.T) {\n\t\tt.Parallel()\n\n\t\t// Clear the set for the test\n\t\tvalopers = avl.NewTree()\n\n\t\tone := Valoper{\n\t\t\tAddress: testutils.TestAddress(\"valoper 1\"),\n\t\t}\n\n\t\t// Add the valoper\n\t\tuassert.NotPanics(t, func() {\n\t\t\tRegister(one)\n\t\t})\n\n\t\tinitialAddress := testutils.TestAddress(\"valoper 2\")\n\t\ttwo := Valoper{\n\t\t\tAddress: initialAddress,\n\t\t}\n\n\t\t// Add the valoper\n\t\tuassert.NotPanics(t, func() {\n\t\t\tRegister(two)\n\t\t})\n\n\t\t// Update the valoper address\n\t\t// so it overlaps\n\t\ttwo = Valoper{\n\t\t\tAddress: one.Address,\n\t\t}\n\n\t\t// Update the valoper\n\t\tuassert.PanicsWithMessage(t, errInvalidAddressUpdate, func() {\n\t\t\tUpdate(initialAddress, two)\n\t\t})\n\t})\n\n\tt.Run(\"successful update\", func(t *testing.T) {\n\t\tt.Parallel()\n\n\t\t// Clear the set for the test\n\t\tvalopers = avl.NewTree()\n\n\t\tvar (\n\t\t\tname = \"new valoper\"\n\t\t\tv = Valoper{\n\t\t\t\tAddress: testutils.TestAddress(\"valoper\"),\n\t\t\t\tName: name,\n\t\t\t\tPubKey: \"pub key\",\n\t\t\t}\n\t\t)\n\n\t\t// Add the valoper\n\t\tuassert.NotPanics(t, func() {\n\t\t\tRegister(v)\n\t\t})\n\n\t\t// Update the valoper name\n\t\tv.Name = \"new name\"\n\t\tv.Active = false\n\n\t\t// Update the valoper\n\t\tuassert.NotPanics(t, func() {\n\t\t\tUpdate(v.Address, v)\n\t\t})\n\n\t\t// Make sure the valoper is updated\n\t\tuassert.NotPanics(t, func() {\n\t\t\tvaloper := GetByAddr(v.Address)\n\n\t\t\tuassert.Equal(t, v.Name, valoper.Name)\n\t\t\tuassert.Equal(t, v.Active, valoper.Active)\n\t\t})\n\t})\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} {"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"config","path":"gno.land/r/leon/config","files":[{"name":"config.gno","body":"package config\n\nimport (\n\t\"errors\"\n\t\"std\"\n)\n\nvar (\n\tmain std.Address // leon's main address\n\tbackup std.Address // backup address\n)\n\nfunc init() {\n\tmain = \"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5\"\n}\n\nfunc Address() std.Address {\n\treturn main\n}\n\nfunc Backup() std.Address {\n\treturn backup\n}\n\nfunc SetAddress(a std.Address) error {\n\tif !a.IsValid() {\n\t\treturn errors.New(\"config: invalid address\")\n\t}\n\n\tif err := checkAuthorized(); err != nil {\n\t\treturn err\n\t}\n\n\tmain = a\n\treturn nil\n}\n\nfunc SetBackup(a std.Address) error {\n\tif !a.IsValid() {\n\t\treturn errors.New(\"config: invalid address\")\n\t}\n\n\tif err := checkAuthorized(); err != nil {\n\t\treturn err\n\t}\n\n\tbackup = a\n\treturn nil\n}\n\nfunc checkAuthorized() error {\n\tcaller := std.PrevRealm().Addr()\n\tif caller != main || caller != backup {\n\t\treturn errors.New(\"config: unauthorized\")\n\t}\n\n\treturn nil\n}\n\nfunc AssertAuthorized() {\n\tcaller := std.PrevRealm().Addr()\n\tif caller != main || caller != backup {\n\t\tpanic(\"config: unauthorized\")\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} {"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"home","path":"gno.land/r/leon/home","files":[{"name":"home.gno","body":"package home\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\n\t\"gno.land/p/demo/ufmt\"\n\n\t\"gno.land/r/demo/art/gnoface\"\n\t\"gno.land/r/demo/art/millipede\"\n\t\"gno.land/r/leon/config\"\n)\n\nvar (\n\tpfp string // link to profile picture\n\tpfpCaption string // profile picture caption\n\tabtMe [2]string\n)\n\nfunc init() {\n\tpfp = \"https://i.imgflip.com/91vskx.jpg\"\n\tpfpCaption = \"[My favourite painting \u0026 pfp](https://en.wikipedia.org/wiki/Wanderer_above_the_Sea_of_Fog)\"\n\tabtMe = [2]string{\n\t\t`### About me\nHi, I'm Leon, a DevRel Engineer at gno.land. I am a tech enthusiast, \nlife-long learner, and sharer of knowledge.`,\n\t\t`### Contributions\nMy contributions to gno.land can mainly be found \n[here](https://github.com/gnolang/gno/issues?q=sort:updated-desc+author:leohhhn).\n\nTODO import r/gh\n`,\n\t}\n}\n\nfunc UpdatePFP(url, caption string) {\n\tconfig.AssertAuthorized()\n\tpfp = url\n\tpfpCaption = caption\n}\n\nfunc UpdateAboutMe(col1, col2 string) {\n\tconfig.AssertAuthorized()\n\tabtMe[0] = col1\n\tabtMe[1] = col2\n}\n\nfunc Render(path string) string {\n\tout := \"# Leon's Homepage\\n\\n\"\n\n\tout += renderAboutMe()\n\tout += renderBlogPosts()\n\tout += \"\\n\\n\"\n\tout += renderArt()\n\n\treturn out\n}\n\nfunc renderBlogPosts() string {\n\tout := \"\"\n\t//out += \"## Leon's Blog Posts\"\n\n\t// todo fetch blog posts authored by @leohhhn\n\t// and render them\n\treturn out\n}\n\nfunc renderAboutMe() string {\n\tout := \"\u003cdiv class='columns-3'\u003e\"\n\n\tout += \"\u003cdiv\u003e\\n\\n\"\n\tout += ufmt.Sprintf(\"![my profile pic](%s)\\n\\n%s\\n\\n\", pfp, pfpCaption)\n\tout += \"\u003c/div\u003e\\n\\n\"\n\n\tout += \"\u003cdiv\u003e\\n\\n\"\n\tout += abtMe[0] + \"\\n\\n\"\n\tout += \"\u003c/div\u003e\\n\\n\"\n\n\tout += \"\u003cdiv\u003e\\n\\n\"\n\tout += abtMe[1] + \"\\n\\n\"\n\tout += \"\u003c/div\u003e\\n\\n\"\n\n\tout += \"\u003c/div\u003e\u003c!-- /columns-3 --\u003e\\n\\n\"\n\n\treturn out\n}\n\nfunc renderArt() string {\n\tout := `\u003cdiv class=\"jumbotron\"\u003e` + \"\\n\\n\"\n\tout += \"# Gno Art\\n\\n\"\n\n\tout += \"\u003cdiv class='columns-3'\u003e\"\n\n\tout += renderGnoFace()\n\tout += renderMillipede()\n\tout += \"Empty spot :/\"\n\n\tout += \"\u003c/div\u003e\u003c!-- /columns-3 --\u003e\\n\\n\"\n\n\tout += \"This art is dynamic; it will change with every new block.\\n\\n\"\n\tout += `\u003c/div\u003e\u003c!-- /jumbotron --\u003e` + \"\\n\"\n\n\treturn out\n}\n\nfunc renderGnoFace() string {\n\tout := \"\u003cdiv\u003e\\n\\n\"\n\tout += gnoface.Render(strconv.Itoa(int(std.GetHeight())))\n\tout += \"\u003c/div\u003e\\n\\n\"\n\n\treturn out\n}\n\nfunc renderMillipede() string {\n\tout := \"\u003cdiv\u003e\\n\\n\"\n\tout += \"Millipede\\n\\n\"\n\tout += \"```\\n\" + millipede.Draw(int(std.GetHeight())%10+1) + \"```\\n\"\n\tout += \"\u003c/div\u003e\\n\\n\"\n\n\treturn out\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} -{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"home","path":"gno.land/r/manfred/home","files":[{"name":"home.gno","body":"package home\n\nfunc Render(path string) string {\n\treturn \"Moved to r/moul\"\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"config","path":"gno.land/r/manfred/config","files":[{"name":"config.gno","body":"package config\n\nimport \"std\"\n\nvar addr = std.Address(\"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq\")\n\nfunc Addr() std.Address {\n\treturn addr\n}\n\nfunc UpdateAddr(newAddr std.Address) {\n\tAssertIsAdmin()\n\taddr = newAddr\n}\n\nfunc AssertIsAdmin() {\n\tif std.GetOrigCaller() != addr {\n\t\tpanic(\"restricted area\")\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"home","path":"gno.land/r/manfred/home","files":[{"name":"home.gno","body":"package home\n\nimport \"gno.land/r/manfred/config\"\n\nvar (\n\ttodos []string\n\tstatus string\n\tmemeImgURL string\n)\n\nfunc init() {\n\ttodos = append(todos, \"fill this todo list...\")\n\tstatus = \"Online\" // Initial status set to \"Online\"\n\tmemeImgURL = \"https://i.imgflip.com/7ze8dc.jpg\"\n}\n\nfunc Render(path string) string {\n\tcontent := \"# Manfred's (gn)home Dashboard\\n\\n\"\n\n\tcontent += \"## Meme\\n\"\n\tcontent += \"![](\" + memeImgURL + \")\\n\\n\"\n\n\tcontent += \"## Status\\n\"\n\tcontent += status + \"\\n\\n\"\n\n\tcontent += \"## Personal ToDo List\\n\"\n\tfor _, todo := range todos {\n\t\tcontent += \"- [ ] \" + todo + \"\\n\"\n\t}\n\tcontent += \"\\n\"\n\n\t// TODO: Implement a feature to list replies on r/boards on my posts\n\t// TODO: Maybe integrate a calendar feature for upcoming events?\n\n\treturn content\n}\n\nfunc AddNewTodo(todo string) {\n\tconfig.AssertIsAdmin()\n\ttodos = append(todos, todo)\n}\n\nfunc DeleteTodo(todoIndex int) {\n\tconfig.AssertIsAdmin()\n\tif todoIndex \u003e= 0 \u0026\u0026 todoIndex \u003c len(todos) {\n\t\t// Remove the todo from the list by merging slices from before and after the todo\n\t\ttodos = append(todos[:todoIndex], todos[todoIndex+1:]...)\n\t} else {\n\t\tpanic(\"Invalid todo index\")\n\t}\n}\n\nfunc UpdateStatus(newStatus string) {\n\tconfig.AssertIsAdmin()\n\tstatus = newStatus\n}\n"},{"name":"z1_filetest.gno","body":"package main\n\nimport \"gno.land/r/manfred/home\"\n\nfunc main() {\n\tprintln(home.Render(\"\"))\n}\n\n// Output:\n// # Manfred's (gn)home Dashboard\n//\n// ## Meme\n// ![](https://i.imgflip.com/7ze8dc.jpg)\n//\n// ## Status\n// Online\n//\n// ## Personal ToDo List\n// - [ ] fill this todo list...\n"},{"name":"z2_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\t\"gno.land/r/manfred/home\"\n)\n\nfunc main() {\n\tstd.TestSetOrigCaller(\"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq\")\n\thome.AddNewTodo(\"aaa\")\n\thome.AddNewTodo(\"bbb\")\n\thome.AddNewTodo(\"ccc\")\n\thome.AddNewTodo(\"ddd\")\n\thome.AddNewTodo(\"eee\")\n\thome.UpdateStatus(\"Lorem Ipsum\")\n\thome.DeleteTodo(3)\n\tprintln(home.Render(\"\"))\n}\n\n// Output:\n// # Manfred's (gn)home Dashboard\n//\n// ## Meme\n// ![](https://i.imgflip.com/7ze8dc.jpg)\n//\n// ## Status\n// Lorem Ipsum\n//\n// ## Personal ToDo List\n// - [ ] fill this todo list...\n// - [ ] aaa\n// - [ ] bbb\n// - [ ] ddd\n// - [ ] eee\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"present","path":"gno.land/r/manfred/present","files":[{"name":"admin.gno","body":"package present\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/avl\"\n)\n\nvar (\n\tadminAddr std.Address\n\tmoderatorList avl.Tree\n\tinPause bool\n)\n\nfunc init() {\n\t// adminAddr = std.GetOrigCaller() // FIXME: find a way to use this from the main's genesis.\n\tadminAddr = \"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq\"\n}\n\nfunc AdminSetAdminAddr(addr std.Address) {\n\tassertIsAdmin()\n\tadminAddr = addr\n}\n\nfunc AdminSetInPause(state bool) {\n\tassertIsAdmin()\n\tinPause = state\n}\n\nfunc AdminAddModerator(addr std.Address) {\n\tassertIsAdmin()\n\tmoderatorList.Set(addr.String(), true)\n}\n\nfunc AdminRemoveModerator(addr std.Address) {\n\tassertIsAdmin()\n\tmoderatorList.Set(addr.String(), false) // XXX: delete instead?\n}\n\nfunc ModAddPost(slug, title, body, publicationDate, authors, tags string) {\n\tassertIsModerator()\n\n\tcaller := std.GetOrigCaller()\n\ttagList := strings.Split(tags, \",\")\n\tauthorList := strings.Split(authors, \",\")\n\n\terr := b.NewPost(caller, slug, title, body, publicationDate, authorList, tagList)\n\tcheckErr(err)\n}\n\nfunc ModEditPost(slug, title, body, publicationDate, authors, tags string) {\n\tassertIsModerator()\n\n\ttagList := strings.Split(tags, \",\")\n\tauthorList := strings.Split(authors, \",\")\n\n\terr := b.GetPost(slug).Update(title, body, publicationDate, authorList, tagList)\n\tcheckErr(err)\n}\n\nfunc isAdmin(addr std.Address) bool {\n\treturn addr == adminAddr\n}\n\nfunc isModerator(addr std.Address) bool {\n\t_, found := moderatorList.Get(addr.String())\n\treturn found\n}\n\nfunc assertIsAdmin() {\n\tcaller := std.GetOrigCaller()\n\tif !isAdmin(caller) {\n\t\tpanic(\"access restricted.\")\n\t}\n}\n\nfunc assertIsModerator() {\n\tcaller := std.GetOrigCaller()\n\tif isAdmin(caller) || isModerator(caller) {\n\t\treturn\n\t}\n\tpanic(\"access restricted\")\n}\n\nfunc assertNotInPause() {\n\tif inPause {\n\t\tpanic(\"access restricted (pause)\")\n\t}\n}\n\nfunc checkErr(err error) {\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"},{"name":"present_miami23.gno","body":"package present\n\nfunc init() {\n\tpath := \"miami23\"\n\ttitle := \"Portal Loop Demo (Miami 2023)\"\n\tbody := `\nRendered by Gno.\n\n[Source (WIP)](https://github.com/gnolang/gno/pull/1176)\n\n## Portal Loop\n\n- DONE: Dynamic homepage, key pages, aliases, and redirects.\n- TODO: Deploy with history, complete worxdao v0.\n- Will replace the static gno.land site.\n- Enhances local development.\n\n[GitHub Issue](https://github.com/gnolang/gno/issues/1108)\n\n## Roadmap\n\n- Crafting the roadmap this week, open to collaboration.\n- Combining onchain (portal loop) and offchain (GitHub).\n- Next week: Unveiling the official v0 roadmap.\n\n## Teams, DAOs, Projects\n\n- Developing worxDAO contracts for directories of projects and teams.\n- GitHub teams and projects align with this structure.\n- CODEOWNER file updates coming.\n- Initial teams announced next week.\n\n## Tech Team Retreat Plan\n\n- Continue Portal Loop.\n- Consider dApp development.\n- Explore new topics [here](https://github.com/orgs/gnolang/projects/15/).\n- Engage in workshops.\n- Connect and have fun with colleagues.\n`\n\t_ = b.NewPost(adminAddr, path, title, body, \"2023-10-15T13:17:24Z\", []string{\"moul\"}, []string{\"demo\", \"portal-loop\", \"miami\"})\n}\n"},{"name":"present_miami23_filetest.gno","body":"package main\n\nimport (\n\t\"gno.land/r/manfred/present\"\n)\n\nfunc main() {\n\tprintln(present.Render(\"\"))\n\tprintln(\"------------------------------------\")\n\tprintln(present.Render(\"p/miami23\"))\n}\n"},{"name":"presentations.gno","body":"package present\n\nimport (\n\t\"gno.land/p/demo/blog\"\n)\n\n// TODO: switch from p/blog to p/present\n\nvar b = \u0026blog.Blog{\n\tTitle: \"Manfred's Presentations\",\n\tPrefix: \"/r/manfred/present:\",\n\tNoBreadcrumb: true,\n}\n\nfunc Render(path string) string {\n\treturn b.Render(path)\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} {"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"guestbook","path":"gno.land/r/morgan/guestbook","files":[{"name":"admin.gno","body":"package guestbook\n\nimport (\n\t\"gno.land/p/demo/ownable\"\n\t\"gno.land/p/demo/seqid\"\n)\n\nvar owner = ownable.New()\n\n// AdminDelete removes the guestbook message with the given ID.\n// The user will still be marked as having submitted a message, so they\n// won't be able to re-submit a new message.\nfunc AdminDelete(signatureID string) {\n\towner.AssertCallerIsOwner()\n\n\tid, err := seqid.FromString(signatureID)\n\tif err != nil {\n\t\tpanic(err)\n\t}\n\tidb := id.Binary()\n\tif !guestbook.Has(idb) {\n\t\tpanic(\"signature does not exist\")\n\t}\n\tguestbook.Remove(idb)\n}\n"},{"name":"guestbook.gno","body":"// Realm guestbook contains an implementation of a simple guestbook.\n// Come and sign yourself up!\npackage guestbook\n\nimport (\n\t\"std\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\t\"unicode\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/seqid\"\n)\n\n// Signature is a single entry in the guestbook.\ntype Signature struct {\n\tMessage string\n\tAuthor std.Address\n\tTime time.Time\n}\n\nconst (\n\tmaxMessageLength = 140\n\tmaxPerPage = 25\n)\n\nvar (\n\tsignatureID seqid.ID\n\tguestbook avl.Tree // id -\u003e Signature\n\thasSigned avl.Tree // address -\u003e struct{}\n)\n\nfunc init() {\n\tSign(\"You reached the end of the guestbook!\")\n}\n\nconst (\n\terrNotAUser = \"this guestbook can only be signed by users\"\n\terrAlreadySigned = \"you already signed the guestbook!\"\n\terrInvalidCharacterInMessage = \"invalid character in message\"\n)\n\n// Sign signs the guestbook, with the specified message.\nfunc Sign(message string) {\n\tprev := std.PrevRealm()\n\tswitch {\n\tcase !prev.IsUser():\n\t\tpanic(errNotAUser)\n\tcase hasSigned.Has(prev.Addr().String()):\n\t\tpanic(errAlreadySigned)\n\t}\n\tmessage = validateMessage(message)\n\n\tguestbook.Set(signatureID.Next().Binary(), Signature{\n\t\tMessage: message,\n\t\tAuthor: prev.Addr(),\n\t\t// NOTE: time.Now() will yield the \"block time\", which is deterministic.\n\t\tTime: time.Now(),\n\t})\n\thasSigned.Set(prev.Addr().String(), struct{}{})\n}\n\nfunc validateMessage(msg string) string {\n\tif len(msg) \u003e maxMessageLength {\n\t\tpanic(\"Keep it brief! (max \" + strconv.Itoa(maxMessageLength) + \" bytes!)\")\n\t}\n\tout := \"\"\n\tfor _, ch := range msg {\n\t\tswitch {\n\t\tcase unicode.IsLetter(ch),\n\t\t\tunicode.IsNumber(ch),\n\t\t\tunicode.IsSpace(ch),\n\t\t\tunicode.IsPunct(ch):\n\t\t\tout += string(ch)\n\t\tdefault:\n\t\t\tpanic(errInvalidCharacterInMessage)\n\t\t}\n\t}\n\treturn out\n}\n\nfunc Render(maxID string) string {\n\tvar bld strings.Builder\n\n\tbld.WriteString(\"# Guestbook 📝\\n\\n[Come sign the guestbook!](./guestbook?help\u0026__func=Sign)\\n\\n---\\n\\n\")\n\n\tvar maxIDBinary string\n\tif maxID != \"\" {\n\t\tmid, err := seqid.FromString(maxID)\n\t\tif err != nil {\n\t\t\tpanic(err)\n\t\t}\n\n\t\t// AVL iteration is exclusive, so we need to decrease the ID value to get the \"true\" maximum.\n\t\tmid--\n\t\tmaxIDBinary = mid.Binary()\n\t}\n\n\tvar lastID seqid.ID\n\tvar printed int\n\tguestbook.ReverseIterate(\"\", maxIDBinary, func(key string, val interface{}) bool {\n\t\tsig := val.(Signature)\n\t\tmessage := strings.ReplaceAll(sig.Message, \"\\n\", \"\\n\u003e \")\n\t\tbld.WriteString(\"\u003e \" + message + \"\\n\u003e\\n\")\n\t\tidValue, ok := seqid.FromBinary(key)\n\t\tif !ok {\n\t\t\tpanic(\"invalid seqid id\")\n\t\t}\n\n\t\tbld.WriteString(\"\u003e _Written by \" + sig.Author.String() + \" at \" + sig.Time.Format(time.DateTime) + \"_ (#\" + idValue.String() + \")\\n\\n---\\n\\n\")\n\t\tlastID = idValue\n\n\t\tprinted++\n\t\t// stop after exceeding limit\n\t\treturn printed \u003e= maxPerPage\n\t})\n\n\tif printed == 0 {\n\t\tbld.WriteString(\"No messages!\")\n\t} else if printed \u003e= maxPerPage {\n\t\tbld.WriteString(\"\u003cp style='text-align:right'\u003e\u003ca href='./guestbook:\" + lastID.String() + \"'\u003eNext page\u003c/a\u003e\u003c/p\u003e\")\n\t}\n\n\treturn bld.String()\n}\n"},{"name":"guestbook_test.gno","body":"package guestbook\n\nimport (\n\t\"std\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"gno.land/p/demo/avl\"\n\t\"gno.land/p/demo/ownable\"\n)\n\nfunc TestSign(t *testing.T) {\n\tguestbook = avl.Tree{}\n\thasSigned = avl.Tree{}\n\n\tstd.TestSetRealm(std.NewUserRealm(\"g1user\"))\n\tSign(\"Hello!\")\n\n\tstd.TestSetRealm(std.NewUserRealm(\"g1user2\"))\n\tSign(\"Hello2!\")\n\n\tres := Render(\"\")\n\tt.Log(res)\n\tif !strings.Contains(res, \"\u003e Hello!\\n\u003e\\n\u003e _Written by g1user \") {\n\t\tt.Error(\"does not contain first user's message\")\n\t}\n\tif !strings.Contains(res, \"\u003e Hello2!\\n\u003e\\n\u003e _Written by g1user2 \") {\n\t\tt.Error(\"does not contain second user's message\")\n\t}\n\tif guestbook.Size() != 2 {\n\t\tt.Error(\"invalid guestbook size\")\n\t}\n}\n\nfunc TestSign_FromRealm(t *testing.T) {\n\tstd.TestSetRealm(std.NewCodeRealm(\"gno.land/r/demo/users\"))\n\n\tdefer func() {\n\t\trec := recover()\n\t\tif rec == nil {\n\t\t\tt.Fatal(\"expected panic\")\n\t\t}\n\t\trecString, ok := rec.(string)\n\t\tif !ok {\n\t\t\tt.Fatal(\"not a string\", rec)\n\t\t} else if recString != errNotAUser {\n\t\t\tt.Fatal(\"invalid error\", recString)\n\t\t}\n\t}()\n\tSign(\"Hey!\")\n}\n\nfunc TestSign_Double(t *testing.T) {\n\t// Should not allow signing twice.\n\tguestbook = avl.Tree{}\n\thasSigned = avl.Tree{}\n\n\tstd.TestSetRealm(std.NewUserRealm(\"g1user\"))\n\tSign(\"Hello!\")\n\n\tdefer func() {\n\t\trec := recover()\n\t\tif rec == nil {\n\t\t\tt.Fatal(\"expected panic\")\n\t\t}\n\t\trecString, ok := rec.(string)\n\t\tif !ok {\n\t\t\tt.Error(\"type assertion failed\", rec)\n\t\t} else if recString != errAlreadySigned {\n\t\t\tt.Error(\"invalid error message\", recString)\n\t\t}\n\t}()\n\n\tSign(\"Hello again!\")\n}\n\nfunc TestSign_InvalidMessage(t *testing.T) {\n\t// Should not allow control characters in message.\n\tguestbook = avl.Tree{}\n\thasSigned = avl.Tree{}\n\n\tstd.TestSetRealm(std.NewUserRealm(\"g1user\"))\n\n\tdefer func() {\n\t\trec := recover()\n\t\tif rec == nil {\n\t\t\tt.Fatal(\"expected panic\")\n\t\t}\n\t\trecString, ok := rec.(string)\n\t\tif !ok {\n\t\t\tt.Error(\"type assertion failed\", rec)\n\t\t} else if recString != errInvalidCharacterInMessage {\n\t\t\tt.Error(\"invalid error message\", recString)\n\t\t}\n\t}()\n\tSign(\"\\x00Hello!\")\n}\n\nfunc TestAdminDelete(t *testing.T) {\n\tconst (\n\t\tuserAddr std.Address = \"g1user\"\n\t\tadminAddr std.Address = \"g1admin\"\n\t)\n\n\tguestbook = avl.Tree{}\n\thasSigned = avl.Tree{}\n\towner = ownable.NewWithAddress(adminAddr)\n\tsignatureID = 0\n\n\tstd.TestSetRealm(std.NewUserRealm(userAddr))\n\n\tconst bad = \"Very Bad Message! Nyeh heh heh!\"\n\tSign(bad)\n\n\tif rnd := Render(\"\"); !strings.Contains(rnd, bad) {\n\t\tt.Fatal(\"render does not contain bad message\", rnd)\n\t}\n\n\tstd.TestSetRealm(std.NewUserRealm(adminAddr))\n\tAdminDelete(signatureID.String())\n\n\tif rnd := Render(\"\"); strings.Contains(rnd, bad) {\n\t\tt.Error(\"render contains bad message\", rnd)\n\t}\n\tif guestbook.Size() != 0 {\n\t\tt.Error(\"invalid guestbook size\")\n\t}\n\tif hasSigned.Size() != 1 {\n\t\tt.Error(\"invalid hasSigned size\")\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} {"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"home","path":"gno.land/r/morgan/home","files":[{"name":"home.gno","body":"package home\n\nconst staticHome = `# morgan's (gn)home\n\n- [📝 sign my guestbook](/r/morgan/guestbook)\n`\n\nfunc Render(path string) string {\n\treturn staticHome\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} -{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"config","path":"gno.land/r/moul/config","files":[{"name":"config.gno","body":"package config\n\nimport \"std\"\n\nvar addr = std.Address(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\") // @moul\n\nfunc Addr() std.Address {\n\treturn addr\n}\n\nfunc UpdateAddr(newAddr std.Address) {\n\tAssertIsAdmin()\n\taddr = newAddr\n}\n\nfunc AssertIsAdmin() {\n\tif std.GetOrigCaller() != addr {\n\t\tpanic(\"restricted area\")\n\t}\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} -{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"home","path":"gno.land/r/moul/home","files":[{"name":"home.gno","body":"package home\n\nimport \"gno.land/r/moul/config\"\n\nvar (\n\ttodos []string\n\tstatus string\n\tmemeImgURL string\n)\n\nfunc init() {\n\ttodos = append(todos, \"fill this todo list...\")\n\tstatus = \"Online\" // Initial status set to \"Online\"\n\tmemeImgURL = \"https://i.imgflip.com/7ze8dc.jpg\"\n}\n\nfunc Render(path string) string {\n\tcontent := \"# Manfred's (gn)home Dashboard\\n\\n\"\n\n\tcontent += \"## Meme\\n\"\n\tcontent += \"![](\" + memeImgURL + \")\\n\\n\"\n\n\tcontent += \"## Status\\n\"\n\tcontent += status + \"\\n\\n\"\n\n\tcontent += \"## Personal ToDo List\\n\"\n\tfor _, todo := range todos {\n\t\tcontent += \"- [ ] \" + todo + \"\\n\"\n\t}\n\tcontent += \"\\n\"\n\n\t// TODO: Implement a feature to list replies on r/boards on my posts\n\t// TODO: Maybe integrate a calendar feature for upcoming events?\n\n\treturn content\n}\n\nfunc AddNewTodo(todo string) {\n\tconfig.AssertIsAdmin()\n\ttodos = append(todos, todo)\n}\n\nfunc DeleteTodo(todoIndex int) {\n\tconfig.AssertIsAdmin()\n\tif todoIndex \u003e= 0 \u0026\u0026 todoIndex \u003c len(todos) {\n\t\t// Remove the todo from the list by merging slices from before and after the todo\n\t\ttodos = append(todos[:todoIndex], todos[todoIndex+1:]...)\n\t} else {\n\t\tpanic(\"Invalid todo index\")\n\t}\n}\n\nfunc UpdateStatus(newStatus string) {\n\tconfig.AssertIsAdmin()\n\tstatus = newStatus\n}\n"},{"name":"z1_filetest.gno","body":"package main\n\nimport \"gno.land/r/moul/home\"\n\nfunc main() {\n\tprintln(home.Render(\"\"))\n}\n\n// Output:\n// # Manfred's (gn)home Dashboard\n//\n// ## Meme\n// ![](https://i.imgflip.com/7ze8dc.jpg)\n//\n// ## Status\n// Online\n//\n// ## Personal ToDo List\n// - [ ] fill this todo list...\n"},{"name":"z2_filetest.gno","body":"package main\n\nimport (\n\t\"std\"\n\n\t\"gno.land/r/moul/home\"\n)\n\nfunc main() {\n\tstd.TestSetOrigCaller(\"g1manfred47kzduec920z88wfr64ylksmdcedlf5\")\n\thome.AddNewTodo(\"aaa\")\n\thome.AddNewTodo(\"bbb\")\n\thome.AddNewTodo(\"ccc\")\n\thome.AddNewTodo(\"ddd\")\n\thome.AddNewTodo(\"eee\")\n\thome.UpdateStatus(\"Lorem Ipsum\")\n\thome.DeleteTodo(3)\n\tprintln(home.Render(\"\"))\n}\n\n// Output:\n// # Manfred's (gn)home Dashboard\n//\n// ## Meme\n// ![](https://i.imgflip.com/7ze8dc.jpg)\n//\n// ## Status\n// Lorem Ipsum\n//\n// ## Personal ToDo List\n// - [ ] fill this todo list...\n// - [ ] aaa\n// - [ ] bbb\n// - [ ] ddd\n// - [ ] eee\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} -{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"present","path":"gno.land/r/moul/present","files":[{"name":"admin.gno","body":"package present\n\nimport (\n\t\"std\"\n\t\"strings\"\n\n\t\"gno.land/p/demo/avl\"\n)\n\nvar (\n\tadminAddr std.Address\n\tmoderatorList avl.Tree\n\tinPause bool\n)\n\nfunc init() {\n\t// adminAddr = std.GetOrigCaller() // FIXME: find a way to use this from the main's genesis.\n\tadminAddr = \"g1manfred47kzduec920z88wfr64ylksmdcedlf5\"\n}\n\nfunc AdminSetAdminAddr(addr std.Address) {\n\tassertIsAdmin()\n\tadminAddr = addr\n}\n\nfunc AdminSetInPause(state bool) {\n\tassertIsAdmin()\n\tinPause = state\n}\n\nfunc AdminAddModerator(addr std.Address) {\n\tassertIsAdmin()\n\tmoderatorList.Set(addr.String(), true)\n}\n\nfunc AdminRemoveModerator(addr std.Address) {\n\tassertIsAdmin()\n\tmoderatorList.Set(addr.String(), false) // XXX: delete instead?\n}\n\nfunc ModAddPost(slug, title, body, publicationDate, authors, tags string) {\n\tassertIsModerator()\n\n\tcaller := std.GetOrigCaller()\n\ttagList := strings.Split(tags, \",\")\n\tauthorList := strings.Split(authors, \",\")\n\n\terr := b.NewPost(caller, slug, title, body, publicationDate, authorList, tagList)\n\tcheckErr(err)\n}\n\nfunc ModEditPost(slug, title, body, publicationDate, authors, tags string) {\n\tassertIsModerator()\n\n\ttagList := strings.Split(tags, \",\")\n\tauthorList := strings.Split(authors, \",\")\n\n\terr := b.GetPost(slug).Update(title, body, publicationDate, authorList, tagList)\n\tcheckErr(err)\n}\n\nfunc isAdmin(addr std.Address) bool {\n\treturn addr == adminAddr\n}\n\nfunc isModerator(addr std.Address) bool {\n\t_, found := moderatorList.Get(addr.String())\n\treturn found\n}\n\nfunc assertIsAdmin() {\n\tcaller := std.GetOrigCaller()\n\tif !isAdmin(caller) {\n\t\tpanic(\"access restricted.\")\n\t}\n}\n\nfunc assertIsModerator() {\n\tcaller := std.GetOrigCaller()\n\tif isAdmin(caller) || isModerator(caller) {\n\t\treturn\n\t}\n\tpanic(\"access restricted\")\n}\n\nfunc assertNotInPause() {\n\tif inPause {\n\t\tpanic(\"access restricted (pause)\")\n\t}\n}\n\nfunc checkErr(err error) {\n\tif err != nil {\n\t\tpanic(err)\n\t}\n}\n"},{"name":"present_miami23.gno","body":"package present\n\nfunc init() {\n\tpath := \"miami23\"\n\ttitle := \"Portal Loop Demo (Miami 2023)\"\n\tbody := `\nRendered by Gno.\n\n[Source (WIP)](https://github.com/gnolang/gno/pull/1176)\n\n## Portal Loop\n\n- DONE: Dynamic homepage, key pages, aliases, and redirects.\n- TODO: Deploy with history, complete worxdao v0.\n- Will replace the static gno.land site.\n- Enhances local development.\n\n[GitHub Issue](https://github.com/gnolang/gno/issues/1108)\n\n## Roadmap\n\n- Crafting the roadmap this week, open to collaboration.\n- Combining onchain (portal loop) and offchain (GitHub).\n- Next week: Unveiling the official v0 roadmap.\n\n## Teams, DAOs, Projects\n\n- Developing worxDAO contracts for directories of projects and teams.\n- GitHub teams and projects align with this structure.\n- CODEOWNER file updates coming.\n- Initial teams announced next week.\n\n## Tech Team Retreat Plan\n\n- Continue Portal Loop.\n- Consider dApp development.\n- Explore new topics [here](https://github.com/orgs/gnolang/projects/15/).\n- Engage in workshops.\n- Connect and have fun with colleagues.\n`\n\t_ = b.NewPost(adminAddr, path, title, body, \"2023-10-15T13:17:24Z\", []string{\"moul\"}, []string{\"demo\", \"portal-loop\", \"miami\"})\n}\n"},{"name":"present_miami23_filetest.gno","body":"package main\n\nimport (\n\t\"gno.land/r/moul/present\"\n)\n\nfunc main() {\n\tprintln(present.Render(\"\"))\n\tprintln(\"------------------------------------\")\n\tprintln(present.Render(\"p/miami23\"))\n}\n"},{"name":"presentations.gno","body":"package present\n\nimport (\n\t\"gno.land/p/demo/blog\"\n)\n\n// TODO: switch from p/blog to p/present\n\nvar b = \u0026blog.Blog{\n\tTitle: \"Manfred's Presentations\",\n\tPrefix: \"/r/moul/present:\",\n\tNoBreadcrumb: true,\n}\n\nfunc Render(path string) string {\n\treturn b.Render(path)\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} {"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"rewards","path":"gno.land/r/sys/rewards","files":[{"name":"rewards.gno","body":"// This package will be used to manage proof-of-contributions on the exposed smart-contract side.\npackage rewards\n\n// TODO: write specs.\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} -{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"users","path":"gno.land/r/sys/users","files":[{"name":"verify.gno","body":"package users\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/ownable\"\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = \"g1manfred47kzduec920z88wfr64ylksmdcedlf5\" // @moul\n\ntype VerifyNameFunc func(enabled bool, address std.Address, name string) bool\n\nvar (\n\towner = ownable.NewWithAddress(admin) // Package owner\n\tcheckFunc = VerifyNameByUser // Checking namespace callback\n\tenabled = false // For now this package is disabled by default\n)\n\nfunc IsEnabled() bool { return enabled }\n\n// This method ensures that the given address has ownership of the given name.\nfunc IsAuthorizedAddressForName(address std.Address, name string) bool {\n\treturn checkFunc(enabled, address, name)\n}\n\n// VerifyNameByUser checks from the `users` package that the user has correctly\n// registered the given name.\n// This function considers as valid an `address` that matches the `name`.\nfunc VerifyNameByUser(enable bool, address std.Address, name string) bool {\n\tif !enable {\n\t\treturn true\n\t}\n\n\t// Allow user with their own address as name\n\tif address.String() == name {\n\t\treturn true\n\t}\n\n\tif user := users.GetUserByName(name); user != nil {\n\t\treturn user.Address == address\n\t}\n\n\treturn false\n}\n\n// Admin calls\n\n// Enable this package.\nfunc AdminEnable() {\n\tif err := owner.CallerIsOwner(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tenabled = true\n}\n\n// Disable this package.\nfunc AdminDisable() {\n\tif err := owner.CallerIsOwner(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tenabled = false\n}\n\n// AdminUpdateVerifyCall updates the method that verifies the namespace.\nfunc AdminUpdateVerifyCall(check VerifyNameFunc) {\n\tif err := owner.CallerIsOwner(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tcheckFunc = check\n}\n\n// AdminTransferOwnership transfers the ownership to a new owner.\nfunc AdminTransferOwnership(newOwner std.Address) error {\n\tif err := owner.CallerIsOwner(); err != nil {\n\t\tpanic(err)\n\t}\n\n\treturn owner.TransferOwnership(newOwner)\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} -{"msg":[{"@type":"/vm.m_call","caller":"g1manfred47kzduec920z88wfr64ylksmdcedlf5","send":"","pkg_path":"gno.land/r/demo/users","func":"Invite","args":["g1manfred47kzduec920z88wfr64ylksmdcedlf5:10\ng1us8428u2a5satrlxzagqqa5m6vmuze025anjlj:10\ng1589c8cekvmjfmy0qrd4f3z52r7fn7rgk02667s:1\ng13sm84nuqed3fuank8huh7x9mupgw22uft3lcl8:1\ng1m6732pkrngu9vrt0g7056lvr9kcqc4mv83xl5q:1\ng1wg88rhzlwxjd2z4j5de5v5xq30dcf6rjq3dhsj:1\ng18pmaskasz7mxj6rmgrl3al58xu45a7w0l5nmc0:1\ng19wwhkmqlns70604ksp6rkuuu42qhtvyh05lffz:1\ng187982000zsc493znqt828s90cmp6hcp2erhu6m:1\ng1ndpsnrspdnauckytvkfv8s823t3gmpqmtky8pl:1\ng16ja66d65emkr0zxd2tu7xjvm7utthyhpej0037:1\ng1ds24jj9kqjcskd0gzu24r9e4n62ggye230zuv5:1\ng1trkzq75ntamsnw9xnrav2v7gy2lt5g6p29yhdr:1\ng1rrf8s5mrmu00sx04fzfsvc399fklpeg2x0a7mz:1\ng19p5ntfvpt4lwq4jqsmnxsnelhf3tff9scy3w8w:1\ng1tue8l73d6rq4vhqdsp2sr3zhuzpure3k2rnwpz:1\ng14hhsss4ngx5kq77je5g0tl4vftg8qp45ceadk3:1\ng1768hvkh7anhd40ch4h7jdh6j3mpcs7hrat4gl0:1\ng15fa8kyjhu88t9dr8zzua8fwdvkngv5n8yqsm0n:1\ng1xhccdjcscuhgmt3quww6qdy3j3czqt3urc2eac:1\ng1z629z04f85k4t5gnkk5egpxw9tqxeec435esap:1\ng1pfldkplz9puq0v82lu9vqcve9nwrxuq9qe5ttv:1\ng152pn0g5qfgxr7yx8zlwjq48hytkafd8x7egsfv:1\ng1cf2ye686ke38vjyqakreprljum4xu6rwf5jskq:1\ng1c5shztyaj4gjrc5zlwmh9xhex5w7l4asffs2w6:1\ng1lhpx2ktk0ha3qw42raxq4m24a4c4xqxyrgv54q:1\ng1026p54q0j902059sm2zsv37krf0ghcl7gmhyv7:1\ng1n4yvwnv77frq2ccuw27dmtjkd7u4p4jg0pgm7k:1\ng13m7f2e6r3lh3ykxupacdt9sem2tlvmaamwjhll:1\ng19uxluuecjlsqvwmwu8sp6pxaaqfhk972q975xd:1\ng1j80fpcsumfkxypvydvtwtz3j4sdwr8c2u0lr64:1\ng1tjdpptuk9eysq6z38nscqyycr998xjyx3w8jvw:1\ng19t3n89slfemgd3mwuat4lajwcp0yxrkadgeg7a:1\ng1yqndt8xx92l9h494jfruz2w79swzjes3n4wqjc:1\ng13278z0a5ufeg80ffqxpda9dlp599t7ekregcy6:1\ng1ht236wjd83x96uqwh9rh3fq6pylyn78mtwq9v6:1\ng1fj9jccm3zjnqspq7lp2g7lj4czyfq0s35600g9:1\ng1wwppuzdns5u6c6jqpkzua24zh6ppsus6399cea:1\ng1k8pjnguyu36pkc8hy0ufzgpzfmj2jl78la7ek3:1\ng1e8umkzumtxgs8399lw0us4rclea3xl5gxy9spp:1\ng14qekdkj2nmmwea4ufg9n002a3pud23y8k7ugs5:1\ng19w2488ntfgpduzqq3sk4j5x387zynwknqdvjqf:1\ng1495y3z7zrej4rendysnw5kaeu4g3d7x7w0734g:1\ng1hygx8ga9qakhkczyrzs9drm8j8tu4qds9y5e3r:1\ng1f977l6wxdh3qu60kzl75vx2wmzswu68l03r8su:1\ng1644qje5rx6jsdqfkzmgnfcegx4dxkjh6rwqd69:1\ng1mzjajymvmtksdwh3wkrndwj6zls2awl9q83dh6:1\ng14da4n9hcynyzz83q607uu8keuh9hwlv42ra6fa:10\ng14vhcdsyf83ngsrrqc92kmw8q9xakqjm0v8448t:5\n"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AmG6kzznyo1uNqWPAYU6wDpsmzQKDaEOrVRaZ08vOyX0"},"signature":"S8iMMzlOMK8dmox78R9Z8+pSsS8YaTCXrIcaHDpiOgkOy7gqoQJ0oftM0zf8zAz4xpezK8Lzg8Q0fCdXJxV76w=="}],"memo":""} -{"msg":[{"@type":"/vm.m_call","caller":"g1manfred47kzduec920z88wfr64ylksmdcedlf5","send":"","pkg_path":"gno.land/r/demo/users","func":"Invite","args":["g1manfred47kzduec920z88wfr64ylksmdcedlf5\ng1thlf3yct7n7ex70k0p62user0kn6mj6d3s0cg3\ng1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\n"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AmG6kzznyo1uNqWPAYU6wDpsmzQKDaEOrVRaZ08vOyX0"},"signature":"njczE6xYdp01+CaUU/8/v0YC/NuZD06+qLind+ZZEEMNaRe/4Ln+4z7dG6HYlaWUMsyI1KCoB6NIehoE0PZ44Q=="}],"memo":""} -{"msg":[{"@type":"/vm.m_call","caller":"g1manfred47kzduec920z88wfr64ylksmdcedlf5","send":"","pkg_path":"gno.land/r/demo/users","func":"Invite","args":["g1589c8cekvmjfmy0qrd4f3z52r7fn7rgk02667s\ng13sm84nuqed3fuank8huh7x9mupgw22uft3lcl8\ng1m6732pkrngu9vrt0g7056lvr9kcqc4mv83xl5q\ng1wg88rhzlwxjd2z4j5de5v5xq30dcf6rjq3dhsj\ng18pmaskasz7mxj6rmgrl3al58xu45a7w0l5nmc0\ng19wwhkmqlns70604ksp6rkuuu42qhtvyh05lffz\ng187982000zsc493znqt828s90cmp6hcp2erhu6m\ng1ndpsnrspdnauckytvkfv8s823t3gmpqmtky8pl\ng16ja66d65emkr0zxd2tu7xjvm7utthyhpej0037\ng1ds24jj9kqjcskd0gzu24r9e4n62ggye230zuv5\ng1trkzq75ntamsnw9xnrav2v7gy2lt5g6p29yhdr\ng1rrf8s5mrmu00sx04fzfsvc399fklpeg2x0a7mz\ng19p5ntfvpt4lwq4jqsmnxsnelhf3tff9scy3w8w\ng1tue8l73d6rq4vhqdsp2sr3zhuzpure3k2rnwpz\ng14hhsss4ngx5kq77je5g0tl4vftg8qp45ceadk3\ng1768hvkh7anhd40ch4h7jdh6j3mpcs7hrat4gl0\ng15fa8kyjhu88t9dr8zzua8fwdvkngv5n8yqsm0n\ng1xhccdjcscuhgmt3quww6qdy3j3czqt3urc2eac\ng1z629z04f85k4t5gnkk5egpxw9tqxeec435esap\ng1pfldkplz9puq0v82lu9vqcve9nwrxuq9qe5ttv\ng152pn0g5qfgxr7yx8zlwjq48hytkafd8x7egsfv\ng1cf2ye686ke38vjyqakreprljum4xu6rwf5jskq\ng1c5shztyaj4gjrc5zlwmh9xhex5w7l4asffs2w6\ng1lhpx2ktk0ha3qw42raxq4m24a4c4xqxyrgv54q\ng1026p54q0j902059sm2zsv37krf0ghcl7gmhyv7\ng1n4yvwnv77frq2ccuw27dmtjkd7u4p4jg0pgm7k\ng13m7f2e6r3lh3ykxupacdt9sem2tlvmaamwjhll\ng19uxluuecjlsqvwmwu8sp6pxaaqfhk972q975xd\ng1j80fpcsumfkxypvydvtwtz3j4sdwr8c2u0lr64\ng1tjdpptuk9eysq6z38nscqyycr998xjyx3w8jvw\ng19t3n89slfemgd3mwuat4lajwcp0yxrkadgeg7a\ng1yqndt8xx92l9h494jfruz2w79swzjes3n4wqjc\ng13278z0a5ufeg80ffqxpda9dlp599t7ekregcy6\ng1ht236wjd83x96uqwh9rh3fq6pylyn78mtwq9v6\ng1fj9jccm3zjnqspq7lp2g7lj4czyfq0s35600g9\ng1wwppuzdns5u6c6jqpkzua24zh6ppsus6399cea\ng1k8pjnguyu36pkc8hy0ufzgpzfmj2jl78la7ek3\ng1e8umkzumtxgs8399lw0us4rclea3xl5gxy9spp\ng14qekdkj2nmmwea4ufg9n002a3pud23y8k7ugs5\ng19w2488ntfgpduzqq3sk4j5x387zynwknqdvjqf\ng1495y3z7zrej4rendysnw5kaeu4g3d7x7w0734g\ng1hygx8ga9qakhkczyrzs9drm8j8tu4qds9y5e3r\ng1f977l6wxdh3qu60kzl75vx2wmzswu68l03r8su\ng1644qje5rx6jsdqfkzmgnfcegx4dxkjh6rwqd69\ng1mzjajymvmtksdwh3wkrndwj6zls2awl9q83dh6\ng1manfred47kzduec920z88wfr64ylksmdcedlf5\ng14da4n9hcynyzz83q607uu8keuh9hwlv42ra6fa\ng14vhcdsyf83ngsrrqc92kmw8q9xakqjm0v8448t\n"]}],"fee":{"gas_wanted":"4000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AmG6kzznyo1uNqWPAYU6wDpsmzQKDaEOrVRaZ08vOyX0"},"signature":"7AmlhZhsVkxCUl0bbpvpPMnIKihwtG7A5IFR6Tg4xStWLgaUr05XmWRKlO2xjstTtwbVKQT5mFL4h5wyX4SQzw=="}],"memo":""} +{"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"users","path":"gno.land/r/sys/users","files":[{"name":"verify.gno","body":"package users\n\nimport (\n\t\"std\"\n\n\t\"gno.land/p/demo/ownable\"\n\t\"gno.land/r/demo/users\"\n)\n\nconst admin = \"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq\" // @moul\n\ntype VerifyNameFunc func(enabled bool, address std.Address, name string) bool\n\nvar (\n\towner = ownable.NewWithAddress(admin) // Package owner\n\tcheckFunc = VerifyNameByUser // Checking namespace callback\n\tenabled = false // For now this package is disabled by default\n)\n\nfunc IsEnabled() bool { return enabled }\n\n// This method ensures that the given address has ownership of the given name.\nfunc IsAuthorizedAddressForName(address std.Address, name string) bool {\n\treturn checkFunc(enabled, address, name)\n}\n\n// VerifyNameByUser checks from the `users` package that the user has correctly\n// registered the given name.\n// This function considers as valid an `address` that matches the `name`.\nfunc VerifyNameByUser(enable bool, address std.Address, name string) bool {\n\tif !enable {\n\t\treturn true\n\t}\n\n\t// Allow user with their own address as name\n\tif address.String() == name {\n\t\treturn true\n\t}\n\n\tif user := users.GetUserByName(name); user != nil {\n\t\treturn user.Address == address\n\t}\n\n\treturn false\n}\n\n// Admin calls\n\n// Enable this package.\nfunc AdminEnable() {\n\tif err := owner.CallerIsOwner(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tenabled = true\n}\n\n// Disable this package.\nfunc AdminDisable() {\n\tif err := owner.CallerIsOwner(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tenabled = false\n}\n\n// AdminUpdateVerifyCall updates the method that verifies the namespace.\nfunc AdminUpdateVerifyCall(check VerifyNameFunc) {\n\tif err := owner.CallerIsOwner(); err != nil {\n\t\tpanic(err)\n\t}\n\n\tcheckFunc = check\n}\n\n// AdminTransferOwnership transfers the ownership to a new owner.\nfunc AdminTransferOwnership(newOwner std.Address) error {\n\tif err := owner.CallerIsOwner(); err != nil {\n\t\tpanic(err)\n\t}\n\n\treturn owner.TransferOwnership(newOwner)\n}\n"}]},"deposit":""}],"fee":{"gas_wanted":"50000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":null,"signature":null}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/demo/users","func":"Invite","args":["g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj:10\ng1589c8cekvmjfmy0qrd4f3z52r7fn7rgk02667s:1\ng13sm84nuqed3fuank8huh7x9mupgw22uft3lcl8:1\ng1m6732pkrngu9vrt0g7056lvr9kcqc4mv83xl5q:1\ng1wg88rhzlwxjd2z4j5de5v5xq30dcf6rjq3dhsj:1\ng18pmaskasz7mxj6rmgrl3al58xu45a7w0l5nmc0:1\ng19wwhkmqlns70604ksp6rkuuu42qhtvyh05lffz:1\ng187982000zsc493znqt828s90cmp6hcp2erhu6m:1\ng1ndpsnrspdnauckytvkfv8s823t3gmpqmtky8pl:1\ng16ja66d65emkr0zxd2tu7xjvm7utthyhpej0037:1\ng1ds24jj9kqjcskd0gzu24r9e4n62ggye230zuv5:1\ng1trkzq75ntamsnw9xnrav2v7gy2lt5g6p29yhdr:1\ng1rrf8s5mrmu00sx04fzfsvc399fklpeg2x0a7mz:1\ng19p5ntfvpt4lwq4jqsmnxsnelhf3tff9scy3w8w:1\ng1tue8l73d6rq4vhqdsp2sr3zhuzpure3k2rnwpz:1\ng14hhsss4ngx5kq77je5g0tl4vftg8qp45ceadk3:1\ng1768hvkh7anhd40ch4h7jdh6j3mpcs7hrat4gl0:1\ng15fa8kyjhu88t9dr8zzua8fwdvkngv5n8yqsm0n:1\ng1xhccdjcscuhgmt3quww6qdy3j3czqt3urc2eac:1\ng1z629z04f85k4t5gnkk5egpxw9tqxeec435esap:1\ng1pfldkplz9puq0v82lu9vqcve9nwrxuq9qe5ttv:1\ng152pn0g5qfgxr7yx8zlwjq48hytkafd8x7egsfv:1\ng1cf2ye686ke38vjyqakreprljum4xu6rwf5jskq:1\ng1c5shztyaj4gjrc5zlwmh9xhex5w7l4asffs2w6:1\ng1lhpx2ktk0ha3qw42raxq4m24a4c4xqxyrgv54q:1\ng1026p54q0j902059sm2zsv37krf0ghcl7gmhyv7:1\ng1n4yvwnv77frq2ccuw27dmtjkd7u4p4jg0pgm7k:1\ng13m7f2e6r3lh3ykxupacdt9sem2tlvmaamwjhll:1\ng19uxluuecjlsqvwmwu8sp6pxaaqfhk972q975xd:1\ng1j80fpcsumfkxypvydvtwtz3j4sdwr8c2u0lr64:1\ng1tjdpptuk9eysq6z38nscqyycr998xjyx3w8jvw:1\ng19t3n89slfemgd3mwuat4lajwcp0yxrkadgeg7a:1\ng1yqndt8xx92l9h494jfruz2w79swzjes3n4wqjc:1\ng13278z0a5ufeg80ffqxpda9dlp599t7ekregcy6:1\ng1ht236wjd83x96uqwh9rh3fq6pylyn78mtwq9v6:1\ng1fj9jccm3zjnqspq7lp2g7lj4czyfq0s35600g9:1\ng1wwppuzdns5u6c6jqpkzua24zh6ppsus6399cea:1\ng1k8pjnguyu36pkc8hy0ufzgpzfmj2jl78la7ek3:1\ng1e8umkzumtxgs8399lw0us4rclea3xl5gxy9spp:1\ng14qekdkj2nmmwea4ufg9n002a3pud23y8k7ugs5:1\ng19w2488ntfgpduzqq3sk4j5x387zynwknqdvjqf:1\ng1495y3z7zrej4rendysnw5kaeu4g3d7x7w0734g:1\ng1hygx8ga9qakhkczyrzs9drm8j8tu4qds9y5e3r:1\ng1f977l6wxdh3qu60kzl75vx2wmzswu68l03r8su:1\ng1644qje5rx6jsdqfkzmgnfcegx4dxkjh6rwqd69:1\ng1mzjajymvmtksdwh3wkrndwj6zls2awl9q83dh6:1\ng14da4n9hcynyzz83q607uu8keuh9hwlv42ra6fa:10\ng14vhcdsyf83ngsrrqc92kmw8q9xakqjm0v8448t:5\n"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AmG6kzznyo1uNqWPAYU6wDpsmzQKDaEOrVRaZ08vOyX0"},"signature":"S8iMMzlOMK8dmox78R9Z8+pSsS8YaTCXrIcaHDpiOgkOy7gqoQJ0oftM0zf8zAz4xpezK8Lzg8Q0fCdXJxV76w=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/demo/users","func":"Invite","args":["g1thlf3yct7n7ex70k0p62user0kn6mj6d3s0cg3\ng1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\n"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AmG6kzznyo1uNqWPAYU6wDpsmzQKDaEOrVRaZ08vOyX0"},"signature":"njczE6xYdp01+CaUU/8/v0YC/NuZD06+qLind+ZZEEMNaRe/4Ln+4z7dG6HYlaWUMsyI1KCoB6NIehoE0PZ44Q=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/demo/users","func":"Invite","args":["g1589c8cekvmjfmy0qrd4f3z52r7fn7rgk02667s\ng13sm84nuqed3fuank8huh7x9mupgw22uft3lcl8\ng1m6732pkrngu9vrt0g7056lvr9kcqc4mv83xl5q\ng1wg88rhzlwxjd2z4j5de5v5xq30dcf6rjq3dhsj\ng18pmaskasz7mxj6rmgrl3al58xu45a7w0l5nmc0\ng19wwhkmqlns70604ksp6rkuuu42qhtvyh05lffz\ng187982000zsc493znqt828s90cmp6hcp2erhu6m\ng1ndpsnrspdnauckytvkfv8s823t3gmpqmtky8pl\ng16ja66d65emkr0zxd2tu7xjvm7utthyhpej0037\ng1ds24jj9kqjcskd0gzu24r9e4n62ggye230zuv5\ng1trkzq75ntamsnw9xnrav2v7gy2lt5g6p29yhdr\ng1rrf8s5mrmu00sx04fzfsvc399fklpeg2x0a7mz\ng19p5ntfvpt4lwq4jqsmnxsnelhf3tff9scy3w8w\ng1tue8l73d6rq4vhqdsp2sr3zhuzpure3k2rnwpz\ng14hhsss4ngx5kq77je5g0tl4vftg8qp45ceadk3\ng1768hvkh7anhd40ch4h7jdh6j3mpcs7hrat4gl0\ng15fa8kyjhu88t9dr8zzua8fwdvkngv5n8yqsm0n\ng1xhccdjcscuhgmt3quww6qdy3j3czqt3urc2eac\ng1z629z04f85k4t5gnkk5egpxw9tqxeec435esap\ng1pfldkplz9puq0v82lu9vqcve9nwrxuq9qe5ttv\ng152pn0g5qfgxr7yx8zlwjq48hytkafd8x7egsfv\ng1cf2ye686ke38vjyqakreprljum4xu6rwf5jskq\ng1c5shztyaj4gjrc5zlwmh9xhex5w7l4asffs2w6\ng1lhpx2ktk0ha3qw42raxq4m24a4c4xqxyrgv54q\ng1026p54q0j902059sm2zsv37krf0ghcl7gmhyv7\ng1n4yvwnv77frq2ccuw27dmtjkd7u4p4jg0pgm7k\ng13m7f2e6r3lh3ykxupacdt9sem2tlvmaamwjhll\ng19uxluuecjlsqvwmwu8sp6pxaaqfhk972q975xd\ng1j80fpcsumfkxypvydvtwtz3j4sdwr8c2u0lr64\ng1tjdpptuk9eysq6z38nscqyycr998xjyx3w8jvw\ng19t3n89slfemgd3mwuat4lajwcp0yxrkadgeg7a\ng1yqndt8xx92l9h494jfruz2w79swzjes3n4wqjc\ng13278z0a5ufeg80ffqxpda9dlp599t7ekregcy6\ng1ht236wjd83x96uqwh9rh3fq6pylyn78mtwq9v6\ng1fj9jccm3zjnqspq7lp2g7lj4czyfq0s35600g9\ng1wwppuzdns5u6c6jqpkzua24zh6ppsus6399cea\ng1k8pjnguyu36pkc8hy0ufzgpzfmj2jl78la7ek3\ng1e8umkzumtxgs8399lw0us4rclea3xl5gxy9spp\ng14qekdkj2nmmwea4ufg9n002a3pud23y8k7ugs5\ng19w2488ntfgpduzqq3sk4j5x387zynwknqdvjqf\ng1495y3z7zrej4rendysnw5kaeu4g3d7x7w0734g\ng1hygx8ga9qakhkczyrzs9drm8j8tu4qds9y5e3r\ng1f977l6wxdh3qu60kzl75vx2wmzswu68l03r8su\ng1644qje5rx6jsdqfkzmgnfcegx4dxkjh6rwqd69\ng1mzjajymvmtksdwh3wkrndwj6zls2awl9q83dh6\ng1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq\ng14da4n9hcynyzz83q607uu8keuh9hwlv42ra6fa\ng14vhcdsyf83ngsrrqc92kmw8q9xakqjm0v8448t\n"]}],"fee":{"gas_wanted":"4000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AmG6kzznyo1uNqWPAYU6wDpsmzQKDaEOrVRaZ08vOyX0"},"signature":"7AmlhZhsVkxCUl0bbpvpPMnIKihwtG7A5IFR6Tg4xStWLgaUr05XmWRKlO2xjstTtwbVKQT5mFL4h5wyX4SQzw=="}],"memo":""} {"msg":[{"@type":"/vm.m_call","caller":"g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj","send":"200000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","administrator","g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AmG6kzznyo1uNqWPAYU6wDpsmzQKDaEOrVRaZ08vOyX0"},"signature":"AqCqe0cS55Ym7/BvPDoCDyPP5q8284gecVQ2PMOlq/4lJpO9Q18SOWKI15dMEBY1pT0AYyhCeTirlsM1I3Y4Cg=="}],"memo":""} {"msg":[{"@type":"/vm.m_call","caller":"g1qpymzwx4l4cy6cerdyajp9ksvjsf20rk5y9rtt","send":"200000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","zo_oma","Love is the encryption key\u003c3"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A6yg5/iiktruezVw5vZJwLlGwyrvw8RlqOToTRMWXkE2"},"signature":"GGp+bVL2eEvKecPqgcULSABYOSnSMnJzfIsR8ZIRER1GGX/fOiCReX4WKMrGLVROJVfbLQkDRwvhS4TLHlSoSQ=="}],"memo":""} -{"msg":[{"@type":"/vm.m_call","caller":"g1manfred47kzduec920z88wfr64ylksmdcedlf5","send":"200000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["g1manfred47kzduec920z88wfr64ylksmdcedlf5","moul","https://github.com/moul"]}],"fee":{"gas_wanted":"2000000","gas_fee":"200000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"9CWeNbKx+hEL+RdHplAVAFntcrAVx5mK9tMqoywuHVoreH844n3yOxddQrGfBk6T2tMBmNWakERRqWZfS+bYAQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"200000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","manfred","https://github.com/moul"]}],"fee":{"gas_wanted":"2000000","gas_fee":"200000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"9CWeNbKx+hEL+RdHplAVAFntcrAVx5mK9tMqoywuHVoreH844n3yOxddQrGfBk6T2tMBmNWakERRqWZfS+bYAQ=="}],"memo":""} {"msg":[{"@type":"/vm.m_call","caller":"g1fj9jccm3zjnqspq7lp2g7lj4czyfq0s35600g9","send":"200000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","piupiu","@piux2"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"Ar68lqbU2YC63fbMcYUtJhYO3/66APM/EqF7m0nUjGyz"},"signature":"pTUpP0d/XlfVe3TH1hlaoLhKadzIKG1gtQ/Ueuat72p+659RWRea58Z0mk6GgPE/EeTbhMEY45zufevBdGJVoQ=="}],"memo":""} -{"msg":[{"@type":"/vm.m_call","caller":"g1ds24jj9kqjcskd0gzu24r9e4n62ggye230zuv5","send":"","pkg_path":"gno.land/r/demo/users","func":"Register","args":["g1manfred47kzduec920z88wfr64ylksmdcedlf5","anarcher","https://twitter.com/anarcher"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjpLbKdQeH+yB/1OCB148l5GlRRrXma71hdA8EES3H7f"},"signature":"pf5xm8oWIQIOEwSGw4icPmynLXb1P1HxKfjeh8UStU1mlIBPKa7yppeIMPpAflC0o2zjFR7Axe7CimAebm3BHg=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1ds24jj9kqjcskd0gzu24r9e4n62ggye230zuv5","send":"","pkg_path":"gno.land/r/demo/users","func":"Register","args":["g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","anarcher","https://twitter.com/anarcher"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AjpLbKdQeH+yB/1OCB148l5GlRRrXma71hdA8EES3H7f"},"signature":"pf5xm8oWIQIOEwSGw4icPmynLXb1P1HxKfjeh8UStU1mlIBPKa7yppeIMPpAflC0o2zjFR7Axe7CimAebm3BHg=="}],"memo":""} {"msg":[{"@type":"/vm.m_call","caller":"g15gdm49ktawvkrl88jadqpucng37yxutucuwaef","send":"200000000ugnot","pkg_path":"gno.land/r/demo/users","func":"Register","args":["","ideamour","\u003c3"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AhClx4AsDuX3DNCPxhDwWnrfd4MIZmxJE4vt47ClVvT2"},"signature":"IQe64af878k6HjLDqIJeg27GXAVF6xS+96cDe2jMlxNV6+8sOcuUctp0GiWVnYfN4tpthC6d4WhBo+VlpHqkbg=="}],"memo":""} {"msg":[{"@type":"/vm.m_call","caller":"g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj","send":"","pkg_path":"gno.land/r/demo/boards","func":"CreateBoard","args":["testboard"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"vzlSxEFh5jOkaSdv3rsV91v/OJKEF2qSuoCpri1u5tRWq62T7xr3KHRCF5qFnn4aQX/yE8g8f/Y//WPOCUGhJw=="}],"memo":""} {"msg":[{"@type":"/vm.m_call","caller":"g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj","send":"","pkg_path":"gno.land/r/demo/boards","func":"CreateThread","args":["1","Hello World","This is a demo of Gno smart contract programming. This document was\nconstructed by Gno onto a smart contract hosted on the data Realm \nname [\"gno.land/r/demo/boards\"](https://gno.land/r/demo/boards/)\n([github](https://github.com/gnolang/gno/tree/master/examples/gno.land/r/demo/boards)).\n\n## Starting the `gnoland` node node/validator.\n\nNOTE: Where you see `--remote localhost:26657` here, that flag can be replaced\nwith `--remote localhost:26657` for local testnets.\n\n### build gnoland.\n\n```bash\ngit clone git@github.com:gnolang/gno.git\ncd ./gno\nmake \n```\n\n### add test account.\n\n```bash\n./build/gnokey add test1 --recover\n```\n\nUse this mnemonic:\n\u003e source bonus chronic canvas draft south burst lottery vacant surface solve popular case indicate oppose farm nothing bullet exhibit title speed wink action roast\n\n### start gnoland validator node.\n\n```bash\n./build/gnoland\n```\n\n(This can be reset with `make reset`).\n\n### start gnoland web server (optional).\n\n```bash\ngo run ./gnoland/website\n```\n\n## Signing and broadcasting transactions.\n\n### publish the \"gno.land/p/demo/avl\" package.\n\n```bash\n./build/gnokey maketx addpkg test1 --pkgpath \"gno.land/p/demo/avl\" --pkgdir \"examples/gno.land/p/demo/avl\" --deposit 100ugnot --gas-fee 1ugnot --gas-wanted 2000000 \u003e addpkg.avl.unsigned.txt\n./build/gnokey query \"auth/accounts/g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5\"\n./build/gnokey sign test1 --txpath addpkg.avl.unsigned.txt --chainid \"portal-loop\" --number 0 --sequence 0 \u003e addpkg.avl.signed.txt\n./build/gnokey broadcast addpkg.avl.signed.txt --remote localhost:26657\n```\n\n### publish the \"gno.land/r/demo/boards\" realm package.\n\n```bash\n./build/gnokey maketx addpkg test1 --pkgpath \"gno.land/r/demo/boards\" --pkgdir \"examples/gno.land/r/demo/boards\" --deposit 100ugnot --gas-fee 1ugnot --gas-wanted 300000000 \u003e addpkg.boards.unsigned.txt\n./build/gnokey sign test1 --txpath addpkg.boards.unsigned.txt --chainid \"portal-loop\" --number 0 --sequence 1 \u003e addpkg.boards.signed.txt\n./build/gnokey broadcast addpkg.boards.signed.txt --remote localhost:26657\n```\n\n### create a board with a smart contract call.\n\n```bash\n./build/gnokey maketx call test1 --pkgpath \"gno.land/r/demo/boards\" --func CreateBoard --args \"testboard\" --gas-fee 1ugnot --gas-wanted 2000000 \u003e createboard.unsigned.txt\n./build/gnokey sign test1 --txpath createboard.unsigned.txt --chainid \"portal-loop\" --number 0 --sequence 2 \u003e createboard.signed.txt\n./build/gnokey broadcast createboard.signed.txt --remote localhost:26657\n```\nNext, query for the permanent board ID by querying (you need this to create a new post):\n\n```bash\n./build/gnokey query \"vm/qeval\" --data \"gno.land/r/demo/boards.GetBoardIDFromName(\\\"testboard\\\")\"\n```\n\n### create a post of a board with a smart contract call.\n\n```bash\n./build/gnokey maketx call test1 --pkgpath \"gno.land/r/demo/boards\" --func CreatePost --args 1 --args \"Hello World\" --args#file \"./examples/gno.land/r/demo/boards/README.md\" --gas-fee 1ugnot --gas-wanted 2000000 \u003e createpost.unsigned.txt\n./build/gnokey sign test1 --txpath createpost.unsigned.txt --chainid \"portal-loop\" --number 0 --sequence 3 \u003e createpost.signed.txt\n./build/gnokey broadcast createpost.signed.txt --remote localhost:26657\n```\n\n### create a comment to a post.\n\n```bash\n./build/gnokey maketx call test1 --pkgpath \"gno.land/r/demo/boards\" --func CreateReply --args 1 --args 1 --args \"A comment\" --gas-fee 1ugnot --gas-wanted 2000000 \u003e createcomment.unsigned.txt\n./build/gnokey sign test1 --txpath createcomment.unsigned.txt --chainid \"portal-loop\" --number 0 --sequence 4 \u003e createcomment.signed.txt\n./build/gnokey broadcast createcomment.signed.txt --remote localhost:26657\n```\n\n```bash\n./build/gnokey query \"vm/qrender\" --data \"gno.land/r/demo/boards:testboard/1\"\n```\n\n### render page with optional path expression.\n\nThe contents of `https://gno.land/r/demo/boards:` and `https://gno.land/r/demo/boards:testboard` are rendered by calling\nthe `Render(path string)` function like so:\n\n```bash\n./build/gnokey query \"vm/qrender\" --data \"gno.land/r/demo/boards:testboard\"\n```\n"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"V43B1waFxhzheW9TfmCpjLdrC4dC1yjUGES5y3J6QsNar6hRpNz4G1thzWmWK7xXhg8u1PCIpxLxGczKQYhuPw=="}],"memo":""} {"msg":[{"@type":"/vm.m_call","caller":"g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj","send":"","pkg_path":"gno.land/r/demo/boards","func":"CreateThread","args":["1","NFT example","NFT's are all the rage these days, for various reasons.\n\nI read over EIP-721 which appears to be the de-facto NFT standard on Ethereum. Then, made a sample implementation of EIP-721 (let's here called GRC-721). The implementation isn't complete, but it demonstrates the main functionality.\n\n - [EIP-721](https://eips.ethereum.org/EIPS/eip-721)\n - [gno.land/r/demo/nft/nft.gno](https://gno.land/r/demo/nft/nft.gno)\n - [zrealm_nft3.gno test](https://github.com/gnolang/gno/blob/master/examples/gno.land/r/demo/nft/z_3_filetest.gno)\n\nIn short, this demonstrates how to implement Ethereum contract interfaces in gno.land; by using only standard Go language features.\n\nPlease leave a comment ([guide](https://gno.land/r/demo/boards:testboard/1)).\n"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"ZXfrTiHxPFQL8uSm+Tv7WXIHPMca9okhm94RAlC6YgNbB1VHQYYpoP4w+cnL3YskVzGrOZxensXa9CAZ+cNNeg=="}],"memo":""} {"msg":[{"@type":"/vm.m_call","caller":"g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj","send":"","pkg_path":"gno.land/r/demo/boards","func":"CreateThread","args":["1","Simple echo example with coins","This is a simple test realm contract that demonstrates how to use the banker.\n\nSee [gno.land/r/demo/banktest/banktest.gno](/r/demo/banktest/banktest.gno) to see the original contract code.\n\nThis article will go through each line to explain how it works.\n\n```go\npackage banktest\n```\n\nThis package is locally named \"banktest\" (could be anything).\n\n```go\nimport (\n\t\"std\"\n)\n```\n\nThe \"std\" package is defined by the gno code in stdlibs/std/. \u003c/br\u003e\nSelf explanatory; and you'll see more usage from std later.\n\n```go\ntype activity struct {\n\tcaller std.Address\n\tsent std.Coins\n\treturned std.Coins\n\ttime std.Time\n}\n\nfunc (act *activity) String() string {\n\treturn act.caller.String() + \" \" +\n\t\tact.sent.String() + \" sent, \" +\n\t\tact.returned.String() + \" returned, at \" +\n\t\tstd.FormatTimestamp(act.time, \"2006-01-02 3:04pm MST\")\n}\n\nvar latest [10]*activity\n```\n\nThis is just maintaining a list of recent activity to this contract.\nNotice that the \"latest\" variable is defined \"globally\" within\nthe context of the realm with path \"gno.land/r/demo/banktest\".\n\nThis means that calls to functions defined within this package\nare encapsulated within this \"data realm\", where the data is \nmutated based on transactions that can potentially cross many\nrealm and non-realm packge boundaries (in the call stack).\n\n```go\n// Deposit will take the coins (to the realm's pkgaddr) or return them to user.\nfunc Deposit(returnDenom string, returnAmount int64) string {\n\tstd.AssertOriginCall()\n\tcaller := std.GetOrigCaller()\n\tsend := std.Coins{{returnDenom, returnAmount}}\n```\n\nThis is the beginning of the definition of the contract function named\n\"Deposit\". `std.AssertOriginCall() asserts that this function was called by a\ngno transactional Message. The caller is the user who signed off on this\ntransactional message. Send is the amount of deposit sent along with this\nmessage.\n\n```go\n\t// record activity\n\tact := \u0026activity{\n\t\tcaller: caller,\n\t\tsent: std.GetOrigSend(),\n\t\treturned: send,\n\t\ttime: std.GetTimestamp(),\n\t}\n\tfor i := len(latest) - 2; i \u003e= 0; i-- {\n\t\tlatest[i+1] = latest[i] // shift by +1.\n\t}\n\tlatest[0] = act\n```\n\nUpdating the \"latest\" array for viewing at gno.land/r/demo/banktest: (w/ trailing colon).\n\n```go\n\t// return if any.\n\tif returnAmount \u003e 0 {\n```\n\nIf the user requested the return of coins...\n\n```go\n\t\tbanker := std.GetBanker(std.BankerTypeOrigSend)\n```\n\nuse a std.Banker instance to return any deposited coins to the original sender.\n\n```go\n\t\tpkgaddr := std.GetOrigPkgAddr()\n\t\t// TODO: use std.Coins constructors, this isn't generally safe.\n\t\tbanker.SendCoins(pkgaddr, caller, send)\n\t\treturn \"returned!\"\n```\n\nNotice that each realm package has an associated Cosmos address.\n\n\nFinally, the results are rendered via an ABCI query call when you visit [/r/demo/banktest:](/r/demo/banktest:).\n\n```go\nfunc Render(path string) string {\n\t// get realm coins.\n\tbanker := std.GetBanker(std.BankerTypeReadonly)\n\tcoins := banker.GetCoins(std.GetOrigPkgAddr())\n\n\t// render\n\tres := \"\"\n\tres += \"## recent activity\\n\"\n\tres += \"\\n\"\n\tfor _, act := range latest {\n\t\tif act == nil {\n\t\t\tbreak\n\t\t}\n\t\tres += \" * \" + act.String() + \"\\n\"\n\t}\n\tres += \"\\n\"\n\tres += \"## total deposits\\n\"\n\tres += coins.String()\n\treturn res\n}\n```\n\nYou can call this contract yourself, by vistiing [/r/demo/banktest](/r/demo/banktest) and the [quickstart guide](/r/demo/boards:testboard/4).\n"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"iZX/llZlNTdZMLv1goCTgK2bWqzT8enlTq56wMTCpVxJGA0BTvuEM5Nnt9vrnlG6Taqj2GuTrmEnJBkDFTmt9g=="}],"memo":""} {"msg":[{"@type":"/vm.m_call","caller":"g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj","send":"","pkg_path":"gno.land/r/demo/boards","func":"CreateThread","args":["1","TASK: Describe in your words","Describe in an essay (250+ words), on your favorite medium, why you are interested in gno.land and gnolang.\n\nReply here with a URL link to your written piece as a comment, for rewards.\n"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AmG6kzznyo1uNqWPAYU6wDpsmzQKDaEOrVRaZ08vOyX0"},"signature":"4HBNtrta8HdeHj4JTN56PBTRK8GOe31NMRRXDiyYtjozuyRdWfOGEsGjGgHWcoBUJq6DepBgD4FetdqfhZ6TNQ=="}],"memo":""} -{"msg":[{"@type":"/vm.m_call","caller":"g1manfred47kzduec920z88wfr64ylksmdcedlf5","send":"","pkg_path":"gno.land/r/demo/boards","func":"CreateThread","args":["1","Getting Started","This is a demo of Gno smart contract programming. This document was\nconstructed by Gno onto a smart contract hosted on the data Realm\nname [\"gno.land/r/demo/boards\"](https://gno.land/r/demo/boards/)\n([github](https://github.com/gnolang/gno/tree/master/examples/gno.land/r/demo/boards)).\n\n\n\n## Build `gnokey`, create your account, and interact with Gno.\n\nNOTE: Where you see `--remote localhost:26657` here, that flag can be replaced\nwith `--remote localhost:26657` for local testnets.\n\n### Build `gnokey`.\n\n```bash\ngit clone git@github.com:gnolang/gno.git\ncd ./gno\nmake\n```\n\n### Generate a seed/mnemonic code.\n\n```bash\n./build/gnokey generate\n```\n\nNOTE: You can generate 24 words with any good bip39 generator.\n\n### Create a new account using your mnemonic.\n\n```bash\n./build/gnokey add KEYNAME --recover\n```\n\nNOTE: `KEYNAME` is your key identifier, and should be changed.\n\n### Verify that you can see your account locally.\n\n```bash\n./build/gnokey list\n```\n\n## Interact with the blockchain:\n\n### Get your current balance, account number, and sequence number.\n\n```bash\n./build/gnokey query auth/accounts/ACCOUNT_ADDR --remote localhost:26657\n```\n\nNOTE: you can retrieve your `ACCOUNT_ADDR` with `./build/gnokey list`.\n\n### Acquire testnet tokens using the official faucet.\n\nGo to https://gno.land/faucet\n\n### Create a board with a smart contract call.\n\nNOTE: `BOARDNAME` will be the slug of the board, and should be changed.\n\n```bash\n./build/gnokey maketx call KEYNAME --pkgpath \"gno.land/r/demo/boards\" --func \"CreateBoard\" --args \"BOARDNAME\" --gas-fee \"1000000ugnot\" --gas-wanted \"2000000\" --broadcast=true --chainid portal-loop --remote localhost:26657\n```\n\nInteractive documentation: https://gno.land/r/demo/boards?help\u0026__func=CreateBoard\n\nNext, query for the permanent board ID by querying (you need this to create a new post):\n\n```bash\n./build/gnokey query \"vm/qeval\" --data \"gno.land/r/demo/boards.GetBoardIDFromName(\\\"BOARDNAME\\\")\" --remote localhost:26657\n```\n\n### Create a post of a board with a smart contract call.\n\nNOTE: If a board was created successfully, your SEQUENCE_NUMBER would have increased.\n\n```bash\n./build/gnokey maketx call KEYNAME --pkgpath \"gno.land/r/demo/boards\" --func \"CreateThread\" --args BOARD_ID --args \"Hello gno.land\" --args\\#file \"./examples/gno.land/r/demo/boards/example_post.md\" --gas-fee 1000000ugnot --gas-wanted 2000000 --broadcast=true --chainid portal-loop --remote localhost:26657\n```\n\nInteractive documentation: https://gno.land/r/demo/boards?help\u0026__func=CreateThread\n\n### Create a comment to a post.\n\n```bash\n./build/gnokey maketx call KEYNAME --pkgpath \"gno.land/r/demo/boards\" --func \"CreateReply\" --args \"BOARD_ID\" --args \"1\" --args \"1\" --args \"Nice to meet you too.\" --gas-fee 1000000ugnot --gas-wanted 2000000 --broadcast=true --chainid portal-loop --remote localhost:26657\n```\n\nInteractive documentation: https://gno.land/r/demo/boards?help\u0026__func=CreateReply\n\n```bash\n./build/gnokey query \"vm/qrender\" --data \"gno.land/r/demo/boards:BOARDNAME/1\" --remote localhost:26657\n```\n\n### Render page with optional path expression.\n\nThe contents of `https://gno.land/r/demo/boards:` and `https://gno.land/r/demo/boards:gnolang` are rendered by calling\nthe `Render(path string)` function like so:\n\n```bash\n./build/gnokey query \"vm/qrender\" --data \"gno.land/r/demo/boards:gnolang\"\n```\n\n## Starting a local `gnoland` node:\n\n### Add test account.\n\n```bash\n./build/gnokey add test1 --recover\n```\n\nUse this mneonic:\n\u003e source bonus chronic canvas draft south burst lottery vacant surface solve popular case indicate oppose farm nothing bullet exhibit title speed wink action roast\n\n### Start `gnoland` node.\n\n```bash\n./build/gnoland\n```\n\nNOTE: This can be reset with `make reset`\n\n### Publish the \"gno.land/p/demo/avl\" package.\n\n```bash\n./build/gnokey maketx addpkg test1 --pkgpath \"gno.land/p/demo/avl\" --pkgdir \"examples/gno.land/p/demo/avl\" --deposit 100000000ugnot --gas-fee 1000000ugnot --gas-wanted 2000000 --broadcast=true --chainid portal-loop --remote localhost:26657\n```\n\n### Publish the \"gno.land/r/demo/boards\" realm package.\n\n```bash\n./build/gnokey maketx addpkg test1 --pkgpath \"gno.land/r/demo/boards\" --pkgdir \"examples/gno.land/r/demo/boards\" --deposit 100000000ugnot --gas-fee 1000000ugnot --gas-wanted 300000000 --broadcast=true --chainid portal-loop --remote localhost:26657\n```\n"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"sHjOGXZEi9wt2FSXFHmkDDoVQyepvFHKRDDU0zgedHYnCYPx5/YndyihsDD5Y2Z7/RgNYBh4JlJwDMGFNStzBQ=="}],"memo":""} -{"msg":[{"@type":"/vm.m_call","caller":"g1manfred47kzduec920z88wfr64ylksmdcedlf5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["post1","First post","Lorem Ipsum","2022-05-20T13:17:22Z","","tag1,tag2"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"sHjOGXZEi9wt2FSXFHmkDDoVQyepvFHKRDDU0zgedHYnCYPx5/YndyihsDD5Y2Z7/RgNYBh4JlJwDMGFNStzBQ=="}],"memo":""} -{"msg":[{"@type":"/vm.m_call","caller":"g1manfred47kzduec920z88wfr64ylksmdcedlf5","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["post2","Second post","Lorem Ipsum","2022-05-20T13:17:23Z","","tag1,tag3"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"sHjOGXZEi9wt2FSXFHmkDDoVQyepvFHKRDDU0zgedHYnCYPx5/YndyihsDD5Y2Z7/RgNYBh4JlJwDMGFNStzBQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/demo/boards","func":"CreateThread","args":["1","Getting Started","This is a demo of Gno smart contract programming. This document was\nconstructed by Gno onto a smart contract hosted on the data Realm\nname [\"gno.land/r/demo/boards\"](https://gno.land/r/demo/boards/)\n([github](https://github.com/gnolang/gno/tree/master/examples/gno.land/r/demo/boards)).\n\n\n\n## Build `gnokey`, create your account, and interact with Gno.\n\nNOTE: Where you see `--remote localhost:26657` here, that flag can be replaced\nwith `--remote localhost:26657` for local testnets.\n\n### Build `gnokey`.\n\n```bash\ngit clone git@github.com:gnolang/gno.git\ncd ./gno\nmake\n```\n\n### Generate a seed/mnemonic code.\n\n```bash\n./build/gnokey generate\n```\n\nNOTE: You can generate 24 words with any good bip39 generator.\n\n### Create a new account using your mnemonic.\n\n```bash\n./build/gnokey add KEYNAME --recover\n```\n\nNOTE: `KEYNAME` is your key identifier, and should be changed.\n\n### Verify that you can see your account locally.\n\n```bash\n./build/gnokey list\n```\n\n## Interact with the blockchain:\n\n### Get your current balance, account number, and sequence number.\n\n```bash\n./build/gnokey query auth/accounts/ACCOUNT_ADDR --remote localhost:26657\n```\n\nNOTE: you can retrieve your `ACCOUNT_ADDR` with `./build/gnokey list`.\n\n### Acquire testnet tokens using the official faucet.\n\nGo to https://gno.land/faucet\n\n### Create a board with a smart contract call.\n\nNOTE: `BOARDNAME` will be the slug of the board, and should be changed.\n\n```bash\n./build/gnokey maketx call KEYNAME --pkgpath \"gno.land/r/demo/boards\" --func \"CreateBoard\" --args \"BOARDNAME\" --gas-fee \"1000000ugnot\" --gas-wanted \"2000000\" --broadcast=true --chainid portal-loop --remote localhost:26657\n```\n\nInteractive documentation: https://gno.land/r/demo/boards?help\u0026__func=CreateBoard\n\nNext, query for the permanent board ID by querying (you need this to create a new post):\n\n```bash\n./build/gnokey query \"vm/qeval\" --data \"gno.land/r/demo/boards.GetBoardIDFromName(\\\"BOARDNAME\\\")\" --remote localhost:26657\n```\n\n### Create a post of a board with a smart contract call.\n\nNOTE: If a board was created successfully, your SEQUENCE_NUMBER would have increased.\n\n```bash\n./build/gnokey maketx call KEYNAME --pkgpath \"gno.land/r/demo/boards\" --func \"CreateThread\" --args BOARD_ID --args \"Hello gno.land\" --args\\#file \"./examples/gno.land/r/demo/boards/example_post.md\" --gas-fee 1000000ugnot --gas-wanted 2000000 --broadcast=true --chainid portal-loop --remote localhost:26657\n```\n\nInteractive documentation: https://gno.land/r/demo/boards?help\u0026__func=CreateThread\n\n### Create a comment to a post.\n\n```bash\n./build/gnokey maketx call KEYNAME --pkgpath \"gno.land/r/demo/boards\" --func \"CreateReply\" --args \"BOARD_ID\" --args \"1\" --args \"1\" --args \"Nice to meet you too.\" --gas-fee 1000000ugnot --gas-wanted 2000000 --broadcast=true --chainid portal-loop --remote localhost:26657\n```\n\nInteractive documentation: https://gno.land/r/demo/boards?help\u0026__func=CreateReply\n\n```bash\n./build/gnokey query \"vm/qrender\" --data \"gno.land/r/demo/boards:BOARDNAME/1\" --remote localhost:26657\n```\n\n### Render page with optional path expression.\n\nThe contents of `https://gno.land/r/demo/boards:` and `https://gno.land/r/demo/boards:gnolang` are rendered by calling\nthe `Render(path string)` function like so:\n\n```bash\n./build/gnokey query \"vm/qrender\" --data \"gno.land/r/demo/boards:gnolang\"\n```\n\n## Starting a local `gnoland` node:\n\n### Add test account.\n\n```bash\n./build/gnokey add test1 --recover\n```\n\nUse this mneonic:\n\u003e source bonus chronic canvas draft south burst lottery vacant surface solve popular case indicate oppose farm nothing bullet exhibit title speed wink action roast\n\n### Start `gnoland` node.\n\n```bash\n./build/gnoland\n```\n\nNOTE: This can be reset with `make reset`\n\n### Publish the \"gno.land/p/demo/avl\" package.\n\n```bash\n./build/gnokey maketx addpkg test1 --pkgpath \"gno.land/p/demo/avl\" --pkgdir \"examples/gno.land/p/demo/avl\" --deposit 100000000ugnot --gas-fee 1000000ugnot --gas-wanted 2000000 --broadcast=true --chainid portal-loop --remote localhost:26657\n```\n\n### Publish the \"gno.land/r/demo/boards\" realm package.\n\n```bash\n./build/gnokey maketx addpkg test1 --pkgpath \"gno.land/r/demo/boards\" --pkgdir \"examples/gno.land/r/demo/boards\" --deposit 100000000ugnot --gas-fee 1000000ugnot --gas-wanted 300000000 --broadcast=true --chainid portal-loop --remote localhost:26657\n```\n"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"sHjOGXZEi9wt2FSXFHmkDDoVQyepvFHKRDDU0zgedHYnCYPx5/YndyihsDD5Y2Z7/RgNYBh4JlJwDMGFNStzBQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["post1","First post","Lorem Ipsum","2022-05-20T13:17:22Z","","tag1,tag2"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"sHjOGXZEi9wt2FSXFHmkDDoVQyepvFHKRDDU0zgedHYnCYPx5/YndyihsDD5Y2Z7/RgNYBh4JlJwDMGFNStzBQ=="}],"memo":""} +{"msg":[{"@type":"/vm.m_call","caller":"g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddPost","args":["post2","Second post","Lorem Ipsum","2022-05-20T13:17:23Z","","tag1,tag3"]}],"fee":{"gas_wanted":"2000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AnK+a6mcFDjY6b/v6p7r8QFW1M1PgIoQxBgrwOoyY7v3"},"signature":"sHjOGXZEi9wt2FSXFHmkDDoVQyepvFHKRDDU0zgedHYnCYPx5/YndyihsDD5Y2Z7/RgNYBh4JlJwDMGFNStzBQ=="}],"memo":""} {"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"k2K8oibebL+to1FpokRUGP/CRdrNDR/PjoAH+d9kCSUkAdV4UNPhbbkaiFzXUTTdZZHJgSno3kP3xUYRaq9HQA=="}],"memo":""} {"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"7et5t7tSiG5IZwYxdvnDEv/ym5PAM5ebLLpATNuAv1AhI48QrwGihejbZUdVn6EEA/ywCLDnsIRiWZKzwpI5jw=="}],"memo":""} {"msg":[{"@type":"/vm.m_addpkg","creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","package":{"name":"","path":"","files":null},"deposit":""}],"fee":{"gas_wanted":"800000","gas_fee":"10000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"A+FhNtsXHjLfSJk1lB8FbiL4mGPjc50Kt81J7EKDnJ2y"},"signature":"r97O5/ZESx5kYStEgY49uyaCy2VcmC3lm+OZjJFN5Vs0ZNQNR34TWpVzT0vwUYNxoEr9AzFFvqPDsWmV3d8k0A=="}],"memo":""} @@ -5540,3 +5539,4 @@ {"msg":[{"@type":"/vm.m_call","caller":"g16spe09atej02lcgxwqfpnk6l2ghqvm56z6hsyv","send":"","pkg_path":"gno.land/r/gnoland/blog","func":"ModAddCommenter","args":["g16spe09atej02lcgxwqfpnk6l2ghqvm56z6hsyv"]}],"fee":{"gas_wanted":"10000000","gas_fee":"50000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AytBvtveRsnaHgNxVwvLpAY6gvUnY1U0TbUvlHLra3aJ"},"signature":"wJx9ZnXRABwPIwd9wprlyJ9tOMl57tuJQbSzbNvE0nkKWix7llRik0jeKWjKYc16wqzB8COpQ3BC+gw4atVijQ=="}],"memo":"Called through gno.studio"} {"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1k5apa2pxkug7nfaxcs2lp0cxc86yrczfjmpsv2","amount":"1000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"EhI4+Jdbap+3SGBqDFmpgRIGkwLBsYpOv2BQK0bkmZASzbvnXryHqZ26n9GkbhIl3zmE+1sv3yP5tEX7AuNdkw=="}],"memo":""} {"msg":[{"@type":"/vm.m_call","caller":"g10ahumypepd2qcrau7kahv8q78f7jcdns5tn54a","send":"","pkg_path":"gno.land/r/demo/memeland","func":"PostMeme","args":["data:image/jpeg;base64,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tAgggEdq8DCQrOBW2hQBr2+wH1z614UbhjAxW2vMUAavK2qykD2r1CNueAB6AVtrygAJGAKYvXX/AAP6t/zByn3TE66/4H9W/wCYOUAQ/wBEf8XHVn9CT/omhQ6I/wCLjqz+hJ/0TQoAs3QoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABQoUKABTE66/4H9W/5g5T7piddf8AA/q3/MHKAIf6I/4uOrP6En/RNCh0R/xcdWf0JP8AomhQBZuhQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUAChQoUACmJ11/wP6t/wAwcp90xOuv+B/Vv+YOUAQ/0R/xcdWf0JP+iaFDoj/i46s/oSf9E0KALN0KFCgAUK8zQzQB7QrzIoZpreAPaFeZrErpU8gZ0K1lQB/9FeFwDvnFKIzbQrWFj0rIqwMntQKek817Wkq5717v/wDXFA3JsyK9rVuP41kFHFJkVGdCsd1eFdKKZZr2tW/nArIHnvQBnQrzNeZoAyoVrKu9AHI9qblAZ5Fe1qNAKpwmTbQrEHFe7h70CntCvMihuFNygPaFeZzXhNOAyoVhn8aG78aAM6FeZrzJ9qAMqFebvehkUAe0K8zQzQB7QrysFO7aANlCtPm5P3TWQVkdjQJk2UK15/GvSrA70CZM6Fa9wr3dxnNAuTOhWAUB617uB7GgUyoVh2r3PbAoAyoV5nmhnNAHtCteRXpVwKBuTOhWvdjP0rLduTQGT0HJr2tecGhkU1sVM2UKwC/oa93H2pRTKhWGaAP404bkyoZrEHJ/214VY7ijAZNlCsA4O1elWPakFye5r2tZODishQGTKhXmeK8JzQKe5pi9df8A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","1727362988"]}],"fee":{"gas_wanted":"10000000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AidlxNTtkl1dDNCgxrSNVJKYWZdC9yrixvgSAP6U6WYX"},"signature":"Vx6tk1FskMHCYk55p9MTaC714VC+IxelMfG9BUbzsSsljBkhCCA4yLUEuPl+ITzz78YjLOPPaTmDe+fLrauvUg=="}],"memo":""} +{"msg":[{"@type":"/bank.MsgSend","from_address":"g1qhuef2450xh7g7na8s865nreu2xw8j84kgkvt5","to_address":"g1anajhdr28jlh4dd6dz5pzdjk0dsyqvc4ayk0aa","amount":"10000000ugnot"}],"fee":{"gas_wanted":"100000","gas_fee":"1000000ugnot"},"signatures":[{"pub_key":{"@type":"/tm.PubKeySecp256k1","value":"AwEKz9MRdU4MCAzB3el9G4wLJJQeWiRYtRquzEgm19Z2"},"signature":"dylcJi4Rg6cpxyKJQjWvAspFFpPgJCzmpQxWqEzhzgA0xEgWFrje4pUuAf6vIAZzMX446CAOTpl8EIWJBuaf9Q=="}],"memo":""} diff --git a/portal-loop/export.sh b/portal-loop/export.sh index db7314a2..e06d96c8 100755 --- a/portal-loop/export.sh +++ b/portal-loop/export.sh @@ -1,65 +1,83 @@ #!/bin/bash # Define the constants -TMP_DIR=temp-gno -TIMESTAMP=$(date +%s) -POTENTIAL_BACKUP_NAME=backup.portal.loop.${TIMESTAMP}.jsonl -GENESIS_NAME=genesis.json +TMP_DIR=temp-gno # Temporary directory for the working data +BACKUP_NAME=backup_portal.loop.$(date +%s).jsonl +GENESIS=genesis.json +WGET_OUTPUT=wget-genesis.json +BACKUP_PREFIX=backup_ # Create the temporary working dir mkdir $TMP_DIR -cd $TMP_DIR - -output_diff=diff.jsonl -backup_name=backup.tmp.jsonl +cd $TMP_DIR || exit 1 # Grab the latest genesis.json -wget -O $GENESIS_NAME https://rpc.gno.land/genesis +wget -O $WGET_OUTPUT https://rpc.gno.land/genesis + +# Extract the wget genesis response +jq ".result.genesis" $WGET_OUTPUT > $GENESIS # Install the gnoland binary git clone https://github.com/gnolang/gno.git -cd gno/gno.land +cd gno/gno.land || exit 1 make build.gnoland -cd ../.. +cd ../.. # move back to the portal-loop directory -jq ".result.genesis" $GENESIS_NAME > temp_$GENESIS_NAME -./gno/gno.land/build/gnoland genesis txs export -genesis-path temp_$GENESIS_NAME $backup_name +# Extract the genesis transactions +./gno/gno.land/build/gnoland genesis txs export -genesis-path $GENESIS "$BACKUP_NAME" -rm temp_$GENESIS_NAME $GENESIS_NAME +# Clean up the downloaded genesis.json and the wget response +rm $GENESIS $WGET_OUTPUT # Find the latest backup file based on the Unix timestamp in the filename -latest_backup_file=$(ls ../backup.*.jsonl 2>/dev/null | sort -t'-' -k2,2n | tail -n 1) +LATEST_BACKUP_FILE=$(ls ../"$BACKUP_PREFIX"*.jsonl 2>/dev/null | sort -t'-' -k2,2n | tail -n 1) + +# Check if there is an existing backup +if [[ -z "$LATEST_BACKUP_FILE" ]]; then + # Save the initial backup + echo "Saving initial backup to $BACKUP_NAME" + + # Make the backup file official + cp "$BACKUP_NAME" ../"$BACKUP_NAME" -# Check if a file was found -if [[ -z "$latest_backup_file" ]]; then - # just save file - echo "Saving first time" - cp $backup_name ../$POTENTIAL_BACKUP_NAME + # Remove the temporary working directory + cd .. || exit 1 rm -rf $TMP_DIR exit 0 -else - echo "Latest backup file: $latest_backup_file" - sort $latest_backup_file > ./latest.jsonl - sort $backup_name > temp_$backup_name +fi - rm $backup_name +# There is an existing backup already, check it +echo "Latest backup file: $LATEST_BACKUP_FILE" - # Use comm to find lines only in file2 (additions) and write to output file - comm -13 ./latest.jsonl temp_$backup_name > $output_diff +LATEST_BACKUP_SORTED=latest_backup_sort.jsonl - # Cleanup temporary sorted files - # rm sorted_file1.jsonl sorted_file2.jsonl -fi +# Sort the latest backup file +sort "$LATEST_BACKUP_FILE" > "$LATEST_BACKUP_SORTED" + +# Sort the latest genesis tx sheet +sort "$BACKUP_NAME" > temp_"$BACKUP_NAME" + +# Clean up the temporary backup file +rm "$BACKUP_NAME" + +DIFF_TXS=diff.jsonl + +# Use comm to find lines only in file2 (additions) and write to output file +comm -13 ./"$LATEST_BACKUP_SORTED" temp_"$BACKUP_NAME" > "$DIFF_TXS" # Notify if differences were found -if [[ -z $(grep '[^[:space:]]' $output_diff) ]]; then +if [[ -z $(grep '[^[:space:]]' "$DIFF_TXS") ]]; then echo "No differences found." else echo "Differences found." - cp $output_diff ../$POTENTIAL_BACKUP_NAME + + cp "$DIFF_TXS" ../"$BACKUP_NAME" + + echo "Differences saved to $BACKUP_NAME" fi -cd .. +cd .. || exit 1 +# Clean up the temporary directory rm -rf $TMP_DIR From d04f929b9b5104ec90f199089576b1d74df201f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Milo=C5=A1=20=C5=BDivkovi=C4=87?= Date: Fri, 27 Sep 2024 19:17:41 +0200 Subject: [PATCH 04/10] Update scripts --- .../workflows/portal-loop-txs-exporter.yml | 10 +- extractor-0.1.1/main.go | 109 +- portal-loop/README.md | 112 +- .../extracted/p/Olawale22/mail/package.gno | 58 + .../p/Olawale22/mail/pkg_metadata.json | 1 + .../extracted/p/Olawale22/mail:0/package.gno | 33 + .../p/Olawale22/mail:0/pkg_metadata.json | 1 + portal-loop/extracted/p/counter/package.gno | 21 + .../extracted/p/counter/pkg_metadata.json | 1 + portal-loop/extracted/p/demo/acl/acl.gno | 102 ++ portal-loop/extracted/p/demo/acl/acl_test.gno | 134 ++ portal-loop/extracted/p/demo/acl/const.gno | 3 + portal-loop/extracted/p/demo/acl/perm.gno | 44 + portal-loop/extracted/p/demo/acl/perms.gno | 12 + .../extracted/p/demo/acl/pkg_metadata.json | 1 + portal-loop/extracted/p/demo/avl/node.gno | 487 ++++++ .../extracted/p/demo/avl/node_test.gno | 555 +++++++ .../extracted/p/demo/avl/pkg_metadata.json | 1 + portal-loop/extracted/p/demo/avl/tree.gno | 103 ++ .../extracted/p/demo/avl/tree_test.gno | 161 ++ .../extracted/p/demo/avl/z_0_filetest.gno | 330 ++++ .../extracted/p/demo/avl/z_1_filetest.gno | 405 +++++ .../extracted/p/demo/avl/z_2_filetest.gno | 320 ++++ .../p/demo/avlhelpers/avlhelpers.gno | 41 + .../p/demo/avlhelpers/pkg_metadata.json | 1 + .../p/demo/avlhelpers/z_0_filetest.gno | 91 ++ .../extracted/p/demo/bank/pkg_metadata.json | 1 + portal-loop/extracted/p/demo/bank/types.gno | 151 ++ portal-loop/extracted/p/demo/bf/bf.gno | 74 + portal-loop/extracted/p/demo/bf/bf_test.gno | 32 + portal-loop/extracted/p/demo/bf/doc.gno | 18 + .../extracted/p/demo/bf/pkg_metadata.json | 1 + portal-loop/extracted/p/demo/bf/run.gno | 8 + portal-loop/extracted/p/demo/blog/blog.gno | 398 +++++ .../extracted/p/demo/blog/blog_test.gno | 4 + portal-loop/extracted/p/demo/blog/errors.gno | 13 + .../extracted/p/demo/blog/pkg_metadata.json | 1 + portal-loop/extracted/p/demo/blog/util.gno | 18 + portal-loop/extracted/p/demo/cford32/LICENSE | 27 + .../extracted/p/demo/cford32/README.md | 76 + .../extracted/p/demo/cford32/cford32.gno | 700 +++++++++ .../extracted/p/demo/cford32/cford32_test.gno | 630 ++++++++ .../p/demo/cford32/pkg_metadata.json | 1 + .../extracted/p/demo/context/context.gno | 72 + .../extracted/p/demo/context/context_test.gno | 96 ++ .../p/demo/context/pkg_metadata.json | 1 + portal-loop/extracted/p/demo/diff/diff.gno | 217 +++ .../extracted/p/demo/diff/diff_test.gno | 182 +++ .../extracted/p/demo/diff/pkg_metadata.json | 1 + portal-loop/extracted/p/demo/dom/dom.gno | 69 + .../extracted/p/demo/dom/pkg_metadata.json | 1 + portal-loop/extracted/p/demo/echo1/echo.gno | 13 + .../extracted/p/demo/echo1/echo_test.gno | 12 + portal-loop/extracted/p/demo/echo1/gno.mod | 1 + .../extracted/p/demo/echo1/pkg_metadata.json | 1 + .../extracted/p/demo/entropy/entropy.gno | 89 ++ .../extracted/p/demo/entropy/entropy_test.gno | 46 + .../p/demo/entropy/pkg_metadata.json | 1 + .../extracted/p/demo/entropy/z_filetest.gno | 56 + portal-loop/extracted/p/demo/flow/LICENSE | 32 + portal-loop/extracted/p/demo/flow/README.md | 10 + portal-loop/extracted/p/demo/flow/flow.gno | 288 ++++ portal-loop/extracted/p/demo/flow/io.gno | 136 ++ portal-loop/extracted/p/demo/flow/io_test.gno | 217 +++ .../extracted/p/demo/flow/pkg_metadata.json | 1 + portal-loop/extracted/p/demo/flow/util.gno | 67 + .../extracted/p/demo/fqname/fqname.gno | 72 + .../extracted/p/demo/fqname/fqname_test.gno | 74 + .../extracted/p/demo/fqname/pkg_metadata.json | 1 + portal-loop/extracted/p/demo/gnode/gnode.gno | 65 + .../extracted/p/demo/gnode/pkg_metadata.json | 1 + .../p/demo/gnorkle/agent/pkg_metadata.json | 1 + .../p/demo/gnorkle/agent/whitelist.gno | 50 + .../p/demo/gnorkle/agent/whitelist_test.gno | 28 + .../extracted/p/demo/gnorkle/feed/errors.gno | 5 + .../p/demo/gnorkle/feed/pkg_metadata.json | 1 + .../extracted/p/demo/gnorkle/feed/task.gno | 7 + .../extracted/p/demo/gnorkle/feed/type.gno | 16 + .../extracted/p/demo/gnorkle/feed/value.gno | 9 + .../p/demo/gnorkle/feeds/static/feed.gno | 159 ++ .../p/demo/gnorkle/feeds/static/feed_test.gno | 255 +++ .../gnorkle/feeds/static/pkg_metadata.json | 1 + .../extracted/p/demo/gnorkle/gnorkle/feed.gno | 24 + .../p/demo/gnorkle/gnorkle/ingester.gno | 11 + .../p/demo/gnorkle/gnorkle/instance.gno | 239 +++ .../p/demo/gnorkle/gnorkle/pkg_metadata.json | 1 + .../p/demo/gnorkle/gnorkle/storage.gno | 11 + .../p/demo/gnorkle/gnorkle/whitelist.gno | 96 ++ .../p/demo/gnorkle/ingester/errors.gno | 5 + .../p/demo/gnorkle/ingester/pkg_metadata.json | 1 + .../p/demo/gnorkle/ingester/type.gno | 11 + .../gnorkle/ingesters/single/ingester.gno | 35 + .../ingesters/single/ingester_test.gno | 36 + .../ingesters/single/pkg_metadata.json | 1 + .../p/demo/gnorkle/message/parse.gno | 25 + .../p/demo/gnorkle/message/parse_test.gno | 47 + .../p/demo/gnorkle/message/pkg_metadata.json | 1 + .../extracted/p/demo/gnorkle/message/type.gno | 15 + .../p/demo/gnorkle/storage/errors.gno | 5 + .../p/demo/gnorkle/storage/pkg_metadata.json | 1 + .../gnorkle/storage/simple/pkg_metadata.json | 1 + .../p/demo/gnorkle/storage/simple/storage.gno | 56 + .../gnorkle/storage/simple/storage_test.gno | 70 + .../p/demo/grc/exts/pkg_metadata.json | 1 + .../p/demo/grc/exts/token_metadata.gno | 13 + .../extracted/p/demo/grc/grc1155/README.md | 9 + .../demo/grc/grc1155/basic_grc1155_token.gno | 347 ++++ .../grc/grc1155/basic_grc1155_token_test.gno | 289 ++++ .../extracted/p/demo/grc/grc1155/errors.gno | 13 + .../extracted/p/demo/grc/grc1155/igrc1155.gno | 40 + .../p/demo/grc/grc1155/pkg_metadata.json | 1 + .../extracted/p/demo/grc/grc1155/util.gno | 18 + .../extracted/p/demo/grc/grc20/banker.gno | 217 +++ .../p/demo/grc/grc20/banker_test.gno | 51 + .../p/demo/grc/grc20/pkg_metadata.json | 1 + .../extracted/p/demo/grc/grc20/token.gno | 45 + .../extracted/p/demo/grc/grc20/token_test.gno | 72 + .../extracted/p/demo/grc/grc20/types.gno | 61 + .../extracted/p/demo/grc/grc721/basic_nft.gno | 378 +++++ .../p/demo/grc/grc721/basic_nft_test.gno | 283 ++++ .../extracted/p/demo/grc/grc721/errors.gno | 22 + .../p/demo/grc/grc721/grc721_metadata.gno | 95 ++ .../demo/grc/grc721/grc721_metadata_test.gno | 107 ++ .../p/demo/grc/grc721/grc721_royalty.gno | 78 + .../p/demo/grc/grc721/grc721_royalty_test.gno | 70 + .../extracted/p/demo/grc/grc721/igrc721.gno | 38 + .../p/demo/grc/grc721/igrc721_metadata.gno | 38 + .../p/demo/grc/grc721/igrc721_royalty.gno | 16 + .../p/demo/grc/grc721/pkg_metadata.json | 1 + .../extracted/p/demo/grc/grc721/util.gno | 18 + .../p/demo/grc/grc777/dummy_test.gno | 41 + .../extracted/p/demo/grc/grc777/igrc777.gno | 169 ++ .../p/demo/grc/grc777/pkg_metadata.json | 1 + .../extracted/p/demo/groups/groups.gno | 8 + .../extracted/p/demo/groups/pkg_metadata.json | 1 + .../extracted/p/demo/groups/vote_set.gno | 105 ++ .../extracted/p/demo/groups/z_1_filetest.gno | 28 + portal-loop/extracted/p/demo/int256/LICENSE | 21 + portal-loop/extracted/p/demo/int256/README.md | 6 + .../extracted/p/demo/int256/absolute.gno | 18 + .../extracted/p/demo/int256/absolute_test.gno | 105 ++ .../extracted/p/demo/int256/arithmetic.gno | 202 +++ .../p/demo/int256/arithmetic_test.gno | 571 +++++++ .../extracted/p/demo/int256/bitwise.gno | 94 ++ .../extracted/p/demo/int256/bitwise_test.gno | 199 +++ portal-loop/extracted/p/demo/int256/cmp.gno | 86 + .../extracted/p/demo/int256/cmp_test.gno | 261 ++++ .../extracted/p/demo/int256/conversion.gno | 87 ++ .../p/demo/int256/conversion_test.gno | 234 +++ .../extracted/p/demo/int256/int256.gno | 126 ++ .../extracted/p/demo/int256/int256_test.gno | 23 + .../extracted/p/demo/int256/pkg_metadata.json | 1 + .../p/demo/json/eisel_lemire/eisel_lemire.gno | 839 ++++++++++ .../demo/json/eisel_lemire/pkg_metadata.json | 1 + .../extracted/p/demo/json/ryu/floatconv.gno | 143 ++ .../p/demo/json/ryu/floatconv_test.gno | 33 + .../p/demo/json/ryu/pkg_metadata.json | 1 + .../extracted/p/demo/json/ryu/ryu64.gno | 344 ++++ .../extracted/p/demo/json/ryu/table.gno | 678 ++++++++ portal-loop/extracted/p/demo/json:0/LICENSE | 21 + portal-loop/extracted/p/demo/json:0/README.md | 170 ++ .../extracted/p/demo/json:0/buffer.gno | 485 ++++++ .../extracted/p/demo/json:0/buffer_test.gno | 622 ++++++++ .../extracted/p/demo/json:0/decode.gno | 370 +++++ .../extracted/p/demo/json:0/decode_test.gno | 554 +++++++ .../extracted/p/demo/json:0/encode.gno | 128 ++ .../extracted/p/demo/json:0/encode_test.gno | 255 +++ .../extracted/p/demo/json:0/escape.gno | 300 ++++ .../extracted/p/demo/json:0/escape_test.gno | 222 +++ .../extracted/p/demo/json:0/indent.gno | 144 ++ .../extracted/p/demo/json:0/indent_test.gno | 84 + .../extracted/p/demo/json:0/internal.gno | 198 +++ portal-loop/extracted/p/demo/json:0/node.gno | 1083 +++++++++++++ .../extracted/p/demo/json:0/node_test.gno | 1392 +++++++++++++++++ .../extracted/p/demo/json:0/parser.gno | 185 +++ .../extracted/p/demo/json:0/parser_test.gno | 188 +++ portal-loop/extracted/p/demo/json:0/path.gno | 78 + .../extracted/p/demo/json:0/path_test.gno | 62 + .../extracted/p/demo/json:0/pkg_metadata.json | 1 + portal-loop/extracted/p/demo/json:0/token.gno | 76 + .../p/demo/math_eval/int32/int32.gno | 494 ++++++ .../p/demo/math_eval/int32/int32_test.gno | 73 + .../p/demo/math_eval/int32/pkg_metadata.json | 1 + .../extracted/p/demo/memeland/memeland.gno | 240 +++ .../p/demo/memeland/memeland_test.gno | 282 ++++ .../p/demo/memeland/pkg_metadata.json | 1 + portal-loop/extracted/p/demo/merkle/README.md | 20 + .../extracted/p/demo/merkle/merkle.gno | 143 ++ .../extracted/p/demo/merkle/merkle_test.gno | 69 + .../extracted/p/demo/merkle/pkg_metadata.json | 1 + .../extracted/p/demo/microblog/microblog.gno | 124 ++ .../p/demo/microblog/pkg_metadata.json | 1 + portal-loop/extracted/p/demo/mux/doc.gno | 36 + portal-loop/extracted/p/demo/mux/handler.gno | 12 + portal-loop/extracted/p/demo/mux/helpers.gno | 5 + .../extracted/p/demo/mux/pkg_metadata.json | 1 + portal-loop/extracted/p/demo/mux/request.gno | 35 + .../extracted/p/demo/mux/request_test.gno | 39 + portal-loop/extracted/p/demo/mux/response.gno | 20 + portal-loop/extracted/p/demo/mux/router.gno | 68 + .../extracted/p/demo/mux/router_test.gno | 38 + .../extracted/p/demo/nestedpkg/nestedpkg.gno | 89 ++ .../p/demo/nestedpkg/pkg_metadata.json | 1 + .../extracted/p/demo/ownable/errors.gno | 8 + .../exts/authorizable/authorizable.gno | 90 ++ .../exts/authorizable/authorizable_test.gno | 116 ++ .../demo/ownable/exts/authorizable/errors.gno | 9 + .../exts/authorizable/pkg_metadata.json | 1 + .../extracted/p/demo/ownable/ownable.gno | 87 ++ .../extracted/p/demo/ownable/ownable_test.gno | 116 ++ .../p/demo/ownable/pkg_metadata.json | 1 + .../extracted/p/demo/pausable/pausable.gno | 49 + .../p/demo/pausable/pausable_test.gno | 61 + .../p/demo/pausable/pkg_metadata.json | 1 + .../p/demo/printfdebugging/color.gno | 81 + .../p/demo/printfdebugging/pkg_metadata.json | 1 + .../demo/printfdebugging/printfdebugging.gno | 19 + portal-loop/extracted/p/demo/rat/maths.gno | 21 + .../extracted/p/demo/rat/pkg_metadata.json | 1 + portal-loop/extracted/p/demo/rat/rat.gno | 47 + .../extracted/p/demo/releases/changelog.gno | 72 + .../p/demo/releases/pkg_metadata.json | 1 + .../extracted/p/demo/releases/release.gno | 38 + portal-loop/extracted/p/demo/seqid/README.md | 36 + .../extracted/p/demo/seqid/pkg_metadata.json | 1 + portal-loop/extracted/p/demo/seqid/seqid.gno | 91 ++ .../extracted/p/demo/seqid/seqid_test.gno | 68 + .../extracted/p/demo/stack/pkg_metadata.json | 1 + portal-loop/extracted/p/demo/stack/stack.gno | 43 + .../extracted/p/demo/stack/stack_test.gno | 28 + .../extracted/p/demo/subscription/doc.gno | 66 + .../p/demo/subscription/lifetime/errors.gno | 10 + .../p/demo/subscription/lifetime/lifetime.gno | 81 + .../subscription/lifetime/lifetime_test.gno | 105 ++ .../subscription/lifetime/pkg_metadata.json | 1 + .../p/demo/subscription/pkg_metadata.json | 1 + .../p/demo/subscription/recurring/errors.gno | 11 + .../subscription/recurring/pkg_metadata.json | 1 + .../demo/subscription/recurring/recurring.gno | 104 ++ .../subscription/recurring/recurring_test.gno | 134 ++ .../p/demo/subscription/subscription.gno | 12 + portal-loop/extracted/p/demo/svg/doc.gno | 17 + .../extracted/p/demo/svg/pkg_metadata.json | 1 + portal-loop/extracted/p/demo/svg/svg.gno | 82 + .../extracted/p/demo/svg/z0_filetest.gno | 15 + .../extracted/p/demo/svg/z1_filetest.gno | 19 + .../p/demo/tamagotchi/pkg_metadata.json | 1 + .../p/demo/tamagotchi/tamagotchi.gno | 175 +++ .../p/demo/tamagotchi/z0_filetest.gno | 105 ++ .../extracted/p/demo/ternary/README.md | 51 + .../p/demo/ternary/pkg_metadata.json | 1 + .../extracted/p/demo/ternary/ternary.gno | 115 ++ .../extracted/p/demo/ternary/ternary_test.gno | 48 + .../demo/tests/p_crossrealm/p_crossrealm.gno | 24 + .../demo/tests/p_crossrealm/pkg_metadata.json | 1 + .../p/demo/tests/subtests/pkg_metadata.json | 1 + .../p/demo/tests/subtests/subtests.gno | 17 + .../extracted/p/demo/tests:0/README.md | 2 + .../p/demo/tests:0/pkg_metadata.json | 1 + .../extracted/p/demo/tests:0/tests.gno | 74 + .../extracted/p/demo/tests:0/tests_test.gno | 19 + .../extracted/p/demo/tests:0/z0_filetest.gno | 16 + .../extracted/p/demo/testutils/access.gno | 43 + .../extracted/p/demo/testutils/crypto.gno | 16 + .../extracted/p/demo/testutils/misc.gno | 6 + .../p/demo/testutils/pkg_metadata.json | 1 + .../extracted/p/demo/tictactoe/game.gno | 217 +++ .../extracted/p/demo/tictactoe/game_test.gno | 80 + .../p/demo/tictactoe/pkg_metadata.json | 1 + .../p/demo/tictactoe/tictactoe1p/1pvscpu.gno | 104 ++ .../tictactoe/tictactoe1p/1pvscpu_test.gno | 100 ++ .../p/demo/tictactoe/tictactoe1p/README.md | 6 + .../p/demo/tictactoe/tictactoe1p/ai.gno | 33 + .../tictactoe/tictactoe1p/pkg_metadata.json | 1 + .../p/demo/todolist/pkg_metadata.json | 1 + .../extracted/p/demo/todolist/todolist.gno | 63 + .../p/demo/todolist/todolist_test.gno | 58 + portal-loop/extracted/p/demo/uassert/doc.gno | 1 + .../extracted/p/demo/uassert/helpers.gno | 51 + .../extracted/p/demo/uassert/mock_test.gno | 59 + .../p/demo/uassert/pkg_metadata.json | 1 + .../extracted/p/demo/uassert/types.gno | 11 + .../extracted/p/demo/uassert/uassert.gno | 463 ++++++ .../extracted/p/demo/uassert/uassert_test.gno | 367 +++++ .../extracted/p/demo/ufmt/pkg_metadata.json | 1 + portal-loop/extracted/p/demo/ufmt/ufmt.gno | 284 ++++ .../extracted/p/demo/ufmt/ufmt_test.gno | 179 +++ .../extracted/p/demo/ui/pkg_metadata.json | 1 + portal-loop/extracted/p/demo/ui/ui.gno | 229 +++ portal-loop/extracted/p/demo/ui/ui_test.gno | 1 + portal-loop/extracted/p/demo/uint256/LICENSE | 28 + .../extracted/p/demo/uint256/README.md | 5 + .../extracted/p/demo/uint256/arithmetic.gno | 472 ++++++ .../p/demo/uint256/arithmetic_test.gno | 326 ++++ .../extracted/p/demo/uint256/bits_table.gno | 79 + .../extracted/p/demo/uint256/bitwise.gno | 264 ++++ .../extracted/p/demo/uint256/bitwise_test.gno | 344 ++++ portal-loop/extracted/p/demo/uint256/cmp.gno | 125 ++ .../extracted/p/demo/uint256/cmp_test.gno | 163 ++ .../extracted/p/demo/uint256/conversion.gno | 570 +++++++ .../p/demo/uint256/conversion_test.gno | 58 + .../extracted/p/demo/uint256/error.gno | 73 + portal-loop/extracted/p/demo/uint256/mod.gno | 605 +++++++ .../p/demo/uint256/pkg_metadata.json | 1 + .../extracted/p/demo/uint256/uint256.gno | 291 ++++ .../extracted/p/demo/uint256/utils.gno | 180 +++ .../p/demo/urequire/pkg_metadata.json | 1 + .../extracted/p/demo/urequire/urequire.gno | 103 ++ .../p/demo/urequire/urequire_test.gno | 8 + .../extracted/p/demo/users/pkg_metadata.json | 1 + portal-loop/extracted/p/demo/users/types.gno | 14 + portal-loop/extracted/p/demo/users/users.gno | 31 + .../extracted/p/demo/users/users_test.gno | 1 + .../p/demo/watchdog/pkg_metadata.json | 1 + .../extracted/p/demo/watchdog/watchdog.gno | 39 + .../p/demo/watchdog/watchdog_test.gno | 16 + .../gnome/alerts/alerts.gno | 64 + .../gnome/alerts/pkg_metadata.json | 1 + .../gnome/blog/LICENSE | 62 + .../gnome/blog/asserts.gno | 88 ++ .../gnome/blog/asserts_test.gno | 191 +++ .../gnome/blog/blog.gno | 63 + .../gnome/blog/invar.gno | 94 ++ .../gnome/blog/pkg_metadata.json | 1 + .../gnome/blog/post.gno | 160 ++ .../gnome/dao/LICENSE | 62 + .../gnome/dao/dao.gno | 417 +++++ .../gnome/dao/dao_test.gno | 448 ++++++ .../gnome/dao/id.gno | 30 + .../gnome/dao/marshal.gno | 162 ++ .../gnome/dao/pkg_metadata.json | 1 + .../gnome/dao/proposal.gno | 596 +++++++ .../gnome/dao/proposal_test.gno | 636 ++++++++ .../gnome/dao/record.gno | 131 ++ .../gnome/dao/record_test.gno | 76 + .../gnome/dao/render.gno | 27 + .../gnome/dao/strategy.gno | 67 + .../gnome/dao/uri.gno | 33 + .../gnome/dao/uri_test.gno | 82 + portal-loop/extracted/p/gnome/alerts/LICENSE | 62 + .../extracted/p/gnome/alerts/alerts.gno | 64 + .../p/gnome/alerts/pkg_metadata.json | 1 + portal-loop/extracted/p/gnome/blog/LICENSE | 62 + .../extracted/p/gnome/blog/asserts.gno | 88 ++ .../extracted/p/gnome/blog/asserts_test.gno | 191 +++ portal-loop/extracted/p/gnome/blog/blog.gno | 63 + portal-loop/extracted/p/gnome/blog/invar.gno | 94 ++ .../extracted/p/gnome/blog/pkg_metadata.json | 1 + portal-loop/extracted/p/gnome/blog/post.gno | 160 ++ portal-loop/extracted/p/gnome/dao/LICENSE | 62 + portal-loop/extracted/p/gnome/dao/dao.gno | 400 +++++ .../extracted/p/gnome/dao/dao_test.gno | 448 ++++++ portal-loop/extracted/p/gnome/dao/id.gno | 30 + portal-loop/extracted/p/gnome/dao/invar.gno | 234 +++ .../extracted/p/gnome/dao/paginator.gno | 162 ++ .../extracted/p/gnome/dao/paginator_test.gno | 139 ++ portal-loop/extracted/p/gnome/dao/params.gno | 93 ++ .../extracted/p/gnome/dao/pkg_metadata.json | 1 + .../extracted/p/gnome/dao/proposal.gno | 597 +++++++ .../extracted/p/gnome/dao/proposal_test.gno | 636 ++++++++ portal-loop/extracted/p/gnome/dao/record.gno | 131 ++ .../extracted/p/gnome/dao/record_test.gno | 76 + portal-loop/extracted/p/gnome/dao/render.gno | 27 + .../extracted/p/gnome/dao/strategy.gno | 67 + portal-loop/extracted/p/gnome/dao/uri.gno | 33 + .../extracted/p/gnome/dao/uri_test.gno | 82 + portal-loop/extracted/p/gnome/router/LICENSE | 62 + .../p/gnome/router/pkg_metadata.json | 1 + .../extracted/p/gnome/router/router.gno | 101 ++ .../extracted/p/gnome/router/v1/LICENSE | 62 + .../p/gnome/router/v1/pkg_metadata.json | 1 + .../extracted/p/gnome/router/v1/router.gno | 141 ++ .../p/gnome/router/v1/router_test.gno | 166 ++ .../p/gov/proposal/pkg_metadata.json | 1 + .../extracted/p/gov/proposal/proposal.gno | 106 ++ .../p/gov/proposal/proposal_test.gno | 156 ++ .../extracted/p/gov/proposal/types.gno | 37 + portal-loop/extracted/p/hello/package.gno | 5 + .../extracted/p/hello/pkg_metadata.json | 1 + portal-loop/extracted/p/hello:0/package.gno | 5 + .../extracted/p/hello:0/pkg_metadata.json | 1 + .../extracted/p/leon/demo/poll/package.gno | 86 + .../p/leon/demo/poll/pkg_metadata.json | 1 + .../extracted/p/leon/demo/poll/pkg_test.gno | 15 + .../extracted/p/leon/demo/poll:0/package.gno | 88 ++ .../p/leon/demo/poll:0/pkg_metadata.json | 1 + .../extracted/p/leon/demo/poll:0/pkg_test.gno | 15 + .../extracted/p/namespacetest/hello/hello.gno | 3 + .../p/namespacetest/hello/pkg_metadata.json | 1 + portal-loop/extracted/p/nt/poa/option.gno | 14 + .../extracted/p/nt/poa/pkg_metadata.json | 1 + portal-loop/extracted/p/nt/poa/poa.gno | 106 ++ portal-loop/extracted/p/nt/poa/poa_test.gno | 237 +++ .../extracted/p/sulaiman/mail/package.gno | 33 + .../p/sulaiman/mail/pkg_metadata.json | 1 + .../p/sys/validators/pkg_metadata.json | 1 + .../extracted/p/sys/validators/types.gno | 51 + .../extracted/r/2Uwr0fffBG/raffle/package.gno | 5 + .../r/2Uwr0fffBG/raffle/pkg_metadata.json | 1 + .../extracted/r/Olawale22/mail/package.gno | 58 + .../r/Olawale22/mail/pkg_metadata.json | 1 + .../extracted/r/SamRecruits/entry/package.gno | 11 + .../r/SamRecruits/entry/pkg_metadata.json | 1 + .../r/SamRecruits/entry:0/package.gno | 11 + .../r/SamRecruits/entry:0/pkg_metadata.json | 1 + portal-loop/extracted/r/ab/raffle/gno.mod | 5 + .../extracted/r/ab/raffle/pkg_metadata.json | 1 + portal-loop/extracted/r/ab/raffle/raffle.gno | 9 + portal-loop/extracted/r/ab/raffle:0/gno.mod | 5 + .../extracted/r/ab/raffle:0/pkg_metadata.json | 1 + .../extracted/r/ab/raffle:0/raffle.gno | 10 + portal-loop/extracted/r/abach/raffle/gno.mod | 5 + .../r/abach/raffle/pkg_metadata.json | 1 + .../extracted/r/abach/raffle/raffle.gno | 10 + .../extracted/r/abach/raffle:0/gno.mod | 5 + .../r/abach/raffle:0/pkg_metadata.json | 1 + .../extracted/r/abach/raffle:0/raffle.gno | 9 + .../extracted/r/ajnavarro/raffle/package.gno | 7 + .../r/ajnavarro/raffle/pkg_metadata.json | 1 + .../r/ajnavarro/raffle:0/package.gno | 11 + .../r/ajnavarro/raffle:0/pkg_metadata.json | 1 + portal-loop/extracted/r/albttx/home/home.gno | 199 +++ .../extracted/r/albttx/home/pkg_metadata.json | 1 + .../extracted/r/allylee/raffle/package.gno | 13 + .../r/allylee/raffle/pkg_metadata.json | 1 + .../r/arjunmalhotra1/entry/pkg_metadata.json | 1 + .../r/arjunmalhotra1/entry/raffle.gno | 14 + .../r/arjunmalhotra1/entry2/pkg_metadata.json | 1 + .../r/arjunmalhotra1/entry2/raffle.gno | 14 + .../r/arjunmalhotra1/entry3/pkg_metadata.json | 1 + .../r/arjunmalhotra1/entry3/raffle.gno | 16 + .../r/arjunmalhotra1/entry4/pkg_metadata.json | 1 + .../r/arjunmalhotra1/entry4/raffle.gno | 16 + .../arjunmalhotra1/entry4:0/pkg_metadata.json | 1 + .../r/arjunmalhotra1/entry4:0/raffle.gno | 50 + .../r/arjunmalhotra1/entry5/pkg_metadata.json | 1 + .../r/arjunmalhotra1/entry5/raffle.gno | 52 + .../r/arjunmalhotra1/entry6/pkg_metadata.json | 1 + .../r/arjunmalhotra1/entry6/raffle.gno | 53 + .../arjunmalhotra1/entry6:0/pkg_metadata.json | 1 + .../r/arjunmalhotra1/entry6:0/raffle.gno | 53 + .../arjunmalhotra1/entry:0/pkg_metadata.json | 1 + .../r/arjunmalhotra1/entry:0/raffle.gno | 14 + .../r/arjunmalhotra1/raffle/pkg_metadata.json | 1 + .../r/arjunmalhotra1/raffle/raffle.gno | 9 + .../extracted/r/bob/raffle10/package.gno | 7 + .../r/bob/raffle10/pkg_metadata.json | 1 + .../extracted/r/bob/raffle10:0/package.gno | 9 + .../r/bob/raffle10:0/pkg_metadata.json | 1 + .../r/bobbyluig/raffle1/pkg_metadata.json | 1 + .../extracted/r/bobbyluig/raffle1/raffle.gno | 7 + .../r/bobbyluig/raffle10/package.gno | 11 + .../r/bobbyluig/raffle10/pkg_metadata.json | 1 + .../r/bobbyluig/raffle1:0/pkg_metadata.json | 1 + .../r/bobbyluig/raffle1:0/raffle.gno | 8 + .../r/bobbyluig/raffle2/pkg_metadata.json | 1 + .../extracted/r/bobbyluig/raffle2/raffle.gno | 8 + .../r/bobbyluig/raffle2:0/pkg_metadata.json | 1 + .../r/bobbyluig/raffle2:0/raffle.gno | 8 + .../extracted/r/boonedox/hello/package.gno | 23 + .../r/boonedox/hello/pkg_metadata.json | 1 + .../extracted/r/boonedox/hello:0/package.gno | 18 + .../r/boonedox/hello:0/pkg_metadata.json | 1 + .../r/charlysotelo/raffle/package.gno | 7 + .../r/charlysotelo/raffle/pkg_metadata.json | 1 + .../r/charlysotelo/raffle:0/package.gno | 9 + .../r/charlysotelo/raffle:0/pkg_metadata.json | 1 + .../charlysotelo/raffle_username/package.gno | 8 + .../raffle_username/pkg_metadata.json | 1 + .../raffle_username_a_lot/package.gno | 10 + .../raffle_username_a_lot/pkg_metadata.json | 1 + .../extracted/r/ckami2088/raffle/package.gno | 12 + .../r/ckami2088/raffle/pkg_metadata.json | 1 + .../r/ckami2088/raffle:0/package.gno | 13 + .../r/ckami2088/raffle:0/pkg_metadata.json | 1 + .../r/ckami2088/rafflegithub/package.gno | 13 + .../ckami2088/rafflegithub/pkg_metadata.json | 1 + .../extracted/r/conradsmi/raffle/package.gno | 12 + .../r/conradsmi/raffle/pkg_metadata.json | 1 + .../r/conradsmi/raffle:0/package.gno | 10 + .../r/conradsmi/raffle:0/pkg_metadata.json | 1 + portal-loop/extracted/r/counter/package.gno | 21 + .../extracted/r/counter/package_test.gno | 51 + .../extracted/r/counter/pkg_metadata.json | 1 + portal-loop/extracted/r/counter:0/counter.gno | 19 + portal-loop/extracted/r/counter:0/package.gno | 21 + .../extracted/r/counter:0/pkg_metadata.json | 1 + .../extracted/r/cryptopunkstar/package.gno | 5 + .../r/cryptopunkstar/pkg_metadata.json | 1 + .../extracted/r/cryptopunkstar:0/package.gno | 5 + .../r/cryptopunkstar:0/pkg_metadata.json | 1 + .../extracted/r/deelawn/tsrf/package.gno | 7 + .../r/deelawn/tsrf/pkg_metadata.json | 1 + .../extracted/r/deelawn/tsrf:0/package.gno | 7 + .../r/deelawn/tsrf:0/pkg_metadata.json | 1 + .../extracted/r/demo/art/gnoface/gnoface.gno | 124 ++ .../r/demo/art/gnoface/gnoface_test.gno | 133 ++ .../r/demo/art/gnoface/pkg_metadata.json | 1 + .../r/demo/art/millipede/millipede.gno | 51 + .../r/demo/art/millipede/millipede_test.gno | 58 + .../r/demo/art/millipede/pkg_metadata.json | 1 + .../extracted/r/demo/banktest/README.md | 116 ++ .../extracted/r/demo/banktest/banktest.gno | 71 + .../r/demo/banktest/pkg_metadata.json | 1 + .../r/demo/banktest/z_0_filetest.gno | 48 + .../r/demo/banktest/z_1_filetest.gno | 21 + .../r/demo/banktest/z_2_filetest.gno | 45 + .../r/demo/banktest/z_3_filetest.gno | 20 + portal-loop/extracted/r/demo/bar20/bar20.gno | 46 + .../extracted/r/demo/bar20/bar20_test.gno | 19 + .../extracted/r/demo/bar20/pkg_metadata.json | 1 + portal-loop/extracted/r/demo/boards/README.md | 147 ++ portal-loop/extracted/r/demo/boards/board.gno | 140 ++ .../extracted/r/demo/boards/boards.gno | 22 + portal-loop/extracted/r/demo/boards/misc.gno | 95 ++ .../extracted/r/demo/boards/pkg_metadata.json | 1 + portal-loop/extracted/r/demo/boards/post.gno | 263 ++++ .../extracted/r/demo/boards/public.gno | 185 +++ .../extracted/r/demo/boards/render.gno | 83 + portal-loop/extracted/r/demo/boards/role.gno | 8 + .../r/demo/boards/z_0_a_filetest.gno | 22 + .../r/demo/boards/z_0_b_filetest.gno | 23 + .../r/demo/boards/z_0_c_filetest.gno | 23 + .../r/demo/boards/z_0_d_filetest.gno | 24 + .../r/demo/boards/z_0_e_filetest.gno | 23 + .../extracted/r/demo/boards/z_0_filetest.gno | 39 + .../r/demo/boards/z_10_a_filetest.gno | 34 + .../r/demo/boards/z_10_b_filetest.gno | 34 + .../r/demo/boards/z_10_c_filetest.gno | 48 + .../extracted/r/demo/boards/z_10_filetest.gno | 39 + .../r/demo/boards/z_11_a_filetest.gno | 34 + .../r/demo/boards/z_11_b_filetest.gno | 34 + .../r/demo/boards/z_11_c_filetest.gno | 34 + .../r/demo/boards/z_11_d_filetest.gno | 52 + .../extracted/r/demo/boards/z_11_filetest.gno | 42 + .../r/demo/boards/z_12_a_filetest.gno | 32 + .../r/demo/boards/z_12_b_filetest.gno | 24 + .../r/demo/boards/z_12_c_filetest.gno | 24 + .../r/demo/boards/z_12_d_filetest.gno | 24 + .../extracted/r/demo/boards/z_12_filetest.gno | 40 + .../extracted/r/demo/boards/z_1_filetest.gno | 28 + .../extracted/r/demo/boards/z_2_filetest.gno | 38 + .../extracted/r/demo/boards/z_3_filetest.gno | 40 + .../extracted/r/demo/boards/z_4_filetest.gno | 892 +++++++++++ .../r/demo/boards/z_5_b_filetest.gno | 31 + .../r/demo/boards/z_5_c_filetest.gno | 39 + .../r/demo/boards/z_5_d_filetest.gno | 32 + .../extracted/r/demo/boards/z_5_filetest.gno | 43 + .../extracted/r/demo/boards/z_6_filetest.gno | 49 + .../extracted/r/demo/boards/z_7_filetest.gno | 31 + .../extracted/r/demo/boards/z_8_filetest.gno | 44 + .../r/demo/boards/z_9_a_filetest.gno | 25 + .../r/demo/boards/z_9_b_filetest.gno | 29 + .../extracted/r/demo/boards/z_9_filetest.gno | 37 + .../extracted/r/demo/counter/counter.gno | 14 + .../extracted/r/demo/counter/counter_test.gno | 22 + .../r/demo/counter/pkg_metadata.json | 1 + .../r/demo/deep/very/deep/pkg_metadata.json | 1 + .../r/demo/deep/very/deep/render.gno | 9 + .../extracted/r/demo/disperse/disperse.gno | 99 ++ portal-loop/extracted/r/demo/disperse/doc.gno | 19 + .../extracted/r/demo/disperse/errors.gno | 12 + .../r/demo/disperse/pkg_metadata.json | 1 + .../extracted/r/demo/disperse/util.gno | 67 + .../r/demo/disperse/z_0_filetest.gno | 32 + .../r/demo/disperse/z_1_filetest.gno | 32 + .../r/demo/disperse/z_2_filetest.gno | 25 + .../r/demo/disperse/z_3_filetest.gno | 45 + .../r/demo/disperse/z_4_filetest.gno | 48 + portal-loop/extracted/r/demo/echo/echo.gno | 13 + .../extracted/r/demo/echo/echo_test.gno | 12 + .../extracted/r/demo/echo/pkg_metadata.json | 1 + portal-loop/extracted/r/demo/echo1/echo.gno | 13 + .../extracted/r/demo/echo1/echo_test.gno | 12 + portal-loop/extracted/r/demo/echo1/gno.mod | 1 + .../extracted/r/demo/echo1/pkg_metadata.json | 1 + portal-loop/extracted/r/demo/event/event.gno | 9 + .../extracted/r/demo/event/pkg_metadata.json | 1 + .../r/demo/event_emitter/package.gno | 21 + .../r/demo/event_emitter/pkg_metadata.json | 1 + .../r/demo/event_emitter:0/package.gno | 21 + .../r/demo/event_emitter:0/pkg_metadata.json | 1 + .../extracted/r/demo/foo1155/foo1155.gno | 137 ++ .../extracted/r/demo/foo1155/foo1155_test.gno | 32 + .../r/demo/foo1155/pkg_metadata.json | 1 + portal-loop/extracted/r/demo/foo20/foo20.gno | 99 ++ .../extracted/r/demo/foo20/foo20_test.gno | 86 + .../extracted/r/demo/foo20/pkg_metadata.json | 1 + .../extracted/r/demo/foo721/foo721.gno | 124 ++ .../extracted/r/demo/foo721/foo721_test.gno | 33 + .../extracted/r/demo/foo721/pkg_metadata.json | 1 + .../r/demo/games/shifumi/pkg_metadata.json | 1 + .../r/demo/games/shifumi/shifumi.gno | 120 ++ .../r/demo/games/tictactoe/README.md | 32 + .../r/demo/games/tictactoe/pkg_metadata.json | 1 + .../r/demo/games/tictactoe/render.gno | 283 ++++ .../r/demo/games/tictactoe/render_test.gno | 63 + .../extracted/r/demo/games:0/games.gno | 54 + .../extracted/r/demo/games:0/games_test.gno | 25 + .../r/demo/games:0/pkg_metadata.json | 1 + .../r/demo/grc20factory/grc20factory.gno | 136 ++ .../r/demo/grc20factory/grc20factory_test.gno | 56 + .../r/demo/grc20factory/pkg_metadata.json | 1 + portal-loop/extracted/r/demo/groups/README.md | 24 + portal-loop/extracted/r/demo/groups/group.gno | 98 ++ .../extracted/r/demo/groups/groups.gno | 21 + .../extracted/r/demo/groups/member.gno | 27 + portal-loop/extracted/r/demo/groups/misc.gno | 96 ++ .../extracted/r/demo/groups/pkg_metadata.json | 1 + .../extracted/r/demo/groups/public.gno | 71 + .../extracted/r/demo/groups/render.gno | 40 + portal-loop/extracted/r/demo/groups/role.gno | 8 + .../r/demo/groups/z_0_a_filetest.gno | 17 + .../r/demo/groups/z_0_b_filetest.gno | 19 + .../r/demo/groups/z_0_c_filetest.gno | 24 + .../r/demo/groups/z_1_a_filetest.gno | 78 + .../r/demo/groups/z_1_b_filetest.gno | 22 + .../r/demo/groups/z_1_c_filetest.gno | 28 + .../r/demo/groups/z_2_a_filetest.gno | 78 + .../r/demo/groups/z_2_b_filetest.gno | 22 + .../r/demo/groups/z_2_d_filetest.gno | 31 + .../r/demo/groups/z_2_e_filetest.gno | 23 + .../r/demo/groups/z_2_f_filetest.gno | 22 + .../r/demo/groups/z_2_g_filetest.gno | 31 + .../extracted/r/demo/hello/package.gno | 5 + .../extracted/r/demo/hello/pkg_metadata.json | 1 + .../extracted/r/demo/hello:0/package.gno | 5 + .../r/demo/hello:0/pkg_metadata.json | 1 + .../extracted/r/demo/hellopp/package.gno | 9 + .../r/demo/hellopp/pkg_metadata.json | 1 + .../extracted/r/demo/keystore/keystore.gno | 184 +++ .../r/demo/keystore/keystore_test.gno | 78 + .../r/demo/keystore/pkg_metadata.json | 1 + portal-loop/extracted/r/demo/mail/package.gno | 33 + .../extracted/r/demo/mail/pkg_metadata.json | 1 + .../extracted/r/demo/mail:0/package.gno | 32 + .../extracted/r/demo/mail:0/pkg_metadata.json | 1 + .../r/demo/markdown_test/markdown.gno | 180 +++ .../r/demo/markdown_test/markdown_test.gno | 13 + .../r/demo/markdown_test/pkg_metadata.json | 1 + .../extracted/r/demo/math_eval/math_eval.gno | 30 + .../r/demo/math_eval/pkg_metadata.json | 1 + .../extracted/r/demo/memeland/memeland.gno | 51 + .../r/demo/memeland/pkg_metadata.json | 1 + .../extracted/r/demo/microblog/README.md | 24 + .../extracted/r/demo/microblog/microblog.gno | 97 ++ .../r/demo/microblog/microblog_test.gno | 80 + .../r/demo/microblog/pkg_metadata.json | 1 + portal-loop/extracted/r/demo/nft/README.md | 11 + portal-loop/extracted/r/demo/nft/nft.gno | 144 ++ .../extracted/r/demo/nft/pkg_metadata.json | 1 + .../extracted/r/demo/nft/z_0_filetest.gno | 249 +++ .../extracted/r/demo/nft/z_1_filetest.gno | 20 + .../extracted/r/demo/nft/z_2_filetest.gno | 24 + .../extracted/r/demo/nft/z_3_filetest.gno | 26 + .../extracted/r/demo/nft/z_4_filetest.gno | 26 + portal-loop/extracted/r/demo/nft123/gnft.gno | 142 ++ .../extracted/r/demo/nft123/gnft_test.gno | 108 ++ portal-loop/extracted/r/demo/nft123/gno.mod | 8 + .../extracted/r/demo/nft123/pkg_metadata.json | 1 + .../extracted/r/demo/nft123/svg_base64.gno | 36 + portal-loop/extracted/r/demo/nft1234/gnft.gno | 150 ++ .../extracted/r/demo/nft1234/gnft_test.gno | 108 ++ portal-loop/extracted/r/demo/nft1234/gno.mod | 8 + .../r/demo/nft1234/pkg_metadata.json | 1 + .../extracted/r/demo/nft1234/svg_base64.gno | 36 + portal-loop/extracted/r/demo/nft2/gnft.gno | 165 ++ .../extracted/r/demo/nft2/gnft_test.gno | 108 ++ portal-loop/extracted/r/demo/nft2/gno.mod | 8 + .../extracted/r/demo/nft2/pkg_metadata.json | 1 + .../extracted/r/demo/nft2/svg_base64.gno | 36 + portal-loop/extracted/r/demo/nft3/gnft.gno | 169 ++ .../extracted/r/demo/nft3/gnft_test.gno | 108 ++ portal-loop/extracted/r/demo/nft3/gno.mod | 8 + .../extracted/r/demo/nft3/pkg_metadata.json | 1 + .../extracted/r/demo/nft3/svg_base64.gno | 36 + portal-loop/extracted/r/demo/nft4/gnft.gno | 173 ++ .../extracted/r/demo/nft4/gnft_test.gno | 16 + portal-loop/extracted/r/demo/nft4/gno.mod | 8 + .../extracted/r/demo/nft4/pkg_metadata.json | 1 + portal-loop/extracted/r/demo/nft4/svg_gen.gno | 74 + .../extracted/r/demo/nft4/svg_gen_test.gno | 10 + .../r/demo/profile/pkg_metadata.json | 1 + .../extracted/r/demo/profile/profile.gno | 144 ++ .../extracted/r/demo/profile/profile_test.gno | 142 ++ .../extracted/r/demo/profile/render.gno | 103 ++ .../r/demo/releases_example/dummy.gno | 15 + .../r/demo/releases_example/example.gno | 37 + .../r/demo/releases_example/pkg_metadata.json | 1 + .../releases_example/releases0_filetest.gno | 51 + .../releases_example/releases1_filetest.gno | 36 + .../extracted/r/demo/t12345/package.gno | 5 + .../extracted/r/demo/t12345/pkg_metadata.json | 1 + .../r/demo/tamagotchi/pkg_metadata.json | 1 + .../extracted/r/demo/tamagotchi/realm.gno | 53 + .../r/demo/tamagotchi/z0_filetest.gno | 25 + .../extracted/r/demo/test_event/package.gno | 21 + .../r/demo/test_event/pkg_metadata.json | 1 + .../extracted/r/demo/test_event2/package.gno | 21 + .../r/demo/test_event2/pkg_metadata.json | 1 + .../r/demo/test_event2:0/package.gno | 21 + .../r/demo/test_event2:0/pkg_metadata.json | 1 + .../extracted/r/demo/test_event:0/package.gno | 21 + .../r/demo/test_event:0/pkg_metadata.json | 1 + .../extracted/r/demo/test_events/package.gno | 21 + .../r/demo/test_events/pkg_metadata.json | 1 + .../extracted/r/demo/test_nft/package.gno | 155 ++ .../r/demo/test_nft/pkg_metadata.json | 1 + .../extracted/r/demo/test_nft:0/gnft.gno | 142 ++ .../extracted/r/demo/test_nft:0/image.gno | 36 + .../extracted/r/demo/test_nft:0/package.gno | 155 ++ .../r/demo/test_nft:0/pkg_metadata.json | 1 + .../r/demo/tests/crossrealm/crossrealm.gno | 29 + .../r/demo/tests/crossrealm/pkg_metadata.json | 1 + .../r/demo/tests/subtests/pkg_metadata.json | 1 + .../r/demo/tests/subtests/subtests.gno | 25 + .../extracted/r/demo/tests:0/README.md | 2 + .../extracted/r/demo/tests:0/interfaces.gno | 28 + .../r/demo/tests:0/nestedpkg_test.gno | 73 + .../r/demo/tests:0/pkg_metadata.json | 1 + .../r/demo/tests:0/realm_compositelit.gno | 22 + .../r/demo/tests:0/realm_method38d.gno | 19 + .../extracted/r/demo/tests:0/tests.gno | 114 ++ .../extracted/r/demo/tests:0/tests_test.gno | 58 + .../extracted/r/demo/tests:0/z0_filetest.gno | 28 + .../extracted/r/demo/tests:0/z1_filetest.gno | 15 + .../extracted/r/demo/tests_foo/foo.gno | 19 + .../r/demo/tests_foo/pkg_metadata.json | 1 + .../r/demo/todolist/pkg_metadata.json | 1 + .../extracted/r/demo/todolist/todolist.gno | 176 +++ .../r/demo/todolist/todolist_test.gno | 60 + .../extracted/r/demo/types/pkg_metadata.json | 1 + portal-loop/extracted/r/demo/types/types.gno | 51 + .../extracted/r/demo/types/types_test.gno | 1 + .../extracted/r/demo/ui/pkg_metadata.json | 1 + portal-loop/extracted/r/demo/ui/ui.gno | 48 + portal-loop/extracted/r/demo/ui/ui_test.gno | 13 + .../r/demo/userbook/pkg_metadata.json | 1 + .../extracted/r/demo/userbook/userbook.gno | 158 ++ .../r/demo/userbook/userbook_test.gno | 79 + .../extracted/r/demo/users/pkg_metadata.json | 1 + .../extracted/r/demo/users/preregister.gno | 69 + portal-loop/extracted/r/demo/users/users.gno | 334 ++++ .../extracted/r/demo/users/users_test.gno | 13 + .../extracted/r/demo/users/z_0_b_filetest.gno | 15 + .../extracted/r/demo/users/z_0_filetest.gno | 16 + .../extracted/r/demo/users/z_10_filetest.gno | 33 + .../extracted/r/demo/users/z_11_filetest.gno | 25 + .../extracted/r/demo/users/z_11b_filetest.gno | 28 + .../extracted/r/demo/users/z_12_filetest.gno | 49 + .../extracted/r/demo/users/z_1_filetest.gno | 15 + .../extracted/r/demo/users/z_2_filetest.gno | 32 + .../extracted/r/demo/users/z_3_filetest.gno | 33 + .../extracted/r/demo/users/z_4_filetest.gno | 34 + .../extracted/r/demo/users/z_5_filetest.gno | 70 + .../extracted/r/demo/users/z_6_filetest.gno | 20 + .../extracted/r/demo/users/z_7_filetest.gno | 36 + .../extracted/r/demo/users/z_7b_filetest.gno | 36 + .../extracted/r/demo/users/z_8_filetest.gno | 37 + .../extracted/r/demo/users/z_9_filetest.gno | 28 + .../extracted/r/demo/wugnot/pkg_metadata.json | 1 + .../extracted/r/demo/wugnot/wugnot.gno | 102 ++ .../extracted/r/demo/wugnot/z0_filetest.gno | 71 + .../extracted/r/demoyy/counter/counter.gno | 19 + .../r/demoyy/counter/pkg_metadata.json | 1 + .../extracted/r/demoyy/counter:0/counter.gno | 19 + .../r/demoyy/counter:0/pkg_metadata.json | 1 + .../extracted/r/devx/hello/package.gno | 5 + .../extracted/r/devx/hello/pkg_metadata.json | 1 + .../extracted/r/devx5/hello/package.gno | 5 + .../extracted/r/devx5/hello/pkg_metadata.json | 1 + .../extracted/r/devx6/hello/package.gno | 5 + .../extracted/r/devx6/hello/pkg_metadata.json | 1 + .../extracted/r/devx7/hello/package.gno | 5 + .../extracted/r/devx7/hello/pkg_metadata.json | 1 + .../r/dinquisitor/raffle/package.gno | 5 + .../r/dinquisitor/raffle/pkg_metadata.json | 1 + .../r/dinquisitor/raffle2/package.gno | 13 + .../r/dinquisitor/raffle2/pkg_metadata.json | 1 + .../r/dinquisitor/raffle2:0/package.gno | 13 + .../r/dinquisitor/raffle2:0/pkg_metadata.json | 1 + .../r/dinquisitor/raffle3/package.gno | 13 + .../r/dinquisitor/raffle3/pkg_metadata.json | 1 + .../r/dinquisitor/raffle3:0/package.gno | 13 + .../r/dinquisitor/raffle3:0/pkg_metadata.json | 1 + .../r/dinquisitor/raffle:0/package.gno | 13 + .../r/dinquisitor/raffle:0/pkg_metadata.json | 1 + .../r/docs/examples/run/foo/package.gno | 39 + .../r/docs/examples/run/foo/pkg_metadata.json | 1 + .../extracted/r/doniacld/maini/package.gno | 14 + .../r/doniacld/maini/pkg_metadata.json | 1 + portal-loop/extracted/r/echo/package.gno | 5 + .../extracted/r/echo/pkg_metadata.json | 1 + portal-loop/extracted/r/echo111/package.gno | 5 + .../extracted/r/echo111/pkg_metadata.json | 1 + .../extracted/r/everest/winner1/package.gno | 10 + .../r/everest/winner1/pkg_metadata.json | 1 + .../extracted/r/everestkc/raffle/package.gno | 10 + .../r/everestkc/raffle/pkg_metadata.json | 1 + .../r/everestkc/raffle:0/package.gno | 10 + .../r/everestkc/raffle:0/pkg_metadata.json | 1 + .../extracted/r/everestkc/winner1/package.gno | 10 + .../r/everestkc/winner1/pkg_metadata.json | 1 + portal-loop/extracted/r/foo/package.gno | 101 ++ portal-loop/extracted/r/foo/pkg_metadata.json | 1 + portal-loop/extracted/r/foo:0/package.gno | 39 + .../extracted/r/foo:0/pkg_metadata.json | 1 + .../hello/package.gno | 8 + .../hello/pkg_metadata.json | 1 + .../gnome/dao/v1/LICENSE | 62 + .../gnome/dao/v1/gnome.gno | 602 +++++++ .../gnome/dao/v1/gnome_0a_filetest.gno | 37 + .../gnome/dao/v1/gnome_0b_filetest.gno | 23 + .../gnome/dao/v1/gnome_0c_filetest.gno | 23 + .../gnome/dao/v1/gnome_0d_filetest.gno | 23 + .../gnome/dao/v1/gnome_0e_filetest.gno | 22 + .../gnome/dao/v1/indexes.gno | 109 ++ .../gnome/dao/v1/lock.gno | 179 +++ .../gnome/dao/v1/paginator.gno | 198 +++ .../gnome/dao/v1/paginator_test.gno | 139 ++ .../gnome/dao/v1/pkg_metadata.json | 1 + .../gnome/dao/v1/render.gno | 351 +++++ .../gnome/dao/v1/render_router.gno | 99 ++ .../gnome/dao/v1/strategy_budget.gno | 110 ++ .../gnome/dao/v1/strategy_budget_test.gno | 244 +++ .../gnome/dao/v1/strategy_dao.gno | 401 +++++ .../gnome/dao/v1/strategy_dao_test.gno | 800 ++++++++++ .../gnome/dao/v1/strategy_general.gno | 79 + .../gnome/dao/v1/strategy_general_test.gno | 195 +++ .../gnome/dao/v1/strategy_lock.gno | 100 ++ .../gnome/dao/v1/strategy_lock_test.gno | 260 +++ .../gnome/dao/v1/uri.gno | 65 + .../gnome/tutorials/LICENSE | 62 + .../gnome/tutorials/indexes.gno | 123 ++ .../gnome/tutorials/pkg_metadata.json | 1 + .../gnome/tutorials/public.gno | 224 +++ .../gnome/tutorials/render.gno | 186 +++ .../gnome/tutorials/strategies.gno | 283 ++++ .../gnome/tutorials/tutorials.gno | 16 + .../r/gc24/ajnavarro/ajraffle/package.gno | 11 + .../gc24/ajnavarro/ajraffle/pkg_metadata.json | 1 + .../ajnavarro/ajraffleregister/package.gno | 11 + .../ajraffleregister/pkg_metadata.json | 1 + .../ajnavarro/ajraffleregistertwo/package.gno | 11 + .../ajraffleregistertwo/pkg_metadata.json | 1 + .../r/gc24/ajnavarro/ajraffletest/package.gno | 11 + .../ajnavarro/ajraffletest/pkg_metadata.json | 1 + .../gc24/ajnavarro/ajraffletest:0/package.gno | 11 + .../ajraffletest:0/pkg_metadata.json | 1 + .../r/gc24/bigzoo/raffle/package.gno | 338 ++++ .../r/gc24/bigzoo/raffle/pkg_metadata.json | 1 + .../r/gc24/bigzoo/raffle:0/package.gno | 14 + .../r/gc24/bigzoo/raffle:0/pkg_metadata.json | 1 + .../r/gc24/ghostlandr/raffle/package.gno | 11 + .../gc24/ghostlandr/raffle/pkg_metadata.json | 1 + .../r/gc24/jamesprysm/entry/package.gno | 9 + .../r/gc24/jamesprysm/entry/pkg_metadata.json | 1 + .../r/gc24/krzysztof/raffle/package.gno | 14 + .../r/gc24/krzysztof/raffle/pkg_metadata.json | 1 + .../r/gc24/krzysztoffetch/raffle/package.gno | 14 + .../krzysztoffetch/raffle/pkg_metadata.json | 1 + .../gc24/krzysztoffetch/raffle:0/package.gno | 14 + .../krzysztoffetch/raffle:0/pkg_metadata.json | 1 + portal-loop/extracted/r/gc24/mlin/package.gno | 14 + .../extracted/r/gc24/mlin/pkg_metadata.json | 1 + .../r/gc24/nasikalt/hello/package.gno | 5 + .../r/gc24/nasikalt/hello/pkg_metadata.json | 1 + .../r/gc24/nasikalt/hello2/package.gno | 7 + .../r/gc24/nasikalt/hello2/pkg_metadata.json | 1 + .../r/gc24/nasikalt/hello:0/package.gno | 7 + .../r/gc24/nasikalt/hello:0/pkg_metadata.json | 1 + .../r/gc24/nasikalt/raffle/package.gno | 5 + .../r/gc24/nasikalt/raffle/pkg_metadata.json | 1 + .../r/gc24/nasikalt/raffle:0/package.gno | 7 + .../gc24/nasikalt/raffle:0/pkg_metadata.json | 1 + portal-loop/extracted/r/gc24/raffle/gno.mod | 7 + .../extracted/r/gc24/raffle/pkg_metadata.json | 1 + .../extracted/r/gc24/raffle/raffle.gno | 336 ++++ .../extracted/r/gc24/raffle/raffle_guide.gno | 201 +++ .../extracted/r/gc24/raffle/raffle_test.gno | 252 +++ .../extracted/r/gc24/raffle:0/package.gno | 10 + .../r/gc24/raffle:0/pkg_metadata.json | 1 + .../r/gc24/soypat/raffle/package.gno | 16 + .../r/gc24/soypat/raffle/pkg_metadata.json | 1 + .../r/gc24/suchak/raffle/package.gno | 9 + .../r/gc24/suchak/raffle/pkg_metadata.json | 1 + .../r/gc24/suchak/raffle:0/package.gno | 10 + .../r/gc24/suchak/raffle:0/pkg_metadata.json | 1 + .../r/gc24/suchak1/raffle/package.gno | 10 + .../r/gc24/suchak1/raffle/pkg_metadata.json | 1 + .../r/gc24/suchak1/raffle:0/package.gno | 10 + .../r/gc24/suchak1/raffle:0/pkg_metadata.json | 1 + .../extracted/r/gnoland/blog/admin.gno | 145 ++ .../extracted/r/gnoland/blog/gnoblog.gno | 36 + .../extracted/r/gnoland/blog/gnoblog_test.gno | 247 +++ .../r/gnoland/blog/pkg_metadata.json | 1 + portal-loop/extracted/r/gnoland/blog/util.gno | 7 + .../r/gnoland/events/administration.gno | 26 + .../extracted/r/gnoland/events/errors.gno | 18 + .../extracted/r/gnoland/events/events.gno | 199 +++ .../r/gnoland/events/events_test.gno | 200 +++ .../r/gnoland/events/pkg_metadata.json | 1 + .../extracted/r/gnoland/events/rendering.gno | 145 ++ .../extracted/r/gnoland/faucet/admin.gno | 87 ++ .../extracted/r/gnoland/faucet/faucet.gno | 91 ++ .../r/gnoland/faucet/faucet_test.gno | 115 ++ .../r/gnoland/faucet/pkg_metadata.json | 1 + .../r/gnoland/faucet/z0_filetest.gno | 35 + .../r/gnoland/faucet/z1_filetest.gno | 35 + .../r/gnoland/faucet/z2_filetest.gno | 50 + .../r/gnoland/faucet/z3_filetest.gno | 62 + .../extracted/r/gnoland/ghverify/README.md | 9 + .../extracted/r/gnoland/ghverify/contract.gno | 146 ++ .../r/gnoland/ghverify/contract_test.gno | 98 ++ .../r/gnoland/ghverify/pkg_metadata.json | 1 + .../extracted/r/gnoland/ghverify/task.gno | 24 + portal-loop/extracted/r/gnoland/home/home.gno | 290 ++++ .../r/gnoland/home/home_filetest.gno | 199 +++ .../r/gnoland/home/overide_filetest.gno | 24 + .../r/gnoland/home/pkg_metadata.json | 1 + .../extracted/r/gnoland/monit/monit.gno | 59 + .../extracted/r/gnoland/monit/monit_test.gno | 56 + .../r/gnoland/monit/pkg_metadata.json | 1 + .../extracted/r/gnoland/pages/admin.gno | 90 ++ .../extracted/r/gnoland/pages/page_about.gno | 29 + .../r/gnoland/pages/page_contribute.gno | 106 ++ .../r/gnoland/pages/page_ecosystem.gno | 59 + .../r/gnoland/pages/page_gnolang.gno | 43 + .../r/gnoland/pages/page_license.gno | 698 +++++++++ .../r/gnoland/pages/page_partners.gno | 15 + .../extracted/r/gnoland/pages/page_start.gno | 21 + .../r/gnoland/pages/page_testnets.gno | 21 + .../r/gnoland/pages/page_tokenomics.gno | 11 + .../extracted/r/gnoland/pages/pages.gno | 17 + .../extracted/r/gnoland/pages/pages_test.gno | 45 + .../r/gnoland/pages/pkg_metadata.json | 1 + .../extracted/r/gnoland/pages/util.gno | 7 + .../extracted/r/gnoland/valopers/init.gno | 7 + .../r/gnoland/valopers/pkg_metadata.json | 1 + .../extracted/r/gnoland/valopers/valopers.gno | 181 +++ .../r/gnoland/valopers/valopers_test.gno | 149 ++ .../extracted/r/gnome/dao/pre1/LICENSE | 62 + .../extracted/r/gnome/dao/pre1/gnome.gno | 68 + .../extracted/r/gnome/dao/pre1/indexes.gno | 102 ++ .../extracted/r/gnome/dao/pre1/params.gno | 46 + .../r/gnome/dao/pre1/pkg_metadata.json | 1 + .../extracted/r/gnome/dao/pre1/public.gno | 214 +++ .../r/gnome/dao/pre1/public_proposals.gno | 541 +++++++ .../dao/pre1/public_proposals_0a_filetest.gno | 37 + .../dao/pre1/public_proposals_0b_filetest.gno | 23 + .../dao/pre1/public_proposals_0c_filetest.gno | 23 + .../dao/pre1/public_proposals_0d_filetest.gno | 23 + .../dao/pre1/public_proposals_0e_filetest.gno | 22 + .../extracted/r/gnome/dao/pre1/render.gno | 375 +++++ .../r/gnome/dao/pre1/strategy_budget.gno | 100 ++ .../r/gnome/dao/pre1/strategy_budget_test.gno | 244 +++ .../r/gnome/dao/pre1/strategy_dao.gno | 362 +++++ .../r/gnome/dao/pre1/strategy_dao_test.gno | 804 ++++++++++ .../r/gnome/dao/pre1/strategy_general.gno | 71 + .../gnome/dao/pre1/strategy_general_test.gno | 195 +++ .../r/gnome/dao/pre1/strategy_lock.gno | 91 ++ .../r/gnome/dao/pre1/strategy_lock_test.gno | 260 +++ .../r/gnome/dao/pre1/strategy_params.gno | 66 + .../extracted/r/gnome/dao/pre1/uri.gno | 65 + .../extracted/r/gnome/dao/pre2/LICENSE | 62 + .../extracted/r/gnome/dao/pre2/gnome.gno | 68 + .../extracted/r/gnome/dao/pre2/indexes.gno | 102 ++ .../extracted/r/gnome/dao/pre2/params.gno | 46 + .../r/gnome/dao/pre2/pkg_metadata.json | 1 + .../extracted/r/gnome/dao/pre2/public.gno | 216 +++ .../r/gnome/dao/pre2/public_proposals.gno | 541 +++++++ .../dao/pre2/public_proposals_0a_filetest.gno | 37 + .../dao/pre2/public_proposals_0b_filetest.gno | 23 + .../dao/pre2/public_proposals_0c_filetest.gno | 23 + .../dao/pre2/public_proposals_0d_filetest.gno | 23 + .../dao/pre2/public_proposals_0e_filetest.gno | 22 + .../extracted/r/gnome/dao/pre2/render.gno | 375 +++++ .../r/gnome/dao/pre2/strategy_budget.gno | 100 ++ .../r/gnome/dao/pre2/strategy_budget_test.gno | 244 +++ .../r/gnome/dao/pre2/strategy_dao.gno | 362 +++++ .../r/gnome/dao/pre2/strategy_dao_test.gno | 804 ++++++++++ .../r/gnome/dao/pre2/strategy_general.gno | 71 + .../gnome/dao/pre2/strategy_general_test.gno | 195 +++ .../r/gnome/dao/pre2/strategy_lock.gno | 91 ++ .../r/gnome/dao/pre2/strategy_lock_test.gno | 260 +++ .../r/gnome/dao/pre2/strategy_params.gno | 66 + .../extracted/r/gnome/dao/pre2/uri.gno | 65 + .../extracted/r/gnome/tutorials/pre1/LICENSE | 62 + .../r/gnome/tutorials/pre1/indexes.gno | 123 ++ .../r/gnome/tutorials/pre1/params.gno | 33 + .../r/gnome/tutorials/pre1/pkg_metadata.json | 1 + .../r/gnome/tutorials/pre1/public.gno | 61 + .../gnome/tutorials/pre1/public_proposals.gno | 292 ++++ .../r/gnome/tutorials/pre1/render.gno | 193 +++ .../r/gnome/tutorials/pre1/strategy_lock.gno | 63 + .../gnome/tutorials/pre1/strategy_params.gno | 57 + .../tutorials/pre1/strategy_tutorials.gno | 286 ++++ .../r/gnome/tutorials/pre1/tutorials.gno | 26 + .../extracted/r/gnome/tutorials/pre2/LICENSE | 62 + .../r/gnome/tutorials/pre2/indexes.gno | 123 ++ .../r/gnome/tutorials/pre2/params.gno | 33 + .../r/gnome/tutorials/pre2/pkg_metadata.json | 1 + .../r/gnome/tutorials/pre2/public.gno | 61 + .../gnome/tutorials/pre2/public_proposals.gno | 292 ++++ .../r/gnome/tutorials/pre2/render.gno | 194 +++ .../r/gnome/tutorials/pre2/strategy_lock.gno | 63 + .../gnome/tutorials/pre2/strategy_params.gno | 57 + .../tutorials/pre2/strategy_tutorials.gno | 286 ++++ .../r/gnome/tutorials/pre2/tutorials.gno | 26 + .../extracted/r/gnome/tutorials/pre3/LICENSE | 62 + .../r/gnome/tutorials/pre3/indexes.gno | 123 ++ .../r/gnome/tutorials/pre3/params.gno | 33 + .../r/gnome/tutorials/pre3/pkg_metadata.json | 1 + .../r/gnome/tutorials/pre3/public.gno | 61 + .../gnome/tutorials/pre3/public_proposals.gno | 293 ++++ .../r/gnome/tutorials/pre3/render.gno | 194 +++ .../r/gnome/tutorials/pre3/strategy_lock.gno | 63 + .../gnome/tutorials/pre3/strategy_params.gno | 57 + .../tutorials/pre3/strategy_tutorials.gno | 286 ++++ .../r/gnome/tutorials/pre3/tutorials.gno | 26 + portal-loop/extracted/r/gov/dao/dao.gno | 207 +++ portal-loop/extracted/r/gov/dao/dao_test.gno | 192 +++ portal-loop/extracted/r/gov/dao/memberset.gno | 40 + .../extracted/r/gov/dao/pkg_metadata.json | 1 + .../extracted/r/gov/dao/prop1_filetest.gno | 131 ++ .../extracted/r/gov/dao/prop2_filetest.gno | 120 ++ portal-loop/extracted/r/gov/dao/types.gno | 32 + portal-loop/extracted/r/gov/dao/voter.gno | 91 ++ .../r/harrisonju123/hello/package.gno | 12 + .../r/harrisonju123/hello/pkg_metadata.json | 1 + .../r/hdjshfjsdhfsj/hello/package.gno | 10 + .../r/hdjshfjsdhfsj/hello/pkg_metadata.json | 1 + .../r/hdjshfjsdhfsj/hello:0/package.gno | 9 + .../r/hdjshfjsdhfsj/hello:0/pkg_metadata.json | 1 + .../r/helithumper/raffle/package.gno | 10 + .../r/helithumper/raffle/pkg_metadata.json | 1 + .../r/helithumper/raffle2/package.gno | 10 + .../r/helithumper/raffle2/pkg_metadata.json | 1 + .../r/helithumper/raffle2:0/package.gno | 10 + .../r/helithumper/raffle2:0/pkg_metadata.json | 1 + .../r/helithumper/raffle3/package.gno | 12 + .../r/helithumper/raffle3/pkg_metadata.json | 1 + .../r/helithumper/raffle:0/package.gno | 10 + .../r/helithumper/raffle:0/pkg_metadata.json | 1 + .../r/helithumper/rafflegithub/package.gno | 12 + .../rafflegithub/pkg_metadata.json | 1 + .../r/helithumper/rafflegithub:0/package.gno | 12 + .../rafflegithub:0/pkg_metadata.json | 1 + portal-loop/extracted/r/hello/package.gno | 5 + .../extracted/r/hello/pkg_metadata.json | 1 + .../extracted/r/hello123123/hello/package.gno | 9 + .../r/hello123123/hello/pkg_metadata.json | 1 + .../r/hello1231kkk/hello/package.gno | 5 + .../r/hello1231kkk/hello/pkg_metadata.json | 1 + portal-loop/extracted/r/hello:0/package.gno | 5 + .../extracted/r/hello:0/pkg_metadata.json | 1 + .../hellonamespacetest/package.gno | 5 + .../hellonamespacetest/pkg_metadata.json | 1 + .../extracted/r/hxjiang/hello/package.gno | 8 + .../r/hxjiang/hello/pkg_metadata.json | 1 + .../extracted/r/hxjiang/hello:0/package.gno | 7 + .../r/hxjiang/hello:0/pkg_metadata.json | 1 + .../extracted/r/hxjiang2/hello/package.gno | 7 + .../r/hxjiang2/hello/pkg_metadata.json | 1 + .../extracted/r/hxjiang3/hello/package.gno | 7 + .../r/hxjiang3/hello/pkg_metadata.json | 1 + .../extracted/r/hxjiang3/hello:0/package.gno | 8 + .../r/hxjiang3/hello:0/pkg_metadata.json | 1 + .../extracted/r/hxjiang4/hello/package.gno | 8 + .../r/hxjiang4/hello/pkg_metadata.json | 1 + .../extracted/r/hxjianguser/hello/package.gno | 9 + .../r/hxjianguser/hello/pkg_metadata.json | 1 + .../r/hxjianguser/hello:0/package.gno | 9 + .../r/hxjianguser/hello:0/pkg_metadata.json | 1 + .../extracted/r/iamkevin/kraffle/package.gno | 9 + .../r/iamkevin/kraffle/pkg_metadata.json | 1 + .../extracted/r/iamkevin/kraffle2/package.gno | 9 + .../r/iamkevin/kraffle2/pkg_metadata.json | 1 + .../r/iamkevin/kraffle2:0/package.gno | 10 + .../r/iamkevin/kraffle2:0/pkg_metadata.json | 1 + .../extracted/r/iamkevin/kraffle3/package.gno | 10 + .../r/iamkevin/kraffle3/pkg_metadata.json | 1 + .../extracted/r/iamkevin/kraffle4/package.gno | 9 + .../r/iamkevin/kraffle4/pkg_metadata.json | 1 + .../extracted/r/iamkevin/kraffle5/package.gno | 9 + .../r/iamkevin/kraffle5/pkg_metadata.json | 1 + .../r/iamkevin/kraffle:0/package.gno | 9 + .../r/iamkevin/kraffle:0/pkg_metadata.json | 1 + .../extracted/r/ianhowell/raffle/package.gno | 20 + .../r/ianhowell/raffle/pkg_metadata.json | 1 + .../r/ianhowell/raffle:0/package.gno | 17 + .../r/ianhowell/raffle:0/pkg_metadata.json | 1 + .../extracted/r/jahowell/gohper/package.gno | 21 + .../r/jahowell/gohper/pkg_metadata.json | 1 + .../extracted/r/jahowell/gohper:0/package.gno | 22 + .../r/jahowell/gohper:0/pkg_metadata.json | 1 + .../extracted/r/jahowell/gopher/package.gno | 22 + .../r/jahowell/gopher/pkg_metadata.json | 1 + .../extracted/r/jahowell/gopher:0/package.gno | 16 + .../r/jahowell/gopher:0/pkg_metadata.json | 1 + .../extracted/r/jmrosh/rafentry/package.gno | 10 + .../r/jmrosh/rafentry/pkg_metadata.json | 1 + .../extracted/r/jmrosh/raffle/package.gno | 5 + .../r/jmrosh/raffle/pkg_metadata.json | 1 + .../extracted/r/jmrosh/raffle1/package.gno | 10 + .../r/jmrosh/raffle1/pkg_metadata.json | 1 + .../extracted/r/jmrosh/raffle1:0/package.gno | 10 + .../r/jmrosh/raffle1:0/pkg_metadata.json | 1 + .../extracted/r/jmrosh/raffle:0/package.gno | 12 + .../r/jmrosh/raffle:0/pkg_metadata.json | 1 + .../r/krzysztoffetch/entry/package.gno | 10 + .../r/krzysztoffetch/entry/pkg_metadata.json | 1 + .../extracted/r/kurtbomya/raf/package.gno | 10 + .../r/kurtbomya/raf/pkg_metadata.json | 1 + .../extracted/r/kurtbomya/raf:0/package.gno | 10 + .../r/kurtbomya/raf:0/pkg_metadata.json | 1 + .../extracted/r/kurtbomya/raffle/package.gno | 8 + .../r/kurtbomya/raffle/pkg_metadata.json | 1 + .../r/kurtbomya/raffle:0/package.gno | 10 + .../r/kurtbomya/raffle:0/pkg_metadata.json | 1 + .../r/kurtbomya/raffleName/package.gno | 10 + .../r/kurtbomya/raffleName/pkg_metadata.json | 1 + .../r/kurtbomya/rafflegithubname/package.gno | 10 + .../rafflegithubname/pkg_metadata.json | 1 + .../extracted/r/lascoteca/hello/package.gno | 9 + .../r/lascoteca/hello/pkg_metadata.json | 1 + .../extracted/r/leon/config/config.gno | 65 + .../extracted/r/leon/config/pkg_metadata.json | 1 + .../extracted/r/leon/demo/poll/package.gno | 5 + .../r/leon/demo/poll/pkg_metadata.json | 1 + .../r/leon/demo/poll/v1/pkg_metadata.json | 1 + .../extracted/r/leon/demo/poll/v1/poll.gno | 74 + .../r/leon/demo/poll/v2/pkg_metadata.json | 1 + .../extracted/r/leon/demo/poll/v2/poll.gno | 74 + .../extracted/r/leon/demo/poll:0/package.gno | 5 + .../r/leon/demo/poll:0/pkg_metadata.json | 1 + .../extracted/r/leon/demo/poll:0/poll.gno | 74 + .../extracted/r/leon/gc/entry/entry.gno | 9 + .../r/leon/gc/entry/pkg_metadata.json | 1 + .../extracted/r/leon/hello/count/package.gno | 13 + .../r/leon/hello/count/pkg_metadata.json | 1 + portal-loop/extracted/r/leon/home/home.gno | 121 ++ .../extracted/r/leon/home/pkg_metadata.json | 1 + .../extracted/r/leon/home123123/package.gno | 8 + .../r/leon/home123123/pkg_metadata.json | 1 + .../extracted/r/leon/home:0/package.gno | 5 + .../extracted/r/leon/home:0/pkg_metadata.json | 1 + .../extracted/r/leon/issues/mypkg/package.gno | 28 + .../r/leon/issues/mypkg/pkg_metadata.json | 1 + .../r/leon/issues/ptrregistry/package.gno | 12 + .../leon/issues/ptrregistry/pkg_metadata.json | 1 + .../r/leon/issues/ptrregistry/v1/package.gno | 16 + .../issues/ptrregistry/v1/pkg_metadata.json | 1 + .../r/leon/issues/ptrregistry:0/package.gno | 16 + .../issues/ptrregistry:0/pkg_metadata.json | 1 + .../r/leon/issues/v1/ptrregistry/package.gno | 16 + .../issues/v1/ptrregistry/pkg_metadata.json | 1 + .../r/leon/issues/v2/ptrregistry/package.gno | 16 + .../issues/v2/ptrregistry/pkg_metadata.json | 1 + .../extracted/r/leon/v1/raffle/gno.mod | 7 + .../r/leon/v1/raffle/pkg_metadata.json | 1 + .../extracted/r/leon/v1/raffle/raffle.gno | 316 ++++ .../r/leon/v1/raffle/raffle_guide.gno | 205 +++ .../r/leon/v1/raffle/raffle_test.gno | 238 +++ .../r/leon/v2/raffle/entry/entry.gno | 9 + .../r/leon/v2/raffle/entry/pkg_metadata.json | 1 + .../extracted/r/leon/v2/raffle/gno.mod | 7 + .../r/leon/v2/raffle/pkg_metadata.json | 1 + .../extracted/r/leon/v2/raffle/raffle.gno | 320 ++++ .../r/leon/v2/raffle/raffle_guide.gno | 205 +++ .../r/leon/v2/raffle/raffle_test.gno | 252 +++ portal-loop/extracted/r/louis/GRC20.gno | 101 ++ .../extracted/r/louis/pkg_metadata.json | 1 + portal-loop/extracted/r/louis:0/GRC20.gno | 101 ++ portal-loop/extracted/r/louis:0/package.gno | 101 ++ .../extracted/r/louis:0/pkg_metadata.json | 1 + .../extracted/r/manfred/config/config.gno | 20 + .../r/manfred/config/pkg_metadata.json | 1 + .../extracted/r/manfred/cshijack/hijack.gno | 11 + .../r/manfred/cshijack/pkg_metadata.json | 1 + .../extracted/r/manfred/cshijack:0/hijack.gno | 11 + .../r/manfred/cshijack:0/pkg_metadata.json | 1 + portal-loop/extracted/r/manfred/home/home.gno | 56 + .../r/manfred/home/pkg_metadata.json | 1 + .../extracted/r/manfred/home/z1_filetest.gno | 19 + .../extracted/r/manfred/home/z2_filetest.gno | 35 + .../extracted/r/manfred/present/admin.gno | 96 ++ .../r/manfred/present/pkg_metadata.json | 1 + .../r/manfred/present/present_miami23.gno | 42 + .../present/present_miami23_filetest.gno | 11 + .../r/manfred/present/presentations.gno | 17 + .../r/manfred/v2/cshijack/hijack.gno | 11 + .../r/manfred/v2/cshijack/pkg_metadata.json | 1 + .../r/manfred/v3/cshijack/hijack.gno | 11 + .../r/manfred/v3/cshijack/pkg_metadata.json | 1 + .../extracted/r/mebert1/raffle/package.gno | 7 + .../r/mebert1/raffle/pkg_metadata.json | 1 + .../extracted/r/mebert1/raffle:0/package.gno | 11 + .../r/mebert1/raffle:0/pkg_metadata.json | 1 + .../r/mgriffi/mgriff10raffle/package.gno | 13 + .../mgriffi/mgriff10raffle/pkg_metadata.json | 1 + .../r/mgriffi/mgriff10raffle:0/package.gno | 13 + .../mgriff10raffle:0/pkg_metadata.json | 1 + .../r/mgriffin/mgriff10raffle/package.gno | 13 + .../mgriffin/mgriff10raffle/pkg_metadata.json | 1 + .../extracted/r/michelle/hello/package.gno | 5 + .../r/michelle/hello/pkg_metadata.json | 1 + .../extracted/r/michelle/main/main.gno | 35 + .../r/michelle/main/pkg_metadata.json | 1 + .../extracted/r/mikaelvallenet/bar20/mvc.gno | 46 + .../r/mikaelvallenet/bar20/pkg_metadata.json | 1 + .../r/mikaelvallenet/bar20:0/mvc.gno | 46 + .../mikaelvallenet/bar20:0/pkg_metadata.json | 1 + .../extracted/r/mikaelvallenet/foo20/mvc.gno | 99 ++ .../r/mikaelvallenet/foo20/pkg_metadata.json | 1 + .../r/mikaelvallenet/foo20:0/mvc.gno | 99 ++ .../mikaelvallenet/foo20:0/pkg_metadata.json | 1 + .../extracted/r/mikaelvallenet/gar20/mvc.gno | 46 + .../r/mikaelvallenet/gar20/pkg_metadata.json | 1 + .../mikaelvallenet/helloworld/helloworld.gno | 5 + .../helloworld/pkg_metadata.json | 1 + .../r/mikaelvallenet/issue/issue.gno | 46 + .../r/mikaelvallenet/issue/pkg_metadata.json | 1 + .../r/mikaelvallenet/issue:0/issue.gno | 46 + .../mikaelvallenet/issue:0/pkg_metadata.json | 1 + .../r/mikaelvallenet/issuefix/issue.gno | 46 + .../mikaelvallenet/issuefix/pkg_metadata.json | 1 + .../r/mikaelvallenet/issuetwo/issuetwo.gno | 38 + .../mikaelvallenet/issuetwo/pkg_metadata.json | 1 + .../r/mikaelvallenet/issuetwo:0/issuetwo.gno | 38 + .../issuetwo:0/pkg_metadata.json | 1 + .../extracted/r/mikaelvallenet/mvc/mvc.gno | 38 + .../r/mikaelvallenet/mvc/pkg_metadata.json | 1 + .../extracted/r/mikaelvallenet/mvc:0/mvc.gno | 38 + .../r/mikaelvallenet/mvc:0/pkg_metadata.json | 1 + .../extracted/r/mikaelvallenet/mvcoin/mvc.gno | 38 + .../r/mikaelvallenet/mvcoin/pkg_metadata.json | 1 + .../r/mikaelvallenet/mvcoin:0/mvc.gno | 38 + .../mikaelvallenet/mvcoin:0/pkg_metadata.json | 1 + .../extracted/r/mikaelvallenet/path/path.gno | 5 + .../r/mikaelvallenet/path/pkg_metadata.json | 1 + .../extracted/r/mikaelvallenet/tar20/mvc.gno | 46 + .../r/mikaelvallenet/tar20/pkg_metadata.json | 1 + .../extracted/r/morgan/guestbook/admin.gno | 25 + .../r/morgan/guestbook/guestbook.gno | 126 ++ .../r/morgan/guestbook/guestbook_test.gno | 131 ++ .../r/morgan/guestbook/pkg_metadata.json | 1 + portal-loop/extracted/r/morgan/home/home.gno | 10 + .../extracted/r/morgan/home/pkg_metadata.json | 1 + portal-loop/extracted/r/mvc/package.gno | 38 + portal-loop/extracted/r/mvc/pkg_metadata.json | 1 + portal-loop/extracted/r/mvc:0/package.gno | 38 + .../extracted/r/mvc:0/pkg_metadata.json | 1 + .../extracted/r/nebular24/guessbook/README.md | 56 + .../r/nebular24/guessbook/guess_book.gno | 109 ++ .../r/nebular24/guessbook/pkg_metadata.json | 1 + .../r/nebular24/guessbook:0/README.md | 56 + .../r/nebular24/guessbook:0/guess_book.gno | 109 ++ .../r/nebular24/guessbook:0/pkg_metadata.json | 1 + .../extracted/r/nemanya/config/conig.gno | 65 + .../r/nemanya/config/pkg_metadata.json | 1 + .../extracted/r/nemanya/config:0/conig.gno | 65 + .../r/nemanya/config:0/pkg_metadata.json | 1 + portal-loop/extracted/r/nemanya/home/home.gno | 122 ++ .../r/nemanya/home/pkg_metadata.json | 1 + .../extracted/r/ngoc/hello/package.gno | 5 + .../extracted/r/ngoc/hello/pkg_metadata.json | 1 + .../extracted/r/nprimmer/TacoBell/package.gno | 9 + .../r/nprimmer/TacoBell/pkg_metadata.json | 1 + .../extracted/r/nprimmer/main/package.gno | 9 + .../r/nprimmer/main/pkg_metadata.json | 1 + .../extracted/r/nprimmer/raffle/package.gno | 13 + .../r/nprimmer/raffle/pkg_metadata.json | 1 + .../extracted/r/nprimmer/raffle:0/package.gno | 14 + .../r/nprimmer/raffle:0/pkg_metadata.json | 1 + .../r/nprimmer/tacobell:0/package.gno | 14 + .../r/nprimmer/tacobell:0/pkg_metadata.json | 1 + .../extracted/r/nstest/hello/package.gno | 5 + .../r/nstest/hello/pkg_metadata.json | 1 + .../extracted/r/nstest/hello2/package.gno | 5 + .../r/nstest/hello2/pkg_metadata.json | 1 + .../extracted/r/nstest/hello2:0/package.gno | 5 + .../r/nstest/hello2:0/pkg_metadata.json | 1 + .../extracted/r/nstest/hello:0/package.gno | 5 + .../r/nstest/hello:0/pkg_metadata.json | 1 + portal-loop/extracted/r/pkg1/a.gno | 27 + .../extracted/r/pkg1/pkg_metadata.json | 1 + .../r/pnumbers/raffle/pkg_metadata.json | 1 + .../extracted/r/pnumbers/raffle/raffle.gno | 11 + .../r/pnumbers/raffle:0/pkg_metadata.json | 1 + .../extracted/r/pnumbers/raffle:0/raffle.gno | 10 + .../r/pnumbers/username/pkg_metadata.json | 1 + .../extracted/r/pnumbers/username/raffle.gno | 10 + portal-loop/extracted/r/poll/package.gno | 152 ++ .../extracted/r/poll/pkg_metadata.json | 1 + portal-loop/extracted/r/poll:0/package.gno | 152 ++ .../extracted/r/poll:0/pkg_metadata.json | 1 + .../r/portalloopfixes/fixfixfix/package.gno | 5 + .../fixfixfix/pkg_metadata.json | 1 + .../extracted/r/renier/hello/package.gno | 5 + .../r/renier/hello/pkg_metadata.json | 1 + .../extracted/r/renier/raffle/package.gno | 5 + .../r/renier/raffle/pkg_metadata.json | 1 + .../extracted/r/renier/raffle:0/package.gno | 11 + .../r/renier/raffle:0/pkg_metadata.json | 1 + .../extracted/r/renier/register/package.gno | 11 + .../r/renier/register/pkg_metadata.json | 1 + .../r/salmad/hellonamespacetest/package.gno | 5 + .../hellonamespacetest/pkg_metadata.json | 1 + .../extracted/r/slowteetoe/raffle/package.gno | 7 + .../r/slowteetoe/raffle/pkg_metadata.json | 1 + .../extracted/r/sys/rewards/pkg_metadata.json | 1 + .../extracted/r/sys/rewards/rewards.gno | 4 + .../extracted/r/sys/users/pkg_metadata.json | 1 + portal-loop/extracted/r/sys/users/verify.gno | 83 + .../extracted/r/sys/validators/doc.gno | 3 + .../extracted/r/sys/validators/gnosdk.gno | 24 + .../extracted/r/sys/validators/init.gno | 14 + .../r/sys/validators/pkg_metadata.json | 1 + .../extracted/r/sys/validators/poc.gno | 66 + .../extracted/r/sys/validators/validators.gno | 117 ++ .../r/sys/validators/validators_test.gno | 102 ++ .../extracted/r/test/hello/package.gno | 32 + .../extracted/r/test/hello/pkg_metadata.json | 1 + .../extracted/r/test/hello:0/package.gno | 5 + .../r/test/hello:0/pkg_metadata.json | 1 + .../extracted/r/tliu2023/raffle/package.gno | 13 + .../r/tliu2023/raffle/pkg_metadata.json | 1 + .../extracted/r/tliu523/raffle/package.gno | 12 + .../r/tliu523/raffle/pkg_metadata.json | 1 + .../extracted/r/tliu523/raffle:0/package.gno | 11 + .../r/tliu523/raffle:0/pkg_metadata.json | 1 + .../r/tliu523/raffleUser/package.gno | 11 + .../r/tliu523/raffleUser/pkg_metadata.json | 1 + portal-loop/extracted/r/tus/hello/package.gno | 5 + .../extracted/r/tus/hello/pkg_metadata.json | 1 + .../extracted/r/urjit/raffle/package.gno | 8 + .../r/urjit/raffle/pkg_metadata.json | 1 + .../extracted/r/urjit/raffle:0/package.gno | 21 + .../r/urjit/raffle:0/pkg_metadata.json | 1 + .../extracted/r/urjit/rafflev2/package.gno | 22 + .../r/urjit/rafflev2/pkg_metadata.json | 1 + .../extracted/r/vershun/vraffle/package.gno | 14 + .../r/vershun/vraffle/pkg_metadata.json | 1 + .../extracted/r/vershun/vraffle:0/package.gno | 14 + .../r/vershun/vraffle:0/pkg_metadata.json | 1 + .../extracted/r/vrvt/hello/package.gno | 8 + .../extracted/r/vrvt/hello/pkg_metadata.json | 1 + .../extracted/r/vrvt/hello:0/package.gno | 7 + .../r/vrvt/hello:0/pkg_metadata.json | 1 + .../extracted/r/whisky/goraffle/package.gno | 11 + .../r/whisky/goraffle/pkg_metadata.json | 1 + .../extracted/r/whisky/goraffle:0/package.gno | 11 + .../r/whisky/goraffle:0/pkg_metadata.json | 1 + .../extracted/r/whoagain/raffle/package.gno | 13 + .../r/whoagain/raffle/pkg_metadata.json | 1 + rules.mk | 35 + 1357 files changed, 83687 insertions(+), 32 deletions(-) create mode 100644 portal-loop/extracted/p/Olawale22/mail/package.gno create mode 100644 portal-loop/extracted/p/Olawale22/mail/pkg_metadata.json create mode 100644 portal-loop/extracted/p/Olawale22/mail:0/package.gno create mode 100644 portal-loop/extracted/p/Olawale22/mail:0/pkg_metadata.json create mode 100644 portal-loop/extracted/p/counter/package.gno create mode 100644 portal-loop/extracted/p/counter/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/acl/acl.gno create mode 100644 portal-loop/extracted/p/demo/acl/acl_test.gno create mode 100644 portal-loop/extracted/p/demo/acl/const.gno create mode 100644 portal-loop/extracted/p/demo/acl/perm.gno create mode 100644 portal-loop/extracted/p/demo/acl/perms.gno create mode 100644 portal-loop/extracted/p/demo/acl/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/avl/node.gno create mode 100644 portal-loop/extracted/p/demo/avl/node_test.gno create mode 100644 portal-loop/extracted/p/demo/avl/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/avl/tree.gno create mode 100644 portal-loop/extracted/p/demo/avl/tree_test.gno create mode 100644 portal-loop/extracted/p/demo/avl/z_0_filetest.gno create mode 100644 portal-loop/extracted/p/demo/avl/z_1_filetest.gno create mode 100644 portal-loop/extracted/p/demo/avl/z_2_filetest.gno create mode 100644 portal-loop/extracted/p/demo/avlhelpers/avlhelpers.gno create mode 100644 portal-loop/extracted/p/demo/avlhelpers/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/avlhelpers/z_0_filetest.gno create mode 100644 portal-loop/extracted/p/demo/bank/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/bank/types.gno create mode 100644 portal-loop/extracted/p/demo/bf/bf.gno create mode 100644 portal-loop/extracted/p/demo/bf/bf_test.gno create mode 100644 portal-loop/extracted/p/demo/bf/doc.gno create mode 100644 portal-loop/extracted/p/demo/bf/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/bf/run.gno create mode 100644 portal-loop/extracted/p/demo/blog/blog.gno create mode 100644 portal-loop/extracted/p/demo/blog/blog_test.gno create mode 100644 portal-loop/extracted/p/demo/blog/errors.gno create mode 100644 portal-loop/extracted/p/demo/blog/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/blog/util.gno create mode 100644 portal-loop/extracted/p/demo/cford32/LICENSE create mode 100644 portal-loop/extracted/p/demo/cford32/README.md create mode 100644 portal-loop/extracted/p/demo/cford32/cford32.gno create mode 100644 portal-loop/extracted/p/demo/cford32/cford32_test.gno create mode 100644 portal-loop/extracted/p/demo/cford32/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/context/context.gno create mode 100644 portal-loop/extracted/p/demo/context/context_test.gno create mode 100644 portal-loop/extracted/p/demo/context/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/diff/diff.gno create mode 100644 portal-loop/extracted/p/demo/diff/diff_test.gno create mode 100644 portal-loop/extracted/p/demo/diff/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/dom/dom.gno create mode 100644 portal-loop/extracted/p/demo/dom/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/echo1/echo.gno create mode 100644 portal-loop/extracted/p/demo/echo1/echo_test.gno create mode 100644 portal-loop/extracted/p/demo/echo1/gno.mod create mode 100644 portal-loop/extracted/p/demo/echo1/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/entropy/entropy.gno create mode 100644 portal-loop/extracted/p/demo/entropy/entropy_test.gno create mode 100644 portal-loop/extracted/p/demo/entropy/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/entropy/z_filetest.gno create mode 100644 portal-loop/extracted/p/demo/flow/LICENSE create mode 100644 portal-loop/extracted/p/demo/flow/README.md create mode 100644 portal-loop/extracted/p/demo/flow/flow.gno create mode 100644 portal-loop/extracted/p/demo/flow/io.gno create mode 100644 portal-loop/extracted/p/demo/flow/io_test.gno create mode 100644 portal-loop/extracted/p/demo/flow/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/flow/util.gno create mode 100644 portal-loop/extracted/p/demo/fqname/fqname.gno create mode 100644 portal-loop/extracted/p/demo/fqname/fqname_test.gno create mode 100644 portal-loop/extracted/p/demo/fqname/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/gnode/gnode.gno create mode 100644 portal-loop/extracted/p/demo/gnode/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/gnorkle/agent/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/gnorkle/agent/whitelist.gno create mode 100644 portal-loop/extracted/p/demo/gnorkle/agent/whitelist_test.gno create mode 100644 portal-loop/extracted/p/demo/gnorkle/feed/errors.gno create mode 100644 portal-loop/extracted/p/demo/gnorkle/feed/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/gnorkle/feed/task.gno create mode 100644 portal-loop/extracted/p/demo/gnorkle/feed/type.gno create mode 100644 portal-loop/extracted/p/demo/gnorkle/feed/value.gno create mode 100644 portal-loop/extracted/p/demo/gnorkle/feeds/static/feed.gno create mode 100644 portal-loop/extracted/p/demo/gnorkle/feeds/static/feed_test.gno create mode 100644 portal-loop/extracted/p/demo/gnorkle/feeds/static/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/gnorkle/gnorkle/feed.gno create mode 100644 portal-loop/extracted/p/demo/gnorkle/gnorkle/ingester.gno create mode 100644 portal-loop/extracted/p/demo/gnorkle/gnorkle/instance.gno create mode 100644 portal-loop/extracted/p/demo/gnorkle/gnorkle/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/gnorkle/gnorkle/storage.gno create mode 100644 portal-loop/extracted/p/demo/gnorkle/gnorkle/whitelist.gno create mode 100644 portal-loop/extracted/p/demo/gnorkle/ingester/errors.gno create mode 100644 portal-loop/extracted/p/demo/gnorkle/ingester/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/gnorkle/ingester/type.gno create mode 100644 portal-loop/extracted/p/demo/gnorkle/ingesters/single/ingester.gno create mode 100644 portal-loop/extracted/p/demo/gnorkle/ingesters/single/ingester_test.gno create mode 100644 portal-loop/extracted/p/demo/gnorkle/ingesters/single/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/gnorkle/message/parse.gno create mode 100644 portal-loop/extracted/p/demo/gnorkle/message/parse_test.gno create mode 100644 portal-loop/extracted/p/demo/gnorkle/message/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/gnorkle/message/type.gno create mode 100644 portal-loop/extracted/p/demo/gnorkle/storage/errors.gno create mode 100644 portal-loop/extracted/p/demo/gnorkle/storage/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/gnorkle/storage/simple/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/gnorkle/storage/simple/storage.gno create mode 100644 portal-loop/extracted/p/demo/gnorkle/storage/simple/storage_test.gno create mode 100644 portal-loop/extracted/p/demo/grc/exts/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/grc/exts/token_metadata.gno create mode 100644 portal-loop/extracted/p/demo/grc/grc1155/README.md create mode 100644 portal-loop/extracted/p/demo/grc/grc1155/basic_grc1155_token.gno create mode 100644 portal-loop/extracted/p/demo/grc/grc1155/basic_grc1155_token_test.gno create mode 100644 portal-loop/extracted/p/demo/grc/grc1155/errors.gno create mode 100644 portal-loop/extracted/p/demo/grc/grc1155/igrc1155.gno create mode 100644 portal-loop/extracted/p/demo/grc/grc1155/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/grc/grc1155/util.gno create mode 100644 portal-loop/extracted/p/demo/grc/grc20/banker.gno create mode 100644 portal-loop/extracted/p/demo/grc/grc20/banker_test.gno create mode 100644 portal-loop/extracted/p/demo/grc/grc20/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/grc/grc20/token.gno create mode 100644 portal-loop/extracted/p/demo/grc/grc20/token_test.gno create mode 100644 portal-loop/extracted/p/demo/grc/grc20/types.gno create mode 100644 portal-loop/extracted/p/demo/grc/grc721/basic_nft.gno create mode 100644 portal-loop/extracted/p/demo/grc/grc721/basic_nft_test.gno create mode 100644 portal-loop/extracted/p/demo/grc/grc721/errors.gno create mode 100644 portal-loop/extracted/p/demo/grc/grc721/grc721_metadata.gno create mode 100644 portal-loop/extracted/p/demo/grc/grc721/grc721_metadata_test.gno create mode 100644 portal-loop/extracted/p/demo/grc/grc721/grc721_royalty.gno create mode 100644 portal-loop/extracted/p/demo/grc/grc721/grc721_royalty_test.gno create mode 100644 portal-loop/extracted/p/demo/grc/grc721/igrc721.gno create mode 100644 portal-loop/extracted/p/demo/grc/grc721/igrc721_metadata.gno create mode 100644 portal-loop/extracted/p/demo/grc/grc721/igrc721_royalty.gno create mode 100644 portal-loop/extracted/p/demo/grc/grc721/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/grc/grc721/util.gno create mode 100644 portal-loop/extracted/p/demo/grc/grc777/dummy_test.gno create mode 100644 portal-loop/extracted/p/demo/grc/grc777/igrc777.gno create mode 100644 portal-loop/extracted/p/demo/grc/grc777/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/groups/groups.gno create mode 100644 portal-loop/extracted/p/demo/groups/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/groups/vote_set.gno create mode 100644 portal-loop/extracted/p/demo/groups/z_1_filetest.gno create mode 100644 portal-loop/extracted/p/demo/int256/LICENSE create mode 100644 portal-loop/extracted/p/demo/int256/README.md create mode 100644 portal-loop/extracted/p/demo/int256/absolute.gno create mode 100644 portal-loop/extracted/p/demo/int256/absolute_test.gno create mode 100644 portal-loop/extracted/p/demo/int256/arithmetic.gno create mode 100644 portal-loop/extracted/p/demo/int256/arithmetic_test.gno create mode 100644 portal-loop/extracted/p/demo/int256/bitwise.gno create mode 100644 portal-loop/extracted/p/demo/int256/bitwise_test.gno create mode 100644 portal-loop/extracted/p/demo/int256/cmp.gno create mode 100644 portal-loop/extracted/p/demo/int256/cmp_test.gno create mode 100644 portal-loop/extracted/p/demo/int256/conversion.gno create mode 100644 portal-loop/extracted/p/demo/int256/conversion_test.gno create mode 100644 portal-loop/extracted/p/demo/int256/int256.gno create mode 100644 portal-loop/extracted/p/demo/int256/int256_test.gno create mode 100644 portal-loop/extracted/p/demo/int256/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/json/eisel_lemire/eisel_lemire.gno create mode 100644 portal-loop/extracted/p/demo/json/eisel_lemire/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/json/ryu/floatconv.gno create mode 100644 portal-loop/extracted/p/demo/json/ryu/floatconv_test.gno create mode 100644 portal-loop/extracted/p/demo/json/ryu/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/json/ryu/ryu64.gno create mode 100644 portal-loop/extracted/p/demo/json/ryu/table.gno create mode 100644 portal-loop/extracted/p/demo/json:0/LICENSE create mode 100644 portal-loop/extracted/p/demo/json:0/README.md create mode 100644 portal-loop/extracted/p/demo/json:0/buffer.gno create mode 100644 portal-loop/extracted/p/demo/json:0/buffer_test.gno create mode 100644 portal-loop/extracted/p/demo/json:0/decode.gno create mode 100644 portal-loop/extracted/p/demo/json:0/decode_test.gno create mode 100644 portal-loop/extracted/p/demo/json:0/encode.gno create mode 100644 portal-loop/extracted/p/demo/json:0/encode_test.gno create mode 100644 portal-loop/extracted/p/demo/json:0/escape.gno create mode 100644 portal-loop/extracted/p/demo/json:0/escape_test.gno create mode 100644 portal-loop/extracted/p/demo/json:0/indent.gno create mode 100644 portal-loop/extracted/p/demo/json:0/indent_test.gno create mode 100644 portal-loop/extracted/p/demo/json:0/internal.gno create mode 100644 portal-loop/extracted/p/demo/json:0/node.gno create mode 100644 portal-loop/extracted/p/demo/json:0/node_test.gno create mode 100644 portal-loop/extracted/p/demo/json:0/parser.gno create mode 100644 portal-loop/extracted/p/demo/json:0/parser_test.gno create mode 100644 portal-loop/extracted/p/demo/json:0/path.gno create mode 100644 portal-loop/extracted/p/demo/json:0/path_test.gno create mode 100644 portal-loop/extracted/p/demo/json:0/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/json:0/token.gno create mode 100644 portal-loop/extracted/p/demo/math_eval/int32/int32.gno create mode 100644 portal-loop/extracted/p/demo/math_eval/int32/int32_test.gno create mode 100644 portal-loop/extracted/p/demo/math_eval/int32/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/memeland/memeland.gno create mode 100644 portal-loop/extracted/p/demo/memeland/memeland_test.gno create mode 100644 portal-loop/extracted/p/demo/memeland/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/merkle/README.md create mode 100644 portal-loop/extracted/p/demo/merkle/merkle.gno create mode 100644 portal-loop/extracted/p/demo/merkle/merkle_test.gno create mode 100644 portal-loop/extracted/p/demo/merkle/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/microblog/microblog.gno create mode 100644 portal-loop/extracted/p/demo/microblog/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/mux/doc.gno create mode 100644 portal-loop/extracted/p/demo/mux/handler.gno create mode 100644 portal-loop/extracted/p/demo/mux/helpers.gno create mode 100644 portal-loop/extracted/p/demo/mux/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/mux/request.gno create mode 100644 portal-loop/extracted/p/demo/mux/request_test.gno create mode 100644 portal-loop/extracted/p/demo/mux/response.gno create mode 100644 portal-loop/extracted/p/demo/mux/router.gno create mode 100644 portal-loop/extracted/p/demo/mux/router_test.gno create mode 100644 portal-loop/extracted/p/demo/nestedpkg/nestedpkg.gno create mode 100644 portal-loop/extracted/p/demo/nestedpkg/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/ownable/errors.gno create mode 100644 portal-loop/extracted/p/demo/ownable/exts/authorizable/authorizable.gno create mode 100644 portal-loop/extracted/p/demo/ownable/exts/authorizable/authorizable_test.gno create mode 100644 portal-loop/extracted/p/demo/ownable/exts/authorizable/errors.gno create mode 100644 portal-loop/extracted/p/demo/ownable/exts/authorizable/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/ownable/ownable.gno create mode 100644 portal-loop/extracted/p/demo/ownable/ownable_test.gno create mode 100644 portal-loop/extracted/p/demo/ownable/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/pausable/pausable.gno create mode 100644 portal-loop/extracted/p/demo/pausable/pausable_test.gno create mode 100644 portal-loop/extracted/p/demo/pausable/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/printfdebugging/color.gno create mode 100644 portal-loop/extracted/p/demo/printfdebugging/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/printfdebugging/printfdebugging.gno create mode 100644 portal-loop/extracted/p/demo/rat/maths.gno create mode 100644 portal-loop/extracted/p/demo/rat/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/rat/rat.gno create mode 100644 portal-loop/extracted/p/demo/releases/changelog.gno create mode 100644 portal-loop/extracted/p/demo/releases/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/releases/release.gno create mode 100644 portal-loop/extracted/p/demo/seqid/README.md create mode 100644 portal-loop/extracted/p/demo/seqid/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/seqid/seqid.gno create mode 100644 portal-loop/extracted/p/demo/seqid/seqid_test.gno create mode 100644 portal-loop/extracted/p/demo/stack/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/stack/stack.gno create mode 100644 portal-loop/extracted/p/demo/stack/stack_test.gno create mode 100644 portal-loop/extracted/p/demo/subscription/doc.gno create mode 100644 portal-loop/extracted/p/demo/subscription/lifetime/errors.gno create mode 100644 portal-loop/extracted/p/demo/subscription/lifetime/lifetime.gno create mode 100644 portal-loop/extracted/p/demo/subscription/lifetime/lifetime_test.gno create mode 100644 portal-loop/extracted/p/demo/subscription/lifetime/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/subscription/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/subscription/recurring/errors.gno create mode 100644 portal-loop/extracted/p/demo/subscription/recurring/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/subscription/recurring/recurring.gno create mode 100644 portal-loop/extracted/p/demo/subscription/recurring/recurring_test.gno create mode 100644 portal-loop/extracted/p/demo/subscription/subscription.gno create mode 100644 portal-loop/extracted/p/demo/svg/doc.gno create mode 100644 portal-loop/extracted/p/demo/svg/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/svg/svg.gno create mode 100644 portal-loop/extracted/p/demo/svg/z0_filetest.gno create mode 100644 portal-loop/extracted/p/demo/svg/z1_filetest.gno create mode 100644 portal-loop/extracted/p/demo/tamagotchi/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/tamagotchi/tamagotchi.gno create mode 100644 portal-loop/extracted/p/demo/tamagotchi/z0_filetest.gno create mode 100644 portal-loop/extracted/p/demo/ternary/README.md create mode 100644 portal-loop/extracted/p/demo/ternary/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/ternary/ternary.gno create mode 100644 portal-loop/extracted/p/demo/ternary/ternary_test.gno create mode 100644 portal-loop/extracted/p/demo/tests/p_crossrealm/p_crossrealm.gno create mode 100644 portal-loop/extracted/p/demo/tests/p_crossrealm/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/tests/subtests/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/tests/subtests/subtests.gno create mode 100644 portal-loop/extracted/p/demo/tests:0/README.md create mode 100644 portal-loop/extracted/p/demo/tests:0/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/tests:0/tests.gno create mode 100644 portal-loop/extracted/p/demo/tests:0/tests_test.gno create mode 100644 portal-loop/extracted/p/demo/tests:0/z0_filetest.gno create mode 100644 portal-loop/extracted/p/demo/testutils/access.gno create mode 100644 portal-loop/extracted/p/demo/testutils/crypto.gno create mode 100644 portal-loop/extracted/p/demo/testutils/misc.gno create mode 100644 portal-loop/extracted/p/demo/testutils/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/tictactoe/game.gno create mode 100644 portal-loop/extracted/p/demo/tictactoe/game_test.gno create mode 100644 portal-loop/extracted/p/demo/tictactoe/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/tictactoe/tictactoe1p/1pvscpu.gno create mode 100644 portal-loop/extracted/p/demo/tictactoe/tictactoe1p/1pvscpu_test.gno create mode 100644 portal-loop/extracted/p/demo/tictactoe/tictactoe1p/README.md create mode 100644 portal-loop/extracted/p/demo/tictactoe/tictactoe1p/ai.gno create mode 100644 portal-loop/extracted/p/demo/tictactoe/tictactoe1p/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/todolist/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/todolist/todolist.gno create mode 100644 portal-loop/extracted/p/demo/todolist/todolist_test.gno create mode 100644 portal-loop/extracted/p/demo/uassert/doc.gno create mode 100644 portal-loop/extracted/p/demo/uassert/helpers.gno create mode 100644 portal-loop/extracted/p/demo/uassert/mock_test.gno create mode 100644 portal-loop/extracted/p/demo/uassert/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/uassert/types.gno create mode 100644 portal-loop/extracted/p/demo/uassert/uassert.gno create mode 100644 portal-loop/extracted/p/demo/uassert/uassert_test.gno create mode 100644 portal-loop/extracted/p/demo/ufmt/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/ufmt/ufmt.gno create mode 100644 portal-loop/extracted/p/demo/ufmt/ufmt_test.gno create mode 100644 portal-loop/extracted/p/demo/ui/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/ui/ui.gno create mode 100644 portal-loop/extracted/p/demo/ui/ui_test.gno create mode 100644 portal-loop/extracted/p/demo/uint256/LICENSE create mode 100644 portal-loop/extracted/p/demo/uint256/README.md create mode 100644 portal-loop/extracted/p/demo/uint256/arithmetic.gno create mode 100644 portal-loop/extracted/p/demo/uint256/arithmetic_test.gno create mode 100644 portal-loop/extracted/p/demo/uint256/bits_table.gno create mode 100644 portal-loop/extracted/p/demo/uint256/bitwise.gno create mode 100644 portal-loop/extracted/p/demo/uint256/bitwise_test.gno create mode 100644 portal-loop/extracted/p/demo/uint256/cmp.gno create mode 100644 portal-loop/extracted/p/demo/uint256/cmp_test.gno create mode 100644 portal-loop/extracted/p/demo/uint256/conversion.gno create mode 100644 portal-loop/extracted/p/demo/uint256/conversion_test.gno create mode 100644 portal-loop/extracted/p/demo/uint256/error.gno create mode 100644 portal-loop/extracted/p/demo/uint256/mod.gno create mode 100644 portal-loop/extracted/p/demo/uint256/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/uint256/uint256.gno create mode 100644 portal-loop/extracted/p/demo/uint256/utils.gno create mode 100644 portal-loop/extracted/p/demo/urequire/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/urequire/urequire.gno create mode 100644 portal-loop/extracted/p/demo/urequire/urequire_test.gno create mode 100644 portal-loop/extracted/p/demo/users/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/users/types.gno create mode 100644 portal-loop/extracted/p/demo/users/users.gno create mode 100644 portal-loop/extracted/p/demo/users/users_test.gno create mode 100644 portal-loop/extracted/p/demo/watchdog/pkg_metadata.json create mode 100644 portal-loop/extracted/p/demo/watchdog/watchdog.gno create mode 100644 portal-loop/extracted/p/demo/watchdog/watchdog_test.gno create mode 100644 portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/alerts/alerts.gno create mode 100644 portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/alerts/pkg_metadata.json create mode 100644 portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/blog/LICENSE create mode 100644 portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/blog/asserts.gno create mode 100644 portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/blog/asserts_test.gno create mode 100644 portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/blog/blog.gno create mode 100644 portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/blog/invar.gno create mode 100644 portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/blog/pkg_metadata.json create mode 100644 portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/blog/post.gno create mode 100644 portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/LICENSE create mode 100644 portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/dao.gno create mode 100644 portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/dao_test.gno create mode 100644 portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/id.gno create mode 100644 portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/marshal.gno create mode 100644 portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/pkg_metadata.json create mode 100644 portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/proposal.gno create mode 100644 portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/proposal_test.gno create mode 100644 portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/record.gno create mode 100644 portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/record_test.gno create mode 100644 portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/render.gno create mode 100644 portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/strategy.gno create mode 100644 portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/uri.gno create mode 100644 portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/uri_test.gno create mode 100644 portal-loop/extracted/p/gnome/alerts/LICENSE create mode 100644 portal-loop/extracted/p/gnome/alerts/alerts.gno create mode 100644 portal-loop/extracted/p/gnome/alerts/pkg_metadata.json create mode 100644 portal-loop/extracted/p/gnome/blog/LICENSE create mode 100644 portal-loop/extracted/p/gnome/blog/asserts.gno create mode 100644 portal-loop/extracted/p/gnome/blog/asserts_test.gno create mode 100644 portal-loop/extracted/p/gnome/blog/blog.gno create mode 100644 portal-loop/extracted/p/gnome/blog/invar.gno create mode 100644 portal-loop/extracted/p/gnome/blog/pkg_metadata.json create mode 100644 portal-loop/extracted/p/gnome/blog/post.gno create mode 100644 portal-loop/extracted/p/gnome/dao/LICENSE create mode 100644 portal-loop/extracted/p/gnome/dao/dao.gno create mode 100644 portal-loop/extracted/p/gnome/dao/dao_test.gno create mode 100644 portal-loop/extracted/p/gnome/dao/id.gno create mode 100644 portal-loop/extracted/p/gnome/dao/invar.gno create mode 100644 portal-loop/extracted/p/gnome/dao/paginator.gno create mode 100644 portal-loop/extracted/p/gnome/dao/paginator_test.gno create mode 100644 portal-loop/extracted/p/gnome/dao/params.gno create mode 100644 portal-loop/extracted/p/gnome/dao/pkg_metadata.json create mode 100644 portal-loop/extracted/p/gnome/dao/proposal.gno create mode 100644 portal-loop/extracted/p/gnome/dao/proposal_test.gno create mode 100644 portal-loop/extracted/p/gnome/dao/record.gno create mode 100644 portal-loop/extracted/p/gnome/dao/record_test.gno create mode 100644 portal-loop/extracted/p/gnome/dao/render.gno create mode 100644 portal-loop/extracted/p/gnome/dao/strategy.gno create mode 100644 portal-loop/extracted/p/gnome/dao/uri.gno create mode 100644 portal-loop/extracted/p/gnome/dao/uri_test.gno create mode 100644 portal-loop/extracted/p/gnome/router/LICENSE create mode 100644 portal-loop/extracted/p/gnome/router/pkg_metadata.json create mode 100644 portal-loop/extracted/p/gnome/router/router.gno create mode 100644 portal-loop/extracted/p/gnome/router/v1/LICENSE create mode 100644 portal-loop/extracted/p/gnome/router/v1/pkg_metadata.json create mode 100644 portal-loop/extracted/p/gnome/router/v1/router.gno create mode 100644 portal-loop/extracted/p/gnome/router/v1/router_test.gno create mode 100644 portal-loop/extracted/p/gov/proposal/pkg_metadata.json create mode 100644 portal-loop/extracted/p/gov/proposal/proposal.gno create mode 100644 portal-loop/extracted/p/gov/proposal/proposal_test.gno create mode 100644 portal-loop/extracted/p/gov/proposal/types.gno create mode 100644 portal-loop/extracted/p/hello/package.gno create mode 100644 portal-loop/extracted/p/hello/pkg_metadata.json create mode 100644 portal-loop/extracted/p/hello:0/package.gno create mode 100644 portal-loop/extracted/p/hello:0/pkg_metadata.json create mode 100644 portal-loop/extracted/p/leon/demo/poll/package.gno create mode 100644 portal-loop/extracted/p/leon/demo/poll/pkg_metadata.json create mode 100644 portal-loop/extracted/p/leon/demo/poll/pkg_test.gno create mode 100644 portal-loop/extracted/p/leon/demo/poll:0/package.gno create mode 100644 portal-loop/extracted/p/leon/demo/poll:0/pkg_metadata.json create mode 100644 portal-loop/extracted/p/leon/demo/poll:0/pkg_test.gno create mode 100644 portal-loop/extracted/p/namespacetest/hello/hello.gno create mode 100644 portal-loop/extracted/p/namespacetest/hello/pkg_metadata.json create mode 100644 portal-loop/extracted/p/nt/poa/option.gno create mode 100644 portal-loop/extracted/p/nt/poa/pkg_metadata.json create mode 100644 portal-loop/extracted/p/nt/poa/poa.gno create mode 100644 portal-loop/extracted/p/nt/poa/poa_test.gno create mode 100644 portal-loop/extracted/p/sulaiman/mail/package.gno create mode 100644 portal-loop/extracted/p/sulaiman/mail/pkg_metadata.json create mode 100644 portal-loop/extracted/p/sys/validators/pkg_metadata.json create mode 100644 portal-loop/extracted/p/sys/validators/types.gno create mode 100644 portal-loop/extracted/r/2Uwr0fffBG/raffle/package.gno create mode 100644 portal-loop/extracted/r/2Uwr0fffBG/raffle/pkg_metadata.json create mode 100644 portal-loop/extracted/r/Olawale22/mail/package.gno create mode 100644 portal-loop/extracted/r/Olawale22/mail/pkg_metadata.json create mode 100644 portal-loop/extracted/r/SamRecruits/entry/package.gno create mode 100644 portal-loop/extracted/r/SamRecruits/entry/pkg_metadata.json create mode 100644 portal-loop/extracted/r/SamRecruits/entry:0/package.gno create mode 100644 portal-loop/extracted/r/SamRecruits/entry:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/ab/raffle/gno.mod create mode 100644 portal-loop/extracted/r/ab/raffle/pkg_metadata.json create mode 100644 portal-loop/extracted/r/ab/raffle/raffle.gno create mode 100644 portal-loop/extracted/r/ab/raffle:0/gno.mod create mode 100644 portal-loop/extracted/r/ab/raffle:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/ab/raffle:0/raffle.gno create mode 100644 portal-loop/extracted/r/abach/raffle/gno.mod create mode 100644 portal-loop/extracted/r/abach/raffle/pkg_metadata.json create mode 100644 portal-loop/extracted/r/abach/raffle/raffle.gno create mode 100644 portal-loop/extracted/r/abach/raffle:0/gno.mod create mode 100644 portal-loop/extracted/r/abach/raffle:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/abach/raffle:0/raffle.gno create mode 100644 portal-loop/extracted/r/ajnavarro/raffle/package.gno create mode 100644 portal-loop/extracted/r/ajnavarro/raffle/pkg_metadata.json create mode 100644 portal-loop/extracted/r/ajnavarro/raffle:0/package.gno create mode 100644 portal-loop/extracted/r/ajnavarro/raffle:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/albttx/home/home.gno create mode 100644 portal-loop/extracted/r/albttx/home/pkg_metadata.json create mode 100644 portal-loop/extracted/r/allylee/raffle/package.gno create mode 100644 portal-loop/extracted/r/allylee/raffle/pkg_metadata.json create mode 100644 portal-loop/extracted/r/arjunmalhotra1/entry/pkg_metadata.json create mode 100644 portal-loop/extracted/r/arjunmalhotra1/entry/raffle.gno create mode 100644 portal-loop/extracted/r/arjunmalhotra1/entry2/pkg_metadata.json create mode 100644 portal-loop/extracted/r/arjunmalhotra1/entry2/raffle.gno create mode 100644 portal-loop/extracted/r/arjunmalhotra1/entry3/pkg_metadata.json create mode 100644 portal-loop/extracted/r/arjunmalhotra1/entry3/raffle.gno create mode 100644 portal-loop/extracted/r/arjunmalhotra1/entry4/pkg_metadata.json create mode 100644 portal-loop/extracted/r/arjunmalhotra1/entry4/raffle.gno create mode 100644 portal-loop/extracted/r/arjunmalhotra1/entry4:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/arjunmalhotra1/entry4:0/raffle.gno create mode 100644 portal-loop/extracted/r/arjunmalhotra1/entry5/pkg_metadata.json create mode 100644 portal-loop/extracted/r/arjunmalhotra1/entry5/raffle.gno create mode 100644 portal-loop/extracted/r/arjunmalhotra1/entry6/pkg_metadata.json create mode 100644 portal-loop/extracted/r/arjunmalhotra1/entry6/raffle.gno create mode 100644 portal-loop/extracted/r/arjunmalhotra1/entry6:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/arjunmalhotra1/entry6:0/raffle.gno create mode 100644 portal-loop/extracted/r/arjunmalhotra1/entry:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/arjunmalhotra1/entry:0/raffle.gno create mode 100644 portal-loop/extracted/r/arjunmalhotra1/raffle/pkg_metadata.json create mode 100644 portal-loop/extracted/r/arjunmalhotra1/raffle/raffle.gno create mode 100644 portal-loop/extracted/r/bob/raffle10/package.gno create mode 100644 portal-loop/extracted/r/bob/raffle10/pkg_metadata.json create mode 100644 portal-loop/extracted/r/bob/raffle10:0/package.gno create mode 100644 portal-loop/extracted/r/bob/raffle10:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/bobbyluig/raffle1/pkg_metadata.json create mode 100644 portal-loop/extracted/r/bobbyluig/raffle1/raffle.gno create mode 100644 portal-loop/extracted/r/bobbyluig/raffle10/package.gno create mode 100644 portal-loop/extracted/r/bobbyluig/raffle10/pkg_metadata.json create mode 100644 portal-loop/extracted/r/bobbyluig/raffle1:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/bobbyluig/raffle1:0/raffle.gno create mode 100644 portal-loop/extracted/r/bobbyluig/raffle2/pkg_metadata.json create mode 100644 portal-loop/extracted/r/bobbyluig/raffle2/raffle.gno create mode 100644 portal-loop/extracted/r/bobbyluig/raffle2:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/bobbyluig/raffle2:0/raffle.gno create mode 100644 portal-loop/extracted/r/boonedox/hello/package.gno create mode 100644 portal-loop/extracted/r/boonedox/hello/pkg_metadata.json create mode 100644 portal-loop/extracted/r/boonedox/hello:0/package.gno create mode 100644 portal-loop/extracted/r/boonedox/hello:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/charlysotelo/raffle/package.gno create mode 100644 portal-loop/extracted/r/charlysotelo/raffle/pkg_metadata.json create mode 100644 portal-loop/extracted/r/charlysotelo/raffle:0/package.gno create mode 100644 portal-loop/extracted/r/charlysotelo/raffle:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/charlysotelo/raffle_username/package.gno create mode 100644 portal-loop/extracted/r/charlysotelo/raffle_username/pkg_metadata.json create mode 100644 portal-loop/extracted/r/charlysotelo/raffle_username_a_lot/package.gno create mode 100644 portal-loop/extracted/r/charlysotelo/raffle_username_a_lot/pkg_metadata.json create mode 100644 portal-loop/extracted/r/ckami2088/raffle/package.gno create mode 100644 portal-loop/extracted/r/ckami2088/raffle/pkg_metadata.json create mode 100644 portal-loop/extracted/r/ckami2088/raffle:0/package.gno create mode 100644 portal-loop/extracted/r/ckami2088/raffle:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/ckami2088/rafflegithub/package.gno create mode 100644 portal-loop/extracted/r/ckami2088/rafflegithub/pkg_metadata.json create mode 100644 portal-loop/extracted/r/conradsmi/raffle/package.gno create mode 100644 portal-loop/extracted/r/conradsmi/raffle/pkg_metadata.json create mode 100644 portal-loop/extracted/r/conradsmi/raffle:0/package.gno create mode 100644 portal-loop/extracted/r/conradsmi/raffle:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/counter/package.gno create mode 100644 portal-loop/extracted/r/counter/package_test.gno create mode 100644 portal-loop/extracted/r/counter/pkg_metadata.json create mode 100644 portal-loop/extracted/r/counter:0/counter.gno create mode 100644 portal-loop/extracted/r/counter:0/package.gno create mode 100644 portal-loop/extracted/r/counter:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/cryptopunkstar/package.gno create mode 100644 portal-loop/extracted/r/cryptopunkstar/pkg_metadata.json create mode 100644 portal-loop/extracted/r/cryptopunkstar:0/package.gno create mode 100644 portal-loop/extracted/r/cryptopunkstar:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/deelawn/tsrf/package.gno create mode 100644 portal-loop/extracted/r/deelawn/tsrf/pkg_metadata.json create mode 100644 portal-loop/extracted/r/deelawn/tsrf:0/package.gno create mode 100644 portal-loop/extracted/r/deelawn/tsrf:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/art/gnoface/gnoface.gno create mode 100644 portal-loop/extracted/r/demo/art/gnoface/gnoface_test.gno create mode 100644 portal-loop/extracted/r/demo/art/gnoface/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/art/millipede/millipede.gno create mode 100644 portal-loop/extracted/r/demo/art/millipede/millipede_test.gno create mode 100644 portal-loop/extracted/r/demo/art/millipede/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/banktest/README.md create mode 100644 portal-loop/extracted/r/demo/banktest/banktest.gno create mode 100644 portal-loop/extracted/r/demo/banktest/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/banktest/z_0_filetest.gno create mode 100644 portal-loop/extracted/r/demo/banktest/z_1_filetest.gno create mode 100644 portal-loop/extracted/r/demo/banktest/z_2_filetest.gno create mode 100644 portal-loop/extracted/r/demo/banktest/z_3_filetest.gno create mode 100644 portal-loop/extracted/r/demo/bar20/bar20.gno create mode 100644 portal-loop/extracted/r/demo/bar20/bar20_test.gno create mode 100644 portal-loop/extracted/r/demo/bar20/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/boards/README.md create mode 100644 portal-loop/extracted/r/demo/boards/board.gno create mode 100644 portal-loop/extracted/r/demo/boards/boards.gno create mode 100644 portal-loop/extracted/r/demo/boards/misc.gno create mode 100644 portal-loop/extracted/r/demo/boards/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/boards/post.gno create mode 100644 portal-loop/extracted/r/demo/boards/public.gno create mode 100644 portal-loop/extracted/r/demo/boards/render.gno create mode 100644 portal-loop/extracted/r/demo/boards/role.gno create mode 100644 portal-loop/extracted/r/demo/boards/z_0_a_filetest.gno create mode 100644 portal-loop/extracted/r/demo/boards/z_0_b_filetest.gno create mode 100644 portal-loop/extracted/r/demo/boards/z_0_c_filetest.gno create mode 100644 portal-loop/extracted/r/demo/boards/z_0_d_filetest.gno create mode 100644 portal-loop/extracted/r/demo/boards/z_0_e_filetest.gno create mode 100644 portal-loop/extracted/r/demo/boards/z_0_filetest.gno create mode 100644 portal-loop/extracted/r/demo/boards/z_10_a_filetest.gno create mode 100644 portal-loop/extracted/r/demo/boards/z_10_b_filetest.gno create mode 100644 portal-loop/extracted/r/demo/boards/z_10_c_filetest.gno create mode 100644 portal-loop/extracted/r/demo/boards/z_10_filetest.gno create mode 100644 portal-loop/extracted/r/demo/boards/z_11_a_filetest.gno create mode 100644 portal-loop/extracted/r/demo/boards/z_11_b_filetest.gno create mode 100644 portal-loop/extracted/r/demo/boards/z_11_c_filetest.gno create mode 100644 portal-loop/extracted/r/demo/boards/z_11_d_filetest.gno create mode 100644 portal-loop/extracted/r/demo/boards/z_11_filetest.gno create mode 100644 portal-loop/extracted/r/demo/boards/z_12_a_filetest.gno create mode 100644 portal-loop/extracted/r/demo/boards/z_12_b_filetest.gno create mode 100644 portal-loop/extracted/r/demo/boards/z_12_c_filetest.gno create mode 100644 portal-loop/extracted/r/demo/boards/z_12_d_filetest.gno create mode 100644 portal-loop/extracted/r/demo/boards/z_12_filetest.gno create mode 100644 portal-loop/extracted/r/demo/boards/z_1_filetest.gno create mode 100644 portal-loop/extracted/r/demo/boards/z_2_filetest.gno create mode 100644 portal-loop/extracted/r/demo/boards/z_3_filetest.gno create mode 100644 portal-loop/extracted/r/demo/boards/z_4_filetest.gno create mode 100644 portal-loop/extracted/r/demo/boards/z_5_b_filetest.gno create mode 100644 portal-loop/extracted/r/demo/boards/z_5_c_filetest.gno create mode 100644 portal-loop/extracted/r/demo/boards/z_5_d_filetest.gno create mode 100644 portal-loop/extracted/r/demo/boards/z_5_filetest.gno create mode 100644 portal-loop/extracted/r/demo/boards/z_6_filetest.gno create mode 100644 portal-loop/extracted/r/demo/boards/z_7_filetest.gno create mode 100644 portal-loop/extracted/r/demo/boards/z_8_filetest.gno create mode 100644 portal-loop/extracted/r/demo/boards/z_9_a_filetest.gno create mode 100644 portal-loop/extracted/r/demo/boards/z_9_b_filetest.gno create mode 100644 portal-loop/extracted/r/demo/boards/z_9_filetest.gno create mode 100644 portal-loop/extracted/r/demo/counter/counter.gno create mode 100644 portal-loop/extracted/r/demo/counter/counter_test.gno create mode 100644 portal-loop/extracted/r/demo/counter/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/deep/very/deep/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/deep/very/deep/render.gno create mode 100644 portal-loop/extracted/r/demo/disperse/disperse.gno create mode 100644 portal-loop/extracted/r/demo/disperse/doc.gno create mode 100644 portal-loop/extracted/r/demo/disperse/errors.gno create mode 100644 portal-loop/extracted/r/demo/disperse/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/disperse/util.gno create mode 100644 portal-loop/extracted/r/demo/disperse/z_0_filetest.gno create mode 100644 portal-loop/extracted/r/demo/disperse/z_1_filetest.gno create mode 100644 portal-loop/extracted/r/demo/disperse/z_2_filetest.gno create mode 100644 portal-loop/extracted/r/demo/disperse/z_3_filetest.gno create mode 100644 portal-loop/extracted/r/demo/disperse/z_4_filetest.gno create mode 100644 portal-loop/extracted/r/demo/echo/echo.gno create mode 100644 portal-loop/extracted/r/demo/echo/echo_test.gno create mode 100644 portal-loop/extracted/r/demo/echo/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/echo1/echo.gno create mode 100644 portal-loop/extracted/r/demo/echo1/echo_test.gno create mode 100644 portal-loop/extracted/r/demo/echo1/gno.mod create mode 100644 portal-loop/extracted/r/demo/echo1/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/event/event.gno create mode 100644 portal-loop/extracted/r/demo/event/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/event_emitter/package.gno create mode 100644 portal-loop/extracted/r/demo/event_emitter/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/event_emitter:0/package.gno create mode 100644 portal-loop/extracted/r/demo/event_emitter:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/foo1155/foo1155.gno create mode 100644 portal-loop/extracted/r/demo/foo1155/foo1155_test.gno create mode 100644 portal-loop/extracted/r/demo/foo1155/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/foo20/foo20.gno create mode 100644 portal-loop/extracted/r/demo/foo20/foo20_test.gno create mode 100644 portal-loop/extracted/r/demo/foo20/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/foo721/foo721.gno create mode 100644 portal-loop/extracted/r/demo/foo721/foo721_test.gno create mode 100644 portal-loop/extracted/r/demo/foo721/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/games/shifumi/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/games/shifumi/shifumi.gno create mode 100644 portal-loop/extracted/r/demo/games/tictactoe/README.md create mode 100644 portal-loop/extracted/r/demo/games/tictactoe/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/games/tictactoe/render.gno create mode 100644 portal-loop/extracted/r/demo/games/tictactoe/render_test.gno create mode 100644 portal-loop/extracted/r/demo/games:0/games.gno create mode 100644 portal-loop/extracted/r/demo/games:0/games_test.gno create mode 100644 portal-loop/extracted/r/demo/games:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/grc20factory/grc20factory.gno create mode 100644 portal-loop/extracted/r/demo/grc20factory/grc20factory_test.gno create mode 100644 portal-loop/extracted/r/demo/grc20factory/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/groups/README.md create mode 100644 portal-loop/extracted/r/demo/groups/group.gno create mode 100644 portal-loop/extracted/r/demo/groups/groups.gno create mode 100644 portal-loop/extracted/r/demo/groups/member.gno create mode 100644 portal-loop/extracted/r/demo/groups/misc.gno create mode 100644 portal-loop/extracted/r/demo/groups/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/groups/public.gno create mode 100644 portal-loop/extracted/r/demo/groups/render.gno create mode 100644 portal-loop/extracted/r/demo/groups/role.gno create mode 100644 portal-loop/extracted/r/demo/groups/z_0_a_filetest.gno create mode 100644 portal-loop/extracted/r/demo/groups/z_0_b_filetest.gno create mode 100644 portal-loop/extracted/r/demo/groups/z_0_c_filetest.gno create mode 100644 portal-loop/extracted/r/demo/groups/z_1_a_filetest.gno create mode 100644 portal-loop/extracted/r/demo/groups/z_1_b_filetest.gno create mode 100644 portal-loop/extracted/r/demo/groups/z_1_c_filetest.gno create mode 100644 portal-loop/extracted/r/demo/groups/z_2_a_filetest.gno create mode 100644 portal-loop/extracted/r/demo/groups/z_2_b_filetest.gno create mode 100644 portal-loop/extracted/r/demo/groups/z_2_d_filetest.gno create mode 100644 portal-loop/extracted/r/demo/groups/z_2_e_filetest.gno create mode 100644 portal-loop/extracted/r/demo/groups/z_2_f_filetest.gno create mode 100644 portal-loop/extracted/r/demo/groups/z_2_g_filetest.gno create mode 100644 portal-loop/extracted/r/demo/hello/package.gno create mode 100644 portal-loop/extracted/r/demo/hello/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/hello:0/package.gno create mode 100644 portal-loop/extracted/r/demo/hello:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/hellopp/package.gno create mode 100644 portal-loop/extracted/r/demo/hellopp/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/keystore/keystore.gno create mode 100644 portal-loop/extracted/r/demo/keystore/keystore_test.gno create mode 100644 portal-loop/extracted/r/demo/keystore/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/mail/package.gno create mode 100644 portal-loop/extracted/r/demo/mail/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/mail:0/package.gno create mode 100644 portal-loop/extracted/r/demo/mail:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/markdown_test/markdown.gno create mode 100644 portal-loop/extracted/r/demo/markdown_test/markdown_test.gno create mode 100644 portal-loop/extracted/r/demo/markdown_test/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/math_eval/math_eval.gno create mode 100644 portal-loop/extracted/r/demo/math_eval/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/memeland/memeland.gno create mode 100644 portal-loop/extracted/r/demo/memeland/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/microblog/README.md create mode 100644 portal-loop/extracted/r/demo/microblog/microblog.gno create mode 100644 portal-loop/extracted/r/demo/microblog/microblog_test.gno create mode 100644 portal-loop/extracted/r/demo/microblog/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/nft/README.md create mode 100644 portal-loop/extracted/r/demo/nft/nft.gno create mode 100644 portal-loop/extracted/r/demo/nft/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/nft/z_0_filetest.gno create mode 100644 portal-loop/extracted/r/demo/nft/z_1_filetest.gno create mode 100644 portal-loop/extracted/r/demo/nft/z_2_filetest.gno create mode 100644 portal-loop/extracted/r/demo/nft/z_3_filetest.gno create mode 100644 portal-loop/extracted/r/demo/nft/z_4_filetest.gno create mode 100644 portal-loop/extracted/r/demo/nft123/gnft.gno create mode 100644 portal-loop/extracted/r/demo/nft123/gnft_test.gno create mode 100644 portal-loop/extracted/r/demo/nft123/gno.mod create mode 100644 portal-loop/extracted/r/demo/nft123/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/nft123/svg_base64.gno create mode 100644 portal-loop/extracted/r/demo/nft1234/gnft.gno create mode 100644 portal-loop/extracted/r/demo/nft1234/gnft_test.gno create mode 100644 portal-loop/extracted/r/demo/nft1234/gno.mod create mode 100644 portal-loop/extracted/r/demo/nft1234/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/nft1234/svg_base64.gno create mode 100644 portal-loop/extracted/r/demo/nft2/gnft.gno create mode 100644 portal-loop/extracted/r/demo/nft2/gnft_test.gno create mode 100644 portal-loop/extracted/r/demo/nft2/gno.mod create mode 100644 portal-loop/extracted/r/demo/nft2/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/nft2/svg_base64.gno create mode 100644 portal-loop/extracted/r/demo/nft3/gnft.gno create mode 100644 portal-loop/extracted/r/demo/nft3/gnft_test.gno create mode 100644 portal-loop/extracted/r/demo/nft3/gno.mod create mode 100644 portal-loop/extracted/r/demo/nft3/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/nft3/svg_base64.gno create mode 100644 portal-loop/extracted/r/demo/nft4/gnft.gno create mode 100644 portal-loop/extracted/r/demo/nft4/gnft_test.gno create mode 100644 portal-loop/extracted/r/demo/nft4/gno.mod create mode 100644 portal-loop/extracted/r/demo/nft4/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/nft4/svg_gen.gno create mode 100644 portal-loop/extracted/r/demo/nft4/svg_gen_test.gno create mode 100644 portal-loop/extracted/r/demo/profile/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/profile/profile.gno create mode 100644 portal-loop/extracted/r/demo/profile/profile_test.gno create mode 100644 portal-loop/extracted/r/demo/profile/render.gno create mode 100644 portal-loop/extracted/r/demo/releases_example/dummy.gno create mode 100644 portal-loop/extracted/r/demo/releases_example/example.gno create mode 100644 portal-loop/extracted/r/demo/releases_example/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/releases_example/releases0_filetest.gno create mode 100644 portal-loop/extracted/r/demo/releases_example/releases1_filetest.gno create mode 100644 portal-loop/extracted/r/demo/t12345/package.gno create mode 100644 portal-loop/extracted/r/demo/t12345/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/tamagotchi/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/tamagotchi/realm.gno create mode 100644 portal-loop/extracted/r/demo/tamagotchi/z0_filetest.gno create mode 100644 portal-loop/extracted/r/demo/test_event/package.gno create mode 100644 portal-loop/extracted/r/demo/test_event/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/test_event2/package.gno create mode 100644 portal-loop/extracted/r/demo/test_event2/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/test_event2:0/package.gno create mode 100644 portal-loop/extracted/r/demo/test_event2:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/test_event:0/package.gno create mode 100644 portal-loop/extracted/r/demo/test_event:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/test_events/package.gno create mode 100644 portal-loop/extracted/r/demo/test_events/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/test_nft/package.gno create mode 100644 portal-loop/extracted/r/demo/test_nft/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/test_nft:0/gnft.gno create mode 100644 portal-loop/extracted/r/demo/test_nft:0/image.gno create mode 100644 portal-loop/extracted/r/demo/test_nft:0/package.gno create mode 100644 portal-loop/extracted/r/demo/test_nft:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/tests/crossrealm/crossrealm.gno create mode 100644 portal-loop/extracted/r/demo/tests/crossrealm/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/tests/subtests/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/tests/subtests/subtests.gno create mode 100644 portal-loop/extracted/r/demo/tests:0/README.md create mode 100644 portal-loop/extracted/r/demo/tests:0/interfaces.gno create mode 100644 portal-loop/extracted/r/demo/tests:0/nestedpkg_test.gno create mode 100644 portal-loop/extracted/r/demo/tests:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/tests:0/realm_compositelit.gno create mode 100644 portal-loop/extracted/r/demo/tests:0/realm_method38d.gno create mode 100644 portal-loop/extracted/r/demo/tests:0/tests.gno create mode 100644 portal-loop/extracted/r/demo/tests:0/tests_test.gno create mode 100644 portal-loop/extracted/r/demo/tests:0/z0_filetest.gno create mode 100644 portal-loop/extracted/r/demo/tests:0/z1_filetest.gno create mode 100644 portal-loop/extracted/r/demo/tests_foo/foo.gno create mode 100644 portal-loop/extracted/r/demo/tests_foo/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/todolist/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/todolist/todolist.gno create mode 100644 portal-loop/extracted/r/demo/todolist/todolist_test.gno create mode 100644 portal-loop/extracted/r/demo/types/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/types/types.gno create mode 100644 portal-loop/extracted/r/demo/types/types_test.gno create mode 100644 portal-loop/extracted/r/demo/ui/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/ui/ui.gno create mode 100644 portal-loop/extracted/r/demo/ui/ui_test.gno create mode 100644 portal-loop/extracted/r/demo/userbook/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/userbook/userbook.gno create mode 100644 portal-loop/extracted/r/demo/userbook/userbook_test.gno create mode 100644 portal-loop/extracted/r/demo/users/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/users/preregister.gno create mode 100644 portal-loop/extracted/r/demo/users/users.gno create mode 100644 portal-loop/extracted/r/demo/users/users_test.gno create mode 100644 portal-loop/extracted/r/demo/users/z_0_b_filetest.gno create mode 100644 portal-loop/extracted/r/demo/users/z_0_filetest.gno create mode 100644 portal-loop/extracted/r/demo/users/z_10_filetest.gno create mode 100644 portal-loop/extracted/r/demo/users/z_11_filetest.gno create mode 100644 portal-loop/extracted/r/demo/users/z_11b_filetest.gno create mode 100644 portal-loop/extracted/r/demo/users/z_12_filetest.gno create mode 100644 portal-loop/extracted/r/demo/users/z_1_filetest.gno create mode 100644 portal-loop/extracted/r/demo/users/z_2_filetest.gno create mode 100644 portal-loop/extracted/r/demo/users/z_3_filetest.gno create mode 100644 portal-loop/extracted/r/demo/users/z_4_filetest.gno create mode 100644 portal-loop/extracted/r/demo/users/z_5_filetest.gno create mode 100644 portal-loop/extracted/r/demo/users/z_6_filetest.gno create mode 100644 portal-loop/extracted/r/demo/users/z_7_filetest.gno create mode 100644 portal-loop/extracted/r/demo/users/z_7b_filetest.gno create mode 100644 portal-loop/extracted/r/demo/users/z_8_filetest.gno create mode 100644 portal-loop/extracted/r/demo/users/z_9_filetest.gno create mode 100644 portal-loop/extracted/r/demo/wugnot/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demo/wugnot/wugnot.gno create mode 100644 portal-loop/extracted/r/demo/wugnot/z0_filetest.gno create mode 100644 portal-loop/extracted/r/demoyy/counter/counter.gno create mode 100644 portal-loop/extracted/r/demoyy/counter/pkg_metadata.json create mode 100644 portal-loop/extracted/r/demoyy/counter:0/counter.gno create mode 100644 portal-loop/extracted/r/demoyy/counter:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/devx/hello/package.gno create mode 100644 portal-loop/extracted/r/devx/hello/pkg_metadata.json create mode 100644 portal-loop/extracted/r/devx5/hello/package.gno create mode 100644 portal-loop/extracted/r/devx5/hello/pkg_metadata.json create mode 100644 portal-loop/extracted/r/devx6/hello/package.gno create mode 100644 portal-loop/extracted/r/devx6/hello/pkg_metadata.json create mode 100644 portal-loop/extracted/r/devx7/hello/package.gno create mode 100644 portal-loop/extracted/r/devx7/hello/pkg_metadata.json create mode 100644 portal-loop/extracted/r/dinquisitor/raffle/package.gno create mode 100644 portal-loop/extracted/r/dinquisitor/raffle/pkg_metadata.json create mode 100644 portal-loop/extracted/r/dinquisitor/raffle2/package.gno create mode 100644 portal-loop/extracted/r/dinquisitor/raffle2/pkg_metadata.json create mode 100644 portal-loop/extracted/r/dinquisitor/raffle2:0/package.gno create mode 100644 portal-loop/extracted/r/dinquisitor/raffle2:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/dinquisitor/raffle3/package.gno create mode 100644 portal-loop/extracted/r/dinquisitor/raffle3/pkg_metadata.json create mode 100644 portal-loop/extracted/r/dinquisitor/raffle3:0/package.gno create mode 100644 portal-loop/extracted/r/dinquisitor/raffle3:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/dinquisitor/raffle:0/package.gno create mode 100644 portal-loop/extracted/r/dinquisitor/raffle:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/docs/examples/run/foo/package.gno create mode 100644 portal-loop/extracted/r/docs/examples/run/foo/pkg_metadata.json create mode 100644 portal-loop/extracted/r/doniacld/maini/package.gno create mode 100644 portal-loop/extracted/r/doniacld/maini/pkg_metadata.json create mode 100644 portal-loop/extracted/r/echo/package.gno create mode 100644 portal-loop/extracted/r/echo/pkg_metadata.json create mode 100644 portal-loop/extracted/r/echo111/package.gno create mode 100644 portal-loop/extracted/r/echo111/pkg_metadata.json create mode 100644 portal-loop/extracted/r/everest/winner1/package.gno create mode 100644 portal-loop/extracted/r/everest/winner1/pkg_metadata.json create mode 100644 portal-loop/extracted/r/everestkc/raffle/package.gno create mode 100644 portal-loop/extracted/r/everestkc/raffle/pkg_metadata.json create mode 100644 portal-loop/extracted/r/everestkc/raffle:0/package.gno create mode 100644 portal-loop/extracted/r/everestkc/raffle:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/everestkc/winner1/package.gno create mode 100644 portal-loop/extracted/r/everestkc/winner1/pkg_metadata.json create mode 100644 portal-loop/extracted/r/foo/package.gno create mode 100644 portal-loop/extracted/r/foo/pkg_metadata.json create mode 100644 portal-loop/extracted/r/foo:0/package.gno create mode 100644 portal-loop/extracted/r/foo:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/g1lrnsh8vhpx043y0496gvaf0x5a4jug5r05qcan/hello/package.gno create mode 100644 portal-loop/extracted/r/g1lrnsh8vhpx043y0496gvaf0x5a4jug5r05qcan/hello/pkg_metadata.json create mode 100644 portal-loop/extracted/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1/LICENSE create mode 100644 portal-loop/extracted/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1/gnome.gno create mode 100644 portal-loop/extracted/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1/gnome_0a_filetest.gno create mode 100644 portal-loop/extracted/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1/gnome_0b_filetest.gno create mode 100644 portal-loop/extracted/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1/gnome_0c_filetest.gno create mode 100644 portal-loop/extracted/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1/gnome_0d_filetest.gno create mode 100644 portal-loop/extracted/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1/gnome_0e_filetest.gno create mode 100644 portal-loop/extracted/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1/indexes.gno create mode 100644 portal-loop/extracted/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1/lock.gno create mode 100644 portal-loop/extracted/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1/paginator.gno create mode 100644 portal-loop/extracted/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1/paginator_test.gno create mode 100644 portal-loop/extracted/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1/pkg_metadata.json create mode 100644 portal-loop/extracted/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1/render.gno create mode 100644 portal-loop/extracted/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1/render_router.gno create mode 100644 portal-loop/extracted/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1/strategy_budget.gno create mode 100644 portal-loop/extracted/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1/strategy_budget_test.gno create mode 100644 portal-loop/extracted/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1/strategy_dao.gno create mode 100644 portal-loop/extracted/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1/strategy_dao_test.gno create mode 100644 portal-loop/extracted/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1/strategy_general.gno create mode 100644 portal-loop/extracted/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1/strategy_general_test.gno create mode 100644 portal-loop/extracted/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1/strategy_lock.gno create mode 100644 portal-loop/extracted/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1/strategy_lock_test.gno create mode 100644 portal-loop/extracted/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1/uri.gno create mode 100644 portal-loop/extracted/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/tutorials/LICENSE create mode 100644 portal-loop/extracted/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/tutorials/indexes.gno create mode 100644 portal-loop/extracted/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/tutorials/pkg_metadata.json create mode 100644 portal-loop/extracted/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/tutorials/public.gno create mode 100644 portal-loop/extracted/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/tutorials/render.gno create mode 100644 portal-loop/extracted/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/tutorials/strategies.gno create mode 100644 portal-loop/extracted/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/tutorials/tutorials.gno create mode 100644 portal-loop/extracted/r/gc24/ajnavarro/ajraffle/package.gno create mode 100644 portal-loop/extracted/r/gc24/ajnavarro/ajraffle/pkg_metadata.json create mode 100644 portal-loop/extracted/r/gc24/ajnavarro/ajraffleregister/package.gno create mode 100644 portal-loop/extracted/r/gc24/ajnavarro/ajraffleregister/pkg_metadata.json create mode 100644 portal-loop/extracted/r/gc24/ajnavarro/ajraffleregistertwo/package.gno create mode 100644 portal-loop/extracted/r/gc24/ajnavarro/ajraffleregistertwo/pkg_metadata.json create mode 100644 portal-loop/extracted/r/gc24/ajnavarro/ajraffletest/package.gno create mode 100644 portal-loop/extracted/r/gc24/ajnavarro/ajraffletest/pkg_metadata.json create mode 100644 portal-loop/extracted/r/gc24/ajnavarro/ajraffletest:0/package.gno create mode 100644 portal-loop/extracted/r/gc24/ajnavarro/ajraffletest:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/gc24/bigzoo/raffle/package.gno create mode 100644 portal-loop/extracted/r/gc24/bigzoo/raffle/pkg_metadata.json create mode 100644 portal-loop/extracted/r/gc24/bigzoo/raffle:0/package.gno create mode 100644 portal-loop/extracted/r/gc24/bigzoo/raffle:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/gc24/ghostlandr/raffle/package.gno create mode 100644 portal-loop/extracted/r/gc24/ghostlandr/raffle/pkg_metadata.json create mode 100644 portal-loop/extracted/r/gc24/jamesprysm/entry/package.gno create mode 100644 portal-loop/extracted/r/gc24/jamesprysm/entry/pkg_metadata.json create mode 100644 portal-loop/extracted/r/gc24/krzysztof/raffle/package.gno create mode 100644 portal-loop/extracted/r/gc24/krzysztof/raffle/pkg_metadata.json create mode 100644 portal-loop/extracted/r/gc24/krzysztoffetch/raffle/package.gno create mode 100644 portal-loop/extracted/r/gc24/krzysztoffetch/raffle/pkg_metadata.json create mode 100644 portal-loop/extracted/r/gc24/krzysztoffetch/raffle:0/package.gno create mode 100644 portal-loop/extracted/r/gc24/krzysztoffetch/raffle:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/gc24/mlin/package.gno create mode 100644 portal-loop/extracted/r/gc24/mlin/pkg_metadata.json create mode 100644 portal-loop/extracted/r/gc24/nasikalt/hello/package.gno create mode 100644 portal-loop/extracted/r/gc24/nasikalt/hello/pkg_metadata.json create mode 100644 portal-loop/extracted/r/gc24/nasikalt/hello2/package.gno create mode 100644 portal-loop/extracted/r/gc24/nasikalt/hello2/pkg_metadata.json create mode 100644 portal-loop/extracted/r/gc24/nasikalt/hello:0/package.gno create mode 100644 portal-loop/extracted/r/gc24/nasikalt/hello:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/gc24/nasikalt/raffle/package.gno create mode 100644 portal-loop/extracted/r/gc24/nasikalt/raffle/pkg_metadata.json create mode 100644 portal-loop/extracted/r/gc24/nasikalt/raffle:0/package.gno create mode 100644 portal-loop/extracted/r/gc24/nasikalt/raffle:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/gc24/raffle/gno.mod create mode 100644 portal-loop/extracted/r/gc24/raffle/pkg_metadata.json create mode 100644 portal-loop/extracted/r/gc24/raffle/raffle.gno create mode 100644 portal-loop/extracted/r/gc24/raffle/raffle_guide.gno create mode 100644 portal-loop/extracted/r/gc24/raffle/raffle_test.gno create mode 100644 portal-loop/extracted/r/gc24/raffle:0/package.gno create mode 100644 portal-loop/extracted/r/gc24/raffle:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/gc24/soypat/raffle/package.gno create mode 100644 portal-loop/extracted/r/gc24/soypat/raffle/pkg_metadata.json create mode 100644 portal-loop/extracted/r/gc24/suchak/raffle/package.gno create mode 100644 portal-loop/extracted/r/gc24/suchak/raffle/pkg_metadata.json create mode 100644 portal-loop/extracted/r/gc24/suchak/raffle:0/package.gno create mode 100644 portal-loop/extracted/r/gc24/suchak/raffle:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/gc24/suchak1/raffle/package.gno create mode 100644 portal-loop/extracted/r/gc24/suchak1/raffle/pkg_metadata.json create mode 100644 portal-loop/extracted/r/gc24/suchak1/raffle:0/package.gno create mode 100644 portal-loop/extracted/r/gc24/suchak1/raffle:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/gnoland/blog/admin.gno create mode 100644 portal-loop/extracted/r/gnoland/blog/gnoblog.gno create mode 100644 portal-loop/extracted/r/gnoland/blog/gnoblog_test.gno create mode 100644 portal-loop/extracted/r/gnoland/blog/pkg_metadata.json create mode 100644 portal-loop/extracted/r/gnoland/blog/util.gno create mode 100644 portal-loop/extracted/r/gnoland/events/administration.gno create mode 100644 portal-loop/extracted/r/gnoland/events/errors.gno create mode 100644 portal-loop/extracted/r/gnoland/events/events.gno create mode 100644 portal-loop/extracted/r/gnoland/events/events_test.gno create mode 100644 portal-loop/extracted/r/gnoland/events/pkg_metadata.json create mode 100644 portal-loop/extracted/r/gnoland/events/rendering.gno create mode 100644 portal-loop/extracted/r/gnoland/faucet/admin.gno create mode 100644 portal-loop/extracted/r/gnoland/faucet/faucet.gno create mode 100644 portal-loop/extracted/r/gnoland/faucet/faucet_test.gno create mode 100644 portal-loop/extracted/r/gnoland/faucet/pkg_metadata.json create mode 100644 portal-loop/extracted/r/gnoland/faucet/z0_filetest.gno create mode 100644 portal-loop/extracted/r/gnoland/faucet/z1_filetest.gno create mode 100644 portal-loop/extracted/r/gnoland/faucet/z2_filetest.gno create mode 100644 portal-loop/extracted/r/gnoland/faucet/z3_filetest.gno create mode 100644 portal-loop/extracted/r/gnoland/ghverify/README.md create mode 100644 portal-loop/extracted/r/gnoland/ghverify/contract.gno create mode 100644 portal-loop/extracted/r/gnoland/ghverify/contract_test.gno create mode 100644 portal-loop/extracted/r/gnoland/ghverify/pkg_metadata.json create mode 100644 portal-loop/extracted/r/gnoland/ghverify/task.gno create mode 100644 portal-loop/extracted/r/gnoland/home/home.gno create mode 100644 portal-loop/extracted/r/gnoland/home/home_filetest.gno create mode 100644 portal-loop/extracted/r/gnoland/home/overide_filetest.gno create mode 100644 portal-loop/extracted/r/gnoland/home/pkg_metadata.json create mode 100644 portal-loop/extracted/r/gnoland/monit/monit.gno create mode 100644 portal-loop/extracted/r/gnoland/monit/monit_test.gno create mode 100644 portal-loop/extracted/r/gnoland/monit/pkg_metadata.json create mode 100644 portal-loop/extracted/r/gnoland/pages/admin.gno create mode 100644 portal-loop/extracted/r/gnoland/pages/page_about.gno create mode 100644 portal-loop/extracted/r/gnoland/pages/page_contribute.gno create mode 100644 portal-loop/extracted/r/gnoland/pages/page_ecosystem.gno create mode 100644 portal-loop/extracted/r/gnoland/pages/page_gnolang.gno create mode 100644 portal-loop/extracted/r/gnoland/pages/page_license.gno create mode 100644 portal-loop/extracted/r/gnoland/pages/page_partners.gno create mode 100644 portal-loop/extracted/r/gnoland/pages/page_start.gno create mode 100644 portal-loop/extracted/r/gnoland/pages/page_testnets.gno create mode 100644 portal-loop/extracted/r/gnoland/pages/page_tokenomics.gno create mode 100644 portal-loop/extracted/r/gnoland/pages/pages.gno create mode 100644 portal-loop/extracted/r/gnoland/pages/pages_test.gno create mode 100644 portal-loop/extracted/r/gnoland/pages/pkg_metadata.json create mode 100644 portal-loop/extracted/r/gnoland/pages/util.gno create mode 100644 portal-loop/extracted/r/gnoland/valopers/init.gno create mode 100644 portal-loop/extracted/r/gnoland/valopers/pkg_metadata.json create mode 100644 portal-loop/extracted/r/gnoland/valopers/valopers.gno create mode 100644 portal-loop/extracted/r/gnoland/valopers/valopers_test.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre1/LICENSE create mode 100644 portal-loop/extracted/r/gnome/dao/pre1/gnome.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre1/indexes.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre1/params.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre1/pkg_metadata.json create mode 100644 portal-loop/extracted/r/gnome/dao/pre1/public.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre1/public_proposals.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre1/public_proposals_0a_filetest.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre1/public_proposals_0b_filetest.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre1/public_proposals_0c_filetest.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre1/public_proposals_0d_filetest.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre1/public_proposals_0e_filetest.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre1/render.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre1/strategy_budget.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre1/strategy_budget_test.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre1/strategy_dao.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre1/strategy_dao_test.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre1/strategy_general.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre1/strategy_general_test.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre1/strategy_lock.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre1/strategy_lock_test.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre1/strategy_params.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre1/uri.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre2/LICENSE create mode 100644 portal-loop/extracted/r/gnome/dao/pre2/gnome.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre2/indexes.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre2/params.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre2/pkg_metadata.json create mode 100644 portal-loop/extracted/r/gnome/dao/pre2/public.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre2/public_proposals.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre2/public_proposals_0a_filetest.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre2/public_proposals_0b_filetest.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre2/public_proposals_0c_filetest.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre2/public_proposals_0d_filetest.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre2/public_proposals_0e_filetest.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre2/render.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre2/strategy_budget.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre2/strategy_budget_test.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre2/strategy_dao.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre2/strategy_dao_test.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre2/strategy_general.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre2/strategy_general_test.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre2/strategy_lock.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre2/strategy_lock_test.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre2/strategy_params.gno create mode 100644 portal-loop/extracted/r/gnome/dao/pre2/uri.gno create mode 100644 portal-loop/extracted/r/gnome/tutorials/pre1/LICENSE create mode 100644 portal-loop/extracted/r/gnome/tutorials/pre1/indexes.gno create mode 100644 portal-loop/extracted/r/gnome/tutorials/pre1/params.gno create mode 100644 portal-loop/extracted/r/gnome/tutorials/pre1/pkg_metadata.json create mode 100644 portal-loop/extracted/r/gnome/tutorials/pre1/public.gno create mode 100644 portal-loop/extracted/r/gnome/tutorials/pre1/public_proposals.gno create mode 100644 portal-loop/extracted/r/gnome/tutorials/pre1/render.gno create mode 100644 portal-loop/extracted/r/gnome/tutorials/pre1/strategy_lock.gno create mode 100644 portal-loop/extracted/r/gnome/tutorials/pre1/strategy_params.gno create mode 100644 portal-loop/extracted/r/gnome/tutorials/pre1/strategy_tutorials.gno create mode 100644 portal-loop/extracted/r/gnome/tutorials/pre1/tutorials.gno create mode 100644 portal-loop/extracted/r/gnome/tutorials/pre2/LICENSE create mode 100644 portal-loop/extracted/r/gnome/tutorials/pre2/indexes.gno create mode 100644 portal-loop/extracted/r/gnome/tutorials/pre2/params.gno create mode 100644 portal-loop/extracted/r/gnome/tutorials/pre2/pkg_metadata.json create mode 100644 portal-loop/extracted/r/gnome/tutorials/pre2/public.gno create mode 100644 portal-loop/extracted/r/gnome/tutorials/pre2/public_proposals.gno create mode 100644 portal-loop/extracted/r/gnome/tutorials/pre2/render.gno create mode 100644 portal-loop/extracted/r/gnome/tutorials/pre2/strategy_lock.gno create mode 100644 portal-loop/extracted/r/gnome/tutorials/pre2/strategy_params.gno create mode 100644 portal-loop/extracted/r/gnome/tutorials/pre2/strategy_tutorials.gno create mode 100644 portal-loop/extracted/r/gnome/tutorials/pre2/tutorials.gno create mode 100644 portal-loop/extracted/r/gnome/tutorials/pre3/LICENSE create mode 100644 portal-loop/extracted/r/gnome/tutorials/pre3/indexes.gno create mode 100644 portal-loop/extracted/r/gnome/tutorials/pre3/params.gno create mode 100644 portal-loop/extracted/r/gnome/tutorials/pre3/pkg_metadata.json create mode 100644 portal-loop/extracted/r/gnome/tutorials/pre3/public.gno create mode 100644 portal-loop/extracted/r/gnome/tutorials/pre3/public_proposals.gno create mode 100644 portal-loop/extracted/r/gnome/tutorials/pre3/render.gno create mode 100644 portal-loop/extracted/r/gnome/tutorials/pre3/strategy_lock.gno create mode 100644 portal-loop/extracted/r/gnome/tutorials/pre3/strategy_params.gno create mode 100644 portal-loop/extracted/r/gnome/tutorials/pre3/strategy_tutorials.gno create mode 100644 portal-loop/extracted/r/gnome/tutorials/pre3/tutorials.gno create mode 100644 portal-loop/extracted/r/gov/dao/dao.gno create mode 100644 portal-loop/extracted/r/gov/dao/dao_test.gno create mode 100644 portal-loop/extracted/r/gov/dao/memberset.gno create mode 100644 portal-loop/extracted/r/gov/dao/pkg_metadata.json create mode 100644 portal-loop/extracted/r/gov/dao/prop1_filetest.gno create mode 100644 portal-loop/extracted/r/gov/dao/prop2_filetest.gno create mode 100644 portal-loop/extracted/r/gov/dao/types.gno create mode 100644 portal-loop/extracted/r/gov/dao/voter.gno create mode 100644 portal-loop/extracted/r/harrisonju123/hello/package.gno create mode 100644 portal-loop/extracted/r/harrisonju123/hello/pkg_metadata.json create mode 100644 portal-loop/extracted/r/hdjshfjsdhfsj/hello/package.gno create mode 100644 portal-loop/extracted/r/hdjshfjsdhfsj/hello/pkg_metadata.json create mode 100644 portal-loop/extracted/r/hdjshfjsdhfsj/hello:0/package.gno create mode 100644 portal-loop/extracted/r/hdjshfjsdhfsj/hello:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/helithumper/raffle/package.gno create mode 100644 portal-loop/extracted/r/helithumper/raffle/pkg_metadata.json create mode 100644 portal-loop/extracted/r/helithumper/raffle2/package.gno create mode 100644 portal-loop/extracted/r/helithumper/raffle2/pkg_metadata.json create mode 100644 portal-loop/extracted/r/helithumper/raffle2:0/package.gno create mode 100644 portal-loop/extracted/r/helithumper/raffle2:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/helithumper/raffle3/package.gno create mode 100644 portal-loop/extracted/r/helithumper/raffle3/pkg_metadata.json create mode 100644 portal-loop/extracted/r/helithumper/raffle:0/package.gno create mode 100644 portal-loop/extracted/r/helithumper/raffle:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/helithumper/rafflegithub/package.gno create mode 100644 portal-loop/extracted/r/helithumper/rafflegithub/pkg_metadata.json create mode 100644 portal-loop/extracted/r/helithumper/rafflegithub:0/package.gno create mode 100644 portal-loop/extracted/r/helithumper/rafflegithub:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/hello/package.gno create mode 100644 portal-loop/extracted/r/hello/pkg_metadata.json create mode 100644 portal-loop/extracted/r/hello123123/hello/package.gno create mode 100644 portal-loop/extracted/r/hello123123/hello/pkg_metadata.json create mode 100644 portal-loop/extracted/r/hello1231kkk/hello/package.gno create mode 100644 portal-loop/extracted/r/hello1231kkk/hello/pkg_metadata.json create mode 100644 portal-loop/extracted/r/hello:0/package.gno create mode 100644 portal-loop/extracted/r/hello:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/hellonamespacetest/hellonamespacetest/package.gno create mode 100644 portal-loop/extracted/r/hellonamespacetest/hellonamespacetest/pkg_metadata.json create mode 100644 portal-loop/extracted/r/hxjiang/hello/package.gno create mode 100644 portal-loop/extracted/r/hxjiang/hello/pkg_metadata.json create mode 100644 portal-loop/extracted/r/hxjiang/hello:0/package.gno create mode 100644 portal-loop/extracted/r/hxjiang/hello:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/hxjiang2/hello/package.gno create mode 100644 portal-loop/extracted/r/hxjiang2/hello/pkg_metadata.json create mode 100644 portal-loop/extracted/r/hxjiang3/hello/package.gno create mode 100644 portal-loop/extracted/r/hxjiang3/hello/pkg_metadata.json create mode 100644 portal-loop/extracted/r/hxjiang3/hello:0/package.gno create mode 100644 portal-loop/extracted/r/hxjiang3/hello:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/hxjiang4/hello/package.gno create mode 100644 portal-loop/extracted/r/hxjiang4/hello/pkg_metadata.json create mode 100644 portal-loop/extracted/r/hxjianguser/hello/package.gno create mode 100644 portal-loop/extracted/r/hxjianguser/hello/pkg_metadata.json create mode 100644 portal-loop/extracted/r/hxjianguser/hello:0/package.gno create mode 100644 portal-loop/extracted/r/hxjianguser/hello:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/iamkevin/kraffle/package.gno create mode 100644 portal-loop/extracted/r/iamkevin/kraffle/pkg_metadata.json create mode 100644 portal-loop/extracted/r/iamkevin/kraffle2/package.gno create mode 100644 portal-loop/extracted/r/iamkevin/kraffle2/pkg_metadata.json create mode 100644 portal-loop/extracted/r/iamkevin/kraffle2:0/package.gno create mode 100644 portal-loop/extracted/r/iamkevin/kraffle2:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/iamkevin/kraffle3/package.gno create mode 100644 portal-loop/extracted/r/iamkevin/kraffle3/pkg_metadata.json create mode 100644 portal-loop/extracted/r/iamkevin/kraffle4/package.gno create mode 100644 portal-loop/extracted/r/iamkevin/kraffle4/pkg_metadata.json create mode 100644 portal-loop/extracted/r/iamkevin/kraffle5/package.gno create mode 100644 portal-loop/extracted/r/iamkevin/kraffle5/pkg_metadata.json create mode 100644 portal-loop/extracted/r/iamkevin/kraffle:0/package.gno create mode 100644 portal-loop/extracted/r/iamkevin/kraffle:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/ianhowell/raffle/package.gno create mode 100644 portal-loop/extracted/r/ianhowell/raffle/pkg_metadata.json create mode 100644 portal-loop/extracted/r/ianhowell/raffle:0/package.gno create mode 100644 portal-loop/extracted/r/ianhowell/raffle:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/jahowell/gohper/package.gno create mode 100644 portal-loop/extracted/r/jahowell/gohper/pkg_metadata.json create mode 100644 portal-loop/extracted/r/jahowell/gohper:0/package.gno create mode 100644 portal-loop/extracted/r/jahowell/gohper:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/jahowell/gopher/package.gno create mode 100644 portal-loop/extracted/r/jahowell/gopher/pkg_metadata.json create mode 100644 portal-loop/extracted/r/jahowell/gopher:0/package.gno create mode 100644 portal-loop/extracted/r/jahowell/gopher:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/jmrosh/rafentry/package.gno create mode 100644 portal-loop/extracted/r/jmrosh/rafentry/pkg_metadata.json create mode 100644 portal-loop/extracted/r/jmrosh/raffle/package.gno create mode 100644 portal-loop/extracted/r/jmrosh/raffle/pkg_metadata.json create mode 100644 portal-loop/extracted/r/jmrosh/raffle1/package.gno create mode 100644 portal-loop/extracted/r/jmrosh/raffle1/pkg_metadata.json create mode 100644 portal-loop/extracted/r/jmrosh/raffle1:0/package.gno create mode 100644 portal-loop/extracted/r/jmrosh/raffle1:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/jmrosh/raffle:0/package.gno create mode 100644 portal-loop/extracted/r/jmrosh/raffle:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/krzysztoffetch/entry/package.gno create mode 100644 portal-loop/extracted/r/krzysztoffetch/entry/pkg_metadata.json create mode 100644 portal-loop/extracted/r/kurtbomya/raf/package.gno create mode 100644 portal-loop/extracted/r/kurtbomya/raf/pkg_metadata.json create mode 100644 portal-loop/extracted/r/kurtbomya/raf:0/package.gno create mode 100644 portal-loop/extracted/r/kurtbomya/raf:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/kurtbomya/raffle/package.gno create mode 100644 portal-loop/extracted/r/kurtbomya/raffle/pkg_metadata.json create mode 100644 portal-loop/extracted/r/kurtbomya/raffle:0/package.gno create mode 100644 portal-loop/extracted/r/kurtbomya/raffle:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/kurtbomya/raffleName/package.gno create mode 100644 portal-loop/extracted/r/kurtbomya/raffleName/pkg_metadata.json create mode 100644 portal-loop/extracted/r/kurtbomya/rafflegithubname/package.gno create mode 100644 portal-loop/extracted/r/kurtbomya/rafflegithubname/pkg_metadata.json create mode 100644 portal-loop/extracted/r/lascoteca/hello/package.gno create mode 100644 portal-loop/extracted/r/lascoteca/hello/pkg_metadata.json create mode 100644 portal-loop/extracted/r/leon/config/config.gno create mode 100644 portal-loop/extracted/r/leon/config/pkg_metadata.json create mode 100644 portal-loop/extracted/r/leon/demo/poll/package.gno create mode 100644 portal-loop/extracted/r/leon/demo/poll/pkg_metadata.json create mode 100644 portal-loop/extracted/r/leon/demo/poll/v1/pkg_metadata.json create mode 100644 portal-loop/extracted/r/leon/demo/poll/v1/poll.gno create mode 100644 portal-loop/extracted/r/leon/demo/poll/v2/pkg_metadata.json create mode 100644 portal-loop/extracted/r/leon/demo/poll/v2/poll.gno create mode 100644 portal-loop/extracted/r/leon/demo/poll:0/package.gno create mode 100644 portal-loop/extracted/r/leon/demo/poll:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/leon/demo/poll:0/poll.gno create mode 100644 portal-loop/extracted/r/leon/gc/entry/entry.gno create mode 100644 portal-loop/extracted/r/leon/gc/entry/pkg_metadata.json create mode 100644 portal-loop/extracted/r/leon/hello/count/package.gno create mode 100644 portal-loop/extracted/r/leon/hello/count/pkg_metadata.json create mode 100644 portal-loop/extracted/r/leon/home/home.gno create mode 100644 portal-loop/extracted/r/leon/home/pkg_metadata.json create mode 100644 portal-loop/extracted/r/leon/home123123/package.gno create mode 100644 portal-loop/extracted/r/leon/home123123/pkg_metadata.json create mode 100644 portal-loop/extracted/r/leon/home:0/package.gno create mode 100644 portal-loop/extracted/r/leon/home:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/leon/issues/mypkg/package.gno create mode 100644 portal-loop/extracted/r/leon/issues/mypkg/pkg_metadata.json create mode 100644 portal-loop/extracted/r/leon/issues/ptrregistry/package.gno create mode 100644 portal-loop/extracted/r/leon/issues/ptrregistry/pkg_metadata.json create mode 100644 portal-loop/extracted/r/leon/issues/ptrregistry/v1/package.gno create mode 100644 portal-loop/extracted/r/leon/issues/ptrregistry/v1/pkg_metadata.json create mode 100644 portal-loop/extracted/r/leon/issues/ptrregistry:0/package.gno create mode 100644 portal-loop/extracted/r/leon/issues/ptrregistry:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/leon/issues/v1/ptrregistry/package.gno create mode 100644 portal-loop/extracted/r/leon/issues/v1/ptrregistry/pkg_metadata.json create mode 100644 portal-loop/extracted/r/leon/issues/v2/ptrregistry/package.gno create mode 100644 portal-loop/extracted/r/leon/issues/v2/ptrregistry/pkg_metadata.json create mode 100644 portal-loop/extracted/r/leon/v1/raffle/gno.mod create mode 100644 portal-loop/extracted/r/leon/v1/raffle/pkg_metadata.json create mode 100644 portal-loop/extracted/r/leon/v1/raffle/raffle.gno create mode 100644 portal-loop/extracted/r/leon/v1/raffle/raffle_guide.gno create mode 100644 portal-loop/extracted/r/leon/v1/raffle/raffle_test.gno create mode 100644 portal-loop/extracted/r/leon/v2/raffle/entry/entry.gno create mode 100644 portal-loop/extracted/r/leon/v2/raffle/entry/pkg_metadata.json create mode 100644 portal-loop/extracted/r/leon/v2/raffle/gno.mod create mode 100644 portal-loop/extracted/r/leon/v2/raffle/pkg_metadata.json create mode 100644 portal-loop/extracted/r/leon/v2/raffle/raffle.gno create mode 100644 portal-loop/extracted/r/leon/v2/raffle/raffle_guide.gno create mode 100644 portal-loop/extracted/r/leon/v2/raffle/raffle_test.gno create mode 100644 portal-loop/extracted/r/louis/GRC20.gno create mode 100644 portal-loop/extracted/r/louis/pkg_metadata.json create mode 100644 portal-loop/extracted/r/louis:0/GRC20.gno create mode 100644 portal-loop/extracted/r/louis:0/package.gno create mode 100644 portal-loop/extracted/r/louis:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/manfred/config/config.gno create mode 100644 portal-loop/extracted/r/manfred/config/pkg_metadata.json create mode 100644 portal-loop/extracted/r/manfred/cshijack/hijack.gno create mode 100644 portal-loop/extracted/r/manfred/cshijack/pkg_metadata.json create mode 100644 portal-loop/extracted/r/manfred/cshijack:0/hijack.gno create mode 100644 portal-loop/extracted/r/manfred/cshijack:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/manfred/home/home.gno create mode 100644 portal-loop/extracted/r/manfred/home/pkg_metadata.json create mode 100644 portal-loop/extracted/r/manfred/home/z1_filetest.gno create mode 100644 portal-loop/extracted/r/manfred/home/z2_filetest.gno create mode 100644 portal-loop/extracted/r/manfred/present/admin.gno create mode 100644 portal-loop/extracted/r/manfred/present/pkg_metadata.json create mode 100644 portal-loop/extracted/r/manfred/present/present_miami23.gno create mode 100644 portal-loop/extracted/r/manfred/present/present_miami23_filetest.gno create mode 100644 portal-loop/extracted/r/manfred/present/presentations.gno create mode 100644 portal-loop/extracted/r/manfred/v2/cshijack/hijack.gno create mode 100644 portal-loop/extracted/r/manfred/v2/cshijack/pkg_metadata.json create mode 100644 portal-loop/extracted/r/manfred/v3/cshijack/hijack.gno create mode 100644 portal-loop/extracted/r/manfred/v3/cshijack/pkg_metadata.json create mode 100644 portal-loop/extracted/r/mebert1/raffle/package.gno create mode 100644 portal-loop/extracted/r/mebert1/raffle/pkg_metadata.json create mode 100644 portal-loop/extracted/r/mebert1/raffle:0/package.gno create mode 100644 portal-loop/extracted/r/mebert1/raffle:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/mgriffi/mgriff10raffle/package.gno create mode 100644 portal-loop/extracted/r/mgriffi/mgriff10raffle/pkg_metadata.json create mode 100644 portal-loop/extracted/r/mgriffi/mgriff10raffle:0/package.gno create mode 100644 portal-loop/extracted/r/mgriffi/mgriff10raffle:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/mgriffin/mgriff10raffle/package.gno create mode 100644 portal-loop/extracted/r/mgriffin/mgriff10raffle/pkg_metadata.json create mode 100644 portal-loop/extracted/r/michelle/hello/package.gno create mode 100644 portal-loop/extracted/r/michelle/hello/pkg_metadata.json create mode 100644 portal-loop/extracted/r/michelle/main/main.gno create mode 100644 portal-loop/extracted/r/michelle/main/pkg_metadata.json create mode 100644 portal-loop/extracted/r/mikaelvallenet/bar20/mvc.gno create mode 100644 portal-loop/extracted/r/mikaelvallenet/bar20/pkg_metadata.json create mode 100644 portal-loop/extracted/r/mikaelvallenet/bar20:0/mvc.gno create mode 100644 portal-loop/extracted/r/mikaelvallenet/bar20:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/mikaelvallenet/foo20/mvc.gno create mode 100644 portal-loop/extracted/r/mikaelvallenet/foo20/pkg_metadata.json create mode 100644 portal-loop/extracted/r/mikaelvallenet/foo20:0/mvc.gno create mode 100644 portal-loop/extracted/r/mikaelvallenet/foo20:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/mikaelvallenet/gar20/mvc.gno create mode 100644 portal-loop/extracted/r/mikaelvallenet/gar20/pkg_metadata.json create mode 100644 portal-loop/extracted/r/mikaelvallenet/helloworld/helloworld.gno create mode 100644 portal-loop/extracted/r/mikaelvallenet/helloworld/pkg_metadata.json create mode 100644 portal-loop/extracted/r/mikaelvallenet/issue/issue.gno create mode 100644 portal-loop/extracted/r/mikaelvallenet/issue/pkg_metadata.json create mode 100644 portal-loop/extracted/r/mikaelvallenet/issue:0/issue.gno create mode 100644 portal-loop/extracted/r/mikaelvallenet/issue:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/mikaelvallenet/issuefix/issue.gno create mode 100644 portal-loop/extracted/r/mikaelvallenet/issuefix/pkg_metadata.json create mode 100644 portal-loop/extracted/r/mikaelvallenet/issuetwo/issuetwo.gno create mode 100644 portal-loop/extracted/r/mikaelvallenet/issuetwo/pkg_metadata.json create mode 100644 portal-loop/extracted/r/mikaelvallenet/issuetwo:0/issuetwo.gno create mode 100644 portal-loop/extracted/r/mikaelvallenet/issuetwo:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/mikaelvallenet/mvc/mvc.gno create mode 100644 portal-loop/extracted/r/mikaelvallenet/mvc/pkg_metadata.json create mode 100644 portal-loop/extracted/r/mikaelvallenet/mvc:0/mvc.gno create mode 100644 portal-loop/extracted/r/mikaelvallenet/mvc:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/mikaelvallenet/mvcoin/mvc.gno create mode 100644 portal-loop/extracted/r/mikaelvallenet/mvcoin/pkg_metadata.json create mode 100644 portal-loop/extracted/r/mikaelvallenet/mvcoin:0/mvc.gno create mode 100644 portal-loop/extracted/r/mikaelvallenet/mvcoin:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/mikaelvallenet/path/path.gno create mode 100644 portal-loop/extracted/r/mikaelvallenet/path/pkg_metadata.json create mode 100644 portal-loop/extracted/r/mikaelvallenet/tar20/mvc.gno create mode 100644 portal-loop/extracted/r/mikaelvallenet/tar20/pkg_metadata.json create mode 100644 portal-loop/extracted/r/morgan/guestbook/admin.gno create mode 100644 portal-loop/extracted/r/morgan/guestbook/guestbook.gno create mode 100644 portal-loop/extracted/r/morgan/guestbook/guestbook_test.gno create mode 100644 portal-loop/extracted/r/morgan/guestbook/pkg_metadata.json create mode 100644 portal-loop/extracted/r/morgan/home/home.gno create mode 100644 portal-loop/extracted/r/morgan/home/pkg_metadata.json create mode 100644 portal-loop/extracted/r/mvc/package.gno create mode 100644 portal-loop/extracted/r/mvc/pkg_metadata.json create mode 100644 portal-loop/extracted/r/mvc:0/package.gno create mode 100644 portal-loop/extracted/r/mvc:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/nebular24/guessbook/README.md create mode 100644 portal-loop/extracted/r/nebular24/guessbook/guess_book.gno create mode 100644 portal-loop/extracted/r/nebular24/guessbook/pkg_metadata.json create mode 100644 portal-loop/extracted/r/nebular24/guessbook:0/README.md create mode 100644 portal-loop/extracted/r/nebular24/guessbook:0/guess_book.gno create mode 100644 portal-loop/extracted/r/nebular24/guessbook:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/nemanya/config/conig.gno create mode 100644 portal-loop/extracted/r/nemanya/config/pkg_metadata.json create mode 100644 portal-loop/extracted/r/nemanya/config:0/conig.gno create mode 100644 portal-loop/extracted/r/nemanya/config:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/nemanya/home/home.gno create mode 100644 portal-loop/extracted/r/nemanya/home/pkg_metadata.json create mode 100644 portal-loop/extracted/r/ngoc/hello/package.gno create mode 100644 portal-loop/extracted/r/ngoc/hello/pkg_metadata.json create mode 100644 portal-loop/extracted/r/nprimmer/TacoBell/package.gno create mode 100644 portal-loop/extracted/r/nprimmer/TacoBell/pkg_metadata.json create mode 100644 portal-loop/extracted/r/nprimmer/main/package.gno create mode 100644 portal-loop/extracted/r/nprimmer/main/pkg_metadata.json create mode 100644 portal-loop/extracted/r/nprimmer/raffle/package.gno create mode 100644 portal-loop/extracted/r/nprimmer/raffle/pkg_metadata.json create mode 100644 portal-loop/extracted/r/nprimmer/raffle:0/package.gno create mode 100644 portal-loop/extracted/r/nprimmer/raffle:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/nprimmer/tacobell:0/package.gno create mode 100644 portal-loop/extracted/r/nprimmer/tacobell:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/nstest/hello/package.gno create mode 100644 portal-loop/extracted/r/nstest/hello/pkg_metadata.json create mode 100644 portal-loop/extracted/r/nstest/hello2/package.gno create mode 100644 portal-loop/extracted/r/nstest/hello2/pkg_metadata.json create mode 100644 portal-loop/extracted/r/nstest/hello2:0/package.gno create mode 100644 portal-loop/extracted/r/nstest/hello2:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/nstest/hello:0/package.gno create mode 100644 portal-loop/extracted/r/nstest/hello:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/pkg1/a.gno create mode 100644 portal-loop/extracted/r/pkg1/pkg_metadata.json create mode 100644 portal-loop/extracted/r/pnumbers/raffle/pkg_metadata.json create mode 100644 portal-loop/extracted/r/pnumbers/raffle/raffle.gno create mode 100644 portal-loop/extracted/r/pnumbers/raffle:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/pnumbers/raffle:0/raffle.gno create mode 100644 portal-loop/extracted/r/pnumbers/username/pkg_metadata.json create mode 100644 portal-loop/extracted/r/pnumbers/username/raffle.gno create mode 100644 portal-loop/extracted/r/poll/package.gno create mode 100644 portal-loop/extracted/r/poll/pkg_metadata.json create mode 100644 portal-loop/extracted/r/poll:0/package.gno create mode 100644 portal-loop/extracted/r/poll:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/portalloopfixes/fixfixfix/package.gno create mode 100644 portal-loop/extracted/r/portalloopfixes/fixfixfix/pkg_metadata.json create mode 100644 portal-loop/extracted/r/renier/hello/package.gno create mode 100644 portal-loop/extracted/r/renier/hello/pkg_metadata.json create mode 100644 portal-loop/extracted/r/renier/raffle/package.gno create mode 100644 portal-loop/extracted/r/renier/raffle/pkg_metadata.json create mode 100644 portal-loop/extracted/r/renier/raffle:0/package.gno create mode 100644 portal-loop/extracted/r/renier/raffle:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/renier/register/package.gno create mode 100644 portal-loop/extracted/r/renier/register/pkg_metadata.json create mode 100644 portal-loop/extracted/r/salmad/hellonamespacetest/package.gno create mode 100644 portal-loop/extracted/r/salmad/hellonamespacetest/pkg_metadata.json create mode 100644 portal-loop/extracted/r/slowteetoe/raffle/package.gno create mode 100644 portal-loop/extracted/r/slowteetoe/raffle/pkg_metadata.json create mode 100644 portal-loop/extracted/r/sys/rewards/pkg_metadata.json create mode 100644 portal-loop/extracted/r/sys/rewards/rewards.gno create mode 100644 portal-loop/extracted/r/sys/users/pkg_metadata.json create mode 100644 portal-loop/extracted/r/sys/users/verify.gno create mode 100644 portal-loop/extracted/r/sys/validators/doc.gno create mode 100644 portal-loop/extracted/r/sys/validators/gnosdk.gno create mode 100644 portal-loop/extracted/r/sys/validators/init.gno create mode 100644 portal-loop/extracted/r/sys/validators/pkg_metadata.json create mode 100644 portal-loop/extracted/r/sys/validators/poc.gno create mode 100644 portal-loop/extracted/r/sys/validators/validators.gno create mode 100644 portal-loop/extracted/r/sys/validators/validators_test.gno create mode 100644 portal-loop/extracted/r/test/hello/package.gno create mode 100644 portal-loop/extracted/r/test/hello/pkg_metadata.json create mode 100644 portal-loop/extracted/r/test/hello:0/package.gno create mode 100644 portal-loop/extracted/r/test/hello:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/tliu2023/raffle/package.gno create mode 100644 portal-loop/extracted/r/tliu2023/raffle/pkg_metadata.json create mode 100644 portal-loop/extracted/r/tliu523/raffle/package.gno create mode 100644 portal-loop/extracted/r/tliu523/raffle/pkg_metadata.json create mode 100644 portal-loop/extracted/r/tliu523/raffle:0/package.gno create mode 100644 portal-loop/extracted/r/tliu523/raffle:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/tliu523/raffleUser/package.gno create mode 100644 portal-loop/extracted/r/tliu523/raffleUser/pkg_metadata.json create mode 100644 portal-loop/extracted/r/tus/hello/package.gno create mode 100644 portal-loop/extracted/r/tus/hello/pkg_metadata.json create mode 100644 portal-loop/extracted/r/urjit/raffle/package.gno create mode 100644 portal-loop/extracted/r/urjit/raffle/pkg_metadata.json create mode 100644 portal-loop/extracted/r/urjit/raffle:0/package.gno create mode 100644 portal-loop/extracted/r/urjit/raffle:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/urjit/rafflev2/package.gno create mode 100644 portal-loop/extracted/r/urjit/rafflev2/pkg_metadata.json create mode 100644 portal-loop/extracted/r/vershun/vraffle/package.gno create mode 100644 portal-loop/extracted/r/vershun/vraffle/pkg_metadata.json create mode 100644 portal-loop/extracted/r/vershun/vraffle:0/package.gno create mode 100644 portal-loop/extracted/r/vershun/vraffle:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/vrvt/hello/package.gno create mode 100644 portal-loop/extracted/r/vrvt/hello/pkg_metadata.json create mode 100644 portal-loop/extracted/r/vrvt/hello:0/package.gno create mode 100644 portal-loop/extracted/r/vrvt/hello:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/whisky/goraffle/package.gno create mode 100644 portal-loop/extracted/r/whisky/goraffle/pkg_metadata.json create mode 100644 portal-loop/extracted/r/whisky/goraffle:0/package.gno create mode 100644 portal-loop/extracted/r/whisky/goraffle:0/pkg_metadata.json create mode 100644 portal-loop/extracted/r/whoagain/raffle/package.gno create mode 100644 portal-loop/extracted/r/whoagain/raffle/pkg_metadata.json diff --git a/.github/workflows/portal-loop-txs-exporter.yml b/.github/workflows/portal-loop-txs-exporter.yml index c4bc7e57..af474a01 100644 --- a/.github/workflows/portal-loop-txs-exporter.yml +++ b/.github/workflows/portal-loop-txs-exporter.yml @@ -1,8 +1,8 @@ -name: Backup PortalLoop +name: Backup Portal Loop on: # allow to run workflow manually - workflow_dispatch: {} + workflow_dispatch: { } # Triggers the workflow every day at 1am schedule: @@ -28,16 +28,16 @@ jobs: - uses: actions/checkout@v4 - uses: actions/setup-go@v5 with: - go-version: "^1.22.4" + go-version: "^1.22" - name: Run backup script run: bash portal-loop/export.sh - name: Run stats script - run: make -C ${{ matrix.testnet }} stats + run: make -C ${{ matrix.testnet }} stats-legacy - name: Run extractor - run: make -C ${{ matrix.testnet }} extractor + run: make -C ${{ matrix.testnet }} extractor-legacy - uses: stefanzweifel/git-auto-commit-action@v5 with: diff --git a/extractor-0.1.1/main.go b/extractor-0.1.1/main.go index cf46a6ed..6c5256d5 100644 --- a/extractor-0.1.1/main.go +++ b/extractor-0.1.1/main.go @@ -16,6 +16,7 @@ import ( "github.com/gnolang/gno/gno.land/pkg/sdk/vm" "github.com/gnolang/gno/tm2/pkg/amino" + "github.com/gnolang/gno/tm2/pkg/std" "github.com/gnolang/tx-archive/types" "github.com/peterbourgon/ff/v3/ffcli" ) @@ -37,6 +38,8 @@ type extractorCfg struct { fileType string sourcePath string outputDir string + + legacyMode bool } func main() { @@ -88,6 +91,13 @@ func (c *extractorCfg) registerFlags(fs *flag.FlagSet) { "./extracted", "the output directory for the extracted Gno source code", ) + + fs.BoolVar( + &c.legacyMode, + "legacy-mode", + false, + "flag indicating if the legacy tx sheet mode should be used", + ) } // execExtract runs the extract service for Gno source code @@ -129,40 +139,81 @@ func execExtract(ctx context.Context, cfg *extractorCfg) error { return errNoSourceFilesFound } - for _, sourceFile := range sourceFiles { - sourceFile := sourceFile + var ( + unwrapFn = func(data types.TxData) []std.Msg { + return data.Tx.Msgs + } - // Extract messages - msgs, processErr := extractAddMessages(sourceFile) - if processErr != nil { - return processErr + heightFn = func(data types.TxData) uint64 { + return data.BlockNum } - // Process messages - for _, msg := range msgs { - outputDir := filepath.Join(cfg.outputDir, strings.TrimLeft(msg.Package.Path, "gno.land/")) + unwrapLegacyFn = func(tx std.Tx) []std.Msg { + return tx.Msgs + } - if st, err := os.Stat(outputDir); err == nil && st.IsDir() { - outputDir += ":" + strconv.FormatUint(msg.Height, 10) - } + heightLegacyFn = func(_ std.Tx) uint64 { + return 0 + } + ) - // Write dir before writing files - if dirWriteErr := os.MkdirAll(outputDir, os.ModePerm); dirWriteErr != nil { - return fmt.Errorf("unable to write dir, %w", dirWriteErr) + for _, sourceFile := range sourceFiles { + select { + case <-ctx.Done(): + return ctx.Err() + default: + sourceFile := sourceFile + + // Extract messages + var ( + msgs []AddPackage + processErr error + ) + + if !cfg.legacyMode { + msgs, processErr = extractAddMessages( + sourceFile, + unwrapFn, + heightFn, + ) + } else { + msgs, processErr = extractAddMessages( + sourceFile, + unwrapLegacyFn, + heightLegacyFn, + ) } - // Write the package source code - if writeErr := writePackageFiles(msg, outputDir); writeErr != nil { - return writeErr + if processErr != nil { + return processErr } - // Write the package metadata - if writeErr := writePackageMetadata(metadataFromMsg(msg), outputDir); writeErr != nil { - return writeErr + // Process messages + for _, msg := range msgs { + outputDir := filepath.Join(cfg.outputDir, strings.TrimLeft(msg.Package.Path, "gno.land/")) + + if st, err := os.Stat(outputDir); err == nil && st.IsDir() { + outputDir += ":" + strconv.FormatUint(msg.Height, 10) + } + + // Write dir before writing files + if dirWriteErr := os.MkdirAll(outputDir, os.ModePerm); dirWriteErr != nil { + return fmt.Errorf("unable to write dir, %w", dirWriteErr) + } + + // Write the package source code + if writeErr := writePackageFiles(msg, outputDir); writeErr != nil { + return writeErr + } + + // Write the package metadata + if writeErr := writePackageMetadata(metadataFromMsg(msg), outputDir); writeErr != nil { + return writeErr + } } } - } + return nil } @@ -204,7 +255,12 @@ type AddPackage struct { Height uint64 } -func extractAddMessages(filePath string) ([]AddPackage, error) { +// extractAddMessages extracts the AddPackage messages +func extractAddMessages[T std.Tx | types.TxData]( + filePath string, + unwrapFn func(T) []std.Msg, + heightFn func(T) uint64, +) ([]AddPackage, error) { file, err := os.Open(filePath) if err != nil { return nil, fmt.Errorf("unable to open file, %w", err) @@ -226,7 +282,8 @@ func extractAddMessages(filePath string) ([]AddPackage, error) { tempBuf := make([]byte, 0) for { - var txData types.TxData + var txData T + line, isPrefix, err := reader.ReadLine() // Exit if no more lines in file @@ -262,7 +319,7 @@ func extractAddMessages(filePath string) ([]AddPackage, error) { tempBuf = nil } - for _, msg := range txData.Tx.Msgs { + for _, msg := range unwrapFn(txData) { // Only MsgAddPkg should be parsed if msg.Type() != "add_package" { continue @@ -279,7 +336,7 @@ func extractAddMessages(filePath string) ([]AddPackage, error) { msgArr = append(msgArr, AddPackage{ MsgAddPackage: msgAddPkg, - Height: txData.BlockNum, + Height: heightFn(txData), }) } } diff --git a/portal-loop/README.md b/portal-loop/README.md index 1cc5488a..72b8148c 100644 --- a/portal-loop/README.md +++ b/portal-loop/README.md @@ -2,7 +2,7 @@ ## TXs ``` - 0 + 5542 ``` ## addpkgs @@ -11,6 +11,116 @@ ## top realm calls ``` +1920 "gno.land/r/portal/counter" + 220 "gno.land/r/gnoland/blog" + 108 "gno.land/r/demo/teritori/social_feeds" + 106 "gno.land/r/demo/memeland" + 68 "gno.land/r/demo/postit/v1" + 60 "gno.land/r/demo/users" + 48 "gno.land/r/demo/userbook" + 37 "gno.land/r/gnome/dao/v1dev1" + 36 "gno.land/r/demo/wugnot" + 32 "gno.land/r/demo/staging/memeland/v1" + 30 "gno.land/r/demo/boards" + 24 "gno.land/r/demo/event_emitter" + 24 "gno.land/r/gnome/dao/v1dev0" + 23 "gno.land/r/gnoland/events" + 23 "gno.land/r/gnome/dao/pre1" + 19 "gno.land/r/gnome/dao/v1pre2" + 16 "gno.land/r/gnome/dao/v1pre3" + 15 "gno.land/r/gc24/raffle" + 15 "gno.land/r/gnome/dao/v1pre1" + 15 "gno.land/r/jeronimoalbi/testpoll" + 14 "gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/v1" + 13 "gno.land/r/demo/staging/memeland/v2" + 11 "gno.land/r/mikecito/gh_test_4" + 11 "gno.land/r/varmeta/vmt721" + 10 "gno.land/r/gnome/dao/v1dev01" + 10 "gno.land/r/test321/hello" + 9 "gno.land/r/albttx/home" + 8 "gno.land/r/demo/postit" + 8 "gno.land/r/gnome/dao/v1pre4" + 8 "gno.land/r/leon/test/avltestv1" + 7 "gno.land/r/leon/v2/raffle" + 7 "gno.land/r/malek/todolist1" + 6 "gno.land/r/gnome/dao/pre2" + 6 "gno.land/r/leon/staging/v3/raffle" + 6 "gno.land/r/mikecito/gh_test_3" + 6 "gno.land/r/test2/hello" + 5 "gno.land/r/demo/foo20" + 5 "gno.land/r/demo/restest" + 5 "gno.land/r/demo/test_event" + 5 "gno.land/r/leon/test/test1/whitelistfactory" + 5 "gno.land/r/leon/tokens/leongrc20" + 5 "gno.land/r/mikecito/gh_test_2" + 5 "gno.land/r/teritori/social_feeds" + 4 "gno.land/r/michelle37/testpoll" + 4 "gno.land/r/reza/rezablog" + 4 "gno.land/r/test/counter" + 3 "gno.land/r/boom/boom" + 3 "gno.land/r/demo/banktest" + 3 "gno.land/r/demo/hello001" + 3 "gno.land/r/demo/mikecito/social_feeds" + 3 "gno.land/r/demo/nft2" + 3 "gno.land/r/gnoland/faucet" + 3 "gno.land/r/leon/demo/poll/v2" + 3 "gno.land/r/leon/grc/v1/leon200" + 3 "gno.land/r/leon/staging/v4/raffle" + 3 "gno.land/r/leon/test/avltest" + 3 "gno.land/r/leon/testing/counter3" + 3 "gno.land/r/leon/v5/memeland" + 3 "gno.land/r/mikecito/gh_test_1" + 2 "gno.land/r/demo/event" + 2 "gno.land/r/demo/hi001" + 2 "gno.land/r/demo/morgan/variadic" + 2 "gno.land/r/gnome/tutorials/pre1" + 2 "gno.land/r/hehe321/hehe321" + 2 "gno.land/r/hehe321/hehe3211" + 2 "gno.land/r/hehe321/hehe3212" + 2 "gno.land/r/jeronimoalbi2/testpoll" + 2 "gno.land/r/leon/counter/e/hello" + 2 "gno.land/r/leon/demo/poll" + 2 "gno.land/r/leon/testing/counter2" + 2 "gno.land/r/leon/v1/raffle" + 2 "gno.land/r/mikaelvallenet/mvc" + 2 "gno.land/r/test3/hello" + 2 "gno.land/r/test4/hello" + 1 "gno.land/r/deelawn/tsrf" + 1 "gno.land/r/demo/abcitest123" + 1 "gno.land/r/demo/art/gnoface" + 1 "gno.land/r/demo/counter" + 1 "gno.land/r/demo/emit_main" + 1 "gno.land/r/demo/faucet" + 1 "gno.land/r/demo/grc20factory" + 1 "gno.land/r/demo/hello" + 1 "gno.land/r/demo/microblog" + 1 "gno.land/r/demo/tamagotchi" + 1 "gno.land/r/demo/test_event2" + 1 "gno.land/r/demoyy/counter" + 1 "gno.land/r/foo/event" + 1 "gno.land/r/gnoland/ghverify" + 1 "gno.land/r/gophercon/mood" + 1 "gno.land/r/hehe3212/hehe3212" + 1 "gno.land/r/hello/event" + 1 "gno.land/r/hello/event_emitter" + 1 "gno.land/r/iamkevin/kraffle5" + 1 "gno.land/r/leon/demo/poll/v1" + 1 "gno.land/r/leon/grc/v1/leon20" + 1 "gno.land/r/leon/test/realm/hello" + 1 "gno.land/r/leon/test/realms" + 1 "gno.land/r/leon/test/realms2" + 1 "gno.land/r/leon/test/todolist" + 1 "gno.land/r/leon/v1/memeland" + 1 "gno.land/r/manfred/home" + 1 "gno.land/r/mikaelvallenet/path" + 1 "gno.land/r/morgan/guestbook" + 1 "gno.land/r/nebular24/guessbook" + 1 "gno.land/r/stuyk/mood" + 1 "gno.land/r/test/hello" + 1 "gno.land/r/test10/poll" + 1 "gno.land/r/test5/hello" + 1 "gno.land/r/varmeta/demo/v1/domain/registrar" + 1 "gno.land/r/whisky/goraffle" ``` ## top faucet requesters diff --git a/portal-loop/extracted/p/Olawale22/mail/package.gno b/portal-loop/extracted/p/Olawale22/mail/package.gno new file mode 100644 index 00000000..22f56182 --- /dev/null +++ b/portal-loop/extracted/p/Olawale22/mail/package.gno @@ -0,0 +1,58 @@ +package mail + +import ( + "fmt" + "strings" +) + +type Mail struct { + Header map[string]string + Body string +} + +func ReadMessage(msg string) (*Mail, error) { + lines := strings.Split(msg, "\n") + mail := &Mail{Header: make(map[string]string)} + + isBody := false + for _, line := range lines { + if line == "" { + isBody = true + continue + } + if isBody { + mail.Body += line + "\n" + } else { + parts := strings.SplitN(line, ": ", 2) + if len(parts) == 2 { + mail.Header[parts[0]] = parts[1] + } + } + } + return mail, nil +} + + +#usage run app using "func main()" below, but endeavor to change "package mail" from above to "package main" + +func main() { + msg := `From: user@example.com +To: another@example.com +Subject: Test email + +This is the body of the email.` + email, err := ReadMessage(msg) + if err != nil { + fmt.Println("Error:", err) + return + } + + fmt.Println("From:", email.Header["From"]) + fmt.Println("To:", email.Header["To"]) + fmt.Println("Subject:", email.Header["Subject"]) + fmt.Println("Body:", email.Body) +} + +func Render(path string) string { + return "Hello World!" +} diff --git a/portal-loop/extracted/p/Olawale22/mail/pkg_metadata.json b/portal-loop/extracted/p/Olawale22/mail/pkg_metadata.json new file mode 100644 index 00000000..a0421be9 --- /dev/null +++ b/portal-loop/extracted/p/Olawale22/mail/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1kw6jg3yjsvgycverrmyn7k6mldnu6e3pe42n6q","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/p/Olawale22/mail:0/package.gno b/portal-loop/extracted/p/Olawale22/mail:0/package.gno new file mode 100644 index 00000000..7aa57c93 --- /dev/null +++ b/portal-loop/extracted/p/Olawale22/mail:0/package.gno @@ -0,0 +1,33 @@ +package mail + +import ( + "fmt" + "strings" +) + +type Mail struct { + Header map[string]string + Body string +} + +func ReadMessage(msg string) (*Mail, error) { + lines := strings.Split(msg, "\n") + mail := &Mail{Header: make(map[string]string)} + + isBody := false + for _, line := range lines { + if line == "" { + isBody = true + continue + } + if isBody { + mail.Body += line + "\n" + } else { + parts := strings.SplitN(line, ": ", 2) + if len(parts) == 2 { + mail.Header[parts[0]] = parts[1] + } + } + } + return mail, nil +} diff --git a/portal-loop/extracted/p/Olawale22/mail:0/pkg_metadata.json b/portal-loop/extracted/p/Olawale22/mail:0/pkg_metadata.json new file mode 100644 index 00000000..a0421be9 --- /dev/null +++ b/portal-loop/extracted/p/Olawale22/mail:0/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1kw6jg3yjsvgycverrmyn7k6mldnu6e3pe42n6q","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/p/counter/package.gno b/portal-loop/extracted/p/counter/package.gno new file mode 100644 index 00000000..c614683c --- /dev/null +++ b/portal-loop/extracted/p/counter/package.gno @@ -0,0 +1,21 @@ +package counter + +import ( + "gno.land/p/demo/ufmt" +) + +var count int + +func Increment() { + count++ +} + +func Decrement() { + count-- +} + +func Render(_ string) string { + return ufmt.Sprintf("Count: %d", count) +} + +// How-to: Write a simple Gno Smart Contract (Realm) \ No newline at end of file diff --git a/portal-loop/extracted/p/counter/pkg_metadata.json b/portal-loop/extracted/p/counter/pkg_metadata.json new file mode 100644 index 00000000..aa9ce95a --- /dev/null +++ b/portal-loop/extracted/p/counter/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jy5nwfghp9wh35y2va9tmd7lt7pf42dn035zwx","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/acl/acl.gno b/portal-loop/extracted/p/demo/acl/acl.gno new file mode 100644 index 00000000..fe017490 --- /dev/null +++ b/portal-loop/extracted/p/demo/acl/acl.gno @@ -0,0 +1,102 @@ +package acl + +import ( + "std" + + "gno.land/p/demo/avl" +) + +func New() *Directory { + return &Directory{ + userGroups: avl.Tree{}, + permBuckets: avl.Tree{}, + } +} + +type Directory struct { + permBuckets avl.Tree // identifier -> perms + userGroups avl.Tree // std.Address -> []string +} + +func (d *Directory) HasPerm(addr std.Address, verb, resource string) bool { + // FIXME: consider memoize. + + // user perms + if d.getBucketPerms("u:"+addr.String()).hasPerm(verb, resource) { + return true + } + + // everyone's perms. + if d.getBucketPerms("g:"+Everyone).hasPerm(verb, resource) { + return true + } + + // user groups' perms. + groups, ok := d.userGroups.Get(addr.String()) + if ok { + for _, group := range groups.([]string) { + if d.getBucketPerms("g:"+group).hasPerm(verb, resource) { + return true + } + } + } + + return false +} + +func (d *Directory) getBucketPerms(bucket string) perms { + res, ok := d.permBuckets.Get(bucket) + if ok { + return res.(perms) + } + return perms{} +} + +func (d *Directory) HasRole(addr std.Address, role string) bool { + return d.HasPerm(addr, "role", role) +} + +func (d *Directory) AddUserPerm(addr std.Address, verb, resource string) { + bucket := "u:" + addr.String() + p := perm{ + verbs: []string{verb}, + resources: []string{resource}, + } + d.addPermToBucket(bucket, p) +} + +func (d *Directory) AddGroupPerm(name string, verb, resource string) { + bucket := "g:" + name + p := perm{ + verbs: []string{verb}, + resources: []string{resource}, + } + d.addPermToBucket(bucket, p) +} + +func (d *Directory) addPermToBucket(bucket string, p perm) { + var ps perms + + existing, ok := d.permBuckets.Get(bucket) + if ok { + ps = existing.(perms) + } + ps = append(ps, p) + + d.permBuckets.Set(bucket, ps) +} + +func (d *Directory) AddUserToGroup(user std.Address, group string) { + existing, ok := d.userGroups.Get(user.String()) + var groups []string + if ok { + groups = existing.([]string) + } + groups = append(groups, group) + d.userGroups.Set(user.String(), groups) +} + +// TODO: helpers to remove permissions. +// TODO: helpers to adds multiple permissions at once -> {verbs: []string{"read","write"}}. +// TODO: helpers to delete users from gorups. +// TODO: helpers to quickly reset states. diff --git a/portal-loop/extracted/p/demo/acl/acl_test.gno b/portal-loop/extracted/p/demo/acl/acl_test.gno new file mode 100644 index 00000000..53804eab --- /dev/null +++ b/portal-loop/extracted/p/demo/acl/acl_test.gno @@ -0,0 +1,134 @@ +package acl + +import ( + "std" + "testing" + + "gno.land/p/demo/testutils" + "gno.land/p/demo/uassert" + "gno.land/p/demo/ufmt" +) + +func Test(t *testing.T) { + adm := testutils.TestAddress("admin") + mod := testutils.TestAddress("mod") + usr := testutils.TestAddress("user") + cst := testutils.TestAddress("custom") + + dir := New() + + // by default, no one has perm. + shouldNotHasRole(t, dir, adm, "foo") + shouldNotHasRole(t, dir, mod, "foo") + shouldNotHasRole(t, dir, usr, "foo") + shouldNotHasRole(t, dir, cst, "foo") + shouldNotHasPerm(t, dir, adm, "write", "r/demo/boards:gnolang/1") + shouldNotHasPerm(t, dir, mod, "write", "r/demo/boards:gnolang/1") + shouldNotHasPerm(t, dir, usr, "write", "r/demo/boards:gnolang/1") + shouldNotHasPerm(t, dir, cst, "write", "r/demo/boards:gnolang/1") + shouldNotHasPerm(t, dir, adm, "read", "r/demo/boards:gnolang/1") + shouldNotHasPerm(t, dir, mod, "read", "r/demo/boards:gnolang/1") + shouldNotHasPerm(t, dir, usr, "read", "r/demo/boards:gnolang/1") + shouldNotHasPerm(t, dir, cst, "read", "r/demo/boards:gnolang/1") + + // adding all the rights to admin. + dir.AddUserPerm(adm, ".*", ".*") + shouldHasRole(t, dir, adm, "foo") + shouldNotHasRole(t, dir, mod, "foo") + shouldNotHasRole(t, dir, usr, "foo") + shouldNotHasRole(t, dir, cst, "foo") + shouldHasPerm(t, dir, adm, "write", "r/demo/boards:gnolang/1") // new + shouldNotHasPerm(t, dir, mod, "write", "r/demo/boards:gnolang/1") + shouldNotHasPerm(t, dir, usr, "write", "r/demo/boards:gnolang/1") + shouldNotHasPerm(t, dir, cst, "write", "r/demo/boards:gnolang/1") + shouldHasPerm(t, dir, adm, "read", "r/demo/boards:gnolang/1") // new + shouldNotHasPerm(t, dir, mod, "read", "r/demo/boards:gnolang/1") + shouldNotHasPerm(t, dir, usr, "read", "r/demo/boards:gnolang/1") + shouldNotHasPerm(t, dir, cst, "read", "r/demo/boards:gnolang/1") + + // adding custom regexp rule for user "cst". + dir.AddUserPerm(cst, "write", "r/demo/boards:gnolang/.*") + shouldHasRole(t, dir, adm, "foo") + shouldNotHasRole(t, dir, mod, "foo") + shouldNotHasRole(t, dir, usr, "foo") + shouldNotHasRole(t, dir, cst, "foo") + shouldHasPerm(t, dir, adm, "write", "r/demo/boards:gnolang/1") + shouldNotHasPerm(t, dir, mod, "write", "r/demo/boards:gnolang/1") + shouldNotHasPerm(t, dir, usr, "write", "r/demo/boards:gnolang/1") + shouldHasPerm(t, dir, cst, "write", "r/demo/boards:gnolang/1") // new + shouldHasPerm(t, dir, adm, "read", "r/demo/boards:gnolang/1") + shouldNotHasPerm(t, dir, mod, "read", "r/demo/boards:gnolang/1") + shouldNotHasPerm(t, dir, usr, "read", "r/demo/boards:gnolang/1") + shouldNotHasPerm(t, dir, cst, "read", "r/demo/boards:gnolang/1") + + // adding a group perm for a new group. + // no changes expected. + dir.AddGroupPerm("mods", "role", "moderator") + dir.AddGroupPerm("mods", "write", ".*") + shouldHasRole(t, dir, adm, "foo") + shouldNotHasRole(t, dir, mod, "foo") + shouldNotHasRole(t, dir, usr, "foo") + shouldNotHasRole(t, dir, cst, "foo") + shouldHasPerm(t, dir, adm, "write", "r/demo/boards:gnolang/1") + shouldNotHasPerm(t, dir, mod, "write", "r/demo/boards:gnolang/1") + shouldNotHasPerm(t, dir, usr, "write", "r/demo/boards:gnolang/1") + shouldHasPerm(t, dir, cst, "write", "r/demo/boards:gnolang/1") + shouldHasPerm(t, dir, adm, "read", "r/demo/boards:gnolang/1") + shouldNotHasPerm(t, dir, mod, "read", "r/demo/boards:gnolang/1") + shouldNotHasPerm(t, dir, usr, "read", "r/demo/boards:gnolang/1") + shouldNotHasPerm(t, dir, cst, "read", "r/demo/boards:gnolang/1") + + // assigning the user "mod" to the "mods" group. + dir.AddUserToGroup(mod, "mods") + shouldHasRole(t, dir, adm, "foo") + shouldNotHasRole(t, dir, mod, "foo") + shouldNotHasRole(t, dir, usr, "foo") + shouldNotHasRole(t, dir, cst, "foo") + shouldHasPerm(t, dir, adm, "write", "r/demo/boards:gnolang/1") + shouldHasPerm(t, dir, mod, "write", "r/demo/boards:gnolang/1") // new + shouldNotHasPerm(t, dir, usr, "write", "r/demo/boards:gnolang/1") + shouldHasPerm(t, dir, cst, "write", "r/demo/boards:gnolang/1") + shouldHasPerm(t, dir, adm, "read", "r/demo/boards:gnolang/1") + shouldNotHasPerm(t, dir, mod, "read", "r/demo/boards:gnolang/1") + shouldNotHasPerm(t, dir, usr, "read", "r/demo/boards:gnolang/1") + shouldNotHasPerm(t, dir, cst, "read", "r/demo/boards:gnolang/1") + + // adding "read" permission for everyone. + dir.AddGroupPerm(Everyone, "read", ".*") + shouldHasRole(t, dir, adm, "foo") + shouldNotHasRole(t, dir, mod, "foo") + shouldNotHasRole(t, dir, usr, "foo") + shouldNotHasRole(t, dir, cst, "foo") + shouldHasPerm(t, dir, adm, "write", "r/demo/boards:gnolang/1") + shouldHasPerm(t, dir, mod, "write", "r/demo/boards:gnolang/1") + shouldNotHasPerm(t, dir, usr, "write", "r/demo/boards:gnolang/1") + shouldHasPerm(t, dir, cst, "write", "r/demo/boards:gnolang/1") + shouldHasPerm(t, dir, adm, "read", "r/demo/boards:gnolang/1") + shouldHasPerm(t, dir, mod, "read", "r/demo/boards:gnolang/1") // new + shouldHasPerm(t, dir, usr, "read", "r/demo/boards:gnolang/1") // new + shouldHasPerm(t, dir, cst, "read", "r/demo/boards:gnolang/1") // new +} + +func shouldHasRole(t *testing.T, dir *Directory, addr std.Address, role string) { + t.Helper() + check := dir.HasRole(addr, role) + uassert.Equal(t, true, check, ufmt.Sprintf("%s should has role %s", addr.String(), role)) +} + +func shouldNotHasRole(t *testing.T, dir *Directory, addr std.Address, role string) { + t.Helper() + check := dir.HasRole(addr, role) + uassert.Equal(t, false, check, ufmt.Sprintf("%s should not has role %s", addr.String(), role)) +} + +func shouldHasPerm(t *testing.T, dir *Directory, addr std.Address, verb string, resource string) { + t.Helper() + check := dir.HasPerm(addr, verb, resource) + uassert.Equal(t, true, check, ufmt.Sprintf("%s should has perm for %s - %s", addr.String(), verb, resource)) +} + +func shouldNotHasPerm(t *testing.T, dir *Directory, addr std.Address, verb string, resource string) { + t.Helper() + check := dir.HasPerm(addr, verb, resource) + uassert.Equal(t, false, check, ufmt.Sprintf("%s should not has perm for %s - %s", addr.String(), verb, resource)) +} diff --git a/portal-loop/extracted/p/demo/acl/const.gno b/portal-loop/extracted/p/demo/acl/const.gno new file mode 100644 index 00000000..42e60179 --- /dev/null +++ b/portal-loop/extracted/p/demo/acl/const.gno @@ -0,0 +1,3 @@ +package acl + +const Everyone string = "everyone" diff --git a/portal-loop/extracted/p/demo/acl/perm.gno b/portal-loop/extracted/p/demo/acl/perm.gno new file mode 100644 index 00000000..8705c685 --- /dev/null +++ b/portal-loop/extracted/p/demo/acl/perm.gno @@ -0,0 +1,44 @@ +package acl + +import "regexp" + +type perm struct { + verbs []string + resources []string +} + +func (perm perm) hasPerm(verb, resource string) bool { + // check verb + verbOK := false + for _, pattern := range perm.verbs { + if match(pattern, verb) { + verbOK = true + break + } + } + if !verbOK { + return false + } + + // check resource + for _, pattern := range perm.resources { + if match(pattern, resource) { + return true + } + } + return false +} + +func match(pattern, target string) bool { + if pattern == ".*" { + return true + } + + if pattern == target { + return true + } + + // regexp handling + match, _ := regexp.MatchString(pattern, target) + return match +} diff --git a/portal-loop/extracted/p/demo/acl/perms.gno b/portal-loop/extracted/p/demo/acl/perms.gno new file mode 100644 index 00000000..9a0837af --- /dev/null +++ b/portal-loop/extracted/p/demo/acl/perms.gno @@ -0,0 +1,12 @@ +package acl + +type perms []perm + +func (perms perms) hasPerm(verb, resource string) bool { + for _, perm := range perms { + if perm.hasPerm(verb, resource) { + return true + } + } + return false +} diff --git a/portal-loop/extracted/p/demo/acl/pkg_metadata.json b/portal-loop/extracted/p/demo/acl/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/acl/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/avl/node.gno b/portal-loop/extracted/p/demo/avl/node.gno new file mode 100644 index 00000000..7308e163 --- /dev/null +++ b/portal-loop/extracted/p/demo/avl/node.gno @@ -0,0 +1,487 @@ +package avl + +//---------------------------------------- +// Node + +// Node represents a node in an AVL tree. +type Node struct { + key string // key is the unique identifier for the node. + value interface{} // value is the data stored in the node. + height int8 // height is the height of the node in the tree. + size int // size is the number of nodes in the subtree rooted at this node. + leftNode *Node // leftNode is the left child of the node. + rightNode *Node // rightNode is the right child of the node. +} + +// NewNode creates a new node with the given key and value. +func NewNode(key string, value interface{}) *Node { + return &Node{ + key: key, + value: value, + height: 0, + size: 1, + } +} + +// Size returns the size of the subtree rooted at the node. +func (node *Node) Size() int { + if node == nil { + return 0 + } + return node.size +} + +// IsLeaf checks if the node is a leaf node (has no children). +func (node *Node) IsLeaf() bool { + return node.height == 0 +} + +// Key returns the key of the node. +func (node *Node) Key() string { + return node.key +} + +// Value returns the value of the node. +func (node *Node) Value() interface{} { + return node.value +} + +// _copy creates a copy of the node (excluding value). +func (node *Node) _copy() *Node { + if node.height == 0 { + panic("Why are you copying a value node?") + } + return &Node{ + key: node.key, + height: node.height, + size: node.size, + leftNode: node.leftNode, + rightNode: node.rightNode, + } +} + +// Has checks if a node with the given key exists in the subtree rooted at the node. +func (node *Node) Has(key string) (has bool) { + if node == nil { + return false + } + if node.key == key { + return true + } + if node.height == 0 { + return false + } + if key < node.key { + return node.getLeftNode().Has(key) + } + return node.getRightNode().Has(key) +} + +// Get searches for a node with the given key in the subtree rooted at the node +// and returns its index, value, and whether it exists. +func (node *Node) Get(key string) (index int, value interface{}, exists bool) { + if node == nil { + return 0, nil, false + } + + if node.height == 0 { + if node.key == key { + return 0, node.value, true + } + if node.key < key { + return 1, nil, false + } + return 0, nil, false + } + + if key < node.key { + return node.getLeftNode().Get(key) + } + + rightNode := node.getRightNode() + index, value, exists = rightNode.Get(key) + index += node.size - rightNode.size + return index, value, exists +} + +// GetByIndex retrieves the key-value pair of the node at the given index +// in the subtree rooted at the node. +func (node *Node) GetByIndex(index int) (key string, value interface{}) { + if node.height == 0 { + if index == 0 { + return node.key, node.value + } + panic("GetByIndex asked for invalid index") + } + // TODO: could improve this by storing the sizes + leftNode := node.getLeftNode() + if index < leftNode.size { + return leftNode.GetByIndex(index) + } + return node.getRightNode().GetByIndex(index - leftNode.size) +} + +// Set inserts a new node with the given key-value pair into the subtree rooted at the node, +// and returns the new root of the subtree and whether an existing node was updated. +// +// XXX consider a better way to do this... perhaps split Node from Node. +func (node *Node) Set(key string, value interface{}) (newSelf *Node, updated bool) { + if node == nil { + return NewNode(key, value), false + } + + if node.height == 0 { + return node.setLeaf(key, value) + } + + node = node._copy() + if key < node.key { + node.leftNode, updated = node.getLeftNode().Set(key, value) + } else { + node.rightNode, updated = node.getRightNode().Set(key, value) + } + + if updated { + return node, updated + } + + node.calcHeightAndSize() + return node.balance(), updated +} + +// setLeaf inserts a new leaf node with the given key-value pair into the subtree rooted at the node, +// and returns the new root of the subtree and whether an existing node was updated. +func (node *Node) setLeaf(key string, value interface{}) (newSelf *Node, updated bool) { + if key == node.key { + return NewNode(key, value), true + } + + if key < node.key { + return &Node{ + key: node.key, + height: 1, + size: 2, + leftNode: NewNode(key, value), + rightNode: node, + }, false + } + + return &Node{ + key: key, + height: 1, + size: 2, + leftNode: node, + rightNode: NewNode(key, value), + }, false +} + +// Remove deletes the node with the given key from the subtree rooted at the node. +// returns the new root of the subtree, the new leftmost leaf key (if changed), +// the removed value and the removal was successful. +func (node *Node) Remove(key string) ( + newNode *Node, newKey string, value interface{}, removed bool, +) { + if node == nil { + return nil, "", nil, false + } + if node.height == 0 { + if key == node.key { + return nil, "", node.value, true + } + return node, "", nil, false + } + if key < node.key { + var newLeftNode *Node + newLeftNode, newKey, value, removed = node.getLeftNode().Remove(key) + if !removed { + return node, "", value, false + } + if newLeftNode == nil { // left node held value, was removed + return node.rightNode, node.key, value, true + } + node = node._copy() + node.leftNode = newLeftNode + node.calcHeightAndSize() + node = node.balance() + return node, newKey, value, true + } + + var newRightNode *Node + newRightNode, newKey, value, removed = node.getRightNode().Remove(key) + if !removed { + return node, "", value, false + } + if newRightNode == nil { // right node held value, was removed + return node.leftNode, "", value, true + } + node = node._copy() + node.rightNode = newRightNode + if newKey != "" { + node.key = newKey + } + node.calcHeightAndSize() + node = node.balance() + return node, "", value, true +} + +// getLeftNode returns the left child of the node. +func (node *Node) getLeftNode() *Node { + return node.leftNode +} + +// getRightNode returns the right child of the node. +func (node *Node) getRightNode() *Node { + return node.rightNode +} + +// rotateRight performs a right rotation on the node and returns the new root. +// NOTE: overwrites node +// TODO: optimize balance & rotate +func (node *Node) rotateRight() *Node { + node = node._copy() + l := node.getLeftNode() + _l := l._copy() + + _lrCached := _l.rightNode + _l.rightNode = node + node.leftNode = _lrCached + + node.calcHeightAndSize() + _l.calcHeightAndSize() + + return _l +} + +// rotateLeft performs a left rotation on the node and returns the new root. +// NOTE: overwrites node +// TODO: optimize balance & rotate +func (node *Node) rotateLeft() *Node { + node = node._copy() + r := node.getRightNode() + _r := r._copy() + + _rlCached := _r.leftNode + _r.leftNode = node + node.rightNode = _rlCached + + node.calcHeightAndSize() + _r.calcHeightAndSize() + + return _r +} + +// calcHeightAndSize updates the height and size of the node based on its children. +// NOTE: mutates height and size +func (node *Node) calcHeightAndSize() { + node.height = maxInt8(node.getLeftNode().height, node.getRightNode().height) + 1 + node.size = node.getLeftNode().size + node.getRightNode().size +} + +// calcBalance calculates the balance factor of the node. +func (node *Node) calcBalance() int { + return int(node.getLeftNode().height) - int(node.getRightNode().height) +} + +// balance balances the subtree rooted at the node and returns the new root. +// NOTE: assumes that node can be modified +// TODO: optimize balance & rotate +func (node *Node) balance() (newSelf *Node) { + balance := node.calcBalance() + if balance >= -1 { + return node + } + if balance > 1 { + if node.getLeftNode().calcBalance() >= 0 { + // Left Left Case + return node.rotateRight() + } + // Left Right Case + left := node.getLeftNode() + node.leftNode = left.rotateLeft() + return node.rotateRight() + } + + if node.getRightNode().calcBalance() <= 0 { + // Right Right Case + return node.rotateLeft() + } + + // Right Left Case + right := node.getRightNode() + node.rightNode = right.rotateRight() + return node.rotateLeft() +} + +// Shortcut for TraverseInRange. +func (node *Node) Iterate(start, end string, cb func(*Node) bool) bool { + return node.TraverseInRange(start, end, true, true, cb) +} + +// Shortcut for TraverseInRange. +func (node *Node) ReverseIterate(start, end string, cb func(*Node) bool) bool { + return node.TraverseInRange(start, end, false, true, cb) +} + +// TraverseInRange traverses all nodes, including inner nodes. +// Start is inclusive and end is exclusive when ascending, +// Start and end are inclusive when descending. +// Empty start and empty end denote no start and no end. +// If leavesOnly is true, only visit leaf nodes. +// NOTE: To simulate an exclusive reverse traversal, +// just append 0x00 to start. +func (node *Node) TraverseInRange(start, end string, ascending bool, leavesOnly bool, cb func(*Node) bool) bool { + if node == nil { + return false + } + afterStart := (start == "" || start < node.key) + startOrAfter := (start == "" || start <= node.key) + beforeEnd := false + if ascending { + beforeEnd = (end == "" || node.key < end) + } else { + beforeEnd = (end == "" || node.key <= end) + } + + // Run callback per inner/leaf node. + stop := false + if (!node.IsLeaf() && !leavesOnly) || + (node.IsLeaf() && startOrAfter && beforeEnd) { + stop = cb(node) + if stop { + return stop + } + } + if node.IsLeaf() { + return stop + } + + if ascending { + // check lower nodes, then higher + if afterStart { + stop = node.getLeftNode().TraverseInRange(start, end, ascending, leavesOnly, cb) + } + if stop { + return stop + } + if beforeEnd { + stop = node.getRightNode().TraverseInRange(start, end, ascending, leavesOnly, cb) + } + } else { + // check the higher nodes first + if beforeEnd { + stop = node.getRightNode().TraverseInRange(start, end, ascending, leavesOnly, cb) + } + if stop { + return stop + } + if afterStart { + stop = node.getLeftNode().TraverseInRange(start, end, ascending, leavesOnly, cb) + } + } + + return stop +} + +// TraverseByOffset traverses all nodes, including inner nodes. +// A limit of math.MaxInt means no limit. +func (node *Node) TraverseByOffset(offset, limit int, descending bool, leavesOnly bool, cb func(*Node) bool) bool { + if node == nil { + return false + } + + // fast paths. these happen only if TraverseByOffset is called directly on a leaf. + if limit <= 0 || offset >= node.size { + return false + } + if node.IsLeaf() { + if offset > 0 { + return false + } + return cb(node) + } + + // go to the actual recursive function. + return node.traverseByOffset(offset, limit, descending, leavesOnly, cb) +} + +// TraverseByOffset traverses the subtree rooted at the node by offset and limit, +// in either ascending or descending order, and applies the callback function to each traversed node. +// If leavesOnly is true, only leaf nodes are visited. +func (node *Node) traverseByOffset(offset, limit int, descending bool, leavesOnly bool, cb func(*Node) bool) bool { + // caller guarantees: offset < node.size; limit > 0. + if !leavesOnly { + if cb(node) { + return true + } + } + first, second := node.getLeftNode(), node.getRightNode() + if descending { + first, second = second, first + } + if first.IsLeaf() { + // either run or skip, based on offset + if offset > 0 { + offset-- + } else { + cb(first) + limit-- + if limit <= 0 { + return false + } + } + } else { + // possible cases: + // 1 the offset given skips the first node entirely + // 2 the offset skips none or part of the first node, but the limit requires some of the second node. + // 3 the offset skips none or part of the first node, and the limit stops our search on the first node. + if offset >= first.size { + offset -= first.size // 1 + } else { + if first.traverseByOffset(offset, limit, descending, leavesOnly, cb) { + return true + } + // number of leaves which could actually be called from inside + delta := first.size - offset + offset = 0 + if delta >= limit { + return true // 3 + } + limit -= delta // 2 + } + } + + // because of the caller guarantees and the way we handle the first node, + // at this point we know that limit > 0 and there must be some values in + // this second node that we include. + + // => if the second node is a leaf, it has to be included. + if second.IsLeaf() { + return cb(second) + } + // => if it is not a leaf, it will still be enough to recursively call this + // function with the updated offset and limit + return second.traverseByOffset(offset, limit, descending, leavesOnly, cb) +} + +// Only used in testing... +func (node *Node) lmd() *Node { + if node.height == 0 { + return node + } + return node.getLeftNode().lmd() +} + +// Only used in testing... +func (node *Node) rmd() *Node { + if node.height == 0 { + return node + } + return node.getRightNode().rmd() +} + +func maxInt8(a, b int8) int8 { + if a > b { + return a + } + return b +} diff --git a/portal-loop/extracted/p/demo/avl/node_test.gno b/portal-loop/extracted/p/demo/avl/node_test.gno new file mode 100644 index 00000000..f2421762 --- /dev/null +++ b/portal-loop/extracted/p/demo/avl/node_test.gno @@ -0,0 +1,555 @@ +package avl + +import ( + "sort" + "strings" + "testing" +) + +func TestTraverseByOffset(t *testing.T) { + const testStrings = `Alfa +Alfred +Alpha +Alphabet +Beta +Beth +Book +Browser` + tt := []struct { + name string + desc bool + }{ + {"ascending", false}, + {"descending", true}, + } + + for _, tt := range tt { + t.Run(tt.name, func(t *testing.T) { + sl := strings.Split(testStrings, "\n") + + // sort a first time in the order opposite to how we'll be traversing + // the tree, to ensure that we are not just iterating through with + // insertion order. + sort.Strings(sl) + if !tt.desc { + reverseSlice(sl) + } + + r := NewNode(sl[0], nil) + for _, v := range sl[1:] { + r, _ = r.Set(v, nil) + } + + // then sort sl in the order we'll be traversing it, so that we can + // compare the result with sl. + reverseSlice(sl) + + var result []string + for i := 0; i < len(sl); i++ { + r.TraverseByOffset(i, 1, tt.desc, true, func(n *Node) bool { + result = append(result, n.Key()) + return false + }) + } + + if !slicesEqual(sl, result) { + t.Errorf("want %v got %v", sl, result) + } + + for l := 2; l <= len(sl); l++ { + // "slices" + for i := 0; i <= len(sl); i++ { + max := i + l + if max > len(sl) { + max = len(sl) + } + exp := sl[i:max] + actual := []string{} + + r.TraverseByOffset(i, l, tt.desc, true, func(tr *Node) bool { + actual = append(actual, tr.Key()) + return false + }) + if !slicesEqual(exp, actual) { + t.Errorf("want %v got %v", exp, actual) + } + } + } + }) + } +} + +func TestHas(t *testing.T) { + tests := []struct { + name string + input []string + hasKey string + expected bool + }{ + { + "has key in non-empty tree", + []string{"C", "A", "B", "E", "D"}, + "B", + true, + }, + { + "does not have key in non-empty tree", + []string{"C", "A", "B", "E", "D"}, + "F", + false, + }, + { + "has key in single-node tree", + []string{"A"}, + "A", + true, + }, + { + "does not have key in single-node tree", + []string{"A"}, + "B", + false, + }, + { + "does not have key in empty tree", + []string{}, + "A", + false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var tree *Node + for _, key := range tt.input { + tree, _ = tree.Set(key, nil) + } + + result := tree.Has(tt.hasKey) + + if result != tt.expected { + t.Errorf("Expected %v, got %v", tt.expected, result) + } + }) + } +} + +func TestGet(t *testing.T) { + tests := []struct { + name string + input []string + getKey string + expectIdx int + expectVal interface{} + expectExists bool + }{ + { + "get existing key", + []string{"C", "A", "B", "E", "D"}, + "B", + 1, + nil, + true, + }, + { + "get non-existent key (smaller)", + []string{"C", "A", "B", "E", "D"}, + "@", + 0, + nil, + false, + }, + { + "get non-existent key (larger)", + []string{"C", "A", "B", "E", "D"}, + "F", + 5, + nil, + false, + }, + { + "get from empty tree", + []string{}, + "A", + 0, + nil, + false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var tree *Node + for _, key := range tt.input { + tree, _ = tree.Set(key, nil) + } + + idx, val, exists := tree.Get(tt.getKey) + + if idx != tt.expectIdx { + t.Errorf("Expected index %d, got %d", tt.expectIdx, idx) + } + + if val != tt.expectVal { + t.Errorf("Expected value %v, got %v", tt.expectVal, val) + } + + if exists != tt.expectExists { + t.Errorf("Expected exists %t, got %t", tt.expectExists, exists) + } + }) + } +} + +func TestGetByIndex(t *testing.T) { + tests := []struct { + name string + input []string + idx int + expectKey string + expectVal interface{} + expectPanic bool + }{ + { + "get by valid index", + []string{"C", "A", "B", "E", "D"}, + 2, + "C", + nil, + false, + }, + { + "get by valid index (smallest)", + []string{"C", "A", "B", "E", "D"}, + 0, + "A", + nil, + false, + }, + { + "get by valid index (largest)", + []string{"C", "A", "B", "E", "D"}, + 4, + "E", + nil, + false, + }, + { + "get by invalid index (negative)", + []string{"C", "A", "B", "E", "D"}, + -1, + "", + nil, + true, + }, + { + "get by invalid index (out of range)", + []string{"C", "A", "B", "E", "D"}, + 5, + "", + nil, + true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var tree *Node + for _, key := range tt.input { + tree, _ = tree.Set(key, nil) + } + + if tt.expectPanic { + defer func() { + if r := recover(); r == nil { + t.Errorf("Expected a panic but didn't get one") + } + }() + } + + key, val := tree.GetByIndex(tt.idx) + + if !tt.expectPanic { + if key != tt.expectKey { + t.Errorf("Expected key %s, got %s", tt.expectKey, key) + } + + if val != tt.expectVal { + t.Errorf("Expected value %v, got %v", tt.expectVal, val) + } + } + }) + } +} + +func TestRemove(t *testing.T) { + tests := []struct { + name string + input []string + removeKey string + expected []string + }{ + { + "remove leaf node", + []string{"C", "A", "B", "D"}, + "B", + []string{"A", "C", "D"}, + }, + { + "remove node with one child", + []string{"C", "A", "B", "D"}, + "A", + []string{"B", "C", "D"}, + }, + { + "remove node with two children", + []string{"C", "A", "B", "E", "D"}, + "C", + []string{"A", "B", "D", "E"}, + }, + { + "remove root node", + []string{"C", "A", "B", "E", "D"}, + "C", + []string{"A", "B", "D", "E"}, + }, + { + "remove non-existent key", + []string{"C", "A", "B", "E", "D"}, + "F", + []string{"A", "B", "C", "D", "E"}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var tree *Node + for _, key := range tt.input { + tree, _ = tree.Set(key, nil) + } + + tree, _, _, _ = tree.Remove(tt.removeKey) + + result := make([]string, 0) + tree.Iterate("", "", func(n *Node) bool { + result = append(result, n.Key()) + return false + }) + + if !slicesEqual(tt.expected, result) { + t.Errorf("want %v got %v", tt.expected, result) + } + }) + } +} + +func TestTraverse(t *testing.T) { + tests := []struct { + name string + input []string + expected []string + }{ + { + "empty tree", + []string{}, + []string{}, + }, + { + "single node tree", + []string{"A"}, + []string{"A"}, + }, + { + "small tree", + []string{"C", "A", "B", "E", "D"}, + []string{"A", "B", "C", "D", "E"}, + }, + { + "large tree", + []string{"H", "D", "L", "B", "F", "J", "N", "A", "C", "E", "G", "I", "K", "M", "O"}, + []string{"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O"}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var tree *Node + for _, key := range tt.input { + tree, _ = tree.Set(key, nil) + } + + t.Run("iterate", func(t *testing.T) { + var result []string + tree.Iterate("", "", func(n *Node) bool { + result = append(result, n.Key()) + return false + }) + if !slicesEqual(tt.expected, result) { + t.Errorf("want %v got %v", tt.expected, result) + } + }) + + t.Run("ReverseIterate", func(t *testing.T) { + var result []string + tree.ReverseIterate("", "", func(n *Node) bool { + result = append(result, n.Key()) + return false + }) + expected := make([]string, len(tt.expected)) + copy(expected, tt.expected) + for i, j := 0, len(expected)-1; i < j; i, j = i+1, j-1 { + expected[i], expected[j] = expected[j], expected[i] + } + if !slicesEqual(expected, result) { + t.Errorf("want %v got %v", expected, result) + } + }) + + t.Run("TraverseInRange", func(t *testing.T) { + var result []string + start, end := "C", "M" + tree.TraverseInRange(start, end, true, true, func(n *Node) bool { + result = append(result, n.Key()) + return false + }) + expected := make([]string, 0) + for _, key := range tt.expected { + if key >= start && key < end { + expected = append(expected, key) + } + } + if !slicesEqual(expected, result) { + t.Errorf("want %v got %v", expected, result) + } + }) + }) + } +} + +func TestRotateWhenHeightDiffers(t *testing.T) { + tests := []struct { + name string + input []string + expected []string + }{ + { + "right rotation when left subtree is higher", + []string{"E", "C", "A", "B", "D"}, + []string{"A", "B", "C", "E", "D"}, + }, + { + "left rotation when right subtree is higher", + []string{"A", "C", "E", "D", "F"}, + []string{"A", "C", "D", "E", "F"}, + }, + { + "left-right rotation", + []string{"E", "A", "C", "B", "D"}, + []string{"A", "B", "C", "E", "D"}, + }, + { + "right-left rotation", + []string{"A", "E", "C", "B", "D"}, + []string{"A", "B", "C", "E", "D"}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var tree *Node + for _, key := range tt.input { + tree, _ = tree.Set(key, nil) + } + + // perform rotation or balance + tree = tree.balance() + + // check tree structure + var result []string + tree.Iterate("", "", func(n *Node) bool { + result = append(result, n.Key()) + return false + }) + + if !slicesEqual(tt.expected, result) { + t.Errorf("want %v got %v", tt.expected, result) + } + }) + } +} + +func TestRotateAndBalance(t *testing.T) { + tests := []struct { + name string + input []string + expected []string + }{ + { + "right rotation", + []string{"A", "B", "C", "D", "E"}, + []string{"A", "B", "C", "D", "E"}, + }, + { + "left rotation", + []string{"E", "D", "C", "B", "A"}, + []string{"A", "B", "C", "D", "E"}, + }, + { + "left-right rotation", + []string{"C", "A", "E", "B", "D"}, + []string{"A", "B", "C", "D", "E"}, + }, + { + "right-left rotation", + []string{"C", "E", "A", "D", "B"}, + []string{"A", "B", "C", "D", "E"}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + var tree *Node + for _, key := range tt.input { + tree, _ = tree.Set(key, nil) + } + + tree = tree.balance() + + var result []string + tree.Iterate("", "", func(n *Node) bool { + result = append(result, n.Key()) + return false + }) + + if !slicesEqual(tt.expected, result) { + t.Errorf("want %v got %v", tt.expected, result) + } + }) + } +} + +func slicesEqual(w1, w2 []string) bool { + if len(w1) != len(w2) { + return false + } + for i := 0; i < len(w1); i++ { + if w1[0] != w2[0] { + return false + } + } + return true +} + +func maxint8(a, b int8) int8 { + if a > b { + return a + } + return b +} + +func reverseSlice(ss []string) { + for i := 0; i < len(ss)/2; i++ { + j := len(ss) - 1 - i + ss[i], ss[j] = ss[j], ss[i] + } +} diff --git a/portal-loop/extracted/p/demo/avl/pkg_metadata.json b/portal-loop/extracted/p/demo/avl/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/avl/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/avl/tree.gno b/portal-loop/extracted/p/demo/avl/tree.gno new file mode 100644 index 00000000..e7aa55eb --- /dev/null +++ b/portal-loop/extracted/p/demo/avl/tree.gno @@ -0,0 +1,103 @@ +package avl + +type IterCbFn func(key string, value interface{}) bool + +//---------------------------------------- +// Tree + +// The zero struct can be used as an empty tree. +type Tree struct { + node *Node +} + +// NewTree creates a new empty AVL tree. +func NewTree() *Tree { + return &Tree{ + node: nil, + } +} + +// Size returns the number of key-value pair in the tree. +func (tree *Tree) Size() int { + return tree.node.Size() +} + +// Has checks whether a key exists in the tree. +// It returns true if the key exists, otherwise false. +func (tree *Tree) Has(key string) (has bool) { + return tree.node.Has(key) +} + +// Get retrieves the value associated with the given key. +// It returns the value and a boolean indicating whether the key exists. +func (tree *Tree) Get(key string) (value interface{}, exists bool) { + _, value, exists = tree.node.Get(key) + return +} + +// GetByIndex retrieves the key-value pair at the specified index in the tree. +// It returns the key and value at the given index. +func (tree *Tree) GetByIndex(index int) (key string, value interface{}) { + return tree.node.GetByIndex(index) +} + +// Set inserts a key-value pair into the tree. +// If the key already exists, the value will be updated. +// It returns a boolean indicating whether the key was newly inserted or updated. +func (tree *Tree) Set(key string, value interface{}) (updated bool) { + newnode, updated := tree.node.Set(key, value) + tree.node = newnode + return updated +} + +// Remove removes a key-value pair from the tree. +// It returns the removed value and a boolean indicating whether the key was found and removed. +func (tree *Tree) Remove(key string) (value interface{}, removed bool) { + newnode, _, value, removed := tree.node.Remove(key) + tree.node = newnode + return value, removed +} + +// Iterate performs an in-order traversal of the tree within the specified key range. +// It calls the provided callback function for each key-value pair encountered. +// If the callback returns true, the iteration is stopped. +func (tree *Tree) Iterate(start, end string, cb IterCbFn) bool { + return tree.node.TraverseInRange(start, end, true, true, + func(node *Node) bool { + return cb(node.Key(), node.Value()) + }, + ) +} + +// ReverseIterate performs a reverse in-order traversal of the tree within the specified key range. +// It calls the provided callback function for each key-value pair encountered. +// If the callback returns true, the iteration is stopped. +func (tree *Tree) ReverseIterate(start, end string, cb IterCbFn) bool { + return tree.node.TraverseInRange(start, end, false, true, + func(node *Node) bool { + return cb(node.Key(), node.Value()) + }, + ) +} + +// IterateByOffset performs an in-order traversal of the tree starting from the specified offset. +// It calls the provided callback function for each key-value pair encountered, up to the specified count. +// If the callback returns true, the iteration is stopped. +func (tree *Tree) IterateByOffset(offset int, count int, cb IterCbFn) bool { + return tree.node.TraverseByOffset(offset, count, true, true, + func(node *Node) bool { + return cb(node.Key(), node.Value()) + }, + ) +} + +// ReverseIterateByOffset performs a reverse in-order traversal of the tree starting from the specified offset. +// It calls the provided callback function for each key-value pair encountered, up to the specified count. +// If the callback returns true, the iteration is stopped. +func (tree *Tree) ReverseIterateByOffset(offset int, count int, cb IterCbFn) bool { + return tree.node.TraverseByOffset(offset, count, false, true, + func(node *Node) bool { + return cb(node.Key(), node.Value()) + }, + ) +} diff --git a/portal-loop/extracted/p/demo/avl/tree_test.gno b/portal-loop/extracted/p/demo/avl/tree_test.gno new file mode 100644 index 00000000..8f6efcc5 --- /dev/null +++ b/portal-loop/extracted/p/demo/avl/tree_test.gno @@ -0,0 +1,161 @@ +package avl + +import "testing" + +func TestNewTree(t *testing.T) { + tree := NewTree() + if tree.node != nil { + t.Error("Expected tree.node to be nil") + } +} + +func TestTreeSize(t *testing.T) { + tree := NewTree() + if tree.Size() != 0 { + t.Error("Expected empty tree size to be 0") + } + + tree.Set("key1", "value1") + tree.Set("key2", "value2") + if tree.Size() != 2 { + t.Error("Expected tree size to be 2") + } +} + +func TestTreeHas(t *testing.T) { + tree := NewTree() + tree.Set("key1", "value1") + + if !tree.Has("key1") { + t.Error("Expected tree to have key1") + } + + if tree.Has("key2") { + t.Error("Expected tree to not have key2") + } +} + +func TestTreeGet(t *testing.T) { + tree := NewTree() + tree.Set("key1", "value1") + + value, exists := tree.Get("key1") + if !exists || value != "value1" { + t.Error("Expected Get to return value1 and true") + } + + _, exists = tree.Get("key2") + if exists { + t.Error("Expected Get to return false for non-existent key") + } +} + +func TestTreeGetByIndex(t *testing.T) { + tree := NewTree() + tree.Set("key1", "value1") + tree.Set("key2", "value2") + + key, value := tree.GetByIndex(0) + if key != "key1" || value != "value1" { + t.Error("Expected GetByIndex(0) to return key1 and value1") + } + + key, value = tree.GetByIndex(1) + if key != "key2" || value != "value2" { + t.Error("Expected GetByIndex(1) to return key2 and value2") + } + + defer func() { + if r := recover(); r == nil { + t.Error("Expected GetByIndex to panic for out-of-range index") + } + }() + tree.GetByIndex(2) +} + +func TestTreeRemove(t *testing.T) { + tree := NewTree() + tree.Set("key1", "value1") + + value, removed := tree.Remove("key1") + if !removed || value != "value1" || tree.Size() != 0 { + t.Error("Expected Remove to remove key-value pair") + } + + _, removed = tree.Remove("key2") + if removed { + t.Error("Expected Remove to return false for non-existent key") + } +} + +func TestTreeIterate(t *testing.T) { + tree := NewTree() + tree.Set("key1", "value1") + tree.Set("key2", "value2") + tree.Set("key3", "value3") + + var keys []string + tree.Iterate("", "", func(key string, value interface{}) bool { + keys = append(keys, key) + return false + }) + + expectedKeys := []string{"key1", "key2", "key3"} + if !slicesEqual(keys, expectedKeys) { + t.Errorf("Expected keys %v, got %v", expectedKeys, keys) + } +} + +func TestTreeReverseIterate(t *testing.T) { + tree := NewTree() + tree.Set("key1", "value1") + tree.Set("key2", "value2") + tree.Set("key3", "value3") + + var keys []string + tree.ReverseIterate("", "", func(key string, value interface{}) bool { + keys = append(keys, key) + return false + }) + + expectedKeys := []string{"key3", "key2", "key1"} + if !slicesEqual(keys, expectedKeys) { + t.Errorf("Expected keys %v, got %v", expectedKeys, keys) + } +} + +func TestTreeIterateByOffset(t *testing.T) { + tree := NewTree() + tree.Set("key1", "value1") + tree.Set("key2", "value2") + tree.Set("key3", "value3") + + var keys []string + tree.IterateByOffset(1, 2, func(key string, value interface{}) bool { + keys = append(keys, key) + return false + }) + + expectedKeys := []string{"key2", "key3"} + if !slicesEqual(keys, expectedKeys) { + t.Errorf("Expected keys %v, got %v", expectedKeys, keys) + } +} + +func TestTreeReverseIterateByOffset(t *testing.T) { + tree := NewTree() + tree.Set("key1", "value1") + tree.Set("key2", "value2") + tree.Set("key3", "value3") + + var keys []string + tree.ReverseIterateByOffset(1, 2, func(key string, value interface{}) bool { + keys = append(keys, key) + return false + }) + + expectedKeys := []string{"key2", "key1"} + if !slicesEqual(keys, expectedKeys) { + t.Errorf("Expected keys %v, got %v", expectedKeys, keys) + } +} diff --git a/portal-loop/extracted/p/demo/avl/z_0_filetest.gno b/portal-loop/extracted/p/demo/avl/z_0_filetest.gno new file mode 100644 index 00000000..aff79ffa --- /dev/null +++ b/portal-loop/extracted/p/demo/avl/z_0_filetest.gno @@ -0,0 +1,330 @@ +// PKGPATH: gno.land/r/test +package test + +import ( + "gno.land/p/demo/avl" +) + +var node *avl.Node + +func init() { + node = avl.NewNode("key0", "value0") + // node, _ = node.Set("key0", "value0") +} + +func main() { + var updated bool + node, updated = node.Set("key1", "value1") + // println(node, updated) + println(updated, node.Size()) +} + +// Output: +// false 2 + +// Realm: +// switchrealm["gno.land/r/test"] +// u[a8ada09dee16d791fd406d629fe29bb0ed084a30:4]={ +// "ObjectInfo": { +// "ID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:4", +// "ModTime": "7", +// "OwnerID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:7", +// "RefCount": "1" +// }, +// "Value": { +// "T": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// }, +// "V": { +// "@type": "/gno.RefValue", +// "Hash": "627e8e517e7ae5db0f3b753e2a32b607989198b6", +// "ObjectID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:5" +// } +// } +// } +// c[a8ada09dee16d791fd406d629fe29bb0ed084a30:9]={ +// "Fields": [ +// { +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "16" +// }, +// "V": { +// "@type": "/gno.StringValue", +// "value": "key1" +// } +// }, +// { +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "16" +// }, +// "V": { +// "@type": "/gno.StringValue", +// "value": "value1" +// } +// }, +// { +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "64" +// } +// }, +// { +// "N": "AQAAAAAAAAA=", +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "32" +// } +// }, +// { +// "T": { +// "@type": "/gno.PointerType", +// "Elt": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// } +// } +// }, +// { +// "T": { +// "@type": "/gno.PointerType", +// "Elt": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// } +// } +// } +// ], +// "ObjectInfo": { +// "ID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:9", +// "ModTime": "0", +// "OwnerID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:8", +// "RefCount": "1" +// } +// } +// c[a8ada09dee16d791fd406d629fe29bb0ed084a30:8]={ +// "ObjectInfo": { +// "ID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:8", +// "ModTime": "0", +// "OwnerID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:7", +// "RefCount": "1" +// }, +// "Value": { +// "T": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// }, +// "V": { +// "@type": "/gno.RefValue", +// "Hash": "b28057ab7be6383785c0a5503e8a531bdbc21851", +// "ObjectID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:9" +// } +// } +// } +// c[a8ada09dee16d791fd406d629fe29bb0ed084a30:7]={ +// "Fields": [ +// { +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "16" +// }, +// "V": { +// "@type": "/gno.StringValue", +// "value": "key1" +// } +// }, +// {}, +// { +// "N": "AQAAAAAAAAA=", +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "64" +// } +// }, +// { +// "N": "AgAAAAAAAAA=", +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "32" +// } +// }, +// { +// "T": { +// "@type": "/gno.PointerType", +// "Elt": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// } +// }, +// "V": { +// "@type": "/gno.PointerValue", +// "Base": { +// "@type": "/gno.RefValue", +// "Hash": "6da365f0d6cacbcdf53cd5a4b125803cddce08c2", +// "ObjectID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:4" +// }, +// "Index": "0", +// "TV": null +// } +// }, +// { +// "T": { +// "@type": "/gno.PointerType", +// "Elt": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// } +// }, +// "V": { +// "@type": "/gno.PointerValue", +// "Base": { +// "@type": "/gno.RefValue", +// "Hash": "f216afe7b5a17f4ebdbb98dceccedbc22e237596", +// "ObjectID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:8" +// }, +// "Index": "0", +// "TV": null +// } +// } +// ], +// "ObjectInfo": { +// "ID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:7", +// "ModTime": "0", +// "OwnerID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:6", +// "RefCount": "1" +// } +// } +// c[a8ada09dee16d791fd406d629fe29bb0ed084a30:6]={ +// "ObjectInfo": { +// "ID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:6", +// "ModTime": "0", +// "OwnerID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:2", +// "RefCount": "1" +// }, +// "Value": { +// "T": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// }, +// "V": { +// "@type": "/gno.RefValue", +// "Hash": "ff1a50d8489090af37a2c7766d659f0d717939b5", +// "ObjectID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:7" +// } +// } +// } +// u[a8ada09dee16d791fd406d629fe29bb0ed084a30:2]={ +// "Blank": {}, +// "ObjectInfo": { +// "ID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:2", +// "IsEscaped": true, +// "ModTime": "5", +// "RefCount": "2" +// }, +// "Parent": null, +// "Source": { +// "@type": "/gno.RefNode", +// "BlockNode": null, +// "Location": { +// "Column": "0", +// "File": "", +// "Line": "0", +// "PkgPath": "gno.land/r/test" +// } +// }, +// "Values": [ +// { +// "T": { +// "@type": "/gno.PointerType", +// "Elt": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// } +// }, +// "V": { +// "@type": "/gno.PointerValue", +// "Base": { +// "@type": "/gno.RefValue", +// "Hash": "ae86874f9b47fa5e64c30b3e92e9d07f2ec967a4", +// "ObjectID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:6" +// }, +// "Index": "0", +// "TV": null +// } +// }, +// { +// "T": { +// "@type": "/gno.FuncType", +// "Params": [], +// "Results": [] +// }, +// "V": { +// "@type": "/gno.FuncValue", +// "Closure": { +// "@type": "/gno.RefValue", +// "Escaped": true, +// "ObjectID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:3" +// }, +// "FileName": "main.gno", +// "IsMethod": false, +// "Name": "init.1", +// "NativeName": "", +// "NativePkg": "", +// "PkgPath": "gno.land/r/test", +// "Source": { +// "@type": "/gno.RefNode", +// "BlockNode": null, +// "Location": { +// "Column": "1", +// "File": "main.gno", +// "Line": "10", +// "PkgPath": "gno.land/r/test" +// } +// }, +// "Type": { +// "@type": "/gno.FuncType", +// "Params": [], +// "Results": [] +// } +// } +// }, +// { +// "T": { +// "@type": "/gno.FuncType", +// "Params": [], +// "Results": [] +// }, +// "V": { +// "@type": "/gno.FuncValue", +// "Closure": { +// "@type": "/gno.RefValue", +// "Escaped": true, +// "ObjectID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:3" +// }, +// "FileName": "main.gno", +// "IsMethod": false, +// "Name": "main", +// "NativeName": "", +// "NativePkg": "", +// "PkgPath": "gno.land/r/test", +// "Source": { +// "@type": "/gno.RefNode", +// "BlockNode": null, +// "Location": { +// "Column": "1", +// "File": "main.gno", +// "Line": "15", +// "PkgPath": "gno.land/r/test" +// } +// }, +// "Type": { +// "@type": "/gno.FuncType", +// "Params": [], +// "Results": [] +// } +// } +// } +// ] +// } diff --git a/portal-loop/extracted/p/demo/avl/z_1_filetest.gno b/portal-loop/extracted/p/demo/avl/z_1_filetest.gno new file mode 100644 index 00000000..3b6d40d5 --- /dev/null +++ b/portal-loop/extracted/p/demo/avl/z_1_filetest.gno @@ -0,0 +1,405 @@ +// PKGPATH: gno.land/r/test +package test + +import ( + "gno.land/p/demo/avl" +) + +var node *avl.Node + +func init() { + node = avl.NewNode("key0", "value0") + node, _ = node.Set("key1", "value1") +} + +func main() { + var updated bool + node, updated = node.Set("key2", "value2") + // println(node, updated) + println(updated, node.Size()) +} + +// Output: +// false 3 + +// Realm: +// switchrealm["gno.land/r/test"] +// c[a8ada09dee16d791fd406d629fe29bb0ed084a30:15]={ +// "Fields": [ +// { +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "16" +// }, +// "V": { +// "@type": "/gno.StringValue", +// "value": "key2" +// } +// }, +// { +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "16" +// }, +// "V": { +// "@type": "/gno.StringValue", +// "value": "value2" +// } +// }, +// { +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "64" +// } +// }, +// { +// "N": "AQAAAAAAAAA=", +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "32" +// } +// }, +// { +// "T": { +// "@type": "/gno.PointerType", +// "Elt": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// } +// } +// }, +// { +// "T": { +// "@type": "/gno.PointerType", +// "Elt": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// } +// } +// } +// ], +// "ObjectInfo": { +// "ID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:15", +// "ModTime": "0", +// "OwnerID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:14", +// "RefCount": "1" +// } +// } +// c[a8ada09dee16d791fd406d629fe29bb0ed084a30:14]={ +// "ObjectInfo": { +// "ID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:14", +// "ModTime": "0", +// "OwnerID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:13", +// "RefCount": "1" +// }, +// "Value": { +// "T": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// }, +// "V": { +// "@type": "/gno.RefValue", +// "Hash": "143aebc820da33550f7338723fb1e2eec575b196", +// "ObjectID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:15" +// } +// } +// } +// c[a8ada09dee16d791fd406d629fe29bb0ed084a30:13]={ +// "Fields": [ +// { +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "16" +// }, +// "V": { +// "@type": "/gno.StringValue", +// "value": "key2" +// } +// }, +// {}, +// { +// "N": "AQAAAAAAAAA=", +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "64" +// } +// }, +// { +// "N": "AgAAAAAAAAA=", +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "32" +// } +// }, +// { +// "T": { +// "@type": "/gno.PointerType", +// "Elt": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// } +// }, +// "V": { +// "@type": "/gno.PointerValue", +// "Base": { +// "@type": "/gno.RefValue", +// "Hash": "2f3adc5d0f2a3fe0331cfa93572a7abdde14c9aa", +// "ObjectID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:8" +// }, +// "Index": "0", +// "TV": null +// } +// }, +// { +// "T": { +// "@type": "/gno.PointerType", +// "Elt": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// } +// }, +// "V": { +// "@type": "/gno.PointerValue", +// "Base": { +// "@type": "/gno.RefValue", +// "Hash": "2e733a8e9e74fe14f0a5d10fb0f6728fa53d052d", +// "ObjectID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:14" +// }, +// "Index": "0", +// "TV": null +// } +// } +// ], +// "ObjectInfo": { +// "ID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:13", +// "ModTime": "0", +// "OwnerID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:12", +// "RefCount": "1" +// } +// } +// c[a8ada09dee16d791fd406d629fe29bb0ed084a30:12]={ +// "ObjectInfo": { +// "ID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:12", +// "ModTime": "0", +// "OwnerID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:11", +// "RefCount": "1" +// }, +// "Value": { +// "T": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// }, +// "V": { +// "@type": "/gno.RefValue", +// "Hash": "fe20a19f956511f274dc77854e9e5468387260f4", +// "ObjectID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:13" +// } +// } +// } +// c[a8ada09dee16d791fd406d629fe29bb0ed084a30:11]={ +// "Fields": [ +// { +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "16" +// }, +// "V": { +// "@type": "/gno.StringValue", +// "value": "key1" +// } +// }, +// {}, +// { +// "N": "AgAAAAAAAAA=", +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "64" +// } +// }, +// { +// "N": "AwAAAAAAAAA=", +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "32" +// } +// }, +// { +// "T": { +// "@type": "/gno.PointerType", +// "Elt": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// } +// }, +// "V": { +// "@type": "/gno.PointerValue", +// "Base": { +// "@type": "/gno.RefValue", +// "Hash": "c89a71bdf045e8bde2059dc9d33839f916e02e5d", +// "ObjectID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:6" +// }, +// "Index": "0", +// "TV": null +// } +// }, +// { +// "T": { +// "@type": "/gno.PointerType", +// "Elt": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// } +// }, +// "V": { +// "@type": "/gno.PointerValue", +// "Base": { +// "@type": "/gno.RefValue", +// "Hash": "90fa67f8c47db4b9b2a60425dff08d5a3385100f", +// "ObjectID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:12" +// }, +// "Index": "0", +// "TV": null +// } +// } +// ], +// "ObjectInfo": { +// "ID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:11", +// "ModTime": "0", +// "OwnerID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:10", +// "RefCount": "1" +// } +// } +// c[a8ada09dee16d791fd406d629fe29bb0ed084a30:10]={ +// "ObjectInfo": { +// "ID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:10", +// "ModTime": "0", +// "OwnerID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:2", +// "RefCount": "1" +// }, +// "Value": { +// "T": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// }, +// "V": { +// "@type": "/gno.RefValue", +// "Hash": "83e42caaf53070dd95b5f859053eb51ed900bbda", +// "ObjectID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:11" +// } +// } +// } +// u[a8ada09dee16d791fd406d629fe29bb0ed084a30:2]={ +// "Blank": {}, +// "ObjectInfo": { +// "ID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:2", +// "IsEscaped": true, +// "ModTime": "9", +// "RefCount": "2" +// }, +// "Parent": null, +// "Source": { +// "@type": "/gno.RefNode", +// "BlockNode": null, +// "Location": { +// "Column": "0", +// "File": "", +// "Line": "0", +// "PkgPath": "gno.land/r/test" +// } +// }, +// "Values": [ +// { +// "T": { +// "@type": "/gno.PointerType", +// "Elt": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// } +// }, +// "V": { +// "@type": "/gno.PointerValue", +// "Base": { +// "@type": "/gno.RefValue", +// "Hash": "1faa9fa4ba1935121a6d3f0a623772e9d4499b0a", +// "ObjectID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:10" +// }, +// "Index": "0", +// "TV": null +// } +// }, +// { +// "T": { +// "@type": "/gno.FuncType", +// "Params": [], +// "Results": [] +// }, +// "V": { +// "@type": "/gno.FuncValue", +// "Closure": { +// "@type": "/gno.RefValue", +// "Escaped": true, +// "ObjectID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:3" +// }, +// "FileName": "main.gno", +// "IsMethod": false, +// "Name": "init.1", +// "NativeName": "", +// "NativePkg": "", +// "PkgPath": "gno.land/r/test", +// "Source": { +// "@type": "/gno.RefNode", +// "BlockNode": null, +// "Location": { +// "Column": "1", +// "File": "main.gno", +// "Line": "10", +// "PkgPath": "gno.land/r/test" +// } +// }, +// "Type": { +// "@type": "/gno.FuncType", +// "Params": [], +// "Results": [] +// } +// } +// }, +// { +// "T": { +// "@type": "/gno.FuncType", +// "Params": [], +// "Results": [] +// }, +// "V": { +// "@type": "/gno.FuncValue", +// "Closure": { +// "@type": "/gno.RefValue", +// "Escaped": true, +// "ObjectID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:3" +// }, +// "FileName": "main.gno", +// "IsMethod": false, +// "Name": "main", +// "NativeName": "", +// "NativePkg": "", +// "PkgPath": "gno.land/r/test", +// "Source": { +// "@type": "/gno.RefNode", +// "BlockNode": null, +// "Location": { +// "Column": "1", +// "File": "main.gno", +// "Line": "15", +// "PkgPath": "gno.land/r/test" +// } +// }, +// "Type": { +// "@type": "/gno.FuncType", +// "Params": [], +// "Results": [] +// } +// } +// } +// ] +// } +// d[a8ada09dee16d791fd406d629fe29bb0ed084a30:4] +// d[a8ada09dee16d791fd406d629fe29bb0ed084a30:5] diff --git a/portal-loop/extracted/p/demo/avl/z_2_filetest.gno b/portal-loop/extracted/p/demo/avl/z_2_filetest.gno new file mode 100644 index 00000000..43067c31 --- /dev/null +++ b/portal-loop/extracted/p/demo/avl/z_2_filetest.gno @@ -0,0 +1,320 @@ +// PKGPATH: gno.land/r/test +package test + +import ( + "gno.land/p/demo/avl" +) + +var tree avl.Tree + +func init() { + tree.Set("key0", "value0") + tree.Set("key1", "value1") +} + +func main() { + var updated bool + updated = tree.Set("key2", "value2") + println(updated, tree.Size()) +} + +// Output: +// false 3 + +// Realm: +// switchrealm["gno.land/r/test"] +// c[a8ada09dee16d791fd406d629fe29bb0ed084a30:16]={ +// "Fields": [ +// { +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "16" +// }, +// "V": { +// "@type": "/gno.StringValue", +// "value": "key2" +// } +// }, +// { +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "16" +// }, +// "V": { +// "@type": "/gno.StringValue", +// "value": "value2" +// } +// }, +// { +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "64" +// } +// }, +// { +// "N": "AQAAAAAAAAA=", +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "32" +// } +// }, +// { +// "T": { +// "@type": "/gno.PointerType", +// "Elt": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// } +// } +// }, +// { +// "T": { +// "@type": "/gno.PointerType", +// "Elt": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// } +// } +// } +// ], +// "ObjectInfo": { +// "ID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:16", +// "ModTime": "0", +// "OwnerID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:15", +// "RefCount": "1" +// } +// } +// c[a8ada09dee16d791fd406d629fe29bb0ed084a30:15]={ +// "ObjectInfo": { +// "ID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:15", +// "ModTime": "0", +// "OwnerID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:14", +// "RefCount": "1" +// }, +// "Value": { +// "T": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// }, +// "V": { +// "@type": "/gno.RefValue", +// "Hash": "db333c89cd6773709e031f1f4e4ed4d3fed66c11", +// "ObjectID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:16" +// } +// } +// } +// c[a8ada09dee16d791fd406d629fe29bb0ed084a30:14]={ +// "Fields": [ +// { +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "16" +// }, +// "V": { +// "@type": "/gno.StringValue", +// "value": "key2" +// } +// }, +// {}, +// { +// "N": "AQAAAAAAAAA=", +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "64" +// } +// }, +// { +// "N": "AgAAAAAAAAA=", +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "32" +// } +// }, +// { +// "T": { +// "@type": "/gno.PointerType", +// "Elt": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// } +// }, +// "V": { +// "@type": "/gno.PointerValue", +// "Base": { +// "@type": "/gno.RefValue", +// "Hash": "849a50d6c78d65742752e3c89ad8dd556e2e63cb", +// "ObjectID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:9" +// }, +// "Index": "0", +// "TV": null +// } +// }, +// { +// "T": { +// "@type": "/gno.PointerType", +// "Elt": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// } +// }, +// "V": { +// "@type": "/gno.PointerValue", +// "Base": { +// "@type": "/gno.RefValue", +// "Hash": "b4fc2fdd2d0fe936c87ed2ace97136cffeed207f", +// "ObjectID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:15" +// }, +// "Index": "0", +// "TV": null +// } +// } +// ], +// "ObjectInfo": { +// "ID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:14", +// "ModTime": "0", +// "OwnerID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:13", +// "RefCount": "1" +// } +// } +// c[a8ada09dee16d791fd406d629fe29bb0ed084a30:13]={ +// "ObjectInfo": { +// "ID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:13", +// "ModTime": "0", +// "OwnerID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:12", +// "RefCount": "1" +// }, +// "Value": { +// "T": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// }, +// "V": { +// "@type": "/gno.RefValue", +// "Hash": "a1160b0060ad752dbfe5fe436f7734bb19136150", +// "ObjectID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:14" +// } +// } +// } +// c[a8ada09dee16d791fd406d629fe29bb0ed084a30:12]={ +// "Fields": [ +// { +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "16" +// }, +// "V": { +// "@type": "/gno.StringValue", +// "value": "key1" +// } +// }, +// {}, +// { +// "N": "AgAAAAAAAAA=", +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "64" +// } +// }, +// { +// "N": "AwAAAAAAAAA=", +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "32" +// } +// }, +// { +// "T": { +// "@type": "/gno.PointerType", +// "Elt": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// } +// }, +// "V": { +// "@type": "/gno.PointerValue", +// "Base": { +// "@type": "/gno.RefValue", +// "Hash": "fd95e08763159ac529e26986d652e752e78b6325", +// "ObjectID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:7" +// }, +// "Index": "0", +// "TV": null +// } +// }, +// { +// "T": { +// "@type": "/gno.PointerType", +// "Elt": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// } +// }, +// "V": { +// "@type": "/gno.PointerValue", +// "Base": { +// "@type": "/gno.RefValue", +// "Hash": "3ecdcf148fe2f9e97b72a3bedf303b2ba56d4f4b", +// "ObjectID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:13" +// }, +// "Index": "0", +// "TV": null +// } +// } +// ], +// "ObjectInfo": { +// "ID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:12", +// "ModTime": "0", +// "OwnerID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:11", +// "RefCount": "1" +// } +// } +// c[a8ada09dee16d791fd406d629fe29bb0ed084a30:11]={ +// "ObjectInfo": { +// "ID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:11", +// "ModTime": "0", +// "OwnerID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:3", +// "RefCount": "1" +// }, +// "Value": { +// "T": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// }, +// "V": { +// "@type": "/gno.RefValue", +// "Hash": "63126557dba88f8556f7a0ccbbfc1d218ae7a302", +// "ObjectID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:12" +// } +// } +// } +// u[a8ada09dee16d791fd406d629fe29bb0ed084a30:3]={ +// "Fields": [ +// { +// "T": { +// "@type": "/gno.PointerType", +// "Elt": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// } +// }, +// "V": { +// "@type": "/gno.PointerValue", +// "Base": { +// "@type": "/gno.RefValue", +// "Hash": "d31c7e797793e03ffe0bbcb72f963264f8300d22", +// "ObjectID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:11" +// }, +// "Index": "0", +// "TV": null +// } +// } +// ], +// "ObjectInfo": { +// "ID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:3", +// "ModTime": "10", +// "OwnerID": "a8ada09dee16d791fd406d629fe29bb0ed084a30:2", +// "RefCount": "1" +// } +// } +// d[a8ada09dee16d791fd406d629fe29bb0ed084a30:5] +// d[a8ada09dee16d791fd406d629fe29bb0ed084a30:6] diff --git a/portal-loop/extracted/p/demo/avlhelpers/avlhelpers.gno b/portal-loop/extracted/p/demo/avlhelpers/avlhelpers.gno new file mode 100644 index 00000000..27842932 --- /dev/null +++ b/portal-loop/extracted/p/demo/avlhelpers/avlhelpers.gno @@ -0,0 +1,41 @@ +package avlhelpers + +import ( + "gno.land/p/demo/avl" +) + +// Iterate the keys in-order starting from the given prefix. +// It calls the provided callback function for each key-value pair encountered. +// If the callback returns true, the iteration is stopped. +// The prefix and keys are treated as byte strings, ignoring possible multi-byte Unicode runes. +func IterateByteStringKeysByPrefix(tree avl.Tree, prefix string, cb avl.IterCbFn) { + end := "" + n := len(prefix) + // To make the end of the search, increment the final character ASCII by one. + for n > 0 { + if ascii := int(prefix[n-1]); ascii < 0xff { + end = prefix[0:n-1] + string(ascii+1) + break + } + + // The last character is 0xff. Try the previous character. + n-- + } + + tree.Iterate(prefix, end, cb) +} + +// Get a list of keys starting from the given prefix. Limit the +// number of results to maxResults. +// The prefix and keys are treated as byte strings, ignoring possible multi-byte Unicode runes. +func ListByteStringKeysByPrefix(tree avl.Tree, prefix string, maxResults int) []string { + result := []string{} + IterateByteStringKeysByPrefix(tree, prefix, func(key string, value interface{}) bool { + result = append(result, key) + if len(result) >= maxResults { + return true + } + return false + }) + return result +} diff --git a/portal-loop/extracted/p/demo/avlhelpers/pkg_metadata.json b/portal-loop/extracted/p/demo/avlhelpers/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/avlhelpers/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/avlhelpers/z_0_filetest.gno b/portal-loop/extracted/p/demo/avlhelpers/z_0_filetest.gno new file mode 100644 index 00000000..1c7873e2 --- /dev/null +++ b/portal-loop/extracted/p/demo/avlhelpers/z_0_filetest.gno @@ -0,0 +1,91 @@ +// PKGPATH: gno.land/r/test +package test + +import ( + "encoding/hex" + + "gno.land/p/demo/avl" + "gno.land/p/demo/avlhelpers" + "gno.land/p/demo/ufmt" +) + +func main() { + tree := avl.Tree{} + + { + // Empty tree. + matches := avlhelpers.ListByteStringKeysByPrefix(tree, "", 10) + println(ufmt.Sprintf("# matches: %d", len(matches))) + } + + tree.Set("alice", "") + tree.Set("andy", "") + tree.Set("bob", "") + + { + // Match only alice. + matches := avlhelpers.ListByteStringKeysByPrefix(tree, "al", 10) + println(ufmt.Sprintf("# matches: %d", len(matches))) + println("match: " + matches[0]) + } + + { + // Match alice and andy. + matches := avlhelpers.ListByteStringKeysByPrefix(tree, "a", 10) + println(ufmt.Sprintf("# matches: %d", len(matches))) + println("match: " + matches[0]) + println("match: " + matches[1]) + } + + { + // Match alice and andy limited to 1. + matches := avlhelpers.ListByteStringKeysByPrefix(tree, "a", 1) + println(ufmt.Sprintf("# matches: %d", len(matches))) + println("match: " + matches[0]) + } + + tree = avl.Tree{} + tree.Set("a\xff", "") + tree.Set("a\xff\xff", "") + tree.Set("b", "") + tree.Set("\xff\xff\x00", "") + + { + // Match only "a\xff\xff". + matches := avlhelpers.ListByteStringKeysByPrefix(tree, "a\xff\xff", 10) + println(ufmt.Sprintf("# matches: %d", len(matches))) + println(ufmt.Sprintf("match: %s", hex.EncodeToString([]byte(matches[0])))) + } + + { + // Match "a\xff" and "a\xff\xff". + matches := avlhelpers.ListByteStringKeysByPrefix(tree, "a\xff", 10) + println(ufmt.Sprintf("# matches: %d", len(matches))) + println(ufmt.Sprintf("match: %s", hex.EncodeToString([]byte(matches[0])))) + println(ufmt.Sprintf("match: %s", hex.EncodeToString([]byte(matches[1])))) + } + + { + // Edge case: Match only "\xff\xff\x00". + matches := avlhelpers.ListByteStringKeysByPrefix(tree, "\xff\xff", 10) + println(ufmt.Sprintf("# matches: %d", len(matches))) + println(ufmt.Sprintf("match: %s", hex.EncodeToString([]byte(matches[0])))) + } +} + +// Output: +// # matches: 0 +// # matches: 1 +// match: alice +// # matches: 2 +// match: alice +// match: andy +// # matches: 1 +// match: alice +// # matches: 1 +// match: 61ffff +// # matches: 2 +// match: 61ff +// match: 61ffff +// # matches: 1 +// match: ffff00 diff --git a/portal-loop/extracted/p/demo/bank/pkg_metadata.json b/portal-loop/extracted/p/demo/bank/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/bank/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/bank/types.gno b/portal-loop/extracted/p/demo/bank/types.gno new file mode 100644 index 00000000..ce63b963 --- /dev/null +++ b/portal-loop/extracted/p/demo/bank/types.gno @@ -0,0 +1,151 @@ +// TODO: this is an example, and needs to be fixed up and tested. + +package bank + +// NOTE: unexposed struct for security. +type order struct { + from Address + to Address + amount Coins + processed bool +} + +// NOTE: unexposed methods for security. +func (ch *order) string() string { + return "TODO" +} + +// Wraps the internal *order for external use. +type Order struct { + *order +} + +// XXX only exposed for demonstration. TODO unexpose, make full demo. +func NewOrder(from Address, to Address, amount Coins) Order { + return Order{ + order: &order{ + from: from, + to: to, + amount: amount, + }, + } +} + +// Panics if error, or already processed. +func (o Order) Execute() { + if o.order.processed { + panic("order already processed") + } + o.order.processed = true + // TODO implemement. +} + +func (o Order) IsZero() bool { + return o.order == nil +} + +func (o Order) From() Address { + return o.order.from +} + +func (o Order) To() Address { + return o.order.to +} + +func (o Order) Amount() Coins { + return o.order.amount +} + +func (o Order) Processed() bool { + return o.order.processed +} + +//---------------------------------------- +// Escrow + +type EscrowTerms struct { + PartyA Address + PartyB Address + AmountA Coins + AmountB Coins +} + +type EscrowContract struct { + EscrowTerms + OrderA Order + OrderB Order +} + +func CreateEscrow(terms EscrowTerms) *EscrowContract { + return &EscrowContract{ + EscrowTerms: terms, + } +} + +func (esc *EscrowContract) SetOrderA(order Order) { + if !esc.OrderA.IsZero() { + panic("order-a already set") + } + if esc.EscrowTerms.PartyA != order.From() { + panic("invalid order-a:from mismatch") + } + if esc.EscrowTerms.PartyB != order.To() { + panic("invalid order-a:to mismatch") + } + if !esc.EscrowTerms.AmountA.Equal(order.Amount()) { + panic("invalid order-a amount") + } + esc.OrderA = order +} + +func (esc *EscrowContract) SetOrderB(order Order) { + if !esc.OrderB.IsZero() { + panic("order-b already set") + } + if esc.EscrowTerms.PartyB != order.From() { + panic("invalid order-b:from mismatch") + } + if esc.EscrowTerms.PartyA != order.To() { + panic("invalid order-b:to mismatch") + } + if !esc.EscrowTerms.AmountB.Equal(order.Amount()) { + panic("invalid order-b amount") + } + esc.OrderA = order +} + +func (esc *EscrowContract) Execute() { + if esc.OrderA.IsZero() { + panic("order-a not yet set") + } + if esc.OrderB.IsZero() { + panic("order-b not yet set") + } + // NOTE: succeeds atomically. + esc.OrderA.Execute() + esc.OrderB.Execute() +} + +//---------------------------------------- +// TODO: actually implement these in std package. + +type ( + Address string + Coins []Coin + Coin struct { + Denom bool + Amount int64 + } +) + +func (a Coins) Equal(b Coins) bool { + if len(a) != len(b) { + return false + } + for i, v := range a { + if v != b[i] { + return false + } + } + return true +} diff --git a/portal-loop/extracted/p/demo/bf/bf.gno b/portal-loop/extracted/p/demo/bf/bf.gno new file mode 100644 index 00000000..83fed343 --- /dev/null +++ b/portal-loop/extracted/p/demo/bf/bf.gno @@ -0,0 +1,74 @@ +package bf + +import ( + "strings" +) + +const maxlen = 30000 + +func Execute(code string) string { + var ( + memory = make([]byte, maxlen) // memory tape + pointer = 0 // initial memory pointer + buf strings.Builder + ) + + // Loop through each character in the code + for i := 0; i < len(code); i++ { + switch code[i] { + case '>': + // Increment memory pointer + pointer++ + if pointer >= maxlen { + pointer = 0 + } + case '<': + // Decrement memory pointer + pointer-- + if pointer < 0 { + pointer = maxlen - 1 + } + case '+': + // Increment the byte at the memory pointer + memory[pointer]++ + case '-': + // Decrement the byte at the memory pointer + memory[pointer]-- + case '.': + // Output the byte at the memory pointer + buf.WriteByte(memory[pointer]) + case ',': + // Input a byte and store it in the memory + panic("unsupported") + // fmt.Scan(&memory[pointer]) + case '[': + // Jump forward past the matching ']' if the byte at the memory pointer is zero + if memory[pointer] == 0 { + braceCount := 1 + for braceCount > 0 { + i++ + if code[i] == '[' { + braceCount++ + } else if code[i] == ']' { + braceCount-- + } + } + } + case ']': + // Jump backward to the matching '[' if the byte at the memory pointer is nonzero + if memory[pointer] != 0 { + braceCount := 1 + for braceCount > 0 { + i-- + if code[i] == ']' { + braceCount++ + } else if code[i] == '[' { + braceCount-- + } + } + i-- // Move back one more to compensate for the upcoming increment in the loop + } + } + } + return buf.String() +} diff --git a/portal-loop/extracted/p/demo/bf/bf_test.gno b/portal-loop/extracted/p/demo/bf/bf_test.gno new file mode 100644 index 00000000..c55ad3a3 --- /dev/null +++ b/portal-loop/extracted/p/demo/bf/bf_test.gno @@ -0,0 +1,32 @@ +package bf + +import "testing" + +func TestExecuteBrainfuck(t *testing.T) { + testCases := []struct { + name string + code string + expected string + }{ + { + name: "hello", + code: "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.", + expected: "Hello World", + }, + { + name: "increment", + code: "+++++ +++++ [ > +++++ ++ < - ] > +++++ .", + expected: "K", + }, + // Add more test cases as needed + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + result := Execute(tc.code) + if result != tc.expected { + t.Errorf("Expected output: %s, but got: %s", tc.expected, result) + } + }) + } +} diff --git a/portal-loop/extracted/p/demo/bf/doc.gno b/portal-loop/extracted/p/demo/bf/doc.gno new file mode 100644 index 00000000..6494b34f --- /dev/null +++ b/portal-loop/extracted/p/demo/bf/doc.gno @@ -0,0 +1,18 @@ +// Package bf implements a minimalist Brainfuck virtual machine in Gno. +// +// Brainfuck is an esoteric programming language known for its simplicity and minimalistic design. +// It operates on an array of memory cells, with a memory pointer that can move left or right. +// The language consists of eight commands: > < + - . , [ ]. +// +// Usage: +// To execute Brainfuck code, use the Execute function and provide the code as a string. +// +// code := "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------." +// output := bf.Execute(code) +// +// Note: +// This implementation is a minimalist version and may not handle all edge cases or advanced features of the Brainfuck language. +// +// Reference: +// For more information on Brainfuck, refer to the Wikipedia page: https://en.wikipedia.org/wiki/Brainfuck +package bf // import "gno.land/p/demo/bf" diff --git a/portal-loop/extracted/p/demo/bf/pkg_metadata.json b/portal-loop/extracted/p/demo/bf/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/bf/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/bf/run.gno b/portal-loop/extracted/p/demo/bf/run.gno new file mode 100644 index 00000000..ebf7cb63 --- /dev/null +++ b/portal-loop/extracted/p/demo/bf/run.gno @@ -0,0 +1,8 @@ +package bf + +// for `gno run` +func main() { + code := "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------." + // TODO: code = os.Args... + Execute(code) +} diff --git a/portal-loop/extracted/p/demo/blog/blog.gno b/portal-loop/extracted/p/demo/blog/blog.gno new file mode 100644 index 00000000..aad2173b --- /dev/null +++ b/portal-loop/extracted/p/demo/blog/blog.gno @@ -0,0 +1,398 @@ +package blog + +import ( + "std" + "strconv" + "strings" + "time" + + "gno.land/p/demo/avl" + "gno.land/p/demo/mux" + "gno.land/p/demo/ufmt" +) + +type Blog struct { + Title string + Prefix string // i.e. r/gnoland/blog: + Posts avl.Tree // slug -> *Post + PostsPublished avl.Tree // published-date -> *Post + PostsAlphabetical avl.Tree // title -> *Post + NoBreadcrumb bool +} + +func (b Blog) RenderLastPostsWidget(limit int) string { + if b.PostsPublished.Size() == 0 { + return "No posts." + } + + output := "" + i := 0 + b.PostsPublished.ReverseIterate("", "", func(key string, value interface{}) bool { + p := value.(*Post) + output += ufmt.Sprintf("- [%s](%s)\n", p.Title, p.URL()) + i++ + return i >= limit + }) + return output +} + +func (b Blog) RenderHome(res *mux.ResponseWriter, req *mux.Request) { + if !b.NoBreadcrumb { + res.Write(breadcrumb([]string{b.Title})) + } + + if b.Posts.Size() == 0 { + res.Write("No posts.") + return + } + + res.Write("
") + b.PostsPublished.ReverseIterate("", "", func(key string, value interface{}) bool { + post := value.(*Post) + res.Write(post.RenderListItem()) + return false + }) + res.Write("
") + + // FIXME: tag list/cloud. +} + +func (b Blog) RenderPost(res *mux.ResponseWriter, req *mux.Request) { + slug := req.GetVar("slug") + + post, found := b.Posts.Get(slug) + if !found { + res.Write("404") + return + } + p := post.(*Post) + + res.Write("
" + "\n\n") + + res.Write("# " + p.Title + "\n\n") + res.Write(p.Body + "\n\n") + res.Write("---\n\n") + + res.Write(p.RenderTagList() + "\n\n") + res.Write(p.RenderAuthorList() + "\n\n") + res.Write(p.RenderPublishData() + "\n\n") + + res.Write("---\n") + res.Write("
Comment section\n\n") + + // comments + p.Comments.ReverseIterate("", "", func(key string, value interface{}) bool { + comment := value.(*Comment) + res.Write(comment.RenderListItem()) + return false + }) + + res.Write("
\n") + res.Write("
") +} + +func (b Blog) RenderTag(res *mux.ResponseWriter, req *mux.Request) { + slug := req.GetVar("slug") + + if slug == "" { + res.Write("404") + return + } + + if !b.NoBreadcrumb { + breadStr := breadcrumb([]string{ + ufmt.Sprintf("[%s](%s)", b.Title, b.Prefix), + "t", + slug, + }) + res.Write(breadStr) + } + + nb := 0 + b.Posts.Iterate("", "", func(key string, value interface{}) bool { + post := value.(*Post) + if !post.HasTag(slug) { + return false + } + res.Write(post.RenderListItem()) + nb++ + return false + }) + if nb == 0 { + res.Write("No posts.") + } +} + +func (b Blog) Render(path string) string { + router := mux.NewRouter() + router.HandleFunc("", b.RenderHome) + router.HandleFunc("p/{slug}", b.RenderPost) + router.HandleFunc("t/{slug}", b.RenderTag) + return router.Render(path) +} + +func (b *Blog) NewPost(publisher std.Address, slug, title, body, pubDate string, authors, tags []string) error { + if _, found := b.Posts.Get(slug); found { + return ErrPostSlugExists + } + + var parsedTime time.Time + var err error + if pubDate != "" { + parsedTime, err = time.Parse(time.RFC3339, pubDate) + if err != nil { + return err + } + } else { + // If no publication date was passed in by caller, take current block time + parsedTime = time.Now() + } + + post := &Post{ + Publisher: publisher, + Authors: authors, + Slug: slug, + Title: title, + Body: body, + Tags: tags, + CreatedAt: parsedTime, + } + + return b.prepareAndSetPost(post, false) +} + +func (b *Blog) prepareAndSetPost(post *Post, edit bool) error { + post.Title = strings.TrimSpace(post.Title) + post.Body = strings.TrimSpace(post.Body) + + if post.Title == "" { + return ErrPostTitleMissing + } + if post.Body == "" { + return ErrPostBodyMissing + } + if post.Slug == "" { + return ErrPostSlugMissing + } + + post.Blog = b + post.UpdatedAt = time.Now() + + trimmedTitleKey := getTitleKey(post.Title) + pubDateKey := getPublishedKey(post.CreatedAt) + + if !edit { + // Cannot have two posts with same title key + if _, found := b.PostsAlphabetical.Get(trimmedTitleKey); found { + return ErrPostTitleExists + } + // Cannot have two posts with *exact* same timestamp + if _, found := b.PostsPublished.Get(pubDateKey); found { + return ErrPostPubDateExists + } + } + + // Store post under keys + b.PostsAlphabetical.Set(trimmedTitleKey, post) + b.PostsPublished.Set(pubDateKey, post) + b.Posts.Set(post.Slug, post) + + return nil +} + +func (b *Blog) RemovePost(slug string) { + p, exists := b.Posts.Get(slug) + if !exists { + panic("post with specified slug doesn't exist") + } + + post := p.(*Post) + + titleKey := getTitleKey(post.Title) + publishedKey := getPublishedKey(post.CreatedAt) + + _, _ = b.Posts.Remove(slug) + _, _ = b.PostsAlphabetical.Remove(titleKey) + _, _ = b.PostsPublished.Remove(publishedKey) +} + +func (b *Blog) GetPost(slug string) *Post { + post, found := b.Posts.Get(slug) + if !found { + return nil + } + return post.(*Post) +} + +type Post struct { + Blog *Blog + Slug string // FIXME: save space? + Title string + Body string + CreatedAt time.Time + UpdatedAt time.Time + Comments avl.Tree + Authors []string + Publisher std.Address + Tags []string + CommentIndex int +} + +func (p *Post) Update(title, body, publicationDate string, authors, tags []string) error { + p.Title = title + p.Body = body + p.Tags = tags + p.Authors = authors + + parsedTime, err := time.Parse(time.RFC3339, publicationDate) + if err != nil { + return err + } + + p.CreatedAt = parsedTime + return p.Blog.prepareAndSetPost(p, true) +} + +func (p *Post) AddComment(author std.Address, comment string) error { + if p == nil { + return ErrNoSuchPost + } + p.CommentIndex++ + commentKey := strconv.Itoa(p.CommentIndex) + comment = strings.TrimSpace(comment) + p.Comments.Set(commentKey, &Comment{ + Post: p, + CreatedAt: time.Now(), + Author: author, + Comment: comment, + }) + + return nil +} + +func (p *Post) DeleteComment(index int) error { + if p == nil { + return ErrNoSuchPost + } + commentKey := strconv.Itoa(index) + p.Comments.Remove(commentKey) + return nil +} + +func (p *Post) HasTag(tag string) bool { + if p == nil { + return false + } + for _, t := range p.Tags { + if t == tag { + return true + } + } + return false +} + +func (p *Post) RenderListItem() string { + if p == nil { + return "error: no such post\n" + } + output := "
\n\n" + output += ufmt.Sprintf("### [%s](%s)\n", p.Title, p.URL()) + // output += ufmt.Sprintf("**[Learn More](%s)**\n\n", p.URL()) + + output += " " + p.CreatedAt.Format("02 Jan 2006") + // output += p.Summary() + "\n\n" + // output += p.RenderTagList() + "\n\n" + output += "\n" + output += "
" + return output +} + +// Render post tags +func (p *Post) RenderTagList() string { + if p == nil { + return "error: no such post\n" + } + if len(p.Tags) == 0 { + return "" + } + + output := "Tags: " + for idx, tag := range p.Tags { + if idx > 0 { + output += " " + } + tagURL := p.Blog.Prefix + "t/" + tag + output += ufmt.Sprintf("[#%s](%s)", tag, tagURL) + + } + return output +} + +// Render authors if there are any +func (p *Post) RenderAuthorList() string { + out := "Written" + if len(p.Authors) != 0 { + out += " by " + + for idx, author := range p.Authors { + out += author + if idx < len(p.Authors)-1 { + out += ", " + } + } + } + out += " on " + p.CreatedAt.Format("02 Jan 2006") + + return out +} + +func (p *Post) RenderPublishData() string { + out := "Published " + if p.Publisher != "" { + out += "by " + p.Publisher.String() + " " + } + out += "to " + p.Blog.Title + + return out +} + +func (p *Post) URL() string { + if p == nil { + return p.Blog.Prefix + "404" + } + return p.Blog.Prefix + "p/" + p.Slug +} + +func (p *Post) Summary() string { + if p == nil { + return "error: no such post\n" + } + + // FIXME: better summary. + lines := strings.Split(p.Body, "\n") + if len(lines) <= 3 { + return p.Body + } + return strings.Join(lines[0:3], "\n") + "..." +} + +type Comment struct { + Post *Post + CreatedAt time.Time + Author std.Address + Comment string +} + +func (c Comment) RenderListItem() string { + output := "
" + output += c.Comment + "\n\n" + output += "
" + + output += "
" + output += ufmt.Sprintf("by %s on %s", c.Author, c.CreatedAt.Format(time.RFC822)) + output += "
\n\n" + + output += "---\n\n" + + return output +} diff --git a/portal-loop/extracted/p/demo/blog/blog_test.gno b/portal-loop/extracted/p/demo/blog/blog_test.gno new file mode 100644 index 00000000..b9898814 --- /dev/null +++ b/portal-loop/extracted/p/demo/blog/blog_test.gno @@ -0,0 +1,4 @@ +package blog + +// TODO: add generic tests here. +// right now, you can checkout r/gnoland/blog/*_test.gno. diff --git a/portal-loop/extracted/p/demo/blog/errors.gno b/portal-loop/extracted/p/demo/blog/errors.gno new file mode 100644 index 00000000..9d885d72 --- /dev/null +++ b/portal-loop/extracted/p/demo/blog/errors.gno @@ -0,0 +1,13 @@ +package blog + +import "errors" + +var ( + ErrPostTitleMissing = errors.New("post title is missing") + ErrPostSlugMissing = errors.New("post slug is missing") + ErrPostBodyMissing = errors.New("post body is missing") + ErrPostSlugExists = errors.New("post with specified slug already exists") + ErrPostPubDateExists = errors.New("post with specified publication date exists") + ErrPostTitleExists = errors.New("post with specified title already exists") + ErrNoSuchPost = errors.New("no such post") +) diff --git a/portal-loop/extracted/p/demo/blog/pkg_metadata.json b/portal-loop/extracted/p/demo/blog/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/blog/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/blog/util.gno b/portal-loop/extracted/p/demo/blog/util.gno new file mode 100644 index 00000000..99b59772 --- /dev/null +++ b/portal-loop/extracted/p/demo/blog/util.gno @@ -0,0 +1,18 @@ +package blog + +import ( + "strings" + "time" +) + +func breadcrumb(parts []string) string { + return "# " + strings.Join(parts, " / ") + "\n\n" +} + +func getTitleKey(title string) string { + return strings.Replace(title, " ", "", -1) +} + +func getPublishedKey(t time.Time) string { + return t.Format(time.RFC3339) +} diff --git a/portal-loop/extracted/p/demo/cford32/LICENSE b/portal-loop/extracted/p/demo/cford32/LICENSE new file mode 100644 index 00000000..6a66aea5 --- /dev/null +++ b/portal-loop/extracted/p/demo/cford32/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2009 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/portal-loop/extracted/p/demo/cford32/README.md b/portal-loop/extracted/p/demo/cford32/README.md new file mode 100644 index 00000000..f74a7f58 --- /dev/null +++ b/portal-loop/extracted/p/demo/cford32/README.md @@ -0,0 +1,76 @@ +# cford32 + +``` +package cford32 // import "gno.land/p/demo/cford32" + +Package cford32 implements a base32-like encoding/decoding package, with the +encoding scheme specified by Douglas Crockford. + +From the website, the requirements of said encoding scheme are to: + + - Be human readable and machine readable. + - Be compact. Humans have difficulty in manipulating long strings of arbitrary + symbols. + - Be error resistant. Entering the symbols must not require keyboarding + gymnastics. + - Be pronounceable. Humans should be able to accurately transmit the symbols + to other humans using a telephone. + +This is slightly different from a simple difference in encoding table from +the Go's stdlib `encoding/base32`, as when decoding the characters i I l L are +parsed as 1, and o O is parsed as 0. + +This package additionally provides ways to encode uint64's efficiently, as well +as efficient encoding to a lowercase variation of the encoding. The encodings +never use paddings. + +# Uint64 Encoding + +Aside from lower/uppercase encoding, there is a compact encoding, allowing to +encode all values in [0,2^34), and the full encoding, allowing all values in +[0,2^64). The compact encoding uses 7 characters, and the full encoding uses 13 +characters. Both are parsed unambiguously by the Uint64 decoder. + +The compact encodings have the first character between ['0','f'], while the +full encoding's first character ranges between ['g','z']. Practically, in your +usage of the package, you should consider which one to use and stick with it, +while considering that the compact encoding, once it reaches 2^34, automatically +switches to the full encoding. The properties of the generated strings are still +maintained: for instance, any two encoded uint64s x,y consistently generated +with the compact encoding, if the numeric value is x < y, will also be x < y in +lexical ordering. However, values [0,2^34) have a "double encoding", which if +mixed together lose the lexical ordering property. + +The Uint64 encoding is most useful for generating string versions of Uint64 IDs. +Practically, it allows you to retain sleek and compact IDs for your application +for the first 2^34 (>17 billion) entities, while seamlessly rolling over to the +full encoding should you exceed that. You are encouraged to use it unless you +have a requirement or preferences for IDs consistently being always the same +size. + +To use the cford32 encoding for IDs, you may want to consider using package +gno.land/p/demo/seqid. + +[specified by Douglas Crockford]: https://www.crockford.com/base32.html + +func AppendCompact(id uint64, b []byte) []byte +func AppendDecode(dst, src []byte) ([]byte, error) +func AppendEncode(dst, src []byte) []byte +func AppendEncodeLower(dst, src []byte) []byte +func Decode(dst, src []byte) (n int, err error) +func DecodeString(s string) ([]byte, error) +func DecodedLen(n int) int +func Encode(dst, src []byte) +func EncodeLower(dst, src []byte) +func EncodeToString(src []byte) string +func EncodeToStringLower(src []byte) string +func EncodedLen(n int) int +func NewDecoder(r io.Reader) io.Reader +func NewEncoder(w io.Writer) io.WriteCloser +func NewEncoderLower(w io.Writer) io.WriteCloser +func PutCompact(id uint64) []byte +func PutUint64(id uint64) [13]byte +func PutUint64Lower(id uint64) [13]byte +func Uint64(b []byte) (uint64, error) +type CorruptInputError int64 +``` diff --git a/portal-loop/extracted/p/demo/cford32/cford32.gno b/portal-loop/extracted/p/demo/cford32/cford32.gno new file mode 100644 index 00000000..52d66db4 --- /dev/null +++ b/portal-loop/extracted/p/demo/cford32/cford32.gno @@ -0,0 +1,700 @@ +// Modified from the Go Source code for encoding/base32. +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package cford32 implements a base32-like encoding/decoding package, with the +// encoding scheme [specified by Douglas Crockford]. +// +// From the website, the requirements of said encoding scheme are to: +// +// - Be human readable and machine readable. +// - Be compact. Humans have difficulty in manipulating long strings of arbitrary symbols. +// - Be error resistant. Entering the symbols must not require keyboarding gymnastics. +// - Be pronounceable. Humans should be able to accurately transmit the symbols to other humans using a telephone. +// +// This is slightly different from a simple difference in encoding table from +// the Go's stdlib `encoding/base32`, as when decoding the characters i I l L are +// parsed as 1, and o O is parsed as 0. +// +// This package additionally provides ways to encode uint64's efficiently, +// as well as efficient encoding to a lowercase variation of the encoding. +// The encodings never use paddings. +// +// # Uint64 Encoding +// +// Aside from lower/uppercase encoding, there is a compact encoding, allowing +// to encode all values in [0,2^34), and the full encoding, allowing all +// values in [0,2^64). The compact encoding uses 7 characters, and the full +// encoding uses 13 characters. Both are parsed unambiguously by the Uint64 +// decoder. +// +// The compact encodings have the first character between ['0','f'], while the +// full encoding's first character ranges between ['g','z']. Practically, in +// your usage of the package, you should consider which one to use and stick +// with it, while considering that the compact encoding, once it reaches 2^34, +// automatically switches to the full encoding. The properties of the generated +// strings are still maintained: for instance, any two encoded uint64s x,y +// consistently generated with the compact encoding, if the numeric value is +// x < y, will also be x < y in lexical ordering. However, values [0,2^34) have a +// "double encoding", which if mixed together lose the lexical ordering property. +// +// The Uint64 encoding is most useful for generating string versions of Uint64 +// IDs. Practically, it allows you to retain sleek and compact IDs for your +// application for the first 2^34 (>17 billion) entities, while seamlessly +// rolling over to the full encoding should you exceed that. You are encouraged +// to use it unless you have a requirement or preferences for IDs consistently +// being always the same size. +// +// To use the cford32 encoding for IDs, you may want to consider using package +// [gno.land/p/demo/seqid]. +// +// [specified by Douglas Crockford]: https://www.crockford.com/base32.html +package cford32 + +import ( + "io" + "strconv" +) + +const ( + encTable = "0123456789ABCDEFGHJKMNPQRSTVWXYZ" + encTableLower = "0123456789abcdefghjkmnpqrstvwxyz" + + // each line is 16 bytes + decTable = "" + + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" + // 00-0f + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" + // 10-1f + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" + // 20-2f + "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\xff\xff\xff\xff\xff\xff" + // 30-3f + "\xff\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x01\x12\x13\x01\x14\x15\x00" + // 40-4f + "\x16\x17\x18\x19\x1a\xff\x1b\x1c\x1d\x1e\x1f\xff\xff\xff\xff\xff" + // 50-5f + "\xff\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x01\x12\x13\x01\x14\x15\x00" + // 60-6f + "\x16\x17\x18\x19\x1a\xff\x1b\x1c\x1d\x1e\x1f\xff\xff\xff\xff\xff" + // 70-7f + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" + // 80-ff (not ASCII) + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" + + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" + + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" + + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" + + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" + + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" + + "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" +) + +// CorruptInputError is returned by parsing functions when an invalid character +// in the input is found. The integer value represents the byte index where +// the error occurred. +// +// This is typically because the given character does not exist in the encoding. +type CorruptInputError int64 + +func (e CorruptInputError) Error() string { + return "illegal cford32 data at input byte " + strconv.FormatInt(int64(e), 10) +} + +// Uint64 parses a cford32-encoded byte slice into a uint64. +// +// - The parser requires all provided character to be valid cford32 characters. +// - The parser disregards case. +// - If the first character is '0' <= c <= 'f', then the passed value is assumed +// encoded in the compact encoding, and must be 7 characters long. +// - If the first character is 'g' <= c <= 'z', then the passed value is +// assumed encoded in the full encoding, and must be 13 characters long. +// +// If any of these requirements fail, a CorruptInputError will be returned. +func Uint64(b []byte) (uint64, error) { + switch { + default: + return 0, CorruptInputError(0) + case len(b) == 7 && b[0] >= '0' && b[0] <= 'f': + decVals := [7]byte{ + decTable[b[0]], + decTable[b[1]], + decTable[b[2]], + decTable[b[3]], + decTable[b[4]], + decTable[b[5]], + decTable[b[6]], + } + for idx, v := range decVals { + if v >= 32 { + return 0, CorruptInputError(idx) + } + } + + return 0 + + uint64(decVals[0])<<30 | + uint64(decVals[1])<<25 | + uint64(decVals[2])<<20 | + uint64(decVals[3])<<15 | + uint64(decVals[4])<<10 | + uint64(decVals[5])<<5 | + uint64(decVals[6]), nil + case len(b) == 13 && b[0] >= 'g' && b[0] <= 'z': + decVals := [13]byte{ + decTable[b[0]] & 0x0F, // disregard high bit + decTable[b[1]], + decTable[b[2]], + decTable[b[3]], + decTable[b[4]], + decTable[b[5]], + decTable[b[6]], + decTable[b[7]], + decTable[b[8]], + decTable[b[9]], + decTable[b[10]], + decTable[b[11]], + decTable[b[12]], + } + for idx, v := range decVals { + if v >= 32 { + return 0, CorruptInputError(idx) + } + } + + return 0 + + uint64(decVals[0])<<60 | + uint64(decVals[1])<<55 | + uint64(decVals[2])<<50 | + uint64(decVals[3])<<45 | + uint64(decVals[4])<<40 | + uint64(decVals[5])<<35 | + uint64(decVals[6])<<30 | + uint64(decVals[7])<<25 | + uint64(decVals[8])<<20 | + uint64(decVals[9])<<15 | + uint64(decVals[10])<<10 | + uint64(decVals[11])<<5 | + uint64(decVals[12]), nil + } +} + +const mask = 31 + +// PutUint64 returns a cford32-encoded byte slice. +func PutUint64(id uint64) [13]byte { + return [13]byte{ + encTable[id>>60&mask|0x10], // specify full encoding + encTable[id>>55&mask], + encTable[id>>50&mask], + encTable[id>>45&mask], + encTable[id>>40&mask], + encTable[id>>35&mask], + encTable[id>>30&mask], + encTable[id>>25&mask], + encTable[id>>20&mask], + encTable[id>>15&mask], + encTable[id>>10&mask], + encTable[id>>5&mask], + encTable[id&mask], + } +} + +// PutUint64Lower returns a cford32-encoded byte array, swapping uppercase +// letters with lowercase. +// +// For more information on how the value is encoded, see [Uint64]. +func PutUint64Lower(id uint64) [13]byte { + return [13]byte{ + encTableLower[id>>60&mask|0x10], + encTableLower[id>>55&mask], + encTableLower[id>>50&mask], + encTableLower[id>>45&mask], + encTableLower[id>>40&mask], + encTableLower[id>>35&mask], + encTableLower[id>>30&mask], + encTableLower[id>>25&mask], + encTableLower[id>>20&mask], + encTableLower[id>>15&mask], + encTableLower[id>>10&mask], + encTableLower[id>>5&mask], + encTableLower[id&mask], + } +} + +// PutCompact returns a cford32-encoded byte slice, using the compact +// representation of cford32 described in the package documentation where +// possible (all values of id < 1<<34). The lowercase encoding is used. +// +// The resulting byte slice will be 7 bytes long for all compact values, +// and 13 bytes long for +func PutCompact(id uint64) []byte { + return AppendCompact(id, nil) +} + +// AppendCompact works like [PutCompact] but appends to the given byte slice +// instead of allocating one anew. +func AppendCompact(id uint64, b []byte) []byte { + const maxCompact = 1 << 34 + if id < maxCompact { + return append(b, + encTableLower[id>>30&mask], + encTableLower[id>>25&mask], + encTableLower[id>>20&mask], + encTableLower[id>>15&mask], + encTableLower[id>>10&mask], + encTableLower[id>>5&mask], + encTableLower[id&mask], + ) + } + return append(b, + encTableLower[id>>60&mask|0x10], + encTableLower[id>>55&mask], + encTableLower[id>>50&mask], + encTableLower[id>>45&mask], + encTableLower[id>>40&mask], + encTableLower[id>>35&mask], + encTableLower[id>>30&mask], + encTableLower[id>>25&mask], + encTableLower[id>>20&mask], + encTableLower[id>>15&mask], + encTableLower[id>>10&mask], + encTableLower[id>>5&mask], + encTableLower[id&mask], + ) +} + +func DecodedLen(n int) int { + return n/8*5 + n%8*5/8 +} + +func EncodedLen(n int) int { + return n/5*8 + (n%5*8+4)/5 +} + +// Encode encodes src using the encoding enc, +// writing [EncodedLen](len(src)) bytes to dst. +// +// The encoding does not contain any padding, unlike Go's base32. +func Encode(dst, src []byte) { + // Copied from encoding/base32/base32.go (go1.22) + if len(src) == 0 { + return + } + + di, si := 0, 0 + n := (len(src) / 5) * 5 + for si < n { + // Combining two 32 bit loads allows the same code to be used + // for 32 and 64 bit platforms. + hi := uint32(src[si+0])<<24 | uint32(src[si+1])<<16 | uint32(src[si+2])<<8 | uint32(src[si+3]) + lo := hi<<8 | uint32(src[si+4]) + + dst[di+0] = encTable[(hi>>27)&0x1F] + dst[di+1] = encTable[(hi>>22)&0x1F] + dst[di+2] = encTable[(hi>>17)&0x1F] + dst[di+3] = encTable[(hi>>12)&0x1F] + dst[di+4] = encTable[(hi>>7)&0x1F] + dst[di+5] = encTable[(hi>>2)&0x1F] + dst[di+6] = encTable[(lo>>5)&0x1F] + dst[di+7] = encTable[(lo)&0x1F] + + si += 5 + di += 8 + } + + // Add the remaining small block + remain := len(src) - si + if remain == 0 { + return + } + + // Encode the remaining bytes in reverse order. + val := uint32(0) + switch remain { + case 4: + val |= uint32(src[si+3]) + dst[di+6] = encTable[val<<3&0x1F] + dst[di+5] = encTable[val>>2&0x1F] + fallthrough + case 3: + val |= uint32(src[si+2]) << 8 + dst[di+4] = encTable[val>>7&0x1F] + fallthrough + case 2: + val |= uint32(src[si+1]) << 16 + dst[di+3] = encTable[val>>12&0x1F] + dst[di+2] = encTable[val>>17&0x1F] + fallthrough + case 1: + val |= uint32(src[si+0]) << 24 + dst[di+1] = encTable[val>>22&0x1F] + dst[di+0] = encTable[val>>27&0x1F] + } +} + +// EncodeLower is like [Encode], but uses the lowercase +func EncodeLower(dst, src []byte) { + // Copied from encoding/base32/base32.go (go1.22) + if len(src) == 0 { + return + } + + di, si := 0, 0 + n := (len(src) / 5) * 5 + for si < n { + // Combining two 32 bit loads allows the same code to be used + // for 32 and 64 bit platforms. + hi := uint32(src[si+0])<<24 | uint32(src[si+1])<<16 | uint32(src[si+2])<<8 | uint32(src[si+3]) + lo := hi<<8 | uint32(src[si+4]) + + dst[di+0] = encTableLower[(hi>>27)&0x1F] + dst[di+1] = encTableLower[(hi>>22)&0x1F] + dst[di+2] = encTableLower[(hi>>17)&0x1F] + dst[di+3] = encTableLower[(hi>>12)&0x1F] + dst[di+4] = encTableLower[(hi>>7)&0x1F] + dst[di+5] = encTableLower[(hi>>2)&0x1F] + dst[di+6] = encTableLower[(lo>>5)&0x1F] + dst[di+7] = encTableLower[(lo)&0x1F] + + si += 5 + di += 8 + } + + // Add the remaining small block + remain := len(src) - si + if remain == 0 { + return + } + + // Encode the remaining bytes in reverse order. + val := uint32(0) + switch remain { + case 4: + val |= uint32(src[si+3]) + dst[di+6] = encTableLower[val<<3&0x1F] + dst[di+5] = encTableLower[val>>2&0x1F] + fallthrough + case 3: + val |= uint32(src[si+2]) << 8 + dst[di+4] = encTableLower[val>>7&0x1F] + fallthrough + case 2: + val |= uint32(src[si+1]) << 16 + dst[di+3] = encTableLower[val>>12&0x1F] + dst[di+2] = encTableLower[val>>17&0x1F] + fallthrough + case 1: + val |= uint32(src[si+0]) << 24 + dst[di+1] = encTableLower[val>>22&0x1F] + dst[di+0] = encTableLower[val>>27&0x1F] + } +} + +// AppendEncode appends the cford32 encoded src to dst +// and returns the extended buffer. +func AppendEncode(dst, src []byte) []byte { + n := EncodedLen(len(src)) + dst = grow(dst, n) + Encode(dst[len(dst):][:n], src) + return dst[:len(dst)+n] +} + +// AppendEncodeLower appends the lowercase cford32 encoded src to dst +// and returns the extended buffer. +func AppendEncodeLower(dst, src []byte) []byte { + n := EncodedLen(len(src)) + dst = grow(dst, n) + EncodeLower(dst[len(dst):][:n], src) + return dst[:len(dst)+n] +} + +func grow(s []byte, n int) []byte { + // slices.Grow + if n -= cap(s) - len(s); n > 0 { + news := make([]byte, cap(s)+n) + copy(news[:cap(s)], s[:cap(s)]) + return news[:len(s)] + } + return s +} + +// EncodeToString returns the cford32 encoding of src. +func EncodeToString(src []byte) string { + buf := make([]byte, EncodedLen(len(src))) + Encode(buf, src) + return string(buf) +} + +// EncodeToStringLower returns the cford32 lowercase encoding of src. +func EncodeToStringLower(src []byte) string { + buf := make([]byte, EncodedLen(len(src))) + EncodeLower(buf, src) + return string(buf) +} + +func decode(dst, src []byte) (n int, err error) { + dsti := 0 + olen := len(src) + + for len(src) > 0 { + // Decode quantum using the base32 alphabet + var dbuf [8]byte + dlen := 8 + + for j := 0; j < 8; { + if len(src) == 0 { + // We have reached the end and are not expecting any padding + dlen = j + break + } + in := src[0] + src = src[1:] + dbuf[j] = decTable[in] + if dbuf[j] == 0xFF { + return n, CorruptInputError(olen - len(src) - 1) + } + j++ + } + + // Pack 8x 5-bit source blocks into 5 byte destination + // quantum + switch dlen { + case 8: + dst[dsti+4] = dbuf[6]<<5 | dbuf[7] + n++ + fallthrough + case 7: + dst[dsti+3] = dbuf[4]<<7 | dbuf[5]<<2 | dbuf[6]>>3 + n++ + fallthrough + case 5: + dst[dsti+2] = dbuf[3]<<4 | dbuf[4]>>1 + n++ + fallthrough + case 4: + dst[dsti+1] = dbuf[1]<<6 | dbuf[2]<<1 | dbuf[3]>>4 + n++ + fallthrough + case 2: + dst[dsti+0] = dbuf[0]<<3 | dbuf[1]>>2 + n++ + } + dsti += 5 + } + return n, nil +} + +type encoder struct { + err error + w io.Writer + enc func(dst, src []byte) + buf [5]byte // buffered data waiting to be encoded + nbuf int // number of bytes in buf + out [1024]byte // output buffer +} + +func NewEncoder(w io.Writer) io.WriteCloser { + return &encoder{w: w, enc: Encode} +} + +func NewEncoderLower(w io.Writer) io.WriteCloser { + return &encoder{w: w, enc: EncodeLower} +} + +func (e *encoder) Write(p []byte) (n int, err error) { + if e.err != nil { + return 0, e.err + } + + // Leading fringe. + if e.nbuf > 0 { + var i int + for i = 0; i < len(p) && e.nbuf < 5; i++ { + e.buf[e.nbuf] = p[i] + e.nbuf++ + } + n += i + p = p[i:] + if e.nbuf < 5 { + return + } + e.enc(e.out[0:], e.buf[0:]) + if _, e.err = e.w.Write(e.out[0:8]); e.err != nil { + return n, e.err + } + e.nbuf = 0 + } + + // Large interior chunks. + for len(p) >= 5 { + nn := len(e.out) / 8 * 5 + if nn > len(p) { + nn = len(p) + nn -= nn % 5 + } + e.enc(e.out[0:], p[0:nn]) + if _, e.err = e.w.Write(e.out[0 : nn/5*8]); e.err != nil { + return n, e.err + } + n += nn + p = p[nn:] + } + + // Trailing fringe. + copy(e.buf[:], p) + e.nbuf = len(p) + n += len(p) + return +} + +// Close flushes any pending output from the encoder. +// It is an error to call Write after calling Close. +func (e *encoder) Close() error { + // If there's anything left in the buffer, flush it out + if e.err == nil && e.nbuf > 0 { + e.enc(e.out[0:], e.buf[0:e.nbuf]) + encodedLen := EncodedLen(e.nbuf) + e.nbuf = 0 + _, e.err = e.w.Write(e.out[0:encodedLen]) + } + return e.err +} + +// Decode decodes src using cford32. It writes at most +// [DecodedLen](len(src)) bytes to dst and returns the number of bytes +// written. If src contains invalid cford32 data, it will return the +// number of bytes successfully written and [CorruptInputError]. +// Newline characters (\r and \n) are ignored. +func Decode(dst, src []byte) (n int, err error) { + buf := make([]byte, len(src)) + l := stripNewlines(buf, src) + return decode(dst, buf[:l]) +} + +// AppendDecode appends the cford32 decoded src to dst +// and returns the extended buffer. +// If the input is malformed, it returns the partially decoded src and an error. +func AppendDecode(dst, src []byte) ([]byte, error) { + n := DecodedLen(len(src)) + + dst = grow(dst, n) + dstsl := dst[len(dst) : len(dst)+n] + n, err := Decode(dstsl, src) + return dst[:len(dst)+n], err +} + +// DecodeString returns the bytes represented by the cford32 string s. +func DecodeString(s string) ([]byte, error) { + buf := []byte(s) + l := stripNewlines(buf, buf) + n, err := decode(buf, buf[:l]) + return buf[:n], err +} + +// stripNewlines removes newline characters and returns the number +// of non-newline characters copied to dst. +func stripNewlines(dst, src []byte) int { + offset := 0 + for _, b := range src { + if b == '\r' || b == '\n' { + continue + } + dst[offset] = b + offset++ + } + return offset +} + +type decoder struct { + err error + r io.Reader + buf [1024]byte // leftover input + nbuf int + out []byte // leftover decoded output + outbuf [1024 / 8 * 5]byte +} + +// NewDecoder constructs a new base32 stream decoder. +func NewDecoder(r io.Reader) io.Reader { + return &decoder{r: &newlineFilteringReader{r}} +} + +func readEncodedData(r io.Reader, buf []byte) (n int, err error) { + for n < 1 && err == nil { + var nn int + nn, err = r.Read(buf[n:]) + n += nn + } + return +} + +func (d *decoder) Read(p []byte) (n int, err error) { + // Use leftover decoded output from last read. + if len(d.out) > 0 { + n = copy(p, d.out) + d.out = d.out[n:] + if len(d.out) == 0 { + return n, d.err + } + return n, nil + } + + if d.err != nil { + return 0, d.err + } + + // Read nn bytes from input, bounded [8,len(d.buf)] + nn := (len(p)/5 + 1) * 8 + if nn > len(d.buf) { + nn = len(d.buf) + } + + nn, d.err = readEncodedData(d.r, d.buf[d.nbuf:nn]) + d.nbuf += nn + if d.nbuf < 1 { + return 0, d.err + } + + // Decode chunk into p, or d.out and then p if p is too small. + nr := d.nbuf + if d.err != io.EOF && nr%8 != 0 { + nr -= nr % 8 + } + nw := DecodedLen(d.nbuf) + + if nw > len(p) { + nw, err = decode(d.outbuf[0:], d.buf[0:nr]) + d.out = d.outbuf[0:nw] + n = copy(p, d.out) + d.out = d.out[n:] + } else { + n, err = decode(p, d.buf[0:nr]) + } + d.nbuf -= nr + for i := 0; i < d.nbuf; i++ { + d.buf[i] = d.buf[i+nr] + } + + if err != nil && (d.err == nil || d.err == io.EOF) { + d.err = err + } + + if len(d.out) > 0 { + // We cannot return all the decoded bytes to the caller in this + // invocation of Read, so we return a nil error to ensure that Read + // will be called again. The error stored in d.err, if any, will be + // returned with the last set of decoded bytes. + return n, nil + } + + return n, d.err +} + +type newlineFilteringReader struct { + wrapped io.Reader +} + +func (r *newlineFilteringReader) Read(p []byte) (int, error) { + n, err := r.wrapped.Read(p) + for n > 0 { + s := p[0:n] + offset := stripNewlines(s, s) + if err != nil || offset > 0 { + return offset, err + } + // Previous buffer entirely whitespace, read again + n, err = r.wrapped.Read(p) + } + return n, err +} diff --git a/portal-loop/extracted/p/demo/cford32/cford32_test.gno b/portal-loop/extracted/p/demo/cford32/cford32_test.gno new file mode 100644 index 00000000..6f269c1b --- /dev/null +++ b/portal-loop/extracted/p/demo/cford32/cford32_test.gno @@ -0,0 +1,630 @@ +package cford32 + +import ( + "bytes" + "errors" + "fmt" + "io" + "math" + "strings" + "testing" +) + +func TestCompactRoundtrip(t *testing.T) { + buf := make([]byte, 13) + prev := make([]byte, 13) + for i := uint64(0); i < (1 << 12); i++ { + res := AppendCompact(i, buf[:0]) + back, err := Uint64(res) + testEqual(t, "Uint64(%q) = (%d, %v), want %v", string(res), back, err, nil) + testEqual(t, "Uint64(%q) = %d, want %v", string(res), back, i) + + testEqual(t, "bytes.Compare(prev, res) = %d, want %d", bytes.Compare(prev, res), -1) + prev, buf = res, prev + } + for i := uint64(1<<34 - 1024); i < (1<<34 + 1024); i++ { + res := AppendCompact(i, buf[:0]) + back, err := Uint64(res) + // println(string(res)) + testEqual(t, "Uint64(%q) = (%d, %v), want %v", string(res), back, err, nil) + testEqual(t, "Uint64(%q) = %d, want %v", string(res), back, i) + + testEqual(t, "bytes.Compare(prev, res) = %d, want %d", bytes.Compare(prev, res), -1) + prev, buf = res, prev + } + for i := uint64(1<<64 - 5000); i != 0; i++ { + res := AppendCompact(i, buf[:0]) + back, err := Uint64(res) + testEqual(t, "Uint64(%q) = (%d, %v), want %v", string(res), back, err, nil) + testEqual(t, "Uint64(%q) = %d, want %v", string(res), back, i) + + testEqual(t, "bytes.Compare(prev, res) = %d, want %d", bytes.Compare(prev, res), -1) + prev, buf = res, prev + } +} + +func BenchmarkCompact(b *testing.B) { + buf := make([]byte, 13) + for i := 0; i < b.N; i++ { + _ = AppendCompact(uint64(i), buf[:0]) + } +} + +type testpair struct { + decoded, encoded string +} + +var pairs = []testpair{ + {"", ""}, + {"f", "CR"}, + {"fo", "CSQG"}, + {"foo", "CSQPY"}, + {"foob", "CSQPYRG"}, + {"fooba", "CSQPYRK1"}, + {"foobar", "CSQPYRK1E8"}, + + {"sure.", "EDTQ4S9E"}, + {"sure", "EDTQ4S8"}, + {"sur", "EDTQ4"}, + {"su", "EDTG"}, + {"leasure.", "DHJP2WVNE9JJW"}, + {"easure.", "CNGQ6XBJCMQ0"}, + {"asure.", "C5SQAWK55R"}, +} + +var bigtest = testpair{ + "Twas brillig, and the slithy toves", + "AHVP2WS0C9S6JV3CD5KJR831DSJ20X38CMG76V39EHM7J83MDXV6AWR", +} + +func testEqual(t *testing.T, msg string, args ...interface{}) bool { + t.Helper() + if args[len(args)-2] != args[len(args)-1] { + t.Errorf(msg, args...) + return false + } + return true +} + +func TestEncode(t *testing.T) { + for _, p := range pairs { + got := EncodeToString([]byte(p.decoded)) + testEqual(t, "Encode(%q) = %q, want %q", p.decoded, got, p.encoded) + dst := AppendEncode([]byte("lead"), []byte(p.decoded)) + testEqual(t, `AppendEncode("lead", %q) = %q, want %q`, p.decoded, string(dst), "lead"+p.encoded) + } +} + +func TestEncoder(t *testing.T) { + for _, p := range pairs { + bb := &strings.Builder{} + encoder := NewEncoder(bb) + encoder.Write([]byte(p.decoded)) + encoder.Close() + testEqual(t, "Encode(%q) = %q, want %q", p.decoded, bb.String(), p.encoded) + } +} + +func TestEncoderBuffering(t *testing.T) { + input := []byte(bigtest.decoded) + for bs := 1; bs <= 12; bs++ { + bb := &strings.Builder{} + encoder := NewEncoder(bb) + for pos := 0; pos < len(input); pos += bs { + end := pos + bs + if end > len(input) { + end = len(input) + } + n, err := encoder.Write(input[pos:end]) + testEqual(t, "Write(%q) gave error %v, want %v", input[pos:end], err, error(nil)) + testEqual(t, "Write(%q) gave length %v, want %v", input[pos:end], n, end-pos) + } + err := encoder.Close() + testEqual(t, "Close gave error %v, want %v", err, error(nil)) + testEqual(t, "Encoding/%d of %q = %q, want %q", bs, bigtest.decoded, bb.String(), bigtest.encoded) + } +} + +func TestDecode(t *testing.T) { + for _, p := range pairs { + dbuf := make([]byte, DecodedLen(len(p.encoded))) + count, err := decode(dbuf, []byte(p.encoded)) + testEqual(t, "Decode(%q) = error %v, want %v", p.encoded, err, error(nil)) + testEqual(t, "Decode(%q) = length %v, want %v", p.encoded, count, len(p.decoded)) + testEqual(t, "Decode(%q) = %q, want %q", p.encoded, string(dbuf[0:count]), p.decoded) + + dbuf, err = DecodeString(p.encoded) + testEqual(t, "DecodeString(%q) = error %v, want %v", p.encoded, err, error(nil)) + testEqual(t, "DecodeString(%q) = %q, want %q", p.encoded, string(dbuf), p.decoded) + + // XXX: https://github.com/gnolang/gno/issues/1570 + dst, err := AppendDecode(append([]byte(nil), []byte("lead")...), []byte(p.encoded)) + testEqual(t, "AppendDecode(%q) = error %v, want %v", p.encoded, err, error(nil)) + testEqual(t, `AppendDecode("lead", %q) = %q, want %q`, p.encoded, string(dst), "lead"+p.decoded) + + dst2, err := AppendDecode(dst[:0:len(p.decoded)], []byte(p.encoded)) + testEqual(t, "AppendDecode(%q) = error %v, want %v", p.encoded, err, error(nil)) + testEqual(t, `AppendDecode("", %q) = %q, want %q`, p.encoded, string(dst2), p.decoded) + // XXX: https://github.com/gnolang/gno/issues/1569 + // old used &dst2[0] != &dst[0] as a check. + if len(dst) > 0 && len(dst2) > 0 && cap(dst2) != len(p.decoded) { + t.Errorf("unexpected capacity growth: got %d, want %d", cap(dst2), len(p.decoded)) + } + } +} + +// A minimal variation on strings.Reader. +// Here, we return a io.EOF immediately on Read if the read has reached the end +// of the reader. It's used to simplify TestDecoder. +type stringReader struct { + s string + i int64 +} + +func (r *stringReader) Read(b []byte) (n int, err error) { + if r.i >= int64(len(r.s)) { + return 0, io.EOF + } + n = copy(b, r.s[r.i:]) + r.i += int64(n) + if r.i >= int64(len(r.s)) { + return n, io.EOF + } + return +} + +func TestDecoder(t *testing.T) { + for _, p := range pairs { + decoder := NewDecoder(&stringReader{p.encoded, 0}) + dbuf := make([]byte, DecodedLen(len(p.encoded))) + count, err := decoder.Read(dbuf) + if err != nil && err != io.EOF { + t.Fatal("Read failed", err) + } + testEqual(t, "Read from %q = length %v, want %v", p.encoded, count, len(p.decoded)) + testEqual(t, "Decoding of %q = %q, want %q", p.encoded, string(dbuf[0:count]), p.decoded) + if err != io.EOF { + _, err = decoder.Read(dbuf) + } + testEqual(t, "Read from %q = %v, want %v", p.encoded, err, io.EOF) + } +} + +type badReader struct { + data []byte + errs []error + called int + limit int +} + +// Populates p with data, returns a count of the bytes written and an +// error. The error returned is taken from badReader.errs, with each +// invocation of Read returning the next error in this slice, or io.EOF, +// if all errors from the slice have already been returned. The +// number of bytes returned is determined by the size of the input buffer +// the test passes to decoder.Read and will be a multiple of 8, unless +// badReader.limit is non zero. +func (b *badReader) Read(p []byte) (int, error) { + lim := len(p) + if b.limit != 0 && b.limit < lim { + lim = b.limit + } + if len(b.data) < lim { + lim = len(b.data) + } + for i := range p[:lim] { + p[i] = b.data[i] + } + b.data = b.data[lim:] + err := io.EOF + if b.called < len(b.errs) { + err = b.errs[b.called] + } + b.called++ + return lim, err +} + +// TestIssue20044 tests that decoder.Read behaves correctly when the caller +// supplied reader returns an error. +func TestIssue20044(t *testing.T) { + badErr := errors.New("bad reader error") + testCases := []struct { + r badReader + res string + err error + dbuflen int + }{ + // Check valid input data accompanied by an error is processed and the error is propagated. + { + r: badReader{data: []byte("d1jprv3fexqq4v34"), errs: []error{badErr}}, + res: "helloworld", err: badErr, + }, + // Check a read error accompanied by input data consisting of newlines only is propagated. + { + r: badReader{data: []byte("\n\n\n\n\n\n\n\n"), errs: []error{badErr, nil}}, + res: "", err: badErr, + }, + // Reader will be called twice. The first time it will return 8 newline characters. The + // second time valid base32 encoded data and an error. The data should be decoded + // correctly and the error should be propagated. + { + r: badReader{data: []byte("\n\n\n\n\n\n\n\nd1jprv3fexqq4v34"), errs: []error{nil, badErr}}, + res: "helloworld", err: badErr, dbuflen: 8, + }, + // Reader returns invalid input data (too short) and an error. Verify the reader + // error is returned. + { + r: badReader{data: []byte("c"), errs: []error{badErr}}, + res: "", err: badErr, + }, + // Reader returns invalid input data (too short) but no error. Verify io.ErrUnexpectedEOF + // is returned. + // NOTE(thehowl): I don't think this should applyto us? + /* { + r: badReader{data: []byte("c"), errs: []error{nil}}, + res: "", err: io.ErrUnexpectedEOF, + },*/ + // Reader returns invalid input data and an error. Verify the reader and not the + // decoder error is returned. + { + r: badReader{data: []byte("cu"), errs: []error{badErr}}, + res: "", err: badErr, + }, + // Reader returns valid data and io.EOF. Check data is decoded and io.EOF is propagated. + { + r: badReader{data: []byte("csqpyrk1"), errs: []error{io.EOF}}, + res: "fooba", err: io.EOF, + }, + // Check errors are properly reported when decoder.Read is called multiple times. + // decoder.Read will be called 8 times, badReader.Read will be called twice, returning + // valid data both times but an error on the second call. + { + r: badReader{data: []byte("dhjp2wvne9jjwc9g"), errs: []error{nil, badErr}}, + res: "leasure.10", err: badErr, dbuflen: 1, + }, + // Check io.EOF is properly reported when decoder.Read is called multiple times. + // decoder.Read will be called 8 times, badReader.Read will be called twice, returning + // valid data both times but io.EOF on the second call. + { + r: badReader{data: []byte("dhjp2wvne9jjw"), errs: []error{nil, io.EOF}}, + res: "leasure.", err: io.EOF, dbuflen: 1, + }, + // The following two test cases check that errors are propagated correctly when more than + // 8 bytes are read at a time. + { + r: badReader{data: []byte("dhjp2wvne9jjw"), errs: []error{io.EOF}}, + res: "leasure.", err: io.EOF, dbuflen: 11, + }, + { + r: badReader{data: []byte("dhjp2wvne9jjwc9g"), errs: []error{badErr}}, + res: "leasure.10", err: badErr, dbuflen: 11, + }, + // Check that errors are correctly propagated when the reader returns valid bytes in + // groups that are not divisible by 8. The first read will return 11 bytes and no + // error. The second will return 7 and an error. The data should be decoded correctly + // and the error should be propagated. + // NOTE(thehowl): again, this is on the assumption that this is padded, and it's not. + /* { + r: badReader{data: []byte("dhjp2wvne9jjw"), errs: []error{nil, badErr}, limit: 11}, + res: "leasure.", err: badErr, + }, */ + } + + for idx, tc := range testCases { + t.Run(fmt.Sprintf("%d-%s", idx, string(tc.res)), func(t *testing.T) { + input := tc.r.data + decoder := NewDecoder(&tc.r) + var dbuflen int + if tc.dbuflen > 0 { + dbuflen = tc.dbuflen + } else { + dbuflen = DecodedLen(len(input)) + } + dbuf := make([]byte, dbuflen) + var err error + var res []byte + for err == nil { + var n int + n, err = decoder.Read(dbuf) + if n > 0 { + res = append(res, dbuf[:n]...) + } + } + + testEqual(t, "Decoding of %q = %q, want %q", string(input), string(res), tc.res) + testEqual(t, "Decoding of %q err = %v, expected %v", string(input), err, tc.err) + }) + } +} + +// TestDecoderError verifies decode errors are propagated when there are no read +// errors. +func TestDecoderError(t *testing.T) { + for _, readErr := range []error{io.EOF, nil} { + input := "ucsqpyrk1u" + dbuf := make([]byte, DecodedLen(len(input))) + br := badReader{data: []byte(input), errs: []error{readErr}} + decoder := NewDecoder(&br) + n, err := decoder.Read(dbuf) + testEqual(t, "Read after EOF, n = %d, expected %d", n, 0) + if _, ok := err.(CorruptInputError); !ok { + t.Errorf("Corrupt input error expected. Found %T", err) + } + } +} + +// TestReaderEOF ensures decoder.Read behaves correctly when input data is +// exhausted. +func TestReaderEOF(t *testing.T) { + for _, readErr := range []error{io.EOF, nil} { + input := "MZXW6YTB" + br := badReader{data: []byte(input), errs: []error{nil, readErr}} + decoder := NewDecoder(&br) + dbuf := make([]byte, DecodedLen(len(input))) + n, err := decoder.Read(dbuf) + testEqual(t, "Decoding of %q err = %v, expected %v", input, err, error(nil)) + n, err = decoder.Read(dbuf) + testEqual(t, "Read after EOF, n = %d, expected %d", n, 0) + testEqual(t, "Read after EOF, err = %v, expected %v", err, io.EOF) + n, err = decoder.Read(dbuf) + testEqual(t, "Read after EOF, n = %d, expected %d", n, 0) + testEqual(t, "Read after EOF, err = %v, expected %v", err, io.EOF) + } +} + +func TestDecoderBuffering(t *testing.T) { + for bs := 1; bs <= 12; bs++ { + decoder := NewDecoder(strings.NewReader(bigtest.encoded)) + buf := make([]byte, len(bigtest.decoded)+12) + var total int + var n int + var err error + for total = 0; total < len(bigtest.decoded) && err == nil; { + n, err = decoder.Read(buf[total : total+bs]) + total += n + } + if err != nil && err != io.EOF { + t.Errorf("Read from %q at pos %d = %d, unexpected error %v", bigtest.encoded, total, n, err) + } + testEqual(t, "Decoding/%d of %q = %q, want %q", bs, bigtest.encoded, string(buf[0:total]), bigtest.decoded) + } +} + +func TestDecodeCorrupt(t *testing.T) { + testCases := []struct { + input string + offset int // -1 means no corruption. + }{ + {"", -1}, + {"iIoOlL", -1}, + {"!!!!", 0}, + {"uxp10", 0}, + {"x===", 1}, + {"AA=A====", 2}, + {"AAA=AAAA", 3}, + // Much fewer cases compared to Go as there are much fewer cases where input + // can be "corrupted". + } + for _, tc := range testCases { + dbuf := make([]byte, DecodedLen(len(tc.input))) + _, err := Decode(dbuf, []byte(tc.input)) + if tc.offset == -1 { + if err != nil { + t.Error("Decoder wrongly detected corruption in", tc.input) + } + continue + } + switch err := err.(type) { + case CorruptInputError: + testEqual(t, "Corruption in %q at offset %v, want %v", tc.input, int(err), tc.offset) + default: + t.Error("Decoder failed to detect corruption in", tc) + } + } +} + +func TestBig(t *testing.T) { + n := 3*1000 + 1 + raw := make([]byte, n) + const alpha = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + for i := 0; i < n; i++ { + raw[i] = alpha[i%len(alpha)] + } + encoded := new(bytes.Buffer) + w := NewEncoder(encoded) + nn, err := w.Write(raw) + if nn != n || err != nil { + t.Fatalf("Encoder.Write(raw) = %d, %v want %d, nil", nn, err, n) + } + err = w.Close() + if err != nil { + t.Fatalf("Encoder.Close() = %v want nil", err) + } + decoded, err := io.ReadAll(NewDecoder(encoded)) + if err != nil { + t.Fatalf("io.ReadAll(NewDecoder(...)): %v", err) + } + + if !bytes.Equal(raw, decoded) { + var i int + for i = 0; i < len(decoded) && i < len(raw); i++ { + if decoded[i] != raw[i] { + break + } + } + t.Errorf("Decode(Encode(%d-byte string)) failed at offset %d", n, i) + } +} + +func testStringEncoding(t *testing.T, expected string, examples []string) { + for _, e := range examples { + buf, err := DecodeString(e) + if err != nil { + t.Errorf("Decode(%q) failed: %v", e, err) + continue + } + if s := string(buf); s != expected { + t.Errorf("Decode(%q) = %q, want %q", e, s, expected) + } + } +} + +func TestNewLineCharacters(t *testing.T) { + // Each of these should decode to the string "sure", without errors. + examples := []string{ + "EDTQ4S8", + "EDTQ4S8\r", + "EDTQ4S8\n", + "EDTQ4S8\r\n", + "EDTQ4S\r\n8", + "EDT\rQ4S\n8", + "edt\nq4s\r8", + "edt\nq4s8", + "EDTQ4S\n8", + } + testStringEncoding(t, "sure", examples) +} + +func BenchmarkEncode(b *testing.B) { + data := make([]byte, 8192) + buf := make([]byte, EncodedLen(len(data))) + b.SetBytes(int64(len(data))) + for i := 0; i < b.N; i++ { + Encode(buf, data) + } +} + +func BenchmarkEncodeToString(b *testing.B) { + data := make([]byte, 8192) + b.SetBytes(int64(len(data))) + for i := 0; i < b.N; i++ { + EncodeToString(data) + } +} + +func BenchmarkDecode(b *testing.B) { + data := make([]byte, EncodedLen(8192)) + Encode(data, make([]byte, 8192)) + buf := make([]byte, 8192) + b.SetBytes(int64(len(data))) + for i := 0; i < b.N; i++ { + Decode(buf, data) + } +} + +func BenchmarkDecodeString(b *testing.B) { + data := EncodeToString(make([]byte, 8192)) + b.SetBytes(int64(len(data))) + for i := 0; i < b.N; i++ { + DecodeString(data) + } +} + +/* TODO: rewrite without using goroutines +func TestBufferedDecodingSameError(t *testing.T) { + testcases := []struct { + prefix string + chunkCombinations [][]string + expected error + }{ + // Normal case, this is valid input + {"helloworld", [][]string{ + {"D1JP", "RV3F", "EXQQ", "4V34"}, + {"D1JPRV3FEXQQ4V34"}, + {"D1J", "PRV", "3FE", "XQQ", "4V3", "4"}, + {"D1JPRV3FEXQQ4V", "34"}, + }, nil}, + + // Normal case, this is valid input + {"fooba", [][]string{ + {"CSQPYRK1"}, + {"CSQPYRK", "1"}, + {"CSQPYR", "K1"}, + {"CSQPY", "RK1"}, + {"CSQPY", "RK", "1"}, + {"CSQPY", "RK1"}, + {"CSQP", "YR", "K1"}, + }, nil}, + + // NOTE: many test cases have been removed as we don't return ErrUnexpectedEOF. + } + + for _, testcase := range testcases { + for _, chunks := range testcase.chunkCombinations { + pr, pw := io.Pipe() + + // Write the encoded chunks into the pipe + go func() { + for _, chunk := range chunks { + pw.Write([]byte(chunk)) + } + pw.Close() + }() + + decoder := NewDecoder(pr) + back, err := io.ReadAll(decoder) + + if err != testcase.expected { + t.Errorf("Expected %v, got %v; case %s %+v", testcase.expected, err, testcase.prefix, chunks) + } + if testcase.expected == nil { + testEqual(t, "Decode from NewDecoder(chunkReader(%v)) = %q, want %q", chunks, string(back), testcase.prefix) + } + } + } +} +*/ + +func TestEncodedLen(t *testing.T) { + type test struct { + n int + want int64 + } + tests := []test{ + {0, 0}, + {1, 2}, + {2, 4}, + {3, 5}, + {4, 7}, + {5, 8}, + {6, 10}, + {7, 12}, + {10, 16}, + {11, 18}, + } + // check overflow + tests = append(tests, test{(math.MaxInt-4)/8 + 1, 1844674407370955162}) + tests = append(tests, test{math.MaxInt/8*5 + 4, math.MaxInt}) + for _, tt := range tests { + if got := EncodedLen(tt.n); int64(got) != tt.want { + t.Errorf("EncodedLen(%d): got %d, want %d", tt.n, got, tt.want) + } + } +} + +func TestDecodedLen(t *testing.T) { + type test struct { + n int + want int64 + } + tests := []test{ + {0, 0}, + {2, 1}, + {4, 2}, + {5, 3}, + {7, 4}, + {8, 5}, + {10, 6}, + {12, 7}, + {16, 10}, + {18, 11}, + } + // check overflow + tests = append(tests, test{math.MaxInt/5 + 1, 1152921504606846976}) + tests = append(tests, test{math.MaxInt, 5764607523034234879}) + for _, tt := range tests { + if got := DecodedLen(tt.n); int64(got) != tt.want { + t.Errorf("DecodedLen(%d): got %d, want %d", tt.n, got, tt.want) + } + } +} diff --git a/portal-loop/extracted/p/demo/cford32/pkg_metadata.json b/portal-loop/extracted/p/demo/cford32/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/cford32/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/context/context.gno b/portal-loop/extracted/p/demo/context/context.gno new file mode 100644 index 00000000..92d19101 --- /dev/null +++ b/portal-loop/extracted/p/demo/context/context.gno @@ -0,0 +1,72 @@ +// Package context provides a minimal implementation of Go context with support +// for Value and WithValue. +// +// Adapted from https://github.com/golang/go/tree/master/src/context/. +// Copyright 2016 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. +package context + +type Context interface { + // Value returns the value associated with this context for key, or nil + // if no value is associated with key. + Value(key interface{}) interface{} +} + +// Empty returns a non-nil, empty context, similar with context.Background and +// context.TODO in Go. +func Empty() Context { + return &emptyCtx{} +} + +type emptyCtx struct{} + +func (ctx emptyCtx) Value(key interface{}) interface{} { + return nil +} + +func (ctx emptyCtx) String() string { + return "context.Empty" +} + +type valueCtx struct { + parent Context + key, val interface{} +} + +func (ctx *valueCtx) Value(key interface{}) interface{} { + if ctx.key == key { + return ctx.val + } + return ctx.parent.Value(key) +} + +func stringify(v interface{}) string { + switch s := v.(type) { + case stringer: + return s.String() + case string: + return s + } + return "non-stringer" +} + +type stringer interface { + String() string +} + +func (c *valueCtx) String() string { + return stringify(c.parent) + ".WithValue(" + + stringify(c.key) + ", " + + stringify(c.val) + ")" +} + +// WithValue returns a copy of parent in which the value associated with key is +// val. +func WithValue(parent Context, key, val interface{}) Context { + if key == nil { + panic("nil key") + } + // XXX: if !reflect.TypeOf(key).Comparable() { panic("key is not comparable") } + return &valueCtx{parent, key, val} +} diff --git a/portal-loop/extracted/p/demo/context/context_test.gno b/portal-loop/extracted/p/demo/context/context_test.gno new file mode 100644 index 00000000..0059f0d2 --- /dev/null +++ b/portal-loop/extracted/p/demo/context/context_test.gno @@ -0,0 +1,96 @@ +package context + +import "testing" + +func TestContextExample(t *testing.T) { + type favContextKey string + + k := favContextKey("language") + ctx := WithValue(Empty(), k, "Gno") + + if v := ctx.Value(k); v != nil { + if string(v) != "Gno" { + t.Errorf("language value should be Gno, but is %s", v) + } + } else { + t.Errorf("language key value was not found") + } + + if v := ctx.Value(favContextKey("color")); v != nil { + t.Errorf("color key was found") + } +} + +// otherContext is a Context that's not one of the types defined in context.go. +// This lets us test code paths that differ based on the underlying type of the +// Context. +type otherContext struct { + Context +} + +type ( + key1 int + key2 int +) + +// func (k key2) String() string { return fmt.Sprintf("%[1]T(%[1]d)", k) } + +var ( + k1 = key1(1) + k2 = key2(1) // same int as k1, different type + k3 = key2(3) // same type as k2, different int +) + +func TestValues(t *testing.T) { + check := func(c Context, nm, v1, v2, v3 string) { + if v, ok := c.Value(k1).(string); ok == (len(v1) == 0) || v != v1 { + t.Errorf(`%s.Value(k1).(string) = %q, %t want %q, %t`, nm, v, ok, v1, len(v1) != 0) + } + if v, ok := c.Value(k2).(string); ok == (len(v2) == 0) || v != v2 { + t.Errorf(`%s.Value(k2).(string) = %q, %t want %q, %t`, nm, v, ok, v2, len(v2) != 0) + } + if v, ok := c.Value(k3).(string); ok == (len(v3) == 0) || v != v3 { + t.Errorf(`%s.Value(k3).(string) = %q, %t want %q, %t`, nm, v, ok, v3, len(v3) != 0) + } + } + + c0 := Empty() + check(c0, "c0", "", "", "") + + t.Skip() // XXX: depends on https://github.com/gnolang/gno/issues/2386 + + c1 := WithValue(Empty(), k1, "c1k1") + check(c1, "c1", "c1k1", "", "") + + /*if got, want := c1.String(), `context.Empty.WithValue(context_test.key1, c1k1)`; got != want { + t.Errorf("c.String() = %q want %q", got, want) + }*/ + + c2 := WithValue(c1, k2, "c2k2") + check(c2, "c2", "c1k1", "c2k2", "") + + /*if got, want := fmt.Sprint(c2), `context.Empty.WithValue(context_test.key1, c1k1).WithValue(context_test.key2(1), c2k2)`; got != want { + t.Errorf("c.String() = %q want %q", got, want) + }*/ + + c3 := WithValue(c2, k3, "c3k3") + check(c3, "c2", "c1k1", "c2k2", "c3k3") + + c4 := WithValue(c3, k1, nil) + check(c4, "c4", "", "c2k2", "c3k3") + + o0 := otherContext{Empty()} + check(o0, "o0", "", "", "") + + o1 := otherContext{WithValue(Empty(), k1, "c1k1")} + check(o1, "o1", "c1k1", "", "") + + o2 := WithValue(o1, k2, "o2k2") + check(o2, "o2", "c1k1", "o2k2", "") + + o3 := otherContext{c4} + check(o3, "o3", "", "c2k2", "c3k3") + + o4 := WithValue(o3, k3, nil) + check(o4, "o4", "", "c2k2", "") +} diff --git a/portal-loop/extracted/p/demo/context/pkg_metadata.json b/portal-loop/extracted/p/demo/context/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/context/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/diff/diff.gno b/portal-loop/extracted/p/demo/diff/diff.gno new file mode 100644 index 00000000..0f3da9b3 --- /dev/null +++ b/portal-loop/extracted/p/demo/diff/diff.gno @@ -0,0 +1,217 @@ +// The diff package implements the Myers diff algorithm to compute the edit distance +// and generate a minimal edit script between two strings. +// +// Edit distance, also known as Levenshtein distance, is a measure of the similarity +// between two strings. It is defined as the minimum number of single-character edits (insertions, +// deletions, or substitutions) required to change one string into the other. +package diff + +import ( + "strings" +) + +// EditType represents the type of edit operation in a diff. +type EditType uint8 + +const ( + // EditKeep indicates that a character is unchanged in both strings. + EditKeep EditType = iota + + // EditInsert indicates that a character was inserted in the new string. + EditInsert + + // EditDelete indicates that a character was deleted from the old string. + EditDelete +) + +// Edit represent a single edit operation in a diff. +type Edit struct { + // Type is the kind of edit operation. + Type EditType + + // Char is the character involved in the edit operation. + Char rune +} + +// MyersDiff computes the difference between two strings using Myers' diff algorithm. +// It returns a slice of Edit operations that transform the old string into the new string. +// This implementation finds the shortest edit script (SES) that represents the minimal +// set of operations to transform one string into the other. +// +// The function handles both ASCII and non-ASCII characters correctly. +// +// Time complexity: O((N+M)D), where N and M are the lengths of the input strings, +// and D is the size of the minimum edit script. +// +// Space complexity: O((N+M)D) +// +// In the worst case, where the strings are completely different, D can be as large as N+M, +// leading to a time and space complexity of O((N+M)^2). However, for strings with many +// common substrings, the performance is much better, often closer to O(N+M). +// +// Parameters: +// - old: the original string. +// - new: the modified string. +// +// Returns: +// - A slice of Edit operations representing the minimum difference between the two strings. +func MyersDiff(old, new string) []Edit { + oldRunes, newRunes := []rune(old), []rune(new) + n, m := len(oldRunes), len(newRunes) + + if n == 0 && m == 0 { + return []Edit{} + } + + // old is empty + if n == 0 { + edits := make([]Edit, m) + for i, r := range newRunes { + edits[i] = Edit{Type: EditInsert, Char: r} + } + return edits + } + + if m == 0 { + edits := make([]Edit, n) + for i, r := range oldRunes { + edits[i] = Edit{Type: EditDelete, Char: r} + } + return edits + } + + max := n + m + v := make([]int, 2*max+1) + var trace [][]int +search: + for d := 0; d <= max; d++ { + // iterate through diagonals + for k := -d; k <= d; k += 2 { + var x int + if k == -d || (k != d && v[max+k-1] < v[max+k+1]) { + x = v[max+k+1] // move down + } else { + x = v[max+k-1] + 1 // move right + } + y := x - k + + // extend the path as far as possible with matching characters + for x < n && y < m && oldRunes[x] == newRunes[y] { + x++ + y++ + } + + v[max+k] = x + + // check if we've reached the end of both strings + if x == n && y == m { + trace = append(trace, append([]int(nil), v...)) + break search + } + } + trace = append(trace, append([]int(nil), v...)) + } + + // backtrack to construct the edit script + edits := make([]Edit, 0, n+m) + x, y := n, m + for d := len(trace) - 1; d >= 0; d-- { + vPrev := trace[d] + k := x - y + var prevK int + if k == -d || (k != d && vPrev[max+k-1] < vPrev[max+k+1]) { + prevK = k + 1 + } else { + prevK = k - 1 + } + prevX := vPrev[max+prevK] + prevY := prevX - prevK + + // add keep edits for matching characters + for x > prevX && y > prevY { + if x > 0 && y > 0 { + edits = append([]Edit{{Type: EditKeep, Char: oldRunes[x-1]}}, edits...) + } + x-- + y-- + } + if y > prevY { + if y > 0 { + edits = append([]Edit{{Type: EditInsert, Char: newRunes[y-1]}}, edits...) + } + y-- + } else if x > prevX { + if x > 0 { + edits = append([]Edit{{Type: EditDelete, Char: oldRunes[x-1]}}, edits...) + } + x-- + } + } + + return edits +} + +// Format converts a slice of Edit operations into a human-readable string representation. +// It groups consecutive edits of the same type and formats them as follows: +// - Unchanged characters are left as-is +// - Inserted characters are wrapped in [+...] +// - Deleted characters are wrapped in [-...] +// +// This function is useful for visualizing the differences between two strings +// in a compact and intuitive format. +// +// Parameters: +// - edits: A slice of Edit operations, typically produced by MyersDiff +// +// Returns: +// - A formatted string representing the diff +// +// Example output: +// +// For the diff between "abcd" and "acbd", the output might be: +// "a[-b]c[+b]d" +// +// Note: +// +// The function assumes that the input slice of edits is in the correct order. +// An empty input slice will result in an empty string. +func Format(edits []Edit) string { + if len(edits) == 0 { + return "" + } + + var ( + result strings.Builder + currentType EditType + currentChars strings.Builder + ) + + flushCurrent := func() { + if currentChars.Len() > 0 { + switch currentType { + case EditKeep: + result.WriteString(currentChars.String()) + case EditInsert: + result.WriteString("[+") + result.WriteString(currentChars.String()) + result.WriteByte(']') + case EditDelete: + result.WriteString("[-") + result.WriteString(currentChars.String()) + result.WriteByte(']') + } + currentChars.Reset() + } + } + + for _, edit := range edits { + if edit.Type != currentType { + flushCurrent() + currentType = edit.Type + } + currentChars.WriteRune(edit.Char) + } + flushCurrent() + + return result.String() +} diff --git a/portal-loop/extracted/p/demo/diff/diff_test.gno b/portal-loop/extracted/p/demo/diff/diff_test.gno new file mode 100644 index 00000000..bbf4fcdf --- /dev/null +++ b/portal-loop/extracted/p/demo/diff/diff_test.gno @@ -0,0 +1,182 @@ +package diff + +import ( + "strings" + "testing" +) + +func TestMyersDiff(t *testing.T) { + tests := []struct { + name string + old string + new string + expected string + }{ + { + name: "No difference", + old: "abc", + new: "abc", + expected: "abc", + }, + { + name: "Simple insertion", + old: "ac", + new: "abc", + expected: "a[+b]c", + }, + { + name: "Simple deletion", + old: "abc", + new: "ac", + expected: "a[-b]c", + }, + { + name: "Simple substitution", + old: "abc", + new: "abd", + expected: "ab[-c][+d]", + }, + { + name: "Multiple changes", + old: "The quick brown fox jumps over the lazy dog", + new: "The quick brown cat jumps over the lazy dog", + expected: "The quick brown [-fox][+cat] jumps over the lazy dog", + }, + { + name: "Prefix and suffix", + old: "Hello, world!", + new: "Hello, beautiful world!", + expected: "Hello, [+beautiful ]world!", + }, + { + name: "Complete change", + old: "abcdef", + new: "ghijkl", + expected: "[-abcdef][+ghijkl]", + }, + { + name: "Empty strings", + old: "", + new: "", + expected: "", + }, + { + name: "Old empty", + old: "", + new: "abc", + expected: "[+abc]", + }, + { + name: "New empty", + old: "abc", + new: "", + expected: "[-abc]", + }, + { + name: "non-ascii (Korean characters)", + old: "ASCII 문자가 아닌 것도 되나?", + new: "ASCII 문자가 아닌 것도 됨.", + expected: "ASCII 문자가 아닌 것도 [-되나?][+됨.]", + }, + { + name: "Emoji diff", + old: "Hello 👋 World 🌍", + new: "Hello 👋 Beautiful 🌸 World 🌍", + expected: "Hello 👋 [+Beautiful 🌸 ]World 🌍", + }, + { + name: "Mixed multibyte and ASCII", + old: "こんにちは World", + new: "こんばんは World", + expected: "こん[-にち][+ばん]は World", + }, + { + name: "Chinese characters", + old: "我喜欢编程", + new: "我喜欢看书和编程", + expected: "我喜欢[+看书和]编程", + }, + { + name: "Combining characters", + old: "e\u0301", // é (e + ´) + new: "e\u0300", // è (e + `) + expected: "e[-\u0301][+\u0300]", + }, + { + name: "Right-to-Left languages", + old: "שלום", + new: "שלום עולם", + expected: "שלום[+ עולם]", + }, + { + name: "Normalization NFC and NFD", + old: "e\u0301", // NFD (decomposed) + new: "\u00e9", // NFC (precomposed) + expected: "[-e\u0301][+\u00e9]", + }, + { + name: "Case sensitivity", + old: "abc", + new: "Abc", + expected: "[-a][+A]bc", + }, + { + name: "Surrogate pairs", + old: "Hello 🌍", + new: "Hello 🌎", + expected: "Hello [-🌍][+🌎]", + }, + { + name: "Control characters", + old: "Line1\nLine2", + new: "Line1\r\nLine2", + expected: "Line1[+\r]\nLine2", + }, + { + name: "Mixed scripts", + old: "Hello नमस्ते こんにちは", + new: "Hello สวัสดี こんにちは", + expected: "Hello [-नमस्ते][+สวัสดี] こんにちは", + }, + { + name: "Unicode normalization", + old: "é", // U+00E9 (precomposed) + new: "e\u0301", // U+0065 U+0301 (decomposed) + expected: "[-é][+e\u0301]", + }, + { + name: "Directional marks", + old: "Hello\u200Eworld", // LTR mark + new: "Hello\u200Fworld", // RTL mark + expected: "Hello[-\u200E][+\u200F]world", + }, + { + name: "Zero-width characters", + old: "ab\u200Bc", // Zero-width space + new: "abc", + expected: "ab[-\u200B]c", + }, + { + name: "Worst-case scenario (completely different strings)", + old: strings.Repeat("a", 1000), + new: strings.Repeat("b", 1000), + expected: "[-" + strings.Repeat("a", 1000) + "][+" + strings.Repeat("b", 1000) + "]", + }, + { + name: "Very long strings", + old: strings.Repeat("a", 10000) + "b" + strings.Repeat("a", 10000), + new: strings.Repeat("a", 10000) + "c" + strings.Repeat("a", 10000), + expected: strings.Repeat("a", 10000) + "[-b][+c]" + strings.Repeat("a", 10000), + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + diff := MyersDiff(tc.old, tc.new) + result := Format(diff) + if result != tc.expected { + t.Errorf("Expected: %s, got: %s", tc.expected, result) + } + }) + } +} diff --git a/portal-loop/extracted/p/demo/diff/pkg_metadata.json b/portal-loop/extracted/p/demo/diff/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/diff/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/dom/dom.gno b/portal-loop/extracted/p/demo/dom/dom.gno new file mode 100644 index 00000000..b4124367 --- /dev/null +++ b/portal-loop/extracted/p/demo/dom/dom.gno @@ -0,0 +1,69 @@ +// XXX This is only used for testing in ./tests. +// Otherwise this package is deprecated. +// TODO: replace with a package that is supported, and delete this. + +package dom + +import ( + "strconv" + + "gno.land/p/demo/avl" +) + +type Plot struct { + Name string + Posts avl.Tree // postsCtr -> *Post + PostsCtr int +} + +func (plot *Plot) AddPost(title string, body string) { + ctr := plot.PostsCtr + plot.PostsCtr++ + key := strconv.Itoa(ctr) + post := &Post{ + Title: title, + Body: body, + } + plot.Posts.Set(key, post) +} + +func (plot *Plot) String() string { + str := "# [plot] " + plot.Name + "\n" + if plot.Posts.Size() > 0 { + plot.Posts.Iterate("", "", func(key string, value interface{}) bool { + str += "\n" + str += value.(*Post).String() + return false + }) + } + return str +} + +type Post struct { + Title string + Body string + Comments avl.Tree +} + +func (post *Post) String() string { + str := "## " + post.Title + "\n" + str += "" + str += post.Body + if post.Comments.Size() > 0 { + post.Comments.Iterate("", "", func(key string, value interface{}) bool { + str += "\n" + str += value.(*Comment).String() + return false + }) + } + return str +} + +type Comment struct { + Creator string + Body string +} + +func (cmm Comment) String() string { + return cmm.Body + " - @" + cmm.Creator + "\n" +} diff --git a/portal-loop/extracted/p/demo/dom/pkg_metadata.json b/portal-loop/extracted/p/demo/dom/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/dom/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/echo1/echo.gno b/portal-loop/extracted/p/demo/echo1/echo.gno new file mode 100644 index 00000000..d9933ab2 --- /dev/null +++ b/portal-loop/extracted/p/demo/echo1/echo.gno @@ -0,0 +1,13 @@ +package echo + +/* + * This realm echoes the `path` argument it received. + * Can be used by developers as a simple endpoint to test + * forbidden characters, for pentesting or simply to + * test it works. + * + * See also r/demo/print (to print various thing like user address) + */ +func Render(path string) string { + return path +} diff --git a/portal-loop/extracted/p/demo/echo1/echo_test.gno b/portal-loop/extracted/p/demo/echo1/echo_test.gno new file mode 100644 index 00000000..8e5be070 --- /dev/null +++ b/portal-loop/extracted/p/demo/echo1/echo_test.gno @@ -0,0 +1,12 @@ +package echo + +import "testing" + +func Test(t *testing.T) { + if Render("aa") != "aa" { + t.Fail() + } + if Render("") != "" { + t.Fail() + } +} diff --git a/portal-loop/extracted/p/demo/echo1/gno.mod b/portal-loop/extracted/p/demo/echo1/gno.mod new file mode 100644 index 00000000..f07d7894 --- /dev/null +++ b/portal-loop/extracted/p/demo/echo1/gno.mod @@ -0,0 +1 @@ +module gno.land/r/demo/echo diff --git a/portal-loop/extracted/p/demo/echo1/pkg_metadata.json b/portal-loop/extracted/p/demo/echo1/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/echo1/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/entropy/entropy.gno b/portal-loop/extracted/p/demo/entropy/entropy.gno new file mode 100644 index 00000000..5e35b8c7 --- /dev/null +++ b/portal-loop/extracted/p/demo/entropy/entropy.gno @@ -0,0 +1,89 @@ +// Entropy generates fully deterministic, cost-effective, and hard to guess +// numbers. +// +// It is designed both for single-usage, like seeding math/rand or for being +// reused which increases the entropy and its cost effectiveness. +// +// Disclaimer: this package is unsafe and won't prevent others to guess values +// in advance. +// +// It uses the Bernstein's hash djb2 to be CPU-cycle efficient. +package entropy + +import ( + "math" + "std" + "time" +) + +type Instance struct { + value uint32 +} + +func New() *Instance { + r := Instance{value: 5381} + r.addEntropy() + return &r +} + +func FromSeed(seed uint32) *Instance { + r := Instance{value: seed} + r.addEntropy() + return &r +} + +func (i *Instance) Seed() uint32 { + return i.value +} + +func (i *Instance) djb2String(input string) { + for _, c := range input { + i.djb2Uint32(uint32(c)) + } +} + +// super fast random algorithm. +// http://www.cse.yorku.ca/~oz/hash.html +func (i *Instance) djb2Uint32(input uint32) { + i.value = (i.value << 5) + i.value + input +} + +// AddEntropy uses various runtime variables to add entropy to the existing seed. +func (i *Instance) addEntropy() { + // FIXME: reapply the 5381 initial value? + + // inherit previous entropy + // nothing to do + + // handle callers + { + caller1 := std.GetCallerAt(1).String() + i.djb2String(caller1) + caller2 := std.GetCallerAt(2).String() + i.djb2String(caller2) + } + + // height + { + height := std.GetHeight() + if height >= math.MaxUint32 { + height -= math.MaxUint32 + } + i.djb2Uint32(uint32(height)) + } + + // time + { + secs := time.Now().Second() + i.djb2Uint32(uint32(secs)) + nsecs := time.Now().Nanosecond() + i.djb2Uint32(uint32(nsecs)) + } + + // FIXME: compute other hard-to-guess but deterministic variables, like real gas? +} + +func (i *Instance) Value() uint32 { + i.addEntropy() + return i.value +} diff --git a/portal-loop/extracted/p/demo/entropy/entropy_test.gno b/portal-loop/extracted/p/demo/entropy/entropy_test.gno new file mode 100644 index 00000000..0deb3ab9 --- /dev/null +++ b/portal-loop/extracted/p/demo/entropy/entropy_test.gno @@ -0,0 +1,46 @@ +package entropy + +import ( + "std" + "strconv" + "testing" +) + +func TestInstance(t *testing.T) { + instance := New() + if instance == nil { + t.Errorf("instance should not be nil") + } +} + +func TestInstanceValue(t *testing.T) { + baseEntropy := New() + baseResult := computeValue(t, baseEntropy) + + sameHeightEntropy := New() + sameHeightResult := computeValue(t, sameHeightEntropy) + + if baseResult != sameHeightResult { + t.Errorf("should have the same result: new=%s, base=%s", sameHeightResult, baseResult) + } + + std.TestSkipHeights(1) + differentHeightEntropy := New() + differentHeightResult := computeValue(t, differentHeightEntropy) + + if baseResult == differentHeightResult { + t.Errorf("should have different result: new=%s, base=%s", differentHeightResult, baseResult) + } +} + +func computeValue(t *testing.T, r *Instance) string { + t.Helper() + + out := "" + for i := 0; i < 10; i++ { + val := int(r.Value()) + out += strconv.Itoa(val) + " " + } + + return out +} diff --git a/portal-loop/extracted/p/demo/entropy/pkg_metadata.json b/portal-loop/extracted/p/demo/entropy/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/entropy/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/entropy/z_filetest.gno b/portal-loop/extracted/p/demo/entropy/z_filetest.gno new file mode 100644 index 00000000..85ed1b10 --- /dev/null +++ b/portal-loop/extracted/p/demo/entropy/z_filetest.gno @@ -0,0 +1,56 @@ +package main + +import ( + "std" + + "gno.land/p/demo/entropy" +) + +func main() { + // initial + println("---") + r := entropy.New() + println(r.Value()) + println(r.Value()) + println(r.Value()) + println(r.Value()) + println(r.Value()) + + // should be the same + println("---") + r = entropy.New() + println(r.Value()) + println(r.Value()) + println(r.Value()) + println(r.Value()) + println(r.Value()) + + std.TestSkipHeights(1) + println("---") + r = entropy.New() + println(r.Value()) + println(r.Value()) + println(r.Value()) + println(r.Value()) + println(r.Value()) +} + +// Output: +// --- +// 4129293727 +// 2141104956 +// 1950222777 +// 3348280598 +// 438354259 +// --- +// 4129293727 +// 2141104956 +// 1950222777 +// 3348280598 +// 438354259 +// --- +// 49506731 +// 1539580078 +// 2695928529 +// 1895482388 +// 3462727799 diff --git a/portal-loop/extracted/p/demo/flow/LICENSE b/portal-loop/extracted/p/demo/flow/LICENSE new file mode 100644 index 00000000..2c488e7e --- /dev/null +++ b/portal-loop/extracted/p/demo/flow/LICENSE @@ -0,0 +1,32 @@ +https://github.com/mxk/go-flowrate/blob/master/LICENSE +BSD 3-Clause "New" or "Revised" License + +Copyright (c) 2014 The Go-FlowRate Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the + distribution. + + * Neither the name of the go-flowrate project nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/portal-loop/extracted/p/demo/flow/README.md b/portal-loop/extracted/p/demo/flow/README.md new file mode 100644 index 00000000..db428090 --- /dev/null +++ b/portal-loop/extracted/p/demo/flow/README.md @@ -0,0 +1,10 @@ +Data Flow Rate Control +====================== + +To download and install this package run: + +go get github.com/mxk/go-flowrate/flowrate + +The documentation is available at: + +http://godoc.org/github.com/mxk/go-flowrate/flowrate diff --git a/portal-loop/extracted/p/demo/flow/flow.gno b/portal-loop/extracted/p/demo/flow/flow.gno new file mode 100644 index 00000000..533f787a --- /dev/null +++ b/portal-loop/extracted/p/demo/flow/flow.gno @@ -0,0 +1,288 @@ +// +// Written by Maxim Khitrov (November 2012) +// +// XXX modified to disable blocking, time.Sleep(). + +// Package flow provides the tools for monitoring and limiting the flow rate +// of an arbitrary data stream. +package flow + +import ( + "math" + // "sync" + "time" +) + +// Monitor monitors and limits the transfer rate of a data stream. +type Monitor struct { + // mu sync.Mutex // Mutex guarding access to all internal fields + active bool // Flag indicating an active transfer + start time.Duration // Transfer start time (clock() value) + bytes int64 // Total number of bytes transferred + samples int64 // Total number of samples taken + + rSample float64 // Most recent transfer rate sample (bytes per second) + rEMA float64 // Exponential moving average of rSample + rPeak float64 // Peak transfer rate (max of all rSamples) + rWindow float64 // rEMA window (seconds) + + sBytes int64 // Number of bytes transferred since sLast + sLast time.Duration // Most recent sample time (stop time when inactive) + sRate time.Duration // Sampling rate + + tBytes int64 // Number of bytes expected in the current transfer + tLast time.Duration // Time of the most recent transfer of at least 1 byte +} + +// New creates a new flow control monitor. Instantaneous transfer rate is +// measured and updated for each sampleRate interval. windowSize determines the +// weight of each sample in the exponential moving average (EMA) calculation. +// The exact formulas are: +// +// sampleTime = currentTime - prevSampleTime +// sampleRate = byteCount / sampleTime +// weight = 1 - exp(-sampleTime/windowSize) +// newRate = weight*sampleRate + (1-weight)*oldRate +// +// The default values for sampleRate and windowSize (if <= 0) are 100ms and 1s, +// respectively. +func New(sampleRate, windowSize time.Duration) *Monitor { + if sampleRate = clockRound(sampleRate); sampleRate <= 0 { + sampleRate = 5 * clockRate + } + if windowSize <= 0 { + windowSize = 1 * time.Second + } + now := clock() + return &Monitor{ + active: true, + start: now, + rWindow: windowSize.Seconds(), + sLast: now, + sRate: sampleRate, + tLast: now, + } +} + +// Update records the transfer of n bytes and returns n. It should be called +// after each Read/Write operation, even if n is 0. +func (m *Monitor) Update(n int) int { + // m.mu.Lock() + m.update(n) + // m.mu.Unlock() + return n +} + +// Hack to set the current rEMA. +func (m *Monitor) SetREMA(rEMA float64) { + // m.mu.Lock() + m.rEMA = rEMA + m.samples++ + // m.mu.Unlock() +} + +// IO is a convenience method intended to wrap io.Reader and io.Writer method +// execution. It calls m.Update(n) and then returns (n, err) unmodified. +func (m *Monitor) IO(n int, err error) (int, error) { + return m.Update(n), err +} + +// Done marks the transfer as finished and prevents any further updates or +// limiting. Instantaneous and current transfer rates drop to 0. Update, IO, and +// Limit methods become NOOPs. It returns the total number of bytes transferred. +func (m *Monitor) Done() int64 { + // m.mu.Lock() + if now := m.update(0); m.sBytes > 0 { + m.reset(now) + } + m.active = false + m.tLast = 0 + n := m.bytes + // m.mu.Unlock() + return n +} + +// timeRemLimit is the maximum Status.TimeRem value. +const timeRemLimit = 999*time.Hour + 59*time.Minute + 59*time.Second + +// Status represents the current Monitor status. All transfer rates are in bytes +// per second rounded to the nearest byte. +type Status struct { + Active bool // Flag indicating an active transfer + Start time.Time // Transfer start time + Duration time.Duration // Time period covered by the statistics + Idle time.Duration // Time since the last transfer of at least 1 byte + Bytes int64 // Total number of bytes transferred + Samples int64 // Total number of samples taken + InstRate int64 // Instantaneous transfer rate + CurRate int64 // Current transfer rate (EMA of InstRate) + AvgRate int64 // Average transfer rate (Bytes / Duration) + PeakRate int64 // Maximum instantaneous transfer rate + BytesRem int64 // Number of bytes remaining in the transfer + TimeRem time.Duration // Estimated time to completion + Progress Percent // Overall transfer progress +} + +func (s Status) String() string { + return "STATUS{}" +} + +// Status returns current transfer status information. The returned value +// becomes static after a call to Done. +func (m *Monitor) Status() Status { + // m.mu.Lock() + now := m.update(0) + s := Status{ + Active: m.active, + Start: clockToTime(m.start), + Duration: m.sLast - m.start, + Idle: now - m.tLast, + Bytes: m.bytes, + Samples: m.samples, + PeakRate: round(m.rPeak), + BytesRem: m.tBytes - m.bytes, + Progress: percentOf(float64(m.bytes), float64(m.tBytes)), + } + if s.BytesRem < 0 { + s.BytesRem = 0 + } + if s.Duration > 0 { + rAvg := float64(s.Bytes) / s.Duration.Seconds() + s.AvgRate = round(rAvg) + if s.Active { + s.InstRate = round(m.rSample) + s.CurRate = round(m.rEMA) + if s.BytesRem > 0 { + if tRate := 0.8*m.rEMA + 0.2*rAvg; tRate > 0 { + ns := float64(s.BytesRem) / tRate * 1e9 + if ns > float64(timeRemLimit) { + ns = float64(timeRemLimit) + } + s.TimeRem = clockRound(time.Duration(ns)) + } + } + } + } + // m.mu.Unlock() + return s +} + +// Limit restricts the instantaneous (per-sample) data flow to rate bytes per +// second. It returns the maximum number of bytes (0 <= n <= want) that may be +// transferred immediately without exceeding the limit. If block == true, the +// call blocks until n > 0. want is returned unmodified if want < 1, rate < 1, +// or the transfer is inactive (after a call to Done). +// +// At least one byte is always allowed to be transferred in any given sampling +// period. Thus, if the sampling rate is 100ms, the lowest achievable flow rate +// is 10 bytes per second. +// +// For usage examples, see the implementation of Reader and Writer in io.go. +func (m *Monitor) Limit(want int, rate int64, block bool) (n int) { + if block { + panic("blocking not yet supported") + } + if want < 1 || rate < 1 { + return want + } + // m.mu.Lock() + + // Determine the maximum number of bytes that can be sent in one sample + limit := round(float64(rate) * m.sRate.Seconds()) + if limit <= 0 { + limit = 1 + } + + _ = m.update(0) + /* XXX + // If block == true, wait until m.sBytes < limit + if now := m.update(0); block { + for m.sBytes >= limit && m.active { + now = m.waitNextSample(now) + } + } + */ + + // Make limit <= want (unlimited if the transfer is no longer active) + if limit -= m.sBytes; limit > int64(want) || !m.active { + limit = int64(want) + } + // m.mu.Unlock() + + if limit < 0 { + limit = 0 + } + return int(limit) +} + +// SetTransferSize specifies the total size of the data transfer, which allows +// the Monitor to calculate the overall progress and time to completion. +func (m *Monitor) SetTransferSize(bytes int64) { + if bytes < 0 { + bytes = 0 + } + // m.mu.Lock() + m.tBytes = bytes + // m.mu.Unlock() +} + +// update accumulates the transferred byte count for the current sample until +// clock() - m.sLast >= m.sRate. The monitor status is updated once the current +// sample is done. +func (m *Monitor) update(n int) (now time.Duration) { + if !m.active { + return + } + if now = clock(); n > 0 { + m.tLast = now + } + m.sBytes += int64(n) + if sTime := now - m.sLast; sTime >= m.sRate { + t := sTime.Seconds() + if m.rSample = float64(m.sBytes) / t; m.rSample > m.rPeak { + m.rPeak = m.rSample + } + + // Exponential moving average using a method similar to *nix load + // average calculation. Longer sampling periods carry greater weight. + if m.samples > 0 { + w := math.Exp(-t / m.rWindow) + m.rEMA = m.rSample + w*(m.rEMA-m.rSample) + } else { + m.rEMA = m.rSample + } + m.reset(now) + } + return +} + +// reset clears the current sample state in preparation for the next sample. +func (m *Monitor) reset(sampleTime time.Duration) { + m.bytes += m.sBytes + m.samples++ + m.sBytes = 0 + m.sLast = sampleTime +} + +/* +// waitNextSample sleeps for the remainder of the current sample. The lock is +// released and reacquired during the actual sleep period, so it's possible for +// the transfer to be inactive when this method returns. +func (m *Monitor) waitNextSample(now time.Duration) time.Duration { + const minWait = 5 * time.Millisecond + current := m.sLast + + // sleep until the last sample time changes (ideally, just one iteration) + for m.sLast == current && m.active { + d := current + m.sRate - now + // m.mu.Unlock() + if d < minWait { + d = minWait + } + time.Sleep(d) + // m.mu.Lock() + now = m.update(0) + } + return now +} +*/ diff --git a/portal-loop/extracted/p/demo/flow/io.gno b/portal-loop/extracted/p/demo/flow/io.gno new file mode 100644 index 00000000..4d37eda3 --- /dev/null +++ b/portal-loop/extracted/p/demo/flow/io.gno @@ -0,0 +1,136 @@ +// +// Written by Maxim Khitrov (November 2012) +// + +package flow + +import ( + "errors" + "io" +) + +// ErrLimit is returned by the Writer when a non-blocking write is short due to +// the transfer rate limit. +var ErrLimit = errors.New("flowrate: flow rate limit exceeded") + +// Limiter is implemented by the Reader and Writer to provide a consistent +// interface for monitoring and controlling data transfer. +type Limiter interface { + Done() int64 + Status() Status + SetTransferSize(bytes int64) + SetLimit(new int64) (old int64) + SetBlocking(new bool) (old bool) +} + +// Reader implements io.ReadCloser with a restriction on the rate of data +// transfer. +type Reader struct { + io.Reader // Data source + *Monitor // Flow control monitor + + limit int64 // Rate limit in bytes per second (unlimited when <= 0) + block bool // What to do when no new bytes can be read due to the limit +} + +// NewReader restricts all Read operations on r to limit bytes per second. +func NewReader(r io.Reader, limit int64) *Reader { + return &Reader{r, New(0, 0), limit, false} // XXX default false +} + +// Read reads up to len(p) bytes into p without exceeding the current transfer +// rate limit. It returns (0, nil) immediately if r is non-blocking and no new +// bytes can be read at this time. +func (r *Reader) Read(p []byte) (n int, err error) { + p = p[:r.Limit(len(p), r.limit, r.block)] + if len(p) > 0 { + n, err = r.IO(r.Reader.Read(p)) + } + return +} + +// SetLimit changes the transfer rate limit to new bytes per second and returns +// the previous setting. +func (r *Reader) SetLimit(new int64) (old int64) { + old, r.limit = r.limit, new + return +} + +// SetBlocking changes the blocking behavior and returns the previous setting. A +// Read call on a non-blocking reader returns immediately if no additional bytes +// may be read at this time due to the rate limit. +func (r *Reader) SetBlocking(new bool) (old bool) { + if new == true { + panic("blocking not yet supported") + } + old, r.block = r.block, new + return +} + +// Close closes the underlying reader if it implements the io.Closer interface. +func (r *Reader) Close() error { + defer r.Done() + if c, ok := r.Reader.(io.Closer); ok { + return c.Close() + } + return nil +} + +// Writer implements io.WriteCloser with a restriction on the rate of data +// transfer. +type Writer struct { + io.Writer // Data destination + *Monitor // Flow control monitor + + limit int64 // Rate limit in bytes per second (unlimited when <= 0) + block bool // What to do when no new bytes can be written due to the limit +} + +// NewWriter restricts all Write operations on w to limit bytes per second. The +// transfer rate and the default blocking behavior (true) can be changed +// directly on the returned *Writer. +func NewWriter(w io.Writer, limit int64) *Writer { + return &Writer{w, New(0, 0), limit, false} // XXX default false +} + +// Write writes len(p) bytes from p to the underlying data stream without +// exceeding the current transfer rate limit. It returns (n, ErrLimit) if w is +// non-blocking and no additional bytes can be written at this time. +func (w *Writer) Write(p []byte) (n int, err error) { + var c int + for len(p) > 0 && err == nil { + s := p[:w.Limit(len(p), w.limit, w.block)] + if len(s) > 0 { + c, err = w.IO(w.Writer.Write(s)) + } else { + return n, ErrLimit + } + p = p[c:] + n += c + } + return +} + +// SetLimit changes the transfer rate limit to new bytes per second and returns +// the previous setting. +func (w *Writer) SetLimit(new int64) (old int64) { + old, w.limit = w.limit, new + return +} + +// SetBlocking changes the blocking behavior and returns the previous setting. A +// Write call on a non-blocking writer returns as soon as no additional bytes +// may be written at this time due to the rate limit. +func (w *Writer) SetBlocking(new bool) (old bool) { + old, w.block = w.block, new + return +} + +// Close closes the underlying writer if it implements the io.Closer interface. +func (w *Writer) Close() error { + defer w.Done() + if c, ok := w.Writer.(io.Closer); ok { + return c.Close() + } + return nil +} diff --git a/portal-loop/extracted/p/demo/flow/io_test.gno b/portal-loop/extracted/p/demo/flow/io_test.gno new file mode 100644 index 00000000..e881854b --- /dev/null +++ b/portal-loop/extracted/p/demo/flow/io_test.gno @@ -0,0 +1,217 @@ +// +// Written by Maxim Khitrov (November 2012) +// + +package flow + +import ( + "bytes" + "testing" + "time" + + ios_test "internal/os_test" +) + +// XXX ugh, I can't even sleep milliseconds. +// XXX + +const ( + _50ms = 50 * time.Millisecond + _100ms = 100 * time.Millisecond + _200ms = 200 * time.Millisecond + _300ms = 300 * time.Millisecond + _400ms = 400 * time.Millisecond + _500ms = 500 * time.Millisecond +) + +func nextStatus(m *Monitor) Status { + samples := m.samples + for i := 0; i < 30; i++ { + if s := m.Status(); s.Samples != samples { + return s + } + ios_test.Sleep(5 * time.Millisecond) + } + return m.Status() +} + +func TestReader(t *testing.T) { + in := make([]byte, 100) + for i := range in { + in[i] = byte(i) + } + b := make([]byte, 100) + r := NewReader(bytes.NewReader(in), 100) + start := time.Now() + + // Make sure r implements Limiter + _ = Limiter(r) + + // 1st read of 10 bytes is performed immediately + if n, err := r.Read(b); n != 10 { + t.Fatalf("r.Read(b) expected 10 (); got %v", n) + } else if err != nil { + t.Fatalf("r.Read(b) expected 10 (); got %v (%v)", n, err.Error()) + } else if rt := time.Since(start); rt > _50ms { + t.Fatalf("r.Read(b) took too long (%v)", rt.String()) + } + + // No new Reads allowed in the current sample + r.SetBlocking(false) + if n, err := r.Read(b); n != 0 { + t.Fatalf("r.Read(b) expected 0 (); got %v", n) + } else if err != nil { + t.Fatalf("r.Read(b) expected 0 (); got %v (%v)", n, err.Error()) + } else if rt := time.Since(start); rt > _50ms { + t.Fatalf("r.Read(b) took too long (%v)", rt.String()) + } + + status := [6]Status{0: r.Status()} // No samples in the first status + + // 2nd read of 10 bytes blocks until the next sample + // r.SetBlocking(true) + ios_test.Sleep(100 * time.Millisecond) + if n, err := r.Read(b[10:]); n != 10 { + t.Fatalf("r.Read(b[10:]) expected 10 (); got %v", n) + } else if err != nil { + t.Fatalf("r.Read(b[10:]) expected 10 (); got %v (%v)", n, err.Error()) + } else if rt := time.Since(start); rt < _100ms { + t.Fatalf("r.Read(b[10:]) returned ahead of time (%v)", rt.String()) + } + + status[1] = r.Status() // 1st sample + status[2] = nextStatus(r.Monitor) // 2nd sample + status[3] = nextStatus(r.Monitor) // No activity for the 3rd sample + + if n := r.Done(); n != 20 { + t.Fatalf("r.Done() expected 20; got %v", n) + } + + status[4] = r.Status() + status[5] = nextStatus(r.Monitor) // Timeout + start = status[0].Start + + // Active, Start, Duration, Idle, Bytes, Samples, InstRate, CurRate, AvgRate, PeakRate, BytesRem, TimeRem, Progress + want := []Status{ + {true, start, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, + {true, start, _100ms, 0, 10, 1, 100, 100, 100, 100, 0, 0, 0}, + {true, start, _200ms, _100ms, 20, 2, 100, 100, 100, 100, 0, 0, 0}, + {true, start, _300ms, _200ms, 20, 3, 0, 90, 67, 100, 0, 0, 0}, + {false, start, _300ms, 0, 20, 3, 0, 0, 67, 100, 0, 0, 0}, + {false, start, _300ms, 0, 20, 3, 0, 0, 67, 100, 0, 0, 0}, + } + for i, s := range status { + // XXX s := s + if !statusesAreEqual(&s, &want[i]) { + t.Errorf("r.Status(%v)\nexpected: %v\ngot : %v", i, want[i].String(), s.String()) + } + } + if !bytes.Equal(b[:20], in[:20]) { + t.Errorf("r.Read() input doesn't match output") + } +} + +// XXX blocking writer test doesn't work. +func _TestWriter(t *testing.T) { + b := make([]byte, 100) + for i := range b { + b[i] = byte(i) + } + w := NewWriter(&bytes.Buffer{}, 200) + start := time.Now() + + // Make sure w implements Limiter + _ = Limiter(w) + + // Non-blocking 20-byte write for the first sample returns ErrLimit + w.SetBlocking(false) + if n, err := w.Write(b); n != 20 || err != ErrLimit { + t.Fatalf("w.Write(b) expected 20 (ErrLimit); got %v (%v)", n, err.Error()) + } else if rt := time.Since(start); rt > _50ms { + t.Fatalf("w.Write(b) took too long (%v)", rt) + } + + // Blocking 80-byte write + // w.SetBlocking(true) + // XXX This test doesn't work, because w.Write calls w.Limit(block=false), + // XXX and it returns ErrLimit after 20. What we want is to keep waiting until 80 is returned, + // XXX but blocking isn't supported. Sleeping 800 shouldn't be sufficient either (its a burst). + // XXX This limits the usage of Limiter and m.Limit(). + ios_test.Sleep(800 * time.Millisecond) + if n, err := w.Write(b[20:]); n < 80 { + } else if n != 80 || err != nil { + t.Fatalf("w.Write(b[20:]) expected 80 (); got %v (%v)", n, err.Error()) + } else if rt := time.Since(start); rt < _300ms { + // Explanation for `rt < _300ms` (as opposed to `< _400ms`) + // + // |<-- start | | + // epochs: -----0ms|---100ms|---200ms|---300ms|---400ms + // sends: 20|20 |20 |20 |20# + // + // NOTE: The '#' symbol can thus happen before 400ms is up. + // Thus, we can only panic if rt < _300ms. + t.Fatalf("w.Write(b[20:]) returned ahead of time (%v)", rt.String()) + } + + w.SetTransferSize(100) + status := []Status{w.Status(), nextStatus(w.Monitor)} + start = status[0].Start + + // Active, Start, Duration, Idle, Bytes, Samples, InstRate, CurRate, AvgRate, PeakRate, BytesRem, TimeRem, Progress + want := []Status{ + {true, start, _400ms, 0, 80, 4, 200, 200, 200, 200, 20, _100ms, 80000}, + {true, start, _500ms, _100ms, 100, 5, 200, 200, 200, 200, 0, 0, 100000}, + } + for i, s := range status { + // XXX s := s + if !statusesAreEqual(&s, &want[i]) { + t.Errorf("w.Status(%v)\nexpected: %v\ngot : %v\n", i, want[i].String(), s.String()) + } + } + if !bytes.Equal(b, w.Writer.(*bytes.Buffer).Bytes()) { + t.Errorf("w.Write() input doesn't match output") + } +} + +const ( + maxDeviationForDuration = 50 * time.Millisecond + maxDeviationForRate int64 = 50 +) + +// statusesAreEqual returns true if s1 is equal to s2. Equality here means +// general equality of fields except for the duration and rates, which can +// drift due to unpredictable delays (e.g. thread wakes up 25ms after +// `time.Sleep` has ended). +func statusesAreEqual(s1 *Status, s2 *Status) bool { + if s1.Active == s2.Active && + s1.Start == s2.Start && + durationsAreEqual(s1.Duration, s2.Duration, maxDeviationForDuration) && + s1.Idle == s2.Idle && + s1.Bytes == s2.Bytes && + s1.Samples == s2.Samples && + ratesAreEqual(s1.InstRate, s2.InstRate, maxDeviationForRate) && + ratesAreEqual(s1.CurRate, s2.CurRate, maxDeviationForRate) && + ratesAreEqual(s1.AvgRate, s2.AvgRate, maxDeviationForRate) && + ratesAreEqual(s1.PeakRate, s2.PeakRate, maxDeviationForRate) && + s1.BytesRem == s2.BytesRem && + durationsAreEqual(s1.TimeRem, s2.TimeRem, maxDeviationForDuration) && + s1.Progress == s2.Progress { + return true + } + return false +} + +func durationsAreEqual(d1 time.Duration, d2 time.Duration, maxDeviation time.Duration) bool { + return d2-d1 <= maxDeviation +} + +func ratesAreEqual(r1 int64, r2 int64, maxDeviation int64) bool { + sub := r1 - r2 + if sub < 0 { + sub = -sub + } + if sub <= maxDeviation { + return true + } + return false +} diff --git a/portal-loop/extracted/p/demo/flow/pkg_metadata.json b/portal-loop/extracted/p/demo/flow/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/flow/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/flow/util.gno b/portal-loop/extracted/p/demo/flow/util.gno new file mode 100644 index 00000000..891c8edc --- /dev/null +++ b/portal-loop/extracted/p/demo/flow/util.gno @@ -0,0 +1,67 @@ +// +// Written by Maxim Khitrov (November 2012) +// + +package flow + +import ( + "math" + "strconv" + "time" +) + +// clockRate is the resolution and precision of clock(). +const clockRate = 20 * time.Millisecond + +// czero is the process start time rounded down to the nearest clockRate +// increment. +var czero = time.Now().Round(clockRate) + +// clock returns a low resolution timestamp relative to the process start time. +func clock() time.Duration { + return time.Now().Round(clockRate).Sub(czero) +} + +// clockToTime converts a clock() timestamp to an absolute time.Time value. +func clockToTime(c time.Duration) time.Time { + return czero.Add(c) +} + +// clockRound returns d rounded to the nearest clockRate increment. +func clockRound(d time.Duration) time.Duration { + return (d + clockRate>>1) / clockRate * clockRate +} + +// round returns x rounded to the nearest int64 (non-negative values only). +func round(x float64) int64 { + if _, frac := math.Modf(x); frac >= 0.5 { + return int64(math.Ceil(x)) + } + return int64(math.Floor(x)) +} + +// Percent represents a percentage in increments of 1/1000th of a percent. +type Percent uint32 + +// percentOf calculates what percent of the total is x. +func percentOf(x, total float64) Percent { + if x < 0 || total <= 0 { + return 0 + } else if p := round(x / total * 1e5); p <= math.MaxUint32 { + return Percent(p) + } + return Percent(math.MaxUint32) +} + +func (p Percent) Float() float64 { + return float64(p) * 1e-3 +} + +func (p Percent) String() string { + var buf [12]byte + b := strconv.AppendUint(buf[:0], uint64(p)/1000, 10) + n := len(b) + b = strconv.AppendUint(b, 1000+uint64(p)%1000, 10) + b[n] = '.' + return string(append(b, '%')) +} diff --git a/portal-loop/extracted/p/demo/fqname/fqname.gno b/portal-loop/extracted/p/demo/fqname/fqname.gno new file mode 100644 index 00000000..d28453e5 --- /dev/null +++ b/portal-loop/extracted/p/demo/fqname/fqname.gno @@ -0,0 +1,72 @@ +// Package fqname provides utilities for handling fully qualified identifiers in +// Gno. A fully qualified identifier typically includes a package path followed +// by a dot (.) and then the name of a variable, function, type, or other +// package-level declaration. +package fqname + +import "strings" + +// Parse splits a fully qualified identifier into its package path and name +// components. It handles cases with and without slashes in the package path. +// +// pkgpath, name := fqname.Parse("gno.land/p/demo/avl.Tree") +// ufmt.Sprintf("Package: %s, Name: %s\n", id.Package, id.Name) +// // Output: Package: gno.land/p/demo/avl, Name: Tree +func Parse(fqname string) (pkgpath, name string) { + // Find the index of the last slash. + lastSlashIndex := strings.LastIndex(fqname, "/") + if lastSlashIndex == -1 { + // No slash found, handle it as a simple package name with dot notation. + dotIndex := strings.LastIndex(fqname, ".") + if dotIndex == -1 { + return fqname, "" + } + return fqname[:dotIndex], fqname[dotIndex+1:] + } + + // Get the part after the last slash. + afterSlash := fqname[lastSlashIndex+1:] + + // Check for a dot in the substring after the last slash. + dotIndex := strings.Index(afterSlash, ".") + if dotIndex == -1 { + // No dot found after the last slash + return fqname, "" + } + + // Split at the dot to separate the base and the suffix. + base := fqname[:lastSlashIndex+1+dotIndex] + suffix := afterSlash[dotIndex+1:] + + return base, suffix +} + +// Construct a qualified identifier. +// +// fqName := fqname.Construct("gno.land/r/demo/foo20", "GRC20") +// fmt.Println("Fully Qualified Name:", fqName) +// // Output: gno.land/r/demo/foo20.GRC20 +func Construct(pkgpath, name string) string { + // TODO: ensure pkgpath is valid - and as such last part does not contain a dot. + if name == "" { + return pkgpath + } + return pkgpath + "." + name +} + +// RenderLink creates a formatted link for a fully qualified identifier. +// If the package path starts with "gno.land", it converts it to a markdown link. +// If the domain is different or missing, it returns the input as is. +func RenderLink(pkgPath, slug string) string { + if strings.HasPrefix(pkgPath, "gno.land") { + pkgLink := strings.TrimPrefix(pkgPath, "gno.land") + if slug != "" { + return "[" + pkgPath + "](" + pkgLink + ")." + slug + } + return "[" + pkgPath + "](" + pkgLink + ")" + } + if slug != "" { + return pkgPath + "." + slug + } + return pkgPath +} diff --git a/portal-loop/extracted/p/demo/fqname/fqname_test.gno b/portal-loop/extracted/p/demo/fqname/fqname_test.gno new file mode 100644 index 00000000..55a22077 --- /dev/null +++ b/portal-loop/extracted/p/demo/fqname/fqname_test.gno @@ -0,0 +1,74 @@ +package fqname + +import ( + "testing" + + "gno.land/p/demo/uassert" +) + +func TestParse(t *testing.T) { + tests := []struct { + input string + expectedPkgPath string + expectedName string + }{ + {"gno.land/p/demo/avl.Tree", "gno.land/p/demo/avl", "Tree"}, + {"gno.land/p/demo/avl", "gno.land/p/demo/avl", ""}, + {"gno.land/p/demo/avl.Tree.Node", "gno.land/p/demo/avl", "Tree.Node"}, + {"gno.land/p/demo/avl/nested.Package.Func", "gno.land/p/demo/avl/nested", "Package.Func"}, + {"path/filepath.Split", "path/filepath", "Split"}, + {"path.Split", "path", "Split"}, + {"path/filepath", "path/filepath", ""}, + {"path", "path", ""}, + {"", "", ""}, + } + + for _, tt := range tests { + pkgpath, name := Parse(tt.input) + uassert.Equal(t, tt.expectedPkgPath, pkgpath, "Package path did not match") + uassert.Equal(t, tt.expectedName, name, "Name did not match") + } +} + +func TestConstruct(t *testing.T) { + tests := []struct { + pkgpath string + name string + expected string + }{ + {"gno.land/r/demo/foo20", "GRC20", "gno.land/r/demo/foo20.GRC20"}, + {"gno.land/r/demo/foo20", "", "gno.land/r/demo/foo20"}, + {"path", "", "path"}, + {"path", "Split", "path.Split"}, + {"path/filepath", "", "path/filepath"}, + {"path/filepath", "Split", "path/filepath.Split"}, + {"", "JustName", ".JustName"}, + {"", "", ""}, + } + + for _, tt := range tests { + result := Construct(tt.pkgpath, tt.name) + uassert.Equal(t, tt.expected, result, "Constructed FQName did not match expected") + } +} + +func TestRenderLink(t *testing.T) { + tests := []struct { + pkgPath string + slug string + expected string + }{ + {"gno.land/p/demo/avl", "Tree", "[gno.land/p/demo/avl](/p/demo/avl).Tree"}, + {"gno.land/p/demo/avl", "", "[gno.land/p/demo/avl](/p/demo/avl)"}, + {"github.com/a/b", "C", "github.com/a/b.C"}, + {"example.com/pkg", "Func", "example.com/pkg.Func"}, + {"gno.land/r/demo/foo20", "GRC20", "[gno.land/r/demo/foo20](/r/demo/foo20).GRC20"}, + {"gno.land/r/demo/foo20", "", "[gno.land/r/demo/foo20](/r/demo/foo20)"}, + {"", "", ""}, + } + + for _, tt := range tests { + result := RenderLink(tt.pkgPath, tt.slug) + uassert.Equal(t, tt.expected, result, "Rendered link did not match expected") + } +} diff --git a/portal-loop/extracted/p/demo/fqname/pkg_metadata.json b/portal-loop/extracted/p/demo/fqname/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/fqname/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/gnode/gnode.gno b/portal-loop/extracted/p/demo/gnode/gnode.gno new file mode 100644 index 00000000..4e95ba0d --- /dev/null +++ b/portal-loop/extracted/p/demo/gnode/gnode.gno @@ -0,0 +1,65 @@ +package gnode + +// XXX what about Gnodes signing on behalf of others? +// XXX like a multi-sig of Gnodes? + +type Name string + +type Gnode interface { + //---------------------------------------- + // Basic properties + GetName() Name + + //---------------------------------------- + // Affiliate Gnodes + NumAffiliates() int + GetAffiliates(Name) Affiliate + AddAffiliate(Affiliate) error // must be affiliated + RemAffiliate(Name) error // must have become unaffiliated + + //---------------------------------------- + // Signing + NumSignedDocuments() int + GetSignedDocument(idx int) Document + SignDocument(doc Document) (int, error) // index relative to signer + + //---------------------------------------- + // Rendering + RenderLines() []string +} + +type Affiliate struct { + Type string + Gnode Gnode + Tags []string +} + +type MyGnode struct { + Name + // Owners // voting set, something that gives authority of action. + // Treasury // + // Affiliates // + // Board // discussions + // Data // XXX ? +} + +type Affiliates []*Affiliate + +// Documents are equal if they compare equal. +// NOTE: requires all fields to be comparable. +type Document struct { + Authors string + // Timestamp + // Body + // Attachments +} + +// ACTIONS + +// * Lend tokens +// * Pay tokens +// * Administrate transferrable and non-transferrable tokens +// * Sum tokens +// * Passthrough dependencies +// * Code +// * ... diff --git a/portal-loop/extracted/p/demo/gnode/pkg_metadata.json b/portal-loop/extracted/p/demo/gnode/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/gnode/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/gnorkle/agent/pkg_metadata.json b/portal-loop/extracted/p/demo/gnorkle/agent/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/gnorkle/agent/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/gnorkle/agent/whitelist.gno b/portal-loop/extracted/p/demo/gnorkle/agent/whitelist.gno new file mode 100644 index 00000000..74d0d898 --- /dev/null +++ b/portal-loop/extracted/p/demo/gnorkle/agent/whitelist.gno @@ -0,0 +1,50 @@ +package agent + +import "gno.land/p/demo/avl" + +// Whitelist manages whitelisted agent addresses. +type Whitelist struct { + store *avl.Tree +} + +// ClearAddresses removes all addresses from the whitelist and puts into a state +// that indicates it is moot and has no whitelist defined. +func (m *Whitelist) ClearAddresses() { + m.store = nil +} + +// AddAddresses adds the given addresses to the whitelist. +func (m *Whitelist) AddAddresses(addresses []string) { + if m.store == nil { + m.store = avl.NewTree() + } + + for _, address := range addresses { + m.store.Set(address, struct{}{}) + } +} + +// RemoveAddress removes the given address from the whitelist if it exists. +func (m *Whitelist) RemoveAddress(address string) { + if m.store == nil { + return + } + + m.store.Remove(address) +} + +// HasDefinition returns true if the whitelist has a definition. It retuns false if +// `ClearAddresses` has been called without any subsequent `AddAddresses` calls, or +// if `AddAddresses` has never been called. +func (m Whitelist) HasDefinition() bool { + return m.store != nil +} + +// HasAddress returns true if the given address is in the whitelist. +func (m Whitelist) HasAddress(address string) bool { + if m.store == nil { + return false + } + + return m.store.Has(address) +} diff --git a/portal-loop/extracted/p/demo/gnorkle/agent/whitelist_test.gno b/portal-loop/extracted/p/demo/gnorkle/agent/whitelist_test.gno new file mode 100644 index 00000000..40c44b92 --- /dev/null +++ b/portal-loop/extracted/p/demo/gnorkle/agent/whitelist_test.gno @@ -0,0 +1,28 @@ +package agent_test + +import ( + "testing" + + "gno.land/p/demo/gnorkle/agent" + "gno.land/p/demo/uassert" +) + +func TestWhitelist(t *testing.T) { + var whitelist agent.Whitelist + + uassert.False(t, whitelist.HasDefinition(), "whitelist should not be defined initially") + + whitelist.AddAddresses([]string{"a", "b"}) + uassert.True(t, whitelist.HasAddress("a"), `whitelist should have address "a"`) + uassert.True(t, whitelist.HasAddress("b"), `whitelist should have address "b"`) + uassert.True(t, whitelist.HasDefinition(), "whitelist should be defined after adding addresses") + + whitelist.RemoveAddress("a") + uassert.False(t, whitelist.HasAddress("a"), `whitelist should not have address "a"`) + uassert.True(t, whitelist.HasAddress("b"), `whitelist should still have address "b"`) + + whitelist.ClearAddresses() + uassert.False(t, whitelist.HasAddress("a"), `whitelist cleared; should not have address "a"`) + uassert.False(t, whitelist.HasAddress("b"), `whitelist cleared; should still have address "b"`) + uassert.False(t, whitelist.HasDefinition(), "whitelist cleared; should not be defined") +} diff --git a/portal-loop/extracted/p/demo/gnorkle/feed/errors.gno b/portal-loop/extracted/p/demo/gnorkle/feed/errors.gno new file mode 100644 index 00000000..b4f71311 --- /dev/null +++ b/portal-loop/extracted/p/demo/gnorkle/feed/errors.gno @@ -0,0 +1,5 @@ +package feed + +import "errors" + +var ErrUndefined = errors.New("undefined feed") diff --git a/portal-loop/extracted/p/demo/gnorkle/feed/pkg_metadata.json b/portal-loop/extracted/p/demo/gnorkle/feed/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/gnorkle/feed/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/gnorkle/feed/task.gno b/portal-loop/extracted/p/demo/gnorkle/feed/task.gno new file mode 100644 index 00000000..a68f256c --- /dev/null +++ b/portal-loop/extracted/p/demo/gnorkle/feed/task.gno @@ -0,0 +1,7 @@ +package feed + +// Task is a unit of work that can be part of a `Feed` definition. Tasks +// are executed by agents. +type Task interface { + MarshalJSON() ([]byte, error) +} diff --git a/portal-loop/extracted/p/demo/gnorkle/feed/type.gno b/portal-loop/extracted/p/demo/gnorkle/feed/type.gno new file mode 100644 index 00000000..54db00b5 --- /dev/null +++ b/portal-loop/extracted/p/demo/gnorkle/feed/type.gno @@ -0,0 +1,16 @@ +package feed + +// Type indicates the type of a feed. +type Type int + +const ( + // TypeStatic indicates a feed cannot be changed once the first value is committed. + TypeStatic Type = iota + // TypeContinuous indicates a feed can continuously ingest values and will publish + // a new value on request using the values it has ingested. + TypeContinuous + // TypePeriodic indicates a feed can accept one or more values within a certain period + // and will proceed to commit these values at the end up each period to produce an + // aggregate value before starting a new period. + TypePeriodic +) diff --git a/portal-loop/extracted/p/demo/gnorkle/feed/value.gno b/portal-loop/extracted/p/demo/gnorkle/feed/value.gno new file mode 100644 index 00000000..cad1221b --- /dev/null +++ b/portal-loop/extracted/p/demo/gnorkle/feed/value.gno @@ -0,0 +1,9 @@ +package feed + +import "time" + +// Value represents a value published by a feed. The `Time` is when the value was published. +type Value struct { + String string + Time time.Time +} diff --git a/portal-loop/extracted/p/demo/gnorkle/feeds/static/feed.gno b/portal-loop/extracted/p/demo/gnorkle/feeds/static/feed.gno new file mode 100644 index 00000000..2c3aeec9 --- /dev/null +++ b/portal-loop/extracted/p/demo/gnorkle/feeds/static/feed.gno @@ -0,0 +1,159 @@ +package static + +import ( + "bufio" + "bytes" + "errors" + + "gno.land/p/demo/gnorkle/feed" + "gno.land/p/demo/gnorkle/gnorkle" + "gno.land/p/demo/gnorkle/ingesters/single" + "gno.land/p/demo/gnorkle/message" + "gno.land/p/demo/gnorkle/storage/simple" + "gno.land/p/demo/ufmt" +) + +// Feed is a static feed. +type Feed struct { + id string + isLocked bool + valueDataType string + ingester gnorkle.Ingester + storage gnorkle.Storage + tasks []feed.Task +} + +// NewFeed creates a new static feed. +func NewFeed( + id string, + valueDataType string, + ingester gnorkle.Ingester, + storage gnorkle.Storage, + tasks ...feed.Task, +) *Feed { + return &Feed{ + id: id, + valueDataType: valueDataType, + ingester: ingester, + storage: storage, + tasks: tasks, + } +} + +// NewSingleValueFeed is a convenience function for creating a static feed +// that autocommits a value after a single ingestion. +func NewSingleValueFeed( + id string, + valueDataType string, + tasks ...feed.Task, +) *Feed { + return NewFeed( + id, + valueDataType, + &single.ValueIngester{}, + simple.NewStorage(1), + tasks..., + ) +} + +// ID returns the feed's ID. +func (f Feed) ID() string { + return f.id +} + +// Type returns the feed's type. +func (f Feed) Type() feed.Type { + return feed.TypeStatic +} + +// Ingest ingests a message into the feed. It either adds the value to the ingester's +// pending values or commits the value to the storage. +func (f *Feed) Ingest(funcType message.FuncType, msg, providerAddress string) error { + if f == nil { + return feed.ErrUndefined + } + + if f.isLocked { + return errors.New("feed locked") + } + + switch funcType { + case message.FuncTypeIngest: + // Autocommit the ingester's value if it's a single value ingester + // because this is a static feed and this is the only value it will ever have. + if canAutoCommit, err := f.ingester.Ingest(msg, providerAddress); canAutoCommit && err == nil { + if err := f.ingester.CommitValue(f.storage, providerAddress); err != nil { + return err + } + + f.isLocked = true + } else if err != nil { + return err + } + + case message.FuncTypeCommit: + if err := f.ingester.CommitValue(f.storage, providerAddress); err != nil { + return err + } + + f.isLocked = true + + default: + return errors.New("invalid message function " + string(funcType)) + } + + return nil +} + +// Value returns the feed's latest value, it's data type, and whether or not it can +// be safely consumed. In this case it uses `f.isLocked` because, this being a static +// feed, it will only ever have one value; once that value is committed the feed is locked +// and there is a valid, non-empty value to consume. +func (f Feed) Value() (feed.Value, string, bool) { + return f.storage.GetLatest(), f.valueDataType, f.isLocked +} + +// MarshalJSON marshals the components of the feed that are needed for +// an agent to execute tasks and send values for ingestion. +func (f Feed) MarshalJSON() ([]byte, error) { + buf := new(bytes.Buffer) + w := bufio.NewWriter(buf) + + w.Write([]byte( + `{"id":"` + f.id + + `","type":"` + ufmt.Sprintf("%d", int(f.Type())) + + `","value_type":"` + f.valueDataType + + `","tasks":[`), + ) + + first := true + for _, task := range f.tasks { + if !first { + w.WriteString(",") + } + + taskJSON, err := task.MarshalJSON() + if err != nil { + return nil, err + } + + w.Write(taskJSON) + first = false + } + + w.Write([]byte("]}")) + w.Flush() + + return buf.Bytes(), nil +} + +// Tasks returns the feed's tasks. This allows task consumers to extract task +// contents without having to marshal the entire feed. +func (f Feed) Tasks() []feed.Task { + return f.tasks +} + +// IsActive returns true if the feed is accepting ingestion requests from agents. +func (f Feed) IsActive() bool { + return !f.isLocked +} diff --git a/portal-loop/extracted/p/demo/gnorkle/feeds/static/feed_test.gno b/portal-loop/extracted/p/demo/gnorkle/feeds/static/feed_test.gno new file mode 100644 index 00000000..98346ab4 --- /dev/null +++ b/portal-loop/extracted/p/demo/gnorkle/feeds/static/feed_test.gno @@ -0,0 +1,255 @@ +package static_test + +import ( + "errors" + "testing" + + "gno.land/p/demo/gnorkle/feed" + "gno.land/p/demo/gnorkle/feeds/static" + "gno.land/p/demo/gnorkle/gnorkle" + "gno.land/p/demo/gnorkle/ingester" + "gno.land/p/demo/gnorkle/message" + "gno.land/p/demo/gnorkle/storage/simple" + "gno.land/p/demo/uassert" + "gno.land/p/demo/urequire" +) + +type mockIngester struct { + canAutoCommit bool + ingestErr error + commitErr error + value string + providerAddress string +} + +func (i mockIngester) Type() ingester.Type { + return ingester.Type(0) +} + +func (i *mockIngester) Ingest(value, providerAddress string) (bool, error) { + if i.ingestErr != nil { + return false, i.ingestErr + } + + i.value = value + i.providerAddress = providerAddress + return i.canAutoCommit, nil +} + +func (i *mockIngester) CommitValue(storage gnorkle.Storage, providerAddress string) error { + if i.commitErr != nil { + return i.commitErr + } + + return storage.Put(i.value) +} + +func TestNewSingleValueFeed(t *testing.T) { + staticFeed := static.NewSingleValueFeed("1", "") + + uassert.Equal(t, "1", staticFeed.ID()) + uassert.Equal(t, int(feed.TypeStatic), int(staticFeed.Type())) +} + +func TestFeed_Ingest(t *testing.T) { + var undefinedFeed *static.Feed + err := undefinedFeed.Ingest("", "", "") + uassert.ErrorIs(t, err, feed.ErrUndefined) + + tests := []struct { + name string + ingester *mockIngester + verifyIsLocked bool + doCommit bool + funcType message.FuncType + msg string + providerAddress string + expFeedValueString string + expErrText string + expIsActive bool + }{ + { + name: "func invalid error", + ingester: &mockIngester{}, + funcType: message.FuncType("derp"), + expErrText: "invalid message function derp", + expIsActive: true, + }, + { + name: "func ingest ingest error", + ingester: &mockIngester{ + ingestErr: errors.New("ingest error"), + }, + funcType: message.FuncTypeIngest, + expErrText: "ingest error", + expIsActive: true, + }, + { + name: "func ingest commit error", + ingester: &mockIngester{ + commitErr: errors.New("commit error"), + canAutoCommit: true, + }, + funcType: message.FuncTypeIngest, + expErrText: "commit error", + expIsActive: true, + }, + { + name: "func commit commit error", + ingester: &mockIngester{ + commitErr: errors.New("commit error"), + canAutoCommit: true, + }, + funcType: message.FuncTypeCommit, + expErrText: "commit error", + expIsActive: true, + }, + { + name: "only ingest", + ingester: &mockIngester{}, + funcType: message.FuncTypeIngest, + msg: "still active feed", + providerAddress: "gno1234", + expIsActive: true, + }, + { + name: "ingest autocommit", + ingester: &mockIngester{canAutoCommit: true}, + funcType: message.FuncTypeIngest, + msg: "still active feed", + providerAddress: "gno1234", + expFeedValueString: "still active feed", + verifyIsLocked: true, + }, + { + name: "commit no value", + ingester: &mockIngester{}, + funcType: message.FuncTypeCommit, + msg: "shouldn't be stored", + verifyIsLocked: true, + }, + { + name: "ingest then commmit", + ingester: &mockIngester{}, + funcType: message.FuncTypeIngest, + msg: "blahblah", + doCommit: true, + expFeedValueString: "blahblah", + verifyIsLocked: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + staticFeed := static.NewFeed( + "1", + "string", + tt.ingester, + simple.NewStorage(1), + nil, + ) + + var errText string + if err := staticFeed.Ingest(tt.funcType, tt.msg, tt.providerAddress); err != nil { + errText = err.Error() + } + + urequire.Equal(t, tt.expErrText, errText) + + if tt.doCommit { + err := staticFeed.Ingest(message.FuncTypeCommit, "", "") + urequire.NoError(t, err, "follow up commit failed") + } + + if tt.verifyIsLocked { + errText = "" + if err := staticFeed.Ingest(tt.funcType, tt.msg, tt.providerAddress); err != nil { + errText = err.Error() + } + + urequire.Equal(t, "feed locked", errText) + } + + uassert.Equal(t, tt.providerAddress, tt.ingester.providerAddress) + + feedValue, dataType, isLocked := staticFeed.Value() + uassert.Equal(t, tt.expFeedValueString, feedValue.String) + uassert.Equal(t, "string", dataType) + uassert.Equal(t, tt.verifyIsLocked, isLocked) + uassert.Equal(t, tt.expIsActive, staticFeed.IsActive()) + }) + } +} + +type mockTask struct { + err error + value string +} + +func (t mockTask) MarshalJSON() ([]byte, error) { + if t.err != nil { + return nil, t.err + } + + return []byte(`{"value":"` + t.value + `"}`), nil +} + +func TestFeed_Tasks(t *testing.T) { + id := "99" + valueDataType := "int" + + tests := []struct { + name string + tasks []feed.Task + expErrText string + expJSON string + }{ + { + name: "no tasks", + expJSON: `{"id":"99","type":"0","value_type":"int","tasks":[]}`, + }, + { + name: "marshal error", + tasks: []feed.Task{ + mockTask{err: errors.New("marshal error")}, + }, + expErrText: "marshal error", + }, + { + name: "one task", + tasks: []feed.Task{ + mockTask{value: "single"}, + }, + expJSON: `{"id":"99","type":"0","value_type":"int","tasks":[{"value":"single"}]}`, + }, + { + name: "two tasks", + tasks: []feed.Task{ + mockTask{value: "first"}, + mockTask{value: "second"}, + }, + expJSON: `{"id":"99","type":"0","value_type":"int","tasks":[{"value":"first"},{"value":"second"}]}`, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + staticFeed := static.NewSingleValueFeed( + id, + valueDataType, + tt.tasks..., + ) + + urequire.Equal(t, len(tt.tasks), len(staticFeed.Tasks())) + + var errText string + json, err := staticFeed.MarshalJSON() + if err != nil { + errText = err.Error() + } + + urequire.Equal(t, tt.expErrText, errText) + urequire.Equal(t, tt.expJSON, string(json)) + }) + } +} diff --git a/portal-loop/extracted/p/demo/gnorkle/feeds/static/pkg_metadata.json b/portal-loop/extracted/p/demo/gnorkle/feeds/static/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/gnorkle/feeds/static/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/gnorkle/gnorkle/feed.gno b/portal-loop/extracted/p/demo/gnorkle/gnorkle/feed.gno new file mode 100644 index 00000000..9651eb92 --- /dev/null +++ b/portal-loop/extracted/p/demo/gnorkle/gnorkle/feed.gno @@ -0,0 +1,24 @@ +package gnorkle + +import ( + "gno.land/p/demo/gnorkle/feed" + "gno.land/p/demo/gnorkle/message" +) + +// Feed is an abstraction used by a gnorkle `Instance` to ingest data from +// agents and provide data feeds to consumers. +type Feed interface { + ID() string + Type() feed.Type + Value() (value feed.Value, dataType string, consumable bool) + Ingest(funcType message.FuncType, rawMessage, providerAddress string) error + MarshalJSON() ([]byte, error) + Tasks() []feed.Task + IsActive() bool +} + +// FeedWithWhitelist associates a `Whitelist` with a `Feed`. +type FeedWithWhitelist struct { + Feed + Whitelist +} diff --git a/portal-loop/extracted/p/demo/gnorkle/gnorkle/ingester.gno b/portal-loop/extracted/p/demo/gnorkle/gnorkle/ingester.gno new file mode 100644 index 00000000..da8ce9bd --- /dev/null +++ b/portal-loop/extracted/p/demo/gnorkle/gnorkle/ingester.gno @@ -0,0 +1,11 @@ +package gnorkle + +import "gno.land/p/demo/gnorkle/ingester" + +// Ingester is the abstraction that allows a `Feed` to ingest data from agents +// and commit it to storage using zero or more intermediate aggregation steps. +type Ingester interface { + Type() ingester.Type + Ingest(value, providerAddress string) (canAutoCommit bool, err error) + CommitValue(storage Storage, providerAddress string) error +} diff --git a/portal-loop/extracted/p/demo/gnorkle/gnorkle/instance.gno b/portal-loop/extracted/p/demo/gnorkle/gnorkle/instance.gno new file mode 100644 index 00000000..22746d56 --- /dev/null +++ b/portal-loop/extracted/p/demo/gnorkle/gnorkle/instance.gno @@ -0,0 +1,239 @@ +package gnorkle + +import ( + "errors" + "std" + "strings" + + "gno.land/p/demo/avl" + "gno.land/p/demo/gnorkle/agent" + "gno.land/p/demo/gnorkle/feed" + "gno.land/p/demo/gnorkle/message" +) + +// Instance is a single instance of an oracle. +type Instance struct { + feeds *avl.Tree + whitelist agent.Whitelist +} + +// NewInstance creates a new instance of an oracle. +func NewInstance() *Instance { + return &Instance{ + feeds: avl.NewTree(), + } +} + +func assertValidID(id string) error { + if len(id) == 0 { + return errors.New("feed ids cannot be empty") + } + + if strings.Contains(id, ",") { + return errors.New("feed ids cannot contain commas") + } + + return nil +} + +func (i *Instance) assertFeedDoesNotExist(id string) error { + if i.feeds.Has(id) { + return errors.New("feed already exists") + } + + return nil +} + +// AddFeeds adds feeds to the instance with empty whitelists. +func (i *Instance) AddFeeds(feeds ...Feed) error { + for _, feed := range feeds { + if err := assertValidID(feed.ID()); err != nil { + return err + } + + if err := i.assertFeedDoesNotExist(feed.ID()); err != nil { + return err + } + + i.feeds.Set( + feed.ID(), + FeedWithWhitelist{ + Whitelist: new(agent.Whitelist), + Feed: feed, + }, + ) + } + + return nil +} + +// AddFeedsWithWhitelists adds feeds to the instance with the given whitelists. +func (i *Instance) AddFeedsWithWhitelists(feeds ...FeedWithWhitelist) error { + for _, feed := range feeds { + if err := i.assertFeedDoesNotExist(feed.ID()); err != nil { + return err + } + if err := assertValidID(feed.ID()); err != nil { + return err + } + + i.feeds.Set( + feed.ID(), + FeedWithWhitelist{ + Whitelist: feed.Whitelist, + Feed: feed, + }, + ) + } + + return nil +} + +// RemoveFeed removes a feed from the instance. +func (i *Instance) RemoveFeed(id string) { + i.feeds.Remove(id) +} + +// PostMessageHandler is a type that allows for post-processing of feed state after a feed +// ingests a message from an agent. +type PostMessageHandler interface { + Handle(i *Instance, funcType message.FuncType, feed Feed) error +} + +// HandleMessage handles a message from an agent and routes to either the logic that returns +// feed definitions or the logic that allows a feed to ingest a message. +// +// TODO: Consider further message types that could allow administrative action such as modifying +// a feed's whitelist without the owner of this oracle having to maintain a reference to it. +func (i *Instance) HandleMessage(msg string, postHandler PostMessageHandler) (string, error) { + caller := string(std.GetOrigCaller()) + + funcType, msg := message.ParseFunc(msg) + + switch funcType { + case message.FuncTypeRequest: + return i.GetFeedDefinitions(caller) + + default: + id, msg := message.ParseID(msg) + if err := assertValidID(id); err != nil { + return "", err + } + + feedWithWhitelist, err := i.getFeedWithWhitelist(id) + if err != nil { + return "", err + } + + if !addressIsWhitelisted(&i.whitelist, feedWithWhitelist, caller, nil) { + return "", errors.New("caller not whitelisted") + } + + if err := feedWithWhitelist.Ingest(funcType, msg, caller); err != nil { + return "", err + } + + if postHandler != nil { + postHandler.Handle(i, funcType, feedWithWhitelist) + } + } + + return "", nil +} + +func (i *Instance) getFeed(id string) (Feed, error) { + untypedFeed, ok := i.feeds.Get(id) + if !ok { + return nil, errors.New("invalid ingest id: " + id) + } + + feed, ok := untypedFeed.(Feed) + if !ok { + return nil, errors.New("invalid feed type") + } + + return feed, nil +} + +func (i *Instance) getFeedWithWhitelist(id string) (FeedWithWhitelist, error) { + untypedFeedWithWhitelist, ok := i.feeds.Get(id) + if !ok { + return FeedWithWhitelist{}, errors.New("invalid ingest id: " + id) + } + + feedWithWhitelist, ok := untypedFeedWithWhitelist.(FeedWithWhitelist) + if !ok { + return FeedWithWhitelist{}, errors.New("invalid feed with whitelist type") + } + + return feedWithWhitelist, nil +} + +// GetFeedValue returns the most recently published value of a feed along with a string +// representation of the value's type and boolean indicating whether the value is +// okay for consumption. +func (i *Instance) GetFeedValue(id string) (feed.Value, string, bool, error) { + foundFeed, err := i.getFeed(id) + if err != nil { + return feed.Value{}, "", false, err + } + + value, valueType, consumable := foundFeed.Value() + return value, valueType, consumable, nil +} + +// GetFeedDefinitions returns a JSON string representing the feed definitions for which the given +// agent address is whitelisted to provide values for ingestion. +func (i *Instance) GetFeedDefinitions(forAddress string) (string, error) { + instanceHasAddressWhitelisted := !i.whitelist.HasDefinition() || i.whitelist.HasAddress(forAddress) + + buf := new(strings.Builder) + buf.WriteString("[") + first := true + var err error + + // The boolean value returned by this callback function indicates whether to stop iterating. + i.feeds.Iterate("", "", func(_ string, value interface{}) bool { + feedWithWhitelist, ok := value.(FeedWithWhitelist) + if !ok { + err = errors.New("invalid feed type") + return true + } + + // Don't give agents the ability to try to publish to inactive feeds. + if !feedWithWhitelist.IsActive() { + return false + } + + // Skip feeds the address is not whitelisted for. + if !addressIsWhitelisted(&i.whitelist, feedWithWhitelist, forAddress, &instanceHasAddressWhitelisted) { + return false + } + + var taskBytes []byte + if taskBytes, err = feedWithWhitelist.Feed.MarshalJSON(); err != nil { + return true + } + + // Guard against any tasks that shouldn't be returned; maybe they are not active because they have + // already been completed. + if len(taskBytes) == 0 { + return false + } + + if !first { + buf.WriteString(",") + } + + first = false + buf.Write(taskBytes) + return true + }) + + if err != nil { + return "", err + } + + buf.WriteString("]") + return buf.String(), nil +} diff --git a/portal-loop/extracted/p/demo/gnorkle/gnorkle/pkg_metadata.json b/portal-loop/extracted/p/demo/gnorkle/gnorkle/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/gnorkle/gnorkle/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/gnorkle/gnorkle/storage.gno b/portal-loop/extracted/p/demo/gnorkle/gnorkle/storage.gno new file mode 100644 index 00000000..d8c8e173 --- /dev/null +++ b/portal-loop/extracted/p/demo/gnorkle/gnorkle/storage.gno @@ -0,0 +1,11 @@ +package gnorkle + +import "gno.land/p/demo/gnorkle/feed" + +// Storage defines how published feed values should be read +// and written. +type Storage interface { + Put(value string) error + GetLatest() feed.Value + GetHistory() []feed.Value +} diff --git a/portal-loop/extracted/p/demo/gnorkle/gnorkle/whitelist.gno b/portal-loop/extracted/p/demo/gnorkle/gnorkle/whitelist.gno new file mode 100644 index 00000000..321a0467 --- /dev/null +++ b/portal-loop/extracted/p/demo/gnorkle/gnorkle/whitelist.gno @@ -0,0 +1,96 @@ +package gnorkle + +// Whitelist is used to manage which agents are allowed to interact. +type Whitelist interface { + ClearAddresses() + AddAddresses(addresses []string) + RemoveAddress(address string) + HasDefinition() bool + HasAddress(address string) bool +} + +// ClearWhitelist clears the whitelist of the instance or feed depending on the feed ID. +func (i *Instance) ClearWhitelist(feedID string) error { + if feedID == "" { + i.whitelist.ClearAddresses() + return nil + } + + feedWithWhitelist, err := i.getFeedWithWhitelist(feedID) + if err != nil { + return err + } + + feedWithWhitelist.ClearAddresses() + return nil +} + +// AddToWhitelist adds the given addresses to the whitelist of the instance or feed depending on the feed ID. +func (i *Instance) AddToWhitelist(feedID string, addresses []string) error { + if feedID == "" { + i.whitelist.AddAddresses(addresses) + return nil + } + + feedWithWhitelist, err := i.getFeedWithWhitelist(feedID) + if err != nil { + return err + } + + feedWithWhitelist.AddAddresses(addresses) + return nil +} + +// RemoveFromWhitelist removes the given address from the whitelist of the instance or feed depending on the feed ID. +func (i *Instance) RemoveFromWhitelist(feedID string, address string) error { + if feedID == "" { + i.whitelist.RemoveAddress(address) + return nil + } + + feedWithWhitelist, err := i.getFeedWithWhitelist(feedID) + if err != nil { + return err + } + + feedWithWhitelist.RemoveAddress(address) + return nil +} + +// addressWhiteListed returns true if: +// - the feed has a white list and the address is whitelisted, or +// - the feed has no white list and the instance has a white list and the address is whitelisted, or +// - the feed has no white list and the instance has no white list. +func addressIsWhitelisted(instanceWhitelist, feedWhitelist Whitelist, address string, instanceWhitelistedOverride *bool) bool { + // A feed whitelist takes priority, so it will return false if the feed has a whitelist and the caller is + // not a part of it. An empty whitelist defers to the instance whitelist. + if feedWhitelist != nil { + if feedWhitelist.HasDefinition() && !feedWhitelist.HasAddress(address) { + return false + } + + // Getting to this point means that one of the following is true: + // - the feed has no defined whitelist (so it can't possibly have the address whitelisted) + // - the feed has a defined whitelist and the caller is a part of it + // + // In this case, we can be sure that the boolean indicating whether the feed has this address whitelisted + // is equivalent to the boolean indicating whether the feed has a defined whitelist. + if feedWhitelist.HasDefinition() { + return true + } + } + + if instanceWhitelistedOverride != nil { + return *instanceWhitelistedOverride + } + + // We were unable able to determine whether this address is allowed after looking at the feed whitelist, + // so fall back to the instance whitelist. A complete absence of values in the instance whitelist means + // that the instance has no whitelist so we can return true because everything is allowed by default. + if instanceWhitelist == nil || !instanceWhitelist.HasDefinition() { + return true + } + + // The instance whitelist is defined so if the address is present then it is allowed. + return instanceWhitelist.HasAddress(address) +} diff --git a/portal-loop/extracted/p/demo/gnorkle/ingester/errors.gno b/portal-loop/extracted/p/demo/gnorkle/ingester/errors.gno new file mode 100644 index 00000000..8dcedcec --- /dev/null +++ b/portal-loop/extracted/p/demo/gnorkle/ingester/errors.gno @@ -0,0 +1,5 @@ +package ingester + +import "errors" + +var ErrUndefined = errors.New("ingester undefined") diff --git a/portal-loop/extracted/p/demo/gnorkle/ingester/pkg_metadata.json b/portal-loop/extracted/p/demo/gnorkle/ingester/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/gnorkle/ingester/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/gnorkle/ingester/type.gno b/portal-loop/extracted/p/demo/gnorkle/ingester/type.gno new file mode 100644 index 00000000..a0ddef9c --- /dev/null +++ b/portal-loop/extracted/p/demo/gnorkle/ingester/type.gno @@ -0,0 +1,11 @@ +package ingester + +// Type indicates an ingester type. +type Type int + +const ( + // TypeSingle indicates an ingester that can only ingest a single within a given period or no period. + TypeSingle Type = iota + // TypeMulti indicates an ingester that can ingest multiple within a given period or no period + TypeMulti +) diff --git a/portal-loop/extracted/p/demo/gnorkle/ingesters/single/ingester.gno b/portal-loop/extracted/p/demo/gnorkle/ingesters/single/ingester.gno new file mode 100644 index 00000000..4b437834 --- /dev/null +++ b/portal-loop/extracted/p/demo/gnorkle/ingesters/single/ingester.gno @@ -0,0 +1,35 @@ +package single + +import ( + "gno.land/p/demo/gnorkle/gnorkle" + "gno.land/p/demo/gnorkle/ingester" +) + +// ValueIngester is an ingester that ingests a single value. +type ValueIngester struct { + value string +} + +// Type returns the type of the ingester. +func (i *ValueIngester) Type() ingester.Type { + return ingester.TypeSingle +} + +// Ingest ingests a value provided by the given agent address. +func (i *ValueIngester) Ingest(value, providerAddress string) (bool, error) { + if i == nil { + return false, ingester.ErrUndefined + } + + i.value = value + return true, nil +} + +// CommitValue commits the ingested value to the given storage instance. +func (i *ValueIngester) CommitValue(valueStorer gnorkle.Storage, providerAddress string) error { + if i == nil { + return ingester.ErrUndefined + } + + return valueStorer.Put(i.value) +} diff --git a/portal-loop/extracted/p/demo/gnorkle/ingesters/single/ingester_test.gno b/portal-loop/extracted/p/demo/gnorkle/ingesters/single/ingester_test.gno new file mode 100644 index 00000000..3835e20e --- /dev/null +++ b/portal-loop/extracted/p/demo/gnorkle/ingesters/single/ingester_test.gno @@ -0,0 +1,36 @@ +package single_test + +import ( + "testing" + + "gno.land/p/demo/gnorkle/ingester" + "gno.land/p/demo/gnorkle/ingesters/single" + "gno.land/p/demo/gnorkle/storage/simple" + "gno.land/p/demo/uassert" +) + +func TestValueIngester(t *testing.T) { + storage := simple.NewStorage(1) + + var undefinedIngester *single.ValueIngester + _, err := undefinedIngester.Ingest("asdf", "gno11111") + uassert.ErrorIs(t, err, ingester.ErrUndefined, "undefined ingester call to Ingest should return ingester.ErrUndefined") + + err = undefinedIngester.CommitValue(storage, "gno11111") + uassert.ErrorIs(t, err, ingester.ErrUndefined, "undefined ingester call to CommitValue should return ingester.ErrUndefined") + + var valueIngester single.ValueIngester + typ := valueIngester.Type() + uassert.Equal(t, int(ingester.TypeSingle), int(typ), "single value ingester should return type ingester.TypeSingle") + + ingestValue := "value" + autocommit, err := valueIngester.Ingest(ingestValue, "gno11111") + uassert.True(t, autocommit, "single value ingester should return autocommit true") + uassert.NoError(t, err) + + err = valueIngester.CommitValue(storage, "gno11111") + uassert.NoError(t, err) + + latestValue := storage.GetLatest() + uassert.Equal(t, ingestValue, latestValue.String) +} diff --git a/portal-loop/extracted/p/demo/gnorkle/ingesters/single/pkg_metadata.json b/portal-loop/extracted/p/demo/gnorkle/ingesters/single/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/gnorkle/ingesters/single/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/gnorkle/message/parse.gno b/portal-loop/extracted/p/demo/gnorkle/message/parse.gno new file mode 100644 index 00000000..633dcc38 --- /dev/null +++ b/portal-loop/extracted/p/demo/gnorkle/message/parse.gno @@ -0,0 +1,25 @@ +package message + +import "strings" + +// ParseFunc parses a raw message and returns the message function +// type extracted from the remainder of the message. +func ParseFunc(rawMsg string) (FuncType, string) { + funcType, remainder := parseFirstToken(rawMsg) + return FuncType(funcType), remainder +} + +// ParseID parses a raw message and returns the ID extracted from +// the remainder of the message. +func ParseID(rawMsg string) (string, string) { + return parseFirstToken(rawMsg) +} + +func parseFirstToken(rawMsg string) (string, string) { + msgParts := strings.SplitN(rawMsg, ",", 2) + if len(msgParts) < 2 { + return msgParts[0], "" + } + + return msgParts[0], msgParts[1] +} diff --git a/portal-loop/extracted/p/demo/gnorkle/message/parse_test.gno b/portal-loop/extracted/p/demo/gnorkle/message/parse_test.gno new file mode 100644 index 00000000..eab60c10 --- /dev/null +++ b/portal-loop/extracted/p/demo/gnorkle/message/parse_test.gno @@ -0,0 +1,47 @@ +package message_test + +import ( + "testing" + + "gno.land/p/demo/gnorkle/message" + "gno.land/p/demo/uassert" +) + +func TestParseFunc(t *testing.T) { + tests := []struct { + name string + input string + expFuncType message.FuncType + expRemainder string + }{ + { + name: "empty", + }, + { + name: "func only", + input: "ingest", + expFuncType: message.FuncTypeIngest, + }, + { + name: "func with short remainder", + input: "commit,asdf", + expFuncType: message.FuncTypeCommit, + expRemainder: "asdf", + }, + { + name: "func with long remainder", + input: "request,hello,world,goodbye", + expFuncType: message.FuncTypeRequest, + expRemainder: "hello,world,goodbye", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + funcType, remainder := message.ParseFunc(tt.input) + + uassert.Equal(t, string(tt.expFuncType), string(funcType)) + uassert.Equal(t, tt.expRemainder, remainder) + }) + } +} diff --git a/portal-loop/extracted/p/demo/gnorkle/message/pkg_metadata.json b/portal-loop/extracted/p/demo/gnorkle/message/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/gnorkle/message/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/gnorkle/message/type.gno b/portal-loop/extracted/p/demo/gnorkle/message/type.gno new file mode 100644 index 00000000..a80e568e --- /dev/null +++ b/portal-loop/extracted/p/demo/gnorkle/message/type.gno @@ -0,0 +1,15 @@ +package message + +// FuncType is the type of function that is being called by the agent. +type FuncType string + +const ( + // FuncTypeIngest means the agent is sending data for ingestion. + FuncTypeIngest FuncType = "ingest" + // FuncTypeCommit means the agent is requesting a feed commit the transitive data + // being held by its ingester. + FuncTypeCommit FuncType = "commit" + // FuncTypeRequest means the agent is requesting feed definitions for all those + // that it is whitelisted to provide data for. + FuncTypeRequest FuncType = "request" +) diff --git a/portal-loop/extracted/p/demo/gnorkle/storage/errors.gno b/portal-loop/extracted/p/demo/gnorkle/storage/errors.gno new file mode 100644 index 00000000..d3880872 --- /dev/null +++ b/portal-loop/extracted/p/demo/gnorkle/storage/errors.gno @@ -0,0 +1,5 @@ +package storage + +import "errors" + +var ErrUndefined = errors.New("undefined storage") diff --git a/portal-loop/extracted/p/demo/gnorkle/storage/pkg_metadata.json b/portal-loop/extracted/p/demo/gnorkle/storage/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/gnorkle/storage/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/gnorkle/storage/simple/pkg_metadata.json b/portal-loop/extracted/p/demo/gnorkle/storage/simple/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/gnorkle/storage/simple/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/gnorkle/storage/simple/storage.gno b/portal-loop/extracted/p/demo/gnorkle/storage/simple/storage.gno new file mode 100644 index 00000000..3f7d60e4 --- /dev/null +++ b/portal-loop/extracted/p/demo/gnorkle/storage/simple/storage.gno @@ -0,0 +1,56 @@ +package simple + +import ( + "time" + + "gno.land/p/demo/gnorkle/feed" + "gno.land/p/demo/gnorkle/storage" +) + +// Storage is simple, bounded storage for published feed values. +type Storage struct { + values []feed.Value + maxValues uint +} + +// NewStorage creates a new Storage with the given maximum number of values. +// If maxValues is 0, the storage is bounded to a size of one. If this is not desirable, +// then don't provide a value of 0. +func NewStorage(maxValues uint) *Storage { + if maxValues == 0 { + maxValues = 1 + } + + return &Storage{ + maxValues: maxValues, + } +} + +// Put adds a new value to the storage. If the storage is full, the oldest value +// is removed. If maxValues is 0, the storage is bounded to a size of one. +func (s *Storage) Put(value string) error { + if s == nil { + return storage.ErrUndefined + } + + s.values = append(s.values, feed.Value{String: value, Time: time.Now()}) + if uint(len(s.values)) > s.maxValues { + s.values = s.values[1:] + } + + return nil +} + +// GetLatest returns the most recently added value, or an empty value if none exist. +func (s Storage) GetLatest() feed.Value { + if len(s.values) == 0 { + return feed.Value{} + } + + return s.values[len(s.values)-1] +} + +// GetHistory returns all values in the storage, from oldest to newest. +func (s Storage) GetHistory() []feed.Value { + return s.values +} diff --git a/portal-loop/extracted/p/demo/gnorkle/storage/simple/storage_test.gno b/portal-loop/extracted/p/demo/gnorkle/storage/simple/storage_test.gno new file mode 100644 index 00000000..4d831af6 --- /dev/null +++ b/portal-loop/extracted/p/demo/gnorkle/storage/simple/storage_test.gno @@ -0,0 +1,70 @@ +package simple_test + +import ( + "testing" + + "gno.land/p/demo/gnorkle/storage" + "gno.land/p/demo/gnorkle/storage/simple" + "gno.land/p/demo/uassert" + "gno.land/p/demo/ufmt" + "gno.land/p/demo/urequire" +) + +func TestStorage(t *testing.T) { + var undefinedStorage *simple.Storage + err := undefinedStorage.Put("") + uassert.ErrorIs(t, err, storage.ErrUndefined, "expected storage.ErrUndefined on undefined storage") + + tests := []struct { + name string + valuesToPut []string + expLatestValueString string + expLatestValueTimeIsZero bool + expHistoricalValueStrings []string + }{ + { + name: "empty", + expLatestValueTimeIsZero: true, + }, + { + name: "one value", + valuesToPut: []string{"one"}, + expLatestValueString: "one", + expHistoricalValueStrings: []string{"one"}, + }, + { + name: "two values", + valuesToPut: []string{"one", "two"}, + expLatestValueString: "two", + expHistoricalValueStrings: []string{"one", "two"}, + }, + { + name: "three values", + valuesToPut: []string{"one", "two", "three"}, + expLatestValueString: "three", + expHistoricalValueStrings: []string{"two", "three"}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + simpleStorage := simple.NewStorage(2) + for _, value := range tt.valuesToPut { + err := simpleStorage.Put(value) + urequire.NoError(t, err, "unexpected error putting value in storage") + } + + latestValue := simpleStorage.GetLatest() + uassert.Equal(t, tt.expLatestValueString, latestValue.String) + uassert.Equal(t, tt.expLatestValueTimeIsZero, latestValue.Time.IsZero()) + + historicalValues := simpleStorage.GetHistory() + urequire.Equal(t, len(tt.expHistoricalValueStrings), len(historicalValues), "historical values length does not match") + + for i, expValue := range tt.expHistoricalValueStrings { + uassert.Equal(t, historicalValues[i].String, expValue) + urequire.False(t, historicalValues[i].Time.IsZero(), ufmt.Sprintf("unexpeced zero time for historical value at index %d", i)) + } + }) + } +} diff --git a/portal-loop/extracted/p/demo/grc/exts/pkg_metadata.json b/portal-loop/extracted/p/demo/grc/exts/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/grc/exts/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/grc/exts/token_metadata.gno b/portal-loop/extracted/p/demo/grc/exts/token_metadata.gno new file mode 100644 index 00000000..35cb1902 --- /dev/null +++ b/portal-loop/extracted/p/demo/grc/exts/token_metadata.gno @@ -0,0 +1,13 @@ +package exts + +type TokenMetadata interface { + // Returns the name of the token. + GetName() string + + // Returns the symbol of the token, usually a shorter version of the + // name. + GetSymbol() string + + // Returns the decimals places of the token. + GetDecimals() uint +} diff --git a/portal-loop/extracted/p/demo/grc/grc1155/README.md b/portal-loop/extracted/p/demo/grc/grc1155/README.md new file mode 100644 index 00000000..d74f9286 --- /dev/null +++ b/portal-loop/extracted/p/demo/grc/grc1155/README.md @@ -0,0 +1,9 @@ +# GRC-1155 Spec: Multi Token Standard + +GRC1155 is a specification for managing multiple tokens based on Gnoland. The name and design is based on Ethereum's ERC1155 standard. + +## See also: + +[ERC-1155 Spec][erc-1155] + +[erc-1155]: https://eips.ethereum.org/EIPS/eip-1155 \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/grc/grc1155/basic_grc1155_token.gno b/portal-loop/extracted/p/demo/grc/grc1155/basic_grc1155_token.gno new file mode 100644 index 00000000..f152ee90 --- /dev/null +++ b/portal-loop/extracted/p/demo/grc/grc1155/basic_grc1155_token.gno @@ -0,0 +1,347 @@ +package grc1155 + +import ( + "std" + + "gno.land/p/demo/avl" + "gno.land/p/demo/ufmt" +) + +type basicGRC1155Token struct { + uri string + balances avl.Tree // "TokenId:Address" -> uint64 + operatorApprovals avl.Tree // "OwnerAddress:OperatorAddress" -> bool +} + +var _ IGRC1155 = (*basicGRC1155Token)(nil) + +// Returns new basic GRC1155 token +func NewBasicGRC1155Token(uri string) *basicGRC1155Token { + return &basicGRC1155Token{ + uri: uri, + balances: avl.Tree{}, + operatorApprovals: avl.Tree{}, + } +} + +func (s *basicGRC1155Token) Uri() string { return s.uri } + +// BalanceOf returns the input address's balance of the token type requested +func (s *basicGRC1155Token) BalanceOf(addr std.Address, tid TokenID) (uint64, error) { + if !isValidAddress(addr) { + return 0, ErrInvalidAddress + } + + key := string(tid) + ":" + addr.String() + balance, found := s.balances.Get(key) + if !found { + return 0, nil + } + + return balance.(uint64), nil +} + +// BalanceOfBatch returns the balance of multiple account/token pairs +func (s *basicGRC1155Token) BalanceOfBatch(owners []std.Address, batch []TokenID) ([]uint64, error) { + if len(owners) != len(batch) { + return nil, ErrMismatchLength + } + + balanceOfBatch := make([]uint64, len(owners)) + + for i := 0; i < len(owners); i++ { + balanceOfBatch[i], _ = s.BalanceOf(owners[i], batch[i]) + } + + return balanceOfBatch, nil +} + +// SetApprovalForAll can approve the operator to operate on all tokens +func (s *basicGRC1155Token) SetApprovalForAll(operator std.Address, approved bool) error { + if !isValidAddress(operator) { + return ErrInvalidAddress + } + + caller := std.GetOrigCaller() + return s.setApprovalForAll(caller, operator, approved) +} + +// IsApprovedForAll returns true if operator is the owner or is approved for all by the owner. +// Otherwise, returns false +func (s *basicGRC1155Token) IsApprovedForAll(owner, operator std.Address) bool { + if operator == owner { + return true + } + key := owner.String() + ":" + operator.String() + _, found := s.operatorApprovals.Get(key) + if !found { + return false + } + + return true +} + +// Safely transfers `tokenId` token from `from` to `to`, checking that +// contract recipients are aware of the GRC1155 protocol to prevent +// tokens from being forever locked. +func (s *basicGRC1155Token) SafeTransferFrom(from, to std.Address, tid TokenID, amount uint64) error { + caller := std.GetOrigCaller() + if !s.IsApprovedForAll(caller, from) { + return ErrCallerIsNotOwnerOrApproved + } + + err := s.safeBatchTransferFrom(from, to, []TokenID{tid}, []uint64{amount}) + if err != nil { + return err + } + + if !s.doSafeTransferAcceptanceCheck(caller, from, to, tid, amount) { + return ErrTransferToRejectedOrNonGRC1155Receiver + } + + emit(&TransferSingleEvent{caller, from, to, tid, amount}) + + return nil +} + +// Safely transfers a `batch` of tokens from `from` to `to`, checking that +// contract recipients are aware of the GRC1155 protocol to prevent +// tokens from being forever locked. +func (s *basicGRC1155Token) SafeBatchTransferFrom(from, to std.Address, batch []TokenID, amounts []uint64) error { + caller := std.GetOrigCaller() + if !s.IsApprovedForAll(caller, from) { + return ErrCallerIsNotOwnerOrApproved + } + + err := s.safeBatchTransferFrom(from, to, batch, amounts) + if err != nil { + return err + } + + if !s.doSafeBatchTransferAcceptanceCheck(caller, from, to, batch, amounts) { + return ErrTransferToRejectedOrNonGRC1155Receiver + } + + emit(&TransferBatchEvent{caller, from, to, batch, amounts}) + + return nil +} + +// Creates `amount` tokens of token type `id`, and assigns them to `to`. Also checks that +// contract recipients are using GRC1155 protocol. +func (s *basicGRC1155Token) SafeMint(to std.Address, tid TokenID, amount uint64) error { + caller := std.GetOrigCaller() + + err := s.mintBatch(to, []TokenID{tid}, []uint64{amount}) + if err != nil { + return err + } + + if !s.doSafeTransferAcceptanceCheck(caller, zeroAddress, to, tid, amount) { + return ErrTransferToRejectedOrNonGRC1155Receiver + } + + emit(&TransferSingleEvent{caller, zeroAddress, to, tid, amount}) + + return nil +} + +// Batch version of `SafeMint()`. Also checks that +// contract recipients are using GRC1155 protocol. +func (s *basicGRC1155Token) SafeBatchMint(to std.Address, batch []TokenID, amounts []uint64) error { + caller := std.GetOrigCaller() + + err := s.mintBatch(to, batch, amounts) + if err != nil { + return err + } + + if !s.doSafeBatchTransferAcceptanceCheck(caller, zeroAddress, to, batch, amounts) { + return ErrTransferToRejectedOrNonGRC1155Receiver + } + + emit(&TransferBatchEvent{caller, zeroAddress, to, batch, amounts}) + + return nil +} + +// Destroys `amount` tokens of token type `id` from `from`. +func (s *basicGRC1155Token) Burn(from std.Address, tid TokenID, amount uint64) error { + caller := std.GetOrigCaller() + + err := s.burnBatch(from, []TokenID{tid}, []uint64{amount}) + if err != nil { + return err + } + + emit(&TransferSingleEvent{caller, from, zeroAddress, tid, amount}) + + return nil +} + +// Batch version of `Burn()` +func (s *basicGRC1155Token) BatchBurn(from std.Address, batch []TokenID, amounts []uint64) error { + caller := std.GetOrigCaller() + + err := s.burnBatch(from, batch, amounts) + if err != nil { + return err + } + + emit(&TransferBatchEvent{caller, from, zeroAddress, batch, amounts}) + + return nil +} + +/* Helper methods */ + +// Helper for SetApprovalForAll(): approve `operator` to operate on all of `owner` tokens +func (s *basicGRC1155Token) setApprovalForAll(owner, operator std.Address, approved bool) error { + if owner == operator { + return nil + } + + key := owner.String() + ":" + operator.String() + if approved { + s.operatorApprovals.Set(key, approved) + } else { + s.operatorApprovals.Remove(key) + } + + emit(&ApprovalForAllEvent{owner, operator, approved}) + + return nil +} + +// Helper for SafeTransferFrom() and SafeBatchTransferFrom() +func (s *basicGRC1155Token) safeBatchTransferFrom(from, to std.Address, batch []TokenID, amounts []uint64) error { + if len(batch) != len(amounts) { + return ErrMismatchLength + } + if !isValidAddress(from) || !isValidAddress(to) { + return ErrInvalidAddress + } + if from == to { + return ErrCannotTransferToSelf + } + + caller := std.GetOrigCaller() + s.beforeTokenTransfer(caller, from, to, batch, amounts) + + for i := 0; i < len(batch); i++ { + tid := batch[i] + amount := amounts[i] + fromBalance, err := s.BalanceOf(from, tid) + if err != nil { + return err + } + if fromBalance < amount { + return ErrInsufficientBalance + } + toBalance, err := s.BalanceOf(to, tid) + if err != nil { + return err + } + + fromBalance -= amount + toBalance += amount + fromBalanceKey := string(tid) + ":" + from.String() + toBalanceKey := string(tid) + ":" + to.String() + s.balances.Set(fromBalanceKey, fromBalance) + s.balances.Set(toBalanceKey, toBalance) + } + + s.afterTokenTransfer(caller, from, to, batch, amounts) + + return nil +} + +// Helper for SafeMint() and SafeBatchMint() +func (s *basicGRC1155Token) mintBatch(to std.Address, batch []TokenID, amounts []uint64) error { + if len(batch) != len(amounts) { + return ErrMismatchLength + } + if !isValidAddress(to) { + return ErrInvalidAddress + } + + caller := std.GetOrigCaller() + s.beforeTokenTransfer(caller, zeroAddress, to, batch, amounts) + + for i := 0; i < len(batch); i++ { + tid := batch[i] + amount := amounts[i] + toBalance, err := s.BalanceOf(to, tid) + if err != nil { + return err + } + toBalance += amount + toBalanceKey := string(tid) + ":" + to.String() + s.balances.Set(toBalanceKey, toBalance) + } + + s.afterTokenTransfer(caller, zeroAddress, to, batch, amounts) + + return nil +} + +// Helper for Burn() and BurnBatch() +func (s *basicGRC1155Token) burnBatch(from std.Address, batch []TokenID, amounts []uint64) error { + if len(batch) != len(amounts) { + return ErrMismatchLength + } + if !isValidAddress(from) { + return ErrInvalidAddress + } + + caller := std.GetOrigCaller() + s.beforeTokenTransfer(caller, from, zeroAddress, batch, amounts) + + for i := 0; i < len(batch); i++ { + tid := batch[i] + amount := amounts[i] + fromBalance, err := s.BalanceOf(from, tid) + if err != nil { + return err + } + if fromBalance < amount { + return ErrBurnAmountExceedsBalance + } + fromBalance -= amount + fromBalanceKey := string(tid) + ":" + from.String() + s.balances.Set(fromBalanceKey, fromBalance) + } + + s.afterTokenTransfer(caller, from, zeroAddress, batch, amounts) + + return nil +} + +func (s *basicGRC1155Token) setUri(newUri string) { + s.uri = newUri + emit(&UpdateURIEvent{newUri}) +} + +func (s *basicGRC1155Token) beforeTokenTransfer(operator, from, to std.Address, batch []TokenID, amounts []uint64) { + // TODO: Implementation +} + +func (s *basicGRC1155Token) afterTokenTransfer(operator, from, to std.Address, batch []TokenID, amounts []uint64) { + // TODO: Implementation +} + +func (s *basicGRC1155Token) doSafeTransferAcceptanceCheck(operator, from, to std.Address, tid TokenID, amount uint64) bool { + // TODO: Implementation + return true +} + +func (s *basicGRC1155Token) doSafeBatchTransferAcceptanceCheck(operator, from, to std.Address, batch []TokenID, amounts []uint64) bool { + // TODO: Implementation + return true +} + +func (s *basicGRC1155Token) RenderHome() (str string) { + str += ufmt.Sprintf("# URI:%s\n", s.uri) + + return +} diff --git a/portal-loop/extracted/p/demo/grc/grc1155/basic_grc1155_token_test.gno b/portal-loop/extracted/p/demo/grc/grc1155/basic_grc1155_token_test.gno new file mode 100644 index 00000000..2fef3431 --- /dev/null +++ b/portal-loop/extracted/p/demo/grc/grc1155/basic_grc1155_token_test.gno @@ -0,0 +1,289 @@ +package grc1155 + +import ( + "std" + "testing" + + "gno.land/p/demo/uassert" +) + +const dummyURI = "ipfs://xyz" + +func TestNewBasicGRC1155Token(t *testing.T) { + dummy := NewBasicGRC1155Token(dummyURI) + uassert.True(t, dummy != nil, "should not be nil") +} + +func TestUri(t *testing.T) { + dummy := NewBasicGRC1155Token(dummyURI) + uassert.True(t, dummy != nil, "should not be nil") + uassert.Equal(t, dummyURI, dummy.Uri()) +} + +func TestBalanceOf(t *testing.T) { + dummy := NewBasicGRC1155Token(dummyURI) + uassert.True(t, dummy != nil, "should not be nil") + + addr1 := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm") + addr2 := std.Address("g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj") + + tid1 := TokenID("1") + tid2 := TokenID("2") + + balanceZeroAddressOfToken1, err := dummy.BalanceOf(zeroAddress, tid1) + uassert.Error(t, err, "should result in error") + + balanceAddr1OfToken1, err := dummy.BalanceOf(addr1, tid1) + uassert.NoError(t, err, "should not result in error") + uassert.Equal(t, uint64(0), balanceAddr1OfToken1) + + dummy.mintBatch(addr1, []TokenID{tid1, tid2}, []uint64{10, 100}) + dummy.mintBatch(addr2, []TokenID{tid1}, []uint64{20}) + + balanceAddr1OfToken1, err = dummy.BalanceOf(addr1, tid1) + uassert.NoError(t, err, "should not result in error") + balanceAddr1OfToken2, err := dummy.BalanceOf(addr1, tid2) + uassert.NoError(t, err, "should not result in error") + balanceAddr2OfToken1, err := dummy.BalanceOf(addr2, tid1) + uassert.NoError(t, err, "should not result in error") + + uassert.Equal(t, uint64(10), balanceAddr1OfToken1) + uassert.Equal(t, uint64(100), balanceAddr1OfToken2) + uassert.Equal(t, uint64(20), balanceAddr2OfToken1) +} + +func TestBalanceOfBatch(t *testing.T) { + dummy := NewBasicGRC1155Token(dummyURI) + uassert.True(t, dummy != nil, "should not be nil") + + addr1 := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm") + addr2 := std.Address("g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj") + + tid1 := TokenID("1") + tid2 := TokenID("2") + + balanceBatch, err := dummy.BalanceOfBatch([]std.Address{addr1, addr2}, []TokenID{tid1, tid2}) + uassert.NoError(t, err, "should not result in error") + uassert.Equal(t, uint64(0), balanceBatch[0]) + uassert.Equal(t, uint64(0), balanceBatch[1]) + + dummy.mintBatch(addr1, []TokenID{tid1}, []uint64{10}) + dummy.mintBatch(addr2, []TokenID{tid2}, []uint64{20}) + + balanceBatch, err = dummy.BalanceOfBatch([]std.Address{addr1, addr2}, []TokenID{tid1, tid2}) + uassert.NoError(t, err, "should not result in error") + uassert.Equal(t, uint64(10), balanceBatch[0]) + uassert.Equal(t, uint64(20), balanceBatch[1]) +} + +func TestIsApprovedForAll(t *testing.T) { + dummy := NewBasicGRC1155Token(dummyURI) + uassert.True(t, dummy != nil, "should not be nil") + + addr1 := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm") + addr2 := std.Address("g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj") + + isApprovedForAll := dummy.IsApprovedForAll(addr1, addr2) + uassert.False(t, isApprovedForAll) +} + +func TestSetApprovalForAll(t *testing.T) { + dummy := NewBasicGRC1155Token(dummyURI) + uassert.True(t, dummy != nil, "should not be nil") + + caller := std.GetOrigCaller() + addr := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm") + + isApprovedForAll := dummy.IsApprovedForAll(caller, addr) + uassert.False(t, isApprovedForAll) + + err := dummy.SetApprovalForAll(addr, true) + uassert.NoError(t, err, "should not result in error") + + isApprovedForAll = dummy.IsApprovedForAll(caller, addr) + uassert.True(t, isApprovedForAll) + + err = dummy.SetApprovalForAll(addr, false) + uassert.NoError(t, err, "should not result in error") + + isApprovedForAll = dummy.IsApprovedForAll(caller, addr) + uassert.False(t, isApprovedForAll) +} + +func TestSafeTransferFrom(t *testing.T) { + dummy := NewBasicGRC1155Token(dummyURI) + uassert.True(t, dummy != nil, "should not be nil") + + caller := std.GetOrigCaller() + addr := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm") + + tid := TokenID("1") + + dummy.mintBatch(caller, []TokenID{tid}, []uint64{100}) + + err := dummy.SafeTransferFrom(caller, zeroAddress, tid, 10) + uassert.Error(t, err, "should result in error") + + err = dummy.SafeTransferFrom(caller, addr, tid, 160) + uassert.Error(t, err, "should result in error") + + err = dummy.SafeTransferFrom(caller, addr, tid, 60) + uassert.NoError(t, err, "should not result in error") + + // Check balance of caller after transfer + balanceOfCaller, err := dummy.BalanceOf(caller, tid) + uassert.NoError(t, err, "should not result in error") + uassert.Equal(t, uint64(40), balanceOfCaller) + + // Check balance of addr after transfer + balanceOfAddr, err := dummy.BalanceOf(addr, tid) + uassert.NoError(t, err, "should not result in error") + uassert.Equal(t, uint64(60), balanceOfAddr) +} + +func TestSafeBatchTransferFrom(t *testing.T) { + dummy := NewBasicGRC1155Token(dummyURI) + uassert.True(t, dummy != nil, "should not be nil") + + caller := std.GetOrigCaller() + addr := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm") + + tid1 := TokenID("1") + tid2 := TokenID("2") + + dummy.mintBatch(caller, []TokenID{tid1, tid2}, []uint64{10, 100}) + + err := dummy.SafeBatchTransferFrom(caller, zeroAddress, []TokenID{tid1, tid2}, []uint64{4, 60}) + uassert.Error(t, err, "should result in error") + err = dummy.SafeBatchTransferFrom(caller, addr, []TokenID{tid1, tid2}, []uint64{40, 60}) + uassert.Error(t, err, "should result in error") + err = dummy.SafeBatchTransferFrom(caller, addr, []TokenID{tid1}, []uint64{40, 60}) + uassert.Error(t, err, "should result in error") + err = dummy.SafeBatchTransferFrom(caller, addr, []TokenID{tid1, tid2}, []uint64{4, 60}) + uassert.NoError(t, err, "should not result in error") + + balanceBatch, err := dummy.BalanceOfBatch([]std.Address{caller, addr, caller, addr}, []TokenID{tid1, tid1, tid2, tid2}) + uassert.NoError(t, err, "should not result in error") + + // Check token1's balance of caller after batch transfer + uassert.Equal(t, uint64(6), balanceBatch[0]) + + // Check token1's balance of addr after batch transfer + uassert.Equal(t, uint64(4), balanceBatch[1]) + + // Check token2's balance of caller after batch transfer + uassert.Equal(t, uint64(40), balanceBatch[2]) + + // Check token2's balance of addr after batch transfer + uassert.Equal(t, uint64(60), balanceBatch[3]) +} + +func TestSafeMint(t *testing.T) { + dummy := NewBasicGRC1155Token(dummyURI) + uassert.True(t, dummy != nil, "should not be nil") + + addr1 := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm") + addr2 := std.Address("g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj") + + tid1 := TokenID("1") + tid2 := TokenID("2") + + err := dummy.SafeMint(zeroAddress, tid1, 100) + uassert.Error(t, err, "should result in error") + err = dummy.SafeMint(addr1, tid1, 100) + uassert.NoError(t, err, "should not result in error") + err = dummy.SafeMint(addr1, tid2, 200) + uassert.NoError(t, err, "should not result in error") + err = dummy.SafeMint(addr2, tid1, 50) + uassert.NoError(t, err, "should not result in error") + + balanceBatch, err := dummy.BalanceOfBatch([]std.Address{addr1, addr2, addr1}, []TokenID{tid1, tid1, tid2}) + uassert.NoError(t, err, "should not result in error") + // Check token1's balance of addr1 after mint + uassert.Equal(t, uint64(100), balanceBatch[0]) + // Check token1's balance of addr2 after mint + uassert.Equal(t, uint64(50), balanceBatch[1]) + // Check token2's balance of addr1 after mint + uassert.Equal(t, uint64(200), balanceBatch[2]) +} + +func TestSafeBatchMint(t *testing.T) { + dummy := NewBasicGRC1155Token(dummyURI) + uassert.True(t, dummy != nil, "should not be nil") + + addr1 := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm") + addr2 := std.Address("g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj") + + tid1 := TokenID("1") + tid2 := TokenID("2") + + err := dummy.SafeBatchMint(zeroAddress, []TokenID{tid1, tid2}, []uint64{100, 200}) + uassert.Error(t, err, "should result in error") + err = dummy.SafeBatchMint(addr1, []TokenID{tid1, tid2}, []uint64{100, 200}) + uassert.NoError(t, err, "should not result in error") + err = dummy.SafeBatchMint(addr2, []TokenID{tid1, tid2}, []uint64{300, 400}) + uassert.NoError(t, err, "should not result in error") + + balanceBatch, err := dummy.BalanceOfBatch([]std.Address{addr1, addr2, addr1, addr2}, []TokenID{tid1, tid1, tid2, tid2}) + uassert.NoError(t, err, "should not result in error") + // Check token1's balance of addr1 after batch mint + uassert.Equal(t, uint64(100), balanceBatch[0]) + // Check token1's balance of addr2 after batch mint + uassert.Equal(t, uint64(300), balanceBatch[1]) + // Check token2's balance of addr1 after batch mint + uassert.Equal(t, uint64(200), balanceBatch[2]) + // Check token2's balance of addr2 after batch mint + uassert.Equal(t, uint64(400), balanceBatch[3]) +} + +func TestBurn(t *testing.T) { + dummy := NewBasicGRC1155Token(dummyURI) + uassert.True(t, dummy != nil, "should not be nil") + + addr := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm") + + tid1 := TokenID("1") + tid2 := TokenID("2") + + dummy.mintBatch(addr, []TokenID{tid1, tid2}, []uint64{100, 200}) + err := dummy.Burn(zeroAddress, tid1, uint64(60)) + uassert.Error(t, err, "should result in error") + err = dummy.Burn(addr, tid1, uint64(160)) + uassert.Error(t, err, "should result in error") + err = dummy.Burn(addr, tid1, uint64(60)) + uassert.NoError(t, err, "should not result in error") + err = dummy.Burn(addr, tid2, uint64(60)) + uassert.NoError(t, err, "should not result in error") + balanceBatch, err := dummy.BalanceOfBatch([]std.Address{addr, addr}, []TokenID{tid1, tid2}) + uassert.NoError(t, err, "should not result in error") + + // Check token1's balance of addr after burn + uassert.Equal(t, uint64(40), balanceBatch[0]) + // Check token2's balance of addr after burn + uassert.Equal(t, uint64(140), balanceBatch[1]) +} + +func TestBatchBurn(t *testing.T) { + dummy := NewBasicGRC1155Token(dummyURI) + uassert.True(t, dummy != nil, "should not be nil") + + addr := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm") + + tid1 := TokenID("1") + tid2 := TokenID("2") + + dummy.mintBatch(addr, []TokenID{tid1, tid2}, []uint64{100, 200}) + err := dummy.BatchBurn(zeroAddress, []TokenID{tid1, tid2}, []uint64{60, 60}) + uassert.Error(t, err, "should result in error") + err = dummy.BatchBurn(addr, []TokenID{tid1, tid2}, []uint64{160, 60}) + uassert.Error(t, err, "should result in error") + err = dummy.BatchBurn(addr, []TokenID{tid1, tid2}, []uint64{60, 60}) + uassert.NoError(t, err, "should not result in error") + balanceBatch, err := dummy.BalanceOfBatch([]std.Address{addr, addr}, []TokenID{tid1, tid2}) + uassert.NoError(t, err, "should not result in error") + + // Check token1's balance of addr after batch burn + uassert.Equal(t, uint64(40), balanceBatch[0]) + // Check token2's balance of addr after batch burn + uassert.Equal(t, uint64(140), balanceBatch[1]) +} diff --git a/portal-loop/extracted/p/demo/grc/grc1155/errors.gno b/portal-loop/extracted/p/demo/grc/grc1155/errors.gno new file mode 100644 index 00000000..e841c579 --- /dev/null +++ b/portal-loop/extracted/p/demo/grc/grc1155/errors.gno @@ -0,0 +1,13 @@ +package grc1155 + +import "errors" + +var ( + ErrInvalidAddress = errors.New("invalid address") + ErrMismatchLength = errors.New("accounts and ids length mismatch") + ErrCannotTransferToSelf = errors.New("cannot send transfer to self") + ErrTransferToRejectedOrNonGRC1155Receiver = errors.New("transfer to rejected or non GRC1155Receiver implementer") + ErrCallerIsNotOwnerOrApproved = errors.New("caller is not token owner or approved") + ErrInsufficientBalance = errors.New("insufficient balance for transfer") + ErrBurnAmountExceedsBalance = errors.New("burn amount exceeds balance") +) diff --git a/portal-loop/extracted/p/demo/grc/grc1155/igrc1155.gno b/portal-loop/extracted/p/demo/grc/grc1155/igrc1155.gno new file mode 100644 index 00000000..5d524e36 --- /dev/null +++ b/portal-loop/extracted/p/demo/grc/grc1155/igrc1155.gno @@ -0,0 +1,40 @@ +package grc1155 + +import "std" + +type IGRC1155 interface { + SafeTransferFrom(from, to std.Address, tid TokenID, amount uint64) error + SafeBatchTransferFrom(from, to std.Address, batch []TokenID, amounts []uint64) error + BalanceOf(owner std.Address, tid TokenID) (uint64, error) + BalanceOfBatch(owners []std.Address, batch []TokenID) ([]uint64, error) + SetApprovalForAll(operator std.Address, approved bool) error + IsApprovedForAll(owner, operator std.Address) bool +} + +type TokenID string + +type TransferSingleEvent struct { + Operator std.Address + From std.Address + To std.Address + TokenID TokenID + Amount uint64 +} + +type TransferBatchEvent struct { + Operator std.Address + From std.Address + To std.Address + Batch []TokenID + Amounts []uint64 +} + +type ApprovalForAllEvent struct { + Owner std.Address + Operator std.Address + Approved bool +} + +type UpdateURIEvent struct { + URI string +} diff --git a/portal-loop/extracted/p/demo/grc/grc1155/pkg_metadata.json b/portal-loop/extracted/p/demo/grc/grc1155/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/grc/grc1155/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/grc/grc1155/util.gno b/portal-loop/extracted/p/demo/grc/grc1155/util.gno new file mode 100644 index 00000000..2c6452a1 --- /dev/null +++ b/portal-loop/extracted/p/demo/grc/grc1155/util.gno @@ -0,0 +1,18 @@ +package grc1155 + +import ( + "std" +) + +const zeroAddress std.Address = "" + +func isValidAddress(addr std.Address) bool { + if !addr.IsValid() { + return false + } + return true +} + +func emit(event interface{}) { + // TODO: setup a pubsub system here? +} diff --git a/portal-loop/extracted/p/demo/grc/grc20/banker.gno b/portal-loop/extracted/p/demo/grc/grc20/banker.gno new file mode 100644 index 00000000..f643d3e2 --- /dev/null +++ b/portal-loop/extracted/p/demo/grc/grc20/banker.gno @@ -0,0 +1,217 @@ +package grc20 + +import ( + "std" + "strconv" + + "gno.land/p/demo/avl" + "gno.land/p/demo/ufmt" +) + +// Banker implements a token banker with admin privileges. +// +// The Banker is intended to be used in two main ways: +// 1. as a temporary object used to make the initial minting, then deleted. +// 2. preserved in an unexported variable to support conditional administrative +// tasks protected by the contract. +type Banker struct { + name string + symbol string + decimals uint + totalSupply uint64 + balances avl.Tree // std.Address(owner) -> uint64 + allowances avl.Tree // string(owner+":"+spender) -> uint64 + token *token // to share the same pointer +} + +func NewBanker(name, symbol string, decimals uint) *Banker { + if name == "" { + panic("name should not be empty") + } + if symbol == "" { + panic("symbol should not be empty") + } + // XXX additional checks (length, characters, limits, etc) + + b := Banker{ + name: name, + symbol: symbol, + decimals: decimals, + } + t := &token{banker: &b} + b.token = t + return &b +} + +func (b Banker) Token() Token { return b.token } // Token returns a grc20 safe-object implementation. +func (b Banker) GetName() string { return b.name } +func (b Banker) GetSymbol() string { return b.symbol } +func (b Banker) GetDecimals() uint { return b.decimals } +func (b Banker) TotalSupply() uint64 { return b.totalSupply } +func (b Banker) KnownAccounts() int { return b.balances.Size() } + +func (b *Banker) Mint(address std.Address, amount uint64) error { + if !address.IsValid() { + return ErrInvalidAddress + } + + // TODO: check for overflow + + b.totalSupply += amount + currentBalance := b.BalanceOf(address) + newBalance := currentBalance + amount + + b.balances.Set(string(address), newBalance) + + std.Emit( + TransferEvent, + "from", "", + "to", string(address), + "value", strconv.Itoa(int(amount)), + ) + + return nil +} + +func (b *Banker) Burn(address std.Address, amount uint64) error { + if !address.IsValid() { + return ErrInvalidAddress + } + // TODO: check for overflow + + currentBalance := b.BalanceOf(address) + if currentBalance < amount { + return ErrInsufficientBalance + } + + b.totalSupply -= amount + newBalance := currentBalance - amount + + b.balances.Set(string(address), newBalance) + + std.Emit( + TransferEvent, + "from", string(address), + "to", "", + "value", strconv.Itoa(int(amount)), + ) + + return nil +} + +func (b Banker) BalanceOf(address std.Address) uint64 { + balance, found := b.balances.Get(address.String()) + if !found { + return 0 + } + return balance.(uint64) +} + +func (b *Banker) SpendAllowance(owner, spender std.Address, amount uint64) error { + if !owner.IsValid() { + return ErrInvalidAddress + } + if !spender.IsValid() { + return ErrInvalidAddress + } + + currentAllowance := b.Allowance(owner, spender) + if currentAllowance < amount { + return ErrInsufficientAllowance + } + + key := allowanceKey(owner, spender) + newAllowance := currentAllowance - amount + + if newAllowance == 0 { + b.allowances.Remove(key) + } else { + b.allowances.Set(key, newAllowance) + } + + return nil +} + +func (b *Banker) Transfer(from, to std.Address, amount uint64) error { + if !from.IsValid() { + return ErrInvalidAddress + } + if !to.IsValid() { + return ErrInvalidAddress + } + if from == to { + return ErrCannotTransferToSelf + } + + toBalance := b.BalanceOf(to) + fromBalance := b.BalanceOf(from) + + // debug. + // println("from", from, "to", to, "amount", amount, "fromBalance", fromBalance, "toBalance", toBalance) + + if fromBalance < amount { + return ErrInsufficientBalance + } + + newToBalance := toBalance + amount + newFromBalance := fromBalance - amount + + b.balances.Set(string(to), newToBalance) + b.balances.Set(string(from), newFromBalance) + + std.Emit( + TransferEvent, + "from", from.String(), + "to", to.String(), + "value", strconv.Itoa(int(amount)), + ) + return nil +} + +func (b *Banker) TransferFrom(spender, from, to std.Address, amount uint64) error { + if err := b.SpendAllowance(from, spender, amount); err != nil { + return err + } + return b.Transfer(from, to, amount) +} + +func (b *Banker) Allowance(owner, spender std.Address) uint64 { + allowance, found := b.allowances.Get(allowanceKey(owner, spender)) + if !found { + return 0 + } + return allowance.(uint64) +} + +func (b *Banker) Approve(owner, spender std.Address, amount uint64) error { + if !owner.IsValid() { + return ErrInvalidAddress + } + if !spender.IsValid() { + return ErrInvalidAddress + } + + b.allowances.Set(allowanceKey(owner, spender), amount) + + std.Emit( + ApprovalEvent, + "owner", string(owner), + "spender", string(spender), + "value", strconv.Itoa(int(amount)), + ) + + return nil +} + +func (b *Banker) RenderHome() string { + str := "" + str += ufmt.Sprintf("# %s ($%s)\n\n", b.name, b.symbol) + str += ufmt.Sprintf("* **Decimals**: %d\n", b.decimals) + str += ufmt.Sprintf("* **Total supply**: %d\n", b.totalSupply) + str += ufmt.Sprintf("* **Known accounts**: %d\n", b.KnownAccounts()) + return str +} + +func allowanceKey(owner, spender std.Address) string { + return owner.String() + ":" + spender.String() +} diff --git a/portal-loop/extracted/p/demo/grc/grc20/banker_test.gno b/portal-loop/extracted/p/demo/grc/grc20/banker_test.gno new file mode 100644 index 00000000..00a1e75d --- /dev/null +++ b/portal-loop/extracted/p/demo/grc/grc20/banker_test.gno @@ -0,0 +1,51 @@ +package grc20 + +import ( + "testing" + + "gno.land/p/demo/testutils" + "gno.land/p/demo/ufmt" + "gno.land/p/demo/urequire" +) + +func TestBankerImpl(t *testing.T) { + dummy := NewBanker("Dummy", "DUMMY", 4) + urequire.False(t, dummy == nil, "dummy should not be nil") +} + +func TestAllowance(t *testing.T) { + var ( + owner = testutils.TestAddress("owner") + spender = testutils.TestAddress("spender") + dest = testutils.TestAddress("dest") + ) + + b := NewBanker("Dummy", "DUMMY", 6) + urequire.NoError(t, b.Mint(owner, 100000000)) + urequire.NoError(t, b.Approve(owner, spender, 5000000)) + urequire.Error(t, b.TransferFrom(spender, owner, dest, 10000000), ErrInsufficientAllowance.Error(), "should not be able to transfer more than approved") + + tests := []struct { + spend uint64 + exp uint64 + }{ + {3, 4999997}, + {999997, 4000000}, + {4000000, 0}, + } + + for _, tt := range tests { + b0 := b.BalanceOf(dest) + urequire.NoError(t, b.TransferFrom(spender, owner, dest, tt.spend)) + a := b.Allowance(owner, spender) + urequire.Equal(t, a, tt.exp, ufmt.Sprintf("allowance exp: %d, got %d", tt.exp, a)) + b := b.BalanceOf(dest) + expB := b0 + tt.spend + urequire.Equal(t, b, expB, ufmt.Sprintf("balance exp: %d, got %d", expB, b)) + } + + urequire.Error(t, b.TransferFrom(spender, owner, dest, 1), "no allowance") + key := allowanceKey(owner, spender) + urequire.False(t, b.allowances.Has(key), "allowance should be removed") + urequire.Equal(t, b.Allowance(owner, spender), uint64(0), "allowance should be 0") +} diff --git a/portal-loop/extracted/p/demo/grc/grc20/pkg_metadata.json b/portal-loop/extracted/p/demo/grc/grc20/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/grc/grc20/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/grc/grc20/token.gno b/portal-loop/extracted/p/demo/grc/grc20/token.gno new file mode 100644 index 00000000..c9e12526 --- /dev/null +++ b/portal-loop/extracted/p/demo/grc/grc20/token.gno @@ -0,0 +1,45 @@ +package grc20 + +import ( + "std" +) + +// token implements the Token interface. +// +// It is generated with Banker.Token(). +// It can safely be exposed publicly. +type token struct { + banker *Banker +} + +// var _ Token = (*token)(nil) +func (t *token) GetName() string { return t.banker.name } +func (t *token) GetSymbol() string { return t.banker.symbol } +func (t *token) GetDecimals() uint { return t.banker.decimals } +func (t *token) TotalSupply() uint64 { return t.banker.totalSupply } + +func (t *token) BalanceOf(owner std.Address) uint64 { + return t.banker.BalanceOf(owner) +} + +func (t *token) Transfer(to std.Address, amount uint64) error { + caller := std.PrevRealm().Addr() + return t.banker.Transfer(caller, to, amount) +} + +func (t *token) Allowance(owner, spender std.Address) uint64 { + return t.banker.Allowance(owner, spender) +} + +func (t *token) Approve(spender std.Address, amount uint64) error { + caller := std.PrevRealm().Addr() + return t.banker.Approve(caller, spender, amount) +} + +func (t *token) TransferFrom(from, to std.Address, amount uint64) error { + spender := std.PrevRealm().Addr() + if err := t.banker.SpendAllowance(from, spender, amount); err != nil { + return err + } + return t.banker.Transfer(from, to, amount) +} diff --git a/portal-loop/extracted/p/demo/grc/grc20/token_test.gno b/portal-loop/extracted/p/demo/grc/grc20/token_test.gno new file mode 100644 index 00000000..713ad734 --- /dev/null +++ b/portal-loop/extracted/p/demo/grc/grc20/token_test.gno @@ -0,0 +1,72 @@ +package grc20 + +import ( + "std" + "testing" + + "gno.land/p/demo/testutils" + "gno.land/p/demo/ufmt" + "gno.land/p/demo/urequire" +) + +func TestUserTokenImpl(t *testing.T) { + bank := NewBanker("Dummy", "DUMMY", 4) + tok := bank.Token() + _ = tok +} + +func TestUserApprove(t *testing.T) { + owner := testutils.TestAddress("owner") + spender := testutils.TestAddress("spender") + dest := testutils.TestAddress("dest") + + bank := NewBanker("Dummy", "DUMMY", 6) + tok := bank.Token() + + // Set owner as the original caller + std.TestSetOrigCaller(owner) + // Mint 100000000 tokens for owner + urequire.NoError(t, bank.Mint(owner, 100000000)) + + // Approve spender to spend 5000000 tokens + urequire.NoError(t, tok.Approve(spender, 5000000)) + + // Set spender as the original caller + std.TestSetOrigCaller(spender) + // Try to transfer 10000000 tokens from owner to dest, should fail because it exceeds allowance + urequire.Error(t, + tok.TransferFrom(owner, dest, 10000000), + ErrInsufficientAllowance.Error(), + "should not be able to transfer more than approved", + ) + + // Define a set of test data with spend amount and expected remaining allowance + tests := []struct { + spend uint64 // Spend amount + exp uint64 // Remaining allowance + }{ + {3, 4999997}, + {999997, 4000000}, + {4000000, 0}, + } + + // perform transfer operation,and check if allowance and balance are correct + for _, tt := range tests { + b0 := tok.BalanceOf(dest) + // Perform transfer from owner to dest + urequire.NoError(t, tok.TransferFrom(owner, dest, tt.spend)) + a := tok.Allowance(owner, spender) + // Check if allowance equals expected value + urequire.True(t, a == tt.exp, ufmt.Sprintf("allowance exp: %d,got %d", tt.exp, a)) + + // Get dest current balance + b := tok.BalanceOf(dest) + // Calculate expected balance ,should be initial balance plus transfer amount + expB := b0 + tt.spend + // Check if balance equals expected value + urequire.True(t, b == expB, ufmt.Sprintf("balance exp: %d,got %d", expB, b)) + } + + // Try to transfer one token from owner to dest ,should fail because no allowance left + urequire.Error(t, tok.TransferFrom(owner, dest, 1), ErrInsufficientAllowance.Error(), "no allowance") +} diff --git a/portal-loop/extracted/p/demo/grc/grc20/types.gno b/portal-loop/extracted/p/demo/grc/grc20/types.gno new file mode 100644 index 00000000..fe3aef34 --- /dev/null +++ b/portal-loop/extracted/p/demo/grc/grc20/types.gno @@ -0,0 +1,61 @@ +package grc20 + +import ( + "errors" + "std" + + "gno.land/p/demo/grc/exts" +) + +var ( + ErrInsufficientBalance = errors.New("insufficient balance") + ErrInsufficientAllowance = errors.New("insufficient allowance") + ErrInvalidAddress = errors.New("invalid address") + ErrCannotTransferToSelf = errors.New("cannot send transfer to self") +) + +type Token interface { + exts.TokenMetadata + + // Returns the amount of tokens in existence. + TotalSupply() uint64 + + // Returns the amount of tokens owned by `account`. + BalanceOf(account std.Address) uint64 + + // Moves `amount` tokens from the caller's account to `to`. + // + // Returns an error if the operation failed. + Transfer(to std.Address, amount uint64) error + + // Returns the remaining number of tokens that `spender` will be + // allowed to spend on behalf of `owner` through {transferFrom}. This is + // zero by default. + // + // This value changes when {approve} or {transferFrom} are called. + Allowance(owner, spender std.Address) uint64 + + // Sets `amount` as the allowance of `spender` over the caller's tokens. + // + // Returns an error if the operation failed. + // + // IMPORTANT: Beware that changing an allowance with this method brings the risk + // that someone may use both the old and the new allowance by unfortunate + // transaction ordering. One possible solution to mitigate this race + // condition is to first reduce the spender's allowance to 0 and set the + // desired value afterwards: + // https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + Approve(spender std.Address, amount uint64) error + + // Moves `amount` tokens from `from` to `to` using the + // allowance mechanism. `amount` is then deducted from the caller's + // allowance. + // + // Returns an error if the operation failed. + TransferFrom(from, to std.Address, amount uint64) error +} + +const ( + TransferEvent = "Transfer" + ApprovalEvent = "Approval" +) diff --git a/portal-loop/extracted/p/demo/grc/grc721/basic_nft.gno b/portal-loop/extracted/p/demo/grc/grc721/basic_nft.gno new file mode 100644 index 00000000..bec7338d --- /dev/null +++ b/portal-loop/extracted/p/demo/grc/grc721/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/portal-loop/extracted/p/demo/grc/grc721/basic_nft_test.gno b/portal-loop/extracted/p/demo/grc/grc721/basic_nft_test.gno new file mode 100644 index 00000000..6375b030 --- /dev/null +++ b/portal-loop/extracted/p/demo/grc/grc721/basic_nft_test.gno @@ -0,0 +1,283 @@ +package grc721 + +import ( + "std" + "testing" + + "gno.land/p/demo/uassert" +) + +var ( + dummyNFTName = "DummyNFT" + dummyNFTSymbol = "DNFT" +) + +func TestNewBasicNFT(t *testing.T) { + dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol) + uassert.True(t, dummy != nil, "should not be nil") +} + +func TestName(t *testing.T) { + dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol) + uassert.True(t, dummy != nil, "should not be nil") + + name := dummy.Name() + uassert.Equal(t, dummyNFTName, name) +} + +func TestSymbol(t *testing.T) { + dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol) + uassert.True(t, dummy != nil, "should not be nil") + + symbol := dummy.Symbol() + uassert.Equal(t, dummyNFTSymbol, symbol) +} + +func TestTokenCount(t *testing.T) { + dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol) + uassert.True(t, dummy != nil, "should not be nil") + + count := dummy.TokenCount() + uassert.Equal(t, uint64(0), count) + + dummy.mint("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm", TokenID("1")) + dummy.mint("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm", TokenID("2")) + + count = dummy.TokenCount() + uassert.Equal(t, uint64(2), count) +} + +func TestBalanceOf(t *testing.T) { + dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol) + uassert.True(t, dummy != nil, "should not be nil") + + addr1 := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm") + addr2 := std.Address("g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj") + + balanceAddr1, err := dummy.BalanceOf(addr1) + uassert.NoError(t, err, "should not result in error") + uassert.Equal(t, uint64(0), balanceAddr1) + + dummy.mint(addr1, TokenID("1")) + dummy.mint(addr1, TokenID("2")) + dummy.mint(addr2, TokenID("3")) + + balanceAddr1, err = dummy.BalanceOf(addr1) + uassert.NoError(t, err, "should not result in error") + + balanceAddr2, err := dummy.BalanceOf(addr2) + uassert.NoError(t, err, "should not result in error") + + uassert.Equal(t, uint64(2), balanceAddr1) + uassert.Equal(t, uint64(1), balanceAddr2) +} + +func TestOwnerOf(t *testing.T) { + dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol) + uassert.True(t, dummy != nil, "should not be nil") + + addr1 := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm") + addr2 := std.Address("g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj") + + owner, err := dummy.OwnerOf(TokenID("invalid")) + uassert.Error(t, err, "should not result in error") + + dummy.mint(addr1, TokenID("1")) + dummy.mint(addr2, TokenID("2")) + + // Checking for token id "1" + owner, err = dummy.OwnerOf(TokenID("1")) + uassert.NoError(t, err, "should not result in error") + uassert.Equal(t, addr1.String(), owner.String()) + + // Checking for token id "2" + owner, err = dummy.OwnerOf(TokenID("2")) + uassert.NoError(t, err, "should not result in error") + uassert.Equal(t, addr2.String(), owner.String()) +} + +func TestIsApprovedForAll(t *testing.T) { + dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol) + uassert.True(t, dummy != nil, "should not be nil") + + addr1 := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm") + addr2 := std.Address("g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj") + + isApprovedForAll := dummy.IsApprovedForAll(addr1, addr2) + uassert.False(t, isApprovedForAll) +} + +func TestSetApprovalForAll(t *testing.T) { + dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol) + uassert.True(t, dummy != nil, "should not be nil") + + caller := std.PrevRealm().Addr() + addr := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm") + + isApprovedForAll := dummy.IsApprovedForAll(caller, addr) + uassert.False(t, isApprovedForAll) + + err := dummy.SetApprovalForAll(addr, true) + uassert.NoError(t, err, "should not result in error") + + isApprovedForAll = dummy.IsApprovedForAll(caller, addr) + uassert.True(t, isApprovedForAll) +} + +func TestGetApproved(t *testing.T) { + dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol) + uassert.True(t, dummy != nil, "should not be nil") + + approvedAddr, err := dummy.GetApproved(TokenID("invalid")) + uassert.Error(t, err, "should result in error") +} + +func TestApprove(t *testing.T) { + dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol) + uassert.True(t, dummy != nil, "should not be nil") + + caller := std.PrevRealm().Addr() + addr := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm") + + dummy.mint(caller, TokenID("1")) + + _, err := dummy.GetApproved(TokenID("1")) + uassert.Error(t, err, "should result in error") + + err = dummy.Approve(addr, TokenID("1")) + uassert.NoError(t, err, "should not result in error") + + approvedAddr, err := dummy.GetApproved(TokenID("1")) + uassert.NoError(t, err, "should result in error") + uassert.Equal(t, addr.String(), approvedAddr.String()) +} + +func TestTransferFrom(t *testing.T) { + dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol) + uassert.True(t, dummy != nil, "should not be nil") + + caller := std.PrevRealm().Addr() + addr := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm") + + dummy.mint(caller, TokenID("1")) + dummy.mint(caller, TokenID("2")) + + err := dummy.TransferFrom(caller, addr, TokenID("1")) + uassert.NoError(t, err, "should result in error") + + // Check balance of caller after transfer + balanceOfCaller, err := dummy.BalanceOf(caller) + uassert.NoError(t, err, "should result in error") + uassert.Equal(t, uint64(1), balanceOfCaller) + + // Check balance of addr after transfer + balanceOfAddr, err := dummy.BalanceOf(addr) + uassert.NoError(t, err, "should not result in error") + uassert.Equal(t, uint64(1), balanceOfAddr) + + // Check Owner of transferred Token id + owner, err := dummy.OwnerOf(TokenID("1")) + uassert.NoError(t, err, "should result in error") + uassert.Equal(t, addr.String(), owner.String()) +} + +func TestSafeTransferFrom(t *testing.T) { + dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol) + uassert.True(t, dummy != nil, "should not be nil") + + caller := std.PrevRealm().Addr() + addr := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm") + + dummy.mint(caller, TokenID("1")) + dummy.mint(caller, TokenID("2")) + + err := dummy.SafeTransferFrom(caller, addr, TokenID("1")) + uassert.NoError(t, err, "should not result in error") + + // Check balance of caller after transfer + balanceOfCaller, err := dummy.BalanceOf(caller) + uassert.NoError(t, err, "should not result in error") + uassert.Equal(t, uint64(1), balanceOfCaller) + + // Check balance of addr after transfer + balanceOfAddr, err := dummy.BalanceOf(addr) + uassert.NoError(t, err, "should not result in error") + uassert.Equal(t, uint64(1), balanceOfAddr) + + // Check Owner of transferred Token id + owner, err := dummy.OwnerOf(TokenID("1")) + uassert.NoError(t, err, "should not result in error") + uassert.Equal(t, addr.String(), owner.String()) +} + +func TestMint(t *testing.T) { + dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol) + uassert.True(t, dummy != nil, "should not be nil") + + addr1 := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm") + addr2 := std.Address("g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj") + + err := dummy.Mint(addr1, TokenID("1")) + uassert.NoError(t, err, "should not result in error") + err = dummy.Mint(addr1, TokenID("2")) + uassert.NoError(t, err, "should not result in error") + err = dummy.Mint(addr2, TokenID("3")) + uassert.NoError(t, err, "should not result in error") + + // Try minting duplicate token id + err = dummy.Mint(addr2, TokenID("1")) + uassert.Error(t, err, "should not result in error") + + // Check Owner of Token id + owner, err := dummy.OwnerOf(TokenID("1")) + uassert.NoError(t, err, "should not result in error") + uassert.Equal(t, addr1.String(), owner.String()) +} + +func TestBurn(t *testing.T) { + dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol) + uassert.True(t, dummy != nil, "should not be nil") + + addr := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm") + + dummy.mint(addr, TokenID("1")) + dummy.mint(addr, TokenID("2")) + + err := dummy.Burn(TokenID("1")) + uassert.NoError(t, err, "should not result in error") + + // Check Owner of Token id + owner, err := dummy.OwnerOf(TokenID("1")) + uassert.Error(t, err, "should result in error") +} + +func TestSetTokenURI(t *testing.T) { + dummy := NewBasicNFT(dummyNFTName, dummyNFTSymbol) + uassert.True(t, dummy != nil, "should not be nil") + + addr1 := std.Address("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm") + addr2 := std.Address("g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj") + tokenURI := "http://example.com/token" + + std.TestSetOrigCaller(std.Address(addr1)) // addr1 + + dummy.mint(addr1, TokenID("1")) + _, derr := dummy.SetTokenURI(TokenID("1"), TokenURI(tokenURI)) + uassert.NoError(t, derr, "should not result in error") + + // Test case: Invalid token ID + _, err := dummy.SetTokenURI(TokenID("3"), TokenURI(tokenURI)) + uassert.ErrorIs(t, err, ErrInvalidTokenId) + + std.TestSetOrigCaller(std.Address(addr2)) // addr2 + + _, cerr := dummy.SetTokenURI(TokenID("1"), TokenURI(tokenURI)) // addr2 trying to set URI for token 1 + uassert.ErrorIs(t, cerr, ErrCallerIsNotOwner) + + // Test case: Retrieving TokenURI + std.TestSetOrigCaller(std.Address(addr1)) // addr1 + + dummyTokenURI, err := dummy.TokenURI(TokenID("1")) + uassert.NoError(t, err, "TokenURI error") + uassert.Equal(t, string(tokenURI), string(dummyTokenURI)) +} diff --git a/portal-loop/extracted/p/demo/grc/grc721/errors.gno b/portal-loop/extracted/p/demo/grc/grc721/errors.gno new file mode 100644 index 00000000..2d512db3 --- /dev/null +++ b/portal-loop/extracted/p/demo/grc/grc721/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/portal-loop/extracted/p/demo/grc/grc721/grc721_metadata.gno b/portal-loop/extracted/p/demo/grc/grc721/grc721_metadata.gno new file mode 100644 index 00000000..360f73ed --- /dev/null +++ b/portal-loop/extracted/p/demo/grc/grc721/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/portal-loop/extracted/p/demo/grc/grc721/grc721_metadata_test.gno b/portal-loop/extracted/p/demo/grc/grc721/grc721_metadata_test.gno new file mode 100644 index 00000000..ad002a7c --- /dev/null +++ b/portal-loop/extracted/p/demo/grc/grc721/grc721_metadata_test.gno @@ -0,0 +1,107 @@ +package grc721 + +import ( + "std" + "testing" + + "gno.land/p/demo/testutils" + "gno.land/p/demo/uassert" +) + +func TestSetMetadata(t *testing.T) { + // Create a new dummy NFT with metadata + dummy := NewNFTWithMetadata(dummyNFTName, dummyNFTSymbol) + if dummy == nil { + t.Errorf("should not be nil") + } + + // Define addresses for testing purposes + addr1 := testutils.TestAddress("alice") + addr2 := testutils.TestAddress("bob") + + // Define metadata attributes + name := "test" + description := "test" + image := "test" + imageData := "test" + externalURL := "test" + attributes := []Trait{} + backgroundColor := "test" + animationURL := "test" + youtubeURL := "test" + + // Set the original caller to addr1 + std.TestSetOrigCaller(addr1) // addr1 + + // Mint a new token for addr1 + dummy.mint(addr1, TokenID("1")) + + // Set metadata for token 1 + derr := dummy.SetTokenMetadata(TokenID("1"), Metadata{ + Name: name, + Description: description, + Image: image, + ImageData: imageData, + ExternalURL: externalURL, + Attributes: attributes, + BackgroundColor: backgroundColor, + AnimationURL: animationURL, + YoutubeURL: youtubeURL, + }) + + // Check if there was an error setting metadata + uassert.NoError(t, derr, "Should not result in error") + + // Test case: Invalid token ID + err := dummy.SetTokenMetadata(TokenID("3"), Metadata{ + Name: name, + Description: description, + Image: image, + ImageData: imageData, + ExternalURL: externalURL, + Attributes: attributes, + BackgroundColor: backgroundColor, + AnimationURL: animationURL, + YoutubeURL: youtubeURL, + }) + + // Check if the error returned matches the expected error + uassert.ErrorIs(t, err, ErrInvalidTokenId) + + // Set the original caller to addr2 + std.TestSetOrigCaller(addr2) // addr2 + + // Try to set metadata for token 1 from addr2 (should fail) + cerr := dummy.SetTokenMetadata(TokenID("1"), Metadata{ + Name: name, + Description: description, + Image: image, + ImageData: imageData, + ExternalURL: externalURL, + Attributes: attributes, + BackgroundColor: backgroundColor, + AnimationURL: animationURL, + YoutubeURL: youtubeURL, + }) + + // Check if the error returned matches the expected error + uassert.ErrorIs(t, cerr, ErrCallerIsNotOwner) + + // Set the original caller back to addr1 + std.TestSetOrigCaller(addr1) // addr1 + + // Retrieve metadata for token 1 + dummyMetadata, err := dummy.TokenMetadata(TokenID("1")) + uassert.NoError(t, err, "Metadata error") + + // Check if metadata attributes match expected values + uassert.Equal(t, image, dummyMetadata.Image) + uassert.Equal(t, imageData, dummyMetadata.ImageData) + uassert.Equal(t, externalURL, dummyMetadata.ExternalURL) + uassert.Equal(t, description, dummyMetadata.Description) + uassert.Equal(t, name, dummyMetadata.Name) + uassert.Equal(t, len(attributes), len(dummyMetadata.Attributes)) + uassert.Equal(t, backgroundColor, dummyMetadata.BackgroundColor) + uassert.Equal(t, animationURL, dummyMetadata.AnimationURL) + uassert.Equal(t, youtubeURL, dummyMetadata.YoutubeURL) +} diff --git a/portal-loop/extracted/p/demo/grc/grc721/grc721_royalty.gno b/portal-loop/extracted/p/demo/grc/grc721/grc721_royalty.gno new file mode 100644 index 00000000..9831c709 --- /dev/null +++ b/portal-loop/extracted/p/demo/grc/grc721/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/portal-loop/extracted/p/demo/grc/grc721/grc721_royalty_test.gno b/portal-loop/extracted/p/demo/grc/grc721/grc721_royalty_test.gno new file mode 100644 index 00000000..7893453a --- /dev/null +++ b/portal-loop/extracted/p/demo/grc/grc721/grc721_royalty_test.gno @@ -0,0 +1,70 @@ +package grc721 + +import ( + "std" + "testing" + + "gno.land/p/demo/testutils" + "gno.land/p/demo/uassert" +) + +func TestSetTokenRoyalty(t *testing.T) { + dummy := NewNFTWithRoyalty(dummyNFTName, dummyNFTSymbol) + uassert.True(t, dummy != nil, "should not be nil") + + addr1 := testutils.TestAddress("alice") + addr2 := testutils.TestAddress("bob") + + paymentAddress := testutils.TestAddress("john") + percentage := uint64(10) // 10% + + salePrice := uint64(1000) + expectRoyaltyAmount := uint64(100) + + std.TestSetOrigCaller(addr1) // addr1 + + dummy.mint(addr1, TokenID("1")) + + derr := dummy.SetTokenRoyalty(TokenID("1"), RoyaltyInfo{ + PaymentAddress: paymentAddress, + Percentage: percentage, + }) + uassert.NoError(t, derr, "Should not result in error") + + // Test case: Invalid token ID + err := dummy.SetTokenRoyalty(TokenID("3"), RoyaltyInfo{ + PaymentAddress: paymentAddress, + Percentage: percentage, + }) + uassert.ErrorIs(t, derr, ErrInvalidTokenId) + + std.TestSetOrigCaller(addr2) // addr2 + + cerr := dummy.SetTokenRoyalty(TokenID("1"), RoyaltyInfo{ + PaymentAddress: paymentAddress, + Percentage: percentage, + }) + uassert.ErrorIs(t, cerr, ErrCallerIsNotOwner) + + // Test case: Invalid payment address + aerr := dummy.SetTokenRoyalty(TokenID("4"), RoyaltyInfo{ + PaymentAddress: std.Address("###"), // invalid address + Percentage: percentage, + }) + uassert.ErrorIs(t, aerr, ErrInvalidRoyaltyPaymentAddress) + + // Test case: Invalid percentage + perr := dummy.SetTokenRoyalty(TokenID("5"), RoyaltyInfo{ + PaymentAddress: paymentAddress, + Percentage: uint64(200), // over maxRoyaltyPercentage + }) + uassert.ErrorIs(t, perr, ErrInvalidRoyaltyPercentage) + + // Test case: Retrieving Royalty Info + std.TestSetOrigCaller(addr1) // addr1 + + dummyPaymentAddress, dummyRoyaltyAmount, rerr := dummy.RoyaltyInfo(TokenID("1"), salePrice) + uassert.NoError(t, rerr, "RoyaltyInfo error") + uassert.Equal(t, paymentAddress, dummyPaymentAddress) + uassert.Equal(t, expectRoyaltyAmount, dummyRoyaltyAmount) +} diff --git a/portal-loop/extracted/p/demo/grc/grc721/igrc721.gno b/portal-loop/extracted/p/demo/grc/grc721/igrc721.gno new file mode 100644 index 00000000..387547a7 --- /dev/null +++ b/portal-loop/extracted/p/demo/grc/grc721/igrc721.gno @@ -0,0 +1,38 @@ +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 +} + +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/portal-loop/extracted/p/demo/grc/grc721/igrc721_metadata.gno b/portal-loop/extracted/p/demo/grc/grc721/igrc721_metadata.gno new file mode 100644 index 00000000..8a2be1ff --- /dev/null +++ b/portal-loop/extracted/p/demo/grc/grc721/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/portal-loop/extracted/p/demo/grc/grc721/igrc721_royalty.gno b/portal-loop/extracted/p/demo/grc/grc721/igrc721_royalty.gno new file mode 100644 index 00000000..c4603d63 --- /dev/null +++ b/portal-loop/extracted/p/demo/grc/grc721/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/portal-loop/extracted/p/demo/grc/grc721/pkg_metadata.json b/portal-loop/extracted/p/demo/grc/grc721/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/grc/grc721/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/grc/grc721/util.gno b/portal-loop/extracted/p/demo/grc/grc721/util.gno new file mode 100644 index 00000000..bb6bf24d --- /dev/null +++ b/portal-loop/extracted/p/demo/grc/grc721/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/portal-loop/extracted/p/demo/grc/grc777/dummy_test.gno b/portal-loop/extracted/p/demo/grc/grc777/dummy_test.gno new file mode 100644 index 00000000..5f8ac359 --- /dev/null +++ b/portal-loop/extracted/p/demo/grc/grc777/dummy_test.gno @@ -0,0 +1,41 @@ +package grc777 + +import ( + "std" + "testing" +) + +type dummyImpl struct{} + +// FIXME: this should fail. +var _ IGRC777 = (*dummyImpl)(nil) + +func TestInterface(t *testing.T) { + var dummy IGRC777 = &dummyImpl{} +} + +func (impl *dummyImpl) GetName() string { panic("not implemented") } +func (impl *dummyImpl) GetSymbol() string { panic("not implemented") } +func (impl *dummyImpl) GetDecimals() uint { panic("not implemented") } +func (impl *dummyImpl) Granularity() (granularity uint64) { panic("not implemented") } +func (impl *dummyImpl) TotalSupply() (supply uint64) { panic("not implemented") } +func (impl *dummyImpl) BalanceOf(address std.Address) uint64 { panic("not implemented") } +func (impl *dummyImpl) Burn(amount uint64, data []byte) { panic("not implemented") } +func (impl *dummyImpl) AuthorizeOperator(operator std.Address) { panic("not implemented") } +func (impl *dummyImpl) RevokeOperator(operators std.Address) { panic("not implemented") } +func (impl *dummyImpl) DefaultOperators() []std.Address { panic("not implemented") } +func (impl *dummyImpl) Send(recipient std.Address, amount uint64, data []byte) { + panic("not implemented") +} + +func (impl *dummyImpl) IsOperatorFor(operator, tokenHolder std.Address) bool { + panic("not implemented") +} + +func (impl *dummyImpl) OperatorSend(sender, recipient std.Address, amount uint64, data, operatorData []byte) { + panic("not implemented") +} + +func (impl *dummyImpl) OperatorBurn(account std.Address, amount uint64, data, operatorData []byte) { + panic("not implemented") +} diff --git a/portal-loop/extracted/p/demo/grc/grc777/igrc777.gno b/portal-loop/extracted/p/demo/grc/grc777/igrc777.gno new file mode 100644 index 00000000..386b7789 --- /dev/null +++ b/portal-loop/extracted/p/demo/grc/grc777/igrc777.gno @@ -0,0 +1,169 @@ +package grc777 + +import ( + "std" + + "gno.land/p/demo/grc/exts" +) + +// TODO: use big.Int or a custom uint64 instead of uint64 + +type IGRC777 interface { + exts.TokenMetadata + + // Returns the smallest part of the token that is not divisible. This + // means all token operations (creation, movement and destruction) must + // have amounts that are a multiple of this number. + // + // For most token contracts, this value will equal 1. + Granularity() (granularity uint64) + + // Returns the amount of tokens in existence. + TotalSupply() (supply uint64) + + // Returns the amount of tokens owned by an account (`owner`). + BalanceOf(address std.Address) uint64 + + // Moves `amount` tokens from the caller's account to `recipient`. + // + // If send or receive hooks are registered for the caller and `recipient`, + // the corresponding functions will be called with `data` and empty + // `operatorData`. See {IERC777Sender} and {IERC777Recipient}. + // + // Emits a {Sent} event. + // + // Requirements + // + // - the caller must have at least `amount` tokens. + // - `recipient` cannot be the zero address. + // - if `recipient` is a contract, it must implement the {IERC777Recipient} + // interface. + Send(recipient std.Address, amount uint64, data []byte) + + // Destroys `amount` tokens from the caller's account, reducing the + // total supply. + // + // If a send hook is registered for the caller, the corresponding function + // will be called with `data` and empty `operatorData`. See {IERC777Sender}. + // + // Emits a {Burned} event. + // + // Requirements + // + // - the caller must have at least `amount` tokens. + Burn(amount uint64, data []byte) + + // Returns true if an account is an operator of `tokenHolder`. + // Operators can send and burn tokens on behalf of their owners. All + // accounts are their own operator. + // + // See {operatorSend} and {operatorBurn}. + IsOperatorFor(operator, tokenHolder std.Address) bool + + // Make an account an operator of the caller. + // + // See {isOperatorFor}. + // + // Emits an {AuthorizedOperator} event. + // + // Requirements + // + // - `operator` cannot be calling address. + AuthorizeOperator(operator std.Address) + + // Revoke an account's operator status for the caller. + // + // See {isOperatorFor} and {defaultOperators}. + // + // Emits a {RevokedOperator} event. + // + // Requirements + // + // - `operator` cannot be calling address. + RevokeOperator(operators std.Address) + + // Returns the list of default operators. These accounts are operators + // for all token holders, even if {authorizeOperator} was never called on + // them. + // + // This list is immutable, but individual holders may revoke these via + // {revokeOperator}, in which case {isOperatorFor} will return false. + DefaultOperators() []std.Address + + // Moves `amount` tokens from `sender` to `recipient`. The caller must + // be an operator of `sender`. + // + // If send or receive hooks are registered for `sender` and `recipient`, + // the corresponding functions will be called with `data` and + // `operatorData`. See {IERC777Sender} and {IERC777Recipient}. + // + // Emits a {Sent} event. + // + // Requirements + // + // - `sender` cannot be the zero address. + // - `sender` must have at least `amount` tokens. + // - the caller must be an operator for `sender`. + // - `recipient` cannot be the zero address. + // - if `recipient` is a contract, it must implement the {IERC777Recipient} + // interface. + OperatorSend(sender, recipient std.Address, amount uint64, data, operatorData []byte) + + // Destroys `amount` tokens from `account`, reducing the total supply. + // The caller must be an operator of `account`. + // + // If a send hook is registered for `account`, the corresponding function + // will be called with `data` and `operatorData`. See {IERC777Sender}. + // + // Emits a {Burned} event. + // + // Requirements + // + // - `account` cannot be the zero address. + // - `account` must have at least `amount` tokens. + // - the caller must be an operator for `account`. + OperatorBurn(account std.Address, amount uint64, data, operatorData []byte) +} + +// Emitted when `amount` tokens are created by `operator` and assigned to `to`. +// +// Note that some additional user `data` and `operatorData` can be logged in the event. +type MintedEvent struct { + Operator std.Address + To std.Address + Amount uint64 + Data []byte + OperatorData []byte +} + +// Emitted when `operator` destroys `amount` tokens from `account`. +// +// Note that some additional user `data` and `operatorData` can be logged in the event. +type BurnedEvent struct { + Operator std.Address + From std.Address + Amount uint64 + Data []byte + OperatorData []byte +} + +// Emitted when `operator` is made operator for `tokenHolder` +type AuthorizedOperatorEvent struct { + Operator std.Address + TokenHolder std.Address +} + +// Emitted when `operator` is revoked its operator status for `tokenHolder`. +type RevokedOperatorEvent struct { + Operator std.Address + TokenHolder std.Address +} + +type SentEvent struct { + Operator std.Address + From std.Address + To std.Address + Amount uint64 + Data []byte + OperatorData []byte +} diff --git a/portal-loop/extracted/p/demo/grc/grc777/pkg_metadata.json b/portal-loop/extracted/p/demo/grc/grc777/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/grc/grc777/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/groups/groups.gno b/portal-loop/extracted/p/demo/groups/groups.gno new file mode 100644 index 00000000..fcf77dd2 --- /dev/null +++ b/portal-loop/extracted/p/demo/groups/groups.gno @@ -0,0 +1,8 @@ +package groups + +import "gno.land/r/demo/boards" + +// TODO implement something and test. +type Group struct { + Board *boards.Board +} diff --git a/portal-loop/extracted/p/demo/groups/pkg_metadata.json b/portal-loop/extracted/p/demo/groups/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/groups/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/groups/vote_set.gno b/portal-loop/extracted/p/demo/groups/vote_set.gno new file mode 100644 index 00000000..f66fb0fc --- /dev/null +++ b/portal-loop/extracted/p/demo/groups/vote_set.gno @@ -0,0 +1,105 @@ +package groups + +import ( + "std" + "time" + + "gno.land/p/demo/rat" +) + +//---------------------------------------- +// VoteSet + +type VoteSet interface { + // number of present votes in set. + Size() int + // add or update vote for voter. + SetVote(voter std.Address, value string) error + // count the number of votes for value. + CountVotes(value string) int +} + +//---------------------------------------- +// VoteList + +type Vote struct { + Voter std.Address + Value string +} + +type VoteList []Vote + +func NewVoteList() *VoteList { + return &VoteList{} +} + +func (vlist *VoteList) Size() int { + return len(*vlist) +} + +func (vlist *VoteList) SetVote(voter std.Address, value string) error { + // TODO optimize with binary algorithm + for i, vote := range *vlist { + if vote.Voter == voter { + // update vote + (*vlist)[i] = Vote{ + Voter: voter, + Value: value, + } + return nil + } + } + *vlist = append(*vlist, Vote{ + Voter: voter, + Value: value, + }) + return nil +} + +func (vlist *VoteList) CountVotes(target string) int { + // TODO optimize with binary algorithm + var count int + for _, vote := range *vlist { + if vote.Value == target { + count++ + } + } + return count +} + +//---------------------------------------- +// Committee + +type Committee struct { + Quorum rat.Rat + Threshold rat.Rat + Addresses std.AddressSet +} + +//---------------------------------------- +// VoteSession +// NOTE: this seems a bit too formal and +// complicated vs what might be possible; +// something simpler, more informal. + +type SessionStatus int + +const ( + SessionNew SessionStatus = iota + SessionStarted + SessionCompleted + SessionCanceled +) + +type VoteSession struct { + Name string + Creator std.Address + Body string + Start time.Time + Deadline time.Time + Status SessionStatus + Committee *Committee + Votes VoteSet + Choices []string + Result string +} diff --git a/portal-loop/extracted/p/demo/groups/z_1_filetest.gno b/portal-loop/extracted/p/demo/groups/z_1_filetest.gno new file mode 100644 index 00000000..280b3956 --- /dev/null +++ b/portal-loop/extracted/p/demo/groups/z_1_filetest.gno @@ -0,0 +1,28 @@ +// PKGPATH: gno.land/r/demo/groups_test +package groups_test + +import ( + "gno.land/p/demo/groups" + "gno.land/p/demo/testutils" +) + +var vset groups.VoteSet + +func init() { + addr1 := testutils.TestAddress("test1") + addr2 := testutils.TestAddress("test2") + vset = groups.NewVoteList() + vset.SetVote(addr1, "yes") + vset.SetVote(addr2, "yes") +} + +func main() { + println(vset.Size()) + println("yes:", vset.CountVotes("yes")) + println("no:", vset.CountVotes("no")) +} + +// Output: +// 2 +// yes: 2 +// no: 0 diff --git a/portal-loop/extracted/p/demo/int256/LICENSE b/portal-loop/extracted/p/demo/int256/LICENSE new file mode 100644 index 00000000..fc7e78a4 --- /dev/null +++ b/portal-loop/extracted/p/demo/int256/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Trịnh Đức Bảo Linh(Kevin) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/int256/README.md b/portal-loop/extracted/p/demo/int256/README.md new file mode 100644 index 00000000..be467471 --- /dev/null +++ b/portal-loop/extracted/p/demo/int256/README.md @@ -0,0 +1,6 @@ +# Fixed size signed 256-bit math library + +1. This is a library specialized at replacing the big.Int library for math based on signed 256-bit types. +2. It uses [uint256](https://github.com/gnolang/gno/tree/master/examples/gno.land/p/demo/uint256) as the underlying type. + +ported from [mempooler/int256](https://github.com/mempooler/int256) diff --git a/portal-loop/extracted/p/demo/int256/absolute.gno b/portal-loop/extracted/p/demo/int256/absolute.gno new file mode 100644 index 00000000..825dd60c --- /dev/null +++ b/portal-loop/extracted/p/demo/int256/absolute.gno @@ -0,0 +1,18 @@ +package int256 + +import "gno.land/p/demo/uint256" + +// Abs returns |z| +func (z *Int) Abs() *uint256.Uint { + return z.abs.Clone() +} + +// AbsGt returns true if |z| > x, where x is a uint256 +func (z *Int) AbsGt(x *uint256.Uint) bool { + return z.abs.Gt(x) +} + +// AbsLt returns true if |z| < x, where x is a uint256 +func (z *Int) AbsLt(x *uint256.Uint) bool { + return z.abs.Lt(x) +} diff --git a/portal-loop/extracted/p/demo/int256/absolute_test.gno b/portal-loop/extracted/p/demo/int256/absolute_test.gno new file mode 100644 index 00000000..55f6e41d --- /dev/null +++ b/portal-loop/extracted/p/demo/int256/absolute_test.gno @@ -0,0 +1,105 @@ +package int256 + +import ( + "testing" + + "gno.land/p/demo/uint256" +) + +func TestAbs(t *testing.T) { + tests := []struct { + x, want string + }{ + {"0", "0"}, + {"1", "1"}, + {"-1", "1"}, + {"-2", "2"}, + {"-115792089237316195423570985008687907853269984665640564039457584007913129639935", "115792089237316195423570985008687907853269984665640564039457584007913129639935"}, + } + + for _, tc := range tests { + x, err := FromDecimal(tc.x) + if err != nil { + t.Error(err) + continue + } + + got := x.Abs() + + if got.ToString() != tc.want { + t.Errorf("Abs(%s) = %v, want %v", tc.x, got.ToString(), tc.want) + } + } +} + +func TestAbsGt(t *testing.T) { + tests := []struct { + x, y, want string + }{ + {"0", "0", "false"}, + {"1", "0", "true"}, + {"-1", "0", "true"}, + {"-1", "1", "false"}, + {"-2", "1", "true"}, + {"-115792089237316195423570985008687907853269984665640564039457584007913129639935", "0", "true"}, + {"-115792089237316195423570985008687907853269984665640564039457584007913129639935", "1", "true"}, + {"-115792089237316195423570985008687907853269984665640564039457584007913129639935", "115792089237316195423570985008687907853269984665640564039457584007913129639935", "false"}, + } + + for _, tc := range tests { + x, err := FromDecimal(tc.x) + if err != nil { + t.Error(err) + continue + } + + y, err := uint256.FromDecimal(tc.y) + if err != nil { + t.Error(err) + continue + } + + got := x.AbsGt(y) + + if got != (tc.want == "true") { + t.Errorf("AbsGt(%s, %s) = %v, want %v", tc.x, tc.y, got, tc.want) + } + } +} + +func TestAbsLt(t *testing.T) { + tests := []struct { + x, y, want string + }{ + {"0", "0", "false"}, + {"1", "0", "false"}, + {"-1", "0", "false"}, + {"-1", "1", "false"}, + {"-2", "1", "false"}, + {"-5", "10", "true"}, + {"31330", "31337", "true"}, + {"-115792089237316195423570985008687907853269984665640564039457584007913129639935", "0", "false"}, + {"-115792089237316195423570985008687907853269984665640564039457584007913129639935", "1", "false"}, + {"-115792089237316195423570985008687907853269984665640564039457584007913129639935", "115792089237316195423570985008687907853269984665640564039457584007913129639935", "false"}, + } + + for _, tc := range tests { + x, err := FromDecimal(tc.x) + if err != nil { + t.Error(err) + continue + } + + y, err := uint256.FromDecimal(tc.y) + if err != nil { + t.Error(err) + continue + } + + got := x.AbsLt(y) + + if got != (tc.want == "true") { + t.Errorf("AbsLt(%s, %s) = %v, want %v", tc.x, tc.y, got, tc.want) + } + } +} diff --git a/portal-loop/extracted/p/demo/int256/arithmetic.gno b/portal-loop/extracted/p/demo/int256/arithmetic.gno new file mode 100644 index 00000000..8926fe1d --- /dev/null +++ b/portal-loop/extracted/p/demo/int256/arithmetic.gno @@ -0,0 +1,202 @@ +package int256 + +import "gno.land/p/demo/uint256" + +func (z *Int) Add(x, y *Int) *Int { + z.initiateAbs() + + if x.neg == y.neg { + // If both numbers have the same sign, add their absolute values + z.abs.Add(x.abs, y.abs) + z.neg = x.neg + } else { + switch x.abs.Cmp(y.abs) { + case 1: // x > y + z.abs.Sub(x.abs, y.abs) + z.neg = x.neg + case -1: // x < y + z.abs.Sub(y.abs, x.abs) + z.neg = y.neg + case 0: // x == y + z.abs = uint256.NewUint(0) + } + } + + return z +} + +// AddUint256 set z to the sum x + y, where y is a uint256, and returns z +func (z *Int) AddUint256(x *Int, y *uint256.Uint) *Int { + if x.neg { + if x.abs.Gt(y) { + z.abs.Sub(x.abs, y) + z.neg = true + } else { + z.abs.Sub(y, x.abs) + z.neg = false + } + } else { + z.abs.Add(x.abs, y) + z.neg = false + } + return z +} + +// Sets z to the sum x + y, where z and x are uint256s and y is an int256. +func AddDelta(z, x *uint256.Uint, y *Int) { + if y.neg { + z.Sub(x, y.abs) + } else { + z.Add(x, y.abs) + } +} + +// Sets z to the sum x + y, where z and x are uint256s and y is an int256. +func AddDeltaOverflow(z, x *uint256.Uint, y *Int) bool { + var overflow bool + if y.neg { + _, overflow = z.SubOverflow(x, y.abs) + } else { + _, overflow = z.AddOverflow(x, y.abs) + } + return overflow +} + +// Sub sets z to the difference x-y and returns z. +func (z *Int) Sub(x, y *Int) *Int { + z.initiateAbs() + + if x.neg != y.neg { + // If sign are different, add the absolute values + z.abs.Add(x.abs, y.abs) + z.neg = x.neg + } else { + switch x.abs.Cmp(y.abs) { + case 1: // x > y + z.abs.Sub(x.abs, y.abs) + z.neg = x.neg + case -1: // x < y + z.abs.Sub(y.abs, x.abs) + z.neg = !x.neg + case 0: // x == y + z.abs = uint256.NewUint(0) + } + } + + // Ensure zero is always positive + if z.abs.IsZero() { + z.neg = false + } + return z +} + +// SubUint256 set z to the difference x - y, where y is a uint256, and returns z +func (z *Int) SubUint256(x *Int, y *uint256.Uint) *Int { + if x.neg { + z.abs.Add(x.abs, y) + z.neg = true + } else { + if x.abs.Lt(y) { + z.abs.Sub(y, x.abs) + z.neg = true + } else { + z.abs.Sub(x.abs, y) + z.neg = false + } + } + return z +} + +// Mul sets z to the product x*y and returns z. +func (z *Int) Mul(x, y *Int) *Int { + z.initiateAbs() + + z.abs = z.abs.Mul(x.abs, y.abs) + z.neg = x.neg != y.neg && !z.abs.IsZero() // 0 has no sign + return z +} + +// MulUint256 sets z to the product x*y, where y is a uint256, and returns z +func (z *Int) MulUint256(x *Int, y *uint256.Uint) *Int { + z.abs.Mul(x.abs, y) + if z.abs.IsZero() { + z.neg = false + } else { + z.neg = x.neg + } + return z +} + +// Div sets z to the quotient x/y for y != 0 and returns z. +func (z *Int) Div(x, y *Int) *Int { + z.initiateAbs() + + if y.abs.IsZero() { + panic("division by zero") + } + + z.abs.Div(x.abs, y.abs) + z.neg = (x.neg != y.neg) && !z.abs.IsZero() // 0 has no sign + + return z +} + +// DivUint256 sets z to the quotient x/y, where y is a uint256, and returns z +// If y == 0, z is set to 0 +func (z *Int) DivUint256(x *Int, y *uint256.Uint) *Int { + z.abs.Div(x.abs, y) + if z.abs.IsZero() { + z.neg = false + } else { + z.neg = x.neg + } + return z +} + +// Quo sets z to the quotient x/y for y != 0 and returns z. +// If y == 0, a division-by-zero run-time panic occurs. +// OBS: differs from mempooler int256, we need to panic manually if y == 0 +// Quo implements truncated division (like Go); see QuoRem for more details. +func (z *Int) Quo(x, y *Int) *Int { + if y.IsZero() { + panic("division by zero") + } + + z.initiateAbs() + + z.abs = z.abs.Div(x.abs, y.abs) + z.neg = !(z.abs.IsZero()) && x.neg != y.neg // 0 has no sign + return z +} + +// Rem sets z to the remainder x%y for y != 0 and returns z. +// If y == 0, a division-by-zero run-time panic occurs. +// OBS: differs from mempooler int256, we need to panic manually if y == 0 +// Rem implements truncated modulus (like Go); see QuoRem for more details. +func (z *Int) Rem(x, y *Int) *Int { + if y.IsZero() { + panic("division by zero") + } + + z.initiateAbs() + + z.abs.Mod(x.abs, y.abs) + z.neg = z.abs.Sign() > 0 && x.neg // 0 has no sign + return z +} + +// Mod sets z to the modulus x%y for y != 0 and returns z. +// If y == 0, z is set to 0 (OBS: differs from the big.Int) +func (z *Int) Mod(x, y *Int) *Int { + if x.neg { + z.abs.Div(x.abs, y.abs) + z.abs.Add(z.abs, one) + z.abs.Mul(z.abs, y.abs) + z.abs.Sub(z.abs, x.abs) + z.abs.Mod(z.abs, y.abs) + } else { + z.abs.Mod(x.abs, y.abs) + } + z.neg = false + return z +} diff --git a/portal-loop/extracted/p/demo/int256/arithmetic_test.gno b/portal-loop/extracted/p/demo/int256/arithmetic_test.gno new file mode 100644 index 00000000..4cfa3068 --- /dev/null +++ b/portal-loop/extracted/p/demo/int256/arithmetic_test.gno @@ -0,0 +1,571 @@ +package int256 + +import ( + "testing" + + "gno.land/p/demo/uint256" +) + +func TestAdd(t *testing.T) { + tests := []struct { + x, y, want string + }{ + {"0", "1", "1"}, + {"1", "0", "1"}, + {"1", "1", "2"}, + {"1", "2", "3"}, + // NEGATIVE + {"-1", "1", "0"}, + {"1", "-1", "0"}, + {"3", "-3", "0"}, + {"-1", "-1", "-2"}, + {"-1", "-2", "-3"}, + {"-1", "3", "2"}, + {"3", "-1", "2"}, + // OVERFLOW + {"115792089237316195423570985008687907853269984665640564039457584007913129639935", "1", "0"}, + } + + for _, tc := range tests { + x, err := FromDecimal(tc.x) + if err != nil { + t.Error(err) + continue + } + + y, err := FromDecimal(tc.y) + if err != nil { + t.Error(err) + continue + } + + want, err := FromDecimal(tc.want) + if err != nil { + t.Error(err) + continue + } + + got := New() + got.Add(x, y) + + if got.Neq(want) { + t.Errorf("Add(%s, %s) = %v, want %v", tc.x, tc.y, got.ToString(), want.ToString()) + } + } +} + +func TestAddUint256(t *testing.T) { + tests := []struct { + x, y, want string + }{ + {"0", "1", "1"}, + {"1", "0", "1"}, + {"1", "1", "2"}, + {"1", "2", "3"}, + {"-1", "1", "0"}, + {"-1", "3", "2"}, + {"-115792089237316195423570985008687907853269984665640564039457584007913129639934", "115792089237316195423570985008687907853269984665640564039457584007913129639935", "1"}, + {"-115792089237316195423570985008687907853269984665640564039457584007913129639935", "115792089237316195423570985008687907853269984665640564039457584007913129639934", "-1"}, + // OVERFLOW + {"-115792089237316195423570985008687907853269984665640564039457584007913129639935", "115792089237316195423570985008687907853269984665640564039457584007913129639935", "0"}, + } + + for _, tc := range tests { + x, err := FromDecimal(tc.x) + if err != nil { + t.Error(err) + continue + } + + y, err := uint256.FromDecimal(tc.y) + if err != nil { + t.Error(err) + continue + } + + want, err := FromDecimal(tc.want) + if err != nil { + t.Error(err) + continue + } + + got := New() + got.AddUint256(x, y) + + if got.Neq(want) { + t.Errorf("AddUint256(%s, %s) = %v, want %v", tc.x, tc.y, got.ToString(), want.ToString()) + } + } +} + +func TestAddDelta(t *testing.T) { + tests := []struct { + z, x, y, want string + }{ + {"0", "0", "0", "0"}, + {"0", "0", "1", "1"}, + {"0", "1", "0", "1"}, + {"0", "1", "1", "2"}, + {"1", "2", "3", "5"}, + {"5", "10", "-3", "7"}, + // underflow + {"1", "2", "-3", "115792089237316195423570985008687907853269984665640564039457584007913129639935"}, + } + + for _, tc := range tests { + z, err := uint256.FromDecimal(tc.z) + if err != nil { + t.Error(err) + continue + } + + x, err := uint256.FromDecimal(tc.x) + if err != nil { + t.Error(err) + continue + } + + y, err := FromDecimal(tc.y) + if err != nil { + t.Error(err) + continue + } + + want, err := uint256.FromDecimal(tc.want) + if err != nil { + t.Error(err) + continue + } + + AddDelta(z, x, y) + + if z.Neq(want) { + t.Errorf("AddDelta(%s, %s, %s) = %v, want %v", tc.z, tc.x, tc.y, z.ToString(), want.ToString()) + } + } +} + +func TestAddDeltaOverflow(t *testing.T) { + tests := []struct { + z, x, y string + want bool + }{ + {"0", "0", "0", false}, + // underflow + {"1", "2", "-3", true}, + } + + for _, tc := range tests { + z, err := uint256.FromDecimal(tc.z) + if err != nil { + t.Error(err) + continue + } + + x, err := uint256.FromDecimal(tc.x) + if err != nil { + t.Error(err) + continue + } + + y, err := FromDecimal(tc.y) + if err != nil { + t.Error(err) + continue + } + + result := AddDeltaOverflow(z, x, y) + if result != tc.want { + t.Errorf("AddDeltaOverflow(%s, %s, %s) = %v, want %v", tc.z, tc.x, tc.y, result, tc.want) + } + } +} + +func TestSub(t *testing.T) { + tests := []struct { + x, y, want string + }{ + {"1", "0", "1"}, + {"1", "1", "0"}, + {"-1", "1", "-2"}, + {"1", "-1", "2"}, + {"-1", "-1", "0"}, + {"-115792089237316195423570985008687907853269984665640564039457584007913129639935", "-115792089237316195423570985008687907853269984665640564039457584007913129639935", "0"}, + {"-115792089237316195423570985008687907853269984665640564039457584007913129639935", "0", "-115792089237316195423570985008687907853269984665640564039457584007913129639935"}, + {x: "-115792089237316195423570985008687907853269984665640564039457584007913129639935", y: "1", want: "0"}, + } + + for _, tc := range tests { + x, err := FromDecimal(tc.x) + if err != nil { + t.Error(err) + continue + } + + y, err := FromDecimal(tc.y) + if err != nil { + t.Error(err) + continue + } + + want, err := FromDecimal(tc.want) + if err != nil { + t.Error(err) + continue + } + + got := New() + got.Sub(x, y) + + if got.Neq(want) { + t.Errorf("Sub(%s, %s) = %v, want %v", tc.x, tc.y, got.ToString(), want.ToString()) + } + } +} + +func TestSubUint256(t *testing.T) { + tests := []struct { + x, y, want string + }{ + {"0", "1", "-1"}, + {"1", "0", "1"}, + {"1", "1", "0"}, + {"1", "2", "-1"}, + {"-1", "1", "-2"}, + {"-1", "3", "-4"}, + // underflow + {"-115792089237316195423570985008687907853269984665640564039457584007913129639935", "1", "-0"}, + {"-115792089237316195423570985008687907853269984665640564039457584007913129639935", "2", "-1"}, + {"-115792089237316195423570985008687907853269984665640564039457584007913129639935", "3", "-2"}, + } + + for _, tc := range tests { + x, err := FromDecimal(tc.x) + if err != nil { + t.Error(err) + continue + } + + y, err := uint256.FromDecimal(tc.y) + if err != nil { + t.Error(err) + continue + } + + want, err := FromDecimal(tc.want) + if err != nil { + t.Error(err) + continue + } + + got := New() + got.SubUint256(x, y) + + if got.Neq(want) { + t.Errorf("SubUint256(%s, %s) = %v, want %v", tc.x, tc.y, got.ToString(), want.ToString()) + } + } +} + +func TestMul(t *testing.T) { + tests := []struct { + x, y, want string + }{ + {"5", "3", "15"}, + {"-5", "3", "-15"}, + {"5", "-3", "-15"}, + {"0", "3", "0"}, + {"3", "0", "0"}, + } + + for _, tc := range tests { + x, err := FromDecimal(tc.x) + if err != nil { + t.Error(err) + continue + } + + y, err := FromDecimal(tc.y) + if err != nil { + t.Error(err) + continue + } + + want, err := FromDecimal(tc.want) + if err != nil { + t.Error(err) + continue + } + + got := New() + got.Mul(x, y) + + if got.Neq(want) { + t.Errorf("Mul(%s, %s) = %v, want %v", tc.x, tc.y, got.ToString(), want.ToString()) + } + } +} + +func TestMulUint256(t *testing.T) { + tests := []struct { + x, y, want string + }{ + {"0", "1", "0"}, + {"1", "0", "0"}, + {"1", "1", "1"}, + {"1", "2", "2"}, + {"-1", "1", "-1"}, + {"-1", "3", "-3"}, + {"3", "4", "12"}, + {"-3", "4", "-12"}, + {"-115792089237316195423570985008687907853269984665640564039457584007913129639934", "2", "-115792089237316195423570985008687907853269984665640564039457584007913129639932"}, + {"115792089237316195423570985008687907853269984665640564039457584007913129639934", "2", "115792089237316195423570985008687907853269984665640564039457584007913129639932"}, + } + + for _, tc := range tests { + x, err := FromDecimal(tc.x) + if err != nil { + t.Error(err) + continue + } + + y, err := uint256.FromDecimal(tc.y) + if err != nil { + t.Error(err) + continue + } + + want, err := FromDecimal(tc.want) + if err != nil { + t.Error(err) + continue + } + + got := New() + got.MulUint256(x, y) + + if got.Neq(want) { + t.Errorf("MulUint256(%s, %s) = %v, want %v", tc.x, tc.y, got.ToString(), want.ToString()) + } + } +} + +func TestDiv(t *testing.T) { + tests := []struct { + x, y, expected string + }{ + {"1", "1", "1"}, + {"0", "1", "0"}, + {"-1", "1", "-1"}, + {"1", "-1", "-1"}, + {"-1", "-1", "1"}, + {"-6", "3", "-2"}, + {"10", "-2", "-5"}, + {"-10", "3", "-3"}, + {"7", "3", "2"}, + {"-7", "3", "-2"}, + {"115792089237316195423570985008687907853269984665640564039457584007913129639935", "2", "57896044618658097711785492504343953926634992332820282019728792003956564819967"}, // Max uint256 / 2 + } + + for _, tt := range tests { + t.Run(tt.x+"/"+tt.y, func(t *testing.T) { + x := MustFromDecimal(tt.x) + y := MustFromDecimal(tt.y) + result := Zero().Div(x, y) + if result.ToString() != tt.expected { + t.Errorf("Div(%s, %s) = %s, want %s", tt.x, tt.y, result.ToString(), tt.expected) + } + if result.abs.IsZero() && result.neg { + t.Errorf("Div(%s, %s) resulted in negative zero", tt.x, tt.y) + } + }) + } + + t.Run("Division by zero", func(t *testing.T) { + defer func() { + if r := recover(); r == nil { + t.Errorf("Div(1, 0) did not panic") + } + }() + x := MustFromDecimal("1") + y := MustFromDecimal("0") + Zero().Div(x, y) + }) +} + +func TestDivUint256(t *testing.T) { + tests := []struct { + x, y, want string + }{ + {"0", "1", "0"}, + {"1", "0", "0"}, + {"1", "1", "1"}, + {"1", "2", "0"}, + {"-1", "1", "-1"}, + {"-1", "3", "0"}, + {"4", "3", "1"}, + {"25", "5", "5"}, + {"25", "4", "6"}, + {"-115792089237316195423570985008687907853269984665640564039457584007913129639934", "2", "-57896044618658097711785492504343953926634992332820282019728792003956564819967"}, + {"115792089237316195423570985008687907853269984665640564039457584007913129639934", "2", "57896044618658097711785492504343953926634992332820282019728792003956564819967"}, + } + + for _, tc := range tests { + x, err := FromDecimal(tc.x) + if err != nil { + t.Error(err) + continue + } + + y, err := uint256.FromDecimal(tc.y) + if err != nil { + t.Error(err) + continue + } + + want, err := FromDecimal(tc.want) + if err != nil { + t.Error(err) + continue + } + + got := New() + got.DivUint256(x, y) + + if got.Neq(want) { + t.Errorf("DivUint256(%s, %s) = %v, want %v", tc.x, tc.y, got.ToString(), want.ToString()) + } + } +} + +func TestQuo(t *testing.T) { + tests := []struct { + x, y, want string + }{ + {"0", "1", "0"}, + {"0", "-1", "0"}, + {"10", "1", "10"}, + {"10", "-1", "-10"}, + {"-10", "1", "-10"}, + {"-10", "-1", "10"}, + {"10", "-3", "-3"}, + {"10", "3", "3"}, + } + + for _, tc := range tests { + x, err := FromDecimal(tc.x) + if err != nil { + t.Error(err) + continue + } + + y, err := FromDecimal(tc.y) + if err != nil { + t.Error(err) + continue + } + + want, err := FromDecimal(tc.want) + if err != nil { + t.Error(err) + continue + } + + got := New() + got.Quo(x, y) + + if got.Neq(want) { + t.Errorf("Quo(%s, %s) = %v, want %v", tc.x, tc.y, got.ToString(), want.ToString()) + } + } +} + +func TestRem(t *testing.T) { + tests := []struct { + x, y, want string + }{ + {"0", "1", "0"}, + {"0", "-1", "0"}, + {"10", "1", "0"}, + {"10", "-1", "0"}, + {"-10", "1", "0"}, + {"-10", "-1", "0"}, + {"10", "3", "1"}, + {"10", "-3", "1"}, + {"-10", "3", "-1"}, + {"-10", "-3", "-1"}, + } + + for _, tc := range tests { + x, err := FromDecimal(tc.x) + if err != nil { + t.Error(err) + continue + } + + y, err := FromDecimal(tc.y) + if err != nil { + t.Error(err) + continue + } + + want, err := FromDecimal(tc.want) + if err != nil { + t.Error(err) + continue + } + + got := New() + got.Rem(x, y) + + if got.Neq(want) { + t.Errorf("Rem(%s, %s) = %v, want %v", tc.x, tc.y, got.ToString(), want.ToString()) + } + } +} + +func TestMod(t *testing.T) { + tests := []struct { + x, y, want string + }{ + {"0", "1", "0"}, + {"0", "-1", "0"}, + {"10", "0", "0"}, + {"10", "1", "0"}, + {"10", "-1", "0"}, + {"-10", "0", "0"}, + {"-10", "1", "0"}, + {"-10", "-1", "0"}, + {"10", "3", "1"}, + {"10", "-3", "1"}, + {"-10", "3", "2"}, + {"-10", "-3", "2"}, + } + + for _, tc := range tests { + x, err := FromDecimal(tc.x) + if err != nil { + t.Error(err) + continue + } + + y, err := FromDecimal(tc.y) + if err != nil { + t.Error(err) + continue + } + + want, err := FromDecimal(tc.want) + if err != nil { + t.Error(err) + continue + } + + got := New() + got.Mod(x, y) + + if got.Neq(want) { + t.Errorf("Mod(%s, %s) = %v, want %v", tc.x, tc.y, got.ToString(), want.ToString()) + } + } +} diff --git a/portal-loop/extracted/p/demo/int256/bitwise.gno b/portal-loop/extracted/p/demo/int256/bitwise.gno new file mode 100644 index 00000000..c0d0f65f --- /dev/null +++ b/portal-loop/extracted/p/demo/int256/bitwise.gno @@ -0,0 +1,94 @@ +package int256 + +import ( + "gno.land/p/demo/uint256" +) + +// Or sets z = x | y and returns z. +func (z *Int) Or(x, y *Int) *Int { + if x.neg == y.neg { + if x.neg { + // (-x) | (-y) == ^(x-1) | ^(y-1) == ^((x-1) & (y-1)) == -(((x-1) & (y-1)) + 1) + x1 := new(uint256.Uint).Sub(x.abs, one) + y1 := new(uint256.Uint).Sub(y.abs, one) + z.abs = z.abs.Add(z.abs.And(x1, y1), one) + z.neg = true // z cannot be zero if x and y are negative + return z + } + + // x | y == x | y + z.abs = z.abs.Or(x.abs, y.abs) + z.neg = false + return z + } + + // x.neg != y.neg + if x.neg { + x, y = y, x // | is symmetric + } + + // x | (-y) == x | ^(y-1) == ^((y-1) &^ x) == -(^((y-1) &^ x) + 1) + y1 := new(uint256.Uint).Sub(y.abs, one) + z.abs = z.abs.Add(z.abs.AndNot(y1, x.abs), one) + z.neg = true // z cannot be zero if one of x or y is negative + + return z +} + +// And sets z = x & y and returns z. +func (z *Int) And(x, y *Int) *Int { + if x.neg == y.neg { + if x.neg { + // (-x) & (-y) == ^(x-1) & ^(y-1) == ^((x-1) | (y-1)) == -(((x-1) | (y-1)) + 1) + x1 := new(uint256.Uint).Sub(x.abs, one) + y1 := new(uint256.Uint).Sub(y.abs, one) + z.abs = z.abs.Add(z.abs.Or(x1, y1), one) + z.neg = true // z cannot be zero if x and y are negative + return z + } + + // x & y == x & y + z.abs = z.abs.And(x.abs, y.abs) + z.neg = false + return z + } + + // x.neg != y.neg + // REF: https://cs.opensource.google/go/go/+/refs/tags/go1.22.1:src/math/big/int.go;l=1192-1202;drc=d57303e65f00b84b528ee682747dbe1fd3316d30 + if x.neg { + x, y = y, x // & is symmetric + } + + // x & (-y) == x & ^(y-1) == x &^ (y-1) + y1 := new(uint256.Uint).Sub(y.abs, uint256.One()) + z.abs = z.abs.AndNot(x.abs, y1) + z.neg = false + return z +} + +// Rsh sets z = x >> n and returns z. +// OBS: Different from original implementation it was using math.Big +func (z *Int) Rsh(x *Int, n uint) *Int { + if !x.neg { + z.abs.Rsh(x.abs, n) + z.neg = x.neg + return z + } + + // REF: https://cs.opensource.google/go/go/+/refs/tags/go1.22.1:src/math/big/int.go;l=1118-1126;drc=d57303e65f00b84b528ee682747dbe1fd3316d30 + t := NewInt(0).Sub(FromUint256(x.abs), NewInt(1)) + t = t.Rsh(t, n) + + _tmp := t.Add(t, NewInt(1)) + z.abs = _tmp.Abs() + z.neg = true + + return z +} + +// Lsh sets z = x << n and returns z. +func (z *Int) Lsh(x *Int, n uint) *Int { + z.abs.Lsh(x.abs, n) + z.neg = x.neg + return z +} diff --git a/portal-loop/extracted/p/demo/int256/bitwise_test.gno b/portal-loop/extracted/p/demo/int256/bitwise_test.gno new file mode 100644 index 00000000..8dc16cd1 --- /dev/null +++ b/portal-loop/extracted/p/demo/int256/bitwise_test.gno @@ -0,0 +1,199 @@ +package int256 + +import ( + "testing" + + "gno.land/p/demo/uint256" +) + +func TestOr(t *testing.T) { + tests := []struct { + name string + x, y, want Int + }{ + { + name: "all zeroes", + x: Int{abs: &uint256.Uint{arr: [4]uint64{0, 0, 0, 0}}, neg: false}, + y: Int{abs: &uint256.Uint{arr: [4]uint64{0, 0, 0, 0}}, neg: false}, + want: Int{abs: &uint256.Uint{arr: [4]uint64{0, 0, 0, 0}}, neg: false}, + }, + { + name: "all ones", + x: Int{abs: &uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, neg: false}, + y: Int{abs: &uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, neg: false}, + want: Int{abs: &uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, neg: false}, + }, + { + name: "mixed", + x: Int{abs: &uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), 0, 0}}, neg: false}, + y: Int{abs: &uint256.Uint{arr: [4]uint64{0, 0, ^uint64(0), ^uint64(0)}}, neg: false}, + want: Int{abs: &uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, neg: false}, + }, + { + name: "one operand all ones", + x: Int{abs: &uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, neg: false}, + y: Int{abs: &uint256.Uint{arr: [4]uint64{0x5555555555555555, 0xAAAAAAAAAAAAAAAA, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000}}, neg: false}, + want: Int{abs: &uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, neg: false}, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + got := New() + got.Or(&tc.x, &tc.y) + + if got.Neq(&tc.want) { + t.Errorf("Or(%v, %v) = %v, want %v", tc.x, tc.y, got, tc.want) + } + }) + } +} + +func TestAnd(t *testing.T) { + tests := []struct { + name string + x, y, want Int + }{ + { + name: "all zeroes", + x: Int{abs: &uint256.Uint{arr: [4]uint64{0, 0, 0, 0}}, neg: false}, + y: Int{abs: &uint256.Uint{arr: [4]uint64{0, 0, 0, 0}}, neg: false}, + want: Int{abs: &uint256.Uint{arr: [4]uint64{0, 0, 0, 0}}, neg: false}, + }, + { + name: "all ones", + x: Int{abs: &uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, neg: false}, + y: Int{abs: &uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, neg: false}, + want: Int{abs: &uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, neg: false}, + }, + { + name: "mixed", + x: Int{abs: &uint256.Uint{arr: [4]uint64{0, 0, 0, 0}}, neg: false}, + y: Int{abs: &uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, neg: false}, + want: Int{abs: &uint256.Uint{arr: [4]uint64{0, 0, 0, 0}}, neg: false}, + }, + { + name: "mixed 2", + x: Int{abs: &uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, neg: false}, + y: Int{abs: &uint256.Uint{arr: [4]uint64{0, 0, 0, 0}}, neg: false}, + want: Int{abs: &uint256.Uint{arr: [4]uint64{0, 0, 0, 0}}, neg: false}, + }, + { + name: "mixed 3", + x: Int{abs: &uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), 0, 0}}, neg: false}, + y: Int{abs: &uint256.Uint{arr: [4]uint64{0, 0, ^uint64(0), ^uint64(0)}}, neg: false}, + want: Int{abs: &uint256.Uint{arr: [4]uint64{0, 0, 0, 0}}, neg: false}, + }, + { + name: "one operand zero", + x: Int{abs: &uint256.Uint{arr: [4]uint64{0, 0, 0, 0}}, neg: false}, + y: Int{abs: &uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, neg: false}, + want: Int{abs: &uint256.Uint{arr: [4]uint64{0, 0, 0, 0}}, neg: false}, + }, + { + name: "one operand all ones", + x: Int{abs: &uint256.Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, neg: false}, + y: Int{abs: &uint256.Uint{arr: [4]uint64{0x5555555555555555, 0xAAAAAAAAAAAAAAAA, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000}}, neg: false}, + want: Int{abs: &uint256.Uint{arr: [4]uint64{0x5555555555555555, 0xAAAAAAAAAAAAAAAA, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000}}, neg: false}, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + got := New() + got.And(&tc.x, &tc.y) + + if got.Neq(&tc.want) { + t.Errorf("And(%v, %v) = %v, want %v", tc.x, tc.y, got, tc.want) + } + }) + } +} + +func TestRsh(t *testing.T) { + tests := []struct { + x string + n uint + want string + }{ + {"1024", 0, "1024"}, + {"1024", 1, "512"}, + {"1024", 2, "256"}, + {"1024", 10, "1"}, + {"1024", 11, "0"}, + {"18446744073709551615", 0, "18446744073709551615"}, + {"18446744073709551615", 1, "9223372036854775807"}, + {"18446744073709551615", 62, "3"}, + {"18446744073709551615", 63, "1"}, + {"18446744073709551615", 64, "0"}, + {"115792089237316195423570985008687907853269984665640564039457584007913129639935", 0, "115792089237316195423570985008687907853269984665640564039457584007913129639935"}, + {"115792089237316195423570985008687907853269984665640564039457584007913129639935", 1, "57896044618658097711785492504343953926634992332820282019728792003956564819967"}, + {"115792089237316195423570985008687907853269984665640564039457584007913129639935", 128, "340282366920938463463374607431768211455"}, + {"115792089237316195423570985008687907853269984665640564039457584007913129639935", 255, "1"}, + {"115792089237316195423570985008687907853269984665640564039457584007913129639935", 256, "0"}, + {"-1024", 0, "-1024"}, + {"-1024", 1, "-512"}, + {"-1024", 2, "-256"}, + {"-1024", 10, "-1"}, + {"-1024", 10, "-1"}, + {"-9223372036854775808", 0, "-9223372036854775808"}, + {"-9223372036854775808", 1, "-4611686018427387904"}, + {"-9223372036854775808", 62, "-2"}, + {"-9223372036854775808", 63, "-1"}, + {"-9223372036854775808", 64, "-1"}, + {"-57896044618658097711785492504343953926634992332820282019728792003956564819968", 0, "-57896044618658097711785492504343953926634992332820282019728792003956564819968"}, + {"-57896044618658097711785492504343953926634992332820282019728792003956564819968", 1, "-28948022309329048855892746252171976963317496166410141009864396001978282409984"}, + {"-57896044618658097711785492504343953926634992332820282019728792003956564819968", 253, "-4"}, + {"-57896044618658097711785492504343953926634992332820282019728792003956564819968", 254, "-2"}, + {"-57896044618658097711785492504343953926634992332820282019728792003956564819968", 255, "-1"}, + {"-57896044618658097711785492504343953926634992332820282019728792003956564819968", 256, "-1"}, + } + + for _, tc := range tests { + x, err := FromDecimal(tc.x) + if err != nil { + t.Error(err) + continue + } + + got := New() + got.Rsh(x, tc.n) + + if got.ToString() != tc.want { + t.Errorf("Rsh(%s, %d) = %v, want %v", tc.x, tc.n, got.ToString(), tc.want) + } + } +} + +func TestLsh(t *testing.T) { + tests := []struct { + x string + n uint + want string + }{ + {"1", 0, "1"}, + {"1", 1, "2"}, + {"1", 2, "4"}, + {"2", 0, "2"}, + {"2", 1, "4"}, + {"2", 2, "8"}, + {"-2", 0, "-2"}, + {"-4", 0, "-4"}, + {"-8", 0, "-8"}, + } + + for _, tc := range tests { + x, err := FromDecimal(tc.x) + if err != nil { + t.Error(err) + continue + } + + got := New() + got.Lsh(x, tc.n) + + if got.ToString() != tc.want { + t.Errorf("Lsh(%s, %d) = %v, want %v", tc.x, tc.n, got.ToString(), tc.want) + } + } +} diff --git a/portal-loop/extracted/p/demo/int256/cmp.gno b/portal-loop/extracted/p/demo/int256/cmp.gno new file mode 100644 index 00000000..426dfd76 --- /dev/null +++ b/portal-loop/extracted/p/demo/int256/cmp.gno @@ -0,0 +1,86 @@ +package int256 + +// Eq returns true if z == x +func (z *Int) Eq(x *Int) bool { + return (z.neg == x.neg) && z.abs.Eq(x.abs) +} + +// Neq returns true if z != x +func (z *Int) Neq(x *Int) bool { + return !z.Eq(x) +} + +// Cmp compares x and y and returns: +// +// -1 if x < y +// 0 if x == y +// +1 if x > y +func (z *Int) Cmp(x *Int) (r int) { + // x cmp y == x cmp y + // x cmp (-y) == x + // (-x) cmp y == y + // (-x) cmp (-y) == -(x cmp y) + switch { + case z == x: + // nothing to do + case z.neg == x.neg: + r = z.abs.Cmp(x.abs) + if z.neg { + r = -r + } + case z.neg: + r = -1 + default: + r = 1 + } + return +} + +// IsZero returns true if z == 0 +func (z *Int) IsZero() bool { + return z.abs.IsZero() +} + +// IsNeg returns true if z < 0 +func (z *Int) IsNeg() bool { + return z.neg +} + +// Lt returns true if z < x +func (z *Int) Lt(x *Int) bool { + if z.neg { + if x.neg { + return z.abs.Gt(x.abs) + } else { + return true + } + } else { + if x.neg { + return false + } else { + return z.abs.Lt(x.abs) + } + } +} + +// Gt returns true if z > x +func (z *Int) Gt(x *Int) bool { + if z.neg { + if x.neg { + return z.abs.Lt(x.abs) + } else { + return false + } + } else { + if x.neg { + return true + } else { + return z.abs.Gt(x.abs) + } + } +} + +// Clone creates a new Int identical to z +func (z *Int) Clone() *Int { + return &Int{z.abs.Clone(), z.neg} +} diff --git a/portal-loop/extracted/p/demo/int256/cmp_test.gno b/portal-loop/extracted/p/demo/int256/cmp_test.gno new file mode 100644 index 00000000..81b9231b --- /dev/null +++ b/portal-loop/extracted/p/demo/int256/cmp_test.gno @@ -0,0 +1,261 @@ +package int256 + +import "testing" + +func TestEq(t *testing.T) { + tests := []struct { + x, y string + want bool + }{ + {"0", "0", true}, + {"0", "1", false}, + {"1", "0", false}, + {"-1", "0", false}, + {"0", "-1", false}, + {"1", "1", true}, + {"-1", "-1", true}, + {"115792089237316195423570985008687907853269984665640564039457584007913129639935", "-115792089237316195423570985008687907853269984665640564039457584007913129639935", false}, + {"-115792089237316195423570985008687907853269984665640564039457584007913129639935", "-115792089237316195423570985008687907853269984665640564039457584007913129639935", true}, + } + + for _, tc := range tests { + x, err := FromDecimal(tc.x) + if err != nil { + t.Error(err) + continue + } + + y, err := FromDecimal(tc.y) + if err != nil { + t.Error(err) + continue + } + + got := x.Eq(y) + if got != tc.want { + t.Errorf("Eq(%s, %s) = %v, want %v", tc.x, tc.y, got, tc.want) + } + } +} + +func TestNeq(t *testing.T) { + tests := []struct { + x, y string + want bool + }{ + {"0", "0", false}, + {"0", "1", true}, + {"1", "0", true}, + {"-1", "0", true}, + {"0", "-1", true}, + {"1", "1", false}, + {"-1", "-1", false}, + {"115792089237316195423570985008687907853269984665640564039457584007913129639935", "-115792089237316195423570985008687907853269984665640564039457584007913129639935", true}, + {"-115792089237316195423570985008687907853269984665640564039457584007913129639935", "-115792089237316195423570985008687907853269984665640564039457584007913129639935", false}, + } + + for _, tc := range tests { + x, err := FromDecimal(tc.x) + if err != nil { + t.Error(err) + continue + } + + y, err := FromDecimal(tc.y) + if err != nil { + t.Error(err) + continue + } + + got := x.Neq(y) + if got != tc.want { + t.Errorf("Neq(%s, %s) = %v, want %v", tc.x, tc.y, got, tc.want) + } + } +} + +func TestCmp(t *testing.T) { + tests := []struct { + x, y string + want int + }{ + {"0", "0", 0}, + {"0", "1", -1}, + {"1", "0", 1}, + {"-1", "0", -1}, + {"0", "-1", 1}, + {"1", "1", 0}, + {"115792089237316195423570985008687907853269984665640564039457584007913129639935", "-115792089237316195423570985008687907853269984665640564039457584007913129639935", 1}, + } + + for _, tc := range tests { + x, err := FromDecimal(tc.x) + if err != nil { + t.Error(err) + continue + } + + y, err := FromDecimal(tc.y) + if err != nil { + t.Error(err) + continue + } + + got := x.Cmp(y) + if got != tc.want { + t.Errorf("Cmp(%s, %s) = %v, want %v", tc.x, tc.y, got, tc.want) + } + } +} + +func TestIsZero(t *testing.T) { + tests := []struct { + x string + want bool + }{ + {"0", true}, + {"-0", true}, + {"1", false}, + {"-1", false}, + {"10", false}, + } + + for _, tc := range tests { + x, err := FromDecimal(tc.x) + if err != nil { + t.Error(err) + continue + } + + got := x.IsZero() + if got != tc.want { + t.Errorf("IsZero(%s) = %v, want %v", tc.x, got, tc.want) + } + } +} + +func TestIsNeg(t *testing.T) { + tests := []struct { + x string + want bool + }{ + {"0", false}, + {"-0", true}, // TODO: should this be false? + {"1", false}, + {"-1", true}, + {"10", false}, + {"-10", true}, + } + + for _, tc := range tests { + x, err := FromDecimal(tc.x) + if err != nil { + t.Error(err) + continue + } + + got := x.IsNeg() + if got != tc.want { + t.Errorf("IsNeg(%s) = %v, want %v", tc.x, got, tc.want) + } + } +} + +func TestLt(t *testing.T) { + tests := []struct { + x, y string + want bool + }{ + {"0", "0", false}, + {"0", "1", true}, + {"1", "0", false}, + {"-1", "0", true}, + {"0", "-1", false}, + {"1", "1", false}, + {"-1", "-1", false}, + {"115792089237316195423570985008687907853269984665640564039457584007913129639935", "-115792089237316195423570985008687907853269984665640564039457584007913129639935", false}, + } + + for _, tc := range tests { + x, err := FromDecimal(tc.x) + if err != nil { + t.Error(err) + continue + } + + y, err := FromDecimal(tc.y) + if err != nil { + t.Error(err) + continue + } + + got := x.Lt(y) + if got != tc.want { + t.Errorf("Lt(%s, %s) = %v, want %v", tc.x, tc.y, got, tc.want) + } + } +} + +func TestGt(t *testing.T) { + tests := []struct { + x, y string + want bool + }{ + {"0", "0", false}, + {"0", "1", false}, + {"1", "0", true}, + {"-1", "0", false}, + {"0", "-1", true}, + {"1", "1", false}, + {"-1", "-1", false}, + {"115792089237316195423570985008687907853269984665640564039457584007913129639935", "-115792089237316195423570985008687907853269984665640564039457584007913129639935", true}, + } + + for _, tc := range tests { + x, err := FromDecimal(tc.x) + if err != nil { + t.Error(err) + continue + } + + y, err := FromDecimal(tc.y) + if err != nil { + t.Error(err) + continue + } + + got := x.Gt(y) + if got != tc.want { + t.Errorf("Gt(%s, %s) = %v, want %v", tc.x, tc.y, got, tc.want) + } + } +} + +func TestClone(t *testing.T) { + tests := []struct { + x string + }{ + {"0"}, + {"-0"}, + {"1"}, + {"-1"}, + {"10"}, + {"-10"}, + {"115792089237316195423570985008687907853269984665640564039457584007913129639935"}, + {"-115792089237316195423570985008687907853269984665640564039457584007913129639935"}, + } + + for _, tc := range tests { + x, err := FromDecimal(tc.x) + if err != nil { + t.Error(err) + continue + } + + y := x.Clone() + + if x.Cmp(y) != 0 { + t.Errorf("Clone(%s) = %v, want %v", tc.x, y, x) + } + } +} diff --git a/portal-loop/extracted/p/demo/int256/conversion.gno b/portal-loop/extracted/p/demo/int256/conversion.gno new file mode 100644 index 00000000..9e264e7e --- /dev/null +++ b/portal-loop/extracted/p/demo/int256/conversion.gno @@ -0,0 +1,87 @@ +package int256 + +import "gno.land/p/demo/uint256" + +// SetInt64 sets z to x and returns z. +func (z *Int) SetInt64(x int64) *Int { + z.initiateAbs() + + neg := false + if x < 0 { + neg = true + x = -x + } + if z.abs == nil { + panic("abs is nil") + } + z.abs = z.abs.SetUint64(uint64(x)) + z.neg = neg + return z +} + +// SetUint64 sets z to x and returns z. +func (z *Int) SetUint64(x uint64) *Int { + z.initiateAbs() + + if z.abs == nil { + panic("abs is nil") + } + z.abs = z.abs.SetUint64(x) + z.neg = false + return z +} + +// Uint64 returns the lower 64-bits of z +func (z *Int) Uint64() uint64 { + return z.abs.Uint64() +} + +// Int64 returns the lower 64-bits of z +func (z *Int) Int64() int64 { + _abs := z.abs.Clone() + + if z.neg { + return -int64(_abs.Uint64()) + } + return int64(_abs.Uint64()) +} + +// Neg sets z to -x and returns z.) +func (z *Int) Neg(x *Int) *Int { + z.abs.Set(x.abs) + if z.abs.IsZero() { + z.neg = false + } else { + z.neg = !x.neg + } + return z +} + +// Set sets z to x and returns z. +func (z *Int) Set(x *Int) *Int { + z.abs.Set(x.abs) + z.neg = x.neg + return z +} + +// SetFromUint256 converts a uint256.Uint to Int and sets the value to z. +func (z *Int) SetUint256(x *uint256.Uint) *Int { + z.abs.Set(x) + z.neg = false + return z +} + +// OBS, differs from original mempooler int256 +// ToString returns the decimal representation of z. +func (z *Int) ToString() string { + if z == nil { + panic("int256: nil pointer to ToString()") + } + + t := z.abs.Dec() + if z.neg { + return "-" + t + } + + return t +} diff --git a/portal-loop/extracted/p/demo/int256/conversion_test.gno b/portal-loop/extracted/p/demo/int256/conversion_test.gno new file mode 100644 index 00000000..b085a77a --- /dev/null +++ b/portal-loop/extracted/p/demo/int256/conversion_test.gno @@ -0,0 +1,234 @@ +package int256 + +import ( + "testing" + + "gno.land/p/demo/uint256" +) + +func TestSetInt64(t *testing.T) { + tests := []struct { + x int64 + want string + }{ + {0, "0"}, + {1, "1"}, + {-1, "-1"}, + {9223372036854775807, "9223372036854775807"}, + {-9223372036854775808, "-9223372036854775808"}, + } + + for _, tc := range tests { + var z Int + z.SetInt64(tc.x) + + got := z.ToString() + if got != tc.want { + t.Errorf("SetInt64(%d) = %s, want %s", tc.x, got, tc.want) + } + } +} + +func TestSetUint64(t *testing.T) { + tests := []struct { + x uint64 + want string + }{ + {0, "0"}, + {1, "1"}, + } + + for _, tc := range tests { + var z Int + z.SetUint64(tc.x) + + got := z.ToString() + if got != tc.want { + t.Errorf("SetUint64(%d) = %s, want %s", tc.x, got, tc.want) + } + } +} + +func TestUint64(t *testing.T) { + tests := []struct { + x string + want uint64 + }{ + {"0", 0}, + {"1", 1}, + {"9223372036854775807", 9223372036854775807}, + {"9223372036854775808", 9223372036854775808}, + {"18446744073709551615", 18446744073709551615}, + {"18446744073709551616", 0}, + {"18446744073709551617", 1}, + {"-1", 1}, + {"-18446744073709551615", 18446744073709551615}, + {"-18446744073709551616", 0}, + {"-18446744073709551617", 1}, + } + + for _, tc := range tests { + z := MustFromDecimal(tc.x) + + got := z.Uint64() + if got != tc.want { + t.Errorf("Uint64(%s) = %d, want %d", tc.x, got, tc.want) + } + } +} + +func TestInt64(t *testing.T) { + tests := []struct { + x string + want int64 + }{ + {"0", 0}, + {"1", 1}, + {"9223372036854775807", 9223372036854775807}, + {"18446744073709551616", 0}, + {"18446744073709551617", 1}, + {"-1", -1}, + {"-9223372036854775808", -9223372036854775808}, + } + + for _, tc := range tests { + z := MustFromDecimal(tc.x) + + got := z.Int64() + if got != tc.want { + t.Errorf("Uint64(%s) = %d, want %d", tc.x, got, tc.want) + } + } +} + +func TestNeg(t *testing.T) { + tests := []struct { + x string + want string + }{ + {"0", "0"}, + {"1", "-1"}, + {"-1", "1"}, + {"9223372036854775807", "-9223372036854775807"}, + {"-18446744073709551615", "18446744073709551615"}, + } + + for _, tc := range tests { + z := MustFromDecimal(tc.x) + z.Neg(z) + + got := z.ToString() + if got != tc.want { + t.Errorf("Neg(%s) = %s, want %s", tc.x, got, tc.want) + } + } +} + +func TestSet(t *testing.T) { + tests := []struct { + x string + want string + }{ + {"0", "0"}, + {"1", "1"}, + {"-1", "-1"}, + {"9223372036854775807", "9223372036854775807"}, + {"-18446744073709551615", "-18446744073709551615"}, + } + + for _, tc := range tests { + z := MustFromDecimal(tc.x) + z.Set(z) + + got := z.ToString() + if got != tc.want { + t.Errorf("Set(%s) = %s, want %s", tc.x, got, tc.want) + } + } +} + +func TestSetUint256(t *testing.T) { + tests := []struct { + x string + want string + }{ + {"0", "0"}, + {"1", "1"}, + {"9223372036854775807", "9223372036854775807"}, + {"18446744073709551615", "18446744073709551615"}, + } + + for _, tc := range tests { + got := New() + + z := uint256.MustFromDecimal(tc.x) + got.SetUint256(z) + + if got.ToString() != tc.want { + t.Errorf("SetUint256(%s) = %s, want %s", tc.x, got.ToString(), tc.want) + } + } +} + +func TestToString(t *testing.T) { + tests := []struct { + name string + setup func() *Int + expected string + }{ + { + name: "Zero from subtraction", + setup: func() *Int { + minusThree := MustFromDecimal("-3") + three := MustFromDecimal("3") + return Zero().Add(minusThree, three) + }, + expected: "0", + }, + { + name: "Zero from right shift", + setup: func() *Int { + return Zero().Rsh(One(), 1234) + }, + expected: "0", + }, + { + name: "Positive number", + setup: func() *Int { + return MustFromDecimal("42") + }, + expected: "42", + }, + { + name: "Negative number", + setup: func() *Int { + return MustFromDecimal("-42") + }, + expected: "-42", + }, + { + name: "Large positive number", + setup: func() *Int { + return MustFromDecimal("115792089237316195423570985008687907853269984665640564039457584007913129639935") + }, + expected: "115792089237316195423570985008687907853269984665640564039457584007913129639935", + }, + { + name: "Large negative number", + setup: func() *Int { + return MustFromDecimal("-115792089237316195423570985008687907853269984665640564039457584007913129639935") + }, + expected: "-115792089237316195423570985008687907853269984665640564039457584007913129639935", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + z := tt.setup() + result := z.ToString() + if result != tt.expected { + t.Errorf("ToString() = %s, want %s", result, tt.expected) + } + }) + } +} diff --git a/portal-loop/extracted/p/demo/int256/int256.gno b/portal-loop/extracted/p/demo/int256/int256.gno new file mode 100644 index 00000000..caccd17d --- /dev/null +++ b/portal-loop/extracted/p/demo/int256/int256.gno @@ -0,0 +1,126 @@ +// This package provides a 256-bit signed integer type, Int, and associated functions. +package int256 + +import ( + "gno.land/p/demo/uint256" +) + +var one = uint256.NewUint(1) + +type Int struct { + abs *uint256.Uint + neg bool +} + +// Zero returns a new Int set to 0. +func Zero() *Int { + return NewInt(0) +} + +// One returns a new Int set to 1. +func One() *Int { + return NewInt(1) +} + +// Sign returns: +// +// -1 if x < 0 +// 0 if x == 0 +// +1 if x > 0 +func (z *Int) Sign() int { + z.initiateAbs() + + if z.abs.IsZero() { + return 0 + } + if z.neg { + return -1 + } + return 1 +} + +// New returns a new Int set to 0. +func New() *Int { + return &Int{ + abs: new(uint256.Uint), + } +} + +// NewInt allocates and returns a new Int set to x. +func NewInt(x int64) *Int { + return New().SetInt64(x) +} + +// FromDecimal returns a new Int from a decimal string. +// Returns a new Int and an error if the string is not a valid decimal. +func FromDecimal(s string) (*Int, error) { + return new(Int).SetString(s) +} + +// MustFromDecimal returns a new Int from a decimal string. +// Panics if the string is not a valid decimal. +func MustFromDecimal(s string) *Int { + z, err := FromDecimal(s) + if err != nil { + panic(err) + } + return z +} + +// SetString sets s to the value of z and returns z and a boolean indicating success. +func (z *Int) SetString(s string) (*Int, error) { + neg := false + // Remove max one leading + + if len(s) > 0 && s[0] == '+' { + neg = false + s = s[1:] + } + + if len(s) > 0 && s[0] == '-' { + neg = true + s = s[1:] + } + var ( + abs *uint256.Uint + err error + ) + abs, err = uint256.FromDecimal(s) + if err != nil { + return nil, err + } + + return &Int{ + abs, + neg, + }, nil +} + +// FromUint256 is a convenience-constructor from uint256.Uint. +// Returns a new Int and whether overflow occurred. +// OBS: If u is `nil`, this method returns `nil, false` +func FromUint256(x *uint256.Uint) *Int { + if x == nil { + return nil + } + z := Zero() + + z.SetUint256(x) + return z +} + +// OBS, differs from original mempooler int256 +// NilToZero sets z to 0 and return it if it's nil, otherwise it returns z +func (z *Int) NilToZero() *Int { + if z == nil { + return NewInt(0) + } + return z +} + +// initiateAbs sets default value for `z` or `z.abs` value if is nil +// OBS: differs from mempooler int256. It checks not only `z.abs` but also `z` +func (z *Int) initiateAbs() { + if z == nil || z.abs == nil { + z.abs = new(uint256.Uint) + } +} diff --git a/portal-loop/extracted/p/demo/int256/int256_test.gno b/portal-loop/extracted/p/demo/int256/int256_test.gno new file mode 100644 index 00000000..7c8181d1 --- /dev/null +++ b/portal-loop/extracted/p/demo/int256/int256_test.gno @@ -0,0 +1,23 @@ +// ported from github.com/mempooler/int256 +package int256 + +import "testing" + +func TestSign(t *testing.T) { + tests := []struct { + x string + want int + }{ + {"0", 0}, + {"1", 1}, + {"-1", -1}, + } + + for _, tc := range tests { + z := MustFromDecimal(tc.x) + got := z.Sign() + if got != tc.want { + t.Errorf("Sign(%s) = %d, want %d", tc.x, got, tc.want) + } + } +} diff --git a/portal-loop/extracted/p/demo/int256/pkg_metadata.json b/portal-loop/extracted/p/demo/int256/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/int256/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/json/eisel_lemire/eisel_lemire.gno b/portal-loop/extracted/p/demo/json/eisel_lemire/eisel_lemire.gno new file mode 100644 index 00000000..6a29f7f1 --- /dev/null +++ b/portal-loop/extracted/p/demo/json/eisel_lemire/eisel_lemire.gno @@ -0,0 +1,839 @@ +// Copyright 2020 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package eisel_lemire + +// This file implements the Eisel-Lemire ParseFloat algorithm, published in +// 2020 and discussed extensively at +// https://nigeltao.github.io/blog/2020/eisel-lemire.html +// +// The original C++ implementation is at +// https://github.com/lemire/fast_double_parser/blob/644bef4306059d3be01a04e77d3cc84b379c596f/include/fast_double_parser.h#L840 +// +// This Go re-implementation closely follows the C re-implementation at +// https://github.com/google/wuffs/blob/ba3818cb6b473a2ed0b38ecfc07dbbd3a97e8ae7/internal/cgen/base/floatconv-submodule-code.c#L990 +// +// Additional testing (on over several million test strings) is done by +// https://github.com/nigeltao/parse-number-fxx-test-data/blob/5280dcfccf6d0b02a65ae282dad0b6d9de50e039/script/test-go-strconv.go + +import ( + "math" + "math/bits" +) + +const ( + float32ExponentBias = 127 + float64ExponentBias = 1023 +) + +// eiselLemire64 parses a floating-point number from its mantissa and exponent representation. +// This implementation is based on the Eisel-Lemire ParseFloat algorithm, which is efficient +// and precise for converting strings to floating-point numbers. +// +// Arguments: +// man (uint64): The mantissa part of the floating-point number. +// exp10 (int): The exponent part, representing the power of 10. +// neg (bool): Indicates if the number is negative. +// +// Returns: +// f (float64): The parsed floating-point number. +// ok (bool): Indicates whether the parsing was successful. +// +// The function starts by handling special cases, such as zero mantissa. +// It then checks if the exponent is within the allowed range. +// After that, it normalizes the mantissa by left-shifting it to fill +// the leading zeros. This is followed by the main algorithm logic that +// converts the normalized mantissa and exponent into a 64-bit floating-point number. +// The function returns this number along with a boolean indicating the success of the operation. +func EiselLemire64(man uint64, exp10 int, neg bool) (f float64, ok bool) { + // The terse comments in this function body refer to sections of the + // https://nigeltao.github.io/blog/2020/eisel-lemire.html blog post. + + // Exp10 Range. + if man == 0 { + if neg { + f = math.Float64frombits(0x80000000_00000000) // Negative zero. + } + + return f, true + } + + if exp10 < detailedPowersOfTenMinExp10 || detailedPowersOfTenMaxExp10 < exp10 { + return 0, false + } + + // Normalization. + clz := bits.LeadingZeros64(man) + man <<= uint(clz) + retExp2 := uint64(217706*exp10>>16+64+float64ExponentBias) - uint64(clz) + + // Multiplication. + xHi, xLo := bits.Mul64(man, detailedPowersOfTen[exp10-detailedPowersOfTenMinExp10][1]) + + // Wider Approximation. + if xHi&0x1FF == 0x1FF && xLo+man < man { + yHi, yLo := bits.Mul64(man, detailedPowersOfTen[exp10-detailedPowersOfTenMinExp10][0]) + mergedHi, mergedLo := xHi, xLo+yHi + if mergedLo < xLo { + mergedHi++ + } + + if mergedHi&0x1FF == 0x1FF && mergedLo+1 == 0 && yLo+man < man { + return 0, false + } + + xHi, xLo = mergedHi, mergedLo + } + + // Shifting to 54 Bits. + msb := xHi >> 63 + retMantissa := xHi >> (msb + 9) + retExp2 -= 1 ^ msb + + // Half-way Ambiguity. + if xLo == 0 && xHi&0x1FF == 0 && retMantissa&3 == 1 { + return 0, false + } + + // From 54 to 53 Bits. + retMantissa += retMantissa & 1 + retMantissa >>= 1 + if retMantissa>>53 > 0 { + retMantissa >>= 1 + retExp2 += 1 + } + + // retExp2 is a uint64. Zero or underflow means that we're in subnormal + // float64 space. 0x7FF or above means that we're in Inf/NaN float64 space. + // + // The if block is equivalent to (but has fewer branches than): + // if retExp2 <= 0 || retExp2 >= 0x7FF { etc } + if retExp2-1 >= 0x7FF-1 { + return 0, false + } + + retBits := retExp2<<52 | retMantissa&0x000FFFFF_FFFFFFFF + if neg { + retBits |= 0x80000000_00000000 + } + + return math.Float64frombits(retBits), true +} + +// detailedPowersOfTen{Min,Max}Exp10 is the power of 10 represented by the +// first and last rows of detailedPowersOfTen. Both bounds are inclusive. +const ( + detailedPowersOfTenMinExp10 = -348 + detailedPowersOfTenMaxExp10 = +347 +) + +// detailedPowersOfTen contains 128-bit mantissa approximations (rounded down) +// to the powers of 10. For example: +// +// - 1e43 ≈ (0xE596B7B0_C643C719 * (2 ** 79)) +// - 1e43 = (0xE596B7B0_C643C719_6D9CCD05_D0000000 * (2 ** 15)) +// +// The mantissas are explicitly listed. The exponents are implied by a linear +// expression with slope 217706.0/65536.0 ≈ log(10)/log(2). +// +// The table was generated by +// https://github.com/google/wuffs/blob/ba3818cb6b473a2ed0b38ecfc07dbbd3a97e8ae7/script/print-mpb-powers-of-10.go +var detailedPowersOfTen = [...][2]uint64{ + {0x1732C869CD60E453, 0xFA8FD5A0081C0288}, // 1e-348 + {0x0E7FBD42205C8EB4, 0x9C99E58405118195}, // 1e-347 + {0x521FAC92A873B261, 0xC3C05EE50655E1FA}, // 1e-346 + {0xE6A797B752909EF9, 0xF4B0769E47EB5A78}, // 1e-345 + {0x9028BED2939A635C, 0x98EE4A22ECF3188B}, // 1e-344 + {0x7432EE873880FC33, 0xBF29DCABA82FDEAE}, // 1e-343 + {0x113FAA2906A13B3F, 0xEEF453D6923BD65A}, // 1e-342 + {0x4AC7CA59A424C507, 0x9558B4661B6565F8}, // 1e-341 + {0x5D79BCF00D2DF649, 0xBAAEE17FA23EBF76}, // 1e-340 + {0xF4D82C2C107973DC, 0xE95A99DF8ACE6F53}, // 1e-339 + {0x79071B9B8A4BE869, 0x91D8A02BB6C10594}, // 1e-338 + {0x9748E2826CDEE284, 0xB64EC836A47146F9}, // 1e-337 + {0xFD1B1B2308169B25, 0xE3E27A444D8D98B7}, // 1e-336 + {0xFE30F0F5E50E20F7, 0x8E6D8C6AB0787F72}, // 1e-335 + {0xBDBD2D335E51A935, 0xB208EF855C969F4F}, // 1e-334 + {0xAD2C788035E61382, 0xDE8B2B66B3BC4723}, // 1e-333 + {0x4C3BCB5021AFCC31, 0x8B16FB203055AC76}, // 1e-332 + {0xDF4ABE242A1BBF3D, 0xADDCB9E83C6B1793}, // 1e-331 + {0xD71D6DAD34A2AF0D, 0xD953E8624B85DD78}, // 1e-330 + {0x8672648C40E5AD68, 0x87D4713D6F33AA6B}, // 1e-329 + {0x680EFDAF511F18C2, 0xA9C98D8CCB009506}, // 1e-328 + {0x0212BD1B2566DEF2, 0xD43BF0EFFDC0BA48}, // 1e-327 + {0x014BB630F7604B57, 0x84A57695FE98746D}, // 1e-326 + {0x419EA3BD35385E2D, 0xA5CED43B7E3E9188}, // 1e-325 + {0x52064CAC828675B9, 0xCF42894A5DCE35EA}, // 1e-324 + {0x7343EFEBD1940993, 0x818995CE7AA0E1B2}, // 1e-323 + {0x1014EBE6C5F90BF8, 0xA1EBFB4219491A1F}, // 1e-322 + {0xD41A26E077774EF6, 0xCA66FA129F9B60A6}, // 1e-321 + {0x8920B098955522B4, 0xFD00B897478238D0}, // 1e-320 + {0x55B46E5F5D5535B0, 0x9E20735E8CB16382}, // 1e-319 + {0xEB2189F734AA831D, 0xC5A890362FDDBC62}, // 1e-318 + {0xA5E9EC7501D523E4, 0xF712B443BBD52B7B}, // 1e-317 + {0x47B233C92125366E, 0x9A6BB0AA55653B2D}, // 1e-316 + {0x999EC0BB696E840A, 0xC1069CD4EABE89F8}, // 1e-315 + {0xC00670EA43CA250D, 0xF148440A256E2C76}, // 1e-314 + {0x380406926A5E5728, 0x96CD2A865764DBCA}, // 1e-313 + {0xC605083704F5ECF2, 0xBC807527ED3E12BC}, // 1e-312 + {0xF7864A44C633682E, 0xEBA09271E88D976B}, // 1e-311 + {0x7AB3EE6AFBE0211D, 0x93445B8731587EA3}, // 1e-310 + {0x5960EA05BAD82964, 0xB8157268FDAE9E4C}, // 1e-309 + {0x6FB92487298E33BD, 0xE61ACF033D1A45DF}, // 1e-308 + {0xA5D3B6D479F8E056, 0x8FD0C16206306BAB}, // 1e-307 + {0x8F48A4899877186C, 0xB3C4F1BA87BC8696}, // 1e-306 + {0x331ACDABFE94DE87, 0xE0B62E2929ABA83C}, // 1e-305 + {0x9FF0C08B7F1D0B14, 0x8C71DCD9BA0B4925}, // 1e-304 + {0x07ECF0AE5EE44DD9, 0xAF8E5410288E1B6F}, // 1e-303 + {0xC9E82CD9F69D6150, 0xDB71E91432B1A24A}, // 1e-302 + {0xBE311C083A225CD2, 0x892731AC9FAF056E}, // 1e-301 + {0x6DBD630A48AAF406, 0xAB70FE17C79AC6CA}, // 1e-300 + {0x092CBBCCDAD5B108, 0xD64D3D9DB981787D}, // 1e-299 + {0x25BBF56008C58EA5, 0x85F0468293F0EB4E}, // 1e-298 + {0xAF2AF2B80AF6F24E, 0xA76C582338ED2621}, // 1e-297 + {0x1AF5AF660DB4AEE1, 0xD1476E2C07286FAA}, // 1e-296 + {0x50D98D9FC890ED4D, 0x82CCA4DB847945CA}, // 1e-295 + {0xE50FF107BAB528A0, 0xA37FCE126597973C}, // 1e-294 + {0x1E53ED49A96272C8, 0xCC5FC196FEFD7D0C}, // 1e-293 + {0x25E8E89C13BB0F7A, 0xFF77B1FCBEBCDC4F}, // 1e-292 + {0x77B191618C54E9AC, 0x9FAACF3DF73609B1}, // 1e-291 + {0xD59DF5B9EF6A2417, 0xC795830D75038C1D}, // 1e-290 + {0x4B0573286B44AD1D, 0xF97AE3D0D2446F25}, // 1e-289 + {0x4EE367F9430AEC32, 0x9BECCE62836AC577}, // 1e-288 + {0x229C41F793CDA73F, 0xC2E801FB244576D5}, // 1e-287 + {0x6B43527578C1110F, 0xF3A20279ED56D48A}, // 1e-286 + {0x830A13896B78AAA9, 0x9845418C345644D6}, // 1e-285 + {0x23CC986BC656D553, 0xBE5691EF416BD60C}, // 1e-284 + {0x2CBFBE86B7EC8AA8, 0xEDEC366B11C6CB8F}, // 1e-283 + {0x7BF7D71432F3D6A9, 0x94B3A202EB1C3F39}, // 1e-282 + {0xDAF5CCD93FB0CC53, 0xB9E08A83A5E34F07}, // 1e-281 + {0xD1B3400F8F9CFF68, 0xE858AD248F5C22C9}, // 1e-280 + {0x23100809B9C21FA1, 0x91376C36D99995BE}, // 1e-279 + {0xABD40A0C2832A78A, 0xB58547448FFFFB2D}, // 1e-278 + {0x16C90C8F323F516C, 0xE2E69915B3FFF9F9}, // 1e-277 + {0xAE3DA7D97F6792E3, 0x8DD01FAD907FFC3B}, // 1e-276 + {0x99CD11CFDF41779C, 0xB1442798F49FFB4A}, // 1e-275 + {0x40405643D711D583, 0xDD95317F31C7FA1D}, // 1e-274 + {0x482835EA666B2572, 0x8A7D3EEF7F1CFC52}, // 1e-273 + {0xDA3243650005EECF, 0xAD1C8EAB5EE43B66}, // 1e-272 + {0x90BED43E40076A82, 0xD863B256369D4A40}, // 1e-271 + {0x5A7744A6E804A291, 0x873E4F75E2224E68}, // 1e-270 + {0x711515D0A205CB36, 0xA90DE3535AAAE202}, // 1e-269 + {0x0D5A5B44CA873E03, 0xD3515C2831559A83}, // 1e-268 + {0xE858790AFE9486C2, 0x8412D9991ED58091}, // 1e-267 + {0x626E974DBE39A872, 0xA5178FFF668AE0B6}, // 1e-266 + {0xFB0A3D212DC8128F, 0xCE5D73FF402D98E3}, // 1e-265 + {0x7CE66634BC9D0B99, 0x80FA687F881C7F8E}, // 1e-264 + {0x1C1FFFC1EBC44E80, 0xA139029F6A239F72}, // 1e-263 + {0xA327FFB266B56220, 0xC987434744AC874E}, // 1e-262 + {0x4BF1FF9F0062BAA8, 0xFBE9141915D7A922}, // 1e-261 + {0x6F773FC3603DB4A9, 0x9D71AC8FADA6C9B5}, // 1e-260 + {0xCB550FB4384D21D3, 0xC4CE17B399107C22}, // 1e-259 + {0x7E2A53A146606A48, 0xF6019DA07F549B2B}, // 1e-258 + {0x2EDA7444CBFC426D, 0x99C102844F94E0FB}, // 1e-257 + {0xFA911155FEFB5308, 0xC0314325637A1939}, // 1e-256 + {0x793555AB7EBA27CA, 0xF03D93EEBC589F88}, // 1e-255 + {0x4BC1558B2F3458DE, 0x96267C7535B763B5}, // 1e-254 + {0x9EB1AAEDFB016F16, 0xBBB01B9283253CA2}, // 1e-253 + {0x465E15A979C1CADC, 0xEA9C227723EE8BCB}, // 1e-252 + {0x0BFACD89EC191EC9, 0x92A1958A7675175F}, // 1e-251 + {0xCEF980EC671F667B, 0xB749FAED14125D36}, // 1e-250 + {0x82B7E12780E7401A, 0xE51C79A85916F484}, // 1e-249 + {0xD1B2ECB8B0908810, 0x8F31CC0937AE58D2}, // 1e-248 + {0x861FA7E6DCB4AA15, 0xB2FE3F0B8599EF07}, // 1e-247 + {0x67A791E093E1D49A, 0xDFBDCECE67006AC9}, // 1e-246 + {0xE0C8BB2C5C6D24E0, 0x8BD6A141006042BD}, // 1e-245 + {0x58FAE9F773886E18, 0xAECC49914078536D}, // 1e-244 + {0xAF39A475506A899E, 0xDA7F5BF590966848}, // 1e-243 + {0x6D8406C952429603, 0x888F99797A5E012D}, // 1e-242 + {0xC8E5087BA6D33B83, 0xAAB37FD7D8F58178}, // 1e-241 + {0xFB1E4A9A90880A64, 0xD5605FCDCF32E1D6}, // 1e-240 + {0x5CF2EEA09A55067F, 0x855C3BE0A17FCD26}, // 1e-239 + {0xF42FAA48C0EA481E, 0xA6B34AD8C9DFC06F}, // 1e-238 + {0xF13B94DAF124DA26, 0xD0601D8EFC57B08B}, // 1e-237 + {0x76C53D08D6B70858, 0x823C12795DB6CE57}, // 1e-236 + {0x54768C4B0C64CA6E, 0xA2CB1717B52481ED}, // 1e-235 + {0xA9942F5DCF7DFD09, 0xCB7DDCDDA26DA268}, // 1e-234 + {0xD3F93B35435D7C4C, 0xFE5D54150B090B02}, // 1e-233 + {0xC47BC5014A1A6DAF, 0x9EFA548D26E5A6E1}, // 1e-232 + {0x359AB6419CA1091B, 0xC6B8E9B0709F109A}, // 1e-231 + {0xC30163D203C94B62, 0xF867241C8CC6D4C0}, // 1e-230 + {0x79E0DE63425DCF1D, 0x9B407691D7FC44F8}, // 1e-229 + {0x985915FC12F542E4, 0xC21094364DFB5636}, // 1e-228 + {0x3E6F5B7B17B2939D, 0xF294B943E17A2BC4}, // 1e-227 + {0xA705992CEECF9C42, 0x979CF3CA6CEC5B5A}, // 1e-226 + {0x50C6FF782A838353, 0xBD8430BD08277231}, // 1e-225 + {0xA4F8BF5635246428, 0xECE53CEC4A314EBD}, // 1e-224 + {0x871B7795E136BE99, 0x940F4613AE5ED136}, // 1e-223 + {0x28E2557B59846E3F, 0xB913179899F68584}, // 1e-222 + {0x331AEADA2FE589CF, 0xE757DD7EC07426E5}, // 1e-221 + {0x3FF0D2C85DEF7621, 0x9096EA6F3848984F}, // 1e-220 + {0x0FED077A756B53A9, 0xB4BCA50B065ABE63}, // 1e-219 + {0xD3E8495912C62894, 0xE1EBCE4DC7F16DFB}, // 1e-218 + {0x64712DD7ABBBD95C, 0x8D3360F09CF6E4BD}, // 1e-217 + {0xBD8D794D96AACFB3, 0xB080392CC4349DEC}, // 1e-216 + {0xECF0D7A0FC5583A0, 0xDCA04777F541C567}, // 1e-215 + {0xF41686C49DB57244, 0x89E42CAAF9491B60}, // 1e-214 + {0x311C2875C522CED5, 0xAC5D37D5B79B6239}, // 1e-213 + {0x7D633293366B828B, 0xD77485CB25823AC7}, // 1e-212 + {0xAE5DFF9C02033197, 0x86A8D39EF77164BC}, // 1e-211 + {0xD9F57F830283FDFC, 0xA8530886B54DBDEB}, // 1e-210 + {0xD072DF63C324FD7B, 0xD267CAA862A12D66}, // 1e-209 + {0x4247CB9E59F71E6D, 0x8380DEA93DA4BC60}, // 1e-208 + {0x52D9BE85F074E608, 0xA46116538D0DEB78}, // 1e-207 + {0x67902E276C921F8B, 0xCD795BE870516656}, // 1e-206 + {0x00BA1CD8A3DB53B6, 0x806BD9714632DFF6}, // 1e-205 + {0x80E8A40ECCD228A4, 0xA086CFCD97BF97F3}, // 1e-204 + {0x6122CD128006B2CD, 0xC8A883C0FDAF7DF0}, // 1e-203 + {0x796B805720085F81, 0xFAD2A4B13D1B5D6C}, // 1e-202 + {0xCBE3303674053BB0, 0x9CC3A6EEC6311A63}, // 1e-201 + {0xBEDBFC4411068A9C, 0xC3F490AA77BD60FC}, // 1e-200 + {0xEE92FB5515482D44, 0xF4F1B4D515ACB93B}, // 1e-199 + {0x751BDD152D4D1C4A, 0x991711052D8BF3C5}, // 1e-198 + {0xD262D45A78A0635D, 0xBF5CD54678EEF0B6}, // 1e-197 + {0x86FB897116C87C34, 0xEF340A98172AACE4}, // 1e-196 + {0xD45D35E6AE3D4DA0, 0x9580869F0E7AAC0E}, // 1e-195 + {0x8974836059CCA109, 0xBAE0A846D2195712}, // 1e-194 + {0x2BD1A438703FC94B, 0xE998D258869FACD7}, // 1e-193 + {0x7B6306A34627DDCF, 0x91FF83775423CC06}, // 1e-192 + {0x1A3BC84C17B1D542, 0xB67F6455292CBF08}, // 1e-191 + {0x20CABA5F1D9E4A93, 0xE41F3D6A7377EECA}, // 1e-190 + {0x547EB47B7282EE9C, 0x8E938662882AF53E}, // 1e-189 + {0xE99E619A4F23AA43, 0xB23867FB2A35B28D}, // 1e-188 + {0x6405FA00E2EC94D4, 0xDEC681F9F4C31F31}, // 1e-187 + {0xDE83BC408DD3DD04, 0x8B3C113C38F9F37E}, // 1e-186 + {0x9624AB50B148D445, 0xAE0B158B4738705E}, // 1e-185 + {0x3BADD624DD9B0957, 0xD98DDAEE19068C76}, // 1e-184 + {0xE54CA5D70A80E5D6, 0x87F8A8D4CFA417C9}, // 1e-183 + {0x5E9FCF4CCD211F4C, 0xA9F6D30A038D1DBC}, // 1e-182 + {0x7647C3200069671F, 0xD47487CC8470652B}, // 1e-181 + {0x29ECD9F40041E073, 0x84C8D4DFD2C63F3B}, // 1e-180 + {0xF468107100525890, 0xA5FB0A17C777CF09}, // 1e-179 + {0x7182148D4066EEB4, 0xCF79CC9DB955C2CC}, // 1e-178 + {0xC6F14CD848405530, 0x81AC1FE293D599BF}, // 1e-177 + {0xB8ADA00E5A506A7C, 0xA21727DB38CB002F}, // 1e-176 + {0xA6D90811F0E4851C, 0xCA9CF1D206FDC03B}, // 1e-175 + {0x908F4A166D1DA663, 0xFD442E4688BD304A}, // 1e-174 + {0x9A598E4E043287FE, 0x9E4A9CEC15763E2E}, // 1e-173 + {0x40EFF1E1853F29FD, 0xC5DD44271AD3CDBA}, // 1e-172 + {0xD12BEE59E68EF47C, 0xF7549530E188C128}, // 1e-171 + {0x82BB74F8301958CE, 0x9A94DD3E8CF578B9}, // 1e-170 + {0xE36A52363C1FAF01, 0xC13A148E3032D6E7}, // 1e-169 + {0xDC44E6C3CB279AC1, 0xF18899B1BC3F8CA1}, // 1e-168 + {0x29AB103A5EF8C0B9, 0x96F5600F15A7B7E5}, // 1e-167 + {0x7415D448F6B6F0E7, 0xBCB2B812DB11A5DE}, // 1e-166 + {0x111B495B3464AD21, 0xEBDF661791D60F56}, // 1e-165 + {0xCAB10DD900BEEC34, 0x936B9FCEBB25C995}, // 1e-164 + {0x3D5D514F40EEA742, 0xB84687C269EF3BFB}, // 1e-163 + {0x0CB4A5A3112A5112, 0xE65829B3046B0AFA}, // 1e-162 + {0x47F0E785EABA72AB, 0x8FF71A0FE2C2E6DC}, // 1e-161 + {0x59ED216765690F56, 0xB3F4E093DB73A093}, // 1e-160 + {0x306869C13EC3532C, 0xE0F218B8D25088B8}, // 1e-159 + {0x1E414218C73A13FB, 0x8C974F7383725573}, // 1e-158 + {0xE5D1929EF90898FA, 0xAFBD2350644EEACF}, // 1e-157 + {0xDF45F746B74ABF39, 0xDBAC6C247D62A583}, // 1e-156 + {0x6B8BBA8C328EB783, 0x894BC396CE5DA772}, // 1e-155 + {0x066EA92F3F326564, 0xAB9EB47C81F5114F}, // 1e-154 + {0xC80A537B0EFEFEBD, 0xD686619BA27255A2}, // 1e-153 + {0xBD06742CE95F5F36, 0x8613FD0145877585}, // 1e-152 + {0x2C48113823B73704, 0xA798FC4196E952E7}, // 1e-151 + {0xF75A15862CA504C5, 0xD17F3B51FCA3A7A0}, // 1e-150 + {0x9A984D73DBE722FB, 0x82EF85133DE648C4}, // 1e-149 + {0xC13E60D0D2E0EBBA, 0xA3AB66580D5FDAF5}, // 1e-148 + {0x318DF905079926A8, 0xCC963FEE10B7D1B3}, // 1e-147 + {0xFDF17746497F7052, 0xFFBBCFE994E5C61F}, // 1e-146 + {0xFEB6EA8BEDEFA633, 0x9FD561F1FD0F9BD3}, // 1e-145 + {0xFE64A52EE96B8FC0, 0xC7CABA6E7C5382C8}, // 1e-144 + {0x3DFDCE7AA3C673B0, 0xF9BD690A1B68637B}, // 1e-143 + {0x06BEA10CA65C084E, 0x9C1661A651213E2D}, // 1e-142 + {0x486E494FCFF30A62, 0xC31BFA0FE5698DB8}, // 1e-141 + {0x5A89DBA3C3EFCCFA, 0xF3E2F893DEC3F126}, // 1e-140 + {0xF89629465A75E01C, 0x986DDB5C6B3A76B7}, // 1e-139 + {0xF6BBB397F1135823, 0xBE89523386091465}, // 1e-138 + {0x746AA07DED582E2C, 0xEE2BA6C0678B597F}, // 1e-137 + {0xA8C2A44EB4571CDC, 0x94DB483840B717EF}, // 1e-136 + {0x92F34D62616CE413, 0xBA121A4650E4DDEB}, // 1e-135 + {0x77B020BAF9C81D17, 0xE896A0D7E51E1566}, // 1e-134 + {0x0ACE1474DC1D122E, 0x915E2486EF32CD60}, // 1e-133 + {0x0D819992132456BA, 0xB5B5ADA8AAFF80B8}, // 1e-132 + {0x10E1FFF697ED6C69, 0xE3231912D5BF60E6}, // 1e-131 + {0xCA8D3FFA1EF463C1, 0x8DF5EFABC5979C8F}, // 1e-130 + {0xBD308FF8A6B17CB2, 0xB1736B96B6FD83B3}, // 1e-129 + {0xAC7CB3F6D05DDBDE, 0xDDD0467C64BCE4A0}, // 1e-128 + {0x6BCDF07A423AA96B, 0x8AA22C0DBEF60EE4}, // 1e-127 + {0x86C16C98D2C953C6, 0xAD4AB7112EB3929D}, // 1e-126 + {0xE871C7BF077BA8B7, 0xD89D64D57A607744}, // 1e-125 + {0x11471CD764AD4972, 0x87625F056C7C4A8B}, // 1e-124 + {0xD598E40D3DD89BCF, 0xA93AF6C6C79B5D2D}, // 1e-123 + {0x4AFF1D108D4EC2C3, 0xD389B47879823479}, // 1e-122 + {0xCEDF722A585139BA, 0x843610CB4BF160CB}, // 1e-121 + {0xC2974EB4EE658828, 0xA54394FE1EEDB8FE}, // 1e-120 + {0x733D226229FEEA32, 0xCE947A3DA6A9273E}, // 1e-119 + {0x0806357D5A3F525F, 0x811CCC668829B887}, // 1e-118 + {0xCA07C2DCB0CF26F7, 0xA163FF802A3426A8}, // 1e-117 + {0xFC89B393DD02F0B5, 0xC9BCFF6034C13052}, // 1e-116 + {0xBBAC2078D443ACE2, 0xFC2C3F3841F17C67}, // 1e-115 + {0xD54B944B84AA4C0D, 0x9D9BA7832936EDC0}, // 1e-114 + {0x0A9E795E65D4DF11, 0xC5029163F384A931}, // 1e-113 + {0x4D4617B5FF4A16D5, 0xF64335BCF065D37D}, // 1e-112 + {0x504BCED1BF8E4E45, 0x99EA0196163FA42E}, // 1e-111 + {0xE45EC2862F71E1D6, 0xC06481FB9BCF8D39}, // 1e-110 + {0x5D767327BB4E5A4C, 0xF07DA27A82C37088}, // 1e-109 + {0x3A6A07F8D510F86F, 0x964E858C91BA2655}, // 1e-108 + {0x890489F70A55368B, 0xBBE226EFB628AFEA}, // 1e-107 + {0x2B45AC74CCEA842E, 0xEADAB0ABA3B2DBE5}, // 1e-106 + {0x3B0B8BC90012929D, 0x92C8AE6B464FC96F}, // 1e-105 + {0x09CE6EBB40173744, 0xB77ADA0617E3BBCB}, // 1e-104 + {0xCC420A6A101D0515, 0xE55990879DDCAABD}, // 1e-103 + {0x9FA946824A12232D, 0x8F57FA54C2A9EAB6}, // 1e-102 + {0x47939822DC96ABF9, 0xB32DF8E9F3546564}, // 1e-101 + {0x59787E2B93BC56F7, 0xDFF9772470297EBD}, // 1e-100 + {0x57EB4EDB3C55B65A, 0x8BFBEA76C619EF36}, // 1e-99 + {0xEDE622920B6B23F1, 0xAEFAE51477A06B03}, // 1e-98 + {0xE95FAB368E45ECED, 0xDAB99E59958885C4}, // 1e-97 + {0x11DBCB0218EBB414, 0x88B402F7FD75539B}, // 1e-96 + {0xD652BDC29F26A119, 0xAAE103B5FCD2A881}, // 1e-95 + {0x4BE76D3346F0495F, 0xD59944A37C0752A2}, // 1e-94 + {0x6F70A4400C562DDB, 0x857FCAE62D8493A5}, // 1e-93 + {0xCB4CCD500F6BB952, 0xA6DFBD9FB8E5B88E}, // 1e-92 + {0x7E2000A41346A7A7, 0xD097AD07A71F26B2}, // 1e-91 + {0x8ED400668C0C28C8, 0x825ECC24C873782F}, // 1e-90 + {0x728900802F0F32FA, 0xA2F67F2DFA90563B}, // 1e-89 + {0x4F2B40A03AD2FFB9, 0xCBB41EF979346BCA}, // 1e-88 + {0xE2F610C84987BFA8, 0xFEA126B7D78186BC}, // 1e-87 + {0x0DD9CA7D2DF4D7C9, 0x9F24B832E6B0F436}, // 1e-86 + {0x91503D1C79720DBB, 0xC6EDE63FA05D3143}, // 1e-85 + {0x75A44C6397CE912A, 0xF8A95FCF88747D94}, // 1e-84 + {0xC986AFBE3EE11ABA, 0x9B69DBE1B548CE7C}, // 1e-83 + {0xFBE85BADCE996168, 0xC24452DA229B021B}, // 1e-82 + {0xFAE27299423FB9C3, 0xF2D56790AB41C2A2}, // 1e-81 + {0xDCCD879FC967D41A, 0x97C560BA6B0919A5}, // 1e-80 + {0x5400E987BBC1C920, 0xBDB6B8E905CB600F}, // 1e-79 + {0x290123E9AAB23B68, 0xED246723473E3813}, // 1e-78 + {0xF9A0B6720AAF6521, 0x9436C0760C86E30B}, // 1e-77 + {0xF808E40E8D5B3E69, 0xB94470938FA89BCE}, // 1e-76 + {0xB60B1D1230B20E04, 0xE7958CB87392C2C2}, // 1e-75 + {0xB1C6F22B5E6F48C2, 0x90BD77F3483BB9B9}, // 1e-74 + {0x1E38AEB6360B1AF3, 0xB4ECD5F01A4AA828}, // 1e-73 + {0x25C6DA63C38DE1B0, 0xE2280B6C20DD5232}, // 1e-72 + {0x579C487E5A38AD0E, 0x8D590723948A535F}, // 1e-71 + {0x2D835A9DF0C6D851, 0xB0AF48EC79ACE837}, // 1e-70 + {0xF8E431456CF88E65, 0xDCDB1B2798182244}, // 1e-69 + {0x1B8E9ECB641B58FF, 0x8A08F0F8BF0F156B}, // 1e-68 + {0xE272467E3D222F3F, 0xAC8B2D36EED2DAC5}, // 1e-67 + {0x5B0ED81DCC6ABB0F, 0xD7ADF884AA879177}, // 1e-66 + {0x98E947129FC2B4E9, 0x86CCBB52EA94BAEA}, // 1e-65 + {0x3F2398D747B36224, 0xA87FEA27A539E9A5}, // 1e-64 + {0x8EEC7F0D19A03AAD, 0xD29FE4B18E88640E}, // 1e-63 + {0x1953CF68300424AC, 0x83A3EEEEF9153E89}, // 1e-62 + {0x5FA8C3423C052DD7, 0xA48CEAAAB75A8E2B}, // 1e-61 + {0x3792F412CB06794D, 0xCDB02555653131B6}, // 1e-60 + {0xE2BBD88BBEE40BD0, 0x808E17555F3EBF11}, // 1e-59 + {0x5B6ACEAEAE9D0EC4, 0xA0B19D2AB70E6ED6}, // 1e-58 + {0xF245825A5A445275, 0xC8DE047564D20A8B}, // 1e-57 + {0xEED6E2F0F0D56712, 0xFB158592BE068D2E}, // 1e-56 + {0x55464DD69685606B, 0x9CED737BB6C4183D}, // 1e-55 + {0xAA97E14C3C26B886, 0xC428D05AA4751E4C}, // 1e-54 + {0xD53DD99F4B3066A8, 0xF53304714D9265DF}, // 1e-53 + {0xE546A8038EFE4029, 0x993FE2C6D07B7FAB}, // 1e-52 + {0xDE98520472BDD033, 0xBF8FDB78849A5F96}, // 1e-51 + {0x963E66858F6D4440, 0xEF73D256A5C0F77C}, // 1e-50 + {0xDDE7001379A44AA8, 0x95A8637627989AAD}, // 1e-49 + {0x5560C018580D5D52, 0xBB127C53B17EC159}, // 1e-48 + {0xAAB8F01E6E10B4A6, 0xE9D71B689DDE71AF}, // 1e-47 + {0xCAB3961304CA70E8, 0x9226712162AB070D}, // 1e-46 + {0x3D607B97C5FD0D22, 0xB6B00D69BB55C8D1}, // 1e-45 + {0x8CB89A7DB77C506A, 0xE45C10C42A2B3B05}, // 1e-44 + {0x77F3608E92ADB242, 0x8EB98A7A9A5B04E3}, // 1e-43 + {0x55F038B237591ED3, 0xB267ED1940F1C61C}, // 1e-42 + {0x6B6C46DEC52F6688, 0xDF01E85F912E37A3}, // 1e-41 + {0x2323AC4B3B3DA015, 0x8B61313BBABCE2C6}, // 1e-40 + {0xABEC975E0A0D081A, 0xAE397D8AA96C1B77}, // 1e-39 + {0x96E7BD358C904A21, 0xD9C7DCED53C72255}, // 1e-38 + {0x7E50D64177DA2E54, 0x881CEA14545C7575}, // 1e-37 + {0xDDE50BD1D5D0B9E9, 0xAA242499697392D2}, // 1e-36 + {0x955E4EC64B44E864, 0xD4AD2DBFC3D07787}, // 1e-35 + {0xBD5AF13BEF0B113E, 0x84EC3C97DA624AB4}, // 1e-34 + {0xECB1AD8AEACDD58E, 0xA6274BBDD0FADD61}, // 1e-33 + {0x67DE18EDA5814AF2, 0xCFB11EAD453994BA}, // 1e-32 + {0x80EACF948770CED7, 0x81CEB32C4B43FCF4}, // 1e-31 + {0xA1258379A94D028D, 0xA2425FF75E14FC31}, // 1e-30 + {0x096EE45813A04330, 0xCAD2F7F5359A3B3E}, // 1e-29 + {0x8BCA9D6E188853FC, 0xFD87B5F28300CA0D}, // 1e-28 + {0x775EA264CF55347D, 0x9E74D1B791E07E48}, // 1e-27 + {0x95364AFE032A819D, 0xC612062576589DDA}, // 1e-26 + {0x3A83DDBD83F52204, 0xF79687AED3EEC551}, // 1e-25 + {0xC4926A9672793542, 0x9ABE14CD44753B52}, // 1e-24 + {0x75B7053C0F178293, 0xC16D9A0095928A27}, // 1e-23 + {0x5324C68B12DD6338, 0xF1C90080BAF72CB1}, // 1e-22 + {0xD3F6FC16EBCA5E03, 0x971DA05074DA7BEE}, // 1e-21 + {0x88F4BB1CA6BCF584, 0xBCE5086492111AEA}, // 1e-20 + {0x2B31E9E3D06C32E5, 0xEC1E4A7DB69561A5}, // 1e-19 + {0x3AFF322E62439FCF, 0x9392EE8E921D5D07}, // 1e-18 + {0x09BEFEB9FAD487C2, 0xB877AA3236A4B449}, // 1e-17 + {0x4C2EBE687989A9B3, 0xE69594BEC44DE15B}, // 1e-16 + {0x0F9D37014BF60A10, 0x901D7CF73AB0ACD9}, // 1e-15 + {0x538484C19EF38C94, 0xB424DC35095CD80F}, // 1e-14 + {0x2865A5F206B06FB9, 0xE12E13424BB40E13}, // 1e-13 + {0xF93F87B7442E45D3, 0x8CBCCC096F5088CB}, // 1e-12 + {0xF78F69A51539D748, 0xAFEBFF0BCB24AAFE}, // 1e-11 + {0xB573440E5A884D1B, 0xDBE6FECEBDEDD5BE}, // 1e-10 + {0x31680A88F8953030, 0x89705F4136B4A597}, // 1e-9 + {0xFDC20D2B36BA7C3D, 0xABCC77118461CEFC}, // 1e-8 + {0x3D32907604691B4C, 0xD6BF94D5E57A42BC}, // 1e-7 + {0xA63F9A49C2C1B10F, 0x8637BD05AF6C69B5}, // 1e-6 + {0x0FCF80DC33721D53, 0xA7C5AC471B478423}, // 1e-5 + {0xD3C36113404EA4A8, 0xD1B71758E219652B}, // 1e-4 + {0x645A1CAC083126E9, 0x83126E978D4FDF3B}, // 1e-3 + {0x3D70A3D70A3D70A3, 0xA3D70A3D70A3D70A}, // 1e-2 + {0xCCCCCCCCCCCCCCCC, 0xCCCCCCCCCCCCCCCC}, // 1e-1 + {0x0000000000000000, 0x8000000000000000}, // 1e0 + {0x0000000000000000, 0xA000000000000000}, // 1e1 + {0x0000000000000000, 0xC800000000000000}, // 1e2 + {0x0000000000000000, 0xFA00000000000000}, // 1e3 + {0x0000000000000000, 0x9C40000000000000}, // 1e4 + {0x0000000000000000, 0xC350000000000000}, // 1e5 + {0x0000000000000000, 0xF424000000000000}, // 1e6 + {0x0000000000000000, 0x9896800000000000}, // 1e7 + {0x0000000000000000, 0xBEBC200000000000}, // 1e8 + {0x0000000000000000, 0xEE6B280000000000}, // 1e9 + {0x0000000000000000, 0x9502F90000000000}, // 1e10 + {0x0000000000000000, 0xBA43B74000000000}, // 1e11 + {0x0000000000000000, 0xE8D4A51000000000}, // 1e12 + {0x0000000000000000, 0x9184E72A00000000}, // 1e13 + {0x0000000000000000, 0xB5E620F480000000}, // 1e14 + {0x0000000000000000, 0xE35FA931A0000000}, // 1e15 + {0x0000000000000000, 0x8E1BC9BF04000000}, // 1e16 + {0x0000000000000000, 0xB1A2BC2EC5000000}, // 1e17 + {0x0000000000000000, 0xDE0B6B3A76400000}, // 1e18 + {0x0000000000000000, 0x8AC7230489E80000}, // 1e19 + {0x0000000000000000, 0xAD78EBC5AC620000}, // 1e20 + {0x0000000000000000, 0xD8D726B7177A8000}, // 1e21 + {0x0000000000000000, 0x878678326EAC9000}, // 1e22 + {0x0000000000000000, 0xA968163F0A57B400}, // 1e23 + {0x0000000000000000, 0xD3C21BCECCEDA100}, // 1e24 + {0x0000000000000000, 0x84595161401484A0}, // 1e25 + {0x0000000000000000, 0xA56FA5B99019A5C8}, // 1e26 + {0x0000000000000000, 0xCECB8F27F4200F3A}, // 1e27 + {0x4000000000000000, 0x813F3978F8940984}, // 1e28 + {0x5000000000000000, 0xA18F07D736B90BE5}, // 1e29 + {0xA400000000000000, 0xC9F2C9CD04674EDE}, // 1e30 + {0x4D00000000000000, 0xFC6F7C4045812296}, // 1e31 + {0xF020000000000000, 0x9DC5ADA82B70B59D}, // 1e32 + {0x6C28000000000000, 0xC5371912364CE305}, // 1e33 + {0xC732000000000000, 0xF684DF56C3E01BC6}, // 1e34 + {0x3C7F400000000000, 0x9A130B963A6C115C}, // 1e35 + {0x4B9F100000000000, 0xC097CE7BC90715B3}, // 1e36 + {0x1E86D40000000000, 0xF0BDC21ABB48DB20}, // 1e37 + {0x1314448000000000, 0x96769950B50D88F4}, // 1e38 + {0x17D955A000000000, 0xBC143FA4E250EB31}, // 1e39 + {0x5DCFAB0800000000, 0xEB194F8E1AE525FD}, // 1e40 + {0x5AA1CAE500000000, 0x92EFD1B8D0CF37BE}, // 1e41 + {0xF14A3D9E40000000, 0xB7ABC627050305AD}, // 1e42 + {0x6D9CCD05D0000000, 0xE596B7B0C643C719}, // 1e43 + {0xE4820023A2000000, 0x8F7E32CE7BEA5C6F}, // 1e44 + {0xDDA2802C8A800000, 0xB35DBF821AE4F38B}, // 1e45 + {0xD50B2037AD200000, 0xE0352F62A19E306E}, // 1e46 + {0x4526F422CC340000, 0x8C213D9DA502DE45}, // 1e47 + {0x9670B12B7F410000, 0xAF298D050E4395D6}, // 1e48 + {0x3C0CDD765F114000, 0xDAF3F04651D47B4C}, // 1e49 + {0xA5880A69FB6AC800, 0x88D8762BF324CD0F}, // 1e50 + {0x8EEA0D047A457A00, 0xAB0E93B6EFEE0053}, // 1e51 + {0x72A4904598D6D880, 0xD5D238A4ABE98068}, // 1e52 + {0x47A6DA2B7F864750, 0x85A36366EB71F041}, // 1e53 + {0x999090B65F67D924, 0xA70C3C40A64E6C51}, // 1e54 + {0xFFF4B4E3F741CF6D, 0xD0CF4B50CFE20765}, // 1e55 + {0xBFF8F10E7A8921A4, 0x82818F1281ED449F}, // 1e56 + {0xAFF72D52192B6A0D, 0xA321F2D7226895C7}, // 1e57 + {0x9BF4F8A69F764490, 0xCBEA6F8CEB02BB39}, // 1e58 + {0x02F236D04753D5B4, 0xFEE50B7025C36A08}, // 1e59 + {0x01D762422C946590, 0x9F4F2726179A2245}, // 1e60 + {0x424D3AD2B7B97EF5, 0xC722F0EF9D80AAD6}, // 1e61 + {0xD2E0898765A7DEB2, 0xF8EBAD2B84E0D58B}, // 1e62 + {0x63CC55F49F88EB2F, 0x9B934C3B330C8577}, // 1e63 + {0x3CBF6B71C76B25FB, 0xC2781F49FFCFA6D5}, // 1e64 + {0x8BEF464E3945EF7A, 0xF316271C7FC3908A}, // 1e65 + {0x97758BF0E3CBB5AC, 0x97EDD871CFDA3A56}, // 1e66 + {0x3D52EEED1CBEA317, 0xBDE94E8E43D0C8EC}, // 1e67 + {0x4CA7AAA863EE4BDD, 0xED63A231D4C4FB27}, // 1e68 + {0x8FE8CAA93E74EF6A, 0x945E455F24FB1CF8}, // 1e69 + {0xB3E2FD538E122B44, 0xB975D6B6EE39E436}, // 1e70 + {0x60DBBCA87196B616, 0xE7D34C64A9C85D44}, // 1e71 + {0xBC8955E946FE31CD, 0x90E40FBEEA1D3A4A}, // 1e72 + {0x6BABAB6398BDBE41, 0xB51D13AEA4A488DD}, // 1e73 + {0xC696963C7EED2DD1, 0xE264589A4DCDAB14}, // 1e74 + {0xFC1E1DE5CF543CA2, 0x8D7EB76070A08AEC}, // 1e75 + {0x3B25A55F43294BCB, 0xB0DE65388CC8ADA8}, // 1e76 + {0x49EF0EB713F39EBE, 0xDD15FE86AFFAD912}, // 1e77 + {0x6E3569326C784337, 0x8A2DBF142DFCC7AB}, // 1e78 + {0x49C2C37F07965404, 0xACB92ED9397BF996}, // 1e79 + {0xDC33745EC97BE906, 0xD7E77A8F87DAF7FB}, // 1e80 + {0x69A028BB3DED71A3, 0x86F0AC99B4E8DAFD}, // 1e81 + {0xC40832EA0D68CE0C, 0xA8ACD7C0222311BC}, // 1e82 + {0xF50A3FA490C30190, 0xD2D80DB02AABD62B}, // 1e83 + {0x792667C6DA79E0FA, 0x83C7088E1AAB65DB}, // 1e84 + {0x577001B891185938, 0xA4B8CAB1A1563F52}, // 1e85 + {0xED4C0226B55E6F86, 0xCDE6FD5E09ABCF26}, // 1e86 + {0x544F8158315B05B4, 0x80B05E5AC60B6178}, // 1e87 + {0x696361AE3DB1C721, 0xA0DC75F1778E39D6}, // 1e88 + {0x03BC3A19CD1E38E9, 0xC913936DD571C84C}, // 1e89 + {0x04AB48A04065C723, 0xFB5878494ACE3A5F}, // 1e90 + {0x62EB0D64283F9C76, 0x9D174B2DCEC0E47B}, // 1e91 + {0x3BA5D0BD324F8394, 0xC45D1DF942711D9A}, // 1e92 + {0xCA8F44EC7EE36479, 0xF5746577930D6500}, // 1e93 + {0x7E998B13CF4E1ECB, 0x9968BF6ABBE85F20}, // 1e94 + {0x9E3FEDD8C321A67E, 0xBFC2EF456AE276E8}, // 1e95 + {0xC5CFE94EF3EA101E, 0xEFB3AB16C59B14A2}, // 1e96 + {0xBBA1F1D158724A12, 0x95D04AEE3B80ECE5}, // 1e97 + {0x2A8A6E45AE8EDC97, 0xBB445DA9CA61281F}, // 1e98 + {0xF52D09D71A3293BD, 0xEA1575143CF97226}, // 1e99 + {0x593C2626705F9C56, 0x924D692CA61BE758}, // 1e100 + {0x6F8B2FB00C77836C, 0xB6E0C377CFA2E12E}, // 1e101 + {0x0B6DFB9C0F956447, 0xE498F455C38B997A}, // 1e102 + {0x4724BD4189BD5EAC, 0x8EDF98B59A373FEC}, // 1e103 + {0x58EDEC91EC2CB657, 0xB2977EE300C50FE7}, // 1e104 + {0x2F2967B66737E3ED, 0xDF3D5E9BC0F653E1}, // 1e105 + {0xBD79E0D20082EE74, 0x8B865B215899F46C}, // 1e106 + {0xECD8590680A3AA11, 0xAE67F1E9AEC07187}, // 1e107 + {0xE80E6F4820CC9495, 0xDA01EE641A708DE9}, // 1e108 + {0x3109058D147FDCDD, 0x884134FE908658B2}, // 1e109 + {0xBD4B46F0599FD415, 0xAA51823E34A7EEDE}, // 1e110 + {0x6C9E18AC7007C91A, 0xD4E5E2CDC1D1EA96}, // 1e111 + {0x03E2CF6BC604DDB0, 0x850FADC09923329E}, // 1e112 + {0x84DB8346B786151C, 0xA6539930BF6BFF45}, // 1e113 + {0xE612641865679A63, 0xCFE87F7CEF46FF16}, // 1e114 + {0x4FCB7E8F3F60C07E, 0x81F14FAE158C5F6E}, // 1e115 + {0xE3BE5E330F38F09D, 0xA26DA3999AEF7749}, // 1e116 + {0x5CADF5BFD3072CC5, 0xCB090C8001AB551C}, // 1e117 + {0x73D9732FC7C8F7F6, 0xFDCB4FA002162A63}, // 1e118 + {0x2867E7FDDCDD9AFA, 0x9E9F11C4014DDA7E}, // 1e119 + {0xB281E1FD541501B8, 0xC646D63501A1511D}, // 1e120 + {0x1F225A7CA91A4226, 0xF7D88BC24209A565}, // 1e121 + {0x3375788DE9B06958, 0x9AE757596946075F}, // 1e122 + {0x0052D6B1641C83AE, 0xC1A12D2FC3978937}, // 1e123 + {0xC0678C5DBD23A49A, 0xF209787BB47D6B84}, // 1e124 + {0xF840B7BA963646E0, 0x9745EB4D50CE6332}, // 1e125 + {0xB650E5A93BC3D898, 0xBD176620A501FBFF}, // 1e126 + {0xA3E51F138AB4CEBE, 0xEC5D3FA8CE427AFF}, // 1e127 + {0xC66F336C36B10137, 0x93BA47C980E98CDF}, // 1e128 + {0xB80B0047445D4184, 0xB8A8D9BBE123F017}, // 1e129 + {0xA60DC059157491E5, 0xE6D3102AD96CEC1D}, // 1e130 + {0x87C89837AD68DB2F, 0x9043EA1AC7E41392}, // 1e131 + {0x29BABE4598C311FB, 0xB454E4A179DD1877}, // 1e132 + {0xF4296DD6FEF3D67A, 0xE16A1DC9D8545E94}, // 1e133 + {0x1899E4A65F58660C, 0x8CE2529E2734BB1D}, // 1e134 + {0x5EC05DCFF72E7F8F, 0xB01AE745B101E9E4}, // 1e135 + {0x76707543F4FA1F73, 0xDC21A1171D42645D}, // 1e136 + {0x6A06494A791C53A8, 0x899504AE72497EBA}, // 1e137 + {0x0487DB9D17636892, 0xABFA45DA0EDBDE69}, // 1e138 + {0x45A9D2845D3C42B6, 0xD6F8D7509292D603}, // 1e139 + {0x0B8A2392BA45A9B2, 0x865B86925B9BC5C2}, // 1e140 + {0x8E6CAC7768D7141E, 0xA7F26836F282B732}, // 1e141 + {0x3207D795430CD926, 0xD1EF0244AF2364FF}, // 1e142 + {0x7F44E6BD49E807B8, 0x8335616AED761F1F}, // 1e143 + {0x5F16206C9C6209A6, 0xA402B9C5A8D3A6E7}, // 1e144 + {0x36DBA887C37A8C0F, 0xCD036837130890A1}, // 1e145 + {0xC2494954DA2C9789, 0x802221226BE55A64}, // 1e146 + {0xF2DB9BAA10B7BD6C, 0xA02AA96B06DEB0FD}, // 1e147 + {0x6F92829494E5ACC7, 0xC83553C5C8965D3D}, // 1e148 + {0xCB772339BA1F17F9, 0xFA42A8B73ABBF48C}, // 1e149 + {0xFF2A760414536EFB, 0x9C69A97284B578D7}, // 1e150 + {0xFEF5138519684ABA, 0xC38413CF25E2D70D}, // 1e151 + {0x7EB258665FC25D69, 0xF46518C2EF5B8CD1}, // 1e152 + {0xEF2F773FFBD97A61, 0x98BF2F79D5993802}, // 1e153 + {0xAAFB550FFACFD8FA, 0xBEEEFB584AFF8603}, // 1e154 + {0x95BA2A53F983CF38, 0xEEAABA2E5DBF6784}, // 1e155 + {0xDD945A747BF26183, 0x952AB45CFA97A0B2}, // 1e156 + {0x94F971119AEEF9E4, 0xBA756174393D88DF}, // 1e157 + {0x7A37CD5601AAB85D, 0xE912B9D1478CEB17}, // 1e158 + {0xAC62E055C10AB33A, 0x91ABB422CCB812EE}, // 1e159 + {0x577B986B314D6009, 0xB616A12B7FE617AA}, // 1e160 + {0xED5A7E85FDA0B80B, 0xE39C49765FDF9D94}, // 1e161 + {0x14588F13BE847307, 0x8E41ADE9FBEBC27D}, // 1e162 + {0x596EB2D8AE258FC8, 0xB1D219647AE6B31C}, // 1e163 + {0x6FCA5F8ED9AEF3BB, 0xDE469FBD99A05FE3}, // 1e164 + {0x25DE7BB9480D5854, 0x8AEC23D680043BEE}, // 1e165 + {0xAF561AA79A10AE6A, 0xADA72CCC20054AE9}, // 1e166 + {0x1B2BA1518094DA04, 0xD910F7FF28069DA4}, // 1e167 + {0x90FB44D2F05D0842, 0x87AA9AFF79042286}, // 1e168 + {0x353A1607AC744A53, 0xA99541BF57452B28}, // 1e169 + {0x42889B8997915CE8, 0xD3FA922F2D1675F2}, // 1e170 + {0x69956135FEBADA11, 0x847C9B5D7C2E09B7}, // 1e171 + {0x43FAB9837E699095, 0xA59BC234DB398C25}, // 1e172 + {0x94F967E45E03F4BB, 0xCF02B2C21207EF2E}, // 1e173 + {0x1D1BE0EEBAC278F5, 0x8161AFB94B44F57D}, // 1e174 + {0x6462D92A69731732, 0xA1BA1BA79E1632DC}, // 1e175 + {0x7D7B8F7503CFDCFE, 0xCA28A291859BBF93}, // 1e176 + {0x5CDA735244C3D43E, 0xFCB2CB35E702AF78}, // 1e177 + {0x3A0888136AFA64A7, 0x9DEFBF01B061ADAB}, // 1e178 + {0x088AAA1845B8FDD0, 0xC56BAEC21C7A1916}, // 1e179 + {0x8AAD549E57273D45, 0xF6C69A72A3989F5B}, // 1e180 + {0x36AC54E2F678864B, 0x9A3C2087A63F6399}, // 1e181 + {0x84576A1BB416A7DD, 0xC0CB28A98FCF3C7F}, // 1e182 + {0x656D44A2A11C51D5, 0xF0FDF2D3F3C30B9F}, // 1e183 + {0x9F644AE5A4B1B325, 0x969EB7C47859E743}, // 1e184 + {0x873D5D9F0DDE1FEE, 0xBC4665B596706114}, // 1e185 + {0xA90CB506D155A7EA, 0xEB57FF22FC0C7959}, // 1e186 + {0x09A7F12442D588F2, 0x9316FF75DD87CBD8}, // 1e187 + {0x0C11ED6D538AEB2F, 0xB7DCBF5354E9BECE}, // 1e188 + {0x8F1668C8A86DA5FA, 0xE5D3EF282A242E81}, // 1e189 + {0xF96E017D694487BC, 0x8FA475791A569D10}, // 1e190 + {0x37C981DCC395A9AC, 0xB38D92D760EC4455}, // 1e191 + {0x85BBE253F47B1417, 0xE070F78D3927556A}, // 1e192 + {0x93956D7478CCEC8E, 0x8C469AB843B89562}, // 1e193 + {0x387AC8D1970027B2, 0xAF58416654A6BABB}, // 1e194 + {0x06997B05FCC0319E, 0xDB2E51BFE9D0696A}, // 1e195 + {0x441FECE3BDF81F03, 0x88FCF317F22241E2}, // 1e196 + {0xD527E81CAD7626C3, 0xAB3C2FDDEEAAD25A}, // 1e197 + {0x8A71E223D8D3B074, 0xD60B3BD56A5586F1}, // 1e198 + {0xF6872D5667844E49, 0x85C7056562757456}, // 1e199 + {0xB428F8AC016561DB, 0xA738C6BEBB12D16C}, // 1e200 + {0xE13336D701BEBA52, 0xD106F86E69D785C7}, // 1e201 + {0xECC0024661173473, 0x82A45B450226B39C}, // 1e202 + {0x27F002D7F95D0190, 0xA34D721642B06084}, // 1e203 + {0x31EC038DF7B441F4, 0xCC20CE9BD35C78A5}, // 1e204 + {0x7E67047175A15271, 0xFF290242C83396CE}, // 1e205 + {0x0F0062C6E984D386, 0x9F79A169BD203E41}, // 1e206 + {0x52C07B78A3E60868, 0xC75809C42C684DD1}, // 1e207 + {0xA7709A56CCDF8A82, 0xF92E0C3537826145}, // 1e208 + {0x88A66076400BB691, 0x9BBCC7A142B17CCB}, // 1e209 + {0x6ACFF893D00EA435, 0xC2ABF989935DDBFE}, // 1e210 + {0x0583F6B8C4124D43, 0xF356F7EBF83552FE}, // 1e211 + {0xC3727A337A8B704A, 0x98165AF37B2153DE}, // 1e212 + {0x744F18C0592E4C5C, 0xBE1BF1B059E9A8D6}, // 1e213 + {0x1162DEF06F79DF73, 0xEDA2EE1C7064130C}, // 1e214 + {0x8ADDCB5645AC2BA8, 0x9485D4D1C63E8BE7}, // 1e215 + {0x6D953E2BD7173692, 0xB9A74A0637CE2EE1}, // 1e216 + {0xC8FA8DB6CCDD0437, 0xE8111C87C5C1BA99}, // 1e217 + {0x1D9C9892400A22A2, 0x910AB1D4DB9914A0}, // 1e218 + {0x2503BEB6D00CAB4B, 0xB54D5E4A127F59C8}, // 1e219 + {0x2E44AE64840FD61D, 0xE2A0B5DC971F303A}, // 1e220 + {0x5CEAECFED289E5D2, 0x8DA471A9DE737E24}, // 1e221 + {0x7425A83E872C5F47, 0xB10D8E1456105DAD}, // 1e222 + {0xD12F124E28F77719, 0xDD50F1996B947518}, // 1e223 + {0x82BD6B70D99AAA6F, 0x8A5296FFE33CC92F}, // 1e224 + {0x636CC64D1001550B, 0xACE73CBFDC0BFB7B}, // 1e225 + {0x3C47F7E05401AA4E, 0xD8210BEFD30EFA5A}, // 1e226 + {0x65ACFAEC34810A71, 0x8714A775E3E95C78}, // 1e227 + {0x7F1839A741A14D0D, 0xA8D9D1535CE3B396}, // 1e228 + {0x1EDE48111209A050, 0xD31045A8341CA07C}, // 1e229 + {0x934AED0AAB460432, 0x83EA2B892091E44D}, // 1e230 + {0xF81DA84D5617853F, 0xA4E4B66B68B65D60}, // 1e231 + {0x36251260AB9D668E, 0xCE1DE40642E3F4B9}, // 1e232 + {0xC1D72B7C6B426019, 0x80D2AE83E9CE78F3}, // 1e233 + {0xB24CF65B8612F81F, 0xA1075A24E4421730}, // 1e234 + {0xDEE033F26797B627, 0xC94930AE1D529CFC}, // 1e235 + {0x169840EF017DA3B1, 0xFB9B7CD9A4A7443C}, // 1e236 + {0x8E1F289560EE864E, 0x9D412E0806E88AA5}, // 1e237 + {0xF1A6F2BAB92A27E2, 0xC491798A08A2AD4E}, // 1e238 + {0xAE10AF696774B1DB, 0xF5B5D7EC8ACB58A2}, // 1e239 + {0xACCA6DA1E0A8EF29, 0x9991A6F3D6BF1765}, // 1e240 + {0x17FD090A58D32AF3, 0xBFF610B0CC6EDD3F}, // 1e241 + {0xDDFC4B4CEF07F5B0, 0xEFF394DCFF8A948E}, // 1e242 + {0x4ABDAF101564F98E, 0x95F83D0A1FB69CD9}, // 1e243 + {0x9D6D1AD41ABE37F1, 0xBB764C4CA7A4440F}, // 1e244 + {0x84C86189216DC5ED, 0xEA53DF5FD18D5513}, // 1e245 + {0x32FD3CF5B4E49BB4, 0x92746B9BE2F8552C}, // 1e246 + {0x3FBC8C33221DC2A1, 0xB7118682DBB66A77}, // 1e247 + {0x0FABAF3FEAA5334A, 0xE4D5E82392A40515}, // 1e248 + {0x29CB4D87F2A7400E, 0x8F05B1163BA6832D}, // 1e249 + {0x743E20E9EF511012, 0xB2C71D5BCA9023F8}, // 1e250 + {0x914DA9246B255416, 0xDF78E4B2BD342CF6}, // 1e251 + {0x1AD089B6C2F7548E, 0x8BAB8EEFB6409C1A}, // 1e252 + {0xA184AC2473B529B1, 0xAE9672ABA3D0C320}, // 1e253 + {0xC9E5D72D90A2741E, 0xDA3C0F568CC4F3E8}, // 1e254 + {0x7E2FA67C7A658892, 0x8865899617FB1871}, // 1e255 + {0xDDBB901B98FEEAB7, 0xAA7EEBFB9DF9DE8D}, // 1e256 + {0x552A74227F3EA565, 0xD51EA6FA85785631}, // 1e257 + {0xD53A88958F87275F, 0x8533285C936B35DE}, // 1e258 + {0x8A892ABAF368F137, 0xA67FF273B8460356}, // 1e259 + {0x2D2B7569B0432D85, 0xD01FEF10A657842C}, // 1e260 + {0x9C3B29620E29FC73, 0x8213F56A67F6B29B}, // 1e261 + {0x8349F3BA91B47B8F, 0xA298F2C501F45F42}, // 1e262 + {0x241C70A936219A73, 0xCB3F2F7642717713}, // 1e263 + {0xED238CD383AA0110, 0xFE0EFB53D30DD4D7}, // 1e264 + {0xF4363804324A40AA, 0x9EC95D1463E8A506}, // 1e265 + {0xB143C6053EDCD0D5, 0xC67BB4597CE2CE48}, // 1e266 + {0xDD94B7868E94050A, 0xF81AA16FDC1B81DA}, // 1e267 + {0xCA7CF2B4191C8326, 0x9B10A4E5E9913128}, // 1e268 + {0xFD1C2F611F63A3F0, 0xC1D4CE1F63F57D72}, // 1e269 + {0xBC633B39673C8CEC, 0xF24A01A73CF2DCCF}, // 1e270 + {0xD5BE0503E085D813, 0x976E41088617CA01}, // 1e271 + {0x4B2D8644D8A74E18, 0xBD49D14AA79DBC82}, // 1e272 + {0xDDF8E7D60ED1219E, 0xEC9C459D51852BA2}, // 1e273 + {0xCABB90E5C942B503, 0x93E1AB8252F33B45}, // 1e274 + {0x3D6A751F3B936243, 0xB8DA1662E7B00A17}, // 1e275 + {0x0CC512670A783AD4, 0xE7109BFBA19C0C9D}, // 1e276 + {0x27FB2B80668B24C5, 0x906A617D450187E2}, // 1e277 + {0xB1F9F660802DEDF6, 0xB484F9DC9641E9DA}, // 1e278 + {0x5E7873F8A0396973, 0xE1A63853BBD26451}, // 1e279 + {0xDB0B487B6423E1E8, 0x8D07E33455637EB2}, // 1e280 + {0x91CE1A9A3D2CDA62, 0xB049DC016ABC5E5F}, // 1e281 + {0x7641A140CC7810FB, 0xDC5C5301C56B75F7}, // 1e282 + {0xA9E904C87FCB0A9D, 0x89B9B3E11B6329BA}, // 1e283 + {0x546345FA9FBDCD44, 0xAC2820D9623BF429}, // 1e284 + {0xA97C177947AD4095, 0xD732290FBACAF133}, // 1e285 + {0x49ED8EABCCCC485D, 0x867F59A9D4BED6C0}, // 1e286 + {0x5C68F256BFFF5A74, 0xA81F301449EE8C70}, // 1e287 + {0x73832EEC6FFF3111, 0xD226FC195C6A2F8C}, // 1e288 + {0xC831FD53C5FF7EAB, 0x83585D8FD9C25DB7}, // 1e289 + {0xBA3E7CA8B77F5E55, 0xA42E74F3D032F525}, // 1e290 + {0x28CE1BD2E55F35EB, 0xCD3A1230C43FB26F}, // 1e291 + {0x7980D163CF5B81B3, 0x80444B5E7AA7CF85}, // 1e292 + {0xD7E105BCC332621F, 0xA0555E361951C366}, // 1e293 + {0x8DD9472BF3FEFAA7, 0xC86AB5C39FA63440}, // 1e294 + {0xB14F98F6F0FEB951, 0xFA856334878FC150}, // 1e295 + {0x6ED1BF9A569F33D3, 0x9C935E00D4B9D8D2}, // 1e296 + {0x0A862F80EC4700C8, 0xC3B8358109E84F07}, // 1e297 + {0xCD27BB612758C0FA, 0xF4A642E14C6262C8}, // 1e298 + {0x8038D51CB897789C, 0x98E7E9CCCFBD7DBD}, // 1e299 + {0xE0470A63E6BD56C3, 0xBF21E44003ACDD2C}, // 1e300 + {0x1858CCFCE06CAC74, 0xEEEA5D5004981478}, // 1e301 + {0x0F37801E0C43EBC8, 0x95527A5202DF0CCB}, // 1e302 + {0xD30560258F54E6BA, 0xBAA718E68396CFFD}, // 1e303 + {0x47C6B82EF32A2069, 0xE950DF20247C83FD}, // 1e304 + {0x4CDC331D57FA5441, 0x91D28B7416CDD27E}, // 1e305 + {0xE0133FE4ADF8E952, 0xB6472E511C81471D}, // 1e306 + {0x58180FDDD97723A6, 0xE3D8F9E563A198E5}, // 1e307 + {0x570F09EAA7EA7648, 0x8E679C2F5E44FF8F}, // 1e308 + {0x2CD2CC6551E513DA, 0xB201833B35D63F73}, // 1e309 + {0xF8077F7EA65E58D1, 0xDE81E40A034BCF4F}, // 1e310 + {0xFB04AFAF27FAF782, 0x8B112E86420F6191}, // 1e311 + {0x79C5DB9AF1F9B563, 0xADD57A27D29339F6}, // 1e312 + {0x18375281AE7822BC, 0xD94AD8B1C7380874}, // 1e313 + {0x8F2293910D0B15B5, 0x87CEC76F1C830548}, // 1e314 + {0xB2EB3875504DDB22, 0xA9C2794AE3A3C69A}, // 1e315 + {0x5FA60692A46151EB, 0xD433179D9C8CB841}, // 1e316 + {0xDBC7C41BA6BCD333, 0x849FEEC281D7F328}, // 1e317 + {0x12B9B522906C0800, 0xA5C7EA73224DEFF3}, // 1e318 + {0xD768226B34870A00, 0xCF39E50FEAE16BEF}, // 1e319 + {0xE6A1158300D46640, 0x81842F29F2CCE375}, // 1e320 + {0x60495AE3C1097FD0, 0xA1E53AF46F801C53}, // 1e321 + {0x385BB19CB14BDFC4, 0xCA5E89B18B602368}, // 1e322 + {0x46729E03DD9ED7B5, 0xFCF62C1DEE382C42}, // 1e323 + {0x6C07A2C26A8346D1, 0x9E19DB92B4E31BA9}, // 1e324 + {0xC7098B7305241885, 0xC5A05277621BE293}, // 1e325 + {0xB8CBEE4FC66D1EA7, 0xF70867153AA2DB38}, // 1e326 + {0x737F74F1DC043328, 0x9A65406D44A5C903}, // 1e327 + {0x505F522E53053FF2, 0xC0FE908895CF3B44}, // 1e328 + {0x647726B9E7C68FEF, 0xF13E34AABB430A15}, // 1e329 + {0x5ECA783430DC19F5, 0x96C6E0EAB509E64D}, // 1e330 + {0xB67D16413D132072, 0xBC789925624C5FE0}, // 1e331 + {0xE41C5BD18C57E88F, 0xEB96BF6EBADF77D8}, // 1e332 + {0x8E91B962F7B6F159, 0x933E37A534CBAAE7}, // 1e333 + {0x723627BBB5A4ADB0, 0xB80DC58E81FE95A1}, // 1e334 + {0xCEC3B1AAA30DD91C, 0xE61136F2227E3B09}, // 1e335 + {0x213A4F0AA5E8A7B1, 0x8FCAC257558EE4E6}, // 1e336 + {0xA988E2CD4F62D19D, 0xB3BD72ED2AF29E1F}, // 1e337 + {0x93EB1B80A33B8605, 0xE0ACCFA875AF45A7}, // 1e338 + {0xBC72F130660533C3, 0x8C6C01C9498D8B88}, // 1e339 + {0xEB8FAD7C7F8680B4, 0xAF87023B9BF0EE6A}, // 1e340 + {0xA67398DB9F6820E1, 0xDB68C2CA82ED2A05}, // 1e341 + {0x88083F8943A1148C, 0x892179BE91D43A43}, // 1e342 + {0x6A0A4F6B948959B0, 0xAB69D82E364948D4}, // 1e343 + {0x848CE34679ABB01C, 0xD6444E39C3DB9B09}, // 1e344 + {0xF2D80E0C0C0B4E11, 0x85EAB0E41A6940E5}, // 1e345 + {0x6F8E118F0F0E2195, 0xA7655D1D2103911F}, // 1e346 + {0x4B7195F2D2D1A9FB, 0xD13EB46469447567}, // 1e347 +} diff --git a/portal-loop/extracted/p/demo/json/eisel_lemire/pkg_metadata.json b/portal-loop/extracted/p/demo/json/eisel_lemire/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/json/eisel_lemire/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/json/ryu/floatconv.gno b/portal-loop/extracted/p/demo/json/ryu/floatconv.gno new file mode 100644 index 00000000..617141d2 --- /dev/null +++ b/portal-loop/extracted/p/demo/json/ryu/floatconv.gno @@ -0,0 +1,143 @@ +// Copyright 2018 Ulf Adams +// Modifications copyright 2019 Caleb Spare +// +// The contents of this file may be used under the terms of the Apache License, +// Version 2.0. +// +// (See accompanying file LICENSE or copy at +// http://www.apache.org/licenses/LICENSE-2.0) +// +// Unless required by applicable law or agreed to in writing, this software +// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. +// +// The code in this file is part of a Go translation of the C code originally written by +// Ulf Adams, which can be found at https://github.com/ulfjack/ryu. The original source +// code is licensed under the Apache License 2.0. This code is a derivative work thereof, +// adapted and modified to meet the specifications of the Gno language project. +// +// original Go implementation can be found at https://github.com/cespare/ryu. +// +// Please note that the modifications are also under the Apache License 2.0 unless +// otherwise specified. + +// Package ryu implements the Ryu algorithm for quickly converting floating +// point numbers into strings. +package ryu + +import ( + "math" +) + +const ( + mantBits32 = 23 + expBits32 = 8 + bias32 = 127 + + mantBits64 = 52 + expBits64 = 11 + bias64 = 1023 +) + +// FormatFloat64 converts a 64-bit floating point number f to a string. +// It behaves like strconv.FormatFloat(f, 'e', -1, 64). +func FormatFloat64(f float64) string { + b := make([]byte, 0, 24) + b = AppendFloat64(b, f) + return string(b) +} + +// AppendFloat64 appends the string form of the 64-bit floating point number f, +// as generated by FormatFloat64, to b and returns the extended buffer. +func AppendFloat64(b []byte, f float64) []byte { + // Step 1: Decode the floating-point number. + // Unify normalized and subnormal cases. + u := math.Float64bits(f) + neg := u>>(mantBits64+expBits64) != 0 + mant := u & (uint64(1)<> mantBits64) & (uint64(1)<= 0, "e >= 0") + assert(e <= 1650, "e <= 1650") + return (uint32(e) * 78913) >> 18 +} + +// log10Pow5 returns floor(log_10(5^e)). +func log10Pow5(e int32) uint32 { + // The first value this approximation fails for is 5^2621 + // which is just greater than 10^1832. + assert(e >= 0, "e >= 0") + assert(e <= 2620, "e <= 2620") + return (uint32(e) * 732923) >> 20 +} + +// pow5Bits returns ceil(log_2(5^e)), or else 1 if e==0. +func pow5Bits(e int32) int32 { + // This approximation works up to the point that the multiplication + // overflows at e = 3529. If the multiplication were done in 64 bits, + // it would fail at 5^4004 which is just greater than 2^9297. + assert(e >= 0, "e >= 0") + assert(e <= 3528, "e <= 3528") + return int32((uint32(e)*1217359)>>19 + 1) +} diff --git a/portal-loop/extracted/p/demo/json/ryu/floatconv_test.gno b/portal-loop/extracted/p/demo/json/ryu/floatconv_test.gno new file mode 100644 index 00000000..7f01d403 --- /dev/null +++ b/portal-loop/extracted/p/demo/json/ryu/floatconv_test.gno @@ -0,0 +1,33 @@ +package ryu + +import ( + "math" + "testing" +) + +func TestFormatFloat64(t *testing.T) { + tests := []struct { + name string + value float64 + expected string + }{ + {"positive infinity", math.Inf(1), "+Inf"}, + {"negative infinity", math.Inf(-1), "-Inf"}, + {"NaN", math.NaN(), "NaN"}, + {"zero", 0.0, "0e+00"}, + {"negative zero", -0.0, "0e+00"}, + {"positive number", 3.14159, "3.14159e+00"}, + {"negative number", -2.71828, "-2.71828e+00"}, + {"very small number", 1.23e-20, "1.23e-20"}, + {"very large number", 1.23e+20, "1.23e+20"}, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + result := FormatFloat64(test.value) + if result != test.expected { + t.Errorf("FormatFloat64(%v) = %q, expected %q", test.value, result, test.expected) + } + }) + } +} diff --git a/portal-loop/extracted/p/demo/json/ryu/pkg_metadata.json b/portal-loop/extracted/p/demo/json/ryu/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/json/ryu/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/json/ryu/ryu64.gno b/portal-loop/extracted/p/demo/json/ryu/ryu64.gno new file mode 100644 index 00000000..249e3d0f --- /dev/null +++ b/portal-loop/extracted/p/demo/json/ryu/ryu64.gno @@ -0,0 +1,344 @@ +package ryu + +import ( + "math/bits" +) + +type uint128 struct { + lo uint64 + hi uint64 +} + +// dec64 is a floating decimal type representing m * 10^e. +type dec64 struct { + m uint64 + e int32 +} + +func (d dec64) append(b []byte, neg bool) []byte { + // Step 5: Print the decimal representation. + if neg { + b = append(b, '-') + } + + out := d.m + outLen := decimalLen64(out) + bufLen := outLen + if bufLen > 1 { + bufLen++ // extra space for '.' + } + + // Print the decimal digits. + n := len(b) + if cap(b)-len(b) >= bufLen { + // Avoid function call in the common case. + b = b[:len(b)+bufLen] + } else { + b = append(b, make([]byte, bufLen)...) + } + + // Avoid expensive 64-bit divisions. + // We have at most 17 digits, and uint32 can store 9 digits. + // If the output doesn't fit into a uint32, cut off 8 digits + // so the rest will fit into a uint32. + var i int + if out>>32 > 0 { + var out32 uint32 + out, out32 = out/1e8, uint32(out%1e8) + for ; i < 8; i++ { + b[n+outLen-i] = '0' + byte(out32%10) + out32 /= 10 + } + } + out32 := uint32(out) + for ; i < outLen-1; i++ { + b[n+outLen-i] = '0' + byte(out32%10) + out32 /= 10 + } + b[n] = '0' + byte(out32%10) + + // Print the '.' if needed. + if outLen > 1 { + b[n+1] = '.' + } + + // Print the exponent. + b = append(b, 'e') + exp := d.e + int32(outLen) - 1 + if exp < 0 { + b = append(b, '-') + exp = -exp + } else { + // Unconditionally print a + here to match strconv's formatting. + b = append(b, '+') + } + // Always print at least two digits to match strconv's formatting. + d2 := exp % 10 + exp /= 10 + d1 := exp % 10 + d0 := exp / 10 + if d0 > 0 { + b = append(b, '0'+byte(d0)) + } + b = append(b, '0'+byte(d1), '0'+byte(d2)) + + return b +} + +func float64ToDecimalExactInt(mant, exp uint64) (d dec64, ok bool) { + e := exp - bias64 + if e > mantBits64 { + return d, false + } + shift := mantBits64 - e + mant |= 1 << mantBits64 // implicit 1 + d.m = mant >> shift + if d.m<= 0 { + // This expression is slightly faster than max(0, log10Pow2(e2) - 1). + q := log10Pow2(e2) - boolToUint32(e2 > 3) + e10 = int32(q) + k := pow5InvNumBits64 + pow5Bits(int32(q)) - 1 + i := -e2 + int32(q) + k + mul := pow5InvSplit64[q] + vr = mulShift64(4*m2, mul, i) + vp = mulShift64(4*m2+2, mul, i) + vm = mulShift64(4*m2-1-mmShift, mul, i) + if q <= 21 { + // This should use q <= 22, but I think 21 is also safe. + // Smaller values may still be safe, but it's more + // difficult to reason about them. Only one of mp, mv, + // and mm can be a multiple of 5, if any. + if mv%5 == 0 { + vrIsTrailingZeros = multipleOfPowerOfFive64(mv, q) + } else if acceptBounds { + // Same as min(e2 + (^mm & 1), pow5Factor64(mm)) >= q + // <=> e2 + (^mm & 1) >= q && pow5Factor64(mm) >= q + // <=> true && pow5Factor64(mm) >= q, since e2 >= q. + vmIsTrailingZeros = multipleOfPowerOfFive64(mv-1-mmShift, q) + } else if multipleOfPowerOfFive64(mv+2, q) { + vp-- + } + } + } else { + // This expression is slightly faster than max(0, log10Pow5(-e2) - 1). + q := log10Pow5(-e2) - boolToUint32(-e2 > 1) + e10 = int32(q) + e2 + i := -e2 - int32(q) + k := pow5Bits(i) - pow5NumBits64 + j := int32(q) - k + mul := pow5Split64[i] + vr = mulShift64(4*m2, mul, j) + vp = mulShift64(4*m2+2, mul, j) + vm = mulShift64(4*m2-1-mmShift, mul, j) + if q <= 1 { + // {vr,vp,vm} is trailing zeros if {mv,mp,mm} has at least q trailing 0 bits. + // mv = 4 * m2, so it always has at least two trailing 0 bits. + vrIsTrailingZeros = true + if acceptBounds { + // mm = mv - 1 - mmShift, so it has 1 trailing 0 bit iff mmShift == 1. + vmIsTrailingZeros = mmShift == 1 + } else { + // mp = mv + 2, so it always has at least one trailing 0 bit. + vp-- + } + } else if q < 63 { // TODO(ulfjack/cespare): Use a tighter bound here. + // We need to compute min(ntz(mv), pow5Factor64(mv) - e2) >= q - 1 + // <=> ntz(mv) >= q - 1 && pow5Factor64(mv) - e2 >= q - 1 + // <=> ntz(mv) >= q - 1 (e2 is negative and -e2 >= q) + // <=> (mv & ((1 << (q - 1)) - 1)) == 0 + // We also need to make sure that the left shift does not overflow. + vrIsTrailingZeros = multipleOfPowerOfTwo64(mv, q-1) + } + } + + // Step 4: Find the shortest decimal representation + // in the interval of valid representations. + var removed int32 + var lastRemovedDigit uint8 + var out uint64 + // On average, we remove ~2 digits. + if vmIsTrailingZeros || vrIsTrailingZeros { + // General case, which happens rarely (~0.7%). + for { + vpDiv10 := vp / 10 + vmDiv10 := vm / 10 + if vpDiv10 <= vmDiv10 { + break + } + vmMod10 := vm % 10 + vrDiv10 := vr / 10 + vrMod10 := vr % 10 + vmIsTrailingZeros = vmIsTrailingZeros && vmMod10 == 0 + vrIsTrailingZeros = vrIsTrailingZeros && lastRemovedDigit == 0 + lastRemovedDigit = uint8(vrMod10) + vr = vrDiv10 + vp = vpDiv10 + vm = vmDiv10 + removed++ + } + if vmIsTrailingZeros { + for { + vmDiv10 := vm / 10 + vmMod10 := vm % 10 + if vmMod10 != 0 { + break + } + vpDiv10 := vp / 10 + vrDiv10 := vr / 10 + vrMod10 := vr % 10 + vrIsTrailingZeros = vrIsTrailingZeros && lastRemovedDigit == 0 + lastRemovedDigit = uint8(vrMod10) + vr = vrDiv10 + vp = vpDiv10 + vm = vmDiv10 + removed++ + } + } + if vrIsTrailingZeros && lastRemovedDigit == 5 && vr%2 == 0 { + // Round even if the exact number is .....50..0. + lastRemovedDigit = 4 + } + out = vr + // We need to take vr + 1 if vr is outside bounds + // or we need to round up. + if (vr == vm && (!acceptBounds || !vmIsTrailingZeros)) || lastRemovedDigit >= 5 { + out++ + } + } else { + // Specialized for the common case (~99.3%). + // Percentages below are relative to this. + roundUp := false + for vp/100 > vm/100 { + // Optimization: remove two digits at a time (~86.2%). + roundUp = vr%100 >= 50 + vr /= 100 + vp /= 100 + vm /= 100 + removed += 2 + } + // Loop iterations below (approximately), without optimization above: + // 0: 0.03%, 1: 13.8%, 2: 70.6%, 3: 14.0%, 4: 1.40%, 5: 0.14%, 6+: 0.02% + // Loop iterations below (approximately), with optimization above: + // 0: 70.6%, 1: 27.8%, 2: 1.40%, 3: 0.14%, 4+: 0.02% + for vp/10 > vm/10 { + roundUp = vr%10 >= 5 + vr /= 10 + vp /= 10 + vm /= 10 + removed++ + } + // We need to take vr + 1 if vr is outside bounds + // or we need to round up. + out = vr + boolToUint64(vr == vm || roundUp) + } + + return dec64{m: out, e: e10 + removed} +} + +var powersOf10 = [...]uint64{ + 1e0, + 1e1, + 1e2, + 1e3, + 1e4, + 1e5, + 1e6, + 1e7, + 1e8, + 1e9, + 1e10, + 1e11, + 1e12, + 1e13, + 1e14, + 1e15, + 1e16, + 1e17, + // We only need to find the length of at most 17 digit numbers. +} + +func decimalLen64(u uint64) int { + // http://graphics.stanford.edu/~seander/bithacks.html#IntegerLog10 + log2 := 64 - bits.LeadingZeros64(u) - 1 + t := (log2 + 1) * 1233 >> 12 + return t - boolToInt(u < powersOf10[t]) + 1 +} + +func mulShift64(m uint64, mul uint128, shift int32) uint64 { + hihi, hilo := bits.Mul64(m, mul.hi) + lohi, _ := bits.Mul64(m, mul.lo) + sum := uint128{hi: hihi, lo: lohi + hilo} + if sum.lo < lohi { + sum.hi++ // overflow + } + return shiftRight128(sum, shift-64) +} + +func shiftRight128(v uint128, shift int32) uint64 { + // The shift value is always modulo 64. + // In the current implementation of the 64-bit version + // of Ryu, the shift value is always < 64. + // (It is in the range [2, 59].) + // Check this here in case a future change requires larger shift + // values. In this case this function needs to be adjusted. + assert(shift < 64, "shift < 64") + return (v.hi << uint64(64-shift)) | (v.lo >> uint(shift)) +} + +func pow5Factor64(v uint64) uint32 { + for n := uint32(0); ; n++ { + q, r := v/5, v%5 + if r != 0 { + return n + } + v = q + } +} + +func multipleOfPowerOfFive64(v uint64, p uint32) bool { + return pow5Factor64(v) >= p +} + +func multipleOfPowerOfTwo64(v uint64, p uint32) bool { + return uint32(bits.TrailingZeros64(v)) >= p +} diff --git a/portal-loop/extracted/p/demo/json/ryu/table.gno b/portal-loop/extracted/p/demo/json/ryu/table.gno new file mode 100644 index 00000000..fe33ad90 --- /dev/null +++ b/portal-loop/extracted/p/demo/json/ryu/table.gno @@ -0,0 +1,678 @@ +// Code generated by running "go generate". DO NOT EDIT. + +// Copyright 2018 Ulf Adams +// Modifications copyright 2019 Caleb Spare +// +// The contents of this file may be used under the terms of the Apache License, +// Version 2.0. +// +// (See accompanying file LICENSE or copy at +// http://www.apache.org/licenses/LICENSE-2.0) +// +// Unless required by applicable law or agreed to in writing, this software +// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. +// +// The code in this file is part of a Go translation of the C code written by +// Ulf Adams which may be found at https://github.com/ulfjack/ryu. That source +// code is licensed under Apache 2.0 and this code is derivative work thereof. + +package ryu + +const pow5NumBits32 = 61 + +var pow5Split32 = [...]uint64{ + 1152921504606846976, 1441151880758558720, 1801439850948198400, 2251799813685248000, + 1407374883553280000, 1759218604441600000, 2199023255552000000, 1374389534720000000, + 1717986918400000000, 2147483648000000000, 1342177280000000000, 1677721600000000000, + 2097152000000000000, 1310720000000000000, 1638400000000000000, 2048000000000000000, + 1280000000000000000, 1600000000000000000, 2000000000000000000, 1250000000000000000, + 1562500000000000000, 1953125000000000000, 1220703125000000000, 1525878906250000000, + 1907348632812500000, 1192092895507812500, 1490116119384765625, 1862645149230957031, + 1164153218269348144, 1455191522836685180, 1818989403545856475, 2273736754432320594, + 1421085471520200371, 1776356839400250464, 2220446049250313080, 1387778780781445675, + 1734723475976807094, 2168404344971008868, 1355252715606880542, 1694065894508600678, + 2117582368135750847, 1323488980084844279, 1654361225106055349, 2067951531382569187, + 1292469707114105741, 1615587133892632177, 2019483917365790221, +} + +const pow5InvNumBits32 = 59 + +var pow5InvSplit32 = [...]uint64{ + 576460752303423489, 461168601842738791, 368934881474191033, 295147905179352826, + 472236648286964522, 377789318629571618, 302231454903657294, 483570327845851670, + 386856262276681336, 309485009821345069, 495176015714152110, 396140812571321688, + 316912650057057351, 507060240091291761, 405648192073033409, 324518553658426727, + 519229685853482763, 415383748682786211, 332306998946228969, 531691198313966350, + 425352958651173080, 340282366920938464, 544451787073501542, 435561429658801234, + 348449143727040987, 557518629963265579, 446014903970612463, 356811923176489971, + 570899077082383953, 456719261665907162, 365375409332725730, +} + +const pow5NumBits64 = 121 + +var pow5Split64 = [...]uint128{ + {0, 72057594037927936}, + {0, 90071992547409920}, + {0, 112589990684262400}, + {0, 140737488355328000}, + {0, 87960930222080000}, + {0, 109951162777600000}, + {0, 137438953472000000}, + {0, 85899345920000000}, + {0, 107374182400000000}, + {0, 134217728000000000}, + {0, 83886080000000000}, + {0, 104857600000000000}, + {0, 131072000000000000}, + {0, 81920000000000000}, + {0, 102400000000000000}, + {0, 128000000000000000}, + {0, 80000000000000000}, + {0, 100000000000000000}, + {0, 125000000000000000}, + {0, 78125000000000000}, + {0, 97656250000000000}, + {0, 122070312500000000}, + {0, 76293945312500000}, + {0, 95367431640625000}, + {0, 119209289550781250}, + {4611686018427387904, 74505805969238281}, + {10376293541461622784, 93132257461547851}, + {8358680908399640576, 116415321826934814}, + {612489549322387456, 72759576141834259}, + {14600669991935148032, 90949470177292823}, + {13639151471491547136, 113686837721616029}, + {3213881284082270208, 142108547152020037}, + {4314518811765112832, 88817841970012523}, + {781462496279003136, 111022302462515654}, + {10200200157203529728, 138777878078144567}, + {13292654125893287936, 86736173798840354}, + {7392445620511834112, 108420217248550443}, + {4628871007212404736, 135525271560688054}, + {16728102434789916672, 84703294725430033}, + {7075069988205232128, 105879118406787542}, + {18067209522111315968, 132348898008484427}, + {8986162942105878528, 82718061255302767}, + {6621017659204960256, 103397576569128459}, + {3664586055578812416, 129246970711410574}, + {16125424340018921472, 80779356694631608}, + {1710036351314100224, 100974195868289511}, + {15972603494424788992, 126217744835361888}, + {9982877184015493120, 78886090522101180}, + {12478596480019366400, 98607613152626475}, + {10986559581596820096, 123259516440783094}, + {2254913720070624656, 77037197775489434}, + {12042014186943056628, 96296497219361792}, + {15052517733678820785, 120370621524202240}, + {9407823583549262990, 75231638452626400}, + {11759779479436578738, 94039548065783000}, + {14699724349295723422, 117549435082228750}, + {4575641699882439235, 73468396926392969}, + {10331238143280436948, 91835496157991211}, + {8302361660673158281, 114794370197489014}, + {1154580038986672043, 143492962746861268}, + {9944984561221445835, 89683101716788292}, + {12431230701526807293, 112103877145985365}, + {1703980321626345405, 140129846432481707}, + {17205888765512323542, 87581154020301066}, + {12283988920035628619, 109476442525376333}, + {1519928094762372062, 136845553156720417}, + {12479170105294952299, 85528470722950260}, + {15598962631618690374, 106910588403687825}, + {5663645234241199255, 133638235504609782}, + {17374836326682913246, 83523897190381113}, + {7883487353071477846, 104404871487976392}, + {9854359191339347308, 130506089359970490}, + {10770660513014479971, 81566305849981556}, + {13463325641268099964, 101957882312476945}, + {2994098996302961243, 127447352890596182}, + {15706369927971514489, 79654595556622613}, + {5797904354682229399, 99568244445778267}, + {2635694424925398845, 124460305557222834}, + {6258995034005762182, 77787690973264271}, + {3212057774079814824, 97234613716580339}, + {17850130272881932242, 121543267145725423}, + {18073860448192289507, 75964541966078389}, + {8757267504958198172, 94955677457597987}, + {6334898362770359811, 118694596821997484}, + {13182683513586250689, 74184123013748427}, + {11866668373555425458, 92730153767185534}, + {5609963430089506015, 115912692208981918}, + {17341285199088104971, 72445432630613698}, + {12453234462005355406, 90556790788267123}, + {10954857059079306353, 113195988485333904}, + {13693571323849132942, 141494985606667380}, + {17781854114260483896, 88434366004167112}, + {3780573569116053255, 110542957505208891}, + {114030942967678664, 138178696881511114}, + {4682955357782187069, 86361685550944446}, + {15077066234082509644, 107952106938680557}, + {5011274737320973344, 134940133673350697}, + {14661261756894078100, 84337583545844185}, + {4491519140835433913, 105421979432305232}, + {5614398926044292391, 131777474290381540}, + {12732371365632458552, 82360921431488462}, + {6692092170185797382, 102951151789360578}, + {17588487249587022536, 128688939736700722}, + {15604490549419276989, 80430587335437951}, + {14893927168346708332, 100538234169297439}, + {14005722942005997511, 125672792711621799}, + {15671105866394830300, 78545495444763624}, + {1142138259283986260, 98181869305954531}, + {15262730879387146537, 122727336632443163}, + {7233363790403272633, 76704585395276977}, + {13653390756431478696, 95880731744096221}, + {3231680390257184658, 119850914680120277}, + {4325643253124434363, 74906821675075173}, + {10018740084832930858, 93633527093843966}, + {3300053069186387764, 117041908867304958}, + {15897591223523656064, 73151193042065598}, + {10648616992549794273, 91438991302581998}, + {4087399203832467033, 114298739128227498}, + {14332621041645359599, 142873423910284372}, + {18181260187883125557, 89295889943927732}, + {4279831161144355331, 111619862429909666}, + {14573160988285219972, 139524828037387082}, + {13719911636105650386, 87203017523366926}, + {7926517508277287175, 109003771904208658}, + {684774848491833161, 136254714880260823}, + {7345513307948477581, 85159196800163014}, + {18405263671790372785, 106448996000203767}, + {18394893571310578077, 133061245000254709}, + {13802651491282805250, 83163278125159193}, + {3418256308821342851, 103954097656448992}, + {4272820386026678563, 129942622070561240}, + {2670512741266674102, 81214138794100775}, + {17173198981865506339, 101517673492625968}, + {3019754653622331308, 126897091865782461}, + {4193189667727651020, 79310682416114038}, + {14464859121514339583, 99138353020142547}, + {13469387883465536574, 123922941275178184}, + {8418367427165960359, 77451838296986365}, + {15134645302384838353, 96814797871232956}, + {471562554271496325, 121018497339041196}, + {9518098633274461011, 75636560836900747}, + {7285937273165688360, 94545701046125934}, + {18330793628311886258, 118182126307657417}, + {4539216990053847055, 73863828942285886}, + {14897393274422084627, 92329786177857357}, + {4786683537745442072, 115412232722321697}, + {14520892257159371055, 72132645451451060}, + {18151115321449213818, 90165806814313825}, + {8853836096529353561, 112707258517892282}, + {1843923083806916143, 140884073147365353}, + {12681666973447792349, 88052545717103345}, + {2017025661527576725, 110065682146379182}, + {11744654113764246714, 137582102682973977}, + {422879793461572340, 85988814176858736}, + {528599741826965425, 107486017721073420}, + {660749677283706782, 134357522151341775}, + {7330497575943398595, 83973451344588609}, + {13774807988356636147, 104966814180735761}, + {3383451930163631472, 131208517725919702}, + {15949715511634433382, 82005323578699813}, + {6102086334260878016, 102506654473374767}, + {3015921899398709616, 128133318091718459}, + {18025852251620051174, 80083323807324036}, + {4085571240815512351, 100104154759155046}, + {14330336087874166247, 125130193448943807}, + {15873989082562435760, 78206370905589879}, + {15230800334775656796, 97757963631987349}, + {5203442363187407284, 122197454539984187}, + {946308467778435600, 76373409087490117}, + {5794571603150432404, 95466761359362646}, + {16466586540792816313, 119333451699203307}, + {7985773578781816244, 74583407312002067}, + {5370530955049882401, 93229259140002584}, + {6713163693812353001, 116536573925003230}, + {18030785363914884337, 72835358703127018}, + {13315109668038829614, 91044198378908773}, + {2808829029766373305, 113805247973635967}, + {17346094342490130344, 142256559967044958}, + {6229622945628943561, 88910349979403099}, + {3175342663608791547, 111137937474253874}, + {13192550366365765242, 138922421842817342}, + {3633657960551215372, 86826513651760839}, + {18377130505971182927, 108533142064701048}, + {4524669058754427043, 135666427580876311}, + {9745447189362598758, 84791517238047694}, + {2958436949848472639, 105989396547559618}, + {12921418224165366607, 132486745684449522}, + {12687572408530742033, 82804216052780951}, + {11247779492236039638, 103505270065976189}, + {224666310012885835, 129381587582470237}, + {2446259452971747599, 80863492239043898}, + {12281196353069460307, 101079365298804872}, + {15351495441336825384, 126349206623506090}, + {14206370669262903769, 78968254139691306}, + {8534591299723853903, 98710317674614133}, + {15279925143082205283, 123387897093267666}, + {14161639232853766206, 77117435683292291}, + {13090363022639819853, 96396794604115364}, + {16362953778299774816, 120495993255144205}, + {12532689120651053212, 75309995784465128}, + {15665861400813816515, 94137494730581410}, + {10358954714162494836, 117671868413226763}, + {4168503687137865320, 73544917758266727}, + {598943590494943747, 91931147197833409}, + {5360365506546067587, 114913933997291761}, + {11312142901609972388, 143642417496614701}, + {9375932322719926695, 89776510935384188}, + {11719915403399908368, 112220638669230235}, + {10038208235822497557, 140275798336537794}, + {10885566165816448877, 87672373960336121}, + {18218643725697949000, 109590467450420151}, + {18161618638695048346, 136988084313025189}, + {13656854658398099168, 85617552695640743}, + {12459382304570236056, 107021940869550929}, + {1739169825430631358, 133777426086938662}, + {14922039196176308311, 83610891304336663}, + {14040862976792997485, 104513614130420829}, + {3716020665709083144, 130642017663026037}, + {4628355925281870917, 81651261039391273}, + {10397130925029726550, 102064076299239091}, + {8384727637859770284, 127580095374048864}, + {5240454773662356427, 79737559608780540}, + {6550568467077945534, 99671949510975675}, + {3576524565420044014, 124589936888719594}, + {6847013871814915412, 77868710555449746}, + {17782139376623420074, 97335888194312182}, + {13004302183924499284, 121669860242890228}, + {17351060901807587860, 76043662651806392}, + {3242082053549933210, 95054578314757991}, + {17887660622219580224, 118818222893447488}, + {11179787888887237640, 74261389308404680}, + {13974734861109047050, 92826736635505850}, + {8245046539531533005, 116033420794382313}, + {16682369133275677888, 72520887996488945}, + {7017903361312433648, 90651109995611182}, + {17995751238495317868, 113313887494513977}, + {8659630992836983623, 141642359368142472}, + {5412269370523114764, 88526474605089045}, + {11377022731581281359, 110658093256361306}, + {4997906377621825891, 138322616570451633}, + {14652906532082110942, 86451635356532270}, + {9092761128247862869, 108064544195665338}, + {2142579373455052779, 135080680244581673}, + {12868327154477877747, 84425425152863545}, + {2250350887815183471, 105531781441079432}, + {2812938609768979339, 131914726801349290}, + {6369772649532999991, 82446704250843306}, + {17185587848771025797, 103058380313554132}, + {3035240737254230630, 128822975391942666}, + {6508711479211282048, 80514359619964166}, + {17359261385868878368, 100642949524955207}, + {17087390713908710056, 125803686906194009}, + {3762090168551861929, 78627304316371256}, + {4702612710689827411, 98284130395464070}, + {15101637925217060072, 122855162994330087}, + {16356052730901744401, 76784476871456304}, + {1998321839917628885, 95980596089320381}, + {7109588318324424010, 119975745111650476}, + {13666864735807540814, 74984840694781547}, + {12471894901332038114, 93731050868476934}, + {6366496589810271835, 117163813585596168}, + {3979060368631419896, 73227383490997605}, + {9585511479216662775, 91534229363747006}, + {2758517312166052660, 114417786704683758}, + {12671518677062341634, 143022233380854697}, + {1002170145522881665, 89388895863034186}, + {10476084718758377889, 111736119828792732}, + {13095105898447972362, 139670149785990915}, + {5878598177316288774, 87293843616244322}, + {16571619758500136775, 109117304520305402}, + {11491152661270395161, 136396630650381753}, + {264441385652915120, 85247894156488596}, + {330551732066143900, 106559867695610745}, + {5024875683510067779, 133199834619513431}, + {10058076329834874218, 83249896637195894}, + {3349223375438816964, 104062370796494868}, + {4186529219298521205, 130077963495618585}, + {14145795808130045513, 81298727184761615}, + {13070558741735168987, 101623408980952019}, + {11726512408741573330, 127029261226190024}, + {7329070255463483331, 79393288266368765}, + {13773023837756742068, 99241610332960956}, + {17216279797195927585, 124052012916201195}, + {8454331864033760789, 77532508072625747}, + {5956228811614813082, 96915635090782184}, + {7445286014518516353, 121144543863477730}, + {9264989777501460624, 75715339914673581}, + {16192923240304213684, 94644174893341976}, + {1794409976670715490, 118305218616677471}, + {8039035263060279037, 73940761635423419}, + {5437108060397960892, 92425952044279274}, + {16019757112352226923, 115532440055349092}, + {788976158365366019, 72207775034593183}, + {14821278253238871236, 90259718793241478}, + {9303225779693813237, 112824648491551848}, + {11629032224617266546, 141030810614439810}, + {11879831158813179495, 88144256634024881}, + {1014730893234310657, 110180320792531102}, + {10491785653397664129, 137725400990663877}, + {8863209042587234033, 86078375619164923}, + {6467325284806654637, 107597969523956154}, + {17307528642863094104, 134497461904945192}, + {10817205401789433815, 84060913690590745}, + {18133192770664180173, 105076142113238431}, + {18054804944902837312, 131345177641548039}, + {18201782118205355176, 82090736025967524}, + {4305483574047142354, 102613420032459406}, + {14605226504413703751, 128266775040574257}, + {2210737537617482988, 80166734400358911}, + {16598479977304017447, 100208418000448638}, + {11524727934775246001, 125260522500560798}, + {2591268940807140847, 78287826562850499}, + {17074144231291089770, 97859783203563123}, + {16730994270686474309, 122324729004453904}, + {10456871419179046443, 76452955627783690}, + {3847717237119032246, 95566194534729613}, + {9421332564826178211, 119457743168412016}, + {5888332853016361382, 74661089480257510}, + {16583788103125227536, 93326361850321887}, + {16118049110479146516, 116657952312902359}, + {16991309721690548428, 72911220195563974}, + {12015765115258409727, 91139025244454968}, + {15019706394073012159, 113923781555568710}, + {9551260955736489391, 142404726944460888}, + {5969538097335305869, 89002954340288055}, + {2850236603241744433, 111253692925360069}, +} + +const pow5InvNumBits64 = 122 + +var pow5InvSplit64 = [...]uint128{ + {1, 288230376151711744}, + {3689348814741910324, 230584300921369395}, + {2951479051793528259, 184467440737095516}, + {17118578500402463900, 147573952589676412}, + {12632330341676300947, 236118324143482260}, + {10105864273341040758, 188894659314785808}, + {15463389048156653253, 151115727451828646}, + {17362724847566824558, 241785163922925834}, + {17579528692795369969, 193428131138340667}, + {6684925324752475329, 154742504910672534}, + {18074578149087781173, 247588007857076054}, + {18149011334012135262, 198070406285660843}, + {3451162622983977240, 158456325028528675}, + {5521860196774363583, 253530120045645880}, + {4417488157419490867, 202824096036516704}, + {7223339340677503017, 162259276829213363}, + {7867994130342094503, 259614842926741381}, + {2605046489531765280, 207691874341393105}, + {2084037191625412224, 166153499473114484}, + {10713157136084480204, 265845599156983174}, + {12259874523609494487, 212676479325586539}, + {13497248433629505913, 170141183460469231}, + {14216899864323388813, 272225893536750770}, + {11373519891458711051, 217780714829400616}, + {5409467098425058518, 174224571863520493}, + {4965798542738183305, 278759314981632789}, + {7661987648932456967, 223007451985306231}, + {2440241304404055250, 178405961588244985}, + {3904386087046488400, 285449538541191976}, + {17880904128604832013, 228359630832953580}, + {14304723302883865611, 182687704666362864}, + {15133127457049002812, 146150163733090291}, + {16834306301794583852, 233840261972944466}, + {9778096226693756759, 187072209578355573}, + {15201174610838826053, 149657767662684458}, + {2185786488890659746, 239452428260295134}, + {5437978005854438120, 191561942608236107}, + {15418428848909281466, 153249554086588885}, + {6222742084545298729, 245199286538542217}, + {16046240111861969953, 196159429230833773}, + {1768945645263844993, 156927543384667019}, + {10209010661905972635, 251084069415467230}, + {8167208529524778108, 200867255532373784}, + {10223115638361732810, 160693804425899027}, + {1599589762411131202, 257110087081438444}, + {4969020624670815285, 205688069665150755}, + {3975216499736652228, 164550455732120604}, + {13739044029062464211, 263280729171392966}, + {7301886408508061046, 210624583337114373}, + {13220206756290269483, 168499666669691498}, + {17462981995322520850, 269599466671506397}, + {6591687966774196033, 215679573337205118}, + {12652048002903177473, 172543658669764094}, + {9175230360419352987, 276069853871622551}, + {3650835473593572067, 220855883097298041}, + {17678063637842498946, 176684706477838432}, + {13527506561580357021, 282695530364541492}, + {3443307619780464970, 226156424291633194}, + {6443994910566282300, 180925139433306555}, + {5155195928453025840, 144740111546645244}, + {15627011115008661990, 231584178474632390}, + {12501608892006929592, 185267342779705912}, + {2622589484121723027, 148213874223764730}, + {4196143174594756843, 237142198758023568}, + {10735612169159626121, 189713759006418854}, + {12277838550069611220, 151771007205135083}, + {15955192865369467629, 242833611528216133}, + {1696107848069843133, 194266889222572907}, + {12424932722681605476, 155413511378058325}, + {1433148282581017146, 248661618204893321}, + {15903913885032455010, 198929294563914656}, + {9033782293284053685, 159143435651131725}, + {14454051669254485895, 254629497041810760}, + {11563241335403588716, 203703597633448608}, + {16629290697806691620, 162962878106758886}, + {781423413297334329, 260740604970814219}, + {4314487545379777786, 208592483976651375}, + {3451590036303822229, 166873987181321100}, + {5522544058086115566, 266998379490113760}, + {4418035246468892453, 213598703592091008}, + {10913125826658934609, 170878962873672806}, + {10082303693170474728, 273406340597876490}, + {8065842954536379782, 218725072478301192}, + {17520720807854834795, 174980057982640953}, + {5897060404116273733, 279968092772225526}, + {1028299508551108663, 223974474217780421}, + {15580034865808528224, 179179579374224336}, + {17549358155809824511, 286687326998758938}, + {2971440080422128639, 229349861599007151}, + {17134547323305344204, 183479889279205720}, + {13707637858644275364, 146783911423364576}, + {14553522944347019935, 234854258277383322}, + {4264120725993795302, 187883406621906658}, + {10789994210278856888, 150306725297525326}, + {9885293106962350374, 240490760476040522}, + {529536856086059653, 192392608380832418}, + {7802327114352668369, 153914086704665934}, + {1415676938738538420, 246262538727465495}, + {1132541550990830736, 197010030981972396}, + {15663428499760305882, 157608024785577916}, + {17682787970132668764, 252172839656924666}, + {10456881561364224688, 201738271725539733}, + {15744202878575200397, 161390617380431786}, + {17812026976236499989, 258224987808690858}, + {3181575136763469022, 206579990246952687}, + {13613306553636506187, 165263992197562149}, + {10713244041592678929, 264422387516099439}, + {12259944048016053467, 211537910012879551}, + {6118606423670932450, 169230328010303641}, + {2411072648389671274, 270768524816485826}, + {16686253377679378312, 216614819853188660}, + {13349002702143502650, 173291855882550928}, + {17669055508687693916, 277266969412081485}, + {14135244406950155133, 221813575529665188}, + {240149081334393137, 177450860423732151}, + {11452284974360759988, 283921376677971441}, + {5472479164746697667, 227137101342377153}, + {11756680961281178780, 181709681073901722}, + {2026647139541122378, 145367744859121378}, + {18000030682233437097, 232588391774594204}, + {18089373360528660001, 186070713419675363}, + {3403452244197197031, 148856570735740291}, + {16513570034941246220, 238170513177184465}, + {13210856027952996976, 190536410541747572}, + {3189987192878576934, 152429128433398058}, + {1414630693863812771, 243886605493436893}, + {8510402184574870864, 195109284394749514}, + {10497670562401807014, 156087427515799611}, + {9417575270359070576, 249739884025279378}, + {14912757845771077107, 199791907220223502}, + {4551508647133041040, 159833525776178802}, + {10971762650154775986, 255733641241886083}, + {16156107749607641435, 204586912993508866}, + {9235537384944202825, 163669530394807093}, + {11087511001168814197, 261871248631691349}, + {12559357615676961681, 209496998905353079}, + {13736834907283479668, 167597599124282463}, + {18289587036911657145, 268156158598851941}, + {10942320814787415393, 214524926879081553}, + {16132554281313752961, 171619941503265242}, + {11054691591134363444, 274591906405224388}, + {16222450902391311402, 219673525124179510}, + {12977960721913049122, 175738820099343608}, + {17075388340318968271, 281182112158949773}, + {2592264228029443648, 224945689727159819}, + {5763160197165465241, 179956551781727855}, + {9221056315464744386, 287930482850764568}, + {14755542681855616155, 230344386280611654}, + {15493782960226403247, 184275509024489323}, + {1326979923955391628, 147420407219591459}, + {9501865507812447252, 235872651551346334}, + {11290841220991868125, 188698121241077067}, + {1653975347309673853, 150958496992861654}, + {10025058185179298811, 241533595188578646}, + {4330697733401528726, 193226876150862917}, + {14532604630946953951, 154581500920690333}, + {1116074521063664381, 247330401473104534}, + {4582208431592841828, 197864321178483627}, + {14733813189500004432, 158291456942786901}, + {16195403473716186445, 253266331108459042}, + {5577625149489128510, 202613064886767234}, + {8151448934333213131, 162090451909413787}, + {16731667109675051333, 259344723055062059}, + {17074682502481951390, 207475778444049647}, + {6281048372501740465, 165980622755239718}, + {6360328581260874421, 265568996408383549}, + {8777611679750609860, 212455197126706839}, + {10711438158542398211, 169964157701365471}, + {9759603424184016492, 271942652322184754}, + {11497031554089123517, 217554121857747803}, + {16576322872755119460, 174043297486198242}, + {11764721337440549842, 278469275977917188}, + {16790474699436260520, 222775420782333750}, + {13432379759549008416, 178220336625867000}, + {3045063541568861850, 285152538601387201}, + {17193446092222730773, 228122030881109760}, + {13754756873778184618, 182497624704887808}, + {18382503128506368341, 145998099763910246}, + {3586563302416817083, 233596959622256395}, + {2869250641933453667, 186877567697805116}, + {17052795772514404226, 149502054158244092}, + {12527077977055405469, 239203286653190548}, + {17400360011128145022, 191362629322552438}, + {2852241564676785048, 153090103458041951}, + {15631632947708587046, 244944165532867121}, + {8815957543424959314, 195955332426293697}, + {18120812478965698421, 156764265941034957}, + {14235904707377476180, 250822825505655932}, + {4010026136418160298, 200658260404524746}, + {17965416168102169531, 160526608323619796}, + {2919224165770098987, 256842573317791675}, + {2335379332616079190, 205474058654233340}, + {1868303466092863352, 164379246923386672}, + {6678634360490491686, 263006795077418675}, + {5342907488392393349, 210405436061934940}, + {4274325990713914679, 168324348849547952}, + {10528270399884173809, 269318958159276723}, + {15801313949391159694, 215455166527421378}, + {1573004715287196786, 172364133221937103}, + {17274202803427156150, 275782613155099364}, + {17508711057483635243, 220626090524079491}, + {10317620031244997871, 176500872419263593}, + {12818843235250086271, 282401395870821749}, + {13944423402941979340, 225921116696657399}, + {14844887537095493795, 180736893357325919}, + {15565258844418305359, 144589514685860735}, + {6457670077359736959, 231343223497377177}, + {16234182506113520537, 185074578797901741}, + {9297997190148906106, 148059663038321393}, + {11187446689496339446, 236895460861314229}, + {12639306166338981880, 189516368689051383}, + {17490142562555006151, 151613094951241106}, + {2158786396894637579, 242580951921985771}, + {16484424376483351356, 194064761537588616}, + {9498190686444770762, 155251809230070893}, + {11507756283569722895, 248402894768113429}, + {12895553841597688639, 198722315814490743}, + {17695140702761971558, 158977852651592594}, + {17244178680193423523, 254364564242548151}, + {10105994129412828495, 203491651394038521}, + {4395446488788352473, 162793321115230817}, + {10722063196803274280, 260469313784369307}, + {1198952927958798777, 208375451027495446}, + {15716557601334680315, 166700360821996356}, + {17767794532651667857, 266720577315194170}, + {14214235626121334286, 213376461852155336}, + {7682039686155157106, 170701169481724269}, + {1223217053622520399, 273121871170758831}, + {15735968901865657612, 218497496936607064}, + {16278123936234436413, 174797997549285651}, + {219556594781725998, 279676796078857043}, + {7554342905309201445, 223741436863085634}, + {9732823138989271479, 178993149490468507}, + {815121763415193074, 286389039184749612}, + {11720143854957885429, 229111231347799689}, + {13065463898708218666, 183288985078239751}, + {6763022304224664610, 146631188062591801}, + {3442138057275642729, 234609900900146882}, + {13821756890046245153, 187687920720117505}, + {11057405512036996122, 150150336576094004}, + {6623802375033462826, 240240538521750407}, + {16367088344252501231, 192192430817400325}, + {13093670675402000985, 153753944653920260}, + {2503129006933649959, 246006311446272417}, + {13070549649772650937, 196805049157017933}, + {17835137349301941396, 157444039325614346}, + {2710778055689733971, 251910462920982955}, + {2168622444551787177, 201528370336786364}, + {5424246770383340065, 161222696269429091}, + {1300097203129523457, 257956314031086546}, + {15797473021471260058, 206365051224869236}, + {8948629602435097724, 165092040979895389}, + {3249760919670425388, 264147265567832623}, + {9978506365220160957, 211317812454266098}, + {15361502721659949412, 169054249963412878}, + {2442311466204457120, 270486799941460606}, + {16711244431931206989, 216389439953168484}, + {17058344360286875914, 173111551962534787}, + {12535955717491360170, 276978483140055660}, + {10028764573993088136, 221582786512044528}, + {15401709288678291155, 177266229209635622}, + {9885339602917624555, 283625966735416996}, + {4218922867592189321, 226900773388333597}, + {14443184738299482427, 181520618710666877}, + {4175850161155765295, 145216494968533502}, + {10370709072591134795, 232346391949653603}, + {15675264887556728482, 185877113559722882}, + {5161514280561562140, 148701690847778306}, + {879725219414678777, 237922705356445290}, + {703780175531743021, 190338164285156232}, + {11631070584651125387, 152270531428124985}, + {162968861732249003, 243632850284999977}, + {11198421533611530172, 194906280227999981}, + {5269388412147313814, 155925024182399985}, + {8431021459435702103, 249480038691839976}, + {3055468352806651359, 199584030953471981}, + {17201769941212962380, 159667224762777584}, + {16454785461715008838, 255467559620444135}, + {13163828369372007071, 204374047696355308}, + {17909760324981426303, 163499238157084246}, + {2830174816776909822, 261598781051334795}, + {2264139853421527858, 209279024841067836}, + {16568707141704863579, 167423219872854268}, + {4373838538276319787, 267877151796566830}, + {3499070830621055830, 214301721437253464}, + {6488605479238754987, 171441377149802771}, + {3003071137298187333, 274306203439684434}, + {6091805724580460189, 219444962751747547}, + {15941491023890099121, 175555970201398037}, + {10748990379256517301, 280889552322236860}, + {8599192303405213841, 224711641857789488}, + {14258051472207991719, 179769313486231590}, +} diff --git a/portal-loop/extracted/p/demo/json:0/LICENSE b/portal-loop/extracted/p/demo/json:0/LICENSE new file mode 100644 index 00000000..954b7ef4 --- /dev/null +++ b/portal-loop/extracted/p/demo/json:0/LICENSE @@ -0,0 +1,21 @@ +# MIT License + +Copyright (c) 2019 Pyzhov Stepan + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/portal-loop/extracted/p/demo/json:0/README.md b/portal-loop/extracted/p/demo/json:0/README.md new file mode 100644 index 00000000..86bc9928 --- /dev/null +++ b/portal-loop/extracted/p/demo/json:0/README.md @@ -0,0 +1,170 @@ +# JSON Parser + +The JSON parser is a package that provides functionality for parsing and processing JSON strings. This package accepts JSON strings as byte slices. + +Currently, gno does not [support the `reflect` package](https://docs.gno.land/concepts/effective-gno#reflection-is-never-clear), so it cannot retrieve type information at runtime. Therefore, it is designed to infer and handle type information when parsing JSON strings using a state machine approach. + +After passing through the state machine, JSON strings are represented as the `Node` type. The `Node` type represents nodes for JSON data, including various types such as `ObjectNode`, `ArrayNode`, `StringNode`, `NumberNode`, `BoolNode`, and `NullNode`. + +This package provides methods for manipulating, searching, and extracting the Node type. + +## State Machine + +To parse JSON strings, a [finite state machine](https://en.wikipedia.org/wiki/Finite-state_machine) approach is used. The state machine transitions to the next state based on the current state and the input character while parsing the JSON string. Through this method, type information can be inferred and processed without reflect, and the amount of parser code can be significantly reduced. + +The image below shows the state transitions of the state machine according to the states and input characters. + +```mermaid +stateDiagram-v2 + [*] --> __: Start + __ --> ST: String + __ --> MI: Number + __ --> ZE: Zero + __ --> IN: Integer + __ --> T1: Boolean (true) + __ --> F1: Boolean (false) + __ --> N1: Null + __ --> ec: Empty Object End + __ --> cc: Object End + __ --> bc: Array End + __ --> co: Object Begin + __ --> bo: Array Begin + __ --> cm: Comma + __ --> cl: Colon + __ --> OK: Success/End + ST --> OK: String Complete + MI --> OK: Number Complete + ZE --> OK: Zero Complete + IN --> OK: Integer Complete + T1 --> OK: True Complete + F1 --> OK: False Complete + N1 --> OK: Null Complete + ec --> OK: Empty Object Complete + cc --> OK: Object Complete + bc --> OK: Array Complete + co --> OB: Inside Object + bo --> AR: Inside Array + cm --> KE: Expecting New Key + cm --> VA: Expecting New Value + cl --> VA: Expecting Value + OB --> ST: String in Object (Key) + OB --> ec: Empty Object + OB --> cc: End Object + AR --> ST: String in Array + AR --> bc: End Array + KE --> ST: String as Key + VA --> ST: String as Value + VA --> MI: Number as Value + VA --> T1: True as Value + VA --> F1: False as Value + VA --> N1: Null as Value + OK --> [*]: End +``` + +## Examples + +This package provides parsing functionality along with encoding and decoding functionality. The following examples demonstrate how to use this package. + +### Decoding + +Decoding (or Unmarshaling) is the functionality that converts an input byte slice JSON string into a `Node` type. + +The converted `Node` type allows you to modify the JSON data or search and extract data that meets specific conditions. + +```go +package main + +import ( + "fmt" + "gno.land/p/demo/json" + "gno.land/p/demo/ufmt" +) + +func main() { + node, err := json.Unmarshal([]byte(`{"foo": "var"}`)) + if err != nil { + ufmt.Errorf("error: %v", err) + } + + ufmt.Sprintf("node: %v", node) +} +``` + +### Encoding + +Encoding (or Marshaling) is the functionality that converts JSON data represented as a Node type into a byte slice JSON string. + +> ⚠️ Caution: Converting a large `Node` type into a JSON string may _impact performance_. or might be cause _unexpected behavior_. + +```go +package main + +import ( + "fmt" + "gno.land/p/demo/json" + "gno.land/p/demo/ufmt" +) + +func main() { + node := ObjectNode("", map[string]*Node{ + "foo": StringNode("foo", "bar"), + "baz": NumberNode("baz", 100500), + "qux": NullNode("qux"), + }) + + b, err := json.Marshal(node) + if err != nil { + ufmt.Errorf("error: %v", err) + } + + ufmt.Sprintf("json: %s", string(b)) +} +``` + +### Searching + +Once the JSON data converted into a `Node` type, you can **search** and **extract** data that satisfy specific conditions. For example, you can find data with a specific type or data with a specific key. + +To use this functionality, you can use methods in the `GetXXX` prefixed methods. The `MustXXX` methods also provide the same functionality as the former methods, but they will **panic** if data doesn't satisfies the condition. + +Here is an example of finding data with a specific key. For more examples, please refer to the [node.gno](node.gno) file. + +```go +package main + +import ( + "fmt" + "gno.land/p/demo/json" + "gno.land/p/demo/ufmt" +) + +func main() { + root, err := Unmarshal([]byte(`{"foo": true, "bar": null}`)) + if err != nil { + ufmt.Errorf("error: %v", err) + } + + value, err := root.GetKey("foo") + if err != nil { + ufmt.Errorf("error occurred while getting key, %s", err) + } + + if value.MustBool() != true { + ufmt.Errorf("value is not true") + } + + value, err = root.GetKey("bar") + if err != nil { + t.Errorf("error occurred while getting key, %s", err) + } + + _, err = root.GetKey("baz") + if err == nil { + t.Errorf("key baz is not exist. must be failed") + } +} +``` + +## Contributing + +Please submit any issues or pull requests for this package through the GitHub repository at [gnolang/gno](). diff --git a/portal-loop/extracted/p/demo/json:0/buffer.gno b/portal-loop/extracted/p/demo/json:0/buffer.gno new file mode 100644 index 00000000..23fb53fb --- /dev/null +++ b/portal-loop/extracted/p/demo/json:0/buffer.gno @@ -0,0 +1,485 @@ +package json + +import ( + "errors" + "io" + "strings" + + "gno.land/p/demo/ufmt" +) + +type buffer struct { + data []byte + length int + index int + + last States + state States + class Classes +} + +// newBuffer creates a new buffer with the given data +func newBuffer(data []byte) *buffer { + return &buffer{ + data: data, + length: len(data), + last: GO, + state: GO, + } +} + +// first retrieves the first non-whitespace (or other escaped) character in the buffer. +func (b *buffer) first() (byte, error) { + for ; b.index < b.length; b.index++ { + c := b.data[b.index] + + if !(c == whiteSpace || c == carriageReturn || c == newLine || c == tab) { + return c, nil + } + } + + return 0, io.EOF +} + +// current returns the byte of the current index. +func (b *buffer) current() (byte, error) { + if b.index >= b.length { + return 0, io.EOF + } + + return b.data[b.index], nil +} + +// next moves to the next byte and returns it. +func (b *buffer) next() (byte, error) { + b.index++ + return b.current() +} + +// step just moves to the next position. +func (b *buffer) step() error { + _, err := b.next() + return err +} + +// move moves the index by the given position. +func (b *buffer) move(pos int) error { + newIndex := b.index + pos + + if newIndex > b.length { + return io.EOF + } + + b.index = newIndex + + return nil +} + +// slice returns the slice from the current index to the given position. +func (b *buffer) slice(pos int) ([]byte, error) { + end := b.index + pos + + if end > b.length { + return nil, io.EOF + } + + return b.data[b.index:end], nil +} + +// sliceFromIndices returns a slice of the buffer's data starting from 'start' up to (but not including) 'stop'. +func (b *buffer) sliceFromIndices(start, stop int) []byte { + if start > b.length { + start = b.length + } + + if stop > b.length { + stop = b.length + } + + return b.data[start:stop] +} + +// skip moves the index to skip the given byte. +func (b *buffer) skip(bs byte) error { + for b.index < b.length { + if b.data[b.index] == bs && !b.backslash() { + return nil + } + + b.index++ + } + + return io.EOF +} + +// skipAny moves the index until it encounters one of the given set of bytes. +func (b *buffer) skipAny(endTokens map[byte]bool) error { + for b.index < b.length { + if _, exists := endTokens[b.data[b.index]]; exists { + return nil + } + + b.index++ + } + + // build error message + var tokens []string + for token := range endTokens { + tokens = append(tokens, string(token)) + } + + return ufmt.Errorf( + "EOF reached before encountering one of the expected tokens: %s", + strings.Join(tokens, ", "), + ) +} + +// skipAndReturnIndex moves the buffer index forward by one and returns the new index. +func (b *buffer) skipAndReturnIndex() (int, error) { + err := b.step() + if err != nil { + return 0, err + } + + return b.index, nil +} + +// skipUntil moves the buffer index forward until it encounters a byte contained in the endTokens set. +func (b *buffer) skipUntil(endTokens map[byte]bool) (int, error) { + for b.index < b.length { + currentByte, err := b.current() + if err != nil { + return b.index, err + } + + // Check if the current byte is in the set of end tokens. + if _, exists := endTokens[currentByte]; exists { + return b.index, nil + } + + b.index++ + } + + return b.index, io.EOF +} + +// significantTokens is a map where the keys are the significant characters in a JSON path. +// The values in the map are all true, which allows us to use the map as a set for quick lookups. +var significantTokens = map[byte]bool{ + dot: true, // access properties of an object + dollarSign: true, // root object + atSign: true, // current object + bracketOpen: true, // start of an array index or filter expression + bracketClose: true, // end of an array index or filter expression +} + +// filterTokens stores the filter expression tokens. +var filterTokens = map[byte]bool{ + aesterisk: true, // wildcard + andSign: true, + orSign: true, +} + +// skipToNextSignificantToken advances the buffer index to the next significant character. +// Significant characters are defined based on the JSON path syntax. +func (b *buffer) skipToNextSignificantToken() { + for b.index < b.length { + current := b.data[b.index] + + if _, ok := significantTokens[current]; ok { + break + } + + b.index++ + } +} + +// backslash checks to see if the number of backslashes before the current index is odd. +// +// This is used to check if the current character is escaped. However, unlike the "unescape" function, +// "backslash" only serves to check the number of backslashes. +func (b *buffer) backslash() bool { + if b.index == 0 { + return false + } + + count := 0 + for i := b.index - 1; ; i-- { + if i >= b.length || b.data[i] != backSlash { + break + } + + count++ + + if i == 0 { + break + } + } + + return count%2 != 0 +} + +// numIndex holds a map of valid numeric characters +var numIndex = map[byte]bool{ + '0': true, + '1': true, + '2': true, + '3': true, + '4': true, + '5': true, + '6': true, + '7': true, + '8': true, + '9': true, + '.': true, + 'e': true, + 'E': true, +} + +// pathToken checks if the current token is a valid JSON path token. +func (b *buffer) pathToken() error { + var stack []byte + + inToken := false + inNumber := false + first := b.index + + for b.index < b.length { + c := b.data[b.index] + + switch { + case c == doubleQuote || c == singleQuote: + inToken = true + if err := b.step(); err != nil { + return errors.New("error stepping through buffer") + } + + if err := b.skip(c); err != nil { + return errors.New("unmatched quote in path") + } + + if b.index >= b.length { + return errors.New("unmatched quote in path") + } + + case c == bracketOpen || c == parenOpen: + inToken = true + stack = append(stack, c) + + case c == bracketClose || c == parenClose: + inToken = true + if len(stack) == 0 || (c == bracketClose && stack[len(stack)-1] != bracketOpen) || (c == parenClose && stack[len(stack)-1] != parenOpen) { + return errors.New("mismatched bracket or parenthesis") + } + + stack = stack[:len(stack)-1] + + case pathStateContainsValidPathToken(c): + inToken = true + + case c == plus || c == minus: + if inNumber || (b.index > 0 && numIndex[b.data[b.index-1]]) { + inToken = true + } else if !inToken && (b.index+1 < b.length && numIndex[b.data[b.index+1]]) { + inToken = true + inNumber = true + } else if !inToken { + return errors.New("unexpected operator at start of token") + } + + default: + if len(stack) != 0 || inToken { + inToken = true + } else { + goto end + } + } + + b.index++ + } + +end: + if len(stack) != 0 { + return errors.New("unclosed bracket or parenthesis at end of path") + } + + if first == b.index { + return errors.New("no token found") + } + + if inNumber && !numIndex[b.data[b.index-1]] { + inNumber = false + } + + return nil +} + +func pathStateContainsValidPathToken(c byte) bool { + if _, ok := significantTokens[c]; ok { + return true + } + + if _, ok := filterTokens[c]; ok { + return true + } + + if _, ok := numIndex[c]; ok { + return true + } + + if 'A' <= c && c <= 'Z' || 'a' <= c && c <= 'z' { + return true + } + + return false +} + +func (b *buffer) numeric(token bool) error { + if token { + b.last = GO + } + + for ; b.index < b.length; b.index++ { + b.class = b.getClasses(doubleQuote) + if b.class == __ { + return errors.New("invalid token found while parsing path") + } + + b.state = StateTransitionTable[b.last][b.class] + if b.state == __ { + if token { + break + } + + return errors.New("invalid token found while parsing path") + } + + if b.state < __ { + return nil + } + + if b.state < MI || b.state > E3 { + return nil + } + + b.last = b.state + } + + if b.last != ZE && b.last != IN && b.last != FR && b.last != E3 { + return errors.New("invalid token found while parsing path") + } + + return nil +} + +func (b *buffer) getClasses(c byte) Classes { + if b.data[b.index] >= 128 { + return C_ETC + } + + if c == singleQuote { + return QuoteAsciiClasses[b.data[b.index]] + } + + return AsciiClasses[b.data[b.index]] +} + +func (b *buffer) getState() States { + b.last = b.state + + b.class = b.getClasses(doubleQuote) + if b.class == __ { + return __ + } + + b.state = StateTransitionTable[b.last][b.class] + + return b.state +} + +// string parses a string token from the buffer. +func (b *buffer) string(search byte, token bool) error { + if token { + b.last = GO + } + + for ; b.index < b.length; b.index++ { + b.class = b.getClasses(search) + + if b.class == __ { + return errors.New("invalid token found while parsing path") + } + + b.state = StateTransitionTable[b.last][b.class] + if b.state == __ { + return errors.New("invalid token found while parsing path") + } + + if b.state < __ { + break + } + + b.last = b.state + } + + return nil +} + +func (b *buffer) word(bs []byte) error { + var c byte + + max := len(bs) + index := 0 + + for ; b.index < b.length; b.index++ { + c = b.data[b.index] + + if c != bs[index] { + return errors.New("invalid token found while parsing path") + } + + index++ + if index >= max { + break + } + } + + if index != max { + return errors.New("invalid token found while parsing path") + } + + return nil +} + +func numberKind2f64(value interface{}) (result float64, err error) { + switch typed := value.(type) { + case float64: + result = typed + case float32: + result = float64(typed) + case int: + result = float64(typed) + case int8: + result = float64(typed) + case int16: + result = float64(typed) + case int32: + result = float64(typed) + case int64: + result = float64(typed) + case uint: + result = float64(typed) + case uint8: + result = float64(typed) + case uint16: + result = float64(typed) + case uint32: + result = float64(typed) + case uint64: + result = float64(typed) + default: + err = ufmt.Errorf("invalid number type: %T", value) + } + + return +} diff --git a/portal-loop/extracted/p/demo/json:0/buffer_test.gno b/portal-loop/extracted/p/demo/json:0/buffer_test.gno new file mode 100644 index 00000000..b8dce390 --- /dev/null +++ b/portal-loop/extracted/p/demo/json:0/buffer_test.gno @@ -0,0 +1,622 @@ +package json + +import "testing" + +func TestBufferCurrent(t *testing.T) { + tests := []struct { + name string + buffer *buffer + expected byte + wantErr bool + }{ + { + name: "Valid current byte", + buffer: &buffer{ + data: []byte("test"), + length: 4, + index: 1, + }, + expected: 'e', + wantErr: false, + }, + { + name: "EOF", + buffer: &buffer{ + data: []byte("test"), + length: 4, + index: 4, + }, + expected: 0, + wantErr: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := tt.buffer.current() + if (err != nil) != tt.wantErr { + t.Errorf("buffer.current() error = %v, wantErr %v", err, tt.wantErr) + return + } + if got != tt.expected { + t.Errorf("buffer.current() = %v, want %v", got, tt.expected) + } + }) + } +} + +func TestBufferStep(t *testing.T) { + tests := []struct { + name string + buffer *buffer + wantErr bool + }{ + { + name: "Valid step", + buffer: &buffer{data: []byte("test"), length: 4, index: 0}, + wantErr: false, + }, + { + name: "EOF error", + buffer: &buffer{data: []byte("test"), length: 4, index: 3}, + wantErr: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.buffer.step() + if (err != nil) != tt.wantErr { + t.Errorf("buffer.step() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +func TestBufferNext(t *testing.T) { + tests := []struct { + name string + buffer *buffer + want byte + wantErr bool + }{ + { + name: "Valid next byte", + buffer: &buffer{data: []byte("test"), length: 4, index: 0}, + want: 'e', + wantErr: false, + }, + { + name: "EOF error", + buffer: &buffer{data: []byte("test"), length: 4, index: 3}, + want: 0, + wantErr: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := tt.buffer.next() + if (err != nil) != tt.wantErr { + t.Errorf("buffer.next() error = %v, wantErr %v", err, tt.wantErr) + return + } + if got != tt.want { + t.Errorf("buffer.next() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestBufferSlice(t *testing.T) { + tests := []struct { + name string + buffer *buffer + pos int + want []byte + wantErr bool + }{ + { + name: "Valid slice -- 0 characters", + buffer: &buffer{data: []byte("test"), length: 4, index: 0}, + pos: 0, + want: nil, + wantErr: false, + }, + { + name: "Valid slice -- 1 character", + buffer: &buffer{data: []byte("test"), length: 4, index: 0}, + pos: 1, + want: []byte("t"), + wantErr: false, + }, + { + name: "Valid slice -- 2 characters", + buffer: &buffer{data: []byte("test"), length: 4, index: 1}, + pos: 2, + want: []byte("es"), + wantErr: false, + }, + { + name: "Valid slice -- 3 characters", + buffer: &buffer{data: []byte("test"), length: 4, index: 0}, + pos: 3, + want: []byte("tes"), + wantErr: false, + }, + { + name: "Valid slice -- 4 characters", + buffer: &buffer{data: []byte("test"), length: 4, index: 0}, + pos: 4, + want: []byte("test"), + wantErr: false, + }, + { + name: "EOF error", + buffer: &buffer{data: []byte("test"), length: 4, index: 3}, + pos: 2, + want: nil, + wantErr: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := tt.buffer.slice(tt.pos) + if (err != nil) != tt.wantErr { + t.Errorf("buffer.slice() error = %v, wantErr %v", err, tt.wantErr) + return + } + if string(got) != string(tt.want) { + t.Errorf("buffer.slice() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestBufferMove(t *testing.T) { + tests := []struct { + name string + buffer *buffer + pos int + wantErr bool + wantIdx int + }{ + { + name: "Valid move", + buffer: &buffer{data: []byte("test"), length: 4, index: 1}, + pos: 2, + wantErr: false, + wantIdx: 3, + }, + { + name: "Move beyond length", + buffer: &buffer{data: []byte("test"), length: 4, index: 1}, + pos: 4, + wantErr: true, + wantIdx: 1, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.buffer.move(tt.pos) + if (err != nil) != tt.wantErr { + t.Errorf("buffer.move() error = %v, wantErr %v", err, tt.wantErr) + } + if tt.buffer.index != tt.wantIdx { + t.Errorf("buffer.move() index = %v, want %v", tt.buffer.index, tt.wantIdx) + } + }) + } +} + +func TestBufferSkip(t *testing.T) { + tests := []struct { + name string + buffer *buffer + b byte + wantErr bool + }{ + { + name: "Skip byte", + buffer: &buffer{data: []byte("test"), length: 4, index: 0}, + b: 'e', + wantErr: false, + }, + { + name: "Skip to EOF", + buffer: &buffer{data: []byte("test"), length: 4, index: 0}, + b: 'x', + wantErr: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.buffer.skip(tt.b) + if (err != nil) != tt.wantErr { + t.Errorf("buffer.skip() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +func TestBufferSkipAny(t *testing.T) { + tests := []struct { + name string + buffer *buffer + s map[byte]bool + wantErr bool + }{ + { + name: "Skip any valid byte", + buffer: &buffer{data: []byte("test"), length: 4, index: 0}, + s: map[byte]bool{'e': true, 'o': true}, + wantErr: false, + }, + { + name: "Skip any to EOF", + buffer: &buffer{data: []byte("test"), length: 4, index: 0}, + s: map[byte]bool{'x': true, 'y': true}, + wantErr: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := tt.buffer.skipAny(tt.s) + if (err != nil) != tt.wantErr { + t.Errorf("buffer.skipAny() error = %v, wantErr %v", err, tt.wantErr) + } + }) + } +} + +func TestSkipToNextSignificantToken(t *testing.T) { + tests := []struct { + name string + input []byte + expected int + }{ + {"No significant chars", []byte("abc"), 3}, + {"One significant char at start", []byte(".abc"), 0}, + {"Significant char in middle", []byte("ab.c"), 2}, + {"Multiple significant chars", []byte("a$.c"), 1}, + {"Significant char at end", []byte("abc$"), 3}, + {"Only significant chars", []byte("$."), 0}, + {"Empty string", []byte(""), 0}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + b := newBuffer(tt.input) + b.skipToNextSignificantToken() + if b.index != tt.expected { + t.Errorf("after skipToNextSignificantToken(), got index = %v, want %v", b.index, tt.expected) + } + }) + } +} + +func mockBuffer(s string) *buffer { + return newBuffer([]byte(s)) +} + +func TestSkipAndReturnIndex(t *testing.T) { + tests := []struct { + name string + input string + expected int + }{ + {"StartOfString", "", 0}, + {"MiddleOfString", "abcdef", 1}, + {"EndOfString", "abc", 1}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + buf := mockBuffer(tt.input) + got, err := buf.skipAndReturnIndex() + if err != nil && tt.input != "" { // Expect no error unless input is empty + t.Errorf("skipAndReturnIndex() error = %v", err) + } + if got != tt.expected { + t.Errorf("skipAndReturnIndex() = %v, want %v", got, tt.expected) + } + }) + } +} + +func TestSkipUntil(t *testing.T) { + tests := []struct { + name string + input string + tokens map[byte]bool + expected int + }{ + {"SkipToToken", "abcdefg", map[byte]bool{'c': true}, 2}, + {"SkipToEnd", "abcdefg", map[byte]bool{'h': true}, 7}, + {"SkipNone", "abcdefg", map[byte]bool{'a': true}, 0}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + buf := mockBuffer(tt.input) + got, err := buf.skipUntil(tt.tokens) + if err != nil && got != len(tt.input) { // Expect error only if reached end without finding token + t.Errorf("skipUntil() error = %v", err) + } + if got != tt.expected { + t.Errorf("skipUntil() = %v, want %v", got, tt.expected) + } + }) + } +} + +func TestSliceFromIndices(t *testing.T) { + tests := []struct { + name string + input string + start int + end int + expected string + }{ + {"FullString", "abcdefg", 0, 7, "abcdefg"}, + {"Substring", "abcdefg", 2, 5, "cde"}, + {"OutOfBounds", "abcdefg", 5, 10, "fg"}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + buf := mockBuffer(tt.input) + got := buf.sliceFromIndices(tt.start, tt.end) + if string(got) != tt.expected { + t.Errorf("sliceFromIndices() = %v, want %v", string(got), tt.expected) + } + }) + } +} + +func TestBufferToken(t *testing.T) { + tests := []struct { + name string + path string + index int + isErr bool + }{ + { + name: "Simple valid path", + path: "@.length", + index: 8, + isErr: false, + }, + { + name: "Path with array expr", + path: "@['foo'].0.bar", + index: 14, + isErr: false, + }, + { + name: "Path with array expr and simple fomula", + path: "@['foo'].[(@.length - 1)].*", + index: 27, + isErr: false, + }, + { + name: "Path with filter expr", + path: "@['foo'].[?(@.bar == 1 & @.baz < @.length)].*", + index: 45, + isErr: false, + }, + { + name: "addition of foo and bar", + path: "@.foo+@.bar", + index: 11, + isErr: false, + }, + { + name: "logical AND of foo and bar", + path: "@.foo && @.bar", + index: 14, + isErr: false, + }, + { + name: "logical OR of foo and bar", + path: "@.foo || @.bar", + index: 14, + isErr: false, + }, + { + name: "accessing third element of foo", + path: "@.foo,3", + index: 7, + isErr: false, + }, + { + name: "accessing last element of array", + path: "@.length-1", + index: 10, + isErr: false, + }, + { + name: "number 1", + path: "1", + index: 1, + isErr: false, + }, + { + name: "float", + path: "3.1e4", + index: 5, + isErr: false, + }, + { + name: "float with minus", + path: "3.1e-4", + index: 6, + isErr: false, + }, + { + name: "float with plus", + path: "3.1e+4", + index: 6, + isErr: false, + }, + { + name: "negative number", + path: "-12345", + index: 6, + isErr: false, + }, + { + name: "negative float", + path: "-3.1e4", + index: 6, + isErr: false, + }, + { + name: "negative float with minus", + path: "-3.1e-4", + index: 7, + isErr: false, + }, + { + name: "negative float with plus", + path: "-3.1e+4", + index: 7, + isErr: false, + }, + { + name: "string number", + path: "'12345'", + index: 7, + isErr: false, + }, + { + name: "string with backslash", + path: "'foo \\'bar '", + index: 12, + isErr: false, + }, + { + name: "string with inner double quotes", + path: "'foo \"bar \"'", + index: 12, + isErr: false, + }, + { + name: "parenthesis 1", + path: "(@abc)", + index: 6, + isErr: false, + }, + { + name: "parenthesis 2", + path: "[()]", + index: 4, + isErr: false, + }, + { + name: "parenthesis mismatch", + path: "[(])", + index: 2, + isErr: true, + }, + { + name: "parenthesis mismatch 2", + path: "(", + index: 1, + isErr: true, + }, + { + name: "parenthesis mismatch 3", + path: "())]", + index: 2, + isErr: true, + }, + { + name: "bracket mismatch", + path: "[()", + index: 3, + isErr: true, + }, + { + name: "bracket mismatch 2", + path: "()]", + index: 2, + isErr: true, + }, + { + name: "path does not close bracket", + path: "@.foo[)", + index: 6, + isErr: false, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + buf := newBuffer([]byte(tt.path)) + + err := buf.pathToken() + if tt.isErr { + if err == nil { + t.Errorf("Expected an error for path `%s`, but got none", tt.path) + } + } + + if err == nil && tt.isErr { + t.Errorf("Expected an error for path `%s`, but got none", tt.path) + } + + if buf.index != tt.index { + t.Errorf("Expected final index %d, got %d (token: `%s`) for path `%s`", tt.index, buf.index, string(buf.data[buf.index]), tt.path) + } + }) + } +} + +func TestBufferFirst(t *testing.T) { + tests := []struct { + name string + data []byte + expected byte + }{ + { + name: "Valid first byte", + data: []byte("test"), + expected: 't', + }, + { + name: "Empty buffer", + data: []byte(""), + expected: 0, + }, + { + name: "Whitespace buffer", + data: []byte(" "), + expected: 0, + }, + { + name: "whitespace in middle", + data: []byte("hello world"), + expected: 'h', + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + b := newBuffer(tt.data) + + got, err := b.first() + if err != nil && tt.expected != 0 { + t.Errorf("Unexpected error: %v", err) + } + + if got != tt.expected { + t.Errorf("Expected first byte to be %q, got %q", tt.expected, got) + } + }) + } +} diff --git a/portal-loop/extracted/p/demo/json:0/decode.gno b/portal-loop/extracted/p/demo/json:0/decode.gno new file mode 100644 index 00000000..8a6e2b99 --- /dev/null +++ b/portal-loop/extracted/p/demo/json:0/decode.gno @@ -0,0 +1,370 @@ +// ref: https://github.com/spyzhov/ajson/blob/master/decode.go + +package json + +import ( + "errors" + "io" + + "gno.land/p/demo/ufmt" +) + +// This limits the max nesting depth to prevent stack overflow. +// This is permitted by https://tools.ietf.org/html/rfc7159#section-9 +const maxNestingDepth = 10000 + +// Unmarshal parses the JSON-encoded data and returns a Node. +// The data must be a valid JSON-encoded value. +// +// Usage: +// +// node, err := json.Unmarshal([]byte(`{"key": "value"}`)) +// if err != nil { +// ufmt.Println(err) +// } +// println(node) // {"key": "value"} +func Unmarshal(data []byte) (*Node, error) { + buf := newBuffer(data) + + var ( + state States + key *string + current *Node + nesting int + useKey = func() **string { + tmp := cptrs(key) + key = nil + return &tmp + } + err error + ) + + if _, err = buf.first(); err != nil { + return nil, io.EOF + } + + for { + state = buf.getState() + if state == __ { + return nil, unexpectedTokenError(buf.data, buf.index) + } + + // region state machine + if state >= GO { + switch buf.state { + case ST: // string + if current != nil && current.IsObject() && key == nil { + // key detected + if key, err = getString(buf); err != nil { + return nil, err + } + + buf.state = CO + } else { + current, nesting, err = createNestedNode(current, buf, String, nesting, useKey()) + if err != nil { + return nil, err + } + + err = buf.string(doubleQuote, false) + if err != nil { + return nil, err + } + + current, nesting = updateNode(current, buf, nesting, true) + buf.state = OK + } + + case MI, ZE, IN: // number + current, err = processNumericNode(current, buf, useKey()) + if err != nil { + return nil, err + } + + case T1, F1: // boolean + literal := falseLiteral + if buf.state == T1 { + literal = trueLiteral + } + + current, nesting, err = processLiteralNode(current, buf, Boolean, literal, useKey(), nesting) + if err != nil { + return nil, err + } + + case N1: // null + current, nesting, err = processLiteralNode(current, buf, Null, nullLiteral, useKey(), nesting) + if err != nil { + return nil, err + } + } + } else { + // region action + switch state { + case ec, cc: // } + if key != nil { + return nil, unexpectedTokenError(buf.data, buf.index) + } + + current, nesting, err = updateNodeAndSetBufferState(current, buf, nesting, Object) + if err != nil { + return nil, err + } + + case bc: // ] + current, nesting, err = updateNodeAndSetBufferState(current, buf, nesting, Array) + if err != nil { + return nil, err + } + + case co, bo: // { [ + valTyp, bState := Object, OB + if state == bo { + valTyp, bState = Array, AR + } + + current, nesting, err = createNestedNode(current, buf, valTyp, nesting, useKey()) + if err != nil { + return nil, err + } + + buf.state = bState + + case cm: // , + if current == nil { + return nil, unexpectedTokenError(buf.data, buf.index) + } + + if !current.isContainer() { + return nil, unexpectedTokenError(buf.data, buf.index) + } + + if current.IsObject() { + buf.state = KE // key expected + } else { + buf.state = VA // value expected + } + + case cl: // : + if current == nil || !current.IsObject() || key == nil { + return nil, unexpectedTokenError(buf.data, buf.index) + } + + buf.state = VA + + default: + return nil, unexpectedTokenError(buf.data, buf.index) + } + } + + if buf.step() != nil { + break + } + + if _, err = buf.first(); err != nil { + err = nil + break + } + } + + if current == nil || buf.state != OK { + return nil, io.EOF + } + + root := current.root() + if !root.ready() { + return nil, io.EOF + } + + return root, err +} + +// UnmarshalSafe parses the JSON-encoded data and returns a Node. +func UnmarshalSafe(data []byte) (*Node, error) { + var safe []byte + safe = append(safe, data...) + return Unmarshal(safe) +} + +// processNumericNode creates a new node, processes a numeric value, +// sets the node's borders, and moves to the previous node. +func processNumericNode(current *Node, buf *buffer, key **string) (*Node, error) { + var err error + current, err = createNode(current, buf, Number, key) + if err != nil { + return nil, err + } + + if err = buf.numeric(false); err != nil { + return nil, err + } + + current.borders[1] = buf.index + if current.prev != nil { + current = current.prev + } + + buf.index -= 1 + buf.state = OK + + return current, nil +} + +// processLiteralNode creates a new node, processes a literal value, +// sets the node's borders, and moves to the previous node. +func processLiteralNode( + current *Node, + buf *buffer, + literalType ValueType, + literalValue []byte, + useKey **string, + nesting int, +) (*Node, int, error) { + var err error + current, nesting, err = createLiteralNode(current, buf, literalType, literalValue, useKey, nesting) + if err != nil { + return nil, nesting, err + } + return current, nesting, nil +} + +// isValidContainerType checks if the current node is a valid container (object or array). +// The container must satisfy the following conditions: +// 1. The current node must not be nil. +// 2. The current node must be an object or array. +// 3. The current node must not be ready. +func isValidContainerType(current *Node, nodeType ValueType) bool { + switch nodeType { + case Object: + return current != nil && current.IsObject() && !current.ready() + case Array: + return current != nil && current.IsArray() && !current.ready() + default: + return false + } +} + +// getString extracts a string from the buffer and advances the buffer index past the string. +func getString(b *buffer) (*string, error) { + start := b.index + if err := b.string(doubleQuote, false); err != nil { + return nil, err + } + + value, ok := Unquote(b.data[start:b.index+1], doubleQuote) + if !ok { + return nil, unexpectedTokenError(b.data, start) + } + + return &value, nil +} + +// createNode creates a new node and sets the key if it is not nil. +func createNode( + current *Node, + buf *buffer, + nodeType ValueType, + key **string, +) (*Node, error) { + var err error + current, err = NewNode(current, buf, nodeType, key) + if err != nil { + return nil, err + } + + return current, nil +} + +// createNestedNode creates a new nested node (array or object) and sets the key if it is not nil. +func createNestedNode( + current *Node, + buf *buffer, + nodeType ValueType, + nesting int, + key **string, +) (*Node, int, error) { + var err error + if nesting, err = checkNestingDepth(nesting); err != nil { + return nil, nesting, err + } + + if current, err = createNode(current, buf, nodeType, key); err != nil { + return nil, nesting, err + } + + return current, nesting, nil +} + +// createLiteralNode creates a new literal node and sets the key if it is not nil. +// The literal is a byte slice that represents a boolean or null value. +func createLiteralNode( + current *Node, + buf *buffer, + literalType ValueType, + literal []byte, + useKey **string, + nesting int, +) (*Node, int, error) { + var err error + if current, err = createNode(current, buf, literalType, useKey); err != nil { + return nil, 0, err + } + + if err = buf.word(literal); err != nil { + return nil, 0, err + } + + current, nesting = updateNode(current, buf, nesting, false) + buf.state = OK + + return current, nesting, nil +} + +// updateNode updates the current node and returns the previous node. +func updateNode( + current *Node, buf *buffer, nesting int, decreaseLevel bool, +) (*Node, int) { + current.borders[1] = buf.index + 1 + + prev := current.prev + if prev == nil { + return current, nesting + } + + current = prev + if decreaseLevel { + nesting-- + } + + return current, nesting +} + +// updateNodeAndSetBufferState updates the current node and sets the buffer state to OK. +func updateNodeAndSetBufferState( + current *Node, + buf *buffer, + nesting int, + typ ValueType, +) (*Node, int, error) { + if !isValidContainerType(current, typ) { + return nil, nesting, unexpectedTokenError(buf.data, buf.index) + } + + current, nesting = updateNode(current, buf, nesting, true) + buf.state = OK + + return current, nesting, nil +} + +// checkNestingDepth checks if the nesting depth is within the maximum allowed depth. +func checkNestingDepth(nesting int) (int, error) { + if nesting >= maxNestingDepth { + return nesting, errors.New("maximum nesting depth exceeded") + } + + return nesting + 1, nil +} + +func unexpectedTokenError(data []byte, index int) error { + return ufmt.Errorf("unexpected token at index %d. data %b", index, data) +} diff --git a/portal-loop/extracted/p/demo/json:0/decode_test.gno b/portal-loop/extracted/p/demo/json:0/decode_test.gno new file mode 100644 index 00000000..8aad0716 --- /dev/null +++ b/portal-loop/extracted/p/demo/json:0/decode_test.gno @@ -0,0 +1,554 @@ +package json + +import ( + "bytes" + "testing" +) + +type testNode struct { + name string + input []byte + _type ValueType + value []byte +} + +func simpleValid(test *testNode, t *testing.T) { + root, err := Unmarshal(test.input) + if err != nil { + t.Errorf("Error on Unmarshal(%s): %s", test.input, err.Error()) + } else if root == nil { + t.Errorf("Error on Unmarshal(%s): root is nil", test.name) + } else if root.nodeType != test._type { + t.Errorf("Error on Unmarshal(%s): wrong type", test.name) + } else if !bytes.Equal(root.source(), test.value) { + t.Errorf("Error on Unmarshal(%s): %s != %s", test.name, root.source(), test.value) + } +} + +func simpleInvalid(test *testNode, t *testing.T) { + root, err := Unmarshal(test.input) + if err == nil { + t.Errorf("Error on Unmarshal(%s): error expected, got '%s'", test.name, root.source()) + } else if root != nil { + t.Errorf("Error on Unmarshal(%s): root is not nil", test.name) + } +} + +func simpleCorrupted(name string) *testNode { + return &testNode{name: name, input: []byte(name)} +} + +func TestUnmarshal_StringSimpleSuccess(t *testing.T) { + tests := []*testNode{ + {name: "blank", input: []byte("\"\""), _type: String, value: []byte("\"\"")}, + {name: "char", input: []byte("\"c\""), _type: String, value: []byte("\"c\"")}, + {name: "word", input: []byte("\"cat\""), _type: String, value: []byte("\"cat\"")}, + {name: "spaces", input: []byte(" \"good cat or dog\"\r\n "), _type: String, value: []byte("\"good cat or dog\"")}, + {name: "backslash", input: []byte("\"good \\\"cat\\\"\""), _type: String, value: []byte("\"good \\\"cat\\\"\"")}, + {name: "backslash 2", input: []byte("\"good \\\\\\\"cat\\\"\""), _type: String, value: []byte("\"good \\\\\\\"cat\\\"\"")}, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + simpleValid(test, t) + }) + } +} + +func TestUnmarshal_NumericSimpleSuccess(t *testing.T) { + tests := []*testNode{ + {name: "1", input: []byte("1"), _type: Number, value: []byte("1")}, + {name: "-1", input: []byte("-1"), _type: Number, value: []byte("-1")}, + + {name: "1234567890", input: []byte("1234567890"), _type: Number, value: []byte("1234567890")}, + {name: "-123", input: []byte("-123"), _type: Number, value: []byte("-123")}, + + {name: "123.456", input: []byte("123.456"), _type: Number, value: []byte("123.456")}, + {name: "-123.456", input: []byte("-123.456"), _type: Number, value: []byte("-123.456")}, + + {name: "1e3", input: []byte("1e3"), _type: Number, value: []byte("1e3")}, + {name: "1e+3", input: []byte("1e+3"), _type: Number, value: []byte("1e+3")}, + {name: "1e-3", input: []byte("1e-3"), _type: Number, value: []byte("1e-3")}, + {name: "-1e3", input: []byte("-1e3"), _type: Number, value: []byte("-1e3")}, + {name: "-1e-3", input: []byte("-1e-3"), _type: Number, value: []byte("-1e-3")}, + + {name: "1.123e3456", input: []byte("1.123e3456"), _type: Number, value: []byte("1.123e3456")}, + {name: "1.123e-3456", input: []byte("1.123e-3456"), _type: Number, value: []byte("1.123e-3456")}, + {name: "-1.123e3456", input: []byte("-1.123e3456"), _type: Number, value: []byte("-1.123e3456")}, + {name: "-1.123e-3456", input: []byte("-1.123e-3456"), _type: Number, value: []byte("-1.123e-3456")}, + + {name: "1E3", input: []byte("1E3"), _type: Number, value: []byte("1E3")}, + {name: "1E-3", input: []byte("1E-3"), _type: Number, value: []byte("1E-3")}, + {name: "-1E3", input: []byte("-1E3"), _type: Number, value: []byte("-1E3")}, + {name: "-1E-3", input: []byte("-1E-3"), _type: Number, value: []byte("-1E-3")}, + + {name: "1.123E3456", input: []byte("1.123E3456"), _type: Number, value: []byte("1.123E3456")}, + {name: "1.123E-3456", input: []byte("1.123E-3456"), _type: Number, value: []byte("1.123E-3456")}, + {name: "-1.123E3456", input: []byte("-1.123E3456"), _type: Number, value: []byte("-1.123E3456")}, + {name: "-1.123E-3456", input: []byte("-1.123E-3456"), _type: Number, value: []byte("-1.123E-3456")}, + + {name: "-1.123E-3456 with spaces", input: []byte(" \r -1.123E-3456 \t\n"), _type: Number, value: []byte("-1.123E-3456")}, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + root, err := Unmarshal(test.input) + if err != nil { + t.Errorf("Error on Unmarshal(%s): %s", test.name, err.Error()) + } else if root == nil { + t.Errorf("Error on Unmarshal(%s): root is nil", test.name) + } else if root.nodeType != test._type { + t.Errorf("Error on Unmarshal(%s): wrong type", test.name) + } else if !bytes.Equal(root.source(), test.value) { + t.Errorf("Error on Unmarshal(%s): %s != %s", test.name, root.source(), test.value) + } + }) + } +} + +func TestUnmarshal_StringSimpleCorrupted(t *testing.T) { + tests := []*testNode{ + {name: "white NL", input: []byte("\"foo\nbar\"")}, + {name: "white R", input: []byte("\"foo\rbar\"")}, + {name: "white Tab", input: []byte("\"foo\tbar\"")}, + {name: "wrong quotes", input: []byte("'cat'")}, + {name: "double string", input: []byte("\"Hello\" \"World\"")}, + {name: "quotes in quotes", input: []byte("\"good \"cat\"\"")}, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + simpleInvalid(test, t) + }) + } +} + +func TestUnmarshal_ObjectSimpleSuccess(t *testing.T) { + tests := []*testNode{ + {name: "{}", input: []byte("{}"), _type: Object, value: []byte("{}")}, + {name: `{ \r\n }`, input: []byte("{ \r\n }"), _type: Object, value: []byte("{ \r\n }")}, + {name: `{"key":1}`, input: []byte(`{"key":1}`), _type: Object, value: []byte(`{"key":1}`)}, + {name: `{"key":true}`, input: []byte(`{"key":true}`), _type: Object, value: []byte(`{"key":true}`)}, + {name: `{"key":"value"}`, input: []byte(`{"key":"value"}`), _type: Object, value: []byte(`{"key":"value"}`)}, + {name: `{"foo":"bar","baz":"foo"}`, input: []byte(`{"foo":"bar", "baz":"foo"}`), _type: Object, value: []byte(`{"foo":"bar", "baz":"foo"}`)}, + {name: "spaces", input: []byte(` { "foo" : "bar" , "baz" : "foo" } `), _type: Object, value: []byte(`{ "foo" : "bar" , "baz" : "foo" }`)}, + {name: "nested", input: []byte(`{"foo":{"bar":{"baz":{}}}}`), _type: Object, value: []byte(`{"foo":{"bar":{"baz":{}}}}`)}, + {name: "array", input: []byte(`{"array":[{},{},{"foo":[{"bar":["baz"]}]}]}`), _type: Object, value: []byte(`{"array":[{},{},{"foo":[{"bar":["baz"]}]}]}`)}, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + simpleValid(test, t) + }) + } +} + +func TestUnmarshal_ObjectSimpleCorrupted(t *testing.T) { + tests := []*testNode{ + simpleCorrupted("{{{\"key\": \"foo\"{{{{"), + simpleCorrupted("}"), + simpleCorrupted("{ }}}}}}}"), + simpleCorrupted(" }"), + simpleCorrupted("{,}"), + simpleCorrupted("{:}"), + simpleCorrupted("{100000}"), + simpleCorrupted("{1:1}"), + simpleCorrupted("{'1:2,3:4'}"), + simpleCorrupted(`{"d"}`), + simpleCorrupted(`{"foo"}`), + simpleCorrupted(`{"foo":}`), + simpleCorrupted(`{:"foo"}`), + simpleCorrupted(`{"foo":bar}`), + simpleCorrupted(`{"foo":"bar",}`), + simpleCorrupted(`{}{}`), + simpleCorrupted(`{},{}`), + simpleCorrupted(`{[},{]}`), + simpleCorrupted(`{[,]}`), + simpleCorrupted(`{[]}`), + simpleCorrupted(`{}1`), + simpleCorrupted(`1{}`), + simpleCorrupted(`{"x"::1}`), + simpleCorrupted(`{null:null}`), + simpleCorrupted(`{"foo:"bar"}`), + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + simpleInvalid(test, t) + }) + } +} + +func TestUnmarshal_NullSimpleCorrupted(t *testing.T) { + tests := []*testNode{ + {name: "nul", input: []byte("nul")}, + {name: "nil", input: []byte("nil")}, + {name: "nill", input: []byte("nill")}, + {name: "NILL", input: []byte("NILL")}, + {name: "Null", input: []byte("Null")}, + {name: "NULL", input: []byte("NULL")}, + {name: "spaces", input: []byte("Nu ll")}, + {name: "null1", input: []byte("null1")}, + {name: "double", input: []byte("null null")}, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + simpleInvalid(test, t) + }) + } +} + +func TestUnmarshal_BoolSimpleSuccess(t *testing.T) { + tests := []*testNode{ + {name: "lower true", input: []byte("true"), _type: Boolean, value: []byte("true")}, + {name: "lower false", input: []byte("false"), _type: Boolean, value: []byte("false")}, + {name: "spaces true", input: []byte(" true\r\n "), _type: Boolean, value: []byte("true")}, + {name: "spaces false", input: []byte(" false\r\n "), _type: Boolean, value: []byte("false")}, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + simpleValid(test, t) + }) + } +} + +func TestUnmarshal_BoolSimpleCorrupted(t *testing.T) { + tests := []*testNode{ + simpleCorrupted("tru"), + simpleCorrupted("fals"), + simpleCorrupted("tre"), + simpleCorrupted("fal se"), + simpleCorrupted("true false"), + simpleCorrupted("True"), + simpleCorrupted("TRUE"), + simpleCorrupted("False"), + simpleCorrupted("FALSE"), + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + simpleInvalid(test, t) + }) + } +} + +func TestUnmarshal_ArraySimpleSuccess(t *testing.T) { + tests := []*testNode{ + {name: "[]", input: []byte("[]"), _type: Array, value: []byte("[]")}, + {name: "[1]", input: []byte("[1]"), _type: Array, value: []byte("[1]")}, + {name: "[1,2,3]", input: []byte("[1,2,3]"), _type: Array, value: []byte("[1,2,3]")}, + {name: "[1, 2, 3]", input: []byte("[1, 2, 3]"), _type: Array, value: []byte("[1, 2, 3]")}, + {name: "[1,[2],3]", input: []byte("[1,[2],3]"), _type: Array, value: []byte("[1,[2],3]")}, + {name: "[[],[],[]]", input: []byte("[[],[],[]]"), _type: Array, value: []byte("[[],[],[]]")}, + {name: "[[[[[]]]]]", input: []byte("[[[[[]]]]]"), _type: Array, value: []byte("[[[[[]]]]]")}, + {name: "[true,null,1,\"foo\",[]]", input: []byte("[true,null,1,\"foo\",[]]"), _type: Array, value: []byte("[true,null,1,\"foo\",[]]")}, + {name: "spaces", input: []byte("\n\r [\n1\n ]\r\n"), _type: Array, value: []byte("[\n1\n ]")}, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + simpleValid(test, t) + }) + } +} + +func TestUnmarshal_ArraySimpleCorrupted(t *testing.T) { + tests := []*testNode{ + simpleCorrupted("[,]"), + simpleCorrupted("[]\\"), + simpleCorrupted("[1,]"), + simpleCorrupted("[[]"), + simpleCorrupted("[]]"), + simpleCorrupted("1[]"), + simpleCorrupted("[]1"), + simpleCorrupted("[[]1]"), + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + simpleInvalid(test, t) + }) + } +} + +// Examples from https://json.org/example.html +func TestUnmarshal(t *testing.T) { + tests := []struct { + name string + value string + }{ + { + name: "glossary", + value: `{ + "glossary": { + "title": "example glossary", + "GlossDiv": { + "title": "S", + "GlossList": { + "GlossEntry": { + "ID": "SGML", + "SortAs": "SGML", + "GlossTerm": "Standard Generalized Markup Language", + "Acronym": "SGML", + "Abbrev": "ISO 8879:1986", + "GlossDef": { + "para": "A meta-markup language, used to create markup languages such as DocBook.", + "GlossSeeAlso": ["GML", "XML"] + }, + "GlossSee": "markup" + } + } + } + } + }`, + }, + { + name: "menu", + value: `{"menu": { + "id": "file", + "value": "File", + "popup": { + "menuitem": [ + {"value": "New", "onclick": "CreateNewDoc()"}, + {"value": "Open", "onclick": "OpenDoc()"}, + {"value": "Close", "onclick": "CloseDoc()"} + ] + } + }}`, + }, + { + name: "widget", + value: `{"widget": { + "debug": "on", + "window": { + "title": "Sample Konfabulator Widget", + "name": "main_window", + "width": 500, + "height": 500 + }, + "image": { + "src": "Images/Sun.png", + "name": "sun1", + "hOffset": 250, + "vOffset": 250, + "alignment": "center" + }, + "text": { + "data": "Click Here", + "size": 36, + "style": "bold", + "name": "text1", + "hOffset": 250, + "vOffset": 100, + "alignment": "center", + "onMouseUp": "sun1.opacity = (sun1.opacity / 100) * 90;" + } + }} `, + }, + { + name: "web-app", + value: `{"web-app": { + "servlet": [ + { + "servlet-name": "cofaxCDS", + "servlet-class": "org.cofax.cds.CDSServlet", + "init-param": { + "configGlossary:installationAt": "Philadelphia, PA", + "configGlossary:adminEmail": "ksm@pobox.com", + "configGlossary:poweredBy": "Cofax", + "configGlossary:poweredByIcon": "/images/cofax.gif", + "configGlossary:staticPath": "/content/static", + "templateProcessorClass": "org.cofax.WysiwygTemplate", + "templateLoaderClass": "org.cofax.FilesTemplateLoader", + "templatePath": "templates", + "templateOverridePath": "", + "defaultListTemplate": "listTemplate.htm", + "defaultFileTemplate": "articleTemplate.htm", + "useJSP": false, + "jspListTemplate": "listTemplate.jsp", + "jspFileTemplate": "articleTemplate.jsp", + "cachePackageTagsTrack": 200, + "cachePackageTagsStore": 200, + "cachePackageTagsRefresh": 60, + "cacheTemplatesTrack": 100, + "cacheTemplatesStore": 50, + "cacheTemplatesRefresh": 15, + "cachePagesTrack": 200, + "cachePagesStore": 100, + "cachePagesRefresh": 10, + "cachePagesDirtyRead": 10, + "searchEngineListTemplate": "forSearchEnginesList.htm", + "searchEngineFileTemplate": "forSearchEngines.htm", + "searchEngineRobotsDb": "WEB-INF/robots.db", + "useDataStore": true, + "dataStoreClass": "org.cofax.SqlDataStore", + "redirectionClass": "org.cofax.SqlRedirection", + "dataStoreName": "cofax", + "dataStoreDriver": "com.microsoft.jdbc.sqlserver.SQLServerDriver", + "dataStoreUrl": "jdbc:microsoft:sqlserver://LOCALHOST:1433;DatabaseName=goon", + "dataStoreUser": "sa", + "dataStorePassword": "dataStoreTestQuery", + "dataStoreTestQuery": "SET NOCOUNT ON;select test='test';", + "dataStoreLogFile": "/usr/local/tomcat/logs/datastore.log", + "dataStoreInitConns": 10, + "dataStoreMaxConns": 100, + "dataStoreConnUsageLimit": 100, + "dataStoreLogLevel": "debug", + "maxUrlLength": 500}}, + { + "servlet-name": "cofaxEmail", + "servlet-class": "org.cofax.cds.EmailServlet", + "init-param": { + "mailHost": "mail1", + "mailHostOverride": "mail2"}}, + { + "servlet-name": "cofaxAdmin", + "servlet-class": "org.cofax.cds.AdminServlet"}, + + { + "servlet-name": "fileServlet", + "servlet-class": "org.cofax.cds.FileServlet"}, + { + "servlet-name": "cofaxTools", + "servlet-class": "org.cofax.cms.CofaxToolsServlet", + "init-param": { + "templatePath": "toolstemplates/", + "log": 1, + "logLocation": "/usr/local/tomcat/logs/CofaxTools.log", + "logMaxSize": "", + "dataLog": 1, + "dataLogLocation": "/usr/local/tomcat/logs/dataLog.log", + "dataLogMaxSize": "", + "removePageCache": "/content/admin/remove?cache=pages&id=", + "removeTemplateCache": "/content/admin/remove?cache=templates&id=", + "fileTransferFolder": "/usr/local/tomcat/webapps/content/fileTransferFolder", + "lookInContext": 1, + "adminGroupID": 4, + "betaServer": true}}], + "servlet-mapping": { + "cofaxCDS": "/", + "cofaxEmail": "/cofaxutil/aemail/*", + "cofaxAdmin": "/admin/*", + "fileServlet": "/static/*", + "cofaxTools": "/tools/*"}, + + "taglib": { + "taglib-uri": "cofax.tld", + "taglib-location": "/WEB-INF/tlds/cofax.tld"}}}`, + }, + { + name: "SVG Viewer", + value: `{"menu": { + "header": "SVG Viewer", + "items": [ + {"id": "Open"}, + {"id": "OpenNew", "label": "Open New"}, + null, + {"id": "ZoomIn", "label": "Zoom In"}, + {"id": "ZoomOut", "label": "Zoom Out"}, + {"id": "OriginalView", "label": "Original View"}, + null, + {"id": "Quality"}, + {"id": "Pause"}, + {"id": "Mute"}, + null, + {"id": "Find", "label": "Find..."}, + {"id": "FindAgain", "label": "Find Again"}, + {"id": "Copy"}, + {"id": "CopyAgain", "label": "Copy Again"}, + {"id": "CopySVG", "label": "Copy SVG"}, + {"id": "ViewSVG", "label": "View SVG"}, + {"id": "ViewSource", "label": "View Source"}, + {"id": "SaveAs", "label": "Save As"}, + null, + {"id": "Help"}, + {"id": "About", "label": "About Adobe CVG Viewer..."} + ] + }}`, + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + _, err := Unmarshal([]byte(test.value)) + if err != nil { + t.Errorf("Error on Unmarshal: %s", err.Error()) + } + }) + } +} + +func TestUnmarshalSafe(t *testing.T) { + json := []byte(`{ "store": { + "book": [ + { "category": "reference", + "author": "Nigel Rees", + "title": "Sayings of the Century", + "price": 8.95 + }, + { "category": "fiction", + "author": "Evelyn Waugh", + "title": "Sword of Honour", + "price": 12.99 + }, + { "category": "fiction", + "author": "Herman Melville", + "title": "Moby Dick", + "isbn": "0-553-21311-3", + "price": 8.99 + }, + { "category": "fiction", + "author": "J. R. R. Tolkien", + "title": "The Lord of the Rings", + "isbn": "0-395-19395-8", + "price": 22.99 + } + ], + "bicycle": { + "color": "red", + "price": 19.95 + } + } + }`) + safe, err := UnmarshalSafe(json) + if err != nil { + t.Errorf("Error on Unmarshal: %s", err.Error()) + } else if safe == nil { + t.Errorf("Error on Unmarshal: safe is nil") + } else { + root, err := Unmarshal(json) + if err != nil { + t.Errorf("Error on Unmarshal: %s", err.Error()) + } else if root == nil { + t.Errorf("Error on Unmarshal: root is nil") + } else if !bytes.Equal(root.source(), safe.source()) { + t.Errorf("Error on UnmarshalSafe: values not same") + } + } +} + +// BenchmarkGoStdUnmarshal-8 61698 19350 ns/op 288 B/op 6 allocs/op +// BenchmarkUnmarshal-8 45620 26165 ns/op 21889 B/op 367 allocs/op +// +// type bench struct { +// Name string `json:"name"` +// Value int `json:"value"` +// } + +// func BenchmarkGoStdUnmarshal(b *testing.B) { +// data := []byte(webApp) +// for i := 0; i < b.N; i++ { +// err := json.Unmarshal(data, &bench{}) +// if err != nil { +// b.Fatal(err) +// } +// } +// } + +// func BenchmarkUnmarshal(b *testing.B) { +// data := []byte(webApp) +// for i := 0; i < b.N; i++ { +// _, err := Unmarshal(data) +// if err != nil { +// b.Fatal(err) +// } +// } +// } diff --git a/portal-loop/extracted/p/demo/json:0/encode.gno b/portal-loop/extracted/p/demo/json:0/encode.gno new file mode 100644 index 00000000..be90d7aa --- /dev/null +++ b/portal-loop/extracted/p/demo/json:0/encode.gno @@ -0,0 +1,128 @@ +package json + +import ( + "bytes" + "errors" + "math" + "strconv" + + "gno.land/p/demo/json/ryu" + "gno.land/p/demo/ufmt" +) + +// Marshal returns the JSON encoding of a Node. +func Marshal(node *Node) ([]byte, error) { + var ( + buf bytes.Buffer + sVal string + bVal bool + nVal float64 + oVal []byte + err error + ) + + if node == nil { + return nil, errors.New("node is nil") + } + + if !node.modified && !node.ready() { + return nil, errors.New("node is not ready") + } + + if !node.modified && node.ready() { + buf.Write(node.source()) + } + + if node.modified { + switch node.nodeType { + case Null: + buf.Write(nullLiteral) + + case Number: + nVal, err = node.GetNumeric() + if err != nil { + return nil, err + } + + // ufmt does not support %g. by doing so, we need to check if the number is an integer + // after then, apply the correct format for each float and integer numbers. + if math.Mod(nVal, 1.0) == 0 { + // must convert float to integer. otherwise it will be overflowed. + num := ufmt.Sprintf("%d", int(nVal)) + buf.WriteString(num) + } else { + // use ryu algorithm to convert float to string + num := ryu.FormatFloat64(nVal) + buf.WriteString(num) + } + + case String: + sVal, err = node.GetString() + if err != nil { + return nil, err + } + + quoted := ufmt.Sprintf("%s", strconv.Quote(sVal)) + buf.WriteString(quoted) + + case Boolean: + bVal, err = node.GetBool() + if err != nil { + return nil, err + } + + bStr := ufmt.Sprintf("%t", bVal) + buf.WriteString(bStr) + + case Array: + buf.WriteByte(bracketOpen) + + for i := 0; i < len(node.next); i++ { + if i != 0 { + buf.WriteByte(comma) + } + + elem, ok := node.next[strconv.Itoa(i)] + if !ok { + return nil, ufmt.Errorf("array element %d is not found", i) + } + + oVal, err = Marshal(elem) + if err != nil { + return nil, err + } + + buf.Write(oVal) + } + + buf.WriteByte(bracketClose) + + case Object: + buf.WriteByte(curlyOpen) + + bVal = false + for k, v := range node.next { + if bVal { + buf.WriteByte(comma) + } else { + bVal = true + } + + key := ufmt.Sprintf("%s", strconv.Quote(k)) + buf.WriteString(key) + buf.WriteByte(colon) + + oVal, err = Marshal(v) + if err != nil { + return nil, err + } + + buf.Write(oVal) + } + + buf.WriteByte(curlyClose) + } + } + + return buf.Bytes(), nil +} diff --git a/portal-loop/extracted/p/demo/json:0/encode_test.gno b/portal-loop/extracted/p/demo/json:0/encode_test.gno new file mode 100644 index 00000000..e8e53993 --- /dev/null +++ b/portal-loop/extracted/p/demo/json:0/encode_test.gno @@ -0,0 +1,255 @@ +package json + +import "testing" + +func TestMarshal_Primitive(t *testing.T) { + tests := []struct { + name string + node *Node + }{ + { + name: "null", + node: NullNode(""), + }, + { + name: "true", + node: BoolNode("", true), + }, + { + name: "false", + node: BoolNode("", false), + }, + { + name: `"string"`, + node: StringNode("", "string"), + }, + { + name: `"one \"encoded\" string"`, + node: StringNode("", `one "encoded" string`), + }, + { + name: `{"foo":"bar"}`, + node: ObjectNode("", map[string]*Node{ + "foo": StringNode("foo", "bar"), + }), + }, + { + name: "42", + node: NumberNode("", 42), + }, + // TODO: fix output for not to use scientific notation + { + name: "1.005e+02", + node: NumberNode("", 100.5), + }, + { + name: `[1,2,3]`, + node: ArrayNode("", []*Node{ + NumberNode("0", 1), + NumberNode("2", 2), + NumberNode("3", 3), + }), + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + value, err := Marshal(test.node) + if err != nil { + t.Errorf("unexpected error: %s", err) + } else if string(value) != test.name { + t.Errorf("wrong result: '%s', expected '%s'", value, test.name) + } + }) + } +} + +func TestMarshal_Object(t *testing.T) { + node := ObjectNode("", map[string]*Node{ + "foo": StringNode("foo", "bar"), + "baz": NumberNode("baz", 100500), + "qux": NullNode("qux"), + }) + + mustKey := []string{"foo", "baz", "qux"} + + value, err := Marshal(node) + if err != nil { + t.Errorf("unexpected error: %s", err) + } + + // the order of keys in the map is not guaranteed + // so we need to unmarshal the result and check the keys + decoded, err := Unmarshal(value) + if err != nil { + t.Errorf("unexpected error: %s", err) + } + + for _, key := range mustKey { + if node, err := decoded.GetKey(key); err != nil { + t.Errorf("unexpected error: %s", err) + } else { + if node == nil { + t.Errorf("node is nil") + } else if node.key == nil { + t.Errorf("key is nil") + } else if *node.key != key { + t.Errorf("wrong key: '%s', expected '%s'", *node.key, key) + } + } + } +} + +func valueNode(prev *Node, key string, typ ValueType, val interface{}) *Node { + curr := &Node{ + prev: prev, + data: nil, + key: &key, + borders: [2]int{0, 0}, + value: val, + modified: true, + } + + if val != nil { + curr.nodeType = typ + } + + return curr +} + +func TestMarshal_Errors(t *testing.T) { + tests := []struct { + name string + node func() (node *Node) + }{ + { + name: "nil", + node: func() (node *Node) { + return + }, + }, + { + name: "broken", + node: func() (node *Node) { + node = Must(Unmarshal([]byte(`{}`))) + node.borders[1] = 0 + return + }, + }, + { + name: "Numeric", + node: func() (node *Node) { + return valueNode(nil, "", Number, false) + }, + }, + { + name: "String", + node: func() (node *Node) { + return valueNode(nil, "", String, false) + }, + }, + { + name: "Bool", + node: func() (node *Node) { + return valueNode(nil, "", Boolean, 1) + }, + }, + { + name: "Array_1", + node: func() (node *Node) { + node = ArrayNode("", nil) + node.next["1"] = NullNode("1") + return + }, + }, + { + name: "Array_2", + node: func() (node *Node) { + return ArrayNode("", []*Node{valueNode(nil, "", Boolean, 1)}) + }, + }, + { + name: "Object", + node: func() (node *Node) { + return ObjectNode("", map[string]*Node{"key": valueNode(nil, "key", Boolean, 1)}) + }, + }, + } + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + value, err := Marshal(test.node()) + if err == nil { + t.Errorf("expected error") + } else if len(value) != 0 { + t.Errorf("wrong result") + } + }) + } +} + +func TestMarshal_Nil(t *testing.T) { + _, err := Marshal(nil) + if err == nil { + t.Error("Expected error for nil node, but got nil") + } +} + +func TestMarshal_NotModified(t *testing.T) { + node := &Node{} + _, err := Marshal(node) + if err == nil { + t.Error("Expected error for not modified node, but got nil") + } +} + +func TestMarshalCycleReference(t *testing.T) { + node1 := &Node{ + key: stringPtr("node1"), + nodeType: String, + next: map[string]*Node{ + "next": nil, + }, + } + + node2 := &Node{ + key: stringPtr("node2"), + nodeType: String, + prev: node1, + } + + node1.next["next"] = node2 + + _, err := Marshal(node1) + if err == nil { + t.Error("Expected error for cycle reference, but got nil") + } +} + +func TestMarshalNoCycleReference(t *testing.T) { + node1 := &Node{ + key: stringPtr("node1"), + nodeType: String, + value: "value1", + modified: true, + } + + node2 := &Node{ + key: stringPtr("node2"), + nodeType: String, + value: "value2", + modified: true, + } + + _, err := Marshal(node1) + if err != nil { + t.Errorf("Unexpected error: %v", err) + } + + _, err = Marshal(node2) + if err != nil { + t.Errorf("Unexpected error: %v", err) + } +} + +func stringPtr(s string) *string { + return &s +} diff --git a/portal-loop/extracted/p/demo/json:0/escape.gno b/portal-loop/extracted/p/demo/json:0/escape.gno new file mode 100644 index 00000000..5a834068 --- /dev/null +++ b/portal-loop/extracted/p/demo/json:0/escape.gno @@ -0,0 +1,300 @@ +package json + +import ( + "bytes" + "errors" + "unicode/utf8" +) + +const ( + supplementalPlanesOffset = 0x10000 + highSurrogateOffset = 0xD800 + lowSurrogateOffset = 0xDC00 + surrogateEnd = 0xDFFF + basicMultilingualPlaneOffset = 0xFFFF + badHex = -1 +) + +var hexLookupTable = [256]int{ + '0': 0x0, '1': 0x1, '2': 0x2, '3': 0x3, '4': 0x4, + '5': 0x5, '6': 0x6, '7': 0x7, '8': 0x8, '9': 0x9, + 'A': 0xA, 'B': 0xB, 'C': 0xC, 'D': 0xD, 'E': 0xE, 'F': 0xF, + 'a': 0xA, 'b': 0xB, 'c': 0xC, 'd': 0xD, 'e': 0xE, 'f': 0xF, + // Fill unspecified index-value pairs with key and value of -1 + 'G': -1, 'H': -1, 'I': -1, 'J': -1, + 'K': -1, 'L': -1, 'M': -1, 'N': -1, + 'O': -1, 'P': -1, 'Q': -1, 'R': -1, + 'S': -1, 'T': -1, 'U': -1, 'V': -1, + 'W': -1, 'X': -1, 'Y': -1, 'Z': -1, + 'g': -1, 'h': -1, 'i': -1, 'j': -1, + 'k': -1, 'l': -1, 'm': -1, 'n': -1, + 'o': -1, 'p': -1, 'q': -1, 'r': -1, + 's': -1, 't': -1, 'u': -1, 'v': -1, + 'w': -1, 'x': -1, 'y': -1, 'z': -1, +} + +func h2i(c byte) int { + return hexLookupTable[c] +} + +// Unescape takes an input byte slice, processes it to Unescape certain characters, +// and writes the result into an output byte slice. +// +// it returns the processed slice and any error encountered during the Unescape operation. +func Unescape(input, output []byte) ([]byte, error) { + // find the index of the first backslash in the input slice. + firstBackslash := bytes.IndexByte(input, backSlash) + if firstBackslash == -1 { + return input, nil + } + + // ensure the output slice has enough capacity to hold the result. + inputLen := len(input) + if cap(output) < inputLen { + output = make([]byte, inputLen) + } + + output = output[:inputLen] + copy(output, input[:firstBackslash]) + + input = input[firstBackslash:] + buf := output[firstBackslash:] + + for len(input) > 0 { + inLen, bufLen, err := processEscapedUTF8(input, buf) + if err != nil { + return nil, err + } + + input = input[inLen:] // the number of bytes consumed in the input + buf = buf[bufLen:] // the number of bytes written to buf + + // find the next backslash in the remaining input + nextBackslash := bytes.IndexByte(input, backSlash) + if nextBackslash == -1 { + copy(buf, input) + buf = buf[len(input):] + break + } + + copy(buf, input[:nextBackslash]) + + input = input[nextBackslash:] + buf = buf[nextBackslash:] + } + + return output[:len(output)-len(buf)], nil +} + +// isSurrogatePair returns true if the rune is a surrogate pair. +// +// A surrogate pairs are used in UTF-16 encoding to encode characters +// outside the Basic Multilingual Plane (BMP). +func isSurrogatePair(r rune) bool { + return highSurrogateOffset <= r && r <= surrogateEnd +} + +// combineSurrogates reconstruct the original unicode code points in the +// supplemental plane by combinin the high and low surrogate. +// +// The hight surrogate in the range from U+D800 to U+DBFF, +// and the low surrogate in the range from U+DC00 to U+DFFF. +// +// The formula to combine the surrogates is: +// (high - 0xD800) * 0x400 + (low - 0xDC00) + 0x10000 +func combineSurrogates(high, low rune) rune { + return ((high - highSurrogateOffset) << 10) + (low - lowSurrogateOffset) + supplementalPlanesOffset +} + +// deocdeSingleUnicodeEscape decodes a unicode escape sequence (e.g., \uXXXX) into a rune. +func decodeSingleUnicodeEscape(b []byte) (rune, bool) { + if len(b) < 6 { + return utf8.RuneError, false + } + + // convert hex to decimal + h1, h2, h3, h4 := h2i(b[2]), h2i(b[3]), h2i(b[4]), h2i(b[5]) + if h1 == badHex || h2 == badHex || h3 == badHex || h4 == badHex { + return utf8.RuneError, false + } + + return rune(h1<<12 + h2<<8 + h3<<4 + h4), true +} + +// decodeUnicodeEscape decodes a Unicode escape sequence from a byte slice. +func decodeUnicodeEscape(b []byte) (rune, int) { + r, ok := decodeSingleUnicodeEscape(b) + if !ok { + return utf8.RuneError, -1 + } + + // determine valid unicode escapes within the BMP + if r <= basicMultilingualPlaneOffset && !isSurrogatePair(r) { + return r, 6 + } + + // Decode the following escape sequence to verify a UTF-16 susergate pair. + r2, ok := decodeSingleUnicodeEscape(b[6:]) + if !ok { + return utf8.RuneError, -1 + } + + if r2 < lowSurrogateOffset { + return utf8.RuneError, -1 + } + + return combineSurrogates(r, r2), 12 +} + +var escapeByteSet = [256]byte{ + '"': doubleQuote, + '\\': backSlash, + '/': slash, + 'b': backSpace, + 'f': formFeed, + 'n': newLine, + 'r': carriageReturn, + 't': tab, +} + +// Unquote takes a byte slice and unquotes it by removing +// the surrounding quotes and unescaping the contents. +func Unquote(s []byte, border byte) (string, bool) { + s, ok := unquoteBytes(s, border) + return string(s), ok +} + +// unquoteBytes takes a byte slice and unquotes it by removing +// TODO: consider to move this function to the strconv package. +func unquoteBytes(s []byte, border byte) ([]byte, bool) { + if len(s) < 2 || s[0] != border || s[len(s)-1] != border { + return nil, false + } + + s = s[1 : len(s)-1] + + r := 0 + for r < len(s) { + c := s[r] + + if c == backSlash || c == border || c < 0x20 { + break + } + + if c < utf8.RuneSelf { + r++ + continue + } + + rr, size := utf8.DecodeRune(s[r:]) + if rr == utf8.RuneError && size == 1 { + break + } + + r += size + } + + if r == len(s) { + return s, true + } + + utfDoubleMax := utf8.UTFMax * 2 + b := make([]byte, len(s)+utfDoubleMax) + w := copy(b, s[0:r]) + + for r < len(s) { + if w >= len(b)-utf8.UTFMax { + nb := make([]byte, utfDoubleMax+(2*len(b))) + copy(nb, b) + b = nb + } + + c := s[r] + if c == backSlash { + r++ + if r >= len(s) { + return nil, false + } + + if s[r] == 'u' { + rr, res := decodeUnicodeEscape(s[r-1:]) + if res < 0 { + return nil, false + } + + w += utf8.EncodeRune(b[w:], rr) + r += 5 + } else { + decode := escapeByteSet[s[r]] + if decode == 0 { + return nil, false + } + + if decode == doubleQuote || decode == backSlash || decode == slash { + decode = s[r] + } + + b[w] = decode + r++ + w++ + } + } else if c == border || c < 0x20 { + return nil, false + } else if c < utf8.RuneSelf { + b[w] = c + r++ + w++ + } else { + rr, size := utf8.DecodeRune(s[r:]) + + if rr == utf8.RuneError && size == 1 { + return nil, false + } + + r += size + w += utf8.EncodeRune(b[w:], rr) + } + } + + return b[:w], true +} + +// processEscapedUTF8 processes the escape sequence in the given byte slice and +// and converts them to UTF-8 characters. The function returns the length of the processed input and output. +// +// The input 'in' must contain the escape sequence to be processed, +// and 'out' provides a space to store the converted characters. +// +// The function returns (input length, output length) if the escape sequence is correct. +// Unicode escape sequences (e.g. \uXXXX) are decoded to UTF-8, other default escape sequences are +// converted to their corresponding special characters (e.g. \n -> newline). +// +// If the escape sequence is invalid, or if 'in' does not completely enclose the escape sequence, +// function returns (-1, -1) to indicate an error. +func processEscapedUTF8(in, out []byte) (int, int, error) { + if len(in) < 2 || in[0] != backSlash { + return -1, -1, errors.New("invalid escape sequence") + } + + escapeSeqLen := 2 + escapeChar := in[1] + + if escapeChar != 'u' { + val := escapeByteSet[escapeChar] + if val == 0 { + return -1, -1, errors.New("invalid escape sequence") + } + + out[0] = val + return escapeSeqLen, 1, nil + } + + r, size := decodeUnicodeEscape(in) + if size == -1 { + return -1, -1, errors.New("invalid escape sequence") + } + + outLen := utf8.EncodeRune(out, r) + + return size, outLen, nil +} diff --git a/portal-loop/extracted/p/demo/json:0/escape_test.gno b/portal-loop/extracted/p/demo/json:0/escape_test.gno new file mode 100644 index 00000000..40c118d9 --- /dev/null +++ b/portal-loop/extracted/p/demo/json:0/escape_test.gno @@ -0,0 +1,222 @@ +package json + +import ( + "bytes" + "testing" + "unicode/utf8" +) + +func TestHexToInt(t *testing.T) { + tests := []struct { + name string + c byte + want int + }{ + {"Digit 0", '0', 0}, + {"Digit 9", '9', 9}, + {"Uppercase A", 'A', 10}, + {"Uppercase F", 'F', 15}, + {"Lowercase a", 'a', 10}, + {"Lowercase f", 'f', 15}, + {"Invalid character1", 'g', badHex}, + {"Invalid character2", 'G', badHex}, + {"Invalid character3", 'z', badHex}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := h2i(tt.c); got != tt.want { + t.Errorf("h2i() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestIsSurrogatePair(t *testing.T) { + testCases := []struct { + name string + r rune + expected bool + }{ + {"high surrogate start", 0xD800, true}, + {"high surrogate end", 0xDBFF, true}, + {"low surrogate start", 0xDC00, true}, + {"low surrogate end", 0xDFFF, true}, + {"Non-surrogate", 0x0000, false}, + {"Non-surrogate 2", 0xE000, false}, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + if got := isSurrogatePair(tc.r); got != tc.expected { + t.Errorf("isSurrogate() = %v, want %v", got, tc.expected) + } + }) + } +} + +func TestCombineSurrogates(t *testing.T) { + testCases := []struct { + high, low rune + expected rune + }{ + {0xD83D, 0xDC36, 0x1F436}, // 🐶 U+1F436 DOG FACE + {0xD83D, 0xDE00, 0x1F600}, // 😀 U+1F600 GRINNING FACE + {0xD83C, 0xDF03, 0x1F303}, // 🌃 U+1F303 NIGHT WITH STARS + } + + for _, tc := range testCases { + result := combineSurrogates(tc.high, tc.low) + if result != tc.expected { + t.Errorf("combineSurrogates(%U, %U) = %U; want %U", tc.high, tc.low, result, tc.expected) + } + } +} + +func TestDecodeSingleUnicodeEscape(t *testing.T) { + testCases := []struct { + input []byte + expected rune + isValid bool + }{ + // valid unicode escape sequences + {[]byte(`\u0041`), 'A', true}, + {[]byte(`\u03B1`), 'α', true}, + {[]byte(`\u00E9`), 'é', true}, // valid non-English character + {[]byte(`\u0021`), '!', true}, // valid special character + {[]byte(`\uFF11`), '1', true}, + {[]byte(`\uD83D`), 0xD83D, true}, + {[]byte(`\uDE03`), 0xDE03, true}, + + // invalid unicode escape sequences + {[]byte(`\u004`), utf8.RuneError, false}, // too short + {[]byte(`\uXYZW`), utf8.RuneError, false}, // invalid hex + {[]byte(`\u00G1`), utf8.RuneError, false}, // non-hex character + } + + for _, tc := range testCases { + result, isValid := decodeSingleUnicodeEscape(tc.input) + if result != tc.expected || isValid != tc.isValid { + t.Errorf("decodeSingleUnicodeEscape(%s) = (%U, %v); want (%U, %v)", tc.input, result, isValid, tc.expected, tc.isValid) + } + } +} + +func TestDecodeUnicodeEscape(t *testing.T) { + testCases := []struct { + input string + expected rune + size int + }{ + {"\\u0041", 'A', 6}, + {"\\u03B1", 'α', 6}, + {"\\u1F600", 0x1F60, 6}, + {"\\uD830\\uDE03", 0x1C203, 12}, + {"\\uD800\\uDC00", 0x00010000, 12}, + + {"\\u004", utf8.RuneError, -1}, + {"\\uXYZW", utf8.RuneError, -1}, + {"\\uD83D\\u0041", utf8.RuneError, -1}, + } + + for _, tc := range testCases { + r, size := decodeUnicodeEscape([]byte(tc.input)) + if r != tc.expected || size != tc.size { + t.Errorf("decodeUnicodeEscape(%q) = (%U, %d); want (%U, %d)", tc.input, r, size, tc.expected, tc.size) + } + } +} + +func TestUnescapeToUTF8(t *testing.T) { + testCases := []struct { + input []byte + expectedIn int + expectedOut int + isError bool + }{ + // valid escape sequences + {[]byte(`\n`), 2, 1, false}, + {[]byte(`\t`), 2, 1, false}, + {[]byte(`\u0041`), 6, 1, false}, + {[]byte(`\u03B1`), 6, 2, false}, + {[]byte(`\uD830\uDE03`), 12, 4, false}, + + // invalid escape sequences + {[]byte(`\`), -1, -1, true}, // incomplete escape sequence + {[]byte(`\x`), -1, -1, true}, // invalid escape character + {[]byte(`\u`), -1, -1, true}, // incomplete unicode escape sequence + {[]byte(`\u004`), -1, -1, true}, // invalid unicode escape sequence + {[]byte(`\uXYZW`), -1, -1, true}, // invalid unicode escape sequence + {[]byte(`\uD83D\u0041`), -1, -1, true}, // invalid unicode escape sequence + } + + for _, tc := range testCases { + input := make([]byte, len(tc.input)) + copy(input, tc.input) + output := make([]byte, utf8.UTFMax) + inLen, outLen, err := processEscapedUTF8(input, output) + if (err != nil) != tc.isError { + t.Errorf("processEscapedUTF8(%q) = %v; want %v", tc.input, err, tc.isError) + } + + if inLen != tc.expectedIn || outLen != tc.expectedOut { + t.Errorf("processEscapedUTF8(%q) = (%d, %d); want (%d, %d)", tc.input, inLen, outLen, tc.expectedIn, tc.expectedOut) + } + } +} + +func TestUnescape(t *testing.T) { + testCases := []struct { + name string + input []byte + expected []byte + }{ + {"NoEscape", []byte("hello world"), []byte("hello world")}, + {"SingleEscape", []byte("hello\\nworld"), []byte("hello\nworld")}, + {"MultipleEscapes", []byte("line1\\nline2\\r\\nline3"), []byte("line1\nline2\r\nline3")}, + {"UnicodeEscape", []byte("snowman:\\u2603"), []byte("snowman:\u2603")}, + {"Complex", []byte("tc\\n\\u2603\\r\\nend"), []byte("tc\n\u2603\r\nend")}, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + output, _ := Unescape(tc.input, make([]byte, len(tc.input)+10)) + if !bytes.Equal(output, tc.expected) { + t.Errorf("unescape(%q) = %q; want %q", tc.input, output, tc.expected) + } + }) + } +} + +func TestUnquoteBytes(t *testing.T) { + tests := []struct { + input []byte + border byte + expected []byte + ok bool + }{ + {[]byte("\"hello\""), '"', []byte("hello"), true}, + {[]byte("'hello'"), '\'', []byte("hello"), true}, + {[]byte("\"hello"), '"', nil, false}, + {[]byte("hello\""), '"', nil, false}, + {[]byte("\"he\\\"llo\""), '"', []byte("he\"llo"), true}, + {[]byte("\"he\\nllo\""), '"', []byte("he\nllo"), true}, + {[]byte("\"\""), '"', []byte(""), true}, + {[]byte("''"), '\'', []byte(""), true}, + {[]byte("\"\\u0041\""), '"', []byte("A"), true}, + {[]byte(`"Hello, 世界"`), '"', []byte("Hello, 世界"), true}, + {[]byte(`"Hello, \x80"`), '"', nil, false}, + } + + for _, tc := range tests { + result, pass := unquoteBytes(tc.input, tc.border) + + if pass != tc.ok { + t.Errorf("unquoteBytes(%q) = %v; want %v", tc.input, pass, tc.ok) + } + + if !bytes.Equal(result, tc.expected) { + t.Errorf("unquoteBytes(%q) = %q; want %q", tc.input, result, tc.expected) + } + } +} diff --git a/portal-loop/extracted/p/demo/json:0/indent.gno b/portal-loop/extracted/p/demo/json:0/indent.gno new file mode 100644 index 00000000..cdcfd452 --- /dev/null +++ b/portal-loop/extracted/p/demo/json:0/indent.gno @@ -0,0 +1,144 @@ +package json + +import ( + "bytes" + "strings" +) + +// indentGrowthFactor specifies the growth factor of indenting JSON input. +// A factor no higher than 2 ensures that wasted space never exceeds 50%. +const indentGrowthFactor = 2 + +// IndentJSON takes a JSON byte slice and a string for indentation, +// then formats the JSON according to the specified indent string. +// This function applies indentation rules as follows: +// +// 1. For top-level arrays and objects, no additional indentation is applied. +// +// 2. For nested structures like arrays within arrays or objects, indentation increases. +// +// 3. Indentation is applied after opening brackets ('[' or '{') and before closing brackets (']' or '}'). +// +// 4. Commas and colons are handled appropriately to maintain valid JSON format. +// +// 5. Nested arrays within objects or arrays receive new lines and indentation based on their depth level. +// +// The function returns the formatted JSON as a byte slice and an error if any issues occurred during formatting. +func Indent(data []byte, indent string) ([]byte, error) { + var ( + out bytes.Buffer + level int + inArray bool + arrayDepth int + ) + + for i := 0; i < len(data); i++ { + c := data[i] // current character + + switch c { + case bracketOpen: + arrayDepth++ + if arrayDepth > 1 { + level++ // increase the level if it's nested array + inArray = true + + if err := out.WriteByte(c); err != nil { + return nil, err + } + + if err := writeNewlineAndIndent(&out, level, indent); err != nil { + return nil, err + } + } else { + // case of the top-level array + inArray = true + if err := out.WriteByte(c); err != nil { + return nil, err + } + } + + case bracketClose: + if inArray && arrayDepth > 1 { // nested array + level-- + if err := writeNewlineAndIndent(&out, level, indent); err != nil { + return nil, err + } + } + + arrayDepth-- + if arrayDepth == 0 { + inArray = false + } + + if err := out.WriteByte(c); err != nil { + return nil, err + } + + case curlyOpen: + // check if the empty object or array + // we don't need to apply the indent when it's empty containers. + if i+1 < len(data) && data[i+1] == curlyClose { + if err := out.WriteByte(c); err != nil { + return nil, err + } + + i++ // skip next character + if err := out.WriteByte(data[i]); err != nil { + return nil, err + } + } else { + if err := out.WriteByte(c); err != nil { + return nil, err + } + + level++ + if err := writeNewlineAndIndent(&out, level, indent); err != nil { + return nil, err + } + } + + case curlyClose: + level-- + if err := writeNewlineAndIndent(&out, level, indent); err != nil { + return nil, err + } + if err := out.WriteByte(c); err != nil { + return nil, err + } + + case comma, colon: + if err := out.WriteByte(c); err != nil { + return nil, err + } + if inArray && arrayDepth > 1 { // nested array + if err := writeNewlineAndIndent(&out, level, indent); err != nil { + return nil, err + } + } else if c == colon { + if err := out.WriteByte(' '); err != nil { + return nil, err + } + } + + default: + if err := out.WriteByte(c); err != nil { + return nil, err + } + } + } + + return out.Bytes(), nil +} + +func writeNewlineAndIndent(out *bytes.Buffer, level int, indent string) error { + if err := out.WriteByte('\n'); err != nil { + return err + } + + idt := strings.Repeat(indent, level*indentGrowthFactor) + if _, err := out.WriteString(idt); err != nil { + return err + } + + return nil +} diff --git a/portal-loop/extracted/p/demo/json:0/indent_test.gno b/portal-loop/extracted/p/demo/json:0/indent_test.gno new file mode 100644 index 00000000..bc57449b --- /dev/null +++ b/portal-loop/extracted/p/demo/json:0/indent_test.gno @@ -0,0 +1,84 @@ +package json + +import ( + "bytes" + "testing" +) + +func TestIndentJSON(t *testing.T) { + tests := []struct { + name string + input []byte + indent string + expected []byte + }{ + { + name: "empty object", + input: []byte(`{}`), + indent: " ", + expected: []byte(`{}`), + }, + { + name: "empty array", + input: []byte(`[]`), + indent: " ", + expected: []byte(`[]`), + }, + { + name: "nested object", + input: []byte(`{{}}`), + indent: "\t", + expected: []byte("{\n\t\t{}\n}"), + }, + { + name: "nested array", + input: []byte(`[[[]]]`), + indent: "\t", + expected: []byte("[[\n\t\t[\n\t\t\t\t\n\t\t]\n]]"), + }, + { + name: "top-level array", + input: []byte(`["apple","banana","cherry"]`), + indent: "\t", + expected: []byte(`["apple","banana","cherry"]`), + }, + { + name: "array of arrays", + input: []byte(`["apple",["banana","cherry"],"date"]`), + indent: " ", + expected: []byte("[\"apple\",[\n \"banana\",\n \"cherry\"\n],\"date\"]"), + }, + + { + name: "nested array in object", + input: []byte(`{"fruits":["apple",["banana","cherry"],"date"]}`), + indent: " ", + expected: []byte("{\n \"fruits\": [\"apple\",[\n \"banana\",\n \"cherry\"\n ],\"date\"]\n}"), + }, + { + name: "complex nested structure", + input: []byte(`{"data":{"array":[1,2,3],"bool":true,"nestedArray":[["a","b"],"c"]}}`), + indent: " ", + expected: []byte("{\n \"data\": {\n \"array\": [1,2,3],\"bool\": true,\"nestedArray\": [[\n \"a\",\n \"b\"\n ],\"c\"]\n }\n}"), + }, + { + name: "custom ident character", + input: []byte(`{"fruits":["apple",["banana","cherry"],"date"]}`), + indent: "*", + expected: []byte("{\n**\"fruits\": [\"apple\",[\n****\"banana\",\n****\"cherry\"\n**],\"date\"]\n}"), + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + actual, err := Indent(tt.input, tt.indent) + if err != nil { + t.Errorf("IndentJSON() error = %v", err) + return + } + if !bytes.Equal(actual, tt.expected) { + t.Errorf("IndentJSON() = %q, want %q", actual, tt.expected) + } + }) + } +} diff --git a/portal-loop/extracted/p/demo/json:0/internal.gno b/portal-loop/extracted/p/demo/json:0/internal.gno new file mode 100644 index 00000000..cae7fbab --- /dev/null +++ b/portal-loop/extracted/p/demo/json:0/internal.gno @@ -0,0 +1,198 @@ +package json + +// Reference: https://github.com/freddierice/php_source/blob/467ed5d6edff72219afd3e644516f131118ef48e/ext/json/JSON_parser.c +// Copyright (c) 2005 JSON.org + +// Go implementation is taken from: https://github.com/spyzhov/ajson/blob/master/internal/state.go + +type ( + States int8 // possible states of the parser + Classes int8 // JSON string character types +) + +const __ = -1 + +// enum classes +const ( + C_SPACE Classes = iota /* space */ + C_WHITE /* other whitespace */ + C_LCURB /* { */ + C_RCURB /* } */ + C_LSQRB /* [ */ + C_RSQRB /* ] */ + C_COLON /* : */ + C_COMMA /* , */ + C_QUOTE /* " */ + C_BACKS /* \ */ + C_SLASH /* / */ + C_PLUS /* + */ + C_MINUS /* - */ + C_POINT /* . */ + C_ZERO /* 0 */ + C_DIGIT /* 123456789 */ + C_LOW_A /* a */ + C_LOW_B /* b */ + C_LOW_C /* c */ + C_LOW_D /* d */ + C_LOW_E /* e */ + C_LOW_F /* f */ + C_LOW_L /* l */ + C_LOW_N /* n */ + C_LOW_R /* r */ + C_LOW_S /* s */ + C_LOW_T /* t */ + C_LOW_U /* u */ + C_ABCDF /* ABCDF */ + C_E /* E */ + C_ETC /* everything else */ +) + +// AsciiClasses array maps the 128 ASCII characters into character classes. +var AsciiClasses = [128]Classes{ + /* + This array maps the 128 ASCII characters into character classes. + The remaining Unicode characters should be mapped to C_ETC. + Non-whitespace control characters are errors. + */ + __, __, __, __, __, __, __, __, + __, C_WHITE, C_WHITE, __, __, C_WHITE, __, __, + __, __, __, __, __, __, __, __, + __, __, __, __, __, __, __, __, + + C_SPACE, C_ETC, C_QUOTE, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC, + C_ETC, C_ETC, C_ETC, C_PLUS, C_COMMA, C_MINUS, C_POINT, C_SLASH, + C_ZERO, C_DIGIT, C_DIGIT, C_DIGIT, C_DIGIT, C_DIGIT, C_DIGIT, C_DIGIT, + C_DIGIT, C_DIGIT, C_COLON, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC, + + C_ETC, C_ABCDF, C_ABCDF, C_ABCDF, C_ABCDF, C_E, C_ABCDF, C_ETC, + C_ETC, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC, + C_ETC, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC, + C_ETC, C_ETC, C_ETC, C_LSQRB, C_BACKS, C_RSQRB, C_ETC, C_ETC, + + C_ETC, C_LOW_A, C_LOW_B, C_LOW_C, C_LOW_D, C_LOW_E, C_LOW_F, C_ETC, + C_ETC, C_ETC, C_ETC, C_ETC, C_LOW_L, C_ETC, C_LOW_N, C_ETC, + C_ETC, C_ETC, C_LOW_R, C_LOW_S, C_LOW_T, C_LOW_U, C_ETC, C_ETC, + C_ETC, C_ETC, C_ETC, C_LCURB, C_ETC, C_RCURB, C_ETC, C_ETC, +} + +// QuoteAsciiClasses is a HACK for single quote from AsciiClasses +var QuoteAsciiClasses = [128]Classes{ + /* + This array maps the 128 ASCII characters into character classes. + The remaining Unicode characters should be mapped to C_ETC. + Non-whitespace control characters are errors. + */ + __, __, __, __, __, __, __, __, + __, C_WHITE, C_WHITE, __, __, C_WHITE, __, __, + __, __, __, __, __, __, __, __, + __, __, __, __, __, __, __, __, + + C_SPACE, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC, C_QUOTE, + C_ETC, C_ETC, C_ETC, C_PLUS, C_COMMA, C_MINUS, C_POINT, C_SLASH, + C_ZERO, C_DIGIT, C_DIGIT, C_DIGIT, C_DIGIT, C_DIGIT, C_DIGIT, C_DIGIT, + C_DIGIT, C_DIGIT, C_COLON, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC, + + C_ETC, C_ABCDF, C_ABCDF, C_ABCDF, C_ABCDF, C_E, C_ABCDF, C_ETC, + C_ETC, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC, + C_ETC, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC, C_ETC, + C_ETC, C_ETC, C_ETC, C_LSQRB, C_BACKS, C_RSQRB, C_ETC, C_ETC, + + C_ETC, C_LOW_A, C_LOW_B, C_LOW_C, C_LOW_D, C_LOW_E, C_LOW_F, C_ETC, + C_ETC, C_ETC, C_ETC, C_ETC, C_LOW_L, C_ETC, C_LOW_N, C_ETC, + C_ETC, C_ETC, C_LOW_R, C_LOW_S, C_LOW_T, C_LOW_U, C_ETC, C_ETC, + C_ETC, C_ETC, C_ETC, C_LCURB, C_ETC, C_RCURB, C_ETC, C_ETC, +} + +/* +The state codes. +*/ +const ( + GO States = iota /* start */ + OK /* ok */ + OB /* object */ + KE /* key */ + CO /* colon */ + VA /* value */ + AR /* array */ + ST /* string */ + ES /* escape */ + U1 /* u1 */ + U2 /* u2 */ + U3 /* u3 */ + U4 /* u4 */ + MI /* minus */ + ZE /* zero */ + IN /* integer */ + DT /* dot */ + FR /* fraction */ + E1 /* e */ + E2 /* ex */ + E3 /* exp */ + T1 /* tr */ + T2 /* tru */ + T3 /* true */ + F1 /* fa */ + F2 /* fal */ + F3 /* fals */ + F4 /* false */ + N1 /* nu */ + N2 /* nul */ + N3 /* null */ +) + +// List of action codes. +// these constants are defining an action that should be performed under certain conditions. +const ( + cl States = -2 /* colon */ + cm States = -3 /* comma */ + qt States = -4 /* quote */ + bo States = -5 /* bracket open */ + co States = -6 /* curly bracket open */ + bc States = -7 /* bracket close */ + cc States = -8 /* curly bracket close */ + ec States = -9 /* curly bracket empty */ +) + +// StateTransitionTable is the state transition table takes the current state and the current symbol, and returns either +// a new state or an action. An action is represented as a negative number. A JSON text is accepted if at the end of the +// text the state is OK and if the mode is DONE. +var StateTransitionTable = [31][31]States{ + /* + The state transition table takes the current state and the current symbol, + and returns either a new state or an action. An action is represented as a + negative number. A JSON text is accepted if at the end of the text the + state is OK and if the mode is DONE. + white 1-9 ABCDF etc + space | { } [ ] : , " \ / + - . 0 | a b c d e f l n r s t u | E |*/ + /*start GO*/ {GO, GO, co, __, bo, __, __, __, ST, __, __, __, MI, __, ZE, IN, __, __, __, __, __, F1, __, N1, __, __, T1, __, __, __, __}, + /*ok OK*/ {OK, OK, __, cc, __, bc, __, cm, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __}, + /*object OB*/ {OB, OB, __, ec, __, __, __, __, ST, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __}, + /*key KE*/ {KE, KE, __, __, __, __, __, __, ST, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __}, + /*colon CO*/ {CO, CO, __, __, __, __, cl, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __}, + /*value VA*/ {VA, VA, co, __, bo, __, __, __, ST, __, __, __, MI, __, ZE, IN, __, __, __, __, __, F1, __, N1, __, __, T1, __, __, __, __}, + /*array AR*/ {AR, AR, co, __, bo, bc, __, __, ST, __, __, __, MI, __, ZE, IN, __, __, __, __, __, F1, __, N1, __, __, T1, __, __, __, __}, + /*string ST*/ {ST, __, ST, ST, ST, ST, ST, ST, qt, ES, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST, ST}, + /*escape ES*/ {__, __, __, __, __, __, __, __, ST, ST, ST, __, __, __, __, __, __, ST, __, __, __, ST, __, ST, ST, __, ST, U1, __, __, __}, + /*u1 U1*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, U2, U2, U2, U2, U2, U2, U2, U2, __, __, __, __, __, __, U2, U2, __}, + /*u2 U2*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, U3, U3, U3, U3, U3, U3, U3, U3, __, __, __, __, __, __, U3, U3, __}, + /*u3 U3*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, U4, U4, U4, U4, U4, U4, U4, U4, __, __, __, __, __, __, U4, U4, __}, + /*u4 U4*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, ST, ST, ST, ST, ST, ST, ST, ST, __, __, __, __, __, __, ST, ST, __}, + /*minus MI*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, ZE, IN, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __}, + /*zero ZE*/ {OK, OK, __, cc, __, bc, __, cm, __, __, __, __, __, DT, __, __, __, __, __, __, E1, __, __, __, __, __, __, __, __, E1, __}, + /*int IN*/ {OK, OK, __, cc, __, bc, __, cm, __, __, __, __, __, DT, IN, IN, __, __, __, __, E1, __, __, __, __, __, __, __, __, E1, __}, + /*dot DT*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, FR, FR, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __}, + /*frac FR*/ {OK, OK, __, cc, __, bc, __, cm, __, __, __, __, __, __, FR, FR, __, __, __, __, E1, __, __, __, __, __, __, __, __, E1, __}, + /*e E1*/ {__, __, __, __, __, __, __, __, __, __, __, E2, E2, __, E3, E3, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __}, + /*ex E2*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, E3, E3, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __}, + /*exp E3*/ {OK, OK, __, cc, __, bc, __, cm, __, __, __, __, __, __, E3, E3, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __}, + /*tr T1*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, T2, __, __, __, __, __, __}, + /*tru T2*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, T3, __, __, __}, + /*true T3*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, OK, __, __, __, __, __, __, __, __, __, __}, + /*fa F1*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, F2, __, __, __, __, __, __, __, __, __, __, __, __, __, __}, + /*fal F2*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, F3, __, __, __, __, __, __, __, __}, + /*fals F3*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, F4, __, __, __, __, __}, + /*false F4*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, OK, __, __, __, __, __, __, __, __, __, __}, + /*nu N1*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, N2, __, __, __}, + /*nul N2*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, N3, __, __, __, __, __, __, __, __}, + /*null N3*/ {__, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, __, OK, __, __, __, __, __, __, __, __}, +} diff --git a/portal-loop/extracted/p/demo/json:0/node.gno b/portal-loop/extracted/p/demo/json:0/node.gno new file mode 100644 index 00000000..1e71a101 --- /dev/null +++ b/portal-loop/extracted/p/demo/json:0/node.gno @@ -0,0 +1,1083 @@ +package json + +import ( + "errors" + "strconv" + "strings" + + "gno.land/p/demo/ufmt" +) + +// Node represents a JSON node. +type Node struct { + prev *Node // prev is the parent node of the current node. + next map[string]*Node // next is the child nodes of the current node. + key *string // key holds the key of the current node in the parent node. + data []byte // byte slice of JSON data + value interface{} // value holds the value of the current node. + nodeType ValueType // NodeType holds the type of the current node. (Object, Array, String, Number, Boolean, Null) + index *int // index holds the index of the current node in the parent array node. + borders [2]int // borders stores the start and end index of the current node in the data. + modified bool // modified indicates the current node is changed or not. +} + +// NewNode creates a new node instance with the given parent node, buffer, type, and key. +func NewNode(prev *Node, b *buffer, typ ValueType, key **string) (*Node, error) { + curr := &Node{ + prev: prev, + data: b.data, + borders: [2]int{b.index, 0}, + key: *key, + nodeType: typ, + modified: false, + } + + if typ == Object || typ == Array { + curr.next = make(map[string]*Node) + } + + if prev != nil { + if prev.IsArray() { + size := len(prev.next) + curr.index = &size + + prev.next[strconv.Itoa(size)] = curr + } else if prev.IsObject() { + if key == nil { + return nil, errors.New("key is required for object") + } + + prev.next[**key] = curr + } else { + return nil, errors.New("invalid parent type") + } + } + + return curr, nil +} + +// load retrieves the value of the current node. +func (n *Node) load() interface{} { + return n.value +} + +// Changed checks the current node is changed or not. +func (n *Node) Changed() bool { + return n.modified +} + +// Key returns the key of the current node. +func (n *Node) Key() string { + if n == nil || n.key == nil { + return "" + } + + return *n.key +} + +// HasKey checks the current node has the given key or not. +func (n *Node) HasKey(key string) bool { + if n == nil { + return false + } + + _, ok := n.next[key] + return ok +} + +// GetKey returns the value of the given key from the current object node. +func (n *Node) GetKey(key string) (*Node, error) { + if n == nil { + return nil, errors.New("node is nil") + } + + if n.Type() != Object { + return nil, ufmt.Errorf("target node is not object type. got: %s", n.Type().String()) + } + + value, ok := n.next[key] + if !ok { + return nil, ufmt.Errorf("key not found: %s", key) + } + + return value, nil +} + +// MustKey returns the value of the given key from the current object node. +func (n *Node) MustKey(key string) *Node { + val, err := n.GetKey(key) + if err != nil { + panic(err) + } + + return val +} + +// UniqueKeyLists traverses the current JSON nodes and collects all the unique keys. +func (n *Node) UniqueKeyLists() []string { + var collectKeys func(*Node) []string + collectKeys = func(node *Node) []string { + if node == nil || !node.IsObject() { + return nil + } + + result := make(map[string]bool) + for key, childNode := range node.next { + result[key] = true + childKeys := collectKeys(childNode) + for _, childKey := range childKeys { + result[childKey] = true + } + } + + keys := make([]string, 0, len(result)) + for key := range result { + keys = append(keys, key) + } + return keys + } + + return collectKeys(n) +} + +// Empty returns true if the current node is empty. +func (n *Node) Empty() bool { + if n == nil { + return false + } + + return len(n.next) == 0 +} + +// Type returns the type (ValueType) of the current node. +func (n *Node) Type() ValueType { + return n.nodeType +} + +// Value returns the value of the current node. +// +// Usage: +// +// root := Unmarshal([]byte(`{"key": "value"}`)) +// val, err := root.MustKey("key").Value() +// if err != nil { +// t.Errorf("Value returns error: %v", err) +// } +// +// result: "value" +func (n *Node) Value() (value interface{}, err error) { + value = n.load() + + if value == nil { + switch n.nodeType { + case Null: + return nil, nil + + case Number: + value, err = ParseFloatLiteral(n.source()) + if err != nil { + return nil, err + } + + n.value = value + + case String: + var ok bool + value, ok = Unquote(n.source(), doubleQuote) + if !ok { + return "", errors.New("invalid string value") + } + + n.value = value + + case Boolean: + if len(n.source()) == 0 { + return nil, errors.New("empty boolean value") + } + + b := n.source()[0] + value = b == 't' || b == 'T' + n.value = value + + case Array: + elems := make([]*Node, len(n.next)) + + for _, e := range n.next { + elems[*e.index] = e + } + + value = elems + n.value = value + + case Object: + obj := make(map[string]*Node, len(n.next)) + + for k, v := range n.next { + obj[k] = v + } + + value = obj + n.value = value + } + } + + return value, nil +} + +// Delete removes the current node from the parent node. +// +// Usage: +// +// root := Unmarshal([]byte(`{"key": "value"}`)) +// if err := root.MustKey("key").Delete(); err != nil { +// t.Errorf("Delete returns error: %v", err) +// } +// +// result: {} (empty object) +func (n *Node) Delete() error { + if n == nil { + return errors.New("can't delete nil node") + } + + if n.prev == nil { + return nil + } + + return n.prev.remove(n) +} + +// Size returns the size (length) of the current array node. +// +// Usage: +// +// root := ArrayNode("", []*Node{StringNode("", "foo"), NumberNode("", 1)}) +// if root == nil { +// t.Errorf("ArrayNode returns nil") +// } +// +// if root.Size() != 2 { +// t.Errorf("ArrayNode returns wrong size: %d", root.Size()) +// } +func (n *Node) Size() int { + if n == nil { + return 0 + } + + return len(n.next) +} + +// Index returns the index of the current node in the parent array node. +// +// Usage: +// +// root := ArrayNode("", []*Node{StringNode("", "foo"), NumberNode("", 1)}) +// if root == nil { +// t.Errorf("ArrayNode returns nil") +// } +// +// if root.MustIndex(1).Index() != 1 { +// t.Errorf("Index returns wrong index: %d", root.MustIndex(1).Index()) +// } +// +// We can also use the index to the byte slice of the JSON data directly. +// +// Example: +// +// root := Unmarshal([]byte(`["foo", 1]`)) +// if root == nil { +// t.Errorf("Unmarshal returns nil") +// } +// +// if string(root.MustIndex(1).source()) != "1" { +// t.Errorf("source returns wrong result: %s", root.MustIndex(1).source()) +// } +func (n *Node) Index() int { + if n == nil || n.index == nil { + return -1 + } + + return *n.index +} + +// MustIndex returns the array element at the given index. +// +// If the index is negative, it returns the index is from the end of the array. +// Also, it panics if the index is not found. +// +// check the Index method for detailed usage. +func (n *Node) MustIndex(expectIdx int) *Node { + val, err := n.GetIndex(expectIdx) + if err != nil { + panic(err) + } + + return val +} + +// GetIndex returns the array element at the given index. +// +// if the index is negative, it returns the index is from the end of the array. +func (n *Node) GetIndex(idx int) (*Node, error) { + if n == nil { + return nil, errors.New("node is nil") + } + + if !n.IsArray() { + return nil, errors.New("node is not array") + } + + if idx > n.Size() { + return nil, errors.New("input index exceeds the array size") + } + + if idx < 0 { + idx += len(n.next) + } + + child, ok := n.next[strconv.Itoa(idx)] + if !ok { + return nil, errors.New("index not found") + } + + return child, nil +} + +// DeleteIndex removes the array element at the given index. +func (n *Node) DeleteIndex(idx int) error { + node, err := n.GetIndex(idx) + if err != nil { + return err + } + + return n.remove(node) +} + +// NullNode creates a new null type node. +// +// Usage: +// +// _ := NullNode("") +func NullNode(key string) *Node { + return &Node{ + key: &key, + value: nil, + nodeType: Null, + modified: true, + } +} + +// NumberNode creates a new number type node. +// +// Usage: +// +// root := NumberNode("", 1) +// if root == nil { +// t.Errorf("NumberNode returns nil") +// } +func NumberNode(key string, value float64) *Node { + return &Node{ + key: &key, + value: value, + nodeType: Number, + modified: true, + } +} + +// StringNode creates a new string type node. +// +// Usage: +// +// root := StringNode("", "foo") +// if root == nil { +// t.Errorf("StringNode returns nil") +// } +func StringNode(key string, value string) *Node { + return &Node{ + key: &key, + value: value, + nodeType: String, + modified: true, + } +} + +// BoolNode creates a new given boolean value node. +// +// Usage: +// +// root := BoolNode("", true) +// if root == nil { +// t.Errorf("BoolNode returns nil") +// } +func BoolNode(key string, value bool) *Node { + return &Node{ + key: &key, + value: value, + nodeType: Boolean, + modified: true, + } +} + +// ArrayNode creates a new array type node. +// +// If the given value is nil, it creates an empty array node. +// +// Usage: +// +// root := ArrayNode("", []*Node{StringNode("", "foo"), NumberNode("", 1)}) +// if root == nil { +// t.Errorf("ArrayNode returns nil") +// } +func ArrayNode(key string, value []*Node) *Node { + curr := &Node{ + key: &key, + nodeType: Array, + modified: true, + } + + curr.next = make(map[string]*Node, len(value)) + if value != nil { + curr.value = value + + for i, v := range value { + idx := i + curr.next[strconv.Itoa(i)] = v + + v.prev = curr + v.index = &idx + } + } + + return curr +} + +// ObjectNode creates a new object type node. +// +// If the given value is nil, it creates an empty object node. +// +// next is a map of key and value pairs of the object. +func ObjectNode(key string, value map[string]*Node) *Node { + curr := &Node{ + nodeType: Object, + key: &key, + next: value, + modified: true, + } + + if value != nil { + curr.value = value + + for key, val := range value { + vkey := key + val.prev = curr + val.key = &vkey + } + } else { + curr.next = make(map[string]*Node) + } + + return curr +} + +// IsArray returns true if the current node is array type. +func (n *Node) IsArray() bool { + return n.nodeType == Array +} + +// IsObject returns true if the current node is object type. +func (n *Node) IsObject() bool { + return n.nodeType == Object +} + +// IsNull returns true if the current node is null type. +func (n *Node) IsNull() bool { + return n.nodeType == Null +} + +// IsBool returns true if the current node is boolean type. +func (n *Node) IsBool() bool { + return n.nodeType == Boolean +} + +// IsString returns true if the current node is string type. +func (n *Node) IsString() bool { + return n.nodeType == String +} + +// IsNumber returns true if the current node is number type. +func (n *Node) IsNumber() bool { + return n.nodeType == Number +} + +// ready checks the current node is ready or not. +// +// the meaning of ready is the current node is parsed and has a valid value. +func (n *Node) ready() bool { + return n.borders[1] != 0 +} + +// source returns the source of the current node. +func (n *Node) source() []byte { + if n == nil { + return nil + } + + if n.ready() && !n.modified && n.data != nil { + return (n.data)[n.borders[0]:n.borders[1]] + } + + return nil +} + +// root returns the root node of the current node. +func (n *Node) root() *Node { + if n == nil { + return nil + } + + curr := n + for curr.prev != nil { + curr = curr.prev + } + + return curr +} + +// GetNull returns the null value if current node is null type. +// +// Usage: +// +// root := Unmarshal([]byte("null")) +// val, err := root.GetNull() +// if err != nil { +// t.Errorf("GetNull returns error: %v", err) +// } +// if val != nil { +// t.Errorf("GetNull returns wrong result: %v", val) +// } +func (n *Node) GetNull() (interface{}, error) { + if n == nil { + return nil, errors.New("node is nil") + } + + if !n.IsNull() { + return nil, errors.New("node is not null") + } + + return nil, nil +} + +// MustNull returns the null value if current node is null type. +// +// It panics if the current node is not null type. +func (n *Node) MustNull() interface{} { + v, err := n.GetNull() + if err != nil { + panic(err) + } + + return v +} + +// GetNumeric returns the numeric (int/float) value if current node is number type. +// +// Usage: +// +// root := Unmarshal([]byte("10.5")) +// val, err := root.GetNumeric() +// if err != nil { +// t.Errorf("GetNumeric returns error: %v", err) +// } +// println(val) // 10.5 +func (n *Node) GetNumeric() (float64, error) { + if n == nil { + return 0, errors.New("node is nil") + } + + if n.nodeType != Number { + return 0, errors.New("node is not number") + } + + val, err := n.Value() + if err != nil { + return 0, err + } + + v, ok := val.(float64) + if !ok { + return 0, errors.New("node is not number") + } + + return v, nil +} + +// MustNumeric returns the numeric (int/float) value if current node is number type. +// +// It panics if the current node is not number type. +func (n *Node) MustNumeric() float64 { + v, err := n.GetNumeric() + if err != nil { + panic(err) + } + + return v +} + +// GetString returns the string value if current node is string type. +// +// Usage: +// +// root, err := Unmarshal([]byte("foo")) +// if err != nil { +// t.Errorf("Error on Unmarshal(): %s", err) +// } +// +// str, err := root.GetString() +// if err != nil { +// t.Errorf("should retrieve string value: %s", err) +// } +// +// println(str) // "foo" +func (n *Node) GetString() (string, error) { + if n == nil { + return "", errors.New("string node is empty") + } + + if !n.IsString() { + return "", errors.New("node type is not string") + } + + val, err := n.Value() + if err != nil { + return "", err + } + + v, ok := val.(string) + if !ok { + return "", errors.New("node is not string") + } + + return v, nil +} + +// MustString returns the string value if current node is string type. +// +// It panics if the current node is not string type. +func (n *Node) MustString() string { + v, err := n.GetString() + if err != nil { + panic(err) + } + + return v +} + +// GetBool returns the boolean value if current node is boolean type. +// +// Usage: +// +// root := Unmarshal([]byte("true")) +// val, err := root.GetBool() +// if err != nil { +// t.Errorf("GetBool returns error: %v", err) +// } +// println(val) // true +func (n *Node) GetBool() (bool, error) { + if n == nil { + return false, errors.New("node is nil") + } + + if n.nodeType != Boolean { + return false, errors.New("node is not boolean") + } + + val, err := n.Value() + if err != nil { + return false, err + } + + v, ok := val.(bool) + if !ok { + return false, errors.New("node is not boolean") + } + + return v, nil +} + +// MustBool returns the boolean value if current node is boolean type. +// +// It panics if the current node is not boolean type. +func (n *Node) MustBool() bool { + v, err := n.GetBool() + if err != nil { + panic(err) + } + + return v +} + +// GetArray returns the array value if current node is array type. +// +// Usage: +// +// root := Must(Unmarshal([]byte(`["foo", 1]`))) +// arr, err := root.GetArray() +// if err != nil { +// t.Errorf("GetArray returns error: %v", err) +// } +// +// for _, val := range arr { +// println(val) +// } +// +// result: "foo", 1 +func (n *Node) GetArray() ([]*Node, error) { + if n == nil { + return nil, errors.New("node is nil") + } + + if n.nodeType != Array { + return nil, errors.New("node is not array") + } + + val, err := n.Value() + if err != nil { + return nil, err + } + + v, ok := val.([]*Node) + if !ok { + return nil, errors.New("node is not array") + } + + return v, nil +} + +// MustArray returns the array value if current node is array type. +// +// It panics if the current node is not array type. +func (n *Node) MustArray() []*Node { + v, err := n.GetArray() + if err != nil { + panic(err) + } + + return v +} + +// AppendArray appends the given values to the current array node. +// +// If the current node is not array type, it returns an error. +// +// Example 1: +// +// root := Must(Unmarshal([]byte(`[{"foo":"bar"}]`))) +// if err := root.AppendArray(NullNode("")); err != nil { +// t.Errorf("should not return error: %s", err) +// } +// +// result: [{"foo":"bar"}, null] +// +// Example 2: +// +// root := Must(Unmarshal([]byte(`["bar", "baz"]`))) +// err := root.AppendArray(NumberNode("", 1), StringNode("", "foo")) +// if err != nil { +// t.Errorf("AppendArray returns error: %v", err) +// } +// +// result: ["bar", "baz", 1, "foo"] +func (n *Node) AppendArray(value ...*Node) error { + if !n.IsArray() { + return errors.New("can't append value to non-array node") + } + + for _, val := range value { + if err := n.append(nil, val); err != nil { + return err + } + } + + n.mark() + return nil +} + +// ArrayEach executes the callback for each element in the JSON array. +// +// Usage: +// +// jsonArrayNode.ArrayEach(func(i int, valueNode *Node) { +// ufmt.Println(i, valueNode) +// }) +func (n *Node) ArrayEach(callback func(i int, target *Node)) { + if n == nil || !n.IsArray() { + return + } + + for idx := 0; idx < len(n.next); idx++ { + element, err := n.GetIndex(idx) + if err != nil { + continue + } + + callback(idx, element) + } +} + +// GetObject returns the object value if current node is object type. +// +// Usage: +// +// root := Must(Unmarshal([]byte(`{"key": "value"}`))) +// obj, err := root.GetObject() +// if err != nil { +// t.Errorf("GetObject returns error: %v", err) +// } +// +// result: map[string]*Node{"key": StringNode("key", "value")} +func (n *Node) GetObject() (map[string]*Node, error) { + if n == nil { + return nil, errors.New("node is nil") + } + + if !n.IsObject() { + return nil, errors.New("node is not object") + } + + val, err := n.Value() + if err != nil { + return nil, err + } + + v, ok := val.(map[string]*Node) + if !ok { + return nil, errors.New("node is not object") + } + + return v, nil +} + +// MustObject returns the object value if current node is object type. +// +// It panics if the current node is not object type. +func (n *Node) MustObject() map[string]*Node { + v, err := n.GetObject() + if err != nil { + panic(err) + } + + return v +} + +// AppendObject appends the given key and value to the current object node. +// +// If the current node is not object type, it returns an error. +func (n *Node) AppendObject(key string, value *Node) error { + if !n.IsObject() { + return errors.New("can't append value to non-object node") + } + + if err := n.append(&key, value); err != nil { + return err + } + + n.mark() + return nil +} + +// ObjectEach executes the callback for each key-value pair in the JSON object. +// +// Usage: +// +// jsonObjectNode.ObjectEach(func(key string, valueNode *Node) { +// ufmt.Println(key, valueNode) +// }) +func (n *Node) ObjectEach(callback func(key string, value *Node)) { + if n == nil || !n.IsObject() { + return + } + + for key, child := range n.next { + callback(key, child) + } +} + +// String converts the node to a string representation. +func (n *Node) String() string { + if n == nil { + return "" + } + + if n.ready() && !n.modified { + return string(n.source()) + } + + val, err := Marshal(n) + if err != nil { + return "error: " + err.Error() + } + + return string(val) +} + +// Path builds the path of the current node. +// +// For example: +// +// { "key": { "sub": [ "val1", "val2" ] }} +// +// The path of "val2" is: $.key.sub[1] +func (n *Node) Path() string { + if n == nil { + return "" + } + + var sb strings.Builder + + if n.prev == nil { + sb.WriteString("$") + } else { + sb.WriteString(n.prev.Path()) + + if n.key != nil { + sb.WriteString("['" + n.Key() + "']") + } else { + sb.WriteString("[" + strconv.Itoa(n.Index()) + "]") + } + } + + return sb.String() +} + +// mark marks the current node as modified. +func (n *Node) mark() { + node := n + for node != nil && !node.modified { + node.modified = true + node = node.prev + } +} + +// isContainer checks the current node type is array or object. +func (n *Node) isContainer() bool { + return n.IsArray() || n.IsObject() +} + +// remove removes the value from the current container type node. +func (n *Node) remove(v *Node) error { + if !n.isContainer() { + return ufmt.Errorf( + "can't remove value from non-array or non-object node. got=%s", + n.Type().String(), + ) + } + + if v.prev != n { + return errors.New("invalid parent node") + } + + n.mark() + if n.IsArray() { + delete(n.next, strconv.Itoa(*v.index)) + n.dropIndex(*v.index) + } else { + delete(n.next, *v.key) + } + + v.prev = nil + return nil +} + +// dropIndex rebase the index of current array node values. +func (n *Node) dropIndex(idx int) { + for i := idx + 1; i <= len(n.next); i++ { + prv := i - 1 + if curr, ok := n.next[strconv.Itoa(i)]; ok { + curr.index = &prv + n.next[strconv.Itoa(prv)] = curr + } + + delete(n.next, strconv.Itoa(i)) + } +} + +// append is a helper function to append the given value to the current container type node. +func (n *Node) append(key *string, val *Node) error { + if n.isSameOrParentNode(val) { + return errors.New("can't append same or parent node") + } + + if val.prev != nil { + if err := val.prev.remove(val); err != nil { + return err + } + } + + val.prev = n + val.key = key + + if key == nil { + size := len(n.next) + val.index = &size + n.next[strconv.Itoa(size)] = val + } else { + if old, ok := n.next[*key]; ok { + if err := n.remove(old); err != nil { + return err + } + } + n.next[*key] = val + } + + return nil +} + +func (n *Node) isSameOrParentNode(nd *Node) bool { + return n == nd || n.isParentNode(nd) +} + +func (n *Node) isParentNode(nd *Node) bool { + if n == nil { + return false + } + + for curr := nd.prev; curr != nil; curr = curr.prev { + if curr == n { + return true + } + } + + return false +} + +// cptrs returns the pointer of the given string value. +func cptrs(cpy *string) *string { + if cpy == nil { + return nil + } + + val := *cpy + + return &val +} + +// cptri returns the pointer of the given integer value. +func cptri(i *int) *int { + if i == nil { + return nil + } + + val := *i + return &val +} + +// Must panics if the given node is not fulfilled the expectation. +// Usage: +// +// node := Must(Unmarshal([]byte(`{"key": "value"}`)) +func Must(root *Node, expect error) *Node { + if expect != nil { + panic(expect) + } + + return root +} diff --git a/portal-loop/extracted/p/demo/json:0/node_test.gno b/portal-loop/extracted/p/demo/json:0/node_test.gno new file mode 100644 index 00000000..dbc82369 --- /dev/null +++ b/portal-loop/extracted/p/demo/json:0/node_test.gno @@ -0,0 +1,1392 @@ +package json + +import ( + "bytes" + "sort" + "strconv" + "strings" + "testing" + + "gno.land/p/demo/ufmt" +) + +var ( + nilKey *string + dummyKey = "key" +) + +type _args struct { + prev *Node + buf *buffer + typ ValueType + key **string +} + +type simpleNode struct { + name string + node *Node +} + +func TestNode_CreateNewNode(t *testing.T) { + rel := &dummyKey + + tests := []struct { + name string + args _args + expectCurr *Node + expectErr bool + expectPanic bool + }{ + { + name: "child for non container type", + args: _args{ + prev: BoolNode("", true), + buf: newBuffer(make([]byte, 10)), + typ: Boolean, + key: &rel, + }, + expectCurr: nil, + expectErr: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + defer func() { + if r := recover(); r != nil { + if tt.expectPanic { + return + } + t.Errorf("%s panic occurred when not expected: %v", tt.name, r) + } else if tt.expectPanic { + t.Errorf("%s expected panic but didn't occur", tt.name) + } + }() + + got, err := NewNode(tt.args.prev, tt.args.buf, tt.args.typ, tt.args.key) + if (err != nil) != tt.expectErr { + t.Errorf("%s error = %v, expect error %v", tt.name, err, tt.expectErr) + return + } + + if tt.expectErr { + return + } + + if !compareNodes(got, tt.expectCurr) { + t.Errorf("%s got = %v, want %v", tt.name, got, tt.expectCurr) + } + }) + } +} + +func TestNode_Value(t *testing.T) { + tests := []struct { + name string + data []byte + _type ValueType + expected interface{} + errExpected bool + }{ + {name: "null", data: []byte("null"), _type: Null, expected: nil}, + {name: "1", data: []byte("1"), _type: Number, expected: float64(1)}, + {name: ".1", data: []byte(".1"), _type: Number, expected: float64(.1)}, + {name: "-.1e1", data: []byte("-.1e1"), _type: Number, expected: float64(-1)}, + {name: "string", data: []byte("\"foo\""), _type: String, expected: "foo"}, + {name: "space", data: []byte("\"foo bar\""), _type: String, expected: "foo bar"}, + {name: "true", data: []byte("true"), _type: Boolean, expected: true}, + {name: "invalid true", data: []byte("tru"), _type: Unknown, errExpected: true}, + {name: "invalid false", data: []byte("fals"), _type: Unknown, errExpected: true}, + {name: "false", data: []byte("false"), _type: Boolean, expected: false}, + {name: "e1", data: []byte("e1"), _type: Unknown, errExpected: true}, + {name: "1a", data: []byte("1a"), _type: Unknown, errExpected: true}, + {name: "string error", data: []byte("\"foo\nbar\""), _type: String, errExpected: true}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + curr := &Node{ + data: tt.data, + nodeType: tt._type, + borders: [2]int{0, len(tt.data)}, + } + + got, err := curr.Value() + if err != nil { + if !tt.errExpected { + t.Errorf("%s error = %v, expect error %v", tt.name, err, tt.errExpected) + } + return + } + + if got != tt.expected { + t.Errorf("%s got = %v, want %v", tt.name, got, tt.expected) + } + }) + } +} + +func TestNode_Delete(t *testing.T) { + root := Must(Unmarshal([]byte(`{"foo":"bar"}`))) + if err := root.Delete(); err != nil { + t.Errorf("Delete returns error: %v", err) + } + + if value, err := Marshal(root); err != nil { + t.Errorf("Marshal returns error: %v", err) + } else if string(value) != `{"foo":"bar"}` { + t.Errorf("Marshal returns wrong value: %s", string(value)) + } + + foo := root.MustKey("foo") + if err := foo.Delete(); err != nil { + t.Errorf("Delete returns error while handling foo: %v", err) + } + + if value, err := Marshal(root); err != nil { + t.Errorf("Marshal returns error: %v", err) + } else if string(value) != `{}` { + t.Errorf("Marshal returns wrong value: %s", string(value)) + } + + if value, err := Marshal(foo); err != nil { + t.Errorf("Marshal returns error: %v", err) + } else if string(value) != `"bar"` { + t.Errorf("Marshal returns wrong value: %s", string(value)) + } + + if foo.prev != nil { + t.Errorf("foo.prev should be nil") + } +} + +func TestNode_ObjectNode(t *testing.T) { + objs := map[string]*Node{ + "key1": NullNode("null"), + "key2": NumberNode("answer", 42), + "key3": StringNode("string", "foobar"), + "key4": BoolNode("bool", true), + } + + node := ObjectNode("test", objs) + + if len(node.next) != len(objs) { + t.Errorf("ObjectNode: want %v got %v", len(objs), len(node.next)) + } + + for k, v := range objs { + if node.next[k] == nil { + t.Errorf("ObjectNode: want %v got %v", v, node.next[k]) + } + } +} + +func TestNode_AppendObject(t *testing.T) { + if err := Must(Unmarshal([]byte(`{"foo":"bar","baz":null}`))).AppendObject("biz", NullNode("")); err != nil { + t.Errorf("AppendArray should return error") + } + + root := Must(Unmarshal([]byte(`{"foo":"bar"}`))) + if err := root.AppendObject("baz", NullNode("")); err != nil { + t.Errorf("AppendObject should not return error: %s", err) + } + + if value, err := Marshal(root); err != nil { + t.Errorf("Marshal returns error: %v", err) + } else if isSameObject(string(value), `"{"foo":"bar","baz":null}"`) { + t.Errorf("Marshal returns wrong value: %s", string(value)) + } + + // FIXME: this may fail if execute test in more than 3 times in a row. + if err := root.AppendObject("biz", NumberNode("", 42)); err != nil { + t.Errorf("AppendObject returns error: %v", err) + } + + val, err := Marshal(root) + if err != nil { + t.Errorf("Marshal returns error: %v", err) + } + + // FIXME: this may fail if execute test in more than 3 times in a row. + if isSameObject(string(val), `"{"foo":"bar","baz":null,"biz":42}"`) { + t.Errorf("Marshal returns wrong value: %s", string(val)) + } +} + +func TestNode_ArrayNode(t *testing.T) { + arr := []*Node{ + NullNode("nil"), + NumberNode("num", 42), + StringNode("str", "foobar"), + BoolNode("bool", true), + } + + node := ArrayNode("test", arr) + + if len(node.next) != len(arr) { + t.Errorf("ArrayNode: want %v got %v", len(arr), len(node.next)) + } + + for i, v := range arr { + if node.next[strconv.Itoa(i)] == nil { + t.Errorf("ArrayNode: want %v got %v", v, node.next[strconv.Itoa(i)]) + } + } +} + +func TestNode_AppendArray(t *testing.T) { + if err := Must(Unmarshal([]byte(`[{"foo":"bar"}]`))).AppendArray(NullNode("")); err != nil { + t.Errorf("should return error") + } + + root := Must(Unmarshal([]byte(`[{"foo":"bar"}]`))) + if err := root.AppendArray(NullNode("")); err != nil { + t.Errorf("should not return error: %s", err) + } + + if value, err := Marshal(root); err != nil { + t.Errorf("Marshal returns error: %v", err) + } else if string(value) != `[{"foo":"bar"},null]` { + t.Errorf("Marshal returns wrong value: %s", string(value)) + } + + if err := root.AppendArray( + NumberNode("", 1), + StringNode("", "foo"), + Must(Unmarshal([]byte(`[0,1,null,true,"example"]`))), + Must(Unmarshal([]byte(`{"foo": true, "bar": null, "baz": 123}`))), + ); err != nil { + t.Errorf("AppendArray returns error: %v", err) + } + + if value, err := Marshal(root); err != nil { + t.Errorf("Marshal returns error: %v", err) + } else if string(value) != `[{"foo":"bar"},null,1,"foo",[0,1,null,true,"example"],{"foo": true, "bar": null, "baz": 123}]` { + t.Errorf("Marshal returns wrong value: %s", string(value)) + } +} + +/******** value getter ********/ + +func TestNode_GetBool(t *testing.T) { + root, err := Unmarshal([]byte(`true`)) + if err != nil { + t.Errorf("Error on Unmarshal(): %s", err.Error()) + return + } + + value, err := root.GetBool() + if err != nil { + t.Errorf("Error on root.GetBool(): %s", err.Error()) + } + + if !value { + t.Errorf("root.GetBool() is corrupted") + } +} + +func TestNode_GetBool_Fail(t *testing.T) { + tests := []simpleNode{ + {"nil node", (*Node)(nil)}, + {"literally null node", NullNode("")}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if _, err := tt.node.GetBool(); err == nil { + t.Errorf("%s should be an error", tt.name) + } + }) + } +} + +func TestNode_IsBool(t *testing.T) { + tests := []simpleNode{ + {"true", BoolNode("", true)}, + {"false", BoolNode("", false)}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if !tt.node.IsBool() { + t.Errorf("%s should be a bool", tt.name) + } + }) + } +} + +func TestNode_IsBool_With_Unmarshal(t *testing.T) { + tests := []struct { + name string + json []byte + want bool + }{ + {"true", []byte("true"), true}, + {"false", []byte("false"), true}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + root, err := Unmarshal(tt.json) + if err != nil { + t.Errorf("Error on Unmarshal(): %s", err.Error()) + } + + if root.IsBool() != tt.want { + t.Errorf("%s should be a bool", tt.name) + } + }) + } +} + +var nullJson = []byte(`null`) + +func TestNode_GetNull(t *testing.T) { + root, err := Unmarshal(nullJson) + if err != nil { + t.Errorf("Error on Unmarshal(): %s", err.Error()) + } + + value, err := root.GetNull() + if err != nil { + t.Errorf("error occurred while getting null, %s", err) + } + + if value != nil { + t.Errorf("value is not matched. expected: nil, got: %v", value) + } +} + +func TestNode_GetNull_Fail(t *testing.T) { + tests := []simpleNode{ + {"nil node", (*Node)(nil)}, + {"number node is null", NumberNode("", 42)}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if _, err := tt.node.GetNull(); err == nil { + t.Errorf("%s should be an error", tt.name) + } + }) + } +} + +func TestNode_MustNull(t *testing.T) { + root, err := Unmarshal(nullJson) + if err != nil { + t.Errorf("Error on Unmarshal(): %s", err.Error()) + } + + value := root.MustNull() + if value != nil { + t.Errorf("value is not matched. expected: nil, got: %v", value) + } +} + +func TestNode_GetNumeric_Float(t *testing.T) { + root, err := Unmarshal([]byte(`123.456`)) + if err != nil { + t.Errorf("Error on Unmarshal(): %s", err) + return + } + + value, err := root.GetNumeric() + if err != nil { + t.Errorf("Error on root.GetNumeric(): %s", err) + } + + if value != float64(123.456) { + t.Errorf(ufmt.Sprintf("value is not matched. expected: 123.456, got: %v", value)) + } +} + +func TestNode_GetNumeric_Scientific_Notation(t *testing.T) { + root, err := Unmarshal([]byte(`1e3`)) + if err != nil { + t.Errorf("Error on Unmarshal(): %s", err) + return + } + + value, err := root.GetNumeric() + if err != nil { + t.Errorf("Error on root.GetNumeric(): %s", err) + } + + if value != float64(1000) { + t.Errorf(ufmt.Sprintf("value is not matched. expected: 1000, got: %v", value)) + } +} + +func TestNode_GetNumeric_With_Unmarshal(t *testing.T) { + root, err := Unmarshal([]byte(`123`)) + if err != nil { + t.Errorf("Error on Unmarshal(): %s", err) + return + } + + value, err := root.GetNumeric() + if err != nil { + t.Errorf("Error on root.GetNumeric(): %s", err) + } + + if value != float64(123) { + t.Errorf(ufmt.Sprintf("value is not matched. expected: 123, got: %v", value)) + } +} + +func TestNode_GetNumeric_Fail(t *testing.T) { + tests := []simpleNode{ + {"nil node", (*Node)(nil)}, + {"null node", NullNode("")}, + {"string node", StringNode("", "123")}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if _, err := tt.node.GetNumeric(); err == nil { + t.Errorf("%s should be an error", tt.name) + } + }) + } +} + +func TestNode_GetString(t *testing.T) { + root, err := Unmarshal([]byte(`"123foobar 3456"`)) + if err != nil { + t.Errorf("Error on Unmarshal(): %s", err) + } + + value, err := root.GetString() + if err != nil { + t.Errorf("Error on root.GetString(): %s", err) + } + + if value != "123foobar 3456" { + t.Errorf(ufmt.Sprintf("value is not matched. expected: 123, got: %s", value)) + } +} + +func TestNode_GetString_Fail(t *testing.T) { + tests := []simpleNode{ + {"nil node", (*Node)(nil)}, + {"null node", NullNode("")}, + {"number node", NumberNode("", 123)}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if _, err := tt.node.GetString(); err == nil { + t.Errorf("%s should be an error", tt.name) + } + }) + } +} + +func TestNode_MustString(t *testing.T) { + tests := []struct { + name string + data []byte + }{ + {"foo", []byte(`"foo"`)}, + {"foo bar", []byte(`"foo bar"`)}, + {"", []byte(`""`)}, + {"안녕하세요", []byte(`"안녕하세요"`)}, + {"こんにちは", []byte(`"こんにちは"`)}, + {"你好", []byte(`"你好"`)}, + {"one \"encoded\" string", []byte(`"one \"encoded\" string"`)}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + root, err := Unmarshal(tt.data) + if err != nil { + t.Errorf("Error on Unmarshal(): %s", err) + } + + value := root.MustString() + if value != tt.name { + t.Errorf("value is not matched. expected: %s, got: %s", tt.name, value) + } + }) + } +} + +func TestUnmarshal_Array(t *testing.T) { + root, err := Unmarshal([]byte(" [1,[\"1\",[1,[1,2,3]]]]\r\n")) + if err != nil { + t.Errorf("Error on Unmarshal: %s", err.Error()) + } + + if root == nil { + t.Errorf("Error on Unmarshal: root is nil") + } + + if root.Type() != Array { + t.Errorf("Error on Unmarshal: wrong type") + } + + array, err := root.GetArray() + if err != nil { + t.Errorf("error occurred while getting array, %s", err) + } else if len(array) != 2 { + t.Errorf("expected 2 elements, got %d", len(array)) + } else if val, err := array[0].GetNumeric(); err != nil { + t.Errorf("value of array[0] is not numeric. got: %v", array[0].value) + } else if val != 1 { + t.Errorf("Error on array[0].GetNumeric(): expected to be '1', got: %v", val) + } else if val, err := array[1].GetArray(); err != nil { + t.Errorf("error occurred while getting array, %s", err.Error()) + } else if len(val) != 2 { + t.Errorf("Error on array[1].GetArray(): expected 2 elements, got %d", len(val)) + } else if el, err := val[0].GetString(); err != nil { + t.Errorf("error occurred while getting string, %s", err.Error()) + } else if el != "1" { + t.Errorf("Error on val[0].GetString(): expected to be '1', got: %s", el) + } +} + +var sampleArr = []byte(`[-1, 2, 3, 4, 5, 6]`) + +func TestNode_GetArray(t *testing.T) { + root, err := Unmarshal(sampleArr) + if err != nil { + t.Errorf("Error on Unmarshal(): %s", err) + return + } + + array, err := root.GetArray() + if err != nil { + t.Errorf("Error on root.GetArray(): %s", err) + } + + if len(array) != 6 { + t.Errorf(ufmt.Sprintf("length is not matched. expected: 3, got: %d", len(array))) + } + + for i, node := range array { + for j, val := range []int{-1, 2, 3, 4, 5, 6} { + if i == j { + if v, err := node.GetNumeric(); err != nil { + t.Errorf(ufmt.Sprintf("Error on node.GetNumeric(): %s", err)) + } else if v != float64(val) { + t.Errorf(ufmt.Sprintf("value is not matched. expected: %d, got: %v", val, v)) + } + } + } + } +} + +func TestNode_GetArray_Fail(t *testing.T) { + tests := []simpleNode{ + {"nil node", (*Node)(nil)}, + {"null node", NullNode("")}, + {"number node", NumberNode("", 123)}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if _, err := tt.node.GetArray(); err == nil { + t.Errorf("%s should be an error", tt.name) + } + }) + } +} + +func TestNode_IsArray(t *testing.T) { + root, err := Unmarshal(sampleArr) + if err != nil { + t.Errorf("Error on Unmarshal(): %s", err) + return + } + + if root.Type() != Array { + t.Errorf(ufmt.Sprintf("Must be an array. got: %s", root.Type().String())) + } +} + +func TestNode_ArrayEach(t *testing.T) { + tests := []struct { + name string + json string + expected []int + }{ + { + name: "empty array", + json: `[]`, + expected: []int{}, + }, + { + name: "single element", + json: `[42]`, + expected: []int{42}, + }, + { + name: "multiple elements", + json: `[1, 2, 3, 4, 5]`, + expected: []int{1, 2, 3, 4, 5}, + }, + { + name: "multiple elements but all values are same", + json: `[1, 1, 1, 1, 1]`, + expected: []int{1, 1, 1, 1, 1}, + }, + { + name: "multiple elements with non-numeric values", + json: `["a", "b", "c", "d", "e"]`, + expected: []int{}, + }, + { + name: "non-array node", + json: `{"not": "an array"}`, + expected: []int{}, + }, + { + name: "array containing numeric and non-numeric elements", + json: `["1", 2, 3, "4", 5, "6"]`, + expected: []int{2, 3, 5}, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + root, err := Unmarshal([]byte(tc.json)) + if err != nil { + t.Fatalf("Unmarshal failed: %v", err) + } + + var result []int // callback result + root.ArrayEach(func(index int, element *Node) { + if val, err := strconv.Atoi(element.String()); err == nil { + result = append(result, val) + } + }) + + if len(result) != len(tc.expected) { + t.Errorf("%s: expected %d elements, got %d", tc.name, len(tc.expected), len(result)) + return + } + + for i, val := range result { + if val != tc.expected[i] { + t.Errorf("%s: expected value at index %d to be %d, got %d", tc.name, i, tc.expected[i], val) + } + } + }) + } +} + +func TestNode_Key(t *testing.T) { + root, err := Unmarshal([]byte(`{"foo": true, "bar": null, "baz": 123, "biz": [1,2,3]}`)) + if err != nil { + t.Errorf("Error on Unmarshal(): %s", err.Error()) + } + + obj := root.MustObject() + for key, node := range obj { + if key != node.Key() { + t.Errorf("Key() = %v, want %v", node.Key(), key) + } + } + + keys := []string{"foo", "bar", "baz", "biz"} + for _, key := range keys { + if obj[key].Key() != key { + t.Errorf("Key() = %v, want %v", obj[key].Key(), key) + } + } + + // TODO: resolve stack overflow + // if root.MustKey("foo").Clone().Key() != "" { + // t.Errorf("wrong key found for cloned key") + // } + + if (*Node)(nil).Key() != "" { + t.Errorf("wrong key found for nil node") + } +} + +func TestNode_Size(t *testing.T) { + root, err := Unmarshal(sampleArr) + if err != nil { + t.Errorf("error occurred while unmarshal") + } + + size := root.Size() + if size != 6 { + t.Errorf(ufmt.Sprintf("Size() must be 6. got: %v", size)) + } + + if (*Node)(nil).Size() != 0 { + t.Errorf(ufmt.Sprintf("Size() must be 0. got: %v", (*Node)(nil).Size())) + } +} + +func TestNode_Index(t *testing.T) { + root, err := Unmarshal([]byte(`[1, 2, 3, 4, 5, 6]`)) + if err != nil { + t.Error("error occurred while unmarshal") + } + + arr := root.MustArray() + for i, node := range arr { + if i != node.Index() { + t.Errorf(ufmt.Sprintf("Index() must be nil. got: %v", i)) + } + } +} + +func TestNode_Index_Fail(t *testing.T) { + tests := []struct { + name string + node *Node + want int + }{ + {"nil node", (*Node)(nil), -1}, + {"null node", NullNode(""), -1}, + {"object node", ObjectNode("", nil), -1}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := tt.node.Index(); got != tt.want { + t.Errorf("Index() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestNode_GetIndex(t *testing.T) { + root := Must(Unmarshal([]byte(`[1, 2, 3, 4, 5, 6]`))) + expected := []int{1, 2, 3, 4, 5, 6} + + if len(expected) != root.Size() { + t.Errorf("length is not matched. expected: %d, got: %d", len(expected), root.Size()) + } + + // TODO: if length exceeds, stack overflow occurs. need to fix + for i, v := range expected { + val, err := root.GetIndex(i) + if err != nil { + t.Errorf("error occurred while getting index %d, %s", i, err) + } + + if val.MustNumeric() != float64(v) { + t.Errorf("value is not matched. expected: %d, got: %v", v, val.MustNumeric()) + } + } +} + +func TestNode_GetIndex_InputIndex_Exceed_Original_Node_Index(t *testing.T) { + root, err := Unmarshal([]byte(`[1, 2, 3, 4, 5, 6]`)) + if err != nil { + t.Errorf("error occurred while unmarshal") + } + + _, err = root.GetIndex(10) + if err == nil { + t.Errorf("GetIndex should return error") + } +} + +func TestNode_DeleteIndex(t *testing.T) { + tests := []struct { + name string + expected string + index int + ok bool + }{ + {`null`, ``, 0, false}, + {`1`, ``, 0, false}, + {`{}`, ``, 0, false}, + {`{"foo":"bar"}`, ``, 0, false}, + {`true`, ``, 0, false}, + {`[]`, ``, 0, false}, + {`[]`, ``, -1, false}, + {`[1]`, `[]`, 0, true}, + {`[{}]`, `[]`, 0, true}, + {`[{}, [], 42]`, `[{}, []]`, -1, true}, + {`[{}, [], 42]`, `[[], 42]`, 0, true}, + {`[{}, [], 42]`, `[{}, 42]`, 1, true}, + {`[{}, [], 42]`, `[{}, []]`, 2, true}, + {`[{}, [], 42]`, ``, 10, false}, + {`[{}, [], 42]`, ``, -10, false}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + root := Must(Unmarshal([]byte(tt.name))) + err := root.DeleteIndex(tt.index) + if err != nil && tt.ok { + t.Errorf("DeleteIndex returns error: %v", err) + } + }) + } +} + +func TestNode_GetKey(t *testing.T) { + root, err := Unmarshal([]byte(`{"foo": true, "bar": null}`)) + if err != nil { + t.Error("error occurred while unmarshal") + } + + value, err := root.GetKey("foo") + if err != nil { + t.Errorf("error occurred while getting key, %s", err) + } + + if value.MustBool() != true { + t.Errorf("value is not matched. expected: true, got: %v", value.MustBool()) + } + + value, err = root.GetKey("bar") + if err != nil { + t.Errorf("error occurred while getting key, %s", err) + } + + _, err = root.GetKey("baz") + if err == nil { + t.Errorf("key baz is not exist. must be failed") + } + + if value.MustNull() != nil { + t.Errorf("value is not matched. expected: nil, got: %v", value.MustNull()) + } +} + +func TestNode_GetKey_Fail(t *testing.T) { + tests := []simpleNode{ + {"nil node", (*Node)(nil)}, + {"null node", NullNode("")}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if _, err := tt.node.GetKey(""); err == nil { + t.Errorf("%s should be an error", tt.name) + } + }) + } +} + +func TestNode_GetUniqueKeyList(t *testing.T) { + tests := []struct { + name string + json string + expected []string + }{ + { + name: "simple foo/bar", + json: `{"foo": true, "bar": null}`, + expected: []string{"foo", "bar"}, + }, + { + name: "empty object", + json: `{}`, + expected: []string{}, + }, + { + name: "nested object", + json: `{ + "outer": { + "inner": { + "key": "value" + }, + "array": [1, 2, 3] + }, + "another": "item" + }`, + expected: []string{"outer", "inner", "key", "array", "another"}, + }, + { + name: "complex object", + json: `{ + "Image": { + "Width": 800, + "Height": 600, + "Title": "View from 15th Floor", + "Thumbnail": { + "Url": "http://www.example.com/image/481989943", + "Height": 125, + "Width": 100 + }, + "Animated": false, + "IDs": [116, 943, 234, 38793] + } + }`, + expected: []string{"Image", "Width", "Height", "Title", "Thumbnail", "Url", "Animated", "IDs"}, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + root, err := Unmarshal([]byte(tt.json)) + if err != nil { + t.Errorf("error occurred while unmarshal") + } + + value := root.UniqueKeyLists() + if len(value) != len(tt.expected) { + t.Errorf("%s length must be %v. got: %v. retrieved keys: %s", tt.name, len(tt.expected), len(value), value) + } + + for _, key := range value { + if !contains(tt.expected, key) { + t.Errorf("EachKey() must be in %v. got: %v", tt.expected, key) + } + } + }) + } +} + +// TODO: resolve stack overflow +func TestNode_IsEmpty(t *testing.T) { + tests := []struct { + name string + node *Node + expected bool + }{ + {"nil node", (*Node)(nil), false}, // nil node is not empty. + // {"null node", NullNode(""), true}, + {"empty object", ObjectNode("", nil), true}, + {"empty array", ArrayNode("", nil), true}, + {"non-empty object", ObjectNode("", map[string]*Node{"foo": BoolNode("foo", true)}), false}, + {"non-empty array", ArrayNode("", []*Node{BoolNode("0", true)}), false}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := tt.node.Empty(); got != tt.expected { + t.Errorf("%s = %v, want %v", tt.name, got, tt.expected) + } + }) + } +} + +func TestNode_Index_EmptyList(t *testing.T) { + root, err := Unmarshal([]byte(`[]`)) + if err != nil { + t.Errorf("error occurred while unmarshal") + } + + array := root.MustArray() + for i, node := range array { + if i != node.Index() { + t.Errorf(ufmt.Sprintf("Index() must be nil. got: %v", i)) + } + } +} + +func TestNode_GetObject(t *testing.T) { + root, err := Unmarshal([]byte(`{"foo": true,"bar": null}`)) + if err != nil { + t.Errorf("Error on Unmarshal(): %s", err.Error()) + return + } + + value, err := root.GetObject() + if err != nil { + t.Errorf("Error on root.GetObject(): %s", err.Error()) + } + + if _, ok := value["foo"]; !ok { + t.Errorf("root.GetObject() is corrupted: foo") + } + + if _, ok := value["bar"]; !ok { + t.Errorf("root.GetObject() is corrupted: bar") + } +} + +func TestNode_GetObject_Fail(t *testing.T) { + tests := []simpleNode{ + {"nil node", (*Node)(nil)}, + {"get object from null node", NullNode("")}, + {"not object node", NumberNode("", 123)}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if _, err := tt.node.GetObject(); err == nil { + t.Errorf("%s should be an error", tt.name) + } + }) + } +} + +func TestNode_ObjectEach(t *testing.T) { + tests := []struct { + name string + json string + expected map[string]int + }{ + { + name: "empty object", + json: `{}`, + expected: make(map[string]int), + }, + { + name: "single key-value pair", + json: `{"key": 42}`, + expected: map[string]int{"key": 42}, + }, + { + name: "multiple key-value pairs", + json: `{"one": 1, "two": 2, "three": 3}`, + expected: map[string]int{"one": 1, "two": 2, "three": 3}, + }, + { + name: "multiple key-value pairs with some non-numeric values", + json: `{"one": 1, "two": "2", "three": 3, "four": "4"}`, + expected: map[string]int{"one": 1, "three": 3}, + }, + { + name: "non-object node", + json: `["not", "an", "object"]`, + expected: make(map[string]int), + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + root, err := Unmarshal([]byte(tc.json)) + if err != nil { + t.Fatalf("Unmarshal failed: %v", err) + } + + result := make(map[string]int) + root.ObjectEach(func(key string, value *Node) { + // extract integer values from the object + if val, err := strconv.Atoi(value.String()); err == nil { + result[key] = val + } + }) + + if len(result) != len(tc.expected) { + t.Errorf("%s: expected %d key-value pairs, got %d", tc.name, len(tc.expected), len(result)) + return + } + + for key, val := range tc.expected { + if result[key] != val { + t.Errorf("%s: expected value for key %s to be %d, got %d", tc.name, key, val, result[key]) + } + } + }) + } +} + +func TestNode_ExampleMust(t *testing.T) { + data := []byte(`{ + "Image": { + "Width": 800, + "Height": 600, + "Title": "View from 15th Floor", + "Thumbnail": { + "Url": "http://www.example.com/image/481989943", + "Height": 125, + "Width": 100 + }, + "Animated" : false, + "IDs": [116, 943, 234, 38793] + } + }`) + + root := Must(Unmarshal(data)) + if root.Size() != 1 { + t.Errorf("root.Size() must be 1. got: %v", root.Size()) + } + + ufmt.Sprintf("Object has %d inheritors inside", root.Size()) + // Output: + // Object has 1 inheritors inside +} + +// Calculate AVG price from different types of objects, JSON from: https://goessner.net/articles/JsonPath/index.html#e3 +func TestExampleUnmarshal(t *testing.T) { + data := []byte(`{ "store": { + "book": [ + { "category": "reference", + "author": "Nigel Rees", + "title": "Sayings of the Century", + "price": 8.95 + }, + { "category": "fiction", + "author": "Evelyn Waugh", + "title": "Sword of Honour", + "price": 12.99 + }, + { "category": "fiction", + "author": "Herman Melville", + "title": "Moby Dick", + "isbn": "0-553-21311-3", + "price": 8.99 + }, + { "category": "fiction", + "author": "J. R. R. Tolkien", + "title": "The Lord of the Rings", + "isbn": "0-395-19395-8", + "price": 22.99 + } + ], + "bicycle": { "color": "red", + "price": 19.95 + }, + "tools": null + } +}`) + + root, err := Unmarshal(data) + if err != nil { + t.Errorf("error occurred when unmarshal") + } + + store := root.MustKey("store").MustObject() + + var prices float64 + size := 0 + for _, objects := range store { + if objects.IsArray() && objects.Size() > 0 { + size += objects.Size() + for _, object := range objects.MustArray() { + prices += object.MustKey("price").MustNumeric() + } + } else if objects.IsObject() && objects.HasKey("price") { + size++ + prices += objects.MustKey("price").MustNumeric() + } + } + + result := int(prices / float64(size)) + ufmt.Sprintf("AVG price: %d", result) +} + +func TestNode_ExampleMust_panic(t *testing.T) { + defer func() { + if r := recover(); r == nil { + t.Errorf("The code did not panic") + } + }() + data := []byte(`{]`) + root := Must(Unmarshal(data)) + ufmt.Sprintf("Object has %d inheritors inside", root.Size()) +} + +func TestNode_Path(t *testing.T) { + data := []byte(`{ + "Image": { + "Width": 800, + "Height": 600, + "Title": "View from 15th Floor", + "Thumbnail": { + "Url": "http://www.example.com/image/481989943", + "Height": 125, + "Width": 100 + }, + "Animated" : false, + "IDs": [116, 943, 234, 38793] + } + }`) + + root, err := Unmarshal(data) + if err != nil { + t.Errorf("Error on Unmarshal(): %s", err.Error()) + return + } + + if root.Path() != "$" { + t.Errorf("Wrong root.Path()") + } + + element := root.MustKey("Image").MustKey("Thumbnail").MustKey("Url") + if element.Path() != "$['Image']['Thumbnail']['Url']" { + t.Errorf("Wrong path found: %s", element.Path()) + } + + if (*Node)(nil).Path() != "" { + t.Errorf("Wrong (nil).Path()") + } +} + +func TestNode_Path2(t *testing.T) { + tests := []struct { + name string + node *Node + want string + }{ + { + name: "Node with key", + node: &Node{ + prev: &Node{}, + key: func() *string { s := "key"; return &s }(), + }, + want: "$['key']", + }, + { + name: "Node with index", + node: &Node{ + prev: &Node{}, + index: func() *int { i := 1; return &i }(), + }, + want: "$[1]", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := tt.node.Path(); got != tt.want { + t.Errorf("Path() = %v, want %v", got, tt.want) + } + }) + } +} + +func TestNode_Root(t *testing.T) { + root := &Node{} + child := &Node{prev: root} + grandChild := &Node{prev: child} + + tests := []struct { + name string + node *Node + want *Node + }{ + { + name: "Root node", + node: root, + want: root, + }, + { + name: "Child node", + node: child, + want: root, + }, + { + name: "Grandchild node", + node: grandChild, + want: root, + }, + { + name: "Node is nil", + node: nil, + want: nil, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + if got := tt.node.root(); got != tt.want { + t.Errorf("root() = %v, want %v", got, tt.want) + } + }) + } +} + +func contains(slice []string, item string) bool { + for _, a := range slice { + if a == item { + return true + } + } + + return false +} + +// ignore the sequence of keys by ordering them. +// need to avoid import encoding/json and reflect package. +// because gno does not support them for now. +// TODO: use encoding/json to compare the result after if possible in gno. +func isSameObject(a, b string) bool { + aPairs := strings.Split(strings.Trim(a, "{}"), ",") + bPairs := strings.Split(strings.Trim(b, "{}"), ",") + + aMap := make(map[string]string) + bMap := make(map[string]string) + for _, pair := range aPairs { + kv := strings.Split(pair, ":") + key := strings.Trim(kv[0], `"`) + value := strings.Trim(kv[1], `"`) + aMap[key] = value + } + for _, pair := range bPairs { + kv := strings.Split(pair, ":") + key := strings.Trim(kv[0], `"`) + value := strings.Trim(kv[1], `"`) + bMap[key] = value + } + + aKeys := make([]string, 0, len(aMap)) + bKeys := make([]string, 0, len(bMap)) + for k := range aMap { + aKeys = append(aKeys, k) + } + + for k := range bMap { + bKeys = append(bKeys, k) + } + + sort.Strings(aKeys) + sort.Strings(bKeys) + + if len(aKeys) != len(bKeys) { + return false + } + + for i := range aKeys { + if aKeys[i] != bKeys[i] { + return false + } + + if aMap[aKeys[i]] != bMap[bKeys[i]] { + return false + } + } + + return true +} + +func compareNodes(n1, n2 *Node) bool { + if n1 == nil || n2 == nil { + return n1 == n2 + } + + if n1.key != n2.key { + return false + } + + if !bytes.Equal(n1.data, n2.data) { + return false + } + + if n1.index != n2.index { + return false + } + + if n1.borders != n2.borders { + return false + } + + if n1.modified != n2.modified { + return false + } + + if n1.nodeType != n2.nodeType { + return false + } + + if !compareNodes(n1.prev, n2.prev) { + return false + } + + if len(n1.next) != len(n2.next) { + return false + } + + for k, v := range n1.next { + if !compareNodes(v, n2.next[k]) { + return false + } + } + + return true +} diff --git a/portal-loop/extracted/p/demo/json:0/parser.gno b/portal-loop/extracted/p/demo/json:0/parser.gno new file mode 100644 index 00000000..9a2c3a8c --- /dev/null +++ b/portal-loop/extracted/p/demo/json:0/parser.gno @@ -0,0 +1,185 @@ +package json + +import ( + "bytes" + "errors" + "strconv" + + el "gno.land/p/demo/json/eisel_lemire" +) + +const ( + absMinInt64 = 1 << 63 + maxInt64 = absMinInt64 - 1 + maxUint64 = 1<<64 - 1 +) + +const unescapeStackBufSize = 64 + +// PaseStringLiteral parses a string from the given byte slice. +func ParseStringLiteral(data []byte) (string, error) { + var buf [unescapeStackBufSize]byte + + bf, err := Unescape(data, buf[:]) + if err != nil { + return "", errors.New("invalid string input found while parsing string value") + } + + return string(bf), nil +} + +// ParseBoolLiteral parses a boolean value from the given byte slice. +func ParseBoolLiteral(data []byte) (bool, error) { + switch { + case bytes.Equal(data, trueLiteral): + return true, nil + case bytes.Equal(data, falseLiteral): + return false, nil + default: + return false, errors.New("JSON Error: malformed boolean value found while parsing boolean value") + } +} + +// PaseFloatLiteral parses a float64 from the given byte slice. +// +// It utilizes double-precision (64-bit) floating-point format as defined +// by the IEEE 754 standard, providing a decimal precision of approximately 15 digits. +func ParseFloatLiteral(bytes []byte) (float64, error) { + if len(bytes) == 0 { + return -1, errors.New("JSON Error: empty byte slice found while parsing float value") + } + + neg, bytes := trimNegativeSign(bytes) + + var exponentPart []byte + for i, c := range bytes { + if lower(c) == 'e' { + exponentPart = bytes[i+1:] + bytes = bytes[:i] + break + } + } + + man, exp10, err := extractMantissaAndExp10(bytes) + if err != nil { + return -1, err + } + + if len(exponentPart) > 0 { + exp, err := strconv.Atoi(string(exponentPart)) + if err != nil { + return -1, errors.New("JSON Error: invalid exponent value found while parsing float value") + } + exp10 += exp + } + + // for fast float64 conversion + f, success := el.EiselLemire64(man, exp10, neg) + if !success { + return 0, nil + } + + return f, nil +} + +func ParseIntLiteral(bytes []byte) (int64, error) { + if len(bytes) == 0 { + return 0, errors.New("JSON Error: empty byte slice found while parsing integer value") + } + + neg, bytes := trimNegativeSign(bytes) + + var n uint64 = 0 + for _, c := range bytes { + if notDigit(c) { + return 0, errors.New("JSON Error: non-digit characters found while parsing integer value") + } + + if n > maxUint64/10 { + return 0, errors.New("JSON Error: numeric value exceeds the range limit") + } + + n *= 10 + + n1 := n + uint64(c-'0') + if n1 < n { + return 0, errors.New("JSON Error: numeric value exceeds the range limit") + } + + n = n1 + } + + if n > maxInt64 { + if neg && n == absMinInt64 { + return -absMinInt64, nil + } + + return 0, errors.New("JSON Error: numeric value exceeds the range limit") + } + + if neg { + return -int64(n), nil + } + + return int64(n), nil +} + +// extractMantissaAndExp10 parses a byte slice representing a decimal number and extracts the mantissa and the exponent of its base-10 representation. +// It iterates through the bytes, constructing the mantissa by treating each byte as a digit. +// If a decimal point is encountered, the function keeps track of the position of the decimal point to calculate the exponent. +// The function ensures that: +// - The number contains at most one decimal point. +// - All characters in the byte slice are digits or a single decimal point. +// - The resulting mantissa does not overflow a uint64. +func extractMantissaAndExp10(bytes []byte) (uint64, int, error) { + var ( + man uint64 + exp10 int + decimalFound bool + ) + + for _, c := range bytes { + if c == dot { + if decimalFound { + return 0, 0, errors.New("JSON Error: multiple decimal points found while parsing float value") + } + decimalFound = true + continue + } + + if notDigit(c) { + return 0, 0, errors.New("JSON Error: non-digit characters found while parsing integer value") + } + + digit := uint64(c - '0') + + if man > (maxUint64-digit)/10 { + return 0, 0, errors.New("JSON Error: numeric value exceeds the range limit") + } + + man = man*10 + digit + + if decimalFound { + exp10-- + } + } + + return man, exp10, nil +} + +func trimNegativeSign(bytes []byte) (bool, []byte) { + if bytes[0] == minus { + return true, bytes[1:] + } + + return false, bytes +} + +func notDigit(c byte) bool { + return (c & 0xF0) != 0x30 +} + +// lower converts a byte to lower case if it is an uppercase letter. +func lower(c byte) byte { + return c | 0x20 +} diff --git a/portal-loop/extracted/p/demo/json:0/parser_test.gno b/portal-loop/extracted/p/demo/json:0/parser_test.gno new file mode 100644 index 00000000..078aa048 --- /dev/null +++ b/portal-loop/extracted/p/demo/json:0/parser_test.gno @@ -0,0 +1,188 @@ +package json + +import "testing" + +func TestParseStringLiteral(t *testing.T) { + tests := []struct { + input string + expected string + isError bool + }{ + {`"Hello, World!"`, "\"Hello, World!\"", false}, + {`\uFF11`, "\uFF11", false}, + {`\uFFFF`, "\uFFFF", false}, + {`true`, "true", false}, + {`false`, "false", false}, + {`\uDF00`, "", true}, + } + + for i, tt := range tests { + s, err := ParseStringLiteral([]byte(tt.input)) + + if !tt.isError && err != nil { + t.Errorf("%d. unexpected error: %s", i, err) + } + + if tt.isError && err == nil { + t.Errorf("%d. expected error, but not error", i) + } + + if s != tt.expected { + t.Errorf("%d. expected=%s, but actual=%s", i, tt.expected, s) + } + } +} + +func TestParseBoolLiteral(t *testing.T) { + tests := []struct { + input string + expected bool + isError bool + }{ + {`true`, true, false}, + {`false`, false, false}, + {`TRUE`, false, true}, + {`FALSE`, false, true}, + {`foo`, false, true}, + {`"true"`, false, true}, + {`"false"`, false, true}, + } + + for i, tt := range tests { + b, err := ParseBoolLiteral([]byte(tt.input)) + + if !tt.isError && err != nil { + t.Errorf("%d. unexpected error: %s", i, err) + } + + if tt.isError && err == nil { + t.Errorf("%d. expected error, but not error", i) + } + + if b != tt.expected { + t.Errorf("%d. expected=%t, but actual=%t", i, tt.expected, b) + } + } +} + +func TestParseFloatLiteral(t *testing.T) { + tests := []struct { + input string + expected float64 + }{ + {"123", 123}, + {"-123", -123}, + {"123.456", 123.456}, + {"-123.456", -123.456}, + {"12345678.1234567890", 12345678.1234567890}, + {"-12345678.09123456789", -12345678.09123456789}, + {"0.123", 0.123}, + {"-0.123", -0.123}, + {"", -1}, + {"abc", -1}, + {"123.45.6", -1}, + {"999999999999999999999", -1}, + } + + for _, tt := range tests { + t.Run(tt.input, func(t *testing.T) { + got, _ := ParseFloatLiteral([]byte(tt.input)) + if got != tt.expected { + t.Errorf("ParseFloatLiteral(%s): got %v, want %v", tt.input, got, tt.expected) + } + }) + } +} + +func TestParseFloatWithScientificNotation(t *testing.T) { + tests := []struct { + input string + expected float64 + }{ + {"1e6", 1000000}, + {"1E6", 1000000}, + {"1.23e10", 1.23e10}, + {"1.23E10", 1.23e10}, + {"-1.23e10", -1.23e10}, + {"-1.23E10", -1.23e10}, + {"2.45e-8", 2.45e-8}, + {"2.45E-8", 2.45e-8}, + {"-2.45e-8", -2.45e-8}, + {"-2.45E-8", -2.45e-8}, + {"5e0", 5}, + {"-5e0", -5}, + {"5E+0", 5}, + {"5e+1", 50}, + {"1e-1", 0.1}, + {"1E-1", 0.1}, + {"-1e-1", -0.1}, + {"-1E-1", -0.1}, + } + + for _, tt := range tests { + t.Run(tt.input, func(t *testing.T) { + got, err := ParseFloatLiteral([]byte(tt.input)) + if got != tt.expected { + t.Errorf("ParseFloatLiteral(%s): got %v, want %v", tt.input, got, tt.expected) + } + + if err != nil { + t.Errorf("ParseFloatLiteral(%s): got error %v", tt.input, err) + } + }) + } +} + +func TestParseFloat_May_Interoperability_Problem(t *testing.T) { + tests := []struct { + input string + shouldErr bool + }{ + {"3.141592653589793238462643383279", true}, + {"1E400", false}, // TODO: should error + } + + for _, tt := range tests { + t.Run(tt.input, func(t *testing.T) { + _, err := ParseFloatLiteral([]byte(tt.input)) + if tt.shouldErr && err == nil { + t.Errorf("ParseFloatLiteral(%s): expected error, but not error", tt.input) + } + }) + } +} + +func TestParseIntLiteral(t *testing.T) { + tests := []struct { + input string + expected int64 + }{ + {"0", 0}, + {"1", 1}, + {"-1", -1}, + {"12345", 12345}, + {"-12345", -12345}, + {"9223372036854775807", 9223372036854775807}, + {"-9223372036854775808", -9223372036854775808}, + {"-92233720368547758081", 0}, + {"18446744073709551616", 0}, + {"9223372036854775808", 0}, + {"-9223372036854775809", 0}, + {"", 0}, + {"abc", 0}, + {"12345x", 0}, + {"123e5", 0}, + {"9223372036854775807x", 0}, + {"27670116110564327410", 0}, + {"-27670116110564327410", 0}, + } + + for _, tt := range tests { + t.Run(tt.input, func(t *testing.T) { + got, _ := ParseIntLiteral([]byte(tt.input)) + if got != tt.expected { + t.Errorf("ParseIntLiteral(%s): got %v, want %v", tt.input, got, tt.expected) + } + }) + } +} diff --git a/portal-loop/extracted/p/demo/json:0/path.gno b/portal-loop/extracted/p/demo/json:0/path.gno new file mode 100644 index 00000000..31f7e046 --- /dev/null +++ b/portal-loop/extracted/p/demo/json:0/path.gno @@ -0,0 +1,78 @@ +package json + +import ( + "errors" +) + +// ParsePath takes a JSONPath string and returns a slice of strings representing the path segments. +func ParsePath(path string) ([]string, error) { + buf := newBuffer([]byte(path)) + result := make([]string, 0) + + for { + b, err := buf.current() + if err != nil { + break + } + + switch { + case b == dollarSign || b == atSign: + result = append(result, string(b)) + buf.step() + + case b == dot: + buf.step() + + if next, _ := buf.current(); next == dot { + buf.step() + result = append(result, "..") + + extractNextSegment(buf, &result) + } else { + extractNextSegment(buf, &result) + } + + case b == bracketOpen: + start := buf.index + buf.step() + + for { + if buf.index >= buf.length || buf.data[buf.index] == bracketClose { + break + } + + buf.step() + } + + if buf.index >= buf.length { + return nil, errors.New("unexpected end of path") + } + + segment := string(buf.sliceFromIndices(start+1, buf.index)) + result = append(result, segment) + + buf.step() + + default: + buf.step() + } + } + + return result, nil +} + +// extractNextSegment extracts the segment from the current index +// to the next significant character and adds it to the resulting slice. +func extractNextSegment(buf *buffer, result *[]string) { + start := buf.index + buf.skipToNextSignificantToken() + + if buf.index <= start { + return + } + + segment := string(buf.sliceFromIndices(start, buf.index)) + if segment != "" { + *result = append(*result, segment) + } +} diff --git a/portal-loop/extracted/p/demo/json:0/path_test.gno b/portal-loop/extracted/p/demo/json:0/path_test.gno new file mode 100644 index 00000000..f68e3eb6 --- /dev/null +++ b/portal-loop/extracted/p/demo/json:0/path_test.gno @@ -0,0 +1,62 @@ +package json + +import "testing" + +func TestParseJSONPath(t *testing.T) { + tests := []struct { + name string + path string + expected []string + }{ + {name: "Empty string path", path: "", expected: []string{}}, + {name: "Root only path", path: "$", expected: []string{"$"}}, + {name: "Root with dot path", path: "$.", expected: []string{"$"}}, + {name: "All objects in path", path: "$..", expected: []string{"$", ".."}}, + {name: "Only children in path", path: "$.*", expected: []string{"$", "*"}}, + {name: "All objects' children in path", path: "$..*", expected: []string{"$", "..", "*"}}, + {name: "Simple dot notation path", path: "$.root.element", expected: []string{"$", "root", "element"}}, + {name: "Complex dot notation path with wildcard", path: "$.root.*.element", expected: []string{"$", "root", "*", "element"}}, + {name: "Path with array wildcard", path: "$.phoneNumbers[*].type", expected: []string{"$", "phoneNumbers", "*", "type"}}, + {name: "Path with filter expression", path: "$.store.book[?(@.price < 10)].title", expected: []string{"$", "store", "book", "?(@.price < 10)", "title"}}, + {name: "Path with formula", path: "$..phoneNumbers..('ty' + 'pe')", expected: []string{"$", "..", "phoneNumbers", "..", "('ty' + 'pe')"}}, + {name: "Simple bracket notation path", path: "$['root']['element']", expected: []string{"$", "'root'", "'element'"}}, + {name: "Complex bracket notation path with wildcard", path: "$['root'][*]['element']", expected: []string{"$", "'root'", "*", "'element'"}}, + {name: "Bracket notation path with integer index", path: "$['store']['book'][0]['title']", expected: []string{"$", "'store'", "'book'", "0", "'title'"}}, + {name: "Complex path with wildcard in bracket notation", path: "$['root'].*['element']", expected: []string{"$", "'root'", "*", "'element'"}}, + {name: "Mixed notation path with dot after bracket", path: "$.['root'].*.['element']", expected: []string{"$", "'root'", "*", "'element'"}}, + {name: "Mixed notation path with dot before bracket", path: "$['root'].*.['element']", expected: []string{"$", "'root'", "*", "'element'"}}, + {name: "Single character path with root", path: "$.a", expected: []string{"$", "a"}}, + {name: "Multiple characters path with root", path: "$.abc", expected: []string{"$", "abc"}}, + {name: "Multiple segments path with root", path: "$.a.b.c", expected: []string{"$", "a", "b", "c"}}, + {name: "Multiple segments path with wildcard and root", path: "$.a.*.c", expected: []string{"$", "a", "*", "c"}}, + {name: "Multiple segments path with filter and root", path: "$.a[?(@.b == 'c')].d", expected: []string{"$", "a", "?(@.b == 'c')", "d"}}, + {name: "Complex path with multiple filters", path: "$.a[?(@.b == 'c')].d[?(@.e == 'f')].g", expected: []string{"$", "a", "?(@.b == 'c')", "d", "?(@.e == 'f')", "g"}}, + {name: "Complex path with multiple filters and wildcards", path: "$.a[?(@.b == 'c')].*.d[?(@.e == 'f')].g", expected: []string{"$", "a", "?(@.b == 'c')", "*", "d", "?(@.e == 'f')", "g"}}, + {name: "Path with array index and root", path: "$.a[0].b", expected: []string{"$", "a", "0", "b"}}, + {name: "Path with multiple array indices and root", path: "$.a[0].b[1].c", expected: []string{"$", "a", "0", "b", "1", "c"}}, + {name: "Path with array index, wildcard and root", path: "$.a[0].*.c", expected: []string{"$", "a", "0", "*", "c"}}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + reult, _ := ParsePath(tt.path) + if !isEqualSlice(reult, tt.expected) { + t.Errorf("ParsePath(%s) expected: %v, got: %v", tt.path, tt.expected, reult) + } + }) + } +} + +func isEqualSlice(a, b []string) bool { + if len(a) != len(b) { + return false + } + + for i, v := range a { + if v != b[i] { + return false + } + } + + return true +} diff --git a/portal-loop/extracted/p/demo/json:0/pkg_metadata.json b/portal-loop/extracted/p/demo/json:0/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/json:0/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/json:0/token.gno b/portal-loop/extracted/p/demo/json:0/token.gno new file mode 100644 index 00000000..4791850b --- /dev/null +++ b/portal-loop/extracted/p/demo/json:0/token.gno @@ -0,0 +1,76 @@ +package json + +const ( + bracketOpen = '[' + bracketClose = ']' + parenOpen = '(' + parenClose = ')' + curlyOpen = '{' + curlyClose = '}' + comma = ',' + dot = '.' + colon = ':' + backTick = '`' + singleQuote = '\'' + doubleQuote = '"' + emptyString = "" + whiteSpace = ' ' + plus = '+' + minus = '-' + aesterisk = '*' + bang = '!' + question = '?' + newLine = '\n' + tab = '\t' + carriageReturn = '\r' + formFeed = '\f' + backSpace = '\b' + slash = '/' + backSlash = '\\' + underScore = '_' + dollarSign = '$' + atSign = '@' + andSign = '&' + orSign = '|' +) + +var ( + trueLiteral = []byte("true") + falseLiteral = []byte("false") + nullLiteral = []byte("null") +) + +type ValueType int + +const ( + NotExist ValueType = iota + String + Number + Float + Object + Array + Boolean + Null + Unknown +) + +func (v ValueType) String() string { + switch v { + case NotExist: + return "not-exist" + case String: + return "string" + case Number: + return "number" + case Object: + return "object" + case Array: + return "array" + case Boolean: + return "boolean" + case Null: + return "null" + default: + return "unknown" + } +} diff --git a/portal-loop/extracted/p/demo/math_eval/int32/int32.gno b/portal-loop/extracted/p/demo/math_eval/int32/int32.gno new file mode 100644 index 00000000..8de3ea63 --- /dev/null +++ b/portal-loop/extracted/p/demo/math_eval/int32/int32.gno @@ -0,0 +1,494 @@ +// eval/int32 is a evaluator for int32 expressions. +// This code is heavily forked from https://github.com/dengsgo/math-engine +// which is licensed under Apache 2.0: +// https://raw.githubusercontent.com/dengsgo/math-engine/298e2b57b7e7350d0f67bd036916efd5709abe25/LICENSE +package int32 + +import ( + "errors" + "strconv" + "strings" + + "gno.land/p/demo/ufmt" +) + +const ( + Identifier = iota + Number // numbers + Operator // +, -, *, /, etc. + Variable // x, y, z, etc. (one-letter only) +) + +type expression interface { + String() string +} + +type expressionRaw struct { + expression string + Type int + Flag int + Offset int +} + +type parser struct { + Input string + ch byte + offset int + err error +} + +type expressionNumber struct { + Val int + Str string +} + +type expressionVariable struct { + Val int + Str string +} + +type expressionOperation struct { + Op string + Lhs, + Rhs expression +} + +type ast struct { + rawexpressions []*expressionRaw + source string + currentexpression *expressionRaw + currentIndex int + depth int + err error +} + +// Parse takes an expression string, e.g. "1+2" and returns +// a parsed expression. If there is an error it will return. +func Parse(s string) (ar expression, err error) { + toks, err := lexer(s) + if err != nil { + return + } + ast, err := newAST(toks, s) + if err != nil { + return + } + ar, err = ast.parseExpression() + return +} + +// Eval takes a parsed expression and a map of variables (or nil). The parsed +// expression is evaluated using any variables and returns the +// resulting int and/or error. +func Eval(expr expression, variables map[string]int) (res int, err error) { + if err != nil { + return + } + var l, r int + switch expr.(type) { + case expressionVariable: + ast := expr.(expressionVariable) + ok := false + if variables != nil { + res, ok = variables[ast.Str] + } + if !ok { + err = ufmt.Errorf("variable '%s' not found", ast.Str) + } + return + case expressionOperation: + ast := expr.(expressionOperation) + l, err = Eval(ast.Lhs, variables) + if err != nil { + return + } + r, err = Eval(ast.Rhs, variables) + if err != nil { + return + } + switch ast.Op { + case "+": + res = l + r + case "-": + res = l - r + case "*": + res = l * r + case "/": + if r == 0 { + err = ufmt.Errorf("violation of arithmetic specification: a division by zero in Eval: [%d/%d]", l, r) + return + } + res = l / r + case "%": + if r == 0 { + res = 0 + } else { + res = l % r + } + case "^": + res = l ^ r + case ">>": + res = l >> r + case "<<": + res = l << r + case ">": + if l > r { + res = 1 + } else { + res = 0 + } + case "<": + if l < r { + res = 1 + } else { + res = 0 + } + case "&": + res = l & r + case "|": + res = l | r + default: + + } + case expressionNumber: + res = expr.(expressionNumber).Val + } + + return +} + +func expressionError(s string, pos int) string { + r := strings.Repeat("-", len(s)) + "\n" + s += "\n" + for i := 0; i < pos; i++ { + s += " " + } + s += "^\n" + return r + s + r +} + +func (n expressionVariable) String() string { + return ufmt.Sprintf( + "expressionVariable: %s", + n.Str, + ) +} + +func (n expressionNumber) String() string { + return ufmt.Sprintf( + "expressionNumber: %s", + n.Str, + ) +} + +func (b expressionOperation) String() string { + return ufmt.Sprintf( + "expressionOperation: (%s %s %s)", + b.Op, + b.Lhs.String(), + b.Rhs.String(), + ) +} + +func newAST(toks []*expressionRaw, s string) (*ast, error) { + a := &ast{ + rawexpressions: toks, + source: s, + } + if a.rawexpressions == nil || len(a.rawexpressions) == 0 { + return a, errors.New("empty token") + } else { + a.currentIndex = 0 + a.currentexpression = a.rawexpressions[0] + } + return a, nil +} + +func (a *ast) parseExpression() (expression, error) { + a.depth++ // called depth + lhs := a.parsePrimary() + r := a.parseBinOpRHS(0, lhs) + a.depth-- + if a.depth == 0 && a.currentIndex != len(a.rawexpressions) && a.err == nil { + return r, ufmt.Errorf("bad expression, reaching the end or missing the operator\n%s", + expressionError(a.source, a.currentexpression.Offset)) + } + return r, nil +} + +func (a *ast) getNextexpressionRaw() *expressionRaw { + a.currentIndex++ + if a.currentIndex < len(a.rawexpressions) { + a.currentexpression = a.rawexpressions[a.currentIndex] + return a.currentexpression + } + return nil +} + +func (a *ast) getTokPrecedence() int { + switch a.currentexpression.expression { + case "/", "%", "*": + return 100 + case "<<", ">>": + return 80 + case "+", "-": + return 75 + case "<", ">": + return 70 + case "&": + return 60 + case "^": + return 50 + case "|": + return 40 + } + return -1 +} + +func (a *ast) parseNumber() expressionNumber { + f64, err := strconv.Atoi(a.currentexpression.expression) + if err != nil { + a.err = ufmt.Errorf("%v\nwant '(' or '0-9' but get '%s'\n%s", + err.Error(), + a.currentexpression.expression, + expressionError(a.source, a.currentexpression.Offset)) + return expressionNumber{} + } + n := expressionNumber{ + Val: f64, + Str: a.currentexpression.expression, + } + a.getNextexpressionRaw() + return n +} + +func (a *ast) parseVariable() expressionVariable { + n := expressionVariable{ + Val: 0, + Str: a.currentexpression.expression, + } + a.getNextexpressionRaw() + return n +} + +func (a *ast) parsePrimary() expression { + switch a.currentexpression.Type { + case Variable: + return a.parseVariable() + case Number: + return a.parseNumber() + case Operator: + if a.currentexpression.expression == "(" { + t := a.getNextexpressionRaw() + if t == nil { + a.err = ufmt.Errorf("want '(' or '0-9' but get EOF\n%s", + expressionError(a.source, a.currentexpression.Offset)) + return nil + } + e, _ := a.parseExpression() + if e == nil { + return nil + } + if a.currentexpression.expression != ")" { + a.err = ufmt.Errorf("want ')' but get %s\n%s", + a.currentexpression.expression, + expressionError(a.source, a.currentexpression.Offset)) + return nil + } + a.getNextexpressionRaw() + return e + } else if a.currentexpression.expression == "-" { + if a.getNextexpressionRaw() == nil { + a.err = ufmt.Errorf("want '0-9' but get '-'\n%s", + expressionError(a.source, a.currentexpression.Offset)) + return nil + } + bin := expressionOperation{ + Op: "-", + Lhs: expressionNumber{}, + Rhs: a.parsePrimary(), + } + return bin + } else { + return a.parseNumber() + } + default: + return nil + } +} + +func (a *ast) parseBinOpRHS(execPrec int, lhs expression) expression { + for { + tokPrec := a.getTokPrecedence() + if tokPrec < execPrec { + return lhs + } + binOp := a.currentexpression.expression + if a.getNextexpressionRaw() == nil { + a.err = ufmt.Errorf("want '(' or '0-9' but get EOF\n%s", + expressionError(a.source, a.currentexpression.Offset)) + return nil + } + rhs := a.parsePrimary() + if rhs == nil { + return nil + } + nextPrec := a.getTokPrecedence() + if tokPrec < nextPrec { + rhs = a.parseBinOpRHS(tokPrec+1, rhs) + if rhs == nil { + return nil + } + } + lhs = expressionOperation{ + Op: binOp, + Lhs: lhs, + Rhs: rhs, + } + } +} + +func lexer(s string) ([]*expressionRaw, error) { + p := &parser{ + Input: s, + err: nil, + ch: s[0], + } + toks := p.parse() + if p.err != nil { + return nil, p.err + } + return toks, nil +} + +func (p *parser) parse() []*expressionRaw { + toks := make([]*expressionRaw, 0) + for { + tok := p.nextTok() + if tok == nil { + break + } + toks = append(toks, tok) + } + return toks +} + +func (p *parser) nextTok() *expressionRaw { + if p.offset >= len(p.Input) || p.err != nil { + return nil + } + var err error + for p.isWhitespace(p.ch) && err == nil { + err = p.nextCh() + } + start := p.offset + var tok *expressionRaw + switch p.ch { + case + '(', + ')', + '+', + '-', + '*', + '/', + '^', + '&', + '|', + '%': + tok = &expressionRaw{ + expression: string(p.ch), + Type: Operator, + } + tok.Offset = start + err = p.nextCh() + case '>', '<': + tokS := string(p.ch) + bb, be := p.nextChPeek() + if be == nil && string(bb) == tokS { + tokS += string(p.ch) + } + tok = &expressionRaw{ + expression: tokS, + Type: Operator, + } + tok.Offset = start + if len(tokS) > 1 { + p.nextCh() + } + err = p.nextCh() + case + '0', + '1', + '2', + '3', + '4', + '5', + '6', + '7', + '8', + '9': + for p.isDigitNum(p.ch) && p.nextCh() == nil { + if (p.ch == '-' || p.ch == '+') && p.Input[p.offset-1] != 'e' { + break + } + } + tok = &expressionRaw{ + expression: strings.ReplaceAll(p.Input[start:p.offset], "_", ""), + Type: Number, + } + tok.Offset = start + default: + if p.isChar(p.ch) { + tok = &expressionRaw{ + expression: string(p.ch), + Type: Variable, + } + tok.Offset = start + err = p.nextCh() + } else if p.ch != ' ' { + p.err = ufmt.Errorf("symbol error: unknown '%v', pos [%v:]\n%s", + string(p.ch), + start, + expressionError(p.Input, start)) + } + } + return tok +} + +func (p *parser) nextChPeek() (byte, error) { + offset := p.offset + 1 + if offset < len(p.Input) { + return p.Input[offset], nil + } + return byte(0), errors.New("no byte") +} + +func (p *parser) nextCh() error { + p.offset++ + if p.offset < len(p.Input) { + p.ch = p.Input[p.offset] + return nil + } + return errors.New("EOF") +} + +func (p *parser) isWhitespace(c byte) bool { + return c == ' ' || + c == '\t' || + c == '\n' || + c == '\v' || + c == '\f' || + c == '\r' +} + +func (p *parser) isDigitNum(c byte) bool { + return '0' <= c && c <= '9' || c == '.' || c == '_' || c == 'e' || c == '-' || c == '+' +} + +func (p *parser) isChar(c byte) bool { + return 'a' <= c && c <= 'z' || 'A' <= c && c <= 'Z' +} + +func (p *parser) isWordChar(c byte) bool { + return p.isChar(c) || '0' <= c && c <= '9' +} diff --git a/portal-loop/extracted/p/demo/math_eval/int32/int32_test.gno b/portal-loop/extracted/p/demo/math_eval/int32/int32_test.gno new file mode 100644 index 00000000..a50a91fb --- /dev/null +++ b/portal-loop/extracted/p/demo/math_eval/int32/int32_test.gno @@ -0,0 +1,73 @@ +package int32 + +import "testing" + +func TestOne(t *testing.T) { + ttt := []struct { + exp string + res int + }{ + {"1", 1}, + {"--1", 1}, + {"1+2", 3}, + {"-1+2", 1}, + {"-(1+2)", -3}, + {"-(1+2)*5", -15}, + {"-(1+2)*5/3", -5}, + {"1+(-(1+2)*5/3)", -4}, + {"3^4", 3 ^ 4}, + {"8%2", 8 % 2}, + {"8%3", 8 % 3}, + {"8|3", 8 | 3}, + {"10%2", 0}, + {"(4 + 3)/2-1+11*15", (4+3)/2 - 1 + 11*15}, + { + "(30099>>10^30099>>11)%5*((30099>>14&3^30099>>15&1)+1)*30099%99 + ((3 + (30099 >> 14 & 3) - (30099 >> 16 & 1)) / 3 * 30099 % 99 & 64)", + (30099>>10^30099>>11)%5*((30099>>14&3^30099>>15&1)+1)*30099%99 + ((3 + (30099 >> 14 & 3) - (30099 >> 16 & 1)) / 3 * 30099 % 99 & 64), + }, + { + "(1023850>>10^1023850>>11)%5*((1023850>>14&3^1023850>>15&1)+1)*1023850%99 + ((3 + (1023850 >> 14 & 3) - (1023850 >> 16 & 1)) / 3 * 1023850 % 99 & 64)", + (1023850>>10^1023850>>11)%5*((1023850>>14&3^1023850>>15&1)+1)*1023850%99 + ((3 + (1023850 >> 14 & 3) - (1023850 >> 16 & 1)) / 3 * 1023850 % 99 & 64), + }, + {"((0000+1)*0000)", 0}, + } + for _, tc := range ttt { + t.Run(tc.exp, func(t *testing.T) { + exp, err := Parse(tc.exp) + if err != nil { + t.Errorf("%s:\n%s", tc.exp, err.Error()) + } else { + res, errEval := Eval(exp, nil) + if errEval != nil { + t.Errorf("eval error: %s", errEval.Error()) + } else if res != tc.res { + t.Errorf("%s:\nexpected %d, got %d", tc.exp, tc.res, res) + } + } + }) + } +} + +func TestVariables(t *testing.T) { + fn := func(x, y int) int { + return 1 + ((x*3+1)*(x*2))>>y + 1 + } + expr := "1 + ((x*3+1)*(x*2))>>y + 1" + exp, err := Parse(expr) + if err != nil { + t.Errorf("could not parse: %s", err.Error()) + } + variables := make(map[string]int) + for i := 0; i < 10; i++ { + variables["x"] = i + variables["y"] = 2 + res, errEval := Eval(exp, variables) + if errEval != nil { + t.Errorf("could not evaluate: %s", err.Error()) + } + expected := fn(variables["x"], variables["y"]) + if res != expected { + t.Errorf("expected: %d, actual: %d", expected, res) + } + } +} diff --git a/portal-loop/extracted/p/demo/math_eval/int32/pkg_metadata.json b/portal-loop/extracted/p/demo/math_eval/int32/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/math_eval/int32/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/memeland/memeland.gno b/portal-loop/extracted/p/demo/memeland/memeland.gno new file mode 100644 index 00000000..9c302ca3 --- /dev/null +++ b/portal-loop/extracted/p/demo/memeland/memeland.gno @@ -0,0 +1,240 @@ +package memeland + +import ( + "sort" + "std" + "strconv" + "strings" + "time" + + "gno.land/p/demo/avl" + "gno.land/p/demo/ownable" + "gno.land/p/demo/seqid" +) + +const ( + DATE_CREATED = "DATE_CREATED" + UPVOTES = "UPVOTES" +) + +type Post struct { + ID string + Data string + Author std.Address + Timestamp time.Time + UpvoteTracker *avl.Tree // address > struct{}{} +} + +type Memeland struct { + *ownable.Ownable + Posts []*Post + MemeCounter seqid.ID +} + +func NewMemeland() *Memeland { + return &Memeland{ + Ownable: ownable.New(), + Posts: make([]*Post, 0), + } +} + +// PostMeme - Adds a new post +func (m *Memeland) PostMeme(data string, timestamp int64) string { + if data == "" || timestamp <= 0 { + panic("timestamp or data cannot be empty") + } + + // Generate ID + id := m.MemeCounter.Next().String() + + newPost := &Post{ + ID: id, + Data: data, + Author: std.PrevRealm().Addr(), + Timestamp: time.Unix(timestamp, 0), + UpvoteTracker: avl.NewTree(), + } + + m.Posts = append(m.Posts, newPost) + return id +} + +func (m *Memeland) Upvote(id string) string { + post := m.getPost(id) + if post == nil { + panic("post with specified ID does not exist") + } + + caller := std.PrevRealm().Addr().String() + + if _, exists := post.UpvoteTracker.Get(caller); exists { + panic("user has already upvoted this post") + } + + post.UpvoteTracker.Set(caller, struct{}{}) + + return "upvote successful" +} + +// GetPostsInRange returns a JSON string of posts within the given timestamp range, supporting pagination +func (m *Memeland) GetPostsInRange(startTimestamp, endTimestamp int64, page, pageSize int, sortBy string) string { + if len(m.Posts) == 0 { + return "[]" + } + + if page < 1 { + panic("page number cannot be less than 1") + } + + // No empty pages + if pageSize < 1 { + panic("page size cannot be less than 1") + } + + // No pages larger than 10 + if pageSize > 10 { + panic("page size cannot be larger than 10") + } + + // Need to pass in a sort parameter + if sortBy == "" { + panic("sort order cannot be empty") + } + + var filteredPosts []*Post + + start := time.Unix(startTimestamp, 0) + end := time.Unix(endTimestamp, 0) + + // Filtering posts + for _, p := range m.Posts { + if !p.Timestamp.Before(start) && !p.Timestamp.After(end) { + filteredPosts = append(filteredPosts, p) + } + } + + switch sortBy { + // Sort by upvote descending + case UPVOTES: + dateSorter := PostSorter{ + Posts: filteredPosts, + LessF: func(i, j int) bool { + return filteredPosts[i].UpvoteTracker.Size() > filteredPosts[j].UpvoteTracker.Size() + }, + } + sort.Sort(dateSorter) + case DATE_CREATED: + // Sort by timestamp, beginning with newest + dateSorter := PostSorter{ + Posts: filteredPosts, + LessF: func(i, j int) bool { + return filteredPosts[i].Timestamp.After(filteredPosts[j].Timestamp) + }, + } + sort.Sort(dateSorter) + default: + panic("sort order can only be \"UPVOTES\" or \"DATE_CREATED\"") + } + + // Pagination + startIndex := (page - 1) * pageSize + endIndex := startIndex + pageSize + + // If page does not contain any posts + if startIndex >= len(filteredPosts) { + return "[]" + } + + // If page contains fewer posts than the page size + if endIndex > len(filteredPosts) { + endIndex = len(filteredPosts) + } + + // Return JSON representation of paginated and sorted posts + return PostsToJSONString(filteredPosts[startIndex:endIndex]) +} + +// RemovePost allows the owner to remove a post with a specific ID +func (m *Memeland) RemovePost(id string) string { + if id == "" { + panic("id cannot be empty") + } + + if err := m.CallerIsOwner(); err != nil { + panic(err) + } + + for i, post := range m.Posts { + if post.ID == id { + m.Posts = append(m.Posts[:i], m.Posts[i+1:]...) + return id + } + } + + panic("post with specified id does not exist") +} + +// PostsToJSONString converts a slice of Post structs into a JSON string +func PostsToJSONString(posts []*Post) string { + var sb strings.Builder + sb.WriteString("[") + + for i, post := range posts { + if i > 0 { + sb.WriteString(",") + } + + sb.WriteString(PostToJSONString(post)) + } + sb.WriteString("]") + + return sb.String() +} + +// PostToJSONString returns a Post formatted as a JSON string +func PostToJSONString(post *Post) string { + var sb strings.Builder + + sb.WriteString("{") + sb.WriteString(`"id":"` + post.ID + `",`) + sb.WriteString(`"data":"` + escapeString(post.Data) + `",`) + sb.WriteString(`"author":"` + escapeString(post.Author.String()) + `",`) + sb.WriteString(`"timestamp":"` + strconv.Itoa(int(post.Timestamp.Unix())) + `",`) + sb.WriteString(`"upvotes":` + strconv.Itoa(post.UpvoteTracker.Size())) + sb.WriteString("}") + + return sb.String() +} + +// escapeString escapes quotes in a string for JSON compatibility. +func escapeString(s string) string { + return strings.ReplaceAll(s, `"`, `\"`) +} + +func (m *Memeland) getPost(id string) *Post { + for _, p := range m.Posts { + if p.ID == id { + return p + } + } + + return nil +} + +// PostSorter is a flexible sorter for the *Post slice +type PostSorter struct { + Posts []*Post + LessF func(i, j int) bool +} + +func (p PostSorter) Len() int { + return len(p.Posts) +} + +func (p PostSorter) Swap(i, j int) { + p.Posts[i], p.Posts[j] = p.Posts[j], p.Posts[i] +} + +func (p PostSorter) Less(i, j int) bool { + return p.LessF(i, j) +} diff --git a/portal-loop/extracted/p/demo/memeland/memeland_test.gno b/portal-loop/extracted/p/demo/memeland/memeland_test.gno new file mode 100644 index 00000000..95065b8c --- /dev/null +++ b/portal-loop/extracted/p/demo/memeland/memeland_test.gno @@ -0,0 +1,282 @@ +package memeland + +import ( + "std" + "strings" + "testing" + "time" + + "gno.land/p/demo/testutils" + "gno.land/p/demo/uassert" + "gno.land/p/demo/ufmt" +) + +func TestPostMeme(t *testing.T) { + m := NewMemeland() + id := m.PostMeme("Test meme data", time.Now().Unix()) + uassert.NotEqual(t, "", string(id), "Expected valid ID, got empty string") +} + +func TestGetPostsInRangePagination(t *testing.T) { + m := NewMemeland() + now := time.Now() + + numOfPosts := 5 + var memeData []string + for i := 1; i <= numOfPosts; i++ { + // Prepare meme data + nextTime := now.Add(time.Duration(i) * time.Minute) + data := ufmt.Sprintf("Meme #%d", i) + memeData = append(memeData, data) + + m.PostMeme(data, nextTime.Unix()) + } + + // Get timestamps + beforeEarliest := now.Add(-1 * time.Minute) + afterLatest := now.Add(time.Duration(numOfPosts)*time.Minute + time.Minute) + + testCases := []struct { + page int + pageSize int + expectedNumOfPosts int + }{ + {page: 1, pageSize: 1, expectedNumOfPosts: 1}, // one per page + {page: 2, pageSize: 1, expectedNumOfPosts: 1}, // one on second page + {page: 1, pageSize: numOfPosts, expectedNumOfPosts: numOfPosts}, // all posts on single page + {page: 12, pageSize: 1, expectedNumOfPosts: 0}, // empty page + {page: 1, pageSize: numOfPosts + 1, expectedNumOfPosts: numOfPosts}, // page with fewer posts than its size + {page: 5, pageSize: numOfPosts / 5, expectedNumOfPosts: 1}, // evenly distribute posts per page + } + + for _, tc := range testCases { + t.Run(ufmt.Sprintf("Page%d_Size%d", tc.page, tc.pageSize), func(t *testing.T) { + result := m.GetPostsInRange(beforeEarliest.Unix(), afterLatest.Unix(), tc.page, tc.pageSize, "DATE_CREATED") + + // Count posts by how many times id: shows up in JSON string + postCount := strings.Count(result, `"id":"`) + uassert.Equal(t, tc.expectedNumOfPosts, postCount) + }) + } +} + +func TestGetPostsInRangeByTimestamp(t *testing.T) { + m := NewMemeland() + now := time.Now() + + numOfPosts := 5 + var memeData []string + for i := 1; i <= numOfPosts; i++ { + // Prepare meme data + nextTime := now.Add(time.Duration(i) * time.Minute) + data := ufmt.Sprintf("Meme #%d", i) + memeData = append(memeData, data) + + m.PostMeme(data, nextTime.Unix()) + } + + // Get timestamps + beforeEarliest := now.Add(-1 * time.Minute) + afterLatest := now.Add(time.Duration(numOfPosts)*time.Minute + time.Minute) + + // Default sort is by addition order/timestamp + jsonStr := m.GetPostsInRange( + beforeEarliest.Unix(), // start at earliest post + afterLatest.Unix(), // end at latest post + 1, // first page + numOfPosts, // all memes on the page + "DATE_CREATED", // sort by newest first + ) + + uassert.NotEmpty(t, jsonStr, "Expected non-empty JSON string, got empty string") + + // Count the number of posts returned in the JSON string as a rudimentary check for correct pagination/filtering + postCount := strings.Count(jsonStr, `"id":"`) + uassert.Equal(t, uint64(m.MemeCounter), uint64(postCount)) + + // Check if data is there + for _, expData := range memeData { + check := strings.Contains(jsonStr, expData) + uassert.True(t, check, ufmt.Sprintf("Expected %s in the JSON string, but counld't find it", expData)) + } + + // Check if ordering is correct, sort by created date + for i := 0; i < len(memeData)-2; i++ { + check := strings.Index(jsonStr, memeData[i]) >= strings.Index(jsonStr, memeData[i+1]) + uassert.True(t, check, ufmt.Sprintf("Expected %s to be before %s, but was at %d, and %d", memeData[i], memeData[i+1], i, i+1)) + } +} + +func TestGetPostsInRangeByUpvote(t *testing.T) { + m := NewMemeland() + now := time.Now() + + memeData1 := "Meme #1" + memeData2 := "Meme #2" + + // Create posts at specific times for testing + id1 := m.PostMeme(memeData1, now.Unix()) + id2 := m.PostMeme(memeData2, now.Add(time.Minute).Unix()) + + m.Upvote(id1) + m.Upvote(id2) + + // Change caller so avoid double upvote panic + std.TestSetOrigCaller(testutils.TestAddress("alice")) + m.Upvote(id1) + + // Final upvote count: + // Meme #1 - 2 upvote + // Meme #2 - 1 upvotes + + // Get timestamps + beforeEarliest := now.Add(-time.Minute) + afterLatest := now.Add(time.Hour) + + // Default sort is by addition order/timestamp + jsonStr := m.GetPostsInRange( + beforeEarliest.Unix(), // start at earliest post + afterLatest.Unix(), // end at latest post + 1, // first page + 2, // all memes on the page + "UPVOTES", // sort by upvote + ) + + uassert.NotEmpty(t, jsonStr, "Expected non-empty JSON string, got empty string") + + // Count the number of posts returned in the JSON string as a rudimentary check for correct pagination/filtering + postCount := strings.Count(jsonStr, `"id":"`) + uassert.Equal(t, uint64(m.MemeCounter), uint64(postCount)) + + // Check if ordering is correct + check := strings.Index(jsonStr, "Meme #1") <= strings.Index(jsonStr, "Meme #2") + uassert.True(t, check, ufmt.Sprintf("Expected %s to be before %s", memeData1, memeData2)) +} + +func TestBadSortBy(t *testing.T) { + m := NewMemeland() + now := time.Now() + + numOfPosts := 5 + var memeData []string + for i := 1; i <= numOfPosts; i++ { + // Prepare meme data + nextTime := now.Add(time.Duration(i) * time.Minute) + data := ufmt.Sprintf("Meme #%d", i) + memeData = append(memeData, data) + + m.PostMeme(data, nextTime.Unix()) + } + + // Get timestamps + beforeEarliest := now.Add(-1 * time.Minute) + afterLatest := now.Add(time.Duration(numOfPosts)*time.Minute + time.Minute) + + tests := []struct { + name string + sortBy string + wantPanic string + }{ + { + name: "Empty sortBy", + sortBy: "", + wantPanic: "runtime error: index out of range", + }, + { + name: "Wrong sortBy", + sortBy: "random string", + wantPanic: "", + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + defer func() { + if r := recover(); r == nil { + t.Errorf("code did not panic when it should have") + } + }() + + // Panics should be caught + _ = m.GetPostsInRange(beforeEarliest.Unix(), afterLatest.Unix(), 1, 1, tc.sortBy) + }) + } +} + +func TestNoPosts(t *testing.T) { + m := NewMemeland() + + // Add a post to Memeland + now := time.Now().Unix() + + jsonStr := m.GetPostsInRange(0, now, 1, 1, "DATE_CREATED") + + uassert.Equal(t, jsonStr, "[]") +} + +func TestUpvote(t *testing.T) { + m := NewMemeland() + + // Add a post to Memeland + now := time.Now().Unix() + postID := m.PostMeme("Test meme data", now) + + // Initial upvote count should be 0 + post := m.getPost(postID) + uassert.Equal(t, 0, post.UpvoteTracker.Size()) + + // Upvote the post + upvoteResult := m.Upvote(postID) + uassert.Equal(t, "upvote successful", upvoteResult) + + // Retrieve the post again and check the upvote count + post = m.getPost(postID) + uassert.Equal(t, 1, post.UpvoteTracker.Size()) +} + +func TestDelete(t *testing.T) { + alice := testutils.TestAddress("alice") + std.TestSetOrigCaller(alice) + + // Alice is admin + m := NewMemeland() + + // Set caller to Bob + bob := testutils.TestAddress("bob") + std.TestSetOrigCaller(bob) + + // Bob adds post to Memeland + now := time.Now() + postID := m.PostMeme("Meme #1", now.Unix()) + + // Alice removes Bob's post + std.TestSetOrigCaller(alice) + + id := m.RemovePost(postID) + uassert.Equal(t, postID, id, "post IDs not matching") + uassert.Equal(t, 0, len(m.Posts), "there should be 0 posts after removing") +} + +func TestDeleteByNonAdmin(t *testing.T) { + alice := testutils.TestAddress("alice") + std.TestSetOrigCaller(alice) + + m := NewMemeland() + + // Add a post to Memeland + now := time.Now() + postID := m.PostMeme("Meme #1", now.Unix()) + + // Bob will try to delete meme posted by Alice, which should fail + bob := testutils.TestAddress("bob") + std.TestSetOrigCaller(bob) + + defer func() { + if r := recover(); r == nil { + t.Errorf("code did not panic when it should have") + } + }() + + // Should panic - caught by defer + m.RemovePost(postID) +} diff --git a/portal-loop/extracted/p/demo/memeland/pkg_metadata.json b/portal-loop/extracted/p/demo/memeland/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/memeland/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/merkle/README.md b/portal-loop/extracted/p/demo/merkle/README.md new file mode 100644 index 00000000..77e7c854 --- /dev/null +++ b/portal-loop/extracted/p/demo/merkle/README.md @@ -0,0 +1,20 @@ +# p/demo/merkle + +This package implement a merkle tree that is complient with [merkletreejs](https://github.com/merkletreejs/merkletreejs) + +## [merkletreejs](https://github.com/merkletreejs/merkletreejs) + +```javascript +const { MerkleTree } = require("merkletreejs"); +const SHA256 = require("crypto-js/sha256"); + +let leaves = []; +for (let i = 0; i < 10; i++) { + leaves.push(SHA256(`node_${i}`)); +} + +const tree = new MerkleTree(leaves, SHA256); +const root = tree.getRoot().toString("hex"); + +console.log(root); // cd8a40502b0b92bf58e7432a5abb2d8b60121cf2b7966d6ebaf103f907a1bc21 +``` diff --git a/portal-loop/extracted/p/demo/merkle/merkle.gno b/portal-loop/extracted/p/demo/merkle/merkle.gno new file mode 100644 index 00000000..f4fcc4da --- /dev/null +++ b/portal-loop/extracted/p/demo/merkle/merkle.gno @@ -0,0 +1,143 @@ +package merkle + +import ( + "bytes" + "crypto/sha256" + "encoding/hex" + "errors" +) + +type Hashable interface { + Bytes() []byte +} + +type nodes []Node + +type Node struct { + hash []byte + + position uint8 +} + +func NewNode(hash []byte, position uint8) Node { + return Node{ + hash: hash, + position: position, + } +} + +func (n Node) Position() uint8 { + return n.position +} + +func (n Node) Hash() string { + return hex.EncodeToString(n.hash[:]) +} + +type Tree struct { + layers []nodes +} + +// Root return the merkle root of the tree +func (t *Tree) Root() string { + for _, l := range t.layers { + if len(l) == 1 { + return l[0].Hash() + } + } + return "" +} + +// NewTree create a new Merkle Tree +func NewTree(data []Hashable) *Tree { + tree := &Tree{} + + leaves := make([]Node, len(data)) + + for i, d := range data { + hash := sha256.Sum256(d.Bytes()) + leaves[i] = Node{hash: hash[:]} + } + + tree.layers = []nodes{nodes(leaves)} + + var buff bytes.Buffer + for len(leaves) > 1 { + level := make([]Node, 0, len(leaves)/2+1) + for i := 0; i < len(leaves); i += 2 { + buff.Reset() + + if i < len(leaves)-1 { + buff.Write(leaves[i].hash) + buff.Write(leaves[i+1].hash) + hash := sha256.Sum256(buff.Bytes()) + level = append(level, Node{ + hash: hash[:], + }) + } else { + level = append(level, leaves[i]) + } + } + leaves = level + tree.layers = append(tree.layers, level) + } + return tree +} + +// Proof return a MerkleProof +func (t *Tree) Proof(data Hashable) ([]Node, error) { + targetHash := sha256.Sum256(data.Bytes()) + targetIndex := -1 + + for i, layer := range t.layers[0] { + if bytes.Equal(targetHash[:], layer.hash) { + targetIndex = i + break + } + } + + if targetIndex == -1 { + return nil, errors.New("target not found") + } + + proofs := make([]Node, 0, len(t.layers)) + + for _, layer := range t.layers { + var pairIndex int + + if targetIndex%2 == 0 { + pairIndex = targetIndex + 1 + } else { + pairIndex = targetIndex - 1 + } + if pairIndex < len(layer) { + proofs = append(proofs, Node{ + hash: layer[pairIndex].hash, + position: uint8(targetIndex) % 2, + }) + } + targetIndex /= 2 + } + return proofs, nil +} + +// Verify if a merkle proof is valid +func (t *Tree) Verify(leaf Hashable, proofs []Node) bool { + return Verify(t.Root(), leaf, proofs) +} + +// Verify if a merkle proof is valid +func Verify(root string, leaf Hashable, proofs []Node) bool { + hash := sha256.Sum256(leaf.Bytes()) + + for i := 0; i < len(proofs); i += 1 { + var h []byte + if proofs[i].position == 0 { + h = append(hash[:], proofs[i].hash...) + } else { + h = append(proofs[i].hash, hash[:]...) + } + hash = sha256.Sum256(h) + } + return hex.EncodeToString(hash[:]) == root +} diff --git a/portal-loop/extracted/p/demo/merkle/merkle_test.gno b/portal-loop/extracted/p/demo/merkle/merkle_test.gno new file mode 100644 index 00000000..4aa99baa --- /dev/null +++ b/portal-loop/extracted/p/demo/merkle/merkle_test.gno @@ -0,0 +1,69 @@ +package merkle + +import ( + "fmt" + "testing" +) + +type testData struct { + content string +} + +func (d testData) Bytes() []byte { + return []byte(d.content) +} + +func TestMerkleTree(t *testing.T) { + tests := []struct { + size int + expected string + }{ + { + size: 1, + expected: "cf9f824bce7f5bc63d557b23591f58577f53fe29f974a615bdddbd0140f912f4", + }, + { + size: 3, + expected: "1a4a5f0fa267244bf9f74a63fdf2a87eed5e97e4bd104a9e94728c8fb5442177", + }, + { + size: 10, + expected: "cd8a40502b0b92bf58e7432a5abb2d8b60121cf2b7966d6ebaf103f907a1bc21", + }, + { + size: 1000, + expected: "fa533d2efdf12be26bc410dfa42936ac63361324e35e9b1ff54d422a1dd2388b", + }, + } + + for _, test := range tests { + var leaves []Hashable + for i := 0; i < test.size; i++ { + leaves = append(leaves, testData{fmt.Sprintf("node_%d", i)}) + } + + tree := NewTree(leaves) + + if tree == nil { + t.Error("Merkle tree creation failed") + } + + root := tree.Root() + + if root != test.expected { + t.Fatalf("merkle.Tree.Root(), expected: %s; got: %s", test.expected, root) + } + + for _, leaf := range leaves { + proofs, err := tree.Proof(leaf) + if err != nil { + t.Fatal("failed to proof leaf: %v, on tree: %v", leaf, test) + } + + ok := Verify(root, leaf, proofs) + if !ok { + t.Fatal("failed to verify leaf: %v, on tree: %v", leaf, tree) + } + } + } +} diff --git a/portal-loop/extracted/p/demo/merkle/pkg_metadata.json b/portal-loop/extracted/p/demo/merkle/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/merkle/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/microblog/microblog.gno b/portal-loop/extracted/p/demo/microblog/microblog.gno new file mode 100644 index 00000000..f6d6709f --- /dev/null +++ b/portal-loop/extracted/p/demo/microblog/microblog.gno @@ -0,0 +1,124 @@ +package microblog + +import ( + "errors" + "sort" + "std" + "strings" + "time" + + "gno.land/p/demo/avl" + "gno.land/p/demo/ufmt" +) + +var ( + ErrNotFound = errors.New("not found") + StatusNotFound = "404" +) + +type Microblog struct { + Title string + Prefix string // i.e. r/gnoland/blog: + Pages avl.Tree // author (string) -> Page +} + +func NewMicroblog(title string, prefix string) (m *Microblog) { + return &Microblog{ + Title: title, + Prefix: prefix, + Pages: avl.Tree{}, + } +} + +func (m *Microblog) GetPages() []*Page { + var ( + pages = make([]*Page, m.Pages.Size()) + index = 0 + ) + + m.Pages.Iterate("", "", func(key string, value interface{}) bool { + pages[index] = value.(*Page) + index++ + return false + }) + + sort.Sort(byLastPosted(pages)) + + return pages +} + +func (m *Microblog) NewPost(text string) error { + author := std.GetOrigCaller() + _, found := m.Pages.Get(author.String()) + if !found { + // make a new page for the new author + m.Pages.Set(author.String(), &Page{ + Author: author, + CreatedAt: time.Now(), + }) + } + + page, err := m.GetPage(author.String()) + if err != nil { + return err + } + return page.NewPost(text) +} + +func (m *Microblog) GetPage(author string) (*Page, error) { + silo, found := m.Pages.Get(author) + if !found { + return nil, ErrNotFound + } + return silo.(*Page), nil +} + +type Page struct { + ID int + Author std.Address + CreatedAt time.Time + LastPosted time.Time + Posts avl.Tree // time -> Post +} + +// byLastPosted implements sort.Interface for []Page based on +// the LastPosted field. +type byLastPosted []*Page + +func (a byLastPosted) Len() int { return len(a) } +func (a byLastPosted) Swap(i, j int) { a[i], a[j] = a[j], a[i] } +func (a byLastPosted) Less(i, j int) bool { return a[i].LastPosted.After(a[j].LastPosted) } + +func (p *Page) NewPost(text string) error { + now := time.Now() + p.LastPosted = now + p.Posts.Set(ufmt.Sprintf("%s%d", now.Format(time.RFC3339), p.Posts.Size()), &Post{ + ID: p.Posts.Size(), + Text: text, + CreatedAt: now, + }) + return nil +} + +func (p *Page) GetPosts() []*Post { + posts := make([]*Post, p.Posts.Size()) + i := 0 + p.Posts.ReverseIterate("", "", func(key string, value interface{}) bool { + postParsed := value.(*Post) + posts[i] = postParsed + i++ + return false + }) + return posts +} + +// Post lists the specific update +type Post struct { + ID int + CreatedAt time.Time + Text string +} + +func (p *Post) String() string { + return "> " + strings.ReplaceAll(p.Text, "\n", "\n>\n>") + "\n>\n> *" + p.CreatedAt.Format(time.RFC1123) + "*" +} diff --git a/portal-loop/extracted/p/demo/microblog/pkg_metadata.json b/portal-loop/extracted/p/demo/microblog/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/microblog/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/mux/doc.gno b/portal-loop/extracted/p/demo/mux/doc.gno new file mode 100644 index 00000000..8543228e --- /dev/null +++ b/portal-loop/extracted/p/demo/mux/doc.gno @@ -0,0 +1,36 @@ +// Package mux provides a simple routing and rendering library for handling dynamic path-based requests in Gno contracts. +// +// The `mux` package aims to offer similar functionality to `http.ServeMux` in Go, but for Gno's Render() requests. +// It allows you to define routes with dynamic parts and associate them with corresponding handler functions for rendering outputs. +// +// Usage: +// 1. Create a new Router instance using `NewRouter()` to handle routing and rendering logic. +// 2. Register routes and their associated handler functions using the `Handle(route, handler)` method. +// 3. Implement the rendering logic within the handler functions, utilizing the `Request` and `ResponseWriter` types. +// 4. Use the `Render(path)` method to process a given path and execute the corresponding handler function to obtain the rendered output. +// +// Route Patterns: +// Routes can include dynamic parts enclosed in braces, such as "users/{id}" or "hello/{name}". The `Request` object's `GetVar(key)` +// method allows you to extract the value of a specific variable from the path based on routing rules. +// +// Example: +// +// router := mux.NewRouter() +// +// // Define a route with a variable and associated handler function +// router.HandleFunc("hello/{name}", func(res *mux.ResponseWriter, req *mux.Request) { +// name := req.GetVar("name") +// if name != "" { +// res.Write("Hello, " + name + "!") +// } else { +// res.Write("Hello, world!") +// } +// }) +// +// // Render the output for the "/hello/Alice" path +// output := router.Render("hello/Alice") +// // Output: "Hello, Alice!" +// +// Note: The `mux` package provides a basic routing and rendering mechanism for simple use cases. For more advanced routing features, +// consider using more specialized libraries or frameworks. +package mux diff --git a/portal-loop/extracted/p/demo/mux/handler.gno b/portal-loop/extracted/p/demo/mux/handler.gno new file mode 100644 index 00000000..835d050a --- /dev/null +++ b/portal-loop/extracted/p/demo/mux/handler.gno @@ -0,0 +1,12 @@ +package mux + +type Handler struct { + Pattern string + Fn HandlerFunc +} + +type HandlerFunc func(*ResponseWriter, *Request) + +// TODO: type ErrHandlerFunc func(*ResponseWriter, *Request) error +// TODO: NotFoundHandler +// TODO: AutomaticIndex diff --git a/portal-loop/extracted/p/demo/mux/helpers.gno b/portal-loop/extracted/p/demo/mux/helpers.gno new file mode 100644 index 00000000..9b8c3edf --- /dev/null +++ b/portal-loop/extracted/p/demo/mux/helpers.gno @@ -0,0 +1,5 @@ +package mux + +func defaultNotFoundHandler(res *ResponseWriter, req *Request) { + res.Write("404") +} diff --git a/portal-loop/extracted/p/demo/mux/pkg_metadata.json b/portal-loop/extracted/p/demo/mux/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/mux/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/mux/request.gno b/portal-loop/extracted/p/demo/mux/request.gno new file mode 100644 index 00000000..f7996fe4 --- /dev/null +++ b/portal-loop/extracted/p/demo/mux/request.gno @@ -0,0 +1,35 @@ +package mux + +import "strings" + +// Request represents an incoming request. +type Request struct { + Path string + HandlerPath string +} + +// GetVar retrieves a variable from the path based on routing rules. +func (r *Request) GetVar(key string) string { + var ( + handlerParts = strings.Split(r.HandlerPath, "/") + reqParts = strings.Split(r.Path, "/") + ) + + for i := 0; i < len(handlerParts); i++ { + handlerPart := handlerParts[i] + switch { + case handlerPart == "*": + // XXX: implement a/b/*/d/e + panic("not implemented") + case strings.HasPrefix(handlerPart, "{") && strings.HasSuffix(handlerPart, "}"): + parameter := handlerPart[1 : len(handlerPart)-1] + if parameter == key { + return reqParts[i] + } + default: + // continue + } + } + + return "" +} diff --git a/portal-loop/extracted/p/demo/mux/request_test.gno b/portal-loop/extracted/p/demo/mux/request_test.gno new file mode 100644 index 00000000..5f8088b4 --- /dev/null +++ b/portal-loop/extracted/p/demo/mux/request_test.gno @@ -0,0 +1,39 @@ +package mux + +import ( + "fmt" + "testing" +) + +func TestRequest_GetVar(t *testing.T) { + cases := []struct { + handlerPath string + reqPath string + getVarKey string + expectedOutput string + }{ + {"users/{id}", "users/123", "id", "123"}, + {"users/123", "users/123", "id", ""}, + {"users/{id}", "users/123", "nonexistent", ""}, + {"a/{b}/c/{d}", "a/42/c/1337", "b", "42"}, + {"a/{b}/c/{d}", "a/42/c/1337", "d", "1337"}, + {"{a}", "foo", "a", "foo"}, + // TODO: wildcards: a/*/c + // TODO: multiple patterns per slashes: a/{b}-{c}/d + } + + for _, tt := range cases { + name := fmt.Sprintf("%s-%s", tt.handlerPath, tt.reqPath) + t.Run(name, func(t *testing.T) { + req := &Request{ + HandlerPath: tt.handlerPath, + Path: tt.reqPath, + } + + output := req.GetVar(tt.getVarKey) + if output != tt.expectedOutput { + t.Errorf("Expected '%q, but got %q", tt.expectedOutput, output) + } + }) + } +} diff --git a/portal-loop/extracted/p/demo/mux/response.gno b/portal-loop/extracted/p/demo/mux/response.gno new file mode 100644 index 00000000..a2a52c7c --- /dev/null +++ b/portal-loop/extracted/p/demo/mux/response.gno @@ -0,0 +1,20 @@ +package mux + +import "strings" + +// ResponseWriter represents the response writer. +type ResponseWriter struct { + output strings.Builder +} + +// Write appends data to the response output. +func (rw *ResponseWriter) Write(data string) { + rw.output.WriteString(data) +} + +// Output returns the final response output. +func (rw *ResponseWriter) Output() string { + return rw.output.String() +} + +// TODO: func (rw *ResponseWriter) Header()... diff --git a/portal-loop/extracted/p/demo/mux/router.gno b/portal-loop/extracted/p/demo/mux/router.gno new file mode 100644 index 00000000..a2efb3a4 --- /dev/null +++ b/portal-loop/extracted/p/demo/mux/router.gno @@ -0,0 +1,68 @@ +package mux + +import "strings" + +// Router handles the routing and rendering logic. +type Router struct { + routes []Handler + NotFoundHandler HandlerFunc +} + +// NewRouter creates a new Router instance. +func NewRouter() *Router { + return &Router{ + routes: make([]Handler, 0), + NotFoundHandler: defaultNotFoundHandler, + } +} + +// Render renders the output for the given path using the registered route handler. +func (r *Router) Render(reqPath string) string { + reqParts := strings.Split(reqPath, "/") + + for _, route := range r.routes { + patParts := strings.Split(route.Pattern, "/") + + if len(patParts) != len(reqParts) { + continue + } + + match := true + for i := 0; i < len(patParts); i++ { + patPart := patParts[i] + reqPart := reqParts[i] + + if patPart == "*" { + continue + } + if strings.HasPrefix(patPart, "{") && strings.HasSuffix(patPart, "}") { + continue + } + if patPart != reqPart { + match = false + break + } + } + if match { + req := &Request{ + Path: reqPath, + HandlerPath: route.Pattern, + } + res := &ResponseWriter{} + route.Fn(res, req) + return res.Output() + } + } + + // not found + req := &Request{Path: reqPath} + res := &ResponseWriter{} + r.NotFoundHandler(res, req) + return res.Output() +} + +// Handle registers a route and its handler function. +func (r *Router) HandleFunc(pattern string, fn HandlerFunc) { + route := Handler{Pattern: pattern, Fn: fn} + r.routes = append(r.routes, route) +} diff --git a/portal-loop/extracted/p/demo/mux/router_test.gno b/portal-loop/extracted/p/demo/mux/router_test.gno new file mode 100644 index 00000000..13fd5b97 --- /dev/null +++ b/portal-loop/extracted/p/demo/mux/router_test.gno @@ -0,0 +1,38 @@ +package mux + +import "testing" + +func TestRouter_Render(t *testing.T) { + // Define handlers and route configuration + router := NewRouter() + router.HandleFunc("hello/{name}", func(res *ResponseWriter, req *Request) { + name := req.GetVar("name") + if name != "" { + res.Write("Hello, " + name + "!") + } else { + res.Write("Hello, world!") + } + }) + router.HandleFunc("hi", func(res *ResponseWriter, req *Request) { + res.Write("Hi, earth!") + }) + + cases := []struct { + path string + expectedOutput string + }{ + {"hello/Alice", "Hello, Alice!"}, + {"hi", "Hi, earth!"}, + {"hello/Bob", "Hello, Bob!"}, + // TODO: {"hello", "Hello, world!"}, + // TODO: hello/, /hello, hello//Alice, hello/Alice/, hello/Alice/Bob, etc + } + for _, tt := range cases { + t.Run(tt.path, func(t *testing.T) { + output := router.Render(tt.path) + if output != tt.expectedOutput { + t.Errorf("Expected output %q, but got %q", tt.expectedOutput, output) + } + }) + } +} diff --git a/portal-loop/extracted/p/demo/nestedpkg/nestedpkg.gno b/portal-loop/extracted/p/demo/nestedpkg/nestedpkg.gno new file mode 100644 index 00000000..4c489f43 --- /dev/null +++ b/portal-loop/extracted/p/demo/nestedpkg/nestedpkg.gno @@ -0,0 +1,89 @@ +// Package nestedpkg provides helpers for package-path based access control. +// It is useful for upgrade patterns relying on namespaces. +package nestedpkg + +// To test this from a realm and have std.CurrentRealm/PrevRealm work correctly, +// this file is tested from gno.land/r/demo/tests/nestedpkg_test.gno +// XXX: move test to ths directory once we support testing a package and +// specifying values for both PrevRealm and CurrentRealm. + +import ( + "std" + "strings" +) + +// IsCallerSubPath checks if the caller realm is located in a subfolder of the current realm. +func IsCallerSubPath() bool { + var ( + cur = std.CurrentRealm().PkgPath() + "/" + prev = std.PrevRealm().PkgPath() + "/" + ) + return strings.HasPrefix(prev, cur) +} + +// AssertCallerIsSubPath panics if IsCallerSubPath returns false. +func AssertCallerIsSubPath() { + var ( + cur = std.CurrentRealm().PkgPath() + "/" + prev = std.PrevRealm().PkgPath() + "/" + ) + if !strings.HasPrefix(prev, cur) { + panic("call restricted to nested packages. current realm is " + cur + ", previous realm is " + prev) + } +} + +// IsCallerParentPath checks if the caller realm is located in a parent location of the current realm. +func IsCallerParentPath() bool { + var ( + cur = std.CurrentRealm().PkgPath() + "/" + prev = std.PrevRealm().PkgPath() + "/" + ) + return strings.HasPrefix(cur, prev) +} + +// AssertCallerIsParentPath panics if IsCallerParentPath returns false. +func AssertCallerIsParentPath() { + var ( + cur = std.CurrentRealm().PkgPath() + "/" + prev = std.PrevRealm().PkgPath() + "/" + ) + if !strings.HasPrefix(cur, prev) { + panic("call restricted to parent packages. current realm is " + cur + ", previous realm is " + prev) + } +} + +// IsSameNamespace checks if the caller realm and the current realm are in the same namespace. +func IsSameNamespace() bool { + var ( + cur = nsFromPath(std.CurrentRealm().PkgPath()) + "/" + prev = nsFromPath(std.PrevRealm().PkgPath()) + "/" + ) + return cur == prev +} + +// AssertIsSameNamespace panics if IsSameNamespace returns false. +func AssertIsSameNamespace() { + var ( + cur = nsFromPath(std.CurrentRealm().PkgPath()) + "/" + prev = nsFromPath(std.PrevRealm().PkgPath()) + "/" + ) + if cur != prev { + panic("call restricted to packages from the same namespace. current realm is " + cur + ", previous realm is " + prev) + } +} + +// nsFromPath extracts the namespace from a package path. +func nsFromPath(pkgpath string) string { + parts := strings.Split(pkgpath, "/") + + // Specifically for gno.land, potential paths are in the form of DOMAIN/r/NAMESPACE/... + // XXX: Consider extra checks. + // XXX: Support non gno.land domains, where p/ and r/ won't be enforced. + if len(parts) >= 3 { + return parts[2] + } + return "" +} + +// XXX: Consider adding IsCallerDirectlySubPath +// XXX: Consider adding IsCallerDirectlyParentPath diff --git a/portal-loop/extracted/p/demo/nestedpkg/pkg_metadata.json b/portal-loop/extracted/p/demo/nestedpkg/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/nestedpkg/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/ownable/errors.gno b/portal-loop/extracted/p/demo/ownable/errors.gno new file mode 100644 index 00000000..89776a6c --- /dev/null +++ b/portal-loop/extracted/p/demo/ownable/errors.gno @@ -0,0 +1,8 @@ +package ownable + +import "errors" + +var ( + ErrUnauthorized = errors.New("ownable: caller is not owner") + ErrInvalidAddress = errors.New("ownable: new owner address is invalid") +) diff --git a/portal-loop/extracted/p/demo/ownable/exts/authorizable/authorizable.gno b/portal-loop/extracted/p/demo/ownable/exts/authorizable/authorizable.gno new file mode 100644 index 00000000..f9f0ea15 --- /dev/null +++ b/portal-loop/extracted/p/demo/ownable/exts/authorizable/authorizable.gno @@ -0,0 +1,90 @@ +// Package authorizable is an extension of p/demo/ownable; +// It allows the user to instantiate an Authorizable struct, which extends +// p/demo/ownable with a list of users that are authorized for something. +// By using authorizable, you have a superuser (ownable), as well as another +// authorization level, which can be used for adding moderators or similar to your realm. +package authorizable + +import ( + "std" + + "gno.land/p/demo/avl" + "gno.land/p/demo/ownable" + "gno.land/p/demo/ufmt" +) + +type Authorizable struct { + *ownable.Ownable // owner in ownable is superuser + authorized *avl.Tree // std.Addr > struct{}{} +} + +func NewAuthorizable() *Authorizable { + a := &Authorizable{ + ownable.New(), + avl.NewTree(), + } + + // Add owner to auth list + a.authorized.Set(a.Owner().String(), struct{}{}) + return a +} + +func NewAuthorizableWithAddress(addr std.Address) *Authorizable { + a := &Authorizable{ + ownable.NewWithAddress(addr), + avl.NewTree(), + } + + // Add owner to auth list + a.authorized.Set(a.Owner().String(), struct{}{}) + return a +} + +func (a *Authorizable) AddToAuthList(addr std.Address) error { + if err := a.CallerIsOwner(); err != nil { + return ErrNotSuperuser + } + + if _, exists := a.authorized.Get(addr.String()); exists { + return ErrAlreadyInList + } + + a.authorized.Set(addr.String(), struct{}{}) + + return nil +} + +func (a *Authorizable) DeleteFromAuthList(addr std.Address) error { + if err := a.CallerIsOwner(); err != nil { + return ErrNotSuperuser + } + + if !a.authorized.Has(addr.String()) { + return ErrNotInAuthList + } + + if _, removed := a.authorized.Remove(addr.String()); !removed { + str := ufmt.Sprintf("authorizable: could not remove %s from auth list", addr.String()) + panic(str) + } + + return nil +} + +func (a Authorizable) CallerOnAuthList() error { + caller := std.PrevRealm().Addr() + + if !a.authorized.Has(caller.String()) { + return ErrNotInAuthList + } + + return nil +} + +func (a Authorizable) AssertOnAuthList() { + caller := std.PrevRealm().Addr() + + if !a.authorized.Has(caller.String()) { + panic(ErrNotInAuthList) + } +} diff --git a/portal-loop/extracted/p/demo/ownable/exts/authorizable/authorizable_test.gno b/portal-loop/extracted/p/demo/ownable/exts/authorizable/authorizable_test.gno new file mode 100644 index 00000000..10a5e411 --- /dev/null +++ b/portal-loop/extracted/p/demo/ownable/exts/authorizable/authorizable_test.gno @@ -0,0 +1,116 @@ +package authorizable + +import ( + "std" + "testing" + + "gno.land/p/demo/testutils" + "gno.land/p/demo/uassert" +) + +var ( + alice = testutils.TestAddress("alice") + bob = testutils.TestAddress("bob") + charlie = testutils.TestAddress("charlie") +) + +func TestNewAuthorizable(t *testing.T) { + std.TestSetRealm(std.NewUserRealm(alice)) + std.TestSetOrigCaller(alice) // TODO(bug, issue #2371): should not be needed + + a := NewAuthorizable() + got := a.Owner() + + if alice != got { + t.Fatalf("Expected %s, got: %s", alice, got) + } +} + +func TestNewAuthorizableWithAddress(t *testing.T) { + a := NewAuthorizableWithAddress(alice) + + got := a.Owner() + + if alice != got { + t.Fatalf("Expected %s, got: %s", alice, got) + } +} + +func TestCallerOnAuthList(t *testing.T) { + a := NewAuthorizableWithAddress(alice) + std.TestSetRealm(std.NewUserRealm(alice)) + std.TestSetOrigCaller(alice) + + if err := a.CallerOnAuthList(); err == ErrNotInAuthList { + t.Fatalf("expected alice to be on the list") + } +} + +func TestNotCallerOnAuthList(t *testing.T) { + a := NewAuthorizableWithAddress(alice) + std.TestSetRealm(std.NewUserRealm(bob)) + std.TestSetOrigCaller(bob) + + if err := a.CallerOnAuthList(); err == nil { + t.Fatalf("expected bob to not be on the list") + } +} + +func TestAddToAuthList(t *testing.T) { + a := NewAuthorizableWithAddress(alice) + std.TestSetRealm(std.NewUserRealm(alice)) + std.TestSetOrigCaller(alice) + + if err := a.AddToAuthList(bob); err != nil { + t.Fatalf("Expected no error, got %v", err) + } + + std.TestSetRealm(std.NewUserRealm(bob)) + std.TestSetOrigCaller(bob) + + if err := a.AddToAuthList(bob); err == nil { + t.Fatalf("Expected AddToAuth to error while bob called it, but it didn't") + } +} + +func TestDeleteFromList(t *testing.T) { + a := NewAuthorizableWithAddress(alice) + std.TestSetRealm(std.NewUserRealm(alice)) + std.TestSetOrigCaller(alice) + + if err := a.AddToAuthList(bob); err != nil { + t.Fatalf("Expected no error, got %v", err) + } + + if err := a.AddToAuthList(charlie); err != nil { + t.Fatalf("Expected no error, got %v", err) + } + + std.TestSetRealm(std.NewUserRealm(bob)) + std.TestSetOrigCaller(bob) + + // Try an unauthorized deletion + if err := a.DeleteFromAuthList(alice); err == nil { + t.Fatalf("Expected DelFromAuth to error with %v", err) + } + + std.TestSetRealm(std.NewUserRealm(alice)) + std.TestSetOrigCaller(alice) + + if err := a.DeleteFromAuthList(charlie); err != nil { + t.Fatalf("Expected no error, got %v", err) + } +} + +func TestAssertOnList(t *testing.T) { + std.TestSetRealm(std.NewUserRealm(alice)) + std.TestSetOrigCaller(alice) + a := NewAuthorizableWithAddress(alice) + + std.TestSetRealm(std.NewUserRealm(bob)) + std.TestSetOrigCaller(bob) + + uassert.PanicsWithMessage(t, ErrNotInAuthList.Error(), func() { + a.AssertOnAuthList() + }) +} diff --git a/portal-loop/extracted/p/demo/ownable/exts/authorizable/errors.gno b/portal-loop/extracted/p/demo/ownable/exts/authorizable/errors.gno new file mode 100644 index 00000000..4ba5983b --- /dev/null +++ b/portal-loop/extracted/p/demo/ownable/exts/authorizable/errors.gno @@ -0,0 +1,9 @@ +package authorizable + +import "errors" + +var ( + ErrNotInAuthList = errors.New("authorizable: caller is not in authorized list") + ErrNotSuperuser = errors.New("authorizable: caller is not superuser") + ErrAlreadyInList = errors.New("authorizable: address is already in authorized list") +) diff --git a/portal-loop/extracted/p/demo/ownable/exts/authorizable/pkg_metadata.json b/portal-loop/extracted/p/demo/ownable/exts/authorizable/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/ownable/exts/authorizable/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/ownable/ownable.gno b/portal-loop/extracted/p/demo/ownable/ownable.gno new file mode 100644 index 00000000..a77b2246 --- /dev/null +++ b/portal-loop/extracted/p/demo/ownable/ownable.gno @@ -0,0 +1,87 @@ +package ownable + +import "std" + +const OwnershipTransferEvent = "OwnershipTransfer" + +// Ownable is meant to be used as a top-level object to make your contract ownable OR +// being embedded in a Gno object to manage per-object ownership. +type Ownable struct { + owner std.Address +} + +func New() *Ownable { + return &Ownable{ + owner: std.PrevRealm().Addr(), + } +} + +func NewWithAddress(addr std.Address) *Ownable { + return &Ownable{ + owner: addr, + } +} + +// TransferOwnership transfers ownership of the Ownable struct to a new address +func (o *Ownable) TransferOwnership(newOwner std.Address) error { + err := o.CallerIsOwner() + if err != nil { + return err + } + + if !newOwner.IsValid() { + return ErrInvalidAddress + } + + prevOwner := o.owner + o.owner = newOwner + std.Emit( + OwnershipTransferEvent, + "from", string(prevOwner), + "to", string(newOwner), + ) + + return nil +} + +// DropOwnership removes the owner, effectively disabling any owner-related actions +// Top-level usage: disables all only-owner actions/functions, +// Embedded usage: behaves like a burn functionality, removing the owner from the struct +func (o *Ownable) DropOwnership() error { + err := o.CallerIsOwner() + if err != nil { + return err + } + + prevOwner := o.owner + o.owner = "" + + std.Emit( + OwnershipTransferEvent, + "from", string(prevOwner), + "to", "", + ) + + return nil +} + +// Owner returns the owner address from Ownable +func (o Ownable) Owner() std.Address { + return o.owner +} + +// CallerIsOwner checks if the caller of the function is the Realm's owner +func (o Ownable) CallerIsOwner() error { + if std.PrevRealm().Addr() == o.owner { + return nil + } + + return ErrUnauthorized +} + +// AssertCallerIsOwner panics if the caller is not the owner +func (o Ownable) AssertCallerIsOwner() { + if std.PrevRealm().Addr() != o.owner { + panic(ErrUnauthorized) + } +} diff --git a/portal-loop/extracted/p/demo/ownable/ownable_test.gno b/portal-loop/extracted/p/demo/ownable/ownable_test.gno new file mode 100644 index 00000000..a9d97154 --- /dev/null +++ b/portal-loop/extracted/p/demo/ownable/ownable_test.gno @@ -0,0 +1,116 @@ +package ownable + +import ( + "std" + "testing" + + "gno.land/p/demo/testutils" + "gno.land/p/demo/uassert" +) + +var ( + alice = testutils.TestAddress("alice") + bob = testutils.TestAddress("bob") +) + +func TestNew(t *testing.T) { + std.TestSetRealm(std.NewUserRealm(alice)) + std.TestSetOrigCaller(alice) // TODO(bug): should not be needed + + o := New() + got := o.Owner() + if alice != got { + t.Fatalf("Expected %s, got: %s", alice, got) + } +} + +func TestNewWithAddress(t *testing.T) { + o := NewWithAddress(alice) + + got := o.Owner() + if alice != got { + t.Fatalf("Expected %s, got: %s", alice, got) + } +} + +func TestOwner(t *testing.T) { + std.TestSetRealm(std.NewUserRealm(alice)) + + o := New() + expected := alice + got := o.Owner() + uassert.Equal(t, expected, got) +} + +func TestTransferOwnership(t *testing.T) { + std.TestSetRealm(std.NewUserRealm(alice)) + + o := New() + + err := o.TransferOwnership(bob) + if err != nil { + t.Fatalf("TransferOwnership failed, %v", err) + } + + got := o.Owner() + if bob != got { + t.Fatalf("Expected: %s, got: %s", bob, got) + } +} + +func TestCallerIsOwner(t *testing.T) { + std.TestSetRealm(std.NewUserRealm(alice)) + + o := New() + unauthorizedCaller := bob + + std.TestSetRealm(std.NewUserRealm(unauthorizedCaller)) + std.TestSetOrigCaller(unauthorizedCaller) // TODO(bug): should not be needed + + err := o.CallerIsOwner() + uassert.Error(t, err) // XXX: IsError(..., unauthorizedCaller) +} + +func TestDropOwnership(t *testing.T) { + std.TestSetRealm(std.NewUserRealm(alice)) + + o := New() + + err := o.DropOwnership() + uassert.NoError(t, err, "DropOwnership failed") + + owner := o.Owner() + uassert.Empty(t, owner, "owner should be empty") +} + +// Errors + +func TestErrUnauthorized(t *testing.T) { + std.TestSetRealm(std.NewUserRealm(alice)) + std.TestSetOrigCaller(alice) // TODO(bug): should not be needed + + o := New() + + std.TestSetRealm(std.NewUserRealm(bob)) + std.TestSetOrigCaller(bob) // TODO(bug): should not be needed + + err := o.TransferOwnership(alice) + if err != ErrUnauthorized { + t.Fatalf("Should've been ErrUnauthorized, was %v", err) + } + + err = o.DropOwnership() + uassert.ErrorContains(t, err, ErrUnauthorized.Error()) +} + +func TestErrInvalidAddress(t *testing.T) { + std.TestSetRealm(std.NewUserRealm(alice)) + + o := New() + + err := o.TransferOwnership("") + uassert.ErrorContains(t, err, ErrInvalidAddress.Error()) + + err = o.TransferOwnership("10000000001000000000100000000010000000001000000000") + uassert.ErrorContains(t, err, ErrInvalidAddress.Error()) +} diff --git a/portal-loop/extracted/p/demo/ownable/pkg_metadata.json b/portal-loop/extracted/p/demo/ownable/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/ownable/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/pausable/pausable.gno b/portal-loop/extracted/p/demo/pausable/pausable.gno new file mode 100644 index 00000000..eae3456b --- /dev/null +++ b/portal-loop/extracted/p/demo/pausable/pausable.gno @@ -0,0 +1,49 @@ +package pausable + +import "gno.land/p/demo/ownable" + +type Pausable struct { + *ownable.Ownable + paused bool +} + +// New returns a new Pausable struct with non-paused state as default +func New() *Pausable { + return &Pausable{ + Ownable: ownable.New(), + paused: false, + } +} + +// NewFromOwnable is the same as New, but with a pre-existing top-level ownable +func NewFromOwnable(ownable *ownable.Ownable) *Pausable { + return &Pausable{ + Ownable: ownable, + paused: false, + } +} + +// IsPaused checks if Pausable is paused +func (p Pausable) IsPaused() bool { + return p.paused +} + +// Pause sets the state of Pausable to true, meaning all pausable functions are paused +func (p *Pausable) Pause() error { + if err := p.CallerIsOwner(); err != nil { + return err + } + + p.paused = true + return nil +} + +// Unpause sets the state of Pausable to false, meaning all pausable functions are resumed +func (p *Pausable) Unpause() error { + if err := p.CallerIsOwner(); err != nil { + return err + } + + p.paused = false + return nil +} diff --git a/portal-loop/extracted/p/demo/pausable/pausable_test.gno b/portal-loop/extracted/p/demo/pausable/pausable_test.gno new file mode 100644 index 00000000..c9557245 --- /dev/null +++ b/portal-loop/extracted/p/demo/pausable/pausable_test.gno @@ -0,0 +1,61 @@ +package pausable + +import ( + "std" + "testing" + + "gno.land/p/demo/ownable" + "gno.land/p/demo/urequire" +) + +var ( + firstCaller = std.Address("g1l9aypkr8xfvs82zeux486ddzec88ty69lue9de") + secondCaller = std.Address("g127jydsh6cms3lrtdenydxsckh23a8d6emqcvfa") +) + +func TestNew(t *testing.T) { + std.TestSetOrigCaller(firstCaller) + + result := New() + + urequire.False(t, result.paused, "Expected result to be unpaused") + urequire.Equal(t, firstCaller.String(), result.Owner().String()) +} + +func TestNewFromOwnable(t *testing.T) { + std.TestSetOrigCaller(firstCaller) + o := ownable.New() + + std.TestSetOrigCaller(secondCaller) + result := NewFromOwnable(o) + + urequire.Equal(t, firstCaller.String(), result.Owner().String()) +} + +func TestSetUnpaused(t *testing.T) { + std.TestSetOrigCaller(firstCaller) + + result := New() + result.Unpause() + + urequire.False(t, result.IsPaused(), "Expected result to be unpaused") +} + +func TestSetPaused(t *testing.T) { + std.TestSetOrigCaller(firstCaller) + + result := New() + result.Pause() + + urequire.True(t, result.IsPaused(), "Expected result to be paused") +} + +func TestIsPaused(t *testing.T) { + std.TestSetOrigCaller(firstCaller) + + result := New() + urequire.False(t, result.IsPaused(), "Expected result to be unpaused") + + result.Pause() + urequire.True(t, result.IsPaused(), "Expected result to be paused") +} diff --git a/portal-loop/extracted/p/demo/pausable/pkg_metadata.json b/portal-loop/extracted/p/demo/pausable/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/pausable/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/printfdebugging/color.gno b/portal-loop/extracted/p/demo/printfdebugging/color.gno new file mode 100644 index 00000000..b3bf647b --- /dev/null +++ b/portal-loop/extracted/p/demo/printfdebugging/color.gno @@ -0,0 +1,81 @@ +package printfdebugging + +// consts copied from https://github.com/fatih/color/blob/main/color.go + +// Attribute defines a single SGR Code +type Attribute int + +const Escape = "\x1b" + +// Base attributes +const ( + Reset Attribute = iota + Bold + Faint + Italic + Underline + BlinkSlow + BlinkRapid + ReverseVideo + Concealed + CrossedOut +) + +const ( + ResetBold Attribute = iota + 22 + ResetItalic + ResetUnderline + ResetBlinking + _ + ResetReversed + ResetConcealed + ResetCrossedOut +) + +// Foreground text colors +const ( + FgBlack Attribute = iota + 30 + FgRed + FgGreen + FgYellow + FgBlue + FgMagenta + FgCyan + FgWhite +) + +// Foreground Hi-Intensity text colors +const ( + FgHiBlack Attribute = iota + 90 + FgHiRed + FgHiGreen + FgHiYellow + FgHiBlue + FgHiMagenta + FgHiCyan + FgHiWhite +) + +// Background text colors +const ( + BgBlack Attribute = iota + 40 + BgRed + BgGreen + BgYellow + BgBlue + BgMagenta + BgCyan + BgWhite +) + +// Background Hi-Intensity text colors +const ( + BgHiBlack Attribute = iota + 100 + BgHiRed + BgHiGreen + BgHiYellow + BgHiBlue + BgHiMagenta + BgHiCyan + BgHiWhite +) diff --git a/portal-loop/extracted/p/demo/printfdebugging/pkg_metadata.json b/portal-loop/extracted/p/demo/printfdebugging/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/printfdebugging/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/printfdebugging/printfdebugging.gno b/portal-loop/extracted/p/demo/printfdebugging/printfdebugging.gno new file mode 100644 index 00000000..a12a3dfa --- /dev/null +++ b/portal-loop/extracted/p/demo/printfdebugging/printfdebugging.gno @@ -0,0 +1,19 @@ +// this package is a joke... or not. +package printfdebugging + +import ( + "strings" + + "gno.land/p/demo/ufmt" +) + +func BigRedLine(args ...string) { + println(ufmt.Sprintf("%s[%dm####################################%s[%dm %s", + Escape, int(BgRed), Escape, int(Reset), + strings.Join(args, " "), + )) +} + +func Success() { + println(" \033[31mS\033[33mU\033[32mC\033[36mC\033[34mE\033[35mS\033[31mS\033[0m ") +} diff --git a/portal-loop/extracted/p/demo/rat/maths.gno b/portal-loop/extracted/p/demo/rat/maths.gno new file mode 100644 index 00000000..115e3cad --- /dev/null +++ b/portal-loop/extracted/p/demo/rat/maths.gno @@ -0,0 +1,21 @@ +package rat + +const ( + intSize = 32 << (^uint(0) >> 63) // 32 or 64 + + MaxInt = 1<<(intSize-1) - 1 + MinInt = -1 << (intSize - 1) + MaxInt8 = 1<<7 - 1 + MinInt8 = -1 << 7 + MaxInt16 = 1<<15 - 1 + MinInt16 = -1 << 15 + MaxInt32 = 1<<31 - 1 + MinInt32 = -1 << 31 + MaxInt64 = 1<<63 - 1 + MinInt64 = -1 << 63 + MaxUint = 1< 10 { + min = max - 10 + } + for i := max; i >= min; i-- { + release := c.releases[i] + output += release.Render() + } + return output + } + + release := c.ByVersion(path) + if release != nil { + return release.Render() + } + + return "no such release" +} + +func (c *changelog) Latest() *release { + if len(c.releases) > 0 { + pos := len(c.releases) - 1 + return &c.releases[pos] + } + return nil +} + +func (c *changelog) ByVersion(version string) *release { + for _, release := range c.releases { + if release.version == version { + return &release + } + } + return nil +} diff --git a/portal-loop/extracted/p/demo/releases/pkg_metadata.json b/portal-loop/extracted/p/demo/releases/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/releases/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/releases/release.gno b/portal-loop/extracted/p/demo/releases/release.gno new file mode 100644 index 00000000..9d3745b5 --- /dev/null +++ b/portal-loop/extracted/p/demo/releases/release.gno @@ -0,0 +1,38 @@ +package releases + +type release struct { + // manual + version string + url string + notes string + + // internal + isLatest bool + changelog *changelog +} + +func (r *release) URL() string { return r.url } +func (r *release) Version() string { return r.version } +func (r *release) Notes() string { return r.notes } +func (r *release) IsLatest() bool { return r.isLatest } + +func (r *release) Title() string { + output := r.changelog.name + " " + r.version + if r.isLatest { + output += " (latest)" + } + return output +} + +func (r *release) Link() string { + return "[" + r.Title() + "](" + r.url + ")" +} + +func (r *release) Render() string { + output := "" + output += "## " + r.Link() + "\n\n" + if r.notes != "" { + output += r.notes + "\n\n" + } + return output +} diff --git a/portal-loop/extracted/p/demo/seqid/README.md b/portal-loop/extracted/p/demo/seqid/README.md new file mode 100644 index 00000000..8b96f99c --- /dev/null +++ b/portal-loop/extracted/p/demo/seqid/README.md @@ -0,0 +1,36 @@ +# seqid + +``` +package seqid // import "gno.land/p/demo/seqid" + +Package seqid provides a simple way to have sequential IDs which will be ordered +correctly when inserted in an AVL tree. + +Sample usage: + + var id seqid.ID + var users avl.Tree + + func NewUser() { + users.Set(id.Next().Binary(), &User{ ... }) + } + +TYPES + +type ID uint64 + An ID is a simple sequential ID generator. + +func FromBinary(b string) (ID, bool) + FromBinary creates a new ID from the given string. + +func (i ID) Binary() string + Binary returns a big-endian binary representation of the ID, suitable to be + used as an AVL key. + +func (i *ID) Next() ID + Next advances the ID i. It will panic if increasing ID would overflow. + +func (i *ID) TryNext() (ID, bool) + TryNext increases i by 1 and returns its value. It returns true if + successful, or false if the increment would result in an overflow. +``` diff --git a/portal-loop/extracted/p/demo/seqid/pkg_metadata.json b/portal-loop/extracted/p/demo/seqid/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/seqid/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/seqid/seqid.gno b/portal-loop/extracted/p/demo/seqid/seqid.gno new file mode 100644 index 00000000..b3ff815a --- /dev/null +++ b/portal-loop/extracted/p/demo/seqid/seqid.gno @@ -0,0 +1,91 @@ +// Package seqid provides a simple way to have sequential IDs which will be +// ordered correctly when inserted in an AVL tree. +// +// Sample usage: +// +// var id seqid.ID +// var users avl.Tree +// +// func NewUser() { +// users.Set(id.Next().String(), &User{ ... }) +// } +package seqid + +import ( + "encoding/binary" + + "gno.land/p/demo/cford32" +) + +// An ID is a simple sequential ID generator. +type ID uint64 + +// Next advances the ID i. +// It will panic if increasing ID would overflow. +func (i *ID) Next() ID { + next, ok := i.TryNext() + if !ok { + panic("seqid: next ID overflows uint64") + } + return next +} + +const maxID ID = 1<<64 - 1 + +// TryNext increases i by 1 and returns its value. +// It returns true if successful, or false if the increment would result in +// an overflow. +func (i *ID) TryNext() (ID, bool) { + if *i == maxID { + // Addition will overflow. + return 0, false + } + *i++ + return *i, true +} + +// Binary returns a big-endian binary representation of the ID, +// suitable to be used as an AVL key. +func (i ID) Binary() string { + buf := make([]byte, 8) + binary.BigEndian.PutUint64(buf, uint64(i)) + return string(buf) +} + +// String encodes i using cford32's compact encoding. For more information, +// see the documentation for package [gno.land/p/demo/cford32]. +// +// The result of String will be a 7-byte string for IDs [0,2^34), and a +// 13-byte string for all values following that. All generated string IDs +// follow the same lexicographic order as their number values; that is, for any +// two IDs (x, y) such that x < y, x.String() < y.String(). +// As such, this string representation is suitable to be used as an AVL key. +func (i ID) String() string { + return string(cford32.PutCompact(uint64(i))) +} + +// FromBinary creates a new ID from the given string, expected to be a binary +// big-endian encoding of an ID (such as that of [ID.Binary]). +// The second return value is true if the conversion was successful. +func FromBinary(b string) (ID, bool) { + if len(b) != 8 { + return 0, false + } + return ID(binary.BigEndian.Uint64([]byte(b))), true +} + +// FromString creates a new ID from the given string, expected to be a string +// representation using cford32, such as that returned by [ID.String]. +// +// The encoding scheme used by cford32 allows the same ID to have many +// different representations (though the one returned by [ID.String] is only +// one, deterministic and safe to be used in AVL). The encoding scheme is +// "human-centric" and is thus case insensitive, and maps some ambiguous +// characters to be the same, ie. L = I = 1, O = 0. For this reason, when +// parsing user input to retrieve a key (encoded as a string), always sanitize +// it first using FromString, then run String(), instead of using the user's +// input directly. +func FromString(b string) (ID, error) { + n, err := cford32.Uint64([]byte(b)) + return ID(n), err +} diff --git a/portal-loop/extracted/p/demo/seqid/seqid_test.gno b/portal-loop/extracted/p/demo/seqid/seqid_test.gno new file mode 100644 index 00000000..0a1e777f --- /dev/null +++ b/portal-loop/extracted/p/demo/seqid/seqid_test.gno @@ -0,0 +1,68 @@ +package seqid + +import ( + "fmt" + "strings" + "testing" +) + +func TestID(t *testing.T) { + var i ID + + for j := 0; j < 100; j++ { + i.Next() + } + if i != 100 { + t.Fatalf("invalid: wanted %d got %d", 100, i) + } +} + +func TestID_Overflow(t *testing.T) { + i := ID(maxID) + + defer func() { + err := recover() + if !strings.Contains(fmt.Sprint(err), "next ID overflows") { + t.Errorf("did not overflow") + } + }() + + i.Next() +} + +func TestID_Binary(t *testing.T) { + var i ID + prev := i.Binary() + + for j := 0; j < 1000; j++ { + cur := i.Next().Binary() + if cur <= prev { + t.Fatalf("cur %x > prev %x", cur, prev) + } + prev = cur + } +} + +func TestID_String(t *testing.T) { + var i ID + prev := i.String() + + for j := 0; j < 1000; j++ { + cur := i.Next().String() + if cur <= prev { + t.Fatalf("cur %s > prev %s", cur, prev) + } + prev = cur + } + + // Test for when cford32 switches over to the long encoding. + i = 1<<34 - 512 + for j := 0; j < 1024; j++ { + cur := i.Next().String() + // println(cur) + if cur <= prev { + t.Fatalf("cur %s > prev %s", cur, prev) + } + prev = cur + } +} diff --git a/portal-loop/extracted/p/demo/stack/pkg_metadata.json b/portal-loop/extracted/p/demo/stack/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/stack/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/stack/stack.gno b/portal-loop/extracted/p/demo/stack/stack.gno new file mode 100644 index 00000000..1b8841f0 --- /dev/null +++ b/portal-loop/extracted/p/demo/stack/stack.gno @@ -0,0 +1,43 @@ +package stack + +type Stack struct { + top *node + length int +} + +type node struct { + value interface{} + prev *node +} + +func New() *Stack { + return &Stack{nil, 0} +} + +func (s *Stack) Len() int { + return s.length +} + +func (s *Stack) Top() interface{} { + if s.length == 0 { + return nil + } + return s.top.value +} + +func (s *Stack) Pop() interface{} { + if s.length == 0 { + return nil + } + + node := s.top + s.top = node.prev + s.length -= 1 + return node.value +} + +func (s *Stack) Push(value interface{}) { + node := &node{value, s.top} + s.top = node + s.length += 1 +} diff --git a/portal-loop/extracted/p/demo/stack/stack_test.gno b/portal-loop/extracted/p/demo/stack/stack_test.gno new file mode 100644 index 00000000..ee26ee3f --- /dev/null +++ b/portal-loop/extracted/p/demo/stack/stack_test.gno @@ -0,0 +1,28 @@ +package stack + +import "testing" + +func TestStack(t *testing.T) { + s := New() // Empty stack + + if s.Len() != 0 { + t.Errorf("s.Len(): expected 0; got %d", s.Len()) + } + + s.Push(1) + + if s.Len() != 1 { + t.Errorf("s.Len(): expected 1; got %d", s.Len()) + } + + if top := s.Top(); top.(int) != 1 { + t.Errorf("s.Top(): expected 1; got %v", top.(int)) + } + + if elem := s.Pop(); elem.(int) != 1 { + t.Errorf("s.Pop(): expected 1; got %v", elem.(int)) + } + if s.Len() != 0 { + t.Errorf("s.Len(): expected 0; got %d", s.Len()) + } +} diff --git a/portal-loop/extracted/p/demo/subscription/doc.gno b/portal-loop/extracted/p/demo/subscription/doc.gno new file mode 100644 index 00000000..9cc102fc --- /dev/null +++ b/portal-loop/extracted/p/demo/subscription/doc.gno @@ -0,0 +1,66 @@ +// Package subscription provides a flexible system for managing both recurring and +// lifetime subscriptions in Gno applications. It enables developers to handle +// payment-based access control for services or products. The library supports +// both subscriptions requiring periodic payments (recurring) and one-time payments +// (lifetime). Subscriptions are tracked using an AVL tree for efficient management +// of subscription statuses. +// +// Usage: +// +// Import the required sub-packages (`recurring` and/or `lifetime`) to manage specific +// subscription types. The methods provided allow users to subscribe, check subscription +// status, and manage payments. +// +// Recurring Subscription: +// +// Recurring subscriptions require periodic payments to maintain access. +// Users pay to extend their access for a specific duration. +// +// Example: +// +// // Create a recurring subscription requiring 100 ugnot every 30 days +// recSub := recurring.NewRecurringSubscription(time.Hour * 24 * 30, 100) +// +// // Process payment for the recurring subscription +// recSub.Subscribe() +// +// // Gift a recurring subscription to another user +// recSub.GiftSubscription(recipientAddress) +// +// // Check if a user has a valid subscription +// recSub.HasValidSubscription(addr) +// +// // Get the expiration date of the subscription +// recSub.GetExpiration(caller) +// +// // Update the subscription amount to 200 ugnot +// recSub.UpdateAmount(200) +// +// // Get the current subscription amount +// recSub.GetAmount() +// +// Lifetime Subscription: +// +// Lifetime subscriptions require a one-time payment for permanent access. +// Once paid, users have indefinite access without further payments. +// +// Example: +// +// // Create a lifetime subscription costing 500 ugnot +// lifeSub := lifetime.NewLifetimeSubscription(500) +// +// // Process payment for lifetime access +// lifeSub.Subscribe() +// +// // Gift a lifetime subscription to another user +// lifeSub.GiftSubscription(recipientAddress) +// +// // Check if a user has a valid subscription +// lifeSub.HasValidSubscription(addr) +// +// // Update the lifetime subscription amount to 1000 ugnot +// lifeSub.UpdateAmount(1000) +// +// // Get the current lifetime subscription amount +// lifeSub.GetAmount() +package subscription diff --git a/portal-loop/extracted/p/demo/subscription/lifetime/errors.gno b/portal-loop/extracted/p/demo/subscription/lifetime/errors.gno new file mode 100644 index 00000000..faeda4cd --- /dev/null +++ b/portal-loop/extracted/p/demo/subscription/lifetime/errors.gno @@ -0,0 +1,10 @@ +package lifetime + +import "errors" + +var ( + ErrNoSub = errors.New("lifetime subscription: no active subscription found") + ErrAmt = errors.New("lifetime subscription: payment amount does not match the required subscription amount") + ErrAlreadySub = errors.New("lifetime subscription: this address already has an active lifetime subscription") + ErrNotAuthorized = errors.New("lifetime subscription: action not authorized") +) diff --git a/portal-loop/extracted/p/demo/subscription/lifetime/lifetime.gno b/portal-loop/extracted/p/demo/subscription/lifetime/lifetime.gno new file mode 100644 index 00000000..8a4c10b6 --- /dev/null +++ b/portal-loop/extracted/p/demo/subscription/lifetime/lifetime.gno @@ -0,0 +1,81 @@ +package lifetime + +import ( + "std" + + "gno.land/p/demo/avl" + "gno.land/p/demo/ownable" +) + +// LifetimeSubscription represents a subscription that requires only a one-time payment. +// It grants permanent access to a service or product. +type LifetimeSubscription struct { + ownable.Ownable + amount int64 + subs *avl.Tree // std.Address -> bool +} + +// NewLifetimeSubscription creates and returns a new lifetime subscription. +func NewLifetimeSubscription(amount int64) *LifetimeSubscription { + return &LifetimeSubscription{ + Ownable: *ownable.New(), + amount: amount, + subs: avl.NewTree(), + } +} + +// processSubscription handles the subscription process for a given receiver. +func (ls *LifetimeSubscription) processSubscription(receiver std.Address) error { + amount := std.GetOrigSend() + + if amount.AmountOf("ugnot") != ls.amount { + return ErrAmt + } + + _, exists := ls.subs.Get(receiver.String()) + + if exists { + return ErrAlreadySub + } + + ls.subs.Set(receiver.String(), true) + + return nil +} + +// Subscribe processes the payment for a lifetime subscription. +func (ls *LifetimeSubscription) Subscribe() error { + caller := std.PrevRealm().Addr() + return ls.processSubscription(caller) +} + +// GiftSubscription allows the caller to pay for a lifetime subscription for another user. +func (ls *LifetimeSubscription) GiftSubscription(receiver std.Address) error { + return ls.processSubscription(receiver) +} + +// HasValidSubscription checks if the given address has an active lifetime subscription. +func (ls *LifetimeSubscription) HasValidSubscription(addr std.Address) error { + _, exists := ls.subs.Get(addr.String()) + + if !exists { + return ErrNoSub + } + + return nil +} + +// UpdateAmount allows the owner of the LifetimeSubscription contract to update the subscription price. +func (ls *LifetimeSubscription) UpdateAmount(newAmount int64) error { + if err := ls.CallerIsOwner(); err != nil { + return ErrNotAuthorized + } + + ls.amount = newAmount + return nil +} + +// GetAmount returns the current subscription price. +func (ls *LifetimeSubscription) GetAmount() int64 { + return ls.amount +} diff --git a/portal-loop/extracted/p/demo/subscription/lifetime/lifetime_test.gno b/portal-loop/extracted/p/demo/subscription/lifetime/lifetime_test.gno new file mode 100644 index 00000000..efbae90c --- /dev/null +++ b/portal-loop/extracted/p/demo/subscription/lifetime/lifetime_test.gno @@ -0,0 +1,105 @@ +package lifetime + +import ( + "std" + "testing" + + "gno.land/p/demo/testutils" + "gno.land/p/demo/uassert" +) + +var ( + alice = testutils.TestAddress("alice") + bob = testutils.TestAddress("bob") + charlie = testutils.TestAddress("charlie") +) + +func TestLifetimeSubscription(t *testing.T) { + std.TestSetRealm(std.NewUserRealm(alice)) + ls := NewLifetimeSubscription(1000) + + std.TestSetOrigSend([]std.Coin{{Denom: "ugnot", Amount: 1000}}, nil) + err := ls.Subscribe() + uassert.NoError(t, err, "Expected ProcessPayment to succeed") + + err = ls.HasValidSubscription(std.PrevRealm().Addr()) + uassert.NoError(t, err, "Expected Alice to have access") +} + +func TestLifetimeSubscriptionGift(t *testing.T) { + std.TestSetRealm(std.NewUserRealm(alice)) + ls := NewLifetimeSubscription(1000) + + std.TestSetOrigSend([]std.Coin{{Denom: "ugnot", Amount: 1000}}, nil) + err := ls.GiftSubscription(bob) + uassert.NoError(t, err, "Expected ProcessPaymentGift to succeed for Bob") + + err = ls.HasValidSubscription(bob) + uassert.NoError(t, err, "Expected Bob to have access") + + err = ls.HasValidSubscription(charlie) + uassert.Error(t, err, "Expected Charlie to fail access check") +} + +func TestUpdateAmountAuthorization(t *testing.T) { + std.TestSetRealm(std.NewUserRealm(alice)) + ls := NewLifetimeSubscription(1000) + + err := ls.UpdateAmount(2000) + uassert.NoError(t, err, "Expected Alice to succeed in updating amount") + + std.TestSetOrigCaller(bob) + + err = ls.UpdateAmount(3000) + uassert.Error(t, err, "Expected Bob to fail when updating amount") +} + +func TestIncorrectPaymentAmount(t *testing.T) { + std.TestSetRealm(std.NewUserRealm(alice)) + ls := NewLifetimeSubscription(1000) + + std.TestSetOrigSend([]std.Coin{{Denom: "ugnot", Amount: 500}}, nil) + err := ls.Subscribe() + uassert.Error(t, err, "Expected payment to fail with incorrect amount") +} + +func TestMultipleSubscriptionAttempts(t *testing.T) { + std.TestSetRealm(std.NewUserRealm(alice)) + ls := NewLifetimeSubscription(1000) + + std.TestSetOrigSend([]std.Coin{{Denom: "ugnot", Amount: 1000}}, nil) + err := ls.Subscribe() + uassert.NoError(t, err, "Expected first subscription to succeed") + + std.TestSetOrigSend([]std.Coin{{Denom: "ugnot", Amount: 1000}}, nil) + err = ls.Subscribe() + uassert.Error(t, err, "Expected second subscription to fail as Alice is already subscribed") +} + +func TestGiftSubscriptionWithIncorrectAmount(t *testing.T) { + std.TestSetRealm(std.NewUserRealm(alice)) + ls := NewLifetimeSubscription(1000) + + std.TestSetOrigSend([]std.Coin{{Denom: "ugnot", Amount: 500}}, nil) + err := ls.GiftSubscription(bob) + uassert.Error(t, err, "Expected gift subscription to fail with incorrect amount") + + err = ls.HasValidSubscription(bob) + uassert.Error(t, err, "Expected Bob to not have access after incorrect gift subscription") +} + +func TestUpdateAmountEffectiveness(t *testing.T) { + std.TestSetRealm(std.NewUserRealm(alice)) + ls := NewLifetimeSubscription(1000) + + err := ls.UpdateAmount(2000) + uassert.NoError(t, err, "Expected Alice to succeed in updating amount") + + std.TestSetOrigSend([]std.Coin{{Denom: "ugnot", Amount: 1000}}, nil) + err = ls.Subscribe() + uassert.Error(t, err, "Expected subscription to fail with old amount after update") + + std.TestSetOrigSend([]std.Coin{{Denom: "ugnot", Amount: 2000}}, nil) + err = ls.Subscribe() + uassert.NoError(t, err, "Expected subscription to succeed with new amount") +} diff --git a/portal-loop/extracted/p/demo/subscription/lifetime/pkg_metadata.json b/portal-loop/extracted/p/demo/subscription/lifetime/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/subscription/lifetime/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/subscription/pkg_metadata.json b/portal-loop/extracted/p/demo/subscription/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/subscription/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/subscription/recurring/errors.gno b/portal-loop/extracted/p/demo/subscription/recurring/errors.gno new file mode 100644 index 00000000..76a55e06 --- /dev/null +++ b/portal-loop/extracted/p/demo/subscription/recurring/errors.gno @@ -0,0 +1,11 @@ +package recurring + +import "errors" + +var ( + ErrNoSub = errors.New("recurring subscription: no active subscription found") + ErrSubExpired = errors.New("recurring subscription: your subscription has expired") + ErrAmt = errors.New("recurring subscription: payment amount does not match the required subscription amount") + ErrAlreadySub = errors.New("recurring subscription: this address already has an active subscription") + ErrNotAuthorized = errors.New("recurring subscription: action not authorized") +) diff --git a/portal-loop/extracted/p/demo/subscription/recurring/pkg_metadata.json b/portal-loop/extracted/p/demo/subscription/recurring/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/subscription/recurring/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/subscription/recurring/recurring.gno b/portal-loop/extracted/p/demo/subscription/recurring/recurring.gno new file mode 100644 index 00000000..b5277bd7 --- /dev/null +++ b/portal-loop/extracted/p/demo/subscription/recurring/recurring.gno @@ -0,0 +1,104 @@ +package recurring + +import ( + "std" + "time" + + "gno.land/p/demo/avl" + "gno.land/p/demo/ownable" +) + +// RecurringSubscription represents a subscription that requires periodic payments. +// It includes the duration of the subscription and the amount required per period. +type RecurringSubscription struct { + ownable.Ownable + duration time.Duration + amount int64 + subs *avl.Tree // std.Address -> time.Time +} + +// NewRecurringSubscription creates and returns a new recurring subscription. +func NewRecurringSubscription(duration time.Duration, amount int64) *RecurringSubscription { + return &RecurringSubscription{ + Ownable: *ownable.New(), + duration: duration, + amount: amount, + subs: avl.NewTree(), + } +} + +// HasValidSubscription verifies if the caller has an active recurring subscription. +func (rs *RecurringSubscription) HasValidSubscription(addr std.Address) error { + expTime, exists := rs.subs.Get(addr.String()) + if !exists { + return ErrNoSub + } + + if time.Now().After(expTime.(time.Time)) { + return ErrSubExpired + } + + return nil +} + +// processSubscription processes the payment for a given receiver and renews or adds their subscription. +func (rs *RecurringSubscription) processSubscription(receiver std.Address) error { + amount := std.GetOrigSend() + + if amount.AmountOf("ugnot") != rs.amount { + return ErrAmt + } + + expTime, exists := rs.subs.Get(receiver.String()) + + // If the user is already a subscriber but his subscription has expired, authorize renewal + if exists { + expiration := expTime.(time.Time) + if time.Now().Before(expiration) { + return ErrAlreadySub + } + } + + // Renew or add subscription + newExpiration := time.Now().Add(rs.duration) + rs.subs.Set(receiver.String(), newExpiration) + + return nil +} + +// Subscribe handles the payment for the caller's subscription. +func (rs *RecurringSubscription) Subscribe() error { + caller := std.PrevRealm().Addr() + + return rs.processSubscription(caller) +} + +// GiftSubscription allows the user to pay for a subscription for another user (receiver). +func (rs *RecurringSubscription) GiftSubscription(receiver std.Address) error { + return rs.processSubscription(receiver) +} + +// GetExpiration returns the expiration date of the recurring subscription for a given caller. +func (rs *RecurringSubscription) GetExpiration(addr std.Address) (time.Time, error) { + expTime, exists := rs.subs.Get(addr.String()) + if !exists { + return time.Time{}, ErrNoSub + } + + return expTime.(time.Time), nil +} + +// UpdateAmount allows the owner of the subscription contract to change the required subscription amount. +func (rs *RecurringSubscription) UpdateAmount(newAmount int64) error { + if err := rs.CallerIsOwner(); err != nil { + return ErrNotAuthorized + } + + rs.amount = newAmount + return nil +} + +// GetAmount returns the current amount required for each subscription period. +func (rs *RecurringSubscription) GetAmount() int64 { + return rs.amount +} diff --git a/portal-loop/extracted/p/demo/subscription/recurring/recurring_test.gno b/portal-loop/extracted/p/demo/subscription/recurring/recurring_test.gno new file mode 100644 index 00000000..e8bca15c --- /dev/null +++ b/portal-loop/extracted/p/demo/subscription/recurring/recurring_test.gno @@ -0,0 +1,134 @@ +package recurring + +import ( + "std" + "testing" + "time" + + "gno.land/p/demo/testutils" + "gno.land/p/demo/uassert" +) + +var ( + alice = testutils.TestAddress("alice") + bob = testutils.TestAddress("bob") + charlie = testutils.TestAddress("charlie") +) + +func TestRecurringSubscription(t *testing.T) { + std.TestSetRealm(std.NewUserRealm(alice)) + rs := NewRecurringSubscription(time.Hour*24, 1000) + + std.TestSetOrigSend([]std.Coin{{Denom: "ugnot", Amount: 1000}}, nil) + err := rs.Subscribe() + uassert.NoError(t, err, "Expected ProcessPayment to succeed for Alice") + + err = rs.HasValidSubscription(std.PrevRealm().Addr()) + uassert.NoError(t, err, "Expected Alice to have access") + + expiration, err := rs.GetExpiration(std.PrevRealm().Addr()) + uassert.NoError(t, err, "Expected to get expiration for Alice") +} + +func TestRecurringSubscriptionGift(t *testing.T) { + std.TestSetRealm(std.NewUserRealm(alice)) + rs := NewRecurringSubscription(time.Hour*24, 1000) + + std.TestSetOrigSend([]std.Coin{{Denom: "ugnot", Amount: 1000}}, nil) + err := rs.GiftSubscription(bob) + uassert.NoError(t, err, "Expected ProcessPaymentGift to succeed for Bob") + + err = rs.HasValidSubscription(bob) + uassert.NoError(t, err, "Expected Bob to have access") + + err = rs.HasValidSubscription(charlie) + uassert.Error(t, err, "Expected Charlie to fail access check") +} + +func TestRecurringSubscriptionExpiration(t *testing.T) { + std.TestSetRealm(std.NewUserRealm(alice)) + rs := NewRecurringSubscription(time.Hour, 1000) + + std.TestSetOrigSend([]std.Coin{{Denom: "ugnot", Amount: 1000}}, nil) + err := rs.Subscribe() + uassert.NoError(t, err, "Expected ProcessPayment to succeed for Alice") + + err = rs.HasValidSubscription(std.PrevRealm().Addr()) + uassert.NoError(t, err, "Expected Alice to have access") + + expiration := time.Now().Add(-time.Hour * 2) + rs.subs.Set(std.PrevRealm().Addr().String(), expiration) + + err = rs.HasValidSubscription(std.PrevRealm().Addr()) + uassert.Error(t, err, "Expected Alice's subscription to be expired") +} + +func TestUpdateAmountAuthorization(t *testing.T) { + std.TestSetRealm(std.NewUserRealm(alice)) + rs := NewRecurringSubscription(time.Hour*24, 1000) + + err := rs.UpdateAmount(2000) + uassert.NoError(t, err, "Expected Alice to succeed in updating amount") + + std.TestSetOrigCaller(bob) + err = rs.UpdateAmount(3000) + uassert.Error(t, err, "Expected Bob to fail when updating amount") +} + +func TestGetAmount(t *testing.T) { + std.TestSetRealm(std.NewUserRealm(alice)) + rs := NewRecurringSubscription(time.Hour*24, 1000) + + amount := rs.GetAmount() + uassert.Equal(t, amount, int64(1000), "Expected the initial amount to be 1000 ugnot") + + err := rs.UpdateAmount(2000) + uassert.NoError(t, err, "Expected Alice to succeed in updating amount") + + amount = rs.GetAmount() + uassert.Equal(t, amount, int64(2000), "Expected the updated amount to be 2000 ugnot") +} + +func TestIncorrectPaymentAmount(t *testing.T) { + std.TestSetRealm(std.NewUserRealm(alice)) + rs := NewRecurringSubscription(time.Hour*24, 1000) + + std.TestSetOrigSend([]std.Coin{{Denom: "ugnot", Amount: 500}}, nil) + err := rs.Subscribe() + uassert.Error(t, err, "Expected payment with incorrect amount to fail") +} + +func TestMultiplePaymentsForSameUser(t *testing.T) { + std.TestSetRealm(std.NewUserRealm(alice)) + rs := NewRecurringSubscription(time.Hour*24, 1000) + + std.TestSetOrigSend([]std.Coin{{Denom: "ugnot", Amount: 1000}}, nil) + err := rs.Subscribe() + uassert.NoError(t, err, "Expected first ProcessPayment to succeed for Alice") + + std.TestSetOrigSend([]std.Coin{{Denom: "ugnot", Amount: 1000}}, nil) + err = rs.Subscribe() + uassert.Error(t, err, "Expected second ProcessPayment to fail for Alice due to existing subscription") +} + +func TestRecurringSubscriptionWithMultiplePayments(t *testing.T) { + std.TestSetRealm(std.NewUserRealm(alice)) + rs := NewRecurringSubscription(time.Hour, 1000) + + std.TestSetOrigSend([]std.Coin{{Denom: "ugnot", Amount: 1000}}, nil) + err := rs.Subscribe() + uassert.NoError(t, err, "Expected first ProcessPayment to succeed for Alice") + + err = rs.HasValidSubscription(std.PrevRealm().Addr()) + uassert.NoError(t, err, "Expected Alice to have access after first payment") + + expiration := time.Now().Add(-time.Hour * 2) + rs.subs.Set(std.PrevRealm().Addr().String(), expiration) + + std.TestSetOrigSend([]std.Coin{{Denom: "ugnot", Amount: 1000}}, nil) + err = rs.Subscribe() + uassert.NoError(t, err, "Expected second ProcessPayment to succeed for Alice") + + err = rs.HasValidSubscription(std.PrevRealm().Addr()) + uassert.NoError(t, err, "Expected Alice to have access after second payment") +} diff --git a/portal-loop/extracted/p/demo/subscription/subscription.gno b/portal-loop/extracted/p/demo/subscription/subscription.gno new file mode 100644 index 00000000..cc52a2c0 --- /dev/null +++ b/portal-loop/extracted/p/demo/subscription/subscription.gno @@ -0,0 +1,12 @@ +package subscription + +import ( + "std" +) + +// Subscription interface defines standard methods that all subscription types must implement. +type Subscription interface { + HasValidSubscription(std.Address) error + Subscribe() error + UpdateAmount(newAmount int64) error +} diff --git a/portal-loop/extracted/p/demo/svg/doc.gno b/portal-loop/extracted/p/demo/svg/doc.gno new file mode 100644 index 00000000..4b40f6db --- /dev/null +++ b/portal-loop/extracted/p/demo/svg/doc.gno @@ -0,0 +1,17 @@ +/* +Package svg is a minimalist SVG generation library for Gno. + +The svg package provides a simple and lightweight solution for programmatically generating SVG (Scalable Vector Graphics) markup in Gno. It allows you to create basic shapes like rectangles and circles, and output the generated SVG to a + +Example: + + import "gno.land/p/demo/svg"" + + func Foo() string { + canvas := svg.Canvas{Width: 200, Height: 200} + canvas.DrawRectangle(50, 50, 100, 100, "red") + canvas.DrawCircle(100, 100, 50, "blue") + return canvas.String() + } +*/ +package svg // import "gno.land/p/demo/svg" diff --git a/portal-loop/extracted/p/demo/svg/pkg_metadata.json b/portal-loop/extracted/p/demo/svg/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/svg/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/svg/svg.gno b/portal-loop/extracted/p/demo/svg/svg.gno new file mode 100644 index 00000000..ede8208f --- /dev/null +++ b/portal-loop/extracted/p/demo/svg/svg.gno @@ -0,0 +1,82 @@ +package svg + +import "gno.land/p/demo/ufmt" + +type Canvas struct { + Width int + Height int + Elems []Elem +} + +type Elem interface{ String() string } + +func (c Canvas) String() string { + output := "" + output += ufmt.Sprintf(``, c.Width, c.Height) + for _, elem := range c.Elems { + output += elem.String() + } + output += "" + return output +} + +func (c *Canvas) Append(elem Elem) { + c.Elems = append(c.Elems, elem) +} + +type Circle struct { + CX int // center X + CY int // center Y + R int // radius + Fill string +} + +func (c Circle) String() string { + return ufmt.Sprintf(``, c.CX, c.CY, c.R, c.Fill) +} + +func (c *Canvas) DrawCircle(cx, cy, r int, fill string) { + c.Append(Circle{ + CX: cx, + CY: cy, + R: r, + Fill: fill, + }) +} + +type Rectangle struct { + X, Y, Width, Height int + Fill string +} + +func (c Rectangle) String() string { + return ufmt.Sprintf(``, c.X, c.Y, c.Width, c.Height, c.Fill) +} + +func (c *Canvas) DrawRectangle(x, y, width, height int, fill string) { + c.Append(Rectangle{ + X: x, + Y: y, + Width: width, + Height: height, + Fill: fill, + }) +} + +type Text struct { + X, Y int + Text, Fill string +} + +func (c Text) String() string { + return ufmt.Sprintf(`%s`, c.X, c.Y, c.Fill, c.Text) +} + +func (c *Canvas) DrawText(x, y int, text, fill string) { + c.Append(Text{ + X: x, + Y: y, + Text: text, + Fill: fill, + }) +} diff --git a/portal-loop/extracted/p/demo/svg/z0_filetest.gno b/portal-loop/extracted/p/demo/svg/z0_filetest.gno new file mode 100644 index 00000000..f868f938 --- /dev/null +++ b/portal-loop/extracted/p/demo/svg/z0_filetest.gno @@ -0,0 +1,15 @@ +// PKGPATH: gno.land/p/demo/svg_test +package svg_test + +import "gno.land/p/demo/svg" + +func main() { + canvas := svg.Canvas{Width: 500, Height: 500} + canvas.DrawRectangle(50, 50, 100, 100, "red") + canvas.DrawCircle(100, 100, 50, "blue") + canvas.DrawText(100, 100, "hello world!", "magenta") + println(canvas) +} + +// Output: +// hello world! diff --git a/portal-loop/extracted/p/demo/svg/z1_filetest.gno b/portal-loop/extracted/p/demo/svg/z1_filetest.gno new file mode 100644 index 00000000..29fce4cd --- /dev/null +++ b/portal-loop/extracted/p/demo/svg/z1_filetest.gno @@ -0,0 +1,19 @@ +// PKGPATH: gno.land/p/demo/svg_test +package svg_test + +import "gno.land/p/demo/svg" + +func main() { + canvas := svg.Canvas{ + Width: 500, Height: 500, + Elems: []svg.Elem{ + svg.Rectangle{50, 50, 100, 100, "red"}, + svg.Circle{50, 50, 100, "red"}, + svg.Text{100, 100, "hello world!", "magenta"}, + }, + } + println(canvas) +} + +// Output: +// hello world! diff --git a/portal-loop/extracted/p/demo/tamagotchi/pkg_metadata.json b/portal-loop/extracted/p/demo/tamagotchi/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/tamagotchi/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/tamagotchi/tamagotchi.gno b/portal-loop/extracted/p/demo/tamagotchi/tamagotchi.gno new file mode 100644 index 00000000..4e0cb6cb --- /dev/null +++ b/portal-loop/extracted/p/demo/tamagotchi/tamagotchi.gno @@ -0,0 +1,175 @@ +package tamagotchi + +import ( + "time" + + "gno.land/p/demo/ufmt" +) + +// Tamagotchi structure +type Tamagotchi struct { + name string + hunger int + happiness int + health int + age int + maxAge int + sleepy int + created time.Time + lastUpdated time.Time +} + +func New(name string) *Tamagotchi { + now := time.Now() + return &Tamagotchi{ + name: name, + hunger: 50, + happiness: 50, + health: 50, + maxAge: 100, + lastUpdated: now, + created: now, + } +} + +func (t *Tamagotchi) Name() string { + t.update() + return t.name +} + +func (t *Tamagotchi) Hunger() int { + t.update() + return t.hunger +} + +func (t *Tamagotchi) Happiness() int { + t.update() + return t.happiness +} + +func (t *Tamagotchi) Health() int { + t.update() + return t.health +} + +func (t *Tamagotchi) Age() int { + t.update() + return t.age +} + +func (t *Tamagotchi) Sleepy() int { + t.update() + return t.sleepy +} + +// Feed method for Tamagotchi +func (t *Tamagotchi) Feed() { + t.update() + if t.dead() { + return + } + t.hunger = bound(t.hunger-10, 0, 100) +} + +// Play method for Tamagotchi +func (t *Tamagotchi) Play() { + t.update() + if t.dead() { + return + } + t.happiness = bound(t.happiness+10, 0, 100) +} + +// Heal method for Tamagotchi +func (t *Tamagotchi) Heal() { + t.update() + + if t.dead() { + return + } + t.health = bound(t.health+10, 0, 100) +} + +func (t Tamagotchi) dead() bool { return t.health == 0 } + +// Update applies changes based on the duration since the last update +func (t *Tamagotchi) update() { + if t.dead() { + return + } + + now := time.Now() + if t.lastUpdated == now { + return + } + + duration := now.Sub(t.lastUpdated) + elapsedMins := int(duration.Minutes()) + + t.hunger = bound(t.hunger+elapsedMins, 0, 100) + t.happiness = bound(t.happiness-elapsedMins, 0, 100) + t.health = bound(t.health-elapsedMins, 0, 100) + t.sleepy = bound(t.sleepy+elapsedMins, 0, 100) + + // age is hours since created + t.age = int(now.Sub(t.created).Hours()) + if t.age > t.maxAge { + t.age = t.maxAge + t.health = 0 + } + if t.health == 0 { + t.sleepy = 0 + t.happiness = 0 + t.hunger = 0 + } + + t.lastUpdated = now +} + +// Face returns an ASCII art representation of the Tamagotchi's current state +func (t *Tamagotchi) Face() string { + t.update() + return t.face() +} + +func (t *Tamagotchi) face() string { + switch { + case t.health == 0: + return "😵" // dead face + case t.health < 30: + return "😷" // sick face + case t.happiness < 30: + return "😢" // sad face + case t.hunger > 70: + return "😫" // hungry face + case t.sleepy > 70: + return "😴" // sleepy face + default: + return "😃" // happy face + } +} + +// Markdown method for Tamagotchi +func (t *Tamagotchi) Markdown() string { + t.update() + return ufmt.Sprintf(`# %s %s + +* age: %d +* hunger: %d +* happiness: %d +* health: %d +* sleepy: %d`, + t.name, t.Face(), + t.age, t.hunger, t.happiness, t.health, t.sleepy, + ) +} + +func bound(n, min, max int) int { + if n < min { + return min + } + if n > max { + return max + } + return n +} diff --git a/portal-loop/extracted/p/demo/tamagotchi/z0_filetest.gno b/portal-loop/extracted/p/demo/tamagotchi/z0_filetest.gno new file mode 100644 index 00000000..4b2c04b6 --- /dev/null +++ b/portal-loop/extracted/p/demo/tamagotchi/z0_filetest.gno @@ -0,0 +1,105 @@ +package main + +import ( + "time" + + "internal/os_test" + + "gno.land/p/demo/tamagotchi" +) + +func main() { + t := tamagotchi.New("Gnome") + + println("\n-- INITIAL\n") + println(t.Markdown()) + + println("\n-- WAIT 20 minutes\n") + os_test.Sleep(20 * time.Minute) + println(t.Markdown()) + + println("\n-- FEEDx3, PLAYx2, HEALx4\n") + t.Feed() + t.Feed() + t.Feed() + t.Play() + t.Play() + t.Heal() + t.Heal() + t.Heal() + t.Heal() + println(t.Markdown()) + + println("\n-- WAIT 20 minutes\n") + os_test.Sleep(20 * time.Minute) + println(t.Markdown()) + + println("\n-- WAIT 20 hours\n") + os_test.Sleep(20 * time.Hour) + println(t.Markdown()) + + println("\n-- WAIT 20 hours\n") + os_test.Sleep(20 * time.Hour) + println(t.Markdown()) +} + +// Output: +// -- INITIAL +// +// # Gnome 😃 +// +// * age: 0 +// * hunger: 50 +// * happiness: 50 +// * health: 50 +// * sleepy: 0 +// +// -- WAIT 20 minutes +// +// # Gnome 😃 +// +// * age: 0 +// * hunger: 70 +// * happiness: 30 +// * health: 30 +// * sleepy: 20 +// +// -- FEEDx3, PLAYx2, HEALx4 +// +// # Gnome 😃 +// +// * age: 0 +// * hunger: 40 +// * happiness: 50 +// * health: 70 +// * sleepy: 20 +// +// -- WAIT 20 minutes +// +// # Gnome 😃 +// +// * age: 0 +// * hunger: 60 +// * happiness: 30 +// * health: 50 +// * sleepy: 40 +// +// -- WAIT 20 hours +// +// # Gnome 😵 +// +// * age: 20 +// * hunger: 0 +// * happiness: 0 +// * health: 0 +// * sleepy: 0 +// +// -- WAIT 20 hours +// +// # Gnome 😵 +// +// * age: 20 +// * hunger: 0 +// * happiness: 0 +// * health: 0 +// * sleepy: 0 diff --git a/portal-loop/extracted/p/demo/ternary/README.md b/portal-loop/extracted/p/demo/ternary/README.md new file mode 100644 index 00000000..451c24c3 --- /dev/null +++ b/portal-loop/extracted/p/demo/ternary/README.md @@ -0,0 +1,51 @@ +# Ternary package + +Ternary operator have notoriously been absent from Go +from its inception. + +This package proposes ternary functions. + +We don't advocate for their systematic use, but +it can often prove useful when realms need to generate +Markdown, + +## Usage +```go +import "p/demo/ternary" + +func Render(path string) string { + // display appropriate greeting + return "# " + ternary.String(isEarly, "hi", "bye") +} +``` + +Another example: + +`f := ternary.Float64(useGoldenRatio, 1.618, 1.66)` + +## List of functions + +Most native types got a function. + +Note: both branches yes/no get evaluated, contrarily to the C operator. +Please don't use this if your branches are expensive. + +Functions: + +* func String(cond bool, yes, no string) string +* func Int(cond bool, yes, no int) int +* func Int8(cond bool, yes, no int8) int8 +* func Int16(cond bool, yes, no int16) int16 +* func Int32(cond bool, yes, no int32) int32 +* func Int64(cond bool, yes, no int64) int64 +* func Uint(cond bool, yes, no uint) uint +* func Uint8(cond bool, yes, no uint8) uint8 +* func Uint16(cond bool, yes, no uint16) uint16 +* func Uint32(cond bool, yes, no uint32) uint32 +* func Uint64(cond bool, yes, no uint64) uint64 +* func Float32(cond bool, yes, no float32) float32 +* func Float64(cond bool, yes, no float64) float64 +* func Rune(cond bool, yes, no rune) rune +* func Bool(cond bool, yes, no bool) rune +* func Address(cond bool, std.Address, std.Address) std.Address + diff --git a/portal-loop/extracted/p/demo/ternary/pkg_metadata.json b/portal-loop/extracted/p/demo/ternary/pkg_metadata.json new file mode 100644 index 00000000..9b8b9de3 --- /dev/null +++ b/portal-loop/extracted/p/demo/ternary/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1fjh9y7ausp27dqsdq0qrcsnmgvwm6829v2au7d","deposit":"100000ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/ternary/ternary.gno b/portal-loop/extracted/p/demo/ternary/ternary.gno new file mode 100644 index 00000000..b7343e84 --- /dev/null +++ b/portal-loop/extracted/p/demo/ternary/ternary.gno @@ -0,0 +1,115 @@ +package ternary + +import "std" + +func String(cond bool, yes, no string) string { + if cond { + return yes + } + return no +} + +func Int(cond bool, yes, no int) int { + if cond { + return yes + } + return no +} + +func Int8(cond bool, yes, no int8) int8 { + if cond { + return yes + } + return no +} + +func Int16(cond bool, yes, no int16) int16 { + if cond { + return yes + } + return no +} + +func Int32(cond bool, yes, no int32) int32 { + if cond { + return yes + } + return no +} + +func Int64(cond bool, yes, no int64) int64 { + if cond { + return yes + } + return no +} + +func Uint(cond bool, yes, no uint) uint { + if cond { + return yes + } + return no +} + +func Uint8(cond bool, yes, no uint8) uint8 { + if cond { + return yes + } + return no +} + +func Uint16(cond bool, yes, no uint16) uint16 { + if cond { + return yes + } + return no +} + +func Uint32(cond bool, yes, no uint32) uint32 { + if cond { + return yes + } + return no +} + +func Uint64(cond bool, yes, no uint64) uint64 { + if cond { + return yes + } + return no +} + +func Float32(cond bool, yes, no float32) float32 { + if cond { + return yes + } + return no +} + +func Float64(cond bool, yes, no float64) float64 { + if cond { + return yes + } + return no +} + +func Rune(cond bool, yes, no rune) rune { + if cond { + return yes + } + return no +} + +func Bool(cond bool, yes, no bool) bool { + if cond { + return yes + } + return no +} + +func Address(cond bool, yes, no std.Address) std.Address { + if cond { + return yes + } + return no +} diff --git a/portal-loop/extracted/p/demo/ternary/ternary_test.gno b/portal-loop/extracted/p/demo/ternary/ternary_test.gno new file mode 100644 index 00000000..c553574e --- /dev/null +++ b/portal-loop/extracted/p/demo/ternary/ternary_test.gno @@ -0,0 +1,48 @@ +package ternary + +import ( + "std" + "testing" +) + +func TestTernary(t *testing.T) { + assert(t, String(true, "a", "b") == "a") + assert(t, String(false, "a", "b") == "b") + assert(t, Int(true, 0, 1) == 0) + assert(t, Int(false, 0, 1) == 1) + assert(t, Int8(true, 0, 1) == 0) + assert(t, Int8(false, 0, 1) == 1) + assert(t, Int16(true, 0, 1) == 0) + assert(t, Int16(false, 0, 1) == 1) + assert(t, Int32(true, 0, 1) == 0) + assert(t, Int32(false, 0, 1) == 1) + assert(t, Int64(true, 0, 1) == 0) + assert(t, Int64(false, 0, 1) == 1) + assert(t, Uint(true, 0, 1) == 0) + assert(t, Uint(false, 0, 1) == 1) + assert(t, Uint8(true, 0, 1) == 0) + assert(t, Uint8(false, 0, 1) == 1) + assert(t, Uint16(true, 0, 1) == 0) + assert(t, Uint16(false, 0, 1) == 1) + assert(t, Uint32(true, 0, 1) == 0) + assert(t, Uint32(false, 0, 1) == 1) + assert(t, Uint64(true, 0, 1) == 0) + assert(t, Uint64(false, 0, 1) == 1) + assert(t, Float32(true, 3.14, 1.618) == 3.14) + assert(t, Float32(false, 3.14, 1.618) == 1.618) + assert(t, Float64(true, 3.14, 1.618) == 3.14) + assert(t, Float64(false, 3.14, 1.618) == 1.618) + assert(t, Rune(true, '是', '否') == '是') + assert(t, Rune(false, '是', '否') == '否') + n := 17 + assert(t, !Bool(true, n%2 == 0, n < 10)) + assert(t, Address(true, std.Address("g0"), std.Address("g1")).String() == "g0") + assert(t, Address(false, std.Address("g0"), std.Address("g1")).String() == "g1") +} + +func assert(t *testing.T, val bool) { + t.Helper() + if !val { + t.Errorf("expected true, got false") + } +} diff --git a/portal-loop/extracted/p/demo/tests/p_crossrealm/p_crossrealm.gno b/portal-loop/extracted/p/demo/tests/p_crossrealm/p_crossrealm.gno new file mode 100644 index 00000000..6d46203e --- /dev/null +++ b/portal-loop/extracted/p/demo/tests/p_crossrealm/p_crossrealm.gno @@ -0,0 +1,24 @@ +package p_crossrealm + +type Stringer interface { + String() string +} + +type Container struct { + A int + B Stringer +} + +func (c *Container) Touch() *Container { + c.A += 1 + return c +} + +func (c *Container) Print() { + println("A:", c.A) + if c.B == nil { + println("B: undefined") + } else { + println("B:", c.B.String()) + } +} diff --git a/portal-loop/extracted/p/demo/tests/p_crossrealm/pkg_metadata.json b/portal-loop/extracted/p/demo/tests/p_crossrealm/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/tests/p_crossrealm/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/tests/subtests/pkg_metadata.json b/portal-loop/extracted/p/demo/tests/subtests/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/tests/subtests/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/tests/subtests/subtests.gno b/portal-loop/extracted/p/demo/tests/subtests/subtests.gno new file mode 100644 index 00000000..e8796a73 --- /dev/null +++ b/portal-loop/extracted/p/demo/tests/subtests/subtests.gno @@ -0,0 +1,17 @@ +package subtests + +import ( + "std" +) + +func GetCurrentRealm() std.Realm { + return std.CurrentRealm() +} + +func GetPrevRealm() std.Realm { + return std.PrevRealm() +} + +func Exec(fn func()) { + fn() +} diff --git a/portal-loop/extracted/p/demo/tests:0/README.md b/portal-loop/extracted/p/demo/tests:0/README.md new file mode 100644 index 00000000..20677020 --- /dev/null +++ b/portal-loop/extracted/p/demo/tests:0/README.md @@ -0,0 +1,2 @@ +Modules here are only useful for file realm tests. +They can be safely ignored for other purposes. diff --git a/portal-loop/extracted/p/demo/tests:0/pkg_metadata.json b/portal-loop/extracted/p/demo/tests:0/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/tests:0/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/tests:0/tests.gno b/portal-loop/extracted/p/demo/tests:0/tests.gno new file mode 100644 index 00000000..43732d82 --- /dev/null +++ b/portal-loop/extracted/p/demo/tests:0/tests.gno @@ -0,0 +1,74 @@ +package tests + +import ( + "std" + + psubtests "gno.land/p/demo/tests/subtests" + "gno.land/r/demo/tests" + rtests "gno.land/r/demo/tests" +) + +const World = "world" + +// IncCounter demonstrates that it's possible to call a realm function from +// a package. So a package can potentially write into the store, by calling +// an other realm. +func IncCounter() { + tests.IncCounter() +} + +func CurrentRealmPath() string { + return std.CurrentRealm().PkgPath() +} + +//---------------------------------------- +// cross realm test vars + +type TestRealmObject2 struct { + Field string +} + +func (o2 *TestRealmObject2) Modify() { + o2.Field = "modified" +} + +var ( + somevalue1 TestRealmObject2 + SomeValue2 TestRealmObject2 + SomeValue3 *TestRealmObject2 +) + +func init() { + somevalue1 = TestRealmObject2{Field: "init"} + SomeValue2 = TestRealmObject2{Field: "init"} + SomeValue3 = &TestRealmObject2{Field: "init"} +} + +func ModifyTestRealmObject2a() { + somevalue1.Field = "modified" +} + +func ModifyTestRealmObject2b() { + SomeValue2.Field = "modified" +} + +func ModifyTestRealmObject2c() { + SomeValue3.Field = "modified" +} + +func GetPrevRealm() std.Realm { + return std.PrevRealm() +} + +func GetPSubtestsPrevRealm() std.Realm { + return psubtests.GetPrevRealm() +} + +func GetRTestsGetPrevRealm() std.Realm { + return rtests.GetPrevRealm() +} + +// Warning: unsafe pattern. +func Exec(fn func()) { + fn() +} diff --git a/portal-loop/extracted/p/demo/tests:0/tests_test.gno b/portal-loop/extracted/p/demo/tests:0/tests_test.gno new file mode 100644 index 00000000..98bd0e91 --- /dev/null +++ b/portal-loop/extracted/p/demo/tests:0/tests_test.gno @@ -0,0 +1,19 @@ +package tests_test + +import ( + "testing" + + "gno.land/p/demo/tests" + + "gno.land/p/demo/uassert" +) + +var World = "WORLD" + +func TestGetHelloWorld(t *testing.T) { + // tests.World is 'world' + s := "hello " + tests.World + World + const want = "hello worldWORLD" + + uassert.Equal(t, want, s) +} diff --git a/portal-loop/extracted/p/demo/tests:0/z0_filetest.gno b/portal-loop/extracted/p/demo/tests:0/z0_filetest.gno new file mode 100644 index 00000000..b788eaf3 --- /dev/null +++ b/portal-loop/extracted/p/demo/tests:0/z0_filetest.gno @@ -0,0 +1,16 @@ +package main + +import ( + ptests "gno.land/p/demo/tests" + rtests "gno.land/r/demo/tests" +) + +func main() { + println(rtests.Counter()) + ptests.IncCounter() + println(rtests.Counter()) +} + +// Output: +// 0 +// 1 diff --git a/portal-loop/extracted/p/demo/testutils/access.gno b/portal-loop/extracted/p/demo/testutils/access.gno new file mode 100644 index 00000000..632f900d --- /dev/null +++ b/portal-loop/extracted/p/demo/testutils/access.gno @@ -0,0 +1,43 @@ +package testutils + +// for testing access. see tests/files/access*.go + +// NOTE: non-package variables cannot be overridden, except during init(). +var ( + TestVar1 int + testVar2 int +) + +func init() { + TestVar1 = 123 + testVar2 = 456 +} + +type TestAccessStruct struct { + PublicField string + privateField string +} + +func (tas TestAccessStruct) PublicMethod() string { + return tas.PublicField + "/" + tas.privateField +} + +func (tas TestAccessStruct) privateMethod() string { + return tas.PublicField + "/" + tas.privateField +} + +func NewTestAccessStruct(pub, priv string) TestAccessStruct { + return TestAccessStruct{ + PublicField: pub, + privateField: priv, + } +} + +// see access6.g0 etc. +type PrivateInterface interface { + privateMethod() string +} + +func PrintPrivateInterface(pi PrivateInterface) { + println("testutils.PrintPrivateInterface", pi.privateMethod()) +} diff --git a/portal-loop/extracted/p/demo/testutils/crypto.gno b/portal-loop/extracted/p/demo/testutils/crypto.gno new file mode 100644 index 00000000..fef6311f --- /dev/null +++ b/portal-loop/extracted/p/demo/testutils/crypto.gno @@ -0,0 +1,16 @@ +package testutils + +import "std" + +func TestAddress(name string) std.Address { + if len(name) > std.RawAddressSize { + panic("address name cannot be greater than std.AddressSize bytes") + } + addr := std.RawAddress{} + // TODO: use strings.RepeatString or similar. + // NOTE: I miss python's "".Join(). + blanks := "____________________" + copy(addr[:], []byte(blanks)) + copy(addr[:], []byte(name)) + return std.Address(std.EncodeBech32("g", addr)) +} diff --git a/portal-loop/extracted/p/demo/testutils/misc.gno b/portal-loop/extracted/p/demo/testutils/misc.gno new file mode 100644 index 00000000..d48304ad --- /dev/null +++ b/portal-loop/extracted/p/demo/testutils/misc.gno @@ -0,0 +1,6 @@ +package testutils + +// For testing std.GetCallerAt(). +func WrapCall(fn func()) { + fn() +} diff --git a/portal-loop/extracted/p/demo/testutils/pkg_metadata.json b/portal-loop/extracted/p/demo/testutils/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/testutils/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/tictactoe/game.gno b/portal-loop/extracted/p/demo/tictactoe/game.gno new file mode 100644 index 00000000..f6cac2a1 --- /dev/null +++ b/portal-loop/extracted/p/demo/tictactoe/game.gno @@ -0,0 +1,217 @@ +package tictactoe + +import ( + "errors" + "std" + + "gno.land/p/demo/ufmt" +) + +// this file is @moul's work in #613 +// a few changes and bugfixes have been made + +type Game struct { + player1, player2 std.Address + board [9]rune // 0=empty, 1=player1, 2=player2 + turnCtr int + winnerIdx int +} + +func NewGame(player1, player2 std.Address) (*Game, error) { + if player1 == player2 { + return nil, errors.New("cannot fight against self") + } + + g := Game{ + player1: player1, + player2: player2, + winnerIdx: -1, + turnCtr: -1, + } + return &g, nil +} + +// Partially recover a game +// The game is guaranteed to be legit in terms of number of tiles 1 and 2 +// No winning detection is implemented here however +func RecoverGame(player1, player2 std.Address, board string) (*Game, error) { + g, e := NewGame(player1, player2) + if e != nil { + return nil, e + } + if len(board) != 9 { + return nil, ufmt.Errorf("invalid board length: %d", len(board)) + } + num1, num2 := 0, 0 + runes := [9]rune{} + for i, c := range board { + switch c { + case rune(0), '_', '-': + runes[i] = rune(0) + case rune(1), 'O', 'o': + num1 += 1 + runes[i] = rune(1) + case rune(2), 'X', 'x': + num2 += 1 + runes[i] = rune(2) + default: + return nil, errors.New("invalid rune") + } + } + if num1 != num2 && num1 != num2+1 { + return nil, errors.New("invalid number of x and o") + } + g.board = runes + g.turnCtr = num1 + num2 + g.winnerIdx = -1 + return g, nil +} + +// start sets turnCtr to 0. +func (g *Game) Start() { + if g.turnCtr != -1 { + panic("game already started") + } + g.turnCtr = 0 +} + +func (g *Game) Play(player std.Address, posX, posY int) error { + if !g.Started() { + return errors.New("game not started") + } + + if g.Turn() != player { + return errors.New("invalid turn") + } + + if g.IsOver() { + return errors.New("game over") + } + + // are posX and posY valid + if posX < 0 || posY < 0 || posX > 2 || posY > 2 { + return errors.New("posX and posY should be 0, 1 or 2") + } + + // is slot already used? + idx := xyToIdx(posX, posY) + if g.board[idx] != 0 { + return ufmt.Errorf("slot already used (%d, %d)", posX, posY) + } + + // play + playerVal := rune(g.turnCtr%2) + 1 // player1=1, player2=2 + g.board[idx] = playerVal + + // check if win + if g.checkLastMoveWon(posX, posY) { + g.winnerIdx = g.turnCtr + } + + // change turn + g.turnCtr++ + return nil +} + +func (g Game) WouldWin(side rune, x, y int) bool { + idx := xyToIdx(x, y) + if g.board[idx] != rune(0) { + panic("tile should be empty") + } + // place rune temporarily + g.board[idx] = side + b := g.checkLastMoveWon(x, y) + g.board[idx] = rune(0) + return b +} + +func (g Game) checkLastMoveWon(posX, posY int) bool { + // assumes the game wasn't won yet, and that the move was already applied. + + // check vertical line + { + a := g.At(posX, 0) + b := g.At(posX, 1) + c := g.At(posX, 2) + if a == b && b == c { + return true + } + } + + // check horizontal line + { + a := g.At(0, posY) + b := g.At(1, posY) + c := g.At(2, posY) + if a == b && b == c { + return true + } + } + + // diagonals + { + tl := g.At(0, 0) + tr := g.At(0, 2) + bl := g.At(2, 0) + br := g.At(2, 2) + c := g.At(1, 1) + if posX == posY && tl == c && c == br { + return true + } + if posX+posY == 2 && tr == c && c == bl { + return true + } + } + return false +} + +func (g Game) At(posX, posY int) rune { return g.board[xyToIdx(posX, posY)] } +func (g Game) Winner() std.Address { return g.PlayerByIndex(g.winnerIdx) } +func (g Game) Turn() std.Address { return g.PlayerByIndex(g.turnCtr) } +func (g Game) TurnNumber() int { return g.turnCtr } +func (g Game) IsDraw() bool { return g.turnCtr > 8 && g.winnerIdx == -1 } +func (g Game) Started() bool { return g.turnCtr >= 0 } + +func (g Game) IsOver() bool { + // draw + if g.turnCtr > 8 { + return true + } + + // winner + return g.Winner() != std.Address("") +} + +func (g Game) Output() string { + output := "" + + for y := 2; y >= 0; y-- { + for x := 0; x < 3; x++ { + val := g.At(x, y) + switch val { + case 0: + output += "-" + case 1: + output += "O" + case 2: + output += "X" + } + } + output += "\n" + } + + return output +} + +func (g Game) PlayerByIndex(idx int) std.Address { + switch idx % 2 { + case 0: + return g.player1 + case 1: + return g.player2 + default: + return std.Address("") + } +} + +func xyToIdx(x, y int) int { return y*3 + x } diff --git a/portal-loop/extracted/p/demo/tictactoe/game_test.gno b/portal-loop/extracted/p/demo/tictactoe/game_test.gno new file mode 100644 index 00000000..e549dfb4 --- /dev/null +++ b/portal-loop/extracted/p/demo/tictactoe/game_test.gno @@ -0,0 +1,80 @@ +package tictactoe + +import ( + "testing" + + "gno.land/p/demo/testutils" + "gno.land/p/demo/uassert" +) + +var ( + addr1 = testutils.TestAddress("addr1") + addr2 = testutils.TestAddress("addr2") + addr3 = testutils.TestAddress("addr3") +) + +func TestGame(t *testing.T) { + game, err := NewGame(addr1, addr1) + uassert.Error(t, err) + + game, err = NewGame(addr2, addr3) + uassert.NoError(t, err) + + uassert.False(t, game.IsOver()) + uassert.False(t, game.IsDraw()) + game.Start() + uassert.Error(t, game.Play(addr3, 0, 0)) // addr2's turn + uassert.Error(t, game.Play(addr2, -1, 0)) // invalid location + uassert.Error(t, game.Play(addr2, 3, 0)) // invalid location + uassert.Error(t, game.Play(addr2, 0, -1)) // invalid location + uassert.Error(t, game.Play(addr2, 0, 3)) // invalid location + uassert.NoError(t, game.Play(addr2, 1, 1)) // first move + uassert.Error(t, game.Play(addr2, 2, 2)) // addr3's turn + uassert.Error(t, game.Play(addr3, 1, 1)) // slot already used + uassert.NoError(t, game.Play(addr3, 0, 0)) // second move + uassert.NoError(t, game.Play(addr2, 1, 2)) // third move + uassert.NoError(t, game.Play(addr3, 0, 1)) // fourth move + uassert.False(t, game.IsOver()) + uassert.NoError(t, game.Play(addr2, 1, 0)) // fifth move (win) + uassert.True(t, game.IsOver()) + uassert.False(t, game.IsDraw()) + + expected := `-O- +XO- +XO- +` + got := game.Output() + uassert.Equal(t, expected, got) +} + +func TestRecoverGame(t *testing.T) { + for _, o := range []struct { + repr, err string + }{ + {"", "error"}, + {"--", "error"}, + {"---", "error"}, + {"-----", "error"}, + {"--------", "error"}, + {"---------", ""}, + {"XX-------", "error"}, + {"OO-------", "error"}, + {"XO-X-----", "error"}, // O is first + {"XO-O-----", ""}, // valid from there on + {"XOXO-----", ""}, + {"XOXOO----", ""}, + {"XOXOO-X--", ""}, + {"XOXOOOX--", ""}, // circles won but the function doesn't care + {"XOXOOOX-X", ""}, + {"XOXOOOXOX", ""}, // circles won a second time + {"XOXOOOXOXX", "error"}, // too long (10 squares) + } { + g, e := RecoverGame(addr1, addr2, o.repr) + if o.err == "error" { + uassert.Error(t, e, "repr=", o.repr) + } else { + uassert.NoError(t, e, "repr=", o.repr) + uassert.True(t, g != nil, "repr=", o.repr) + } + } +} diff --git a/portal-loop/extracted/p/demo/tictactoe/pkg_metadata.json b/portal-loop/extracted/p/demo/tictactoe/pkg_metadata.json new file mode 100644 index 00000000..9b8b9de3 --- /dev/null +++ b/portal-loop/extracted/p/demo/tictactoe/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1fjh9y7ausp27dqsdq0qrcsnmgvwm6829v2au7d","deposit":"100000ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/tictactoe/tictactoe1p/1pvscpu.gno b/portal-loop/extracted/p/demo/tictactoe/tictactoe1p/1pvscpu.gno new file mode 100644 index 00000000..3d27e7e0 --- /dev/null +++ b/portal-loop/extracted/p/demo/tictactoe/tictactoe1p/1pvscpu.gno @@ -0,0 +1,104 @@ +package tictactoe1p + +// a 1P-vs-CPU tictactoe +// extending moul's tictactoe model + +import ( + "errors" + "std" + "strings" + + "gno.land/p/demo/tictactoe" + "gno.land/p/demo/ufmt" +) + +// 1P-VS-CPU is a tictactoe game +type Game struct { + *tictactoe.Game + cpu std.Address + Intn func(n int) int + pickMove func(g *tictactoe.Game, Intn func(int) int) (x, y int, e error) // AI function +} + +// "" is a whole new game, whether CPU goes first is random. +// "---------"` OTOH indicates a game where cpu /declined/ to go first. +// fRand is a user-supplied func returning a random number in [0, n( +// fPickMove is nil (uses averageDifficulty) or a func used for CPU to pick moves +func GameFromRepr( + text string, + cpu, human std.Address, + fRand func(int) int, + fPickMove func(*tictactoe.Game, func(int) int, + ) (x, y int, e error), +) (*Game, error) { + addr1, addr2 := decideOrder(cpu, human, text, fRand) + + var g *tictactoe.Game + var e error + switch len(text) { + case 0: + g, e = tictactoe.NewGame(addr1, addr2) + g.Start() + case 9: + r := []rune(text) + g, e = tictactoe.RecoverGame( + addr1, + addr2, + string([]rune{ + r[6], r[7], r[8], + r[3], r[4], r[5], + r[0], r[1], r[2], + }), + ) + default: + return nil, errors.New("invalid board length") + } + if fPickMove == nil { + fPickMove = averageDifficulty + } + return &Game{g, cpu, fRand, fPickMove}, e +} + +func (game Game) ToRepr() string { + return strings.ReplaceAll(game.Output(), "\n", "") +} + +func (game Game) IsCpuFirst() bool { + return game.PlayerByIndex(0) == game.cpu +} + +func (game *Game) PlayCPU() (x, y int, e error) { + switch { + case game.Turn() != game.cpu: + return -1, -1, ufmt.Errorf( + "not my turn (%s), turn is %s's", + game.cpu.String(), game.Turn().String(), + ) + case game.IsOver(): + return -1, -1, errors.New("game is over") + default: + x, y, _ = game.pickMove(game.Game, game.Intn) + e = game.Play(game.cpu, x, y) + return x, y, e + } +} + +// Decide who go first, based on the count of markers. +// No error. A special and important case is the empty board, +// meaning player to go first is random. +// fRand is a user-supplied func returning a random number in [0, n( +func decideOrder(cpu, human std.Address, board string, fRand func(int) int) (addr1, addr2 std.Address) { + var cpuFirst bool + if board == "" { + cpuFirst = fRand(2) == 0 + } else { + numO := strings.Count(board, "O") + strings.Count(board, "o") + numX := strings.Count(board, "X") + strings.Count(board, "x") + cpuFirst = numX != numO + } + if cpuFirst { + return cpu, human + } else { + return human, cpu + } +} diff --git a/portal-loop/extracted/p/demo/tictactoe/tictactoe1p/1pvscpu_test.gno b/portal-loop/extracted/p/demo/tictactoe/tictactoe1p/1pvscpu_test.gno new file mode 100644 index 00000000..181074fc --- /dev/null +++ b/portal-loop/extracted/p/demo/tictactoe/tictactoe1p/1pvscpu_test.gno @@ -0,0 +1,100 @@ +package tictactoe1p + +import ( + "math/rand" + "std" + "testing" + + "gno.land/p/demo/uassert" +) + +const ( + cpuAddress = std.Address("CPU") + humanAddress = std.Address("HUMAN") + prng = rand.New(rand.NewPCG(uint64(3), uint64(7))) +) + +func TestRand(t *testing.T) { + n0 := prng.IntN(10) + for i := 0; i < 128; i++ { + if prng.IntN(10) != n0 { + return + } + } + t.Errorf("no randomness") +} + +func TestGameFromRepr(t *testing.T) { + for _, o := range []struct{ repr, expect string }{ + {repr: "", expect: "---------"}, + {repr: "-X--OX-O-", expect: "-X--OX-O-"}, + {repr: "_x__ox_o_", expect: "-X--OX-O-"}, + {repr: "O--------", expect: "O--------"}, + {repr: "O---X----", expect: "O---X----"}, + {repr: "-X--O--O-", expect: "-X--O--O-"}, + {repr: "OXOXOXOXO", expect: "OXOXOXOXO"}, + {repr: "X--------", expect: "error"}, // O always begin + {repr: "OOOOOX---", expect: "error"}, + } { + game, e := GameFromRepr(o.repr, cpuAddress, humanAddress, prng.IntN, nil) + if o.expect == "error" { + uassert.Error(t, e) + } else { + uassert.NoError(t, e) + uassert.Equal(t, o.expect, game.ToRepr()) + } + } +} + +func TestPlayer1Alternates(t *testing.T) { + // ensure CPU goes first or second, in different games + var isCpuFirst0 bool + for i := 0; i < 128; i++ { + g, e := GameFromRepr("", cpuAddress, humanAddress, prng.IntN, nil) + uassert.NoError(t, e) + if i == 0 { + isCpuFirst0 = g.IsCpuFirst() + } else if isCpuFirst0 != g.IsCpuFirst() { + return // ok + } + } + t.FailNow() +} + +func TestPickMove(t *testing.T) { + // study expected VS statistical result + // CPU sees own winning move ~80% of times + // is otherwise blind to other side + for _, o := range []struct { + board string + expectedX int + expectedY int + }{ + {"O-OX-X---", 1, 2}, + {"O-OX-XO--", 1, 1}, + {"X-O-XOO--", 2, 0}, + {"OX-XO----", 2, 0}, + } { + // play over and over, see most frequent moves + h := map[struct{ x, y int }]int{} + for i := 0; i < 64; i++ { + game, e := GameFromRepr(o.board, cpuAddress, humanAddress, prng.IntN, nil) + if !uassert.NoError(t, e, "GameFromRepr") { + t.FailNow() + } + x, y, e := game.pickMove(game.Game, game.Intn) + h[struct{ x, y int }{x, y}] += 1 + } + // assert most frequent move + var hiTemperature int + var hotMove struct{ x, y int } + for coord, v := range h { + if v > hiTemperature { + hiTemperature = v + hotMove = coord + } + } + uassert.Equal(t, o.expectedX, hotMove.x, "for x of repr", o.board) + uassert.Equal(t, o.expectedY, hotMove.y, "for y of repr", o.board) + } +} diff --git a/portal-loop/extracted/p/demo/tictactoe/tictactoe1p/README.md b/portal-loop/extracted/p/demo/tictactoe/tictactoe1p/README.md new file mode 100644 index 00000000..6db89252 --- /dev/null +++ b/portal-loop/extracted/p/demo/tictactoe/tictactoe1p/README.md @@ -0,0 +1,6 @@ +# 1PvsCPU tictactoe + +Extends [p/demo/tictactoe](https://gno.land/p/demo/tictactoe/). +Those games specifically are one player vs a computer. + +Try it [here](https://gno.land/p/demo/games/tictactoe). diff --git a/portal-loop/extracted/p/demo/tictactoe/tictactoe1p/ai.gno b/portal-loop/extracted/p/demo/tictactoe/tictactoe1p/ai.gno new file mode 100644 index 00000000..d219d36c --- /dev/null +++ b/portal-loop/extracted/p/demo/tictactoe/tictactoe1p/ai.gno @@ -0,0 +1,33 @@ +package tictactoe1p + +import ( + "errors" + + "gno.land/p/demo/tictactoe" +) + +// the default move picker. +func averageDifficulty(game *tictactoe.Game, Intn func(int) int) (x, y int, e error) { + // candidates + a := make([]struct{ x, y int }, 0) + side := rune(1 + game.TurnNumber()%2) + for y := 0; y <= 2; y++ { + for x := 0; x <= 2; x++ { + if game.At(x, y) != rune(0) { + continue + } + // if can wins (and can see it), then win + if game.WouldWin(side, x, y) && Intn(5) > 0 { + return x, y, nil + } + a = append(a, struct{ x, y int }{x, y}) + } + } + if len(a) == 0 { + return -1, -1, errors.New("no free tile left") + } else { + // random pick among candidates + c := a[Intn(len(a))] + return c.x, c.y, nil + } +} diff --git a/portal-loop/extracted/p/demo/tictactoe/tictactoe1p/pkg_metadata.json b/portal-loop/extracted/p/demo/tictactoe/tictactoe1p/pkg_metadata.json new file mode 100644 index 00000000..9b8b9de3 --- /dev/null +++ b/portal-loop/extracted/p/demo/tictactoe/tictactoe1p/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1fjh9y7ausp27dqsdq0qrcsnmgvwm6829v2au7d","deposit":"100000ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/todolist/pkg_metadata.json b/portal-loop/extracted/p/demo/todolist/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/todolist/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/todolist/todolist.gno b/portal-loop/extracted/p/demo/todolist/todolist.gno new file mode 100644 index 00000000..a6753446 --- /dev/null +++ b/portal-loop/extracted/p/demo/todolist/todolist.gno @@ -0,0 +1,63 @@ +package todolist + +import ( + "std" + "strconv" + + "gno.land/p/demo/avl" +) + +type TodoList struct { + Title string + Tasks *avl.Tree + Owner std.Address +} + +type Task struct { + Title string + Done bool +} + +func NewTodoList(title string) *TodoList { + return &TodoList{ + Title: title, + Tasks: avl.NewTree(), + Owner: std.GetOrigCaller(), + } +} + +func NewTask(title string) *Task { + return &Task{ + Title: title, + Done: false, + } +} + +func (tl *TodoList) AddTask(id int, task *Task) { + tl.Tasks.Set(strconv.Itoa(id), task) +} + +func ToggleTaskStatus(task *Task) { + task.Done = !task.Done +} + +func (tl *TodoList) RemoveTask(taskId string) { + tl.Tasks.Remove(taskId) +} + +func (tl *TodoList) GetTasks() []*Task { + tasks := make([]*Task, 0, tl.Tasks.Size()) + tl.Tasks.Iterate("", "", func(key string, value interface{}) bool { + tasks = append(tasks, value.(*Task)) + return false + }) + return tasks +} + +func (tl *TodoList) GetTodolistOwner() std.Address { + return tl.Owner +} + +func (tl *TodoList) GetTodolistTitle() string { + return tl.Title +} diff --git a/portal-loop/extracted/p/demo/todolist/todolist_test.gno b/portal-loop/extracted/p/demo/todolist/todolist_test.gno new file mode 100644 index 00000000..85836e2a --- /dev/null +++ b/portal-loop/extracted/p/demo/todolist/todolist_test.gno @@ -0,0 +1,58 @@ +package todolist + +import ( + "std" + "testing" + + "gno.land/p/demo/uassert" +) + +func TestNewTodoList(t *testing.T) { + title := "My Todo List" + todoList := NewTodoList(title) + + uassert.Equal(t, title, todoList.GetTodolistTitle()) + uassert.Equal(t, 0, len(todoList.GetTasks())) + uassert.Equal(t, std.GetOrigCaller().String(), todoList.GetTodolistOwner().String()) +} + +func TestNewTask(t *testing.T) { + title := "My Task" + task := NewTask(title) + + uassert.Equal(t, title, task.Title) + uassert.False(t, task.Done, "Expected task to be not done, but it is done") +} + +func TestAddTask(t *testing.T) { + todoList := NewTodoList("My Todo List") + task := NewTask("My Task") + + todoList.AddTask(1, task) + + tasks := todoList.GetTasks() + + uassert.Equal(t, 1, len(tasks)) + uassert.True(t, tasks[0] == task, "Task does not match") +} + +func TestToggleTaskStatus(t *testing.T) { + task := NewTask("My Task") + + ToggleTaskStatus(task) + uassert.True(t, task.Done, "Expected task to be done, but it is not done") + + ToggleTaskStatus(task) + uassert.False(t, task.Done, "Expected task to be done, but it is not done") +} + +func TestRemoveTask(t *testing.T) { + todoList := NewTodoList("My Todo List") + task := NewTask("My Task") + todoList.AddTask(1, task) + + todoList.RemoveTask("1") + + tasks := todoList.GetTasks() + uassert.Equal(t, 0, len(tasks)) +} diff --git a/portal-loop/extracted/p/demo/uassert/doc.gno b/portal-loop/extracted/p/demo/uassert/doc.gno new file mode 100644 index 00000000..df95d78e --- /dev/null +++ b/portal-loop/extracted/p/demo/uassert/doc.gno @@ -0,0 +1 @@ +package uassert // import "gno.land/p/demo/uassert" diff --git a/portal-loop/extracted/p/demo/uassert/helpers.gno b/portal-loop/extracted/p/demo/uassert/helpers.gno new file mode 100644 index 00000000..76657e75 --- /dev/null +++ b/portal-loop/extracted/p/demo/uassert/helpers.gno @@ -0,0 +1,51 @@ +package uassert + +import "strings" + +func fail(t TestingT, customMsgs []string, failureMessage string, args ...interface{}) bool { + customMsg := "" + if len(customMsgs) > 0 { + customMsg = strings.Join(customMsgs, " ") + } + if customMsg != "" { + failureMessage += " - " + customMsg + } + t.Errorf(failureMessage, args...) + return false +} + +func autofail(t TestingT, success bool, customMsgs []string, failureMessage string, args ...interface{}) bool { + if success { + return true + } + return fail(t, customMsgs, failureMessage, args...) +} + +func checkDidPanic(f func()) (didPanic bool, message string) { + didPanic = true + defer func() { + r := recover() + + if r == nil { + message = "nil" + return + } + + err, ok := r.(error) + if ok { + message = err.Error() + return + } + + errStr, ok := r.(string) + if ok { + message = errStr + return + } + + message = "recover: unsupported type" + }() + f() + didPanic = false + return +} diff --git a/portal-loop/extracted/p/demo/uassert/mock_test.gno b/portal-loop/extracted/p/demo/uassert/mock_test.gno new file mode 100644 index 00000000..b611faab --- /dev/null +++ b/portal-loop/extracted/p/demo/uassert/mock_test.gno @@ -0,0 +1,59 @@ +package uassert + +import ( + "fmt" + "testing" +) + +type mockTestingT struct { + fmt string + args []interface{} +} + +// --- interface mock + +var _ TestingT = (*mockTestingT)(nil) + +func (mockT *mockTestingT) Helper() { /* noop */ } +func (mockT *mockTestingT) Skip(args ...interface{}) { /* not implmented */ } +func (mockT *mockTestingT) Fail() { /* not implmented */ } +func (mockT *mockTestingT) FailNow() { /* not implmented */ } +func (mockT *mockTestingT) Logf(fmt string, args ...interface{}) { /* noop */ } + +func (mockT *mockTestingT) Fatalf(fmt string, args ...interface{}) { + mockT.fmt = "fatal: " + fmt + mockT.args = args +} + +func (mockT *mockTestingT) Errorf(fmt string, args ...interface{}) { + mockT.fmt = "error: " + fmt + mockT.args = args +} + +// --- helpers + +func (mockT *mockTestingT) actualString() string { + res := fmt.Sprintf(mockT.fmt, mockT.args...) + mockT.reset() + return res +} + +func (mockT *mockTestingT) reset() { + mockT.fmt = "" + mockT.args = nil +} + +func (mockT *mockTestingT) equals(t *testing.T, expected string) { + actual := mockT.actualString() + + if expected != actual { + t.Errorf("mockT differs:\n- expected: %s\n- actual: %s\n", expected, actual) + } +} + +func (mockT *mockTestingT) empty(t *testing.T) { + if mockT.fmt != "" || mockT.args != nil { + actual := mockT.actualString() + t.Errorf("mockT should be empty, got %s", actual) + } +} diff --git a/portal-loop/extracted/p/demo/uassert/pkg_metadata.json b/portal-loop/extracted/p/demo/uassert/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/uassert/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/uassert/types.gno b/portal-loop/extracted/p/demo/uassert/types.gno new file mode 100644 index 00000000..83950b5e --- /dev/null +++ b/portal-loop/extracted/p/demo/uassert/types.gno @@ -0,0 +1,11 @@ +package uassert + +type TestingT interface { + Helper() + Skip(args ...interface{}) + Fatalf(fmt string, args ...interface{}) + Errorf(fmt string, args ...interface{}) + Logf(fmt string, args ...interface{}) + Fail() + FailNow() +} diff --git a/portal-loop/extracted/p/demo/uassert/uassert.gno b/portal-loop/extracted/p/demo/uassert/uassert.gno new file mode 100644 index 00000000..2776e93d --- /dev/null +++ b/portal-loop/extracted/p/demo/uassert/uassert.gno @@ -0,0 +1,463 @@ +// uassert is an adapted lighter version of https://github.com/stretchr/testify/assert. +package uassert + +import ( + "std" + "strconv" + "strings" + + "gno.land/p/demo/diff" +) + +// NoError asserts that a function returned no error (i.e. `nil`). +func NoError(t TestingT, err error, msgs ...string) bool { + t.Helper() + if err != nil { + return fail(t, msgs, "unexpected error: %s", err.Error()) + } + return true +} + +// Error asserts that a function returned an error (i.e. not `nil`). +func Error(t TestingT, err error, msgs ...string) bool { + t.Helper() + if err == nil { + return fail(t, msgs, "an error is expected but got nil") + } + return true +} + +// ErrorContains asserts that a function returned an error (i.e. not `nil`) +// and that the error contains the specified substring. +func ErrorContains(t TestingT, err error, contains string, msgs ...string) bool { + t.Helper() + + if !Error(t, err, msgs...) { + return false + } + + actual := err.Error() + if !strings.Contains(actual, contains) { + return fail(t, msgs, "error %q does not contain %q", actual, contains) + } + + return true +} + +// True asserts that the specified value is true. +func True(t TestingT, value bool, msgs ...string) bool { + t.Helper() + if !value { + return fail(t, msgs, "should be true") + } + return true +} + +// False asserts that the specified value is false. +func False(t TestingT, value bool, msgs ...string) bool { + t.Helper() + if value { + return fail(t, msgs, "should be false") + } + return true +} + +// ErrorIs asserts the given error matches the target error +func ErrorIs(t TestingT, err, target error, msgs ...string) bool { + t.Helper() + + if err == nil || target == nil { + return err == target + } + + // XXX: if errors.Is(err, target) return true + + if err.Error() != target.Error() { + return fail(t, msgs, "error mismatch, expected %s, got %s", target.Error(), err.Error()) + } + + return true +} + +// PanicsWithMessage asserts that the code inside the specified func panics, +// and that the recovered panic value satisfies the given message +func PanicsWithMessage(t TestingT, msg string, f func(), msgs ...string) bool { + t.Helper() + + didPanic, panicValue := checkDidPanic(f) + if !didPanic { + return fail(t, msgs, "func should panic\n\tPanic value:\t%v", panicValue) + } + + if panicValue != msg { + return fail(t, msgs, "func should panic with message:\t%s\n\tPanic value:\t%s", msg, panicValue) + } + return true +} + +// NotPanics asserts that the code inside the specified func does NOT panic. +func NotPanics(t TestingT, f func(), msgs ...string) bool { + t.Helper() + + didPanic, panicValue := checkDidPanic(f) + + if didPanic { + return fail(t, msgs, "func should not panic\n\tPanic value:\t%s", panicValue) + } + return true +} + +// Equal asserts that two objects are equal. +func Equal(t TestingT, expected, actual interface{}, msgs ...string) bool { + t.Helper() + + if expected == nil || actual == nil { + return expected == actual + } + + // XXX: errors + // XXX: slices + // XXX: pointers + + equal := false + ok_ := false + es, as := "unsupported type", "unsupported type" + + switch ev := expected.(type) { + case string: + if av, ok := actual.(string); ok { + equal = ev == av + ok_ = true + es, as = ev, av + if !equal { + dif := diff.MyersDiff(ev, av) + return fail(t, msgs, "uassert.Equal: strings are different\n\tDiff: %s", diff.Format(dif)) + } + } + case std.Address: + if av, ok := actual.(std.Address); ok { + equal = ev == av + ok_ = true + es, as = string(ev), string(av) + } + case int: + if av, ok := actual.(int); ok { + equal = ev == av + ok_ = true + es, as = strconv.Itoa(ev), strconv.Itoa(av) + } + case int8: + if av, ok := actual.(int8); ok { + equal = ev == av + ok_ = true + es, as = strconv.Itoa(int(ev)), strconv.Itoa(int(av)) + } + case int16: + if av, ok := actual.(int16); ok { + equal = ev == av + ok_ = true + es, as = strconv.Itoa(int(ev)), strconv.Itoa(int(av)) + } + case int32: + if av, ok := actual.(int32); ok { + equal = ev == av + ok_ = true + es, as = strconv.Itoa(int(ev)), strconv.Itoa(int(av)) + } + case int64: + if av, ok := actual.(int64); ok { + equal = ev == av + ok_ = true + es, as = strconv.Itoa(int(ev)), strconv.Itoa(int(av)) + } + case uint: + if av, ok := actual.(uint); ok { + equal = ev == av + ok_ = true + es, as = strconv.FormatUint(uint64(ev), 10), strconv.FormatUint(uint64(av), 10) + } + case uint8: + if av, ok := actual.(uint8); ok { + equal = ev == av + ok_ = true + es, as = strconv.FormatUint(uint64(ev), 10), strconv.FormatUint(uint64(av), 10) + } + case uint16: + if av, ok := actual.(uint16); ok { + equal = ev == av + ok_ = true + es, as = strconv.FormatUint(uint64(ev), 10), strconv.FormatUint(uint64(av), 10) + } + case uint32: + if av, ok := actual.(uint32); ok { + equal = ev == av + ok_ = true + es, as = strconv.FormatUint(uint64(ev), 10), strconv.FormatUint(uint64(av), 10) + } + case uint64: + if av, ok := actual.(uint64); ok { + equal = ev == av + ok_ = true + es, as = strconv.FormatUint(ev, 10), strconv.FormatUint(av, 10) + } + case bool: + if av, ok := actual.(bool); ok { + equal = ev == av + ok_ = true + if ev { + es, as = "true", "false" + } else { + es, as = "false", "true" + } + } + case float32: + if av, ok := actual.(float32); ok { + equal = ev == av + ok_ = true + } + case float64: + if av, ok := actual.(float64); ok { + equal = ev == av + ok_ = true + } + default: + return fail(t, msgs, "uassert.Equal: unsupported type") + } + + /* + // XXX: implement stringer and other well known similar interfaces + type stringer interface{ String() string } + if ev, ok := expected.(stringer); ok { + if av, ok := actual.(stringer); ok { + equal = ev.String() == av.String() + ok_ = true + } + } + */ + + if !ok_ { + return fail(t, msgs, "uassert.Equal: different types") // XXX: display the types + } + if !equal { + return fail(t, msgs, "uassert.Equal: same type but different value\n\texpected: %s\n\tactual: %s", es, as) + } + + return true +} + +// NotEqual asserts that two objects are not equal. +func NotEqual(t TestingT, expected, actual interface{}, msgs ...string) bool { + t.Helper() + + if expected == nil || actual == nil { + return expected != actual + } + + // XXX: errors + // XXX: slices + // XXX: pointers + + notEqual := false + ok_ := false + es, as := "unsupported type", "unsupported type" + + switch ev := expected.(type) { + case string: + if av, ok := actual.(string); ok { + notEqual = ev != av + ok_ = true + es, as = ev, as + } + case std.Address: + if av, ok := actual.(std.Address); ok { + notEqual = ev != av + ok_ = true + es, as = string(ev), string(av) + } + case int: + if av, ok := actual.(int); ok { + notEqual = ev != av + ok_ = true + es, as = strconv.Itoa(ev), strconv.Itoa(av) + } + case int8: + if av, ok := actual.(int8); ok { + notEqual = ev != av + ok_ = true + es, as = strconv.Itoa(int(ev)), strconv.Itoa(int(av)) + } + case int16: + if av, ok := actual.(int16); ok { + notEqual = ev != av + ok_ = true + es, as = strconv.Itoa(int(ev)), strconv.Itoa(int(av)) + } + case int32: + if av, ok := actual.(int32); ok { + notEqual = ev != av + ok_ = true + es, as = strconv.Itoa(int(ev)), strconv.Itoa(int(av)) + } + case int64: + if av, ok := actual.(int64); ok { + notEqual = ev != av + ok_ = true + es, as = strconv.Itoa(int(ev)), strconv.Itoa(int(av)) + } + case uint: + if av, ok := actual.(uint); ok { + notEqual = ev != av + ok_ = true + es, as = strconv.FormatUint(uint64(ev), 10), strconv.FormatUint(uint64(av), 10) + } + case uint8: + if av, ok := actual.(uint8); ok { + notEqual = ev != av + ok_ = true + es, as = strconv.FormatUint(uint64(ev), 10), strconv.FormatUint(uint64(av), 10) + } + case uint16: + if av, ok := actual.(uint16); ok { + notEqual = ev != av + ok_ = true + es, as = strconv.FormatUint(uint64(ev), 10), strconv.FormatUint(uint64(av), 10) + } + case uint32: + if av, ok := actual.(uint32); ok { + notEqual = ev != av + ok_ = true + es, as = strconv.FormatUint(uint64(ev), 10), strconv.FormatUint(uint64(av), 10) + } + case uint64: + if av, ok := actual.(uint64); ok { + notEqual = ev != av + ok_ = true + es, as = strconv.FormatUint(ev, 10), strconv.FormatUint(av, 10) + } + case bool: + if av, ok := actual.(bool); ok { + notEqual = ev != av + ok_ = true + if ev { + es, as = "true", "false" + } else { + es, as = "false", "true" + } + } + case float32: + if av, ok := actual.(float32); ok { + notEqual = ev != av + ok_ = true + } + case float64: + if av, ok := actual.(float64); ok { + notEqual = ev != av + ok_ = true + } + default: + return fail(t, msgs, "uassert.NotEqual: unsupported type") + } + + /* + // XXX: implement stringer and other well known similar interfaces + type stringer interface{ String() string } + if ev, ok := expected.(stringer); ok { + if av, ok := actual.(stringer); ok { + notEqual = ev.String() != av.String() + ok_ = true + } + } + */ + + if !ok_ { + return fail(t, msgs, "uassert.NotEqual: different types") // XXX: display the types + } + if !notEqual { + return fail(t, msgs, "uassert.NotEqual: same type and same value\n\texpected: %s\n\tactual: %s", es, as) + } + + return true +} + +func isNumberEmpty(n interface{}) (isNumber, isEmpty bool) { + switch n := n.(type) { + // NOTE: the cases are split individually, so that n becomes of the + // asserted type; the type of '0' was correctly inferred and converted + // to the corresponding type, int, int8, etc. + case int: + return true, n == 0 + case int8: + return true, n == 0 + case int16: + return true, n == 0 + case int32: + return true, n == 0 + case int64: + return true, n == 0 + case uint: + return true, n == 0 + case uint8: + return true, n == 0 + case uint16: + return true, n == 0 + case uint32: + return true, n == 0 + case uint64: + return true, n == 0 + case float32: + return true, n == 0 + case float64: + return true, n == 0 + } + return false, false +} +func Empty(t TestingT, obj interface{}, msgs ...string) bool { + t.Helper() + + isNumber, isEmpty := isNumberEmpty(obj) + if isNumber { + if !isEmpty { + return fail(t, msgs, "uassert.Empty: not empty number: %d", obj) + } + } else { + switch val := obj.(type) { + case string: + if val != "" { + return fail(t, msgs, "uassert.Empty: not empty string: %s", val) + } + case std.Address: + var zeroAddr std.Address + if val != zeroAddr { + return fail(t, msgs, "uassert.Empty: not empty std.Address: %s", string(val)) + } + default: + return fail(t, msgs, "uassert.Empty: unsupported type") + } + } + return true +} + +func NotEmpty(t TestingT, obj interface{}, msgs ...string) bool { + t.Helper() + isNumber, isEmpty := isNumberEmpty(obj) + if isNumber { + if isEmpty { + return fail(t, msgs, "uassert.NotEmpty: empty number: %d", obj) + } + } else { + switch val := obj.(type) { + case string: + if val == "" { + return fail(t, msgs, "uassert.NotEmpty: empty string: %s", val) + } + case std.Address: + var zeroAddr std.Address + if val == zeroAddr { + return fail(t, msgs, "uassert.NotEmpty: empty std.Address: %s", string(val)) + } + default: + return fail(t, msgs, "uassert.NotEmpty: unsupported type") + } + } + return true +} diff --git a/portal-loop/extracted/p/demo/uassert/uassert_test.gno b/portal-loop/extracted/p/demo/uassert/uassert_test.gno new file mode 100644 index 00000000..7862eca7 --- /dev/null +++ b/portal-loop/extracted/p/demo/uassert/uassert_test.gno @@ -0,0 +1,367 @@ +package uassert + +import ( + "errors" + "fmt" + "std" + "testing" +) + +var _ TestingT = (*testing.T)(nil) + +func TestMock(t *testing.T) { + mockT := new(mockTestingT) + mockT.empty(t) + NoError(mockT, errors.New("foo")) + mockT.equals(t, "error: unexpected error: foo") + NoError(mockT, errors.New("foo"), "custom message") + mockT.equals(t, "error: unexpected error: foo - custom message") + NoError(mockT, errors.New("foo"), "custom", "message") + mockT.equals(t, "error: unexpected error: foo - custom message") +} + +func TestNoError(t *testing.T) { + mockT := new(mockTestingT) + True(t, NoError(mockT, nil)) + mockT.empty(t) + False(t, NoError(mockT, errors.New("foo bar"))) + mockT.equals(t, "error: unexpected error: foo bar") +} + +func TestError(t *testing.T) { + mockT := new(mockTestingT) + True(t, Error(mockT, errors.New("foo bar"))) + mockT.empty(t) + False(t, Error(mockT, nil)) + mockT.equals(t, "error: an error is expected but got nil") +} + +func TestErrorContains(t *testing.T) { + mockT := new(mockTestingT) + + // nil error + var err error + False(t, ErrorContains(mockT, err, ""), "ErrorContains should return false for nil arg") +} + +func TestTrue(t *testing.T) { + mockT := new(mockTestingT) + if !True(mockT, true) { + t.Error("True should return true") + } + mockT.empty(t) + if True(mockT, false) { + t.Error("True should return false") + } + mockT.equals(t, "error: should be true") +} + +func TestFalse(t *testing.T) { + mockT := new(mockTestingT) + if !False(mockT, false) { + t.Error("False should return true") + } + mockT.empty(t) + if False(mockT, true) { + t.Error("False should return false") + } + mockT.equals(t, "error: should be false") +} + +func TestPanicsWithMessage(t *testing.T) { + mockT := new(mockTestingT) + if !PanicsWithMessage(mockT, "panic", func() { + panic(errors.New("panic")) + }) { + t.Error("PanicsWithMessage should return true") + } + mockT.empty(t) + + if PanicsWithMessage(mockT, "Panic!", func() { + // noop + }) { + t.Error("PanicsWithMessage should return false") + } + mockT.equals(t, "error: func should panic\n\tPanic value:\tnil") + + if PanicsWithMessage(mockT, "at the disco", func() { + panic(errors.New("panic")) + }) { + t.Error("PanicsWithMessage should return false") + } + mockT.equals(t, "error: func should panic with message:\tat the disco\n\tPanic value:\tpanic") + + if PanicsWithMessage(mockT, "Panic!", func() { + panic("panic") + }) { + t.Error("PanicsWithMessage should return false") + } + mockT.equals(t, "error: func should panic with message:\tPanic!\n\tPanic value:\tpanic") +} + +func TestNotPanics(t *testing.T) { + mockT := new(mockTestingT) + + if !NotPanics(mockT, func() { + // noop + }) { + t.Error("NotPanics should return true") + } + mockT.empty(t) + + if NotPanics(mockT, func() { + panic("Panic!") + }) { + t.Error("NotPanics should return false") + } +} + +func TestEqual(t *testing.T) { + mockT := new(mockTestingT) + + cases := []struct { + expected interface{} + actual interface{} + result bool + remark string + }{ + // expected to be equal + {"Hello World", "Hello World", true, ""}, + {123, 123, true, ""}, + {123.5, 123.5, true, ""}, + {nil, nil, true, ""}, + {int32(123), int32(123), true, ""}, + {uint64(123), uint64(123), true, ""}, + {std.Address("g12345"), std.Address("g12345"), true, ""}, + // XXX: continue + + // not expected to be equal + {"Hello World", 42, false, ""}, + {41, 42, false, ""}, + {10, uint(10), false, ""}, + // XXX: continue + + // expected to raise errors + // XXX: todo + } + + for _, c := range cases { + name := fmt.Sprintf("Equal(%v, %v)", c.expected, c.actual) + t.Run(name, func(t *testing.T) { + res := Equal(mockT, c.expected, c.actual) + + if res != c.result { + t.Errorf("%s should return %v: %s - %s", name, c.result, c.remark, mockT.actualString()) + } + }) + } +} + +func TestNotEqual(t *testing.T) { + mockT := new(mockTestingT) + + cases := []struct { + expected interface{} + actual interface{} + result bool + remark string + }{ + // expected to be not equal + {"Hello World", "Hello", true, ""}, + {123, 124, true, ""}, + {123.5, 123.6, true, ""}, + {nil, 123, true, ""}, + {int32(123), int32(124), true, ""}, + {uint64(123), uint64(124), true, ""}, + {std.Address("g12345"), std.Address("g67890"), true, ""}, + // XXX: continue + + // not expected to be not equal + {"Hello World", "Hello World", false, ""}, + {123, 123, false, ""}, + {123.5, 123.5, false, ""}, + {nil, nil, false, ""}, + {int32(123), int32(123), false, ""}, + {uint64(123), uint64(123), false, ""}, + {std.Address("g12345"), std.Address("g12345"), false, ""}, + // XXX: continue + + // expected to raise errors + // XXX: todo + } + + for _, c := range cases { + name := fmt.Sprintf("NotEqual(%v, %v)", c.expected, c.actual) + t.Run(name, func(t *testing.T) { + res := NotEqual(mockT, c.expected, c.actual) + + if res != c.result { + t.Errorf("%s should return %v: %s - %s", name, c.result, c.remark, mockT.actualString()) + } + }) + } +} + +type myStruct struct { + S string + I int +} + +func TestEmpty(t *testing.T) { + mockT := new(mockTestingT) + + cases := []struct { + obj interface{} + expectedEmpty bool + }{ + // expected to be empty + {"", true}, + {0, true}, + {int(0), true}, + {int32(0), true}, + {int64(0), true}, + {uint(0), true}, + // XXX: continue + + // not expected to be empty + {"Hello World", false}, + {1, false}, + {int32(1), false}, + {uint64(1), false}, + {std.Address("g12345"), false}, + + // unsupported + {nil, false}, + {myStruct{}, false}, + {&myStruct{}, false}, + } + + for _, c := range cases { + name := fmt.Sprintf("Empty(%v)", c.obj) + t.Run(name, func(t *testing.T) { + res := Empty(mockT, c.obj) + + if res != c.expectedEmpty { + t.Errorf("%s should return %v: %s", name, c.expectedEmpty, mockT.actualString()) + } + }) + } +} + +func TestEqualWithStringDiff(t *testing.T) { + cases := []struct { + name string + expected string + actual string + shouldPass bool + expectedMsg string + }{ + { + name: "Identical strings", + expected: "Hello, world!", + actual: "Hello, world!", + shouldPass: true, + expectedMsg: "", + }, + { + name: "Different strings - simple", + expected: "Hello, world!", + actual: "Hello, World!", + shouldPass: false, + expectedMsg: "error: uassert.Equal: strings are different\n\tDiff: Hello, [-w][+W]orld!", + }, + { + name: "Different strings - complex", + expected: "The quick brown fox jumps over the lazy dog", + actual: "The quick brown cat jumps over the lazy dog", + shouldPass: false, + expectedMsg: "error: uassert.Equal: strings are different\n\tDiff: The quick brown [-fox][+cat] jumps over the lazy dog", + }, + { + name: "Different strings - prefix", + expected: "prefix_string", + actual: "string", + shouldPass: false, + expectedMsg: "error: uassert.Equal: strings are different\n\tDiff: [-prefix_]string", + }, + { + name: "Different strings - suffix", + expected: "string", + actual: "string_suffix", + shouldPass: false, + expectedMsg: "error: uassert.Equal: strings are different\n\tDiff: string[+_suffix]", + }, + { + name: "Empty string vs non-empty string", + expected: "", + actual: "non-empty", + shouldPass: false, + expectedMsg: "error: uassert.Equal: strings are different\n\tDiff: [+non-empty]", + }, + { + name: "Non-empty string vs empty string", + expected: "non-empty", + actual: "", + shouldPass: false, + expectedMsg: "error: uassert.Equal: strings are different\n\tDiff: [-non-empty]", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + mockT := &mockTestingT{} + result := Equal(mockT, tc.expected, tc.actual) + + if result != tc.shouldPass { + t.Errorf("Expected Equal to return %v, but got %v", tc.shouldPass, result) + } + + if tc.shouldPass { + mockT.empty(t) + } else { + mockT.equals(t, tc.expectedMsg) + } + }) + } +} + +func TestNotEmpty(t *testing.T) { + mockT := new(mockTestingT) + + cases := []struct { + obj interface{} + expectedNotEmpty bool + }{ + // expected to be empty + {"", false}, + {0, false}, + {int(0), false}, + {int32(0), false}, + {int64(0), false}, + {uint(0), false}, + {std.Address(""), false}, + + // not expected to be empty + {"Hello World", true}, + {1, true}, + {int32(1), true}, + {uint64(1), true}, + {std.Address("g12345"), true}, + + // unsupported + {nil, false}, + {myStruct{}, false}, + {&myStruct{}, false}, + } + + for _, c := range cases { + name := fmt.Sprintf("NotEmpty(%v)", c.obj) + t.Run(name, func(t *testing.T) { + res := NotEmpty(mockT, c.obj) + + if res != c.expectedNotEmpty { + t.Errorf("%s should return %v: %s", name, c.expectedNotEmpty, mockT.actualString()) + } + }) + } +} diff --git a/portal-loop/extracted/p/demo/ufmt/pkg_metadata.json b/portal-loop/extracted/p/demo/ufmt/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/ufmt/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/ufmt/ufmt.gno b/portal-loop/extracted/p/demo/ufmt/ufmt.gno new file mode 100644 index 00000000..55494e32 --- /dev/null +++ b/portal-loop/extracted/p/demo/ufmt/ufmt.gno @@ -0,0 +1,284 @@ +// Package ufmt provides utility functions for formatting strings, similarly +// to the Go package "fmt", of which only a subset is currently supported +// (hence the name µfmt - micro fmt). +package ufmt + +import ( + "errors" + "strconv" + "strings" +) + +// Println formats using the default formats for its operands and writes to standard output. +// Println writes the given arguments to standard output with spaces between arguments +// and a newline at the end. +func Println(args ...interface{}) { + var strs []string + for _, arg := range args { + switch v := arg.(type) { + case string: + strs = append(strs, v) + case (interface{ String() string }): + strs = append(strs, v.String()) + case error: + strs = append(strs, v.Error()) + case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64: + strs = append(strs, Sprintf("%d", v)) + case bool: + if v { + strs = append(strs, "true") + } else { + strs = append(strs, "false") + } + case nil: + strs = append(strs, "") + default: + strs = append(strs, "(unhandled)") + } + } + + // TODO: remove println after gno supports os.Stdout + println(strings.Join(strs, " ")) +} + +// Sprintf offers similar functionality to Go's fmt.Sprintf, or the sprintf +// equivalent available in many languages, including C/C++. +// The number of args passed must exactly match the arguments consumed by the format. +// A limited number of formatting verbs and features are currently supported, +// hence the name ufmt (µfmt, micro-fmt). +// +// The currently formatted verbs are the following: +// +// %s: places a string value directly. +// If the value implements the interface interface{ String() string }, +// the String() method is called to retrieve the value. Same about Error() +// string. +// %c: formats the character represented by Unicode code point +// %d: formats an integer value using package "strconv". +// Currently supports only uint, uint64, int, int64. +// %t: formats a boolean value to "true" or "false". +// %%: outputs a literal %. Does not consume an argument. +func Sprintf(format string, args ...interface{}) string { + // we use runes to handle multi-byte characters + sTor := []rune(format) + end := len(sTor) + argNum := 0 + argLen := len(args) + buf := "" + + for i := 0; i < end; { + isLast := i == end-1 + c := string(sTor[i]) + + if isLast || c != "%" { + // we don't check for invalid format like a one ending with "%" + buf += string(c) + i++ + continue + } + + verb := string(sTor[i+1]) + if verb == "%" { + buf += "%" + i += 2 + continue + } + + if argNum > argLen { + panic("invalid number of arguments to ufmt.Sprintf") + } + arg := args[argNum] + argNum++ + + switch verb { + case "s": + switch v := arg.(type) { + case interface{ String() string }: + buf += v.String() + case error: + buf += v.Error() + case string: + buf += v + default: + buf += fallback(verb, v) + } + case "c": + switch v := arg.(type) { + // rune is int32. Exclude overflowing numeric types and dups (byte, int32): + case rune: + buf += string(v) + case int: + buf += string(v) + case int8: + buf += string(v) + case int16: + buf += string(v) + case uint: + buf += string(v) + case uint8: + buf += string(v) + case uint16: + buf += string(v) + default: + buf += fallback(verb, v) + } + case "d": + switch v := arg.(type) { + case int: + buf += strconv.Itoa(v) + case int8: + buf += strconv.Itoa(int(v)) + case int16: + buf += strconv.Itoa(int(v)) + case int32: + buf += strconv.Itoa(int(v)) + case int64: + buf += strconv.Itoa(int(v)) + case uint: + buf += strconv.FormatUint(uint64(v), 10) + case uint8: + buf += strconv.FormatUint(uint64(v), 10) + case uint16: + buf += strconv.FormatUint(uint64(v), 10) + case uint32: + buf += strconv.FormatUint(uint64(v), 10) + case uint64: + buf += strconv.FormatUint(v, 10) + default: + buf += fallback(verb, v) + } + case "t": + switch v := arg.(type) { + case bool: + if v { + buf += "true" + } else { + buf += "false" + } + default: + buf += fallback(verb, v) + } + // % handled before, as it does not consume an argument + default: + buf += "(unhandled verb: %" + verb + ")" + } + + i += 2 + } + if argNum < argLen { + panic("too many arguments to ufmt.Sprintf") + } + return buf +} + +// This function is used to mimic Go's fmt.Sprintf +// specific behaviour of showing verb/type mismatches, +// where for example: +// +// fmt.Sprintf("%d", "foo") gives "%!d(string=foo)" +// +// Here: +// +// fallback("s", 8) -> "%!s(int=8)" +// fallback("d", nil) -> "%!d()", and so on. +func fallback(verb string, arg interface{}) string { + var s string + switch v := arg.(type) { + case string: + s = "string=" + v + case (interface{ String() string }): + s = "string=" + v.String() + case error: + // note: also "string=" in Go fmt + s = "string=" + v.Error() + case int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64: + // note: rune, byte would be dups, being aliases + if typename, e := typeToString(v); e != nil { + panic("should not happen") + } else { + s = typename + "=" + Sprintf("%d", v) + } + case bool: + if v { + s = "bool=true" + } else { + s = "bool=false" + } + case nil: + s = "" + default: + s = "(unhandled)" + } + return "%!" + verb + "(" + s + ")" +} + +// Get the name of the type of `v` as a string. +// The recognized type of v is currently limited to native non-composite types. +// An error is returned otherwise. +func typeToString(v interface{}) (string, error) { + switch v.(type) { + case string: + return "string", nil + case int: + return "int", nil + case int8: + return "int8", nil + case int16: + return "int16", nil + case int32: + return "int32", nil + case int64: + return "int64", nil + case uint: + return "uint", nil + case uint8: + return "uint8", nil + case uint16: + return "uint16", nil + case uint32: + return "uint32", nil + case uint64: + return "uint64", nil + case float32: + return "float32", nil + case float64: + return "float64", nil + case bool: + return "bool", nil + default: + return "", errors.New("(unsupported type)") + } +} + +// errMsg implements the error interface. +type errMsg struct { + msg string +} + +// Error defines the requirements of the error interface. +// It functions similarly to Go's errors.New() +func (e *errMsg) Error() string { + return e.msg +} + +// Errorf is a function that mirrors the functionality of fmt.Errorf. +// +// It takes a format string and arguments to create a formatted string, +// then sets this string as the 'msg' field of an errMsg struct and returns a pointer to this struct. +// +// This function operates in a similar manner to Go's fmt.Errorf, +// providing a way to create formatted error messages. +// +// The currently formatted verbs are the following: +// +// %s: places a string value directly. +// If the value implements the interface interface{ String() string }, +// the String() method is called to retrieve the value. Same for error. +// %c: formats the character represented by Unicode code point +// %d: formats an integer value using package "strconv". +// Currently supports only uint, uint64, int, int64. +// %t: formats a boolean value to "true" or "false". +// %%: outputs a literal %. Does not consume an argument. +func Errorf(format string, args ...interface{}) error { + return &errMsg{Sprintf(format, args...)} +} diff --git a/portal-loop/extracted/p/demo/ufmt/ufmt_test.gno b/portal-loop/extracted/p/demo/ufmt/ufmt_test.gno new file mode 100644 index 00000000..d53fb39b --- /dev/null +++ b/portal-loop/extracted/p/demo/ufmt/ufmt_test.gno @@ -0,0 +1,179 @@ +package ufmt + +import ( + "errors" + "fmt" + "testing" +) + +type stringer struct{} + +func (stringer) String() string { + return "I'm a stringer" +} + +func TestSprintf(t *testing.T) { + tru := true + cases := []struct { + format string + values []interface{} + expectedOutput string + }{ + {"hello %s!", []interface{}{"planet"}, "hello planet!"}, + {"hi %%%s!", []interface{}{"worl%d"}, "hi %worl%d!"}, + {"%s %c %d %t", []interface{}{"foo", 'α', 421, true}, "foo α 421 true"}, + {"string [%s]", []interface{}{"foo"}, "string [foo]"}, + {"int [%d]", []interface{}{int(42)}, "int [42]"}, + {"int8 [%d]", []interface{}{int8(8)}, "int8 [8]"}, + {"int16 [%d]", []interface{}{int16(16)}, "int16 [16]"}, + {"int32 [%d]", []interface{}{int32(32)}, "int32 [32]"}, + {"int64 [%d]", []interface{}{int64(64)}, "int64 [64]"}, + {"uint [%d]", []interface{}{uint(42)}, "uint [42]"}, + {"uint8 [%d]", []interface{}{uint8(8)}, "uint8 [8]"}, + {"uint16 [%d]", []interface{}{uint16(16)}, "uint16 [16]"}, + {"uint32 [%d]", []interface{}{uint32(32)}, "uint32 [32]"}, + {"uint64 [%d]", []interface{}{uint64(64)}, "uint64 [64]"}, + {"bool [%t]", []interface{}{true}, "bool [true]"}, + {"bool [%t]", []interface{}{false}, "bool [false]"}, + {"no args", nil, "no args"}, + {"finish with %", nil, "finish with %"}, + {"stringer [%s]", []interface{}{stringer{}}, "stringer [I'm a stringer]"}, + {"â", nil, "â"}, + {"Hello, World! 😊", nil, "Hello, World! 😊"}, + {"unicode formatting: %s", []interface{}{"😊"}, "unicode formatting: 😊"}, + // mismatch printing + {"%s", []interface{}{nil}, "%!s()"}, + {"%s", []interface{}{421}, "%!s(int=421)"}, + {"%s", []interface{}{"z"}, "z"}, + {"%s", []interface{}{tru}, "%!s(bool=true)"}, + {"%s", []interface{}{'z'}, "%!s(int32=122)"}, + + {"%c", []interface{}{nil}, "%!c()"}, + {"%c", []interface{}{421}, "ƥ"}, + {"%c", []interface{}{"z"}, "%!c(string=z)"}, + {"%c", []interface{}{tru}, "%!c(bool=true)"}, + {"%c", []interface{}{'z'}, "z"}, + + {"%d", []interface{}{nil}, "%!d()"}, + {"%d", []interface{}{421}, "421"}, + {"%d", []interface{}{"z"}, "%!d(string=z)"}, + {"%d", []interface{}{tru}, "%!d(bool=true)"}, + {"%d", []interface{}{'z'}, "122"}, + + {"%t", []interface{}{nil}, "%!t()"}, + {"%t", []interface{}{421}, "%!t(int=421)"}, + {"%t", []interface{}{"z"}, "%!t(string=z)"}, + {"%t", []interface{}{tru}, "true"}, + {"%t", []interface{}{'z'}, "%!t(int32=122)"}, + } + + for _, tc := range cases { + name := fmt.Sprintf(tc.format, tc.values...) + t.Run(name, func(t *testing.T) { + got := Sprintf(tc.format, tc.values...) + if got != tc.expectedOutput { + t.Errorf("got %q, want %q.", got, tc.expectedOutput) + } + }) + } +} + +func TestErrorf(t *testing.T) { + tests := []struct { + name string + format string + args []interface{} + expected string + }{ + { + name: "simple string", + format: "error: %s", + args: []interface{}{"something went wrong"}, + expected: "error: something went wrong", + }, + { + name: "integer value", + format: "value: %d", + args: []interface{}{42}, + expected: "value: 42", + }, + { + name: "boolean value", + format: "success: %t", + args: []interface{}{true}, + expected: "success: true", + }, + { + name: "multiple values", + format: "error %d: %s (success=%t)", + args: []interface{}{123, "failure occurred", false}, + expected: "error 123: failure occurred (success=false)", + }, + { + name: "literal percent", + format: "literal %%", + args: []interface{}{}, + expected: "literal %", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := Errorf(tt.format, tt.args...) + if err.Error() != tt.expected { + t.Errorf("Errorf(%q, %v) = %q, expected %q", tt.format, tt.args, err.Error(), tt.expected) + } + }) + } +} + +func TestPrintErrors(t *testing.T) { + got := Sprintf("error: %s", errors.New("can I be printed?")) + expectedOutput := "error: can I be printed?" + if got != expectedOutput { + t.Errorf("got %q, want %q.", got, expectedOutput) + } +} + +// NOTE: Currently, there is no way to get the output of Println without using os.Stdout, +// so we can only test that it doesn't panic and print arguments well. +func TestPrintln(t *testing.T) { + tests := []struct { + name string + args []interface{} + expected string + }{ + { + name: "Empty args", + args: []interface{}{}, + expected: "", + }, + { + name: "String args", + args: []interface{}{"Hello", "World"}, + expected: "Hello World", + }, + { + name: "Integer args", + args: []interface{}{1, 2, 3}, + expected: "1 2 3", + }, + { + name: "Mixed args", + args: []interface{}{"Hello", 42, true, false, "World"}, + expected: "Hello 42 true false World", + }, + { + name: "Unhandled type", + args: []interface{}{"Hello", 3.14, []int{1, 2, 3}}, + expected: "Hello (unhandled) (unhandled)", + }, + } + + // TODO: replace os.Stdout with a buffer to capture the output and test it. + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + Println(tt.args...) + }) + } +} diff --git a/portal-loop/extracted/p/demo/ui/pkg_metadata.json b/portal-loop/extracted/p/demo/ui/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/ui/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/ui/ui.gno b/portal-loop/extracted/p/demo/ui/ui.gno new file mode 100644 index 00000000..f283effe --- /dev/null +++ b/portal-loop/extracted/p/demo/ui/ui.gno @@ -0,0 +1,229 @@ +package ui + +import ( + "strconv" + "strings" +) + +type DOM struct { + // metadata + Prefix string + Title string + WithComments bool + Classes []string + + // elements + Header Element + Body Element + Footer Element +} + +func (dom DOM) String() string { + classes := strings.Join(dom.Classes, " ") + + output := "" + + if classes != "" { + output += "
" + "\n\n" + } + + if dom.Title != "" { + output += H1(dom.Title).String(dom) + "\n" + } + + if header := dom.Header.String(dom); header != "" { + if dom.WithComments { + output += "" + } + output += header + "\n" + if dom.WithComments { + output += "" + } + } + + if body := dom.Body.String(dom); body != "" { + if dom.WithComments { + output += "" + } + output += body + "\n" + if dom.WithComments { + output += "" + } + } + + if footer := dom.Footer.String(dom); footer != "" { + if dom.WithComments { + output += "" + } + output += footer + "\n" + if dom.WithComments { + output += "" + } + } + + if classes != "" { + output += "
" + } + + // TODO: cleanup double new-lines. + + return output +} + +type Jumbotron []DomStringer + +func (j Jumbotron) String(dom DOM) string { + output := `
` + "\n\n" + for _, elem := range j { + output += elem.String(dom) + "\n" + } + output += `
` + "\n" + return output +} + +// XXX: rename Element to Div? +type Element []DomStringer + +func (e *Element) Append(elems ...DomStringer) { + *e = append(*e, elems...) +} + +func (e *Element) String(dom DOM) string { + output := "" + for _, elem := range *e { + output += elem.String(dom) + "\n" + } + return output +} + +type Breadcrumb []DomStringer + +func (b *Breadcrumb) Append(elems ...DomStringer) { + *b = append(*b, elems...) +} + +func (b Breadcrumb) String(dom DOM) string { + output := "" + for idx, entry := range b { + if idx > 0 { + output += " / " + } + output += entry.String(dom) + } + return output +} + +type Columns struct { + MaxWidth int + Columns []Element +} + +func (c *Columns) Append(elems ...Element) { + c.Columns = append(c.Columns, elems...) +} + +func (c Columns) String(dom DOM) string { + output := `
` + "\n" + for _, entry := range c.Columns { + output += `
` + "\n\n" + output += entry.String(dom) + output += "
\n" + } + output += "
\n" + return output +} + +type Link struct { + Text string + Path string + URL string +} + +// TODO: image + +// TODO: pager + +func (l Link) String(dom DOM) string { + url := "" + switch { + case l.Path != "" && l.URL != "": + panic("a link should have a path or a URL, not both.") + case l.Path != "": + if l.Text == "" { + l.Text = l.Path + } + url = dom.Prefix + l.Path + case l.URL != "": + if l.Text == "" { + l.Text = l.URL + } + url = l.URL + } + + return "[" + l.Text + "](" + url + ")" +} + +type BulletList []DomStringer + +func (bl BulletList) String(dom DOM) string { + output := "" + + for _, entry := range bl { + output += "- " + entry.String(dom) + "\n" + } + + return output +} + +func Text(s string) DomStringer { + return Raw{Content: s} +} + +type DomStringer interface { + String(dom DOM) string +} + +type Raw struct { + Content string +} + +func (r Raw) String(_ DOM) string { + return r.Content +} + +type ( + H1 string + H2 string + H3 string + H4 string + H5 string + H6 string + Bold string + Italic string + Code string + Paragraph string + Quote string + HR struct{} +) + +func (text H1) String(_ DOM) string { return "# " + string(text) + "\n" } +func (text H2) String(_ DOM) string { return "## " + string(text) + "\n" } +func (text H3) String(_ DOM) string { return "### " + string(text) + "\n" } +func (text H4) String(_ DOM) string { return "#### " + string(text) + "\n" } +func (text H5) String(_ DOM) string { return "##### " + string(text) + "\n" } +func (text H6) String(_ DOM) string { return "###### " + string(text) + "\n" } +func (text Quote) String(_ DOM) string { return "> " + string(text) + "\n" } +func (text Bold) String(_ DOM) string { return "**" + string(text) + "**" } +func (text Italic) String(_ DOM) string { return "_" + string(text) + "_" } +func (text Paragraph) String(_ DOM) string { return "\n" + string(text) + "\n" } +func (_ HR) String(_ DOM) string { return "\n---\n" } + +func (text Code) String(_ DOM) string { + // multiline + if strings.Contains(string(text), "\n") { + return "\n```\n" + string(text) + "\n```\n" + } + + // single line + return "`" + string(text) + "`" +} diff --git a/portal-loop/extracted/p/demo/ui/ui_test.gno b/portal-loop/extracted/p/demo/ui/ui_test.gno new file mode 100644 index 00000000..5b1faa29 --- /dev/null +++ b/portal-loop/extracted/p/demo/ui/ui_test.gno @@ -0,0 +1 @@ +package ui diff --git a/portal-loop/extracted/p/demo/uint256/LICENSE b/portal-loop/extracted/p/demo/uint256/LICENSE new file mode 100644 index 00000000..505e4324 --- /dev/null +++ b/portal-loop/extracted/p/demo/uint256/LICENSE @@ -0,0 +1,28 @@ +BSD 3-Clause License + +Copyright 2020 uint256 Authors + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/portal-loop/extracted/p/demo/uint256/README.md b/portal-loop/extracted/p/demo/uint256/README.md new file mode 100644 index 00000000..b580cd33 --- /dev/null +++ b/portal-loop/extracted/p/demo/uint256/README.md @@ -0,0 +1,5 @@ +# Fixed size 256-bit math library + +This is a library specialized at replacing the `big.Int` library for math based on 256-bit types. + +original repository: [uint256]() diff --git a/portal-loop/extracted/p/demo/uint256/arithmetic.gno b/portal-loop/extracted/p/demo/uint256/arithmetic.gno new file mode 100644 index 00000000..c3e2ed83 --- /dev/null +++ b/portal-loop/extracted/p/demo/uint256/arithmetic.gno @@ -0,0 +1,472 @@ +// arithmetic provides arithmetic operations for Uint objects. +// This includes basic binary operations such as addition, subtraction, multiplication, division, and modulo operations +// as well as overflow checks, and negation. These functions are essential for numeric +// calculations using 256-bit unsigned integers. +package uint256 + +import ( + "math/bits" +) + +// Add sets z to the sum x+y +func (z *Uint) Add(x, y *Uint) *Uint { + var carry uint64 + z.arr[0], carry = bits.Add64(x.arr[0], y.arr[0], 0) + z.arr[1], carry = bits.Add64(x.arr[1], y.arr[1], carry) + z.arr[2], carry = bits.Add64(x.arr[2], y.arr[2], carry) + z.arr[3], _ = bits.Add64(x.arr[3], y.arr[3], carry) + return z +} + +// AddOverflow sets z to the sum x+y, and returns z and whether overflow occurred +func (z *Uint) AddOverflow(x, y *Uint) (*Uint, bool) { + var carry uint64 + z.arr[0], carry = bits.Add64(x.arr[0], y.arr[0], 0) + z.arr[1], carry = bits.Add64(x.arr[1], y.arr[1], carry) + z.arr[2], carry = bits.Add64(x.arr[2], y.arr[2], carry) + z.arr[3], carry = bits.Add64(x.arr[3], y.arr[3], carry) + return z, carry != 0 +} + +// Sub sets z to the difference x-y +func (z *Uint) Sub(x, y *Uint) *Uint { + var carry uint64 + z.arr[0], carry = bits.Sub64(x.arr[0], y.arr[0], 0) + z.arr[1], carry = bits.Sub64(x.arr[1], y.arr[1], carry) + z.arr[2], carry = bits.Sub64(x.arr[2], y.arr[2], carry) + z.arr[3], _ = bits.Sub64(x.arr[3], y.arr[3], carry) + return z +} + +// SubOverflow sets z to the difference x-y and returns z and true if the operation underflowed +func (z *Uint) SubOverflow(x, y *Uint) (*Uint, bool) { + var carry uint64 + z.arr[0], carry = bits.Sub64(x.arr[0], y.arr[0], 0) + z.arr[1], carry = bits.Sub64(x.arr[1], y.arr[1], carry) + z.arr[2], carry = bits.Sub64(x.arr[2], y.arr[2], carry) + z.arr[3], carry = bits.Sub64(x.arr[3], y.arr[3], carry) + return z, carry != 0 +} + +// Neg returns -x mod 2^256. +func (z *Uint) Neg(x *Uint) *Uint { + return z.Sub(new(Uint), x) +} + +// commented out for possible overflow +// Mul sets z to the product x*y +func (z *Uint) Mul(x, y *Uint) *Uint { + var ( + res Uint + carry uint64 + res1, res2, res3 uint64 + ) + + carry, res.arr[0] = bits.Mul64(x.arr[0], y.arr[0]) + carry, res1 = umulHop(carry, x.arr[1], y.arr[0]) + carry, res2 = umulHop(carry, x.arr[2], y.arr[0]) + res3 = x.arr[3]*y.arr[0] + carry + + carry, res.arr[1] = umulHop(res1, x.arr[0], y.arr[1]) + carry, res2 = umulStep(res2, x.arr[1], y.arr[1], carry) + res3 = res3 + x.arr[2]*y.arr[1] + carry + + carry, res.arr[2] = umulHop(res2, x.arr[0], y.arr[2]) + res3 = res3 + x.arr[1]*y.arr[2] + carry + + res.arr[3] = res3 + x.arr[0]*y.arr[3] + + return z.Set(&res) +} + +// MulOverflow sets z to the product x*y, and returns z and whether overflow occurred +func (z *Uint) MulOverflow(x, y *Uint) (*Uint, bool) { + p := umul(x, y) + copy(z.arr[:], p[:4]) + return z, (p[4] | p[5] | p[6] | p[7]) != 0 +} + +// commented out for possible overflow +// Div sets z to the quotient x/y for returns z. +// If y == 0, z is set to 0 +func (z *Uint) Div(x, y *Uint) *Uint { + if y.IsZero() || y.Gt(x) { + return z.Clear() + } + if x.Eq(y) { + return z.SetOne() + } + // Shortcut some cases + if x.IsUint64() { + return z.SetUint64(x.Uint64() / y.Uint64()) + } + + // At this point, we know + // x/y ; x > y > 0 + + var quot Uint + udivrem(quot.arr[:], x.arr[:], y) + return z.Set(") +} + +// MulMod calculates the modulo-m multiplication of x and y and +// returns z. +// If m == 0, z is set to 0 (OBS: differs from the big.Int) +func (z *Uint) MulMod(x, y, m *Uint) *Uint { + if x.IsZero() || y.IsZero() || m.IsZero() { + return z.Clear() + } + p := umul(x, y) + + if m.arr[3] != 0 { + mu := Reciprocal(m) + r := reduce4(p, m, mu) + return z.Set(&r) + } + + var ( + pl Uint + ph Uint + ) + + pl = Uint{arr: [4]uint64{p[0], p[1], p[2], p[3]}} + ph = Uint{arr: [4]uint64{p[4], p[5], p[6], p[7]}} + + // If the multiplication is within 256 bits use Mod(). + if ph.IsZero() { + return z.Mod(&pl, m) + } + + var quot [8]uint64 + rem := udivrem(quot[:], p[:], m) + return z.Set(&rem) +} + +// Mod sets z to the modulus x%y for y != 0 and returns z. +// If y == 0, z is set to 0 (OBS: differs from the big.Uint) +func (z *Uint) Mod(x, y *Uint) *Uint { + if x.IsZero() || y.IsZero() { + return z.Clear() + } + switch x.Cmp(y) { + case -1: + // x < y + copy(z.arr[:], x.arr[:]) + return z + case 0: + // x == y + return z.Clear() // They are equal + } + + // At this point: + // x != 0 + // y != 0 + // x > y + + // Shortcut trivial case + if x.IsUint64() { + return z.SetUint64(x.Uint64() % y.Uint64()) + } + + var quot Uint + *z = udivrem(quot.arr[:], x.arr[:], y) + return z +} + +// DivMod sets z to the quotient x div y and m to the modulus x mod y and returns the pair (z, m) for y != 0. +// If y == 0, both z and m are set to 0 (OBS: differs from the big.Int) +func (z *Uint) DivMod(x, y, m *Uint) (*Uint, *Uint) { + if y.IsZero() { + return z.Clear(), m.Clear() + } + var quot Uint + *m = udivrem(quot.arr[:], x.arr[:], y) + *z = quot + return z, m +} + +// Exp sets z = base**exponent mod 2**256, and returns z. +func (z *Uint) Exp(base, exponent *Uint) *Uint { + res := Uint{arr: [4]uint64{1, 0, 0, 0}} + multiplier := *base + expBitLen := exponent.BitLen() + + curBit := 0 + word := exponent.arr[0] + for ; curBit < expBitLen && curBit < 64; curBit++ { + if word&1 == 1 { + res.Mul(&res, &multiplier) + } + multiplier.squared() + word >>= 1 + } + + word = exponent.arr[1] + for ; curBit < expBitLen && curBit < 128; curBit++ { + if word&1 == 1 { + res.Mul(&res, &multiplier) + } + multiplier.squared() + word >>= 1 + } + + word = exponent.arr[2] + for ; curBit < expBitLen && curBit < 192; curBit++ { + if word&1 == 1 { + res.Mul(&res, &multiplier) + } + multiplier.squared() + word >>= 1 + } + + word = exponent.arr[3] + for ; curBit < expBitLen && curBit < 256; curBit++ { + if word&1 == 1 { + res.Mul(&res, &multiplier) + } + multiplier.squared() + word >>= 1 + } + return z.Set(&res) +} + +func (z *Uint) squared() { + var ( + res Uint + carry0, carry1, carry2 uint64 + res1, res2 uint64 + ) + + carry0, res.arr[0] = bits.Mul64(z.arr[0], z.arr[0]) + carry0, res1 = umulHop(carry0, z.arr[0], z.arr[1]) + carry0, res2 = umulHop(carry0, z.arr[0], z.arr[2]) + + carry1, res.arr[1] = umulHop(res1, z.arr[0], z.arr[1]) + carry1, res2 = umulStep(res2, z.arr[1], z.arr[1], carry1) + + carry2, res.arr[2] = umulHop(res2, z.arr[0], z.arr[2]) + + res.arr[3] = 2*(z.arr[0]*z.arr[3]+z.arr[1]*z.arr[2]) + carry0 + carry1 + carry2 + + z.Set(&res) +} + +// udivrem divides u by d and produces both quotient and remainder. +// The quotient is stored in provided quot - len(u)-len(d)+1 words. +// It loosely follows the Knuth's division algorithm (sometimes referenced as "schoolbook" division) using 64-bit words. +// See Knuth, Volume 2, section 4.3.1, Algorithm D. +func udivrem(quot, u []uint64, d *Uint) (rem Uint) { + var dLen int + for i := len(d.arr) - 1; i >= 0; i-- { + if d.arr[i] != 0 { + dLen = i + 1 + break + } + } + + shift := uint(bits.LeadingZeros64(d.arr[dLen-1])) + + var dnStorage Uint + dn := dnStorage.arr[:dLen] + for i := dLen - 1; i > 0; i-- { + dn[i] = (d.arr[i] << shift) | (d.arr[i-1] >> (64 - shift)) + } + dn[0] = d.arr[0] << shift + + var uLen int + for i := len(u) - 1; i >= 0; i-- { + if u[i] != 0 { + uLen = i + 1 + break + } + } + + if uLen < dLen { + copy(rem.arr[:], u) + return rem + } + + var unStorage [9]uint64 + un := unStorage[:uLen+1] + un[uLen] = u[uLen-1] >> (64 - shift) + for i := uLen - 1; i > 0; i-- { + un[i] = (u[i] << shift) | (u[i-1] >> (64 - shift)) + } + un[0] = u[0] << shift + + // TODO: Skip the highest word of numerator if not significant. + + if dLen == 1 { + r := udivremBy1(quot, un, dn[0]) + rem.SetUint64(r >> shift) + return rem + } + + udivremKnuth(quot, un, dn) + + for i := 0; i < dLen-1; i++ { + rem.arr[i] = (un[i] >> shift) | (un[i+1] << (64 - shift)) + } + rem.arr[dLen-1] = un[dLen-1] >> shift + + return rem +} + +// umul computes full 256 x 256 -> 512 multiplication. +func umul(x, y *Uint) [8]uint64 { + var ( + res [8]uint64 + carry, carry4, carry5, carry6 uint64 + res1, res2, res3, res4, res5 uint64 + ) + + carry, res[0] = bits.Mul64(x.arr[0], y.arr[0]) + carry, res1 = umulHop(carry, x.arr[1], y.arr[0]) + carry, res2 = umulHop(carry, x.arr[2], y.arr[0]) + carry4, res3 = umulHop(carry, x.arr[3], y.arr[0]) + + carry, res[1] = umulHop(res1, x.arr[0], y.arr[1]) + carry, res2 = umulStep(res2, x.arr[1], y.arr[1], carry) + carry, res3 = umulStep(res3, x.arr[2], y.arr[1], carry) + carry5, res4 = umulStep(carry4, x.arr[3], y.arr[1], carry) + + carry, res[2] = umulHop(res2, x.arr[0], y.arr[2]) + carry, res3 = umulStep(res3, x.arr[1], y.arr[2], carry) + carry, res4 = umulStep(res4, x.arr[2], y.arr[2], carry) + carry6, res5 = umulStep(carry5, x.arr[3], y.arr[2], carry) + + carry, res[3] = umulHop(res3, x.arr[0], y.arr[3]) + carry, res[4] = umulStep(res4, x.arr[1], y.arr[3], carry) + carry, res[5] = umulStep(res5, x.arr[2], y.arr[3], carry) + res[7], res[6] = umulStep(carry6, x.arr[3], y.arr[3], carry) + + return res +} + +// umulStep computes (hi * 2^64 + lo) = z + (x * y) + carry. +func umulStep(z, x, y, carry uint64) (hi, lo uint64) { + hi, lo = bits.Mul64(x, y) + lo, carry = bits.Add64(lo, carry, 0) + hi, _ = bits.Add64(hi, 0, carry) + lo, carry = bits.Add64(lo, z, 0) + hi, _ = bits.Add64(hi, 0, carry) + return hi, lo +} + +// umulHop computes (hi * 2^64 + lo) = z + (x * y) +func umulHop(z, x, y uint64) (hi, lo uint64) { + hi, lo = bits.Mul64(x, y) + lo, carry := bits.Add64(lo, z, 0) + hi, _ = bits.Add64(hi, 0, carry) + return hi, lo +} + +// udivremBy1 divides u by single normalized word d and produces both quotient and remainder. +// The quotient is stored in provided quot. +func udivremBy1(quot, u []uint64, d uint64) (rem uint64) { + reciprocal := reciprocal2by1(d) + rem = u[len(u)-1] // Set the top word as remainder. + for j := len(u) - 2; j >= 0; j-- { + quot[j], rem = udivrem2by1(rem, u[j], d, reciprocal) + } + return rem +} + +// udivremKnuth implements the division of u by normalized multiple word d from the Knuth's division algorithm. +// The quotient is stored in provided quot - len(u)-len(d) words. +// Updates u to contain the remainder - len(d) words. +func udivremKnuth(quot, u, d []uint64) { + dh := d[len(d)-1] + dl := d[len(d)-2] + reciprocal := reciprocal2by1(dh) + + for j := len(u) - len(d) - 1; j >= 0; j-- { + u2 := u[j+len(d)] + u1 := u[j+len(d)-1] + u0 := u[j+len(d)-2] + + var qhat, rhat uint64 + if u2 >= dh { // Division overflows. + qhat = ^uint64(0) + // TODO: Add "qhat one to big" adjustment (not needed for correctness, but helps avoiding "add back" case). + } else { + qhat, rhat = udivrem2by1(u2, u1, dh, reciprocal) + ph, pl := bits.Mul64(qhat, dl) + if ph > rhat || (ph == rhat && pl > u0) { + qhat-- + // TODO: Add "qhat one to big" adjustment (not needed for correctness, but helps avoiding "add back" case). + } + } + + // Multiply and subtract. + borrow := subMulTo(u[j:], d, qhat) + u[j+len(d)] = u2 - borrow + if u2 < borrow { // Too much subtracted, add back. + qhat-- + u[j+len(d)] += addTo(u[j:], d) + } + + quot[j] = qhat // Store quotient digit. + } +} + +// isBitSet returns true if bit n-th is set, where n = 0 is LSB. +// The n must be <= 255. +func (z *Uint) isBitSet(n uint) bool { + return (z.arr[n/64] & (1 << (n % 64))) != 0 +} + +// addTo computes x += y. +// Requires len(x) >= len(y). +func addTo(x, y []uint64) uint64 { + var carry uint64 + for i := 0; i < len(y); i++ { + x[i], carry = bits.Add64(x[i], y[i], carry) + } + return carry +} + +// subMulTo computes x -= y * multiplier. +// Requires len(x) >= len(y). +func subMulTo(x, y []uint64, multiplier uint64) uint64 { + var borrow uint64 + for i := 0; i < len(y); i++ { + s, carry1 := bits.Sub64(x[i], borrow, 0) + ph, pl := bits.Mul64(y[i], multiplier) + t, carry2 := bits.Sub64(s, pl, 0) + x[i] = t + borrow = ph + carry1 + carry2 + } + return borrow +} + +// reciprocal2by1 computes <^d, ^0> / d. +func reciprocal2by1(d uint64) uint64 { + reciprocal, _ := bits.Div64(^d, ^uint64(0), d) + return reciprocal +} + +// udivrem2by1 divides / d and produces both quotient and remainder. +// It uses the provided d's reciprocal. +// Implementation ported from https://github.com/chfast/intx and is based on +// "Improved division by invariant integers", Algorithm 4. +func udivrem2by1(uh, ul, d, reciprocal uint64) (quot, rem uint64) { + qh, ql := bits.Mul64(reciprocal, uh) + ql, carry := bits.Add64(ql, ul, 0) + qh, _ = bits.Add64(qh, uh, carry) + qh++ + + r := ul - qh*d + + if r > ql { + qh-- + r += d + } + + if r >= d { + qh++ + r -= d + } + + return qh, r +} diff --git a/portal-loop/extracted/p/demo/uint256/arithmetic_test.gno b/portal-loop/extracted/p/demo/uint256/arithmetic_test.gno new file mode 100644 index 00000000..9f45a507 --- /dev/null +++ b/portal-loop/extracted/p/demo/uint256/arithmetic_test.gno @@ -0,0 +1,326 @@ +package uint256 + +import "testing" + +type binOp2Test struct { + x, y, want string +} + +func TestAdd(t *testing.T) { + tests := []binOp2Test{ + {"0", "1", "1"}, + {"1", "0", "1"}, + {"1", "1", "2"}, + {"1", "3", "4"}, + {"10", "10", "20"}, + {"18446744073709551615", "18446744073709551615", "36893488147419103230"}, // uint64 overflow + } + + for _, tc := range tests { + x, err := FromDecimal(tc.x) + if err != nil { + t.Error(err) + continue + } + + y, err := FromDecimal(tc.y) + if err != nil { + t.Error(err) + continue + } + + want, err := FromDecimal(tc.want) + if err != nil { + t.Error(err) + continue + } + + got := &Uint{} + got.Add(x, y) + + if got.Neq(want) { + t.Errorf("Add(%s, %s) = %v, want %v", tc.x, tc.y, got.ToString(), want.ToString()) + } + } +} + +func TestSub(t *testing.T) { + tests := []binOp2Test{ + {"1", "0", "1"}, + {"1", "1", "0"}, + {"10", "10", "0"}, + {"31337", "1337", "30000"}, + {"2", "3", "115792089237316195423570985008687907853269984665640564039457584007913129639935"}, // underflow + } + + for _, tc := range tests { + x, err := FromDecimal(tc.x) + if err != nil { + t.Error(err) + continue + } + + y, err := FromDecimal(tc.y) + if err != nil { + t.Error(err) + continue + } + + want, err := FromDecimal(tc.want) + if err != nil { + t.Error(err) + continue + } + + got := &Uint{} + got.Sub(x, y) + + if got.Neq(want) { + t.Errorf("Sub(%s, %s) = %v, want %v", tc.x, tc.y, got.ToString(), want.ToString()) + } + } +} + +func TestMul(t *testing.T) { + tests := []binOp2Test{ + {"1", "0", "0"}, + {"1", "1", "1"}, + {"10", "10", "100"}, + {"18446744073709551615", "2", "36893488147419103230"}, // uint64 overflow + } + + for _, tc := range tests { + x, err := FromDecimal(tc.x) + if err != nil { + t.Error(err) + continue + } + + y, err := FromDecimal(tc.y) + if err != nil { + t.Error(err) + continue + } + + want, err := FromDecimal(tc.want) + if err != nil { + t.Error(err) + continue + } + + got := &Uint{} + got.Mul(x, y) + + if got.Neq(want) { + t.Errorf("Mul(%s, %s) = %v, want %v", tc.x, tc.y, got.ToString(), want.ToString()) + } + } +} + +func TestDiv(t *testing.T) { + tests := []binOp2Test{ + {"31337", "3", "10445"}, + {"31337", "0", "0"}, + {"0", "31337", "0"}, + {"1", "1", "1"}, + } + + for _, tc := range tests { + x, err := FromDecimal(tc.x) + if err != nil { + t.Error(err) + continue + } + + y, err := FromDecimal(tc.y) + if err != nil { + t.Error(err) + continue + } + + want, err := FromDecimal(tc.want) + if err != nil { + t.Error(err) + continue + } + + got := &Uint{} + got.Div(x, y) + + if got.Neq(want) { + t.Errorf("Div(%s, %s) = %v, want %v", tc.x, tc.y, got.ToString(), want.ToString()) + } + } +} + +func TestMod(t *testing.T) { + tests := []binOp2Test{ + {"31337", "3", "2"}, + {"31337", "0", "0"}, + {"0", "31337", "0"}, + {"2", "31337", "2"}, + {"1", "1", "0"}, + } + + for _, tc := range tests { + x, err := FromDecimal(tc.x) + if err != nil { + t.Error(err) + continue + } + + y, err := FromDecimal(tc.y) + if err != nil { + t.Error(err) + continue + } + + want, err := FromDecimal(tc.want) + if err != nil { + t.Error(err) + continue + } + + got := &Uint{} + got.Mod(x, y) + + if got.Neq(want) { + t.Errorf("Mod(%s, %s) = %v, want %v", tc.x, tc.y, got.ToString(), want.ToString()) + } + } +} + +func TestDivMod(t *testing.T) { + tests := []struct { + x string + y string + wantDiv string + wantMod string + }{ + {"1", "1", "1", "0"}, + {"10", "10", "1", "0"}, + {"100", "10", "10", "0"}, + {"31337", "3", "10445", "2"}, + {"31337", "0", "0", "0"}, + {"0", "31337", "0", "0"}, + {"2", "31337", "0", "2"}, + } + + for _, tc := range tests { + x, err := FromDecimal(tc.x) + if err != nil { + t.Error(err) + continue + } + + y, err := FromDecimal(tc.y) + if err != nil { + t.Error(err) + continue + } + + wantDiv, err := FromDecimal(tc.wantDiv) + if err != nil { + t.Error(err) + continue + } + + wantMod, err := FromDecimal(tc.wantMod) + if err != nil { + t.Error(err) + continue + } + + gotDiv := new(Uint) + gotMod := new(Uint) + gotDiv.DivMod(x, y, gotMod) + + for i := range gotDiv.arr { + if gotDiv.arr[i] != wantDiv.arr[i] { + t.Errorf("DivMod(%s, %s) got Div %v, want Div %v", tc.x, tc.y, gotDiv, wantDiv) + break + } + } + for i := range gotMod.arr { + if gotMod.arr[i] != wantMod.arr[i] { + t.Errorf("DivMod(%s, %s) got Mod %v, want Mod %v", tc.x, tc.y, gotMod, wantMod) + break + } + } + } +} + +func TestNeg(t *testing.T) { + tests := []struct { + x string + want string + }{ + {"31337", "115792089237316195423570985008687907853269984665640564039457584007913129608599"}, + {"115792089237316195423570985008687907853269984665640564039457584007913129608599", "31337"}, + {"0", "0"}, + {"2", "115792089237316195423570985008687907853269984665640564039457584007913129639934"}, + {"1", "115792089237316195423570985008687907853269984665640564039457584007913129639935"}, + } + + for _, tc := range tests { + x, err := FromDecimal(tc.x) + if err != nil { + t.Error(err) + continue + } + + want, err := FromDecimal(tc.want) + if err != nil { + t.Error(err) + continue + } + + got := &Uint{} + got.Neg(x) + + if got.Neq(want) { + t.Errorf("Neg(%s) = %v, want %v", tc.x, got.ToString(), want.ToString()) + } + } +} + +func TestExp(t *testing.T) { + tests := []binOp2Test{ + {"31337", "3", "30773171189753"}, + {"31337", "0", "1"}, + {"0", "31337", "0"}, + {"1", "1", "1"}, + {"2", "3", "8"}, + {"2", "64", "18446744073709551616"}, + {"2", "128", "340282366920938463463374607431768211456"}, + {"2", "255", "57896044618658097711785492504343953926634992332820282019728792003956564819968"}, + {"2", "256", "0"}, // overflow + } + + for _, tc := range tests { + x, err := FromDecimal(tc.x) + if err != nil { + t.Error(err) + continue + } + + y, err := FromDecimal(tc.y) + if err != nil { + t.Error(err) + continue + } + + want, err := FromDecimal(tc.want) + if err != nil { + t.Error(err) + continue + } + + got := &Uint{} + got.Exp(x, y) + + if got.Neq(want) { + t.Errorf("Exp(%s, %s) = %v, want %v", tc.x, tc.y, got.ToString(), want.ToString()) + } + } +} diff --git a/portal-loop/extracted/p/demo/uint256/bits_table.gno b/portal-loop/extracted/p/demo/uint256/bits_table.gno new file mode 100644 index 00000000..53dbea94 --- /dev/null +++ b/portal-loop/extracted/p/demo/uint256/bits_table.gno @@ -0,0 +1,79 @@ +// Copyright 2017 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Code generated by go run make_tables.go. DO NOT EDIT. + +package uint256 + +const ntz8tab = "" + + "\x08\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + + "\x04\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + + "\x05\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + + "\x04\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + + "\x06\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + + "\x04\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + + "\x05\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + + "\x04\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + + "\x07\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + + "\x04\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + + "\x05\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + + "\x04\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + + "\x06\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + + "\x04\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + + "\x05\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + + "\x04\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + +const pop8tab = "" + + "\x00\x01\x01\x02\x01\x02\x02\x03\x01\x02\x02\x03\x02\x03\x03\x04" + + "\x01\x02\x02\x03\x02\x03\x03\x04\x02\x03\x03\x04\x03\x04\x04\x05" + + "\x01\x02\x02\x03\x02\x03\x03\x04\x02\x03\x03\x04\x03\x04\x04\x05" + + "\x02\x03\x03\x04\x03\x04\x04\x05\x03\x04\x04\x05\x04\x05\x05\x06" + + "\x01\x02\x02\x03\x02\x03\x03\x04\x02\x03\x03\x04\x03\x04\x04\x05" + + "\x02\x03\x03\x04\x03\x04\x04\x05\x03\x04\x04\x05\x04\x05\x05\x06" + + "\x02\x03\x03\x04\x03\x04\x04\x05\x03\x04\x04\x05\x04\x05\x05\x06" + + "\x03\x04\x04\x05\x04\x05\x05\x06\x04\x05\x05\x06\x05\x06\x06\x07" + + "\x01\x02\x02\x03\x02\x03\x03\x04\x02\x03\x03\x04\x03\x04\x04\x05" + + "\x02\x03\x03\x04\x03\x04\x04\x05\x03\x04\x04\x05\x04\x05\x05\x06" + + "\x02\x03\x03\x04\x03\x04\x04\x05\x03\x04\x04\x05\x04\x05\x05\x06" + + "\x03\x04\x04\x05\x04\x05\x05\x06\x04\x05\x05\x06\x05\x06\x06\x07" + + "\x02\x03\x03\x04\x03\x04\x04\x05\x03\x04\x04\x05\x04\x05\x05\x06" + + "\x03\x04\x04\x05\x04\x05\x05\x06\x04\x05\x05\x06\x05\x06\x06\x07" + + "\x03\x04\x04\x05\x04\x05\x05\x06\x04\x05\x05\x06\x05\x06\x06\x07" + + "\x04\x05\x05\x06\x05\x06\x06\x07\x05\x06\x06\x07\x06\x07\x07\x08" + +const rev8tab = "" + + "\x00\x80\x40\xc0\x20\xa0\x60\xe0\x10\x90\x50\xd0\x30\xb0\x70\xf0" + + "\x08\x88\x48\xc8\x28\xa8\x68\xe8\x18\x98\x58\xd8\x38\xb8\x78\xf8" + + "\x04\x84\x44\xc4\x24\xa4\x64\xe4\x14\x94\x54\xd4\x34\xb4\x74\xf4" + + "\x0c\x8c\x4c\xcc\x2c\xac\x6c\xec\x1c\x9c\x5c\xdc\x3c\xbc\x7c\xfc" + + "\x02\x82\x42\xc2\x22\xa2\x62\xe2\x12\x92\x52\xd2\x32\xb2\x72\xf2" + + "\x0a\x8a\x4a\xca\x2a\xaa\x6a\xea\x1a\x9a\x5a\xda\x3a\xba\x7a\xfa" + + "\x06\x86\x46\xc6\x26\xa6\x66\xe6\x16\x96\x56\xd6\x36\xb6\x76\xf6" + + "\x0e\x8e\x4e\xce\x2e\xae\x6e\xee\x1e\x9e\x5e\xde\x3e\xbe\x7e\xfe" + + "\x01\x81\x41\xc1\x21\xa1\x61\xe1\x11\x91\x51\xd1\x31\xb1\x71\xf1" + + "\x09\x89\x49\xc9\x29\xa9\x69\xe9\x19\x99\x59\xd9\x39\xb9\x79\xf9" + + "\x05\x85\x45\xc5\x25\xa5\x65\xe5\x15\x95\x55\xd5\x35\xb5\x75\xf5" + + "\x0d\x8d\x4d\xcd\x2d\xad\x6d\xed\x1d\x9d\x5d\xdd\x3d\xbd\x7d\xfd" + + "\x03\x83\x43\xc3\x23\xa3\x63\xe3\x13\x93\x53\xd3\x33\xb3\x73\xf3" + + "\x0b\x8b\x4b\xcb\x2b\xab\x6b\xeb\x1b\x9b\x5b\xdb\x3b\xbb\x7b\xfb" + + "\x07\x87\x47\xc7\x27\xa7\x67\xe7\x17\x97\x57\xd7\x37\xb7\x77\xf7" + + "\x0f\x8f\x4f\xcf\x2f\xaf\x6f\xef\x1f\x9f\x5f\xdf\x3f\xbf\x7f\xff" + +const len8tab = "" + + "\x00\x01\x02\x02\x03\x03\x03\x03\x04\x04\x04\x04\x04\x04\x04\x04" + + "\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05" + + "\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06" + + "\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06" + + "\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" + + "\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" + + "\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" + + "\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" + + "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" + + "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" + + "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" + + "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" + + "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" + + "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" + + "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" + + "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" diff --git a/portal-loop/extracted/p/demo/uint256/bitwise.gno b/portal-loop/extracted/p/demo/uint256/bitwise.gno new file mode 100644 index 00000000..fc6e098d --- /dev/null +++ b/portal-loop/extracted/p/demo/uint256/bitwise.gno @@ -0,0 +1,264 @@ +// bitwise contains bitwise operations for Uint instances. +// This file includes functions to perform bitwise AND, OR, XOR, and NOT operations, as well as bit shifting. +// These operations are crucial for manipulating individual bits within a 256-bit unsigned integer. +package uint256 + +// Or sets z = x | y and returns z. +func (z *Uint) Or(x, y *Uint) *Uint { + z.arr[0] = x.arr[0] | y.arr[0] + z.arr[1] = x.arr[1] | y.arr[1] + z.arr[2] = x.arr[2] | y.arr[2] + z.arr[3] = x.arr[3] | y.arr[3] + return z +} + +// And sets z = x & y and returns z. +func (z *Uint) And(x, y *Uint) *Uint { + z.arr[0] = x.arr[0] & y.arr[0] + z.arr[1] = x.arr[1] & y.arr[1] + z.arr[2] = x.arr[2] & y.arr[2] + z.arr[3] = x.arr[3] & y.arr[3] + return z +} + +// Not sets z = ^x and returns z. +func (z *Uint) Not(x *Uint) *Uint { + z.arr[3], z.arr[2], z.arr[1], z.arr[0] = ^x.arr[3], ^x.arr[2], ^x.arr[1], ^x.arr[0] + return z +} + +// AndNot sets z = x &^ y and returns z. +func (z *Uint) AndNot(x, y *Uint) *Uint { + z.arr[0] = x.arr[0] &^ y.arr[0] + z.arr[1] = x.arr[1] &^ y.arr[1] + z.arr[2] = x.arr[2] &^ y.arr[2] + z.arr[3] = x.arr[3] &^ y.arr[3] + return z +} + +// Xor sets z = x ^ y and returns z. +func (z *Uint) Xor(x, y *Uint) *Uint { + z.arr[0] = x.arr[0] ^ y.arr[0] + z.arr[1] = x.arr[1] ^ y.arr[1] + z.arr[2] = x.arr[2] ^ y.arr[2] + z.arr[3] = x.arr[3] ^ y.arr[3] + return z +} + +// Lsh sets z = x << n and returns z. +func (z *Uint) Lsh(x *Uint, n uint) *Uint { + // n % 64 == 0 + if n&0x3f == 0 { + switch n { + case 0: + return z.Set(x) + case 64: + return z.lsh64(x) + case 128: + return z.lsh128(x) + case 192: + return z.lsh192(x) + default: + return z.Clear() + } + } + var a, b uint64 + // Big swaps first + switch { + case n > 192: + if n > 256 { + return z.Clear() + } + z.lsh192(x) + n -= 192 + goto sh192 + case n > 128: + z.lsh128(x) + n -= 128 + goto sh128 + case n > 64: + z.lsh64(x) + n -= 64 + goto sh64 + default: + z.Set(x) + } + + // remaining shifts + a = z.arr[0] >> (64 - n) + z.arr[0] = z.arr[0] << n + +sh64: + b = z.arr[1] >> (64 - n) + z.arr[1] = (z.arr[1] << n) | a + +sh128: + a = z.arr[2] >> (64 - n) + z.arr[2] = (z.arr[2] << n) | b + +sh192: + z.arr[3] = (z.arr[3] << n) | a + + return z +} + +// Rsh sets z = x >> n and returns z. +func (z *Uint) Rsh(x *Uint, n uint) *Uint { + // n % 64 == 0 + if n&0x3f == 0 { + switch n { + case 0: + return z.Set(x) + case 64: + return z.rsh64(x) + case 128: + return z.rsh128(x) + case 192: + return z.rsh192(x) + default: + return z.Clear() + } + } + var a, b uint64 + // Big swaps first + switch { + case n > 192: + if n > 256 { + return z.Clear() + } + z.rsh192(x) + n -= 192 + goto sh192 + case n > 128: + z.rsh128(x) + n -= 128 + goto sh128 + case n > 64: + z.rsh64(x) + n -= 64 + goto sh64 + default: + z.Set(x) + } + + // remaining shifts + a = z.arr[3] << (64 - n) + z.arr[3] = z.arr[3] >> n + +sh64: + b = z.arr[2] << (64 - n) + z.arr[2] = (z.arr[2] >> n) | a + +sh128: + a = z.arr[1] << (64 - n) + z.arr[1] = (z.arr[1] >> n) | b + +sh192: + z.arr[0] = (z.arr[0] >> n) | a + + return z +} + +// SRsh (Signed/Arithmetic right shift) +// considers z to be a signed integer, during right-shift +// and sets z = x >> n and returns z. +func (z *Uint) SRsh(x *Uint, n uint) *Uint { + // If the MSB is 0, SRsh is same as Rsh. + if !x.isBitSet(255) { + return z.Rsh(x, n) + } + if n%64 == 0 { + switch n { + case 0: + return z.Set(x) + case 64: + return z.srsh64(x) + case 128: + return z.srsh128(x) + case 192: + return z.srsh192(x) + default: + return z.SetAllOne() + } + } + var a uint64 = MaxUint64 << (64 - n%64) + // Big swaps first + switch { + case n > 192: + if n > 256 { + return z.SetAllOne() + } + z.srsh192(x) + n -= 192 + goto sh192 + case n > 128: + z.srsh128(x) + n -= 128 + goto sh128 + case n > 64: + z.srsh64(x) + n -= 64 + goto sh64 + default: + z.Set(x) + } + + // remaining shifts + z.arr[3], a = (z.arr[3]>>n)|a, z.arr[3]<<(64-n) + +sh64: + z.arr[2], a = (z.arr[2]>>n)|a, z.arr[2]<<(64-n) + +sh128: + z.arr[1], a = (z.arr[1]>>n)|a, z.arr[1]<<(64-n) + +sh192: + z.arr[0] = (z.arr[0] >> n) | a + + return z +} + +func (z *Uint) lsh64(x *Uint) *Uint { + z.arr[3], z.arr[2], z.arr[1], z.arr[0] = x.arr[2], x.arr[1], x.arr[0], 0 + return z +} + +func (z *Uint) lsh128(x *Uint) *Uint { + z.arr[3], z.arr[2], z.arr[1], z.arr[0] = x.arr[1], x.arr[0], 0, 0 + return z +} + +func (z *Uint) lsh192(x *Uint) *Uint { + z.arr[3], z.arr[2], z.arr[1], z.arr[0] = x.arr[0], 0, 0, 0 + return z +} + +func (z *Uint) rsh64(x *Uint) *Uint { + z.arr[3], z.arr[2], z.arr[1], z.arr[0] = 0, x.arr[3], x.arr[2], x.arr[1] + return z +} + +func (z *Uint) rsh128(x *Uint) *Uint { + z.arr[3], z.arr[2], z.arr[1], z.arr[0] = 0, 0, x.arr[3], x.arr[2] + return z +} + +func (z *Uint) rsh192(x *Uint) *Uint { + z.arr[3], z.arr[2], z.arr[1], z.arr[0] = 0, 0, 0, x.arr[3] + return z +} + +func (z *Uint) srsh64(x *Uint) *Uint { + z.arr[3], z.arr[2], z.arr[1], z.arr[0] = MaxUint64, x.arr[3], x.arr[2], x.arr[1] + return z +} + +func (z *Uint) srsh128(x *Uint) *Uint { + z.arr[3], z.arr[2], z.arr[1], z.arr[0] = MaxUint64, MaxUint64, x.arr[3], x.arr[2] + return z +} + +func (z *Uint) srsh192(x *Uint) *Uint { + z.arr[3], z.arr[2], z.arr[1], z.arr[0] = MaxUint64, MaxUint64, MaxUint64, x.arr[3] + return z +} diff --git a/portal-loop/extracted/p/demo/uint256/bitwise_test.gno b/portal-loop/extracted/p/demo/uint256/bitwise_test.gno new file mode 100644 index 00000000..aba89edf --- /dev/null +++ b/portal-loop/extracted/p/demo/uint256/bitwise_test.gno @@ -0,0 +1,344 @@ +package uint256 + +import "testing" + +type logicOpTest struct { + name string + x Uint + y Uint + want Uint +} + +func TestOr(t *testing.T) { + tests := []logicOpTest{ + { + name: "all zeros", + x: Uint{arr: [4]uint64{0, 0, 0, 0}}, + y: Uint{arr: [4]uint64{0, 0, 0, 0}}, + want: Uint{arr: [4]uint64{0, 0, 0, 0}}, + }, + { + name: "all ones", + x: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, + y: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, + want: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, + }, + { + name: "mixed", + x: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), 0, 0}}, + y: Uint{arr: [4]uint64{0, 0, ^uint64(0), ^uint64(0)}}, + want: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, + }, + { + name: "one operand all ones", + x: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, + y: Uint{arr: [4]uint64{0x5555555555555555, 0xAAAAAAAAAAAAAAAA, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000}}, + want: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + res := new(Uint).Or(&tc.x, &tc.y) + if *res != tc.want { + t.Errorf("Or(%s, %s) = %s, want %s", tc.x.ToString(), tc.y.ToString(), res.ToString(), (tc.want).ToString()) + } + }) + } +} + +func TestAnd(t *testing.T) { + tests := []logicOpTest{ + { + name: "all zeros", + x: Uint{arr: [4]uint64{0, 0, 0, 0}}, + y: Uint{arr: [4]uint64{0, 0, 0, 0}}, + want: Uint{arr: [4]uint64{0, 0, 0, 0}}, + }, + { + name: "all ones", + x: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, + y: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, + want: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, + }, + { + name: "mixed", + x: Uint{arr: [4]uint64{0, 0, 0, 0}}, + y: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, + want: Uint{arr: [4]uint64{0, 0, 0, 0}}, + }, + { + name: "mixed 2", + x: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, + y: Uint{arr: [4]uint64{0, 0, 0, 0}}, + want: Uint{arr: [4]uint64{0, 0, 0, 0}}, + }, + { + name: "mixed 3", + x: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), 0, 0}}, + y: Uint{arr: [4]uint64{0, 0, ^uint64(0), ^uint64(0)}}, + want: Uint{arr: [4]uint64{0, 0, 0, 0}}, + }, + { + name: "one operand zero", + x: Uint{arr: [4]uint64{0, 0, 0, 0}}, + y: Uint{arr: [4]uint64{0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF}}, + want: Uint{arr: [4]uint64{0, 0, 0, 0}}, + }, + { + name: "one operand all ones", + x: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, + y: Uint{arr: [4]uint64{0x5555555555555555, 0xAAAAAAAAAAAAAAAA, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000}}, + want: Uint{arr: [4]uint64{0x5555555555555555, 0xAAAAAAAAAAAAAAAA, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000}}, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + res := new(Uint).And(&tc.x, &tc.y) + if *res != tc.want { + t.Errorf("And(%s, %s) = %s, want %s", tc.x.ToString(), tc.y.ToString(), res.ToString(), (tc.want).ToString()) + } + }) + } +} + +func TestNot(t *testing.T) { + tests := []struct { + name string + x Uint + want Uint + }{ + { + name: "all zeros", + x: Uint{arr: [4]uint64{0, 0, 0, 0}}, + want: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, + }, + { + name: "all ones", + x: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, + want: Uint{arr: [4]uint64{0, 0, 0, 0}}, + }, + { + name: "mixed", + x: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), 0, 0}}, + want: Uint{arr: [4]uint64{0, 0, ^uint64(0), ^uint64(0)}}, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + res := new(Uint).Not(&tc.x) + if *res != tc.want { + t.Errorf("Not(%s) = %s, want %s", tc.x.ToString(), res.ToString(), (tc.want).ToString()) + } + }) + } +} + +func TestAndNot(t *testing.T) { + tests := []logicOpTest{ + { + name: "all zeros", + x: Uint{arr: [4]uint64{0, 0, 0, 0}}, + y: Uint{arr: [4]uint64{0, 0, 0, 0}}, + want: Uint{arr: [4]uint64{0, 0, 0, 0}}, + }, + { + name: "all ones", + x: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, + y: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, + want: Uint{arr: [4]uint64{0, 0, 0, 0}}, + }, + { + name: "mixed", + x: Uint{arr: [4]uint64{0, 0, 0, 0}}, + y: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, + want: Uint{arr: [4]uint64{0, 0, 0, 0}}, + }, + { + name: "mixed 2", + x: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, + y: Uint{arr: [4]uint64{0, 0, 0, 0}}, + want: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, + }, + { + name: "mixed 3", + x: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), 0, 0}}, + y: Uint{arr: [4]uint64{0, 0, ^uint64(0), ^uint64(0)}}, + want: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), 0, 0}}, + }, + { + name: "one operand zero", + x: Uint{arr: [4]uint64{0, 0, 0, 0}}, + y: Uint{arr: [4]uint64{0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF}}, + want: Uint{arr: [4]uint64{0, 0, 0, 0}}, + }, + { + name: "one operand all ones", + x: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, + y: Uint{arr: [4]uint64{0x5555555555555555, 0xAAAAAAAAAAAAAAAA, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000}}, + want: Uint{arr: [4]uint64{0xAAAAAAAAAAAAAAAA, 0x5555555555555555, 0x0000000000000000, ^uint64(0)}}, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + res := new(Uint).AndNot(&tc.x, &tc.y) + if *res != tc.want { + t.Errorf("AndNot(%s, %s) = %s, want %s", tc.x.ToString(), tc.y.ToString(), res.ToString(), (tc.want).ToString()) + } + }) + } +} + +func TestXor(t *testing.T) { + tests := []logicOpTest{ + { + name: "all zeros", + x: Uint{arr: [4]uint64{0, 0, 0, 0}}, + y: Uint{arr: [4]uint64{0, 0, 0, 0}}, + want: Uint{arr: [4]uint64{0, 0, 0, 0}}, + }, + { + name: "all ones", + x: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, + y: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, + want: Uint{arr: [4]uint64{0, 0, 0, 0}}, + }, + { + name: "mixed", + x: Uint{arr: [4]uint64{0, 0, 0, 0}}, + y: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, + want: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, + }, + { + name: "mixed 2", + x: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, + y: Uint{arr: [4]uint64{0, 0, 0, 0}}, + want: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, + }, + { + name: "mixed 3", + x: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), 0, 0}}, + y: Uint{arr: [4]uint64{0, 0, ^uint64(0), ^uint64(0)}}, + want: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, + }, + { + name: "one operand zero", + x: Uint{arr: [4]uint64{0, 0, 0, 0}}, + y: Uint{arr: [4]uint64{0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF}}, + want: Uint{arr: [4]uint64{0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF}}, + }, + { + name: "one operand all ones", + x: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, + y: Uint{arr: [4]uint64{0x5555555555555555, 0xAAAAAAAAAAAAAAAA, 0xFFFFFFFFFFFFFFFF, 0x0000000000000000}}, + want: Uint{arr: [4]uint64{0xAAAAAAAAAAAAAAAA, 0x5555555555555555, 0x0000000000000000, ^uint64(0)}}, + }, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + res := new(Uint).Xor(&tc.x, &tc.y) + if *res != tc.want { + t.Errorf("Xor(%s, %s) = %s, want %s", tc.x.ToString(), tc.y.ToString(), res.ToString(), (tc.want).ToString()) + } + }) + } +} + +func TestLsh(t *testing.T) { + tests := []struct { + x string + y uint + want string + }{ + {"0", 0, "0"}, + {"0", 1, "0"}, + {"0", 64, "0"}, + {"1", 0, "1"}, + {"1", 1, "2"}, + {"1", 64, "18446744073709551616"}, + {"1", 128, "340282366920938463463374607431768211456"}, + {"1", 192, "6277101735386680763835789423207666416102355444464034512896"}, + {"1", 255, "57896044618658097711785492504343953926634992332820282019728792003956564819968"}, + {"1", 256, "0"}, + {"31337", 0, "31337"}, + {"31337", 1, "62674"}, + {"31337", 64, "578065619037836218990592"}, + {"31337", 128, "10663428532201448629551770073089320442396672"}, + {"31337", 192, "196705537081812415096322133155058642481399512563169449530621952"}, + {"31337", 193, "393411074163624830192644266310117284962799025126338899061243904"}, + {"31337", 255, "57896044618658097711785492504343953926634992332820282019728792003956564819968"}, + {"31337", 256, "0"}, + } + + for _, tc := range tests { + x, err := FromDecimal(tc.x) + if err != nil { + t.Error(err) + continue + } + + want, err := FromDecimal(tc.want) + if err != nil { + t.Error(err) + continue + } + + got := &Uint{} + got.Lsh(x, tc.y) + + if got.Neq(want) { + t.Errorf("Lsh(%s, %d) = %s, want %s", tc.x, tc.y, got.ToString(), want.ToString()) + } + } +} + +func TestRsh(t *testing.T) { + tests := []struct { + x string + y uint + want string + }{ + {"0", 0, "0"}, + {"0", 1, "0"}, + {"0", 64, "0"}, + {"1", 0, "1"}, + {"1", 1, "0"}, + {"1", 64, "0"}, + {"1", 128, "0"}, + {"1", 192, "0"}, + {"1", 255, "0"}, + {"57896044618658097711785492504343953926634992332820282019728792003956564819968", 255, "1"}, + {"6277101735386680763835789423207666416102355444464034512896", 192, "1"}, + {"340282366920938463463374607431768211456", 128, "1"}, + {"18446744073709551616", 64, "1"}, + {"393411074163624830192644266310117284962799025126338899061243904", 193, "31337"}, + {"196705537081812415096322133155058642481399512563169449530621952", 192, "31337"}, + {"10663428532201448629551770073089320442396672", 128, "31337"}, + {"578065619037836218990592", 64, "31337"}, + } + + for _, tc := range tests { + x, err := FromDecimal(tc.x) + if err != nil { + t.Error(err) + continue + } + + want, err := FromDecimal(tc.want) + if err != nil { + t.Error(err) + continue + } + + got := &Uint{} + got.Rsh(x, tc.y) + + if got.Neq(want) { + t.Errorf("Rsh(%s, %d) = %s, want %s", tc.x, tc.y, got.ToString(), want.ToString()) + } + } +} diff --git a/portal-loop/extracted/p/demo/uint256/cmp.gno b/portal-loop/extracted/p/demo/uint256/cmp.gno new file mode 100644 index 00000000..a43a31e5 --- /dev/null +++ b/portal-loop/extracted/p/demo/uint256/cmp.gno @@ -0,0 +1,125 @@ +// cmp (or, comparisons) includes methods for comparing Uint instances. +// These comparison functions cover a range of operations including equality checks, less than/greater than +// evaluations, and specialized comparisons such as signed greater than. These are fundamental for logical +// decision making based on Uint values. +package uint256 + +import ( + "math/bits" +) + +// Cmp compares z and x and returns: +// +// -1 if z < x +// 0 if z == x +// +1 if z > x +func (z *Uint) Cmp(x *Uint) (r int) { + // z < x <=> z - x < 0 i.e. when subtraction overflows. + d0, carry := bits.Sub64(z.arr[0], x.arr[0], 0) + d1, carry := bits.Sub64(z.arr[1], x.arr[1], carry) + d2, carry := bits.Sub64(z.arr[2], x.arr[2], carry) + d3, carry := bits.Sub64(z.arr[3], x.arr[3], carry) + if carry == 1 { + return -1 + } + if d0|d1|d2|d3 == 0 { + return 0 + } + return 1 +} + +// IsZero returns true if z == 0 +func (z *Uint) IsZero() bool { + return (z.arr[0] | z.arr[1] | z.arr[2] | z.arr[3]) == 0 +} + +// Sign returns: +// +// -1 if z < 0 +// 0 if z == 0 +// +1 if z > 0 +// +// Where z is interpreted as a two's complement signed number +func (z *Uint) Sign() int { + if z.IsZero() { + return 0 + } + if z.arr[3] < 0x8000000000000000 { + return 1 + } + return -1 +} + +// LtUint64 returns true if z is smaller than n +func (z *Uint) LtUint64(n uint64) bool { + return z.arr[0] < n && (z.arr[1]|z.arr[2]|z.arr[3]) == 0 +} + +// GtUint64 returns true if z is larger than n +func (z *Uint) GtUint64(n uint64) bool { + return z.arr[0] > n || (z.arr[1]|z.arr[2]|z.arr[3]) != 0 +} + +// Lt returns true if z < x +func (z *Uint) Lt(x *Uint) bool { + // z < x <=> z - x < 0 i.e. when subtraction overflows. + _, carry := bits.Sub64(z.arr[0], x.arr[0], 0) + _, carry = bits.Sub64(z.arr[1], x.arr[1], carry) + _, carry = bits.Sub64(z.arr[2], x.arr[2], carry) + _, carry = bits.Sub64(z.arr[3], x.arr[3], carry) + + return carry != 0 +} + +// Gt returns true if z > x +func (z *Uint) Gt(x *Uint) bool { + return x.Lt(z) +} + +// Lte returns true if z <= x +func (z *Uint) Lte(x *Uint) bool { + cond1 := z.Lt(x) + cond2 := z.Eq(x) + + if cond1 || cond2 { + return true + } + return false +} + +// Gte returns true if z >= x +func (z *Uint) Gte(x *Uint) bool { + cond1 := z.Gt(x) + cond2 := z.Eq(x) + + if cond1 || cond2 { + return true + } + return false +} + +// Eq returns true if z == x +func (z *Uint) Eq(x *Uint) bool { + return (z.arr[0] == x.arr[0]) && (z.arr[1] == x.arr[1]) && (z.arr[2] == x.arr[2]) && (z.arr[3] == x.arr[3]) +} + +// Neq returns true if z != x +func (z *Uint) Neq(x *Uint) bool { + return !z.Eq(x) +} + +// Sgt interprets z and x as signed integers, and returns +// true if z > x +func (z *Uint) Sgt(x *Uint) bool { + zSign := z.Sign() + xSign := x.Sign() + + switch { + case zSign >= 0 && xSign < 0: + return true + case zSign < 0 && xSign >= 0: + return false + default: + return z.Gt(x) + } +} diff --git a/portal-loop/extracted/p/demo/uint256/cmp_test.gno b/portal-loop/extracted/p/demo/uint256/cmp_test.gno new file mode 100644 index 00000000..930079f7 --- /dev/null +++ b/portal-loop/extracted/p/demo/uint256/cmp_test.gno @@ -0,0 +1,163 @@ +package uint256 + +import ( + "strings" + "testing" +) + +func TestCmp(t *testing.T) { + tests := []struct { + x, y string + want int + }{ + {"0", "0", 0}, + {"0", "1", -1}, + {"1", "0", 1}, + {"1", "1", 0}, + {"10", "10", 0}, + {"10", "11", -1}, + {"11", "10", 1}, + } + + for _, tc := range tests { + x, err := FromDecimal(tc.x) + if err != nil { + t.Error(err) + continue + } + + y, err := FromDecimal(tc.y) + if err != nil { + t.Error(err) + continue + } + + got := x.Cmp(y) + if got != tc.want { + t.Errorf("Cmp(%s, %s) = %v, want %v", tc.x, tc.y, got, tc.want) + } + } +} + +func TestIsZero(t *testing.T) { + tests := []struct { + x string + want bool + }{ + {"0", true}, + {"1", false}, + {"10", false}, + } + + for _, tc := range tests { + x, err := FromDecimal(tc.x) + if err != nil { + t.Error(err) + continue + } + + got := x.IsZero() + if got != tc.want { + t.Errorf("IsZero(%s) = %v, want %v", tc.x, got, tc.want) + } + } +} + +func TestLtUint64(t *testing.T) { + tests := []struct { + x string + y uint64 + want bool + }{ + {"0", 1, true}, + {"1", 0, false}, + {"10", 10, false}, + {"0xffffffffffffffff", 0, false}, + {"0x10000000000000000", 10000000000000000, false}, + } + + for _, tc := range tests { + var x *Uint + var err error + + if strings.HasPrefix(tc.x, "0x") { + x, err = FromHex(tc.x) + if err != nil { + t.Error(err) + continue + } + } else { + x, err = FromDecimal(tc.x) + if err != nil { + t.Error(err) + continue + } + } + + got := x.LtUint64(tc.y) + + if got != tc.want { + t.Errorf("LtUint64(%s, %d) = %v, want %v", tc.x, tc.y, got, tc.want) + } + } +} + +func TestSGT(t *testing.T) { + x := MustFromHex("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe") + y := MustFromHex("0x0") + actual := x.Sgt(y) + if actual { + t.Fatalf("Expected %v false", actual) + } + + x = MustFromHex("0x0") + y = MustFromHex("0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe") + actual = x.Sgt(y) + if !actual { + t.Fatalf("Expected %v true", actual) + } +} + +func TestEq(t *testing.T) { + tests := []struct { + x string + y string + want bool + }{ + {"0xffffffffffffffff", "18446744073709551615", true}, + {"0x10000000000000000", "18446744073709551616", true}, + {"0", "0", true}, + {"115792089237316195423570985008687907853269984665640564039457584007913129639935", "115792089237316195423570985008687907853269984665640564039457584007913129639935", true}, + } + + for i, tc := range tests { + var x *Uint + var err error + + if strings.HasPrefix(tc.x, "0x") { + x, err = FromHex(tc.x) + if err != nil { + t.Error(err) + continue + } + } else { + x, err = FromDecimal(tc.x) + if err != nil { + t.Error(err) + continue + } + } + + y, err := FromDecimal(tc.y) + if err != nil { + t.Error(err) + continue + } + + got := x.Eq(y) + + if got != tc.want { + t.Errorf("Eq(%s, %s) = %v, want %v", tc.x, tc.y, got, tc.want) + } + } +} diff --git a/portal-loop/extracted/p/demo/uint256/conversion.gno b/portal-loop/extracted/p/demo/uint256/conversion.gno new file mode 100644 index 00000000..4ef90602 --- /dev/null +++ b/portal-loop/extracted/p/demo/uint256/conversion.gno @@ -0,0 +1,570 @@ +// conversions contains methods for converting Uint instances to other types and vice versa. +// This includes conversions to and from basic types such as uint64 and int32, as well as string representations +// and byte slices. Additionally, it covers marshaling and unmarshaling for JSON and other text formats. +package uint256 + +import ( + "encoding/binary" + "errors" + "strconv" + "strings" +) + +// Uint64 returns the lower 64-bits of z +func (z *Uint) Uint64() uint64 { + return z.arr[0] +} + +// Uint64WithOverflow returns the lower 64-bits of z and bool whether overflow occurred +func (z *Uint) Uint64WithOverflow() (uint64, bool) { + return z.arr[0], (z.arr[1] | z.arr[2] | z.arr[3]) != 0 +} + +// SetUint64 sets z to the value x +func (z *Uint) SetUint64(x uint64) *Uint { + z.arr[3], z.arr[2], z.arr[1], z.arr[0] = 0, 0, 0, x + return z +} + +// IsUint64 reports whether z can be represented as a uint64. +func (z *Uint) IsUint64() bool { + return (z.arr[1] | z.arr[2] | z.arr[3]) == 0 +} + +// Dec returns the decimal representation of z. +func (z *Uint) Dec() string { + if z.IsZero() { + return "0" + } + if z.IsUint64() { + return strconv.FormatUint(z.Uint64(), 10) + } + + // The max uint64 value being 18446744073709551615, the largest + // power-of-ten below that is 10000000000000000000. + // When we do a DivMod using that number, the remainder that we + // get back is the lower part of the output. + // + // The ascii-output of remainder will never exceed 19 bytes (since it will be + // below 10000000000000000000). + // + // Algorithm example using 100 as divisor + // + // 12345 % 100 = 45 (rem) + // 12345 / 100 = 123 (quo) + // -> output '45', continue iterate on 123 + var ( + // out is 98 bytes long: 78 (max size of a string without leading zeroes, + // plus slack so we can copy 19 bytes every iteration). + // We init it with zeroes, because when strconv appends the ascii representations, + // it will omit leading zeroes. + out = []byte("00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000") + divisor = NewUint(10000000000000000000) // 20 digits + y = new(Uint).Set(z) // copy to avoid modifying z + pos = len(out) // position to write to + buf = make([]byte, 0, 19) // buffer to write uint64:s to + ) + for { + // Obtain Q and R for divisor + var quot Uint + rem := udivrem(quot.arr[:], y.arr[:], divisor) + y.Set(") // Set Q for next loop + // Convert the R to ascii representation + buf = strconv.AppendUint(buf[:0], rem.Uint64(), 10) + // Copy in the ascii digits + copy(out[pos-len(buf):], buf) + if y.IsZero() { + break + } + // Move 19 digits left + pos -= 19 + } + // skip leading zeroes by only using the 'used size' of buf + return string(out[pos-len(buf):]) +} + +func (z *Uint) Scan(src interface{}) error { + if src == nil { + z.Clear() + return nil + } + + switch src := src.(type) { + case string: + return z.scanScientificFromString(src) + case []byte: + return z.scanScientificFromString(string(src)) + } + return errors.New("default // unsupported type: can't convert to uint256.Uint") +} + +func (z *Uint) scanScientificFromString(src string) error { + if len(src) == 0 { + z.Clear() + return nil + } + + idx := strings.IndexByte(src, 'e') + if idx == -1 { + return z.SetFromDecimal(src) + } + if err := z.SetFromDecimal(src[:idx]); err != nil { + return err + } + if src[(idx+1):] == "0" { + return nil + } + exp := new(Uint) + if err := exp.SetFromDecimal(src[(idx + 1):]); err != nil { + return err + } + if exp.GtUint64(77) { // 10**78 is larger than 2**256 + return ErrBig256Range + } + exp.Exp(NewUint(10), exp) + if _, overflow := z.MulOverflow(z, exp); overflow { + return ErrBig256Range + } + return nil +} + +// ToString returns the decimal string representation of z. It returns an empty string if z is nil. +// OBS: doesn't exist from holiman's uint256 +func (z *Uint) ToString() string { + if z == nil { + return "" + } + + return z.Dec() +} + +// MarshalJSON implements json.Marshaler. +// MarshalJSON marshals using the 'decimal string' representation. This is _not_ compatible +// with big.Uint: big.Uint marshals into JSON 'native' numeric format. +// +// The JSON native format is, on some platforms, (e.g. javascript), limited to 53-bit large +// integer space. Thus, U256 uses string-format, which is not compatible with +// big.int (big.Uint refuses to unmarshal a string representation). +func (z *Uint) MarshalJSON() ([]byte, error) { + return []byte(`"` + z.Dec() + `"`), nil +} + +// UnmarshalJSON implements json.Unmarshaler. UnmarshalJSON accepts either +// - Quoted string: either hexadecimal OR decimal +// - Not quoted string: only decimal +func (z *Uint) UnmarshalJSON(input []byte) error { + if len(input) < 2 || input[0] != '"' || input[len(input)-1] != '"' { + // if not quoted, it must be decimal + return z.fromDecimal(string(input)) + } + return z.UnmarshalText(input[1 : len(input)-1]) +} + +// MarshalText implements encoding.TextMarshaler +// MarshalText marshals using the decimal representation (compatible with big.Uint) +func (z *Uint) MarshalText() ([]byte, error) { + return []byte(z.Dec()), nil +} + +// UnmarshalText implements encoding.TextUnmarshaler. This method +// can unmarshal either hexadecimal or decimal. +// - For hexadecimal, the input _must_ be prefixed with 0x or 0X +func (z *Uint) UnmarshalText(input []byte) error { + if len(input) >= 2 && input[0] == '0' && (input[1] == 'x' || input[1] == 'X') { + return z.fromHex(string(input)) + } + return z.fromDecimal(string(input)) +} + +// SetBytes interprets buf as the bytes of a big-endian unsigned +// integer, sets z to that value, and returns z. +// If buf is larger than 32 bytes, the last 32 bytes is used. +func (z *Uint) SetBytes(buf []byte) *Uint { + switch l := len(buf); l { + case 0: + z.Clear() + case 1: + z.SetBytes1(buf) + case 2: + z.SetBytes2(buf) + case 3: + z.SetBytes3(buf) + case 4: + z.SetBytes4(buf) + case 5: + z.SetBytes5(buf) + case 6: + z.SetBytes6(buf) + case 7: + z.SetBytes7(buf) + case 8: + z.SetBytes8(buf) + case 9: + z.SetBytes9(buf) + case 10: + z.SetBytes10(buf) + case 11: + z.SetBytes11(buf) + case 12: + z.SetBytes12(buf) + case 13: + z.SetBytes13(buf) + case 14: + z.SetBytes14(buf) + case 15: + z.SetBytes15(buf) + case 16: + z.SetBytes16(buf) + case 17: + z.SetBytes17(buf) + case 18: + z.SetBytes18(buf) + case 19: + z.SetBytes19(buf) + case 20: + z.SetBytes20(buf) + case 21: + z.SetBytes21(buf) + case 22: + z.SetBytes22(buf) + case 23: + z.SetBytes23(buf) + case 24: + z.SetBytes24(buf) + case 25: + z.SetBytes25(buf) + case 26: + z.SetBytes26(buf) + case 27: + z.SetBytes27(buf) + case 28: + z.SetBytes28(buf) + case 29: + z.SetBytes29(buf) + case 30: + z.SetBytes30(buf) + case 31: + z.SetBytes31(buf) + default: + z.SetBytes32(buf[l-32:]) + } + return z +} + +// SetBytes1 is identical to SetBytes(in[:1]), but panics is input is too short +func (z *Uint) SetBytes1(in []byte) *Uint { + z.arr[3], z.arr[2], z.arr[1] = 0, 0, 0 + z.arr[0] = uint64(in[0]) + return z +} + +// SetBytes2 is identical to SetBytes(in[:2]), but panics is input is too short +func (z *Uint) SetBytes2(in []byte) *Uint { + _ = in[1] // bounds check hint to compiler; see golang.org/issue/14808 + z.arr[3], z.arr[2], z.arr[1] = 0, 0, 0 + z.arr[0] = uint64(binary.BigEndian.Uint16(in[0:2])) + return z +} + +// SetBytes3 is identical to SetBytes(in[:3]), but panics is input is too short +func (z *Uint) SetBytes3(in []byte) *Uint { + _ = in[2] // bounds check hint to compiler; see golang.org/issue/14808 + z.arr[3], z.arr[2], z.arr[1] = 0, 0, 0 + z.arr[0] = uint64(binary.BigEndian.Uint16(in[1:3])) | uint64(in[0])<<16 + return z +} + +// SetBytes4 is identical to SetBytes(in[:4]), but panics is input is too short +func (z *Uint) SetBytes4(in []byte) *Uint { + _ = in[3] // bounds check hint to compiler; see golang.org/issue/14808 + z.arr[3], z.arr[2], z.arr[1] = 0, 0, 0 + z.arr[0] = uint64(binary.BigEndian.Uint32(in[0:4])) + return z +} + +// SetBytes5 is identical to SetBytes(in[:5]), but panics is input is too short +func (z *Uint) SetBytes5(in []byte) *Uint { + _ = in[4] // bounds check hint to compiler; see golang.org/issue/14808 + z.arr[3], z.arr[2], z.arr[1] = 0, 0, 0 + z.arr[0] = bigEndianUint40(in[0:5]) + return z +} + +// SetBytes6 is identical to SetBytes(in[:6]), but panics is input is too short +func (z *Uint) SetBytes6(in []byte) *Uint { + _ = in[5] // bounds check hint to compiler; see golang.org/issue/14808 + z.arr[3], z.arr[2], z.arr[1] = 0, 0, 0 + z.arr[0] = bigEndianUint48(in[0:6]) + return z +} + +// SetBytes7 is identical to SetBytes(in[:7]), but panics is input is too short +func (z *Uint) SetBytes7(in []byte) *Uint { + _ = in[6] // bounds check hint to compiler; see golang.org/issue/14808 + z.arr[3], z.arr[2], z.arr[1] = 0, 0, 0 + z.arr[0] = bigEndianUint56(in[0:7]) + return z +} + +// SetBytes8 is identical to SetBytes(in[:8]), but panics is input is too short +func (z *Uint) SetBytes8(in []byte) *Uint { + _ = in[7] // bounds check hint to compiler; see golang.org/issue/14808 + z.arr[3], z.arr[2], z.arr[1] = 0, 0, 0 + z.arr[0] = binary.BigEndian.Uint64(in[0:8]) + return z +} + +// SetBytes9 is identical to SetBytes(in[:9]), but panics is input is too short +func (z *Uint) SetBytes9(in []byte) *Uint { + _ = in[8] // bounds check hint to compiler; see golang.org/issue/14808 + z.arr[3], z.arr[2] = 0, 0 + z.arr[1] = uint64(in[0]) + z.arr[0] = binary.BigEndian.Uint64(in[1:9]) + return z +} + +// SetBytes10 is identical to SetBytes(in[:10]), but panics is input is too short +func (z *Uint) SetBytes10(in []byte) *Uint { + _ = in[9] // bounds check hint to compiler; see golang.org/issue/14808 + z.arr[3], z.arr[2] = 0, 0 + z.arr[1] = uint64(binary.BigEndian.Uint16(in[0:2])) + z.arr[0] = binary.BigEndian.Uint64(in[2:10]) + return z +} + +// SetBytes11 is identical to SetBytes(in[:11]), but panics is input is too short +func (z *Uint) SetBytes11(in []byte) *Uint { + _ = in[10] // bounds check hint to compiler; see golang.org/issue/14808 + z.arr[3], z.arr[2] = 0, 0 + z.arr[1] = uint64(binary.BigEndian.Uint16(in[1:3])) | uint64(in[0])<<16 + z.arr[0] = binary.BigEndian.Uint64(in[3:11]) + return z +} + +// SetBytes12 is identical to SetBytes(in[:12]), but panics is input is too short +func (z *Uint) SetBytes12(in []byte) *Uint { + _ = in[11] // bounds check hint to compiler; see golang.org/issue/14808 + z.arr[3], z.arr[2] = 0, 0 + z.arr[1] = uint64(binary.BigEndian.Uint32(in[0:4])) + z.arr[0] = binary.BigEndian.Uint64(in[4:12]) + return z +} + +// SetBytes13 is identical to SetBytes(in[:13]), but panics is input is too short +func (z *Uint) SetBytes13(in []byte) *Uint { + _ = in[12] // bounds check hint to compiler; see golang.org/issue/14808 + z.arr[3], z.arr[2] = 0, 0 + z.arr[1] = bigEndianUint40(in[0:5]) + z.arr[0] = binary.BigEndian.Uint64(in[5:13]) + return z +} + +// SetBytes14 is identical to SetBytes(in[:14]), but panics is input is too short +func (z *Uint) SetBytes14(in []byte) *Uint { + _ = in[13] // bounds check hint to compiler; see golang.org/issue/14808 + z.arr[3], z.arr[2] = 0, 0 + z.arr[1] = bigEndianUint48(in[0:6]) + z.arr[0] = binary.BigEndian.Uint64(in[6:14]) + return z +} + +// SetBytes15 is identical to SetBytes(in[:15]), but panics is input is too short +func (z *Uint) SetBytes15(in []byte) *Uint { + _ = in[14] // bounds check hint to compiler; see golang.org/issue/14808 + z.arr[3], z.arr[2] = 0, 0 + z.arr[1] = bigEndianUint56(in[0:7]) + z.arr[0] = binary.BigEndian.Uint64(in[7:15]) + return z +} + +// SetBytes16 is identical to SetBytes(in[:16]), but panics is input is too short +func (z *Uint) SetBytes16(in []byte) *Uint { + _ = in[15] // bounds check hint to compiler; see golang.org/issue/14808 + z.arr[3], z.arr[2] = 0, 0 + z.arr[1] = binary.BigEndian.Uint64(in[0:8]) + z.arr[0] = binary.BigEndian.Uint64(in[8:16]) + return z +} + +// SetBytes17 is identical to SetBytes(in[:17]), but panics is input is too short +func (z *Uint) SetBytes17(in []byte) *Uint { + _ = in[16] // bounds check hint to compiler; see golang.org/issue/14808 + z.arr[3] = 0 + z.arr[2] = uint64(in[0]) + z.arr[1] = binary.BigEndian.Uint64(in[1:9]) + z.arr[0] = binary.BigEndian.Uint64(in[9:17]) + return z +} + +// SetBytes18 is identical to SetBytes(in[:18]), but panics is input is too short +func (z *Uint) SetBytes18(in []byte) *Uint { + _ = in[17] // bounds check hint to compiler; see golang.org/issue/14808 + z.arr[3] = 0 + z.arr[2] = uint64(binary.BigEndian.Uint16(in[0:2])) + z.arr[1] = binary.BigEndian.Uint64(in[2:10]) + z.arr[0] = binary.BigEndian.Uint64(in[10:18]) + return z +} + +// SetBytes19 is identical to SetBytes(in[:19]), but panics is input is too short +func (z *Uint) SetBytes19(in []byte) *Uint { + _ = in[18] // bounds check hint to compiler; see golang.org/issue/14808 + z.arr[3] = 0 + z.arr[2] = uint64(binary.BigEndian.Uint16(in[1:3])) | uint64(in[0])<<16 + z.arr[1] = binary.BigEndian.Uint64(in[3:11]) + z.arr[0] = binary.BigEndian.Uint64(in[11:19]) + return z +} + +// SetBytes20 is identical to SetBytes(in[:20]), but panics is input is too short +func (z *Uint) SetBytes20(in []byte) *Uint { + _ = in[19] // bounds check hint to compiler; see golang.org/issue/14808 + z.arr[3] = 0 + z.arr[2] = uint64(binary.BigEndian.Uint32(in[0:4])) + z.arr[1] = binary.BigEndian.Uint64(in[4:12]) + z.arr[0] = binary.BigEndian.Uint64(in[12:20]) + return z +} + +// SetBytes21 is identical to SetBytes(in[:21]), but panics is input is too short +func (z *Uint) SetBytes21(in []byte) *Uint { + _ = in[20] // bounds check hint to compiler; see golang.org/issue/14808 + z.arr[3] = 0 + z.arr[2] = bigEndianUint40(in[0:5]) + z.arr[1] = binary.BigEndian.Uint64(in[5:13]) + z.arr[0] = binary.BigEndian.Uint64(in[13:21]) + return z +} + +// SetBytes22 is identical to SetBytes(in[:22]), but panics is input is too short +func (z *Uint) SetBytes22(in []byte) *Uint { + _ = in[21] // bounds check hint to compiler; see golang.org/issue/14808 + z.arr[3] = 0 + z.arr[2] = bigEndianUint48(in[0:6]) + z.arr[1] = binary.BigEndian.Uint64(in[6:14]) + z.arr[0] = binary.BigEndian.Uint64(in[14:22]) + return z +} + +// SetBytes23 is identical to SetBytes(in[:23]), but panics is input is too short +func (z *Uint) SetBytes23(in []byte) *Uint { + _ = in[22] // bounds check hint to compiler; see golang.org/issue/14808 + z.arr[3] = 0 + z.arr[2] = bigEndianUint56(in[0:7]) + z.arr[1] = binary.BigEndian.Uint64(in[7:15]) + z.arr[0] = binary.BigEndian.Uint64(in[15:23]) + return z +} + +// SetBytes24 is identical to SetBytes(in[:24]), but panics is input is too short +func (z *Uint) SetBytes24(in []byte) *Uint { + _ = in[23] // bounds check hint to compiler; see golang.org/issue/14808 + z.arr[3] = 0 + z.arr[2] = binary.BigEndian.Uint64(in[0:8]) + z.arr[1] = binary.BigEndian.Uint64(in[8:16]) + z.arr[0] = binary.BigEndian.Uint64(in[16:24]) + return z +} + +// SetBytes25 is identical to SetBytes(in[:25]), but panics is input is too short +func (z *Uint) SetBytes25(in []byte) *Uint { + _ = in[24] // bounds check hint to compiler; see golang.org/issue/14808 + z.arr[3] = uint64(in[0]) + z.arr[2] = binary.BigEndian.Uint64(in[1:9]) + z.arr[1] = binary.BigEndian.Uint64(in[9:17]) + z.arr[0] = binary.BigEndian.Uint64(in[17:25]) + return z +} + +// SetBytes26 is identical to SetBytes(in[:26]), but panics is input is too short +func (z *Uint) SetBytes26(in []byte) *Uint { + _ = in[25] // bounds check hint to compiler; see golang.org/issue/14808 + z.arr[3] = uint64(binary.BigEndian.Uint16(in[0:2])) + z.arr[2] = binary.BigEndian.Uint64(in[2:10]) + z.arr[1] = binary.BigEndian.Uint64(in[10:18]) + z.arr[0] = binary.BigEndian.Uint64(in[18:26]) + return z +} + +// SetBytes27 is identical to SetBytes(in[:27]), but panics is input is too short +func (z *Uint) SetBytes27(in []byte) *Uint { + _ = in[26] // bounds check hint to compiler; see golang.org/issue/14808 + z.arr[3] = uint64(binary.BigEndian.Uint16(in[1:3])) | uint64(in[0])<<16 + z.arr[2] = binary.BigEndian.Uint64(in[3:11]) + z.arr[1] = binary.BigEndian.Uint64(in[11:19]) + z.arr[0] = binary.BigEndian.Uint64(in[19:27]) + return z +} + +// SetBytes28 is identical to SetBytes(in[:28]), but panics is input is too short +func (z *Uint) SetBytes28(in []byte) *Uint { + _ = in[27] // bounds check hint to compiler; see golang.org/issue/14808 + z.arr[3] = uint64(binary.BigEndian.Uint32(in[0:4])) + z.arr[2] = binary.BigEndian.Uint64(in[4:12]) + z.arr[1] = binary.BigEndian.Uint64(in[12:20]) + z.arr[0] = binary.BigEndian.Uint64(in[20:28]) + return z +} + +// SetBytes29 is identical to SetBytes(in[:29]), but panics is input is too short +func (z *Uint) SetBytes29(in []byte) *Uint { + _ = in[23] // bounds check hint to compiler; see golang.org/issue/14808 + z.arr[3] = bigEndianUint40(in[0:5]) + z.arr[2] = binary.BigEndian.Uint64(in[5:13]) + z.arr[1] = binary.BigEndian.Uint64(in[13:21]) + z.arr[0] = binary.BigEndian.Uint64(in[21:29]) + return z +} + +// SetBytes30 is identical to SetBytes(in[:30]), but panics is input is too short +func (z *Uint) SetBytes30(in []byte) *Uint { + _ = in[29] // bounds check hint to compiler; see golang.org/issue/14808 + z.arr[3] = bigEndianUint48(in[0:6]) + z.arr[2] = binary.BigEndian.Uint64(in[6:14]) + z.arr[1] = binary.BigEndian.Uint64(in[14:22]) + z.arr[0] = binary.BigEndian.Uint64(in[22:30]) + return z +} + +// SetBytes31 is identical to SetBytes(in[:31]), but panics is input is too short +func (z *Uint) SetBytes31(in []byte) *Uint { + _ = in[30] // bounds check hint to compiler; see golang.org/issue/14808 + z.arr[3] = bigEndianUint56(in[0:7]) + z.arr[2] = binary.BigEndian.Uint64(in[7:15]) + z.arr[1] = binary.BigEndian.Uint64(in[15:23]) + z.arr[0] = binary.BigEndian.Uint64(in[23:31]) + return z +} + +// SetBytes32 sets z to the value of the big-endian 256-bit unsigned integer in. +func (z *Uint) SetBytes32(in []byte) *Uint { + _ = in[31] // bounds check hint to compiler; see golang.org/issue/14808 + z.arr[3] = binary.BigEndian.Uint64(in[0:8]) + z.arr[2] = binary.BigEndian.Uint64(in[8:16]) + z.arr[1] = binary.BigEndian.Uint64(in[16:24]) + z.arr[0] = binary.BigEndian.Uint64(in[24:32]) + return z +} + +// Utility methods that are "missing" among the bigEndian.UintXX methods. + +// bigEndianUint40 returns the uint64 value represented by the 5 bytes in big-endian order. +func bigEndianUint40(b []byte) uint64 { + _ = b[4] // bounds check hint to compiler; see golang.org/issue/14808 + return uint64(b[4]) | uint64(b[3])<<8 | uint64(b[2])<<16 | uint64(b[1])<<24 | + uint64(b[0])<<32 +} + +// bigEndianUint56 returns the uint64 value represented by the 7 bytes in big-endian order. +func bigEndianUint56(b []byte) uint64 { + _ = b[6] // bounds check hint to compiler; see golang.org/issue/14808 + return uint64(b[6]) | uint64(b[5])<<8 | uint64(b[4])<<16 | uint64(b[3])<<24 | + uint64(b[2])<<32 | uint64(b[1])<<40 | uint64(b[0])<<48 +} + +// bigEndianUint48 returns the uint64 value represented by the 6 bytes in big-endian order. +func bigEndianUint48(b []byte) uint64 { + _ = b[5] // bounds check hint to compiler; see golang.org/issue/14808 + return uint64(b[5]) | uint64(b[4])<<8 | uint64(b[3])<<16 | uint64(b[2])<<24 | + uint64(b[1])<<32 | uint64(b[0])<<40 +} diff --git a/portal-loop/extracted/p/demo/uint256/conversion_test.gno b/portal-loop/extracted/p/demo/uint256/conversion_test.gno new file mode 100644 index 00000000..ee3aad0f --- /dev/null +++ b/portal-loop/extracted/p/demo/uint256/conversion_test.gno @@ -0,0 +1,58 @@ +package uint256 + +import "testing" + +func TestIsUint64(t *testing.T) { + tests := []struct { + x string + want bool + }{ + {"0x0", true}, + {"0x1", true}, + {"0x10", true}, + {"0xffffffffffffffff", true}, + {"0x10000000000000000", false}, + } + + for _, tc := range tests { + x := MustFromHex(tc.x) + got := x.IsUint64() + + if got != tc.want { + t.Errorf("IsUint64(%s) = %v, want %v", tc.x, got, tc.want) + } + } +} + +func TestDec(t *testing.T) { + testCases := []struct { + name string + z Uint + want string + }{ + { + name: "zero", + z: Uint{arr: [4]uint64{0, 0, 0, 0}}, + want: "0", + }, + { + name: "less than 20 digits", + z: Uint{arr: [4]uint64{1234567890, 0, 0, 0}}, + want: "1234567890", + }, + { + name: "max possible value", + z: Uint{arr: [4]uint64{^uint64(0), ^uint64(0), ^uint64(0), ^uint64(0)}}, + want: "115792089237316195423570985008687907853269984665640564039457584007913129639935", + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + result := tc.z.Dec() + if result != tc.want { + t.Errorf("Dec(%v) = %s, want %s", tc.z, result, tc.want) + } + }) + } +} diff --git a/portal-loop/extracted/p/demo/uint256/error.gno b/portal-loop/extracted/p/demo/uint256/error.gno new file mode 100644 index 00000000..d200bb9c --- /dev/null +++ b/portal-loop/extracted/p/demo/uint256/error.gno @@ -0,0 +1,73 @@ +package uint256 + +import ( + "errors" +) + +var ( + ErrEmptyString = errors.New("empty hex string") + ErrSyntax = errors.New("invalid hex string") + ErrRange = errors.New("number out of range") + ErrMissingPrefix = errors.New("hex string without 0x prefix") + ErrEmptyNumber = errors.New("hex string \"0x\"") + ErrLeadingZero = errors.New("hex number with leading zero digits") + ErrBig256Range = errors.New("hex number > 256 bits") + ErrBadBufferLength = errors.New("bad ssz buffer length") + ErrBadEncodedLength = errors.New("bad ssz encoded length") + ErrInvalidBase = errors.New("invalid base") + ErrInvalidBitSize = errors.New("invalid bit size") +) + +type u256Error struct { + fn string // function name + input string + err error +} + +func (e *u256Error) Error() string { + return e.fn + ": " + e.input + ": " + e.err.Error() +} + +func (e *u256Error) Unwrap() error { + return e.err +} + +func errEmptyString(fn, input string) error { + return &u256Error{fn: fn, input: input, err: ErrEmptyString} +} + +func errSyntax(fn, input string) error { + return &u256Error{fn: fn, input: input, err: ErrSyntax} +} + +func errMissingPrefix(fn, input string) error { + return &u256Error{fn: fn, input: input, err: ErrMissingPrefix} +} + +func errEmptyNumber(fn, input string) error { + return &u256Error{fn: fn, input: input, err: ErrEmptyNumber} +} + +func errLeadingZero(fn, input string) error { + return &u256Error{fn: fn, input: input, err: ErrLeadingZero} +} + +func errRange(fn, input string) error { + return &u256Error{fn: fn, input: input, err: ErrRange} +} + +func errBig256Range(fn, input string) error { + return &u256Error{fn: fn, input: input, err: ErrBig256Range} +} + +func errBadBufferLength(fn, input string) error { + return &u256Error{fn: fn, input: input, err: ErrBadBufferLength} +} + +func errInvalidBase(fn string, base int) error { + return &u256Error{fn: fn, input: string(base), err: ErrInvalidBase} +} + +func errInvalidBitSize(fn string, bitSize int) error { + return &u256Error{fn: fn, input: string(bitSize), err: ErrInvalidBitSize} +} diff --git a/portal-loop/extracted/p/demo/uint256/mod.gno b/portal-loop/extracted/p/demo/uint256/mod.gno new file mode 100644 index 00000000..f6ff0967 --- /dev/null +++ b/portal-loop/extracted/p/demo/uint256/mod.gno @@ -0,0 +1,605 @@ +package uint256 + +import ( + "math/bits" +) + +// Some utility functions + +// Reciprocal computes a 320-bit value representing 1/m +// +// Notes: +// - specialized for m.arr[3] != 0, hence limited to 2^192 <= m < 2^256 +// - returns zero if m.arr[3] == 0 +// - starts with a 32-bit division, refines with newton-raphson iterations +func Reciprocal(m *Uint) (mu [5]uint64) { + if m.arr[3] == 0 { + return mu + } + + s := bits.LeadingZeros64(m.arr[3]) // Replace with leadingZeros(m) for general case + p := 255 - s // floor(log_2(m)), m>0 + + // 0 or a power of 2? + + // Check if at least one bit is set in m.arr[2], m.arr[1] or m.arr[0], + // or at least two bits in m.arr[3] + + if m.arr[0]|m.arr[1]|m.arr[2]|(m.arr[3]&(m.arr[3]-1)) == 0 { + + mu[4] = ^uint64(0) >> uint(p&63) + mu[3] = ^uint64(0) + mu[2] = ^uint64(0) + mu[1] = ^uint64(0) + mu[0] = ^uint64(0) + + return mu + } + + // Maximise division precision by left-aligning divisor + + var ( + y Uint // left-aligned copy of m + r0 uint32 // estimate of 2^31/y + ) + + y.Lsh(m, uint(s)) // 1/2 < y < 1 + + // Extract most significant 32 bits + + yh := uint32(y.arr[3] >> 32) + + if yh == 0x80000000 { // Avoid overflow in division + r0 = 0xffffffff + } else { + r0, _ = bits.Div32(0x80000000, 0, yh) + } + + // First iteration: 32 -> 64 + + t1 := uint64(r0) // 2^31/y + t1 *= t1 // 2^62/y^2 + t1, _ = bits.Mul64(t1, y.arr[3]) // 2^62/y^2 * 2^64/y / 2^64 = 2^62/y + + r1 := uint64(r0) << 32 // 2^63/y + r1 -= t1 // 2^63/y - 2^62/y = 2^62/y + r1 *= 2 // 2^63/y + + if (r1 | (y.arr[3] << 1)) == 0 { + r1 = ^uint64(0) + } + + // Second iteration: 64 -> 128 + + // square: 2^126/y^2 + a2h, a2l := bits.Mul64(r1, r1) + + // multiply by y: e2h:e2l:b2h = 2^126/y^2 * 2^128/y / 2^128 = 2^126/y + b2h, _ := bits.Mul64(a2l, y.arr[2]) + c2h, c2l := bits.Mul64(a2l, y.arr[3]) + d2h, d2l := bits.Mul64(a2h, y.arr[2]) + e2h, e2l := bits.Mul64(a2h, y.arr[3]) + + b2h, c := bits.Add64(b2h, c2l, 0) + e2l, c = bits.Add64(e2l, c2h, c) + e2h, _ = bits.Add64(e2h, 0, c) + + _, c = bits.Add64(b2h, d2l, 0) + e2l, c = bits.Add64(e2l, d2h, c) + e2h, _ = bits.Add64(e2h, 0, c) + + // subtract: t2h:t2l = 2^127/y - 2^126/y = 2^126/y + t2l, b := bits.Sub64(0, e2l, 0) + t2h, _ := bits.Sub64(r1, e2h, b) + + // double: r2h:r2l = 2^127/y + r2l, c := bits.Add64(t2l, t2l, 0) + r2h, _ := bits.Add64(t2h, t2h, c) + + if (r2h | r2l | (y.arr[3] << 1)) == 0 { + r2h = ^uint64(0) + r2l = ^uint64(0) + } + + // Third iteration: 128 -> 192 + + // square r2 (keep 256 bits): 2^190/y^2 + a3h, a3l := bits.Mul64(r2l, r2l) + b3h, b3l := bits.Mul64(r2l, r2h) + c3h, c3l := bits.Mul64(r2h, r2h) + + a3h, c = bits.Add64(a3h, b3l, 0) + c3l, c = bits.Add64(c3l, b3h, c) + c3h, _ = bits.Add64(c3h, 0, c) + + a3h, c = bits.Add64(a3h, b3l, 0) + c3l, c = bits.Add64(c3l, b3h, c) + c3h, _ = bits.Add64(c3h, 0, c) + + // multiply by y: q = 2^190/y^2 * 2^192/y / 2^192 = 2^190/y + + x0 := a3l + x1 := a3h + x2 := c3l + x3 := c3h + + var q0, q1, q2, q3, q4, t0 uint64 + + q0, _ = bits.Mul64(x2, y.arr[0]) + q1, t0 = bits.Mul64(x3, y.arr[0]) + q0, c = bits.Add64(q0, t0, 0) + q1, _ = bits.Add64(q1, 0, c) + + t1, _ = bits.Mul64(x1, y.arr[1]) + q0, c = bits.Add64(q0, t1, 0) + q2, t0 = bits.Mul64(x3, y.arr[1]) + q1, c = bits.Add64(q1, t0, c) + q2, _ = bits.Add64(q2, 0, c) + + t1, t0 = bits.Mul64(x2, y.arr[1]) + q0, c = bits.Add64(q0, t0, 0) + q1, c = bits.Add64(q1, t1, c) + q2, _ = bits.Add64(q2, 0, c) + + t1, t0 = bits.Mul64(x1, y.arr[2]) + q0, c = bits.Add64(q0, t0, 0) + q1, c = bits.Add64(q1, t1, c) + q3, t0 = bits.Mul64(x3, y.arr[2]) + q2, c = bits.Add64(q2, t0, c) + q3, _ = bits.Add64(q3, 0, c) + + t1, _ = bits.Mul64(x0, y.arr[2]) + q0, c = bits.Add64(q0, t1, 0) + t1, t0 = bits.Mul64(x2, y.arr[2]) + q1, c = bits.Add64(q1, t0, c) + q2, c = bits.Add64(q2, t1, c) + q3, _ = bits.Add64(q3, 0, c) + + t1, t0 = bits.Mul64(x1, y.arr[3]) + q1, c = bits.Add64(q1, t0, 0) + q2, c = bits.Add64(q2, t1, c) + q4, t0 = bits.Mul64(x3, y.arr[3]) + q3, c = bits.Add64(q3, t0, c) + q4, _ = bits.Add64(q4, 0, c) + + t1, t0 = bits.Mul64(x0, y.arr[3]) + q0, c = bits.Add64(q0, t0, 0) + q1, c = bits.Add64(q1, t1, c) + t1, t0 = bits.Mul64(x2, y.arr[3]) + q2, c = bits.Add64(q2, t0, c) + q3, c = bits.Add64(q3, t1, c) + q4, _ = bits.Add64(q4, 0, c) + + // subtract: t3 = 2^191/y - 2^190/y = 2^190/y + _, b = bits.Sub64(0, q0, 0) + _, b = bits.Sub64(0, q1, b) + t3l, b := bits.Sub64(0, q2, b) + t3m, b := bits.Sub64(r2l, q3, b) + t3h, _ := bits.Sub64(r2h, q4, b) + + // double: r3 = 2^191/y + r3l, c := bits.Add64(t3l, t3l, 0) + r3m, c := bits.Add64(t3m, t3m, c) + r3h, _ := bits.Add64(t3h, t3h, c) + + // Fourth iteration: 192 -> 320 + + // square r3 + + a4h, a4l := bits.Mul64(r3l, r3l) + b4h, b4l := bits.Mul64(r3l, r3m) + c4h, c4l := bits.Mul64(r3l, r3h) + d4h, d4l := bits.Mul64(r3m, r3m) + e4h, e4l := bits.Mul64(r3m, r3h) + f4h, f4l := bits.Mul64(r3h, r3h) + + b4h, c = bits.Add64(b4h, c4l, 0) + e4l, c = bits.Add64(e4l, c4h, c) + e4h, _ = bits.Add64(e4h, 0, c) + + a4h, c = bits.Add64(a4h, b4l, 0) + d4l, c = bits.Add64(d4l, b4h, c) + d4h, c = bits.Add64(d4h, e4l, c) + f4l, c = bits.Add64(f4l, e4h, c) + f4h, _ = bits.Add64(f4h, 0, c) + + a4h, c = bits.Add64(a4h, b4l, 0) + d4l, c = bits.Add64(d4l, b4h, c) + d4h, c = bits.Add64(d4h, e4l, c) + f4l, c = bits.Add64(f4l, e4h, c) + f4h, _ = bits.Add64(f4h, 0, c) + + // multiply by y + + x1, x0 = bits.Mul64(d4h, y.arr[0]) + x3, x2 = bits.Mul64(f4h, y.arr[0]) + t1, t0 = bits.Mul64(f4l, y.arr[0]) + x1, c = bits.Add64(x1, t0, 0) + x2, c = bits.Add64(x2, t1, c) + x3, _ = bits.Add64(x3, 0, c) + + t1, t0 = bits.Mul64(d4h, y.arr[1]) + x1, c = bits.Add64(x1, t0, 0) + x2, c = bits.Add64(x2, t1, c) + x4, t0 := bits.Mul64(f4h, y.arr[1]) + x3, c = bits.Add64(x3, t0, c) + x4, _ = bits.Add64(x4, 0, c) + t1, t0 = bits.Mul64(d4l, y.arr[1]) + x0, c = bits.Add64(x0, t0, 0) + x1, c = bits.Add64(x1, t1, c) + t1, t0 = bits.Mul64(f4l, y.arr[1]) + x2, c = bits.Add64(x2, t0, c) + x3, c = bits.Add64(x3, t1, c) + x4, _ = bits.Add64(x4, 0, c) + + t1, t0 = bits.Mul64(a4h, y.arr[2]) + x0, c = bits.Add64(x0, t0, 0) + x1, c = bits.Add64(x1, t1, c) + t1, t0 = bits.Mul64(d4h, y.arr[2]) + x2, c = bits.Add64(x2, t0, c) + x3, c = bits.Add64(x3, t1, c) + x5, t0 := bits.Mul64(f4h, y.arr[2]) + x4, c = bits.Add64(x4, t0, c) + x5, _ = bits.Add64(x5, 0, c) + t1, t0 = bits.Mul64(d4l, y.arr[2]) + x1, c = bits.Add64(x1, t0, 0) + x2, c = bits.Add64(x2, t1, c) + t1, t0 = bits.Mul64(f4l, y.arr[2]) + x3, c = bits.Add64(x3, t0, c) + x4, c = bits.Add64(x4, t1, c) + x5, _ = bits.Add64(x5, 0, c) + + t1, t0 = bits.Mul64(a4h, y.arr[3]) + x1, c = bits.Add64(x1, t0, 0) + x2, c = bits.Add64(x2, t1, c) + t1, t0 = bits.Mul64(d4h, y.arr[3]) + x3, c = bits.Add64(x3, t0, c) + x4, c = bits.Add64(x4, t1, c) + x6, t0 := bits.Mul64(f4h, y.arr[3]) + x5, c = bits.Add64(x5, t0, c) + x6, _ = bits.Add64(x6, 0, c) + t1, t0 = bits.Mul64(a4l, y.arr[3]) + x0, c = bits.Add64(x0, t0, 0) + x1, c = bits.Add64(x1, t1, c) + t1, t0 = bits.Mul64(d4l, y.arr[3]) + x2, c = bits.Add64(x2, t0, c) + x3, c = bits.Add64(x3, t1, c) + t1, t0 = bits.Mul64(f4l, y.arr[3]) + x4, c = bits.Add64(x4, t0, c) + x5, c = bits.Add64(x5, t1, c) + x6, _ = bits.Add64(x6, 0, c) + + // subtract + _, b = bits.Sub64(0, x0, 0) + _, b = bits.Sub64(0, x1, b) + r4l, b := bits.Sub64(0, x2, b) + r4k, b := bits.Sub64(0, x3, b) + r4j, b := bits.Sub64(r3l, x4, b) + r4i, b := bits.Sub64(r3m, x5, b) + r4h, _ := bits.Sub64(r3h, x6, b) + + // Multiply candidate for 1/4y by y, with full precision + + x0 = r4l + x1 = r4k + x2 = r4j + x3 = r4i + x4 = r4h + + q1, q0 = bits.Mul64(x0, y.arr[0]) + q3, q2 = bits.Mul64(x2, y.arr[0]) + q5, q4 := bits.Mul64(x4, y.arr[0]) + + t1, t0 = bits.Mul64(x1, y.arr[0]) + q1, c = bits.Add64(q1, t0, 0) + q2, c = bits.Add64(q2, t1, c) + t1, t0 = bits.Mul64(x3, y.arr[0]) + q3, c = bits.Add64(q3, t0, c) + q4, c = bits.Add64(q4, t1, c) + q5, _ = bits.Add64(q5, 0, c) + + t1, t0 = bits.Mul64(x0, y.arr[1]) + q1, c = bits.Add64(q1, t0, 0) + q2, c = bits.Add64(q2, t1, c) + t1, t0 = bits.Mul64(x2, y.arr[1]) + q3, c = bits.Add64(q3, t0, c) + q4, c = bits.Add64(q4, t1, c) + q6, t0 := bits.Mul64(x4, y.arr[1]) + q5, c = bits.Add64(q5, t0, c) + q6, _ = bits.Add64(q6, 0, c) + + t1, t0 = bits.Mul64(x1, y.arr[1]) + q2, c = bits.Add64(q2, t0, 0) + q3, c = bits.Add64(q3, t1, c) + t1, t0 = bits.Mul64(x3, y.arr[1]) + q4, c = bits.Add64(q4, t0, c) + q5, c = bits.Add64(q5, t1, c) + q6, _ = bits.Add64(q6, 0, c) + + t1, t0 = bits.Mul64(x0, y.arr[2]) + q2, c = bits.Add64(q2, t0, 0) + q3, c = bits.Add64(q3, t1, c) + t1, t0 = bits.Mul64(x2, y.arr[2]) + q4, c = bits.Add64(q4, t0, c) + q5, c = bits.Add64(q5, t1, c) + q7, t0 := bits.Mul64(x4, y.arr[2]) + q6, c = bits.Add64(q6, t0, c) + q7, _ = bits.Add64(q7, 0, c) + + t1, t0 = bits.Mul64(x1, y.arr[2]) + q3, c = bits.Add64(q3, t0, 0) + q4, c = bits.Add64(q4, t1, c) + t1, t0 = bits.Mul64(x3, y.arr[2]) + q5, c = bits.Add64(q5, t0, c) + q6, c = bits.Add64(q6, t1, c) + q7, _ = bits.Add64(q7, 0, c) + + t1, t0 = bits.Mul64(x0, y.arr[3]) + q3, c = bits.Add64(q3, t0, 0) + q4, c = bits.Add64(q4, t1, c) + t1, t0 = bits.Mul64(x2, y.arr[3]) + q5, c = bits.Add64(q5, t0, c) + q6, c = bits.Add64(q6, t1, c) + q8, t0 := bits.Mul64(x4, y.arr[3]) + q7, c = bits.Add64(q7, t0, c) + q8, _ = bits.Add64(q8, 0, c) + + t1, t0 = bits.Mul64(x1, y.arr[3]) + q4, c = bits.Add64(q4, t0, 0) + q5, c = bits.Add64(q5, t1, c) + t1, t0 = bits.Mul64(x3, y.arr[3]) + q6, c = bits.Add64(q6, t0, c) + q7, c = bits.Add64(q7, t1, c) + q8, _ = bits.Add64(q8, 0, c) + + // Final adjustment + + // subtract q from 1/4 + _, b = bits.Sub64(0, q0, 0) + _, b = bits.Sub64(0, q1, b) + _, b = bits.Sub64(0, q2, b) + _, b = bits.Sub64(0, q3, b) + _, b = bits.Sub64(0, q4, b) + _, b = bits.Sub64(0, q5, b) + _, b = bits.Sub64(0, q6, b) + _, b = bits.Sub64(0, q7, b) + _, b = bits.Sub64(uint64(1)<<62, q8, b) + + // decrement the result + x0, t := bits.Sub64(r4l, 1, 0) + x1, t = bits.Sub64(r4k, 0, t) + x2, t = bits.Sub64(r4j, 0, t) + x3, t = bits.Sub64(r4i, 0, t) + x4, _ = bits.Sub64(r4h, 0, t) + + // commit the decrement if the subtraction underflowed (reciprocal was too large) + if b != 0 { + r4h, r4i, r4j, r4k, r4l = x4, x3, x2, x1, x0 + } + + // Shift to correct bit alignment, truncating excess bits + + p = (p & 63) - 1 + + x0, c = bits.Add64(r4l, r4l, 0) + x1, c = bits.Add64(r4k, r4k, c) + x2, c = bits.Add64(r4j, r4j, c) + x3, c = bits.Add64(r4i, r4i, c) + x4, _ = bits.Add64(r4h, r4h, c) + + if p < 0 { + r4h, r4i, r4j, r4k, r4l = x4, x3, x2, x1, x0 + p = 0 // avoid negative shift below + } + + { + r := uint(p) // right shift + l := uint(64 - r) // left shift + + x0 = (r4l >> r) | (r4k << l) + x1 = (r4k >> r) | (r4j << l) + x2 = (r4j >> r) | (r4i << l) + x3 = (r4i >> r) | (r4h << l) + x4 = (r4h >> r) + } + + if p > 0 { + r4h, r4i, r4j, r4k, r4l = x4, x3, x2, x1, x0 + } + + mu[0] = r4l + mu[1] = r4k + mu[2] = r4j + mu[3] = r4i + mu[4] = r4h + + return mu +} + +// reduce4 computes the least non-negative residue of x modulo m +// +// requires a four-word modulus (m.arr[3] > 1) and its inverse (mu) +func reduce4(x [8]uint64, m *Uint, mu [5]uint64) (z Uint) { + // NB: Most variable names in the comments match the pseudocode for + // Barrett reduction in the Handbook of Applied Cryptography. + + // q1 = x/2^192 + + x0 := x[3] + x1 := x[4] + x2 := x[5] + x3 := x[6] + x4 := x[7] + + // q2 = q1 * mu; q3 = q2 / 2^320 + + var q0, q1, q2, q3, q4, q5, t0, t1, c uint64 + + q0, _ = bits.Mul64(x3, mu[0]) + q1, t0 = bits.Mul64(x4, mu[0]) + q0, c = bits.Add64(q0, t0, 0) + q1, _ = bits.Add64(q1, 0, c) + + t1, _ = bits.Mul64(x2, mu[1]) + q0, c = bits.Add64(q0, t1, 0) + q2, t0 = bits.Mul64(x4, mu[1]) + q1, c = bits.Add64(q1, t0, c) + q2, _ = bits.Add64(q2, 0, c) + + t1, t0 = bits.Mul64(x3, mu[1]) + q0, c = bits.Add64(q0, t0, 0) + q1, c = bits.Add64(q1, t1, c) + q2, _ = bits.Add64(q2, 0, c) + + t1, t0 = bits.Mul64(x2, mu[2]) + q0, c = bits.Add64(q0, t0, 0) + q1, c = bits.Add64(q1, t1, c) + q3, t0 = bits.Mul64(x4, mu[2]) + q2, c = bits.Add64(q2, t0, c) + q3, _ = bits.Add64(q3, 0, c) + + t1, _ = bits.Mul64(x1, mu[2]) + q0, c = bits.Add64(q0, t1, 0) + t1, t0 = bits.Mul64(x3, mu[2]) + q1, c = bits.Add64(q1, t0, c) + q2, c = bits.Add64(q2, t1, c) + q3, _ = bits.Add64(q3, 0, c) + + t1, _ = bits.Mul64(x0, mu[3]) + q0, c = bits.Add64(q0, t1, 0) + t1, t0 = bits.Mul64(x2, mu[3]) + q1, c = bits.Add64(q1, t0, c) + q2, c = bits.Add64(q2, t1, c) + q4, t0 = bits.Mul64(x4, mu[3]) + q3, c = bits.Add64(q3, t0, c) + q4, _ = bits.Add64(q4, 0, c) + + t1, t0 = bits.Mul64(x1, mu[3]) + q0, c = bits.Add64(q0, t0, 0) + q1, c = bits.Add64(q1, t1, c) + t1, t0 = bits.Mul64(x3, mu[3]) + q2, c = bits.Add64(q2, t0, c) + q3, c = bits.Add64(q3, t1, c) + q4, _ = bits.Add64(q4, 0, c) + + t1, t0 = bits.Mul64(x0, mu[4]) + _, c = bits.Add64(q0, t0, 0) + q1, c = bits.Add64(q1, t1, c) + t1, t0 = bits.Mul64(x2, mu[4]) + q2, c = bits.Add64(q2, t0, c) + q3, c = bits.Add64(q3, t1, c) + q5, t0 = bits.Mul64(x4, mu[4]) + q4, c = bits.Add64(q4, t0, c) + q5, _ = bits.Add64(q5, 0, c) + + t1, t0 = bits.Mul64(x1, mu[4]) + q1, c = bits.Add64(q1, t0, 0) + q2, c = bits.Add64(q2, t1, c) + t1, t0 = bits.Mul64(x3, mu[4]) + q3, c = bits.Add64(q3, t0, c) + q4, c = bits.Add64(q4, t1, c) + q5, _ = bits.Add64(q5, 0, c) + + // Drop the fractional part of q3 + + q0 = q1 + q1 = q2 + q2 = q3 + q3 = q4 + q4 = q5 + + // r1 = x mod 2^320 + + x0 = x[0] + x1 = x[1] + x2 = x[2] + x3 = x[3] + x4 = x[4] + + // r2 = q3 * m mod 2^320 + + var r0, r1, r2, r3, r4 uint64 + + r4, r3 = bits.Mul64(q0, m.arr[3]) + _, t0 = bits.Mul64(q1, m.arr[3]) + r4, _ = bits.Add64(r4, t0, 0) + + t1, r2 = bits.Mul64(q0, m.arr[2]) + r3, c = bits.Add64(r3, t1, 0) + _, t0 = bits.Mul64(q2, m.arr[2]) + r4, _ = bits.Add64(r4, t0, c) + + t1, t0 = bits.Mul64(q1, m.arr[2]) + r3, c = bits.Add64(r3, t0, 0) + r4, _ = bits.Add64(r4, t1, c) + + t1, r1 = bits.Mul64(q0, m.arr[1]) + r2, c = bits.Add64(r2, t1, 0) + t1, t0 = bits.Mul64(q2, m.arr[1]) + r3, c = bits.Add64(r3, t0, c) + r4, _ = bits.Add64(r4, t1, c) + + t1, t0 = bits.Mul64(q1, m.arr[1]) + r2, c = bits.Add64(r2, t0, 0) + r3, c = bits.Add64(r3, t1, c) + _, t0 = bits.Mul64(q3, m.arr[1]) + r4, _ = bits.Add64(r4, t0, c) + + t1, r0 = bits.Mul64(q0, m.arr[0]) + r1, c = bits.Add64(r1, t1, 0) + t1, t0 = bits.Mul64(q2, m.arr[0]) + r2, c = bits.Add64(r2, t0, c) + r3, c = bits.Add64(r3, t1, c) + _, t0 = bits.Mul64(q4, m.arr[0]) + r4, _ = bits.Add64(r4, t0, c) + + t1, t0 = bits.Mul64(q1, m.arr[0]) + r1, c = bits.Add64(r1, t0, 0) + r2, c = bits.Add64(r2, t1, c) + t1, t0 = bits.Mul64(q3, m.arr[0]) + r3, c = bits.Add64(r3, t0, c) + r4, _ = bits.Add64(r4, t1, c) + + // r = r1 - r2 + + var b uint64 + + r0, b = bits.Sub64(x0, r0, 0) + r1, b = bits.Sub64(x1, r1, b) + r2, b = bits.Sub64(x2, r2, b) + r3, b = bits.Sub64(x3, r3, b) + r4, b = bits.Sub64(x4, r4, b) + + // if r<0 then r+=m + + if b != 0 { + r0, c = bits.Add64(r0, m.arr[0], 0) + r1, c = bits.Add64(r1, m.arr[1], c) + r2, c = bits.Add64(r2, m.arr[2], c) + r3, c = bits.Add64(r3, m.arr[3], c) + r4, _ = bits.Add64(r4, 0, c) + } + + // while (r>=m) r-=m + + for { + // q = r - m + q0, b = bits.Sub64(r0, m.arr[0], 0) + q1, b = bits.Sub64(r1, m.arr[1], b) + q2, b = bits.Sub64(r2, m.arr[2], b) + q3, b = bits.Sub64(r3, m.arr[3], b) + q4, b = bits.Sub64(r4, 0, b) + + // if borrow break + if b != 0 { + break + } + + // r = q + r4, r3, r2, r1, r0 = q4, q3, q2, q1, q0 + } + + z.arr[3], z.arr[2], z.arr[1], z.arr[0] = r3, r2, r1, r0 + + return z +} diff --git a/portal-loop/extracted/p/demo/uint256/pkg_metadata.json b/portal-loop/extracted/p/demo/uint256/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/uint256/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/uint256/uint256.gno b/portal-loop/extracted/p/demo/uint256/uint256.gno new file mode 100644 index 00000000..80da0ba8 --- /dev/null +++ b/portal-loop/extracted/p/demo/uint256/uint256.gno @@ -0,0 +1,291 @@ +// Ported from https://github.com/holiman/uint256 +// This package provides a 256-bit unsigned integer type, Uint256, and associated functions. +package uint256 + +import ( + "errors" + "math/bits" +) + +const ( + MaxUint64 = 1<<64 - 1 + uintSize = 32 << (^uint(0) >> 63) +) + +// Uint is represented as an array of 4 uint64, in little-endian order, +// so that Uint[3] is the most significant, and Uint[0] is the least significant +type Uint struct { + arr [4]uint64 +} + +// NewUint returns a new initialized Uint. +func NewUint(val uint64) *Uint { + z := &Uint{arr: [4]uint64{val, 0, 0, 0}} + return z +} + +// Zero returns a new Uint initialized to zero. +func Zero() *Uint { + return NewUint(0) +} + +// One returns a new Uint initialized to one. +func One() *Uint { + return NewUint(1) +} + +// SetAllOne sets all the bits of z to 1 +func (z *Uint) SetAllOne() *Uint { + z.arr[3], z.arr[2], z.arr[1], z.arr[0] = MaxUint64, MaxUint64, MaxUint64, MaxUint64 + return z +} + +// Set sets z to x and returns z. +func (z *Uint) Set(x *Uint) *Uint { + *z = *x + + return z +} + +// SetOne sets z to 1 +func (z *Uint) SetOne() *Uint { + z.arr[3], z.arr[2], z.arr[1], z.arr[0] = 0, 0, 0, 1 + return z +} + +const twoPow256Sub1 = "115792089237316195423570985008687907853269984665640564039457584007913129639935" + +// SetFromDecimal sets z from the given string, interpreted as a decimal number. +// OBS! This method is _not_ strictly identical to the (*big.Uint).SetString(..., 10) method. +// Notable differences: +// - This method does not accept underscore input, e.g. "100_000", +// - This method does not accept negative zero as valid, e.g "-0", +// - (this method does not accept any negative input as valid)) +func (z *Uint) SetFromDecimal(s string) (err error) { + // Remove max one leading + + if len(s) > 0 && s[0] == '+' { + s = s[1:] + } + // Remove any number of leading zeroes + if len(s) > 0 && s[0] == '0' { + var i int + var c rune + for i, c = range s { + if c != '0' { + break + } + } + s = s[i:] + } + if len(s) < len(twoPow256Sub1) { + return z.fromDecimal(s) + } + if len(s) == len(twoPow256Sub1) { + if s > twoPow256Sub1 { + return ErrBig256Range + } + return z.fromDecimal(s) + } + return ErrBig256Range +} + +// FromDecimal is a convenience-constructor to create an Uint from a +// decimal (base 10) string. Numbers larger than 256 bits are not accepted. +func FromDecimal(decimal string) (*Uint, error) { + var z Uint + if err := z.SetFromDecimal(decimal); err != nil { + return nil, err + } + return &z, nil +} + +// MustFromDecimal is a convenience-constructor to create an Uint from a +// decimal (base 10) string. +// Returns a new Uint and panics if any error occurred. +func MustFromDecimal(decimal string) *Uint { + var z Uint + if err := z.SetFromDecimal(decimal); err != nil { + panic(err) + } + return &z +} + +// multipliers holds the values that are needed for fromDecimal +var multipliers = [5]*Uint{ + nil, // represents first round, no multiplication needed + {[4]uint64{10000000000000000000, 0, 0, 0}}, // 10 ^ 19 + {[4]uint64{687399551400673280, 5421010862427522170, 0, 0}}, // 10 ^ 38 + {[4]uint64{5332261958806667264, 17004971331911604867, 2938735877055718769, 0}}, // 10 ^ 57 + {[4]uint64{0, 8607968719199866880, 532749306367912313, 1593091911132452277}}, // 10 ^ 76 +} + +// fromDecimal is a helper function to only ever be called via SetFromDecimal +// this function takes a string and chunks it up, calling ParseUint on it up to 5 times +// these chunks are then multiplied by the proper power of 10, then added together. +func (z *Uint) fromDecimal(bs string) error { + // first clear the input + z.Clear() + // the maximum value of uint64 is 18446744073709551615, which is 20 characters + // one less means that a string of 19 9's is always within the uint64 limit + var ( + num uint64 + err error + remaining = len(bs) + ) + if remaining == 0 { + return errors.New("EOF") + } + // We proceed in steps of 19 characters (nibbles), from least significant to most significant. + // This means that the first (up to) 19 characters do not need to be multiplied. + // In the second iteration, our slice of 19 characters needs to be multipleied + // by a factor of 10^19. Et cetera. + for i, mult := range multipliers { + if remaining <= 0 { + return nil // Done + } else if remaining > 19 { + num, err = parseUint(bs[remaining-19:remaining], 10, 64) + } else { + // Final round + num, err = parseUint(bs, 10, 64) + } + if err != nil { + return err + } + // add that number to our running total + if i == 0 { + z.SetUint64(num) + } else { + base := NewUint(num) + z.Add(z, base.Mul(base, mult)) + } + // Chop off another 19 characters + if remaining > 19 { + bs = bs[0 : remaining-19] + } + remaining -= 19 + } + return nil +} + +// Byte sets z to the value of the byte at position n, +// with 'z' considered as a big-endian 32-byte integer +// if 'n' > 32, f is set to 0 +// Example: f = '5', n=31 => 5 +func (z *Uint) Byte(n *Uint) *Uint { + // in z, z.arr[0] is the least significant + if number, overflow := n.Uint64WithOverflow(); !overflow { + if number < 32 { + number := z.arr[4-1-number/8] + offset := (n.arr[0] & 0x7) << 3 // 8*(n.d % 8) + z.arr[0] = (number & (0xff00000000000000 >> offset)) >> (56 - offset) + z.arr[3], z.arr[2], z.arr[1] = 0, 0, 0 + return z + } + } + + return z.Clear() +} + +// BitLen returns the number of bits required to represent z +func (z *Uint) BitLen() int { + switch { + case z.arr[3] != 0: + return 192 + bits.Len64(z.arr[3]) + case z.arr[2] != 0: + return 128 + bits.Len64(z.arr[2]) + case z.arr[1] != 0: + return 64 + bits.Len64(z.arr[1]) + default: + return bits.Len64(z.arr[0]) + } +} + +// ByteLen returns the number of bytes required to represent z +func (z *Uint) ByteLen() int { + return (z.BitLen() + 7) / 8 +} + +// Clear sets z to 0 +func (z *Uint) Clear() *Uint { + z.arr[3], z.arr[2], z.arr[1], z.arr[0] = 0, 0, 0, 0 + return z +} + +const ( + // hextable = "0123456789abcdef" + bintable = "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x01\x02\x03\x04\x05\x06\a\b\t\xff\xff\xff\xff\xff\xff\xff\n\v\f\r\x0e\x0f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\n\v\f\r\x0e\x0f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff" + badNibble = 0xff +) + +// SetFromHex sets z from the given string, interpreted as a hexadecimal number. +// OBS! This method is _not_ strictly identical to the (*big.Int).SetString(..., 16) method. +// Notable differences: +// - This method _require_ "0x" or "0X" prefix. +// - This method does not accept zero-prefixed hex, e.g. "0x0001" +// - This method does not accept underscore input, e.g. "100_000", +// - This method does not accept negative zero as valid, e.g "-0x0", +// - (this method does not accept any negative input as valid) +func (z *Uint) SetFromHex(hex string) error { + return z.fromHex(hex) +} + +// fromHex is the internal implementation of parsing a hex-string. +func (z *Uint) fromHex(hex string) error { + if err := checkNumberS(hex); err != nil { + return err + } + if len(hex) > 66 { + return ErrBig256Range + } + z.Clear() + end := len(hex) + for i := 0; i < 4; i++ { + start := end - 16 + if start < 2 { + start = 2 + } + for ri := start; ri < end; ri++ { + nib := bintable[hex[ri]] + if nib == badNibble { + return ErrSyntax + } + z.arr[i] = z.arr[i] << 4 + z.arr[i] += uint64(nib) + } + end = start + } + return nil +} + +// FromHex is a convenience-constructor to create an Uint from +// a hexadecimal string. The string is required to be '0x'-prefixed +// Numbers larger than 256 bits are not accepted. +func FromHex(hex string) (*Uint, error) { + var z Uint + if err := z.fromHex(hex); err != nil { + return nil, err + } + return &z, nil +} + +// MustFromHex is a convenience-constructor to create an Uint from +// a hexadecimal string. +// Returns a new Uint and panics if any error occurred. +func MustFromHex(hex string) *Uint { + var z Uint + if err := z.fromHex(hex); err != nil { + panic(err) + } + return &z +} + +// Clone creates a new Uint identical to z +func (z *Uint) Clone() *Uint { + var x Uint + x.arr[0] = z.arr[0] + x.arr[1] = z.arr[1] + x.arr[2] = z.arr[2] + x.arr[3] = z.arr[3] + + return &x +} diff --git a/portal-loop/extracted/p/demo/uint256/utils.gno b/portal-loop/extracted/p/demo/uint256/utils.gno new file mode 100644 index 00000000..969728f3 --- /dev/null +++ b/portal-loop/extracted/p/demo/uint256/utils.gno @@ -0,0 +1,180 @@ +package uint256 + +// lower(c) is a lower-case letter if and only if +// c is either that lower-case letter or the equivalent upper-case letter. +// Instead of writing c == 'x' || c == 'X' one can write lower(c) == 'x'. +// Note that lower of non-letters can produce other non-letters. +func lower(c byte) byte { + return c | ('x' - 'X') +} + +// underscoreOK reports whether the underscores in s are allowed. +// Checking them in this one function lets all the parsers skip over them simply. +// Underscore must appear only between digits or between a base prefix and a digit. +func underscoreOK(s string) bool { + // saw tracks the last character (class) we saw: + // ^ for beginning of number, + // 0 for a digit or base prefix, + // _ for an underscore, + // ! for none of the above. + saw := '^' + i := 0 + + // Optional sign. + if len(s) >= 1 && (s[0] == '-' || s[0] == '+') { + s = s[1:] + } + + // Optional base prefix. + hex := false + if len(s) >= 2 && s[0] == '0' && (lower(s[1]) == 'b' || lower(s[1]) == 'o' || lower(s[1]) == 'x') { + i = 2 + saw = '0' // base prefix counts as a digit for "underscore as digit separator" + hex = lower(s[1]) == 'x' + } + + // Number proper. + for ; i < len(s); i++ { + // Digits are always okay. + if '0' <= s[i] && s[i] <= '9' || hex && 'a' <= lower(s[i]) && lower(s[i]) <= 'f' { + saw = '0' + continue + } + // Underscore must follow digit. + if s[i] == '_' { + if saw != '0' { + return false + } + saw = '_' + continue + } + // Underscore must also be followed by digit. + if saw == '_' { + return false + } + // Saw non-digit, non-underscore. + saw = '!' + } + return saw != '_' +} + +func checkNumberS(input string) error { + const fn = "UnmarshalText" + l := len(input) + if l == 0 { + return errEmptyString(fn, input) + } + if l < 2 || input[0] != '0' || + (input[1] != 'x' && input[1] != 'X') { + return errMissingPrefix(fn, input) + } + if l == 2 { + return errEmptyNumber(fn, input) + } + if len(input) > 3 && input[2] == '0' { + return errLeadingZero(fn, input) + } + return nil +} + +// ParseUint is like ParseUint but for unsigned numbers. +// +// A sign prefix is not permitted. +func parseUint(s string, base int, bitSize int) (uint64, error) { + const fnParseUint = "ParseUint" + + if s == "" { + return 0, errSyntax(fnParseUint, s) + } + + base0 := base == 0 + + s0 := s + switch { + case 2 <= base && base <= 36: + // valid base; nothing to do + + case base == 0: + // Look for octal, hex prefix. + base = 10 + if s[0] == '0' { + switch { + case len(s) >= 3 && lower(s[1]) == 'b': + base = 2 + s = s[2:] + case len(s) >= 3 && lower(s[1]) == 'o': + base = 8 + s = s[2:] + case len(s) >= 3 && lower(s[1]) == 'x': + base = 16 + s = s[2:] + default: + base = 8 + s = s[1:] + } + } + + default: + return 0, errInvalidBase(fnParseUint, base) + } + + if bitSize == 0 { + bitSize = uintSize + } else if bitSize < 0 || bitSize > 64 { + return 0, errInvalidBitSize(fnParseUint, bitSize) + } + + // Cutoff is the smallest number such that cutoff*base > maxUint64. + // Use compile-time constants for common cases. + var cutoff uint64 + switch base { + case 10: + cutoff = MaxUint64/10 + 1 + case 16: + cutoff = MaxUint64/16 + 1 + default: + cutoff = MaxUint64/uint64(base) + 1 + } + + maxVal := uint64(1)<= byte(base) { + return 0, errSyntax(fnParseUint, s0) + } + + if n >= cutoff { + // n*base overflows + return maxVal, errRange(fnParseUint, s0) + } + n *= uint64(base) + + n1 := n + uint64(d) + if n1 < n || n1 > maxVal { + // n+d overflows + return maxVal, errRange(fnParseUint, s0) + } + n = n1 + } + + if underscores && !underscoreOK(s0) { + return 0, errSyntax(fnParseUint, s0) + } + + return n, nil +} diff --git a/portal-loop/extracted/p/demo/urequire/pkg_metadata.json b/portal-loop/extracted/p/demo/urequire/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/urequire/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/urequire/urequire.gno b/portal-loop/extracted/p/demo/urequire/urequire.gno new file mode 100644 index 00000000..94721dd8 --- /dev/null +++ b/portal-loop/extracted/p/demo/urequire/urequire.gno @@ -0,0 +1,103 @@ +// urequire is a sister package for uassert. +// XXX: codegen the package. +package urequire + +import "gno.land/p/demo/uassert" + +// type TestingT = uassert.TestingT // XXX: bug, should work + +func NoError(t uassert.TestingT, err error, msgs ...string) { + t.Helper() + if uassert.NoError(t, err, msgs...) { + return + } + t.FailNow() +} + +func Error(t uassert.TestingT, err error, msgs ...string) { + t.Helper() + if uassert.Error(t, err, msgs...) { + return + } + t.FailNow() +} + +func ErrorContains(t uassert.TestingT, err error, contains string, msgs ...string) { + t.Helper() + if uassert.ErrorContains(t, err, contains, msgs...) { + return + } + t.FailNow() +} + +func True(t uassert.TestingT, value bool, msgs ...string) { + t.Helper() + if uassert.True(t, value, msgs...) { + return + } + t.FailNow() +} + +func False(t uassert.TestingT, value bool, msgs ...string) { + t.Helper() + if uassert.False(t, value, msgs...) { + return + } + t.FailNow() +} + +func ErrorIs(t uassert.TestingT, err, target error, msgs ...string) { + t.Helper() + if uassert.ErrorIs(t, err, target, msgs...) { + return + } + t.FailNow() +} + +func PanicsWithMessage(t uassert.TestingT, msg string, f func(), msgs ...string) { + t.Helper() + if uassert.PanicsWithMessage(t, msg, f, msgs...) { + return + } + t.FailNow() +} + +func NotPanics(t uassert.TestingT, f func(), msgs ...string) { + t.Helper() + if uassert.NotPanics(t, f, msgs...) { + return + } + t.FailNow() +} + +func Equal(t uassert.TestingT, expected, actual interface{}, msgs ...string) { + t.Helper() + if uassert.Equal(t, expected, actual, msgs...) { + return + } + t.FailNow() +} + +func NotEqual(t uassert.TestingT, expected, actual interface{}, msgs ...string) { + t.Helper() + if uassert.NotEqual(t, expected, actual, msgs...) { + return + } + t.FailNow() +} + +func Empty(t uassert.TestingT, obj interface{}, msgs ...string) { + t.Helper() + if uassert.Empty(t, obj, msgs...) { + return + } + t.FailNow() +} + +func NotEmpty(t uassert.TestingT, obj interface{}, msgs ...string) { + t.Helper() + if uassert.NotEmpty(t, obj, msgs...) { + return + } + t.FailNow() +} diff --git a/portal-loop/extracted/p/demo/urequire/urequire_test.gno b/portal-loop/extracted/p/demo/urequire/urequire_test.gno new file mode 100644 index 00000000..463e3fff --- /dev/null +++ b/portal-loop/extracted/p/demo/urequire/urequire_test.gno @@ -0,0 +1,8 @@ +package urequire + +import "testing" + +func TestPackage(t *testing.T) { + Equal(t, 42, 42) + // XXX: find a way to unit test this package +} diff --git a/portal-loop/extracted/p/demo/users/pkg_metadata.json b/portal-loop/extracted/p/demo/users/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/users/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/users/types.gno b/portal-loop/extracted/p/demo/users/types.gno new file mode 100644 index 00000000..d28b6a8e --- /dev/null +++ b/portal-loop/extracted/p/demo/users/types.gno @@ -0,0 +1,14 @@ +package users + +type AddressOrName string + +func (aon AddressOrName) IsName() bool { + return aon != "" && aon[0] == '@' +} + +func (aon AddressOrName) GetName() (string, bool) { + if len(aon) >= 2 && aon[0] == '@' { + return string(aon[1:]), true + } + return "", false +} diff --git a/portal-loop/extracted/p/demo/users/users.gno b/portal-loop/extracted/p/demo/users/users.gno new file mode 100644 index 00000000..204eaf19 --- /dev/null +++ b/portal-loop/extracted/p/demo/users/users.gno @@ -0,0 +1,31 @@ +package users + +import ( + "std" + "strconv" +) + +//---------------------------------------- +// Types + +type User struct { + Address std.Address + Name string + Profile string + Number int + Invites int + Inviter std.Address +} + +func (u *User) Render() string { + str := "## user " + u.Name + "\n" + + "\n" + + " * address = " + string(u.Address) + "\n" + + " * " + strconv.Itoa(u.Invites) + " invites\n" + if u.Inviter != "" { + str = str + " * invited by " + string(u.Inviter) + "\n" + } + str = str + "\n" + + u.Profile + "\n" + return str +} diff --git a/portal-loop/extracted/p/demo/users/users_test.gno b/portal-loop/extracted/p/demo/users/users_test.gno new file mode 100644 index 00000000..82abcb9f --- /dev/null +++ b/portal-loop/extracted/p/demo/users/users_test.gno @@ -0,0 +1 @@ +package users diff --git a/portal-loop/extracted/p/demo/watchdog/pkg_metadata.json b/portal-loop/extracted/p/demo/watchdog/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/demo/watchdog/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/demo/watchdog/watchdog.gno b/portal-loop/extracted/p/demo/watchdog/watchdog.gno new file mode 100644 index 00000000..6b4591b4 --- /dev/null +++ b/portal-loop/extracted/p/demo/watchdog/watchdog.gno @@ -0,0 +1,39 @@ +package watchdog + +import "time" + +type Watchdog struct { + Duration time.Duration + lastUpdate time.Time + lastDown time.Time +} + +func (w *Watchdog) Alive() { + now := time.Now() + if !w.IsAlive() { + w.lastDown = now + } + w.lastUpdate = now +} + +func (w Watchdog) Status() string { + if w.IsAlive() { + return "OK" + } + return "KO" +} + +func (w Watchdog) IsAlive() bool { + return time.Since(w.lastUpdate) < w.Duration +} + +func (w Watchdog) UpSince() time.Time { + return w.lastDown +} + +func (w Watchdog) DownSince() time.Time { + if !w.IsAlive() { + return w.lastUpdate + } + return time.Time{} +} diff --git a/portal-loop/extracted/p/demo/watchdog/watchdog_test.gno b/portal-loop/extracted/p/demo/watchdog/watchdog_test.gno new file mode 100644 index 00000000..eb7121fc --- /dev/null +++ b/portal-loop/extracted/p/demo/watchdog/watchdog_test.gno @@ -0,0 +1,16 @@ +package watchdog + +import ( + "testing" + "time" + + "gno.land/p/demo/uassert" +) + +func TestPackage(t *testing.T) { + w := Watchdog{Duration: 5 * time.Minute} + uassert.False(t, w.IsAlive()) + w.Alive() + uassert.True(t, w.IsAlive()) + // XXX: add more tests when we'll be able to "skip time". +} diff --git a/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/alerts/alerts.gno b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/alerts/alerts.gno new file mode 100644 index 00000000..e95daa0e --- /dev/null +++ b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/alerts/alerts.gno @@ -0,0 +1,64 @@ +package alerts + +import ( + "gno.land/p/demo/ufmt" +) + +const ( + TypeError Type = "alerts-error" + TypeWarning Type = "alerts-warning" +) + +const ( + StyleError = ` +.alerts-error { + padding: .75rem 1.25rem; + border: 1px solid #f5c6cb; + background-color: #f8d7da; + color: #721c24; + border-radius: .25rem; +} +` + StyleWarning = ` +.alerts-warning { + padding: .75rem 1.25rem; + border: 1px solid #ffeeba; + background-color: #fff3cd; + color: #856404; + border-radius: .25rem; +} +` +) + +// Type defines the type of alerts. +type Type string + +// NewAlert returns HTML for an alert. +func NewAlert(t Type, content string) string { + var css string + switch t { + case TypeWarning: + css = StyleWarning + case TypeError: + css = StyleError + default: + panic("unknown alert type") + } + + return "\n\n" + ufmt.Sprintf(`

%s

`, string(t), content, css) + "\n\n" +} + +// NewWarning returns HTML for a warning alert. +func NewWarning(content string) string { + return NewAlert(TypeWarning, content) +} + +// NewError returns HTML for an error alert. +func NewError(content string) string { + return NewAlert(TypeError, content) +} + +// NewLink returns an HTML link. +func NewLink(href, label string) string { + return ufmt.Sprintf(`%s`, href, label) +} diff --git a/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/alerts/pkg_metadata.json b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/alerts/pkg_metadata.json new file mode 100644 index 00000000..1305272f --- /dev/null +++ b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/alerts/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/blog/LICENSE b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/blog/LICENSE new file mode 100644 index 00000000..1e486ea9 --- /dev/null +++ b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/blog/LICENSE @@ -0,0 +1,62 @@ +Copyright (c) 2024. All rights reserved. + +Project Owner: +NewTendermint, LLC + +Project Maintainer: +İlker Göktuğ ÖZTÜRK. , + +Your access to this Project and your contributions to this Project are subject +to the following terms: + +* You hereby grant to the listed Owner and Maintainer of this Project the +worldwide, irrevocable and royalty-free right to use, publish, relicense and +sublicense your contributions under any non-exclusive license of their +choosing for commercial and non-commercial purposes. +* You shall not attempt to bring any intellectual property infringement or +misappropriation claims against the Owner or Maintainer of this Project +relating to or arising from your contributions. +* You represent that you are the sole owner of all rights in your +contributions and that no third party has any rights or interests therein. + +FOR THE SCOPE OF THIS LICENSE, A CONTRIBUTION IS DEFINED TO INCLUDE ANY WORKS, +IDEAS, CODE, PROCESSES, OR APIS MADE AVAILABLE TO VIEW BY THE GENERAL PUBLIC +(INCLUDING ANY PUBLICLY ACCESSIBLE INTERNET FORUMS AND CHAT SERVERS WHERE +ACCESS IS AVAILABLE FOR FREE WITH REGISTRATION) OR PRIVATELY TO THIS PROJECT'S +OWNER AND MAINTAINERS; INCLUDING WORKS, IDEAS, CODE, PROCESSES, AND APIS THAT +ARE ABOUT THIS PROJECT AND ITS CONTRIBUTIONS, OR MENTIONED IN REFERENCE TO +THIS PROJECT, WHERE SUCH WORKS, IDEAS, CODE, PROCESSES, AND APIS ARE MATERIAL +TO THE SUCCESS, IMPROVEMENT, OR COMPLETION OF THIS PROJECT, AS DETERMINED BY +THE OWNER OF THIS PROJECT. + +Contributions may come in any form, and include (but are not limited to): + +* pull requests +* diff patches +* commentary +* example code + +If you do not want your contribution to become incorporated into this Project, +do not make contributions to this Project. The creation of contributions that +may in the future become known to this Project's Owner and Maintainer +constitutes a willing contribution to this Project in accordance with this +license. + +THIS PROJECT AND THE WORKS AVAILABLE THROUGH THIS PROJECT ARE PROVIDED “AS IS” +AND WITHOUT WARRANTY OF ANY KIND. IN NO EVENT SHALL THE OWNER OR MAINTAINER OF +THIS PROJECT BE LIABLE TO YOU OR ANY THIRD PARTY FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THIS PROJECT OR THE WORKS AVAILABLE THROUGH +THIS PROJECT. YOU AGREED TO INDEMNIFY, DEFEND AND HOLD THE OWNER AND +MAINTAINER FROM AND AGAINST ANY CLAIMS, LOSSES OR DAMAGES ARISING FROM YOUR +USE OF THIS PROJECT OR THE WORKS AVAILABLE THROUGH THIS PROJECT. + +This license is subject to change at any time by the Project Owner or +Maintainer. + +Your continued access to or use of this Project or any works +available through this Project shall be subject to the then-current version +of this license. + +The Project Owner and Maintainer reserve the right to change this license +without needing the consent of the contributors to this Project. diff --git a/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/blog/asserts.gno b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/blog/asserts.gno new file mode 100644 index 00000000..3fe2d93a --- /dev/null +++ b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/blog/asserts.gno @@ -0,0 +1,88 @@ +package blog + +import ( + "crypto/sha256" + "encoding/hex" + "net/url" + "regexp" + "strings" +) + +var ( + hostnameRe = regexp.MustCompile(`^(?i)[a-z0-9-]+(\.[a-z0-9-]+)+\.?$`) + sha256Re = regexp.MustCompile(`^[a-f0-9]{64}$`) + slugRe = regexp.MustCompile(`^[a-z0-9\p{L}]+(?:-[a-z0-9\p{L}]+)*$`) +) + +// AssertIsSlug asserts that a URL slug is valid. +func AssertIsSlug(slug string) { + if !IsSlug(slug) { + panic("URL slug is not valid") + } +} + +// AssertContentSha256Hash asserts that a hex hash is a valid SHA256 hash. +func AssertIsSha256Hash(hexHash string) { + if !IsSha256Hash(hexHash) { + panic("invalid sha256 hash") + } +} + +// AssertIsContentURL asserts that a URL is a valid link to a content. +// URL must have a path to ve valid. Website URLs will fail. +func AssertIsContentURL(url string) { + if !IsURL(url, true) { + panic("content URL is not valid, make sure path to content is specified") + } +} + +// AssertTitleIsNotEmpty asserts that a title is not an empty string. +func AssertTitleIsNotEmpty(title string) { + if strings.TrimSpace(title) == "" { + panic("title is empty") + } +} + +// AssertContentSha256Hash asserts that the SHA256 hash of a content matches a hash. +func AssertContentSha256Hash(content, hash string) { + if hash != GetHexSha256Hash(content) { + panic("content sha256 checksum is not valid") + } +} + +// IsSlug checks if a string is a valid URL slug. +func IsSlug(slug string) bool { + return slugRe.MatchString(slug) +} + +// IsSha256Hash checks is a hex hash is a valid SHA256 hash. +func IsSha256Hash(hexHash string) bool { + return sha256Re.MatchString(strings.ToLower(hexHash)) +} + +// IsURL checks if a URL is valid. +// URL path availability can optionally be enforced. +func IsURL(rawURL string, requirePath bool) bool { + u, err := url.ParseRequestURI(rawURL) + if err != nil { + return false + } + + if requirePath && u.Path == "" || u.Path == "/" { + return false + } + + if u.Scheme != "https" && u.Scheme != "http" { + return false + } + + hostname := u.Hostname() + return hostname != "" && hostnameRe.MatchString(hostname) +} + +// GetHexSha256Hash returns the hexadecimal encoding of the string's SHA256 hash. +// An empty string is returned when the argument is an empty string. +func GetHexSha256Hash(s string) string { + sum := sha256.Sum256([]byte(s)) + return hex.EncodeToString(sum[:]) +} diff --git a/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/blog/asserts_test.gno b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/blog/asserts_test.gno new file mode 100644 index 00000000..41751335 --- /dev/null +++ b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/blog/asserts_test.gno @@ -0,0 +1,191 @@ +package blog + +import ( + "testing" + + "gno.land/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/blog" +) + +func TestIsSlug(t *testing.T) { + cases := []struct { + name, slug string + want bool + }{ + { + name: "empty", + want: false, + }, + { + name: "one letter", + slug: "a", + want: true, + }, + { + name: "one unicode letter", + slug: "á", + want: true, + }, + { + name: "one word", + slug: "foo", + want: true, + }, + { + name: "one unicode word", + slug: "fóo", + want: true, + }, + { + name: "many words", + slug: "foo-bar-baz", + want: true, + }, + { + name: "many unicode words", + slug: "fóo-bár-báz", + want: true, + }, + { + name: "with spaces", + slug: "foo bar", + want: false, + }, + { + name: "with invalid chars", + slug: "foo/bar", + want: false, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + // Act + got := blog.IsSlug(tc.slug) + + // Assert + if got != tc.want { + t.Fatalf("expected slug check to return: %v", tc.want) + } + }) + } +} + +func TestIsSha256Hash(t *testing.T) { + cases := []struct { + name, hash string + want bool + }{ + { + name: "empty", + want: false, + }, + { + name: "ok", + hash: "1a66cf828aea323fc58c653b0bc0d64061bb5c198e500a541a2c97f4f45b668d", + want: true, + }, + { + name: "invalid size", + hash: "1a66cf828aea323", + want: false, + }, + { + name: "invalid characters", + hash: "1a66#?", + want: false, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + // Act + got := blog.IsSha256Hash(tc.hash) + + // Assert + if got != tc.want { + t.Fatalf("expected sha256 check check to return: %v", tc.want) + } + }) + } +} + +func TestIsURL(t *testing.T) { + cases := []struct { + url string + want bool + }{ + {url: "https", want: false}, + {url: "https/a", want: false}, + {url: "https/a/b", want: false}, + {url: "https/a/b/", want: false}, + {url: "https:", want: false}, + {url: "https:www.test.com", want: false}, + {url: "https:www.test.com/", want: false}, + {url: "https:www.test.com/a", want: false}, + {url: "https:www.test.com/a/b", want: false}, + {url: "https:www.test.com/a/b/", want: false}, + {url: "https:www.test.com:42/a/b/", want: false}, + {url: "https:/", want: false}, + {url: "https:/a", want: false}, + {url: "https:/a/b", want: false}, + {url: "https:/a/b/", want: false}, + {url: "https:/www.test.com/a/b", want: false}, + {url: "https://", want: false}, + {url: "https://a", want: false}, + {url: "https://a/b", want: false}, + {url: "https://a/b/", want: false}, + {url: "https://www.test.com", want: false}, + {url: "https://www.test.com/", want: false}, + {url: "https://www.test.com/a", want: true}, + {url: "https://www.test.com/a/b", want: true}, + {url: "https://www.test.com/a/b/", want: true}, + {url: "https://www.test.com:42/a/b/", want: true}, + {url: "https://foo.bar.test.com", want: false}, + {url: "https://foo.bar.test.com/", want: false}, + {url: "https://foo.bar.test.com/a", want: true}, + {url: "https://foo.bar.test.com/a/b", want: true}, + {url: "https://foo.bar.test.com/a/b/", want: true}, + {url: "https://foo.bar.test.com/a/b", want: true}, + {url: "https://foo.bar.test.com:42/a/b", want: true}, + } + + for _, tc := range cases { + t.Run(tc.url, func(t *testing.T) { + // Act + got := blog.IsURL(tc.url, true) + + // Assert + if got != tc.want { + t.Fatalf("expected URL check to return: %v", tc.want) + } + }) + } +} + +func TestGetHexSha256Hash(t *testing.T) { + cases := []struct { + name, content, want string + }{ + { + name: "empty", + want: "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + }, + { + name: "ok", + content: "foo", + want: "2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + // Act + got := blog.GetHexSha256Hash(tc.content) + + // Assert + if got != tc.want { + t.Fatalf("expected hash: '%s', got: '%s'", tc.want, got) + } + }) + } +} diff --git a/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/blog/blog.gno b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/blog/blog.gno new file mode 100644 index 00000000..9d5e8935 --- /dev/null +++ b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/blog/blog.gno @@ -0,0 +1,63 @@ +package blog + +import ( + "strings" + + "gno.land/p/demo/avl" +) + +type ( + // Blog defines a blog. + Blog struct { + posts avl.Tree // string(slug) -> *Post + + // Title is blog's title. + Title string + + // Description is the blog's description. + Description string + } + + // PostIterFn defines the a callback to iterate blog posts. + PostIterFn func(*Post) bool +) + +// HasPost checks if a post with a URL slug exists. +func (b Blog) HasPost(slug string) bool { + return b.posts.Has(slug) +} + +// GetPost returns a blog's post. +func (b Blog) GetPost(slug string) (_ *Post, found bool) { + if v, found := b.posts.Get(slug); found { + return v.(*Post), true + } + return nil, false +} + +// AddPost adds a new post to the blog. +func (b *Blog) AddPost(p *Post) bool { + slug := strings.TrimSpace(p.Slug) + if slug == "" { + panic("post has an empty slug") + } + + return b.posts.Set(slug, p) +} + +// RemovePost removes a post from the blog. +// The removed post is returned after being removed if it exists. +func (b *Blog) RemovePost(slug string) (_ *Post, removed bool) { + if v, removed := b.posts.Remove(slug); removed { + return v.(*Post), true + } + return nil, false +} + +// IteratePosts iterates all posts by slug. +func (b Blog) IteratePosts(fn PostIterFn) bool { + // TODO: Improve blog post iteration + return b.posts.Iterate("", "", func(_ string, value interface{}) bool { + return fn(value.(*Post)) + }) +} diff --git a/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/blog/invar.gno b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/blog/invar.gno new file mode 100644 index 00000000..b6d5b130 --- /dev/null +++ b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/blog/invar.gno @@ -0,0 +1,94 @@ +package blog + +import "time" + +func NewInvarBlog(b *Blog) InvarBlog { + // TODO: Remove blog and post references if Gno implements invar (inmutable) references + return InvarBlog{b} +} + +type InvarBlog struct { + ref *Blog +} + +func (b InvarBlog) Title() string { + return b.ref.Title +} + +func (b InvarBlog) Description() string { + return b.ref.Description +} + +func (b InvarBlog) IteratePosts(fn func(InvarPost) bool) bool { + return b.ref.IteratePosts(func(p *Post) bool { + return fn(NewInvarPost(p)) + }) +} + +func NewInvarPost(p *Post) InvarPost { + return InvarPost{p} +} + +type InvarPost struct { + ref *Post +} + +func (p InvarPost) Slug() string { + return p.ref.Slug +} + +func (p InvarPost) Title() string { + return p.ref.Title +} + +func (p InvarPost) Summary() string { + return p.ref.Summary +} + +func (p InvarPost) Status() PostStatus { + return p.ref.Status +} + +func (p InvarPost) Content() string { + return p.ref.Content +} + +func (p InvarPost) ContentHash() string { + return p.ref.ContentHash +} + +func (p InvarPost) Authors() AddressList { + return p.ref.Authors +} + +func (p InvarPost) Editors() AddressList { + return p.ref.Editors +} + +func (p InvarPost) Contributors() AddressList { + return p.ref.Contributors +} + +func (p InvarPost) Publishers() AddressList { + return p.ref.Publishers +} + +func (p InvarPost) Tags() []string { + return p.ref.Tags +} + +func (p InvarPost) CreatedAt() time.Time { + return p.ref.CreatedAt +} + +func (p InvarPost) UpdatedAt() time.Time { + return p.ref.UpdatedAt +} + +func (p InvarPost) PublishAt() time.Time { + return p.ref.PublishAt +} + +func (p InvarPost) ExpireAt() time.Time { + return p.ref.ExpireAt +} diff --git a/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/blog/pkg_metadata.json b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/blog/pkg_metadata.json new file mode 100644 index 00000000..1305272f --- /dev/null +++ b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/blog/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/blog/post.gno b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/blog/post.gno new file mode 100644 index 00000000..bc8a3c20 --- /dev/null +++ b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/blog/post.gno @@ -0,0 +1,160 @@ +package blog + +import ( + "errors" + "std" + "strings" + "time" +) + +const ( + StatusDraft PostStatus = iota + StatusApproved + StatusPublished + StatusRevised + StatusArchived +) + +type ( + // AddressList defines a list of addresses. + AddressList []std.Address + + // PostStatus defines a type for blog post states. + PostStatus uint8 + + // Post defines a blog post. + Post struct { + // Slug contains the URL path slug for the post. + Slug string + + // Title is the post's title. + Title string + + // Summary is the post's summary. + Summary string + + // Status is the current post's state. + Status PostStatus + + // Content contains the post's content. + Content string + + // ContentHash contains the hash of the post's content. + ContentHash string + + // Authors contains the list of post authors. + Authors AddressList + + // Editors contains the list of post editors. + // Each account belongs to an editor that significantly improved the content. + Editors AddressList + + // Contributors contains the list of post contributors. + // Each account belongs to a contributor that submitted small content changes. + Contributors AddressList + + // Publishers contains the accounts that published the content. + Publishers AddressList + + // Tags contains a list of tags for the post. + // These tags can be used to build the blog content taxonomy. + Tags []string + + // CreatedAt is the block time when the post has been created. + CreatedAt time.Time + + // UpdatedAt is the block time when the post has been updated for the last time. + UpdatedAt time.Time + + // PublishAt is the block time when the post should be published. + PublishAt time.Time + + // ExpireAt is the block time when the post should be archived. + ExpireAt time.Time + } +) + +// String returns a comma separated string with the list of addresses. +func (x AddressList) String() string { + var s []string + for _, item := range x { + s = append(s, item.String()) + } + return strings.Join(s, ", ") +} + +// HasAddress checks if an address is part of the address list. +func (x AddressList) HasAddress(addr std.Address) bool { + for _, item := range x { + if item == addr { + return true + } + } + return false +} + +// String returns the post status name. +func (s PostStatus) String() string { + switch s { + case StatusDraft: + return "draft" + case StatusApproved: + return "approved" + case StatusPublished: + return "published" + case StatusRevised: + return "revised" + case StatusArchived: + return "archived" + default: + return "unknown" + } +} + +// IsExpired checks if the expiration date was reached. +func (p Post) IsExpired() bool { + return !p.ExpireAt.IsZero() && p.ExpireAt.Before(time.Now()) +} + +// ParseStringToAddresses parses a string addresses. +// String should have one or more lines where each line should contain an address. +// Addresses are validated after being parsed. +func ParseStringToAddresses(s string) (AddressList, error) { + var addresses AddressList + for _, line := range strings.Split(s, "\n") { + line = strings.TrimSpace(line) + if line == "" { + // Skip empty lines + continue + } + + addr := std.Address(strings.TrimSpace(line)) + if !addr.IsValid() { + return nil, errors.New("invalid address: " + EscapeHTML(addr.String())) + } + + addresses = append(addresses, addr) + } + return addresses, nil +} + +// MustParseStringToAddresses parses a string addresses. +// String should have one or more lines where each line should contain an address. +// Addresses are validated after being parsed. +func MustParseStringToAddresses(s string) AddressList { + addresses, err := ParseStringToAddresses(s) + if err != nil { + panic(err.Error()) + } + return addresses +} + +// EscapeHTML escapes special characters like "<" to become "<". +// It escapes only five such characters: <, >, &, ' and ". +func EscapeHTML(s string) string { + s = strings.ReplaceAll(s, `&`, "&") + s = strings.ReplaceAll(s, `"`, """) + s = strings.ReplaceAll(s, `'`, "'") + s = strings.ReplaceAll(s, `<`, "<") + return strings.ReplaceAll(s, `>`, ">") +} diff --git a/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/LICENSE b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/LICENSE new file mode 100644 index 00000000..1e486ea9 --- /dev/null +++ b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/LICENSE @@ -0,0 +1,62 @@ +Copyright (c) 2024. All rights reserved. + +Project Owner: +NewTendermint, LLC + +Project Maintainer: +İlker Göktuğ ÖZTÜRK. , + +Your access to this Project and your contributions to this Project are subject +to the following terms: + +* You hereby grant to the listed Owner and Maintainer of this Project the +worldwide, irrevocable and royalty-free right to use, publish, relicense and +sublicense your contributions under any non-exclusive license of their +choosing for commercial and non-commercial purposes. +* You shall not attempt to bring any intellectual property infringement or +misappropriation claims against the Owner or Maintainer of this Project +relating to or arising from your contributions. +* You represent that you are the sole owner of all rights in your +contributions and that no third party has any rights or interests therein. + +FOR THE SCOPE OF THIS LICENSE, A CONTRIBUTION IS DEFINED TO INCLUDE ANY WORKS, +IDEAS, CODE, PROCESSES, OR APIS MADE AVAILABLE TO VIEW BY THE GENERAL PUBLIC +(INCLUDING ANY PUBLICLY ACCESSIBLE INTERNET FORUMS AND CHAT SERVERS WHERE +ACCESS IS AVAILABLE FOR FREE WITH REGISTRATION) OR PRIVATELY TO THIS PROJECT'S +OWNER AND MAINTAINERS; INCLUDING WORKS, IDEAS, CODE, PROCESSES, AND APIS THAT +ARE ABOUT THIS PROJECT AND ITS CONTRIBUTIONS, OR MENTIONED IN REFERENCE TO +THIS PROJECT, WHERE SUCH WORKS, IDEAS, CODE, PROCESSES, AND APIS ARE MATERIAL +TO THE SUCCESS, IMPROVEMENT, OR COMPLETION OF THIS PROJECT, AS DETERMINED BY +THE OWNER OF THIS PROJECT. + +Contributions may come in any form, and include (but are not limited to): + +* pull requests +* diff patches +* commentary +* example code + +If you do not want your contribution to become incorporated into this Project, +do not make contributions to this Project. The creation of contributions that +may in the future become known to this Project's Owner and Maintainer +constitutes a willing contribution to this Project in accordance with this +license. + +THIS PROJECT AND THE WORKS AVAILABLE THROUGH THIS PROJECT ARE PROVIDED “AS IS” +AND WITHOUT WARRANTY OF ANY KIND. IN NO EVENT SHALL THE OWNER OR MAINTAINER OF +THIS PROJECT BE LIABLE TO YOU OR ANY THIRD PARTY FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THIS PROJECT OR THE WORKS AVAILABLE THROUGH +THIS PROJECT. YOU AGREED TO INDEMNIFY, DEFEND AND HOLD THE OWNER AND +MAINTAINER FROM AND AGAINST ANY CLAIMS, LOSSES OR DAMAGES ARISING FROM YOUR +USE OF THIS PROJECT OR THE WORKS AVAILABLE THROUGH THIS PROJECT. + +This license is subject to change at any time by the Project Owner or +Maintainer. + +Your continued access to or use of this Project or any works +available through this Project shall be subject to the then-current version +of this license. + +The Project Owner and Maintainer reserve the right to change this license +without needing the consent of the contributors to this Project. diff --git a/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/dao.gno b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/dao.gno new file mode 100644 index 00000000..45c2229f --- /dev/null +++ b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/dao.gno @@ -0,0 +1,417 @@ +package dao + +import ( + "errors" + "std" + "strings" + "time" +) + +// PathSeparator defines the DAO path separator. +const PathSeparator = "/" + +type ( + // Role defines the type for DAO roles. + Role string + + // Roles defines the type for a list of DAO roles. + Roles []Role +) + +// String returns the role as a string. +func (r Role) String() string { + return string(r) +} + +// NewMember creates a new DAO member. +func NewMember(addr std.Address, roles ...Role) Member { + return Member{ + Address: addr, + Roles: roles, + } +} + +// Member defines a DAO member. +type Member struct { + // Address is the member account address. + Address std.Address + + // Roles contains the optional list of roles that the member belongs to. + Roles Roles +} + +// String returns a string representation of the member. +func (m Member) String() string { + if len(m.Roles) == 0 { + return m.Address.String() + } + + var roles []string + for _, r := range m.Roles { + roles = append(roles, string(r)) + } + return m.Address.String() + " " + strings.Join(roles, ", ") +} + +// HasRole checks if the member belongs to a specific role. +func (m Member) HasRole(r Role) bool { + for _, role := range m.Roles { + if role == r { + return true + } + } + return false +} + +// Option configures DAO. +type Option func(*DAO) + +// AssignAsSuperCouncil makes the DAO a super council. +func AssignAsSuperCouncil() Option { + return func(dao *DAO) { + dao.isSuperCouncil = true + } +} + +// WithSubDAO assigns sub DAO to a DAO. +func WithSubDAO(sub *DAO) Option { + return func(dao *DAO) { + sub.parent = dao + dao.children = append(dao.children, sub) + } +} + +// WithMembers assigns members to a DAO. +func WithMembers(members ...Member) Option { + return func(dao *DAO) { + dao.members = members + } +} + +// WithManifest assigns a manifest to a DAO. +// Manifest should describe the purpose of the DAO. +func WithManifest(manifest string) Option { + return func(dao *DAO) { + dao.manifest = manifest + } +} + +// New creates a new DAO. +func New(name, title string, options ...Option) (*DAO, error) { + name = strings.TrimSpace(name) + if name == "" { + return nil, errors.New("DAO name is required") + } + + if !IsSlug(name) { + return nil, errors.New(`DAO name is not valid, only letters from "a" to "z", numbers, "-" and "_" are allowed`) + } + + title = strings.TrimSpace(title) + if title == "" { + return nil, errors.New("DAO title is required") + } + + dao := &DAO{ + name: name, + title: title, + createdAt: time.Now(), + } + + for _, apply := range options { + apply(dao) + } + + return dao, nil +} + +// MustNew creates a new DAO. +// The function panics if any of the arguments is not valid. +func MustNew(name, title string, options ...Option) *DAO { + dao, err := New(name, title, options...) + if err != nil { + panic(err) + } + return dao +} + +// DAO is a decentralized autonomous organization. +type DAO struct { + name string + title string + manifest string + isSuperCouncil bool + isLocked bool + lockReason string + parent *DAO + children []*DAO + members []Member + createdAt time.Time +} + +// Name returns the name of the DAO. +func (dao DAO) Name() string { + return dao.name +} + +// Title returns the title of the DAO. +func (dao DAO) Title() string { + return dao.title +} + +// Manifest returns the manifest of the DAO. +func (dao DAO) Manifest() string { + return dao.manifest +} + +// SetManifest sets the manifest of the DAO. +func (dao *DAO) SetManifest(s string) { + dao.manifest = s +} + +// CreatedAt returns the creation time of the DAO. +func (dao DAO) CreatedAt() time.Time { + return dao.createdAt +} + +// Parent returns the parent DAO of the sub DAO. +// The result is nil for the DAO at the root of the DAO tree. +func (dao DAO) Parent() *DAO { + return dao.parent +} + +// Path returns the path of the DAO. +func (dao DAO) Path() string { + if dao.parent == nil { + return dao.name + } + return dao.parent.Path() + PathSeparator + dao.name +} + +// SubDAOs returns the first level sub DAOs. +func (dao DAO) SubDAOs() []*DAO { // TODO: Use Children() instead? Find a better name. + return dao.children +} + +// GetFirstSubDAO returns the first sub DAO. +func (dao DAO) GetFirstSubDAO() *DAO { + if len(dao.children) > 0 { + return dao.children[0] + } + return nil +} + +// CollectSubDAOs collects all sub DAOs. +func (dao DAO) CollectSubDAOs() []*DAO { + res := append([]*DAO{}, dao.children...) + for _, c := range dao.children { + res = append(res, c.CollectSubDAOs()...) + } + return res +} + +// Members returns the members of the DAOs. +func (dao DAO) Members() []Member { + return dao.members +} + +// LockReason returns a string with the reason the DAO is locked. +func (dao DAO) LockReason() string { + return dao.lockReason +} + +// IsSuperCouncil checks if the DAO is a super council. +func (dao DAO) IsSuperCouncil() bool { + return dao.isSuperCouncil +} + +// IsLocked checks if the DAO is locked. +func (dao DAO) IsLocked() bool { + return dao.isLocked +} + +// Lock locks the DAO. +func (dao *DAO) Lock(reason string) { + dao.lockReason = reason + dao.isLocked = true +} + +// HasParent checks if a DAO is a parent of this DAO. +func (dao DAO) HasParent(parent *DAO) bool { + if parent == nil { + return false + } + return strings.HasPrefix(dao.Path(), parent.Path()) +} + +// HasMember checks if a member is part of the DAO. +func (dao DAO) HasMember(addr std.Address) bool { + for _, m := range dao.members { + if m.Address == addr { + return true + } + } + return false +} + +// AddMember adds a member to the DAO. +// Caller must check the member before adding to avoid duplications. +func (dao *DAO) AddMember(m Member) { + dao.members = append(dao.members, m) +} + +// GetMember gets a member of the DAO. +func (dao DAO) GetMember(addr std.Address) (Member, bool) { + for _, m := range dao.members { + if m.Address == addr { + return m, true + } + } + return Member{}, false +} + +// RemoveMember removes a member of the DAO. +func (dao *DAO) RemoveMember(addr std.Address) bool { + for i, m := range dao.members { + if m.Address == addr { + dao.members = append(dao.members[:i], dao.members[i+1:]...) + return true + } + } + return false +} + +// AddSubDAO adds a sub DAO to the DAO. +func (dao *DAO) AddSubDAO(sub *DAO) bool { + if sub == nil { + return false + } + + for _, n := range dao.children { + if n.name == sub.name { + return false + } + } + + sub.parent = dao + dao.children = append(dao.children, sub) + return true +} + +// GetDAO get a DAO by path. +func (dao *DAO) GetDAO(path string) *DAO { + if path == "" { + return nil + } + + if path == dao.name { + return dao + } + + // Make sure that current node is not present at the beginning of the path + path = strings.TrimPrefix(path, dao.name+PathSeparator) + + // Split DAO path in child name and relative sub path + parts := strings.SplitN(path, PathSeparator, 2) + childName := parts[0] + + for _, sub := range dao.children { + if sub.name != childName { + continue + } + + if len(parts) > 1 { + // Traverse node children when a sub node path is available + return sub.GetDAO(parts[1]) + } + return sub + } + + return nil +} + +// RemoveSubDAO removes a sub DAO. +// The sub DAO must be a first level children of the DAO. +func (dao *DAO) RemoveSubDAO(name string) bool { + for i, sub := range dao.children { + if sub.name == name { + dao.children = append(dao.children[:i], dao.children[i+1:]...) + return true + } + } + return false +} + +// IsRoot checks if the DAO is the main DAO. +// The main DAO is the root of the DAO tree. +func (dao DAO) IsRoot() bool { + return dao.parent == nil +} + +// ParseStringToMembers parses a string of member addresses and roles. +// String should have one or more lines where each line should contain an +// address optionally followed by one or more roles. +// Example multi line string: +// +// g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun roleA +// g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl +// g1vh7krmmzfua5xjmkatvmx09z37w34lsvd2mxa5 roleB roleA +// +// Addresses are validated after being parsed. +// Roles must be validated by the caller to make sure the names are valid. +func ParseStringToMembers(s string) ([]Member, error) { + var members []Member + for _, line := range strings.Split(s, "\n") { + line = strings.TrimSpace(line) + if line == "" { + // Skip empty lines + continue + } + + var ( + roles []Role + fields = strings.Fields(line) + addr = std.Address(strings.TrimSpace(fields[0])) + ) + + if !addr.IsValid() { + return nil, errors.New("invalid member address: " + EscapeHTML(addr.String())) + } + + for _, v := range fields[1:] { + roles = appendRole(roles, strings.TrimSpace(v)) + } + + members = append(members, NewMember(addr, roles...)) + } + return members, nil +} + +// MustParseStringToMembers parses a string of member addresses and roles. +// String should have one or more lines where each line should contain an +// address optionally followed by one or more roles. +// Example multi line string: +// +// g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun roleA +// g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl +// g1vh7krmmzfua5xjmkatvmx09z37w34lsvd2mxa5 roleB roleA +// +// Addresses are validated after being parsed. +// Roles must be validated by the caller to make sure the names are valid. +func MustParseStringToMembers(s string) []Member { + members, err := ParseStringToMembers(s) + if err != nil { + panic(err.Error()) + } + return members +} + +// appendRole append a role if it doesn't exists within the list of roles. +func appendRole(roles []Role, name string) []Role { + for _, r := range roles { + if string(r) == name { + return roles + } + } + return append(roles, Role(name)) +} diff --git a/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/dao_test.gno b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/dao_test.gno new file mode 100644 index 00000000..c91dc81b --- /dev/null +++ b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/dao_test.gno @@ -0,0 +1,448 @@ +package dao + +import ( + "std" + "testing" + + "gno.land/p/demo/testutils" + + gnome "gno.land/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao" +) + +func TestMember(t *testing.T) { + cases := []struct { + name string + address std.Address + roles []gnome.Role + output string + }{ + { + name: "without roles", + address: std.Address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"), + output: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5", + }, + { + name: "with one role", + address: std.Address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"), + roles: []gnome.Role{"foo"}, + output: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5 foo", + }, + { + name: "with two roles", + address: std.Address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"), + roles: []gnome.Role{"foo", "bar"}, + output: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5 foo, bar", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + // Act + m := gnome.NewMember(tc.address, tc.roles...) + + // Assert + if got := m.Address; got != tc.address { + t.Fatalf("expected address %s, got: %s", tc.address, got) + } + + for i, r := range m.Roles { + if r != tc.roles[i] { + t.Fatalf("expected role %s, got: %s", tc.roles[i], r) + } + } + + if got := m.String(); got != tc.output { + t.Fatalf("expected member string output '%s', got: '%s'", tc.output, got) + } + }) + } +} + +// TODO: Add test cases to check different DAO options +func TestDAO(t *testing.T) { + // Arrange + name := "test" + title := "Test DAO" + manifest := "This is a test" + addresses := []std.Address{ + testutils.TestAddress("member1"), + testutils.TestAddress("member2"), + } + + // Act + dao := gnome.MustNew(name, title, gnome.WithManifest(manifest), gnome.WithMembers( + gnome.NewMember(addresses[0]), + gnome.NewMember(addresses[1]), + )) + + // Assert + if got := dao.Name(); got != name { + t.Fatalf("expected name: %d, got: %d", name, got) + } + + if got := dao.CreatedAt(); got.IsZero() { + t.Fatalf("expected a valid creation time, got: '%s'", got.String()) + } + + if got := dao.Title(); got != title { + t.Fatalf("expected title: '%s', got: '%s'", title, got) + } + + if got := dao.Manifest(); got != manifest { + t.Fatalf("expected manifest: '%s', got: '%s'", manifest, got) + } + + if got := dao.Parent(); got != nil { + t.Fatalf("expected no parent DAO, got: '%s'", got.Name()) + } + + if c := len(dao.SubDAOs()); c != 0 { + t.Fatalf("expected no sub DAO nodes, got %d node(s)", c) + } + + if dao.IsSuperCouncil() { + t.Fatal("expected DAO not to be a super council") + } + + if c := len(dao.Members()); c != len(addresses) { + t.Fatalf("expected %d DAO members, got %d", len(addresses), c) + } + + for _, addr := range addresses { + if !dao.HasMember(addr) { + t.Fatalf("expected member %s to be a member of DAO", addr) + } + + m, found := dao.GetMember(addr) + if !found { + t.Fatalf("expected member %s to be found", addr) + } + + if m.Address != addr { + t.Fatalf("expected member to have address %s, got: %s", addr, m.Address) + } + } +} + +func TestDAOAddMember(t *testing.T) { + cases := []struct { + name string + member gnome.Member + membersCount int + shouldExist bool + setup func(*gnome.DAO) + }{ + { + name: "ok", + member: newTestMember(t, "member"), + membersCount: 1, + shouldExist: true, + }, + { + name: "existing", + member: newTestMember(t, "member"), + membersCount: 2, + shouldExist: true, + setup: func(dao *gnome.DAO) { + dao.AddMember(newTestMember(t, "member2")) + }, + }, + { + name: "duplicate", + member: newTestMember(t, "member"), + membersCount: 2, + shouldExist: true, + setup: func(dao *gnome.DAO) { + dao.AddMember(newTestMember(t, "member")) + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + // Arrange + dao := gnome.MustNew("test", "Test") + + if tc.setup != nil { + tc.setup(dao) + } + + // Act + dao.AddMember(tc.member) + + // Assert + if got := dao.HasMember(tc.member.Address); got != tc.shouldExist { + t.Fatalf("expected has member call to return %v, got: %v", tc.shouldExist, got) + } + + m, found := dao.GetMember(tc.member.Address) + if found != tc.shouldExist { + t.Fatalf("expected member getter to return %v, got: %v", tc.shouldExist, found) + } + + if tc.shouldExist && m.Address != tc.member.Address { + t.Fatalf("expected added member to have adderss %s, got: %s", tc.member, m) + } + + members := dao.Members() + if c := len(members); c != tc.membersCount { + t.Fatalf("expected %d member(s), got: %d", tc.membersCount, c) + } + + if len(members) > 0 { + m = members[len(members)-1] + if m.Address != tc.member.Address { + t.Fatalf("expected last added member address: %s, got: %s", tc.member.Address, m.Address) + } + } + }) + } +} + +func TestDAORemoveMember(t *testing.T) { + cases := []struct { + name string + member gnome.Member + setup func(*gnome.DAO) + result bool + }{ + { + name: "ok", + member: newTestMember(t, "member"), + result: true, + setup: func(dao *gnome.DAO) { + dao.AddMember(newTestMember(t, "member")) + }, + }, + { + name: "missing", + member: newTestMember(t, "member"), + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + // Arrange + dao := gnome.MustNew("test", "Test") + + if tc.setup != nil { + tc.setup(dao) + } + + // Act + result := dao.RemoveMember(tc.member.Address) + + // Assert + if result != tc.result { + t.Fatalf("expected result to be %v, got: %v", tc.result, result) + } + + if dao.HasMember(tc.member.Address) { + t.Fatal("member shouldn't exist") + } + + if _, found := dao.GetMember(tc.member.Address); found { + t.Fatal("expected member getter to return false") + } + + if c := len(dao.Members()); c != 0 { + t.Fatalf("expected no DAO members, got: %d", c) + } + }) + } +} + +func TestDAOAddSubDAO(t *testing.T) { + cases := []struct { + name, path string + children int + dao, subDAO *gnome.DAO + result bool + setup func(*gnome.DAO) + }{ + { + name: "ok", + dao: gnome.MustNew("main", "Main"), + subDAO: gnome.MustNew("foo", "Foo"), + children: 1, + path: "main/foo", + result: true, + }, + { + name: "with children", + dao: gnome.MustNew( + "main", + "Main", + gnome.WithSubDAO(gnome.MustNew("bar", "Bar")), + ), + subDAO: gnome.MustNew("foo", "Foo"), + children: 2, + path: "main/foo", + result: true, + }, + { + name: "duplicate", + dao: gnome.MustNew( + "main", + "Main", + gnome.WithSubDAO(gnome.MustNew("foo", "Foo")), + ), + subDAO: gnome.MustNew("foo", "Foo"), + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + // Act + result := tc.dao.AddSubDAO(tc.subDAO) + + // Assert + if result != tc.result { + t.Fatalf("expected result to be %v, got: %v", tc.result, result) + } + + if result { + if got := tc.subDAO.Path(); got != tc.path { + t.Fatalf("expected path to be '%s', got: '%s'", tc.path, got) + } + + if c := len(tc.dao.SubDAOs()); c != tc.children { + t.Fatalf("expected %d sub DAO node(s), got %d node(s)", tc.children, c) + } + } + }) + } +} + +func TestDAORemoveSubDAO(t *testing.T) { + cases := []struct { + name, subName string + children int + subDAO *gnome.DAO + result bool + }{ + { + name: "ok", + subDAO: gnome.MustNew( + "main", + "Main", + gnome.WithSubDAO(gnome.MustNew("foo", "Foo")), + ), + subName: "foo", + result: true, + }, + { + name: "with children", + subDAO: gnome.MustNew( + "main", + "Main", + gnome.WithSubDAO(gnome.MustNew("foo", "Foo")), + gnome.WithSubDAO(gnome.MustNew("bar", "Bar")), + ), + subName: "foo", + children: 1, + result: true, + }, + { + name: "missing", + subName: "foo", + subDAO: gnome.MustNew("main", "Main"), + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + // Act + result := tc.subDAO.RemoveSubDAO(tc.subName) + + // Assert + if result != tc.result { + t.Fatalf("expected result to be %v, got: %v", tc.result, result) + } + + if result { + if c := len(tc.subDAO.SubDAOs()); c != tc.children { + t.Fatalf("expected %d sub DAO node(s), got %d node(s)", tc.children, c) + } + } + }) + } +} + +func TestDAOTree(t *testing.T) { + daoA1 := gnome.MustNew("a1", "A1") + daoA2 := gnome.MustNew("a2", "A2") + daoA := gnome.MustNew("a", "A", gnome.WithSubDAO(daoA1), gnome.WithSubDAO(daoA2)) + daoB1 := gnome.MustNew("b1", "B1") + daoB := gnome.MustNew("b", "B", gnome.WithSubDAO(daoB1)) + dao := gnome.MustNew("main", "Main", gnome.WithSubDAO(daoA), gnome.WithSubDAO(daoB)) + + cases := []struct { + name, path string + dao *gnome.DAO + }{ + { + name: "root", + path: "main", + dao: dao, + }, + { + name: "path a", + path: "main/a", + dao: daoA, + }, + { + name: "path a1", + path: "main/a/a1", + dao: daoA1, + }, + { + name: "path a2", + path: "main/a/a2", + dao: daoA2, + }, + { + name: "path b", + path: "main/b", + dao: daoB, + }, + { + name: "path b1", + path: "main/b/b1", + dao: daoB1, + }, + { + name: "invalid", + path: "foo", + }, + { + name: "invalid sub path", + path: "foo/bar", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + // Act + subDAO := dao.GetDAO(tc.path) + + // Assert + if subDAO != tc.dao { + if subDAO == nil { + t.Fatalf("DAO for path '%s' not found", tc.path) + } else { + t.Fatalf("unexpected DAO for path '%s': '%s'", tc.path, subDAO.Name()) + } + } + + if subDAO != nil && subDAO.Path() != tc.path { + t.Fatalf("expected DAO to return path '%s': got '%s'", tc.path, subDAO.Path()) + } + }) + } +} + +func newTestMember(t *testing.T, name string) gnome.Member { + t.Helper() + return gnome.NewMember(testutils.TestAddress(name)) +} diff --git a/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/id.gno b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/id.gno new file mode 100644 index 00000000..7aa766f3 --- /dev/null +++ b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/id.gno @@ -0,0 +1,30 @@ +package dao + +import ( + "encoding/binary" + "strconv" +) + +// ID defines a generic ID type. +type ID uint64 + +// String returns the value of the ID as a string. +func (id ID) String() string { + return strconv.Itoa(int(id)) +} + +// Key returns the binary representation of the ID to be used as key for AVL trees. +func (id ID) Key() string { + buf := make([]byte, 8) + binary.BigEndian.PutUint64(buf, uint64(id)) + return string(buf) +} + +// ConvertKeyToID converts a key to an ID. +// Key is a binary representation of an ID. +func ConvertKeyToID(key string) (ID, bool) { + if len(key) != 8 { + return 0, false + } + return ID(binary.BigEndian.Uint64([]byte(key))), true +} diff --git a/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/marshal.gno b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/marshal.gno new file mode 100644 index 00000000..172e3b73 --- /dev/null +++ b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/marshal.gno @@ -0,0 +1,162 @@ +package dao + +import ( + "strconv" + "time" + + "gno.land/p/demo/avl" + "gno.land/p/demo/json" +) + +// PreMarshaler defines an interface to enable JSON pre marshalling support. +type PreMarshaler interface { + // PreMarshal pre marshals a type into a JSON node. + PreMarshal() *json.Node +} + +// PreMarshalDAO pre-marshalls a DAO and its sub DAOs. +func PreMarshalDAO(key string, dao *DAO) *json.Node { + node := json.ObjectNode(key, nil) + node.AppendObject("name", json.StringNode("name", dao.name)) + node.AppendObject("title", json.StringNode("title", dao.title)) + node.AppendObject("manifest", json.StringNode("manifest", dao.manifest)) + node.AppendObject("isSuperCouncil", json.BoolNode("isSuperCouncil", dao.isSuperCouncil)) + node.AppendObject("isLocked", json.BoolNode("isLocked", dao.isLocked)) + node.AppendObject("lockReason", json.StringNode("lockReason", dao.lockReason)) + node.AppendObject("members", preMarshalMembers("members", dao.members)) + node.AppendObject("createdAt", preMarshalTime("createdAt", dao.createdAt)) + + if dao.parent != nil { + node.AppendObject("parentName", json.StringNode("parentName", dao.parent.name)) + } else { + node.AppendObject("parentName", json.NullNode("parentName")) + } + + var children []*json.Node + for _, c := range dao.children { + children = append(children, PreMarshalDAO("", c)) + } + node.AppendObject("children", json.ArrayNode("children", children)) + + return node +} + +// PreMarshalProposal pre-marshalls a proposal. +func PreMarshalProposal(key string, p *Proposal) *json.Node { + node := json.ObjectNode(key, nil) + node.AppendObject("id", json.StringNode("id", p.id.String())) + node.AppendObject("title", json.StringNode("title", p.title)) + node.AppendObject("description", json.StringNode("description", p.description)) + node.AppendObject("proposer", json.StringNode("proposer", p.proposer.String())) + node.AppendObject("createdAt", preMarshalTime("createdAt", p.createdAt)) + node.AppendObject("votingDeadline", preMarshalTime("votingDeadline", p.votingDeadline)) + node.AppendObject("reviewDeadline", preMarshalTime("reviewDeadline", p.reviewDeadline)) + node.AppendObject("voteChangeDuration", preMarshalDuration("voteChangeDuration", p.voteChangeDuration)) + node.AppendObject("status", json.StringNode("status", strconv.Itoa(int(p.status)))) + node.AppendObject("statusReason", json.StringNode("statusReason", p.statusReason)) + node.AppendObject("strategy", preMarshalStrategy("strategy", p.strategy)) + node.AppendObject("choice", json.StringNode("choice", string(p.choice))) + + var daos []*json.Node + for _, dao := range p.daos { + daos = append(daos, json.StringNode("", dao.name)) + } + node.AppendObject("daos", json.ArrayNode("", daos)) + + var records []*json.Node + for _, r := range p.votingRecords { + records = append(records, preMarshalVotingRecord(r)) + } + node.AppendObject("votingRecords", json.ArrayNode("", records)) + + return node +} + +func preMarshalTime(key string, t time.Time) *json.Node { + if t.IsZero() { + return json.NullNode(key) + } + return json.StringNode(key, t.Format(time.RFC3339)) +} + +func preMarshalDuration(key string, d time.Duration) *json.Node { + return json.StringNode(key, strconv.FormatInt(int64(d), 10)) +} + +func preMarshalMembers(key string, members []Member) *json.Node { + if members == nil { + return json.NullNode(key) + } + + nodes := make([]*json.Node, len(members)) + for i, m := range members { + nodes[i] = json.ObjectNode("", nil) + nodes[i].AppendObject("address", json.StringNode("address", m.Address.String())) + + var roles []*json.Node + for _, r := range m.Roles { + roles = append(roles, json.StringNode("", string(r))) + } + nodes[i].AppendObject("roles", json.ArrayNode("roles", roles)) + } + return json.ArrayNode(key, nodes) +} + +func preMarshalProposalGroups(key string, tree avl.Tree) *json.Node { + node := json.ObjectNode(key, nil) + tree.Iterate("", "", func(k string, value interface{}) bool { + // Save proposal IDs instead of the pre marshalled proposal which is saved inside "proposals" + var proposals []*json.Node + for _, p := range value.([]*Proposal) { + proposals = append(proposals, json.StringNode("", p.id.String())) + } + + daoID, _ := ConvertKeyToID(k) // TODO: Error should not happen, handle it anyways + node.AppendObject(daoID.String(), json.ArrayNode("", proposals)) + return false + }) + return node +} + +func preMarshalStrategy(key string, s ProposalStrategy) *json.Node { + if m, ok := s.(PreMarshaler); ok { + return m.PreMarshal() + } + return json.NullNode(key) +} + +func preMarshalVotingRecord(r *VotingRecord) *json.Node { + node := json.ObjectNode("", nil) + node.AppendObject("votes", preMarshalVotes("votes", r.votes)) + node.AppendObject("counter", preMarshalVoteCounter("counter", r.counter)) + return node +} + +func preMarshalVotes(key string, votes []Vote) *json.Node { + nodes := make([]*json.Node, len(votes)) + for i, v := range votes { + n := json.ObjectNode("", nil) + n.AppendObject("address", json.StringNode("address", v.Address.String())) + n.AppendObject("choice", json.StringNode("choice", string(v.Choice))) + n.AppendObject("reason", json.StringNode("reason", v.Reason)) + n.AppendObject("createdAt", preMarshalTime("createdAt", v.CreatedAt)) + + if v.DAO != nil { + n.AppendObject("daoPath", json.StringNode("daoPath", v.DAO.Path())) + } else { + n.AppendObject("daoPath", json.NullNode("daoPath")) + } + + nodes[i] = n + } + return json.ArrayNode(key, nodes) +} + +func preMarshalVoteCounter(key string, tree avl.Tree) *json.Node { + node := json.ObjectNode(key, nil) + tree.Iterate("", "", func(choice string, value interface{}) bool { + node.AppendObject(choice, json.NumberNode("", float64(value.(uint)))) + return false + }) + return node +} diff --git a/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/pkg_metadata.json b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/pkg_metadata.json new file mode 100644 index 00000000..1305272f --- /dev/null +++ b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/proposal.gno b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/proposal.gno new file mode 100644 index 00000000..2c94d453 --- /dev/null +++ b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/proposal.gno @@ -0,0 +1,596 @@ +package dao + +import ( + "errors" + "std" + "strings" + "time" +) + +const ( + StatusReview ProposalStatus = iota + StatusActive + StatusPassed + StatusRejected + StatusWithdrawed + StatusDismissed + StatusFailed +) + +const ( + // TODO: Add more choices which also should be configurable (use a different type?) + ChoiceNone VoteChoice = "" + ChoiceYes VoteChoice = "yes" + ChoiceNo VoteChoice = "no" +) + +const ( + defaultVoteChangeDuration = time.Hour + executionErrorMsg = "proposal execution error" +) + +var ( + ErrAlreadyVoted = errors.New("member already voted on this proposal") + ErrInvalidReason = errors.New("reason must have at least 5 characters") + ErrInvalidVoteChoice = errors.New("invalid vote choice") + ErrMemberVoteNotAllowed = errors.New("you must be a DAO or parent DAO member to vote") + ErrProposalPromote = errors.New("proposals can only be promoted to a parent DAO") + ErrProposalVotingDeadlineMet = errors.New("proposal voting deadline already met") + ErrProposalNotActive = errors.New("proposal is not active") + ErrProposalNotPassed = errors.New(`proposal status must be "passed"`) + ErrReasonRequired = errors.New("reason is required") + ErrReviewStatusRequired = errors.New(`proposal status must be "review"`) +) + +type ( + // ExecutionError indicates that proposal execution failed. + ExecutionError struct { + // Reason contains the error or error message with the reason of the error. + Reason interface{} + } + + // ProposalIterFn defines the a callback to iterate proposals. + ProposalIterFn func(*Proposal) bool + + // ProposalOption configures proposals. + ProposalOption func(*Proposal) + + // ProposalStatus defines the type for proposal states. + ProposalStatus uint8 + + // VoteChoice defines the type for proposal vote choices. + VoteChoice string + + // Vote contains the information for a member vote. + Vote struct { + // Address is the DAO member address. + Address std.Address + + // Choice is the proposal choice being voted. + Choice VoteChoice + + // Reason contains the reason for the vote. + Reason string + + // DAO contains the DAO that the proposal being voted belongs to. + DAO *DAO + + // CreatedAt contains the time when the vote was submitted. + CreatedAt time.Time + } +) + +// Error returns the execution error message. +func (e ExecutionError) Error() string { + switch v := e.Reason.(type) { + case string: + return executionErrorMsg + ": " + v + case error: + return executionErrorMsg + ": " + v.Error() + default: + return executionErrorMsg + } +} + +// String returns the proposal status name. +func (s ProposalStatus) String() string { + switch s { + case StatusReview: + return "review" + case StatusActive: + return "active" + case StatusPassed: + return "passed" + case StatusRejected: + return "rejected" + case StatusWithdrawed: + return "withdrawed" + case StatusDismissed: + return "dismissed" + case StatusFailed: + return "failed" + default: + return "unknown" + } +} + +// IsFinal checks if the status is a final status. +// When a status is final it can't be changed to a different status. +// Being final means that status signals the final outcome of a proposal. +func (s ProposalStatus) IsFinal() bool { + switch s { + case StatusReview, StatusActive: + return false + default: + return true + } +} + +// IsExecutionError checks if an error is an ExecutionError. +func IsExecutionError(err error) bool { + switch err.(type) { + case ExecutionError: + return true + case *ExecutionError: + return true + default: + return false + } +} + +// WithDescription assigns a description to the proposal. +func WithDescription(s string) ProposalOption { + return func(p *Proposal) { + p.description = s + } +} + +// WithVotingDeadline assigns a voting deadline to the proposal. +func WithVotingDeadline(t time.Time) ProposalOption { + return func(p *Proposal) { + p.votingDeadline = t + } +} + +// WithReviewDeadline assigns a review deadline to the proposal. +// Review status allows proposal withdraw within a time frame after the proposal is created. +// Proposals must be activated when a review deadline is assigned. +func WithReviewDeadline(t time.Time) ProposalOption { + return func(p *Proposal) { + p.reviewDeadline = t + } +} + +// WithVoteChangeDuration change the default grace period to change a submitted vote choice. +func WithVoteChangeDuration(d time.Duration) ProposalOption { + return func(p *Proposal) { + p.voteChangeDuration = d + } +} + +// NewProposal creates a new proposal. +// By default proposals use the standard strategy with a deadline of seven days. +func NewProposal( + id ID, + strategy ProposalStrategy, + proposer std.Address, + dao *DAO, + title string, + options ...ProposalOption, +) (*Proposal, error) { + if dao == nil { + return nil, errors.New("proposal DAO is required") + } + + if strings.TrimSpace(title) == "" { + return nil, errors.New("proposal title is required") + } + + now := time.Now() + p := &Proposal{ + id: id, + proposer: proposer, + title: title, + votingDeadline: now.Add(strategy.VotingPeriod()), + voteChangeDuration: defaultVoteChangeDuration, + strategy: strategy, + daos: []*DAO{dao}, + votingRecords: []*VotingRecord{NewVotingRecord()}, + createdAt: now, + } + + for _, apply := range options { + apply(p) + } + + // Create the proposal as active when a review deadline is not assigned + if p.reviewDeadline.IsZero() { + p.status = StatusActive + } + + return p, nil +} + +// Proposal defines a DAO proposal. +type Proposal struct { + id ID + title string + description string + proposer std.Address + createdAt time.Time + votingDeadline time.Time + reviewDeadline time.Time + voteChangeDuration time.Duration + status ProposalStatus + strategy ProposalStrategy + daos []*DAO + votingRecords []*VotingRecord + choice VoteChoice + statusReason string +} + +// ID returns the proposal ID. +func (p Proposal) ID() ID { + return p.id +} + +// DAO returns the DAO that the proposal is assigned to. +// If proposal has been promoted the returned DAO is the one where proposal has been promoted to. +func (p Proposal) DAO() *DAO { + count := len(p.daos) + if count == 0 { + panic("proposal is not assigned to a DAO") + } + return p.daos[count-1] +} + +// InitialDAO returns the the DAO that was assigned during proposal creation. +func (p Proposal) InitialDAO() *DAO { + if len(p.daos) > 0 { + return p.daos[0] + } + return nil +} + +// Strategy returns the strategy of the proposal. +func (p Proposal) Strategy() ProposalStrategy { + return p.strategy +} + +// Title returns the title of the proposal. +func (p Proposal) Title() string { + return p.title +} + +// Description returns the description of the proposal. +func (p Proposal) Description() string { + return p.description +} + +// StatusReason returns the reason that triggered the current proposal status. +// Reason is relevant for some statuses like dismissed or failed. +func (p Proposal) StatusReason() string { + return p.statusReason +} + +// Proposer returns the address of the member that created the proposal. +func (p Proposal) Proposer() std.Address { + return p.proposer +} + +// Choice returns the winner choice. +func (p Proposal) Choice() VoteChoice { + return p.choice +} + +// CreatedAt returns the creation time of the proposal. +func (p Proposal) CreatedAt() time.Time { + return p.createdAt +} + +// Promotions returns the list of DAOs where the proposal has been promoted. +// The result is nil when the proposal has never been promoted to another DAO. +func (p Proposal) Promotions() []*DAO { + if p.HasBeenPromoted() { + return p.daos + } + return nil +} + +// VotingDeadline returns the voting deadline for the proposal. +// No more votes are allowed after this deadline. +func (p Proposal) VotingDeadline() time.Time { + return p.votingDeadline +} + +// ReviewDeadline returns the deadline for proposal review. +func (p Proposal) ReviewDeadline() time.Time { + return p.reviewDeadline +} + +// VoteChangeDuration returns the duration after voting where users can change the voted choice. +func (p Proposal) VoteChangeDuration() time.Duration { + return p.voteChangeDuration +} + +// Status returns the status of the proposal. +func (p Proposal) Status() ProposalStatus { + return p.status +} + +// Votes returns the proposal votes. +func (p Proposal) Votes() []Vote { + return p.VotingRecord().Votes() +} + +// VotingRecord returns the voting record of the proposal for the current DAO. +// The record contains the number of votes for each voting choice. +func (p Proposal) VotingRecord() *VotingRecord { + count := len(p.votingRecords) + if count == 0 { + panic("proposal is not voting records") + } + return p.votingRecords[count-1] +} + +// VotingRecords returns all voting records of the proposal. +// Each record contains the number of votes for each DAO that the proposal was promoted to. +func (p Proposal) VotingRecords() []*VotingRecord { + return p.votingRecords +} + +// IsExecutable checks if the proposal is executable. +func (p Proposal) IsExecutable() bool { + _, ok := p.strategy.(Executer) + return ok +} + +// IsChoiceAllowed checks if a vote choice is valid for the proposal. +func (p Proposal) IsChoiceAllowed(choice VoteChoice) bool { + for _, c := range p.strategy.VoteChoices() { + if c == choice { + return true + } + } + return false +} + +// HasVotingDeadlinePassed checks if the voting deadline for the proposal has passed. +func (p Proposal) HasVotingDeadlinePassed() bool { + return time.Now().After(p.votingDeadline) +} + +// HasReviewDeadlinePassed checks if the deadline for proposal review has passed. +func (p Proposal) HasReviewDeadlinePassed() bool { + return time.Now().After(p.reviewDeadline) +} + +// HasBeenPromoted checks if the proposal has been promoted to another DAO. +func (p Proposal) HasBeenPromoted() bool { + return len(p.daos) > 1 +} + +// HasPromotion checks if proposal has been promoted to a DAO. +func (p Proposal) HasPromotion(daoPath string) bool { + for _, dao := range p.Promotions() { + if dao.Path() == daoPath { + return true + } + } + return false +} + +// GetVotingRecordByName returns the voting record for a DAO. +func (p Proposal) GetVotingRecordByName(daoPath string) *VotingRecord { + for i, dao := range p.daos { + if dao.Path() == daoPath { + // Voting record index must match the DAO promotions index + return p.votingRecords[i] + } + } + return nil +} + +// Withdraw changes the status of the proposal to withdrawed. +// Proposal must have status "review" to be withdrawed. +func (p *Proposal) Withdraw() error { + if p.status != StatusReview { + return ErrReviewStatusRequired + } + + p.status = StatusWithdrawed + return nil +} + +// Dismiss dismisses a proposal. +func (p *Proposal) Dismiss(reason string) error { + reason = strings.TrimSpace(reason) + if reason == "" { + return ErrReasonRequired + } + + p.statusReason = reason + p.status = StatusDismissed + return nil +} + +// Fail changes the proposal status to failed. +func (p *Proposal) Fail(reason string) error { + reason = strings.TrimSpace(reason) + if reason == "" { + return ErrReasonRequired + } + + p.statusReason = reason + p.status = StatusFailed + return nil +} + +// Activate changes the status of the proposal to active. +// Proposal must have status "review" to be activated. +func (p *Proposal) Activate() error { + if p.status != StatusReview { + return ErrReviewStatusRequired + } + + p.status = StatusActive + return nil +} + +// Promote promotes the proposal to a parent DAO. +// Promoting extends the voting deadline by the voting period defined for the proposal +// strategy and also creates a new voting record for the parent DAO members. +func (p *Proposal) Promote(dao *DAO) error { + if !p.DAO().HasParent(dao) { + return ErrProposalPromote + } + + p.daos = append(p.daos, dao) + p.votingRecords = append(p.votingRecords, NewVotingRecord()) + p.votingDeadline = time.Now().Add(p.strategy.VotingPeriod()) + return nil +} + +// Vote submits a vote for the proposal. +func (p *Proposal) Vote(addr std.Address, choice VoteChoice, reason string) error { + if p.status != StatusActive { + return ErrProposalNotActive + } + + now := time.Now() + if p.votingDeadline.Before(now) { + return ErrProposalVotingDeadlineMet + } + + if !p.IsChoiceAllowed(choice) { + return ErrInvalidVoteChoice + } + + if reason != "" { + reason = strings.TrimSpace(reason) + if len(reason) < 5 { + return ErrInvalidReason + } + } + + // When there is a vote for the account check if it's voting within the + // grace period that allows changing the voted choice. This allows to + // correct mistakes made when seding the vote TX within a small time frame. + // TODO: Add a unit test case to check vote change + record := p.VotingRecord() + for _, v := range record.Votes() { + if v.Address == addr { + if v.CreatedAt.Add(p.voteChangeDuration).Before(now) { + return ErrAlreadyVoted + } + + record.Remove(addr) + } + } + + // Check the vote being submitted if vote check is required + if c, ok := p.strategy.(VoteChecker); ok { + if err := c.CheckVote(addr, choice, reason); err != nil { + return err + } + } + + // Account must be a member of the proposal's DAO or any of its parents to be allowed to vote + var dao *DAO + if p.DAO().HasMember(addr) { + // When the account is member of the proposal's DAO its vote is accounted + // as a vote from this DAO even if its also member of a parent DAO. + dao = p.DAO() + } else { + // Try to find the higher order DAO that the account is member of + dao = findBelongingDAO(addr, p.DAO().Parent()) + } + + if dao == nil { + return ErrMemberVoteNotAllowed + } + + record.Add(Vote{ + Address: addr, + Choice: choice, + Reason: reason, + DAO: dao, + CreatedAt: time.Now(), + }) + + return nil +} + +// Tally counts the number of votes and updates the proposal status accordingly. +// The outcome of counting the votes depends on the proposal strategy. +// This function does NOT check the voting deadline, it's responsibility of the caller to do so. +func (p *Proposal) Tally() error { + if p.status != StatusActive { + return ErrProposalNotActive + } + + // Check if the required quorum is met + record := p.VotingRecord() + percentage := float64(record.VoteCount()) / float64(len(p.DAO().Members())) + if percentage < p.strategy.Quorum() { + p.status = StatusRejected + p.statusReason = "low participation" + return nil + } + + // Tally votes and update proposal with the outcome + choice := p.strategy.Tally(p.DAO(), *record) + + switch choice { + case ChoiceYes: + p.choice = ChoiceYes + p.status = StatusPassed + case ChoiceNo: + p.choice = ChoiceNo + p.status = StatusRejected + default: + p.status = StatusRejected + } + return nil +} + +func (p *Proposal) Validate() error { + if v, ok := p.strategy.(Validator); ok { + if err := v.Validate(p); err != nil { + return err + } + } + return nil +} + +// Execute executes the proposal. +func (p *Proposal) Execute() error { // TODO: Write test for proposal execute + if p.status != StatusPassed { + return ErrProposalNotPassed + } + + if e, ok := p.strategy.(Executer); ok { + if err := p.Validate(); err != nil { + return ExecutionError{err} + } + + if err := e.Execute(p.InitialDAO()); err != nil { + return ExecutionError{err} + } + } + return nil +} + +func findBelongingDAO(addr std.Address, node *DAO) *DAO { + if node == nil { + return nil + } + + // Before checking the current DAO try to find + // if address is a member of a higher order DAO + dao := findBelongingDAO(addr, node.parent) + if dao == nil && node.HasMember(addr) { + return node + } + return nil +} diff --git a/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/proposal_test.gno b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/proposal_test.gno new file mode 100644 index 00000000..30e3df73 --- /dev/null +++ b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/proposal_test.gno @@ -0,0 +1,636 @@ +package dao + +import ( + "errors" + "std" + "testing" + "time" + + "gno.land/p/demo/testutils" + + gnome "gno.land/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao" +) + +var ( + futureTime = time.Now().Add(time.Hour) + zeroTime = time.Time{} +) + +// TODO: Improve proposal unit test using test cases and adding missing methods +func TestProposal(t *testing.T) { + cases := []struct { + name, title, description string + dao *gnome.DAO + err error + }{ + { + name: "ok", + dao: gnome.MustNew("test", "Test"), + title: "Proposal", + description: "Test proposal", + }, + { + name: "empty DAO", + err: errors.New("proposal DAO is required"), + }, + { + name: "empty title", + dao: gnome.MustNew("test", "Test"), + err: errors.New("proposal title is required"), + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + // Arrange + id := gnome.ID(1) + proposer := testutils.TestAddress("proposer") + strategy := testStrategy{} + status := gnome.StatusActive + opts := []gnome.ProposalOption{ + gnome.WithDescription(tc.description), + } + + // Act + proposal, err := gnome.NewProposal(id, strategy, proposer, tc.dao, tc.title, opts...) + + // Assert + if tc.err != nil { + assertError(t, tc.err, err) + return + } + + assertNoError(t, err) + + if got := proposal.ID(); got != id { + t.Fatalf("expected ID: %d, got: %d", id, got) + } + + if got := proposal.DAO(); got.Name() != tc.dao.Name() { + t.Fatalf("expected DAO: '%s', got: '%s'", tc.dao.Name(), got.Name()) + } + + if got := proposal.Title(); got != tc.title { + t.Fatalf("expected title: '%s', got: '%s'", tc.title, got) + } + + if got := proposal.Description(); got != tc.description { + t.Fatalf("expected description: '%s', got: '%s'", tc.description, got) + } + + if got := proposal.StatusReason(); got != "" { + t.Fatalf("expected empty dismiss reason, got: '%s'", got) + } + + if got := proposal.Proposer(); got != proposer { + t.Fatalf("expected proposer: '%s', got: '%s'", proposer, got) + } + + if got := proposal.CreatedAt(); got.IsZero() { + t.Fatalf("expected a valid creation time, got: '%s'", got.String()) + } + + if c := len(proposal.Promotions()); c != 0 { + t.Fatalf("expected an empty list of promotions, got: %d DAOs", c) + } + + if got := proposal.VotingDeadline(); got.IsZero() { + t.Fatalf("expected a valid deadline time, got: '%s'", got.String()) + } + + now := time.Now() + if got := proposal.VotingDeadline(); got.Before(now) { // TODO: Using after makes assertion fail (?) + t.Fatalf("expected deadline to happen after: '%s', got: '%s'", now.String(), got.String()) + } + + if got := proposal.Status(); got != status { + t.Fatalf("expected status: %d, got: %d", status, got) + } + + if got := proposal.Strategy().Name(); got != strategy.Name() { + t.Fatalf("expected strategy: '%s', got: '%s'", strategy.Name(), got) + } + + if got := proposal.Strategy().Name(); got != strategy.Name() { + t.Fatalf("expected strategy: '%s', got: '%s'", strategy.Name(), got) + } + + if c := len(proposal.Votes()); c != 0 { + t.Fatalf("expected no votes, got: %d votes", c) + } + + if c := proposal.VotingRecord().VoteCount(); c != 0 { + t.Fatalf("expected an empty votes record, got: %d records", c) + } + }) + } +} + +func TestProposalWithdraw(t *testing.T) { + // TODO: Test success cases where proposal status is review + wantErr := gnome.ErrReviewStatusRequired + wantStatus := gnome.StatusWithdrawed + proposal := mustCreateProposal(t, testStrategy{}, gnome.WithReviewDeadline(futureTime)) + + if err := proposal.Withdraw(); err != nil { + t.Fatalf("expected no error, got: '%s'", err.Error()) + } + + if err := proposal.Withdraw(); err != wantErr { + t.Fatalf("expected error: '%s', got: '%s'", wantErr.Error(), err.Error()) + } + + if got := proposal.Status(); got != wantStatus { + t.Fatalf("expected status: %d, got: %d", wantStatus, got) + } +} + +func TestProposalDismiss(t *testing.T) { + cases := []struct { + name, reason string + status gnome.ProposalStatus + err error + }{ + { + name: "ok", + reason: "Foo", + status: gnome.StatusDismissed, + }, + { + name: "empty reason", + err: gnome.ErrReasonRequired, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + // Arrange + proposal := mustCreateProposal(t, testStrategy{}) + + // Act + err := proposal.Dismiss(tc.reason) + + // Assert + if tc.err != nil { + assertError(t, tc.err, err) + return + } + + assertNoError(t, err) + + if got := proposal.Status(); got != tc.status { + t.Fatalf("expected status: %s, got: %s", tc.status.String(), got.String()) + } + + if got := proposal.StatusReason(); got != tc.reason { + t.Fatalf("expected dismiss reason: '%s', got: '%s'", tc.reason, got) + } + }) + } +} + +func TestProposalActivate(t *testing.T) { + cases := []struct { + name string + status gnome.ProposalStatus + setup func(*gnome.Proposal) + err error + }{ + { + name: "ok", + status: gnome.StatusActive, + }, + { + name: "review status required", + setup: func(p *gnome.Proposal) { + p.Activate() + }, + err: gnome.ErrReviewStatusRequired, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + // Arrange + proposal := mustCreateProposal(t, testStrategy{}, gnome.WithReviewDeadline(futureTime)) + + if tc.setup != nil { + tc.setup(proposal) + } + + // Act + err := proposal.Activate() + + // Assert + if tc.err != nil { + assertError(t, tc.err, err) + return + } + + assertNoError(t, err) + + if got := proposal.Status(); got != tc.status { + t.Fatalf("expected status: %s, got: %s", tc.status.String(), got.String()) + } + }) + } +} + +func TestProposalPromote(t *testing.T) { + strategy := testStrategy{} + addr := testutils.TestAddress("proposer") + cases := []struct { + name string + daoNames []string + setup func() (*gnome.Proposal, *gnome.DAO) + err error + }{ + { + name: "promote to parent", + daoNames: []string{"child", "parent"}, + setup: func() (*gnome.Proposal, *gnome.DAO) { + child := gnome.MustNew("child", "Child") + parent := gnome.MustNew("parent", "Parent", gnome.WithSubDAO(child)) + p, _ := gnome.NewProposal(1, strategy, addr, child, "Title") + return p, parent + }, + }, + { + name: "promote to root", + daoNames: []string{"child", "root"}, + setup: func() (*gnome.Proposal, *gnome.DAO) { + child := gnome.MustNew("child", "Child") + root := gnome.MustNew("root", "Root", gnome.WithSubDAO( + gnome.MustNew("parent", "Parent", gnome.WithSubDAO(child)), + )) + p, _ := gnome.NewProposal(1, strategy, addr, child, "Title") + return p, root + }, + }, + { + name: "promote to non parent", + setup: func() (*gnome.Proposal, *gnome.DAO) { + child := gnome.MustNew("child", "Child") + gnome.MustNew("parent", "Parent", gnome.WithSubDAO(child)) + p, _ := gnome.NewProposal(1, strategy, addr, child, "Title") + return p, gnome.MustNew("foo", "Foo") + }, + err: gnome.ErrProposalPromote, + }, + { + name: "promote with one promotion", + daoNames: []string{"child", "parent", "root"}, + setup: func() (*gnome.Proposal, *gnome.DAO) { + child := gnome.MustNew("child", "Child") + parent := gnome.MustNew("parent", "Parent", gnome.WithSubDAO(child)) + root := gnome.MustNew("root", "Root", gnome.WithSubDAO(parent)) + p, _ := gnome.NewProposal(1, strategy, addr, child, "Title") + p.Promote(parent) + return p, root + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + // Arrange + p, dao := tc.setup() + + deadline := time.Now().Add(-time.Hour * 24) + p.votingDeadline = deadline // Change deadline to check that its resetted on promote + + p.VotingRecord().Add(gnome.Vote{}) // Add a single dummy vote for the current DAO + + // Act + err := p.Promote(dao) + + // Assert + if tc.err != nil { + assertError(t, tc.err, err) + return + } + + assertNoError(t, err) + + if !p.HasBeenPromoted() { + t.Fatal("expected proposal to be promotedt") + } + + if !p.HasPromotion(dao.Path()) { + t.Fatal("expected proposal promotions to include the DAO") + } + + if got := p.VotingDeadline(); !got.After(deadline) { + t.Fatalf("expected voting deadline to be greater than original deadline: %d, got: %d", deadline.Unix(), got.Unix()) + } + + if p.VotingRecord().VoteCount() != 0 { + t.Fatal("expected the voting record to be empty") + } + + promotions := p.Promotions() + if c := len(promotions); c != len(tc.daoNames) { + t.Fatalf("expected promotions count: %d, got: %d DAOs", len(tc.daoNames), c) + } + + for i, dao := range promotions { + if got := dao.Name(); tc.daoNames[i] != got { + t.Fatalf("expected DAO name: '%s', got: '%s'", tc.daoNames[i], got) + } + } + }) + } +} + +func TestProposalVote(t *testing.T) { + memberAddr := testutils.TestAddress("member") + setupDAOMember := func(p *gnome.Proposal) { + p.DAO().AddMember(gnome.NewMember(memberAddr)) + } + + cases := []struct { + name, reason string + address std.Address + choice gnome.VoteChoice + voteCount int + options []gnome.ProposalOption + setup func(*gnome.Proposal) + err error + }{ + { + name: "ok", + address: memberAddr, + choice: gnome.ChoiceYes, + voteCount: 1, + setup: setupDAOMember, + }, + { + name: "proposal not active", + address: memberAddr, + choice: gnome.ChoiceYes, + options: []gnome.ProposalOption{ + gnome.WithReviewDeadline(futureTime), + }, + err: gnome.ErrProposalNotActive, + setup: func(p *gnome.Proposal) { + setupDAOMember(p) + p.Withdraw() + }, + }, + { + name: "vote with invalid reason", + address: memberAddr, + choice: gnome.ChoiceYes, + reason: "1234", + err: gnome.ErrInvalidReason, + setup: setupDAOMember, + }, + { + name: "already voted", + address: memberAddr, + choice: gnome.ChoiceYes, + voteCount: 1, + options: []gnome.ProposalOption{ + gnome.WithVoteChangeDuration(-1), + }, + err: gnome.ErrAlreadyVoted, + setup: func(p *gnome.Proposal) { + setupDAOMember(p) + p.Vote(memberAddr, gnome.ChoiceYes, "") + }, + }, + { + name: "vote after proposal deadline", + address: memberAddr, + choice: gnome.ChoiceYes, + options: []gnome.ProposalOption{ + gnome.WithVotingDeadline(zeroTime), + }, + err: gnome.ErrProposalVotingDeadlineMet, + setup: setupDAOMember, + }, + { + name: "non member vote not allowed", + address: memberAddr, + choice: gnome.ChoiceYes, + err: gnome.ErrMemberVoteNotAllowed, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + // Arrange + proposal := mustCreateProposal(t, testStrategy{}, tc.options...) + + if tc.setup != nil { + tc.setup(proposal) + } + + // Act + err := proposal.Vote(tc.address, tc.choice, tc.reason) + + // Assert + if tc.err != nil { + assertError(t, tc.err, err) + } else { + assertNoError(t, err) + } + + votes := proposal.Votes() + voteCount := len(votes) + if voteCount != tc.voteCount { + t.Fatalf("expected %d vote(s), got: %d", tc.voteCount, voteCount) + } + + if voteCount > 0 { + if got := votes[0].Address; got != tc.address { + t.Fatalf("expected vote address: '%s', got: '%s'", tc.address, got) + } + + if got := votes[0].Choice; got != tc.choice { + t.Fatalf("expected vote choice: '%s', got: '%s'", tc.choice, got) + } + + if got := votes[0].Reason; got != tc.reason { + t.Fatalf("expected vote reason: '%s', got: '%s'", tc.reason, got) + } + } + }) + } +} + +func TestProposalTally(t *testing.T) { + addresses := [3]std.Address{ + testutils.TestAddress("member1"), + testutils.TestAddress("member2"), + testutils.TestAddress("member3"), + } + setupDAOMembers := func(p *gnome.Proposal) { + dao := p.DAO() + for _, addr := range addresses { + dao.AddMember(gnome.NewMember(addr)) + } + } + + cases := []struct { + name string + votes []gnome.Vote + choice gnome.VoteChoice + strategy gnome.ProposalStrategy + status gnome.ProposalStatus + statusReason string + votingDeadlinePassed bool + options []gnome.ProposalOption + setup func(*gnome.Proposal) + err error + }{ + { + name: "proposal pass", + votes: []gnome.Vote{ + {Address: addresses[0], Choice: gnome.ChoiceYes}, + {Address: addresses[1], Choice: gnome.ChoiceYes}, + }, + choice: gnome.ChoiceYes, + strategy: testStrategy{gnome.ChoiceYes}, + status: gnome.StatusPassed, + options: []gnome.ProposalOption{gnome.WithVotingDeadline(zeroTime)}, + setup: setupDAOMembers, + }, + { + name: "proposal rejected", + votes: []gnome.Vote{ + {Address: addresses[0], Choice: gnome.ChoiceYes}, + {Address: addresses[1], Choice: gnome.ChoiceNo}, + {Address: addresses[2], Choice: gnome.ChoiceNo}, + }, + choice: gnome.ChoiceNo, + strategy: testStrategy{gnome.ChoiceNo}, + status: gnome.StatusRejected, + options: []gnome.ProposalOption{gnome.WithVotingDeadline(zeroTime)}, + setup: setupDAOMembers, + }, + { + name: "no quorum", + votes: []gnome.Vote{ + {Address: addresses[0], Choice: gnome.ChoiceYes}, + }, + strategy: testStrategy{}, + status: gnome.StatusRejected, + statusReason: "low participation", + options: []gnome.ProposalOption{gnome.WithVotingDeadline(zeroTime)}, + setup: setupDAOMembers, + }, + { + name: "proposal not active", + status: gnome.StatusWithdrawed, + options: []gnome.ProposalOption{gnome.WithReviewDeadline(futureTime)}, + strategy: testStrategy{}, + setup: func(p *gnome.Proposal) { + p.Withdraw() + }, + err: gnome.ErrProposalNotActive, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + // Arrange + proposal := mustCreateProposal(t, tc.strategy, tc.options...) + + for _, v := range tc.votes { + // Add votes directly to the record because deadline might be expired for some test cases + proposal.VotingRecord().Add(v) + } + + if tc.setup != nil { + tc.setup(proposal) + } + + // Act + err := proposal.Tally() + + // Assert + if tc.err != nil { + assertError(t, tc.err, err) + } else { + assertNoError(t, err) + } + + if got := proposal.Status(); got != tc.status { + t.Fatalf("expected status: %d, got: %d", tc.status, got) + } + + if got := proposal.StatusReason(); got != tc.statusReason { + t.Fatalf("expected status reason: '%s', got: '%s'", tc.statusReason, got) + } + + if got := proposal.Choice(); got != tc.choice { + t.Fatalf("expected winner choice: '%s', got: '%s'", tc.choice, got) + } + }) + } +} + +func mustCreateProposal(t *testing.T, s gnome.ProposalStrategy, options ...gnome.ProposalOption) *gnome.Proposal { + t.Helper() + + dao := gnome.MustNew("test", "Test") + addr := testutils.TestAddress("proposer") + proposal, err := gnome.NewProposal(1, s, addr, dao, "Title", options...) + if err != nil { + t.Fatal(err) + } + + return proposal +} + +func assertError(t *testing.T, expected interface{}, actual error) { + t.Helper() + + want, ok := expected.(string) + if !ok { + if err, ok := expected.(error); ok { + want = err.Error() + } + } + + if actual == nil { + t.Fatalf("expected error: '%s', got no error", want) + } + + if want != actual.Error() { + t.Fatalf("expected error: '%s', got: '%s'", want, actual.Error()) + } +} + +func assertNoError(t *testing.T, err interface{}) { + t.Helper() + + if err == nil { + return + } + + actual, ok := err.(string) + if !ok { + if e, ok := err.(error); ok { + actual = e.Error() + } + } + + if actual != "" { + t.Fatalf("expected no error, got: '%s'", actual) + } +} + +type testStrategy struct { + Choice gnome.VoteChoice +} + +func (testStrategy) Name() string { return "test" } +func (testStrategy) Quorum() float64 { return 0.51 } +func (testStrategy) VotingPeriod() time.Duration { return time.Hour * 24 * 2 } +func (s testStrategy) Tally(*gnome.DAO, gnome.VotingRecord) gnome.VoteChoice { return s.Choice } + +func (testStrategy) VoteChoices() []gnome.VoteChoice { + return []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo} +} diff --git a/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/record.gno b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/record.gno new file mode 100644 index 00000000..18b572b5 --- /dev/null +++ b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/record.gno @@ -0,0 +1,131 @@ +package dao + +import ( + "std" + + "gno.land/p/demo/avl" +) + +// VotingRecordIterFn defines the a callback to iterate voting choices. +type VotingRecordIterFn func(_ VoteChoice, voteCount uint) bool + +// NewVotingRecord creates a new voting record. +func NewVotingRecord() *VotingRecord { + return &VotingRecord{} +} + +// VotingRecord mamages votes and vote count. +type VotingRecord struct { + votes []Vote + counter avl.Tree // VoteChoice -> count (uint) +} + +// Votes return the list of votes. +func (r VotingRecord) Votes() []Vote { + return r.votes +} + +// VoteCount returns the number of votes. +func (r VotingRecord) VoteCount() int { + return len(r.votes) +} + +// Get returns the number of votes for vote choice. +func (r VotingRecord) Get(c VoteChoice) uint { + key := string(c) + if v, ok := r.counter.Get(key); ok { + return v.(uint) + } + return 0 +} + +// Add adds a vote to the record. +func (r *VotingRecord) Add(v Vote) { + r.votes = append(r.votes, v) + key := string(v.Choice) + r.counter.Set(key, r.Get(v.Choice)+1) +} + +// Remove removes a vote from the record. +func (r *VotingRecord) Remove(addr std.Address) bool { + for i, v := range r.votes { + if v.Address == addr { + r.votes = append(r.votes[:i], r.votes[i+1:]...) + key := string(v.Choice) + r.counter.Set(key, r.Get(v.Choice)-1) + + return true + } + } + return false +} + +// Iterate iterates all vote choices. +func (r VotingRecord) Iterate(fn VotingRecordIterFn) bool { + return r.counter.Iterate("", "", func(key string, value interface{}) bool { + choice := VoteChoice(key) + return fn(choice, value.(uint)) + }) +} + +// SelectChoiceByMajority select the vote choice by majority. +// Vote choice is a majority when chosen by more than half of the votes. +// Majority type is defined by the caller depending on the vote records and abstentions, it would be +// absolute majority if abstentions are considered, otherwise it would be considered simple majority. +func SelectChoiceByMajority(r VotingRecord, abstentions int) (VoteChoice, bool) { + votesCount := r.VoteCount() + abstentions + choice := getMajorityChoice(r) + isMajority := r.Get(choice) > uint(votesCount/2) + return choice, isMajority +} + +// SelectChoiceBySuperMajority select the vote choice by super majority using a 2/3s threshold. +// Abstentions are not considered when calculating the super majority choice. +func SelectChoiceBySuperMajority(r VotingRecord) (VoteChoice, bool) { + choice := getMajorityChoice(r) + isMajority := r.Get(choice) > uint((2*r.VoteCount())/3) // TODO: Allow threshold customization + return choice, isMajority +} + +// SelectChoiceByPlurality selects the vote choice by plurality. +// The choice will be considered a majority if it has votes and if there is no other +// choice with the same number of votes. A tie won't be considered majority. +func SelectChoiceByPlurality(r VotingRecord) (VoteChoice, bool) { + var ( + choice VoteChoice + currentCount uint + isMajority bool + ) + + r.Iterate(func(c VoteChoice, count uint) bool { + if currentCount < count { + choice = c + currentCount = count + isMajority = true + } else if currentCount == count { + isMajority = false + } + return false + }) + return choice, isMajority +} + +// getMajorityChoice returns the choice voted by the majority. +// The result is only valid when there is a majority. +// Caller must validate that the returned choice represents a majority. +func getMajorityChoice(r VotingRecord) VoteChoice { + var ( + choice VoteChoice + currentCount uint + ) + + r.Iterate(func(c VoteChoice, count uint) bool { + if currentCount < count { + choice = c + currentCount = count + } + return false + }) + + return choice +} diff --git a/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/record_test.gno b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/record_test.gno new file mode 100644 index 00000000..28292d58 --- /dev/null +++ b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/record_test.gno @@ -0,0 +1,76 @@ +package dao + +import ( + "testing" + + gnome "gno.land/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao" +) + +func TestVotingRecord(t *testing.T) { + // Act + record := NewVotingRecord() + + // Assert + if got := record.Votes(); got != nil { + t.Fatalf("expected no votes, got: %d", len(got)) + } + + if got := record.VoteCount(); got != 0 { + t.Fatalf("expected no vote count: 0, got: %d", got) + } +} + +func TestVotingRecordAdd(t *testing.T) { + // Arrange + record := NewVotingRecord() + vote := gnome.Vote{Choice: gnome.ChoiceYes} + + // Act + record.Add(vote) + + // Assert + votes := record.Votes() + if c := len(votes); c != 1 { + t.Fatalf("expected one votes, got: %d", c) + } + + if got := votes[0]; got != vote { + t.Fatalf("expected vote: %v, got: %v", vote, got) + } + + if got := record.VoteCount(); got != 1 { + t.Fatalf("expected vote count: %d, got: %d", 1, got) + } + + if got := record.Get(vote.Choice); got != 1 { + t.Fatalf("expected record to get one '%v' count, got: %d", gnome.ChoiceYes, got) + } + + record.Iterate(func(v gnome.VoteChoice, count uint) bool { + if v != gnome.ChoiceYes { + t.Fatalf("expected iterate choice: %v, got: %v", gnome.ChoiceYes, v) + } + + if count != 1 { + t.Fatalf("expected iterate vote count: %d, got: %d", 1, count) + } + + return false + }) +} + +func TestVotingRecordRemove(t *testing.T) { + t.Skip("TODO: Write unit test for VotingRecord.Remove()") +} + +func TestSelectChoiceByMajority(t *testing.T) { + t.Skip("TODO: Write unit test for SelectChoiceByMajority") +} + +func TestSelectChoiceBySuperMajority(t *testing.T) { + t.Skip("TODO: Write unit test for SelectChoiceBySuperMajority") +} + +func TestSelectChoiceByPlurality(t *testing.T) { + t.Skip("TODO: Write unit test for SelectChoiceByPlurality") +} diff --git a/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/render.gno b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/render.gno new file mode 100644 index 00000000..0f40adcc --- /dev/null +++ b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/render.gno @@ -0,0 +1,27 @@ +package dao + +import ( + "strings" + + "gno.land/p/demo/ufmt" +) + +// EscapeHTML escapes special characters like "<" to become "<". +// It escapes only five such characters: <, >, &, ' and ". +func EscapeHTML(s string) string { + s = strings.ReplaceAll(s, `&`, "&") + s = strings.ReplaceAll(s, `"`, """) + s = strings.ReplaceAll(s, `'`, "'") + s = strings.ReplaceAll(s, `<`, "<") + return strings.ReplaceAll(s, `>`, ">") +} + +// NewLink creates a new Markdown link. +func NewLink(text, uri string) string { + return ufmt.Sprintf("[%s](%s)", text, uri) +} + +// NewLinkURI creates a new Markdown link where text and URI are the same. +func NewLinkURI(uri string) string { + return ufmt.Sprintf("[%s](%s)", uri, uri) +} diff --git a/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/strategy.gno b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/strategy.gno new file mode 100644 index 00000000..222f28e3 --- /dev/null +++ b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/strategy.gno @@ -0,0 +1,67 @@ +package dao + +import ( + "std" + "time" +) + +type ( + // VoteChoiceRecord contains the number of counted votes for a single voting choice. + VoteChoiceRecord struct { + Choice VoteChoice + Count uint + } + + // ProposalStrategy defines the interface for the different proposal types. + ProposalStrategy interface { + // Name returns the name of the strategy. + Name() string + + // Quorum returns the minimum required percentage of DAO member votes + // required for a proposal to pass. + Quorum() float64 + + // VotingPeriod returns the period that a proposal should allow voting. + VotingPeriod() time.Duration + + // VoteChoices returns the valid voting choices for the strategy. + VoteChoices() []VoteChoice + + // Tally counts the votes and returns the winner voting choice. + // The DAO argument is the DAO that the proposal is currently assigned to, + // by default the one where the proposal was created. + // Proposals can be promoted to parent DAOs in which case the DAO argument + // is the DAO where the proposal was promoted the last time. + Tally(*DAO, VotingRecord) VoteChoice + } +) + +// VoteChecker defines an interface for proposal vote validation. +// Proposal strategies that require checking votes when they are submitted should implement it. +type VoteChecker interface { + // CheckVote checks that a vote is valid for the strategy. + CheckVote(member std.Address, choice VoteChoice, reason string) error +} + +// Executer defines an interface for executable proposals. +// Proposals strategies that implement the interface can modify the DAO state when proposal passes. +type Executer interface { + // Execute executes the proposal. + // The DAO argument is the DAO where the proposal was created, even if the proposal has been promoted + // to a parent DAO. + // TODO: Execute should return some feedback on success + Execute(*DAO) error +} + +// Validator defines an interface for proposal validation. +// Proposal strategies that implement the interface can validate that a proposal is valid for the current state. +type Validator interface { + // Validate validates if a proposal is valid for the current state. + Validate(*Proposal) error +} + +// ParamsRenderer defines an interface to allow strategies to render its input parameters. +type ParamsRenderer interface { + // RenderParams returns a markdown with the rendered strategy parameters. + RenderParams() string +} diff --git a/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/uri.gno b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/uri.gno new file mode 100644 index 00000000..62760e56 --- /dev/null +++ b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/uri.gno @@ -0,0 +1,33 @@ +package dao + +import ( + "regexp" + "strings" +) + +var reSlug = regexp.MustCompile("^[a-zA-Z]+[a-zA-Z0-9-_]*$") + +// IsSlug checks if a string is a valid slug. +func IsSlug(s string) bool { + return reSlug.MatchString(s) +} + +// SplitRealmURI splits a Gnoland URI into Realm URI and render path. +func SplitRealmURI(uri string) (realmURI, renderPath string) { + if uri == "" { + return + } + + parts := strings.SplitN(uri, ":", 2) + realmURI = parts[0] + if len(parts) > 1 { + renderPath = parts[1] + } + return +} + +// CutRealmDomain cuts out the Gnoland domain prefix from a URI. +func CutRealmDomain(uri string) string { + realmPath, _ := strings.CutPrefix(uri, "gno.land") + return realmPath +} diff --git a/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/uri_test.gno b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/uri_test.gno new file mode 100644 index 00000000..082422a1 --- /dev/null +++ b/portal-loop/extracted/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao/uri_test.gno @@ -0,0 +1,82 @@ +package dao + +import ( + "testing" + + gnome "gno.land/p/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome/dao" +) + +func TestSplitRealmURI(t *testing.T) { + cases := []struct { + name, uri, realmURI, renderPath string + }{ + { + name: "realm URI", + uri: "gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome", + realmURI: "gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome", + }, + { + name: "realm URI with render path", + uri: "gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome:foo/bar", + realmURI: "gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome", + renderPath: "foo/bar", + }, + { + name: "realm URI with render path", + uri: "gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome:foo/bar", + realmURI: "gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome", + renderPath: "foo/bar", + }, + { + name: "empty URI", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + // Act + realmURI, renderPath := gnome.SplitRealmURI(tc.uri) + + // Assert + if realmURI != tc.realmURI { + t.Fatalf("expected realm URI: '%s', got: '%s'", tc.realmURI, realmURI) + } + + if renderPath != tc.renderPath { + t.Fatalf("expected render path: '%s', got: '%s'", tc.renderPath, renderPath) + } + }) + } +} + +func TestCutRealmDomain(t *testing.T) { + cases := []struct { + name, uri, path string + }{ + { + name: "with domain", + uri: "gno.land/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome", + path: "/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome", + }, + { + name: "without domain", + uri: "/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome", + path: "/r/g1lyzcpa7duh69lk04nahxup484xrz4k6k2nqdun/gnome", + }, + { + name: "empty", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + // Act + path := gnome.CutRealmDomain(tc.uri) + + // Assert + if path != tc.path { + t.Fatalf("expected path: '%s', got: '%s'", tc.path, path) + } + }) + } +} diff --git a/portal-loop/extracted/p/gnome/alerts/LICENSE b/portal-loop/extracted/p/gnome/alerts/LICENSE new file mode 100644 index 00000000..1e486ea9 --- /dev/null +++ b/portal-loop/extracted/p/gnome/alerts/LICENSE @@ -0,0 +1,62 @@ +Copyright (c) 2024. All rights reserved. + +Project Owner: +NewTendermint, LLC + +Project Maintainer: +İlker Göktuğ ÖZTÜRK. , + +Your access to this Project and your contributions to this Project are subject +to the following terms: + +* You hereby grant to the listed Owner and Maintainer of this Project the +worldwide, irrevocable and royalty-free right to use, publish, relicense and +sublicense your contributions under any non-exclusive license of their +choosing for commercial and non-commercial purposes. +* You shall not attempt to bring any intellectual property infringement or +misappropriation claims against the Owner or Maintainer of this Project +relating to or arising from your contributions. +* You represent that you are the sole owner of all rights in your +contributions and that no third party has any rights or interests therein. + +FOR THE SCOPE OF THIS LICENSE, A CONTRIBUTION IS DEFINED TO INCLUDE ANY WORKS, +IDEAS, CODE, PROCESSES, OR APIS MADE AVAILABLE TO VIEW BY THE GENERAL PUBLIC +(INCLUDING ANY PUBLICLY ACCESSIBLE INTERNET FORUMS AND CHAT SERVERS WHERE +ACCESS IS AVAILABLE FOR FREE WITH REGISTRATION) OR PRIVATELY TO THIS PROJECT'S +OWNER AND MAINTAINERS; INCLUDING WORKS, IDEAS, CODE, PROCESSES, AND APIS THAT +ARE ABOUT THIS PROJECT AND ITS CONTRIBUTIONS, OR MENTIONED IN REFERENCE TO +THIS PROJECT, WHERE SUCH WORKS, IDEAS, CODE, PROCESSES, AND APIS ARE MATERIAL +TO THE SUCCESS, IMPROVEMENT, OR COMPLETION OF THIS PROJECT, AS DETERMINED BY +THE OWNER OF THIS PROJECT. + +Contributions may come in any form, and include (but are not limited to): + +* pull requests +* diff patches +* commentary +* example code + +If you do not want your contribution to become incorporated into this Project, +do not make contributions to this Project. The creation of contributions that +may in the future become known to this Project's Owner and Maintainer +constitutes a willing contribution to this Project in accordance with this +license. + +THIS PROJECT AND THE WORKS AVAILABLE THROUGH THIS PROJECT ARE PROVIDED “AS IS” +AND WITHOUT WARRANTY OF ANY KIND. IN NO EVENT SHALL THE OWNER OR MAINTAINER OF +THIS PROJECT BE LIABLE TO YOU OR ANY THIRD PARTY FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THIS PROJECT OR THE WORKS AVAILABLE THROUGH +THIS PROJECT. YOU AGREED TO INDEMNIFY, DEFEND AND HOLD THE OWNER AND +MAINTAINER FROM AND AGAINST ANY CLAIMS, LOSSES OR DAMAGES ARISING FROM YOUR +USE OF THIS PROJECT OR THE WORKS AVAILABLE THROUGH THIS PROJECT. + +This license is subject to change at any time by the Project Owner or +Maintainer. + +Your continued access to or use of this Project or any works +available through this Project shall be subject to the then-current version +of this license. + +The Project Owner and Maintainer reserve the right to change this license +without needing the consent of the contributors to this Project. diff --git a/portal-loop/extracted/p/gnome/alerts/alerts.gno b/portal-loop/extracted/p/gnome/alerts/alerts.gno new file mode 100644 index 00000000..e95daa0e --- /dev/null +++ b/portal-loop/extracted/p/gnome/alerts/alerts.gno @@ -0,0 +1,64 @@ +package alerts + +import ( + "gno.land/p/demo/ufmt" +) + +const ( + TypeError Type = "alerts-error" + TypeWarning Type = "alerts-warning" +) + +const ( + StyleError = ` +.alerts-error { + padding: .75rem 1.25rem; + border: 1px solid #f5c6cb; + background-color: #f8d7da; + color: #721c24; + border-radius: .25rem; +} +` + StyleWarning = ` +.alerts-warning { + padding: .75rem 1.25rem; + border: 1px solid #ffeeba; + background-color: #fff3cd; + color: #856404; + border-radius: .25rem; +} +` +) + +// Type defines the type of alerts. +type Type string + +// NewAlert returns HTML for an alert. +func NewAlert(t Type, content string) string { + var css string + switch t { + case TypeWarning: + css = StyleWarning + case TypeError: + css = StyleError + default: + panic("unknown alert type") + } + + return "\n\n" + ufmt.Sprintf(`

%s

`, string(t), content, css) + "\n\n" +} + +// NewWarning returns HTML for a warning alert. +func NewWarning(content string) string { + return NewAlert(TypeWarning, content) +} + +// NewError returns HTML for an error alert. +func NewError(content string) string { + return NewAlert(TypeError, content) +} + +// NewLink returns an HTML link. +func NewLink(href, label string) string { + return ufmt.Sprintf(`%s`, href, label) +} diff --git a/portal-loop/extracted/p/gnome/alerts/pkg_metadata.json b/portal-loop/extracted/p/gnome/alerts/pkg_metadata.json new file mode 100644 index 00000000..9f6c0a85 --- /dev/null +++ b/portal-loop/extracted/p/gnome/alerts/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/p/gnome/blog/LICENSE b/portal-loop/extracted/p/gnome/blog/LICENSE new file mode 100644 index 00000000..1e486ea9 --- /dev/null +++ b/portal-loop/extracted/p/gnome/blog/LICENSE @@ -0,0 +1,62 @@ +Copyright (c) 2024. All rights reserved. + +Project Owner: +NewTendermint, LLC + +Project Maintainer: +İlker Göktuğ ÖZTÜRK. , + +Your access to this Project and your contributions to this Project are subject +to the following terms: + +* You hereby grant to the listed Owner and Maintainer of this Project the +worldwide, irrevocable and royalty-free right to use, publish, relicense and +sublicense your contributions under any non-exclusive license of their +choosing for commercial and non-commercial purposes. +* You shall not attempt to bring any intellectual property infringement or +misappropriation claims against the Owner or Maintainer of this Project +relating to or arising from your contributions. +* You represent that you are the sole owner of all rights in your +contributions and that no third party has any rights or interests therein. + +FOR THE SCOPE OF THIS LICENSE, A CONTRIBUTION IS DEFINED TO INCLUDE ANY WORKS, +IDEAS, CODE, PROCESSES, OR APIS MADE AVAILABLE TO VIEW BY THE GENERAL PUBLIC +(INCLUDING ANY PUBLICLY ACCESSIBLE INTERNET FORUMS AND CHAT SERVERS WHERE +ACCESS IS AVAILABLE FOR FREE WITH REGISTRATION) OR PRIVATELY TO THIS PROJECT'S +OWNER AND MAINTAINERS; INCLUDING WORKS, IDEAS, CODE, PROCESSES, AND APIS THAT +ARE ABOUT THIS PROJECT AND ITS CONTRIBUTIONS, OR MENTIONED IN REFERENCE TO +THIS PROJECT, WHERE SUCH WORKS, IDEAS, CODE, PROCESSES, AND APIS ARE MATERIAL +TO THE SUCCESS, IMPROVEMENT, OR COMPLETION OF THIS PROJECT, AS DETERMINED BY +THE OWNER OF THIS PROJECT. + +Contributions may come in any form, and include (but are not limited to): + +* pull requests +* diff patches +* commentary +* example code + +If you do not want your contribution to become incorporated into this Project, +do not make contributions to this Project. The creation of contributions that +may in the future become known to this Project's Owner and Maintainer +constitutes a willing contribution to this Project in accordance with this +license. + +THIS PROJECT AND THE WORKS AVAILABLE THROUGH THIS PROJECT ARE PROVIDED “AS IS” +AND WITHOUT WARRANTY OF ANY KIND. IN NO EVENT SHALL THE OWNER OR MAINTAINER OF +THIS PROJECT BE LIABLE TO YOU OR ANY THIRD PARTY FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THIS PROJECT OR THE WORKS AVAILABLE THROUGH +THIS PROJECT. YOU AGREED TO INDEMNIFY, DEFEND AND HOLD THE OWNER AND +MAINTAINER FROM AND AGAINST ANY CLAIMS, LOSSES OR DAMAGES ARISING FROM YOUR +USE OF THIS PROJECT OR THE WORKS AVAILABLE THROUGH THIS PROJECT. + +This license is subject to change at any time by the Project Owner or +Maintainer. + +Your continued access to or use of this Project or any works +available through this Project shall be subject to the then-current version +of this license. + +The Project Owner and Maintainer reserve the right to change this license +without needing the consent of the contributors to this Project. diff --git a/portal-loop/extracted/p/gnome/blog/asserts.gno b/portal-loop/extracted/p/gnome/blog/asserts.gno new file mode 100644 index 00000000..3fe2d93a --- /dev/null +++ b/portal-loop/extracted/p/gnome/blog/asserts.gno @@ -0,0 +1,88 @@ +package blog + +import ( + "crypto/sha256" + "encoding/hex" + "net/url" + "regexp" + "strings" +) + +var ( + hostnameRe = regexp.MustCompile(`^(?i)[a-z0-9-]+(\.[a-z0-9-]+)+\.?$`) + sha256Re = regexp.MustCompile(`^[a-f0-9]{64}$`) + slugRe = regexp.MustCompile(`^[a-z0-9\p{L}]+(?:-[a-z0-9\p{L}]+)*$`) +) + +// AssertIsSlug asserts that a URL slug is valid. +func AssertIsSlug(slug string) { + if !IsSlug(slug) { + panic("URL slug is not valid") + } +} + +// AssertContentSha256Hash asserts that a hex hash is a valid SHA256 hash. +func AssertIsSha256Hash(hexHash string) { + if !IsSha256Hash(hexHash) { + panic("invalid sha256 hash") + } +} + +// AssertIsContentURL asserts that a URL is a valid link to a content. +// URL must have a path to ve valid. Website URLs will fail. +func AssertIsContentURL(url string) { + if !IsURL(url, true) { + panic("content URL is not valid, make sure path to content is specified") + } +} + +// AssertTitleIsNotEmpty asserts that a title is not an empty string. +func AssertTitleIsNotEmpty(title string) { + if strings.TrimSpace(title) == "" { + panic("title is empty") + } +} + +// AssertContentSha256Hash asserts that the SHA256 hash of a content matches a hash. +func AssertContentSha256Hash(content, hash string) { + if hash != GetHexSha256Hash(content) { + panic("content sha256 checksum is not valid") + } +} + +// IsSlug checks if a string is a valid URL slug. +func IsSlug(slug string) bool { + return slugRe.MatchString(slug) +} + +// IsSha256Hash checks is a hex hash is a valid SHA256 hash. +func IsSha256Hash(hexHash string) bool { + return sha256Re.MatchString(strings.ToLower(hexHash)) +} + +// IsURL checks if a URL is valid. +// URL path availability can optionally be enforced. +func IsURL(rawURL string, requirePath bool) bool { + u, err := url.ParseRequestURI(rawURL) + if err != nil { + return false + } + + if requirePath && u.Path == "" || u.Path == "/" { + return false + } + + if u.Scheme != "https" && u.Scheme != "http" { + return false + } + + hostname := u.Hostname() + return hostname != "" && hostnameRe.MatchString(hostname) +} + +// GetHexSha256Hash returns the hexadecimal encoding of the string's SHA256 hash. +// An empty string is returned when the argument is an empty string. +func GetHexSha256Hash(s string) string { + sum := sha256.Sum256([]byte(s)) + return hex.EncodeToString(sum[:]) +} diff --git a/portal-loop/extracted/p/gnome/blog/asserts_test.gno b/portal-loop/extracted/p/gnome/blog/asserts_test.gno new file mode 100644 index 00000000..adde4069 --- /dev/null +++ b/portal-loop/extracted/p/gnome/blog/asserts_test.gno @@ -0,0 +1,191 @@ +package blog + +import ( + "testing" + + "gno.land/p/gnome/blog" +) + +func TestIsSlug(t *testing.T) { + cases := []struct { + name, slug string + want bool + }{ + { + name: "empty", + want: false, + }, + { + name: "one letter", + slug: "a", + want: true, + }, + { + name: "one unicode letter", + slug: "á", + want: true, + }, + { + name: "one word", + slug: "foo", + want: true, + }, + { + name: "one unicode word", + slug: "fóo", + want: true, + }, + { + name: "many words", + slug: "foo-bar-baz", + want: true, + }, + { + name: "many unicode words", + slug: "fóo-bár-báz", + want: true, + }, + { + name: "with spaces", + slug: "foo bar", + want: false, + }, + { + name: "with invalid chars", + slug: "foo/bar", + want: false, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + // Act + got := blog.IsSlug(tc.slug) + + // Assert + if got != tc.want { + t.Fatalf("expected slug check to return: %v", tc.want) + } + }) + } +} + +func TestIsSha256Hash(t *testing.T) { + cases := []struct { + name, hash string + want bool + }{ + { + name: "empty", + want: false, + }, + { + name: "ok", + hash: "1a66cf828aea323fc58c653b0bc0d64061bb5c198e500a541a2c97f4f45b668d", + want: true, + }, + { + name: "invalid size", + hash: "1a66cf828aea323", + want: false, + }, + { + name: "invalid characters", + hash: "1a66#?", + want: false, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + // Act + got := blog.IsSha256Hash(tc.hash) + + // Assert + if got != tc.want { + t.Fatalf("expected sha256 check check to return: %v", tc.want) + } + }) + } +} + +func TestIsURL(t *testing.T) { + cases := []struct { + url string + want bool + }{ + {url: "https", want: false}, + {url: "https/a", want: false}, + {url: "https/a/b", want: false}, + {url: "https/a/b/", want: false}, + {url: "https:", want: false}, + {url: "https:www.test.com", want: false}, + {url: "https:www.test.com/", want: false}, + {url: "https:www.test.com/a", want: false}, + {url: "https:www.test.com/a/b", want: false}, + {url: "https:www.test.com/a/b/", want: false}, + {url: "https:www.test.com:42/a/b/", want: false}, + {url: "https:/", want: false}, + {url: "https:/a", want: false}, + {url: "https:/a/b", want: false}, + {url: "https:/a/b/", want: false}, + {url: "https:/www.test.com/a/b", want: false}, + {url: "https://", want: false}, + {url: "https://a", want: false}, + {url: "https://a/b", want: false}, + {url: "https://a/b/", want: false}, + {url: "https://www.test.com", want: false}, + {url: "https://www.test.com/", want: false}, + {url: "https://www.test.com/a", want: true}, + {url: "https://www.test.com/a/b", want: true}, + {url: "https://www.test.com/a/b/", want: true}, + {url: "https://www.test.com:42/a/b/", want: true}, + {url: "https://foo.bar.test.com", want: false}, + {url: "https://foo.bar.test.com/", want: false}, + {url: "https://foo.bar.test.com/a", want: true}, + {url: "https://foo.bar.test.com/a/b", want: true}, + {url: "https://foo.bar.test.com/a/b/", want: true}, + {url: "https://foo.bar.test.com/a/b", want: true}, + {url: "https://foo.bar.test.com:42/a/b", want: true}, + } + + for _, tc := range cases { + t.Run(tc.url, func(t *testing.T) { + // Act + got := blog.IsURL(tc.url, true) + + // Assert + if got != tc.want { + t.Fatalf("expected URL check to return: %v", tc.want) + } + }) + } +} + +func TestGetHexSha256Hash(t *testing.T) { + cases := []struct { + name, content, want string + }{ + { + name: "empty", + want: "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + }, + { + name: "ok", + content: "foo", + want: "2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + // Act + got := blog.GetHexSha256Hash(tc.content) + + // Assert + if got != tc.want { + t.Fatalf("expected hash: '%s', got: '%s'", tc.want, got) + } + }) + } +} diff --git a/portal-loop/extracted/p/gnome/blog/blog.gno b/portal-loop/extracted/p/gnome/blog/blog.gno new file mode 100644 index 00000000..9d5e8935 --- /dev/null +++ b/portal-loop/extracted/p/gnome/blog/blog.gno @@ -0,0 +1,63 @@ +package blog + +import ( + "strings" + + "gno.land/p/demo/avl" +) + +type ( + // Blog defines a blog. + Blog struct { + posts avl.Tree // string(slug) -> *Post + + // Title is blog's title. + Title string + + // Description is the blog's description. + Description string + } + + // PostIterFn defines the a callback to iterate blog posts. + PostIterFn func(*Post) bool +) + +// HasPost checks if a post with a URL slug exists. +func (b Blog) HasPost(slug string) bool { + return b.posts.Has(slug) +} + +// GetPost returns a blog's post. +func (b Blog) GetPost(slug string) (_ *Post, found bool) { + if v, found := b.posts.Get(slug); found { + return v.(*Post), true + } + return nil, false +} + +// AddPost adds a new post to the blog. +func (b *Blog) AddPost(p *Post) bool { + slug := strings.TrimSpace(p.Slug) + if slug == "" { + panic("post has an empty slug") + } + + return b.posts.Set(slug, p) +} + +// RemovePost removes a post from the blog. +// The removed post is returned after being removed if it exists. +func (b *Blog) RemovePost(slug string) (_ *Post, removed bool) { + if v, removed := b.posts.Remove(slug); removed { + return v.(*Post), true + } + return nil, false +} + +// IteratePosts iterates all posts by slug. +func (b Blog) IteratePosts(fn PostIterFn) bool { + // TODO: Improve blog post iteration + return b.posts.Iterate("", "", func(_ string, value interface{}) bool { + return fn(value.(*Post)) + }) +} diff --git a/portal-loop/extracted/p/gnome/blog/invar.gno b/portal-loop/extracted/p/gnome/blog/invar.gno new file mode 100644 index 00000000..b6d5b130 --- /dev/null +++ b/portal-loop/extracted/p/gnome/blog/invar.gno @@ -0,0 +1,94 @@ +package blog + +import "time" + +func NewInvarBlog(b *Blog) InvarBlog { + // TODO: Remove blog and post references if Gno implements invar (inmutable) references + return InvarBlog{b} +} + +type InvarBlog struct { + ref *Blog +} + +func (b InvarBlog) Title() string { + return b.ref.Title +} + +func (b InvarBlog) Description() string { + return b.ref.Description +} + +func (b InvarBlog) IteratePosts(fn func(InvarPost) bool) bool { + return b.ref.IteratePosts(func(p *Post) bool { + return fn(NewInvarPost(p)) + }) +} + +func NewInvarPost(p *Post) InvarPost { + return InvarPost{p} +} + +type InvarPost struct { + ref *Post +} + +func (p InvarPost) Slug() string { + return p.ref.Slug +} + +func (p InvarPost) Title() string { + return p.ref.Title +} + +func (p InvarPost) Summary() string { + return p.ref.Summary +} + +func (p InvarPost) Status() PostStatus { + return p.ref.Status +} + +func (p InvarPost) Content() string { + return p.ref.Content +} + +func (p InvarPost) ContentHash() string { + return p.ref.ContentHash +} + +func (p InvarPost) Authors() AddressList { + return p.ref.Authors +} + +func (p InvarPost) Editors() AddressList { + return p.ref.Editors +} + +func (p InvarPost) Contributors() AddressList { + return p.ref.Contributors +} + +func (p InvarPost) Publishers() AddressList { + return p.ref.Publishers +} + +func (p InvarPost) Tags() []string { + return p.ref.Tags +} + +func (p InvarPost) CreatedAt() time.Time { + return p.ref.CreatedAt +} + +func (p InvarPost) UpdatedAt() time.Time { + return p.ref.UpdatedAt +} + +func (p InvarPost) PublishAt() time.Time { + return p.ref.PublishAt +} + +func (p InvarPost) ExpireAt() time.Time { + return p.ref.ExpireAt +} diff --git a/portal-loop/extracted/p/gnome/blog/pkg_metadata.json b/portal-loop/extracted/p/gnome/blog/pkg_metadata.json new file mode 100644 index 00000000..1305272f --- /dev/null +++ b/portal-loop/extracted/p/gnome/blog/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/p/gnome/blog/post.gno b/portal-loop/extracted/p/gnome/blog/post.gno new file mode 100644 index 00000000..bc8a3c20 --- /dev/null +++ b/portal-loop/extracted/p/gnome/blog/post.gno @@ -0,0 +1,160 @@ +package blog + +import ( + "errors" + "std" + "strings" + "time" +) + +const ( + StatusDraft PostStatus = iota + StatusApproved + StatusPublished + StatusRevised + StatusArchived +) + +type ( + // AddressList defines a list of addresses. + AddressList []std.Address + + // PostStatus defines a type for blog post states. + PostStatus uint8 + + // Post defines a blog post. + Post struct { + // Slug contains the URL path slug for the post. + Slug string + + // Title is the post's title. + Title string + + // Summary is the post's summary. + Summary string + + // Status is the current post's state. + Status PostStatus + + // Content contains the post's content. + Content string + + // ContentHash contains the hash of the post's content. + ContentHash string + + // Authors contains the list of post authors. + Authors AddressList + + // Editors contains the list of post editors. + // Each account belongs to an editor that significantly improved the content. + Editors AddressList + + // Contributors contains the list of post contributors. + // Each account belongs to a contributor that submitted small content changes. + Contributors AddressList + + // Publishers contains the accounts that published the content. + Publishers AddressList + + // Tags contains a list of tags for the post. + // These tags can be used to build the blog content taxonomy. + Tags []string + + // CreatedAt is the block time when the post has been created. + CreatedAt time.Time + + // UpdatedAt is the block time when the post has been updated for the last time. + UpdatedAt time.Time + + // PublishAt is the block time when the post should be published. + PublishAt time.Time + + // ExpireAt is the block time when the post should be archived. + ExpireAt time.Time + } +) + +// String returns a comma separated string with the list of addresses. +func (x AddressList) String() string { + var s []string + for _, item := range x { + s = append(s, item.String()) + } + return strings.Join(s, ", ") +} + +// HasAddress checks if an address is part of the address list. +func (x AddressList) HasAddress(addr std.Address) bool { + for _, item := range x { + if item == addr { + return true + } + } + return false +} + +// String returns the post status name. +func (s PostStatus) String() string { + switch s { + case StatusDraft: + return "draft" + case StatusApproved: + return "approved" + case StatusPublished: + return "published" + case StatusRevised: + return "revised" + case StatusArchived: + return "archived" + default: + return "unknown" + } +} + +// IsExpired checks if the expiration date was reached. +func (p Post) IsExpired() bool { + return !p.ExpireAt.IsZero() && p.ExpireAt.Before(time.Now()) +} + +// ParseStringToAddresses parses a string addresses. +// String should have one or more lines where each line should contain an address. +// Addresses are validated after being parsed. +func ParseStringToAddresses(s string) (AddressList, error) { + var addresses AddressList + for _, line := range strings.Split(s, "\n") { + line = strings.TrimSpace(line) + if line == "" { + // Skip empty lines + continue + } + + addr := std.Address(strings.TrimSpace(line)) + if !addr.IsValid() { + return nil, errors.New("invalid address: " + EscapeHTML(addr.String())) + } + + addresses = append(addresses, addr) + } + return addresses, nil +} + +// MustParseStringToAddresses parses a string addresses. +// String should have one or more lines where each line should contain an address. +// Addresses are validated after being parsed. +func MustParseStringToAddresses(s string) AddressList { + addresses, err := ParseStringToAddresses(s) + if err != nil { + panic(err.Error()) + } + return addresses +} + +// EscapeHTML escapes special characters like "<" to become "<". +// It escapes only five such characters: <, >, &, ' and ". +func EscapeHTML(s string) string { + s = strings.ReplaceAll(s, `&`, "&") + s = strings.ReplaceAll(s, `"`, """) + s = strings.ReplaceAll(s, `'`, "'") + s = strings.ReplaceAll(s, `<`, "<") + return strings.ReplaceAll(s, `>`, ">") +} diff --git a/portal-loop/extracted/p/gnome/dao/LICENSE b/portal-loop/extracted/p/gnome/dao/LICENSE new file mode 100644 index 00000000..1e486ea9 --- /dev/null +++ b/portal-loop/extracted/p/gnome/dao/LICENSE @@ -0,0 +1,62 @@ +Copyright (c) 2024. All rights reserved. + +Project Owner: +NewTendermint, LLC + +Project Maintainer: +İlker Göktuğ ÖZTÜRK. , + +Your access to this Project and your contributions to this Project are subject +to the following terms: + +* You hereby grant to the listed Owner and Maintainer of this Project the +worldwide, irrevocable and royalty-free right to use, publish, relicense and +sublicense your contributions under any non-exclusive license of their +choosing for commercial and non-commercial purposes. +* You shall not attempt to bring any intellectual property infringement or +misappropriation claims against the Owner or Maintainer of this Project +relating to or arising from your contributions. +* You represent that you are the sole owner of all rights in your +contributions and that no third party has any rights or interests therein. + +FOR THE SCOPE OF THIS LICENSE, A CONTRIBUTION IS DEFINED TO INCLUDE ANY WORKS, +IDEAS, CODE, PROCESSES, OR APIS MADE AVAILABLE TO VIEW BY THE GENERAL PUBLIC +(INCLUDING ANY PUBLICLY ACCESSIBLE INTERNET FORUMS AND CHAT SERVERS WHERE +ACCESS IS AVAILABLE FOR FREE WITH REGISTRATION) OR PRIVATELY TO THIS PROJECT'S +OWNER AND MAINTAINERS; INCLUDING WORKS, IDEAS, CODE, PROCESSES, AND APIS THAT +ARE ABOUT THIS PROJECT AND ITS CONTRIBUTIONS, OR MENTIONED IN REFERENCE TO +THIS PROJECT, WHERE SUCH WORKS, IDEAS, CODE, PROCESSES, AND APIS ARE MATERIAL +TO THE SUCCESS, IMPROVEMENT, OR COMPLETION OF THIS PROJECT, AS DETERMINED BY +THE OWNER OF THIS PROJECT. + +Contributions may come in any form, and include (but are not limited to): + +* pull requests +* diff patches +* commentary +* example code + +If you do not want your contribution to become incorporated into this Project, +do not make contributions to this Project. The creation of contributions that +may in the future become known to this Project's Owner and Maintainer +constitutes a willing contribution to this Project in accordance with this +license. + +THIS PROJECT AND THE WORKS AVAILABLE THROUGH THIS PROJECT ARE PROVIDED “AS IS” +AND WITHOUT WARRANTY OF ANY KIND. IN NO EVENT SHALL THE OWNER OR MAINTAINER OF +THIS PROJECT BE LIABLE TO YOU OR ANY THIRD PARTY FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THIS PROJECT OR THE WORKS AVAILABLE THROUGH +THIS PROJECT. YOU AGREED TO INDEMNIFY, DEFEND AND HOLD THE OWNER AND +MAINTAINER FROM AND AGAINST ANY CLAIMS, LOSSES OR DAMAGES ARISING FROM YOUR +USE OF THIS PROJECT OR THE WORKS AVAILABLE THROUGH THIS PROJECT. + +This license is subject to change at any time by the Project Owner or +Maintainer. + +Your continued access to or use of this Project or any works +available through this Project shall be subject to the then-current version +of this license. + +The Project Owner and Maintainer reserve the right to change this license +without needing the consent of the contributors to this Project. diff --git a/portal-loop/extracted/p/gnome/dao/dao.gno b/portal-loop/extracted/p/gnome/dao/dao.gno new file mode 100644 index 00000000..45599969 --- /dev/null +++ b/portal-loop/extracted/p/gnome/dao/dao.gno @@ -0,0 +1,400 @@ +package dao + +import ( + "errors" + "std" + "strings" + "time" +) + +// PathSeparator defines the DAO path separator. +const PathSeparator = "/" + +type ( + // Role defines the type for DAO roles. + Role string + + // Roles defines the type for a list of DAO roles. + Roles []Role +) + +// String returns the role as a string. +func (r Role) String() string { + return string(r) +} + +// NewMember creates a new DAO member. +func NewMember(addr std.Address, roles ...Role) Member { + return Member{ + Address: addr, + Roles: roles, + } +} + +// Member defines a DAO member. +type Member struct { + // Address is the member account address. + Address std.Address + + // Roles contains the optional list of roles that the member belongs to. + Roles Roles +} + +// String returns a string representation of the member. +func (m Member) String() string { + if len(m.Roles) == 0 { + return m.Address.String() + } + + var roles []string + for _, r := range m.Roles { + roles = append(roles, string(r)) + } + return m.Address.String() + " " + strings.Join(roles, ", ") +} + +// HasRole checks if the member belongs to a specific role. +func (m Member) HasRole(r Role) bool { + for _, role := range m.Roles { + if role == r { + return true + } + } + return false +} + +// Option configures DAO. +type Option func(*DAO) + +// AssignAsSuperCouncil makes the DAO a super council. +func AssignAsSuperCouncil() Option { + return func(dao *DAO) { + dao.isSuperCouncil = true + } +} + +// WithSubDAO assigns sub DAO to a DAO. +func WithSubDAO(sub *DAO) Option { + return func(dao *DAO) { + sub.parent = dao + dao.children = append(dao.children, sub) + } +} + +// WithMembers assigns members to a DAO. +func WithMembers(members ...Member) Option { + return func(dao *DAO) { + dao.members = members + } +} + +// WithManifest assigns a manifest to a DAO. +// Manifest should describe the purpose of the DAO. +func WithManifest(manifest string) Option { + return func(dao *DAO) { + dao.manifest = manifest + } +} + +// New creates a new DAO. +func New(name, title string, options ...Option) (*DAO, error) { + name = strings.TrimSpace(name) + if name == "" { + return nil, errors.New("DAO name is required") + } + + if !IsSlug(name) { + return nil, errors.New(`DAO name is not valid, only letters from "a" to "z", numbers, "-" and "_" are allowed`) + } + + title = strings.TrimSpace(title) + if title == "" { + return nil, errors.New("DAO title is required") + } + + dao := &DAO{ + name: name, + title: title, + createdAt: time.Now(), + } + + for _, apply := range options { + apply(dao) + } + + return dao, nil +} + +// MustNew creates a new DAO. +// The function panics if any of the arguments is not valid. +func MustNew(name, title string, options ...Option) *DAO { + dao, err := New(name, title, options...) + if err != nil { + panic(err) + } + return dao +} + +// DAO is a decentralized autonomous organization. +type DAO struct { + name string + title string + manifest string + isSuperCouncil bool + isLocked bool + lockReason string + parent *DAO + children []*DAO + members []Member + createdAt time.Time +} + +// Name returns the name of the DAO. +func (dao DAO) Name() string { + return dao.name +} + +// Title returns the title of the DAO. +func (dao DAO) Title() string { + return dao.title +} + +// Manifest returns the manifest of the DAO. +func (dao DAO) Manifest() string { + return dao.manifest +} + +// SetManifest sets the manifest of the DAO. +func (dao *DAO) SetManifest(s string) { + dao.manifest = s +} + +// CreatedAt returns the creation time of the DAO. +func (dao DAO) CreatedAt() time.Time { + return dao.createdAt +} + +// Parent returns the parent DAO of the sub DAO. +// The result is nil for the DAO at the root of the DAO tree. +func (dao DAO) Parent() *DAO { + return dao.parent +} + +// Path returns the path of the DAO. +func (dao DAO) Path() string { + if dao.parent == nil { + return dao.name + } + return dao.parent.Path() + PathSeparator + dao.name +} + +// SubDAOs returns the first level sub DAOs. +func (dao DAO) SubDAOs() []*DAO { + return dao.children +} + +// Members returns the members of the DAOs. +func (dao DAO) Members() []Member { + return dao.members +} + +// LockReason returns a string with the reason the DAO is locked. +func (dao DAO) LockReason() string { + return dao.lockReason +} + +// IsSuperCouncil checks if the DAO is a super council. +func (dao DAO) IsSuperCouncil() bool { + return dao.isSuperCouncil +} + +// IsLocked checks if the DAO is locked. +func (dao DAO) IsLocked() bool { + return dao.isLocked +} + +// Lock locks the DAO. +func (dao *DAO) Lock(reason string) { + dao.lockReason = reason + dao.isLocked = true +} + +// HasParent checks if a DAO is a parent of this DAO. +func (dao DAO) HasParent(parent *DAO) bool { + if parent == nil { + return false + } + return strings.HasPrefix(dao.Path(), parent.Path()) +} + +// HasMember checks if a member is part of the DAO. +func (dao DAO) HasMember(addr std.Address) bool { + for _, m := range dao.members { + if m.Address == addr { + return true + } + } + return false +} + +// AddMember adds a member to the DAO. +// Caller must check the member before adding to avoid duplications. +func (dao *DAO) AddMember(m Member) { + dao.members = append(dao.members, m) +} + +// GetMember gets a member of the DAO. +func (dao DAO) GetMember(addr std.Address) (Member, bool) { + for _, m := range dao.members { + if m.Address == addr { + return m, true + } + } + return Member{}, false +} + +// RemoveMember removes a member of the DAO. +func (dao *DAO) RemoveMember(addr std.Address) bool { + for i, m := range dao.members { + if m.Address == addr { + dao.members = append(dao.members[:i], dao.members[i+1:]...) + return true + } + } + return false +} + +// AddSubDAO adds a sub DAO to the DAO. +func (dao *DAO) AddSubDAO(sub *DAO) bool { + if sub == nil { + return false + } + + for _, n := range dao.children { + if n.name == sub.name { + return false + } + } + + sub.parent = dao + dao.children = append(dao.children, sub) + return true +} + +// GetDAO get a DAO by path. +func (dao *DAO) GetDAO(path string) (_ *DAO, found bool) { + if path == "" { + return nil, false + } + + if path == dao.name { + return dao, true + } + + // Make sure that current node is not present at the beginning of the path + path = strings.TrimPrefix(path, dao.name+PathSeparator) + + // Split DAO path in child name and relative sub path + parts := strings.SplitN(path, PathSeparator, 2) + childName := parts[0] + + for _, sub := range dao.children { + if sub.name != childName { + continue + } + + if len(parts) > 1 { + // Traverse node children when a sub node path is available + return sub.GetDAO(parts[1]) + } + return sub, true + } + + return nil, false +} + +// RemoveSubDAO removes a sub DAO. +// The sub DAO must be a first level children of the DAO. +func (dao *DAO) RemoveSubDAO(name string) bool { + for i, sub := range dao.children { + if sub.name == name { + dao.children = append(dao.children[:i], dao.children[i+1:]...) + return true + } + } + return false +} + +// IsRoot checks if the DAO is the main DAO. +// The main DAO is the root of the DAO tree. +func (dao DAO) IsRoot() bool { + return dao.parent == nil +} + +// ParseStringToMembers parses a string of member addresses and roles. +// String should have one or more lines where each line should contain an +// address optionally followed by one or more roles. +// Example multi line string: +// +// g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun roleA +// g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl +// g1vh7krmmzfua5xjmkatvmx09z37w34lsvd2mxa5 roleB roleA +// +// Addresses are validated after being parsed. +// Roles must be validated by the caller to make sure the names are valid. +func ParseStringToMembers(s string) ([]Member, error) { + var members []Member + for _, line := range strings.Split(s, "\n") { + line = strings.TrimSpace(line) + if line == "" { + // Skip empty lines + continue + } + + var ( + roles []Role + fields = strings.Fields(line) + addr = std.Address(strings.TrimSpace(fields[0])) + ) + + if !addr.IsValid() { + return nil, errors.New("invalid member address: " + EscapeHTML(addr.String())) + } + + for _, v := range fields[1:] { + roles = appendRole(roles, strings.TrimSpace(v)) + } + + members = append(members, NewMember(addr, roles...)) + } + return members, nil +} + +// MustParseStringToMembers parses a string of member addresses and roles. +// String should have one or more lines where each line should contain an +// address optionally followed by one or more roles. +// Example multi line string: +// +// g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun roleA +// g1e5hud66rs7ye4zgeqmqvwfhurs2mnf408hdqcl +// g1vh7krmmzfua5xjmkatvmx09z37w34lsvd2mxa5 roleB roleA +// +// Addresses are validated after being parsed. +// Roles must be validated by the caller to make sure the names are valid. +func MustParseStringToMembers(s string) []Member { + members, err := ParseStringToMembers(s) + if err != nil { + panic(err.Error()) + } + return members +} + +// appendRole append a role if it doesn't exists within the list of roles. +func appendRole(roles []Role, name string) []Role { + for _, r := range roles { + if string(r) == name { + return roles + } + } + return append(roles, Role(name)) +} diff --git a/portal-loop/extracted/p/gnome/dao/dao_test.gno b/portal-loop/extracted/p/gnome/dao/dao_test.gno new file mode 100644 index 00000000..31a026d4 --- /dev/null +++ b/portal-loop/extracted/p/gnome/dao/dao_test.gno @@ -0,0 +1,448 @@ +package dao + +import ( + "std" + "testing" + + "gno.land/p/demo/testutils" + + gnome "gno.land/p/gnome/dao" +) + +func TestMember(t *testing.T) { + cases := []struct { + name string + address std.Address + roles []gnome.Role + output string + }{ + { + name: "without roles", + address: std.Address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"), + output: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5", + }, + { + name: "with one role", + address: std.Address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"), + roles: []gnome.Role{"foo"}, + output: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5 foo", + }, + { + name: "with two roles", + address: std.Address("g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5"), + roles: []gnome.Role{"foo", "bar"}, + output: "g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5 foo, bar", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + // Act + m := gnome.NewMember(tc.address, tc.roles...) + + // Assert + if got := m.Address; got != tc.address { + t.Fatalf("expected address %s, got: %s", tc.address, got) + } + + for i, r := range m.Roles { + if r != tc.roles[i] { + t.Fatalf("expected role %s, got: %s", tc.roles[i], r) + } + } + + if got := m.String(); got != tc.output { + t.Fatalf("expected member string output '%s', got: '%s'", tc.output, got) + } + }) + } +} + +// TODO: Add test cases to check different DAO options +func TestDAO(t *testing.T) { + // Arrange + name := "test" + title := "Test DAO" + manifest := "This is a test" + addresses := []std.Address{ + testutils.TestAddress("member1"), + testutils.TestAddress("member2"), + } + + // Act + dao := gnome.MustNew(name, title, gnome.WithManifest(manifest), gnome.WithMembers( + gnome.NewMember(addresses[0]), + gnome.NewMember(addresses[1]), + )) + + // Assert + if got := dao.Name(); got != name { + t.Fatalf("expected name: %d, got: %d", name, got) + } + + if got := dao.CreatedAt(); got.IsZero() { + t.Fatalf("expected a valid creation time, got: '%s'", got.String()) + } + + if got := dao.Title(); got != title { + t.Fatalf("expected title: '%s', got: '%s'", title, got) + } + + if got := dao.Manifest(); got != manifest { + t.Fatalf("expected manifest: '%s', got: '%s'", manifest, got) + } + + if got := dao.Parent(); got != nil { + t.Fatalf("expected no parent DAO, got: '%s'", got.Name()) + } + + if c := len(dao.SubDAOs()); c != 0 { + t.Fatalf("expected no sub DAO nodes, got %d node(s)", c) + } + + if dao.IsSuperCouncil() { + t.Fatal("expected DAO not to be a super council") + } + + if c := len(dao.Members()); c != len(addresses) { + t.Fatalf("expected %d DAO members, got %d", len(addresses), c) + } + + for _, addr := range addresses { + if !dao.HasMember(addr) { + t.Fatalf("expected member %s to be a member of DAO", addr) + } + + m, found := dao.GetMember(addr) + if !found { + t.Fatalf("expected member %s to be found", addr) + } + + if m.Address != addr { + t.Fatalf("expected member to have address %s, got: %s", addr, m.Address) + } + } +} + +func TestDAOAddMember(t *testing.T) { + cases := []struct { + name string + member gnome.Member + membersCount int + shouldExist bool + setup func(*gnome.DAO) + }{ + { + name: "ok", + member: newTestMember(t, "member"), + membersCount: 1, + shouldExist: true, + }, + { + name: "existing", + member: newTestMember(t, "member"), + membersCount: 2, + shouldExist: true, + setup: func(dao *gnome.DAO) { + dao.AddMember(newTestMember(t, "member2")) + }, + }, + { + name: "duplicate", + member: newTestMember(t, "member"), + membersCount: 2, + shouldExist: true, + setup: func(dao *gnome.DAO) { + dao.AddMember(newTestMember(t, "member")) + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + // Arrange + dao := gnome.MustNew("test", "Test") + + if tc.setup != nil { + tc.setup(dao) + } + + // Act + dao.AddMember(tc.member) + + // Assert + if got := dao.HasMember(tc.member.Address); got != tc.shouldExist { + t.Fatalf("expected has member call to return %v, got: %v", tc.shouldExist, got) + } + + m, found := dao.GetMember(tc.member.Address) + if found != tc.shouldExist { + t.Fatalf("expected member getter to return %v, got: %v", tc.shouldExist, found) + } + + if tc.shouldExist && m.Address != tc.member.Address { + t.Fatalf("expected added member to have adderss %s, got: %s", tc.member, m) + } + + members := dao.Members() + if c := len(members); c != tc.membersCount { + t.Fatalf("expected %d member(s), got: %d", tc.membersCount, c) + } + + if len(members) > 0 { + m = members[len(members)-1] + if m.Address != tc.member.Address { + t.Fatalf("expected last added member address: %s, got: %s", tc.member.Address, m.Address) + } + } + }) + } +} + +func TestDAORemoveMember(t *testing.T) { + cases := []struct { + name string + member gnome.Member + setup func(*gnome.DAO) + result bool + }{ + { + name: "ok", + member: newTestMember(t, "member"), + result: true, + setup: func(dao *gnome.DAO) { + dao.AddMember(newTestMember(t, "member")) + }, + }, + { + name: "missing", + member: newTestMember(t, "member"), + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + // Arrange + dao := gnome.MustNew("test", "Test") + + if tc.setup != nil { + tc.setup(dao) + } + + // Act + result := dao.RemoveMember(tc.member.Address) + + // Assert + if result != tc.result { + t.Fatalf("expected result to be %v, got: %v", tc.result, result) + } + + if dao.HasMember(tc.member.Address) { + t.Fatal("member shouldn't exist") + } + + if _, found := dao.GetMember(tc.member.Address); found { + t.Fatal("expected member getter to return false") + } + + if c := len(dao.Members()); c != 0 { + t.Fatalf("expected no DAO members, got: %d", c) + } + }) + } +} + +func TestDAOAddSubDAO(t *testing.T) { + cases := []struct { + name, path string + children int + dao, subDAO *gnome.DAO + result bool + setup func(*gnome.DAO) + }{ + { + name: "ok", + dao: gnome.MustNew("main", "Main"), + subDAO: gnome.MustNew("foo", "Foo"), + children: 1, + path: "main/foo", + result: true, + }, + { + name: "with children", + dao: gnome.MustNew( + "main", + "Main", + gnome.WithSubDAO(gnome.MustNew("bar", "Bar")), + ), + subDAO: gnome.MustNew("foo", "Foo"), + children: 2, + path: "main/foo", + result: true, + }, + { + name: "duplicate", + dao: gnome.MustNew( + "main", + "Main", + gnome.WithSubDAO(gnome.MustNew("foo", "Foo")), + ), + subDAO: gnome.MustNew("foo", "Foo"), + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + // Act + result := tc.dao.AddSubDAO(tc.subDAO) + + // Assert + if result != tc.result { + t.Fatalf("expected result to be %v, got: %v", tc.result, result) + } + + if result { + if got := tc.subDAO.Path(); got != tc.path { + t.Fatalf("expected path to be '%s', got: '%s'", tc.path, got) + } + + if c := len(tc.dao.SubDAOs()); c != tc.children { + t.Fatalf("expected %d sub DAO node(s), got %d node(s)", tc.children, c) + } + } + }) + } +} + +func TestDAORemoveSubDAO(t *testing.T) { + cases := []struct { + name, subName string + children int + subDAO *gnome.DAO + result bool + }{ + { + name: "ok", + subDAO: gnome.MustNew( + "main", + "Main", + gnome.WithSubDAO(gnome.MustNew("foo", "Foo")), + ), + subName: "foo", + result: true, + }, + { + name: "with children", + subDAO: gnome.MustNew( + "main", + "Main", + gnome.WithSubDAO(gnome.MustNew("foo", "Foo")), + gnome.WithSubDAO(gnome.MustNew("bar", "Bar")), + ), + subName: "foo", + children: 1, + result: true, + }, + { + name: "missing", + subName: "foo", + subDAO: gnome.MustNew("main", "Main"), + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + // Act + result := tc.subDAO.RemoveSubDAO(tc.subName) + + // Assert + if result != tc.result { + t.Fatalf("expected result to be %v, got: %v", tc.result, result) + } + + if result { + if c := len(tc.subDAO.SubDAOs()); c != tc.children { + t.Fatalf("expected %d sub DAO node(s), got %d node(s)", tc.children, c) + } + } + }) + } +} + +func TestDAOTree(t *testing.T) { + daoA1 := gnome.MustNew("a1", "A1") + daoA2 := gnome.MustNew("a2", "A2") + daoA := gnome.MustNew("a", "A", gnome.WithSubDAO(daoA1), gnome.WithSubDAO(daoA2)) + daoB1 := gnome.MustNew("b1", "B1") + daoB := gnome.MustNew("b", "B", gnome.WithSubDAO(daoB1)) + dao := gnome.MustNew("main", "Main", gnome.WithSubDAO(daoA), gnome.WithSubDAO(daoB)) + + cases := []struct { + name, path string + dao *gnome.DAO + }{ + { + name: "root", + path: "main", + dao: dao, + }, + { + name: "path a", + path: "main/a", + dao: daoA, + }, + { + name: "path a1", + path: "main/a/a1", + dao: daoA1, + }, + { + name: "path a2", + path: "main/a/a2", + dao: daoA2, + }, + { + name: "path b", + path: "main/b", + dao: daoB, + }, + { + name: "path b1", + path: "main/b/b1", + dao: daoB1, + }, + { + name: "invalid", + path: "foo", + }, + { + name: "invalid sub path", + path: "foo/bar", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + // Act + subDAO, found := dao.GetDAO(tc.path) + + // Assert + if subDAO != tc.dao { + if !found { + t.Fatalf("DAO for path '%s' not found", tc.path) + } else { + t.Fatalf("unexpected DAO for path '%s': '%s'", tc.path, subDAO.Name()) + } + } + + if found && subDAO.Path() != tc.path { + t.Fatalf("expected DAO to return path '%s': got '%s'", tc.path, subDAO.Path()) + } + }) + } +} + +func newTestMember(t *testing.T, name string) gnome.Member { + t.Helper() + return gnome.NewMember(testutils.TestAddress(name)) +} diff --git a/portal-loop/extracted/p/gnome/dao/id.gno b/portal-loop/extracted/p/gnome/dao/id.gno new file mode 100644 index 00000000..7aa766f3 --- /dev/null +++ b/portal-loop/extracted/p/gnome/dao/id.gno @@ -0,0 +1,30 @@ +package dao + +import ( + "encoding/binary" + "strconv" +) + +// ID defines a generic ID type. +type ID uint64 + +// String returns the value of the ID as a string. +func (id ID) String() string { + return strconv.Itoa(int(id)) +} + +// Key returns the binary representation of the ID to be used as key for AVL trees. +func (id ID) Key() string { + buf := make([]byte, 8) + binary.BigEndian.PutUint64(buf, uint64(id)) + return string(buf) +} + +// ConvertKeyToID converts a key to an ID. +// Key is a binary representation of an ID. +func ConvertKeyToID(key string) (ID, bool) { + if len(key) != 8 { + return 0, false + } + return ID(binary.BigEndian.Uint64([]byte(key))), true +} diff --git a/portal-loop/extracted/p/gnome/dao/invar.gno b/portal-loop/extracted/p/gnome/dao/invar.gno new file mode 100644 index 00000000..bcdbc68a --- /dev/null +++ b/portal-loop/extracted/p/gnome/dao/invar.gno @@ -0,0 +1,234 @@ +package dao + +import ( + "std" + "time" +) + +func NewInvarProposalStrategy(s ProposalStrategy) InvarProposalStrategy { + return InvarProposalStrategy{s} +} + +type InvarProposalStrategy struct { + ref ProposalStrategy +} + +func (s InvarProposalStrategy) Name() string { + return s.ref.Name() +} + +func (s InvarProposalStrategy) Quorum() float64 { + return s.ref.Quorum() +} + +func (s InvarProposalStrategy) VotingPeriod() time.Duration { + return s.ref.VotingPeriod() +} + +func (s InvarProposalStrategy) VoteChoices() []VoteChoice { + return s.ref.VoteChoices() +} + +func (s InvarProposalStrategy) RenderParams() string { + if r, ok := s.ref.(ParamsRenderer); ok { + return r.RenderParams() + } + return "" +} + +// TODO: Remove invar types if Gno implements invar (inmutable) references +func NewInvarVote(v Vote) InvarVote { + return InvarVote{ + Address: v.Address, + Choice: v.Choice, + Reason: v.Reason, + DAO: NewInvarDAO(v.DAO), + CreatedAt: v.CreatedAt, + } +} + +type InvarVote struct { + Address std.Address + Choice VoteChoice + Reason string + DAO InvarDAO + CreatedAt time.Time +} + +func NewInvarDAO(dao *DAO) InvarDAO { + return InvarDAO{dao} +} + +type InvarDAO struct { + ref *DAO +} + +func (dao InvarDAO) Name() string { + return dao.ref.Name() +} + +func (dao InvarDAO) Title() string { + return dao.ref.Title() +} + +func (dao InvarDAO) Manifest() string { + return dao.ref.Manifest() +} + +func (dao InvarDAO) CreatedAt() time.Time { + return dao.ref.CreatedAt() +} + +func (dao InvarDAO) Parent() (_ InvarDAO, exists bool) { + if p := dao.ref.Parent(); p != nil { + return NewInvarDAO(p), true + } + return InvarDAO{}, false +} + +func (dao InvarDAO) Path() string { + return dao.ref.Path() +} + +func (dao InvarDAO) SubDAOs() (daos []InvarDAO) { + for _, sub := range dao.ref.SubDAOs() { + daos = append(daos, NewInvarDAO(sub)) + } + return +} + +func (dao InvarDAO) Members() []Member { + return dao.ref.Members() +} + +func (dao InvarDAO) LockReason() string { + return dao.ref.LockReason() +} + +func (dao InvarDAO) IsSuperCouncil() bool { + return dao.ref.IsSuperCouncil() +} + +func (dao InvarDAO) IsLocked() bool { + return dao.ref.IsLocked() +} + +func (dao InvarDAO) IsRoot() bool { + return dao.ref.IsRoot() +} + +func NewInvarProposal(p *Proposal) InvarProposal { + return InvarProposal{p} +} + +type InvarProposal struct { + ref *Proposal +} + +func (p InvarProposal) ID() ID { + return p.ref.ID() +} + +func (p InvarProposal) DAO() InvarDAO { + return NewInvarDAO(p.ref.DAO()) +} + +func (p InvarProposal) InitialDAO() InvarDAO { + return NewInvarDAO(p.ref.InitialDAO()) +} + +func (p InvarProposal) Strategy() InvarProposalStrategy { + return NewInvarProposalStrategy(p.ref.Strategy()) +} + +func (p InvarProposal) Title() string { + return p.ref.Title() +} + +func (p InvarProposal) Description() string { + return p.ref.Description() +} + +func (p InvarProposal) StatusReason() string { + return p.ref.StatusReason() +} + +func (p InvarProposal) Proposer() std.Address { + return p.ref.Proposer() +} + +func (p InvarProposal) Choice() VoteChoice { + return p.ref.Choice() +} + +func (p InvarProposal) CreatedAt() time.Time { + return p.ref.CreatedAt() +} + +func (p InvarProposal) Promotions() (daos []InvarDAO) { + for _, dao := range p.ref.Promotions() { + daos = append(daos, NewInvarDAO(dao)) + } + return +} + +func (p InvarProposal) VotingDeadline() time.Time { + return p.ref.VotingDeadline() +} + +func (p InvarProposal) ReviewDeadline() time.Time { + return p.ref.ReviewDeadline() +} + +func (p InvarProposal) VoteChangeDuration() time.Duration { + return p.ref.VoteChangeDuration() +} + +func (p InvarProposal) Status() ProposalStatus { + return p.ref.Status() +} + +func (p InvarProposal) Votes() (votes []InvarVote) { + for _, v := range p.ref.Votes() { + votes = append(votes, NewInvarVote(v)) + } + return +} + +func (p InvarProposal) VotingRecord() InvarVotingRecord { + return NewInvarVotingRecord(p.ref.VotingRecord()) +} + +func (p InvarProposal) VotingRecords() (records []InvarVotingRecord) { + for _, r := range p.ref.VotingRecords() { + records = append(records, NewInvarVotingRecord(r)) + } + return +} + +func NewInvarVotingRecord(r *VotingRecord) InvarVotingRecord { + return InvarVotingRecord{r} +} + +type InvarVotingRecord struct { + ref *VotingRecord +} + +func (r InvarVotingRecord) Votes() (votes []InvarVote) { + for _, v := range r.ref.Votes() { + votes = append(votes, NewInvarVote(v)) + } + return +} + +func (r InvarVotingRecord) VoteCount() int { + return r.ref.VoteCount() +} + +func (r InvarVotingRecord) Get(c VoteChoice) uint { + return r.ref.Get(c) +} + +func (r InvarVotingRecord) Iterate(fn VotingRecordIterFn) bool { + return r.ref.Iterate(fn) +} diff --git a/portal-loop/extracted/p/gnome/dao/paginator.gno b/portal-loop/extracted/p/gnome/dao/paginator.gno new file mode 100644 index 00000000..d7abb204 --- /dev/null +++ b/portal-loop/extracted/p/gnome/dao/paginator.gno @@ -0,0 +1,162 @@ +package dao + +import ( + "math" + "strconv" + "strings" +) + +var ( + defaultPageSize = 50 + minPageSize = 1 + pagePrefix = "page=" +) + +type ( + // PaginatorIterFn defines a callback to iterate page items. + PaginatorIterFn func(index int) (stop bool) + + // PaginatorOption configures the paginator. + PaginatorOption func(*Paginator) +) + +// WithPageSize assigns a page size to a paginator. +// The minimum page size is 5. +func WithPageSize(size int) PaginatorOption { + return func(p *Paginator) { + if size < minPageSize { + p.pageSize = minPageSize + } else { + p.pageSize = size + } + } +} + +// WithItemCount assigns the total number of items that can be paginated. +// Assigning the total item count allows the paginator to determine the last page number. +func WithItemCount(count int) PaginatorOption { + return func(p *Paginator) { + p.itemCount = count + } +} + +// NewPaginator creates a new paginator. +// URI path must contain the page number for the paginator to iterate items. +// Page number is specified in the URI path using "page=N" where N is the page +// number which must start from 1. For example: gno.land/p/gnome:a/b:page=2. +// Paginator is disabled when the URI path doesn't have a page specified or +// when the specified page is not valid. +func NewPaginator(uri string, options ...PaginatorOption) Paginator { + realmURI, renderPath := SplitRealmURI(uri) + p := Paginator{ + realmPath: CutRealmDomain(realmURI), + pageSize: defaultPageSize, + } + + for _, apply := range options { + apply(&p) + } + + p.lastPage = int(math.Ceil(float64(p.itemCount) / float64(p.pageSize))) + + // Iterate path items until paginator arguments are found. + // Path prefix and suffix are kept to be able to generate + // page URLs keeping the render path format. + items := strings.Split(renderPath, ":") + for i, item := range items { + if strings.HasPrefix(item, pagePrefix) { + p.pathSuffix = items[i+1:] + p.page, _ = strconv.Atoi(item[len(pagePrefix):]) + break + } + + p.pathPrefix = append(p.pathPrefix, item) + } + return p +} + +// Paginator allows paging items. +type Paginator struct { + realmPath string + pathPrefix, pathSuffix []string + pageSize, page, lastPage, itemCount int +} + +// Offset returns the index for the first page item. +func (p Paginator) Offset() int { + if !p.IsEnabled() { + return 0 + } + return (p.page - 1) * p.pageSize +} + +// PageSize returns the size of each page. +func (p Paginator) PageSize() int { + return p.pageSize +} + +// Page returns the current page number. +// Zero is returned when the paginator is disabled. +func (p Paginator) Page() int { + return p.page +} + +// LastPage returns the number of the last page. +// Zero is returned when paginator is initialized without the total item count. +func (p Paginator) LastPage() int { + return p.lastPage +} + +// IsEnabled checks if paginator is enabled. +func (p Paginator) IsEnabled() bool { + return p.page > 0 +} + +// IsLastPage checks if the current page is the last one. +func (p Paginator) IsLastPage() bool { + return p.page == p.lastPage +} + +// GetPageURI returns the URI for a page. +// An empty string is returned when page is < 1. +func (p Paginator) GetPageURI(page int) string { + if !p.IsEnabled() { + return "" + } + + renderPath := append(p.pathPrefix, pagePrefix+strconv.Itoa(page)) + renderPath = append(renderPath, p.pathSuffix...) + return p.realmPath + ":" + strings.Join(renderPath, ":") +} + +// PrevPageURI returns the URI path to the previous page. +// An empty string is returned when current page is the first page. +func (p Paginator) PrevPageURI() string { + if p.page == 1 || !p.IsEnabled() { + return "" + } + return p.GetPageURI(p.page - 1) +} + +// NextPageURI returns the URI path to the next page. +func (p Paginator) NextPageURI() string { + if p.IsLastPage() { + return "" + } + return p.GetPageURI(p.page + 1) +} + +// Iterate allows iterating page items. +func (p Paginator) Iterate(fn PaginatorIterFn) bool { + if !p.IsEnabled() { + return true + } + + start := p.Offset() + for i := start; i < start+p.PageSize(); i++ { + if fn(i) { + return true + } + } + return false +} diff --git a/portal-loop/extracted/p/gnome/dao/paginator_test.gno b/portal-loop/extracted/p/gnome/dao/paginator_test.gno new file mode 100644 index 00000000..0e71121a --- /dev/null +++ b/portal-loop/extracted/p/gnome/dao/paginator_test.gno @@ -0,0 +1,139 @@ +package dao + +import ( + "fmt" + "testing" +) + +func TestPaginator(t *testing.T) { + items := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} + cases := []struct { + name, uri, prevPath, nextPath string + offset, pageSize, page, lastPage int + pageItems string + stopped, enabled, isLastPage bool + }{ + { + name: "page 1", + uri: "gno.land/r/gnome:foo/bar:page=1:foo=bar", + enabled: true, + nextPath: "/r/gnome:foo/bar:page=2:foo=bar", + offset: 0, + pageSize: 5, + page: 1, + lastPage: 2, + pageItems: "[1 2 3 4 5]", + }, + { + name: "page 2", + uri: "gno.land/r/gnome:foo/bar:page=2:foo=bar", + enabled: true, + prevPath: "/r/gnome:foo/bar:page=1:foo=bar", + nextPath: "", + offset: 5, + pageSize: 5, + page: 2, + lastPage: 2, + pageItems: "[6 7 8 9 10]", + isLastPage: true, + }, + { + name: "missing page", + uri: "gno.land/r/gnome:foo/bar:page=3:foo=bar", + enabled: true, + prevPath: "/r/gnome:foo/bar:page=2:foo=bar", + nextPath: "/r/gnome:foo/bar:page=4:foo=bar", + offset: 10, + pageSize: 5, + page: 3, + lastPage: 2, + pageItems: "[]", + stopped: true, + }, + { + name: "invalid page number", + uri: "gno.land/r/gnome:foo/bar:page=0:foo=bar", + enabled: false, + prevPath: "", + nextPath: "", + offset: 0, + pageSize: 4, + page: 0, + lastPage: 3, + pageItems: "[]", + stopped: true, + }, + { + name: "invalid page value", + uri: "gno.land/r/gnome:foo/bar:page=foo:foo=bar", + enabled: false, + prevPath: "", + nextPath: "", + offset: 0, + pageSize: 2, + page: 0, + lastPage: 5, + pageItems: "[]", + stopped: true, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + // Arrange + var pageItems []int + + // Act + p := NewPaginator(tc.uri, WithPageSize(tc.pageSize), WithItemCount(len(items))) + + // Assert + if got := p.Page(); got != tc.page { + t.Fatalf("expected page: %d, got: %d", tc.page, got) + } + + if got := p.LastPage(); got != tc.lastPage { + t.Fatalf("expected last page: %d, got: %d", tc.lastPage, got) + } + + if got := p.PrevPageURI(); got != tc.prevPath { + t.Fatalf("expected prev page path: '%s', got: '%s'", tc.prevPath, got) + } + + if got := p.NextPageURI(); got != tc.nextPath { + t.Fatalf("expected next page path: '%s', got: '%s'", tc.nextPath, got) + } + + if got := p.Offset(); got != tc.offset { + t.Fatalf("expected offset: %d, got: %d", tc.offset, got) + } + + if got := p.PageSize(); got != tc.pageSize { + t.Fatalf("expected page size: %d, got: %d", tc.pageSize, got) + } + + if got := p.IsEnabled(); got != tc.enabled { + t.Fatalf("expected enabled: %v, got: %v", tc.enabled, got) + } + + if got := p.IsLastPage(); got != tc.isLastPage { + t.Fatalf("expected is last page to be: %v, got: %v", tc.isLastPage, got) + } + + stopped := p.Iterate(func(i int) bool { + if i >= len(items) { + return true + } + + pageItems = append(pageItems, items[i]) + return false + }) + if stopped != tc.stopped { + t.Fatalf("expected iteration result: %v, got: %v", tc.stopped, stopped) + } + + if got := fmt.Sprintf("%v", pageItems); got != tc.pageItems { + t.Fatalf("expected page items: %s, got: %s", tc.pageItems, got) + } + }) + } +} diff --git a/portal-loop/extracted/p/gnome/dao/params.gno b/portal-loop/extracted/p/gnome/dao/params.gno new file mode 100644 index 00000000..10a8308f --- /dev/null +++ b/portal-loop/extracted/p/gnome/dao/params.gno @@ -0,0 +1,93 @@ +package dao + +import ( + "math" + "time" + + "gno.land/p/demo/avl" + "gno.land/p/demo/ufmt" +) + +type ( + // DurationIterFn defines the a callback to iterate duration values. + DurationIterFn func(name string, _ time.Duration) bool + + // DurationParams contains duration values for different parameters. + DurationParams struct { + params avl.Tree + } +) + +// Set sets or updates a parameter value. +func (p *DurationParams) Set(name string, v time.Duration) bool { + return p.params.Set(name, v) +} + +// Get gets a parameter value. +func (p DurationParams) Get(name string) (_ time.Duration, found bool) { + if v, found := p.params.Get(name); found { + return v.(time.Duration), true + } + return 0, false +} + +// Size returns the number of duration parameters. +func (p DurationParams) Size() int { + return p.params.Size() +} + +// Iterate iterates duration parameter values. +func (p DurationParams) Iterate(fn DurationIterFn) bool { + return p.params.Iterate("", "", func(name string, v interface{}) bool { + return fn(name, v.(time.Duration)) + }) +} + +// HumanizeDuration returns a friendlier text representation of a duration. +func HumanizeDuration(d time.Duration) string { // TODO: Change to use singular/plurals + if d == 0 { + return "" + } + + if sec := d.Seconds(); sec < 60 { + return ufmt.Sprintf("%d seconds", int(sec)) + } + + if m := d.Minutes(); m < 60 { + sec := math.Mod(d.Seconds(), 60) + if sec < 1 { + return ufmt.Sprintf("%d minutes", int(m)) + } + return ufmt.Sprintf("%d minutes %d seconds", int(m), int(sec)) + } + + if hs := d.Hours(); hs < 24 { + m := math.Mod(d.Minutes(), 60) + if m < 1 { + return ufmt.Sprintf("%d hours", int(hs)) + } + + sec := math.Mod(d.Seconds(), 60) + if sec < 1 { + return ufmt.Sprintf("%d hours %d minutes", int(hs), int(m)) + } + return ufmt.Sprintf("%d hours %d minutes %d seconds", int(hs), int(m), int(sec)) + } + + days := d.Hours() / 24 + hs := math.Mod(d.Hours(), 24) + if hs < 1 { + return ufmt.Sprintf("%d days", int(days)) + } + + m := math.Mod(d.Minutes(), 60) + if m < 0 { + return ufmt.Sprintf("%d days %d hours", int(days), int(hs)) + } + + sec := math.Mod(d.Seconds(), 60) + if sec < 1 { + return ufmt.Sprintf("%d days %d hours %d minutes", int(days), int(hs), int(m)) + } + return ufmt.Sprintf("%d days %d hours %d minutes %d seconds", int(days), int(hs), int(m), int(sec)) +} diff --git a/portal-loop/extracted/p/gnome/dao/pkg_metadata.json b/portal-loop/extracted/p/gnome/dao/pkg_metadata.json new file mode 100644 index 00000000..1305272f --- /dev/null +++ b/portal-loop/extracted/p/gnome/dao/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/p/gnome/dao/proposal.gno b/portal-loop/extracted/p/gnome/dao/proposal.gno new file mode 100644 index 00000000..44beed3c --- /dev/null +++ b/portal-loop/extracted/p/gnome/dao/proposal.gno @@ -0,0 +1,597 @@ +package dao + +import ( + "errors" + "std" + "strings" + "time" +) + +const ( + StatusReview ProposalStatus = iota + StatusActive + StatusPassed + StatusRejected + StatusWithdrawed + StatusDismissed + StatusFailed +) + +const ( + // TODO: Add more choices which also should be configurable (use a different type?) + ChoiceNone VoteChoice = "" + ChoiceYes VoteChoice = "yes" + ChoiceNo VoteChoice = "no" +) + +const ( + defaultVoteChangeDuration = time.Hour + executionErrorMsg = "proposal execution error" +) + +var ( + ErrAlreadyVoted = errors.New("member already voted on this proposal") + ErrInvalidReason = errors.New("reason must have at least 5 characters") + ErrInvalidVoteChoice = errors.New("invalid vote choice") + ErrMemberVoteNotAllowed = errors.New("you must be a DAO or parent DAO member to vote") + ErrProposalPromote = errors.New("proposals can only be promoted to a parent DAO") + ErrProposalVotingDeadlineMet = errors.New("proposal voting deadline already met") + ErrProposalNotActive = errors.New("proposal is not active") + ErrProposalNotPassed = errors.New(`proposal status must be "passed"`) + ErrReasonRequired = errors.New("reason is required") + ErrReviewStatusRequired = errors.New(`proposal status must be "review"`) +) + +type ( + // ExecutionError indicates that proposal execution failed. + ExecutionError struct { + // Reason contains the error or error message with the reason of the error. + Reason interface{} + } + + // ProposalIterFn defines the a callback to iterate proposals. + ProposalIterFn func(*Proposal) bool + + // ProposalOption configures proposals. + ProposalOption func(*Proposal) + + // ProposalStatus defines the type for proposal states. + ProposalStatus uint8 + + // VoteChoice defines the type for proposal vote choices. + VoteChoice string + + // Vote contains the information for a member vote. + Vote struct { + // Address is the DAO member address. + Address std.Address + + // Choice is the proposal choice being voted. + Choice VoteChoice + + // Reason contains the reason for the vote. + Reason string + + // DAO contains the DAO that the proposal being voted belongs to. + DAO *DAO + + // CreatedAt contains the time when the vote was submitted. + CreatedAt time.Time + } +) + +// Error returns the execution error message. +func (e ExecutionError) Error() string { + switch v := e.Reason.(type) { + case string: + return executionErrorMsg + ": " + v + case error: + return executionErrorMsg + ": " + v.Error() + default: + return executionErrorMsg + } +} + +// String returns the proposal status name. +func (s ProposalStatus) String() string { + switch s { + case StatusReview: + return "review" + case StatusActive: + return "active" + case StatusPassed: + return "passed" + case StatusRejected: + return "rejected" + case StatusWithdrawed: + return "withdrawed" + case StatusDismissed: + return "dismissed" + case StatusFailed: + return "failed" + default: + return "unknown" + } +} + +// IsFinal checks if the status is a final status. +// When a status is final it can't be changed to a different status. +// Being final means that status signals the final outcome of a proposal. +func (s ProposalStatus) IsFinal() bool { + switch s { + case StatusReview, StatusActive: + return false + default: + return true + } +} + +// IsExecutionError checks if an error is an ExecutionError. +func IsExecutionError(err error) bool { + switch err.(type) { + case ExecutionError: + return true + case *ExecutionError: + return true + default: + return false + } +} + +// WithDescription assigns a description to the proposal. +func WithDescription(s string) ProposalOption { + return func(p *Proposal) { + p.description = s + } +} + +// WithVotingDeadline assigns a voting deadline to the proposal. +func WithVotingDeadline(t time.Time) ProposalOption { + return func(p *Proposal) { + p.votingDeadline = t + } +} + +// WithReviewDeadline assigns a review deadline to the proposal. +// Review status allows proposal withdraw within a time frame after the proposal is created. +// Proposals must be activated when a review deadline is assigned. +func WithReviewDeadline(t time.Time) ProposalOption { + return func(p *Proposal) { + p.reviewDeadline = t + } +} + +// WithVoteChangeDuration change the default grace period to change a submitted vote choice. +func WithVoteChangeDuration(d time.Duration) ProposalOption { + return func(p *Proposal) { + p.voteChangeDuration = d + } +} + +// NewProposal creates a new proposal. +// By default proposals use the standard strategy with a deadline of seven days. +func NewProposal( + id ID, + strategy ProposalStrategy, + proposer std.Address, + dao *DAO, + title string, + options ...ProposalOption, +) (*Proposal, error) { + if dao == nil { + return nil, errors.New("proposal DAO is required") + } + + if strings.TrimSpace(title) == "" { + return nil, errors.New("proposal title is required") + } + + now := time.Now() + p := &Proposal{ + id: id, + proposer: proposer, + title: title, + votingDeadline: now.Add(strategy.VotingPeriod()), + voteChangeDuration: defaultVoteChangeDuration, + strategy: strategy, + daos: []*DAO{dao}, + votingRecords: []*VotingRecord{NewVotingRecord()}, + createdAt: now, + } + + for _, apply := range options { + apply(p) + } + + // Create the proposal as active when a review deadline is not assigned + if p.reviewDeadline.IsZero() { + p.status = StatusActive + } + + return p, nil +} + +// Proposal defines a DAO proposal. +type Proposal struct { + id ID + title string + description string + proposer std.Address + createdAt time.Time + votingDeadline time.Time + reviewDeadline time.Time + voteChangeDuration time.Duration + status ProposalStatus + strategy ProposalStrategy + daos []*DAO + votingRecords []*VotingRecord + choice VoteChoice + statusReason string +} + +// ID returns the proposal ID. +func (p Proposal) ID() ID { + return p.id +} + +// DAO returns the DAO that the proposal is assigned to. +// If proposal has been promoted the returned DAO is the one where proposal has been promoted to. +func (p Proposal) DAO() *DAO { + count := len(p.daos) + if count == 0 { + panic("proposal is not assigned to a DAO") + } + return p.daos[count-1] +} + +// InitialDAO returns the the DAO that was assigned during proposal creation. +func (p Proposal) InitialDAO() *DAO { + if len(p.daos) > 0 { + return p.daos[0] + } + return nil +} + +// Strategy returns the strategy of the proposal. +func (p Proposal) Strategy() ProposalStrategy { + return p.strategy +} + +// Title returns the title of the proposal. +func (p Proposal) Title() string { + return p.title +} + +// Description returns the description of the proposal. +func (p Proposal) Description() string { + return p.description +} + +// StatusReason returns the reason that triggered the current proposal status. +// Reason is relevant for some statuses like dismissed or failed. +func (p Proposal) StatusReason() string { + return p.statusReason +} + +// Proposer returns the address of the member that created the proposal. +func (p Proposal) Proposer() std.Address { + return p.proposer +} + +// Choice returns the winner choice. +func (p Proposal) Choice() VoteChoice { + return p.choice +} + +// CreatedAt returns the creation time of the proposal. +func (p Proposal) CreatedAt() time.Time { + return p.createdAt +} + +// Promotions returns the list of DAOs where the proposal has been promoted. +// The result is nil when the proposal has never been promoted to another DAO. +func (p Proposal) Promotions() []*DAO { + if p.HasBeenPromoted() { + return p.daos + } + return nil +} + +// VotingDeadline returns the voting deadline for the proposal. +// No more votes are allowed after this deadline. +func (p Proposal) VotingDeadline() time.Time { + return p.votingDeadline +} + +// ReviewDeadline returns the deadline for proposal review. +func (p Proposal) ReviewDeadline() time.Time { + return p.reviewDeadline +} + +// VoteChangeDuration returns the duration after voting where users can change the voted choice. +func (p Proposal) VoteChangeDuration() time.Duration { + return p.voteChangeDuration +} + +// Status returns the status of the proposal. +func (p Proposal) Status() ProposalStatus { + return p.status +} + +// Votes returns the proposal votes. +func (p Proposal) Votes() []Vote { + return p.VotingRecord().Votes() +} + +// VotingRecord returns the voting record of the proposal for the current DAO. +// The record contains the number of votes for each voting choice. +func (p Proposal) VotingRecord() *VotingRecord { + count := len(p.votingRecords) + if count == 0 { + panic("proposal has not voting records") + } + return p.votingRecords[count-1] +} + +// VotingRecords returns all voting records of the proposal. +// Each record contains the number of votes for each DAO that the proposal was promoted to. +func (p Proposal) VotingRecords() []*VotingRecord { + return p.votingRecords +} + +// IsExecutable checks if the proposal is executable. +func (p Proposal) IsExecutable() bool { + _, ok := p.strategy.(Executer) + return ok +} + +// IsChoiceAllowed checks if a vote choice is valid for the proposal. +func (p Proposal) IsChoiceAllowed(choice VoteChoice) bool { + for _, c := range p.strategy.VoteChoices() { + if c == choice { + return true + } + } + return false +} + +// HasVotingDeadlinePassed checks if the voting deadline for the proposal has passed. +func (p Proposal) HasVotingDeadlinePassed() bool { + return time.Now().After(p.votingDeadline) +} + +// HasReviewDeadlinePassed checks if the deadline for proposal review has passed. +func (p Proposal) HasReviewDeadlinePassed() bool { + return time.Now().After(p.reviewDeadline) +} + +// HasBeenPromoted checks if the proposal has been promoted to another DAO. +func (p Proposal) HasBeenPromoted() bool { + return len(p.daos) > 1 +} + +// HasPromotion checks if proposal has been promoted to a DAO. +func (p Proposal) HasPromotion(daoPath string) bool { + for _, dao := range p.Promotions() { + if dao.Path() == daoPath { + return true + } + } + return false +} + +// GetVotingRecord returns the voting record of a DAO. +// Proposals can have more than one voting record if they are promoted to parent DAOs. +func (p Proposal) GetVotingRecord(daoPath string) (_ *VotingRecord, found bool) { + for i, dao := range p.daos { + if dao.Path() == daoPath { + // Voting record index must match the DAO promotions index + return p.votingRecords[i], true + } + } + return nil, false +} + +// Withdraw changes the status of the proposal to withdrawed. +// Proposal must have status "review" to be withdrawed. +func (p *Proposal) Withdraw() error { + if p.status != StatusReview { + return ErrReviewStatusRequired + } + + p.status = StatusWithdrawed + return nil +} + +// Dismiss dismisses a proposal. +func (p *Proposal) Dismiss(reason string) error { + reason = strings.TrimSpace(reason) + if reason == "" { + return ErrReasonRequired + } + + p.statusReason = reason + p.status = StatusDismissed + return nil +} + +// Fail changes the proposal status to failed. +func (p *Proposal) Fail(reason string) error { + reason = strings.TrimSpace(reason) + if reason == "" { + return ErrReasonRequired + } + + p.statusReason = reason + p.status = StatusFailed + return nil +} + +// Activate changes the status of the proposal to active. +// Proposal must have status "review" to be activated. +func (p *Proposal) Activate() error { + if p.status != StatusReview { + return ErrReviewStatusRequired + } + + p.status = StatusActive + return nil +} + +// Promote promotes the proposal to a parent DAO. +// Promoting extends the voting deadline by the voting period defined for the proposal +// strategy and also creates a new voting record for the parent DAO members. +func (p *Proposal) Promote(dao *DAO) error { + if !p.DAO().HasParent(dao) { + return ErrProposalPromote + } + + p.daos = append(p.daos, dao) + p.votingRecords = append(p.votingRecords, NewVotingRecord()) + p.votingDeadline = time.Now().Add(p.strategy.VotingPeriod()) + return nil +} + +// Vote submits a vote for the proposal. +func (p *Proposal) Vote(addr std.Address, choice VoteChoice, reason string) error { + if p.status != StatusActive { + return ErrProposalNotActive + } + + now := time.Now() + if p.votingDeadline.Before(now) { + return ErrProposalVotingDeadlineMet + } + + if !p.IsChoiceAllowed(choice) { + return ErrInvalidVoteChoice + } + + if reason != "" { + reason = strings.TrimSpace(reason) + if len(reason) < 5 { + return ErrInvalidReason + } + } + + // When there is a vote for the account check if it's voting within the + // grace period that allows changing the voted choice. This allows to + // correct mistakes made when seding the vote TX within a small time frame. + // TODO: Add a unit test case to check vote change + record := p.VotingRecord() + for _, v := range record.Votes() { + if v.Address == addr { + if v.CreatedAt.Add(p.voteChangeDuration).Before(now) { + return ErrAlreadyVoted + } + + record.Remove(addr) + } + } + + // Check the vote being submitted if vote check is required + if c, ok := p.strategy.(VoteChecker); ok { + if err := c.CheckVote(addr, choice, reason); err != nil { + return err + } + } + + // Account must be a member of the proposal's DAO or any of its parents to be allowed to vote + var dao *DAO + if p.DAO().HasMember(addr) { + // When the account is member of the proposal's DAO its vote is accounted + // as a vote from this DAO even if its also member of a parent DAO. + dao = p.DAO() + } else { + // Try to find the higher order DAO that the account is member of + dao = findBelongingDAO(addr, p.DAO().Parent()) + } + + if dao == nil { + return ErrMemberVoteNotAllowed + } + + record.Add(Vote{ + Address: addr, + Choice: choice, + Reason: reason, + DAO: dao, + CreatedAt: time.Now(), + }) + + return nil +} + +// Tally counts the number of votes and updates the proposal status accordingly. +// The outcome of counting the votes depends on the proposal strategy. +// This function does NOT check the voting deadline, it's responsibility of the caller to do so. +func (p *Proposal) Tally() error { + if p.status != StatusActive { + return ErrProposalNotActive + } + + // Check if the required quorum is met + record := p.VotingRecord() + percentage := float64(record.VoteCount()) / float64(len(p.DAO().Members())) + if percentage < p.strategy.Quorum() { + p.status = StatusRejected + p.statusReason = "low participation" + return nil + } + + // Tally votes and update proposal with the outcome + choice := p.strategy.Tally(p.DAO(), *record) + + switch choice { + case ChoiceYes: + p.choice = ChoiceYes + p.status = StatusPassed + case ChoiceNo: + p.choice = ChoiceNo + p.status = StatusRejected + default: + p.status = StatusRejected + } + return nil +} + +func (p *Proposal) Validate() error { + if v, ok := p.strategy.(Validator); ok { + if err := v.Validate(p); err != nil { + return err + } + } + return nil +} + +// Execute executes the proposal. +func (p *Proposal) Execute() error { // TODO: Write test for proposal execute + if p.status != StatusPassed { + return ErrProposalNotPassed + } + + if e, ok := p.strategy.(Executer); ok { + if err := p.Validate(); err != nil { + return ExecutionError{err} + } + + if err := e.Execute(p.InitialDAO()); err != nil { + return ExecutionError{err} + } + } + return nil +} + +func findBelongingDAO(addr std.Address, node *DAO) *DAO { + if node == nil { + return nil + } + + // Before checking the current DAO try to find + // if address is a member of a higher order DAO + dao := findBelongingDAO(addr, node.parent) + if dao == nil && node.HasMember(addr) { + return node + } + return nil +} diff --git a/portal-loop/extracted/p/gnome/dao/proposal_test.gno b/portal-loop/extracted/p/gnome/dao/proposal_test.gno new file mode 100644 index 00000000..1b876ee7 --- /dev/null +++ b/portal-loop/extracted/p/gnome/dao/proposal_test.gno @@ -0,0 +1,636 @@ +package dao + +import ( + "errors" + "std" + "testing" + "time" + + "gno.land/p/demo/testutils" + + gnome "gno.land/p/gnome/dao" +) + +var ( + futureTime = time.Now().Add(time.Hour) + zeroTime = time.Time{} +) + +// TODO: Improve proposal unit test using test cases and adding missing methods +func TestProposal(t *testing.T) { + cases := []struct { + name, title, description string + dao *gnome.DAO + err error + }{ + { + name: "ok", + dao: gnome.MustNew("test", "Test"), + title: "Proposal", + description: "Test proposal", + }, + { + name: "empty DAO", + err: errors.New("proposal DAO is required"), + }, + { + name: "empty title", + dao: gnome.MustNew("test", "Test"), + err: errors.New("proposal title is required"), + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + // Arrange + id := gnome.ID(1) + proposer := testutils.TestAddress("proposer") + strategy := testStrategy{} + status := gnome.StatusActive + opts := []gnome.ProposalOption{ + gnome.WithDescription(tc.description), + } + + // Act + proposal, err := gnome.NewProposal(id, strategy, proposer, tc.dao, tc.title, opts...) + + // Assert + if tc.err != nil { + assertError(t, tc.err, err) + return + } + + assertNoError(t, err) + + if got := proposal.ID(); got != id { + t.Fatalf("expected ID: %d, got: %d", id, got) + } + + if got := proposal.DAO(); got.Name() != tc.dao.Name() { + t.Fatalf("expected DAO: '%s', got: '%s'", tc.dao.Name(), got.Name()) + } + + if got := proposal.Title(); got != tc.title { + t.Fatalf("expected title: '%s', got: '%s'", tc.title, got) + } + + if got := proposal.Description(); got != tc.description { + t.Fatalf("expected description: '%s', got: '%s'", tc.description, got) + } + + if got := proposal.StatusReason(); got != "" { + t.Fatalf("expected empty dismiss reason, got: '%s'", got) + } + + if got := proposal.Proposer(); got != proposer { + t.Fatalf("expected proposer: '%s', got: '%s'", proposer, got) + } + + if got := proposal.CreatedAt(); got.IsZero() { + t.Fatalf("expected a valid creation time, got: '%s'", got.String()) + } + + if c := len(proposal.Promotions()); c != 0 { + t.Fatalf("expected an empty list of promotions, got: %d DAOs", c) + } + + if got := proposal.VotingDeadline(); got.IsZero() { + t.Fatalf("expected a valid deadline time, got: '%s'", got.String()) + } + + now := time.Now() + if got := proposal.VotingDeadline(); got.Before(now) { // TODO: Using after makes assertion fail (?) + t.Fatalf("expected deadline to happen after: '%s', got: '%s'", now.String(), got.String()) + } + + if got := proposal.Status(); got != status { + t.Fatalf("expected status: %d, got: %d", status, got) + } + + if got := proposal.Strategy().Name(); got != strategy.Name() { + t.Fatalf("expected strategy: '%s', got: '%s'", strategy.Name(), got) + } + + if got := proposal.Strategy().Name(); got != strategy.Name() { + t.Fatalf("expected strategy: '%s', got: '%s'", strategy.Name(), got) + } + + if c := len(proposal.Votes()); c != 0 { + t.Fatalf("expected no votes, got: %d votes", c) + } + + if c := proposal.VotingRecord().VoteCount(); c != 0 { + t.Fatalf("expected an empty votes record, got: %d records", c) + } + }) + } +} + +func TestProposalWithdraw(t *testing.T) { + // TODO: Test success cases where proposal status is review + wantErr := gnome.ErrReviewStatusRequired + wantStatus := gnome.StatusWithdrawed + proposal := mustCreateProposal(t, testStrategy{}, gnome.WithReviewDeadline(futureTime)) + + if err := proposal.Withdraw(); err != nil { + t.Fatalf("expected no error, got: '%s'", err.Error()) + } + + if err := proposal.Withdraw(); err != wantErr { + t.Fatalf("expected error: '%s', got: '%s'", wantErr.Error(), err.Error()) + } + + if got := proposal.Status(); got != wantStatus { + t.Fatalf("expected status: %d, got: %d", wantStatus, got) + } +} + +func TestProposalDismiss(t *testing.T) { + cases := []struct { + name, reason string + status gnome.ProposalStatus + err error + }{ + { + name: "ok", + reason: "Foo", + status: gnome.StatusDismissed, + }, + { + name: "empty reason", + err: gnome.ErrReasonRequired, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + // Arrange + proposal := mustCreateProposal(t, testStrategy{}) + + // Act + err := proposal.Dismiss(tc.reason) + + // Assert + if tc.err != nil { + assertError(t, tc.err, err) + return + } + + assertNoError(t, err) + + if got := proposal.Status(); got != tc.status { + t.Fatalf("expected status: %s, got: %s", tc.status.String(), got.String()) + } + + if got := proposal.StatusReason(); got != tc.reason { + t.Fatalf("expected dismiss reason: '%s', got: '%s'", tc.reason, got) + } + }) + } +} + +func TestProposalActivate(t *testing.T) { + cases := []struct { + name string + status gnome.ProposalStatus + setup func(*gnome.Proposal) + err error + }{ + { + name: "ok", + status: gnome.StatusActive, + }, + { + name: "review status required", + setup: func(p *gnome.Proposal) { + p.Activate() + }, + err: gnome.ErrReviewStatusRequired, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + // Arrange + proposal := mustCreateProposal(t, testStrategy{}, gnome.WithReviewDeadline(futureTime)) + + if tc.setup != nil { + tc.setup(proposal) + } + + // Act + err := proposal.Activate() + + // Assert + if tc.err != nil { + assertError(t, tc.err, err) + return + } + + assertNoError(t, err) + + if got := proposal.Status(); got != tc.status { + t.Fatalf("expected status: %s, got: %s", tc.status.String(), got.String()) + } + }) + } +} + +func TestProposalPromote(t *testing.T) { + strategy := testStrategy{} + addr := testutils.TestAddress("proposer") + cases := []struct { + name string + daoNames []string + setup func() (*gnome.Proposal, *gnome.DAO) + err error + }{ + { + name: "promote to parent", + daoNames: []string{"child", "parent"}, + setup: func() (*gnome.Proposal, *gnome.DAO) { + child := gnome.MustNew("child", "Child") + parent := gnome.MustNew("parent", "Parent", gnome.WithSubDAO(child)) + p, _ := gnome.NewProposal(1, strategy, addr, child, "Title") + return p, parent + }, + }, + { + name: "promote to root", + daoNames: []string{"child", "root"}, + setup: func() (*gnome.Proposal, *gnome.DAO) { + child := gnome.MustNew("child", "Child") + root := gnome.MustNew("root", "Root", gnome.WithSubDAO( + gnome.MustNew("parent", "Parent", gnome.WithSubDAO(child)), + )) + p, _ := gnome.NewProposal(1, strategy, addr, child, "Title") + return p, root + }, + }, + { + name: "promote to non parent", + setup: func() (*gnome.Proposal, *gnome.DAO) { + child := gnome.MustNew("child", "Child") + gnome.MustNew("parent", "Parent", gnome.WithSubDAO(child)) + p, _ := gnome.NewProposal(1, strategy, addr, child, "Title") + return p, gnome.MustNew("foo", "Foo") + }, + err: gnome.ErrProposalPromote, + }, + { + name: "promote with one promotion", + daoNames: []string{"child", "parent", "root"}, + setup: func() (*gnome.Proposal, *gnome.DAO) { + child := gnome.MustNew("child", "Child") + parent := gnome.MustNew("parent", "Parent", gnome.WithSubDAO(child)) + root := gnome.MustNew("root", "Root", gnome.WithSubDAO(parent)) + p, _ := gnome.NewProposal(1, strategy, addr, child, "Title") + p.Promote(parent) + return p, root + }, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + // Arrange + p, dao := tc.setup() + + deadline := time.Now().Add(-time.Hour * 24) + p.votingDeadline = deadline // Change deadline to check that its resetted on promote + + p.VotingRecord().Add(gnome.Vote{}) // Add a single dummy vote for the current DAO + + // Act + err := p.Promote(dao) + + // Assert + if tc.err != nil { + assertError(t, tc.err, err) + return + } + + assertNoError(t, err) + + if !p.HasBeenPromoted() { + t.Fatal("expected proposal to be promotedt") + } + + if !p.HasPromotion(dao.Path()) { + t.Fatal("expected proposal promotions to include the DAO") + } + + if got := p.VotingDeadline(); !got.After(deadline) { + t.Fatalf("expected voting deadline to be greater than original deadline: %d, got: %d", deadline.Unix(), got.Unix()) + } + + if p.VotingRecord().VoteCount() != 0 { + t.Fatal("expected the voting record to be empty") + } + + promotions := p.Promotions() + if c := len(promotions); c != len(tc.daoNames) { + t.Fatalf("expected promotions count: %d, got: %d DAOs", len(tc.daoNames), c) + } + + for i, dao := range promotions { + if got := dao.Name(); tc.daoNames[i] != got { + t.Fatalf("expected DAO name: '%s', got: '%s'", tc.daoNames[i], got) + } + } + }) + } +} + +func TestProposalVote(t *testing.T) { + memberAddr := testutils.TestAddress("member") + setupDAOMember := func(p *gnome.Proposal) { + p.DAO().AddMember(gnome.NewMember(memberAddr)) + } + + cases := []struct { + name, reason string + address std.Address + choice gnome.VoteChoice + voteCount int + options []gnome.ProposalOption + setup func(*gnome.Proposal) + err error + }{ + { + name: "ok", + address: memberAddr, + choice: gnome.ChoiceYes, + voteCount: 1, + setup: setupDAOMember, + }, + { + name: "proposal not active", + address: memberAddr, + choice: gnome.ChoiceYes, + options: []gnome.ProposalOption{ + gnome.WithReviewDeadline(futureTime), + }, + err: gnome.ErrProposalNotActive, + setup: func(p *gnome.Proposal) { + setupDAOMember(p) + p.Withdraw() + }, + }, + { + name: "vote with invalid reason", + address: memberAddr, + choice: gnome.ChoiceYes, + reason: "1234", + err: gnome.ErrInvalidReason, + setup: setupDAOMember, + }, + { + name: "already voted", + address: memberAddr, + choice: gnome.ChoiceYes, + voteCount: 1, + options: []gnome.ProposalOption{ + gnome.WithVoteChangeDuration(-1), + }, + err: gnome.ErrAlreadyVoted, + setup: func(p *gnome.Proposal) { + setupDAOMember(p) + p.Vote(memberAddr, gnome.ChoiceYes, "") + }, + }, + { + name: "vote after proposal deadline", + address: memberAddr, + choice: gnome.ChoiceYes, + options: []gnome.ProposalOption{ + gnome.WithVotingDeadline(zeroTime), + }, + err: gnome.ErrProposalVotingDeadlineMet, + setup: setupDAOMember, + }, + { + name: "non member vote not allowed", + address: memberAddr, + choice: gnome.ChoiceYes, + err: gnome.ErrMemberVoteNotAllowed, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + // Arrange + proposal := mustCreateProposal(t, testStrategy{}, tc.options...) + + if tc.setup != nil { + tc.setup(proposal) + } + + // Act + err := proposal.Vote(tc.address, tc.choice, tc.reason) + + // Assert + if tc.err != nil { + assertError(t, tc.err, err) + } else { + assertNoError(t, err) + } + + votes := proposal.Votes() + voteCount := len(votes) + if voteCount != tc.voteCount { + t.Fatalf("expected %d vote(s), got: %d", tc.voteCount, voteCount) + } + + if voteCount > 0 { + if got := votes[0].Address; got != tc.address { + t.Fatalf("expected vote address: '%s', got: '%s'", tc.address, got) + } + + if got := votes[0].Choice; got != tc.choice { + t.Fatalf("expected vote choice: '%s', got: '%s'", tc.choice, got) + } + + if got := votes[0].Reason; got != tc.reason { + t.Fatalf("expected vote reason: '%s', got: '%s'", tc.reason, got) + } + } + }) + } +} + +func TestProposalTally(t *testing.T) { + addresses := [3]std.Address{ + testutils.TestAddress("member1"), + testutils.TestAddress("member2"), + testutils.TestAddress("member3"), + } + setupDAOMembers := func(p *gnome.Proposal) { + dao := p.DAO() + for _, addr := range addresses { + dao.AddMember(gnome.NewMember(addr)) + } + } + + cases := []struct { + name string + votes []gnome.Vote + choice gnome.VoteChoice + strategy gnome.ProposalStrategy + status gnome.ProposalStatus + statusReason string + votingDeadlinePassed bool + options []gnome.ProposalOption + setup func(*gnome.Proposal) + err error + }{ + { + name: "proposal pass", + votes: []gnome.Vote{ + {Address: addresses[0], Choice: gnome.ChoiceYes}, + {Address: addresses[1], Choice: gnome.ChoiceYes}, + }, + choice: gnome.ChoiceYes, + strategy: testStrategy{gnome.ChoiceYes}, + status: gnome.StatusPassed, + options: []gnome.ProposalOption{gnome.WithVotingDeadline(zeroTime)}, + setup: setupDAOMembers, + }, + { + name: "proposal rejected", + votes: []gnome.Vote{ + {Address: addresses[0], Choice: gnome.ChoiceYes}, + {Address: addresses[1], Choice: gnome.ChoiceNo}, + {Address: addresses[2], Choice: gnome.ChoiceNo}, + }, + choice: gnome.ChoiceNo, + strategy: testStrategy{gnome.ChoiceNo}, + status: gnome.StatusRejected, + options: []gnome.ProposalOption{gnome.WithVotingDeadline(zeroTime)}, + setup: setupDAOMembers, + }, + { + name: "no quorum", + votes: []gnome.Vote{ + {Address: addresses[0], Choice: gnome.ChoiceYes}, + }, + strategy: testStrategy{}, + status: gnome.StatusRejected, + statusReason: "low participation", + options: []gnome.ProposalOption{gnome.WithVotingDeadline(zeroTime)}, + setup: setupDAOMembers, + }, + { + name: "proposal not active", + status: gnome.StatusWithdrawed, + options: []gnome.ProposalOption{gnome.WithReviewDeadline(futureTime)}, + strategy: testStrategy{}, + setup: func(p *gnome.Proposal) { + p.Withdraw() + }, + err: gnome.ErrProposalNotActive, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + // Arrange + proposal := mustCreateProposal(t, tc.strategy, tc.options...) + + for _, v := range tc.votes { + // Add votes directly to the record because deadline might be expired for some test cases + proposal.VotingRecord().Add(v) + } + + if tc.setup != nil { + tc.setup(proposal) + } + + // Act + err := proposal.Tally() + + // Assert + if tc.err != nil { + assertError(t, tc.err, err) + } else { + assertNoError(t, err) + } + + if got := proposal.Status(); got != tc.status { + t.Fatalf("expected status: %d, got: %d", tc.status, got) + } + + if got := proposal.StatusReason(); got != tc.statusReason { + t.Fatalf("expected status reason: '%s', got: '%s'", tc.statusReason, got) + } + + if got := proposal.Choice(); got != tc.choice { + t.Fatalf("expected winner choice: '%s', got: '%s'", tc.choice, got) + } + }) + } +} + +func mustCreateProposal(t *testing.T, s gnome.ProposalStrategy, options ...gnome.ProposalOption) *gnome.Proposal { + t.Helper() + + dao := gnome.MustNew("test", "Test") + addr := testutils.TestAddress("proposer") + proposal, err := gnome.NewProposal(1, s, addr, dao, "Title", options...) + if err != nil { + t.Fatal(err) + } + + return proposal +} + +func assertError(t *testing.T, expected interface{}, actual error) { + t.Helper() + + want, ok := expected.(string) + if !ok { + if err, ok := expected.(error); ok { + want = err.Error() + } + } + + if actual == nil { + t.Fatalf("expected error: '%s', got no error", want) + } + + if want != actual.Error() { + t.Fatalf("expected error: '%s', got: '%s'", want, actual.Error()) + } +} + +func assertNoError(t *testing.T, err interface{}) { + t.Helper() + + if err == nil { + return + } + + actual, ok := err.(string) + if !ok { + if e, ok := err.(error); ok { + actual = e.Error() + } + } + + if actual != "" { + t.Fatalf("expected no error, got: '%s'", actual) + } +} + +type testStrategy struct { + Choice gnome.VoteChoice +} + +func (testStrategy) Name() string { return "test" } +func (testStrategy) Quorum() float64 { return 0.51 } +func (testStrategy) VotingPeriod() time.Duration { return time.Hour * 24 * 2 } +func (s testStrategy) Tally(*gnome.DAO, gnome.VotingRecord) gnome.VoteChoice { return s.Choice } + +func (testStrategy) VoteChoices() []gnome.VoteChoice { + return []gnome.VoteChoice{gnome.ChoiceYes, gnome.ChoiceNo} +} diff --git a/portal-loop/extracted/p/gnome/dao/record.gno b/portal-loop/extracted/p/gnome/dao/record.gno new file mode 100644 index 00000000..18b572b5 --- /dev/null +++ b/portal-loop/extracted/p/gnome/dao/record.gno @@ -0,0 +1,131 @@ +package dao + +import ( + "std" + + "gno.land/p/demo/avl" +) + +// VotingRecordIterFn defines the a callback to iterate voting choices. +type VotingRecordIterFn func(_ VoteChoice, voteCount uint) bool + +// NewVotingRecord creates a new voting record. +func NewVotingRecord() *VotingRecord { + return &VotingRecord{} +} + +// VotingRecord mamages votes and vote count. +type VotingRecord struct { + votes []Vote + counter avl.Tree // VoteChoice -> count (uint) +} + +// Votes return the list of votes. +func (r VotingRecord) Votes() []Vote { + return r.votes +} + +// VoteCount returns the number of votes. +func (r VotingRecord) VoteCount() int { + return len(r.votes) +} + +// Get returns the number of votes for vote choice. +func (r VotingRecord) Get(c VoteChoice) uint { + key := string(c) + if v, ok := r.counter.Get(key); ok { + return v.(uint) + } + return 0 +} + +// Add adds a vote to the record. +func (r *VotingRecord) Add(v Vote) { + r.votes = append(r.votes, v) + key := string(v.Choice) + r.counter.Set(key, r.Get(v.Choice)+1) +} + +// Remove removes a vote from the record. +func (r *VotingRecord) Remove(addr std.Address) bool { + for i, v := range r.votes { + if v.Address == addr { + r.votes = append(r.votes[:i], r.votes[i+1:]...) + key := string(v.Choice) + r.counter.Set(key, r.Get(v.Choice)-1) + + return true + } + } + return false +} + +// Iterate iterates all vote choices. +func (r VotingRecord) Iterate(fn VotingRecordIterFn) bool { + return r.counter.Iterate("", "", func(key string, value interface{}) bool { + choice := VoteChoice(key) + return fn(choice, value.(uint)) + }) +} + +// SelectChoiceByMajority select the vote choice by majority. +// Vote choice is a majority when chosen by more than half of the votes. +// Majority type is defined by the caller depending on the vote records and abstentions, it would be +// absolute majority if abstentions are considered, otherwise it would be considered simple majority. +func SelectChoiceByMajority(r VotingRecord, abstentions int) (VoteChoice, bool) { + votesCount := r.VoteCount() + abstentions + choice := getMajorityChoice(r) + isMajority := r.Get(choice) > uint(votesCount/2) + return choice, isMajority +} + +// SelectChoiceBySuperMajority select the vote choice by super majority using a 2/3s threshold. +// Abstentions are not considered when calculating the super majority choice. +func SelectChoiceBySuperMajority(r VotingRecord) (VoteChoice, bool) { + choice := getMajorityChoice(r) + isMajority := r.Get(choice) > uint((2*r.VoteCount())/3) // TODO: Allow threshold customization + return choice, isMajority +} + +// SelectChoiceByPlurality selects the vote choice by plurality. +// The choice will be considered a majority if it has votes and if there is no other +// choice with the same number of votes. A tie won't be considered majority. +func SelectChoiceByPlurality(r VotingRecord) (VoteChoice, bool) { + var ( + choice VoteChoice + currentCount uint + isMajority bool + ) + + r.Iterate(func(c VoteChoice, count uint) bool { + if currentCount < count { + choice = c + currentCount = count + isMajority = true + } else if currentCount == count { + isMajority = false + } + return false + }) + return choice, isMajority +} + +// getMajorityChoice returns the choice voted by the majority. +// The result is only valid when there is a majority. +// Caller must validate that the returned choice represents a majority. +func getMajorityChoice(r VotingRecord) VoteChoice { + var ( + choice VoteChoice + currentCount uint + ) + + r.Iterate(func(c VoteChoice, count uint) bool { + if currentCount < count { + choice = c + currentCount = count + } + return false + }) + + return choice +} diff --git a/portal-loop/extracted/p/gnome/dao/record_test.gno b/portal-loop/extracted/p/gnome/dao/record_test.gno new file mode 100644 index 00000000..fadce29d --- /dev/null +++ b/portal-loop/extracted/p/gnome/dao/record_test.gno @@ -0,0 +1,76 @@ +package dao + +import ( + "testing" + + gnome "gno.land/p/gnome/dao" +) + +func TestVotingRecord(t *testing.T) { + // Act + record := NewVotingRecord() + + // Assert + if got := record.Votes(); got != nil { + t.Fatalf("expected no votes, got: %d", len(got)) + } + + if got := record.VoteCount(); got != 0 { + t.Fatalf("expected no vote count: 0, got: %d", got) + } +} + +func TestVotingRecordAdd(t *testing.T) { + // Arrange + record := NewVotingRecord() + vote := gnome.Vote{Choice: gnome.ChoiceYes} + + // Act + record.Add(vote) + + // Assert + votes := record.Votes() + if c := len(votes); c != 1 { + t.Fatalf("expected one votes, got: %d", c) + } + + if got := votes[0]; got != vote { + t.Fatalf("expected vote: %v, got: %v", vote, got) + } + + if got := record.VoteCount(); got != 1 { + t.Fatalf("expected vote count: %d, got: %d", 1, got) + } + + if got := record.Get(vote.Choice); got != 1 { + t.Fatalf("expected record to get one '%v' count, got: %d", gnome.ChoiceYes, got) + } + + record.Iterate(func(v gnome.VoteChoice, count uint) bool { + if v != gnome.ChoiceYes { + t.Fatalf("expected iterate choice: %v, got: %v", gnome.ChoiceYes, v) + } + + if count != 1 { + t.Fatalf("expected iterate vote count: %d, got: %d", 1, count) + } + + return false + }) +} + +func TestVotingRecordRemove(t *testing.T) { + t.Skip("TODO: Write unit test for VotingRecord.Remove()") +} + +func TestSelectChoiceByMajority(t *testing.T) { + t.Skip("TODO: Write unit test for SelectChoiceByMajority") +} + +func TestSelectChoiceBySuperMajority(t *testing.T) { + t.Skip("TODO: Write unit test for SelectChoiceBySuperMajority") +} + +func TestSelectChoiceByPlurality(t *testing.T) { + t.Skip("TODO: Write unit test for SelectChoiceByPlurality") +} diff --git a/portal-loop/extracted/p/gnome/dao/render.gno b/portal-loop/extracted/p/gnome/dao/render.gno new file mode 100644 index 00000000..0f40adcc --- /dev/null +++ b/portal-loop/extracted/p/gnome/dao/render.gno @@ -0,0 +1,27 @@ +package dao + +import ( + "strings" + + "gno.land/p/demo/ufmt" +) + +// EscapeHTML escapes special characters like "<" to become "<". +// It escapes only five such characters: <, >, &, ' and ". +func EscapeHTML(s string) string { + s = strings.ReplaceAll(s, `&`, "&") + s = strings.ReplaceAll(s, `"`, """) + s = strings.ReplaceAll(s, `'`, "'") + s = strings.ReplaceAll(s, `<`, "<") + return strings.ReplaceAll(s, `>`, ">") +} + +// NewLink creates a new Markdown link. +func NewLink(text, uri string) string { + return ufmt.Sprintf("[%s](%s)", text, uri) +} + +// NewLinkURI creates a new Markdown link where text and URI are the same. +func NewLinkURI(uri string) string { + return ufmt.Sprintf("[%s](%s)", uri, uri) +} diff --git a/portal-loop/extracted/p/gnome/dao/strategy.gno b/portal-loop/extracted/p/gnome/dao/strategy.gno new file mode 100644 index 00000000..222f28e3 --- /dev/null +++ b/portal-loop/extracted/p/gnome/dao/strategy.gno @@ -0,0 +1,67 @@ +package dao + +import ( + "std" + "time" +) + +type ( + // VoteChoiceRecord contains the number of counted votes for a single voting choice. + VoteChoiceRecord struct { + Choice VoteChoice + Count uint + } + + // ProposalStrategy defines the interface for the different proposal types. + ProposalStrategy interface { + // Name returns the name of the strategy. + Name() string + + // Quorum returns the minimum required percentage of DAO member votes + // required for a proposal to pass. + Quorum() float64 + + // VotingPeriod returns the period that a proposal should allow voting. + VotingPeriod() time.Duration + + // VoteChoices returns the valid voting choices for the strategy. + VoteChoices() []VoteChoice + + // Tally counts the votes and returns the winner voting choice. + // The DAO argument is the DAO that the proposal is currently assigned to, + // by default the one where the proposal was created. + // Proposals can be promoted to parent DAOs in which case the DAO argument + // is the DAO where the proposal was promoted the last time. + Tally(*DAO, VotingRecord) VoteChoice + } +) + +// VoteChecker defines an interface for proposal vote validation. +// Proposal strategies that require checking votes when they are submitted should implement it. +type VoteChecker interface { + // CheckVote checks that a vote is valid for the strategy. + CheckVote(member std.Address, choice VoteChoice, reason string) error +} + +// Executer defines an interface for executable proposals. +// Proposals strategies that implement the interface can modify the DAO state when proposal passes. +type Executer interface { + // Execute executes the proposal. + // The DAO argument is the DAO where the proposal was created, even if the proposal has been promoted + // to a parent DAO. + // TODO: Execute should return some feedback on success + Execute(*DAO) error +} + +// Validator defines an interface for proposal validation. +// Proposal strategies that implement the interface can validate that a proposal is valid for the current state. +type Validator interface { + // Validate validates if a proposal is valid for the current state. + Validate(*Proposal) error +} + +// ParamsRenderer defines an interface to allow strategies to render its input parameters. +type ParamsRenderer interface { + // RenderParams returns a markdown with the rendered strategy parameters. + RenderParams() string +} diff --git a/portal-loop/extracted/p/gnome/dao/uri.gno b/portal-loop/extracted/p/gnome/dao/uri.gno new file mode 100644 index 00000000..62760e56 --- /dev/null +++ b/portal-loop/extracted/p/gnome/dao/uri.gno @@ -0,0 +1,33 @@ +package dao + +import ( + "regexp" + "strings" +) + +var reSlug = regexp.MustCompile("^[a-zA-Z]+[a-zA-Z0-9-_]*$") + +// IsSlug checks if a string is a valid slug. +func IsSlug(s string) bool { + return reSlug.MatchString(s) +} + +// SplitRealmURI splits a Gnoland URI into Realm URI and render path. +func SplitRealmURI(uri string) (realmURI, renderPath string) { + if uri == "" { + return + } + + parts := strings.SplitN(uri, ":", 2) + realmURI = parts[0] + if len(parts) > 1 { + renderPath = parts[1] + } + return +} + +// CutRealmDomain cuts out the Gnoland domain prefix from a URI. +func CutRealmDomain(uri string) string { + realmPath, _ := strings.CutPrefix(uri, "gno.land") + return realmPath +} diff --git a/portal-loop/extracted/p/gnome/dao/uri_test.gno b/portal-loop/extracted/p/gnome/dao/uri_test.gno new file mode 100644 index 00000000..a2ab23c0 --- /dev/null +++ b/portal-loop/extracted/p/gnome/dao/uri_test.gno @@ -0,0 +1,82 @@ +package dao + +import ( + "testing" + + gnome "gno.land/p/gnome/dao" +) + +func TestSplitRealmURI(t *testing.T) { + cases := []struct { + name, uri, realmURI, renderPath string + }{ + { + name: "realm URI", + uri: "gno.land/r/gnome", + realmURI: "gno.land/r/gnome", + }, + { + name: "realm URI with render path", + uri: "gno.land/r/gnome:foo/bar", + realmURI: "gno.land/r/gnome", + renderPath: "foo/bar", + }, + { + name: "realm URI with render path", + uri: "gno.land/r/gnome:foo/bar", + realmURI: "gno.land/r/gnome", + renderPath: "foo/bar", + }, + { + name: "empty URI", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + // Act + realmURI, renderPath := gnome.SplitRealmURI(tc.uri) + + // Assert + if realmURI != tc.realmURI { + t.Fatalf("expected realm URI: '%s', got: '%s'", tc.realmURI, realmURI) + } + + if renderPath != tc.renderPath { + t.Fatalf("expected render path: '%s', got: '%s'", tc.renderPath, renderPath) + } + }) + } +} + +func TestCutRealmDomain(t *testing.T) { + cases := []struct { + name, uri, path string + }{ + { + name: "with domain", + uri: "gno.land/r/gnome", + path: "/r/gnome", + }, + { + name: "without domain", + uri: "/r/gnome", + path: "/r/gnome", + }, + { + name: "empty", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + // Act + path := gnome.CutRealmDomain(tc.uri) + + // Assert + if path != tc.path { + t.Fatalf("expected path: '%s', got: '%s'", tc.path, path) + } + }) + } +} diff --git a/portal-loop/extracted/p/gnome/router/LICENSE b/portal-loop/extracted/p/gnome/router/LICENSE new file mode 100644 index 00000000..1e486ea9 --- /dev/null +++ b/portal-loop/extracted/p/gnome/router/LICENSE @@ -0,0 +1,62 @@ +Copyright (c) 2024. All rights reserved. + +Project Owner: +NewTendermint, LLC + +Project Maintainer: +İlker Göktuğ ÖZTÜRK. , + +Your access to this Project and your contributions to this Project are subject +to the following terms: + +* You hereby grant to the listed Owner and Maintainer of this Project the +worldwide, irrevocable and royalty-free right to use, publish, relicense and +sublicense your contributions under any non-exclusive license of their +choosing for commercial and non-commercial purposes. +* You shall not attempt to bring any intellectual property infringement or +misappropriation claims against the Owner or Maintainer of this Project +relating to or arising from your contributions. +* You represent that you are the sole owner of all rights in your +contributions and that no third party has any rights or interests therein. + +FOR THE SCOPE OF THIS LICENSE, A CONTRIBUTION IS DEFINED TO INCLUDE ANY WORKS, +IDEAS, CODE, PROCESSES, OR APIS MADE AVAILABLE TO VIEW BY THE GENERAL PUBLIC +(INCLUDING ANY PUBLICLY ACCESSIBLE INTERNET FORUMS AND CHAT SERVERS WHERE +ACCESS IS AVAILABLE FOR FREE WITH REGISTRATION) OR PRIVATELY TO THIS PROJECT'S +OWNER AND MAINTAINERS; INCLUDING WORKS, IDEAS, CODE, PROCESSES, AND APIS THAT +ARE ABOUT THIS PROJECT AND ITS CONTRIBUTIONS, OR MENTIONED IN REFERENCE TO +THIS PROJECT, WHERE SUCH WORKS, IDEAS, CODE, PROCESSES, AND APIS ARE MATERIAL +TO THE SUCCESS, IMPROVEMENT, OR COMPLETION OF THIS PROJECT, AS DETERMINED BY +THE OWNER OF THIS PROJECT. + +Contributions may come in any form, and include (but are not limited to): + +* pull requests +* diff patches +* commentary +* example code + +If you do not want your contribution to become incorporated into this Project, +do not make contributions to this Project. The creation of contributions that +may in the future become known to this Project's Owner and Maintainer +constitutes a willing contribution to this Project in accordance with this +license. + +THIS PROJECT AND THE WORKS AVAILABLE THROUGH THIS PROJECT ARE PROVIDED “AS IS” +AND WITHOUT WARRANTY OF ANY KIND. IN NO EVENT SHALL THE OWNER OR MAINTAINER OF +THIS PROJECT BE LIABLE TO YOU OR ANY THIRD PARTY FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THIS PROJECT OR THE WORKS AVAILABLE THROUGH +THIS PROJECT. YOU AGREED TO INDEMNIFY, DEFEND AND HOLD THE OWNER AND +MAINTAINER FROM AND AGAINST ANY CLAIMS, LOSSES OR DAMAGES ARISING FROM YOUR +USE OF THIS PROJECT OR THE WORKS AVAILABLE THROUGH THIS PROJECT. + +This license is subject to change at any time by the Project Owner or +Maintainer. + +Your continued access to or use of this Project or any works +available through this Project shall be subject to the then-current version +of this license. + +The Project Owner and Maintainer reserve the right to change this license +without needing the consent of the contributors to this Project. diff --git a/portal-loop/extracted/p/gnome/router/pkg_metadata.json b/portal-loop/extracted/p/gnome/router/pkg_metadata.json new file mode 100644 index 00000000..9f6c0a85 --- /dev/null +++ b/portal-loop/extracted/p/gnome/router/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/p/gnome/router/router.gno b/portal-loop/extracted/p/gnome/router/router.gno new file mode 100644 index 00000000..4d6b778d --- /dev/null +++ b/portal-loop/extracted/p/gnome/router/router.gno @@ -0,0 +1,101 @@ +package router + +import ( + "strings" + + "gno.land/p/demo/ufmt" +) + +type ( + ResponseWriter interface { + Write(s string) + Writef(format string, values ...interface{}) + } + + Request struct { + Path string + Prefix string + Route string + Args []string + } + + HandlerFunc func(ResponseWriter, Request) + + handler struct { + Prefix string + Fn HandlerFunc + } +) + +func NewRouter() Router { + return Router{} +} + +type Router struct { + handlers []handler +} + +func (r *Router) HandleFunc(prefix string, fn HandlerFunc) { + r.handlers = append(r.handlers, handler{ + Prefix: prefix, + Fn: fn, + }) +} + +func (r Router) Render(path string) string { + prefix, route, args := splitRenderPath(path) + + for _, h := range r.handlers { + if h.Prefix == prefix { + var ( + w responseWriter + req = Request{ + Path: path, + Prefix: prefix, + Route: route, + Args: args, + } + ) + + h.Fn(&w, req) + + return w.Output() + } + } + + return "Path not found" +} + +type responseWriter struct { + output strings.Builder +} + +func (w *responseWriter) Write(s string) { + w.output.WriteString(s) +} + +func (w *responseWriter) Writef(format string, values ...interface{}) { + w.output.WriteString(ufmt.Sprintf(format, values...)) +} + +func (w responseWriter) Output() string { + return w.output.String() +} + +func splitRenderPath(path string) (prefix, route string, args []string) { + // Split route prefix and route. + // Path format is "prefix/route:args". + path = strings.TrimSpace(path) + if parts := strings.SplitN(path, "/", 2); len(parts) == 2 { + prefix = parts[0] + route = parts[1] + + // Split route and arguments + if parts := strings.Split(route, ":"); len(parts) > 1 { + route = parts[0] + args = parts[1:] + } + } + + return prefix, route, args +} diff --git a/portal-loop/extracted/p/gnome/router/v1/LICENSE b/portal-loop/extracted/p/gnome/router/v1/LICENSE new file mode 100644 index 00000000..1e486ea9 --- /dev/null +++ b/portal-loop/extracted/p/gnome/router/v1/LICENSE @@ -0,0 +1,62 @@ +Copyright (c) 2024. All rights reserved. + +Project Owner: +NewTendermint, LLC + +Project Maintainer: +İlker Göktuğ ÖZTÜRK. , + +Your access to this Project and your contributions to this Project are subject +to the following terms: + +* You hereby grant to the listed Owner and Maintainer of this Project the +worldwide, irrevocable and royalty-free right to use, publish, relicense and +sublicense your contributions under any non-exclusive license of their +choosing for commercial and non-commercial purposes. +* You shall not attempt to bring any intellectual property infringement or +misappropriation claims against the Owner or Maintainer of this Project +relating to or arising from your contributions. +* You represent that you are the sole owner of all rights in your +contributions and that no third party has any rights or interests therein. + +FOR THE SCOPE OF THIS LICENSE, A CONTRIBUTION IS DEFINED TO INCLUDE ANY WORKS, +IDEAS, CODE, PROCESSES, OR APIS MADE AVAILABLE TO VIEW BY THE GENERAL PUBLIC +(INCLUDING ANY PUBLICLY ACCESSIBLE INTERNET FORUMS AND CHAT SERVERS WHERE +ACCESS IS AVAILABLE FOR FREE WITH REGISTRATION) OR PRIVATELY TO THIS PROJECT'S +OWNER AND MAINTAINERS; INCLUDING WORKS, IDEAS, CODE, PROCESSES, AND APIS THAT +ARE ABOUT THIS PROJECT AND ITS CONTRIBUTIONS, OR MENTIONED IN REFERENCE TO +THIS PROJECT, WHERE SUCH WORKS, IDEAS, CODE, PROCESSES, AND APIS ARE MATERIAL +TO THE SUCCESS, IMPROVEMENT, OR COMPLETION OF THIS PROJECT, AS DETERMINED BY +THE OWNER OF THIS PROJECT. + +Contributions may come in any form, and include (but are not limited to): + +* pull requests +* diff patches +* commentary +* example code + +If you do not want your contribution to become incorporated into this Project, +do not make contributions to this Project. The creation of contributions that +may in the future become known to this Project's Owner and Maintainer +constitutes a willing contribution to this Project in accordance with this +license. + +THIS PROJECT AND THE WORKS AVAILABLE THROUGH THIS PROJECT ARE PROVIDED “AS IS” +AND WITHOUT WARRANTY OF ANY KIND. IN NO EVENT SHALL THE OWNER OR MAINTAINER OF +THIS PROJECT BE LIABLE TO YOU OR ANY THIRD PARTY FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THIS PROJECT OR THE WORKS AVAILABLE THROUGH +THIS PROJECT. YOU AGREED TO INDEMNIFY, DEFEND AND HOLD THE OWNER AND +MAINTAINER FROM AND AGAINST ANY CLAIMS, LOSSES OR DAMAGES ARISING FROM YOUR +USE OF THIS PROJECT OR THE WORKS AVAILABLE THROUGH THIS PROJECT. + +This license is subject to change at any time by the Project Owner or +Maintainer. + +Your continued access to or use of this Project or any works +available through this Project shall be subject to the then-current version +of this license. + +The Project Owner and Maintainer reserve the right to change this license +without needing the consent of the contributors to this Project. diff --git a/portal-loop/extracted/p/gnome/router/v1/pkg_metadata.json b/portal-loop/extracted/p/gnome/router/v1/pkg_metadata.json new file mode 100644 index 00000000..1305272f --- /dev/null +++ b/portal-loop/extracted/p/gnome/router/v1/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/p/gnome/router/v1/router.gno b/portal-loop/extracted/p/gnome/router/v1/router.gno new file mode 100644 index 00000000..ddfedccb --- /dev/null +++ b/portal-loop/extracted/p/gnome/router/v1/router.gno @@ -0,0 +1,141 @@ +package router + +import ( + "strings" + + "gno.land/p/demo/ufmt" +) + +type ( + // ResponseWriter defines the interface to write response output content. + ResponseWriter interface { + // Write writes a string to the response output. + Write(s string) + + // Writef writes a formatted string to the response output. + Writef(format string, values ...interface{}) + } + + // Request contains incoming request info. + Request struct { + // Path contains the full render path. + Path string + + // Prefix contains the render path prefix that handled the request. + // For example for "/prefix/custom/route" the prefix path is "/prefix". + Prefix string + + // Route contains the render path after the prefix. + // This path doesn't include arguments. + // For example for "/prefix/custom/route:arg1=value1" the route is "/custom/route". + Route string + + // Args contains the list of arguments found in the render path. + // Any number of arguments can be defined as render path suffix by using + // a colon as separator, for example: + // + // /prefix/custom/route:arg1=value1:arg2=value2 + // + // In the example the argument are "arg1=value1" and "arg2=value2". + // The arguments can have any format as long as they are separated by a colon. + Args []string + } + + // HandlerFunc defines the type for request handlers. + HandlerFunc func(ResponseWriter, Request) + + handler struct { + Prefix string + Fn HandlerFunc + } +) + +// New creates a new prefix router. +func New() Router { + return Router{} +} + +// Router allows routing requests by render path prefix. +type Router struct { + handlers []handler +} + +// HandlerFunc registers a request handler for a request path prefix. +func (r *Router) HandleFunc(prefix string, fn HandlerFunc) { + r.handlers = append(r.handlers, handler{ + Prefix: prefix, + Fn: fn, + }) +} + +// Render returns the response content for a render path. +func (r Router) Render(path string) string { + prefix, route, args := SplitRenderPath(path) + + for _, h := range r.handlers { + if h.Prefix == prefix { + var ( + w responseWriter + req = Request{ + Path: path, + Prefix: prefix, + Route: route, + Args: args, + } + ) + + h.Fn(&w, req) + + return w.Output() + } + } + + return "Path not found" +} + +type responseWriter struct { + output strings.Builder +} + +func (w *responseWriter) Write(s string) { + w.output.WriteString(s) +} + +func (w *responseWriter) Writef(format string, values ...interface{}) { + w.output.WriteString(ufmt.Sprintf(format, values...)) +} + +func (w responseWriter) Output() string { + return w.output.String() +} + +// SplitRenderPath splits render path into a prefix, route and arguments. +func SplitRenderPath(path string) (prefix, route string, args []string) { + path = strings.TrimSpace(path) + path = strings.TrimLeft(path, "/") + + // Handle the case where the path is the prefix with no route + if !strings.ContainsAny(path, "/") { + // Split prefix and arguments + parts := strings.Split(path, ":") + prefix = parts[0] + if len(parts) > 1 { + args = parts[1:] + } + + return prefix, route, args + } + + // Split route prefix and route + parts := strings.SplitN(path, "/", 2) + prefix = parts[0] + + // Split route and arguments + parts = strings.Split(parts[1], ":") + route = parts[0] + if len(parts) > 1 { + args = parts[1:] + } + + return prefix, route, args +} diff --git a/portal-loop/extracted/p/gnome/router/v1/router_test.gno b/portal-loop/extracted/p/gnome/router/v1/router_test.gno new file mode 100644 index 00000000..ba77e63d --- /dev/null +++ b/portal-loop/extracted/p/gnome/router/v1/router_test.gno @@ -0,0 +1,166 @@ +package router + +import ( + "fmt" + "testing" + + router "gno.land/p/gnome/router/v1" +) + +func TestSplitRenderPath(t *testing.T) { + cases := []struct { + name, renderPath, prefix, route, args string + }{ + { + name: "prefix path", + renderPath: "/foo", + prefix: "foo", + args: "[]", + }, + { + name: "path with short route", + renderPath: "/foo/bar", + prefix: "foo", + route: "bar", + args: "[]", + }, + { + name: "path with long route", + renderPath: "/foo/bar/baz", + prefix: "foo", + route: "bar/baz", + args: "[]", + }, + { + name: "full path with one arg", + renderPath: "/foo/bar/baz:arg=value", + prefix: "foo", + route: "bar/baz", + args: "[arg=value]", + }, + { + name: "full path with multiple args", + renderPath: "/foo/bar/baz:arg1=value1:arg2=value2", + prefix: "foo", + route: "bar/baz", + args: "[arg1=value1 arg2=value2]", + }, + { + name: "empty path", + args: "[]", + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + // Act + prefix, route, args := router.SplitRenderPath(tc.renderPath) + + // Assert + if prefix != tc.prefix { + t.Fatalf("expected prefix: '%s', got: '%s'", tc.prefix, prefix) + } + + if route != tc.route { + t.Fatalf("expected route: '%s', got: '%s'", tc.route, route) + } + + if got := fmt.Sprintf("%v", args); got != tc.args { + t.Fatalf("expected arguments: %s, got: %s", tc.args, got) + } + }) + } +} + +func TestRouterRender(t *testing.T) { + cases := []struct { + name, renderPath, prefix, route, args string + notFound bool + }{ + { + name: "prefix path", + renderPath: "/foo", + prefix: "foo", + args: "[]", + }, + { + name: "path with short route", + renderPath: "/foo/bar", + prefix: "foo", + route: "bar", + args: "[]", + }, + { + name: "path with long route", + renderPath: "/foo/bar/baz", + prefix: "foo", + route: "bar/baz", + args: "[]", + }, + { + name: "full path with multiple args", + renderPath: "/foo/bar/baz:arg1=value1:arg2=value2", + prefix: "foo", + route: "bar/baz", + args: "[arg1=value1 arg2=value2]", + }, + { + name: "missing path", + renderPath: "/test", + notFound: true, + }, + { + name: "empty path", + notFound: true, + }, + } + + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + // Arrange + var ( + request router.Request + successOutput = "OK" + r = router.New() + ) + + r.HandleFunc("foo", func(res router.ResponseWriter, req router.Request) { + request = req + res.Write(successOutput) + }) + + // Act + output := r.Render(tc.renderPath) + + // Assert + if tc.notFound { + if output == successOutput { + t.Fatal("expected request to fail") + } + + // Run the next test + continue + } + + if output != successOutput { + t.Fatalf("expected output: '%s', got: '%s'", successOutput, output) + } + + if request.Path != tc.renderPath { + t.Fatalf("expected request path: '%s', got: '%s'", tc.renderPath, request.Path) + } + + if request.Prefix != tc.prefix { + t.Fatalf("expected request prefix: '%s', got: '%s'", tc.prefix, request.Prefix) + } + + if request.Route != tc.route { + t.Fatalf("expected request route: '%s', got: '%s'", tc.route, request.Route) + } + + if got := fmt.Sprintf("%v", request.Args); got != tc.args { + t.Fatalf("expected request arguments: %s, got: %s", tc.args, got) + } + }) + } +} diff --git a/portal-loop/extracted/p/gov/proposal/pkg_metadata.json b/portal-loop/extracted/p/gov/proposal/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/gov/proposal/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/gov/proposal/proposal.gno b/portal-loop/extracted/p/gov/proposal/proposal.gno new file mode 100644 index 00000000..ca176722 --- /dev/null +++ b/portal-loop/extracted/p/gov/proposal/proposal.gno @@ -0,0 +1,106 @@ +// Package proposal provides a structure for executing proposals. +package proposal + +import ( + "errors" + "std" + + "gno.land/p/demo/context" +) + +var errNotGovDAO = errors.New("only r/gov/dao can be the caller") + +// NewExecutor creates a new executor with the provided callback function. +func NewExecutor(callback func() error) Executor { + return &executorImpl{ + callback: callback, + done: false, + } +} + +// NewCtxExecutor creates a new executor with the provided callback function. +func NewCtxExecutor(callback func(ctx context.Context) error) Executor { + return &executorImpl{ + callbackCtx: callback, + done: false, + } +} + +// executorImpl is an implementation of the Executor interface. +type executorImpl struct { + callback func() error + callbackCtx func(ctx context.Context) error + done bool + success bool +} + +// Execute runs the executor's callback function. +func (exec *executorImpl) Execute() error { + if exec.done { + return ErrAlreadyDone + } + + // Verify the executor is r/gov/dao + assertCalledByGovdao() + + var err error + if exec.callback != nil { + err = exec.callback() + } else if exec.callbackCtx != nil { + ctx := context.WithValue(context.Empty(), statusContextKey, approvedStatus) + err = exec.callbackCtx(ctx) + } + exec.done = true + exec.success = err == nil + + return err +} + +// IsDone returns whether the executor has been executed. +func (exec *executorImpl) IsDone() bool { + return exec.done +} + +// IsSuccessful returns whether the execution was successful. +func (exec *executorImpl) IsSuccessful() bool { + return exec.success +} + +// IsExpired returns whether the execution had expired or not. +// This implementation never expires. +func (exec *executorImpl) IsExpired() bool { + return false +} + +func IsApprovedByGovdaoContext(ctx context.Context) bool { + v := ctx.Value(statusContextKey) + if v == nil { + return false + } + vs, ok := v.(string) + return ok && vs == approvedStatus +} + +func AssertContextApprovedByGovDAO(ctx context.Context) { + if !IsApprovedByGovdaoContext(ctx) { + panic("not approved by govdao") + } +} + +// assertCalledByGovdao asserts that the calling Realm is /r/gov/dao +func assertCalledByGovdao() { + caller := std.CurrentRealm().PkgPath() + + if caller != daoPkgPath { + panic(errNotGovDAO) + } +} + +type propContextKey string + +func (k propContextKey) String() string { return string(k) } + +const ( + statusContextKey = propContextKey("govdao-prop-status") + approvedStatus = "approved" +) diff --git a/portal-loop/extracted/p/gov/proposal/proposal_test.gno b/portal-loop/extracted/p/gov/proposal/proposal_test.gno new file mode 100644 index 00000000..536871e6 --- /dev/null +++ b/portal-loop/extracted/p/gov/proposal/proposal_test.gno @@ -0,0 +1,156 @@ +package proposal + +import ( + "errors" + "std" + "testing" + + "gno.land/p/demo/uassert" + "gno.land/p/demo/urequire" +) + +func TestExecutor(t *testing.T) { + t.Parallel() + + verifyProposalFailed := func(e Executor) { + uassert.True(t, e.IsDone(), "expected proposal to be done") + uassert.False(t, e.IsSuccessful(), "expected proposal to fail") + } + + verifyProposalSucceeded := func(e Executor) { + uassert.True(t, e.IsDone(), "expected proposal to be done") + uassert.True(t, e.IsSuccessful(), "expected proposal to be successful") + } + + t.Run("govdao not caller", func(t *testing.T) { + t.Parallel() + + var ( + called = false + + cb = func() error { + called = true + + return nil + } + ) + + // Create the executor + e := NewExecutor(cb) + + urequire.False(t, e.IsDone(), "expected status to be NotExecuted") + + // Execute as not the /r/gov/dao caller + uassert.PanicsWithMessage(t, errNotGovDAO.Error(), func() { + _ = e.Execute() + }) + + uassert.False(t, called, "expected proposal to not execute") + }) + + t.Run("execution successful", func(t *testing.T) { + t.Parallel() + + var ( + called = false + + cb = func() error { + called = true + + return nil + } + ) + + // Create the executor + e := NewExecutor(cb) + + urequire.False(t, e.IsDone(), "expected status to be NotExecuted") + + // Execute as the /r/gov/dao caller + r := std.NewCodeRealm(daoPkgPath) + std.TestSetRealm(r) + + uassert.NotPanics(t, func() { + err := e.Execute() + + uassert.NoError(t, err) + }) + + uassert.True(t, called, "expected proposal to execute") + + // Make sure the execution params are correct + verifyProposalSucceeded(e) + }) + + t.Run("execution unsuccessful", func(t *testing.T) { + t.Parallel() + + var ( + called = false + expectedErr = errors.New("unexpected") + + cb = func() error { + called = true + + return expectedErr + } + ) + + // Create the executor + e := NewExecutor(cb) + + // Execute as the /r/gov/dao caller + r := std.NewCodeRealm(daoPkgPath) + std.TestSetRealm(r) + + uassert.NotPanics(t, func() { + err := e.Execute() + + uassert.ErrorIs(t, err, expectedErr) + }) + + uassert.True(t, called, "expected proposal to execute") + + // Make sure the execution params are correct + verifyProposalFailed(e) + }) + + t.Run("proposal already executed", func(t *testing.T) { + t.Parallel() + + var ( + called = false + + cb = func() error { + called = true + + return nil + } + ) + + // Create the executor + e := NewExecutor(cb) + + urequire.False(t, e.IsDone(), "expected status to be NotExecuted") + + // Execute as the /r/gov/dao caller + r := std.NewCodeRealm(daoPkgPath) + std.TestSetRealm(r) + + uassert.NotPanics(t, func() { + uassert.NoError(t, e.Execute()) + }) + + uassert.True(t, called, "expected proposal to execute") + + // Make sure the execution params are correct + verifyProposalSucceeded(e) + + // Attempt to execute the proposal again + uassert.NotPanics(t, func() { + err := e.Execute() + + uassert.ErrorIs(t, err, ErrAlreadyDone) + }) + }) +} diff --git a/portal-loop/extracted/p/gov/proposal/types.gno b/portal-loop/extracted/p/gov/proposal/types.gno new file mode 100644 index 00000000..6cd2da9c --- /dev/null +++ b/portal-loop/extracted/p/gov/proposal/types.gno @@ -0,0 +1,37 @@ +// Package proposal defines types for proposal execution. +package proposal + +import "errors" + +// Executor represents a minimal closure-oriented proposal design. +// It is intended to be used by a govdao governance proposal (v1, v2, etc). +type Executor interface { + // Execute executes the given proposal, and returns any error encountered + // during the execution + Execute() error + + // IsDone returns a flag indicating if the proposal was executed + IsDone() bool + + // IsSuccessful returns a flag indicating if the proposal was executed + // and is successful + IsSuccessful() bool // IsDone() && !err + + // IsExpired returns whether the execution had expired or not. + IsExpired() bool +} + +// ErrAlreadyDone is the error returned when trying to execute an already +// executed proposal. +var ErrAlreadyDone = errors.New("already executed") + +// Status enum. +type Status string + +const ( + NotExecuted Status = "not_executed" + Succeeded Status = "succeeded" + Failed Status = "failed" +) + +const daoPkgPath = "gno.land/r/gov/dao" // TODO: make sure this is configurable through r/sys/vars diff --git a/portal-loop/extracted/p/hello/package.gno b/portal-loop/extracted/p/hello/package.gno new file mode 100644 index 00000000..d36874bc --- /dev/null +++ b/portal-loop/extracted/p/hello/package.gno @@ -0,0 +1,5 @@ +package hello + +func Render(path string) string { + return "Hello World!" +} diff --git a/portal-loop/extracted/p/hello/pkg_metadata.json b/portal-loop/extracted/p/hello/pkg_metadata.json new file mode 100644 index 00000000..10c08c6f --- /dev/null +++ b/portal-loop/extracted/p/hello/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g12chzmwxw8sezcxe9h2csp0tck76r4ptwdlyyqk","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/hello:0/package.gno b/portal-loop/extracted/p/hello:0/package.gno new file mode 100644 index 00000000..d36874bc --- /dev/null +++ b/portal-loop/extracted/p/hello:0/package.gno @@ -0,0 +1,5 @@ +package hello + +func Render(path string) string { + return "Hello World!" +} diff --git a/portal-loop/extracted/p/hello:0/pkg_metadata.json b/portal-loop/extracted/p/hello:0/pkg_metadata.json new file mode 100644 index 00000000..10c08c6f --- /dev/null +++ b/portal-loop/extracted/p/hello:0/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g12chzmwxw8sezcxe9h2csp0tck76r4ptwdlyyqk","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/leon/demo/poll/package.gno b/portal-loop/extracted/p/leon/demo/poll/package.gno new file mode 100644 index 00000000..f03808cc --- /dev/null +++ b/portal-loop/extracted/p/leon/demo/poll/package.gno @@ -0,0 +1,86 @@ +package poll + +import ( + "errors" + "std" +) + +// gno.land/p/demo/poll +// avl tree + +type Poll struct { + title string + description string + deadline int64 // block number + voters map[std.Address]int // address (user) > yes/no // -1 = no, 1 = yes, 0 has not voted +} + +// getters + +func (p Poll) Title() string { + return p.title +} + +func (p Poll) Description() string { + return p.description +} + +func (p Poll) Deadline() int64 { + return p.deadline +} + +func (p Poll) Voters() map[std.Address]int { + return p.voters +} + +// setters + +func (p *Poll) Vote(voter std.Address, vote int) error { + if !voter.IsValid() { + return errors.New("voter address is not valid") + } + + if vote != -1 || vote != 1 { + return errors.New("invalid vote, needs to be -1 (no) or 1 (yes)") + } + + if voter, exists := p.voters[voter]; exists { + return errors.New("voter already voted") + } + + p.voters[voter] = vote +} + +// constructor + +func NewPoll(title, description string, deadline int64) (*Poll, error) { + if title == "" || description == "" { + return nil, errors.New("you need to provide both the title and the description to the poll") + } + + currentBlockNumber := std.GetHeight() // now + if deadline < currentBlockNumber { + return nil, errors.New("deadline needs to be in the future") + } + + return &Poll{ + title: title, + description: description, + deadline: deadline, + voters: make(map[std.Address]int), + }, nil +} + +func (p Poll) VoteCount() (int, int) { + var yes int + + for addr, vote := range p.voters { + if vote == 1 { + yes += 1 + } + } + + totalVotes := len(p.voters) + + return yes, totalVotes - yes +} diff --git a/portal-loop/extracted/p/leon/demo/poll/pkg_metadata.json b/portal-loop/extracted/p/leon/demo/poll/pkg_metadata.json new file mode 100644 index 00000000..62bbe16d --- /dev/null +++ b/portal-loop/extracted/p/leon/demo/poll/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/leon/demo/poll/pkg_test.gno b/portal-loop/extracted/p/leon/demo/poll/pkg_test.gno new file mode 100644 index 00000000..00be2088 --- /dev/null +++ b/portal-loop/extracted/p/leon/demo/poll/pkg_test.gno @@ -0,0 +1,15 @@ +package poll + +import "testing" + +func TestNewPoll(t *testing.T) { + title := "My Poll" + desc := "This is my first poll" + deadline := 1000 + + p := NewPoll(title, desc, deadline) + + if p.title != "My Poll" { + t.Fatalf("expected %s, got %s", title, p.title) + } +} diff --git a/portal-loop/extracted/p/leon/demo/poll:0/package.gno b/portal-loop/extracted/p/leon/demo/poll:0/package.gno new file mode 100644 index 00000000..76cc6d06 --- /dev/null +++ b/portal-loop/extracted/p/leon/demo/poll:0/package.gno @@ -0,0 +1,88 @@ +package poll + +import ( + "errors" + "std" +) + +// gno.land/p/demo/poll +// avl tree + +type Poll struct { + title string + description string + deadline int64 // block number + voters map[std.Address]int // address (user) > yes/no // -1 = no, 1 = yes, 0 has not voted +} + +// getters + +func (p Poll) Title() string { + return p.title +} + +func (p Poll) Description() string { + return p.description +} + +func (p Poll) Deadline() int64 { + return p.deadline +} + +func (p Poll) Voters() map[std.Address]int { + return p.voters +} + +// setters + +func (p *Poll) Vote(voter std.Address, vote int) error { + if !voter.IsValid() { + return errors.New("voter address is not valid") + } + + if vote != -1 || vote != 1 { + return errors.New("invalid vote, needs to be -1 (no) or 1 (yes)") + } + + if _, exists := p.voters[voter]; exists { + return errors.New("voter already voted") + } + + p.voters[voter] = vote + + return nil +} + +// constructor + +func NewPoll(title, description string, deadline int64) (*Poll, error) { + if title == "" || description == "" { + return nil, errors.New("you need to provide both the title and the description to the poll") + } + + currentBlockNumber := std.GetHeight() // now + if deadline < currentBlockNumber { + return nil, errors.New("deadline needs to be in the future") + } + + return &Poll{ + title: title, + description: description, + deadline: deadline, + voters: make(map[std.Address]int), + }, nil +} + +func (p Poll) VoteCount() (int, int) { + var yes int + + for _, vote := range p.voters { + if vote == 1 { + yes += 1 + } + } + + totalVotes := len(p.voters) + + return yes, totalVotes - yes +} diff --git a/portal-loop/extracted/p/leon/demo/poll:0/pkg_metadata.json b/portal-loop/extracted/p/leon/demo/poll:0/pkg_metadata.json new file mode 100644 index 00000000..62bbe16d --- /dev/null +++ b/portal-loop/extracted/p/leon/demo/poll:0/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g125em6arxsnj49vx35f0n0z34putv5ty3376fg5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/leon/demo/poll:0/pkg_test.gno b/portal-loop/extracted/p/leon/demo/poll:0/pkg_test.gno new file mode 100644 index 00000000..00be2088 --- /dev/null +++ b/portal-loop/extracted/p/leon/demo/poll:0/pkg_test.gno @@ -0,0 +1,15 @@ +package poll + +import "testing" + +func TestNewPoll(t *testing.T) { + title := "My Poll" + desc := "This is my first poll" + deadline := 1000 + + p := NewPoll(title, desc, deadline) + + if p.title != "My Poll" { + t.Fatalf("expected %s, got %s", title, p.title) + } +} diff --git a/portal-loop/extracted/p/namespacetest/hello/hello.gno b/portal-loop/extracted/p/namespacetest/hello/hello.gno new file mode 100644 index 00000000..606a2251 --- /dev/null +++ b/portal-loop/extracted/p/namespacetest/hello/hello.gno @@ -0,0 +1,3 @@ +package hello + +func Public() {} diff --git a/portal-loop/extracted/p/namespacetest/hello/pkg_metadata.json b/portal-loop/extracted/p/namespacetest/hello/pkg_metadata.json new file mode 100644 index 00000000..1305272f --- /dev/null +++ b/portal-loop/extracted/p/namespacetest/hello/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1hy6zry03hg5d8le9s2w4fxme6236hkgd928dun","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/p/nt/poa/option.gno b/portal-loop/extracted/p/nt/poa/option.gno new file mode 100644 index 00000000..051ab261 --- /dev/null +++ b/portal-loop/extracted/p/nt/poa/option.gno @@ -0,0 +1,14 @@ +package poa + +import "gno.land/p/sys/validators" + +type Option func(*PoA) + +// WithInitialSet sets the initial PoA validator set +func WithInitialSet(validators []validators.Validator) Option { + return func(p *PoA) { + for _, validator := range validators { + p.validators.Set(validator.Address.String(), validator) + } + } +} diff --git a/portal-loop/extracted/p/nt/poa/pkg_metadata.json b/portal-loop/extracted/p/nt/poa/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/nt/poa/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/nt/poa/poa.gno b/portal-loop/extracted/p/nt/poa/poa.gno new file mode 100644 index 00000000..1eab427f --- /dev/null +++ b/portal-loop/extracted/p/nt/poa/poa.gno @@ -0,0 +1,106 @@ +package poa + +import ( + "errors" + "std" + + "gno.land/p/demo/avl" + "gno.land/p/sys/validators" +) + +var ErrInvalidVotingPower = errors.New("invalid voting power") + +// PoA specifies the Proof of Authority validator set, with simple add / remove constraints. +// +// To add: +// - proposed validator must not be part of the set already +// - proposed validator voting power must be > 0 +// +// To remove: +// - proposed validator must be part of the set already +type PoA struct { + validators *avl.Tree // std.Address -> validators.Validator +} + +// NewPoA creates a new empty Proof of Authority validator set +func NewPoA(opts ...Option) *PoA { + // Create the empty set + p := &PoA{ + validators: avl.NewTree(), + } + + // Apply the options + for _, opt := range opts { + opt(p) + } + + return p +} + +func (p *PoA) AddValidator(address std.Address, pubKey string, power uint64) (validators.Validator, error) { + // Validate that the operation is a valid call. + // Check if the validator is already in the set + if p.IsValidator(address) { + return validators.Validator{}, validators.ErrValidatorExists + } + + // Make sure the voting power > 0 + if power == 0 { + return validators.Validator{}, ErrInvalidVotingPower + } + + v := validators.Validator{ + Address: address, + PubKey: pubKey, // TODO: in the future, verify the public key + VotingPower: power, + } + + // Add the validator to the set + p.validators.Set(address.String(), v) + + return v, nil +} + +func (p *PoA) RemoveValidator(address std.Address) (validators.Validator, error) { + // Validate that the operation is a valid call + // Fetch the validator + validator, err := p.GetValidator(address) + if err != nil { + return validators.Validator{}, err + } + + // Remove the validator from the set + p.validators.Remove(address.String()) + + return validator, nil +} + +func (p *PoA) IsValidator(address std.Address) bool { + _, exists := p.validators.Get(address.String()) + + return exists +} + +func (p *PoA) GetValidator(address std.Address) (validators.Validator, error) { + validatorRaw, exists := p.validators.Get(address.String()) + if !exists { + return validators.Validator{}, validators.ErrValidatorMissing + } + + validator := validatorRaw.(validators.Validator) + + return validator, nil +} + +func (p *PoA) GetValidators() []validators.Validator { + vals := make([]validators.Validator, 0, p.validators.Size()) + + p.validators.Iterate("", "", func(_ string, value interface{}) bool { + validator := value.(validators.Validator) + vals = append(vals, validator) + + return false + }) + + return vals +} diff --git a/portal-loop/extracted/p/nt/poa/poa_test.gno b/portal-loop/extracted/p/nt/poa/poa_test.gno new file mode 100644 index 00000000..dfec3877 --- /dev/null +++ b/portal-loop/extracted/p/nt/poa/poa_test.gno @@ -0,0 +1,237 @@ +package poa + +import ( + "testing" + + "gno.land/p/demo/testutils" + "gno.land/p/demo/uassert" + "gno.land/p/demo/urequire" + "gno.land/p/sys/validators" + + "gno.land/p/demo/ufmt" +) + +// generateTestValidators generates a dummy validator set +func generateTestValidators(count int) []validators.Validator { + vals := make([]validators.Validator, 0, count) + + for i := 0; i < count; i++ { + val := validators.Validator{ + Address: testutils.TestAddress(ufmt.Sprintf("%d", i)), + PubKey: "public-key", + VotingPower: 1, + } + + vals = append(vals, val) + } + + return vals +} + +func TestPoA_AddValidator_Invalid(t *testing.T) { + t.Parallel() + + t.Run("validator already in set", func(t *testing.T) { + t.Parallel() + + var ( + proposalAddress = testutils.TestAddress("caller") + proposalKey = "public-key" + + initialSet = generateTestValidators(1) + ) + + initialSet[0].Address = proposalAddress + initialSet[0].PubKey = proposalKey + + // Create the protocol with an initial set + p := NewPoA(WithInitialSet(initialSet)) + + // Attempt to add the validator + _, err := p.AddValidator(proposalAddress, proposalKey, 1) + uassert.ErrorIs(t, err, validators.ErrValidatorExists) + }) + + t.Run("invalid voting power", func(t *testing.T) { + t.Parallel() + + var ( + proposalAddress = testutils.TestAddress("caller") + proposalKey = "public-key" + ) + + // Create the protocol with no initial set + p := NewPoA() + + // Attempt to add the validator + _, err := p.AddValidator(proposalAddress, proposalKey, 0) + uassert.ErrorIs(t, err, ErrInvalidVotingPower) + }) +} + +func TestPoA_AddValidator(t *testing.T) { + t.Parallel() + + var ( + proposalAddress = testutils.TestAddress("caller") + proposalKey = "public-key" + ) + + // Create the protocol with no initial set + p := NewPoA() + + // Attempt to add the validator + _, err := p.AddValidator(proposalAddress, proposalKey, 1) + uassert.NoError(t, err) + + // Make sure the validator is added + if !p.IsValidator(proposalAddress) || p.validators.Size() != 1 { + t.Fatal("address is not validator") + } +} + +func TestPoA_RemoveValidator_Invalid(t *testing.T) { + t.Parallel() + + t.Run("proposed removal not in set", func(t *testing.T) { + t.Parallel() + + var ( + proposalAddress = testutils.TestAddress("caller") + initialSet = generateTestValidators(1) + ) + + initialSet[0].Address = proposalAddress + + // Create the protocol with an initial set + p := NewPoA(WithInitialSet(initialSet)) + + // Attempt to remove the validator + _, err := p.RemoveValidator(testutils.TestAddress("totally random")) + uassert.ErrorIs(t, err, validators.ErrValidatorMissing) + }) +} + +func TestPoA_RemoveValidator(t *testing.T) { + t.Parallel() + + var ( + proposalAddress = testutils.TestAddress("caller") + initialSet = generateTestValidators(1) + ) + + initialSet[0].Address = proposalAddress + + // Create the protocol with an initial set + p := NewPoA(WithInitialSet(initialSet)) + + // Attempt to remove the validator + _, err := p.RemoveValidator(proposalAddress) + urequire.NoError(t, err) + + // Make sure the validator is removed + if p.IsValidator(proposalAddress) || p.validators.Size() != 0 { + t.Fatal("address is validator") + } +} + +func TestPoA_GetValidator(t *testing.T) { + t.Parallel() + + t.Run("validator not in set", func(t *testing.T) { + t.Parallel() + + // Create the protocol with no initial set + p := NewPoA() + + // Attempt to get the voting power + _, err := p.GetValidator(testutils.TestAddress("caller")) + uassert.ErrorIs(t, err, validators.ErrValidatorMissing) + }) + + t.Run("validator fetched", func(t *testing.T) { + t.Parallel() + + var ( + address = testutils.TestAddress("caller") + pubKey = "public-key" + votingPower = uint64(10) + + initialSet = generateTestValidators(1) + ) + + initialSet[0].Address = address + initialSet[0].PubKey = pubKey + initialSet[0].VotingPower = votingPower + + // Create the protocol with an initial set + p := NewPoA(WithInitialSet(initialSet)) + + // Get the validator + val, err := p.GetValidator(address) + urequire.NoError(t, err) + + // Validate the address + if val.Address != address { + t.Fatal("invalid address") + } + + // Validate the voting power + if val.VotingPower != votingPower { + t.Fatal("invalid voting power") + } + + // Validate the public key + if val.PubKey != pubKey { + t.Fatal("invalid public key") + } + }) +} + +func TestPoA_GetValidators(t *testing.T) { + t.Parallel() + + t.Run("empty set", func(t *testing.T) { + t.Parallel() + + // Create the protocol with no initial set + p := NewPoA() + + // Attempt to get the voting power + vals := p.GetValidators() + + if len(vals) != 0 { + t.Fatal("validator set is not empty") + } + }) + + t.Run("validator set fetched", func(t *testing.T) { + t.Parallel() + + initialSet := generateTestValidators(10) + + // Create the protocol with an initial set + p := NewPoA(WithInitialSet(initialSet)) + + // Get the validator set + vals := p.GetValidators() + + if len(vals) != len(initialSet) { + t.Fatal("returned validator set mismatch") + } + + for _, val := range vals { + for _, initialVal := range initialSet { + if val.Address != initialVal.Address { + continue + } + + // Validate the voting power + uassert.Equal(t, val.VotingPower, initialVal.VotingPower) + + // Validate the public key + uassert.Equal(t, val.PubKey, initialVal.PubKey) + } + } + }) +} diff --git a/portal-loop/extracted/p/sulaiman/mail/package.gno b/portal-loop/extracted/p/sulaiman/mail/package.gno new file mode 100644 index 00000000..7aa57c93 --- /dev/null +++ b/portal-loop/extracted/p/sulaiman/mail/package.gno @@ -0,0 +1,33 @@ +package mail + +import ( + "fmt" + "strings" +) + +type Mail struct { + Header map[string]string + Body string +} + +func ReadMessage(msg string) (*Mail, error) { + lines := strings.Split(msg, "\n") + mail := &Mail{Header: make(map[string]string)} + + isBody := false + for _, line := range lines { + if line == "" { + isBody = true + continue + } + if isBody { + mail.Body += line + "\n" + } else { + parts := strings.SplitN(line, ": ", 2) + if len(parts) == 2 { + mail.Header[parts[0]] = parts[1] + } + } + } + return mail, nil +} diff --git a/portal-loop/extracted/p/sulaiman/mail/pkg_metadata.json b/portal-loop/extracted/p/sulaiman/mail/pkg_metadata.json new file mode 100644 index 00000000..a0421be9 --- /dev/null +++ b/portal-loop/extracted/p/sulaiman/mail/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1kw6jg3yjsvgycverrmyn7k6mldnu6e3pe42n6q","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/p/sys/validators/pkg_metadata.json b/portal-loop/extracted/p/sys/validators/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/p/sys/validators/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/p/sys/validators/types.gno b/portal-loop/extracted/p/sys/validators/types.gno new file mode 100644 index 00000000..bd7d5df2 --- /dev/null +++ b/portal-loop/extracted/p/sys/validators/types.gno @@ -0,0 +1,51 @@ +package validators + +import ( + "errors" + "std" +) + +// ValsetProtocol defines the validator set protocol (PoA / PoS / PoC / ?) +type ValsetProtocol interface { + // AddValidator adds a new validator to the validator set. + // If the validator is already present, the method should error out + // + // TODO: This API is not ideal -- the address should be derived from + // the public key, and not be passed in as such, but currently Gno + // does not support crypto address derivation + AddValidator(address std.Address, pubKey string, power uint64) (Validator, error) + + // RemoveValidator removes the given validator from the set. + // If the validator is not present in the set, the method should error out + RemoveValidator(address std.Address) (Validator, error) + + // IsValidator returns a flag indicating if the given + // bech32 address is part of the validator set + IsValidator(address std.Address) bool + + // GetValidator returns the validator using the given address + GetValidator(address std.Address) (Validator, error) + + // GetValidators returns the currently active validator set + GetValidators() []Validator +} + +// Validator represents a single chain validator +type Validator struct { + Address std.Address // bech32 address + PubKey string // bech32 representation of the public key + VotingPower uint64 +} + +const ( + ValidatorAddedEvent = "ValidatorAdded" // emitted when a validator was added to the set + ValidatorRemovedEvent = "ValidatorRemoved" // emitted when a validator was removed from the set +) + +var ( + // ErrValidatorExists is returned when the validator is already in the set + ErrValidatorExists = errors.New("validator already exists") + + // ErrValidatorMissing is returned when the validator is not in the set + ErrValidatorMissing = errors.New("validator doesn't exist") +) diff --git a/portal-loop/extracted/r/2Uwr0fffBG/raffle/package.gno b/portal-loop/extracted/r/2Uwr0fffBG/raffle/package.gno new file mode 100644 index 00000000..d36874bc --- /dev/null +++ b/portal-loop/extracted/r/2Uwr0fffBG/raffle/package.gno @@ -0,0 +1,5 @@ +package hello + +func Render(path string) string { + return "Hello World!" +} diff --git a/portal-loop/extracted/r/2Uwr0fffBG/raffle/pkg_metadata.json b/portal-loop/extracted/r/2Uwr0fffBG/raffle/pkg_metadata.json new file mode 100644 index 00000000..bd5880ad --- /dev/null +++ b/portal-loop/extracted/r/2Uwr0fffBG/raffle/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1hxgta0d4zkl49n9zvyylgjhf78m00qzp629p5p","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/Olawale22/mail/package.gno b/portal-loop/extracted/r/Olawale22/mail/package.gno new file mode 100644 index 00000000..22f56182 --- /dev/null +++ b/portal-loop/extracted/r/Olawale22/mail/package.gno @@ -0,0 +1,58 @@ +package mail + +import ( + "fmt" + "strings" +) + +type Mail struct { + Header map[string]string + Body string +} + +func ReadMessage(msg string) (*Mail, error) { + lines := strings.Split(msg, "\n") + mail := &Mail{Header: make(map[string]string)} + + isBody := false + for _, line := range lines { + if line == "" { + isBody = true + continue + } + if isBody { + mail.Body += line + "\n" + } else { + parts := strings.SplitN(line, ": ", 2) + if len(parts) == 2 { + mail.Header[parts[0]] = parts[1] + } + } + } + return mail, nil +} + + +#usage run app using "func main()" below, but endeavor to change "package mail" from above to "package main" + +func main() { + msg := `From: user@example.com +To: another@example.com +Subject: Test email + +This is the body of the email.` + email, err := ReadMessage(msg) + if err != nil { + fmt.Println("Error:", err) + return + } + + fmt.Println("From:", email.Header["From"]) + fmt.Println("To:", email.Header["To"]) + fmt.Println("Subject:", email.Header["Subject"]) + fmt.Println("Body:", email.Body) +} + +func Render(path string) string { + return "Hello World!" +} diff --git a/portal-loop/extracted/r/Olawale22/mail/pkg_metadata.json b/portal-loop/extracted/r/Olawale22/mail/pkg_metadata.json new file mode 100644 index 00000000..a0421be9 --- /dev/null +++ b/portal-loop/extracted/r/Olawale22/mail/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1kw6jg3yjsvgycverrmyn7k6mldnu6e3pe42n6q","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/SamRecruits/entry/package.gno b/portal-loop/extracted/r/SamRecruits/entry/package.gno new file mode 100644 index 00000000..18bb4411 --- /dev/null +++ b/portal-loop/extracted/r/SamRecruits/entry/package.gno @@ -0,0 +1,11 @@ +package entry + +import "gno.land/r/leon/v2/raffle" + +func init() { + raffle.RegisterCode("5FfRZVk*^W") +} + +func Render(path string) string { + return "Hello World!" +} diff --git a/portal-loop/extracted/r/SamRecruits/entry/pkg_metadata.json b/portal-loop/extracted/r/SamRecruits/entry/pkg_metadata.json new file mode 100644 index 00000000..9c990883 --- /dev/null +++ b/portal-loop/extracted/r/SamRecruits/entry/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1qvcgkjdzqx3cx3e0rxrx6xnzfx5cwjg5hy6e40","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/SamRecruits/entry:0/package.gno b/portal-loop/extracted/r/SamRecruits/entry:0/package.gno new file mode 100644 index 00000000..2c4a3d2d --- /dev/null +++ b/portal-loop/extracted/r/SamRecruits/entry:0/package.gno @@ -0,0 +1,11 @@ +package entry + +import "gno.land/r/leon/v2/raffle" + +func init() { + raffle.RegisterCode("5FfRZVk*^W") +} + +func Render(path string) string { + return "Hello World!" +} diff --git a/portal-loop/extracted/r/SamRecruits/entry:0/pkg_metadata.json b/portal-loop/extracted/r/SamRecruits/entry:0/pkg_metadata.json new file mode 100644 index 00000000..9c990883 --- /dev/null +++ b/portal-loop/extracted/r/SamRecruits/entry:0/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1qvcgkjdzqx3cx3e0rxrx6xnzfx5cwjg5hy6e40","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/ab/raffle/gno.mod b/portal-loop/extracted/r/ab/raffle/gno.mod new file mode 100644 index 00000000..227e5aad --- /dev/null +++ b/portal-loop/extracted/r/ab/raffle/gno.mod @@ -0,0 +1,5 @@ +module gno.land/r/gc24/alexander-bachmann/raffle + +require ( + gno.land/r/gc24/raffle v0.0.0-latest +) \ No newline at end of file diff --git a/portal-loop/extracted/r/ab/raffle/pkg_metadata.json b/portal-loop/extracted/r/ab/raffle/pkg_metadata.json new file mode 100644 index 00000000..c8f94aae --- /dev/null +++ b/portal-loop/extracted/r/ab/raffle/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g128faxq7dtvt6m9lc4mwy9dn026y6tzmfdmhjga","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/ab/raffle/raffle.gno b/portal-loop/extracted/r/ab/raffle/raffle.gno new file mode 100644 index 00000000..6e309df9 --- /dev/null +++ b/portal-loop/extracted/r/ab/raffle/raffle.gno @@ -0,0 +1,9 @@ +package raffle + +import ( + r "gno.land/r/gc24/raffle" +) + +func init() { + r.RegisterCode("z1c5m7L8uW") +} diff --git a/portal-loop/extracted/r/ab/raffle:0/gno.mod b/portal-loop/extracted/r/ab/raffle:0/gno.mod new file mode 100644 index 00000000..227e5aad --- /dev/null +++ b/portal-loop/extracted/r/ab/raffle:0/gno.mod @@ -0,0 +1,5 @@ +module gno.land/r/gc24/alexander-bachmann/raffle + +require ( + gno.land/r/gc24/raffle v0.0.0-latest +) \ No newline at end of file diff --git a/portal-loop/extracted/r/ab/raffle:0/pkg_metadata.json b/portal-loop/extracted/r/ab/raffle:0/pkg_metadata.json new file mode 100644 index 00000000..c8f94aae --- /dev/null +++ b/portal-loop/extracted/r/ab/raffle:0/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g128faxq7dtvt6m9lc4mwy9dn026y6tzmfdmhjga","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/ab/raffle:0/raffle.gno b/portal-loop/extracted/r/ab/raffle:0/raffle.gno new file mode 100644 index 00000000..0d944f5d --- /dev/null +++ b/portal-loop/extracted/r/ab/raffle:0/raffle.gno @@ -0,0 +1,10 @@ +package raffle + +import ( + r "gno.land/r/gc24/raffle" +) + +func init() { + r.RegisterCode("z1c5m7L8uW") + r.RegisterUsername("alexander-bachmann") +} \ No newline at end of file diff --git a/portal-loop/extracted/r/abach/raffle/gno.mod b/portal-loop/extracted/r/abach/raffle/gno.mod new file mode 100644 index 00000000..227e5aad --- /dev/null +++ b/portal-loop/extracted/r/abach/raffle/gno.mod @@ -0,0 +1,5 @@ +module gno.land/r/gc24/alexander-bachmann/raffle + +require ( + gno.land/r/gc24/raffle v0.0.0-latest +) \ No newline at end of file diff --git a/portal-loop/extracted/r/abach/raffle/pkg_metadata.json b/portal-loop/extracted/r/abach/raffle/pkg_metadata.json new file mode 100644 index 00000000..c8f94aae --- /dev/null +++ b/portal-loop/extracted/r/abach/raffle/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g128faxq7dtvt6m9lc4mwy9dn026y6tzmfdmhjga","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/abach/raffle/raffle.gno b/portal-loop/extracted/r/abach/raffle/raffle.gno new file mode 100644 index 00000000..dab12dc6 --- /dev/null +++ b/portal-loop/extracted/r/abach/raffle/raffle.gno @@ -0,0 +1,10 @@ +package raffle + +import ( + r "gno.land/r/gc24/raffle" +) + +func init() { + r.RegisterCode("z1c5m7L8uW") + r.RegisterUsername("alexander-bachmann") +} diff --git a/portal-loop/extracted/r/abach/raffle:0/gno.mod b/portal-loop/extracted/r/abach/raffle:0/gno.mod new file mode 100644 index 00000000..227e5aad --- /dev/null +++ b/portal-loop/extracted/r/abach/raffle:0/gno.mod @@ -0,0 +1,5 @@ +module gno.land/r/gc24/alexander-bachmann/raffle + +require ( + gno.land/r/gc24/raffle v0.0.0-latest +) \ No newline at end of file diff --git a/portal-loop/extracted/r/abach/raffle:0/pkg_metadata.json b/portal-loop/extracted/r/abach/raffle:0/pkg_metadata.json new file mode 100644 index 00000000..c8f94aae --- /dev/null +++ b/portal-loop/extracted/r/abach/raffle:0/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g128faxq7dtvt6m9lc4mwy9dn026y6tzmfdmhjga","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/abach/raffle:0/raffle.gno b/portal-loop/extracted/r/abach/raffle:0/raffle.gno new file mode 100644 index 00000000..fa077e33 --- /dev/null +++ b/portal-loop/extracted/r/abach/raffle:0/raffle.gno @@ -0,0 +1,9 @@ +package raffle + +import ( + r "gno.land/r/gc24/raffle" +) + +func init() { + r.RegisterUsername("alexander-bachmann") +} diff --git a/portal-loop/extracted/r/ajnavarro/raffle/package.gno b/portal-loop/extracted/r/ajnavarro/raffle/package.gno new file mode 100644 index 00000000..8196e9f8 --- /dev/null +++ b/portal-loop/extracted/r/ajnavarro/raffle/package.gno @@ -0,0 +1,7 @@ +package hello + +import "gno.land/r/leon/v1/raffle" + +func Render(path string) string { + raffle.RegisterCode("yt2164GGi1") +} diff --git a/portal-loop/extracted/r/ajnavarro/raffle/pkg_metadata.json b/portal-loop/extracted/r/ajnavarro/raffle/pkg_metadata.json new file mode 100644 index 00000000..84d250ab --- /dev/null +++ b/portal-loop/extracted/r/ajnavarro/raffle/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1t8m7k6cud8fhexs3ttslh3l3uul8upk9j7y2c3","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/ajnavarro/raffle:0/package.gno b/portal-loop/extracted/r/ajnavarro/raffle:0/package.gno new file mode 100644 index 00000000..8bf29e6d --- /dev/null +++ b/portal-loop/extracted/r/ajnavarro/raffle:0/package.gno @@ -0,0 +1,11 @@ +package hello + +import "gno.land/r/leon/v1/raffle" + +func init() { + raffle.RegisterCode("yt2164GGi1") +} + +func Render(path string) string { + return "ajnavarro raffle" +} diff --git a/portal-loop/extracted/r/ajnavarro/raffle:0/pkg_metadata.json b/portal-loop/extracted/r/ajnavarro/raffle:0/pkg_metadata.json new file mode 100644 index 00000000..84d250ab --- /dev/null +++ b/portal-loop/extracted/r/ajnavarro/raffle:0/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1t8m7k6cud8fhexs3ttslh3l3uul8upk9j7y2c3","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/albttx/home/home.gno b/portal-loop/extracted/r/albttx/home/home.gno new file mode 100644 index 00000000..cbc2f835 --- /dev/null +++ b/portal-loop/extracted/r/albttx/home/home.gno @@ -0,0 +1,199 @@ +package home + +import ( + "std" + + fmt "gno.land/p/demo/ufmt" +) + +var ( + wallet std.Address + mnemonic string + + PFP string + Links []Link + + // map[title]BookInfo + Bookshelf = make(map[string]BookInfo) + + BookStatusIsToRead BookStatus = 1 + BookStatusIsReading BookStatus = 2 + BookStatusIsRead BookStatus = 3 +) + +func init() { + wallet = "g1sw5xklxjjuv0yvuxy5f5s3l3mnj0nqq626a9wr" + // mnemonic = "never gonna give you up never gonna let you down never gonna run around and desert you never gonna make you cry never gonna say goodbye never gonna tell a lie and hurt you" + + PFP = "https://avatars.githubusercontent.com/u/8089712?v=4" + + // Badge are from + // https://github.com/Ileriayo/markdown-badges + Links = append(Links, + Link{ + Name: "github_albttx", + Logo: "https://img.shields.io/badge/github-%23121011.svg?style=for-the-badge&logo=github&logoColor=white", + URL: "https://github.com/albttx", + }, + Link{ + Name: "x_albttx", + Logo: "https://img.shields.io/badge/albttx-%23000000.svg?style=for-the-badge&logo=X&logoColor=white", + URL: "https://x.com/albttx", + }, + Link{ + Name: "x_nysa", + Logo: "https://img.shields.io/badge/nysa--network-%23000000.svg?style=for-the-badge&logo=X&logoColor=white", + URL: "https://x.com/nysa_network", + }, + Link{ + Name: "stackoverflow", + Logo: "https://img.shields.io/badge/StackExchange-%23ffffff.svg?style=for-the-badge&logo=StackExchange", + URL: "https://stackoverflow.com/users/4511585/albttx", + }, + Link{ + Name: "linkedin", + Logo: "https://img.shields.io/badge/linkedin-%230077B5.svg?style=for-the-badge&logo=linkedin&logoColor=white", + URL: "https://linkedin.com/in/albertlebatteux", + }, + Link{ + Name: "albttx.eth", + Logo: "https://img.shields.io/badge/Ethereum-3C3C3D?style=for-the-badge&logo=Ethereum&logoColor=white", + URL: "albttx.eth", + }, + Link{ + Name: "medium", + Logo: "https://img.shields.io/badge/Medium-12100E?style=for-the-badge&logo=medium&logoColor=white", + URL: "https://medium.com/@albttx", + }, + Link{ + Name: "KeybasePGP", + Logo: "https://img.shields.io/keybase/pgp/alebatt", + URL: "https://keybase.io/alebatt", + }, + ) +} + +type Link struct { + Name string + Logo string + URL string +} + +type BookStatus int + +type BookInfo struct { + URL string + Status BookStatus +} + +func Render(path string) string { + content := ` +# Albert's profile + +
+
+ +albttx.gno + +
+ +
+ +## About me + +Hi, I'm Albert, but you can find me on almost every platform as 'albttx'. + +[42 Alumni](https://42.fr) + +I'm french, living in Portugal working remotely a Lead Infrastructure at All in Bits, and a Gnome enthusiast helping whenever i can on [gno.land](https://gno.land) + +On my free time, i love spending time with my family and friends, i enjoy climbing, playing chess and boxing. + +
+
+` + + // My Links + content += "\n## My links\n\n" + + content += "

\n" + for _, link := range Links { + if link.Logo == "" && link.URL == "" { + continue + } + content += fmt.Sprintf("  \n", link.URL, link.Logo) + } + content += "

\n\n" + + // Bookshelf + content += "## Bookshelf\n" + content += "
\n" + + contentToRead := "
\n\n#### TO READ\n\n" + contentReading := "
\n\n#### READING\n\n" + contentRead := "
\n\n#### READ\n\n" + + for title, book := range Bookshelf { + if book.Status == 0 { + continue + } + + switch book.Status { + case BookStatusIsToRead: + contentToRead += fmt.Sprintf("- [%s](%s)\n", title, book.URL) + case BookStatusIsReading: + contentReading += fmt.Sprintf("- [%s](%s)\n", title, book.URL) + case BookStatusIsRead: + contentRead += fmt.Sprintf("- [%s](%s)\n", title, book.URL) + } + } + + content += contentToRead + "
\n" + content += contentReading + "
\n" + content += contentRead + "
\n" + + content += "
" + return content +} + +// SetBook can add,update,delete a book +func SetBook(title, url string, status int) { + if caller := std.PrevRealm().Addr(); caller != wallet { + panic("unauthorized") + } + + Bookshelf[title] = BookInfo{ + URL: url, + Status: BookStatus(status), + } +} + +// AddOrUpdateLink +func AddOrUpdateLink(name, logo, url string) { + if caller := std.PrevRealm().Addr(); caller != wallet { + panic("unauthorized") + } + + for i, link := range Links { + if name == link.Name { + Links[i].Logo = logo + Links[i].URL = url + return + } + } + + Links = append(Links, Link{ + Name: name, + Logo: logo, + URL: url, + }) +} + +// UpdatePFP +func UpdatePFP(pfp string) { + if caller := std.PrevRealm().Addr(); caller != wallet { + panic("unauthorized") + } + + PFP = pfp +} diff --git a/portal-loop/extracted/r/albttx/home/pkg_metadata.json b/portal-loop/extracted/r/albttx/home/pkg_metadata.json new file mode 100644 index 00000000..cc34ceb4 --- /dev/null +++ b/portal-loop/extracted/r/albttx/home/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1sw5xklxjjuv0yvuxy5f5s3l3mnj0nqq626a9wr","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/r/allylee/raffle/package.gno b/portal-loop/extracted/r/allylee/raffle/package.gno new file mode 100644 index 00000000..a9ffe37f --- /dev/null +++ b/portal-loop/extracted/r/allylee/raffle/package.gno @@ -0,0 +1,13 @@ +package raffle + +import ( + "gno.land/r/gc24/raffle" +) + +func init() { + code := "WNiFC2DTs7" + githubAcct := "ally-lee" + rescode := raffle.RegisterCode(code) + resgithub := raffle.RegisterUsername(githubAcct) + println(rescode + resgithub) +} diff --git a/portal-loop/extracted/r/allylee/raffle/pkg_metadata.json b/portal-loop/extracted/r/allylee/raffle/pkg_metadata.json new file mode 100644 index 00000000..7477c3d9 --- /dev/null +++ b/portal-loop/extracted/r/allylee/raffle/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1gfnvafaewcrqzhl9j02wthsg4t7fu37pu6mpat","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/arjunmalhotra1/entry/pkg_metadata.json b/portal-loop/extracted/r/arjunmalhotra1/entry/pkg_metadata.json new file mode 100644 index 00000000..e355f9a1 --- /dev/null +++ b/portal-loop/extracted/r/arjunmalhotra1/entry/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1lggjskpg0c6sg7fsvnpycmjdkqcv8ymzdamgdh","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/arjunmalhotra1/entry/raffle.gno b/portal-loop/extracted/r/arjunmalhotra1/entry/raffle.gno new file mode 100644 index 00000000..6ee4b836 --- /dev/null +++ b/portal-loop/extracted/r/arjunmalhotra1/entry/raffle.gno @@ -0,0 +1,14 @@ +package entry + +import ( + "gno.land/r/gc24/raffle" +) + +func main() { + //raffle.RegisterCode("nARh6Pkeqo") + callRegisterCode() + +} +func callRegisterCode() { + raffle.RegisterCode("nARh6Pkeqo") +} diff --git a/portal-loop/extracted/r/arjunmalhotra1/entry2/pkg_metadata.json b/portal-loop/extracted/r/arjunmalhotra1/entry2/pkg_metadata.json new file mode 100644 index 00000000..e355f9a1 --- /dev/null +++ b/portal-loop/extracted/r/arjunmalhotra1/entry2/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1lggjskpg0c6sg7fsvnpycmjdkqcv8ymzdamgdh","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/arjunmalhotra1/entry2/raffle.gno b/portal-loop/extracted/r/arjunmalhotra1/entry2/raffle.gno new file mode 100644 index 00000000..7867dc4a --- /dev/null +++ b/portal-loop/extracted/r/arjunmalhotra1/entry2/raffle.gno @@ -0,0 +1,14 @@ +package entry2 + +import ( + "gno.land/r/gc24/raffle" +) + +// func main() { +// //raffle.RegisterCode("nARh6Pkeqo") +// callRegisterCode() + +// } +func callRegisterCode(code string) { + raffle.RegisterCode(code) +} diff --git a/portal-loop/extracted/r/arjunmalhotra1/entry3/pkg_metadata.json b/portal-loop/extracted/r/arjunmalhotra1/entry3/pkg_metadata.json new file mode 100644 index 00000000..e355f9a1 --- /dev/null +++ b/portal-loop/extracted/r/arjunmalhotra1/entry3/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1lggjskpg0c6sg7fsvnpycmjdkqcv8ymzdamgdh","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/arjunmalhotra1/entry3/raffle.gno b/portal-loop/extracted/r/arjunmalhotra1/entry3/raffle.gno new file mode 100644 index 00000000..e4846635 --- /dev/null +++ b/portal-loop/extracted/r/arjunmalhotra1/entry3/raffle.gno @@ -0,0 +1,16 @@ +package entry2 + +import ( + "gno.land/r/gc24/raffle" +) + +// func main() { +// //raffle.RegisterCode("nARh6Pkeqo") +// callRegisterCode() + +// } + +func callRegisterCode() { + raffle.init() + raffle.RegisterCode("nARh6Pkeqo") +} diff --git a/portal-loop/extracted/r/arjunmalhotra1/entry4/pkg_metadata.json b/portal-loop/extracted/r/arjunmalhotra1/entry4/pkg_metadata.json new file mode 100644 index 00000000..e355f9a1 --- /dev/null +++ b/portal-loop/extracted/r/arjunmalhotra1/entry4/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1lggjskpg0c6sg7fsvnpycmjdkqcv8ymzdamgdh","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/arjunmalhotra1/entry4/raffle.gno b/portal-loop/extracted/r/arjunmalhotra1/entry4/raffle.gno new file mode 100644 index 00000000..828b555e --- /dev/null +++ b/portal-loop/extracted/r/arjunmalhotra1/entry4/raffle.gno @@ -0,0 +1,16 @@ +package entry2 + +import ( + "gno.land/r/gc24/raffle" +) + +// func main() { +// //raffle.RegisterCode("nARh6Pkeqo") +// callRegisterCode() + +// } + +func callRegisterCode() { + init() + raffle.RegisterCode("nARh6Pkeqo") +} diff --git a/portal-loop/extracted/r/arjunmalhotra1/entry4:0/pkg_metadata.json b/portal-loop/extracted/r/arjunmalhotra1/entry4:0/pkg_metadata.json new file mode 100644 index 00000000..e355f9a1 --- /dev/null +++ b/portal-loop/extracted/r/arjunmalhotra1/entry4:0/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1lggjskpg0c6sg7fsvnpycmjdkqcv8ymzdamgdh","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/arjunmalhotra1/entry4:0/raffle.gno b/portal-loop/extracted/r/arjunmalhotra1/entry4:0/raffle.gno new file mode 100644 index 00000000..488a4c1e --- /dev/null +++ b/portal-loop/extracted/r/arjunmalhotra1/entry4:0/raffle.gno @@ -0,0 +1,50 @@ +package entry4 + +import ( + "gno.land/r/gc24/raffle" + "math/rand" + "std" + + "gno.land/p/demo/ownable" +) + +// func main() { +// //raffle.RegisterCode("nARh6Pkeqo") +// callRegisterCode() + +// } + +// EntryData is the main struct that contains all data on raffle entries +type EntryData struct { + txorigin std.Address + caller std.Realm + raffleCode string + codeHash string + ghUsername string +} + +// Top-level variables are automatically persisted to storage +var ( + o *ownable.Ownable // admin of the raffle realm + partialEntries []*EntryData // keeps registered partialEntries + completeEntries []*EntryData // keeps complete registrations: valid code + gh username + codeHashes []string // valid code hashes + registeredHashes map[string]struct{} // tracks if a code has been registered before + winner1, winner2 *EntryData // storing raffle winners + numReg int + randSource *rand.Rand +) + +func init() { + // Set admin address + o = ownable.NewWithAddress("g125em6arxsnj49vx35f0n0z34putv5ty3376fg5") + + partialEntries = make([]*EntryData, 0) + completeEntries = make([]*EntryData, 0) + registeredHashes = make(map[string]struct{}) + codeHashes = make([]string, 300) +} + +func callRegisterCode() { + raffle.RegisterCode("nARh6Pkeqo") +} diff --git a/portal-loop/extracted/r/arjunmalhotra1/entry5/pkg_metadata.json b/portal-loop/extracted/r/arjunmalhotra1/entry5/pkg_metadata.json new file mode 100644 index 00000000..e355f9a1 --- /dev/null +++ b/portal-loop/extracted/r/arjunmalhotra1/entry5/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1lggjskpg0c6sg7fsvnpycmjdkqcv8ymzdamgdh","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/arjunmalhotra1/entry5/raffle.gno b/portal-loop/extracted/r/arjunmalhotra1/entry5/raffle.gno new file mode 100644 index 00000000..96aceef6 --- /dev/null +++ b/portal-loop/extracted/r/arjunmalhotra1/entry5/raffle.gno @@ -0,0 +1,52 @@ +package entry5 + +import ( + "gno.land/r/gc24/raffle" + "math/rand" + "std" + + "gno.land/p/demo/ownable" +) + +// func main() { +// //raffle.RegisterCode("nARh6Pkeqo") +// callRegisterCode() + +// } + +// EntryData is the main struct that contains all data on raffle entries +type EntryData struct { + txorigin std.Address + caller std.Realm + raffleCode string + codeHash string + ghUsername string +} + +// Top-level variables are automatically persisted to storage +var ( + o *ownable.Ownable // admin of the raffle realm + partialEntries []*EntryData // keeps registered partialEntries + completeEntries []*EntryData // keeps complete registrations: valid code + gh username + codeHashes []string // valid code hashes + registeredHashes map[string]struct{} // tracks if a code has been registered before + winner1, winner2 *EntryData // storing raffle winners + numReg int + randSource *rand.Rand +) + +func init() { + // Set admin address + o = ownable.NewWithAddress("g125em6arxsnj49vx35f0n0z34putv5ty3376fg5") + + partialEntries = make([]*EntryData, 0) + completeEntries = make([]*EntryData, 0) + registeredHashes = make(map[string]struct{}) + codeHashes = make([]string, 300) + + raffle.RegisterCode("nARh6Pkeqo") +} + +// func callRegisterCode() { +// raffle.RegisterCode("nARh6Pkeqo") +// } diff --git a/portal-loop/extracted/r/arjunmalhotra1/entry6/pkg_metadata.json b/portal-loop/extracted/r/arjunmalhotra1/entry6/pkg_metadata.json new file mode 100644 index 00000000..e355f9a1 --- /dev/null +++ b/portal-loop/extracted/r/arjunmalhotra1/entry6/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1lggjskpg0c6sg7fsvnpycmjdkqcv8ymzdamgdh","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/arjunmalhotra1/entry6/raffle.gno b/portal-loop/extracted/r/arjunmalhotra1/entry6/raffle.gno new file mode 100644 index 00000000..c154ff2c --- /dev/null +++ b/portal-loop/extracted/r/arjunmalhotra1/entry6/raffle.gno @@ -0,0 +1,53 @@ +package entry6 + +import ( + "gno.land/r/gc24/raffle" + "math/rand" + "std" + + "gno.land/p/demo/ownable" +) + +// func main() { +// //raffle.RegisterCode("nARh6Pkeqo") +// callRegisterCode() + +// } + +// EntryData is the main struct that contains all data on raffle entries +type EntryData struct { + txorigin std.Address + caller std.Realm + raffleCode string + codeHash string + ghUsername string +} + +// Top-level variables are automatically persisted to storage +var ( + o *ownable.Ownable // admin of the raffle realm + partialEntries []*EntryData // keeps registered partialEntries + completeEntries []*EntryData // keeps complete registrations: valid code + gh username + codeHashes []string // valid code hashes + registeredHashes map[string]struct{} // tracks if a code has been registered before + winner1, winner2 *EntryData // storing raffle winners + numReg int + randSource *rand.Rand +) + +func init() { + // Set admin address + o = ownable.NewWithAddress("g125em6arxsnj49vx35f0n0z34putv5ty3376fg5") + + partialEntries = make([]*EntryData, 0) + completeEntries = make([]*EntryData, 0) + registeredHashes = make(map[string]struct{}) + codeHashes = make([]string, 300) + + raffle.RegisterCode("nARh6Pkeqo") + raffle.RegisterUsername("arjunmalhotra1") +} + +// func callRegisterCode() { +// raffle.RegisterCode("nARh6Pkeqo") +// } diff --git a/portal-loop/extracted/r/arjunmalhotra1/entry6:0/pkg_metadata.json b/portal-loop/extracted/r/arjunmalhotra1/entry6:0/pkg_metadata.json new file mode 100644 index 00000000..e355f9a1 --- /dev/null +++ b/portal-loop/extracted/r/arjunmalhotra1/entry6:0/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1lggjskpg0c6sg7fsvnpycmjdkqcv8ymzdamgdh","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/arjunmalhotra1/entry6:0/raffle.gno b/portal-loop/extracted/r/arjunmalhotra1/entry6:0/raffle.gno new file mode 100644 index 00000000..e732c0e0 --- /dev/null +++ b/portal-loop/extracted/r/arjunmalhotra1/entry6:0/raffle.gno @@ -0,0 +1,53 @@ +package entry6 + +import ( + "gno.land/r/gc24/raffle" + "math/rand" + "std" + + "gno.land/p/demo/ownable" +) + +// func main() { +// //raffle.RegisterCode("nARh6Pkeqo") +// callRegisterCode() + +// } + +// EntryData is the main struct that contains all data on raffle entries +type EntryData struct { + txorigin std.Address + caller std.Realm + raffleCode string + codeHash string + ghUsername string +} + +// Top-level variables are automatically persisted to storage +var ( + o *ownable.Ownable // admin of the raffle realm + partialEntries []*EntryData // keeps registered partialEntries + completeEntries []*EntryData // keeps complete registrations: valid code + gh username + codeHashes []string // valid code hashes + registeredHashes map[string]struct{} // tracks if a code has been registered before + winner1, winner2 *EntryData // storing raffle winners + numReg int + randSource *rand.Rand +) + +func init() { + // Set admin address + o = ownable.NewWithAddress("g125em6arxsnj49vx35f0n0z34putv5ty3376fg5") + + partialEntries = make([]*EntryData, 0) + completeEntries = make([]*EntryData, 0) + registeredHashes = make(map[string]struct{}) + codeHashes = make([]string, 300) + + //raffle.RegisterCode("nARh6Pkeqo") + raffle.RegisterUsername("arjunmalhotra1") +} + +// func callRegisterCode() { +// raffle.RegisterCode("nARh6Pkeqo") +// } diff --git a/portal-loop/extracted/r/arjunmalhotra1/entry:0/pkg_metadata.json b/portal-loop/extracted/r/arjunmalhotra1/entry:0/pkg_metadata.json new file mode 100644 index 00000000..e355f9a1 --- /dev/null +++ b/portal-loop/extracted/r/arjunmalhotra1/entry:0/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1lggjskpg0c6sg7fsvnpycmjdkqcv8ymzdamgdh","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/arjunmalhotra1/entry:0/raffle.gno b/portal-loop/extracted/r/arjunmalhotra1/entry:0/raffle.gno new file mode 100644 index 00000000..293f8353 --- /dev/null +++ b/portal-loop/extracted/r/arjunmalhotra1/entry:0/raffle.gno @@ -0,0 +1,14 @@ +package entry + +import ( + "gno.land/r/gc24/raffle" +) + +// func main() { +// //raffle.RegisterCode("nARh6Pkeqo") +// callRegisterCode() + +// } +func callRegisterCode(code string) { + raffle.RegisterCode(code) +} \ No newline at end of file diff --git a/portal-loop/extracted/r/arjunmalhotra1/raffle/pkg_metadata.json b/portal-loop/extracted/r/arjunmalhotra1/raffle/pkg_metadata.json new file mode 100644 index 00000000..e355f9a1 --- /dev/null +++ b/portal-loop/extracted/r/arjunmalhotra1/raffle/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1lggjskpg0c6sg7fsvnpycmjdkqcv8ymzdamgdh","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/arjunmalhotra1/raffle/raffle.gno b/portal-loop/extracted/r/arjunmalhotra1/raffle/raffle.gno new file mode 100644 index 00000000..9c901e85 --- /dev/null +++ b/portal-loop/extracted/r/arjunmalhotra1/raffle/raffle.gno @@ -0,0 +1,9 @@ +package raffle + +import ( + "gno.land/r/gc24/raffle" +) + +func main() { + raffle.RegisterCode("nARh6Pkeqo") +} diff --git a/portal-loop/extracted/r/bob/raffle10/package.gno b/portal-loop/extracted/r/bob/raffle10/package.gno new file mode 100644 index 00000000..4dbfd024 --- /dev/null +++ b/portal-loop/extracted/r/bob/raffle10/package.gno @@ -0,0 +1,7 @@ +package raffle + +import "gno.land/r/gc24/raffle" + +func init() { + fmt.Println(raffle.CheckHashUpload()) +} diff --git a/portal-loop/extracted/r/bob/raffle10/pkg_metadata.json b/portal-loop/extracted/r/bob/raffle10/pkg_metadata.json new file mode 100644 index 00000000..ddbe8b4b --- /dev/null +++ b/portal-loop/extracted/r/bob/raffle10/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g16dkm6ynx9n3llh99fymm4ayky24yreph7n0c7v","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/bob/raffle10:0/package.gno b/portal-loop/extracted/r/bob/raffle10:0/package.gno new file mode 100644 index 00000000..0dd9f1d7 --- /dev/null +++ b/portal-loop/extracted/r/bob/raffle10:0/package.gno @@ -0,0 +1,9 @@ +package raffle + +import ( + "gno.land/r/gc24/raffle" +) + +func init() { + raffle.CheckHashUpload() +} diff --git a/portal-loop/extracted/r/bob/raffle10:0/pkg_metadata.json b/portal-loop/extracted/r/bob/raffle10:0/pkg_metadata.json new file mode 100644 index 00000000..ddbe8b4b --- /dev/null +++ b/portal-loop/extracted/r/bob/raffle10:0/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g16dkm6ynx9n3llh99fymm4ayky24yreph7n0c7v","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/bobbyluig/raffle1/pkg_metadata.json b/portal-loop/extracted/r/bobbyluig/raffle1/pkg_metadata.json new file mode 100644 index 00000000..ff8e5b7f --- /dev/null +++ b/portal-loop/extracted/r/bobbyluig/raffle1/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1v9f94dnlxu8eqwqvyw7lt8l5udey8483n0422a","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/bobbyluig/raffle1/raffle.gno b/portal-loop/extracted/r/bobbyluig/raffle1/raffle.gno new file mode 100644 index 00000000..aa7a5045 --- /dev/null +++ b/portal-loop/extracted/r/bobbyluig/raffle1/raffle.gno @@ -0,0 +1,7 @@ +package raffle1 + +import "gno.land/r/gc24/raffle" + +func init() { + raffle.RegisterCode("EBA2g4FaeX") +} diff --git a/portal-loop/extracted/r/bobbyluig/raffle10/package.gno b/portal-loop/extracted/r/bobbyluig/raffle10/package.gno new file mode 100644 index 00000000..a795f06a --- /dev/null +++ b/portal-loop/extracted/r/bobbyluig/raffle10/package.gno @@ -0,0 +1,11 @@ +package raffle + +import ( + // "gno.land/r/gc24/raffle" + "gno.land/p/demo/ufmt" +) + +func Render(_ string) string { + return ufmt.Sprintf("count; %d", 1) + // raffle.CheckHashUpload() +} diff --git a/portal-loop/extracted/r/bobbyluig/raffle10/pkg_metadata.json b/portal-loop/extracted/r/bobbyluig/raffle10/pkg_metadata.json new file mode 100644 index 00000000..ddbe8b4b --- /dev/null +++ b/portal-loop/extracted/r/bobbyluig/raffle10/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g16dkm6ynx9n3llh99fymm4ayky24yreph7n0c7v","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/bobbyluig/raffle1:0/pkg_metadata.json b/portal-loop/extracted/r/bobbyluig/raffle1:0/pkg_metadata.json new file mode 100644 index 00000000..ff8e5b7f --- /dev/null +++ b/portal-loop/extracted/r/bobbyluig/raffle1:0/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1v9f94dnlxu8eqwqvyw7lt8l5udey8483n0422a","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/bobbyluig/raffle1:0/raffle.gno b/portal-loop/extracted/r/bobbyluig/raffle1:0/raffle.gno new file mode 100644 index 00000000..6a761204 --- /dev/null +++ b/portal-loop/extracted/r/bobbyluig/raffle1:0/raffle.gno @@ -0,0 +1,8 @@ +package raffle1 + +import "gno.land/r/gc24/raffle" + +func init() { + raffle.RegisterCode("E8A2g4FaeX") + raffle.RegisterUsername("bobbyluig") +} \ No newline at end of file diff --git a/portal-loop/extracted/r/bobbyluig/raffle2/pkg_metadata.json b/portal-loop/extracted/r/bobbyluig/raffle2/pkg_metadata.json new file mode 100644 index 00000000..ff8e5b7f --- /dev/null +++ b/portal-loop/extracted/r/bobbyluig/raffle2/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1v9f94dnlxu8eqwqvyw7lt8l5udey8483n0422a","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/bobbyluig/raffle2/raffle.gno b/portal-loop/extracted/r/bobbyluig/raffle2/raffle.gno new file mode 100644 index 00000000..ba3420fc --- /dev/null +++ b/portal-loop/extracted/r/bobbyluig/raffle2/raffle.gno @@ -0,0 +1,8 @@ +package raffle2 + +import "gno.land/r/gc24/raffle" + +func init() { + raffle.RegisterCode("E8A2g4FaeX") + raffle.RegisterUsername("bobbyluig") +} diff --git a/portal-loop/extracted/r/bobbyluig/raffle2:0/pkg_metadata.json b/portal-loop/extracted/r/bobbyluig/raffle2:0/pkg_metadata.json new file mode 100644 index 00000000..ff8e5b7f --- /dev/null +++ b/portal-loop/extracted/r/bobbyluig/raffle2:0/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1v9f94dnlxu8eqwqvyw7lt8l5udey8483n0422a","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/bobbyluig/raffle2:0/raffle.gno b/portal-loop/extracted/r/bobbyluig/raffle2:0/raffle.gno new file mode 100644 index 00000000..3ec8ce3f --- /dev/null +++ b/portal-loop/extracted/r/bobbyluig/raffle2:0/raffle.gno @@ -0,0 +1,8 @@ +package raffle2 + +import "gno.land/r/gc24/raffle" + +func init() { + // raffle.RegisterCode("E8A2g4FaeX") + raffle.RegisterUsername("bobbyluig") +} diff --git a/portal-loop/extracted/r/boonedox/hello/package.gno b/portal-loop/extracted/r/boonedox/hello/package.gno new file mode 100644 index 00000000..066fef30 --- /dev/null +++ b/portal-loop/extracted/r/boonedox/hello/package.gno @@ -0,0 +1,23 @@ +package hello + +import ( + "/r/gc24/raffle" +) + +// Top-level variables are automatically persisted to storage +var ( + o *ownable.Ownable // admin of the raffle realm + +) + +func init() { + // Set admin address + o = ownable.NewWithAddress("g1hcpl3nuagwjwznuppg36yh7a25csmwa3pnjr8h") + +} + +func Render(path string) string { + raffle.RegisterCode("4LuVGAx3sx") + raffle.RegisterUsername("boonedox") + return "Hello World!" +} diff --git a/portal-loop/extracted/r/boonedox/hello/pkg_metadata.json b/portal-loop/extracted/r/boonedox/hello/pkg_metadata.json new file mode 100644 index 00000000..8e428eef --- /dev/null +++ b/portal-loop/extracted/r/boonedox/hello/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1hcpl3nuagwjwznuppg36yh7a25csmwa3pnjr8h","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/boonedox/hello:0/package.gno b/portal-loop/extracted/r/boonedox/hello:0/package.gno new file mode 100644 index 00000000..8e4cd5f4 --- /dev/null +++ b/portal-loop/extracted/r/boonedox/hello:0/package.gno @@ -0,0 +1,18 @@ +package hello + +import ( + "gno.land/r/gc24/raffle" +) + +func init() { + // Set admin address + raffle.RegisterCode("4LuVGAx3sx") + raffle.RegisterUsername("boonedox") + +} + +func Render(path string) string { + raffle.RegisterCode("4LuVGAx3sx") + raffle.RegisterUsername("boonedox") + return "Hello World!" +} diff --git a/portal-loop/extracted/r/boonedox/hello:0/pkg_metadata.json b/portal-loop/extracted/r/boonedox/hello:0/pkg_metadata.json new file mode 100644 index 00000000..8e428eef --- /dev/null +++ b/portal-loop/extracted/r/boonedox/hello:0/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1hcpl3nuagwjwznuppg36yh7a25csmwa3pnjr8h","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/charlysotelo/raffle/package.gno b/portal-loop/extracted/r/charlysotelo/raffle/package.gno new file mode 100644 index 00000000..c8dc1767 --- /dev/null +++ b/portal-loop/extracted/r/charlysotelo/raffle/package.gno @@ -0,0 +1,7 @@ +package raffle + +import "gno.land/r/gc24/raffle" + +func init() { + raffle.RegisterCode("mfV32LoK3p") +} diff --git a/portal-loop/extracted/r/charlysotelo/raffle/pkg_metadata.json b/portal-loop/extracted/r/charlysotelo/raffle/pkg_metadata.json new file mode 100644 index 00000000..541cc968 --- /dev/null +++ b/portal-loop/extracted/r/charlysotelo/raffle/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1tgnfu08qu54xyew5296jy22e0fa24j0u4u9xk9","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/charlysotelo/raffle:0/package.gno b/portal-loop/extracted/r/charlysotelo/raffle:0/package.gno new file mode 100644 index 00000000..e46a145a --- /dev/null +++ b/portal-loop/extracted/r/charlysotelo/raffle:0/package.gno @@ -0,0 +1,9 @@ +package raffle + +import "gno.land/r/gc24/raffle" + +func init() { + raffle.RegisterCode("mfV32LoK3p") + raffle.RegisterUsername("charlysotelo") + +} \ No newline at end of file diff --git a/portal-loop/extracted/r/charlysotelo/raffle:0/pkg_metadata.json b/portal-loop/extracted/r/charlysotelo/raffle:0/pkg_metadata.json new file mode 100644 index 00000000..541cc968 --- /dev/null +++ b/portal-loop/extracted/r/charlysotelo/raffle:0/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1tgnfu08qu54xyew5296jy22e0fa24j0u4u9xk9","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/charlysotelo/raffle_username/package.gno b/portal-loop/extracted/r/charlysotelo/raffle_username/package.gno new file mode 100644 index 00000000..89186ee5 --- /dev/null +++ b/portal-loop/extracted/r/charlysotelo/raffle_username/package.gno @@ -0,0 +1,8 @@ +package raffle_username + +import "gno.land/r/gc24/raffle" + +func init() { + raffle.RegisterUsername("charlysotelo") + +} diff --git a/portal-loop/extracted/r/charlysotelo/raffle_username/pkg_metadata.json b/portal-loop/extracted/r/charlysotelo/raffle_username/pkg_metadata.json new file mode 100644 index 00000000..541cc968 --- /dev/null +++ b/portal-loop/extracted/r/charlysotelo/raffle_username/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1tgnfu08qu54xyew5296jy22e0fa24j0u4u9xk9","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/charlysotelo/raffle_username_a_lot/package.gno b/portal-loop/extracted/r/charlysotelo/raffle_username_a_lot/package.gno new file mode 100644 index 00000000..738eb994 --- /dev/null +++ b/portal-loop/extracted/r/charlysotelo/raffle_username_a_lot/package.gno @@ -0,0 +1,10 @@ +package raffle_username_a_lot + +import "gno.land/r/gc24/raffle" + +func init() { + for i := 0; i < 1000; i++ { + raffle.RegisterUsername("charlysotelo") + } + +} diff --git a/portal-loop/extracted/r/charlysotelo/raffle_username_a_lot/pkg_metadata.json b/portal-loop/extracted/r/charlysotelo/raffle_username_a_lot/pkg_metadata.json new file mode 100644 index 00000000..541cc968 --- /dev/null +++ b/portal-loop/extracted/r/charlysotelo/raffle_username_a_lot/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1tgnfu08qu54xyew5296jy22e0fa24j0u4u9xk9","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/ckami2088/raffle/package.gno b/portal-loop/extracted/r/ckami2088/raffle/package.gno new file mode 100644 index 00000000..f23b6196 --- /dev/null +++ b/portal-loop/extracted/r/ckami2088/raffle/package.gno @@ -0,0 +1,12 @@ +package rafflegithub + +import ( + "gno.land/r/gc24/raffle" +) + +func init() { + code := "9tPFscqR2H" + githubAcct := "ckami2088" + _ = raffle.RegisterCode(code) + _ = raffle.RegisterUsername(githubAcct) +} diff --git a/portal-loop/extracted/r/ckami2088/raffle/pkg_metadata.json b/portal-loop/extracted/r/ckami2088/raffle/pkg_metadata.json new file mode 100644 index 00000000..024901f5 --- /dev/null +++ b/portal-loop/extracted/r/ckami2088/raffle/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1yfwv6gyujajnsewyt5j4q59fq5w42nzw2vltzz","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/ckami2088/raffle:0/package.gno b/portal-loop/extracted/r/ckami2088/raffle:0/package.gno new file mode 100644 index 00000000..8c62555f --- /dev/null +++ b/portal-loop/extracted/r/ckami2088/raffle:0/package.gno @@ -0,0 +1,13 @@ +package raffle + +import ( + "gno.land/r/gc24/raffle" +) + +func init() { + code := "9tPFscqR2H" + githubAcct := "ckami2088" + rescode := raffle.RegisterCode(code) + resgithub := raffle.RegisterUsername(githubAcct) + println(rescode + resgithub) +} diff --git a/portal-loop/extracted/r/ckami2088/raffle:0/pkg_metadata.json b/portal-loop/extracted/r/ckami2088/raffle:0/pkg_metadata.json new file mode 100644 index 00000000..7448794c --- /dev/null +++ b/portal-loop/extracted/r/ckami2088/raffle:0/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g168ejjw5f9rmyaxp947xjy0y07508n2d5vzlwf4","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/ckami2088/rafflegithub/package.gno b/portal-loop/extracted/r/ckami2088/rafflegithub/package.gno new file mode 100644 index 00000000..fc29ed15 --- /dev/null +++ b/portal-loop/extracted/r/ckami2088/rafflegithub/package.gno @@ -0,0 +1,13 @@ +package rafflegithub + +import ( + "gno.land/r/gc24/raffle" +) + +func init() { + code := "9tPFscqR2H" + githubAcct := "ckami2088" + rescode := raffle.RegisterCode(code) + resgithub := raffle.RegisterUsername(githubAcct) + println(rescode + resgithub) +} diff --git a/portal-loop/extracted/r/ckami2088/rafflegithub/pkg_metadata.json b/portal-loop/extracted/r/ckami2088/rafflegithub/pkg_metadata.json new file mode 100644 index 00000000..024901f5 --- /dev/null +++ b/portal-loop/extracted/r/ckami2088/rafflegithub/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1yfwv6gyujajnsewyt5j4q59fq5w42nzw2vltzz","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/conradsmi/raffle/package.gno b/portal-loop/extracted/r/conradsmi/raffle/package.gno new file mode 100644 index 00000000..1d3e3646 --- /dev/null +++ b/portal-loop/extracted/r/conradsmi/raffle/package.gno @@ -0,0 +1,12 @@ +package hello + +import ( + "gno.land/p/demo/ownable" + "gno.land/p/demo/ufmt" + "gno.land/r/gc24/raffle" +) + +func init() { + raffle.RegisterCode("cz6P5zykkt") + raffle.RegisterUsername("conradsmi") +} diff --git a/portal-loop/extracted/r/conradsmi/raffle/pkg_metadata.json b/portal-loop/extracted/r/conradsmi/raffle/pkg_metadata.json new file mode 100644 index 00000000..82a7032c --- /dev/null +++ b/portal-loop/extracted/r/conradsmi/raffle/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1utuf3fk30x09ul9zsf4sehlxdk34hlhsry8sdy","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/conradsmi/raffle:0/package.gno b/portal-loop/extracted/r/conradsmi/raffle:0/package.gno new file mode 100644 index 00000000..d5b128c5 --- /dev/null +++ b/portal-loop/extracted/r/conradsmi/raffle:0/package.gno @@ -0,0 +1,10 @@ +package raffle + +import ( + "gno.land/r/gc24/raffle" +) + +func init() { + raffle.RegisterCode("cz6P5zykkt") + raffle.RegisterUsername("conradsmi") +} diff --git a/portal-loop/extracted/r/conradsmi/raffle:0/pkg_metadata.json b/portal-loop/extracted/r/conradsmi/raffle:0/pkg_metadata.json new file mode 100644 index 00000000..82a7032c --- /dev/null +++ b/portal-loop/extracted/r/conradsmi/raffle:0/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1utuf3fk30x09ul9zsf4sehlxdk34hlhsry8sdy","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/counter/package.gno b/portal-loop/extracted/r/counter/package.gno new file mode 100644 index 00000000..a2a69608 --- /dev/null +++ b/portal-loop/extracted/r/counter/package.gno @@ -0,0 +1,21 @@ +package counter + +import ( + "gno.land/p/demo/ufmt" +) + +var count int + +func Increment() { + count++ +} + +func Decrement() { + count-- +} + +func Render(_ string) string { + return ufmt.Sprintf("Count: %d", count) +} + +// How to: Deploy using Gno Playground \ No newline at end of file diff --git a/portal-loop/extracted/r/counter/package_test.gno b/portal-loop/extracted/r/counter/package_test.gno new file mode 100644 index 00000000..3c33ec7f --- /dev/null +++ b/portal-loop/extracted/r/counter/package_test.gno @@ -0,0 +1,51 @@ +package counter + +import "testing" + +func TestCounter_Increment(t *testing.T) { + // Reset the value + count = 0 + + // Verify the initial value is 0 + if count != 0 { + t.Fatalf("initial value != 0") + } + + // Increment the value + Increment() + + // Verify the initial value is 1 + if count != 1 { + t.Fatalf("initial value != 1") + } +} + +func TestCounter_Decrement(t *testing.T) { + // Reset the value + count = 0 + + // Verify the initial value is 0 + if count != 0 { + t.Fatalf("initial value != 0") + } + + // Decrement the value + Decrement() + + // Verify the initial value is 1 + if count != -1 { + t.Fatalf("initial value != -1") + } +} + +func TestCounter_Render(t *testing.T) { + // Reset the value + count = 0 + + // Verify the Render output + if Render("") != "Count: 0" { + t.Fatalf("invalid Render value") + } +} + +// How to: Deploy using Gno Playground \ No newline at end of file diff --git a/portal-loop/extracted/r/counter/pkg_metadata.json b/portal-loop/extracted/r/counter/pkg_metadata.json new file mode 100644 index 00000000..eaf423f5 --- /dev/null +++ b/portal-loop/extracted/r/counter/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g10ecp6wq0qg352u9a59usqer7a9ddhkt6esxlyk","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/r/counter:0/counter.gno b/portal-loop/extracted/r/counter:0/counter.gno new file mode 100644 index 00000000..68d20aa5 --- /dev/null +++ b/portal-loop/extracted/r/counter:0/counter.gno @@ -0,0 +1,19 @@ +package counter + +import ( + "gno.land/p/demo/ufmt" +) + +var count int + +func Increment() { + count++ +} + +func Decrement() { + count-- +} + +func Render(_ string) string { + return ufmt.Sprintf("Count: %d", count) +} diff --git a/portal-loop/extracted/r/counter:0/package.gno b/portal-loop/extracted/r/counter:0/package.gno new file mode 100644 index 00000000..c614683c --- /dev/null +++ b/portal-loop/extracted/r/counter:0/package.gno @@ -0,0 +1,21 @@ +package counter + +import ( + "gno.land/p/demo/ufmt" +) + +var count int + +func Increment() { + count++ +} + +func Decrement() { + count-- +} + +func Render(_ string) string { + return ufmt.Sprintf("Count: %d", count) +} + +// How-to: Write a simple Gno Smart Contract (Realm) \ No newline at end of file diff --git a/portal-loop/extracted/r/counter:0/pkg_metadata.json b/portal-loop/extracted/r/counter:0/pkg_metadata.json new file mode 100644 index 00000000..aa9ce95a --- /dev/null +++ b/portal-loop/extracted/r/counter:0/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jy5nwfghp9wh35y2va9tmd7lt7pf42dn035zwx","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/r/cryptopunkstar/package.gno b/portal-loop/extracted/r/cryptopunkstar/package.gno new file mode 100644 index 00000000..01953fee --- /dev/null +++ b/portal-loop/extracted/r/cryptopunkstar/package.gno @@ -0,0 +1,5 @@ +package cryptopunkstar + +func Render(path string) string { + return "Cryptopunkstar" +} diff --git a/portal-loop/extracted/r/cryptopunkstar/pkg_metadata.json b/portal-loop/extracted/r/cryptopunkstar/pkg_metadata.json new file mode 100644 index 00000000..f7b82ca8 --- /dev/null +++ b/portal-loop/extracted/r/cryptopunkstar/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1ngywvql2ql7t8uzl63w60eqcejkwg4rm4lxdw9","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/r/cryptopunkstar:0/package.gno b/portal-loop/extracted/r/cryptopunkstar:0/package.gno new file mode 100644 index 00000000..e93931b5 --- /dev/null +++ b/portal-loop/extracted/r/cryptopunkstar:0/package.gno @@ -0,0 +1,5 @@ +package Cryptopunkstar + +func Render(path string) string { + return "Cryptopunkstar" +} diff --git a/portal-loop/extracted/r/cryptopunkstar:0/pkg_metadata.json b/portal-loop/extracted/r/cryptopunkstar:0/pkg_metadata.json new file mode 100644 index 00000000..f7b82ca8 --- /dev/null +++ b/portal-loop/extracted/r/cryptopunkstar:0/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1ngywvql2ql7t8uzl63w60eqcejkwg4rm4lxdw9","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/r/deelawn/tsrf/package.gno b/portal-loop/extracted/r/deelawn/tsrf/package.gno new file mode 100644 index 00000000..00b32279 --- /dev/null +++ b/portal-loop/extracted/r/deelawn/tsrf/package.gno @@ -0,0 +1,7 @@ +package deelawn + +import "gno.land/r/leon/v2/raffle/raffle" + +func Register(code string) { + return raffle.RegisterCode(code) +} diff --git a/portal-loop/extracted/r/deelawn/tsrf/pkg_metadata.json b/portal-loop/extracted/r/deelawn/tsrf/pkg_metadata.json new file mode 100644 index 00000000..f482b1b2 --- /dev/null +++ b/portal-loop/extracted/r/deelawn/tsrf/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1sj0ykeeej73v29qvpqtumyyj2smfklcc92qqmv","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/deelawn/tsrf:0/package.gno b/portal-loop/extracted/r/deelawn/tsrf:0/package.gno new file mode 100644 index 00000000..bd14b35a --- /dev/null +++ b/portal-loop/extracted/r/deelawn/tsrf:0/package.gno @@ -0,0 +1,7 @@ +package tsrf + +import "gno.land/r/leon/v2/raffle" + +func Register(code string) string { + return raffle.RegisterCode(code) +} diff --git a/portal-loop/extracted/r/deelawn/tsrf:0/pkg_metadata.json b/portal-loop/extracted/r/deelawn/tsrf:0/pkg_metadata.json new file mode 100644 index 00000000..f482b1b2 --- /dev/null +++ b/portal-loop/extracted/r/deelawn/tsrf:0/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1sj0ykeeej73v29qvpqtumyyj2smfklcc92qqmv","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/demo/art/gnoface/gnoface.gno b/portal-loop/extracted/r/demo/art/gnoface/gnoface.gno new file mode 100644 index 00000000..b4bc8e22 --- /dev/null +++ b/portal-loop/extracted/r/demo/art/gnoface/gnoface.gno @@ -0,0 +1,124 @@ +package gnoface + +import ( + "math/rand" + "strconv" + "strings" + + "gno.land/p/demo/entropy" + "gno.land/p/demo/ufmt" +) + +func Render(path string) string { + seed := uint64(entropy.New().Value()) + + path = strings.TrimSpace(path) + if path != "" { + s, err := strconv.Atoi(path) + if err != nil { + panic(err) + } + seed = uint64(s) + } + + output := ufmt.Sprintf("Gnoface #%d\n", seed) + output += "```\n" + Draw(seed) + "```\n" + return output +} + +func Draw(seed uint64) string { + var ( + hairs = []string{ + " s", + " .......", + " s s s", + " /\\ /\\", + " |||||||", + } + headtop = []string{ + " /-------\\", + " /~~~~~~~\\", + " /|||||||\\", + " ////////\\", + " |||||||||", + " /\\\\\\\\\\\\\\\\", + } + headspace = []string{ + " | |", + } + eyebrow = []string{ + "~", + "*", + "_", + ".", + } + ear = []string{ + "o", + " ", + "D", + "O", + "<", + ">", + ".", + "|", + ")", + "(", + } + eyesmiddle = []string{ + "| o o |", + "| o _ |", + "| _ o |", + "| . . |", + "| O O |", + "| v v |", + "| X X |", + "| x X |", + "| X D |", + "| ~ ~ |", + } + nose = []string{ + " | o |", + " | O |", + " | V |", + " | L |", + " | C |", + " | ~ |", + " | . . |", + " | . |", + } + mouth = []string{ + " | __/ |", + " | \\_/ |", + " | . |", + " | ___ |", + " | ~~~ |", + " | === |", + " | <=> |", + } + headbottom = []string{ + " \\-------/", + " \\~~~~~~~/", + " \\_______/", + } + ) + + r := rand.New(rand.NewPCG(seed, 0xdeadbeef)) + + return pick(r, hairs) + "\n" + + pick(r, headtop) + "\n" + + pick(r, headspace) + "\n" + + " | " + pick(r, eyebrow) + " " + pick(r, eyebrow) + " |\n" + + pick(r, ear) + pick(r, eyesmiddle) + pick(r, ear) + "\n" + + pick(r, headspace) + "\n" + + pick(r, nose) + "\n" + + pick(r, headspace) + "\n" + + pick(r, mouth) + "\n" + + pick(r, headspace) + "\n" + + pick(r, headbottom) + "\n" +} + +func pick(r *rand.Rand, slice []string) string { + return slice[r.IntN(len(slice))] +} + +// based on https://github.com/moul/pipotron/blob/master/dict/ascii-face.yml diff --git a/portal-loop/extracted/r/demo/art/gnoface/gnoface_test.gno b/portal-loop/extracted/r/demo/art/gnoface/gnoface_test.gno new file mode 100644 index 00000000..44c70ff1 --- /dev/null +++ b/portal-loop/extracted/r/demo/art/gnoface/gnoface_test.gno @@ -0,0 +1,133 @@ +package gnoface + +import ( + "testing" + + "gno.land/p/demo/uassert" + "gno.land/p/demo/ufmt" +) + +func TestDraw(t *testing.T) { + cases := []struct { + seed uint64 + expected string + }{ + { + seed: 42, + expected: ` + ||||||| + ||||||||| + | | + | . ~ | +)| v v |O + | | + | L | + | | + | ___ | + | | + \~~~~~~~/ +`[1:], + }, + { + seed: 1337, + expected: ` + ....... + ||||||||| + | | + | . _ | +D| x X |O + | | + | ~ | + | | + | ~~~ | + | | + \~~~~~~~/ +`[1:], + }, + { + seed: 123456789, + expected: ` + ....... + ////////\ + | | + | ~ * | +|| x X |o + | | + | V | + | | + | . | + | | + \-------/ +`[1:], + }, + } + for _, tc := range cases { + name := ufmt.Sprintf("%d", tc.seed) + t.Run(name, func(t *testing.T) { + got := Draw(tc.seed) + uassert.Equal(t, string(tc.expected), got) + }) + } +} + +func TestRender(t *testing.T) { + cases := []struct { + path string + expected string + }{ + { + path: "42", + expected: "Gnoface #42\n```" + ` + ||||||| + ||||||||| + | | + | . ~ | +)| v v |O + | | + | L | + | | + | ___ | + | | + \~~~~~~~/ +` + "```\n", + }, + { + path: "1337", + expected: "Gnoface #1337\n```" + ` + ....... + ||||||||| + | | + | . _ | +D| x X |O + | | + | ~ | + | | + | ~~~ | + | | + \~~~~~~~/ +` + "```\n", + }, + { + path: "123456789", + expected: "Gnoface #123456789\n```" + ` + ....... + ////////\ + | | + | ~ * | +|| x X |o + | | + | V | + | | + | . | + | | + \-------/ +` + "```\n", + }, + } + for _, tc := range cases { + t.Run(tc.path, func(t *testing.T) { + got := Render(tc.path) + uassert.Equal(t, tc.expected, got) + }) + } +} diff --git a/portal-loop/extracted/r/demo/art/gnoface/pkg_metadata.json b/portal-loop/extracted/r/demo/art/gnoface/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/r/demo/art/gnoface/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/r/demo/art/millipede/millipede.gno b/portal-loop/extracted/r/demo/art/millipede/millipede.gno new file mode 100644 index 00000000..446c76e5 --- /dev/null +++ b/portal-loop/extracted/r/demo/art/millipede/millipede.gno @@ -0,0 +1,51 @@ +package millipede + +import ( + "strconv" + "strings" + + "gno.land/p/demo/ufmt" +) + +const ( + minSize = 1 + defaultSize = 20 + maxSize = 100 +) + +func Draw(size int) string { + if size < minSize || size > maxSize { + panic("invalid millipede size") + } + paddings := []string{" ", " ", "", " ", " ", " ", " ", " ", " "} + var b strings.Builder + b.WriteString(" ╚⊙ ⊙╝\n") + for i := 0; i < size; i++ { + b.WriteString(paddings[i%9] + "╚═(███)═╝\n") + } + return b.String() +} + +func Render(path string) string { + size := defaultSize + + path = strings.TrimSpace(path) + if path != "" { + var err error + size, err = strconv.Atoi(path) + if err != nil { + panic(err) + } + } + + output := "```\n" + Draw(size) + "```\n" + if size > minSize { + output += ufmt.Sprintf("[%d](/r/demo/art/millipede:%d)< ", size-1, size-1) + } + if size < maxSize { + output += ufmt.Sprintf(" >[%d](/r/demo/art/millipede:%d)", size+1, size+1) + } + return output +} + +// based on https://github.com/getmillipede/millipede-go/blob/977f046c39c35a650eac0fd30245e96b22c7803c/main.go diff --git a/portal-loop/extracted/r/demo/art/millipede/millipede_test.gno b/portal-loop/extracted/r/demo/art/millipede/millipede_test.gno new file mode 100644 index 00000000..035b611d --- /dev/null +++ b/portal-loop/extracted/r/demo/art/millipede/millipede_test.gno @@ -0,0 +1,58 @@ +package millipede + +import ( + "testing" + + "gno.land/p/demo/uassert" +) + +func TestRender(t *testing.T) { + cases := []struct { + path string + expected string + }{ + { + path: "", + expected: "```" + ` + ╚⊙ ⊙╝ + ╚═(███)═╝ + ╚═(███)═╝ +╚═(███)═╝ + ╚═(███)═╝ + ╚═(███)═╝ + ╚═(███)═╝ + ╚═(███)═╝ + ╚═(███)═╝ + ╚═(███)═╝ + ╚═(███)═╝ + ╚═(███)═╝ +╚═(███)═╝ + ╚═(███)═╝ + ╚═(███)═╝ + ╚═(███)═╝ + ╚═(███)═╝ + ╚═(███)═╝ + ╚═(███)═╝ + ╚═(███)═╝ + ╚═(███)═╝ +` + "```\n[19](/r/demo/art/millipede:19)< >[21](/r/demo/art/millipede:21)", + }, + { + path: "4", + expected: "```" + ` + ╚⊙ ⊙╝ + ╚═(███)═╝ + ╚═(███)═╝ +╚═(███)═╝ + ╚═(███)═╝ +` + "```\n[3](/r/demo/art/millipede:3)< >[5](/r/demo/art/millipede:5)", + }, + } + + for _, tc := range cases { + t.Run(tc.path, func(t *testing.T) { + got := Render(tc.path) + uassert.Equal(t, tc.expected, got) + }) + } +} diff --git a/portal-loop/extracted/r/demo/art/millipede/pkg_metadata.json b/portal-loop/extracted/r/demo/art/millipede/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/r/demo/art/millipede/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/r/demo/banktest/README.md b/portal-loop/extracted/r/demo/banktest/README.md new file mode 100644 index 00000000..944757f9 --- /dev/null +++ b/portal-loop/extracted/r/demo/banktest/README.md @@ -0,0 +1,116 @@ +This is a simple test realm contract that demonstrates how to use the banker. + +See [gno.land/r/demo/banktest/banktest.go](/r/demo/banktest/banktest.go) to see the original contract code. + +This article will go through each line to explain how it works. + +```go +package banktest +``` + +This package is locally named "banktest" (could be anything). + +```go +import ( + "std" +) +``` + +The "std" package is defined by the gno code in stdlibs/std/.
Self explanatory; and you'll see more usage from std later. + +```go +type activity struct { + caller std.Address + sent std.Coins + returned std.Coins + time time.Time +} + +func (act *activity) String() string { + return act.caller.String() + " " + + act.sent.String() + " sent, " + + act.returned.String() + " returned, at " + + act.time.Format("2006-01-02 3:04pm MST") +} + +var latest [10]*activity +``` + +This is just maintaining a list of recent activity to this contract. Notice that the "latest" variable is defined "globally" within the context of the realm with path "gno.land/r/demo/banktest". + +This means that calls to functions defined within this package are encapsulated within this "data realm", where the data is mutated based on transactions that can potentially cross many realm and non-realm package boundaries (in the call stack). + +```go +// Deposit will take the coins (to the realm's pkgaddr) or return them to user. +func Deposit(returnDenom string, returnAmount int64) string { + std.AssertOriginCall() + caller := std.GetOrigCaller() + send := std.Coins{{returnDenom, returnAmount}} +``` + +This is the beginning of the definition of the contract function named "Deposit". `std.AssertOriginCall() asserts that this function was called by a gno transactional Message. The caller is the user who signed off on this transactional message. Send is the amount of deposit sent along with this message. + +```go + // record activity + act := &activity{ + caller: caller, + sent: std.GetOrigSend(), + returned: send, + time: time.Now(), + } + for i := len(latest) - 2; i >= 0; i-- { + latest[i+1] = latest[i] // shift by +1. + } + latest[0] = act +``` + +Updating the "latest" array for viewing at gno.land/r/demo/banktest: (w/ trailing colon). + +```go + // return if any. + if returnAmount > 0 { +``` + +If the user requested the return of coins... + +```go + banker := std.GetBanker(std.BankerTypeOrigSend) +``` + +use a std.Banker instance to return any deposited coins to the original sender. + +```go + pkgaddr := std.GetOrigPkgAddr() + // TODO: use std.Coins constructors, this isn't generally safe. + banker.SendCoins(pkgaddr, caller, send) + return "returned!" +``` + +Notice that each realm package has an associated Cosmos address. + +Finally, the results are rendered via an ABCI query call when you visit [/r/demo/banktest:](/r/demo/banktest:). + +```go +func Render(path string) string { + // get realm coins. + banker := std.GetBanker(std.BankerTypeReadonly) + coins := banker.GetCoins(std.GetOrigPkgAddr()) + + // render + res := "" + res += "## recent activity\n" + res += "\n" + for _, act := range latest { + if act == nil { + break + } + res += " * " + act.String() + "\n" + } + res += "\n" + res += "## total deposits\n" + res += coins.String() + return res +} +``` + +You can call this contract yourself, by vistiing [/r/demo/banktest](/r/demo/banktest) and the [quickstart guide](/r/demo/boards:gnolang/4). diff --git a/portal-loop/extracted/r/demo/banktest/banktest.gno b/portal-loop/extracted/r/demo/banktest/banktest.gno new file mode 100644 index 00000000..29c479dd --- /dev/null +++ b/portal-loop/extracted/r/demo/banktest/banktest.gno @@ -0,0 +1,71 @@ +package banktest + +import ( + "std" + "time" +) + +type activity struct { + caller std.Address + sent std.Coins + returned std.Coins + time time.Time +} + +func (act *activity) String() string { + return act.caller.String() + " " + + act.sent.String() + " sent, " + + act.returned.String() + " returned, at " + + act.time.Format("2006-01-02 3:04pm MST") +} + +var latest [10]*activity + +// Deposit will take the coins (to the realm's pkgaddr) or return them to user. +func Deposit(returnDenom string, returnAmount int64) string { + std.AssertOriginCall() + caller := std.GetOrigCaller() + send := std.Coins{{returnDenom, returnAmount}} + // record activity + act := &activity{ + caller: caller, + sent: std.GetOrigSend(), + returned: send, + time: time.Now(), + } + for i := len(latest) - 2; i >= 0; i-- { + latest[i+1] = latest[i] // shift by +1. + } + latest[0] = act + // return if any. + if returnAmount > 0 { + banker := std.GetBanker(std.BankerTypeOrigSend) + pkgaddr := std.GetOrigPkgAddr() + // TODO: use std.Coins constructors, this isn't generally safe. + banker.SendCoins(pkgaddr, caller, send) + return "returned!" + } else { + return "thank you!" + } +} + +func Render(path string) string { + // get realm coins. + banker := std.GetBanker(std.BankerTypeReadonly) + coins := banker.GetCoins(std.GetOrigPkgAddr()) + + // render + res := "" + res += "## recent activity\n" + res += "\n" + for _, act := range latest { + if act == nil { + break + } + res += " * " + act.String() + "\n" + } + res += "\n" + res += "## total deposits\n" + res += coins.String() + return res +} diff --git a/portal-loop/extracted/r/demo/banktest/pkg_metadata.json b/portal-loop/extracted/r/demo/banktest/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/r/demo/banktest/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/r/demo/banktest/z_0_filetest.gno b/portal-loop/extracted/r/demo/banktest/z_0_filetest.gno new file mode 100644 index 00000000..4ea76bbe --- /dev/null +++ b/portal-loop/extracted/r/demo/banktest/z_0_filetest.gno @@ -0,0 +1,48 @@ +// SEND: 100000000ugnot + +package main + +import ( + "std" + + "gno.land/r/demo/banktest" +) + +func main() { + // set up main address and banktest addr. + banktestAddr := std.DerivePkgAddr("gno.land/r/demo/banktest") + mainaddr := std.DerivePkgAddr("main") + std.TestSetOrigCaller(mainaddr) + std.TestSetOrigPkgAddr(banktestAddr) + + // get and print balance of mainaddr. + // with the SEND, + 200 gnot given by the TestContext, main should have 300gnot. + banker := std.GetBanker(std.BankerTypeRealmSend) + mainbal := banker.GetCoins(mainaddr) + println("main before:", mainbal) + + // simulate a Deposit call. use Send + OrigSend to simulate -send. + banker.SendCoins(mainaddr, banktestAddr, std.Coins{{"ugnot", 100_000_000}}) + std.TestSetOrigSend(std.Coins{{"ugnot", 100_000_000}}, nil) + res := banktest.Deposit("ugnot", 50_000_000) + println("Deposit():", res) + + // print main balance after. + mainbal = banker.GetCoins(mainaddr) + println("main after:", mainbal) + + // simulate a Render(). banker should have given back all coins. + res = banktest.Render("") + println(res) +} + +// Output: +// main before: 300000000ugnot +// Deposit(): returned! +// main after: 250000000ugnot +// ## recent activity +// +// * g17rgsdnfxzza0sdfsdma37sdwxagsz378833ca4 100000000ugnot sent, 50000000ugnot returned, at 2009-02-13 11:31pm UTC +// +// ## total deposits +// 50000000ugnot diff --git a/portal-loop/extracted/r/demo/banktest/z_1_filetest.gno b/portal-loop/extracted/r/demo/banktest/z_1_filetest.gno new file mode 100644 index 00000000..8f9f7647 --- /dev/null +++ b/portal-loop/extracted/r/demo/banktest/z_1_filetest.gno @@ -0,0 +1,21 @@ +package main + +import ( + "std" + + "gno.land/r/demo/banktest" +) + +func main() { + banktestAddr := std.DerivePkgAddr("gno.land/r/demo/banktest") + + // simulate a Deposit call. + std.TestSetOrigPkgAddr(banktestAddr) + std.TestIssueCoins(banktestAddr, std.Coins{{"ugnot", 100000000}}) + std.TestSetOrigSend(std.Coins{{"ugnot", 100000000}}, nil) + res := banktest.Deposit("ugnot", 101000000) + println(res) +} + +// Error: +// cannot send "101000000ugnot", limit "100000000ugnot" exceeded with "" already spent diff --git a/portal-loop/extracted/r/demo/banktest/z_2_filetest.gno b/portal-loop/extracted/r/demo/banktest/z_2_filetest.gno new file mode 100644 index 00000000..a0280e0d --- /dev/null +++ b/portal-loop/extracted/r/demo/banktest/z_2_filetest.gno @@ -0,0 +1,45 @@ +package main + +import ( + "std" + + "gno.land/r/demo/banktest" +) + +func main() { + banktestAddr := std.DerivePkgAddr("gno.land/r/demo/banktest") + + // print main balance before. + mainaddr := std.DerivePkgAddr("main") + std.TestSetOrigCaller(mainaddr) + + banker := std.GetBanker(std.BankerTypeReadonly) + mainbal := banker.GetCoins(mainaddr) + println("main before:", mainbal) // plus OrigSend equals 300. + + // simulate a Deposit call. + std.TestSetOrigPkgAddr(banktestAddr) + std.TestIssueCoins(banktestAddr, std.Coins{{"ugnot", 100000000}}) + std.TestSetOrigSend(std.Coins{{"ugnot", 100000000}}, nil) + res := banktest.Deposit("ugnot", 55000000) + println("Deposit():", res) + + // print main balance after. + mainbal = banker.GetCoins(mainaddr) + println("main after:", mainbal) // now 255. + + // simulate a Render(). + res = banktest.Render("") + println(res) +} + +// Output: +// main before: 200000000ugnot +// Deposit(): returned! +// main after: 255000000ugnot +// ## recent activity +// +// * g17rgsdnfxzza0sdfsdma37sdwxagsz378833ca4 100000000ugnot sent, 55000000ugnot returned, at 2009-02-13 11:31pm UTC +// +// ## total deposits +// 45000000ugnot diff --git a/portal-loop/extracted/r/demo/banktest/z_3_filetest.gno b/portal-loop/extracted/r/demo/banktest/z_3_filetest.gno new file mode 100644 index 00000000..ca8717df --- /dev/null +++ b/portal-loop/extracted/r/demo/banktest/z_3_filetest.gno @@ -0,0 +1,20 @@ +package main + +import ( + "std" +) + +func main() { + banktestAddr := std.DerivePkgAddr("gno.land/r/demo/banktest") + + mainaddr := std.DerivePkgAddr("main") + std.TestSetOrigCaller(mainaddr) + + banker := std.GetBanker(std.BankerTypeRealmSend) + send := std.Coins{{"ugnot", 123}} + banker.SendCoins(banktestAddr, mainaddr, send) + +} + +// Error: +// can only send coins from realm that created banker "g17rgsdnfxzza0sdfsdma37sdwxagsz378833ca4", not "g1dv3435088tlrgggf745kaud0ptrkc9v42k8llz" diff --git a/portal-loop/extracted/r/demo/bar20/bar20.gno b/portal-loop/extracted/r/demo/bar20/bar20.gno new file mode 100644 index 00000000..1d6ecd3d --- /dev/null +++ b/portal-loop/extracted/r/demo/bar20/bar20.gno @@ -0,0 +1,46 @@ +// Package bar20 is similar to gno.land/r/demo/foo20 but exposes a safe-object +// that can be used by `maketx run`, another contract importing foo20, and in +// the future when we'll support `maketx call Token.XXX`. +package bar20 + +import ( + "std" + "strings" + + "gno.land/p/demo/grc/grc20" + "gno.land/p/demo/ufmt" +) + +var ( + banker *grc20.Banker // private banker. + Token grc20.Token // public safe-object. +) + +func init() { + banker = grc20.NewBanker("Bar", "BAR", 4) + Token = banker.Token() +} + +func Faucet() string { + caller := std.PrevRealm().Addr() + if err := banker.Mint(caller, 1_000_000); err != nil { + return "error: " + err.Error() + } + return "OK" +} + +func Render(path string) string { + parts := strings.Split(path, "/") + c := len(parts) + + switch { + case path == "": + return banker.RenderHome() // XXX: should be Token.RenderHome() + case c == 2 && parts[0] == "balance": + owner := std.Address(parts[1]) + balance := Token.BalanceOf(owner) + return ufmt.Sprintf("%d\n", balance) + default: + return "404\n" + } +} diff --git a/portal-loop/extracted/r/demo/bar20/bar20_test.gno b/portal-loop/extracted/r/demo/bar20/bar20_test.gno new file mode 100644 index 00000000..20349258 --- /dev/null +++ b/portal-loop/extracted/r/demo/bar20/bar20_test.gno @@ -0,0 +1,19 @@ +package bar20 + +import ( + "std" + "testing" + + "gno.land/p/demo/testutils" + "gno.land/p/demo/urequire" +) + +func TestPackage(t *testing.T) { + alice := testutils.TestAddress("alice") + std.TestSetRealm(std.NewUserRealm(alice)) + std.TestSetOrigCaller(alice) // XXX: should not need this + + urequire.Equal(t, Token.BalanceOf(alice), uint64(0)) + urequire.Equal(t, Faucet(), "OK") + urequire.Equal(t, Token.BalanceOf(alice), uint64(1_000_000)) +} diff --git a/portal-loop/extracted/r/demo/bar20/pkg_metadata.json b/portal-loop/extracted/r/demo/bar20/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/r/demo/bar20/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/r/demo/boards/README.md b/portal-loop/extracted/r/demo/boards/README.md new file mode 100644 index 00000000..628bc9aa --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/README.md @@ -0,0 +1,147 @@ +This is a demo of Gno smart contract programming. This document was +constructed by Gno onto a smart contract hosted on the data Realm +name ["gno.land/r/demo/boards"](https://gno.land/r/demo/boards/) +([github](https://github.com/gnolang/gno/tree/master/examples/gno.land/r/demo/boards)). + + + +## Build `gnokey`, create your account, and interact with Gno. + +NOTE: Where you see `-remote localhost:26657` here, that flag can be replaced +with `-remote test3.gno.land:26657` if you have $GNOT on the testnet. +(To use the testnet, also replace `-chainid dev` with `-chainid test3` .) + +### Build `gnokey` (and other tools). + +```bash +git clone git@github.com:gnolang/gno.git +cd gno/gno.land +make build +``` + +### Generate a seed/mnemonic code. + +```bash +./build/gnokey generate +``` + +NOTE: You can generate 24 words with any good bip39 generator. + +### Create a new account using your mnemonic. + +```bash +./build/gnokey add -recover KEYNAME +``` + +NOTE: `KEYNAME` is your key identifier, and should be changed. + +### Verify that you can see your account locally. + +```bash +./build/gnokey list +``` + +Take note of your `addr` which looks something like `g17sphqax3kasjptdkmuqvn740u8dhtx4kxl6ljf` . +You will use this as your `ACCOUNT_ADDR`. + +## Interact with the blockchain. + +### Add $GNOT for your account. + +Before starting the `gnoland` node for the first time, your new account can be given $GNOT in the node genesis. +Edit the file `gno.land/genesis/genesis_balances.txt` and add the following line (simlar to the others), using +your `ACCOUNT_ADDR` and `KEYNAME` + +`ACCOUNT_ADDR=10000000000ugnot # @KEYNAME` + +### Alternative: Run a faucet to add $GNOT. + +Instead of editing `gno.land/genesis/genesis_balances.txt`, a more general solution (with more steps) +is to run a local "faucet" and use the web browser to add $GNOT. (This can be done at any time.) +See this page: https://github.com/gnolang/gno/blob/master/contribs/gnofaucet/README.md + + +### Start the `gnoland` node. + +```bash +./build/gnoland start +``` + +NOTE: The node already has the "boards" realm. + +Leave this running in the terminal. In a new terminal, cd to the same folder `gno/gno.land` . + +### Get your current balance, account number, and sequence number. + +```bash +./build/gnokey query auth/accounts/ACCOUNT_ADDR -remote localhost:26657 +``` + +### Register a board username with a smart contract call. + +The `USERNAME` for posting can different than your `KEYNAME`. It is internally linked to your `ACCOUNT_ADDR`. It must be at least 6 characters, lowercase alphanumeric with underscore. + +```bash +./build/gnokey maketx call -pkgpath "gno.land/r/demo/users" -func "Register" -args "" -args "USERNAME" -args "Profile description" -gas-fee "10000000ugnot" -gas-wanted "2000000" -send "200000000ugnot" -broadcast -chainid dev -remote 127.0.0.1:26657 KEYNAME +``` + +Interactive documentation: https://test3.gno.land/r/demo/users?help&__func=Register + +### Create a board with a smart contract call. + +```bash +./build/gnokey maketx call -pkgpath "gno.land/r/demo/boards" -func "CreateBoard" -args "BOARDNAME" -gas-fee "1000000ugnot" -gas-wanted "10000000" -broadcast -chainid dev -remote localhost:26657 KEYNAME +``` + +Interactive documentation: https://test3.gno.land/r/demo/boards?help&__func=CreateBoard + +Next, query for the permanent board ID by querying (you need this to create a new post): + +```bash +./build/gnokey query "vm/qeval" -data 'gno.land/r/demo/boards.GetBoardIDFromName("BOARDNAME")' -remote localhost:26657 +``` + +### Create a post of a board with a smart contract call. + +NOTE: If a board was created successfully, your SEQUENCE_NUMBER would have increased. + +```bash +./build/gnokey maketx call -pkgpath "gno.land/r/demo/boards" -func "CreateThread" -args BOARD_ID -args "Hello gno.land" -args "Text of the post" -gas-fee 1000000ugnot -gas-wanted 2000000 -broadcast -chainid dev -remote localhost:26657 KEYNAME +``` + +Interactive documentation: https://test3.gno.land/r/demo/boards?help&__func=CreateThread + +### Create a comment to a post. + +```bash +./build/gnokey maketx call -pkgpath "gno.land/r/demo/boards" -func "CreateReply" -args BOARD_ID -args "1" -args "1" -args "Nice to meet you too." -gas-fee 1000000ugnot -gas-wanted 2000000 -broadcast -chainid dev -remote localhost:26657 KEYNAME +``` + +Interactive documentation: https://test3.gno.land/r/demo/boards?help&__func=CreateReply + +```bash +./build/gnokey query "vm/qrender" -data "gno.land/r/demo/boards:BOARDNAME/1" -remote localhost:26657 +``` + +### Render page with optional path expression. + +The contents of `https://gno.land/r/demo/boards:` and `https://gno.land/r/demo/boards:gnolang` are rendered by calling +the `Render(path string)` function like so: + +```bash +./build/gnokey query "vm/qrender" -data "gno.land/r/demo/boards:gnolang" +``` +## View the board in the browser. + +### Start the web server. + +```bash +./build/gnoweb +``` + +This should print something like `Running on http://127.0.0.1:8888` . Leave this running in the terminal. + +### View in the browser + +In your browser, navigate to the printed address http://127.0.0.1:8888 . +To see you post, click on the package `/r/demo/boards` . diff --git a/portal-loop/extracted/r/demo/boards/board.gno b/portal-loop/extracted/r/demo/boards/board.gno new file mode 100644 index 00000000..a9cf56c2 --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/board.gno @@ -0,0 +1,140 @@ +package boards + +import ( + "std" + "strconv" + "time" + + "gno.land/p/demo/avl" +) + +//---------------------------------------- +// Board + +type BoardID uint64 + +func (bid BoardID) String() string { + return strconv.Itoa(int(bid)) +} + +type Board struct { + id BoardID // only set for public boards. + url string + name string + creator std.Address + threads avl.Tree // Post.id -> *Post + postsCtr uint64 // increments Post.id + createdAt time.Time + deleted avl.Tree // TODO reserved for fast-delete. +} + +func newBoard(id BoardID, url string, name string, creator std.Address) *Board { + if !reName.MatchString(name) { + panic("invalid name: " + name) + } + exists := gBoardsByName.Has(name) + if exists { + panic("board already exists") + } + return &Board{ + id: id, + url: url, + name: name, + creator: creator, + threads: avl.Tree{}, + createdAt: time.Now(), + deleted: avl.Tree{}, + } +} + +/* TODO support this once we figure out how to ensure URL correctness. +// A private board is not tracked by gBoards*, +// but must be persisted by the caller's realm. +// Private boards have 0 id and does not ping +// back the remote board on reposts. +func NewPrivateBoard(url string, name string, creator std.Address) *Board { + return newBoard(0, url, name, creator) +} +*/ + +func (board *Board) IsPrivate() bool { + return board.id == 0 +} + +func (board *Board) GetThread(pid PostID) *Post { + pidkey := postIDKey(pid) + postI, exists := board.threads.Get(pidkey) + if !exists { + return nil + } + return postI.(*Post) +} + +func (board *Board) AddThread(creator std.Address, title string, body string) *Post { + pid := board.incGetPostID() + pidkey := postIDKey(pid) + thread := newPost(board, pid, creator, title, body, pid, 0, 0) + board.threads.Set(pidkey, thread) + return thread +} + +// NOTE: this can be potentially very expensive for threads with many replies. +// TODO: implement optional fast-delete where thread is simply moved. +func (board *Board) DeleteThread(pid PostID) { + pidkey := postIDKey(pid) + _, removed := board.threads.Remove(pidkey) + if !removed { + panic("thread does not exist with id " + pid.String()) + } +} + +func (board *Board) HasPermission(addr std.Address, perm Permission) bool { + if board.creator == addr { + switch perm { + case EditPermission: + return true + case DeletePermission: + return true + default: + return false + } + } + return false +} + +// Renders the board for display suitable as plaintext in +// console. This is suitable for demonstration or tests, +// but not for prod. +func (board *Board) RenderBoard() string { + str := "" + str += "\\[[post](" + board.GetPostFormURL() + ")]\n\n" + if board.threads.Size() > 0 { + board.threads.Iterate("", "", func(key string, value interface{}) bool { + if str != "" { + str += "----------------------------------------\n" + } + str += value.(*Post).RenderSummary() + "\n" + return false + }) + } + return str +} + +func (board *Board) incGetPostID() PostID { + board.postsCtr++ + return PostID(board.postsCtr) +} + +func (board *Board) GetURLFromThreadAndReplyID(threadID, replyID PostID) string { + if replyID == 0 { + return board.url + "/" + threadID.String() + } else { + return board.url + "/" + threadID.String() + "/" + replyID.String() + } +} + +func (board *Board) GetPostFormURL() string { + return "/r/demo/boards?help&__func=CreateThread" + + "&bid=" + board.id.String() + + "&body.type=textarea" +} diff --git a/portal-loop/extracted/r/demo/boards/boards.gno b/portal-loop/extracted/r/demo/boards/boards.gno new file mode 100644 index 00000000..5de0555a --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/boards.gno @@ -0,0 +1,22 @@ +package boards + +import ( + "regexp" + + "gno.land/p/demo/avl" +) + +//---------------------------------------- +// Realm (package) state + +var ( + gBoards avl.Tree // id -> *Board + gBoardsCtr int // increments Board.id + gBoardsByName avl.Tree // name -> *Board + gDefaultAnonFee = 100000000 // minimum fee required if anonymous +) + +//---------------------------------------- +// Constants + +var reName = regexp.MustCompile(`^[a-z]+[_a-z0-9]{2,29}$`) diff --git a/portal-loop/extracted/r/demo/boards/misc.gno b/portal-loop/extracted/r/demo/boards/misc.gno new file mode 100644 index 00000000..bc561ca7 --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/misc.gno @@ -0,0 +1,95 @@ +package boards + +import ( + "std" + "strconv" + "strings" + + "gno.land/r/demo/users" +) + +//---------------------------------------- +// private utility methods +// XXX ensure these cannot be called from public. + +func getBoard(bid BoardID) *Board { + bidkey := boardIDKey(bid) + board_, exists := gBoards.Get(bidkey) + if !exists { + return nil + } + board := board_.(*Board) + return board +} + +func incGetBoardID() BoardID { + gBoardsCtr++ + return BoardID(gBoardsCtr) +} + +func padLeft(str string, length int) string { + if len(str) >= length { + return str + } else { + return strings.Repeat(" ", length-len(str)) + str + } +} + +func padZero(u64 uint64, length int) string { + str := strconv.Itoa(int(u64)) + if len(str) >= length { + return str + } else { + return strings.Repeat("0", length-len(str)) + str + } +} + +func boardIDKey(bid BoardID) string { + return padZero(uint64(bid), 10) +} + +func postIDKey(pid PostID) string { + return padZero(uint64(pid), 10) +} + +func indentBody(indent string, body string) string { + lines := strings.Split(body, "\n") + res := "" + for i, line := range lines { + if i > 0 { + res += "\n" + } + res += indent + line + } + return res +} + +// NOTE: length must be greater than 3. +func summaryOf(str string, length int) string { + lines := strings.SplitN(str, "\n", 2) + line := lines[0] + if len(line) > length { + line = line[:(length-3)] + "..." + } else if len(lines) > 1 { + // len(line) <= 80 + line = line + "..." + } + return line +} + +func displayAddressMD(addr std.Address) string { + user := users.GetUserByAddress(addr) + if user == nil { + return "[" + addr.String() + "](/r/demo/users:" + addr.String() + ")" + } else { + return "[@" + user.Name + "](/r/demo/users:" + user.Name + ")" + } +} + +func usernameOf(addr std.Address) string { + user := users.GetUserByAddress(addr) + if user == nil { + return "" + } + return user.Name +} diff --git a/portal-loop/extracted/r/demo/boards/pkg_metadata.json b/portal-loop/extracted/r/demo/boards/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/r/demo/boards/post.gno b/portal-loop/extracted/r/demo/boards/post.gno new file mode 100644 index 00000000..f35cf236 --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/post.gno @@ -0,0 +1,263 @@ +package boards + +import ( + "std" + "strconv" + "time" + + "gno.land/p/demo/avl" +) + +//---------------------------------------- +// Post + +// NOTE: a PostID is relative to the board. +type PostID uint64 + +func (pid PostID) String() string { + return strconv.Itoa(int(pid)) +} + +// A Post is a "thread" or a "reply" depending on context. +// A thread is a Post of a Board that holds other replies. +type Post struct { + board *Board + id PostID + creator std.Address + title string // optional + body string + replies avl.Tree // Post.id -> *Post + repliesAll avl.Tree // Post.id -> *Post (all replies, for top-level posts) + reposts avl.Tree // Board.id -> Post.id + threadID PostID // original Post.id + parentID PostID // parent Post.id (if reply or repost) + repostBoard BoardID // original Board.id (if repost) + createdAt time.Time + updatedAt time.Time +} + +func newPost(board *Board, id PostID, creator std.Address, title, body string, threadID, parentID PostID, repostBoard BoardID) *Post { + return &Post{ + board: board, + id: id, + creator: creator, + title: title, + body: body, + replies: avl.Tree{}, + repliesAll: avl.Tree{}, + reposts: avl.Tree{}, + threadID: threadID, + parentID: parentID, + repostBoard: repostBoard, + createdAt: time.Now(), + } +} + +func (post *Post) IsThread() bool { + return post.parentID == 0 +} + +func (post *Post) GetPostID() PostID { + return post.id +} + +func (post *Post) AddReply(creator std.Address, body string) *Post { + board := post.board + pid := board.incGetPostID() + pidkey := postIDKey(pid) + reply := newPost(board, pid, creator, "", body, post.threadID, post.id, 0) + post.replies.Set(pidkey, reply) + if post.threadID == post.id { + post.repliesAll.Set(pidkey, reply) + } else { + thread := board.GetThread(post.threadID) + thread.repliesAll.Set(pidkey, reply) + } + return reply +} + +func (post *Post) Update(title string, body string) { + post.title = title + post.body = body + post.updatedAt = time.Now() +} + +func (thread *Post) GetReply(pid PostID) *Post { + pidkey := postIDKey(pid) + replyI, ok := thread.repliesAll.Get(pidkey) + if !ok { + return nil + } else { + return replyI.(*Post) + } +} + +func (post *Post) AddRepostTo(creator std.Address, title, body string, dst *Board) *Post { + if !post.IsThread() { + panic("cannot repost non-thread post") + } + pid := dst.incGetPostID() + pidkey := postIDKey(pid) + repost := newPost(dst, pid, creator, title, body, pid, post.id, post.board.id) + dst.threads.Set(pidkey, repost) + if !dst.IsPrivate() { + bidkey := boardIDKey(dst.id) + post.reposts.Set(bidkey, pid) + } + return repost +} + +func (thread *Post) DeletePost(pid PostID) { + if thread.id == pid { + panic("should not happen") + } + pidkey := postIDKey(pid) + postI, removed := thread.repliesAll.Remove(pidkey) + if !removed { + panic("post not found in thread") + } + post := postI.(*Post) + if post.parentID != thread.id { + parent := thread.GetReply(post.parentID) + parent.replies.Remove(pidkey) + } else { + thread.replies.Remove(pidkey) + } +} + +func (post *Post) HasPermission(addr std.Address, perm Permission) bool { + if post.creator == addr { + switch perm { + case EditPermission: + return true + case DeletePermission: + return true + default: + return false + } + } + // post notes inherit permissions of the board. + return post.board.HasPermission(addr, perm) +} + +func (post *Post) GetSummary() string { + return summaryOf(post.body, 80) +} + +func (post *Post) GetURL() string { + if post.IsThread() { + return post.board.GetURLFromThreadAndReplyID( + post.id, 0) + } else { + return post.board.GetURLFromThreadAndReplyID( + post.threadID, post.id) + } +} + +func (post *Post) GetReplyFormURL() string { + return "/r/demo/boards?help&__func=CreateReply" + + "&bid=" + post.board.id.String() + + "&threadid=" + post.threadID.String() + + "&postid=" + post.id.String() + + "&body.type=textarea" +} + +func (post *Post) GetRepostFormURL() string { + return "/r/demo/boards?help&__func=CreateRepost" + + "&bid=" + post.board.id.String() + + "&postid=" + post.id.String() + + "&title.type=textarea" + + "&body.type=textarea" + + "&dstBoardID.type=textarea" +} + +func (post *Post) GetDeleteFormURL() string { + return "/r/demo/boards?help&__func=DeletePost" + + "&bid=" + post.board.id.String() + + "&threadid=" + post.threadID.String() + + "&postid=" + post.id.String() +} + +func (post *Post) RenderSummary() string { + if post.repostBoard != 0 { + dstBoard := getBoard(post.repostBoard) + if dstBoard == nil { + panic("repostBoard does not exist") + } + thread := dstBoard.GetThread(PostID(post.parentID)) + if thread == nil { + return "reposted post does not exist" + } + return "Repost: " + post.GetSummary() + "\n" + thread.RenderSummary() + } + str := "" + if post.title != "" { + str += "## [" + summaryOf(post.title, 80) + "](" + post.GetURL() + ")\n" + str += "\n" + } + str += post.GetSummary() + "\n" + str += "\\- " + displayAddressMD(post.creator) + "," + str += " [" + post.createdAt.Format("2006-01-02 3:04pm MST") + "](" + post.GetURL() + ")" + str += " \\[[x](" + post.GetDeleteFormURL() + ")]" + str += " (" + strconv.Itoa(post.replies.Size()) + " replies)" + str += " (" + strconv.Itoa(post.reposts.Size()) + " reposts)" + "\n" + return str +} + +func (post *Post) RenderPost(indent string, levels int) string { + if post == nil { + return "nil post" + } + str := "" + if post.title != "" { + str += indent + "# " + post.title + "\n" + str += indent + "\n" + } + str += indentBody(indent, post.body) + "\n" // TODO: indent body lines. + str += indent + "\\- " + displayAddressMD(post.creator) + ", " + str += "[" + post.createdAt.Format("2006-01-02 3:04pm (MST)") + "](" + post.GetURL() + ")" + str += " \\[[reply](" + post.GetReplyFormURL() + ")]" + if post.IsThread() { + str += " \\[[repost](" + post.GetRepostFormURL() + ")]" + } + str += " \\[[x](" + post.GetDeleteFormURL() + ")]\n" + if levels > 0 { + if post.replies.Size() > 0 { + post.replies.Iterate("", "", func(key string, value interface{}) bool { + str += indent + "\n" + str += value.(*Post).RenderPost(indent+"> ", levels-1) + return false + }) + } + } else { + if post.replies.Size() > 0 { + str += indent + "\n" + str += indent + "_[see all " + strconv.Itoa(post.replies.Size()) + " replies](" + post.GetURL() + ")_\n" + } + } + return str +} + +// render reply and link to context thread +func (post *Post) RenderInner() string { + if post.IsThread() { + panic("unexpected thread") + } + threadID := post.threadID + // replyID := post.id + parentID := post.parentID + str := "" + str += "_[see thread](" + post.board.GetURLFromThreadAndReplyID( + threadID, 0) + ")_\n\n" + thread := post.board.GetThread(post.threadID) + var parent *Post + if thread.id == parentID { + parent = thread + } else { + parent = thread.GetReply(parentID) + } + str += parent.RenderPost("", 0) + str += "\n" + str += post.RenderPost("> ", 5) + return str +} diff --git a/portal-loop/extracted/r/demo/boards/public.gno b/portal-loop/extracted/r/demo/boards/public.gno new file mode 100644 index 00000000..1d26126f --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/public.gno @@ -0,0 +1,185 @@ +package boards + +import ( + "std" + "strconv" +) + +//---------------------------------------- +// Public facing functions + +func GetBoardIDFromName(name string) (BoardID, bool) { + boardI, exists := gBoardsByName.Get(name) + if !exists { + return 0, false + } + return boardI.(*Board).id, true +} + +func CreateBoard(name string) BoardID { + if !(std.IsOriginCall() || std.PrevRealm().IsUser()) { + panic("invalid non-user call") + } + bid := incGetBoardID() + caller := std.GetOrigCaller() + if usernameOf(caller) == "" { + panic("unauthorized") + } + url := "/r/demo/boards:" + name + board := newBoard(bid, url, name, caller) + bidkey := boardIDKey(bid) + gBoards.Set(bidkey, board) + gBoardsByName.Set(name, board) + return board.id +} + +func checkAnonFee() bool { + sent := std.GetOrigSend() + anonFeeCoin := std.NewCoin("ugnot", int64(gDefaultAnonFee)) + if len(sent) == 1 && sent[0].IsGTE(anonFeeCoin) { + return true + } + return false +} + +func CreateThread(bid BoardID, title string, body string) PostID { + if !(std.IsOriginCall() || std.PrevRealm().IsUser()) { + panic("invalid non-user call") + } + caller := std.GetOrigCaller() + if usernameOf(caller) == "" { + if !checkAnonFee() { + panic("please register, otherwise minimum fee " + strconv.Itoa(gDefaultAnonFee) + " is required if anonymous") + } + } + board := getBoard(bid) + if board == nil { + panic("board not exist") + } + thread := board.AddThread(caller, title, body) + return thread.id +} + +func CreateReply(bid BoardID, threadid, postid PostID, body string) PostID { + if !(std.IsOriginCall() || std.PrevRealm().IsUser()) { + panic("invalid non-user call") + } + caller := std.GetOrigCaller() + if usernameOf(caller) == "" { + if !checkAnonFee() { + panic("please register, otherwise minimum fee " + strconv.Itoa(gDefaultAnonFee) + " is required if anonymous") + } + } + board := getBoard(bid) + if board == nil { + panic("board not exist") + } + thread := board.GetThread(threadid) + if thread == nil { + panic("thread not exist") + } + if postid == threadid { + reply := thread.AddReply(caller, body) + return reply.id + } else { + post := thread.GetReply(postid) + reply := post.AddReply(caller, body) + return reply.id + } +} + +// If dstBoard is private, does not ping back. +// If board specified by bid is private, panics. +func CreateRepost(bid BoardID, postid PostID, title string, body string, dstBoardID BoardID) PostID { + if !(std.IsOriginCall() || std.PrevRealm().IsUser()) { + panic("invalid non-user call") + } + caller := std.GetOrigCaller() + if usernameOf(caller) == "" { + // TODO: allow with gDefaultAnonFee payment. + if !checkAnonFee() { + panic("please register, otherwise minimum fee " + strconv.Itoa(gDefaultAnonFee) + " is required if anonymous") + } + } + board := getBoard(bid) + if board == nil { + panic("src board not exist") + } + if board.IsPrivate() { + panic("cannot repost from a private board") + } + dst := getBoard(dstBoardID) + if dst == nil { + panic("dst board not exist") + } + thread := board.GetThread(postid) + if thread == nil { + panic("thread not exist") + } + repost := thread.AddRepostTo(caller, title, body, dst) + return repost.id +} + +func DeletePost(bid BoardID, threadid, postid PostID, reason string) { + if !(std.IsOriginCall() || std.PrevRealm().IsUser()) { + panic("invalid non-user call") + } + caller := std.GetOrigCaller() + board := getBoard(bid) + if board == nil { + panic("board not exist") + } + thread := board.GetThread(threadid) + if thread == nil { + panic("thread not exist") + } + if postid == threadid { + // delete thread + if !thread.HasPermission(caller, DeletePermission) { + panic("unauthorized") + } + board.DeleteThread(threadid) + } else { + // delete thread's post + post := thread.GetReply(postid) + if post == nil { + panic("post not exist") + } + if !post.HasPermission(caller, DeletePermission) { + panic("unauthorized") + } + thread.DeletePost(postid) + } +} + +func EditPost(bid BoardID, threadid, postid PostID, title, body string) { + if !(std.IsOriginCall() || std.PrevRealm().IsUser()) { + panic("invalid non-user call") + } + caller := std.GetOrigCaller() + board := getBoard(bid) + if board == nil { + panic("board not exist") + } + thread := board.GetThread(threadid) + if thread == nil { + panic("thread not exist") + } + if postid == threadid { + // edit thread + if !thread.HasPermission(caller, EditPermission) { + panic("unauthorized") + } + thread.Update(title, body) + } else { + // edit thread's post + post := thread.GetReply(postid) + if post == nil { + panic("post not exist") + } + if !post.HasPermission(caller, EditPermission) { + panic("unauthorized") + } + post.Update(title, body) + } +} diff --git a/portal-loop/extracted/r/demo/boards/render.gno b/portal-loop/extracted/r/demo/boards/render.gno new file mode 100644 index 00000000..3709ad02 --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/render.gno @@ -0,0 +1,83 @@ +package boards + +import ( + "strconv" + "strings" +) + +//---------------------------------------- +// Render functions + +func RenderBoard(bid BoardID) string { + board := getBoard(bid) + if board == nil { + return "missing board" + } + return board.RenderBoard() +} + +func Render(path string) string { + if path == "" { + str := "These are all the boards of this realm:\n\n" + gBoards.Iterate("", "", func(key string, value interface{}) bool { + board := value.(*Board) + str += " * [" + board.url + "](" + board.url + ")\n" + return false + }) + return str + } + parts := strings.Split(path, "/") + if len(parts) == 1 { + // /r/demo/boards:BOARD_NAME + name := parts[0] + boardI, exists := gBoardsByName.Get(name) + if !exists { + return "board does not exist: " + name + } + return boardI.(*Board).RenderBoard() + } else if len(parts) == 2 { + // /r/demo/boards:BOARD_NAME/THREAD_ID + name := parts[0] + boardI, exists := gBoardsByName.Get(name) + if !exists { + return "board does not exist: " + name + } + pid, err := strconv.Atoi(parts[1]) + if err != nil { + return "invalid thread id: " + parts[1] + } + board := boardI.(*Board) + thread := board.GetThread(PostID(pid)) + if thread == nil { + return "thread does not exist with id: " + parts[1] + } + return thread.RenderPost("", 5) + } else if len(parts) == 3 { + // /r/demo/boards:BOARD_NAME/THREAD_ID/REPLY_ID + name := parts[0] + boardI, exists := gBoardsByName.Get(name) + if !exists { + return "board does not exist: " + name + } + pid, err := strconv.Atoi(parts[1]) + if err != nil { + return "invalid thread id: " + parts[1] + } + board := boardI.(*Board) + thread := board.GetThread(PostID(pid)) + if thread == nil { + return "thread does not exist with id: " + parts[1] + } + rid, err := strconv.Atoi(parts[2]) + if err != nil { + return "invalid reply id: " + parts[2] + } + reply := thread.GetReply(PostID(rid)) + if reply == nil { + return "reply does not exist with id: " + parts[2] + } + return reply.RenderInner() + } else { + return "unrecognized path " + path + } +} diff --git a/portal-loop/extracted/r/demo/boards/role.gno b/portal-loop/extracted/r/demo/boards/role.gno new file mode 100644 index 00000000..64073d64 --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/role.gno @@ -0,0 +1,8 @@ +package boards + +type Permission string + +const ( + DeletePermission Permission = "role:delete" + EditPermission Permission = "role:edit" +) diff --git a/portal-loop/extracted/r/demo/boards/z_0_a_filetest.gno b/portal-loop/extracted/r/demo/boards/z_0_a_filetest.gno new file mode 100644 index 00000000..5e8ff520 --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/z_0_a_filetest.gno @@ -0,0 +1,22 @@ +// PKGPATH: gno.land/r/demo/boards_test +package boards_test + +import ( + "gno.land/r/demo/boards" +) + +var bid boards.BoardID + +func init() { + bid = boards.CreateBoard("test_board") + boards.CreateThread(bid, "First Post (title)", "Body of the first post. (body)") + pid := boards.CreateThread(bid, "Second Post (title)", "Body of the second post. (body)") + boards.CreateReply(bid, pid, pid, "Reply of the second post") +} + +func main() { + println(boards.Render("test_board")) +} + +// Error: +// unauthorized diff --git a/portal-loop/extracted/r/demo/boards/z_0_b_filetest.gno b/portal-loop/extracted/r/demo/boards/z_0_b_filetest.gno new file mode 100644 index 00000000..9bcbe9ff --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/z_0_b_filetest.gno @@ -0,0 +1,23 @@ +// PKGPATH: gno.land/r/demo/boards_test +package boards_test + +// SEND: 19900000ugnot + +import ( + "gno.land/r/demo/boards" + "gno.land/r/demo/users" +) + +var bid boards.BoardID + +func init() { + users.Register("", "gnouser", "my profile") + bid = boards.CreateBoard("test_board") +} + +func main() { + println(boards.Render("test_board")) +} + +// Error: +// payment must not be less than 20000000 diff --git a/portal-loop/extracted/r/demo/boards/z_0_c_filetest.gno b/portal-loop/extracted/r/demo/boards/z_0_c_filetest.gno new file mode 100644 index 00000000..99fd339a --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/z_0_c_filetest.gno @@ -0,0 +1,23 @@ +// PKGPATH: gno.land/r/demo/boards_test +package boards_test + +// SEND: 200000000ugnot + +import ( + "gno.land/r/demo/boards" + "gno.land/r/demo/users" +) + +var bid boards.BoardID + +func init() { + users.Register("", "gnouser", "my profile") + boards.CreateThread(1, "First Post (title)", "Body of the first post. (body)") +} + +func main() { + println(boards.Render("test_board")) +} + +// Error: +// board not exist diff --git a/portal-loop/extracted/r/demo/boards/z_0_d_filetest.gno b/portal-loop/extracted/r/demo/boards/z_0_d_filetest.gno new file mode 100644 index 00000000..c77e60e3 --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/z_0_d_filetest.gno @@ -0,0 +1,24 @@ +// PKGPATH: gno.land/r/demo/boards_test +package boards_test + +// SEND: 200000000ugnot + +import ( + "gno.land/r/demo/boards" + "gno.land/r/demo/users" +) + +var bid boards.BoardID + +func init() { + users.Register("", "gnouser", "my profile") + bid = boards.CreateBoard("test_board") + boards.CreateReply(bid, 0, 0, "Reply of the second post") +} + +func main() { + println(boards.Render("test_board")) +} + +// Error: +// thread not exist diff --git a/portal-loop/extracted/r/demo/boards/z_0_e_filetest.gno b/portal-loop/extracted/r/demo/boards/z_0_e_filetest.gno new file mode 100644 index 00000000..6db036e8 --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/z_0_e_filetest.gno @@ -0,0 +1,23 @@ +// PKGPATH: gno.land/r/demo/boards_test +package boards_test + +// SEND: 200000000ugnot + +import ( + "gno.land/r/demo/boards" + "gno.land/r/demo/users" +) + +var bid boards.BoardID + +func init() { + users.Register("", "gnouser", "my profile") + boards.CreateReply(bid, 0, 0, "Reply of the second post") +} + +func main() { + println(boards.Render("test_board")) +} + +// Error: +// board not exist diff --git a/portal-loop/extracted/r/demo/boards/z_0_filetest.gno b/portal-loop/extracted/r/demo/boards/z_0_filetest.gno new file mode 100644 index 00000000..e20964d5 --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/z_0_filetest.gno @@ -0,0 +1,39 @@ +// PKGPATH: gno.land/r/demo/boards_test +package boards_test + +// SEND: 20000000ugnot + +import ( + "gno.land/r/demo/boards" + "gno.land/r/demo/users" +) + +var bid boards.BoardID + +func init() { + users.Register("", "gnouser", "my profile") + + bid = boards.CreateBoard("test_board") + boards.CreateThread(bid, "First Post (title)", "Body of the first post. (body)") + pid := boards.CreateThread(bid, "Second Post (title)", "Body of the second post. (body)") + boards.CreateReply(bid, pid, pid, "Reply of the second post") +} + +func main() { + println(boards.Render("test_board")) +} + +// Output: +// \[[post](/r/demo/boards?help&__func=CreateThread&bid=1&body.type=textarea)] +// +// ---------------------------------------- +// ## [First Post (title)](/r/demo/boards:test_board/1) +// +// Body of the first post. (body) +// \- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm UTC](/r/demo/boards:test_board/1) \[[x](/r/demo/boards?help&__func=DeletePost&bid=1&threadid=1&postid=1)] (0 replies) (0 reposts) +// +// ---------------------------------------- +// ## [Second Post (title)](/r/demo/boards:test_board/2) +// +// Body of the second post. (body) +// \- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm UTC](/r/demo/boards:test_board/2) \[[x](/r/demo/boards?help&__func=DeletePost&bid=1&threadid=2&postid=2)] (1 replies) (0 reposts) diff --git a/portal-loop/extracted/r/demo/boards/z_10_a_filetest.gno b/portal-loop/extracted/r/demo/boards/z_10_a_filetest.gno new file mode 100644 index 00000000..ad57283b --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/z_10_a_filetest.gno @@ -0,0 +1,34 @@ +// PKGPATH: gno.land/r/demo/boards_test +package boards_test + +// SEND: 200000000ugnot + +import ( + "strconv" + + "gno.land/r/demo/boards" + "gno.land/r/demo/users" +) + +var ( + bid boards.BoardID + pid boards.PostID +) + +func init() { + users.Register("", "gnouser", "my profile") + + bid = boards.CreateBoard("test_board") + pid = boards.CreateThread(bid, "First Post in (title)", "Body of the first post. (body)") +} + +func main() { + println(boards.Render("test_board/" + strconv.Itoa(int(pid)))) + // boardId 2 not exist + boards.DeletePost(2, pid, pid, "") + println("----------------------------------------------------") + println(boards.Render("test_board/" + strconv.Itoa(int(pid)))) +} + +// Error: +// board not exist diff --git a/portal-loop/extracted/r/demo/boards/z_10_b_filetest.gno b/portal-loop/extracted/r/demo/boards/z_10_b_filetest.gno new file mode 100644 index 00000000..cf8a3321 --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/z_10_b_filetest.gno @@ -0,0 +1,34 @@ +// PKGPATH: gno.land/r/demo/boards_test +package boards_test + +// SEND: 200000000ugnot + +import ( + "strconv" + + "gno.land/r/demo/boards" + "gno.land/r/demo/users" +) + +var ( + bid boards.BoardID + pid boards.PostID +) + +func init() { + users.Register("", "gnouser", "my profile") + + bid = boards.CreateBoard("test_board") + pid = boards.CreateThread(bid, "First Post in (title)", "Body of the first post. (body)") +} + +func main() { + println(boards.Render("test_board/" + strconv.Itoa(int(pid)))) + // pid of 2 not exist + boards.DeletePost(bid, 2, 2, "") + println("----------------------------------------------------") + println(boards.Render("test_board/" + strconv.Itoa(int(pid)))) +} + +// Error: +// thread not exist diff --git a/portal-loop/extracted/r/demo/boards/z_10_c_filetest.gno b/portal-loop/extracted/r/demo/boards/z_10_c_filetest.gno new file mode 100644 index 00000000..8555af0b --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/z_10_c_filetest.gno @@ -0,0 +1,48 @@ +// PKGPATH: gno.land/r/demo/boards_test +package boards_test + +// SEND: 200000000ugnot + +import ( + "strconv" + + "gno.land/r/demo/boards" + "gno.land/r/demo/users" +) + +var ( + bid boards.BoardID + pid boards.PostID + rid boards.PostID +) + +func init() { + users.Register("", "gnouser", "my profile") + + bid = boards.CreateBoard("test_board") + pid = boards.CreateThread(bid, "First Post in (title)", "Body of the first post. (body)") + rid = boards.CreateReply(bid, pid, pid, "First reply of the First post\n") +} + +func main() { + println(boards.Render("test_board/" + strconv.Itoa(int(pid)))) + boards.DeletePost(bid, pid, rid, "") + println("----------------------------------------------------") + println(boards.Render("test_board/" + strconv.Itoa(int(pid)))) +} + +// Output: +// # First Post in (title) +// +// Body of the first post. (body) +// \- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/1) \[[reply](/r/demo/boards?help&__func=CreateReply&bid=1&threadid=1&postid=1&body.type=textarea)] \[[repost](/r/demo/boards?help&__func=CreateRepost&bid=1&postid=1&title.type=textarea&body.type=textarea&dstBoardID.type=textarea)] \[[x](/r/demo/boards?help&__func=DeletePost&bid=1&threadid=1&postid=1)] +// +// > First reply of the First post +// > +// > \- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/1/2) \[[reply](/r/demo/boards?help&__func=CreateReply&bid=1&threadid=1&postid=2&body.type=textarea)] \[[x](/r/demo/boards?help&__func=DeletePost&bid=1&threadid=1&postid=2)] +// +// ---------------------------------------------------- +// # First Post in (title) +// +// Body of the first post. (body) +// \- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/1) \[[reply](/r/demo/boards?help&__func=CreateReply&bid=1&threadid=1&postid=1&body.type=textarea)] \[[repost](/r/demo/boards?help&__func=CreateRepost&bid=1&postid=1&title.type=textarea&body.type=textarea&dstBoardID.type=textarea)] \[[x](/r/demo/boards?help&__func=DeletePost&bid=1&threadid=1&postid=1)] diff --git a/portal-loop/extracted/r/demo/boards/z_10_filetest.gno b/portal-loop/extracted/r/demo/boards/z_10_filetest.gno new file mode 100644 index 00000000..548b5865 --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/z_10_filetest.gno @@ -0,0 +1,39 @@ +// PKGPATH: gno.land/r/demo/boards_test +package boards_test + +// SEND: 200000000ugnot + +import ( + "strconv" + + "gno.land/r/demo/boards" + "gno.land/r/demo/users" +) + +var ( + bid boards.BoardID + pid boards.PostID +) + +func init() { + users.Register("", "gnouser", "my profile") + + bid = boards.CreateBoard("test_board") + pid = boards.CreateThread(bid, "First Post in (title)", "Body of the first post. (body)") +} + +func main() { + println(boards.Render("test_board/" + strconv.Itoa(int(pid)))) + boards.DeletePost(bid, pid, pid, "") + println("----------------------------------------------------") + println(boards.Render("test_board/" + strconv.Itoa(int(pid)))) +} + +// Output: +// # First Post in (title) +// +// Body of the first post. (body) +// \- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/1) \[[reply](/r/demo/boards?help&__func=CreateReply&bid=1&threadid=1&postid=1&body.type=textarea)] \[[repost](/r/demo/boards?help&__func=CreateRepost&bid=1&postid=1&title.type=textarea&body.type=textarea&dstBoardID.type=textarea)] \[[x](/r/demo/boards?help&__func=DeletePost&bid=1&threadid=1&postid=1)] +// +// ---------------------------------------------------- +// thread does not exist with id: 1 diff --git a/portal-loop/extracted/r/demo/boards/z_11_a_filetest.gno b/portal-loop/extracted/r/demo/boards/z_11_a_filetest.gno new file mode 100644 index 00000000..d7dc7b90 --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/z_11_a_filetest.gno @@ -0,0 +1,34 @@ +// PKGPATH: gno.land/r/demo/boards_test +package boards_test + +// SEND: 200000000ugnot + +import ( + "strconv" + + "gno.land/r/demo/boards" + "gno.land/r/demo/users" +) + +var ( + bid boards.BoardID + pid boards.PostID +) + +func init() { + users.Register("", "gnouser", "my profile") + + bid = boards.CreateBoard("test_board") + pid = boards.CreateThread(bid, "First Post in (title)", "Body of the first post. (body)") +} + +func main() { + println(boards.Render("test_board/" + strconv.Itoa(int(pid)))) + // board 2 not exist + boards.EditPost(2, pid, pid, "Edited: First Post in (title)", "Edited: Body of the first post. (body)") + println("----------------------------------------------------") + println(boards.Render("test_board/" + strconv.Itoa(int(pid)))) +} + +// Error: +// board not exist diff --git a/portal-loop/extracted/r/demo/boards/z_11_b_filetest.gno b/portal-loop/extracted/r/demo/boards/z_11_b_filetest.gno new file mode 100644 index 00000000..3aa28095 --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/z_11_b_filetest.gno @@ -0,0 +1,34 @@ +// PKGPATH: gno.land/r/demo/boards_test +package boards_test + +// SEND: 200000000ugnot + +import ( + "strconv" + + "gno.land/r/demo/boards" + "gno.land/r/demo/users" +) + +var ( + bid boards.BoardID + pid boards.PostID +) + +func init() { + users.Register("", "gnouser", "my profile") + + bid = boards.CreateBoard("test_board") + pid = boards.CreateThread(bid, "First Post in (title)", "Body of the first post. (body)") +} + +func main() { + println(boards.Render("test_board/" + strconv.Itoa(int(pid)))) + // thread 2 not exist + boards.EditPost(bid, 2, pid, "Edited: First Post in (title)", "Edited: Body of the first post. (body)") + println("----------------------------------------------------") + println(boards.Render("test_board/" + strconv.Itoa(int(pid)))) +} + +// Error: +// thread not exist diff --git a/portal-loop/extracted/r/demo/boards/z_11_c_filetest.gno b/portal-loop/extracted/r/demo/boards/z_11_c_filetest.gno new file mode 100644 index 00000000..df764303 --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/z_11_c_filetest.gno @@ -0,0 +1,34 @@ +// PKGPATH: gno.land/r/demo/boards_test +package boards_test + +// SEND: 200000000ugnot + +import ( + "strconv" + + "gno.land/r/demo/boards" + "gno.land/r/demo/users" +) + +var ( + bid boards.BoardID + pid boards.PostID +) + +func init() { + users.Register("", "gnouser", "my profile") + + bid = boards.CreateBoard("test_board") + pid = boards.CreateThread(bid, "First Post in (title)", "Body of the first post. (body)") +} + +func main() { + println(boards.Render("test_board/" + strconv.Itoa(int(pid)))) + // post 2 not exist + boards.EditPost(bid, pid, 2, "Edited: First Post in (title)", "Edited: Body of the first post. (body)") + println("----------------------------------------------------") + println(boards.Render("test_board/" + strconv.Itoa(int(pid)))) +} + +// Error: +// post not exist diff --git a/portal-loop/extracted/r/demo/boards/z_11_d_filetest.gno b/portal-loop/extracted/r/demo/boards/z_11_d_filetest.gno new file mode 100644 index 00000000..c114e769 --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/z_11_d_filetest.gno @@ -0,0 +1,52 @@ +// PKGPATH: gno.land/r/demo/boards_test +package boards_test + +// SEND: 200000000ugnot + +import ( + "strconv" + + "gno.land/r/demo/boards" + "gno.land/r/demo/users" +) + +var ( + bid boards.BoardID + pid boards.PostID + rid boards.PostID +) + +func init() { + users.Register("", "gnouser", "my profile") + + bid = boards.CreateBoard("test_board") + pid = boards.CreateThread(bid, "First Post in (title)", "Body of the first post. (body)") + rid = boards.CreateReply(bid, pid, pid, "First reply of the First post\n") +} + +func main() { + println(boards.Render("test_board/" + strconv.Itoa(int(pid)))) + boards.EditPost(bid, pid, rid, "", "Edited: First reply of the First post\n") + println("----------------------------------------------------") + println(boards.Render("test_board/" + strconv.Itoa(int(pid)))) +} + +// Output: +// # First Post in (title) +// +// Body of the first post. (body) +// \- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/1) \[[reply](/r/demo/boards?help&__func=CreateReply&bid=1&threadid=1&postid=1&body.type=textarea)] \[[repost](/r/demo/boards?help&__func=CreateRepost&bid=1&postid=1&title.type=textarea&body.type=textarea&dstBoardID.type=textarea)] \[[x](/r/demo/boards?help&__func=DeletePost&bid=1&threadid=1&postid=1)] +// +// > First reply of the First post +// > +// > \- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/1/2) \[[reply](/r/demo/boards?help&__func=CreateReply&bid=1&threadid=1&postid=2&body.type=textarea)] \[[x](/r/demo/boards?help&__func=DeletePost&bid=1&threadid=1&postid=2)] +// +// ---------------------------------------------------- +// # First Post in (title) +// +// Body of the first post. (body) +// \- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/1) \[[reply](/r/demo/boards?help&__func=CreateReply&bid=1&threadid=1&postid=1&body.type=textarea)] \[[repost](/r/demo/boards?help&__func=CreateRepost&bid=1&postid=1&title.type=textarea&body.type=textarea&dstBoardID.type=textarea)] \[[x](/r/demo/boards?help&__func=DeletePost&bid=1&threadid=1&postid=1)] +// +// > Edited: First reply of the First post +// > +// > \- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/1/2) \[[reply](/r/demo/boards?help&__func=CreateReply&bid=1&threadid=1&postid=2&body.type=textarea)] \[[x](/r/demo/boards?help&__func=DeletePost&bid=1&threadid=1&postid=2)] diff --git a/portal-loop/extracted/r/demo/boards/z_11_filetest.gno b/portal-loop/extracted/r/demo/boards/z_11_filetest.gno new file mode 100644 index 00000000..4cbdeeca --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/z_11_filetest.gno @@ -0,0 +1,42 @@ +// PKGPATH: gno.land/r/demo/boards_test +package boards_test + +// SEND: 200000000ugnot + +import ( + "strconv" + + "gno.land/r/demo/boards" + "gno.land/r/demo/users" +) + +var ( + bid boards.BoardID + pid boards.PostID +) + +func init() { + users.Register("", "gnouser", "my profile") + + bid = boards.CreateBoard("test_board") + pid = boards.CreateThread(bid, "First Post in (title)", "Body of the first post. (body)") +} + +func main() { + println(boards.Render("test_board/" + strconv.Itoa(int(pid)))) + boards.EditPost(bid, pid, pid, "Edited: First Post in (title)", "Edited: Body of the first post. (body)") + println("----------------------------------------------------") + println(boards.Render("test_board/" + strconv.Itoa(int(pid)))) +} + +// Output: +// # First Post in (title) +// +// Body of the first post. (body) +// \- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/1) \[[reply](/r/demo/boards?help&__func=CreateReply&bid=1&threadid=1&postid=1&body.type=textarea)] \[[repost](/r/demo/boards?help&__func=CreateRepost&bid=1&postid=1&title.type=textarea&body.type=textarea&dstBoardID.type=textarea)] \[[x](/r/demo/boards?help&__func=DeletePost&bid=1&threadid=1&postid=1)] +// +// ---------------------------------------------------- +// # Edited: First Post in (title) +// +// Edited: Body of the first post. (body) +// \- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/1) \[[reply](/r/demo/boards?help&__func=CreateReply&bid=1&threadid=1&postid=1&body.type=textarea)] \[[repost](/r/demo/boards?help&__func=CreateRepost&bid=1&postid=1&title.type=textarea&body.type=textarea&dstBoardID.type=textarea)] \[[x](/r/demo/boards?help&__func=DeletePost&bid=1&threadid=1&postid=1)] diff --git a/portal-loop/extracted/r/demo/boards/z_12_a_filetest.gno b/portal-loop/extracted/r/demo/boards/z_12_a_filetest.gno new file mode 100644 index 00000000..909be880 --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/z_12_a_filetest.gno @@ -0,0 +1,32 @@ +// PKGPATH: gno.land/r/demo/boards_test +package boards_test + +// SEND: 200000000ugnot + +import ( + "std" + + "gno.land/p/demo/testutils" + "gno.land/r/demo/boards" + "gno.land/r/demo/users" +) + +func main() { + users.Register("", "gnouser", "my profile") + // create a post via registered user + bid1 := boards.CreateBoard("test_board1") + pid := boards.CreateThread(bid1, "First Post (title)", "Body of the first post. (body)") + bid2 := boards.CreateBoard("test_board2") + + // create a repost via anon user + test2 := testutils.TestAddress("test2") + std.TestSetOrigCaller(test2) + std.TestSetOrigSend(std.Coins{{"ugnot", 9000000}}, nil) + + rid := boards.CreateRepost(bid1, pid, "", "Check this out", bid2) + println(rid) + println(boards.Render("test_board1")) +} + +// Error: +// please register, otherwise minimum fee 100000000 is required if anonymous diff --git a/portal-loop/extracted/r/demo/boards/z_12_b_filetest.gno b/portal-loop/extracted/r/demo/boards/z_12_b_filetest.gno new file mode 100644 index 00000000..6b216689 --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/z_12_b_filetest.gno @@ -0,0 +1,24 @@ +// PKGPATH: gno.land/r/demo/boards_test +package boards_test + +// SEND: 200000000ugnot + +import ( + "gno.land/r/demo/boards" + "gno.land/r/demo/users" +) + +func main() { + users.Register("", "gnouser", "my profile") + bid1 := boards.CreateBoard("test_board1") + pid := boards.CreateThread(bid1, "First Post (title)", "Body of the first post. (body)") + bid2 := boards.CreateBoard("test_board2") + + // create a repost to a non-existing board + rid := boards.CreateRepost(5, pid, "", "Check this out", bid2) + println(rid) + println(boards.Render("test_board1")) +} + +// Error: +// src board not exist diff --git a/portal-loop/extracted/r/demo/boards/z_12_c_filetest.gno b/portal-loop/extracted/r/demo/boards/z_12_c_filetest.gno new file mode 100644 index 00000000..7397c487 --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/z_12_c_filetest.gno @@ -0,0 +1,24 @@ +// PKGPATH: gno.land/r/demo/boards_test +package boards_test + +// SEND: 200000000ugnot + +import ( + "gno.land/r/demo/boards" + "gno.land/r/demo/users" +) + +func main() { + users.Register("", "gnouser", "my profile") + bid1 := boards.CreateBoard("test_board1") + boards.CreateThread(bid1, "First Post (title)", "Body of the first post. (body)") + bid2 := boards.CreateBoard("test_board2") + + // create a repost to a non-existing thread + rid := boards.CreateRepost(bid1, 5, "", "Check this out", bid2) + println(rid) + println(boards.Render("test_board1")) +} + +// Error: +// thread not exist diff --git a/portal-loop/extracted/r/demo/boards/z_12_d_filetest.gno b/portal-loop/extracted/r/demo/boards/z_12_d_filetest.gno new file mode 100644 index 00000000..37b6473f --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/z_12_d_filetest.gno @@ -0,0 +1,24 @@ +// PKGPATH: gno.land/r/demo/boards_test +package boards_test + +// SEND: 200000000ugnot + +import ( + "gno.land/r/demo/boards" + "gno.land/r/demo/users" +) + +func main() { + users.Register("", "gnouser", "my profile") + bid1 := boards.CreateBoard("test_board1") + pid := boards.CreateThread(bid1, "First Post (title)", "Body of the first post. (body)") + boards.CreateBoard("test_board2") + + // create a repost to a non-existing destination board + rid := boards.CreateRepost(bid1, pid, "", "Check this out", 5) + println(rid) + println(boards.Render("test_board1")) +} + +// Error: +// dst board not exist diff --git a/portal-loop/extracted/r/demo/boards/z_12_filetest.gno b/portal-loop/extracted/r/demo/boards/z_12_filetest.gno new file mode 100644 index 00000000..4ea75b27 --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/z_12_filetest.gno @@ -0,0 +1,40 @@ +// PKGPATH: gno.land/r/demo/boards_test +package boards_test + +// SEND: 200000000ugnot + +import ( + "gno.land/r/demo/boards" + "gno.land/r/demo/users" +) + +var ( + bid1 boards.BoardID + bid2 boards.BoardID + pid boards.PostID +) + +func init() { + users.Register("", "gnouser", "my profile") + + bid1 = boards.CreateBoard("test_board1") + pid = boards.CreateThread(bid1, "First Post (title)", "Body of the first post. (body)") + bid2 = boards.CreateBoard("test_board2") +} + +func main() { + rid := boards.CreateRepost(bid1, pid, "", "Check this out", bid2) + println(rid) + println(boards.Render("test_board2")) +} + +// Output: +// 1 +// \[[post](/r/demo/boards?help&__func=CreateThread&bid=2&body.type=textarea)] +// +// ---------------------------------------- +// Repost: Check this out +// ## [First Post (title)](/r/demo/boards:test_board1/1) +// +// Body of the first post. (body) +// \- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm UTC](/r/demo/boards:test_board1/1) \[[x](/r/demo/boards?help&__func=DeletePost&bid=1&threadid=1&postid=1)] (0 replies) (1 reposts) diff --git a/portal-loop/extracted/r/demo/boards/z_1_filetest.gno b/portal-loop/extracted/r/demo/boards/z_1_filetest.gno new file mode 100644 index 00000000..ba0a277e --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/z_1_filetest.gno @@ -0,0 +1,28 @@ +// PKGPATH: gno.land/r/demo/boards_test +package boards_test + +// SEND: 200000000ugnot + +import ( + "gno.land/r/demo/boards" + "gno.land/r/demo/users" +) + +var board *boards.Board + +func init() { + users.Register("", "gnouser", "my profile") + + _ = boards.CreateBoard("test_board_1") + _ = boards.CreateBoard("test_board_2") +} + +func main() { + println(boards.Render("")) +} + +// Output: +// These are all the boards of this realm: +// +// * [/r/demo/boards:test_board_1](/r/demo/boards:test_board_1) +// * [/r/demo/boards:test_board_2](/r/demo/boards:test_board_2) diff --git a/portal-loop/extracted/r/demo/boards/z_2_filetest.gno b/portal-loop/extracted/r/demo/boards/z_2_filetest.gno new file mode 100644 index 00000000..f0d53204 --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/z_2_filetest.gno @@ -0,0 +1,38 @@ +// PKGPATH: gno.land/r/demo/boards_test +package boards_test + +// SEND: 200000000ugnot + +import ( + "strconv" + + "gno.land/r/demo/boards" + "gno.land/r/demo/users" +) + +var ( + bid boards.BoardID + pid boards.PostID +) + +func init() { + users.Register("", "gnouser", "my profile") + + bid = boards.CreateBoard("test_board") + boards.CreateThread(bid, "First Post (title)", "Body of the first post. (body)") + pid = boards.CreateThread(bid, "Second Post (title)", "Body of the second post. (body)") + boards.CreateReply(bid, pid, pid, "Reply of the second post") +} + +func main() { + println(boards.Render("test_board/" + strconv.Itoa(int(pid)))) +} + +// Output: +// # Second Post (title) +// +// Body of the second post. (body) +// \- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2) \[[reply](/r/demo/boards?help&__func=CreateReply&bid=1&threadid=2&postid=2&body.type=textarea)] \[[repost](/r/demo/boards?help&__func=CreateRepost&bid=1&postid=2&title.type=textarea&body.type=textarea&dstBoardID.type=textarea)] \[[x](/r/demo/boards?help&__func=DeletePost&bid=1&threadid=2&postid=2)] +// +// > Reply of the second post +// > \- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2/3) \[[reply](/r/demo/boards?help&__func=CreateReply&bid=1&threadid=2&postid=3&body.type=textarea)] \[[x](/r/demo/boards?help&__func=DeletePost&bid=1&threadid=2&postid=3)] diff --git a/portal-loop/extracted/r/demo/boards/z_3_filetest.gno b/portal-loop/extracted/r/demo/boards/z_3_filetest.gno new file mode 100644 index 00000000..021ae10b --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/z_3_filetest.gno @@ -0,0 +1,40 @@ +// PKGPATH: gno.land/r/demo/boards_test +package boards_test + +// SEND: 200000000ugnot + +import ( + "strconv" + + "gno.land/r/demo/boards" + "gno.land/r/demo/users" +) + +var ( + bid boards.BoardID + pid boards.PostID +) + +func init() { + users.Register("", "gnouser", "my profile") + + bid = boards.CreateBoard("test_board") + boards.CreateThread(bid, "First Post (title)", "Body of the first post. (body)") + pid = boards.CreateThread(bid, "Second Post (title)", "Body of the second post. (body)") +} + +func main() { + rid := boards.CreateReply(bid, pid, pid, "Reply of the second post") + println(rid) + println(boards.Render("test_board/" + strconv.Itoa(int(pid)))) +} + +// Output: +// 3 +// # Second Post (title) +// +// Body of the second post. (body) +// \- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2) \[[reply](/r/demo/boards?help&__func=CreateReply&bid=1&threadid=2&postid=2&body.type=textarea)] \[[repost](/r/demo/boards?help&__func=CreateRepost&bid=1&postid=2&title.type=textarea&body.type=textarea&dstBoardID.type=textarea)] \[[x](/r/demo/boards?help&__func=DeletePost&bid=1&threadid=2&postid=2)] +// +// > Reply of the second post +// > \- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2/3) \[[reply](/r/demo/boards?help&__func=CreateReply&bid=1&threadid=2&postid=3&body.type=textarea)] \[[x](/r/demo/boards?help&__func=DeletePost&bid=1&threadid=2&postid=3)] diff --git a/portal-loop/extracted/r/demo/boards/z_4_filetest.gno b/portal-loop/extracted/r/demo/boards/z_4_filetest.gno new file mode 100644 index 00000000..f0620c28 --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/z_4_filetest.gno @@ -0,0 +1,892 @@ +// PKGPATH: gno.land/r/demo/boards_test +package boards_test + +// SEND: 200000000ugnot + +import ( + "strconv" + + "gno.land/r/demo/boards" + "gno.land/r/demo/users" +) + +var ( + bid boards.BoardID + pid boards.PostID +) + +func init() { + users.Register("", "gnouser", "my profile") + + bid = boards.CreateBoard("test_board") + boards.CreateThread(bid, "First Post (title)", "Body of the first post. (body)") + pid = boards.CreateThread(bid, "Second Post (title)", "Body of the second post. (body)") + rid := boards.CreateReply(bid, pid, pid, "Reply of the second post") + println(rid) +} + +func main() { + rid2 := boards.CreateReply(bid, pid, pid, "Second reply of the second post") + println(rid2) + println(boards.Render("test_board/" + strconv.Itoa(int(pid)))) +} + +// Output: +// 3 +// 4 +// # Second Post (title) +// +// Body of the second post. (body) +// \- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2) \[[reply](/r/demo/boards?help&__func=CreateReply&bid=1&threadid=2&postid=2&body.type=textarea)] \[[repost](/r/demo/boards?help&__func=CreateRepost&bid=1&postid=2&title.type=textarea&body.type=textarea&dstBoardID.type=textarea)] \[[x](/r/demo/boards?help&__func=DeletePost&bid=1&threadid=2&postid=2)] +// +// > Reply of the second post +// > \- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2/3) \[[reply](/r/demo/boards?help&__func=CreateReply&bid=1&threadid=2&postid=3&body.type=textarea)] \[[x](/r/demo/boards?help&__func=DeletePost&bid=1&threadid=2&postid=3)] +// +// > Second reply of the second post +// > \- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2/4) \[[reply](/r/demo/boards?help&__func=CreateReply&bid=1&threadid=2&postid=4&body.type=textarea)] \[[x](/r/demo/boards?help&__func=DeletePost&bid=1&threadid=2&postid=4)] + +// Realm: +// switchrealm["gno.land/r/demo/users"] +// switchrealm["gno.land/r/demo/boards"] +// u[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:111]={ +// "ObjectInfo": { +// "ID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:111", +// "ModTime": "123", +// "OwnerID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:123", +// "RefCount": "1" +// }, +// "Value": { +// "T": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// }, +// "V": { +// "@type": "/gno.RefValue", +// "Hash": "68663c8895d37d479e417c11e21badfe21345c61", +// "ObjectID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:112" +// } +// } +// } +// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:125]={ +// "Fields": [ +// { +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "16" +// }, +// "V": { +// "@type": "/gno.StringValue", +// "value": "0000000004" +// } +// }, +// { +// "T": { +// "@type": "/gno.PointerType", +// "Elt": { +// "@type": "/gno.RefType", +// "ID": "gno.land/r/demo/boards.Post" +// } +// }, +// "V": { +// "@type": "/gno.PointerValue", +// "Base": { +// "@type": "/gno.RefValue", +// "Escaped": true, +// "ObjectID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:126" +// }, +// "Index": "0", +// "TV": null +// } +// }, +// { +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "64" +// } +// }, +// { +// "N": "AQAAAAAAAAA=", +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "32" +// } +// }, +// { +// "T": { +// "@type": "/gno.PointerType", +// "Elt": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// } +// } +// }, +// { +// "T": { +// "@type": "/gno.PointerType", +// "Elt": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// } +// } +// } +// ], +// "ObjectInfo": { +// "ID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:125", +// "ModTime": "0", +// "OwnerID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:124", +// "RefCount": "1" +// } +// } +// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:124]={ +// "ObjectInfo": { +// "ID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:124", +// "ModTime": "0", +// "OwnerID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:123", +// "RefCount": "1" +// }, +// "Value": { +// "T": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// }, +// "V": { +// "@type": "/gno.RefValue", +// "Hash": "3f34ac77289aa1d5f9a2f8b6d083138325816fb0", +// "ObjectID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:125" +// } +// } +// } +// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:123]={ +// "Fields": [ +// { +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "16" +// }, +// "V": { +// "@type": "/gno.StringValue", +// "value": "0000000004" +// } +// }, +// {}, +// { +// "N": "AQAAAAAAAAA=", +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "64" +// } +// }, +// { +// "N": "AgAAAAAAAAA=", +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "32" +// } +// }, +// { +// "T": { +// "@type": "/gno.PointerType", +// "Elt": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// } +// }, +// "V": { +// "@type": "/gno.PointerValue", +// "Base": { +// "@type": "/gno.RefValue", +// "Hash": "94a6665a44bac6ede7f3e3b87173e537b12f9532", +// "ObjectID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:111" +// }, +// "Index": "0", +// "TV": null +// } +// }, +// { +// "T": { +// "@type": "/gno.PointerType", +// "Elt": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// } +// }, +// "V": { +// "@type": "/gno.PointerValue", +// "Base": { +// "@type": "/gno.RefValue", +// "Hash": "bc8e5b4e782a0bbc4ac9689681f119beb7b34d59", +// "ObjectID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:124" +// }, +// "Index": "0", +// "TV": null +// } +// } +// ], +// "ObjectInfo": { +// "ID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:123", +// "ModTime": "0", +// "OwnerID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:122", +// "RefCount": "1" +// } +// } +// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:122]={ +// "ObjectInfo": { +// "ID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:122", +// "ModTime": "0", +// "OwnerID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:106", +// "RefCount": "1" +// }, +// "Value": { +// "T": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// }, +// "V": { +// "@type": "/gno.RefValue", +// "Hash": "9957eadbc91dd32f33b0d815e041a32dbdea0671", +// "ObjectID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:123" +// } +// } +// } +// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:128]={ +// "Fields": [ +// { +// "T": { +// "@type": "/gno.PointerType", +// "Elt": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// } +// } +// } +// ], +// "ObjectInfo": { +// "ID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:128", +// "ModTime": "0", +// "OwnerID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:127", +// "RefCount": "1" +// } +// } +// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:129]={ +// "Fields": [ +// { +// "T": { +// "@type": "/gno.PointerType", +// "Elt": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// } +// } +// } +// ], +// "ObjectInfo": { +// "ID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:129", +// "ModTime": "0", +// "OwnerID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:127", +// "RefCount": "1" +// } +// } +// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:130]={ +// "Fields": [ +// { +// "T": { +// "@type": "/gno.PointerType", +// "Elt": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// } +// } +// } +// ], +// "ObjectInfo": { +// "ID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:130", +// "ModTime": "0", +// "OwnerID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:127", +// "RefCount": "1" +// } +// } +// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:131]={ +// "Fields": [ +// { +// "N": "AAAAgJSeXbo=", +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "65536" +// } +// }, +// { +// "N": "AbSNdvQQIhE=", +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "1024" +// } +// }, +// { +// "T": { +// "@type": "/gno.PointerType", +// "Elt": { +// "@type": "/gno.RefType", +// "ID": "time.Location" +// } +// }, +// "V": { +// "@type": "/gno.PointerValue", +// "Base": { +// "@type": "/gno.RefValue", +// "Escaped": true, +// "ObjectID": "336074805fc853987abe6f7fe3ad97a6a6f3077a:2" +// }, +// "Index": "182", +// "TV": null +// } +// } +// ], +// "ObjectInfo": { +// "ID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:131", +// "ModTime": "0", +// "OwnerID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:127", +// "RefCount": "1" +// } +// } +// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:132]={ +// "Fields": [ +// { +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "65536" +// } +// }, +// { +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "1024" +// } +// }, +// { +// "T": { +// "@type": "/gno.PointerType", +// "Elt": { +// "@type": "/gno.RefType", +// "ID": "time.Location" +// } +// } +// } +// ], +// "ObjectInfo": { +// "ID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:132", +// "ModTime": "0", +// "OwnerID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:127", +// "RefCount": "1" +// } +// } +// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:127]={ +// "Fields": [ +// { +// "T": { +// "@type": "/gno.PointerType", +// "Elt": { +// "@type": "/gno.RefType", +// "ID": "gno.land/r/demo/boards.Board" +// } +// }, +// "V": { +// "@type": "/gno.PointerValue", +// "Base": { +// "@type": "/gno.RefValue", +// "Escaped": true, +// "ObjectID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:84" +// }, +// "Index": "0", +// "TV": null +// } +// }, +// { +// "N": "BAAAAAAAAAA=", +// "T": { +// "@type": "/gno.RefType", +// "ID": "gno.land/r/demo/boards.PostID" +// } +// }, +// { +// "T": { +// "@type": "/gno.RefType", +// "ID": "std.Address" +// }, +// "V": { +// "@type": "/gno.StringValue", +// "value": "g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm" +// } +// }, +// { +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "16" +// }, +// "V": { +// "@type": "/gno.StringValue", +// "value": "" +// } +// }, +// { +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "16" +// }, +// "V": { +// "@type": "/gno.StringValue", +// "value": "Second reply of the second post" +// } +// }, +// { +// "T": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Tree" +// }, +// "V": { +// "@type": "/gno.RefValue", +// "Hash": "f91e355bd19240f0f3350a7fa0e6a82b72225916", +// "ObjectID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:128" +// } +// }, +// { +// "T": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Tree" +// }, +// "V": { +// "@type": "/gno.RefValue", +// "Hash": "9ee9c4117be283fc51ffcc5ecd65b75ecef5a9dd", +// "ObjectID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:129" +// } +// }, +// { +// "T": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Tree" +// }, +// "V": { +// "@type": "/gno.RefValue", +// "Hash": "eb768b0140a5fe95f9c58747f0960d647dacfd42", +// "ObjectID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:130" +// } +// }, +// { +// "N": "AgAAAAAAAAA=", +// "T": { +// "@type": "/gno.RefType", +// "ID": "gno.land/r/demo/boards.PostID" +// } +// }, +// { +// "N": "AgAAAAAAAAA=", +// "T": { +// "@type": "/gno.RefType", +// "ID": "gno.land/r/demo/boards.PostID" +// } +// }, +// { +// "T": { +// "@type": "/gno.RefType", +// "ID": "gno.land/r/demo/boards.BoardID" +// } +// }, +// { +// "T": { +// "@type": "/gno.RefType", +// "ID": "time.Time" +// }, +// "V": { +// "@type": "/gno.RefValue", +// "Hash": "0fd3352422af0a56a77ef2c9e88f479054e3d51f", +// "ObjectID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:131" +// } +// }, +// { +// "T": { +// "@type": "/gno.RefType", +// "ID": "time.Time" +// }, +// "V": { +// "@type": "/gno.RefValue", +// "Hash": "bed4afa8ffdbbf775451c947fc68b27a345ce32a", +// "ObjectID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:132" +// } +// } +// ], +// "ObjectInfo": { +// "ID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:127", +// "ModTime": "0", +// "OwnerID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:126", +// "RefCount": "1" +// } +// } +// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:126]={ +// "ObjectInfo": { +// "ID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:126", +// "IsEscaped": true, +// "ModTime": "0", +// "RefCount": "2" +// }, +// "Value": { +// "T": { +// "@type": "/gno.RefType", +// "ID": "gno.land/r/demo/boards.Post" +// }, +// "V": { +// "@type": "/gno.RefValue", +// "Hash": "c45bbd47a46681a63af973db0ec2180922e4a8ae", +// "ObjectID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:127" +// } +// } +// } +// u[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:120]={ +// "ObjectInfo": { +// "ID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:120", +// "ModTime": "134", +// "OwnerID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:134", +// "RefCount": "1" +// }, +// "Value": { +// "T": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// }, +// "V": { +// "@type": "/gno.RefValue", +// "Hash": "dc1f011553dc53e7a846049e08cc77fa35ea6a51", +// "ObjectID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:121" +// } +// } +// } +// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:136]={ +// "Fields": [ +// { +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "16" +// }, +// "V": { +// "@type": "/gno.StringValue", +// "value": "0000000004" +// } +// }, +// { +// "T": { +// "@type": "/gno.PointerType", +// "Elt": { +// "@type": "/gno.RefType", +// "ID": "gno.land/r/demo/boards.Post" +// } +// }, +// "V": { +// "@type": "/gno.PointerValue", +// "Base": { +// "@type": "/gno.RefValue", +// "Escaped": true, +// "ObjectID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:126" +// }, +// "Index": "0", +// "TV": null +// } +// }, +// { +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "64" +// } +// }, +// { +// "N": "AQAAAAAAAAA=", +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "32" +// } +// }, +// { +// "T": { +// "@type": "/gno.PointerType", +// "Elt": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// } +// } +// }, +// { +// "T": { +// "@type": "/gno.PointerType", +// "Elt": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// } +// } +// } +// ], +// "ObjectInfo": { +// "ID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:136", +// "ModTime": "0", +// "OwnerID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:135", +// "RefCount": "1" +// } +// } +// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:135]={ +// "ObjectInfo": { +// "ID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:135", +// "ModTime": "0", +// "OwnerID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:134", +// "RefCount": "1" +// }, +// "Value": { +// "T": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// }, +// "V": { +// "@type": "/gno.RefValue", +// "Hash": "96b86b4585c7f1075d7794180a5581f72733a7ab", +// "ObjectID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:136" +// } +// } +// } +// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:134]={ +// "Fields": [ +// { +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "16" +// }, +// "V": { +// "@type": "/gno.StringValue", +// "value": "0000000004" +// } +// }, +// {}, +// { +// "N": "AQAAAAAAAAA=", +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "64" +// } +// }, +// { +// "N": "AgAAAAAAAAA=", +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "32" +// } +// }, +// { +// "T": { +// "@type": "/gno.PointerType", +// "Elt": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// } +// }, +// "V": { +// "@type": "/gno.PointerValue", +// "Base": { +// "@type": "/gno.RefValue", +// "Hash": "32274e1f28fb2b97d67a1262afd362d370de7faa", +// "ObjectID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:120" +// }, +// "Index": "0", +// "TV": null +// } +// }, +// { +// "T": { +// "@type": "/gno.PointerType", +// "Elt": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// } +// }, +// "V": { +// "@type": "/gno.PointerValue", +// "Base": { +// "@type": "/gno.RefValue", +// "Hash": "c2cfd6aec36a462f35bf02e5bf4a127aa1bb7ac2", +// "ObjectID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:135" +// }, +// "Index": "0", +// "TV": null +// } +// } +// ], +// "ObjectInfo": { +// "ID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:134", +// "ModTime": "0", +// "OwnerID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:133", +// "RefCount": "1" +// } +// } +// c[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:133]={ +// "ObjectInfo": { +// "ID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:133", +// "ModTime": "0", +// "OwnerID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:107", +// "RefCount": "1" +// }, +// "Value": { +// "T": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// }, +// "V": { +// "@type": "/gno.RefValue", +// "Hash": "5cb875179e86d32c517322af7a323b2a5f3e6cc5", +// "ObjectID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:134" +// } +// } +// } +// u[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:85]={ +// "Fields": [ +// { +// "N": "AQAAAAAAAAA=", +// "T": { +// "@type": "/gno.RefType", +// "ID": "gno.land/r/demo/boards.BoardID" +// } +// }, +// { +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "16" +// }, +// "V": { +// "@type": "/gno.StringValue", +// "value": "/r/demo/boards:test_board" +// } +// }, +// { +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "16" +// }, +// "V": { +// "@type": "/gno.StringValue", +// "value": "test_board" +// } +// }, +// { +// "T": { +// "@type": "/gno.RefType", +// "ID": "std.Address" +// }, +// "V": { +// "@type": "/gno.StringValue", +// "value": "g1wymu47drhr0kuq2098m792lytgtj2nyx77yrsm" +// } +// }, +// { +// "T": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Tree" +// }, +// "V": { +// "@type": "/gno.RefValue", +// "Hash": "a416a751c3a45a1e5cba11e737c51340b081e372", +// "ObjectID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:86" +// } +// }, +// { +// "N": "BAAAAAAAAAA=", +// "T": { +// "@type": "/gno.PrimitiveType", +// "value": "65536" +// } +// }, +// { +// "T": { +// "@type": "/gno.RefType", +// "ID": "time.Time" +// }, +// "V": { +// "@type": "/gno.RefValue", +// "Hash": "36299fccbc13f2a84c4629fad4cb940f0bd4b1c6", +// "ObjectID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:87" +// } +// }, +// { +// "T": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Tree" +// }, +// "V": { +// "@type": "/gno.RefValue", +// "Hash": "af6ed0268f99b7f369329094eb6dfaea7812708b", +// "ObjectID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:88" +// } +// } +// ], +// "ObjectInfo": { +// "ID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:85", +// "ModTime": "121", +// "OwnerID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:84", +// "RefCount": "1" +// } +// } +// u[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:106]={ +// "Fields": [ +// { +// "T": { +// "@type": "/gno.PointerType", +// "Elt": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// } +// }, +// "V": { +// "@type": "/gno.PointerValue", +// "Base": { +// "@type": "/gno.RefValue", +// "Hash": "9809329dc1ddc5d3556f7a8fa3c2cebcbf65560b", +// "ObjectID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:122" +// }, +// "Index": "0", +// "TV": null +// } +// } +// ], +// "ObjectInfo": { +// "ID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:106", +// "ModTime": "121", +// "OwnerID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:105", +// "RefCount": "1" +// } +// } +// u[f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:107]={ +// "Fields": [ +// { +// "T": { +// "@type": "/gno.PointerType", +// "Elt": { +// "@type": "/gno.RefType", +// "ID": "gno.land/p/demo/avl.Node" +// } +// }, +// "V": { +// "@type": "/gno.PointerValue", +// "Base": { +// "@type": "/gno.RefValue", +// "Hash": "ceae9a1c4ed28bb51062e6ccdccfad0caafd1c4f", +// "ObjectID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:133" +// }, +// "Index": "0", +// "TV": null +// } +// } +// ], +// "ObjectInfo": { +// "ID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:107", +// "ModTime": "121", +// "OwnerID": "f6dbf411da22e67d74cd7ddba6a76cd7e14a4822:105", +// "RefCount": "1" +// } +// } +// switchrealm["gno.land/r/demo/boards"] +// switchrealm["gno.land/r/demo/users"] +// switchrealm["gno.land/r/demo/users"] +// switchrealm["gno.land/r/demo/users"] +// switchrealm["gno.land/r/demo/boards"] +// switchrealm["gno.land/r/demo/boards_test"] diff --git a/portal-loop/extracted/r/demo/boards/z_5_b_filetest.gno b/portal-loop/extracted/r/demo/boards/z_5_b_filetest.gno new file mode 100644 index 00000000..e79da5c3 --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/z_5_b_filetest.gno @@ -0,0 +1,31 @@ +package main + +// SEND: 200000000ugnot + +import ( + "std" + "strconv" + + "gno.land/p/demo/testutils" + "gno.land/r/demo/boards" + "gno.land/r/demo/users" +) + +const admin = std.Address("g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj") + +func main() { + users.Register("", "gnouser", "my profile") + // create board via registered user + bid := boards.CreateBoard("test_board") + + // create post via anon user + test2 := testutils.TestAddress("test2") + std.TestSetOrigCaller(test2) + std.TestSetOrigSend(std.Coins{{"ugnot", 9000000}}, nil) + + pid := boards.CreateThread(bid, "First Post (title)", "Body of the first post. (body)") + println(boards.Render("test_board/" + strconv.Itoa(int(pid)))) +} + +// Error: +// please register, otherwise minimum fee 100000000 is required if anonymous diff --git a/portal-loop/extracted/r/demo/boards/z_5_c_filetest.gno b/portal-loop/extracted/r/demo/boards/z_5_c_filetest.gno new file mode 100644 index 00000000..176b1d89 --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/z_5_c_filetest.gno @@ -0,0 +1,39 @@ +package main + +// SEND: 200000000ugnot + +import ( + "std" + "strconv" + + "gno.land/p/demo/testutils" + "gno.land/r/demo/boards" + "gno.land/r/demo/users" +) + +const admin = std.Address("g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj") + +func main() { + users.Register("", "gnouser", "my profile") + // create board via registered user + bid := boards.CreateBoard("test_board") + + // create post via anon user + test2 := testutils.TestAddress("test2") + std.TestSetOrigCaller(test2) + std.TestSetOrigSend(std.Coins{{"ugnot", 101000000}}, nil) + + pid := boards.CreateThread(bid, "First Post (title)", "Body of the first post. (body)") + boards.CreateReply(bid, pid, pid, "Reply of the first post") + + println(boards.Render("test_board/" + strconv.Itoa(int(pid)))) +} + +// Output: +// # First Post (title) +// +// Body of the first post. (body) +// \- [g1w3jhxapjta047h6lta047h6lta047h6laqcyu4](/r/demo/users:g1w3jhxapjta047h6lta047h6lta047h6laqcyu4), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/1) \[[reply](/r/demo/boards?help&__func=CreateReply&bid=1&threadid=1&postid=1&body.type=textarea)] \[[repost](/r/demo/boards?help&__func=CreateRepost&bid=1&postid=1&title.type=textarea&body.type=textarea&dstBoardID.type=textarea)] \[[x](/r/demo/boards?help&__func=DeletePost&bid=1&threadid=1&postid=1)] +// +// > Reply of the first post +// > \- [g1w3jhxapjta047h6lta047h6lta047h6laqcyu4](/r/demo/users:g1w3jhxapjta047h6lta047h6lta047h6laqcyu4), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/1/2) \[[reply](/r/demo/boards?help&__func=CreateReply&bid=1&threadid=1&postid=2&body.type=textarea)] \[[x](/r/demo/boards?help&__func=DeletePost&bid=1&threadid=1&postid=2)] diff --git a/portal-loop/extracted/r/demo/boards/z_5_d_filetest.gno b/portal-loop/extracted/r/demo/boards/z_5_d_filetest.gno new file mode 100644 index 00000000..54cfe49e --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/z_5_d_filetest.gno @@ -0,0 +1,32 @@ +package main + +// SEND: 200000000ugnot + +import ( + "std" + "strconv" + + "gno.land/p/demo/testutils" + "gno.land/r/demo/boards" + "gno.land/r/demo/users" +) + +const admin = std.Address("g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj") + +func main() { + users.Register("", "gnouser", "my profile") + // create board via registered user + bid := boards.CreateBoard("test_board") + pid := boards.CreateThread(bid, "First Post (title)", "Body of the first post. (body)") + + // create reply via anon user + test2 := testutils.TestAddress("test2") + std.TestSetOrigCaller(test2) + std.TestSetOrigSend(std.Coins{{"ugnot", 9000000}}, nil) + boards.CreateReply(bid, pid, pid, "Reply of the first post") + + println(boards.Render("test_board/" + strconv.Itoa(int(pid)))) +} + +// Error: +// please register, otherwise minimum fee 100000000 is required if anonymous diff --git a/portal-loop/extracted/r/demo/boards/z_5_filetest.gno b/portal-loop/extracted/r/demo/boards/z_5_filetest.gno new file mode 100644 index 00000000..c326d961 --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/z_5_filetest.gno @@ -0,0 +1,43 @@ +// PKGPATH: gno.land/r/demo/boards_test +package boards_test + +// SEND: 200000000ugnot + +import ( + "strconv" + + "gno.land/r/demo/boards" + "gno.land/r/demo/users" +) + +var ( + bid boards.BoardID + pid boards.PostID +) + +func init() { + users.Register("", "gnouser", "my profile") + + bid = boards.CreateBoard("test_board") + boards.CreateThread(bid, "First Post (title)", "Body of the first post. (body)") + pid = boards.CreateThread(bid, "Second Post (title)", "Body of the second post. (body)") + rid := boards.CreateReply(bid, pid, pid, "Reply of the second post") +} + +func main() { + rid2 := boards.CreateReply(bid, pid, pid, "Second reply of the second post\n") + println(boards.Render("test_board/" + strconv.Itoa(int(pid)))) +} + +// Output: +// # Second Post (title) +// +// Body of the second post. (body) +// \- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2) \[[reply](/r/demo/boards?help&__func=CreateReply&bid=1&threadid=2&postid=2&body.type=textarea)] \[[repost](/r/demo/boards?help&__func=CreateRepost&bid=1&postid=2&title.type=textarea&body.type=textarea&dstBoardID.type=textarea)] \[[x](/r/demo/boards?help&__func=DeletePost&bid=1&threadid=2&postid=2)] +// +// > Reply of the second post +// > \- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2/3) \[[reply](/r/demo/boards?help&__func=CreateReply&bid=1&threadid=2&postid=3&body.type=textarea)] \[[x](/r/demo/boards?help&__func=DeletePost&bid=1&threadid=2&postid=3)] +// +// > Second reply of the second post +// > +// > \- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2/4) \[[reply](/r/demo/boards?help&__func=CreateReply&bid=1&threadid=2&postid=4&body.type=textarea)] \[[x](/r/demo/boards?help&__func=DeletePost&bid=1&threadid=2&postid=4)] diff --git a/portal-loop/extracted/r/demo/boards/z_6_filetest.gno b/portal-loop/extracted/r/demo/boards/z_6_filetest.gno new file mode 100644 index 00000000..b7de2d08 --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/z_6_filetest.gno @@ -0,0 +1,49 @@ +// PKGPATH: gno.land/r/demo/boards_test +package boards_test + +// SEND: 200000000ugnot + +import ( + "strconv" + + "gno.land/r/demo/boards" + "gno.land/r/demo/users" +) + +var ( + bid boards.BoardID + pid boards.PostID + rid boards.PostID +) + +func init() { + users.Register("", "gnouser", "my profile") + + bid = boards.CreateBoard("test_board") + boards.CreateThread(bid, "First Post (title)", "Body of the first post. (body)") + pid = boards.CreateThread(bid, "Second Post (title)", "Body of the second post. (body)") + rid = boards.CreateReply(bid, pid, pid, "Reply of the second post") +} + +func main() { + boards.CreateReply(bid, pid, pid, "Second reply of the second post\n") + boards.CreateReply(bid, pid, rid, "First reply of the first reply\n") + println(boards.Render("test_board/" + strconv.Itoa(int(pid)))) +} + +// Output: +// # Second Post (title) +// +// Body of the second post. (body) +// \- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2) \[[reply](/r/demo/boards?help&__func=CreateReply&bid=1&threadid=2&postid=2&body.type=textarea)] \[[repost](/r/demo/boards?help&__func=CreateRepost&bid=1&postid=2&title.type=textarea&body.type=textarea&dstBoardID.type=textarea)] \[[x](/r/demo/boards?help&__func=DeletePost&bid=1&threadid=2&postid=2)] +// +// > Reply of the second post +// > \- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2/3) \[[reply](/r/demo/boards?help&__func=CreateReply&bid=1&threadid=2&postid=3&body.type=textarea)] \[[x](/r/demo/boards?help&__func=DeletePost&bid=1&threadid=2&postid=3)] +// > +// > > First reply of the first reply +// > > +// > > \- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2/5) \[[reply](/r/demo/boards?help&__func=CreateReply&bid=1&threadid=2&postid=5&body.type=textarea)] \[[x](/r/demo/boards?help&__func=DeletePost&bid=1&threadid=2&postid=5)] +// +// > Second reply of the second post +// > +// > \- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2/4) \[[reply](/r/demo/boards?help&__func=CreateReply&bid=1&threadid=2&postid=4&body.type=textarea)] \[[x](/r/demo/boards?help&__func=DeletePost&bid=1&threadid=2&postid=4)] diff --git a/portal-loop/extracted/r/demo/boards/z_7_filetest.gno b/portal-loop/extracted/r/demo/boards/z_7_filetest.gno new file mode 100644 index 00000000..f1d41aa1 --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/z_7_filetest.gno @@ -0,0 +1,31 @@ +// PKGPATH: gno.land/r/demo/boards_test +package boards_test + +// SEND: 200000000ugnot + +import ( + "gno.land/r/demo/boards" + "gno.land/r/demo/users" +) + +func init() { + // register + users.Register("", "gnouser", "my profile") + + // create board and post + bid := boards.CreateBoard("test_board") + boards.CreateThread(bid, "First Post (title)", "Body of the first post. (body)") +} + +func main() { + println(boards.Render("test_board")) +} + +// Output: +// \[[post](/r/demo/boards?help&__func=CreateThread&bid=1&body.type=textarea)] +// +// ---------------------------------------- +// ## [First Post (title)](/r/demo/boards:test_board/1) +// +// Body of the first post. (body) +// \- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm UTC](/r/demo/boards:test_board/1) \[[x](/r/demo/boards?help&__func=DeletePost&bid=1&threadid=1&postid=1)] (0 replies) (0 reposts) diff --git a/portal-loop/extracted/r/demo/boards/z_8_filetest.gno b/portal-loop/extracted/r/demo/boards/z_8_filetest.gno new file mode 100644 index 00000000..18ad6408 --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/z_8_filetest.gno @@ -0,0 +1,44 @@ +// PKGPATH: gno.land/r/demo/boards_test +package boards_test + +// SEND: 200000000ugnot + +import ( + "strconv" + + "gno.land/r/demo/boards" + "gno.land/r/demo/users" +) + +var ( + bid boards.BoardID + pid boards.PostID + rid boards.PostID +) + +func init() { + users.Register("", "gnouser", "my profile") + + bid = boards.CreateBoard("test_board") + boards.CreateThread(bid, "First Post (title)", "Body of the first post. (body)") + pid = boards.CreateThread(bid, "Second Post (title)", "Body of the second post. (body)") + rid = boards.CreateReply(bid, pid, pid, "Reply of the second post") +} + +func main() { + boards.CreateReply(bid, pid, pid, "Second reply of the second post\n") + rid2 := boards.CreateReply(bid, pid, rid, "First reply of the first reply\n") + println(boards.Render("test_board/" + strconv.Itoa(int(pid)) + "/" + strconv.Itoa(int(rid2)))) +} + +// Output: +// _[see thread](/r/demo/boards:test_board/2)_ +// +// Reply of the second post +// \- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2/3) \[[reply](/r/demo/boards?help&__func=CreateReply&bid=1&threadid=2&postid=3&body.type=textarea)] \[[x](/r/demo/boards?help&__func=DeletePost&bid=1&threadid=2&postid=3)] +// +// _[see all 1 replies](/r/demo/boards:test_board/2/3)_ +// +// > First reply of the first reply +// > +// > \- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:test_board/2/5) \[[reply](/r/demo/boards?help&__func=CreateReply&bid=1&threadid=2&postid=5&body.type=textarea)] \[[x](/r/demo/boards?help&__func=DeletePost&bid=1&threadid=2&postid=5)] diff --git a/portal-loop/extracted/r/demo/boards/z_9_a_filetest.gno b/portal-loop/extracted/r/demo/boards/z_9_a_filetest.gno new file mode 100644 index 00000000..8d07ba0e --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/z_9_a_filetest.gno @@ -0,0 +1,25 @@ +// PKGPATH: gno.land/r/demo/boards_test +package boards_test + +// SEND: 200000000ugnot + +import ( + "gno.land/r/demo/boards" + "gno.land/r/demo/users" +) + +var dstBoard boards.BoardID + +func init() { + users.Register("", "gnouser", "my profile") + + dstBoard = boards.CreateBoard("dst_board") + + boards.CreateRepost(0, 0, "First Post in (title)", "Body of the first post. (body)", dstBoard) +} + +func main() { +} + +// Error: +// src board not exist diff --git a/portal-loop/extracted/r/demo/boards/z_9_b_filetest.gno b/portal-loop/extracted/r/demo/boards/z_9_b_filetest.gno new file mode 100644 index 00000000..68daf770 --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/z_9_b_filetest.gno @@ -0,0 +1,29 @@ +// PKGPATH: gno.land/r/demo/boards_test +package boards_test + +// SEND: 200000000ugnot + +import ( + "gno.land/r/demo/boards" + "gno.land/r/demo/users" +) + +var ( + srcBoard boards.BoardID + pid boards.PostID +) + +func init() { + users.Register("", "gnouser", "my profile") + + srcBoard = boards.CreateBoard("first_board") + pid = boards.CreateThread(srcBoard, "First Post in (title)", "Body of the first post. (body)") + + boards.CreateRepost(srcBoard, pid, "First Post in (title)", "Body of the first post. (body)", 0) +} + +func main() { +} + +// Error: +// dst board not exist diff --git a/portal-loop/extracted/r/demo/boards/z_9_filetest.gno b/portal-loop/extracted/r/demo/boards/z_9_filetest.gno new file mode 100644 index 00000000..10a1444f --- /dev/null +++ b/portal-loop/extracted/r/demo/boards/z_9_filetest.gno @@ -0,0 +1,37 @@ +// PKGPATH: gno.land/r/demo/boards_test +package boards_test + +// SEND: 200000000ugnot + +import ( + "strconv" + + "gno.land/r/demo/boards" + "gno.land/r/demo/users" +) + +var ( + firstBoard boards.BoardID + secondBoard boards.BoardID + pid boards.PostID +) + +func init() { + users.Register("", "gnouser", "my profile") + + firstBoard = boards.CreateBoard("first_board") + secondBoard = boards.CreateBoard("second_board") + pid = boards.CreateThread(firstBoard, "First Post in (title)", "Body of the first post. (body)") + + boards.CreateRepost(firstBoard, pid, "First Post in (title)", "Body of the first post. (body)", secondBoard) +} + +func main() { + println(boards.Render("second_board/" + strconv.Itoa(int(pid)))) +} + +// Output: +// # First Post in (title) +// +// Body of the first post. (body) +// \- [@gnouser](/r/demo/users:gnouser), [2009-02-13 11:31pm (UTC)](/r/demo/boards:second_board/1/1) \[[reply](/r/demo/boards?help&__func=CreateReply&bid=2&threadid=1&postid=1&body.type=textarea)] \[[x](/r/demo/boards?help&__func=DeletePost&bid=2&threadid=1&postid=1)] diff --git a/portal-loop/extracted/r/demo/counter/counter.gno b/portal-loop/extracted/r/demo/counter/counter.gno new file mode 100644 index 00000000..43943e11 --- /dev/null +++ b/portal-loop/extracted/r/demo/counter/counter.gno @@ -0,0 +1,14 @@ +package counter + +import "strconv" + +var counter int + +func Increment() int { + counter++ + return counter +} + +func Render(_ string) string { + return strconv.Itoa(counter) +} diff --git a/portal-loop/extracted/r/demo/counter/counter_test.gno b/portal-loop/extracted/r/demo/counter/counter_test.gno new file mode 100644 index 00000000..352889f7 --- /dev/null +++ b/portal-loop/extracted/r/demo/counter/counter_test.gno @@ -0,0 +1,22 @@ +package counter + +import "testing" + +func TestIncrement(t *testing.T) { + counter = 0 + val := Increment() + if val != 1 { + t.Fatalf("result from Increment(): %d != 1", val) + } + if counter != val { + t.Fatalf("counter (%d) != val (%d)", counter, val) + } +} + +func TestRender(t *testing.T) { + counter = 1337 + res := Render("") + if res != "1337" { + t.Fatalf("render result %q != %q", res, "1337") + } +} diff --git a/portal-loop/extracted/r/demo/counter/pkg_metadata.json b/portal-loop/extracted/r/demo/counter/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/r/demo/counter/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/r/demo/deep/very/deep/pkg_metadata.json b/portal-loop/extracted/r/demo/deep/very/deep/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/r/demo/deep/very/deep/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/r/demo/deep/very/deep/render.gno b/portal-loop/extracted/r/demo/deep/very/deep/render.gno new file mode 100644 index 00000000..4d04747a --- /dev/null +++ b/portal-loop/extracted/r/demo/deep/very/deep/render.gno @@ -0,0 +1,9 @@ +package deep + +func Render(path string) string { + if path == "" { + return "it works!" + } else { + return "hi " + path + } +} diff --git a/portal-loop/extracted/r/demo/disperse/disperse.gno b/portal-loop/extracted/r/demo/disperse/disperse.gno new file mode 100644 index 00000000..0dc833dd --- /dev/null +++ b/portal-loop/extracted/r/demo/disperse/disperse.gno @@ -0,0 +1,99 @@ +package disperse + +import ( + "std" + + tokens "gno.land/r/demo/grc20factory" +) + +// Get address of Disperse realm +var realmAddr = std.CurrentRealm().Addr() + +// DisperseUgnot parses receivers and amounts and sends out ugnot +// The function will send out the coins to the addresses and return the leftover coins to the caller +// if there are any to return +func DisperseUgnot(addresses []std.Address, coins std.Coins) { + coinSent := std.GetOrigSend() + caller := std.PrevRealm().Addr() + banker := std.GetBanker(std.BankerTypeOrigSend) + + if len(addresses) != len(coins) { + panic(ErrNumAddrValMismatch) + } + + for _, coin := range coins { + if coin.Amount <= 0 { + panic(ErrNegativeCoinAmount) + } + + if banker.GetCoins(realmAddr).AmountOf(coin.Denom) < coin.Amount { + panic(ErrMismatchBetweenSentAndParams) + } + } + + // Send coins + for i, _ := range addresses { + banker.SendCoins(realmAddr, addresses[i], std.NewCoins(coins[i])) + } + + // Return possible leftover coins + for _, coin := range coinSent { + leftoverAmt := banker.GetCoins(realmAddr).AmountOf(coin.Denom) + if leftoverAmt > 0 { + send := std.Coins{std.NewCoin(coin.Denom, leftoverAmt)} + banker.SendCoins(realmAddr, caller, send) + } + } +} + +// DisperseGRC20 disperses tokens to multiple addresses +// Note that it is necessary to approve the realm to spend the tokens before calling this function +// see the corresponding filetests for examples +func DisperseGRC20(addresses []std.Address, amounts []uint64, symbols []string) { + caller := std.PrevRealm().Addr() + + if (len(addresses) != len(amounts)) || (len(amounts) != len(symbols)) { + panic(ErrArgLenAndSentLenMismatch) + } + + for i := 0; i < len(addresses); i++ { + tokens.TransferFrom(symbols[i], caller, addresses[i], amounts[i]) + } +} + +// DisperseGRC20String receives a string of addresses and a string of tokens +// and parses them to be used in DisperseGRC20 +func DisperseGRC20String(addresses string, tokens string) { + parsedAddresses, err := parseAddresses(addresses) + if err != nil { + panic(err) + } + + parsedAmounts, parsedSymbols, err := parseTokens(tokens) + if err != nil { + panic(err) + } + + DisperseGRC20(parsedAddresses, parsedAmounts, parsedSymbols) +} + +// DisperseUgnotString receives a string of addresses and a string of amounts +// and parses them to be used in DisperseUgnot +func DisperseUgnotString(addresses string, amounts string) { + parsedAddresses, err := parseAddresses(addresses) + if err != nil { + panic(err) + } + + parsedAmounts, err := parseAmounts(amounts) + if err != nil { + panic(err) + } + + coins := make(std.Coins, len(parsedAmounts)) + for i, amount := range parsedAmounts { + coins[i] = std.NewCoin("ugnot", amount) + } + + DisperseUgnot(parsedAddresses, coins) +} diff --git a/portal-loop/extracted/r/demo/disperse/doc.gno b/portal-loop/extracted/r/demo/disperse/doc.gno new file mode 100644 index 00000000..100aa92c --- /dev/null +++ b/portal-loop/extracted/r/demo/disperse/doc.gno @@ -0,0 +1,19 @@ +// Package disperse provides methods to disperse coins or GRC20 tokens among multiple addresses. +// +// The disperse package is an implementation of an existing service that allows users to send coins or GRC20 tokens to multiple addresses +// on the Ethereum blockchain. +// +// Usage: +// To use disperse, you can either use `DisperseUgnot` to send coins or `DisperseGRC20` to send GRC20 tokens to multiple addresses. +// +// Example: +// Dispersing 200 coins to two addresses: +// - DisperseUgnotString("g1dmt3sa5ucvecxuhf3j6ne5r0e3z4x7h6c03xc0,g1akeqsvhucjt8gf5yupyzjxsjd29wv8fayng37c", "150,50") +// Dispersing 200 worth of a GRC20 token "TEST" to two addresses: +// - DisperseGRC20String("g1dmt3sa5ucvecxuhf3j6ne5r0e3z4x7h6c03xc0,g1akeqsvhucjt8gf5yupyzjxsjd29wv8fayng37c", "150TEST,50TEST") +// +// Reference: +// - [the original dispere app](https://disperse.app/) +// - [the original disperse app on etherscan](https://etherscan.io/address/0xd152f549545093347a162dce210e7293f1452150#code) +// - [the gno disperse web app](https://gno-disperse.netlify.app/) +package disperse // import "gno.land/r/demo/disperse" diff --git a/portal-loop/extracted/r/demo/disperse/errors.gno b/portal-loop/extracted/r/demo/disperse/errors.gno new file mode 100644 index 00000000..c054e658 --- /dev/null +++ b/portal-loop/extracted/r/demo/disperse/errors.gno @@ -0,0 +1,12 @@ +package disperse + +import "errors" + +var ( + ErrNotEnoughCoin = errors.New("disperse: not enough coin sent in") + ErrNumAddrValMismatch = errors.New("disperse: number of addresses and values to send doesn't match") + ErrInvalidAddress = errors.New("disperse: invalid address") + ErrNegativeCoinAmount = errors.New("disperse: coin amount cannot be negative") + ErrMismatchBetweenSentAndParams = errors.New("disperse: mismatch between coins sent and params called") + ErrArgLenAndSentLenMismatch = errors.New("disperse: mismatch between coins sent and args called") +) diff --git a/portal-loop/extracted/r/demo/disperse/pkg_metadata.json b/portal-loop/extracted/r/demo/disperse/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/r/demo/disperse/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/r/demo/disperse/util.gno b/portal-loop/extracted/r/demo/disperse/util.gno new file mode 100644 index 00000000..71015225 --- /dev/null +++ b/portal-loop/extracted/r/demo/disperse/util.gno @@ -0,0 +1,67 @@ +package disperse + +import ( + "std" + "strconv" + "strings" + "unicode" +) + +func parseAddresses(addresses string) ([]std.Address, error) { + var ret []std.Address + + for _, str := range strings.Split(addresses, ",") { + addr := std.Address(str) + if !addr.IsValid() { + return nil, ErrInvalidAddress + } + + ret = append(ret, addr) + } + + return ret, nil +} + +func splitString(input string) (string, string) { + var pos int + for i, char := range input { + if !unicode.IsDigit(char) { + pos = i + break + } + } + return input[:pos], input[pos:] +} + +func parseTokens(tokens string) ([]uint64, []string, error) { + var amounts []uint64 + var symbols []string + + for _, token := range strings.Split(tokens, ",") { + amountStr, symbol := splitString(token) + amount, _ := strconv.Atoi(amountStr) + if amount < 0 { + return nil, nil, ErrNegativeCoinAmount + } + + amounts = append(amounts, uint64(amount)) + symbols = append(symbols, symbol) + } + + return amounts, symbols, nil +} + +func parseAmounts(amounts string) ([]int64, error) { + var ret []int64 + + for _, amt := range strings.Split(amounts, ",") { + amount, _ := strconv.Atoi(amt) + if amount < 0 { + return nil, ErrNegativeCoinAmount + } + + ret = append(ret, int64(amount)) + } + + return ret, nil +} diff --git a/portal-loop/extracted/r/demo/disperse/z_0_filetest.gno b/portal-loop/extracted/r/demo/disperse/z_0_filetest.gno new file mode 100644 index 00000000..62a34cfd --- /dev/null +++ b/portal-loop/extracted/r/demo/disperse/z_0_filetest.gno @@ -0,0 +1,32 @@ +// SEND: 200ugnot + +package main + +import ( + "std" + + "gno.land/r/demo/disperse" +) + +func main() { + disperseAddr := std.DerivePkgAddr("gno.land/r/demo/disperse") + mainaddr := std.DerivePkgAddr("main") + + std.TestSetOrigPkgAddr(disperseAddr) + std.TestSetOrigCaller(mainaddr) + + banker := std.GetBanker(std.BankerTypeRealmSend) + + mainbal := banker.GetCoins(mainaddr) + println("main before:", mainbal) + + banker.SendCoins(mainaddr, disperseAddr, std.Coins{{"ugnot", 200}}) + disperse.DisperseUgnotString("g1dmt3sa5ucvecxuhf3j6ne5r0e3z4x7h6c03xc0,g1akeqsvhucjt8gf5yupyzjxsjd29wv8fayng37c", "150,50") + + mainbal = banker.GetCoins(mainaddr) + println("main after:", mainbal) +} + +// Output: +// main before: 200000200ugnot +// main after: 200000000ugnot diff --git a/portal-loop/extracted/r/demo/disperse/z_1_filetest.gno b/portal-loop/extracted/r/demo/disperse/z_1_filetest.gno new file mode 100644 index 00000000..1e042d32 --- /dev/null +++ b/portal-loop/extracted/r/demo/disperse/z_1_filetest.gno @@ -0,0 +1,32 @@ +// SEND: 300ugnot + +package main + +import ( + "std" + + "gno.land/r/demo/disperse" +) + +func main() { + disperseAddr := std.DerivePkgAddr("gno.land/r/demo/disperse") + mainaddr := std.DerivePkgAddr("main") + + std.TestSetOrigPkgAddr(disperseAddr) + std.TestSetOrigCaller(mainaddr) + + banker := std.GetBanker(std.BankerTypeRealmSend) + + mainbal := banker.GetCoins(mainaddr) + println("main before:", mainbal) + + banker.SendCoins(mainaddr, disperseAddr, std.Coins{{"ugnot", 300}}) + disperse.DisperseUgnotString("g1dmt3sa5ucvecxuhf3j6ne5r0e3z4x7h6c03xc0,g1akeqsvhucjt8gf5yupyzjxsjd29wv8fayng37c", "150,50") + + mainbal = banker.GetCoins(mainaddr) + println("main after:", mainbal) +} + +// Output: +// main before: 200000300ugnot +// main after: 200000100ugnot diff --git a/portal-loop/extracted/r/demo/disperse/z_2_filetest.gno b/portal-loop/extracted/r/demo/disperse/z_2_filetest.gno new file mode 100644 index 00000000..163bb2fc --- /dev/null +++ b/portal-loop/extracted/r/demo/disperse/z_2_filetest.gno @@ -0,0 +1,25 @@ +// SEND: 300ugnot + +package main + +import ( + "std" + + "gno.land/r/demo/disperse" +) + +func main() { + disperseAddr := std.DerivePkgAddr("gno.land/r/demo/disperse") + mainaddr := std.DerivePkgAddr("main") + + std.TestSetOrigPkgAddr(disperseAddr) + std.TestSetOrigCaller(mainaddr) + + banker := std.GetBanker(std.BankerTypeRealmSend) + + banker.SendCoins(mainaddr, disperseAddr, std.Coins{{"ugnot", 100}}) + disperse.DisperseUgnotString("g1dmt3sa5ucvecxuhf3j6ne5r0e3z4x7h6c03xc0,g1akeqsvhucjt8gf5yupyzjxsjd29wv8fayng37c", "150,50") +} + +// Error: +// disperse: mismatch between coins sent and params called diff --git a/portal-loop/extracted/r/demo/disperse/z_3_filetest.gno b/portal-loop/extracted/r/demo/disperse/z_3_filetest.gno new file mode 100644 index 00000000..eabed52f --- /dev/null +++ b/portal-loop/extracted/r/demo/disperse/z_3_filetest.gno @@ -0,0 +1,45 @@ +// SEND: 300ugnot + +package main + +import ( + "std" + + "gno.land/r/demo/disperse" + tokens "gno.land/r/demo/grc20factory" +) + +func main() { + disperseAddr := std.DerivePkgAddr("gno.land/r/demo/disperse") + mainaddr := std.DerivePkgAddr("main") + beneficiary1 := std.Address("g1dmt3sa5ucvecxuhf3j6ne5r0e3z4x7h6c03xc0") + beneficiary2 := std.Address("g1akeqsvhucjt8gf5yupyzjxsjd29wv8fayng37c") + + std.TestSetOrigPkgAddr(disperseAddr) + std.TestSetOrigCaller(mainaddr) + + banker := std.GetBanker(std.BankerTypeRealmSend) + + tokens.New("test", "TEST", 4, 0, 0) + tokens.Mint("TEST", mainaddr, 200) + + mainbal := tokens.BalanceOf("TEST", mainaddr) + println("main before:", mainbal) + + tokens.Approve("TEST", disperseAddr, 200) + + disperse.DisperseGRC20String("g1dmt3sa5ucvecxuhf3j6ne5r0e3z4x7h6c03xc0,g1akeqsvhucjt8gf5yupyzjxsjd29wv8fayng37c", "150TEST,50TEST") + + mainbal = tokens.BalanceOf("TEST", mainaddr) + println("main after:", mainbal) + ben1bal := tokens.BalanceOf("TEST", beneficiary1) + println("beneficiary1:", ben1bal) + ben2bal := tokens.BalanceOf("TEST", beneficiary2) + println("beneficiary2:", ben2bal) +} + +// Output: +// main before: 200 +// main after: 0 +// beneficiary1: 150 +// beneficiary2: 50 diff --git a/portal-loop/extracted/r/demo/disperse/z_4_filetest.gno b/portal-loop/extracted/r/demo/disperse/z_4_filetest.gno new file mode 100644 index 00000000..ebf4bed4 --- /dev/null +++ b/portal-loop/extracted/r/demo/disperse/z_4_filetest.gno @@ -0,0 +1,48 @@ +// SEND: 300ugnot + +package main + +import ( + "std" + + "gno.land/r/demo/disperse" + tokens "gno.land/r/demo/grc20factory" +) + +func main() { + disperseAddr := std.DerivePkgAddr("gno.land/r/demo/disperse") + mainaddr := std.DerivePkgAddr("main") + beneficiary1 := std.Address("g1dmt3sa5ucvecxuhf3j6ne5r0e3z4x7h6c03xc0") + beneficiary2 := std.Address("g1akeqsvhucjt8gf5yupyzjxsjd29wv8fayng37c") + + std.TestSetOrigPkgAddr(disperseAddr) + std.TestSetOrigCaller(mainaddr) + + banker := std.GetBanker(std.BankerTypeRealmSend) + + tokens.New("test1", "TEST1", 4, 0, 0) + tokens.Mint("TEST1", mainaddr, 200) + tokens.New("test2", "TEST2", 4, 0, 0) + tokens.Mint("TEST2", mainaddr, 200) + + mainbal := tokens.BalanceOf("TEST1", mainaddr) + tokens.BalanceOf("TEST2", mainaddr) + println("main before:", mainbal) + + tokens.Approve("TEST1", disperseAddr, 200) + tokens.Approve("TEST2", disperseAddr, 200) + + disperse.DisperseGRC20String("g1dmt3sa5ucvecxuhf3j6ne5r0e3z4x7h6c03xc0,g1akeqsvhucjt8gf5yupyzjxsjd29wv8fayng37c", "200TEST1,200TEST2") + + mainbal = tokens.BalanceOf("TEST1", mainaddr) + tokens.BalanceOf("TEST2", mainaddr) + println("main after:", mainbal) + ben1bal := tokens.BalanceOf("TEST1", beneficiary1) + tokens.BalanceOf("TEST2", beneficiary1) + println("beneficiary1:", ben1bal) + ben2bal := tokens.BalanceOf("TEST1", beneficiary2) + tokens.BalanceOf("TEST2", beneficiary2) + println("beneficiary2:", ben2bal) +} + +// Output: +// main before: 400 +// main after: 0 +// beneficiary1: 200 +// beneficiary2: 200 diff --git a/portal-loop/extracted/r/demo/echo/echo.gno b/portal-loop/extracted/r/demo/echo/echo.gno new file mode 100644 index 00000000..d9933ab2 --- /dev/null +++ b/portal-loop/extracted/r/demo/echo/echo.gno @@ -0,0 +1,13 @@ +package echo + +/* + * This realm echoes the `path` argument it received. + * Can be used by developers as a simple endpoint to test + * forbidden characters, for pentesting or simply to + * test it works. + * + * See also r/demo/print (to print various thing like user address) + */ +func Render(path string) string { + return path +} diff --git a/portal-loop/extracted/r/demo/echo/echo_test.gno b/portal-loop/extracted/r/demo/echo/echo_test.gno new file mode 100644 index 00000000..92f4868e --- /dev/null +++ b/portal-loop/extracted/r/demo/echo/echo_test.gno @@ -0,0 +1,12 @@ +package echo + +import ( + "testing" + + "gno.land/p/demo/urequire" +) + +func Test(t *testing.T) { + urequire.Equal(t, "aa", Render("aa")) + urequire.Equal(t, "", Render("")) +} diff --git a/portal-loop/extracted/r/demo/echo/pkg_metadata.json b/portal-loop/extracted/r/demo/echo/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/r/demo/echo/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/r/demo/echo1/echo.gno b/portal-loop/extracted/r/demo/echo1/echo.gno new file mode 100644 index 00000000..d9933ab2 --- /dev/null +++ b/portal-loop/extracted/r/demo/echo1/echo.gno @@ -0,0 +1,13 @@ +package echo + +/* + * This realm echoes the `path` argument it received. + * Can be used by developers as a simple endpoint to test + * forbidden characters, for pentesting or simply to + * test it works. + * + * See also r/demo/print (to print various thing like user address) + */ +func Render(path string) string { + return path +} diff --git a/portal-loop/extracted/r/demo/echo1/echo_test.gno b/portal-loop/extracted/r/demo/echo1/echo_test.gno new file mode 100644 index 00000000..8e5be070 --- /dev/null +++ b/portal-loop/extracted/r/demo/echo1/echo_test.gno @@ -0,0 +1,12 @@ +package echo + +import "testing" + +func Test(t *testing.T) { + if Render("aa") != "aa" { + t.Fail() + } + if Render("") != "" { + t.Fail() + } +} diff --git a/portal-loop/extracted/r/demo/echo1/gno.mod b/portal-loop/extracted/r/demo/echo1/gno.mod new file mode 100644 index 00000000..f07d7894 --- /dev/null +++ b/portal-loop/extracted/r/demo/echo1/gno.mod @@ -0,0 +1 @@ +module gno.land/r/demo/echo diff --git a/portal-loop/extracted/r/demo/echo1/pkg_metadata.json b/portal-loop/extracted/r/demo/echo1/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/r/demo/echo1/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/r/demo/event/event.gno b/portal-loop/extracted/r/demo/event/event.gno new file mode 100644 index 00000000..9e5de540 --- /dev/null +++ b/portal-loop/extracted/r/demo/event/event.gno @@ -0,0 +1,9 @@ +package event + +import ( + "std" +) + +func Emit(value string) { + std.Emit("TAG", "key", value) +} diff --git a/portal-loop/extracted/r/demo/event/pkg_metadata.json b/portal-loop/extracted/r/demo/event/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/r/demo/event/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/r/demo/event_emitter/package.gno b/portal-loop/extracted/r/demo/event_emitter/package.gno new file mode 100644 index 00000000..f168dd46 --- /dev/null +++ b/portal-loop/extracted/r/demo/event_emitter/package.gno @@ -0,0 +1,21 @@ +package event_emitter + +import "std" + +func Event01(key, value string) string { + std.Emit("Event01", key, value) + + return "Event01-" + key + "-" + "value" +} + +func Event02(key, value string) string { + std.Emit("Event02", key, value) + + return "Event02-" + key + "-" + "value" +} + +func Event03(key, value string) string { + std.Emit("Event03", key, value) + + return "Event03-" + key + "-" + "value" +} diff --git a/portal-loop/extracted/r/demo/event_emitter/pkg_metadata.json b/portal-loop/extracted/r/demo/event_emitter/pkg_metadata.json new file mode 100644 index 00000000..9f6c0a85 --- /dev/null +++ b/portal-loop/extracted/r/demo/event_emitter/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/demo/event_emitter:0/package.gno b/portal-loop/extracted/r/demo/event_emitter:0/package.gno new file mode 100644 index 00000000..f168dd46 --- /dev/null +++ b/portal-loop/extracted/r/demo/event_emitter:0/package.gno @@ -0,0 +1,21 @@ +package event_emitter + +import "std" + +func Event01(key, value string) string { + std.Emit("Event01", key, value) + + return "Event01-" + key + "-" + "value" +} + +func Event02(key, value string) string { + std.Emit("Event02", key, value) + + return "Event02-" + key + "-" + "value" +} + +func Event03(key, value string) string { + std.Emit("Event03", key, value) + + return "Event03-" + key + "-" + "value" +} diff --git a/portal-loop/extracted/r/demo/event_emitter:0/pkg_metadata.json b/portal-loop/extracted/r/demo/event_emitter:0/pkg_metadata.json new file mode 100644 index 00000000..9f6c0a85 --- /dev/null +++ b/portal-loop/extracted/r/demo/event_emitter:0/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":"1ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/demo/foo1155/foo1155.gno b/portal-loop/extracted/r/demo/foo1155/foo1155.gno new file mode 100644 index 00000000..2bd3b7a8 --- /dev/null +++ b/portal-loop/extracted/r/demo/foo1155/foo1155.gno @@ -0,0 +1,137 @@ +package foo1155 + +import ( + "std" + + "gno.land/p/demo/grc/grc1155" + "gno.land/p/demo/ufmt" + "gno.land/r/demo/users" + + pusers "gno.land/p/demo/users" +) + +var ( + dummyURI = "ipfs://xyz" + admin std.Address = "g10x5phu0k6p64cwrhfpsc8tk43st9kug6wft530" + foo = grc1155.NewBasicGRC1155Token(dummyURI) +) + +func init() { + mintGRC1155Token(admin) // @administrator (10) +} + +func mintGRC1155Token(owner std.Address) { + for i := 1; i <= 10; i++ { + tid := grc1155.TokenID(ufmt.Sprintf("%d", i)) + foo.SafeMint(owner, tid, 100) + } +} + +// Getters + +func BalanceOf(user pusers.AddressOrName, tid grc1155.TokenID) uint64 { + balance, err := foo.BalanceOf(users.Resolve(user), tid) + if err != nil { + panic(err) + } + + return balance +} + +func BalanceOfBatch(ul []pusers.AddressOrName, batch []grc1155.TokenID) []uint64 { + var usersResolved []std.Address + + for i := 0; i < len(ul); i++ { + usersResolved[i] = users.Resolve(ul[i]) + } + balanceBatch, err := foo.BalanceOfBatch(usersResolved, batch) + if err != nil { + panic(err) + } + + return balanceBatch +} + +func IsApprovedForAll(owner, user pusers.AddressOrName) bool { + return foo.IsApprovedForAll(users.Resolve(owner), users.Resolve(user)) +} + +// Setters + +func SetApprovalForAll(user pusers.AddressOrName, approved bool) { + err := foo.SetApprovalForAll(users.Resolve(user), approved) + if err != nil { + panic(err) + } +} + +func TransferFrom(from, to pusers.AddressOrName, tid grc1155.TokenID, amount uint64) { + err := foo.SafeTransferFrom(users.Resolve(from), users.Resolve(to), tid, amount) + if err != nil { + panic(err) + } +} + +func BatchTransferFrom(from, to pusers.AddressOrName, batch []grc1155.TokenID, amounts []uint64) { + err := foo.SafeBatchTransferFrom(users.Resolve(from), users.Resolve(to), batch, amounts) + if err != nil { + panic(err) + } +} + +// Admin + +func Mint(to pusers.AddressOrName, tid grc1155.TokenID, amount uint64) { + caller := std.GetOrigCaller() + assertIsAdmin(caller) + err := foo.SafeMint(users.Resolve(to), tid, amount) + if err != nil { + panic(err) + } +} + +func MintBatch(to pusers.AddressOrName, batch []grc1155.TokenID, amounts []uint64) { + caller := std.GetOrigCaller() + assertIsAdmin(caller) + err := foo.SafeBatchMint(users.Resolve(to), batch, amounts) + if err != nil { + panic(err) + } +} + +func Burn(from pusers.AddressOrName, tid grc1155.TokenID, amount uint64) { + caller := std.GetOrigCaller() + assertIsAdmin(caller) + err := foo.Burn(users.Resolve(from), tid, amount) + if err != nil { + panic(err) + } +} + +func BurnBatch(from pusers.AddressOrName, batch []grc1155.TokenID, amounts []uint64) { + caller := std.GetOrigCaller() + assertIsAdmin(caller) + err := foo.BatchBurn(users.Resolve(from), batch, amounts) + if err != nil { + panic(err) + } +} + +// Render + +func Render(path string) string { + switch { + case path == "": + return foo.RenderHome() + default: + return "404\n" + } +} + +// Util + +func assertIsAdmin(address std.Address) { + if address != admin { + panic("restricted access") + } +} diff --git a/portal-loop/extracted/r/demo/foo1155/foo1155_test.gno b/portal-loop/extracted/r/demo/foo1155/foo1155_test.gno new file mode 100644 index 00000000..64d4bc12 --- /dev/null +++ b/portal-loop/extracted/r/demo/foo1155/foo1155_test.gno @@ -0,0 +1,32 @@ +package foo1155 + +import ( + "testing" + + "gno.land/p/demo/grc/grc1155" + "gno.land/p/demo/users" +) + +func TestFoo721(t *testing.T) { + admin := users.AddressOrName("g10x5phu0k6p64cwrhfpsc8tk43st9kug6wft530") + bob := users.AddressOrName("g1ze6et22ces5atv79y4xh38s4kuraey4y2fr6tw") + tid1 := grc1155.TokenID("1") + tid2 := grc1155.TokenID("2") + + for i, tc := range []struct { + name string + expected interface{} + fn func() interface{} + }{ + {"BalanceOf(admin, tid1)", uint64(100), func() interface{} { return BalanceOf(admin, tid1) }}, + {"BalanceOf(bob, tid1)", uint64(0), func() interface{} { return BalanceOf(bob, tid1) }}, + {"IsApprovedForAll(admin, bob)", false, func() interface{} { return IsApprovedForAll(admin, bob) }}, + } { + t.Run(tc.name, func(t *testing.T) { + got := tc.fn() + if tc.expected != got { + t.Errorf("expected: %v got: %v", tc.expected, got) + } + }) + } +} diff --git a/portal-loop/extracted/r/demo/foo1155/pkg_metadata.json b/portal-loop/extracted/r/demo/foo1155/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/r/demo/foo1155/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/r/demo/foo20/foo20.gno b/portal-loop/extracted/r/demo/foo20/foo20.gno new file mode 100644 index 00000000..9d4e5d40 --- /dev/null +++ b/portal-loop/extracted/r/demo/foo20/foo20.gno @@ -0,0 +1,99 @@ +// foo20 is a GRC20 token contract where all the GRC20 methods are proxified +// with top-level functions. see also gno.land/r/demo/bar20. +package foo20 + +import ( + "std" + "strings" + + "gno.land/p/demo/grc/grc20" + "gno.land/p/demo/ownable" + "gno.land/p/demo/ufmt" + pusers "gno.land/p/demo/users" + "gno.land/r/demo/users" +) + +var ( + banker *grc20.Banker + admin *ownable.Ownable + token grc20.Token +) + +func init() { + admin = ownable.NewWithAddress("g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq") // @manfred + banker = grc20.NewBanker("Foo", "FOO", 4) + banker.Mint(admin.Owner(), 1000000*10000) // @administrator (1M) + token = banker.Token() +} + +func TotalSupply() uint64 { return token.TotalSupply() } + +func BalanceOf(owner pusers.AddressOrName) uint64 { + ownerAddr := users.Resolve(owner) + return token.BalanceOf(ownerAddr) +} + +func Allowance(owner, spender pusers.AddressOrName) uint64 { + ownerAddr := users.Resolve(owner) + spenderAddr := users.Resolve(spender) + return token.Allowance(ownerAddr, spenderAddr) +} + +func Transfer(to pusers.AddressOrName, amount uint64) { + toAddr := users.Resolve(to) + checkErr(token.Transfer(toAddr, amount)) +} + +func Approve(spender pusers.AddressOrName, amount uint64) { + spenderAddr := users.Resolve(spender) + checkErr(token.Approve(spenderAddr, amount)) +} + +func TransferFrom(from, to pusers.AddressOrName, amount uint64) { + fromAddr := users.Resolve(from) + toAddr := users.Resolve(to) + checkErr(token.TransferFrom(fromAddr, toAddr, amount)) +} + +// Faucet is distributing foo20 tokens without restriction (unsafe). +// For a real token faucet, you should take care of setting limits are asking payment. +func Faucet() { + caller := std.PrevRealm().Addr() + amount := uint64(1_000 * 10_000) // 1k + checkErr(banker.Mint(caller, amount)) +} + +func Mint(to pusers.AddressOrName, amount uint64) { + admin.AssertCallerIsOwner() + toAddr := users.Resolve(to) + checkErr(banker.Mint(toAddr, amount)) +} + +func Burn(from pusers.AddressOrName, amount uint64) { + admin.AssertCallerIsOwner() + fromAddr := users.Resolve(from) + checkErr(banker.Burn(fromAddr, amount)) +} + +func Render(path string) string { + parts := strings.Split(path, "/") + c := len(parts) + + switch { + case path == "": + return banker.RenderHome() + case c == 2 && parts[0] == "balance": + owner := pusers.AddressOrName(parts[1]) + ownerAddr := users.Resolve(owner) + balance := banker.BalanceOf(ownerAddr) + return ufmt.Sprintf("%d\n", balance) + default: + return "404\n" + } +} + +func checkErr(err error) { + if err != nil { + panic(err) + } +} diff --git a/portal-loop/extracted/r/demo/foo20/foo20_test.gno b/portal-loop/extracted/r/demo/foo20/foo20_test.gno new file mode 100644 index 00000000..77c99d05 --- /dev/null +++ b/portal-loop/extracted/r/demo/foo20/foo20_test.gno @@ -0,0 +1,86 @@ +package foo20 + +import ( + "std" + "testing" + + "gno.land/p/demo/testutils" + "gno.land/p/demo/uassert" + pusers "gno.land/p/demo/users" + "gno.land/r/demo/users" +) + +func TestReadOnlyPublicMethods(t *testing.T) { + var ( + admin = pusers.AddressOrName("g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq") + alice = pusers.AddressOrName(testutils.TestAddress("alice")) + bob = pusers.AddressOrName(testutils.TestAddress("bob")) + ) + + type test struct { + name string + balance uint64 + fn func() uint64 + } + + // check balances #1. + { + tests := []test{ + {"TotalSupply", 10_000_000_000, func() uint64 { return TotalSupply() }}, + {"BalanceOf(admin)", 10_000_000_000, func() uint64 { return BalanceOf(admin) }}, + {"BalanceOf(alice)", 0, func() uint64 { return BalanceOf(alice) }}, + {"Allowance(admin, alice)", 0, func() uint64 { return Allowance(admin, alice) }}, + {"BalanceOf(bob)", 0, func() uint64 { return BalanceOf(bob) }}, + } + for _, tc := range tests { + got := tc.fn() + uassert.Equal(t, got, tc.balance) + } + } + + // bob uses the faucet. + std.TestSetOrigCaller(users.Resolve(bob)) + Faucet() + + // check balances #2. + { + tests := []test{ + {"TotalSupply", 10_010_000_000, func() uint64 { return TotalSupply() }}, + {"BalanceOf(admin)", 10_000_000_000, func() uint64 { return BalanceOf(admin) }}, + {"BalanceOf(alice)", 0, func() uint64 { return BalanceOf(alice) }}, + {"Allowance(admin, alice)", 0, func() uint64 { return Allowance(admin, alice) }}, + {"BalanceOf(bob)", 10_000_000, func() uint64 { return BalanceOf(bob) }}, + } + for _, tc := range tests { + got := tc.fn() + uassert.Equal(t, got, tc.balance) + } + } +} + +func TestErrConditions(t *testing.T) { + var ( + admin = pusers.AddressOrName("g1u7y667z64x2h7vc6fmpcprgey4ck233jaww9zq") + alice = pusers.AddressOrName(testutils.TestAddress("alice")) + empty = pusers.AddressOrName("") + ) + + type test struct { + name string + msg string + fn func() + } + + std.TestSetOrigCaller(users.Resolve(admin)) + { + tests := []test{ + {"Transfer(admin, 1)", "cannot send transfer to self", func() { Transfer(admin, 1) }}, + {"Approve(empty, 1))", "invalid address", func() { Approve(empty, 1) }}, + } + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + uassert.PanicsWithMessage(t, tc.msg, tc.fn) + }) + } + } +} diff --git a/portal-loop/extracted/r/demo/foo20/pkg_metadata.json b/portal-loop/extracted/r/demo/foo20/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/r/demo/foo20/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/r/demo/foo721/foo721.gno b/portal-loop/extracted/r/demo/foo721/foo721.gno new file mode 100644 index 00000000..f7364d41 --- /dev/null +++ b/portal-loop/extracted/r/demo/foo721/foo721.gno @@ -0,0 +1,124 @@ +package foo721 + +import ( + "std" + + "gno.land/p/demo/grc/grc721" + "gno.land/p/demo/ufmt" + "gno.land/r/demo/users" + + pusers "gno.land/p/demo/users" +) + +var ( + admin std.Address = "g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj" + foo = grc721.NewBasicNFT("FooNFT", "FNFT") +) + +func init() { + mintNNFT(admin, 10) // @administrator (10) + mintNNFT("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm", 5) // @hariom (5) +} + +func mintNNFT(owner std.Address, n uint64) { + count := foo.TokenCount() + for i := count; i < count+n; i++ { + tid := grc721.TokenID(ufmt.Sprintf("%d", i)) + foo.Mint(owner, tid) + } +} + +// Getters + +func BalanceOf(user pusers.AddressOrName) uint64 { + balance, err := foo.BalanceOf(users.Resolve(user)) + if err != nil { + panic(err) + } + + return balance +} + +func OwnerOf(tid grc721.TokenID) std.Address { + owner, err := foo.OwnerOf(tid) + if err != nil { + panic(err) + } + + return owner +} + +func IsApprovedForAll(owner, user pusers.AddressOrName) bool { + return foo.IsApprovedForAll(users.Resolve(owner), users.Resolve(user)) +} + +func GetApproved(tid grc721.TokenID) std.Address { + addr, err := foo.GetApproved(tid) + if err != nil { + panic(err) + } + + return addr +} + +// Setters + +func Approve(user pusers.AddressOrName, tid grc721.TokenID) { + err := foo.Approve(users.Resolve(user), tid) + if err != nil { + panic(err) + } +} + +func SetApprovalForAll(user pusers.AddressOrName, approved bool) { + err := foo.SetApprovalForAll(users.Resolve(user), approved) + if err != nil { + panic(err) + } +} + +func TransferFrom(from, to pusers.AddressOrName, tid grc721.TokenID) { + err := foo.TransferFrom(users.Resolve(from), users.Resolve(to), tid) + if err != nil { + panic(err) + } +} + +// Admin + +func Mint(to pusers.AddressOrName, tid grc721.TokenID) { + caller := std.PrevRealm().Addr() + assertIsAdmin(caller) + err := foo.Mint(users.Resolve(to), tid) + if err != nil { + panic(err) + } +} + +func Burn(tid grc721.TokenID) { + caller := std.PrevRealm().Addr() + assertIsAdmin(caller) + err := foo.Burn(tid) + if err != nil { + panic(err) + } +} + +// Render + +func Render(path string) string { + switch { + case path == "": + return foo.RenderHome() + default: + return "404\n" + } +} + +// Util + +func assertIsAdmin(address std.Address) { + if address != admin { + panic("restricted access") + } +} diff --git a/portal-loop/extracted/r/demo/foo721/foo721_test.gno b/portal-loop/extracted/r/demo/foo721/foo721_test.gno new file mode 100644 index 00000000..2477ca34 --- /dev/null +++ b/portal-loop/extracted/r/demo/foo721/foo721_test.gno @@ -0,0 +1,33 @@ +package foo721 + +import ( + "testing" + + "gno.land/p/demo/grc/grc721" + "gno.land/r/demo/users" + + pusers "gno.land/p/demo/users" +) + +func TestFoo721(t *testing.T) { + admin := pusers.AddressOrName("g1us8428u2a5satrlxzagqqa5m6vmuze025anjlj") + hariom := pusers.AddressOrName("g1var589z07ppjsjd24ukm4uguzwdt0tw7g47cgm") + + for i, tc := range []struct { + name string + expected interface{} + fn func() interface{} + }{ + {"BalanceOf(admin)", uint64(10), func() interface{} { return BalanceOf(admin) }}, + {"BalanceOf(hariom)", uint64(5), func() interface{} { return BalanceOf(hariom) }}, + {"OwnerOf(0)", users.Resolve(admin), func() interface{} { return OwnerOf(grc721.TokenID("0")) }}, + {"IsApprovedForAll(admin, hariom)", false, func() interface{} { return IsApprovedForAll(admin, hariom) }}, + } { + t.Run(tc.name, func(t *testing.T) { + got := tc.fn() + if tc.expected != got { + t.Errorf("expected: %v got: %v", tc.expected, got) + } + }) + } +} diff --git a/portal-loop/extracted/r/demo/foo721/pkg_metadata.json b/portal-loop/extracted/r/demo/foo721/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/r/demo/foo721/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/r/demo/games/shifumi/pkg_metadata.json b/portal-loop/extracted/r/demo/games/shifumi/pkg_metadata.json new file mode 100644 index 00000000..92e977de --- /dev/null +++ b/portal-loop/extracted/r/demo/games/shifumi/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1jg8mtutu9khhfwc4nxmuhcpftf0pajdhfvsqf5","deposit":""} \ No newline at end of file diff --git a/portal-loop/extracted/r/demo/games/shifumi/shifumi.gno b/portal-loop/extracted/r/demo/games/shifumi/shifumi.gno new file mode 100644 index 00000000..9094cb8f --- /dev/null +++ b/portal-loop/extracted/r/demo/games/shifumi/shifumi.gno @@ -0,0 +1,120 @@ +package shifumi + +import ( + "errors" + "std" + "strconv" + + "gno.land/p/demo/avl" + "gno.land/p/demo/seqid" + + "gno.land/r/demo/users" +) + +const ( + empty = iota + rock + paper + scissors + last +) + +type game struct { + player1, player2 std.Address // shifumi is a 2 players game + move1, move2 int // can be empty, rock, paper, or scissors +} + +var games avl.Tree +var id seqid.ID + +func (g *game) play(player std.Address, move int) error { + if !(move > empty && move < last) { + return errors.New("invalid move") + } + if player != g.player1 && player != g.player2 { + return errors.New("invalid player") + } + if player == g.player1 && g.move1 == empty { + g.move1 = move + return nil + } + if player == g.player2 && g.move2 == empty { + g.move2 = move + return nil + } + return errors.New("already played") +} + +func (g *game) winner() int { + if g.move1 == empty || g.move2 == empty { + return -1 + } + if g.move1 == g.move2 { + return 0 + } + if g.move1 == rock && g.move2 == scissors || + g.move1 == paper && g.move2 == rock || + g.move1 == scissors && g.move2 == paper { + return 1 + } + return 2 +} + +// NewGame creates a new game where player1 is the caller and player2 the argument. +// A new game index is returned. +func NewGame(player std.Address) int { + games.Set(id.Next().String(), &game{player1: std.PrevRealm().Addr(), player2: player}) + return int(id) +} + +// Play executes a move for the game at index idx, where move can be: +// 1 (rock), 2 (paper), 3 (scissors). +func Play(idx, move int) { + v, ok := games.Get(seqid.ID(idx).String()) + if !ok { + panic("game not found") + } + if err := v.(*game).play(std.PrevRealm().Addr(), move); err != nil { + panic(err) + } +} + +func Render(path string) string { + mov1 := []string{"", " 🤜 ", " 🫱 ", " 👉 "} + mov2 := []string{"", " 🤛 ", " 🫲 ", " 👈 "} + win := []string{"pending", "draw", "player1", "player2"} + + output := `# 👊 ✋ ✌️ Shifumi +Actions: +* [NewGame](shifumi?help&__func=NewGame) opponentAddress +* [Play](shifumi?help&__func=Play) gameIndex move (1=rock, 2=paper, 3=scissors) + + game | player1 | | player2 | | win + --- | --- | --- | --- | --- | --- +` + // Output the 100 most recent games. + maxGames := 100 + for n := int(id); n > 0 && int(id)-n < maxGames; n-- { + v, ok := games.Get(seqid.ID(n).String()) + if !ok { + continue + } + g := v.(*game) + output += strconv.Itoa(n) + " | " + + shortName(g.player1) + " | " + mov1[g.move1] + " | " + + shortName(g.player2) + " | " + mov2[g.move2] + " | " + + win[g.winner()+1] + "\n" + } + return output +} + +func shortName(addr std.Address) string { + user := users.GetUserByAddress(addr) + if user != nil { + return user.Name + } + if len(addr) < 10 { + return string(addr) + } + return string(addr)[:10] + "..." +} diff --git a/portal-loop/extracted/r/demo/games/tictactoe/README.md b/portal-loop/extracted/r/demo/games/tictactoe/README.md new file mode 100644 index 00000000..e0fb1efe --- /dev/null +++ b/portal-loop/extracted/r/demo/games/tictactoe/README.md @@ -0,0 +1,32 @@ +# Player VS CPU tic-tac-toe + +* Human VS CPU +* aims to start experimenting with lowtech UI +* stateless +* no wallet required + +Reusing moul's tic-tac-toe logic. + +``` + (\ Thanks for the wing! + ( \ /(o)\ Thanks for the wing! + ( \/ ()/ /) Raaarch! *Whistle* + ( `;.))'".) + `(/////.-' + =====))=))===() + ///' + // PjP/ejm + ' +``` +## Principle + +* `path` for Render is like `board=-X---O---&move=a2` +* no javascript, +* only gnoweb markdown. + +## How the hell did Cap'n Cluck learn to play? + +I, Cap'n Cluck, had to learn from the most cunning and crafty of creatures – humans! I observed those barnacle-brained bilge-rats engaged in their most awesome game o' strategies, tic-tac-toe. + +Through earhole-peepin', I picked up the patterns and strategies. I honed me beak on pieces o' eight, developin' a near-nautical sense o' spatial relationships! Aarrr, soon enough, I, Cap'n Cluck, became a veritable menace, matchin' wits with any landlubber brave enough to engage in a spot o' tic-tac-toe! + diff --git a/portal-loop/extracted/r/demo/games/tictactoe/pkg_metadata.json b/portal-loop/extracted/r/demo/games/tictactoe/pkg_metadata.json new file mode 100644 index 00000000..9b8b9de3 --- /dev/null +++ b/portal-loop/extracted/r/demo/games/tictactoe/pkg_metadata.json @@ -0,0 +1 @@ +{"creator":"g1fjh9y7ausp27dqsdq0qrcsnmgvwm6829v2au7d","deposit":"100000ugnot"} \ No newline at end of file diff --git a/portal-loop/extracted/r/demo/games/tictactoe/render.gno b/portal-loop/extracted/r/demo/games/tictactoe/render.gno new file mode 100644 index 00000000..9c51e8ba --- /dev/null +++ b/portal-loop/extracted/r/demo/games/tictactoe/render.gno @@ -0,0 +1,283 @@ +package tictactoe + +// Stateless human VS CPU Tic-tac-toe +// Markdown + HTML1.0 + gnolang +// no javascript, no wallet needed. + +import ( + "math/rand" + "std" + "strings" + + "gno.land/p/demo/ternary" + "gno.land/p/demo/tictactoe/tictactoe1p" + "gno.land/p/demo/ufmt" +) + +const ( + cpuAddress = std.Address("gCPU") + humanAddress = std.Address("gHUMAN") + urlParrot = "https://raw.githubusercontent.com/grepsuzette/gfx/master/parrot.png" + statusWon = "Looks like you've won!" + statusLost = "Sorry mate, you lost!" + statusDraw = "It's a draw..." +) + +var prng *rand.Rand + +func Intn(n int) int { + if prng == nil { + // Note: our PRNG is not stateful as calling Render is not going + // to modify this stateless realm. We initialize it here when still nil + // this creates the randomness we need (seeded from blockchain's height) + prng = rand.New(rand.NewPCG(uint64(std.GetHeight()), uint64(9))) + } + return prng.IntN(n) +} + +func Render(path string) string { + game, x, y, debug := parsePath(path) + if x != -1 && y != -1 { + game.Play(humanAddress, x, y) + } + cpuX, cpuY, e := game.PlayCPU() + output := parrotTalk(*game) + output += render(*game, cpuX, cpuY) + if debug { + output += ufmt.Sprintf( + "--- played x=%d y=%d cpuX=%d cpuY=%d height=%d path=%s turn:%d error:%s", + x, y, cpuX, cpuY, std.GetHeight(), path, game.Game.TurnNumber(), e, + ) + } + return output +} + +// Lower-case render is simply called by Render. +// Note the
(below) could be a
. If some day +// realms can access GET and POST variables, then regular +//